@sapui5/sap.fe.macros 1.138.0 → 1.139.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (184) hide show
  1. package/package.json +1 -1
  2. package/src/sap/fe/macros/.library +1 -1
  3. package/src/sap/fe/macros/Breadcrumbs.js +269 -0
  4. package/src/sap/fe/macros/Breadcrumbs.tsx +243 -0
  5. package/src/sap/fe/macros/CommonHelper.js +2 -2
  6. package/src/sap/fe/macros/CommonHelper.ts +1 -1
  7. package/src/sap/fe/macros/Field.js +21 -4
  8. package/src/sap/fe/macros/Field.ts +21 -3
  9. package/src/sap/fe/macros/FooterContent.js +40 -10
  10. package/src/sap/fe/macros/FooterContent.tsx +44 -8
  11. package/src/sap/fe/macros/FormElement.js +2 -2
  12. package/src/sap/fe/macros/FormElement.ts +1 -2
  13. package/src/sap/fe/macros/MultiValueField.js +17 -4
  14. package/src/sap/fe/macros/MultiValueField.tsx +7 -2
  15. package/src/sap/fe/macros/RichTextEditor.js +30 -5
  16. package/src/sap/fe/macros/RichTextEditor.tsx +34 -6
  17. package/src/sap/fe/macros/Share.js +73 -40
  18. package/src/sap/fe/macros/Share.tsx +29 -1
  19. package/src/sap/fe/macros/ValueHelp.js +3 -4
  20. package/src/sap/fe/macros/ValueHelp.tsx +2 -3
  21. package/src/sap/fe/macros/ai/EasyFillButton.js +10 -4
  22. package/src/sap/fe/macros/ai/EasyFillButton.tsx +8 -1
  23. package/src/sap/fe/macros/ai/EasyFillDialog.js +25 -10
  24. package/src/sap/fe/macros/ai/EasyFillDialog.tsx +32 -23
  25. package/src/sap/fe/macros/ai/EasyFilterBar.js +30 -30
  26. package/src/sap/fe/macros/ai/EasyFilterBar.tsx +40 -43
  27. package/src/sap/fe/macros/ai/EasyFilterDataFetcher.js +11 -5
  28. package/src/sap/fe/macros/ai/EasyFilterDataFetcher.ts +14 -5
  29. package/src/sap/fe/macros/chart/ChartDelegate.js +4 -4
  30. package/src/sap/fe/macros/chart/ChartDelegate.ts +3 -3
  31. package/src/sap/fe/macros/chart/MdcChartTemplate.js +19 -3
  32. package/src/sap/fe/macros/chart/MdcChartTemplate.tsx +15 -4
  33. package/src/sap/fe/macros/controls/FieldWrapper.js +9 -3
  34. package/src/sap/fe/macros/controls/FieldWrapper.ts +11 -2
  35. package/src/sap/fe/macros/controls/FilterBar.js +49 -2
  36. package/src/sap/fe/macros/controls/FilterBar.ts +55 -1
  37. package/src/sap/fe/macros/controls/RequiredFlexBox.js +62 -0
  38. package/src/sap/fe/macros/controls/RequiredFlexBox.tsx +20 -0
  39. package/src/sap/fe/macros/controls/filterbar/VisualFilter.js +21 -11
  40. package/src/sap/fe/macros/controls/filterbar/VisualFilter.ts +25 -11
  41. package/src/sap/fe/macros/controls/filterbar/VisualFilterContainer.js +11 -2
  42. package/src/sap/fe/macros/controls/filterbar/VisualFilterContainer.ts +12 -1
  43. package/src/sap/fe/macros/controls/filterbar/utils/VisualFilterUtils.js +18 -1
  44. package/src/sap/fe/macros/controls/filterbar/utils/VisualFilterUtils.ts +20 -0
  45. package/src/sap/fe/macros/coreUI/CreateDialog.js +2 -2
  46. package/src/sap/fe/macros/coreUI/CreateDialog.tsx +1 -1
  47. package/src/sap/fe/macros/designtime/Designtime.helper.js +12 -2
  48. package/src/sap/fe/macros/designtime/Designtime.helper.ts +12 -0
  49. package/src/sap/fe/macros/draftIndicator/DraftIndicator.js +15 -4
  50. package/src/sap/fe/macros/draftIndicator/DraftIndicator.tsx +5 -0
  51. package/src/sap/fe/macros/field/FieldBaseDelegate.js +9 -3
  52. package/src/sap/fe/macros/field/FieldBaseDelegate.ts +22 -1
  53. package/src/sap/fe/macros/field/FieldFormatOptions.js +73 -44
  54. package/src/sap/fe/macros/field/FieldFormatOptions.ts +20 -2
  55. package/src/sap/fe/macros/filterBar/FilterBar.block.js +8 -2
  56. package/src/sap/fe/macros/filterBar/FilterBar.block.tsx +2 -5
  57. package/src/sap/fe/macros/filterBar/FilterBarAPI.js +8 -8
  58. package/src/sap/fe/macros/filterBar/FilterBarAPI.ts +8 -8
  59. package/src/sap/fe/macros/filterBar/designtime/FilterBar.designtime.js +3 -1
  60. package/src/sap/fe/macros/filterBar/designtime/FilterBar.designtime.ts +2 -0
  61. package/src/sap/fe/macros/filterBar/mixin/FilterBarAPIStateHandler.js +1 -1
  62. package/src/sap/fe/macros/filterBar/mixin/FilterBarAPIStateHandler.ts +1 -1
  63. package/src/sap/fe/macros/form/FormActionButtons.fragment.xml +13 -2
  64. package/src/sap/fe/macros/form/FormContainer.fragment.xml +40 -0
  65. package/src/sap/fe/macros/form/FormContainerAPI.js +14 -16
  66. package/src/sap/fe/macros/form/FormContainerAPI.ts +13 -15
  67. package/src/sap/fe/macros/formatters/TableFormatter.js +10 -1
  68. package/src/sap/fe/macros/formatters/TableFormatter.ts +14 -5
  69. package/src/sap/fe/macros/inlineEdit/InlineEdit.js +15 -3
  70. package/src/sap/fe/macros/inlineEdit/InlineEdit.ts +14 -2
  71. package/src/sap/fe/macros/internal/DataPoint.js +2 -1
  72. package/src/sap/fe/macros/internal/DataPoint.tsx +1 -0
  73. package/src/sap/fe/macros/internal/DataPointFormatOptions.js +11 -2
  74. package/src/sap/fe/macros/internal/DataPointFormatOptions.ts +3 -0
  75. package/src/sap/fe/macros/internal/FilterField.block.js +4 -2
  76. package/src/sap/fe/macros/internal/FilterField.block.ts +3 -1
  77. package/src/sap/fe/macros/internal/field/CheckBoxGroup.fragment.xml +25 -0
  78. package/src/sap/fe/macros/internal/field/DisplayStyle.js +49 -11
  79. package/src/sap/fe/macros/internal/field/DisplayStyle.tsx +51 -4
  80. package/src/sap/fe/macros/internal/field/EditStyle.js +5 -1
  81. package/src/sap/fe/macros/internal/field/EditStyle.tsx +4 -0
  82. package/src/sap/fe/macros/internal/field/FieldStructureHelper.js +9 -2
  83. package/src/sap/fe/macros/internal/field/FieldStructureHelper.ts +10 -0
  84. package/src/sap/fe/macros/internal/field/FieldStyles.js +1 -1
  85. package/src/sap/fe/macros/internal/field/FieldStyles.tsx +2 -1
  86. package/src/sap/fe/macros/internal/valuehelp/ValueListDialogTable.fragment.xml +1 -0
  87. package/src/sap/fe/macros/internal/valuehelp/ValueListHelper.js +7 -3
  88. package/src/sap/fe/macros/internal/valuehelp/ValueListHelper.ts +8 -7
  89. package/src/sap/fe/macros/internal/valuehelp/ValueListTable.fragment.xml +1 -0
  90. package/src/sap/fe/macros/library.js +1 -1
  91. package/src/sap/fe/macros/mdc/adapter/StateHelper.js +7 -2
  92. package/src/sap/fe/macros/mdc/adapter/StateHelper.ts +7 -3
  93. package/src/sap/fe/macros/messagebundle.properties +37 -29
  94. package/src/sap/fe/macros/messagebundle_ar.properties +5 -3
  95. package/src/sap/fe/macros/messagebundle_bg.properties +6 -4
  96. package/src/sap/fe/macros/messagebundle_ca.properties +8 -6
  97. package/src/sap/fe/macros/messagebundle_cnr.properties +5 -3
  98. package/src/sap/fe/macros/messagebundle_cs.properties +4 -2
  99. package/src/sap/fe/macros/messagebundle_cy.properties +7 -5
  100. package/src/sap/fe/macros/messagebundle_da.properties +6 -4
  101. package/src/sap/fe/macros/messagebundle_de.properties +11 -9
  102. package/src/sap/fe/macros/messagebundle_el.properties +7 -5
  103. package/src/sap/fe/macros/messagebundle_en.properties +8 -6
  104. package/src/sap/fe/macros/messagebundle_en_GB.properties +8 -6
  105. package/src/sap/fe/macros/messagebundle_en_US_saprigi.properties +8 -6
  106. package/src/sap/fe/macros/messagebundle_es.properties +6 -4
  107. package/src/sap/fe/macros/messagebundle_es_MX.properties +6 -4
  108. package/src/sap/fe/macros/messagebundle_et.properties +5 -3
  109. package/src/sap/fe/macros/messagebundle_fi.properties +8 -6
  110. package/src/sap/fe/macros/messagebundle_fr.properties +6 -4
  111. package/src/sap/fe/macros/messagebundle_fr_CA.properties +8 -6
  112. package/src/sap/fe/macros/messagebundle_hi.properties +6 -4
  113. package/src/sap/fe/macros/messagebundle_hr.properties +6 -4
  114. package/src/sap/fe/macros/messagebundle_hu.properties +4 -2
  115. package/src/sap/fe/macros/messagebundle_id.properties +8 -6
  116. package/src/sap/fe/macros/messagebundle_it.properties +4 -2
  117. package/src/sap/fe/macros/messagebundle_iw.properties +5 -3
  118. package/src/sap/fe/macros/messagebundle_ja.properties +5 -3
  119. package/src/sap/fe/macros/messagebundle_kk.properties +5 -3
  120. package/src/sap/fe/macros/messagebundle_ko.properties +4 -2
  121. package/src/sap/fe/macros/messagebundle_lt.properties +6 -4
  122. package/src/sap/fe/macros/messagebundle_lv.properties +5 -3
  123. package/src/sap/fe/macros/messagebundle_mk.properties +5 -3
  124. package/src/sap/fe/macros/messagebundle_ms.properties +8 -6
  125. package/src/sap/fe/macros/messagebundle_nl.properties +7 -5
  126. package/src/sap/fe/macros/messagebundle_no.properties +6 -4
  127. package/src/sap/fe/macros/messagebundle_pl.properties +6 -4
  128. package/src/sap/fe/macros/messagebundle_pt.properties +7 -5
  129. package/src/sap/fe/macros/messagebundle_pt_PT.properties +6 -4
  130. package/src/sap/fe/macros/messagebundle_ro.properties +7 -5
  131. package/src/sap/fe/macros/messagebundle_ru.properties +4 -2
  132. package/src/sap/fe/macros/messagebundle_sh.properties +5 -3
  133. package/src/sap/fe/macros/messagebundle_sk.properties +5 -3
  134. package/src/sap/fe/macros/messagebundle_sl.properties +6 -4
  135. package/src/sap/fe/macros/messagebundle_sr.properties +5 -3
  136. package/src/sap/fe/macros/messagebundle_sv.properties +5 -3
  137. package/src/sap/fe/macros/messagebundle_th.properties +4 -2
  138. package/src/sap/fe/macros/messagebundle_tr.properties +4 -2
  139. package/src/sap/fe/macros/messagebundle_uk.properties +10 -8
  140. package/src/sap/fe/macros/messagebundle_vi.properties +6 -4
  141. package/src/sap/fe/macros/messagebundle_zh_CN.properties +5 -3
  142. package/src/sap/fe/macros/messagebundle_zh_TW.properties +5 -3
  143. package/src/sap/fe/macros/messages/MessageButton.js +17 -19
  144. package/src/sap/fe/macros/messages/MessageButton.ts +24 -22
  145. package/src/sap/fe/macros/table/Action.js +24 -2
  146. package/src/sap/fe/macros/table/Action.ts +13 -0
  147. package/src/sap/fe/macros/table/ActionGroup.js +24 -2
  148. package/src/sap/fe/macros/table/ActionGroup.ts +13 -0
  149. package/src/sap/fe/macros/table/ActionGroupOverride.js +24 -2
  150. package/src/sap/fe/macros/table/ActionGroupOverride.ts +13 -0
  151. package/src/sap/fe/macros/table/ActionOverride.js +24 -2
  152. package/src/sap/fe/macros/table/ActionOverride.ts +13 -0
  153. package/src/sap/fe/macros/table/ActionsTemplating.js +73 -12
  154. package/src/sap/fe/macros/table/ActionsTemplating.tsx +69 -13
  155. package/src/sap/fe/macros/table/Column.js +3 -3
  156. package/src/sap/fe/macros/table/Column.ts +2 -2
  157. package/src/sap/fe/macros/table/MdcTableTemplate.js +18 -8
  158. package/src/sap/fe/macros/table/MdcTableTemplate.tsx +30 -5
  159. package/src/sap/fe/macros/table/QuickFilterSelector.js +35 -14
  160. package/src/sap/fe/macros/table/QuickFilterSelector.tsx +22 -3
  161. package/src/sap/fe/macros/table/Table.block.js +137 -108
  162. package/src/sap/fe/macros/table/Table.block.tsx +29 -2
  163. package/src/sap/fe/macros/table/TableAPI.js +143 -133
  164. package/src/sap/fe/macros/table/TableAPI.ts +5 -1
  165. package/src/sap/fe/macros/table/TableDefinition.js +4 -2
  166. package/src/sap/fe/macros/table/TableDefinition.ts +3 -1
  167. package/src/sap/fe/macros/table/TableRuntime.js +3 -3
  168. package/src/sap/fe/macros/table/TableRuntime.ts +2 -2
  169. package/src/sap/fe/macros/table/delegates/TableDelegate.js +25 -19
  170. package/src/sap/fe/macros/table/delegates/TableDelegate.ts +25 -23
  171. package/src/sap/fe/macros/table/designtime/Table.designtime.js +3 -1
  172. package/src/sap/fe/macros/table/designtime/Table.designtime.ts +2 -0
  173. package/src/sap/fe/macros/table/massEdit/designtime/MassEdit.designtime.js +3 -1
  174. package/src/sap/fe/macros/table/massEdit/designtime/MassEdit.designtime.ts +2 -1
  175. package/src/sap/fe/macros/table/mixin/ContextMenuHandler.js +2 -1
  176. package/src/sap/fe/macros/table/mixin/ContextMenuHandler.ts +1 -0
  177. package/src/sap/fe/macros/table/mixin/TableHierarchy.js +4 -1
  178. package/src/sap/fe/macros/table/mixin/TableHierarchy.ts +3 -0
  179. package/src/sap/fe/macros/valuehelp/ValueHelpDelegate.js +11 -6
  180. package/src/sap/fe/macros/valuehelp/ValueHelpDelegate.ts +19 -14
  181. package/src/sap/fe/macros/visualfilters/VisualFilter.js +95 -6
  182. package/src/sap/fe/macros/visualfilters/VisualFilter.tsx +93 -2
  183. package/src/sap/fe/macros/visualfilters/VisualFilterRuntime.js +15 -3
  184. package/src/sap/fe/macros/visualfilters/VisualFilterRuntime.ts +17 -2
@@ -59,7 +59,7 @@ import { getVisualFilterChart } from "./fragments/InteractiveCharts";
59
59
  * @experimental
60
60
  */
61
61
  @defineUI5Class("sap.fe.macros.visualfilters.VisualFilter")
