@dereekb/dbx-form 10.1.30 → 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 -2
  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 +74 -79
  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 +1072 -1164
  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 -2
  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 { isMonthDaySlashDate, MS_IN_MINUTE } from '@dereekb/util';
2
2
  import { guessCurrentTimezone, dateTimezoneUtcNormal, isSameDateDayRange, dateRange, isDateInDateRange, clampDateRangeToDateRange, isSameDateRange, isSameDateDay, limitDateTimeInstance, dateTimeMinuteWholeDayDecisionFunction } from '@dereekb/date';
3
3
  import { switchMap, shareReplay, map, startWith, distinctUntilChanged, debounceTime, throttleTime, BehaviorSubject, Subject, of, combineLatestWith, filter, combineLatest, scan, first, timer } from 'rxjs';
4
- import { Component, ElementRef, Injectable, ViewChild, forwardRef } from '@angular/core';
4
+ import { Component, ElementRef, Injectable, ViewChild, forwardRef, inject } from '@angular/core';
5
5
  import { FormControl, FormGroup } from '@angular/forms';
6
6
  import { FieldType } from '@ngx-formly/material';
7
7
  import { MAT_DATE_RANGE_SELECTION_STRATEGY, DateRange as DatePickerDateRange, MatCalendar } from '@angular/material/datepicker';
@@ -11,13 +11,11 @@ import { DbxDateTimeFieldMenuPresetsService } from './datetime.field.service';
11
11
  import { DateAdapter } from '@angular/material/core';
12
12
  import { isBefore } from 'date-fns';
13
13
  import * as i0 from "@angular/core";
14
- import * as i1 from "./datetime.field.service";
15
- import * as i2 from "@angular/common";
16
- import * as i3 from "@angular/forms";
17
- import * as i4 from "@angular/material/form-field";
18
- import * as i5 from "@angular/material/datepicker";
19
- import * as i6 from "@ngbracket/ngx-layout/extended";
20
- import * as i7 from "@angular/material/core";
14
+ import * as i1 from "@angular/common";
15
+ import * as i2 from "@angular/forms";
16
+ import * as i3 from "@angular/material/form-field";
17
+ import * as i4 from "@angular/material/datepicker";
18
+ import * as i5 from "@ngbracket/ngx-layout/extended";
21
19
  function dbxFixedDateRangeInputValueFactory(mode, timezoneInstance) {
22
20
  const dateInputTransformer = dbxDateTimeInputValueParseFactory(mode, timezoneInstance);
23
21
  return (y) => {
@@ -46,6 +44,30 @@ function dbxFixedDateRangeOutputValueFactory(mode, timezoneInstance) {
46
44
  }
47
45
  const TIME_OUTPUT_THROTTLE_TIME = 10;
48
46
  export class DbxFixedDateRangeFieldComponent extends FieldType {
47
+ dbxDateTimeFieldMenuPresetsService = inject(DbxDateTimeFieldMenuPresetsService);
48
+ _sub = new SubscriptionObject();
49
+ _inputRangeFormSub = new SubscriptionObject();
50
+ _inputRangeFormValueSub = new SubscriptionObject();
51
+ _dateRangeInputSub = new SubscriptionObject();
52
+ _currentSelectionModeSub = new SubscriptionObject();
53
+ _latestBoundarySub = new SubscriptionObject();
54
+ _disableEndSub = new SubscriptionObject();
55
+ _activeDateSub = new SubscriptionObject();
56
+ _currentDateRangeInput = {};
57
+ _currentSelectionMode = 'single';
58
+ _latestBoundary = null;
59
+ _config = new BehaviorSubject(undefined);
60
+ _selectionMode = new BehaviorSubject(undefined);
61
+ _dateRangeInput = new BehaviorSubject(undefined);
62
+ _timezone = new BehaviorSubject(undefined);
63
+ _presets = new BehaviorSubject(of([]));
64
+ _selectionEvent = new Subject();
65
+ selectedDateRange$ = this._selectionEvent.pipe(map((x) => x.range));
66
+ _formControlObs = new BehaviorSubject(undefined);
67
+ formControl$ = this._formControlObs.pipe(filterMaybe());
68
+ calendar;
69
+ startDateInputElement;
70
+ endDateInputElement;
49
71
  get currentDateRangeInput() {
50
72
  return this._currentDateRangeInput;
51
73
  }
@@ -55,6 +77,18 @@ export class DbxFixedDateRangeFieldComponent extends FieldType {
55
77
  get latestBoundary() {
56
78
  return this._latestBoundary;
57
79
  }
80
+ config$ = this._config.pipe(filterMaybe(), switchMap((x) => x), distinctUntilChanged(), shareReplay(1));
81
+ limitDateTimeInstance$ = this.config$.pipe(map(limitDateTimeInstance), shareReplay(1));
82
+ selectionMode$ = this._selectionMode.pipe(switchMapMaybeDefault('single'), map((x) => x ?? 'single'), distinctUntilChanged(), shareReplay(1));
83
+ dateRangeInput$ = this._dateRangeInput.pipe(switchMapMaybeDefault(), shareReplay(1));
84
+ timezone$ = this._timezone.pipe(switchMapMaybeDefault(), distinctUntilChanged()).pipe(map((defaultTimezone) => {
85
+ return defaultTimezone ?? guessCurrentTimezone();
86
+ }), distinctUntilChanged(), shareReplay(1));
87
+ timezoneInstance$ = this.timezone$.pipe(map((timezone) => (timezone ? dateTimezoneUtcNormal({ timezone }) : undefined)), shareReplay(1));
88
+ valueInSystemTimezone$ = this.formControl$.pipe(map((control) => control.valueChanges.pipe(startWith(control.value), shareReplay(1))), combineLatestWith(this.timezoneInstance$), switchMap(([x, timezoneInstance]) => {
89
+ return x.pipe(map(dbxFixedDateRangeInputValueFactory(this.valueMode, timezoneInstance)));
90
+ }), throttleTime(20, undefined, { leading: false, trailing: true }), // throttle incoming values and timezone changes
91
+ distinctUntilChanged(isSameDateDayRange), shareReplay(1));
58
92
  dateRangeSelectionForMode(mode) {
59
93
  const result = combineLatest([this.dateRangeInput$, this.limitDateTimeInstance$]).pipe(switchMap(([dateRangeInput, limitInstance]) => {
60
94
  const hasDateRangeConfiguration = Boolean(dateRangeInput);
@@ -203,6 +237,36 @@ export class DbxFixedDateRangeFieldComponent extends FieldType {
203
237
  }));
204
238
  return result;
205
239
  }
240
+ fullBoundary$ = this.dateRangeSelectionForMode('single').pipe(shareReplay(1));
241
+ latestBoundary$ = this.selectionMode$.pipe(switchMap((mode) => {
242
+ if (mode === 'arbitrary_quick') {
243
+ // in arbitrary_quick mode, the latest value is the boundary, since we always set the value immediately.
244
+ return this.valueInSystemTimezone$;
245
+ }
246
+ else {
247
+ return this.fullBoundary$;
248
+ }
249
+ }));
250
+ /**
251
+ * Focuses on the date any time the selection event from the picker occured, otherwise use the system value
252
+ */
253
+ calendarFocusDate$ = this._selectionEvent.pipe(startWith(null)).pipe(switchMap((selectionEvent) => {
254
+ if (selectionEvent && selectionEvent.type === 'calendar' && selectionEvent.range?.start) {
255
+ return of(selectionEvent.range.start);
256
+ }
257
+ else {
258
+ return this.fullBoundary$.pipe(first(), map((fullBoundary) => {
259
+ return fullBoundary?.start ?? selectionEvent?.range?.start;
260
+ }));
261
+ }
262
+ }), filterMaybe(), shareReplay(1));
263
+ dateRangeSelection$ = this.selectionMode$.pipe(switchMap((mode) => this.dateRangeSelectionForMode(mode)));
264
+ calendarSelection$ = this.valueInSystemTimezone$.pipe(map((x) => (x ? new DatePickerDateRange(x.start, x.end) : null)), shareReplay(1));
265
+ endDisabled$ = this.selectionMode$.pipe(map((x) => x === 'single'), distinctUntilChanged(), shareReplay(1));
266
+ inputRangeForm = new FormGroup({
267
+ start: new FormControl(null),
268
+ end: new FormControl(null)
269
+ });
206
270
  get fixedDateRangeField() {
207
271
  return this.field.props;
208
272
  }
@@ -227,86 +291,20 @@ export class DbxFixedDateRangeFieldComponent extends FieldType {
227
291
  get showRangeInput() {
228
292
  return this.field.props.showRangeInput ?? true;
229
293
  }
230
- constructor(dbxDateTimeFieldConfigService) {
231
- super();
232
- this.dbxDateTimeFieldConfigService = dbxDateTimeFieldConfigService;
233
- this._sub = new SubscriptionObject();
234
- this._inputRangeFormSub = new SubscriptionObject();
235
- this._inputRangeFormValueSub = new SubscriptionObject();
236
- this._dateRangeInputSub = new SubscriptionObject();
237
- this._currentSelectionModeSub = new SubscriptionObject();
238
- this._latestBoundarySub = new SubscriptionObject();
239
- this._disableEndSub = new SubscriptionObject();
240
- this._activeDateSub = new SubscriptionObject();
241
- this._currentDateRangeInput = {};
242
- this._currentSelectionMode = 'single';
243
- this._latestBoundary = null;
244
- this._config = new BehaviorSubject(undefined);
245
- this._selectionMode = new BehaviorSubject(undefined);
246
- this._dateRangeInput = new BehaviorSubject(undefined);
247
- this._timezone = new BehaviorSubject(undefined);
248
- this._presets = new BehaviorSubject(of([]));
249
- this._selectionEvent = new Subject();
250
- this.selectedDateRange$ = this._selectionEvent.pipe(map((x) => x.range));
251
- this._formControlObs = new BehaviorSubject(undefined);
252
- this.formControl$ = this._formControlObs.pipe(filterMaybe());
253
- this.config$ = this._config.pipe(filterMaybe(), switchMap((x) => x), distinctUntilChanged(), shareReplay(1));
254
- this.limitDateTimeInstance$ = this.config$.pipe(map(limitDateTimeInstance), shareReplay(1));
255
- this.selectionMode$ = this._selectionMode.pipe(switchMapMaybeDefault('single'), map((x) => x ?? 'single'), distinctUntilChanged(), shareReplay(1));
256
- this.dateRangeInput$ = this._dateRangeInput.pipe(switchMapMaybeDefault(), shareReplay(1));
257
- this.timezone$ = this._timezone.pipe(switchMapMaybeDefault(), distinctUntilChanged()).pipe(map((defaultTimezone) => {
258
- return defaultTimezone ?? guessCurrentTimezone();
259
- }), distinctUntilChanged(), shareReplay(1));
260
- this.timezoneInstance$ = this.timezone$.pipe(map((timezone) => (timezone ? dateTimezoneUtcNormal({ timezone }) : undefined)), shareReplay(1));
261
- this.valueInSystemTimezone$ = this.formControl$.pipe(map((control) => control.valueChanges.pipe(startWith(control.value), shareReplay(1))), combineLatestWith(this.timezoneInstance$), switchMap(([x, timezoneInstance]) => {
262
- return x.pipe(map(dbxFixedDateRangeInputValueFactory(this.valueMode, timezoneInstance)));
263
- }), throttleTime(20, undefined, { leading: false, trailing: true }), // throttle incoming values and timezone changes
264
- distinctUntilChanged(isSameDateDayRange), shareReplay(1));
265
- this.fullBoundary$ = this.dateRangeSelectionForMode('single').pipe(shareReplay(1));
266
- this.latestBoundary$ = this.selectionMode$.pipe(switchMap((mode) => {
267
- if (mode === 'arbitrary_quick') {
268
- // in arbitrary_quick mode, the latest value is the boundary, since we always set the value immediately.
269
- return this.valueInSystemTimezone$;
270
- }
271
- else {
272
- return this.fullBoundary$;
273
- }
274
- }));
275
- /**
276
- * Focuses on the date any time the selection event from the picker occured, otherwise use the system value
277
- */
278
- this.calendarFocusDate$ = this._selectionEvent.pipe(startWith(null)).pipe(switchMap((selectionEvent) => {
279
- if (selectionEvent && selectionEvent.type === 'calendar' && selectionEvent.range?.start) {
280
- return of(selectionEvent.range.start);
281
- }
282
- else {
283
- return this.fullBoundary$.pipe(first(), map((fullBoundary) => {
284
- return fullBoundary?.start ?? selectionEvent?.range?.start;
285
- }));
286
- }
287
- }), filterMaybe(), shareReplay(1));
288
- this.dateRangeSelection$ = this.selectionMode$.pipe(switchMap((mode) => this.dateRangeSelectionForMode(mode)));
289
- this.calendarSelection$ = this.valueInSystemTimezone$.pipe(map((x) => (x ? new DatePickerDateRange(x.start, x.end) : null)), shareReplay(1));
290
- this.endDisabled$ = this.selectionMode$.pipe(map((x) => x === 'single'), distinctUntilChanged(), shareReplay(1));
291
- this.inputRangeForm = new FormGroup({
292
- start: new FormControl(null),
293
- end: new FormControl(null)
294
- });
295
- this.minMaxRange$ = this.limitDateTimeInstance$.pipe(combineLatestWith(timer(MS_IN_MINUTE)), // refresh every minute
296
- map(([x]) => x.dateRange()), distinctUntilChanged(isSameDateDayRange), shareReplay(1));
297
- this.min$ = this.minMaxRange$.pipe(map((x) => x?.start ?? null), distinctUntilChanged(), shareReplay(1));
298
- this.max$ = this.minMaxRange$.pipe(map((x) => x?.end ?? null), distinctUntilChanged(), shareReplay(1));
299
- this.pickerFilter$ = this.config$.pipe(distinctUntilChanged(), map((x) => {
300
- if (x) {
301
- const filter = dateTimeMinuteWholeDayDecisionFunction(x, false);
302
- return (x) => (x != null ? filter(x) : true);
303
- }
304
- else {
305
- return () => true;
306
- }
307
- }), shareReplay(1));
308
- this.defaultPickerFilter = () => true;
309
- }
294
+ minMaxRange$ = this.limitDateTimeInstance$.pipe(combineLatestWith(timer(MS_IN_MINUTE)), // refresh every minute
295
+ map(([x]) => x.dateRange()), distinctUntilChanged(isSameDateDayRange), shareReplay(1));
296
+ min$ = this.minMaxRange$.pipe(map((x) => x?.start ?? null), distinctUntilChanged(), shareReplay(1));
297
+ max$ = this.minMaxRange$.pipe(map((x) => x?.end ?? null), distinctUntilChanged(), shareReplay(1));
298
+ pickerFilter$ = this.config$.pipe(distinctUntilChanged(), map((x) => {
299
+ if (x) {
300
+ const filter = dateTimeMinuteWholeDayDecisionFunction(x, false);
301
+ return (x) => (x != null ? filter(x) : true);
302
+ }
303
+ else {
304
+ return () => true;
305
+ }
306
+ }), shareReplay(1));
307
+ defaultPickerFilter = () => true;
310
308
  ngOnInit() {
311
309
  this._formControlObs.next(this.formControl);
312
310
  const dateRangeSelection = this.dateRangeSelection$.pipe(shareReplay(1));
@@ -417,7 +415,7 @@ export class DbxFixedDateRangeFieldComponent extends FieldType {
417
415
  this._presets.next(asObservableFromGetter(this.presets));
418
416
  }
419
417
  else {
420
- this._presets.next(this.dbxDateTimeFieldConfigService.configurations$);
418
+ this._presets.next(this.dbxDateTimeFieldMenuPresetsService.configurations$);
421
419
  }
422
420
  this._activeDateSub.subscription = this.calendarFocusDate$.subscribe((x) => {
423
421
  this.calendar.activeDate = x;
@@ -450,13 +448,13 @@ export class DbxFixedDateRangeFieldComponent extends FieldType {
450
448
  _createDateRange(date) {
451
449
  return date ? dateRange({ ...this._currentDateRangeInput, date }) : undefined;
452
450
  }
453
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DbxFixedDateRangeFieldComponent, deps: [{ token: i1.DbxDateTimeFieldMenuPresetsService }], target: i0.ɵɵFactoryTarget.Component }); }
454
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: DbxFixedDateRangeFieldComponent, selector: "ng-component", providers: [
451
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DbxFixedDateRangeFieldComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
452
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: DbxFixedDateRangeFieldComponent, selector: "ng-component", providers: [
455
453
  {
456
454
  provide: MAT_DATE_RANGE_SELECTION_STRATEGY,
457
455
  useClass: forwardRef(() => DbxFixedDateRangeFieldSelectionStrategy)
458
456
  }
459
- ], viewQueries: [{ propertyName: "calendar", first: true, predicate: MatCalendar, descendants: true }, { propertyName: "startDateInputElement", first: true, predicate: ["startDateInput"], descendants: true, read: ElementRef }, { propertyName: "endDateInputElement", first: true, predicate: ["endDateInput"], descendants: true, read: ElementRef }], usesInheritance: true, ngImport: i0, template: "<div class=\"dbx-fixeddaterange-field\">\n <mat-calendar #calendarView [selected]=\"calendarSelection$ | async\" [dateFilter]=\"(pickerFilter$ | async) || defaultPickerFilter\" [minDate]=\"min$ | async\" [maxDate]=\"max$ | async\" (selectedChange)=\"selectedChange($event)\"></mat-calendar>\n <mat-form-field class=\"dbx-fixeddaterange-field-input\" appearance=\"fill\">\n <mat-date-range-input *ngIf=\"showRangeInput\" [formGroup]=\"inputRangeForm\">\n <input #startDateInput matStartDate formControlName=\"start\" placeholder=\"Start date\" />\n <input #endDateInput [ngClass]=\"(endDisabled$ | async) ? 'dbx-fixeddaterange-field-input-end' : ''\" [attr.tabindex]=\"(endDisabled$ | async) ? -1 : 0\" matEndDate formControlName=\"end\" placeholder=\"End date\" />\n </mat-date-range-input>\n </mat-form-field>\n <mat-error *ngIf=\"formControl.hasError('required')\">Date range is required</mat-error>\n</div>\n", dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { 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.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "component", type: i5.MatCalendar, selector: "mat-calendar", inputs: ["headerComponent", "startAt", "startView", "selected", "minDate", "maxDate", "dateFilter", "dateClass", "comparisonStart", "comparisonEnd", "startDateAccessibleName", "endDateAccessibleName"], outputs: ["selectedChange", "yearSelected", "monthSelected", "viewChanged", "_userSelection", "_userDragDrop"], exportAs: ["matCalendar"] }, { kind: "component", type: i5.MatDateRangeInput, selector: "mat-date-range-input", inputs: ["rangePicker", "required", "dateFilter", "min", "max", "disabled", "separator", "comparisonStart", "comparisonEnd"], exportAs: ["matDateRangeInput"] }, { kind: "directive", type: i5.MatStartDate, selector: "input[matStartDate]", inputs: ["errorStateMatcher"], outputs: ["dateChange", "dateInput"] }, { kind: "directive", type: i5.MatEndDate, selector: "input[matEndDate]", inputs: ["errorStateMatcher"], outputs: ["dateChange", "dateInput"] }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i6.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" }] }); }
457
+ ], viewQueries: [{ propertyName: "calendar", first: true, predicate: MatCalendar, descendants: true }, { propertyName: "startDateInputElement", first: true, predicate: ["startDateInput"], descendants: true, read: ElementRef }, { propertyName: "endDateInputElement", first: true, predicate: ["endDateInput"], descendants: true, read: ElementRef }], usesInheritance: true, ngImport: i0, template: "<div class=\"dbx-fixeddaterange-field\">\n <mat-calendar #calendarView [selected]=\"calendarSelection$ | async\" [dateFilter]=\"(pickerFilter$ | async) || defaultPickerFilter\" [minDate]=\"min$ | async\" [maxDate]=\"max$ | async\" (selectedChange)=\"selectedChange($event)\"></mat-calendar>\n <mat-form-field class=\"dbx-fixeddaterange-field-input\" appearance=\"fill\">\n <mat-date-range-input *ngIf=\"showRangeInput\" [formGroup]=\"inputRangeForm\">\n <input #startDateInput matStartDate formControlName=\"start\" placeholder=\"Start date\" />\n <input #endDateInput [ngClass]=\"(endDisabled$ | async) ? 'dbx-fixeddaterange-field-input-end' : ''\" [attr.tabindex]=\"(endDisabled$ | async) ? -1 : 0\" matEndDate formControlName=\"end\" placeholder=\"End date\" />\n </mat-date-range-input>\n </mat-form-field>\n <mat-error *ngIf=\"formControl.hasError('required')\">Date range is required</mat-error>\n</div>\n", dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { 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.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "component", type: i3.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i3.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "component", type: i4.MatCalendar, selector: "mat-calendar", inputs: ["headerComponent", "startAt", "startView", "selected", "minDate", "maxDate", "dateFilter", "dateClass", "comparisonStart", "comparisonEnd", "startDateAccessibleName", "endDateAccessibleName"], outputs: ["selectedChange", "yearSelected", "monthSelected", "viewChanged", "_userSelection", "_userDragDrop"], exportAs: ["matCalendar"] }, { kind: "component", type: i4.MatDateRangeInput, selector: "mat-date-range-input", inputs: ["rangePicker", "required", "dateFilter", "min", "max", "disabled", "separator", "comparisonStart", "comparisonEnd"], exportAs: ["matDateRangeInput"] }, { kind: "directive", type: i4.MatStartDate, selector: "input[matStartDate]", inputs: ["errorStateMatcher"], outputs: ["dateChange", "dateInput"] }, { kind: "directive", type: i4.MatEndDate, selector: "input[matEndDate]", inputs: ["errorStateMatcher"], outputs: ["dateChange", "dateInput"] }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i5.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" }] });
460
458
  }
461
459
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DbxFixedDateRangeFieldComponent, decorators: [{
462
460
  type: Component,
@@ -466,7 +464,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
466
464
  useClass: forwardRef(() => DbxFixedDateRangeFieldSelectionStrategy)
467
465
  }
468
466
  ], template: "<div class=\"dbx-fixeddaterange-field\">\n <mat-calendar #calendarView [selected]=\"calendarSelection$ | async\" [dateFilter]=\"(pickerFilter$ | async) || defaultPickerFilter\" [minDate]=\"min$ | async\" [maxDate]=\"max$ | async\" (selectedChange)=\"selectedChange($event)\"></mat-calendar>\n <mat-form-field class=\"dbx-fixeddaterange-field-input\" appearance=\"fill\">\n <mat-date-range-input *ngIf=\"showRangeInput\" [formGroup]=\"inputRangeForm\">\n <input #startDateInput matStartDate formControlName=\"start\" placeholder=\"Start date\" />\n <input #endDateInput [ngClass]=\"(endDisabled$ | async) ? 'dbx-fixeddaterange-field-input-end' : ''\" [attr.tabindex]=\"(endDisabled$ | async) ? -1 : 0\" matEndDate formControlName=\"end\" placeholder=\"End date\" />\n </mat-date-range-input>\n </mat-form-field>\n <mat-error *ngIf=\"formControl.hasError('required')\">Date range is required</mat-error>\n</div>\n" }]
469
- }], ctorParameters: function () { return [{ type: i1.DbxDateTimeFieldMenuPresetsService }]; }, propDecorators: { calendar: [{
467
+ }], propDecorators: { calendar: [{
470
468
  type: ViewChild,
471
469
  args: [MatCalendar]
472
470
  }], startDateInputElement: [{
@@ -477,10 +475,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
477
475
  args: ['endDateInput', { read: ElementRef }]
478
476
  }] } });
479
477
  export class DbxFixedDateRangeFieldSelectionStrategy {
480
- constructor(_dateAdapter, dbxFixedDateRangeFieldComponent) {
481
- this._dateAdapter = _dateAdapter;
482
- this.dbxFixedDateRangeFieldComponent = dbxFixedDateRangeFieldComponent;
483
- }
478
+ _dateAdapter = inject((DateAdapter));
479
+ dbxFixedDateRangeFieldComponent = inject(DbxFixedDateRangeFieldComponent);
484
480
  selectionFinished(date, currentRange, event) {
485
481
  // unused
486
482
  return currentRange;
@@ -525,10 +521,10 @@ export class DbxFixedDateRangeFieldSelectionStrategy {
525
521
  const year = date.getFullYear();
526
522
  return this._dateAdapter.createDate(year, monthIndex, day);
527
523
  }
528
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DbxFixedDateRangeFieldSelectionStrategy, deps: [{ token: i7.DateAdapter }, { token: DbxFixedDateRangeFieldComponent }], target: i0.ɵɵFactoryTarget.Injectable }); }
529
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DbxFixedDateRangeFieldSelectionStrategy }); }
524
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DbxFixedDateRangeFieldSelectionStrategy, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
525
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DbxFixedDateRangeFieldSelectionStrategy });
530
526
  }
