@sapui5/sap.fe.core 1.127.2 → 1.129.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 (393) 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 +3 -9
  4. package/src/sap/fe/core/ActionRuntime.ts +3 -7
  5. package/src/sap/fe/core/AppComponent.js +9 -19
  6. package/src/sap/fe/core/AppComponent.ts +2 -12
  7. package/src/sap/fe/core/AppStateHandler.js +3 -11
  8. package/src/sap/fe/core/AppStateHandler.ts +0 -7
  9. package/src/sap/fe/core/BaseController.js +4 -8
  10. package/src/sap/fe/core/BaseController.ts +0 -5
  11. package/src/sap/fe/core/CommonUtils.js +1 -9
  12. package/src/sap/fe/core/CommonUtils.ts +4 -8
  13. package/src/sap/fe/core/ExtensionAPI.js +10 -25
  14. package/src/sap/fe/core/ExtensionAPI.ts +4 -19
  15. package/src/sap/fe/core/InsightsFormattersExtension.js +5 -3
  16. package/src/sap/fe/core/PageController.js +7 -10
  17. package/src/sap/fe/core/PageController.ts +0 -3
  18. package/src/sap/fe/core/ResourceModel.js +3 -5
  19. package/src/sap/fe/core/ResourceModel.ts +0 -2
  20. package/src/sap/fe/core/ReuseComponent.js +8 -14
  21. package/src/sap/fe/core/ReuseComponent.ts +0 -6
  22. package/src/sap/fe/core/TemplateComponent.js +37 -9
  23. package/src/sap/fe/core/TemplateComponent.ts +3 -2
  24. package/src/sap/fe/core/TemplateModel.js +5 -5
  25. package/src/sap/fe/core/TemplateModel.ts +0 -1
  26. package/src/sap/fe/core/UIProvider.js +1 -1
  27. package/src/sap/fe/core/UIProvider.ts +44 -1
  28. package/src/sap/fe/core/buildingBlocks/BuildingBlockBase.js +7 -12
  29. package/src/sap/fe/core/buildingBlocks/BuildingBlockBase.ts +0 -5
  30. package/src/sap/fe/core/buildingBlocks/TraceInfo.js +61 -65
  31. package/src/sap/fe/core/buildingBlocks/TraceInfo.ts +60 -63
  32. package/src/sap/fe/core/buildingBlocks/templating/AttributeModel.js +3 -3
  33. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockFormatter.js +1 -1
  34. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockSupport.js +21 -5
  35. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockSupport.ts +0 -4
  36. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.js +6 -18
  37. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.ts +3 -20
  38. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplatingBase.js +5 -11
  39. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplatingBase.ts +0 -6
  40. package/src/sap/fe/core/buildingBlocks/templating/RuntimeBuildingBlock.js +3 -3
  41. package/src/sap/fe/core/buildingBlocks/templating/RuntimeBuildingBlockFragment.js +11 -10
  42. package/src/sap/fe/core/buildingBlocks/templating/RuntimeBuildingBlockFragment.ts +0 -1
  43. package/src/sap/fe/core/controllerextensions/BaseControllerExtension.js +5 -7
  44. package/src/sap/fe/core/controllerextensions/BaseControllerExtension.ts +0 -1
  45. package/src/sap/fe/core/controllerextensions/BusyLocker.js +1 -1
  46. package/src/sap/fe/core/controllerextensions/CollaborativeDraft.js +3 -10
  47. package/src/sap/fe/core/controllerextensions/CollaborativeDraft.ts +0 -7
  48. package/src/sap/fe/core/controllerextensions/ContextSharing.js +5 -8
  49. package/src/sap/fe/core/controllerextensions/ContextSharing.ts +0 -2
  50. package/src/sap/fe/core/controllerextensions/EditFlow.js +225 -155
  51. package/src/sap/fe/core/controllerextensions/EditFlow.ts +248 -164
  52. package/src/sap/fe/core/controllerextensions/Feedback.js +1 -3
  53. package/src/sap/fe/core/controllerextensions/Feedback.ts +0 -2
  54. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +4 -7
  55. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +0 -3
  56. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +8 -25
  57. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +2 -21
  58. package/src/sap/fe/core/controllerextensions/InternalRouting.js +22 -34
  59. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +25 -31
  60. package/src/sap/fe/core/controllerextensions/KPIManagement.js +8 -21
  61. package/src/sap/fe/core/controllerextensions/KPIManagement.ts +4 -15
  62. package/src/sap/fe/core/controllerextensions/MessageHandler.js +68 -31
  63. package/src/sap/fe/core/controllerextensions/MessageHandler.ts +78 -32
  64. package/src/sap/fe/core/controllerextensions/PageReady.js +4 -4
  65. package/src/sap/fe/core/controllerextensions/Paginator.js +4 -8
  66. package/src/sap/fe/core/controllerextensions/Paginator.ts +0 -4
  67. package/src/sap/fe/core/controllerextensions/Placeholder.js +4 -4
  68. package/src/sap/fe/core/controllerextensions/Recommendations.js +15 -24
  69. package/src/sap/fe/core/controllerextensions/Recommendations.ts +13 -20
  70. package/src/sap/fe/core/controllerextensions/Routing.js +4 -10
  71. package/src/sap/fe/core/controllerextensions/Routing.ts +0 -6
  72. package/src/sap/fe/core/controllerextensions/RoutingListener.js +1 -1
  73. package/src/sap/fe/core/controllerextensions/Share.js +17 -11
  74. package/src/sap/fe/core/controllerextensions/Share.ts +10 -5
  75. package/src/sap/fe/core/controllerextensions/SideEffects.js +49 -45
  76. package/src/sap/fe/core/controllerextensions/SideEffects.ts +54 -41
  77. package/src/sap/fe/core/controllerextensions/Telemetry.js +4 -4
  78. package/src/sap/fe/core/controllerextensions/ViewState.js +10 -34
  79. package/src/sap/fe/core/controllerextensions/ViewState.ts +3 -49
  80. package/src/sap/fe/core/controllerextensions/cards/CollaborationManager.js +6 -8
  81. package/src/sap/fe/core/controllerextensions/cards/CollaborationManager.ts +0 -1
  82. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js +1 -2
  83. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.ts +0 -1
  84. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +4 -3
  85. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.ts +1 -1
  86. package/src/sap/fe/core/controllerextensions/dialog/OperationsDialog.block.js +16 -12
  87. package/src/sap/fe/core/controllerextensions/dialog/OperationsDialog.block.tsx +4 -1
  88. package/src/sap/fe/core/controllerextensions/editFlow/NotApplicableContextDialog.js +1 -1
  89. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +126 -74
  90. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +158 -91
  91. package/src/sap/fe/core/controllerextensions/editFlow/draft.js +1 -22
  92. package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +0 -20
  93. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.js +10 -20
  94. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.ts +11 -17
  95. package/src/sap/fe/core/controllerextensions/editFlow/editFlowConstants.js +1 -1
  96. package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.js +191 -767
  97. package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.ts +277 -1024
  98. package/src/sap/fe/core/controllerextensions/editFlow/operations.js +1 -1
  99. package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +1 -6
  100. package/src/sap/fe/core/controllerextensions/editFlow/sticky.ts +0 -5
  101. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +381 -250
  102. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +467 -301
  103. package/src/sap/fe/core/controllerextensions/pageReady/DataQueryWatcher.js +2 -6
  104. package/src/sap/fe/core/controllerextensions/pageReady/DataQueryWatcher.ts +0 -5
  105. package/src/sap/fe/core/controllerextensions/recommendations/Telemetry.js +2 -6
  106. package/src/sap/fe/core/controllerextensions/recommendations/Telemetry.ts +4 -6
  107. package/src/sap/fe/core/controllerextensions/routing/ContextPathHelper.js +1 -6
  108. package/src/sap/fe/core/controllerextensions/routing/ContextPathHelper.ts +0 -4
  109. package/src/sap/fe/core/controllerextensions/routing/NavigationReason.js +1 -1
  110. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +4 -41
  111. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.ts +1 -37
  112. package/src/sap/fe/core/controllerextensions/viewState/IViewStateContributor.js +1 -1
  113. package/src/sap/fe/core/controllerextensions/viewState/IViewStateContributor.ts +0 -1
  114. package/src/sap/fe/core/controls/Any.js +1 -2
  115. package/src/sap/fe/core/controls/Any.ts +0 -1
  116. package/src/sap/fe/core/controls/AnyElement.js +1 -2
  117. package/src/sap/fe/core/controls/AnyElement.ts +0 -1
  118. package/src/sap/fe/core/controls/CommandExecution.js +3 -3
  119. package/src/sap/fe/core/controls/ComponentLoader.js +23 -10
  120. package/src/sap/fe/core/controls/ComponentLoader.ts +0 -1
  121. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.block.js +10 -13
  122. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.block.tsx +0 -6
  123. package/src/sap/fe/core/controls/EventDelegateHook.js +8 -9
  124. package/src/sap/fe/core/controls/FormElementWrapper.js +7 -7
  125. package/src/sap/fe/core/controls/MultiValueParameterDelegate.js +3 -1
  126. package/src/sap/fe/core/controls/Recommendations/ConfirmRecommendationDialog.block.js +140 -24
  127. package/src/sap/fe/core/controls/Recommendations/ConfirmRecommendationDialog.block.tsx +141 -10
  128. package/src/sap/fe/core/converters/ConverterContext.js +8 -30
  129. package/src/sap/fe/core/converters/ConverterContext.ts +7 -29
  130. package/src/sap/fe/core/converters/ManifestSettings.js +37 -1
  131. package/src/sap/fe/core/converters/ManifestSettings.ts +12 -3
  132. package/src/sap/fe/core/converters/ManifestWrapper.js +12 -40
  133. package/src/sap/fe/core/converters/ManifestWrapper.ts +13 -46
  134. package/src/sap/fe/core/converters/MetaModelConverter.js +44 -48
  135. package/src/sap/fe/core/converters/MetaModelConverter.ts +50 -48
  136. package/src/sap/fe/core/converters/TemplateConverter.js +3 -2
  137. package/src/sap/fe/core/converters/TemplateConverter.ts +0 -1
  138. package/src/sap/fe/core/converters/annotations/DataField.js +1 -28
  139. package/src/sap/fe/core/converters/annotations/DataField.ts +0 -26
  140. package/src/sap/fe/core/converters/common/AnnotationConverter.js +24 -19
  141. package/src/sap/fe/core/converters/controls/Common/Action.js +13 -26
  142. package/src/sap/fe/core/converters/controls/Common/Action.ts +13 -31
  143. package/src/sap/fe/core/converters/controls/Common/Chart.js +5 -6
  144. package/src/sap/fe/core/converters/controls/Common/Chart.ts +0 -5
  145. package/src/sap/fe/core/converters/controls/Common/Criticality.js +2 -4
  146. package/src/sap/fe/core/converters/controls/Common/Criticality.ts +1 -2
  147. package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +1 -5
  148. package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +0 -4
  149. package/src/sap/fe/core/converters/controls/Common/Form.js +3 -2
  150. package/src/sap/fe/core/converters/controls/Common/Form.ts +2 -1
  151. package/src/sap/fe/core/converters/controls/Common/KPI.js +11 -7
  152. package/src/sap/fe/core/converters/controls/Common/KPI.ts +11 -6
  153. package/src/sap/fe/core/converters/controls/Common/Table.js +159 -141
  154. package/src/sap/fe/core/converters/controls/Common/Table.ts +166 -122
  155. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +5 -30
  156. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +3 -29
  157. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +43 -55
  158. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +43 -47
  159. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +1 -4
  160. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +0 -3
  161. package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.js +1 -1
  162. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +3 -8
  163. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.ts +2 -7
  164. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +1 -11
  165. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +0 -9
  166. package/src/sap/fe/core/converters/helpers/Aggregation.js +1 -10
  167. package/src/sap/fe/core/converters/helpers/Aggregation.ts +0 -9
  168. package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +1 -7
  169. package/src/sap/fe/core/converters/helpers/ConfigurableObject.ts +0 -6
  170. package/src/sap/fe/core/converters/helpers/DataFieldHelper.js +1 -9
  171. package/src/sap/fe/core/converters/helpers/DataFieldHelper.ts +0 -8
  172. package/src/sap/fe/core/converters/helpers/ID.js +1 -2
  173. package/src/sap/fe/core/converters/helpers/ID.ts +0 -1
  174. package/src/sap/fe/core/converters/helpers/InsightsHelpers.js +1 -2
  175. package/src/sap/fe/core/converters/helpers/InsightsHelpers.ts +0 -1
  176. package/src/sap/fe/core/converters/helpers/IssueManager.js +1 -1
  177. package/src/sap/fe/core/converters/helpers/Key.js +1 -5
  178. package/src/sap/fe/core/converters/helpers/Key.ts +0 -4
  179. package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.js +1 -2
  180. package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.ts +0 -1
  181. package/src/sap/fe/core/converters/objectPage/FormMenuActions.js +1 -1
  182. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +1 -7
  183. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +0 -6
  184. package/src/sap/fe/core/converters/templates/ListReportConverter.js +6 -27
  185. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +9 -26
  186. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +1 -16
  187. package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +0 -15
  188. package/src/sap/fe/core/definition/FEDefinition.js +2550 -0
  189. package/src/sap/fe/core/designtime/AppComponent.designtime.js +11 -12
  190. package/src/sap/fe/core/designtime/AppComponent.designtime.ts +9 -10
  191. package/src/sap/fe/core/formatters/CollaborationFormatter.js +8 -2
  192. package/src/sap/fe/core/formatters/CollaborationFormatter.ts +0 -2
  193. package/src/sap/fe/core/formatters/CriticalityFormatter.js +1 -1
  194. package/src/sap/fe/core/formatters/FPMFormatter.js +1 -2
  195. package/src/sap/fe/core/formatters/FPMFormatter.ts +0 -1
  196. package/src/sap/fe/core/formatters/FiscalFormat.js +9 -14
  197. package/src/sap/fe/core/formatters/FiscalFormat.ts +0 -11
  198. package/src/sap/fe/core/formatters/KPIFormatter.js +1 -4
  199. package/src/sap/fe/core/formatters/KPIFormatter.ts +0 -3
  200. package/src/sap/fe/core/formatters/StandardFormatter.js +6 -3
  201. package/src/sap/fe/core/formatters/StandardFormatter.ts +6 -2
  202. package/src/sap/fe/core/formatters/ValueFormatter.js +1 -4
  203. package/src/sap/fe/core/formatters/ValueFormatter.ts +0 -3
  204. package/src/sap/fe/core/fpm/Component.js +14 -17
  205. package/src/sap/fe/core/fpm/Component.ts +7 -10
  206. package/src/sap/fe/core/fpm/manifest.json +1 -1
  207. package/src/sap/fe/core/helpers/AdaptiveCardExpressionCompiler.js +3 -10
  208. package/src/sap/fe/core/helpers/AdaptiveCardExpressionCompiler.ts +0 -9
  209. package/src/sap/fe/core/helpers/AppStartupHelper.js +1 -13
  210. package/src/sap/fe/core/helpers/AppStartupHelper.ts +0 -11
  211. package/src/sap/fe/core/helpers/BindingHelper.js +1 -4
  212. package/src/sap/fe/core/helpers/BindingHelper.ts +0 -3
  213. package/src/sap/fe/core/helpers/BindingToolkitEvaluator.js +1 -2
  214. package/src/sap/fe/core/helpers/BindingToolkitEvaluator.ts +0 -1
  215. package/src/sap/fe/core/helpers/DeleteHelper.js +61 -32
  216. package/src/sap/fe/core/helpers/DeleteHelper.ts +79 -33
  217. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +1 -2
  218. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.ts +0 -1
  219. package/src/sap/fe/core/helpers/EditState.js +1 -1
  220. package/src/sap/fe/core/helpers/ExcelFormatHelper.js +1 -2
  221. package/src/sap/fe/core/helpers/ExcelFormatHelper.ts +0 -1
  222. package/src/sap/fe/core/helpers/FPMHelper.js +1 -2
  223. package/src/sap/fe/core/helpers/FPMHelper.ts +0 -1
  224. package/src/sap/fe/core/helpers/KeepAliveHelper.js +1 -8
  225. package/src/sap/fe/core/helpers/KeepAliveHelper.ts +0 -7
  226. package/src/sap/fe/core/helpers/KeepAliveRefreshTypes.js +7 -1
  227. package/src/sap/fe/core/helpers/LoaderUtils.js +1 -1
  228. package/src/sap/fe/core/helpers/ManifestHelper.js +1 -3
  229. package/src/sap/fe/core/helpers/ManifestHelper.ts +0 -2
  230. package/src/sap/fe/core/helpers/MessageStrip.js +1 -1
  231. package/src/sap/fe/core/helpers/MetaModelFunction.js +3 -8
  232. package/src/sap/fe/core/helpers/MetaModelFunction.ts +0 -5
  233. package/src/sap/fe/core/helpers/MetaPath.js +1 -7
  234. package/src/sap/fe/core/helpers/MetaPath.ts +0 -6
  235. package/src/sap/fe/core/helpers/ModelHelper.js +55 -35
  236. package/src/sap/fe/core/helpers/ModelHelper.ts +64 -38
  237. package/src/sap/fe/core/helpers/PasteHelper.js +77 -24
  238. package/src/sap/fe/core/helpers/PasteHelper.ts +105 -23
  239. package/src/sap/fe/core/helpers/PromiseKeeper.js +1 -3
  240. package/src/sap/fe/core/helpers/PromiseKeeper.ts +0 -2
  241. package/src/sap/fe/core/helpers/RecommendationHelper.js +1 -4
  242. package/src/sap/fe/core/helpers/RecommendationHelper.ts +0 -3
  243. package/src/sap/fe/core/helpers/ResourceModelHelper.js +1 -3
  244. package/src/sap/fe/core/helpers/ResourceModelHelper.ts +3 -4
  245. package/src/sap/fe/core/helpers/SemanticKeyHelper.js +1 -2
  246. package/src/sap/fe/core/helpers/SemanticKeyHelper.ts +0 -1
  247. package/src/sap/fe/core/helpers/SizeHelper.js +1 -2
  248. package/src/sap/fe/core/helpers/SizeHelper.ts +0 -1
  249. package/src/sap/fe/core/helpers/StableIdHelper.js +7 -17
  250. package/src/sap/fe/core/helpers/StableIdHelper.ts +7 -17
  251. package/src/sap/fe/core/helpers/StandardRecommendationHelper.js +1 -12
  252. package/src/sap/fe/core/helpers/StandardRecommendationHelper.ts +0 -11
  253. package/src/sap/fe/core/helpers/Synchronization.js +1 -1
  254. package/src/sap/fe/core/helpers/TitleHelper.js +1 -10
  255. package/src/sap/fe/core/helpers/TitleHelper.ts +0 -9
  256. package/src/sap/fe/core/helpers/ToES6Promise.js +1 -2
  257. package/src/sap/fe/core/helpers/ToES6Promise.ts +0 -1
  258. package/src/sap/fe/core/helpers/TypeGuards.js +1 -15
  259. package/src/sap/fe/core/helpers/TypeGuards.ts +0 -14
  260. package/src/sap/fe/core/helpers/WebSocket.js +1 -1
  261. package/src/sap/fe/core/library.js +10 -44
  262. package/src/sap/fe/core/library.support.js +1 -1
  263. package/src/sap/fe/core/library.ts +8 -45
  264. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +1 -6
  265. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +0 -5
  266. package/src/sap/fe/core/messagebundle.properties +12 -1
  267. package/src/sap/fe/core/messagebundle_ar.properties +8 -0
  268. package/src/sap/fe/core/messagebundle_bg.properties +8 -0
  269. package/src/sap/fe/core/messagebundle_ca.properties +8 -0
  270. package/src/sap/fe/core/messagebundle_cnr.properties +8 -0
  271. package/src/sap/fe/core/messagebundle_cs.properties +9 -1
  272. package/src/sap/fe/core/messagebundle_cy.properties +8 -0
  273. package/src/sap/fe/core/messagebundle_da.properties +8 -0
  274. package/src/sap/fe/core/messagebundle_de.properties +8 -0
  275. package/src/sap/fe/core/messagebundle_el.properties +8 -0
  276. package/src/sap/fe/core/messagebundle_en.properties +8 -0
  277. package/src/sap/fe/core/messagebundle_en_GB.properties +8 -0
  278. package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +144 -65
  279. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +8 -0
  280. package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +273 -194
  281. package/src/sap/fe/core/messagebundle_es.properties +9 -1
  282. package/src/sap/fe/core/messagebundle_es_MX.properties +8 -0
  283. package/src/sap/fe/core/messagebundle_et.properties +8 -0
  284. package/src/sap/fe/core/messagebundle_fi.properties +8 -0
  285. package/src/sap/fe/core/messagebundle_fr.properties +8 -0
  286. package/src/sap/fe/core/messagebundle_fr_CA.properties +8 -0
  287. package/src/sap/fe/core/messagebundle_hi.properties +9 -1
  288. package/src/sap/fe/core/messagebundle_hr.properties +8 -0
  289. package/src/sap/fe/core/messagebundle_hu.properties +8 -0
  290. package/src/sap/fe/core/messagebundle_id.properties +12 -4
  291. package/src/sap/fe/core/messagebundle_it.properties +8 -0
  292. package/src/sap/fe/core/messagebundle_iw.properties +8 -0
  293. package/src/sap/fe/core/messagebundle_ja.properties +8 -0
  294. package/src/sap/fe/core/messagebundle_kk.properties +8 -0
  295. package/src/sap/fe/core/messagebundle_ko.properties +8 -0
  296. package/src/sap/fe/core/messagebundle_lt.properties +8 -0
  297. package/src/sap/fe/core/messagebundle_lv.properties +8 -0
  298. package/src/sap/fe/core/messagebundle_mk.properties +8 -0
  299. package/src/sap/fe/core/messagebundle_ms.properties +8 -0
  300. package/src/sap/fe/core/messagebundle_nl.properties +16 -8
  301. package/src/sap/fe/core/messagebundle_no.properties +8 -0
  302. package/src/sap/fe/core/messagebundle_pl.properties +8 -0
  303. package/src/sap/fe/core/messagebundle_pt.properties +8 -0
  304. package/src/sap/fe/core/messagebundle_pt_PT.properties +8 -0
  305. package/src/sap/fe/core/messagebundle_ro.properties +8 -0
  306. package/src/sap/fe/core/messagebundle_ru.properties +8 -0
  307. package/src/sap/fe/core/messagebundle_sh.properties +8 -0
  308. package/src/sap/fe/core/messagebundle_sk.properties +8 -0
  309. package/src/sap/fe/core/messagebundle_sl.properties +8 -0
  310. package/src/sap/fe/core/messagebundle_sr.properties +8 -0
  311. package/src/sap/fe/core/messagebundle_sv.properties +8 -0
  312. package/src/sap/fe/core/messagebundle_th.properties +12 -4
  313. package/src/sap/fe/core/messagebundle_tr.properties +8 -0
  314. package/src/sap/fe/core/messagebundle_uk.properties +10 -2
  315. package/src/sap/fe/core/messagebundle_vi.properties +8 -0
  316. package/src/sap/fe/core/messagebundle_zh_CN.properties +8 -0
  317. package/src/sap/fe/core/messagebundle_zh_TW.properties +8 -0
  318. package/src/sap/fe/core/operationsHelper.js +22 -7
  319. package/src/sap/fe/core/operationsHelper.ts +24 -5
  320. package/src/sap/fe/core/rootView/Fcl.controller.js +7 -27
  321. package/src/sap/fe/core/rootView/Fcl.controller.ts +0 -18
  322. package/src/sap/fe/core/rootView/NavContainer.controller.js +7 -12
  323. package/src/sap/fe/core/rootView/NavContainer.controller.ts +0 -5
  324. package/src/sap/fe/core/rootView/RootViewBaseController.js +10 -24
  325. package/src/sap/fe/core/rootView/RootViewBaseController.ts +3 -16
  326. package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +3 -3
  327. package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +3 -3
  328. package/src/sap/fe/core/services/CollaborationManagerServiceFactory.js +4 -4
  329. package/src/sap/fe/core/services/CollaborativeToolsServiceFactory.js +3 -3
  330. package/src/sap/fe/core/services/ContextSharingServiceFactory.js +3 -4
  331. package/src/sap/fe/core/services/ContextSharingServiceFactory.ts +0 -1
  332. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +13 -20
  333. package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +11 -17
  334. package/src/sap/fe/core/services/NavigationServiceFactory.js +11 -21
  335. package/src/sap/fe/core/services/NavigationServiceFactory.ts +4 -17
  336. package/src/sap/fe/core/services/ResourceModelServiceFactory.js +3 -3
  337. package/src/sap/fe/core/services/RoutingServiceFactory.js +7 -19
  338. package/src/sap/fe/core/services/RoutingServiceFactory.ts +0 -12
  339. package/src/sap/fe/core/services/ShellServicesFactory.js +8 -44
  340. package/src/sap/fe/core/services/ShellServicesFactory.ts +1 -41
  341. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +19 -60
  342. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +14 -57
  343. package/src/sap/fe/core/services/TelemetryServiceFactory.js +6 -14
  344. package/src/sap/fe/core/services/TelemetryServiceFactory.ts +2 -10
  345. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +17 -7
  346. package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +17 -3
  347. package/src/sap/fe/core/services/ValueHelpHistoryServiceFactory.js +11 -24
  348. package/src/sap/fe/core/services/ValueHelpHistoryServiceFactory.ts +0 -19
  349. package/src/sap/fe/core/services/collaborativeDraftServiceFactory.js +3 -31
  350. package/src/sap/fe/core/services/collaborativeDraftServiceFactory.ts +0 -27
  351. package/src/sap/fe/core/services/valueHelpService/HistoryOptOutProvider.js +1 -4
  352. package/src/sap/fe/core/services/valueHelpService/HistoryOptOutProvider.ts +0 -3
  353. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +7 -7
  354. package/src/sap/fe/core/support/AnnotationIssue.support.js +1 -1
  355. package/src/sap/fe/core/support/CollectionFacetMissingID.support.js +1 -1
  356. package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.js +1 -1
  357. package/src/sap/fe/core/support/CommonHelper.js +4 -1
  358. package/src/sap/fe/core/support/Diagnostics.js +1 -1
  359. package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.js +1 -1
  360. package/src/sap/fe/core/templating/ActionHelper.js +1 -2
  361. package/src/sap/fe/core/templating/ActionHelper.ts +0 -1
  362. package/src/sap/fe/core/templating/CommonFormatters.js +1 -2
  363. package/src/sap/fe/core/templating/CommonFormatters.ts +0 -1
  364. package/src/sap/fe/core/templating/CriticalityFormatters.js +1 -6
  365. package/src/sap/fe/core/templating/CriticalityFormatters.ts +0 -5
  366. package/src/sap/fe/core/templating/DataFieldFormatters.js +1 -2
  367. package/src/sap/fe/core/templating/DataFieldFormatters.ts +0 -1
  368. package/src/sap/fe/core/templating/DataModelPathHelper.js +1 -18
  369. package/src/sap/fe/core/templating/DataModelPathHelper.ts +0 -17
  370. package/src/sap/fe/core/templating/DisplayModeFormatter.js +6 -1
  371. package/src/sap/fe/core/templating/EntitySetHelper.js +1 -4
  372. package/src/sap/fe/core/templating/EntitySetHelper.ts +0 -3
  373. package/src/sap/fe/core/templating/EntityTypeHelper.js +4 -5
  374. package/src/sap/fe/core/templating/EntityTypeHelper.ts +3 -4
  375. package/src/sap/fe/core/templating/FieldControlHelper.js +4 -9
  376. package/src/sap/fe/core/templating/FieldControlHelper.ts +3 -9
  377. package/src/sap/fe/core/templating/FilterTemplating.js +1 -1
  378. package/src/sap/fe/core/templating/PropertyFormatters.js +1 -1
  379. package/src/sap/fe/core/templating/PropertyHelper.js +1 -31
  380. package/src/sap/fe/core/templating/PropertyHelper.ts +0 -30
  381. package/src/sap/fe/core/templating/SemanticObjectHelper.js +1 -7
  382. package/src/sap/fe/core/templating/SemanticObjectHelper.ts +0 -6
  383. package/src/sap/fe/core/templating/UIFormatters.js +18 -14
  384. package/src/sap/fe/core/templating/UIFormatters.ts +30 -18
  385. package/src/sap/fe/core/type/Date.js +3 -6
  386. package/src/sap/fe/core/type/Date.ts +0 -3
  387. package/src/sap/fe/core/type/DateTimeWithTimezone.js +3 -3
  388. package/src/sap/fe/core/type/EDM.js +1 -1
  389. package/src/sap/fe/core/type/Email.js +3 -3
  390. package/src/sap/fe/core/type/FiscalDate.js +3 -9
  391. package/src/sap/fe/core/type/FiscalDate.ts +0 -6
  392. package/src/sap/fe/core/type/InputMask.js +3 -7
  393. package/src/sap/fe/core/type/InputMask.ts +0 -4
@@ -2,7 +2,7 @@
2
2
  * SAP UI development toolkit for HTML5 (SAPUI5)
3
3
  * (c) Copyright 2009-2024 SAP SE. All rights reserved
4
4
  */
