@fundamental-ngx/core 0.44.0-rc.2 → 0.44.0-rc.4

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 (203) hide show
  1. package/avatar/avatar.component.d.ts +0 -1
  2. package/bar/directives/bar-element.directive.d.ts +6 -3
  3. package/breadcrumb/breadcrumb.component.d.ts +4 -4
  4. package/carousel/carousel.component.d.ts +8 -2
  5. package/content-density/providers/content-density-observer-providers.d.ts +1 -1
  6. package/content-density/services/content-density-observer.service.d.ts +3 -3
  7. package/date-picker/date-picker.component.d.ts +30 -9
  8. package/datetime-picker/datetime-picker.component.d.ts +28 -10
  9. package/dialog/dialog-container/dialog-container.component.d.ts +4 -4
  10. package/dialog/dialog-footer-button/dialog-footer-button.component.d.ts +2 -0
  11. package/dialog/directives/dialog-decisive-button.directive.d.ts +2 -0
  12. package/dialog/utils/dialog-config.class.d.ts +1 -1
  13. package/esm2022/action-bar/action-bar.component.mjs +10 -3
  14. package/esm2022/alert/alert-service/alert.service.mjs +12 -3
  15. package/esm2022/alert/alert-utils/alert-config.mjs +11 -3
  16. package/esm2022/alert/alert-utils/alert-container.component.mjs +11 -3
  17. package/esm2022/alert/alert-utils/alert-ref.mjs +11 -3
  18. package/esm2022/alert/alert.component.mjs +17 -3
  19. package/esm2022/alert/alert.module.mjs +11 -3
  20. package/esm2022/avatar/avatar.component.mjs +2 -2
  21. package/esm2022/bar/directives/bar-element.directive.mjs +15 -7
  22. package/esm2022/breadcrumb/breadcrumb.component.mjs +9 -11
  23. package/esm2022/carousel/carousel.component.mjs +34 -5
  24. package/esm2022/combobox/combobox-mobile/combobox-mobile.component.mjs +1 -1
  25. package/esm2022/content-density/providers/content-density-observer-providers.mjs +4 -4
  26. package/esm2022/content-density/services/content-density-observer.service.mjs +13 -13
  27. package/esm2022/date-picker/date-picker.component.mjs +103 -10
  28. package/esm2022/datetime-picker/datetime-picker.component.mjs +78 -8
  29. package/esm2022/dialog/dialog-container/dialog-container.component.mjs +12 -13
  30. package/esm2022/dialog/dialog-footer-button/dialog-footer-button.component.mjs +8 -3
  31. package/esm2022/dialog/dialog-header/dialog-header.component.mjs +1 -1
  32. package/esm2022/dialog/directives/dialog-decisive-button.directive.mjs +6 -2
  33. package/esm2022/dialog/utils/dialog-config.class.mjs +1 -1
  34. package/esm2022/feed-list-item/components/item/feed-list-item.component.mjs +23 -1
  35. package/esm2022/form/form-label/form-label.component.mjs +21 -5
  36. package/esm2022/list/list-item/list-item.component.mjs +36 -1
  37. package/esm2022/menu/menu-mobile/menu-mobile.component.mjs +1 -1
  38. package/esm2022/message-box/directives/message-box-decisive-button.directive.mjs +6 -2
  39. package/esm2022/message-box/message-box-container/message-box-container.component.mjs +12 -15
  40. package/esm2022/message-box/message-box-footer-button/message-box-footer-button.component.mjs +8 -3
  41. package/esm2022/message-box/message-box-header/message-box-header.component.mjs +1 -1
  42. package/esm2022/message-strip/alert/message-strip-alert-container-footer/message-strip-alert-container-footer.component.mjs +8 -9
  43. package/esm2022/message-strip/auto-dismiss-message-strip.directive.mjs +10 -9
  44. package/esm2022/message-strip/message-strip.component.mjs +12 -1
  45. package/esm2022/multi-combobox/base-multi-combobox.class.mjs +17 -14
  46. package/esm2022/multi-combobox/mobile/mobile-multi-combobox.component.mjs +1 -1
  47. package/esm2022/multi-combobox/multi-combobox.component.mjs +44 -45
  48. package/esm2022/multi-combobox/select-all-toggler/select-all-toggler.component.mjs +8 -10
  49. package/esm2022/multi-input/multi-input-mobile/multi-input-mobile.component.mjs +1 -1
  50. package/esm2022/overflow-layout/directives/overflow-layout-popover-content.directive.mjs +9 -11
  51. package/esm2022/pagination/pagination.component.mjs +140 -2
  52. package/esm2022/popover/base/base-popover.class.mjs +25 -1
  53. package/esm2022/popover/popover.component.mjs +28 -17
  54. package/esm2022/product-switch/product-switch/product-switch.component.mjs +11 -1
  55. package/esm2022/quick-view/quick-view-title/quick-view-title.component.mjs +1 -1
  56. package/esm2022/segmented-button/segmented-button.component.mjs +19 -21
  57. package/esm2022/select/select.component.mjs +17 -10
  58. package/esm2022/shellbar/shellbar-actions/shellbar-actions.component.mjs +12 -1
  59. package/esm2022/shellbar/shellbar.component.mjs +12 -11
  60. package/esm2022/side-navigation/side-navigation.component.mjs +12 -3
  61. package/esm2022/slider/slider.component.mjs +83 -13
  62. package/esm2022/split-button/split-button.component.mjs +34 -16
  63. package/esm2022/splitter/splitter-pagination/splitter-pagination.component.mjs +9 -2
  64. package/esm2022/splitter/splitter.component.mjs +16 -5
  65. package/esm2022/step-input/step-input.component.mjs +46 -24
  66. package/esm2022/switch/switch.component.mjs +25 -3
  67. package/esm2022/table/directives/table-cell.directive.mjs +5 -7
  68. package/esm2022/table/directives/table-row.directive.mjs +17 -20
  69. package/esm2022/table/table.component.mjs +10 -9
  70. package/esm2022/tabs/tab-item-expand/tab-item-expand.component.mjs +11 -1
  71. package/esm2022/tabs/tab-list.component.mjs +40 -31
  72. package/esm2022/text/text.component.mjs +23 -1
  73. package/esm2022/time/i18n/time-i18n.mjs +2 -2
  74. package/esm2022/token/token.component.mjs +36 -14
  75. package/esm2022/toolbar/toolbar.component.mjs +33 -26
  76. package/esm2022/tree/components/tree-item/tree-item.component.mjs +21 -21
  77. package/esm2022/tree/tree.component.mjs +23 -22
  78. package/esm2022/upload-collection/upload-collection-button-group/upload-collection-button-group.component.mjs +67 -1
  79. package/esm2022/upload-collection/upload-collection-form-item/upload-collection-form-item.component.mjs +12 -1
  80. package/feed-list-item/components/item/feed-list-item.component.d.ts +8 -2
  81. package/fesm2022/fundamental-ngx-core-action-bar.mjs +9 -2
  82. package/fesm2022/fundamental-ngx-core-action-bar.mjs.map +1 -1
  83. package/fesm2022/fundamental-ngx-core-alert.mjs +58 -13
  84. package/fesm2022/fundamental-ngx-core-alert.mjs.map +1 -1
  85. package/fesm2022/fundamental-ngx-core-avatar.mjs +1 -1
  86. package/fesm2022/fundamental-ngx-core-avatar.mjs.map +1 -1
  87. package/fesm2022/fundamental-ngx-core-bar.mjs +14 -6
  88. package/fesm2022/fundamental-ngx-core-bar.mjs.map +1 -1
  89. package/fesm2022/fundamental-ngx-core-breadcrumb.mjs +9 -10
  90. package/fesm2022/fundamental-ngx-core-breadcrumb.mjs.map +1 -1
  91. package/fesm2022/fundamental-ngx-core-carousel.mjs +32 -3
  92. package/fesm2022/fundamental-ngx-core-carousel.mjs.map +1 -1
  93. package/fesm2022/fundamental-ngx-core-combobox.mjs +1 -1
  94. package/fesm2022/fundamental-ngx-core-combobox.mjs.map +1 -1
  95. package/fesm2022/fundamental-ngx-core-content-density.mjs +15 -14
  96. package/fesm2022/fundamental-ngx-core-content-density.mjs.map +1 -1
  97. package/fesm2022/fundamental-ngx-core-date-picker.mjs +102 -9
  98. package/fesm2022/fundamental-ngx-core-date-picker.mjs.map +1 -1
  99. package/fesm2022/fundamental-ngx-core-datetime-picker.mjs +77 -7
  100. package/fesm2022/fundamental-ngx-core-datetime-picker.mjs.map +1 -1
  101. package/fesm2022/fundamental-ngx-core-dialog.mjs +23 -13
  102. package/fesm2022/fundamental-ngx-core-dialog.mjs.map +1 -1
  103. package/fesm2022/fundamental-ngx-core-feed-list-item.mjs +22 -0
  104. package/fesm2022/fundamental-ngx-core-feed-list-item.mjs.map +1 -1
  105. package/fesm2022/fundamental-ngx-core-form.mjs +20 -4
  106. package/fesm2022/fundamental-ngx-core-form.mjs.map +1 -1
  107. package/fesm2022/fundamental-ngx-core-list.mjs +35 -0
  108. package/fesm2022/fundamental-ngx-core-list.mjs.map +1 -1
  109. package/fesm2022/fundamental-ngx-core-menu.mjs +1 -1
  110. package/fesm2022/fundamental-ngx-core-menu.mjs.map +1 -1
  111. package/fesm2022/fundamental-ngx-core-message-box.mjs +24 -15
  112. package/fesm2022/fundamental-ngx-core-message-box.mjs.map +1 -1
  113. package/fesm2022/fundamental-ngx-core-message-strip.mjs +27 -14
  114. package/fesm2022/fundamental-ngx-core-message-strip.mjs.map +1 -1
  115. package/fesm2022/fundamental-ngx-core-multi-combobox.mjs +63 -64
  116. package/fesm2022/fundamental-ngx-core-multi-combobox.mjs.map +1 -1
  117. package/fesm2022/fundamental-ngx-core-multi-input.mjs +1 -1
  118. package/fesm2022/fundamental-ngx-core-multi-input.mjs.map +1 -1
  119. package/fesm2022/fundamental-ngx-core-overflow-layout.mjs +9 -10
  120. package/fesm2022/fundamental-ngx-core-overflow-layout.mjs.map +1 -1
  121. package/fesm2022/fundamental-ngx-core-pagination.mjs +139 -1
  122. package/fesm2022/fundamental-ngx-core-pagination.mjs.map +1 -1
  123. package/fesm2022/fundamental-ngx-core-popover.mjs +51 -16
  124. package/fesm2022/fundamental-ngx-core-popover.mjs.map +1 -1
  125. package/fesm2022/fundamental-ngx-core-product-switch.mjs +10 -0
  126. package/fesm2022/fundamental-ngx-core-product-switch.mjs.map +1 -1
  127. package/fesm2022/fundamental-ngx-core-quick-view.mjs +1 -1
  128. package/fesm2022/fundamental-ngx-core-quick-view.mjs.map +1 -1
  129. package/fesm2022/fundamental-ngx-core-segmented-button.mjs +17 -19
  130. package/fesm2022/fundamental-ngx-core-segmented-button.mjs.map +1 -1
  131. package/fesm2022/fundamental-ngx-core-select.mjs +16 -9
  132. package/fesm2022/fundamental-ngx-core-select.mjs.map +1 -1
  133. package/fesm2022/fundamental-ngx-core-shellbar.mjs +22 -10
  134. package/fesm2022/fundamental-ngx-core-shellbar.mjs.map +1 -1
  135. package/fesm2022/fundamental-ngx-core-side-navigation.mjs +11 -2
  136. package/fesm2022/fundamental-ngx-core-side-navigation.mjs.map +1 -1
  137. package/fesm2022/fundamental-ngx-core-slider.mjs +82 -12
  138. package/fesm2022/fundamental-ngx-core-slider.mjs.map +1 -1
  139. package/fesm2022/fundamental-ngx-core-split-button.mjs +32 -13
  140. package/fesm2022/fundamental-ngx-core-split-button.mjs.map +1 -1
  141. package/fesm2022/fundamental-ngx-core-splitter.mjs +23 -5
  142. package/fesm2022/fundamental-ngx-core-splitter.mjs.map +1 -1
  143. package/fesm2022/fundamental-ngx-core-step-input.mjs +45 -23
  144. package/fesm2022/fundamental-ngx-core-step-input.mjs.map +1 -1
  145. package/fesm2022/fundamental-ngx-core-switch.mjs +24 -2
  146. package/fesm2022/fundamental-ngx-core-switch.mjs.map +1 -1
  147. package/fesm2022/fundamental-ngx-core-table.mjs +26 -30
  148. package/fesm2022/fundamental-ngx-core-table.mjs.map +1 -1
  149. package/fesm2022/fundamental-ngx-core-tabs.mjs +51 -31
  150. package/fesm2022/fundamental-ngx-core-tabs.mjs.map +1 -1
  151. package/fesm2022/fundamental-ngx-core-text.mjs +22 -0
  152. package/fesm2022/fundamental-ngx-core-text.mjs.map +1 -1
  153. package/fesm2022/fundamental-ngx-core-time.mjs +1 -1
  154. package/fesm2022/fundamental-ngx-core-time.mjs.map +1 -1
  155. package/fesm2022/fundamental-ngx-core-token.mjs +36 -13
  156. package/fesm2022/fundamental-ngx-core-token.mjs.map +1 -1
  157. package/fesm2022/fundamental-ngx-core-toolbar.mjs +31 -24
  158. package/fesm2022/fundamental-ngx-core-toolbar.mjs.map +1 -1
  159. package/fesm2022/fundamental-ngx-core-tree.mjs +38 -38
  160. package/fesm2022/fundamental-ngx-core-tree.mjs.map +1 -1
  161. package/fesm2022/fundamental-ngx-core-upload-collection.mjs +77 -0
  162. package/fesm2022/fundamental-ngx-core-upload-collection.mjs.map +1 -1
  163. package/form/form-label/form-label.component.d.ts +8 -2
  164. package/fundamental-ngx-core-v0.44.0-rc.4.tgz +0 -0
  165. package/list/list-item/list-item.component.d.ts +16 -4
  166. package/message-box/directives/message-box-decisive-button.directive.d.ts +2 -0
  167. package/message-box/message-box-container/message-box-container.component.d.ts +4 -6
  168. package/message-box/message-box-footer-button/message-box-footer-button.component.d.ts +2 -0
  169. package/message-strip/alert/message-strip-alert-container-footer/message-strip-alert-container-footer.component.d.ts +1 -1
  170. package/message-strip/auto-dismiss-message-strip.directive.d.ts +3 -3
  171. package/message-strip/message-strip.component.d.ts +4 -1
  172. package/multi-combobox/base-multi-combobox.class.d.ts +30 -30
  173. package/multi-combobox/multi-combobox.component.d.ts +17 -18
  174. package/multi-combobox/select-all-toggler/select-all-toggler.component.d.ts +1 -1
  175. package/overflow-layout/directives/overflow-layout-popover-content.directive.d.ts +5 -6
  176. package/package.json +3 -3
  177. package/pagination/pagination.component.d.ts +44 -11
  178. package/popover/base/base-popover.class.d.ts +12 -3
  179. package/popover/popover.component.d.ts +8 -5
  180. package/product-switch/product-switch/product-switch.component.d.ts +4 -1
  181. package/schematics/add-dependencies/index.js +4 -4
  182. package/segmented-button/segmented-button.component.d.ts +6 -7
  183. package/select/select.component.d.ts +9 -6
  184. package/shellbar/shellbar-actions/shellbar-actions.component.d.ts +6 -3
  185. package/shellbar/shellbar.component.d.ts +1 -1
  186. package/slider/slider.component.d.ts +13 -4
  187. package/split-button/split-button.component.d.ts +11 -6
  188. package/splitter/splitter.component.d.ts +5 -2
  189. package/step-input/step-input.component.d.ts +12 -6
  190. package/switch/switch.component.d.ts +10 -4
  191. package/table/directives/table-row.directive.d.ts +2 -4
  192. package/table/table.component.d.ts +3 -4
  193. package/tabs/tab-item-expand/tab-item-expand.component.d.ts +4 -1
  194. package/tabs/tab-list.component.d.ts +10 -8
  195. package/text/text.component.d.ts +8 -2
  196. package/time/i18n/time-i18n.d.ts +2 -2
  197. package/token/token.component.d.ts +13 -7
  198. package/toolbar/toolbar.component.d.ts +10 -7
  199. package/tree/components/tree-item/tree-item.component.d.ts +28 -28
  200. package/tree/tree.component.d.ts +7 -7
  201. package/upload-collection/upload-collection-button-group/upload-collection-button-group.component.d.ts +24 -6
  202. package/upload-collection/upload-collection-form-item/upload-collection-form-item.component.d.ts +6 -3
  203. package/fundamental-ngx-core-v0.44.0-rc.2.tgz +0 -0
@@ -43,6 +43,83 @@ export class DatePickerComponent {
43
43
  this._messageTriggers = triggers;
44
44
  this._popoverFormMessage.triggers = triggers;
45
45
  }
46
+ /**
47
+ * @deprecated use i18n capabilities instead
48
+ * Aria-label for the datepicker input.
49
+ */
50
+ set dateInputLabel(value) {
51
+ console.warn("Property dateInputLabel is deprecated. Use i18n capabilities 'coreDatePicker.dateInputLabel' key instead.");
52
+ this._dateInputLabel = value;
53
+ }
54
+ get dateInputLabel() {
55
+ return this._dateInputLabel;
56
+ }
57
+ /**
58
+ * @deprecated use i18n capabilities instead
59
+ * Aria-label for the datepicker input.
60
+ */
61
+ set dateRangeInputLabel(value) {
62
+ console.warn("Property dateRangeInputLabel is deprecated. Use i18n capabilities 'coreDatePicker.dateRangeInputLabel' key instead.");
63
+ this._dateRangeInputLabel = value;
64
+ }
65
+ get dateRangeInputLabel() {
66
+ return this._dateRangeInputLabel;
67
+ }
68
+ /**
69
+ * @deprecated use i18n capabilities instead
70
+ * Aria-label for the button to show/hide the calendar.
71
+ */
72
+ set displayCalendarToggleLabel(value) {
73
+ console.warn("Property displayCalendarToggleLabel is deprecated. Use i18n capabilities 'coreDatePicker.displayCalendarToggleLabel' key instead.");
74
+ this._displayCalendarToggleLabel = value;
75
+ }
76
+ get displayCalendarToggleLabel() {
77
+ return this._displayCalendarToggleLabel;
78
+ }
79
+ /**
80
+ * @deprecated use i18n capabilities instead
81
+ * Value state "success" aria message.
82
+ */
83
+ set valueStateSuccessMessage(value) {
84
+ console.warn("Property valueStateSuccessMessage is deprecated. Use i18n capabilities 'coreDatePicker.valueStateSuccessMessage' key instead.");
85
+ this._valueStateSuccessMessage = value;
86
+ }
87
+ get valueStateSuccessMessage() {
88
+ return this._valueStateSuccessMessage;
89
+ }
90
+ /**
91
+ * @deprecated use i18n capabilities instead
92
+ * Value state "information" aria message.
93
+ */
94
+ set valueStateInformationMessage(value) {
95
+ console.warn("Property valueStateInformationMessage is deprecated. Use i18n capabilities 'coreDatePicker.valueStateInformationMessage' key instead.");
96
+ this._valueStateInformationMessage = value;
97
+ }
98
+ get valueStateInformationMessage() {
99
+ return this._valueStateInformationMessage;
100
+ }
101
+ /**
102
+ * @deprecated use i18n capabilities instead
103
+ * Value state "warning" aria message.
104
+ */
105
+ set valueStateWarningMessage(value) {
106
+ console.warn("Property valueStateWarningMessage is deprecated. Use i18n capabilities 'coreDatePicker.valueStateWarningMessage' key instead.");
107
+ this._valueStateWarningMessage = value;
108
+ }
109
+ get valueStateWarningMessage() {
110
+ return this._valueStateWarningMessage;
111
+ }
112
+ /**
113
+ * @deprecated use i18n capabilities instead
114
+ * Value state "error" aria message.
115
+ */
116
+ set valueStateErrorMessage(value) {
117
+ console.warn("Property valueStateErrorMessage is deprecated. Use i18n capabilities 'coreDatePicker.valueStateErrorMessage' key instead.");
118
+ this._valueStateErrorMessage = value;
119
+ }
120
+ get valueStateErrorMessage() {
121
+ return this._valueStateErrorMessage;
122
+ }
46
123
  /**
47
124
  * The state of the form control - applies css classes.
48
125
  * Also, this is applied to message.
@@ -132,8 +209,6 @@ export class DatePickerComponent {
132
209
  this.showTodayButton = false;
133
210
  /** Label for Today-Selection-Button */
134
211
  this.todayButtonLabel = 'Today';
135
- /** @hidden */
136
- this._state = 'default';
137
212
  /**
138
213
  * Whether AddOn Button should be focusable
139
214
  * @default true
@@ -199,6 +274,8 @@ export class DatePickerComponent {
199
274
  this._onDestroy$ = new Subject();
200
275
  /** @hidden */
201
276
  this._subscriptions = new Subscription();
