@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
@@ -15,6 +15,11 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/base/util/uid", "
15
15
  const LOGGER_SCOPE = "sap.fe.core.buildingBlocks.templating.BuildingBlockTemplateProcessor";
16
16
  const XMLTEMPLATING_NS = "http://schemas.sap.com/sapui5/extension/sap.ui.core.template/1";
17
17
  const DOMParserInstance = new DOMParser();
18
+
19
+ /**
20
+ * Definition of a meta data context
21
+ */
22
+
18
23
  function validateMacroMetadataContext(sName, mContexts, oContextSettings, sKey) {
19
24
  const oContext = mContexts[sKey];
20
25
  const oContextObject = oContext === null || oContext === void 0 ? void 0 : oContext.getObject();
@@ -80,7 +85,6 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/base/util/uid", "
80
85
  /**
81
86
  * Transforms the metadata of a building block by adding additional aggregations,
82
87
  * and splitting properties into actual properties and metadata contexts.
83
- *
84
88
  * @param buildingBlockMetadata The metadata received from the input
85
89
  * @returns The transformed metadata
86
90
  */
@@ -131,7 +135,6 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/base/util/uid", "
131
135
 
132
136
  /**
133
137
  * Checks the absolute or context paths and returns an appropriate MetaContext.
134
- *
135
138
  * @param oSettings Additional settings
136
139
  * @param sAttributeValue The attribute value
137
140
  * @returns The meta data context object
@@ -156,7 +159,6 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/base/util/uid", "
156
159
 
157
160
  /**
158
161
  * This method helps to create the metadata context in case it is not yet available in the store.
159
- *
160
162
  * @param oSettings Additional settings
161
163
  * @param sAttributeName The attribute name
162
164
  * @param sAttributeValue The attribute value
@@ -217,7 +219,6 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/base/util/uid", "
217
219
 
218
220
  /**
219
221
  * Parse the incoming XML node and try to resolve the properties defined there.
220
- *
221
222
  * @param oMetadata The metadata for the building block
222
223
  * @param oNode The XML node to parse
223
224
  * @param isPublic Whether the building block is used in a public context or not
@@ -262,7 +263,6 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/base/util/uid", "
262
263
 
263
264
  /**
264
265
  * Parse the incoming XML node and try to resolve the binding contexts defined inside.
265
- *
266
266
  * @param oMetadata The metadata for the building block
267
267
  * @param oSettings The settings object
268
268
  * @param oNode The XML node to parse
@@ -346,7 +346,6 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/base/util/uid", "
346
346
 
347
347
  /**
348
348
  * Processes the child nodes of the building block properties when the type is an object.
349
- *
350
349
  * @param element The XML element to parse
351
350
  * @returns The processed object
352
351
  */
@@ -376,7 +375,6 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/base/util/uid", "
376
375
 
377
376
  /**
378
377
  * Processes the child nodes of the building block and parses them as either aggregations or object-/array-based values.
379
- *
380
378
  * @param oNode The XML node for which to process the children
381
379
  * @param oVisitor The visitor instance
382
380
  * @param oMetadata The metadata for the building block
@@ -742,7 +740,6 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/base/util/uid", "
742
740
  if (mContexts[sKey]) {
743
741
  return; // do not add twice
744
742
  }
745
-
746
743
  try {
747
744
  let sContextPath = oCtx.path;
748
745
  if (oCtx.model !== null) {
@@ -764,7 +761,6 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/base/util/uid", "
764
761
 
765
762
  /**
766
763
  * Register a building block definition to be used inside the xml template processor.
767
- *
768
764
  * @param BuildingBlockClass The building block definition
769
765
  */
770
766
  function registerBuildingBlock(BuildingBlockClass) {
@@ -778,7 +774,6 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/base/util/uid", "
778
774
 
779
775
  /**
780
776
  * UnRegister a building block definition so that it is no longer used inside the xml template processor.
781
- *
782
777
  * @param BuildingBlockClass The building block definition
783
778
  */
784
779
  _exports.registerBuildingBlock = registerBuildingBlock;
@@ -825,7 +820,6 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/base/util/uid", "
825
820
  * Stores an object value in a temporary storage and returns an ID used to retrieve this value at a later point in time.
826
821
  *
827
822
  * Required as there is functionality like the xml` function, which might take objects as parameters but needs to return a serialized string.
828
- *
829
823
  * @param value Value to store
830
824
  * @returns ID to retrieve this value
831
825
  */
@@ -837,7 +831,6 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/base/util/uid", "
837
831
 
838
832
  /**
839
833
  * Unstores an object from a temporary store by removing it and returning its object value.
840
- *
841
834
  * @param propertyUID ID to retrieve this value
842
835
  * @returns Object value
843
836
  */
@@ -850,7 +843,6 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/base/util/uid", "
850
843
  let processNextXmlInTrace = false;
851
844
  /**
852
845
  * Makes sure that all xml` calls inside the given method are processed in trace mode.
853
- *
854
846
  * @param method The method to execute
855
847
  * @returns The return value of the given method
856
848
  */
@@ -867,7 +859,6 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/base/util/uid", "
867
859
 
868
860
  /**
869
861
  * Parse an XML string and return the associated document.
870
- *
871
862
  * @param xmlString The xml string
872
863
  * @param [addDefaultNamespaces] Whether or not default namespaces should be added
873
864
  * @returns The XML document.
@@ -896,7 +887,6 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/base/util/uid", "
896
887
 
897
888
  /**
898
889
  * Escape an XML attribute value.
899
- *
900
890
  * @param value The attribute value to escape.
901
891
  * @returns The escaped string.
902
892
  */
@@ -917,7 +907,6 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/base/util/uid", "
917
907
  }
918
908
  /**
919
909
  * Create a string representation of the template literal while handling special object case.
920
- *
921
910
  * @param strings The string parts of the template literal
922
911
  * @param values The values part of the template literal
923
912
  * @returns The XML string document representing the string that was used.
@@ -976,7 +965,6 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/base/util/uid", "
976
965
  /**
977
966
  * Add an attribute depending on the current value of the property.
978
967
  * If it's undefined the attribute is not added.
979
- *
980
968
  * @param attributeName
981
969
  * @param value
982
970
  * @returns The attribute to add if the value is not undefined, otherwise an empty string
@@ -992,4 +980,4 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/base/util/uid", "
992
980
  _exports.addAttributeToXML = addAttributeToXML;
993
981
  return _exports;
994
982
  }, false);
995
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJMT0dHRVJfU0NPUEUiLCJYTUxURU1QTEFUSU5HX05TIiwiRE9NUGFyc2VySW5zdGFuY2UiLCJET01QYXJzZXIiLCJ2YWxpZGF0ZU1hY3JvTWV0YWRhdGFDb250ZXh0Iiwic05hbWUiLCJtQ29udGV4dHMiLCJvQ29udGV4dFNldHRpbmdzIiwic0tleSIsIm9Db250ZXh0Iiwib0NvbnRleHRPYmplY3QiLCJnZXRPYmplY3QiLCJyZXF1aXJlZCIsIkVycm9yIiwiaGFzT3duUHJvcGVydHkiLCIka2luZCIsInVuZGVmaW5lZCIsImV4cGVjdGVkVHlwZXMiLCJpbmNsdWRlcyIsImdldFBhdGgiLCIkVHlwZSIsImV4cGVjdGVkQW5ub3RhdGlvblR5cGVzIiwidmFsaWRhdGVNYWNyb1NpZ25hdHVyZSIsIm9NZXRhZGF0YSIsIm9Ob2RlIiwiYU1ldGFkYXRhQ29udGV4dEtleXMiLCJtZXRhZGF0YUNvbnRleHRzIiwiT2JqZWN0Iiwia2V5cyIsImFQcm9wZXJ0aWVzIiwicHJvcGVydGllcyIsIm9BdHRyaWJ1dGVOYW1lcyIsImF0dHJpYnV0ZU5hbWVzIiwiZ2V0QXR0cmlidXRlTmFtZXMiLCJhdHRyaWJ1dGVOYW1lIiwiZm9yRWFjaCIsIm9Qcm9wZXJ0eVNldHRpbmdzIiwiaGFzQXR0cmlidXRlIiwic3RhcnRzV2l0aCIsIkxvZyIsIndhcm5pbmciLCJTQVBfVUlfQ09SRV9FTEVNRU5UIiwiU0FQX1VJX01PREVMX0NPTlRFWFQiLCJ0cmFuc2Zvcm1NZXRhZGF0YSIsImJ1aWxkaW5nQmxvY2tNZXRhZGF0YSIsImNsYXNzIiwidHlwZSIsImlzUHVibGljIiwiYWdncmVnYXRpb25zIiwiZGVwZW5kZW50cyIsInNsb3QiLCJjdXN0b21EYXRhIiwibGF5b3V0RGF0YSIsInByb3BlcnR5TmFtZSIsInByb3BlcnR5VHlwZSIsIl9jaGVja0Fic29sdXRlQW5kQ29udGV4dFBhdGhzIiwib1NldHRpbmdzIiwic0F0dHJpYnV0ZVZhbHVlIiwic01ldGFQYXRoIiwic0NvbnRleHRQYXRoIiwiY3VycmVudENvbnRleHRQYXRoIiwiZW5kc1dpdGgiLCJtb2RlbCIsInBhdGgiLCJfY3JlYXRlSW5pdGlhbE1ldGFkYXRhQ29udGV4dCIsInNBdHRyaWJ1dGVOYW1lIiwicmV0dXJuQ29udGV4dCIsIm1vZGVscyIsImNvbnZlcnRlckNvbnRleHQiLCJnZXRQcm9wZXJ0eSIsImRhdGEiLCJ1bnN0b3JlT2JqZWN0VmFsdWUiLCJzZXRQcm9wZXJ0eSIsImJpbmRpbmdDb250ZXh0cyIsImVudGl0eVNldCIsIl9nZXRNZXRhZGF0YUNvbnRleHQiLCJvVmlzaXRvciIsImJEb05vdFJlc29sdmUiLCJpc09wZW4iLCJvTWV0YWRhdGFDb250ZXh0IiwiZ2V0QXR0cmlidXRlIiwiQmluZGluZ1BhcnNlciIsImNvbXBsZXhQYXJzZXIiLCJnZXRDb250ZXh0IiwiZSIsInByb2Nlc3NQcm9wZXJ0aWVzIiwiZGVmaW5pdGlvblByb3BlcnRpZXMiLCJhRGVmaW5pdGlvblByb3BlcnRpZXNLZXlzIiwicHJvcGVydHlWYWx1ZXMiLCJzS2V5VmFsdWUiLCJkZWZhdWx0VmFsdWUiLCJkZWVwQ2xvbmUiLCJlcnJvciIsInZpc2l0QXR0cmlidXRlIiwiYXR0cmlidXRlcyIsImdldE5hbWVkSXRlbSIsInZhbHVlIiwiTnVtYmVyIiwicHJvY2Vzc0NvbnRleHRzIiwiY29udGV4dFBhdGgiLCJtTWlzc2luZ0NvbnRleHQiLCJvRGVmaW5pdGlvbkNvbnRleHRzIiwiYURlZmluaXRpb25Db250ZXh0c0tleXMiLCJjb250ZXh0UGF0aEluZGV4IiwiaW5kZXhPZiIsImNvbnRleHRQYXRoRGVmaW5pdGlvbiIsInNwbGljZSIsInByb3BlcnR5VmFsdWUiLCJsZW5ndGgiLCJuYW1lIiwiYWRkU2luZ2xlQ29udGV4dCIsInBhcnNlQWdncmVnYXRpb24iLCJvQWdncmVnYXRpb24iLCJwcm9jZXNzQWdncmVnYXRpb25zIiwib091dE9iamVjdHMiLCJjaGlsZHJlbiIsImNoaWxkSWR4IiwiY2hpbGREZWZpbml0aW9uIiwiY2hpbGRLZXkiLCJzZXRBdHRyaWJ1dGUiLCJhZ2dyZWdhdGlvbk9iamVjdCIsImtleSIsInBvc2l0aW9uIiwicGxhY2VtZW50IiwiUGxhY2VtZW50IiwiQWZ0ZXIiLCJhbmNob3IiLCJ0YWdOYW1lIiwibm9kZU5hbWUiLCJwcm9jZXNzT2JqZWN0IiwiZWxlbWVudCIsIm15QXJyYXkiLCJteU9iamVjdCIsImNoaWxkTm9kZU5hbWVzIiwibWFwIiwibG9jYWxOYW1lIiwiY2hpbGRJc0FycmF5IiwiU2V0Iiwic2l6ZSIsInB1c2giLCJwcm9jZXNzQ2hpbGRyZW4iLCJvQWdncmVnYXRpb25zIiwiZmlyc3RFbGVtZW50Q2hpbGQiLCJvRmlyc3RFbGVtZW50Q2hpbGQiLCJuYW1lc3BhY2VVUkkiLCJvUGFyZW50IiwicGFyZW50Tm9kZSIsImlDaGlsZEluZGV4IiwiQXJyYXkiLCJmcm9tIiwidmlzaXROb2RlIiwibmV4dEVsZW1lbnRTaWJsaW5nIiwic0NoaWxkTmFtZSIsInNBZ2dyZWdhdGlvbk5hbWUiLCJ0b1VwcGVyQ2FzZSIsImRlZmF1bHRBZ2dyZWdhdGlvbiIsImFnZ3JlZ2F0aW9uRGVmaW5pdGlvbiIsInBhcnNlZEFnZ3JlZ2F0aW9uIiwicGFyc2VkQWdncmVnYXRpb25LZXkiLCJvTmV4dENoaWxkIiwibmV4dENoaWxkIiwiaGFzVmlydHVhbE5vZGUiLCJjaGlsZFdyYXBwZXIiLCJkb2N1bWVudCIsImNyZWF0ZUVsZW1lbnROUyIsImFwcGVuZENoaWxkIiwicmVtb3ZlQXR0cmlidXRlIiwib05ld0NoaWxkIiwiY2xvbmVOb2RlIiwiYWdncmVnYXRpb25Qcm9wZXJ0eVZhbHVlcyIsIm15Q2hpbGQiLCJwcm9jZXNzU2xvdHMiLCJvTWV0YWRhdGFBZ2dyZWdhdGlvbnMiLCJwcm9jZXNzQ3VzdG9tRGF0YSIsIm9BZ2dyZWdhdGlvbkVsZW1lbnQiLCJvRWxlbWVudENoaWxkIiwic1Nsb3ROYW1lIiwib1RhcmdldEVsZW1lbnQiLCJxdWVyeVNlbGVjdG9yIiwicHJlcGFyZUFnZ3JlZ2F0aW9uRWxlbWVudCIsInJlcGxhY2VXaXRoIiwicmVwbGFjZSIsInByb2Nlc3NCdWlsZGluZ0Jsb2NrIiwiQnVpbGRpbmdCbG9ja0NsYXNzIiwibWV0YWRhdGEiLCJzRnJhZ21lbnROYW1lIiwiZnJhZ21lbnQiLCJuYW1lc3BhY2UiLCJwdWJsaWNOYW1lc3BhY2UiLCJ4bWxUYWciLCJnZXRTZXR0aW5ncyIsIkpTT05Nb2RlbCIsImluaXRpYWxLZXlzIiwib0NvbnRyb2xDb25maWciLCJ2aWV3RGF0YSIsInByb2Nlc3NlZFByb3BlcnR5VmFsdWVzIiwicHJvcE5hbWUiLCJvRGF0YSIsIm9yaWdpbmFsRGVmaW5pdGlvbiIsInZhbGlkYXRlIiwiaXNBIiwiZ2V0TW9kZWwiLCJvSW5zdGFuY2UiLCJnZXRQcm9wZXJ0aWVzIiwic0NvbnRleHROYW1lIiwidGFyZ2V0T2JqZWN0IiwiaXNDb250ZXh0IiwiYXR0cmlidXRlVmFsdWUiLCJzdG9yZU9iamVjdFZhbHVlIiwibmV3Q29udGV4dCIsImNyZWF0ZUJpbmRpbmdDb250ZXh0Iiwib0F0dHJpYnV0ZXNNb2RlbCIsIkF0dHJpYnV0ZU1vZGVsIiwib1ByZXZpb3VzTWFjcm9JbmZvIiwiY29yZVJlcXVpcmUiLCJUcmFjZUluZm8iLCJpc1RyYWNlSW5mb0FjdGl2ZSIsIm9UcmFjZUluZm8iLCJ0cmFjZU1hY3JvQ2FsbHMiLCJtYWNyb0luZm8iLCJvQ29udGV4dFZpc2l0b3IiLCJ3aXRoIiwib1Byb21pc2UiLCJpbnNlcnRGcmFnbWVudCIsIm9sZEtleXMiLCJ0ZW1wb3JhcnlPYmplY3RTdG9yZSIsInRlbXBsYXRlU3RyaW5nIiwiZ2V0UnVudGltZUJ1aWxkaW5nQmxvY2tUZW1wbGF0ZSIsImpzeCIsInJlbmRlckFzWE1MIiwiZ2V0VGVtcGxhdGUiLCJpc1J1bnRpbWUiLCJzdG9yZUtleSIsImhhc0Vycm9yIiwiaGFzUGFyc2VFcnJvciIsInBhcnNlZFRlbXBsYXRlIiwicGFyc2VYTUxTdHJpbmciLCJpdGVyIiwiY3JlYXRlTm9kZUl0ZXJhdG9yIiwiTm9kZUZpbHRlciIsIlNIT1dfVEVYVCIsInRleHRub2RlIiwibmV4dE5vZGUiLCJ0ZXh0Q29udGVudCIsInRyaW0iLCJwcm9jZXNzWG1sSW5UcmFjZSIsImluaXRpYWxUZW1wbGF0ZSIsIm9FcnJvclRleHQiLCJjcmVhdGVFcnJvclhNTCIsInRlbXBsYXRlIiwib3V0ZXJIVE1MIiwiam9pbiIsInZpc2l0ZWROb2RlcyIsImludGVybmFsTm9kZSIsIlByb21pc2UiLCJhbGwiLCJyZW1vdmUiLCJyZXNvbHZlIiwib01hY3JvRWxlbWVudCIsIm9SZW1haW5pbmdTbG90cyIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJvU2xvdEVsZW1lbnQiLCJyZXF1aXJlT25NYWNybyIsImdldEF0dHJpYnV0ZU5TIiwic3Vic3RyaW5nIiwic2V0QXR0cmlidXRlTlMiLCJjbGFzc0xpc3QiLCJhZGQiLCJ0cmFjZURldGFpbHMiLCJpbml0aWFsUHJvcGVydGllcyIsInJlc29sdmVkUHJvcGVydGllcyIsIm1pc3NpbmdDb250ZXh0cyIsIm9FcnJvciIsInN0YWNrIiwib1RlbXBsYXRlIiwib0N0eCIsIm1TZXR0aW5nIiwiZXgiLCJyZWdpc3RlckJ1aWxkaW5nQmxvY2siLCJYTUxQcmVwcm9jZXNzb3IiLCJwbHVnSW4iLCJ1bnJlZ2lzdGVyQnVpbGRpbmdCbG9jayIsImVycm9yTWVzc2FnZXMiLCJ4bWxGcmFnbWVudCIsImFkZGl0aW9uYWxEYXRhIiwiZXJyb3JMYWJlbHMiLCJlcnJvck1lc3NhZ2UiLCJ4bWwiLCJlc2NhcGVYTUxBdHRyaWJ1dGVWYWx1ZSIsImVycm9yU3RhY2siLCJzdGFja0Zvcm1hdHRlZCIsImJ0b2EiLCJhZGRpdGlvbmFsVGV4dCIsIkpTT04iLCJzdHJpbmdpZnkiLCJyZXBsYWNlQWxsIiwicHJvcGVydHlVSUQiLCJ1aWQiLCJwcm9jZXNzTmV4dFhtbEluVHJhY2UiLCJtZXRob2QiLCJyZXR1cm5WYWx1ZSIsInhtbFN0cmluZyIsImFkZERlZmF1bHROYW1lc3BhY2VzIiwieG1sRG9jdW1lbnQiLCJwYXJzZUZyb21TdHJpbmciLCJvdXRwdXQiLCJwYXJlbnRFbGVtZW50IiwicmVuZGVySW5UcmFjZU1vZGUiLCJvdXRTdHIiLCJ4bWxSZXN1bHQiLCJpbm5lclRleHQiLCJpbm5lckhUTUwiLCJzcGxpdCIsInN0cmluZ3MiLCJpIiwidmFsdWVzIiwiaXNBcnJheSIsImZsYXQiLCJpc0Z1bmN0aW9uQXJyYXkiLCJ2YWx1ZWZuIiwiaXNCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24iLCJjb21waWxlZEV4cHJlc3Npb24iLCJjb21waWxlRXhwcmVzc2lvbiIsInByb3BlcnR5VUlkIiwiYWRkQ29uZGl0aW9uYWxseVRvWE1MIiwiY29uZGl0aW9uIiwicGFydFRvQWRkIiwiYWRkQXR0cmlidXRlVG9YTUwiLCJpc1VuZGVmaW5lZEV4cHJlc3Npb24iXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIkJ1aWxkaW5nQmxvY2tUZW1wbGF0ZVByb2Nlc3Nvci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCBkZWVwQ2xvbmUgZnJvbSBcInNhcC9iYXNlL3V0aWwvZGVlcENsb25lXCI7XG5pbXBvcnQgdWlkIGZyb20gXCJzYXAvYmFzZS91dGlsL3VpZFwiO1xuaW1wb3J0IHR5cGUgeyBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24gfSBmcm9tIFwic2FwL2ZlL2Jhc2UvQmluZGluZ1Rvb2xraXRcIjtcbmltcG9ydCB7IGNvbXBpbGVFeHByZXNzaW9uLCBpc0JpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiwgaXNVbmRlZmluZWRFeHByZXNzaW9uIH0gZnJvbSBcInNhcC9mZS9iYXNlL0JpbmRpbmdUb29sa2l0XCI7XG5pbXBvcnQganN4IGZyb20gXCJzYXAvZmUvYmFzZS9qc3gtcnVudGltZS9qc3hcIjtcbmltcG9ydCB0eXBlIEFwcENvbXBvbmVudCBmcm9tIFwic2FwL2ZlL2NvcmUvQXBwQ29tcG9uZW50XCI7XG5pbXBvcnQgdHlwZSBSZXNvdXJjZU1vZGVsIGZyb20gXCJzYXAvZmUvY29yZS9SZXNvdXJjZU1vZGVsXCI7XG5pbXBvcnQgQXR0cmlidXRlTW9kZWwgZnJvbSBcInNhcC9mZS9jb3JlL2J1aWxkaW5nQmxvY2tzL3RlbXBsYXRpbmcvQXR0cmlidXRlTW9kZWxcIjtcbmltcG9ydCB0eXBlIHtcblx0QnVpbGRpbmdCbG9ja0FnZ3JlZ2F0aW9uRGVmaW5pdGlvbixcblx0QnVpbGRpbmdCbG9ja01ldGFkYXRhLFxuXHRCdWlsZGluZ0Jsb2NrTWV0YWRhdGFDb250ZXh0RGVmaW5pdGlvbixcblx0QnVpbGRpbmdCbG9ja1Byb3BlcnR5RGVmaW5pdGlvbixcblx0T2JqZWN0VmFsdWUsXG5cdE9iamVjdFZhbHVlMlxufSBmcm9tIFwic2FwL2ZlL2NvcmUvYnVpbGRpbmdCbG9ja3MvdGVtcGxhdGluZy9CdWlsZGluZ0Jsb2NrU3VwcG9ydFwiO1xuaW1wb3J0IHR5cGUgQnVpbGRpbmdCbG9ja1RlbXBsYXRpbmdCYXNlIGZyb20gXCJzYXAvZmUvY29yZS9idWlsZGluZ0Jsb2Nrcy90ZW1wbGF0aW5nL0J1aWxkaW5nQmxvY2tUZW1wbGF0aW5nQmFzZVwiO1xuaW1wb3J0IHR5cGUgUnVudGltZUJ1aWxkaW5nQmxvY2sgZnJvbSBcInNhcC9mZS9jb3JlL2J1aWxkaW5nQmxvY2tzL3RlbXBsYXRpbmcvUnVudGltZUJ1aWxkaW5nQmxvY2tcIjtcbmltcG9ydCB0eXBlIHsgUG9zaXRpb24gfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9oZWxwZXJzL0NvbmZpZ3VyYWJsZU9iamVjdFwiO1xuaW1wb3J0IHsgUGxhY2VtZW50IH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvaGVscGVycy9Db25maWd1cmFibGVPYmplY3RcIjtcbmltcG9ydCB7IGlzQ29udGV4dCwgaXNGdW5jdGlvbkFycmF5IH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvVHlwZUd1YXJkc1wiO1xuaW1wb3J0IEJpbmRpbmdQYXJzZXIgZnJvbSBcInNhcC91aS9iYXNlL0JpbmRpbmdQYXJzZXJcIjtcbmltcG9ydCB0eXBlIENvbnRyb2wgZnJvbSBcInNhcC91aS9jb3JlL0NvbnRyb2xcIjtcbmltcG9ydCBYTUxQcmVwcm9jZXNzb3IgZnJvbSBcInNhcC91aS9jb3JlL3V0aWwvWE1MUHJlcHJvY2Vzc29yXCI7XG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvQ29udGV4dFwiO1xuaW1wb3J0IHR5cGUgTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9Nb2RlbFwiO1xuaW1wb3J0IEpTT05Nb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL2pzb24vSlNPTk1vZGVsXCI7XG5pbXBvcnQgdHlwZSBPRGF0YU1ldGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTWV0YU1vZGVsXCI7XG5pbXBvcnQgdHlwZSB7IE1hY3JvSW5mbyB9IGZyb20gXCIuLi9UcmFjZUluZm9cIjtcbmltcG9ydCBUcmFjZUluZm8gZnJvbSBcIi4uL1RyYWNlSW5mb1wiO1xuXG5jb25zdCBMT0dHRVJfU0NPUEUgPSBcInNhcC5mZS5jb3JlLmJ1aWxkaW5nQmxvY2tzLnRlbXBsYXRpbmcuQnVpbGRpbmdCbG9ja1RlbXBsYXRlUHJvY2Vzc29yXCI7XG5jb25zdCBYTUxURU1QTEFUSU5HX05TID0gXCJodHRwOi8vc2NoZW1hcy5zYXAuY29tL3NhcHVpNS9leHRlbnNpb24vc2FwLnVpLmNvcmUudGVtcGxhdGUvMVwiO1xuY29uc3QgRE9NUGFyc2VySW5zdGFuY2UgPSBuZXcgRE9NUGFyc2VyKCk7XG5cbmV4cG9ydCB0eXBlIFRyYW5zZm9ybWVkQnVpbGRpbmdCbG9ja01ldGFkYXRhID0gQnVpbGRpbmdCbG9ja01ldGFkYXRhICYge1xuXHRtZXRhZGF0YUNvbnRleHRzOiBSZWNvcmQ8c3RyaW5nLCBCdWlsZGluZ0Jsb2NrTWV0YWRhdGFDb250ZXh0RGVmaW5pdGlvbj47XG59O1xuXG4vKipcbiAqIERlZmluaXRpb24gb2YgYSBtZXRhIGRhdGEgY29udGV4dFxuICovXG50eXBlIE1ldGFEYXRhQ29udGV4dCA9IHtcblx0bmFtZT86IHN0cmluZztcblx0bW9kZWw6IHN0cmluZztcblx0cGF0aDogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgVGVtcGxhdGVQcm9jZXNzb3JTZXR0aW5ncyA9IHtcblx0Y3VycmVudENvbnRleHRQYXRoOiBDb250ZXh0O1xuXHRpc1B1YmxpYzogYm9vbGVhbjtcblx0YXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQ7XG5cdGlzUnVudGltZUluc3RhbnRpYXRpb24/OiBib29sZWFuO1xuXHRtb2RlbHM6IFJlY29yZDxzdHJpbmcsIE1vZGVsPiAmIHtcblx0XHRjb252ZXJ0ZXJDb250ZXh0OiBKU09OTW9kZWw7XG5cdFx0dmlld0RhdGE6IEpTT05Nb2RlbDtcblx0XHRtZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsO1xuXHRcdFwic2FwLmZlLmkxOG5cIj86IFJlc291cmNlTW9kZWw7XG5cdH07XG5cdGJpbmRpbmdDb250ZXh0czogUmVjb3JkPHN0cmluZywgQ29udGV4dD47XG5cdF9tYWNyb0luZm8/OiBNYWNyb0luZm87XG5cdFtrOiBzdHJpbmddOiB1bmtub3duO1xufTtcblxuZXhwb3J0IHR5cGUgSVZpc2l0b3JDYWxsYmFjayA9IHtcblx0Z2V0U2V0dGluZ3MoKTogVGVtcGxhdGVQcm9jZXNzb3JTZXR0aW5ncztcblx0LyoqXG5cdCAqIFZpc2l0cyB0aGUgZ2l2ZW4gbm9kZSBhbmQgZWl0aGVyIHByb2Nlc3NlcyBhIHRlbXBsYXRlIGluc3RydWN0aW9uLCBjYWxsc1xuXHQgKiBhIHZpc2l0b3IsIG9yIHNpbXBseSBjYWxscyBib3RoIHtAbGlua1xuXHQgKiBzYXAudWkuY29yZS51dGlsLlhNTFByZXByb2Nlc3Nvci5JQ2FsbGJhY2sudmlzaXRBdHRyaWJ1dGVzIHZpc2l0QXR0cmlidXRlc31cblx0ICogYW5kIHtAbGluayBzYXAudWkuY29yZS51dGlsLlhNTFByZXByb2Nlc3Nvci5JQ2FsbGJhY2sudmlzaXRDaGlsZE5vZGVzXG5cdCAqIHZpc2l0Q2hpbGROb2Rlc30uXG5cdCAqXG5cdCAqIEBwYXJhbSBvTm9kZVxuXHQgKiAgIFRoZSBYTUwgRE9NIG5vZGVcblx0ICogQHJldHVybnNcblx0ICogICBBIHRoZW5hYmxlIHdoaWNoIHJlc29sdmVzIHdpdGggPGNvZGU+dW5kZWZpbmVkPC9jb2RlPiBhcyBzb29uIGFzIHZpc2l0aW5nXG5cdCAqICAgaXMgZG9uZSwgb3IgaXMgcmVqZWN0ZWQgd2l0aCBhIGNvcnJlc3BvbmRpbmcgZXJyb3IgaWYgdmlzaXRpbmcgZmFpbHNcblx0ICovXG5cdHZpc2l0Tm9kZShvTm9kZTogTm9kZSk6IFByb21pc2U8dm9pZD47XG5cblx0LyoqXG5cdCAqIEluc2VydHMgdGhlIGZyYWdtZW50IHdpdGggdGhlIGdpdmVuIG5hbWUgaW4gcGxhY2Ugb2YgdGhlIGdpdmVuIGVsZW1lbnQuIExvYWRzIHRoZVxuXHQgKiBmcmFnbWVudCwgdGFrZXMgY2FyZSBvZiBjYWNoaW5nIChmb3IgdGhlIGN1cnJlbnQgcHJlLXByb2Nlc3NvciBydW4pIGFuZCB2aXNpdHMgdGhlXG5cdCAqIGZyYWdtZW50J3MgY29udGVudCBvbmNlIGl0IGhhcyBiZWVuIGltcG9ydGVkIGludG8gdGhlIGVsZW1lbnQncyBvd25lciBkb2N1bWVudCBhbmRcblx0ICogcHV0IGludG8gcGxhY2UuIExvYWRpbmcgb2YgZnJhZ21lbnRzIGlzIGFzeW5jaHJvbm91cyBpZiB0aGUgdGVtcGxhdGUgdmlldyBpc1xuXHQgKiBhc3luY2hyb25vdXMuXG5cdCAqXG5cdCAqIEBwYXJhbSBzRnJhZ21lbnRcblx0ICogICB0aGUgZnJhZ21lbnQncyByZXNvbHZlZCBuYW1lXG5cdCAqIEBwYXJhbSBvRWxlbWVudFxuXHQgKiAgIHRoZSBYTUwgRE9NIGVsZW1lbnQsIGUuZy4gPHNhcC51aS5jb3JlOkZyYWdtZW50PiBvciA8Y29yZTpFeHRlbnNpb25Qb2ludD5cblx0ICogQHBhcmFtIG9XaXRoXG5cdCAqICAgdGhlIHBhcmVudCdzIFwid2l0aFwiIGNvbnRyb2xcblx0ICogQHJldHVybnNcblx0ICogQSBzeW5jIHByb21pc2Ugd2hpY2ggcmVzb2x2ZXMgd2l0aCA8Y29kZT51bmRlZmluZWQ8L2NvZGU+IGFzIHNvb24gYXMgdGhlIGZyYWdtZW50XG5cdCAqICAgaGFzIGJlZW4gaW5zZXJ0ZWQsIG9yIGlzIHJlamVjdGVkIHdpdGggYSBjb3JyZXNwb25kaW5nIGVycm9yIGlmIGxvYWRpbmcgb3IgdmlzaXRpbmdcblx0ICogICBmYWlscy5cblx0ICovXG5cdGluc2VydEZyYWdtZW50KHNGcmFnbWVudDogc3RyaW5nLCBvRWxlbWVudDogRWxlbWVudCwgb1dpdGg/OiBDb250cm9sKTogUHJvbWlzZTx2b2lkPjtcblx0dmlzaXRBdHRyaWJ1dGUob05vZGU6IEVsZW1lbnQsIG9BdHRyaWJ1dGU6IEF0dHIpOiBQcm9taXNlPHZvaWQ+O1xuXHR2aXNpdEF0dHJpYnV0ZXMob05vZGU6IEVsZW1lbnQpOiBQcm9taXNlPHZvaWQ+O1xuXHRnZXRWaWV3SW5mbygpOiBQcm9taXNlPHVua25vd24+O1xuXHR2aXNpdENoaWxkTm9kZXMob05vZGU6IE5vZGUpOiBQcm9taXNlPHZvaWQ+O1xuXHQvKipcblx0ICogSW50ZXJwcmV0cyB0aGUgZ2l2ZW4gWE1MIERPTSBhdHRyaWJ1dGUgdmFsdWUgYXMgYSBiaW5kaW5nIGFuZCByZXR1cm5zIHRoZVxuXHQgKiByZXN1bHRpbmcgdmFsdWUuXG5cdCAqXG5cdCAqIEBwYXJhbSBzVmFsdWVcblx0ICogICBBbiBYTUwgRE9NIGF0dHJpYnV0ZSB2YWx1ZVxuXHQgKiBAcGFyYW0gW2VsZW1lbnRdXG5cdCAqICAgVGhlIFhNTCBET00gZWxlbWVudCB0aGUgYXR0cmlidXRlIHZhbHVlIGJlbG9uZ3MgdG8gKG5lZWRlZCBvbmx5IGZvclxuXHQgKiAgIHdhcm5pbmdzIHdoaWNoIGFyZSBsb2dnZWQgdG8gdGhlIGNvbnNvbGUpXG5cdCAqIEByZXR1cm5zXG5cdCAqICAgQSB0aGVuYWJsZSB3aGljaCByZXNvbHZlcyB3aXRoIHRoZSByZXN1bHRpbmcgdmFsdWUsIG9yIGlzIHJlamVjdGVkIHdpdGggYVxuXHQgKiAgIGNvcnJlc3BvbmRpbmcgZXJyb3IgKGZvciBleGFtcGxlLCBhbiBlcnJvciB0aHJvd24gYnkgYSBmb3JtYXR0ZXIpIG9yXG5cdCAqICAgPGNvZGU+bnVsbDwvY29kZT4gaW4gY2FzZSB0aGUgYmluZGluZyBpcyBub3QgcmVhZHkgKGJlY2F1c2UgaXQgcmVmZXJzIHRvIGFcblx0ICogICBtb2RlbCB3aGljaCBpcyBub3QgYXZhaWxhYmxlKSAoc2luY2UgMS41Ny4wKVxuXHQgKi9cblx0Z2V0UmVzdWx0KHNWYWx1ZTogc3RyaW5nLCBlbGVtZW50PzogRWxlbWVudCk6IFByb21pc2U8Q29udGV4dD4gfCBudWxsO1xuXHRnZXRDb250ZXh0KHNQYXRoPzogc3RyaW5nKTogQ29udGV4dCB8IHVuZGVmaW5lZDtcblx0LyoqXG5cdCAqIFJldHVybnMgYSBjYWxsYmFjayBpbnRlcmZhY2UgaW5zdGFuY2UgZm9yIHRoZSBnaXZlbiBtYXAgb2YgdmFyaWFibGVzIHdoaWNoXG5cdCAqIG92ZXJyaWRlIGN1cnJlbnRseSBrbm93biB2YXJpYWJsZXMgb2YgdGhlIHNhbWUgbmFtZSBpbiA8Y29kZT50aGlzPC9jb2RlPlxuXHQgKiBwYXJlbnQgaW50ZXJmYWNlIG9yIHJlcGxhY2UgdGhlbSBhbHRvZ2V0aGVyLiBFYWNoIHZhcmlhYmxlIG5hbWUgYmVjb21lcyBhXG5cdCAqIG5hbWVkIG1vZGVsIHdpdGggYSBjb3JyZXNwb25kaW5nIG9iamVjdCBiaW5kaW5nIGFuZCBjYW4gYmUgdXNlZCBpbnNpZGUgdGhlXG5cdCAqIFhNTCB0ZW1wbGF0ZSBpbiB0aGUgdXN1YWwgd2F5LCB0aGF0IGlzLCB3aXRoIGEgYmluZGluZyBleHByZXNzaW9uIGxpa2Vcblx0ICogPGNvZGU+XCJ7dmFyPnNvbWUvcmVsYXRpdmUvcGF0aH1cIjwvY29kZT4gKHNlZSBleGFtcGxlKS5cblx0ICpcblx0ICogQHBhcmFtIFttVmFyaWFibGVzPXt9XVxuXHQgKiAgIE1hcCBmcm9tIHZhcmlhYmxlIG5hbWUgKHN0cmluZykgdG8gdmFsdWVcblx0ICogQHBhcmFtIFtiUmVwbGFjZV1cblx0ICogICBXaGV0aGVyIG9ubHkgdGhlIGdpdmVuIHZhcmlhYmxlcyBhcmUga25vd24gaW4gdGhlIG5ldyBjYWxsYmFjayBpbnRlcmZhY2Vcblx0ICogICBpbnN0YW5jZSwgbm8gaW5oZXJpdGVkIG9uZXNcblx0ICogQHJldHVybnNcblx0ICogICBBIGNhbGxiYWNrIGludGVyZmFjZSBpbnN0YW5jZVxuXHQgKiBAcGFyYW0gbVZhcmlhYmxlc1xuXHQgKiBAcGFyYW0gYlJlcGxhY2Vcblx0ICovXG5cdFwid2l0aFwiKG1WYXJpYWJsZXM/OiBSZWNvcmQ8c3RyaW5nLCBDb250ZXh0PiwgYlJlcGxhY2U/OiBib29sZWFuKTogSVZpc2l0b3JDYWxsYmFjaztcbn07XG5cbmZ1bmN0aW9uIHZhbGlkYXRlTWFjcm9NZXRhZGF0YUNvbnRleHQoXG5cdHNOYW1lOiBzdHJpbmcsXG5cdG1Db250ZXh0czogUmVjb3JkPHN0cmluZywgQ29udGV4dD4sXG5cdG9Db250ZXh0U2V0dGluZ3M6IEJ1aWxkaW5nQmxvY2tNZXRhZGF0YUNvbnRleHREZWZpbml0aW9uLFxuXHRzS2V5OiBzdHJpbmdcbik6IHZvaWQge1xuXHRjb25zdCBvQ29udGV4dCA9IG1Db250ZXh0c1tzS2V5XTtcblx0Y29uc3Qgb0NvbnRleHRPYmplY3QgPSBvQ29udGV4dD8uZ2V0T2JqZWN0KCkgYXMge1xuXHRcdCRUeXBlPzogc3RyaW5nO1xuXHRcdCRraW5kPzogc3RyaW5nO1xuXHR9O1xuXG5cdGlmIChvQ29udGV4dFNldHRpbmdzLnJlcXVpcmVkID09PSB0cnVlICYmICghb0NvbnRleHQgfHwgb0NvbnRleHRPYmplY3QgPT09IG51bGwpKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKGAke3NOYW1lfTogUmVxdWlyZWQgbWV0YWRhdGFDb250ZXh0ICcke3NLZXl9JyBpcyBtaXNzaW5nYCk7XG5cdH0gZWxzZSBpZiAob0NvbnRleHRPYmplY3QpIHtcblx0XHQvLyBJZiBjb250ZXh0IG9iamVjdCBoYXMgJGtpbmQgcHJvcGVydHksICRUeXBlIHNob3VsZCBub3QgYmUgY2hlY2tlZFxuXHRcdC8vIFRoZXJlZm9yZSByZW1vdmUgZnJvbSBjb250ZXh0IHNldHRpbmdzXG5cdFx0aWYgKG9Db250ZXh0T2JqZWN0Lmhhc093blByb3BlcnR5KFwiJGtpbmRcIikgJiYgb0NvbnRleHRPYmplY3QuJGtpbmQgIT09IHVuZGVmaW5lZCAmJiBvQ29udGV4dFNldHRpbmdzLmV4cGVjdGVkVHlwZXMgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Ly8gQ2hlY2sgaWYgdGhlICRraW5kIGlzIHBhcnQgb2YgdGhlIGFsbG93ZWQgb25lc1xuXHRcdFx0aWYgKCFvQ29udGV4dFNldHRpbmdzLmV4cGVjdGVkVHlwZXMuaW5jbHVkZXMob0NvbnRleHRPYmplY3QuJGtpbmQpKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcblx0XHRcdFx0XHRgJHtzTmFtZX06ICcke3NLZXl9JyBtdXN0IGJlICcka2luZCcgJyR7b0NvbnRleHRTZXR0aW5ncy5leHBlY3RlZFR5cGVzfScgYnV0IGlzICcke1xuXHRcdFx0XHRcdFx0b0NvbnRleHRPYmplY3QuJGtpbmRcblx0XHRcdFx0XHR9JzogJHtvQ29udGV4dC5nZXRQYXRoKCl9YFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRvQ29udGV4dE9iamVjdC5oYXNPd25Qcm9wZXJ0eShcIiRUeXBlXCIpICYmXG5cdFx0XHRvQ29udGV4dE9iamVjdC4kVHlwZSAhPT0gdW5kZWZpbmVkICYmXG5cdFx0XHRvQ29udGV4dFNldHRpbmdzLmV4cGVjdGVkQW5ub3RhdGlvblR5cGVzXG5cdFx0KSB7XG5cdFx0XHQvLyBDaGVjayBvbmx5ICRUeXBlXG5cdFx0XHRpZiAoIW9Db250ZXh0U2V0dGluZ3MuZXhwZWN0ZWRBbm5vdGF0aW9uVHlwZXMuaW5jbHVkZXMob0NvbnRleHRPYmplY3QuJFR5cGUpKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcblx0XHRcdFx0XHRgJHtzTmFtZX06ICcke3NLZXl9JyBtdXN0IGJlICckVHlwZScgJyR7b0NvbnRleHRTZXR0aW5ncy5leHBlY3RlZEFubm90YXRpb25UeXBlc30nIGJ1dCBpcyAnJHtcblx0XHRcdFx0XHRcdG9Db250ZXh0T2JqZWN0LiRUeXBlXG5cdFx0XHRcdFx0fSc6ICR7b0NvbnRleHQuZ2V0UGF0aCgpfWBcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn1cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZU1hY3JvU2lnbmF0dXJlKFxuXHRzTmFtZTogc3RyaW5nLFxuXHRvTWV0YWRhdGE6IFRyYW5zZm9ybWVkQnVpbGRpbmdCbG9ja01ldGFkYXRhLFxuXHRtQ29udGV4dHM6IFJlY29yZDxzdHJpbmcsIENvbnRleHQ+LFxuXHRvTm9kZTogRWxlbWVudFxuKTogdm9pZCB7XG5cdGNvbnN0IGFNZXRhZGF0YUNvbnRleHRLZXlzID0gKG9NZXRhZGF0YS5tZXRhZGF0YUNvbnRleHRzICYmIE9iamVjdC5rZXlzKG9NZXRhZGF0YS5tZXRhZGF0YUNvbnRleHRzKSkgfHwgW10sXG5cdFx0YVByb3BlcnRpZXMgPSAob01ldGFkYXRhLnByb3BlcnRpZXMgJiYgT2JqZWN0LmtleXMob01ldGFkYXRhLnByb3BlcnRpZXMpKSB8fCBbXSxcblx0XHRvQXR0cmlidXRlTmFtZXM6IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+ID0ge307XG5cblx0Ly8gY29sbGVjdCBhbGwgYXR0cmlidXRlcyB0byBmaW5kIHVuY2hlY2tlZCBwcm9wZXJ0aWVzXG5cdGNvbnN0IGF0dHJpYnV0ZU5hbWVzID0gb05vZGUuZ2V0QXR0cmlidXRlTmFtZXMoKTtcblx0Zm9yIChjb25zdCBhdHRyaWJ1dGVOYW1lIG9mIGF0dHJpYnV0ZU5hbWVzKSB7XG5cdFx0b0F0dHJpYnV0ZU5hbWVzW2F0dHJpYnV0ZU5hbWVdID0gdHJ1ZTtcblx0fVxuXG5cdC8vQ2hlY2sgbWV0YWRhdGFDb250ZXh0c1xuXHRhTWV0YWRhdGFDb250ZXh0S2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChzS2V5KSB7XG5cdFx0Y29uc3Qgb0NvbnRleHRTZXR0aW5ncyA9IG9NZXRhZGF0YS5tZXRhZGF0YUNvbnRleHRzW3NLZXldO1xuXG5cdFx0dmFsaWRhdGVNYWNyb01ldGFkYXRhQ29udGV4dChzTmFtZSwgbUNvbnRleHRzLCBvQ29udGV4dFNldHRpbmdzLCBzS2V5KTtcblx0XHRkZWxldGUgb0F0dHJpYnV0ZU5hbWVzW3NLZXldO1xuXHR9KTtcblx0Ly9DaGVjayBwcm9wZXJ0aWVzXG5cdGFQcm9wZXJ0aWVzLmZvckVhY2goZnVuY3Rpb24gKHNLZXkpIHtcblx0XHRjb25zdCBvUHJvcGVydHlTZXR0aW5ncyA9IG9NZXRhZGF0YS5wcm9wZXJ0aWVzW3NLZXldO1xuXHRcdGlmICghb05vZGUuaGFzQXR0cmlidXRlKHNLZXkpKSB7XG5cdFx0XHRpZiAob1Byb3BlcnR5U2V0dGluZ3MucmVxdWlyZWQgJiYgIW9Qcm9wZXJ0eVNldHRpbmdzLmhhc093blByb3BlcnR5KFwiZGVmYXVsdFZhbHVlXCIpKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihgJHtzTmFtZX06IGAgKyBgUmVxdWlyZWQgcHJvcGVydHkgJyR7c0tleX0nIGlzIG1pc3NpbmdgKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0ZGVsZXRlIG9BdHRyaWJ1dGVOYW1lc1tzS2V5XTtcblx0XHR9XG5cdH0pO1xuXG5cdC8vIFVuY2hlY2tlZCBwcm9wZXJ0aWVzXG5cdE9iamVjdC5rZXlzKG9BdHRyaWJ1dGVOYW1lcykuZm9yRWFjaChmdW5jdGlvbiAoc0tleTogc3RyaW5nKSB7XG5cdFx0Ly8gbm8gY2hlY2sgZm9yIHByb3BlcnRpZXMgd2hpY2ggY29udGFpbiBhIGNvbG9uIFwiOlwiIChkaWZmZXJlbnQgbmFtZXNwYWNlKSwgZS5nLiB4bWxuczp0cmFjZSwgdHJhY2U6bWFjcm9JRCwgdW5pdHRlc3Q6aWRcblx0XHRpZiAoIXNLZXkuaW5jbHVkZXMoXCI6XCIpICYmICFzS2V5LnN0YXJ0c1dpdGgoXCJ4bWxuc1wiKSkge1xuXHRcdFx0TG9nLndhcm5pbmcoYFVuY2hlY2tlZCBwYXJhbWV0ZXI6ICR7c05hbWV9OiAke3NLZXl9YCwgdW5kZWZpbmVkLCBMT0dHRVJfU0NPUEUpO1xuXHRcdH1cblx0fSk7XG59XG5cbmNvbnN0IFNBUF9VSV9DT1JFX0VMRU1FTlQgPSBcInNhcC51aS5jb3JlLkVsZW1lbnRcIjtcblxuZXhwb3J0IGNvbnN0IFNBUF9VSV9NT0RFTF9DT05URVhUID0gXCJzYXAudWkubW9kZWwuQ29udGV4dFwiO1xuXG4vKipcbiAqIFRyYW5zZm9ybXMgdGhlIG1ldGFkYXRhIG9mIGEgYnVpbGRpbmcgYmxvY2sgYnkgYWRkaW5nIGFkZGl0aW9uYWwgYWdncmVnYXRpb25zLFxuICogYW5kIHNwbGl0dGluZyBwcm9wZXJ0aWVzIGludG8gYWN0dWFsIHByb3BlcnRpZXMgYW5kIG1ldGFkYXRhIGNvbnRleHRzLlxuICpcbiAqIEBwYXJhbSBidWlsZGluZ0Jsb2NrTWV0YWRhdGEgVGhlIG1ldGFkYXRhIHJlY2VpdmVkIGZyb20gdGhlIGlucHV0XG4gKiBAcmV0dXJucyBUaGUgdHJhbnNmb3JtZWQgbWV0YWRhdGFcbiAqL1xuZnVuY3Rpb24gdHJhbnNmb3JtTWV0YWRhdGEoYnVpbGRpbmdCbG9ja01ldGFkYXRhOiBCdWlsZGluZ0Jsb2NrTWV0YWRhdGEpOiBUcmFuc2Zvcm1lZEJ1aWxkaW5nQmxvY2tNZXRhZGF0YSB7XG5cdGNvbnN0IHByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIEJ1aWxkaW5nQmxvY2tQcm9wZXJ0eURlZmluaXRpb24+ID0ge1xuXHRcdGNsYXNzOiB7XG5cdFx0XHR0eXBlOiBcInN0cmluZ1wiLFxuXHRcdFx0aXNQdWJsaWM6IHRydWVcblx0XHR9XG5cdH07XG5cdGNvbnN0IGFnZ3JlZ2F0aW9uczogUmVjb3JkPHN0cmluZywgQnVpbGRpbmdCbG9ja0FnZ3JlZ2F0aW9uRGVmaW5pdGlvbj4gPSB7XG5cdFx0ZGVwZW5kZW50czoge1xuXHRcdFx0dHlwZTogU0FQX1VJX0NPUkVfRUxFTUVOVCxcblx0XHRcdHNsb3Q6IFwiZGVwZW5kZW50c1wiLFxuXHRcdFx0aXNQdWJsaWM6IHRydWVcblx0XHR9LFxuXHRcdGN1c3RvbURhdGE6IHtcblx0XHRcdHR5cGU6IFNBUF9VSV9DT1JFX0VMRU1FTlQsXG5cdFx0XHRzbG90OiBcImN1c3RvbURhdGFcIixcblx0XHRcdGlzUHVibGljOiB0cnVlXG5cdFx0fSxcblx0XHRsYXlvdXREYXRhOiB7XG5cdFx0XHR0eXBlOiBTQVBfVUlfQ09SRV9FTEVNRU5ULFxuXHRcdFx0c2xvdDogXCJsYXlvdXREYXRhXCIsXG5cdFx0XHRpc1B1YmxpYzogdHJ1ZVxuXHRcdH0sXG5cdFx0Li4uYnVpbGRpbmdCbG9ja01ldGFkYXRhLmFnZ3JlZ2F0aW9uc1xuXHR9O1xuXHRjb25zdCBtZXRhZGF0YUNvbnRleHRzOiBSZWNvcmQ8c3RyaW5nLCBCdWlsZGluZ0Jsb2NrTWV0YWRhdGFDb250ZXh0RGVmaW5pdGlvbj4gPSB7fTtcblxuXHRmb3IgKGNvbnN0IHByb3BlcnR5TmFtZSBvZiBPYmplY3Qua2V5cyhidWlsZGluZ0Jsb2NrTWV0YWRhdGEucHJvcGVydGllcykpIHtcblx0XHRjb25zdCBwcm9wZXJ0eVR5cGUgPSBidWlsZGluZ0Jsb2NrTWV0YWRhdGEucHJvcGVydGllc1twcm9wZXJ0eU5hbWVdLnR5cGU7XG5cblx0XHRpZiAocHJvcGVydHlUeXBlICE9PSBTQVBfVUlfTU9ERUxfQ09OVEVYVCkge1xuXHRcdFx0cHJvcGVydGllc1twcm9wZXJ0eU5hbWVdID0gYnVpbGRpbmdCbG9ja01ldGFkYXRhLnByb3BlcnRpZXNbcHJvcGVydHlOYW1lXTtcblx0XHR9XG5cblx0XHRpZiAoW1NBUF9VSV9NT0RFTF9DT05URVhULCBcIm9iamVjdFwiLCBcImFycmF5XCJdLmluY2x1ZGVzKHByb3BlcnR5VHlwZSkpIHtcblx0XHRcdC8vIEV4cGxpY2l0bHkgZGVmaW5lZCBjb250ZXh0cywgb2JqZWN0cywgYW5kIGFycmF5cyBtYXkgY29tZSBmcm9tIHRoZSBtZXRhZGF0YUNvbnRleHRcblx0XHRcdG1ldGFkYXRhQ29udGV4dHNbcHJvcGVydHlOYW1lXSA9IGJ1aWxkaW5nQmxvY2tNZXRhZGF0YS5wcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV0gYXMgQnVpbGRpbmdCbG9ja01ldGFkYXRhQ29udGV4dERlZmluaXRpb247XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIHtcblx0XHQuLi5idWlsZGluZ0Jsb2NrTWV0YWRhdGEsXG5cdFx0cHJvcGVydGllcyxcblx0XHRtZXRhZGF0YUNvbnRleHRzLFxuXHRcdGFnZ3JlZ2F0aW9uc1xuXHR9O1xufVxuXG4vKipcbiAqIENoZWNrcyB0aGUgYWJzb2x1dGUgb3IgY29udGV4dCBwYXRocyBhbmQgcmV0dXJucyBhbiBhcHByb3ByaWF0ZSBNZXRhQ29udGV4dC5cbiAqXG4gKiBAcGFyYW0gb1NldHRpbmdzIEFkZGl0aW9uYWwgc2V0dGluZ3NcbiAqIEBwYXJhbSBzQXR0cmlidXRlVmFsdWUgVGhlIGF0dHJpYnV0ZSB2YWx1ZVxuICogQHJldHVybnMgVGhlIG1ldGEgZGF0YSBjb250ZXh0IG9iamVjdFxuICovXG5mdW5jdGlvbiBfY2hlY2tBYnNvbHV0ZUFuZENvbnRleHRQYXRocyhvU2V0dGluZ3M6IFRlbXBsYXRlUHJvY2Vzc29yU2V0dGluZ3MsIHNBdHRyaWJ1dGVWYWx1ZTogc3RyaW5nKTogTWV0YURhdGFDb250ZXh0IHtcblx0bGV0IHNNZXRhUGF0aDogc3RyaW5nO1xuXHRpZiAoc0F0dHJpYnV0ZVZhbHVlICYmIHNBdHRyaWJ1dGVWYWx1ZS5zdGFydHNXaXRoKFwiL1wiKSkge1xuXHRcdC8vIGFic29sdXRlIHBhdGggLSB3ZSBqdXN0IHVzZSB0aGlzIG9uZVxuXHRcdHNNZXRhUGF0aCA9IHNBdHRyaWJ1dGVWYWx1ZTtcblx0fSBlbHNlIHtcblx0XHRsZXQgc0NvbnRleHRQYXRoID0gb1NldHRpbmdzLmN1cnJlbnRDb250ZXh0UGF0aC5nZXRQYXRoKCk7XG5cdFx0aWYgKCFzQ29udGV4dFBhdGguZW5kc1dpdGgoXCIvXCIpKSB7XG5cdFx0XHRzQ29udGV4dFBhdGggKz0gXCIvXCI7XG5cdFx0fVxuXHRcdHNNZXRhUGF0aCA9IHNDb250ZXh0UGF0aCArIHNBdHRyaWJ1dGVWYWx1ZTtcblx0fVxuXHRyZXR1cm4ge1xuXHRcdG1vZGVsOiBcIm1ldGFNb2RlbFwiLFxuXHRcdHBhdGg6IHNNZXRhUGF0aFxuXHR9O1xufVxuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGhlbHBzIHRvIGNyZWF0ZSB0aGUgbWV0YWRhdGEgY29udGV4dCBpbiBjYXNlIGl0IGlzIG5vdCB5ZXQgYXZhaWxhYmxlIGluIHRoZSBzdG9yZS5cbiAqXG4gKiBAcGFyYW0gb1NldHRpbmdzIEFkZGl0aW9uYWwgc2V0dGluZ3NcbiAqIEBwYXJhbSBzQXR0cmlidXRlTmFtZSBUaGUgYXR0cmlidXRlIG5hbWVcbiAqIEBwYXJhbSBzQXR0cmlidXRlVmFsdWUgVGhlIGF0dHJpYnV0ZSB2YWx1ZVxuICogQHJldHVybnMgVGhlIG1ldGEgZGF0YSBjb250ZXh0IG9iamVjdFxuICovXG5mdW5jdGlvbiBfY3JlYXRlSW5pdGlhbE1ldGFkYXRhQ29udGV4dChcblx0b1NldHRpbmdzOiBUZW1wbGF0ZVByb2Nlc3NvclNldHRpbmdzLFxuXHRzQXR0cmlidXRlTmFtZTogc3RyaW5nLFxuXHRzQXR0cmlidXRlVmFsdWU6IHN0cmluZ1xuKTogTWV0YURhdGFDb250ZXh0IHtcblx0bGV0IHJldHVybkNvbnRleHQ6IE1ldGFEYXRhQ29udGV4dDtcblx0aWYgKHNBdHRyaWJ1dGVWYWx1ZS5zdGFydHNXaXRoKFwiL3VpZC0tXCIpICYmICFvU2V0dGluZ3MubW9kZWxzLmNvbnZlcnRlckNvbnRleHQuZ2V0UHJvcGVydHkoc0F0dHJpYnV0ZVZhbHVlKSkge1xuXHRcdGNvbnN0IGRhdGEgPSB1bnN0b3JlT2JqZWN0VmFsdWUoc0F0dHJpYnV0ZVZhbHVlKTtcblx0XHRvU2V0dGluZ3MubW9kZWxzLmNvbnZlcnRlckNvbnRleHQuc2V0UHJvcGVydHkoc0F0dHJpYnV0ZVZhbHVlLCBkYXRhKTtcblx0XHRyZXR1cm5Db250ZXh0ID0ge1xuXHRcdFx0bW9kZWw6IFwiY29udmVydGVyQ29udGV4dFwiLFxuXHRcdFx0cGF0aDogc0F0dHJpYnV0ZVZhbHVlXG5cdFx0fTtcblx0fSBlbHNlIGlmICgoc0F0dHJpYnV0ZU5hbWUgPT09IFwibWV0YVBhdGhcIiAmJiBvU2V0dGluZ3MuY3VycmVudENvbnRleHRQYXRoKSB8fCBzQXR0cmlidXRlTmFtZSA9PT0gXCJjb250ZXh0UGF0aFwiKSB7XG5cdFx0cmV0dXJuQ29udGV4dCA9IF9jaGVja0Fic29sdXRlQW5kQ29udGV4dFBhdGhzKG9TZXR0aW5ncywgc0F0dHJpYnV0ZVZhbHVlKTtcblx0fSBlbHNlIGlmIChzQXR0cmlidXRlVmFsdWUgJiYgc0F0dHJpYnV0ZVZhbHVlLnN0YXJ0c1dpdGgoXCIvXCIpKSB7XG5cdFx0Ly8gYWJzb2x1dGUgcGF0aCAtIHdlIGp1c3QgdXNlIHRoaXMgb25lXG5cdFx0cmV0dXJuQ29udGV4dCA9IHtcblx0XHRcdG1vZGVsOiBcIm1ldGFNb2RlbFwiLFxuXHRcdFx0cGF0aDogc0F0dHJpYnV0ZVZhbHVlXG5cdFx0fTtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm5Db250ZXh0ID0ge1xuXHRcdFx0bW9kZWw6IFwibWV0YU1vZGVsXCIsXG5cdFx0XHRwYXRoOiBvU2V0dGluZ3MuYmluZGluZ0NvbnRleHRzLmVudGl0eVNldCA/IG9TZXR0aW5ncy5iaW5kaW5nQ29udGV4dHMuZW50aXR5U2V0LmdldFBhdGgoc0F0dHJpYnV0ZVZhbHVlKSA6IHNBdHRyaWJ1dGVWYWx1ZVxuXHRcdH07XG5cdH1cblx0cmV0dXJuIHJldHVybkNvbnRleHQ7XG59XG5cbmZ1bmN0aW9uIF9nZXRNZXRhZGF0YUNvbnRleHQoXG5cdG9TZXR0aW5nczogVGVtcGxhdGVQcm9jZXNzb3JTZXR0aW5ncyxcblx0b05vZGU6IEVsZW1lbnQsXG5cdHNBdHRyaWJ1dGVOYW1lOiBzdHJpbmcsXG5cdG9WaXNpdG9yOiBJVmlzaXRvckNhbGxiYWNrLFxuXHRiRG9Ob3RSZXNvbHZlOiBib29sZWFuLFxuXHRpc09wZW46IGJvb2xlYW5cbik6IE1ldGFEYXRhQ29udGV4dCB8IHVuZGVmaW5lZCB7XG5cdGxldCBvTWV0YWRhdGFDb250ZXh0OiBNZXRhRGF0YUNvbnRleHQgfCB1bmRlZmluZWQ7XG5cdGlmICghYkRvTm90UmVzb2x2ZSAmJiBvTm9kZS5oYXNBdHRyaWJ1dGUoc0F0dHJpYnV0ZU5hbWUpKSB7XG5cdFx0Y29uc3Qgc0F0dHJpYnV0ZVZhbHVlID0gb05vZGUuZ2V0QXR0cmlidXRlKHNBdHRyaWJ1dGVOYW1lKSBhcyBzdHJpbmc7XG5cdFx0b01ldGFkYXRhQ29udGV4dCA9IEJpbmRpbmdQYXJzZXIuY29tcGxleFBhcnNlcihzQXR0cmlidXRlVmFsdWUpO1xuXHRcdGlmICghb01ldGFkYXRhQ29udGV4dCkge1xuXHRcdFx0b01ldGFkYXRhQ29udGV4dCA9IF9jcmVhdGVJbml0aWFsTWV0YWRhdGFDb250ZXh0KG9TZXR0aW5ncywgc0F0dHJpYnV0ZU5hbWUsIHNBdHRyaWJ1dGVWYWx1ZSk7XG5cdFx0fVxuXHR9IGVsc2UgaWYgKG9TZXR0aW5ncy5iaW5kaW5nQ29udGV4dHMuaGFzT3duUHJvcGVydHkoc0F0dHJpYnV0ZU5hbWUpKSB7XG5cdFx0b01ldGFkYXRhQ29udGV4dCA9IHtcblx0XHRcdG1vZGVsOiBzQXR0cmlidXRlTmFtZSxcblx0XHRcdHBhdGg6IFwiXCJcblx0XHR9O1xuXHR9IGVsc2UgaWYgKGlzT3Blbikge1xuXHRcdHRyeSB7XG5cdFx0XHRpZiAob1Zpc2l0b3IuZ2V0Q29udGV4dChgJHtzQXR0cmlidXRlTmFtZX0+YCkpIHtcblx0XHRcdFx0b01ldGFkYXRhQ29udGV4dCA9IHtcblx0XHRcdFx0XHRtb2RlbDogc0F0dHJpYnV0ZU5hbWUsXG5cdFx0XHRcdFx0cGF0aDogXCJcIlxuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBvTWV0YWRhdGFDb250ZXh0O1xufVxuXG4vKipcbiAqIFBhcnNlIHRoZSBpbmNvbWluZyBYTUwgbm9kZSBhbmQgdHJ5IHRvIHJlc29sdmUgdGhlIHByb3BlcnRpZXMgZGVmaW5lZCB0aGVyZS5cbiAqXG4gKiBAcGFyYW0gb01ldGFkYXRhIFRoZSBtZXRhZGF0YSBmb3IgdGhlIGJ1aWxkaW5nIGJsb2NrXG4gKiBAcGFyYW0gb05vZGUgVGhlIFhNTCBub2RlIHRvIHBhcnNlXG4gKiBAcGFyYW0gaXNQdWJsaWMgV2hldGhlciB0aGUgYnVpbGRpbmcgYmxvY2sgaXMgdXNlZCBpbiBhIHB1YmxpYyBjb250ZXh0IG9yIG5vdFxuICogQHBhcmFtIG9WaXNpdG9yIFRoZSB2aXNpdG9yIGluc3RhbmNlXG4gKiBAcmV0dXJucyBUaGUgcHJvY2Vzc2VkIHByb3BlcnRpZXNcbiAqL1xuYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc1Byb3BlcnRpZXMoXG5cdG9NZXRhZGF0YTogVHJhbnNmb3JtZWRCdWlsZGluZ0Jsb2NrTWV0YWRhdGEsXG5cdG9Ob2RlOiBFbGVtZW50LFxuXHRpc1B1YmxpYzogYm9vbGVhbixcblx0b1Zpc2l0b3I6IElWaXNpdG9yQ2FsbGJhY2tcbik6IFByb21pc2U8UmVjb3JkPHN0cmluZywgT2JqZWN0VmFsdWU+PiB7XG5cdGNvbnN0IGRlZmluaXRpb25Qcm9wZXJ0aWVzID0gb01ldGFkYXRhLnByb3BlcnRpZXM7XG5cblx0Ly8gUmV0cmlldmUgcHJvcGVydGllcyB2YWx1ZXNcblx0Y29uc3QgYURlZmluaXRpb25Qcm9wZXJ0aWVzS2V5cyA9IE9iamVjdC5rZXlzKGRlZmluaXRpb25Qcm9wZXJ0aWVzKTtcblxuXHRjb25zdCBwcm9wZXJ0eVZhbHVlczogUmVjb3JkPHN0cmluZywgT2JqZWN0VmFsdWU+ID0ge307XG5cdGZvciAoY29uc3Qgc0tleVZhbHVlIG9mIGFEZWZpbml0aW9uUHJvcGVydGllc0tleXMpIHtcblx0XHRpZiAoZGVmaW5pdGlvblByb3BlcnRpZXNbc0tleVZhbHVlXS50eXBlID09PSBcIm9iamVjdFwiKSB7XG5cdFx0XHRwcm9wZXJ0eVZhbHVlc1tzS2V5VmFsdWVdID1cblx0XHRcdFx0ZGVmaW5pdGlvblByb3BlcnRpZXNbc0tleVZhbHVlXS5kZWZhdWx0VmFsdWUgJiYgZGVlcENsb25lKGRlZmluaXRpb25Qcm9wZXJ0aWVzW3NLZXlWYWx1ZV0uZGVmYXVsdFZhbHVlKTsgLy8gVG8gYXZvaWQgdmFsdWVzIGJlaW5nIHJldXNlZCBhY3Jvc3MgbWFjcm9zXG5cdFx0fSBlbHNlIHtcblx0XHRcdHByb3BlcnR5VmFsdWVzW3NLZXlWYWx1ZV0gPSBkZWZpbml0aW9uUHJvcGVydGllc1tzS2V5VmFsdWVdLmRlZmF1bHRWYWx1ZSBhcyBzdHJpbmcgfCBib29sZWFuIHwgbnVtYmVyO1xuXHRcdH1cblxuXHRcdGlmIChvTm9kZS5oYXNBdHRyaWJ1dGUoc0tleVZhbHVlKSAmJiBpc1B1YmxpYyAmJiBkZWZpbml0aW9uUHJvcGVydGllc1tzS2V5VmFsdWVdLmlzUHVibGljICE9PSB0cnVlKSB7XG5cdFx0XHRMb2cuZXJyb3IoYFByb3BlcnR5ICR7c0tleVZhbHVlfSB3YXMgaWdub3JlZCBhcyBpdCBpcyBub3QgaW50ZW5kZWQgZm9yIHB1YmxpYyB1c2FnZWApO1xuXHRcdH0gZWxzZSBpZiAob05vZGUuaGFzQXR0cmlidXRlKHNLZXlWYWx1ZSkpIHtcblx0XHRcdGF3YWl0IG9WaXNpdG9yLnZpc2l0QXR0cmlidXRlKG9Ob2RlLCBvTm9kZS5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbShzS2V5VmFsdWUpIGFzIEF0dHIpO1xuXHRcdFx0bGV0IHZhbHVlOiBzdHJpbmcgfCBib29sZWFuIHwgbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCA9IG9Ob2RlLmdldEF0dHJpYnV0ZShzS2V5VmFsdWUpO1xuXHRcdFx0aWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IG51bGwpIHtcblx0XHRcdFx0aWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiAmJiAhdmFsdWUuc3RhcnRzV2l0aChcIntcIikpIHtcblx0XHRcdFx0XHRzd2l0Y2ggKGRlZmluaXRpb25Qcm9wZXJ0aWVzW3NLZXlWYWx1ZV0udHlwZSkge1xuXHRcdFx0XHRcdFx0Y2FzZSBcImJvb2xlYW5cIjpcblx0XHRcdFx0XHRcdFx0dmFsdWUgPSB2YWx1ZSA9PT0gXCJ0cnVlXCI7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0Y2FzZSBcIm51bWJlclwiOlxuXHRcdFx0XHRcdFx0XHR2YWx1ZSA9IE51bWJlcih2YWx1ZSk7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHR2YWx1ZSA9IHZhbHVlID09PSBudWxsID8gdW5kZWZpbmVkIDogdmFsdWU7XG5cdFx0XHRcdHByb3BlcnR5VmFsdWVzW3NLZXlWYWx1ZV0gPSB2YWx1ZTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0cmV0dXJuIHByb3BlcnR5VmFsdWVzO1xufVxuXG4vKipcbiAqIFBhcnNlIHRoZSBpbmNvbWluZyBYTUwgbm9kZSBhbmQgdHJ5IHRvIHJlc29sdmUgdGhlIGJpbmRpbmcgY29udGV4dHMgZGVmaW5lZCBpbnNpZGUuXG4gKlxuICogQHBhcmFtIG9NZXRhZGF0YSBUaGUgbWV0YWRhdGEgZm9yIHRoZSBidWlsZGluZyBibG9ja1xuICogQHBhcmFtIG9TZXR0aW5ncyBUaGUgc2V0dGluZ3Mgb2JqZWN0XG4gKiBAcGFyYW0gb05vZGUgVGhlIFhNTCBub2RlIHRvIHBhcnNlXG4gKiBAcGFyYW0gaXNQdWJsaWMgV2hldGhlciB0aGUgYnVpbGRpbmcgYmxvY2sgaXMgdXNlZCBpbiBhIHB1YmxpYyBjb250ZXh0IG9yIG5vdFxuICogQHBhcmFtIG9WaXNpdG9yIFRoZSB2aXNpdG9yIGluc3RhbmNlXG4gKiBAcGFyYW0gbUNvbnRleHRzIFRoZSBjb250ZXh0cyB0byBiZSB1c2VkXG4gKiBAcGFyYW0gcHJvcGVydHlWYWx1ZXMgVGhlIGN1cnJlbnQgcHJvcGVydHkgdmFsdWVzXG4gKiBAcmV0dXJucyBUaGUgcHJvY2Vzc2VkIGFuZCBtaXNzaW5nIGNvbnRleHRzXG4gKi9cbmZ1bmN0aW9uIHByb2Nlc3NDb250ZXh0cyhcblx0b01ldGFkYXRhOiBUcmFuc2Zvcm1lZEJ1aWxkaW5nQmxvY2tNZXRhZGF0YSxcblx0b1NldHRpbmdzOiBUZW1wbGF0ZVByb2Nlc3NvclNldHRpbmdzLFxuXHRvTm9kZTogRWxlbWVudCxcblx0aXNQdWJsaWM6IGJvb2xlYW4sXG5cdG9WaXNpdG9yOiBJVmlzaXRvckNhbGxiYWNrLFxuXHRtQ29udGV4dHM6IFJlY29yZDxzdHJpbmcsIENvbnRleHQ+LFxuXHRwcm9wZXJ0eVZhbHVlczogUmVjb3JkPHN0cmluZywgT2JqZWN0VmFsdWU+XG4pOiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPiB7XG5cdG9TZXR0aW5ncy5jdXJyZW50Q29udGV4dFBhdGggPSBvU2V0dGluZ3MuYmluZGluZ0NvbnRleHRzLmNvbnRleHRQYXRoO1xuXHRjb25zdCBtTWlzc2luZ0NvbnRleHQ6IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+ID0ge307XG5cdGNvbnN0IG9EZWZpbml0aW9uQ29udGV4dHMgPSBvTWV0YWRhdGEubWV0YWRhdGFDb250ZXh0cztcblx0Y29uc3QgYURlZmluaXRpb25Db250ZXh0c0tleXMgPSBPYmplY3Qua2V5cyhvRGVmaW5pdGlvbkNvbnRleHRzKTtcblx0Ly8gU2luY2UgdGhlIG1ldGFQYXRoIGFuZCBvdGhlciBwcm9wZXJ0eSBjYW4gYmUgcmVsYXRpdmUgdG8gdGhlIGNvbnRleHRQYXRoIHdlIG5lZWQgdG8gZXZhbHVhdGUgdGhlIGN1cnJlbnQgY29udGV4dFBhdGggZmlyc3Rcblx0Y29uc3QgY29udGV4dFBhdGhJbmRleCA9IGFEZWZpbml0aW9uQ29udGV4dHNLZXlzLmluZGV4T2YoXCJjb250ZXh0UGF0aFwiKTtcblx0aWYgKGNvbnRleHRQYXRoSW5kZXggIT09IC0xKSB7XG5cdFx0Ly8gSWYgaXQgaXMgZGVmaW5lZCB3ZSBleHRyYWN0IGl0IGFuZCByZWluc2VydCBpdCBpbiB0aGUgZmlyc3QgcG9zaXRpb24gb2YgdGhlIGFycmF5XG5cdFx0Y29uc3QgY29udGV4dFBhdGhEZWZpbml0aW9uID0gYURlZmluaXRpb25Db250ZXh0c0tleXMuc3BsaWNlKGNvbnRleHRQYXRoSW5kZXgsIDEpO1xuXHRcdGFEZWZpbml0aW9uQ29udGV4dHNLZXlzLnNwbGljZSgwLCAwLCBjb250ZXh0UGF0aERlZmluaXRpb25bMF0pO1xuXHR9XG5cdGZvciAoY29uc3Qgc0F0dHJpYnV0ZU5hbWUgb2YgYURlZmluaXRpb25Db250ZXh0c0tleXMpIHtcblx0XHQvLyBJZiB0aGUgY29udGV4dCB3YXMgcmVzb2x2ZWQgYXMgYSBwcm9wZXJ0eSAoYmluZGluZyAvIHhtbCBhZ2dyZWdhdGlvbikgdGhlbiB3ZSBkb24ndCBuZWVkIHRvIHJlc29sdmUgaXQgaGVyZS5cblx0XHRjb25zdCBwcm9wZXJ0eVZhbHVlID0gcHJvcGVydHlWYWx1ZXNbc0F0dHJpYnV0ZU5hbWVdO1xuXHRcdGlmIChwcm9wZXJ0eVZhbHVlICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIHByb3BlcnR5VmFsdWUgPT09IFwib2JqZWN0XCIgJiYgT2JqZWN0LmtleXMocHJvcGVydHlWYWx1ZSBhcyBvYmplY3QpLmxlbmd0aCA+IDApIHtcblx0XHRcdGRlbGV0ZSBvTWV0YWRhdGEubWV0YWRhdGFDb250ZXh0c1tzQXR0cmlidXRlTmFtZV07XG5cdFx0XHRjb250aW51ZTtcblx0XHR9XG5cdFx0Y29uc3QgYkRvTm90UmVzb2x2ZSA9IGlzUHVibGljICYmIG9EZWZpbml0aW9uQ29udGV4dHNbc0F0dHJpYnV0ZU5hbWVdLmlzUHVibGljID09PSBmYWxzZSAmJiBvTm9kZS5oYXNBdHRyaWJ1dGUoc0F0dHJpYnV0ZU5hbWUpO1xuXHRcdGNvbnN0IG9NZXRhZGF0YUNvbnRleHQgPSBfZ2V0TWV0YWRhdGFDb250ZXh0KG9TZXR0aW5ncywgb05vZGUsIHNBdHRyaWJ1dGVOYW1lLCBvVmlzaXRvciwgYkRvTm90UmVzb2x2ZSwgb01ldGFkYXRhLmlzT3BlbiA/PyBmYWxzZSk7XG5cdFx0aWYgKG9NZXRhZGF0YUNvbnRleHQpIHtcblx0XHRcdG9NZXRhZGF0YUNvbnRleHQubmFtZSA9IHNBdHRyaWJ1dGVOYW1lO1xuXHRcdFx0YWRkU2luZ2xlQ29udGV4dChtQ29udGV4dHMsIG9WaXNpdG9yLCBvTWV0YWRhdGFDb250ZXh0KTtcblx0XHRcdGlmIChcblx0XHRcdFx0KHNBdHRyaWJ1dGVOYW1lID09PSBcImVudGl0eVNldFwiIHx8IHNBdHRyaWJ1dGVOYW1lID09PSBcImNvbnRleHRQYXRoXCIpICYmXG5cdFx0XHRcdCFvU2V0dGluZ3MuYmluZGluZ0NvbnRleHRzLmhhc093blByb3BlcnR5KHNBdHRyaWJ1dGVOYW1lKVxuXHRcdFx0KSB7XG5cdFx0XHRcdG9TZXR0aW5ncy5iaW5kaW5nQ29udGV4dHNbc0F0dHJpYnV0ZU5hbWVdID0gbUNvbnRleHRzW3NBdHRyaWJ1dGVOYW1lXTtcblx0XHRcdH1cblx0XHRcdGlmIChzQXR0cmlidXRlTmFtZSA9PT0gXCJjb250ZXh0UGF0aFwiKSB7XG5cdFx0XHRcdG9TZXR0aW5ncy5jdXJyZW50Q29udGV4dFBhdGggPSBtQ29udGV4dHNbc0F0dHJpYnV0ZU5hbWVdO1xuXHRcdFx0fVxuXHRcdFx0aWYgKG1Db250ZXh0c1tzQXR0cmlidXRlTmFtZV0gIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRwcm9wZXJ0eVZhbHVlc1tzQXR0cmlidXRlTmFtZV0gPSBtQ29udGV4dHNbc0F0dHJpYnV0ZU5hbWVdO1xuXHRcdFx0fSBlbHNlIGlmICh0eXBlb2YgcHJvcGVydHlWYWx1ZXNbc0F0dHJpYnV0ZU5hbWVdID09PSBcInN0cmluZ1wiKSB7XG5cdFx0XHRcdC8vIElmIHRoZSBiaW5kaW5nIGNvdWxkbid0IGJlIHJlc29sdmVkIGNvbnNpZGVyIHRoYXQgdGhlcmUgd2FzIG5vIHZhbHVlIGhlcmVcblx0XHRcdFx0ZGVsZXRlIG9NZXRhZGF0YS5tZXRhZGF0YUNvbnRleHRzW3NBdHRyaWJ1dGVOYW1lXTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0bU1pc3NpbmdDb250ZXh0W3NBdHRyaWJ1dGVOYW1lXSA9IHRydWU7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBtTWlzc2luZ0NvbnRleHQ7XG59XG5cbmV4cG9ydCB0eXBlIEJ1aWxkaW5nQmxvY2tBZ2dyZWdhdGlvbiA9IHtcblx0a2V5OiBzdHJpbmc7XG5cdHBvc2l0aW9uOiBQb3NpdGlvbjtcblx0dHlwZTogXCJTbG90XCI7XG59O1xuZnVuY3Rpb24gcGFyc2VBZ2dyZWdhdGlvbihvQWdncmVnYXRpb24/OiBFbGVtZW50LCBwcm9jZXNzQWdncmVnYXRpb25zPzogRnVuY3Rpb24pOiBSZWNvcmQ8c3RyaW5nLCBCdWlsZGluZ0Jsb2NrQWdncmVnYXRpb24+IHtcblx0Y29uc3Qgb091dE9iamVjdHM6IFJlY29yZDxzdHJpbmcsIEJ1aWxkaW5nQmxvY2tBZ2dyZWdhdGlvbj4gPSB7fTtcblx0aWYgKG9BZ2dyZWdhdGlvbiAmJiBvQWdncmVnYXRpb24uY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuXHRcdGNvbnN0IGNoaWxkcmVuID0gb0FnZ3JlZ2F0aW9uLmNoaWxkcmVuO1xuXHRcdGZvciAobGV0IGNoaWxkSWR4ID0gMDsgY2hpbGRJZHggPCBjaGlsZHJlbi5sZW5ndGg7IGNoaWxkSWR4KyspIHtcblx0XHRcdGNvbnN0IGNoaWxkRGVmaW5pdGlvbiA9IGNoaWxkcmVuW2NoaWxkSWR4XTtcblx0XHRcdGxldCBjaGlsZEtleSA9IGNoaWxkRGVmaW5pdGlvbi5nZXRBdHRyaWJ1dGUoXCJrZXlcIikgfHwgY2hpbGREZWZpbml0aW9uLmdldEF0dHJpYnV0ZShcImlkXCIpO1xuXHRcdFx0aWYgKGNoaWxkS2V5KSB7XG5cdFx0XHRcdGNoaWxkS2V5ID0gYElubGluZVhNTF8ke2NoaWxkS2V5fWA7XG5cdFx0XHRcdGNoaWxkRGVmaW5pdGlvbi5zZXRBdHRyaWJ1dGUoXCJrZXlcIiwgY2hpbGRLZXkpO1xuXHRcdFx0XHRsZXQgYWdncmVnYXRpb25PYmplY3Q6IEJ1aWxkaW5nQmxvY2tBZ2dyZWdhdGlvbiA9IHtcblx0XHRcdFx0XHRrZXk6IGNoaWxkS2V5LFxuXHRcdFx0XHRcdHBvc2l0aW9uOiB7XG5cdFx0XHRcdFx0XHRwbGFjZW1lbnQ6IChjaGlsZERlZmluaXRpb24uZ2V0QXR0cmlidXRlKFwicGxhY2VtZW50XCIpIGFzIFBsYWNlbWVudCkgfHwgUGxhY2VtZW50LkFmdGVyLFxuXHRcdFx0XHRcdFx0YW5jaG9yOiBjaGlsZERlZmluaXRpb24uZ2V0QXR0cmlidXRlKFwiYW5jaG9yXCIpIHx8IHVuZGVmaW5lZFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0dHlwZTogXCJTbG90XCJcblx0XHRcdFx0fTtcblx0XHRcdFx0aWYgKHByb2Nlc3NBZ2dyZWdhdGlvbnMpIHtcblx0XHRcdFx0XHRhZ2dyZWdhdGlvbk9iamVjdCA9IHByb2Nlc3NBZ2dyZWdhdGlvbnMoY2hpbGREZWZpbml0aW9uLCBhZ2dyZWdhdGlvbk9iamVjdCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0b091dE9iamVjdHNbYWdncmVnYXRpb25PYmplY3Qua2V5XSA9IGFnZ3JlZ2F0aW9uT2JqZWN0O1xuXHRcdFx0fSBlbHNlIGlmIChjaGlsZERlZmluaXRpb24udGFnTmFtZSAhPT0gXCJzbG90XCIpIHtcblx0XHRcdFx0TG9nLmVycm9yKGBUaGUgYWdncmVnYXRpb24gJHtjaGlsZERlZmluaXRpb24ubm9kZU5hbWV9IGlzIG1pc3NpbmcgYSBLZXkgYXR0cmlidXRlLiBJdCBpcyBub3QgZGlzcGxheWVkYCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdHJldHVybiBvT3V0T2JqZWN0cztcbn1cblxuLyoqXG4gKiBQcm9jZXNzZXMgdGhlIGNoaWxkIG5vZGVzIG9mIHRoZSBidWlsZGluZyBibG9jayBwcm9wZXJ0aWVzIHdoZW4gdGhlIHR5cGUgaXMgYW4gb2JqZWN0LlxuICpcbiAqIEBwYXJhbSBlbGVtZW50IFRoZSBYTUwgZWxlbWVudCB0byBwYXJzZVxuICogQHJldHVybnMgVGhlIHByb2Nlc3NlZCBvYmplY3RcbiAqL1xuZnVuY3Rpb24gcHJvY2Vzc09iamVjdChlbGVtZW50OiBFbGVtZW50KTogb2JqZWN0IHtcblx0Y29uc3QgY2hpbGRyZW4gPSBlbGVtZW50LmNoaWxkcmVuO1xuXHRjb25zdCBteUFycmF5OiBBcnJheTx1bmtub3duPiA9IFtdO1xuXHRjb25zdCBteU9iamVjdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblx0Zm9yIChjb25zdCBhdHRyaWJ1dGVOYW1lIG9mIGVsZW1lbnQuZ2V0QXR0cmlidXRlTmFtZXMoKSkge1xuXHRcdG15T2JqZWN0W2F0dHJpYnV0ZU5hbWVdID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSk7XG5cdH1cblx0aWYgKGNoaWxkcmVuLmxlbmd0aCA+IDApIHtcblx0XHRjb25zdCBjaGlsZE5vZGVOYW1lcyA9IE9iamVjdC5rZXlzKGNoaWxkcmVuKS5tYXAoKGtleSkgPT4gY2hpbGRyZW5ba2V5IGFzIHVua25vd24gYXMgbnVtYmVyXS5sb2NhbE5hbWUpO1xuXHRcdGNvbnN0IGNoaWxkSXNBcnJheSA9IGNoaWxkTm9kZU5hbWVzLmxlbmd0aCAhPT0gbmV3IFNldChjaGlsZE5vZGVOYW1lcykuc2l6ZTtcblx0XHRmb3IgKGNvbnN0IGNoaWxkRGVmaW5pdGlvbiBvZiBjaGlsZHJlbiBhcyB1bmtub3duIGFzIEFycmF5PEVsZW1lbnQ+KSB7XG5cdFx0XHRpZiAoY2hpbGRJc0FycmF5KSB7XG5cdFx0XHRcdG15QXJyYXkucHVzaChwcm9jZXNzT2JqZWN0KGNoaWxkRGVmaW5pdGlvbikpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0bXlPYmplY3RbY2hpbGREZWZpbml0aW9uLmxvY2FsTmFtZV0gPSBwcm9jZXNzT2JqZWN0KGNoaWxkRGVmaW5pdGlvbik7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmIChjaGlsZElzQXJyYXkpIHtcblx0XHRcdHJldHVybiBteUFycmF5O1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gbXlPYmplY3Q7XG59XG5cbi8qKlxuICogUHJvY2Vzc2VzIHRoZSBjaGlsZCBub2RlcyBvZiB0aGUgYnVpbGRpbmcgYmxvY2sgYW5kIHBhcnNlcyB0aGVtIGFzIGVpdGhlciBhZ2dyZWdhdGlvbnMgb3Igb2JqZWN0LS9hcnJheS1iYXNlZCB2YWx1ZXMuXG4gKlxuICogQHBhcmFtIG9Ob2RlIFRoZSBYTUwgbm9kZSBmb3Igd2hpY2ggdG8gcHJvY2VzcyB0aGUgY2hpbGRyZW5cbiAqIEBwYXJhbSBvVmlzaXRvciBUaGUgdmlzaXRvciBpbnN0YW5jZVxuICogQHBhcmFtIG9NZXRhZGF0YSBUaGUgbWV0YWRhdGEgZm9yIHRoZSBidWlsZGluZyBibG9ja1xuICogQHBhcmFtIGlzUHVibGljIFdoZXRoZXIgdGhlIGJ1aWxkaW5nIGJsb2NrIGlzIHVzZWQgaW4gYSBwdWJsaWMgY29udGV4dCBvciBub3RcbiAqIEBwYXJhbSBwcm9wZXJ0eVZhbHVlcyBUaGUgdmFsdWVzIG9mIGFscmVhZHkgcGFyc2VkIHByb3BlcnR5XG4gKiBAcmV0dXJucyBUaGUgcHJvY2Vzc2VkIGNoaWxkcmVuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NDaGlsZHJlbihcblx0b05vZGU6IEVsZW1lbnQsXG5cdG9WaXNpdG9yOiBJVmlzaXRvckNhbGxiYWNrLFxuXHRvTWV0YWRhdGE6IFRyYW5zZm9ybWVkQnVpbGRpbmdCbG9ja01ldGFkYXRhLFxuXHRpc1B1YmxpYzogYm9vbGVhbixcblx0cHJvcGVydHlWYWx1ZXM6IFJlY29yZDxzdHJpbmcsIE9iamVjdFZhbHVlPlxuKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBFbGVtZW50Pj4ge1xuXHRjb25zdCBvQWdncmVnYXRpb25zOiBSZWNvcmQ8c3RyaW5nLCBFbGVtZW50PiA9IHt9O1xuXHRpZiAob05vZGUuZmlyc3RFbGVtZW50Q2hpbGQgIT09IG51bGwpIHtcblx0XHRsZXQgb0ZpcnN0RWxlbWVudENoaWxkOiBFbGVtZW50IHwgbnVsbCA9IG9Ob2RlLmZpcnN0RWxlbWVudENoaWxkIGFzIEVsZW1lbnQgfCBudWxsO1xuXG5cdFx0d2hpbGUgKG9GaXJzdEVsZW1lbnRDaGlsZCAhPT0gbnVsbCkge1xuXHRcdFx0aWYgKG9GaXJzdEVsZW1lbnRDaGlsZC5uYW1lc3BhY2VVUkkgPT09IFhNTFRFTVBMQVRJTkdfTlMpIHtcblx0XHRcdFx0Ly8gSW4gY2FzZSB3ZSBlbmNvdW50ZXIgYSB0ZW1wbGF0aW5nIHRhZywgcnVuIHRoZSB2aXNpdG9yIG9uIGl0IGFuZCBjb250aW51ZSB3aXRoIHRoZSByZXN1bHRpbmcgY2hpbGRcblx0XHRcdFx0Y29uc3Qgb1BhcmVudCA9IG9GaXJzdEVsZW1lbnRDaGlsZC5wYXJlbnROb2RlO1xuXHRcdFx0XHRpZiAob1BhcmVudCkge1xuXHRcdFx0XHRcdGNvbnN0IGlDaGlsZEluZGV4ID0gQXJyYXkuZnJvbShvUGFyZW50LmNoaWxkcmVuKS5pbmRleE9mKG9GaXJzdEVsZW1lbnRDaGlsZCk7XG5cdFx0XHRcdFx0YXdhaXQgb1Zpc2l0b3IudmlzaXROb2RlKG9GaXJzdEVsZW1lbnRDaGlsZCk7XG5cdFx0XHRcdFx0b0ZpcnN0RWxlbWVudENoaWxkID0gb1BhcmVudC5jaGlsZHJlbltpQ2hpbGRJbmRleF0gPyBvUGFyZW50LmNoaWxkcmVuW2lDaGlsZEluZGV4XSA6IG51bGw7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gTm90IHN1cmUgaG93IHRoaXMgY291bGQgaGFwcGVuIGJ1dCBJIGFsc28gZG9uJ3Qgd2FudCB0byBjcmVhdGUgaW5maW5pdGUgbG9vcHNcblx0XHRcdFx0XHRvRmlyc3RFbGVtZW50Q2hpbGQgPSBvRmlyc3RFbGVtZW50Q2hpbGQubmV4dEVsZW1lbnRTaWJsaW5nO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCBzQ2hpbGROYW1lID0gb0ZpcnN0RWxlbWVudENoaWxkLmxvY2FsTmFtZTtcblx0XHRcdFx0bGV0IHNBZ2dyZWdhdGlvbk5hbWUgPSBzQ2hpbGROYW1lO1xuXHRcdFx0XHRpZiAoc0FnZ3JlZ2F0aW9uTmFtZVswXS50b1VwcGVyQ2FzZSgpID09PSBzQWdncmVnYXRpb25OYW1lWzBdKSB7XG5cdFx0XHRcdFx0Ly8gbm90IGEgc3ViIGFnZ3JlZ2F0aW9uLCBnbyBiYWNrIHRvIGRlZmF1bHQgQWdncmVnYXRpb25cblx0XHRcdFx0XHRzQWdncmVnYXRpb25OYW1lID0gb01ldGFkYXRhLmRlZmF1bHRBZ2dyZWdhdGlvbiB8fCBcIlwiO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNvbnN0IGFnZ3JlZ2F0aW9uRGVmaW5pdGlvbiA9IG9NZXRhZGF0YS5hZ2dyZWdhdGlvbnNbc0FnZ3JlZ2F0aW9uTmFtZV07XG5cdFx0XHRcdGlmIChhZ2dyZWdhdGlvbkRlZmluaXRpb24gIT09IHVuZGVmaW5lZCAmJiAhYWdncmVnYXRpb25EZWZpbml0aW9uLnNsb3QpIHtcblx0XHRcdFx0XHRjb25zdCBwYXJzZWRBZ2dyZWdhdGlvbiA9IHBhcnNlQWdncmVnYXRpb24ob0ZpcnN0RWxlbWVudENoaWxkLCBhZ2dyZWdhdGlvbkRlZmluaXRpb24ucHJvY2Vzc0FnZ3JlZ2F0aW9ucyk7XG5cdFx0XHRcdFx0cHJvcGVydHlWYWx1ZXNbc0FnZ3JlZ2F0aW9uTmFtZV0gPSBwYXJzZWRBZ2dyZWdhdGlvbjtcblx0XHRcdFx0XHRmb3IgKGNvbnN0IHBhcnNlZEFnZ3JlZ2F0aW9uS2V5IGluIHBhcnNlZEFnZ3JlZ2F0aW9uKSB7XG5cdFx0XHRcdFx0XHRvTWV0YWRhdGEuYWdncmVnYXRpb25zW3BhcnNlZEFnZ3JlZ2F0aW9uS2V5XSA9IHBhcnNlZEFnZ3JlZ2F0aW9uW3BhcnNlZEFnZ3JlZ2F0aW9uS2V5XTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0b0ZpcnN0RWxlbWVudENoaWxkID0gb0ZpcnN0RWxlbWVudENoaWxkLm5leHRFbGVtZW50U2libGluZztcblx0XHRcdH1cblx0XHR9XG5cblx0XHRvRmlyc3RFbGVtZW50Q2hpbGQgPSBvTm9kZS5maXJzdEVsZW1lbnRDaGlsZDtcblx0XHR3aGlsZSAob0ZpcnN0RWxlbWVudENoaWxkICE9PSBudWxsKSB7XG5cdFx0XHRjb25zdCBvTmV4dENoaWxkOiBFbGVtZW50IHwgbnVsbCA9IG9GaXJzdEVsZW1lbnRDaGlsZC5uZXh0RWxlbWVudFNpYmxpbmc7XG5cdFx0XHRjb25zdCBzQ2hpbGROYW1lID0gb0ZpcnN0RWxlbWVudENoaWxkLmxvY2FsTmFtZTtcblx0XHRcdGxldCBzQWdncmVnYXRpb25OYW1lID0gc0NoaWxkTmFtZTtcblx0XHRcdGlmIChzQWdncmVnYXRpb25OYW1lWzBdLnRvVXBwZXJDYXNlKCkgPT09IHNBZ2dyZWdhdGlvbk5hbWVbMF0pIHtcblx0XHRcdFx0Ly8gbm90IGEgc3ViIGFnZ3JlZ2F0aW9uLCBnbyBiYWNrIHRvIGRlZmF1bHQgQWdncmVnYXRpb25cblx0XHRcdFx0c0FnZ3JlZ2F0aW9uTmFtZSA9IG9NZXRhZGF0YS5kZWZhdWx0QWdncmVnYXRpb24gfHwgXCJcIjtcblx0XHRcdH1cblx0XHRcdGlmIChcblx0XHRcdFx0T2JqZWN0LmtleXMob01ldGFkYXRhLmFnZ3JlZ2F0aW9ucykuaW5jbHVkZXMoc0FnZ3JlZ2F0aW9uTmFtZSkgJiZcblx0XHRcdFx0KCFpc1B1YmxpYyB8fCBvTWV0YWRhdGEuYWdncmVnYXRpb25zW3NBZ2dyZWdhdGlvbk5hbWVdLmlzUHVibGljID09PSB0cnVlKVxuXHRcdFx0KSB7XG5cdFx0XHRcdGNvbnN0IGFnZ3JlZ2F0aW9uRGVmaW5pdGlvbiA9IG9NZXRhZGF0YS5hZ2dyZWdhdGlvbnNbc0FnZ3JlZ2F0aW9uTmFtZV07XG5cdFx0XHRcdGlmICghYWdncmVnYXRpb25EZWZpbml0aW9uLnNsb3QgJiYgb0ZpcnN0RWxlbWVudENoaWxkICE9PSBudWxsICYmIG9GaXJzdEVsZW1lbnRDaGlsZC5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0YXdhaXQgb1Zpc2l0b3IudmlzaXROb2RlKG9GaXJzdEVsZW1lbnRDaGlsZCk7XG5cdFx0XHRcdFx0bGV0IGNoaWxkRGVmaW5pdGlvbiA9IG9GaXJzdEVsZW1lbnRDaGlsZC5maXJzdEVsZW1lbnRDaGlsZDtcblx0XHRcdFx0XHR3aGlsZSAoY2hpbGREZWZpbml0aW9uKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBuZXh0Q2hpbGQgPSBjaGlsZERlZmluaXRpb24ubmV4dEVsZW1lbnRTaWJsaW5nO1xuXHRcdFx0XHRcdFx0aWYgKCFhZ2dyZWdhdGlvbkRlZmluaXRpb24uaGFzVmlydHVhbE5vZGUpIHtcblx0XHRcdFx0XHRcdFx0Y29uc3QgY2hpbGRXcmFwcGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKG9Ob2RlLm5hbWVzcGFjZVVSSSwgY2hpbGREZWZpbml0aW9uLmdldEF0dHJpYnV0ZShcImtleVwiKSEpO1xuXHRcdFx0XHRcdFx0XHRjaGlsZFdyYXBwZXIuYXBwZW5kQ2hpbGQoY2hpbGREZWZpbml0aW9uKTtcblx0XHRcdFx0XHRcdFx0b0FnZ3JlZ2F0aW9uc1tjaGlsZERlZmluaXRpb24uZ2V0QXR0cmlidXRlKFwia2V5XCIpIV0gPSBjaGlsZFdyYXBwZXI7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRvQWdncmVnYXRpb25zW2NoaWxkRGVmaW5pdGlvbi5nZXRBdHRyaWJ1dGUoXCJrZXlcIikhXSA9IGNoaWxkRGVmaW5pdGlvbjtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Y2hpbGREZWZpbml0aW9uLnJlbW92ZUF0dHJpYnV0ZShcImtleVwiKTtcblx0XHRcdFx0XHRcdGNoaWxkRGVmaW5pdGlvbiA9IG5leHRDaGlsZDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSBpZiAoYWdncmVnYXRpb25EZWZpbml0aW9uLnNsb3QpIHtcblx0XHRcdFx0XHRhd2FpdCBvVmlzaXRvci52aXNpdE5vZGUob0ZpcnN0RWxlbWVudENoaWxkKTtcblx0XHRcdFx0XHRpZiAoc0FnZ3JlZ2F0aW9uTmFtZSAhPT0gc0NoaWxkTmFtZSkge1xuXHRcdFx0XHRcdFx0aWYgKCFvQWdncmVnYXRpb25zW3NBZ2dyZWdhdGlvbk5hbWVdKSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IG9OZXdDaGlsZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhvTm9kZS5uYW1lc3BhY2VVUkksIHNBZ2dyZWdhdGlvbk5hbWUpO1xuXHRcdFx0XHRcdFx0XHRvQWdncmVnYXRpb25zW3NBZ2dyZWdhdGlvbk5hbWVdID0gb05ld0NoaWxkO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0b0FnZ3JlZ2F0aW9uc1tzQWdncmVnYXRpb25OYW1lXS5hcHBlbmRDaGlsZChvRmlyc3RFbGVtZW50Q2hpbGQuY2xvbmVOb2RlKHRydWUpIGFzIEVsZW1lbnQpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRvQWdncmVnYXRpb25zW3NBZ2dyZWdhdGlvbk5hbWVdID0gb0ZpcnN0RWxlbWVudENoaWxkLmNsb25lTm9kZSh0cnVlKSBhcyBFbGVtZW50O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmIChPYmplY3Qua2V5cyhvTWV0YWRhdGEucHJvcGVydGllcykuaW5jbHVkZXMoc0FnZ3JlZ2F0aW9uTmFtZSkpIHtcblx0XHRcdFx0YXdhaXQgb1Zpc2l0b3IudmlzaXROb2RlKG9GaXJzdEVsZW1lbnRDaGlsZCk7XG5cdFx0XHRcdGlmIChvTWV0YWRhdGEucHJvcGVydGllc1tzQWdncmVnYXRpb25OYW1lXS50eXBlID09PSBcIm9iamVjdFwiKSB7XG5cdFx0XHRcdFx0Y29uc3QgYWdncmVnYXRpb25Qcm9wZXJ0eVZhbHVlcyA9IHByb2Nlc3NPYmplY3Qob0ZpcnN0RWxlbWVudENoaWxkKTtcblx0XHRcdFx0XHRwcm9wZXJ0eVZhbHVlc1tzQWdncmVnYXRpb25OYW1lXSA9IGFnZ3JlZ2F0aW9uUHJvcGVydHlWYWx1ZXM7XG5cdFx0XHRcdH0gZWxzZSBpZiAob01ldGFkYXRhLnByb3BlcnRpZXNbc0FnZ3JlZ2F0aW9uTmFtZV0udHlwZSA9PT0gXCJhcnJheVwiKSB7XG5cdFx0XHRcdFx0aWYgKG9GaXJzdEVsZW1lbnRDaGlsZCAhPT0gbnVsbCAmJiBvRmlyc3RFbGVtZW50Q2hpbGQuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdFx0Y29uc3QgY2hpbGRyZW4gPSBvRmlyc3RFbGVtZW50Q2hpbGQuY2hpbGRyZW47XG5cdFx0XHRcdFx0XHRjb25zdCBvT3V0T2JqZWN0czogUmVjb3JkPHN0cmluZywgT2JqZWN0VmFsdWUyPltdID0gW107XG5cdFx0XHRcdFx0XHRmb3IgKGxldCBjaGlsZElkeCA9IDA7IGNoaWxkSWR4IDwgY2hpbGRyZW4ubGVuZ3RoOyBjaGlsZElkeCsrKSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IGNoaWxkRGVmaW5pdGlvbiA9IGNoaWxkcmVuW2NoaWxkSWR4XTtcblx0XHRcdFx0XHRcdFx0Ly8gbm9uIGtleWVkIGNoaWxkLCBqdXN0IGFkZCBpdCB0byB0aGUgYWdncmVnYXRpb25cblx0XHRcdFx0XHRcdFx0Y29uc3QgbXlDaGlsZDogUmVjb3JkPHN0cmluZywgT2JqZWN0VmFsdWUyPiA9IHt9O1xuXHRcdFx0XHRcdFx0XHRjb25zdCBhdHRyaWJ1dGVOYW1lcyA9IGNoaWxkRGVmaW5pdGlvbi5nZXRBdHRyaWJ1dGVOYW1lcygpO1xuXHRcdFx0XHRcdFx0XHRmb3IgKGNvbnN0IGF0dHJpYnV0ZU5hbWUgb2YgYXR0cmlidXRlTmFtZXMpIHtcblx0XHRcdFx0XHRcdFx0XHRteUNoaWxkW2F0dHJpYnV0ZU5hbWVdID0gY2hpbGREZWZpbml0aW9uLmdldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRvT3V0T2JqZWN0cy5wdXNoKG15Q2hpbGQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0cHJvcGVydHlWYWx1ZXNbc0FnZ3JlZ2F0aW9uTmFtZV0gPSBvT3V0T2JqZWN0cztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0b0ZpcnN0RWxlbWVudENoaWxkID0gb05leHRDaGlsZDtcblx0XHR9XG5cdH1cblx0cmV0dXJuIG9BZ2dyZWdhdGlvbnM7XG59XG5cbmZ1bmN0aW9uIHByb2Nlc3NTbG90cyhcblx0b0FnZ3JlZ2F0aW9uczogUmVjb3JkPHN0cmluZywgRWxlbWVudD4sXG5cdG9NZXRhZGF0YUFnZ3JlZ2F0aW9uczogUmVjb3JkPHN0cmluZywgQnVpbGRpbmdCbG9ja0FnZ3JlZ2F0aW9uRGVmaW5pdGlvbj4sXG5cdG9Ob2RlOiBFbGVtZW50LFxuXHRwcm9jZXNzQ3VzdG9tRGF0YSA9IGZhbHNlXG4pOiB2b2lkIHtcblx0aWYgKE9iamVjdC5rZXlzKG9BZ2dyZWdhdGlvbnMpLmxlbmd0aCA+IDApIHtcblx0XHRPYmplY3Qua2V5cyhvQWdncmVnYXRpb25zKS5mb3JFYWNoKGZ1bmN0aW9uIChzQWdncmVnYXRpb25OYW1lOiBzdHJpbmcpIHtcblx0XHRcdGNvbnN0IG9BZ2dyZWdhdGlvbkVsZW1lbnQgPSBvQWdncmVnYXRpb25zW3NBZ2dyZWdhdGlvbk5hbWVdO1xuXHRcdFx0aWYgKG9Ob2RlICE9PSBudWxsICYmIG9Ob2RlICE9PSB1bmRlZmluZWQgJiYgb0FnZ3JlZ2F0aW9uRWxlbWVudCkge1xuXHRcdFx0XHQvLyBzbG90cyBjYW4gaGF2ZSA6OiBhcyBrZXlzIHdoaWNoIGlzIG5vdCBhIHZhbGlkIGFnZ3JlZ2F0aW9uIG5hbWUgdGhlcmVmb3JlIHJlcGxhY2luZyB0aGVtXG5cdFx0XHRcdGNvbnN0IG9FbGVtZW50Q2hpbGQgPSBvQWdncmVnYXRpb25FbGVtZW50LmZpcnN0RWxlbWVudENoaWxkO1xuXHRcdFx0XHRpZiAoIVtcImRlcGVuZGVudHNcIiwgXCJjdXN0b21EYXRhXCIsIFwibGF5b3V0RGF0YVwiXS5pbmNsdWRlcyhzQWdncmVnYXRpb25OYW1lKSkge1xuXHRcdFx0XHRcdGNvbnN0IHNTbG90TmFtZSA9XG5cdFx0XHRcdFx0XHQob01ldGFkYXRhQWdncmVnYXRpb25zW3NBZ2dyZWdhdGlvbk5hbWVdICE9PSB1bmRlZmluZWQgJiYgb01ldGFkYXRhQWdncmVnYXRpb25zW3NBZ2dyZWdhdGlvbk5hbWVdLnNsb3QpIHx8XG5cdFx0XHRcdFx0XHRzQWdncmVnYXRpb25OYW1lO1xuXHRcdFx0XHRcdGNvbnN0IG9UYXJnZXRFbGVtZW50ID0gb05vZGUucXVlcnlTZWxlY3Rvcihgc2xvdFtuYW1lPScke3NTbG90TmFtZX0nXWApO1xuXHRcdFx0XHRcdGlmIChvVGFyZ2V0RWxlbWVudCAhPT0gbnVsbCkge1xuXHRcdFx0XHRcdFx0Y29uc3Qgb05ld0NoaWxkID0gcHJlcGFyZUFnZ3JlZ2F0aW9uRWxlbWVudChvTm9kZSwgc0FnZ3JlZ2F0aW9uTmFtZSwgb0VsZW1lbnRDaGlsZCk7XG5cdFx0XHRcdFx0XHRvVGFyZ2V0RWxlbWVudC5yZXBsYWNlV2l0aCguLi4ob05ld0NoaWxkLmNoaWxkcmVuIGFzIHVua25vd24gYXMgTm9kZVtdKSk7IC8vIFNvbWVob3cgVFMgZG9lc24ndCBsaWtlIHRoaXMgYnV0IHRoZSBkb2N1bWVudGF0aW9uIHNheXMgaXMgc2hvdWxkIHdvcmtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSBpZiAocHJvY2Vzc0N1c3RvbURhdGEgJiYgb0VsZW1lbnRDaGlsZCAhPT0gbnVsbCkge1xuXHRcdFx0XHRcdGNvbnN0IHNTbG90TmFtZSA9XG5cdFx0XHRcdFx0XHQob01ldGFkYXRhQWdncmVnYXRpb25zW3NBZ2dyZWdhdGlvbk5hbWVdICE9PSB1bmRlZmluZWQgJiYgb01ldGFkYXRhQWdncmVnYXRpb25zW3NBZ2dyZWdhdGlvbk5hbWVdLnNsb3QpIHx8XG5cdFx0XHRcdFx0XHRzQWdncmVnYXRpb25OYW1lO1xuXHRcdFx0XHRcdGNvbnN0IG9UYXJnZXRFbGVtZW50ID0gb05vZGUucXVlcnlTZWxlY3Rvcihgc2xvdFtuYW1lPScke3NTbG90TmFtZX0nXWApO1xuXHRcdFx0XHRcdGNvbnN0IG9OZXdDaGlsZCA9IHByZXBhcmVBZ2dyZWdhdGlvbkVsZW1lbnQob05vZGUsIHNBZ2dyZWdhdGlvbk5hbWUsIG9FbGVtZW50Q2hpbGQpO1xuXHRcdFx0XHRcdGlmIChvVGFyZ2V0RWxlbWVudCAhPT0gbnVsbCkge1xuXHRcdFx0XHRcdFx0b1RhcmdldEVsZW1lbnQucmVwbGFjZVdpdGgoLi4uKG9OZXdDaGlsZC5jaGlsZHJlbiBhcyB1bmtub3duIGFzIE5vZGVbXSkpOyAvLyBTb21laG93IFRTIGRvZXNuJ3QgbGlrZSB0aGlzIGJ1dCB0aGUgZG9jdW1lbnRhdGlvbiBzYXlzIGlzIHNob3VsZCB3b3JrXG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdG9Ob2RlLmFwcGVuZENoaWxkKG9OZXdDaGlsZCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cbn1cblxuZnVuY3Rpb24gcHJlcGFyZUFnZ3JlZ2F0aW9uRWxlbWVudChvTm9kZTogRWxlbWVudCwgc0FnZ3JlZ2F0aW9uTmFtZTogc3RyaW5nLCBvRWxlbWVudENoaWxkOiBFbGVtZW50IHwgbnVsbCk6IEVsZW1lbnQge1xuXHRjb25zdCBvTmV3Q2hpbGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMob05vZGUubmFtZXNwYWNlVVJJLCBzQWdncmVnYXRpb25OYW1lLnJlcGxhY2UoLzovZ2ksIFwiX1wiKSk7XG5cdHdoaWxlIChvRWxlbWVudENoaWxkKSB7XG5cdFx0Y29uc3Qgb05leHRDaGlsZCA9IG9FbGVtZW50Q2hpbGQubmV4dEVsZW1lbnRTaWJsaW5nO1xuXHRcdG9OZXdDaGlsZC5hcHBlbmRDaGlsZChvRWxlbWVudENoaWxkKTtcblx0XHRvRWxlbWVudENoaWxkID0gb05leHRDaGlsZDtcblx0fVxuXHRyZXR1cm4gb05ld0NoaWxkO1xufVxuXG5hc3luYyBmdW5jdGlvbiBwcm9jZXNzQnVpbGRpbmdCbG9jayhcblx0QnVpbGRpbmdCbG9ja0NsYXNzOiB0eXBlb2YgQnVpbGRpbmdCbG9ja1RlbXBsYXRpbmdCYXNlLFxuXHRvTm9kZTogRWxlbWVudCxcblx0b1Zpc2l0b3I6IElWaXNpdG9yQ2FsbGJhY2ssXG5cdGlzUHVibGljID0gZmFsc2Vcbik6IFByb21pc2U8dm9pZD4ge1xuXHRjb25zdCBvTWV0YWRhdGEgPSB0cmFuc2Zvcm1NZXRhZGF0YShCdWlsZGluZ0Jsb2NrQ2xhc3MubWV0YWRhdGEpO1xuXG5cdGNvbnN0IHNGcmFnbWVudE5hbWUgPSBvTWV0YWRhdGEuZnJhZ21lbnQgPz8gYCR7b01ldGFkYXRhLm5hbWVzcGFjZSA/PyBvTWV0YWRhdGEucHVibGljTmFtZXNwYWNlfS4ke29NZXRhZGF0YS54bWxUYWcgPz8gb01ldGFkYXRhLm5hbWV9YDtcblxuXHRjb25zdCBtQ29udGV4dHM6IFJlY29yZDxzdHJpbmcsIENvbnRleHQ+ID0ge307XG5cdGNvbnN0IG9TZXR0aW5ncyA9IG9WaXNpdG9yLmdldFNldHRpbmdzKCk7XG5cblx0Ly8gQWRkIGFuIGVtcHR5IGNvbnZlcnRlciBjb250ZXh0IGlmIHRoZXJlIGlzIG5vbmUgaW4gb3JkZXIgdG8gaGF2ZSBhIHBsYWNlIHRvIHN0b3JlIG9iamVjdCB2YWx1ZXNcblx0b1NldHRpbmdzLm1vZGVscy5jb252ZXJ0ZXJDb250ZXh0ID8/PSBuZXcgSlNPTk1vZGVsKCk7XG5cblx0Ly9JbmplY3Qgc3RvcmFnZSBmb3IgbWFjcm9zXG5cdGlmICghb1NldHRpbmdzW3NGcmFnbWVudE5hbWVdKSB7XG5cdFx0b1NldHRpbmdzW3NGcmFnbWVudE5hbWVdID0ge307XG5cdH1cblxuXHQvLyBGaXJzdCBvZiBhbGwgd2UgbmVlZCB0byB2aXNpdCB0aGUgYXR0cmlidXRlcyB0byByZXNvbHZlIHRoZSBwcm9wZXJ0aWVzIGFuZCB0aGUgbWV0YWRhdGEgY29udGV4dHNcblx0Y29uc3QgcHJvcGVydHlWYWx1ZXMgPSBhd2FpdCBwcm9jZXNzUHJvcGVydGllcyhvTWV0YWRhdGEsIG9Ob2RlLCBpc1B1YmxpYywgb1Zpc2l0b3IpO1xuXHRjb25zdCBpbml0aWFsS2V5cyA9IE9iamVjdC5rZXlzKHByb3BlcnR5VmFsdWVzKTtcblx0Y29uc3QgbU1pc3NpbmdDb250ZXh0ID0gcHJvY2Vzc0NvbnRleHRzKG9NZXRhZGF0YSwgb1NldHRpbmdzLCBvTm9kZSwgaXNQdWJsaWMsIG9WaXNpdG9yLCBtQ29udGV4dHMsIHByb3BlcnR5VmFsdWVzKTtcblxuXHR0cnkge1xuXHRcdC8vIEFnZ3JlZ2F0aW9uIGFuZCBjb21wbGV4IHR5cGUgc3VwcG9ydFxuXHRcdGNvbnN0IG9BZ2dyZWdhdGlvbnMgPSBhd2FpdCBwcm9jZXNzQ2hpbGRyZW4ob05vZGUsIG9WaXNpdG9yLCBvTWV0YWRhdGEsIGlzUHVibGljLCBwcm9wZXJ0eVZhbHVlcyk7XG5cdFx0bGV0IG9Db250cm9sQ29uZmlnID0ge307XG5cblx0XHRpZiAob1NldHRpbmdzLm1vZGVscy52aWV3RGF0YSkge1xuXHRcdFx0Ly8gT25seSB1c2VkIGluIHRoZSBGaWVsZCBtYWNybyBhbmQgZXZlbiB0aGVuIG1heWJlIG5vdCByZWFsbHkgdXNlZnVsXG5cdFx0XHRvQ29udHJvbENvbmZpZyA9IG9TZXR0aW5ncy5tb2RlbHMudmlld0RhdGEuZ2V0UHJvcGVydHkoXCIvY29udHJvbENvbmZpZ3VyYXRpb25cIik7XG5cdFx0fVxuXHRcdGxldCBwcm9jZXNzZWRQcm9wZXJ0eVZhbHVlcyA9IHByb3BlcnR5VmFsdWVzO1xuXG5cdFx0T2JqZWN0LmtleXMocHJvcGVydHlWYWx1ZXMpLmZvckVhY2goKHByb3BOYW1lKSA9PiB7XG5cdFx0XHRsZXQgb0RhdGEgPSBwcm9wZXJ0eVZhbHVlc1twcm9wTmFtZV0gYXMgdW5rbm93biBhcyBDb250ZXh0O1xuXHRcdFx0Ly9jaGVjayBmb3IgYWRkaXRpb25hbCBwcm9jZXNzaW5nIGZ1bmN0aW9uIHRvIHZhbGlkYXRlIC8gb3ZlcndyaXRlIHBhcmFtZXRlcnNcblx0XHRcdGNvbnN0IG9yaWdpbmFsRGVmaW5pdGlvbiA9IEJ1aWxkaW5nQmxvY2tDbGFzcz8ubWV0YWRhdGE/LnByb3BlcnRpZXNbcHJvcE5hbWVdO1xuXHRcdFx0aWYgKG9yaWdpbmFsRGVmaW5pdGlvbj8udmFsaWRhdGUpIHtcblx0XHRcdFx0b0RhdGEgPSBvcmlnaW5hbERlZmluaXRpb24udmFsaWRhdGUob0RhdGEpIHx8IG9EYXRhO1xuXHRcdFx0fVxuXHRcdFx0aWYgKG9EYXRhPy5pc0E/LihTQVBfVUlfTU9ERUxfQ09OVEVYVCkgJiYgIW9EYXRhLmdldE1vZGVsKCkuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTWV0YU1vZGVsXCIpKSB7XG5cdFx0XHRcdHByb3BlcnR5VmFsdWVzW3Byb3BOYW1lXSA9IG9EYXRhLmdldE9iamVjdCgpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdHByb3BlcnR5VmFsdWVzLmlzUHVibGljID0gaXNQdWJsaWM7XG5cblx0XHRjb25zdCBvSW5zdGFuY2UgPSBuZXcgQnVpbGRpbmdCbG9ja0NsYXNzKHsgLi4ucHJvcGVydHlWYWx1ZXMsIC4uLm9BZ2dyZWdhdGlvbnMgfSwgb0NvbnRyb2xDb25maWcsIG9TZXR0aW5ncyk7XG5cdFx0cHJvY2Vzc2VkUHJvcGVydHlWYWx1ZXMgPSBvSW5zdGFuY2UuZ2V0UHJvcGVydGllcygpO1xuXHRcdE9iamVjdC5rZXlzKG9NZXRhZGF0YS5tZXRhZGF0YUNvbnRleHRzKS5mb3JFYWNoKGZ1bmN0aW9uIChzQ29udGV4dE5hbWU6IHN0cmluZykge1xuXHRcdFx0aWYgKHByb2Nlc3NlZFByb3BlcnR5VmFsdWVzLmhhc093blByb3BlcnR5KHNDb250ZXh0TmFtZSkpIHtcblx0XHRcdFx0Y29uc3QgdGFyZ2V0T2JqZWN0ID0gcHJvY2Vzc2VkUHJvcGVydHlWYWx1ZXNbc0NvbnRleHROYW1lXTtcblx0XHRcdFx0aWYgKGlzQ29udGV4dCh0YXJnZXRPYmplY3QpKSB7XG5cdFx0XHRcdFx0bUNvbnRleHRzW3NDb250ZXh0TmFtZV0gPSB0YXJnZXRPYmplY3QgYXMgQ29udGV4dDtcblx0XHRcdFx0fSBlbHNlIGlmICh0eXBlb2YgdGFyZ2V0T2JqZWN0ID09PSBcIm9iamVjdFwiKSB7XG5cdFx0XHRcdFx0Y29uc3QgYXR0cmlidXRlVmFsdWUgPSBzdG9yZU9iamVjdFZhbHVlKHRhcmdldE9iamVjdCk7XG5cdFx0XHRcdFx0b1NldHRpbmdzLm1vZGVscy5jb252ZXJ0ZXJDb250ZXh0LnNldFByb3BlcnR5KGF0dHJpYnV0ZVZhbHVlLCB0YXJnZXRPYmplY3QpO1xuXHRcdFx0XHRcdGNvbnN0IG5ld0NvbnRleHQgPSBvU2V0dGluZ3MubW9kZWxzLmNvbnZlcnRlckNvbnRleHQuY3JlYXRlQmluZGluZ0NvbnRleHQoYXR0cmlidXRlVmFsdWUpITtcblx0XHRcdFx0XHR1bnN0b3JlT2JqZWN0VmFsdWUoYXR0cmlidXRlVmFsdWUpO1xuXHRcdFx0XHRcdG1Db250ZXh0c1tzQ29udGV4dE5hbWVdID0gbmV3Q29udGV4dDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0Y29uc3Qgb0F0dHJpYnV0ZXNNb2RlbDogSlNPTk1vZGVsID0gbmV3IEF0dHJpYnV0ZU1vZGVsKG9Ob2RlLCBwcm9jZXNzZWRQcm9wZXJ0eVZhbHVlcywgQnVpbGRpbmdCbG9ja0NsYXNzKTtcblx0XHRtQ29udGV4dHNbXCJ0aGlzXCJdID0gb0F0dHJpYnV0ZXNNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChcIi9cIik7XG5cdFx0bGV0IG9QcmV2aW91c01hY3JvSW5mbzogTWFjcm9JbmZvIHwgdW5kZWZpbmVkO1xuXHRcdC8vIGNvcmU6cmVxdWlyZSBuZWVkIHRvIGJlIGRlZmluZWQgb24gdGhlIG5vZGUgaXRzZWxmIHRvIGJlIHBpY2tlZCB1cCBkdWUgdG8gdGhlIHRlbXBsYXRpbmcgc3RlcFxuXHRcdGNvbnN0IGNvcmVSZXF1aXJlID0gb05vZGU/LmdldEF0dHJpYnV0ZShcImNvcmU6cmVxdWlyZVwiKSB8fCB1bmRlZmluZWQ7XG5cblx0XHQvLyBLZWVwIHRyYWNrXG5cdFx0aWYgKFRyYWNlSW5mby5pc1RyYWNlSW5mb0FjdGl2ZSgpKSB7XG5cdFx0XHRjb25zdCBvVHJhY2VJbmZvID0gVHJhY2VJbmZvLnRyYWNlTWFjcm9DYWxscyhzRnJhZ21lbnROYW1lLCBvTWV0YWRhdGEsIG1Db250ZXh0cywgb05vZGUsIG9WaXNpdG9yKTtcblx0XHRcdGlmIChvVHJhY2VJbmZvPy5tYWNyb0luZm8pIHtcblx0XHRcdFx0b1ByZXZpb3VzTWFjcm9JbmZvID0gb1NldHRpbmdzW1wiX21hY3JvSW5mb1wiXTtcblx0XHRcdFx0b1NldHRpbmdzW1wiX21hY3JvSW5mb1wiXSA9IG9UcmFjZUluZm8ubWFjcm9JbmZvO1xuXHRcdFx0fVxuXHRcdH1cblx0XHR2YWxpZGF0ZU1hY3JvU2lnbmF0dXJlKHNGcmFnbWVudE5hbWUsIG9NZXRhZGF0YSwgbUNvbnRleHRzLCBvTm9kZSk7XG5cblx0XHRjb25zdCBvQ29udGV4dFZpc2l0b3IgPSBvVmlzaXRvci53aXRoKG1Db250ZXh0cywgb01ldGFkYXRhLmlzT3BlbiAhPT0gdW5kZWZpbmVkID8gIW9NZXRhZGF0YS5pc09wZW4gOiB0cnVlKTtcblx0XHRjb25zdCBvUGFyZW50ID0gb05vZGUucGFyZW50Tm9kZTtcblxuXHRcdGxldCBpQ2hpbGRJbmRleDogbnVtYmVyO1xuXHRcdGxldCBvUHJvbWlzZTtcblx0XHRpZiAob1BhcmVudCkge1xuXHRcdFx0aUNoaWxkSW5kZXggPSBBcnJheS5mcm9tKG9QYXJlbnQuY2hpbGRyZW4pLmluZGV4T2Yob05vZGUpO1xuXG5cdFx0XHRpZiAob01ldGFkYXRhLmZyYWdtZW50KSB7XG5cdFx0XHRcdG9Qcm9taXNlID0gb0NvbnRleHRWaXNpdG9yLmluc2VydEZyYWdtZW50KHNGcmFnbWVudE5hbWUsIG9Ob2RlKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IG9sZEtleXMgPSBPYmplY3Qua2V5cyh0ZW1wb3JhcnlPYmplY3RTdG9yZSk7XG5cdFx0XHRcdGxldCB0ZW1wbGF0ZVN0cmluZztcblx0XHRcdFx0aWYgKChvSW5zdGFuY2UgYXMgUnVudGltZUJ1aWxkaW5nQmxvY2spLmdldFJ1bnRpbWVCdWlsZGluZ0Jsb2NrVGVtcGxhdGUpIHtcblx0XHRcdFx0XHR0ZW1wbGF0ZVN0cmluZyA9IGF3YWl0IGpzeC5yZW5kZXJBc1hNTChhc3luYyAoKSA9PlxuXHRcdFx0XHRcdFx0KG9JbnN0YW5jZSBhcyBSdW50aW1lQnVpbGRpbmdCbG9jaykuZ2V0UnVudGltZUJ1aWxkaW5nQmxvY2tUZW1wbGF0ZShvTm9kZSlcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHRlbXBsYXRlU3RyaW5nID0gYXdhaXQganN4LnJlbmRlckFzWE1MKGFzeW5jICgpID0+IG9JbnN0YW5jZS5nZXRUZW1wbGF0ZSEob05vZGUpKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChCdWlsZGluZ0Jsb2NrQ2xhc3MuaXNSdW50aW1lKSB7XG5cdFx0XHRcdFx0Ly8gRm9yIHJ1bnRpbWUgYnVpbGRpbmcgYmxvY2tzLCB3ZSBuZWVkIHRvIGF0dGFjaCBhbGwgb2JqZWN0cyB0byB0aGUgY29udmVydGVyQ29udGV4dCBkaXJlY3RseSwgYXMgdGhlIGFjdHVhbCByZW5kZXJpbmcgdGFrZXMgcGxhY2UgYXQgcnVudGltZVxuXHRcdFx0XHRcdGZvciAoY29uc3Qgc3RvcmVLZXkgaW4gdGVtcG9yYXJ5T2JqZWN0U3RvcmUpIHtcblx0XHRcdFx0XHRcdGlmICghb2xkS2V5cy5pbmNsdWRlcyhzdG9yZUtleSkpIHtcblx0XHRcdFx0XHRcdFx0Y29uc3QgZGF0YSA9IHVuc3RvcmVPYmplY3RWYWx1ZShzdG9yZUtleSk7XG5cdFx0XHRcdFx0XHRcdG9TZXR0aW5ncy5tb2RlbHMuY29udmVydGVyQ29udGV4dC5zZXRQcm9wZXJ0eShzdG9yZUtleSwgZGF0YSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0bGV0IGhhc0Vycm9yID0gXCJcIjtcblx0XHRcdFx0aWYgKHRlbXBsYXRlU3RyaW5nKSB7XG5cdFx0XHRcdFx0bGV0IGhhc1BhcnNlRXJyb3IgPSBmYWxzZTtcblx0XHRcdFx0XHRsZXQgcGFyc2VkVGVtcGxhdGUgPSBwYXJzZVhNTFN0cmluZyh0ZW1wbGF0ZVN0cmluZywgdHJ1ZSk7XG5cdFx0XHRcdFx0Ly8gRm9yIHNhZmV0eSBwdXJwb3NlIHdlIHRyeSB0byBkZXRlY3QgdHJhaWxpbmcgdGV4dCBpbiBiZXR3ZWVuIFhNTCBUYWdzXG5cdFx0XHRcdFx0Zm9yIChjb25zdCBlbGVtZW50IG9mIHBhcnNlZFRlbXBsYXRlKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBpdGVyID0gZG9jdW1lbnQuY3JlYXRlTm9kZUl0ZXJhdG9yKGVsZW1lbnQsIE5vZGVGaWx0ZXIuU0hPV19URVhUKTtcblx0XHRcdFx0XHRcdGxldCB0ZXh0bm9kZSA9IGl0ZXIubmV4dE5vZGUoKTtcblx0XHRcdFx0XHRcdGlmIChlbGVtZW50LmxvY2FsTmFtZSA9PT0gXCJwYXJzZXJlcnJvclwiKSB7XG5cdFx0XHRcdFx0XHRcdGhhc1BhcnNlRXJyb3IgPSB0cnVlO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0d2hpbGUgKHRleHRub2RlKSB7XG5cdFx0XHRcdFx0XHRcdGlmICh0ZXh0bm9kZS50ZXh0Q29udGVudCAmJiB0ZXh0bm9kZS50ZXh0Q29udGVudC50cmltKCkubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdFx0XHRcdGhhc0Vycm9yID0gdGV4dG5vZGUudGV4dENvbnRlbnQ7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0dGV4dG5vZGUgPSBpdGVyLm5leHROb2RlKCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKGhhc1BhcnNlRXJyb3IpIHtcblx0XHRcdFx0XHRcdC8vIElmIHRoZXJlIGlzIGEgcGFyc2VlcnJvciB3aGlsZSBwcm9jZXNzaW5nIHRoZSBYTUwgaXQgbWVhbnMgdGhlIFhNTCBpdHNlbGYgaXMgbWFsZm9ybWVkLCBhcyBzdWNoIHdlIHJlcnVuIHRoZSB0ZW1wbGF0ZSBwcm9jZXNzXG5cdFx0XHRcdFx0XHQvLyBTZXR0aW5nIGlzVHJhY2VNb2RlIHRydWUgd2lsbCBtYWtlIGl0IHNvIHRoYXQgZWFjaCB4bWxgIGV4cHJlc3Npb24gaXMgY2hlY2tlZCBmb3IgdmFsaWRpdHkgZnJvbSBYTUwgcGVyc3BlY3RpdmVcblx0XHRcdFx0XHRcdC8vIElmIGFuIGVycm9yIGlzIGZvdW5kIGl0J3MgcmV0dXJuZWQgaW5zdGVhZCBvZiB0aGUgbm9ybWFsIGZyYWdtZW50XG5cdFx0XHRcdFx0XHRMb2cuZXJyb3IoYEVycm9yIHdoaWxlIHByb2Nlc3NpbmcgYnVpbGRpbmcgYmxvY2sgJHtvTWV0YWRhdGEueG1sVGFnIHx8IG9NZXRhZGF0YS5uYW1lfWAsIGhhc0Vycm9yKTtcblx0XHRcdFx0XHRcdHBhcnNlZFRlbXBsYXRlID0gKGF3YWl0IHByb2Nlc3NYbWxJblRyYWNlKGFzeW5jICgpID0+IHtcblx0XHRcdFx0XHRcdFx0bGV0IGluaXRpYWxUZW1wbGF0ZTtcblx0XHRcdFx0XHRcdFx0aWYgKChvSW5zdGFuY2UgYXMgUnVudGltZUJ1aWxkaW5nQmxvY2spLmdldFJ1bnRpbWVCdWlsZGluZ0Jsb2NrVGVtcGxhdGUpIHtcblx0XHRcdFx0XHRcdFx0XHRpbml0aWFsVGVtcGxhdGUgPSBhd2FpdCBqc3gucmVuZGVyQXNYTUwoYXN5bmMgKCkgPT5cblx0XHRcdFx0XHRcdFx0XHRcdChvSW5zdGFuY2UgYXMgUnVudGltZUJ1aWxkaW5nQmxvY2spLmdldFJ1bnRpbWVCdWlsZGluZ0Jsb2NrVGVtcGxhdGUob05vZGUpXG5cdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRpbml0aWFsVGVtcGxhdGUgPSBhd2FpdCBqc3gucmVuZGVyQXNYTUwoYXN5bmMgKCkgPT4gb0luc3RhbmNlLmdldFRlbXBsYXRlIShvTm9kZSkpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHJldHVybiBwYXJzZVhNTFN0cmluZyhpbml0aWFsVGVtcGxhdGUgPz8gXCJcIiwgdHJ1ZSk7XG5cdFx0XHRcdFx0XHR9KSkgYXMgRWxlbWVudFtdO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAoaGFzRXJyb3IubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdFx0Ly8gSWYgdGhlcmUgaXMgdHJhaWxpbmcgdGV4dCB3ZSBjcmVhdGUgYSBzdGFuZGFyZCBlcnJvciBhbmQgZGlzcGxheSBpdC5cblx0XHRcdFx0XHRcdExvZy5lcnJvcihgRXJyb3Igd2hpbGUgcHJvY2Vzc2luZyBidWlsZGluZyBibG9jayAke29NZXRhZGF0YS54bWxUYWcgfHwgb01ldGFkYXRhLm5hbWV9YCk7XG5cdFx0XHRcdFx0XHRjb25zdCBvRXJyb3JUZXh0ID0gY3JlYXRlRXJyb3JYTUwoXG5cdFx0XHRcdFx0XHRcdFtcblx0XHRcdFx0XHRcdFx0XHRgRXJyb3Igd2hpbGUgcHJvY2Vzc2luZyBidWlsZGluZyBibG9jayAke29NZXRhZGF0YS54bWxUYWcgfHwgb01ldGFkYXRhLm5hbWV9YCxcblx0XHRcdFx0XHRcdFx0XHRgVHJhaWxpbmcgdGV4dCB3YXMgZm91bmQgaW4gdGhlIFhNTDogJHtoYXNFcnJvcn1gXG5cdFx0XHRcdFx0XHRcdF0sXG5cdFx0XHRcdFx0XHRcdHBhcnNlZFRlbXBsYXRlLm1hcCgodGVtcGxhdGUpID0+IHRlbXBsYXRlLm91dGVySFRNTCkuam9pbihcIlxcblwiKVxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdHBhcnNlZFRlbXBsYXRlID0gcGFyc2VYTUxTdHJpbmcob0Vycm9yVGV4dCwgdHJ1ZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdG9Ob2RlLnJlcGxhY2VXaXRoKC4uLnBhcnNlZFRlbXBsYXRlKTtcblxuXHRcdFx0XHRcdGNvbnN0IHZpc2l0ZWROb2RlcyA9IHBhcnNlZFRlbXBsYXRlLm1hcChhc3luYyAoaW50ZXJuYWxOb2RlKSA9PiB7XG5cdFx0XHRcdFx0XHRwcm9jZXNzU2xvdHMob0FnZ3JlZ2F0aW9ucywgb01ldGFkYXRhLmFnZ3JlZ2F0aW9ucywgaW50ZXJuYWxOb2RlLCBmYWxzZSk7XG5cdFx0XHRcdFx0XHRyZXR1cm4gb0NvbnRleHRWaXNpdG9yLnZpc2l0Tm9kZShpbnRlcm5hbE5vZGUpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdG9Qcm9taXNlID0gUHJvbWlzZS5hbGwodmlzaXRlZE5vZGVzKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRvTm9kZS5yZW1vdmUoKTtcblx0XHRcdFx0XHRvUHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGF3YWl0IG9Qcm9taXNlO1xuXHRcdFx0Y29uc3Qgb01hY3JvRWxlbWVudCA9IG9QYXJlbnQuY2hpbGRyZW5baUNoaWxkSW5kZXhdO1xuXHRcdFx0cHJvY2Vzc1Nsb3RzKG9BZ2dyZWdhdGlvbnMsIG9NZXRhZGF0YS5hZ2dyZWdhdGlvbnMsIG9NYWNyb0VsZW1lbnQsIHRydWUpO1xuXHRcdFx0aWYgKG9NYWNyb0VsZW1lbnQgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRjb25zdCBvUmVtYWluaW5nU2xvdHMgPSBvTWFjcm9FbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJzbG90XCIpO1xuXHRcdFx0XHRvUmVtYWluaW5nU2xvdHMuZm9yRWFjaChmdW5jdGlvbiAob1Nsb3RFbGVtZW50KSB7XG5cdFx0XHRcdFx0b1Nsb3RFbGVtZW50LnJlbW92ZSgpO1xuXHRcdFx0XHR9KTtcblx0XHRcdFx0aWYgKGNvcmVSZXF1aXJlKSB7XG5cdFx0XHRcdFx0bGV0IHJlcXVpcmVPbk1hY3JvID0gb01hY3JvRWxlbWVudC5nZXRBdHRyaWJ1dGVOUyhcInNhcC51aS5jb3JlXCIsIFwicmVxdWlyZVwiKTtcblx0XHRcdFx0XHRpZiAocmVxdWlyZU9uTWFjcm8pIHtcblx0XHRcdFx0XHRcdHJlcXVpcmVPbk1hY3JvID0gcmVxdWlyZU9uTWFjcm8uc3Vic3RyaW5nKDAsIHJlcXVpcmVPbk1hY3JvLmxlbmd0aCAtIDEpICsgXCIsXCIgKyBjb3JlUmVxdWlyZS5zdWJzdHJpbmcoMSk7IC8vIFJlbW92ZSBsYXN0IH0gYW5kIGZpcnN0IHtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0cmVxdWlyZU9uTWFjcm8gPSBjb3JlUmVxdWlyZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0b01hY3JvRWxlbWVudC5zZXRBdHRyaWJ1dGVOUyhcInNhcC51aS5jb3JlXCIsIFwiY29yZTpyZXF1aXJlXCIsIHJlcXVpcmVPbk1hY3JvKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAocHJvcGVydHlWYWx1ZXMuY2xhc3MgJiYgIUJ1aWxkaW5nQmxvY2tDbGFzcy5pc1J1bnRpbWUpIHtcblx0XHRcdFx0XHRvTWFjcm9FbGVtZW50LmNsYXNzTGlzdC5hZGQocHJvcGVydHlWYWx1ZXMuY2xhc3MgYXMgc3RyaW5nKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAob1ByZXZpb3VzTWFjcm9JbmZvKSB7XG5cdFx0XHQvL3Jlc3RvcmUgbWFjcm8gaW5mbyBpZiBhdmFpbGFibGVcblx0XHRcdG9TZXR0aW5nc1tcIl9tYWNyb0luZm9cIl0gPSBvUHJldmlvdXNNYWNyb0luZm87XG5cdFx0fSBlbHNlIHtcblx0XHRcdGRlbGV0ZSBvU2V0dGluZ3NbXCJfbWFjcm9JbmZvXCJdO1xuXHRcdH1cblx0fSBjYXRjaCAoZTogdW5rbm93bikge1xuXHRcdC8vIEluIGNhc2UgdGhlcmUgaXMgYSBnZW5lcmljIGVycm9yICh1c3VhbGx5IGNvZGUgZXJyb3IpLCB3ZSByZXRyaWV2ZSB0aGUgY3VycmVudCBjb250ZXh0IGluZm9ybWF0aW9uIGFuZCBjcmVhdGUgYSBkZWRpY2F0ZWQgZXJyb3IgbWVzc2FnZVxuXG5cdFx0Y29uc3QgdHJhY2VEZXRhaWxzID0ge1xuXHRcdFx0aW5pdGlhbFByb3BlcnRpZXM6IHt9IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuXHRcdFx0cmVzb2x2ZWRQcm9wZXJ0aWVzOiB7fSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcblx0XHRcdG1pc3NpbmdDb250ZXh0czogbU1pc3NpbmdDb250ZXh0XG5cdFx0fTtcblx0XHRmb3IgKGNvbnN0IHByb3BlcnR5TmFtZSBvZiBpbml0aWFsS2V5cykge1xuXHRcdFx0Y29uc3QgcHJvcGVydHlWYWx1ZSA9IHByb3BlcnR5VmFsdWVzW3Byb3BlcnR5TmFtZV07XG5cdFx0XHRpZiAoaXNDb250ZXh0KHByb3BlcnR5VmFsdWUpKSB7XG5cdFx0XHRcdHRyYWNlRGV0YWlscy5pbml0aWFsUHJvcGVydGllc1twcm9wZXJ0eU5hbWVdID0ge1xuXHRcdFx0XHRcdHBhdGg6IHByb3BlcnR5VmFsdWUuZ2V0UGF0aCgpLFxuXHRcdFx0XHRcdHZhbHVlOiBwcm9wZXJ0eVZhbHVlLmdldE9iamVjdCgpXG5cdFx0XHRcdH07XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0cmFjZURldGFpbHMuaW5pdGlhbFByb3BlcnRpZXNbcHJvcGVydHlOYW1lXSA9IHByb3BlcnR5VmFsdWU7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGZvciAoY29uc3QgcHJvcGVydHlOYW1lIGluIHByb3BlcnR5VmFsdWVzKSB7XG5cdFx0XHRjb25zdCBwcm9wZXJ0eVZhbHVlID0gcHJvcGVydHlWYWx1ZXNbcHJvcGVydHlOYW1lXTtcblx0XHRcdGlmICghaW5pdGlhbEtleXMuaW5jbHVkZXMocHJvcGVydHlOYW1lKSkge1xuXHRcdFx0XHRpZiAoaXNDb250ZXh0KHByb3BlcnR5VmFsdWUpKSB7XG5cdFx0XHRcdFx0dHJhY2VEZXRhaWxzLnJlc29sdmVkUHJvcGVydGllc1twcm9wZXJ0eU5hbWVdID0ge1xuXHRcdFx0XHRcdFx0cGF0aDogcHJvcGVydHlWYWx1ZS5nZXRQYXRoKCksXG5cdFx0XHRcdFx0XHR2YWx1ZTogcHJvcGVydHlWYWx1ZS5nZXRPYmplY3QoKVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dHJhY2VEZXRhaWxzLnJlc29sdmVkUHJvcGVydGllc1twcm9wZXJ0eU5hbWVdID0gcHJvcGVydHlWYWx1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRMb2cuZXJyb3IoZSBhcyBzdHJpbmcpO1xuXHRcdGNvbnN0IG9FcnJvciA9IGNyZWF0ZUVycm9yWE1MKFxuXHRcdFx0W2BFcnJvciB3aGlsZSBwcm9jZXNzaW5nIGJ1aWxkaW5nIGJsb2NrICR7b01ldGFkYXRhLm5hbWV9YF0sXG5cdFx0XHRvTm9kZS5vdXRlckhUTUwsXG5cdFx0XHR0cmFjZURldGFpbHMsXG5cdFx0XHQoZSBhcyBFcnJvcikuc3RhY2tcblx0XHQpO1xuXHRcdGNvbnN0IG9UZW1wbGF0ZSA9IHBhcnNlWE1MU3RyaW5nKG9FcnJvciwgdHJ1ZSk7XG5cdFx0b05vZGUucmVwbGFjZVdpdGgoLi4ub1RlbXBsYXRlKTtcblx0fVxufVxuZnVuY3Rpb24gYWRkU2luZ2xlQ29udGV4dChcblx0bUNvbnRleHRzOiBSZWNvcmQ8c3RyaW5nLCBDb250ZXh0IHwgdW5kZWZpbmVkPixcblx0b1Zpc2l0b3I6IElWaXNpdG9yQ2FsbGJhY2ssXG5cdG9DdHg6IHtcblx0XHRuYW1lPzogc3RyaW5nO1xuXHRcdHBhdGg6IHN0cmluZztcblx0XHRtb2RlbD86IHN0cmluZztcblx0fVxuKTogdm9pZCB7XG5cdGNvbnN0IHNLZXkgPSAob0N0eC5uYW1lIHx8IG9DdHgubW9kZWwgfHwgdW5kZWZpbmVkKSBhcyBzdHJpbmc7XG5cdGlmIChtQ29udGV4dHNbc0tleV0pIHtcblx0XHRyZXR1cm47IC8vIGRvIG5vdCBhZGQgdHdpY2Vcblx0fVxuXHR0cnkge1xuXHRcdGxldCBzQ29udGV4dFBhdGggPSBvQ3R4LnBhdGg7XG5cdFx0aWYgKG9DdHgubW9kZWwgIT09IG51bGwpIHtcblx0XHRcdHNDb250ZXh0UGF0aCA9IGAke29DdHgubW9kZWx9PiR7c0NvbnRleHRQYXRofWA7XG5cdFx0fVxuXHRcdGNvbnN0IG1TZXR0aW5nID0gb1Zpc2l0b3IuZ2V0U2V0dGluZ3MoKTtcblx0XHRpZiAob0N0eC5tb2RlbCA9PT0gXCJjb252ZXJ0ZXJDb250ZXh0XCIgJiYgb0N0eC5wYXRoLmxlbmd0aCA+IDApIHtcblx0XHRcdG1Db250ZXh0c1tzS2V5XSA9IG1TZXR0aW5nLm1vZGVsc1tvQ3R4Lm1vZGVsXS5nZXRDb250ZXh0KG9DdHgucGF0aCAvKiwgbVNldHRpbmcuYmluZGluZ0NvbnRleHRzW29DdHgubW9kZWxdKi8pOyAvLyBhZGQgdGhlIGNvbnRleHQgdG8gdGhlIHZpc2l0b3Jcblx0XHR9IGVsc2UgaWYgKCFtU2V0dGluZy5iaW5kaW5nQ29udGV4dHNbb0N0eC5tb2RlbCFdICYmIG1TZXR0aW5nLm1vZGVsc1tvQ3R4Lm1vZGVsIV0pIHtcblx0XHRcdG1Db250ZXh0c1tzS2V5XSA9IG1TZXR0aW5nLm1vZGVsc1tvQ3R4Lm1vZGVsIV0uZ2V0Q29udGV4dChvQ3R4LnBhdGgpOyAvLyBhZGQgdGhlIGNvbnRleHQgdG8gdGhlIHZpc2l0b3Jcblx0XHR9IGVsc2Uge1xuXHRcdFx0bUNvbnRleHRzW3NLZXldID0gb1Zpc2l0b3IuZ2V0Q29udGV4dChzQ29udGV4dFBhdGgpOyAvLyBhZGQgdGhlIGNvbnRleHQgdG8gdGhlIHZpc2l0b3Jcblx0XHR9XG5cdH0gY2F0Y2ggKGV4KSB7XG5cdFx0Ly8gaWdub3JlIHRoZSBjb250ZXh0IGFzIHRoaXMgY2FuIG9ubHkgYmUgdGhlIGNhc2UgaWYgdGhlIG1vZGVsIGlzIG5vdCByZWFkeSxcblx0XHQvLyBpLmUuIG5vdCBhIHByZXByb2Nlc3NpbmcgbW9kZWwgYnV0IG1heWJlIGEgbW9kZWwgZm9yIHByb3ZpZGluZyBhZnRlcndhcmRzXG5cdH1cbn1cblxuLyoqXG4gKiBSZWdpc3RlciBhIGJ1aWxkaW5nIGJsb2NrIGRlZmluaXRpb24gdG8gYmUgdXNlZCBpbnNpZGUgdGhlIHhtbCB0ZW1wbGF0ZSBwcm9jZXNzb3IuXG4gKlxuICogQHBhcmFtIEJ1aWxkaW5nQmxvY2tDbGFzcyBUaGUgYnVpbGRpbmcgYmxvY2sgZGVmaW5pdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJCdWlsZGluZ0Jsb2NrKEJ1aWxkaW5nQmxvY2tDbGFzczogdHlwZW9mIEJ1aWxkaW5nQmxvY2tUZW1wbGF0aW5nQmFzZSk6IHZvaWQge1xuXHRpZiAoQnVpbGRpbmdCbG9ja0NsYXNzLm1ldGFkYXRhLm5hbWVzcGFjZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0WE1MUHJlcHJvY2Vzc29yLnBsdWdJbihcblx0XHRcdGFzeW5jIChvTm9kZTogRWxlbWVudCwgb1Zpc2l0b3I6IElWaXNpdG9yQ2FsbGJhY2spID0+IHByb2Nlc3NCdWlsZGluZ0Jsb2NrKEJ1aWxkaW5nQmxvY2tDbGFzcywgb05vZGUsIG9WaXNpdG9yKSxcblx0XHRcdEJ1aWxkaW5nQmxvY2tDbGFzcy5tZXRhZGF0YS5uYW1lc3BhY2UsXG5cdFx0XHRCdWlsZGluZ0Jsb2NrQ2xhc3MubWV0YWRhdGEueG1sVGFnIHx8IEJ1aWxkaW5nQmxvY2tDbGFzcy5tZXRhZGF0YS5uYW1lXG5cdFx0KTtcblx0fVxuXHRpZiAoQnVpbGRpbmdCbG9ja0NsYXNzLm1ldGFkYXRhLnB1YmxpY05hbWVzcGFjZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0WE1MUHJlcHJvY2Vzc29yLnBsdWdJbihcblx0XHRcdGFzeW5jIChvTm9kZTogRWxlbWVudCwgb1Zpc2l0b3I6IElWaXNpdG9yQ2FsbGJhY2spID0+IHByb2Nlc3NCdWlsZGluZ0Jsb2NrKEJ1aWxkaW5nQmxvY2tDbGFzcywgb05vZGUsIG9WaXNpdG9yLCB0cnVlKSxcblx0XHRcdEJ1aWxkaW5nQmxvY2tDbGFzcy5tZXRhZGF0YS5wdWJsaWNOYW1lc3BhY2UsXG5cdFx0XHRCdWlsZGluZ0Jsb2NrQ2xhc3MubWV0YWRhdGEueG1sVGFnIHx8IEJ1aWxkaW5nQmxvY2tDbGFzcy5tZXRhZGF0YS5uYW1lXG5cdFx0KTtcblx0fVxufVxuXG4vKipcbiAqIFVuUmVnaXN0ZXIgYSBidWlsZGluZyBibG9jayBkZWZpbml0aW9uIHNvIHRoYXQgaXQgaXMgbm8gbG9uZ2VyIHVzZWQgaW5zaWRlIHRoZSB4bWwgdGVtcGxhdGUgcHJvY2Vzc29yLlxuICpcbiAqIEBwYXJhbSBCdWlsZGluZ0Jsb2NrQ2xhc3MgVGhlIGJ1aWxkaW5nIGJsb2NrIGRlZmluaXRpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVucmVnaXN0ZXJCdWlsZGluZ0Jsb2NrKEJ1aWxkaW5nQmxvY2tDbGFzczogdHlwZW9mIEJ1aWxkaW5nQmxvY2tUZW1wbGF0aW5nQmFzZSk6IHZvaWQge1xuXHRpZiAoQnVpbGRpbmdCbG9ja0NsYXNzLm1ldGFkYXRhLm5hbWVzcGFjZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0WE1MUHJlcHJvY2Vzc29yLnBsdWdJbihcblx0XHRcdG51bGwsXG5cdFx0XHRCdWlsZGluZ0Jsb2NrQ2xhc3MubWV0YWRhdGEubmFtZXNwYWNlLFxuXHRcdFx0QnVpbGRpbmdCbG9ja0NsYXNzLm1ldGFkYXRhLnhtbFRhZyB8fCBCdWlsZGluZ0Jsb2NrQ2xhc3MubWV0YWRhdGEubmFtZVxuXHRcdCk7XG5cdH1cblx0aWYgKEJ1aWxkaW5nQmxvY2tDbGFzcy5tZXRhZGF0YS5wdWJsaWNOYW1lc3BhY2UgIT09IHVuZGVmaW5lZCkge1xuXHRcdFhNTFByZXByb2Nlc3Nvci5wbHVnSW4oXG5cdFx0XHRudWxsLFxuXHRcdFx0QnVpbGRpbmdCbG9ja0NsYXNzLm1ldGFkYXRhLnB1YmxpY05hbWVzcGFjZSxcblx0XHRcdEJ1aWxkaW5nQmxvY2tDbGFzcy5tZXRhZGF0YS54bWxUYWcgfHwgQnVpbGRpbmdCbG9ja0NsYXNzLm1ldGFkYXRhLm5hbWVcblx0XHQpO1xuXHR9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUVycm9yWE1MKGVycm9yTWVzc2FnZXM6IHN0cmluZ1tdLCB4bWxGcmFnbWVudDogc3RyaW5nLCBhZGRpdGlvbmFsRGF0YT86IG9iamVjdCwgc3RhY2s/OiBzdHJpbmcpOiBzdHJpbmcge1xuXHRjb25zdCBlcnJvckxhYmVscyA9IGVycm9yTWVzc2FnZXMubWFwKChlcnJvck1lc3NhZ2UpID0+IHhtbGA8bTpMYWJlbCB0ZXh0PVwiJHtlc2NhcGVYTUxBdHRyaWJ1dGVWYWx1ZShlcnJvck1lc3NhZ2UpfVwiLz5gKTtcblx0bGV0IGVycm9yU3RhY2sgPSBcIlwiO1xuXHRpZiAoc3RhY2spIHtcblx0XHRjb25zdCBzdGFja0Zvcm1hdHRlZCA9IGJ0b2EoYDxwcmU+JHtzdGFja308L3ByZT5gKTtcblx0XHRlcnJvclN0YWNrID0geG1sYDxtOkZvcm1hdHRlZFRleHQgaHRtbFRleHQ9XCJ7PSBCQkYuYmFzZTY0RGVjb2RlKCcke3N0YWNrRm9ybWF0dGVkfScpIH1cIiAvPmA7XG5cdH1cblx0bGV0IGFkZGl0aW9uYWxUZXh0ID0gXCJcIjtcblx0aWYgKGFkZGl0aW9uYWxEYXRhKSB7XG5cdFx0YWRkaXRpb25hbFRleHQgPSB4bWxgPG06VkJveD5cblx0XHRcdFx0XHRcdDxtOkxhYmVsIHRleHQ9XCJUcmFjZSBJbmZvXCIvPlxuXHRcdFx0XHRcdFx0PGNvZGU6Q29kZUVkaXRvciB0eXBlPVwianNvblwiICB2YWx1ZT1cIiR7YHs9IEJCRi5iYXNlNjREZWNvZGUoJyR7YnRvYShKU09OLnN0cmluZ2lmeShhZGRpdGlvbmFsRGF0YSwgbnVsbCwgNCkpfScpIH1gfVwiIGhlaWdodD1cIjMwMHB4XCIgLz5cblx0XHRcdFx0XHQ8L206VkJveD5gO1xuXHR9XG5cdHJldHVybiB4bWxgPGNvbnRyb2xzOkZvcm1FbGVtZW50V3JhcHBlciB4bWxuczpjb250cm9scz1cInNhcC5mZS5jb3JlLmNvbnRyb2xzXCI+XG5cdFx0XHRcdFx0PG06VkJveCB4bWxuczptPVwic2FwLm1cIiB4bWxuczpjb2RlPVwic2FwLnVpLmNvZGVlZGl0b3JcIiBjb3JlOnJlcXVpcmU9XCJ7QkJGOidzYXAvZmUvY29yZS9idWlsZGluZ0Jsb2Nrcy90ZW1wbGF0aW5nL0J1aWxkaW5nQmxvY2tGb3JtYXR0ZXInfVwiPlxuXHRcdFx0XHRcdCR7ZXJyb3JMYWJlbHN9XG5cdFx0XHRcdFx0JHtlcnJvclN0YWNrfVxuXHRcdFx0XHRcdFx0PGdyaWQ6Q1NTR3JpZCBncmlkVGVtcGxhdGVSb3dzPVwiZnJcIiBncmlkVGVtcGxhdGVDb2x1bW5zPVwicmVwZWF0KDIsMWZyKVwiIGdyaWRHYXA9XCIxcmVtXCIgeG1sbnM6Z3JpZD1cInNhcC51aS5sYXlvdXQuY3NzZ3JpZFwiID5cblx0XHRcdFx0XHRcdFx0PG06VkJveD5cblx0XHRcdFx0XHRcdFx0XHQ8bTpMYWJlbCB0ZXh0PVwiSG93IHRoZSBidWlsZGluZyBibG9jayB3YXMgY2FsbGVkXCIvPlxuXHRcdFx0XHRcdFx0XHRcdDxjb2RlOkNvZGVFZGl0b3IgdHlwZT1cInhtbFwiIHZhbHVlPVwiJHtgez0gQkJGLmJhc2U2NERlY29kZSgnJHtidG9hKHhtbEZyYWdtZW50LnJlcGxhY2VBbGwoXCImZ3Q7XCIsIFwiPlwiKSl9JykgfWB9XCIgaGVpZ2h0PVwiMzAwcHhcIiAvPlxuXHRcdFx0XHRcdFx0XHQ8L206VkJveD5cblx0XHRcdFx0XHRcdFx0JHthZGRpdGlvbmFsVGV4dH1cblx0XHRcdFx0XHRcdDwvZ3JpZDpDU1NHcmlkPlxuXHRcdFx0XHRcdDwvbTpWQm94PlxuXHRcdFx0XHQ8L2NvbnRyb2xzOkZvcm1FbGVtZW50V3JhcHBlcj5gO1xufVxuXG5jb25zdCB0ZW1wb3JhcnlPYmplY3RTdG9yZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblxuLyoqXG4gKiBTdG9yZXMgYW4gb2JqZWN0IHZhbHVlIGluIGEgdGVtcG9yYXJ5IHN0b3JhZ2UgYW5kIHJldHVybnMgYW4gSUQgdXNlZCB0byByZXRyaWV2ZSB0aGlzIHZhbHVlIGF0IGEgbGF0ZXIgcG9pbnQgaW4gdGltZS5cbiAqXG4gKiBSZXF1aXJlZCBhcyB0aGVyZSBpcyBmdW5jdGlvbmFsaXR5IGxpa2UgdGhlIHhtbGAgZnVuY3Rpb24sIHdoaWNoIG1pZ2h0IHRha2Ugb2JqZWN0cyBhcyBwYXJhbWV0ZXJzIGJ1dCBuZWVkcyB0byByZXR1cm4gYSBzZXJpYWxpemVkIHN0cmluZy5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgVmFsdWUgdG8gc3RvcmVcbiAqIEByZXR1cm5zIElEIHRvIHJldHJpZXZlIHRoaXMgdmFsdWVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0b3JlT2JqZWN0VmFsdWUodmFsdWU6IHVua25vd24pOiBzdHJpbmcge1xuXHRjb25zdCBwcm9wZXJ0eVVJRCA9IGAvdWlkLS0ke3VpZCgpfWA7XG5cdHRlbXBvcmFyeU9iamVjdFN0b3JlW3Byb3BlcnR5VUlEXSA9IHZhbHVlO1xuXHRyZXR1cm4gcHJvcGVydHlVSUQ7XG59XG5cbi8qKlxuICogVW5zdG9yZXMgYW4gb2JqZWN0IGZyb20gYSB0ZW1wb3Jhcnkgc3RvcmUgYnkgcmVtb3ZpbmcgaXQgYW5kIHJldHVybmluZyBpdHMgb2JqZWN0IHZhbHVlLlxuICpcbiAqIEBwYXJhbSBwcm9wZXJ0eVVJRCBJRCB0byByZXRyaWV2ZSB0aGlzIHZhbHVlXG4gKiBAcmV0dXJucyBPYmplY3QgdmFsdWVcbiAqL1xuZnVuY3Rpb24gdW5zdG9yZU9iamVjdFZhbHVlKHByb3BlcnR5VUlEOiBzdHJpbmcpOiB1bmtub3duIHtcblx0Y29uc3QgdmFsdWUgPSB0ZW1wb3JhcnlPYmplY3RTdG9yZVtwcm9wZXJ0eVVJRF07XG5cdGRlbGV0ZSB0ZW1wb3JhcnlPYmplY3RTdG9yZVtwcm9wZXJ0eVVJRF07XG5cdHJldHVybiB2YWx1ZTtcbn1cblxubGV0IHByb2Nlc3NOZXh0WG1sSW5UcmFjZSA9IGZhbHNlO1xuLyoqXG4gKiBNYWtlcyBzdXJlIHRoYXQgYWxsIHhtbGAgY2FsbHMgaW5zaWRlIHRoZSBnaXZlbiBtZXRob2QgYXJlIHByb2Nlc3NlZCBpbiB0cmFjZSBtb2RlLlxuICpcbiAqIEBwYXJhbSBtZXRob2QgVGhlIG1ldGhvZCB0byBleGVjdXRlXG4gKiBAcmV0dXJucyBUaGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBnaXZlbiBtZXRob2RcbiAqL1xuY29uc3QgcHJvY2Vzc1htbEluVHJhY2UgPSBhc3luYyBmdW5jdGlvbiAobWV0aG9kOiAoLi4uYXJnczogdW5rbm93bltdKSA9PiBQcm9taXNlPHVua25vd24+KTogUHJvbWlzZTx1bmtub3duPiB7XG5cdHByb2Nlc3NOZXh0WG1sSW5UcmFjZSA9IHRydWU7XG5cdGxldCByZXR1cm5WYWx1ZTtcblx0dHJ5IHtcblx0XHRyZXR1cm5WYWx1ZSA9IG1ldGhvZCgpO1xuXHR9IGZpbmFsbHkge1xuXHRcdHByb2Nlc3NOZXh0WG1sSW5UcmFjZSA9IGZhbHNlO1xuXHR9XG5cdHJldHVybiByZXR1cm5WYWx1ZTtcbn07XG5cbi8qKlxuICogUGFyc2UgYW4gWE1MIHN0cmluZyBhbmQgcmV0dXJuIHRoZSBhc3NvY2lhdGVkIGRvY3VtZW50LlxuICpcbiAqIEBwYXJhbSB4bWxTdHJpbmcgVGhlIHhtbCBzdHJpbmdcbiAqIEBwYXJhbSBbYWRkRGVmYXVsdE5hbWVzcGFjZXNdIFdoZXRoZXIgb3Igbm90IGRlZmF1bHQgbmFtZXNwYWNlcyBzaG91bGQgYmUgYWRkZWRcbiAqIEByZXR1cm5zIFRoZSBYTUwgZG9jdW1lbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVhNTFN0cmluZyh4bWxTdHJpbmc6IHN0cmluZywgYWRkRGVmYXVsdE5hbWVzcGFjZXMgPSBmYWxzZSk6IEVsZW1lbnRbXSB7XG5cdGlmIChhZGREZWZhdWx0TmFtZXNwYWNlcykge1xuXHRcdHhtbFN0cmluZyA9IGA8dGVtcGxhdGVcblx0XHRcdFx0XHRcdHhtbG5zOnRlbXBsYXRlPVwiaHR0cDovL3NjaGVtYXMuc2FwLmNvbS9zYXB1aTUvZXh0ZW5zaW9uL3NhcC51aS5jb3JlLnRlbXBsYXRlLzFcIlxuXHRcdFx0XHRcdFx0eG1sbnM6bT1cInNhcC5tXCJcblx0XHRcdFx0XHRcdHhtbG5zOm1hY3Jvcz1cInNhcC5mZS5tYWNyb3NcIlxuXHRcdFx0XHRcdFx0eG1sbnM6Y29yZT1cInNhcC51aS5jb3JlXCJcblx0XHRcdFx0XHRcdHhtbG5zOm1kYz1cInNhcC51aS5tZGNcIlxuXHRcdFx0XHRcdFx0eG1sbnM6Y3VzdG9tRGF0YT1cImh0dHA6Ly9zY2hlbWFzLnNhcC5jb20vc2FwdWk1L2V4dGVuc2lvbi9zYXAudWkuY29yZS5DdXN0b21EYXRhLzFcIj4ke3htbFN0cmluZ308L3RlbXBsYXRlPmA7XG5cdH1cblx0Y29uc3QgeG1sRG9jdW1lbnQgPSBET01QYXJzZXJJbnN0YW5jZS5wYXJzZUZyb21TdHJpbmcoeG1sU3RyaW5nLCBcInRleHQveG1sXCIpO1xuXHRsZXQgb3V0cHV0ID0geG1sRG9jdW1lbnQuZmlyc3RFbGVtZW50Q2hpbGQ7XG5cdHdoaWxlIChvdXRwdXQ/LmxvY2FsTmFtZSA9PT0gXCJ0ZW1wbGF0ZVwiKSB7XG5cdFx0b3V0cHV0ID0gb3V0cHV0LmZpcnN0RWxlbWVudENoaWxkO1xuXHR9XG5cdGNvbnN0IGNoaWxkcmVuID0gb3V0cHV0Py5wYXJlbnRFbGVtZW50ID8gb3V0cHV0Py5wYXJlbnRFbGVtZW50LmNoaWxkcmVuIDogW291dHB1dCBhcyBFbGVtZW50XTtcblx0cmV0dXJuIEFycmF5LmZyb20oY2hpbGRyZW4pO1xufVxuXG4vKipcbiAqIEVzY2FwZSBhbiBYTUwgYXR0cmlidXRlIHZhbHVlLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSBUaGUgYXR0cmlidXRlIHZhbHVlIHRvIGVzY2FwZS5cbiAqIEByZXR1cm5zIFRoZSBlc2NhcGVkIHN0cmluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVzY2FwZVhNTEF0dHJpYnV0ZVZhbHVlKHZhbHVlPzogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0cmV0dXJuIHZhbHVlPy5yZXBsYWNlKC8mL2csIFwiJmFtcDtcIikucmVwbGFjZSgvPC9nLCBcIiZsdDtcIikucmVwbGFjZSgvXCIvZywgXCImcXVvdDtcIikucmVwbGFjZSgvJy9nLCBcIiZhcG9zO1wiKTtcbn1cblxuZnVuY3Rpb24gcmVuZGVySW5UcmFjZU1vZGUob3V0U3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRjb25zdCB4bWxSZXN1bHQgPSBwYXJzZVhNTFN0cmluZyhvdXRTdHIsIHRydWUpO1xuXHRpZiAoeG1sUmVzdWx0Py5sZW5ndGggPiAwICYmIHhtbFJlc3VsdFswXT8ubG9jYWxOYW1lID09PSBcInBhcnNlcmVycm9yXCIpIHtcblx0XHRjb25zdCBlcnJvck1lc3NhZ2UgPSAoeG1sUmVzdWx0WzBdIGFzIEhUTUxFbGVtZW50KS5pbm5lclRleHQgfHwgKHhtbFJlc3VsdFswXSBhcyBIVE1MRWxlbWVudCkuaW5uZXJIVE1MO1xuXHRcdHJldHVybiBjcmVhdGVFcnJvclhNTChbZXJyb3JNZXNzYWdlLnNwbGl0KFwiXFxuXCIpWzBdXSwgb3V0U3RyKTtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gb3V0U3RyO1xuXHR9XG59XG5cbmV4cG9ydCB0eXBlIFhNTFByb2Nlc3NvclR5cGVWYWx1ZSA9XG5cdHwgc3RyaW5nXG5cdHwgYm9vbGVhblxuXHR8IG51bWJlclxuXHR8IHVuZGVmaW5lZFxuXHR8IG51bGxcblx0fCBvYmplY3Rcblx0fCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuXHR8IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxzdHJpbmcgfCBib29sZWFuIHwgbnVtYmVyPlxuXHR8IEFycmF5PHN0cmluZz5cblx0fCBBcnJheTxGdW5jdGlvbj5cblx0fCBGdW5jdGlvblxuXHR8IENvbnRleHQ7XG4vKipcbiAqIENyZWF0ZSBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgdGVtcGxhdGUgbGl0ZXJhbCB3aGlsZSBoYW5kbGluZyBzcGVjaWFsIG9iamVjdCBjYXNlLlxuICpcbiAqIEBwYXJhbSBzdHJpbmdzIFRoZSBzdHJpbmcgcGFydHMgb2YgdGhlIHRlbXBsYXRlIGxpdGVyYWxcbiAqIEBwYXJhbSB2YWx1ZXMgVGhlIHZhbHVlcyBwYXJ0IG9mIHRoZSB0ZW1wbGF0ZSBsaXRlcmFsXG4gKiBAcmV0dXJucyBUaGUgWE1MIHN0cmluZyBkb2N1bWVudCByZXByZXNlbnRpbmcgdGhlIHN0cmluZyB0aGF0IHdhcyB1c2VkLlxuICovXG5leHBvcnQgY29uc3QgeG1sID0gKHN0cmluZ3M6IFRlbXBsYXRlU3RyaW5nc0FycmF5LCAuLi52YWx1ZXM6IFhNTFByb2Nlc3NvclR5cGVWYWx1ZVtdKTogc3RyaW5nID0+IHtcblx0bGV0IG91dFN0ciA9IFwiXCI7XG5cdGxldCBpO1xuXHRmb3IgKGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0b3V0U3RyICs9IHN0cmluZ3NbaV07XG5cblx0XHQvLyBIYW5kbGUgdGhlIGRpZmZlcmVudCBjYXNlIG9mIG9iamVjdCwgaWYgaXQncyBhbiBhcnJheSB3ZSBqb2luIHRoZW0sIGlmIGl0J3MgYSBiaW5kaW5nIGV4cHJlc3Npb24gdGhlbiB3ZSBjb21waWxlIGl0LlxuXHRcdGNvbnN0IHZhbHVlID0gdmFsdWVzW2ldO1xuXG5cdFx0aWYgKEFycmF5LmlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmxlbmd0aCA+IDAgJiYgdHlwZW9mIHZhbHVlWzBdID09PSBcInN0cmluZ1wiKSB7XG5cdFx0XHRvdXRTdHIgKz0gdmFsdWUuZmxhdCg1KS5qb2luKFwiXFxuXCIpLnRyaW0oKTtcblx0XHR9IGVsc2UgaWYgKGlzRnVuY3Rpb25BcnJheSh2YWx1ZSkpIHtcblx0XHRcdG91dFN0ciArPSB2YWx1ZS5tYXAoKHZhbHVlZm4pID0+IHZhbHVlZm4oKSkuam9pbihcIlxcblwiKTtcblx0XHR9IGVsc2UgaWYgKGlzQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uKHZhbHVlKSkge1xuXHRcdFx0Y29uc3QgY29tcGlsZWRFeHByZXNzaW9uID0gY29tcGlsZUV4cHJlc3Npb24odmFsdWUpO1xuXHRcdFx0b3V0U3RyICs9IGVzY2FwZVhNTEF0dHJpYnV0ZVZhbHVlKGNvbXBpbGVkRXhwcmVzc2lvbik7XG5cdFx0fSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09IFwidW5kZWZpbmVkXCIpIHtcblx0XHRcdG91dFN0ciArPSBcInt0aGlzPnVuZGVmaW5lZFZhbHVlfVwiO1xuXHRcdH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCIpIHtcblx0XHRcdG91dFN0ciArPSB2YWx1ZSgpO1xuXHRcdH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIHZhbHVlICE9PSBudWxsKSB7XG5cdFx0XHRpZiAoaXNDb250ZXh0KHZhbHVlKSkge1xuXHRcdFx0XHRvdXRTdHIgKz0gdmFsdWUuZ2V0UGF0aCgpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3QgcHJvcGVydHlVSWQgPSBzdG9yZU9iamVjdFZhbHVlKHZhbHVlKTtcblx0XHRcdFx0b3V0U3RyICs9IGAke3Byb3BlcnR5VUlkfWA7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiYgIXZhbHVlLnN0YXJ0c1dpdGgoXCI8XCIpICYmICF2YWx1ZS5zdGFydHNXaXRoKFwiJmx0O1wiKSkge1xuXHRcdFx0b3V0U3RyICs9IGVzY2FwZVhNTEF0dHJpYnV0ZVZhbHVlKHZhbHVlKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0b3V0U3RyICs9IHZhbHVlO1xuXHRcdH1cblx0fVxuXHRvdXRTdHIgKz0gc3RyaW5nc1tpXTtcblx0b3V0U3RyID0gb3V0U3RyLnRyaW0oKTtcblx0aWYgKHByb2Nlc3NOZXh0WG1sSW5UcmFjZSkge1xuXHRcdHJldHVybiByZW5kZXJJblRyYWNlTW9kZShvdXRTdHIpO1xuXHR9XG5cdHJldHVybiBvdXRTdHI7XG59O1xuXG5leHBvcnQgY29uc3QgYWRkQ29uZGl0aW9uYWxseVRvWE1MID0gZnVuY3Rpb24gKGNvbmRpdGlvbjogYm9vbGVhbiwgcGFydFRvQWRkOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRpZiAoY29uZGl0aW9uKSB7XG5cdFx0cmV0dXJuIHBhcnRUb0FkZDtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gXCJcIjtcblx0fVxufTtcblxuLyoqXG4gKiBBZGQgYW4gYXR0cmlidXRlIGRlcGVuZGluZyBvbiB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgcHJvcGVydHkuXG4gKiBJZiBpdCdzIHVuZGVmaW5lZCB0aGUgYXR0cmlidXRlIGlzIG5vdCBhZGRlZC5cbiAqXG4gKiBAcGFyYW0gYXR0cmlidXRlTmFtZVxuICogQHBhcmFtIHZhbHVlXG4gKiBAcmV0dXJucyBUaGUgYXR0cmlidXRlIHRvIGFkZCBpZiB0aGUgdmFsdWUgaXMgbm90IHVuZGVmaW5lZCwgb3RoZXJ3aXNlIGFuIGVtcHR5IHN0cmluZ1xuICovXG5leHBvcnQgY29uc3QgYWRkQXR0cmlidXRlVG9YTUwgPSBmdW5jdGlvbiAoYXR0cmlidXRlTmFtZTogc3RyaW5nLCB2YWx1ZT86IFhNTFByb2Nlc3NvclR5cGVWYWx1ZSk6ICgpID0+IHN0cmluZyB7XG5cdGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkICYmICFpc1VuZGVmaW5lZEV4cHJlc3Npb24odmFsdWUpKSB7XG5cdFx0cmV0dXJuICgpID0+IHhtbGAke2F0dHJpYnV0ZU5hbWV9PVwiJHt2YWx1ZX1cImA7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuICgpID0+IFwiXCI7XG5cdH1cbn07XG4iXSwibWFwcGluZ3MiOiI7QUFBQTtBQUFBO0FBQUE7Ozs7Ozs7Ozs7O0VBZ0NBLE1BQU1BLFlBQVksR0FBRyxzRUFBc0U7RUFDM0YsTUFBTUMsZ0JBQWdCLEdBQUcsZ0VBQWdFO0VBQ3pGLE1BQU1DLGlCQUFpQixHQUFHLElBQUlDLFNBQVMsRUFBRTtFQTZHekMsU0FBU0MsNEJBQTRCLENBQ3BDQyxLQUFhLEVBQ2JDLFNBQWtDLEVBQ2xDQyxnQkFBd0QsRUFDeERDLElBQVksRUFDTDtJQUNQLE1BQU1DLFFBQVEsR0FBR0gsU0FBUyxDQUFDRSxJQUFJLENBQUM7SUFDaEMsTUFBTUUsY0FBYyxHQUFHRCxRQUFRLGFBQVJBLFFBQVEsdUJBQVJBLFFBQVEsQ0FBRUUsU0FBUyxFQUd6QztJQUVELElBQUlKLGdCQUFnQixDQUFDSyxRQUFRLEtBQUssSUFBSSxLQUFLLENBQUNILFFBQVEsSUFBSUMsY0FBYyxLQUFLLElBQUksQ0FBQyxFQUFFO01BQ2pGLE1BQU0sSUFBSUcsS0FBSyxDQUFFLEdBQUVSLEtBQU0sK0JBQThCRyxJQUFLLGNBQWEsQ0FBQztJQUMzRSxDQUFDLE1BQU0sSUFBSUUsY0FBYyxFQUFFO01BQzFCO01BQ0E7TUFDQSxJQUFJQSxjQUFjLENBQUNJLGNBQWMsQ0FBQyxPQUFPLENBQUMsSUFBSUosY0FBYyxDQUFDSyxLQUFLLEtBQUtDLFNBQVMsSUFBSVQsZ0JBQWdCLENBQUNVLGFBQWEsS0FBS0QsU0FBUyxFQUFFO1FBQ2pJO1FBQ0EsSUFBSSxDQUFDVCxnQkFBZ0IsQ0FBQ1UsYUFBYSxDQUFDQyxRQUFRLENBQUNSLGNBQWMsQ0FBQ0ssS0FBSyxDQUFDLEVBQUU7VUFDbkUsTUFBTSxJQUFJRixLQUFLLENBQ2IsR0FBRVIsS0FBTSxNQUFLRyxJQUFLLHNCQUFxQkQsZ0JBQWdCLENBQUNVLGFBQWMsYUFDdEVQLGNBQWMsQ0FBQ0ssS0FDZixNQUFLTixRQUFRLENBQUNVLE9BQU8sRUFBRyxFQUFDLENBQzFCO1FBQ0Y7TUFDRCxDQUFDLE1BQU0sSUFDTlQsY0FBYyxDQUFDSSxjQUFjLENBQUMsT0FBTyxDQUFDLElBQ3RDSixjQUFjLENBQUNVLEtBQUssS0FBS0osU0FBUyxJQUNsQ1QsZ0JBQWdCLENBQUNjLHVCQUF1QixFQUN2QztRQUNEO1FBQ0EsSUFBSSxDQUFDZCxnQkFBZ0IsQ0FBQ2MsdUJBQXVCLENBQUNILFFBQVEsQ0FBQ1IsY0FBYyxDQUFDVSxLQUFLLENBQUMsRUFBRTtVQUM3RSxNQUFNLElBQUlQLEtBQUssQ0FDYixHQUFFUixLQUFNLE1BQUtHLElBQUssc0JBQXFCRCxnQkFBZ0IsQ0FBQ2MsdUJBQXdCLGFBQ2hGWCxjQUFjLENBQUNVLEtBQ2YsTUFBS1gsUUFBUSxDQUFDVSxPQUFPLEVBQUcsRUFBQyxDQUMxQjtRQUNGO01BQ0Q7SUFDRDtFQUNEO0VBQ08sU0FBU0csc0JBQXNCLENBQ3JDakIsS0FBYSxFQUNia0IsU0FBMkMsRUFDM0NqQixTQUFrQyxFQUNsQ2tCLEtBQWMsRUFDUDtJQUNQLE1BQU1DLG9CQUFvQixHQUFJRixTQUFTLENBQUNHLGdCQUFnQixJQUFJQyxNQUFNLENBQUNDLElBQUksQ0FBQ0wsU0FBUyxDQUFDRyxnQkFBZ0IsQ0FBQyxJQUFLLEVBQUU7TUFDekdHLFdBQVcsR0FBSU4sU0FBUyxDQUFDTyxVQUFVLElBQUlILE1BQU0sQ0FBQ0MsSUFBSSxDQUFDTCxTQUFTLENBQUNPLFVBQVUsQ0FBQyxJQUFLLEVBQUU7TUFDL0VDLGVBQXdDLEdBQUcsQ0FBQyxDQUFDOztJQUU5QztJQUNBLE1BQU1DLGNBQWMsR0FBR1IsS0FBSyxDQUFDUyxpQkFBaUIsRUFBRTtJQUNoRCxLQUFLLE1BQU1DLGFBQWEsSUFBSUYsY0FBYyxFQUFFO01BQzNDRCxlQUFlLENBQUNHLGFBQWEsQ0FBQyxHQUFHLElBQUk7SUFDdEM7O0lBRUE7SUFDQVQsb0JBQW9CLENBQUNVLE9BQU8sQ0FBQyxVQUFVM0IsSUFBSSxFQUFFO01BQzVDLE1BQU1ELGdCQUFnQixHQUFHZ0IsU0FBUyxDQUFDRyxnQkFBZ0IsQ0FBQ2xCLElBQUksQ0FBQztNQUV6REosNEJBQTRCLENBQUNDLEtBQUssRUFBRUMsU0FBUyxFQUFFQyxnQkFBZ0IsRUFBRUMsSUFBSSxDQUFDO01BQ3RFLE9BQU91QixlQUFlLENBQUN2QixJQUFJLENBQUM7SUFDN0IsQ0FBQyxDQUFDO0lBQ0Y7SUFDQXFCLFdBQVcsQ0FBQ00sT0FBTyxDQUFDLFVBQVUzQixJQUFJLEVBQUU7TUFDbkMsTUFBTTRCLGlCQUFpQixHQUFHYixTQUFTLENBQUNPLFVBQVUsQ0FBQ3RCLElBQUksQ0FBQztNQUNwRCxJQUFJLENBQUNnQixLQUFLLENBQUNhLFlBQVksQ0FBQzdCLElBQUksQ0FBQyxFQUFFO1FBQzlCLElBQUk0QixpQkFBaUIsQ0FBQ3hCLFFBQVEsSUFBSSxDQUFDd0IsaUJBQWlCLENBQUN0QixjQUFjLENBQUMsY0FBYyxDQUFDLEVBQUU7VUFDcEYsTUFBTSxJQUFJRCxLQUFLLENBQUUsR0FBRVIsS0FBTSxJQUFHLEdBQUksc0JBQXFCRyxJQUFLLGNBQWEsQ0FBQztRQUN6RTtNQUNELENBQUMsTUFBTTtRQUNOLE9BQU91QixlQUFlLENBQUN2QixJQUFJLENBQUM7TUFDN0I7SUFDRCxDQUFDLENBQUM7O0lBRUY7SUFDQW1CLE1BQU0sQ0FBQ0MsSUFBSSxDQUFDRyxlQUFlLENBQUMsQ0FBQ0ksT0FBTyxDQUFDLFVBQVUzQixJQUFZLEVBQUU7TUFDNUQ7TUFDQSxJQUFJLENBQUNBLElBQUksQ0FBQ1UsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUNWLElBQUksQ0FBQzhCLFVBQVUsQ0FBQyxPQUFPLENBQUMsRUFBRTtRQUNyREMsR0FBRyxDQUFDQyxPQUFPLENBQUUsd0JBQXVCbkMsS0FBTSxLQUFJRyxJQUFLLEVBQUMsRUFBRVEsU0FBUyxFQUFFaEIsWUFBWSxDQUFDO01BQy9FO0lBQ0QsQ0FBQyxDQUFDO0VBQ0g7RUFBQztFQUVELE1BQU15QyxtQkFBbUIsR0FBRyxxQkFBcUI7RUFFMUMsTUFBTUMsb0JBQW9CLEdBQUcsc0JBQXNCOztFQUUxRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQU5BO0VBT0EsU0FBU0MsaUJBQWlCLENBQUNDLHFCQUE0QyxFQUFvQztJQUMxRyxNQUFNZCxVQUEyRCxHQUFHO01BQ25FZSxLQUFLLEVBQUU7UUFDTkMsSUFBSSxFQUFFLFFBQVE7UUFDZEMsUUFBUSxFQUFFO01BQ1g7SUFDRCxDQUFDO0lBQ0QsTUFBTUMsWUFBZ0UsR0FBRztNQUN4RUMsVUFBVSxFQUFFO1FBQ1hILElBQUksRUFBRUwsbUJBQW1CO1FBQ3pCUyxJQUFJLEVBQUUsWUFBWTtRQUNsQkgsUUFBUSxFQUFFO01BQ1gsQ0FBQztNQUNESSxVQUFVLEVBQUU7UUFDWEwsSUFBSSxFQUFFTCxtQkFBbUI7UUFDekJTLElBQUksRUFBRSxZQUFZO1FBQ2xCSCxRQUFRLEVBQUU7TUFDWCxDQUFDO01BQ0RLLFVBQVUsRUFBRTtRQUNYTixJQUFJLEVBQUVMLG1CQUFtQjtRQUN6QlMsSUFBSSxFQUFFLFlBQVk7UUFDbEJILFFBQVEsRUFBRTtNQUNYLENBQUM7TUFDRCxHQUFHSCxxQkFBcUIsQ0FBQ0k7SUFDMUIsQ0FBQztJQUNELE1BQU10QixnQkFBd0UsR0FBRyxDQUFDLENBQUM7SUFFbkYsS0FBSyxNQUFNMkIsWUFBWSxJQUFJMUIsTUFBTSxDQUFDQyxJQUFJLENBQUNnQixxQkFBcUIsQ0FBQ2QsVUFBVSxDQUFDLEVBQUU7TUFDekUsTUFBTXdCLFlBQVksR0FBR1YscUJBQXFCLENBQUNkLFVBQVUsQ0FBQ3VCLFlBQVksQ0FBQyxDQUFDUCxJQUFJO01BRXhFLElBQUlRLFlBQVksS0FBS1osb0JBQW9CLEVBQUU7UUFDMUNaLFVBQVUsQ0FBQ3VCLFlBQVksQ0FBQyxHQUFHVCxxQkFBcUIsQ0FBQ2QsVUFBVSxDQUFDdUIsWUFBWSxDQUFDO01BQzFFO01BRUEsSUFBSSxDQUFDWCxvQkFBb0IsRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUN4QixRQUFRLENBQUNvQyxZQUFZLENBQUMsRUFBRTtRQUNyRTtRQUNBNUIsZ0JBQWdCLENBQUMyQixZQUFZLENBQUMsR0FBR1QscUJBQXFCLENBQUNkLFVBQVUsQ0FBQ3VCLFlBQVksQ0FBMkM7TUFDMUg7SUFDRDtJQUVBLE9BQU87TUFDTixHQUFHVCxxQkFBcUI7TUFDeEJkLFVBQVU7TUFDVkosZ0JBQWdCO01BQ2hCc0I7SUFDRCxDQUFDO0VBQ0Y7O0VBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDQSxTQUFTTyw2QkFBNkIsQ0FBQ0MsU0FBb0MsRUFBRUMsZUFBdUIsRUFBbUI7SUFDdEgsSUFBSUMsU0FBaUI7SUFDckIsSUFBSUQsZUFBZSxJQUFJQSxlQUFlLENBQUNuQixVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUU7TUFDdkQ7TUFDQW9CLFNBQVMsR0FBR0QsZUFBZTtJQUM1QixDQUFDLE1BQU07TUFDTixJQUFJRSxZQUFZLEdBQUdILFNBQVMsQ0FBQ0ksa0JBQWtCLENBQUN6QyxPQUFPLEVBQUU7TUFDekQsSUFBSSxDQUFDd0MsWUFBWSxDQUFDRSxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUU7UUFDaENGLFlBQVksSUFBSSxHQUFHO01BQ3BCO01BQ0FELFNBQVMsR0FBR0MsWUFBWSxHQUFHRixlQUFlO0lBQzNDO0lBQ0EsT0FBTztNQUNOSyxLQUFLLEVBQUUsV0FBVztNQUNsQkMsSUFBSSxFQUFFTDtJQUNQLENBQUM7RUFDRjs7RUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0EsU0FBU00sNkJBQTZCLENBQ3JDUixTQUFvQyxFQUNwQ1MsY0FBc0IsRUFDdEJSLGVBQXVCLEVBQ0w7SUFDbEIsSUFBSVMsYUFBOEI7SUFDbEMsSUFBSVQsZUFBZSxDQUFDbkIsVUFBVSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUNrQixTQUFTLENBQUNXLE1BQU0sQ0FBQ0MsZ0JBQWdCLENBQUNDLFdBQVcsQ0FBQ1osZUFBZSxDQUFDLEVBQUU7TUFDNUcsTUFBTWEsSUFBSSxHQUFHQyxrQkFBa0IsQ0FBQ2QsZUFBZSxDQUFDO01BQ2hERCxTQUFTLENBQUNXLE1BQU0sQ0FBQ0MsZ0JBQWdCLENBQUNJLFdBQVcsQ0FBQ2YsZUFBZSxFQUFFYSxJQUFJLENBQUM7TUFDcEVKLGFBQWEsR0FBRztRQUNmSixLQUFLLEVBQUUsa0JBQWtCO1FBQ3pCQyxJQUFJLEVBQUVOO01BQ1AsQ0FBQztJQUNGLENBQUMsTUFBTSxJQUFLUSxjQUFjLEtBQUssVUFBVSxJQUFJVCxTQUFTLENBQUNJLGtCQUFrQixJQUFLSyxjQUFjLEtBQUssYUFBYSxFQUFFO01BQy9HQyxhQUFhLEdBQUdYLDZCQUE2QixDQUFDQyxTQUFTLEVBQUVDLGVBQWUsQ0FBQztJQUMxRSxDQUFDLE1BQU0sSUFBSUEsZUFBZSxJQUFJQSxlQUFlLENBQUNuQixVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUU7TUFDOUQ7TUFDQTRCLGFBQWEsR0FBRztRQUNmSixLQUFLLEVBQUUsV0FBVztRQUNsQkMsSUFBSSxFQUFFTjtNQUNQLENBQUM7SUFDRixDQUFDLE1BQU07TUFDTlMsYUFBYSxHQUFHO1FBQ2ZKLEtBQUssRUFBRSxXQUFXO1FBQ2xCQyxJQUFJLEVBQUVQLFNBQVMsQ0FBQ2lCLGVBQWUsQ0FBQ0MsU0FBUyxHQUFHbEIsU0FBUyxDQUFDaUIsZUFBZSxDQUFDQyxTQUFTLENBQUN2RCxPQUFPLENBQUNzQyxlQUFlLENBQUMsR0FBR0E7TUFDNUcsQ0FBQztJQUNGO0lBQ0EsT0FBT1MsYUFBYTtFQUNyQjtFQUVBLFNBQVNTLG1CQUFtQixDQUMzQm5CLFNBQW9DLEVBQ3BDaEMsS0FBYyxFQUNkeUMsY0FBc0IsRUFDdEJXLFFBQTBCLEVBQzFCQyxhQUFzQixFQUN0QkMsTUFBZSxFQUNlO0lBQzlCLElBQUlDLGdCQUE2QztJQUNqRCxJQUFJLENBQUNGLGFBQWEsSUFBSXJELEtBQUssQ0FBQ2EsWUFBWSxDQUFDNEIsY0FBYyxDQUFDLEVBQUU7TUFDekQsTUFBTVIsZUFBZSxHQUFHakMsS0FBSyxDQUFDd0QsWUFBWSxDQUFDZixjQUFjLENBQVc7TUFDcEVjLGdCQUFnQixHQUFHRSxhQUFhLENBQUNDLGFBQWEsQ0FBQ3pCLGVBQWUsQ0FBQztNQUMvRCxJQUFJLENBQUNzQixnQkFBZ0IsRUFBRTtRQUN0QkEsZ0JBQWdCLEdBQUdmLDZCQUE2QixDQUFDUixTQUFTLEVBQUVTLGNBQWMsRUFBRVIsZUFBZSxDQUFDO01BQzdGO0lBQ0QsQ0FBQyxNQUFNLElBQUlELFNBQVMsQ0FBQ2lCLGVBQWUsQ0FBQzNELGNBQWMsQ0FBQ21ELGNBQWMsQ0FBQyxFQUFFO01BQ3BFYyxnQkFBZ0IsR0FBRztRQUNsQmpCLEtBQUssRUFBRUcsY0FBYztRQUNyQkYsSUFBSSxFQUFFO01BQ1AsQ0FBQztJQUNGLENBQUMsTUFBTSxJQUFJZSxNQUFNLEVBQUU7TUFDbEIsSUFBSTtRQUNILElBQUlGLFFBQVEsQ0FBQ08sVUFBVSxDQUFFLEdBQUVsQixjQUFlLEdBQUUsQ0FBQyxFQUFFO1VBQzlDYyxnQkFBZ0IsR0FBRztZQUNsQmpCLEtBQUssRUFBRUcsY0FBYztZQUNyQkYsSUFBSSxFQUFFO1VBQ1AsQ0FBQztRQUNGO01BQ0QsQ0FBQyxDQUFDLE9BQU9xQixDQUFDLEVBQUU7UUFDWCxPQUFPcEUsU0FBUztNQUNqQjtJQUNEO0lBQ0EsT0FBTytELGdCQUFnQjtFQUN4Qjs7RUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDQSxlQUFlTSxpQkFBaUIsQ0FDL0I5RCxTQUEyQyxFQUMzQ0MsS0FBYyxFQUNkdUIsUUFBaUIsRUFDakI2QixRQUEwQixFQUNhO0lBQ3ZDLE1BQU1VLG9CQUFvQixHQUFHL0QsU0FBUyxDQUFDTyxVQUFVOztJQUVqRDtJQUNBLE1BQU15RCx5QkFBeUIsR0FBRzVELE1BQU0sQ0FBQ0MsSUFBSSxDQUFDMEQsb0JBQW9CLENBQUM7SUFFbkUsTUFBTUUsY0FBMkMsR0FBRyxDQUFDLENBQUM7SUFDdEQsS0FBSyxNQUFNQyxTQUFTLElBQUlGLHlCQUF5QixFQUFFO01BQ2xELElBQUlELG9CQUFvQixDQUFDRyxTQUFTLENBQUMsQ0FBQzNDLElBQUksS0FBSyxRQUFRLEVBQUU7UUFDdEQwQyxjQUFjLENBQUNDLFNBQVMsQ0FBQyxHQUN4Qkgsb0JBQW9CLENBQUNHLFNBQVMsQ0FBQyxDQUFDQyxZQUFZLElBQUlDLFNBQVMsQ0FBQ0wsb0JBQW9CLENBQUNHLFNBQVMsQ0FBQyxDQUFDQyxZQUFZLENBQUMsQ0FBQyxDQUFDO01BQzNHLENBQUMsTUFBTTtRQUNORixjQUFjLENBQUNDLFNBQVMsQ0FBQyxHQUFHSCxvQkFBb0IsQ0FBQ0csU0FBUyxDQUFDLENBQUNDLFlBQXlDO01BQ3RHO01BRUEsSUFBSWxFLEtBQUssQ0FBQ2EsWUFBWSxDQUFDb0QsU0FBUyxDQUFDLElBQUkxQyxRQUFRLElBQUl1QyxvQkFBb0IsQ0FBQ0csU0FBUyxDQUFDLENBQUMxQyxRQUFRLEtBQUssSUFBSSxFQUFFO1FBQ25HUixHQUFHLENBQUNxRCxLQUFLLENBQUUsWUFBV0gsU0FBVSxxREFBb0QsQ0FBQztNQUN0RixDQUFDLE1BQU0sSUFBSWpFLEtBQUssQ0FBQ2EsWUFBWSxDQUFDb0QsU0FBUyxDQUFDLEVBQUU7UUFDekMsTUFBTWIsUUFBUSxDQUFDaUIsY0FBYyxDQUFDckUsS0FBSyxFQUFFQSxLQUFLLENBQUNzRSxVQUFVLENBQUNDLFlBQVksQ0FBQ04sU0FBUyxDQUFDLENBQVM7UUFDdEYsSUFBSU8sS0FBbUQsR0FBR3hFLEtBQUssQ0FBQ3dELFlBQVksQ0FBQ1MsU0FBUyxDQUFDO1FBQ3ZGLElBQUlPLEtBQUssS0FBS2hGLFNBQVMsSUFBSWdGLEtBQUssS0FBSyxJQUFJLEVBQUU7VUFDMUMsSUFBSSxPQUFPQSxLQUFLLEtBQUssUUFBUSxJQUFJLENBQUNBLEtBQUssQ0FBQzFELFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUN4RCxRQUFRZ0Qsb0JBQW9CLENBQUNHLFNBQVMsQ0FBQyxDQUFDM0MsSUFBSTtjQUMzQyxLQUFLLFNBQVM7Z0JBQ2JrRCxLQUFLLEdBQUdBLEtBQUssS0FBSyxNQUFNO2dCQUN4QjtjQUNELEtBQUssUUFBUTtnQkFDWkEsS0FBSyxHQUFHQyxNQUFNLENBQUNELEtBQUssQ0FBQztnQkFDckI7WUFBTTtVQUVUO1VBQ0FBLEtBQUssR0FBR0EsS0FBSyxLQUFLLElBQUksR0FBR2hGLFNBQVMsR0FBR2dGLEtBQUs7VUFDMUNSLGNBQWMsQ0FBQ0MsU0FBUyxDQUFDLEdBQUdPLEtBQUs7UUFDbEM7TUFDRDtJQUNEO0lBQ0EsT0FBT1IsY0FBYztFQUN0Qjs7RUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDQSxTQUFTVSxlQUFlLENBQ3ZCM0UsU0FBMkMsRUFDM0NpQyxTQUFvQyxFQUNwQ2hDLEtBQWMsRUFDZHVCLFFBQWlCLEVBQ2pCNkIsUUFBMEIsRUFDMUJ0RSxTQUFrQyxFQUNsQ2tGLGNBQTJDLEVBQ2pCO0lBQzFCaEMsU0FBUyxDQUFDSSxrQkFBa0IsR0FBR0osU0FBUyxDQUFDaUIsZUFBZSxDQUFDMEIsV0FBVztJQUNwRSxNQUFNQyxlQUF3QyxHQUFHLENBQUMsQ0FBQztJQUNuRCxNQUFNQyxtQkFBbUIsR0FBRzlFLFNBQVMsQ0FBQ0csZ0JBQWdCO0lBQ3RELE1BQU00RSx1QkFBdUIsR0FBRzNFLE1BQU0sQ0FBQ0MsSUFBSSxDQUFDeUUsbUJBQW1CLENBQUM7SUFDaEU7SUFDQSxNQUFNRSxnQkFBZ0IsR0FBR0QsdUJBQXVCLENBQUNFLE9BQU8sQ0FBQyxhQUFhLENBQUM7SUFDdkUsSUFBSUQsZ0JBQWdCLEtBQUssQ0FBQyxDQUFDLEVBQUU7TUFDNUI7TUFDQSxNQUFNRSxxQkFBcUIsR0FBR0gsdUJBQXVCLENBQUNJLE1BQU0sQ0FBQ0gsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDO01BQ2pGRCx1QkFBdUIsQ0FBQ0ksTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUVELHFCQUFxQixDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQy9EO0lBQ0EsS0FBSyxNQUFNeEMsY0FBYyxJQUFJcUMsdUJBQXVCLEVBQUU7TUFDckQ7TUFDQSxNQUFNSyxhQUFhLEdBQUduQixjQUFjLENBQUN2QixjQUFjLENBQUM7TUFDcEQsSUFBSTBDLGFBQWEsS0FBSzNGLFNBQVMsSUFBSSxPQUFPMkYsYUFBYSxLQUFLLFFBQVEsSUFBSWhGLE1BQU0sQ0FBQ0MsSUFBSSxDQUFDK0UsYUFBYSxDQUFXLENBQUNDLE1BQU0sR0FBRyxDQUFDLEVBQUU7UUFDeEgsT0FBT3JGLFNBQVMsQ0FBQ0csZ0JBQWdCLENBQUN1QyxjQUFjLENBQUM7UUFDakQ7TUFDRDtNQUNBLE1BQU1ZLGFBQWEsR0FBRzlCLFFBQVEsSUFBSXNELG1CQUFtQixDQUFDcEMsY0FBYyxDQUFDLENBQUNsQixRQUFRLEtBQUssS0FBSyxJQUFJdkIsS0FBSyxDQUFDYSxZQUFZLENBQUM0QixjQUFjLENBQUM7TUFDOUgsTUFBTWMsZ0JBQWdCLEdBQUdKLG1CQUFtQixDQUFDbkIsU0FBUyxFQUFFaEMsS0FBSyxFQUFFeUMsY0FBYyxFQUFFVyxRQUFRLEVBQUVDLGFBQWEsRUFBRXRELFNBQVMsQ0FBQ3VELE1BQU0sSUFBSSxLQUFLLENBQUM7TUFDbEksSUFBSUMsZ0JBQWdCLEVBQUU7UUFDckJBLGdCQUFnQixDQUFDOEIsSUFBSSxHQUFHNUMsY0FBYztRQUN0QzZDLGdCQUFnQixDQUFDeEcsU0FBUyxFQUFFc0UsUUFBUSxFQUFFRyxnQkFBZ0IsQ0FBQztRQUN2RCxJQUNDLENBQUNkLGNBQWMsS0FBSyxXQUFXLElBQUlBLGNBQWMsS0FBSyxhQUFhLEtBQ25FLENBQUNULFNBQVMsQ0FBQ2lCLGVBQWUsQ0FBQzNELGNBQWMsQ0FBQ21ELGNBQWMsQ0FBQyxFQUN4RDtVQUNEVCxTQUFTLENBQUNpQixlQUFlLENBQUNSLGNBQWMsQ0FBQyxHQUFHM0QsU0FBUyxDQUFDMkQsY0FBYyxDQUFDO1FBQ3RFO1FBQ0EsSUFBSUEsY0FBYyxLQUFLLGFBQWEsRUFBRTtVQUNyQ1QsU0FBUyxDQUFDSSxrQkFBa0IsR0FBR3RELFNBQVMsQ0FBQzJELGNBQWMsQ0FBQztRQUN6RDtRQUNBLElBQUkzRCxTQUFTLENBQUMyRCxjQUFjLENBQUMsS0FBS2pELFNBQVMsRUFBRTtVQUM1Q3dFLGNBQWMsQ0FBQ3ZCLGNBQWMsQ0FBQyxHQUFHM0QsU0FBUyxDQUFDMkQsY0FBYyxDQUFDO1FBQzNELENBQUMsTUFBTSxJQUFJLE9BQU91QixjQUFjLENBQUN2QixjQUFjLENBQUMsS0FBSyxRQUFRLEVBQUU7VUFDOUQ7VUFDQSxPQUFPMUMsU0FBUyxDQUFDRyxnQkFBZ0IsQ0FBQ3VDLGNBQWMsQ0FBQztRQUNsRDtNQUNELENBQUMsTUFBTTtRQUNObUMsZUFBZSxDQUFDbkMsY0FBYyxDQUFDLEdBQUcsSUFBSTtNQUN2QztJQUNEO0lBQ0EsT0FBT21DLGVBQWU7RUFDdkI7RUFPQSxTQUFTVyxnQkFBZ0IsQ0FBQ0MsWUFBc0IsRUFBRUMsbUJBQThCLEVBQTRDO0lBQzNILE1BQU1DLFdBQXFELEdBQUcsQ0FBQyxDQUFDO0lBQ2hFLElBQUlGLFlBQVksSUFBSUEsWUFBWSxDQUFDRyxRQUFRLENBQUNQLE1BQU0sR0FBRyxDQUFDLEVBQUU7TUFDckQsTUFBTU8sUUFBUSxHQUFHSCxZQUFZLENBQUNHLFFBQVE7TUFDdEMsS0FBSyxJQUFJQyxRQUFRLEdBQUcsQ0FBQyxFQUFFQSxRQUFRLEdBQUdELFFBQVEsQ0FBQ1AsTUFBTSxFQUFFUSxRQUFRLEVBQUUsRUFBRTtRQUM5RCxNQUFNQyxlQUFlLEdBQUdGLFFBQVEsQ0FBQ0MsUUFBUSxDQUFDO1FBQzFDLElBQUlFLFFBQVEsR0FBR0QsZUFBZSxDQUFDckMsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJcUMsZUFBZSxDQUFDckMsWUFBWSxDQUFDLElBQUksQ0FBQztRQUN4RixJQUFJc0MsUUFBUSxFQUFFO1VBQ2JBLFFBQVEsR0FBSSxhQUFZQSxRQUFTLEVBQUM7VUFDbENELGVBQWUsQ0FBQ0UsWUFBWSxDQUFDLEtBQUssRUFBRUQsUUFBUSxDQUFDO1VBQzdDLElBQUlFLGlCQUEyQyxHQUFHO1lBQ2pEQyxHQUFHLEVBQUVILFFBQVE7WUFDYkksUUFBUSxFQUFFO2NBQ1RDLFNBQVMsRUFBR04sZUFBZSxDQUFDckMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxJQUFrQjRDLFNBQVMsQ0FBQ0MsS0FBSztjQUN0RkMsTUFBTSxFQUFFVCxlQUFlLENBQUNyQyxZQUFZLENBQUMsUUFBUSxDQUFDLElBQUloRTtZQUNuRCxDQUFDO1lBQ0Q4QixJQUFJLEVBQUU7VUFDUCxDQUFDO1VBQ0QsSUFBSW1FLG1CQUFtQixFQUFFO1lBQ3hCTyxpQkFBaUIsR0FBR1AsbUJBQW1CLENBQUNJLGVBQWUsRUFBRUcsaUJBQWlCLENBQUM7VUFDNUU7VUFDQU4sV0FBVyxDQUFDTSxpQkFBaUIsQ0FBQ0MsR0FBRyxDQUFDLEdBQUdELGlCQUFpQjtRQUN2RCxDQUFDLE1BQU0sSUFBSUgsZUFBZSxDQUFDVSxPQUFPLEtBQUssTUFBTSxFQUFFO1VBQzlDeEYsR0FBRyxDQUFDcUQsS0FBSyxDQUFFLG1CQUFrQnlCLGVBQWUsQ0FBQ1csUUFBUyxrREFBaUQsQ0FBQztRQUN6RztNQUNEO0lBQ0Q7SUFDQSxPQUFPZCxXQUFXO0VBQ25COztFQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNBLFNBQVNlLGFBQWEsQ0FBQ0MsT0FBZ0IsRUFBVTtJQUNoRCxNQUFNZixRQUFRLEdBQUdlLE9BQU8sQ0FBQ2YsUUFBUTtJQUNqQyxNQUFNZ0IsT0FBdUIsR0FBRyxFQUFFO0lBQ2xDLE1BQU1DLFFBQWlDLEdBQUcsQ0FBQyxDQUFDO0lBQzVDLEtBQUssTUFBTWxHLGFBQWEsSUFBSWdHLE9BQU8sQ0FBQ2pHLGlCQUFpQixFQUFFLEVBQUU7TUFDeERtRyxRQUFRLENBQUNsRyxhQUFhLENBQUMsR0FBR2dHLE9BQU8sQ0FBQ2xELFlBQVksQ0FBQzlDLGFBQWEsQ0FBQztJQUM5RDtJQUNBLElBQUlpRixRQUFRLENBQUNQLE1BQU0sR0FBRyxDQUFDLEVBQUU7TUFDeEIsTUFBTXlCLGNBQWMsR0FBRzFHLE1BQU0sQ0FBQ0MsSUFBSSxDQUFDdUYsUUFBUSxDQUFDLENBQUNtQixHQUFHLENBQUViLEdBQUcsSUFBS04sUUFBUSxDQUFDTSxHQUFHLENBQXNCLENBQUNjLFNBQVMsQ0FBQztNQUN2RyxNQUFNQyxZQUFZLEdBQUdILGNBQWMsQ0FBQ3pCLE1BQU0sS0FBSyxJQUFJNkIsR0FBRyxDQUFDSixjQUFjLENBQUMsQ0FBQ0ssSUFBSTtNQUMzRSxLQUFLLE1BQU1yQixlQUFlLElBQUlGLFFBQVEsRUFBK0I7UUFDcEUsSUFBSXFCLFlBQVksRUFBRTtVQUNqQkwsT0FBTyxDQUFDUSxJQUFJLENBQUNWLGFBQWEsQ0FBQ1osZUFBZSxDQUFDLENBQUM7UUFDN0MsQ0FBQyxNQUFNO1VBQ05lLFFBQVEsQ0FBQ2YsZUFBZSxDQUFDa0IsU0FBUyxDQUFDLEdBQUdOLGFBQWEsQ0FBQ1osZUFBZSxDQUFDO1FBQ3JFO01BQ0Q7TUFDQSxJQUFJbUIsWUFBWSxFQUFFO1FBQ2pCLE9BQU9MLE9BQU87TUFDZjtJQUNEO0lBQ0EsT0FBT0MsUUFBUTtFQUNoQjs7RUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNBLGVBQWVRLGVBQWUsQ0FDN0JwSCxLQUFjLEVBQ2RvRCxRQUEwQixFQUMxQnJELFNBQTJDLEVBQzNDd0IsUUFBaUIsRUFDakJ5QyxjQUEyQyxFQUNSO0lBQ25DLE1BQU1xRCxhQUFzQyxHQUFHLENBQUMsQ0FBQztJQUNqRCxJQUFJckgsS0FBSyxDQUFDc0gsaUJBQWlCLEtBQUssSUFBSSxFQUFFO01BQ3JDLElBQUlDLGtCQUFrQyxHQUFHdkgsS0FBSyxDQUFDc0gsaUJBQW1DO01BRWxGLE9BQU9DLGtCQUFrQixLQUFLLElBQUksRUFBRTtRQUNuQyxJQUFJQSxrQkFBa0IsQ0FBQ0MsWUFBWSxLQUFLL0ksZ0JBQWdCLEVBQUU7VUFDekQ7VUFDQSxNQUFNZ0osT0FBTyxHQUFHRixrQkFBa0IsQ0FBQ0csVUFBVTtVQUM3QyxJQUFJRCxPQUFPLEVBQUU7WUFDWixNQUFNRSxXQUFXLEdBQUdDLEtBQUssQ0FBQ0MsSUFBSSxDQUFDSixPQUFPLENBQUM5QixRQUFRLENBQUMsQ0FBQ1gsT0FBTyxDQUFDdUMsa0JBQWtCLENBQUM7WUFDNUUsTUFBTW5FLFFBQVEsQ0FBQzBFLFNBQVMsQ0FBQ1Asa0JBQWtCLENBQUM7WUFDNUNBLGtCQUFrQixHQUFHRSxPQUFPLENBQUM5QixRQUFRLENBQUNnQyxXQUFXLENBQUMsR0FBR0YsT0FBTyxDQUFDOUIsUUFBUSxDQUFDZ0MsV0FBVyxDQUFDLEdBQUcsSUFBSTtVQUMxRixDQUFDLE1BQU07WUFDTjtZQUNBSixrQkFBa0IsR0FBR0Esa0JBQWtCLENBQUNRLGtCQUFrQjtVQUMzRDtRQUNELENBQUMsTUFBTTtVQUNOLE1BQU1DLFVBQVUsR0FBR1Qsa0JBQWtCLENBQUNSLFNBQVM7VUFDL0MsSUFBSWtCLGdCQUFnQixHQUFHRCxVQUFVO1VBQ2pDLElBQUlDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDQyxXQUFXLEVBQUUsS0FBS0QsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDOUQ7WUFDQUEsZ0JBQWdCLEdBQUdsSSxTQUFTLENBQUNvSSxrQkFBa0IsSUFBSSxFQUFFO1VBQ3REO1VBQ0EsTUFBTUMscUJBQXFCLEdBQUdySSxTQUFTLENBQUN5QixZQUFZLENBQUN5RyxnQkFBZ0IsQ0FBQztVQUN0RSxJQUFJRyxxQkFBcUIsS0FBSzVJLFNBQVMsSUFBSSxDQUFDNEkscUJBQXFCLENBQUMxRyxJQUFJLEVBQUU7WUFDdkUsTUFBTTJHLGlCQUFpQixHQUFHOUMsZ0JBQWdCLENBQUNnQyxrQkFBa0IsRUFBRWEscUJBQXFCLENBQUMzQyxtQkFBbUIsQ0FBQztZQUN6R3pCLGNBQWMsQ0FBQ2lFLGdCQUFnQixDQUFDLEdBQUdJLGlCQUFpQjtZQUNwRCxLQUFLLE1BQU1DLG9CQUFvQixJQUFJRCxpQkFBaUIsRUFBRTtjQUNyRHRJLFNBQVMsQ0FBQ3lCLFlBQVksQ0FBQzhHLG9CQUFvQixDQUFDLEdBQUdELGlCQUFpQixDQUFDQyxvQkFBb0IsQ0FBQztZQUN2RjtVQUNEO1VBQ0FmLGtCQUFrQixHQUFHQSxrQkFBa0IsQ0FBQ1Esa0JBQWtCO1FBQzNEO01BQ0Q7TUFFQVIsa0JBQWtCLEdBQUd2SCxLQUFLLENBQUNzSCxpQkFBaUI7TUFDNUMsT0FBT0Msa0JBQWtCLEtBQUssSUFBSSxFQUFFO1FBQ25DLE1BQU1nQixVQUEwQixHQUFHaEIsa0JBQWtCLENBQUNRLGtCQUFrQjtRQUN4RSxNQUFNQyxVQUFVLEdBQUdULGtCQUFrQixDQUFDUixTQUFTO1FBQy9DLElBQUlrQixnQkFBZ0IsR0FBR0QsVUFBVTtRQUNqQyxJQUFJQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQ0MsV0FBVyxFQUFFLEtBQUtELGdCQUFnQixDQUFDLENBQUMsQ0FBQyxFQUFFO1VBQzlEO1VBQ0FBLGdCQUFnQixHQUFHbEksU0FBUyxDQUFDb0ksa0JBQWtCLElBQUksRUFBRTtRQUN0RDtRQUNBLElBQ0NoSSxNQUFNLENBQUNDLElBQUksQ0FBQ0wsU0FBUyxDQUFDeUIsWUFBWSxDQUFDLENBQUM5QixRQUFRLENBQUN1SSxnQkFBZ0IsQ0FBQyxLQUM3RCxDQUFDMUcsUUFBUSxJQUFJeEIsU0FBUyxDQUFDeUIsWUFBWSxDQUFDeUcsZ0JBQWdCLENBQUMsQ0FBQzFHLFFBQVEsS0FBSyxJQUFJLENBQUMsRUFDeEU7VUFDRCxNQUFNNkcscUJBQXFCLEdBQUdySSxTQUFTLENBQUN5QixZQUFZLENBQUN5RyxnQkFBZ0IsQ0FBQztVQUN0RSxJQUFJLENBQUNHLHFCQUFxQixDQUFDMUcsSUFBSSxJQUFJNkYsa0JBQWtCLEtBQUssSUFBSSxJQUFJQSxrQkFBa0IsQ0FBQzVCLFFBQVEsQ0FBQ1AsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUN6RyxNQUFNaEMsUUFBUSxDQUFDMEUsU0FBUyxDQUFDUCxrQkFBa0IsQ0FBQztZQUM1QyxJQUFJMUIsZUFBZSxHQUFHMEIsa0JBQWtCLENBQUNELGlCQUFpQjtZQUMxRCxPQUFPekIsZUFBZSxFQUFFO2NBQ3ZCLE1BQU0yQyxTQUFTLEdBQUczQyxlQUFlLENBQUNrQyxrQkFBa0I7Y0FDcEQsSUFBSSxDQUFDSyxxQkFBcUIsQ0FBQ0ssY0FBYyxFQUFFO2dCQUMxQyxNQUFNQyxZQUFZLEdBQUdDLFFBQVEsQ0FBQ0MsZUFBZSxDQUFDNUksS0FBSyxDQUFDd0gsWUFBWSxFQUFFM0IsZUFBZSxDQUFDckMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFFO2dCQUN2R2tGLFlBQVksQ0FBQ0csV0FBVyxDQUFDaEQsZUFBZSxDQUFDO2dCQUN6Q3dCLGFBQWEsQ0FBQ3hCLGVBQWUsQ0FBQ3JDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBRSxHQUFHa0YsWUFBWTtjQUNuRSxDQUFDLE1BQU07Z0JBQ05yQixhQUFhLENBQUN4QixlQUFlLENBQUNyQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUUsR0FBR3FDLGVBQWU7Y0FDdEU7Y0FFQUEsZUFBZSxDQUFDaUQsZUFBZSxDQUFDLEtBQUssQ0FBQztjQUN0Q2pELGVBQWUsR0FBRzJDLFNBQVM7WUFDNUI7VUFDRCxDQUFDLE1BQU0sSUFBSUoscUJBQXFCLENBQUMxRyxJQUFJLEVBQUU7WUFDdEMsTUFBTTBCLFFBQVEsQ0FBQzBFLFNBQVMsQ0FBQ1Asa0JBQWtCLENBQUM7WUFDNUMsSUFBSVUsZ0JBQWdCLEtBQUtELFVBQVUsRUFBRTtjQUNwQyxJQUFJLENBQUNYLGFBQWEsQ0FBQ1ksZ0JBQWdCLENBQUMsRUFBRTtnQkFDckMsTUFBTWMsU0FBUyxHQUFHSixRQUFRLENBQUNDLGVBQWUsQ0FBQzVJLEtBQUssQ0FBQ3dILFlBQVksRUFBRVMsZ0JBQWdCLENBQUM7Z0JBQ2hGWixhQUFhLENBQUNZLGdCQUFnQixDQUFDLEdBQUdjLFNBQVM7Y0FDNUM7Y0FDQTFCLGFBQWEsQ0FBQ1ksZ0JBQWdCLENBQUMsQ0FBQ1ksV0FBVyxDQUFDdEIsa0JBQWtCLENBQUN5QixTQUFTLENBQUMsSUFBSSxDQUFDLENBQVk7WUFDM0YsQ0FBQyxNQUFNO2NBQ04zQixhQUFhLENBQUNZLGdCQUFnQixDQUFDLEdBQUdWLGtCQUFrQixDQUFDeUIsU0FBUyxDQUFDLElBQUksQ0FBWTtZQUNoRjtVQUNEO1FBQ0QsQ0FBQyxNQUFNLElBQUk3SSxNQUFNLENBQUNDLElBQUksQ0FBQ0wsU0FBUyxDQUFDTyxVQUFVLENBQUMsQ0FBQ1osUUFBUSxDQUFDdUksZ0JBQWdCLENBQUMsRUFBRTtVQUN4RSxNQUFNN0UsUUFBUSxDQUFDMEUsU0FBUyxDQUFDUCxrQkFBa0IsQ0FBQztVQUM1QyxJQUFJeEgsU0FBUyxDQUFDTyxVQUFVLENBQUMySCxnQkFBZ0IsQ0FBQyxDQUFDM0csSUFBSSxLQUFLLFFBQVEsRUFBRTtZQUM3RCxNQUFNMkgseUJBQXlCLEdBQUd4QyxhQUFhLENBQUNjLGtCQUFrQixDQUFDO1lBQ25FdkQsY0FBYyxDQUFDaUUsZ0JBQWdCLENBQUMsR0FBR2dCLHlCQUF5QjtVQUM3RCxDQUFDLE1BQU0sSUFBSWxKLFNBQVMsQ0FBQ08sVUFBVSxDQUFDMkgsZ0JBQWdCLENBQUMsQ0FBQzNHLElBQUksS0FBSyxPQUFPLEVBQUU7WUFDbkUsSUFBSWlHLGtCQUFrQixLQUFLLElBQUksSUFBSUEsa0JBQWtCLENBQUM1QixRQUFRLENBQUNQLE1BQU0sR0FBRyxDQUFDLEVBQUU7Y0FDMUUsTUFBTU8sUUFBUSxHQUFHNEIsa0JBQWtCLENBQUM1QixRQUFRO2NBQzVDLE1BQU1ELFdBQTJDLEdBQUcsRUFBRTtjQUN0RCxLQUFLLElBQUlFLFFBQVEsR0FBRyxDQUFDLEVBQUVBLFFBQVEsR0FBR0QsUUFBUSxDQUFDUCxNQUFNLEVBQUVRLFFBQVEsRUFBRSxFQUFFO2dCQUM5RCxNQUFNQyxlQUFlLEdBQUdGLFFBQVEsQ0FBQ0MsUUFBUSxDQUFDO2dCQUMxQztnQkFDQSxNQUFNc0QsT0FBcUMsR0FBRyxDQUFDLENBQUM7Z0JBQ2hELE1BQU0xSSxjQUFjLEdBQUdxRixlQUFlLENBQUNwRixpQkFBaUIsRUFBRTtnQkFDMUQsS0FBSyxNQUFNQyxhQUFhLElBQUlGLGNBQWMsRUFBRTtrQkFDM0MwSSxPQUFPLENBQUN4SSxhQUFhLENBQUMsR0FBR21GLGVBQWUsQ0FBQ3JDLFlBQVksQ0FBQzlDLGFBQWEsQ0FBQztnQkFDckU7Z0JBQ0FnRixXQUFXLENBQUN5QixJQUFJLENBQUMrQixPQUFPLENBQUM7Y0FDMUI7Y0FDQWxGLGNBQWMsQ0FBQ2lFLGdCQUFnQixDQUFDLEdBQUd2QyxXQUFXO1lBQy9DO1VBQ0Q7UUFDRDtRQUVBNkIsa0JBQWtCLEdBQUdnQixVQUFVO01BQ2hDO0lBQ0Q7SUFDQSxPQUFPbEIsYUFBYTtFQUNyQjtFQUVBLFNBQVM4QixZQUFZLENBQ3BCOUIsYUFBc0MsRUFDdEMrQixxQkFBeUUsRUFDekVwSixLQUFjLEVBRVA7SUFBQSxJQURQcUosaUJBQWlCLHVFQUFHLEtBQUs7SUFFekIsSUFBSWxKLE1BQU0sQ0FBQ0MsSUFBSSxDQUFDaUgsYUFBYSxDQUFDLENBQUNqQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO01BQzFDakYsTUFBTSxDQUFDQyxJQUFJLENBQUNpSCxhQUFhLENBQUMsQ0FBQzFHLE9BQU8sQ0FBQyxVQUFVc0gsZ0JBQXdCLEVBQUU7UUFDdEUsTUFBTXFCLG1CQUFtQixHQUFHakMsYUFBYSxDQUFDWSxnQkFBZ0IsQ0FBQztRQUMzRCxJQUFJakksS0FBSyxLQUFLLElBQUksSUFBSUEsS0FBSyxLQUFLUixTQUFTLElBQUk4SixtQkFBbUIsRUFBRTtVQUNqRTtVQUNBLE1BQU1DLGFBQWEsR0FBR0QsbUJBQW1CLENBQUNoQyxpQkFBaUI7VUFDM0QsSUFBSSxDQUFDLENBQUMsWUFBWSxFQUFFLFlBQVksRUFBRSxZQUFZLENBQUMsQ0FBQzVILFFBQVEsQ0FBQ3VJLGdCQUFnQixDQUFDLEVBQUU7WUFDM0UsTUFBTXVCLFNBQVMsR0FDYkoscUJBQXFCLENBQUNuQixnQkFBZ0IsQ0FBQyxLQUFLekksU0FBUyxJQUFJNEoscUJBQXFCLENBQUNuQixnQkFBZ0IsQ0FBQyxDQUFDdkcsSUFBSSxJQUN0R3VHLGdCQUFnQjtZQUNqQixNQUFNd0IsY0FBYyxHQUFHekosS0FBSyxDQUFDMEosYUFBYSxDQUFFLGNBQWFGLFNBQVUsSUFBRyxDQUFDO1lBQ3ZFLElBQUlDLGNBQWMsS0FBSyxJQUFJLEVBQUU7Y0FDNUIsTUFBTVYsU0FBUyxHQUFHWSx5QkFBeUIsQ0FBQzNKLEtBQUssRUFBRWlJLGdCQUFnQixFQUFFc0IsYUFBYSxDQUFDO2NBQ25GRSxjQUFjLENBQUNHLFdBQVcsQ0FBQyxHQUFJYixTQUFTLENBQUNwRCxRQUE4QixDQUFDLENBQUMsQ0FBQztZQUMzRTtVQUNELENBQUMsTUFBTSxJQUFJMEQsaUJBQWlCLElBQUlFLGFBQWEsS0FBSyxJQUFJLEVBQUU7WUFDdkQsTUFBTUMsU0FBUyxHQUNiSixxQkFBcUIsQ0FBQ25CLGdCQUFnQixDQUFDLEtBQUt6SSxTQUFTLElBQUk0SixxQkFBcUIsQ0FBQ25CLGdCQUFnQixDQUFDLENBQUN2RyxJQUFJLElBQ3RHdUcsZ0JBQWdCO1lBQ2pCLE1BQU13QixjQUFjLEdBQUd6SixLQUFLLENBQUMwSixhQUFhLENBQUUsY0FBYUYsU0FBVSxJQUFHLENBQUM7WUFDdkUsTUFBTVQsU0FBUyxHQUFHWSx5QkFBeUIsQ0FBQzNKLEtBQUssRUFBRWlJLGdCQUFnQixFQUFFc0IsYUFBYSxDQUFDO1lBQ25GLElBQUlFLGNBQWMsS0FBSyxJQUFJLEVBQUU7Y0FDNUJBLGNBQWMsQ0FBQ0csV0FBVyxDQUFDLEdBQUliLFNBQVMsQ0FBQ3BELFFBQThCLENBQUMsQ0FBQyxDQUFDO1lBQzNFLENBQUMsTUFBTTtjQUNOM0YsS0FBSyxDQUFDNkksV0FBVyxDQUFDRSxTQUFTLENBQUM7WUFDN0I7VUFDRDtRQUNEO01BQ0QsQ0FBQyxDQUFDO0lBQ0g7RUFDRDtFQUVBLFNBQVNZLHlCQUF5QixDQUFDM0osS0FBYyxFQUFFaUksZ0JBQXdCLEVBQUVzQixhQUE2QixFQUFXO0lBQ3BILE1BQU1SLFNBQVMsR0FBR0osUUFBUSxDQUFDQyxlQUFlLENBQUM1SSxLQUFLLENBQUN3SCxZQUFZLEVBQUVTLGdCQUFnQixDQUFDNEIsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNwRyxPQUFPTixhQUFhLEVBQUU7TUFDckIsTUFBTWhCLFVBQVUsR0FBR2dCLGFBQWEsQ0FBQ3hCLGtCQUFrQjtNQUNuRGdCLFNBQVMsQ0FBQ0YsV0FBVyxDQUFDVSxhQUFhLENBQUM7TUFDcENBLGFBQWEsR0FBR2hCLFVBQVU7SUFDM0I7SUFDQSxPQUFPUSxTQUFTO0VBQ2pCO0VBRUEsZUFBZWUsb0JBQW9CLENBQ2xDQyxrQkFBc0QsRUFDdEQvSixLQUFjLEVBQ2RvRCxRQUEwQixFQUVWO0lBQUEsSUFEaEI3QixRQUFRLHVFQUFHLEtBQUs7SUFFaEIsTUFBTXhCLFNBQVMsR0FBR29CLGlCQUFpQixDQUFDNEksa0JBQWtCLENBQUNDLFFBQVEsQ0FBQztJQUVoRSxNQUFNQyxhQUFhLEdBQUdsSyxTQUFTLENBQUNtSyxRQUFRLElBQUssR0FBRW5LLFNBQVMsQ0FBQ29LLFNBQVMsSUFBSXBLLFNBQVMsQ0FBQ3FLLGVBQWdCLElBQUdySyxTQUFTLENBQUNzSyxNQUFNLElBQUl0SyxTQUFTLENBQUNzRixJQUFLLEVBQUM7SUFFdkksTUFBTXZHLFNBQWtDLEdBQUcsQ0FBQyxDQUFDO0lBQzdDLE1BQU1rRCxTQUFTLEdBQUdvQixRQUFRLENBQUNrSCxXQUFXLEVBQUU7O0lBRXhDO0lBQ0F0SSxTQUFTLENBQUNXLE1BQU0sQ0FBQ0MsZ0JBQWdCLEtBQUssSUFBSTJILFNBQVMsRUFBRTs7SUFFckQ7SUFDQSxJQUFJLENBQUN2SSxTQUFTLENBQUNpSSxhQUFhLENBQUMsRUFBRTtNQUM5QmpJLFNBQVMsQ0FBQ2lJLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM5Qjs7SUFFQTtJQUNBLE1BQU1qRyxjQUFjLEdBQUcsTUFBTUgsaUJBQWlCLENBQUM5RCxTQUFTLEVBQUVDLEtBQUssRUFBRXVCLFFBQVEsRUFBRTZCLFFBQVEsQ0FBQztJQUNwRixNQUFNb0gsV0FBVyxHQUFHckssTUFBTSxDQUFDQyxJQUFJLENBQUM0RCxjQUFjLENBQUM7SUFDL0MsTUFBTVksZUFBZSxHQUFHRixlQUFlLENBQUMzRSxTQUFTLEVBQUVpQyxTQUFTLEVBQUVoQyxLQUFLLEVBQUV1QixRQUFRLEVBQUU2QixRQUFRLEVBQUV0RSxTQUFTLEVBQUVrRixjQUFjLENBQUM7SUFFbkgsSUFBSTtNQUNIO01BQ0EsTUFBTXFELGFBQWEsR0FBRyxNQUFNRCxlQUFlLENBQUNwSCxLQUFLLEVBQUVvRCxRQUFRLEVBQUVyRCxTQUFTLEVBQUV3QixRQUFRLEVBQUV5QyxjQUFjLENBQUM7TUFDakcsSUFBSXlHLGNBQWMsR0FBRyxDQUFDLENBQUM7TUFFdkIsSUFBSXpJLFNBQVMsQ0FBQ1csTUFBTSxDQUFDK0gsUUFBUSxFQUFFO1FBQzlCO1FBQ0FELGNBQWMsR0FBR3pJLFNBQVMsQ0FBQ1csTUFBTSxDQUFDK0gsUUFBUSxDQUFDN0gsV0FBVyxDQUFDLHVCQUF1QixDQUFDO01BQ2hGO01BQ0EsSUFBSThILHVCQUF1QixHQUFHM0csY0FBYztNQUU1QzdELE1BQU0sQ0FBQ0MsSUFBSSxDQUFDNEQsY0FBYyxDQUFDLENBQUNyRCxPQUFPLENBQUVpSyxRQUFRLElBQUs7UUFBQTtRQUNqRCxJQUFJQyxLQUFLLEdBQUc3RyxjQUFjLENBQUM0RyxRQUFRLENBQXVCO1FBQzFEO1FBQ0EsTUFBTUUsa0JBQWtCLEdBQUdmLGtCQUFrQixhQUFsQkEsa0JBQWtCLGdEQUFsQkEsa0JBQWtCLENBQUVDLFFBQVEsMERBQTVCLHNCQUE4QjFKLFVBQVUsQ0FBQ3NLLFFBQVEsQ0FBQztRQUM3RSxJQUFJRSxrQkFBa0IsYUFBbEJBLGtCQUFrQixlQUFsQkEsa0JBQWtCLENBQUVDLFFBQVEsRUFBRTtVQUNqQ0YsS0FBSyxHQUFHQyxrQkFBa0IsQ0FBQ0MsUUFBUSxDQUFDRixLQUFLLENBQUMsSUFBSUEsS0FBSztRQUNwRDtRQUNBLElBQUksVUFBQUEsS0FBSyxpREFBTCxPQUFPRyxHQUFHLHVDQUFWLHdCQUFhOUosb0JBQW9CLENBQUMsSUFBSSxDQUFDMkosS0FBSyxDQUFDSSxRQUFRLEVBQUUsQ0FBQ0QsR0FBRyxDQUFDLHNDQUFzQyxDQUFDLEVBQUU7VUFDeEdoSCxjQUFjLENBQUM0RyxRQUFRLENBQUMsR0FBR0MsS0FBSyxDQUFDMUwsU0FBUyxFQUFFO1FBQzdDO01BQ0QsQ0FBQyxDQUFDO01BQ0Y2RSxjQUFjLENBQUN6QyxRQUFRLEdBQUdBLFFBQVE7TUFFbEMsTUFBTTJKLFNBQVMsR0FBRyxJQUFJbkIsa0JBQWtCLENBQUM7UUFBRSxHQUFHL0YsY0FBYztRQUFFLEdBQUdxRDtNQUFjLENBQUMsRUFBRW9ELGNBQWMsRUFBRXpJLFNBQVMsQ0FBQztNQUM1RzJJLHVCQUF1QixHQUFHTyxTQUFTLENBQUNDLGFBQWEsRUFBRTtNQUNuRGhMLE1BQU0sQ0FBQ0MsSUFBSSxDQUFDTCxTQUFTLENBQUNHLGdCQUFnQixDQUFDLENBQUNTLE9BQU8sQ0FBQyxVQUFVeUssWUFBb0IsRUFBRTtRQUMvRSxJQUFJVCx1QkFBdUIsQ0FBQ3JMLGNBQWMsQ0FBQzhMLFlBQVksQ0FBQyxFQUFFO1VBQ3pELE1BQU1DLFlBQVksR0FBR1YsdUJBQXVCLENBQUNTLFlBQVksQ0FBQztVQUMxRCxJQUFJRSxTQUFTLENBQUNELFlBQVksQ0FBQyxFQUFFO1lBQzVCdk0sU0FBUyxDQUFDc00sWUFBWSxDQUFDLEdBQUdDLFlBQXVCO1VBQ2xELENBQUMsTUFBTSxJQUFJLE9BQU9BLFlBQVksS0FBSyxRQUFRLEVBQUU7WUFDNUMsTUFBTUUsY0FBYyxHQUFHQyxnQkFBZ0IsQ0FBQ0gsWUFBWSxDQUFDO1lBQ3JEckosU0FBUyxDQUFDVyxNQUFNLENBQUNDLGdCQUFnQixDQUFDSSxXQUFXLENBQUN1SSxjQUFjLEVBQUVGLFlBQVksQ0FBQztZQUMzRSxNQUFNSSxVQUFVLEdBQUd6SixTQUFTLENBQUNXLE1BQU0sQ0FBQ0MsZ0JBQWdCLENBQUM4SSxvQkFBb0IsQ0FBQ0gsY0FBYyxDQUFFO1lBQzFGeEksa0JBQWtCLENBQUN3SSxjQUFjLENBQUM7WUFDbEN6TSxTQUFTLENBQUNzTSxZQUFZLENBQUMsR0FBR0ssVUFBVTtVQUNyQztRQUNEO01BQ0QsQ0FBQyxDQUFDO01BRUYsTUFBTUUsZ0JBQTJCLEdBQUcsSUFBSUMsY0FBYyxDQUFDNUwsS0FBSyxFQUFFMkssdUJBQXVCLEVBQUVaLGtCQUFrQixDQUFDO01BQzFHakwsU0FBUyxDQUFDLE1BQU0sQ0FBQyxHQUFHNk0sZ0JBQWdCLENBQUNELG9CQUFvQixDQUFDLEdBQUcsQ0FBQztNQUM5RCxJQUFJRyxrQkFBeUM7TUFDN0M7TUFDQSxNQUFNQyxXQUFXLEdBQUcsQ0FBQTlMLEtBQUssYUFBTEEsS0FBSyx1QkFBTEEsS0FBSyxDQUFFd0QsWUFBWSxDQUFDLGNBQWMsQ0FBQyxLQUFJaEUsU0FBUzs7TUFFcEU7TUFDQSxJQUFJdU0sU0FBUyxDQUFDQyxpQkFBaUIsRUFBRSxFQUFFO1FBQ2xDLE1BQU1DLFVBQVUsR0FBR0YsU0FBUyxDQUFDRyxlQUFlLENBQUNqQyxhQUFhLEVBQUVsSyxTQUFTLEVBQUVqQixTQUFTLEVBQUVrQixLQUFLLEVBQUVvRCxRQUFRLENBQUM7UUFDbEcsSUFBSTZJLFVBQVUsYUFBVkEsVUFBVSxlQUFWQSxVQUFVLENBQUVFLFNBQVMsRUFBRTtVQUMxQk4sa0JBQWtCLEdBQUc3SixTQUFTLENBQUMsWUFBWSxDQUFDO1VBQzVDQSxTQUFTLENBQUMsWUFBWSxDQUFDLEdBQUdpSyxVQUFVLENBQUNFLFNBQVM7UUFDL0M7TUFDRDtNQUNBck0sc0JBQXNCLENBQUNtSyxhQUFhLEVBQUVsSyxTQUFTLEVBQUVqQixTQUFTLEVBQUVrQixLQUFLLENBQUM7TUFFbEUsTUFBTW9NLGVBQWUsR0FBR2hKLFFBQVEsQ0FBQ2lKLElBQUksQ0FBQ3ZOLFNBQVMsRUFBRWlCLFNBQVMsQ0FBQ3VELE1BQU0sS0FBSzlELFNBQVMsR0FBRyxDQUFDTyxTQUFTLENBQUN1RCxNQUFNLEdBQUcsSUFBSSxDQUFDO01BQzNHLE1BQU1tRSxPQUFPLEdBQUd6SCxLQUFLLENBQUMwSCxVQUFVO01BRWhDLElBQUlDLFdBQW1CO01BQ3ZCLElBQUkyRSxRQUFRO01BQ1osSUFBSTdFLE9BQU8sRUFBRTtRQUNaRSxXQUFXLEdBQUdDLEtBQUssQ0FBQ0MsSUFBSSxDQUFDSixPQUFPLENBQUM5QixRQUFRLENBQUMsQ0FBQ1gsT0FBTyxDQUFDaEYsS0FBSyxDQUFDO1FBRXpELElBQUlELFNBQVMsQ0FBQ21LLFFBQVEsRUFBRTtVQUN2Qm9DLFFBQVEsR0FBR0YsZUFBZSxDQUFDRyxjQUFjLENBQUN0QyxhQUFhLEVBQUVqSyxLQUFLLENBQUM7UUFDaEUsQ0FBQyxNQUFNO1VBQ04sTUFBTXdNLE9BQU8sR0FBR3JNLE1BQU0sQ0FBQ0MsSUFBSSxDQUFDcU0sb0JBQW9CLENBQUM7VUFDakQsSUFBSUMsY0FBYztVQUNsQixJQUFLeEIsU0FBUyxDQUEwQnlCLCtCQUErQixFQUFFO1lBQ3hFRCxjQUFjLEdBQUcsTUFBTUUsR0FBRyxDQUFDQyxXQUFXLENBQUMsWUFDckMzQixTQUFTLENBQTBCeUIsK0JBQStCLENBQUMzTSxLQUFLLENBQUMsQ0FDMUU7VUFDRixDQUFDLE1BQU07WUFDTjBNLGNBQWMsR0FBRyxNQUFNRSxHQUFHLENBQUNDLFdBQVcsQ0FBQyxZQUFZM0IsU0FBUyxDQUFDNEIsV0FBVyxDQUFFOU0sS0FBSyxDQUFDLENBQUM7VUFDbEY7VUFFQSxJQUFJK0osa0JBQWtCLENBQUNnRCxTQUFTLEVBQUU7WUFDakM7WUFDQSxLQUFLLE1BQU1DLFFBQVEsSUFBSVAsb0JBQW9CLEVBQUU7Y0FDNUMsSUFBSSxDQUFDRCxPQUFPLENBQUM5TSxRQUFRLENBQUNzTixRQUFRLENBQUMsRUFBRTtnQkFDaEMsTUFBTWxLLElBQUksR0FBR0Msa0JBQWtCLENBQUNpSyxRQUFRLENBQUM7Z0JBQ3pDaEwsU0FBUyxDQUFDVyxNQUFNLENBQUNDLGdCQUFnQixDQUFDSSxXQUFXLENBQUNnSyxRQUFRLEVBQUVsSyxJQUFJLENBQUM7Y0FDOUQ7WUFDRDtVQUNEO1VBRUEsSUFBSW1LLFFBQVEsR0FBRyxFQUFFO1VBQ2pCLElBQUlQLGNBQWMsRUFBRTtZQUNuQixJQUFJUSxhQUFhLEdBQUcsS0FBSztZQUN6QixJQUFJQyxjQUFjLEdBQUdDLGNBQWMsQ0FBQ1YsY0FBYyxFQUFFLElBQUksQ0FBQztZQUN6RDtZQUNBLEtBQUssTUFBTWhHLE9BQU8sSUFBSXlHLGNBQWMsRUFBRTtjQUNyQyxNQUFNRSxJQUFJLEdBQUcxRSxRQUFRLENBQUMyRSxrQkFBa0IsQ0FBQzVHLE9BQU8sRUFBRTZHLFVBQVUsQ0FBQ0MsU0FBUyxDQUFDO2NBQ3ZFLElBQUlDLFFBQVEsR0FBR0osSUFBSSxDQUFDSyxRQUFRLEVBQUU7Y0FDOUIsSUFBSWhILE9BQU8sQ0FBQ0ssU0FBUyxLQUFLLGFBQWEsRUFBRTtnQkFDeENtRyxhQUFhLEdBQUcsSUFBSTtjQUNyQjtjQUNBLE9BQU9PLFFBQVEsRUFBRTtnQkFDaEIsSUFBSUEsUUFBUSxDQUFDRSxXQUFXLElBQUlGLFFBQVEsQ0FBQ0UsV0FBVyxDQUFDQyxJQUFJLEVBQUUsQ0FBQ3hJLE1BQU0sR0FBRyxDQUFDLEVBQUU7a0JBQ25FNkgsUUFBUSxHQUFHUSxRQUFRLENBQUNFLFdBQVc7Z0JBQ2hDO2dCQUNBRixRQUFRLEdBQUdKLElBQUksQ0FBQ0ssUUFBUSxFQUFFO2NBQzNCO1lBQ0Q7WUFFQSxJQUFJUixhQUFhLEVBQUU7Y0FDbEI7Y0FDQTtjQUNBO2NBQ0FuTSxHQUFHLENBQUNxRCxLQUFLLENBQUUseUNBQXdDckUsU0FBUyxDQUFDc0ssTUFBTSxJQUFJdEssU0FBUyxDQUFDc0YsSUFBSyxFQUFDLEVBQUU0SCxRQUFRLENBQUM7Y0FDbEdFLGNBQWMsR0FBSSxNQUFNVSxpQkFBaUIsQ0FBQyxZQUFZO2dCQUNyRCxJQUFJQyxlQUFlO2dCQUNuQixJQUFLNUMsU0FBUyxDQUEwQnlCLCtCQUErQixFQUFFO2tCQUN4RW1CLGVBQWUsR0FBRyxNQUFNbEIsR0FBRyxDQUFDQyxXQUFXLENBQUMsWUFDdEMzQixTQUFTLENBQTBCeUIsK0JBQStCLENBQUMzTSxLQUFLLENBQUMsQ0FDMUU7Z0JBQ0YsQ0FBQyxNQUFNO2tCQUNOOE4sZUFBZSxHQUFHLE1BQU1sQixHQUFHLENBQUNDLFdBQVcsQ0FBQyxZQUFZM0IsU0FBUyxDQUFDNEIsV0FBVyxDQUFFOU0sS0FBSyxDQUFDLENBQUM7Z0JBQ25GO2dCQUNBLE9BQU9vTixjQUFjLENBQUNVLGVBQWUsSUFBSSxFQUFFLEVBQUUsSUFBSSxDQUFDO2NBQ25ELENBQUMsQ0FBZTtZQUNqQixDQUFDLE1BQU0sSUFBSWIsUUFBUSxDQUFDN0gsTUFBTSxHQUFHLENBQUMsRUFBRTtjQUMvQjtjQUNBckUsR0FBRyxDQUFDcUQsS0FBSyxDQUFFLHlDQUF3Q3JFLFNBQVMsQ0FBQ3NLLE1BQU0sSUFBSXRLLFNBQVMsQ0FBQ3NGLElBQUssRUFBQyxDQUFDO2NBQ3hGLE1BQU0wSSxVQUFVLEdBQUdDLGNBQWMsQ0FDaEMsQ0FDRSx5Q0FBd0NqTyxTQUFTLENBQUNzSyxNQUFNLElBQUl0SyxTQUFTLENBQUNzRixJQUFLLEVBQUMsRUFDNUUsdUNBQXNDNEgsUUFBUyxFQUFDLENBQ2pELEVBQ0RFLGNBQWMsQ0FBQ3JHLEdBQUcsQ0FBRW1ILFFBQVEsSUFBS0EsUUFBUSxDQUFDQyxTQUFTLENBQUMsQ0FBQ0MsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUMvRDtjQUNEaEIsY0FBYyxHQUFHQyxjQUFjLENBQUNXLFVBQVUsRUFBRSxJQUFJLENBQUM7WUFDbEQ7WUFDQS9OLEtBQUssQ0FBQzRKLFdBQVcsQ0FBQyxHQUFHdUQsY0FBYyxDQUFDO1lBRXBDLE1BQU1pQixZQUFZLEdBQUdqQixjQUFjLENBQUNyRyxHQUFHLENBQUMsTUFBT3VILFlBQVksSUFBSztjQUMvRGxGLFlBQVksQ0FBQzlCLGFBQWEsRUFBRXRILFNBQVMsQ0FBQ3lCLFlBQVksRUFBRTZNLFlBQVksRUFBRSxLQUFLLENBQUM7Y0FDeEUsT0FBT2pDLGVBQWUsQ0FBQ3RFLFNBQVMsQ0FBQ3VHLFlBQVksQ0FBQztZQUMvQyxDQUFDLENBQUM7WUFDRi9CLFFBQVEsR0FBR2dDLE9BQU8sQ0FBQ0MsR0FBRyxDQUFDSCxZQUFZLENBQUM7VUFDckMsQ0FBQyxNQUFNO1lBQ05wTyxLQUFLLENBQUN3TyxNQUFNLEVBQUU7WUFDZGxDLFFBQVEsR0FBR2dDLE9BQU8sQ0FBQ0csT0FBTyxFQUFFO1VBQzdCO1FBQ0Q7UUFFQSxNQUFNbkMsUUFBUTtRQUNkLE1BQU1vQyxhQUFhLEdBQUdqSCxPQUFPLENBQUM5QixRQUFRLENBQUNnQyxXQUFXLENBQUM7UUFDbkR3QixZQUFZLENBQUM5QixhQUFhLEVBQUV0SCxTQUFTLENBQUN5QixZQUFZLEVBQUVrTixhQUFhLEVBQUUsSUFBSSxDQUFDO1FBQ3hFLElBQUlBLGFBQWEsS0FBS2xQLFNBQVMsRUFBRTtVQUNoQyxNQUFNbVAsZUFBZSxHQUFHRCxhQUFhLENBQUNFLGdCQUFnQixDQUFDLE1BQU0sQ0FBQztVQUM5REQsZUFBZSxDQUFDaE8sT0FBTyxDQUFDLFVBQVVrTyxZQUFZLEVBQUU7WUFDL0NBLFlBQVksQ0FBQ0wsTUFBTSxFQUFFO1VBQ3RCLENBQUMsQ0FBQztVQUNGLElBQUkxQyxXQUFXLEVBQUU7WUFDaEIsSUFBSWdELGNBQWMsR0FBR0osYUFBYSxDQUFDSyxjQUFjLENBQUMsYUFBYSxFQUFFLFNBQVMsQ0FBQztZQUMzRSxJQUFJRCxjQUFjLEVBQUU7Y0FDbkJBLGNBQWMsR0FBR0EsY0FBYyxDQUFDRSxTQUFTLENBQUMsQ0FBQyxFQUFFRixjQUFjLENBQUMxSixNQUFNLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHMEcsV0FBVyxDQUFDa0QsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDM0csQ0FBQyxNQUFNO2NBQ05GLGNBQWMsR0FBR2hELFdBQVc7WUFDN0I7WUFDQTRDLGFBQWEsQ0FBQ08sY0FBYyxDQUFDLGFBQWEsRUFBRSxjQUFjLEVBQUVILGNBQWMsQ0FBQztVQUM1RTtVQUNBLElBQUk5SyxjQUFjLENBQUMzQyxLQUFLLElBQUksQ0FBQzBJLGtCQUFrQixDQUFDZ0QsU0FBUyxFQUFFO1lBQzFEMkIsYUFBYSxDQUFDUSxTQUFTLENBQUNDLEdBQUcsQ0FBQ25MLGNBQWMsQ0FBQzNDLEtBQUssQ0FBVztVQUM1RDtRQUNEO01BQ0Q7TUFDQSxJQUFJd0ssa0JBQWtCLEVBQUU7UUFDdkI7UUFDQTdKLFNBQVMsQ0FBQyxZQUFZLENBQUMsR0FBRzZKLGtCQUFrQjtNQUM3QyxDQUFDLE1BQU07UUFDTixPQUFPN0osU0FBUyxDQUFDLFlBQVksQ0FBQztNQUMvQjtJQUNELENBQUMsQ0FBQyxPQUFPNEIsQ0FBVSxFQUFFO01BQ3BCOztNQUVBLE1BQU13TCxZQUFZLEdBQUc7UUFDcEJDLGlCQUFpQixFQUFFLENBQUMsQ0FBNEI7UUFDaERDLGtCQUFrQixFQUFFLENBQUMsQ0FBNEI7UUFDakRDLGVBQWUsRUFBRTNLO01BQ2xCLENBQUM7TUFDRCxLQUFLLE1BQU0vQyxZQUFZLElBQUkySSxXQUFXLEVBQUU7UUFDdkMsTUFBTXJGLGFBQWEsR0FBR25CLGNBQWMsQ0FBQ25DLFlBQVksQ0FBQztRQUNsRCxJQUFJeUosU0FBUyxDQUFDbkcsYUFBYSxDQUFDLEVBQUU7VUFDN0JpSyxZQUFZLENBQUNDLGlCQUFpQixDQUFDeE4sWUFBWSxDQUFDLEdBQUc7WUFDOUNVLElBQUksRUFBRTRDLGFBQWEsQ0FBQ3hGLE9BQU8sRUFBRTtZQUM3QjZFLEtBQUssRUFBRVcsYUFBYSxDQUFDaEcsU0FBUztVQUMvQixDQUFDO1FBQ0YsQ0FBQyxNQUFNO1VBQ05pUSxZQUFZLENBQUNDLGlCQUFpQixDQUFDeE4sWUFBWSxDQUFDLEdBQUdzRCxhQUFhO1FBQzdEO01BQ0Q7TUFDQSxLQUFLLE1BQU10RCxZQUFZLElBQUltQyxjQUFjLEVBQUU7UUFDMUMsTUFBTW1CLGFBQWEsR0FBR25CLGNBQWMsQ0FBQ25DLFlBQVksQ0FBQztRQUNsRCxJQUFJLENBQUMySSxXQUFXLENBQUM5SyxRQUFRLENBQUNtQyxZQUFZLENBQUMsRUFBRTtVQUN4QyxJQUFJeUosU0FBUyxDQUFDbkcsYUFBYSxDQUFDLEVBQUU7WUFDN0JpSyxZQUFZLENBQUNFLGtCQUFrQixDQUFDek4sWUFBWSxDQUFDLEdBQUc7Y0FDL0NVLElBQUksRUFBRTRDLGFBQWEsQ0FBQ3hGLE9BQU8sRUFBRTtjQUM3QjZFLEtBQUssRUFBRVcsYUFBYSxDQUFDaEcsU0FBUztZQUMvQixDQUFDO1VBQ0YsQ0FBQyxNQUFNO1lBQ05pUSxZQUFZLENBQUNFLGtCQUFrQixDQUFDek4sWUFBWSxDQUFDLEdBQUdzRCxhQUFhO1VBQzlEO1FBQ0Q7TUFDRDtNQUNBcEUsR0FBRyxDQUFDcUQsS0FBSyxDQUFDUixDQUFDLENBQVc7TUFDdEIsTUFBTTRMLE1BQU0sR0FBR3hCLGNBQWMsQ0FDNUIsQ0FBRSx5Q0FBd0NqTyxTQUFTLENBQUNzRixJQUFLLEVBQUMsQ0FBQyxFQUMzRHJGLEtBQUssQ0FBQ2tPLFNBQVMsRUFDZmtCLFlBQVksRUFDWHhMLENBQUMsQ0FBVzZMLEtBQUssQ0FDbEI7TUFDRCxNQUFNQyxTQUFTLEdBQUd0QyxjQUFjLENBQUNvQyxNQUFNLEVBQUUsSUFBSSxDQUFDO01BQzlDeFAsS0FBSyxDQUFDNEosV0FBVyxDQUFDLEdBQUc4RixTQUFTLENBQUM7SUFDaEM7RUFDRDtFQUNBLFNBQVNwSyxnQkFBZ0IsQ0FDeEJ4RyxTQUE4QyxFQUM5Q3NFLFFBQTBCLEVBQzFCdU0sSUFJQyxFQUNNO0lBQ1AsTUFBTTNRLElBQUksR0FBSTJRLElBQUksQ0FBQ3RLLElBQUksSUFBSXNLLElBQUksQ0FBQ3JOLEtBQUssSUFBSTlDLFNBQW9CO0lBQzdELElBQUlWLFNBQVMsQ0FBQ0UsSUFBSSxDQUFDLEVBQUU7TUFDcEIsT0FBTyxDQUFDO0lBQ1Q7O0lBQ0EsSUFBSTtNQUNILElBQUltRCxZQUFZLEdBQUd3TixJQUFJLENBQUNwTixJQUFJO01BQzVCLElBQUlvTixJQUFJLENBQUNyTixLQUFLLEtBQUssSUFBSSxFQUFFO1FBQ3hCSCxZQUFZLEdBQUksR0FBRXdOLElBQUksQ0FBQ3JOLEtBQU0sSUFBR0gsWUFBYSxFQUFDO01BQy9DO01BQ0EsTUFBTXlOLFFBQVEsR0FBR3hNLFFBQVEsQ0FBQ2tILFdBQVcsRUFBRTtNQUN2QyxJQUFJcUYsSUFBSSxDQUFDck4sS0FBSyxLQUFLLGtCQUFrQixJQUFJcU4sSUFBSSxDQUFDcE4sSUFBSSxDQUFDNkMsTUFBTSxHQUFHLENBQUMsRUFBRTtRQUM5RHRHLFNBQVMsQ0FBQ0UsSUFBSSxDQUFDLEdBQUc0USxRQUFRLENBQUNqTixNQUFNLENBQUNnTixJQUFJLENBQUNyTixLQUFLLENBQUMsQ0FBQ3FCLFVBQVUsQ0FBQ2dNLElBQUksQ0FBQ3BOLElBQUksQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDO01BQ2pILENBQUMsTUFBTSxJQUFJLENBQUNxTixRQUFRLENBQUMzTSxlQUFlLENBQUMwTSxJQUFJLENBQUNyTixLQUFLLENBQUUsSUFBSXNOLFFBQVEsQ0FBQ2pOLE1BQU0sQ0FBQ2dOLElBQUksQ0FBQ3JOLEtBQUssQ0FBRSxFQUFFO1FBQ2xGeEQsU0FBUyxDQUFDRSxJQUFJLENBQUMsR0FBRzRRLFFBQVEsQ0FBQ2pOLE1BQU0sQ0FBQ2dOLElBQUksQ0FBQ3JOLEtBQUssQ0FBRSxDQUFDcUIsVUFBVSxDQUFDZ00sSUFBSSxDQUFDcE4sSUFBSSxDQUFDLENBQUMsQ0FBQztNQUN2RSxDQUFDLE1BQU07UUFDTnpELFNBQVMsQ0FBQ0UsSUFBSSxDQUFDLEdBQUdvRSxRQUFRLENBQUNPLFVBQVUsQ0FBQ3hCLFlBQVksQ0FBQyxDQUFDLENBQUM7TUFDdEQ7SUFDRCxDQUFDLENBQUMsT0FBTzBOLEVBQUUsRUFBRTtNQUNaO01BQ0E7SUFBQTtFQUVGOztFQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDTyxTQUFTQyxxQkFBcUIsQ0FBQy9GLGtCQUFzRCxFQUFRO0lBQ25HLElBQUlBLGtCQUFrQixDQUFDQyxRQUFRLENBQUNHLFNBQVMsS0FBSzNLLFNBQVMsRUFBRTtNQUN4RHVRLGVBQWUsQ0FBQ0MsTUFBTSxDQUNyQixPQUFPaFEsS0FBYyxFQUFFb0QsUUFBMEIsS0FBSzBHLG9CQUFvQixDQUFDQyxrQkFBa0IsRUFBRS9KLEtBQUssRUFBRW9ELFFBQVEsQ0FBQyxFQUMvRzJHLGtCQUFrQixDQUFDQyxRQUFRLENBQUNHLFNBQVMsRUFDckNKLGtCQUFrQixDQUFDQyxRQUFRLENBQUNLLE1BQU0sSUFBSU4sa0JBQWtCLENBQUNDLFFBQVEsQ0FBQzNFLElBQUksQ0FDdEU7SUFDRjtJQUNBLElBQUkwRSxrQkFBa0IsQ0FBQ0MsUUFBUSxDQUFDSSxlQUFlLEtBQUs1SyxTQUFTLEVBQUU7TUFDOUR1USxlQUFlLENBQUNDLE1BQU0sQ0FDckIsT0FBT2hRLEtBQWMsRUFBRW9ELFFBQTBCLEtBQUswRyxvQkFBb0IsQ0FBQ0Msa0JBQWtCLEVBQUUvSixLQUFLLEVBQUVvRCxRQUFRLEVBQUUsSUFBSSxDQUFDLEVBQ3JIMkcsa0JBQWtCLENBQUNDLFFBQVEsQ0FBQ0ksZUFBZSxFQUMzQ0wsa0JBQWtCLENBQUNDLFFBQVEsQ0FBQ0ssTUFBTSxJQUFJTixrQkFBa0IsQ0FBQ0MsUUFBUSxDQUFDM0UsSUFBSSxDQUN0RTtJQUNGO0VBQ0Q7O0VBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUpBO0VBS08sU0FBUzRLLHVCQUF1QixDQUFDbEcsa0JBQXNELEVBQVE7SUFDckcsSUFBSUEsa0JBQWtCLENBQUNDLFFBQVEsQ0FBQ0csU0FBUyxLQUFLM0ssU0FBUyxFQUFFO01BQ3hEdVEsZUFBZSxDQUFDQyxNQUFNLENBQ3JCLElBQUksRUFDSmpHLGtCQUFrQixDQUFDQyxRQUFRLENBQUNHLFNBQVMsRUFDckNKLGtCQUFrQixDQUFDQyxRQUFRLENBQUNLLE1BQU0sSUFBSU4sa0JBQWtCLENBQUNDLFFBQVEsQ0FBQzNFLElBQUksQ0FDdEU7SUFDRjtJQUNBLElBQUkwRSxrQkFBa0IsQ0FBQ0MsUUFBUSxDQUFDSSxlQUFlLEtBQUs1SyxTQUFTLEVBQUU7TUFDOUR1USxlQUFlLENBQUNDLE1BQU0sQ0FDckIsSUFBSSxFQUNKakcsa0JBQWtCLENBQUNDLFFBQVEsQ0FBQ0ksZUFBZSxFQUMzQ0wsa0JBQWtCLENBQUNDLFFBQVEsQ0FBQ0ssTUFBTSxJQUFJTixrQkFBa0IsQ0FBQ0MsUUFBUSxDQUFDM0UsSUFBSSxDQUN0RTtJQUNGO0VBQ0Q7RUFBQztFQUVELFNBQVMySSxjQUFjLENBQUNrQyxhQUF1QixFQUFFQyxXQUFtQixFQUFFQyxjQUF1QixFQUFFWCxLQUFjLEVBQVU7SUFDdEgsTUFBTVksV0FBVyxHQUFHSCxhQUFhLENBQUNwSixHQUFHLENBQUV3SixZQUFZLElBQUtDLEdBQUksa0JBQWlCQyx1QkFBdUIsQ0FBQ0YsWUFBWSxDQUFFLEtBQUksQ0FBQztJQUN4SCxJQUFJRyxVQUFVLEdBQUcsRUFBRTtJQUNuQixJQUFJaEIsS0FBSyxFQUFFO01BQ1YsTUFBTWlCLGNBQWMsR0FBR0MsSUFBSSxDQUFFLFFBQU9sQixLQUFNLFFBQU8sQ0FBQztNQUNsRGdCLFVBQVUsR0FBR0YsR0FBSSxtREFBa0RHLGNBQWUsVUFBUztJQUM1RjtJQUNBLElBQUlFLGNBQWMsR0FBRyxFQUFFO0lBQ3ZCLElBQUlSLGNBQWMsRUFBRTtNQUNuQlEsY0FBYyxHQUFHTCxHQUFJO0FBQ3ZCO0FBQ0EsNkNBQThDLHdCQUF1QkksSUFBSSxDQUFDRSxJQUFJLENBQUNDLFNBQVMsQ0FBQ1YsY0FBYyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBRSxNQUFNO0FBQ3pILGVBQWU7SUFDZDtJQUNBLE9BQU9HLEdBQUk7QUFDWjtBQUNBLE9BQU9GLFdBQVk7QUFDbkIsT0FBT0ksVUFBVztBQUNsQjtBQUNBO0FBQ0E7QUFDQSw2Q0FBOEMsd0JBQXVCRSxJQUFJLENBQUNSLFdBQVcsQ0FBQ1ksVUFBVSxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBRSxNQUFNO0FBQ3JIO0FBQ0EsU0FBU0gsY0FBZTtBQUN4QjtBQUNBO0FBQ0EsbUNBQW1DO0VBQ25DO0VBRUEsTUFBTW5FLG9CQUE2QyxHQUFHLENBQUMsQ0FBQzs7RUFFeEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNPLFNBQVNqQixnQkFBZ0IsQ0FBQ2hILEtBQWMsRUFBVTtJQUN4RCxNQUFNd00sV0FBVyxHQUFJLFNBQVFDLEdBQUcsRUFBRyxFQUFDO0lBQ3BDeEUsb0JBQW9CLENBQUN1RSxXQUFXLENBQUMsR0FBR3hNLEtBQUs7SUFDekMsT0FBT3dNLFdBQVc7RUFDbkI7O0VBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBTEE7RUFNQSxTQUFTak8sa0JBQWtCLENBQUNpTyxXQUFtQixFQUFXO0lBQ3pELE1BQU14TSxLQUFLLEdBQUdpSSxvQkFBb0IsQ0FBQ3VFLFdBQVcsQ0FBQztJQUMvQyxPQUFPdkUsb0JBQW9CLENBQUN1RSxXQUFXLENBQUM7SUFDeEMsT0FBT3hNLEtBQUs7RUFDYjtFQUVBLElBQUkwTSxxQkFBcUIsR0FBRyxLQUFLO0VBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNBLE1BQU1yRCxpQkFBaUIsR0FBRyxnQkFBZ0JzRCxNQUFnRCxFQUFvQjtJQUM3R0QscUJBQXFCLEdBQUcsSUFBSTtJQUM1QixJQUFJRSxXQUFXO0lBQ2YsSUFBSTtNQUNIQSxXQUFXLEdBQUdELE1BQU0sRUFBRTtJQUN2QixDQUFDLFNBQVM7TUFDVEQscUJBQXFCLEdBQUcsS0FBSztJQUM5QjtJQUNBLE9BQU9FLFdBQVc7RUFDbkIsQ0FBQzs7RUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNPLFNBQVNoRSxjQUFjLENBQUNpRSxTQUFpQixFQUEyQztJQUFBO0lBQUEsSUFBekNDLG9CQUFvQix1RUFBRyxLQUFLO0lBQzdFLElBQUlBLG9CQUFvQixFQUFFO01BQ3pCRCxTQUFTLEdBQUk7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEZBQTRGQSxTQUFVLGFBQVk7SUFDakg7SUFDQSxNQUFNRSxXQUFXLEdBQUc3UyxpQkFBaUIsQ0FBQzhTLGVBQWUsQ0FBQ0gsU0FBUyxFQUFFLFVBQVUsQ0FBQztJQUM1RSxJQUFJSSxNQUFNLEdBQUdGLFdBQVcsQ0FBQ2pLLGlCQUFpQjtJQUMxQyxPQUFPLFlBQUFtSyxNQUFNLDRDQUFOLFFBQVExSyxTQUFTLE1BQUssVUFBVSxFQUFFO01BQUE7TUFDeEMwSyxNQUFNLEdBQUdBLE1BQU0sQ0FBQ25LLGlCQUFpQjtJQUNsQztJQUNBLE1BQU0zQixRQUFRLEdBQUcsWUFBQThMLE1BQU0scUNBQU4sU0FBUUMsYUFBYSxlQUFHRCxNQUFNLDZDQUFOLFNBQVFDLGFBQWEsQ0FBQy9MLFFBQVEsR0FBRyxDQUFDOEwsTUFBTSxDQUFZO0lBQzdGLE9BQU83SixLQUFLLENBQUNDLElBQUksQ0FBQ2xDLFFBQVEsQ0FBQztFQUM1Qjs7RUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFMQTtFQU1PLFNBQVM2Syx1QkFBdUIsQ0FBQ2hNLEtBQWMsRUFBc0I7SUFDM0UsT0FBT0EsS0FBSyxhQUFMQSxLQUFLLHVCQUFMQSxLQUFLLENBQUVxRixPQUFPLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDQSxPQUFPLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDQSxPQUFPLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDQSxPQUFPLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQztFQUMzRztFQUFDO0VBRUQsU0FBUzhILGlCQUFpQixDQUFDQyxNQUFjLEVBQVU7SUFBQTtJQUNsRCxNQUFNQyxTQUFTLEdBQUd6RSxjQUFjLENBQUN3RSxNQUFNLEVBQUUsSUFBSSxDQUFDO0lBQzlDLElBQUksQ0FBQUMsU0FBUyxhQUFUQSxTQUFTLHVCQUFUQSxTQUFTLENBQUV6TSxNQUFNLElBQUcsQ0FBQyxJQUFJLGdCQUFBeU0sU0FBUyxDQUFDLENBQUMsQ0FBQyxnREFBWixZQUFjOUssU0FBUyxNQUFLLGFBQWEsRUFBRTtNQUN2RSxNQUFNdUosWUFBWSxHQUFJdUIsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFpQkMsU0FBUyxJQUFLRCxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQWlCRSxTQUFTO01BQ3ZHLE9BQU8vRCxjQUFjLENBQUMsQ0FBQ3NDLFlBQVksQ0FBQzBCLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFSixNQUFNLENBQUM7SUFDN0QsQ0FBQyxNQUFNO01BQ04sT0FBT0EsTUFBTTtJQUNkO0VBQ0Q7RUFlQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNPLE1BQU1yQixHQUFHLEdBQUcsVUFBQzBCLE9BQTZCLEVBQWlEO0lBQ2pHLElBQUlMLE1BQU0sR0FBRyxFQUFFO0lBQ2YsSUFBSU0sQ0FBQztJQUFDLGtDQUYrQ0MsTUFBTTtNQUFOQSxNQUFNO0lBQUE7SUFHM0QsS0FBS0QsQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxHQUFHQyxNQUFNLENBQUMvTSxNQUFNLEVBQUU4TSxDQUFDLEVBQUUsRUFBRTtNQUNuQ04sTUFBTSxJQUFJSyxPQUFPLENBQUNDLENBQUMsQ0FBQzs7TUFFcEI7TUFDQSxNQUFNMU4sS0FBSyxHQUFHMk4sTUFBTSxDQUFDRCxDQUFDLENBQUM7TUFFdkIsSUFBSXRLLEtBQUssQ0FBQ3dLLE9BQU8sQ0FBQzVOLEtBQUssQ0FBQyxJQUFJQSxLQUFLLENBQUNZLE1BQU0sR0FBRyxDQUFDLElBQUksT0FBT1osS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLFFBQVEsRUFBRTtRQUM3RW9OLE1BQU0sSUFBSXBOLEtBQUssQ0FBQzZOLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQ2xFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQ1AsSUFBSSxFQUFFO01BQzFDLENBQUMsTUFBTSxJQUFJMEUsZUFBZSxDQUFDOU4sS0FBSyxDQUFDLEVBQUU7UUFDbENvTixNQUFNLElBQUlwTixLQUFLLENBQUNzQyxHQUFHLENBQUV5TCxPQUFPLElBQUtBLE9BQU8sRUFBRSxDQUFDLENBQUNwRSxJQUFJLENBQUMsSUFBSSxDQUFDO01BQ3ZELENBQUMsTUFBTSxJQUFJcUUsMEJBQTBCLENBQUNoTyxLQUFLLENBQUMsRUFBRTtRQUM3QyxNQUFNaU8sa0JBQWtCLEdBQUdDLGlCQUFpQixDQUFDbE8sS0FBSyxDQUFDO1FBQ25Eb04sTUFBTSxJQUFJcEIsdUJBQXVCLENBQUNpQyxrQkFBa0IsQ0FBQztNQUN0RCxDQUFDLE1BQU0sSUFBSSxPQUFPak8sS0FBSyxLQUFLLFdBQVcsRUFBRTtRQUN4Q29OLE1BQU0sSUFBSSx1QkFBdUI7TUFDbEMsQ0FBQyxNQUFNLElBQUksT0FBT3BOLEtBQUssS0FBSyxVQUFVLEVBQUU7UUFDdkNvTixNQUFNLElBQUlwTixLQUFLLEVBQUU7TUFDbEIsQ0FBQyxNQUFNLElBQUksT0FBT0EsS0FBSyxLQUFLLFFBQVEsSUFBSUEsS0FBSyxLQUFLLElBQUksRUFBRTtRQUN2RCxJQUFJOEcsU0FBUyxDQUFDOUcsS0FBSyxDQUFDLEVBQUU7VUFDckJvTixNQUFNLElBQUlwTixLQUFLLENBQUM3RSxPQUFPLEVBQUU7UUFDMUIsQ0FBQyxNQUFNO1VBQ04sTUFBTWdULFdBQVcsR0FBR25ILGdCQUFnQixDQUFDaEgsS0FBSyxDQUFDO1VBQzNDb04sTUFBTSxJQUFLLEdBQUVlLFdBQVksRUFBQztRQUMzQjtNQUNELENBQUMsTUFBTSxJQUFJbk8sS0FBSyxJQUFJLE9BQU9BLEtBQUssS0FBSyxRQUFRLElBQUksQ0FBQ0EsS0FBSyxDQUFDMUQsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMwRCxLQUFLLENBQUMxRCxVQUFVLENBQUMsTUFBTSxDQUFDLEVBQUU7UUFDckc4USxNQUFNLElBQUlwQix1QkFBdUIsQ0FBQ2hNLEtBQUssQ0FBQztNQUN6QyxDQUFDLE1BQU07UUFDTm9OLE1BQU0sSUFBSXBOLEtBQUs7TUFDaEI7SUFDRDtJQUNBb04sTUFBTSxJQUFJSyxPQUFPLENBQUNDLENBQUMsQ0FBQztJQUNwQk4sTUFBTSxHQUFHQSxNQUFNLENBQUNoRSxJQUFJLEVBQUU7SUFDdEIsSUFBSXNELHFCQUFxQixFQUFFO01BQzFCLE9BQU9TLGlCQUFpQixDQUFDQyxNQUFNLENBQUM7SUFDakM7SUFDQSxPQUFPQSxNQUFNO0VBQ2QsQ0FBQztFQUFDO0VBRUssTUFBTWdCLHFCQUFxQixHQUFHLFVBQVVDLFNBQWtCLEVBQUVDLFNBQWlCLEVBQVU7SUFDN0YsSUFBSUQsU0FBUyxFQUFFO01BQ2QsT0FBT0MsU0FBUztJQUNqQixDQUFDLE1BQU07TUFDTixPQUFPLEVBQUU7SUFDVjtFQUNELENBQUM7O0VBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQVBBO0VBUU8sTUFBTUMsaUJBQWlCLEdBQUcsVUFBVXJTLGFBQXFCLEVBQUU4RCxLQUE2QixFQUFnQjtJQUM5RyxJQUFJQSxLQUFLLEtBQUtoRixTQUFTLElBQUksQ0FBQ3dULHFCQUFxQixDQUFDeE8sS0FBSyxDQUFDLEVBQUU7TUFDekQsT0FBTyxNQUFNK0wsR0FBSSxHQUFFN1AsYUFBYyxLQUFJOEQsS0FBTSxHQUFFO0lBQzlDLENBQUMsTUFBTTtNQUNOLE9BQU8sTUFBTSxFQUFFO0lBQ2hCO0VBQ0QsQ0FBQztFQUFDO0VBQUE7QUFBQSJ9
983
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJMT0dHRVJfU0NPUEUiLCJYTUxURU1QTEFUSU5HX05TIiwiRE9NUGFyc2VySW5zdGFuY2UiLCJET01QYXJzZXIiLCJ2YWxpZGF0ZU1hY3JvTWV0YWRhdGFDb250ZXh0Iiwic05hbWUiLCJtQ29udGV4dHMiLCJvQ29udGV4dFNldHRpbmdzIiwic0tleSIsIm9Db250ZXh0Iiwib0NvbnRleHRPYmplY3QiLCJnZXRPYmplY3QiLCJyZXF1aXJlZCIsIkVycm9yIiwiaGFzT3duUHJvcGVydHkiLCIka2luZCIsInVuZGVmaW5lZCIsImV4cGVjdGVkVHlwZXMiLCJpbmNsdWRlcyIsImdldFBhdGgiLCIkVHlwZSIsImV4cGVjdGVkQW5ub3RhdGlvblR5cGVzIiwidmFsaWRhdGVNYWNyb1NpZ25hdHVyZSIsIm9NZXRhZGF0YSIsIm9Ob2RlIiwiYU1ldGFkYXRhQ29udGV4dEtleXMiLCJtZXRhZGF0YUNvbnRleHRzIiwiT2JqZWN0Iiwia2V5cyIsImFQcm9wZXJ0aWVzIiwicHJvcGVydGllcyIsIm9BdHRyaWJ1dGVOYW1lcyIsImF0dHJpYnV0ZU5hbWVzIiwiZ2V0QXR0cmlidXRlTmFtZXMiLCJhdHRyaWJ1dGVOYW1lIiwiZm9yRWFjaCIsIm9Qcm9wZXJ0eVNldHRpbmdzIiwiaGFzQXR0cmlidXRlIiwic3RhcnRzV2l0aCIsIkxvZyIsIndhcm5pbmciLCJfZXhwb3J0cyIsIlNBUF9VSV9DT1JFX0VMRU1FTlQiLCJTQVBfVUlfTU9ERUxfQ09OVEVYVCIsInRyYW5zZm9ybU1ldGFkYXRhIiwiYnVpbGRpbmdCbG9ja01ldGFkYXRhIiwiY2xhc3MiLCJ0eXBlIiwiaXNQdWJsaWMiLCJhZ2dyZWdhdGlvbnMiLCJkZXBlbmRlbnRzIiwic2xvdCIsImN1c3RvbURhdGEiLCJsYXlvdXREYXRhIiwicHJvcGVydHlOYW1lIiwicHJvcGVydHlUeXBlIiwiX2NoZWNrQWJzb2x1dGVBbmRDb250ZXh0UGF0aHMiLCJvU2V0dGluZ3MiLCJzQXR0cmlidXRlVmFsdWUiLCJzTWV0YVBhdGgiLCJzQ29udGV4dFBhdGgiLCJjdXJyZW50Q29udGV4dFBhdGgiLCJlbmRzV2l0aCIsIm1vZGVsIiwicGF0aCIsIl9jcmVhdGVJbml0aWFsTWV0YWRhdGFDb250ZXh0Iiwic0F0dHJpYnV0ZU5hbWUiLCJyZXR1cm5Db250ZXh0IiwibW9kZWxzIiwiY29udmVydGVyQ29udGV4dCIsImdldFByb3BlcnR5IiwiZGF0YSIsInVuc3RvcmVPYmplY3RWYWx1ZSIsInNldFByb3BlcnR5IiwiYmluZGluZ0NvbnRleHRzIiwiZW50aXR5U2V0IiwiX2dldE1ldGFkYXRhQ29udGV4dCIsIm9WaXNpdG9yIiwiYkRvTm90UmVzb2x2ZSIsImlzT3BlbiIsIm9NZXRhZGF0YUNvbnRleHQiLCJnZXRBdHRyaWJ1dGUiLCJCaW5kaW5nUGFyc2VyIiwiY29tcGxleFBhcnNlciIsImdldENvbnRleHQiLCJlIiwicHJvY2Vzc1Byb3BlcnRpZXMiLCJkZWZpbml0aW9uUHJvcGVydGllcyIsImFEZWZpbml0aW9uUHJvcGVydGllc0tleXMiLCJwcm9wZXJ0eVZhbHVlcyIsInNLZXlWYWx1ZSIsImRlZmF1bHRWYWx1ZSIsImRlZXBDbG9uZSIsImVycm9yIiwidmlzaXRBdHRyaWJ1dGUiLCJhdHRyaWJ1dGVzIiwiZ2V0TmFtZWRJdGVtIiwidmFsdWUiLCJOdW1iZXIiLCJwcm9jZXNzQ29udGV4dHMiLCJjb250ZXh0UGF0aCIsIm1NaXNzaW5nQ29udGV4dCIsIm9EZWZpbml0aW9uQ29udGV4dHMiLCJhRGVmaW5pdGlvbkNvbnRleHRzS2V5cyIsImNvbnRleHRQYXRoSW5kZXgiLCJpbmRleE9mIiwiY29udGV4dFBhdGhEZWZpbml0aW9uIiwic3BsaWNlIiwicHJvcGVydHlWYWx1ZSIsImxlbmd0aCIsIm5hbWUiLCJhZGRTaW5nbGVDb250ZXh0IiwicGFyc2VBZ2dyZWdhdGlvbiIsIm9BZ2dyZWdhdGlvbiIsInByb2Nlc3NBZ2dyZWdhdGlvbnMiLCJvT3V0T2JqZWN0cyIsImNoaWxkcmVuIiwiY2hpbGRJZHgiLCJjaGlsZERlZmluaXRpb24iLCJjaGlsZEtleSIsInNldEF0dHJpYnV0ZSIsImFnZ3JlZ2F0aW9uT2JqZWN0Iiwia2V5IiwicG9zaXRpb24iLCJwbGFjZW1lbnQiLCJQbGFjZW1lbnQiLCJBZnRlciIsImFuY2hvciIsInRhZ05hbWUiLCJub2RlTmFtZSIsInByb2Nlc3NPYmplY3QiLCJlbGVtZW50IiwibXlBcnJheSIsIm15T2JqZWN0IiwiY2hpbGROb2RlTmFtZXMiLCJtYXAiLCJsb2NhbE5hbWUiLCJjaGlsZElzQXJyYXkiLCJTZXQiLCJzaXplIiwicHVzaCIsInByb2Nlc3NDaGlsZHJlbiIsIm9BZ2dyZWdhdGlvbnMiLCJmaXJzdEVsZW1lbnRDaGlsZCIsIm9GaXJzdEVsZW1lbnRDaGlsZCIsIm5hbWVzcGFjZVVSSSIsIm9QYXJlbnQiLCJwYXJlbnROb2RlIiwiaUNoaWxkSW5kZXgiLCJBcnJheSIsImZyb20iLCJ2aXNpdE5vZGUiLCJuZXh0RWxlbWVudFNpYmxpbmciLCJzQ2hpbGROYW1lIiwic0FnZ3JlZ2F0aW9uTmFtZSIsInRvVXBwZXJDYXNlIiwiZGVmYXVsdEFnZ3JlZ2F0aW9uIiwiYWdncmVnYXRpb25EZWZpbml0aW9uIiwicGFyc2VkQWdncmVnYXRpb24iLCJwYXJzZWRBZ2dyZWdhdGlvbktleSIsIm9OZXh0Q2hpbGQiLCJuZXh0Q2hpbGQiLCJoYXNWaXJ0dWFsTm9kZSIsImNoaWxkV3JhcHBlciIsImRvY3VtZW50IiwiY3JlYXRlRWxlbWVudE5TIiwiYXBwZW5kQ2hpbGQiLCJyZW1vdmVBdHRyaWJ1dGUiLCJvTmV3Q2hpbGQiLCJjbG9uZU5vZGUiLCJhZ2dyZWdhdGlvblByb3BlcnR5VmFsdWVzIiwibXlDaGlsZCIsInByb2Nlc3NTbG90cyIsIm9NZXRhZGF0YUFnZ3JlZ2F0aW9ucyIsInByb2Nlc3NDdXN0b21EYXRhIiwiYXJndW1lbnRzIiwib0FnZ3JlZ2F0aW9uRWxlbWVudCIsIm9FbGVtZW50Q2hpbGQiLCJzU2xvdE5hbWUiLCJvVGFyZ2V0RWxlbWVudCIsInF1ZXJ5U2VsZWN0b3IiLCJwcmVwYXJlQWdncmVnYXRpb25FbGVtZW50IiwicmVwbGFjZVdpdGgiLCJyZXBsYWNlIiwicHJvY2Vzc0J1aWxkaW5nQmxvY2siLCJCdWlsZGluZ0Jsb2NrQ2xhc3MiLCJtZXRhZGF0YSIsInNGcmFnbWVudE5hbWUiLCJmcmFnbWVudCIsIm5hbWVzcGFjZSIsInB1YmxpY05hbWVzcGFjZSIsInhtbFRhZyIsImdldFNldHRpbmdzIiwiSlNPTk1vZGVsIiwiaW5pdGlhbEtleXMiLCJvQ29udHJvbENvbmZpZyIsInZpZXdEYXRhIiwicHJvY2Vzc2VkUHJvcGVydHlWYWx1ZXMiLCJwcm9wTmFtZSIsIl9CdWlsZGluZ0Jsb2NrQ2xhc3MkbSIsIl9vRGF0YSIsIl9vRGF0YSRpc0EiLCJvRGF0YSIsIm9yaWdpbmFsRGVmaW5pdGlvbiIsInZhbGlkYXRlIiwiaXNBIiwiY2FsbCIsImdldE1vZGVsIiwib0luc3RhbmNlIiwiZ2V0UHJvcGVydGllcyIsInNDb250ZXh0TmFtZSIsInRhcmdldE9iamVjdCIsImlzQ29udGV4dCIsImF0dHJpYnV0ZVZhbHVlIiwic3RvcmVPYmplY3RWYWx1ZSIsIm5ld0NvbnRleHQiLCJjcmVhdGVCaW5kaW5nQ29udGV4dCIsIm9BdHRyaWJ1dGVzTW9kZWwiLCJBdHRyaWJ1dGVNb2RlbCIsIm9QcmV2aW91c01hY3JvSW5mbyIsImNvcmVSZXF1aXJlIiwiVHJhY2VJbmZvIiwiaXNUcmFjZUluZm9BY3RpdmUiLCJvVHJhY2VJbmZvIiwidHJhY2VNYWNyb0NhbGxzIiwibWFjcm9JbmZvIiwib0NvbnRleHRWaXNpdG9yIiwid2l0aCIsIm9Qcm9taXNlIiwiaW5zZXJ0RnJhZ21lbnQiLCJvbGRLZXlzIiwidGVtcG9yYXJ5T2JqZWN0U3RvcmUiLCJ0ZW1wbGF0ZVN0cmluZyIsImdldFJ1bnRpbWVCdWlsZGluZ0Jsb2NrVGVtcGxhdGUiLCJqc3giLCJyZW5kZXJBc1hNTCIsImdldFRlbXBsYXRlIiwiaXNSdW50aW1lIiwic3RvcmVLZXkiLCJoYXNFcnJvciIsImhhc1BhcnNlRXJyb3IiLCJwYXJzZWRUZW1wbGF0ZSIsInBhcnNlWE1MU3RyaW5nIiwiaXRlciIsImNyZWF0ZU5vZGVJdGVyYXRvciIsIk5vZGVGaWx0ZXIiLCJTSE9XX1RFWFQiLCJ0ZXh0bm9kZSIsIm5leHROb2RlIiwidGV4dENvbnRlbnQiLCJ0cmltIiwicHJvY2Vzc1htbEluVHJhY2UiLCJpbml0aWFsVGVtcGxhdGUiLCJvRXJyb3JUZXh0IiwiY3JlYXRlRXJyb3JYTUwiLCJ0ZW1wbGF0ZSIsIm91dGVySFRNTCIsImpvaW4iLCJ2aXNpdGVkTm9kZXMiLCJpbnRlcm5hbE5vZGUiLCJQcm9taXNlIiwiYWxsIiwicmVtb3ZlIiwicmVzb2x2ZSIsIm9NYWNyb0VsZW1lbnQiLCJvUmVtYWluaW5nU2xvdHMiLCJxdWVyeVNlbGVjdG9yQWxsIiwib1Nsb3RFbGVtZW50IiwicmVxdWlyZU9uTWFjcm8iLCJnZXRBdHRyaWJ1dGVOUyIsInN1YnN0cmluZyIsInNldEF0dHJpYnV0ZU5TIiwiY2xhc3NMaXN0IiwiYWRkIiwidHJhY2VEZXRhaWxzIiwiaW5pdGlhbFByb3BlcnRpZXMiLCJyZXNvbHZlZFByb3BlcnRpZXMiLCJtaXNzaW5nQ29udGV4dHMiLCJvRXJyb3IiLCJzdGFjayIsIm9UZW1wbGF0ZSIsIm9DdHgiLCJtU2V0dGluZyIsImV4IiwicmVnaXN0ZXJCdWlsZGluZ0Jsb2NrIiwiWE1MUHJlcHJvY2Vzc29yIiwicGx1Z0luIiwidW5yZWdpc3RlckJ1aWxkaW5nQmxvY2siLCJlcnJvck1lc3NhZ2VzIiwieG1sRnJhZ21lbnQiLCJhZGRpdGlvbmFsRGF0YSIsImVycm9yTGFiZWxzIiwiZXJyb3JNZXNzYWdlIiwieG1sIiwiZXNjYXBlWE1MQXR0cmlidXRlVmFsdWUiLCJlcnJvclN0YWNrIiwic3RhY2tGb3JtYXR0ZWQiLCJidG9hIiwiYWRkaXRpb25hbFRleHQiLCJKU09OIiwic3RyaW5naWZ5IiwicmVwbGFjZUFsbCIsInByb3BlcnR5VUlEIiwidWlkIiwicHJvY2Vzc05leHRYbWxJblRyYWNlIiwibWV0aG9kIiwicmV0dXJuVmFsdWUiLCJ4bWxTdHJpbmciLCJfb3V0cHV0MiIsIl9vdXRwdXQzIiwiYWRkRGVmYXVsdE5hbWVzcGFjZXMiLCJ4bWxEb2N1bWVudCIsInBhcnNlRnJvbVN0cmluZyIsIm91dHB1dCIsIl9vdXRwdXQiLCJwYXJlbnRFbGVtZW50IiwicmVuZGVySW5UcmFjZU1vZGUiLCJvdXRTdHIiLCJfeG1sUmVzdWx0JCIsInhtbFJlc3VsdCIsImlubmVyVGV4dCIsImlubmVySFRNTCIsInNwbGl0Iiwic3RyaW5ncyIsImkiLCJfbGVuIiwidmFsdWVzIiwiX2tleSIsImlzQXJyYXkiLCJmbGF0IiwiaXNGdW5jdGlvbkFycmF5IiwidmFsdWVmbiIsImlzQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIiwiY29tcGlsZWRFeHByZXNzaW9uIiwiY29tcGlsZUV4cHJlc3Npb24iLCJwcm9wZXJ0eVVJZCIsImFkZENvbmRpdGlvbmFsbHlUb1hNTCIsImNvbmRpdGlvbiIsInBhcnRUb0FkZCIsImFkZEF0dHJpYnV0ZVRvWE1MIiwiaXNVbmRlZmluZWRFeHByZXNzaW9uIl0sInNvdXJjZVJvb3QiOiIuIiwic291cmNlcyI6WyJCdWlsZGluZ0Jsb2NrVGVtcGxhdGVQcm9jZXNzb3IudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgZGVlcENsb25lIGZyb20gXCJzYXAvYmFzZS91dGlsL2RlZXBDbG9uZVwiO1xuaW1wb3J0IHVpZCBmcm9tIFwic2FwL2Jhc2UvdXRpbC91aWRcIjtcbmltcG9ydCB0eXBlIHsgQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIH0gZnJvbSBcInNhcC9mZS9iYXNlL0JpbmRpbmdUb29sa2l0XCI7XG5pbXBvcnQgeyBjb21waWxlRXhwcmVzc2lvbiwgaXNCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24sIGlzVW5kZWZpbmVkRXhwcmVzc2lvbiB9IGZyb20gXCJzYXAvZmUvYmFzZS9CaW5kaW5nVG9vbGtpdFwiO1xuaW1wb3J0IGpzeCBmcm9tIFwic2FwL2ZlL2Jhc2UvanN4LXJ1bnRpbWUvanN4XCI7XG5pbXBvcnQgdHlwZSBBcHBDb21wb25lbnQgZnJvbSBcInNhcC9mZS9jb3JlL0FwcENvbXBvbmVudFwiO1xuaW1wb3J0IHR5cGUgUmVzb3VyY2VNb2RlbCBmcm9tIFwic2FwL2ZlL2NvcmUvUmVzb3VyY2VNb2RlbFwiO1xuaW1wb3J0IEF0dHJpYnV0ZU1vZGVsIGZyb20gXCJzYXAvZmUvY29yZS9idWlsZGluZ0Jsb2Nrcy90ZW1wbGF0aW5nL0F0dHJpYnV0ZU1vZGVsXCI7XG5pbXBvcnQgdHlwZSB7XG5cdEJ1aWxkaW5nQmxvY2tBZ2dyZWdhdGlvbkRlZmluaXRpb24sXG5cdEJ1aWxkaW5nQmxvY2tNZXRhZGF0YSxcblx0QnVpbGRpbmdCbG9ja01ldGFkYXRhQ29udGV4dERlZmluaXRpb24sXG5cdEJ1aWxkaW5nQmxvY2tQcm9wZXJ0eURlZmluaXRpb24sXG5cdE9iamVjdFZhbHVlLFxuXHRPYmplY3RWYWx1ZTJcbn0gZnJvbSBcInNhcC9mZS9jb3JlL2J1aWxkaW5nQmxvY2tzL3RlbXBsYXRpbmcvQnVpbGRpbmdCbG9ja1N1cHBvcnRcIjtcbmltcG9ydCB0eXBlIEJ1aWxkaW5nQmxvY2tUZW1wbGF0aW5nQmFzZSBmcm9tIFwic2FwL2ZlL2NvcmUvYnVpbGRpbmdCbG9ja3MvdGVtcGxhdGluZy9CdWlsZGluZ0Jsb2NrVGVtcGxhdGluZ0Jhc2VcIjtcbmltcG9ydCB0eXBlIFJ1bnRpbWVCdWlsZGluZ0Jsb2NrIGZyb20gXCJzYXAvZmUvY29yZS9idWlsZGluZ0Jsb2Nrcy90ZW1wbGF0aW5nL1J1bnRpbWVCdWlsZGluZ0Jsb2NrXCI7XG5pbXBvcnQgdHlwZSB7IFBvc2l0aW9uIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvaGVscGVycy9Db25maWd1cmFibGVPYmplY3RcIjtcbmltcG9ydCB7IFBsYWNlbWVudCB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2hlbHBlcnMvQ29uZmlndXJhYmxlT2JqZWN0XCI7XG5pbXBvcnQgdHlwZSB7IERlZmluaXRpb25Db250ZXh0LCBEZWZpbml0aW9uUGFnZSB9IGZyb20gXCJzYXAvZmUvY29yZS9kZWZpbml0aW9uL0ZFRGVmaW5pdGlvblwiO1xuaW1wb3J0IHsgaXNDb250ZXh0LCBpc0Z1bmN0aW9uQXJyYXkgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9UeXBlR3VhcmRzXCI7XG5pbXBvcnQgQmluZGluZ1BhcnNlciBmcm9tIFwic2FwL3VpL2Jhc2UvQmluZGluZ1BhcnNlclwiO1xuaW1wb3J0IHR5cGUgQ29udHJvbCBmcm9tIFwic2FwL3VpL2NvcmUvQ29udHJvbFwiO1xuaW1wb3J0IFhNTFByZXByb2Nlc3NvciBmcm9tIFwic2FwL3VpL2NvcmUvdXRpbC9YTUxQcmVwcm9jZXNzb3JcIjtcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9Db250ZXh0XCI7XG5pbXBvcnQgdHlwZSBNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL01vZGVsXCI7XG5pbXBvcnQgSlNPTk1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvanNvbi9KU09OTW9kZWxcIjtcbmltcG9ydCB0eXBlIE9EYXRhTWV0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNZXRhTW9kZWxcIjtcbmltcG9ydCB0eXBlIHsgTWFjcm9JbmZvIH0gZnJvbSBcIi4uL1RyYWNlSW5mb1wiO1xuaW1wb3J0IFRyYWNlSW5mbyBmcm9tIFwiLi4vVHJhY2VJbmZvXCI7XG5cbmNvbnN0IExPR0dFUl9TQ09QRSA9IFwic2FwLmZlLmNvcmUuYnVpbGRpbmdCbG9ja3MudGVtcGxhdGluZy5CdWlsZGluZ0Jsb2NrVGVtcGxhdGVQcm9jZXNzb3JcIjtcbmNvbnN0IFhNTFRFTVBMQVRJTkdfTlMgPSBcImh0dHA6Ly9zY2hlbWFzLnNhcC5jb20vc2FwdWk1L2V4dGVuc2lvbi9zYXAudWkuY29yZS50ZW1wbGF0ZS8xXCI7XG5jb25zdCBET01QYXJzZXJJbnN0YW5jZSA9IG5ldyBET01QYXJzZXIoKTtcblxuZXhwb3J0IHR5cGUgVHJhbnNmb3JtZWRCdWlsZGluZ0Jsb2NrTWV0YWRhdGEgPSBCdWlsZGluZ0Jsb2NrTWV0YWRhdGEgJiB7XG5cdG1ldGFkYXRhQ29udGV4dHM6IFJlY29yZDxzdHJpbmcsIEJ1aWxkaW5nQmxvY2tNZXRhZGF0YUNvbnRleHREZWZpbml0aW9uPjtcbn07XG5cbi8qKlxuICogRGVmaW5pdGlvbiBvZiBhIG1ldGEgZGF0YSBjb250ZXh0XG4gKi9cbnR5cGUgTWV0YURhdGFDb250ZXh0ID0ge1xuXHRuYW1lPzogc3RyaW5nO1xuXHRtb2RlbDogc3RyaW5nO1xuXHRwYXRoOiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBUZW1wbGF0ZVByb2Nlc3NvclNldHRpbmdzID0ge1xuXHRjdXJyZW50Q29udGV4dFBhdGg6IENvbnRleHQ7XG5cdGlzUHVibGljOiBib29sZWFuO1xuXHRhcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudDtcblx0aXNSdW50aW1lSW5zdGFudGlhdGlvbj86IGJvb2xlYW47XG5cdG1vZGVsczogUmVjb3JkPHN0cmluZywgTW9kZWw+ICYge1xuXHRcdGNvbnZlcnRlckNvbnRleHQ6IEpTT05Nb2RlbDtcblx0XHR2aWV3RGF0YTogSlNPTk1vZGVsO1xuXHRcdG1ldGFNb2RlbDogT0RhdGFNZXRhTW9kZWw7XG5cdFx0XCJzYXAuZmUuaTE4blwiPzogUmVzb3VyY2VNb2RlbDtcblx0fTtcblx0Z2V0RGVmaW5pdGlvbkNvbnRleHQoKTogRGVmaW5pdGlvbkNvbnRleHQ7XG5cdGdldERlZmluaXRpb25Gb3JQYWdlKCk6IERlZmluaXRpb25QYWdlO1xuXHRiaW5kaW5nQ29udGV4dHM6IFJlY29yZDxzdHJpbmcsIENvbnRleHQ+O1xuXHRfbWFjcm9JbmZvPzogTWFjcm9JbmZvO1xuXHRbazogc3RyaW5nXTogdW5rbm93bjtcbn07XG5cbmV4cG9ydCB0eXBlIElWaXNpdG9yQ2FsbGJhY2sgPSB7XG5cdGdldFNldHRpbmdzKCk6IFRlbXBsYXRlUHJvY2Vzc29yU2V0dGluZ3M7XG5cdC8qKlxuXHQgKiBWaXNpdHMgdGhlIGdpdmVuIG5vZGUgYW5kIGVpdGhlciBwcm9jZXNzZXMgYSB0ZW1wbGF0ZSBpbnN0cnVjdGlvbiwgY2FsbHNcblx0ICogYSB2aXNpdG9yLCBvciBzaW1wbHkgY2FsbHMgYm90aCB7QGxpbmtcblx0ICogc2FwLnVpLmNvcmUudXRpbC5YTUxQcmVwcm9jZXNzb3IuSUNhbGxiYWNrLnZpc2l0QXR0cmlidXRlcyB2aXNpdEF0dHJpYnV0ZXN9XG5cdCAqIGFuZCB7QGxpbmsgc2FwLnVpLmNvcmUudXRpbC5YTUxQcmVwcm9jZXNzb3IuSUNhbGxiYWNrLnZpc2l0Q2hpbGROb2Rlc1xuXHQgKiB2aXNpdENoaWxkTm9kZXN9LlxuXHQgKiBAcGFyYW0gb05vZGVcblx0ICogICBUaGUgWE1MIERPTSBub2RlXG5cdCAqIEByZXR1cm5zXG5cdCAqICAgQSB0aGVuYWJsZSB3aGljaCByZXNvbHZlcyB3aXRoIDxjb2RlPnVuZGVmaW5lZDwvY29kZT4gYXMgc29vbiBhcyB2aXNpdGluZ1xuXHQgKiAgIGlzIGRvbmUsIG9yIGlzIHJlamVjdGVkIHdpdGggYSBjb3JyZXNwb25kaW5nIGVycm9yIGlmIHZpc2l0aW5nIGZhaWxzXG5cdCAqL1xuXHR2aXNpdE5vZGUob05vZGU6IE5vZGUpOiBQcm9taXNlPHZvaWQ+O1xuXG5cdC8qKlxuXHQgKiBJbnNlcnRzIHRoZSBmcmFnbWVudCB3aXRoIHRoZSBnaXZlbiBuYW1lIGluIHBsYWNlIG9mIHRoZSBnaXZlbiBlbGVtZW50LiBMb2FkcyB0aGVcblx0ICogZnJhZ21lbnQsIHRha2VzIGNhcmUgb2YgY2FjaGluZyAoZm9yIHRoZSBjdXJyZW50IHByZS1wcm9jZXNzb3IgcnVuKSBhbmQgdmlzaXRzIHRoZVxuXHQgKiBmcmFnbWVudCdzIGNvbnRlbnQgb25jZSBpdCBoYXMgYmVlbiBpbXBvcnRlZCBpbnRvIHRoZSBlbGVtZW50J3Mgb3duZXIgZG9jdW1lbnQgYW5kXG5cdCAqIHB1dCBpbnRvIHBsYWNlLiBMb2FkaW5nIG9mIGZyYWdtZW50cyBpcyBhc3luY2hyb25vdXMgaWYgdGhlIHRlbXBsYXRlIHZpZXcgaXNcblx0ICogYXN5bmNocm9ub3VzLlxuXHQgKiBAcGFyYW0gc0ZyYWdtZW50XG5cdCAqICAgdGhlIGZyYWdtZW50J3MgcmVzb2x2ZWQgbmFtZVxuXHQgKiBAcGFyYW0gb0VsZW1lbnRcblx0ICogICB0aGUgWE1MIERPTSBlbGVtZW50LCBlLmcuIDxzYXAudWkuY29yZTpGcmFnbWVudD4gb3IgPGNvcmU6RXh0ZW5zaW9uUG9pbnQ+XG5cdCAqIEBwYXJhbSBvV2l0aFxuXHQgKiAgIHRoZSBwYXJlbnQncyBcIndpdGhcIiBjb250cm9sXG5cdCAqIEByZXR1cm5zXG5cdCAqIEEgc3luYyBwcm9taXNlIHdoaWNoIHJlc29sdmVzIHdpdGggPGNvZGU+dW5kZWZpbmVkPC9jb2RlPiBhcyBzb29uIGFzIHRoZSBmcmFnbWVudFxuXHQgKiAgIGhhcyBiZWVuIGluc2VydGVkLCBvciBpcyByZWplY3RlZCB3aXRoIGEgY29ycmVzcG9uZGluZyBlcnJvciBpZiBsb2FkaW5nIG9yIHZpc2l0aW5nXG5cdCAqICAgZmFpbHMuXG5cdCAqL1xuXHRpbnNlcnRGcmFnbWVudChzRnJhZ21lbnQ6IHN0cmluZywgb0VsZW1lbnQ6IEVsZW1lbnQsIG9XaXRoPzogQ29udHJvbCk6IFByb21pc2U8dm9pZD47XG5cdHZpc2l0QXR0cmlidXRlKG9Ob2RlOiBFbGVtZW50LCBvQXR0cmlidXRlOiBBdHRyKTogUHJvbWlzZTx2b2lkPjtcblx0dmlzaXRBdHRyaWJ1dGVzKG9Ob2RlOiBFbGVtZW50KTogUHJvbWlzZTx2b2lkPjtcblx0Z2V0Vmlld0luZm8oKTogUHJvbWlzZTx1bmtub3duPjtcblx0dmlzaXRDaGlsZE5vZGVzKG9Ob2RlOiBOb2RlKTogUHJvbWlzZTx2b2lkPjtcblx0LyoqXG5cdCAqIEludGVycHJldHMgdGhlIGdpdmVuIFhNTCBET00gYXR0cmlidXRlIHZhbHVlIGFzIGEgYmluZGluZyBhbmQgcmV0dXJucyB0aGVcblx0ICogcmVzdWx0aW5nIHZhbHVlLlxuXHQgKiBAcGFyYW0gc1ZhbHVlXG5cdCAqICAgQW4gWE1MIERPTSBhdHRyaWJ1dGUgdmFsdWVcblx0ICogQHBhcmFtIFtlbGVtZW50XVxuXHQgKiAgIFRoZSBYTUwgRE9NIGVsZW1lbnQgdGhlIGF0dHJpYnV0ZSB2YWx1ZSBiZWxvbmdzIHRvIChuZWVkZWQgb25seSBmb3Jcblx0ICogICB3YXJuaW5ncyB3aGljaCBhcmUgbG9nZ2VkIHRvIHRoZSBjb25zb2xlKVxuXHQgKiBAcmV0dXJuc1xuXHQgKiAgIEEgdGhlbmFibGUgd2hpY2ggcmVzb2x2ZXMgd2l0aCB0aGUgcmVzdWx0aW5nIHZhbHVlLCBvciBpcyByZWplY3RlZCB3aXRoIGFcblx0ICogICBjb3JyZXNwb25kaW5nIGVycm9yIChmb3IgZXhhbXBsZSwgYW4gZXJyb3IgdGhyb3duIGJ5IGEgZm9ybWF0dGVyKSBvclxuXHQgKiAgIDxjb2RlPm51bGw8L2NvZGU+IGluIGNhc2UgdGhlIGJpbmRpbmcgaXMgbm90IHJlYWR5IChiZWNhdXNlIGl0IHJlZmVycyB0byBhXG5cdCAqICAgbW9kZWwgd2hpY2ggaXMgbm90IGF2YWlsYWJsZSkgKHNpbmNlIDEuNTcuMClcblx0ICovXG5cdGdldFJlc3VsdChzVmFsdWU6IHN0cmluZywgZWxlbWVudD86IEVsZW1lbnQpOiBQcm9taXNlPENvbnRleHQ+IHwgbnVsbDtcblx0Z2V0Q29udGV4dChzUGF0aD86IHN0cmluZyk6IENvbnRleHQgfCB1bmRlZmluZWQ7XG5cdC8qKlxuXHQgKiBSZXR1cm5zIGEgY2FsbGJhY2sgaW50ZXJmYWNlIGluc3RhbmNlIGZvciB0aGUgZ2l2ZW4gbWFwIG9mIHZhcmlhYmxlcyB3aGljaFxuXHQgKiBvdmVycmlkZSBjdXJyZW50bHkga25vd24gdmFyaWFibGVzIG9mIHRoZSBzYW1lIG5hbWUgaW4gPGNvZGU+dGhpczwvY29kZT5cblx0ICogcGFyZW50IGludGVyZmFjZSBvciByZXBsYWNlIHRoZW0gYWx0b2dldGhlci4gRWFjaCB2YXJpYWJsZSBuYW1lIGJlY29tZXMgYVxuXHQgKiBuYW1lZCBtb2RlbCB3aXRoIGEgY29ycmVzcG9uZGluZyBvYmplY3QgYmluZGluZyBhbmQgY2FuIGJlIHVzZWQgaW5zaWRlIHRoZVxuXHQgKiBYTUwgdGVtcGxhdGUgaW4gdGhlIHVzdWFsIHdheSwgdGhhdCBpcywgd2l0aCBhIGJpbmRpbmcgZXhwcmVzc2lvbiBsaWtlXG5cdCAqIDxjb2RlPlwie3Zhcj5zb21lL3JlbGF0aXZlL3BhdGh9XCI8L2NvZGU+IChzZWUgZXhhbXBsZSkuXG5cdCAqIEBwYXJhbSBbbVZhcmlhYmxlcz17fV1cblx0ICogICBNYXAgZnJvbSB2YXJpYWJsZSBuYW1lIChzdHJpbmcpIHRvIHZhbHVlXG5cdCAqIEBwYXJhbSBbYlJlcGxhY2VdXG5cdCAqICAgV2hldGhlciBvbmx5IHRoZSBnaXZlbiB2YXJpYWJsZXMgYXJlIGtub3duIGluIHRoZSBuZXcgY2FsbGJhY2sgaW50ZXJmYWNlXG5cdCAqICAgaW5zdGFuY2UsIG5vIGluaGVyaXRlZCBvbmVzXG5cdCAqIEByZXR1cm5zXG5cdCAqICAgQSBjYWxsYmFjayBpbnRlcmZhY2UgaW5zdGFuY2Vcblx0ICogQHBhcmFtIG1WYXJpYWJsZXNcblx0ICogQHBhcmFtIGJSZXBsYWNlXG5cdCAqL1xuXHRcIndpdGhcIihtVmFyaWFibGVzPzogUmVjb3JkPHN0cmluZywgQ29udGV4dD4sIGJSZXBsYWNlPzogYm9vbGVhbik6IElWaXNpdG9yQ2FsbGJhY2s7XG59O1xuXG5mdW5jdGlvbiB2YWxpZGF0ZU1hY3JvTWV0YWRhdGFDb250ZXh0KFxuXHRzTmFtZTogc3RyaW5nLFxuXHRtQ29udGV4dHM6IFJlY29yZDxzdHJpbmcsIENvbnRleHQ+LFxuXHRvQ29udGV4dFNldHRpbmdzOiBCdWlsZGluZ0Jsb2NrTWV0YWRhdGFDb250ZXh0RGVmaW5pdGlvbixcblx0c0tleTogc3RyaW5nXG4pOiB2b2lkIHtcblx0Y29uc3Qgb0NvbnRleHQgPSBtQ29udGV4dHNbc0tleV07XG5cdGNvbnN0IG9Db250ZXh0T2JqZWN0ID0gb0NvbnRleHQ/LmdldE9iamVjdCgpIGFzIHtcblx0XHQkVHlwZT86IHN0cmluZztcblx0XHQka2luZD86IHN0cmluZztcblx0fTtcblxuXHRpZiAob0NvbnRleHRTZXR0aW5ncy5yZXF1aXJlZCA9PT0gdHJ1ZSAmJiAoIW9Db250ZXh0IHx8IG9Db250ZXh0T2JqZWN0ID09PSBudWxsKSkge1xuXHRcdHRocm93IG5ldyBFcnJvcihgJHtzTmFtZX06IFJlcXVpcmVkIG1ldGFkYXRhQ29udGV4dCAnJHtzS2V5fScgaXMgbWlzc2luZ2ApO1xuXHR9IGVsc2UgaWYgKG9Db250ZXh0T2JqZWN0KSB7XG5cdFx0Ly8gSWYgY29udGV4dCBvYmplY3QgaGFzICRraW5kIHByb3BlcnR5LCAkVHlwZSBzaG91bGQgbm90IGJlIGNoZWNrZWRcblx0XHQvLyBUaGVyZWZvcmUgcmVtb3ZlIGZyb20gY29udGV4dCBzZXR0aW5nc1xuXHRcdGlmIChvQ29udGV4dE9iamVjdC5oYXNPd25Qcm9wZXJ0eShcIiRraW5kXCIpICYmIG9Db250ZXh0T2JqZWN0LiRraW5kICE9PSB1bmRlZmluZWQgJiYgb0NvbnRleHRTZXR0aW5ncy5leHBlY3RlZFR5cGVzICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdC8vIENoZWNrIGlmIHRoZSAka2luZCBpcyBwYXJ0IG9mIHRoZSBhbGxvd2VkIG9uZXNcblx0XHRcdGlmICghb0NvbnRleHRTZXR0aW5ncy5leHBlY3RlZFR5cGVzLmluY2x1ZGVzKG9Db250ZXh0T2JqZWN0LiRraW5kKSkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXG5cdFx0XHRcdFx0YCR7c05hbWV9OiAnJHtzS2V5fScgbXVzdCBiZSAnJGtpbmQnICcke29Db250ZXh0U2V0dGluZ3MuZXhwZWN0ZWRUeXBlc30nIGJ1dCBpcyAnJHtcblx0XHRcdFx0XHRcdG9Db250ZXh0T2JqZWN0LiRraW5kXG5cdFx0XHRcdFx0fSc6ICR7b0NvbnRleHQuZ2V0UGF0aCgpfWBcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0b0NvbnRleHRPYmplY3QuaGFzT3duUHJvcGVydHkoXCIkVHlwZVwiKSAmJlxuXHRcdFx0b0NvbnRleHRPYmplY3QuJFR5cGUgIT09IHVuZGVmaW5lZCAmJlxuXHRcdFx0b0NvbnRleHRTZXR0aW5ncy5leHBlY3RlZEFubm90YXRpb25UeXBlc1xuXHRcdCkge1xuXHRcdFx0Ly8gQ2hlY2sgb25seSAkVHlwZVxuXHRcdFx0aWYgKCFvQ29udGV4dFNldHRpbmdzLmV4cGVjdGVkQW5ub3RhdGlvblR5cGVzLmluY2x1ZGVzKG9Db250ZXh0T2JqZWN0LiRUeXBlKSkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXG5cdFx0XHRcdFx0YCR7c05hbWV9OiAnJHtzS2V5fScgbXVzdCBiZSAnJFR5cGUnICcke29Db250ZXh0U2V0dGluZ3MuZXhwZWN0ZWRBbm5vdGF0aW9uVHlwZXN9JyBidXQgaXMgJyR7XG5cdFx0XHRcdFx0XHRvQ29udGV4dE9iamVjdC4kVHlwZVxuXHRcdFx0XHRcdH0nOiAke29Db250ZXh0LmdldFBhdGgoKX1gXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59XG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVNYWNyb1NpZ25hdHVyZShcblx0c05hbWU6IHN0cmluZyxcblx0b01ldGFkYXRhOiBUcmFuc2Zvcm1lZEJ1aWxkaW5nQmxvY2tNZXRhZGF0YSxcblx0bUNvbnRleHRzOiBSZWNvcmQ8c3RyaW5nLCBDb250ZXh0Pixcblx0b05vZGU6IEVsZW1lbnRcbik6IHZvaWQge1xuXHRjb25zdCBhTWV0YWRhdGFDb250ZXh0S2V5cyA9IChvTWV0YWRhdGEubWV0YWRhdGFDb250ZXh0cyAmJiBPYmplY3Qua2V5cyhvTWV0YWRhdGEubWV0YWRhdGFDb250ZXh0cykpIHx8IFtdLFxuXHRcdGFQcm9wZXJ0aWVzID0gKG9NZXRhZGF0YS5wcm9wZXJ0aWVzICYmIE9iamVjdC5rZXlzKG9NZXRhZGF0YS5wcm9wZXJ0aWVzKSkgfHwgW10sXG5cdFx0b0F0dHJpYnV0ZU5hbWVzOiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPiA9IHt9O1xuXG5cdC8vIGNvbGxlY3QgYWxsIGF0dHJpYnV0ZXMgdG8gZmluZCB1bmNoZWNrZWQgcHJvcGVydGllc1xuXHRjb25zdCBhdHRyaWJ1dGVOYW1lcyA9IG9Ob2RlLmdldEF0dHJpYnV0ZU5hbWVzKCk7XG5cdGZvciAoY29uc3QgYXR0cmlidXRlTmFtZSBvZiBhdHRyaWJ1dGVOYW1lcykge1xuXHRcdG9BdHRyaWJ1dGVOYW1lc1thdHRyaWJ1dGVOYW1lXSA9IHRydWU7XG5cdH1cblxuXHQvL0NoZWNrIG1ldGFkYXRhQ29udGV4dHNcblx0YU1ldGFkYXRhQ29udGV4dEtleXMuZm9yRWFjaChmdW5jdGlvbiAoc0tleSkge1xuXHRcdGNvbnN0IG9Db250ZXh0U2V0dGluZ3MgPSBvTWV0YWRhdGEubWV0YWRhdGFDb250ZXh0c1tzS2V5XTtcblxuXHRcdHZhbGlkYXRlTWFjcm9NZXRhZGF0YUNvbnRleHQoc05hbWUsIG1Db250ZXh0cywgb0NvbnRleHRTZXR0aW5ncywgc0tleSk7XG5cdFx0ZGVsZXRlIG9BdHRyaWJ1dGVOYW1lc1tzS2V5XTtcblx0fSk7XG5cdC8vQ2hlY2sgcHJvcGVydGllc1xuXHRhUHJvcGVydGllcy5mb3JFYWNoKGZ1bmN0aW9uIChzS2V5KSB7XG5cdFx0Y29uc3Qgb1Byb3BlcnR5U2V0dGluZ3MgPSBvTWV0YWRhdGEucHJvcGVydGllc1tzS2V5XTtcblx0XHRpZiAoIW9Ob2RlLmhhc0F0dHJpYnV0ZShzS2V5KSkge1xuXHRcdFx0aWYgKG9Qcm9wZXJ0eVNldHRpbmdzLnJlcXVpcmVkICYmICFvUHJvcGVydHlTZXR0aW5ncy5oYXNPd25Qcm9wZXJ0eShcImRlZmF1bHRWYWx1ZVwiKSkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYCR7c05hbWV9OiBgICsgYFJlcXVpcmVkIHByb3BlcnR5ICcke3NLZXl9JyBpcyBtaXNzaW5nYCk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdGRlbGV0ZSBvQXR0cmlidXRlTmFtZXNbc0tleV07XG5cdFx0fVxuXHR9KTtcblxuXHQvLyBVbmNoZWNrZWQgcHJvcGVydGllc1xuXHRPYmplY3Qua2V5cyhvQXR0cmlidXRlTmFtZXMpLmZvckVhY2goZnVuY3Rpb24gKHNLZXk6IHN0cmluZykge1xuXHRcdC8vIG5vIGNoZWNrIGZvciBwcm9wZXJ0aWVzIHdoaWNoIGNvbnRhaW4gYSBjb2xvbiBcIjpcIiAoZGlmZmVyZW50IG5hbWVzcGFjZSksIGUuZy4geG1sbnM6dHJhY2UsIHRyYWNlOm1hY3JvSUQsIHVuaXR0ZXN0OmlkXG5cdFx0aWYgKCFzS2V5LmluY2x1ZGVzKFwiOlwiKSAmJiAhc0tleS5zdGFydHNXaXRoKFwieG1sbnNcIikpIHtcblx0XHRcdExvZy53YXJuaW5nKGBVbmNoZWNrZWQgcGFyYW1ldGVyOiAke3NOYW1lfTogJHtzS2V5fWAsIHVuZGVmaW5lZCwgTE9HR0VSX1NDT1BFKTtcblx0XHR9XG5cdH0pO1xufVxuXG5jb25zdCBTQVBfVUlfQ09SRV9FTEVNRU5UID0gXCJzYXAudWkuY29yZS5FbGVtZW50XCI7XG5cbmV4cG9ydCBjb25zdCBTQVBfVUlfTU9ERUxfQ09OVEVYVCA9IFwic2FwLnVpLm1vZGVsLkNvbnRleHRcIjtcblxuLyoqXG4gKiBUcmFuc2Zvcm1zIHRoZSBtZXRhZGF0YSBvZiBhIGJ1aWxkaW5nIGJsb2NrIGJ5IGFkZGluZyBhZGRpdGlvbmFsIGFnZ3JlZ2F0aW9ucyxcbiAqIGFuZCBzcGxpdHRpbmcgcHJvcGVydGllcyBpbnRvIGFjdHVhbCBwcm9wZXJ0aWVzIGFuZCBtZXRhZGF0YSBjb250ZXh0cy5cbiAqIEBwYXJhbSBidWlsZGluZ0Jsb2NrTWV0YWRhdGEgVGhlIG1ldGFkYXRhIHJlY2VpdmVkIGZyb20gdGhlIGlucHV0XG4gKiBAcmV0dXJucyBUaGUgdHJhbnNmb3JtZWQgbWV0YWRhdGFcbiAqL1xuZnVuY3Rpb24gdHJhbnNmb3JtTWV0YWRhdGEoYnVpbGRpbmdCbG9ja01ldGFkYXRhOiBCdWlsZGluZ0Jsb2NrTWV0YWRhdGEpOiBUcmFuc2Zvcm1lZEJ1aWxkaW5nQmxvY2tNZXRhZGF0YSB7XG5cdGNvbnN0IHByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIEJ1aWxkaW5nQmxvY2tQcm9wZXJ0eURlZmluaXRpb24+ID0ge1xuXHRcdGNsYXNzOiB7XG5cdFx0XHR0eXBlOiBcInN0cmluZ1wiLFxuXHRcdFx0aXNQdWJsaWM6IHRydWVcblx0XHR9XG5cdH07XG5cdGNvbnN0IGFnZ3JlZ2F0aW9uczogUmVjb3JkPHN0cmluZywgQnVpbGRpbmdCbG9ja0FnZ3JlZ2F0aW9uRGVmaW5pdGlvbj4gPSB7XG5cdFx0ZGVwZW5kZW50czoge1xuXHRcdFx0dHlwZTogU0FQX1VJX0NPUkVfRUxFTUVOVCxcblx0XHRcdHNsb3Q6IFwiZGVwZW5kZW50c1wiLFxuXHRcdFx0aXNQdWJsaWM6IHRydWVcblx0XHR9LFxuXHRcdGN1c3RvbURhdGE6IHtcblx0XHRcdHR5cGU6IFNBUF9VSV9DT1JFX0VMRU1FTlQsXG5cdFx0XHRzbG90OiBcImN1c3RvbURhdGFcIixcblx0XHRcdGlzUHVibGljOiB0cnVlXG5cdFx0fSxcblx0XHRsYXlvdXREYXRhOiB7XG5cdFx0XHR0eXBlOiBTQVBfVUlfQ09SRV9FTEVNRU5ULFxuXHRcdFx0c2xvdDogXCJsYXlvdXREYXRhXCIsXG5cdFx0XHRpc1B1YmxpYzogdHJ1ZVxuXHRcdH0sXG5cdFx0Li4uYnVpbGRpbmdCbG9ja01ldGFkYXRhLmFnZ3JlZ2F0aW9uc1xuXHR9O1xuXHRjb25zdCBtZXRhZGF0YUNvbnRleHRzOiBSZWNvcmQ8c3RyaW5nLCBCdWlsZGluZ0Jsb2NrTWV0YWRhdGFDb250ZXh0RGVmaW5pdGlvbj4gPSB7fTtcblxuXHRmb3IgKGNvbnN0IHByb3BlcnR5TmFtZSBvZiBPYmplY3Qua2V5cyhidWlsZGluZ0Jsb2NrTWV0YWRhdGEucHJvcGVydGllcykpIHtcblx0XHRjb25zdCBwcm9wZXJ0eVR5cGUgPSBidWlsZGluZ0Jsb2NrTWV0YWRhdGEucHJvcGVydGllc1twcm9wZXJ0eU5hbWVdLnR5cGU7XG5cblx0XHRpZiAocHJvcGVydHlUeXBlICE9PSBTQVBfVUlfTU9ERUxfQ09OVEVYVCkge1xuXHRcdFx0cHJvcGVydGllc1twcm9wZXJ0eU5hbWVdID0gYnVpbGRpbmdCbG9ja01ldGFkYXRhLnByb3BlcnRpZXNbcHJvcGVydHlOYW1lXTtcblx0XHR9XG5cblx0XHRpZiAoW1NBUF9VSV9NT0RFTF9DT05URVhULCBcIm9iamVjdFwiLCBcImFycmF5XCJdLmluY2x1ZGVzKHByb3BlcnR5VHlwZSkpIHtcblx0XHRcdC8vIEV4cGxpY2l0bHkgZGVmaW5lZCBjb250ZXh0cywgb2JqZWN0cywgYW5kIGFycmF5cyBtYXkgY29tZSBmcm9tIHRoZSBtZXRhZGF0YUNvbnRleHRcblx0XHRcdG1ldGFkYXRhQ29udGV4dHNbcHJvcGVydHlOYW1lXSA9IGJ1aWxkaW5nQmxvY2tNZXRhZGF0YS5wcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV0gYXMgQnVpbGRpbmdCbG9ja01ldGFkYXRhQ29udGV4dERlZmluaXRpb247XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIHtcblx0XHQuLi5idWlsZGluZ0Jsb2NrTWV0YWRhdGEsXG5cdFx0cHJvcGVydGllcyxcblx0XHRtZXRhZGF0YUNvbnRleHRzLFxuXHRcdGFnZ3JlZ2F0aW9uc1xuXHR9O1xufVxuXG4vKipcbiAqIENoZWNrcyB0aGUgYWJzb2x1dGUgb3IgY29udGV4dCBwYXRocyBhbmQgcmV0dXJucyBhbiBhcHByb3ByaWF0ZSBNZXRhQ29udGV4dC5cbiAqIEBwYXJhbSBvU2V0dGluZ3MgQWRkaXRpb25hbCBzZXR0aW5nc1xuICogQHBhcmFtIHNBdHRyaWJ1dGVWYWx1ZSBUaGUgYXR0cmlidXRlIHZhbHVlXG4gKiBAcmV0dXJucyBUaGUgbWV0YSBkYXRhIGNvbnRleHQgb2JqZWN0XG4gKi9cbmZ1bmN0aW9uIF9jaGVja0Fic29sdXRlQW5kQ29udGV4dFBhdGhzKG9TZXR0aW5nczogVGVtcGxhdGVQcm9jZXNzb3JTZXR0aW5ncywgc0F0dHJpYnV0ZVZhbHVlOiBzdHJpbmcpOiBNZXRhRGF0YUNvbnRleHQge1xuXHRsZXQgc01ldGFQYXRoOiBzdHJpbmc7XG5cdGlmIChzQXR0cmlidXRlVmFsdWUgJiYgc0F0dHJpYnV0ZVZhbHVlLnN0YXJ0c1dpdGgoXCIvXCIpKSB7XG5cdFx0Ly8gYWJzb2x1dGUgcGF0aCAtIHdlIGp1c3QgdXNlIHRoaXMgb25lXG5cdFx0c01ldGFQYXRoID0gc0F0dHJpYnV0ZVZhbHVlO1xuXHR9IGVsc2Uge1xuXHRcdGxldCBzQ29udGV4dFBhdGggPSBvU2V0dGluZ3MuY3VycmVudENvbnRleHRQYXRoLmdldFBhdGgoKTtcblx0XHRpZiAoIXNDb250ZXh0UGF0aC5lbmRzV2l0aChcIi9cIikpIHtcblx0XHRcdHNDb250ZXh0UGF0aCArPSBcIi9cIjtcblx0XHR9XG5cdFx0c01ldGFQYXRoID0gc0NvbnRleHRQYXRoICsgc0F0dHJpYnV0ZVZhbHVlO1xuXHR9XG5cdHJldHVybiB7XG5cdFx0bW9kZWw6IFwibWV0YU1vZGVsXCIsXG5cdFx0cGF0aDogc01ldGFQYXRoXG5cdH07XG59XG5cbi8qKlxuICogVGhpcyBtZXRob2QgaGVscHMgdG8gY3JlYXRlIHRoZSBtZXRhZGF0YSBjb250ZXh0IGluIGNhc2UgaXQgaXMgbm90IHlldCBhdmFpbGFibGUgaW4gdGhlIHN0b3JlLlxuICogQHBhcmFtIG9TZXR0aW5ncyBBZGRpdGlvbmFsIHNldHRpbmdzXG4gKiBAcGFyYW0gc0F0dHJpYnV0ZU5hbWUgVGhlIGF0dHJpYnV0ZSBuYW1lXG4gKiBAcGFyYW0gc0F0dHJpYnV0ZVZhbHVlIFRoZSBhdHRyaWJ1dGUgdmFsdWVcbiAqIEByZXR1cm5zIFRoZSBtZXRhIGRhdGEgY29udGV4dCBvYmplY3RcbiAqL1xuZnVuY3Rpb24gX2NyZWF0ZUluaXRpYWxNZXRhZGF0YUNvbnRleHQoXG5cdG9TZXR0aW5nczogVGVtcGxhdGVQcm9jZXNzb3JTZXR0aW5ncyxcblx0c0F0dHJpYnV0ZU5hbWU6IHN0cmluZyxcblx0c0F0dHJpYnV0ZVZhbHVlOiBzdHJpbmdcbik6IE1ldGFEYXRhQ29udGV4dCB7XG5cdGxldCByZXR1cm5Db250ZXh0OiBNZXRhRGF0YUNvbnRleHQ7XG5cdGlmIChzQXR0cmlidXRlVmFsdWUuc3RhcnRzV2l0aChcIi91aWQtLVwiKSAmJiAhb1NldHRpbmdzLm1vZGVscy5jb252ZXJ0ZXJDb250ZXh0LmdldFByb3BlcnR5KHNBdHRyaWJ1dGVWYWx1ZSkpIHtcblx0XHRjb25zdCBkYXRhID0gdW5zdG9yZU9iamVjdFZhbHVlKHNBdHRyaWJ1dGVWYWx1ZSk7XG5cdFx0b1NldHRpbmdzLm1vZGVscy5jb252ZXJ0ZXJDb250ZXh0LnNldFByb3BlcnR5KHNBdHRyaWJ1dGVWYWx1ZSwgZGF0YSk7XG5cdFx0cmV0dXJuQ29udGV4dCA9IHtcblx0XHRcdG1vZGVsOiBcImNvbnZlcnRlckNvbnRleHRcIixcblx0XHRcdHBhdGg6IHNBdHRyaWJ1dGVWYWx1ZVxuXHRcdH07XG5cdH0gZWxzZSBpZiAoKHNBdHRyaWJ1dGVOYW1lID09PSBcIm1ldGFQYXRoXCIgJiYgb1NldHRpbmdzLmN1cnJlbnRDb250ZXh0UGF0aCkgfHwgc0F0dHJpYnV0ZU5hbWUgPT09IFwiY29udGV4dFBhdGhcIikge1xuXHRcdHJldHVybkNvbnRleHQgPSBfY2hlY2tBYnNvbHV0ZUFuZENvbnRleHRQYXRocyhvU2V0dGluZ3MsIHNBdHRyaWJ1dGVWYWx1ZSk7XG5cdH0gZWxzZSBpZiAoc0F0dHJpYnV0ZVZhbHVlICYmIHNBdHRyaWJ1dGVWYWx1ZS5zdGFydHNXaXRoKFwiL1wiKSkge1xuXHRcdC8vIGFic29sdXRlIHBhdGggLSB3ZSBqdXN0IHVzZSB0aGlzIG9uZVxuXHRcdHJldHVybkNvbnRleHQgPSB7XG5cdFx0XHRtb2RlbDogXCJtZXRhTW9kZWxcIixcblx0XHRcdHBhdGg6IHNBdHRyaWJ1dGVWYWx1ZVxuXHRcdH07XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuQ29udGV4dCA9IHtcblx0XHRcdG1vZGVsOiBcIm1ldGFNb2RlbFwiLFxuXHRcdFx0cGF0aDogb1NldHRpbmdzLmJpbmRpbmdDb250ZXh0cy5lbnRpdHlTZXQgPyBvU2V0dGluZ3MuYmluZGluZ0NvbnRleHRzLmVudGl0eVNldC5nZXRQYXRoKHNBdHRyaWJ1dGVWYWx1ZSkgOiBzQXR0cmlidXRlVmFsdWVcblx0XHR9O1xuXHR9XG5cdHJldHVybiByZXR1cm5Db250ZXh0O1xufVxuXG5mdW5jdGlvbiBfZ2V0TWV0YWRhdGFDb250ZXh0KFxuXHRvU2V0dGluZ3M6IFRlbXBsYXRlUHJvY2Vzc29yU2V0dGluZ3MsXG5cdG9Ob2RlOiBFbGVtZW50LFxuXHRzQXR0cmlidXRlTmFtZTogc3RyaW5nLFxuXHRvVmlzaXRvcjogSVZpc2l0b3JDYWxsYmFjayxcblx0YkRvTm90UmVzb2x2ZTogYm9vbGVhbixcblx0aXNPcGVuOiBib29sZWFuXG4pOiBNZXRhRGF0YUNvbnRleHQgfCB1bmRlZmluZWQge1xuXHRsZXQgb01ldGFkYXRhQ29udGV4dDogTWV0YURhdGFDb250ZXh0IHwgdW5kZWZpbmVkO1xuXHRpZiAoIWJEb05vdFJlc29sdmUgJiYgb05vZGUuaGFzQXR0cmlidXRlKHNBdHRyaWJ1dGVOYW1lKSkge1xuXHRcdGNvbnN0IHNBdHRyaWJ1dGVWYWx1ZSA9IG9Ob2RlLmdldEF0dHJpYnV0ZShzQXR0cmlidXRlTmFtZSkgYXMgc3RyaW5nO1xuXHRcdG9NZXRhZGF0YUNvbnRleHQgPSBCaW5kaW5nUGFyc2VyLmNvbXBsZXhQYXJzZXIoc0F0dHJpYnV0ZVZhbHVlKTtcblx0XHRpZiAoIW9NZXRhZGF0YUNvbnRleHQpIHtcblx0XHRcdG9NZXRhZGF0YUNvbnRleHQgPSBfY3JlYXRlSW5pdGlhbE1ldGFkYXRhQ29udGV4dChvU2V0dGluZ3MsIHNBdHRyaWJ1dGVOYW1lLCBzQXR0cmlidXRlVmFsdWUpO1xuXHRcdH1cblx0fSBlbHNlIGlmIChvU2V0dGluZ3MuYmluZGluZ0NvbnRleHRzLmhhc093blByb3BlcnR5KHNBdHRyaWJ1dGVOYW1lKSkge1xuXHRcdG9NZXRhZGF0YUNvbnRleHQgPSB7XG5cdFx0XHRtb2RlbDogc0F0dHJpYnV0ZU5hbWUsXG5cdFx0XHRwYXRoOiBcIlwiXG5cdFx0fTtcblx0fSBlbHNlIGlmIChpc09wZW4pIHtcblx0XHR0cnkge1xuXHRcdFx0aWYgKG9WaXNpdG9yLmdldENvbnRleHQoYCR7c0F0dHJpYnV0ZU5hbWV9PmApKSB7XG5cdFx0XHRcdG9NZXRhZGF0YUNvbnRleHQgPSB7XG5cdFx0XHRcdFx0bW9kZWw6IHNBdHRyaWJ1dGVOYW1lLFxuXHRcdFx0XHRcdHBhdGg6IFwiXCJcblx0XHRcdFx0fTtcblx0XHRcdH1cblx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gb01ldGFkYXRhQ29udGV4dDtcbn1cblxuLyoqXG4gKiBQYXJzZSB0aGUgaW5jb21pbmcgWE1MIG5vZGUgYW5kIHRyeSB0byByZXNvbHZlIHRoZSBwcm9wZXJ0aWVzIGRlZmluZWQgdGhlcmUuXG4gKiBAcGFyYW0gb01ldGFkYXRhIFRoZSBtZXRhZGF0YSBmb3IgdGhlIGJ1aWxkaW5nIGJsb2NrXG4gKiBAcGFyYW0gb05vZGUgVGhlIFhNTCBub2RlIHRvIHBhcnNlXG4gKiBAcGFyYW0gaXNQdWJsaWMgV2hldGhlciB0aGUgYnVpbGRpbmcgYmxvY2sgaXMgdXNlZCBpbiBhIHB1YmxpYyBjb250ZXh0IG9yIG5vdFxuICogQHBhcmFtIG9WaXNpdG9yIFRoZSB2aXNpdG9yIGluc3RhbmNlXG4gKiBAcmV0dXJucyBUaGUgcHJvY2Vzc2VkIHByb3BlcnRpZXNcbiAqL1xuYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc1Byb3BlcnRpZXMoXG5cdG9NZXRhZGF0YTogVHJhbnNmb3JtZWRCdWlsZGluZ0Jsb2NrTWV0YWRhdGEsXG5cdG9Ob2RlOiBFbGVtZW50LFxuXHRpc1B1YmxpYzogYm9vbGVhbixcblx0b1Zpc2l0b3I6IElWaXNpdG9yQ2FsbGJhY2tcbik6IFByb21pc2U8UmVjb3JkPHN0cmluZywgT2JqZWN0VmFsdWU+PiB7XG5cdGNvbnN0IGRlZmluaXRpb25Qcm9wZXJ0aWVzID0gb01ldGFkYXRhLnByb3BlcnRpZXM7XG5cblx0Ly8gUmV0cmlldmUgcHJvcGVydGllcyB2YWx1ZXNcblx0Y29uc3QgYURlZmluaXRpb25Qcm9wZXJ0aWVzS2V5cyA9IE9iamVjdC5rZXlzKGRlZmluaXRpb25Qcm9wZXJ0aWVzKTtcblxuXHRjb25zdCBwcm9wZXJ0eVZhbHVlczogUmVjb3JkPHN0cmluZywgT2JqZWN0VmFsdWU+ID0ge307XG5cdGZvciAoY29uc3Qgc0tleVZhbHVlIG9mIGFEZWZpbml0aW9uUHJvcGVydGllc0tleXMpIHtcblx0XHRpZiAoZGVmaW5pdGlvblByb3BlcnRpZXNbc0tleVZhbHVlXS50eXBlID09PSBcIm9iamVjdFwiKSB7XG5cdFx0XHRwcm9wZXJ0eVZhbHVlc1tzS2V5VmFsdWVdID1cblx0XHRcdFx0ZGVmaW5pdGlvblByb3BlcnRpZXNbc0tleVZhbHVlXS5kZWZhdWx0VmFsdWUgJiYgZGVlcENsb25lKGRlZmluaXRpb25Qcm9wZXJ0aWVzW3NLZXlWYWx1ZV0uZGVmYXVsdFZhbHVlKTsgLy8gVG8gYXZvaWQgdmFsdWVzIGJlaW5nIHJldXNlZCBhY3Jvc3MgbWFjcm9zXG5cdFx0fSBlbHNlIHtcblx0XHRcdHByb3BlcnR5VmFsdWVzW3NLZXlWYWx1ZV0gPSBkZWZpbml0aW9uUHJvcGVydGllc1tzS2V5VmFsdWVdLmRlZmF1bHRWYWx1ZSBhcyBzdHJpbmcgfCBib29sZWFuIHwgbnVtYmVyO1xuXHRcdH1cblxuXHRcdGlmIChvTm9kZS5oYXNBdHRyaWJ1dGUoc0tleVZhbHVlKSAmJiBpc1B1YmxpYyAmJiBkZWZpbml0aW9uUHJvcGVydGllc1tzS2V5VmFsdWVdLmlzUHVibGljICE9PSB0cnVlKSB7XG5cdFx0XHRMb2cuZXJyb3IoYFByb3BlcnR5ICR7c0tleVZhbHVlfSB3YXMgaWdub3JlZCBhcyBpdCBpcyBub3QgaW50ZW5kZWQgZm9yIHB1YmxpYyB1c2FnZWApO1xuXHRcdH0gZWxzZSBpZiAob05vZGUuaGFzQXR0cmlidXRlKHNLZXlWYWx1ZSkpIHtcblx0XHRcdGF3YWl0IG9WaXNpdG9yLnZpc2l0QXR0cmlidXRlKG9Ob2RlLCBvTm9kZS5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbShzS2V5VmFsdWUpIGFzIEF0dHIpO1xuXHRcdFx0bGV0IHZhbHVlOiBzdHJpbmcgfCBib29sZWFuIHwgbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCA9IG9Ob2RlLmdldEF0dHJpYnV0ZShzS2V5VmFsdWUpO1xuXHRcdFx0aWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IG51bGwpIHtcblx0XHRcdFx0aWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiAmJiAhdmFsdWUuc3RhcnRzV2l0aChcIntcIikpIHtcblx0XHRcdFx0XHRzd2l0Y2ggKGRlZmluaXRpb25Qcm9wZXJ0aWVzW3NLZXlWYWx1ZV0udHlwZSkge1xuXHRcdFx0XHRcdFx0Y2FzZSBcImJvb2xlYW5cIjpcblx0XHRcdFx0XHRcdFx0dmFsdWUgPSB2YWx1ZSA9PT0gXCJ0cnVlXCI7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0Y2FzZSBcIm51bWJlclwiOlxuXHRcdFx0XHRcdFx0XHR2YWx1ZSA9IE51bWJlcih2YWx1ZSk7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHR2YWx1ZSA9IHZhbHVlID09PSBudWxsID8gdW5kZWZpbmVkIDogdmFsdWU7XG5cdFx0XHRcdHByb3BlcnR5VmFsdWVzW3NLZXlWYWx1ZV0gPSB2YWx1ZTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0cmV0dXJuIHByb3BlcnR5VmFsdWVzO1xufVxuXG4vKipcbiAqIFBhcnNlIHRoZSBpbmNvbWluZyBYTUwgbm9kZSBhbmQgdHJ5IHRvIHJlc29sdmUgdGhlIGJpbmRpbmcgY29udGV4dHMgZGVmaW5lZCBpbnNpZGUuXG4gKiBAcGFyYW0gb01ldGFkYXRhIFRoZSBtZXRhZGF0YSBmb3IgdGhlIGJ1aWxkaW5nIGJsb2NrXG4gKiBAcGFyYW0gb1NldHRpbmdzIFRoZSBzZXR0aW5ncyBvYmplY3RcbiAqIEBwYXJhbSBvTm9kZSBUaGUgWE1MIG5vZGUgdG8gcGFyc2VcbiAqIEBwYXJhbSBpc1B1YmxpYyBXaGV0aGVyIHRoZSBidWlsZGluZyBibG9jayBpcyB1c2VkIGluIGEgcHVibGljIGNvbnRleHQgb3Igbm90XG4gKiBAcGFyYW0gb1Zpc2l0b3IgVGhlIHZpc2l0b3IgaW5zdGFuY2VcbiAqIEBwYXJhbSBtQ29udGV4dHMgVGhlIGNvbnRleHRzIHRvIGJlIHVzZWRcbiAqIEBwYXJhbSBwcm9wZXJ0eVZhbHVlcyBUaGUgY3VycmVudCBwcm9wZXJ0eSB2YWx1ZXNcbiAqIEByZXR1cm5zIFRoZSBwcm9jZXNzZWQgYW5kIG1pc3NpbmcgY29udGV4dHNcbiAqL1xuZnVuY3Rpb24gcHJvY2Vzc0NvbnRleHRzKFxuXHRvTWV0YWRhdGE6IFRyYW5zZm9ybWVkQnVpbGRpbmdCbG9ja01ldGFkYXRhLFxuXHRvU2V0dGluZ3M6IFRlbXBsYXRlUHJvY2Vzc29yU2V0dGluZ3MsXG5cdG9Ob2RlOiBFbGVtZW50LFxuXHRpc1B1YmxpYzogYm9vbGVhbixcblx0b1Zpc2l0b3I6IElWaXNpdG9yQ2FsbGJhY2ssXG5cdG1Db250ZXh0czogUmVjb3JkPHN0cmluZywgQ29udGV4dD4sXG5cdHByb3BlcnR5VmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCBPYmplY3RWYWx1ZT5cbik6IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+IHtcblx0b1NldHRpbmdzLmN1cnJlbnRDb250ZXh0UGF0aCA9IG9TZXR0aW5ncy5iaW5kaW5nQ29udGV4dHMuY29udGV4dFBhdGg7XG5cdGNvbnN0IG1NaXNzaW5nQ29udGV4dDogUmVjb3JkPHN0cmluZywgYm9vbGVhbj4gPSB7fTtcblx0Y29uc3Qgb0RlZmluaXRpb25Db250ZXh0cyA9IG9NZXRhZGF0YS5tZXRhZGF0YUNvbnRleHRzO1xuXHRjb25zdCBhRGVmaW5pdGlvbkNvbnRleHRzS2V5cyA9IE9iamVjdC5rZXlzKG9EZWZpbml0aW9uQ29udGV4dHMpO1xuXHQvLyBTaW5jZSB0aGUgbWV0YVBhdGggYW5kIG90aGVyIHByb3BlcnR5IGNhbiBiZSByZWxhdGl2ZSB0byB0aGUgY29udGV4dFBhdGggd2UgbmVlZCB0byBldmFsdWF0ZSB0aGUgY3VycmVudCBjb250ZXh0UGF0aCBmaXJzdFxuXHRjb25zdCBjb250ZXh0UGF0aEluZGV4ID0gYURlZmluaXRpb25Db250ZXh0c0tleXMuaW5kZXhPZihcImNvbnRleHRQYXRoXCIpO1xuXHRpZiAoY29udGV4dFBhdGhJbmRleCAhPT0gLTEpIHtcblx0XHQvLyBJZiBpdCBpcyBkZWZpbmVkIHdlIGV4dHJhY3QgaXQgYW5kIHJlaW5zZXJ0IGl0IGluIHRoZSBmaXJzdCBwb3NpdGlvbiBvZiB0aGUgYXJyYXlcblx0XHRjb25zdCBjb250ZXh0UGF0aERlZmluaXRpb24gPSBhRGVmaW5pdGlvbkNvbnRleHRzS2V5cy5zcGxpY2UoY29udGV4dFBhdGhJbmRleCwgMSk7XG5cdFx0YURlZmluaXRpb25Db250ZXh0c0tleXMuc3BsaWNlKDAsIDAsIGNvbnRleHRQYXRoRGVmaW5pdGlvblswXSk7XG5cdH1cblx0Zm9yIChjb25zdCBzQXR0cmlidXRlTmFtZSBvZiBhRGVmaW5pdGlvbkNvbnRleHRzS2V5cykge1xuXHRcdC8vIElmIHRoZSBjb250ZXh0IHdhcyByZXNvbHZlZCBhcyBhIHByb3BlcnR5IChiaW5kaW5nIC8geG1sIGFnZ3JlZ2F0aW9uKSB0aGVuIHdlIGRvbid0IG5lZWQgdG8gcmVzb2x2ZSBpdCBoZXJlLlxuXHRcdGNvbnN0IHByb3BlcnR5VmFsdWUgPSBwcm9wZXJ0eVZhbHVlc1tzQXR0cmlidXRlTmFtZV07XG5cdFx0aWYgKHByb3BlcnR5VmFsdWUgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgcHJvcGVydHlWYWx1ZSA9PT0gXCJvYmplY3RcIiAmJiBPYmplY3Qua2V5cyhwcm9wZXJ0eVZhbHVlIGFzIG9iamVjdCkubGVuZ3RoID4gMCkge1xuXHRcdFx0ZGVsZXRlIG9NZXRhZGF0YS5tZXRhZGF0YUNvbnRleHRzW3NBdHRyaWJ1dGVOYW1lXTtcblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblx0XHRjb25zdCBiRG9Ob3RSZXNvbHZlID0gaXNQdWJsaWMgJiYgb0RlZmluaXRpb25Db250ZXh0c1tzQXR0cmlidXRlTmFtZV0uaXNQdWJsaWMgPT09IGZhbHNlICYmIG9Ob2RlLmhhc0F0dHJpYnV0ZShzQXR0cmlidXRlTmFtZSk7XG5cdFx0Y29uc3Qgb01ldGFkYXRhQ29udGV4dCA9IF9nZXRNZXRhZGF0YUNvbnRleHQob1NldHRpbmdzLCBvTm9kZSwgc0F0dHJpYnV0ZU5hbWUsIG9WaXNpdG9yLCBiRG9Ob3RSZXNvbHZlLCBvTWV0YWRhdGEuaXNPcGVuID8/IGZhbHNlKTtcblx0XHRpZiAob01ldGFkYXRhQ29udGV4dCkge1xuXHRcdFx0b01ldGFkYXRhQ29udGV4dC5uYW1lID0gc0F0dHJpYnV0ZU5hbWU7XG5cdFx0XHRhZGRTaW5nbGVDb250ZXh0KG1Db250ZXh0cywgb1Zpc2l0b3IsIG9NZXRhZGF0YUNvbnRleHQpO1xuXHRcdFx0aWYgKFxuXHRcdFx0XHQoc0F0dHJpYnV0ZU5hbWUgPT09IFwiZW50aXR5U2V0XCIgfHwgc0F0dHJpYnV0ZU5hbWUgPT09IFwiY29udGV4dFBhdGhcIikgJiZcblx0XHRcdFx0IW9TZXR0aW5ncy5iaW5kaW5nQ29udGV4dHMuaGFzT3duUHJvcGVydHkoc0F0dHJpYnV0ZU5hbWUpXG5cdFx0XHQpIHtcblx0XHRcdFx0b1NldHRpbmdzLmJpbmRpbmdDb250ZXh0c1tzQXR0cmlidXRlTmFtZV0gPSBtQ29udGV4dHNbc0F0dHJpYnV0ZU5hbWVdO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHNBdHRyaWJ1dGVOYW1lID09PSBcImNvbnRleHRQYXRoXCIpIHtcblx0XHRcdFx0b1NldHRpbmdzLmN1cnJlbnRDb250ZXh0UGF0aCA9IG1Db250ZXh0c1tzQXR0cmlidXRlTmFtZV07XG5cdFx0XHR9XG5cdFx0XHRpZiAobUNvbnRleHRzW3NBdHRyaWJ1dGVOYW1lXSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHByb3BlcnR5VmFsdWVzW3NBdHRyaWJ1dGVOYW1lXSA9IG1Db250ZXh0c1tzQXR0cmlidXRlTmFtZV07XG5cdFx0XHR9IGVsc2UgaWYgKHR5cGVvZiBwcm9wZXJ0eVZhbHVlc1tzQXR0cmlidXRlTmFtZV0gPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdFx0Ly8gSWYgdGhlIGJpbmRpbmcgY291bGRuJ3QgYmUgcmVzb2x2ZWQgY29uc2lkZXIgdGhhdCB0aGVyZSB3YXMgbm8gdmFsdWUgaGVyZVxuXHRcdFx0XHRkZWxldGUgb01ldGFkYXRhLm1ldGFkYXRhQ29udGV4dHNbc0F0dHJpYnV0ZU5hbWVdO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRtTWlzc2luZ0NvbnRleHRbc0F0dHJpYnV0ZU5hbWVdID0gdHJ1ZTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIG1NaXNzaW5nQ29udGV4dDtcbn1cblxuZXhwb3J0IHR5cGUgQnVpbGRpbmdCbG9ja0FnZ3JlZ2F0aW9uID0ge1xuXHRrZXk6IHN0cmluZztcblx0cG9zaXRpb246IFBvc2l0aW9uO1xuXHR0eXBlOiBcIlNsb3RcIjtcbn07XG5mdW5jdGlvbiBwYXJzZUFnZ3JlZ2F0aW9uKG9BZ2dyZWdhdGlvbj86IEVsZW1lbnQsIHByb2Nlc3NBZ2dyZWdhdGlvbnM/OiBGdW5jdGlvbik6IFJlY29yZDxzdHJpbmcsIEJ1aWxkaW5nQmxvY2tBZ2dyZWdhdGlvbj4ge1xuXHRjb25zdCBvT3V0T2JqZWN0czogUmVjb3JkPHN0cmluZywgQnVpbGRpbmdCbG9ja0FnZ3JlZ2F0aW9uPiA9IHt9O1xuXHRpZiAob0FnZ3JlZ2F0aW9uICYmIG9BZ2dyZWdhdGlvbi5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG5cdFx0Y29uc3QgY2hpbGRyZW4gPSBvQWdncmVnYXRpb24uY2hpbGRyZW47XG5cdFx0Zm9yIChsZXQgY2hpbGRJZHggPSAwOyBjaGlsZElkeCA8IGNoaWxkcmVuLmxlbmd0aDsgY2hpbGRJZHgrKykge1xuXHRcdFx0Y29uc3QgY2hpbGREZWZpbml0aW9uID0gY2hpbGRyZW5bY2hpbGRJZHhdO1xuXHRcdFx0bGV0IGNoaWxkS2V5ID0gY2hpbGREZWZpbml0aW9uLmdldEF0dHJpYnV0ZShcImtleVwiKSB8fCBjaGlsZERlZmluaXRpb24uZ2V0QXR0cmlidXRlKFwiaWRcIik7XG5cdFx0XHRpZiAoY2hpbGRLZXkpIHtcblx0XHRcdFx0Y2hpbGRLZXkgPSBgSW5saW5lWE1MXyR7Y2hpbGRLZXl9YDtcblx0XHRcdFx0Y2hpbGREZWZpbml0aW9uLnNldEF0dHJpYnV0ZShcImtleVwiLCBjaGlsZEtleSk7XG5cdFx0XHRcdGxldCBhZ2dyZWdhdGlvbk9iamVjdDogQnVpbGRpbmdCbG9ja0FnZ3JlZ2F0aW9uID0ge1xuXHRcdFx0XHRcdGtleTogY2hpbGRLZXksXG5cdFx0XHRcdFx0cG9zaXRpb246IHtcblx0XHRcdFx0XHRcdHBsYWNlbWVudDogKGNoaWxkRGVmaW5pdGlvbi5nZXRBdHRyaWJ1dGUoXCJwbGFjZW1lbnRcIikgYXMgUGxhY2VtZW50KSB8fCBQbGFjZW1lbnQuQWZ0ZXIsXG5cdFx0XHRcdFx0XHRhbmNob3I6IGNoaWxkRGVmaW5pdGlvbi5nZXRBdHRyaWJ1dGUoXCJhbmNob3JcIikgfHwgdW5kZWZpbmVkXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR0eXBlOiBcIlNsb3RcIlxuXHRcdFx0XHR9O1xuXHRcdFx0XHRpZiAocHJvY2Vzc0FnZ3JlZ2F0aW9ucykge1xuXHRcdFx0XHRcdGFnZ3JlZ2F0aW9uT2JqZWN0ID0gcHJvY2Vzc0FnZ3JlZ2F0aW9ucyhjaGlsZERlZmluaXRpb24sIGFnZ3JlZ2F0aW9uT2JqZWN0KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRvT3V0T2JqZWN0c1thZ2dyZWdhdGlvbk9iamVjdC5rZXldID0gYWdncmVnYXRpb25PYmplY3Q7XG5cdFx0XHR9IGVsc2UgaWYgKGNoaWxkRGVmaW5pdGlvbi50YWdOYW1lICE9PSBcInNsb3RcIikge1xuXHRcdFx0XHRMb2cuZXJyb3IoYFRoZSBhZ2dyZWdhdGlvbiAke2NoaWxkRGVmaW5pdGlvbi5ub2RlTmFtZX0gaXMgbWlzc2luZyBhIEtleSBhdHRyaWJ1dGUuIEl0IGlzIG5vdCBkaXNwbGF5ZWRgKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0cmV0dXJuIG9PdXRPYmplY3RzO1xufVxuXG4vKipcbiAqIFByb2Nlc3NlcyB0aGUgY2hpbGQgbm9kZXMgb2YgdGhlIGJ1aWxkaW5nIGJsb2NrIHByb3BlcnRpZXMgd2hlbiB0aGUgdHlwZSBpcyBhbiBvYmplY3QuXG4gKiBAcGFyYW0gZWxlbWVudCBUaGUgWE1MIGVsZW1lbnQgdG8gcGFyc2VcbiAqIEByZXR1cm5zIFRoZSBwcm9jZXNzZWQgb2JqZWN0XG4gKi9cbmZ1bmN0aW9uIHByb2Nlc3NPYmplY3QoZWxlbWVudDogRWxlbWVudCk6IG9iamVjdCB7XG5cdGNvbnN0IGNoaWxkcmVuID0gZWxlbWVudC5jaGlsZHJlbjtcblx0Y29uc3QgbXlBcnJheTogQXJyYXk8dW5rbm93bj4gPSBbXTtcblx0Y29uc3QgbXlPYmplY3Q6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG5cdGZvciAoY29uc3QgYXR0cmlidXRlTmFtZSBvZiBlbGVtZW50LmdldEF0dHJpYnV0ZU5hbWVzKCkpIHtcblx0XHRteU9iamVjdFthdHRyaWJ1dGVOYW1lXSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpO1xuXHR9XG5cdGlmIChjaGlsZHJlbi5sZW5ndGggPiAwKSB7XG5cdFx0Y29uc3QgY2hpbGROb2RlTmFtZXMgPSBPYmplY3Qua2V5cyhjaGlsZHJlbikubWFwKChrZXkpID0+IGNoaWxkcmVuW2tleSBhcyB1bmtub3duIGFzIG51bWJlcl0ubG9jYWxOYW1lKTtcblx0XHRjb25zdCBjaGlsZElzQXJyYXkgPSBjaGlsZE5vZGVOYW1lcy5sZW5ndGggIT09IG5ldyBTZXQoY2hpbGROb2RlTmFtZXMpLnNpemU7XG5cdFx0Zm9yIChjb25zdCBjaGlsZERlZmluaXRpb24gb2YgY2hpbGRyZW4gYXMgdW5rbm93biBhcyBBcnJheTxFbGVtZW50Pikge1xuXHRcdFx0aWYgKGNoaWxkSXNBcnJheSkge1xuXHRcdFx0XHRteUFycmF5LnB1c2gocHJvY2Vzc09iamVjdChjaGlsZERlZmluaXRpb24pKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG15T2JqZWN0W2NoaWxkRGVmaW5pdGlvbi5sb2NhbE5hbWVdID0gcHJvY2Vzc09iamVjdChjaGlsZERlZmluaXRpb24pO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAoY2hpbGRJc0FycmF5KSB7XG5cdFx0XHRyZXR1cm4gbXlBcnJheTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIG15T2JqZWN0O1xufVxuXG4vKipcbiAqIFByb2Nlc3NlcyB0aGUgY2hpbGQgbm9kZXMgb2YgdGhlIGJ1aWxkaW5nIGJsb2NrIGFuZCBwYXJzZXMgdGhlbSBhcyBlaXRoZXIgYWdncmVnYXRpb25zIG9yIG9iamVjdC0vYXJyYXktYmFzZWQgdmFsdWVzLlxuICogQHBhcmFtIG9Ob2RlIFRoZSBYTUwgbm9kZSBmb3Igd2hpY2ggdG8gcHJvY2VzcyB0aGUgY2hpbGRyZW5cbiAqIEBwYXJhbSBvVmlzaXRvciBUaGUgdmlzaXRvciBpbnN0YW5jZVxuICogQHBhcmFtIG9NZXRhZGF0YSBUaGUgbWV0YWRhdGEgZm9yIHRoZSBidWlsZGluZyBibG9ja1xuICogQHBhcmFtIGlzUHVibGljIFdoZXRoZXIgdGhlIGJ1aWxkaW5nIGJsb2NrIGlzIHVzZWQgaW4gYSBwdWJsaWMgY29udGV4dCBvciBub3RcbiAqIEBwYXJhbSBwcm9wZXJ0eVZhbHVlcyBUaGUgdmFsdWVzIG9mIGFscmVhZHkgcGFyc2VkIHByb3BlcnR5XG4gKiBAcmV0dXJucyBUaGUgcHJvY2Vzc2VkIGNoaWxkcmVuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NDaGlsZHJlbihcblx0b05vZGU6IEVsZW1lbnQsXG5cdG9WaXNpdG9yOiBJVmlzaXRvckNhbGxiYWNrLFxuXHRvTWV0YWRhdGE6IFRyYW5zZm9ybWVkQnVpbGRpbmdCbG9ja01ldGFkYXRhLFxuXHRpc1B1YmxpYzogYm9vbGVhbixcblx0cHJvcGVydHlWYWx1ZXM6IFJlY29yZDxzdHJpbmcsIE9iamVjdFZhbHVlPlxuKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBFbGVtZW50Pj4ge1xuXHRjb25zdCBvQWdncmVnYXRpb25zOiBSZWNvcmQ8c3RyaW5nLCBFbGVtZW50PiA9IHt9O1xuXHRpZiAob05vZGUuZmlyc3RFbGVtZW50Q2hpbGQgIT09IG51bGwpIHtcblx0XHRsZXQgb0ZpcnN0RWxlbWVudENoaWxkOiBFbGVtZW50IHwgbnVsbCA9IG9Ob2RlLmZpcnN0RWxlbWVudENoaWxkIGFzIEVsZW1lbnQgfCBudWxsO1xuXG5cdFx0d2hpbGUgKG9GaXJzdEVsZW1lbnRDaGlsZCAhPT0gbnVsbCkge1xuXHRcdFx0aWYgKG9GaXJzdEVsZW1lbnRDaGlsZC5uYW1lc3BhY2VVUkkgPT09IFhNTFRFTVBMQVRJTkdfTlMpIHtcblx0XHRcdFx0Ly8gSW4gY2FzZSB3ZSBlbmNvdW50ZXIgYSB0ZW1wbGF0aW5nIHRhZywgcnVuIHRoZSB2aXNpdG9yIG9uIGl0IGFuZCBjb250aW51ZSB3aXRoIHRoZSByZXN1bHRpbmcgY2hpbGRcblx0XHRcdFx0Y29uc3Qgb1BhcmVudCA9IG9GaXJzdEVsZW1lbnRDaGlsZC5wYXJlbnROb2RlO1xuXHRcdFx0XHRpZiAob1BhcmVudCkge1xuXHRcdFx0XHRcdGNvbnN0IGlDaGlsZEluZGV4ID0gQXJyYXkuZnJvbShvUGFyZW50LmNoaWxkcmVuKS5pbmRleE9mKG9GaXJzdEVsZW1lbnRDaGlsZCk7XG5cdFx0XHRcdFx0YXdhaXQgb1Zpc2l0b3IudmlzaXROb2RlKG9GaXJzdEVsZW1lbnRDaGlsZCk7XG5cdFx0XHRcdFx0b0ZpcnN0RWxlbWVudENoaWxkID0gb1BhcmVudC5jaGlsZHJlbltpQ2hpbGRJbmRleF0gPyBvUGFyZW50LmNoaWxkcmVuW2lDaGlsZEluZGV4XSA6IG51bGw7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gTm90IHN1cmUgaG93IHRoaXMgY291bGQgaGFwcGVuIGJ1dCBJIGFsc28gZG9uJ3Qgd2FudCB0byBjcmVhdGUgaW5maW5pdGUgbG9vcHNcblx0XHRcdFx0XHRvRmlyc3RFbGVtZW50Q2hpbGQgPSBvRmlyc3RFbGVtZW50Q2hpbGQubmV4dEVsZW1lbnRTaWJsaW5nO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCBzQ2hpbGROYW1lID0gb0ZpcnN0RWxlbWVudENoaWxkLmxvY2FsTmFtZTtcblx0XHRcdFx0bGV0IHNBZ2dyZWdhdGlvbk5hbWUgPSBzQ2hpbGROYW1lO1xuXHRcdFx0XHRpZiAoc0FnZ3JlZ2F0aW9uTmFtZVswXS50b1VwcGVyQ2FzZSgpID09PSBzQWdncmVnYXRpb25OYW1lWzBdKSB7XG5cdFx0XHRcdFx0Ly8gbm90IGEgc3ViIGFnZ3JlZ2F0aW9uLCBnbyBiYWNrIHRvIGRlZmF1bHQgQWdncmVnYXRpb25cblx0XHRcdFx0XHRzQWdncmVnYXRpb25OYW1lID0gb01ldGFkYXRhLmRlZmF1bHRBZ2dyZWdhdGlvbiB8fCBcIlwiO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNvbnN0IGFnZ3JlZ2F0aW9uRGVmaW5pdGlvbiA9IG9NZXRhZGF0YS5hZ2dyZWdhdGlvbnNbc0FnZ3JlZ2F0aW9uTmFtZV07XG5cdFx0XHRcdGlmIChhZ2dyZWdhdGlvbkRlZmluaXRpb24gIT09IHVuZGVmaW5lZCAmJiAhYWdncmVnYXRpb25EZWZpbml0aW9uLnNsb3QpIHtcblx0XHRcdFx0XHRjb25zdCBwYXJzZWRBZ2dyZWdhdGlvbiA9IHBhcnNlQWdncmVnYXRpb24ob0ZpcnN0RWxlbWVudENoaWxkLCBhZ2dyZWdhdGlvbkRlZmluaXRpb24ucHJvY2Vzc0FnZ3JlZ2F0aW9ucyk7XG5cdFx0XHRcdFx0cHJvcGVydHlWYWx1ZXNbc0FnZ3JlZ2F0aW9uTmFtZV0gPSBwYXJzZWRBZ2dyZWdhdGlvbjtcblx0XHRcdFx0XHRmb3IgKGNvbnN0IHBhcnNlZEFnZ3JlZ2F0aW9uS2V5IGluIHBhcnNlZEFnZ3JlZ2F0aW9uKSB7XG5cdFx0XHRcdFx0XHRvTWV0YWRhdGEuYWdncmVnYXRpb25zW3BhcnNlZEFnZ3JlZ2F0aW9uS2V5XSA9IHBhcnNlZEFnZ3JlZ2F0aW9uW3BhcnNlZEFnZ3JlZ2F0aW9uS2V5XTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0b0ZpcnN0RWxlbWVudENoaWxkID0gb0ZpcnN0RWxlbWVudENoaWxkLm5leHRFbGVtZW50U2libGluZztcblx0XHRcdH1cblx0XHR9XG5cblx0XHRvRmlyc3RFbGVtZW50Q2hpbGQgPSBvTm9kZS5maXJzdEVsZW1lbnRDaGlsZDtcblx0XHR3aGlsZSAob0ZpcnN0RWxlbWVudENoaWxkICE9PSBudWxsKSB7XG5cdFx0XHRjb25zdCBvTmV4dENoaWxkOiBFbGVtZW50IHwgbnVsbCA9IG9GaXJzdEVsZW1lbnRDaGlsZC5uZXh0RWxlbWVudFNpYmxpbmc7XG5cdFx0XHRjb25zdCBzQ2hpbGROYW1lID0gb0ZpcnN0RWxlbWVudENoaWxkLmxvY2FsTmFtZTtcblx0XHRcdGxldCBzQWdncmVnYXRpb25OYW1lID0gc0NoaWxkTmFtZTtcblx0XHRcdGlmIChzQWdncmVnYXRpb25OYW1lWzBdLnRvVXBwZXJDYXNlKCkgPT09IHNBZ2dyZWdhdGlvbk5hbWVbMF0pIHtcblx0XHRcdFx0Ly8gbm90IGEgc3ViIGFnZ3JlZ2F0aW9uLCBnbyBiYWNrIHRvIGRlZmF1bHQgQWdncmVnYXRpb25cblx0XHRcdFx0c0FnZ3JlZ2F0aW9uTmFtZSA9IG9NZXRhZGF0YS5kZWZhdWx0QWdncmVnYXRpb24gfHwgXCJcIjtcblx0XHRcdH1cblx0XHRcdGlmIChcblx0XHRcdFx0T2JqZWN0LmtleXMob01ldGFkYXRhLmFnZ3JlZ2F0aW9ucykuaW5jbHVkZXMoc0FnZ3JlZ2F0aW9uTmFtZSkgJiZcblx0XHRcdFx0KCFpc1B1YmxpYyB8fCBvTWV0YWRhdGEuYWdncmVnYXRpb25zW3NBZ2dyZWdhdGlvbk5hbWVdLmlzUHVibGljID09PSB0cnVlKVxuXHRcdFx0KSB7XG5cdFx0XHRcdGNvbnN0IGFnZ3JlZ2F0aW9uRGVmaW5pdGlvbiA9IG9NZXRhZGF0YS5hZ2dyZWdhdGlvbnNbc0FnZ3JlZ2F0aW9uTmFtZV07XG5cdFx0XHRcdGlmICghYWdncmVnYXRpb25EZWZpbml0aW9uLnNsb3QgJiYgb0ZpcnN0RWxlbWVudENoaWxkICE9PSBudWxsICYmIG9GaXJzdEVsZW1lbnRDaGlsZC5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0YXdhaXQgb1Zpc2l0b3IudmlzaXROb2RlKG9GaXJzdEVsZW1lbnRDaGlsZCk7XG5cdFx0XHRcdFx0bGV0IGNoaWxkRGVmaW5pdGlvbiA9IG9GaXJzdEVsZW1lbnRDaGlsZC5maXJzdEVsZW1lbnRDaGlsZDtcblx0XHRcdFx0XHR3aGlsZSAoY2hpbGREZWZpbml0aW9uKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBuZXh0Q2hpbGQgPSBjaGlsZERlZmluaXRpb24ubmV4dEVsZW1lbnRTaWJsaW5nO1xuXHRcdFx0XHRcdFx0aWYgKCFhZ2dyZWdhdGlvbkRlZmluaXRpb24uaGFzVmlydHVhbE5vZGUpIHtcblx0XHRcdFx0XHRcdFx0Y29uc3QgY2hpbGRXcmFwcGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKG9Ob2RlLm5hbWVzcGFjZVVSSSwgY2hpbGREZWZpbml0aW9uLmdldEF0dHJpYnV0ZShcImtleVwiKSEpO1xuXHRcdFx0XHRcdFx0XHRjaGlsZFdyYXBwZXIuYXBwZW5kQ2hpbGQoY2hpbGREZWZpbml0aW9uKTtcblx0XHRcdFx0XHRcdFx0b0FnZ3JlZ2F0aW9uc1tjaGlsZERlZmluaXRpb24uZ2V0QXR0cmlidXRlKFwia2V5XCIpIV0gPSBjaGlsZFdyYXBwZXI7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRvQWdncmVnYXRpb25zW2NoaWxkRGVmaW5pdGlvbi5nZXRBdHRyaWJ1dGUoXCJrZXlcIikhXSA9IGNoaWxkRGVmaW5pdGlvbjtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Y2hpbGREZWZpbml0aW9uLnJlbW92ZUF0dHJpYnV0ZShcImtleVwiKTtcblx0XHRcdFx0XHRcdGNoaWxkRGVmaW5pdGlvbiA9IG5leHRDaGlsZDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSBpZiAoYWdncmVnYXRpb25EZWZpbml0aW9uLnNsb3QpIHtcblx0XHRcdFx0XHRhd2FpdCBvVmlzaXRvci52aXNpdE5vZGUob0ZpcnN0RWxlbWVudENoaWxkKTtcblx0XHRcdFx0XHRpZiAoc0FnZ3JlZ2F0aW9uTmFtZSAhPT0gc0NoaWxkTmFtZSkge1xuXHRcdFx0XHRcdFx0aWYgKCFvQWdncmVnYXRpb25zW3NBZ2dyZWdhdGlvbk5hbWVdKSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IG9OZXdDaGlsZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhvTm9kZS5uYW1lc3BhY2VVUkksIHNBZ2dyZWdhdGlvbk5hbWUpO1xuXHRcdFx0XHRcdFx0XHRvQWdncmVnYXRpb25zW3NBZ2dyZWdhdGlvbk5hbWVdID0gb05ld0NoaWxkO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0b0FnZ3JlZ2F0aW9uc1tzQWdncmVnYXRpb25OYW1lXS5hcHBlbmRDaGlsZChvRmlyc3RFbGVtZW50Q2hpbGQuY2xvbmVOb2RlKHRydWUpIGFzIEVsZW1lbnQpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRvQWdncmVnYXRpb25zW3NBZ2dyZWdhdGlvbk5hbWVdID0gb0ZpcnN0RWxlbWVudENoaWxkLmNsb25lTm9kZSh0cnVlKSBhcyBFbGVtZW50O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmIChPYmplY3Qua2V5cyhvTWV0YWRhdGEucHJvcGVydGllcykuaW5jbHVkZXMoc0FnZ3JlZ2F0aW9uTmFtZSkpIHtcblx0XHRcdFx0YXdhaXQgb1Zpc2l0b3IudmlzaXROb2RlKG9GaXJzdEVsZW1lbnRDaGlsZCk7XG5cdFx0XHRcdGlmIChvTWV0YWRhdGEucHJvcGVydGllc1tzQWdncmVnYXRpb25OYW1lXS50eXBlID09PSBcIm9iamVjdFwiKSB7XG5cdFx0XHRcdFx0Y29uc3QgYWdncmVnYXRpb25Qcm9wZXJ0eVZhbHVlcyA9IHByb2Nlc3NPYmplY3Qob0ZpcnN0RWxlbWVudENoaWxkKTtcblx0XHRcdFx0XHRwcm9wZXJ0eVZhbHVlc1tzQWdncmVnYXRpb25OYW1lXSA9IGFnZ3JlZ2F0aW9uUHJvcGVydHlWYWx1ZXM7XG5cdFx0XHRcdH0gZWxzZSBpZiAob01ldGFkYXRhLnByb3BlcnRpZXNbc0FnZ3JlZ2F0aW9uTmFtZV0udHlwZSA9PT0gXCJhcnJheVwiKSB7XG5cdFx0XHRcdFx0aWYgKG9GaXJzdEVsZW1lbnRDaGlsZCAhPT0gbnVsbCAmJiBvRmlyc3RFbGVtZW50Q2hpbGQuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdFx0Y29uc3QgY2hpbGRyZW4gPSBvRmlyc3RFbGVtZW50Q2hpbGQuY2hpbGRyZW47XG5cdFx0XHRcdFx0XHRjb25zdCBvT3V0T2JqZWN0czogUmVjb3JkPHN0cmluZywgT2JqZWN0VmFsdWUyPltdID0gW107XG5cdFx0XHRcdFx0XHRmb3IgKGxldCBjaGlsZElkeCA9IDA7IGNoaWxkSWR4IDwgY2hpbGRyZW4ubGVuZ3RoOyBjaGlsZElkeCsrKSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IGNoaWxkRGVmaW5pdGlvbiA9IGNoaWxkcmVuW2NoaWxkSWR4XTtcblx0XHRcdFx0XHRcdFx0Ly8gbm9uIGtleWVkIGNoaWxkLCBqdXN0IGFkZCBpdCB0byB0aGUgYWdncmVnYXRpb25cblx0XHRcdFx0XHRcdFx0Y29uc3QgbXlDaGlsZDogUmVjb3JkPHN0cmluZywgT2JqZWN0VmFsdWUyPiA9IHt9O1xuXHRcdFx0XHRcdFx0XHRjb25zdCBhdHRyaWJ1dGVOYW1lcyA9IGNoaWxkRGVmaW5pdGlvbi5nZXRBdHRyaWJ1dGVOYW1lcygpO1xuXHRcdFx0XHRcdFx0XHRmb3IgKGNvbnN0IGF0dHJpYnV0ZU5hbWUgb2YgYXR0cmlidXRlTmFtZXMpIHtcblx0XHRcdFx0XHRcdFx0XHRteUNoaWxkW2F0dHJpYnV0ZU5hbWVdID0gY2hpbGREZWZpbml0aW9uLmdldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRvT3V0T2JqZWN0cy5wdXNoKG15Q2hpbGQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0cHJvcGVydHlWYWx1ZXNbc0FnZ3JlZ2F0aW9uTmFtZV0gPSBvT3V0T2JqZWN0cztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0b0ZpcnN0RWxlbWVudENoaWxkID0gb05leHRDaGlsZDtcblx0XHR9XG5cdH1cblx0cmV0dXJuIG9BZ2dyZWdhdGlvbnM7XG59XG5cbmZ1bmN0aW9uIHByb2Nlc3NTbG90cyhcblx0b0FnZ3JlZ2F0aW9uczogUmVjb3JkPHN0cmluZywgRWxlbWVudD4sXG5cdG9NZXRhZGF0YUFnZ3JlZ2F0aW9uczogUmVjb3JkPHN0cmluZywgQnVpbGRpbmdCbG9ja0FnZ3JlZ2F0aW9uRGVmaW5pdGlvbj4sXG5cdG9Ob2RlOiBFbGVtZW50LFxuXHRwcm9jZXNzQ3VzdG9tRGF0YSA9IGZhbHNlXG4pOiB2b2lkIHtcblx0aWYgKE9iamVjdC5rZXlzKG9BZ2dyZWdhdGlvbnMpLmxlbmd0aCA+IDApIHtcblx0XHRPYmplY3Qua2V5cyhvQWdncmVnYXRpb25zKS5mb3JFYWNoKGZ1bmN0aW9uIChzQWdncmVnYXRpb25OYW1lOiBzdHJpbmcpIHtcblx0XHRcdGNvbnN0IG9BZ2dyZWdhdGlvbkVsZW1lbnQgPSBvQWdncmVnYXRpb25zW3NBZ2dyZWdhdGlvbk5hbWVdO1xuXHRcdFx0aWYgKG9Ob2RlICE9PSBudWxsICYmIG9Ob2RlICE9PSB1bmRlZmluZWQgJiYgb0FnZ3JlZ2F0aW9uRWxlbWVudCkge1xuXHRcdFx0XHQvLyBzbG90cyBjYW4gaGF2ZSA6OiBhcyBrZXlzIHdoaWNoIGlzIG5vdCBhIHZhbGlkIGFnZ3JlZ2F0aW9uIG5hbWUgdGhlcmVmb3JlIHJlcGxhY2luZyB0aGVtXG5cdFx0XHRcdGNvbnN0IG9FbGVtZW50Q2hpbGQgPSBvQWdncmVnYXRpb25FbGVtZW50LmZpcnN0RWxlbWVudENoaWxkO1xuXHRcdFx0XHRpZiAoIVtcImRlcGVuZGVudHNcIiwgXCJjdXN0b21EYXRhXCIsIFwibGF5b3V0RGF0YVwiXS5pbmNsdWRlcyhzQWdncmVnYXRpb25OYW1lKSkge1xuXHRcdFx0XHRcdGNvbnN0IHNTbG90TmFtZSA9XG5cdFx0XHRcdFx0XHQob01ldGFkYXRhQWdncmVnYXRpb25zW3NBZ2dyZWdhdGlvbk5hbWVdICE9PSB1bmRlZmluZWQgJiYgb01ldGFkYXRhQWdncmVnYXRpb25zW3NBZ2dyZWdhdGlvbk5hbWVdLnNsb3QpIHx8XG5cdFx0XHRcdFx0XHRzQWdncmVnYXRpb25OYW1lO1xuXHRcdFx0XHRcdGNvbnN0IG9UYXJnZXRFbGVtZW50ID0gb05vZGUucXVlcnlTZWxlY3Rvcihgc2xvdFtuYW1lPScke3NTbG90TmFtZX0nXWApO1xuXHRcdFx0XHRcdGlmIChvVGFyZ2V0RWxlbWVudCAhPT0gbnVsbCkge1xuXHRcdFx0XHRcdFx0Y29uc3Qgb05ld0NoaWxkID0gcHJlcGFyZUFnZ3JlZ2F0aW9uRWxlbWVudChvTm9kZSwgc0FnZ3JlZ2F0aW9uTmFtZSwgb0VsZW1lbnRDaGlsZCk7XG5cdFx0XHRcdFx0XHRvVGFyZ2V0RWxlbWVudC5yZXBsYWNlV2l0aCguLi4ob05ld0NoaWxkLmNoaWxkcmVuIGFzIHVua25vd24gYXMgTm9kZVtdKSk7IC8vIFNvbWVob3cgVFMgZG9lc24ndCBsaWtlIHRoaXMgYnV0IHRoZSBkb2N1bWVudGF0aW9uIHNheXMgaXMgc2hvdWxkIHdvcmtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSBpZiAocHJvY2Vzc0N1c3RvbURhdGEgJiYgb0VsZW1lbnRDaGlsZCAhPT0gbnVsbCkge1xuXHRcdFx0XHRcdGNvbnN0IHNTbG90TmFtZSA9XG5cdFx0XHRcdFx0XHQob01ldGFkYXRhQWdncmVnYXRpb25zW3NBZ2dyZWdhdGlvbk5hbWVdICE9PSB1bmRlZmluZWQgJiYgb01ldGFkYXRhQWdncmVnYXRpb25zW3NBZ2dyZWdhdGlvbk5hbWVdLnNsb3QpIHx8XG5cdFx0XHRcdFx0XHRzQWdncmVnYXRpb25OYW1lO1xuXHRcdFx0XHRcdGNvbnN0IG9UYXJnZXRFbGVtZW50ID0gb05vZGUucXVlcnlTZWxlY3Rvcihgc2xvdFtuYW1lPScke3NTbG90TmFtZX0nXWApO1xuXHRcdFx0XHRcdGNvbnN0IG9OZXdDaGlsZCA9IHByZXBhcmVBZ2dyZWdhdGlvbkVsZW1lbnQob05vZGUsIHNBZ2dyZWdhdGlvbk5hbWUsIG9FbGVtZW50Q2hpbGQpO1xuXHRcdFx0XHRcdGlmIChvVGFyZ2V0RWxlbWVudCAhPT0gbnVsbCkge1xuXHRcdFx0XHRcdFx0b1RhcmdldEVsZW1lbnQucmVwbGFjZVdpdGgoLi4uKG9OZXdDaGlsZC5jaGlsZHJlbiBhcyB1bmtub3duIGFzIE5vZGVbXSkpOyAvLyBTb21laG93IFRTIGRvZXNuJ3QgbGlrZSB0aGlzIGJ1dCB0aGUgZG9jdW1lbnRhdGlvbiBzYXlzIGlzIHNob3VsZCB3b3JrXG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdG9Ob2RlLmFwcGVuZENoaWxkKG9OZXdDaGlsZCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cbn1cblxuZnVuY3Rpb24gcHJlcGFyZUFnZ3JlZ2F0aW9uRWxlbWVudChvTm9kZTogRWxlbWVudCwgc0FnZ3JlZ2F0aW9uTmFtZTogc3RyaW5nLCBvRWxlbWVudENoaWxkOiBFbGVtZW50IHwgbnVsbCk6IEVsZW1lbnQge1xuXHRjb25zdCBvTmV3Q2hpbGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMob05vZGUubmFtZXNwYWNlVVJJLCBzQWdncmVnYXRpb25OYW1lLnJlcGxhY2UoLzovZ2ksIFwiX1wiKSk7XG5cdHdoaWxlIChvRWxlbWVudENoaWxkKSB7XG5cdFx0Y29uc3Qgb05leHRDaGlsZCA9IG9FbGVtZW50Q2hpbGQubmV4dEVsZW1lbnRTaWJsaW5nO1xuXHRcdG9OZXdDaGlsZC5hcHBlbmRDaGlsZChvRWxlbWVudENoaWxkKTtcblx0XHRvRWxlbWVudENoaWxkID0gb05leHRDaGlsZDtcblx0fVxuXHRyZXR1cm4gb05ld0NoaWxkO1xufVxuXG5hc3luYyBmdW5jdGlvbiBwcm9jZXNzQnVpbGRpbmdCbG9jayhcblx0QnVpbGRpbmdCbG9ja0NsYXNzOiB0eXBlb2YgQnVpbGRpbmdCbG9ja1RlbXBsYXRpbmdCYXNlLFxuXHRvTm9kZTogRWxlbWVudCxcblx0b1Zpc2l0b3I6IElWaXNpdG9yQ2FsbGJhY2ssXG5cdGlzUHVibGljID0gZmFsc2Vcbik6IFByb21pc2U8dm9pZD4ge1xuXHRjb25zdCBvTWV0YWRhdGEgPSB0cmFuc2Zvcm1NZXRhZGF0YShCdWlsZGluZ0Jsb2NrQ2xhc3MubWV0YWRhdGEpO1xuXG5cdGNvbnN0IHNGcmFnbWVudE5hbWUgPSBvTWV0YWRhdGEuZnJhZ21lbnQgPz8gYCR7b01ldGFkYXRhLm5hbWVzcGFjZSA/PyBvTWV0YWRhdGEucHVibGljTmFtZXNwYWNlfS4ke29NZXRhZGF0YS54bWxUYWcgPz8gb01ldGFkYXRhLm5hbWV9YDtcblxuXHRjb25zdCBtQ29udGV4dHM6IFJlY29yZDxzdHJpbmcsIENvbnRleHQ+ID0ge307XG5cdGNvbnN0IG9TZXR0aW5ncyA9IG9WaXNpdG9yLmdldFNldHRpbmdzKCk7XG5cblx0Ly8gQWRkIGFuIGVtcHR5IGNvbnZlcnRlciBjb250ZXh0IGlmIHRoZXJlIGlzIG5vbmUgaW4gb3JkZXIgdG8gaGF2ZSBhIHBsYWNlIHRvIHN0b3JlIG9iamVjdCB2YWx1ZXNcblx0b1NldHRpbmdzLm1vZGVscy5jb252ZXJ0ZXJDb250ZXh0ID8/PSBuZXcgSlNPTk1vZGVsKCk7XG5cblx0Ly9JbmplY3Qgc3RvcmFnZSBmb3IgbWFjcm9zXG5cdGlmICghb1NldHRpbmdzW3NGcmFnbWVudE5hbWVdKSB7XG5cdFx0b1NldHRpbmdzW3NGcmFnbWVudE5hbWVdID0ge307XG5cdH1cblxuXHQvLyBGaXJzdCBvZiBhbGwgd2UgbmVlZCB0byB2aXNpdCB0aGUgYXR0cmlidXRlcyB0byByZXNvbHZlIHRoZSBwcm9wZXJ0aWVzIGFuZCB0aGUgbWV0YWRhdGEgY29udGV4dHNcblx0Y29uc3QgcHJvcGVydHlWYWx1ZXMgPSBhd2FpdCBwcm9jZXNzUHJvcGVydGllcyhvTWV0YWRhdGEsIG9Ob2RlLCBpc1B1YmxpYywgb1Zpc2l0b3IpO1xuXHRjb25zdCBpbml0aWFsS2V5cyA9IE9iamVjdC5rZXlzKHByb3BlcnR5VmFsdWVzKTtcblx0Y29uc3QgbU1pc3NpbmdDb250ZXh0ID0gcHJvY2Vzc0NvbnRleHRzKG9NZXRhZGF0YSwgb1NldHRpbmdzLCBvTm9kZSwgaXNQdWJsaWMsIG9WaXNpdG9yLCBtQ29udGV4dHMsIHByb3BlcnR5VmFsdWVzKTtcblxuXHR0cnkge1xuXHRcdC8vIEFnZ3JlZ2F0aW9uIGFuZCBjb21wbGV4IHR5cGUgc3VwcG9ydFxuXHRcdGNvbnN0IG9BZ2dyZWdhdGlvbnMgPSBhd2FpdCBwcm9jZXNzQ2hpbGRyZW4ob05vZGUsIG9WaXNpdG9yLCBvTWV0YWRhdGEsIGlzUHVibGljLCBwcm9wZXJ0eVZhbHVlcyk7XG5cdFx0bGV0IG9Db250cm9sQ29uZmlnID0ge307XG5cblx0XHRpZiAob1NldHRpbmdzLm1vZGVscy52aWV3RGF0YSkge1xuXHRcdFx0Ly8gT25seSB1c2VkIGluIHRoZSBGaWVsZCBtYWNybyBhbmQgZXZlbiB0aGVuIG1heWJlIG5vdCByZWFsbHkgdXNlZnVsXG5cdFx0XHRvQ29udHJvbENvbmZpZyA9IG9TZXR0aW5ncy5tb2RlbHMudmlld0RhdGEuZ2V0UHJvcGVydHkoXCIvY29udHJvbENvbmZpZ3VyYXRpb25cIik7XG5cdFx0fVxuXHRcdGxldCBwcm9jZXNzZWRQcm9wZXJ0eVZhbHVlcyA9IHByb3BlcnR5VmFsdWVzO1xuXG5cdFx0T2JqZWN0LmtleXMocHJvcGVydHlWYWx1ZXMpLmZvckVhY2goKHByb3BOYW1lKSA9PiB7XG5cdFx0XHRsZXQgb0RhdGEgPSBwcm9wZXJ0eVZhbHVlc1twcm9wTmFtZV0gYXMgdW5rbm93biBhcyBDb250ZXh0O1xuXHRcdFx0Ly9jaGVjayBmb3IgYWRkaXRpb25hbCBwcm9jZXNzaW5nIGZ1bmN0aW9uIHRvIHZhbGlkYXRlIC8gb3ZlcndyaXRlIHBhcmFtZXRlcnNcblx0XHRcdGNvbnN0IG9yaWdpbmFsRGVmaW5pdGlvbiA9IEJ1aWxkaW5nQmxvY2tDbGFzcz8ubWV0YWRhdGE/LnByb3BlcnRpZXNbcHJvcE5hbWVdO1xuXHRcdFx0aWYgKG9yaWdpbmFsRGVmaW5pdGlvbj8udmFsaWRhdGUpIHtcblx0XHRcdFx0b0RhdGEgPSBvcmlnaW5hbERlZmluaXRpb24udmFsaWRhdGUob0RhdGEpIHx8IG9EYXRhO1xuXHRcdFx0fVxuXHRcdFx0aWYgKG9EYXRhPy5pc0E/LihTQVBfVUlfTU9ERUxfQ09OVEVYVCkgJiYgIW9EYXRhLmdldE1vZGVsKCkuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTWV0YU1vZGVsXCIpKSB7XG5cdFx0XHRcdHByb3BlcnR5VmFsdWVzW3Byb3BOYW1lXSA9IG9EYXRhLmdldE9iamVjdCgpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdHByb3BlcnR5VmFsdWVzLmlzUHVibGljID0gaXNQdWJsaWM7XG5cblx0XHRjb25zdCBvSW5zdGFuY2UgPSBuZXcgQnVpbGRpbmdCbG9ja0NsYXNzKHsgLi4ucHJvcGVydHlWYWx1ZXMsIC4uLm9BZ2dyZWdhdGlvbnMgfSwgb0NvbnRyb2xDb25maWcsIG9TZXR0aW5ncyk7XG5cdFx0cHJvY2Vzc2VkUHJvcGVydHlWYWx1ZXMgPSBvSW5zdGFuY2UuZ2V0UHJvcGVydGllcygpO1xuXHRcdE9iamVjdC5rZXlzKG9NZXRhZGF0YS5tZXRhZGF0YUNvbnRleHRzKS5mb3JFYWNoKGZ1bmN0aW9uIChzQ29udGV4dE5hbWU6IHN0cmluZykge1xuXHRcdFx0aWYgKHByb2Nlc3NlZFByb3BlcnR5VmFsdWVzLmhhc093blByb3BlcnR5KHNDb250ZXh0TmFtZSkpIHtcblx0XHRcdFx0Y29uc3QgdGFyZ2V0T2JqZWN0ID0gcHJvY2Vzc2VkUHJvcGVydHlWYWx1ZXNbc0NvbnRleHROYW1lXTtcblx0XHRcdFx0aWYgKGlzQ29udGV4dCh0YXJnZXRPYmplY3QpKSB7XG5cdFx0XHRcdFx0bUNvbnRleHRzW3NDb250ZXh0TmFtZV0gPSB0YXJnZXRPYmplY3QgYXMgQ29udGV4dDtcblx0XHRcdFx0fSBlbHNlIGlmICh0eXBlb2YgdGFyZ2V0T2JqZWN0ID09PSBcIm9iamVjdFwiKSB7XG5cdFx0XHRcdFx0Y29uc3QgYXR0cmlidXRlVmFsdWUgPSBzdG9yZU9iamVjdFZhbHVlKHRhcmdldE9iamVjdCk7XG5cdFx0XHRcdFx0b1NldHRpbmdzLm1vZGVscy5jb252ZXJ0ZXJDb250ZXh0LnNldFByb3BlcnR5KGF0dHJpYnV0ZVZhbHVlLCB0YXJnZXRPYmplY3QpO1xuXHRcdFx0XHRcdGNvbnN0IG5ld0NvbnRleHQgPSBvU2V0dGluZ3MubW9kZWxzLmNvbnZlcnRlckNvbnRleHQuY3JlYXRlQmluZGluZ0NvbnRleHQoYXR0cmlidXRlVmFsdWUpITtcblx0XHRcdFx0XHR1bnN0b3JlT2JqZWN0VmFsdWUoYXR0cmlidXRlVmFsdWUpO1xuXHRcdFx0XHRcdG1Db250ZXh0c1tzQ29udGV4dE5hbWVdID0gbmV3Q29udGV4dDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0Y29uc3Qgb0F0dHJpYnV0ZXNNb2RlbDogSlNPTk1vZGVsID0gbmV3IEF0dHJpYnV0ZU1vZGVsKG9Ob2RlLCBwcm9jZXNzZWRQcm9wZXJ0eVZhbHVlcywgQnVpbGRpbmdCbG9ja0NsYXNzKTtcblx0XHRtQ29udGV4dHNbXCJ0aGlzXCJdID0gb0F0dHJpYnV0ZXNNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChcIi9cIik7XG5cdFx0bGV0IG9QcmV2aW91c01hY3JvSW5mbzogTWFjcm9JbmZvIHwgdW5kZWZpbmVkO1xuXHRcdC8vIGNvcmU6cmVxdWlyZSBuZWVkIHRvIGJlIGRlZmluZWQgb24gdGhlIG5vZGUgaXRzZWxmIHRvIGJlIHBpY2tlZCB1cCBkdWUgdG8gdGhlIHRlbXBsYXRpbmcgc3RlcFxuXHRcdGNvbnN0IGNvcmVSZXF1aXJlID0gb05vZGU/LmdldEF0dHJpYnV0ZShcImNvcmU6cmVxdWlyZVwiKSB8fCB1bmRlZmluZWQ7XG5cblx0XHQvLyBLZWVwIHRyYWNrXG5cdFx0aWYgKFRyYWNlSW5mby5pc1RyYWNlSW5mb0FjdGl2ZSgpKSB7XG5cdFx0XHRjb25zdCBvVHJhY2VJbmZvID0gVHJhY2VJbmZvLnRyYWNlTWFjcm9DYWxscyhzRnJhZ21lbnROYW1lLCBvTWV0YWRhdGEsIG1Db250ZXh0cywgb05vZGUsIG9WaXNpdG9yKTtcblx0XHRcdGlmIChvVHJhY2VJbmZvPy5tYWNyb0luZm8pIHtcblx0XHRcdFx0b1ByZXZpb3VzTWFjcm9JbmZvID0gb1NldHRpbmdzW1wiX21hY3JvSW5mb1wiXTtcblx0XHRcdFx0b1NldHRpbmdzW1wiX21hY3JvSW5mb1wiXSA9IG9UcmFjZUluZm8ubWFjcm9JbmZvO1xuXHRcdFx0fVxuXHRcdH1cblx0XHR2YWxpZGF0ZU1hY3JvU2lnbmF0dXJlKHNGcmFnbWVudE5hbWUsIG9NZXRhZGF0YSwgbUNvbnRleHRzLCBvTm9kZSk7XG5cblx0XHRjb25zdCBvQ29udGV4dFZpc2l0b3IgPSBvVmlzaXRvci53aXRoKG1Db250ZXh0cywgb01ldGFkYXRhLmlzT3BlbiAhPT0gdW5kZWZpbmVkID8gIW9NZXRhZGF0YS5pc09wZW4gOiB0cnVlKTtcblx0XHRjb25zdCBvUGFyZW50ID0gb05vZGUucGFyZW50Tm9kZTtcblxuXHRcdGxldCBpQ2hpbGRJbmRleDogbnVtYmVyO1xuXHRcdGxldCBvUHJvbWlzZTtcblx0XHRpZiAob1BhcmVudCkge1xuXHRcdFx0aUNoaWxkSW5kZXggPSBBcnJheS5mcm9tKG9QYXJlbnQuY2hpbGRyZW4pLmluZGV4T2Yob05vZGUpO1xuXG5cdFx0XHRpZiAob01ldGFkYXRhLmZyYWdtZW50KSB7XG5cdFx0XHRcdG9Qcm9taXNlID0gb0NvbnRleHRWaXNpdG9yLmluc2VydEZyYWdtZW50KHNGcmFnbWVudE5hbWUsIG9Ob2RlKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IG9sZEtleXMgPSBPYmplY3Qua2V5cyh0ZW1wb3JhcnlPYmplY3RTdG9yZSk7XG5cdFx0XHRcdGxldCB0ZW1wbGF0ZVN0cmluZztcblx0XHRcdFx0aWYgKChvSW5zdGFuY2UgYXMgUnVudGltZUJ1aWxkaW5nQmxvY2spLmdldFJ1bnRpbWVCdWlsZGluZ0Jsb2NrVGVtcGxhdGUpIHtcblx0XHRcdFx0XHR0ZW1wbGF0ZVN0cmluZyA9IGF3YWl0IGpzeC5yZW5kZXJBc1hNTChhc3luYyAoKSA9PlxuXHRcdFx0XHRcdFx0KG9JbnN0YW5jZSBhcyBSdW50aW1lQnVpbGRpbmdCbG9jaykuZ2V0UnVudGltZUJ1aWxkaW5nQmxvY2tUZW1wbGF0ZShvTm9kZSlcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHRlbXBsYXRlU3RyaW5nID0gYXdhaXQganN4LnJlbmRlckFzWE1MKGFzeW5jICgpID0+IG9JbnN0YW5jZS5nZXRUZW1wbGF0ZSEob05vZGUpKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChCdWlsZGluZ0Jsb2NrQ2xhc3MuaXNSdW50aW1lKSB7XG5cdFx0XHRcdFx0Ly8gRm9yIHJ1bnRpbWUgYnVpbGRpbmcgYmxvY2tzLCB3ZSBuZWVkIHRvIGF0dGFjaCBhbGwgb2JqZWN0cyB0byB0aGUgY29udmVydGVyQ29udGV4dCBkaXJlY3RseSwgYXMgdGhlIGFjdHVhbCByZW5kZXJpbmcgdGFrZXMgcGxhY2UgYXQgcnVudGltZVxuXHRcdFx0XHRcdGZvciAoY29uc3Qgc3RvcmVLZXkgaW4gdGVtcG9yYXJ5T2JqZWN0U3RvcmUpIHtcblx0XHRcdFx0XHRcdGlmICghb2xkS2V5cy5pbmNsdWRlcyhzdG9yZUtleSkpIHtcblx0XHRcdFx0XHRcdFx0Y29uc3QgZGF0YSA9IHVuc3RvcmVPYmplY3RWYWx1ZShzdG9yZUtleSk7XG5cdFx0XHRcdFx0XHRcdG9TZXR0aW5ncy5tb2RlbHMuY29udmVydGVyQ29udGV4dC5zZXRQcm9wZXJ0eShzdG9yZUtleSwgZGF0YSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0bGV0IGhhc0Vycm9yID0gXCJcIjtcblx0XHRcdFx0aWYgKHRlbXBsYXRlU3RyaW5nKSB7XG5cdFx0XHRcdFx0bGV0IGhhc1BhcnNlRXJyb3IgPSBmYWxzZTtcblx0XHRcdFx0XHRsZXQgcGFyc2VkVGVtcGxhdGUgPSBwYXJzZVhNTFN0cmluZyh0ZW1wbGF0ZVN0cmluZywgdHJ1ZSk7XG5cdFx0XHRcdFx0Ly8gRm9yIHNhZmV0eSBwdXJwb3NlIHdlIHRyeSB0byBkZXRlY3QgdHJhaWxpbmcgdGV4dCBpbiBiZXR3ZWVuIFhNTCBUYWdzXG5cdFx0XHRcdFx0Zm9yIChjb25zdCBlbGVtZW50IG9mIHBhcnNlZFRlbXBsYXRlKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBpdGVyID0gZG9jdW1lbnQuY3JlYXRlTm9kZUl0ZXJhdG9yKGVsZW1lbnQsIE5vZGVGaWx0ZXIuU0hPV19URVhUKTtcblx0XHRcdFx0XHRcdGxldCB0ZXh0bm9kZSA9IGl0ZXIubmV4dE5vZGUoKTtcblx0XHRcdFx0XHRcdGlmIChlbGVtZW50LmxvY2FsTmFtZSA9PT0gXCJwYXJzZXJlcnJvclwiKSB7XG5cdFx0XHRcdFx0XHRcdGhhc1BhcnNlRXJyb3IgPSB0cnVlO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0d2hpbGUgKHRleHRub2RlKSB7XG5cdFx0XHRcdFx0XHRcdGlmICh0ZXh0bm9kZS50ZXh0Q29udGVudCAmJiB0ZXh0bm9kZS50ZXh0Q29udGVudC50cmltKCkubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdFx0XHRcdGhhc0Vycm9yID0gdGV4dG5vZGUudGV4dENvbnRlbnQ7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0dGV4dG5vZGUgPSBpdGVyLm5leHROb2RlKCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKGhhc1BhcnNlRXJyb3IpIHtcblx0XHRcdFx0XHRcdC8vIElmIHRoZXJlIGlzIGEgcGFyc2VlcnJvciB3aGlsZSBwcm9jZXNzaW5nIHRoZSBYTUwgaXQgbWVhbnMgdGhlIFhNTCBpdHNlbGYgaXMgbWFsZm9ybWVkLCBhcyBzdWNoIHdlIHJlcnVuIHRoZSB0ZW1wbGF0ZSBwcm9jZXNzXG5cdFx0XHRcdFx0XHQvLyBTZXR0aW5nIGlzVHJhY2VNb2RlIHRydWUgd2lsbCBtYWtlIGl0IHNvIHRoYXQgZWFjaCB4bWxgIGV4cHJlc3Npb24gaXMgY2hlY2tlZCBmb3IgdmFsaWRpdHkgZnJvbSBYTUwgcGVyc3BlY3RpdmVcblx0XHRcdFx0XHRcdC8vIElmIGFuIGVycm9yIGlzIGZvdW5kIGl0J3MgcmV0dXJuZWQgaW5zdGVhZCBvZiB0aGUgbm9ybWFsIGZyYWdtZW50XG5cdFx0XHRcdFx0XHRMb2cuZXJyb3IoYEVycm9yIHdoaWxlIHByb2Nlc3NpbmcgYnVpbGRpbmcgYmxvY2sgJHtvTWV0YWRhdGEueG1sVGFnIHx8IG9NZXRhZGF0YS5uYW1lfWAsIGhhc0Vycm9yKTtcblx0XHRcdFx0XHRcdHBhcnNlZFRlbXBsYXRlID0gKGF3YWl0IHByb2Nlc3NYbWxJblRyYWNlKGFzeW5jICgpID0+IHtcblx0XHRcdFx0XHRcdFx0bGV0IGluaXRpYWxUZW1wbGF0ZTtcblx0XHRcdFx0XHRcdFx0aWYgKChvSW5zdGFuY2UgYXMgUnVudGltZUJ1aWxkaW5nQmxvY2spLmdldFJ1bnRpbWVCdWlsZGluZ0Jsb2NrVGVtcGxhdGUpIHtcblx0XHRcdFx0XHRcdFx0XHRpbml0aWFsVGVtcGxhdGUgPSBhd2FpdCBqc3gucmVuZGVyQXNYTUwoYXN5bmMgKCkgPT5cblx0XHRcdFx0XHRcdFx0XHRcdChvSW5zdGFuY2UgYXMgUnVudGltZUJ1aWxkaW5nQmxvY2spLmdldFJ1bnRpbWVCdWlsZGluZ0Jsb2NrVGVtcGxhdGUob05vZGUpXG5cdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRpbml0aWFsVGVtcGxhdGUgPSBhd2FpdCBqc3gucmVuZGVyQXNYTUwoYXN5bmMgKCkgPT4gb0luc3RhbmNlLmdldFRlbXBsYXRlIShvTm9kZSkpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHJldHVybiBwYXJzZVhNTFN0cmluZyhpbml0aWFsVGVtcGxhdGUgPz8gXCJcIiwgdHJ1ZSk7XG5cdFx0XHRcdFx0XHR9KSkgYXMgRWxlbWVudFtdO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAoaGFzRXJyb3IubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdFx0Ly8gSWYgdGhlcmUgaXMgdHJhaWxpbmcgdGV4dCB3ZSBjcmVhdGUgYSBzdGFuZGFyZCBlcnJvciBhbmQgZGlzcGxheSBpdC5cblx0XHRcdFx0XHRcdExvZy5lcnJvcihgRXJyb3Igd2hpbGUgcHJvY2Vzc2luZyBidWlsZGluZyBibG9jayAke29NZXRhZGF0YS54bWxUYWcgfHwgb01ldGFkYXRhLm5hbWV9YCk7XG5cdFx0XHRcdFx0XHRjb25zdCBvRXJyb3JUZXh0ID0gY3JlYXRlRXJyb3JYTUwoXG5cdFx0XHRcdFx0XHRcdFtcblx0XHRcdFx0XHRcdFx0XHRgRXJyb3Igd2hpbGUgcHJvY2Vzc2luZyBidWlsZGluZyBibG9jayAke29NZXRhZGF0YS54bWxUYWcgfHwgb01ldGFkYXRhLm5hbWV9YCxcblx0XHRcdFx0XHRcdFx0XHRgVHJhaWxpbmcgdGV4dCB3YXMgZm91bmQgaW4gdGhlIFhNTDogJHtoYXNFcnJvcn1gXG5cdFx0XHRcdFx0XHRcdF0sXG5cdFx0XHRcdFx0XHRcdHBhcnNlZFRlbXBsYXRlLm1hcCgodGVtcGxhdGUpID0+IHRlbXBsYXRlLm91dGVySFRNTCkuam9pbihcIlxcblwiKVxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdHBhcnNlZFRlbXBsYXRlID0gcGFyc2VYTUxTdHJpbmcob0Vycm9yVGV4dCwgdHJ1ZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdG9Ob2RlLnJlcGxhY2VXaXRoKC4uLnBhcnNlZFRlbXBsYXRlKTtcblxuXHRcdFx0XHRcdGNvbnN0IHZpc2l0ZWROb2RlcyA9IHBhcnNlZFRlbXBsYXRlLm1hcChhc3luYyAoaW50ZXJuYWxOb2RlKSA9PiB7XG5cdFx0XHRcdFx0XHRwcm9jZXNzU2xvdHMob0FnZ3JlZ2F0aW9ucywgb01ldGFkYXRhLmFnZ3JlZ2F0aW9ucywgaW50ZXJuYWxOb2RlLCBmYWxzZSk7XG5cdFx0XHRcdFx0XHRyZXR1cm4gb0NvbnRleHRWaXNpdG9yLnZpc2l0Tm9kZShpbnRlcm5hbE5vZGUpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdG9Qcm9taXNlID0gUHJvbWlzZS5hbGwodmlzaXRlZE5vZGVzKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRvTm9kZS5yZW1vdmUoKTtcblx0XHRcdFx0XHRvUHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGF3YWl0IG9Qcm9taXNlO1xuXHRcdFx0Y29uc3Qgb01hY3JvRWxlbWVudCA9IG9QYXJlbnQuY2hpbGRyZW5baUNoaWxkSW5kZXhdO1xuXHRcdFx0cHJvY2Vzc1Nsb3RzKG9BZ2dyZWdhdGlvbnMsIG9NZXRhZGF0YS5hZ2dyZWdhdGlvbnMsIG9NYWNyb0VsZW1lbnQsIHRydWUpO1xuXHRcdFx0aWYgKG9NYWNyb0VsZW1lbnQgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRjb25zdCBvUmVtYWluaW5nU2xvdHMgPSBvTWFjcm9FbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJzbG90XCIpO1xuXHRcdFx0XHRvUmVtYWluaW5nU2xvdHMuZm9yRWFjaChmdW5jdGlvbiAob1Nsb3RFbGVtZW50KSB7XG5cdFx0XHRcdFx0b1Nsb3RFbGVtZW50LnJlbW92ZSgpO1xuXHRcdFx0XHR9KTtcblx0XHRcdFx0aWYgKGNvcmVSZXF1aXJlKSB7XG5cdFx0XHRcdFx0bGV0IHJlcXVpcmVPbk1hY3JvID0gb01hY3JvRWxlbWVudC5nZXRBdHRyaWJ1dGVOUyhcInNhcC51aS5jb3JlXCIsIFwicmVxdWlyZVwiKTtcblx0XHRcdFx0XHRpZiAocmVxdWlyZU9uTWFjcm8pIHtcblx0XHRcdFx0XHRcdHJlcXVpcmVPbk1hY3JvID0gcmVxdWlyZU9uTWFjcm8uc3Vic3RyaW5nKDAsIHJlcXVpcmVPbk1hY3JvLmxlbmd0aCAtIDEpICsgXCIsXCIgKyBjb3JlUmVxdWlyZS5zdWJzdHJpbmcoMSk7IC8vIFJlbW92ZSBsYXN0IH0gYW5kIGZpcnN0IHtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0cmVxdWlyZU9uTWFjcm8gPSBjb3JlUmVxdWlyZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0b01hY3JvRWxlbWVudC5zZXRBdHRyaWJ1dGVOUyhcInNhcC51aS5jb3JlXCIsIFwiY29yZTpyZXF1aXJlXCIsIHJlcXVpcmVPbk1hY3JvKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAocHJvcGVydHlWYWx1ZXMuY2xhc3MgJiYgIUJ1aWxkaW5nQmxvY2tDbGFzcy5pc1J1bnRpbWUpIHtcblx0XHRcdFx0XHRvTWFjcm9FbGVtZW50LmNsYXNzTGlzdC5hZGQocHJvcGVydHlWYWx1ZXMuY2xhc3MgYXMgc3RyaW5nKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAob1ByZXZpb3VzTWFjcm9JbmZvKSB7XG5cdFx0XHQvL3Jlc3RvcmUgbWFjcm8gaW5mbyBpZiBhdmFpbGFibGVcblx0XHRcdG9TZXR0aW5nc1tcIl9tYWNyb0luZm9cIl0gPSBvUHJldmlvdXNNYWNyb0luZm87XG5cdFx0fSBlbHNlIHtcblx0XHRcdGRlbGV0ZSBvU2V0dGluZ3NbXCJfbWFjcm9JbmZvXCJdO1xuXHRcdH1cblx0fSBjYXRjaCAoZTogdW5rbm93bikge1xuXHRcdC8vIEluIGNhc2UgdGhlcmUgaXMgYSBnZW5lcmljIGVycm9yICh1c3VhbGx5IGNvZGUgZXJyb3IpLCB3ZSByZXRyaWV2ZSB0aGUgY3VycmVudCBjb250ZXh0IGluZm9ybWF0aW9uIGFuZCBjcmVhdGUgYSBkZWRpY2F0ZWQgZXJyb3IgbWVzc2FnZVxuXG5cdFx0Y29uc3QgdHJhY2VEZXRhaWxzID0ge1xuXHRcdFx0aW5pdGlhbFByb3BlcnRpZXM6IHt9IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuXHRcdFx0cmVzb2x2ZWRQcm9wZXJ0aWVzOiB7fSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcblx0XHRcdG1pc3NpbmdDb250ZXh0czogbU1pc3NpbmdDb250ZXh0XG5cdFx0fTtcblx0XHRmb3IgKGNvbnN0IHByb3BlcnR5TmFtZSBvZiBpbml0aWFsS2V5cykge1xuXHRcdFx0Y29uc3QgcHJvcGVydHlWYWx1ZSA9IHByb3BlcnR5VmFsdWVzW3Byb3BlcnR5TmFtZV07XG5cdFx0XHRpZiAoaXNDb250ZXh0KHByb3BlcnR5VmFsdWUpKSB7XG5cdFx0XHRcdHRyYWNlRGV0YWlscy5pbml0aWFsUHJvcGVydGllc1twcm9wZXJ0eU5hbWVdID0ge1xuXHRcdFx0XHRcdHBhdGg6IHByb3BlcnR5VmFsdWUuZ2V0UGF0aCgpLFxuXHRcdFx0XHRcdHZhbHVlOiBwcm9wZXJ0eVZhbHVlLmdldE9iamVjdCgpXG5cdFx0XHRcdH07XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0cmFjZURldGFpbHMuaW5pdGlhbFByb3BlcnRpZXNbcHJvcGVydHlOYW1lXSA9IHByb3BlcnR5VmFsdWU7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGZvciAoY29uc3QgcHJvcGVydHlOYW1lIGluIHByb3BlcnR5VmFsdWVzKSB7XG5cdFx0XHRjb25zdCBwcm9wZXJ0eVZhbHVlID0gcHJvcGVydHlWYWx1ZXNbcHJvcGVydHlOYW1lXTtcblx0XHRcdGlmICghaW5pdGlhbEtleXMuaW5jbHVkZXMocHJvcGVydHlOYW1lKSkge1xuXHRcdFx0XHRpZiAoaXNDb250ZXh0KHByb3BlcnR5VmFsdWUpKSB7XG5cdFx0XHRcdFx0dHJhY2VEZXRhaWxzLnJlc29sdmVkUHJvcGVydGllc1twcm9wZXJ0eU5hbWVdID0ge1xuXHRcdFx0XHRcdFx0cGF0aDogcHJvcGVydHlWYWx1ZS5nZXRQYXRoKCksXG5cdFx0XHRcdFx0XHR2YWx1ZTogcHJvcGVydHlWYWx1ZS5nZXRPYmplY3QoKVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dHJhY2VEZXRhaWxzLnJlc29sdmVkUHJvcGVydGllc1twcm9wZXJ0eU5hbWVdID0gcHJvcGVydHlWYWx1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRMb2cuZXJyb3IoZSBhcyBzdHJpbmcpO1xuXHRcdGNvbnN0IG9FcnJvciA9IGNyZWF0ZUVycm9yWE1MKFxuXHRcdFx0W2BFcnJvciB3aGlsZSBwcm9jZXNzaW5nIGJ1aWxkaW5nIGJsb2NrICR7b01ldGFkYXRhLm5hbWV9YF0sXG5cdFx0XHRvTm9kZS5vdXRlckhUTUwsXG5cdFx0XHR0cmFjZURldGFpbHMsXG5cdFx0XHQoZSBhcyBFcnJvcikuc3RhY2tcblx0XHQpO1xuXHRcdGNvbnN0IG9UZW1wbGF0ZSA9IHBhcnNlWE1MU3RyaW5nKG9FcnJvciwgdHJ1ZSk7XG5cdFx0b05vZGUucmVwbGFjZVdpdGgoLi4ub1RlbXBsYXRlKTtcblx0fVxufVxuZnVuY3Rpb24gYWRkU2luZ2xlQ29udGV4dChcblx0bUNvbnRleHRzOiBSZWNvcmQ8c3RyaW5nLCBDb250ZXh0IHwgdW5kZWZpbmVkPixcblx0b1Zpc2l0b3I6IElWaXNpdG9yQ2FsbGJhY2ssXG5cdG9DdHg6IHtcblx0XHRuYW1lPzogc3RyaW5nO1xuXHRcdHBhdGg6IHN0cmluZztcblx0XHRtb2RlbD86IHN0cmluZztcblx0fVxuKTogdm9pZCB7XG5cdGNvbnN0IHNLZXkgPSAob0N0eC5uYW1lIHx8IG9DdHgubW9kZWwgfHwgdW5kZWZpbmVkKSBhcyBzdHJpbmc7XG5cdGlmIChtQ29udGV4dHNbc0tleV0pIHtcblx0XHRyZXR1cm47IC8vIGRvIG5vdCBhZGQgdHdpY2Vcblx0fVxuXHR0cnkge1xuXHRcdGxldCBzQ29udGV4dFBhdGggPSBvQ3R4LnBhdGg7XG5cdFx0aWYgKG9DdHgubW9kZWwgIT09IG51bGwpIHtcblx0XHRcdHNDb250ZXh0UGF0aCA9IGAke29DdHgubW9kZWx9PiR7c0NvbnRleHRQYXRofWA7XG5cdFx0fVxuXHRcdGNvbnN0IG1TZXR0aW5nID0gb1Zpc2l0b3IuZ2V0U2V0dGluZ3MoKTtcblx0XHRpZiAob0N0eC5tb2RlbCA9PT0gXCJjb252ZXJ0ZXJDb250ZXh0XCIgJiYgb0N0eC5wYXRoLmxlbmd0aCA+IDApIHtcblx0XHRcdG1Db250ZXh0c1tzS2V5XSA9IG1TZXR0aW5nLm1vZGVsc1tvQ3R4Lm1vZGVsXS5nZXRDb250ZXh0KG9DdHgucGF0aCAvKiwgbVNldHRpbmcuYmluZGluZ0NvbnRleHRzW29DdHgubW9kZWxdKi8pOyAvLyBhZGQgdGhlIGNvbnRleHQgdG8gdGhlIHZpc2l0b3Jcblx0XHR9IGVsc2UgaWYgKCFtU2V0dGluZy5iaW5kaW5nQ29udGV4dHNbb0N0eC5tb2RlbCFdICYmIG1TZXR0aW5nLm1vZGVsc1tvQ3R4Lm1vZGVsIV0pIHtcblx0XHRcdG1Db250ZXh0c1tzS2V5XSA9IG1TZXR0aW5nLm1vZGVsc1tvQ3R4Lm1vZGVsIV0uZ2V0Q29udGV4dChvQ3R4LnBhdGgpOyAvLyBhZGQgdGhlIGNvbnRleHQgdG8gdGhlIHZpc2l0b3Jcblx0XHR9IGVsc2Uge1xuXHRcdFx0bUNvbnRleHRzW3NLZXldID0gb1Zpc2l0b3IuZ2V0Q29udGV4dChzQ29udGV4dFBhdGgpOyAvLyBhZGQgdGhlIGNvbnRleHQgdG8gdGhlIHZpc2l0b3Jcblx0XHR9XG5cdH0gY2F0Y2ggKGV4KSB7XG5cdFx0Ly8gaWdub3JlIHRoZSBjb250ZXh0IGFzIHRoaXMgY2FuIG9ubHkgYmUgdGhlIGNhc2UgaWYgdGhlIG1vZGVsIGlzIG5vdCByZWFkeSxcblx0XHQvLyBpLmUuIG5vdCBhIHByZXByb2Nlc3NpbmcgbW9kZWwgYnV0IG1heWJlIGEgbW9kZWwgZm9yIHByb3ZpZGluZyBhZnRlcndhcmRzXG5cdH1cbn1cblxuLyoqXG4gKiBSZWdpc3RlciBhIGJ1aWxkaW5nIGJsb2NrIGRlZmluaXRpb24gdG8gYmUgdXNlZCBpbnNpZGUgdGhlIHhtbCB0ZW1wbGF0ZSBwcm9jZXNzb3IuXG4gKiBAcGFyYW0gQnVpbGRpbmdCbG9ja0NsYXNzIFRoZSBidWlsZGluZyBibG9jayBkZWZpbml0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckJ1aWxkaW5nQmxvY2soQnVpbGRpbmdCbG9ja0NsYXNzOiB0eXBlb2YgQnVpbGRpbmdCbG9ja1RlbXBsYXRpbmdCYXNlKTogdm9pZCB7XG5cdGlmIChCdWlsZGluZ0Jsb2NrQ2xhc3MubWV0YWRhdGEubmFtZXNwYWNlICE9PSB1bmRlZmluZWQpIHtcblx0XHRYTUxQcmVwcm9jZXNzb3IucGx1Z0luKFxuXHRcdFx0YXN5bmMgKG9Ob2RlOiBFbGVtZW50LCBvVmlzaXRvcjogSVZpc2l0b3JDYWxsYmFjaykgPT4gcHJvY2Vzc0J1aWxkaW5nQmxvY2soQnVpbGRpbmdCbG9ja0NsYXNzLCBvTm9kZSwgb1Zpc2l0b3IpLFxuXHRcdFx0QnVpbGRpbmdCbG9ja0NsYXNzLm1ldGFkYXRhLm5hbWVzcGFjZSxcblx0XHRcdEJ1aWxkaW5nQmxvY2tDbGFzcy5tZXRhZGF0YS54bWxUYWcgfHwgQnVpbGRpbmdCbG9ja0NsYXNzLm1ldGFkYXRhLm5hbWVcblx0XHQpO1xuXHR9XG5cdGlmIChCdWlsZGluZ0Jsb2NrQ2xhc3MubWV0YWRhdGEucHVibGljTmFtZXNwYWNlICE9PSB1bmRlZmluZWQpIHtcblx0XHRYTUxQcmVwcm9jZXNzb3IucGx1Z0luKFxuXHRcdFx0YXN5bmMgKG9Ob2RlOiBFbGVtZW50LCBvVmlzaXRvcjogSVZpc2l0b3JDYWxsYmFjaykgPT4gcHJvY2Vzc0J1aWxkaW5nQmxvY2soQnVpbGRpbmdCbG9ja0NsYXNzLCBvTm9kZSwgb1Zpc2l0b3IsIHRydWUpLFxuXHRcdFx0QnVpbGRpbmdCbG9ja0NsYXNzLm1ldGFkYXRhLnB1YmxpY05hbWVzcGFjZSxcblx0XHRcdEJ1aWxkaW5nQmxvY2tDbGFzcy5tZXRhZGF0YS54bWxUYWcgfHwgQnVpbGRpbmdCbG9ja0NsYXNzLm1ldGFkYXRhLm5hbWVcblx0XHQpO1xuXHR9XG59XG5cbi8qKlxuICogVW5SZWdpc3RlciBhIGJ1aWxkaW5nIGJsb2NrIGRlZmluaXRpb24gc28gdGhhdCBpdCBpcyBubyBsb25nZXIgdXNlZCBpbnNpZGUgdGhlIHhtbCB0ZW1wbGF0ZSBwcm9jZXNzb3IuXG4gKiBAcGFyYW0gQnVpbGRpbmdCbG9ja0NsYXNzIFRoZSBidWlsZGluZyBibG9jayBkZWZpbml0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bnJlZ2lzdGVyQnVpbGRpbmdCbG9jayhCdWlsZGluZ0Jsb2NrQ2xhc3M6IHR5cGVvZiBCdWlsZGluZ0Jsb2NrVGVtcGxhdGluZ0Jhc2UpOiB2b2lkIHtcblx0aWYgKEJ1aWxkaW5nQmxvY2tDbGFzcy5tZXRhZGF0YS5uYW1lc3BhY2UgIT09IHVuZGVmaW5lZCkge1xuXHRcdFhNTFByZXByb2Nlc3Nvci5wbHVnSW4oXG5cdFx0XHRudWxsLFxuXHRcdFx0QnVpbGRpbmdCbG9ja0NsYXNzLm1ldGFkYXRhLm5hbWVzcGFjZSxcblx0XHRcdEJ1aWxkaW5nQmxvY2tDbGFzcy5tZXRhZGF0YS54bWxUYWcgfHwgQnVpbGRpbmdCbG9ja0NsYXNzLm1ldGFkYXRhLm5hbWVcblx0XHQpO1xuXHR9XG5cdGlmIChCdWlsZGluZ0Jsb2NrQ2xhc3MubWV0YWRhdGEucHVibGljTmFtZXNwYWNlICE9PSB1bmRlZmluZWQpIHtcblx0XHRYTUxQcmVwcm9jZXNzb3IucGx1Z0luKFxuXHRcdFx0bnVsbCxcblx0XHRcdEJ1aWxkaW5nQmxvY2tDbGFzcy5tZXRhZGF0YS5wdWJsaWNOYW1lc3BhY2UsXG5cdFx0XHRCdWlsZGluZ0Jsb2NrQ2xhc3MubWV0YWRhdGEueG1sVGFnIHx8IEJ1aWxkaW5nQmxvY2tDbGFzcy5tZXRhZGF0YS5uYW1lXG5cdFx0KTtcblx0fVxufVxuXG5mdW5jdGlvbiBjcmVhdGVFcnJvclhNTChlcnJvck1lc3NhZ2VzOiBzdHJpbmdbXSwgeG1sRnJhZ21lbnQ6IHN0cmluZywgYWRkaXRpb25hbERhdGE/OiBvYmplY3QsIHN0YWNrPzogc3RyaW5nKTogc3RyaW5nIHtcblx0Y29uc3QgZXJyb3JMYWJlbHMgPSBlcnJvck1lc3NhZ2VzLm1hcCgoZXJyb3JNZXNzYWdlKSA9PiB4bWxgPG06TGFiZWwgdGV4dD1cIiR7ZXNjYXBlWE1MQXR0cmlidXRlVmFsdWUoZXJyb3JNZXNzYWdlKX1cIi8+YCk7XG5cdGxldCBlcnJvclN0YWNrID0gXCJcIjtcblx0aWYgKHN0YWNrKSB7XG5cdFx0Y29uc3Qgc3RhY2tGb3JtYXR0ZWQgPSBidG9hKGA8cHJlPiR7c3RhY2t9PC9wcmU+YCk7XG5cdFx0ZXJyb3JTdGFjayA9IHhtbGA8bTpGb3JtYXR0ZWRUZXh0IGh0bWxUZXh0PVwiez0gQkJGLmJhc2U2NERlY29kZSgnJHtzdGFja0Zvcm1hdHRlZH0nKSB9XCIgLz5gO1xuXHR9XG5cdGxldCBhZGRpdGlvbmFsVGV4dCA9IFwiXCI7XG5cdGlmIChhZGRpdGlvbmFsRGF0YSkge1xuXHRcdGFkZGl0aW9uYWxUZXh0ID0geG1sYDxtOlZCb3g+XG5cdFx0XHRcdFx0XHQ8bTpMYWJlbCB0ZXh0PVwiVHJhY2UgSW5mb1wiLz5cblx0XHRcdFx0XHRcdDxjb2RlOkNvZGVFZGl0b3IgdHlwZT1cImpzb25cIiAgdmFsdWU9XCIke2B7PSBCQkYuYmFzZTY0RGVjb2RlKCcke2J0b2EoSlNPTi5zdHJpbmdpZnkoYWRkaXRpb25hbERhdGEsIG51bGwsIDQpKX0nKSB9YH1cIiBoZWlnaHQ9XCIzMDBweFwiIC8+XG5cdFx0XHRcdFx0PC9tOlZCb3g+YDtcblx0fVxuXHRyZXR1cm4geG1sYDxjb250cm9sczpGb3JtRWxlbWVudFdyYXBwZXIgeG1sbnM6Y29udHJvbHM9XCJzYXAuZmUuY29yZS5jb250cm9sc1wiPlxuXHRcdFx0XHRcdDxtOlZCb3ggeG1sbnM6bT1cInNhcC5tXCIgeG1sbnM6Y29kZT1cInNhcC51aS5jb2RlZWRpdG9yXCIgY29yZTpyZXF1aXJlPVwie0JCRjonc2FwL2ZlL2NvcmUvYnVpbGRpbmdCbG9ja3MvdGVtcGxhdGluZy9CdWlsZGluZ0Jsb2NrRm9ybWF0dGVyJ31cIj5cblx0XHRcdFx0XHQke2Vycm9yTGFiZWxzfVxuXHRcdFx0XHRcdCR7ZXJyb3JTdGFja31cblx0XHRcdFx0XHRcdDxncmlkOkNTU0dyaWQgZ3JpZFRlbXBsYXRlUm93cz1cImZyXCIgZ3JpZFRlbXBsYXRlQ29sdW1ucz1cInJlcGVhdCgyLDFmcilcIiBncmlkR2FwPVwiMXJlbVwiIHhtbG5zOmdyaWQ9XCJzYXAudWkubGF5b3V0LmNzc2dyaWRcIiA+XG5cdFx0XHRcdFx0XHRcdDxtOlZCb3g+XG5cdFx0XHRcdFx0XHRcdFx0PG06TGFiZWwgdGV4dD1cIkhvdyB0aGUgYnVpbGRpbmcgYmxvY2sgd2FzIGNhbGxlZFwiLz5cblx0XHRcdFx0XHRcdFx0XHQ8Y29kZTpDb2RlRWRpdG9yIHR5cGU9XCJ4bWxcIiB2YWx1ZT1cIiR7YHs9IEJCRi5iYXNlNjREZWNvZGUoJyR7YnRvYSh4bWxGcmFnbWVudC5yZXBsYWNlQWxsKFwiJmd0O1wiLCBcIj5cIikpfScpIH1gfVwiIGhlaWdodD1cIjMwMHB4XCIgLz5cblx0XHRcdFx0XHRcdFx0PC9tOlZCb3g+XG5cdFx0XHRcdFx0XHRcdCR7YWRkaXRpb25hbFRleHR9XG5cdFx0XHRcdFx0XHQ8L2dyaWQ6Q1NTR3JpZD5cblx0XHRcdFx0XHQ8L206VkJveD5cblx0XHRcdFx0PC9jb250cm9sczpGb3JtRWxlbWVudFdyYXBwZXI+YDtcbn1cblxuY29uc3QgdGVtcG9yYXJ5T2JqZWN0U3RvcmU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG5cbi8qKlxuICogU3RvcmVzIGFuIG9iamVjdCB2YWx1ZSBpbiBhIHRlbXBvcmFyeSBzdG9yYWdlIGFuZCByZXR1cm5zIGFuIElEIHVzZWQgdG8gcmV0cmlldmUgdGhpcyB2YWx1ZSBhdCBhIGxhdGVyIHBvaW50IGluIHRpbWUuXG4gKlxuICogUmVxdWlyZWQgYXMgdGhlcmUgaXMgZnVuY3Rpb25hbGl0eSBsaWtlIHRoZSB4bWxgIGZ1bmN0aW9uLCB3aGljaCBtaWdodCB0YWtlIG9iamVjdHMgYXMgcGFyYW1ldGVycyBidXQgbmVlZHMgdG8gcmV0dXJuIGEgc2VyaWFsaXplZCBzdHJpbmcuXG4gKiBAcGFyYW0gdmFsdWUgVmFsdWUgdG8gc3RvcmVcbiAqIEByZXR1cm5zIElEIHRvIHJldHJpZXZlIHRoaXMgdmFsdWVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0b3JlT2JqZWN0VmFsdWUodmFsdWU6IHVua25vd24pOiBzdHJpbmcge1xuXHRjb25zdCBwcm9wZXJ0eVVJRCA9IGAvdWlkLS0ke3VpZCgpfWA7XG5cdHRlbXBvcmFyeU9iamVjdFN0b3JlW3Byb3BlcnR5VUlEXSA9IHZhbHVlO1xuXHRyZXR1cm4gcHJvcGVydHlVSUQ7XG59XG5cbi8qKlxuICogVW5zdG9yZXMgYW4gb2JqZWN0IGZyb20gYSB0ZW1wb3Jhcnkgc3RvcmUgYnkgcmVtb3ZpbmcgaXQgYW5kIHJldHVybmluZyBpdHMgb2JqZWN0IHZhbHVlLlxuICogQHBhcmFtIHByb3BlcnR5VUlEIElEIHRvIHJldHJpZXZlIHRoaXMgdmFsdWVcbiAqIEByZXR1cm5zIE9iamVjdCB2YWx1ZVxuICovXG5mdW5jdGlvbiB1bnN0b3JlT2JqZWN0VmFsdWUocHJvcGVydHlVSUQ6IHN0cmluZyk6IHVua25vd24ge1xuXHRjb25zdCB2YWx1ZSA9IHRlbXBvcmFyeU9iamVjdFN0b3JlW3Byb3BlcnR5VUlEXTtcblx0ZGVsZXRlIHRlbXBvcmFyeU9iamVjdFN0b3JlW3Byb3BlcnR5VUlEXTtcblx0cmV0dXJuIHZhbHVlO1xufVxuXG5sZXQgcHJvY2Vzc05leHRYbWxJblRyYWNlID0gZmFsc2U7XG4vKipcbiAqIE1ha2VzIHN1cmUgdGhhdCBhbGwgeG1sYCBjYWxscyBpbnNpZGUgdGhlIGdpdmVuIG1ldGhvZCBhcmUgcHJvY2Vzc2VkIGluIHRyYWNlIG1vZGUuXG4gKiBAcGFyYW0gbWV0aG9kIFRoZSBtZXRob2QgdG8gZXhlY3V0ZVxuICogQHJldHVybnMgVGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgZ2l2ZW4gbWV0aG9kXG4gKi9cbmNvbnN0IHByb2Nlc3NYbWxJblRyYWNlID0gYXN5bmMgZnVuY3Rpb24gKG1ldGhvZDogKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gUHJvbWlzZTx1bmtub3duPik6IFByb21pc2U8dW5rbm93bj4ge1xuXHRwcm9jZXNzTmV4dFhtbEluVHJhY2UgPSB0cnVlO1xuXHRsZXQgcmV0dXJuVmFsdWU7XG5cdHRyeSB7XG5cdFx0cmV0dXJuVmFsdWUgPSBtZXRob2QoKTtcblx0fSBmaW5hbGx5IHtcblx0XHRwcm9jZXNzTmV4dFhtbEluVHJhY2UgPSBmYWxzZTtcblx0fVxuXHRyZXR1cm4gcmV0dXJuVmFsdWU7XG59O1xuXG4vKipcbiAqIFBhcnNlIGFuIFhNTCBzdHJpbmcgYW5kIHJldHVybiB0aGUgYXNzb2NpYXRlZCBkb2N1bWVudC5cbiAqIEBwYXJhbSB4bWxTdHJpbmcgVGhlIHhtbCBzdHJpbmdcbiAqIEBwYXJhbSBbYWRkRGVmYXVsdE5hbWVzcGFjZXNdIFdoZXRoZXIgb3Igbm90IGRlZmF1bHQgbmFtZXNwYWNlcyBzaG91bGQgYmUgYWRkZWRcbiAqIEByZXR1cm5zIFRoZSBYTUwgZG9jdW1lbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVhNTFN0cmluZyh4bWxTdHJpbmc6IHN0cmluZywgYWRkRGVmYXVsdE5hbWVzcGFjZXMgPSBmYWxzZSk6IEVsZW1lbnRbXSB7XG5cdGlmIChhZGREZWZhdWx0TmFtZXNwYWNlcykge1xuXHRcdHhtbFN0cmluZyA9IGA8dGVtcGxhdGVcblx0XHRcdFx0XHRcdHhtbG5zOnRlbXBsYXRlPVwiaHR0cDovL3NjaGVtYXMuc2FwLmNvbS9zYXB1aTUvZXh0ZW5zaW9uL3NhcC51aS5jb3JlLnRlbXBsYXRlLzFcIlxuXHRcdFx0XHRcdFx0eG1sbnM6bT1cInNhcC5tXCJcblx0XHRcdFx0XHRcdHhtbG5zOm1hY3Jvcz1cInNhcC5mZS5tYWNyb3NcIlxuXHRcdFx0XHRcdFx0eG1sbnM6Y29yZT1cInNhcC51aS5jb3JlXCJcblx0XHRcdFx0XHRcdHhtbG5zOm1kYz1cInNhcC51aS5tZGNcIlxuXHRcdFx0XHRcdFx0eG1sbnM6Y3VzdG9tRGF0YT1cImh0dHA6Ly9zY2hlbWFzLnNhcC5jb20vc2FwdWk1L2V4dGVuc2lvbi9zYXAudWkuY29yZS5DdXN0b21EYXRhLzFcIj4ke3htbFN0cmluZ308L3RlbXBsYXRlPmA7XG5cdH1cblx0Y29uc3QgeG1sRG9jdW1lbnQgPSBET01QYXJzZXJJbnN0YW5jZS5wYXJzZUZyb21TdHJpbmcoeG1sU3RyaW5nLCBcInRleHQveG1sXCIpO1xuXHRsZXQgb3V0cHV0ID0geG1sRG9jdW1lbnQuZmlyc3RFbGVtZW50Q2hpbGQ7XG5cdHdoaWxlIChvdXRwdXQ/LmxvY2FsTmFtZSA9PT0gXCJ0ZW1wbGF0ZVwiKSB7XG5cdFx0b3V0cHV0ID0gb3V0cHV0LmZpcnN0RWxlbWVudENoaWxkO1xuXHR9XG5cdGNvbnN0IGNoaWxkcmVuID0gb3V0cHV0Py5wYXJlbnRFbGVtZW50ID8gb3V0cHV0Py5wYXJlbnRFbGVtZW50LmNoaWxkcmVuIDogW291dHB1dCBhcyBFbGVtZW50XTtcblx0cmV0dXJuIEFycmF5LmZyb20oY2hpbGRyZW4pO1xufVxuXG4vKipcbiAqIEVzY2FwZSBhbiBYTUwgYXR0cmlidXRlIHZhbHVlLlxuICogQHBhcmFtIHZhbHVlIFRoZSBhdHRyaWJ1dGUgdmFsdWUgdG8gZXNjYXBlLlxuICogQHJldHVybnMgVGhlIGVzY2FwZWQgc3RyaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXNjYXBlWE1MQXR0cmlidXRlVmFsdWUodmFsdWU/OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRyZXR1cm4gdmFsdWU/LnJlcGxhY2UoLyYvZywgXCImYW1wO1wiKS5yZXBsYWNlKC88L2csIFwiJmx0O1wiKS5yZXBsYWNlKC9cIi9nLCBcIiZxdW90O1wiKS5yZXBsYWNlKC8nL2csIFwiJmFwb3M7XCIpO1xufVxuXG5mdW5jdGlvbiByZW5kZXJJblRyYWNlTW9kZShvdXRTdHI6IHN0cmluZyk6IHN0cmluZyB7XG5cdGNvbnN0IHhtbFJlc3VsdCA9IHBhcnNlWE1MU3RyaW5nKG91dFN0ciwgdHJ1ZSk7XG5cdGlmICh4bWxSZXN1bHQ/Lmxlbmd0aCA+IDAgJiYgeG1sUmVzdWx0WzBdPy5sb2NhbE5hbWUgPT09IFwicGFyc2VyZXJyb3JcIikge1xuXHRcdGNvbnN0IGVycm9yTWVzc2FnZSA9ICh4bWxSZXN1bHRbMF0gYXMgSFRNTEVsZW1lbnQpLmlubmVyVGV4dCB8fCAoeG1sUmVzdWx0WzBdIGFzIEhUTUxFbGVtZW50KS5pbm5lckhUTUw7XG5cdFx0cmV0dXJuIGNyZWF0ZUVycm9yWE1MKFtlcnJvck1lc3NhZ2Uuc3BsaXQoXCJcXG5cIilbMF1dLCBvdXRTdHIpO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBvdXRTdHI7XG5cdH1cbn1cblxuZXhwb3J0IHR5cGUgWE1MUHJvY2Vzc29yVHlwZVZhbHVlID1cblx0fCBzdHJpbmdcblx0fCBib29sZWFuXG5cdHwgbnVtYmVyXG5cdHwgdW5kZWZpbmVkXG5cdHwgbnVsbFxuXHR8IG9iamVjdFxuXHR8IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG5cdHwgQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPHN0cmluZyB8IGJvb2xlYW4gfCBudW1iZXI+XG5cdHwgQXJyYXk8c3RyaW5nPlxuXHR8IEFycmF5PEZ1bmN0aW9uPlxuXHR8IEZ1bmN0aW9uXG5cdHwgQ29udGV4dDtcbi8qKlxuICogQ3JlYXRlIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB0ZW1wbGF0ZSBsaXRlcmFsIHdoaWxlIGhhbmRsaW5nIHNwZWNpYWwgb2JqZWN0IGNhc2UuXG4gKiBAcGFyYW0gc3RyaW5ncyBUaGUgc3RyaW5nIHBhcnRzIG9mIHRoZSB0ZW1wbGF0ZSBsaXRlcmFsXG4gKiBAcGFyYW0gdmFsdWVzIFRoZSB2YWx1ZXMgcGFydCBvZiB0aGUgdGVtcGxhdGUgbGl0ZXJhbFxuICogQHJldHVybnMgVGhlIFhNTCBzdHJpbmcgZG9jdW1lbnQgcmVwcmVzZW50aW5nIHRoZSBzdHJpbmcgdGhhdCB3YXMgdXNlZC5cbiAqL1xuZXhwb3J0IGNvbnN0IHhtbCA9IChzdHJpbmdzOiBUZW1wbGF0ZVN0cmluZ3NBcnJheSwgLi4udmFsdWVzOiBYTUxQcm9jZXNzb3JUeXBlVmFsdWVbXSk6IHN0cmluZyA9PiB7XG5cdGxldCBvdXRTdHIgPSBcIlwiO1xuXHRsZXQgaTtcblx0Zm9yIChpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykge1xuXHRcdG91dFN0ciArPSBzdHJpbmdzW2ldO1xuXG5cdFx0Ly8gSGFuZGxlIHRoZSBkaWZmZXJlbnQgY2FzZSBvZiBvYmplY3QsIGlmIGl0J3MgYW4gYXJyYXkgd2Ugam9pbiB0aGVtLCBpZiBpdCdzIGEgYmluZGluZyBleHByZXNzaW9uIHRoZW4gd2UgY29tcGlsZSBpdC5cblx0XHRjb25zdCB2YWx1ZSA9IHZhbHVlc1tpXTtcblxuXHRcdGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGggPiAwICYmIHR5cGVvZiB2YWx1ZVswXSA9PT0gXCJzdHJpbmdcIikge1xuXHRcdFx0b3V0U3RyICs9IHZhbHVlLmZsYXQoNSkuam9pbihcIlxcblwiKS50cmltKCk7XG5cdFx0fSBlbHNlIGlmIChpc0Z1bmN0aW9uQXJyYXkodmFsdWUpKSB7XG5cdFx0XHRvdXRTdHIgKz0gdmFsdWUubWFwKCh2YWx1ZWZuKSA9PiB2YWx1ZWZuKCkpLmpvaW4oXCJcXG5cIik7XG5cdFx0fSBlbHNlIGlmIChpc0JpbmRpbmdUb29sa2l0RXhwcmVzc2lvbih2YWx1ZSkpIHtcblx0XHRcdGNvbnN0IGNvbXBpbGVkRXhwcmVzc2lvbiA9IGNvbXBpbGVFeHByZXNzaW9uKHZhbHVlKTtcblx0XHRcdG91dFN0ciArPSBlc2NhcGVYTUxBdHRyaWJ1dGVWYWx1ZShjb21waWxlZEV4cHJlc3Npb24pO1xuXHRcdH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSBcInVuZGVmaW5lZFwiKSB7XG5cdFx0XHRvdXRTdHIgKz0gXCJ7dGhpcz51bmRlZmluZWRWYWx1ZX1cIjtcblx0XHR9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdFx0XHRvdXRTdHIgKz0gdmFsdWUoKTtcblx0XHR9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuXHRcdFx0aWYgKGlzQ29udGV4dCh2YWx1ZSkpIHtcblx0XHRcdFx0b3V0U3RyICs9IHZhbHVlLmdldFBhdGgoKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IHByb3BlcnR5VUlkID0gc3RvcmVPYmplY3RWYWx1ZSh2YWx1ZSk7XG5cdFx0XHRcdG91dFN0ciArPSBgJHtwcm9wZXJ0eVVJZH1gO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmICF2YWx1ZS5zdGFydHNXaXRoKFwiPFwiKSAmJiAhdmFsdWUuc3RhcnRzV2l0aChcIiZsdDtcIikpIHtcblx0XHRcdG91dFN0ciArPSBlc2NhcGVYTUxBdHRyaWJ1dGVWYWx1ZSh2YWx1ZSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG91dFN0ciArPSB2YWx1ZTtcblx0XHR9XG5cdH1cblx0b3V0U3RyICs9IHN0cmluZ3NbaV07XG5cdG91dFN0ciA9IG91dFN0ci50cmltKCk7XG5cdGlmIChwcm9jZXNzTmV4dFhtbEluVHJhY2UpIHtcblx0XHRyZXR1cm4gcmVuZGVySW5UcmFjZU1vZGUob3V0U3RyKTtcblx0fVxuXHRyZXR1cm4gb3V0U3RyO1xufTtcblxuZXhwb3J0IGNvbnN0IGFkZENvbmRpdGlvbmFsbHlUb1hNTCA9IGZ1bmN0aW9uIChjb25kaXRpb246IGJvb2xlYW4sIHBhcnRUb0FkZDogc3RyaW5nKTogc3RyaW5nIHtcblx0aWYgKGNvbmRpdGlvbikge1xuXHRcdHJldHVybiBwYXJ0VG9BZGQ7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIFwiXCI7XG5cdH1cbn07XG5cbi8qKlxuICogQWRkIGFuIGF0dHJpYnV0ZSBkZXBlbmRpbmcgb24gdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHByb3BlcnR5LlxuICogSWYgaXQncyB1bmRlZmluZWQgdGhlIGF0dHJpYnV0ZSBpcyBub3QgYWRkZWQuXG4gKiBAcGFyYW0gYXR0cmlidXRlTmFtZVxuICogQHBhcmFtIHZhbHVlXG4gKiBAcmV0dXJucyBUaGUgYXR0cmlidXRlIHRvIGFkZCBpZiB0aGUgdmFsdWUgaXMgbm90IHVuZGVmaW5lZCwgb3RoZXJ3aXNlIGFuIGVtcHR5IHN0cmluZ1xuICovXG5leHBvcnQgY29uc3QgYWRkQXR0cmlidXRlVG9YTUwgPSBmdW5jdGlvbiAoYXR0cmlidXRlTmFtZTogc3RyaW5nLCB2YWx1ZT86IFhNTFByb2Nlc3NvclR5cGVWYWx1ZSk6ICgpID0+IHN0cmluZyB7XG5cdGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkICYmICFpc1VuZGVmaW5lZEV4cHJlc3Npb24odmFsdWUpKSB7XG5cdFx0cmV0dXJuICgpID0+IHhtbGAke2F0dHJpYnV0ZU5hbWV9PVwiJHt2YWx1ZX1cImA7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuICgpID0+IFwiXCI7XG5cdH1cbn07XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7O0VBaUNBLE1BQU1BLFlBQVksR0FBRyxzRUFBc0U7RUFDM0YsTUFBTUMsZ0JBQWdCLEdBQUcsZ0VBQWdFO0VBQ3pGLE1BQU1DLGlCQUFpQixHQUFHLElBQUlDLFNBQVMsQ0FBQyxDQUFDOztFQU16QztBQUNBO0FBQ0E7O0VBbUdBLFNBQVNDLDRCQUE0QkEsQ0FDcENDLEtBQWEsRUFDYkMsU0FBa0MsRUFDbENDLGdCQUF3RCxFQUN4REMsSUFBWSxFQUNMO0lBQ1AsTUFBTUMsUUFBUSxHQUFHSCxTQUFTLENBQUNFLElBQUksQ0FBQztJQUNoQyxNQUFNRSxjQUFjLEdBQUdELFFBQVEsYUFBUkEsUUFBUSx1QkFBUkEsUUFBUSxDQUFFRSxTQUFTLENBQUMsQ0FHMUM7SUFFRCxJQUFJSixnQkFBZ0IsQ0FBQ0ssUUFBUSxLQUFLLElBQUksS0FBSyxDQUFDSCxRQUFRLElBQUlDLGNBQWMsS0FBSyxJQUFJLENBQUMsRUFBRTtNQUNqRixNQUFNLElBQUlHLEtBQUssQ0FBQyxHQUFHUixLQUFLLCtCQUErQkcsSUFBSSxjQUFjLENBQUM7SUFDM0UsQ0FBQyxNQUFNLElBQUlFLGNBQWMsRUFBRTtNQUMxQjtNQUNBO01BQ0EsSUFBSUEsY0FBYyxDQUFDSSxjQUFjLENBQUMsT0FBTyxDQUFDLElBQUlKLGNBQWMsQ0FBQ0ssS0FB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