5
- sap.ui.define(["sap/base/Log", "sap/fe/core/controllerextensions/editFlow/draft", "sap/m/CheckBox", "sap/m/MessageToast", "sap/m/Text"], function (Log, draft, CheckBox, MessageToast, Text) {
5
+ sap.ui.define(["sap/base/Log", "sap/fe/core/controllerextensions/editFlow/draft", "sap/m/CheckBox", "sap/m/MessageToast", "sap/m/Text", "sap/ui/core/message/Message", "sap/ui/core/message/MessageType", "sap/ui/core/Messaging"], function (Log, draft, CheckBox, MessageToast, Text, Message, MessageType, Messaging) {
6
6
  "use strict";
7
7
 
8
8
  var DeleteOptionTypes;
@@ -338,7 +338,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/controllerextensions/editFlow/draft"
338
338
  * Get the original record selected on the UI.
339
339
  *
340
340
  * In the case the context to delete is an active record but the selected context is a draft record.
341
- *
342
341
  * @param mParameters Delete parameters and information of selected contexts.
343
342
  * @param contextToDelete ODataV4Context to check.
344
343
  * @returns ODataV4Context for delete.
@@ -353,7 +352,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/controllerextensions/editFlow/draft"
353
352
 
354
353
  /**
355
354
  * Get the possible options for deletion of the selected contexts.
356
- *
357
355
  * @param mParameters Delete parameters and information of selected contexts.
358
356
  * @param directDeletableContexts Contexts that can be deletable directly.
359
357
  * @param resourceModel Resource model.
@@ -444,6 +442,38 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/controllerextensions/editFlow/draft"
444
442
  }
445
443
  return options;
446
444
  }
445
+ async function deleteDraftsBeforeActivesAndGetErrors(draftsToDeleteBeforeActive, messageHandler, appComponent, enableStrictHandling) {
446
+ const draftErrors = [];
447
+ await Promise.allSettled(draftsToDeleteBeforeActive.map(async function (context) {
448
+ try {
449
+ return await draft.deleteDraft(context, messageHandler, appComponent, enableStrictHandling);
450
+ } catch (e) {
451
+ Log.error(`FE : core : DeleteHelper : Error while discarding draft with path : ${context.getPath()}`);
452
+ draftErrors.push(e);
453
+ }
454
+ }));
455
+ return draftErrors;
456
+ }
457
+ function handleTreeTableContexts(contexts, inTreeTable) {
458
+ let contextsToDelete = contexts;
459
+ if (inTreeTable) {
460
+ const tempContexts = [...contexts];
461
+ // Filter out contexts whose ancestor is also deleted, as they will be deleted with their ancestor
462
+ tempContexts.forEach((parentContext, parentIndex) => {
463
+ if (parentContext === undefined) {
464
+ return;
465
+ }
466
+ for (let childIndex = parentIndex + 1; childIndex < tempContexts.length; childIndex++) {
467
+ const childContext = tempContexts[childIndex];
468
+ if (childContext && parentContext.isAncestorOf(childContext)) {
469
+ tempContexts[childIndex] = undefined;
470
+ }
471
+ }
472
+ });
473
+ contextsToDelete = tempContexts.filter(context => context !== undefined);
474
+ }
475
+ return contextsToDelete;
476
+ }
447
477
  async function deleteConfirmHandler(options, mParameters, messageHandler, resourceModel, appComponent, draftEnabled, inTreeTable) {
448
478
  try {
449
479
  const contexts = deleteHelper.getConfirmedDeletableContext([], options);
@@ -461,32 +491,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/controllerextensions/editFlow/draft"
461
491
  if (contexts && contexts.length) {
462
492
  try {
463
493
  const enableStrictHandling = contexts.length === 1 ? true : false;
464
- const draftErrors = [];
465
- await Promise.allSettled(draftsToDeleteBeforeActive.map(async function (context) {
466
- try {
467
- return await draft.deleteDraft(context, messageHandler, appComponent, enableStrictHandling);
468
- } catch (e) {
469
- Log.error(`FE : core : DeleteHelper : Error while discarding draft with path : ${context.getPath()}`);
470
- draftErrors.push(e);
471
- }
472
- }));
473
- let contextsToDelete = contexts;
474
- if (inTreeTable) {
475
- const tempContexts = [...contexts];
476
- // Filter out contexts whose ancestor is also deleted, as they will be deleted with their ancestor
477
- tempContexts.forEach((parentContext, parentIndex) => {
478
- if (parentContext === undefined) {
479
- return;
480
- }
481
- for (let childIndex = parentIndex + 1; childIndex < tempContexts.length; childIndex++) {
482
- const childContext = tempContexts[childIndex];
483
- if (childContext && parentContext.isAncestorOf(childContext)) {
484
- tempContexts[childIndex] = undefined;
485
- }
486
- }
487
- });
488
- contextsToDelete = tempContexts.filter(context => context !== undefined);
489
- }
494
+ const draftErrors = await deleteDraftsBeforeActivesAndGetErrors(draftsToDeleteBeforeActive, messageHandler, appComponent, enableStrictHandling);
495
+ const contextsToDelete = handleTreeTableContexts(contexts, inTreeTable);
490
496
  await Promise.all(contextsToDelete.map(async function (context) {
491
497
  var _mParameters$draftsWi;
492
498
  // If the context to delete is a draft (i.e. acutally we just wnat to discard), we should use draft.deleteDraft in order to use a discard action if defined
@@ -509,6 +515,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/controllerextensions/editFlow/draft"
509
515
  throw Error(`FE : core : DeleteHelper : Errors on draft delete : ${draftErrors}`);
510
516
  }
511
517
  } catch (error) {
518
+ if (contexts.length > 1) {
519
+ deleteHelper.addGenericDeleteFailureMessage(resourceModel);
520
+ }
512
521
  await messageHandler.showMessageDialog({
513
522
  control: parentControl
514
523
  });
@@ -523,9 +532,28 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/controllerextensions/editFlow/draft"
523
532
  }
524
533
  }
525
534
 
535
+ /**
536
+ * Adding a generic delete failure message to message model for readability.
537
+ * @param resourceModel Resource model for message text
538
+ */
539
+ function addGenericDeleteFailureMessage(resourceModel) {
540
+ Messaging.addMessages(new Message({
541
+ message: resourceModel.getText("C_COMMON_DELETE_CHANGESET_FAILURE_MULTIPLE_ERRORS_TEXT"),
542
+ type: MessageType.Error,
543
+ target: undefined,
544
+ persistent: true,
545
+ code: "FE_CUSTOM_MESSAGE_CHANGESET_ALL_FAILED",
546
+ description: resourceModel.getText("C_COMMON_DELETE_CHANGESET_FAILURE_MULTIPLE_ERRORS_DETAILS_TEXT"),
547
+ technicalDetails: {
548
+ fe: {
549
+ changeSetPreTextForSingleError: resourceModel.getText("C_COMMON_DELETE_CHANGESET_FAILURE_SINGLE_ERROR_TEXT")
550
+ }
551
+ }
552
+ }));
553
+ }
554
+
526
555
  /**
527
556
  * Collect context information (isDraftRoot, isDraftNode, HasDraftEntity, IsActiveEntity, HasActiveEntity, isLocked, isInactive).
528
- *
529
557
  * @param context Context to evaluate.
530
558
  * @returns The context info promise.
531
559
  */
@@ -651,8 +679,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/controllerextensions/editFlow/draft"
651
679
  DeleteOptionTypes,
652
680
  DeleteDialogContentControl,
653
681
  setFocusAfterDelete,
654
- getContextInfos
682
+ getContextInfos,
683
+ addGenericDeleteFailureMessage
655
684
  };
656
685
  return deleteHelper;
657
686
  }, false);
658
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJEZWxldGVPcHRpb25UeXBlcyIsIkRlbGV0ZURpYWxvZ0NvbnRlbnRDb250cm9sIiwiZ2V0VXBkYXRlZFNlbGVjdGlvbnMiLCJpbnRlcm5hbE1vZGVsQ29udGV4dCIsInR5cGUiLCJzZWxlY3RlZENvbnRleHRzIiwiY29udGV4dHNUb1JlbW92ZSIsInJldFNlbGVjdGVkQ29udGV4dHMiLCJmb3JFYWNoIiwiY29udGV4dCIsImlkeCIsImluZGV4T2YiLCJzcGxpY2UiLCJzZXRQcm9wZXJ0eSIsImNsZWFyU2VsZWN0ZWRDb250ZXh0c0Zvck9wdGlvbiIsIm9wdGlvbiIsImdldFByb3BlcnR5IiwiZGVsZXRhYmxlQ29udGV4dHMiLCJkcmFmdFNpYmxpbmdQYWlycyIsImRyYWZ0c1dpdGhEZWxldGFibGVBY3RpdmUiLCJkcmFmdHMiLCJtYXAiLCJjb250ZXh0UGFpciIsImRyYWZ0IiwibGVuZ3RoIiwiYWZ0ZXJEZWxldGVQcm9jZXNzIiwicGFyYW1ldGVycyIsIm9wdGlvbnMiLCJjb250ZXh0cyIsInJlc291cmNlTW9kZWwiLCJsYXN0RGVsZXRlZFJvd0luZGV4IiwiZW50aXR5U2V0TmFtZSIsInVuZGVmaW5lZCIsInNlbGVjdGVkIiwic29tZSIsIk1lc3NhZ2VUb2FzdCIsInNob3ciLCJnZXRUZXh0IiwicGFyZW50Q29udHJvbCIsImdldE1ldGFkYXRhIiwiZ2V0TmFtZSIsImRlbGV0ZUhlbHBlciIsInNldEZvY3VzQWZ0ZXJEZWxldGUiLCJ0YWJsZSIsImRlbGV0ZWRSb3dzQ291bnQiLCJ0YWJsZVJvd3NDb3VudCIsImdldFJvd0JpbmRpbmciLCJnZXRDb3VudCIsIm9yaWdpbmFsVGFibGVSb3dzQ291bnQiLCJuZXh0Rm9jdXNSb3dJbmRleCIsImZvY3VzUm93IiwiZm9jdXMiLCJnZXRMb2NrZWRDb250ZXh0VXNlciIsImxvY2tlZENvbnRleHQiLCJkcmFmdEFkbWluRGF0YSIsImdldE9iamVjdCIsImdldExvY2tlZE9iamVjdHNUZXh0IiwibnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzIiwibG9ja2VkQ29udGV4dHMiLCJyZXRUeHQiLCJsb2NrZWRVc2VyIiwiZ2V0Tm9uRGVsZXRhYmxlQWN0aXZlc09mRHJhZnRzVGV4dCIsIm51bWJlck9mRHJhZnRzIiwidG90YWxEZWxldGFibGUiLCJnZXRVblNhdmVkQ29udGV4dFVzZXIiLCJ1blNhdmVkQ29udGV4dCIsInNMYXN0Q2hhbmdlZEJ5VXNlciIsImdldFVuc2F2ZWRDb250ZXh0c1RleHQiLCJ1blNhdmVkQ29udGV4dHMiLCJpbmZvVHh0Iiwib3B0aW9uVHh0Iiwib3B0aW9uV2l0aG91dFR4dCIsImxhc3RDaGFuZ2VkQnlVc2VyIiwiZ2V0Tm9uRGVsZXRhYmxlVGV4dCIsIm1QYXJhbWV0ZXJzIiwidG90YWxOdW1EZWxldGFibGVDb250ZXh0cyIsImRyYWZ0c1dpdGhOb25EZWxldGFibGVBY3RpdmUiLCJub25EZWxldGFibGVDb250ZXh0cyIsIlRleHQiLCJ0ZXh0IiwiZ2V0Q29uZmlybWVkRGVsZXRhYmxlQ29udGV4dCIsInJlZHVjZSIsInJlc3VsdCIsImRyYWZ0c1RvRGVsZXRlQmVmb3JlQWN0aXZlIiwiY29uY2F0IiwiZ2V0RHJhZnRzVG9EZWxldGVCZWZvcmVBY3RpdmUiLCJ1cGRhdGVEcmFmdE9wdGlvbnNGb3JEZWxldGFibGVUZXh0cyIsInZDb250ZXh0cyIsIml0ZW1zIiwibG9ja2VkQ29udGV4dHNUeHQiLCJkZWxldGFibGVEcmFmdEluZm8iLCJwdXNoIiwic2libGluZ0luZm8iLCJ0YXJnZXRDb250ZXh0Iiwibm9uRGVsZXRhYmxlRXhpc3RzIiwibm9uRGVsZXRhYmxlVGV4dEN0cmwiLCJ1bnNhdmVkQ2hhbmdlc1R4dHMiLCJjb250cm9sIiwiQ0hFQ0tCT1giLCJub25EZWxldGFibGVBY3RpdmVzT2ZEcmFmdHNUZXh0IiwiVEVYVCIsInVwZGF0ZUNvbnRlbnRGb3JEZWxldGVEaWFsb2ciLCJzZXRUZXh0IiwiQ2hlY2tCb3giLCJzZWxlY3QiLCJvRXZlbnQiLCJjaGVja0JveCIsImdldFNvdXJjZSIsImdldFNlbGVjdGVkIiwiX2dldE9yaWdpbmFsU2VsZWN0ZWRSZWNvcmQiLCJjb250ZXh0VG9EZWxldGUiLCJyZXQiLCJmaW5kIiwiZHJhZnRTaWJsaW5nUGFpciIsImdldE9wdGlvbnNGb3JEZWxldGFibGVUZXh0cyIsImRpcmVjdERlbGV0YWJsZUNvbnRleHRzIiwiZGVzY3JpcHRpb24iLCJvVGFibGUiLCJzS2V5IiwiZ2V0UGFyZW50IiwiZ2V0SWRlbnRpZmllckNvbHVtbiIsInR4dCIsImRlc2NyaXB0aW9uUGF0aCIsInBhdGgiLCJzaW5nbGVDb250ZXh0Iiwib0xpbmVDb250ZXh0RGF0YSIsIk9iamVjdCIsImtleXMiLCJzS2V5VmFsdWUiLCJzRGVzY3JpcHRpb24iLCJkZWxldGFibGVPcHRpb25UeHQiLCJ1bnNoaWZ0IiwiYWxsRGVsZXRhYmxlVHh0IiwiZGVsZXRlQ29uZmlybUhhbmRsZXIiLCJtZXNzYWdlSGFuZGxlciIsImFwcENvbXBvbmVudCIsImRyYWZ0RW5hYmxlZCIsImluVHJlZVRhYmxlIiwiZ2V0SW5kZXgiLCJiZWZvcmVEZWxldGVDYWxsQmFjayIsImVuYWJsZVN0cmljdEhhbmRsaW5nIiwiZHJhZnRFcnJvcnMiLCJQcm9taXNlIiwiYWxsU2V0dGxlZCIsImRlbGV0ZURyYWZ0IiwiZSIsIkxvZyIsImVycm9yIiwiZ2V0UGF0aCIsImNvbnRleHRzVG9EZWxldGUiLCJ0ZW1wQ29udGV4dHMiLCJwYXJlbnRDb250ZXh0IiwicGFyZW50SW5kZXgiLCJjaGlsZEluZGV4IiwiY2hpbGRDb250ZXh0IiwiaXNBbmNlc3Rvck9mIiwiZmlsdGVyIiwiYWxsIiwiZHJhZnRXaXRoRGVsZXRhYmxlQWN0aXZlIiwicmVzZXRDaGFuZ2VzIiwiZ2V0TW9kZWwiLCJkZWxldGUiLCJnZXRDYW5vbmljYWxQYXRoIiwiRXJyb3IiLCJzaG93TWVzc2FnZURpYWxvZyIsIm9FcnJvciIsInNob3dNZXNzYWdlcyIsImdldENvbnRleHRJbmZvcyIsImlzVHJhbnNpZW50IiwiaXNJbmFjdGl2ZSIsIm1ldGFDb250ZXh0IiwiZ2V0TWV0YU1vZGVsIiwiZ2V0TWV0YUNvbnRleHQiLCJkZWxldGFibGVQYXRoIiwic3RhdGljRGVsZXRhYmxlIiwiZGVsZXRhYmxlIiwiaW5mbyIsImlzRHJhZnRSb290IiwiaXNEcmFmdE5vZGUiLCJpc0FjdGl2ZSIsImhhc0FjdGl2ZSIsImhhc0RyYWZ0IiwibG9ja2VkIiwic2libGluZ1Byb21pc2UiLCJyZXNvbHZlIiwic2libGluZ0RlbGV0YWJsZSIsImlzSW5hY3RpdmVDb250ZXh0IiwiSW5Qcm9jZXNzQnlVc2VyIiwiY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbiIsInRoZW4iLCJzaWJsaW5nSW5mb3JtYXRpb24iLCJyZXF1ZXN0UHJvcGVydHkiLCJ1cGRhdGVEZWxldGVJbmZvRm9yU2VsZWN0ZWRDb250ZXh0cyIsImZvckNvbnRleHRNZW51IiwiY29udGV4dEluZm9zIiwiYnVja2V0cyIsImtleSIsInZhbHVlIiwiY29udGV4dFBhdGgiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIkRlbGV0ZUhlbHBlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCB0eXBlIEFwcENvbXBvbmVudCBmcm9tIFwic2FwL2ZlL2NvcmUvQXBwQ29tcG9uZW50XCI7XG5pbXBvcnQgdHlwZSB7IFNpYmxpbmdJbmZvcm1hdGlvbiB9IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9lZGl0Rmxvdy9kcmFmdFwiO1xuaW1wb3J0IGRyYWZ0IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9lZGl0Rmxvdy9kcmFmdFwiO1xuaW1wb3J0IHR5cGUgTWVzc2FnZUhhbmRsZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL01lc3NhZ2VIYW5kbGVyXCI7XG5pbXBvcnQgdHlwZSB7IENoZWNrQm94JFNlbGVjdEV2ZW50IH0gZnJvbSBcInNhcC9tL0NoZWNrQm94XCI7XG5pbXBvcnQgQ2hlY2tCb3ggZnJvbSBcInNhcC9tL0NoZWNrQm94XCI7XG5pbXBvcnQgTWVzc2FnZVRvYXN0IGZyb20gXCJzYXAvbS9NZXNzYWdlVG9hc3RcIjtcbmltcG9ydCBUZXh0IGZyb20gXCJzYXAvbS9UZXh0XCI7XG5cbmltcG9ydCB0eXBlIFJlc291cmNlTW9kZWwgZnJvbSBcInNhcC9mZS9jb3JlL1Jlc291cmNlTW9kZWxcIjtcbmltcG9ydCB0eXBlIFRhYmxlQVBJIGZyb20gXCJzYXAvZmUvbWFjcm9zL3RhYmxlL1RhYmxlQVBJXCI7XG5pbXBvcnQgdHlwZSBDb250cm9sIGZyb20gXCJzYXAvdWkvY29yZS9Db250cm9sXCI7XG5pbXBvcnQgdHlwZSBUYWJsZSBmcm9tIFwic2FwL3VpL21kYy9UYWJsZVwiO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL0NvbnRleHRcIjtcbmltcG9ydCB0eXBlIE9EYXRhVjRDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQ29udGV4dFwiO1xuaW1wb3J0IHR5cGUgeyBJbnRlcm5hbE1vZGVsQ29udGV4dCB9IGZyb20gXCIuL01vZGVsSGVscGVyXCI7XG5cbmVudW0gRGVsZXRlT3B0aW9uVHlwZXMge1xuXHRkZWxldGFibGVDb250ZXh0cyA9IFwiZGVsZXRhYmxlQ29udGV4dHNcIixcblx0ZHJhZnRzV2l0aERlbGV0YWJsZUFjdGl2ZSA9IFwiZHJhZnRzV2l0aERlbGV0YWJsZUFjdGl2ZVwiLFxuXHR1blNhdmVkQ29udGV4dHMgPSBcInVuU2F2ZWRDb250ZXh0c1wiLFxuXHRkcmFmdHNXaXRoTm9uRGVsZXRhYmxlQWN0aXZlID0gXCJkcmFmdHNXaXRoTm9uRGVsZXRhYmxlQWN0aXZlXCIsXG5cdGRyYWZ0c1RvRGVsZXRlQmVmb3JlQWN0aXZlID0gXCJkcmFmdHNUb0RlbGV0ZUJlZm9yZUFjdGl2ZVwiXG59XG5cbmVudW0gRGVsZXRlRGlhbG9nQ29udGVudENvbnRyb2wge1xuXHRDSEVDS0JPWCA9IFwiY2hlY2tCb3hcIixcblx0VEVYVCA9IFwidGV4dFwiXG59XG5cbmV4cG9ydCB0eXBlIERyYWZ0U2libGluZ1BhaXIgPSB7XG5cdGRyYWZ0OiBPRGF0YVY0Q29udGV4dDtcblx0c2libGluZ0luZm86IFNpYmxpbmdJbmZvcm1hdGlvbjtcbn07XG5cbmV4cG9ydCB0eXBlIERlbGV0ZU9wdGlvbiA9IHtcblx0dHlwZTogRGVsZXRlT3B0aW9uVHlwZXM7XG5cdGNvbnRleHRzOiBPRGF0YVY0Q29udGV4dFtdO1xuXHRzZWxlY3RlZDogYm9vbGVhbjtcblx0dGV4dD86IHN0cmluZztcblx0Y29udHJvbD86IERlbGV0ZURpYWxvZ0NvbnRlbnRDb250cm9sO1xufTtcblxudHlwZSBDb250ZXh0SW5mbyA9IHtcblx0Y29udGV4dDogQ29udGV4dDtcblx0c2libGluZ1Byb21pc2U6IFByb21pc2U8U2libGluZ0luZm9ybWF0aW9uIHwgdW5kZWZpbmVkIHwgdm9pZD47XG5cdHNpYmxpbmdJbmZvOiBTaWJsaW5nSW5mb3JtYXRpb24gfCB1bmRlZmluZWQ7XG5cdGlzRHJhZnRSb290OiBib29sZWFuO1xuXHRpc0RyYWZ0Tm9kZTogYm9vbGVhbjtcblx0aXNBY3RpdmU6IGJvb2xlYW47XG5cdGhhc0FjdGl2ZTogYm9vbGVhbjtcblx0aGFzRHJhZnQ6IGJvb2xlYW47XG5cdGxvY2tlZDogYm9vbGVhbjtcblx0ZGVsZXRhYmxlOiBib29sZWFuO1xuXHRzaWJsaW5nRGVsZXRhYmxlOiBib29sZWFuO1xuXHRpc0luYWN0aXZlQ29udGV4dDogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCB0eXBlIERyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhVHlwZSA9IHtcblx0RHJhZnRVVUlEOiBzdHJpbmc7XG5cdEluUHJvY2Vzc0J5VXNlcj86IHN0cmluZztcblx0SW5Qcm9jZXNzQnlVc2VyRGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cdENyZWF0ZWRCeVVzZXJEZXNjcmlwdGlvbj86IHN0cmluZztcblx0Q3JlYXRlZEJ5VXNlcj86IHN0cmluZztcblx0TGFzdENoYW5nZWRCeVVzZXJEZXNjcmlwdGlvbj86IHN0cmluZztcblx0TGFzdENoYW5nZWRCeVVzZXI/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBEZWxldGVQYXJhbWV0ZXJzID0ge1xuXHRpbnRlcm5hbE1vZGVsQ29udGV4dD86IEludGVybmFsTW9kZWxDb250ZXh0IHwgbnVsbDtcblx0bnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzPzogbnVtYmVyO1xuXHRlbnRpdHlTZXROYW1lPzogc3RyaW5nO1xuXHRwYXJlbnRDb250cm9sPzogQ29udHJvbDtcblx0ZGVzY3JpcHRpb24/OiBzdHJpbmcgfCB7IHBhdGg6IHN0cmluZyB9O1xuXHRiZWZvcmVEZWxldGVDYWxsQmFjaz86IEZ1bmN0aW9uO1xuXHR1blNhdmVkQ29udGV4dHM/OiBPRGF0YVY0Q29udGV4dFtdO1xuXHRkcmFmdHNXaXRoTm9uRGVsZXRhYmxlQWN0aXZlPzogT0RhdGFWNENvbnRleHRbXTtcblx0bG9ja2VkQ29udGV4dHM/OiBPRGF0YVY0Q29udGV4dFtdO1xuXHRkcmFmdHNXaXRoRGVsZXRhYmxlQWN0aXZlPzogRHJhZnRTaWJsaW5nUGFpcltdO1xufTtcblxuZXhwb3J0IHR5cGUgRGVsZXRlVGV4dEluZm8gPSB7XG5cdGluZm9UeHQ/OiBzdHJpbmc7XG5cdG9wdGlvblR4dD86IHN0cmluZztcblx0b3B0aW9uV2l0aG91dFR4dD86IGJvb2xlYW47XG59O1xuXG5mdW5jdGlvbiBnZXRVcGRhdGVkU2VsZWN0aW9ucyhcblx0aW50ZXJuYWxNb2RlbENvbnRleHQ6IEludGVybmFsTW9kZWxDb250ZXh0LFxuXHR0eXBlOiBEZWxldGVPcHRpb25UeXBlcyxcblx0c2VsZWN0ZWRDb250ZXh0czogT0RhdGFWNENvbnRleHRbXSxcblx0Y29udGV4dHNUb1JlbW92ZTogT0RhdGFWNENvbnRleHRbXVxuKTogT0RhdGFWNENvbnRleHRbXSB7XG5cdGNvbnN0IHJldFNlbGVjdGVkQ29udGV4dHM6IE9EYXRhVjRDb250ZXh0W10gPSBbLi4uc2VsZWN0ZWRDb250ZXh0c107XG5cdGNvbnRleHRzVG9SZW1vdmUuZm9yRWFjaCgoY29udGV4dDogT0RhdGFWNENvbnRleHQpID0+IHtcblx0XHRjb25zdCBpZHggPSByZXRTZWxlY3RlZENvbnRleHRzLmluZGV4T2YoY29udGV4dCk7XG5cdFx0aWYgKGlkeCAhPT0gLTEpIHtcblx0XHRcdHJldFNlbGVjdGVkQ29udGV4dHMuc3BsaWNlKGlkeCwgMSk7XG5cdFx0fVxuXHR9KTtcblx0aW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkodHlwZSwgW10pO1xuXG5cdHJldHVybiByZXRTZWxlY3RlZENvbnRleHRzO1xufVxuXG5mdW5jdGlvbiBjbGVhclNlbGVjdGVkQ29udGV4dHNGb3JPcHRpb24oaW50ZXJuYWxNb2RlbENvbnRleHQ6IEludGVybmFsTW9kZWxDb250ZXh0LCBvcHRpb246IERlbGV0ZU9wdGlvbik6IHZvaWQge1xuXHRsZXQgc2VsZWN0ZWRDb250ZXh0cyA9IChpbnRlcm5hbE1vZGVsQ29udGV4dC5nZXRQcm9wZXJ0eShcInNlbGVjdGVkQ29udGV4dHNcIikgYXMgT0RhdGFWNENvbnRleHRbXSkgfHwgW107XG5cblx0aWYgKG9wdGlvbi50eXBlID09PSBEZWxldGVPcHRpb25UeXBlcy5kZWxldGFibGVDb250ZXh0cykge1xuXHRcdHNlbGVjdGVkQ29udGV4dHMgPSBnZXRVcGRhdGVkU2VsZWN0aW9ucyhcblx0XHRcdGludGVybmFsTW9kZWxDb250ZXh0LFxuXHRcdFx0RGVsZXRlT3B0aW9uVHlwZXMuZGVsZXRhYmxlQ29udGV4dHMsXG5cdFx0XHRzZWxlY3RlZENvbnRleHRzLFxuXHRcdFx0aW50ZXJuYWxNb2RlbENvbnRleHQuZ2V0UHJvcGVydHkoRGVsZXRlT3B0aW9uVHlwZXMuZGVsZXRhYmxlQ29udGV4dHMpIHx8IFtdXG5cdFx0KTtcblxuXHRcdGNvbnN0IGRyYWZ0U2libGluZ1BhaXJzID0gaW50ZXJuYWxNb2RlbENvbnRleHQuZ2V0UHJvcGVydHkoRGVsZXRlT3B0aW9uVHlwZXMuZHJhZnRzV2l0aERlbGV0YWJsZUFjdGl2ZSkgfHwgW107XG5cdFx0Y29uc3QgZHJhZnRzID0gZHJhZnRTaWJsaW5nUGFpcnMubWFwKChjb250ZXh0UGFpcjogRHJhZnRTaWJsaW5nUGFpcikgPT4ge1xuXHRcdFx0cmV0dXJuIGNvbnRleHRQYWlyLmRyYWZ0O1xuXHRcdH0pO1xuXHRcdHNlbGVjdGVkQ29udGV4dHMgPSBnZXRVcGRhdGVkU2VsZWN0aW9ucyhcblx0XHRcdGludGVybmFsTW9kZWxDb250ZXh0LFxuXHRcdFx0RGVsZXRlT3B0aW9uVHlwZXMuZHJhZnRzV2l0aERlbGV0YWJsZUFjdGl2ZSxcblx0XHRcdHNlbGVjdGVkQ29udGV4dHMsXG5cdFx0XHRkcmFmdHNcblx0XHQpO1xuXHR9IGVsc2Uge1xuXHRcdGNvbnN0IGNvbnRleHRzVG9SZW1vdmUgPSBpbnRlcm5hbE1vZGVsQ29udGV4dC5nZXRQcm9wZXJ0eShvcHRpb24udHlwZSkgfHwgW107XG5cdFx0c2VsZWN0ZWRDb250ZXh0cyA9IGdldFVwZGF0ZWRTZWxlY3Rpb25zKGludGVybmFsTW9kZWxDb250ZXh0LCBvcHRpb24udHlwZSwgc2VsZWN0ZWRDb250ZXh0cywgY29udGV4dHNUb1JlbW92ZSk7XG5cdH1cblx0aW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJzZWxlY3RlZENvbnRleHRzXCIsIHNlbGVjdGVkQ29udGV4dHMpO1xuXHRpbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcIm51bWJlck9mU2VsZWN0ZWRDb250ZXh0c1wiLCBzZWxlY3RlZENvbnRleHRzLmxlbmd0aCk7XG59XG5cbmZ1bmN0aW9uIGFmdGVyRGVsZXRlUHJvY2Vzcyhcblx0cGFyYW1ldGVyczogRGVsZXRlUGFyYW1ldGVycyxcblx0b3B0aW9uczogRGVsZXRlT3B0aW9uW10sXG5cdGNvbnRleHRzOiBPRGF0YVY0Q29udGV4dFtdLFxuXHRyZXNvdXJjZU1vZGVsOiBSZXNvdXJjZU1vZGVsLFxuXHRsYXN0RGVsZXRlZFJvd0luZGV4OiBudW1iZXJcbik6IHZvaWQge1xuXHRjb25zdCB7IGludGVybmFsTW9kZWxDb250ZXh0LCBlbnRpdHlTZXROYW1lIH0gPSBwYXJhbWV0ZXJzO1xuXHRpZiAoaW50ZXJuYWxNb2RlbENvbnRleHQpIHtcblx0XHRpZiAoaW50ZXJuYWxNb2RlbENvbnRleHQuZ2V0UHJvcGVydHkoXCJkZWxldGVFbmFibGVkXCIpICE9IHVuZGVmaW5lZCkge1xuXHRcdFx0b3B0aW9ucy5mb3JFYWNoKChvcHRpb24pID0+IHtcblx0XHRcdFx0Ly8gaWYgYW4gb3B0aW9uIGlzIHNlbGVjdGVkLCB0aGVuIGl0IGlzIGRlbGV0ZWQuIFNvLCB3ZSBuZWVkIHRvIHJlbW92ZSB0aGVtIGZyb20gc2VsZWN0ZWQgY29udGV4dHMuXG5cdFx0XHRcdGlmIChvcHRpb24uc2VsZWN0ZWQpIHtcblx0XHRcdFx0XHRjbGVhclNlbGVjdGVkQ29udGV4dHNGb3JPcHRpb24oaW50ZXJuYWxNb2RlbENvbnRleHQsIG9wdGlvbik7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH1cblx0XHQvLyBpZiBhdGxlYXN0IG9uZSBvZiB0aGUgb3B0aW9ucyBpcyBub3Qgc2VsZWN0ZWQsIHRoZW4gdGhlIGRlbGV0ZSBidXR0b24gbmVlZHMgdG8gYmUgZW5hYmxlZC5cblx0XHRpbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcblx0XHRcdFwiZGVsZXRlRW5hYmxlZFwiLFxuXHRcdFx0b3B0aW9ucy5zb21lKChvcHRpb24pID0+ICFvcHRpb24uc2VsZWN0ZWQpXG5cdFx0KTtcblx0fVxuXG5cdGlmIChjb250ZXh0cy5sZW5ndGggPT09IDEpIHtcblx0XHRNZXNzYWdlVG9hc3Quc2hvdyhyZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9ERUxFVEVfVE9BU1RfU0lOR1VMQVJcIiwgdW5kZWZpbmVkLCBlbnRpdHlTZXROYW1lKSk7XG5cdH0gZWxzZSB7XG5cdFx0TWVzc2FnZVRvYXN0LnNob3cocmVzb3VyY2VNb2RlbC5nZXRUZXh0KFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfREVMRVRFX1RPQVNUX1BMVVJBTFwiLCB1bmRlZmluZWQsIGVudGl0eVNldE5hbWUpKTtcblx0fVxuXHQvLyBUaGUgTXVsdGlWYWx1ZUZpZWxkIGRvZXMgbm90IG5lZWQgcmVzZXR0aW5nIG9mIGZvY3VzIGxpa2UgdGhlIHRhYmxlLCB3aXRoIHRoZSByZXNldHRpbmcgd2UgZ2V0IGNvbnNvbGUgZXJyb3JzIHdlIGF2b2lkIHRyb3VnaCB0aGlzIGNoZWNrXG5cdGlmIChwYXJhbWV0ZXJzLnBhcmVudENvbnRyb2wgIT09IHVuZGVmaW5lZCAmJiBwYXJhbWV0ZXJzLnBhcmVudENvbnRyb2wuZ2V0TWV0YWRhdGEoKS5nZXROYW1lKCkgIT09IFwic2FwLnVpLm1kYy5NdWx0aVZhbHVlRmllbGRcIikge1xuXHRcdGRlbGV0ZUhlbHBlci5zZXRGb2N1c0FmdGVyRGVsZXRlKHBhcmFtZXRlcnMucGFyZW50Q29udHJvbCBhcyBUYWJsZSwgY29udGV4dHMubGVuZ3RoLCBsYXN0RGVsZXRlZFJvd0luZGV4KTtcblx0fVxufVxuXG5hc3luYyBmdW5jdGlvbiBzZXRGb2N1c0FmdGVyRGVsZXRlKHRhYmxlOiBUYWJsZSwgZGVsZXRlZFJvd3NDb3VudDogbnVtYmVyLCBsYXN0RGVsZXRlZFJvd0luZGV4OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcblx0Y29uc3QgdGFibGVSb3dzQ291bnQgPSB0YWJsZS5nZXRSb3dCaW5kaW5nPy4oKT8uZ2V0Q291bnQoKTtcblx0Y29uc3Qgb3JpZ2luYWxUYWJsZVJvd3NDb3VudCA9ICh0YWJsZVJvd3NDb3VudCA/PyAwKSArIGRlbGV0ZWRSb3dzQ291bnQ7XG5cdGxldCBuZXh0Rm9jdXNSb3dJbmRleDtcblxuXHRpZiAobGFzdERlbGV0ZWRSb3dJbmRleCAhPT0gLTEgJiYgdGFibGVSb3dzQ291bnQgIT09IHVuZGVmaW5lZCAmJiB0YWJsZVJvd3NDb3VudCA+IDApIHtcblx0XHQvL0lmIHRoZSBsYXN0IHJvdyBpcyBkZWxldGVkLCBtb3ZlIHRoZSBmb2N1cyB0byBwcmV2aW91cyByb3cgdG8gaXRcblx0XHRpZiAobGFzdERlbGV0ZWRSb3dJbmRleCA9PT0gb3JpZ2luYWxUYWJsZVJvd3NDb3VudCAtIDEpIHtcblx0XHRcdG5leHRGb2N1c1Jvd0luZGV4ID0gdGFibGVSb3dzQ291bnQgLSAxO1xuXHRcdFx0Ly9Gb3IgdGhlIG5vcm1hbCBzY2VuYXJpbywgbW92ZSB0aGUgZm9jdXMgdG8gdGhlIG5leHQgcm93XG5cdFx0fSBlbHNlIHtcblx0XHRcdG5leHRGb2N1c1Jvd0luZGV4ID0gbGFzdERlbGV0ZWRSb3dJbmRleCAtIGRlbGV0ZWRSb3dzQ291bnQgKyAxO1xuXHRcdH1cblx0XHRhd2FpdCB0YWJsZS5mb2N1c1JvdyhuZXh0Rm9jdXNSb3dJbmRleCwgZmFsc2UpO1xuXHR9IGVsc2Uge1xuXHRcdC8vIEZvciB6ZXJvIHJvd3Mgb3IgZGVmYXVsdCBjYXNlLCBtb3ZlIGZvY3VzIHRvIHRhYmxlXG5cdFx0dGFibGUuZm9jdXMoKTtcblx0fVxufVxuXG5mdW5jdGlvbiBnZXRMb2NrZWRDb250ZXh0VXNlcihsb2NrZWRDb250ZXh0OiBPRGF0YVY0Q29udGV4dCk6IHN0cmluZyB7XG5cdGNvbnN0IGRyYWZ0QWRtaW5EYXRhID0gbG9ja2VkQ29udGV4dC5nZXRPYmplY3QoKVtcIkRyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhXCJdIGFzIERyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhVHlwZTtcblx0cmV0dXJuIChkcmFmdEFkbWluRGF0YSAmJiBkcmFmdEFkbWluRGF0YVtcIkluUHJvY2Vzc0J5VXNlclwiXSkgfHwgXCJcIjtcbn1cblxuZnVuY3Rpb24gZ2V0TG9ja2VkT2JqZWN0c1RleHQocmVzb3VyY2VNb2RlbDogUmVzb3VyY2VNb2RlbCwgbnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzOiBudW1iZXIsIGxvY2tlZENvbnRleHRzOiBPRGF0YVY0Q29udGV4dFtdKTogc3RyaW5nIHtcblx0bGV0IHJldFR4dCA9IFwiXCI7XG5cblx0aWYgKG51bWJlck9mU2VsZWN0ZWRDb250ZXh0cyA9PT0gMSAmJiBsb2NrZWRDb250ZXh0cy5sZW5ndGggPT09IDEpIHtcblx0XHQvL29ubHkgb25lIHVuc2F2ZWQgb2JqZWN0XG5cdFx0Y29uc3QgbG9ja2VkVXNlciA9IGdldExvY2tlZENvbnRleHRVc2VyKGxvY2tlZENvbnRleHRzWzBdKTtcblx0XHRyZXRUeHQgPSByZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9DT05GSVJNX0RFTEVURV9XSVRIX1NJTkdMRV9PQkpFQ1RfTE9DS0VEXCIsIFtsb2NrZWRVc2VyXSk7XG5cdH0gZWxzZSBpZiAobG9ja2VkQ29udGV4dHMubGVuZ3RoID09IDEpIHtcblx0XHRjb25zdCBsb2NrZWRVc2VyID0gZ2V0TG9ja2VkQ29udGV4dFVzZXIobG9ja2VkQ29udGV4dHNbMF0pO1xuXHRcdHJldFR4dCA9IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0NPTkZJUk1fREVMRVRFX1dJVEhfT0JKRUNUSU5GT19BTkRfT05FX09CSkVDVF9MT0NLRURcIiwgW1xuXHRcdFx0bnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzLFxuXHRcdFx0bG9ja2VkVXNlclxuXHRcdF0pO1xuXHR9IGVsc2UgaWYgKGxvY2tlZENvbnRleHRzLmxlbmd0aCA+IDEpIHtcblx0XHRyZXRUeHQgPSByZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9DT05GSVJNX0RFTEVURV9XSVRIX09CSkVDVElORk9fQU5EX0ZFV19PQkpFQ1RTX0xPQ0tFRFwiLCBbXG5cdFx0XHRsb2NrZWRDb250ZXh0cy5sZW5ndGgsXG5cdFx0XHRudW1iZXJPZlNlbGVjdGVkQ29udGV4dHNcblx0XHRdKTtcblx0fVxuXG5cdHJldHVybiByZXRUeHQ7XG59XG5cbmZ1bmN0aW9uIGdldE5vbkRlbGV0YWJsZUFjdGl2ZXNPZkRyYWZ0c1RleHQocmVzb3VyY2VNb2RlbDogUmVzb3VyY2VNb2RlbCwgbnVtYmVyT2ZEcmFmdHM6IG51bWJlciwgdG90YWxEZWxldGFibGU6IG51bWJlcik6IHN0cmluZyB7XG5cdGxldCByZXRUeHQgPSBcIlwiO1xuXG5cdGlmICh0b3RhbERlbGV0YWJsZSA9PT0gbnVtYmVyT2ZEcmFmdHMpIHtcblx0XHRpZiAobnVtYmVyT2ZEcmFmdHMgPT09IDEpIHtcblx0XHRcdHJldFR4dCA9IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0NPTkZJUk1fREVMRVRFX09OTFlfRFJBRlRfT0ZfTk9OX0RFTEVUQUJMRV9BQ1RJVkVcIik7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldFR4dCA9IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0NPTkZJUk1fREVMRVRFX09OTFlfRFJBRlRTX09GX05PTl9ERUxFVEFCTEVfQUNUSVZFXCIpO1xuXHRcdH1cblx0fSBlbHNlIGlmIChudW1iZXJPZkRyYWZ0cyA9PT0gMSkge1xuXHRcdHJldFR4dCA9IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0NPTkZJUk1fREVMRVRFX0RSQUZUX09GX05PTl9ERUxFVEFCTEVfQUNUSVZFXCIpO1xuXHR9IGVsc2Uge1xuXHRcdHJldFR4dCA9IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0NPTkZJUk1fREVMRVRFX0RSQUZUU19PRl9OT05fREVMRVRBQkxFX0FDVElWRVwiKTtcblx0fVxuXG5cdHJldHVybiByZXRUeHQ7XG59XG5cbmZ1bmN0aW9uIGdldFVuU2F2ZWRDb250ZXh0VXNlcih1blNhdmVkQ29udGV4dDogT0RhdGFWNENvbnRleHQpOiBzdHJpbmcge1xuXHRjb25zdCBkcmFmdEFkbWluRGF0YSA9IHVuU2F2ZWRDb250ZXh0LmdldE9iamVjdCgpW1wiRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGFcIl0gYXMgRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGFUeXBlO1xuXHRsZXQgc0xhc3RDaGFuZ2VkQnlVc2VyID0gXCJcIjtcblx0aWYgKGRyYWZ0QWRtaW5EYXRhKSB7XG5cdFx0c0xhc3RDaGFuZ2VkQnlVc2VyID0gZHJhZnRBZG1pbkRhdGFbXCJMYXN0Q2hhbmdlZEJ5VXNlckRlc2NyaXB0aW9uXCJdIHx8IGRyYWZ0QWRtaW5EYXRhW1wiTGFzdENoYW5nZWRCeVVzZXJcIl0gfHwgXCJcIjtcblx0fVxuXG5cdHJldHVybiBzTGFzdENoYW5nZWRCeVVzZXI7XG59XG5cbmZ1bmN0aW9uIGdldFVuc2F2ZWRDb250ZXh0c1RleHQoXG5cdHJlc291cmNlTW9kZWw6IFJlc291cmNlTW9kZWwsXG5cdG51bWJlck9mU2VsZWN0ZWRDb250ZXh0czogbnVtYmVyLFxuXHR1blNhdmVkQ29udGV4dHM6IE9EYXRhVjRDb250ZXh0W10sXG5cdHRvdGFsRGVsZXRhYmxlOiBudW1iZXJcbik6IERlbGV0ZVRleHRJbmZvIHtcblx0bGV0IGluZm9UeHQgPSBcIlwiLFxuXHRcdG9wdGlvblR4dCA9IFwiXCIsXG5cdFx0b3B0aW9uV2l0aG91dFR4dCA9IGZhbHNlO1xuXHRpZiAobnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzID09PSAxICYmIHVuU2F2ZWRDb250ZXh0cy5sZW5ndGggPT09IDEpIHtcblx0XHQvL29ubHkgb25lIHVuc2F2ZWQgb2JqZWN0IGFyZSBzZWxlY3RlZFxuXHRcdGNvbnN0IGxhc3RDaGFuZ2VkQnlVc2VyID0gZ2V0VW5TYXZlZENvbnRleHRVc2VyKHVuU2F2ZWRDb250ZXh0c1swXSk7XG5cdFx0aW5mb1R4dCA9IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0NPTkZJUk1fREVMRVRFX1dJVEhfVU5TQVZFRF9DSEFOR0VTXCIsIFtsYXN0Q2hhbmdlZEJ5VXNlcl0pO1xuXHRcdG9wdGlvbldpdGhvdXRUeHQgPSB0cnVlO1xuXHR9IGVsc2UgaWYgKG51bWJlck9mU2VsZWN0ZWRDb250ZXh0cyA9PT0gdW5TYXZlZENvbnRleHRzLmxlbmd0aCkge1xuXHRcdC8vb25seSBtdWx0aXBsZSB1bnNhdmVkIG9iamVjdHMgYXJlIHNlbGVjdGVkXG5cdFx0aW5mb1R4dCA9IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0NPTkZJUk1fREVMRVRFX1dJVEhfVU5TQVZFRF9DSEFOR0VTX01VTFRJUExFX09CSkVDVFNcIik7XG5cdFx0b3B0aW9uV2l0aG91dFR4dCA9IHRydWU7XG5cdH0gZWxzZSBpZiAodG90YWxEZWxldGFibGUgPT09IHVuU2F2ZWRDb250ZXh0cy5sZW5ndGgpIHtcblx0XHQvLyBub24tZGVsZXRhYmxlL2xvY2tlZCBleGlzdHMsIGFsbCBkZWxldGFibGUgYXJlIHVuc2F2ZWQgYnkgb3RoZXJzXG5cdFx0aWYgKHVuU2F2ZWRDb250ZXh0cy5sZW5ndGggPT09IDEpIHtcblx0XHRcdGNvbnN0IGxhc3RDaGFuZ2VkQnlVc2VyID0gZ2V0VW5TYXZlZENvbnRleHRVc2VyKHVuU2F2ZWRDb250ZXh0c1swXSk7XG5cdFx0XHRpbmZvVHh0ID0gcmVzb3VyY2VNb2RlbC5nZXRUZXh0KFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfQ09ORklSTV9ERUxFVEVfV0lUSF9VTlNBVkVEX0FORF9GRVdfT0JKRUNUU19MT0NLRURfU0lOR1VMQVJcIiwgW1xuXHRcdFx0XHRsYXN0Q2hhbmdlZEJ5VXNlclxuXHRcdFx0XSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGluZm9UeHQgPSByZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9DT05GSVJNX0RFTEVURV9XSVRIX1VOU0FWRURfQU5EX0ZFV19PQkpFQ1RTX0xPQ0tFRF9QTFVSQUxcIik7XG5cdFx0fVxuXHRcdG9wdGlvbldpdGhvdXRUeHQgPSB0cnVlO1xuXHR9IGVsc2UgaWYgKHRvdGFsRGVsZXRhYmxlID4gdW5TYXZlZENvbnRleHRzLmxlbmd0aCkge1xuXHRcdC8vIG5vbi1kZWxldGFibGUvbG9ja2VkIGV4aXN0cywgZGVsZXRhYmxlIGluY2x1ZGUgdW5zYXZlZCBhbmQgb3RoZXIgdHlwZXMuXG5cdFx0aWYgKHVuU2F2ZWRDb250ZXh0cy5sZW5ndGggPT09IDEpIHtcblx0XHRcdGNvbnN0IGxhc3RDaGFuZ2VkQnlVc2VyID0gZ2V0VW5TYXZlZENvbnRleHRVc2VyKHVuU2F2ZWRDb250ZXh0c1swXSk7XG5cdFx0XHRvcHRpb25UeHQgPSByZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9DT05GSVJNX0RFTEVURV9XSVRIX09CSkVDVElORk9fQU5EX0ZFV19PQkpFQ1RTX1VOU0FWRURfU0lOR1VMQVJcIiwgW1xuXHRcdFx0XHRsYXN0Q2hhbmdlZEJ5VXNlclxuXHRcdFx0XSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG9wdGlvblR4dCA9IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0NPTkZJUk1fREVMRVRFX1dJVEhfT0JKRUNUSU5GT19BTkRfRkVXX09CSkVDVFNfVU5TQVZFRF9QTFVSQUxcIik7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIHsgaW5mb1R4dCwgb3B0aW9uVHh0LCBvcHRpb25XaXRob3V0VHh0IH07XG59XG5cbmZ1bmN0aW9uIGdldE5vbkRlbGV0YWJsZVRleHQoXG5cdG1QYXJhbWV0ZXJzOiBEZWxldGVQYXJhbWV0ZXJzLFxuXHR0b3RhbE51bURlbGV0YWJsZUNvbnRleHRzOiBudW1iZXIsXG5cdHJlc291cmNlTW9kZWw6IFJlc291cmNlTW9kZWxcbik6IFRleHQgfCB1bmRlZmluZWQge1xuXHRjb25zdCB7IG51bWJlck9mU2VsZWN0ZWRDb250ZXh0cywgZW50aXR5U2V0TmFtZSwgbG9ja2VkQ29udGV4dHMgPSBbXSwgZHJhZnRzV2l0aE5vbkRlbGV0YWJsZUFjdGl2ZSA9IFtdIH0gPSBtUGFyYW1ldGVycztcblx0Y29uc3Qgbm9uRGVsZXRhYmxlQ29udGV4dHMgPVxuXHRcdG51bWJlck9mU2VsZWN0ZWRDb250ZXh0cyEgLSAobG9ja2VkQ29udGV4dHMubGVuZ3RoICsgdG90YWxOdW1EZWxldGFibGVDb250ZXh0cyAtIGRyYWZ0c1dpdGhOb25EZWxldGFibGVBY3RpdmUubGVuZ3RoKTtcblx0bGV0IHJldFR4dCA9IFwiXCI7XG5cblx0aWYgKFxuXHRcdG5vbkRlbGV0YWJsZUNvbnRleHRzID4gMCAmJlxuXHRcdCh0b3RhbE51bURlbGV0YWJsZUNvbnRleHRzID09PSAwIHx8IGRyYWZ0c1dpdGhOb25EZWxldGFibGVBY3RpdmUubGVuZ3RoID09PSB0b3RhbE51bURlbGV0YWJsZUNvbnRleHRzKVxuXHQpIHtcblx0XHQvLyAxLiBOb25lIG9mIHRoZSBjY29udGV4dHMgYXJlIGRlbGV0YWJsZVxuXHRcdC8vIDIuIE9ubHkgZHJhZnRzIG9mIG5vbiBkZWxldGFibGUgY29udGV4dHMgZXhpc3QuXG5cdFx0aWYgKGxvY2tlZENvbnRleHRzLmxlbmd0aCA+IDApIHtcblx0XHRcdC8vIExvY2tlZCBjb250ZXh0cyBleGlzdFxuXHRcdFx0aWYgKG5vbkRlbGV0YWJsZUNvbnRleHRzID09PSAxKSB7XG5cdFx0XHRcdHJldFR4dCA9IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0NPTkZJUk1fREVMRVRFX1dJVEhfQUxMX1JFTUFJTklOR19OT05fREVMRVRBQkxFX1NJTkdVTEFSXCIpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmV0VHh0ID0gcmVzb3VyY2VNb2RlbC5nZXRUZXh0KFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfQ09ORklSTV9ERUxFVEVfV0lUSF9BTExfUkVNQUlOSU5HX05PTl9ERUxFVEFCTEVfUExVUkFMXCIpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAobm9uRGVsZXRhYmxlQ29udGV4dHMgPT09IDEpIHtcblx0XHRcdC8vIE9ubHkgcHVyZSBub24tZGVsZXRhYmxlIGNvbnRleHRzIGV4aXN0IHNpbmdsZVxuXHRcdFx0cmV0VHh0ID0gcmVzb3VyY2VNb2RlbC5nZXRUZXh0KFxuXHRcdFx0XHRcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0NPTkZJUk1fREVMRVRFX1dJVEhfU0lOR0xFX0FORF9PTkVfT0JKRUNUX05PTl9ERUxFVEFCTEVcIixcblx0XHRcdFx0dW5kZWZpbmVkLFxuXHRcdFx0XHRlbnRpdHlTZXROYW1lXG5cdFx0XHQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBPbmx5IHB1cmUgbm9uLWRlbGV0YWJsZSBjb250ZXh0cyBleGlzdCBtdWx0aXBsZVxuXHRcdFx0cmV0VHh0ID0gcmVzb3VyY2VNb2RlbC5nZXRUZXh0KFxuXHRcdFx0XHRcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0NPTkZJUk1fREVMRVRFX1dJVEhfTVVMVElQTEVfQU5EX0FMTF9PQkpFQ1RfTk9OX0RFTEVUQUJMRVwiLFxuXHRcdFx0XHR1bmRlZmluZWQsXG5cdFx0XHRcdGVudGl0eVNldE5hbWVcblx0XHRcdCk7XG5cdFx0fVxuXHR9IGVsc2UgaWYgKG5vbkRlbGV0YWJsZUNvbnRleHRzID09PSAxKSB7XG5cdFx0Ly8gZGVsZXRhYmxlIGFuZCBub24tZGVsZXRhYmxlIGV4aXN0cyB0b2dldGhlciwgc2luZ2xlXG5cdFx0cmV0VHh0ID0gcmVzb3VyY2VNb2RlbC5nZXRUZXh0KFxuXHRcdFx0XCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9DT05GSVJNX0RFTEVURV9XSVRIX09CSkVDVElORk9fQU5EX09ORV9PQkpFQ1RfTk9OX0RFTEVUQUJMRVwiLFxuXHRcdFx0W251bWJlck9mU2VsZWN0ZWRDb250ZXh0c10sXG5cdFx0XHRlbnRpdHlTZXROYW1lXG5cdFx0KTtcblx0fSBlbHNlIGlmIChub25EZWxldGFibGVDb250ZXh0cyA+IDEpIHtcblx0XHQvLyBkZWxldGFibGUgYW5kIG5vbi1kZWxldGFibGUgZXhpc3RzIHRvZ2V0aGVyLCBtdWx0aXBsZVxuXHRcdHJldFR4dCA9IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcblx0XHRcdFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfQ09ORklSTV9ERUxFVEVfV0lUSF9PQkpFQ1RJTkZPX0FORF9GRVdfT0JKRUNUU19OT05fREVMRVRBQkxFXCIsXG5cdFx0XHRbbm9uRGVsZXRhYmxlQ29udGV4dHMsIG51bWJlck9mU2VsZWN0ZWRDb250ZXh0c10sXG5cdFx0XHRlbnRpdHlTZXROYW1lXG5cdFx0KTtcblx0fVxuXG5cdHJldHVybiByZXRUeHQgPyBuZXcgVGV4dCh7IHRleHQ6IHJldFR4dCB9KSA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gZ2V0Q29uZmlybWVkRGVsZXRhYmxlQ29udGV4dChjb250ZXh0czogT0RhdGFWNENvbnRleHRbXSwgb3B0aW9uczogRGVsZXRlT3B0aW9uW10pOiBPRGF0YVY0Q29udGV4dFtdIHtcblx0cmV0dXJuIG9wdGlvbnMucmVkdWNlKChyZXN1bHQsIG9wdGlvbikgPT4ge1xuXHRcdHJldHVybiBvcHRpb24uc2VsZWN0ZWQgJiYgb3B0aW9uLnR5cGUgIT09IERlbGV0ZU9wdGlvblR5cGVzLmRyYWZ0c1RvRGVsZXRlQmVmb3JlQWN0aXZlID8gcmVzdWx0LmNvbmNhdChvcHRpb24uY29udGV4dHMpIDogcmVzdWx0O1xuXHR9LCBjb250ZXh0cyk7XG59XG5cbmZ1bmN0aW9uIGdldERyYWZ0c1RvRGVsZXRlQmVmb3JlQWN0aXZlKG9wdGlvbnM6IERlbGV0ZU9wdGlvbltdKTogT0RhdGFWNENvbnRleHRbXSB7XG5cdGNvbnN0IGNvbnRleHRzOiBPRGF0YVY0Q29udGV4dFtdID0gW107XG5cdHJldHVybiBvcHRpb25zLnJlZHVjZSgocmVzdWx0LCBvcHRpb24pID0+IHtcblx0XHRyZXR1cm4gb3B0aW9uLnNlbGVjdGVkICYmIG9wdGlvbi50eXBlID09PSBEZWxldGVPcHRpb25UeXBlcy5kcmFmdHNUb0RlbGV0ZUJlZm9yZUFjdGl2ZSA/IHJlc3VsdC5jb25jYXQob3B0aW9uLmNvbnRleHRzKSA6IHJlc3VsdDtcblx0fSwgY29udGV4dHMpO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVEcmFmdE9wdGlvbnNGb3JEZWxldGFibGVUZXh0cyhcblx0bVBhcmFtZXRlcnM6IERlbGV0ZVBhcmFtZXRlcnMsXG5cdHZDb250ZXh0czogT0RhdGFWNENvbnRleHRbXSxcblx0dG90YWxEZWxldGFibGU6IG51bWJlcixcblx0cmVzb3VyY2VNb2RlbDogUmVzb3VyY2VNb2RlbCxcblx0aXRlbXM6IENvbnRyb2xbXSxcblx0b3B0aW9uczogRGVsZXRlT3B0aW9uW11cbik6IHZvaWQge1xuXHRsZXQgeyBudW1iZXJPZlNlbGVjdGVkQ29udGV4dHMsIGRyYWZ0c1dpdGhEZWxldGFibGVBY3RpdmUsIHVuU2F2ZWRDb250ZXh0cywgbG9ja2VkQ29udGV4dHMsIGRyYWZ0c1dpdGhOb25EZWxldGFibGVBY3RpdmUgfSA9XG5cdFx0bVBhcmFtZXRlcnM7XG5cdGRyYWZ0c1dpdGhEZWxldGFibGVBY3RpdmUgPz89IFtdO1xuXHR1blNhdmVkQ29udGV4dHMgPz89IFtdO1xuXHRsb2NrZWRDb250ZXh0cyA/Pz0gW107XG5cdGRyYWZ0c1dpdGhOb25EZWxldGFibGVBY3RpdmUgPz89IFtdO1xuXHRudW1iZXJPZlNlbGVjdGVkQ29udGV4dHMgPz89IDA7XG5cdGxldCBsb2NrZWRDb250ZXh0c1R4dCA9IFwiXCI7XG5cblx0Ly8gZHJhZnRzIHdpdGggYWN0aXZlXG5cdGlmIChkcmFmdHNXaXRoRGVsZXRhYmxlQWN0aXZlLmxlbmd0aCA+IDApIHtcblx0XHRjb25zdCBkcmFmdHNUb0RlbGV0ZUJlZm9yZUFjdGl2ZTogT0RhdGFWNENvbnRleHRbXSA9IFtdO1xuXHRcdGRyYWZ0c1dpdGhEZWxldGFibGVBY3RpdmUuZm9yRWFjaCgoZGVsZXRhYmxlRHJhZnRJbmZvOiBEcmFmdFNpYmxpbmdQYWlyKSA9PiB7XG5cdFx0XHQvLyBJbiBlaXRoZXIgY2FzZXMsIGlmIGFuIG93biBkcmFmdCBpcyBsb2NrZWQgb3Igbm90IHRoZSBkcmFmdCBuZWVkcyB0byBiZSBkaXNjYXJkZWQgYmVmb3JlIGRlbGV0aW5nIGFjdGl2ZSByZWNvcmQuXG5cdFx0XHRkcmFmdHNUb0RlbGV0ZUJlZm9yZUFjdGl2ZS5wdXNoKGRlbGV0YWJsZURyYWZ0SW5mby5kcmFmdCk7XG5cdFx0XHR2Q29udGV4dHMucHVzaChkZWxldGFibGVEcmFmdEluZm8uc2libGluZ0luZm8udGFyZ2V0Q29udGV4dCk7XG5cdFx0fSk7XG5cdFx0aWYgKGRyYWZ0c1RvRGVsZXRlQmVmb3JlQWN0aXZlLmxlbmd0aCA+IDApIHtcblx0XHRcdG9wdGlvbnMucHVzaCh7XG5cdFx0XHRcdHR5cGU6IERlbGV0ZU9wdGlvblR5cGVzLmRyYWZ0c1RvRGVsZXRlQmVmb3JlQWN0aXZlLFxuXHRcdFx0XHRjb250ZXh0czogZHJhZnRzVG9EZWxldGVCZWZvcmVBY3RpdmUsXG5cdFx0XHRcdHNlbGVjdGVkOiB0cnVlXG5cdFx0XHR9KTtcblx0XHR9XG5cdH1cblxuXHQvLyBpdGVtcyBsb2NrZWQgbXNnXG5cdGlmIChsb2NrZWRDb250ZXh0cy5sZW5ndGggPiAwKSB7XG5cdFx0bG9ja2VkQ29udGV4dHNUeHQgPSBkZWxldGVIZWxwZXIuZ2V0TG9ja2VkT2JqZWN0c1RleHQocmVzb3VyY2VNb2RlbCwgbnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzLCBsb2NrZWRDb250ZXh0cykgfHwgXCJcIjtcblx0XHRpdGVtcy5wdXNoKG5ldyBUZXh0KHsgdGV4dDogbG9ja2VkQ29udGV4dHNUeHQgfSkpO1xuXHR9XG5cblx0Ly8gbm9uIGRlbGV0YWJsZSBtc2dcblx0Y29uc3Qgbm9uRGVsZXRhYmxlRXhpc3RzID0gbnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzICE9IHRvdGFsRGVsZXRhYmxlIC0gZHJhZnRzV2l0aE5vbkRlbGV0YWJsZUFjdGl2ZS5sZW5ndGggKyBsb2NrZWRDb250ZXh0cy5sZW5ndGg7XG5cdGNvbnN0IG5vbkRlbGV0YWJsZVRleHRDdHJsID0gbm9uRGVsZXRhYmxlRXhpc3RzICYmIGRlbGV0ZUhlbHBlci5nZXROb25EZWxldGFibGVUZXh0KG1QYXJhbWV0ZXJzLCB0b3RhbERlbGV0YWJsZSwgcmVzb3VyY2VNb2RlbCk7XG5cdGlmIChub25EZWxldGFibGVUZXh0Q3RybCkge1xuXHRcdGl0ZW1zLnB1c2gobm9uRGVsZXRhYmxlVGV4dEN0cmwpO1xuXHR9XG5cblx0Ly8gb3B0aW9uOiB1bnNhdmVkIGNoYW5nZXMgYnkgb3RoZXJzXG5cdGlmICh1blNhdmVkQ29udGV4dHMubGVuZ3RoID4gMCkge1xuXHRcdGNvbnN0IHVuc2F2ZWRDaGFuZ2VzVHh0cyA9XG5cdFx0XHRkZWxldGVIZWxwZXIuZ2V0VW5zYXZlZENvbnRleHRzVGV4dChyZXNvdXJjZU1vZGVsLCBudW1iZXJPZlNlbGVjdGVkQ29udGV4dHMsIHVuU2F2ZWRDb250ZXh0cywgdG90YWxEZWxldGFibGUpIHx8IHt9O1xuXHRcdGlmICh1bnNhdmVkQ2hhbmdlc1R4dHMuaW5mb1R4dCkge1xuXHRcdFx0aXRlbXMucHVzaChuZXcgVGV4dCh7IHRleHQ6IHVuc2F2ZWRDaGFuZ2VzVHh0cy5pbmZvVHh0IH0pKTtcblx0XHR9XG5cdFx0aWYgKHVuc2F2ZWRDaGFuZ2VzVHh0cy5vcHRpb25UeHQgfHwgdW5zYXZlZENoYW5nZXNUeHRzLm9wdGlvbldpdGhvdXRUeHQpIHtcblx0XHRcdG9wdGlvbnMucHVzaCh7XG5cdFx0XHRcdHR5cGU6IERlbGV0ZU9wdGlvblR5cGVzLnVuU2F2ZWRDb250ZXh0cyxcblx0XHRcdFx0Y29udGV4dHM6IHVuU2F2ZWRDb250ZXh0cyxcblx0XHRcdFx0dGV4dDogdW5zYXZlZENoYW5nZXNUeHRzLm9wdGlvblR4dCxcblx0XHRcdFx0c2VsZWN0ZWQ6IHRydWUsXG5cdFx0XHRcdGNvbnRyb2w6IERlbGV0ZURpYWxvZ0NvbnRlbnRDb250cm9sLkNIRUNLQk9YXG5cdFx0XHR9KTtcblx0XHR9XG5cdH1cblxuXHQvLyBvcHRpb246IGRyYWZ0cyB3aXRoIGFjdGl2ZSBub3QgZGVsZXRhYmxlXG5cdGlmIChkcmFmdHNXaXRoTm9uRGVsZXRhYmxlQWN0aXZlLmxlbmd0aCA+IDApIHtcblx0XHRjb25zdCBub25EZWxldGFibGVBY3RpdmVzT2ZEcmFmdHNUZXh0ID1cblx0XHRcdGRlbGV0ZUhlbHBlci5nZXROb25EZWxldGFibGVBY3RpdmVzT2ZEcmFmdHNUZXh0KHJlc291cmNlTW9kZWwsIGRyYWZ0c1dpdGhOb25EZWxldGFibGVBY3RpdmUubGVuZ3RoLCB0b3RhbERlbGV0YWJsZSkgfHwgXCJcIjtcblx0XHRpZiAobm9uRGVsZXRhYmxlQWN0aXZlc09mRHJhZnRzVGV4dCkge1xuXHRcdFx0b3B0aW9ucy5wdXNoKHtcblx0XHRcdFx0dHlwZTogRGVsZXRlT3B0aW9uVHlwZXMuZHJhZnRzV2l0aE5vbkRlbGV0YWJsZUFjdGl2ZSxcblx0XHRcdFx0Y29udGV4dHM6IGRyYWZ0c1dpdGhOb25EZWxldGFibGVBY3RpdmUsXG5cdFx0XHRcdHRleHQ6IG5vbkRlbGV0YWJsZUFjdGl2ZXNPZkRyYWZ0c1RleHQsXG5cdFx0XHRcdHNlbGVjdGVkOiB0cnVlLFxuXHRcdFx0XHRjb250cm9sOiB0b3RhbERlbGV0YWJsZSA+IDAgPyBEZWxldGVEaWFsb2dDb250ZW50Q29udHJvbC5DSEVDS0JPWCA6IERlbGV0ZURpYWxvZ0NvbnRlbnRDb250cm9sLlRFWFRcblx0XHRcdH0pO1xuXHRcdH1cblx0fVxufVxuXG5mdW5jdGlvbiB1cGRhdGVDb250ZW50Rm9yRGVsZXRlRGlhbG9nKG9wdGlvbnM6IERlbGV0ZU9wdGlvbltdLCBpdGVtczogQ29udHJvbFtdKTogdm9pZCB7XG5cdGlmIChvcHRpb25zLmxlbmd0aCA9PT0gMSkge1xuXHRcdC8vIFNpbmdsZSBvcHRpb24gZG9lc24ndCBuZWVkIGNoZWNrQm94XG5cdFx0Y29uc3Qgb3B0aW9uID0gb3B0aW9uc1swXTtcblx0XHRpZiAob3B0aW9uLnRleHQpIHtcblx0XHRcdGNvbnN0IHRleHQgPSBuZXcgVGV4dCgpO1xuXHRcdFx0dGV4dC5zZXRUZXh0KG9wdGlvbi50ZXh0KTtcblx0XHRcdGl0ZW1zLnB1c2godGV4dCk7XG5cdFx0fVxuXHR9IGVsc2UgaWYgKG9wdGlvbnMubGVuZ3RoID4gMSkge1xuXHRcdC8vIE11bHRpcGxlIE9wdGlvbnNcblxuXHRcdC8vIFRleHRzXG5cdFx0b3B0aW9ucy5mb3JFYWNoKChvcHRpb246IERlbGV0ZU9wdGlvbikgPT4ge1xuXHRcdFx0aWYgKG9wdGlvbi5jb250cm9sID09PSBcInRleHRcIiAmJiBvcHRpb24udGV4dCkge1xuXHRcdFx0XHRjb25zdCB0ZXh0ID0gbmV3IFRleHQoKTtcblx0XHRcdFx0dGV4dC5zZXRUZXh0KG9wdGlvbi50ZXh0KTtcblx0XHRcdFx0aXRlbXMucHVzaCh0ZXh0KTtcblx0XHRcdH1cblx0XHR9KTtcblx0XHQvLyBDaGVja0JveHNcblx0XHRvcHRpb25zLmZvckVhY2goKG9wdGlvbjogRGVsZXRlT3B0aW9uKSA9PiB7XG5cdFx0XHRpZiAob3B0aW9uLmNvbnRyb2wgPT09IFwiY2hlY2tCb3hcIiAmJiBvcHRpb24udGV4dCkge1xuXHRcdFx0XHRpdGVtcy5wdXNoKFxuXHRcdFx0XHRcdG5ldyBDaGVja0JveCh7XG5cdFx0XHRcdFx0XHR0ZXh0OiBvcHRpb24udGV4dCxcblx0XHRcdFx0XHRcdHNlbGVjdGVkOiB0cnVlLFxuXHRcdFx0XHRcdFx0c2VsZWN0OiBmdW5jdGlvbiAob0V2ZW50OiBDaGVja0JveCRTZWxlY3RFdmVudCk6IHZvaWQge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBjaGVja0JveCA9IG9FdmVudC5nZXRTb3VyY2UoKTtcblx0XHRcdFx0XHRcdFx0Y29uc3Qgc2VsZWN0ZWQgPSBjaGVja0JveC5nZXRTZWxlY3RlZCgpO1xuXHRcdFx0XHRcdFx0XHRvcHRpb24uc2VsZWN0ZWQgPSBzZWxlY3RlZDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG59XG5cbi8qKlxuICogR2V0IHRoZSBvcmlnaW5hbCByZWNvcmQgc2VsZWN0ZWQgb24gdGhlIFVJLlxuICpcbiAqIEluIHRoZSBjYXNlIHRoZSBjb250ZXh0IHRvIGRlbGV0ZSBpcyBhbiBhY3RpdmUgcmVjb3JkIGJ1dCB0aGUgc2VsZWN0ZWQgY29udGV4dCBpcyBhIGRyYWZ0IHJlY29yZC5cbiAqXG4gKiBAcGFyYW0gbVBhcmFtZXRlcnMgRGVsZXRlIHBhcmFtZXRlcnMgYW5kIGluZm9ybWF0aW9uIG9mIHNlbGVjdGVkIGNvbnRleHRzLlxuICogQHBhcmFtIGNvbnRleHRUb0RlbGV0ZSBPRGF0YVY0Q29udGV4dCB0byBjaGVjay5cbiAqIEByZXR1cm5zIE9EYXRhVjRDb250ZXh0IGZvciBkZWxldGUuXG4gKi9cbmZ1bmN0aW9uIF9nZXRPcmlnaW5hbFNlbGVjdGVkUmVjb3JkKG1QYXJhbWV0ZXJzOiBEZWxldGVQYXJhbWV0ZXJzLCBjb250ZXh0VG9EZWxldGU6IE9EYXRhVjRDb250ZXh0KTogT0RhdGFWNENvbnRleHQge1xuXHRjb25zdCB7IGRyYWZ0c1dpdGhEZWxldGFibGVBY3RpdmUgfSA9IG1QYXJhbWV0ZXJzO1xuXHRjb25zdCByZXQgPSBkcmFmdHNXaXRoRGVsZXRhYmxlQWN0aXZlPy5maW5kKChkcmFmdFNpYmxpbmdQYWlyKSA9PiBkcmFmdFNpYmxpbmdQYWlyLnNpYmxpbmdJbmZvLnRhcmdldENvbnRleHQgPT09IGNvbnRleHRUb0RlbGV0ZSk7XG5cdHJldHVybiByZXQ/LmRyYWZ0ID8gcmV0LmRyYWZ0IDogY29udGV4dFRvRGVsZXRlO1xufVxuXG4vKipcbiAqIEdldCB0aGUgcG9zc2libGUgb3B0aW9ucyBmb3IgZGVsZXRpb24gb2YgdGhlIHNlbGVjdGVkIGNvbnRleHRzLlxuICpcbiAqIEBwYXJhbSBtUGFyYW1ldGVycyBEZWxldGUgcGFyYW1ldGVycyBhbmQgaW5mb3JtYXRpb24gb2Ygc2VsZWN0ZWQgY29udGV4dHMuXG4gKiBAcGFyYW0gZGlyZWN0RGVsZXRhYmxlQ29udGV4dHMgQ29udGV4dHMgdGhhdCBjYW4gYmUgZGVsZXRhYmxlIGRpcmVjdGx5LlxuICogQHBhcmFtIHJlc291cmNlTW9kZWwgUmVzb3VyY2UgbW9kZWwuXG4gKiBAcmV0dXJucyBPcHRpb25zIHRoYXQgYXJlIHBvc3NpYmxlIGZvciBzZWxlY3RlZCByZWNvcmRzLlxuICovXG5mdW5jdGlvbiBnZXRPcHRpb25zRm9yRGVsZXRhYmxlVGV4dHMoXG5cdG1QYXJhbWV0ZXJzOiBEZWxldGVQYXJhbWV0ZXJzLFxuXHRkaXJlY3REZWxldGFibGVDb250ZXh0czogT0RhdGFWNENvbnRleHRbXSxcblx0cmVzb3VyY2VNb2RlbDogUmVzb3VyY2VNb2RlbFxuKTogRGVsZXRlT3B0aW9uW10ge1xuXHRsZXQgeyBudW1iZXJPZlNlbGVjdGVkQ29udGV4dHMsIGxvY2tlZENvbnRleHRzLCBkcmFmdHNXaXRoTm9uRGVsZXRhYmxlQWN0aXZlLCB1blNhdmVkQ29udGV4dHMgfSA9IG1QYXJhbWV0ZXJzO1xuXHRjb25zdCB7IGVudGl0eVNldE5hbWUsIHBhcmVudENvbnRyb2wsIGRlc2NyaXB0aW9uIH0gPSBtUGFyYW1ldGVycztcblx0ZHJhZnRzV2l0aE5vbkRlbGV0YWJsZUFjdGl2ZSA/Pz0gW107XG5cdHVuU2F2ZWRDb250ZXh0cyA/Pz0gW107XG5cdGxvY2tlZENvbnRleHRzID8/PSBbXTtcblx0ZHJhZnRzV2l0aE5vbkRlbGV0YWJsZUFjdGl2ZSA/Pz0gW107XG5cdG51bWJlck9mU2VsZWN0ZWRDb250ZXh0cyA/Pz0gMDtcblx0Y29uc3QgdG90YWxEZWxldGFibGUgPSBkaXJlY3REZWxldGFibGVDb250ZXh0cy5sZW5ndGggKyBkcmFmdHNXaXRoTm9uRGVsZXRhYmxlQWN0aXZlLmxlbmd0aCArIHVuU2F2ZWRDb250ZXh0cy5sZW5ndGg7XG5cdGNvbnN0IG5vbkRlbGV0YWJsZUNvbnRleHRzID0gbnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzIC0gKGxvY2tlZENvbnRleHRzLmxlbmd0aCArIHRvdGFsRGVsZXRhYmxlIC0gZHJhZnRzV2l0aE5vbkRlbGV0YWJsZUFjdGl2ZS5sZW5ndGgpO1xuXHRjb25zdCBvcHRpb25zOiBEZWxldGVPcHRpb25bXSA9IFtdO1xuXG5cdGlmIChudW1iZXJPZlNlbGVjdGVkQ29udGV4dHMgPT09IDEgJiYgbnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzID09PSBkaXJlY3REZWxldGFibGVDb250ZXh0cy5sZW5ndGgpIHtcblx0XHQvLyBzaW5nbGUgZGVsZXRhYmxlIGNvbnRleHRcblx0XHRjb25zdCBvVGFibGUgPSBwYXJlbnRDb250cm9sIGFzIFRhYmxlO1xuXHRcdGNvbnN0IHNLZXkgPSBvVGFibGUgJiYgKChvVGFibGUuZ2V0UGFyZW50KCkgYXMgVGFibGVBUEkpLmdldElkZW50aWZpZXJDb2x1bW4oKSBhcyBzdHJpbmcpO1xuXHRcdGxldCB0eHQ7XG5cdFx0aWYgKHNLZXkpIHtcblx0XHRcdGNvbnN0IGRlc2NyaXB0aW9uUGF0aCA9IGRlc2NyaXB0aW9uICYmIChkZXNjcmlwdGlvbiBhcyB7IHBhdGg/OiBzdHJpbmcgfSkucGF0aDtcblx0XHRcdGxldCBzaW5nbGVDb250ZXh0ID0gZGlyZWN0RGVsZXRhYmxlQ29udGV4dHNbMF07XG5cdFx0XHRsZXQgb0xpbmVDb250ZXh0RGF0YSA9IHNpbmdsZUNvbnRleHQuZ2V0T2JqZWN0KCk7XG5cdFx0XHRpZiAoIW9MaW5lQ29udGV4dERhdGEgfHwgT2JqZWN0LmtleXMob0xpbmVDb250ZXh0RGF0YSkubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRcdC8vIEluIGNhc2Ugb3JpZ2luYWwgc2VsZWN0ZWQgcmVjb3JkIGlzIGRyYWZ0KGluIFVJKS4gVGhlIEFjdGl2ZSByZWNvcmQgbmVlZHMgdG8gYmUgZGVsZXRlZChkaXJlY3REZWxldGFibGVDb250ZXh0cyBoYXMgYWN0aXZlIHJlY29yZCksIGJ1dCBkYXRhIGlzIG5vdCByZXF1ZXN0ZWQuIFdlIGdldCBkYXRhIGZyb20gdGhlIGRyYWZ0LlxuXHRcdFx0XHRzaW5nbGVDb250ZXh0ID0gX2dldE9yaWdpbmFsU2VsZWN0ZWRSZWNvcmQobVBhcmFtZXRlcnMsIHNpbmdsZUNvbnRleHQpO1xuXHRcdFx0XHRvTGluZUNvbnRleHREYXRhID0gc2luZ2xlQ29udGV4dC5nZXRPYmplY3QoKTtcblx0XHRcdH1cblx0XHRcdGNvbnN0IHNLZXlWYWx1ZSA9IHNLZXkgPyBvTGluZUNvbnRleHREYXRhW3NLZXldIDogdW5kZWZpbmVkO1xuXHRcdFx0Y29uc3Qgc0Rlc2NyaXB0aW9uID0gZGVzY3JpcHRpb25QYXRoICYmIG9MaW5lQ29udGV4dERhdGFbZGVzY3JpcHRpb25QYXRoXTtcblx0XHRcdGlmIChzS2V5VmFsdWUpIHtcblx0XHRcdFx0aWYgKHNEZXNjcmlwdGlvbiAmJiBkZXNjcmlwdGlvbiAmJiBzS2V5ICE9PSAoZGVzY3JpcHRpb24gYXMgeyBwYXRoPzogc3RyaW5nIH0pLnBhdGgpIHtcblx0XHRcdFx0XHR0eHQgPSByZXNvdXJjZU1vZGVsLmdldFRleHQoXG5cdFx0XHRcdFx0XHRcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0NPTkZJUk1fREVMRVRFX1dJVEhfT0JKRUNUSU5GT1wiLFxuXHRcdFx0XHRcdFx0W3NLZXlWYWx1ZSwgc0Rlc2NyaXB0aW9uXSxcblx0XHRcdFx0XHRcdGVudGl0eVNldE5hbWVcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHR4dCA9IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0NPTkZJUk1fREVMRVRFX1dJVEhfT0JKRUNUVElUTEVfT05MWVwiLCBbc0tleVZhbHVlXSwgZW50aXR5U2V0TmFtZSk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHR4dCA9IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0NPTkZJUk1fREVMRVRFX1dJVEhfT0JKRUNUVElUTEVfU0lOR1VMQVJcIiwgdW5kZWZpbmVkLCBlbnRpdHlTZXROYW1lKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0dHh0ID0gcmVzb3VyY2VNb2RlbC5nZXRUZXh0KFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfQ09ORklSTV9ERUxFVEVfV0lUSF9PQkpFQ1RUSVRMRV9TSU5HVUxBUlwiLCB1bmRlZmluZWQsIGVudGl0eVNldE5hbWUpO1xuXHRcdH1cblx0XHRvcHRpb25zLnB1c2goe1xuXHRcdFx0dHlwZTogRGVsZXRlT3B0aW9uVHlwZXMuZGVsZXRhYmxlQ29udGV4dHMsXG5cdFx0XHRjb250ZXh0czogZGlyZWN0RGVsZXRhYmxlQ29udGV4dHMsXG5cdFx0XHR0ZXh0OiB0eHQsXG5cdFx0XHRzZWxlY3RlZDogdHJ1ZSxcblx0XHRcdGNvbnRyb2w6IERlbGV0ZURpYWxvZ0NvbnRlbnRDb250cm9sLlRFWFRcblx0XHR9KTtcblx0fSBlbHNlIGlmIChcblx0XHR1blNhdmVkQ29udGV4dHMubGVuZ3RoICE9PSB0b3RhbERlbGV0YWJsZSAmJlxuXHRcdG51bWJlck9mU2VsZWN0ZWRDb250ZXh0cyA+IDAgJiZcblx0XHQoZGlyZWN0RGVsZXRhYmxlQ29udGV4dHMubGVuZ3RoID4gMCB8fCAodW5TYXZlZENvbnRleHRzLmxlbmd0aCA+IDAgJiYgZHJhZnRzV2l0aE5vbkRlbGV0YWJsZUFjdGl2ZS5sZW5ndGggPiAwKSlcblx0KSB7XG5cdFx0aWYgKG51bWJlck9mU2VsZWN0ZWRDb250ZXh0cyA+IGRpcmVjdERlbGV0YWJsZUNvbnRleHRzLmxlbmd0aCAmJiBub25EZWxldGFibGVDb250ZXh0cyArIGxvY2tlZENvbnRleHRzLmxlbmd0aCA+IDApIHtcblx0XHRcdC8vIG90aGVyIHR5cGVzIGV4aXN0cyB3aXRoIHB1cmUgZGVsZXRhYmxlIG9uZXNcblx0XHRcdGxldCBkZWxldGFibGVPcHRpb25UeHQgPSBcIlwiO1xuXHRcdFx0aWYgKHRvdGFsRGVsZXRhYmxlID09PSAxKSB7XG5cdFx0XHRcdGRlbGV0YWJsZU9wdGlvblR4dCA9IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcblx0XHRcdFx0XHRcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0NPTkZJUk1fREVMRVRFX1dJVEhfT0JKRUNUVElUTEVfU0lOR1VMQVJfTk9OX0RFTEVUQUJMRVwiLFxuXHRcdFx0XHRcdHVuZGVmaW5lZCxcblx0XHRcdFx0XHRlbnRpdHlTZXROYW1lXG5cdFx0XHRcdCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRkZWxldGFibGVPcHRpb25UeHQgPSByZXNvdXJjZU1vZGVsLmdldFRleHQoXG5cdFx0XHRcdFx0XCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9DT05GSVJNX0RFTEVURV9XSVRIX09CSkVDVFRJVExFX1BMVVJBTF9OT05fREVMRVRBQkxFXCIsXG5cdFx0XHRcdFx0dW5kZWZpbmVkLFxuXHRcdFx0XHRcdGVudGl0eVNldE5hbWVcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHRcdG9wdGlvbnMudW5zaGlmdCh7XG5cdFx0XHRcdHR5cGU6IERlbGV0ZU9wdGlvblR5cGVzLmRlbGV0YWJsZUNvbnRleHRzLFxuXHRcdFx0XHRjb250ZXh0czogZGlyZWN0RGVsZXRhYmxlQ29udGV4dHMsXG5cdFx0XHRcdHRleHQ6IGRlbGV0YWJsZU9wdGlvblR4dCxcblx0XHRcdFx0c2VsZWN0ZWQ6IHRydWUsXG5cdFx0XHRcdGNvbnRyb2w6IERlbGV0ZURpYWxvZ0NvbnRlbnRDb250cm9sLlRFWFRcblx0XHRcdH0pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBvbmx5IGRlbGV0YWJsZVxuXHRcdFx0Y29uc3QgYWxsRGVsZXRhYmxlVHh0ID1cblx0XHRcdFx0dG90YWxEZWxldGFibGUgPT09IDFcblx0XHRcdFx0XHQ/IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0NPTkZJUk1fREVMRVRFX1dJVEhfT0JKRUNUVElUTEVfU0lOR1VMQVJcIiwgdW5kZWZpbmVkLCBlbnRpdHlTZXROYW1lKVxuXHRcdFx0XHRcdDogcmVzb3VyY2VNb2RlbC5nZXRUZXh0KFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfQ09ORklSTV9ERUxFVEVfV0lUSF9PQkpFQ1RUSVRMRV9QTFVSQUxcIiwgdW5kZWZpbmVkLCBlbnRpdHlTZXROYW1lKTtcblx0XHRcdG9wdGlvbnMucHVzaCh7XG5cdFx0XHRcdHR5cGU6IERlbGV0ZU9wdGlvblR5cGVzLmRlbGV0YWJsZUNvbnRleHRzLFxuXHRcdFx0XHRjb250ZXh0czogZGlyZWN0RGVsZXRhYmxlQ29udGV4dHMsXG5cdFx0XHRcdHRleHQ6IGFsbERlbGV0YWJsZVR4dCxcblx0XHRcdFx0c2VsZWN0ZWQ6IHRydWUsXG5cdFx0XHRcdGNvbnRyb2w6IERlbGV0ZURpYWxvZ0NvbnRlbnRDb250cm9sLlRFWFRcblx0XHRcdH0pO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBvcHRpb25zO1xufVxuXG5hc3luYyBmdW5jdGlvbiBkZWxldGVDb25maXJtSGFuZGxlcihcblx0b3B0aW9uczogRGVsZXRlT3B0aW9uW10sXG5cdG1QYXJhbWV0ZXJzOiBEZWxldGVQYXJhbWV0ZXJzLFxuXHRtZXNzYWdlSGFuZGxlcjogTWVzc2FnZUhhbmRsZXIsXG5cdHJlc291cmNlTW9kZWw6IFJlc291cmNlTW9kZWwsXG5cdGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LFxuXHRkcmFmdEVuYWJsZWQ6IGJvb2xlYW4sXG5cdGluVHJlZVRhYmxlOiBib29sZWFuXG4pOiBQcm9taXNlPHZvaWQ+IHtcblx0dHJ5IHtcblx0XHRjb25zdCBjb250ZXh0cyA9IGRlbGV0ZUhlbHBlci5nZXRDb25maXJtZWREZWxldGFibGVDb250ZXh0KFtdLCBvcHRpb25zKTtcblx0XHRjb25zdCBsYXN0RGVsZXRlZFJvd0luZGV4ID0gY29udGV4dHNbY29udGV4dHMubGVuZ3RoIC0gMV0uZ2V0SW5kZXgoKSA/PyAtMTtcblx0XHRjb25zdCBkcmFmdHNUb0RlbGV0ZUJlZm9yZUFjdGl2ZSA9IGdldERyYWZ0c1RvRGVsZXRlQmVmb3JlQWN0aXZlKG9wdGlvbnMpO1xuXG5cdFx0Y29uc3QgeyBiZWZvcmVEZWxldGVDYWxsQmFjaywgcGFyZW50Q29udHJvbCB9ID0gbVBhcmFtZXRlcnM7XG5cdFx0aWYgKGJlZm9yZURlbGV0ZUNhbGxCYWNrKSB7XG5cdFx0XHRhd2FpdCBiZWZvcmVEZWxldGVDYWxsQmFjayh7IGNvbnRleHRzOiBjb250ZXh0cyB9KTtcblx0XHR9XG5cblx0XHRpZiAoY29udGV4dHMgJiYgY29udGV4dHMubGVuZ3RoKSB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRjb25zdCBlbmFibGVTdHJpY3RIYW5kbGluZyA9IGNvbnRleHRzLmxlbmd0aCA9PT0gMSA/IHRydWUgOiBmYWxzZTtcblx0XHRcdFx0Y29uc3QgZHJhZnRFcnJvcnM6IHVua25vd25bXSA9IFtdO1xuXHRcdFx0XHRhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoXG5cdFx0XHRcdFx0ZHJhZnRzVG9EZWxldGVCZWZvcmVBY3RpdmUubWFwKGFzeW5jIGZ1bmN0aW9uIChjb250ZXh0OiBPRGF0YVY0Q29udGV4dCkge1xuXHRcdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIGF3YWl0IGRyYWZ0LmRlbGV0ZURyYWZ0KGNvbnRleHQsIG1lc3NhZ2VIYW5kbGVyLCBhcHBDb21wb25lbnQsIGVuYWJsZVN0cmljdEhhbmRsaW5nKTtcblx0XHRcdFx0XHRcdH0gY2F0Y2ggKGU6IHVua25vd24pIHtcblx0XHRcdFx0XHRcdFx0TG9nLmVycm9yKGBGRSA6IGNvcmUgOiBEZWxldGVIZWxwZXIgOiBFcnJvciB3aGlsZSBkaXNjYXJkaW5nIGRyYWZ0IHdpdGggcGF0aCA6ICR7Y29udGV4dC5nZXRQYXRoKCl9YCk7XG5cdFx0XHRcdFx0XHRcdGRyYWZ0RXJyb3JzLnB1c2goZSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0KTtcblxuXHRcdFx0XHRsZXQgY29udGV4dHNUb0RlbGV0ZSA9IGNvbnRleHRzO1xuXHRcdFx0XHRpZiAoaW5UcmVlVGFibGUpIHtcblx0XHRcdFx0XHRjb25zdCB0ZW1wQ29udGV4dHM6IChPRGF0YVY0Q29udGV4dCB8IHVuZGVmaW5lZClbXSA9IFsuLi5jb250ZXh0c107XG5cdFx0XHRcdFx0Ly8gRmlsdGVyIG91dCBjb250ZXh0cyB3aG9zZSBhbmNlc3RvciBpcyBhbHNvIGRlbGV0ZWQsIGFzIHRoZXkgd2lsbCBiZSBkZWxldGVkIHdpdGggdGhlaXIgYW5jZXN0b3Jcblx0XHRcdFx0XHR0ZW1wQ29udGV4dHMuZm9yRWFjaCgocGFyZW50Q29udGV4dCwgcGFyZW50SW5kZXgpID0+IHtcblx0XHRcdFx0XHRcdGlmIChwYXJlbnRDb250ZXh0ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRmb3IgKGxldCBjaGlsZEluZGV4ID0gcGFyZW50SW5kZXggKyAxOyBjaGlsZEluZGV4IDwgdGVtcENvbnRleHRzLmxlbmd0aDsgY2hpbGRJbmRleCsrKSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IGNoaWxkQ29udGV4dCA9IHRlbXBDb250ZXh0c1tjaGlsZEluZGV4XTtcblx0XHRcdFx0XHRcdFx0aWYgKGNoaWxkQ29udGV4dCAmJiBwYXJlbnRDb250ZXh0LmlzQW5jZXN0b3JPZihjaGlsZENvbnRleHQpKSB7XG5cdFx0XHRcdFx0XHRcdFx0dGVtcENvbnRleHRzW2NoaWxkSW5kZXhdID0gdW5kZWZpbmVkO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0XHRjb250ZXh0c1RvRGVsZXRlID0gdGVtcENvbnRleHRzLmZpbHRlcigoY29udGV4dCkgPT4gY29udGV4dCAhPT0gdW5kZWZpbmVkKSBhcyBPRGF0YVY0Q29udGV4dFtdO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0YXdhaXQgUHJvbWlzZS5hbGwoXG5cdFx0XHRcdFx0Y29udGV4dHNUb0RlbGV0ZS5tYXAoYXN5bmMgZnVuY3Rpb24gKGNvbnRleHQ6IE9EYXRhVjRDb250ZXh0KSB7XG5cdFx0XHRcdFx0XHQvLyBJZiB0aGUgY29udGV4dCB0byBkZWxldGUgaXMgYSBkcmFmdCAoaS5lLiBhY3V0YWxseSB3ZSBqdXN0IHduYXQgdG8gZGlzY2FyZCksIHdlIHNob3VsZCB1c2UgZHJhZnQuZGVsZXRlRHJhZnQgaW4gb3JkZXIgdG8gdXNlIGEgZGlzY2FyZCBhY3Rpb24gaWYgZGVmaW5lZFxuXHRcdFx0XHRcdFx0Ly8gSG93ZXZlciwgZHJhZnQuZGVsZXRlRHJhZnQgdXNlcyBnZXRQcm9wZXJ0eSwgd2hpY2ggcmV0dXJucyB1bmRlZmluZWQgaWYgdGhlIGNvbnRleHQgaXMgbm90IHJlYWQgZnJvbSB0aGUgYmFja2VuZC5cblx0XHRcdFx0XHRcdC8vIFRoaXMgY2FuIGJlIHRoZSBjYXNlLCBpZiB3ZSBoYXZlIHJldHJpZXZlZCB0aGlzIGNvbnRleHQgdmlhIHRoZSBzaWJsaW5nIChlLmcuIHdoZW4gYSBkcmFmdCBleGlzdGVkIGFuZCB3ZSB3YW50IHRvIGRlbGV0ZSBib3RoIC0gaW4gdGhhdCBjYXNlXG5cdFx0XHRcdFx0XHQvLyB3ZSBoYXZlIGFscmVhZHkgZGlzY2FyZGVkIHRoZSBkcmFmdCBhYm92ZSwgYW5kIG5vdyBuZWVkIHRvIGRlbGV0ZSB0aGUgYWN0aXZlIG9uZSkuIFRvIGlkZW50aWZ5IHRoaXMgc2l0dWF0aW9uLCB3ZSBtdXN0IG5vdCB1c2UgZ2V0UHJvcGVydHlcblx0XHRcdFx0XHRcdC8vIChhcyB0aGUgY29udGV4dCBpcyBub3QgcmVhZCksIGJ1dCBjaGVjayB0aGUgc2FtZSBpbiB0aGUgbVBhcmFtZXRlcnMuXG5cdFx0XHRcdFx0XHQvLyBJbiB0aGlzIGNhc2UsIHdlIGNhbiBqdXN0IGRlbGV0ZSB0aGUgY29udGV4dC4gQnV0IHdlIHNob3VsZCBub3QgdXNlIGNvbnRleHQuZGVsZXRlIChhbHNvIHVwZGF0aW5nIGJpbmRpbmdzLCB3aGljaCBmYWlscyBpbiB0aGUgZGVzY3JpYmVkIHNpdHVhdGlvbiksXG5cdFx0XHRcdFx0XHQvLyBidXQgbW9kZWwuZGVsZXRlIChvbmx5IHNlbmRpbmcgdGhlIGRlbGV0ZSkuIEluIG90aGVyIGNhc2VzIChlLmcuIG5vbi1kcmFmdCksIHRoaXMgaXMgYWxzbyBzdWZmaWNpZW50LCBhcyB3ZSBhbnl3YXkgdGFrZSBjYXJlIG9mIHNldHRpbmdcblx0XHRcdFx0XHRcdC8vIGNvcnJlY3QgYmlkbmluZ3Mgd2l0aCB0aGUgbmF2aWdhdGlvbiB0cmlnZ2VyZWQgYnkgdGhlIGRlbGV0aW9uLlxuXHRcdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0XHQhZHJhZnRFbmFibGVkIHx8XG5cdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmRyYWZ0c1dpdGhEZWxldGFibGVBY3RpdmU/LmZpbmQoXG5cdFx0XHRcdFx0XHRcdFx0KGRyYWZ0V2l0aERlbGV0YWJsZUFjdGl2ZSkgPT4gZHJhZnRXaXRoRGVsZXRhYmxlQWN0aXZlLnNpYmxpbmdJbmZvLnRhcmdldENvbnRleHQgPT09IGNvbnRleHRcblx0XHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdGNvbnRleHQucmVzZXRDaGFuZ2VzKCk7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBjb250ZXh0LmdldE1vZGVsKCkuZGVsZXRlKGNvbnRleHQuZ2V0Q2Fub25pY2FsUGF0aCgpKTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBkcmFmdC5kZWxldGVEcmFmdChjb250ZXh0LCBtZXNzYWdlSGFuZGxlciwgYXBwQ29tcG9uZW50LCBlbmFibGVTdHJpY3RIYW5kbGluZyk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0KTtcblx0XHRcdFx0ZGVsZXRlSGVscGVyLmFmdGVyRGVsZXRlUHJvY2VzcyhtUGFyYW1ldGVycywgb3B0aW9ucywgY29udGV4dHMsIHJlc291cmNlTW9kZWwsIGxhc3REZWxldGVkUm93SW5kZXgpO1xuXHRcdFx0XHRpZiAoZHJhZnRFcnJvcnMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdHRocm93IEVycm9yKGBGRSA6IGNvcmUgOiBEZWxldGVIZWxwZXIgOiBFcnJvcnMgb24gZHJhZnQgZGVsZXRlIDogJHtkcmFmdEVycm9yc31gKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0YXdhaXQgbWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VEaWFsb2coeyBjb250cm9sOiBwYXJlbnRDb250cm9sIH0pO1xuXHRcdFx0XHQvLyByZS10aHJvdyBlcnJvciB0byBlbmZvcmNlIHJlamVjdGluZyB0aGUgZ2VuZXJhbCBwcm9taXNlXG5cdFx0XHRcdHRocm93IGVycm9yO1xuXHRcdFx0fVxuXHRcdH1cblx0fSBjYXRjaCAob0Vycm9yKSB7XG5cdFx0YXdhaXQgbWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VzKCk7XG5cdFx0Ly8gcmUtdGhyb3cgZXJyb3IgdG8gZW5mb3JjZSByZWplY3RpbmcgdGhlIGdlbmVyYWwgcHJvbWlzZVxuXHRcdHRocm93IG9FcnJvcjtcblx0fVxufVxuXG4vKipcbiAqIENvbGxlY3QgY29udGV4dCBpbmZvcm1hdGlvbiAoaXNEcmFmdFJvb3QsIGlzRHJhZnROb2RlLCBIYXNEcmFmdEVudGl0eSwgSXNBY3RpdmVFbnRpdHksIEhhc0FjdGl2ZUVudGl0eSwgaXNMb2NrZWQsIGlzSW5hY3RpdmUpLlxuICpcbiAqIEBwYXJhbSBjb250ZXh0IENvbnRleHQgdG8gZXZhbHVhdGUuXG4gKiBAcmV0dXJucyBUaGUgY29udGV4dCBpbmZvIHByb21pc2UuXG4gKi9cbmZ1bmN0aW9uIGdldENvbnRleHRJbmZvcyhjb250ZXh0OiBPRGF0YVY0Q29udGV4dCk6IENvbnRleHRJbmZvIHtcblx0Y29uc3QgaXNUcmFuc2llbnQgPSAhIWNvbnRleHQ/LmdldE9iamVjdCgpW1wiQCR1aTUuY29udGV4dC5pc1RyYW5zaWVudFwiXTtcblx0Y29uc3QgaXNJbmFjdGl2ZSA9IGNvbnRleHQ/LmlzSW5hY3RpdmUoKTtcblx0Y29uc3QgbWV0YUNvbnRleHQgPVxuXHRcdGlzSW5hY3RpdmUgfHwgKCFpc0luYWN0aXZlICYmIGlzVHJhbnNpZW50KVxuXHRcdFx0PyB1bmRlZmluZWRcblx0XHRcdDogY29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpLmdldE1ldGFDb250ZXh0KGNvbnRleHQuZ2V0Q2Fub25pY2FsUGF0aCgpKTtcblx0Y29uc3QgZGVsZXRhYmxlUGF0aCA9IG1ldGFDb250ZXh0Py5nZXRQcm9wZXJ0eShcIkBPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLkRlbGV0ZVJlc3RyaWN0aW9ucy9EZWxldGFibGUvJFBhdGhcIik7XG5cdGNvbnN0IHN0YXRpY0RlbGV0YWJsZSA9ICFkZWxldGFibGVQYXRoICYmIG1ldGFDb250ZXh0Py5nZXRQcm9wZXJ0eShcIkBPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLkRlbGV0ZVJlc3RyaWN0aW9ucy9EZWxldGFibGVcIikgIT09IGZhbHNlO1xuXHRjb25zdCBkZWxldGFibGUgPSBkZWxldGFibGVQYXRoID8gY29udGV4dC5nZXRQcm9wZXJ0eShkZWxldGFibGVQYXRoKSA6IHN0YXRpY0RlbGV0YWJsZTtcblxuXHRjb25zdCBpbmZvOiBDb250ZXh0SW5mbyA9IHtcblx0XHRjb250ZXh0OiBjb250ZXh0LFxuXHRcdGlzRHJhZnRSb290OiAhIW1ldGFDb250ZXh0Py5nZXRQcm9wZXJ0eShcIkBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnRSb290XCIpLFxuXHRcdGlzRHJhZnROb2RlOiAhIW1ldGFDb250ZXh0Py5nZXRQcm9wZXJ0eShcIkBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnROb2RlXCIpLFxuXHRcdGlzQWN0aXZlOiB0cnVlLFxuXHRcdGhhc0FjdGl2ZTogZmFsc2UsXG5cdFx0aGFzRHJhZnQ6IGZhbHNlLFxuXHRcdGxvY2tlZDogZmFsc2UsXG5cdFx0Ly8gZm9yIGFuIGVtcHR5Um93IChpbmFjdGl2ZSBjb250ZXh0KSBpdCdzIGFsd2F5cyBkZWxldGFibGUgYXMgbG9uZyBhcyB0aGUgY29udGV4dCBrZXB0IGluYWN0aXZlLi5cblx0XHRkZWxldGFibGU6IGRlbGV0YWJsZSxcblx0XHRzaWJsaW5nUHJvbWlzZTogUHJvbWlzZS5yZXNvbHZlKHVuZGVmaW5lZCksXG5cdFx0c2libGluZ0luZm86IHVuZGVmaW5lZCxcblx0XHRzaWJsaW5nRGVsZXRhYmxlOiBmYWxzZSxcblx0XHRpc0luYWN0aXZlQ29udGV4dDogISFjb250ZXh0LmlzSW5hY3RpdmUoKVxuXHR9O1xuXHRpZiAoIWNvbnRleHQuaXNJbmFjdGl2ZSgpICYmIGluZm8uaXNEcmFmdFJvb3QpIHtcblx0XHRpbmZvLmxvY2tlZCA9ICEhY29udGV4dC5nZXRPYmplY3QoXCJEcmFmdEFkbWluaXN0cmF0aXZlRGF0YVwiKT8uSW5Qcm9jZXNzQnlVc2VyO1xuXHRcdGluZm8uaGFzRHJhZnQgPSBjb250ZXh0LmdldFByb3BlcnR5KFwiSGFzRHJhZnRFbnRpdHlcIik7XG5cdFx0aW5mby5pc0FjdGl2ZSA9IGNvbnRleHQuZ2V0UHJvcGVydHkoXCJJc0FjdGl2ZUVudGl0eVwiKTtcblx0XHRpbmZvLmhhc0FjdGl2ZSA9IGNvbnRleHQuZ2V0UHJvcGVydHkoXCJIYXNBY3RpdmVFbnRpdHlcIik7XG5cdFx0aWYgKCFpbmZvLmlzQWN0aXZlICYmIGluZm8uaGFzQWN0aXZlKSB7XG5cdFx0XHQvLyBnZXQgc2libGluZyBjb250ZXh0cyAob25seSByZWxldmFudCBmb3IgZHJhZnQgcm9vdCwgbm90IGZvciBub2Rlcylcblx0XHRcdC8vIGRyYWZ0LmNvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24gZXhwZWN0cyBkcmFmdCByb290IGFzIGZpcnN0IHBhcmFtZXRlciAtIGlmIHdlIGFyZSBvbiBhIHN1Ym5vZGUsIHRoaXMgaXMgbm90IGdpdmVuXG5cdFx0XHQvLyAtIGRvbmUgd3JvbmcgYWxzbyBhYm92ZSwgYnV0IHNlZW1zIG5vdCB0byBicmVhayBhbnl0aGluZ1xuXHRcdFx0Ly8gLSB3aHkgaXMgZHJhZnQuY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbiBub3QgYWJsZSB0byBjYWxjdWxhdGUgZHJhZnQgcm9vdCBvbiBpdHMgb3duPyFcblx0XHRcdC8vIC0gYW5kIHdoeSBpcyBpdCBub3QgYWJsZSB0byBkZWFsIHdpdGggY29udGV4dHMgbm90IGRyYWZ0IGVuYWJsZWQgKG9mIGNvdXJzZSB0aGV5IG5ldmVyIGhhdmUgYSBzaWJsaW5nIC0gY291bGQganVzdCByZXR1cm4gdW5kZWZpbmVkKVxuXHRcdFx0aW5mby5zaWJsaW5nUHJvbWlzZSA9IGRyYWZ0LmNvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24oY29udGV4dCwgY29udGV4dCkudGhlbihhc3luYyAoc2libGluZ0luZm9ybWF0aW9uKSA9PiB7XG5cdFx0XHRcdC8vIEZvciBkcmFmdFdpdGhEZWxldGFibGVBY3RpdmUgYnVja2V0LCBjdXJyZW50bHkgYWxzbyBzaWJsaW5nSW5mb3JtYXRpb24gaXMgcHV0IGludG8gaW50ZXJuYWxNb2RlbCBhbmQgdXNlZFxuXHRcdFx0XHQvLyBmcm9tIHRoZXJlIGluIGNhc2Ugb2YgZGVsZXRpb24uIFRoZXJlZm9yZSwgc2libGluZyBuZWVkcyB0byBiZSByZXRyaWV2ZWQgaW4gY2FzZSBvZiBzdGF0aWNEZWxldGFibGUuXG5cdFx0XHRcdC8vIFBvc3NpYmxlIGltcHJvdmVtZW50OiBPbmx5IHJlYWQgc2libGluZ0luZm8gaGVyZSBpZiBuZWVkZWQgZm9yIGRldGVybWluYXRpb24gb2YgZGVsZXRlIGJ1dHRvbiBlbmFibGVtZW50LFxuXHRcdFx0XHQvLyBpbiBvdGhlciBjYXNlcywgcmVhZCBpdCBvbmx5IGlmIGRlbGV0aW9uIHJlYWxseSBoYXBwZW5zLlxuXHRcdFx0XHRpbmZvLnNpYmxpbmdJbmZvID0gc2libGluZ0luZm9ybWF0aW9uO1xuXHRcdFx0XHRpZiAoZGVsZXRhYmxlUGF0aCkge1xuXHRcdFx0XHRcdGluZm8uc2libGluZ0RlbGV0YWJsZSA9IGF3YWl0IHNpYmxpbmdJbmZvcm1hdGlvbj8udGFyZ2V0Q29udGV4dD8ucmVxdWVzdFByb3BlcnR5KGRlbGV0YWJsZVBhdGgpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGluZm8uc2libGluZ0RlbGV0YWJsZSA9IHN0YXRpY0RlbGV0YWJsZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBpbmZvO1xufVxuXG4vLyBUYWJsZSBSdW50aW1lIEhlbHBlcnM6XG5cbi8qIHJlZnJlc2hlcyBkYXRhIGluIGludGVybmFsIG1vZGVsIHJlbGV2YW50IGZvciBlbmFibGVtZW50IG9mIGRlbGV0ZSBidXR0b24gYWNjb3JkaW5nIHRvIHNlbGVjdGVkIGNvbnRleHRzXG5yZWxldmFudCBkYXRhIGFyZTogZGVsZXRhYmxlQ29udGV4dHMsIGRyYWZ0c1dpdGhEZWxldGFibGVBY3RpdmUsIGRyYWZ0c1dpdGhOb25EZWxldGFibGVBY3RpdmUsIHVuU2F2ZWRDb250ZXh0cywgZGVsZXRlRW5hYmxlZFxubm90IHJlbGV2YW50OiBsb2NrZWRDb250ZXh0c1xuKi9cbmFzeW5jIGZ1bmN0aW9uIHVwZGF0ZURlbGV0ZUluZm9Gb3JTZWxlY3RlZENvbnRleHRzKFxuXHRpbnRlcm5hbE1vZGVsQ29udGV4dDogSW50ZXJuYWxNb2RlbENvbnRleHQsXG5cdHNlbGVjdGVkQ29udGV4dHM6IE9EYXRhVjRDb250ZXh0W10sXG5cdGZvckNvbnRleHRNZW51ID0gZmFsc2Vcbik6IFByb21pc2U8dm9pZD4ge1xuXHRjb25zdCBjb250ZXh0SW5mb3MgPSBzZWxlY3RlZENvbnRleHRzLm1hcChnZXRDb250ZXh0SW5mb3MpO1xuXG5cdC8vIHdhaXQgZm9yIGFsbCBzaWJsaW5nUHJvbWlzZXMuIElmIG5vIHNpYmxpbmcgZXhpc3RzLCBwcm9taXNlIGlzIHJlc29sdmVkIHRvIHVuZGVmaW5lZCAoYnV0IGl0J3Mgc3RpbGwgYSBwcm9taXNlKVxuXHRhd2FpdCBQcm9taXNlLmFsbChjb250ZXh0SW5mb3MubWFwKGFzeW5jIChpbmZvKSA9PiBpbmZvLnNpYmxpbmdQcm9taXNlKSk7XG5cblx0Y29uc3QgYnVja2V0cyA9IFtcblx0XHR7XG5cdFx0XHRrZXk6IFwiZHJhZnRzV2l0aERlbGV0YWJsZUFjdGl2ZVwiLFxuXHRcdFx0Ly8gb25seSBmb3IgZHJhZnQgcm9vdDogSW4gdGhhdCBjYXNlLCB0aGUgZGVsZXRlIHJlcXVlc3QgbmVlZHMgdG8gYmUgc2VudCBmb3IgdGhlIGFjdGl2ZSAoaS5lLiB0aGUgc2libGluZyksXG5cdFx0XHQvLyB3aGlsZSBpbiBkcmFmdCBub2RlLCB0aGUgZGVsZXRlIHJlcXVlc3QgbmVlZHMgdG8gYmUgc2VuZCBmb3IgdGhlIGRyYWZ0IGl0c2VsZlxuXHRcdFx0dmFsdWU6IGNvbnRleHRJbmZvcy5maWx0ZXIoXG5cdFx0XHRcdChpbmZvKSA9PiAhaW5mby5pc0luYWN0aXZlQ29udGV4dCAmJiBpbmZvLmlzRHJhZnRSb290ICYmICFpbmZvLmlzQWN0aXZlICYmIGluZm8uaGFzQWN0aXZlICYmIGluZm8uc2libGluZ0RlbGV0YWJsZVxuXHRcdFx0KVxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0a2V5OiBcImRyYWZ0c1dpdGhOb25EZWxldGFibGVBY3RpdmVcIixcblx0XHRcdC8vIG9ubHkgZm9yIGRyYWZ0IHJvb3Q6IEZvciBkcmFmdCBub2RlLCB3ZSBvbmx5IHJlbHkgb24gaW5mb3JtYXRpb24gaW4gdGhlIGRyYWZ0IGl0c2VsZiAobm90IGl0cyBhY3RpdmUgc2libGluZylcblx0XHRcdC8vIGFwcGxpY2F0aW9uIGhhcyB0byB0YWtlIGNhcmUgdG8gc2V0IHRoaXMgY29ycmVjdGx5IChpbiBjYXNlIGFjdGl2ZSBzaWJsaW5nIG11c3Qgbm90IGJlIGRlbGV0YWJsZSwgYWN0aXZhdGlvblxuXHRcdFx0Ly8gb2YgZHJhZnQgd2l0aCBkZWxldGVkIG5vZGUgd291bGQgYWxzbyBkZWx0ZSBhY3RpdmUgc2libGluZyA9PiBkZWxldGlvbiBvZiBkcmFmdCBub2RlIHRvIGJlIGF2b2lkZWQpXG5cdFx0XHR2YWx1ZTogY29udGV4dEluZm9zLmZpbHRlcihcblx0XHRcdFx0KGluZm8pID0+ICFpbmZvLmlzSW5hY3RpdmVDb250ZXh0ICYmIGluZm8uaXNEcmFmdFJvb3QgJiYgIWluZm8uaXNBY3RpdmUgJiYgaW5mby5oYXNBY3RpdmUgJiYgIWluZm8uc2libGluZ0RlbGV0YWJsZVxuXHRcdFx0KVxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0a2V5OiBcImxvY2tlZENvbnRleHRzXCIsXG5cdFx0XHR2YWx1ZTogY29udGV4dEluZm9zLmZpbHRlcihcblx0XHRcdFx0KGluZm8pID0+ICFpbmZvLmlzSW5hY3RpdmVDb250ZXh0ICYmIGluZm8uaXNEcmFmdFJvb3QgJiYgaW5mby5pc0FjdGl2ZSAmJiBpbmZvLmhhc0RyYWZ0ICYmIGluZm8ubG9ja2VkXG5cdFx0XHQpXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRrZXk6IFwidW5TYXZlZENvbnRleHRzXCIsXG5cdFx0XHR2YWx1ZTogY29udGV4dEluZm9zLmZpbHRlcihcblx0XHRcdFx0KGluZm8pID0+ICFpbmZvLmlzSW5hY3RpdmVDb250ZXh0ICYmIGluZm8uaXNEcmFmdFJvb3QgJiYgaW5mby5pc0FjdGl2ZSAmJiBpbmZvLmhhc0RyYWZ0ICYmICFpbmZvLmxvY2tlZFxuXHRcdFx0KVxuXHRcdH0sXG5cdFx0Ly8gbm9uLWRyYWZ0L3N0aWNreSBhbmQgZGVsZXRhYmxlXG5cdFx0Ly8gYWN0aXZlIGRyYWZ0IHJvb3Qgd2l0aG91dCBhbnkgZHJhZnQgYW5kIGRlbGV0YWJsZVxuXHRcdC8vIGNyZWF0ZWQgZHJhZnQgcm9vdCAocmVnYXJkbGVzcyBvZiBkZWxldGFibGUpXG5cdFx0Ly8gZHJhZnQgbm9kZSBvbmx5IGFjY29yZGluZyB0byBpdHMgYW5ub3RhdGlvblxuXHRcdHtcblx0XHRcdGtleTogXCJkZWxldGFibGVDb250ZXh0c1wiLFxuXHRcdFx0dmFsdWU6IGNvbnRleHRJbmZvcy5maWx0ZXIoXG5cdFx0XHRcdChpbmZvKSA9PlxuXHRcdFx0XHRcdGluZm8uaXNJbmFjdGl2ZUNvbnRleHQgfHxcblx0XHRcdFx0XHQoIWluZm8uaXNEcmFmdFJvb3QgJiYgIWluZm8uaXNEcmFmdE5vZGUgJiYgaW5mby5kZWxldGFibGUpIHx8XG5cdFx0XHRcdFx0KGluZm8uaXNEcmFmdFJvb3QgJiYgaW5mby5pc0FjdGl2ZSAmJiAhaW5mby5oYXNEcmFmdCAmJiBpbmZvLmRlbGV0YWJsZSkgfHxcblx0XHRcdFx0XHQoaW5mby5pc0RyYWZ0Um9vdCAmJiAhaW5mby5pc0FjdGl2ZSAmJiAhaW5mby5oYXNBY3RpdmUpIHx8XG5cdFx0XHRcdFx0KGluZm8uaXNEcmFmdE5vZGUgJiYgaW5mby5kZWxldGFibGUpXG5cdFx0XHQpXG5cdFx0fVxuXHRdO1xuXHRjb25zdCBjb250ZXh0UGF0aCA9ICFmb3JDb250ZXh0TWVudSA/IFwiXCIgOiBcImNvbnRleHRtZW51L1wiO1xuXHRmb3IgKGNvbnN0IHsga2V5LCB2YWx1ZSB9IG9mIGJ1Y2tldHMpIHtcblx0XHRpbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcblx0XHRcdGNvbnRleHRQYXRoICsga2V5LFxuXHRcdFx0Ly8gQ3VycmVudGx5LCBidWNrZXQgZHJhZnRzV2l0aERlbGV0YWJsZUFjdGl2ZSBoYXMgYSBkaWZmZXJlbnQgc3RydWN0dXJlIChjb250YWluaW5nIGFsc28gc2libGluZyBpbmZvcm1hdGlvbiwgd2hpY2ggaXMgdXNlZFxuXHRcdFx0Ly8gaW4gY2FzZSBvZiBkZWxldGlvbikuIFBvc3NpYmxlIGltcHJvdmVtZW50OiBSZWFkIHNpYmxpbmcgaW5mb3JtYXRpb24gb25seSB3aGVuIG5lZWRlZCwgYW5kIGJ1aWxkIGFsbCBidWNrZXRzIHdpdGggc2FtZVxuXHRcdFx0Ly8gc3RydWN0dXJlLiBIb3dldmVyLCBpbiB0aGF0IGNhc2Ugc2libGluZ0luZm9ybWF0aW9uIG1pZ2h0IG5lZWQgdG8gYmUgcmVhZCB0d2ljZSAoaWYgYWxyZWFkeSBuZWVkZWQgZm9yIGJ1dHRvbiBlbmFibGVtZW50KSxcblx0XHRcdC8vIHRodXMgYSBidWZmZXIgcHJvYmFibHkgd291bGQgbWFrZSBzZW5zZS5cblx0XHRcdHZhbHVlLm1hcCgoaW5mbykgPT5cblx0XHRcdFx0a2V5ID09PSBcImRyYWZ0c1dpdGhEZWxldGFibGVBY3RpdmVcIiA/IHsgZHJhZnQ6IGluZm8uY29udGV4dCwgc2libGluZ0luZm86IGluZm8uc2libGluZ0luZm8gfSA6IGluZm8uY29udGV4dFxuXHRcdFx0KVxuXHRcdCk7XG5cdH1cbn1cblxuY29uc3QgZGVsZXRlSGVscGVyID0ge1xuXHRnZXROb25EZWxldGFibGVUZXh0LFxuXHRkZWxldGVDb25maXJtSGFuZGxlcixcblx0Z2V0T3B0aW9uc0ZvckRlbGV0YWJsZVRleHRzLFxuXHR1cGRhdGVDb250ZW50Rm9yRGVsZXRlRGlhbG9nLFxuXHR1cGRhdGVEcmFmdE9wdGlvbnNGb3JEZWxldGFibGVUZXh0cyxcblx0Z2V0Q29uZmlybWVkRGVsZXRhYmxlQ29udGV4dCxcblx0Z2V0TG9ja2VkT2JqZWN0c1RleHQsXG5cdGdldFVuc2F2ZWRDb250ZXh0c1RleHQsXG5cdGdldE5vbkRlbGV0YWJsZUFjdGl2ZXNPZkRyYWZ0c1RleHQsXG5cdGFmdGVyRGVsZXRlUHJvY2Vzcyxcblx0dXBkYXRlRGVsZXRlSW5mb0ZvclNlbGVjdGVkQ29udGV4dHMsXG5cdERlbGV0ZU9wdGlvblR5cGVzLFxuXHREZWxldGVEaWFsb2dDb250ZW50Q29udHJvbCxcblx0c2V0Rm9jdXNBZnRlckRlbGV0ZSxcblx0Z2V0Q29udGV4dEluZm9zXG59O1xuXG5leHBvcnQgZGVmYXVsdCBkZWxldGVIZWxwZXI7XG4iXSwibWFwcGluZ3MiOiI7QUFBQTtBQUFBO0FBQUE7Ozs7TUFrQktBLGlCQUFpQjtFQUFBLFdBQWpCQSxpQkFBaUI7SUFBakJBLGlCQUFpQjtJQUFqQkEsaUJBQWlCO0lBQWpCQSxpQkFBaUI7SUFBakJBLGlCQUFpQjtJQUFqQkEsaUJBQWlCO0VBQUEsR0FBakJBLGlCQUFpQixLQUFqQkEsaUJBQWlCO0VBQUEsSUFRakJDLDBCQUEwQjtFQUFBLFdBQTFCQSwwQkFBMEI7SUFBMUJBLDBCQUEwQjtJQUExQkEsMEJBQTBCO0VBQUEsR0FBMUJBLDBCQUEwQixLQUExQkEsMEJBQTBCO0VBOEQvQixTQUFTQyxvQkFBb0IsQ0FDNUJDLG9CQUEwQyxFQUMxQ0MsSUFBdUIsRUFDdkJDLGdCQUFrQyxFQUNsQ0MsZ0JBQWtDLEVBQ2Y7SUFDbkIsTUFBTUMsbUJBQXFDLEdBQUcsQ0FBQyxHQUFHRixnQkFBZ0IsQ0FBQztJQUNuRUMsZ0JBQWdCLENBQUNFLE9BQU8sQ0FBRUMsT0FBdUIsSUFBSztNQUNyRCxNQUFNQyxHQUFHLEdBQUdILG1CQUFtQixDQUFDSSxPQUFPLENBQUNGLE9BQU8sQ0FB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
687
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJEZWxldGVPcHRpb25UeXBlcyIsIkRlbGV0ZURpYWxvZ0NvbnRlbnRDb250cm9sIiwiZ2V0VXBkYXRlZFNlbGVjdGlvbnMiLCJpbnRlcm5hbE1vZGVsQ29udGV4dCIsInR5cGUiLCJzZWxlY3RlZENvbnRleHRzIiwiY29udGV4dHNUb1JlbW92ZSIsInJldFNlbGVjdGVkQ29udGV4dHMiLCJmb3JFYWNoIiwiY29udGV4dCIsImlkeCIsImluZGV4T2YiLCJzcGxpY2UiLCJzZXRQcm9wZXJ0eSIsImNsZWFyU2VsZWN0ZWRDb250ZXh0c0Zvck9wdGlvbiIsIm9wdGlvbiIsImdldFByb3BlcnR5IiwiZGVsZXRhYmxlQ29udGV4dHMiLCJkcmFmdFNpYmxpbmdQYWlycyIsImRyYWZ0c1dpdGhEZWxldGFibGVBY3RpdmUiLCJkcmFmdHMiLCJtYXAiLCJjb250ZXh0UGFpciIsImRyYWZ0IiwibGVuZ3RoIiwiYWZ0ZXJEZWxldGVQcm9jZXNzIiwicGFyYW1ldGVycyIsIm9wdGlvbnMiLCJjb250ZXh0cyIsInJlc291cmNlTW9kZWwiLCJsYXN0RGVsZXRlZFJvd0luZGV4IiwiZW50aXR5U2V0TmFtZSIsInVuZGVmaW5lZCIsInNlbGVjdGVkIiwic29tZSIsIk1lc3NhZ2VUb2FzdCIsInNob3ciLCJnZXRUZXh0IiwicGFyZW50Q29udHJvbCIsImdldE1ldGFkYXRhIiwiZ2V0TmFtZSIsImRlbGV0ZUhlbHBlciIsInNldEZvY3VzQWZ0ZXJEZWxldGUiLCJ0YWJsZSIsImRlbGV0ZWRSb3dzQ291bnQiLCJfdGFibGUkZ2V0Um93QmluZGluZyIsIl90YWJsZSRnZXRSb3dCaW5kaW5nJCIsInRhYmxlUm93c0NvdW50IiwiZ2V0Um93QmluZGluZyIsImNhbGwiLCJnZXRDb3VudCIsIm9yaWdpbmFsVGFibGVSb3dzQ291bnQiLCJuZXh0Rm9jdXNSb3dJbmRleCIsImZvY3VzUm93IiwiZm9jdXMiLCJnZXRMb2NrZWRDb250ZXh0VXNlciIsImxvY2tlZENvbnRleHQiLCJkcmFmdEFkbWluRGF0YSIsImdldE9iamVjdCIsImdldExvY2tlZE9iamVjdHNUZXh0IiwibnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzIiwibG9ja2VkQ29udGV4dHMiLCJyZXRUeHQiLCJsb2NrZWRVc2VyIiwiZ2V0Tm9uRGVsZXRhYmxlQWN0aXZlc09mRHJhZnRzVGV4dCIsIm51bWJlck9mRHJhZnRzIiwidG90YWxEZWxldGFibGUiLCJnZXRVblNhdmVkQ29udGV4dFVzZXIiLCJ1blNhdmVkQ29udGV4dCIsInNMYXN0Q2hhbmdlZEJ5VXNlciIsImdldFVuc2F2ZWRDb250ZXh0c1RleHQiLCJ1blNhdmVkQ29udGV4dHMiLCJpbmZvVHh0Iiwib3B0aW9uVHh0Iiwib3B0aW9uV2l0aG91dFR4dCIsImxhc3RDaGFuZ2VkQnlVc2VyIiwiZ2V0Tm9uRGVsZXRhYmxlVGV4dCIsIm1QYXJhbWV0ZXJzIiwidG90YWxOdW1EZWxldGFibGVDb250ZXh0cyIsImRyYWZ0c1dpdGhOb25EZWxldGFibGVBY3RpdmUiLCJub25EZWxldGFibGVDb250ZXh0cyIsIlRleHQiLCJ0ZXh0IiwiZ2V0Q29uZmlybWVkRGVsZXRhYmxlQ29udGV4dCIsInJlZHVjZSIsInJlc3VsdCIsImRyYWZ0c1RvRGVsZXRlQmVmb3JlQWN0aXZlIiwiY29uY2F0IiwiZ2V0RHJhZnRzVG9EZWxldGVCZWZvcmVBY3RpdmUiLCJ1cGRhdGVEcmFmdE9wdGlvbnNGb3JEZWxldGFibGVUZXh0cyIsInZDb250ZXh0cyIsIml0ZW1zIiwibG9ja2VkQ29udGV4dHNUeHQiLCJkZWxldGFibGVEcmFmdEluZm8iLCJwdXNoIiwic2libGluZ0luZm8iLCJ0YXJnZXRDb250ZXh0Iiwibm9uRGVsZXRhYmxlRXhpc3RzIiwibm9uRGVsZXRhYmxlVGV4dEN0cmwiLCJ1bnNhdmVkQ2hhbmdlc1R4dHMiLCJjb250cm9sIiwiQ0hFQ0tCT1giLCJub25EZWxldGFibGVBY3RpdmVzT2ZEcmFmdHNUZXh0IiwiVEVYVCIsInVwZGF0ZUNvbnRlbnRGb3JEZWxldGVEaWFsb2ciLCJzZXRUZXh0IiwiQ2hlY2tCb3giLCJzZWxlY3QiLCJvRXZlbnQiLCJjaGVja0JveCIsImdldFNvdXJjZSIsImdldFNlbGVjdGVkIiwiX2dldE9yaWdpbmFsU2VsZWN0ZWRSZWNvcmQiLCJjb250ZXh0VG9EZWxldGUiLCJyZXQiLCJmaW5kIiwiZHJhZnRTaWJsaW5nUGFpciIsImdldE9wdGlvbnNGb3JEZWxldGFibGVUZXh0cyIsImRpcmVjdERlbGV0YWJsZUNvbnRleHRzIiwiZGVzY3JpcHRpb24iLCJvVGFibGUiLCJzS2V5IiwiZ2V0UGFyZW50IiwiZ2V0SWRlbnRpZmllckNvbHVtbiIsInR4dCIsImRlc2NyaXB0aW9uUGF0aCIsInBhdGgiLCJzaW5nbGVDb250ZXh0Iiwib0xpbmVDb250ZXh0RGF0YSIsIk9iamVjdCIsImtleXMiLCJzS2V5VmFsdWUiLCJzRGVzY3JpcHRpb24iLCJkZWxldGFibGVPcHRpb25UeHQiLCJ1bnNoaWZ0IiwiYWxsRGVsZXRhYmxlVHh0IiwiZGVsZXRlRHJhZnRzQmVmb3JlQWN0aXZlc0FuZEdldEVycm9ycyIsIm1lc3NhZ2VIYW5kbGVyIiwiYXBwQ29tcG9uZW50IiwiZW5hYmxlU3RyaWN0SGFuZGxpbmciLCJkcmFmdEVycm9ycyIsIlByb21pc2UiLCJhbGxTZXR0bGVkIiwiZGVsZXRlRHJhZnQiLCJlIiwiTG9nIiwiZXJyb3IiLCJnZXRQYXRoIiwiaGFuZGxlVHJlZVRhYmxlQ29udGV4dHMiLCJpblRyZWVUYWJsZSIsImNvbnRleHRzVG9EZWxldGUiLCJ0ZW1wQ29udGV4dHMiLCJwYXJlbnRDb250ZXh0IiwicGFyZW50SW5kZXgiLCJjaGlsZEluZGV4IiwiY2hpbGRDb250ZXh0IiwiaXNBbmNlc3Rvck9mIiwiZmlsdGVyIiwiZGVsZXRlQ29uZmlybUhhbmRsZXIiLCJkcmFmdEVuYWJsZWQiLCJnZXRJbmRleCIsImJlZm9yZURlbGV0ZUNhbGxCYWNrIiwiYWxsIiwiX21QYXJhbWV0ZXJzJGRyYWZ0c1dpIiwiZHJhZnRXaXRoRGVsZXRhYmxlQWN0aXZlIiwicmVzZXRDaGFuZ2VzIiwiZ2V0TW9kZWwiLCJkZWxldGUiLCJnZXRDYW5vbmljYWxQYXRoIiwiRXJyb3IiLCJhZGRHZW5lcmljRGVsZXRlRmFpbHVyZU1lc3NhZ2UiLCJzaG93TWVzc2FnZURpYWxvZyIsIm9FcnJvciIsInNob3dNZXNzYWdlcyIsIk1lc3NhZ2luZyIsImFkZE1lc3NhZ2VzIiwiTWVzc2FnZSIsIm1lc3NhZ2UiLCJNZXNzYWdlVHlwZSIsInRhcmdldCIsInBlcnNpc3RlbnQiLCJjb2RlIiwidGVjaG5pY2FsRGV0YWlscyIsImZlIiwiY2hhbmdlU2V0UHJlVGV4dEZvclNpbmdsZUVycm9yIiwiZ2V0Q29udGV4dEluZm9zIiwiaXNUcmFuc2llbnQiLCJpc0luYWN0aXZlIiwibWV0YUNvbnRleHQiLCJnZXRNZXRhTW9kZWwiLCJnZXRNZXRhQ29udGV4dCIsImRlbGV0YWJsZVBhdGgiLCJzdGF0aWNEZWxldGFibGUiLCJkZWxldGFibGUiLCJpbmZvIiwiaXNEcmFmdFJvb3QiLCJpc0RyYWZ0Tm9kZSIsImlzQWN0aXZlIiwiaGFzQWN0aXZlIiwiaGFzRHJhZnQiLCJsb2NrZWQiLCJzaWJsaW5nUHJvbWlzZSIsInJlc29sdmUiLCJzaWJsaW5nRGVsZXRhYmxlIiwiaXNJbmFjdGl2ZUNvbnRleHQiLCJfY29udGV4dCRnZXRPYmplY3QiLCJJblByb2Nlc3NCeVVzZXIiLCJjb21wdXRlU2libGluZ0luZm9ybWF0aW9uIiwidGhlbiIsInNpYmxpbmdJbmZvcm1hdGlvbiIsIl9zaWJsaW5nSW5mb3JtYXRpb24kdCIsInJlcXVlc3RQcm9wZXJ0eSIsInVwZGF0ZURlbGV0ZUluZm9Gb3JTZWxlY3RlZENvbnRleHRzIiwiZm9yQ29udGV4dE1lbnUiLCJhcmd1bWVudHMiLCJjb250ZXh0SW5mb3MiLCJidWNrZXRzIiwia2V5IiwidmFsdWUiLCJjb250ZXh0UGF0aCJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiRGVsZXRlSGVscGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IHR5cGUgQXBwQ29tcG9uZW50IGZyb20gXCJzYXAvZmUvY29yZS9BcHBDb21wb25lbnRcIjtcbmltcG9ydCB0eXBlIHsgU2libGluZ0luZm9ybWF0aW9uIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2VkaXRGbG93L2RyYWZ0XCI7XG5pbXBvcnQgZHJhZnQgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2VkaXRGbG93L2RyYWZ0XCI7XG5pbXBvcnQgdHlwZSBNZXNzYWdlSGFuZGxlciBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvTWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCB0eXBlIHsgQ2hlY2tCb3gkU2VsZWN0RXZlbnQgfSBmcm9tIFwic2FwL20vQ2hlY2tCb3hcIjtcbmltcG9ydCBDaGVja0JveCBmcm9tIFwic2FwL20vQ2hlY2tCb3hcIjtcbmltcG9ydCBNZXNzYWdlVG9hc3QgZnJvbSBcInNhcC9tL01lc3NhZ2VUb2FzdFwiO1xuaW1wb3J0IFRleHQgZnJvbSBcInNhcC9tL1RleHRcIjtcblxuaW1wb3J0IHR5cGUgUmVzb3VyY2VNb2RlbCBmcm9tIFwic2FwL2ZlL2NvcmUvUmVzb3VyY2VNb2RlbFwiO1xuaW1wb3J0IHR5cGUgVGFibGVBUEkgZnJvbSBcInNhcC9mZS9tYWNyb3MvdGFibGUvVGFibGVBUElcIjtcbmltcG9ydCB0eXBlIENvbnRyb2wgZnJvbSBcInNhcC91aS9jb3JlL0NvbnRyb2xcIjtcbmltcG9ydCBNZXNzYWdlIGZyb20gXCJzYXAvdWkvY29yZS9tZXNzYWdlL01lc3NhZ2VcIjtcbmltcG9ydCBNZXNzYWdlVHlwZSBmcm9tIFwic2FwL3VpL2NvcmUvbWVzc2FnZS9NZXNzYWdlVHlwZVwiO1xuaW1wb3J0IE1lc3NhZ2luZyBmcm9tIFwic2FwL3VpL2NvcmUvTWVzc2FnaW5nXCI7XG5pbXBvcnQgdHlwZSBUYWJsZSBmcm9tIFwic2FwL3VpL21kYy9UYWJsZVwiO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL0NvbnRleHRcIjtcbmltcG9ydCB0eXBlIE9EYXRhVjRDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQ29udGV4dFwiO1xuaW1wb3J0IHR5cGUgeyBJbnRlcm5hbE1vZGVsQ29udGV4dCB9IGZyb20gXCIuL01vZGVsSGVscGVyXCI7XG5cbmVudW0gRGVsZXRlT3B0aW9uVHlwZXMge1xuXHRkZWxldGFibGVDb250ZXh0cyA9IFwiZGVsZXRhYmxlQ29udGV4dHNcIixcblx0ZHJhZnRzV2l0aERlbGV0YWJsZUFjdGl2ZSA9IFwiZHJhZnRzV2l0aERlbGV0YWJsZUFjdGl2ZVwiLFxuXHR1blNhdmVkQ29udGV4dHMgPSBcInVuU2F2ZWRDb250ZXh0c1wiLFxuXHRkcmFmdHNXaXRoTm9uRGVsZXRhYmxlQWN0aXZlID0gXCJkcmFmdHNXaXRoTm9uRGVsZXRhYmxlQWN0aXZlXCIsXG5cdGRyYWZ0c1RvRGVsZXRlQmVmb3JlQWN0aXZlID0gXCJkcmFmdHNUb0RlbGV0ZUJlZm9yZUFjdGl2ZVwiXG59XG5cbmVudW0gRGVsZXRlRGlhbG9nQ29udGVudENvbnRyb2wge1xuXHRDSEVDS0JPWCA9IFwiY2hlY2tCb3hcIixcblx0VEVYVCA9IFwidGV4dFwiXG59XG5cbmV4cG9ydCB0eXBlIERyYWZ0U2libGluZ1BhaXIgPSB7XG5cdGRyYWZ0OiBPRGF0YVY0Q29udGV4dDtcblx0c2libGluZ0luZm86IFNpYmxpbmdJbmZvcm1hdGlvbjtcbn07XG5cbmV4cG9ydCB0eXBlIERlbGV0ZU9wdGlvbiA9IHtcblx0dHlwZTogRGVsZXRlT3B0aW9uVHlwZXM7XG5cdGNvbnRleHRzOiBPRGF0YVY0Q29udGV4dFtdO1xuXHRzZWxlY3RlZDogYm9vbGVhbjtcblx0dGV4dD86IHN0cmluZztcblx0Y29udHJvbD86IERlbGV0ZURpYWxvZ0NvbnRlbnRDb250cm9sO1xufTtcblxudHlwZSBDb250ZXh0SW5mbyA9IHtcblx0Y29udGV4dDogQ29udGV4dDtcblx0c2libGluZ1Byb21pc2U6IFByb21pc2U8U2libGluZ0luZm9ybWF0aW9uIHwgdW5kZWZpbmVkIHwgdm9pZD47XG5cdHNpYmxpbmdJbmZvOiBTaWJsaW5nSW5mb3JtYXRpb24gfCB1bmRlZmluZWQ7XG5cdGlzRHJhZnRSb290OiBib29sZWFuO1xuXHRpc0RyYWZ0Tm9kZTogYm9vbGVhbjtcblx0aXNBY3RpdmU6IGJvb2xlYW47XG5cdGhhc0FjdGl2ZTogYm9vbGVhbjtcblx0aGFzRHJhZnQ6IGJvb2xlYW47XG5cdGxvY2tlZDogYm9vbGVhbjtcblx0ZGVsZXRhYmxlOiBib29sZWFuO1xuXHRzaWJsaW5nRGVsZXRhYmxlOiBib29sZWFuO1xuXHRpc0luYWN0aXZlQ29udGV4dDogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCB0eXBlIERyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhVHlwZSA9IHtcblx0RHJhZnRVVUlEOiBzdHJpbmc7XG5cdEluUHJvY2Vzc0J5VXNlcj86IHN0cmluZztcblx0SW5Qcm9jZXNzQnlVc2VyRGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cdENyZWF0ZWRCeVVzZXJEZXNjcmlwdGlvbj86IHN0cmluZztcblx0Q3JlYXRlZEJ5VXNlcj86IHN0cmluZztcblx0TGFzdENoYW5nZWRCeVVzZXJEZXNjcmlwdGlvbj86IHN0cmluZztcblx0TGFzdENoYW5nZWRCeVVzZXI/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBEZWxldGVQYXJhbWV0ZXJzID0ge1xuXHRpbnRlcm5hbE1vZGVsQ29udGV4dD86IEludGVybmFsTW9kZWxDb250ZXh0IHwgbnVsbDtcblx0bnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzPzogbnVtYmVyO1xuXHRlbnRpdHlTZXROYW1lPzogc3RyaW5nO1xuXHRwYXJlbnRDb250cm9sPzogQ29udHJvbDtcblx0ZGVzY3JpcHRpb24/OiBzdHJpbmcgfCB7IHBhdGg6IHN0cmluZyB9O1xuXHRiZWZvcmVEZWxldGVDYWxsQmFjaz86IEZ1bmN0aW9uO1xuXHR1blNhdmVkQ29udGV4dHM/OiBPRGF0YVY0Q29udGV4dFtdO1xuXHRkcmFmdHNXaXRoTm9uRGVsZXRhYmxlQWN0aXZlPzogT0RhdGFWNENvbnRleHRbXTtcblx0bG9ja2VkQ29udGV4dHM/OiBPRGF0YVY0Q29udGV4dFtdO1xuXHRkcmFmdHNXaXRoRGVsZXRhYmxlQWN0aXZlPzogRHJhZnRTaWJsaW5nUGFpcltdO1xufTtcblxuZXhwb3J0IHR5cGUgRGVsZXRlVGV4dEluZm8gPSB7XG5cdGluZm9UeHQ/OiBzdHJpbmc7XG5cdG9wdGlvblR4dD86IHN0cmluZztcblx0b3B0aW9uV2l0aG91dFR4dD86IGJvb2xlYW47XG59O1xuXG5mdW5jdGlvbiBnZXRVcGRhdGVkU2VsZWN0aW9ucyhcblx0aW50ZXJuYWxNb2RlbENvbnRleHQ6IEludGVybmFsTW9kZWxDb250ZXh0LFxuXHR0eXBlOiBEZWxldGVPcHRpb25UeXBlcyxcblx0c2VsZWN0ZWRDb250ZXh0czogT0RhdGFWNENvbnRleHRbXSxcblx0Y29udGV4dHNUb1JlbW92ZTogT0RhdGFWNENvbnRleHRbXVxuKTogT0RhdGFWNENvbnRleHRbXSB7XG5cdGNvbnN0IHJldFNlbGVjdGVkQ29udGV4dHM6IE9EYXRhVjRDb250ZXh0W10gPSBbLi4uc2VsZWN0ZWRDb250ZXh0c107XG5cdGNvbnRleHRzVG9SZW1vdmUuZm9yRWFjaCgoY29udGV4dDogT0RhdGFWNENvbnRleHQpID0+IHtcblx0XHRjb25zdCBpZHggPSByZXRTZWxlY3RlZENvbnRleHRzLmluZGV4T2YoY29udGV4dCk7XG5cdFx0aWYgKGlkeCAhPT0gLTEpIHtcblx0XHRcdHJldFNlbGVjdGVkQ29udGV4dHMuc3BsaWNlKGlkeCwgMSk7XG5cdFx0fVxuXHR9KTtcblx0aW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkodHlwZSwgW10pO1xuXG5cdHJldHVybiByZXRTZWxlY3RlZENvbnRleHRzO1xufVxuXG5mdW5jdGlvbiBjbGVhclNlbGVjdGVkQ29udGV4dHNGb3JPcHRpb24oaW50ZXJuYWxNb2RlbENvbnRleHQ6IEludGVybmFsTW9kZWxDb250ZXh0LCBvcHRpb246IERlbGV0ZU9wdGlvbik6IHZvaWQge1xuXHRsZXQgc2VsZWN0ZWRDb250ZXh0cyA9IChpbnRlcm5hbE1vZGVsQ29udGV4dC5nZXRQcm9wZXJ0eShcInNlbGVjdGVkQ29udGV4dHNcIikgYXMgT0RhdGFWNENvbnRleHRbXSkgfHwgW107XG5cblx0aWYgKG9wdGlvbi50eXBlID09PSBEZWxldGVPcHRpb25UeXBlcy5kZWxldGFibGVDb250ZXh0cykge1xuXHRcdHNlbGVjdGVkQ29udGV4dHMgPSBnZXRVcGRhdGVkU2VsZWN0aW9ucyhcblx0XHRcdGludGVybmFsTW9kZWxDb250ZXh0LFxuXHRcdFx0RGVsZXRlT3B0aW9uVHlwZXMuZGVsZXRhYmxlQ29udGV4dHMsXG5cdFx0XHRzZWxlY3RlZENvbnRleHRzLFxuXHRcdFx0aW50ZXJuYWxNb2RlbENvbnRleHQuZ2V0UHJvcGVydHkoRGVsZXRlT3B0aW9uVHlwZXMuZGVsZXRhYmxlQ29udGV4dHMpIHx8IFtdXG5cdFx0KTtcblxuXHRcdGNvbnN0IGRyYWZ0U2libGluZ1BhaXJzID0gaW50ZXJuYWxNb2RlbENvbnRleHQuZ2V0UHJvcGVydHkoRGVsZXRlT3B0aW9uVHlwZXMuZHJhZnRzV2l0aERlbGV0YWJsZUFjdGl2ZSkgfHwgW107XG5cdFx0Y29uc3QgZHJhZnRzID0gZHJhZnRTaWJsaW5nUGFpcnMubWFwKChjb250ZXh0UGFpcjogRHJhZnRTaWJsaW5nUGFpcikgPT4ge1xuXHRcdFx0cmV0dXJuIGNvbnRleHRQYWlyLmRyYWZ0O1xuXHRcdH0pO1xuXHRcdHNlbGVjdGVkQ29udGV4dHMgPSBnZXRVcGRhdGVkU2VsZWN0aW9ucyhcblx0XHRcdGludGVybmFsTW9kZWxDb250ZXh0LFxuXHRcdFx0RGVsZXRlT3B0aW9uVHlwZXMuZHJhZnRzV2l0aERlbGV0YWJsZUFjdGl2ZSxcblx0XHRcdHNlbGVjdGVkQ29udGV4dHMsXG5cdFx0XHRkcmFmdHNcblx0XHQpO1xuXHR9IGVsc2Uge1xuXHRcdGNvbnN0IGNvbnRleHRzVG9SZW1vdmUgPSBpbnRlcm5hbE1vZGVsQ29udGV4dC5nZXRQcm9wZXJ0eShvcHRpb24udHlwZSkgfHwgW107XG5cdFx0c2VsZWN0ZWRDb250ZXh0cyA9IGdldFVwZGF0ZWRTZWxlY3Rpb25zKGludGVybmFsTW9kZWxDb250ZXh0LCBvcHRpb24udHlwZSwgc2VsZWN0ZWRDb250ZXh0cywgY29udGV4dHNUb1JlbW92ZSk7XG5cdH1cblx0aW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJzZWxlY3RlZENvbnRleHRzXCIsIHNlbGVjdGVkQ29udGV4dHMpO1xuXHRpbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcIm51bWJlck9mU2VsZWN0ZWRDb250ZXh0c1wiLCBzZWxlY3RlZENvbnRleHRzLmxlbmd0aCk7XG59XG5cbmZ1bmN0aW9uIGFmdGVyRGVsZXRlUHJvY2Vzcyhcblx0cGFyYW1ldGVyczogRGVsZXRlUGFyYW1ldGVycyxcblx0b3B0aW9uczogRGVsZXRlT3B0aW9uW10sXG5cdGNvbnRleHRzOiBPRGF0YVY0Q29udGV4dFtdLFxuXHRyZXNvdXJjZU1vZGVsOiBSZXNvdXJjZU1vZGVsLFxuXHRsYXN0RGVsZXRlZFJvd0luZGV4OiBudW1iZXJcbik6IHZvaWQge1xuXHRjb25zdCB7IGludGVybmFsTW9kZWxDb250ZXh0LCBlbnRpdHlTZXROYW1lIH0gPSBwYXJhbWV0ZXJzO1xuXHRpZiAoaW50ZXJuYWxNb2RlbENvbnRleHQpIHtcblx0XHRpZiAoaW50ZXJuYWxNb2RlbENvbnRleHQuZ2V0UHJvcGVydHkoXCJkZWxldGVFbmFibGVkXCIpICE9IHVuZGVmaW5lZCkge1xuXHRcdFx0b3B0aW9ucy5mb3JFYWNoKChvcHRpb24pID0+IHtcblx0XHRcdFx0Ly8gaWYgYW4gb3B0aW9uIGlzIHNlbGVjdGVkLCB0aGVuIGl0IGlzIGRlbGV0ZWQuIFNvLCB3ZSBuZWVkIHRvIHJlbW92ZSB0aGVtIGZyb20gc2VsZWN0ZWQgY29udGV4dHMuXG5cdFx0XHRcdGlmIChvcHRpb24uc2VsZWN0ZWQpIHtcblx0XHRcdFx0XHRjbGVhclNlbGVjdGVkQ29udGV4dHNGb3JPcHRpb24oaW50ZXJuYWxNb2RlbENvbnRleHQsIG9wdGlvbik7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH1cblx0XHQvLyBpZiBhdGxlYXN0IG9uZSBvZiB0aGUgb3B0aW9ucyBpcyBub3Qgc2VsZWN0ZWQsIHRoZW4gdGhlIGRlbGV0ZSBidXR0b24gbmVlZHMgdG8gYmUgZW5hYmxlZC5cblx0XHRpbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcblx0XHRcdFwiZGVsZXRlRW5hYmxlZFwiLFxuXHRcdFx0b3B0aW9ucy5zb21lKChvcHRpb24pID0+ICFvcHRpb24uc2VsZWN0ZWQpXG5cdFx0KTtcblx0fVxuXG5cdGlmIChjb250ZXh0cy5sZW5ndGggPT09IDEpIHtcblx0XHRNZXNzYWdlVG9hc3Quc2hvdyhyZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9ERUxFVEVfVE9BU1RfU0lOR1VMQVJcIiwgdW5kZWZpbmVkLCBlbnRpdHlTZXROYW1lKSk7XG5cdH0gZWxzZSB7XG5cdFx0TWVzc2FnZVRvYXN0LnNob3cocmVzb3VyY2VNb2RlbC5nZXRUZXh0KFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfREVMRVRFX1RPQVNUX1BMVVJBTFwiLCB1bmRlZmluZWQsIGVudGl0eVNldE5hbWUpKTtcblx0fVxuXHQvLyBUaGUgTXVsdGlWYWx1ZUZpZWxkIGRvZXMgbm90IG5lZWQgcmVzZXR0aW5nIG9mIGZvY3VzIGxpa2UgdGhlIHRhYmxlLCB3aXRoIHRoZSByZXNldHRpbmcgd2UgZ2V0IGNvbnNvbGUgZXJyb3JzIHdlIGF2b2lkIHRyb3VnaCB0aGlzIGNoZWNrXG5cdGlmIChwYXJhbWV0ZXJzLnBhcmVudENvbnRyb2wgIT09IHVuZGVmaW5lZCAmJiBwYXJhbWV0ZXJzLnBhcmVudENvbnRyb2wuZ2V0TWV0YWRhdGEoKS5nZXROYW1lKCkgIT09IFwic2FwLnVpLm1kYy5NdWx0aVZhbHVlRmllbGRcIikge1xuXHRcdGRlbGV0ZUhlbHBlci5zZXRGb2N1c0FmdGVyRGVsZXRlKHBhcmFtZXRlcnMucGFyZW50Q29udHJvbCBhcyBUYWJsZSwgY29udGV4dHMubGVuZ3RoLCBsYXN0RGVsZXRlZFJvd0luZGV4KTtcblx0fVxufVxuXG5hc3luYyBmdW5jdGlvbiBzZXRGb2N1c0FmdGVyRGVsZXRlKHRhYmxlOiBUYWJsZSwgZGVsZXRlZFJvd3NDb3VudDogbnVtYmVyLCBsYXN0RGVsZXRlZFJvd0luZGV4OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcblx0Y29uc3QgdGFibGVSb3dzQ291bnQgPSB0YWJsZS5nZXRSb3dCaW5kaW5nPy4oKT8uZ2V0Q291bnQoKTtcblx0Y29uc3Qgb3JpZ2luYWxUYWJsZVJvd3NDb3VudCA9ICh0YWJsZVJvd3NDb3VudCA/PyAwKSArIGRlbGV0ZWRSb3dzQ291bnQ7XG5cdGxldCBuZXh0Rm9jdXNSb3dJbmRleDtcblxuXHRpZiAobGFzdERlbGV0ZWRSb3dJbmRleCAhPT0gLTEgJiYgdGFibGVSb3dzQ291bnQgIT09IHVuZGVmaW5lZCAmJiB0YWJsZVJvd3NDb3VudCA+IDApIHtcblx0XHQvL0lmIHRoZSBsYXN0IHJvdyBpcyBkZWxldGVkLCBtb3ZlIHRoZSBmb2N1cyB0byBwcmV2aW91cyByb3cgdG8gaXRcblx0XHRpZiAobGFzdERlbGV0ZWRSb3dJbmRleCA9PT0gb3JpZ2luYWxUYWJsZVJvd3NDb3VudCAtIDEpIHtcblx0XHRcdG5leHRGb2N1c1Jvd0luZGV4ID0gdGFibGVSb3dzQ291bnQgLSAxO1xuXHRcdFx0Ly9Gb3IgdGhlIG5vcm1hbCBzY2VuYXJpbywgbW92ZSB0aGUgZm9jdXMgdG8gdGhlIG5leHQgcm93XG5cdFx0fSBlbHNlIHtcblx0XHRcdG5leHRGb2N1c1Jvd0luZGV4ID0gbGFzdERlbGV0ZWRSb3dJbmRleCAtIGRlbGV0ZWRSb3dzQ291bnQgKyAxO1xuXHRcdH1cblx0XHRhd2FpdCB0YWJsZS5mb2N1c1JvdyhuZXh0Rm9jdXNSb3dJbmRleCwgZmFsc2UpO1xuXHR9IGVsc2Uge1xuXHRcdC8vIEZvciB6ZXJvIHJvd3Mgb3IgZGVmYXVsdCBjYXNlLCBtb3ZlIGZvY3VzIHRvIHRhYmxlXG5cdFx0dGFibGUuZm9jdXMoKTtcblx0fVxufVxuXG5mdW5jdGlvbiBnZXRMb2NrZWRDb250ZXh0VXNlcihsb2NrZWRDb250ZXh0OiBPRGF0YVY0Q29udGV4dCk6IHN0cmluZyB7XG5cdGNvbnN0IGRyYWZ0QWRtaW5EYXRhID0gbG9ja2VkQ29udGV4dC5nZXRPYmplY3QoKVtcIkRyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhXCJdIGFzIERyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhVHlwZTtcblx0cmV0dXJuIChkcmFmdEFkbWluRGF0YSAmJiBkcmFmdEFkbWluRGF0YVtcIkluUHJvY2Vzc0J5VXNlclwiXSkgfHwgXCJcIjtcbn1cblxuZnVuY3Rpb24gZ2V0TG9ja2VkT2JqZWN0c1RleHQocmVzb3VyY2VNb2RlbDogUmVzb3VyY2VNb2RlbCwgbnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzOiBudW1iZXIsIGxvY2tlZENvbnRleHRzOiBPRGF0YVY0Q29udGV4dFtdKTogc3RyaW5nIHtcblx0bGV0IHJldFR4dCA9IFwiXCI7XG5cblx0aWYgKG51bWJlck9mU2VsZWN0ZWRDb250ZXh0cyA9PT0gMSAmJiBsb2NrZWRDb250ZXh0cy5sZW5ndGggPT09IDEpIHtcblx0XHQvL29ubHkgb25lIHVuc2F2ZWQgb2JqZWN0XG5cdFx0Y29uc3QgbG9ja2VkVXNlciA9IGdldExvY2tlZENvbnRleHRVc2VyKGxvY2tlZENvbnRleHRzWzBdKTtcblx0XHRyZXRUeHQgPSByZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9DT05GSVJNX0RFTEVURV9XSVRIX1NJTkdMRV9PQkpFQ1RfTE9DS0VEXCIsIFtsb2NrZWRVc2VyXSk7XG5cdH0gZWxzZSBpZiAobG9ja2VkQ29udGV4dHMubGVuZ3RoID09IDEpIHtcblx0XHRjb25zdCBsb2NrZWRVc2VyID0gZ2V0TG9ja2VkQ29udGV4dFVzZXIobG9ja2VkQ29udGV4dHNbMF0pO1xuXHRcdHJldFR4dCA9IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0NPTkZJUk1fREVMRVRFX1dJVEhfT0JKRUNUSU5GT19BTkRfT05FX09CSkVDVF9MT0NLRURcIiwgW1xuXHRcdFx0bnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzLFxuXHRcdFx0bG9ja2VkVXNlclxuXHRcdF0pO1xuXHR9IGVsc2UgaWYgKGxvY2tlZENvbnRleHRzLmxlbmd0aCA+IDEpIHtcblx0XHRyZXRUeHQgPSByZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9DT05GSVJNX0RFTEVURV9XSVRIX09CSkVDVElORk9fQU5EX0ZFV19PQkpFQ1RTX0xPQ0tFRFwiLCBbXG5cdFx0XHRsb2NrZWRDb250ZXh0cy5sZW5ndGgsXG5cdFx0XHRudW1iZXJPZlNlbGVjdGVkQ29udGV4dHNcblx0XHRdKTtcblx0fVxuXG5cdHJldHVybiByZXRUeHQ7XG59XG5cbmZ1bmN0aW9uIGdldE5vbkRlbGV0YWJsZUFjdGl2ZXNPZkRyYWZ0c1RleHQocmVzb3VyY2VNb2RlbDogUmVzb3VyY2VNb2RlbCwgbnVtYmVyT2ZEcmFmdHM6IG51bWJlciwgdG90YWxEZWxldGFibGU6IG51bWJlcik6IHN0cmluZyB7XG5cdGxldCByZXRUeHQgPSBcIlwiO1xuXG5cdGlmICh0b3RhbERlbGV0YWJsZSA9PT0gbnVtYmVyT2ZEcmFmdHMpIHtcblx0XHRpZiAobnVtYmVyT2ZEcmFmdHMgPT09IDEpIHtcblx0XHRcdHJldFR4dCA9IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0NPTkZJUk1fREVMRVRFX09OTFlfRFJBRlRfT0ZfTk9OX0RFTEVUQUJMRV9BQ1RJVkVcIik7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldFR4dCA9IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0NPTkZJUk1fREVMRVRFX09OTFlfRFJBRlRTX09GX05PTl9ERUxFVEFCTEVfQUNUSVZFXCIpO1xuXHRcdH1cblx0fSBlbHNlIGlmIChudW1iZXJPZkRyYWZ0cyA9PT0gMSkge1xuXHRcdHJldFR4dCA9IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0NPTkZJUk1fREVMRVRFX0RSQUZUX09GX05PTl9ERUxFVEFCTEVfQUNUSVZFXCIpO1xuXHR9IGVsc2Uge1xuXHRcdHJldFR4dCA9IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0NPTkZJUk1fREVMRVRFX0RSQUZUU19PRl9OT05fREVMRVRBQkxFX0FDVElWRVwiKTtcblx0fVxuXG5cdHJldHVybiByZXRUeHQ7XG59XG5cbmZ1bmN0aW9uIGdldFVuU2F2ZWRDb250ZXh0VXNlcih1blNhdmVkQ29udGV4dDogT0RhdGFWNENvbnRleHQpOiBzdHJpbmcge1xuXHRjb25zdCBkcmFmdEFkbWluRGF0YSA9IHVuU2F2ZWRDb250ZXh0LmdldE9iamVjdCgpW1wiRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGFcIl0gYXMgRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGFUeXBlO1xuXHRsZXQgc0xhc3RDaGFuZ2VkQnlVc2VyID0gXCJcIjtcblx0aWYgKGRyYWZ0QWRtaW5EYXRhKSB7XG5cdFx0c0xhc3RDaGFuZ2VkQnlVc2VyID0gZHJhZnRBZG1pbkRhdGFbXCJMYXN0Q2hhbmdlZEJ5VXNlckRlc2NyaXB0aW9uXCJdIHx8IGRyYWZ0QWRtaW5EYXRhW1wiTGFzdENoYW5nZWRCeVVzZXJcIl0gfHwgXCJcIjtcblx0fVxuXG5cdHJldHVybiBzTGFzdENoYW5nZWRCeVVzZXI7XG59XG5cbmZ1bmN0aW9uIGdldFVuc2F2ZWRDb250ZXh0c1RleHQoXG5cdHJlc291cmNlTW9kZWw6IFJlc291cmNlTW9kZWwsXG5cdG51bWJlck9mU2VsZWN0ZWRDb250ZXh0czogbnVtYmVyLFxuXHR1blNhdmVkQ29udGV4dHM6IE9EYXRhVjRDb250ZXh0W10sXG5cdHRvdGFsRGVsZXRhYmxlOiBudW1iZXJcbik6IERlbGV0ZVRleHRJbmZvIHtcblx0bGV0IGluZm9UeHQgPSBcIlwiLFxuXHRcdG9wdGlvblR4dCA9IFwiXCIsXG5cdFx0b3B0aW9uV2l0aG91dFR4dCA9IGZhbHNlO1xuXHRpZiAobnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzID09PSAxICYmIHVuU2F2ZWRDb250ZXh0cy5sZW5ndGggPT09IDEpIHtcblx0XHQvL29ubHkgb25lIHVuc2F2ZWQgb2JqZWN0IGFyZSBzZWxlY3RlZFxuXHRcdGNvbnN0IGxhc3RDaGFuZ2VkQnlVc2VyID0gZ2V0VW5TYXZlZENvbnRleHRVc2VyKHVuU2F2ZWRDb250ZXh0c1swXSk7XG5cdFx0aW5mb1R4dCA9IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0NPTkZJUk1fREVMRVRFX1dJVEhfVU5TQVZFRF9DSEFOR0VTXCIsIFtsYXN0Q2hhbmdlZEJ5VXNlcl0pO1xuXHRcdG9wdGlvbldpdGhvdXRUeHQgPSB0cnVlO1xuXHR9IGVsc2UgaWYgKG51bWJlck9mU2VsZWN0ZWRDb250ZXh0cyA9PT0gdW5TYXZlZENvbnRleHRzLmxlbmd0aCkge1xuXHRcdC8vb25seSBtdWx0aXBsZSB1bnNhdmVkIG9iamVjdHMgYXJlIHNlbGVjdGVkXG5cdFx0aW5mb1R4dCA9IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0NPTkZJUk1fREVMRVRFX1dJVEhfVU5TQVZFRF9DSEFOR0VTX01VTFRJUExFX09CSkVDVFNcIik7XG5cdFx0b3B0aW9uV2l0aG91dFR4dCA9IHRydWU7XG5cdH0gZWxzZSBpZiAodG90YWxEZWxldGFibGUgPT09IHVuU2F2ZWRDb250ZXh0cy5sZW5ndGgpIHtcblx0XHQvLyBub24tZGVsZXRhYmxlL2xvY2tlZCBleGlzdHMsIGFsbCBkZWxldGFibGUgYXJlIHVuc2F2ZWQgYnkgb3RoZXJzXG5cdFx0aWYgKHVuU2F2ZWRDb250ZXh0cy5sZW5ndGggPT09IDEpIHtcblx0XHRcdGNvbnN0IGxhc3RDaGFuZ2VkQnlVc2VyID0gZ2V0VW5TYXZlZENvbnRleHRVc2VyKHVuU2F2ZWRDb250ZXh0c1swXSk7XG5cdFx0XHRpbmZvVHh0ID0gcmVzb3VyY2VNb2RlbC5nZXRUZXh0KFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfQ09ORklSTV9ERUxFVEVfV0lUSF9VTlNBVkVEX0FORF9GRVdfT0JKRUNUU19MT0NLRURfU0lOR1VMQVJcIiwgW1xuXHRcdFx0XHRsYXN0Q2hhbmdlZEJ5VXNlclxuXHRcdFx0XSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGluZm9UeHQgPSByZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9DT05GSVJNX0RFTEVURV9XSVRIX1VOU0FWRURfQU5EX0ZFV19PQkpFQ1RTX0xPQ0tFRF9QTFVSQUxcIik7XG5cdFx0fVxuXHRcdG9wdGlvbldpdGhvdXRUeHQgPSB0cnVlO1xuXHR9IGVsc2UgaWYgKHRvdGFsRGVsZXRhYmxlID4gdW5TYXZlZENvbnRleHRzLmxlbmd0aCkge1xuXHRcdC8vIG5vbi1kZWxldGFibGUvbG9ja2VkIGV4aXN0cywgZGVsZXRhYmxlIGluY2x1ZGUgdW5zYXZlZCBhbmQgb3RoZXIgdHlwZXMuXG5cdFx0aWYgKHVuU2F2ZWRDb250ZXh0cy5sZW5ndGggPT09IDEpIHtcblx0XHRcdGNvbnN0IGxhc3RDaGFuZ2VkQnlVc2VyID0gZ2V0VW5TYXZlZENvbnRleHRVc2VyKHVuU2F2ZWRDb250ZXh0c1swXSk7XG5cdFx0XHRvcHRpb25UeHQgPSByZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9DT05GSVJNX0RFTEVURV9XSVRIX09CSkVDVElORk9fQU5EX0ZFV19PQkpFQ1RTX1VOU0FWRURfU0lOR1VMQVJcIiwgW1xuXHRcdFx0XHRsYXN0Q2hhbmdlZEJ5VXNlclxuXHRcdFx0XSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG9wdGlvblR4dCA9IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0NPTkZJUk1fREVMRVRFX1dJVEhfT0JKRUNUSU5GT19BTkRfRkVXX09CSkVDVFNfVU5TQVZFRF9QTFVSQUxcIik7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIHsgaW5mb1R4dCwgb3B0aW9uVHh0LCBvcHRpb25XaXRob3V0VHh0IH07XG59XG5cbmZ1bmN0aW9uIGdldE5vbkRlbGV0YWJsZVRleHQoXG5cdG1QYXJhbWV0ZXJzOiBEZWxldGVQYXJhbWV0ZXJzLFxuXHR0b3RhbE51bURlbGV0YWJsZUNvbnRleHRzOiBudW1iZXIsXG5cdHJlc291cmNlTW9kZWw6IFJlc291cmNlTW9kZWxcbik6IFRleHQgfCB1bmRlZmluZWQge1xuXHRjb25zdCB7IG51bWJlck9mU2VsZWN0ZWRDb250ZXh0cywgZW50aXR5U2V0TmFtZSwgbG9ja2VkQ29udGV4dHMgPSBbXSwgZHJhZnRzV2l0aE5vbkRlbGV0YWJsZUFjdGl2ZSA9IFtdIH0gPSBtUGFyYW1ldGVycztcblx0Y29uc3Qgbm9uRGVsZXRhYmxlQ29udGV4dHMgPVxuXHRcdG51bWJlck9mU2VsZWN0ZWRDb250ZXh0cyEgLSAobG9ja2VkQ29udGV4dHMubGVuZ3RoICsgdG90YWxOdW1EZWxldGFibGVDb250ZXh0cyAtIGRyYWZ0c1dpdGhOb25EZWxldGFibGVBY3RpdmUubGVuZ3RoKTtcblx0bGV0IHJldFR4dCA9IFwiXCI7XG5cblx0aWYgKFxuXHRcdG5vbkRlbGV0YWJsZUNvbnRleHRzID4gMCAmJlxuXHRcdCh0b3RhbE51bURlbGV0YWJsZUNvbnRleHRzID09PSAwIHx8IGRyYWZ0c1dpdGhOb25EZWxldGFibGVBY3RpdmUubGVuZ3RoID09PSB0b3RhbE51bURlbGV0YWJsZUNvbnRleHRzKVxuXHQpIHtcblx0XHQvLyAxLiBOb25lIG9mIHRoZSBjY29udGV4dHMgYXJlIGRlbGV0YWJsZVxuXHRcdC8vIDIuIE9ubHkgZHJhZnRzIG9mIG5vbiBkZWxldGFibGUgY29udGV4dHMgZXhpc3QuXG5cdFx0aWYgKGxvY2tlZENvbnRleHRzLmxlbmd0aCA+IDApIHtcblx0XHRcdC8vIExvY2tlZCBjb250ZXh0cyBleGlzdFxuXHRcdFx0aWYgKG5vbkRlbGV0YWJsZUNvbnRleHRzID09PSAxKSB7XG5cdFx0XHRcdHJldFR4dCA9IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0NPTkZJUk1fREVMRVRFX1dJVEhfQUxMX1JFTUFJTklOR19OT05fREVMRVRBQkxFX1NJTkdVTEFSXCIpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmV0VHh0ID0gcmVzb3VyY2VNb2RlbC5nZXRUZXh0KFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfQ09ORklSTV9ERUxFVEVfV0lUSF9BTExfUkVNQUlOSU5HX05PTl9ERUxFVEFCTEVfUExVUkFMXCIpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAobm9uRGVsZXRhYmxlQ29udGV4dHMgPT09IDEpIHtcblx0XHRcdC8vIE9ubHkgcHVyZSBub24tZGVsZXRhYmxlIGNvbnRleHRzIGV4aXN0IHNpbmdsZVxuXHRcdFx0cmV0VHh0ID0gcmVzb3VyY2VNb2RlbC5nZXRUZXh0KFxuXHRcdFx0XHRcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0NPTkZJUk1fREVMRVRFX1dJVEhfU0lOR0xFX0FORF9PTkVfT0JKRUNUX05PTl9ERUxFVEFCTEVcIixcblx0XHRcdFx0dW5kZWZpbmVkLFxuXHRcdFx0XHRlbnRpdHlTZXROYW1lXG5cdFx0XHQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBPbmx5IHB1cmUgbm9uLWRlbGV0YWJsZSBjb250ZXh0cyBleGlzdCBtdWx0aXBsZVxuXHRcdFx0cmV0VHh0ID0gcmVzb3VyY2VNb2RlbC5nZXRUZXh0KFxuXHRcdFx0XHRcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0NPTkZJUk1fREVMRVRFX1dJVEhfTVVMVElQTEVfQU5EX0FMTF9PQkpFQ1RfTk9OX0RFTEVUQUJMRVwiLFxuXHRcdFx0XHR1bmRlZmluZWQsXG5cdFx0XHRcdGVudGl0eVNldE5hbWVcblx0XHRcdCk7XG5cdFx0fVxuXHR9IGVsc2UgaWYgKG5vbkRlbGV0YWJsZUNvbnRleHRzID09PSAxKSB7XG5cdFx0Ly8gZGVsZXRhYmxlIGFuZCBub24tZGVsZXRhYmxlIGV4aXN0cyB0b2dldGhlciwgc2luZ2xlXG5cdFx0cmV0VHh0ID0gcmVzb3VyY2VNb2RlbC5nZXRUZXh0KFxuXHRcdFx0XCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9DT05GSVJNX0RFTEVURV9XSVRIX09CSkVDVElORk9fQU5EX09ORV9PQkpFQ1RfTk9OX0RFTEVUQUJMRVwiLFxuXHRcdFx0W251bWJlck9mU2VsZWN0ZWRDb250ZXh0c10sXG5cdFx0XHRlbnRpdHlTZXROYW1lXG5cdFx0KTtcblx0fSBlbHNlIGlmIChub25EZWxldGFibGVDb250ZXh0cyA+IDEpIHtcblx0XHQvLyBkZWxldGFibGUgYW5kIG5vbi1kZWxldGFibGUgZXhpc3RzIHRvZ2V0aGVyLCBtdWx0aXBsZVxuXHRcdHJldFR4dCA9IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcblx0XHRcdFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfQ09ORklSTV9ERUxFVEVfV0lUSF9PQkpFQ1RJTkZPX0FORF9GRVdfT0JKRUNUU19OT05fREVMRVRBQkxFXCIsXG5cdFx0XHRbbm9uRGVsZXRhYmxlQ29udGV4dHMsIG51bWJlck9mU2VsZWN0ZWRDb250ZXh0c10sXG5cdFx0XHRlbnRpdHlTZXROYW1lXG5cdFx0KTtcblx0fVxuXG5cdHJldHVybiByZXRUeHQgPyBuZXcgVGV4dCh7IHRleHQ6IHJldFR4dCB9KSA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gZ2V0Q29uZmlybWVkRGVsZXRhYmxlQ29udGV4dChjb250ZXh0czogT0RhdGFWNENvbnRleHRbXSwgb3B0aW9uczogRGVsZXRlT3B0aW9uW10pOiBPRGF0YVY0Q29udGV4dFtdIHtcblx0cmV0dXJuIG9wdGlvbnMucmVkdWNlKChyZXN1bHQsIG9wdGlvbikgPT4ge1xuXHRcdHJldHVybiBvcHRpb24uc2VsZWN0ZWQgJiYgb3B0aW9uLnR5cGUgIT09IERlbGV0ZU9wdGlvblR5cGVzLmRyYWZ0c1RvRGVsZXRlQmVmb3JlQWN0aXZlID8gcmVzdWx0LmNvbmNhdChvcHRpb24uY29udGV4dHMpIDogcmVzdWx0O1xuXHR9LCBjb250ZXh0cyk7XG59XG5cbmZ1bmN0aW9uIGdldERyYWZ0c1RvRGVsZXRlQmVmb3JlQWN0aXZlKG9wdGlvbnM6IERlbGV0ZU9wdGlvbltdKTogT0RhdGFWNENvbnRleHRbXSB7XG5cdGNvbnN0IGNvbnRleHRzOiBPRGF0YVY0Q29udGV4dFtdID0gW107XG5cdHJldHVybiBvcHRpb25zLnJlZHVjZSgocmVzdWx0LCBvcHRpb24pID0+IHtcblx0XHRyZXR1cm4gb3B0aW9uLnNlbGVjdGVkICYmIG9wdGlvbi50eXBlID09PSBEZWxldGVPcHRpb25UeXBlcy5kcmFmdHNUb0RlbGV0ZUJlZm9yZUFjdGl2ZSA/IHJlc3VsdC5jb25jYXQob3B0aW9uLmNvbnRleHRzKSA6IHJlc3VsdDtcblx0fSwgY29udGV4dHMpO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVEcmFmdE9wdGlvbnNGb3JEZWxldGFibGVUZXh0cyhcblx0bVBhcmFtZXRlcnM6IERlbGV0ZVBhcmFtZXRlcnMsXG5cdHZDb250ZXh0czogT0RhdGFWNENvbnRleHRbXSxcblx0dG90YWxEZWxldGFibGU6IG51bWJlcixcblx0cmVzb3VyY2VNb2RlbDogUmVzb3VyY2VNb2RlbCxcblx0aXRlbXM6IENvbnRyb2xbXSxcblx0b3B0aW9uczogRGVsZXRlT3B0aW9uW11cbik6IHZvaWQge1xuXHRsZXQgeyBudW1iZXJPZlNlbGVjdGVkQ29udGV4dHMsIGRyYWZ0c1dpdGhEZWxldGFibGVBY3RpdmUsIHVuU2F2ZWRDb250ZXh0cywgbG9ja2VkQ29udGV4dHMsIGRyYWZ0c1dpdGhOb25EZWxldGFibGVBY3RpdmUgfSA9XG5cdFx0bVBhcmFtZXRlcnM7XG5cdGRyYWZ0c1dpdGhEZWxldGFibGVBY3RpdmUgPz89IFtdO1xuXHR1blNhdmVkQ29udGV4dHMgPz89IFtdO1xuXHRsb2NrZWRDb250ZXh0cyA/Pz0gW107XG5cdGRyYWZ0c1dpdGhOb25EZWxldGFibGVBY3RpdmUgPz89IFtdO1xuXHRudW1iZXJPZlNlbGVjdGVkQ29udGV4dHMgPz89IDA7XG5cdGxldCBsb2NrZWRDb250ZXh0c1R4dCA9IFwiXCI7XG5cblx0Ly8gZHJhZnRzIHdpdGggYWN0aXZlXG5cdGlmIChkcmFmdHNXaXRoRGVsZXRhYmxlQWN0aXZlLmxlbmd0aCA+IDApIHtcblx0XHRjb25zdCBkcmFmdHNUb0RlbGV0ZUJlZm9yZUFjdGl2ZTogT0RhdGFWNENvbnRleHRbXSA9IFtdO1xuXHRcdGRyYWZ0c1dpdGhEZWxldGFibGVBY3RpdmUuZm9yRWFjaCgoZGVsZXRhYmxlRHJhZnRJbmZvOiBEcmFmdFNpYmxpbmdQYWlyKSA9PiB7XG5cdFx0XHQvLyBJbiBlaXRoZXIgY2FzZXMsIGlmIGFuIG93biBkcmFmdCBpcyBsb2NrZWQgb3Igbm90IHRoZSBkcmFmdCBuZWVkcyB0byBiZSBkaXNjYXJkZWQgYmVmb3JlIGRlbGV0aW5nIGFjdGl2ZSByZWNvcmQuXG5cdFx0XHRkcmFmdHNUb0RlbGV0ZUJlZm9yZUFjdGl2ZS5wdXNoKGRlbGV0YWJsZURyYWZ0SW5mby5kcmFmdCk7XG5cdFx0XHR2Q29udGV4dHMucHVzaChkZWxldGFibGVEcmFmdEluZm8uc2libGluZ0luZm8udGFyZ2V0Q29udGV4dCk7XG5cdFx0fSk7XG5cdFx0aWYgKGRyYWZ0c1RvRGVsZXRlQmVmb3JlQWN0aXZlLmxlbmd0aCA+IDApIHtcblx0XHRcdG9wdGlvbnMucHVzaCh7XG5cdFx0XHRcdHR5cGU6IERlbGV0ZU9wdGlvblR5cGVzLmRyYWZ0c1RvRGVsZXRlQmVmb3JlQWN0aXZlLFxuXHRcdFx0XHRjb250ZXh0czogZHJhZnRzVG9EZWxldGVCZWZvcmVBY3RpdmUsXG5cdFx0XHRcdHNlbGVjdGVkOiB0cnVlXG5cdFx0XHR9KTtcblx0XHR9XG5cdH1cblxuXHQvLyBpdGVtcyBsb2NrZWQgbXNnXG5cdGlmIChsb2NrZWRDb250ZXh0cy5sZW5ndGggPiAwKSB7XG5cdFx0bG9ja2VkQ29udGV4dHNUeHQgPSBkZWxldGVIZWxwZXIuZ2V0TG9ja2VkT2JqZWN0c1RleHQocmVzb3VyY2VNb2RlbCwgbnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzLCBsb2NrZWRDb250ZXh0cykgfHwgXCJcIjtcblx0XHRpdGVtcy5wdXNoKG5ldyBUZXh0KHsgdGV4dDogbG9ja2VkQ29udGV4dHNUeHQgfSkpO1xuXHR9XG5cblx0Ly8gbm9uIGRlbGV0YWJsZSBtc2dcblx0Y29uc3Qgbm9uRGVsZXRhYmxlRXhpc3RzID0gbnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzICE9IHRvdGFsRGVsZXRhYmxlIC0gZHJhZnRzV2l0aE5vbkRlbGV0YWJsZUFjdGl2ZS5sZW5ndGggKyBsb2NrZWRDb250ZXh0cy5sZW5ndGg7XG5cdGNvbnN0IG5vbkRlbGV0YWJsZVRleHRDdHJsID0gbm9uRGVsZXRhYmxlRXhpc3RzICYmIGRlbGV0ZUhlbHBlci5nZXROb25EZWxldGFibGVUZXh0KG1QYXJhbWV0ZXJzLCB0b3RhbERlbGV0YWJsZSwgcmVzb3VyY2VNb2RlbCk7XG5cdGlmIChub25EZWxldGFibGVUZXh0Q3RybCkge1xuXHRcdGl0ZW1zLnB1c2gobm9uRGVsZXRhYmxlVGV4dEN0cmwpO1xuXHR9XG5cblx0Ly8gb3B0aW9uOiB1bnNhdmVkIGNoYW5nZXMgYnkgb3RoZXJzXG5cdGlmICh1blNhdmVkQ29udGV4dHMubGVuZ3RoID4gMCkge1xuXHRcdGNvbnN0IHVuc2F2ZWRDaGFuZ2VzVHh0cyA9XG5cdFx0XHRkZWxldGVIZWxwZXIuZ2V0VW5zYXZlZENvbnRleHRzVGV4dChyZXNvdXJjZU1vZGVsLCBudW1iZXJPZlNlbGVjdGVkQ29udGV4dHMsIHVuU2F2ZWRDb250ZXh0cywgdG90YWxEZWxldGFibGUpIHx8IHt9O1xuXHRcdGlmICh1bnNhdmVkQ2hhbmdlc1R4dHMuaW5mb1R4dCkge1xuXHRcdFx0aXRlbXMucHVzaChuZXcgVGV4dCh7IHRleHQ6IHVuc2F2ZWRDaGFuZ2VzVHh0cy5pbmZvVHh0IH0pKTtcblx0XHR9XG5cdFx0aWYgKHVuc2F2ZWRDaGFuZ2VzVHh0cy5vcHRpb25UeHQgfHwgdW5zYXZlZENoYW5nZXNUeHRzLm9wdGlvbldpdGhvdXRUeHQpIHtcblx0XHRcdG9wdGlvbnMucHVzaCh7XG5cdFx0XHRcdHR5cGU6IERlbGV0ZU9wdGlvblR5cGVzLnVuU2F2ZWRDb250ZXh0cyxcblx0XHRcdFx0Y29udGV4dHM6IHVuU2F2ZWRDb250ZXh0cyxcblx0XHRcdFx0dGV4dDogdW5zYXZlZENoYW5nZXNUeHRzLm9wdGlvblR4dCxcblx0XHRcdFx0c2VsZWN0ZWQ6IHRydWUsXG5cdFx0XHRcdGNvbnRyb2w6IERlbGV0ZURpYWxvZ0NvbnRlbnRDb250cm9sLkNIRUNLQk9YXG5cdFx0XHR9KTtcblx0XHR9XG5cdH1cblxuXHQvLyBvcHRpb246IGRyYWZ0cyB3aXRoIGFjdGl2ZSBub3QgZGVsZXRhYmxlXG5cdGlmIChkcmFmdHNXaXRoTm9uRGVsZXRhYmxlQWN0aXZlLmxlbmd0aCA+IDApIHtcblx0XHRjb25zdCBub25EZWxldGFibGVBY3RpdmVzT2ZEcmFmdHNUZXh0ID1cblx0XHRcdGRlbGV0ZUhlbHBlci5nZXROb25EZWxldGFibGVBY3RpdmVzT2ZEcmFmdHNUZXh0KHJlc291cmNlTW9kZWwsIGRyYWZ0c1dpdGhOb25EZWxldGFibGVBY3RpdmUubGVuZ3RoLCB0b3RhbERlbGV0YWJsZSkgfHwgXCJcIjtcblx0XHRpZiAobm9uRGVsZXRhYmxlQWN0aXZlc09mRHJhZnRzVGV4dCkge1xuXHRcdFx0b3B0aW9ucy5wdXNoKHtcblx0XHRcdFx0dHlwZTogRGVsZXRlT3B0aW9uVHlwZXMuZHJhZnRzV2l0aE5vbkRlbGV0YWJsZUFjdGl2ZSxcblx0XHRcdFx0Y29udGV4dHM6IGRyYWZ0c1dpdGhOb25EZWxldGFibGVBY3RpdmUsXG5cdFx0XHRcdHRleHQ6IG5vbkRlbGV0YWJsZUFjdGl2ZXNPZkRyYWZ0c1RleHQsXG5cdFx0XHRcdHNlbGVjdGVkOiB0cnVlLFxuXHRcdFx0XHRjb250cm9sOiB0b3RhbERlbGV0YWJsZSA+IDAgPyBEZWxldGVEaWFsb2dDb250ZW50Q29udHJvbC5DSEVDS0JPWCA6IERlbGV0ZURpYWxvZ0NvbnRlbnRDb250cm9sLlRFWFRcblx0XHRcdH0pO1xuXHRcdH1cblx0fVxufVxuXG5mdW5jdGlvbiB1cGRhdGVDb250ZW50Rm9yRGVsZXRlRGlhbG9nKG9wdGlvbnM6IERlbGV0ZU9wdGlvbltdLCBpdGVtczogQ29udHJvbFtdKTogdm9pZCB7XG5cdGlmIChvcHRpb25zLmxlbmd0aCA9PT0gMSkge1xuXHRcdC8vIFNpbmdsZSBvcHRpb24gZG9lc24ndCBuZWVkIGNoZWNrQm94XG5cdFx0Y29uc3Qgb3B0aW9uID0gb3B0aW9uc1swXTtcblx0XHRpZiAob3B0aW9uLnRleHQpIHtcblx0XHRcdGNvbnN0IHRleHQgPSBuZXcgVGV4dCgpO1xuXHRcdFx0dGV4dC5zZXRUZXh0KG9wdGlvbi50ZXh0KTtcblx0XHRcdGl0ZW1zLnB1c2godGV4dCk7XG5cdFx0fVxuXHR9IGVsc2UgaWYgKG9wdGlvbnMubGVuZ3RoID4gMSkge1xuXHRcdC8vIE11bHRpcGxlIE9wdGlvbnNcblxuXHRcdC8vIFRleHRzXG5cdFx0b3B0aW9ucy5mb3JFYWNoKChvcHRpb246IERlbGV0ZU9wdGlvbikgPT4ge1xuXHRcdFx0aWYgKG9wdGlvbi5jb250cm9sID09PSBcInRleHRcIiAmJiBvcHRpb24udGV4dCkge1xuXHRcdFx0XHRjb25zdCB0ZXh0ID0gbmV3IFRleHQoKTtcblx0XHRcdFx0dGV4dC5zZXRUZXh0KG9wdGlvbi50ZXh0KTtcblx0XHRcdFx0aXRlbXMucHVzaCh0ZXh0KTtcblx0XHRcdH1cblx0XHR9KTtcblx0XHQvLyBDaGVja0JveHNcblx0XHRvcHRpb25zLmZvckVhY2goKG9wdGlvbjogRGVsZXRlT3B0aW9uKSA9PiB7XG5cdFx0XHRpZiAob3B0aW9uLmNvbnRyb2wgPT09IFwiY2hlY2tCb3hcIiAmJiBvcHRpb24udGV4dCkge1xuXHRcdFx0XHRpdGVtcy5wdXNoKFxuXHRcdFx0XHRcdG5ldyBDaGVja0JveCh7XG5cdFx0XHRcdFx0XHR0ZXh0OiBvcHRpb24udGV4dCxcblx0XHRcdFx0XHRcdHNlbGVjdGVkOiB0cnVlLFxuXHRcdFx0XHRcdFx0c2VsZWN0OiBmdW5jdGlvbiAob0V2ZW50OiBDaGVja0JveCRTZWxlY3RFdmVudCk6IHZvaWQge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBjaGVja0JveCA9IG9FdmVudC5nZXRTb3VyY2UoKTtcblx0XHRcdFx0XHRcdFx0Y29uc3Qgc2VsZWN0ZWQgPSBjaGVja0JveC5nZXRTZWxlY3RlZCgpO1xuXHRcdFx0XHRcdFx0XHRvcHRpb24uc2VsZWN0ZWQgPSBzZWxlY3RlZDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG59XG5cbi8qKlxuICogR2V0IHRoZSBvcmlnaW5hbCByZWNvcmQgc2VsZWN0ZWQgb24gdGhlIFVJLlxuICpcbiAqIEluIHRoZSBjYXNlIHRoZSBjb250ZXh0IHRvIGRlbGV0ZSBpcyBhbiBhY3RpdmUgcmVjb3JkIGJ1dCB0aGUgc2VsZWN0ZWQgY29udGV4dCBpcyBhIGRyYWZ0IHJlY29yZC5cbiAqIEBwYXJhbSBtUGFyYW1ldGVycyBEZWxldGUgcGFyYW1ldGVycyBhbmQgaW5mb3JtYXRpb24gb2Ygc2VsZWN0ZWQgY29udGV4dHMuXG4gKiBAcGFyYW0gY29udGV4dFRvRGVsZXRlIE9EYXRhVjRDb250ZXh0IHRvIGNoZWNrLlxuICogQHJldHVybnMgT0RhdGFWNENvbnRleHQgZm9yIGRlbGV0ZS5cbiAqL1xuZnVuY3Rpb24gX2dldE9yaWdpbmFsU2VsZWN0ZWRSZWNvcmQobVBhcmFtZXRlcnM6IERlbGV0ZVBhcmFtZXRlcnMsIGNvbnRleHRUb0RlbGV0ZTogT0RhdGFWNENvbnRleHQpOiBPRGF0YVY0Q29udGV4dCB7XG5cdGNvbnN0IHsgZHJhZnRzV2l0aERlbGV0YWJsZUFjdGl2ZSB9ID0gbVBhcmFtZXRlcnM7XG5cdGNvbnN0IHJldCA9IGRyYWZ0c1dpdGhEZWxldGFibGVBY3RpdmU/LmZpbmQoKGRyYWZ0U2libGluZ1BhaXIpID0+IGRyYWZ0U2libGluZ1BhaXIuc2libGluZ0luZm8udGFyZ2V0Q29udGV4dCA9PT0gY29udGV4dFRvRGVsZXRlKTtcblx0cmV0dXJuIHJldD8uZHJhZnQgPyByZXQuZHJhZnQgOiBjb250ZXh0VG9EZWxldGU7XG59XG5cbi8qKlxuICogR2V0IHRoZSBwb3NzaWJsZSBvcHRpb25zIGZvciBkZWxldGlvbiBvZiB0aGUgc2VsZWN0ZWQgY29udGV4dHMuXG4gKiBAcGFyYW0gbVBhcmFtZXRlcnMgRGVsZXRlIHBhcmFtZXRlcnMgYW5kIGluZm9ybWF0aW9uIG9mIHNlbGVjdGVkIGNvbnRleHRzLlxuICogQHBhcmFtIGRpcmVjdERlbGV0YWJsZUNvbnRleHRzIENvbnRleHRzIHRoYXQgY2FuIGJlIGRlbGV0YWJsZSBkaXJlY3RseS5cbiAqIEBwYXJhbSByZXNvdXJjZU1vZGVsIFJlc291cmNlIG1vZGVsLlxuICogQHJldHVybnMgT3B0aW9ucyB0aGF0IGFyZSBwb3NzaWJsZSBmb3Igc2VsZWN0ZWQgcmVjb3Jkcy5cbiAqL1xuZnVuY3Rpb24gZ2V0T3B0aW9uc0ZvckRlbGV0YWJsZVRleHRzKFxuXHRtUGFyYW1ldGVyczogRGVsZXRlUGFyYW1ldGVycyxcblx0ZGlyZWN0RGVsZXRhYmxlQ29udGV4dHM6IE9EYXRhVjRDb250ZXh0W10sXG5cdHJlc291cmNlTW9kZWw6IFJlc291cmNlTW9kZWxcbik6IERlbGV0ZU9wdGlvbltdIHtcblx0bGV0IHsgbnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzLCBsb2NrZWRDb250ZXh0cywgZHJhZnRzV2l0aE5vbkRlbGV0YWJsZUFjdGl2ZSwgdW5TYXZlZENvbnRleHRzIH0gPSBtUGFyYW1ldGVycztcblx0Y29uc3QgeyBlbnRpdHlTZXROYW1lLCBwYXJlbnRDb250cm9sLCBkZXNjcmlwdGlvbiB9ID0gbVBhcmFtZXRlcnM7XG5cdGRyYWZ0c1dpdGhOb25EZWxldGFibGVBY3RpdmUgPz89IFtdO1xuXHR1blNhdmVkQ29udGV4dHMgPz89IFtdO1xuXHRsb2NrZWRDb250ZXh0cyA/Pz0gW107XG5cdGRyYWZ0c1dpdGhOb25EZWxldGFibGVBY3RpdmUgPz89IFtdO1xuXHRudW1iZXJPZlNlbGVjdGVkQ29udGV4dHMgPz89IDA7XG5cdGNvbnN0IHRvdGFsRGVsZXRhYmxlID0gZGlyZWN0RGVsZXRhYmxlQ29udGV4dHMubGVuZ3RoICsgZHJhZnRzV2l0aE5vbkRlbGV0YWJsZUFjdGl2ZS5sZW5ndGggKyB1blNhdmVkQ29udGV4dHMubGVuZ3RoO1xuXHRjb25zdCBub25EZWxldGFibGVDb250ZXh0cyA9IG51bWJlck9mU2VsZWN0ZWRDb250ZXh0cyAtIChsb2NrZWRDb250ZXh0cy5sZW5ndGggKyB0b3RhbERlbGV0YWJsZSAtIGRyYWZ0c1dpdGhOb25EZWxldGFibGVBY3RpdmUubGVuZ3RoKTtcblx0Y29uc3Qgb3B0aW9uczogRGVsZXRlT3B0aW9uW10gPSBbXTtcblxuXHRpZiAobnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzID09PSAxICYmIG51bWJlck9mU2VsZWN0ZWRDb250ZXh0cyA9PT0gZGlyZWN0RGVsZXRhYmxlQ29udGV4dHMubGVuZ3RoKSB7XG5cdFx0Ly8gc2luZ2xlIGRlbGV0YWJsZSBjb250ZXh0XG5cdFx0Y29uc3Qgb1RhYmxlID0gcGFyZW50Q29udHJvbCBhcyBUYWJsZTtcblx0XHRjb25zdCBzS2V5ID0gb1RhYmxlICYmICgob1RhYmxlLmdldFBhcmVudCgpIGFzIFRhYmxlQVBJKS5nZXRJZGVudGlmaWVyQ29sdW1uKCkgYXMgc3RyaW5nKTtcblx0XHRsZXQgdHh0O1xuXHRcdGlmIChzS2V5KSB7XG5cdFx0XHRjb25zdCBkZXNjcmlwdGlvblBhdGggPSBkZXNjcmlwdGlvbiAmJiAoZGVzY3JpcHRpb24gYXMgeyBwYXRoPzogc3RyaW5nIH0pLnBhdGg7XG5cdFx0XHRsZXQgc2luZ2xlQ29udGV4dCA9IGRpcmVjdERlbGV0YWJsZUNvbnRleHRzWzBdO1xuXHRcdFx0bGV0IG9MaW5lQ29udGV4dERhdGEgPSBzaW5nbGVDb250ZXh0LmdldE9iamVjdCgpO1xuXHRcdFx0aWYgKCFvTGluZUNvbnRleHREYXRhIHx8IE9iamVjdC5rZXlzKG9MaW5lQ29udGV4dERhdGEpLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0XHQvLyBJbiBjYXNlIG9yaWdpbmFsIHNlbGVjdGVkIHJlY29yZCBpcyBkcmFmdChpbiBVSSkuIFRoZSBBY3RpdmUgcmVjb3JkIG5lZWRzIHRvIGJlIGRlbGV0ZWQoZGlyZWN0RGVsZXRhYmxlQ29udGV4dHMgaGFzIGFjdGl2ZSByZWNvcmQpLCBidXQgZGF0YSBpcyBub3QgcmVxdWVzdGVkLiBXZSBnZXQgZGF0YSBmcm9tIHRoZSBkcmFmdC5cblx0XHRcdFx0c2luZ2xlQ29udGV4dCA9IF9nZXRPcmlnaW5hbFNlbGVjdGVkUmVjb3JkKG1QYXJhbWV0ZXJzLCBzaW5nbGVDb250ZXh0KTtcblx0XHRcdFx0b0xpbmVDb250ZXh0RGF0YSA9IHNpbmdsZUNvbnRleHQuZ2V0T2JqZWN0KCk7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBzS2V5VmFsdWUgPSBzS2V5ID8gb0xpbmVDb250ZXh0RGF0YVtzS2V5XSA6IHVuZGVmaW5lZDtcblx0XHRcdGNvbnN0IHNEZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uUGF0aCAmJiBvTGluZUNvbnRleHREYXRhW2Rlc2NyaXB0aW9uUGF0aF07XG5cdFx0XHRpZiAoc0tleVZhbHVlKSB7XG5cdFx0XHRcdGlmIChzRGVzY3JpcHRpb24gJiYgZGVzY3JpcHRpb24gJiYgc0tleSAhPT0gKGRlc2NyaXB0aW9uIGFzIHsgcGF0aD86IHN0cmluZyB9KS5wYXRoKSB7XG5cdFx0XHRcdFx0dHh0ID0gcmVzb3VyY2VNb2RlbC5nZXRUZXh0KFxuXHRcdFx0XHRcdFx0XCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9DT05GSVJNX0RFTEVURV9XSVRIX09CSkVDVElORk9cIixcblx0XHRcdFx0XHRcdFtzS2V5VmFsdWUsIHNEZXNjcmlwdGlvbl0sXG5cdFx0XHRcdFx0XHRlbnRpdHlTZXROYW1lXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR0eHQgPSByZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9DT05GSVJNX0RFTEVURV9XSVRIX09CSkVDVFRJVExFX09OTFlcIiwgW3NLZXlWYWx1ZV0sIGVudGl0eVNldE5hbWUpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0eHQgPSByZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9DT05GSVJNX0RFTEVURV9XSVRIX09CSkVDVFRJVExFX1NJTkdVTEFSXCIsIHVuZGVmaW5lZCwgZW50aXR5U2V0TmFtZSk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdHR4dCA9IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0NPTkZJUk1fREVMRVRFX1dJVEhfT0JKRUNUVElUTEVfU0lOR1VMQVJcIiwgdW5kZWZpbmVkLCBlbnRpdHlTZXROYW1lKTtcblx0XHR9XG5cdFx0b3B0aW9ucy5wdXNoKHtcblx0XHRcdHR5cGU6IERlbGV0ZU9wdGlvblR5cGVzLmRlbGV0YWJsZUNvbnRleHRzLFxuXHRcdFx0Y29udGV4dHM6IGRpcmVjdERlbGV0YWJsZUNvbnRleHRzLFxuXHRcdFx0dGV4dDogdHh0LFxuXHRcdFx0c2VsZWN0ZWQ6IHRydWUsXG5cdFx0XHRjb250cm9sOiBEZWxldGVEaWFsb2dDb250ZW50Q29udHJvbC5URVhUXG5cdFx0fSk7XG5cdH0gZWxzZSBpZiAoXG5cdFx0dW5TYXZlZENvbnRleHRzLmxlbmd0aCAhPT0gdG90YWxEZWxldGFibGUgJiZcblx0XHRudW1iZXJPZlNlbGVjdGVkQ29udGV4dHMgPiAwICYmXG5cdFx0KGRpcmVjdERlbGV0YWJsZUNvbnRleHRzLmxlbmd0aCA+IDAgfHwgKHVuU2F2ZWRDb250ZXh0cy5sZW5ndGggPiAwICYmIGRyYWZ0c1dpdGhOb25EZWxldGFibGVBY3RpdmUubGVuZ3RoID4gMCkpXG5cdCkge1xuXHRcdGlmIChudW1iZXJPZlNlbGVjdGVkQ29udGV4dHMgPiBkaXJlY3REZWxldGFibGVDb250ZXh0cy5sZW5ndGggJiYgbm9uRGVsZXRhYmxlQ29udGV4dHMgKyBsb2NrZWRDb250ZXh0cy5sZW5ndGggPiAwKSB7XG5cdFx0XHQvLyBvdGhlciB0eXBlcyBleGlzdHMgd2l0aCBwdXJlIGRlbGV0YWJsZSBvbmVzXG5cdFx0XHRsZXQgZGVsZXRhYmxlT3B0aW9uVHh0ID0gXCJcIjtcblx0XHRcdGlmICh0b3RhbERlbGV0YWJsZSA9PT0gMSkge1xuXHRcdFx0XHRkZWxldGFibGVPcHRpb25UeHQgPSByZXNvdXJjZU1vZGVsLmdldFRleHQoXG5cdFx0XHRcdFx0XCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9DT05GSVJNX0RFTEVURV9XSVRIX09CSkVDVFRJVExFX1NJTkdVTEFSX05PTl9ERUxFVEFCTEVcIixcblx0XHRcdFx0XHR1bmRlZmluZWQsXG5cdFx0XHRcdFx0ZW50aXR5U2V0TmFtZVxuXHRcdFx0XHQpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZGVsZXRhYmxlT3B0aW9uVHh0ID0gcmVzb3VyY2VNb2RlbC5nZXRUZXh0KFxuXHRcdFx0XHRcdFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfQ09ORklSTV9ERUxFVEVfV0lUSF9PQkpFQ1RUSVRMRV9QTFVSQUxfTk9OX0RFTEVUQUJMRVwiLFxuXHRcdFx0XHRcdHVuZGVmaW5lZCxcblx0XHRcdFx0XHRlbnRpdHlTZXROYW1lXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0XHRvcHRpb25zLnVuc2hpZnQoe1xuXHRcdFx0XHR0eXBlOiBEZWxldGVPcHRpb25UeXBlcy5kZWxldGFibGVDb250ZXh0cyxcblx0XHRcdFx0Y29udGV4dHM6IGRpcmVjdERlbGV0YWJsZUNvbnRleHRzLFxuXHRcdFx0XHR0ZXh0OiBkZWxldGFibGVPcHRpb25UeHQsXG5cdFx0XHRcdHNlbGVjdGVkOiB0cnVlLFxuXHRcdFx0XHRjb250cm9sOiBEZWxldGVEaWFsb2dDb250ZW50Q29udHJvbC5URVhUXG5cdFx0XHR9KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gb25seSBkZWxldGFibGVcblx0XHRcdGNvbnN0IGFsbERlbGV0YWJsZVR4dCA9XG5cdFx0XHRcdHRvdGFsRGVsZXRhYmxlID09PSAxXG5cdFx0XHRcdFx0PyByZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9DT05GSVJNX0RFTEVURV9XSVRIX09CSkVDVFRJVExFX1NJTkdVTEFSXCIsIHVuZGVmaW5lZCwgZW50aXR5U2V0TmFtZSlcblx0XHRcdFx0XHQ6IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0NPTkZJUk1fREVMRVRFX1dJVEhfT0JKRUNUVElUTEVfUExVUkFMXCIsIHVuZGVmaW5lZCwgZW50aXR5U2V0TmFtZSk7XG5cdFx0XHRvcHRpb25zLnB1c2goe1xuXHRcdFx0XHR0eXBlOiBEZWxldGVPcHRpb25UeXBlcy5kZWxldGFibGVDb250ZXh0cyxcblx0XHRcdFx0Y29udGV4dHM6IGRpcmVjdERlbGV0YWJsZUNvbnRleHRzLFxuXHRcdFx0XHR0ZXh0OiBhbGxEZWxldGFibGVUeHQsXG5cdFx0XHRcdHNlbGVjdGVkOiB0cnVlLFxuXHRcdFx0XHRjb250cm9sOiBEZWxldGVEaWFsb2dDb250ZW50Q29udHJvbC5URVhUXG5cdFx0XHR9KTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gb3B0aW9ucztcbn1cblxuYXN5bmMgZnVuY3Rpb24gZGVsZXRlRHJhZnRzQmVmb3JlQWN0aXZlc0FuZEdldEVycm9ycyhcblx0ZHJhZnRzVG9EZWxldGVCZWZvcmVBY3RpdmU6IE9EYXRhVjRDb250ZXh0W10sXG5cdG1lc3NhZ2VIYW5kbGVyOiBNZXNzYWdlSGFuZGxlcixcblx0YXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsXG5cdGVuYWJsZVN0cmljdEhhbmRsaW5nOiBib29sZWFuXG4pOiBQcm9taXNlPHVua25vd25bXT4ge1xuXHRjb25zdCBkcmFmdEVycm9yczogdW5rbm93bltdID0gW107XG5cdGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChcblx0XHRkcmFmdHNUb0RlbGV0ZUJlZm9yZUFjdGl2ZS5tYXAoYXN5bmMgZnVuY3Rpb24gKGNvbnRleHQ6IE9EYXRhVjRDb250ZXh0KSB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRyZXR1cm4gYXdhaXQgZHJhZnQuZGVsZXRlRHJhZnQoY29udGV4dCwgbWVzc2FnZUhhbmRsZXIsIGFwcENvbXBvbmVudCwgZW5hYmxlU3RyaWN0SGFuZGxpbmcpO1xuXHRcdFx0fSBjYXRjaCAoZTogdW5rbm93bikge1xuXHRcdFx0XHRMb2cuZXJyb3IoYEZFIDogY29yZSA6IERlbGV0ZUhlbHBlciA6IEVycm9yIHdoaWxlIGRpc2NhcmRpbmcgZHJhZnQgd2l0aCBwYXRoIDogJHtjb250ZXh0LmdldFBhdGgoKX1gKTtcblx0XHRcdFx0ZHJhZnRFcnJvcnMucHVzaChlKTtcblx0XHRcdH1cblx0XHR9KVxuXHQpO1xuXHRyZXR1cm4gZHJhZnRFcnJvcnM7XG59XG5cbmZ1bmN0aW9uIGhhbmRsZVRyZWVUYWJsZUNvbnRleHRzKGNvbnRleHRzOiBPRGF0YVY0Q29udGV4dFtdLCBpblRyZWVUYWJsZTogYm9vbGVhbik6IE9EYXRhVjRDb250ZXh0W10ge1xuXHRsZXQgY29udGV4dHNUb0RlbGV0ZSA9IGNvbnRleHRzO1xuXHRpZiAoaW5UcmVlVGFibGUpIHtcblx0XHRjb25zdCB0ZW1wQ29udGV4dHM6IChPRGF0YVY0Q29udGV4dCB8IHVuZGVmaW5lZClbXSA9IFsuLi5jb250ZXh0c107XG5cdFx0Ly8gRmlsdGVyIG91dCBjb250ZXh0cyB3aG9zZSBhbmNlc3RvciBpcyBhbHNvIGRlbGV0ZWQsIGFzIHRoZXkgd2lsbCBiZSBkZWxldGVkIHdpdGggdGhlaXIgYW5jZXN0b3Jcblx0XHR0ZW1wQ29udGV4dHMuZm9yRWFjaCgocGFyZW50Q29udGV4dCwgcGFyZW50SW5kZXgpID0+IHtcblx0XHRcdGlmIChwYXJlbnRDb250ZXh0ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRmb3IgKGxldCBjaGlsZEluZGV4ID0gcGFyZW50SW5kZXggKyAxOyBjaGlsZEluZGV4IDwgdGVtcENvbnRleHRzLmxlbmd0aDsgY2hpbGRJbmRleCsrKSB7XG5cdFx0XHRcdGNvbnN0IGNoaWxkQ29udGV4dCA9IHRlbXBDb250ZXh0c1tjaGlsZEluZGV4XTtcblx0XHRcdFx0aWYgKGNoaWxkQ29udGV4dCAmJiBwYXJlbnRDb250ZXh0LmlzQW5jZXN0b3JPZihjaGlsZENvbnRleHQpKSB7XG5cdFx0XHRcdFx0dGVtcENvbnRleHRzW2NoaWxkSW5kZXhdID0gdW5kZWZpbmVkO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHRjb250ZXh0c1RvRGVsZXRlID0gdGVtcENvbnRleHRzLmZpbHRlcigoY29udGV4dCkgPT4gY29udGV4dCAhPT0gdW5kZWZpbmVkKSBhcyBPRGF0YVY0Q29udGV4dFtdO1xuXHR9XG5cdHJldHVybiBjb250ZXh0c1RvRGVsZXRlO1xufVxuXG5hc3luYyBmdW5jdGlvbiBkZWxldGVDb25maXJtSGFuZGxlcihcblx0b3B0aW9uczogRGVsZXRlT3B0aW9uW10sXG5cdG1QYXJhbWV0ZXJzOiBEZWxldGVQYXJhbWV0ZXJzLFxuXHRtZXNzYWdlSGFuZGxlcjogTWVzc2FnZUhhbmRsZXIsXG5cdHJlc291cmNlTW9kZWw6IFJlc291cmNlTW9kZWwsXG5cdGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LFxuXHRkcmFmdEVuYWJsZWQ6IGJvb2xlYW4sXG5cdGluVHJlZVRhYmxlOiBib29sZWFuXG4pOiBQcm9taXNlPHZvaWQ+IHtcblx0dHJ5IHtcblx0XHRjb25zdCBjb250ZXh0cyA9IGRlbGV0ZUhlbHBlci5nZXRDb25maXJtZWREZWxldGFibGVDb250ZXh0KFtdLCBvcHRpb25zKTtcblx0XHRjb25zdCBsYXN0RGVsZXRlZFJvd0luZGV4ID0gY29udGV4dHNbY29udGV4dHMubGVuZ3RoIC0gMV0uZ2V0SW5kZXgoKSA/PyAtMTtcblx0XHRjb25zdCBkcmFmdHNUb0RlbGV0ZUJlZm9yZUFjdGl2ZSA9IGdldERyYWZ0c1RvRGVsZXRlQmVmb3JlQWN0aXZlKG9wdGlvbnMpO1xuXG5cdFx0Y29uc3QgeyBiZWZvcmVEZWxldGVDYWxsQmFjaywgcGFyZW50Q29udHJvbCB9ID0gbVBhcmFtZXRlcnM7XG5cdFx0aWYgKGJlZm9yZURlbGV0ZUNhbGxCYWNrKSB7XG5cdFx0XHRhd2FpdCBiZWZvcmVEZWxldGVDYWxsQmFjayh7IGNvbnRleHRzOiBjb250ZXh0cyB9KTtcblx0XHR9XG5cblx0XHRpZiAoY29udGV4dHMgJiYgY29udGV4dHMubGVuZ3RoKSB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRjb25zdCBlbmFibGVTdHJpY3RIYW5kbGluZyA9IGNvbnRleHRzLmxlbmd0aCA9PT0gMSA/IHRydWUgOiBmYWxzZTtcblx0XHRcdFx0Y29uc3QgZHJhZnRFcnJvcnM6IHVua25vd25bXSA9IGF3YWl0IGRlbGV0ZURyYWZ0c0JlZm9yZUFjdGl2ZXNBbmRHZXRFcnJvcnMoXG5cdFx0XHRcdFx0ZHJhZnRzVG9EZWxldGVCZWZvcmVBY3RpdmUsXG5cdFx0XHRcdFx0bWVzc2FnZUhhbmRsZXIsXG5cdFx0XHRcdFx0YXBwQ29tcG9uZW50LFxuXHRcdFx0XHRcdGVuYWJsZVN0cmljdEhhbmRsaW5nXG5cdFx0XHRcdCk7XG5cblx0XHRcdFx0Y29uc3QgY29udGV4dHNUb0RlbGV0ZSA9IGhhbmRsZVRyZWVUYWJsZUNvbnRleHRzKGNvbnRleHRzLCBpblRyZWVUYWJsZSk7XG5cblx0XHRcdFx0YXdhaXQgUHJvbWlzZS5hbGwoXG5cdFx0XHRcdFx0Y29udGV4dHNUb0RlbGV0ZS5tYXAoYXN5bmMgZnVuY3Rpb24gKGNvbnRleHQ6IE9EYXRhVjRDb250ZXh0KSB7XG5cdFx0XHRcdFx0XHQvLyBJZiB0aGUgY29udGV4dCB0byBkZWxldGUgaXMgYSBkcmFmdCAoaS5lLiBhY3V0YWxseSB3ZSBqdXN0IHduYXQgdG8gZGlzY2FyZCksIHdlIHNob3VsZCB1c2UgZHJhZnQuZGVsZXRlRHJhZnQgaW4gb3JkZXIgdG8gdXNlIGEgZGlzY2FyZCBhY3Rpb24gaWYgZGVmaW5lZFxuXHRcdFx0XHRcdFx0Ly8gSG93ZXZlciwgZHJhZnQuZGVsZXRlRHJhZnQgdXNlcyBnZXRQcm9wZXJ0eSwgd2hpY2ggcmV0dXJucyB1bmRlZmluZWQgaWYgdGhlIGNvbnRleHQgaXMgbm90IHJlYWQgZnJvbSB0aGUgYmFja2VuZC5cblx0XHRcdFx0XHRcdC8vIFRoaXMgY2FuIGJlIHRoZSBjYXNlLCBpZiB3ZSBoYXZlIHJldHJpZXZlZCB0aGlzIGNvbnRleHQgdmlhIHRoZSBzaWJsaW5nIChlLmcuIHdoZW4gYSBkcmFmdCBleGlzdGVkIGFuZCB3ZSB3YW50IHRvIGRlbGV0ZSBib3RoIC0gaW4gdGhhdCBjYXNlXG5cdFx0XHRcdFx0XHQvLyB3ZSBoYXZlIGFscmVhZHkgZGlzY2FyZGVkIHRoZSBkcmFmdCBhYm92ZSwgYW5kIG5vdyBuZWVkIHRvIGRlbGV0ZSB0aGUgYWN0aXZlIG9uZSkuIFRvIGlkZW50aWZ5IHRoaXMgc2l0dWF0aW9uLCB3ZSBtdXN0IG5vdCB1c2UgZ2V0UHJvcGVydHlcblx0XHRcdFx0XHRcdC8vIChhcyB0aGUgY29udGV4dCBpcyBub3QgcmVhZCksIGJ1dCBjaGVjayB0aGUgc2FtZSBpbiB0aGUgbVBhcmFtZXRlcnMuXG5cdFx0XHRcdFx0XHQvLyBJbiB0aGlzIGNhc2UsIHdlIGNhbiBqdXN0IGRlbGV0ZSB0aGUgY29udGV4dC4gQnV0IHdlIHNob3VsZCBub3QgdXNlIGNvbnRleHQuZGVsZXRlIChhbHNvIHVwZGF0aW5nIGJpbmRpbmdzLCB3aGljaCBmYWlscyBpbiB0aGUgZGVzY3JpYmVkIHNpdHVhdGlvbiksXG5cdFx0XHRcdFx0XHQvLyBidXQgbW9kZWwuZGVsZXRlIChvbmx5IHNlbmRpbmcgdGhlIGRlbGV0ZSkuIEluIG90aGVyIGNhc2VzIChlLmcuIG5vbi1kcmFmdCksIHRoaXMgaXMgYWxzbyBzdWZmaWNpZW50LCBhcyB3ZSBhbnl3YXkgdGFrZSBjYXJlIG9mIHNldHRpbmdcblx0XHRcdFx0XHRcdC8vIGNvcnJlY3QgYmlkbmluZ3Mgd2l0aCB0aGUgbmF2aWdhdGlvbiB0cmlnZ2VyZWQgYnkgdGhlIGRlbGV0aW9uLlxuXHRcdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0XHQhZHJhZnRFbmFibGVkIHx8XG5cdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmRyYWZ0c1dpdGhEZWxldGFibGVBY3RpdmU/LmZpbmQoXG5cdFx0XHRcdFx0XHRcdFx0KGRyYWZ0V2l0aERlbGV0YWJsZUFjdGl2ZSkgPT4gZHJhZnRXaXRoRGVsZXRhYmxlQWN0aXZlLnNpYmxpbmdJbmZvLnRhcmdldENvbnRleHQgPT09IGNvbnRleHRcblx0XHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdGNvbnRleHQucmVzZXRDaGFuZ2VzKCk7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBjb250ZXh0LmdldE1vZGVsKCkuZGVsZXRlKGNvbnRleHQuZ2V0Q2Fub25pY2FsUGF0aCgpKTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBkcmFmdC5kZWxldGVEcmFmdChjb250ZXh0LCBtZXNzYWdlSGFuZGxlciwgYXBwQ29tcG9uZW50LCBlbmFibGVTdHJpY3RIYW5kbGluZyk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0KTtcblx0XHRcdFx0ZGVsZXRlSGVscGVyLmFmdGVyRGVsZXRlUHJvY2VzcyhtUGFyYW1ldGVycywgb3B0aW9ucywgY29udGV4dHMsIHJlc291cmNlTW9kZWwsIGxhc3REZWxldGVkUm93SW5kZXgpO1xuXHRcdFx0XHRpZiAoZHJhZnRFcnJvcnMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdHRocm93IEVycm9yKGBGRSA6IGNvcmUgOiBEZWxldGVIZWxwZXIgOiBFcnJvcnMgb24gZHJhZnQgZGVsZXRlIDogJHtkcmFmdEVycm9yc31gKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0aWYgKGNvbnRleHRzLmxlbmd0aCA+IDEpIHtcblx0XHRcdFx0XHRkZWxldGVIZWxwZXIuYWRkR2VuZXJpY0RlbGV0ZUZhaWx1cmVNZXNzYWdlKHJlc291cmNlTW9kZWwpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGF3YWl0IG1lc3NhZ2VIYW5kbGVyLnNob3dNZXNzYWdlRGlhbG9nKHsgY29udHJvbDogcGFyZW50Q29udHJvbCB9KTtcblx0XHRcdFx0Ly8gcmUtdGhyb3cgZXJyb3IgdG8gZW5mb3JjZSByZWplY3RpbmcgdGhlIGdlbmVyYWwgcHJvbWlzZVxuXHRcdFx0XHR0aHJvdyBlcnJvcjtcblx0XHRcdH1cblx0XHR9XG5cdH0gY2F0Y2ggKG9FcnJvcikge1xuXHRcdGF3YWl0IG1lc3NhZ2VIYW5kbGVyLnNob3dNZXNzYWdlcygpO1xuXHRcdC8vIHJlLXRocm93IGVycm9yIHRvIGVuZm9yY2UgcmVqZWN0aW5nIHRoZSBnZW5lcmFsIHByb21pc2Vcblx0XHR0aHJvdyBvRXJyb3I7XG5cdH1cbn1cblxuLyoqXG4gKiBBZGRpbmcgYSBnZW5lcmljIGRlbGV0ZSBmYWlsdXJlIG1lc3NhZ2UgdG8gbWVzc2FnZSBtb2RlbCBmb3IgcmVhZGFiaWxpdHkuXG4gKiBAcGFyYW0gcmVzb3VyY2VNb2RlbCBSZXNvdXJjZSBtb2RlbCBmb3IgbWVzc2FnZSB0ZXh0XG4gKi9cbmZ1bmN0aW9uIGFkZEdlbmVyaWNEZWxldGVGYWlsdXJlTWVzc2FnZShyZXNvdXJjZU1vZGVsOiBSZXNvdXJjZU1vZGVsKTogdm9pZCB7XG5cdE1lc3NhZ2luZy5hZGRNZXNzYWdlcyhcblx0XHRuZXcgTWVzc2FnZSh7XG5cdFx0XHRtZXNzYWdlOiByZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX0NPTU1PTl9ERUxFVEVfQ0hBTkdFU0VUX0ZBSUxVUkVfTVVMVElQTEVfRVJST1JTX1RFWFRcIiksXG5cdFx0XHR0eXBlOiBNZXNzYWdlVHlwZS5FcnJvcixcblx0XHRcdHRhcmdldDogdW5kZWZpbmVkLFxuXHRcdFx0cGVyc2lzdGVudDogdHJ1ZSxcblx0XHRcdGNvZGU6IFwiRkVfQ1VTVE9NX01FU1NBR0VfQ0hBTkdFU0VUX0FMTF9GQUlMRURcIixcblx0XHRcdGRlc2NyaXB0aW9uOiByZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX0NPTU1PTl9ERUxFVEVfQ0hBTkdFU0VUX0ZBSUxVUkVfTVVMVElQTEVfRVJST1JTX0RFVEFJTFNfVEVYVFwiKSxcblx0XHRcdHRlY2huaWNhbERldGFpbHM6IHtcblx0XHRcdFx0ZmU6IHtcblx0XHRcdFx0XHRjaGFuZ2VTZXRQcmVUZXh0Rm9yU2luZ2xlRXJyb3I6IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfQ09NTU9OX0RFTEVURV9DSEFOR0VTRVRfRkFJTFVSRV9TSU5HTEVfRVJST1JfVEVYVFwiKVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSlcblx0KTtcbn1cblxuLyoqXG4gKiBDb2xsZWN0IGNvbnRleHQgaW5mb3JtYXRpb24gKGlzRHJhZnRSb290LCBpc0RyYWZ0Tm9kZSwgSGFzRHJhZnRFbnRpdHksIElzQWN0aXZlRW50aXR5LCBIYXNBY3RpdmVFbnRpdHksIGlzTG9ja2VkLCBpc0luYWN0aXZlKS5cbiAqIEBwYXJhbSBjb250ZXh0IENvbnRleHQgdG8gZXZhbHVhdGUuXG4gKiBAcmV0dXJucyBUaGUgY29udGV4dCBpbmZvIHByb21pc2UuXG4gKi9cbmZ1bmN0aW9uIGdldENvbnRleHRJbmZvcyhjb250ZXh0OiBPRGF0YVY0Q29udGV4dCk6IENvbnRleHRJbmZvIHtcblx0Y29uc3QgaXNUcmFuc2llbnQgPSAhIWNvbnRleHQ/LmdldE9iamVjdCgpW1wiQCR1aTUuY29udGV4dC5pc1RyYW5zaWVudFwiXTtcblx0Y29uc3QgaXNJbmFjdGl2ZSA9IGNvbnRleHQ/LmlzSW5hY3RpdmUoKTtcblx0Y29uc3QgbWV0YUNvbnRleHQgPVxuXHRcdGlzSW5hY3RpdmUgfHwgKCFpc0luYWN0aXZlICYmIGlzVHJhbnNpZW50KVxuXHRcdFx0PyB1bmRlZmluZWRcblx0XHRcdDogY29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpLmdldE1ldGFDb250ZXh0KGNvbnRleHQuZ2V0Q2Fub25pY2FsUGF0aCgpKTtcblx0Y29uc3QgZGVsZXRhYmxlUGF0aCA9IG1ldGFDb250ZXh0Py5nZXRQcm9wZXJ0eShcIkBPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLkRlbGV0ZVJlc3RyaWN0aW9ucy9EZWxldGFibGUvJFBhdGhcIik7XG5cdGNvbnN0IHN0YXRpY0RlbGV0YWJsZSA9ICFkZWxldGFibGVQYXRoICYmIG1ldGFDb250ZXh0Py5nZXRQcm9wZXJ0eShcIkBPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLkRlbGV0ZVJlc3RyaWN0aW9ucy9EZWxldGFibGVcIikgIT09IGZhbHNlO1xuXHRjb25zdCBkZWxldGFibGUgPSBkZWxldGFibGVQYXRoID8gY29udGV4dC5nZXRQcm9wZXJ0eShkZWxldGFibGVQYXRoKSA6IHN0YXRpY0RlbGV0YWJsZTtcblxuXHRjb25zdCBpbmZvOiBDb250ZXh0SW5mbyA9IHtcblx0XHRjb250ZXh0OiBjb250ZXh0LFxuXHRcdGlzRHJhZnRSb290OiAhIW1ldGFDb250ZXh0Py5nZXRQcm9wZXJ0eShcIkBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnRSb290XCIpLFxuXHRcdGlzRHJhZnROb2RlOiAhIW1ldGFDb250ZXh0Py5nZXRQcm9wZXJ0eShcIkBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnROb2RlXCIpLFxuXHRcdGlzQWN0aXZlOiB0cnVlLFxuXHRcdGhhc0FjdGl2ZTogZmFsc2UsXG5cdFx0aGFzRHJhZnQ6IGZhbHNlLFxuXHRcdGxvY2tlZDogZmFsc2UsXG5cdFx0Ly8gZm9yIGFuIGVtcHR5Um93IChpbmFjdGl2ZSBjb250ZXh0KSBpdCdzIGFsd2F5cyBkZWxldGFibGUgYXMgbG9uZyBhcyB0aGUgY29udGV4dCBrZXB0IGluYWN0aXZlLi5cblx0XHRkZWxldGFibGU6IGRlbGV0YWJsZSxcblx0XHRzaWJsaW5nUHJvbWlzZTogUHJvbWlzZS5yZXNvbHZlKHVuZGVmaW5lZCksXG5cdFx0c2libGluZ0luZm86IHVuZGVmaW5lZCxcblx0XHRzaWJsaW5nRGVsZXRhYmxlOiBmYWxzZSxcblx0XHRpc0luYWN0aXZlQ29udGV4dDogISFjb250ZXh0LmlzSW5hY3RpdmUoKVxuXHR9O1xuXHRpZiAoIWNvbnRleHQuaXNJbmFjdGl2ZSgpICYmIGluZm8uaXNEcmFmdFJvb3QpIHtcblx0XHRpbmZvLmxvY2tlZCA9ICEhY29udGV4dC5nZXRPYmplY3QoXCJEcmFmdEFkbWluaXN0cmF0aXZlRGF0YVwiKT8uSW5Qcm9jZXNzQnlVc2VyO1xuXHRcdGluZm8uaGFzRHJhZnQgPSBjb250ZXh0LmdldFByb3BlcnR5KFwiSGFzRHJhZnRFbnRpdHlcIik7XG5cdFx0aW5mby5pc0FjdGl2ZSA9IGNvbnRleHQuZ2V0UHJvcGVydHkoXCJJc0FjdGl2ZUVudGl0eVwiKTtcblx0XHRpbmZvLmhhc0FjdGl2ZSA9IGNvbnRleHQuZ2V0UHJvcGVydHkoXCJIYXNBY3RpdmVFbnRpdHlcIik7XG5cdFx0aWYgKCFpbmZvLmlzQWN0aXZlICYmIGluZm8uaGFzQWN0aXZlKSB7XG5cdFx0XHQvLyBnZXQgc2libGluZyBjb250ZXh0cyAob25seSByZWxldmFudCBmb3IgZHJhZnQgcm9vdCwgbm90IGZvciBub2Rlcylcblx0XHRcdC8vIGRyYWZ0LmNvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24gZXhwZWN0cyBkcmFmdCByb290IGFzIGZpcnN0IHBhcmFtZXRlciAtIGlmIHdlIGFyZSBvbiBhIHN1Ym5vZGUsIHRoaXMgaXMgbm90IGdpdmVuXG5cdFx0XHQvLyAtIGRvbmUgd3JvbmcgYWxzbyBhYm92ZSwgYnV0IHNlZW1zIG5vdCB0byBicmVhayBhbnl0aGluZ1xuXHRcdFx0Ly8gLSB3aHkgaXMgZHJhZnQuY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbiBub3QgYWJsZSB0byBjYWxjdWxhdGUgZHJhZnQgcm9vdCBvbiBpdHMgb3duPyFcblx0XHRcdC8vIC0gYW5kIHdoeSBpcyBpdCBub3QgYWJsZSB0byBkZWFsIHdpdGggY29udGV4dHMgbm90IGRyYWZ0IGVuYWJsZWQgKG9mIGNvdXJzZSB0aGV5IG5ldmVyIGhhdmUgYSBzaWJsaW5nIC0gY291bGQganVzdCByZXR1cm4gdW5kZWZpbmVkKVxuXHRcdFx0aW5mby5zaWJsaW5nUHJvbWlzZSA9IGRyYWZ0LmNvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24oY29udGV4dCwgY29udGV4dCkudGhlbihhc3luYyAoc2libGluZ0luZm9ybWF0aW9uKSA9PiB7XG5cdFx0XHRcdC8vIEZvciBkcmFmdFdpdGhEZWxldGFibGVBY3RpdmUgYnVja2V0LCBjdXJyZW50bHkgYWxzbyBzaWJsaW5nSW5mb3JtYXRpb24gaXMgcHV0IGludG8gaW50ZXJuYWxNb2RlbCBhbmQgdXNlZFxuXHRcdFx0XHQvLyBmcm9tIHRoZXJlIGluIGNhc2Ugb2YgZGVsZXRpb24uIFRoZXJlZm9yZSwgc2libGluZyBuZWVkcyB0byBiZSByZXRyaWV2ZWQgaW4gY2FzZSBvZiBzdGF0aWNEZWxldGFibGUuXG5cdFx0XHRcdC8vIFBvc3NpYmxlIGltcHJvdmVtZW50OiBPbmx5IHJlYWQgc2libGluZ0luZm8gaGVyZSBpZiBuZWVkZWQgZm9yIGRldGVybWluYXRpb24gb2YgZGVsZXRlIGJ1dHRvbiBlbmFibGVtZW50LFxuXHRcdFx0XHQvLyBpbiBvdGhlciBjYXNlcywgcmVhZCBpdCBvbmx5IGlmIGRlbGV0aW9uIHJlYWxseSBoYXBwZW5zLlxuXHRcdFx0XHRpbmZvLnNpYmxpbmdJbmZvID0gc2libGluZ0luZm9ybWF0aW9uO1xuXHRcdFx0XHRpZiAoZGVsZXRhYmxlUGF0aCkge1xuXHRcdFx0XHRcdGluZm8uc2libGluZ0RlbGV0YWJsZSA9IGF3YWl0IHNpYmxpbmdJbmZvcm1hdGlvbj8udGFyZ2V0Q29udGV4dD8ucmVxdWVzdFByb3BlcnR5KGRlbGV0YWJsZVBhdGgpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGluZm8uc2libGluZ0RlbGV0YWJsZSA9IHN0YXRpY0RlbGV0YWJsZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBpbmZvO1xufVxuXG4vLyBUYWJsZSBSdW50aW1lIEhlbHBlcnM6XG5cbi8qIHJlZnJlc2hlcyBkYXRhIGluIGludGVybmFsIG1vZGVsIHJlbGV2YW50IGZvciBlbmFibGVtZW50IG9mIGRlbGV0ZSBidXR0b24gYWNjb3JkaW5nIHRvIHNlbGVjdGVkIGNvbnRleHRzXG5yZWxldmFudCBkYXRhIGFyZTogZGVsZXRhYmxlQ29udGV4dHMsIGRyYWZ0c1dpdGhEZWxldGFibGVBY3RpdmUsIGRyYWZ0c1dpdGhOb25EZWxldGFibGVBY3RpdmUsIHVuU2F2ZWRDb250ZXh0cywgZGVsZXRlRW5hYmxlZFxubm90IHJlbGV2YW50OiBsb2NrZWRDb250ZXh0c1xuKi9cbmFzeW5jIGZ1bmN0aW9uIHVwZGF0ZURlbGV0ZUluZm9Gb3JTZWxlY3RlZENvbnRleHRzKFxuXHRpbnRlcm5hbE1vZGVsQ29udGV4dDogSW50ZXJuYWxNb2RlbENvbnRleHQsXG5cdHNlbGVjdGVkQ29udGV4dHM6IE9EYXRhVjRDb250ZXh0W10sXG5cdGZvckNvbnRleHRNZW51ID0gZmFsc2Vcbik6IFByb21pc2U8dm9pZD4ge1xuXHRjb25zdCBjb250ZXh0SW5mb3MgPSBzZWxlY3RlZENvbnRleHRzLm1hcChnZXRDb250ZXh0SW5mb3MpO1xuXG5cdC8vIHdhaXQgZm9yIGFsbCBzaWJsaW5nUHJvbWlzZXMuIElmIG5vIHNpYmxpbmcgZXhpc3RzLCBwcm9taXNlIGlzIHJlc29sdmVkIHRvIHVuZGVmaW5lZCAoYnV0IGl0J3Mgc3RpbGwgYSBwcm9taXNlKVxuXHRhd2FpdCBQcm9taXNlLmFsbChjb250ZXh0SW5mb3MubWFwKGFzeW5jIChpbmZvKSA9PiBpbmZvLnNpYmxpbmdQcm9taXNlKSk7XG5cblx0Y29uc3QgYnVja2V0cyA9IFtcblx0XHR7XG5cdFx0XHRrZXk6IFwiZHJhZnRzV2l0aERlbGV0YWJsZUFjdGl2ZVwiLFxuXHRcdFx0Ly8gb25seSBmb3IgZHJhZnQgcm9vdDogSW4gdGhhdCBjYXNlLCB0aGUgZGVsZXRlIHJlcXVlc3QgbmVlZHMgdG8gYmUgc2VudCBmb3IgdGhlIGFjdGl2ZSAoaS5lLiB0aGUgc2libGluZyksXG5cdFx0XHQvLyB3aGlsZSBpbiBkcmFmdCBub2RlLCB0aGUgZGVsZXRlIHJlcXVlc3QgbmVlZHMgdG8gYmUgc2VuZCBmb3IgdGhlIGRyYWZ0IGl0c2VsZlxuXHRcdFx0dmFsdWU6IGNvbnRleHRJbmZvcy5maWx0ZXIoXG5cdFx0XHRcdChpbmZvKSA9PiAhaW5mby5pc0luYWN0aXZlQ29udGV4dCAmJiBpbmZvLmlzRHJhZnRSb290ICYmICFpbmZvLmlzQWN0aXZlICYmIGluZm8uaGFzQWN0aXZlICYmIGluZm8uc2libGluZ0RlbGV0YWJsZVxuXHRcdFx0KVxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0a2V5OiBcImRyYWZ0c1dpdGhOb25EZWxldGFibGVBY3RpdmVcIixcblx0XHRcdC8vIG9ubHkgZm9yIGRyYWZ0IHJvb3Q6IEZvciBkcmFmdCBub2RlLCB3ZSBvbmx5IHJlbHkgb24gaW5mb3JtYXRpb24gaW4gdGhlIGRyYWZ0IGl0c2VsZiAobm90IGl0cyBhY3RpdmUgc2libGluZylcblx0XHRcdC8vIGFwcGxpY2F0aW9uIGhhcyB0byB0YWtlIGNhcmUgdG8gc2V0IHRoaXMgY29ycmVjdGx5IChpbiBjYXNlIGFjdGl2ZSBzaWJsaW5nIG11c3Qgbm90IGJlIGRlbGV0YWJsZSwgYWN0aXZhdGlvblxuXHRcdFx0Ly8gb2YgZHJhZnQgd2l0aCBkZWxldGVkIG5vZGUgd291bGQgYWxzbyBkZWx0ZSBhY3RpdmUgc2libGluZyA9PiBkZWxldGlvbiBvZiBkcmFmdCBub2RlIHRvIGJlIGF2b2lkZWQpXG5cdFx0XHR2YWx1ZTogY29udGV4dEluZm9zLmZpbHRlcihcblx0XHRcdFx0KGluZm8pID0+ICFpbmZvLmlzSW5hY3RpdmVDb250ZXh0ICYmIGluZm8uaXNEcmFmdFJvb3QgJiYgIWluZm8uaXNBY3RpdmUgJiYgaW5mby5oYXNBY3RpdmUgJiYgIWluZm8uc2libGluZ0RlbGV0YWJsZVxuXHRcdFx0KVxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0a2V5OiBcImxvY2tlZENvbnRleHRzXCIsXG5cdFx0XHR2YWx1ZTogY29udGV4dEluZm9zLmZpbHRlcihcblx0XHRcdFx0KGluZm8pID0+ICFpbmZvLmlzSW5hY3RpdmVDb250ZXh0ICYmIGluZm8uaXNEcmFmdFJvb3QgJiYgaW5mby5pc0FjdGl2ZSAmJiBpbmZvLmhhc0RyYWZ0ICYmIGluZm8ubG9ja2VkXG5cdFx0XHQpXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRrZXk6IFwidW5TYXZlZENvbnRleHRzXCIsXG5cdFx0XHR2YWx1ZTogY29udGV4dEluZm9zLmZpbHRlcihcblx0XHRcdFx0KGluZm8pID0+ICFpbmZvLmlzSW5hY3RpdmVDb250ZXh0ICYmIGluZm8uaXNEcmFmdFJvb3QgJiYgaW5mby5pc0FjdGl2ZSAmJiBpbmZvLmhhc0RyYWZ0ICYmICFpbmZvLmxvY2tlZFxuXHRcdFx0KVxuXHRcdH0sXG5cdFx0Ly8gbm9uLWRyYWZ0L3N0aWNreSBhbmQgZGVsZXRhYmxlXG5cdFx0Ly8gYWN0aXZlIGRyYWZ0IHJvb3Qgd2l0aG91dCBhbnkgZHJhZnQgYW5kIGRlbGV0YWJsZVxuXHRcdC8vIGNyZWF0ZWQgZHJhZnQgcm9vdCAocmVnYXJkbGVzcyBvZiBkZWxldGFibGUpXG5cdFx0Ly8gZHJhZnQgbm9kZSBvbmx5IGFjY29yZGluZyB0byBpdHMgYW5ub3RhdGlvblxuXHRcdHtcblx0XHRcdGtleTogXCJkZWxldGFibGVDb250ZXh0c1wiLFxuXHRcdFx0dmFsdWU6IGNvbnRleHRJbmZvcy5maWx0ZXIoXG5cdFx0XHRcdChpbmZvKSA9PlxuXHRcdFx0XHRcdGluZm8uaXNJbmFjdGl2ZUNvbnRleHQgfHxcblx0XHRcdFx0XHQoIWluZm8uaXNEcmFmdFJvb3QgJiYgIWluZm8uaXNEcmFmdE5vZGUgJiYgaW5mby5kZWxldGFibGUpIHx8XG5cdFx0XHRcdFx0KGluZm8uaXNEcmFmdFJvb3QgJiYgaW5mby5pc0FjdGl2ZSAmJiAhaW5mby5oYXNEcmFmdCAmJiBpbmZvLmRlbGV0YWJsZSkgfHxcblx0XHRcdFx0XHQoaW5mby5pc0RyYWZ0Um9vdCAmJiAhaW5mby5pc0FjdGl2ZSAmJiAhaW5mby5oYXNBY3RpdmUpIHx8XG5cdFx0XHRcdFx0KGluZm8uaXNEcmFmdE5vZGUgJiYgaW5mby5kZWxldGFibGUpXG5cdFx0XHQpXG5cdFx0fVxuXHRdO1xuXHRjb25zdCBjb250ZXh0UGF0aCA9ICFmb3JDb250ZXh0TWVudSA/IFwiXCIgOiBcImNvbnRleHRtZW51L1wiO1xuXHRmb3IgKGNvbnN0IHsga2V5LCB2YWx1ZSB9IG9mIGJ1Y2tldHMpIHtcblx0XHRpbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcblx0XHRcdGNvbnRleHRQYXRoICsga2V5LFxuXHRcdFx0Ly8gQ3VycmVudGx5LCBidWNrZXQgZHJhZnRzV2l0aERlbGV0YWJsZUFjdGl2ZSBoYXMgYSBkaWZmZXJlbnQgc3RydWN0dXJlIChjb250YWluaW5nIGFsc28gc2libGluZyBpbmZvcm1hdGlvbiwgd2hpY2ggaXMgdXNlZFxuXHRcdFx0Ly8gaW4gY2FzZSBvZiBkZWxldGlvbikuIFBvc3NpYmxlIGltcHJvdmVtZW50OiBSZWFkIHNpYmxpbmcgaW5mb3JtYXRpb24gb25seSB3aGVuIG5lZWRlZCwgYW5kIGJ1aWxkIGFsbCBidWNrZXRzIHdpdGggc2FtZVxuXHRcdFx0Ly8gc3RydWN0dXJlLiBIb3dldmVyLCBpbiB0aGF0IGNhc2Ugc2libGluZ0luZm9ybWF0aW9uIG1pZ2h0IG5lZWQgdG8gYmUgcmVhZCB0d2ljZSAoaWYgYWxyZWFkeSBuZWVkZWQgZm9yIGJ1dHRvbiBlbmFibGVtZW50KSxcblx0XHRcdC8vIHRodXMgYSBidWZmZXIgcHJvYmFibHkgd291bGQgbWFrZSBzZW5zZS5cblx0XHRcdHZhbHVlLm1hcCgoaW5mbykgPT5cblx0XHRcdFx0a2V5ID09PSBcImRyYWZ0c1dpdGhEZWxldGFibGVBY3RpdmVcIiA/IHsgZHJhZnQ6IGluZm8uY29udGV4dCwgc2libGluZ0luZm86IGluZm8uc2libGluZ0luZm8gfSA6IGluZm8uY29udGV4dFxuXHRcdFx0KVxuXHRcdCk7XG5cdH1cbn1cblxuY29uc3QgZGVsZXRlSGVscGVyID0ge1xuXHRnZXROb25EZWxldGFibGVUZXh0LFxuXHRkZWxldGVDb25maXJtSGFuZGxlcixcblx0Z2V0T3B0aW9uc0ZvckRlbGV0YWJsZVRleHRzLFxuXHR1cGRhdGVDb250ZW50Rm9yRGVsZXRlRGlhbG9nLFxuXHR1cGRhdGVEcmFmdE9wdGlvbnNGb3JEZWxldGFibGVUZXh0cyxcblx0Z2V0Q29uZmlybWVkRGVsZXRhYmxlQ29udGV4dCxcblx0Z2V0TG9ja2VkT2JqZWN0c1RleHQsXG5cdGdldFVuc2F2ZWRDb250ZXh0c1RleHQsXG5cdGdldE5vbkRlbGV0YWJsZUFjdGl2ZXNPZkRyYWZ0c1RleHQsXG5cdGFmdGVyRGVsZXRlUHJvY2Vzcyxcblx0dXBkYXRlRGVsZXRlSW5mb0ZvclNlbGVjdGVkQ29udGV4dHMsXG5cdERlbGV0ZU9wdGlvblR5cGVzLFxuXHREZWxldGVEaWFsb2dDb250ZW50Q29udHJvbCxcblx0c2V0Rm9jdXNBZnRlckRlbGV0ZSxcblx0Z2V0Q29udGV4dEluZm9zLFxuXHRhZGRHZW5lcmljRGVsZXRlRmFpbHVyZU1lc3NhZ2Vcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGRlbGV0ZUhlbHBlcjtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztNQXFCS0EsaUJBQWlCO0VBQUEsV0FBakJBLGlCQUFpQjtJQUFqQkEsaUJBQWlCO0lBQWpCQSxpQkFBaUI7SUFBakJBLGlCQUFpQjtJQUFqQkEsaUJBQWlCO0lBQWpCQSxpQkFBaUI7RUFBQSxHQUFqQkEsaUJBQWlCLEtBQWpCQSxpQkFBaUI7RUFBQSxJQVFqQkMsMEJBQTBCO0VBQUEsV0FBMUJBLDBCQUEwQjtJQUExQkEsMEJBQTBCO0lBQTFCQSwwQkFBMEI7RUFBQSxHQUExQkEsMEJBQTBCLEtBQTFCQSwwQkFBMEI7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