@sapui5/sap.fe.core 1.121.2 → 1.123.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 (241) hide show
  1. package/package.json +1 -1
  2. package/src/sap/fe/core/.library +1 -1
  3. package/src/sap/fe/core/ActionRuntime.js +2 -2
  4. package/src/sap/fe/core/ActionRuntime.ts +1 -2
  5. package/src/sap/fe/core/CommonUtils.js +14 -171
  6. package/src/sap/fe/core/CommonUtils.ts +15 -221
  7. package/src/sap/fe/core/PageController.js +13 -1
  8. package/src/sap/fe/core/PageController.ts +16 -0
  9. package/src/sap/fe/core/TemplateComponent.js +6 -1
  10. package/src/sap/fe/core/TemplateComponent.ts +8 -0
  11. package/src/sap/fe/core/UIProvider.js +23 -0
  12. package/src/sap/fe/core/UIProvider.ts +38 -0
  13. package/src/sap/fe/core/buildingBlocks/BuildingBlockBase.js +97 -43
  14. package/src/sap/fe/core/buildingBlocks/BuildingBlockBase.ts +120 -50
  15. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockSupport.js +6 -3
  16. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockSupport.ts +12 -18
  17. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.js +2 -2
  18. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.ts +1 -1
  19. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplatingBase.js +1 -1
  20. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplatingBase.ts +4 -3
  21. package/src/sap/fe/core/buildingBlocks/templating/RuntimeBuildingBlockFragment.js +1 -1
  22. package/src/sap/fe/core/buildingBlocks/templating/RuntimeBuildingBlockFragment.ts +1 -0
  23. package/src/sap/fe/core/controllerextensions/BaseControllerExtension.js +42 -1
  24. package/src/sap/fe/core/controllerextensions/BaseControllerExtension.ts +40 -0
  25. package/src/sap/fe/core/controllerextensions/CollaborativeDraft.js +5 -2
  26. package/src/sap/fe/core/controllerextensions/CollaborativeDraft.ts +5 -3
  27. package/src/sap/fe/core/controllerextensions/EditFlow.js +151 -60
  28. package/src/sap/fe/core/controllerextensions/EditFlow.ts +165 -68
  29. package/src/sap/fe/core/controllerextensions/HookSupport.js +32 -14
  30. package/src/sap/fe/core/controllerextensions/HookSupport.ts +35 -14
  31. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +5 -17
  32. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +0 -12
  33. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +6 -6
  34. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +15 -10
  35. package/src/sap/fe/core/controllerextensions/InternalRouting.js +108 -287
  36. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +117 -309
  37. package/src/sap/fe/core/controllerextensions/KPIManagement.js +2 -2
  38. package/src/sap/fe/core/controllerextensions/KPIManagement.ts +6 -2
  39. package/src/sap/fe/core/controllerextensions/MessageHandler.js +2 -2
  40. package/src/sap/fe/core/controllerextensions/MessageHandler.ts +1 -1
  41. package/src/sap/fe/core/controllerextensions/PageReady.js +6 -6
  42. package/src/sap/fe/core/controllerextensions/PageReady.ts +5 -4
  43. package/src/sap/fe/core/controllerextensions/Paginator.js +17 -110
  44. package/src/sap/fe/core/controllerextensions/Paginator.ts +13 -130
  45. package/src/sap/fe/core/controllerextensions/Placeholder.js +3 -3
  46. package/src/sap/fe/core/controllerextensions/Placeholder.ts +1 -2
  47. package/src/sap/fe/core/controllerextensions/Recommendations.js +36 -31
  48. package/src/sap/fe/core/controllerextensions/Recommendations.ts +32 -37
  49. package/src/sap/fe/core/controllerextensions/Share.js +7 -7
  50. package/src/sap/fe/core/controllerextensions/Share.ts +6 -6
  51. package/src/sap/fe/core/controllerextensions/SideEffects.js +52 -6
  52. package/src/sap/fe/core/controllerextensions/SideEffects.ts +56 -4
  53. package/src/sap/fe/core/controllerextensions/ViewState.js +32 -46
  54. package/src/sap/fe/core/controllerextensions/ViewState.ts +24 -31
  55. package/src/sap/fe/core/controllerextensions/dialog/OperationsDialog.block.js +42 -31
  56. package/src/sap/fe/core/controllerextensions/dialog/OperationsDialog.block.tsx +6 -0
  57. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +168 -276
  58. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +182 -310
  59. package/src/sap/fe/core/controllerextensions/editFlow/draft.js +3 -3
  60. package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +2 -2
  61. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.js +4 -3
  62. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.ts +3 -2
  63. package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.js +74 -52
  64. package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.ts +95 -55
  65. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +3 -17
  66. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +10 -23
  67. package/src/sap/fe/core/controllerextensions/recommendations/Telemetry.js +3 -3
  68. package/src/sap/fe/core/controllerextensions/recommendations/Telemetry.ts +2 -2
  69. package/src/sap/fe/core/controllerextensions/routing/ContextPathHelper.js +225 -0
  70. package/src/sap/fe/core/controllerextensions/routing/ContextPathHelper.ts +241 -0
  71. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.block.js +69 -48
  72. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.block.tsx +56 -33
  73. package/src/sap/fe/core/controls/FormElementWrapper.js +8 -11
  74. package/src/sap/fe/core/controls/FormElementWrapper.ts +9 -0
  75. package/src/sap/fe/core/controls/Recommendations/ConfirmRecommendationDialog.block.js +6 -14
  76. package/src/sap/fe/core/controls/Recommendations/ConfirmRecommendationDialog.block.tsx +12 -23
  77. package/src/sap/fe/core/converters/ConverterContext.js +17 -9
  78. package/src/sap/fe/core/converters/ConverterContext.ts +55 -41
  79. package/src/sap/fe/core/converters/ManifestSettings.js +1 -1
  80. package/src/sap/fe/core/converters/ManifestSettings.ts +19 -5
  81. package/src/sap/fe/core/converters/ManifestWrapper.js +14 -4
  82. package/src/sap/fe/core/converters/ManifestWrapper.ts +21 -10
  83. package/src/sap/fe/core/converters/MetaModelConverter.js +402 -383
  84. package/src/sap/fe/core/converters/MetaModelConverter.ts +538 -338
  85. package/src/sap/fe/core/converters/TemplateConverter.js +4 -2
  86. package/src/sap/fe/core/converters/TemplateConverter.ts +18 -13
  87. package/src/sap/fe/core/converters/annotations/DataField.js +30 -28
  88. package/src/sap/fe/core/converters/annotations/DataField.ts +58 -35
  89. package/src/sap/fe/core/converters/common/AnnotationConverter.js +24 -23
  90. package/src/sap/fe/core/converters/controls/Common/Action.js +5 -4
  91. package/src/sap/fe/core/converters/controls/Common/Action.ts +34 -28
  92. package/src/sap/fe/core/converters/controls/Common/Chart.js +37 -33
  93. package/src/sap/fe/core/converters/controls/Common/Chart.ts +64 -46
  94. package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +15 -4
  95. package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +31 -15
  96. package/src/sap/fe/core/converters/controls/Common/Form.js +6 -4
  97. package/src/sap/fe/core/converters/controls/Common/Form.ts +23 -11
  98. package/src/sap/fe/core/converters/controls/Common/KPI.js +5 -3
  99. package/src/sap/fe/core/converters/controls/Common/KPI.ts +17 -11
  100. package/src/sap/fe/core/converters/controls/Common/Table.js +197 -101
  101. package/src/sap/fe/core/converters/controls/Common/Table.ts +393 -182
  102. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +4 -5
  103. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +38 -27
  104. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +41 -11
  105. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +112 -45
  106. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +7 -7
  107. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +18 -12
  108. package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.js +1 -1
  109. package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.ts +5 -4
  110. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +1 -1
  111. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.ts +19 -9
  112. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +64 -63
  113. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +109 -100
  114. package/src/sap/fe/core/converters/helpers/Aggregation.js +12 -11
  115. package/src/sap/fe/core/converters/helpers/Aggregation.ts +35 -30
  116. package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +4 -1
  117. package/src/sap/fe/core/converters/helpers/ConfigurableObject.ts +12 -9
  118. package/src/sap/fe/core/converters/helpers/DataFieldHelper.js +1 -1
  119. package/src/sap/fe/core/converters/helpers/DataFieldHelper.ts +1 -1
  120. package/src/sap/fe/core/converters/helpers/ID.js +1 -1
  121. package/src/sap/fe/core/converters/helpers/ID.ts +6 -6
  122. package/src/sap/fe/core/converters/helpers/InsightsHelpers.js +3 -3
  123. package/src/sap/fe/core/converters/helpers/InsightsHelpers.ts +11 -6
  124. package/src/sap/fe/core/converters/helpers/Key.js +2 -2
  125. package/src/sap/fe/core/converters/helpers/Key.ts +4 -4
  126. package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.js +1 -1
  127. package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.ts +2 -2
  128. package/src/sap/fe/core/converters/objectPage/FormMenuActions.js +21 -19
  129. package/src/sap/fe/core/converters/objectPage/FormMenuActions.ts +43 -31
  130. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +1 -1
  131. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +16 -12
  132. package/src/sap/fe/core/converters/templates/ListReportConverter.js +8 -3
  133. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +41 -21
  134. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +5 -3
  135. package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +24 -19
  136. package/src/sap/fe/core/designtime/AppComponent.designtime.js +3 -2
  137. package/src/sap/fe/core/designtime/AppComponent.designtime.ts +2 -1
  138. package/src/sap/fe/core/filter/DraftEditState.fragment.xml +1 -1
  139. package/src/sap/fe/core/formatters/CollaborationFormatter.js +4 -6
  140. package/src/sap/fe/core/formatters/CollaborationFormatter.ts +5 -4
  141. package/src/sap/fe/core/formatters/FPMFormatter.js +5 -13
  142. package/src/sap/fe/core/formatters/FPMFormatter.ts +11 -10
  143. package/src/sap/fe/core/formatters/FiscalFormat.js +1 -1
  144. package/src/sap/fe/core/formatters/FiscalFormat.ts +1 -1
  145. package/src/sap/fe/core/formatters/KPIFormatter.js +4 -7
  146. package/src/sap/fe/core/formatters/KPIFormatter.ts +3 -3
  147. package/src/sap/fe/core/formatters/StandardFormatter.js +4 -7
  148. package/src/sap/fe/core/formatters/StandardFormatter.ts +3 -3
  149. package/src/sap/fe/core/formatters/ValueFormatter.js +35 -6
  150. package/src/sap/fe/core/formatters/ValueFormatter.ts +31 -3
  151. package/src/sap/fe/core/fpm/manifest.json +1 -1
  152. package/src/sap/fe/core/helpers/AppStartupHelper.js +54 -33
  153. package/src/sap/fe/core/helpers/AppStartupHelper.ts +62 -41
  154. package/src/sap/fe/core/helpers/BindingToolkit.js +17 -3
  155. package/src/sap/fe/core/helpers/BindingToolkit.ts +28 -6
  156. package/src/sap/fe/core/helpers/ClassSupport.js +32 -13
  157. package/src/sap/fe/core/helpers/ClassSupport.ts +35 -15
  158. package/src/sap/fe/core/helpers/DeleteHelper.js +71 -61
  159. package/src/sap/fe/core/helpers/DeleteHelper.ts +125 -103
  160. package/src/sap/fe/core/helpers/DraftEditState.js +5 -3
  161. package/src/sap/fe/core/helpers/DraftEditState.ts +3 -1
  162. package/src/sap/fe/core/helpers/FPMHelper.js +43 -46
  163. package/src/sap/fe/core/helpers/FPMHelper.ts +50 -56
  164. package/src/sap/fe/core/helpers/MetaModelFunction.js +77 -53
  165. package/src/sap/fe/core/helpers/MetaModelFunction.ts +78 -57
  166. package/src/sap/fe/core/helpers/ModelHelper.js +10 -4
  167. package/src/sap/fe/core/helpers/ModelHelper.ts +12 -6
  168. package/src/sap/fe/core/helpers/PasteHelper.js +194 -7
  169. package/src/sap/fe/core/helpers/PasteHelper.ts +265 -13
  170. package/src/sap/fe/core/helpers/PromiseKeeper.js +66 -0
  171. package/src/sap/fe/core/helpers/PromiseKeeper.ts +56 -0
  172. package/src/sap/fe/core/helpers/SemanticKeyHelper.js +30 -19
  173. package/src/sap/fe/core/helpers/SemanticKeyHelper.ts +34 -22
  174. package/src/sap/fe/core/helpers/StableIdHelper.js +1 -1
  175. package/src/sap/fe/core/helpers/StableIdHelper.ts +7 -2
  176. package/src/sap/fe/core/helpers/StandardRecommendationHelper.js +26 -52
  177. package/src/sap/fe/core/helpers/StandardRecommendationHelper.ts +37 -63
  178. package/src/sap/fe/core/helpers/TitleHelper.js +1 -1
  179. package/src/sap/fe/core/helpers/TitleHelper.ts +17 -14
  180. package/src/sap/fe/core/helpers/TypeGuards.js +27 -3
  181. package/src/sap/fe/core/helpers/TypeGuards.ts +37 -7
  182. package/src/sap/fe/core/jsx-runtime/jsx-xml.js +48 -8
  183. package/src/sap/fe/core/jsx-runtime/jsx-xml.ts +40 -9
  184. package/src/sap/fe/core/library.js +1 -1
  185. package/src/sap/fe/core/messagebundle.properties +5 -2
  186. package/src/sap/fe/core/messagebundle_da.properties +1 -1
  187. package/src/sap/fe/core/messagebundle_en.properties +267 -2
  188. package/src/sap/fe/core/messagebundle_sl.properties +1 -1
  189. package/src/sap/fe/core/operationsHelper.js +2 -1
  190. package/src/sap/fe/core/operationsHelper.ts +1 -0
  191. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +3 -3
  192. package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +2 -2
  193. package/src/sap/fe/core/services/NavigationServiceFactory.js +2 -2
  194. package/src/sap/fe/core/services/NavigationServiceFactory.ts +3 -2
  195. package/src/sap/fe/core/services/RoutingServiceFactory.js +27 -14
  196. package/src/sap/fe/core/services/RoutingServiceFactory.ts +27 -14
  197. package/src/sap/fe/core/services/ShellServicesFactory.js +49 -12
  198. package/src/sap/fe/core/services/ShellServicesFactory.ts +62 -13
  199. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +156 -82
  200. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +218 -100
  201. package/src/sap/fe/core/services/TelemetryServiceFactory.js +3 -3
  202. package/src/sap/fe/core/services/TelemetryServiceFactory.ts +6 -6
  203. package/src/sap/fe/core/services/ValueHelpHistoryServiceFactory.js +3 -2
  204. package/src/sap/fe/core/services/ValueHelpHistoryServiceFactory.ts +1 -1
  205. package/src/sap/fe/core/services/collaborativeDraftServiceFactory.js +1 -1
  206. package/src/sap/fe/core/services/collaborativeDraftServiceFactory.ts +2 -2
  207. package/src/sap/fe/core/services/view/TemplatingErrorPage.view.xml +1 -1
  208. package/src/sap/fe/core/templating/CommonFormatters.js +6 -3
  209. package/src/sap/fe/core/templating/CommonFormatters.ts +13 -12
  210. package/src/sap/fe/core/templating/CriticalityFormatters.js +2 -2
  211. package/src/sap/fe/core/templating/CriticalityFormatters.ts +37 -14
  212. package/src/sap/fe/core/templating/DataFieldFormatters.js +12 -11
  213. package/src/sap/fe/core/templating/DataFieldFormatters.ts +35 -24
  214. package/src/sap/fe/core/templating/DataModelPathHelper.js +22 -18
  215. package/src/sap/fe/core/templating/DataModelPathHelper.ts +61 -51
  216. package/src/sap/fe/core/templating/DisplayModeFormatter.js +1 -1
  217. package/src/sap/fe/core/templating/DisplayModeFormatter.ts +8 -3
  218. package/src/sap/fe/core/templating/EntityTypeHelper.js +1 -1
  219. package/src/sap/fe/core/templating/EntityTypeHelper.ts +1 -1
  220. package/src/sap/fe/core/templating/FieldControlHelper.js +3 -3
  221. package/src/sap/fe/core/templating/FieldControlHelper.ts +27 -8
  222. package/src/sap/fe/core/templating/FilterHelper.js +13 -10
  223. package/src/sap/fe/core/templating/FilterHelper.ts +80 -46
  224. package/src/sap/fe/core/templating/FilterTemplating.js +1 -1
  225. package/src/sap/fe/core/templating/FilterTemplating.ts +2 -2
  226. package/src/sap/fe/core/templating/PropertyFormatters.js +6 -8
  227. package/src/sap/fe/core/templating/PropertyFormatters.ts +11 -11
  228. package/src/sap/fe/core/templating/PropertyHelper.js +3 -3
  229. package/src/sap/fe/core/templating/PropertyHelper.ts +4 -4
  230. package/src/sap/fe/core/templating/SemanticObjectHelper.js +157 -13
  231. package/src/sap/fe/core/templating/SemanticObjectHelper.ts +182 -16
  232. package/src/sap/fe/core/templating/UIFormatters.js +23 -22
  233. package/src/sap/fe/core/templating/UIFormatters.ts +94 -66
  234. package/src/sap/fe/core/type/DateTimeWithTimezone.js +1 -1
  235. package/src/sap/fe/core/type/DateTimeWithTimezone.ts +2 -2
  236. package/src/sap/fe/core/type/EDM.js +1 -1
  237. package/src/sap/fe/core/type/EDM.ts +2 -2
  238. package/src/sap/fe/core/type/Email.js +1 -1
  239. package/src/sap/fe/core/type/Email.ts +1 -1
  240. package/src/sap/fe/core/type/FiscalDate.js +2 -2
  241. package/src/sap/fe/core/type/FiscalDate.ts +2 -2