62
- export default class VisualFilter extends BuildingBlock<VisualFilter> {
62
+ export default class VisualFilter extends BuildingBlock<VisualFilterControl> {
63
63
  @implementInterface("sap.ui.core.IFormContent")
64
64
  __implements__sap_ui_core_IFormContent = true;
65
65
 
@@ -204,6 +204,15 @@ export default class VisualFilter extends BuildingBlock<VisualFilter> {
204
204
  })
205
205
  isValueListWithFixedValues: boolean | undefined;
206
206
 
207
+ /**
208
+ * Enable or disable chart binding
209
+ * @public
210
+ */
211
+ @property({
212
+ type: "boolean"
213
+ })
214
+ enableChartBinding = true;
215
+
207
216
  /******************************************************
208
217
  * Internal Properties
209
218
  * ***************************************************/
@@ -231,6 +240,16 @@ export default class VisualFilter extends BuildingBlock<VisualFilter> {
231
240
  collection?: DataModelObjectPath<PageContextPathTarget>;
232
241
  selectionVariant: SelectionVariant | undefined;
233
242
 
243
+ /**
244
+ * Flag to indicate if the in-parameters and conditions update is pending.
245
+ */
246
+ private inParamConditionUpdatePending = false;
247
+
248
+ /**
249
+ * Initial rendering is pending.
250
+ */
251
+ private renderingUpdatePending = true;
252
+
234
253
  constructor(props: $ControlSettings & PropertiesOf<VisualFilterControl>, others?: $ControlSettings) {
235
254
  super(props, others);
236
255
  }
@@ -681,7 +700,79 @@ export default class VisualFilter extends BuildingBlock<VisualFilter> {
681
700
  );
682
701
  }
683
702
 
684
- createContent(): VisualFilter {
703
+ /**
704
+ * Handles inparameters changes during the enablement of the visual filter chart binding based on the changed filter field paths.
705
+ *
706
+ * This method checks if the in-parameters of the visual filter are affected by the changed filter field paths.
707
+ * If any of the in-parameters are affected, we sets th internal condition update pending flag to true.
708
+ * Subsequently, the chart binding will be enabled only after the condition model is updated for the visual filter with the inparameter selections.
709
+ * @param changedFilterFieldPaths Array of changed filter field paths.
710
+ */
711
+ _handleInParamsChartBindingEnablement(changedFilterFieldPaths: string[]): void {
712
+ const inParameters = this.getProperty("inParameters").customData as ParameterType[];
713
+ const inParameterLocalDataProperties = inParameters.map((inParameter) => inParameter.localDataProperty);
714
+ const vfInParameterUpdateExpected = changedFilterFieldPaths.some((path) => inParameterLocalDataProperties.includes(path));
715
+ if (vfInParameterUpdateExpected) {
716
+ // If the inParameters of the visual filter are changed(diffState), we need to wait for conditions model to be updated for the visual filter to filter chart binding.
717
+ this._setInternalUpdatePending(true);
718
+ }
719
+ }
720
+
721
+ /**
722
+ * Sets the enablement of the visual filter chart binding.
723
+ * @param enableBinding Boolean indicating whether to enable or disable the chart binding.
724
+ * @param changedFilterFieldPaths Array of changed filter field paths that may affect the in-parameters of the visual filter.
725
+ */
726
+ setEnableChartBinding(enableBinding: boolean, changedFilterFieldPaths: string[] = []): void {
727
+ if (enableBinding && changedFilterFieldPaths.length > 0) {
728
+ // If inparameters are changed, we need to wait till the condition model to be updated before we send resume the binding with the inparameter selections as filters to the chart binding and send the request.
729
+ this._handleInParamsChartBindingEnablement(changedFilterFieldPaths);
730
+ }
731
+
732
+ // The binding is expected to be enabled only when visual filter is ready
733
+ // 1. internally(inparameter conditions are updated and visual filter is rendered)
734
+ // 2. and externally(enableChartBinding). Like, xAppState or iAppState is applied to parent filter bar.
735
+ const internalUpdatePending = this.inParamConditionUpdatePending || this.renderingUpdatePending;
736
+
737
+ const overallEnableBinding = enableBinding && !internalUpdatePending;
738
+ const chartBinding = this.content?.getChartBinding();
739
+ if (chartBinding) {
740
+ if (overallEnableBinding && chartBinding.isSuspended()) {
741
+ chartBinding.resume();
742
+ } else if (!overallEnableBinding && !chartBinding.isSuspended()) {
743
+ chartBinding.suspend();
744
+ }
745
+ }
746
+ this.setProperty("enableChartBinding", enableBinding, true);
747
+ }
748
+
749
+ /**
750
+ * Sets the internal update pending flags for the visual filter.
751
+ * This method is used to manage the internal state of the visual filter, specifically when the in-parameters and rendering updates are pending.
752
+ * @param conditionUpdatePending Whether the condition update is pending or not. Defaults to the current inParamConditionUpdatePending state.
753
+ * @param renderingUpdatePending Whether the rendering update is pending or not. Defaults to the current renderingUpdatePending state.
754
+ */
755
+ _setInternalUpdatePending(
756
+ conditionUpdatePending = this.inParamConditionUpdatePending,
757
+ renderingUpdatePending = this.renderingUpdatePending
758
+ ): void {
759
+ // This method is used to internally by visual filter to enable and disable bindings.
760
+ const isBindingEnabledForVisualFilterExternally = this.enableChartBinding;
761
+ const chartBinding = this.content?.getChartBinding();
762
+ const updatePending = conditionUpdatePending || renderingUpdatePending;
763
+ if (!updatePending && isBindingEnabledForVisualFilterExternally && chartBinding && chartBinding.isSuspended()) {
764
+ // Internal update is done, binding is enabled externally, so resume the binding.
765
+ chartBinding.resume();
766
+ } else if (updatePending && chartBinding && !chartBinding.isSuspended()) {
767
+ // Internal update is pending/in progress, so we suspend the binding.
768
+ chartBinding.suspend();
769
+ }
770
+ // Update the internal flags for condition and rendering update pending.
771
+ this.inParamConditionUpdatePending = conditionUpdatePending;
772
+ this.renderingUpdatePending = renderingUpdatePending;
773
+ }
774
+
775
+ createContent(): VisualFilterControl {
685
776
  const id = generate([this.path]);
686
777
  const showErrorExpression = "{= !${internal>" + id + "/showError}}";
687
778
  const cozyMode = document.body.classList.contains("sapUiSizeCozy");
@@ -85,6 +85,17 @@ sap.ui.define(["sap/base/Log", "sap/base/util/ObjectPath", "sap/fe/macros/Common
85
85
  }
86
86
  return aSelectableValues.includes(sDimensionValue);
87
87
  },
88
+ /**
89
+ * Get Visual Filter control for the given child control.
90
+ * @param potentialVisualFilter Expected instance of Visual Filter child control.
91
+ * @returns The parent Visual Filter Buildingblock control instance if found, otherwise null.
92
+ */
93
+ getParentVisualFilterControlBB(potentialVisualFilter) {
94
+ while (potentialVisualFilter && !potentialVisualFilter.isA("sap.fe.macros.visualfilters.VisualFilter")) {
95
+ potentialVisualFilter = potentialVisualFilter.getParent();
96
+ }
97
+ return potentialVisualFilter;
98
+ },
88
99
  // THIS IS A FORMATTER
89
100
  getFiltersFromConditions() {
90
101
  for (var _len = arguments.length, aArguments = new Array(_len), _key = 0; _key < _len; _key++) {
@@ -256,8 +267,9 @@ sap.ui.define(["sap/base/Log", "sap/base/util/ObjectPath", "sap/fe/macros/Common
256
267
  oInteractiveChartListBinding?.filter();
257
268
  }
258
269
  // update the interactive chart binding
259
- if (bEnableBinding && oInteractiveChartListBinding?.isSuspended()) {
260
- oInteractiveChartListBinding?.resume();
270
+ if (bEnableBinding) {
271
+ const visualFilterBB = VisualFilterRuntime.getParentVisualFilterControlBB(oInteractiveChart);
272
+ visualFilterBB?._setInternalUpdatePending(false);
261
273
  }
262
274
  return aFilters;
263
275
  },
@@ -294,4 +306,4 @@ sap.ui.define(["sap/base/Log", "sap/base/util/ObjectPath", "sap/fe/macros/Common
294
306
  ObjectPath.set("sap.fe.macros.visualfilters.VisualFilterRuntime", VisualFilterRuntime);
295
307
  return VisualFilterRuntime;
296
308
  }, false);
297
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJWaXN1YWxGaWx0ZXJSdW50aW1lIiwic2VsZWN0aW9uQ2hhbmdlZCIsIm9FdmVudCIsIm9JbnRlcmFjdGl2ZUNoYXJ0IiwiZ2V0U291cmNlIiwic091dFBhcmFtZXRlciIsImRhdGEiLCJzVmFsdWVMaXN0UHJvcGVydHkiLCJzRGltZW5zaW9uIiwic0RpbWVuc2lvblRleHQiLCJiTXVsdGlwbGVTZWxlY3Rpb25BbGxvd2VkIiwic0RpbWVuc2lvblR5cGUiLCJvU2VsZWN0ZWRBZ2dyZWdhdGlvbiIsImdldFBhcmFtZXRlciIsImJJc0FnZ3JlZ2F0aW9uU2VsZWN0ZWQiLCJvQ29uZGl0aW9uTW9kZWwiLCJnZXRNb2RlbCIsImFDb25kaXRpb25zIiwiZ2V0UHJvcGVydHkiLCJMb2ciLCJlcnJvciIsInNTZWxlY3Rpb25DaGFuZ2VkVmFsdWUiLCJnZXRCaW5kaW5nQ29udGV4dCIsImdldE9iamVjdCIsInNTZWxlY3Rpb25DaGFuZ2VkVmFsdWVUZXh0IiwiU3RyaW5nIiwidW5kZWZpbmVkIiwiVmlzdWFsRmlsdGVyVXRpbHMiLCJfcGFyc2VEYXRlVGltZSIsIm9Db25kaXRpb24iLCJDb25kaXRpb24iLCJjcmVhdGVJdGVtQ29uZGl0aW9uIiwicHVzaCIsImZpbHRlciIsIm9wZXJhdG9yIiwiRGF0ZSIsInBhcnNlIiwidmFsdWVzIiwic2V0UHJvcGVydHkiLCJnZXRBZ2dyZWdhdGlvblNlbGVjdGVkIiwiYVNlbGVjdGFibGVWYWx1ZXMiLCJpIiwibGVuZ3RoIiwiZ2V0UGFyZW50Iiwic0RpbWVuc2lvblZhbHVlIiwiaW5jbHVkZXMiLCJnZXRGaWx0ZXJzRnJvbUNvbmRpdGlvbnMiLCJfbGVuIiwiYXJndW1lbnRzIiwiYUFyZ3VtZW50cyIsIkFycmF5IiwiX2tleSIsIm9GaWx0ZXJCYXIiLCJhSW5QYXJhbWV0ZXJzIiwiY3VzdG9tRGF0YSIsImJJc0RyYWZ0U3VwcG9ydGVkIiwiYVByb3BlcnR5SW5mb1NldCIsIkZpbHRlclV0aWxzIiwiZ2V0RmlsdGVyUHJvcGVydHlJbmZvIiwibUNvbmRpdGlvbnMiLCJhVmFsdWVMaXN0UHJvcGVydHlJbmZvU2V0Iiwib0ZpbHRlcnMiLCJhRmlsdGVycyIsImFQYXJhbWV0ZXJzIiwib1NlbGVjdGlvblZhcmlhbnRBbm5vdGF0aW9uIiwib0ludGVyYWN0aXZlQ2hhcnRMaXN0QmluZGluZyIsImdldEJpbmRpbmciLCJzUGF0aCIsImdldFBhdGgiLCJvTWV0YU1vZGVsIiwiZ2V0TWV0YU1vZGVsIiwic0VudGl0eVNldFBhdGgiLCJmaWx0ZXJDb25kaXRpb25zIiwiZ2V0RmlsdGVyc0NvbmRpdGlvbnNGcm9tU2VsZWN0aW9uVmFyaWFudCIsImdldEN1c3RvbUNvbmRpdGlvbnMiLCJiaW5kIiwidHlwZUNvbmZpZyIsIlR5cGVNYXAiLCJnZXRUeXBlQ29uZmlnIiwiZGF0YVR5cGUiLCJvU2VsZWN0aW9uVmFyaWFudENvbmRpdGlvbnMiLCJjb252ZXJ0RmlsdGVyQ29uZGlvbnMiLCJPYmplY3QiLCJrZXlzIiwiZm9yRWFjaCIsInNLZXkiLCJpblBhcmFtZXRlckZvcktleSIsImZpbmQiLCJpblBhcmFtZXRlciIsInZhbHVlTGlzdFByb3BlcnR5IiwibG9jYWxEYXRhUHJvcGVydHkiLCJwcm9wZXJ0eUluZm9TZXQiLCJuYW1lIiwiYmFzZVR5cGUiLCJjb25kaXRpb24iLCJfZm9ybWF0RGF0ZVRpbWUiLCJvSW5QYXJhbWV0ZXIiLCJpbmRleCIsIm9JbnRlcm5hbE1vZGVsQ29udGV4dCIsInNJbmZvUGF0aCIsImJFbmFibGVCaW5kaW5nIiwib1Jlc291cmNlQnVuZGxlIiwiTGlicmFyeSIsImdldFJlc291cmNlQnVuZGxlRm9yIiwiYVJlcXVpcmVkUHJvcGVydGllcyIsIkNvbW1vbkhlbHBlciIsInBhcnNlQ3VzdG9tRGF0YSIsImFOb3RNYXRjaGVkQ29uZGl0aW9ucyIsInJlcXVpcmVkUHJvcGVydHlQYXRoIiwiZXJyb3JNZXNzYWdlVGl0bGUiLCJlcnJvck1lc3NhZ2UiLCJzaG93RXJyb3IiLCJnZXRUZXh0Iiwic0xhYmVsIiwic0ZpbHRlckVudGl0eU5hbWUiLCJzcGxpdCIsInNDaGFydEVudGl0eU5hbWUiLCJzQmluZGluZ1BhdGgiLCJnZXRCaW5kaW5nUGF0aEZvclBhcmFtZXRlcnMiLCJwYXJhbWV0ZXIiLCJNZGNGaWx0ZXJVdGlsIiwiZ2V0RmlsdGVySW5mbyIsImZpbHRlcnMiLCJlIiwiZGVidWciLCJnZXRGaWx0ZXJzIiwiRmlsdGVyIiwiRmlsdGVyT3BlcmF0b3IiLCJFUSIsImlzU3VzcGVuZGVkIiwicmVzdW1lIiwiZ2V0RmlsdGVyQ291bnRzIiwib0NvbmRpdGlvbnMiLCJzY2FsZVZpc3VhbEZpbHRlclZhbHVlIiwib1ZhbHVlIiwic2NhbGVGYWN0b3IiLCJudW1iZXJPZkZyYWN0aW9uYWxEaWdpdHMiLCJjdXJyZW5jeSIsIm9SYXdWYWx1ZSIsImdldEZvcm1hdHRlZE51bWJlciIsImZpcmVWYWx1ZUhlbHAiLCJmaXJlRXZlbnQiLCJPYmplY3RQYXRoIiwic2V0Il0sInNvdXJjZVJvb3QiOiIuIiwic291cmNlcyI6WyJWaXN1YWxGaWx0ZXJSdW50aW1lLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgU2VsZWN0aW9uVmFyaWFudFR5cGUgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL1VJXCI7XG5pbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCBPYmplY3RQYXRoIGZyb20gXCJzYXAvYmFzZS91dGlsL09iamVjdFBhdGhcIjtcbmltcG9ydCB0eXBlIHsgSW50ZXJuYWxNb2RlbENvbnRleHQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0IENvbW1vbkhlbHBlciBmcm9tIFwic2FwL2ZlL21hY3Jvcy9Db21tb25IZWxwZXJcIjtcbmltcG9ydCBWaXN1YWxGaWx0ZXJVdGlscyBmcm9tIFwic2FwL2ZlL21hY3Jvcy9jb250cm9scy9maWx0ZXJiYXIvdXRpbHMvVmlzdWFsRmlsdGVyVXRpbHNcIjtcbmltcG9ydCB0eXBlIHsgSUZpbHRlckNvbnRyb2wgfSBmcm9tIFwic2FwL2ZlL21hY3Jvcy9maWx0ZXIvRmlsdGVyVXRpbHNcIjtcbmltcG9ydCBGaWx0ZXJVdGlscyBmcm9tIFwic2FwL2ZlL21hY3Jvcy9maWx0ZXIvRmlsdGVyVXRpbHNcIjtcbmltcG9ydCB7IGdldEZpbHRlcnNDb25kaXRpb25zRnJvbVNlbGVjdGlvblZhcmlhbnQgfSBmcm9tIFwic2FwL2ZlL21hY3Jvcy9maWx0ZXJCYXIvRmlsdGVySGVscGVyXCI7XG5pbXBvcnQgdHlwZSB7IFByb3BlcnR5SW5mbyB9IGZyb20gXCJzYXAvZmUvbWFjcm9zL2ludGVybmFsL1Byb3BlcnR5SW5mb1wiO1xuaW1wb3J0IHR5cGUgeyBJbnRlcmFjdGl2ZUJhckNoYXJ0JFNlbGVjdGlvbkNoYW5nZWRFdmVudCB9IGZyb20gXCJzYXAvc3VpdGUvdWkvbWljcm9jaGFydC9JbnRlcmFjdGl2ZUJhckNoYXJ0XCI7XG5pbXBvcnQgdHlwZSB7IEludGVyYWN0aXZlRG9udXRDaGFydCRTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgfSBmcm9tIFwic2FwL3N1aXRlL3VpL21pY3JvY2hhcnQvSW50ZXJhY3RpdmVEb251dENoYXJ0XCI7XG5pbXBvcnQgdHlwZSB7IEludGVyYWN0aXZlTGluZUNoYXJ0JFNlbGVjdGlvbkNoYW5nZWRFdmVudCB9IGZyb20gXCJzYXAvc3VpdGUvdWkvbWljcm9jaGFydC9JbnRlcmFjdGl2ZUxpbmVDaGFydFwiO1xuaW1wb3J0IHR5cGUgVUk1RXZlbnQgZnJvbSBcInNhcC91aS9iYXNlL0V2ZW50XCI7XG5pbXBvcnQgdHlwZSBNYW5hZ2VkT2JqZWN0IGZyb20gXCJzYXAvdWkvYmFzZS9NYW5hZ2VkT2JqZWN0XCI7XG5pbXBvcnQgdHlwZSBDb250cm9sIGZyb20gXCJzYXAvdWkvY29yZS9Db250cm9sXCI7XG5pbXBvcnQgTGlicmFyeSBmcm9tIFwic2FwL3VpL2NvcmUvTGliXCI7XG5pbXBvcnQgdHlwZSB7IENvbmRpdGlvbk9iamVjdCB9IGZyb20gXCJzYXAvdWkvbWRjL2NvbmRpdGlvbi9Db25kaXRpb25cIjtcbmltcG9ydCBDb25kaXRpb24gZnJvbSBcInNhcC91aS9tZGMvY29uZGl0aW9uL0NvbmRpdGlvblwiO1xuaW1wb3J0IFR5cGVNYXAgZnJvbSBcInNhcC91aS9tZGMvb2RhdGEvdjQvVHlwZU1hcFwiO1xuaW1wb3J0IE1kY0ZpbHRlclV0aWwgZnJvbSBcInNhcC91aS9tZGMvdXRpbC9GaWx0ZXJVdGlsXCI7XG5pbXBvcnQgRmlsdGVyIGZyb20gXCJzYXAvdWkvbW9kZWwvRmlsdGVyXCI7XG5pbXBvcnQgRmlsdGVyT3BlcmF0b3IgZnJvbSBcInNhcC91aS9tb2RlbC9GaWx0ZXJPcGVyYXRvclwiO1xuaW1wb3J0IHR5cGUgSlNPTk1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvanNvbi9KU09OTW9kZWxcIjtcbmltcG9ydCB0eXBlIE9EYXRhTGlzdEJpbmRpbmcgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YUxpc3RCaW5kaW5nXCI7XG5pbXBvcnQgdHlwZSBPRGF0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNb2RlbFwiO1xuaW1wb3J0IHR5cGUgeyBNZXRhTW9kZWxUeXBlIH0gZnJvbSBcIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3R5cGVzL21ldGFtb2RlbF90eXBlc1wiO1xuXG4vKipcbiAqIFN0YXRpYyBjbGFzcyB1c2VkIGJ5IFZpc3VhbCBGaWx0ZXIgZHVyaW5nIHJ1bnRpbWVcbiAqIEBwcml2YXRlXG4gKiBAZXhwZXJpbWVudGFsIFRoaXMgbW9kdWxlIGlzIG9ubHkgZm9yIGludGVybmFsL2V4cGVyaW1lbnRhbCB1c2UhXG4gKi9cbmNvbnN0IFZpc3VhbEZpbHRlclJ1bnRpbWUgPSB7XG5cdHNlbGVjdGlvbkNoYW5nZWQoXG5cdFx0b0V2ZW50OlxuXHRcdFx0fCBVSTVFdmVudFxuXHRcdFx0fCBJbnRlcmFjdGl2ZUJhckNoYXJ0JFNlbGVjdGlvbkNoYW5nZWRFdmVudFxuXHRcdFx0fCBJbnRlcmFjdGl2ZUxpbmVDaGFydCRTZWxlY3Rpb25DaGFuZ2VkRXZlbnRcblx0XHRcdHwgSW50ZXJhY3RpdmVEb251dENoYXJ0JFNlbGVjdGlvbkNoYW5nZWRFdmVudFxuXHQpOiB2b2lkIHtcblx0XHRjb25zdCBvSW50ZXJhY3RpdmVDaGFydDogQ29udHJvbCA9IChvRXZlbnQgYXMgVUk1RXZlbnQpLmdldFNvdXJjZSgpO1xuXHRcdGNvbnN0IHNPdXRQYXJhbWV0ZXIgPSBvSW50ZXJhY3RpdmVDaGFydC5kYXRhKFwib3V0UGFyYW1ldGVyXCIpO1xuXHRcdGNvbnN0IHNWYWx1ZUxpc3RQcm9wZXJ0eSA9IG9JbnRlcmFjdGl2ZUNoYXJ0LmRhdGEoXCJ2YWx1ZWxpc3RQcm9wZXJ0eVwiKTtcblx0XHRjb25zdCBzRGltZW5zaW9uID0gb0ludGVyYWN0aXZlQ2hhcnQuZGF0YShcImRpbWVuc2lvblwiKTtcblx0XHRjb25zdCBzRGltZW5zaW9uVGV4dCA9IG9JbnRlcmFjdGl2ZUNoYXJ0LmRhdGEoXCJkaW1lbnNpb25UZXh0XCIpO1xuXHRcdGNvbnN0IGJNdWx0aXBsZVNlbGVjdGlvbkFsbG93ZWQgPSBvSW50ZXJhY3RpdmVDaGFydC5kYXRhKFwibXVsdGlwbGVTZWxlY3Rpb25BbGxvd2VkXCIpO1xuXHRcdGNvbnN0IHNEaW1lbnNpb25UeXBlID0gb0ludGVyYWN0aXZlQ2hhcnQuZGF0YShcImRpbWVuc2lvblR5cGVcIik7XG5cdFx0Y29uc3Qgb1NlbGVjdGVkQWdncmVnYXRpb24gPVxuXHRcdFx0KG9FdmVudCBhcyBJbnRlcmFjdGl2ZUJhckNoYXJ0JFNlbGVjdGlvbkNoYW5nZWRFdmVudCkuZ2V0UGFyYW1ldGVyKFwiYmFyXCIpIHx8XG5cdFx0XHQob0V2ZW50IGFzIEludGVyYWN0aXZlTGluZUNoYXJ0JFNlbGVjdGlvbkNoYW5nZWRFdmVudCkuZ2V0UGFyYW1ldGVyKFwicG9pbnRcIikgfHxcblx0XHRcdChvRXZlbnQgYXMgSW50ZXJhY3RpdmVEb251dENoYXJ0JFNlbGVjdGlvbkNoYW5nZWRFdmVudCkuZ2V0UGFyYW1ldGVyKFwic2VnbWVudFwiKTtcblx0XHRjb25zdCBiSXNBZ2dyZWdhdGlvblNlbGVjdGVkID0gKG9FdmVudCBhcyBJbnRlcmFjdGl2ZUJhckNoYXJ0JFNlbGVjdGlvbkNoYW5nZWRFdmVudCkuZ2V0UGFyYW1ldGVyKFwic2VsZWN0ZWRcIik7XG5cdFx0Y29uc3Qgb0NvbmRpdGlvbk1vZGVsID0gb0ludGVyYWN0aXZlQ2hhcnQuZ2V0TW9kZWwoXCIkZmllbGRcIikgYXMgSlNPTk1vZGVsO1xuXHRcdGxldCBhQ29uZGl0aW9ucyA9IG9Db25kaXRpb25Nb2RlbC5nZXRQcm9wZXJ0eShcIi9jb25kaXRpb25zXCIpO1xuXG5cdFx0aWYgKCFzT3V0UGFyYW1ldGVyIHx8IHNWYWx1ZUxpc3RQcm9wZXJ0eSAhPT0gc0RpbWVuc2lvbikge1xuXHRcdFx0TG9nLmVycm9yKFwiVmlzdWFsRmlsdGVyOiBDYW5ub3Qgc3luYyB2YWx1ZXMgd2l0aCByZWd1bGFyIGZpbHRlciBhcyBvdXQgcGFyYW1ldGVyIGlzIG5vdCBjb25maWd1cmVkIHByb3Blcmx5IVwiKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bGV0IHNTZWxlY3Rpb25DaGFuZ2VkVmFsdWUgPSBvU2VsZWN0ZWRBZ2dyZWdhdGlvbj8uZ2V0QmluZGluZ0NvbnRleHQoKT8uZ2V0T2JqZWN0KHNWYWx1ZUxpc3RQcm9wZXJ0eSk7XG5cdFx0XHRpZiAoc1NlbGVjdGlvbkNoYW5nZWRWYWx1ZSkge1xuXHRcdFx0XHRsZXQgc1NlbGVjdGlvbkNoYW5nZWRWYWx1ZVRleHQgPSBvU2VsZWN0ZWRBZ2dyZWdhdGlvbj8uZ2V0QmluZGluZ0NvbnRleHQoKT8uZ2V0T2JqZWN0KHNEaW1lbnNpb25UZXh0KTtcblx0XHRcdFx0aWYgKHR5cGVvZiBzU2VsZWN0aW9uQ2hhbmdlZFZhbHVlVGV4dCAhPT0gXCJzdHJpbmdcIiAmJiAhKHNTZWxlY3Rpb25DaGFuZ2VkVmFsdWVUZXh0IGluc3RhbmNlb2YgU3RyaW5nKSkge1xuXHRcdFx0XHRcdHNTZWxlY3Rpb25DaGFuZ2VkVmFsdWVUZXh0ID0gdW5kZWZpbmVkO1xuXHRcdFx0XHR9XG5cdFx0XHRcdC8vIGlmIHNlbGVjdGlvbiBoYXMgYmVlbiBkb25lIG9uIHRoZSBhZ2dyZWdhdGlvbiB0aGVuIGFkZCB0byBjb25kaXRpb25zXG5cdFx0XHRcdGlmIChiSXNBZ2dyZWdhdGlvblNlbGVjdGVkKSB7XG5cdFx0XHRcdFx0aWYgKGJNdWx0aXBsZVNlbGVjdGlvbkFsbG93ZWQgPT09IGZhbHNlKSB7XG5cdFx0XHRcdFx0XHRhQ29uZGl0aW9ucyA9IFtdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoc0RpbWVuc2lvblR5cGUgPT09IFwiRWRtLkRhdGVUaW1lT2Zmc2V0XCIpIHtcblx0XHRcdFx0XHRcdHNTZWxlY3Rpb25DaGFuZ2VkVmFsdWUgPSBWaXN1YWxGaWx0ZXJVdGlscy5fcGFyc2VEYXRlVGltZShzU2VsZWN0aW9uQ2hhbmdlZFZhbHVlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Y29uc3Qgb0NvbmRpdGlvbiA9IENvbmRpdGlvbi5jcmVhdGVJdGVtQ29uZGl0aW9uKFxuXHRcdFx0XHRcdFx0c1NlbGVjdGlvbkNoYW5nZWRWYWx1ZSxcblx0XHRcdFx0XHRcdHNTZWxlY3Rpb25DaGFuZ2VkVmFsdWVUZXh0IHx8IHVuZGVmaW5lZCxcblx0XHRcdFx0XHRcdHt9LFxuXHRcdFx0XHRcdFx0e31cblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdGFDb25kaXRpb25zLnB1c2gob0NvbmRpdGlvbik7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gYmVjYXVzZSBzZWxlY3Rpb24gd2FzIHJlbW92ZWQgb24gdGhlIGFnZ3JlZ2F0aW9uIGhlbmNlIHJlbW92ZSB0aGlzIGZyb20gY29uZGl0aW9uc1xuXHRcdFx0XHRcdGFDb25kaXRpb25zID0gYUNvbmRpdGlvbnMuZmlsdGVyKGZ1bmN0aW9uIChvQ29uZGl0aW9uOiBDb25kaXRpb25PYmplY3QpIHtcblx0XHRcdFx0XHRcdGlmIChzRGltZW5zaW9uVHlwZSA9PT0gXCJFZG0uRGF0ZVRpbWVPZmZzZXRcIikge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gb0NvbmRpdGlvbi5vcGVyYXRvciAhPT0gXCJFUVwiIHx8IERhdGUucGFyc2Uob0NvbmRpdGlvbi52YWx1ZXNbMF0pICE9PSBEYXRlLnBhcnNlKHNTZWxlY3Rpb25DaGFuZ2VkVmFsdWUpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0cmV0dXJuIG9Db25kaXRpb24ub3BlcmF0b3IgIT09IFwiRVFcIiB8fCBvQ29uZGl0aW9uLnZhbHVlc1swXSAhPT0gc1NlbGVjdGlvbkNoYW5nZWRWYWx1ZTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRvQ29uZGl0aW9uTW9kZWwuc2V0UHJvcGVydHkoXCIvY29uZGl0aW9uc1wiLCBhQ29uZGl0aW9ucyk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRMb2cuZXJyb3IoXCJWaXN1YWxGaWx0ZXI6IE5vIHZhdWUgZm91bmQgZm9yIHRoZSBvdXRQYXJhbWV0ZXJcIik7XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXHQvLyBUSElTIElTIEEgRk9STUFUVEVSXG5cdGdldEFnZ3JlZ2F0aW9uU2VsZWN0ZWQodGhpczogTWFuYWdlZE9iamVjdCwgYUNvbmRpdGlvbnM6IENvbmRpdGlvbk9iamVjdFtdKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG5cdFx0bGV0IGFTZWxlY3RhYmxlVmFsdWVzID0gW107XG5cdFx0aWYgKCF0aGlzLmdldEJpbmRpbmdDb250ZXh0KCkpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPD0gYUNvbmRpdGlvbnMubGVuZ3RoIC0gMTsgaSsrKSB7XG5cdFx0XHRjb25zdCBvQ29uZGl0aW9uID0gYUNvbmRpdGlvbnNbaV07XG5cdFx0XHQvLyAxLiBnZXQgY29uZGl0aW9ucyB3aXRoIEVRIG9wZXJhdG9yIChzaW5jZSB2aXN1YWwgZmlsdGVyIGNhbiBvbmx5IGRlYWwgd2l0aCBFUSBvcGVyYXRvcnMpIGFuZCBnZXQgdGhlaXIgdmFsdWVzXG5cdFx0XHRpZiAob0NvbmRpdGlvbi5vcGVyYXRvciA9PT0gXCJFUVwiKSB7XG5cdFx0XHRcdGFTZWxlY3RhYmxlVmFsdWVzLnB1c2gob0NvbmRpdGlvbi52YWx1ZXNbMF0pO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIGFjY2VzcyB0aGUgaW50ZXJhY3RpdmUgY2hhcnQgZnJvbSB0aGUgY29udHJvbC5cblx0XHRjb25zdCBvSW50ZXJhY3RpdmVDaGFydCA9IHRoaXMuZ2V0UGFyZW50KCkgYXMgQ29udHJvbDtcblx0XHRjb25zdCBzRGltZW5zaW9uID0gb0ludGVyYWN0aXZlQ2hhcnQuZGF0YShcImRpbWVuc2lvblwiKTtcblx0XHRjb25zdCBzRGltZW5zaW9uVHlwZSA9IG9JbnRlcmFjdGl2ZUNoYXJ0LmRhdGEoXCJkaW1lbnNpb25UeXBlXCIpO1xuXHRcdGxldCBzRGltZW5zaW9uVmFsdWUgPSB0aGlzLmdldEJpbmRpbmdDb250ZXh0KCk/LmdldE9iamVjdChzRGltZW5zaW9uKTtcblx0XHRpZiAoc0RpbWVuc2lvblR5cGUgPT09IFwiRWRtLkRhdGVUaW1lT2Zmc2V0XCIpIHtcblx0XHRcdHNEaW1lbnNpb25WYWx1ZSA9IFZpc3VhbEZpbHRlclV0aWxzLl9wYXJzZURhdGVUaW1lKHNEaW1lbnNpb25WYWx1ZSkgYXMgdW5rbm93bjtcblx0XHR9XG5cdFx0aWYgKG9JbnRlcmFjdGl2ZUNoYXJ0LmRhdGEoXCJtdWx0aXBsZVNlbGVjdGlvbkFsbG93ZWRcIikgPT09IGZhbHNlICYmIGFTZWxlY3RhYmxlVmFsdWVzLmxlbmd0aCA+IDEpIHtcblx0XHRcdGFTZWxlY3RhYmxlVmFsdWVzID0gW2FTZWxlY3RhYmxlVmFsdWVzWzBdXTtcblx0XHR9XG5cdFx0cmV0dXJuIGFTZWxlY3RhYmxlVmFsdWVzLmluY2x1ZGVzKHNEaW1lbnNpb25WYWx1ZSk7XG5cdH0sXG5cdC8vIFRISVMgSVMgQSBGT1JNQVRURVJcblx0Z2V0RmlsdGVyc0Zyb21Db25kaXRpb25zKHRoaXM6IE1hbmFnZWRPYmplY3QsIC4uLmFBcmd1bWVudHM6IENvbmRpdGlvbk9iamVjdFtdW10pOiBGaWx0ZXJbXSB8IHVuZGVmaW5lZCB7XG5cdFx0Y29uc3Qgb0ludGVyYWN0aXZlQ2hhcnQgPSB0aGlzLmdldFBhcmVudCgpIGFzIENvbnRyb2w7XG5cdFx0Y29uc3Qgb0ZpbHRlckJhciA9IG9JbnRlcmFjdGl2ZUNoYXJ0LmdldFBhcmVudCgpPy5nZXRQYXJlbnQoKT8uZ2V0UGFyZW50KCk/LmdldFBhcmVudCgpPy5nZXRQYXJlbnQoKSBhcyBJRmlsdGVyQ29udHJvbDtcblx0XHRjb25zdCBhSW5QYXJhbWV0ZXJzID0gb0ludGVyYWN0aXZlQ2hhcnQuZGF0YShcImluUGFyYW1ldGVyc1wiKS5jdXN0b21EYXRhO1xuXHRcdGNvbnN0IGJJc0RyYWZ0U3VwcG9ydGVkID0gb0ludGVyYWN0aXZlQ2hhcnQuZGF0YShcImRyYWZ0U3VwcG9ydGVkXCIpID09PSB0cnVlO1xuXHRcdGNvbnN0IGFQcm9wZXJ0eUluZm9TZXQgPSBGaWx0ZXJVdGlscy5nZXRGaWx0ZXJQcm9wZXJ0eUluZm8ob0ZpbHRlckJhcikgYXMgUHJvcGVydHlJbmZvW107XG5cdFx0Y29uc3QgbUNvbmRpdGlvbnM6IFJlY29yZDxzdHJpbmcsIENvbmRpdGlvbk9iamVjdFtdPiA9IHt9O1xuXHRcdGNvbnN0IGFWYWx1ZUxpc3RQcm9wZXJ0eUluZm9TZXQ6IHVua25vd25bXSA9IFtdO1xuXHRcdGxldCBvRmlsdGVycztcblx0XHRsZXQgYUZpbHRlcnM6IEZpbHRlcltdID0gW107XG5cdFx0Y29uc3QgYVBhcmFtZXRlcnMgPSBvSW50ZXJhY3RpdmVDaGFydC5kYXRhKFwicGFyYW1ldGVyc1wiKSBhcyBzdHJpbmdbXTtcblx0XHRjb25zdCBvU2VsZWN0aW9uVmFyaWFudEFubm90YXRpb24gPSBvSW50ZXJhY3RpdmVDaGFydC5kYXRhKFwic2VsZWN0aW9uVmFyaWFudEFubm90YXRpb25cIikgYXNcblx0XHRcdHwgTWV0YU1vZGVsVHlwZTxTZWxlY3Rpb25WYXJpYW50VHlwZT5cblx0XHRcdHwgU2VsZWN0aW9uVmFyaWFudFR5cGU7XG5cdFx0Y29uc3Qgb0ludGVyYWN0aXZlQ2hhcnRMaXN0QmluZGluZyA9XG5cdFx0XHRvSW50ZXJhY3RpdmVDaGFydC5nZXRCaW5kaW5nKFwiYmFyc1wiKSB8fCBvSW50ZXJhY3RpdmVDaGFydC5nZXRCaW5kaW5nKFwicG9pbnRzXCIpIHx8IG9JbnRlcmFjdGl2ZUNoYXJ0LmdldEJpbmRpbmcoXCJzZWdtZW50c1wiKTtcblx0XHRjb25zdCBzUGF0aCA9IG9JbnRlcmFjdGl2ZUNoYXJ0TGlzdEJpbmRpbmchLmdldFBhdGgoKTtcblx0XHRjb25zdCBvTWV0YU1vZGVsID0gKG9JbnRlcmFjdGl2ZUNoYXJ0LmdldE1vZGVsKCkgYXMgT0RhdGFNb2RlbCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0Y29uc3Qgc0VudGl0eVNldFBhdGggPSBvSW50ZXJhY3RpdmVDaGFydExpc3RCaW5kaW5nIS5nZXRQYXRoKCk7XG5cdFx0Y29uc3QgZmlsdGVyQ29uZGl0aW9ucyA9IGdldEZpbHRlcnNDb25kaXRpb25zRnJvbVNlbGVjdGlvblZhcmlhbnQoXG5cdFx0XHRzRW50aXR5U2V0UGF0aCxcblx0XHRcdG9NZXRhTW9kZWwsXG5cdFx0XHRvU2VsZWN0aW9uVmFyaWFudEFubm90YXRpb24sXG5cdFx0XHRWaXN1YWxGaWx0ZXJVdGlscy5nZXRDdXN0b21Db25kaXRpb25zLmJpbmQoVmlzdWFsRmlsdGVyVXRpbHMpXG5cdFx0KTtcblx0XHRmb3IgKGNvbnN0IGkgaW4gYVByb3BlcnR5SW5mb1NldCkge1xuXHRcdFx0YVByb3BlcnR5SW5mb1NldFtpXS50eXBlQ29uZmlnID0gVHlwZU1hcC5nZXRUeXBlQ29uZmlnKGFQcm9wZXJ0eUluZm9TZXRbaV0uZGF0YVR5cGUsIHt9LCB7fSk7XG5cdFx0fVxuXHRcdGNvbnN0IG9TZWxlY3Rpb25WYXJpYW50Q29uZGl0aW9ucyA9IFZpc3VhbEZpbHRlclV0aWxzLmNvbnZlcnRGaWx0ZXJDb25kaW9ucyhmaWx0ZXJDb25kaXRpb25zKTtcblx0XHQvLyBhSW5QYXJhbWV0ZXJzIGFuZCB0aGUgYmluZGluZ3MgdG8gaW4gcGFyYW1ldGVycyBhcmUgaW4gdGhlIHNhbWUgb3JkZXIgc28gd2UgY2FuIHJlbHkgb24gaXQgdG8gY3JlYXRlIG91ciBjb25kaXRpb25zXG5cdFx0T2JqZWN0LmtleXMob1NlbGVjdGlvblZhcmlhbnRDb25kaXRpb25zKS5mb3JFYWNoKGZ1bmN0aW9uIChzS2V5OiBzdHJpbmcpIHtcblx0XHRcdG1Db25kaXRpb25zW3NLZXldID0gb1NlbGVjdGlvblZhcmlhbnRDb25kaXRpb25zW3NLZXldO1xuXHRcdFx0Ly9mZXRjaCBsb2NhbERhdGFQcm9wZXJ0eSBpZiBzZWxlY3Rpb24gdmFyaWFudCBrZXkgaXMgYmFzZWQgb24gdmF1ZSBsaXN0IHByb3BlcnR5XG5cdFx0XHRjb25zdCBpblBhcmFtZXRlckZvcktleSA9IGFJblBhcmFtZXRlcnMuZmluZChmdW5jdGlvbiAoaW5QYXJhbWV0ZXI6IHsgdmFsdWVMaXN0UHJvcGVydHk6IHN0cmluZyB9KSB7XG5cdFx0XHRcdHJldHVybiBpblBhcmFtZXRlci52YWx1ZUxpc3RQcm9wZXJ0eSA9PT0gc0tleTtcblx0XHRcdH0pO1xuXHRcdFx0Y29uc3QgbG9jYWxEYXRhUHJvcGVydHkgPSBpblBhcmFtZXRlckZvcktleSA/IGluUGFyYW1ldGVyRm9yS2V5LmxvY2FsRGF0YVByb3BlcnR5IDogc0tleTtcblx0XHRcdGlmICghYVBhcmFtZXRlcnMgfHwgKGFQYXJhbWV0ZXJzICYmICFhUGFyYW1ldGVycy5pbmNsdWRlcyhzS2V5KSkpIHtcblx0XHRcdFx0Zm9yIChjb25zdCBpIGluIGFQcm9wZXJ0eUluZm9TZXQpIHtcblx0XHRcdFx0XHRjb25zdCBwcm9wZXJ0eUluZm9TZXQgPSBhUHJvcGVydHlJbmZvU2V0W2ldO1xuXHRcdFx0XHRcdGlmIChsb2NhbERhdGFQcm9wZXJ0eSA9PT0gcHJvcGVydHlJbmZvU2V0Lm5hbWUpIHtcblx0XHRcdFx0XHRcdGlmIChwcm9wZXJ0eUluZm9TZXQ/LnR5cGVDb25maWc/LmJhc2VUeXBlID09PSBcIkRhdGVUaW1lXCIpIHtcblx0XHRcdFx0XHRcdFx0aWYgKG1Db25kaXRpb25zW3NLZXldKSB7XG5cdFx0XHRcdFx0XHRcdFx0bUNvbmRpdGlvbnNbc0tleV0uZm9yRWFjaChmdW5jdGlvbiAoY29uZGl0aW9uKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRjb25kaXRpb24udmFsdWVzWzBdID0gVmlzdWFsRmlsdGVyVXRpbHMuX2Zvcm1hdERhdGVUaW1lKGNvbmRpdGlvbi52YWx1ZXNbMF0pO1xuXHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRhVmFsdWVMaXN0UHJvcGVydHlJbmZvU2V0LnB1c2goe1xuXHRcdFx0XHRcdFx0XHRuYW1lOiBzS2V5LFxuXHRcdFx0XHRcdFx0XHR0eXBlQ29uZmlnOiBwcm9wZXJ0eUluZm9TZXQudHlwZUNvbmZpZ1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0YUluUGFyYW1ldGVycy5mb3JFYWNoKGZ1bmN0aW9uIChvSW5QYXJhbWV0ZXI6IHsgdmFsdWVMaXN0UHJvcGVydHk6IHN0cmluZzsgbG9jYWxEYXRhUHJvcGVydHk6IHN0cmluZyB9LCBpbmRleDogbnVtYmVyKSB7XG5cdFx0XHRpZiAoYUFyZ3VtZW50c1tpbmRleF0ubGVuZ3RoID4gMCkge1xuXHRcdFx0XHQvLyBzdG9yZSBjb25kaXRpb25zIHdpdGggdmFsdWUgbGlzdCBwcm9wZXJ0eSBzaW5jZSB3ZSBhcmUgZmlsdGVyaW5nIG9uIHRoZSB2YWx1ZSBsaXN0IGNvbGxlY3Rpb24gcGF0aFxuXHRcdFx0XHRtQ29uZGl0aW9uc1tvSW5QYXJhbWV0ZXIudmFsdWVMaXN0UHJvcGVydHldID0gYUFyZ3VtZW50c1tpbmRleF07XG5cdFx0XHRcdGlmICghYVBhcmFtZXRlcnMgfHwgKGFQYXJhbWV0ZXJzICYmICFhUGFyYW1ldGVycy5pbmNsdWRlcyhvSW5QYXJhbWV0ZXIudmFsdWVMaXN0UHJvcGVydHkpKSkge1xuXHRcdFx0XHRcdC8vIGFQcm9wZXJ0eUluZm9TZXQgaXMgbGlzdCBvZiBwcm9wZXJ0aWVzIGZyb20gdGhlIGZpbHRlciBiYXIgYnV0IHdlIG5lZWQgdG8gY3JlYXRlIGNvbmRpdGlvbnMgZm9yIHRoZSB2YWx1ZSBsaXN0XG5cdFx0XHRcdFx0Ly8gd2hpY2ggY291bGQgaGF2ZSBhIGRpZmZlcmVudCBjb2xsZWN0aW9uUGF0aC5cblx0XHRcdFx0XHQvLyBPbmx5IHR5cGVDb25maWcgZnJvbSBhUHJvcGVydHlJbmZvU2V0IGlzIHJlcXVpcmVkIGZvciBnZXR0aW5nIHRoZSBjb252ZXJ0ZWQgZmlsdGVycyBmcm9tIGNvbmRpdGlvbnNcblx0XHRcdFx0XHQvLyBzbyB3ZSB1cGRhdGUgYVByb3BlcnR5SW5mb1NldCB0byBoYXZlIHRoZSB2YWx1ZUxpc3RQcm9wZXJ0aWVzIG9ubHlcblx0XHRcdFx0XHQvLyBUaGlzIHdheSBjb25kaXRpb25zIHdpbGwgYmUgY29udmVydGVkIHRvIHNhcC51aS5tb2RlbC5GaWx0ZXIgZm9yIHRoZSB2YWx1ZSBsaXN0XG5cdFx0XHRcdFx0Ly8gVGhpcyB3b3JrcyBiZWNhdXNlIGZvciBpbiBwYXJhbWV0ZXIgbWFwcGluZyB0aGUgcHJvcGVydHkgZnJvbSB0aGUgbWFpbiBlbnRpdHkgdHlwZSBzaG91bGQgYmUgb2YgdGhlIHNhbWUgdHlwZSBhcyB0aGUgdmFsdWUgbGlzdCBlbnRpdHkgdHlwZVxuXHRcdFx0XHRcdC8vIFRPRE86IEZvbGxvdyB1cCB3aXRoIE1EQyB0byBjaGVjayBpZiB0aGV5IGNhbiBwcm92aWRlIGEgY2xlYW4gYXBpIHRvIGNvbnZlcnQgY29uZGl0aW9ucyBpbnRvIGZpbHRlcnNcblx0XHRcdFx0XHRmb3IgKGNvbnN0IGkgaW4gYVByb3BlcnR5SW5mb1NldCkge1xuXHRcdFx0XHRcdFx0Ly8gc3RvcmUgY29uZGl0aW9ucyB3aXRoIHZhbHVlIGxpc3QgcHJvcGVydHkgc2luY2Ugd2UgYXJlIGZpbHRlcmluZyBvbiB0aGUgdmFsdWUgbGlzdCBjb2xsZWN0aW9uIHBhdGhcblx0XHRcdFx0XHRcdGNvbnN0IHByb3BlcnR5SW5mb1NldCA9IGFQcm9wZXJ0eUluZm9TZXRbaV07XG5cdFx0XHRcdFx0XHRpZiAocHJvcGVydHlJbmZvU2V0Lm5hbWUgPT09IG9JblBhcmFtZXRlci5sb2NhbERhdGFQcm9wZXJ0eSkge1xuXHRcdFx0XHRcdFx0XHRpZiAocHJvcGVydHlJbmZvU2V0Py50eXBlQ29uZmlnPy5iYXNlVHlwZSA9PT0gXCJEYXRlVGltZVwiKSB7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKG1Db25kaXRpb25zW29JblBhcmFtZXRlci52YWx1ZUxpc3RQcm9wZXJ0eV0pIHtcblx0XHRcdFx0XHRcdFx0XHRcdG1Db25kaXRpb25zW29JblBhcmFtZXRlci52YWx1ZUxpc3RQcm9wZXJ0eV0uZm9yRWFjaChmdW5jdGlvbiAoY29uZGl0aW9uKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGNvbmRpdGlvbi52YWx1ZXNbMF0gPSBWaXN1YWxGaWx0ZXJVdGlscy5fZm9ybWF0RGF0ZVRpbWUoY29uZGl0aW9uLnZhbHVlc1swXSk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0YVZhbHVlTGlzdFByb3BlcnR5SW5mb1NldC5wdXNoKHtcblx0XHRcdFx0XHRcdFx0XHRuYW1lOiBvSW5QYXJhbWV0ZXIudmFsdWVMaXN0UHJvcGVydHksXG5cdFx0XHRcdFx0XHRcdFx0dHlwZUNvbmZpZzogcHJvcGVydHlJbmZvU2V0LnR5cGVDb25maWdcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHRjb25zdCBvSW50ZXJuYWxNb2RlbENvbnRleHQgPSBvSW50ZXJhY3RpdmVDaGFydC5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0O1xuXHRcdGNvbnN0IHNJbmZvUGF0aCA9IG9JbnRlcmFjdGl2ZUNoYXJ0LmRhdGEoXCJpbmZvUGF0aFwiKTtcblx0XHRsZXQgYkVuYWJsZUJpbmRpbmc7XG5cdFx0Y29uc3Qgb1Jlc291cmNlQnVuZGxlID0gTGlicmFyeS5nZXRSZXNvdXJjZUJ1bmRsZUZvcihcInNhcC5mZS5tYWNyb3NcIikhO1xuXHRcdGNvbnN0IGFSZXF1aXJlZFByb3BlcnRpZXMgPSBDb21tb25IZWxwZXIucGFyc2VDdXN0b21EYXRhKG9JbnRlcmFjdGl2ZUNoYXJ0LmRhdGEoXCJyZXF1aXJlZFByb3BlcnRpZXNcIikpIGFzIHN0cmluZ1tdO1xuXHRcdGlmIChhUmVxdWlyZWRQcm9wZXJ0aWVzLmxlbmd0aCkge1xuXHRcdFx0Y29uc3QgYUNvbmRpdGlvbnMgPSBPYmplY3Qua2V5cyhtQ29uZGl0aW9ucykgfHwgW107XG5cdFx0XHRjb25zdCBhTm90TWF0Y2hlZENvbmRpdGlvbnM6IHN0cmluZ1tdID0gW107XG5cdFx0XHRhUmVxdWlyZWRQcm9wZXJ0aWVzLmZvckVhY2goZnVuY3Rpb24gKHJlcXVpcmVkUHJvcGVydHlQYXRoOiBzdHJpbmcpIHtcblx0XHRcdFx0aWYgKCFhQ29uZGl0aW9ucy5pbmNsdWRlcyhyZXF1aXJlZFByb3BlcnR5UGF0aCkpIHtcblx0XHRcdFx0XHRhTm90TWF0Y2hlZENvbmRpdGlvbnMucHVzaChyZXF1aXJlZFByb3BlcnR5UGF0aCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdFx0aWYgKCFhTm90TWF0Y2hlZENvbmRpdGlvbnMubGVuZ3RoKSB7XG5cdFx0XHRcdGJFbmFibGVCaW5kaW5nID0gb0ludGVybmFsTW9kZWxDb250ZXh0LmdldFByb3BlcnR5KGAke3NJbmZvUGF0aH0vc2hvd0Vycm9yYCk7XG5cdFx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShzSW5mb1BhdGgsIHtcblx0XHRcdFx0XHRlcnJvck1lc3NhZ2VUaXRsZTogXCJcIixcblx0XHRcdFx0XHRlcnJvck1lc3NhZ2U6IFwiXCIsXG5cdFx0XHRcdFx0c2hvd0Vycm9yOiBmYWxzZVxuXHRcdFx0XHR9KTtcblx0XHRcdH0gZWxzZSBpZiAoYU5vdE1hdGNoZWRDb25kaXRpb25zLmxlbmd0aCA+IDEpIHtcblx0XHRcdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KHNJbmZvUGF0aCwge1xuXHRcdFx0XHRcdGVycm9yTWVzc2FnZVRpdGxlOiBvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIk1fVklTVUFMX0ZJTFRFUlNfRVJST1JfTUVTU0FHRV9USVRMRVwiKSxcblx0XHRcdFx0XHRlcnJvck1lc3NhZ2U6IG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiTV9WSVNVQUxfRklMVEVSU19QUk9WSURFX0ZJTFRFUl9WQUxfTVVMVElQTEVWRlwiKSxcblx0XHRcdFx0XHRzaG93RXJyb3I6IHRydWVcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IHNMYWJlbCA9XG5cdFx0XHRcdFx0b01ldGFNb2RlbC5nZXRPYmplY3QoYCR7c0VudGl0eVNldFBhdGh9LyR7YU5vdE1hdGNoZWRDb25kaXRpb25zWzBdfUBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuTGFiZWxgKSB8fFxuXHRcdFx0XHRcdGFOb3RNYXRjaGVkQ29uZGl0aW9uc1swXTtcblx0XHRcdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KHNJbmZvUGF0aCwge1xuXHRcdFx0XHRcdGVycm9yTWVzc2FnZVRpdGxlOiBvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIk1fVklTVUFMX0ZJTFRFUlNfRVJST1JfTUVTU0FHRV9USVRMRVwiKSxcblx0XHRcdFx0XHRlcnJvck1lc3NhZ2U6IG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiTV9WSVNVQUxfRklMVEVSU19QUk9WSURFX0ZJTFRFUl9WQUxfU0lOR0xFVkZcIiwgc0xhYmVsKSxcblx0XHRcdFx0XHRzaG93RXJyb3I6IHRydWVcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0YkVuYWJsZUJpbmRpbmcgPSBvSW50ZXJuYWxNb2RlbENvbnRleHQuZ2V0UHJvcGVydHkoYCR7c0luZm9QYXRofS9zaG93RXJyb3JgKTtcblx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShzSW5mb1BhdGgsIHsgZXJyb3JNZXNzYWdlVGl0bGU6IFwiXCIsIGVycm9yTWVzc2FnZTogXCJcIiwgc2hvd0Vycm9yOiBmYWxzZSB9KTtcblx0XHR9XG5cblx0XHRjb25zdCBzRmlsdGVyRW50aXR5TmFtZSA9IG9GaWx0ZXJCYXIuZGF0YShcImVudGl0eVR5cGVcIikuc3BsaXQoXCIvXCIpWzFdO1xuXHRcdGNvbnN0IHNDaGFydEVudGl0eU5hbWUgPSBzUGF0aC5zcGxpdChcIi9cIilbMV0uc3BsaXQoXCIoXCIpWzBdO1xuXHRcdGlmIChhUGFyYW1ldGVycyAmJiBhUGFyYW1ldGVycy5sZW5ndGggJiYgc0ZpbHRlckVudGl0eU5hbWUgPT09IHNDaGFydEVudGl0eU5hbWUpIHtcblx0XHRcdGNvbnN0IHNCaW5kaW5nUGF0aCA9IGJFbmFibGVCaW5kaW5nXG5cdFx0XHRcdD8gRmlsdGVyVXRpbHMuZ2V0QmluZGluZ1BhdGhGb3JQYXJhbWV0ZXJzKG9GaWx0ZXJCYXIsIG1Db25kaXRpb25zLCBhUHJvcGVydHlJbmZvU2V0LCBhUGFyYW1ldGVycylcblx0XHRcdFx0OiB1bmRlZmluZWQ7XG5cblx0XHRcdGlmIChzQmluZGluZ1BhdGgpIHtcblx0XHRcdFx0KG9JbnRlcmFjdGl2ZUNoYXJ0TGlzdEJpbmRpbmcgYXMgeyBzUGF0aD86IHN0cmluZyB9KS5zUGF0aCA9IHNCaW5kaW5nUGF0aDtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoYVBhcmFtZXRlcnMgJiYgYVBhcmFtZXRlcnMubGVuZ3RoKSB7XG5cdFx0XHQvL1JlbW92ZSBwYXJhbWV0ZXJzIGZyb20gbUNvbmRpdGlvbnMgc2luY2UgaXQgc2hvdWxkIG5vdCBiZSBhIHBhcnQgb2YgJGZpbHRlclxuXHRcdFx0YVBhcmFtZXRlcnMuZm9yRWFjaChmdW5jdGlvbiAocGFyYW1ldGVyOiBzdHJpbmcpIHtcblx0XHRcdFx0aWYgKG1Db25kaXRpb25zW3BhcmFtZXRlcl0pIHtcblx0XHRcdFx0XHRkZWxldGUgbUNvbmRpdGlvbnNbcGFyYW1ldGVyXTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0Ly8gT24gSW5pdGlhbExvYWQgd2hlbiBpbml0aWFsbGF5b3V0IGlzIHZpc3VhbCwgYVByb3BlcnR5SW5mb1NldCBpcyBhbHdheXMgZW1wdHkgYW5kIHdlIGNhbm5vdCBnZXQgZmlsdGVycyBmcm9tIE1EQ0ZpbHRlclV0aWwuXG5cdFx0Ly8gQWxzbyB3aGVuIFNWUXVhbGlmaWVyIGlzIHRoZXJlIHRoZW4gd2Ugc2hvdWxkIG5vdCBjaGFuZ2UgdGhlIGxpc3RiaW5kaW5nIGZpbHRlcnMgdG8gZW1wdHkgYXMgd2UgYXJlIG5vdCBnZXR0aW5nIGZpbHRlcnMgZnJvbSBNRENGaWx0ZXJVdGlsIGJ1dFxuXHRcdC8vIGluc3RlYWQgd2UgbmVlZCB0byBub3QgY2FsbCBsaXN0YmluZGluZy5maWx0ZXIgYW5kIHVzZSB0aGUgdGVtcGxhdGUgdGltZSBiaW5kaW5nIGl0c2VsZi5cblx0XHRpZiAoT2JqZWN0LmtleXMobUNvbmRpdGlvbnMpLmxlbmd0aCA+IDAgJiYgYVZhbHVlTGlzdFByb3BlcnR5SW5mb1NldC5sZW5ndGgpIHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdG9GaWx0ZXJzID0gKE1kY0ZpbHRlclV0aWwuZ2V0RmlsdGVySW5mbyhvRmlsdGVyQmFyLCBtQ29uZGl0aW9ucywgYVZhbHVlTGlzdFByb3BlcnR5SW5mb1NldCwgW10pIGFzIHsgZmlsdGVyczogRmlsdGVyIH0pXG5cdFx0XHRcdFx0LmZpbHRlcnM7XG5cdFx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRcdExvZy5kZWJ1ZyhcIlZpc3VhbEZpbHRlcjogRXJyb3Igd2hpbGUgZ2V0dGluZyBmaWx0ZXJzIGZyb20gTURDRmlsdGVyVXRpbFwiKTtcblx0XHRcdH1cblx0XHRcdGlmIChvRmlsdGVycykge1xuXHRcdFx0XHRpZiAoIW9GaWx0ZXJzLmdldEZpbHRlcnMoKSkge1xuXHRcdFx0XHRcdGFGaWx0ZXJzLnB1c2gob0ZpbHRlcnMpO1xuXHRcdFx0XHR9IGVsc2UgaWYgKG9GaWx0ZXJzLmdldEZpbHRlcnMoKSkge1xuXHRcdFx0XHRcdGFGaWx0ZXJzID0gb0ZpbHRlcnMuZ2V0RmlsdGVycygpITtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAoYklzRHJhZnRTdXBwb3J0ZWQpIHtcblx0XHRcdGFGaWx0ZXJzLnB1c2gobmV3IEZpbHRlcihcIklzQWN0aXZlRW50aXR5XCIsIEZpbHRlck9wZXJhdG9yLkVRLCB0cnVlKSk7XG5cdFx0fVxuXHRcdGlmIChhRmlsdGVycyAmJiBhRmlsdGVycy5sZW5ndGggPiAwKSB7XG5cdFx0XHQob0ludGVyYWN0aXZlQ2hhcnRMaXN0QmluZGluZyBhcyBPRGF0YUxpc3RCaW5kaW5nKT8uZmlsdGVyKGFGaWx0ZXJzKTtcblx0XHR9IGVsc2UgaWYgKCFPYmplY3Qua2V5cyhtQ29uZGl0aW9ucykubGVuZ3RoKSB7XG5cdFx0XHQob0ludGVyYWN0aXZlQ2hhcnRMaXN0QmluZGluZyBhcyBPRGF0YUxpc3RCaW5kaW5nKT8uZmlsdGVyKCk7XG5cdFx0fVxuXHRcdC8vIHVwZGF0ZSB0aGUgaW50ZXJhY3RpdmUgY2hhcnQgYmluZGluZ1xuXHRcdGlmIChiRW5hYmxlQmluZGluZyAmJiAob0ludGVyYWN0aXZlQ2hhcnRMaXN0QmluZGluZyBhcyBPRGF0YUxpc3RCaW5kaW5nKT8uaXNTdXNwZW5kZWQoKSkge1xuXHRcdFx0KG9JbnRlcmFjdGl2ZUNoYXJ0TGlzdEJpbmRpbmcgYXMgT0RhdGFMaXN0QmluZGluZyk/LnJlc3VtZSgpO1xuXHRcdH1cblx0XHRyZXR1cm4gYUZpbHRlcnM7XG5cdH0sXG5cdGdldEZpbHRlckNvdW50cyh0aGlzOiBDb250cm9sLCBvQ29uZGl0aW9uczogQ29uZGl0aW9uT2JqZWN0W10pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRcdGlmICh0aGlzLmRhdGEoXCJtdWx0aXBsZVNlbGVjdGlvbkFsbG93ZWRcIikgPT09IGZhbHNlICYmIG9Db25kaXRpb25zLmxlbmd0aCA+IDApIHtcblx0XHRcdHJldHVybiBgKDEpYDtcblx0XHR9XG5cdFx0aWYgKG9Db25kaXRpb25zLmxlbmd0aCA+IDApIHtcblx0XHRcdHJldHVybiBgKCR7b0NvbmRpdGlvbnMubGVuZ3RofSlgO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblx0fSxcblxuXHRzY2FsZVZpc3VhbEZpbHRlclZhbHVlKFxuXHRcdG9WYWx1ZTogc3RyaW5nLFxuXHRcdHNjYWxlRmFjdG9yOiBudW1iZXIsXG5cdFx0bnVtYmVyT2ZGcmFjdGlvbmFsRGlnaXRzOiBudW1iZXIsXG5cdFx0Y3VycmVuY3k6IHN0cmluZyxcblx0XHRvUmF3VmFsdWU6IHN0cmluZyB8IG51bWJlclxuXHQpOiBzdHJpbmcge1xuXHRcdC8vIFNjYWxlRmFjdG9yIGlmIGRlZmluZWQgaXMgcHJpb3JpdHkgZm9yIGZvcm1hdHRpbmdcblx0XHRpZiAoc2NhbGVGYWN0b3IpIHtcblx0XHRcdHJldHVybiBWaXN1YWxGaWx0ZXJVdGlscy5nZXRGb3JtYXR0ZWROdW1iZXIob1Jhd1ZhbHVlLCBzY2FsZUZhY3RvciwgbnVtYmVyT2ZGcmFjdGlvbmFsRGlnaXRzKTtcblx0XHRcdC8vIElmIFNjYWxlIEZhY3RvciBpcyBub3QgZGVmaW5lZCwgdXNlIGN1cnJlbmN5IGZvcm1hdHRpbmdcblx0XHR9IGVsc2UgaWYgKGN1cnJlbmN5KSB7XG5cdFx0XHRyZXR1cm4gVmlzdWFsRmlsdGVyVXRpbHMuZ2V0Rm9ybWF0dGVkTnVtYmVyKG9SYXdWYWx1ZSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGN1cnJlbmN5KTtcblx0XHRcdC8vIE5vIFNjYWxlRmFjdG9yIGFuZCBubyBDdXJyZW5jeSwgdXNlIG51bWJlck9mRnJhY3Rpb25hbERpZ2l0cyBkZWZpbmVkIGluIERhdGFQb2ludFxuXHRcdH0gZWxzZSBpZiAobnVtYmVyT2ZGcmFjdGlvbmFsRGlnaXRzID4gMCkge1xuXHRcdFx0Ly8gTnVtYmVyIG9mIGZyYWN0aW9uYWwgZGlnaXRzIHNoYWxsIG5vdCBleGNlZWQgMiwgdW5sZXNzIHJlcXVpcmVkIGJ5IGN1cnJlbmN5XG5cdFx0XHRudW1iZXJPZkZyYWN0aW9uYWxEaWdpdHMgPSBudW1iZXJPZkZyYWN0aW9uYWxEaWdpdHMgPiAyID8gMiA6IG51bWJlck9mRnJhY3Rpb25hbERpZ2l0cztcblx0XHRcdHJldHVybiBWaXN1YWxGaWx0ZXJVdGlscy5nZXRGb3JtYXR0ZWROdW1iZXIob1Jhd1ZhbHVlLCB1bmRlZmluZWQsIG51bWJlck9mRnJhY3Rpb25hbERpZ2l0cyk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBvVmFsdWU7XG5cdFx0fVxuXHR9LFxuXHRmaXJlVmFsdWVIZWxwKG9FdmVudDogVUk1RXZlbnQ8e30sIENvbnRyb2w+KTogdm9pZCB7XG5cdFx0b0V2ZW50LmdldFNvdXJjZSgpLmdldFBhcmVudCgpPy5nZXRQYXJlbnQoKT8uZ2V0UGFyZW50KCk/LmdldFBhcmVudCgpPy5maXJlRXZlbnQoXCJ2YWx1ZUhlbHBSZXF1ZXN0XCIpO1xuXHR9XG59O1xuXG5PYmplY3RQYXRoLnNldChcInNhcC5mZS5tYWNyb3MudmlzdWFsZmlsdGVycy5WaXN1YWxGaWx0ZXJSdW50aW1lXCIsIFZpc3VhbEZpbHRlclJ1bnRpbWUpO1xuXG5leHBvcnQgZGVmYXVsdCBWaXN1YWxGaWx0ZXJSdW50aW1lO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztFQTRCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0EsTUFBTUEsbUJBQW1CLEdBQUc7SUFDM0JDLGdCQUFnQkEsQ0FDZkMsTUFJOEMsRUFDdkM7TUFDUCxNQUFNQyxpQkFBMEIsR0FBSUQs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
309
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJWaXN1YWxGaWx0ZXJSdW50aW1lIiwic2VsZWN0aW9uQ2hhbmdlZCIsIm9FdmVudCIsIm9JbnRlcmFjdGl2ZUNoYXJ0IiwiZ2V0U291cmNlIiwic091dFBhcmFtZXRlciIsImRhdGEiLCJzVmFsdWVMaXN0UHJvcGVydHkiLCJzRGltZW5zaW9uIiwic0RpbWVuc2lvblRleHQiLCJiTXVsdGlwbGVTZWxlY3Rpb25BbGxvd2VkIiwic0RpbWVuc2lvblR5cGUiLCJvU2VsZWN0ZWRBZ2dyZWdhdGlvbiIsImdldFBhcmFtZXRlciIsImJJc0FnZ3JlZ2F0aW9uU2VsZWN0ZWQiLCJvQ29uZGl0aW9uTW9kZWwiLCJnZXRNb2RlbCIsImFDb25kaXRpb25zIiwiZ2V0UHJvcGVydHkiLCJMb2ciLCJlcnJvciIsInNTZWxlY3Rpb25DaGFuZ2VkVmFsdWUiLCJnZXRCaW5kaW5nQ29udGV4dCIsImdldE9iamVjdCIsInNTZWxlY3Rpb25DaGFuZ2VkVmFsdWVUZXh0IiwiU3RyaW5nIiwidW5kZWZpbmVkIiwiVmlzdWFsRmlsdGVyVXRpbHMiLCJfcGFyc2VEYXRlVGltZSIsIm9Db25kaXRpb24iLCJDb25kaXRpb24iLCJjcmVhdGVJdGVtQ29uZGl0aW9uIiwicHVzaCIsImZpbHRlciIsIm9wZXJhdG9yIiwiRGF0ZSIsInBhcnNlIiwidmFsdWVzIiwic2V0UHJvcGVydHkiLCJnZXRBZ2dyZWdhdGlvblNlbGVjdGVkIiwiYVNlbGVjdGFibGVWYWx1ZXMiLCJpIiwibGVuZ3RoIiwiZ2V0UGFyZW50Iiwic0RpbWVuc2lvblZhbHVlIiwiaW5jbHVkZXMiLCJnZXRQYXJlbnRWaXN1YWxGaWx0ZXJDb250cm9sQkIiLCJwb3RlbnRpYWxWaXN1YWxGaWx0ZXIiLCJpc0EiLCJnZXRGaWx0ZXJzRnJvbUNvbmRpdGlvbnMiLCJfbGVuIiwiYXJndW1lbnRzIiwiYUFyZ3VtZW50cyIsIkFycmF5IiwiX2tleSIsIm9GaWx0ZXJCYXIiLCJhSW5QYXJhbWV0ZXJzIiwiY3VzdG9tRGF0YSIsImJJc0RyYWZ0U3VwcG9ydGVkIiwiYVByb3BlcnR5SW5mb1NldCIsIkZpbHRlclV0aWxzIiwiZ2V0RmlsdGVyUHJvcGVydHlJbmZvIiwibUNvbmRpdGlvbnMiLCJhVmFsdWVMaXN0UHJvcGVydHlJbmZvU2V0Iiwib0ZpbHRlcnMiLCJhRmlsdGVycyIsImFQYXJhbWV0ZXJzIiwib1NlbGVjdGlvblZhcmlhbnRBbm5vdGF0aW9uIiwib0ludGVyYWN0aXZlQ2hhcnRMaXN0QmluZGluZyIsImdldEJpbmRpbmciLCJzUGF0aCIsImdldFBhdGgiLCJvTWV0YU1vZGVsIiwiZ2V0TWV0YU1vZGVsIiwic0VudGl0eVNldFBhdGgiLCJmaWx0ZXJDb25kaXRpb25zIiwiZ2V0RmlsdGVyc0NvbmRpdGlvbnNGcm9tU2VsZWN0aW9uVmFyaWFudCIsImdldEN1c3RvbUNvbmRpdGlvbnMiLCJiaW5kIiwidHlwZUNvbmZpZyIsIlR5cGVNYXAiLCJnZXRUeXBlQ29uZmlnIiwiZGF0YVR5cGUiLCJvU2VsZWN0aW9uVmFyaWFudENvbmRpdGlvbnMiLCJjb252ZXJ0RmlsdGVyQ29uZGlvbnMiLCJPYmplY3QiLCJrZXlzIiwiZm9yRWFjaCIsInNLZXkiLCJpblBhcmFtZXRlckZvcktleSIsImZpbmQiLCJpblBhcmFtZXRlciIsInZhbHVlTGlzdFByb3BlcnR5IiwibG9jYWxEYXRhUHJvcGVydHkiLCJwcm9wZXJ0eUluZm9TZXQiLCJuYW1lIiwiYmFzZVR5cGUiLCJjb25kaXRpb24iLCJfZm9ybWF0RGF0ZVRpbWUiLCJvSW5QYXJhbWV0ZXIiLCJpbmRleCIsIm9JbnRlcm5hbE1vZGVsQ29udGV4dCIsInNJbmZvUGF0aCIsImJFbmFibGVCaW5kaW5nIiwib1Jlc291cmNlQnVuZGxlIiwiTGlicmFyeSIsImdldFJlc291cmNlQnVuZGxlRm9yIiwiYVJlcXVpcmVkUHJvcGVydGllcyIsIkNvbW1vbkhlbHBlciIsInBhcnNlQ3VzdG9tRGF0YSIsImFOb3RNYXRjaGVkQ29uZGl0aW9ucyIsInJlcXVpcmVkUHJvcGVydHlQYXRoIiwiZXJyb3JNZXNzYWdlVGl0bGUiLCJlcnJvck1lc3NhZ2UiLCJzaG93RXJyb3IiLCJnZXRUZXh0Iiwic0xhYmVsIiwic0ZpbHRlckVudGl0eU5hbWUiLCJzcGxpdCIsInNDaGFydEVudGl0eU5hbWUiLCJzQmluZGluZ1BhdGgiLCJnZXRCaW5kaW5nUGF0aEZvclBhcmFtZXRlcnMiLCJwYXJhbWV0ZXIiLCJNZGNGaWx0ZXJVdGlsIiwiZ2V0RmlsdGVySW5mbyIsImZpbHRlcnMiLCJlIiwiZGVidWciLCJnZXRGaWx0ZXJzIiwiRmlsdGVyIiwiRmlsdGVyT3BlcmF0b3IiLCJFUSIsInZpc3VhbEZpbHRlckJCIiwiX3NldEludGVybmFsVXBkYXRlUGVuZGluZyIsImdldEZpbHRlckNvdW50cyIsIm9Db25kaXRpb25zIiwic2NhbGVWaXN1YWxGaWx0ZXJWYWx1ZSIsIm9WYWx1ZSIsInNjYWxlRmFjdG9yIiwibnVtYmVyT2ZGcmFjdGlvbmFsRGlnaXRzIiwiY3VycmVuY3kiLCJvUmF3VmFsdWUiLCJnZXRGb3JtYXR0ZWROdW1iZXIiLCJmaXJlVmFsdWVIZWxwIiwiZmlyZUV2ZW50IiwiT2JqZWN0UGF0aCIsInNldCJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiVmlzdWFsRmlsdGVyUnVudGltZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFNlbGVjdGlvblZhcmlhbnRUeXBlIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3ZvY2FidWxhcmllcy9VSVwiO1xuaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgT2JqZWN0UGF0aCBmcm9tIFwic2FwL2Jhc2UvdXRpbC9PYmplY3RQYXRoXCI7XG5pbXBvcnQgdHlwZSB7IEludGVybmFsTW9kZWxDb250ZXh0IH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTW9kZWxIZWxwZXJcIjtcbmltcG9ydCBDb21tb25IZWxwZXIgZnJvbSBcInNhcC9mZS9tYWNyb3MvQ29tbW9uSGVscGVyXCI7XG5pbXBvcnQgVmlzdWFsRmlsdGVyVXRpbHMgZnJvbSBcInNhcC9mZS9tYWNyb3MvY29udHJvbHMvZmlsdGVyYmFyL3V0aWxzL1Zpc3VhbEZpbHRlclV0aWxzXCI7XG5pbXBvcnQgdHlwZSB7IElGaWx0ZXJDb250cm9sIH0gZnJvbSBcInNhcC9mZS9tYWNyb3MvZmlsdGVyL0ZpbHRlclV0aWxzXCI7XG5pbXBvcnQgRmlsdGVyVXRpbHMgZnJvbSBcInNhcC9mZS9tYWNyb3MvZmlsdGVyL0ZpbHRlclV0aWxzXCI7XG5pbXBvcnQgeyBnZXRGaWx0ZXJzQ29uZGl0aW9uc0Zyb21TZWxlY3Rpb25WYXJpYW50IH0gZnJvbSBcInNhcC9mZS9tYWNyb3MvZmlsdGVyQmFyL0ZpbHRlckhlbHBlclwiO1xuaW1wb3J0IHR5cGUgeyBQcm9wZXJ0eUluZm8gfSBmcm9tIFwic2FwL2ZlL21hY3Jvcy9pbnRlcm5hbC9Qcm9wZXJ0eUluZm9cIjtcbmltcG9ydCB0eXBlIFZpc3VhbEZpbHRlckJsb2NrIGZyb20gXCJzYXAvZmUvbWFjcm9zL3Zpc3VhbGZpbHRlcnMvVmlzdWFsRmlsdGVyXCI7XG5pbXBvcnQgdHlwZSB7IEludGVyYWN0aXZlQmFyQ2hhcnQkU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IH0gZnJvbSBcInNhcC9zdWl0ZS91aS9taWNyb2NoYXJ0L0ludGVyYWN0aXZlQmFyQ2hhcnRcIjtcbmltcG9ydCB0eXBlIHsgSW50ZXJhY3RpdmVEb251dENoYXJ0JFNlbGVjdGlvbkNoYW5nZWRFdmVudCB9IGZyb20gXCJzYXAvc3VpdGUvdWkvbWljcm9jaGFydC9JbnRlcmFjdGl2ZURvbnV0Q2hhcnRcIjtcbmltcG9ydCB0eXBlIHsgSW50ZXJhY3RpdmVMaW5lQ2hhcnQkU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IH0gZnJvbSBcInNhcC9zdWl0ZS91aS9taWNyb2NoYXJ0L0ludGVyYWN0aXZlTGluZUNoYXJ0XCI7XG5pbXBvcnQgdHlwZSBVSTVFdmVudCBmcm9tIFwic2FwL3VpL2Jhc2UvRXZlbnRcIjtcbmltcG9ydCB0eXBlIE1hbmFnZWRPYmplY3QgZnJvbSBcInNhcC91aS9iYXNlL01hbmFnZWRPYmplY3RcIjtcbmltcG9ydCB0eXBlIENvbnRyb2wgZnJvbSBcInNhcC91aS9jb3JlL0NvbnRyb2xcIjtcbmltcG9ydCBMaWJyYXJ5IGZyb20gXCJzYXAvdWkvY29yZS9MaWJcIjtcbmltcG9ydCB0eXBlIHsgQ29uZGl0aW9uT2JqZWN0IH0gZnJvbSBcInNhcC91aS9tZGMvY29uZGl0aW9uL0NvbmRpdGlvblwiO1xuaW1wb3J0IENvbmRpdGlvbiBmcm9tIFwic2FwL3VpL21kYy9jb25kaXRpb24vQ29uZGl0aW9uXCI7XG5pbXBvcnQgVHlwZU1hcCBmcm9tIFwic2FwL3VpL21kYy9vZGF0YS92NC9UeXBlTWFwXCI7XG5pbXBvcnQgTWRjRmlsdGVyVXRpbCBmcm9tIFwic2FwL3VpL21kYy91dGlsL0ZpbHRlclV0aWxcIjtcbmltcG9ydCBGaWx0ZXIgZnJvbSBcInNhcC91aS9tb2RlbC9GaWx0ZXJcIjtcbmltcG9ydCBGaWx0ZXJPcGVyYXRvciBmcm9tIFwic2FwL3VpL21vZGVsL0ZpbHRlck9wZXJhdG9yXCI7XG5pbXBvcnQgdHlwZSBKU09OTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9qc29uL0pTT05Nb2RlbFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFMaXN0QmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTGlzdEJpbmRpbmdcIjtcbmltcG9ydCB0eXBlIE9EYXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1vZGVsXCI7XG5pbXBvcnQgdHlwZSB7IE1ldGFNb2RlbFR5cGUgfSBmcm9tIFwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdHlwZXMvbWV0YW1vZGVsX3R5cGVzXCI7XG5cbi8qKlxuICogU3RhdGljIGNsYXNzIHVzZWQgYnkgVmlzdWFsIEZpbHRlciBkdXJpbmcgcnVudGltZVxuICogQHByaXZhdGVcbiAqIEBleHBlcmltZW50YWwgVGhpcyBtb2R1bGUgaXMgb25seSBmb3IgaW50ZXJuYWwvZXhwZXJpbWVudGFsIHVzZSFcbiAqL1xuY29uc3QgVmlzdWFsRmlsdGVyUnVudGltZSA9IHtcblx0c2VsZWN0aW9uQ2hhbmdlZChcblx0XHRvRXZlbnQ6XG5cdFx0XHR8IFVJNUV2ZW50XG5cdFx0XHR8IEludGVyYWN0aXZlQmFyQ2hhcnQkU2VsZWN0aW9uQ2hhbmdlZEV2ZW50XG5cdFx0XHR8IEludGVyYWN0aXZlTGluZUNoYXJ0JFNlbGVjdGlvbkNoYW5nZWRFdmVudFxuXHRcdFx0fCBJbnRlcmFjdGl2ZURvbnV0Q2hhcnQkU2VsZWN0aW9uQ2hhbmdlZEV2ZW50XG5cdCk6IHZvaWQge1xuXHRcdGNvbnN0IG9JbnRlcmFjdGl2ZUNoYXJ0OiBDb250cm9sID0gKG9FdmVudCBhcyBVSTVFdmVudCkuZ2V0U291cmNlKCk7XG5cdFx0Y29uc3Qgc091dFBhcmFtZXRlciA9IG9JbnRlcmFjdGl2ZUNoYXJ0LmRhdGEoXCJvdXRQYXJhbWV0ZXJcIik7XG5cdFx0Y29uc3Qgc1ZhbHVlTGlzdFByb3BlcnR5ID0gb0ludGVyYWN0aXZlQ2hhcnQuZGF0YShcInZhbHVlbGlzdFByb3BlcnR5XCIpO1xuXHRcdGNvbnN0IHNEaW1lbnNpb24gPSBvSW50ZXJhY3RpdmVDaGFydC5kYXRhKFwiZGltZW5zaW9uXCIpO1xuXHRcdGNvbnN0IHNEaW1lbnNpb25UZXh0ID0gb0ludGVyYWN0aXZlQ2hhcnQuZGF0YShcImRpbWVuc2lvblRleHRcIik7XG5cdFx0Y29uc3QgYk11bHRpcGxlU2VsZWN0aW9uQWxsb3dlZCA9IG9JbnRlcmFjdGl2ZUNoYXJ0LmRhdGEoXCJtdWx0aXBsZVNlbGVjdGlvbkFsbG93ZWRcIik7XG5cdFx0Y29uc3Qgc0RpbWVuc2lvblR5cGUgPSBvSW50ZXJhY3RpdmVDaGFydC5kYXRhKFwiZGltZW5zaW9uVHlwZVwiKTtcblx0XHRjb25zdCBvU2VsZWN0ZWRBZ2dyZWdhdGlvbiA9XG5cdFx0XHQob0V2ZW50IGFzIEludGVyYWN0aXZlQmFyQ2hhcnQkU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KS5nZXRQYXJhbWV0ZXIoXCJiYXJcIikgfHxcblx0XHRcdChvRXZlbnQgYXMgSW50ZXJhY3RpdmVMaW5lQ2hhcnQkU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KS5nZXRQYXJhbWV0ZXIoXCJwb2ludFwiKSB8fFxuXHRcdFx0KG9FdmVudCBhcyBJbnRlcmFjdGl2ZURvbnV0Q2hhcnQkU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KS5nZXRQYXJhbWV0ZXIoXCJzZWdtZW50XCIpO1xuXHRcdGNvbnN0IGJJc0FnZ3JlZ2F0aW9uU2VsZWN0ZWQgPSAob0V2ZW50IGFzIEludGVyYWN0aXZlQmFyQ2hhcnQkU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KS5nZXRQYXJhbWV0ZXIoXCJzZWxlY3RlZFwiKTtcblx0XHRjb25zdCBvQ29uZGl0aW9uTW9kZWwgPSBvSW50ZXJhY3RpdmVDaGFydC5nZXRNb2RlbChcIiRmaWVsZFwiKSBhcyBKU09OTW9kZWw7XG5cdFx0bGV0IGFDb25kaXRpb25zID0gb0NvbmRpdGlvbk1vZGVsLmdldFByb3BlcnR5KFwiL2NvbmRpdGlvbnNcIik7XG5cblx0XHRpZiAoIXNPdXRQYXJhbWV0ZXIgfHwgc1ZhbHVlTGlzdFByb3BlcnR5ICE9PSBzRGltZW5zaW9uKSB7XG5cdFx0XHRMb2cuZXJyb3IoXCJWaXN1YWxGaWx0ZXI6IENhbm5vdCBzeW5jIHZhbHVlcyB3aXRoIHJlZ3VsYXIgZmlsdGVyIGFzIG91dCBwYXJhbWV0ZXIgaXMgbm90IGNvbmZpZ3VyZWQgcHJvcGVybHkhXCIpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRsZXQgc1NlbGVjdGlvbkNoYW5nZWRWYWx1ZSA9IG9TZWxlY3RlZEFnZ3JlZ2F0aW9uPy5nZXRCaW5kaW5nQ29udGV4dCgpPy5nZXRPYmplY3Qoc1ZhbHVlTGlzdFByb3BlcnR5KTtcblx0XHRcdGlmIChzU2VsZWN0aW9uQ2hhbmdlZFZhbHVlKSB7XG5cdFx0XHRcdGxldCBzU2VsZWN0aW9uQ2hhbmdlZFZhbHVlVGV4dCA9IG9TZWxlY3RlZEFnZ3JlZ2F0aW9uPy5nZXRCaW5kaW5nQ29udGV4dCgpPy5nZXRPYmplY3Qoc0RpbWVuc2lvblRleHQpO1xuXHRcdFx0XHRpZiAodHlwZW9mIHNTZWxlY3Rpb25DaGFuZ2VkVmFsdWVUZXh0ICE9PSBcInN0cmluZ1wiICYmICEoc1NlbGVjdGlvbkNoYW5nZWRWYWx1ZVRleHQgaW5zdGFuY2VvZiBTdHJpbmcpKSB7XG5cdFx0XHRcdFx0c1NlbGVjdGlvbkNoYW5nZWRWYWx1ZVRleHQgPSB1bmRlZmluZWQ7XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly8gaWYgc2VsZWN0aW9uIGhhcyBiZWVuIGRvbmUgb24gdGhlIGFnZ3JlZ2F0aW9uIHRoZW4gYWRkIHRvIGNvbmRpdGlvbnNcblx0XHRcdFx0aWYgKGJJc0FnZ3JlZ2F0aW9uU2VsZWN0ZWQpIHtcblx0XHRcdFx0XHRpZiAoYk11bHRpcGxlU2VsZWN0aW9uQWxsb3dlZCA9PT0gZmFsc2UpIHtcblx0XHRcdFx0XHRcdGFDb25kaXRpb25zID0gW107XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChzRGltZW5zaW9uVHlwZSA9PT0gXCJFZG0uRGF0ZVRpbWVPZmZzZXRcIikge1xuXHRcdFx0XHRcdFx0c1NlbGVjdGlvbkNoYW5nZWRWYWx1ZSA9IFZpc3VhbEZpbHRlclV0aWxzLl9wYXJzZURhdGVUaW1lKHNTZWxlY3Rpb25DaGFuZ2VkVmFsdWUpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRjb25zdCBvQ29uZGl0aW9uID0gQ29uZGl0aW9uLmNyZWF0ZUl0ZW1Db25kaXRpb24oXG5cdFx0XHRcdFx0XHRzU2VsZWN0aW9uQ2hhbmdlZFZhbHVlLFxuXHRcdFx0XHRcdFx0c1NlbGVjdGlvbkNoYW5nZWRWYWx1ZVRleHQgfHwgdW5kZWZpbmVkLFxuXHRcdFx0XHRcdFx0e30sXG5cdFx0XHRcdFx0XHR7fVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0YUNvbmRpdGlvbnMucHVzaChvQ29uZGl0aW9uKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBiZWNhdXNlIHNlbGVjdGlvbiB3YXMgcmVtb3ZlZCBvbiB0aGUgYWdncmVnYXRpb24gaGVuY2UgcmVtb3ZlIHRoaXMgZnJvbSBjb25kaXRpb25zXG5cdFx0XHRcdFx0YUNvbmRpdGlvbnMgPSBhQ29uZGl0aW9ucy5maWx0ZXIoZnVuY3Rpb24gKG9Db25kaXRpb246IENvbmRpdGlvbk9iamVjdCkge1xuXHRcdFx0XHRcdFx0aWYgKHNEaW1lbnNpb25UeXBlID09PSBcIkVkbS5EYXRlVGltZU9mZnNldFwiKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBvQ29uZGl0aW9uLm9wZXJhdG9yICE9PSBcIkVRXCIgfHwgRGF0ZS5wYXJzZShvQ29uZGl0aW9uLnZhbHVlc1swXSkgIT09IERhdGUucGFyc2Uoc1NlbGVjdGlvbkNoYW5nZWRWYWx1ZSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRyZXR1cm4gb0NvbmRpdGlvbi5vcGVyYXRvciAhPT0gXCJFUVwiIHx8IG9Db25kaXRpb24udmFsdWVzWzBdICE9PSBzU2VsZWN0aW9uQ2hhbmdlZFZhbHVlO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdG9Db25kaXRpb25Nb2RlbC5zZXRQcm9wZXJ0eShcIi9jb25kaXRpb25zXCIsIGFDb25kaXRpb25zKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIlZpc3VhbEZpbHRlcjogTm8gdmF1ZSBmb3VuZCBmb3IgdGhlIG91dFBhcmFtZXRlclwiKTtcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cdC8vIFRISVMgSVMgQSBGT1JNQVRURVJcblx0Z2V0QWdncmVnYXRpb25TZWxlY3RlZCh0aGlzOiBNYW5hZ2VkT2JqZWN0LCBhQ29uZGl0aW9uczogQ29uZGl0aW9uT2JqZWN0W10pOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcblx0XHRsZXQgYVNlbGVjdGFibGVWYWx1ZXMgPSBbXTtcblx0XHRpZiAoIXRoaXMuZ2V0QmluZGluZ0NvbnRleHQoKSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRmb3IgKGxldCBpID0gMDsgaSA8PSBhQ29uZGl0aW9ucy5sZW5ndGggLSAxOyBpKyspIHtcblx0XHRcdGNvbnN0IG9Db25kaXRpb24gPSBhQ29uZGl0aW9uc1tpXTtcblx0XHRcdC8vIDEuIGdldCBjb25kaXRpb25zIHdpdGggRVEgb3BlcmF0b3IgKHNpbmNlIHZpc3VhbCBmaWx0ZXIgY2FuIG9ubHkgZGVhbCB3aXRoIEVRIG9wZXJhdG9ycykgYW5kIGdldCB0aGVpciB2YWx1ZXNcblx0XHRcdGlmIChvQ29uZGl0aW9uLm9wZXJhdG9yID09PSBcIkVRXCIpIHtcblx0XHRcdFx0YVNlbGVjdGFibGVWYWx1ZXMucHVzaChvQ29uZGl0aW9uLnZhbHVlc1swXSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gYWNjZXNzIHRoZSBpbnRlcmFjdGl2ZSBjaGFydCBmcm9tIHRoZSBjb250cm9sLlxuXHRcdGNvbnN0IG9JbnRlcmFjdGl2ZUNoYXJ0ID0gdGhpcy5nZXRQYXJlbnQoKSBhcyBDb250cm9sO1xuXHRcdGNvbnN0IHNEaW1lbnNpb24gPSBvSW50ZXJhY3RpdmVDaGFydC5kYXRhKFwiZGltZW5zaW9uXCIpO1xuXHRcdGNvbnN0IHNEaW1lbnNpb25UeXBlID0gb0ludGVyYWN0aXZlQ2hhcnQuZGF0YShcImRpbWVuc2lvblR5cGVcIik7XG5cdFx0bGV0IHNEaW1lbnNpb25WYWx1ZSA9IHRoaXMuZ2V0QmluZGluZ0NvbnRleHQoKT8uZ2V0T2JqZWN0KHNEaW1lbnNpb24pO1xuXHRcdGlmIChzRGltZW5zaW9uVHlwZSA9PT0gXCJFZG0uRGF0ZVRpbWVPZmZzZXRcIikge1xuXHRcdFx0c0RpbWVuc2lvblZhbHVlID0gVmlzdWFsRmlsdGVyVXRpbHMuX3BhcnNlRGF0ZVRpbWUoc0RpbWVuc2lvblZhbHVlKSBhcyB1bmtub3duO1xuXHRcdH1cblx0XHRpZiAob0ludGVyYWN0aXZlQ2hhcnQuZGF0YShcIm11bHRpcGxlU2VsZWN0aW9uQWxsb3dlZFwiKSA9PT0gZmFsc2UgJiYgYVNlbGVjdGFibGVWYWx1ZXMubGVuZ3RoID4gMSkge1xuXHRcdFx0YVNlbGVjdGFibGVWYWx1ZXMgPSBbYVNlbGVjdGFibGVWYWx1ZXNbMF1dO1xuXHRcdH1cblx0XHRyZXR1cm4gYVNlbGVjdGFibGVWYWx1ZXMuaW5jbHVkZXMoc0RpbWVuc2lvblZhbHVlKTtcblx0fSxcblxuXHQvKipcblx0ICogR2V0IFZpc3VhbCBGaWx0ZXIgY29udHJvbCBmb3IgdGhlIGdpdmVuIGNoaWxkIGNvbnRyb2wuXG5cdCAqIEBwYXJhbSBwb3RlbnRpYWxWaXN1YWxGaWx0ZXIgRXhwZWN0ZWQgaW5zdGFuY2Ugb2YgVmlzdWFsIEZpbHRlciBjaGlsZCBjb250cm9sLlxuXHQgKiBAcmV0dXJucyBUaGUgcGFyZW50IFZpc3VhbCBGaWx0ZXIgQnVpbGRpbmdibG9jayBjb250cm9sIGluc3RhbmNlIGlmIGZvdW5kLCBvdGhlcndpc2UgbnVsbC5cblx0ICovXG5cdGdldFBhcmVudFZpc3VhbEZpbHRlckNvbnRyb2xCQihwb3RlbnRpYWxWaXN1YWxGaWx0ZXI6IE1hbmFnZWRPYmplY3QgfCBudWxsKTogVmlzdWFsRmlsdGVyQmxvY2sgfCBudWxsIHtcblx0XHR3aGlsZSAocG90ZW50aWFsVmlzdWFsRmlsdGVyICYmICFwb3RlbnRpYWxWaXN1YWxGaWx0ZXIuaXNBPFZpc3VhbEZpbHRlckJsb2NrPihcInNhcC5mZS5tYWNyb3MudmlzdWFsZmlsdGVycy5WaXN1YWxGaWx0ZXJcIikpIHtcblx0XHRcdHBvdGVudGlhbFZpc3VhbEZpbHRlciA9IHBvdGVudGlhbFZpc3VhbEZpbHRlci5nZXRQYXJlbnQoKTtcblx0XHR9XG5cdFx0cmV0dXJuIHBvdGVudGlhbFZpc3VhbEZpbHRlcjtcblx0fSxcblxuXHQvLyBUSElTIElTIEEgRk9STUFUVEVSXG5cdGdldEZpbHRlcnNGcm9tQ29uZGl0aW9ucyh0aGlzOiBNYW5hZ2VkT2JqZWN0LCAuLi5hQXJndW1lbnRzOiBDb25kaXRpb25PYmplY3RbXVtdKTogRmlsdGVyW10gfCB1bmRlZmluZWQge1xuXHRcdGNvbnN0IG9JbnRlcmFjdGl2ZUNoYXJ0ID0gdGhpcy5nZXRQYXJlbnQoKSBhcyBDb250cm9sO1xuXHRcdGNvbnN0IG9GaWx0ZXJCYXIgPSBvSW50ZXJhY3RpdmVDaGFydC5nZXRQYXJlbnQoKT8uZ2V0UGFyZW50KCk/LmdldFBhcmVudCgpPy5nZXRQYXJlbnQoKT8uZ2V0UGFyZW50KCkgYXMgSUZpbHRlckNvbnRyb2w7XG5cdFx0Y29uc3QgYUluUGFyYW1ldGVycyA9IG9JbnRlcmFjdGl2ZUNoYXJ0LmRhdGEoXCJpblBhcmFtZXRlcnNcIikuY3VzdG9tRGF0YTtcblx0XHRjb25zdCBiSXNEcmFmdFN1cHBvcnRlZCA9IG9JbnRlcmFjdGl2ZUNoYXJ0LmRhdGEoXCJkcmFmdFN1cHBvcnRlZFwiKSA9PT0gdHJ1ZTtcblx0XHRjb25zdCBhUHJvcGVydHlJbmZvU2V0ID0gRmlsdGVyVXRpbHMuZ2V0RmlsdGVyUHJvcGVydHlJbmZvKG9GaWx0ZXJCYXIpIGFzIFByb3BlcnR5SW5mb1tdO1xuXHRcdGNvbnN0IG1Db25kaXRpb25zOiBSZWNvcmQ8c3RyaW5nLCBDb25kaXRpb25PYmplY3RbXT4gPSB7fTtcblx0XHRjb25zdCBhVmFsdWVMaXN0UHJvcGVydHlJbmZvU2V0OiB1bmtub3duW10gPSBbXTtcblx0XHRsZXQgb0ZpbHRlcnM7XG5cdFx0bGV0IGFGaWx0ZXJzOiBGaWx0ZXJbXSA9IFtdO1xuXHRcdGNvbnN0IGFQYXJhbWV0ZXJzID0gb0ludGVyYWN0aXZlQ2hhcnQuZGF0YShcInBhcmFtZXRlcnNcIikgYXMgc3RyaW5nW107XG5cdFx0Y29uc3Qgb1NlbGVjdGlvblZhcmlhbnRBbm5vdGF0aW9uID0gb0ludGVyYWN0aXZlQ2hhcnQuZGF0YShcInNlbGVjdGlvblZhcmlhbnRBbm5vdGF0aW9uXCIpIGFzXG5cdFx0XHR8IE1ldGFNb2RlbFR5cGU8U2VsZWN0aW9uVmFyaWFudFR5cGU+XG5cdFx0XHR8IFNlbGVjdGlvblZhcmlhbnRUeXBlO1xuXHRcdGNvbnN0IG9JbnRlcmFjdGl2ZUNoYXJ0TGlzdEJpbmRpbmcgPVxuXHRcdFx0b0ludGVyYWN0aXZlQ2hhcnQuZ2V0QmluZGluZyhcImJhcnNcIikgfHwgb0ludGVyYWN0aXZlQ2hhcnQuZ2V0QmluZGluZyhcInBvaW50c1wiKSB8fCBvSW50ZXJhY3RpdmVDaGFydC5nZXRCaW5kaW5nKFwic2VnbWVudHNcIik7XG5cdFx0Y29uc3Qgc1BhdGggPSBvSW50ZXJhY3RpdmVDaGFydExpc3RCaW5kaW5nIS5nZXRQYXRoKCk7XG5cdFx0Y29uc3Qgb01ldGFNb2RlbCA9IChvSW50ZXJhY3RpdmVDaGFydC5nZXRNb2RlbCgpIGFzIE9EYXRhTW9kZWwpLmdldE1ldGFNb2RlbCgpO1xuXHRcdGNvbnN0IHNFbnRpdHlTZXRQYXRoID0gb0ludGVyYWN0aXZlQ2hhcnRMaXN0QmluZGluZyEuZ2V0UGF0aCgpO1xuXHRcdGNvbnN0IGZpbHRlckNvbmRpdGlvbnMgPSBnZXRGaWx0ZXJzQ29uZGl0aW9uc0Zyb21TZWxlY3Rpb25WYXJpYW50KFxuXHRcdFx0c0VudGl0eVNldFBhdGgsXG5cdFx0XHRvTWV0YU1vZGVsLFxuXHRcdFx0b1NlbGVjdGlvblZhcmlhbnRBbm5vdGF0aW9uLFxuXHRcdFx0VmlzdWFsRmlsdGVyVXRpbHMuZ2V0Q3VzdG9tQ29uZGl0aW9ucy5iaW5kKFZpc3VhbEZpbHRlclV0aWxzKVxuXHRcdCk7XG5cdFx0Zm9yIChjb25zdCBpIGluIGFQcm9wZXJ0eUluZm9TZXQpIHtcblx0XHRcdGFQcm9wZXJ0eUluZm9TZXRbaV0udHlwZUNvbmZpZyA9IFR5cGVNYXAuZ2V0VHlwZUNvbmZpZyhhUHJvcGVydHlJbmZvU2V0W2ldLmRhdGFUeXBlLCB7fSwge30pO1xuXHRcdH1cblx0XHRjb25zdCBvU2VsZWN0aW9uVmFyaWFudENvbmRpdGlvbnMgPSBWaXN1YWxGaWx0ZXJVdGlscy5jb252ZXJ0RmlsdGVyQ29uZGlvbnMoZmlsdGVyQ29uZGl0aW9ucyk7XG5cdFx0Ly8gYUluUGFyYW1ldGVycyBhbmQgdGhlIGJpbmRpbmdzIHRvIGluIHBhcmFtZXRlcnMgYXJlIGluIHRoZSBzYW1lIG9yZGVyIHNvIHdlIGNhbiByZWx5IG9uIGl0IHRvIGNyZWF0ZSBvdXIgY29uZGl0aW9uc1xuXHRcdE9iamVjdC5rZXlzKG9TZWxlY3Rpb25WYXJpYW50Q29uZGl0aW9ucykuZm9yRWFjaChmdW5jdGlvbiAoc0tleTogc3RyaW5nKSB7XG5cdFx0XHRtQ29uZGl0aW9uc1tzS2V5XSA9IG9TZWxlY3Rpb25WYXJpYW50Q29uZGl0aW9uc1tzS2V5XTtcblx0XHRcdC8vZmV0Y2ggbG9jYWxEYXRhUHJvcGVydHkgaWYgc2VsZWN0aW9uIHZhcmlhbnQga2V5IGlzIGJhc2VkIG9uIHZhdWUgbGlzdCBwcm9wZXJ0eVxuXHRcdFx0Y29uc3QgaW5QYXJhbWV0ZXJGb3JLZXkgPSBhSW5QYXJhbWV0ZXJzLmZpbmQoZnVuY3Rpb24gKGluUGFyYW1ldGVyOiB7IHZhbHVlTGlzdFByb3BlcnR5OiBzdHJpbmcgfSkge1xuXHRcdFx0XHRyZXR1cm4gaW5QYXJhbWV0ZXIudmFsdWVMaXN0UHJvcGVydHkgPT09IHNLZXk7XG5cdFx0XHR9KTtcblx0XHRcdGNvbnN0IGxvY2FsRGF0YVByb3BlcnR5ID0gaW5QYXJhbWV0ZXJGb3JLZXkgPyBpblBhcmFtZXRlckZvcktleS5sb2NhbERhdGFQcm9wZXJ0eSA6IHNLZXk7XG5cdFx0XHRpZiAoIWFQYXJhbWV0ZXJzIHx8IChhUGFyYW1ldGVycyAmJiAhYVBhcmFtZXRlcnMuaW5jbHVkZXMoc0tleSkpKSB7XG5cdFx0XHRcdGZvciAoY29uc3QgaSBpbiBhUHJvcGVydHlJbmZvU2V0KSB7XG5cdFx0XHRcdFx0Y29uc3QgcHJvcGVydHlJbmZvU2V0ID0gYVByb3BlcnR5SW5mb1NldFtpXTtcblx0XHRcdFx0XHRpZiAobG9jYWxEYXRhUHJvcGVydHkgPT09IHByb3BlcnR5SW5mb1NldC5uYW1lKSB7XG5cdFx0XHRcdFx0XHRpZiAocHJvcGVydHlJbmZvU2V0Py50eXBlQ29uZmlnPy5iYXNlVHlwZSA9PT0gXCJEYXRlVGltZVwiKSB7XG5cdFx0XHRcdFx0XHRcdGlmIChtQ29uZGl0aW9uc1tzS2V5XSkge1xuXHRcdFx0XHRcdFx0XHRcdG1Db25kaXRpb25zW3NLZXldLmZvckVhY2goZnVuY3Rpb24gKGNvbmRpdGlvbikge1xuXHRcdFx0XHRcdFx0XHRcdFx0Y29uZGl0aW9uLnZhbHVlc1swXSA9IFZpc3VhbEZpbHRlclV0aWxzLl9mb3JtYXREYXRlVGltZShjb25kaXRpb24udmFsdWVzWzBdKTtcblx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0YVZhbHVlTGlzdFByb3BlcnR5SW5mb1NldC5wdXNoKHtcblx0XHRcdFx0XHRcdFx0bmFtZTogc0tleSxcblx0XHRcdFx0XHRcdFx0dHlwZUNvbmZpZzogcHJvcGVydHlJbmZvU2V0LnR5cGVDb25maWdcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdGFJblBhcmFtZXRlcnMuZm9yRWFjaChmdW5jdGlvbiAob0luUGFyYW1ldGVyOiB7IHZhbHVlTGlzdFByb3BlcnR5OiBzdHJpbmc7IGxvY2FsRGF0YVByb3BlcnR5OiBzdHJpbmcgfSwgaW5kZXg6IG51bWJlcikge1xuXHRcdFx0aWYgKGFBcmd1bWVudHNbaW5kZXhdLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0Ly8gc3RvcmUgY29uZGl0aW9ucyB3aXRoIHZhbHVlIGxpc3QgcHJvcGVydHkgc2luY2Ugd2UgYXJlIGZpbHRlcmluZyBvbiB0aGUgdmFsdWUgbGlzdCBjb2xsZWN0aW9uIHBhdGhcblx0XHRcdFx0bUNvbmRpdGlvbnNbb0luUGFyYW1ldGVyLnZhbHVlTGlzdFByb3BlcnR5XSA9IGFBcmd1bWVudHNbaW5kZXhdO1xuXHRcdFx0XHRpZiAoIWFQYXJhbWV0ZXJzIHx8IChhUGFyYW1ldGVycyAmJiAhYVBhcmFtZXRlcnMuaW5jbHVkZXMob0luUGFyYW1ldGVyLnZhbHVlTGlzdFByb3BlcnR5KSkpIHtcblx0XHRcdFx0XHQvLyBhUHJvcGVydHlJbmZvU2V0IGlzIGxpc3Qgb2YgcHJvcGVydGllcyBmcm9tIHRoZSBmaWx0ZXIgYmFyIGJ1dCB3ZSBuZWVkIHRvIGNyZWF0ZSBjb25kaXRpb25zIGZvciB0aGUgdmFsdWUgbGlzdFxuXHRcdFx0XHRcdC8vIHdoaWNoIGNvdWxkIGhhdmUgYSBkaWZmZXJlbnQgY29sbGVjdGlvblBhdGguXG5cdFx0XHRcdFx0Ly8gT25seSB0eXBlQ29uZmlnIGZyb20gYVByb3BlcnR5SW5mb1NldCBpcyByZXF1aXJlZCBmb3IgZ2V0dGluZyB0aGUgY29udmVydGVkIGZpbHRlcnMgZnJvbSBjb25kaXRpb25zXG5cdFx0XHRcdFx0Ly8gc28gd2UgdXBkYXRlIGFQcm9wZXJ0eUluZm9TZXQgdG8gaGF2ZSB0aGUgdmFsdWVMaXN0UHJvcGVydGllcyBvbmx5XG5cdFx0XHRcdFx0Ly8gVGhpcyB3YXkgY29uZGl0aW9ucyB3aWxsIGJlIGNvbnZlcnRlZCB0byBzYXAudWkubW9kZWwuRmlsdGVyIGZvciB0aGUgdmFsdWUgbGlzdFxuXHRcdFx0XHRcdC8vIFRoaXMgd29ya3MgYmVjYXVzZSBmb3IgaW4gcGFyYW1ldGVyIG1hcHBpbmcgdGhlIHByb3BlcnR5IGZyb20gdGhlIG1haW4gZW50aXR5IHR5cGUgc2hvdWxkIGJlIG9mIHRoZSBzYW1lIHR5cGUgYXMgdGhlIHZhbHVlIGxpc3QgZW50aXR5IHR5cGVcblx0XHRcdFx0XHQvLyBUT0RPOiBGb2xsb3cgdXAgd2l0aCBNREMgdG8gY2hlY2sgaWYgdGhleSBjYW4gcHJvdmlkZSBhIGNsZWFuIGFwaSB0byBjb252ZXJ0IGNvbmRpdGlvbnMgaW50byBmaWx0ZXJzXG5cdFx0XHRcdFx0Zm9yIChjb25zdCBpIGluIGFQcm9wZXJ0eUluZm9TZXQpIHtcblx0XHRcdFx0XHRcdC8vIHN0b3JlIGNvbmRpdGlvbnMgd2l0aCB2YWx1ZSBsaXN0IHByb3BlcnR5IHNpbmNlIHdlIGFyZSBmaWx0ZXJpbmcgb24gdGhlIHZhbHVlIGxpc3QgY29sbGVjdGlvbiBwYXRoXG5cdFx0XHRcdFx0XHRjb25zdCBwcm9wZXJ0eUluZm9TZXQgPSBhUHJvcGVydHlJbmZvU2V0W2ldO1xuXHRcdFx0XHRcdFx0aWYgKHByb3BlcnR5SW5mb1NldC5uYW1lID09PSBvSW5QYXJhbWV0ZXIubG9jYWxEYXRhUHJvcGVydHkpIHtcblx0XHRcdFx0XHRcdFx0aWYgKHByb3BlcnR5SW5mb1NldD8udHlwZUNvbmZpZz8uYmFzZVR5cGUgPT09IFwiRGF0ZVRpbWVcIikge1xuXHRcdFx0XHRcdFx0XHRcdGlmIChtQ29uZGl0aW9uc1tvSW5QYXJhbWV0ZXIudmFsdWVMaXN0UHJvcGVydHldKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRtQ29uZGl0aW9uc1tvSW5QYXJhbWV0ZXIudmFsdWVMaXN0UHJvcGVydHldLmZvckVhY2goZnVuY3Rpb24gKGNvbmRpdGlvbikge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRjb25kaXRpb24udmFsdWVzWzBdID0gVmlzdWFsRmlsdGVyVXRpbHMuX2Zvcm1hdERhdGVUaW1lKGNvbmRpdGlvbi52YWx1ZXNbMF0pO1xuXHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdGFWYWx1ZUxpc3RQcm9wZXJ0eUluZm9TZXQucHVzaCh7XG5cdFx0XHRcdFx0XHRcdFx0bmFtZTogb0luUGFyYW1ldGVyLnZhbHVlTGlzdFByb3BlcnR5LFxuXHRcdFx0XHRcdFx0XHRcdHR5cGVDb25maWc6IHByb3BlcnR5SW5mb1NldC50eXBlQ29uZmlnXG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0Y29uc3Qgb0ludGVybmFsTW9kZWxDb250ZXh0ID0gb0ludGVyYWN0aXZlQ2hhcnQuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKSBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dDtcblx0XHRjb25zdCBzSW5mb1BhdGggPSBvSW50ZXJhY3RpdmVDaGFydC5kYXRhKFwiaW5mb1BhdGhcIik7XG5cdFx0bGV0IGJFbmFibGVCaW5kaW5nO1xuXHRcdGNvbnN0IG9SZXNvdXJjZUJ1bmRsZSA9IExpYnJhcnkuZ2V0UmVzb3VyY2VCdW5kbGVGb3IoXCJzYXAuZmUubWFjcm9zXCIpITtcblx0XHRjb25zdCBhUmVxdWlyZWRQcm9wZXJ0aWVzID0gQ29tbW9uSGVscGVyLnBhcnNlQ3VzdG9tRGF0YShvSW50ZXJhY3RpdmVDaGFydC5kYXRhKFwicmVxdWlyZWRQcm9wZXJ0aWVzXCIpKSBhcyBzdHJpbmdbXTtcblx0XHRpZiAoYVJlcXVpcmVkUHJvcGVydGllcy5sZW5ndGgpIHtcblx0XHRcdGNvbnN0IGFDb25kaXRpb25zID0gT2JqZWN0LmtleXMobUNvbmRpdGlvbnMpIHx8IFtdO1xuXHRcdFx0Y29uc3QgYU5vdE1hdGNoZWRDb25kaXRpb25zOiBzdHJpbmdbXSA9IFtdO1xuXHRcdFx0YVJlcXVpcmVkUHJvcGVydGllcy5mb3JFYWNoKGZ1bmN0aW9uIChyZXF1aXJlZFByb3BlcnR5UGF0aDogc3RyaW5nKSB7XG5cdFx0XHRcdGlmICghYUNvbmRpdGlvbnMuaW5jbHVkZXMocmVxdWlyZWRQcm9wZXJ0eVBhdGgpKSB7XG5cdFx0XHRcdFx0YU5vdE1hdGNoZWRDb25kaXRpb25zLnB1c2gocmVxdWlyZWRQcm9wZXJ0eVBhdGgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHRcdGlmICghYU5vdE1hdGNoZWRDb25kaXRpb25zLmxlbmd0aCkge1xuXHRcdFx0XHRiRW5hYmxlQmluZGluZyA9IG9JbnRlcm5hbE1vZGVsQ29udGV4dC5nZXRQcm9wZXJ0eShgJHtzSW5mb1BhdGh9L3Nob3dFcnJvcmApO1xuXHRcdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoc0luZm9QYXRoLCB7XG5cdFx0XHRcdFx0ZXJyb3JNZXNzYWdlVGl0bGU6IFwiXCIsXG5cdFx0XHRcdFx0ZXJyb3JNZXNzYWdlOiBcIlwiLFxuXHRcdFx0XHRcdHNob3dFcnJvcjogZmFsc2Vcblx0XHRcdFx0fSk7XG5cdFx0XHR9IGVsc2UgaWYgKGFOb3RNYXRjaGVkQ29uZGl0aW9ucy5sZW5ndGggPiAxKSB7XG5cdFx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShzSW5mb1BhdGgsIHtcblx0XHRcdFx0XHRlcnJvck1lc3NhZ2VUaXRsZTogb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJNX1ZJU1VBTF9GSUxURVJTX0VSUk9SX01FU1NBR0VfVElUTEVcIiksXG5cdFx0XHRcdFx0ZXJyb3JNZXNzYWdlOiBvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIk1fVklTVUFMX0ZJTFRFUlNfUFJPVklERV9GSUxURVJfVkFMX01VTFRJUExFVkZcIiksXG5cdFx0XHRcdFx0c2hvd0Vycm9yOiB0cnVlXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCBzTGFiZWwgPVxuXHRcdFx0XHRcdG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NFbnRpdHlTZXRQYXRofS8ke2FOb3RNYXRjaGVkQ29uZGl0aW9uc1swXX1AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkxhYmVsYCkgfHxcblx0XHRcdFx0XHRhTm90TWF0Y2hlZENvbmRpdGlvbnNbMF07XG5cdFx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShzSW5mb1BhdGgsIHtcblx0XHRcdFx0XHRlcnJvck1lc3NhZ2VUaXRsZTogb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJNX1ZJU1VBTF9GSUxURVJTX0VSUk9SX01FU1NBR0VfVElUTEVcIiksXG5cdFx0XHRcdFx0ZXJyb3JNZXNzYWdlOiBvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIk1fVklTVUFMX0ZJTFRFUlNfUFJPVklERV9GSUxURVJfVkFMX1NJTkdMRVZGXCIsIHNMYWJlbCksXG5cdFx0XHRcdFx0c2hvd0Vycm9yOiB0cnVlXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdGJFbmFibGVCaW5kaW5nID0gb0ludGVybmFsTW9kZWxDb250ZXh0LmdldFByb3BlcnR5KGAke3NJbmZvUGF0aH0vc2hvd0Vycm9yYCk7XG5cdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoc0luZm9QYXRoLCB7IGVycm9yTWVzc2FnZVRpdGxlOiBcIlwiLCBlcnJvck1lc3NhZ2U6IFwiXCIsIHNob3dFcnJvcjogZmFsc2UgfSk7XG5cdFx0fVxuXG5cdFx0Y29uc3Qgc0ZpbHRlckVudGl0eU5hbWUgPSBvRmlsdGVyQmFyLmRhdGEoXCJlbnRpdHlUeXBlXCIpLnNwbGl0KFwiL1wiKVsxXTtcblx0XHRjb25zdCBzQ2hhcnRFbnRpdHlOYW1lID0gc1BhdGguc3BsaXQoXCIvXCIpWzFdLnNwbGl0KFwiKFwiKVswXTtcblx0XHRpZiAoYVBhcmFtZXRlcnMgJiYgYVBhcmFtZXRlcnMubGVuZ3RoICYmIHNGaWx0ZXJFbnRpdHlOYW1lID09PSBzQ2hhcnRFbnRpdHlOYW1lKSB7XG5cdFx0XHRjb25zdCBzQmluZGluZ1BhdGggPSBiRW5hYmxlQmluZGluZ1xuXHRcdFx0XHQ/IEZpbHRlclV0aWxzLmdldEJpbmRpbmdQYXRoRm9yUGFyYW1ldGVycyhvRmlsdGVyQmFyLCBtQ29uZGl0aW9ucywgYVByb3BlcnR5SW5mb1NldCwgYVBhcmFtZXRlcnMpXG5cdFx0XHRcdDogdW5kZWZpbmVkO1xuXG5cdFx0XHRpZiAoc0JpbmRpbmdQYXRoKSB7XG5cdFx0XHRcdChvSW50ZXJhY3RpdmVDaGFydExpc3RCaW5kaW5nIGFzIHsgc1BhdGg/OiBzdHJpbmcgfSkuc1BhdGggPSBzQmluZGluZ1BhdGg7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKGFQYXJhbWV0ZXJzICYmIGFQYXJhbWV0ZXJzLmxlbmd0aCkge1xuXHRcdFx0Ly9SZW1vdmUgcGFyYW1ldGVycyBmcm9tIG1Db25kaXRpb25zIHNpbmNlIGl0IHNob3VsZCBub3QgYmUgYSBwYXJ0IG9mICRmaWx0ZXJcblx0XHRcdGFQYXJhbWV0ZXJzLmZvckVhY2goZnVuY3Rpb24gKHBhcmFtZXRlcjogc3RyaW5nKSB7XG5cdFx0XHRcdGlmIChtQ29uZGl0aW9uc1twYXJhbWV0ZXJdKSB7XG5cdFx0XHRcdFx0ZGVsZXRlIG1Db25kaXRpb25zW3BhcmFtZXRlcl07XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdC8vIE9uIEluaXRpYWxMb2FkIHdoZW4gaW5pdGlhbGxheW91dCBpcyB2aXN1YWwsIGFQcm9wZXJ0eUluZm9TZXQgaXMgYWx3YXlzIGVtcHR5IGFuZCB3ZSBjYW5ub3QgZ2V0IGZpbHRlcnMgZnJvbSBNRENGaWx0ZXJVdGlsLlxuXHRcdC8vIEFsc28gd2hlbiBTVlF1YWxpZmllciBpcyB0aGVyZSB0aGVuIHdlIHNob3VsZCBub3QgY2hhbmdlIHRoZSBsaXN0YmluZGluZyBmaWx0ZXJzIHRvIGVtcHR5IGFzIHdlIGFyZSBub3QgZ2V0dGluZyBmaWx0ZXJzIGZyb20gTURDRmlsdGVyVXRpbCBidXRcblx0XHQvLyBpbnN0ZWFkIHdlIG5lZWQgdG8gbm90IGNhbGwgbGlzdGJpbmRpbmcuZmlsdGVyIGFuZCB1c2UgdGhlIHRlbXBsYXRlIHRpbWUgYmluZGluZyBpdHNlbGYuXG5cdFx0aWYgKE9iamVjdC5rZXlzKG1Db25kaXRpb25zKS5sZW5ndGggPiAwICYmIGFWYWx1ZUxpc3RQcm9wZXJ0eUluZm9TZXQubGVuZ3RoKSB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRvRmlsdGVycyA9IChNZGNGaWx0ZXJVdGlsLmdldEZpbHRlckluZm8ob0ZpbHRlckJhciwgbUNvbmRpdGlvbnMsIGFWYWx1ZUxpc3RQcm9wZXJ0eUluZm9TZXQsIFtdKSBhcyB7IGZpbHRlcnM6IEZpbHRlciB9KVxuXHRcdFx0XHRcdC5maWx0ZXJzO1xuXHRcdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0XHRMb2cuZGVidWcoXCJWaXN1YWxGaWx0ZXI6IEVycm9yIHdoaWxlIGdldHRpbmcgZmlsdGVycyBmcm9tIE1EQ0ZpbHRlclV0aWxcIik7XG5cdFx0XHR9XG5cdFx0XHRpZiAob0ZpbHRlcnMpIHtcblx0XHRcdFx0aWYgKCFvRmlsdGVycy5nZXRGaWx0ZXJzKCkpIHtcblx0XHRcdFx0XHRhRmlsdGVycy5wdXNoKG9GaWx0ZXJzKTtcblx0XHRcdFx0fSBlbHNlIGlmIChvRmlsdGVycy5nZXRGaWx0ZXJzKCkpIHtcblx0XHRcdFx0XHRhRmlsdGVycyA9IG9GaWx0ZXJzLmdldEZpbHRlcnMoKSE7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKGJJc0RyYWZ0U3VwcG9ydGVkKSB7XG5cdFx0XHRhRmlsdGVycy5wdXNoKG5ldyBGaWx0ZXIoXCJJc0FjdGl2ZUVudGl0eVwiLCBGaWx0ZXJPcGVyYXRvci5FUSwgdHJ1ZSkpO1xuXHRcdH1cblx0XHRpZiAoYUZpbHRlcnMgJiYgYUZpbHRlcnMubGVuZ3RoID4gMCkge1xuXHRcdFx0KG9JbnRlcmFjdGl2ZUNoYXJ0TGlzdEJpbmRpbmcgYXMgT0RhdGFMaXN0QmluZGluZyk/LmZpbHRlcihhRmlsdGVycyk7XG5cdFx0fSBlbHNlIGlmICghT2JqZWN0LmtleXMobUNvbmRpdGlvbnMpLmxlbmd0aCkge1xuXHRcdFx0KG9JbnRlcmFjdGl2ZUNoYXJ0TGlzdEJpbmRpbmcgYXMgT0RhdGFMaXN0QmluZGluZyk/LmZpbHRlcigpO1xuXHRcdH1cblx0XHQvLyB1cGRhdGUgdGhlIGludGVyYWN0aXZlIGNoYXJ0IGJpbmRpbmdcblx0XHRpZiAoYkVuYWJsZUJpbmRpbmcpIHtcblx0XHRcdGNvbnN0IHZpc3VhbEZpbHRlckJCID0gVmlzdWFsRmlsdGVyUnVudGltZS5nZXRQYXJlbnRWaXN1YWxGaWx0ZXJDb250cm9sQkIob0ludGVyYWN0aXZlQ2hhcnQpO1xuXHRcdFx0dmlzdWFsRmlsdGVyQkI/Ll9zZXRJbnRlcm5hbFVwZGF0ZVBlbmRpbmcoZmFsc2UpO1xuXHRcdH1cblx0XHRyZXR1cm4gYUZpbHRlcnM7XG5cdH0sXG5cdGdldEZpbHRlckNvdW50cyh0aGlzOiBDb250cm9sLCBvQ29uZGl0aW9uczogQ29uZGl0aW9uT2JqZWN0W10pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRcdGlmICh0aGlzLmRhdGEoXCJtdWx0aXBsZVNlbGVjdGlvbkFsbG93ZWRcIikgPT09IGZhbHNlICYmIG9Db25kaXRpb25zLmxlbmd0aCA+IDApIHtcblx0XHRcdHJldHVybiBgKDEpYDtcblx0XHR9XG5cdFx0aWYgKG9Db25kaXRpb25zLmxlbmd0aCA+IDApIHtcblx0XHRcdHJldHVybiBgKCR7b0NvbmRpdGlvbnMubGVuZ3RofSlgO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblx0fSxcblxuXHRzY2FsZVZpc3VhbEZpbHRlclZhbHVlKFxuXHRcdG9WYWx1ZTogc3RyaW5nLFxuXHRcdHNjYWxlRmFjdG9yOiBudW1iZXIsXG5cdFx0bnVtYmVyT2ZGcmFjdGlvbmFsRGlnaXRzOiBudW1iZXIsXG5cdFx0Y3VycmVuY3k6IHN0cmluZyxcblx0XHRvUmF3VmFsdWU6IHN0cmluZyB8IG51bWJlclxuXHQpOiBzdHJpbmcge1xuXHRcdC8vIFNjYWxlRmFjdG9yIGlmIGRlZmluZWQgaXMgcHJpb3JpdHkgZm9yIGZvcm1hdHRpbmdcblx0XHRpZiAoc2NhbGVGYWN0b3IpIHtcblx0XHRcdHJldHVybiBWaXN1YWxGaWx0ZXJVdGlscy5nZXRGb3JtYXR0ZWROdW1iZXIob1Jhd1ZhbHVlLCBzY2FsZUZhY3RvciwgbnVtYmVyT2ZGcmFjdGlvbmFsRGlnaXRzKTtcblx0XHRcdC8vIElmIFNjYWxlIEZhY3RvciBpcyBub3QgZGVmaW5lZCwgdXNlIGN1cnJlbmN5IGZvcm1hdHRpbmdcblx0XHR9IGVsc2UgaWYgKGN1cnJlbmN5KSB7XG5cdFx0XHRyZXR1cm4gVmlzdWFsRmlsdGVyVXRpbHMuZ2V0Rm9ybWF0dGVkTnVtYmVyKG9SYXdWYWx1ZSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGN1cnJlbmN5KTtcblx0XHRcdC8vIE5vIFNjYWxlRmFjdG9yIGFuZCBubyBDdXJyZW5jeSwgdXNlIG51bWJlck9mRnJhY3Rpb25hbERpZ2l0cyBkZWZpbmVkIGluIERhdGFQb2ludFxuXHRcdH0gZWxzZSBpZiAobnVtYmVyT2ZGcmFjdGlvbmFsRGlnaXRzID4gMCkge1xuXHRcdFx0Ly8gTnVtYmVyIG9mIGZyYWN0aW9uYWwgZGlnaXRzIHNoYWxsIG5vdCBleGNlZWQgMiwgdW5sZXNzIHJlcXVpcmVkIGJ5IGN1cnJlbmN5XG5cdFx0XHRudW1iZXJPZkZyYWN0aW9uYWxEaWdpdHMgPSBudW1iZXJPZkZyYWN0aW9uYWxEaWdpdHMgPiAyID8gMiA6IG51bWJlck9mRnJhY3Rpb25hbERpZ2l0cztcblx0XHRcdHJldHVybiBWaXN1YWxGaWx0ZXJVdGlscy5nZXRGb3JtYXR0ZWROdW1iZXIob1Jhd1ZhbHVlLCB1bmRlZmluZWQsIG51bWJlck9mRnJhY3Rpb25hbERpZ2l0cyk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBvVmFsdWU7XG5cdFx0fVxuXHR9LFxuXHRmaXJlVmFsdWVIZWxwKG9FdmVudDogVUk1RXZlbnQ8e30sIENvbnRyb2w+KTogdm9pZCB7XG5cdFx0b0V2ZW50LmdldFNvdXJjZSgpLmdldFBhcmVudCgpPy5nZXRQYXJlbnQoKT8uZ2V0UGFyZW50KCk/LmdldFBhcmVudCgpPy5maXJlRXZlbnQoXCJ2YWx1ZUhlbHBSZXF1ZXN0XCIpO1xuXHR9XG59O1xuXG5PYmplY3RQYXRoLnNldChcInNhcC5mZS5tYWNyb3MudmlzdWFsZmlsdGVycy5WaXN1YWxGaWx0ZXJSdW50aW1lXCIsIFZpc3VhbEZpbHRlclJ1bnRpbWUpO1xuXG5leHBvcnQgZGVmYXVsdCBWaXN1YWxGaWx0ZXJSdW50aW1lO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztFQTZCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0EsTUFBTUEsbUJBQW1CLEdBQUc7SUFDM0JDLGdCQUFnQkEsQ0FDZkMsTUFJOEMsRUFDdkM7TUFDUCxNQUFNQyxpQkFBMEIsR0FBSUQsTUFBTSxDQUFjRSxTQUFTLENBQUMsQ0FBQztNQUNuRSxNQUFNQyxhQUFhLEdBQUdGLGlCQUFpQixDQUFDRyxJQUFJLENBQUMsY0FBYyxDQUFDO01BQzVELE1BQU1DLGtCQUFr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
@@ -8,6 +8,7 @@ import type { IFilterControl } from "sap/fe/macros/filter/FilterUtils";
8
8
  import FilterUtils from "sap/fe/macros/filter/FilterUtils";
9
9
  import { getFiltersConditionsFromSelectionVariant } from "sap/fe/macros/filterBar/FilterHelper";
10
10
  import type { PropertyInfo } from "sap/fe/macros/internal/PropertyInfo";
11
+ import type VisualFilterBlock from "sap/fe/macros/visualfilters/VisualFilter";
11
12
  import type { InteractiveBarChart$SelectionChangedEvent } from "sap/suite/ui/microchart/InteractiveBarChart";
12
13
  import type { InteractiveDonutChart$SelectionChangedEvent } from "sap/suite/ui/microchart/InteractiveDonutChart";
13
14
  import type { InteractiveLineChart$SelectionChangedEvent } from "sap/suite/ui/microchart/InteractiveLineChart";
@@ -120,6 +121,19 @@ const VisualFilterRuntime = {
120
121
  }
121
122
  return aSelectableValues.includes(sDimensionValue);
122
123
  },
124
+
125
+ /**
126
+ * Get Visual Filter control for the given child control.
127
+ * @param potentialVisualFilter Expected instance of Visual Filter child control.
128
+ * @returns The parent Visual Filter Buildingblock control instance if found, otherwise null.
129
+ */
130
+ getParentVisualFilterControlBB(potentialVisualFilter: ManagedObject | null): VisualFilterBlock | null {
131
+ while (potentialVisualFilter && !potentialVisualFilter.isA<VisualFilterBlock>("sap.fe.macros.visualfilters.VisualFilter")) {
132
+ potentialVisualFilter = potentialVisualFilter.getParent();
133
+ }
134
+ return potentialVisualFilter;
135
+ },
136
+
123
137
  // THIS IS A FORMATTER
124
138
  getFiltersFromConditions(this: ManagedObject, ...aArguments: ConditionObject[][]): Filter[] | undefined {
125
139
  const oInteractiveChart = this.getParent() as Control;
@@ -301,8 +315,9 @@ const VisualFilterRuntime = {
301
315
  (oInteractiveChartListBinding as ODataListBinding)?.filter();
302
316
  }
303
317
  // update the interactive chart binding
304
- if (bEnableBinding && (oInteractiveChartListBinding as ODataListBinding)?.isSuspended()) {
305
- (oInteractiveChartListBinding as ODataListBinding)?.resume();
318
+ if (bEnableBinding) {
319
+ const visualFilterBB = VisualFilterRuntime.getParentVisualFilterControlBB(oInteractiveChart);
320
+ visualFilterBB?._setInternalUpdatePending(false);
306
321
  }
307
322
  return aFilters;
308
323
  },