277
+ /** @hidden */
278
+ this._state = 'default';
202
279
  /**
203
280
  * Function used to disable certain dates in the calendar.
204
281
  * @param date date representation
@@ -315,7 +392,10 @@ export class DatePickerComponent {
315
392
  if (dates && (startChanged || endChanged)) {
316
393
  const shouldClose = this.closeOnDateChoose && dates.end !== null;
317
394
  this._inputFieldDate = this._formatDateRange(dates);
318
- this.selectedRangeDate = { start: dates.start, end: dates.end };
395
+ this.selectedRangeDate = {
396
+ start: dates.start,
397
+ end: dates.end
398
+ };
319
399
  this.selectedRangeDateChange.emit(this.selectedRangeDate);
320
400
  this.onChange(this.selectedRangeDate);
321
401
  this._isInvalidDateInput = !this.isModelValid();
@@ -335,7 +415,10 @@ export class DatePickerComponent {
335
415
  this.closeFromCalendar();
336
416
  }
337
417
  else if (this.type === 'range') {
338
- this.handleRangeDateChange({ start: todayDate, end: todayDate });
418
+ this.handleRangeDateChange({
419
+ start: todayDate,
420
+ end: todayDate
421
+ });
339
422
  }
340
423
  }
341
424
  /**
@@ -385,7 +468,10 @@ export class DatePickerComponent {
385
468
  if (!selected) {
386
469
  this._inputFieldDate = '';
387
470
  this._refreshCurrentlyDisplayedCalendarDate(this._dateTimeAdapter.today());
388
- this.selectedRangeDate = { start: null, end: null };
471
+ this.selectedRangeDate = {
472
+ start: null,
473
+ end: null
474
+ };
389
475
  this.selectedDate = null;
390
476
  this._changeDetectionRef.detectChanges();
391
477
  return;
@@ -458,7 +544,10 @@ export class DatePickerComponent {
458
544
  else {
459
545
  if (!dateStr) {
460
546
  this._isInvalidDateInput = !this.allowNull;
461
- this.selectedRangeDate = { start: null, end: null };
547
+ this.selectedRangeDate = {
548
+ start: null,
549
+ end: null
550
+ };
462
551
  this._refreshCurrentlyDisplayedCalendarDate(this.selectedRangeDate.start);
463
552
  this.onChange(this.selectedRangeDate);
464
553
  this.selectedRangeDateChange.emit(this.selectedRangeDate);
@@ -596,7 +685,7 @@ export class DatePickerComponent {
596
685
  registerFormItemControl(DatePickerComponent),
597
686
  PopoverFormMessageService,
598
687
  PopoverService
599
- ], viewQueries: [{ propertyName: "_calendarComponent", first: true, predicate: CalendarComponent, descendants: true }, { propertyName: "_inputGroupElement", first: true, predicate: ["inputGroupComponent"], descendants: true, read: ElementRef }, { propertyName: "_inputElement", first: true, predicate: InputGroupInputDirective, descendants: true, read: ElementRef }], ngImport: i0, template: "<fd-popover\n [(isOpen)]=\"isOpen\"\n (isOpenChange)=\"_onOpenStateChanged($event)\"\n [triggers]=\"[]\"\n [placement]=\"placement\"\n [disabled]=\"disabled\"\n [focusTrapped]=\"true\"\n [focusAutoCapture]=\"false\"\n [appendTo]=\"appendTo\"\n>\n <fd-popover-control>\n <fd-input-group\n #inputGroupComponent\n [state]=\"state\"\n [disabled]=\"disabled\"\n [isControl]=\"true\"\n [button]=\"true\"\n [buttonFocusable]=\"buttonFocusable\"\n glyph=\"appointment-2\"\n [isExpanded]=\"isOpen\"\n [glyphAriaLabel]=\"displayCalendarToggleLabel || ('coreDatePicker.displayCalendarToggleLabel' | fdTranslate)\"\n [iconTitle]=\"displayCalendarToggleLabel || ('coreDatePicker.displayCalendarToggleLabel' | fdTranslate)\"\n (addOnButtonClicked)=\"toggleCalendar()\"\n >\n <input\n type=\"text\"\n class=\"fd-input\"\n fd-input-group-input\n [disabled]=\"disabled\"\n [placeholder]=\"placeholder\"\n [attr.id]=\"inputId\"\n aria-haspopup=\"grid\"\n aria-autocomplete=\"none\"\n [attr.aria-expanded]=\"isOpen\"\n [attr.aria-labelledby]=\"ariaLabelledBy\"\n [attr.aria-label]=\"_dateInputArialLabel || (_dateInputArialLabelKey | fdTranslate)\"\n [attr.aria-required]=\"required\"\n [attr.aria-describedby]=\"_formValueStateMessageId\"\n [ngModel]=\"_inputFieldDate\"\n (keyup.enter)=\"handleInputChange($any($event.target).value, false)\"\n (ngModelChange)=\"handleInputChange($event, true)\"\n (blur)=\"_onBlur($event)\"\n />\n </fd-input-group>\n </fd-popover-control>\n <fd-popover-body [attr.aria-expanded]=\"isOpen\" [attr.aria-hidden]=\"!isOpen\">\n <fd-form-message [embedded]=\"true\" *ngIf=\"_message\" [type]=\"state\">\n {{ _message }}\n </fd-form-message>\n <ng-content></ng-content>\n\n <fd-calendar\n (closeCalendar)=\"closeFromCalendar()\"\n [activeView]=\"activeView\"\n [markWeekends]=\"markWeekends\"\n [specialDaysRules]=\"specialDaysRules\"\n [showWeekNumbers]=\"showWeekNumbers\"\n [aggregatedYearGrid]=\"aggregatedYearGrid\"\n [yearGrid]=\"yearGrid\"\n (activeViewChange)=\"handleCalendarActiveViewChange($event)\"\n [calType]=\"type\"\n [rangeHoverEffect]=\"rangeHoverEffect\"\n [disableFunction]=\"disableFunction\"\n [disableRangeStartFunction]=\"disableRangeStartFunction\"\n [disableRangeEndFunction]=\"disableRangeEndFunction\"\n [selectedDate]=\"selectedDate\"\n [selectedRangeDate]=\"selectedRangeDate\"\n (selectedRangeDateChange)=\"handleRangeDateChange($event)\"\n (selectedDateChange)=\"handleSingleDateChange($event)\"\n [startingDayOfWeek]=\"startingDayOfWeek\"\n [previousButtonDisableFunction]=\"previousButtonDisableFunction\"\n [nextButtonDisableFunction]=\"nextButtonDisableFunction\"\n ></fd-calendar>\n\n <div *ngIf=\"showTodayButton\" fd-bar barDesign=\"footer\">\n <div fd-bar-right>\n <fd-bar-element>\n <button fd-button [label]=\"todayButtonLabel\" (click)=\"onTodayButtonClick()\"></button>\n </fd-bar-element>\n </div>\n </div>\n </fd-popover-body>\n</fd-popover>\n\n<div style=\"display: none\" aria-hidden=\"true\">\n <div [attr.id]=\"_formValueStateMessageId\" aria-atomic=\"true\" aria-live=\"assertive\">\n <ng-container [ngSwitch]=\"state\">\n <ng-container *ngSwitchCase=\"'success'\">{{\n valueStateSuccessMessage || ('coreDatePicker.valueStateSuccessMessage' | fdTranslate)\n }}</ng-container>\n <ng-container *ngSwitchCase=\"'information'\">{{\n valueStateInformationMessage || ('coreDatePicker.valueStateInformationMessage' | fdTranslate)\n }}</ng-container>\n <ng-container *ngSwitchCase=\"'warning'\">{{\n valueStateWarningMessage || ('coreDatePicker.valueStateWarningMessage' | fdTranslate)\n }}</ng-container>\n <ng-container *ngSwitchCase=\"'error'\">{{\n valueStateErrorMessage || ('coreDatePicker.valueStateErrorMessage' | fdTranslate)\n }}</ng-container>\n </ng-container>\n {{ _message }}\n </div>\n</div>\n", styles: [".fd-date-picker-custom{display:inline-block}.fd-date-picker-custom fd-popover{display:block}.fd-date-picker-custom fd-calendar{border-radius:.25rem;border-radius:var(--sapElement_BorderCornerRadius, .25rem)}\n"], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i3.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "component", type: i4.PopoverControlComponent, selector: "fd-popover-control" }, { kind: "component", type: i4.PopoverBodyComponent, selector: "fd-popover-body" }, { kind: "component", type: i4.PopoverComponent, selector: "fd-popover", inputs: ["title", "trigger", "fixedPosition", "id", "mobile", "mobileConfig"] }, { kind: "component", type: i5.CalendarComponent, selector: "fd-calendar", inputs: ["selectedDate", "markWeekends", "showWeekNumbers", "mobileLandscape", "mobilePortrait", "selectedRangeDate", "activeView", "startingDayOfWeek", "calType", "id", "specialDaysRules", "yearGrid", "aggregatedYearGrid", "rangeHoverEffect", "previousButtonDisableFunction", "nextButtonDisableFunction", "escapeFocusFunction", "disableFunction", "disableRangeStartFunction", "disableRangeEndFunction"], outputs: ["activeViewChange", "selectedDateChange", "selectedRangeDateChange", "isValidDateChange", "closeCalendar", "closeClicked"] }, { kind: "directive", type: i6.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: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i7.InputGroupComponent, selector: "fd-input-group", inputs: ["inputTemplate", "placement", "required", "inline", "placeholder", "addOnText", "buttonFocusable", "type", "glyph", "button", "disabled", "readonly", "state", "isControl", "showFocus", "isExpanded", "glyphAriaLabel", "iconTitle", "ariaLabelledby", "ariaLabelledBy"], outputs: ["addOnButtonClicked", "search"] }, { kind: "directive", type: i7.InputGroupInputDirective, selector: "[fdInputGroupInput], [fd-input-group-input]", inputs: ["class"] }, { kind: "component", type: i8.ButtonComponent, selector: "button[fd-button], a[fd-button]", inputs: ["class"], exportAs: ["fd-button"] }, { kind: "component", type: i2.FormMessageComponent, selector: "fd-form-message", inputs: ["type", "static", "embedded", "class"] }, { kind: "component", type: i9.BarComponent, selector: "[fd-bar]", inputs: ["class", "barDesign", "inPage", "inHomePage", "size"] }, { kind: "directive", type: i9.BarRightDirective, selector: "[fd-bar-right]" }, { kind: "directive", type: i9.BarElementDirective, selector: "fd-bar-element", inputs: ["fullWidth", "isTitle"] }, { kind: "pipe", type: i10.FdTranslatePipe, name: "fdTranslate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
688
+ ], viewQueries: [{ propertyName: "_calendarComponent", first: true, predicate: CalendarComponent, descendants: true }, { propertyName: "_inputGroupElement", first: true, predicate: ["inputGroupComponent"], descendants: true, read: ElementRef }, { propertyName: "_inputElement", first: true, predicate: InputGroupInputDirective, descendants: true, read: ElementRef }], ngImport: i0, template: "<fd-popover\n [(isOpen)]=\"isOpen\"\n (isOpenChange)=\"_onOpenStateChanged($event)\"\n [triggers]=\"[]\"\n [placement]=\"placement\"\n [disabled]=\"disabled\"\n [focusTrapped]=\"true\"\n [focusAutoCapture]=\"false\"\n [appendTo]=\"appendTo\"\n>\n <fd-popover-control>\n <fd-input-group\n #inputGroupComponent\n [state]=\"state\"\n [disabled]=\"disabled\"\n [isControl]=\"true\"\n [button]=\"true\"\n [buttonFocusable]=\"buttonFocusable\"\n glyph=\"appointment-2\"\n [isExpanded]=\"isOpen\"\n [glyphAriaLabel]=\"displayCalendarToggleLabel || ('coreDatePicker.displayCalendarToggleLabel' | fdTranslate)\"\n [iconTitle]=\"displayCalendarToggleLabel || ('coreDatePicker.displayCalendarToggleLabel' | fdTranslate)\"\n (addOnButtonClicked)=\"toggleCalendar()\"\n >\n <input\n type=\"text\"\n class=\"fd-input\"\n fd-input-group-input\n [disabled]=\"disabled\"\n [placeholder]=\"placeholder\"\n [attr.id]=\"inputId\"\n aria-haspopup=\"grid\"\n aria-autocomplete=\"none\"\n [attr.aria-expanded]=\"isOpen\"\n [attr.aria-labelledby]=\"ariaLabelledBy\"\n [attr.aria-label]=\"_dateInputArialLabel || (_dateInputArialLabelKey | fdTranslate)\"\n [attr.aria-required]=\"required\"\n [attr.aria-describedby]=\"_formValueStateMessageId\"\n [ngModel]=\"_inputFieldDate\"\n (keyup.enter)=\"handleInputChange($any($event.target).value, false)\"\n (ngModelChange)=\"handleInputChange($event, true)\"\n (blur)=\"_onBlur($event)\"\n />\n </fd-input-group>\n </fd-popover-control>\n <fd-popover-body [attr.aria-expanded]=\"isOpen\" [attr.aria-hidden]=\"!isOpen\">\n <fd-form-message [embedded]=\"true\" *ngIf=\"_message\" [type]=\"state\">\n {{ _message }}\n </fd-form-message>\n <ng-content></ng-content>\n\n <fd-calendar\n (closeCalendar)=\"closeFromCalendar()\"\n [activeView]=\"activeView\"\n [markWeekends]=\"markWeekends\"\n [specialDaysRules]=\"specialDaysRules\"\n [showWeekNumbers]=\"showWeekNumbers\"\n [aggregatedYearGrid]=\"aggregatedYearGrid\"\n [yearGrid]=\"yearGrid\"\n (activeViewChange)=\"handleCalendarActiveViewChange($event)\"\n [calType]=\"type\"\n [rangeHoverEffect]=\"rangeHoverEffect\"\n [disableFunction]=\"disableFunction\"\n [disableRangeStartFunction]=\"disableRangeStartFunction\"\n [disableRangeEndFunction]=\"disableRangeEndFunction\"\n [selectedDate]=\"selectedDate\"\n [selectedRangeDate]=\"selectedRangeDate\"\n (selectedRangeDateChange)=\"handleRangeDateChange($event)\"\n (selectedDateChange)=\"handleSingleDateChange($event)\"\n [startingDayOfWeek]=\"startingDayOfWeek\"\n [previousButtonDisableFunction]=\"previousButtonDisableFunction\"\n [nextButtonDisableFunction]=\"nextButtonDisableFunction\"\n ></fd-calendar>\n\n <div *ngIf=\"showTodayButton\" fd-bar barDesign=\"footer\">\n <div fd-bar-right>\n <fd-bar-element>\n <button fd-button [label]=\"todayButtonLabel\" (click)=\"onTodayButtonClick()\"></button>\n </fd-bar-element>\n </div>\n </div>\n </fd-popover-body>\n</fd-popover>\n\n<div style=\"display: none\" aria-hidden=\"true\">\n <div [attr.id]=\"_formValueStateMessageId\" aria-atomic=\"true\" aria-live=\"assertive\">\n <ng-container [ngSwitch]=\"state\">\n <ng-container *ngSwitchCase=\"'success'\">{{\n valueStateSuccessMessage || ('coreDatePicker.valueStateSuccessMessage' | fdTranslate)\n }}</ng-container>\n <ng-container *ngSwitchCase=\"'information'\">{{\n valueStateInformationMessage || ('coreDatePicker.valueStateInformationMessage' | fdTranslate)\n }}</ng-container>\n <ng-container *ngSwitchCase=\"'warning'\">{{\n valueStateWarningMessage || ('coreDatePicker.valueStateWarningMessage' | fdTranslate)\n }}</ng-container>\n <ng-container *ngSwitchCase=\"'error'\">{{\n valueStateErrorMessage || ('coreDatePicker.valueStateErrorMessage' | fdTranslate)\n }}</ng-container>\n </ng-container>\n {{ _message }}\n </div>\n</div>\n", styles: [".fd-date-picker-custom{display:inline-block}.fd-date-picker-custom fd-popover{display:block}.fd-date-picker-custom fd-calendar{border-radius:.25rem;border-radius:var(--sapElement_BorderCornerRadius, .25rem)}\n"], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i3.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "component", type: i4.PopoverControlComponent, selector: "fd-popover-control" }, { kind: "component", type: i4.PopoverBodyComponent, selector: "fd-popover-body" }, { kind: "component", type: i4.PopoverComponent, selector: "fd-popover", inputs: ["title", "trigger", "fixedPosition", "id", "mobile", "mobileConfig"] }, { kind: "component", type: i5.CalendarComponent, selector: "fd-calendar", inputs: ["selectedDate", "markWeekends", "showWeekNumbers", "mobileLandscape", "mobilePortrait", "selectedRangeDate", "activeView", "startingDayOfWeek", "calType", "id", "specialDaysRules", "yearGrid", "aggregatedYearGrid", "rangeHoverEffect", "previousButtonDisableFunction", "nextButtonDisableFunction", "escapeFocusFunction", "disableFunction", "disableRangeStartFunction", "disableRangeEndFunction"], outputs: ["activeViewChange", "selectedDateChange", "selectedRangeDateChange", "isValidDateChange", "closeCalendar", "closeClicked"] }, { kind: "directive", type: i6.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: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i7.InputGroupComponent, selector: "fd-input-group", inputs: ["inputTemplate", "placement", "required", "inline", "placeholder", "addOnText", "buttonFocusable", "type", "glyph", "button", "disabled", "readonly", "state", "isControl", "showFocus", "isExpanded", "glyphAriaLabel", "iconTitle", "ariaLabelledby", "ariaLabelledBy"], outputs: ["addOnButtonClicked", "search"] }, { kind: "directive", type: i7.InputGroupInputDirective, selector: "[fdInputGroupInput], [fd-input-group-input]", inputs: ["class"] }, { kind: "component", type: i8.ButtonComponent, selector: "button[fd-button], a[fd-button]", inputs: ["class"], exportAs: ["fd-button"] }, { kind: "component", type: i2.FormMessageComponent, selector: "fd-form-message", inputs: ["type", "static", "embedded", "class"] }, { kind: "component", type: i9.BarComponent, selector: "[fd-bar]", inputs: ["class", "barDesign", "inPage", "inHomePage", "size"] }, { kind: "directive", type: i9.BarRightDirective, selector: "[fd-bar-right]" }, { kind: "directive", type: i9.BarElementDirective, selector: "fd-bar-element", inputs: ["isTitle", "fullWidth"] }, { kind: "pipe", type: i10.FdTranslatePipe, name: "fdTranslate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
600
689
  }
601
690
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.0", ngImport: i0, type: DatePickerComponent, decorators: [{
602
691
  type: Component,
@@ -719,10 +808,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.0", ngImpor
719
808
  args: [CalendarComponent]
720
809
  }], _inputGroupElement: [{
721
810
  type: ViewChild,
722
- args: ['inputGroupComponent', { read: ElementRef }]
811
+ args: ['inputGroupComponent', {
812
+ read: ElementRef
813
+ }]
723
814
  }], _inputElement: [{
724
815
  type: ViewChild,
725
- args: [InputGroupInputDirective, { read: ElementRef }]
816
+ args: [InputGroupInputDirective, {
817
+ read: ElementRef
818
+ }]
726
819
  }], disableFunction: [{
727
820
  type: Input
728
821
  }], disableRangeStartFunction: [{
@@ -730,4 +823,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.0", ngImpor
730
823
  }], disableRangeEndFunction: [{
731
824
  type: Input
732
825
  }] } });
733
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1waWNrZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy9jb3JlL3NyYy9saWIvZGF0ZS1waWNrZXIvZGF0ZS1waWNrZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vbGlicy9jb3JlL3NyYy9saWIvZGF0ZS1waWNrZXIvZGF0ZS1waWNrZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVILHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osVUFBVSxFQUNWLE1BQU0sRUFDTixLQUFLLEVBR0wsUUFBUSxFQUNSLE1BQU0sRUFDTixTQUFTLEVBQ1QsaUJBQWlCLEVBQ3BCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBd0IsYUFBYSxFQUFFLGlCQUFpQixFQUFhLE1BQU0sZ0JBQWdCLENBQUM7QUFDbkcsT0FBTyxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDN0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRzlELE9BQU8sRUFDSCxpQkFBaUIsRUFHakIsU0FBUyxFQUlaLE1BQU0sZ0NBQWdDLENBQUM7QUFDeEMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGVBQWUsRUFBbUIsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNyRyxPQUFPLEVBQW1CLHlCQUF5QixFQUFFLHVCQUF1QixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDakgsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQy9ELE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBRTdFLE9BQU8sRUFBRSxvQ0FBb0MsRUFBRSxNQUFNLFVBQVUsQ0FBQzs7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QixLQUFLO2dCQVFHLFlBQVk7c0JBRHBCLE1BQU07Z0JBS0Usa0JBQWtCO3NCQUQxQixNQUFNO2dCQUtFLHVCQUF1QjtzQkFEL0IsTUFBTTtnQkFLRSxnQkFBZ0I7c0JBRHhCLE1BQU07Z0JBS1Asa0JBQWtCO3NCQURqQixTQUFTO3VCQUFDLGlCQUFpQjtnQkFLNUIsa0JBQWtCO3NCQURqQixTQUFTO3VCQUFDLHFCQUFxQixFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRTtnQkFLdEQsYUFBYTtzQkFEWixTQUFTO3VCQUFDLHdCQUF3QixFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRTtnQkF1QnpELGVBQWU7c0JBRGQsS0FBSztnQkFRTix5QkFBeUI7c0JBRHhCLEtBQUs7Z0JBUU4sdUJBQXVCO3NCQUR0QixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBBZnRlclZpZXdJbml0LFxuICAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIENvbXBvbmVudCxcbiAgICBFbGVtZW50UmVmLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBmb3J3YXJkUmVmLFxuICAgIEluamVjdCxcbiAgICBJbnB1dCxcbiAgICBPbkRlc3Ryb3ksXG4gICAgT25Jbml0LFxuICAgIE9wdGlvbmFsLFxuICAgIE91dHB1dCxcbiAgICBWaWV3Q2hpbGQsXG4gICAgVmlld0VuY2Fwc3VsYXRpb25cbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMSURBVE9SUywgTkdfVkFMVUVfQUNDRVNTT1IsIFZhbGlkYXRvciB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFN1YmplY3QsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgY29lcmNlQm9vbGVhblByb3BlcnR5IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvZXJjaW9uJztcblxuaW1wb3J0IHsgUGxhY2VtZW50LCBTcGVjaWFsRGF5UnVsZSB9IGZyb20gJ0BmdW5kYW1lbnRhbC1uZ3gvY29yZS9zaGFyZWQnO1xuaW1wb3J0IHtcbiAgICBDYWxlbmRhckNvbXBvbmVudCxcbiAgICBDYWxlbmRhclR5cGUsXG4gICAgQ2FsZW5kYXJZZWFyR3JpZCxcbiAgICBEYXRlUmFuZ2UsXG4gICAgRGF5c09mV2VlayxcbiAgICBGZENhbGVuZGFyVmlldyxcbiAgICBOYXZpZ2F0aW9uQnV0dG9uRGlzYWJsZUZ1bmN0aW9uXG59IGZyb20gJ0BmdW5kYW1lbnRhbC1uZ3gvY29yZS9jYWxlbmRhcic7XG5pbXBvcnQgeyBEQVRFX1RJTUVfRk9STUFUUywgRGF0ZXRpbWVBZGFwdGVyLCBEYXRlVGltZUZvcm1hdHMgfSBmcm9tICdAZnVuZGFtZW50YWwtbmd4L2NvcmUvZGF0ZXRpbWUnO1xuaW1wb3J0IHsgRm9ybUl0ZW1Db250cm9sLCBQb3BvdmVyRm9ybU1lc3NhZ2VTZXJ2aWNlLCByZWdpc3RlckZvcm1JdGVtQ29udHJvbCB9IGZyb20gJ0BmdW5kYW1lbnRhbC1uZ3gvY29yZS9mb3JtJztcbmltcG9ydCB7IFBvcG92ZXJTZXJ2aWNlIH0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9jb3JlL3BvcG92ZXInO1xuaW1wb3J0IHsgSW5wdXRHcm91cElucHV0RGlyZWN0aXZlIH0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9jb3JlL2lucHV0LWdyb3VwJztcblxuaW1wb3J0IHsgY3JlYXRlTWlzc2luZ0RhdGVJbXBsZW1lbnRhdGlvbkVycm9yIH0gZnJvbSAnLi9lcnJvcnMnO1xuaW1wb3J0IHsgTnVsbGFibGUgfSBmcm9tICdAZnVuZGFtZW50YWwtbmd4L2Nkay91dGlscyc7XG5pbXBvcnQgeyBGb3JtU3RhdGVzIH0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9jZGsvZm9ybXMnO1xuXG5sZXQgZGF0ZVBpY2tlckNvdW50ZXIgPSAwO1xuXG4vKipcbiAqIFRoZSBkYXRldGltZSBwaWNrZXIgY29tcG9uZW50IGlzIGFuIG9waW5pb25hdGVkIGNvbXBvc2l0aW9uIG9mIHRoZSBmZC1wb3BvdmVyIGFuZFxuICogZmQtY2FsZW5kYXIgY29tcG9uZW50cyB0byBhY2NvbXBsaXNoIHRoZSBVSSBwYXR0ZXJuIGZvciBwaWNraW5nIGEgZGF0ZS5cbiAqXG4gKiBTdXBwb3J0cyBBbmd1bGFyIEZvcm1zLlxuICogYGBgaHRtbFxuICogPGZkLWRhdGUtcGlja2VyIFsobmdNb2RlbCldPVwiZGF0ZVwiPjwvZmQtZGF0ZS1waWNrZXI+XG4gKiBgYGBcbiAqXG4gKi9cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnZmQtZGF0ZS1waWNrZXInLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9kYXRlLXBpY2tlci5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vZGF0ZS1waWNrZXIuY29tcG9uZW50LnNjc3MnXSxcbiAgICBob3N0OiB7XG4gICAgICAgICcoYmx1ciknOiAnb25Ub3VjaGVkKCknLFxuICAgICAgICAnW2NsYXNzLmZkLWRhdGUtcGlja2VyXSc6ICd0cnVlJyxcbiAgICAgICAgJ1tjbGFzcy5mZC1kYXRlLXBpY2tlci1jdXN0b21dJzogJ2lubGluZSdcbiAgICB9LFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgICAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IERhdGVQaWNrZXJDb21wb25lbnQpLFxuICAgICAgICAgICAgbXVsdGk6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgcHJvdmlkZTogTkdfVkFMSURBVE9SUyxcbiAgICAgICAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IERhdGVQaWNrZXJDb21wb25lbnQpLFxuICAgICAgICAgICAgbXVsdGk6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgcmVnaXN0ZXJGb3JtSXRlbUNvbnRyb2woRGF0ZVBpY2tlckNvbXBvbmVudCksXG4gICAgICAgIFBvcG92ZXJGb3JtTWVzc2FnZVNlcnZpY2UsXG4gICAgICAgIFBvcG92ZXJTZXJ2aWNlXG4gICAgXSxcbiAgICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIERhdGVQaWNrZXJDb21wb25lbnQ8RD5cbiAgICBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBBZnRlclZpZXdJbml0LCBDb250cm9sVmFsdWVBY2Nlc3NvciwgVmFsaWRhdG9yLCBGb3JtSXRlbUNvbnRyb2xcbntcbiAgICAvKiogVGhlIHR5cGUgb2YgY2FsZW5kYXIsICdzaW5nbGUnIGZvciBzaW5nbGUgZGF0ZSBzZWxlY3Rpb24gb3IgJ3JhbmdlJyBmb3IgYSByYW5nZSBvZiBkYXRlcy4gKi9cbiAgICBASW5wdXQoKVxuICAgIHR5cGU6IENhbGVuZGFyVHlwZSA9ICdzaW5nbGUnO1xuXG4gICAgLyoqIERhdGUgcGlja2VyIGlucHV0IHBsYWNlaG9sZGVyIHN0cmluZyAqL1xuICAgIEBJbnB1dCgpXG4gICAgcGxhY2Vob2xkZXIgPSAnJztcblxuICAgIC8qKiBJRCBhdHRyaWJ1dGUgZm9yIGlucHV0IGVsZW1lbnQgaW5zaWRlIERhdGVQaWNrZXIgY29tcG9uZW50ICovXG4gICAgQElucHV0KClcbiAgICBpbnB1dElkOiBzdHJpbmc7XG5cbiAgICAvKiogSWYgaXQgaXMgbWFuZGF0b3J5IGZpZWxkICovXG4gICAgQElucHV0KClcbiAgICByZXF1aXJlZCA9IGZhbHNlO1xuXG4gICAgLyoqIFRleHQgZGlzcGxheWVkIGluIG1lc3NhZ2UgKi9cbiAgICBASW5wdXQoKVxuICAgIHNldCBtZXNzYWdlKG1lc3NhZ2U6IHN0cmluZykge1xuICAgICAgICB0aGlzLl9tZXNzYWdlID0gbWVzc2FnZTtcbiAgICAgICAgdGhpcy5fcG9wb3ZlckZvcm1NZXNzYWdlLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgX21lc3NhZ2U6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gICAgLyoqIFRoZSB0cmlnZ2VyIGV2ZW50cyB0aGF0IHdpbGwgb3Blbi9jbG9zZSB0aGUgbWVzc2FnZSBib3guXG4gICAgICogIEFjY2VwdHMgYW55IFtIVE1MIERPTSBFdmVudHNdKGh0dHBzOi8vd3d3Lnczc2Nob29scy5jb20vanNyZWYvZG9tX29ial9ldmVudC5hc3ApLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgc2V0IG1lc3NhZ2VUcmlnZ2Vycyh0cmlnZ2Vyczogc3RyaW5nW10pIHtcbiAgICAgICAgdGhpcy5fbWVzc2FnZVRyaWdnZXJzID0gdHJpZ2dlcnM7XG4gICAgICAgIHRoaXMuX3BvcG92ZXJGb3JtTWVzc2FnZS50cmlnZ2VycyA9IHRyaWdnZXJzO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgX21lc3NhZ2VUcmlnZ2Vyczogc3RyaW5nW10gPSBbJ2ZvY3VzaW4nLCAnZm9jdXNvdXQnXTtcblxuICAgIC8qKiBUaGUgY3VycmVudGx5IHNlbGVjdGVkIENhbGVuZGFyRGF5IG1vZGVsICovXG4gICAgQElucHV0KClcbiAgICBzZWxlY3RlZERhdGU6IE51bGxhYmxlPEQ+O1xuXG4gICAgLyoqIFRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgRmREYXRlcyBtb2RlbCBzdGFydCBhbmQgZW5kIGluIHJhbmdlIG1vZGUuICovXG4gICAgQElucHV0KClcbiAgICBzZWxlY3RlZFJhbmdlRGF0ZTogRGF0ZVJhbmdlPEQ+ID0geyBzdGFydDogbnVsbCwgZW5kOiBudWxsIH07XG5cbiAgICAvKiogVGhlIGRheSBvZiB0aGUgd2VlayB0aGUgY2FsZW5kYXIgc2hvdWxkIHN0YXJ0IG9uLiAxIHJlcHJlc2VudHMgU3VuZGF5LCAyIGlzIE1vbmRheSwgMyBpcyBUdWVzZGF5LCBhbmQgc28gb24uICovXG4gICAgQElucHV0KClcbiAgICBzdGFydGluZ0RheU9mV2VlazogRGF5c09mV2VlaztcblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdXNlciB3YW50cyB0byBtYXJrIGRheSBjZWxscyBvbiBob3Zlci5cbiAgICAgKiBXb3JrcyBvbmx5IG9uIHJhbmdlIG1vZGUsIHdoZW4gc3RhcnQgZGF0ZSBpcyBzZWxlY3RlZCBvbiBEYXkgVmlldy5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHJhbmdlSG92ZXJFZmZlY3QgPSBmYWxzZTtcblxuICAgIC8qKiBXaGV0aGVyIHRvIHZhbGlkYXRlIHRoZSBkYXRlIHBpY2tlciBpbnB1dC4gKi9cbiAgICBASW5wdXQoKVxuICAgIHVzZVZhbGlkYXRpb24gPSB0cnVlO1xuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgdXNlIGkxOG4gY2FwYWJpbGl0aWVzIGluc3RlYWRcbiAgICAgKiBBcmlhLWxhYmVsIGZvciB0aGUgZGF0ZXBpY2tlciBpbnB1dC5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIGRhdGVJbnB1dExhYmVsOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCB1c2UgaTE4biBjYXBhYmlsaXRpZXMgaW5zdGVhZFxuICAgICAqIEFyaWEtbGFiZWwgZm9yIHRoZSBkYXRlcGlja2VyIGlucHV0LlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgZGF0ZVJhbmdlSW5wdXRMYWJlbDogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgdXNlIGkxOG4gY2FwYWJpbGl0aWVzIGluc3RlYWRcbiAgICAgKiBBcmlhLWxhYmVsIGZvciB0aGUgYnV0dG9uIHRvIHNob3cvaGlkZSB0aGUgY2FsZW5kYXIuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBkaXNwbGF5Q2FsZW5kYXJUb2dnbGVMYWJlbDogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgdXNlIGkxOG4gY2FwYWJpbGl0aWVzIGluc3RlYWRcbiAgICAgKiBWYWx1ZSBzdGF0ZSBcInN1Y2Nlc3NcIiBhcmlhIG1lc3NhZ2UuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICB2YWx1ZVN0YXRlU3VjY2Vzc01lc3NhZ2U6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIHVzZSBpMThuIGNhcGFiaWxpdGllcyBpbnN0ZWFkXG4gICAgICogVmFsdWUgc3RhdGUgXCJpbmZvcm1hdGlvblwiIGFyaWEgbWVzc2FnZS5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHZhbHVlU3RhdGVJbmZvcm1hdGlvbk1lc3NhZ2U6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIHVzZSBpMThuIGNhcGFiaWxpdGllcyBpbnN0ZWFkXG4gICAgICogVmFsdWUgc3RhdGUgXCJ3YXJuaW5nXCIgYXJpYSBtZXNzYWdlLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgdmFsdWVTdGF0ZVdhcm5pbmdNZXNzYWdlOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCB1c2UgaTE4biBjYXBhYmlsaXRpZXMgaW5zdGVhZFxuICAgICAqIFZhbHVlIHN0YXRlIFwiZXJyb3JcIiBhcmlhIG1lc3NhZ2UuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICB2YWx1ZVN0YXRlRXJyb3JNZXNzYWdlOiBzdHJpbmc7XG5cbiAgICAvKiogV2hldGhlciBhIG51bGwgaW5wdXQgaXMgY29uc2lkZXJlZCB2YWxpZC4gKi9cbiAgICBASW5wdXQoKVxuICAgIGFsbG93TnVsbCA9IHRydWU7XG5cbiAgICAvKiogQWN0dWFsbHkgc2hvd24gYWN0aXZlIHZpZXcgb25lIG9mICdkYXknIHwgJ21vbnRoJyB8ICd5ZWFyJyBpbiBjYWxlbmRhciBjb21wb25lbnQqL1xuICAgIEBJbnB1dCgpXG4gICAgYWN0aXZlVmlldzogRmRDYWxlbmRhclZpZXcgPSAnZGF5JztcblxuICAgIC8qKlxuICAgICAqICBUaGUgcGxhY2VtZW50IG9mIHRoZSBwb3BvdmVyLiBJdCBjYW4gYmUgb25lIG9mOiB0b3AsIHRvcC1zdGFydCwgdG9wLWVuZCwgYm90dG9tLFxuICAgICAqICBib3R0b20tc3RhcnQsIGJvdHRvbS1lbmQsIHJpZ2h0LCByaWdodC1zdGFydCwgcmlnaHQtZW5kLCBsZWZ0LCBsZWZ0LXN0YXJ0LCBsZWZ0LWVuZC5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHBsYWNlbWVudDogUGxhY2VtZW50ID0gJ2JvdHRvbS1zdGFydCc7XG5cbiAgICAvKiogVGhlIGVsZW1lbnQgdG8gd2hpY2ggdGhlIHBvcG92ZXIgc2hvdWxkIGJlIGFwcGVuZGVkLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgYXBwZW5kVG86IEVsZW1lbnRSZWY7XG5cbiAgICAvKiogV2hldGhlciB0aGUgZGF0ZSBwaWNrZXIgaXMgZGlzYWJsZWQuICovXG4gICAgQElucHV0KClcbiAgICBkaXNhYmxlZDogYm9vbGVhbjtcblxuICAgIC8qKiBEZWZpbmVzIGlmIGRhdGUgcGlja2VyIHNob3VsZCBiZSBjbG9zZWQgYWZ0ZXIgZGF0ZSBjaG9vc2UgKi9cbiAgICBASW5wdXQoKVxuICAgIGNsb3NlT25EYXRlQ2hvb3NlID0gdHJ1ZTtcblxuICAgIC8qKiBFbmFibGVzIFRvZGF5LVNlbGVjdGlvbi1CdXR0b24gaWYgdHJ1ZSAqL1xuICAgIEBJbnB1dCgpXG4gICAgc2hvd1RvZGF5QnV0dG9uID0gZmFsc2U7XG5cbiAgICAvKiogTGFiZWwgZm9yIFRvZGF5LVNlbGVjdGlvbi1CdXR0b24gKi9cbiAgICBASW5wdXQoKVxuICAgIHRvZGF5QnV0dG9uTGFiZWwgPSAnVG9kYXknO1xuXG4gICAgLyoqXG4gICAgICogRnVuY3Rpb24gdXNlZCB0byBkaXNhYmxlIHByZXZpb3VzIGJ1dHRvbiBpbiB0aGUgY2FsZW5kYXIgaGVhZGVyLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHJldmlvdXNCdXR0b25EaXNhYmxlRnVuY3Rpb246IE5hdmlnYXRpb25CdXR0b25EaXNhYmxlRnVuY3Rpb248RD47XG5cbiAgICAvKipcbiAgICAgKiBGdW5jdGlvbiB1c2VkIHRvIGRpc2FibGUgbmV4dCBidXR0b24gaW4gdGhlIGNhbGVuZGFyIGhlYWRlci5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIG5leHRCdXR0b25EaXNhYmxlRnVuY3Rpb246IE5hdmlnYXRpb25CdXR0b25EaXNhYmxlRnVuY3Rpb248RD47XG5cbiAgICAvKipcbiAgICAgKiAgVGhlIHN0YXRlIG9mIHRoZSBmb3JtIGNvbnRyb2wgLSBhcHBsaWVzIGNzcyBjbGFzc2VzLlxuICAgICAqICBBbHNvLCB0aGlzIGlzIGFwcGxpZWQgdG8gbWVzc2FnZS5cbiAgICAgKiAgQ2FuIGJlIGBzdWNjZXNzYCwgYGVycm9yYCwgYHdhcm5pbmdgLCBgaW5mb3JtYXRpb25gIG9yIGJsYW5rIGZvciBkZWZhdWx0LlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgc2V0IHN0YXRlKHN0YXRlOiBOdWxsYWJsZTxGb3JtU3RhdGVzPikge1xuICAgICAgICB0aGlzLl9zdGF0ZSA9IHN0YXRlIHx8ICdkZWZhdWx0JztcbiAgICAgICAgdGhpcy5fcG9wb3ZlckZvcm1NZXNzYWdlLm1lc3NhZ2VUeXBlID0gc3RhdGUgfHwgJ2RlZmF1bHQnO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgZ2V0IHN0YXRlKCk6IEZvcm1TdGF0ZXMge1xuICAgICAgICBpZiAodGhpcy5fc3RhdGUgPT0gbnVsbCAmJiB0aGlzLnVzZVZhbGlkYXRpb24gJiYgdGhpcy5faXNJbnZhbGlkRGF0ZUlucHV0KSB7XG4gICAgICAgICAgICByZXR1cm4gJ2Vycm9yJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fc3RhdGU7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9zdGF0ZTogRm9ybVN0YXRlcyA9ICdkZWZhdWx0JztcblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgQWRkT24gQnV0dG9uIHNob3VsZCBiZSBmb2N1c2FibGVcbiAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBidXR0b25Gb2N1c2FibGUgPSB0cnVlO1xuXG4gICAgLyoqXG4gICAgICogU3BlY2lhbCBkYXlzIG1hcmssIGl0IGNhbiBiZSB1c2VkIGJ5IHBhc3NpbmcgYXJyYXkgb2Ygb2JqZWN0IHdpdGhcbiAgICAgKiBTcGVjaWFsIGRheSBudW1iZXIsIGxpc3QgMS0yMCBbY2xhc3M6YGZkLWNhbGVuZGFyX19zcGVjaWFsLWRheS0te3tudW1iZXJ9fWBdIGlzIGF2YWlsYWJsZSB0aGVyZTpcbiAgICAgKiBodHRwczovL3NhcC5naXRodWIuaW8vZnVuZGFtZW50YWwtc3R5bGVzL2NvbXBvbmVudHMvY2FsZW5kYXIuaHRtbCBjYWxlbmRhciBzcGVjaWFsIGRheXMgc2VjdGlvblxuICAgICAqIFJ1bGUgYWNjZXB0cyBtZXRob2Qgd2l0aCBGZERhdGUgb2JqZWN0IGFzIGEgcGFyYW1ldGVyLiBleDpcbiAgICAgKiBgcnVsZTogKGZkRGF0ZTogRmREYXRlKSA9PiBmZERhdGUuZ2V0RGF5KCkgPT09IDFgLCB3aGljaCB3aWxsIG1hcmsgYWxsIHN1bmRheXMgYXMgc3BlY2lhbCBkYXkuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBzcGVjaWFsRGF5c1J1bGVzOiBTcGVjaWFsRGF5UnVsZTxEPltdID0gW107XG5cbiAgICAvKipcbiAgICAgKiBPYmplY3QgdG8gY3VzdG9taXplIHllYXIgZ3JpZCxcbiAgICAgKiBSb3csIENvbHVtbnMgYW5kIG1ldGhvZCB0byBkaXNwbGF5IHllYXIgY2FuIGJlIG1vZGlmaWVkXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICB5ZWFyR3JpZDogQ2FsZW5kYXJZZWFyR3JpZCA9IHtcbiAgICAgICAgcm93czogNCxcbiAgICAgICAgY29sczogNVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBPYmplY3QgdG8gY3VzdG9taXplIGFnZ3JlZ2F0ZWQgeWVhciBncmlkLFxuICAgICAqIFJvdywgQ29sdW1ucyBhbmQgbWV0aG9kIHRvIGRpc3BsYXkgeWVhciBjYW4gYmUgbW9kaWZpZWRcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIGFnZ3JlZ2F0ZWRZZWFyR3JpZDogQ2FsZW5kYXJZZWFyR3JpZCA9IHtcbiAgICAgICAgcm93czogNCxcbiAgICAgICAgY29sczogM1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHVzZXIgd2FudHMgdG8gbWFyayBzdW5kYXkvc2F0dXJkYXkgd2l0aCBgZmQtY2FsZW5kYXJfX2l0ZW0tLXdlZWtlbmRgIGNsYXNzXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBtYXJrV2Vla2VuZHMgPSB0cnVlO1xuXG4gICAgLyoqXG4gICAgICogV2hldGhlciB1c2VyIHdhbnRzIHRvIHNob3cgd2VlayBudW1iZXJzIG5leHQgdG8gZGF5c1xuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgc2hvd1dlZWtOdW1iZXJzID0gdHJ1ZTtcblxuICAgIC8qKiBXaGV0aGVyIHRoZSBkYXRlIHBpY2tlciBpcyBvcGVuLiBDYW4gYmUgdXNlZCB0aHJvdWdoIHR3by13YXkgYmluZGluZy4gKi9cbiAgICBASW5wdXQoKVxuICAgIGlzT3BlbiA9IGZhbHNlO1xuXG4gICAgLyoqIFNob3VsZCBkYXRlIHBpY2tlciBiZSBpbmxpbmVkLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgaW5saW5lID0gdHJ1ZTtcblxuICAgIC8qKiBhcmlhLWxhYmVsbGVkYnkgZm9yIGVsZW1lbnQgZGVzY3JpYmluZyBkYXRlLXBpY2tlci4gKi9cbiAgICBASW5wdXQoKVxuICAgIGFyaWFMYWJlbGxlZEJ5OiBOdWxsYWJsZTxzdHJpbmc+O1xuXG4gICAgLyoqXG4gICAgICogV2hldGhlciB0byByZWNhbGN1bGF0ZSB2YWx1ZSBmcm9tIHRoZSBpbnB1dCBhcyB1c2VyIHR5cGVzIG9yIG9uIGJsdXIuXG4gICAgICogQnkgZGVmYXVsdCwgdXBkYXRlcyB0aGUgdmFsdWUgYXMgdXNlciB0eXBlcy5cbiAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgc2V0IHByb2Nlc3NJbnB1dE9uQmx1cih2OiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuX3Byb2Nlc3NJbnB1dE9uQmx1ciA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2KTtcbiAgICB9XG5cbiAgICBnZXQgcHJvY2Vzc0lucHV0T25CbHVyKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fcHJvY2Vzc0lucHV0T25CbHVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdG8gcHJldmVudCBwYWdlIHNjcm9sbGluZyB3aGVuIGZvY3VzaW5nIGRhdGUgcGlja2VyIGlucHV0IGZpZWxkIGFmdGVyIGNhbGVuZGFyIGhhcyBiZWVuIGNsb3NlZC5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHByZXZlbnRTY3JvbGxPbkZvY3VzID0gZmFsc2U7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIF9wcm9jZXNzSW5wdXRPbkJsdXIgPSBmYWxzZTtcblxuICAgIC8qKiBFdmVudCBlbWl0dGVkIHdoZW4gdGhlIHN0YXRlIG9mIHRoZSBpc09wZW4gcHJvcGVydHkgY2hhbmdlcy4gKi9cbiAgICBAT3V0cHV0KClcbiAgICByZWFkb25seSBpc09wZW5DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgICAvKiogRmlyZWQgd2hlbiBhIG5ldyBkYXRlIGlzIHNlbGVjdGVkLiAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHJlYWRvbmx5IHNlbGVjdGVkRGF0ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8TnVsbGFibGU8RD4+KCk7XG5cbiAgICAvKiogRXZlbnQgdGhyb3duIGV2ZXJ5IHRpbWUgc2VsZWN0ZWQgZmlyc3Qgb3IgbGFzdCBkYXRlIGluIHJhbmdlIG1vZGUgaXMgY2hhbmdlZCAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHJlYWRvbmx5IHNlbGVjdGVkUmFuZ2VEYXRlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxEYXRlUmFuZ2U8RD4+KCk7XG5cbiAgICAvKiogRXZlbnQgdGhyb3duIGV2ZXJ5IHRpbWUgY2FsZW5kYXIgYWN0aXZlIHZpZXcgaXMgY2hhbmdlZCAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHJlYWRvbmx5IGFjdGl2ZVZpZXdDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPEZkQ2FsZW5kYXJWaWV3PigpO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBAVmlld0NoaWxkKENhbGVuZGFyQ29tcG9uZW50KVxuICAgIF9jYWxlbmRhckNvbXBvbmVudDogQ2FsZW5kYXJDb21wb25lbnQ8RD47XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIEBWaWV3Q2hpbGQoJ2lucHV0R3JvdXBDb21wb25lbnQnLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSlcbiAgICBfaW5wdXRHcm91cEVsZW1lbnQ6IEVsZW1lbnRSZWY7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIEBWaWV3Q2hpbGQoSW5wdXRHcm91cElucHV0RGlyZWN0aXZlLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSlcbiAgICBfaW5wdXRFbGVtZW50OiBFbGVtZW50UmVmPEhUTUxJbnB1dEVsZW1lbnQ+O1xuXG4gICAgLyoqIEBoaWRkZW4gVGhlIHZhbHVlIG9mIHRoZSBpbnB1dCAqL1xuICAgIF9pbnB1dEZpZWxkRGF0ZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgICAvKiogQGhpZGRlbiBXaGV0aGVyIHRoZSBkYXRlIGlucHV0IGlzIGludmFsaWQgKi9cbiAgICBfaXNJbnZhbGlkRGF0ZUlucHV0ID0gZmFsc2U7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHJlYWRvbmx5IF9mb3JtVmFsdWVTdGF0ZU1lc3NhZ2VJZCA9IGBmZC1kYXRlLXBpY2tlci1mb3JtLW1lc3NhZ2UtJHtkYXRlUGlja2VyQ291bnRlcisrfWA7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX29uRGVzdHJveSQ6IFN1YmplY3Q8dm9pZD4gPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9zdWJzY3JpcHRpb25zID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuXG4gICAgLyoqXG4gICAgICogRnVuY3Rpb24gdXNlZCB0byBkaXNhYmxlIGNlcnRhaW4gZGF0ZXMgaW4gdGhlIGNhbGVuZGFyLlxuICAgICAqIEBwYXJhbSBkYXRlIGRhdGUgcmVwcmVzZW50YXRpb25cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIGRpc2FibGVGdW5jdGlvbjogKHZhbHVlOiBEKSA9PiBib29sZWFuID0gKCkgPT4gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBGdW5jdGlvbiB1c2VkIHRvIGRpc2FibGUgY2VydGFpbiBkYXRlcyBpbiB0aGUgY2FsZW5kYXIgZm9yIHRoZSByYW5nZSBzdGFydCBzZWxlY3Rpb24uXG4gICAgICogQHBhcmFtIGRhdGUgZGF0ZSByZXByZXNlbnRhdGlvblxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgZGlzYWJsZVJhbmdlU3RhcnRGdW5jdGlvbjogKHZhbHVlOiBEKSA9PiBib29sZWFuID0gKCkgPT4gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBGdW5jdGlvbiB1c2VkIHRvIGRpc2FibGUgY2VydGFpbiBkYXRlcyBpbiB0aGUgY2FsZW5kYXIgZm9yIHRoZSByYW5nZSBlbmQgc2VsZWN0aW9uLlxuICAgICAqIEBwYXJhbSBkYXRlIGRhdGUgcmVwcmVzZW50YXRpb25cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIGRpc2FibGVSYW5nZUVuZEZ1bmN0aW9uOiAodmFsdWU6IEQpID0+IGJvb2xlYW4gPSAoKSA9PiBmYWxzZTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgb25DaGFuZ2U6ICh2YWx1ZTogYW55KSA9PiB2b2lkID0gKCkgPT4ge307XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIG9uVG91Y2hlZDogYW55ID0gKCkgPT4ge307XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIGdldCBfcmFuZ2VEZWxpbWl0ZXIoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGVUaW1lRm9ybWF0cy5yYW5nZURlbGltaXRlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEYXRlIGlucHV0IGFyaWEgbGFiZWwgYmFzZWQgb24gdHlwZVxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBnZXQgX2RhdGVJbnB1dEFyaWFsTGFiZWwoKTogc3RyaW5nIHtcbiAgICAgICAgLy8gcmV0dXJuIGVpdGhlciBpbnB1dCB2YWx1ZSBvciBhIGtleSBmb3IgXCJmZFRyYW5zbGF0ZVwiIHBpcGVcbiAgICAgICAgcmV0dXJuIHRoaXMudHlwZSA9PT0gJ3JhbmdlJyA/IHRoaXMuZGF0ZVJhbmdlSW5wdXRMYWJlbCA6IHRoaXMuZGF0ZUlucHV0TGFiZWw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGF0ZSBpbnB1dCBhcmlhIGxhYmVsIGtleSBiYXNlZCBvbiB0eXBlXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIGdldCBfZGF0ZUlucHV0QXJpYWxMYWJlbEtleSgpOiBzdHJpbmcge1xuICAgICAgICAvLyByZXR1cm4gZWl0aGVyIGlucHV0IHZhbHVlIG9yIGEga2V5IGZvciBcImZkVHJhbnNsYXRlXCIgcGlwZVxuICAgICAgICByZXR1cm4gdGhpcy50eXBlID09PSAncmFuZ2UnID8gJ2NvcmVEYXRlUGlja2VyLmRhdGVSYW5nZUlucHV0TGFiZWwnIDogJ2NvcmVEYXRlUGlja2VyLmRhdGVJbnB1dExhYmVsJztcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIF9jaGFuZ2VEZXRlY3Rpb25SZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICAgICAgICAvLyBVc2UgQE9wdGlvbmFsIHRvIGF2b2lkIGFuZ3VsYXIgaW5qZWN0aW9uIGVycm9yIG1lc3NhZ2UgYW5kIHRocm93IG91ciBvd24gd2hpY2ggaXMgbW9yZSBwcmVjaXNlIG9uZVxuICAgICAgICBAT3B0aW9uYWwoKSBwcml2YXRlIF9kYXRlVGltZUFkYXB0ZXI6IERhdGV0aW1lQWRhcHRlcjxEPixcbiAgICAgICAgQE9wdGlvbmFsKCkgQEluamVjdChEQVRFX1RJTUVfRk9STUFUUykgcHJpdmF0ZSBfZGF0ZVRpbWVGb3JtYXRzOiBEYXRlVGltZUZvcm1hdHMsXG4gICAgICAgIHByaXZhdGUgX3BvcG92ZXJGb3JtTWVzc2FnZTogUG9wb3ZlckZvcm1NZXNzYWdlU2VydmljZVxuICAgICkge1xuICAgICAgICBpZiAoIXRoaXMuX2RhdGVUaW1lQWRhcHRlcikge1xuICAgICAgICAgICAgdGhyb3cgY3JlYXRlTWlzc2luZ0RhdGVJbXBsZW1lbnRhdGlvbkVycm9yKCdEYXRlVGltZUFkYXB0ZXInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuX2RhdGVUaW1lRm9ybWF0cykge1xuICAgICAgICAgICAgdGhyb3cgY3JlYXRlTWlzc2luZ0RhdGVJbXBsZW1lbnRhdGlvbkVycm9yKCdEQVRFX1RJTUVfRk9STUFUUycpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmxvY2FsZUNoYW5nZXMucGlwZSh0YWtlVW50aWwodGhpcy5fb25EZXN0cm95JCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmZvcm1hdElucHV0RGF0ZSh0aGlzLnNlbGVjdGVkRGF0ZSk7XG4gICAgICAgICAgICB0aGlzLl9jaGFuZ2VEZXRlY3Rpb25SZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fSW5pdGlhbGlzZVZhcmlhYmxlc0luTWVzc2FnZVNlcnZpY2UoKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9zdWJzY3JpcHRpb25zLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIHRoaXMuX29uRGVzdHJveSQubmV4dCgpO1xuICAgICAgICB0aGlzLl9vbkRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWV0aG9kIHRoYXQgaGFuZGxlIGNhbGVuZGFyIGFjdGl2ZSB2aWV3IGNoYW5nZSBhbmQgdGhyb3dzIGV2ZW50LlxuICAgICAqL1xuICAgIHB1YmxpYyBoYW5kbGVDYWxlbmRhckFjdGl2ZVZpZXdDaGFuZ2UoYWN0aXZlVmlldzogRmRDYWxlbmRhclZpZXcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5hY3RpdmVWaWV3Q2hhbmdlLmVtaXQoYWN0aXZlVmlldyk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwdWJsaWMgY2xvc2VGcm9tQ2FsZW5kYXIoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnR5cGUgPT09ICdzaW5nbGUnICYmIHRoaXMuY2xvc2VPbkRhdGVDaG9vc2UpIHtcbiAgICAgICAgICAgIHRoaXMub25Ub3VjaGVkKCk7XG4gICAgICAgICAgICB0aGlzLmNsb3NlQ2FsZW5kYXIoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBPcGVucyB0aGUgY2FsZW5kYXIgKi9cbiAgICBvcGVuQ2FsZW5kYXIoKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5kaXNhYmxlZCkge1xuICAgICAgICAgICAgdGhpcy5pc09wZW4gPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5pc09wZW5DaGFuZ2UuZW1pdCh0aGlzLmlzT3Blbik7XG4gICAgICAgICAgICB0aGlzLl9jaGFuZ2VNZXNzYWdlVmlzaWJpbGl0eSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIFRvZ2dsZXMgdGhlIGNhbGVuZGFyIG9wZW4gb3IgY2xvc2VkICovXG4gICAgcHVibGljIHRvZ2dsZUNhbGVuZGFyKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmlzT3BlbiA9ICF0aGlzLmlzT3BlbjtcbiAgICAgICAgdGhpcy5pc09wZW5DaGFuZ2UuZW1pdCh0aGlzLmlzT3Blbik7XG4gICAgICAgIGlmICghdGhpcy5pc09wZW4pIHtcbiAgICAgICAgICAgIHRoaXMub25Ub3VjaGVkKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fY2hhbmdlTWVzc2FnZVZpc2liaWxpdHkoKTtcbiAgICB9XG5cbiAgICAvKiogQ2xvc2VzIHRoZSBjYWxlbmRhciBpZiBpdCBpcyBvcGVuICovXG4gICAgcHVibGljIGNsb3NlQ2FsZW5kYXIoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmlzT3Blbikge1xuICAgICAgICAgICAgdGhpcy5pc09wZW4gPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuaXNPcGVuQ2hhbmdlLmVtaXQodGhpcy5pc09wZW4pO1xuICAgICAgICAgICAgdGhpcy5fY2hhbmdlTWVzc2FnZVZpc2liaWxpdHkoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBNZXRob2QgdGhhdCBpcyB0cmlnZ2VyZWQgYnkgZXZlbnRzIGZyb20gY2FsZW5kYXIgY29tcG9uZW50LCB3aGVuIHRoZXJlIGlzIHNlbGVjdGVkIHNpbmdsZSBkYXRlIGNoYW5nZWRcbiAgICAgKi9cbiAgICBwdWJsaWMgaGFuZGxlU2luZ2xlRGF0ZUNoYW5nZShkYXRlOiBEKTogdm9pZCB7XG4gICAgICAgIGlmIChkYXRlKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZSA9IGRhdGU7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUNoYW5nZS5lbWl0KGRhdGUpO1xuICAgICAgICAgICAgdGhpcy5vbkNoYW5nZShkYXRlKTtcbiAgICAgICAgICAgIHRoaXMuZm9ybWF0SW5wdXREYXRlKGRhdGUpO1xuICAgICAgICAgICAgdGhpcy5faXNJbnZhbGlkRGF0ZUlucHV0ID0gIXRoaXMuaXNNb2RlbFZhbGlkKCk7XG4gICAgICAgICAgICBpZiAodGhpcy5jbG9zZU9uRGF0ZUNob29zZSAmJiB0aGlzLnR5cGUgPT09ICdzaW5nbGUnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jbG9zZUNhbGVuZGFyKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogTWV0aG9kIHRoYXQgaXMgdHJpZ2dlcmVkIGRhdGUgZm9ybWF0dGluZyBpbiB0aGUgZGF0ZSBjb250cm9sXG4gICAgICovXG4gICAgcHVibGljIGZvcm1hdElucHV0RGF0ZShkYXRlOiBOdWxsYWJsZTxEPik6IHZvaWQge1xuICAgICAgICBpZiAoZGF0ZSkge1xuICAgICAgICAgICAgdGhpcy5faW5wdXRGaWVsZERhdGUgPSB0aGlzLl9mb3JtYXREYXRlKGRhdGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIE1ldGhvZCB0aGF0IGlzIHRyaWdnZXJlZCBieSBldmVudHMgZnJvbSBjYWxlbmRhciBjb21wb25lbnQsIHdoZW4gdGhlcmUgaXMgc2VsZWN0ZWQgcmFuZ2UgZGF0ZSBjaGFuZ2VkXG4gICAgICovXG4gICAgcHVibGljIGhhbmRsZVJhbmdlRGF0ZUNoYW5nZShkYXRlczogRGF0ZVJhbmdlPEQ+KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHN0YXJ0Q2hhbmdlZCA9ICF0aGlzLl9kYXRlVGltZUFkYXB0ZXIuZGF0ZXNFcXVhbChkYXRlcy5zdGFydCwgdGhpcy5zZWxlY3RlZFJhbmdlRGF0ZS5zdGFydCk7XG4gICAgICAgIGNvbnN0IGVuZENoYW5nZWQgPSAhdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmRhdGVzRXF1YWwoZGF0ZXMuZW5kLCB0aGlzLnNlbGVjdGVkUmFuZ2VEYXRlLmVuZCk7XG4gICAgICAgIGlmIChkYXRlcyAmJiAoc3RhcnRDaGFuZ2VkIHx8IGVuZENoYW5nZWQpKSB7XG4gICAgICAgICAgICBjb25zdCBzaG91bGRDbG9zZSA9IHRoaXMuY2xvc2VPbkRhdGVDaG9vc2UgJiYgZGF0ZXMuZW5kICE9PSBudWxsO1xuICAgICAgICAgICAgdGhpcy5faW5wdXRGaWVsZERhdGUgPSB0aGlzLl9mb3JtYXREYXRlUmFuZ2UoZGF0ZXMpO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFJhbmdlRGF0ZSA9IHsgc3RhcnQ6IGRhdGVzLnN0YXJ0LCBlbmQ6IGRhdGVzLmVuZCB9O1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFJhbmdlRGF0ZUNoYW5nZS5lbWl0KHRoaXMuc2VsZWN0ZWRSYW5nZURhdGUpO1xuICAgICAgICAgICAgdGhpcy5vbkNoYW5nZSh0aGlzLnNlbGVjdGVkUmFuZ2VEYXRlKTtcbiAgICAgICAgICAgIHRoaXMuX2lzSW52YWxpZERhdGVJbnB1dCA9ICF0aGlzLmlzTW9kZWxWYWxpZCgpO1xuICAgICAgICAgICAgaWYgKHNob3VsZENsb3NlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jbG9zZUNhbGVuZGFyKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogTWV0aG9kIHRoYXQgaXMgdHJpZ2dlcmVkIHdoZW4gVG9kYXktU2VsZWN0aW9uLUJ1dHRvbiBjbGlja2VkLCBpdCBjaGFuZ2VzIHNlbGVjdGVkIGRhdGUgb3IgZGF0ZSByYW5nZSB0byB0b2RheSdzIGRhdGVcbiAgICAgKi9cbiAgICBvblRvZGF5QnV0dG9uQ2xpY2soKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHRvZGF5RGF0ZSA9IHRoaXMuX2RhdGVUaW1lQWRhcHRlci50b2RheSgpO1xuICAgICAgICBpZiAodGhpcy50eXBlID09PSAnc2luZ2xlJykge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVTaW5nbGVEYXRlQ2hhbmdlKHRvZGF5RGF0ZSk7XG4gICAgICAgICAgICB0aGlzLmNsb3NlRnJvbUNhbGVuZGFyKCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy50eXBlID09PSAncmFuZ2UnKSB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZVJhbmdlRGF0ZUNoYW5nZSh7IHN0YXJ0OiB0b2RheURhdGUsIGVuZDogdG9kYXlEYXRlIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIE1ldGhvZCB0aGF0IGlzIHRyaWdnZXJlZCB3aGVuIHRoZSB0ZXh0IGlucHV0IGlzIGNvbmZpcm1lZCB0byBiYSBjaGFuZ2VkLCBieSBjbGlja2luZyBlbnRlciwgb3IgYmx1clxuICAgICAqL1xuICAgIHB1YmxpYyBoYW5kbGVJbnB1dENoYW5nZShzdHJEYXRlOiBzdHJpbmcsIGlzVHlwZUV2ZW50OiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIGlmICgoaXNUeXBlRXZlbnQgJiYgdGhpcy5wcm9jZXNzSW5wdXRPbkJsdXIpIHx8ICghaXNUeXBlRXZlbnQgJiYgIXRoaXMucHJvY2Vzc0lucHV0T25CbHVyKSkge1xuICAgICAgICAgICAgLy8gaWYgcHJvY2Vzc0lucHV0T25CbHVyID09PSB0cnVlLCBpZ25vcmUgdHlwZSBldmVudFxuICAgICAgICAgICAgLy8gaWYgcHJvY2Vzc0lucHV0T25CbHVyID09PSBmYWxzZSwgaWdub3JlIGJsdXIvZW50ZXIgZXZlbnRcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRhdGVTdHJpbmdVcGRhdGUoc3RyRGF0ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEZ1bmN0aW9uIHRoYXQgaW1wbGVtZW50cyBWYWxpZGF0b3IgSW50ZXJmYWNlLCBhZGRzIHZhbGlkYXRpb24gc3VwcG9ydCBmb3IgZm9ybXNcbiAgICAgKi9cbiAgICB2YWxpZGF0ZSgpOiB7IFtrZXk6IHN0cmluZ106IGFueSB9IHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzTW9kZWxWYWxpZCgpXG4gICAgICAgICAgICA/IG51bGxcbiAgICAgICAgICAgIDoge1xuICAgICAgICAgICAgICAgICAgZGF0ZVZhbGlkYXRpb246IHtcbiAgICAgICAgICAgICAgICAgICAgICB2YWxpZDogZmFsc2VcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHJlZ2lzdGVyT25DaGFuZ2UoZm46IChzZWxlY3RlZDogYW55KSA9PiB7IHZvaWQgfSk6IHZvaWQge1xuICAgICAgICB0aGlzLm9uQ2hhbmdlID0gZm47XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7XG4gICAgICAgIHRoaXMub25Ub3VjaGVkID0gZm47XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG4gICAgICAgIHRoaXMuX2NoYW5nZURldGVjdGlvblJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEZ1bmN0aW9uIHRoYXQgcHJvdmlkZXMgc3VwcG9ydCBmb3IgQ29udHJvbFZhbHVlQWNjZXNzb3IgdGhhdCBhbGxvd3MgdG8gdXNlIFsobmdNb2RlbCldIG9yIGZvcm1zXG4gICAgICovXG4gICAgd3JpdGVWYWx1ZShzZWxlY3RlZDogRGF0ZVJhbmdlPEQ+IHwgRCB8IG51bGwpOiB2b2lkIHtcbiAgICAgICAgLyoqIElmIHdyaXR0ZW4gdmFsdWUgaXMgbm90IGRlZmluZWQsIG51bGwsIGVtcHR5IHN0cmluZyAqL1xuICAgICAgICBpZiAoIXNlbGVjdGVkKSB7XG4gICAgICAgICAgICB0aGlzLl9pbnB1dEZpZWxkRGF0ZSA9ICcnO1xuICAgICAgICAgICAgdGhpcy5fcmVmcmVzaEN1cnJlbnRseURpc3BsYXllZENhbGVuZGFyRGF0ZSh0aGlzLl9kYXRlVGltZUFkYXB0ZXIudG9kYXkoKSk7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUmFuZ2VEYXRlID0geyBzdGFydDogbnVsbCwgZW5kOiBudWxsIH07XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZSA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLl9jaGFuZ2VEZXRlY3Rpb25SZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnR5cGUgPT09ICdzaW5nbGUnKSB7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIEZvciBzaW5nbGUgbW9kZSwgaWYgdGhlIGRhdGUgaXMgaW52YWxpZCwgbW9kZWwgaXMgY2hhbmdlZCwgaXQgcmVmcmVzaGVzIGN1cnJlbnRseVxuICAgICAgICAgICAgICogaW5wdXQgZmllbGQgdGV4dCwgYnV0IGl0IGRvZXMgbm90IHJlZnJlc2ggY3VycmVudGx5IGRpc3BsYXllZCBkYXlcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgc2VsZWN0ZWQgPSB0aGlzLl9wYXJzZURhdGUoc2VsZWN0ZWQpO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGUgPSBzZWxlY3RlZDtcblxuICAgICAgICAgICAgdGhpcy5faW5wdXRGaWVsZERhdGUgPSB0aGlzLl9mb3JtYXREYXRlKHNlbGVjdGVkKTtcbiAgICAgICAgICAgIHRoaXMuX3JlZnJlc2hDdXJyZW50bHlEaXNwbGF5ZWRDYWxlbmRhckRhdGUoc2VsZWN0ZWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnR5cGUgPT09ICdyYW5nZScpIHtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogRm9yIHJhbmdlIG1vZGUsIGlmIHRoZSBkYXRlIGlzIGludmFsaWQsIG1vZGVsIGlzIGNoYW5nZWQsIGJ1dCBpdCBkb2VzIG5vdCByZWZyZXNoIGN1cnJlbnRseVxuICAgICAgICAgICAgICogZGlzcGxheWVkIGRheSB2aWV3LCBvciBpbnB1dCBmaWVsZCB0ZXh0XG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIHNlbGVjdGVkID0gc2VsZWN0ZWQgYXMgRGF0ZVJhbmdlPEQ+O1xuXG4gICAgICAgICAgICBpZiAoc2VsZWN0ZWQ/LnN0YXJ0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFJhbmdlRGF0ZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgc3RhcnQ6IHRoaXMuX3BhcnNlRGF0ZShzZWxlY3RlZC5zdGFydCksXG4gICAgICAgICAgICAgICAgICAgIGVuZDogdGhpcy5fcGFyc2VEYXRlKHNlbGVjdGVkLmVuZClcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgdGhpcy5fcmVmcmVzaEN1cnJlbnRseURpc3BsYXllZENhbGVuZGFyRGF0ZShzZWxlY3RlZC5zdGFydCk7XG4gICAgICAgICAgICAgICAgdGhpcy5faW5wdXRGaWVsZERhdGUgPSB0aGlzLl9mb3JtYXREYXRlUmFuZ2Uoc2VsZWN0ZWQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9pbnB1dEZpZWxkRGF0ZSA9ICcnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2lzSW52YWxpZERhdGVJbnB1dCA9ICF0aGlzLmlzTW9kZWxWYWxpZCgpO1xuICAgICAgICB0aGlzLl9jaGFuZ2VEZXRlY3Rpb25SZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBNZXRob2QsIHdoaWNoIGlzIHJlc3BvbnNpYmxlIGZvciB0cmFuc2Zvcm1pbmcgc3RyaW5nIHRvIGRhdGUsIGRlcGVuZGluZyBvbiB0eXBlIG9yXG4gICAgICogdmFsaWRhdGlvbiB0aGUgcmVzdWx0cyBhcmUgZGlmZmVyZW50LiBJdCBhbHNvIGNoYW5nZXMgdG8gc3RhdGUgb2YgX2lzSW52YWxpZERhdGVJbnB1dFxuICAgICAqL1xuICAgIGRhdGVTdHJpbmdVcGRhdGUoZGF0ZVN0cjogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2lucHV0RmllbGREYXRlID0gZGF0ZVN0cjtcbiAgICAgICAgLyoqIENhc2Ugd2hlbiB0aGVyZSBpcyBzaW5nbGUgbW9kZSAqL1xuICAgICAgICBpZiAodGhpcy50eXBlID09PSAnc2luZ2xlJykge1xuICAgICAgICAgICAgaWYgKCFkYXRlU3RyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5faXNJbnZhbGlkRGF0ZUlucHV0ID0gIXRoaXMuYWxsb3dOdWxsO1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlID0gbnVsbDtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZWZyZXNoQ3VycmVudGx5RGlzcGxheWVkQ2FsZW5kYXJEYXRlKHRoaXMuc2VsZWN0ZWREYXRlKTtcbiAgICAgICAgICAgICAgICB0aGlzLm9uQ2hhbmdlKHRoaXMuc2VsZWN0ZWREYXRlKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUNoYW5nZS5lbWl0KHRoaXMuc2VsZWN0ZWREYXRlKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBkYXRlID0gdGhpcy5fcGFyc2VEYXRlKGRhdGVTdHIpO1xuXG4gICAgICAgICAgICAvKiogQ2hlY2sgaWYgZGF0ZXMgYXJlIGVxdWFsLCBpZiBzbywgdGhlcmUgaXMgbm8gbmVlZCB0byBtYWtlIGFueSBjaGFuZ2VzICovXG4gICAgICAgICAgICBpZiAoIXRoaXMuX2RhdGVUaW1lQWRhcHRlci5kYXRlc0VxdWFsKGRhdGUsIHRoaXMuc2VsZWN0ZWREYXRlKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2lzSW52YWxpZERhdGVJbnB1dCA9ICF0aGlzLl9pc1NpbmdsZU1vZGVsVmFsaWQoZGF0ZSk7XG5cbiAgICAgICAgICAgICAgICAvKiogQ2hlY2sgaWYgZGF0ZSBpcyB2YWxpZCwgaWYgaXQncyBub3QsIHRoZXJlIGlzIG5vIG5lZWQgdG8gcmVmcmVzaCBjYWxlbmRhciAqL1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5faXNJbnZhbGlkRGF0ZUlucHV0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlZnJlc2hDdXJyZW50bHlEaXNwbGF5ZWRDYWxlbmRhckRhdGUoZGF0ZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICogRGF0ZSBpbiBtb2RlbCBpcyBjaGFuZ2VkIG5vIG1hdHRlciBpZiB0aGUgcGFyc2VkIGRhdGUgZnJvbSBzdHJpbmcgaXMgdmFsaWQgb3Igbm90LlxuICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlID0gZGF0ZTtcbiAgICAgICAgICAgICAgICB0aGlzLm9uQ2hhbmdlKHRoaXMuc2VsZWN0ZWREYXRlKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUNoYW5nZS5lbWl0KHRoaXMuc2VsZWN0ZWREYXRlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLyoqIENhc2Ugd2hlbiB0aGVyZSBpcyByYW5nZSBtb2RlICovXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoIWRhdGVTdHIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9pc0ludmFsaWREYXRlSW5wdXQgPSAhdGhpcy5hbGxvd051bGw7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFJhbmdlRGF0ZSA9IHsgc3RhcnQ6IG51bGwsIGVuZDogbnVsbCB9O1xuICAgICAgICAgICAgICAgIHRoaXMuX3JlZnJlc2hDdXJyZW50bHlEaXNwbGF5ZWRDYWxlbmRhckRhdGUodGhpcy5zZWxlY3RlZFJhbmdlRGF0ZS5zdGFydCk7XG4gICAgICAgICAgICAgICAgdGhpcy5vbkNoYW5nZSh0aGlzLnNlbGVjdGVkUmFuZ2VEYXRlKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkUmFuZ2VEYXRlQ2hhbmdlLmVtaXQodGhpcy5zZWxlY3RlZFJhbmdlRGF0ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgW3N0YXJ0RGF0ZVN0ciwgZW5kRGF0ZVN0cl0gPSBkYXRlU3RyLnNwbGl0KHRoaXMuX3JhbmdlRGVsaW1pdGVyKTtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0RGF0ZSA9IHRoaXMuX3BhcnNlRGF0ZShzdGFydERhdGVTdHIpO1xuICAgICAgICAgICAgY29uc3QgZW5kRGF0ZSA9IHRoaXMuX3BhcnNlRGF0ZShlbmREYXRlU3RyKTtcblxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBDaGVjayBpZiBkYXRlcyBhcmUgZXF1YWwsIGlmIGRhdGVzIGFyZSB0aGUgc2FtZSB0aGVyZSBpcyBubyBuZWVkIHRvIG1ha2UgYW55IGNoYW5nZXNcbiAgICAgICAgICAgICAqIERhdGUgaW4gbW9kZWwgaXMgY2hhbmdlZCBubyBtYXR0ZXIgaWYgdGhlIHBhcnNlZCBkYXRlcyBmcm9tIHN0cmluZyBhcmUgdmFsaWQgb3Igbm90LlxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgIXRoaXMuX2RhdGVUaW1lQWRhcHRlci5kYXRlc0VxdWFsKHN0YXJ0RGF0ZSwgdGhpcy5zZWxlY3RlZFJhbmdlRGF0ZS5zdGFydCkgfHxcbiAgICAgICAgICAgICAgICAhdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmRhdGVzRXF1YWwoZW5kRGF0ZSwgdGhpcy5zZWxlY3RlZFJhbmdlRGF0ZS5lbmQpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBsZXQgc2VsZWN0ZWRSYW5nZURhdGU6IERhdGVSYW5nZTxEPiB8IG51bGwgPSBudWxsO1xuXG4gICAgICAgICAgICAgICAgLyoqIElmIHRoZSBlbmQgZGF0ZSBpcyBiZWZvcmUgdGhlIHN0YXJ0IGRhdGUsIHRoZXJlIGlzIG5lZWQgdG8gcmVwbGFjZSB0aGVtICAqL1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmlzVmFsaWQoc3RhcnREYXRlKSAmJlxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9kYXRlVGltZUFkYXB0ZXIuaXNWYWxpZChlbmREYXRlKSAmJlxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9kYXRlVGltZUFkYXB0ZXIuY29tcGFyZURhdGUoc3RhcnREYXRlLCBlbmREYXRlKSA+IDBcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRSYW5nZURhdGUgPSB7IHN0YXJ0OiBlbmREYXRlLCBlbmQ6IHN0YXJ0RGF0ZSB9O1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkUmFuZ2VEYXRlID0geyBzdGFydDogc3RhcnREYXRlLCBlbmQ6IGVuZERhdGUgfTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLl9pc0ludmFsaWREYXRlSW5wdXQgPSAhdGhpcy5faXNSYW5nZU1vZGVsVmFsaWQoc2VsZWN0ZWRSYW5nZURhdGUpO1xuXG4gICAgICAgICAgICAgICAgLyoqIFdob2xlIG9iamVjdCBpcyBjaGFuZ2VkLCBldmVuIGl0J3MgaW52YWxpZCAqL1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSYW5nZURhdGUgPSBzZWxlY3RlZFJhbmdlRGF0ZTtcblxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSYW5nZURhdGVDaGFuZ2UuZW1pdCh0aGlzLnNlbGVjdGVkUmFuZ2VEYXRlKTtcbiAgICAgICAgICAgICAgICB0aGlzLm9uQ2hhbmdlKHRoaXMuc2VsZWN0ZWRSYW5nZURhdGUpO1xuXG4gICAgICAgICAgICAgICAgLyoqIENoZWNrIGlmIHN0YXJ0IGRhdGUgaXMgdmFsaWQsIGlmIGl0J3Mgbm90LCB0aGVyZSBpcyBubyBuZWVkIG8gcmVmcmVzaCBjYWxlbmRhciAqL1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9pc1N0YXJ0RGF0ZVZhbGlkKHRoaXMuc2VsZWN0ZWRSYW5nZURhdGUuc3RhcnQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlZnJlc2hDdXJyZW50bHlEaXNwbGF5ZWRDYWxlbmRhckRhdGUodGhpcy5zZWxlY3RlZFJhbmdlRGF0ZS5zdGFydCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIE1ldGhvZCB0aGF0IHByb3ZpZGVzIGluZm9ybWF0aW9uIGlmIG1vZGVsIHNlbGVjdGVkIGRhdGUvZGF0ZXMgaGF2ZSBwcm9wZXJseSB0eXBlcyBhbmQgYXJlIHZhbGlkICovXG4gICAgaXNNb2RlbFZhbGlkKCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodGhpcy50eXBlID09PSAnc2luZ2xlJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2lzU2luZ2xlTW9kZWxWYWxpZCh0aGlzLnNlbGVjdGVkRGF0ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5faXNSYW5nZU1vZGVsVmFsaWQodGhpcy5zZWxlY3RlZFJhbmdlRGF0ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIF9jaGFuZ2VNZXNzYWdlVmlzaWJpbGl0eSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuaXNPcGVuKSB7XG4gICAgICAgICAgICB0aGlzLl9wb3BvdmVyRm9ybU1lc3NhZ2UuaGlkZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fcG9wb3ZlckZvcm1NZXNzYWdlLnNob3coKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgX29uT3BlblN0YXRlQ2hhbmdlZChpc09wZW46IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pc09wZW5DaGFuZ2UuZW1pdChpc09wZW4pO1xuICAgICAgICB0aGlzLl9jaGFuZ2VNZXNzYWdlVmlzaWJpbGl0eSgpO1xuICAgICAgICAvLyBmb2N1cyBpbnB1dCBjb250cm9sIGV2ZXJ5IHRpbWUgcG9wdXAgaXMgY2xvc2VkXG4gICAgICAgIGlmICghaXNPcGVuICYmIHRoaXMuX2lucHV0RWxlbWVudCkge1xuICAgICAgICAgICAgdGhpcy5faW5wdXRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoe1xuICAgICAgICAgICAgICAgIHByZXZlbnRTY3JvbGw6IHRoaXMucHJldmVudFNjcm9sbE9uRm9jdXNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIGZvY3VzIGNhbGVuZGFyIGNlbGwgb24gb3BlbmluZ1xuICAgICAgICBpZiAoaXNPcGVuICYmIHRoaXMuX2NhbGVuZGFyQ29tcG9uZW50KSB7XG4gICAgICAgICAgICB0aGlzLl9jYWxlbmRhckNvbXBvbmVudC5pbml0aWFsRm9jdXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgX29uQmx1cihldmVudDogRm9jdXNFdmVudCk6IHZvaWQge1xuICAgICAgICB0aGlzLm9uVG91Y2hlZCgpO1xuICAgICAgICB0aGlzLmhhbmRsZUlucHV0Q2hhbmdlKChldmVudC50YXJnZXQgYXMgYW55KS52YWx1ZSwgZmFsc2UpO1xuICAgIH1cblxuICAgIC8qKiBNZXRob2QgdGhhdCByZXR1cm5zIGluZm8gaWYgc2luZ2xlIG1vZGVsIGdpdmVuIGlzIHZhbGlkICovXG4gICAgcHJpdmF0ZSBfaXNTaW5nbGVNb2RlbFZhbGlkKGRhdGU6IE51bGxhYmxlPEQ+KTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAodGhpcy5faXNEYXRlVmFsaWQoZGF0ZSkgJiYgIXRoaXMuZGlzYWJsZUZ1bmN0aW9uKGRhdGUpKSB8fCAoIWRhdGUgJiYgdGhpcy5hbGxvd051bGwpO1xuICAgIH1cblxuICAgIC8qKiBNZXRob2QgdGhhdCByZXR1cm5zIGluZm8gaWYgcmFuZ2UgZGF0ZSBtb2RlbCBnaXZlbiBpcyB2YWxpZCAqL1xuICAgIHByaXZhdGUgX2lzUmFuZ2VNb2RlbFZhbGlkKGZkUmFuZ2VEYXRlOiBEYXRlUmFuZ2U8RD4pOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIChmZFJhbmdlRGF0ZSAmJiB0aGlzLl9pc1N0YXJ0RGF0ZVZhbGlkKGZkUmFuZ2VEYXRlLnN0YXJ0KSAmJiB0aGlzLl9pc0VuZERhdGVWYWxpZChmZFJhbmdlRGF0ZS5lbmQpKSB8fFxuICAgICAgICAgICAgKCFmZFJhbmdlRGF0ZS5zdGFydCAmJiAhZmRSYW5nZURhdGUuZW5kICYmIHRoaXMuYWxsb3dOdWxsKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKiBNZXRob2QgdGhhdCByZXR1cm5zIGluZm8gaWYgZW5kIGRhdGUgbW9kZWwgZ2l2ZW4gaXMgdmFsaWQgKi9cbiAgICBwcml2YXRlIF9pc0VuZERhdGVWYWxpZChlbmREYXRlOiBOdWxsYWJsZTxEPik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5faXNEYXRlVmFsaWQoZW5kRGF0ZSkgJiYgIXRoaXMuZGlzYWJsZVJhbmdlRW5kRnVuY3Rpb24oZW5kRGF0ZSk7XG4gICAgfVxuXG4gICAgLyoqIE1ldGhvZCB0aGF0IHJldHVybnMgaW5mbyBpZiBzdGFydCBkYXRlIG1vZGVsIGdpdmVuIGlzIHZhbGlkICovXG4gICAgcHJpdmF0ZSBfaXNTdGFydERhdGVWYWxpZChzdGFydERhdGU6IE51bGxhYmxlPEQ+KTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc0RhdGVWYWxpZChzdGFydERhdGUpICYmICF0aGlzLmRpc2FibGVSYW5nZVN0YXJ0RnVuY3Rpb24oc3RhcnREYXRlKTtcbiAgICB9XG5cbiAgICAvKiogTWV0aG9kIHRoYXQgcmV0dXJucyBpbmZvIGlmIGdpdmVuIGRhdGUgbW9kZWwgaXMgdmFsaWQgKi9cbiAgICBwcml2YXRlIF9pc0RhdGVWYWxpZChkYXRlOiBOdWxsYWJsZTxEPik6IGRhdGUgaXMgRCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRlVGltZUFkYXB0ZXIuaXNWYWxpZChkYXRlKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX3JlZnJlc2hDdXJyZW50bHlEaXNwbGF5ZWRDYWxlbmRhckRhdGUoZGF0ZTogTnVsbGFibGU8RD4pOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuX2NhbGVuZGFyQ29tcG9uZW50KSB7XG4gICAgICAgICAgICB0aGlzLl9jYWxlbmRhckNvbXBvbmVudC5zZXRDdXJyZW50bHlEaXNwbGF5ZWQoZGF0ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX2Zvcm1hdERhdGUoZGF0ZTogTnVsbGFibGU8RD4pOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmZvcm1hdChkYXRlLCB0aGlzLl9kYXRlVGltZUZvcm1hdHMuZGlzcGxheS5kYXRlSW5wdXQpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfcGFyc2VEYXRlKGRhdGU6IHVua25vd24pOiBEIHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRlVGltZUFkYXB0ZXIucGFyc2UoZGF0ZSwgdGhpcy5fZGF0ZVRpbWVGb3JtYXRzLnBhcnNlLmRhdGVJbnB1dCk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9mb3JtYXREYXRlUmFuZ2UoZGF0ZVJhbmdlOiBEYXRlUmFuZ2U8RD4pOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBzdGFydERhdGUgPSB0aGlzLl9mb3JtYXREYXRlKGRhdGVSYW5nZS5zdGFydCk7XG4gICAgICAgIGNvbnN0IGVuZERhdGUgPSB0aGlzLl9mb3JtYXREYXRlKGRhdGVSYW5nZS5lbmQpO1xuICAgICAgICByZXR1cm4gc3RhcnREYXRlICsgdGhpcy5fcmFuZ2VEZWxpbWl0ZXIgKyBlbmREYXRlO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfSW5pdGlhbGlzZVZhcmlhYmxlc0luTWVzc2FnZVNlcnZpY2UoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3BvcG92ZXJGb3JtTWVzc2FnZS5pbml0KHRoaXMuX2lucHV0R3JvdXBFbGVtZW50KTtcbiAgICAgICAgdGhpcy5fcG9wb3ZlckZvcm1NZXNzYWdlLm1lc3NhZ2UgPSB0aGlzLl9tZXNzYWdlIHx8ICcnO1xuICAgICAgICB0aGlzLl9wb3BvdmVyRm9ybU1lc3NhZ2UudHJpZ2dlcnMgPSB0aGlzLl9tZXNzYWdlVHJpZ2dlcnM7XG4gICAgICAgIHRoaXMuX3BvcG92ZXJGb3JtTWVzc2FnZS5tZXNzYWdlVHlwZSA9IHRoaXMuX3N0YXRlO1xuICAgIH1cbn1cbiIsIjxmZC1wb3BvdmVyXG4gICAgWyhpc09wZW4pXT1cImlzT3BlblwiXG4gICAgKGlzT3BlbkNoYW5nZSk9XCJfb25PcGVuU3RhdGVDaGFuZ2VkKCRldmVudClcIlxuICAgIFt0cmlnZ2Vyc109XCJbXVwiXG4gICAgW3BsYWNlbWVudF09XCJwbGFjZW1lbnRcIlxuICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgW2ZvY3VzVHJhcHBlZF09XCJ0cnVlXCJcbiAgICBbZm9jdXNBdXRvQ2FwdHVyZV09XCJmYWxzZVwiXG4gICAgW2FwcGVuZFRvXT1cImFwcGVuZFRvXCJcbj5cbiAgICA8ZmQtcG9wb3Zlci1jb250cm9sPlxuICAgICAgICA8ZmQtaW5wdXQtZ3JvdXBcbiAgICAgICAgICAgICNpbnB1dEdyb3VwQ29tcG9uZW50XG4gICAgICAgICAgICBbc3RhdGVdPVwic3RhdGVcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgICAgIFtpc0NvbnRyb2xdPVwidHJ1ZVwiXG4gICAgICAgICAgICBbYnV0dG9uXT1cInRydWVcIlxuICAgICAgICAgICAgW2J1dHRvbkZvY3VzYWJsZV09XCJidXR0b25Gb2N1c2FibGVcIlxuICAgICAgICAgICAgZ2x5cGg9XCJhcHBvaW50bWVudC0yXCJcbiAgICAgICAgICAgIFtpc0V4cGFuZGVkXT1cImlzT3BlblwiXG4gICAgICAgICAgICBbZ2x5cGhBcmlhTGFiZWxdPVwiZGlzcGxheUNhbGVuZGFyVG9nZ2xlTGFiZWwgfHwgKCdjb3JlRGF0ZVBpY2tlci5kaXNwbGF5Q2FsZW5kYXJUb2dnbGVMYWJlbCcgfCBmZFRyYW5zbGF0ZSlcIlxuICAgICAgICAgICAgW2ljb25UaXRsZV09XCJkaXNwbGF5Q2FsZW5kYXJUb2dnbGVMYWJlbCB8fCAoJ2NvcmVEYXRlUGlja2VyLmRpc3BsYXlDYWxlbmRhclRvZ2dsZUxhYmVsJyB8IGZkVHJhbnNsYXRlKVwiXG4gICAgICAgICAgICAoYWRkT25CdXR0b25DbGlja2VkKT1cInRvZ2dsZUNhbGVuZGFyKClcIlxuICAgICAgICA+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmZC1pbnB1dFwiXG4gICAgICAgICAgICAgICAgZmQtaW5wdXQtZ3JvdXAtaW5wdXRcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlclwiXG4gICAgICAgICAgICAgICAgW2F0dHIuaWRdPVwiaW5wdXRJZFwiXG4gICAgICAgICAgICAgICAgYXJpYS1oYXNwb3B1cD1cImdyaWRcIlxuICAgICAgICAgICAgICAgIGFyaWEtYXV0b2NvbXBsZXRlPVwibm9uZVwiXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJpc09wZW5cIlxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxsZWRieV09XCJhcmlhTGFiZWxsZWRCeVwiXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJfZGF0ZUlucHV0QXJpYWxMYWJlbCB8fCAoX2RhdGVJbnB1dEFyaWFsTGFiZWxLZXkgfCBmZFRyYW5zbGF0ZSlcIlxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtcmVxdWlyZWRdPVwicmVxdWlyZWRcIlxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtZGVzY3JpYmVkYnldPVwiX2Zvcm1WYWx1ZVN0YXRlTWVzc2FnZUlkXCJcbiAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJfaW5wdXRGaWVsZERhdGVcIlxuICAgICAgICAgICAgICAgIChrZXl1cC5lbnRlcik9XCJoYW5kbGVJbnB1dENoYW5nZSgkYW55KCRldmVudC50YXJnZXQpLnZhbHVlLCBmYWxzZSlcIlxuICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImhhbmRsZUlucHV0Q2hhbmdlKCRldmVudCwgdHJ1ZSlcIlxuICAgICAgICAgICAgICAgIChibHVyKT1cIl9vbkJsdXIoJGV2ZW50KVwiXG4gICAgICAgICAgICAvPlxuICAgICAgICA8L2ZkLWlucHV0LWdyb3VwPlxuICAgIDwvZmQtcG9wb3Zlci1jb250cm9sPlxuICAgIDxmZC1wb3BvdmVyLWJvZHkgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJpc09wZW5cIiBbYXR0ci5hcmlhLWhpZGRlbl09XCIhaXNPcGVuXCI+XG4gICAgICAgIDxmZC1mb3JtLW1lc3NhZ2UgW2VtYmVkZGVkXT1cInRydWVcIiAqbmdJZj1cIl9tZXNzYWdlXCIgW3R5cGVdPVwic3RhdGVcIj5cbiAgICAgICAgICAgIHt7IF9tZXNzYWdlIH19XG4gICAgICAgIDwvZmQtZm9ybS1tZXNzYWdlPlxuICAgICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG5cbiAgICAgICAgPGZkLWNhbGVuZGFyXG4gICAgICAgICAgICAoY2xvc2VDYWxlbmRhcik9XCJjbG9zZUZyb21DYWxlbmRhcigpXCJcbiAgICAgICAgICAgIFthY3RpdmVWaWV3XT1cImFjdGl2ZVZpZXdcIlxuICAgICAgICAgICAgW21hcmtXZWVrZW5kc109XCJtYXJrV2Vla2VuZHNcIlxuICAgICAgICAgICAgW3NwZWNpYWxEYXlzUnVsZXNdPVwic3BlY2lhbERheXNSdWxlc1wiXG4gICAgICAgICAgICBbc2hvd1dlZWtOdW1iZXJzXT1cInNob3dXZWVrTnVtYmVyc1wiXG4gICAgICAgICAgICBbYWdncmVnYXRlZFllYXJHcmlkXT1cImFnZ3JlZ2F0ZWRZZWFyR3JpZFwiXG4gICAgICAgICAgICBbeWVhckdyaWRdPVwieWVhckdyaWRcIlxuICAgICAgICAgICAgKGFjdGl2ZVZpZXdDaGFuZ2UpPVwiaGFuZGxlQ2FsZW5kYXJBY3RpdmVWaWV3Q2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgW2NhbFR5cGVdPVwidHlwZVwiXG4gICAgICAgICAgICBbcmFuZ2VIb3ZlckVmZmVjdF09XCJyYW5nZUhvdmVyRWZmZWN0XCJcbiAgICAgICAgICAgIFtkaXNhYmxlRnVuY3Rpb25dPVwiZGlzYWJsZUZ1bmN0aW9uXCJcbiAgICAgICAgICAgIFtkaXNhYmxlUmFuZ2VTdGFydEZ1bmN0aW9uXT1cImRpc2FibGVSYW5nZVN0YXJ0RnVuY3Rpb25cIlxuICAgICAgICAgICAgW2Rpc2FibGVSYW5nZUVuZEZ1bmN0aW9uXT1cImRpc2FibGVSYW5nZUVuZEZ1bmN0aW9uXCJcbiAgICAgICAgICAgIFtzZWxlY3RlZERhdGVdPVwic2VsZWN0ZWREYXRlXCJcbiAgICAgICAgICAgIFtzZWxlY3RlZFJhbmdlRGF0ZV09XCJzZWxlY3RlZFJhbmdlRGF0ZVwiXG4gICAgICAgICAgICAoc2VsZWN0ZWRSYW5nZURhdGVDaGFuZ2UpPVwiaGFuZGxlUmFuZ2VEYXRlQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgKHNlbGVjdGVkRGF0ZUNoYW5nZSk9XCJoYW5kbGVTaW5nbGVEYXRlQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgW3N0YXJ0aW5nRGF5T2ZXZWVrXT1cInN0YXJ0aW5nRGF5T2ZXZWVrXCJcbiAgICAgICAgICAgIFtwcmV2aW91c0J1dHRvbkRpc2FibGVGdW5jdGlvbl09XCJwcmV2aW91c0J1dHRvbkRpc2FibGVGdW5jdGlvblwiXG4gICAgICAgICAgICBbbmV4dEJ1dHRvbkRpc2FibGVGdW5jdGlvbl09XCJuZXh0QnV0dG9uRGlzYWJsZUZ1bmN0aW9uXCJcbiAgICAgICAgPjwvZmQtY2FsZW5kYXI+XG5cbiAgICAgICAgPGRpdiAqbmdJZj1cInNob3dUb2RheUJ1dHRvblwiIGZkLWJhciBiYXJEZXNpZ249XCJmb290ZXJcIj5cbiAgICAgICAgICAgIDxkaXYgZmQtYmFyLXJpZ2h0PlxuICAgICAgICAgICAgICAgIDxmZC1iYXItZWxlbWVudD5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBmZC1idXR0b24gW2xhYmVsXT1cInRvZGF5QnV0dG9uTGFiZWxcIiAoY2xpY2spPVwib25Ub2RheUJ1dHRvbkNsaWNrKClcIj48L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2ZkLWJhci1lbGVtZW50PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZmQtcG9wb3Zlci1ib2R5PlxuPC9mZC1wb3BvdmVyPlxuXG48ZGl2IHN0eWxlPVwiZGlzcGxheTogbm9uZVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgIDxkaXYgW2F0dHIuaWRdPVwiX2Zvcm1WYWx1ZVN0YXRlTWVzc2FnZUlkXCIgYXJpYS1hdG9taWM9XCJ0cnVlXCIgYXJpYS1saXZlPVwiYXNzZXJ0aXZlXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cInN0YXRlXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInc3VjY2VzcydcIj57e1xuICAgICAgICAgICAgICAgIHZhbHVlU3RhdGVTdWNjZXNzTWVzc2FnZSB8fCAoJ2NvcmVEYXRlUGlja2VyLnZhbHVlU3RhdGVTdWNjZXNzTWVzc2FnZScgfCBmZFRyYW5zbGF0ZSlcbiAgICAgICAgICAgIH19PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInaW5mb3JtYXRpb24nXCI+e3tcbiAgICAgICAgICAgICAgICB2YWx1ZVN0YXRlSW5mb3JtYXRpb25NZXNzYWdlIHx8ICgnY29yZURhdGVQaWNrZXIudmFsdWVTdGF0ZUluZm9ybWF0aW9uTWVzc2FnZScgfCBmZFRyYW5zbGF0ZSlcbiAgICAgICAgICAgIH19PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInd2FybmluZydcIj57e1xuICAgICAgICAgICAgICAgIHZhbHVlU3RhdGVXYXJuaW5nTWVzc2FnZSB8fCAoJ2NvcmVEYXRlUGlja2VyLnZhbHVlU3RhdGVXYXJuaW5nTWVzc2FnZScgfCBmZFRyYW5zbGF0ZSlcbiAgICAgICAgICAgIH19PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInZXJyb3InXCI+e3tcbiAgICAgICAgICAgICAgICB2YWx1ZVN0YXRlRXJyb3JNZXNzYWdlIHx8ICgnY29yZURhdGVQaWNrZXIudmFsdWVTdGF0ZUVycm9yTWVzc2FnZScgfCBmZFRyYW5zbGF0ZSlcbiAgICAgICAgICAgIH19PC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICB7eyBfbWVzc2FnZSB9fVxuICAgIDwvZGl2PlxuPC9kaXY+XG4iXX0=
826
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1waWNrZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy9jb3JlL3NyYy9saWIvZGF0ZS1waWNrZXIvZGF0ZS1waWNrZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vbGlicy9jb3JlL3NyYy9saWIvZGF0ZS1waWNrZXIvZGF0ZS1waWNrZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVILHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osVUFBVSxFQUNWLE1BQU0sRUFDTixLQUFLLEVBR0wsUUFBUSxFQUNSLE1BQU0sRUFDTixTQUFTLEVBQ1QsaUJBQWlCLEVBQ3BCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBd0IsYUFBYSxFQUFFLGlCQUFpQixFQUFhLE1BQU0sZ0JBQWdCLENBQUM7QUFDbkcsT0FBTyxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDN0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRTlELE9BQU8sRUFDSCxpQkFBaUIsRUFHakIsU0FBUyxFQUlaLE1BQU0sZ0NBQWdDLENBQUM7QUFDeEMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGVBQWUsRUFBbUIsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNyRyxPQUFPLEVBQW1CLHlCQUF5QixFQUFFLHVCQUF1QixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDakgsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQy9ELE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQzdFLE9BQU8sRUFBRSxvQ0FBb0MsRUFBRSxNQUFNLFVBQVUsQ0FBQzs7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QUFLO2dCQVFOLFNBQVM7c0JBRFIsS0FBSztnQkFLTixRQUFRO3NCQURQLEtBQUs7Z0JBS04sUUFBUTtzQkFEUCxLQUFLO2dCQUtOLGlCQUFpQjtzQkFEaEIsS0FBSztnQkFLTixlQUFlO3NCQURkLEtBQUs7Z0JBS04sZ0JBQWdCO3NCQURmLEtBQUs7Z0JBT04sNkJBQTZCO3NCQUQ1QixLQUFLO2dCQU9OLHlCQUF5QjtzQkFEeEIsS0FBSztnQkFTRixLQUFLO3NCQURSLEtBQUs7Z0JBbUJOLGVBQWU7c0JBRGQsS0FBSztnQkFXTixnQkFBZ0I7c0JBRGYsS0FBSztnQkFRTixRQUFRO3NCQURQLEtBQUs7Z0JBV04sa0JBQWtCO3NCQURqQixLQUFLO2dCQVVOLFlBQVk7c0JBRFgsS0FBSztnQkFPTixlQUFlO3NCQURkLEtBQUs7Z0JBS04sTUFBTTtzQkFETCxLQUFLO2dCQUtOLE1BQU07c0JBREwsS0FBSztnQkFLTixjQUFjO3NCQURiLEtBQUs7Z0JBU0Ysa0JBQWtCO3NCQURyQixLQUFLO2dCQWFOLG9CQUFvQjtzQkFEbkIsS0FBSztnQkFRRyxZQUFZO3NCQURwQixNQUFNO2dCQUtFLGtCQUFrQjtzQkFEMUIsTUFBTTtnQkFLRSx1QkFBdUI7c0JBRC9CLE1BQU07Z0JBS0UsZ0JBQWdCO3NCQUR4QixNQUFNO2dCQUtQLGtCQUFrQjtzQkFEakIsU0FBUzt1QkFBQyxpQkFBaUI7Z0JBTzVCLGtCQUFrQjtzQkFIakIsU0FBUzt1QkFBQyxxQkFBcUIsRUFBRTt3QkFDOUIsSUFBSSxFQUFFLFVBQVU7cUJBQ25CO2dCQU9ELGFBQWE7c0JBSFosU0FBUzt1QkFBQyx3QkFBd0IsRUFBRTt3QkFDakMsSUFBSSxFQUFFLFVBQVU7cUJBQ25CO2dCQStDRCxlQUFlO3NCQURkLEtBQUs7Z0JBUU4seUJBQXlCO3NCQUR4QixLQUFLO2dCQVFOLHVCQUF1QjtzQkFEdEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQWZ0ZXJWaWV3SW5pdCxcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBDb21wb25lbnQsXG4gICAgRWxlbWVudFJlZixcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgZm9yd2FyZFJlZixcbiAgICBJbmplY3QsXG4gICAgSW5wdXQsXG4gICAgT25EZXN0cm95LFxuICAgIE9uSW5pdCxcbiAgICBPcHRpb25hbCxcbiAgICBPdXRwdXQsXG4gICAgVmlld0NoaWxkLFxuICAgIFZpZXdFbmNhcHN1bGF0aW9uXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTElEQVRPUlMsIE5HX1ZBTFVFX0FDQ0VTU09SLCBWYWxpZGF0b3IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBTdWJqZWN0LCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2VyY2lvbic7XG5pbXBvcnQgeyBQbGFjZW1lbnQsIFNwZWNpYWxEYXlSdWxlIH0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9jb3JlL3NoYXJlZCc7XG5pbXBvcnQge1xuICAgIENhbGVuZGFyQ29tcG9uZW50LFxuICAgIENhbGVuZGFyVHlwZSxcbiAgICBDYWxlbmRhclllYXJHcmlkLFxuICAgIERhdGVSYW5nZSxcbiAgICBEYXlzT2ZXZWVrLFxuICAgIEZkQ2FsZW5kYXJWaWV3LFxuICAgIE5hdmlnYXRpb25CdXR0b25EaXNhYmxlRnVuY3Rpb25cbn0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9jb3JlL2NhbGVuZGFyJztcbmltcG9ydCB7IERBVEVfVElNRV9GT1JNQVRTLCBEYXRldGltZUFkYXB0ZXIsIERhdGVUaW1lRm9ybWF0cyB9IGZyb20gJ0BmdW5kYW1lbnRhbC1uZ3gvY29yZS9kYXRldGltZSc7XG5pbXBvcnQgeyBGb3JtSXRlbUNvbnRyb2wsIFBvcG92ZXJGb3JtTWVzc2FnZVNlcnZpY2UsIHJlZ2lzdGVyRm9ybUl0ZW1Db250cm9sIH0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9jb3JlL2Zvcm0nO1xuaW1wb3J0IHsgUG9wb3ZlclNlcnZpY2UgfSBmcm9tICdAZnVuZGFtZW50YWwtbmd4L2NvcmUvcG9wb3Zlcic7XG5pbXBvcnQgeyBJbnB1dEdyb3VwSW5wdXREaXJlY3RpdmUgfSBmcm9tICdAZnVuZGFtZW50YWwtbmd4L2NvcmUvaW5wdXQtZ3JvdXAnO1xuaW1wb3J0IHsgY3JlYXRlTWlzc2luZ0RhdGVJbXBsZW1lbnRhdGlvbkVycm9yIH0gZnJvbSAnLi9lcnJvcnMnO1xuaW1wb3J0IHsgTnVsbGFibGUgfSBmcm9tICdAZnVuZGFtZW50YWwtbmd4L2Nkay91dGlscyc7XG5pbXBvcnQgeyBGb3JtU3RhdGVzIH0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9jZGsvZm9ybXMnO1xuXG5sZXQgZGF0ZVBpY2tlckNvdW50ZXIgPSAwO1xuXG4vKipcbiAqIFRoZSBkYXRldGltZSBwaWNrZXIgY29tcG9uZW50IGlzIGFuIG9waW5pb25hdGVkIGNvbXBvc2l0aW9uIG9mIHRoZSBmZC1wb3BvdmVyIGFuZFxuICogZmQtY2FsZW5kYXIgY29tcG9uZW50cyB0byBhY2NvbXBsaXNoIHRoZSBVSSBwYXR0ZXJuIGZvciBwaWNraW5nIGEgZGF0ZS5cbiAqXG4gKiBTdXBwb3J0cyBBbmd1bGFyIEZvcm1zLlxuICogYGBgaHRtbFxuICogPGZkLWRhdGUtcGlja2VyIFsobmdNb2RlbCldPVwiZGF0ZVwiPjwvZmQtZGF0ZS1waWNrZXI+XG4gKiBgYGBcbiAqXG4gKi9cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnZmQtZGF0ZS1waWNrZXInLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9kYXRlLXBpY2tlci5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vZGF0ZS1waWNrZXIuY29tcG9uZW50LnNjc3MnXSxcbiAgICBob3N0OiB7XG4gICAgICAgICcoYmx1ciknOiAnb25Ub3VjaGVkKCknLFxuICAgICAgICAnW2NsYXNzLmZkLWRhdGUtcGlja2VyXSc6ICd0cnVlJyxcbiAgICAgICAgJ1tjbGFzcy5mZC1kYXRlLXBpY2tlci1jdXN0b21dJzogJ2lubGluZSdcbiAgICB9LFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgICAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IERhdGVQaWNrZXJDb21wb25lbnQpLFxuICAgICAgICAgICAgbXVsdGk6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgcHJvdmlkZTogTkdfVkFMSURBVE9SUyxcbiAgICAgICAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IERhdGVQaWNrZXJDb21wb25lbnQpLFxuICAgICAgICAgICAgbXVsdGk6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgcmVnaXN0ZXJGb3JtSXRlbUNvbnRyb2woRGF0ZVBpY2tlckNvbXBvbmVudCksXG4gICAgICAgIFBvcG92ZXJGb3JtTWVzc2FnZVNlcnZpY2UsXG4gICAgICAgIFBvcG92ZXJTZXJ2aWNlXG4gICAgXSxcbiAgICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIERhdGVQaWNrZXJDb21wb25lbnQ8RD5cbiAgICBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBBZnRlclZpZXdJbml0LCBDb250cm9sVmFsdWVBY2Nlc3NvciwgVmFsaWRhdG9yLCBGb3JtSXRlbUNvbnRyb2xcbntcbiAgICAvKiogVGhlIHR5cGUgb2YgY2FsZW5kYXIsICdzaW5nbGUnIGZvciBzaW5nbGUgZGF0ZSBzZWxlY3Rpb24gb3IgJ3JhbmdlJyBmb3IgYSByYW5nZSBvZiBkYXRlcy4gKi9cbiAgICBASW5wdXQoKVxuICAgIHR5cGU6IENhbGVuZGFyVHlwZSA9ICdzaW5nbGUnO1xuXG4gICAgLyoqIERhdGUgcGlja2VyIGlucHV0IHBsYWNlaG9sZGVyIHN0cmluZyAqL1xuICAgIEBJbnB1dCgpXG4gICAgcGxhY2Vob2xkZXIgPSAnJztcblxuICAgIC8qKiBJRCBhdHRyaWJ1dGUgZm9yIGlucHV0IGVsZW1lbnQgaW5zaWRlIERhdGVQaWNrZXIgY29tcG9uZW50ICovXG4gICAgQElucHV0KClcbiAgICBpbnB1dElkOiBzdHJpbmc7XG5cbiAgICAvKiogSWYgaXQgaXMgbWFuZGF0b3J5IGZpZWxkICovXG4gICAgQElucHV0KClcbiAgICByZXF1aXJlZCA9IGZhbHNlO1xuXG4gICAgLyoqIFRleHQgZGlzcGxheWVkIGluIG1lc3NhZ2UgKi9cbiAgICBASW5wdXQoKVxuICAgIHNldCBtZXNzYWdlKG1lc3NhZ2U6IHN0cmluZykge1xuICAgICAgICB0aGlzLl9tZXNzYWdlID0gbWVzc2FnZTtcbiAgICAgICAgdGhpcy5fcG9wb3ZlckZvcm1NZXNzYWdlLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgX21lc3NhZ2U6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gICAgLyoqIFRoZSB0cmlnZ2VyIGV2ZW50cyB0aGF0IHdpbGwgb3Blbi9jbG9zZSB0aGUgbWVzc2FnZSBib3guXG4gICAgICogIEFjY2VwdHMgYW55IFtIVE1MIERPTSBFdmVudHNdKGh0dHBzOi8vd3d3Lnczc2Nob29scy5jb20vanNyZWYvZG9tX29ial9ldmVudC5hc3ApLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgc2V0IG1lc3NhZ2VUcmlnZ2Vycyh0cmlnZ2Vyczogc3RyaW5nW10pIHtcbiAgICAgICAgdGhpcy5fbWVzc2FnZVRyaWdnZXJzID0gdHJpZ2dlcnM7XG4gICAgICAgIHRoaXMuX3BvcG92ZXJGb3JtTWVzc2FnZS50cmlnZ2VycyA9IHRyaWdnZXJzO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgX21lc3NhZ2VUcmlnZ2Vyczogc3RyaW5nW10gPSBbJ2ZvY3VzaW4nLCAnZm9jdXNvdXQnXTtcblxuICAgIC8qKiBUaGUgY3VycmVudGx5IHNlbGVjdGVkIENhbGVuZGFyRGF5IG1vZGVsICovXG4gICAgQElucHV0KClcbiAgICBzZWxlY3RlZERhdGU6IE51bGxhYmxlPEQ+O1xuXG4gICAgLyoqIFRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgRmREYXRlcyBtb2RlbCBzdGFydCBhbmQgZW5kIGluIHJhbmdlIG1vZGUuICovXG4gICAgQElucHV0KClcbiAgICBzZWxlY3RlZFJhbmdlRGF0ZTogRGF0ZVJhbmdlPEQ+ID0geyBzdGFydDogbnVsbCwgZW5kOiBudWxsIH07XG5cbiAgICAvKiogVGhlIGRheSBvZiB0aGUgd2VlayB0aGUgY2FsZW5kYXIgc2hvdWxkIHN0YXJ0IG9uLiAxIHJlcHJlc2VudHMgU3VuZGF5LCAyIGlzIE1vbmRheSwgMyBpcyBUdWVzZGF5LCBhbmQgc28gb24uICovXG4gICAgQElucHV0KClcbiAgICBzdGFydGluZ0RheU9mV2VlazogRGF5c09mV2VlaztcblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdXNlciB3YW50cyB0byBtYXJrIGRheSBjZWxscyBvbiBob3Zlci5cbiAgICAgKiBXb3JrcyBvbmx5IG9uIHJhbmdlIG1vZGUsIHdoZW4gc3RhcnQgZGF0ZSBpcyBzZWxlY3RlZCBvbiBEYXkgVmlldy5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHJhbmdlSG92ZXJFZmZlY3QgPSBmYWxzZTtcblxuICAgIC8qKiBXaGV0aGVyIHRvIHZhbGlkYXRlIHRoZSBkYXRlIHBpY2tlciBpbnB1dC4gKi9cbiAgICBASW5wdXQoKVxuICAgIHVzZVZhbGlkYXRpb24gPSB0cnVlO1xuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgdXNlIGkxOG4gY2FwYWJpbGl0aWVzIGluc3RlYWRcbiAgICAgKiBBcmlhLWxhYmVsIGZvciB0aGUgZGF0ZXBpY2tlciBpbnB1dC5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHNldCBkYXRlSW5wdXRMYWJlbCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgIFwiUHJvcGVydHkgZGF0ZUlucHV0TGFiZWwgaXMgZGVwcmVjYXRlZC4gVXNlIGkxOG4gY2FwYWJpbGl0aWVzICdjb3JlRGF0ZVBpY2tlci5kYXRlSW5wdXRMYWJlbCcga2V5IGluc3RlYWQuXCJcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5fZGF0ZUlucHV0TGFiZWwgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICBnZXQgZGF0ZUlucHV0TGFiZWwoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGVJbnB1dExhYmVsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIHVzZSBpMThuIGNhcGFiaWxpdGllcyBpbnN0ZWFkXG4gICAgICogQXJpYS1sYWJlbCBmb3IgdGhlIGRhdGVwaWNrZXIgaW5wdXQuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBzZXQgZGF0ZVJhbmdlSW5wdXRMYWJlbCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgIFwiUHJvcGVydHkgZGF0ZVJhbmdlSW5wdXRMYWJlbCBpcyBkZXByZWNhdGVkLiBVc2UgaTE4biBjYXBhYmlsaXRpZXMgJ2NvcmVEYXRlUGlja2VyLmRhdGVSYW5nZUlucHV0TGFiZWwnIGtleSBpbnN0ZWFkLlwiXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuX2RhdGVSYW5nZUlucHV0TGFiZWwgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICBnZXQgZGF0ZVJhbmdlSW5wdXRMYWJlbCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGF0ZVJhbmdlSW5wdXRMYWJlbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCB1c2UgaTE4biBjYXBhYmlsaXRpZXMgaW5zdGVhZFxuICAgICAqIEFyaWEtbGFiZWwgZm9yIHRoZSBidXR0b24gdG8gc2hvdy9oaWRlIHRoZSBjYWxlbmRhci5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHNldCBkaXNwbGF5Q2FsZW5kYXJUb2dnbGVMYWJlbCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgIFwiUHJvcGVydHkgZGlzcGxheUNhbGVuZGFyVG9nZ2xlTGFiZWwgaXMgZGVwcmVjYXRlZC4gVXNlIGkxOG4gY2FwYWJpbGl0aWVzICdjb3JlRGF0ZVBpY2tlci5kaXNwbGF5Q2FsZW5kYXJUb2dnbGVMYWJlbCcga2V5IGluc3RlYWQuXCJcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5fZGlzcGxheUNhbGVuZGFyVG9nZ2xlTGFiZWwgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICBnZXQgZGlzcGxheUNhbGVuZGFyVG9nZ2xlTGFiZWwoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Rpc3BsYXlDYWxlbmRhclRvZ2dsZUxhYmVsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIHVzZSBpMThuIGNhcGFiaWxpdGllcyBpbnN0ZWFkXG4gICAgICogVmFsdWUgc3RhdGUgXCJzdWNjZXNzXCIgYXJpYSBtZXNzYWdlLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgc2V0IHZhbHVlU3RhdGVTdWNjZXNzTWVzc2FnZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgIFwiUHJvcGVydHkgdmFsdWVTdGF0ZVN1Y2Nlc3NNZXNzYWdlIGlzIGRlcHJlY2F0ZWQuIFVzZSBpMThuIGNhcGFiaWxpdGllcyAnY29yZURhdGVQaWNrZXIudmFsdWVTdGF0ZVN1Y2Nlc3NNZXNzYWdlJyBrZXkgaW5zdGVhZC5cIlxuICAgICAgICApO1xuICAgICAgICB0aGlzLl92YWx1ZVN0YXRlU3VjY2Vzc01lc3NhZ2UgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICBnZXQgdmFsdWVTdGF0ZVN1Y2Nlc3NNZXNzYWdlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl92YWx1ZVN0YXRlU3VjY2Vzc01lc3NhZ2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgdXNlIGkxOG4gY2FwYWJpbGl0aWVzIGluc3RlYWRcbiAgICAgKiBWYWx1ZSBzdGF0ZSBcImluZm9ybWF0aW9uXCIgYXJpYSBtZXNzYWdlLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgc2V0IHZhbHVlU3RhdGVJbmZvcm1hdGlvbk1lc3NhZ2UodmFsdWU6IHN0cmluZykge1xuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICBcIlByb3BlcnR5IHZhbHVlU3RhdGVJbmZvcm1hdGlvbk1lc3NhZ2UgaXMgZGVwcmVjYXRlZC4gVXNlIGkxOG4gY2FwYWJpbGl0aWVzICdjb3JlRGF0ZVBpY2tlci52YWx1ZVN0YXRlSW5mb3JtYXRpb25NZXNzYWdlJyBrZXkgaW5zdGVhZC5cIlxuICAgICAgICApO1xuICAgICAgICB0aGlzLl92YWx1ZVN0YXRlSW5mb3JtYXRpb25NZXNzYWdlID0gdmFsdWU7XG4gICAgfVxuXG4gICAgZ2V0IHZhbHVlU3RhdGVJbmZvcm1hdGlvbk1lc3NhZ2UoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlU3RhdGVJbmZvcm1hdGlvbk1lc3NhZ2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgdXNlIGkxOG4gY2FwYWJpbGl0aWVzIGluc3RlYWRcbiAgICAgKiBWYWx1ZSBzdGF0ZSBcIndhcm5pbmdcIiBhcmlhIG1lc3NhZ2UuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBzZXQgdmFsdWVTdGF0ZVdhcm5pbmdNZXNzYWdlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgXCJQcm9wZXJ0eSB2YWx1ZVN0YXRlV2FybmluZ01lc3NhZ2UgaXMgZGVwcmVjYXRlZC4gVXNlIGkxOG4gY2FwYWJpbGl0aWVzICdjb3JlRGF0ZVBpY2tlci52YWx1ZVN0YXRlV2FybmluZ01lc3NhZ2UnIGtleSBpbnN0ZWFkLlwiXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuX3ZhbHVlU3RhdGVXYXJuaW5nTWVzc2FnZSA9IHZhbHVlO1xuICAgIH1cblxuICAgIGdldCB2YWx1ZVN0YXRlV2FybmluZ01lc3NhZ2UoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlU3RhdGVXYXJuaW5nTWVzc2FnZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCB1c2UgaTE4biBjYXBhYmlsaXRpZXMgaW5zdGVhZFxuICAgICAqIFZhbHVlIHN0YXRlIFwiZXJyb3JcIiBhcmlhIG1lc3NhZ2UuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBzZXQgdmFsdWVTdGF0ZUVycm9yTWVzc2FnZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgIFwiUHJvcGVydHkgdmFsdWVTdGF0ZUVycm9yTWVzc2FnZSBpcyBkZXByZWNhdGVkLiBVc2UgaTE4biBjYXBhYmlsaXRpZXMgJ2NvcmVEYXRlUGlja2VyLnZhbHVlU3RhdGVFcnJvck1lc3NhZ2UnIGtleSBpbnN0ZWFkLlwiXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuX3ZhbHVlU3RhdGVFcnJvck1lc3NhZ2UgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICBnZXQgdmFsdWVTdGF0ZUVycm9yTWVzc2FnZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fdmFsdWVTdGF0ZUVycm9yTWVzc2FnZTtcbiAgICB9XG5cbiAgICAvKiogV2hldGhlciBhIG51bGwgaW5wdXQgaXMgY29uc2lkZXJlZCB2YWxpZC4gKi9cbiAgICBASW5wdXQoKVxuICAgIGFsbG93TnVsbCA9IHRydWU7XG5cbiAgICAvKiogQWN0dWFsbHkgc2hvd24gYWN0aXZlIHZpZXcgb25lIG9mICdkYXknIHwgJ21vbnRoJyB8ICd5ZWFyJyBpbiBjYWxlbmRhciBjb21wb25lbnQqL1xuICAgIEBJbnB1dCgpXG4gICAgYWN0aXZlVmlldzogRmRDYWxlbmRhclZpZXcgPSAnZGF5JztcblxuICAgIC8qKlxuICAgICAqICBUaGUgcGxhY2VtZW50IG9mIHRoZSBwb3BvdmVyLiBJdCBjYW4gYmUgb25lIG9mOiB0b3AsIHRvcC1zdGFydCwgdG9wLWVuZCwgYm90dG9tLFxuICAgICAqICBib3R0b20tc3RhcnQsIGJvdHRvbS1lbmQsIHJpZ2h0LCByaWdodC1zdGFydCwgcmlnaHQtZW5kLCBsZWZ0LCBsZWZ0LXN0YXJ0LCBsZWZ0LWVuZC5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHBsYWNlbWVudDogUGxhY2VtZW50ID0gJ2JvdHRvbS1zdGFydCc7XG5cbiAgICAvKiogVGhlIGVsZW1lbnQgdG8gd2hpY2ggdGhlIHBvcG92ZXIgc2hvdWxkIGJlIGFwcGVuZGVkLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgYXBwZW5kVG86IEVsZW1lbnRSZWY7XG5cbiAgICAvKiogV2hldGhlciB0aGUgZGF0ZSBwaWNrZXIgaXMgZGlzYWJsZWQuICovXG4gICAgQElucHV0KClcbiAgICBkaXNhYmxlZDogYm9vbGVhbjtcblxuICAgIC8qKiBEZWZpbmVzIGlmIGRhdGUgcGlja2VyIHNob3VsZCBiZSBjbG9zZWQgYWZ0ZXIgZGF0ZSBjaG9vc2UgKi9cbiAgICBASW5wdXQoKVxuICAgIGNsb3NlT25EYXRlQ2hvb3NlID0gdHJ1ZTtcblxuICAgIC8qKiBFbmFibGVzIFRvZGF5LVNlbGVjdGlvbi1CdXR0b24gaWYgdHJ1ZSAqL1xuICAgIEBJbnB1dCgpXG4gICAgc2hvd1RvZGF5QnV0dG9uID0gZmFsc2U7XG5cbiAgICAvKiogTGFiZWwgZm9yIFRvZGF5LVNlbGVjdGlvbi1CdXR0b24gKi9cbiAgICBASW5wdXQoKVxuICAgIHRvZGF5QnV0dG9uTGFiZWwgPSAnVG9kYXknO1xuXG4gICAgLyoqXG4gICAgICogRnVuY3Rpb24gdXNlZCB0byBkaXNhYmxlIHByZXZpb3VzIGJ1dHRvbiBpbiB0aGUgY2FsZW5kYXIgaGVhZGVyLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHJldmlvdXNCdXR0b25EaXNhYmxlRnVuY3Rpb246IE5hdmlnYXRpb25CdXR0b25EaXNhYmxlRnVuY3Rpb248RD47XG5cbiAgICAvKipcbiAgICAgKiBGdW5jdGlvbiB1c2VkIHRvIGRpc2FibGUgbmV4dCBidXR0b24gaW4gdGhlIGNhbGVuZGFyIGhlYWRlci5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIG5leHRCdXR0b25EaXNhYmxlRnVuY3Rpb246IE5hdmlnYXRpb25CdXR0b25EaXNhYmxlRnVuY3Rpb248RD47XG5cbiAgICAvKipcbiAgICAgKiAgVGhlIHN0YXRlIG9mIHRoZSBmb3JtIGNvbnRyb2wgLSBhcHBsaWVzIGNzcyBjbGFzc2VzLlxuICAgICAqICBBbHNvLCB0aGlzIGlzIGFwcGxpZWQgdG8gbWVzc2FnZS5cbiAgICAgKiAgQ2FuIGJlIGBzdWNjZXNzYCwgYGVycm9yYCwgYHdhcm5pbmdgLCBgaW5mb3JtYXRpb25gIG9yIGJsYW5rIGZvciBkZWZhdWx0LlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgc2V0IHN0YXRlKHN0YXRlOiBOdWxsYWJsZTxGb3JtU3RhdGVzPikge1xuICAgICAgICB0aGlzLl9zdGF0ZSA9IHN0YXRlIHx8ICdkZWZhdWx0JztcbiAgICAgICAgdGhpcy5fcG9wb3ZlckZvcm1NZXNzYWdlLm1lc3NhZ2VUeXBlID0gc3RhdGUgfHwgJ2RlZmF1bHQnO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgZ2V0IHN0YXRlKCk6IEZvcm1TdGF0ZXMge1xuICAgICAgICBpZiAodGhpcy5fc3RhdGUgPT0gbnVsbCAmJiB0aGlzLnVzZVZhbGlkYXRpb24gJiYgdGhpcy5faXNJbnZhbGlkRGF0ZUlucHV0KSB7XG4gICAgICAgICAgICByZXR1cm4gJ2Vycm9yJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fc3RhdGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV2hldGhlciBBZGRPbiBCdXR0b24gc2hvdWxkIGJlIGZvY3VzYWJsZVxuICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIGJ1dHRvbkZvY3VzYWJsZSA9IHRydWU7XG5cbiAgICAvKipcbiAgICAgKiBTcGVjaWFsIGRheXMgbWFyaywgaXQgY2FuIGJlIHVzZWQgYnkgcGFzc2luZyBhcnJheSBvZiBvYmplY3Qgd2l0aFxuICAgICAqIFNwZWNpYWwgZGF5IG51bWJlciwgbGlzdCAxLTIwIFtjbGFzczpgZmQtY2FsZW5kYXJfX3NwZWNpYWwtZGF5LS17e251bWJlcn19YF0gaXMgYXZhaWxhYmxlIHRoZXJlOlxuICAgICAqIGh0dHBzOi8vc2FwLmdpdGh1Yi5pby9mdW5kYW1lbnRhbC1zdHlsZXMvY29tcG9uZW50cy9jYWxlbmRhci5odG1sIGNhbGVuZGFyIHNwZWNpYWwgZGF5cyBzZWN0aW9uXG4gICAgICogUnVsZSBhY2NlcHRzIG1ldGhvZCB3aXRoIEZkRGF0ZSBvYmplY3QgYXMgYSBwYXJhbWV0ZXIuIGV4OlxuICAgICAqIGBydWxlOiAoZmREYXRlOiBGZERhdGUpID0+IGZkRGF0ZS5nZXREYXkoKSA9PT0gMWAsIHdoaWNoIHdpbGwgbWFyayBhbGwgc3VuZGF5cyBhcyBzcGVjaWFsIGRheS5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHNwZWNpYWxEYXlzUnVsZXM6IFNwZWNpYWxEYXlSdWxlPEQ+W10gPSBbXTtcblxuICAgIC8qKlxuICAgICAqIE9iamVjdCB0byBjdXN0b21pemUgeWVhciBncmlkLFxuICAgICAqIFJvdywgQ29sdW1ucyBhbmQgbWV0aG9kIHRvIGRpc3BsYXkgeWVhciBjYW4gYmUgbW9kaWZpZWRcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHllYXJHcmlkOiBDYWxlbmRhclllYXJHcmlkID0ge1xuICAgICAgICByb3dzOiA0LFxuICAgICAgICBjb2xzOiA1XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIE9iamVjdCB0byBjdXN0b21pemUgYWdncmVnYXRlZCB5ZWFyIGdyaWQsXG4gICAgICogUm93LCBDb2x1bW5zIGFuZCBtZXRob2QgdG8gZGlzcGxheSB5ZWFyIGNhbiBiZSBtb2RpZmllZFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgYWdncmVnYXRlZFllYXJHcmlkOiBDYWxlbmRhclllYXJHcmlkID0ge1xuICAgICAgICByb3dzOiA0LFxuICAgICAgICBjb2xzOiAzXG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdXNlciB3YW50cyB0byBtYXJrIHN1bmRheS9zYXR1cmRheSB3aXRoIGBmZC1jYWxlbmRhcl9faXRlbS0td2Vla2VuZGAgY2xhc3NcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIG1hcmtXZWVrZW5kcyA9IHRydWU7XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHVzZXIgd2FudHMgdG8gc2hvdyB3ZWVrIG51bWJlcnMgbmV4dCB0byBkYXlzXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBzaG93V2Vla051bWJlcnMgPSB0cnVlO1xuXG4gICAgLyoqIFdoZXRoZXIgdGhlIGRhdGUgcGlja2VyIGlzIG9wZW4uIENhbiBiZSB1c2VkIHRocm91Z2ggdHdvLXdheSBiaW5kaW5nLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgaXNPcGVuID0gZmFsc2U7XG5cbiAgICAvKiogU2hvdWxkIGRhdGUgcGlja2VyIGJlIGlubGluZWQuICovXG4gICAgQElucHV0KClcbiAgICBpbmxpbmUgPSB0cnVlO1xuXG4gICAgLyoqIGFyaWEtbGFiZWxsZWRieSBmb3IgZWxlbWVudCBkZXNjcmliaW5nIGRhdGUtcGlja2VyLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgYXJpYUxhYmVsbGVkQnk6IE51bGxhYmxlPHN0cmluZz47XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRvIHJlY2FsY3VsYXRlIHZhbHVlIGZyb20gdGhlIGlucHV0IGFzIHVzZXIgdHlwZXMgb3Igb24gYmx1ci5cbiAgICAgKiBCeSBkZWZhdWx0LCB1cGRhdGVzIHRoZSB2YWx1ZSBhcyB1c2VyIHR5cGVzLlxuICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBzZXQgcHJvY2Vzc0lucHV0T25CbHVyKHY6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5fcHJvY2Vzc0lucHV0T25CbHVyID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHYpO1xuICAgIH1cblxuICAgIGdldCBwcm9jZXNzSW5wdXRPbkJsdXIoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wcm9jZXNzSW5wdXRPbkJsdXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV2hldGhlciB0byBwcmV2ZW50IHBhZ2Ugc2Nyb2xsaW5nIHdoZW4gZm9jdXNpbmcgZGF0ZSBwaWNrZXIgaW5wdXQgZmllbGQgYWZ0ZXIgY2FsZW5kYXIgaGFzIGJlZW4gY2xvc2VkLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHJldmVudFNjcm9sbE9uRm9jdXMgPSBmYWxzZTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgX3Byb2Nlc3NJbnB1dE9uQmx1ciA9IGZhbHNlO1xuXG4gICAgLyoqIEV2ZW50IGVtaXR0ZWQgd2hlbiB0aGUgc3RhdGUgb2YgdGhlIGlzT3BlbiBwcm9wZXJ0eSBjaGFuZ2VzLiAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHJlYWRvbmx5IGlzT3BlbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICAgIC8qKiBGaXJlZCB3aGVuIGEgbmV3IGRhdGUgaXMgc2VsZWN0ZWQuICovXG4gICAgQE91dHB1dCgpXG4gICAgcmVhZG9ubHkgc2VsZWN0ZWREYXRlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxOdWxsYWJsZTxEPj4oKTtcblxuICAgIC8qKiBFdmVudCB0aHJvd24gZXZlcnkgdGltZSBzZWxlY3RlZCBmaXJzdCBvciBsYXN0IGRhdGUgaW4gcmFuZ2UgbW9kZSBpcyBjaGFuZ2VkICovXG4gICAgQE91dHB1dCgpXG4gICAgcmVhZG9ubHkgc2VsZWN0ZWRSYW5nZURhdGVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPERhdGVSYW5nZTxEPj4oKTtcblxuICAgIC8qKiBFdmVudCB0aHJvd24gZXZlcnkgdGltZSBjYWxlbmRhciBhY3RpdmUgdmlldyBpcyBjaGFuZ2VkICovXG4gICAgQE91dHB1dCgpXG4gICAgcmVhZG9ubHkgYWN0aXZlVmlld0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8RmRDYWxlbmRhclZpZXc+KCk7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIEBWaWV3Q2hpbGQoQ2FsZW5kYXJDb21wb25lbnQpXG4gICAgX2NhbGVuZGFyQ29tcG9uZW50OiBDYWxlbmRhckNvbXBvbmVudDxEPjtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgQFZpZXdDaGlsZCgnaW5wdXRHcm91cENvbXBvbmVudCcsIHtcbiAgICAgICAgcmVhZDogRWxlbWVudFJlZlxuICAgIH0pXG4gICAgX2lucHV0R3JvdXBFbGVtZW50OiBFbGVtZW50UmVmO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBAVmlld0NoaWxkKElucHV0R3JvdXBJbnB1dERpcmVjdGl2ZSwge1xuICAgICAgICByZWFkOiBFbGVtZW50UmVmXG4gICAgfSlcbiAgICBfaW5wdXRFbGVtZW50OiBFbGVtZW50UmVmPEhUTUxJbnB1dEVsZW1lbnQ+O1xuXG4gICAgLyoqIEBoaWRkZW4gVGhlIHZhbHVlIG9mIHRoZSBpbnB1dCAqL1xuICAgIF9pbnB1dEZpZWxkRGF0ZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgICAvKiogQGhpZGRlbiBXaGV0aGVyIHRoZSBkYXRlIGlucHV0IGlzIGludmFsaWQgKi9cbiAgICBfaXNJbnZhbGlkRGF0ZUlucHV0ID0gZmFsc2U7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHJlYWRvbmx5IF9mb3JtVmFsdWVTdGF0ZU1lc3NhZ2VJZCA9IGBmZC1kYXRlLXBpY2tlci1mb3JtLW1lc3NhZ2UtJHtkYXRlUGlja2VyQ291bnRlcisrfWA7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX29uRGVzdHJveSQ6IFN1YmplY3Q8dm9pZD4gPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9zdWJzY3JpcHRpb25zID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9kYXRlSW5wdXRMYWJlbDogc3RyaW5nO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9kYXRlUmFuZ2VJbnB1dExhYmVsOiBzdHJpbmc7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX2Rpc3BsYXlDYWxlbmRhclRvZ2dsZUxhYmVsOiBzdHJpbmc7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX3ZhbHVlU3RhdGVTdWNjZXNzTWVzc2FnZTogc3RyaW5nO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF92YWx1ZVN0YXRlSW5mb3JtYXRpb25NZXNzYWdlOiBzdHJpbmc7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX3ZhbHVlU3RhdGVXYXJuaW5nTWVzc2FnZTogc3RyaW5nO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF92YWx1ZVN0YXRlRXJyb3JNZXNzYWdlOiBzdHJpbmc7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX3N0YXRlOiBGb3JtU3RhdGVzID0gJ2RlZmF1bHQnO1xuXG4gICAgLyoqXG4gICAgICogRnVuY3Rpb24gdXNlZCB0byBkaXNhYmxlIGNlcnRhaW4gZGF0ZXMgaW4gdGhlIGNhbGVuZGFyLlxuICAgICAqIEBwYXJhbSBkYXRlIGRhdGUgcmVwcmVzZW50YXRpb25cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIGRpc2FibGVGdW5jdGlvbjogKHZhbHVlOiBEKSA9PiBib29sZWFuID0gKCkgPT4gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBGdW5jdGlvbiB1c2VkIHRvIGRpc2FibGUgY2VydGFpbiBkYXRlcyBpbiB0aGUgY2FsZW5kYXIgZm9yIHRoZSByYW5nZSBzdGFydCBzZWxlY3Rpb24uXG4gICAgICogQHBhcmFtIGRhdGUgZGF0ZSByZXByZXNlbnRhdGlvblxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgZGlzYWJsZVJhbmdlU3RhcnRGdW5jdGlvbjogKHZhbHVlOiBEKSA9PiBib29sZWFuID0gKCkgPT4gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBGdW5jdGlvbiB1c2VkIHRvIGRpc2FibGUgY2VydGFpbiBkYXRlcyBpbiB0aGUgY2FsZW5kYXIgZm9yIHRoZSByYW5nZSBlbmQgc2VsZWN0aW9uLlxuICAgICAqIEBwYXJhbSBkYXRlIGRhdGUgcmVwcmVzZW50YXRpb25cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIGRpc2FibGVSYW5nZUVuZEZ1bmN0aW9uOiAodmFsdWU6IEQpID0+IGJvb2xlYW4gPSAoKSA9PiBmYWxzZTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgb25DaGFuZ2U6ICh2YWx1ZTogYW55KSA9PiB2b2lkID0gKCkgPT4ge307XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIG9uVG91Y2hlZDogYW55ID0gKCkgPT4ge307XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIGdldCBfcmFuZ2VEZWxpbWl0ZXIoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGVUaW1lRm9ybWF0cy5yYW5nZURlbGltaXRlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEYXRlIGlucHV0IGFyaWEgbGFiZWwgYmFzZWQgb24gdHlwZVxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBnZXQgX2RhdGVJbnB1dEFyaWFsTGFiZWwoKTogc3RyaW5nIHtcbiAgICAgICAgLy8gcmV0dXJuIGVpdGhlciBpbnB1dCB2YWx1ZSBvciBhIGtleSBmb3IgXCJmZFRyYW5zbGF0ZVwiIHBpcGVcbiAgICAgICAgcmV0dXJuIHRoaXMudHlwZSA9PT0gJ3JhbmdlJyA/IHRoaXMuZGF0ZVJhbmdlSW5wdXRMYWJlbCA6IHRoaXMuZGF0ZUlucHV0TGFiZWw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGF0ZSBpbnB1dCBhcmlhIGxhYmVsIGtleSBiYXNlZCBvbiB0eXBlXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIGdldCBfZGF0ZUlucHV0QXJpYWxMYWJlbEtleSgpOiBzdHJpbmcge1xuICAgICAgICAvLyByZXR1cm4gZWl0aGVyIGlucHV0IHZhbHVlIG9yIGEga2V5IGZvciBcImZkVHJhbnNsYXRlXCIgcGlwZVxuICAgICAgICByZXR1cm4gdGhpcy50eXBlID09PSAncmFuZ2UnID8gJ2NvcmVEYXRlUGlja2VyLmRhdGVSYW5nZUlucHV0TGFiZWwnIDogJ2NvcmVEYXRlUGlja2VyLmRhdGVJbnB1dExhYmVsJztcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIF9jaGFuZ2VEZXRlY3Rpb25SZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICAgICAgICAvLyBVc2UgQE9wdGlvbmFsIHRvIGF2b2lkIGFuZ3VsYXIgaW5qZWN0aW9uIGVycm9yIG1lc3NhZ2UgYW5kIHRocm93IG91ciBvd24gd2hpY2ggaXMgbW9yZSBwcmVjaXNlIG9uZVxuICAgICAgICBAT3B0aW9uYWwoKVxuICAgICAgICBwcml2YXRlIF9kYXRlVGltZUFkYXB0ZXI6IERhdGV0aW1lQWRhcHRlcjxEPixcbiAgICAgICAgQE9wdGlvbmFsKClcbiAgICAgICAgQEluamVjdChEQVRFX1RJTUVfRk9STUFUUylcbiAgICAgICAgcHJpdmF0ZSBfZGF0ZVRpbWVGb3JtYXRzOiBEYXRlVGltZUZvcm1hdHMsXG4gICAgICAgIHByaXZhdGUgX3BvcG92ZXJGb3JtTWVzc2FnZTogUG9wb3ZlckZvcm1NZXNzYWdlU2VydmljZVxuICAgICkge1xuICAgICAgICBpZiAoIXRoaXMuX2RhdGVUaW1lQWRhcHRlcikge1xuICAgICAgICAgICAgdGhyb3cgY3JlYXRlTWlzc2luZ0RhdGVJbXBsZW1lbnRhdGlvbkVycm9yKCdEYXRlVGltZUFkYXB0ZXInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuX2RhdGVUaW1lRm9ybWF0cykge1xuICAgICAgICAgICAgdGhyb3cgY3JlYXRlTWlzc2luZ0RhdGVJbXBsZW1lbnRhdGlvbkVycm9yKCdEQVRFX1RJTUVfRk9STUFUUycpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmxvY2FsZUNoYW5nZXMucGlwZSh0YWtlVW50aWwodGhpcy5fb25EZXN0cm95JCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmZvcm1hdElucHV0RGF0ZSh0aGlzLnNlbGVjdGVkRGF0ZSk7XG4gICAgICAgICAgICB0aGlzLl9jaGFuZ2VEZXRlY3Rpb25SZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fSW5pdGlhbGlzZVZhcmlhYmxlc0luTWVzc2FnZVNlcnZpY2UoKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9zdWJzY3JpcHRpb25zLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIHRoaXMuX29uRGVzdHJveSQubmV4dCgpO1xuICAgICAgICB0aGlzLl9vbkRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWV0aG9kIHRoYXQgaGFuZGxlIGNhbGVuZGFyIGFjdGl2ZSB2aWV3IGNoYW5nZSBhbmQgdGhyb3dzIGV2ZW50LlxuICAgICAqL1xuICAgIHB1YmxpYyBoYW5kbGVDYWxlbmRhckFjdGl2ZVZpZXdDaGFuZ2UoYWN0aXZlVmlldzogRmRDYWxlbmRhclZpZXcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5hY3RpdmVWaWV3Q2hhbmdlLmVtaXQoYWN0aXZlVmlldyk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwdWJsaWMgY2xvc2VGcm9tQ2FsZW5kYXIoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnR5cGUgPT09ICdzaW5nbGUnICYmIHRoaXMuY2xvc2VPbkRhdGVDaG9vc2UpIHtcbiAgICAgICAgICAgIHRoaXMub25Ub3VjaGVkKCk7XG4gICAgICAgICAgICB0aGlzLmNsb3NlQ2FsZW5kYXIoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBPcGVucyB0aGUgY2FsZW5kYXIgKi9cbiAgICBvcGVuQ2FsZW5kYXIoKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5kaXNhYmxlZCkge1xuICAgICAgICAgICAgdGhpcy5pc09wZW4gPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5pc09wZW5DaGFuZ2UuZW1pdCh0aGlzLmlzT3Blbik7XG4gICAgICAgICAgICB0aGlzLl9jaGFuZ2VNZXNzYWdlVmlzaWJpbGl0eSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIFRvZ2dsZXMgdGhlIGNhbGVuZGFyIG9wZW4gb3IgY2xvc2VkICovXG4gICAgcHVibGljIHRvZ2dsZUNhbGVuZGFyKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmlzT3BlbiA9ICF0aGlzLmlzT3BlbjtcbiAgICAgICAgdGhpcy5pc09wZW5DaGFuZ2UuZW1pdCh0aGlzLmlzT3Blbik7XG4gICAgICAgIGlmICghdGhpcy5pc09wZW4pIHtcbiAgICAgICAgICAgIHRoaXMub25Ub3VjaGVkKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fY2hhbmdlTWVzc2FnZVZpc2liaWxpdHkoKTtcbiAgICB9XG5cbiAgICAvKiogQ2xvc2VzIHRoZSBjYWxlbmRhciBpZiBpdCBpcyBvcGVuICovXG4gICAgcHVibGljIGNsb3NlQ2FsZW5kYXIoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmlzT3Blbikge1xuICAgICAgICAgICAgdGhpcy5pc09wZW4gPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuaXNPcGVuQ2hhbmdlLmVtaXQodGhpcy5pc09wZW4pO1xuICAgICAgICAgICAgdGhpcy5fY2hhbmdlTWVzc2FnZVZpc2liaWxpdHkoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBNZXRob2QgdGhhdCBpcyB0cmlnZ2VyZWQgYnkgZXZlbnRzIGZyb20gY2FsZW5kYXIgY29tcG9uZW50LCB3aGVuIHRoZXJlIGlzIHNlbGVjdGVkIHNpbmdsZSBkYXRlIGNoYW5nZWRcbiAgICAgKi9cbiAgICBwdWJsaWMgaGFuZGxlU2luZ2xlRGF0ZUNoYW5nZShkYXRlOiBEKTogdm9pZCB7XG4gICAgICAgIGlmIChkYXRlKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZSA9IGRhdGU7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUNoYW5nZS5lbWl0KGRhdGUpO1xuICAgICAgICAgICAgdGhpcy5vbkNoYW5nZShkYXRlKTtcbiAgICAgICAgICAgIHRoaXMuZm9ybWF0SW5wdXREYXRlKGRhdGUpO1xuICAgICAgICAgICAgdGhpcy5faXNJbnZhbGlkRGF0ZUlucHV0ID0gIXRoaXMuaXNNb2RlbFZhbGlkKCk7XG4gICAgICAgICAgICBpZiAodGhpcy5jbG9zZU9uRGF0ZUNob29zZSAmJiB0aGlzLnR5cGUgPT09ICdzaW5nbGUnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jbG9zZUNhbGVuZGFyKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogTWV0aG9kIHRoYXQgaXMgdHJpZ2dlcmVkIGRhdGUgZm9ybWF0dGluZyBpbiB0aGUgZGF0ZSBjb250cm9sXG4gICAgICovXG4gICAgcHVibGljIGZvcm1hdElucHV0RGF0ZShkYXRlOiBOdWxsYWJsZTxEPik6IHZvaWQge1xuICAgICAgICBpZiAoZGF0ZSkge1xuICAgICAgICAgICAgdGhpcy5faW5wdXRGaWVsZERhdGUgPSB0aGlzLl9mb3JtYXREYXRlKGRhdGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIE1ldGhvZCB0aGF0IGlzIHRyaWdnZXJlZCBieSBldmVudHMgZnJvbSBjYWxlbmRhciBjb21wb25lbnQsIHdoZW4gdGhlcmUgaXMgc2VsZWN0ZWQgcmFuZ2UgZGF0ZSBjaGFuZ2VkXG4gICAgICovXG4gICAgcHVibGljIGhhbmRsZVJhbmdlRGF0ZUNoYW5nZShkYXRlczogRGF0ZVJhbmdlPEQ+KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHN0YXJ0Q2hhbmdlZCA9ICF0aGlzLl9kYXRlVGltZUFkYXB0ZXIuZGF0ZXNFcXVhbChkYXRlcy5zdGFydCwgdGhpcy5zZWxlY3RlZFJhbmdlRGF0ZS5zdGFydCk7XG4gICAgICAgIGNvbnN0IGVuZENoYW5nZWQgPSAhdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmRhdGVzRXF1YWwoZGF0ZXMuZW5kLCB0aGlzLnNlbGVjdGVkUmFuZ2VEYXRlLmVuZCk7XG4gICAgICAgIGlmIChkYXRlcyAmJiAoc3RhcnRDaGFuZ2VkIHx8IGVuZENoYW5nZWQpKSB7XG4gICAgICAgICAgICBjb25zdCBzaG91bGRDbG9zZSA9IHRoaXMuY2xvc2VPbkRhdGVDaG9vc2UgJiYgZGF0ZXMuZW5kICE9PSBudWxsO1xuICAgICAgICAgICAgdGhpcy5faW5wdXRGaWVsZERhdGUgPSB0aGlzLl9mb3JtYXREYXRlUmFuZ2UoZGF0ZXMpO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFJhbmdlRGF0ZSA9IHtcbiAgICAgICAgICAgICAgICBzdGFydDogZGF0ZXMuc3RhcnQsXG4gICAgICAgICAgICAgICAgZW5kOiBkYXRlcy5lbmRcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUmFuZ2VEYXRlQ2hhbmdlLmVtaXQodGhpcy5zZWxlY3RlZFJhbmdlRGF0ZSk7XG4gICAgICAgICAgICB0aGlzLm9uQ2hhbmdlKHRoaXMuc2VsZWN0ZWRSYW5nZURhdGUpO1xuICAgICAgICAgICAgdGhpcy5faXNJbnZhbGlkRGF0ZUlucHV0ID0gIXRoaXMuaXNNb2RlbFZhbGlkKCk7XG4gICAgICAgICAgICBpZiAoc2hvdWxkQ2xvc2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNsb3NlQ2FsZW5kYXIoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBNZXRob2QgdGhhdCBpcyB0cmlnZ2VyZWQgd2hlbiBUb2RheS1TZWxlY3Rpb24tQnV0dG9uIGNsaWNrZWQsIGl0IGNoYW5nZXMgc2VsZWN0ZWQgZGF0ZSBvciBkYXRlIHJhbmdlIHRvIHRvZGF5J3MgZGF0ZVxuICAgICAqL1xuICAgIG9uVG9kYXlCdXR0b25DbGljaygpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgdG9kYXlEYXRlID0gdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLnRvZGF5KCk7XG4gICAgICAgIGlmICh0aGlzLnR5cGUgPT09ICdzaW5nbGUnKSB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZVNpbmdsZURhdGVDaGFuZ2UodG9kYXlEYXRlKTtcbiAgICAgICAgICAgIHRoaXMuY2xvc2VGcm9tQ2FsZW5kYXIoKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnR5cGUgPT09ICdyYW5nZScpIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlUmFuZ2VEYXRlQ2hhbmdlKHtcbiAgICAgICAgICAgICAgICBzdGFydDogdG9kYXlEYXRlLFxuICAgICAgICAgICAgICAgIGVuZDogdG9kYXlEYXRlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBNZXRob2QgdGhhdCBpcyB0cmlnZ2VyZWQgd2hlbiB0aGUgdGV4dCBpbnB1dCBpcyBjb25maXJtZWQgdG8gYmEgY2hhbmdlZCwgYnkgY2xpY2tpbmcgZW50ZXIsIG9yIGJsdXJcbiAgICAgKi9cbiAgICBwdWJsaWMgaGFuZGxlSW5wdXRDaGFuZ2Uoc3RyRGF0ZTogc3RyaW5nLCBpc1R5cGVFdmVudDogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICBpZiAoKGlzVHlwZUV2ZW50ICYmIHRoaXMucHJvY2Vzc0lucHV0T25CbHVyKSB8fCAoIWlzVHlwZUV2ZW50ICYmICF0aGlzLnByb2Nlc3NJbnB1dE9uQmx1cikpIHtcbiAgICAgICAgICAgIC8vIGlmIHByb2Nlc3NJbnB1dE9uQmx1ciA9PT0gdHJ1ZSwgaWdub3JlIHR5cGUgZXZlbnRcbiAgICAgICAgICAgIC8vIGlmIHByb2Nlc3NJbnB1dE9uQmx1ciA9PT0gZmFsc2UsIGlnbm9yZSBibHVyL2VudGVyIGV2ZW50XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kYXRlU3RyaW5nVXBkYXRlKHN0ckRhdGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBGdW5jdGlvbiB0aGF0IGltcGxlbWVudHMgVmFsaWRhdG9yIEludGVyZmFjZSwgYWRkcyB2YWxpZGF0aW9uIHN1cHBvcnQgZm9yIGZvcm1zXG4gICAgICovXG4gICAgdmFsaWRhdGUoKToge1xuICAgICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgfSB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5pc01vZGVsVmFsaWQoKVxuICAgICAgICAgICAgPyBudWxsXG4gICAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgICAgIGRhdGVWYWxpZGF0aW9uOiB7XG4gICAgICAgICAgICAgICAgICAgICAgdmFsaWQ6IGZhbHNlXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICByZWdpc3Rlck9uQ2hhbmdlKFxuICAgICAgICBmbjogKHNlbGVjdGVkOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHZvaWQ7XG4gICAgICAgIH1cbiAgICApOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vbkNoYW5nZSA9IGZuO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSk6IHZvaWQge1xuICAgICAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xuICAgICAgICB0aGlzLl9jaGFuZ2VEZXRlY3Rpb25SZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBGdW5jdGlvbiB0aGF0IHByb3ZpZGVzIHN1cHBvcnQgZm9yIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHRoYXQgYWxsb3dzIHRvIHVzZSBbKG5nTW9kZWwpXSBvciBmb3Jtc1xuICAgICAqL1xuICAgIHdyaXRlVmFsdWUoc2VsZWN0ZWQ6IERhdGVSYW5nZTxEPiB8IEQgfCBudWxsKTogdm9pZCB7XG4gICAgICAgIC8qKiBJZiB3cml0dGVuIHZhbHVlIGlzIG5vdCBkZWZpbmVkLCBudWxsLCBlbXB0eSBzdHJpbmcgKi9cbiAgICAgICAgaWYgKCFzZWxlY3RlZCkge1xuICAgICAgICAgICAgdGhpcy5faW5wdXRGaWVsZERhdGUgPSAnJztcbiAgICAgICAgICAgIHRoaXMuX3JlZnJlc2hDdXJyZW50bHlEaXNwbGF5ZWRDYWxlbmRhckRhdGUodGhpcy5fZGF0ZVRpbWVBZGFwdGVyLnRvZGF5KCkpO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFJhbmdlRGF0ZSA9IHtcbiAgICAgICAgICAgICAgICBzdGFydDogbnVsbCxcbiAgICAgICAgICAgICAgICBlbmQ6IG51bGxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZSA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLl9jaGFuZ2VEZXRlY3Rpb25SZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnR5cGUgPT09ICdzaW5nbGUnKSB7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIEZvciBzaW5nbGUgbW9kZSwgaWYgdGhlIGRhdGUgaXMgaW52YWxpZCwgbW9kZWwgaXMgY2hhbmdlZCwgaXQgcmVmcmVzaGVzIGN1cnJlbnRseVxuICAgICAgICAgICAgICogaW5wdXQgZmllbGQgdGV4dCwgYnV0IGl0IGRvZXMgbm90IHJlZnJlc2ggY3VycmVudGx5IGRpc3BsYXllZCBkYXlcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgc2VsZWN0ZWQgPSB0aGlzLl9wYXJzZURhdGUoc2VsZWN0ZWQpO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGUgPSBzZWxlY3RlZDtcbiAgICAgICAgICAgIHRoaXMuX2lucHV0RmllbGREYXRlID0gdGhpcy5fZm9ybWF0RGF0ZShzZWxlY3RlZCk7XG4gICAgICAgICAgICB0aGlzLl9yZWZyZXNoQ3VycmVudGx5RGlzcGxheWVkQ2FsZW5kYXJEYXRlKHNlbGVjdGVkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy50eXBlID09PSAncmFuZ2UnKSB7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIEZvciByYW5nZSBtb2RlLCBpZiB0aGUgZGF0ZSBpcyBpbnZhbGlkLCBtb2RlbCBpcyBjaGFuZ2VkLCBidXQgaXQgZG9lcyBub3QgcmVmcmVzaCBjdXJyZW50bHlcbiAgICAgICAgICAgICAqIGRpc3BsYXllZCBkYXkgdmlldywgb3IgaW5wdXQgZmllbGQgdGV4dFxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBzZWxlY3RlZCA9IHNlbGVjdGVkIGFzIERhdGVSYW5nZTxEPjtcbiAgICAgICAgICAgIGlmIChzZWxlY3RlZD8uc3RhcnQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkUmFuZ2VEYXRlID0ge1xuICAgICAgICAgICAgICAgICAgICBzdGFydDogdGhpcy5fcGFyc2VEYXRlKHNlbGVjdGVkLnN0YXJ0KSxcbiAgICAgICAgICAgICAgICAgICAgZW5kOiB0aGlzLl9wYXJzZURhdGUoc2VsZWN0ZWQuZW5kKVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgdGhpcy5fcmVmcmVzaEN1cnJlbnRseURpc3BsYXllZENhbGVuZGFyRGF0ZShzZWxlY3RlZC5zdGFydCk7XG4gICAgICAgICAgICAgICAgdGhpcy5faW5wdXRGaWVsZERhdGUgPSB0aGlzLl9mb3JtYXREYXRlUmFuZ2Uoc2VsZWN0ZWQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9pbnB1dEZpZWxkRGF0ZSA9ICcnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2lzSW52YWxpZERhdGVJbnB1dCA9ICF0aGlzLmlzTW9kZWxWYWxpZCgpO1xuICAgICAgICB0aGlzLl9jaGFuZ2VEZXRlY3Rpb25SZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBNZXRob2QsIHdoaWNoIGlzIHJlc3BvbnNpYmxlIGZvciB0cmFuc2Zvcm1pbmcgc3RyaW5nIHRvIGRhdGUsIGRlcGVuZGluZyBvbiB0eXBlIG9yXG4gICAgICogdmFsaWRhdGlvbiB0aGUgcmVzdWx0cyBhcmUgZGlmZmVyZW50LiBJdCBhbHNvIGNoYW5nZXMgdG8gc3RhdGUgb2YgX2lzSW52YWxpZERhdGVJbnB1dFxuICAgICAqL1xuICAgIGRhdGVTdHJpbmdVcGRhdGUoZGF0ZVN0cjogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2lucHV0RmllbGREYXRlID0gZGF0ZVN0cjtcbiAgICAgICAgLyoqIENhc2Ugd2hlbiB0aGVyZSBpcyBzaW5nbGUgbW9kZSAqL1xuICAgICAgICBpZiAodGhpcy50eXBlID09PSAnc2luZ2xlJykge1xuICAgICAgICAgICAgaWYgKCFkYXRlU3RyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5faXNJbnZhbGlkRGF0ZUlucHV0ID0gIXRoaXMuYWxsb3dOdWxsO1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlID0gbnVsbDtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZWZyZXNoQ3VycmVudGx5RGlzcGxheWVkQ2FsZW5kYXJEYXRlKHRoaXMuc2VsZWN0ZWREYXRlKTtcbiAgICAgICAgICAgICAgICB0aGlzLm9uQ2hhbmdlKHRoaXMuc2VsZWN0ZWREYXRlKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUNoYW5nZS5lbWl0KHRoaXMuc2VsZWN0ZWREYXRlKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBkYXRlID0gdGhpcy5fcGFyc2VEYXRlKGRhdGVTdHIpO1xuXG4gICAgICAgICAgICAvKiogQ2hlY2sgaWYgZGF0ZXMgYXJlIGVxdWFsLCBpZiBzbywgdGhlcmUgaXMgbm8gbmVlZCB0byBtYWtlIGFueSBjaGFuZ2VzICovXG4gICAgICAgICAgICBpZiAoIXRoaXMuX2RhdGVUaW1lQWRhcHRlci5kYXRlc0VxdWFsKGRhdGUsIHRoaXMuc2VsZWN0ZWREYXRlKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2lzSW52YWxpZERhdGVJbnB1dCA9ICF0aGlzLl9pc1NpbmdsZU1vZGVsVmFsaWQoZGF0ZSk7XG5cbiAgICAgICAgICAgICAgICAvKiogQ2hlY2sgaWYgZGF0ZSBpcyB2YWxpZCwgaWYgaXQncyBub3QsIHRoZXJlIGlzIG5vIG5lZWQgdG8gcmVmcmVzaCBjYWxlbmRhciAqL1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5faXNJbnZhbGlkRGF0ZUlucHV0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlZnJlc2hDdXJyZW50bHlEaXNwbGF5ZWRDYWxlbmRhckRhdGUoZGF0ZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICogRGF0ZSBpbiBtb2RlbCBpcyBjaGFuZ2VkIG5vIG1hdHRlciBpZiB0aGUgcGFyc2VkIGRhdGUgZnJvbSBzdHJpbmcgaXMgdmFsaWQgb3Igbm90LlxuICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlID0gZGF0ZTtcbiAgICAgICAgICAgICAgICB0aGlzLm9uQ2hhbmdlKHRoaXMuc2VsZWN0ZWREYXRlKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUNoYW5nZS5lbWl0KHRoaXMuc2VsZWN0ZWREYXRlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLyoqIENhc2Ugd2hlbiB0aGVyZSBpcyByYW5nZSBtb2RlICovXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoIWRhdGVTdHIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9pc0ludmFsaWREYXRlSW5wdXQgPSAhdGhpcy5hbGxvd051bGw7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFJhbmdlRGF0ZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgc3RhcnQ6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGVuZDogbnVsbFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgdGhpcy5fcmVmcmVzaEN1cnJlbnRseURpc3BsYXllZENhbGVuZGFyRGF0ZSh0aGlzLnNlbGVjdGVkUmFuZ2VEYXRlLnN0YXJ0KTtcbiAgICAgICAgICAgICAgICB0aGlzLm9uQ2hhbmdlKHRoaXMuc2VsZWN0ZWRSYW5nZURhdGUpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSYW5nZURhdGVDaGFuZ2UuZW1pdCh0aGlzLnNlbGVjdGVkUmFuZ2VEYXRlKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBbc3RhcnREYXRlU3RyLCBlbmREYXRlU3RyXSA9IGRhdGVTdHIuc3BsaXQodGhpcy5fcmFuZ2VEZWxpbWl0ZXIpO1xuICAgICAgICAgICAgY29uc3Qgc3RhcnREYXRlID0gdGhpcy5fcGFyc2VEYXRlKHN0YXJ0RGF0ZVN0cik7XG4gICAgICAgICAgICBjb25zdCBlbmREYXRlID0gdGhpcy5fcGFyc2VEYXRlKGVuZERhdGVTdHIpO1xuXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIENoZWNrIGlmIGRhdGVzIGFyZSBlcXVhbCwgaWYgZGF0ZXMgYXJlIHRoZSBzYW1lIHRoZXJlIGlzIG5vIG5lZWQgdG8gbWFrZSBhbnkgY2hhbmdlc1xuICAgICAgICAgICAgICogRGF0ZSBpbiBtb2RlbCBpcyBjaGFuZ2VkIG5vIG1hdHRlciBpZiB0aGUgcGFyc2VkIGRhdGVzIGZyb20gc3RyaW5nIGFyZSB2YWxpZCBvciBub3QuXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAhdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmRhdGVzRXF1YWwoc3RhcnREYXRlLCB0aGlzLnNlbGVjdGVkUmFuZ2VEYXRlLnN0YXJ0KSB8fFxuICAgICAgICAgICAgICAgICF0aGlzLl9kYXRlVGltZUFkYXB0ZXIuZGF0ZXNFcXVhbChlbmREYXRlLCB0aGlzLnNlbGVjdGVkUmFuZ2VEYXRlLmVuZClcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGxldCBzZWxlY3RlZFJhbmdlRGF0ZTogRGF0ZVJhbmdlPEQ+IHwgbnVsbCA9IG51bGw7XG5cbiAgICAgICAgICAgICAgICAvKiogSWYgdGhlIGVuZCBkYXRlIGlzIGJlZm9yZSB0aGUgc3RhcnQgZGF0ZSwgdGhlcmUgaXMgbmVlZCB0byByZXBsYWNlIHRoZW0gICovXG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9kYXRlVGltZUFkYXB0ZXIuaXNWYWxpZChzdGFydERhdGUpICYmXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2RhdGVUaW1lQWRhcHRlci5pc1ZhbGlkKGVuZERhdGUpICYmXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2RhdGVUaW1lQWRhcHRlci5jb21wYXJlRGF0ZShzdGFydERhdGUsIGVuZERhdGUpID4gMFxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFJhbmdlRGF0ZSA9IHsgc3RhcnQ6IGVuZERhdGUsIGVuZDogc3RhcnREYXRlIH07XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRSYW5nZURhdGUgPSB7IHN0YXJ0OiBzdGFydERhdGUsIGVuZDogZW5kRGF0ZSB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLl9pc0ludmFsaWREYXRlSW5wdXQgPSAhdGhpcy5faXNSYW5nZU1vZGVsVmFsaWQoc2VsZWN0ZWRSYW5nZURhdGUpO1xuXG4gICAgICAgICAgICAgICAgLyoqIFdob2xlIG9iamVjdCBpcyBjaGFuZ2VkLCBldmVuIGl0J3MgaW52YWxpZCAqL1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSYW5nZURhdGUgPSBzZWxlY3RlZFJhbmdlRGF0ZTtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkUmFuZ2VEYXRlQ2hhbmdlLmVtaXQodGhpcy5zZWxlY3RlZFJhbmdlRGF0ZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5vbkNoYW5nZSh0aGlzLnNlbGVjdGVkUmFuZ2VEYXRlKTtcblxuICAgICAgICAgICAgICAgIC8qKiBDaGVjayBpZiBzdGFydCBkYXRlIGlzIHZhbGlkLCBpZiBpdCdzIG5vdCwgdGhlcmUgaXMgbm8gbmVlZCBvIHJlZnJlc2ggY2FsZW5kYXIgKi9cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5faXNTdGFydERhdGVWYWxpZCh0aGlzLnNlbGVjdGVkUmFuZ2VEYXRlLnN0YXJ0KSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZWZyZXNoQ3VycmVudGx5RGlzcGxheWVkQ2FsZW5kYXJEYXRlKHRoaXMuc2VsZWN0ZWRSYW5nZURhdGUuc3RhcnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBNZXRob2QgdGhhdCBwcm92aWRlcyBpbmZvcm1hdGlvbiBpZiBtb2RlbCBzZWxlY3RlZCBkYXRlL2RhdGVzIGhhdmUgcHJvcGVybHkgdHlwZXMgYW5kIGFyZSB2YWxpZCAqL1xuICAgIGlzTW9kZWxWYWxpZCgpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMudHlwZSA9PT0gJ3NpbmdsZScpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9pc1NpbmdsZU1vZGVsVmFsaWQodGhpcy5zZWxlY3RlZERhdGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2lzUmFuZ2VNb2RlbFZhbGlkKHRoaXMuc2VsZWN0ZWRSYW5nZURhdGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBfY2hhbmdlTWVzc2FnZVZpc2liaWxpdHkoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmlzT3Blbikge1xuICAgICAgICAgICAgdGhpcy5fcG9wb3ZlckZvcm1NZXNzYWdlLmhpZGUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3BvcG92ZXJGb3JtTWVzc2FnZS5zaG93KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIF9vbk9wZW5TdGF0ZUNoYW5nZWQoaXNPcGVuOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaXNPcGVuQ2hhbmdlLmVtaXQoaXNPcGVuKTtcbiAgICAgICAgdGhpcy5fY2hhbmdlTWVzc2FnZVZpc2liaWxpdHkoKTtcbiAgICAgICAgLy8gZm9jdXMgaW5wdXQgY29udHJvbCBldmVyeSB0aW1lIHBvcHVwIGlzIGNsb3NlZFxuICAgICAgICBpZiAoIWlzT3BlbiAmJiB0aGlzLl9pbnB1dEVsZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMuX2lucHV0RWxlbWVudC5uYXRpdmVFbGVtZW50LmZvY3VzKHtcbiAgICAgICAgICAgICAgICBwcmV2ZW50U2Nyb2xsOiB0aGlzLnByZXZlbnRTY3JvbGxPbkZvY3VzXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBmb2N1cyBjYWxlbmRhciBjZWxsIG9uIG9wZW5pbmdcbiAgICAgICAgaWYgKGlzT3BlbiAmJiB0aGlzLl9jYWxlbmRhckNvbXBvbmVudCkge1xuICAgICAgICAgICAgdGhpcy5fY2FsZW5kYXJDb21wb25lbnQuaW5pdGlhbEZvY3VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIF9vbkJsdXIoZXZlbnQ6IEZvY3VzRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vblRvdWNoZWQoKTtcbiAgICAgICAgdGhpcy5oYW5kbGVJbnB1dENoYW5nZSgoZXZlbnQudGFyZ2V0IGFzIGFueSkudmFsdWUsIGZhbHNlKTtcbiAgICB9XG5cbiAgICAvKiogTWV0aG9kIHRoYXQgcmV0dXJucyBpbmZvIGlmIHNpbmdsZSBtb2RlbCBnaXZlbiBpcyB2YWxpZCAqL1xuICAgIHByaXZhdGUgX2lzU2luZ2xlTW9kZWxWYWxpZChkYXRlOiBOdWxsYWJsZTxEPik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gKHRoaXMuX2lzRGF0ZVZhbGlkKGRhdGUpICYmICF0aGlzLmRpc2FibGVGdW5jdGlvbihkYXRlKSkgfHwgKCFkYXRlICYmIHRoaXMuYWxsb3dOdWxsKTtcbiAgICB9XG5cbiAgICAvKiogTWV0aG9kIHRoYXQgcmV0dXJucyBpbmZvIGlmIHJhbmdlIGRhdGUgbW9kZWwgZ2l2ZW4gaXMgdmFsaWQgKi9cbiAgICBwcml2YXRlIF9pc1JhbmdlTW9kZWxWYWxpZChmZFJhbmdlRGF0ZTogRGF0ZVJhbmdlPEQ+KTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAoZmRSYW5nZURhdGUgJiYgdGhpcy5faXNTdGFydERhdGVWYWxpZChmZFJhbmdlRGF0ZS5zdGFydCkgJiYgdGhpcy5faXNFbmREYXRlVmFsaWQoZmRSYW5nZURhdGUuZW5kKSkgfHxcbiAgICAgICAgICAgICghZmRSYW5nZURhdGUuc3RhcnQgJiYgIWZkUmFuZ2VEYXRlLmVuZCAmJiB0aGlzLmFsbG93TnVsbClcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKiogTWV0aG9kIHRoYXQgcmV0dXJucyBpbmZvIGlmIGVuZCBkYXRlIG1vZGVsIGdpdmVuIGlzIHZhbGlkICovXG4gICAgcHJpdmF0ZSBfaXNFbmREYXRlVmFsaWQoZW5kRGF0ZTogTnVsbGFibGU8RD4pOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzRGF0ZVZhbGlkKGVuZERhdGUpICYmICF0aGlzLmRpc2FibGVSYW5nZUVuZEZ1bmN0aW9uKGVuZERhdGUpO1xuICAgIH1cblxuICAgIC8qKiBNZXRob2QgdGhhdCByZXR1cm5zIGluZm8gaWYgc3RhcnQgZGF0ZSBtb2RlbCBnaXZlbiBpcyB2YWxpZCAqL1xuICAgIHByaXZhdGUgX2lzU3RhcnREYXRlVmFsaWQoc3RhcnREYXRlOiBOdWxsYWJsZTxEPik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5faXNEYXRlVmFsaWQoc3RhcnREYXRlKSAmJiAhdGhpcy5kaXNhYmxlUmFuZ2VTdGFydEZ1bmN0aW9uKHN0YXJ0RGF0ZSk7XG4gICAgfVxuXG4gICAgLyoqIE1ldGhvZCB0aGF0IHJldHVybnMgaW5mbyBpZiBnaXZlbiBkYXRlIG1vZGVsIGlzIHZhbGlkICovXG4gICAgcHJpdmF0ZSBfaXNEYXRlVmFsaWQoZGF0ZTogTnVsbGFibGU8RD4pOiBkYXRlIGlzIEQge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmlzVmFsaWQoZGF0ZSk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9yZWZyZXNoQ3VycmVudGx5RGlzcGxheWVkQ2FsZW5kYXJEYXRlKGRhdGU6IE51bGxhYmxlPEQ+KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLl9jYWxlbmRhckNvbXBvbmVudCkge1xuICAgICAgICAgICAgdGhpcy5fY2FsZW5kYXJDb21wb25lbnQuc2V0Q3VycmVudGx5RGlzcGxheWVkKGRhdGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9mb3JtYXREYXRlKGRhdGU6IE51bGxhYmxlPEQ+KTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGVUaW1lQWRhcHRlci5mb3JtYXQoZGF0ZSwgdGhpcy5fZGF0ZVRpbWVGb3JtYXRzLmRpc3BsYXkuZGF0ZUlucHV0KTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX3BhcnNlRGF0ZShkYXRlOiB1bmtub3duKTogRCB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLnBhcnNlKGRhdGUsIHRoaXMuX2RhdGVUaW1lRm9ybWF0cy5wYXJzZS5kYXRlSW5wdXQpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfZm9ybWF0RGF0ZVJhbmdlKGRhdGVSYW5nZTogRGF0ZVJhbmdlPEQ+KTogc3RyaW5nIHtcbiAgICAgICAgY29uc3Qgc3RhcnREYXRlID0gdGhpcy5fZm9ybWF0RGF0ZShkYXRlUmFuZ2Uuc3RhcnQpO1xuICAgICAgICBjb25zdCBlbmREYXRlID0gdGhpcy5fZm9ybWF0RGF0ZShkYXRlUmFuZ2UuZW5kKTtcbiAgICAgICAgcmV0dXJuIHN0YXJ0RGF0ZSArIHRoaXMuX3JhbmdlRGVsaW1pdGVyICsgZW5kRGF0ZTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX0luaXRpYWxpc2VWYXJpYWJsZXNJbk1lc3NhZ2VTZXJ2aWNlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9wb3BvdmVyRm9ybU1lc3NhZ2UuaW5pdCh0aGlzLl9pbnB1dEdyb3VwRWxlbWVudCk7XG4gICAgICAgIHRoaXMuX3BvcG92ZXJGb3JtTWVzc2FnZS5tZXNzYWdlID0gdGhpcy5fbWVzc2FnZSB8fCAnJztcbiAgICAgICAgdGhpcy5fcG9wb3ZlckZvcm1NZXNzYWdlLnRyaWdnZXJzID0gdGhpcy5fbWVzc2FnZVRyaWdnZXJzO1xuICAgICAgICB0aGlzLl9wb3BvdmVyRm9ybU1lc3NhZ2UubWVzc2FnZVR5cGUgPSB0aGlzLl9zdGF0ZTtcbiAgICB9XG59XG4iLCI8ZmQtcG9wb3ZlclxuICAgIFsoaXNPcGVuKV09XCJpc09wZW5cIlxuICAgIChpc09wZW5DaGFuZ2UpPVwiX29uT3BlblN0YXRlQ2hhbmdlZCgkZXZlbnQpXCJcbiAgICBbdHJpZ2dlcnNdPVwiW11cIlxuICAgIFtwbGFjZW1lbnRdPVwicGxhY2VtZW50XCJcbiAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgIFtmb2N1c1RyYXBwZWRdPVwidHJ1ZVwiXG4gICAgW2ZvY3VzQXV0b0NhcHR1cmVdPVwiZmFsc2VcIlxuICAgIFthcHBlbmRUb109XCJhcHBlbmRUb1wiXG4+XG4gICAgPGZkLXBvcG92ZXItY29udHJvbD5cbiAgICAgICAgPGZkLWlucHV0LWdyb3VwXG4gICAgICAgICAgICAjaW5wdXRHcm91cENvbXBvbmVudFxuICAgICAgICAgICAgW3N0YXRlXT1cInN0YXRlXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgICAgICBbaXNDb250cm9sXT1cInRydWVcIlxuICAgICAgICAgICAgW2J1dHRvbl09XCJ0cnVlXCJcbiAgICAgICAgICAgIFtidXR0b25Gb2N1c2FibGVdPVwiYnV0dG9uRm9jdXNhYmxlXCJcbiAgICAgICAgICAgIGdseXBoPVwiYXBwb2ludG1lbnQtMlwiXG4gICAgICAgICAgICBbaXNFeHBhbmRlZF09XCJpc09wZW5cIlxuICAgICAgICAgICAgW2dseXBoQXJpYUxhYmVsXT1cImRpc3BsYXlDYWxlbmRhclRvZ2dsZUxhYmVsIHx8ICgnY29yZURhdGVQaWNrZXIuZGlzcGxheUNhbGVuZGFyVG9nZ2xlTGFiZWwnIHwgZmRUcmFuc2xhdGUpXCJcbiAgICAgICAgICAgIFtpY29uVGl0bGVdPVwiZGlzcGxheUNhbGVuZGFyVG9nZ2xlTGFiZWwgfHwgKCdjb3JlRGF0ZVBpY2tlci5kaXNwbGF5Q2FsZW5kYXJUb2dnbGVMYWJlbCcgfCBmZFRyYW5zbGF0ZSlcIlxuICAgICAgICAgICAgKGFkZE9uQnV0dG9uQ2xpY2tlZCk9XCJ0b2dnbGVDYWxlbmRhcigpXCJcbiAgICAgICAgPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZmQtaW5wdXRcIlxuICAgICAgICAgICAgICAgIGZkLWlucHV0LWdyb3VwLWlucHV0XG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIlxuICAgICAgICAgICAgICAgIFthdHRyLmlkXT1cImlucHV0SWRcIlxuICAgICAgICAgICAgICAgIGFyaWEtaGFzcG9wdXA9XCJncmlkXCJcbiAgICAgICAgICAgICAgICBhcmlhLWF1dG9jb21wbGV0ZT1cIm5vbmVcIlxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtZXhwYW5kZWRdPVwiaXNPcGVuXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPVwiYXJpYUxhYmVsbGVkQnlcIlxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiX2RhdGVJbnB1dEFyaWFsTGFiZWwgfHwgKF9kYXRlSW5wdXRBcmlhbExhYmVsS2V5IHwgZmRUcmFuc2xhdGUpXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLXJlcXVpcmVkXT1cInJlcXVpcmVkXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWRlc2NyaWJlZGJ5XT1cIl9mb3JtVmFsdWVTdGF0ZU1lc3NhZ2VJZFwiXG4gICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiX2lucHV0RmllbGREYXRlXCJcbiAgICAgICAgICAgICAgICAoa2V5dXAuZW50ZXIpPVwiaGFuZGxlSW5wdXRDaGFuZ2UoJGFueSgkZXZlbnQudGFyZ2V0KS52YWx1ZSwgZmFsc2UpXCJcbiAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJoYW5kbGVJbnB1dENoYW5nZSgkZXZlbnQsIHRydWUpXCJcbiAgICAgICAgICAgICAgICAoYmx1cik9XCJfb25CbHVyKCRldmVudClcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgPC9mZC1pbnB1dC1ncm91cD5cbiAgICA8L2ZkLXBvcG92ZXItY29udHJvbD5cbiAgICA8ZmQtcG9wb3Zlci1ib2R5IFthdHRyLmFyaWEtZXhwYW5kZWRdPVwiaXNPcGVuXCIgW2F0dHIuYXJpYS1oaWRkZW5dPVwiIWlzT3BlblwiPlxuICAgICAgICA8ZmQtZm9ybS1tZXNzYWdlIFtlbWJlZGRlZF09XCJ0cnVlXCIgKm5nSWY9XCJfbWVzc2FnZVwiIFt0eXBlXT1cInN0YXRlXCI+XG4gICAgICAgICAgICB7eyBfbWVzc2FnZSB9fVxuICAgICAgICA8L2ZkLWZvcm0tbWVzc2FnZT5cbiAgICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuXG4gICAgICAgIDxmZC1jYWxlbmRhclxuICAgICAgICAgICAgKGNsb3NlQ2FsZW5kYXIpPVwiY2xvc2VGcm9tQ2FsZW5kYXIoKVwiXG4gICAgICAgICAgICBbYWN0aXZlVmlld109XCJhY3RpdmVWaWV3XCJcbiAgICAgICAgICAgIFttYXJrV2Vla2VuZHNdPVwibWFya1dlZWtlbmRzXCJcbiAgICAgICAgICAgIFtzcGVjaWFsRGF5c1J1bGVzXT1cInNwZWNpYWxEYXlzUnVsZXNcIlxuICAgICAgICAgICAgW3Nob3dXZWVrTnVtYmVyc109XCJzaG93V2Vla051bWJlcnNcIlxuICAgICAgICAgICAgW2FnZ3JlZ2F0ZWRZZWFyR3JpZF09XCJhZ2dyZWdhdGVkWWVhckdyaWRcIlxuICAgICAgICAgICAgW3llYXJHcmlkXT1cInllYXJHcmlkXCJcbiAgICAgICAgICAgIChhY3RpdmVWaWV3Q2hhbmdlKT1cImhhbmRsZUNhbGVuZGFyQWN0aXZlVmlld0NoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIFtjYWxUeXBlXT1cInR5cGVcIlxuICAgICAgICAgICAgW3JhbmdlSG92ZXJFZmZlY3RdPVwicmFuZ2VIb3ZlckVmZmVjdFwiXG4gICAgICAgICAgICBbZGlzYWJsZUZ1bmN0aW9uXT1cImRpc2FibGVGdW5jdGlvblwiXG4gICAgICAgICAgICBbZGlzYWJsZVJhbmdlU3RhcnRGdW5jdGlvbl09XCJkaXNhYmxlUmFuZ2VTdGFydEZ1bmN0aW9uXCJcbiAgICAgICAgICAgIFtkaXNhYmxlUmFuZ2VFbmRGdW5jdGlvbl09XCJkaXNhYmxlUmFuZ2VFbmRGdW5jdGlvblwiXG4gICAgICAgICAgICBbc2VsZWN0ZWREYXRlXT1cInNlbGVjdGVkRGF0ZVwiXG4gICAgICAgICAgICBbc2VsZWN0ZWRSYW5nZURhdGVdPVwic2VsZWN0ZWRSYW5nZURhdGVcIlxuICAgICAgICAgICAgKHNlbGVjdGVkUmFuZ2VEYXRlQ2hhbmdlKT1cImhhbmRsZVJhbmdlRGF0ZUNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIChzZWxlY3RlZERhdGVDaGFuZ2UpPVwiaGFuZGxlU2luZ2xlRGF0ZUNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIFtzdGFydGluZ0RheU9mV2Vla109XCJzdGFydGluZ0RheU9mV2Vla1wiXG4gICAgICAgICAgICBbcHJldmlvdXNCdXR0b25EaXNhYmxlRnVuY3Rpb25dPVwicHJldmlvdXNCdXR0b25EaXNhYmxlRnVuY3Rpb25cIlxuICAgICAgICAgICAgW25leHRCdXR0b25EaXNhYmxlRnVuY3Rpb25dPVwibmV4dEJ1dHRvbkRpc2FibGVGdW5jdGlvblwiXG4gICAgICAgID48L2ZkLWNhbGVuZGFyPlxuXG4gICAgICAgIDxkaXYgKm5nSWY9XCJzaG93VG9kYXlCdXR0b25cIiBmZC1iYXIgYmFyRGVzaWduPVwiZm9vdGVyXCI+XG4gICAgICAgICAgICA8ZGl2IGZkLWJhci1yaWdodD5cbiAgICAgICAgICAgICAgICA8ZmQtYmFyLWVsZW1lbnQ+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gZmQtYnV0dG9uIFtsYWJlbF09XCJ0b2RheUJ1dHRvbkxhYmVsXCIgKGNsaWNrKT1cIm9uVG9kYXlCdXR0b25DbGljaygpXCI+PC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9mZC1iYXItZWxlbWVudD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2ZkLXBvcG92ZXItYm9keT5cbjwvZmQtcG9wb3Zlcj5cblxuPGRpdiBzdHlsZT1cImRpc3BsYXk6IG5vbmVcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICA8ZGl2IFthdHRyLmlkXT1cIl9mb3JtVmFsdWVTdGF0ZU1lc3NhZ2VJZFwiIGFyaWEtYXRvbWljPVwidHJ1ZVwiIGFyaWEtbGl2ZT1cImFzc2VydGl2ZVwiPlxuICAgICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJzdGF0ZVwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3N1Y2Nlc3MnXCI+e3tcbiAgICAgICAgICAgICAgICB2YWx1ZVN0YXRlU3VjY2Vzc01lc3NhZ2UgfHwgKCdjb3JlRGF0ZVBpY2tlci52YWx1ZVN0YXRlU3VjY2Vzc01lc3NhZ2UnIHwgZmRUcmFuc2xhdGUpXG4gICAgICAgICAgICB9fTwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2luZm9ybWF0aW9uJ1wiPnt7XG4gICAgICAgICAgICAgICAgdmFsdWVTdGF0ZUluZm9ybWF0aW9uTWVzc2FnZSB8fCAoJ2NvcmVEYXRlUGlja2VyLnZhbHVlU3RhdGVJbmZvcm1hdGlvbk1lc3NhZ2UnIHwgZmRUcmFuc2xhdGUpXG4gICAgICAgICAgICB9fTwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3dhcm5pbmcnXCI+e3tcbiAgICAgICAgICAgICAgICB2YWx1ZVN0YXRlV2FybmluZ01lc3NhZ2UgfHwgKCdjb3JlRGF0ZVBpY2tlci52YWx1ZVN0YXRlV2FybmluZ01lc3NhZ2UnIHwgZmRUcmFuc2xhdGUpXG4gICAgICAgICAgICB9fTwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2Vycm9yJ1wiPnt7XG4gICAgICAgICAgICAgICAgdmFsdWVTdGF0ZUVycm9yTWVzc2FnZSB8fCAoJ2NvcmVEYXRlUGlja2VyLnZhbHVlU3RhdGVFcnJvck1lc3NhZ2UnIHwgZmRUcmFuc2xhdGUpXG4gICAgICAgICAgICB9fTwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAge3sgX21lc3NhZ2UgfX1cbiAgICA8L2Rpdj5cbjwvZGl2PlxuIl19