531
527
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DbxFixedDateRangeFieldSelectionStrategy, decorators: [{
532
528
  type: Injectable
533
- }], ctorParameters: function () { return [{ type: i7.DateAdapter }, { type: DbxFixedDateRangeFieldComponent }]; } });
534
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZml4ZWRkYXRlcmFuZ2UuZmllbGQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvZGJ4LWZvcm0vc3JjL2xpYi9mb3JtbHkvZmllbGQvdmFsdWUvZGF0ZS9maXhlZGRhdGVyYW5nZS5maWVsZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9kYngtZm9ybS9zcmMvbGliL2Zvcm1seS9maWVsZC92YWx1ZS9kYXRlL2ZpeGVkZGF0ZXJhbmdlLmZpZWxkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBK0gsbUJBQW1CLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQy9MLE9BQU8sRUFBRSxvQkFBb0IsRUFBaUMscUJBQXFCLEVBQTZCLGtCQUFrQixFQUF3RCxTQUFTLEVBQUUsaUJBQWlCLEVBQUUseUJBQXlCLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBRSxxQkFBcUIsRUFBRSxzQ0FBc0MsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN4VyxPQUFPLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLG9CQUFvQixFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsZUFBZSxFQUFjLE9BQU8sRUFBRSxFQUFFLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN4TixPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQXFCLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUcsT0FBTyxFQUFtQixXQUFXLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDekUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHNC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QUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUM3RCxDQUFDOytHQXZEVSx1Q0FBdUM7bUhBQXZDLHVDQUF1Qzs7NEZBQXZDLHVDQUF1QztrQkFEbkQsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHR5cGUgTWF5YmUsIHR5cGUgRGVjaXNpb25GdW5jdGlvbiwgdHlwZSBNaWxsaXNlY29uZHMsIHR5cGUgVGltZXpvbmVTdHJpbmcsIHR5cGUgRGF0ZU1vbnRoLCB0eXBlIERheU9mTW9udGgsIHR5cGUgWWVhck51bWJlciwgaXNNb250aERheVNsYXNoRGF0ZSwgTVNfSU5fTUlOVVRFIH0gZnJvbSAnQGRlcmVla2IvdXRpbCc7XG5pbXBvcnQgeyBndWVzc0N1cnJlbnRUaW1lem9uZSwgRGF0ZVRpbWV6b25lVXRjTm9ybWFsSW5zdGFuY2UsIGRhdGVUaW1lem9uZVV0Y05vcm1hbCwgRGF0ZVJhbmdlSW5wdXQsIERhdGVSYW5nZSwgaXNTYW1lRGF0ZURheVJhbmdlLCBEYXRlUmFuZ2VXaXRoRGF0ZU9yU3RyaW5nVmFsdWUsIERhdGVUaW1lTWludXRlQ29uZmlnLCBkYXRlUmFuZ2UsIGlzRGF0ZUluRGF0ZVJhbmdlLCBjbGFtcERhdGVSYW5nZVRvRGF0ZVJhbmdlLCBpc1NhbWVEYXRlUmFuZ2UsIGlzU2FtZURhdGVEYXksIGxpbWl0RGF0ZVRpbWVJbnN0YW5jZSwgZGF0ZVRpbWVNaW51dGVXaG9sZURheURlY2lzaW9uRnVuY3Rpb24gfSBmcm9tICdAZGVyZWVrYi9kYXRlJztcbmltcG9ydCB7IHN3aXRjaE1hcCwgc2hhcmVSZXBsYXksIG1hcCwgc3RhcnRXaXRoLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgZGVib3VuY2VUaW1lLCB0aHJvdHRsZVRpbWUsIEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgU3ViamVjdCwgb2YsIGNvbWJpbmVMYXRlc3RXaXRoLCBmaWx0ZXIsIGNvbWJpbmVMYXRlc3QsIHNjYW4sIGZpcnN0LCB0aW1lciB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBJbmplY3RhYmxlLCBPbkRlc3Ryb3ksIE9uSW5pdCwgVmlld0NoaWxkLCBmb3J3YXJkUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBYnN0cmFjdENvbnRyb2wsIEZvcm1Db250cm9sLCBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBGaWVsZFR5cGUgfSBmcm9tICdAbmd4LWZvcm1seS9tYXRlcmlhbCc7XG5pbXBvcnQgeyBGaWVsZFR5cGVDb25maWcsIEZvcm1seUZpZWxkUHJvcHMgfSBmcm9tICdAbmd4LWZvcm1seS9jb3JlJztcbmltcG9ydCB7IE1hdERhdGVSYW5nZVNlbGVjdGlvblN0cmF0ZWd5LCBNQVRfREFURV9SQU5HRV9TRUxFQ1RJT05fU1RSQVRFR1ksIERhdGVSYW5nZSBhcyBEYXRlUGlja2VyRGF0ZVJhbmdlLCBNYXRDYWxlbmRhciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RhdGVwaWNrZXInO1xuaW1wb3J0IHsgYXNPYnNlcnZhYmxlRnJvbUdldHRlciwgZmlsdGVyTWF5YmUsIE9ic2VydmFibGVPclZhbHVlR2V0dGVyLCBza2lwRmlyc3RNYXliZSwgU3Vic2NyaXB0aW9uT2JqZWN0LCBzd2l0Y2hNYXBNYXliZURlZmF1bHQgfSBmcm9tICdAZGVyZWVrYi9yeGpzJztcbmltcG9ydCB7IERieERhdGVUaW1lVmFsdWVNb2RlLCBkYnhEYXRlUmFuZ2VJc1NhbWVEYXRlUmFuZ2VGaWVsZFZhbHVlLCBkYnhEYXRlVGltZUlucHV0VmFsdWVQYXJzZUZhY3RvcnksIGRieERhdGVUaW1lT3V0cHV0VmFsdWVGYWN0b3J5IH0gZnJvbSAnLi9kYXRlLnZhbHVlJztcbmltcG9ydCB7IERhdGVUaW1lUHJlc2V0Q29uZmlndXJhdGlvbiB9IGZyb20gJy4vZGF0ZXRpbWUnO1xuaW1wb3J0IHsgRGJ4RGF0ZVRpbWVGaWVsZE1lbnVQcmVzZXRzU2VydmljZSB9IGZyb20gJy4vZGF0ZXRpbWUuZmllbGQuc2VydmljZSc7XG5pbXBvcnQgeyBEYXRlQWRhcHRlciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NvcmUnO1xuaW1wb3J0IHsgaXNCZWZvcmUgfSBmcm9tICdkYXRlLWZucyc7XG5cbmV4cG9ydCB0eXBlIERieEZpeGVkRGF0ZVJhbmdlRGF0ZVJhbmdlSW5wdXQgPSBPbWl0PERhdGVSYW5nZUlucHV0LCAnZGF0ZSc+O1xuXG5leHBvcnQgdHlwZSBEYnhGaXhlZERhdGVSYW5nZVBpY2tlckNvbmZpZ3VyYXRpb24gPSBPbWl0PERhdGVUaW1lTWludXRlQ29uZmlnLCAnZGF0ZSc+O1xuXG5leHBvcnQgdHlwZSBEYnhGaXhlZERhdGVSYW5nZVNlbGVjdGlvbk1vZGUgPSAnc2luZ2xlJyB8ICdub3JtYWwnIHwgJ2FyYml0cmFyeScgfCAnYXJiaXRyYXJ5X3F1aWNrJztcbmV4cG9ydCB0eXBlIERieEZpeGVkRGF0ZVJhbmdlUGlja2luZyA9ICdzdGFydCcgfCAnZW5kJztcblxuZXhwb3J0IGludGVyZmFjZSBEYnhGaXhlZERhdGVSYW5nZUZpZWxkUHJvcHMgZXh0ZW5kcyBGb3JtbHlGaWVsZFByb3BzIHtcbiAgLyoqXG4gICAqIERhdGUgcmFuZ2UgaW5wdXQgdG8gYnVpbGQgdGhlIGRhdGUgcmFuZ2UuXG4gICAqL1xuICBkYXRlUmFuZ2VJbnB1dDogT2JzZXJ2YWJsZU9yVmFsdWVHZXR0ZXI8RGJ4Rml4ZWREYXRlUmFuZ2VEYXRlUmFuZ2VJbnB1dD47XG5cbiAgLyoqXG4gICAqIFNlbGVjdGlvbiBtb2RlIHRvIHVzZSB3aGVuIHBpY2tpbmcgZGF0ZXMgb24gdGhlIGNhbGVuZGFyLlxuICAgKi9cbiAgc2VsZWN0aW9uTW9kZT86IE1heWJlPE9ic2VydmFibGVPclZhbHVlR2V0dGVyPERieEZpeGVkRGF0ZVJhbmdlU2VsZWN0aW9uTW9kZT4+O1xuXG4gIC8qKlxuICAgKiBWYWx1ZSBtb2RlIGZvciB0aGUgZGF0ZXMgaW4gdGhlIG91dHB1dCBEYXRlUmFuZ2UuXG4gICAqXG4gICAqIERlZmF1bHRzIHRvIERBVEVcbiAgICovXG4gIHZhbHVlTW9kZT86IERieERhdGVUaW1lVmFsdWVNb2RlO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIG9yIG5vdCB0byBwYXNzIHRoZSBkYXRlIHZhbHVlIGFzIGEgVVRDIGRhdGUsIG9yIGEgZGF0ZSBpbiB0aGUgY3VycmVudCB0aW1lem9uZS5cbiAgICovXG4gIGZ1bGxEYXlJblVUQz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEN1c3RvbSBwaWNrZXIgY29uZmlndXJhdGlvblxuICAgKi9cbiAgcGlja2VyQ29uZmlnPzogT2JzZXJ2YWJsZU9yVmFsdWVHZXR0ZXI8RGJ4Rml4ZWREYXRlUmFuZ2VQaWNrZXJDb25maWd1cmF0aW9uPjtcblxuICAvKipcbiAgICogKE9wdGlvbmFsKSBUaGUgaW5wdXQgdGltZXpvbmUgdG8gZGVmYXVsdCB0by5cbiAgICpcbiAgICogSWdub3JlZCBpZiBmdWxsRGF5SW5VVEMgaXMgdHJ1ZS5cbiAgICovXG4gIHRpbWV6b25lPzogTWF5YmU8T2JzZXJ2YWJsZU9yVmFsdWVHZXR0ZXI8TWF5YmU8VGltZXpvbmVTdHJpbmc+Pj47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgb3Igbm90IHRvIGRpc3BsYXkgdGhlIHRpbWV6b25lLiBUcnVlIGJ5IGRlZmF1bHQuXG4gICAqL1xuICBzaG93VGltZXpvbmU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBDdXN0b20gcHJlc2V0cyB0byBzaG93IGluIHRoZSBkcm9wZG93bi5cbiAgICovXG4gIHByZXNldHM/OiBPYnNlcnZhYmxlT3JWYWx1ZUdldHRlcjxEYXRlVGltZVByZXNldENvbmZpZ3VyYXRpb25bXT47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgb3Igbm90IHRvIHNob3cgdGhlIHJhbmdlIGlucHV0LiBEZWZhdWx0cyB0byB0cnVlLlxuICAgKi9cbiAgc2hvd1JhbmdlSW5wdXQ/OiBib29sZWFuO1xufVxuXG5mdW5jdGlvbiBkYnhGaXhlZERhdGVSYW5nZUlucHV0VmFsdWVGYWN0b3J5KG1vZGU6IERieERhdGVUaW1lVmFsdWVNb2RlLCB0aW1lem9uZUluc3RhbmNlOiBNYXliZTxEYXRlVGltZXpvbmVVdGNOb3JtYWxJbnN0YW5jZT4pOiAoaW5wdXQ6IE1heWJlPERhdGVSYW5nZVdpdGhEYXRlT3JTdHJpbmdWYWx1ZT4pID0+IE1heWJlPERhdGVSYW5nZT4ge1xuICBjb25zdCBkYXRlSW5wdXRUcmFuc2Zvcm1lciA9IGRieERhdGVUaW1lSW5wdXRWYWx1ZVBhcnNlRmFjdG9yeShtb2RlLCB0aW1lem9uZUluc3RhbmNlKTtcblxuICByZXR1cm4gKHkpID0+IHtcbiAgICBsZXQgcmVzdWx0OiBNYXliZTxEYXRlUmFuZ2U+O1xuXG4gICAgaWYgKHkpIHtcbiAgICAgIHJlc3VsdCA9IHtcbiAgICAgICAgc3RhcnQ6IGRhdGVJbnB1dFRyYW5zZm9ybWVyKHkuc3RhcnQpIGFzIERhdGUsXG4gICAgICAgIGVuZDogZGF0ZUlucHV0VHJhbnNmb3JtZXIoeS5lbmQpIGFzIERhdGVcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbn1cblxuZnVuY3Rpb24gZGJ4Rml4ZWREYXRlUmFuZ2VPdXRwdXRWYWx1ZUZhY3RvcnkobW9kZTogRGJ4RGF0ZVRpbWVWYWx1ZU1vZGUsIHRpbWV6b25lSW5zdGFuY2U6IE1heWJlPERhdGVUaW1lem9uZVV0Y05vcm1hbEluc3RhbmNlPik6IChkYXRlOiBNYXliZTxEYXRlUmFuZ2U+KSA9PiBNYXliZTxEYXRlUmFuZ2VXaXRoRGF0ZU9yU3RyaW5nVmFsdWU+IHtcbiAgY29uc3QgZGF0ZU91dHB1dFRyYW5zZm9ybWVyID0gZGJ4RGF0ZVRpbWVPdXRwdXRWYWx1ZUZhY3RvcnkobW9kZSwgdGltZXpvbmVJbnN0YW5jZSk7XG5cbiAgcmV0dXJuICh5KSA9PiB7XG4gICAgbGV0IHJlc3VsdDogTWF5YmU8RGF0ZVJhbmdlPjtcblxuICAgIGlmICh5KSB7XG4gICAgICByZXN1bHQgPSB7XG4gICAgICAgIHN0YXJ0OiBkYXRlT3V0cHV0VHJhbnNmb3JtZXIoeS5zdGFydCkgYXMgRGF0ZSxcbiAgICAgICAgZW5kOiBkYXRlT3V0cHV0VHJhbnNmb3JtZXIoeS5lbmQpIGFzIERhdGVcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbn1cblxuY29uc3QgVElNRV9PVVRQVVRfVEhST1RUTEVfVElNRTogTWlsbGlzZWNvbmRzID0gMTA7XG5cbmV4cG9ydCB0eXBlIEZpeGVkRGF0ZVJhbmdlU2NhblR5cGUgPSAnc3RhcnQnIHwgJ2VuZCcgfCAnc3RhcnRSZXBlYXQnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEZpeGVkRGF0ZVJhbmdlU2NhbiB7XG4gIC8qKlxuICAgKiBQaWNrZWQgdGhlIHN0YXJ0IG9yIGVuZCBvZiB0aGUgcmFuZ2Ugb24gdGhlIGxhc3QgcGljay5cbiAgICovXG4gIGxhc3RQaWNrVHlwZT86IE1heWJlPEZpeGVkRGF0ZVJhbmdlU2NhblR5cGU+O1xuICAvKipcbiAgICogVGhlIGxhdGVzdCBkYXRlIHBhc3NlZCwgaWYgYXBwbGljYWJsZS5cbiAgICovXG4gIGxhc3REYXRlUmFuZ2U/OiBNYXliZTxQYXJ0aWFsPERhdGVSYW5nZT4+O1xuICAvKipcbiAgICogVGhlIGdlbmVyYXRlZCBib3VuZGFyeSByYW5nZS5cbiAgICovXG4gIGJvdW5kYXJ5PzogRGF0ZVJhbmdlO1xuICAvKipcbiAgICogTmV3IERhdGUgUmFuZ2VcbiAgICovXG4gIHJhbmdlPzogRGF0ZVJhbmdlO1xufVxuXG50eXBlIFNlbGVjdGVkRGF0ZUV2ZW50VHlwZSA9ICdjYWxlbmRhcicgfCAnaW5wdXQnO1xuXG5pbnRlcmZhY2UgU2VsZWN0ZWREYXRlRXZlbnQge1xuICB0eXBlOiBTZWxlY3RlZERhdGVFdmVudFR5cGU7XG4gIHJhbmdlPzogTWF5YmU8UGFydGlhbDxEYXRlUmFuZ2U+Pjtcbn1cblxuQENvbXBvbmVudCh7XG4gIHRlbXBsYXRlVXJsOiAnZml4ZWRkYXRlcmFuZ2UuZmllbGQuY29tcG9uZW50Lmh0bWwnLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBNQVRfREFURV9SQU5HRV9TRUxFQ1RJT05fU1RSQVRFR1ksXG4gICAgICB1c2VDbGFzczogZm9yd2FyZFJlZigoKSA9PiBEYnhGaXhlZERhdGVSYW5nZUZpZWxkU2VsZWN0aW9uU3RyYXRlZ3kpXG4gICAgfVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIERieEZpeGVkRGF0ZVJhbmdlRmllbGRDb21wb25lbnQgZXh0ZW5kcyBGaWVsZFR5cGU8RmllbGRUeXBlQ29uZmlnPERieEZpeGVkRGF0ZVJhbmdlRmllbGRQcm9wcz4+IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBwcml2YXRlIF9zdWIgPSBuZXcgU3Vic2NyaXB0aW9uT2JqZWN0KCk7XG5cbiAgcHJpdmF0ZSBfaW5wdXRSYW5nZUZvcm1TdWIgPSBuZXcgU3Vic2NyaXB0aW9uT2JqZWN0KCk7XG4gIHByaXZhdGUgX2lucHV0UmFuZ2VGb3JtVmFsdWVTdWIgPSBuZXcgU3Vic2NyaXB0aW9uT2JqZWN0KCk7XG5cbiAgcHJpdmF0ZSBfZGF0ZVJhbmdlSW5wdXRTdWIgPSBuZXcgU3Vic2NyaXB0aW9uT2JqZWN0KCk7XG4gIHByaXZhdGUgX2N1cnJlbnRTZWxlY3Rpb25Nb2RlU3ViID0gbmV3IFN1YnNjcmlwdGlvbk9iamVjdCgpO1xuICBwcml2YXRlIF9sYXRlc3RCb3VuZGFyeVN1YiA9IG5ldyBTdWJzY3JpcHRpb25PYmplY3QoKTtcbiAgcHJpdmF0ZSBfZGlzYWJsZUVuZFN1YiA9IG5ldyBTdWJzY3JpcHRpb25PYmplY3QoKTtcbiAgcHJpdmF0ZSBfYWN0aXZlRGF0ZVN1YiA9IG5ldyBTdWJzY3JpcHRpb25PYmplY3QoKTtcblxuICBwcml2YXRlIF9jdXJyZW50RGF0ZVJhbmdlSW5wdXQ6IE1heWJlPERieEZpeGVkRGF0ZVJhbmdlRGF0ZVJhbmdlSW5wdXQ+ID0ge307XG4gIHByaXZhdGUgX2N1cnJlbnRTZWxlY3Rpb25Nb2RlOiBEYnhGaXhlZERhdGVSYW5nZVNlbGVjdGlvbk1vZGUgPSAnc2luZ2xlJztcbiAgcHJpdmF0ZSBfbGF0ZXN0Qm91bmRhcnk6IE1heWJlPERhdGVSYW5nZT4gPSBudWxsO1xuXG4gIHByaXZhdGUgX2NvbmZpZyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8TWF5YmU8T2JzZXJ2YWJsZTxEYnhGaXhlZERhdGVSYW5nZVBpY2tlckNvbmZpZ3VyYXRpb24+Pj4odW5kZWZpbmVkKTtcbiAgcHJpdmF0ZSBfc2VsZWN0aW9uTW9kZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8TWF5YmU8T2JzZXJ2YWJsZTxEYnhGaXhlZERhdGVSYW5nZVNlbGVjdGlvbk1vZGU+Pj4odW5kZWZpbmVkKTtcbiAgcHJpdmF0ZSBfZGF0ZVJhbmdlSW5wdXQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PE1heWJlPE9ic2VydmFibGU8RGJ4Rml4ZWREYXRlUmFuZ2VEYXRlUmFuZ2VJbnB1dD4+Pih1bmRlZmluZWQpO1xuXG4gIHByaXZhdGUgX3RpbWV6b25lID0gbmV3IEJlaGF2aW9yU3ViamVjdDxNYXliZTxPYnNlcnZhYmxlPE1heWJlPFRpbWV6b25lU3RyaW5nPj4+Pih1bmRlZmluZWQpO1xuICBwcml2YXRlIF9wcmVzZXRzID0gbmV3IEJlaGF2aW9yU3ViamVjdDxPYnNlcnZhYmxlPERhdGVUaW1lUHJlc2V0Q29uZmlndXJhdGlvbltdPj4ob2YoW10pKTtcblxuICBwcml2YXRlIF9zZWxlY3Rpb25FdmVudCA9IG5ldyBTdWJqZWN0PFNlbGVjdGVkRGF0ZUV2ZW50PigpO1xuICByZWFkb25seSBzZWxlY3RlZERhdGVSYW5nZSQ6IE9ic2VydmFibGU8TWF5YmU8UGFydGlhbDxEYXRlUmFuZ2U+Pj4gPSB0aGlzLl9zZWxlY3Rpb25FdmVudC5waXBlKG1hcCgoeCkgPT4geC5yYW5nZSkpO1xuXG4gIHByaXZhdGUgX2Zvcm1Db250cm9sT2JzID0gbmV3IEJlaGF2aW9yU3ViamVjdDxNYXliZTxBYnN0cmFjdENvbnRyb2w8TWF5YmU8RGF0ZVJhbmdlPj4+Pih1bmRlZmluZWQpO1xuICByZWFkb25seSBmb3JtQ29udHJvbCQgPSB0aGlzLl9mb3JtQ29udHJvbE9icy5waXBlKGZpbHRlck1heWJlKCkpO1xuXG4gIEBWaWV3Q2hpbGQoTWF0Q2FsZW5kYXIpXG4gIGNhbGVuZGFyITogTWF0Q2FsZW5kYXI8RGF0ZT47XG5cbiAgQFZpZXdDaGlsZCgnc3RhcnREYXRlSW5wdXQnLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSlcbiAgc3RhcnREYXRlSW5wdXRFbGVtZW50ITogRWxlbWVudFJlZjtcblxuICBAVmlld0NoaWxkKCdlbmREYXRlSW5wdXQnLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSlcbiAgZW5kRGF0ZUlucHV0RWxlbWVudCE6IEVsZW1lbnRSZWY7XG5cbiAgZ2V0IGN1cnJlbnREYXRlUmFuZ2VJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fY3VycmVudERhdGVSYW5nZUlucHV0O1xuICB9XG5cbiAgZ2V0IGN1cnJlbnRTZWxlY3Rpb25Nb2RlKCkge1xuICAgIHJldHVybiB0aGlzLl9jdXJyZW50U2VsZWN0aW9uTW9kZTtcbiAgfVxuXG4gIGdldCBsYXRlc3RCb3VuZGFyeSgpIHtcbiAgICByZXR1cm4gdGhpcy5fbGF0ZXN0Qm91bmRhcnk7XG4gIH1cblxuICByZWFkb25seSBjb25maWckOiBPYnNlcnZhYmxlPERieEZpeGVkRGF0ZVJhbmdlUGlja2VyQ29uZmlndXJhdGlvbj4gPSB0aGlzLl9jb25maWcucGlwZShcbiAgICBmaWx0ZXJNYXliZSgpLFxuICAgIHN3aXRjaE1hcCgoeCkgPT4geCksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IGxpbWl0RGF0ZVRpbWVJbnN0YW5jZSQgPSB0aGlzLmNvbmZpZyQucGlwZShtYXAobGltaXREYXRlVGltZUluc3RhbmNlKSwgc2hhcmVSZXBsYXkoMSkpO1xuXG4gIHJlYWRvbmx5IHNlbGVjdGlvbk1vZGUkOiBPYnNlcnZhYmxlPERieEZpeGVkRGF0ZVJhbmdlU2VsZWN0aW9uTW9kZT4gPSB0aGlzLl9zZWxlY3Rpb25Nb2RlLnBpcGUoXG4gICAgc3dpdGNoTWFwTWF5YmVEZWZhdWx0PERieEZpeGVkRGF0ZVJhbmdlU2VsZWN0aW9uTW9kZT4oJ3NpbmdsZScpLFxuICAgIG1hcCgoeCkgPT4geCA/PyAnc2luZ2xlJyksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IGRhdGVSYW5nZUlucHV0JCA9IHRoaXMuX2RhdGVSYW5nZUlucHV0LnBpcGUoc3dpdGNoTWFwTWF5YmVEZWZhdWx0KCksIHNoYXJlUmVwbGF5KDEpKTtcblxuICByZWFkb25seSB0aW1lem9uZSQ6IE9ic2VydmFibGU8TWF5YmU8VGltZXpvbmVTdHJpbmc+PiA9IHRoaXMuX3RpbWV6b25lLnBpcGUoc3dpdGNoTWFwTWF5YmVEZWZhdWx0KCksIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpLnBpcGUoXG4gICAgbWFwKChkZWZhdWx0VGltZXpvbmUpID0+IHtcbiAgICAgIHJldHVybiBkZWZhdWx0VGltZXpvbmUgPz8gZ3Vlc3NDdXJyZW50VGltZXpvbmUoKTtcbiAgICB9KSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgdGltZXpvbmVJbnN0YW5jZSQ6IE9ic2VydmFibGU8TWF5YmU8RGF0ZVRpbWV6b25lVXRjTm9ybWFsSW5zdGFuY2U+PiA9IHRoaXMudGltZXpvbmUkLnBpcGUoXG4gICAgbWFwKCh0aW1lem9uZSkgPT4gKHRpbWV6b25lID8gZGF0ZVRpbWV6b25lVXRjTm9ybWFsKHsgdGltZXpvbmUgfSkgOiB1bmRlZmluZWQpKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IHZhbHVlSW5TeXN0ZW1UaW1lem9uZSQ6IE9ic2VydmFibGU8TWF5YmU8RGF0ZVJhbmdlPj4gPSB0aGlzLmZvcm1Db250cm9sJC5waXBlKFxuICAgIG1hcCgoY29udHJvbCkgPT4gY29udHJvbC52YWx1ZUNoYW5nZXMucGlwZShzdGFydFdpdGg8TWF5YmU8RGF0ZVJhbmdlV2l0aERhdGVPclN0cmluZ1ZhbHVlPj4oY29udHJvbC52YWx1ZSksIHNoYXJlUmVwbGF5KDEpKSksXG4gICAgY29tYmluZUxhdGVzdFdpdGgodGhpcy50aW1lem9uZUluc3RhbmNlJCksXG4gICAgc3dpdGNoTWFwKChbeCwgdGltZXpvbmVJbnN0YW5jZV0pID0+IHtcbiAgICAgIHJldHVybiB4LnBpcGUobWFwKGRieEZpeGVkRGF0ZVJhbmdlSW5wdXRWYWx1ZUZhY3RvcnkodGhpcy52YWx1ZU1vZGUsIHRpbWV6b25lSW5zdGFuY2UpKSk7XG4gICAgfSksXG4gICAgdGhyb3R0bGVUaW1lKDIwLCB1bmRlZmluZWQsIHsgbGVhZGluZzogZmFsc2UsIHRyYWlsaW5nOiB0cnVlIH0pLCAvLyB0aHJvdHRsZSBpbmNvbWluZyB2YWx1ZXMgYW5kIHRpbWV6b25lIGNoYW5nZXNcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZDxNYXliZTxEYXRlUmFuZ2U+Pihpc1NhbWVEYXRlRGF5UmFuZ2UpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgZGF0ZVJhbmdlU2VsZWN0aW9uRm9yTW9kZShtb2RlOiBEYnhGaXhlZERhdGVSYW5nZVNlbGVjdGlvbk1vZGUpIHtcbiAgICBjb25zdCByZXN1bHQ6IE9ic2VydmFibGU8TWF5YmU8RGF0ZVJhbmdlPj4gPSBjb21iaW5lTGF0ZXN0KFt0aGlzLmRhdGVSYW5nZUlucHV0JCwgdGhpcy5saW1pdERhdGVUaW1lSW5zdGFuY2UkXSkucGlwZShcbiAgICAgIHN3aXRjaE1hcCgoW2RhdGVSYW5nZUlucHV0LCBsaW1pdEluc3RhbmNlXSkgPT4ge1xuICAgICAgICBjb25zdCBoYXNEYXRlUmFuZ2VDb25maWd1cmF0aW9uID0gQm9vbGVhbihkYXRlUmFuZ2VJbnB1dCk7XG4gICAgICAgIGNvbnN0IG1pbk1heENsYW1wID0gKGRhdGVSYW5nZTogRGF0ZVJhbmdlKSA9PiBsaW1pdEluc3RhbmNlLmNsYW1wRGF0ZVJhbmdlKGRhdGVSYW5nZSk7XG5cbiAgICAgICAgaWYgKG1vZGUgPT09ICdzaW5nbGUnKSB7XG4gICAgICAgICAgLy8gb25seSB1c2UgdGhlIHN0YXJ0IGRhdGUuXG4gICAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWREYXRlUmFuZ2UkLnBpcGUoXG4gICAgICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZChpc1NhbWVEYXRlRGF5UmFuZ2UpLFxuICAgICAgICAgICAgbWFwKChpbnB1dERhdGVSYW5nZSkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBkYXRlID0gaW5wdXREYXRlUmFuZ2U/LnN0YXJ0O1xuICAgICAgICAgICAgICByZXR1cm4gZGF0ZSA/IChtaW5NYXhDbGFtcChkYXRlUmFuZ2UoeyAuLi5kYXRlUmFuZ2VJbnB1dCwgZGF0ZSB9IGFzIERhdGVSYW5nZUlucHV0KSkgYXMgRGF0ZVJhbmdlKSA6IG51bGw7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gdGFrZSB0aGUgZmlyc3QgZGF0ZSwgdGhlbiB3YWl0IHVubGVzcyB0aGUgZGF0ZSBpcyBvdXRzaWRlIG9mIHRoZSByYW5nZS5cbiAgICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RlZERhdGVSYW5nZSQucGlwZShcbiAgICAgICAgICAgIHNjYW4oKGFjYzogRml4ZWREYXRlUmFuZ2VTY2FuLCBuZXh0RGF0ZVJhbmdlOiBNYXliZTxQYXJ0aWFsPERhdGVSYW5nZT4+KSA9PiB7XG4gICAgICAgICAgICAgIGxldCByZXN1bHQ6IEZpeGVkRGF0ZVJhbmdlU2NhbjtcbiAgICAgICAgICAgICAgbGV0IHBpY2tUeXBlOiBNYXliZTxGaXhlZERhdGVSYW5nZVNjYW5UeXBlPiA9ICdzdGFydCc7XG5cbiAgICAgICAgICAgICAgaWYgKG5leHREYXRlUmFuZ2UgJiYgbmV4dERhdGVSYW5nZS5zdGFydCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBzdGFydDogc3RhcnRPck5leHREYXRlLCBlbmQgfSA9IG5leHREYXRlUmFuZ2U7XG4gICAgICAgICAgICAgICAgY29uc3QgcG90ZW50aWFsQm91bmRhcnkgPSBkYXRlUmFuZ2UoeyAuLi5kYXRlUmFuZ2VJbnB1dCwgZGF0ZTogc3RhcnRPck5leHREYXRlIH0gYXMgRGF0ZVJhbmdlSW5wdXQpO1xuXG4gICAgICAgICAgICAgICAgLy8gb25seSBjb21lcyB0aHJvdWdoIHdoZW4gcGFzc2VkIGJ5IHRoZSB0ZXh0IGlucHV0c1xuICAgICAgICAgICAgICAgIGlmIChzdGFydE9yTmV4dERhdGUgJiYgZW5kKSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCByYW5nZSA9IGNsYW1wRGF0ZVJhbmdlVG9EYXRlUmFuZ2UobmV4dERhdGVSYW5nZSwgcG90ZW50aWFsQm91bmRhcnkpIGFzIERhdGVSYW5nZTtcbiAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHtcbiAgICAgICAgICAgICAgICAgICAgbGFzdERhdGVSYW5nZTogbmV4dERhdGVSYW5nZSxcbiAgICAgICAgICAgICAgICAgICAgYm91bmRhcnk6IHJhbmdlLFxuICAgICAgICAgICAgICAgICAgICByYW5nZVxuICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgLy8gZm9yIG5vcm1hbCBtb2RlIHdlIHdhbnQgdG8gcHJvdGVjdCBhZ2FpbnN0IFwic3RhcnRcIiBiZWluZyBpbnB1dCwgdGhlbiB0aGUgb3V0cHV0IGJlaW5nIHBhc3NlZCxcbiAgICAgICAgICAgICAgICAgIC8vIGFuZCB0aGVuIHRoZSBuZXh0IGNsaWNrIGJlaW5nIHRyZWF0ZWQgYXMgYW5vdGhlciBcInN0YXJ0XCIgaW5zdGVhZCBvZiBhbiBcImVuZFwiLlxuICAgICAgICAgICAgICAgICAgaWYgKG1vZGUgPT09ICdub3JtYWwnICYmIGFjYy5sYXN0UGlja1R5cGUgPT09ICdzdGFydCcgJiYgaXNTYW1lRGF0ZURheShzdGFydE9yTmV4dERhdGUsIGVuZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzU2FtZURhdGVEYXkoc3RhcnRPck5leHREYXRlLCBhY2MubGFzdERhdGVSYW5nZT8uc3RhcnQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgcGlja1R5cGUgPSAnc3RhcnRSZXBlYXQnO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIGxldCByYW5nZTogTWF5YmU8RGF0ZVJhbmdlPiA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgIGxldCBib3VuZGFyeTogTWF5YmU8RGF0ZVJhbmdlPiA9IHBvdGVudGlhbEJvdW5kYXJ5O1xuXG4gICAgICAgICAgICAgICAgICBpZiAobW9kZSA9PT0gJ25vcm1hbCcpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFoYXNEYXRlUmFuZ2VDb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlcmUgaXMgbm8gY29uZmlndXJlZCByYW5nZS9ib3VuZGFyeSwgdGhlbiBqdXN0IHNldCB0aGUgcGljayB0eXBlIGJhc2VkIG9uIHRoZSBsYXN0IHR5cGVcbiAgICAgICAgICAgICAgICAgICAgICBib3VuZGFyeSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICBwaWNrVHlwZSA9IGFjYy5sYXN0UGlja1R5cGUgPT09ICdzdGFydCcgPyAnZW5kJyA6ICdzdGFydCc7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYWNjLmxhc3RQaWNrVHlwZSA9PT0gJ3N0YXJ0UmVwZWF0Jykge1xuICAgICAgICAgICAgICAgICAgICAgIHBpY2tUeXBlID0gJ2VuZCc7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIHBpY2sgaXMgb3V0c2lkZSB0aGUgYm91bmRhcnksIHRoZW4gY29uc2lkZXIgaXQgYSBzdGFydCBwaWNrIHR5cGUuXG4gICAgICAgICAgICAgICAgICAgICAgcGlja1R5cGUgPSBhY2MubGFzdFBpY2tUeXBlID09PSAnc3RhcnQnICYmIGFjYy5ib3VuZGFyeSAmJiBpc0RhdGVJbkRhdGVSYW5nZShzdGFydE9yTmV4dERhdGUsIGFjYy5ib3VuZGFyeSkgPyAnZW5kJyA6ICdzdGFydCc7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyByZWFjdCBiYXNlZCBvbiBob3cgdGhpc1xuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHBpY2tUeXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgY2FzZSAnZW5kJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhc3RTdGFydCA9IGFjYy5sYXN0RGF0ZVJhbmdlPy5zdGFydCBhcyBEYXRlO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgYm91bmRhcnlUb0NoZWNrOiBEYXRlUmFuZ2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3Rpb25Jc0JlZm9yZVByZXZpb3VzU2VsZWN0aW9uID0gIWxhc3RTdGFydCB8fCBpc0JlZm9yZShzdGFydE9yTmV4dERhdGUsIGxhc3RTdGFydCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBuZXh0U3RhcnQ6IERhdGU7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbmV4dEVuZDogRGF0ZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGlvbklzQmVmb3JlUHJldmlvdXNTZWxlY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dFN0YXJ0ID0gc3RhcnRPck5leHREYXRlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0RW5kID0gbGFzdFN0YXJ0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICBib3VuZGFyeVRvQ2hlY2sgPSBwb3RlbnRpYWxCb3VuZGFyeTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRTdGFydCA9IGxhc3RTdGFydDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEVuZCA9IHN0YXJ0T3JOZXh0RGF0ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYm91bmRhcnlUb0NoZWNrID0gZGF0ZVJhbmdlKHsgLi4uZGF0ZVJhbmdlSW5wdXQsIGRhdGU6IG5leHRTdGFydCB9IGFzIERhdGVSYW5nZUlucHV0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVjYWxjdWxhdGUgdGhlIGJvdW5kYXJ5IHVzaW5nIHRoZSBuZXh0IHN0YXJ0IGRhdGUuIElmIGl0IGlzIG91dHNpZGUgdGhlIHNlbGVjdGFibGUgcmFuZ2UsIHRoZW4gaXQgYmVjb21lcyBhIFwic3RhcnRcIiBwaWNrIHR5cGUuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNCZWZvcmUoYm91bmRhcnlUb0NoZWNrLmVuZCwgbmV4dEVuZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogQWxsb3cgY2hhbmdpbmcgdGhlIGJlaGF2aW9yIHRvIGZpbGwgdGhlIGVudGlyZSByYW5nZSBpbnN0ZWFkIG9mIGp1c3QgcmVzZXR0aW5nIGl0IGVudGlyZWx5XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dFN0YXJ0ID0gc3RhcnRPck5leHREYXRlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0RW5kID0gc3RhcnRPck5leHREYXRlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBwaWNrVHlwZSA9ICdzdGFydCc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGJvdW5kYXJ5ID0gYm91bmRhcnlUb0NoZWNrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYm91bmRhcnkgPSByYW5nZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UncmUgcGlja2luZyB0aGUgZW5kIHRoZW4gc2V0IHRoZSByYW5nZS5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydDogbmV4dFN0YXJ0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQ6IG5leHRFbmRcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICBjYXNlICdzdGFydCc6XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZXRhaW4gdGhlIGJvdW5kYXJ5IGFzIHBvdGVudGlhbCBib3VuZGFyeSwgYW5kIHNldCBvdXIgbmV3IHJhbmdlIGZyb20gdGhlIHNpbmdsZSBkYXRlLlxuICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0OiBzdGFydE9yTmV4dERhdGUgYXMgRGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kOiBzdGFydE9yTmV4dERhdGUgYXMgRGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFjYy5ib3VuZGFyeSAmJiBpc0RhdGVJbkRhdGVSYW5nZShzdGFydE9yTmV4dERhdGUsIGFjYy5ib3VuZGFyeSkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgaW4gdGhlIGRhdGUgcmFuZ2UsIHVzZXMgdGhlIHBpY2sgYXMgdGhlIGxhc3QgZGF0ZS5cbiAgICAgICAgICAgICAgICAgICAgcmFuZ2UgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgc3RhcnQ6IGFjYy5ib3VuZGFyeS5zdGFydCxcbiAgICAgICAgICAgICAgICAgICAgICBlbmQ6IHN0YXJ0T3JOZXh0RGF0ZVxuICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChtb2RlID09PSAnYXJiaXRyYXJ5X3F1aWNrJykge1xuICAgICAgICAgICAgICAgICAgICAgIC8vIG1vZGlmeSBib3VuZGFyeSB0byBtYXRjaCByYW5nZVxuICAgICAgICAgICAgICAgICAgICAgIGlmIChpc1NhbWVEYXRlUmFuZ2UoYWNjLnJhbmdlLCByYW5nZSkgJiYgaXNTYW1lRGF0ZURheShyYW5nZS5lbmQsIHN0YXJ0T3JOZXh0RGF0ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlIGNsaWNrZWQgb24gdGhlIGVuZCByYW5nZSwgdGhlbiBleHBhbmQgdGhlIGJvdW5kYXJ5IGFnYWluIHRvIHRoZSBmdWxsIHJhbmdlLlxuICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UgPSBkYXRlUmFuZ2UoeyAuLi5kYXRlUmFuZ2VJbnB1dCwgZGF0ZTogcmFuZ2Uuc3RhcnQgfSBhcyBEYXRlUmFuZ2VJbnB1dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBib3VuZGFyeSA9IHJhbmdlO1xuICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBib3VuZGFyeSA9IHJhbmdlO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAvLyByZXRhaW4gc2FtZSBib3VuZGFyeVxuICAgICAgICAgICAgICAgICAgICAgIGJvdW5kYXJ5ID0gYWNjLmJvdW5kYXJ5O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1vZGUgPT09ICdhcmJpdHJhcnlfcXVpY2snKSB7XG4gICAgICAgICAgICAgICAgICAgIHJhbmdlID0gcG90ZW50aWFsQm91bmRhcnk7XG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHtcbiAgICAgICAgICAgICAgICAgICAgbGFzdERhdGVSYW5nZTogbmV4dERhdGVSYW5nZSxcbiAgICAgICAgICAgICAgICAgICAgYm91bmRhcnksXG4gICAgICAgICAgICAgICAgICAgIHJhbmdlXG4gICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB7XG4gICAgICAgICAgICAgICAgICBsYXN0RGF0ZVJhbmdlOiBuZXh0RGF0ZVJhbmdlXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB7XG4gICAgICAgICAgICAgICAgICBsYXN0UGlja1R5cGU6IHBpY2tUeXBlLFxuICAgICAgICAgICAgICAgICAgbGFzdERhdGVSYW5nZTogcmVzdWx0Lmxhc3REYXRlUmFuZ2UsXG4gICAgICAgICAgICAgICAgICBib3VuZGFyeTogcmVzdWx0LmJvdW5kYXJ5ID8gKG1pbk1heENsYW1wKHJlc3VsdC5ib3VuZGFyeSkgYXMgRGF0ZVJhbmdlKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgIHJhbmdlOiByZXN1bHQucmFuZ2UgPyAobWluTWF4Q2xhbXAocmVzdWx0LnJhbmdlKSBhcyBEYXRlUmFuZ2UpIDogdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9LCB7fSksXG4gICAgICAgICAgICBmaWx0ZXIoKHgpID0+ICF4Lmxhc3REYXRlUmFuZ2UgfHwgeC5yYW5nZSAhPSBudWxsKSwgLy8gcGFzcyB0aHJvdWdoIG51bGwvZGF0ZSBjbGVhcmluZ3Mgb3IgcmFuZ2VzXG4gICAgICAgICAgICBtYXAoKHgpID0+IHgucmFuZ2UgPz8gbnVsbCkgLy8gcmV0dXJuIHRoZSByYW5nZVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICByZWFkb25seSBmdWxsQm91bmRhcnkkOiBPYnNlcnZhYmxlPE1heWJlPERhdGVSYW5nZT4+ID0gdGhpcy5kYXRlUmFuZ2VTZWxlY3Rpb25Gb3JNb2RlKCdzaW5nbGUnKS5waXBlKHNoYXJlUmVwbGF5KDEpKTtcbiAgcmVhZG9ubHkgbGF0ZXN0Qm91bmRhcnkkOiBPYnNlcnZhYmxlPE1heWJlPERhdGVSYW5nZT4+ID0gdGhpcy5zZWxlY3Rpb25Nb2RlJC5waXBlKFxuICAgIHN3aXRjaE1hcCgobW9kZSkgPT4ge1xuICAgICAgaWYgKG1vZGUgPT09ICdhcmJpdHJhcnlfcXVpY2snKSB7XG4gICAgICAgIC8vIGluIGFyYml0cmFyeV9xdWljayBtb2RlLCB0aGUgbGF0ZXN0IHZhbHVlIGlzIHRoZSBib3VuZGFyeSwgc2luY2Ugd2UgYWx3YXlzIHNldCB0aGUgdmFsdWUgaW1tZWRpYXRlbHkuXG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlSW5TeXN0ZW1UaW1lem9uZSQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5mdWxsQm91bmRhcnkkO1xuICAgICAgfVxuICAgIH0pXG4gICk7XG5cbiAgLyoqXG4gICAqIEZvY3VzZXMgb24gdGhlIGRhdGUgYW55IHRpbWUgdGhlIHNlbGVjdGlvbiBldmVudCBmcm9tIHRoZSBwaWNrZXIgb2NjdXJlZCwgb3RoZXJ3aXNlIHVzZSB0aGUgc3lzdGVtIHZhbHVlXG4gICAqL1xuICByZWFkb25seSBjYWxlbmRhckZvY3VzRGF0ZSQ6IE9ic2VydmFibGU8RGF0ZT4gPSB0aGlzLl9zZWxlY3Rpb25FdmVudC5waXBlKHN0YXJ0V2l0aChudWxsKSkucGlwZShcbiAgICBzd2l0Y2hNYXAoKHNlbGVjdGlvbkV2ZW50KSA9PiB7XG4gICAgICBpZiAoc2VsZWN0aW9uRXZlbnQgJiYgc2VsZWN0aW9uRXZlbnQudHlwZSA9PT0gJ2NhbGVuZGFyJyAmJiBzZWxlY3Rpb25FdmVudC5yYW5nZT8uc3RhcnQpIHtcbiAgICAgICAgcmV0dXJuIG9mKHNlbGVjdGlvbkV2ZW50LnJhbmdlLnN0YXJ0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZ1bGxCb3VuZGFyeSQucGlwZShcbiAgICAgICAgICBmaXJzdCgpLFxuICAgICAgICAgIG1hcCgoZnVsbEJvdW5kYXJ5KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gZnVsbEJvdW5kYXJ5Py5zdGFydCA/PyBzZWxlY3Rpb25FdmVudD8ucmFuZ2U/LnN0YXJ0O1xuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSksXG4gICAgZmlsdGVyTWF5YmUoKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IGRhdGVSYW5nZVNlbGVjdGlvbiQ6IE9ic2VydmFibGU8TWF5YmU8RGF0ZVJhbmdlPj4gPSB0aGlzLnNlbGVjdGlvbk1vZGUkLnBpcGUoc3dpdGNoTWFwKChtb2RlKSA9PiB0aGlzLmRhdGVSYW5nZVNlbGVjdGlvbkZvck1vZGUobW9kZSkpKTtcblxuICByZWFkb25seSBjYWxlbmRhclNlbGVjdGlvbiQ6IE9ic2VydmFibGU8RGF0ZVBpY2tlckRhdGVSYW5nZTxEYXRlPiB8IG51bGw+ID0gdGhpcy52YWx1ZUluU3lzdGVtVGltZXpvbmUkLnBpcGUoXG4gICAgbWFwKCh4KSA9PiAoeCA/IG5ldyBEYXRlUGlja2VyRGF0ZVJhbmdlPERhdGU+KHguc3RhcnQsIHguZW5kKSA6IG51bGwpKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IGVuZERpc2FibGVkJCA9IHRoaXMuc2VsZWN0aW9uTW9kZSQucGlwZShcbiAgICBtYXAoKHgpID0+IHggPT09ICdzaW5nbGUnKSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgaW5wdXRSYW5nZUZvcm0gPSBuZXcgRm9ybUdyb3VwKHtcbiAgICBzdGFydDogbmV3IEZvcm1Db250cm9sPE1heWJlPERhdGU+PihudWxsKSxcbiAgICBlbmQ6IG5ldyBGb3JtQ29udHJvbDxNYXliZTxEYXRlPj4obnVsbClcbiAgfSk7XG5cbiAgZ2V0IGZpeGVkRGF0ZVJhbmdlRmllbGQoKTogRGJ4Rml4ZWREYXRlUmFuZ2VGaWVsZFByb3BzIHtcbiAgICByZXR1cm4gdGhpcy5maWVsZC5wcm9wcztcbiAgfVxuXG4gIGdldCBzZWxlY3Rpb25Nb2RlKCkge1xuICAgIHJldHVybiB0aGlzLmZpZWxkLnByb3BzLnNlbGVjdGlvbk1vZGU7XG4gIH1cblxuICBnZXQgdmFsdWVNb2RlKCk6IERieERhdGVUaW1lVmFsdWVNb2RlIHtcbiAgICByZXR1cm4gdGhpcy5maWVsZC5wcm9wcy52YWx1ZU1vZGUgPz8gRGJ4RGF0ZVRpbWVWYWx1ZU1vZGUuREFURTtcbiAgfVxuXG4gIGdldCBkZXNjcmlwdGlvbigpOiBNYXliZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5maWVsZC5wcm9wcy5kZXNjcmlwdGlvbjtcbiAgfVxuXG4gIGdldCB0aW1lem9uZSgpIHtcbiAgICByZXR1cm4gdGhpcy5maWVsZC5wcm9wcy50aW1lem9uZTtcbiAgfVxuXG4gIGdldCBzaG93VGltZXpvbmUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZmllbGQucHJvcHMuc2hvd1RpbWV6b25lID8/IHRydWU7XG4gIH1cblxuICBnZXQgcHJlc2V0cygpIHtcbiAgICByZXR1cm4gdGhpcy5maWVsZC5wcm9wcy5wcmVzZXRzO1xuICB9XG5cbiAgZ2V0IHNob3dSYW5nZUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLmZpZWxkLnByb3BzLnNob3dSYW5nZUlucHV0ID8/IHRydWU7XG4gIH1cblxuICByZWFkb25seSBtaW5NYXhSYW5nZSQgPSB0aGlzLmxpbWl0RGF0ZVRpbWVJbnN0YW5jZSQucGlwZShcbiAgICBjb21iaW5lTGF0ZXN0V2l0aCh0aW1lcihNU19JTl9NSU5VVEUpKSwgLy8gcmVmcmVzaCBldmVyeSBtaW51dGVcbiAgICBtYXAoKFt4XSkgPT4geC5kYXRlUmFuZ2UoKSksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoaXNTYW1lRGF0ZURheVJhbmdlKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IG1pbiQgPSB0aGlzLm1pbk1heFJhbmdlJC5waXBlKFxuICAgIG1hcCgoeCkgPT4geD8uc3RhcnQgPz8gbnVsbCksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IG1heCQgPSB0aGlzLm1pbk1heFJhbmdlJC5waXBlKFxuICAgIG1hcCgoeCkgPT4geD8uZW5kID8/IG51bGwpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBwaWNrZXJGaWx0ZXIkOiBPYnNlcnZhYmxlPERlY2lzaW9uRnVuY3Rpb248RGF0ZSB8IG51bGw+PiA9IHRoaXMuY29uZmlnJC5waXBlKFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgbWFwKCh4KSA9PiB7XG4gICAgICBpZiAoeCkge1xuICAgICAgICBjb25zdCBmaWx0ZXIgPSBkYXRlVGltZU1pbnV0ZVdob2xlRGF5RGVjaXNpb25GdW5jdGlvbih4LCBmYWxzZSk7XG4gICAgICAgIHJldHVybiAoeDogRGF0ZSB8IG51bGwpID0+ICh4ICE9IG51bGwgPyBmaWx0ZXIoeCkgOiB0cnVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiAoKSA9PiB0cnVlO1xuICAgICAgfVxuICAgIH0pLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgZGVmYXVsdFBpY2tlckZpbHRlcjogRGVjaXNpb25GdW5jdGlvbjxEYXRlIHwgbnVsbD4gPSAoKSA9PiB0cnVlO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgZGJ4RGF0ZVRpbWVGaWVsZENvbmZpZ1NlcnZpY2U6IERieERhdGVUaW1lRmllbGRNZW51UHJlc2V0c1NlcnZpY2UpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5fZm9ybUNvbnRyb2xPYnMubmV4dCh0aGlzLmZvcm1Db250cm9sKTtcblxuICAgIGNvbnN0IGRhdGVSYW5nZVNlbGVjdGlvbiA9IHRoaXMuZGF0ZVJhbmdlU2VsZWN0aW9uJC5waXBlKHNoYXJlUmVwbGF5KDEpKTtcblxuICAgIGNvbnN0IHNldElucHV0Rm9ybVZhbHVlID0gKHZhbHVlOiBNYXliZTxEYXRlUmFuZ2U+KSA9PiB7XG4gICAgICBpZiAoIWlzU2FtZURhdGVEYXlSYW5nZSh2YWx1ZSwgdGhpcy5pbnB1dFJhbmdlRm9ybS52YWx1ZSBhcyBQYXJ0aWFsPERhdGVSYW5nZT4pKSB7XG4gICAgICAgIHRoaXMuaW5wdXRSYW5nZUZvcm0uc2V0VmFsdWUoe1xuICAgICAgICAgIHN0YXJ0OiB2YWx1ZT8uc3RhcnQgPz8gbnVsbCxcbiAgICAgICAgICBlbmQ6IHZhbHVlPy5lbmQgPz8gbnVsbFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdGhpcy5fc3ViLnN1YnNjcmlwdGlvbiA9IHRoaXMudmFsdWVJblN5c3RlbVRpbWV6b25lJFxuICAgICAgLnBpcGUoXG4gICAgICAgIGNvbWJpbmVMYXRlc3RXaXRoKHRoaXMudGltZXpvbmVJbnN0YW5jZSQucGlwZShtYXAoKHRpbWV6b25lSW5zdGFuY2UpID0+IGRieEZpeGVkRGF0ZVJhbmdlT3V0cHV0VmFsdWVGYWN0b3J5KHRoaXMudmFsdWVNb2RlLCB0aW1lem9uZUluc3RhbmNlKSkpKSxcbiAgICAgICAgdGhyb3R0bGVUaW1lKFRJTUVfT1VUUFVUX1RIUk9UVExFX1RJTUUsIHVuZGVmaW5lZCwgeyBsZWFkaW5nOiBmYWxzZSwgdHJhaWxpbmc6IHRydWUgfSksXG4gICAgICAgIHN3aXRjaE1hcCgoW2N1cnJlbnRWYWx1ZSwgdmFsdWVGYWN0b3J5XSkgPT4ge1xuICAgICAgICAgIHJldHVybiBkYXRlUmFuZ2VTZWxlY3Rpb24ucGlwZShcbiAgICAgICAgICAgIHNraXBGaXJzdE1heWJlKCksXG4gICAgICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZDxNYXliZTxEYXRlUmFuZ2U+Pihpc1NhbWVEYXRlRGF5UmFuZ2UpLFxuICAgICAgICAgICAgbWFwKCh4KSA9PiBbeCwgY3VycmVudFZhbHVlLCB2YWx1ZUZhY3RvcnldIGFzIFt0eXBlb2YgeCwgdHlwZW9mIGN1cnJlbnRWYWx1ZSwgdHlwZW9mIHZhbHVlRmFjdG9yeV0pXG4gICAgICAgICAgKTtcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKFtyYXdWYWx1ZSwgY3VycmVudFZhbHVlLCB2YWx1ZUZhY3RvcnldKSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gcmF3VmFsdWUgPyB2YWx1ZUZhY3RvcnkocmF3VmFsdWUpIDogbnVsbDtcbiAgICAgICAgY29uc3QgaXNTYW1lUmFuZ2UgPSBkYnhEYXRlUmFuZ2VJc1NhbWVEYXRlUmFuZ2VGaWVsZFZhbHVlKHZhbHVlLCBjdXJyZW50VmFsdWUpO1xuXG4gICAgICAgIGlmICghaXNTYW1lUmFuZ2UpIHtcbiAgICAgICAgICB0aGlzLmZvcm1Db250cm9sLnNldFZhbHVlKHZhbHVlKTtcbiAgICAgICAgICB0aGlzLmZvcm1Db250cm9sLm1hcmtBc0RpcnR5KCk7XG4gICAgICAgICAgdGhpcy5mb3JtQ29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XG4gICAgICAgIH0gZWxzZSBpZiAocmF3VmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgaW5wdXQgdGV4dCBhZ2FpblxuICAgICAgICAgIHNldElucHV0Rm9ybVZhbHVlKHJhd1ZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlKSB7XG4gICAgICB0aGlzLl9zZWxlY3Rpb25Nb2RlLm5leHQoYXNPYnNlcnZhYmxlRnJvbUdldHRlcih0aGlzLnNlbGVjdGlvbk1vZGUpKTtcbiAgICB9XG5cbiAgICB0aGlzLl9jdXJyZW50U2VsZWN0aW9uTW9kZVN1Yi5zdWJzY3JpcHRpb24gPSB0aGlzLnNlbGVjdGlvbk1vZGUkLnN1YnNjcmliZSgoeCkgPT4gKHRoaXMuX2N1cnJlbnRTZWxlY3Rpb25Nb2RlID0geCkpO1xuICAgIHRoaXMuX2RhdGVSYW5nZUlucHV0U3ViLnN1YnNjcmlwdGlvbiA9IHRoaXMuZGF0ZVJhbmdlSW5wdXQkLnN1YnNjcmliZSgoeCkgPT4gKHRoaXMuX2N1cnJlbnREYXRlUmFuZ2VJbnB1dCA9IHgpKTtcblxuICAgIHRoaXMuX2lucHV0UmFuZ2VGb3JtU3ViLnN1YnNjcmlwdGlvbiA9IHRoaXMudmFsdWVJblN5c3RlbVRpbWV6b25lJC5zdWJzY3JpYmUoKHg6IE1heWJlPERhdGVSYW5nZT4pID0+IHtcbiAgICAgIHNldElucHV0Rm9ybVZhbHVlKHgpO1xuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMuc2hvd1JhbmdlSW5wdXQpIHtcbiAgICAgIHRoaXMuX2lucHV0UmFuZ2VGb3JtVmFsdWVTdWIuc3Vic2NyaXB0aW9uID0gdGhpcy52YWx1ZUluU3lzdGVtVGltZXpvbmUkXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIHRocm90dGxlVGltZSgxMDApLCAvLyB0aHJvdHRsZSB0byBwcmV2ZW50IHRoZSB2YWx1ZSBmcm9tIGNoYW5naW5nIHRvbyBmYXN0XG4gICAgICAgICAgc3dpdGNoTWFwKCgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmlucHV0UmFuZ2VGb3JtLnZhbHVlQ2hhbmdlcy5waXBlKFxuICAgICAgICAgICAgICBkZWJvdW5jZVRpbWUoNTAwKSxcbiAgICAgICAgICAgICAgZmlsdGVyKCgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBzdGFydFN0cmluZyA9IHRoaXMuc3RhcnREYXRlSW5wdXRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQ/LnZhbHVlO1xuICAgICAgICAgICAgICAgIGxldCB2YWxpZCA9IGlzTW9udGhEYXlTbGFzaERhdGUoc3RhcnRTdHJpbmcpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHZhbGlkICYmIHRoaXMuX2N1cnJlbnRTZWxlY3Rpb25Nb2RlICE9PSAnc2luZ2xlJykge1xuICAgICAgICAgICAgICAgICAgY29uc3QgZW5kU3RyaW5nID0gdGhpcy5lbmREYXRlSW5wdXRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQ/LnZhbHVlO1xuICAgICAgICAgICAgICAgICAgdmFsaWQgPSBpc01vbnRoRGF5U2xhc2hEYXRlKGVuZFN0cmluZyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbGlkOyAvLyBtdXN0IGJlIGEgdmFsaWQgdGV4dCBpbnB1dFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgbWFwKCh4KSA9PiB4IGFzIE1heWJlPFBhcnRpYWw8RGF0ZVJhbmdlPj4pXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pLFxuICAgICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKGlzU2FtZURhdGVSYW5nZSlcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKCh4OiBNYXliZTxQYXJ0aWFsPERhdGVSYW5nZT4+KSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuX2N1cnJlbnRTZWxlY3Rpb25Nb2RlID09PSAnc2luZ2xlJykge1xuICAgICAgICAgICAgdGhpcy5zZXREYXRlUmFuZ2UoeD8uc3RhcnQgPyB7IHN0YXJ0OiB4LnN0YXJ0IH0gOiBudWxsLCAnaW5wdXQnKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IHJhbmdlVG9TZXQ6IE1heWJlPFBhcnRpYWw8RGF0ZVJhbmdlPj4gPSB4O1xuXG4gICAgICAgICAgICBpZiAodGhpcy5fY3VycmVudFNlbGVjdGlvbk1vZGUgPT09ICdhcmJpdHJhcnlfcXVpY2snICYmIHRoaXMuX2xhdGVzdEJvdW5kYXJ5ICYmIHg/LnN0YXJ0ICYmIHg/LmVuZCkge1xuICAgICAgICAgICAgICBpZiAoIWlzRGF0ZUluRGF0ZVJhbmdlKHguc3RhcnQsIHRoaXMuX2xhdGVzdEJvdW5kYXJ5KSkge1xuICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBlbmQgZGF0ZSBpdCBvdXRzaWRlIG9mIHRoZSBjdXJyZW50IHJhbmdlIChpLmUuIGEgcmFuZ2Ugd2FzIHR5cGVkIGluIG9ubHkgdG8gdGhlIHN0YXJ0IGRhdGUpIHRoZW4gc2V0IHRoZSBlbmQgdG8gdGhlIGJvdW5kYXJ5IGVuZFxuICAgICAgICAgICAgICAgIGNvbnN0IGJvdW5kYXJ5ID0gZGF0ZVJhbmdlKHsgLi4udGhpcy5fY3VycmVudERhdGVSYW5nZUlucHV0LCBkYXRlOiB4LnN0YXJ0IH0gYXMgRGF0ZVJhbmdlSW5wdXQpO1xuICAgICAgICAgICAgICAgIHJhbmdlVG9TZXQgPSB7IHN0YXJ0OiB4LnN0YXJ0LCBlbmQ6IGJvdW5kYXJ5LmVuZCB9O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuc2V0RGF0ZVJhbmdlKHJhbmdlVG9TZXQsICdpbnB1dCcpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5fbGF0ZXN0Qm91bmRhcnlTdWIuc3Vic2NyaXB0aW9uID0gdGhpcy5sYXRlc3RCb3VuZGFyeSQuc3Vic2NyaWJlKCh4KSA9PiAodGhpcy5fbGF0ZXN0Qm91bmRhcnkgPSB4KSk7XG4gICAgdGhpcy5fZGF0ZVJhbmdlSW5wdXQubmV4dChhc09ic2VydmFibGVGcm9tR2V0dGVyKHRoaXMuZml4ZWREYXRlUmFuZ2VGaWVsZC5kYXRlUmFuZ2VJbnB1dCkpO1xuXG4gICAgdGhpcy5fZGlzYWJsZUVuZFN1Yi5zdWJzY3JpcHRpb24gPSB0aGlzLmVuZERpc2FibGVkJC5zdWJzY3JpYmUoKGRpc2FibGVkKSA9PiB7XG4gICAgICBjb25zdCBlbmQgPSB0aGlzLmlucHV0UmFuZ2VGb3JtLmdldCgnZW5kJyk7XG5cbiAgICAgIGlmIChlbmQpIHtcbiAgICAgICAgaWYgKGRpc2FibGVkKSB7XG4gICAgICAgICAgZW5kLmRpc2FibGUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlbmQuZW5hYmxlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnN0IGlucHV0UGlja2VyQ29uZmlnID0gdGhpcy5maXhlZERhdGVSYW5nZUZpZWxkLnBpY2tlckNvbmZpZztcbiAgICB0aGlzLl9jb25maWcubmV4dChpbnB1dFBpY2tlckNvbmZpZyA/IGFzT2JzZXJ2YWJsZUZyb21HZXR0ZXIoaW5wdXRQaWNrZXJDb25maWcpIDogdW5kZWZpbmVkKTtcblxuICAgIC8vIFNldCBkZWZhdWx0IHRpbWV6b25lIGlmIHByb3ZpZGVkLlxuICAgIGlmICh0aGlzLnRpbWV6b25lICYmICF0aGlzLmZpeGVkRGF0ZVJhbmdlRmllbGQuZnVsbERheUluVVRDKSB7XG4gICAgICB0aGlzLl90aW1lem9uZS5uZXh0KGFzT2JzZXJ2YWJsZUZyb21HZXR0ZXIodGhpcy50aW1lem9uZSkpO1xuICAgIH1cblxuICAgIC8vIFdhdGNoIGZvciBkaXNhYmxlZCBjaGFuZ2VzIHNvIHdlIGNhbiBwcm9wb2dhdGUgdGhlbSBwcm9wZXJseS5cbiAgICB0aGlzLmZvcm1Db250cm9sLnJlZ2lzdGVyT25EaXNhYmxlZENoYW5nZSgoZGlzYWJsZWQpID0+IHtcbiAgICAgIGlmIChkaXNhYmxlZCkge1xuICAgICAgICB0aGlzLmlucHV0UmFuZ2VGb3JtLmRpc2FibGUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuaW5wdXRSYW5nZUZvcm0uZW5hYmxlKCk7XG5cbiAgICAgICAgdGhpcy5lbmREaXNhYmxlZCQucGlwZShmaXJzdCgpKS5zdWJzY3JpYmUoKGRpc2FibGVkKSA9PiB7XG4gICAgICAgICAgY29uc3QgZW5kID0gdGhpcy5pbnB1dFJhbmdlRm9ybS5nZXQoJ2VuZCcpO1xuXG4gICAgICAgICAgaWYgKGVuZCkge1xuICAgICAgICAgICAgaWYgKGRpc2FibGVkKSB7XG4gICAgICAgICAgICAgIGVuZC5kaXNhYmxlKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBlbmQuZW5hYmxlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmICh0aGlzLnByZXNldHMgIT0gbnVsbCkge1xuICAgICAgdGhpcy5fcHJlc2V0cy5uZXh0KGFzT2JzZXJ2YWJsZUZyb21HZXR0ZXIodGhpcy5wcmVzZXRzKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3ByZXNldHMubmV4dCh0aGlzLmRieERhdGVUaW1lRmllbGRDb25maWdTZXJ2aWNlLmNvbmZpZ3VyYXRpb25zJCk7XG4gICAgfVxuXG4gICAgdGhpcy5fYWN0aXZlRGF0ZVN1Yi5zdWJzY3JpcHRpb24gPSB0aGlzLmNhbGVuZGFyRm9jdXNEYXRlJC5zdWJzY3JpYmUoKHgpID0+IHtcbiAgICAgIHRoaXMuY2FsZW5kYXIuYWN0aXZlRGF0ZSA9IHg7XG4gICAgfSk7XG4gIH1cblxuICBvdmVycmlkZSBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICBzdXBlci5uZ09uRGVzdHJveSgpO1xuICAgIHRoaXMuX3N1Yi5kZXN0cm95KCk7XG4gICAgdGhpcy5faW5wdXRSYW5nZUZvcm1TdWIuZGVzdHJveSgpO1xuICAgIHRoaXMuX2lucHV0UmFuZ2VGb3JtVmFsdWVTdWIuZGVzdHJveSgpO1xuICAgIHRoaXMuX2RhdGVSYW5nZUlucHV0U3ViLmRlc3Ryb3koKTtcbiAgICB0aGlzLl9jdXJyZW50U2VsZWN0aW9uTW9kZVN1Yi5kZXN0cm95KCk7XG4gICAgdGhpcy5fbGF0ZXN0Qm91bmRhcnlTdWIuZGVzdHJveSgpO1xuICAgIHRoaXMuX2Rpc2FibGVFbmRTdWIuZGVzdHJveSgpO1xuICAgIHRoaXMuX2FjdGl2ZURhdGVTdWIuZGVzdHJveSgpO1xuICAgIHRoaXMuX2NvbmZpZy5jb21wbGV0ZSgpO1xuICAgIHRoaXMuX3NlbGVjdGlvbk1vZGUuY29tcGxldGUoKTtcbiAgICB0aGlzLl9kYXRlUmFuZ2VJbnB1dC5jb21wbGV0ZSgpO1xuICAgIHRoaXMuX3RpbWV6b25lLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5fcHJlc2V0cy5jb21wbGV0ZSgpO1xuICAgIHRoaXMuX3NlbGVjdGlvbkV2ZW50LmNvbXBsZXRlKCk7XG4gICAgdGhpcy5fZm9ybUNvbnRyb2xPYnMuY29tcGxldGUoKTtcbiAgfVxuXG4gIHNlbGVjdGVkQ2hhbmdlKGRhdGU6IE1heWJlPERhdGU+KTogdm9pZCB7XG4gICAgdGhpcy5zZXREYXRlUmFuZ2UoZGF0ZSA/IHsgc3RhcnQ6IGRhdGUgfSA6IG51bGwsICdjYWxlbmRhcicpO1xuICB9XG5cbiAgc2V0RGF0ZVJhbmdlKHJhbmdlOiBNYXliZTxQYXJ0aWFsPERhdGVSYW5nZT4+LCB0eXBlOiBTZWxlY3RlZERhdGVFdmVudFR5cGUpIHtcbiAgICB0aGlzLl9zZWxlY3Rpb25FdmVudC5uZXh0KHsgdHlwZSwgcmFuZ2UgfSk7XG4gIH1cblxuICBfY3JlYXRlRGF0ZVJhbmdlKGRhdGU6IE1heWJlPERhdGU+KTogTWF5YmU8RGF0ZVJhbmdlPiB7XG4gICAgcmV0dXJuIGRhdGUgPyBkYXRlUmFuZ2UoeyAuLi50aGlzLl9jdXJyZW50RGF0ZVJhbmdlSW5wdXQsIGRhdGUgfSBhcyBEYXRlUmFuZ2VJbnB1dCkgOiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIERieEZpeGVkRGF0ZVJhbmdlRmllbGRTZWxlY3Rpb25TdHJhdGVneTxEPiBpbXBsZW1lbnRzIE1hdERhdGVSYW5nZVNlbGVjdGlvblN0cmF0ZWd5PEQ+IHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfZGF0ZUFkYXB0ZXI6IERhdGVBZGFwdGVyPEQ+LCByZWFkb25seSBkYnhGaXhlZERhdGVSYW5nZUZpZWxkQ29tcG9uZW50OiBEYnhGaXhlZERhdGVSYW5nZUZpZWxkQ29tcG9uZW50KSB7fVxuXG4gIHNlbGVjdGlvbkZpbmlzaGVkKGRhdGU6IEQgfCBudWxsLCBjdXJyZW50UmFuZ2U6IERhdGVQaWNrZXJEYXRlUmFuZ2U8RD4sIGV2ZW50OiBFdmVudCk6IERhdGVQaWNrZXJEYXRlUmFuZ2U8RD4ge1xuICAgIC8vIHVudXNlZFxuICAgIHJldHVybiBjdXJyZW50UmFuZ2U7XG4gIH1cblxuICBjcmVhdGVQcmV2aWV3KGFjdGl2ZURhdGU6IEQgfCBudWxsLCBjdXJyZW50UmFuZ2U6IERhdGVQaWNrZXJEYXRlUmFuZ2U8RD4sIGV2ZW50OiBFdmVudCk6IERhdGVQaWNrZXJEYXRlUmFuZ2U8RD4ge1xuICAgIGNvbnN0IHsgY3VycmVudFNlbGVjdGlvbk1vZGUgfSA9IHRoaXMuZGJ4Rml4ZWREYXRlUmFuZ2VGaWVsZENvbXBvbmVudDtcbiAgICBpZiAoYWN0aXZlRGF0ZSAhPSBudWxsICYmIGN1cnJlbnRTZWxlY3Rpb25Nb2RlICE9PSAnc2luZ2xlJykge1xuICAgICAgY29uc3QgbGF0ZXN0Qm91bmRhcnkgPSB0aGlzLmRieEZpeGVkRGF0ZVJhbmdlRmllbGRDb21wb25lbnQubGF0ZXN0Qm91bmRhcnk7XG4gICAgICBjb25zdCBkYXRlID0gdGhpcy5kYXRlRnJvbUFkYXB0ZXJEYXRlKGFjdGl2ZURhdGUpO1xuXG4gICAgICBpZiAobGF0ZXN0Qm91bmRhcnkgJiYgKGN1cnJlbnRTZWxlY3Rpb25Nb2RlID09PSAnbm9ybWFsJyB8fCBpc0RhdGVJbkRhdGVSYW5nZShkYXRlLCBsYXRlc3RCb3VuZGFyeSkpKSB7XG4gICAgICAgIGNvbnN0IGV4YW1wbGVEYXRlUmFuZ2UgPSB0aGlzLl9jcmVhdGVEYXRlUmFuZ2UobGF0ZXN0Qm91bmRhcnkpO1xuICAgICAgICByZXR1cm4gZXhhbXBsZURhdGVSYW5nZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fY3JlYXRlRGF0ZVJhbmdlV2l0aERhdGUoYWN0aXZlRGF0ZSk7XG4gIH1cblxuICBwcml2YXRlIF9jcmVhdGVEYXRlUmFuZ2VXaXRoRGF0ZShpbnB1dDogRCB8IG51bGwpOiBEYXRlUGlja2VyRGF0ZVJhbmdlPEQ+IHtcbiAgICBsZXQgZGF0ZVJhbmdlOiBNYXliZTxEYXRlUmFuZ2U+O1xuXG4gICAgaWYgKGlucHV0KSB7XG4gICAgICBjb25zdCBkYXRlID0gdGhpcy5kYXRlRnJvbUFkYXB0ZXJEYXRlKGlucHV0KTtcbiAgICAgIGRhdGVSYW5nZSA9IHRoaXMuZGJ4Rml4ZWREYXRlUmFuZ2VGaWVsZENvbXBvbmVudC5fY3JlYXRlRGF0ZVJhbmdlKGRhdGUpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9jcmVhdGVEYXRlUmFuZ2UoZGF0ZVJhbmdlKTtcbiAgfVxuXG4gIHByaXZhdGUgX2NyZWF0ZURhdGVSYW5nZShpbnB1dDogTWF5YmU8RGF0ZVJhbmdlPik6IERhdGVQaWNrZXJEYXRlUmFuZ2U8RD4ge1xuICAgIGlmIChpbnB1dCkge1xuICAgICAgcmV0dXJuIG5ldyBEYXRlUGlja2VyRGF0ZVJhbmdlPEQ+KHRoaXMuYWRhcHRlckRhdGVGcm9tRGF0ZShpbnB1dC5zdGFydCksIHRoaXMuYWRhcHRlckRhdGVGcm9tRGF0ZShpbnB1dC5lbmQpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG5ldyBEYXRlUGlja2VyRGF0ZVJhbmdlPEQ+KG51bGwsIG51bGwpO1xuICAgIH1cbiAgfVxuXG4gIGRhdGVGcm9tQWRhcHRlckRhdGUoaW5wdXQ6IEQpIHtcbiAgICBjb25zdCBkYXk6IERheU9mTW9udGggPSB0aGlzLl9kYXRlQWRhcHRlci5nZXREYXRlKGlucHV0KTtcbiAgICBjb25zdCBtb250aEluZGV4OiBEYXRlTW9udGggPSB0aGlzLl9kYXRlQWRhcHRlci5nZXRNb250aChpbnB1dCk7XG4gICAgY29uc3QgeWVhcjogWWVhck51bWJlciA9IHRoaXMuX2RhdGVBZGFwdGVyLmdldFllYXIoaW5wdXQpO1xuICAgIHJldHVybiBuZXcgRGF0ZSh5ZWFyLCBtb250aEluZGV4LCBkYXkpO1xuICB9XG5cbiAgYWRhcHRlckRhdGVGcm9tRGF0ZShkYXRlOiBEYXRlKTogRCB7XG4gICAgY29uc3QgZGF5OiBEYXlPZk1vbnRoID0gZGF0ZS5nZXREYXRlKCk7XG4gICAgY29uc3QgbW9udGhJbmRleDogRGF0ZU1vbnRoID0gZGF0ZS5nZXRNb250aCgpO1xuICAgIGNvbnN0IHllYXI6IFllYXJOdW1iZXIgPSBkYXRlLmdldEZ1bGxZZWFyKCk7XG5cbiAgICByZXR1cm4gdGhpcy5fZGF0ZUFkYXB0ZXIuY3JlYXRlRGF0ZSh5ZWFyLCBtb250aEluZGV4LCBkYXkpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiZGJ4LWZpeGVkZGF0ZXJhbmdlLWZpZWxkXCI+XG4gIDxtYXQtY2FsZW5kYXIgI2NhbGVuZGFyVmlldyBbc2VsZWN0ZWRdPVwiY2FsZW5kYXJTZWxlY3Rpb24kIHwgYXN5bmNcIiBbZGF0ZUZpbHRlcl09XCIocGlja2VyRmlsdGVyJCB8IGFzeW5jKSB8fCBkZWZhdWx0UGlja2VyRmlsdGVyXCIgW21pbkRhdGVdPVwibWluJCB8IGFzeW5jXCIgW21heERhdGVdPVwibWF4JCB8IGFzeW5jXCIgKHNlbGVjdGVkQ2hhbmdlKT1cInNlbGVjdGVkQ2hhbmdlKCRldmVudClcIj48L21hdC1jYWxlbmRhcj5cbiAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZGJ4LWZpeGVkZGF0ZXJhbmdlLWZpZWxkLWlucHV0XCIgYXBwZWFyYW5jZT1cImZpbGxcIj5cbiAgICA8bWF0LWRhdGUtcmFuZ2UtaW5wdXQgKm5nSWY9XCJzaG93UmFuZ2VJbnB1dFwiIFtmb3JtR3JvdXBdPVwiaW5wdXRSYW5nZUZvcm1cIj5cbiAgICAgIDxpbnB1dCAjc3RhcnREYXRlSW5wdXQgbWF0U3RhcnREYXRlIGZvcm1Db250cm9sTmFtZT1cInN0YXJ0XCIgcGxhY2Vob2xkZXI9XCJTdGFydCBkYXRlXCIgLz5cbiAgICAgIDxpbnB1dCAjZW5kRGF0ZUlucHV0IFtuZ0NsYXNzXT1cIihlbmREaXNhYmxlZCQgfCBhc3luYykgPyAnZGJ4LWZpeGVkZGF0ZXJhbmdlLWZpZWxkLWlucHV0LWVuZCcgOiAnJ1wiIFthdHRyLnRhYmluZGV4XT1cIihlbmREaXNhYmxlZCQgfCBhc3luYykgPyAtMSA6IDBcIiBtYXRFbmREYXRlIGZvcm1Db250cm9sTmFtZT1cImVuZFwiIHBsYWNlaG9sZGVyPVwiRW5kIGRhdGVcIiAvPlxuICAgIDwvbWF0LWRhdGUtcmFuZ2UtaW5wdXQ+XG4gIDwvbWF0LWZvcm0tZmllbGQ+XG4gIDxtYXQtZXJyb3IgKm5nSWY9XCJmb3JtQ29udHJvbC5oYXNFcnJvcigncmVxdWlyZWQnKVwiPkRhdGUgcmFuZ2UgaXMgcmVxdWlyZWQ8L21hdC1lcnJvcj5cbjwvZGl2PlxuIl19
529
+ }] });
530
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZml4ZWRkYXRlcmFuZ2UuZmllbGQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvZGJ4LWZvcm0vc3JjL2xpYi9mb3JtbHkvZmllbGQvdmFsdWUvZGF0ZS9maXhlZGRhdGVyYW5nZS5maWVsZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9kYngtZm9ybS9zcmMvbGliL2Zvcm1seS9maWVsZC92YWx1ZS9kYXRlL2ZpeGVkZGF0ZXJhbmdlLmZpZWxkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBK0gsbUJBQW1CLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQy9MLE9BQU8sRUFBRSxvQkFBb0IsRUFBaUMscUJBQXFCLEVBQTZCLGtCQUFrQixFQUF3RCxTQUFTLEVBQUUsaUJBQWlCLEVBQUUseUJBQXlCLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBRSxxQkFBcUIsRUFBRSxzQ0FBc0MsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN4VyxPQUFPLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLG9CQUFvQixFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsZUFBZSxFQUFjLE9BQU8sRUFBRSxFQUFFLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN4TixPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQXFCLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3BILE9BQU8sRUFBbUIsV0FBVyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxTQUFTLEVB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QUFVLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUM3RCxDQUFDO3dHQXhEVSx1Q0FBdUM7NEdBQXZDLHVDQUF1Qzs7NEZBQXZDLHVDQUF1QztrQkFEbkQsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHR5cGUgTWF5YmUsIHR5cGUgRGVjaXNpb25GdW5jdGlvbiwgdHlwZSBNaWxsaXNlY29uZHMsIHR5cGUgVGltZXpvbmVTdHJpbmcsIHR5cGUgRGF0ZU1vbnRoLCB0eXBlIERheU9mTW9udGgsIHR5cGUgWWVhck51bWJlciwgaXNNb250aERheVNsYXNoRGF0ZSwgTVNfSU5fTUlOVVRFIH0gZnJvbSAnQGRlcmVla2IvdXRpbCc7XG5pbXBvcnQgeyBndWVzc0N1cnJlbnRUaW1lem9uZSwgRGF0ZVRpbWV6b25lVXRjTm9ybWFsSW5zdGFuY2UsIGRhdGVUaW1lem9uZVV0Y05vcm1hbCwgRGF0ZVJhbmdlSW5wdXQsIERhdGVSYW5nZSwgaXNTYW1lRGF0ZURheVJhbmdlLCBEYXRlUmFuZ2VXaXRoRGF0ZU9yU3RyaW5nVmFsdWUsIERhdGVUaW1lTWludXRlQ29uZmlnLCBkYXRlUmFuZ2UsIGlzRGF0ZUluRGF0ZVJhbmdlLCBjbGFtcERhdGVSYW5nZVRvRGF0ZVJhbmdlLCBpc1NhbWVEYXRlUmFuZ2UsIGlzU2FtZURhdGVEYXksIGxpbWl0RGF0ZVRpbWVJbnN0YW5jZSwgZGF0ZVRpbWVNaW51dGVXaG9sZURheURlY2lzaW9uRnVuY3Rpb24gfSBmcm9tICdAZGVyZWVrYi9kYXRlJztcbmltcG9ydCB7IHN3aXRjaE1hcCwgc2hhcmVSZXBsYXksIG1hcCwgc3RhcnRXaXRoLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgZGVib3VuY2VUaW1lLCB0aHJvdHRsZVRpbWUsIEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgU3ViamVjdCwgb2YsIGNvbWJpbmVMYXRlc3RXaXRoLCBmaWx0ZXIsIGNvbWJpbmVMYXRlc3QsIHNjYW4sIGZpcnN0LCB0aW1lciB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBJbmplY3RhYmxlLCBPbkRlc3Ryb3ksIE9uSW5pdCwgVmlld0NoaWxkLCBmb3J3YXJkUmVmLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEZpZWxkVHlwZSB9IGZyb20gJ0BuZ3gtZm9ybWx5L21hdGVyaWFsJztcbmltcG9ydCB7IEZpZWxkVHlwZUNvbmZpZywgRm9ybWx5RmllbGRQcm9wcyB9IGZyb20gJ0BuZ3gtZm9ybWx5L2NvcmUnO1xuaW1wb3J0IHsgTWF0RGF0ZVJhbmdlU2VsZWN0aW9uU3RyYXRlZ3ksIE1BVF9EQVRFX1JBTkdFX1NFTEVDVElPTl9TVFJBVEVHWSwgRGF0ZVJhbmdlIGFzIERhdGVQaWNrZXJEYXRlUmFuZ2UsIE1hdENhbGVuZGFyIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGF0ZXBpY2tlcic7XG5pbXBvcnQgeyBhc09ic2VydmFibGVGcm9tR2V0dGVyLCBmaWx0ZXJNYXliZSwgT2JzZXJ2YWJsZU9yVmFsdWVHZXR0ZXIsIHNraXBGaXJzdE1heWJlLCBTdWJzY3JpcHRpb25PYmplY3QsIHN3aXRjaE1hcE1heWJlRGVmYXVsdCB9IGZyb20gJ0BkZXJlZWtiL3J4anMnO1xuaW1wb3J0IHsgRGJ4RGF0ZVRpbWVWYWx1ZU1vZGUsIGRieERhdGVSYW5nZUlzU2FtZURhdGVSYW5nZUZpZWxkVmFsdWUsIGRieERhdGVUaW1lSW5wdXRWYWx1ZVBhcnNlRmFjdG9yeSwgZGJ4RGF0ZVRpbWVPdXRwdXRWYWx1ZUZhY3RvcnkgfSBmcm9tICcuL2RhdGUudmFsdWUnO1xuaW1wb3J0IHsgRGF0ZVRpbWVQcmVzZXRDb25maWd1cmF0aW9uIH0gZnJvbSAnLi9kYXRldGltZSc7XG5pbXBvcnQgeyBEYnhEYXRlVGltZUZpZWxkTWVudVByZXNldHNTZXJ2aWNlIH0gZnJvbSAnLi9kYXRldGltZS5maWVsZC5zZXJ2aWNlJztcbmltcG9ydCB7IERhdGVBZGFwdGVyIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY29yZSc7XG5pbXBvcnQgeyBpc0JlZm9yZSB9IGZyb20gJ2RhdGUtZm5zJztcblxuZXhwb3J0IHR5cGUgRGJ4Rml4ZWREYXRlUmFuZ2VEYXRlUmFuZ2VJbnB1dCA9IE9taXQ8RGF0ZVJhbmdlSW5wdXQsICdkYXRlJz47XG5cbmV4cG9ydCB0eXBlIERieEZpeGVkRGF0ZVJhbmdlUGlja2VyQ29uZmlndXJhdGlvbiA9IE9taXQ8RGF0ZVRpbWVNaW51dGVDb25maWcsICdkYXRlJz47XG5cbmV4cG9ydCB0eXBlIERieEZpeGVkRGF0ZVJhbmdlU2VsZWN0aW9uTW9kZSA9ICdzaW5nbGUnIHwgJ25vcm1hbCcgfCAnYXJiaXRyYXJ5JyB8ICdhcmJpdHJhcnlfcXVpY2snO1xuZXhwb3J0IHR5cGUgRGJ4Rml4ZWREYXRlUmFuZ2VQaWNraW5nID0gJ3N0YXJ0JyB8ICdlbmQnO1xuXG5leHBvcnQgaW50ZXJmYWNlIERieEZpeGVkRGF0ZVJhbmdlRmllbGRQcm9wcyBleHRlbmRzIEZvcm1seUZpZWxkUHJvcHMge1xuICAvKipcbiAgICogRGF0ZSByYW5nZSBpbnB1dCB0byBidWlsZCB0aGUgZGF0ZSByYW5nZS5cbiAgICovXG4gIGRhdGVSYW5nZUlucHV0OiBPYnNlcnZhYmxlT3JWYWx1ZUdldHRlcjxEYnhGaXhlZERhdGVSYW5nZURhdGVSYW5nZUlucHV0PjtcblxuICAvKipcbiAgICogU2VsZWN0aW9uIG1vZGUgdG8gdXNlIHdoZW4gcGlja2luZyBkYXRlcyBvbiB0aGUgY2FsZW5kYXIuXG4gICAqL1xuICBzZWxlY3Rpb25Nb2RlPzogTWF5YmU8T2JzZXJ2YWJsZU9yVmFsdWVHZXR0ZXI8RGJ4Rml4ZWREYXRlUmFuZ2VTZWxlY3Rpb25Nb2RlPj47XG5cbiAgLyoqXG4gICAqIFZhbHVlIG1vZGUgZm9yIHRoZSBkYXRlcyBpbiB0aGUgb3V0cHV0IERhdGVSYW5nZS5cbiAgICpcbiAgICogRGVmYXVsdHMgdG8gREFURVxuICAgKi9cbiAgdmFsdWVNb2RlPzogRGJ4RGF0ZVRpbWVWYWx1ZU1vZGU7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgb3Igbm90IHRvIHBhc3MgdGhlIGRhdGUgdmFsdWUgYXMgYSBVVEMgZGF0ZSwgb3IgYSBkYXRlIGluIHRoZSBjdXJyZW50IHRpbWV6b25lLlxuICAgKi9cbiAgZnVsbERheUluVVRDPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQ3VzdG9tIHBpY2tlciBjb25maWd1cmF0aW9uXG4gICAqL1xuICBwaWNrZXJDb25maWc/OiBPYnNlcnZhYmxlT3JWYWx1ZUdldHRlcjxEYnhGaXhlZERhdGVSYW5nZVBpY2tlckNvbmZpZ3VyYXRpb24+O1xuXG4gIC8qKlxuICAgKiAoT3B0aW9uYWwpIFRoZSBpbnB1dCB0aW1lem9uZSB0byBkZWZhdWx0IHRvLlxuICAgKlxuICAgKiBJZ25vcmVkIGlmIGZ1bGxEYXlJblVUQyBpcyB0cnVlLlxuICAgKi9cbiAgdGltZXpvbmU/OiBNYXliZTxPYnNlcnZhYmxlT3JWYWx1ZUdldHRlcjxNYXliZTxUaW1lem9uZVN0cmluZz4+PjtcblxuICAvKipcbiAgICogV2hldGhlciBvciBub3QgdG8gZGlzcGxheSB0aGUgdGltZXpvbmUuIFRydWUgYnkgZGVmYXVsdC5cbiAgICovXG4gIHNob3dUaW1lem9uZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEN1c3RvbSBwcmVzZXRzIHRvIHNob3cgaW4gdGhlIGRyb3Bkb3duLlxuICAgKi9cbiAgcHJlc2V0cz86IE9ic2VydmFibGVPclZhbHVlR2V0dGVyPERhdGVUaW1lUHJlc2V0Q29uZmlndXJhdGlvbltdPjtcblxuICAvKipcbiAgICogV2hldGhlciBvciBub3QgdG8gc2hvdyB0aGUgcmFuZ2UgaW5wdXQuIERlZmF1bHRzIHRvIHRydWUuXG4gICAqL1xuICBzaG93UmFuZ2VJbnB1dD86IGJvb2xlYW47XG59XG5cbmZ1bmN0aW9uIGRieEZpeGVkRGF0ZVJhbmdlSW5wdXRWYWx1ZUZhY3RvcnkobW9kZTogRGJ4RGF0ZVRpbWVWYWx1ZU1vZGUsIHRpbWV6b25lSW5zdGFuY2U6IE1heWJlPERhdGVUaW1lem9uZVV0Y05vcm1hbEluc3RhbmNlPik6IChpbnB1dDogTWF5YmU8RGF0ZVJhbmdlV2l0aERhdGVPclN0cmluZ1ZhbHVlPikgPT4gTWF5YmU8RGF0ZVJhbmdlPiB7XG4gIGNvbnN0IGRhdGVJbnB1dFRyYW5zZm9ybWVyID0gZGJ4RGF0ZVRpbWVJbnB1dFZhbHVlUGFyc2VGYWN0b3J5KG1vZGUsIHRpbWV6b25lSW5zdGFuY2UpO1xuXG4gIHJldHVybiAoeSkgPT4ge1xuICAgIGxldCByZXN1bHQ6IE1heWJlPERhdGVSYW5nZT47XG5cbiAgICBpZiAoeSkge1xuICAgICAgcmVzdWx0ID0ge1xuICAgICAgICBzdGFydDogZGF0ZUlucHV0VHJhbnNmb3JtZXIoeS5zdGFydCkgYXMgRGF0ZSxcbiAgICAgICAgZW5kOiBkYXRlSW5wdXRUcmFuc2Zvcm1lcih5LmVuZCkgYXMgRGF0ZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xufVxuXG5mdW5jdGlvbiBkYnhGaXhlZERhdGVSYW5nZU91dHB1dFZhbHVlRmFjdG9yeShtb2RlOiBEYnhEYXRlVGltZVZhbHVlTW9kZSwgdGltZXpvbmVJbnN0YW5jZTogTWF5YmU8RGF0ZVRpbWV6b25lVXRjTm9ybWFsSW5zdGFuY2U+KTogKGRhdGU6IE1heWJlPERhdGVSYW5nZT4pID0+IE1heWJlPERhdGVSYW5nZVdpdGhEYXRlT3JTdHJpbmdWYWx1ZT4ge1xuICBjb25zdCBkYXRlT3V0cHV0VHJhbnNmb3JtZXIgPSBkYnhEYXRlVGltZU91dHB1dFZhbHVlRmFjdG9yeShtb2RlLCB0aW1lem9uZUluc3RhbmNlKTtcblxuICByZXR1cm4gKHkpID0+IHtcbiAgICBsZXQgcmVzdWx0OiBNYXliZTxEYXRlUmFuZ2U+O1xuXG4gICAgaWYgKHkpIHtcbiAgICAgIHJlc3VsdCA9IHtcbiAgICAgICAgc3RhcnQ6IGRhdGVPdXRwdXRUcmFuc2Zvcm1lcih5LnN0YXJ0KSBhcyBEYXRlLFxuICAgICAgICBlbmQ6IGRhdGVPdXRwdXRUcmFuc2Zvcm1lcih5LmVuZCkgYXMgRGF0ZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xufVxuXG5jb25zdCBUSU1FX09VVFBVVF9USFJPVFRMRV9USU1FOiBNaWxsaXNlY29uZHMgPSAxMDtcblxuZXhwb3J0IHR5cGUgRml4ZWREYXRlUmFuZ2VTY2FuVHlwZSA9ICdzdGFydCcgfCAnZW5kJyB8ICdzdGFydFJlcGVhdCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRml4ZWREYXRlUmFuZ2VTY2FuIHtcbiAgLyoqXG4gICAqIFBpY2tlZCB0aGUgc3RhcnQgb3IgZW5kIG9mIHRoZSByYW5nZSBvbiB0aGUgbGFzdCBwaWNrLlxuICAgKi9cbiAgbGFzdFBpY2tUeXBlPzogTWF5YmU8Rml4ZWREYXRlUmFuZ2VTY2FuVHlwZT47XG4gIC8qKlxuICAgKiBUaGUgbGF0ZXN0IGRhdGUgcGFzc2VkLCBpZiBhcHBsaWNhYmxlLlxuICAgKi9cbiAgbGFzdERhdGVSYW5nZT86IE1heWJlPFBhcnRpYWw8RGF0ZVJhbmdlPj47XG4gIC8qKlxuICAgKiBUaGUgZ2VuZXJhdGVkIGJvdW5kYXJ5IHJhbmdlLlxuICAgKi9cbiAgYm91bmRhcnk/OiBEYXRlUmFuZ2U7XG4gIC8qKlxuICAgKiBOZXcgRGF0ZSBSYW5nZVxuICAgKi9cbiAgcmFuZ2U/OiBEYXRlUmFuZ2U7XG59XG5cbnR5cGUgU2VsZWN0ZWREYXRlRXZlbnRUeXBlID0gJ2NhbGVuZGFyJyB8ICdpbnB1dCc7XG5cbmludGVyZmFjZSBTZWxlY3RlZERhdGVFdmVudCB7XG4gIHR5cGU6IFNlbGVjdGVkRGF0ZUV2ZW50VHlwZTtcbiAgcmFuZ2U/OiBNYXliZTxQYXJ0aWFsPERhdGVSYW5nZT4+O1xufVxuXG5AQ29tcG9uZW50KHtcbiAgdGVtcGxhdGVVcmw6ICdmaXhlZGRhdGVyYW5nZS5maWVsZC5jb21wb25lbnQuaHRtbCcsXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE1BVF9EQVRFX1JBTkdFX1NFTEVDVElPTl9TVFJBVEVHWSxcbiAgICAgIHVzZUNsYXNzOiBmb3J3YXJkUmVmKCgpID0+IERieEZpeGVkRGF0ZVJhbmdlRmllbGRTZWxlY3Rpb25TdHJhdGVneSlcbiAgICB9XG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgRGJ4Rml4ZWREYXRlUmFuZ2VGaWVsZENvbXBvbmVudCBleHRlbmRzIEZpZWxkVHlwZTxGaWVsZFR5cGVDb25maWc8RGJ4Rml4ZWREYXRlUmFuZ2VGaWVsZFByb3BzPj4gaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGJ4RGF0ZVRpbWVGaWVsZE1lbnVQcmVzZXRzU2VydmljZSA9IGluamVjdChEYnhEYXRlVGltZUZpZWxkTWVudVByZXNldHNTZXJ2aWNlKTtcblxuICBwcml2YXRlIF9zdWIgPSBuZXcgU3Vic2NyaXB0aW9uT2JqZWN0KCk7XG5cbiAgcHJpdmF0ZSBfaW5wdXRSYW5nZUZvcm1TdWIgPSBuZXcgU3Vic2NyaXB0aW9uT2JqZWN0KCk7XG4gIHByaXZhdGUgX2lucHV0UmFuZ2VGb3JtVmFsdWVTdWIgPSBuZXcgU3Vic2NyaXB0aW9uT2JqZWN0KCk7XG5cbiAgcHJpdmF0ZSBfZGF0ZVJhbmdlSW5wdXRTdWIgPSBuZXcgU3Vic2NyaXB0aW9uT2JqZWN0KCk7XG4gIHByaXZhdGUgX2N1cnJlbnRTZWxlY3Rpb25Nb2RlU3ViID0gbmV3IFN1YnNjcmlwdGlvbk9iamVjdCgpO1xuICBwcml2YXRlIF9sYXRlc3RCb3VuZGFyeVN1YiA9IG5ldyBTdWJzY3JpcHRpb25PYmplY3QoKTtcbiAgcHJpdmF0ZSBfZGlzYWJsZUVuZFN1YiA9IG5ldyBTdWJzY3JpcHRpb25PYmplY3QoKTtcbiAgcHJpdmF0ZSBfYWN0aXZlRGF0ZVN1YiA9IG5ldyBTdWJzY3JpcHRpb25PYmplY3QoKTtcblxuICBwcml2YXRlIF9jdXJyZW50RGF0ZVJhbmdlSW5wdXQ6IE1heWJlPERieEZpeGVkRGF0ZVJhbmdlRGF0ZVJhbmdlSW5wdXQ+ID0ge307XG4gIHByaXZhdGUgX2N1cnJlbnRTZWxlY3Rpb25Nb2RlOiBEYnhGaXhlZERhdGVSYW5nZVNlbGVjdGlvbk1vZGUgPSAnc2luZ2xlJztcbiAgcHJpdmF0ZSBfbGF0ZXN0Qm91bmRhcnk6IE1heWJlPERhdGVSYW5nZT4gPSBudWxsO1xuXG4gIHByaXZhdGUgX2NvbmZpZyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8TWF5YmU8T2JzZXJ2YWJsZTxEYnhGaXhlZERhdGVSYW5nZVBpY2tlckNvbmZpZ3VyYXRpb24+Pj4odW5kZWZpbmVkKTtcbiAgcHJpdmF0ZSBfc2VsZWN0aW9uTW9kZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8TWF5YmU8T2JzZXJ2YWJsZTxEYnhGaXhlZERhdGVSYW5nZVNlbGVjdGlvbk1vZGU+Pj4odW5kZWZpbmVkKTtcbiAgcHJpdmF0ZSBfZGF0ZVJhbmdlSW5wdXQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PE1heWJlPE9ic2VydmFibGU8RGJ4Rml4ZWREYXRlUmFuZ2VEYXRlUmFuZ2VJbnB1dD4+Pih1bmRlZmluZWQpO1xuXG4gIHByaXZhdGUgX3RpbWV6b25lID0gbmV3IEJlaGF2aW9yU3ViamVjdDxNYXliZTxPYnNlcnZhYmxlPE1heWJlPFRpbWV6b25lU3RyaW5nPj4+Pih1bmRlZmluZWQpO1xuICBwcml2YXRlIF9wcmVzZXRzID0gbmV3IEJlaGF2aW9yU3ViamVjdDxPYnNlcnZhYmxlPERhdGVUaW1lUHJlc2V0Q29uZmlndXJhdGlvbltdPj4ob2YoW10pKTtcblxuICBwcml2YXRlIF9zZWxlY3Rpb25FdmVudCA9IG5ldyBTdWJqZWN0PFNlbGVjdGVkRGF0ZUV2ZW50PigpO1xuICByZWFkb25seSBzZWxlY3RlZERhdGVSYW5nZSQ6IE9ic2VydmFibGU8TWF5YmU8UGFydGlhbDxEYXRlUmFuZ2U+Pj4gPSB0aGlzLl9zZWxlY3Rpb25FdmVudC5waXBlKG1hcCgoeCkgPT4geC5yYW5nZSkpO1xuXG4gIHByaXZhdGUgX2Zvcm1Db250cm9sT2JzID0gbmV3IEJlaGF2aW9yU3ViamVjdDxNYXliZTxBYnN0cmFjdENvbnRyb2w8TWF5YmU8RGF0ZVJhbmdlPj4+Pih1bmRlZmluZWQpO1xuICByZWFkb25seSBmb3JtQ29udHJvbCQgPSB0aGlzLl9mb3JtQ29udHJvbE9icy5waXBlKGZpbHRlck1heWJlKCkpO1xuXG4gIEBWaWV3Q2hpbGQoTWF0Q2FsZW5kYXIpXG4gIGNhbGVuZGFyITogTWF0Q2FsZW5kYXI8RGF0ZT47XG5cbiAgQFZpZXdDaGlsZCgnc3RhcnREYXRlSW5wdXQnLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSlcbiAgc3RhcnREYXRlSW5wdXRFbGVtZW50ITogRWxlbWVudFJlZjtcblxuICBAVmlld0NoaWxkKCdlbmREYXRlSW5wdXQnLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSlcbiAgZW5kRGF0ZUlucHV0RWxlbWVudCE6IEVsZW1lbnRSZWY7XG5cbiAgZ2V0IGN1cnJlbnREYXRlUmFuZ2VJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fY3VycmVudERhdGVSYW5nZUlucHV0O1xuICB9XG5cbiAgZ2V0IGN1cnJlbnRTZWxlY3Rpb25Nb2RlKCkge1xuICAgIHJldHVybiB0aGlzLl9jdXJyZW50U2VsZWN0aW9uTW9kZTtcbiAgfVxuXG4gIGdldCBsYXRlc3RCb3VuZGFyeSgpIHtcbiAgICByZXR1cm4gdGhpcy5fbGF0ZXN0Qm91bmRhcnk7XG4gIH1cblxuICByZWFkb25seSBjb25maWckOiBPYnNlcnZhYmxlPERieEZpeGVkRGF0ZVJhbmdlUGlja2VyQ29uZmlndXJhdGlvbj4gPSB0aGlzLl9jb25maWcucGlwZShcbiAgICBmaWx0ZXJNYXliZSgpLFxuICAgIHN3aXRjaE1hcCgoeCkgPT4geCksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IGxpbWl0RGF0ZVRpbWVJbnN0YW5jZSQgPSB0aGlzLmNvbmZpZyQucGlwZShtYXAobGltaXREYXRlVGltZUluc3RhbmNlKSwgc2hhcmVSZXBsYXkoMSkpO1xuXG4gIHJlYWRvbmx5IHNlbGVjdGlvbk1vZGUkOiBPYnNlcnZhYmxlPERieEZpeGVkRGF0ZVJhbmdlU2VsZWN0aW9uTW9kZT4gPSB0aGlzLl9zZWxlY3Rpb25Nb2RlLnBpcGUoXG4gICAgc3dpdGNoTWFwTWF5YmVEZWZhdWx0PERieEZpeGVkRGF0ZVJhbmdlU2VsZWN0aW9uTW9kZT4oJ3NpbmdsZScpLFxuICAgIG1hcCgoeCkgPT4geCA/PyAnc2luZ2xlJyksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IGRhdGVSYW5nZUlucHV0JCA9IHRoaXMuX2RhdGVSYW5nZUlucHV0LnBpcGUoc3dpdGNoTWFwTWF5YmVEZWZhdWx0KCksIHNoYXJlUmVwbGF5KDEpKTtcblxuICByZWFkb25seSB0aW1lem9uZSQ6IE9ic2VydmFibGU8TWF5YmU8VGltZXpvbmVTdHJpbmc+PiA9IHRoaXMuX3RpbWV6b25lLnBpcGUoc3dpdGNoTWFwTWF5YmVEZWZhdWx0KCksIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpLnBpcGUoXG4gICAgbWFwKChkZWZhdWx0VGltZXpvbmUpID0+IHtcbiAgICAgIHJldHVybiBkZWZhdWx0VGltZXpvbmUgPz8gZ3Vlc3NDdXJyZW50VGltZXpvbmUoKTtcbiAgICB9KSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgdGltZXpvbmVJbnN0YW5jZSQ6IE9ic2VydmFibGU8TWF5YmU8RGF0ZVRpbWV6b25lVXRjTm9ybWFsSW5zdGFuY2U+PiA9IHRoaXMudGltZXpvbmUkLnBpcGUoXG4gICAgbWFwKCh0aW1lem9uZSkgPT4gKHRpbWV6b25lID8gZGF0ZVRpbWV6b25lVXRjTm9ybWFsKHsgdGltZXpvbmUgfSkgOiB1bmRlZmluZWQpKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IHZhbHVlSW5TeXN0ZW1UaW1lem9uZSQ6IE9ic2VydmFibGU8TWF5YmU8RGF0ZVJhbmdlPj4gPSB0aGlzLmZvcm1Db250cm9sJC5waXBlKFxuICAgIG1hcCgoY29udHJvbCkgPT4gY29udHJvbC52YWx1ZUNoYW5nZXMucGlwZShzdGFydFdpdGg8TWF5YmU8RGF0ZVJhbmdlV2l0aERhdGVPclN0cmluZ1ZhbHVlPj4oY29udHJvbC52YWx1ZSksIHNoYXJlUmVwbGF5KDEpKSksXG4gICAgY29tYmluZUxhdGVzdFdpdGgodGhpcy50aW1lem9uZUluc3RhbmNlJCksXG4gICAgc3dpdGNoTWFwKChbeCwgdGltZXpvbmVJbnN0YW5jZV0pID0+IHtcbiAgICAgIHJldHVybiB4LnBpcGUobWFwKGRieEZpeGVkRGF0ZVJhbmdlSW5wdXRWYWx1ZUZhY3RvcnkodGhpcy52YWx1ZU1vZGUsIHRpbWV6b25lSW5zdGFuY2UpKSk7XG4gICAgfSksXG4gICAgdGhyb3R0bGVUaW1lKDIwLCB1bmRlZmluZWQsIHsgbGVhZGluZzogZmFsc2UsIHRyYWlsaW5nOiB0cnVlIH0pLCAvLyB0aHJvdHRsZSBpbmNvbWluZyB2YWx1ZXMgYW5kIHRpbWV6b25lIGNoYW5nZXNcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZDxNYXliZTxEYXRlUmFuZ2U+Pihpc1NhbWVEYXRlRGF5UmFuZ2UpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgZGF0ZVJhbmdlU2VsZWN0aW9uRm9yTW9kZShtb2RlOiBEYnhGaXhlZERhdGVSYW5nZVNlbGVjdGlvbk1vZGUpIHtcbiAgICBjb25zdCByZXN1bHQ6IE9ic2VydmFibGU8TWF5YmU8RGF0ZVJhbmdlPj4gPSBjb21iaW5lTGF0ZXN0KFt0aGlzLmRhdGVSYW5nZUlucHV0JCwgdGhpcy5saW1pdERhdGVUaW1lSW5zdGFuY2UkXSkucGlwZShcbiAgICAgIHN3aXRjaE1hcCgoW2RhdGVSYW5nZUlucHV0LCBsaW1pdEluc3RhbmNlXSkgPT4ge1xuICAgICAgICBjb25zdCBoYXNEYXRlUmFuZ2VDb25maWd1cmF0aW9uID0gQm9vbGVhbihkYXRlUmFuZ2VJbnB1dCk7XG4gICAgICAgIGNvbnN0IG1pbk1heENsYW1wID0gKGRhdGVSYW5nZTogRGF0ZVJhbmdlKSA9PiBsaW1pdEluc3RhbmNlLmNsYW1wRGF0ZVJhbmdlKGRhdGVSYW5nZSk7XG5cbiAgICAgICAgaWYgKG1vZGUgPT09ICdzaW5nbGUnKSB7XG4gICAgICAgICAgLy8gb25seSB1c2UgdGhlIHN0YXJ0IGRhdGUuXG4gICAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWREYXRlUmFuZ2UkLnBpcGUoXG4gICAgICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZChpc1NhbWVEYXRlRGF5UmFuZ2UpLFxuICAgICAgICAgICAgbWFwKChpbnB1dERhdGVSYW5nZSkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBkYXRlID0gaW5wdXREYXRlUmFuZ2U/LnN0YXJ0O1xuICAgICAgICAgICAgICByZXR1cm4gZGF0ZSA/IChtaW5NYXhDbGFtcChkYXRlUmFuZ2UoeyAuLi5kYXRlUmFuZ2VJbnB1dCwgZGF0ZSB9IGFzIERhdGVSYW5nZUlucHV0KSkgYXMgRGF0ZVJhbmdlKSA6IG51bGw7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gdGFrZSB0aGUgZmlyc3QgZGF0ZSwgdGhlbiB3YWl0IHVubGVzcyB0aGUgZGF0ZSBpcyBvdXRzaWRlIG9mIHRoZSByYW5nZS5cbiAgICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RlZERhdGVSYW5nZSQucGlwZShcbiAgICAgICAgICAgIHNjYW4oKGFjYzogRml4ZWREYXRlUmFuZ2VTY2FuLCBuZXh0RGF0ZVJhbmdlOiBNYXliZTxQYXJ0aWFsPERhdGVSYW5nZT4+KSA9PiB7XG4gICAgICAgICAgICAgIGxldCByZXN1bHQ6IEZpeGVkRGF0ZVJhbmdlU2NhbjtcbiAgICAgICAgICAgICAgbGV0IHBpY2tUeXBlOiBNYXliZTxGaXhlZERhdGVSYW5nZVNjYW5UeXBlPiA9ICdzdGFydCc7XG5cbiAgICAgICAgICAgICAgaWYgKG5leHREYXRlUmFuZ2UgJiYgbmV4dERhdGVSYW5nZS5zdGFydCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBzdGFydDogc3RhcnRPck5leHREYXRlLCBlbmQgfSA9IG5leHREYXRlUmFuZ2U7XG4gICAgICAgICAgICAgICAgY29uc3QgcG90ZW50aWFsQm91bmRhcnkgPSBkYXRlUmFuZ2UoeyAuLi5kYXRlUmFuZ2VJbnB1dCwgZGF0ZTogc3RhcnRPck5leHREYXRlIH0gYXMgRGF0ZVJhbmdlSW5wdXQpO1xuXG4gICAgICAgICAgICAgICAgLy8gb25seSBjb21lcyB0aHJvdWdoIHdoZW4gcGFzc2VkIGJ5IHRoZSB0ZXh0IGlucHV0c1xuICAgICAgICAgICAgICAgIGlmIChzdGFydE9yTmV4dERhdGUgJiYgZW5kKSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCByYW5nZSA9IGNsYW1wRGF0ZVJhbmdlVG9EYXRlUmFuZ2UobmV4dERhdGVSYW5nZSwgcG90ZW50aWFsQm91bmRhcnkpIGFzIERhdGVSYW5nZTtcbiAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHtcbiAgICAgICAgICAgICAgICAgICAgbGFzdERhdGVSYW5nZTogbmV4dERhdGVSYW5nZSxcbiAgICAgICAgICAgICAgICAgICAgYm91bmRhcnk6IHJhbmdlLFxuICAgICAgICAgICAgICAgICAgICByYW5nZVxuICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgLy8gZm9yIG5vcm1hbCBtb2RlIHdlIHdhbnQgdG8gcHJvdGVjdCBhZ2FpbnN0IFwic3RhcnRcIiBiZWluZyBpbnB1dCwgdGhlbiB0aGUgb3V0cHV0IGJlaW5nIHBhc3NlZCxcbiAgICAgICAgICAgICAgICAgIC8vIGFuZCB0aGVuIHRoZSBuZXh0IGNsaWNrIGJlaW5nIHRyZWF0ZWQgYXMgYW5vdGhlciBcInN0YXJ0XCIgaW5zdGVhZCBvZiBhbiBcImVuZFwiLlxuICAgICAgICAgICAgICAgICAgaWYgKG1vZGUgPT09ICdub3JtYWwnICYmIGFjYy5sYXN0UGlja1R5cGUgPT09ICdzdGFydCcgJiYgaXNTYW1lRGF0ZURheShzdGFydE9yTmV4dERhdGUsIGVuZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzU2FtZURhdGVEYXkoc3RhcnRPck5leHREYXRlLCBhY2MubGFzdERhdGVSYW5nZT8uc3RhcnQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgcGlja1R5cGUgPSAnc3RhcnRSZXBlYXQnO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIGxldCByYW5nZTogTWF5YmU8RGF0ZVJhbmdlPiA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgIGxldCBib3VuZGFyeTogTWF5YmU8RGF0ZVJhbmdlPiA9IHBvdGVudGlhbEJvdW5kYXJ5O1xuXG4gICAgICAgICAgICAgICAgICBpZiAobW9kZSA9PT0gJ25vcm1hbCcpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFoYXNEYXRlUmFuZ2VDb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlcmUgaXMgbm8gY29uZmlndXJlZCByYW5nZS9ib3VuZGFyeSwgdGhlbiBqdXN0IHNldCB0aGUgcGljayB0eXBlIGJhc2VkIG9uIHRoZSBsYXN0IHR5cGVcbiAgICAgICAgICAgICAgICAgICAgICBib3VuZGFyeSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICBwaWNrVHlwZSA9IGFjYy5sYXN0UGlja1R5cGUgPT09ICdzdGFydCcgPyAnZW5kJyA6ICdzdGFydCc7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYWNjLmxhc3RQaWNrVHlwZSA9PT0gJ3N0YXJ0UmVwZWF0Jykge1xuICAgICAgICAgICAgICAgICAgICAgIHBpY2tUeXBlID0gJ2VuZCc7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIHBpY2sgaXMgb3V0c2lkZSB0aGUgYm91bmRhcnksIHRoZW4gY29uc2lkZXIgaXQgYSBzdGFydCBwaWNrIHR5cGUuXG4gICAgICAgICAgICAgICAgICAgICAgcGlja1R5cGUgPSBhY2MubGFzdFBpY2tUeXBlID09PSAnc3RhcnQnICYmIGFjYy5ib3VuZGFyeSAmJiBpc0RhdGVJbkRhdGVSYW5nZShzdGFydE9yTmV4dERhdGUsIGFjYy5ib3VuZGFyeSkgPyAnZW5kJyA6ICdzdGFydCc7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyByZWFjdCBiYXNlZCBvbiBob3cgdGhpc1xuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHBpY2tUeXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgY2FzZSAnZW5kJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhc3RTdGFydCA9IGFjYy5sYXN0RGF0ZVJhbmdlPy5zdGFydCBhcyBEYXRlO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgYm91bmRhcnlUb0NoZWNrOiBEYXRlUmFuZ2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3Rpb25Jc0JlZm9yZVByZXZpb3VzU2VsZWN0aW9uID0gIWxhc3RTdGFydCB8fCBpc0JlZm9yZShzdGFydE9yTmV4dERhdGUsIGxhc3RTdGFydCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBuZXh0U3RhcnQ6IERhdGU7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbmV4dEVuZDogRGF0ZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGlvbklzQmVmb3JlUHJldmlvdXNTZWxlY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dFN0YXJ0ID0gc3RhcnRPck5leHREYXRlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0RW5kID0gbGFzdFN0YXJ0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICBib3VuZGFyeVRvQ2hlY2sgPSBwb3RlbnRpYWxCb3VuZGFyeTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRTdGFydCA9IGxhc3RTdGFydDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEVuZCA9IHN0YXJ0T3JOZXh0RGF0ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYm91bmRhcnlUb0NoZWNrID0gZGF0ZVJhbmdlKHsgLi4uZGF0ZVJhbmdlSW5wdXQsIGRhdGU6IG5leHRTdGFydCB9IGFzIERhdGVSYW5nZUlucHV0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVjYWxjdWxhdGUgdGhlIGJvdW5kYXJ5IHVzaW5nIHRoZSBuZXh0IHN0YXJ0IGRhdGUuIElmIGl0IGlzIG91dHNpZGUgdGhlIHNlbGVjdGFibGUgcmFuZ2UsIHRoZW4gaXQgYmVjb21lcyBhIFwic3RhcnRcIiBwaWNrIHR5cGUuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNCZWZvcmUoYm91bmRhcnlUb0NoZWNrLmVuZCwgbmV4dEVuZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogQWxsb3cgY2hhbmdpbmcgdGhlIGJlaGF2aW9yIHRvIGZpbGwgdGhlIGVudGlyZSByYW5nZSBpbnN0ZWFkIG9mIGp1c3QgcmVzZXR0aW5nIGl0IGVudGlyZWx5XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dFN0YXJ0ID0gc3RhcnRPck5leHREYXRlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0RW5kID0gc3RhcnRPck5leHREYXRlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBwaWNrVHlwZSA9ICdzdGFydCc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGJvdW5kYXJ5ID0gYm91bmRhcnlUb0NoZWNrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYm91bmRhcnkgPSByYW5nZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UncmUgcGlja2luZyB0aGUgZW5kIHRoZW4gc2V0IHRoZSByYW5nZS5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydDogbmV4dFN0YXJ0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQ6IG5leHRFbmRcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICBjYXNlICdzdGFydCc6XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZXRhaW4gdGhlIGJvdW5kYXJ5IGFzIHBvdGVudGlhbCBib3VuZGFyeSwgYW5kIHNldCBvdXIgbmV3IHJhbmdlIGZyb20gdGhlIHNpbmdsZSBkYXRlLlxuICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0OiBzdGFydE9yTmV4dERhdGUgYXMgRGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kOiBzdGFydE9yTmV4dERhdGUgYXMgRGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFjYy5ib3VuZGFyeSAmJiBpc0RhdGVJbkRhdGVSYW5nZShzdGFydE9yTmV4dERhdGUsIGFjYy5ib3VuZGFyeSkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgaW4gdGhlIGRhdGUgcmFuZ2UsIHVzZXMgdGhlIHBpY2sgYXMgdGhlIGxhc3QgZGF0ZS5cbiAgICAgICAgICAgICAgICAgICAgcmFuZ2UgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgc3RhcnQ6IGFjYy5ib3VuZGFyeS5zdGFydCxcbiAgICAgICAgICAgICAgICAgICAgICBlbmQ6IHN0YXJ0T3JOZXh0RGF0ZVxuICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChtb2RlID09PSAnYXJiaXRyYXJ5X3F1aWNrJykge1xuICAgICAgICAgICAgICAgICAgICAgIC8vIG1vZGlmeSBib3VuZGFyeSB0byBtYXRjaCByYW5nZVxuICAgICAgICAgICAgICAgICAgICAgIGlmIChpc1NhbWVEYXRlUmFuZ2UoYWNjLnJhbmdlLCByYW5nZSkgJiYgaXNTYW1lRGF0ZURheShyYW5nZS5lbmQsIHN0YXJ0T3JOZXh0RGF0ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlIGNsaWNrZWQgb24gdGhlIGVuZCByYW5nZSwgdGhlbiBleHBhbmQgdGhlIGJvdW5kYXJ5IGFnYWluIHRvIHRoZSBmdWxsIHJhbmdlLlxuICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UgPSBkYXRlUmFuZ2UoeyAuLi5kYXRlUmFuZ2VJbnB1dCwgZGF0ZTogcmFuZ2Uuc3RhcnQgfSBhcyBEYXRlUmFuZ2VJbnB1dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBib3VuZGFyeSA9IHJhbmdlO1xuICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBib3VuZGFyeSA9IHJhbmdlO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAvLyByZXRhaW4gc2FtZSBib3VuZGFyeVxuICAgICAgICAgICAgICAgICAgICAgIGJvdW5kYXJ5ID0gYWNjLmJvdW5kYXJ5O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1vZGUgPT09ICdhcmJpdHJhcnlfcXVpY2snKSB7XG4gICAgICAgICAgICAgICAgICAgIHJhbmdlID0gcG90ZW50aWFsQm91bmRhcnk7XG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHtcbiAgICAgICAgICAgICAgICAgICAgbGFzdERhdGVSYW5nZTogbmV4dERhdGVSYW5nZSxcbiAgICAgICAgICAgICAgICAgICAgYm91bmRhcnksXG4gICAgICAgICAgICAgICAgICAgIHJhbmdlXG4gICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB7XG4gICAgICAgICAgICAgICAgICBsYXN0RGF0ZVJhbmdlOiBuZXh0RGF0ZVJhbmdlXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB7XG4gICAgICAgICAgICAgICAgICBsYXN0UGlja1R5cGU6IHBpY2tUeXBlLFxuICAgICAgICAgICAgICAgICAgbGFzdERhdGVSYW5nZTogcmVzdWx0Lmxhc3REYXRlUmFuZ2UsXG4gICAgICAgICAgICAgICAgICBib3VuZGFyeTogcmVzdWx0LmJvdW5kYXJ5ID8gKG1pbk1heENsYW1wKHJlc3VsdC5ib3VuZGFyeSkgYXMgRGF0ZVJhbmdlKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgIHJhbmdlOiByZXN1bHQucmFuZ2UgPyAobWluTWF4Q2xhbXAocmVzdWx0LnJhbmdlKSBhcyBEYXRlUmFuZ2UpIDogdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9LCB7fSksXG4gICAgICAgICAgICBmaWx0ZXIoKHgpID0+ICF4Lmxhc3REYXRlUmFuZ2UgfHwgeC5yYW5nZSAhPSBudWxsKSwgLy8gcGFzcyB0aHJvdWdoIG51bGwvZGF0ZSBjbGVhcmluZ3Mgb3IgcmFuZ2VzXG4gICAgICAgICAgICBtYXAoKHgpID0+IHgucmFuZ2UgPz8gbnVsbCkgLy8gcmV0dXJuIHRoZSByYW5nZVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICByZWFkb25seSBmdWxsQm91bmRhcnkkOiBPYnNlcnZhYmxlPE1heWJlPERhdGVSYW5nZT4+ID0gdGhpcy5kYXRlUmFuZ2VTZWxlY3Rpb25Gb3JNb2RlKCdzaW5nbGUnKS5waXBlKHNoYXJlUmVwbGF5KDEpKTtcbiAgcmVhZG9ubHkgbGF0ZXN0Qm91bmRhcnkkOiBPYnNlcnZhYmxlPE1heWJlPERhdGVSYW5nZT4+ID0gdGhpcy5zZWxlY3Rpb25Nb2RlJC5waXBlKFxuICAgIHN3aXRjaE1hcCgobW9kZSkgPT4ge1xuICAgICAgaWYgKG1vZGUgPT09ICdhcmJpdHJhcnlfcXVpY2snKSB7XG4gICAgICAgIC8vIGluIGFyYml0cmFyeV9xdWljayBtb2RlLCB0aGUgbGF0ZXN0IHZhbHVlIGlzIHRoZSBib3VuZGFyeSwgc2luY2Ugd2UgYWx3YXlzIHNldCB0aGUgdmFsdWUgaW1tZWRpYXRlbHkuXG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlSW5TeXN0ZW1UaW1lem9uZSQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5mdWxsQm91bmRhcnkkO1xuICAgICAgfVxuICAgIH0pXG4gICk7XG5cbiAgLyoqXG4gICAqIEZvY3VzZXMgb24gdGhlIGRhdGUgYW55IHRpbWUgdGhlIHNlbGVjdGlvbiBldmVudCBmcm9tIHRoZSBwaWNrZXIgb2NjdXJlZCwgb3RoZXJ3aXNlIHVzZSB0aGUgc3lzdGVtIHZhbHVlXG4gICAqL1xuICByZWFkb25seSBjYWxlbmRhckZvY3VzRGF0ZSQ6IE9ic2VydmFibGU8RGF0ZT4gPSB0aGlzLl9zZWxlY3Rpb25FdmVudC5waXBlKHN0YXJ0V2l0aChudWxsKSkucGlwZShcbiAgICBzd2l0Y2hNYXAoKHNlbGVjdGlvbkV2ZW50KSA9PiB7XG4gICAgICBpZiAoc2VsZWN0aW9uRXZlbnQgJiYgc2VsZWN0aW9uRXZlbnQudHlwZSA9PT0gJ2NhbGVuZGFyJyAmJiBzZWxlY3Rpb25FdmVudC5yYW5nZT8uc3RhcnQpIHtcbiAgICAgICAgcmV0dXJuIG9mKHNlbGVjdGlvbkV2ZW50LnJhbmdlLnN0YXJ0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZ1bGxCb3VuZGFyeSQucGlwZShcbiAgICAgICAgICBmaXJzdCgpLFxuICAgICAgICAgIG1hcCgoZnVsbEJvdW5kYXJ5KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gZnVsbEJvdW5kYXJ5Py5zdGFydCA/PyBzZWxlY3Rpb25FdmVudD8ucmFuZ2U/LnN0YXJ0O1xuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSksXG4gICAgZmlsdGVyTWF5YmUoKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IGRhdGVSYW5nZVNlbGVjdGlvbiQ6IE9ic2VydmFibGU8TWF5YmU8RGF0ZVJhbmdlPj4gPSB0aGlzLnNlbGVjdGlvbk1vZGUkLnBpcGUoc3dpdGNoTWFwKChtb2RlKSA9PiB0aGlzLmRhdGVSYW5nZVNlbGVjdGlvbkZvck1vZGUobW9kZSkpKTtcblxuICByZWFkb25seSBjYWxlbmRhclNlbGVjdGlvbiQ6IE9ic2VydmFibGU8RGF0ZVBpY2tlckRhdGVSYW5nZTxEYXRlPiB8IG51bGw+ID0gdGhpcy52YWx1ZUluU3lzdGVtVGltZXpvbmUkLnBpcGUoXG4gICAgbWFwKCh4KSA9PiAoeCA/IG5ldyBEYXRlUGlja2VyRGF0ZVJhbmdlPERhdGU+KHguc3RhcnQsIHguZW5kKSA6IG51bGwpKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IGVuZERpc2FibGVkJCA9IHRoaXMuc2VsZWN0aW9uTW9kZSQucGlwZShcbiAgICBtYXAoKHgpID0+IHggPT09ICdzaW5nbGUnKSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgaW5wdXRSYW5nZUZvcm0gPSBuZXcgRm9ybUdyb3VwKHtcbiAgICBzdGFydDogbmV3IEZvcm1Db250cm9sPE1heWJlPERhdGU+PihudWxsKSxcbiAgICBlbmQ6IG5ldyBGb3JtQ29udHJvbDxNYXliZTxEYXRlPj4obnVsbClcbiAgfSk7XG5cbiAgZ2V0IGZpeGVkRGF0ZVJhbmdlRmllbGQoKTogRGJ4Rml4ZWREYXRlUmFuZ2VGaWVsZFByb3BzIHtcbiAgICByZXR1cm4gdGhpcy5maWVsZC5wcm9wcztcbiAgfVxuXG4gIGdldCBzZWxlY3Rpb25Nb2RlKCkge1xuICAgIHJldHVybiB0aGlzLmZpZWxkLnByb3BzLnNlbGVjdGlvbk1vZGU7XG4gIH1cblxuICBnZXQgdmFsdWVNb2RlKCk6IERieERhdGVUaW1lVmFsdWVNb2RlIHtcbiAgICByZXR1cm4gdGhpcy5maWVsZC5wcm9wcy52YWx1ZU1vZGUgPz8gRGJ4RGF0ZVRpbWVWYWx1ZU1vZGUuREFURTtcbiAgfVxuXG4gIGdldCBkZXNjcmlwdGlvbigpOiBNYXliZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5maWVsZC5wcm9wcy5kZXNjcmlwdGlvbjtcbiAgfVxuXG4gIGdldCB0aW1lem9uZSgpIHtcbiAgICByZXR1cm4gdGhpcy5maWVsZC5wcm9wcy50aW1lem9uZTtcbiAgfVxuXG4gIGdldCBzaG93VGltZXpvbmUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZmllbGQucHJvcHMuc2hvd1RpbWV6b25lID8/IHRydWU7XG4gIH1cblxuICBnZXQgcHJlc2V0cygpIHtcbiAgICByZXR1cm4gdGhpcy5maWVsZC5wcm9wcy5wcmVzZXRzO1xuICB9XG5cbiAgZ2V0IHNob3dSYW5nZUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLmZpZWxkLnByb3BzLnNob3dSYW5nZUlucHV0ID8/IHRydWU7XG4gIH1cblxuICByZWFkb25seSBtaW5NYXhSYW5nZSQgPSB0aGlzLmxpbWl0RGF0ZVRpbWVJbnN0YW5jZSQucGlwZShcbiAgICBjb21iaW5lTGF0ZXN0V2l0aCh0aW1lcihNU19JTl9NSU5VVEUpKSwgLy8gcmVmcmVzaCBldmVyeSBtaW51dGVcbiAgICBtYXAoKFt4XSkgPT4geC5kYXRlUmFuZ2UoKSksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoaXNTYW1lRGF0ZURheVJhbmdlKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IG1pbiQgPSB0aGlzLm1pbk1heFJhbmdlJC5waXBlKFxuICAgIG1hcCgoeCkgPT4geD8uc3RhcnQgPz8gbnVsbCksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IG1heCQgPSB0aGlzLm1pbk1heFJhbmdlJC5waXBlKFxuICAgIG1hcCgoeCkgPT4geD8uZW5kID8/IG51bGwpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBwaWNrZXJGaWx0ZXIkOiBPYnNlcnZhYmxlPERlY2lzaW9uRnVuY3Rpb248RGF0ZSB8IG51bGw+PiA9IHRoaXMuY29uZmlnJC5waXBlKFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgbWFwKCh4KSA9PiB7XG4gICAgICBpZiAoeCkge1xuICAgICAgICBjb25zdCBmaWx0ZXIgPSBkYXRlVGltZU1pbnV0ZVdob2xlRGF5RGVjaXNpb25GdW5jdGlvbih4LCBmYWxzZSk7XG4gICAgICAgIHJldHVybiAoeDogRGF0ZSB8IG51bGwpID0+ICh4ICE9IG51bGwgPyBmaWx0ZXIoeCkgOiB0cnVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiAoKSA9PiB0cnVlO1xuICAgICAgfVxuICAgIH0pLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgZGVmYXVsdFBpY2tlckZpbHRlcjogRGVjaXNpb25GdW5jdGlvbjxEYXRlIHwgbnVsbD4gPSAoKSA9PiB0cnVlO1xuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuX2Zvcm1Db250cm9sT2JzLm5leHQodGhpcy5mb3JtQ29udHJvbCk7XG5cbiAgICBjb25zdCBkYXRlUmFuZ2VTZWxlY3Rpb24gPSB0aGlzLmRhdGVSYW5nZVNlbGVjdGlvbiQucGlwZShzaGFyZVJlcGxheSgxKSk7XG5cbiAgICBjb25zdCBzZXRJbnB1dEZvcm1WYWx1ZSA9ICh2YWx1ZTogTWF5YmU8RGF0ZVJhbmdlPikgPT4ge1xuICAgICAgaWYgKCFpc1NhbWVEYXRlRGF5UmFuZ2UodmFsdWUsIHRoaXMuaW5wdXRSYW5nZUZvcm0udmFsdWUgYXMgUGFydGlhbDxEYXRlUmFuZ2U+KSkge1xuICAgICAgICB0aGlzLmlucHV0UmFuZ2VGb3JtLnNldFZhbHVlKHtcbiAgICAgICAgICBzdGFydDogdmFsdWU/LnN0YXJ0ID8/IG51bGwsXG4gICAgICAgICAgZW5kOiB2YWx1ZT8uZW5kID8/IG51bGxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMuX3N1Yi5zdWJzY3JpcHRpb24gPSB0aGlzLnZhbHVlSW5TeXN0ZW1UaW1lem9uZSRcbiAgICAgIC5waXBlKFxuICAgICAgICBjb21iaW5lTGF0ZXN0V2l0aCh0aGlzLnRpbWV6b25lSW5zdGFuY2UkLnBpcGUobWFwKCh0aW1lem9uZUluc3RhbmNlKSA9PiBkYnhGaXhlZERhdGVSYW5nZU91dHB1dFZhbHVlRmFjdG9yeSh0aGlzLnZhbHVlTW9kZSwgdGltZXpvbmVJbnN0YW5jZSkpKSksXG4gICAgICAgIHRocm90dGxlVGltZShUSU1FX09VVFBVVF9USFJPVFRMRV9USU1FLCB1bmRlZmluZWQsIHsgbGVhZGluZzogZmFsc2UsIHRyYWlsaW5nOiB0cnVlIH0pLFxuICAgICAgICBzd2l0Y2hNYXAoKFtjdXJyZW50VmFsdWUsIHZhbHVlRmFjdG9yeV0pID0+IHtcbiAgICAgICAgICByZXR1cm4gZGF0ZVJhbmdlU2VsZWN0aW9uLnBpcGUoXG4gICAgICAgICAgICBza2lwRmlyc3RNYXliZSgpLFxuICAgICAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQ8TWF5YmU8RGF0ZVJhbmdlPj4oaXNTYW1lRGF0ZURheVJhbmdlKSxcbiAgICAgICAgICAgIG1hcCgoeCkgPT4gW3gsIGN1cnJlbnRWYWx1ZSwgdmFsdWVGYWN0b3J5XSBhcyBbdHlwZW9mIHgsIHR5cGVvZiBjdXJyZW50VmFsdWUsIHR5cGVvZiB2YWx1ZUZhY3RvcnldKVxuICAgICAgICAgICk7XG4gICAgICAgIH0pXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKChbcmF3VmFsdWUsIGN1cnJlbnRWYWx1ZSwgdmFsdWVGYWN0b3J5XSkgPT4ge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHJhd1ZhbHVlID8gdmFsdWVGYWN0b3J5KHJhd1ZhbHVlKSA6IG51bGw7XG4gICAgICAgIGNvbnN0IGlzU2FtZVJhbmdlID0gZGJ4RGF0ZVJhbmdlSXNTYW1lRGF0ZVJhbmdlRmllbGRWYWx1ZSh2YWx1ZSwgY3VycmVudFZhbHVlKTtcblxuICAgICAgICBpZiAoIWlzU2FtZVJhbmdlKSB7XG4gICAgICAgICAgdGhpcy5mb3JtQ29udHJvbC5zZXRWYWx1ZSh2YWx1ZSk7XG4gICAgICAgICAgdGhpcy5mb3JtQ29udHJvbC5tYXJrQXNEaXJ0eSgpO1xuICAgICAgICAgIHRoaXMuZm9ybUNvbnRyb2wubWFya0FzVG91Y2hlZCgpO1xuICAgICAgICB9IGVsc2UgaWYgKHJhd1ZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICAvLyB1cGRhdGUgdGhlIGlucHV0IHRleHQgYWdhaW5cbiAgICAgICAgICBzZXRJbnB1dEZvcm1WYWx1ZShyYXdWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgaWYgKHRoaXMuc2VsZWN0aW9uTW9kZSkge1xuICAgICAgdGhpcy5fc2VsZWN0aW9uTW9kZS5uZXh0KGFzT2JzZXJ2YWJsZUZyb21HZXR0ZXIodGhpcy5zZWxlY3Rpb25Nb2RlKSk7XG4gICAgfVxuXG4gICAgdGhpcy5fY3VycmVudFNlbGVjdGlvbk1vZGVTdWIuc3Vic2NyaXB0aW9uID0gdGhpcy5zZWxlY3Rpb25Nb2RlJC5zdWJzY3JpYmUoKHgpID0+ICh0aGlzLl9jdXJyZW50U2VsZWN0aW9uTW9kZSA9IHgpKTtcbiAgICB0aGlzLl9kYXRlUmFuZ2VJbnB1dFN1Yi5zdWJzY3JpcHRpb24gPSB0aGlzLmRhdGVSYW5nZUlucHV0JC5zdWJzY3JpYmUoKHgpID0+ICh0aGlzLl9jdXJyZW50RGF0ZVJhbmdlSW5wdXQgPSB4KSk7XG5cbiAgICB0aGlzLl9pbnB1dFJhbmdlRm9ybVN1Yi5zdWJzY3JpcHRpb24gPSB0aGlzLnZhbHVlSW5TeXN0ZW1UaW1lem9uZSQuc3Vic2NyaWJlKCh4OiBNYXliZTxEYXRlUmFuZ2U+KSA9PiB7XG4gICAgICBzZXRJbnB1dEZvcm1WYWx1ZSh4KTtcbiAgICB9KTtcblxuICAgIGlmICh0aGlzLnNob3dSYW5nZUlucHV0KSB7XG4gICAgICB0aGlzLl9pbnB1dFJhbmdlRm9ybVZhbHVlU3ViLnN1YnNjcmlwdGlvbiA9IHRoaXMudmFsdWVJblN5c3RlbVRpbWV6b25lJFxuICAgICAgICAucGlwZShcbiAgICAgICAgICB0aHJvdHRsZVRpbWUoMTAwKSwgLy8gdGhyb3R0bGUgdG8gcHJldmVudCB0aGUgdmFsdWUgZnJvbSBjaGFuZ2luZyB0b28gZmFzdFxuICAgICAgICAgIHN3aXRjaE1hcCgoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pbnB1dFJhbmdlRm9ybS52YWx1ZUNoYW5nZXMucGlwZShcbiAgICAgICAgICAgICAgZGVib3VuY2VUaW1lKDUwMCksXG4gICAgICAgICAgICAgIGZpbHRlcigoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhcnRTdHJpbmcgPSB0aGlzLnN0YXJ0RGF0ZUlucHV0RWxlbWVudC5uYXRpdmVFbGVtZW50Py52YWx1ZTtcbiAgICAgICAgICAgICAgICBsZXQgdmFsaWQgPSBpc01vbnRoRGF5U2xhc2hEYXRlKHN0YXJ0U3RyaW5nKTtcblxuICAgICAgICAgICAgICAgIGlmICh2YWxpZCAmJiB0aGlzLl9jdXJyZW50U2VsZWN0aW9uTW9kZSAhPT0gJ3NpbmdsZScpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZFN0cmluZyA9IHRoaXMuZW5kRGF0ZUlucHV0RWxlbWVudC5uYXRpdmVFbGVtZW50Py52YWx1ZTtcbiAgICAgICAgICAgICAgICAgIHZhbGlkID0gaXNNb250aERheVNsYXNoRGF0ZShlbmRTdHJpbmcpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiB2YWxpZDsgLy8gbXVzdCBiZSBhIHZhbGlkIHRleHQgaW5wdXRcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgIG1hcCgoeCkgPT4geCBhcyBNYXliZTxQYXJ0aWFsPERhdGVSYW5nZT4+KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZChpc1NhbWVEYXRlUmFuZ2UpXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgoeDogTWF5YmU8UGFydGlhbDxEYXRlUmFuZ2U+PikgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLl9jdXJyZW50U2VsZWN0aW9uTW9kZSA9PT0gJ3NpbmdsZScpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0RGF0ZVJhbmdlKHg/LnN0YXJ0ID8geyBzdGFydDogeC5zdGFydCB9IDogbnVsbCwgJ2lucHV0Jyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCByYW5nZVRvU2V0OiBNYXliZTxQYXJ0aWFsPERhdGVSYW5nZT4+ID0geDtcblxuICAgICAgICAgICAgaWYgKHRoaXMuX2N1cnJlbnRTZWxlY3Rpb25Nb2RlID09PSAnYXJiaXRyYXJ5X3F1aWNrJyAmJiB0aGlzLl9sYXRlc3RCb3VuZGFyeSAmJiB4Py5zdGFydCAmJiB4Py5lbmQpIHtcbiAgICAgICAgICAgICAgaWYgKCFpc0RhdGVJbkRhdGVSYW5nZSh4LnN0YXJ0LCB0aGlzLl9sYXRlc3RCb3VuZGFyeSkpIHtcbiAgICAgICAgICAgICAgICAvLyBpZiB0aGUgZW5kIGRhdGUgaXQgb3V0c2lkZSBvZiB0aGUgY3VycmVudCByYW5nZSAoaS5lLiBhIHJhbmdlIHdhcyB0eXBlZCBpbiBvbmx5IHRvIHRoZSBzdGFydCBkYXRlKSB0aGVuIHNldCB0aGUgZW5kIHRvIHRoZSBib3VuZGFyeSBlbmRcbiAgICAgICAgICAgICAgICBjb25zdCBib3VuZGFyeSA9IGRhdGVSYW5nZSh7IC4uLnRoaXMuX2N1cnJlbnREYXRlUmFuZ2VJbnB1dCwgZGF0ZTogeC5zdGFydCB9IGFzIERhdGVSYW5nZUlucHV0KTtcbiAgICAgICAgICAgICAgICByYW5nZVRvU2V0ID0geyBzdGFydDogeC5zdGFydCwgZW5kOiBib3VuZGFyeS5lbmQgfTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnNldERhdGVSYW5nZShyYW5nZVRvU2V0LCAnaW5wdXQnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMuX2xhdGVzdEJvdW5kYXJ5U3ViLnN1YnNjcmlwdGlvbiA9IHRoaXMubGF0ZXN0Qm91bmRhcnkkLnN1YnNjcmliZSgoeCkgPT4gKHRoaXMuX2xhdGVzdEJvdW5kYXJ5ID0geCkpO1xuICAgIHRoaXMuX2RhdGVSYW5nZUlucHV0Lm5leHQoYXNPYnNlcnZhYmxlRnJvbUdldHRlcih0aGlzLmZpeGVkRGF0ZVJhbmdlRmllbGQuZGF0ZVJhbmdlSW5wdXQpKTtcblxuICAgIHRoaXMuX2Rpc2FibGVFbmRTdWIuc3Vic2NyaXB0aW9uID0gdGhpcy5lbmREaXNhYmxlZCQuc3Vic2NyaWJlKChkaXNhYmxlZCkgPT4ge1xuICAgICAgY29uc3QgZW5kID0gdGhpcy5pbnB1dFJhbmdlRm9ybS5nZXQoJ2VuZCcpO1xuXG4gICAgICBpZiAoZW5kKSB7XG4gICAgICAgIGlmIChkaXNhYmxlZCkge1xuICAgICAgICAgIGVuZC5kaXNhYmxlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZW5kLmVuYWJsZSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjb25zdCBpbnB1dFBpY2tlckNvbmZpZyA9IHRoaXMuZml4ZWREYXRlUmFuZ2VGaWVsZC5waWNrZXJDb25maWc7XG4gICAgdGhpcy5fY29uZmlnLm5leHQoaW5wdXRQaWNrZXJDb25maWcgPyBhc09ic2VydmFibGVGcm9tR2V0dGVyKGlucHV0UGlja2VyQ29uZmlnKSA6IHVuZGVmaW5lZCk7XG5cbiAgICAvLyBTZXQgZGVmYXVsdCB0aW1lem9uZSBpZiBwcm92aWRlZC5cbiAgICBpZiAodGhpcy50aW1lem9uZSAmJiAhdGhpcy5maXhlZERhdGVSYW5nZUZpZWxkLmZ1bGxEYXlJblVUQykge1xuICAgICAgdGhpcy5fdGltZXpvbmUubmV4dChhc09ic2VydmFibGVGcm9tR2V0dGVyKHRoaXMudGltZXpvbmUpKTtcbiAgICB9XG5cbiAgICAvLyBXYXRjaCBmb3IgZGlzYWJsZWQgY2hhbmdlcyBzbyB3ZSBjYW4gcHJvcG9nYXRlIHRoZW0gcHJvcGVybHkuXG4gICAgdGhpcy5mb3JtQ29udHJvbC5yZWdpc3Rlck9uRGlzYWJsZWRDaGFuZ2UoKGRpc2FibGVkKSA9PiB7XG4gICAgICBpZiAoZGlzYWJsZWQpIHtcbiAgICAgICAgdGhpcy5pbnB1dFJhbmdlRm9ybS5kaXNhYmxlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmlucHV0UmFuZ2VGb3JtLmVuYWJsZSgpO1xuXG4gICAgICAgIHRoaXMuZW5kRGlzYWJsZWQkLnBpcGUoZmlyc3QoKSkuc3Vic2NyaWJlKChkaXNhYmxlZCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGVuZCA9IHRoaXMuaW5wdXRSYW5nZUZvcm0uZ2V0KCdlbmQnKTtcblxuICAgICAgICAgIGlmIChlbmQpIHtcbiAgICAgICAgICAgIGlmIChkaXNhYmxlZCkge1xuICAgICAgICAgICAgICBlbmQuZGlzYWJsZSgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZW5kLmVuYWJsZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAodGhpcy5wcmVzZXRzICE9IG51bGwpIHtcbiAgICAgIHRoaXMuX3ByZXNldHMubmV4dChhc09ic2VydmFibGVGcm9tR2V0dGVyKHRoaXMucHJlc2V0cykpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9wcmVzZXRzLm5leHQodGhpcy5kYnhEYXRlVGltZUZpZWxkTWVudVByZXNldHNTZXJ2aWNlLmNvbmZpZ3VyYXRpb25zJCk7XG4gICAgfVxuXG4gICAgdGhpcy5fYWN0aXZlRGF0ZVN1Yi5zdWJzY3JpcHRpb24gPSB0aGlzLmNhbGVuZGFyRm9jdXNEYXRlJC5zdWJzY3JpYmUoKHgpID0+IHtcbiAgICAgIHRoaXMuY2FsZW5kYXIuYWN0aXZlRGF0ZSA9IHg7XG4gICAgfSk7XG4gIH1cblxuICBvdmVycmlkZSBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICBzdXBlci5uZ09uRGVzdHJveSgpO1xuICAgIHRoaXMuX3N1Yi5kZXN0cm95KCk7XG4gICAgdGhpcy5faW5wdXRSYW5nZUZvcm1TdWIuZGVzdHJveSgpO1xuICAgIHRoaXMuX2lucHV0UmFuZ2VGb3JtVmFsdWVTdWIuZGVzdHJveSgpO1xuICAgIHRoaXMuX2RhdGVSYW5nZUlucHV0U3ViLmRlc3Ryb3koKTtcbiAgICB0aGlzLl9jdXJyZW50U2VsZWN0aW9uTW9kZVN1Yi5kZXN0cm95KCk7XG4gICAgdGhpcy5fbGF0ZXN0Qm91bmRhcnlTdWIuZGVzdHJveSgpO1xuICAgIHRoaXMuX2Rpc2FibGVFbmRTdWIuZGVzdHJveSgpO1xuICAgIHRoaXMuX2FjdGl2ZURhdGVTdWIuZGVzdHJveSgpO1xuICAgIHRoaXMuX2NvbmZpZy5jb21wbGV0ZSgpO1xuICAgIHRoaXMuX3NlbGVjdGlvbk1vZGUuY29tcGxldGUoKTtcbiAgICB0aGlzLl9kYXRlUmFuZ2VJbnB1dC5jb21wbGV0ZSgpO1xuICAgIHRoaXMuX3RpbWV6b25lLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5fcHJlc2V0cy5jb21wbGV0ZSgpO1xuICAgIHRoaXMuX3NlbGVjdGlvbkV2ZW50LmNvbXBsZXRlKCk7XG4gICAgdGhpcy5fZm9ybUNvbnRyb2xPYnMuY29tcGxldGUoKTtcbiAgfVxuXG4gIHNlbGVjdGVkQ2hhbmdlKGRhdGU6IE1heWJlPERhdGU+KTogdm9pZCB7XG4gICAgdGhpcy5zZXREYXRlUmFuZ2UoZGF0ZSA/IHsgc3RhcnQ6IGRhdGUgfSA6IG51bGwsICdjYWxlbmRhcicpO1xuICB9XG5cbiAgc2V0RGF0ZVJhbmdlKHJhbmdlOiBNYXliZTxQYXJ0aWFsPERhdGVSYW5nZT4+LCB0eXBlOiBTZWxlY3RlZERhdGVFdmVudFR5cGUpIHtcbiAgICB0aGlzLl9zZWxlY3Rpb25FdmVudC5uZXh0KHsgdHlwZSwgcmFuZ2UgfSk7XG4gIH1cblxuICBfY3JlYXRlRGF0ZVJhbmdlKGRhdGU6IE1heWJlPERhdGU+KTogTWF5YmU8RGF0ZVJhbmdlPiB7XG4gICAgcmV0dXJuIGRhdGUgPyBkYXRlUmFuZ2UoeyAuLi50aGlzLl9jdXJyZW50RGF0ZVJhbmdlSW5wdXQsIGRhdGUgfSBhcyBEYXRlUmFuZ2VJbnB1dCkgOiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIERieEZpeGVkRGF0ZVJhbmdlRmllbGRTZWxlY3Rpb25TdHJhdGVneTxEPiBpbXBsZW1lbnRzIE1hdERhdGVSYW5nZVNlbGVjdGlvblN0cmF0ZWd5PEQ+IHtcbiAgcHJpdmF0ZSByZWFkb25seSBfZGF0ZUFkYXB0ZXIgPSBpbmplY3QoRGF0ZUFkYXB0ZXI8RD4pO1xuICByZWFkb25seSBkYnhGaXhlZERhdGVSYW5nZUZpZWxkQ29tcG9uZW50ID0gaW5qZWN0KERieEZpeGVkRGF0ZVJhbmdlRmllbGRDb21wb25lbnQpO1xuXG4gIHNlbGVjdGlvbkZpbmlzaGVkKGRhdGU6IEQgfCBudWxsLCBjdXJyZW50UmFuZ2U6IERhdGVQaWNrZXJEYXRlUmFuZ2U8RD4sIGV2ZW50OiBFdmVudCk6IERhdGVQaWNrZXJEYXRlUmFuZ2U8RD4ge1xuICAgIC8vIHVudXNlZFxuICAgIHJldHVybiBjdXJyZW50UmFuZ2U7XG4gIH1cblxuICBjcmVhdGVQcmV2aWV3KGFjdGl2ZURhdGU6IEQgfCBudWxsLCBjdXJyZW50UmFuZ2U6IERhdGVQaWNrZXJEYXRlUmFuZ2U8RD4sIGV2ZW50OiBFdmVudCk6IERhdGVQaWNrZXJEYXRlUmFuZ2U8RD4ge1xuICAgIGNvbnN0IHsgY3VycmVudFNlbGVjdGlvbk1vZGUgfSA9IHRoaXMuZGJ4Rml4ZWREYXRlUmFuZ2VGaWVsZENvbXBvbmVudDtcbiAgICBpZiAoYWN0aXZlRGF0ZSAhPSBudWxsICYmIGN1cnJlbnRTZWxlY3Rpb25Nb2RlICE9PSAnc2luZ2xlJykge1xuICAgICAgY29uc3QgbGF0ZXN0Qm91bmRhcnkgPSB0aGlzLmRieEZpeGVkRGF0ZVJhbmdlRmllbGRDb21wb25lbnQubGF0ZXN0Qm91bmRhcnk7XG4gICAgICBjb25zdCBkYXRlID0gdGhpcy5kYXRlRnJvbUFkYXB0ZXJEYXRlKGFjdGl2ZURhdGUpO1xuXG4gICAgICBpZiAobGF0ZXN0Qm91bmRhcnkgJiYgKGN1cnJlbnRTZWxlY3Rpb25Nb2RlID09PSAnbm9ybWFsJyB8fCBpc0RhdGVJbkRhdGVSYW5nZShkYXRlLCBsYXRlc3RCb3VuZGFyeSkpKSB7XG4gICAgICAgIGNvbnN0IGV4YW1wbGVEYXRlUmFuZ2UgPSB0aGlzLl9jcmVhdGVEYXRlUmFuZ2UobGF0ZXN0Qm91bmRhcnkpO1xuICAgICAgICByZXR1cm4gZXhhbXBsZURhdGVSYW5nZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fY3JlYXRlRGF0ZVJhbmdlV2l0aERhdGUoYWN0aXZlRGF0ZSk7XG4gIH1cblxuICBwcml2YXRlIF9jcmVhdGVEYXRlUmFuZ2VXaXRoRGF0ZShpbnB1dDogRCB8IG51bGwpOiBEYXRlUGlja2VyRGF0ZVJhbmdlPEQ+IHtcbiAgICBsZXQgZGF0ZVJhbmdlOiBNYXliZTxEYXRlUmFuZ2U+O1xuXG4gICAgaWYgKGlucHV0KSB7XG4gICAgICBjb25zdCBkYXRlID0gdGhpcy5kYXRlRnJvbUFkYXB0ZXJEYXRlKGlucHV0KTtcbiAgICAgIGRhdGVSYW5nZSA9IHRoaXMuZGJ4Rml4ZWREYXRlUmFuZ2VGaWVsZENvbXBvbmVudC5fY3JlYXRlRGF0ZVJhbmdlKGRhdGUpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9jcmVhdGVEYXRlUmFuZ2UoZGF0ZVJhbmdlKTtcbiAgfVxuXG4gIHByaXZhdGUgX2NyZWF0ZURhdGVSYW5nZShpbnB1dDogTWF5YmU8RGF0ZVJhbmdlPik6IERhdGVQaWNrZXJEYXRlUmFuZ2U8RD4ge1xuICAgIGlmIChpbnB1dCkge1xuICAgICAgcmV0dXJuIG5ldyBEYXRlUGlja2VyRGF0ZVJhbmdlPEQ+KHRoaXMuYWRhcHRlckRhdGVGcm9tRGF0ZShpbnB1dC5zdGFydCksIHRoaXMuYWRhcHRlckRhdGVGcm9tRGF0ZShpbnB1dC5lbmQpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG5ldyBEYXRlUGlja2VyRGF0ZVJhbmdlPEQ+KG51bGwsIG51bGwpO1xuICAgIH1cbiAgfVxuXG4gIGRhdGVGcm9tQWRhcHRlckRhdGUoaW5wdXQ6IEQpIHtcbiAgICBjb25zdCBkYXk6IERheU9mTW9udGggPSB0aGlzLl9kYXRlQWRhcHRlci5nZXREYXRlKGlucHV0KTtcbiAgICBjb25zdCBtb250aEluZGV4OiBEYXRlTW9udGggPSB0aGlzLl9kYXRlQWRhcHRlci5nZXRNb250aChpbnB1dCk7XG4gICAgY29uc3QgeWVhcjogWWVhck51bWJlciA9IHRoaXMuX2RhdGVBZGFwdGVyLmdldFllYXIoaW5wdXQpO1xuICAgIHJldHVybiBuZXcgRGF0ZSh5ZWFyLCBtb250aEluZGV4LCBkYXkpO1xuICB9XG5cbiAgYWRhcHRlckRhdGVGcm9tRGF0ZShkYXRlOiBEYXRlKTogRCB7XG4gICAgY29uc3QgZGF5OiBEYXlPZk1vbnRoID0gZGF0ZS5nZXREYXRlKCk7XG4gICAgY29uc3QgbW9udGhJbmRleDogRGF0ZU1vbnRoID0gZGF0ZS5nZXRNb250aCgpO1xuICAgIGNvbnN0IHllYXI6IFllYXJOdW1iZXIgPSBkYXRlLmdldEZ1bGxZZWFyKCk7XG5cbiAgICByZXR1cm4gdGhpcy5fZGF0ZUFkYXB0ZXIuY3JlYXRlRGF0ZSh5ZWFyLCBtb250aEluZGV4LCBkYXkpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiZGJ4LWZpeGVkZGF0ZXJhbmdlLWZpZWxkXCI+XG4gIDxtYXQtY2FsZW5kYXIgI2NhbGVuZGFyVmlldyBbc2VsZWN0ZWRdPVwiY2FsZW5kYXJTZWxlY3Rpb24kIHwgYXN5bmNcIiBbZGF0ZUZpbHRlcl09XCIocGlja2VyRmlsdGVyJCB8IGFzeW5jKSB8fCBkZWZhdWx0UGlja2VyRmlsdGVyXCIgW21pbkRhdGVdPVwibWluJCB8IGFzeW5jXCIgW21heERhdGVdPVwibWF4JCB8IGFzeW5jXCIgKHNlbGVjdGVkQ2hhbmdlKT1cInNlbGVjdGVkQ2hhbmdlKCRldmVudClcIj48L21hdC1jYWxlbmRhcj5cbiAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZGJ4LWZpeGVkZGF0ZXJhbmdlLWZpZWxkLWlucHV0XCIgYXBwZWFyYW5jZT1cImZpbGxcIj5cbiAgICA8bWF0LWRhdGUtcmFuZ2UtaW5wdXQgKm5nSWY9XCJzaG93UmFuZ2VJbnB1dFwiIFtmb3JtR3JvdXBdPVwiaW5wdXRSYW5nZUZvcm1cIj5cbiAgICAgIDxpbnB1dCAjc3RhcnREYXRlSW5wdXQgbWF0U3RhcnREYXRlIGZvcm1Db250cm9sTmFtZT1cInN0YXJ0XCIgcGxhY2Vob2xkZXI9XCJTdGFydCBkYXRlXCIgLz5cbiAgICAgIDxpbnB1dCAjZW5kRGF0ZUlucHV0IFtuZ0NsYXNzXT1cIihlbmREaXNhYmxlZCQgfCBhc3luYykgPyAnZGJ4LWZpeGVkZGF0ZXJhbmdlLWZpZWxkLWlucHV0LWVuZCcgOiAnJ1wiIFthdHRyLnRhYmluZGV4XT1cIihlbmREaXNhYmxlZCQgfCBhc3luYykgPyAtMSA6IDBcIiBtYXRFbmREYXRlIGZvcm1Db250cm9sTmFtZT1cImVuZFwiIHBsYWNlaG9sZGVyPVwiRW5kIGRhdGVcIiAvPlxuICAgIDwvbWF0LWRhdGUtcmFuZ2UtaW5wdXQ+XG4gIDwvbWF0LWZvcm0tZmllbGQ+XG4gIDxtYXQtZXJyb3IgKm5nSWY9XCJmb3JtQ29udHJvbC5oYXNFcnJvcigncmVxdWlyZWQnKVwiPkRhdGUgcmFuZ2UgaXMgcmVxdWlyZWQ8L21hdC1lcnJvcj5cbjwvZGl2PlxuIl19