@@ -270,11 +270,17 @@ sap.ui.define(["sap/fe/core/helpers/TypeGuards", "sap/fe/core/templating/Display
270
270
  * @param relatedProperties
271
271
  * @param key The property path
272
272
  * @param value The properties object containing value property, description property...
273
+ * @param displayModeOfPropertyUsedAsDescription The display mode if the property is referenced as description on text arrangement
273
274
  * @returns Index at which the property is available
274
275
  */
275
- function _setPropertyInRelatedPropertiesAndGetIndex(relatedProperties, key, value) {
276
+ function _setRelatedPropertiesAndGetIndex(relatedProperties, key, value, displayModeOfPropertyUsedAsDescription) {
276
277
  if (!relatedProperties.properties.hasOwnProperty(key)) {
277
- relatedProperties.properties[key] = value;
278
+ relatedProperties.properties[key] = {
279
+ annotationProperty: value
280
+ };
281
+ if (displayModeOfPropertyUsedAsDescription) {
282
+ relatedProperties.properties[key].displayModeOfPropertyUsedAsDescription = displayModeOfPropertyUsedAsDescription;
283
+ }
278
284
  }
279
285
  return Object.keys(relatedProperties.properties).indexOf(key);
280
286
  }
@@ -307,8 +313,7 @@ sap.ui.define(["sap/fe/core/helpers/TypeGuards", "sap/fe/core/templating/Display
307
313
  let relatedProperties = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {
308
314
  properties: {},
309
315
  additionalProperties: {},
310
- exportSettings: {},
311
- textOnlyPropertiesFromTextAnnotation: []
316
+ exportSettings: {}
312
317
  };
313
318
  let addUnitInTemplate = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : false;
314
319
  let isAnnotatedAsHidden = arguments.length > 7 && arguments[7] !== undefined ? arguments[7] : false;
@@ -318,7 +323,7 @@ sap.ui.define(["sap/fe/core/helpers/TypeGuards", "sap/fe/core/templating/Display
318
323
  let currencyOrUoMIndex;
319
324
  if (isAnnotatedAsHidden) {
320
325
  // Collect underlying property
321
- valueIndex = _setPropertyInRelatedPropertiesAndGetIndex(relatedProperties, path, property);
326
+ valueIndex = _setRelatedPropertiesAndGetIndex(relatedProperties, path, property);
322
327
  _appendTemplate(relatedProperties, `{${valueIndex}}`);
323
328
  return relatedProperties;
324
329
  }
@@ -343,39 +348,37 @@ sap.ui.define(["sap/fe/core/helpers/TypeGuards", "sap/fe/core/templating/Display
343
348
  const displayMode = getDisplayMode(property, propertyDataModelObjectPath);
344
349
  let descriptionIndex;
345
350
  switch (displayMode) {
346
- case "Value":
347
- valueIndex = _setPropertyInRelatedPropertiesAndGetIndex(relatedProperties, path, property);
348
- _appendTemplate(relatedProperties, `{${valueIndex}}`);
349
- break;
350
351
  case "Description":
351
- descriptionIndex = _setPropertyInRelatedPropertiesAndGetIndex(relatedProperties, textRelativePath, textProperty);
352
+ descriptionIndex = _setRelatedPropertiesAndGetIndex(relatedProperties, textRelativePath, textProperty, "Description");
352
353
  _appendTemplate(relatedProperties, `{${descriptionIndex}}`);
353
- relatedProperties.textOnlyPropertiesFromTextAnnotation.push(textRelativePath);
354
354
  break;
355
355
  case "ValueDescription":
356
- valueIndex = _setPropertyInRelatedPropertiesAndGetIndex(relatedProperties, path, property);
357
- descriptionIndex = _setPropertyInRelatedPropertiesAndGetIndex(relatedProperties, textRelativePath, textProperty);
356
+ valueIndex = _setRelatedPropertiesAndGetIndex(relatedProperties, path, property);
357
+ descriptionIndex = _setRelatedPropertiesAndGetIndex(relatedProperties, textRelativePath, textProperty, "ValueDescription");
358
358
  _appendTemplate(relatedProperties, `{${valueIndex}} ({${descriptionIndex}})`);
359
359
  break;
360
360
  case "DescriptionValue":
361
- valueIndex = _setPropertyInRelatedPropertiesAndGetIndex(relatedProperties, path, property);
362
- descriptionIndex = _setPropertyInRelatedPropertiesAndGetIndex(relatedProperties, textRelativePath, textProperty);
361
+ valueIndex = _setRelatedPropertiesAndGetIndex(relatedProperties, path, property);
362
+ descriptionIndex = _setRelatedPropertiesAndGetIndex(relatedProperties, textRelativePath, textProperty, "DescriptionValue");
363
363
  _appendTemplate(relatedProperties, `{${descriptionIndex}} ({${valueIndex}})`);
364
364
  break;
365
- // no default
365
+ default:
366
+ valueIndex = _setRelatedPropertiesAndGetIndex(relatedProperties, path, property);
367
+ _appendTemplate(relatedProperties, `{${valueIndex}}`);
368
+ break;
366
369
  }
367
370
  } else {
368
371
  var _property$annotations14, _property$annotations15, _property$annotations16, _property$annotations17, _property$annotations18, _property$annotations19, _property$Target, _property$Target$$tar, _property$Target2, _property$Target2$$ta, _property$annotations20, _property$annotations21, _property$annotations22, _property$annotations23, _property$annotations24;
369
372
  // Check for field containing Currency Or Unit Properties or Timezone
370
373
  const currencyProperty = getAssociatedCurrencyProperty(property);
371
374
  const unitProperty = getAssociatedUnitProperty(property);
372
- const currencyOrUoMProperty = currencyProperty || unitProperty;
375
+ const currencyOrUoMProperty = currencyProperty ?? unitProperty;
373
376
  const currencyOrUnitAnnotation = (property === null || property === void 0 ? void 0 : (_property$annotations14 = property.annotations) === null || _property$annotations14 === void 0 ? void 0 : (_property$annotations15 = _property$annotations14.Measures) === null || _property$annotations15 === void 0 ? void 0 : _property$annotations15.ISOCurrency) || (property === null || property === void 0 ? void 0 : (_property$annotations16 = property.annotations) === null || _property$annotations16 === void 0 ? void 0 : (_property$annotations17 = _property$annotations16.Measures) === null || _property$annotations17 === void 0 ? void 0 : _property$annotations17.Unit);
374
377
  const timezoneProperty = getAssociatedTimezoneProperty(property);
375
378
  const timezoneAnnotation = property === null || property === void 0 ? void 0 : (_property$annotations18 = property.annotations) === null || _property$annotations18 === void 0 ? void 0 : (_property$annotations19 = _property$annotations18.Common) === null || _property$annotations19 === void 0 ? void 0 : _property$annotations19.Timezone;
376
379
  if (currencyOrUoMProperty) {
377
- valueIndex = _setPropertyInRelatedPropertiesAndGetIndex(relatedProperties, path, property);
378
- currencyOrUoMIndex = _setPropertyInRelatedPropertiesAndGetIndex(relatedProperties, navigationPathPrefix + currencyOrUnitAnnotation.path, currencyOrUnitAnnotation.$target);
380
+ valueIndex = _setRelatedPropertiesAndGetIndex(relatedProperties, path, property);
381
+ currencyOrUoMIndex = _setRelatedPropertiesAndGetIndex(relatedProperties, navigationPathPrefix + currencyOrUnitAnnotation.path, currencyOrUnitAnnotation.$target);
379
382
  if (addUnitInTemplate) {
380
383
  _appendTemplate(relatedProperties, `{${valueIndex}} {${currencyOrUoMIndex}}`);
381
384
  } else {
@@ -392,11 +395,11 @@ sap.ui.define(["sap/fe/core/helpers/TypeGuards", "sap/fe/core/templating/Display
392
395
  var _property$fn, _property$fn2;
393
396
  const contactProperty = (_property$fn = property.fn) === null || _property$fn === void 0 ? void 0 : _property$fn.$target;
394
397
  const contactPropertyPath = (_property$fn2 = property.fn) === null || _property$fn2 === void 0 ? void 0 : _property$fn2.path;
395
- valueIndex = _setPropertyInRelatedPropertiesAndGetIndex(relatedProperties, navigationPathPrefix ? navigationPathPrefix + contactPropertyPath : contactPropertyPath, contactProperty);
398
+ valueIndex = _setRelatedPropertiesAndGetIndex(relatedProperties, navigationPathPrefix ? navigationPathPrefix + contactPropertyPath : contactPropertyPath, contactProperty);
396
399
  _appendTemplate(relatedProperties, `{${valueIndex}}`);
397
400
  } else if (!ignoreSelf) {
398
401
  // Collect underlying property
399
- valueIndex = _setPropertyInRelatedPropertiesAndGetIndex(relatedProperties, path, property);
402
+ valueIndex = _setRelatedPropertiesAndGetIndex(relatedProperties, path, property);
400
403
  _appendTemplate(relatedProperties, `{${valueIndex}}`);
401
404
  if (currencyOrUnitAnnotation) {
402
405
  var _property$annotations25, _property$annotations26;
@@ -414,7 +417,7 @@ sap.ui.define(["sap/fe/core/helpers/TypeGuards", "sap/fe/core/templating/Display
414
417
  if (Object.keys(relatedProperties.additionalProperties).length > 0 && Object.keys(relatedProperties.properties).length === 0) {
415
418
  // Collect underlying property if not collected already.
416
419
  // This is to ensure that additionalProperties are made available only to complex property infos.
417
- valueIndex = _setPropertyInRelatedPropertiesAndGetIndex(relatedProperties, path, property);
420
+ valueIndex = _setRelatedPropertiesAndGetIndex(relatedProperties, path, property);
418
421
  _appendTemplate(relatedProperties, `{${valueIndex}}`);
419
422
  }
420
423
  }
@@ -454,7 +457,7 @@ sap.ui.define(["sap/fe/core/helpers/TypeGuards", "sap/fe/core/templating/Display
454
457
  const navigationPathPrefix = _getNavigationPathPrefix(path);
455
458
  // DataPoint use-case using DataFieldDefault.
456
459
  const dataPointDefaultProperty = (_property$annotations27 = property.annotations) === null || _property$annotations27 === void 0 ? void 0 : (_property$annotations28 = _property$annotations27.UI) === null || _property$annotations28 === void 0 ? void 0 : _property$annotations28.DataFieldDefault;
457
- const valueIndex = _setPropertyInRelatedPropertiesAndGetIndex(relatedProperties, navigationPathPrefix ? navigationPathPrefix + path : path, dataPointDefaultProperty ? property : dataPointProperty);
460
+ const valueIndex = _setRelatedPropertiesAndGetIndex(relatedProperties, navigationPathPrefix ? navigationPathPrefix + path : path, dataPointDefaultProperty ? property : dataPointProperty);
458
461
  // If we have a DataPoint without visualization, or a Number, we don't have a TargetValue/MaximumValue
459
462
  if (getDataPointVisualization(dataPointDefaultProperty ? property : datapointTarget) === "UI.VisualizationType/Number") {
460
463
  return;
@@ -463,7 +466,7 @@ sap.ui.define(["sap/fe/core/helpers/TypeGuards", "sap/fe/core/templating/Display
463
466
  if (isPathAnnotationExpression(targetValue)) {
464
467
  if (targetValue.$target) {
465
468
  //in case it's a dynamic targetValue
466
- const dataPointIndex = _setPropertyInRelatedPropertiesAndGetIndex(relatedProperties, navigationPathPrefix ? navigationPathPrefix + targetValue.$target.name : targetValue.$target.name, targetValue.$target);
469
+ const dataPointIndex = _setRelatedPropertiesAndGetIndex(relatedProperties, navigationPathPrefix ? navigationPathPrefix + targetValue.$target.name : targetValue.$target.name, targetValue.$target);
467
470
  relatedProperties.exportSettings.dataPointTargetValue = targetValue.path;
468
471
  _appendTemplate(relatedProperties, `{${valueIndex}}/{${dataPointIndex}}`);
469
472
  }
@@ -487,8 +490,8 @@ sap.ui.define(["sap/fe/core/helpers/TypeGuards", "sap/fe/core/templating/Display
487
490
  function collectTimezoneProperties(property, relatedProperties, path, addUnitInTemplate) {
488
491
  const timezoneAnnotation = property.annotations.Common.Timezone;
489
492
  const navigationPathPrefix = _getNavigationPathPrefix(path);
490
- const valueIndex = _setPropertyInRelatedPropertiesAndGetIndex(relatedProperties, path, property);
491
- const timezoneOrUoMIndex = _setPropertyInRelatedPropertiesAndGetIndex(relatedProperties, navigationPathPrefix + timezoneAnnotation.path, timezoneAnnotation.$target);
493
+ const valueIndex = _setRelatedPropertiesAndGetIndex(relatedProperties, path, property);
494
+ const timezoneOrUoMIndex = _setRelatedPropertiesAndGetIndex(relatedProperties, navigationPathPrefix + timezoneAnnotation.path, timezoneAnnotation.$target);
492
495
  if (addUnitInTemplate) {
493
496
  _appendTemplate(relatedProperties, `{${valueIndex}} {${timezoneOrUoMIndex}}`);
494
497
  } else {
@@ -512,7 +515,6 @@ sap.ui.define(["sap/fe/core/helpers/TypeGuards", "sap/fe/core/templating/Display
512
515
  let relatedProperties = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {
513
516
  properties: {},
514
517
  additionalProperties: {},
515
- textOnlyPropertiesFromTextAnnotation: [],
516
518
  exportSettings: {}
517
519
  };
518
520
  let isEmbedded = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;
@@ -605,4 +607,4 @@ sap.ui.define(["sap/fe/core/helpers/TypeGuards", "sap/fe/core/templating/Display
605
607
  _exports.getDataFieldDataType = getDataFieldDataType;
606
608
  return _exports;
607
609
  }, false);
608
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJpc0RhdGFGaWVsZEZvckFjdGlvbkFic3RyYWN0IiwiZGF0YUZpZWxkIiwiaGFzT3duUHJvcGVydHkiLCJpc0RhdGFGaWVsZEZvckFubm90YXRpb24iLCIkVHlwZSIsImlzRGF0YUZpZWxkRm9yQWN0aW9uIiwiaXNEYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb24iLCJpc0RhdGFGaWVsZFR5cGVzIiwiaXNEYXRhRmllbGQiLCJoYXNGaWVsZEdyb3VwVGFyZ2V0IiwiZGF0YUZpZWxkRm9yQW5ub3RhdGlvbiIsImRhdGFGaWVsZFRhcmdldCIsIlRhcmdldCIsIiR0YXJnZXQiLCJpc0Fubm90YXRpb25PZlR5cGUiLCJoYXNEYXRhUG9pbnRUYXJnZXQiLCJpc0RhdGFNb2RlbE9iamVjdFBhdGhGb3JBY3Rpb25XaXRoRGlhbG9nIiwiZGF0YU1vZGVsT2JqZWN0UGF0aCIsInRhcmdldCIsInRhcmdldE9iamVjdCIsImlzQWN0aW9uV2l0aERpYWxvZyIsInVuZGVmaW5lZCIsImFjdGlvbiIsIkFjdGlvblRhcmdldCIsImJDcml0aWNhbCIsImFubm90YXRpb25zIiwiQ29tbW9uIiwiSXNBY3Rpb25Dcml0aWNhbCIsInBhcmFtZXRlcnMiLCJsZW5ndGgiLCJnZXRUYXJnZXRWYWx1ZU9uRGF0YVBvaW50Iiwic291cmNlIiwidGFyZ2V0VmFsdWUiLCJpc1Byb3BlcnR5IiwiZGF0YVBvaW50IiwiVUkiLCJEYXRhRmllbGREZWZhdWx0IiwiVGFyZ2V0VmFsdWUiLCJNYXhpbXVtVmFsdWUiLCJ0b1N0cmluZyIsImlzUGF0aEFubm90YXRpb25FeHByZXNzaW9uIiwiaXNEYXRhUG9pbnRGcm9tRGF0YUZpZWxkRGVmYXVsdCIsInByb3BlcnR5IiwiaXNSYXRpbmdWaXN1YWxpemF0aW9uRnJvbURhdGFGaWVsZERlZmF1bHQiLCJWaXN1YWxpemF0aW9uIiwiaXNBUHJvZ3Jlc3NUeXBlRnJvbURhdGFQb2ludCIsImdldFNlbWFudGljT2JqZWN0UGF0aCIsImNvbnZlcnRlckNvbnRleHQiLCJvYmplY3QiLCJWYWx1ZSIsIlNlbWFudGljT2JqZWN0IiwiZ2V0RW50aXR5U2V0QmFzZWRBbm5vdGF0aW9uUGF0aCIsImZ1bGx5UXVhbGlmaWVkTmFtZSIsIl9nZXROYXZpZ2F0aW9uUGF0aFByZWZpeCIsInBhdGgiLCJpbmNsdWRlcyIsInN1YnN0cmluZyIsImxhc3RJbmRleE9mIiwiX2NvbGxlY3RBZGRpdGlvbmFsUHJvcGVydGllc0ZvckFuYWx5dGljYWxUYWJsZSIsIm5hdmlnYXRpb25QYXRoUHJlZml4IiwidGFibGVUeXBlIiwicmVsYXRlZFByb3BlcnRpZXMiLCJoaWRkZW5Bbm5vdGF0aW9uIiwiSGlkZGVuIiwiaGlkZGVuQW5ub3RhdGlvblByb3BlcnR5UGF0aCIsImFkZGl0aW9uYWxQcm9wZXJ0aWVzIiwiY3JpdGljYWxpdHkiLCJDcml0aWNhbGl0eSIsImNyaXRpY2FsaXR5UHJvcGVydHlQYXRoIiwiX3NldFByb3BlcnR5SW5SZWxhdGVkUHJvcGVydGllc0FuZEdldEluZGV4Iiwia2V5IiwidmFsdWUiLCJwcm9wZXJ0aWVzIiwiT2JqZWN0Iiwia2V5cyIsImluZGV4T2YiLCJfYXBwZW5kVGVtcGxhdGUiLCJleHBvcnRTZXR0aW5ncyIsInRlbXBsYXRlIiwiY29sbGVjdFJlbGF0ZWRQcm9wZXJ0aWVzIiwiaWdub3JlU2VsZiIsInRleHRPbmx5UHJvcGVydGllc0Zyb21UZXh0QW5ub3RhdGlvbiIsImFkZFVuaXRJblRlbXBsYXRlIiwiaXNBbm5vdGF0ZWRBc0hpZGRlbiIsInZhbHVlSW5kZXgiLCJjdXJyZW5jeU9yVW9NSW5kZXgiLCJ0ZXh0UHJvcGVydHlQYXRoIiwiZ2V0QXNzb2NpYXRlZFRleHRQcm9wZXJ0eVBhdGgiLCJ0ZXh0UHJvcGVydHkiLCJnZXRBc3NvY2lhdGVkVGV4dFByb3BlcnR5IiwiZ2V0Q29udmVydGVyQ29udGV4dEZvciIsImdldENvbnRleHRQYXRoIiwiZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCIsInByb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aCIsImVuaGFuY2VEYXRhTW9kZWxQYXRoIiwidGV4dFByb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aCIsInRleHRSZWxhdGl2ZVBhdGgiLCJnZXRDb250ZXh0UmVsYXRpdmVUYXJnZXRPYmplY3RQYXRoIiwid3JhcCIsImRpc3BsYXlNb2RlIiwiZ2V0RGlzcGxheU1vZGUiLCJkZXNjcmlwdGlvbkluZGV4IiwicHVzaCIsImN1cnJlbmN5UHJvcGVydHkiLCJnZXRBc3NvY2lhdGVkQ3VycmVuY3lQcm9wZXJ0eSIsInVuaXRQcm9wZXJ0eSIsImdldEFzc29jaWF0ZWRVbml0UHJvcGVydHkiLCJjdXJyZW5jeU9yVW9NUHJvcGVydHkiLCJjdXJyZW5jeU9yVW5pdEFubm90YXRpb24iLCJNZWFzdXJlcyIsIklTT0N1cnJlbmN5IiwiVW5pdCIsInRpbWV6b25lUHJvcGVydHkiLCJnZXRBc3NvY2lhdGVkVGltZXpvbmVQcm9wZXJ0eSIsInRpbWV6b25lQW5ub3RhdGlvbiIsIlRpbWV6b25lIiwiaXNDdXJyZW5jeSIsImNvbGxlY3RUaW1lem9uZVByb3BlcnRpZXMiLCJWYWx1ZUZvcm1hdCIsImNvbGxlY3REYXRhUG9pbnRQcm9wZXJ0aWVzIiwiY29udGFjdFByb3BlcnR5IiwiZm4iLCJjb250YWN0UHJvcGVydHlQYXRoIiwidW5pdCIsInRpbWV6b25lIiwiZ2V0RGF0YVBvaW50VmlzdWFsaXphdGlvbiIsImRhdGFQb2ludFByb3BlcnR5IiwiZGF0YXBvaW50VGFyZ2V0IiwiZGF0YVBvaW50RGVmYXVsdFByb3BlcnR5IiwiZGF0YVBvaW50SW5kZXgiLCJuYW1lIiwiZGF0YVBvaW50VGFyZ2V0VmFsdWUiLCJoYXNTdGF0aWNQZXJjZW50VW5pdCIsInRpbWV6b25lT3JVb01JbmRleCIsImNvbGxlY3RSZWxhdGVkUHJvcGVydGllc1JlY3Vyc2l2ZWx5IiwiaXNFbWJlZGRlZCIsImlzU3RhdGljYWxseUhpZGRlbiIsImlzUmVmZXJlbmNlUHJvcGVydHlTdGF0aWNhbGx5SGlkZGVuIiwiRGF0YSIsImZvckVhY2giLCJpbm5lckRhdGFGaWVsZCIsImRhdGFGaWVsZENvbnRhY3QiLCJnZXREYXRhRmllbGREYXRhVHlwZSIsIm9EYXRhRmllbGQiLCJ0eXBlIiwic0RhdGFUeXBlIiwiJFBhdGgiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIkRhdGFGaWVsZC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEFubm90YXRpb25UZXJtLCBEZWNpbWFsLCBQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb24sIFByaW1pdGl2ZVR5cGUsIFByb3BlcnR5IH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IENvbnRhY3QgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL0NvbW11bmljYXRpb25cIjtcbmltcG9ydCB7IENvbW11bmljYXRpb25Bbm5vdGF0aW9uVHlwZXMgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL0NvbW11bmljYXRpb25cIjtcbmltcG9ydCB0eXBlIHtcblx0RGF0YUZpZWxkLFxuXHREYXRhRmllbGRBYnN0cmFjdFR5cGVzLFxuXHREYXRhRmllbGRGb3JBY3Rpb24sXG5cdERhdGFGaWVsZEZvckFjdGlvbkFic3RyYWN0VHlwZXMsXG5cdERhdGFGaWVsZEZvckFubm90YXRpb24sXG5cdERhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbixcblx0RGF0YUZpZWxkVHlwZXMsXG5cdERhdGFQb2ludCxcblx0RGF0YVBvaW50VHlwZSxcblx0RmllbGRHcm91cFxufSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL1VJXCI7XG5pbXBvcnQgeyBVSUFubm90YXRpb25UeXBlcywgVmlzdWFsaXphdGlvblR5cGUgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL1VJXCI7XG5pbXBvcnQgdHlwZSB7IENvbHVtbkV4cG9ydFNldHRpbmdzLCBUYWJsZVR5cGUgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9jb250cm9scy9Db21tb24vVGFibGVcIjtcbmltcG9ydCB7IGlzQW5ub3RhdGlvbk9mVHlwZSwgaXNQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb24sIGlzUHJvcGVydHkgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9UeXBlR3VhcmRzXCI7XG5pbXBvcnQgeyBnZXREaXNwbGF5TW9kZSB9IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL0Rpc3BsYXlNb2RlRm9ybWF0dGVyXCI7XG5pbXBvcnQge1xuXHRnZXRBc3NvY2lhdGVkQ3VycmVuY3lQcm9wZXJ0eSxcblx0Z2V0QXNzb2NpYXRlZFRleHRQcm9wZXJ0eSxcblx0Z2V0QXNzb2NpYXRlZFRleHRQcm9wZXJ0eVBhdGgsXG5cdGdldEFzc29jaWF0ZWRUaW1lem9uZVByb3BlcnR5LFxuXHRnZXRBc3NvY2lhdGVkVW5pdFByb3BlcnR5LFxuXHRoYXNTdGF0aWNQZXJjZW50VW5pdFxufSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9Qcm9wZXJ0eUhlbHBlclwiO1xuaW1wb3J0IHsgZW5oYW5jZURhdGFNb2RlbFBhdGgsIGdldENvbnRleHRSZWxhdGl2ZVRhcmdldE9iamVjdFBhdGgsIHR5cGUgRGF0YU1vZGVsT2JqZWN0UGF0aCB9IGZyb20gXCIuLi8uLi90ZW1wbGF0aW5nL0RhdGFNb2RlbFBhdGhIZWxwZXJcIjtcbmltcG9ydCB0eXBlIENvbnZlcnRlckNvbnRleHQgZnJvbSBcIi4uL0NvbnZlcnRlckNvbnRleHRcIjtcbmltcG9ydCB7IGlzUmVmZXJlbmNlUHJvcGVydHlTdGF0aWNhbGx5SGlkZGVuIH0gZnJvbSBcIi4uL2hlbHBlcnMvRGF0YUZpZWxkSGVscGVyXCI7XG5cbmV4cG9ydCB0eXBlIENvbXBsZXhQcm9wZXJ0eUluZm8gPSB7XG5cdHByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIFByb3BlcnR5Pjtcblx0YWRkaXRpb25hbFByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIFByb3BlcnR5Pjtcblx0ZXhwb3J0U2V0dGluZ3M6IENvbHVtbkV4cG9ydFNldHRpbmdzO1xuXHR0ZXh0T25seVByb3BlcnRpZXNGcm9tVGV4dEFubm90YXRpb246IHN0cmluZ1tdO1xufTtcblxuLyoqXG4gKiBJZGVudGlmaWVzIGlmIHRoZSBnaXZlbiBkYXRhRmllbGRBYnN0cmFjdCB0aGF0IGlzIHBhc3NlZCBpcyBhIFwiRGF0YUZpZWxkRm9yQWN0aW9uQWJzdHJhY3RcIi5cbiAqIERhdGFGaWVsZEZvckFjdGlvbkFic3RyYWN0IGhhcyBhbiBpbmxpbmUgYWN0aW9uIGRlZmluZWQuXG4gKlxuICogQHBhcmFtIGRhdGFGaWVsZCBEYXRhRmllbGQgdG8gYmUgZXZhbHVhdGVkXG4gKiBAcmV0dXJucyBWYWxpZGF0ZXMgdGhhdCBkYXRhRmllbGQgaXMgYSBEYXRhRmllbGRGb3JBY3Rpb25BYnN0cmFjdFR5cGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRGF0YUZpZWxkRm9yQWN0aW9uQWJzdHJhY3QoZGF0YUZpZWxkOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzKTogZGF0YUZpZWxkIGlzIERhdGFGaWVsZEZvckFjdGlvbkFic3RyYWN0VHlwZXMge1xuXHRyZXR1cm4gKGRhdGFGaWVsZCBhcyBEYXRhRmllbGRGb3JBY3Rpb25BYnN0cmFjdFR5cGVzKS5oYXNPd25Qcm9wZXJ0eShcIkFjdGlvblwiKTtcbn1cblxuLyoqXG4gKiBJZGVudGlmaWVzIGlmIHRoZSBnaXZlbiBkYXRhRmllbGRBYnN0cmFjdCB0aGF0IGlzIHBhc3NlZCBpcyBhIFwiaXNEYXRhRmllbGRGb3JBbm5vdGF0aW9uXCIuXG4gKiBpc0RhdGFGaWVsZEZvckFubm90YXRpb24gaGFzIGFuIGlubGluZSAkVHlwZSBwcm9wZXJ0eSB0aGF0IGNhbiBiZSB1c2VkLlxuICpcbiAqIEBwYXJhbSBkYXRhRmllbGQgRGF0YUZpZWxkIHRvIGJlIGV2YWx1YXRlZFxuICogQHJldHVybnMgVmFsaWRhdGVzIHRoYXQgZGF0YUZpZWxkIGlzIGEgRGF0YUZpZWxkRm9yQW5ub3RhdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNEYXRhRmllbGRGb3JBbm5vdGF0aW9uKGRhdGFGaWVsZDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyB8IHVuZGVmaW5lZCk6IGRhdGFGaWVsZCBpcyBEYXRhRmllbGRGb3JBbm5vdGF0aW9uIHtcblx0cmV0dXJuIGRhdGFGaWVsZD8uJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFubm90YXRpb247XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0RhdGFGaWVsZEZvckFjdGlvbihkYXRhRmllbGQ6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMgfCB1bmRlZmluZWQpOiBkYXRhRmllbGQgaXMgRGF0YUZpZWxkRm9yQWN0aW9uIHtcblx0cmV0dXJuIGRhdGFGaWVsZD8uJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFjdGlvbjtcbn1cblxuLyoqXG4gKiBJZGVudGlmaWVzIGlmIHRoZSBnaXZlbiBkYXRhRmllbGRBYnN0cmFjdCB0aGF0IGlzIHBhc3NlZCBpcyBhIFwiRGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uXCIuXG4gKiBEYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb24gaGFzIGFuIGlubGluZSAkVHlwZSBwcm9wZXJ0eSB0aGF0IGNhbiBiZSB1c2VkLlxuICpcbiAqIEBwYXJhbSBkYXRhRmllbGQgRGF0YUZpZWxkIHRvIGJlIGV2YWx1YXRlZFxuICogQHJldHVybnMgVmFsaWRhdGVzIHRoYXQgZGF0YUZpZWxkIGlzIGEgRGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0RhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbihkYXRhRmllbGQ6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMpOiBkYXRhRmllbGQgaXMgRGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uIHtcblx0cmV0dXJuIGRhdGFGaWVsZC4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uO1xufVxuXG4vKipcbiAqIElkZW50aWZpZXMgaWYgdGhlIGdpdmVuIGRhdGFGaWVsZEFic3RyYWN0IHRoYXQgaXMgcGFzc2VkIGlzIGEgXCJEYXRhRmllbGRUeXBlc1wiLlxuICogRGF0YUZpZWxkIGhhcyBhIHZhbHVlIGRlZmluZWQuXG4gKlxuICogQHBhcmFtIGRhdGFGaWVsZCBEYXRhRmllbGQgdG8gYmUgZXZhbHVhdGVkXG4gKiBAcmV0dXJucyBWYWxpZGF0ZSB0aGF0IGRhdGFGaWVsZCBpcyBhIERhdGFGaWVsZFR5cGVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0RhdGFGaWVsZFR5cGVzKGRhdGFGaWVsZDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyB8IHVua25vd24pOiBkYXRhRmllbGQgaXMgRGF0YUZpZWxkVHlwZXMge1xuXHRyZXR1cm4gKGRhdGFGaWVsZCBhcyBEYXRhRmllbGRUeXBlcykuaGFzT3duUHJvcGVydHkoXCJWYWx1ZVwiKTtcbn1cblxuLyoqXG4gKiBJZGVudGlmaWVzIGlmIHRoZSBnaXZlbiBkYXRhRmllbGRBYnN0cmFjdCB0aGF0IGlzIHBhc3NlZCBpcyBhIFwiRGF0YUZpZWxkXCIuXG4gKiBEYXRhRmllbGQgaGFzIGEgdmFsdWUgZGVmaW5lZC5cbiAqXG4gKiBAcGFyYW0gZGF0YUZpZWxkIERhdGFGaWVsZCB0byBiZSBldmFsdWF0ZWRcbiAqIEByZXR1cm5zIFZhbGlkYXRlIHRoYXQgZGF0YUZpZWxkIGlzIGEgRGF0YUZpZWxkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0RhdGFGaWVsZChkYXRhRmllbGQ6IERhdGFGaWVsZCB8IHVua25vd24pOiBkYXRhRmllbGQgaXMgRGF0YUZpZWxkIHtcblx0cmV0dXJuIChkYXRhRmllbGQgYXMgRGF0YUZpZWxkKT8uaGFzT3duUHJvcGVydHkoXCJWYWx1ZVwiKTtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmVzIGlmIHRoZSBkYXRhRmllbGRGb3JBbm5vdGF0aW9uIGlzIGEgZmllbGQgZ3JvdXAuXG4gKlxuICogQHBhcmFtIGRhdGFGaWVsZEZvckFubm90YXRpb24gVGhlIGRhdGFGaWVsZEZvckFubm90YXRpb24gYmVpbmcgcHJvY2Vzc2VkXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBkYXRhRmllbGRGb3JBbm5vdGF0aW9uIGlzIGEgZmllbGQgZ3JvdXAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNGaWVsZEdyb3VwVGFyZ2V0KGRhdGFGaWVsZEZvckFubm90YXRpb246IERhdGFGaWVsZEZvckFubm90YXRpb24pOiBib29sZWFuIHtcblx0Y29uc3QgZGF0YUZpZWxkVGFyZ2V0ID0gZGF0YUZpZWxkRm9yQW5ub3RhdGlvbi5UYXJnZXQuJHRhcmdldDtcblx0cmV0dXJuIGlzQW5ub3RhdGlvbk9mVHlwZTxGaWVsZEdyb3VwPihkYXRhRmllbGRUYXJnZXQsIFVJQW5ub3RhdGlvblR5cGVzLkZpZWxkR3JvdXBUeXBlKTtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmVzIGlmIHRoZSBkYXRhRmllbGRGb3JBbm5vdGF0aW9uIGlzIGEgZGF0YSBwb2ludC5cbiAqXG4gKiBAcGFyYW0gZGF0YUZpZWxkRm9yQW5ub3RhdGlvbiBUaGUgZGF0YUZpZWxkRm9yQW5ub3RhdGlvbiBiZWluZyBwcm9jZXNzZWRcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGRhdGFGaWVsZEZvckFubm90YXRpb24gaXMgYSBkYXRhIHBvaW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzRGF0YVBvaW50VGFyZ2V0KGRhdGFGaWVsZEZvckFubm90YXRpb246IERhdGFGaWVsZEZvckFubm90YXRpb24pOiBib29sZWFuIHtcblx0Y29uc3QgZGF0YUZpZWxkVGFyZ2V0ID0gZGF0YUZpZWxkRm9yQW5ub3RhdGlvbi5UYXJnZXQuJHRhcmdldDtcblx0cmV0dXJuIGlzQW5ub3RhdGlvbk9mVHlwZTxEYXRhUG9pbnQ+KGRhdGFGaWVsZFRhcmdldCwgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YVBvaW50VHlwZSk7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIHRoZSBkYXRhIG1vZGVsIG9iamVjdCBwYXRoIHRhcmdldGluZyBhIGRhdGFGaWVsZCBmb3IgYWN0aW9uIG9wZW5zIHVwIGEgZGlhbG9nLlxuICpcbiAqIEBwYXJhbSBkYXRhTW9kZWxPYmplY3RQYXRoIERhdGFNb2RlbE9iamVjdFBhdGhcbiAqIEByZXR1cm5zIGBEaWFsb2dgIHwgYE5vbmVgIGlmIGEgZGlhbG9nIGlzIG5lZWRlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNEYXRhTW9kZWxPYmplY3RQYXRoRm9yQWN0aW9uV2l0aERpYWxvZyhkYXRhTW9kZWxPYmplY3RQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoKSB7XG5cdGNvbnN0IHRhcmdldCA9IGRhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0T2JqZWN0O1xuXHRyZXR1cm4gaXNBY3Rpb25XaXRoRGlhbG9nKGlzRGF0YUZpZWxkRm9yQWN0aW9uKHRhcmdldCkgPyB0YXJnZXQgOiB1bmRlZmluZWQpO1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiB0aGUgZGF0YUZpZWxkIGZvciBhY3Rpb24gb3BlbnMgdXAgYSBkaWFsb2cuXG4gKlxuICogQHBhcmFtIGRhdGFGaWVsZCBEYXRhRmllbGQgZm9yIGFjdGlvblxuICogQHJldHVybnMgYERpYWxvZ2AgfCBgTm9uZWAgaWYgYSBkaWFsb2cgaXMgbmVlZGVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0FjdGlvbldpdGhEaWFsb2coZGF0YUZpZWxkPzogRGF0YUZpZWxkRm9yQWN0aW9uKTogXCJEaWFsb2dcIiB8IFwiTm9uZVwiIHtcblx0Y29uc3QgYWN0aW9uID0gZGF0YUZpZWxkPy5BY3Rpb25UYXJnZXQ7XG5cdGlmIChhY3Rpb24pIHtcblx0XHRjb25zdCBiQ3JpdGljYWwgPSBhY3Rpb24uYW5ub3RhdGlvbnM/LkNvbW1vbj8uSXNBY3Rpb25Dcml0aWNhbDtcblx0XHRpZiAoYWN0aW9uLnBhcmFtZXRlcnMubGVuZ3RoID4gMSB8fCBiQ3JpdGljYWwpIHtcblx0XHRcdHJldHVybiBcIkRpYWxvZ1wiO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gXCJOb25lXCI7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBcIk5vbmVcIjtcblx0fVxufVxuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgVGFyZ2V0VmFsdWUgZnJvbSBhIERhdGFQb2ludC5cbiAqXG4gKiBAcGFyYW0gc291cmNlIFRoZSB0YXJnZXQgcHJvcGVydHkgb3IgRGF0YVBvaW50XG4gKiBAcmV0dXJucyBUaGUgVGFyZ2V0VmFsdWUgYXMgYSBkZWNpbWFsIG9yIGEgcHJvcGVydHkgcGF0aFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUYXJnZXRWYWx1ZU9uRGF0YVBvaW50KHNvdXJjZTogUHJvcGVydHkgfCBEYXRhUG9pbnRUeXBlKTogUGF0aEFubm90YXRpb25FeHByZXNzaW9uPHVua25vd24+IHwgc3RyaW5nIHtcblx0bGV0IHRhcmdldFZhbHVlOiBEZWNpbWFsIHwgdW5kZWZpbmVkIHwgUGF0aEFubm90YXRpb25FeHByZXNzaW9uPHVua25vd24+IHwgc3RyaW5nO1xuXHRpZiAoaXNQcm9wZXJ0eShzb3VyY2UpKSB7XG5cdFx0Y29uc3QgZGF0YVBvaW50ID0gKHNvdXJjZS5hbm5vdGF0aW9ucz8uVUk/LkRhdGFGaWVsZERlZmF1bHQgYXMgRGF0YUZpZWxkRm9yQW5ub3RhdGlvbik/LlRhcmdldD8uJHRhcmdldCBhcyBEYXRhUG9pbnRUeXBlO1xuXHRcdHRhcmdldFZhbHVlID0gZGF0YVBvaW50Py5UYXJnZXRWYWx1ZSA/PyBkYXRhUG9pbnQ/Lk1heGltdW1WYWx1ZTtcblx0fSBlbHNlIHtcblx0XHR0YXJnZXRWYWx1ZSA9IHNvdXJjZS5UYXJnZXRWYWx1ZSA/PyBzb3VyY2UuTWF4aW11bVZhbHVlO1xuXHR9XG5cdGlmICh0eXBlb2YgdGFyZ2V0VmFsdWUgPT09IFwibnVtYmVyXCIpIHtcblx0XHRyZXR1cm4gdGFyZ2V0VmFsdWUudG9TdHJpbmcoKTtcblx0fVxuXHRyZXR1cm4gaXNQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb24odGFyZ2V0VmFsdWUpID8gdGFyZ2V0VmFsdWUgOiBcIjEwMFwiO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIGEgcHJvcGVydHkgdXNlcyBhIERhdGFQb2ludCB3aXRoaW4gYSBEYXRhRmllbGREZWZhdWx0LlxuICpcbiAqIEBwYXJhbSBwcm9wZXJ0eSBUaGUgcHJvcGVydHkgdG8gYmUgY2hlY2tlZFxuICogQHJldHVybnMgYHRydWVgIGlmIHRoZSByZWZlcmVuY2VkIHByb3BlcnR5IGhhcyBhIERhdGFQb2ludCB3aXRoaW4gdGhlIERhdGFGaWVsZERlZmF1bHQsIGZhbHNlIGVsc2VcbiAqL1xuXG5leHBvcnQgY29uc3QgaXNEYXRhUG9pbnRGcm9tRGF0YUZpZWxkRGVmYXVsdCA9IGZ1bmN0aW9uIChwcm9wZXJ0eTogUHJvcGVydHkpOiBib29sZWFuIHtcblx0cmV0dXJuIChcblx0XHQocHJvcGVydHkuYW5ub3RhdGlvbnM/LlVJPy5EYXRhRmllbGREZWZhdWx0IGFzIERhdGFGaWVsZEZvckFubm90YXRpb24pPy5UYXJnZXQ/LiR0YXJnZXQ/LiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhUG9pbnRUeXBlXG5cdCk7XG59O1xuXG4vKipcbiAqIENoZWNrIGlmIGEgcHJvcGVydHkgdXNlcyBhIGRlZmF1bHQgdmlzdWFsaXphdGlvbiBSYXRpbmcgdGhyb3VnaCBhIERhdGFGaWVsZERlZmF1bHQuXG4gKlxuICogQHBhcmFtIHByb3BlcnR5IFRoZSBwcm9wZXJ0eSB0byBiZSBjaGVja2VkXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHZpc3VhbGl6YXRpb24gdGhyb3VnaCBhIERhdGFGaWVsZERlZmF1bHQgaXMgYSBSYXRpbmdcbiAqL1xuXG5leHBvcnQgY29uc3QgaXNSYXRpbmdWaXN1YWxpemF0aW9uRnJvbURhdGFGaWVsZERlZmF1bHQgPSBmdW5jdGlvbiAocHJvcGVydHk6IFByb3BlcnR5KTogYm9vbGVhbiB7XG5cdHJldHVybiAoXG5cdFx0aXNEYXRhUG9pbnRGcm9tRGF0YUZpZWxkRGVmYXVsdChwcm9wZXJ0eSkgJiZcblx0XHQoKHByb3BlcnR5LmFubm90YXRpb25zPy5VST8uRGF0YUZpZWxkRGVmYXVsdCBhcyBEYXRhRmllbGRGb3JBbm5vdGF0aW9uKT8uVGFyZ2V0Py4kdGFyZ2V0IGFzIEFubm90YXRpb25UZXJtPERhdGFQb2ludD4pXG5cdFx0XHQ/LlZpc3VhbGl6YXRpb24gPT09IFwiVUkuVmlzdWFsaXphdGlvblR5cGUvUmF0aW5nXCJcblx0KTtcbn07XG5cbi8qKlxuICogQ2hlY2sgaWYgYSBwcm9wZXJ0eSB1c2VzIGEgUHJvZ3Jlc3MgdmlzdWFsaXphdGlvbiBSYXRpbmcgdGhyb3VnaCBhIERhdGFGaWVsZERlZmF1bHQgb3IgYSBkaXJlY3QgRGF0YVBvaW50LlxuICpcbiAqIEBwYXJhbSBwcm9wZXJ0eSBUaGUgcHJvcGVydHkgdG8gYmUgY2hlY2tlZFxuICogQHJldHVybnMgYHRydWVgIGlmIHRoZSB2aXN1YWxpemF0aW9uIGlzIGEgUHJvZ3Jlc3NcbiAqL1xuXG5leHBvcnQgY29uc3QgaXNBUHJvZ3Jlc3NUeXBlRnJvbURhdGFQb2ludCA9IGZ1bmN0aW9uIChwcm9wZXJ0eTogUHJvcGVydHkgfCBEYXRhRmllbGRGb3JBbm5vdGF0aW9uKTogYm9vbGVhbiB7XG5cdGlmIChpc1Byb3BlcnR5KHByb3BlcnR5KSAmJiBpc0RhdGFQb2ludEZyb21EYXRhRmllbGREZWZhdWx0KHByb3BlcnR5KSkge1xuXHRcdHByb3BlcnR5ID0gcHJvcGVydHkuYW5ub3RhdGlvbnMuVUk/LkRhdGFGaWVsZERlZmF1bHQgYXMgRGF0YUZpZWxkRm9yQW5ub3RhdGlvbjtcblx0fVxuXHRyZXR1cm4gKChwcm9wZXJ0eSBhcyBEYXRhRmllbGRGb3JBbm5vdGF0aW9uKS5UYXJnZXQ/LiR0YXJnZXQgYXMgRGF0YVBvaW50VHlwZSk/LlZpc3VhbGl6YXRpb24gPT09IFwiVUkuVmlzdWFsaXphdGlvblR5cGUvUHJvZ3Jlc3NcIjtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTZW1hbnRpY09iamVjdFBhdGgoY29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCwgb2JqZWN0OiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzIHwgUHJvcGVydHkpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRpZiAodHlwZW9mIG9iamVjdCA9PT0gXCJvYmplY3RcIikge1xuXHRcdGlmIChpc0RhdGFGaWVsZFR5cGVzKG9iamVjdCkgJiYgb2JqZWN0LlZhbHVlPy4kdGFyZ2V0KSB7XG5cdFx0XHRjb25zdCBwcm9wZXJ0eSA9IG9iamVjdC5WYWx1ZT8uJHRhcmdldDtcblx0XHRcdGlmIChwcm9wZXJ0eT8uYW5ub3RhdGlvbnM/LkNvbW1vbj8uU2VtYW50aWNPYmplY3QgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRyZXR1cm4gY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlTZXRCYXNlZEFubm90YXRpb25QYXRoKHByb3BlcnR5Py5mdWxseVF1YWxpZmllZE5hbWUpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAoaXNQcm9wZXJ0eShvYmplY3QpKSB7XG5cdFx0XHRpZiAob2JqZWN0Py5hbm5vdGF0aW9ucz8uQ29tbW9uPy5TZW1hbnRpY09iamVjdCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHJldHVybiBjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVNldEJhc2VkQW5ub3RhdGlvblBhdGgob2JqZWN0Py5mdWxseVF1YWxpZmllZE5hbWUpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHRyZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIG5hdmlnYXRpb24gcGF0aCBwcmVmaXggZm9yIGEgcHJvcGVydHkgcGF0aC5cbiAqXG4gKiBAcGFyYW0gcGF0aCBUaGUgcHJvcGVydHkgcGF0aCBGb3IgZS5nLiAvRW50aXR5VHlwZS9OYXZpZ2F0aW9uL1Byb3BlcnR5XG4gKiBAcmV0dXJucyBUaGUgbmF2aWdhdGlvbiBwYXRoIHByZWZpeCBGb3IgZS5nLiAvRW50aXR5VHlwZS9OYXZpZ2F0aW9uL1xuICovXG5mdW5jdGlvbiBfZ2V0TmF2aWdhdGlvblBhdGhQcmVmaXgocGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcblx0aWYgKHBhdGgpIHtcblx0XHRyZXR1cm4gcGF0aC5pbmNsdWRlcyhcIi9cIikgPyBwYXRoLnN1YnN0cmluZygwLCBwYXRoLmxhc3RJbmRleE9mKFwiL1wiKSArIDEpIDogXCJcIjtcblx0fVxuXHRyZXR1cm4gXCJcIjtcbn1cblxuLyoqXG4gKiBDb2xsZWN0IGFkZGl0aW9uYWwgcHJvcGVydGllcyBmb3IgdGhlIEFMUCB0YWJsZSB1c2UtY2FzZS5cbiAqXG4gKiBGb3IgZS5nLiBJZiBVSS5IaWRkZW4gcG9pbnRzIHRvIGEgcHJvcGVydHksIGluY2x1ZGUgdGhpcyBwcm9wZXJ0eSBpbiB0aGUgYWRkaXRpb25hbFByb3BlcnRpZXMgb2YgQ29tcGxleFByb3BlcnR5SW5mbyBvYmplY3QuXG4gKlxuICogQHBhcmFtIHRhcmdldCBQcm9wZXJ0eSBvciBEYXRhRmllbGQgYmVpbmcgcHJvY2Vzc2VkXG4gKiBAcGFyYW0gbmF2aWdhdGlvblBhdGhQcmVmaXggTmF2aWdhdGlvbiBwYXRoIHByZWZpeCwgYXBwbGljYWJsZSBpbiBjYXNlIG9mIG5hdmlnYXRpb24gcHJvcGVydGllcy5cbiAqIEBwYXJhbSB0YWJsZVR5cGUgVGFibGUgdHlwZS5cbiAqIEBwYXJhbSByZWxhdGVkUHJvcGVydGllcyBUaGUgcmVsYXRlZCBwcm9wZXJ0aWVzIGlkZW50aWZpZWQgc28gZmFyLlxuICogQHJldHVybnMgVGhlIHJlbGF0ZWQgcHJvcGVydGllcyBpZGVudGlmaWVkLlxuICovXG5mdW5jdGlvbiBfY29sbGVjdEFkZGl0aW9uYWxQcm9wZXJ0aWVzRm9yQW5hbHl0aWNhbFRhYmxlKFxuXHR0YXJnZXQ6IFByaW1pdGl2ZVR5cGUsXG5cdG5hdmlnYXRpb25QYXRoUHJlZml4OiBzdHJpbmcsXG5cdHRhYmxlVHlwZTogVGFibGVUeXBlLFxuXHRyZWxhdGVkUHJvcGVydGllczogQ29tcGxleFByb3BlcnR5SW5mb1xuKTogQ29tcGxleFByb3BlcnR5SW5mbyB7XG5cdGlmICh0YWJsZVR5cGUgPT09IFwiQW5hbHl0aWNhbFRhYmxlXCIpIHtcblx0XHRjb25zdCBoaWRkZW5Bbm5vdGF0aW9uID0gdGFyZ2V0LmFubm90YXRpb25zPy5VST8uSGlkZGVuO1xuXHRcdGlmIChoaWRkZW5Bbm5vdGF0aW9uPy5wYXRoICYmIGlzUHJvcGVydHkoaGlkZGVuQW5ub3RhdGlvbi4kdGFyZ2V0KSkge1xuXHRcdFx0Y29uc3QgaGlkZGVuQW5ub3RhdGlvblByb3BlcnR5UGF0aCA9IG5hdmlnYXRpb25QYXRoUHJlZml4ICsgaGlkZGVuQW5ub3RhdGlvbi5wYXRoO1xuXHRcdFx0Ly8gVGhpcyBwcm9wZXJ0eSBzaG91bGQgYmUgYWRkZWQgdG8gYWRkaXRpb25hbFByb3BlcnRpZXMgbWFwIGZvciB0aGUgQUxQIHRhYmxlIHVzZS1jYXNlLlxuXHRcdFx0cmVsYXRlZFByb3BlcnRpZXMuYWRkaXRpb25hbFByb3BlcnRpZXNbaGlkZGVuQW5ub3RhdGlvblByb3BlcnR5UGF0aF0gPSBoaWRkZW5Bbm5vdGF0aW9uLiR0YXJnZXQ7XG5cdFx0fVxuXG5cdFx0Y29uc3QgY3JpdGljYWxpdHkgPSB0YXJnZXQuQ3JpdGljYWxpdHk7XG5cdFx0aWYgKGNyaXRpY2FsaXR5Py5wYXRoICYmIGlzUHJvcGVydHkoY3JpdGljYWxpdHk/LiR0YXJnZXQpKSB7XG5cdFx0XHRjb25zdCBjcml0aWNhbGl0eVByb3BlcnR5UGF0aCA9IG5hdmlnYXRpb25QYXRoUHJlZml4ICsgY3JpdGljYWxpdHkucGF0aDtcblx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzLmFkZGl0aW9uYWxQcm9wZXJ0aWVzW2NyaXRpY2FsaXR5UHJvcGVydHlQYXRoXSA9IGNyaXRpY2FsaXR5Py4kdGFyZ2V0O1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gcmVsYXRlZFByb3BlcnRpZXM7XG59XG5cbi8qKlxuICogSGVscGVyIGZvciBjb2xsZWN0UmVsYXRlZFByb3BlcnRpZXMgdG8gcHVzaCB1bmlxdWUgcmVsYXRlZCBwcm9wZXJ0aWVzLlxuICpcbiAqIEBwYXJhbSByZWxhdGVkUHJvcGVydGllc1xuICogQHBhcmFtIGtleSBUaGUgcHJvcGVydHkgcGF0aFxuICogQHBhcmFtIHZhbHVlIFRoZSBwcm9wZXJ0aWVzIG9iamVjdCBjb250YWluaW5nIHZhbHVlIHByb3BlcnR5LCBkZXNjcmlwdGlvbiBwcm9wZXJ0eS4uLlxuICogQHJldHVybnMgSW5kZXggYXQgd2hpY2ggdGhlIHByb3BlcnR5IGlzIGF2YWlsYWJsZVxuICovXG5mdW5jdGlvbiBfc2V0UHJvcGVydHlJblJlbGF0ZWRQcm9wZXJ0aWVzQW5kR2V0SW5kZXgocmVsYXRlZFByb3BlcnRpZXM6IENvbXBsZXhQcm9wZXJ0eUluZm8sIGtleTogc3RyaW5nLCB2YWx1ZTogUHJvcGVydHkpOiBudW1iZXIge1xuXHRpZiAoIXJlbGF0ZWRQcm9wZXJ0aWVzLnByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuXHRcdHJlbGF0ZWRQcm9wZXJ0aWVzLnByb3BlcnRpZXNba2V5XSA9IHZhbHVlO1xuXHR9XG5cdHJldHVybiBPYmplY3Qua2V5cyhyZWxhdGVkUHJvcGVydGllcy5wcm9wZXJ0aWVzKS5pbmRleE9mKGtleSk7XG59XG5cbi8qKlxuICogSGVscGVyIGZvciBjb2xsZWN0UmVsYXRlZFByb3BlcnRpZXMgdG8gYXBwZW5kIHRoZSBleHBvcnQgc2V0dGluZ3MgdGVtcGxhdGUgd2l0aCBhIGZvcm1hdHRlZCB0ZXh0LlxuICpcbiAqIEBwYXJhbSByZWxhdGVkUHJvcGVydGllc1xuICogQHBhcmFtIHZhbHVlIEZvcm1hdHRlZCB0ZXh0XG4gKi9cbmZ1bmN0aW9uIF9hcHBlbmRUZW1wbGF0ZShyZWxhdGVkUHJvcGVydGllczogQ29tcGxleFByb3BlcnR5SW5mbywgdmFsdWU6IHN0cmluZyk6IHZvaWQge1xuXHRyZWxhdGVkUHJvcGVydGllcy5leHBvcnRTZXR0aW5ncy50ZW1wbGF0ZSA9IHJlbGF0ZWRQcm9wZXJ0aWVzLmV4cG9ydFNldHRpbmdzPy50ZW1wbGF0ZVxuXHRcdD8gYCR7cmVsYXRlZFByb3BlcnRpZXMuZXhwb3J0U2V0dGluZ3MudGVtcGxhdGV9JHt2YWx1ZX1gXG5cdFx0OiBgJHt2YWx1ZX1gO1xufVxuXG4vKipcbiAqIENvbGxlY3QgcmVsYXRlZCBwcm9wZXJ0aWVzIGZyb20gYSBwcm9wZXJ0eSdzIGFubm90YXRpb25zLlxuICpcbiAqIEBwYXJhbSBwYXRoIFRoZSBwcm9wZXJ0eSBwYXRoXG4gKiBAcGFyYW0gcHJvcGVydHkgVGhlIHByb3BlcnR5IHRvIGJlIGNvbnNpZGVyZWRcbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHBhcmFtIGlnbm9yZVNlbGYgV2hldGhlciB0byBleGNsdWRlIHRoZSBzYW1lIHByb3BlcnR5IGZyb20gdGhlIHJlbGF0ZWQgcHJvcGVydGllcy5cbiAqIEBwYXJhbSB0YWJsZVR5cGUgVGhlIHRhYmxlIHR5cGUuXG4gKiBAcGFyYW0gcmVsYXRlZFByb3BlcnRpZXMgVGhlIHJlbGF0ZWQgcHJvcGVydGllcyBpZGVudGlmaWVkIHNvIGZhci5cbiAqIEBwYXJhbSBhZGRVbml0SW5UZW1wbGF0ZSBUcnVlIGlmIHRoZSB1bml0L2N1cnJlbmN5IHByb3BlcnR5IG5lZWRzIHRvIGJlIGFkZGVkIGluIHRoZSBleHBvcnQgdGVtcGxhdGVcbiAqIEBwYXJhbSBpc0Fubm90YXRlZEFzSGlkZGVuIFRydWUgaWYgdGhlIERhdGFGaWVsZCBvciB0aGUgcHJvcGVydHkgYXJlIHN0YXRpY2FsbHkgaGlkZGVuXG4gKiBAcmV0dXJucyBUaGUgcmVsYXRlZCBwcm9wZXJ0aWVzIGlkZW50aWZpZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb2xsZWN0UmVsYXRlZFByb3BlcnRpZXMoXG5cdHBhdGg6IHN0cmluZyxcblx0cHJvcGVydHk6IFByaW1pdGl2ZVR5cGUsXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdGlnbm9yZVNlbGY6IGJvb2xlYW4sXG5cdHRhYmxlVHlwZTogVGFibGVUeXBlLFxuXHRyZWxhdGVkUHJvcGVydGllczogQ29tcGxleFByb3BlcnR5SW5mbyA9IHtcblx0XHRwcm9wZXJ0aWVzOiB7fSxcblx0XHRhZGRpdGlvbmFsUHJvcGVydGllczoge30sXG5cdFx0ZXhwb3J0U2V0dGluZ3M6IHt9LFxuXHRcdHRleHRPbmx5UHJvcGVydGllc0Zyb21UZXh0QW5ub3RhdGlvbjogW11cblx0fSxcblx0YWRkVW5pdEluVGVtcGxhdGUgPSBmYWxzZSxcblx0aXNBbm5vdGF0ZWRBc0hpZGRlbiA9IGZhbHNlXG4pOiBDb21wbGV4UHJvcGVydHlJbmZvIHtcblx0aWYgKHBhdGggJiYgcHJvcGVydHkpIHtcblx0XHRsZXQgdmFsdWVJbmRleDogbnVtYmVyO1xuXHRcdGxldCBjdXJyZW5jeU9yVW9NSW5kZXg6IG51bWJlcjtcblx0XHRpZiAoaXNBbm5vdGF0ZWRBc0hpZGRlbikge1xuXHRcdFx0Ly8gQ29sbGVjdCB1bmRlcmx5aW5nIHByb3BlcnR5XG5cdFx0XHR2YWx1ZUluZGV4ID0gX3NldFByb3BlcnR5SW5SZWxhdGVkUHJvcGVydGllc0FuZEdldEluZGV4KHJlbGF0ZWRQcm9wZXJ0aWVzLCBwYXRoLCBwcm9wZXJ0eSk7XG5cdFx0XHRfYXBwZW5kVGVtcGxhdGUocmVsYXRlZFByb3BlcnRpZXMsIGB7JHt2YWx1ZUluZGV4fX1gKTtcblx0XHRcdHJldHVybiByZWxhdGVkUHJvcGVydGllcztcblx0XHR9XG5cdFx0Y29uc3QgbmF2aWdhdGlvblBhdGhQcmVmaXggPSBfZ2V0TmF2aWdhdGlvblBhdGhQcmVmaXgocGF0aCk7XG5cblx0XHQvLyBDaGVjayBmb3IgVGV4dCBhbm5vdGF0aW9uLlxuXHRcdGNvbnN0IHRleHRQcm9wZXJ0eVBhdGggPSBnZXRBc3NvY2lhdGVkVGV4dFByb3BlcnR5UGF0aChwcm9wZXJ0eSk7XG5cdFx0Y29uc3QgdGV4dFByb3BlcnR5ID0gZ2V0QXNzb2NpYXRlZFRleHRQcm9wZXJ0eShwcm9wZXJ0eSk7XG5cblx0XHQvLyBnZXQgdGhlIERhdGFNb2RlbE9iamVjdFBhdGggZm9yIHRoZSBjb2x1bW5cblx0XHRjb25zdCBkYXRhTW9kZWxPYmplY3RQYXRoID0gY29udmVydGVyQ29udGV4dC5nZXRDb252ZXJ0ZXJDb250ZXh0Rm9yKGNvbnZlcnRlckNvbnRleHQuZ2V0Q29udGV4dFBhdGgoKSkuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpO1xuXHRcdGNvbnN0IHByb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aCA9IGVuaGFuY2VEYXRhTW9kZWxQYXRoKGRhdGFNb2RlbE9iamVjdFBhdGgsIHBhdGgpO1xuXHRcdGNvbnN0IHRleHRQcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGggPSBlbmhhbmNlRGF0YU1vZGVsUGF0aChwcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGgsIHRleHRQcm9wZXJ0eVBhdGgpO1xuXHRcdGNvbnN0IHRleHRSZWxhdGl2ZVBhdGggPSBnZXRDb250ZXh0UmVsYXRpdmVUYXJnZXRPYmplY3RQYXRoKHRleHRQcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGgpO1xuXG5cdFx0aWYgKHJlbGF0ZWRQcm9wZXJ0aWVzLmV4cG9ydFNldHRpbmdzPy50ZW1wbGF0ZSkge1xuXHRcdFx0Ly8gRmllbGRHcm91cCB1c2UtY2FzZS4gTmVlZCB0byBhZGQgZWFjaCBGaWVsZCBpbiBuZXcgbGluZS5cblx0XHRcdF9hcHBlbmRUZW1wbGF0ZShyZWxhdGVkUHJvcGVydGllcywgXCJcXG5cIik7XG5cdFx0XHRyZWxhdGVkUHJvcGVydGllcy5leHBvcnRTZXR0aW5ncy53cmFwID0gdHJ1ZTtcblx0XHR9XG5cblx0XHRpZiAodGV4dFByb3BlcnR5ICYmIHRleHRSZWxhdGl2ZVBhdGgpIHtcblx0XHRcdC8vIENoZWNrIGZvciBUZXh0IEFycmFuZ2VtZW50LlxuXHRcdFx0Y29uc3QgZGlzcGxheU1vZGUgPSBnZXREaXNwbGF5TW9kZShwcm9wZXJ0eSwgcHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoKTtcblx0XHRcdGxldCBkZXNjcmlwdGlvbkluZGV4OiBudW1iZXI7XG5cdFx0XHRzd2l0Y2ggKGRpc3BsYXlNb2RlKSB7XG5cdFx0XHRcdGNhc2UgXCJWYWx1ZVwiOlxuXHRcdFx0XHRcdHZhbHVlSW5kZXggPSBfc2V0UHJvcGVydHlJblJlbGF0ZWRQcm9wZXJ0aWVzQW5kR2V0SW5kZXgocmVsYXRlZFByb3BlcnRpZXMsIHBhdGgsIHByb3BlcnR5KTtcblx0XHRcdFx0XHRfYXBwZW5kVGVtcGxhdGUocmVsYXRlZFByb3BlcnRpZXMsIGB7JHt2YWx1ZUluZGV4fX1gKTtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlIFwiRGVzY3JpcHRpb25cIjpcblx0XHRcdFx0XHRkZXNjcmlwdGlvbkluZGV4ID0gX3NldFByb3BlcnR5SW5SZWxhdGVkUHJvcGVydGllc0FuZEdldEluZGV4KHJlbGF0ZWRQcm9wZXJ0aWVzLCB0ZXh0UmVsYXRpdmVQYXRoLCB0ZXh0UHJvcGVydHkpO1xuXHRcdFx0XHRcdF9hcHBlbmRUZW1wbGF0ZShyZWxhdGVkUHJvcGVydGllcywgYHske2Rlc2NyaXB0aW9uSW5kZXh9fWApO1xuXHRcdFx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzLnRleHRPbmx5UHJvcGVydGllc0Zyb21UZXh0QW5ub3RhdGlvbi5wdXNoKHRleHRSZWxhdGl2ZVBhdGgpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgXCJWYWx1ZURlc2NyaXB0aW9uXCI6XG5cdFx0XHRcdFx0dmFsdWVJbmRleCA9IF9zZXRQcm9wZXJ0eUluUmVsYXRlZFByb3BlcnRpZXNBbmRHZXRJbmRleChyZWxhdGVkUHJvcGVydGllcywgcGF0aCwgcHJvcGVydHkpO1xuXHRcdFx0XHRcdGRlc2NyaXB0aW9uSW5kZXggPSBfc2V0UHJvcGVydHlJblJlbGF0ZWRQcm9wZXJ0aWVzQW5kR2V0SW5kZXgocmVsYXRlZFByb3BlcnRpZXMsIHRleHRSZWxhdGl2ZVBhdGgsIHRleHRQcm9wZXJ0eSk7XG5cdFx0XHRcdFx0X2FwcGVuZFRlbXBsYXRlKHJlbGF0ZWRQcm9wZXJ0aWVzLCBgeyR7dmFsdWVJbmRleH19ICh7JHtkZXNjcmlwdGlvbkluZGV4fX0pYCk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSBcIkRlc2NyaXB0aW9uVmFsdWVcIjpcblx0XHRcdFx0XHR2YWx1ZUluZGV4ID0gX3NldFByb3BlcnR5SW5SZWxhdGVkUHJvcGVydGllc0FuZEdldEluZGV4KHJlbGF0ZWRQcm9wZXJ0aWVzLCBwYXRoLCBwcm9wZXJ0eSk7XG5cdFx0XHRcdFx0ZGVzY3JpcHRpb25JbmRleCA9IF9zZXRQcm9wZXJ0eUluUmVsYXRlZFByb3BlcnRpZXNBbmRHZXRJbmRleChyZWxhdGVkUHJvcGVydGllcywgdGV4dFJlbGF0aXZlUGF0aCwgdGV4dFByb3BlcnR5KTtcblx0XHRcdFx0XHRfYXBwZW5kVGVtcGxhdGUocmVsYXRlZFByb3BlcnRpZXMsIGB7JHtkZXNjcmlwdGlvbkluZGV4fX0gKHske3ZhbHVlSW5kZXh9fSlgKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Ly8gbm8gZGVmYXVsdFxuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBDaGVjayBmb3IgZmllbGQgY29udGFpbmluZyBDdXJyZW5jeSBPciBVbml0IFByb3BlcnRpZXMgb3IgVGltZXpvbmVcblx0XHRcdGNvbnN0IGN1cnJlbmN5UHJvcGVydHkgPSBnZXRBc3NvY2lhdGVkQ3VycmVuY3lQcm9wZXJ0eShwcm9wZXJ0eSk7XG5cdFx0XHRjb25zdCB1bml0UHJvcGVydHkgPSBnZXRBc3NvY2lhdGVkVW5pdFByb3BlcnR5KHByb3BlcnR5KTtcblx0XHRcdGNvbnN0IGN1cnJlbmN5T3JVb01Qcm9wZXJ0eSA9IGN1cnJlbmN5UHJvcGVydHkgfHwgdW5pdFByb3BlcnR5O1xuXHRcdFx0Y29uc3QgY3VycmVuY3lPclVuaXRBbm5vdGF0aW9uOiBQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb248c3RyaW5nPiA9XG5cdFx0XHRcdHByb3BlcnR5Py5hbm5vdGF0aW9ucz8uTWVhc3VyZXM/LklTT0N1cnJlbmN5IHx8IHByb3BlcnR5Py5hbm5vdGF0aW9ucz8uTWVhc3VyZXM/LlVuaXQ7XG5cdFx0XHRjb25zdCB0aW1lem9uZVByb3BlcnR5ID0gZ2V0QXNzb2NpYXRlZFRpbWV6b25lUHJvcGVydHkocHJvcGVydHkpO1xuXHRcdFx0Y29uc3QgdGltZXpvbmVBbm5vdGF0aW9uID0gcHJvcGVydHk/LmFubm90YXRpb25zPy5Db21tb24/LlRpbWV6b25lO1xuXG5cdFx0XHRpZiAoY3VycmVuY3lPclVvTVByb3BlcnR5KSB7XG5cdFx0XHRcdHZhbHVlSW5kZXggPSBfc2V0UHJvcGVydHlJblJlbGF0ZWRQcm9wZXJ0aWVzQW5kR2V0SW5kZXgocmVsYXRlZFByb3BlcnRpZXMsIHBhdGgsIHByb3BlcnR5KTtcblx0XHRcdFx0Y3VycmVuY3lPclVvTUluZGV4ID0gX3NldFByb3BlcnR5SW5SZWxhdGVkUHJvcGVydGllc0FuZEdldEluZGV4KFxuXHRcdFx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzLFxuXHRcdFx0XHRcdG5hdmlnYXRpb25QYXRoUHJlZml4ICsgY3VycmVuY3lPclVuaXRBbm5vdGF0aW9uLnBhdGgsXG5cdFx0XHRcdFx0Y3VycmVuY3lPclVuaXRBbm5vdGF0aW9uLiR0YXJnZXQhXG5cdFx0XHRcdCk7XG5cdFx0XHRcdGlmIChhZGRVbml0SW5UZW1wbGF0ZSkge1xuXHRcdFx0XHRcdF9hcHBlbmRUZW1wbGF0ZShyZWxhdGVkUHJvcGVydGllcywgYHske3ZhbHVlSW5kZXh9fSAgeyR7Y3VycmVuY3lPclVvTUluZGV4fX1gKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRyZWxhdGVkUHJvcGVydGllcy5leHBvcnRTZXR0aW5ncy51bml0UHJvcGVydHkgPSBuYXZpZ2F0aW9uUGF0aFByZWZpeCArIGN1cnJlbmN5T3JVbml0QW5ub3RhdGlvbi5wYXRoO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChjdXJyZW5jeVByb3BlcnR5KSB7XG5cdFx0XHRcdFx0cmVsYXRlZFByb3BlcnRpZXMuZXhwb3J0U2V0dGluZ3MuaXNDdXJyZW5jeSA9IHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAodGltZXpvbmVQcm9wZXJ0eSAmJiB0aW1lem9uZUFubm90YXRpb24/LiR0YXJnZXQpIHtcblx0XHRcdFx0Y29sbGVjdFRpbWV6b25lUHJvcGVydGllcyhwcm9wZXJ0eSwgcmVsYXRlZFByb3BlcnRpZXMsIHBhdGgsIGFkZFVuaXRJblRlbXBsYXRlKTtcblx0XHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRcdChwcm9wZXJ0eS5UYXJnZXQ/LiR0YXJnZXQ/LiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhUG9pbnRUeXBlICYmICFwcm9wZXJ0eS5UYXJnZXQ/LiR0YXJnZXQ/LlZhbHVlRm9ybWF0KSB8fFxuXHRcdFx0XHRwcm9wZXJ0eS5hbm5vdGF0aW9ucz8uVUk/LkRhdGFGaWVsZERlZmF1bHQ/LlRhcmdldD8uJHRhcmdldD8uJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFQb2ludFR5cGVcblx0XHRcdCkge1xuXHRcdFx0XHRjb2xsZWN0RGF0YVBvaW50UHJvcGVydGllcyhwcm9wZXJ0eSwgcmVsYXRlZFByb3BlcnRpZXMsIHBhdGgpO1xuXHRcdFx0fSBlbHNlIGlmIChwcm9wZXJ0eS4kVHlwZSA9PT0gQ29tbXVuaWNhdGlvbkFubm90YXRpb25UeXBlcy5Db250YWN0VHlwZSkge1xuXHRcdFx0XHRjb25zdCBjb250YWN0UHJvcGVydHkgPSBwcm9wZXJ0eS5mbj8uJHRhcmdldDtcblx0XHRcdFx0Y29uc3QgY29udGFjdFByb3BlcnR5UGF0aCA9IHByb3BlcnR5LmZuPy5wYXRoO1xuXHRcdFx0XHR2YWx1ZUluZGV4ID0gX3NldFByb3BlcnR5SW5SZWxhdGVkUHJvcGVydGllc0FuZEdldEluZGV4KFxuXHRcdFx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzLFxuXHRcdFx0XHRcdG5hdmlnYXRpb25QYXRoUHJlZml4ID8gbmF2aWdhdGlvblBhdGhQcmVmaXggKyBjb250YWN0UHJvcGVydHlQYXRoIDogY29udGFjdFByb3BlcnR5UGF0aCxcblx0XHRcdFx0XHRjb250YWN0UHJvcGVydHlcblx0XHRcdFx0KTtcblx0XHRcdFx0X2FwcGVuZFRlbXBsYXRlKHJlbGF0ZWRQcm9wZXJ0aWVzLCBgeyR7dmFsdWVJbmRleH19YCk7XG5cdFx0XHR9IGVsc2UgaWYgKCFpZ25vcmVTZWxmKSB7XG5cdFx0XHRcdC8vIENvbGxlY3QgdW5kZXJseWluZyBwcm9wZXJ0eVxuXHRcdFx0XHR2YWx1ZUluZGV4ID0gX3NldFByb3BlcnR5SW5SZWxhdGVkUHJvcGVydGllc0FuZEdldEluZGV4KHJlbGF0ZWRQcm9wZXJ0aWVzLCBwYXRoLCBwcm9wZXJ0eSk7XG5cdFx0XHRcdF9hcHBlbmRUZW1wbGF0ZShyZWxhdGVkUHJvcGVydGllcywgYHske3ZhbHVlSW5kZXh9fWApO1xuXHRcdFx0XHRpZiAoY3VycmVuY3lPclVuaXRBbm5vdGF0aW9uKSB7XG5cdFx0XHRcdFx0cmVsYXRlZFByb3BlcnRpZXMuZXhwb3J0U2V0dGluZ3MudW5pdCA9IGAke2N1cnJlbmN5T3JVbml0QW5ub3RhdGlvbn1gOyAvLyBIYXJkLWNvZGVkIGN1cnJlbmN5L3VuaXRcblx0XHRcdFx0XHRpZiAocHJvcGVydHk/LmFubm90YXRpb25zPy5NZWFzdXJlcz8uSVNPQ3VycmVuY3kpIHtcblx0XHRcdFx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzLmV4cG9ydFNldHRpbmdzLmlzQ3VycmVuY3kgPSB0cnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIGlmICh0aW1lem9uZUFubm90YXRpb24pIHtcblx0XHRcdFx0XHRyZWxhdGVkUHJvcGVydGllcy5leHBvcnRTZXR0aW5ncy50aW1lem9uZSA9IGAke3RpbWV6b25lQW5ub3RhdGlvbn1gOyAvLyBIYXJkLWNvZGVkIHRpbWV6b25lXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZWxhdGVkUHJvcGVydGllcyA9IF9jb2xsZWN0QWRkaXRpb25hbFByb3BlcnRpZXNGb3JBbmFseXRpY2FsVGFibGUocHJvcGVydHksIG5hdmlnYXRpb25QYXRoUHJlZml4LCB0YWJsZVR5cGUsIHJlbGF0ZWRQcm9wZXJ0aWVzKTtcblx0XHRpZiAoT2JqZWN0LmtleXMocmVsYXRlZFByb3BlcnRpZXMuYWRkaXRpb25hbFByb3BlcnRpZXMpLmxlbmd0aCA+IDAgJiYgT2JqZWN0LmtleXMocmVsYXRlZFByb3BlcnRpZXMucHJvcGVydGllcykubGVuZ3RoID09PSAwKSB7XG5cdFx0XHQvLyBDb2xsZWN0IHVuZGVybHlpbmcgcHJvcGVydHkgaWYgbm90IGNvbGxlY3RlZCBhbHJlYWR5LlxuXHRcdFx0Ly8gVGhpcyBpcyB0byBlbnN1cmUgdGhhdCBhZGRpdGlvbmFsUHJvcGVydGllcyBhcmUgbWFkZSBhdmFpbGFibGUgb25seSB0byBjb21wbGV4IHByb3BlcnR5IGluZm9zLlxuXHRcdFx0dmFsdWVJbmRleCA9IF9zZXRQcm9wZXJ0eUluUmVsYXRlZFByb3BlcnRpZXNBbmRHZXRJbmRleChyZWxhdGVkUHJvcGVydGllcywgcGF0aCwgcHJvcGVydHkpO1xuXHRcdFx0X2FwcGVuZFRlbXBsYXRlKHJlbGF0ZWRQcm9wZXJ0aWVzLCBgeyR7dmFsdWVJbmRleH19YCk7XG5cdFx0fVxuXHR9XG5cdHJldHVybiByZWxhdGVkUHJvcGVydGllcztcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSB0eXBlIG9mIFZpc3VhbGl6YXRpb24gb2YgdGhlIERhdGFQb2ludC5cbiAqXG4gKiBAcGFyYW0gc291cmNlIFNvdXJjZSBvZiB0aGUgRGF0YVBvaW50LlxuICogQHJldHVybnMgVGhlIHR5cGUgb2YgVmlzdWFsaXphdGlvbiBvciB1bmRlZmluZWQgaWYgdGhlcmUncyBub25lLlxuICovXG5mdW5jdGlvbiBnZXREYXRhUG9pbnRWaXN1YWxpemF0aW9uKHNvdXJjZTogUHJvcGVydHkgfCBEYXRhUG9pbnRUeXBlKTogVmlzdWFsaXphdGlvblR5cGUge1xuXHRsZXQgZGF0YVBvaW50OiBEYXRhUG9pbnRUeXBlO1xuXHRpZiAoaXNQcm9wZXJ0eShzb3VyY2UpKSB7XG5cdFx0ZGF0YVBvaW50ID0gKHNvdXJjZS5hbm5vdGF0aW9ucz8uVUk/LkRhdGFGaWVsZERlZmF1bHQgYXMgRGF0YUZpZWxkRm9yQW5ub3RhdGlvbik/LlRhcmdldD8uJHRhcmdldCBhcyBEYXRhUG9pbnRUeXBlO1xuXHR9IGVsc2Uge1xuXHRcdGRhdGFQb2ludCA9IHNvdXJjZTtcblx0fVxuXHRyZXR1cm4gZGF0YVBvaW50LlZpc3VhbGl6YXRpb24gPz8gVmlzdWFsaXphdGlvblR5cGUuTnVtYmVyO1xufVxuXG4vKipcbiAqXHRDb2xsZWN0IHRoZSByZWxhdGVkIHByb3BlcnRpZXMgZnJvbSBhIERhdGFQb2ludC5cbiAqXG4gKiBAcGFyYW0gcHJvcGVydHkgVGhlIHByb3BlcnR5IHRvIGJlIGNvbnNpZGVyZWQuXG4gKiBAcGFyYW0gcmVsYXRlZFByb3BlcnRpZXMgVGhlIHJlbGF0ZWQgcHJvcGVydGllcyBpZGVudGlmaWVkIHNvIGZhci5cbiAqIEBwYXJhbSBwYXRoIFRoZSBwcm9wZXJ0eSBwYXRoLlxuICpcbiAqL1xuZnVuY3Rpb24gY29sbGVjdERhdGFQb2ludFByb3BlcnRpZXMocHJvcGVydHk6IFByaW1pdGl2ZVR5cGUsIHJlbGF0ZWRQcm9wZXJ0aWVzOiBDb21wbGV4UHJvcGVydHlJbmZvLCBwYXRoOiBzdHJpbmcpOiB2b2lkIHtcblx0Y29uc3QgZGF0YVBvaW50UHJvcGVydHkgPSBwcm9wZXJ0eS5UYXJnZXQ/LiR0YXJnZXQ/LlZhbHVlLiR0YXJnZXQgYXMgUHJvcGVydHk7XG5cdGNvbnN0IGRhdGFwb2ludFRhcmdldCA9IHByb3BlcnR5LlRhcmdldD8uJHRhcmdldDtcblx0Y29uc3QgbmF2aWdhdGlvblBhdGhQcmVmaXggPSBfZ2V0TmF2aWdhdGlvblBhdGhQcmVmaXgocGF0aCk7XG5cdC8vIERhdGFQb2ludCB1c2UtY2FzZSB1c2luZyBEYXRhRmllbGREZWZhdWx0LlxuXHRjb25zdCBkYXRhUG9pbnREZWZhdWx0UHJvcGVydHkgPSBwcm9wZXJ0eS5hbm5vdGF0aW9ucz8uVUk/LkRhdGFGaWVsZERlZmF1bHQ7XG5cdGNvbnN0IHZhbHVlSW5kZXggPSBfc2V0UHJvcGVydHlJblJlbGF0ZWRQcm9wZXJ0aWVzQW5kR2V0SW5kZXgoXG5cdFx0cmVsYXRlZFByb3BlcnRpZXMsXG5cdFx0bmF2aWdhdGlvblBhdGhQcmVmaXggPyBuYXZpZ2F0aW9uUGF0aFByZWZpeCArIHBhdGggOiBwYXRoLFxuXHRcdGRhdGFQb2ludERlZmF1bHRQcm9wZXJ0eSA/IHByb3BlcnR5IDogZGF0YVBvaW50UHJvcGVydHlcblx0KTtcblx0Ly8gSWYgd2UgaGF2ZSBhIERhdGFQb2ludCB3aXRob3V0IHZpc3VhbGl6YXRpb24sIG9yIGEgTnVtYmVyLCB3ZSBkb24ndCBoYXZlIGEgVGFyZ2V0VmFsdWUvTWF4aW11bVZhbHVlXG5cdGlmIChnZXREYXRhUG9pbnRWaXN1YWxpemF0aW9uKGRhdGFQb2ludERlZmF1bHRQcm9wZXJ0eSA/IHByb3BlcnR5IDogZGF0YXBvaW50VGFyZ2V0KSA9PT0gVmlzdWFsaXphdGlvblR5cGUuTnVtYmVyKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cdGNvbnN0IHRhcmdldFZhbHVlID0gZ2V0VGFyZ2V0VmFsdWVPbkRhdGFQb2ludChkYXRhUG9pbnREZWZhdWx0UHJvcGVydHkgPyBwcm9wZXJ0eSA6IGRhdGFwb2ludFRhcmdldCk7XG5cdGlmIChpc1BhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbih0YXJnZXRWYWx1ZSkpIHtcblx0XHRpZiAodGFyZ2V0VmFsdWUuJHRhcmdldCkge1xuXHRcdFx0Ly9pbiBjYXNlIGl0J3MgYSBkeW5hbWljIHRhcmdldFZhbHVlXG5cdFx0XHRjb25zdCBkYXRhUG9pbnRJbmRleCA9IF9zZXRQcm9wZXJ0eUluUmVsYXRlZFByb3BlcnRpZXNBbmRHZXRJbmRleChcblx0XHRcdFx0cmVsYXRlZFByb3BlcnRpZXMsXG5cdFx0XHRcdG5hdmlnYXRpb25QYXRoUHJlZml4ID8gbmF2aWdhdGlvblBhdGhQcmVmaXggKyB0YXJnZXRWYWx1ZS4kdGFyZ2V0Lm5hbWUgOiB0YXJnZXRWYWx1ZS4kdGFyZ2V0Lm5hbWUsXG5cdFx0XHRcdHRhcmdldFZhbHVlLiR0YXJnZXRcblx0XHRcdCk7XG5cdFx0XHRyZWxhdGVkUHJvcGVydGllcy5leHBvcnRTZXR0aW5ncy5kYXRhUG9pbnRUYXJnZXRWYWx1ZSA9IHRhcmdldFZhbHVlLnBhdGg7XG5cdFx0XHRfYXBwZW5kVGVtcGxhdGUocmVsYXRlZFByb3BlcnRpZXMsIGB7JHt2YWx1ZUluZGV4fX0veyR7ZGF0YVBvaW50SW5kZXh9fWApO1xuXHRcdH1cblx0fSBlbHNlIGlmIChoYXNTdGF0aWNQZXJjZW50VW5pdChkYXRhUG9pbnREZWZhdWx0UHJvcGVydHkgPyBwcm9wZXJ0eSA6IGRhdGFQb2ludFByb3BlcnR5KSAmJiBpc0FQcm9ncmVzc1R5cGVGcm9tRGF0YVBvaW50KHByb3BlcnR5KSkge1xuXHRcdHJlbGF0ZWRQcm9wZXJ0aWVzLmV4cG9ydFNldHRpbmdzLnVuaXQgPSBcIiVcIjtcblx0fSBlbHNlIHtcblx0XHRyZWxhdGVkUHJvcGVydGllcy5leHBvcnRTZXR0aW5ncy5kYXRhUG9pbnRUYXJnZXRWYWx1ZSA9IHRhcmdldFZhbHVlO1xuXHRcdF9hcHBlbmRUZW1wbGF0ZShyZWxhdGVkUHJvcGVydGllcywgYHske3ZhbHVlSW5kZXh9fS8ke3RhcmdldFZhbHVlfWApO1xuXHR9XG59XG5cbi8qKlxuICpcdENvbGxlY3QgdGhlIHJlbGF0ZWQgcHJvcGVydGllcyBmcm9tIGEgcHJvcGVydHkgd2l0aCBUaW1lem9uZS5cbiAqXG4gKiBAcGFyYW0gcHJvcGVydHkgVGhlIHByb3BlcnR5IHRvIGJlIGNvbnNpZGVyZWQuXG4gKiBAcGFyYW0gcmVsYXRlZFByb3BlcnRpZXMgVGhlIHJlbGF0ZWQgcHJvcGVydGllcyBpZGVudGlmaWVkIHNvIGZhci5cbiAqIEBwYXJhbSBwYXRoIFRoZSBwcm9wZXJ0eSBwYXRoLlxuICogQHBhcmFtIGFkZFVuaXRJblRlbXBsYXRlIFNob3VsZCB3ZSBhZGQgdGhlIHVuaXQgaW4gdGhlIHRlbXBsYXRlLlxuICpcbiAqL1xuZnVuY3Rpb24gY29sbGVjdFRpbWV6b25lUHJvcGVydGllcyhcblx0cHJvcGVydHk6IFByaW1pdGl2ZVR5cGUsXG5cdHJlbGF0ZWRQcm9wZXJ0aWVzOiBDb21wbGV4UHJvcGVydHlJbmZvLFxuXHRwYXRoOiBzdHJpbmcsXG5cdGFkZFVuaXRJblRlbXBsYXRlOiBib29sZWFuXG4pOiB2b2lkIHtcblx0Y29uc3QgdGltZXpvbmVBbm5vdGF0aW9uID0gcHJvcGVydHkuYW5ub3RhdGlvbnMuQ29tbW9uLlRpbWV6b25lO1xuXHRjb25zdCBuYXZpZ2F0aW9uUGF0aFByZWZpeCA9IF9nZXROYXZpZ2F0aW9uUGF0aFByZWZpeChwYXRoKTtcblx0Y29uc3QgdmFsdWVJbmRleCA9IF9zZXRQcm9wZXJ0eUluUmVsYXRlZFByb3BlcnRpZXNBbmRHZXRJbmRleChyZWxhdGVkUHJvcGVydGllcywgcGF0aCwgcHJvcGVydHkpO1xuXG5cdGNvbnN0IHRpbWV6b25lT3JVb01JbmRleCA9IF9zZXRQcm9wZXJ0eUluUmVsYXRlZFByb3BlcnRpZXNBbmRHZXRJbmRleChcblx0XHRyZWxhdGVkUHJvcGVydGllcyxcblx0XHRuYXZpZ2F0aW9uUGF0aFByZWZpeCArIHRpbWV6b25lQW5ub3RhdGlvbi5wYXRoLFxuXHRcdHRpbWV6b25lQW5ub3RhdGlvbi4kdGFyZ2V0XG5cdCk7XG5cdGlmIChhZGRVbml0SW5UZW1wbGF0ZSkge1xuXHRcdF9hcHBlbmRUZW1wbGF0ZShyZWxhdGVkUHJvcGVydGllcywgYHske3ZhbHVlSW5kZXh9fSAgeyR7dGltZXpvbmVPclVvTUluZGV4fX1gKTtcblx0fSBlbHNlIHtcblx0XHRyZWxhdGVkUHJvcGVydGllcy5leHBvcnRTZXR0aW5ncy50aW1lem9uZVByb3BlcnR5ID0gbmF2aWdhdGlvblBhdGhQcmVmaXggKyB0aW1lem9uZUFubm90YXRpb24ucGF0aDtcblx0fVxufVxuXG4vKipcbiAqIENvbGxlY3QgcHJvcGVydGllcyBjb25zdW1lZCBieSBhIERhdGFGaWVsZC5cbiAqIFRoaXMgaXMgZm9yIHBvcHVsYXRpbmcgdGhlIENvbXBsZXhQcm9wZXJ0eUluZm9zIG9mIHRoZSB0YWJsZSBkZWxlZ2F0ZS5cbiAqXG4gKiBAcGFyYW0gZGF0YUZpZWxkIFRoZSBEYXRhRmllbGQgZm9yIHdoaWNoIHRoZSBwcm9wZXJ0aWVzIG5lZWQgdG8gYmUgaWRlbnRpZmllZC5cbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dC5cbiAqIEBwYXJhbSB0YWJsZVR5cGUgVGhlIHRhYmxlIHR5cGUuXG4gKiBAcGFyYW0gcmVsYXRlZFByb3BlcnRpZXMgVGhlIHByb3BlcnRpZXMgaWRlbnRpZmllZCBzbyBmYXIuXG4gKiBAcGFyYW0gaXNFbWJlZGRlZCBUcnVlIGlmIHRoZSBEYXRhRmllbGQgaXMgZW1iZWRkZWQgaW4gYW5vdGhlciBhbm5vdGF0aW9uIChlLmcuIEZpZWxkR3JvdXApLlxuICogQHJldHVybnMgVGhlIHByb3BlcnRpZXMgcmVsYXRlZCB0byB0aGUgRGF0YUZpZWxkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29sbGVjdFJlbGF0ZWRQcm9wZXJ0aWVzUmVjdXJzaXZlbHkoXG5cdGRhdGFGaWVsZDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCxcblx0dGFibGVUeXBlOiBUYWJsZVR5cGUsXG5cdHJlbGF0ZWRQcm9wZXJ0aWVzOiBDb21wbGV4UHJvcGVydHlJbmZvID0ge1xuXHRcdHByb3BlcnRpZXM6IHt9LFxuXHRcdGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiB7fSxcblx0XHR0ZXh0T25seVByb3BlcnRpZXNGcm9tVGV4dEFubm90YXRpb246IFtdLFxuXHRcdGV4cG9ydFNldHRpbmdzOiB7fVxuXHR9LFxuXHRpc0VtYmVkZGVkID0gZmFsc2Vcbik6IENvbXBsZXhQcm9wZXJ0eUluZm8ge1xuXHRsZXQgaXNTdGF0aWNhbGx5SGlkZGVuID0gZmFsc2U7XG5cdHN3aXRjaCAoZGF0YUZpZWxkPy4kVHlwZSkge1xuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aFVybDpcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhOYXZpZ2F0aW9uUGF0aDpcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhJbnRlbnRCYXNlZE5hdmlnYXRpb246XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoQWN0aW9uOlxuXHRcdFx0aWYgKGRhdGFGaWVsZC5WYWx1ZSkge1xuXHRcdFx0XHRjb25zdCBwcm9wZXJ0eSA9IGRhdGFGaWVsZC5WYWx1ZTtcblx0XHRcdFx0aXNTdGF0aWNhbGx5SGlkZGVuID0gaXNSZWZlcmVuY2VQcm9wZXJ0eVN0YXRpY2FsbHlIaWRkZW4oZGF0YUZpZWxkKTtcblx0XHRcdFx0cmVsYXRlZFByb3BlcnRpZXMgPSBjb2xsZWN0UmVsYXRlZFByb3BlcnRpZXMoXG5cdFx0XHRcdFx0cHJvcGVydHkucGF0aCxcblx0XHRcdFx0XHRwcm9wZXJ0eS4kdGFyZ2V0LFxuXHRcdFx0XHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0XHRcdFx0ZmFsc2UsXG5cdFx0XHRcdFx0dGFibGVUeXBlLFxuXHRcdFx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzLFxuXHRcdFx0XHRcdGlzRW1iZWRkZWQsXG5cdFx0XHRcdFx0aXNTdGF0aWNhbGx5SGlkZGVuXG5cdFx0XHRcdCk7XG5cdFx0XHRcdGNvbnN0IG5hdmlnYXRpb25QYXRoUHJlZml4ID0gX2dldE5hdmlnYXRpb25QYXRoUHJlZml4KHByb3BlcnR5LnBhdGgpO1xuXHRcdFx0XHRyZWxhdGVkUHJvcGVydGllcyA9IF9jb2xsZWN0QWRkaXRpb25hbFByb3BlcnRpZXNGb3JBbmFseXRpY2FsVGFibGUoXG5cdFx0XHRcdFx0ZGF0YUZpZWxkLFxuXHRcdFx0XHRcdG5hdmlnYXRpb25QYXRoUHJlZml4LFxuXHRcdFx0XHRcdHRhYmxlVHlwZSxcblx0XHRcdFx0XHRyZWxhdGVkUHJvcGVydGllc1xuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdFx0YnJlYWs7XG5cblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFjdGlvbjpcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbjpcblx0XHRcdGJyZWFrO1xuXG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBbm5vdGF0aW9uOlxuXHRcdFx0c3dpdGNoIChkYXRhRmllbGQuVGFyZ2V0Py4kdGFyZ2V0Py4kVHlwZSkge1xuXHRcdFx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkZpZWxkR3JvdXBUeXBlOlxuXHRcdFx0XHRcdGRhdGFGaWVsZC5UYXJnZXQuJHRhcmdldC5EYXRhPy5mb3JFYWNoKChpbm5lckRhdGFGaWVsZDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcykgPT4ge1xuXHRcdFx0XHRcdFx0cmVsYXRlZFByb3BlcnRpZXMgPSBjb2xsZWN0UmVsYXRlZFByb3BlcnRpZXNSZWN1cnNpdmVseShcblx0XHRcdFx0XHRcdFx0aW5uZXJEYXRhRmllbGQsXG5cdFx0XHRcdFx0XHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0XHRcdFx0XHRcdHRhYmxlVHlwZSxcblx0XHRcdFx0XHRcdFx0cmVsYXRlZFByb3BlcnRpZXMsXG5cdFx0XHRcdFx0XHRcdHRydWVcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhUG9pbnRUeXBlOlxuXHRcdFx0XHRcdGlzU3RhdGljYWxseUhpZGRlbiA9IGlzUmVmZXJlbmNlUHJvcGVydHlTdGF0aWNhbGx5SGlkZGVuKGRhdGFGaWVsZCk7XG5cdFx0XHRcdFx0cmVsYXRlZFByb3BlcnRpZXMgPSBjb2xsZWN0UmVsYXRlZFByb3BlcnRpZXMoXG5cdFx0XHRcdFx0XHRkYXRhRmllbGQuVGFyZ2V0LiR0YXJnZXQuVmFsdWUucGF0aCxcblx0XHRcdFx0XHRcdGRhdGFGaWVsZCxcblx0XHRcdFx0XHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0XHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0XHRcdHRhYmxlVHlwZSxcblx0XHRcdFx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzLFxuXHRcdFx0XHRcdFx0aXNFbWJlZGRlZCxcblx0XHRcdFx0XHRcdGlzU3RhdGljYWxseUhpZGRlblxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSBDb21tdW5pY2F0aW9uQW5ub3RhdGlvblR5cGVzLkNvbnRhY3RUeXBlOlxuXHRcdFx0XHRcdGNvbnN0IGRhdGFGaWVsZENvbnRhY3QgPSBkYXRhRmllbGQuVGFyZ2V0LiR0YXJnZXQgYXMgQ29udGFjdDtcblx0XHRcdFx0XHRpc1N0YXRpY2FsbHlIaWRkZW4gPSBpc1JlZmVyZW5jZVByb3BlcnR5U3RhdGljYWxseUhpZGRlbihkYXRhRmllbGQpO1xuXHRcdFx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzID0gY29sbGVjdFJlbGF0ZWRQcm9wZXJ0aWVzKFxuXHRcdFx0XHRcdFx0ZGF0YUZpZWxkLlRhcmdldC52YWx1ZSxcblx0XHRcdFx0XHRcdGRhdGFGaWVsZENvbnRhY3QsXG5cdFx0XHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdFx0XHRcdFx0aXNTdGF0aWNhbGx5SGlkZGVuLFxuXHRcdFx0XHRcdFx0dGFibGVUeXBlLFxuXHRcdFx0XHRcdFx0cmVsYXRlZFByb3BlcnRpZXMsXG5cdFx0XHRcdFx0XHRpc0VtYmVkZGVkLFxuXHRcdFx0XHRcdFx0aXNTdGF0aWNhbGx5SGlkZGVuXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHRcdGJyZWFrO1xuXG5cdFx0ZGVmYXVsdDpcblx0XHRcdGJyZWFrO1xuXHR9XG5cblx0cmV0dXJuIHJlbGF0ZWRQcm9wZXJ0aWVzO1xufVxuXG5leHBvcnQgY29uc3QgZ2V0RGF0YUZpZWxkRGF0YVR5cGUgPSBmdW5jdGlvbiAob0RhdGFGaWVsZDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyB8IFByb3BlcnR5KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0aWYgKGlzUHJvcGVydHkob0RhdGFGaWVsZCkpIHtcblx0XHRyZXR1cm4gb0RhdGFGaWVsZC50eXBlO1xuXHR9XG5cdGxldCBzRGF0YVR5cGU6IHN0cmluZyB8IHVuZGVmaW5lZDtcblx0c3dpdGNoIChvRGF0YUZpZWxkLiRUeXBlKSB7XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBY3Rpb25Hcm91cDpcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhBY3Rpb25Hcm91cDpcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFjdGlvbjpcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbjpcblx0XHRcdHNEYXRhVHlwZSA9IHVuZGVmaW5lZDtcblx0XHRcdGJyZWFrO1xuXG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGQ6XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoTmF2aWdhdGlvblBhdGg6XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoVXJsOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aEludGVudEJhc2VkTmF2aWdhdGlvbjpcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhBY3Rpb246XG5cdFx0XHRzRGF0YVR5cGUgPSAob0RhdGFGaWVsZCBhcyBEYXRhRmllbGQpPy5WYWx1ZT8uJHRhcmdldD8udHlwZTtcblx0XHRcdGJyZWFrO1xuXG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBbm5vdGF0aW9uOlxuXHRcdGRlZmF1bHQ6XG5cdFx0XHRpZiAob0RhdGFGaWVsZC5UYXJnZXQ/LiR0YXJnZXQ/LiRUeXBlKSB7XG5cdFx0XHRcdGNvbnN0IGRhdGFGaWVsZFRhcmdldCA9IG9EYXRhRmllbGQuVGFyZ2V0LiR0YXJnZXQ7XG5cdFx0XHRcdGlmIChkYXRhRmllbGRUYXJnZXQuJFR5cGUgPT09IENvbW11bmljYXRpb25Bbm5vdGF0aW9uVHlwZXMuQ29udGFjdFR5cGUgJiYgaXNQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb24oZGF0YUZpZWxkVGFyZ2V0LmZuKSkge1xuXHRcdFx0XHRcdHNEYXRhVHlwZSA9IGRhdGFGaWVsZFRhcmdldC5mbi4kdGFyZ2V0Py50eXBlO1xuXHRcdFx0XHR9IGVsc2UgaWYgKGRhdGFGaWVsZFRhcmdldC4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YVBvaW50VHlwZSkge1xuXHRcdFx0XHRcdHNEYXRhVHlwZSA9IGRhdGFGaWVsZFRhcmdldC5WYWx1ZT8uJFBhdGg/LiRUeXBlIHx8IGRhdGFGaWVsZFRhcmdldC5WYWx1ZT8uJHRhcmdldD8udHlwZTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBlLmcuIEZpZWxkR3JvdXAgb3IgQ2hhcnRcblx0XHRcdFx0XHQvLyBGaWVsZEdyb3VwIFByb3BlcnRpZXMgaGF2ZSBubyB0eXBlLCBzbyB3ZSBkZWZpbmUgaXQgYXMgYSBib29sZWFuIHR5cGUgdG8gcHJldmVudCBleGNlcHRpb25zIGR1cmluZyB0aGUgY2FsY3VsYXRpb24gb2YgdGhlIHdpZHRoXG5cdFx0XHRcdFx0c0RhdGFUeXBlID1cblx0XHRcdFx0XHRcdG9EYXRhRmllbGQuVGFyZ2V0LiR0YXJnZXQuJFR5cGUgPT09IFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuQ2hhcnREZWZpbml0aW9uVHlwZVwiID8gdW5kZWZpbmVkIDogXCJFZG0uQm9vbGVhblwiO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRzRGF0YVR5cGUgPSB1bmRlZmluZWQ7XG5cdFx0XHR9XG5cdFx0XHRicmVhaztcblx0fVxuXG5cdHJldHVybiBzRGF0YVR5cGU7XG59O1xuIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFBQTtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7RUFzQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDTyxTQUFTQSw0QkFBNEIsQ0FBQ0MsU0FBaUMsRUFBZ0Q7SUFDN0gsT0FBUUEsU0FBUyxDQUFxQ0MsY0FBYyxDQUFDLFFBQVEsQ0FBQztFQUMvRTs7RUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQU5BO0VBT08sU0FBU0Msd0JBQXdCLENBQUNGLFNBQTZDLEVBQXVDO0lBQzVILE9BQU8sQ0FBQUEsU0FBUyxhQUFUQSxTQUFTLHVCQUFUQSxTQUFTLENBQUVHLEtBQUsseURBQTZDO0VBQ3JFO0VBQUM7RUFFTSxTQUFTQyxvQkFBb0IsQ0FBQ0osU0FBNkMsRUFBbUM7SUFDcEgsT0FBTyxDQUFBQSxTQUFTLGFBQVRBLFNBQVMsdUJBQVRBLFNBQVMsQ0FBRUcsS0FBSyxxREFBeUM7RUFDakU7O0VBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFOQTtFQU9PLFNBQVNFLG1DQUFtQyxDQUFDTCxTQUFpQyxFQUFrRDtJQUN0SSxPQUFPQSxTQUFTLENBQUNHLEtBQUssbUVBQXdEO0VBQy9FOztFQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBTkE7RUFPTyxTQUFTRyxnQkFBZ0IsQ0FBQ04sU0FBMkMsRUFBK0I7SUFDMUcsT0FBUUEsU0FBUyxDQUFvQkMsY0FBYyxDQUFDLE9BQU8sQ0FBQztFQUM3RDs7RUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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
610
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJpc0RhdGFGaWVsZEZvckFjdGlvbkFic3RyYWN0IiwiZGF0YUZpZWxkIiwiaGFzT3duUHJvcGVydHkiLCJpc0RhdGFGaWVsZEZvckFubm90YXRpb24iLCIkVHlwZSIsImlzRGF0YUZpZWxkRm9yQWN0aW9uIiwiaXNEYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb24iLCJpc0RhdGFGaWVsZFR5cGVzIiwiaXNEYXRhRmllbGQiLCJoYXNGaWVsZEdyb3VwVGFyZ2V0IiwiZGF0YUZpZWxkRm9yQW5ub3RhdGlvbiIsImRhdGFGaWVsZFRhcmdldCIsIlRhcmdldCIsIiR0YXJnZXQiLCJpc0Fubm90YXRpb25PZlR5cGUiLCJoYXNEYXRhUG9pbnRUYXJnZXQiLCJpc0RhdGFNb2RlbE9iamVjdFBhdGhGb3JBY3Rpb25XaXRoRGlhbG9nIiwiZGF0YU1vZGVsT2JqZWN0UGF0aCIsInRhcmdldCIsInRhcmdldE9iamVjdCIsImlzQWN0aW9uV2l0aERpYWxvZyIsInVuZGVmaW5lZCIsImFjdGlvbiIsIkFjdGlvblRhcmdldCIsImJDcml0aWNhbCIsImFubm90YXRpb25zIiwiQ29tbW9uIiwiSXNBY3Rpb25Dcml0aWNhbCIsInBhcmFtZXRlcnMiLCJsZW5ndGgiLCJnZXRUYXJnZXRWYWx1ZU9uRGF0YVBvaW50Iiwic291cmNlIiwidGFyZ2V0VmFsdWUiLCJpc1Byb3BlcnR5IiwiZGF0YVBvaW50IiwiVUkiLCJEYXRhRmllbGREZWZhdWx0IiwiVGFyZ2V0VmFsdWUiLCJNYXhpbXVtVmFsdWUiLCJ0b1N0cmluZyIsImlzUGF0aEFubm90YXRpb25FeHByZXNzaW9uIiwiaXNEYXRhUG9pbnRGcm9tRGF0YUZpZWxkRGVmYXVsdCIsInByb3BlcnR5IiwiaXNSYXRpbmdWaXN1YWxpemF0aW9uRnJvbURhdGFGaWVsZERlZmF1bHQiLCJWaXN1YWxpemF0aW9uIiwiaXNBUHJvZ3Jlc3NUeXBlRnJvbURhdGFQb2ludCIsImdldFNlbWFudGljT2JqZWN0UGF0aCIsImNvbnZlcnRlckNvbnRleHQiLCJvYmplY3QiLCJWYWx1ZSIsIlNlbWFudGljT2JqZWN0IiwiZ2V0RW50aXR5U2V0QmFzZWRBbm5vdGF0aW9uUGF0aCIsImZ1bGx5UXVhbGlmaWVkTmFtZSIsIl9nZXROYXZpZ2F0aW9uUGF0aFByZWZpeCIsInBhdGgiLCJpbmNsdWRlcyIsInN1YnN0cmluZyIsImxhc3RJbmRleE9mIiwiX2NvbGxlY3RBZGRpdGlvbmFsUHJvcGVydGllc0ZvckFuYWx5dGljYWxUYWJsZSIsIm5hdmlnYXRpb25QYXRoUHJlZml4IiwidGFibGVUeXBlIiwicmVsYXRlZFByb3BlcnRpZXMiLCJoaWRkZW5Bbm5vdGF0aW9uIiwiSGlkZGVuIiwiaGlkZGVuQW5ub3RhdGlvblByb3BlcnR5UGF0aCIsImFkZGl0aW9uYWxQcm9wZXJ0aWVzIiwiY3JpdGljYWxpdHkiLCJDcml0aWNhbGl0eSIsImNyaXRpY2FsaXR5UHJvcGVydHlQYXRoIiwiX3NldFJlbGF0ZWRQcm9wZXJ0aWVzQW5kR2V0SW5kZXgiLCJrZXkiLCJ2YWx1ZSIsImRpc3BsYXlNb2RlT2ZQcm9wZXJ0eVVzZWRBc0Rlc2NyaXB0aW9uIiwicHJvcGVydGllcyIsImFubm90YXRpb25Qcm9wZXJ0eSIsIk9iamVjdCIsImtleXMiLCJpbmRleE9mIiwiX2FwcGVuZFRlbXBsYXRlIiwiZXhwb3J0U2V0dGluZ3MiLCJ0ZW1wbGF0ZSIsImNvbGxlY3RSZWxhdGVkUHJvcGVydGllcyIsImlnbm9yZVNlbGYiLCJhZGRVbml0SW5UZW1wbGF0ZSIsImlzQW5ub3RhdGVkQXNIaWRkZW4iLCJ2YWx1ZUluZGV4IiwiY3VycmVuY3lPclVvTUluZGV4IiwidGV4dFByb3BlcnR5UGF0aCIsImdldEFzc29jaWF0ZWRUZXh0UHJvcGVydHlQYXRoIiwidGV4dFByb3BlcnR5IiwiZ2V0QXNzb2NpYXRlZFRleHRQcm9wZXJ0eSIsImdldENvbnZlcnRlckNvbnRleHRGb3IiLCJnZXRDb250ZXh0UGF0aCIsImdldERhdGFNb2RlbE9iamVjdFBhdGgiLCJwcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGgiLCJlbmhhbmNlRGF0YU1vZGVsUGF0aCIsInRleHRQcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGgiLCJ0ZXh0UmVsYXRpdmVQYXRoIiwiZ2V0Q29udGV4dFJlbGF0aXZlVGFyZ2V0T2JqZWN0UGF0aCIsIndyYXAiLCJkaXNwbGF5TW9kZSIsImdldERpc3BsYXlNb2RlIiwiZGVzY3JpcHRpb25JbmRleCIsImN1cnJlbmN5UHJvcGVydHkiLCJnZXRBc3NvY2lhdGVkQ3VycmVuY3lQcm9wZXJ0eSIsInVuaXRQcm9wZXJ0eSIsImdldEFzc29jaWF0ZWRVbml0UHJvcGVydHkiLCJjdXJyZW5jeU9yVW9NUHJvcGVydHkiLCJjdXJyZW5jeU9yVW5pdEFubm90YXRpb24iLCJNZWFzdXJlcyIsIklTT0N1cnJlbmN5IiwiVW5pdCIsInRpbWV6b25lUHJvcGVydHkiLCJnZXRBc3NvY2lhdGVkVGltZXpvbmVQcm9wZXJ0eSIsInRpbWV6b25lQW5ub3RhdGlvbiIsIlRpbWV6b25lIiwiaXNDdXJyZW5jeSIsImNvbGxlY3RUaW1lem9uZVByb3BlcnRpZXMiLCJWYWx1ZUZvcm1hdCIsImNvbGxlY3REYXRhUG9pbnRQcm9wZXJ0aWVzIiwiY29udGFjdFByb3BlcnR5IiwiZm4iLCJjb250YWN0UHJvcGVydHlQYXRoIiwidW5pdCIsInRpbWV6b25lIiwiZ2V0RGF0YVBvaW50VmlzdWFsaXphdGlvbiIsImRhdGFQb2ludFByb3BlcnR5IiwiZGF0YXBvaW50VGFyZ2V0IiwiZGF0YVBvaW50RGVmYXVsdFByb3BlcnR5IiwiZGF0YVBvaW50SW5kZXgiLCJuYW1lIiwiZGF0YVBvaW50VGFyZ2V0VmFsdWUiLCJoYXNTdGF0aWNQZXJjZW50VW5pdCIsInRpbWV6b25lT3JVb01JbmRleCIsImNvbGxlY3RSZWxhdGVkUHJvcGVydGllc1JlY3Vyc2l2ZWx5IiwiaXNFbWJlZGRlZCIsImlzU3RhdGljYWxseUhpZGRlbiIsImlzUmVmZXJlbmNlUHJvcGVydHlTdGF0aWNhbGx5SGlkZGVuIiwiRGF0YSIsImZvckVhY2giLCJpbm5lckRhdGFGaWVsZCIsImRhdGFGaWVsZENvbnRhY3QiLCJnZXREYXRhRmllbGREYXRhVHlwZSIsIm9EYXRhRmllbGQiLCJ0eXBlIiwic0RhdGFUeXBlIiwiJFBhdGgiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIkRhdGFGaWVsZC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEFubm90YXRpb25UZXJtLCBEZWNpbWFsLCBQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb24sIFByaW1pdGl2ZVR5cGUsIFByb3BlcnR5IH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IENvbnRhY3QgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL0NvbW11bmljYXRpb25cIjtcbmltcG9ydCB7IENvbW11bmljYXRpb25Bbm5vdGF0aW9uVHlwZXMgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL0NvbW11bmljYXRpb25cIjtcbmltcG9ydCB0eXBlIHtcblx0RGF0YUZpZWxkLFxuXHREYXRhRmllbGRBYnN0cmFjdFR5cGVzLFxuXHREYXRhRmllbGRGb3JBY3Rpb24sXG5cdERhdGFGaWVsZEZvckFjdGlvbkFic3RyYWN0VHlwZXMsXG5cdERhdGFGaWVsZEZvckFubm90YXRpb24sXG5cdERhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbixcblx0RGF0YUZpZWxkVHlwZXMsXG5cdERhdGFQb2ludCxcblx0RGF0YVBvaW50VHlwZSxcblx0RGF0YVBvaW50VHlwZVR5cGVzLFxuXHRGaWVsZEdyb3VwXG59IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvVUlcIjtcbmltcG9ydCB7IFVJQW5ub3RhdGlvblR5cGVzLCBWaXN1YWxpemF0aW9uVHlwZSB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvVUlcIjtcbmltcG9ydCB0eXBlIHsgUGFnZUNvbnRleHRQYXRoVGFyZ2V0IH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvVGVtcGxhdGVDb252ZXJ0ZXJcIjtcbmltcG9ydCB0eXBlIHsgQ29sdW1uRXhwb3J0U2V0dGluZ3MsIFRhYmxlVHlwZSB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2NvbnRyb2xzL0NvbW1vbi9UYWJsZVwiO1xuaW1wb3J0IHsgaXNBbm5vdGF0aW9uT2ZUeXBlLCBpc1BhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbiwgaXNQcm9wZXJ0eSB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1R5cGVHdWFyZHNcIjtcbmltcG9ydCB7IGdldERpc3BsYXlNb2RlIH0gZnJvbSBcInNhcC9mZS9jb3JlL3RlbXBsYXRpbmcvRGlzcGxheU1vZGVGb3JtYXR0ZXJcIjtcbmltcG9ydCB7XG5cdGdldEFzc29jaWF0ZWRDdXJyZW5jeVByb3BlcnR5LFxuXHRnZXRBc3NvY2lhdGVkVGV4dFByb3BlcnR5LFxuXHRnZXRBc3NvY2lhdGVkVGV4dFByb3BlcnR5UGF0aCxcblx0Z2V0QXNzb2NpYXRlZFRpbWV6b25lUHJvcGVydHksXG5cdGdldEFzc29jaWF0ZWRVbml0UHJvcGVydHksXG5cdGhhc1N0YXRpY1BlcmNlbnRVbml0XG59IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL1Byb3BlcnR5SGVscGVyXCI7XG5pbXBvcnQgeyBlbmhhbmNlRGF0YU1vZGVsUGF0aCwgZ2V0Q29udGV4dFJlbGF0aXZlVGFyZ2V0T2JqZWN0UGF0aCwgdHlwZSBEYXRhTW9kZWxPYmplY3RQYXRoIH0gZnJvbSBcIi4uLy4uL3RlbXBsYXRpbmcvRGF0YU1vZGVsUGF0aEhlbHBlclwiO1xuaW1wb3J0IHR5cGUgeyBEaXNwbGF5TW9kZSB9IGZyb20gXCIuLi8uLi90ZW1wbGF0aW5nL1VJRm9ybWF0dGVyc1wiO1xuaW1wb3J0IHR5cGUgQ29udmVydGVyQ29udGV4dCBmcm9tIFwiLi4vQ29udmVydGVyQ29udGV4dFwiO1xuaW1wb3J0IHsgaXNSZWZlcmVuY2VQcm9wZXJ0eVN0YXRpY2FsbHlIaWRkZW4gfSBmcm9tIFwiLi4vaGVscGVycy9EYXRhRmllbGRIZWxwZXJcIjtcblxuZXhwb3J0IHR5cGUgQ29tcGxleFByb3BlcnR5SW5mbyA9IHtcblx0cHJvcGVydGllczogUmVjb3JkPHN0cmluZywgeyBhbm5vdGF0aW9uUHJvcGVydHk6IFByb3BlcnR5OyBkaXNwbGF5TW9kZU9mUHJvcGVydHlVc2VkQXNEZXNjcmlwdGlvbj86IERpc3BsYXlNb2RlIH0+O1xuXHRhZGRpdGlvbmFsUHJvcGVydGllczogUmVjb3JkPHN0cmluZywgUHJvcGVydHk+O1xuXHRleHBvcnRTZXR0aW5nczogQ29sdW1uRXhwb3J0U2V0dGluZ3M7XG59O1xuXG4vKipcbiAqIElkZW50aWZpZXMgaWYgdGhlIGdpdmVuIGRhdGFGaWVsZEFic3RyYWN0IHRoYXQgaXMgcGFzc2VkIGlzIGEgXCJEYXRhRmllbGRGb3JBY3Rpb25BYnN0cmFjdFwiLlxuICogRGF0YUZpZWxkRm9yQWN0aW9uQWJzdHJhY3QgaGFzIGFuIGlubGluZSBhY3Rpb24gZGVmaW5lZC5cbiAqXG4gKiBAcGFyYW0gZGF0YUZpZWxkIERhdGFGaWVsZCB0byBiZSBldmFsdWF0ZWRcbiAqIEByZXR1cm5zIFZhbGlkYXRlcyB0aGF0IGRhdGFGaWVsZCBpcyBhIERhdGFGaWVsZEZvckFjdGlvbkFic3RyYWN0VHlwZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNEYXRhRmllbGRGb3JBY3Rpb25BYnN0cmFjdChkYXRhRmllbGQ6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMpOiBkYXRhRmllbGQgaXMgRGF0YUZpZWxkRm9yQWN0aW9uQWJzdHJhY3RUeXBlcyB7XG5cdHJldHVybiAoZGF0YUZpZWxkIGFzIERhdGFGaWVsZEZvckFjdGlvbkFic3RyYWN0VHlwZXMpLmhhc093blByb3BlcnR5KFwiQWN0aW9uXCIpO1xufVxuXG4vKipcbiAqIElkZW50aWZpZXMgaWYgdGhlIGdpdmVuIGRhdGFGaWVsZEFic3RyYWN0IHRoYXQgaXMgcGFzc2VkIGlzIGEgXCJpc0RhdGFGaWVsZEZvckFubm90YXRpb25cIi5cbiAqIGlzRGF0YUZpZWxkRm9yQW5ub3RhdGlvbiBoYXMgYW4gaW5saW5lICRUeXBlIHByb3BlcnR5IHRoYXQgY2FuIGJlIHVzZWQuXG4gKlxuICogQHBhcmFtIGRhdGFGaWVsZCBEYXRhRmllbGQgdG8gYmUgZXZhbHVhdGVkXG4gKiBAcmV0dXJucyBWYWxpZGF0ZXMgdGhhdCBkYXRhRmllbGQgaXMgYSBEYXRhRmllbGRGb3JBbm5vdGF0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0RhdGFGaWVsZEZvckFubm90YXRpb24oXG5cdGRhdGFGaWVsZDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyB8IERhdGFQb2ludFR5cGVUeXBlcyB8IHVuZGVmaW5lZFxuKTogZGF0YUZpZWxkIGlzIERhdGFGaWVsZEZvckFubm90YXRpb24ge1xuXHRyZXR1cm4gZGF0YUZpZWxkPy4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQW5ub3RhdGlvbjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRGF0YUZpZWxkRm9yQWN0aW9uKGRhdGFGaWVsZDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyB8IHVuZGVmaW5lZCk6IGRhdGFGaWVsZCBpcyBEYXRhRmllbGRGb3JBY3Rpb24ge1xuXHRyZXR1cm4gZGF0YUZpZWxkPy4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQWN0aW9uO1xufVxuXG4vKipcbiAqIElkZW50aWZpZXMgaWYgdGhlIGdpdmVuIGRhdGFGaWVsZEFic3RyYWN0IHRoYXQgaXMgcGFzc2VkIGlzIGEgXCJEYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb25cIi5cbiAqIERhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbiBoYXMgYW4gaW5saW5lICRUeXBlIHByb3BlcnR5IHRoYXQgY2FuIGJlIHVzZWQuXG4gKlxuICogQHBhcmFtIGRhdGFGaWVsZCBEYXRhRmllbGQgdG8gYmUgZXZhbHVhdGVkXG4gKiBAcmV0dXJucyBWYWxpZGF0ZXMgdGhhdCBkYXRhRmllbGQgaXMgYSBEYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uKGRhdGFGaWVsZDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyk6IGRhdGFGaWVsZCBpcyBEYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb24ge1xuXHRyZXR1cm4gZGF0YUZpZWxkLiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb247XG59XG5cbi8qKlxuICogSWRlbnRpZmllcyBpZiB0aGUgZ2l2ZW4gZGF0YUZpZWxkQWJzdHJhY3QgdGhhdCBpcyBwYXNzZWQgaXMgYSBcIkRhdGFGaWVsZFR5cGVzXCIuXG4gKiBEYXRhRmllbGQgaGFzIGEgdmFsdWUgZGVmaW5lZC5cbiAqXG4gKiBAcGFyYW0gZGF0YUZpZWxkIERhdGFGaWVsZCB0byBiZSBldmFsdWF0ZWRcbiAqIEByZXR1cm5zIFZhbGlkYXRlIHRoYXQgZGF0YUZpZWxkIGlzIGEgRGF0YUZpZWxkVHlwZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRGF0YUZpZWxkVHlwZXMoZGF0YUZpZWxkOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzIHwgdW5rbm93bik6IGRhdGFGaWVsZCBpcyBEYXRhRmllbGRUeXBlcyB7XG5cdHJldHVybiAoZGF0YUZpZWxkIGFzIERhdGFGaWVsZFR5cGVzKS5oYXNPd25Qcm9wZXJ0eShcIlZhbHVlXCIpO1xufVxuXG4vKipcbiAqIElkZW50aWZpZXMgaWYgdGhlIGdpdmVuIGRhdGFGaWVsZEFic3RyYWN0IHRoYXQgaXMgcGFzc2VkIGlzIGEgXCJEYXRhRmllbGRcIi5cbiAqIERhdGFGaWVsZCBoYXMgYSB2YWx1ZSBkZWZpbmVkLlxuICpcbiAqIEBwYXJhbSBkYXRhRmllbGQgRGF0YUZpZWxkIHRvIGJlIGV2YWx1YXRlZFxuICogQHJldHVybnMgVmFsaWRhdGUgdGhhdCBkYXRhRmllbGQgaXMgYSBEYXRhRmllbGRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRGF0YUZpZWxkKGRhdGFGaWVsZDogRGF0YUZpZWxkIHwgdW5rbm93bik6IGRhdGFGaWVsZCBpcyBEYXRhRmllbGQge1xuXHRyZXR1cm4gKGRhdGFGaWVsZCBhcyBEYXRhRmllbGQpPy5oYXNPd25Qcm9wZXJ0eShcIlZhbHVlXCIpO1xufVxuXG4vKipcbiAqIERldGVybWluZXMgaWYgdGhlIGRhdGFGaWVsZEZvckFubm90YXRpb24gaXMgYSBmaWVsZCBncm91cC5cbiAqXG4gKiBAcGFyYW0gZGF0YUZpZWxkRm9yQW5ub3RhdGlvbiBUaGUgZGF0YUZpZWxkRm9yQW5ub3RhdGlvbiBiZWluZyBwcm9jZXNzZWRcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGRhdGFGaWVsZEZvckFubm90YXRpb24gaXMgYSBmaWVsZCBncm91cC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc0ZpZWxkR3JvdXBUYXJnZXQoZGF0YUZpZWxkRm9yQW5ub3RhdGlvbjogRGF0YUZpZWxkRm9yQW5ub3RhdGlvbik6IGJvb2xlYW4ge1xuXHRjb25zdCBkYXRhRmllbGRUYXJnZXQgPSBkYXRhRmllbGRGb3JBbm5vdGF0aW9uLlRhcmdldC4kdGFyZ2V0O1xuXHRyZXR1cm4gaXNBbm5vdGF0aW9uT2ZUeXBlPEZpZWxkR3JvdXA+KGRhdGFGaWVsZFRhcmdldCwgVUlBbm5vdGF0aW9uVHlwZXMuRmllbGRHcm91cFR5cGUpO1xufVxuXG4vKipcbiAqIERldGVybWluZXMgaWYgdGhlIGRhdGFGaWVsZEZvckFubm90YXRpb24gaXMgYSBkYXRhIHBvaW50LlxuICpcbiAqIEBwYXJhbSBkYXRhRmllbGRGb3JBbm5vdGF0aW9uIFRoZSBkYXRhRmllbGRGb3JBbm5vdGF0aW9uIGJlaW5nIHByb2Nlc3NlZFxuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgZGF0YUZpZWxkRm9yQW5ub3RhdGlvbiBpcyBhIGRhdGEgcG9pbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNEYXRhUG9pbnRUYXJnZXQoZGF0YUZpZWxkRm9yQW5ub3RhdGlvbjogRGF0YUZpZWxkRm9yQW5ub3RhdGlvbik6IGJvb2xlYW4ge1xuXHRjb25zdCBkYXRhRmllbGRUYXJnZXQgPSBkYXRhRmllbGRGb3JBbm5vdGF0aW9uLlRhcmdldC4kdGFyZ2V0O1xuXHRyZXR1cm4gaXNBbm5vdGF0aW9uT2ZUeXBlPERhdGFQb2ludD4oZGF0YUZpZWxkVGFyZ2V0LCBVSUFubm90YXRpb25UeXBlcy5EYXRhUG9pbnRUeXBlKTtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgdGhlIGRhdGEgbW9kZWwgb2JqZWN0IHBhdGggdGFyZ2V0aW5nIGEgZGF0YUZpZWxkIGZvciBhY3Rpb24gb3BlbnMgdXAgYSBkaWFsb2cuXG4gKlxuICogQHBhcmFtIGRhdGFNb2RlbE9iamVjdFBhdGggRGF0YU1vZGVsT2JqZWN0UGF0aFxuICogQHJldHVybnMgYERpYWxvZ2AgfCBgTm9uZWAgaWYgYSBkaWFsb2cgaXMgbmVlZGVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0RhdGFNb2RlbE9iamVjdFBhdGhGb3JBY3Rpb25XaXRoRGlhbG9nKFxuXHRkYXRhTW9kZWxPYmplY3RQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoPERhdGFGaWVsZEFic3RyYWN0VHlwZXM+XG4pOiBcIkRpYWxvZ1wiIHwgXCJOb25lXCIge1xuXHRjb25zdCB0YXJnZXQgPSBkYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldE9iamVjdDtcblx0cmV0dXJuIGlzQWN0aW9uV2l0aERpYWxvZyhpc0RhdGFGaWVsZEZvckFjdGlvbih0YXJnZXQpID8gdGFyZ2V0IDogdW5kZWZpbmVkKTtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgdGhlIGRhdGFGaWVsZCBmb3IgYWN0aW9uIG9wZW5zIHVwIGEgZGlhbG9nLlxuICpcbiAqIEBwYXJhbSBkYXRhRmllbGQgRGF0YUZpZWxkIGZvciBhY3Rpb25cbiAqIEByZXR1cm5zIGBEaWFsb2dgIHwgYE5vbmVgIGlmIGEgZGlhbG9nIGlzIG5lZWRlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNBY3Rpb25XaXRoRGlhbG9nKGRhdGFGaWVsZD86IERhdGFGaWVsZEZvckFjdGlvbik6IFwiRGlhbG9nXCIgfCBcIk5vbmVcIiB7XG5cdGNvbnN0IGFjdGlvbiA9IGRhdGFGaWVsZD8uQWN0aW9uVGFyZ2V0O1xuXHRpZiAoYWN0aW9uKSB7XG5cdFx0Y29uc3QgYkNyaXRpY2FsID0gYWN0aW9uLmFubm90YXRpb25zPy5Db21tb24/LklzQWN0aW9uQ3JpdGljYWw7XG5cdFx0aWYgKGFjdGlvbi5wYXJhbWV0ZXJzLmxlbmd0aCA+IDEgfHwgYkNyaXRpY2FsKSB7XG5cdFx0XHRyZXR1cm4gXCJEaWFsb2dcIjtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIFwiTm9uZVwiO1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gXCJOb25lXCI7XG5cdH1cbn1cblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIFRhcmdldFZhbHVlIGZyb20gYSBEYXRhUG9pbnQuXG4gKlxuICogQHBhcmFtIHNvdXJjZSBUaGUgdGFyZ2V0IHByb3BlcnR5IG9yIERhdGFQb2ludFxuICogQHJldHVybnMgVGhlIFRhcmdldFZhbHVlIGFzIGEgZGVjaW1hbCBvciBhIHByb3BlcnR5IHBhdGhcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGFyZ2V0VmFsdWVPbkRhdGFQb2ludChzb3VyY2U6IFByb3BlcnR5IHwgRGF0YVBvaW50VHlwZSk6IFBhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbjx1bmtub3duPiB8IHN0cmluZyB7XG5cdGxldCB0YXJnZXRWYWx1ZTogRGVjaW1hbCB8IHVuZGVmaW5lZCB8IFBhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbjx1bmtub3duPiB8IHN0cmluZztcblx0aWYgKGlzUHJvcGVydHkoc291cmNlKSkge1xuXHRcdGNvbnN0IGRhdGFQb2ludCA9IChzb3VyY2UuYW5ub3RhdGlvbnM/LlVJPy5EYXRhRmllbGREZWZhdWx0IGFzIERhdGFGaWVsZEZvckFubm90YXRpb24pPy5UYXJnZXQ/LiR0YXJnZXQgYXMgRGF0YVBvaW50VHlwZTtcblx0XHR0YXJnZXRWYWx1ZSA9IGRhdGFQb2ludD8uVGFyZ2V0VmFsdWUgPz8gZGF0YVBvaW50Py5NYXhpbXVtVmFsdWU7XG5cdH0gZWxzZSB7XG5cdFx0dGFyZ2V0VmFsdWUgPSBzb3VyY2UuVGFyZ2V0VmFsdWUgPz8gc291cmNlLk1heGltdW1WYWx1ZTtcblx0fVxuXHRpZiAodHlwZW9mIHRhcmdldFZhbHVlID09PSBcIm51bWJlclwiKSB7XG5cdFx0cmV0dXJuIHRhcmdldFZhbHVlLnRvU3RyaW5nKCk7XG5cdH1cblx0cmV0dXJuIGlzUGF0aEFubm90YXRpb25FeHByZXNzaW9uKHRhcmdldFZhbHVlKSA/IHRhcmdldFZhbHVlIDogXCIxMDBcIjtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiBhIHByb3BlcnR5IHVzZXMgYSBEYXRhUG9pbnQgd2l0aGluIGEgRGF0YUZpZWxkRGVmYXVsdC5cbiAqXG4gKiBAcGFyYW0gcHJvcGVydHkgVGhlIHByb3BlcnR5IHRvIGJlIGNoZWNrZWRcbiAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgcmVmZXJlbmNlZCBwcm9wZXJ0eSBoYXMgYSBEYXRhUG9pbnQgd2l0aGluIHRoZSBEYXRhRmllbGREZWZhdWx0LCBmYWxzZSBlbHNlXG4gKi9cblxuZXhwb3J0IGNvbnN0IGlzRGF0YVBvaW50RnJvbURhdGFGaWVsZERlZmF1bHQgPSBmdW5jdGlvbiAocHJvcGVydHk6IFByb3BlcnR5KTogYm9vbGVhbiB7XG5cdHJldHVybiAoXG5cdFx0KHByb3BlcnR5LmFubm90YXRpb25zPy5VST8uRGF0YUZpZWxkRGVmYXVsdCBhcyBEYXRhRmllbGRGb3JBbm5vdGF0aW9uKT8uVGFyZ2V0Py4kdGFyZ2V0Py4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YVBvaW50VHlwZVxuXHQpO1xufTtcblxuLyoqXG4gKiBDaGVjayBpZiBhIHByb3BlcnR5IHVzZXMgYSBkZWZhdWx0IHZpc3VhbGl6YXRpb24gUmF0aW5nIHRocm91Z2ggYSBEYXRhRmllbGREZWZhdWx0LlxuICpcbiAqIEBwYXJhbSBwcm9wZXJ0eSBUaGUgcHJvcGVydHkgdG8gYmUgY2hlY2tlZFxuICogQHJldHVybnMgYHRydWVgIGlmIHRoZSB2aXN1YWxpemF0aW9uIHRocm91Z2ggYSBEYXRhRmllbGREZWZhdWx0IGlzIGEgUmF0aW5nXG4gKi9cblxuZXhwb3J0IGNvbnN0IGlzUmF0aW5nVmlzdWFsaXphdGlvbkZyb21EYXRhRmllbGREZWZhdWx0ID0gZnVuY3Rpb24gKHByb3BlcnR5OiBQcm9wZXJ0eSk6IGJvb2xlYW4ge1xuXHRyZXR1cm4gKFxuXHRcdGlzRGF0YVBvaW50RnJvbURhdGFGaWVsZERlZmF1bHQocHJvcGVydHkpICYmXG5cdFx0KChwcm9wZXJ0eS5hbm5vdGF0aW9ucz8uVUk/LkRhdGFGaWVsZERlZmF1bHQgYXMgRGF0YUZpZWxkRm9yQW5ub3RhdGlvbik/LlRhcmdldD8uJHRhcmdldCBhcyBBbm5vdGF0aW9uVGVybTxEYXRhUG9pbnQ+KVxuXHRcdFx0Py5WaXN1YWxpemF0aW9uID09PSBcIlVJLlZpc3VhbGl6YXRpb25UeXBlL1JhdGluZ1wiXG5cdCk7XG59O1xuXG4vKipcbiAqIENoZWNrIGlmIGEgcHJvcGVydHkgdXNlcyBhIFByb2dyZXNzIHZpc3VhbGl6YXRpb24gUmF0aW5nIHRocm91Z2ggYSBEYXRhRmllbGREZWZhdWx0IG9yIGEgZGlyZWN0IERhdGFQb2ludC5cbiAqXG4gKiBAcGFyYW0gcHJvcGVydHkgVGhlIHByb3BlcnR5IHRvIGJlIGNoZWNrZWRcbiAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmlzdWFsaXphdGlvbiBpcyBhIFByb2dyZXNzXG4gKi9cblxuZXhwb3J0IGNvbnN0IGlzQVByb2dyZXNzVHlwZUZyb21EYXRhUG9pbnQgPSBmdW5jdGlvbiAocHJvcGVydHk6IFByb3BlcnR5IHwgRGF0YUZpZWxkRm9yQW5ub3RhdGlvbik6IGJvb2xlYW4ge1xuXHRpZiAoaXNQcm9wZXJ0eShwcm9wZXJ0eSkgJiYgaXNEYXRhUG9pbnRGcm9tRGF0YUZpZWxkRGVmYXVsdChwcm9wZXJ0eSkpIHtcblx0XHRwcm9wZXJ0eSA9IHByb3BlcnR5LmFubm90YXRpb25zLlVJPy5EYXRhRmllbGREZWZhdWx0IGFzIERhdGFGaWVsZEZvckFubm90YXRpb247XG5cdH1cblx0cmV0dXJuICgocHJvcGVydHkgYXMgRGF0YUZpZWxkRm9yQW5ub3RhdGlvbikuVGFyZ2V0Py4kdGFyZ2V0IGFzIERhdGFQb2ludFR5cGUpPy5WaXN1YWxpemF0aW9uID09PSBcIlVJLlZpc3VhbGl6YXRpb25UeXBlL1Byb2dyZXNzXCI7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2VtYW50aWNPYmplY3RQYXRoKFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sXG5cdG9iamVjdDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyB8IFByb3BlcnR5XG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRpZiAodHlwZW9mIG9iamVjdCA9PT0gXCJvYmplY3RcIikge1xuXHRcdGlmIChpc0RhdGFGaWVsZFR5cGVzKG9iamVjdCkgJiYgb2JqZWN0LlZhbHVlPy4kdGFyZ2V0KSB7XG5cdFx0XHRjb25zdCBwcm9wZXJ0eSA9IG9iamVjdC5WYWx1ZT8uJHRhcmdldDtcblx0XHRcdGlmIChwcm9wZXJ0eT8uYW5ub3RhdGlvbnM/LkNvbW1vbj8uU2VtYW50aWNPYmplY3QgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRyZXR1cm4gY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlTZXRCYXNlZEFubm90YXRpb25QYXRoKHByb3BlcnR5Py5mdWxseVF1YWxpZmllZE5hbWUpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAoaXNQcm9wZXJ0eShvYmplY3QpKSB7XG5cdFx0XHRpZiAob2JqZWN0Py5hbm5vdGF0aW9ucz8uQ29tbW9uPy5TZW1hbnRpY09iamVjdCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHJldHVybiBjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVNldEJhc2VkQW5ub3RhdGlvblBhdGgob2JqZWN0Py5mdWxseVF1YWxpZmllZE5hbWUpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHRyZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIG5hdmlnYXRpb24gcGF0aCBwcmVmaXggZm9yIGEgcHJvcGVydHkgcGF0aC5cbiAqXG4gKiBAcGFyYW0gcGF0aCBUaGUgcHJvcGVydHkgcGF0aCBGb3IgZS5nLiAvRW50aXR5VHlwZS9OYXZpZ2F0aW9uL1Byb3BlcnR5XG4gKiBAcmV0dXJucyBUaGUgbmF2aWdhdGlvbiBwYXRoIHByZWZpeCBGb3IgZS5nLiAvRW50aXR5VHlwZS9OYXZpZ2F0aW9uL1xuICovXG5mdW5jdGlvbiBfZ2V0TmF2aWdhdGlvblBhdGhQcmVmaXgocGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcblx0aWYgKHBhdGgpIHtcblx0XHRyZXR1cm4gcGF0aC5pbmNsdWRlcyhcIi9cIikgPyBwYXRoLnN1YnN0cmluZygwLCBwYXRoLmxhc3RJbmRleE9mKFwiL1wiKSArIDEpIDogXCJcIjtcblx0fVxuXHRyZXR1cm4gXCJcIjtcbn1cblxuLyoqXG4gKiBDb2xsZWN0IGFkZGl0aW9uYWwgcHJvcGVydGllcyBmb3IgdGhlIEFMUCB0YWJsZSB1c2UtY2FzZS5cbiAqXG4gKiBGb3IgZS5nLiBJZiBVSS5IaWRkZW4gcG9pbnRzIHRvIGEgcHJvcGVydHksIGluY2x1ZGUgdGhpcyBwcm9wZXJ0eSBpbiB0aGUgYWRkaXRpb25hbFByb3BlcnRpZXMgb2YgQ29tcGxleFByb3BlcnR5SW5mbyBvYmplY3QuXG4gKlxuICogQHBhcmFtIHRhcmdldCBQcm9wZXJ0eSBvciBEYXRhRmllbGQgYmVpbmcgcHJvY2Vzc2VkXG4gKiBAcGFyYW0gbmF2aWdhdGlvblBhdGhQcmVmaXggTmF2aWdhdGlvbiBwYXRoIHByZWZpeCwgYXBwbGljYWJsZSBpbiBjYXNlIG9mIG5hdmlnYXRpb24gcHJvcGVydGllcy5cbiAqIEBwYXJhbSB0YWJsZVR5cGUgVGFibGUgdHlwZS5cbiAqIEBwYXJhbSByZWxhdGVkUHJvcGVydGllcyBUaGUgcmVsYXRlZCBwcm9wZXJ0aWVzIGlkZW50aWZpZWQgc28gZmFyLlxuICogQHJldHVybnMgVGhlIHJlbGF0ZWQgcHJvcGVydGllcyBpZGVudGlmaWVkLlxuICovXG5mdW5jdGlvbiBfY29sbGVjdEFkZGl0aW9uYWxQcm9wZXJ0aWVzRm9yQW5hbHl0aWNhbFRhYmxlKFxuXHR0YXJnZXQ6IFByaW1pdGl2ZVR5cGUsXG5cdG5hdmlnYXRpb25QYXRoUHJlZml4OiBzdHJpbmcsXG5cdHRhYmxlVHlwZTogVGFibGVUeXBlLFxuXHRyZWxhdGVkUHJvcGVydGllczogQ29tcGxleFByb3BlcnR5SW5mb1xuKTogQ29tcGxleFByb3BlcnR5SW5mbyB7XG5cdGlmICh0YWJsZVR5cGUgPT09IFwiQW5hbHl0aWNhbFRhYmxlXCIpIHtcblx0XHRjb25zdCBoaWRkZW5Bbm5vdGF0aW9uID0gdGFyZ2V0LmFubm90YXRpb25zPy5VST8uSGlkZGVuO1xuXHRcdGlmIChoaWRkZW5Bbm5vdGF0aW9uPy5wYXRoICYmIGlzUHJvcGVydHkoaGlkZGVuQW5ub3RhdGlvbi4kdGFyZ2V0KSkge1xuXHRcdFx0Y29uc3QgaGlkZGVuQW5ub3RhdGlvblByb3BlcnR5UGF0aCA9IG5hdmlnYXRpb25QYXRoUHJlZml4ICsgaGlkZGVuQW5ub3RhdGlvbi5wYXRoO1xuXHRcdFx0Ly8gVGhpcyBwcm9wZXJ0eSBzaG91bGQgYmUgYWRkZWQgdG8gYWRkaXRpb25hbFByb3BlcnRpZXMgbWFwIGZvciB0aGUgQUxQIHRhYmxlIHVzZS1jYXNlLlxuXHRcdFx0cmVsYXRlZFByb3BlcnRpZXMuYWRkaXRpb25hbFByb3BlcnRpZXNbaGlkZGVuQW5ub3RhdGlvblByb3BlcnR5UGF0aF0gPSBoaWRkZW5Bbm5vdGF0aW9uLiR0YXJnZXQ7XG5cdFx0fVxuXG5cdFx0Y29uc3QgY3JpdGljYWxpdHkgPSB0YXJnZXQuQ3JpdGljYWxpdHk7XG5cdFx0aWYgKGNyaXRpY2FsaXR5Py5wYXRoICYmIGlzUHJvcGVydHkoY3JpdGljYWxpdHk/LiR0YXJnZXQpKSB7XG5cdFx0XHRjb25zdCBjcml0aWNhbGl0eVByb3BlcnR5UGF0aCA9IG5hdmlnYXRpb25QYXRoUHJlZml4ICsgY3JpdGljYWxpdHkucGF0aDtcblx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzLmFkZGl0aW9uYWxQcm9wZXJ0aWVzW2NyaXRpY2FsaXR5UHJvcGVydHlQYXRoXSA9IGNyaXRpY2FsaXR5Py4kdGFyZ2V0O1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gcmVsYXRlZFByb3BlcnRpZXM7XG59XG5cbi8qKlxuICogSGVscGVyIGZvciBjb2xsZWN0UmVsYXRlZFByb3BlcnRpZXMgdG8gcHVzaCB1bmlxdWUgcmVsYXRlZCBwcm9wZXJ0aWVzLlxuICpcbiAqIEBwYXJhbSByZWxhdGVkUHJvcGVydGllc1xuICogQHBhcmFtIGtleSBUaGUgcHJvcGVydHkgcGF0aFxuICogQHBhcmFtIHZhbHVlIFRoZSBwcm9wZXJ0aWVzIG9iamVjdCBjb250YWluaW5nIHZhbHVlIHByb3BlcnR5LCBkZXNjcmlwdGlvbiBwcm9wZXJ0eS4uLlxuICogQHBhcmFtIGRpc3BsYXlNb2RlT2ZQcm9wZXJ0eVVzZWRBc0Rlc2NyaXB0aW9uIFRoZSBkaXNwbGF5IG1vZGUgaWYgdGhlIHByb3BlcnR5IGlzIHJlZmVyZW5jZWQgYXMgZGVzY3JpcHRpb24gb24gdGV4dCBhcnJhbmdlbWVudFxuICogQHJldHVybnMgSW5kZXggYXQgd2hpY2ggdGhlIHByb3BlcnR5IGlzIGF2YWlsYWJsZVxuICovXG5mdW5jdGlvbiBfc2V0UmVsYXRlZFByb3BlcnRpZXNBbmRHZXRJbmRleChcblx0cmVsYXRlZFByb3BlcnRpZXM6IENvbXBsZXhQcm9wZXJ0eUluZm8sXG5cdGtleTogc3RyaW5nLFxuXHR2YWx1ZTogUHJvcGVydHksXG5cdGRpc3BsYXlNb2RlT2ZQcm9wZXJ0eVVzZWRBc0Rlc2NyaXB0aW9uPzogRGlzcGxheU1vZGVcbik6IG51bWJlciB7XG5cdGlmICghcmVsYXRlZFByb3BlcnRpZXMucHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG5cdFx0cmVsYXRlZFByb3BlcnRpZXMucHJvcGVydGllc1trZXldID0geyBhbm5vdGF0aW9uUHJvcGVydHk6IHZhbHVlIH07XG5cdFx0aWYgKGRpc3BsYXlNb2RlT2ZQcm9wZXJ0eVVzZWRBc0Rlc2NyaXB0aW9uKSB7XG5cdFx0XHRyZWxhdGVkUHJvcGVydGllcy5wcm9wZXJ0aWVzW2tleV0uZGlzcGxheU1vZGVPZlByb3BlcnR5VXNlZEFzRGVzY3JpcHRpb24gPSBkaXNwbGF5TW9kZU9mUHJvcGVydHlVc2VkQXNEZXNjcmlwdGlvbjtcblx0XHR9XG5cdH1cblx0cmV0dXJuIE9iamVjdC5rZXlzKHJlbGF0ZWRQcm9wZXJ0aWVzLnByb3BlcnRpZXMpLmluZGV4T2Yoa2V5KTtcbn1cblxuLyoqXG4gKiBIZWxwZXIgZm9yIGNvbGxlY3RSZWxhdGVkUHJvcGVydGllcyB0byBhcHBlbmQgdGhlIGV4cG9ydCBzZXR0aW5ncyB0ZW1wbGF0ZSB3aXRoIGEgZm9ybWF0dGVkIHRleHQuXG4gKlxuICogQHBhcmFtIHJlbGF0ZWRQcm9wZXJ0aWVzXG4gKiBAcGFyYW0gdmFsdWUgRm9ybWF0dGVkIHRleHRcbiAqL1xuZnVuY3Rpb24gX2FwcGVuZFRlbXBsYXRlKHJlbGF0ZWRQcm9wZXJ0aWVzOiBDb21wbGV4UHJvcGVydHlJbmZvLCB2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG5cdHJlbGF0ZWRQcm9wZXJ0aWVzLmV4cG9ydFNldHRpbmdzLnRlbXBsYXRlID0gcmVsYXRlZFByb3BlcnRpZXMuZXhwb3J0U2V0dGluZ3M/LnRlbXBsYXRlXG5cdFx0PyBgJHtyZWxhdGVkUHJvcGVydGllcy5leHBvcnRTZXR0aW5ncy50ZW1wbGF0ZX0ke3ZhbHVlfWBcblx0XHQ6IGAke3ZhbHVlfWA7XG59XG5cbi8qKlxuICogQ29sbGVjdCByZWxhdGVkIHByb3BlcnRpZXMgZnJvbSBhIHByb3BlcnR5J3MgYW5ub3RhdGlvbnMuXG4gKlxuICogQHBhcmFtIHBhdGggVGhlIHByb3BlcnR5IHBhdGhcbiAqIEBwYXJhbSBwcm9wZXJ0eSBUaGUgcHJvcGVydHkgdG8gYmUgY29uc2lkZXJlZFxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGNvbnZlcnRlciBjb250ZXh0XG4gKiBAcGFyYW0gaWdub3JlU2VsZiBXaGV0aGVyIHRvIGV4Y2x1ZGUgdGhlIHNhbWUgcHJvcGVydHkgZnJvbSB0aGUgcmVsYXRlZCBwcm9wZXJ0aWVzLlxuICogQHBhcmFtIHRhYmxlVHlwZSBUaGUgdGFibGUgdHlwZS5cbiAqIEBwYXJhbSByZWxhdGVkUHJvcGVydGllcyBUaGUgcmVsYXRlZCBwcm9wZXJ0aWVzIGlkZW50aWZpZWQgc28gZmFyLlxuICogQHBhcmFtIGFkZFVuaXRJblRlbXBsYXRlIFRydWUgaWYgdGhlIHVuaXQvY3VycmVuY3kgcHJvcGVydHkgbmVlZHMgdG8gYmUgYWRkZWQgaW4gdGhlIGV4cG9ydCB0ZW1wbGF0ZVxuICogQHBhcmFtIGlzQW5ub3RhdGVkQXNIaWRkZW4gVHJ1ZSBpZiB0aGUgRGF0YUZpZWxkIG9yIHRoZSBwcm9wZXJ0eSBhcmUgc3RhdGljYWxseSBoaWRkZW5cbiAqIEByZXR1cm5zIFRoZSByZWxhdGVkIHByb3BlcnRpZXMgaWRlbnRpZmllZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbGxlY3RSZWxhdGVkUHJvcGVydGllcyhcblx0cGF0aDogc3RyaW5nLFxuXHRwcm9wZXJ0eTogUHJpbWl0aXZlVHlwZSxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCxcblx0aWdub3JlU2VsZjogYm9vbGVhbixcblx0dGFibGVUeXBlOiBUYWJsZVR5cGUsXG5cdHJlbGF0ZWRQcm9wZXJ0aWVzOiBDb21wbGV4UHJvcGVydHlJbmZvID0ge1xuXHRcdHByb3BlcnRpZXM6IHt9LFxuXHRcdGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiB7fSxcblx0XHRleHBvcnRTZXR0aW5nczoge31cblx0fSxcblx0YWRkVW5pdEluVGVtcGxhdGUgPSBmYWxzZSxcblx0aXNBbm5vdGF0ZWRBc0hpZGRlbiA9IGZhbHNlXG4pOiBDb21wbGV4UHJvcGVydHlJbmZvIHtcblx0aWYgKHBhdGggJiYgcHJvcGVydHkpIHtcblx0XHRsZXQgdmFsdWVJbmRleDogbnVtYmVyO1xuXHRcdGxldCBjdXJyZW5jeU9yVW9NSW5kZXg6IG51bWJlcjtcblx0XHRpZiAoaXNBbm5vdGF0ZWRBc0hpZGRlbikge1xuXHRcdFx0Ly8gQ29sbGVjdCB1bmRlcmx5aW5nIHByb3BlcnR5XG5cdFx0XHR2YWx1ZUluZGV4ID0gX3NldFJlbGF0ZWRQcm9wZXJ0aWVzQW5kR2V0SW5kZXgocmVsYXRlZFByb3BlcnRpZXMsIHBhdGgsIHByb3BlcnR5KTtcblx0XHRcdF9hcHBlbmRUZW1wbGF0ZShyZWxhdGVkUHJvcGVydGllcywgYHske3ZhbHVlSW5kZXh9fWApO1xuXHRcdFx0cmV0dXJuIHJlbGF0ZWRQcm9wZXJ0aWVzO1xuXHRcdH1cblx0XHRjb25zdCBuYXZpZ2F0aW9uUGF0aFByZWZpeCA9IF9nZXROYXZpZ2F0aW9uUGF0aFByZWZpeChwYXRoKTtcblxuXHRcdC8vIENoZWNrIGZvciBUZXh0IGFubm90YXRpb24uXG5cdFx0Y29uc3QgdGV4dFByb3BlcnR5UGF0aCA9IGdldEFzc29jaWF0ZWRUZXh0UHJvcGVydHlQYXRoKHByb3BlcnR5KTtcblx0XHRjb25zdCB0ZXh0UHJvcGVydHkgPSBnZXRBc3NvY2lhdGVkVGV4dFByb3BlcnR5KHByb3BlcnR5KTtcblxuXHRcdC8vIGdldCB0aGUgRGF0YU1vZGVsT2JqZWN0UGF0aCBmb3IgdGhlIGNvbHVtblxuXHRcdGNvbnN0IGRhdGFNb2RlbE9iamVjdFBhdGggPSBjb252ZXJ0ZXJDb250ZXh0LmdldENvbnZlcnRlckNvbnRleHRGb3IoY29udmVydGVyQ29udGV4dC5nZXRDb250ZXh0UGF0aCgpKS5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCk7XG5cdFx0Y29uc3QgcHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoID0gZW5oYW5jZURhdGFNb2RlbFBhdGg8UHJvcGVydHk+KGRhdGFNb2RlbE9iamVjdFBhdGgsIHBhdGgpO1xuXHRcdGNvbnN0IHRleHRQcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGggPSBlbmhhbmNlRGF0YU1vZGVsUGF0aDxQcm9wZXJ0eT4ocHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoLCB0ZXh0UHJvcGVydHlQYXRoKTtcblx0XHRjb25zdCB0ZXh0UmVsYXRpdmVQYXRoID0gZ2V0Q29udGV4dFJlbGF0aXZlVGFyZ2V0T2JqZWN0UGF0aCh0ZXh0UHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoKTtcblxuXHRcdGlmIChyZWxhdGVkUHJvcGVydGllcy5leHBvcnRTZXR0aW5ncz8udGVtcGxhdGUpIHtcblx0XHRcdC8vIEZpZWxkR3JvdXAgdXNlLWNhc2UuIE5lZWQgdG8gYWRkIGVhY2ggRmllbGQgaW4gbmV3IGxpbmUuXG5cdFx0XHRfYXBwZW5kVGVtcGxhdGUocmVsYXRlZFByb3BlcnRpZXMsIFwiXFxuXCIpO1xuXHRcdFx0cmVsYXRlZFByb3BlcnRpZXMuZXhwb3J0U2V0dGluZ3Mud3JhcCA9IHRydWU7XG5cdFx0fVxuXG5cdFx0aWYgKHRleHRQcm9wZXJ0eSAmJiB0ZXh0UmVsYXRpdmVQYXRoKSB7XG5cdFx0XHQvLyBDaGVjayBmb3IgVGV4dCBBcnJhbmdlbWVudC5cblx0XHRcdGNvbnN0IGRpc3BsYXlNb2RlID0gZ2V0RGlzcGxheU1vZGUocHJvcGVydHksIHByb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aCk7XG5cdFx0XHRsZXQgZGVzY3JpcHRpb25JbmRleDogbnVtYmVyO1xuXHRcdFx0c3dpdGNoIChkaXNwbGF5TW9kZSkge1xuXHRcdFx0XHRjYXNlIFwiRGVzY3JpcHRpb25cIjpcblx0XHRcdFx0XHRkZXNjcmlwdGlvbkluZGV4ID0gX3NldFJlbGF0ZWRQcm9wZXJ0aWVzQW5kR2V0SW5kZXgocmVsYXRlZFByb3BlcnRpZXMsIHRleHRSZWxhdGl2ZVBhdGgsIHRleHRQcm9wZXJ0eSwgXCJEZXNjcmlwdGlvblwiKTtcblx0XHRcdFx0XHRfYXBwZW5kVGVtcGxhdGUocmVsYXRlZFByb3BlcnRpZXMsIGB7JHtkZXNjcmlwdGlvbkluZGV4fX1gKTtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlIFwiVmFsdWVEZXNjcmlwdGlvblwiOlxuXHRcdFx0XHRcdHZhbHVlSW5kZXggPSBfc2V0UmVsYXRlZFByb3BlcnRpZXNBbmRHZXRJbmRleChyZWxhdGVkUHJvcGVydGllcywgcGF0aCwgcHJvcGVydHkpO1xuXHRcdFx0XHRcdGRlc2NyaXB0aW9uSW5kZXggPSBfc2V0UmVsYXRlZFByb3BlcnRpZXNBbmRHZXRJbmRleChcblx0XHRcdFx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzLFxuXHRcdFx0XHRcdFx0dGV4dFJlbGF0aXZlUGF0aCxcblx0XHRcdFx0XHRcdHRleHRQcm9wZXJ0eSxcblx0XHRcdFx0XHRcdFwiVmFsdWVEZXNjcmlwdGlvblwiXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRfYXBwZW5kVGVtcGxhdGUocmVsYXRlZFByb3BlcnRpZXMsIGB7JHt2YWx1ZUluZGV4fX0gKHske2Rlc2NyaXB0aW9uSW5kZXh9fSlgKTtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlIFwiRGVzY3JpcHRpb25WYWx1ZVwiOlxuXHRcdFx0XHRcdHZhbHVlSW5kZXggPSBfc2V0UmVsYXRlZFByb3BlcnRpZXNBbmRHZXRJbmRleChyZWxhdGVkUHJvcGVydGllcywgcGF0aCwgcHJvcGVydHkpO1xuXHRcdFx0XHRcdGRlc2NyaXB0aW9uSW5kZXggPSBfc2V0UmVsYXRlZFByb3BlcnRpZXNBbmRHZXRJbmRleChcblx0XHRcdFx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzLFxuXHRcdFx0XHRcdFx0dGV4dFJlbGF0aXZlUGF0aCxcblx0XHRcdFx0XHRcdHRleHRQcm9wZXJ0eSxcblx0XHRcdFx0XHRcdFwiRGVzY3JpcHRpb25WYWx1ZVwiXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRfYXBwZW5kVGVtcGxhdGUocmVsYXRlZFByb3BlcnRpZXMsIGB7JHtkZXNjcmlwdGlvbkluZGV4fX0gKHske3ZhbHVlSW5kZXh9fSlgKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHR2YWx1ZUluZGV4ID0gX3NldFJlbGF0ZWRQcm9wZXJ0aWVzQW5kR2V0SW5kZXgocmVsYXRlZFByb3BlcnRpZXMsIHBhdGgsIHByb3BlcnR5KTtcblx0XHRcdFx0XHRfYXBwZW5kVGVtcGxhdGUocmVsYXRlZFByb3BlcnRpZXMsIGB7JHt2YWx1ZUluZGV4fX1gKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gQ2hlY2sgZm9yIGZpZWxkIGNvbnRhaW5pbmcgQ3VycmVuY3kgT3IgVW5pdCBQcm9wZXJ0aWVzIG9yIFRpbWV6b25lXG5cdFx0XHRjb25zdCBjdXJyZW5jeVByb3BlcnR5ID0gZ2V0QXNzb2NpYXRlZEN1cnJlbmN5UHJvcGVydHkocHJvcGVydHkpO1xuXHRcdFx0Y29uc3QgdW5pdFByb3BlcnR5ID0gZ2V0QXNzb2NpYXRlZFVuaXRQcm9wZXJ0eShwcm9wZXJ0eSk7XG5cdFx0XHRjb25zdCBjdXJyZW5jeU9yVW9NUHJvcGVydHkgPSBjdXJyZW5jeVByb3BlcnR5ID8/IHVuaXRQcm9wZXJ0eTtcblx0XHRcdGNvbnN0IGN1cnJlbmN5T3JVbml0QW5ub3RhdGlvbjogUGF0aEFubm90YXRpb25FeHByZXNzaW9uPHN0cmluZz4gPVxuXHRcdFx0XHRwcm9wZXJ0eT8uYW5ub3RhdGlvbnM/Lk1lYXN1cmVzPy5JU09DdXJyZW5jeSB8fCBwcm9wZXJ0eT8uYW5ub3RhdGlvbnM/Lk1lYXN1cmVzPy5Vbml0O1xuXHRcdFx0Y29uc3QgdGltZXpvbmVQcm9wZXJ0eSA9IGdldEFzc29jaWF0ZWRUaW1lem9uZVByb3BlcnR5KHByb3BlcnR5KTtcblx0XHRcdGNvbnN0IHRpbWV6b25lQW5ub3RhdGlvbiA9IHByb3BlcnR5Py5hbm5vdGF0aW9ucz8uQ29tbW9uPy5UaW1lem9uZTtcblxuXHRcdFx0aWYgKGN1cnJlbmN5T3JVb01Qcm9wZXJ0eSkge1xuXHRcdFx0XHR2YWx1ZUluZGV4ID0gX3NldFJlbGF0ZWRQcm9wZXJ0aWVzQW5kR2V0SW5kZXgocmVsYXRlZFByb3BlcnRpZXMsIHBhdGgsIHByb3BlcnR5KTtcblx0XHRcdFx0Y3VycmVuY3lPclVvTUluZGV4ID0gX3NldFJlbGF0ZWRQcm9wZXJ0aWVzQW5kR2V0SW5kZXgoXG5cdFx0XHRcdFx0cmVsYXRlZFByb3BlcnRpZXMsXG5cdFx0XHRcdFx0bmF2aWdhdGlvblBhdGhQcmVmaXggKyBjdXJyZW5jeU9yVW5pdEFubm90YXRpb24ucGF0aCxcblx0XHRcdFx0XHRjdXJyZW5jeU9yVW5pdEFubm90YXRpb24uJHRhcmdldCFcblx0XHRcdFx0KTtcblx0XHRcdFx0aWYgKGFkZFVuaXRJblRlbXBsYXRlKSB7XG5cdFx0XHRcdFx0X2FwcGVuZFRlbXBsYXRlKHJlbGF0ZWRQcm9wZXJ0aWVzLCBgeyR7dmFsdWVJbmRleH19ICB7JHtjdXJyZW5jeU9yVW9NSW5kZXh9fWApO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzLmV4cG9ydFNldHRpbmdzLnVuaXRQcm9wZXJ0eSA9IG5hdmlnYXRpb25QYXRoUHJlZml4ICsgY3VycmVuY3lPclVuaXRBbm5vdGF0aW9uLnBhdGg7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKGN1cnJlbmN5UHJvcGVydHkpIHtcblx0XHRcdFx0XHRyZWxhdGVkUHJvcGVydGllcy5leHBvcnRTZXR0aW5ncy5pc0N1cnJlbmN5ID0gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmICh0aW1lem9uZVByb3BlcnR5ICYmIHRpbWV6b25lQW5ub3RhdGlvbj8uJHRhcmdldCkge1xuXHRcdFx0XHRjb2xsZWN0VGltZXpvbmVQcm9wZXJ0aWVzKHByb3BlcnR5LCByZWxhdGVkUHJvcGVydGllcywgcGF0aCwgYWRkVW5pdEluVGVtcGxhdGUpO1xuXHRcdFx0fSBlbHNlIGlmIChcblx0XHRcdFx0KHByb3BlcnR5LlRhcmdldD8uJHRhcmdldD8uJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFQb2ludFR5cGUgJiYgIXByb3BlcnR5LlRhcmdldD8uJHRhcmdldD8uVmFsdWVGb3JtYXQpIHx8XG5cdFx0XHRcdHByb3BlcnR5LmFubm90YXRpb25zPy5VST8uRGF0YUZpZWxkRGVmYXVsdD8uVGFyZ2V0Py4kdGFyZ2V0Py4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YVBvaW50VHlwZVxuXHRcdFx0KSB7XG5cdFx0XHRcdGNvbGxlY3REYXRhUG9pbnRQcm9wZXJ0aWVzKHByb3BlcnR5LCByZWxhdGVkUHJvcGVydGllcywgcGF0aCk7XG5cdFx0XHR9IGVsc2UgaWYgKHByb3BlcnR5LiRUeXBlID09PSBDb21tdW5pY2F0aW9uQW5ub3RhdGlvblR5cGVzLkNvbnRhY3RUeXBlKSB7XG5cdFx0XHRcdGNvbnN0IGNvbnRhY3RQcm9wZXJ0eSA9IHByb3BlcnR5LmZuPy4kdGFyZ2V0O1xuXHRcdFx0XHRjb25zdCBjb250YWN0UHJvcGVydHlQYXRoID0gcHJvcGVydHkuZm4/LnBhdGg7XG5cdFx0XHRcdHZhbHVlSW5kZXggPSBfc2V0UmVsYXRlZFByb3BlcnRpZXNBbmRHZXRJbmRleChcblx0XHRcdFx0XHRyZWxhdGVkUHJvcGVydGllcyxcblx0XHRcdFx0XHRuYXZpZ2F0aW9uUGF0aFByZWZpeCA/IG5hdmlnYXRpb25QYXRoUHJlZml4ICsgY29udGFjdFByb3BlcnR5UGF0aCA6IGNvbnRhY3RQcm9wZXJ0eVBhdGgsXG5cdFx0XHRcdFx0Y29udGFjdFByb3BlcnR5XG5cdFx0XHRcdCk7XG5cdFx0XHRcdF9hcHBlbmRUZW1wbGF0ZShyZWxhdGVkUHJvcGVydGllcywgYHske3ZhbHVlSW5kZXh9fWApO1xuXHRcdFx0fSBlbHNlIGlmICghaWdub3JlU2VsZikge1xuXHRcdFx0XHQvLyBDb2xsZWN0IHVuZGVybHlpbmcgcHJvcGVydHlcblx0XHRcdFx0dmFsdWVJbmRleCA9IF9zZXRSZWxhdGVkUHJvcGVydGllc0FuZEdldEluZGV4KHJlbGF0ZWRQcm9wZXJ0aWVzLCBwYXRoLCBwcm9wZXJ0eSk7XG5cdFx0XHRcdF9hcHBlbmRUZW1wbGF0ZShyZWxhdGVkUHJvcGVydGllcywgYHske3ZhbHVlSW5kZXh9fWApO1xuXHRcdFx0XHRpZiAoY3VycmVuY3lPclVuaXRBbm5vdGF0aW9uKSB7XG5cdFx0XHRcdFx0cmVsYXRlZFByb3BlcnRpZXMuZXhwb3J0U2V0dGluZ3MudW5pdCA9IGAke2N1cnJlbmN5T3JVbml0QW5ub3RhdGlvbn1gOyAvLyBIYXJkLWNvZGVkIGN1cnJlbmN5L3VuaXRcblx0XHRcdFx0XHRpZiAocHJvcGVydHk/LmFubm90YXRpb25zPy5NZWFzdXJlcz8uSVNPQ3VycmVuY3kpIHtcblx0XHRcdFx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzLmV4cG9ydFNldHRpbmdzLmlzQ3VycmVuY3kgPSB0cnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIGlmICh0aW1lem9uZUFubm90YXRpb24pIHtcblx0XHRcdFx0XHRyZWxhdGVkUHJvcGVydGllcy5leHBvcnRTZXR0aW5ncy50aW1lem9uZSA9IGAke3RpbWV6b25lQW5ub3RhdGlvbn1gOyAvLyBIYXJkLWNvZGVkIHRpbWV6b25lXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZWxhdGVkUHJvcGVydGllcyA9IF9jb2xsZWN0QWRkaXRpb25hbFByb3BlcnRpZXNGb3JBbmFseXRpY2FsVGFibGUocHJvcGVydHksIG5hdmlnYXRpb25QYXRoUHJlZml4LCB0YWJsZVR5cGUsIHJlbGF0ZWRQcm9wZXJ0aWVzKTtcblx0XHRpZiAoT2JqZWN0LmtleXMocmVsYXRlZFByb3BlcnRpZXMuYWRkaXRpb25hbFByb3BlcnRpZXMpLmxlbmd0aCA+IDAgJiYgT2JqZWN0LmtleXMocmVsYXRlZFByb3BlcnRpZXMucHJvcGVydGllcykubGVuZ3RoID09PSAwKSB7XG5cdFx0XHQvLyBDb2xsZWN0IHVuZGVybHlpbmcgcHJvcGVydHkgaWYgbm90IGNvbGxlY3RlZCBhbHJlYWR5LlxuXHRcdFx0Ly8gVGhpcyBpcyB0byBlbnN1cmUgdGhhdCBhZGRpdGlvbmFsUHJvcGVydGllcyBhcmUgbWFkZSBhdmFpbGFibGUgb25seSB0byBjb21wbGV4IHByb3BlcnR5IGluZm9zLlxuXHRcdFx0dmFsdWVJbmRleCA9IF9zZXRSZWxhdGVkUHJvcGVydGllc0FuZEdldEluZGV4KHJlbGF0ZWRQcm9wZXJ0aWVzLCBwYXRoLCBwcm9wZXJ0eSk7XG5cdFx0XHRfYXBwZW5kVGVtcGxhdGUocmVsYXRlZFByb3BlcnRpZXMsIGB7JHt2YWx1ZUluZGV4fX1gKTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIHJlbGF0ZWRQcm9wZXJ0aWVzO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIHR5cGUgb2YgVmlzdWFsaXphdGlvbiBvZiB0aGUgRGF0YVBvaW50LlxuICpcbiAqIEBwYXJhbSBzb3VyY2UgU291cmNlIG9mIHRoZSBEYXRhUG9pbnQuXG4gKiBAcmV0dXJucyBUaGUgdHlwZSBvZiBWaXN1YWxpemF0aW9uIG9yIHVuZGVmaW5lZCBpZiB0aGVyZSdzIG5vbmUuXG4gKi9cbmZ1bmN0aW9uIGdldERhdGFQb2ludFZpc3VhbGl6YXRpb24oc291cmNlOiBQcm9wZXJ0eSB8IERhdGFQb2ludFR5cGUpOiBWaXN1YWxpemF0aW9uVHlwZSB7XG5cdGxldCBkYXRhUG9pbnQ6IERhdGFQb2ludFR5cGU7XG5cdGlmIChpc1Byb3BlcnR5KHNvdXJjZSkpIHtcblx0XHRkYXRhUG9pbnQgPSAoc291cmNlLmFubm90YXRpb25zPy5VST8uRGF0YUZpZWxkRGVmYXVsdCBhcyBEYXRhRmllbGRGb3JBbm5vdGF0aW9uKT8uVGFyZ2V0Py4kdGFyZ2V0IGFzIERhdGFQb2ludFR5cGU7XG5cdH0gZWxzZSB7XG5cdFx0ZGF0YVBvaW50ID0gc291cmNlO1xuXHR9XG5cdHJldHVybiBkYXRhUG9pbnQuVmlzdWFsaXphdGlvbiA/PyBWaXN1YWxpemF0aW9uVHlwZS5OdW1iZXI7XG59XG5cbi8qKlxuICpcdENvbGxlY3QgdGhlIHJlbGF0ZWQgcHJvcGVydGllcyBmcm9tIGEgRGF0YVBvaW50LlxuICpcbiAqIEBwYXJhbSBwcm9wZXJ0eSBUaGUgcHJvcGVydHkgdG8gYmUgY29uc2lkZXJlZC5cbiAqIEBwYXJhbSByZWxhdGVkUHJvcGVydGllcyBUaGUgcmVsYXRlZCBwcm9wZXJ0aWVzIGlkZW50aWZpZWQgc28gZmFyLlxuICogQHBhcmFtIHBhdGggVGhlIHByb3BlcnR5IHBhdGguXG4gKlxuICovXG5mdW5jdGlvbiBjb2xsZWN0RGF0YVBvaW50UHJvcGVydGllcyhwcm9wZXJ0eTogUHJpbWl0aXZlVHlwZSwgcmVsYXRlZFByb3BlcnRpZXM6IENvbXBsZXhQcm9wZXJ0eUluZm8sIHBhdGg6IHN0cmluZyk6IHZvaWQge1xuXHRjb25zdCBkYXRhUG9pbnRQcm9wZXJ0eSA9IHByb3BlcnR5LlRhcmdldD8uJHRhcmdldD8uVmFsdWUuJHRhcmdldCBhcyBQcm9wZXJ0eTtcblx0Y29uc3QgZGF0YXBvaW50VGFyZ2V0ID0gcHJvcGVydHkuVGFyZ2V0Py4kdGFyZ2V0O1xuXHRjb25zdCBuYXZpZ2F0aW9uUGF0aFByZWZpeCA9IF9nZXROYXZpZ2F0aW9uUGF0aFByZWZpeChwYXRoKTtcblx0Ly8gRGF0YVBvaW50IHVzZS1jYXNlIHVzaW5nIERhdGFGaWVsZERlZmF1bHQuXG5cdGNvbnN0IGRhdGFQb2ludERlZmF1bHRQcm9wZXJ0eSA9IHByb3BlcnR5LmFubm90YXRpb25zPy5VST8uRGF0YUZpZWxkRGVmYXVsdDtcblx0Y29uc3QgdmFsdWVJbmRleCA9IF9zZXRSZWxhdGVkUHJvcGVydGllc0FuZEdldEluZGV4KFxuXHRcdHJlbGF0ZWRQcm9wZXJ0aWVzLFxuXHRcdG5hdmlnYXRpb25QYXRoUHJlZml4ID8gbmF2aWdhdGlvblBhdGhQcmVmaXggKyBwYXRoIDogcGF0aCxcblx0XHRkYXRhUG9pbnREZWZhdWx0UHJvcGVydHkgPyBwcm9wZXJ0eSA6IGRhdGFQb2ludFByb3BlcnR5XG5cdCk7XG5cdC8vIElmIHdlIGhhdmUgYSBEYXRhUG9pbnQgd2l0aG91dCB2aXN1YWxpemF0aW9uLCBvciBhIE51bWJlciwgd2UgZG9uJ3QgaGF2ZSBhIFRhcmdldFZhbHVlL01heGltdW1WYWx1ZVxuXHRpZiAoZ2V0RGF0YVBvaW50VmlzdWFsaXphdGlvbihkYXRhUG9pbnREZWZhdWx0UHJvcGVydHkgPyBwcm9wZXJ0eSA6IGRhdGFwb2ludFRhcmdldCkgPT09IFZpc3VhbGl6YXRpb25UeXBlLk51bWJlcikge1xuXHRcdHJldHVybjtcblx0fVxuXHRjb25zdCB0YXJnZXRWYWx1ZSA9IGdldFRhcmdldFZhbHVlT25EYXRhUG9pbnQoZGF0YVBvaW50RGVmYXVsdFByb3BlcnR5ID8gcHJvcGVydHkgOiBkYXRhcG9pbnRUYXJnZXQpO1xuXHRpZiAoaXNQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb24odGFyZ2V0VmFsdWUpKSB7XG5cdFx0aWYgKHRhcmdldFZhbHVlLiR0YXJnZXQpIHtcblx0XHRcdC8vaW4gY2FzZSBpdCdzIGEgZHluYW1pYyB0YXJnZXRWYWx1ZVxuXHRcdFx0Y29uc3QgZGF0YVBvaW50SW5kZXggPSBfc2V0UmVsYXRlZFByb3BlcnRpZXNBbmRHZXRJbmRleChcblx0XHRcdFx0cmVsYXRlZFByb3BlcnRpZXMsXG5cdFx0XHRcdG5hdmlnYXRpb25QYXRoUHJlZml4ID8gbmF2aWdhdGlvblBhdGhQcmVmaXggKyB0YXJnZXRWYWx1ZS4kdGFyZ2V0Lm5hbWUgOiB0YXJnZXRWYWx1ZS4kdGFyZ2V0Lm5hbWUsXG5cdFx0XHRcdHRhcmdldFZhbHVlLiR0YXJnZXRcblx0XHRcdCk7XG5cdFx0XHRyZWxhdGVkUHJvcGVydGllcy5leHBvcnRTZXR0aW5ncy5kYXRhUG9pbnRUYXJnZXRWYWx1ZSA9IHRhcmdldFZhbHVlLnBhdGg7XG5cdFx0XHRfYXBwZW5kVGVtcGxhdGUocmVsYXRlZFByb3BlcnRpZXMsIGB7JHt2YWx1ZUluZGV4fX0veyR7ZGF0YVBvaW50SW5kZXh9fWApO1xuXHRcdH1cblx0fSBlbHNlIGlmIChoYXNTdGF0aWNQZXJjZW50VW5pdChkYXRhUG9pbnREZWZhdWx0UHJvcGVydHkgPyBwcm9wZXJ0eSA6IGRhdGFQb2ludFByb3BlcnR5KSAmJiBpc0FQcm9ncmVzc1R5cGVGcm9tRGF0YVBvaW50KHByb3BlcnR5KSkge1xuXHRcdHJlbGF0ZWRQcm9wZXJ0aWVzLmV4cG9ydFNldHRpbmdzLnVuaXQgPSBcIiVcIjtcblx0fSBlbHNlIHtcblx0XHRyZWxhdGVkUHJvcGVydGllcy5leHBvcnRTZXR0aW5ncy5kYXRhUG9pbnRUYXJnZXRWYWx1ZSA9IHRhcmdldFZhbHVlO1xuXHRcdF9hcHBlbmRUZW1wbGF0ZShyZWxhdGVkUHJvcGVydGllcywgYHske3ZhbHVlSW5kZXh9fS8ke3RhcmdldFZhbHVlfWApO1xuXHR9XG59XG5cbi8qKlxuICpcdENvbGxlY3QgdGhlIHJlbGF0ZWQgcHJvcGVydGllcyBmcm9tIGEgcHJvcGVydHkgd2l0aCBUaW1lem9uZS5cbiAqXG4gKiBAcGFyYW0gcHJvcGVydHkgVGhlIHByb3BlcnR5IHRvIGJlIGNvbnNpZGVyZWQuXG4gKiBAcGFyYW0gcmVsYXRlZFByb3BlcnRpZXMgVGhlIHJlbGF0ZWQgcHJvcGVydGllcyBpZGVudGlmaWVkIHNvIGZhci5cbiAqIEBwYXJhbSBwYXRoIFRoZSBwcm9wZXJ0eSBwYXRoLlxuICogQHBhcmFtIGFkZFVuaXRJblRlbXBsYXRlIFNob3VsZCB3ZSBhZGQgdGhlIHVuaXQgaW4gdGhlIHRlbXBsYXRlLlxuICpcbiAqL1xuZnVuY3Rpb24gY29sbGVjdFRpbWV6b25lUHJvcGVydGllcyhcblx0cHJvcGVydHk6IFByaW1pdGl2ZVR5cGUsXG5cdHJlbGF0ZWRQcm9wZXJ0aWVzOiBDb21wbGV4UHJvcGVydHlJbmZvLFxuXHRwYXRoOiBzdHJpbmcsXG5cdGFkZFVuaXRJblRlbXBsYXRlOiBib29sZWFuXG4pOiB2b2lkIHtcblx0Y29uc3QgdGltZXpvbmVBbm5vdGF0aW9uID0gcHJvcGVydHkuYW5ub3RhdGlvbnMuQ29tbW9uLlRpbWV6b25lO1xuXHRjb25zdCBuYXZpZ2F0aW9uUGF0aFByZWZpeCA9IF9nZXROYXZpZ2F0aW9uUGF0aFByZWZpeChwYXRoKTtcblx0Y29uc3QgdmFsdWVJbmRleCA9IF9zZXRSZWxhdGVkUHJvcGVydGllc0FuZEdldEluZGV4KHJlbGF0ZWRQcm9wZXJ0aWVzLCBwYXRoLCBwcm9wZXJ0eSk7XG5cblx0Y29uc3QgdGltZXpvbmVPclVvTUluZGV4ID0gX3NldFJlbGF0ZWRQcm9wZXJ0aWVzQW5kR2V0SW5kZXgoXG5cdFx0cmVsYXRlZFByb3BlcnRpZXMsXG5cdFx0bmF2aWdhdGlvblBhdGhQcmVmaXggKyB0aW1lem9uZUFubm90YXRpb24ucGF0aCxcblx0XHR0aW1lem9uZUFubm90YXRpb24uJHRhcmdldFxuXHQpO1xuXHRpZiAoYWRkVW5pdEluVGVtcGxhdGUpIHtcblx0XHRfYXBwZW5kVGVtcGxhdGUocmVsYXRlZFByb3BlcnRpZXMsIGB7JHt2YWx1ZUluZGV4fX0gIHske3RpbWV6b25lT3JVb01JbmRleH19YCk7XG5cdH0gZWxzZSB7XG5cdFx0cmVsYXRlZFByb3BlcnRpZXMuZXhwb3J0U2V0dGluZ3MudGltZXpvbmVQcm9wZXJ0eSA9IG5hdmlnYXRpb25QYXRoUHJlZml4ICsgdGltZXpvbmVBbm5vdGF0aW9uLnBhdGg7XG5cdH1cbn1cblxuLyoqXG4gKiBDb2xsZWN0IHByb3BlcnRpZXMgY29uc3VtZWQgYnkgYSBEYXRhRmllbGQuXG4gKiBUaGlzIGlzIGZvciBwb3B1bGF0aW5nIHRoZSBDb21wbGV4UHJvcGVydHlJbmZvcyBvZiB0aGUgdGFibGUgZGVsZWdhdGUuXG4gKlxuICogQHBhcmFtIGRhdGFGaWVsZCBUaGUgRGF0YUZpZWxkIGZvciB3aGljaCB0aGUgcHJvcGVydGllcyBuZWVkIHRvIGJlIGlkZW50aWZpZWQuXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCBUaGUgY29udmVydGVyIGNvbnRleHQuXG4gKiBAcGFyYW0gdGFibGVUeXBlIFRoZSB0YWJsZSB0eXBlLlxuICogQHBhcmFtIHJlbGF0ZWRQcm9wZXJ0aWVzIFRoZSBwcm9wZXJ0aWVzIGlkZW50aWZpZWQgc28gZmFyLlxuICogQHBhcmFtIGlzRW1iZWRkZWQgVHJ1ZSBpZiB0aGUgRGF0YUZpZWxkIGlzIGVtYmVkZGVkIGluIGFub3RoZXIgYW5ub3RhdGlvbiAoZS5nLiBGaWVsZEdyb3VwKS5cbiAqIEByZXR1cm5zIFRoZSBwcm9wZXJ0aWVzIHJlbGF0ZWQgdG8gdGhlIERhdGFGaWVsZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbGxlY3RSZWxhdGVkUHJvcGVydGllc1JlY3Vyc2l2ZWx5KFxuXHRkYXRhRmllbGQ6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMsXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdHRhYmxlVHlwZTogVGFibGVUeXBlLFxuXHRyZWxhdGVkUHJvcGVydGllczogQ29tcGxleFByb3BlcnR5SW5mbyA9IHtcblx0XHRwcm9wZXJ0aWVzOiB7fSxcblx0XHRhZGRpdGlvbmFsUHJvcGVydGllczoge30sXG5cdFx0ZXhwb3J0U2V0dGluZ3M6IHt9XG5cdH0sXG5cdGlzRW1iZWRkZWQgPSBmYWxzZVxuKTogQ29tcGxleFByb3BlcnR5SW5mbyB7XG5cdGxldCBpc1N0YXRpY2FsbHlIaWRkZW4gPSBmYWxzZTtcblx0c3dpdGNoIChkYXRhRmllbGQ/LiRUeXBlKSB7XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGQ6XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoVXJsOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aE5hdmlnYXRpb25QYXRoOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aEludGVudEJhc2VkTmF2aWdhdGlvbjpcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhBY3Rpb246XG5cdFx0XHRpZiAoZGF0YUZpZWxkLlZhbHVlKSB7XG5cdFx0XHRcdGNvbnN0IHByb3BlcnR5ID0gZGF0YUZpZWxkLlZhbHVlO1xuXHRcdFx0XHRpc1N0YXRpY2FsbHlIaWRkZW4gPSBpc1JlZmVyZW5jZVByb3BlcnR5U3RhdGljYWxseUhpZGRlbihkYXRhRmllbGQpO1xuXHRcdFx0XHRyZWxhdGVkUHJvcGVydGllcyA9IGNvbGxlY3RSZWxhdGVkUHJvcGVydGllcyhcblx0XHRcdFx0XHRwcm9wZXJ0eS5wYXRoLFxuXHRcdFx0XHRcdHByb3BlcnR5LiR0YXJnZXQsXG5cdFx0XHRcdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0XHR0YWJsZVR5cGUsXG5cdFx0XHRcdFx0cmVsYXRlZFByb3BlcnRpZXMsXG5cdFx0XHRcdFx0aXNFbWJlZGRlZCxcblx0XHRcdFx0XHRpc1N0YXRpY2FsbHlIaWRkZW5cblx0XHRcdFx0KTtcblx0XHRcdFx0Y29uc3QgbmF2aWdhdGlvblBhdGhQcmVmaXggPSBfZ2V0TmF2aWdhdGlvblBhdGhQcmVmaXgocHJvcGVydHkucGF0aCk7XG5cdFx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzID0gX2NvbGxlY3RBZGRpdGlvbmFsUHJvcGVydGllc0ZvckFuYWx5dGljYWxUYWJsZShcblx0XHRcdFx0XHRkYXRhRmllbGQsXG5cdFx0XHRcdFx0bmF2aWdhdGlvblBhdGhQcmVmaXgsXG5cdFx0XHRcdFx0dGFibGVUeXBlLFxuXHRcdFx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0XHRicmVhaztcblxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQWN0aW9uOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uOlxuXHRcdFx0YnJlYWs7XG5cblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFubm90YXRpb246XG5cdFx0XHRzd2l0Y2ggKGRhdGFGaWVsZC5UYXJnZXQ/LiR0YXJnZXQ/LiRUeXBlKSB7XG5cdFx0XHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRmllbGRHcm91cFR5cGU6XG5cdFx0XHRcdFx0ZGF0YUZpZWxkLlRhcmdldC4kdGFyZ2V0LkRhdGE/LmZvckVhY2goKGlubmVyRGF0YUZpZWxkOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzKSA9PiB7XG5cdFx0XHRcdFx0XHRyZWxhdGVkUHJvcGVydGllcyA9IGNvbGxlY3RSZWxhdGVkUHJvcGVydGllc1JlY3Vyc2l2ZWx5KFxuXHRcdFx0XHRcdFx0XHRpbm5lckRhdGFGaWVsZCxcblx0XHRcdFx0XHRcdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHRcdFx0XHRcdFx0dGFibGVUeXBlLFxuXHRcdFx0XHRcdFx0XHRyZWxhdGVkUHJvcGVydGllcyxcblx0XHRcdFx0XHRcdFx0dHJ1ZVxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFQb2ludFR5cGU6XG5cdFx0XHRcdFx0aXNTdGF0aWNhbGx5SGlkZGVuID0gaXNSZWZlcmVuY2VQcm9wZXJ0eVN0YXRpY2FsbHlIaWRkZW4oZGF0YUZpZWxkKTtcblx0XHRcdFx0XHRyZWxhdGVkUHJvcGVydGllcyA9IGNvbGxlY3RSZWxhdGVkUHJvcGVydGllcyhcblx0XHRcdFx0XHRcdGRhdGFGaWVsZC5UYXJnZXQuJHRhcmdldC5WYWx1ZS5wYXRoLFxuXHRcdFx0XHRcdFx0ZGF0YUZpZWxkLFxuXHRcdFx0XHRcdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHRcdFx0XHRcdGZhbHNlLFxuXHRcdFx0XHRcdFx0dGFibGVUeXBlLFxuXHRcdFx0XHRcdFx0cmVsYXRlZFByb3BlcnRpZXMsXG5cdFx0XHRcdFx0XHRpc0VtYmVkZGVkLFxuXHRcdFx0XHRcdFx0aXNTdGF0aWNhbGx5SGlkZGVuXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlIENvbW11bmljYXRpb25Bbm5vdGF0aW9uVHlwZXMuQ29udGFjdFR5cGU6XG5cdFx0XHRcdFx0Y29uc3QgZGF0YUZpZWxkQ29udGFjdCA9IGRhdGFGaWVsZC5UYXJnZXQuJHRhcmdldCBhcyBDb250YWN0O1xuXHRcdFx0XHRcdGlzU3RhdGljYWxseUhpZGRlbiA9IGlzUmVmZXJlbmNlUHJvcGVydHlTdGF0aWNhbGx5SGlkZGVuKGRhdGFGaWVsZCk7XG5cdFx0XHRcdFx0cmVsYXRlZFByb3BlcnRpZXMgPSBjb2xsZWN0UmVsYXRlZFByb3BlcnRpZXMoXG5cdFx0XHRcdFx0XHRkYXRhRmllbGQuVGFyZ2V0LnZhbHVlLFxuXHRcdFx0XHRcdFx0ZGF0YUZpZWxkQ29udGFjdCxcblx0XHRcdFx0XHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0XHRcdFx0XHRpc1N0YXRpY2FsbHlIaWRkZW4sXG5cdFx0XHRcdFx0XHR0YWJsZVR5cGUsXG5cdFx0XHRcdFx0XHRyZWxhdGVkUHJvcGVydGllcyxcblx0XHRcdFx0XHRcdGlzRW1iZWRkZWQsXG5cdFx0XHRcdFx0XHRpc1N0YXRpY2FsbHlIaWRkZW5cblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0YnJlYWs7XG5cblx0XHRkZWZhdWx0OlxuXHRcdFx0YnJlYWs7XG5cdH1cblxuXHRyZXR1cm4gcmVsYXRlZFByb3BlcnRpZXM7XG59XG5cbmV4cG9ydCBjb25zdCBnZXREYXRhRmllbGREYXRhVHlwZSA9IGZ1bmN0aW9uIChvRGF0YUZpZWxkOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzIHwgUHJvcGVydHkpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRpZiAoaXNQcm9wZXJ0eShvRGF0YUZpZWxkKSkge1xuXHRcdHJldHVybiBvRGF0YUZpZWxkLnR5cGU7XG5cdH1cblx0bGV0IHNEYXRhVHlwZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXHRzd2l0Y2ggKG9EYXRhRmllbGQuJFR5cGUpIHtcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFjdGlvbkdyb3VwOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aEFjdGlvbkdyb3VwOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQWN0aW9uOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uOlxuXHRcdFx0c0RhdGFUeXBlID0gdW5kZWZpbmVkO1xuXHRcdFx0YnJlYWs7XG5cblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZDpcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhOYXZpZ2F0aW9uUGF0aDpcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhVcmw6XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoSW50ZW50QmFzZWROYXZpZ2F0aW9uOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aEFjdGlvbjpcblx0XHRcdHNEYXRhVHlwZSA9IChvRGF0YUZpZWxkIGFzIERhdGFGaWVsZCk/LlZhbHVlPy4kdGFyZ2V0Py50eXBlO1xuXHRcdFx0YnJlYWs7XG5cblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFubm90YXRpb246XG5cdFx0ZGVmYXVsdDpcblx0XHRcdGlmIChvRGF0YUZpZWxkLlRhcmdldD8uJHRhcmdldD8uJFR5cGUpIHtcblx0XHRcdFx0Y29uc3QgZGF0YUZpZWxkVGFyZ2V0ID0gb0RhdGFGaWVsZC5UYXJnZXQuJHRhcmdldDtcblx0XHRcdFx0aWYgKGRhdGFGaWVsZFRhcmdldC4kVHlwZSA9PT0gQ29tbXVuaWNhdGlvbkFubm90YXRpb25UeXBlcy5Db250YWN0VHlwZSAmJiBpc1BhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbihkYXRhRmllbGRUYXJnZXQuZm4pKSB7XG5cdFx0XHRcdFx0c0RhdGFUeXBlID0gZGF0YUZpZWxkVGFyZ2V0LmZuLiR0YXJnZXQ/LnR5cGU7XG5cdFx0XHRcdH0gZWxzZSBpZiAoZGF0YUZpZWxkVGFyZ2V0LiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhUG9pbnRUeXBlKSB7XG5cdFx0XHRcdFx0c0RhdGFUeXBlID0gZGF0YUZpZWxkVGFyZ2V0LlZhbHVlPy4kUGF0aD8uJFR5cGUgfHwgZGF0YUZpZWxkVGFyZ2V0LlZhbHVlPy4kdGFyZ2V0Py50eXBlO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIGUuZy4gRmllbGRHcm91cCBvciBDaGFydFxuXHRcdFx0XHRcdC8vIEZpZWxkR3JvdXAgUHJvcGVydGllcyBoYXZlIG5vIHR5cGUsIHNvIHdlIGRlZmluZSBpdCBhcyBhIGJvb2xlYW4gdHlwZSB0byBwcmV2ZW50IGV4Y2VwdGlvbnMgZHVyaW5nIHRoZSBjYWxjdWxhdGlvbiBvZiB0aGUgd2lkdGhcblx0XHRcdFx0XHRzRGF0YVR5cGUgPVxuXHRcdFx0XHRcdFx0b0RhdGFGaWVsZC5UYXJnZXQuJHRhcmdldC4kVHlwZSA9PT0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5DaGFydERlZmluaXRpb25UeXBlXCIgPyB1bmRlZmluZWQgOiBcIkVkbS5Cb29sZWFuXCI7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHNEYXRhVHlwZSA9IHVuZGVmaW5lZDtcblx0XHRcdH1cblx0XHRcdGJyZWFrO1xuXHR9XG5cblx0cmV0dXJuIHNEYXRhVHlwZTtcbn07XG4iXSwibWFwcGluZ3MiOiI7QUFBQTtBQUFBO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQXdDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNPLFNBQVNBLDRCQUE0QixDQUFDQyxTQUFpQyxFQUFnRDtJQUM3SCxPQUFRQSxTQUFTLENB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