@sapui5/sap.fe.core 1.131.0 → 1.133.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 (317) 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 +17 -23
  4. package/src/sap/fe/core/AppComponent.js +74 -36
  5. package/src/sap/fe/core/AppComponent.ts +70 -3
  6. package/src/sap/fe/core/AppStateHandler.js +44 -13
  7. package/src/sap/fe/core/AppStateHandler.ts +38 -0
  8. package/src/sap/fe/core/BaseController.js +3 -3
  9. package/src/sap/fe/core/CommonUtils.js +30 -37
  10. package/src/sap/fe/core/CommonUtils.ts +15 -13
  11. package/src/sap/fe/core/ExtensionAPI.js +29 -34
  12. package/src/sap/fe/core/ExtensionAPI.ts +3 -0
  13. package/src/sap/fe/core/InsightsFormattersExtension.js +2 -2
  14. package/src/sap/fe/core/PageController.js +40 -31
  15. package/src/sap/fe/core/PageController.ts +14 -1
  16. package/src/sap/fe/core/ResourceModel.js +4 -4
  17. package/src/sap/fe/core/ReuseComponent.js +27 -13
  18. package/src/sap/fe/core/ReuseComponent.ts +18 -0
  19. package/src/sap/fe/core/TemplateComponent.js +102 -89
  20. package/src/sap/fe/core/TemplateComponent.ts +20 -1
  21. package/src/sap/fe/core/TemplateModel.js +6 -7
  22. package/src/sap/fe/core/UIProvider.js +1 -1
  23. package/src/sap/fe/core/UIProvider.ts +2 -9
  24. package/src/sap/fe/core/buildingBlocks/BuildingBlock.js +63 -48
  25. package/src/sap/fe/core/buildingBlocks/BuildingBlock.ts +56 -27
  26. package/src/sap/fe/core/buildingBlocks/IBuildingBlockOwnerComponent.js +9 -0
  27. package/src/sap/fe/core/buildingBlocks/IBuildingBlockOwnerComponent.ts +48 -0
  28. package/src/sap/fe/core/buildingBlocks/TraceInfo.js +4 -6
  29. package/src/sap/fe/core/buildingBlocks/templating/AttributeModel.js +2 -2
  30. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockSupport.js +2 -3
  31. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.js +32 -18
  32. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.ts +30 -3
  33. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplatingBase.js +9 -13
  34. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplatingBase.ts +2 -1
  35. package/src/sap/fe/core/buildingBlocks/templating/RuntimeBuildingBlock.js +2 -2
  36. package/src/sap/fe/core/buildingBlocks/templating/RuntimeBuildingBlockFragment.js +19 -25
  37. package/src/sap/fe/core/buildingBlocks/templating/RuntimeBuildingBlockFragment.ts +1 -1
  38. package/src/sap/fe/core/controllerextensions/BaseControllerExtension.js +3 -4
  39. package/src/sap/fe/core/controllerextensions/CollaborativeDraft.js +20 -24
  40. package/src/sap/fe/core/controllerextensions/CollaborativeDraft.ts +10 -15
  41. package/src/sap/fe/core/controllerextensions/ContextSharing.js +3 -3
  42. package/src/sap/fe/core/controllerextensions/EditFlow.js +296 -246
  43. package/src/sap/fe/core/controllerextensions/EditFlow.ts +253 -175
  44. package/src/sap/fe/core/controllerextensions/Feedback.js +10 -11
  45. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +6 -6
  46. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +1 -0
  47. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +27 -36
  48. package/src/sap/fe/core/controllerextensions/InternalRouting.js +57 -78
  49. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +42 -50
  50. package/src/sap/fe/core/controllerextensions/KPIManagement.js +12 -19
  51. package/src/sap/fe/core/controllerextensions/MessageHandler.js +23 -17
  52. package/src/sap/fe/core/controllerextensions/MessageHandler.ts +21 -7
  53. package/src/sap/fe/core/controllerextensions/PageReady.js +15 -21
  54. package/src/sap/fe/core/controllerextensions/Paginator.js +3 -3
  55. package/src/sap/fe/core/controllerextensions/Placeholder.js +3 -3
  56. package/src/sap/fe/core/controllerextensions/Recommendations.js +23 -36
  57. package/src/sap/fe/core/controllerextensions/Recommendations.ts +1 -1
  58. package/src/sap/fe/core/controllerextensions/Routing.js +3 -3
  59. package/src/sap/fe/core/controllerextensions/Share.js +19 -28
  60. package/src/sap/fe/core/controllerextensions/SideEffects.js +68 -32
  61. package/src/sap/fe/core/controllerextensions/SideEffects.ts +58 -6
  62. package/src/sap/fe/core/controllerextensions/Telemetry.js +4 -5
  63. package/src/sap/fe/core/controllerextensions/ViewState.js +23 -24
  64. package/src/sap/fe/core/controllerextensions/ViewState.ts +6 -1
  65. package/src/sap/fe/core/controllerextensions/cards/CollaborationManager.js +13 -10
  66. package/src/sap/fe/core/controllerextensions/cards/CollaborationManager.ts +13 -8
  67. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js +5 -5
  68. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +15 -16
  69. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.ts +3 -4
  70. package/src/sap/fe/core/controllerextensions/dialog/OperationsDialog.js +288 -0
  71. package/src/sap/fe/core/controllerextensions/dialog/{OperationsDialog.block.tsx → OperationsDialog.tsx} +27 -29
  72. package/src/sap/fe/core/controllerextensions/editFlow/NotApplicableContextDialog.js +41 -5
  73. package/src/sap/fe/core/controllerextensions/editFlow/NotApplicableContextDialog.tsx +61 -8
  74. package/src/sap/fe/core/controllerextensions/editFlow/ODataOperation.js +404 -0
  75. package/src/sap/fe/core/controllerextensions/editFlow/ODataOperation.ts +502 -0
  76. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +35 -43
  77. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +34 -14
  78. package/src/sap/fe/core/controllerextensions/editFlow/draft.js +37 -27
  79. package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +27 -15
  80. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.js +51 -39
  81. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.ts +75 -34
  82. package/src/sap/fe/core/controllerextensions/editFlow/editFlowConstants.js +4 -4
  83. package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.js +88 -427
  84. package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.ts +82 -620
  85. package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +9 -5
  86. package/src/sap/fe/core/controllerextensions/editFlow/sticky.ts +6 -5
  87. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +116 -79
  88. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +87 -13
  89. package/src/sap/fe/core/controllerextensions/pageReady/DataQueryWatcher.js +4 -6
  90. package/src/sap/fe/core/controllerextensions/recommendations/Telemetry.js +5 -7
  91. package/src/sap/fe/core/controllerextensions/routing/ContextPathHelper.js +6 -7
  92. package/src/sap/fe/core/controllerextensions/routing/NavigationReason.js +4 -4
  93. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +58 -20
  94. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.ts +55 -4
  95. package/src/sap/fe/core/controllerextensions/viewState/IViewStateContributor.js +1 -1
  96. package/src/sap/fe/core/controllerextensions/viewState/IViewStateContributor.ts +1 -1
  97. package/src/sap/fe/core/controllerextensions/viewState/IViewStateContributorMixin.js +9 -12
  98. package/src/sap/fe/core/controls/CommandExecution.js +2 -2
  99. package/src/sap/fe/core/controls/ComponentLoader.js +20 -21
  100. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.js +250 -0
  101. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/{DraftDataLossDialog.block.tsx → DraftDataLossDialog.tsx} +31 -19
  102. package/src/sap/fe/core/controls/FormElementWrapper.js +19 -21
  103. package/src/sap/fe/core/controls/HideFormGroupAutomatically.js +114 -0
  104. package/src/sap/fe/core/controls/HideFormGroupAutomatically.ts +115 -0
  105. package/src/sap/fe/core/controls/Recommendations/ConfirmRecommendationDialog.js +454 -0
  106. package/src/sap/fe/core/controls/Recommendations/{ConfirmRecommendationDialog.block.tsx → ConfirmRecommendationDialog.tsx} +5 -9
  107. package/src/sap/fe/core/converters/ConverterContext.js +17 -18
  108. package/src/sap/fe/core/converters/ConverterContext.ts +10 -15
  109. package/src/sap/fe/core/converters/ManifestSettings.js +29 -28
  110. package/src/sap/fe/core/converters/ManifestSettings.ts +22 -1
  111. package/src/sap/fe/core/converters/ManifestWrapper.js +26 -48
  112. package/src/sap/fe/core/converters/MetaModelConverter.js +21 -28
  113. package/src/sap/fe/core/converters/MetaModelConverter.ts +2 -0
  114. package/src/sap/fe/core/converters/TemplateConverter.js +17 -21
  115. package/src/sap/fe/core/converters/TemplateConverter.ts +5 -3
  116. package/src/sap/fe/core/converters/annotations/DataField.js +69 -66
  117. package/src/sap/fe/core/converters/annotations/DataField.ts +30 -0
  118. package/src/sap/fe/core/converters/common/AnnotationConverter.js +20 -23
  119. package/src/sap/fe/core/converters/controls/Common/Action.js +178 -43
  120. package/src/sap/fe/core/converters/controls/Common/Action.ts +202 -19
  121. package/src/sap/fe/core/converters/controls/Common/Chart.js +47 -22
  122. package/src/sap/fe/core/converters/controls/Common/Chart.ts +50 -5
  123. package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +16 -23
  124. package/src/sap/fe/core/converters/controls/Common/Form.js +25 -38
  125. package/src/sap/fe/core/converters/controls/Common/Form.ts +3 -0
  126. package/src/sap/fe/core/converters/controls/Common/KPI.js +32 -47
  127. package/src/sap/fe/core/converters/controls/Common/Table.js +464 -506
  128. package/src/sap/fe/core/converters/controls/Common/Table.ts +335 -219
  129. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +17 -28
  130. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +1 -2
  131. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +66 -90
  132. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +10 -1
  133. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +49 -73
  134. package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.js +6 -10
  135. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +35 -50
  136. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +110 -60
  137. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +137 -41
  138. package/src/sap/fe/core/converters/helpers/Aggregation.js +19 -30
  139. package/src/sap/fe/core/converters/helpers/Aggregation.ts +5 -5
  140. package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +11 -14
  141. package/src/sap/fe/core/converters/helpers/DataFieldHelper.js +14 -21
  142. package/src/sap/fe/core/converters/helpers/InsightsHelpers.js +4 -6
  143. package/src/sap/fe/core/converters/helpers/IssueManager.js +7 -7
  144. package/src/sap/fe/core/converters/helpers/Key.js +1 -1
  145. package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.js +2 -3
  146. package/src/sap/fe/core/converters/objectPage/FormMenuActions.js +18 -52
  147. package/src/sap/fe/core/converters/objectPage/FormMenuActions.ts +0 -34
  148. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +103 -74
  149. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +111 -39
  150. package/src/sap/fe/core/converters/templates/ListReportConverter.js +28 -31
  151. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +17 -9
  152. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +61 -52
  153. package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +60 -21
  154. package/src/sap/fe/core/definition/FEDefinition.js +104 -44
  155. package/src/sap/fe/core/designtime/AppComponent.designtime.js +37 -7
  156. package/src/sap/fe/core/designtime/AppComponent.designtime.ts +42 -2
  157. package/src/sap/fe/core/formatters/CollaborationFormatter.js +4 -5
  158. package/src/sap/fe/core/formatters/FiscalFormat.js +24 -24
  159. package/src/sap/fe/core/formatters/ValueFormatter.js +4 -23
  160. package/src/sap/fe/core/formatters/ValueFormatter.ts +0 -18
  161. package/src/sap/fe/core/fpm/Component.js +12 -14
  162. package/src/sap/fe/core/fpm/manifest.json +1 -1
  163. package/src/sap/fe/core/helpers/AppStartupHelper.js +20 -15
  164. package/src/sap/fe/core/helpers/AppStartupHelper.ts +22 -13
  165. package/src/sap/fe/core/helpers/BindingHelper.js +3 -3
  166. package/src/sap/fe/core/helpers/BindingHelper.ts +1 -1
  167. package/src/sap/fe/core/helpers/DeleteHelper.js +55 -62
  168. package/src/sap/fe/core/helpers/DeleteHelper.ts +48 -51
  169. package/src/sap/fe/core/helpers/ExcelFormatHelper.js +4 -7
  170. package/src/sap/fe/core/helpers/FPMHelper.js +4 -7
  171. package/src/sap/fe/core/helpers/HTTP503Handler.js +2 -1
  172. package/src/sap/fe/core/helpers/HTTP503Handler.ts +4 -3
  173. package/src/sap/fe/core/helpers/KeepAliveHelper.js +5 -5
  174. package/src/sap/fe/core/helpers/KeepAliveRefreshTypes.js +6 -6
  175. package/src/sap/fe/core/helpers/LoaderUtils.js +8 -3
  176. package/src/sap/fe/core/helpers/LoaderUtils.ts +15 -4
  177. package/src/sap/fe/core/helpers/MessageStrip.js +3 -4
  178. package/src/sap/fe/core/helpers/MetaModelFunction.js +26 -40
  179. package/src/sap/fe/core/helpers/MetaPath.js +9 -7
  180. package/src/sap/fe/core/helpers/MetaPath.ts +9 -3
  181. package/src/sap/fe/core/helpers/ModelHelper.js +33 -57
  182. package/src/sap/fe/core/helpers/ModelHelper.ts +3 -3
  183. package/src/sap/fe/core/helpers/PasteHelper.js +11 -19
  184. package/src/sap/fe/core/helpers/PromiseKeeper.js +1 -1
  185. package/src/sap/fe/core/helpers/RecommendationHelper.js +3 -4
  186. package/src/sap/fe/core/helpers/ResourceModelHelper.js +3 -5
  187. package/src/sap/fe/core/helpers/SizeHelper.js +3 -5
  188. package/src/sap/fe/core/helpers/StableIdHelper.js +13 -11
  189. package/src/sap/fe/core/helpers/StableIdHelper.ts +5 -1
  190. package/src/sap/fe/core/helpers/StandardRecommendationHelper.js +28 -38
  191. package/src/sap/fe/core/helpers/Synchronization.js +1 -1
  192. package/src/sap/fe/core/helpers/TitleHelper.js +19 -40
  193. package/src/sap/fe/core/helpers/TitleHelper.ts +5 -25
  194. package/src/sap/fe/core/helpers/TypeGuards.js +25 -18
  195. package/src/sap/fe/core/helpers/TypeGuards.ts +7 -0
  196. package/src/sap/fe/core/helpers/WebSocket.js +4 -4
  197. package/src/sap/fe/core/library.js +8 -7
  198. package/src/sap/fe/core/library.ts +2 -0
  199. package/src/sap/fe/core/manifestMerger/AddNewPage.js +9 -11
  200. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +14 -25
  201. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +15 -17
  202. package/src/sap/fe/core/messagebundle.properties +21 -0
  203. package/src/sap/fe/core/messagebundle_ar.properties +5 -1
  204. package/src/sap/fe/core/messagebundle_bg.properties +4 -0
  205. package/src/sap/fe/core/messagebundle_ca.properties +4 -0
  206. package/src/sap/fe/core/messagebundle_cnr.properties +4 -0
  207. package/src/sap/fe/core/messagebundle_cs.properties +8 -4
  208. package/src/sap/fe/core/messagebundle_cy.properties +4 -0
  209. package/src/sap/fe/core/messagebundle_da.properties +4 -0
  210. package/src/sap/fe/core/messagebundle_de.properties +4 -0
  211. package/src/sap/fe/core/messagebundle_el.properties +4 -0
  212. package/src/sap/fe/core/messagebundle_en.properties +4 -0
  213. package/src/sap/fe/core/messagebundle_en_GB.properties +4 -0
  214. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +4 -0
  215. package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +249 -231
  216. package/src/sap/fe/core/messagebundle_es.properties +5 -1
  217. package/src/sap/fe/core/messagebundle_es_MX.properties +4 -0
  218. package/src/sap/fe/core/messagebundle_et.properties +4 -0
  219. package/src/sap/fe/core/messagebundle_fi.properties +4 -0
  220. package/src/sap/fe/core/messagebundle_fr.properties +6 -2
  221. package/src/sap/fe/core/messagebundle_fr_CA.properties +4 -0
  222. package/src/sap/fe/core/messagebundle_hi.properties +4 -0
  223. package/src/sap/fe/core/messagebundle_hr.properties +4 -0
  224. package/src/sap/fe/core/messagebundle_hu.properties +4 -0
  225. package/src/sap/fe/core/messagebundle_id.properties +4 -0
  226. package/src/sap/fe/core/messagebundle_it.properties +4 -0
  227. package/src/sap/fe/core/messagebundle_iw.properties +4 -0
  228. package/src/sap/fe/core/messagebundle_ja.properties +4 -0
  229. package/src/sap/fe/core/messagebundle_kk.properties +4 -0
  230. package/src/sap/fe/core/messagebundle_ko.properties +4 -0
  231. package/src/sap/fe/core/messagebundle_lt.properties +4 -0
  232. package/src/sap/fe/core/messagebundle_lv.properties +4 -0
  233. package/src/sap/fe/core/messagebundle_mk.properties +4 -0
  234. package/src/sap/fe/core/messagebundle_ms.properties +4 -0
  235. package/src/sap/fe/core/messagebundle_nl.properties +4 -0
  236. package/src/sap/fe/core/messagebundle_no.properties +4 -0
  237. package/src/sap/fe/core/messagebundle_pl.properties +4 -0
  238. package/src/sap/fe/core/messagebundle_pt.properties +4 -0
  239. package/src/sap/fe/core/messagebundle_pt_PT.properties +4 -0
  240. package/src/sap/fe/core/messagebundle_ro.properties +4 -0
  241. package/src/sap/fe/core/messagebundle_ru.properties +4 -0
  242. package/src/sap/fe/core/messagebundle_sh.properties +4 -0
  243. package/src/sap/fe/core/messagebundle_sk.properties +4 -0
  244. package/src/sap/fe/core/messagebundle_sl.properties +4 -0
  245. package/src/sap/fe/core/messagebundle_sr.properties +4 -0
  246. package/src/sap/fe/core/messagebundle_sv.properties +4 -0
  247. package/src/sap/fe/core/messagebundle_th.properties +4 -0
  248. package/src/sap/fe/core/messagebundle_tr.properties +5 -1
  249. package/src/sap/fe/core/messagebundle_uk.properties +4 -0
  250. package/src/sap/fe/core/messagebundle_vi.properties +4 -0
  251. package/src/sap/fe/core/messagebundle_zh_CN.properties +4 -0
  252. package/src/sap/fe/core/messagebundle_zh_TW.properties +4 -0
  253. package/src/sap/fe/core/operationsHelper.js +23 -27
  254. package/src/sap/fe/core/operationsHelper.ts +6 -7
  255. package/src/sap/fe/core/rootView/Fcl.controller.js +53 -40
  256. package/src/sap/fe/core/rootView/Fcl.controller.ts +42 -7
  257. package/src/sap/fe/core/rootView/NavContainer.controller.js +7 -10
  258. package/src/sap/fe/core/rootView/RootViewBaseController.js +22 -21
  259. package/src/sap/fe/core/rootView/RootViewBaseController.ts +10 -2
  260. package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +3 -3
  261. package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +4 -3
  262. package/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +1 -0
  263. package/src/sap/fe/core/services/CollaborationManagerServiceFactory.js +12 -10
  264. package/src/sap/fe/core/services/CollaborationManagerServiceFactory.ts +6 -2
  265. package/src/sap/fe/core/services/CollaborativeToolsServiceFactory.js +8 -13
  266. package/src/sap/fe/core/services/ContextSharingServiceFactory.js +5 -7
  267. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +31 -8
  268. package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +31 -5
  269. package/src/sap/fe/core/services/InlineEditServiceFactory.js +190 -0
  270. package/src/sap/fe/core/services/InlineEditServiceFactory.ts +226 -0
  271. package/src/sap/fe/core/services/NavigationServiceFactory.js +10 -15
  272. package/src/sap/fe/core/services/ResourceModelServiceFactory.js +3 -3
  273. package/src/sap/fe/core/services/RoutingServiceFactory.js +76 -56
  274. package/src/sap/fe/core/services/RoutingServiceFactory.ts +47 -14
  275. package/src/sap/fe/core/services/ShellServicesFactory.js +32 -34
  276. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +75 -60
  277. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +58 -12
  278. package/src/sap/fe/core/services/TelemetryServiceFactory.js +8 -9
  279. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +13 -18
  280. package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +3 -0
  281. package/src/sap/fe/core/services/ValueHelpHistoryServiceFactory.js +7 -9
  282. package/src/sap/fe/core/services/collaborativeDraftServiceFactory.js +12 -16
  283. package/src/sap/fe/core/services/collaborativeDraftServiceFactory.ts +1 -1
  284. package/src/sap/fe/core/services/valueHelpService/HistoryOptOutProvider.js +4 -7
  285. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +5 -6
  286. package/src/sap/fe/core/support/CommonHelper.js +2 -3
  287. package/src/sap/fe/core/support/Diagnostics.js +1 -1
  288. package/src/sap/fe/core/templating/ActionHelper.js +3 -4
  289. package/src/sap/fe/core/templating/CommonFormatters.js +6 -8
  290. package/src/sap/fe/core/templating/CommonFormatters.ts +2 -2
  291. package/src/sap/fe/core/templating/CriticalityFormatters.js +53 -5
  292. package/src/sap/fe/core/templating/CriticalityFormatters.ts +129 -7
  293. package/src/sap/fe/core/templating/DataFieldFormatters.js +8 -11
  294. package/src/sap/fe/core/templating/DataFieldFormatters.ts +1 -1
  295. package/src/sap/fe/core/templating/DataModelPathHelper.js +33 -56
  296. package/src/sap/fe/core/templating/DisplayModeFormatter.js +4 -5
  297. package/src/sap/fe/core/templating/EntitySetHelper.js +11 -19
  298. package/src/sap/fe/core/templating/EntityTypeHelper.js +4 -5
  299. package/src/sap/fe/core/templating/FieldControlHelper.js +13 -20
  300. package/src/sap/fe/core/templating/FilterTemplating.js +6 -9
  301. package/src/sap/fe/core/templating/PropertyHelper.js +33 -63
  302. package/src/sap/fe/core/templating/PropertyHelper.ts +0 -1
  303. package/src/sap/fe/core/templating/SemanticObjectHelper.js +13 -21
  304. package/src/sap/fe/core/templating/UIFormatters.js +57 -78
  305. package/src/sap/fe/core/templating/UIFormatters.ts +2 -1
  306. package/src/sap/fe/core/type/Date.js +2 -2
  307. package/src/sap/fe/core/type/DateTimeWithTimezone.js +3 -3
  308. package/src/sap/fe/core/type/EDM.js +3 -5
  309. package/src/sap/fe/core/type/Email.js +17 -6
  310. package/src/sap/fe/core/type/Email.ts +23 -4
  311. package/src/sap/fe/core/type/FiscalDate.js +8 -9
  312. package/src/sap/fe/core/type/InputMask.js +3 -4
  313. package/src/sap/fe/core/controllerextensions/dialog/OperationsDialog.block.js +0 -299
  314. package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +0 -87
  315. package/src/sap/fe/core/controls/ActionParameterDialogValueHelp.fragment.xml +0 -43
  316. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.block.js +0 -251
  317. package/src/sap/fe/core/controls/Recommendations/ConfirmRecommendationDialog.block.js +0 -471
@@ -2,7 +2,7 @@
2
2
  * SAP UI development toolkit for HTML5 (SAPUI5)
3
3
  * (c) Copyright 2009-2024 SAP SE. All rights reserved
4
4
  */
5
- sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/converters/annotations/DataField", "sap/fe/core/converters/controls/Common/Action", "sap/fe/core/converters/helpers/ConfigurableObject", "sap/fe/core/converters/helpers/IssueManager", "sap/fe/core/converters/helpers/Key", "sap/fe/core/helpers/BindingHelper", "sap/fe/core/helpers/ModelHelper", "sap/fe/core/helpers/StableIdHelper", "sap/fe/core/helpers/TypeGuards", "sap/fe/core/templating/DataModelPathHelper", "sap/fe/core/templating/DisplayModeFormatter", "sap/fe/core/templating/EntitySetHelper", "sap/fe/core/templating/FieldControlHelper", "sap/fe/core/templating/PropertyHelper", "sap/fe/core/templating/UIFormatters", "sap/fe/macros/formatters/TableFormatter", "sap/fe/macros/internal/helpers/ActionHelper", "sap/ui/core/Lib", "sap/ui/core/message/MessageType", "../../ManifestSettings", "../../helpers/Aggregation", "../../helpers/DataFieldHelper", "../../helpers/ID", "./Criticality", "./table/StandardActions"], function (Log, BindingToolkit, DataField, Action, ConfigurableObject, IssueManager, Key, BindingHelper, ModelHelper, StableIdHelper, TypeGuards, DataModelPathHelper, DisplayModeFormatter, EntitySetHelper, FieldControlHelper, PropertyHelper, UIFormatters, tableFormatters, ActionHelper, Library, MessageType, ManifestSettings, Aggregation, DataFieldHelper, ID, Criticality, StandardActions) {
5
+ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/converters/annotations/DataField", "sap/fe/core/converters/controls/Common/Action", "sap/fe/core/converters/helpers/ConfigurableObject", "sap/fe/core/converters/helpers/IssueManager", "sap/fe/core/converters/helpers/Key", "sap/fe/core/helpers/BindingHelper", "sap/fe/core/helpers/ModelHelper", "sap/fe/core/helpers/StableIdHelper", "sap/fe/core/helpers/TypeGuards", "sap/fe/core/templating/CriticalityFormatters", "sap/fe/core/templating/DataModelPathHelper", "sap/fe/core/templating/DisplayModeFormatter", "sap/fe/core/templating/EntitySetHelper", "sap/fe/core/templating/FieldControlHelper", "sap/fe/core/templating/PropertyHelper", "sap/fe/core/templating/UIFormatters", "sap/fe/macros/formatters/TableFormatter", "sap/fe/macros/internal/helpers/ActionHelper", "sap/ui/core/Lib", "sap/ui/core/message/MessageType", "../../ManifestSettings", "../../helpers/Aggregation", "../../helpers/DataFieldHelper", "../../helpers/ID", "./Criticality", "./table/StandardActions"], function (Log, BindingToolkit, DataField, Action, ConfigurableObject, IssueManager, Key, BindingHelper, ModelHelper, StableIdHelper, TypeGuards, CriticalityFormatters, DataModelPathHelper, DisplayModeFormatter, EntitySetHelper, FieldControlHelper, PropertyHelper, UIFormatters, tableFormatters, ActionHelper, Library, MessageType, ManifestSettings, Aggregation, DataFieldHelper, ID, Criticality, StandardActions) {
6
6
  "use strict";
7
7
 
8
8
  var _exports = {};
@@ -40,9 +40,12 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
40
40
  var isTimezone = PropertyHelper.isTimezone;
41
41
  var getStaticUnitOrCurrency = PropertyHelper.getStaticUnitOrCurrency;
42
42
  var getStaticTimezone = PropertyHelper.getStaticTimezone;
43
+ var getAssociatedUnitPropertyPath = PropertyHelper.getAssociatedUnitPropertyPath;
43
44
  var getAssociatedUnitProperty = PropertyHelper.getAssociatedUnitProperty;
44
45
  var getAssociatedTimezoneProperty = PropertyHelper.getAssociatedTimezoneProperty;
46
+ var getAssociatedTextPropertyPath = PropertyHelper.getAssociatedTextPropertyPath;
45
47
  var getAssociatedTextProperty = PropertyHelper.getAssociatedTextProperty;
48
+ var getAssociatedCurrencyPropertyPath = PropertyHelper.getAssociatedCurrencyPropertyPath;
46
49
  var getAssociatedCurrencyProperty = PropertyHelper.getAssociatedCurrencyProperty;
47
50
  var isStaticallyMandatory = FieldControlHelper.isStaticallyMandatory;
48
51
  var hasFieldControlNotMandatory = FieldControlHelper.hasFieldControlNotMandatory;
@@ -54,8 +57,10 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
54
57
  var getTargetObjectPath = DataModelPathHelper.getTargetObjectPath;
55
58
  var getNonUpdatableNavigationProperties = DataModelPathHelper.getNonUpdatableNavigationProperties;
56
59
  var getHierarchyParentNavigationPropertyPath = DataModelPathHelper.getHierarchyParentNavigationPropertyPath;
60
+ var getContextRelativeTargetObjectPath = DataModelPathHelper.getContextRelativeTargetObjectPath;
57
61
  var getContextPropertyRestriction = DataModelPathHelper.getContextPropertyRestriction;
58
62
  var enhanceDataModelPath = DataModelPathHelper.enhanceDataModelPath;
63
+ var criticalityExpressionForIntegrationCards = CriticalityFormatters.criticalityExpressionForIntegrationCards;
59
64
  var isTypeDefinition = TypeGuards.isTypeDefinition;
60
65
  var isProperty = TypeGuards.isProperty;
61
66
  var isPathAnnotationExpression = TypeGuards.isPathAnnotationExpression;
@@ -74,15 +79,20 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
74
79
  var Placement = ConfigurableObject.Placement;
75
80
  var OverrideType = ConfigurableObject.OverrideType;
76
81
  var removeDuplicateActions = Action.removeDuplicateActions;
77
- var isActionNavigable = Action.isActionNavigable;
82
+ var prepareMenuActions = Action.prepareMenuActions;
83
+ var getVisibilityEnablementMenuActions = Action.getVisibilityEnablementMenuActions;
84
+ var getMatchingManifestAction = Action.getMatchingManifestAction;
78
85
  var getEnabledForAnnotationAction = Action.getEnabledForAnnotationAction;
79
86
  var getCopyAction = Action.getCopyAction;
87
+ var getAnnotationMenuActionItems = Action.getAnnotationMenuActionItems;
80
88
  var getActionsFromManifest = Action.getActionsFromManifest;
81
89
  var dataFieldIsCopyAction = Action.dataFieldIsCopyAction;
90
+ var visibleExpression = DataField.visibleExpression;
82
91
  var isRatingVisualizationFromDataFieldDefault = DataField.isRatingVisualizationFromDataFieldDefault;
83
92
  var isDataPointFromDataFieldDefault = DataField.isDataPointFromDataFieldDefault;
84
93
  var isDataFieldTypes = DataField.isDataFieldTypes;
85
94
  var isDataFieldForAnnotation = DataField.isDataFieldForAnnotation;
95
+ var isDataFieldForActionGroup = DataField.isDataFieldForActionGroup;
86
96
  var isDataFieldForActionAbstract = DataField.isDataFieldForActionAbstract;
87
97
  var isDataField = DataField.isDataField;
88
98
  var hasFieldGroupTarget = DataField.hasFieldGroupTarget;
@@ -113,19 +123,18 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
113
123
  /**
114
124
  * New entries are created by navigating to some target
115
125
  */
116
- var ColumnType; // Custom Column from Manifest
117
- (function (ColumnType) {
126
+ var ColumnType = /*#__PURE__*/function (ColumnType) {
118
127
  ColumnType["Default"] = "Default";
119
128
  ColumnType["Annotation"] = "Annotation";
120
129
  ColumnType["Slot"] = "Slot";
121
130
  ColumnType["Computed"] = "Computed";
122
- })(ColumnType || (ColumnType = {})); // Slot Column from Building Block
131
+ return ColumnType;
132
+ }(ColumnType || {}); // Custom Column from Manifest
133
+ // Slot Column from Building Block
123
134
  // Properties all ColumnTypes have:
124
135
  // Properties on Custom Columns and Slot Columns
125
136
  // Properties derived from Manifest to override Annotation configurations
126
137
  // Properties for Annotation Columns
127
- // maximum number of items to open in new tabs simultanously
128
- const selectionLimitForOpenInNewTab = 10;
129
138
  /**
130
139
  * Returns an array of all standard, annotation-based, and manifest-based table actions.
131
140
  * @param lineItemAnnotation
@@ -136,7 +145,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
136
145
  * @returns The complete table actions
137
146
  */
138
147
  function getTableActions(lineItemAnnotation, visualizationPath, converterContext, standardActions, navigationSettings) {
148
+ // 1. Get actions from annotations
139
149
  const tableActions = getTableAnnotationActions(lineItemAnnotation, visualizationPath, converterContext);
150
+ // 2. Get actions from manifest
140
151
  const manifestActions = getActionsFromManifest(converterContext.getManifestControlConfiguration(visualizationPath).actions, converterContext, tableActions.tableActions, navigationSettings, true);
141
152
  // The "Copy" action always needs to be placed after the "Create" action, so we need to separate it
142
153
  const copyActions = tableActions.tableActions.filter(a => a.type === ActionType.Copy);
@@ -147,8 +158,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
147
158
  standardActions.cut, standardActions.paste, standardActions.moveUp, standardActions.moveDown].filter(action => action !== undefined);
148
159
  // Anchor all non-anchored manifest custom actions/menus before the standard actions
149
160
  for (const manifestAction of Object.values(manifestActions.actions)) {
150
- var _manifestAction$posit;
151
- if ((manifestAction.type === ActionType.Default || manifestAction.type === ActionType.Menu) && !((_manifestAction$posit = manifestAction.position) !== null && _manifestAction$posit !== void 0 && _manifestAction$posit.anchor)) {
161
+ if ((manifestAction.type === ActionType.Default || manifestAction.type === ActionType.Menu) && !manifestAction.position?.anchor) {
152
162
  manifestAction.position = {
153
163
  anchor: StandardActionKeys.Create,
154
164
  placement: Placement.Before
@@ -174,14 +184,28 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
174
184
  visibleForContextMenu: OverrideType.overwrite,
175
185
  defaultValuesExtensionFunction: OverrideType.overwrite,
176
186
  command: OverrideType.overwrite,
177
- position: OverrideType.overwrite
187
+ position: OverrideType.overwrite,
188
+ menu: OverrideType.overwrite
178
189
  };
190
+ // 3. Get all annotation menu items
191
+ const annotationMenuActionItems = getAnnotationMenuActionItems(annotationActions);
192
+ // 4. Find manifest actions which override any annotation menu items
193
+ const matchingManifestActions = getMatchingManifestAction(annotationMenuActionItems, manifestActions.actions);
194
+ // 5. Get overridden annotation menu items
195
+ const overwrittenMenuActionItems = insertCustomElements(annotationMenuActionItems, matchingManifestActions, actionOverwriteConfig);
196
+ // 6. Override all actions
179
197
  let actions = insertCustomElements(annotationAndStandardActions, nonStandardManifestActions, actionOverwriteConfig);
180
198
  actions = insertCustomElements(actions, standardManifestActions, {
181
199
  position: OverrideType.overwrite
182
200
  });
201
+ // 7. Replace original menu items with their corresponding overridden menu items
202
+ prepareMenuActions(actions, overwrittenMenuActionItems);
203
+ // 8. Remove duplicate actions which are menu items
204
+ actions = removeDuplicateActions(actions);
205
+ // 9. Hide menus where all menu items are hidden
206
+ actions = getVisibilityEnablementMenuActions(actions);
183
207
  return {
184
- actions,
208
+ actions: actions,
185
209
  commandActions: manifestActions.commandActions
186
210
  };
187
211
  }
@@ -191,13 +215,12 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
191
215
  * @param lineItemAnnotation Collection of data fields for representation in a table or list
192
216
  * @param visualizationPath
193
217
  * @param converterContext
194
- * @param navigationSettings
195
218
  * @returns Returns all table columns that should be available, regardless of templating or personalization or their origin
196
219
  */
197
220
  _exports.getTableActions = getTableActions;
198
- function getTableColumns(lineItemAnnotation, visualizationPath, converterContext, navigationSettings) {
221
+ function getTableColumns(lineItemAnnotation, visualizationPath, converterContext) {
199
222
  const annotationColumns = getColumnsFromAnnotations(lineItemAnnotation, visualizationPath, converterContext);
200
- const manifestColumns = getColumnsFromManifest(converterContext.getManifestControlConfiguration(visualizationPath).columns ?? {}, annotationColumns, converterContext, converterContext.getAnnotationEntityType(lineItemAnnotation), navigationSettings);
223
+ const manifestColumns = getColumnsFromManifest(converterContext.getManifestControlConfiguration(visualizationPath).columns ?? {}, annotationColumns, converterContext, converterContext.getAnnotationEntityType(lineItemAnnotation));
201
224
  const tableColumns = insertCustomElements(annotationColumns, manifestColumns, {
202
225
  width: OverrideType.overwrite,
203
226
  widthIncludingColumnHeader: OverrideType.overwrite,
@@ -222,9 +245,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
222
245
  return property.name === annotation.qualifier;
223
246
  });
224
247
  if (aggregatedProperty) {
225
- var _annotation$annotatio, _annotation$annotatio2, _aggregatedProperty$a;
226
- const contextDefiningProperties = ((_annotation$annotatio = annotation.annotations) === null || _annotation$annotatio === void 0 ? void 0 : (_annotation$annotatio2 = _annotation$annotatio.Aggregation) === null || _annotation$annotatio2 === void 0 ? void 0 : _annotation$annotatio2.ContextDefiningProperties) ?? ((_aggregatedProperty$a = aggregatedProperty.annotations.Aggregation) === null || _aggregatedProperty$a === void 0 ? void 0 : _aggregatedProperty$a.ContextDefiningProperties);
227
- customAggregatedefinitions[aggregatedProperty.name] = (contextDefiningProperties === null || contextDefiningProperties === void 0 ? void 0 : contextDefiningProperties.map(ctxDefProperty => ctxDefProperty.value)) ?? [];
248
+ const contextDefiningProperties = annotation.annotations?.Aggregation?.ContextDefiningProperties ?? aggregatedProperty.annotations.Aggregation?.ContextDefiningProperties;
249
+ customAggregatedefinitions[aggregatedProperty.name] = contextDefiningProperties?.map(ctxDefProperty => ctxDefProperty.value) ?? [];
228
250
  }
229
251
  });
230
252
  return customAggregatedefinitions;
@@ -263,9 +285,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
263
285
  // if there is no custom aggregate definition, and the property is groupable, then we can use the default context defining properties
264
286
  let fromGroupableProperty = false;
265
287
  if (!rawContextDefiningProperties && property && !!aggregationHelper.isPropertyGroupable(property)) {
266
- var _property$annotations, _property$annotations2;
267
288
  fromGroupableProperty = true;
268
- rawContextDefiningProperties = (_property$annotations = property.annotations.Aggregation) === null || _property$annotations === void 0 ? void 0 : (_property$annotations2 = _property$annotations.ContextDefiningProperties) === null || _property$annotations2 === void 0 ? void 0 : _property$annotations2.map(ctxDefProperty => ctxDefProperty.value);
289
+ rawContextDefiningProperties = property.annotations.Aggregation?.ContextDefiningProperties?.map(ctxDefProperty => ctxDefProperty.value);
269
290
  }
270
291
  // Ignore aggregates corresponding to currencies or units of measure
271
292
  if (rawContextDefiningProperties && !currencyOrUnitProperties.has(tableColumn.relativePath)) {
@@ -323,23 +344,37 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
323
344
  } else {
324
345
  tableVisualization.requestAtLeast = ["HasActiveEntity"];
325
346
  }
347
+
348
+ // We always load 'HasDraftEntity' in a LR because it's needed to navigate to the draft instance if there's one when clicking on the active instance
349
+ if (ModelHelper.isDraftRoot(converterContext.getEntitySet())) {
350
+ tableVisualization.requestAtLeast.push("HasDraftEntity");
351
+ }
326
352
  }
353
+ } else {
354
+ Log.error(`Aggregation not supported for this entity type: ${entityType.name}`);
327
355
  }
328
356
  tableVisualization.control.type = "GridTable"; // AnalyticalTable isn't a real type for the MDC:Table, so we always switch back to Grid
329
357
  } else if (tableVisualization.control.type === "ResponsiveTable") {
330
358
  tableVisualization.annotation.groupConditions = getGroupConditions(presentationVariantAnnotation, tableVisualization.columns, tableVisualization.control.type);
331
359
  } else if (tableVisualization.control.type === "TreeTable") {
332
- var _entityType$annotatio, _entityType$annotatio2, _entityType$annotatio3, _entityType$annotatio4;
333
360
  const aggregationHelper = new AggregationHelper(entityType, converterContext);
334
361
  const allowedTransformations = aggregationHelper.getAllowedTransformations();
335
362
  tableVisualization.enableBasicSearch = allowedTransformations ? allowedTransformations.includes("search") : true;
336
363
  tableVisualization.enable$$getKeepAliveContext = true;
337
- tableVisualization.annotation.changeSiblingForRootsSupported = (entityType === null || entityType === void 0 ? void 0 : (_entityType$annotatio = entityType.annotations.Hierarchy) === null || _entityType$annotatio === void 0 ? void 0 : (_entityType$annotatio2 = _entityType$annotatio[`RecursiveHierarchyActions#${tableVisualization.control.hierarchyQualifier ?? ""}`]) === null || _entityType$annotatio2 === void 0 ? void 0 : _entityType$annotatio2.ChangeSiblingForRootsSupported) ?? true;
338
- tableVisualization.annotation.allowDropBetweenNodes = !!((_entityType$annotatio3 = entityType.annotations.Hierarchy) !== null && _entityType$annotatio3 !== void 0 && (_entityType$annotatio4 = _entityType$annotatio3[`RecursiveHierarchyActions#${tableVisualization.control.hierarchyQualifier ?? ""}`]) !== null && _entityType$annotatio4 !== void 0 && _entityType$annotatio4.ChangeNextSiblingAction);
364
+ tableVisualization.annotation.changeSiblingForRootsSupported = entityType?.annotations.Hierarchy?.[`RecursiveHierarchyActions#${tableVisualization.control.hierarchyQualifier ?? ""}`]?.ChangeSiblingForRootsSupported ?? true;
365
+ tableVisualization.annotation.allowDropBetweenNodes = !!entityType.annotations.Hierarchy?.[`RecursiveHierarchyActions#${tableVisualization.control.hierarchyQualifier ?? ""}`]?.ChangeNextSiblingAction;
366
+
367
+ // We always load 'HasDraftEntity' in a LR because it's needed to navigate to the draft instance if there's one when clicking on the active instance
368
+ if (ModelHelper.isDraftRoot(converterContext.getEntitySet())) {
369
+ if (tableVisualization.requestAtLeast) {
370
+ tableVisualization.requestAtLeast.push("HasDraftEntity");
371
+ } else {
372
+ tableVisualization.requestAtLeast = ["HasDraftEntity"];
373
+ }
374
+ }
339
375
  }
340
376
  if (tableVisualization.control.enableUploadPlugin) {
341
- var _converterContext$get, _converterContext$get2, _converterContext$get3, _converterContext$get4, _streamProperty$annot, _streamProperty$annot2, _streamProperty$annot3, _streamProperty$annot4, _streamProperty$annot5, _streamProperty$annot6, _streamProperty$annot7, _streamProperty$annot8;
342
- const streamProperty = (_converterContext$get = converterContext.getAnnotationEntityType().annotations) === null || _converterContext$get === void 0 ? void 0 : (_converterContext$get2 = _converterContext$get.UI) === null || _converterContext$get2 === void 0 ? void 0 : (_converterContext$get3 = _converterContext$get2.MediaResource) === null || _converterContext$get3 === void 0 ? void 0 : (_converterContext$get4 = _converterContext$get3.Stream) === null || _converterContext$get4 === void 0 ? void 0 : _converterContext$get4.$target;
377
+ const streamProperty = converterContext.getAnnotationEntityType().annotations?.UI?.MediaResource?.Stream?.$target;
343
378
  if (!streamProperty) {
344
379
  throw "UI.MediaResource annotation with Stream property missing";
345
380
  }
@@ -348,18 +383,13 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
348
383
  const uploadAction = tableVisualization.actions.find(a => a.key === StandardActionKeys.Create);
349
384
  tableVisualization.annotation.uploadTable = {
350
385
  stream: streamProperty.name,
351
- fileName: (_streamProperty$annot = streamProperty.annotations.Core) === null || _streamProperty$annot === void 0 ? void 0 : (_streamProperty$annot2 = _streamProperty$annot.ContentDisposition) === null || _streamProperty$annot2 === void 0 ? void 0 : (_streamProperty$annot3 = _streamProperty$annot2.Filename) === null || _streamProperty$annot3 === void 0 ? void 0 : _streamProperty$annot3.path,
352
- fileNameMaxLength: (_streamProperty$annot4 = streamProperty.annotations.Core) === null || _streamProperty$annot4 === void 0 ? void 0 : (_streamProperty$annot5 = _streamProperty$annot4.ContentDisposition) === null || _streamProperty$annot5 === void 0 ? void 0 : (_streamProperty$annot6 = _streamProperty$annot5.Filename) === null || _streamProperty$annot6 === void 0 ? void 0 : (_streamProperty$annot7 = _streamProperty$annot6.$target) === null || _streamProperty$annot7 === void 0 ? void 0 : _streamProperty$annot7.maxLength,
353
- acceptableMediaTypes: (_streamProperty$annot8 = streamProperty.annotations.Core) === null || _streamProperty$annot8 === void 0 ? void 0 : _streamProperty$annot8.AcceptableMediaTypes,
386
+ fileName: streamProperty.annotations.Core?.ContentDisposition?.Filename?.path,
387
+ fileNameMaxLength: streamProperty.annotations.Core?.ContentDisposition?.Filename?.$target?.maxLength,
388
+ acceptableMediaTypes: streamProperty.annotations.Core?.AcceptableMediaTypes,
354
389
  maxLength: streamProperty.maxLength,
355
390
  uploadAction: uploadAction
356
391
  };
357
392
  }
358
-
359
- // We don't keep table selection after searching/filtering, except in responsive tables
360
- if (tableVisualization.control.type !== "ResponsiveTable") {
361
- tableVisualization.clearSelectionOnFilter = true;
362
- }
363
393
  }
364
394
 
365
395
  /**
@@ -372,7 +402,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
372
402
  */
373
403
  _exports.updateTableVisualizationForType = updateTableVisualizationForType;
374
404
  function createRequestedProperties(lineItem, converterContext, operationAvailable, presentationVariantAnnotation) {
375
- var _entityType$annotatio5, _converterContext$get5, _converterContext$get6;
376
405
  const entityType = converterContext.getAnnotationEntityType(lineItem);
377
406
  const selectedFields = [];
378
407
  function pushField(field) {
@@ -382,7 +411,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
382
411
  }
383
412
  }
384
413
  function pushFieldList(fields) {
385
- if (fields !== null && fields !== void 0 && fields.length) {
414
+ if (fields?.length) {
386
415
  fields.forEach(pushField);
387
416
  }
388
417
  }
@@ -390,21 +419,19 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
390
419
  const validProperties = operationAvailableProperties.filter(function (propName) {
391
420
  return entityType.resolvePath(propName);
392
421
  });
393
- const semanticKeys = (((_entityType$annotatio5 = entityType.annotations.Common) === null || _entityType$annotatio5 === void 0 ? void 0 : _entityType$annotatio5.SemanticKey) || []).map(semanticKey => semanticKey.value);
394
- const capabilitiesAnnotation = (_converterContext$get5 = converterContext.getEntitySet()) === null || _converterContext$get5 === void 0 ? void 0 : (_converterContext$get6 = _converterContext$get5.annotations) === null || _converterContext$get6 === void 0 ? void 0 : _converterContext$get6.Capabilities;
422
+ const semanticKeys = (entityType.annotations.Common?.SemanticKey || []).map(semanticKey => semanticKey.value);
423
+ const capabilitiesAnnotation = converterContext.getEntitySet()?.annotations?.Capabilities;
395
424
  const alternateAndSecondaryKeys = ModelHelper.getAlternateAndSecondaryKeys(entityType, converterContext.getEntitySet());
396
425
  if (presentationVariantAnnotation) {
397
- var _presentationVariantA;
398
- pushFieldList((_presentationVariantA = presentationVariantAnnotation.RequestAtLeast) === null || _presentationVariantA === void 0 ? void 0 : _presentationVariantA.map(propertyPath => propertyPath.value));
426
+ pushFieldList(presentationVariantAnnotation.RequestAtLeast?.map(propertyPath => propertyPath.value));
399
427
  }
400
428
  pushFieldList(getNavigationAvailableFieldsFromLineItem(lineItem, entityType));
401
429
  pushFieldList(validProperties);
402
430
  pushFieldList(semanticKeys);
403
431
  pushFieldList(alternateAndSecondaryKeys);
404
432
  if (capabilitiesAnnotation) {
405
- var _capabilitiesAnnotati, _capabilitiesAnnotati2, _capabilitiesAnnotati3, _capabilitiesAnnotati4;
406
- pushField((_capabilitiesAnnotati = capabilitiesAnnotation.DeleteRestrictions) === null || _capabilitiesAnnotati === void 0 ? void 0 : (_capabilitiesAnnotati2 = _capabilitiesAnnotati.Deletable) === null || _capabilitiesAnnotati2 === void 0 ? void 0 : _capabilitiesAnnotati2.path);
407
- pushField((_capabilitiesAnnotati3 = capabilitiesAnnotation.UpdateRestrictions) === null || _capabilitiesAnnotati3 === void 0 ? void 0 : (_capabilitiesAnnotati4 = _capabilitiesAnnotati3.Updatable) === null || _capabilitiesAnnotati4 === void 0 ? void 0 : _capabilitiesAnnotati4.path);
433
+ pushField(capabilitiesAnnotation.DeleteRestrictions?.Deletable?.path);
434
+ pushField(capabilitiesAnnotation.UpdateRestrictions?.Updatable?.path);
408
435
  }
409
436
  return selectedFields;
410
437
  }
@@ -460,62 +487,94 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
460
487
  }
461
488
  /**
462
489
  * Sets the 'unit', 'textArrangement', 'timezone' and 'exportsettings' properties in columns when necessary.
463
- * @param entityType The entity type displayed in the table
490
+ * @param converterContext The instance of the converter context
464
491
  * @param tableColumns The columns to be updated
465
492
  */
466
- function updateLinkedProperties(entityType, tableColumns) {
493
+ function updateLinkedProperties(converterContext, tableColumns) {
494
+ const dataModelObjectPath = converterContext.getConverterContextFor(converterContext.getContextPath()).getDataModelObjectPath();
467
495
  tableColumns.forEach(oColumn => {
468
496
  const tableColumn = oColumn;
469
497
  if (tableColumn.propertyInfos === undefined && tableColumn.relativePath) {
470
- const property = entityType.entityProperties.find(prop => prop.name === tableColumn.relativePath);
498
+ const propertyDataModelObjectPath = enhanceDataModelPath(dataModelObjectPath, tableColumn.relativePath);
499
+ const property = propertyDataModelObjectPath.targetObject;
471
500
  if (property) {
472
- var _property$annotations3, _property$annotations4, _property$annotations9;
473
- const unitProperty = getAssociatedCurrencyProperty(property) || getAssociatedUnitProperty(property);
501
+ addCurrencyOrUoMToProperty(property, propertyDataModelObjectPath, tableColumns, tableColumn);
474
502
  const timezoneProperty = getAssociatedTimezoneProperty(property);
475
- const timezone = property === null || property === void 0 ? void 0 : (_property$annotations3 = property.annotations) === null || _property$annotations3 === void 0 ? void 0 : (_property$annotations4 = _property$annotations3.Common) === null || _property$annotations4 === void 0 ? void 0 : _property$annotations4.Timezone;
476
- if (unitProperty) {
477
- const unitColumn = findColumnByPath(unitProperty.name, tableColumns);
478
- tableColumn.unit = unitColumn === null || unitColumn === void 0 ? void 0 : unitColumn.name;
479
- } else {
480
- var _property$annotations5, _property$annotations6, _property$annotations7, _property$annotations8;
481
- const unit = (property === null || property === void 0 ? void 0 : (_property$annotations5 = property.annotations) === null || _property$annotations5 === void 0 ? void 0 : (_property$annotations6 = _property$annotations5.Measures) === null || _property$annotations6 === void 0 ? void 0 : _property$annotations6.ISOCurrency) || (property === null || property === void 0 ? void 0 : (_property$annotations7 = property.annotations) === null || _property$annotations7 === void 0 ? void 0 : (_property$annotations8 = _property$annotations7.Measures) === null || _property$annotations8 === void 0 ? void 0 : _property$annotations8.Unit);
482
- if (unit) {
483
- tableColumn.unitText = `${unit}`;
484
- }
485
- }
503
+ const timezone = property?.annotations?.Common?.Timezone;
486
504
  if (timezoneProperty) {
487
505
  const oTimezoneColumn = findColumnByPath(timezoneProperty.name, tableColumns);
488
- tableColumn.timezone = oTimezoneColumn === null || oTimezoneColumn === void 0 ? void 0 : oTimezoneColumn.name;
506
+ tableColumn.timezone = oTimezoneColumn?.name;
489
507
  } else if (timezone) {
490
508
  tableColumn.timezoneText = timezone.toString();
491
509
  }
492
- const displayMode = getDisplayMode(property),
493
- textAnnotation = (_property$annotations9 = property.annotations.Common) === null || _property$annotations9 === void 0 ? void 0 : _property$annotations9.Text;
494
- if (isPathAnnotationExpression(textAnnotation) && displayMode !== "Value") {
495
- const textColumn = findColumnByPath(textAnnotation.path, tableColumns);
496
- if (textColumn && textColumn.name !== tableColumn.name) {
497
- tableColumn.textArrangement = {
498
- textProperty: textColumn.name,
499
- mode: displayMode
500
- };
501
- // If text properties are used but hidden, we must include them to the export as there are used in the paste
502
- if (!textColumn.exportSettings) {
503
- textColumn.exportSettings = {
504
- type: "String"
505
- };
506
- }
507
- }
508
- }
510
+ addTextArrangentInfoToProperty(property, propertyDataModelObjectPath, tableColumns, tableColumn);
509
511
  }
510
512
  }
511
513
  });
512
514
  }
515
+
516
+ /**
517
+ * Adds the "unit" property into the columns when neccesary for columns with unit of measure and currencies.
518
+ * @param property The property referenced on the column
519
+ * @param dataModelObjectPath The property DataModelObjectPath.
520
+ * @param tableColumns The list of columns displayed on the table
521
+ * @param tableColumn The table column which adds the currency or unit
522
+ * @returns The updated property with the UoM or currency
523
+ */
513
524
  _exports.updateLinkedProperties = updateLinkedProperties;
525
+ function addCurrencyOrUoMToProperty(property, propertyDataModelObjectPath, tableColumns, tableColumn) {
526
+ const currencyOrUoMProperty = getAssociatedCurrencyPropertyPath(property) || getAssociatedUnitPropertyPath(property);
527
+ if (currencyOrUoMProperty) {
528
+ const currencyOrUoMPropertyDataModelObjectPath = enhanceDataModelPath(propertyDataModelObjectPath, currencyOrUoMProperty);
529
+ const currencyOrUoMRelativePath = getContextRelativeTargetObjectPath(currencyOrUoMPropertyDataModelObjectPath);
530
+ if (currencyOrUoMRelativePath) {
531
+ const unitColumn = findColumnByPath(currencyOrUoMRelativePath, tableColumns);
532
+ tableColumn.unit = unitColumn?.name;
533
+ }
534
+ } else {
535
+ const unit = property?.annotations?.Measures?.ISOCurrency || property?.annotations?.Measures?.Unit;
536
+ if (unit) {
537
+ tableColumn.unitText = `${unit}`;
538
+ }
539
+ }
540
+ }
541
+
542
+ /**
543
+ * Add the "textArrangement" object to columns when necessary for columns containing text, such as descriptions.
544
+ * @param property The property referenced by the column
545
+ * @param dataModelObjectPath The property DataModelObjectPath.
546
+ * @param tableColumns The list of columns displayed on the table
547
+ * @param tableColumn The table column which adds the text
548
+ * @returns The updated property with text arrangement information
549
+ */
550
+
551
+ function addTextArrangentInfoToProperty(property, propertyDataModelObjectPath, tableColumns, tableColumn) {
552
+ const displayMode = getDisplayMode(property),
553
+ textPropertyPath = getAssociatedTextPropertyPath(property);
554
+ if (textPropertyPath && displayMode !== "Value") {
555
+ const textPropertyDataModelObjectPath = enhanceDataModelPath(propertyDataModelObjectPath, textPropertyPath);
556
+ const textRelativePath = getContextRelativeTargetObjectPath(textPropertyDataModelObjectPath);
557
+ if (textRelativePath) {
558
+ const textColumn = findColumnByPath(textRelativePath, tableColumns);
559
+ if (textColumn && textColumn.name !== tableColumn.name) {
560
+ tableColumn.textArrangement = {
561
+ textProperty: textColumn.name,
562
+ mode: displayMode
563
+ };
564
+ // If text properties are used but hidden, we must include them to the export as there are used in the paste
565
+ if (!textColumn.exportSettings) {
566
+ textColumn.exportSettings = {
567
+ type: "String"
568
+ };
569
+ }
570
+ }
571
+ }
572
+ }
573
+ }
514
574
  function getSemanticKeysAndTitleInfo(converterContext) {
515
- var _converterContext$get7, _converterContext$get8, _converterContext$get9, _converterContext$get10, _converterContext$get11, _converterContext$get12, _converterContext$get13, _converterContext$get14, _converterContext$get15, _converterContext$get16, _converterContext$get17, _converterContext$get18, _converterContext$get19;
516
- const headerInfoTitlePath = (_converterContext$get7 = converterContext.getAnnotationEntityType()) === null || _converterContext$get7 === void 0 ? void 0 : (_converterContext$get8 = _converterContext$get7.annotations) === null || _converterContext$get8 === void 0 ? void 0 : (_converterContext$get9 = _converterContext$get8.UI) === null || _converterContext$get9 === void 0 ? void 0 : (_converterContext$get10 = _converterContext$get9.HeaderInfo) === null || _converterContext$get10 === void 0 ? void 0 : (_converterContext$get11 = _converterContext$get10.Title) === null || _converterContext$get11 === void 0 ? void 0 : (_converterContext$get12 = _converterContext$get11.Value) === null || _converterContext$get12 === void 0 ? void 0 : _converterContext$get12.path;
517
- const semanticKeyAnnotations = (_converterContext$get13 = converterContext.getAnnotationEntityType()) === null || _converterContext$get13 === void 0 ? void 0 : (_converterContext$get14 = _converterContext$get13.annotations) === null || _converterContext$get14 === void 0 ? void 0 : (_converterContext$get15 = _converterContext$get14.Common) === null || _converterContext$get15 === void 0 ? void 0 : _converterContext$get15.SemanticKey;
518
- const headerInfoTypeName = converterContext === null || converterContext === void 0 ? void 0 : (_converterContext$get16 = converterContext.getAnnotationEntityType()) === null || _converterContext$get16 === void 0 ? void 0 : (_converterContext$get17 = _converterContext$get16.annotations) === null || _converterContext$get17 === void 0 ? void 0 : (_converterContext$get18 = _converterContext$get17.UI) === null || _converterContext$get18 === void 0 ? void 0 : (_converterContext$get19 = _converterContext$get18.HeaderInfo) === null || _converterContext$get19 === void 0 ? void 0 : _converterContext$get19.TypeName;
575
+ const headerInfoTitlePath = converterContext.getAnnotationEntityType()?.annotations?.UI?.HeaderInfo?.Title?.Value?.path;
576
+ const semanticKeyAnnotations = converterContext.getAnnotationEntityType()?.annotations?.Common?.SemanticKey;
577
+ const headerInfoTypeName = converterContext?.getAnnotationEntityType()?.annotations?.UI?.HeaderInfo?.TypeName;
519
578
  const semanticKeyColumns = [];
520
579
  if (semanticKeyAnnotations) {
521
580
  semanticKeyAnnotations.forEach(function (oColumn) {
@@ -540,7 +599,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
540
599
  } = splitPath(visualizationPath);
541
600
  const navigationTargetPath = getNavigationTargetPath(converterContext, navigationPropertyPath);
542
601
  const navigationSettings = converterContext.getManifestWrapper().getNavigationConfiguration(navigationTargetPath);
543
- const columns = getTableColumns(lineItemAnnotation, visualizationPath, converterContext, navigationSettings);
602
+ const columns = getTableColumns(lineItemAnnotation, visualizationPath, converterContext);
544
603
  const operationAvailableMap = getOperationAvailableMap(lineItemAnnotation, converterContext);
545
604
  const semanticKeysAndHeaderInfoTitle = getSemanticKeysAndTitleInfo(converterContext);
546
605
  const standardActionsConfiguration = getStandardActionsConfiguration(lineItemAnnotation, visualizationPath, converterContext, tableManifestConfig, navigationSettings);
@@ -553,7 +612,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
553
612
  type: VisualizationType.Table,
554
613
  annotation: tableAnnotation,
555
614
  control: tableManifestConfig,
556
- actions: removeDuplicateActions(tableActions.actions),
615
+ actions: tableActions.actions,
557
616
  commandActions: tableActions.commandActions,
558
617
  columns: columns,
559
618
  operationAvailableMap: JSON.stringify(operationAvailableMap),
@@ -566,12 +625,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
566
625
  header: header,
567
626
  headerVisible: tableManifestConfig.headerVisible,
568
627
  requestAtLeast: createRequestedProperties(lineItemAnnotation, converterContext, operationAvailable, presentationVariantAnnotation),
569
- clearSelectionOnFilter: false,
570
- events: {
571
- patchSent: converterContext.getManifestWrapper().getTemplateType() !== TemplateType.ListReport ? ".editFlow.handlePatchSent" : undefined
572
- }
628
+ handlePatchSent: converterContext.getManifestWrapper().getTemplateType() !== TemplateType.ListReport
573
629
  };
574
- updateLinkedProperties(converterContext.getAnnotationEntityType(lineItemAnnotation), columns);
630
+ updateLinkedProperties(converterContext, columns);
575
631
  updateTableVisualizationForType(oVisualization, converterContext.getAnnotationEntityType(lineItemAnnotation), converterContext, presentationVariantAnnotation);
576
632
  return oVisualization;
577
633
  }
@@ -599,12 +655,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
599
655
  enable$$getKeepAliveContext: true,
600
656
  header: tableManifestConfig.header,
601
657
  headerVisible: tableManifestConfig.headerVisible,
602
- clearSelectionOnFilter: false,
603
- events: {
604
- patchSent: converterContext.getManifestWrapper().getTemplateType() !== TemplateType.ListReport ? ".editFlow.handlePatchSent" : undefined
605
- }
658
+ handlePatchSent: converterContext.getManifestWrapper().getTemplateType() !== TemplateType.ListReport
606
659
  };
607
- updateLinkedProperties(converterContext.getEntityType(), columns);
660
+ updateLinkedProperties(converterContext, columns);
608
661
  updateTableVisualizationForType(oVisualization, converterContext.getEntityType(), converterContext);
609
662
  return oVisualization;
610
663
  }
@@ -624,12 +677,11 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
624
677
  * @returns The updatable property for the rows
625
678
  */
626
679
  function getCurrentEntitySetUpdatablePath(converterContext) {
627
- var _entitySet$annotation, _entitySet$annotation2;
628
680
  const restrictions = getRestrictions(converterContext);
629
681
  const entitySet = converterContext.getEntitySet();
630
682
  const updatable = restrictions.isUpdatable;
631
683
  const isOnlyDynamicOnCurrentEntity = !isConstant(updatable.expression) && updatable.navigationExpression._type === "Unresolvable";
632
- const updatableExpression = entitySet === null || entitySet === void 0 ? void 0 : (_entitySet$annotation = entitySet.annotations.Capabilities) === null || _entitySet$annotation === void 0 ? void 0 : (_entitySet$annotation2 = _entitySet$annotation.UpdateRestrictions) === null || _entitySet$annotation2 === void 0 ? void 0 : _entitySet$annotation2.Updatable;
684
+ const updatableExpression = entitySet?.annotations.Capabilities?.UpdateRestrictions?.Updatable;
633
685
  const updatablePropertyPath = isPathAnnotationExpression(updatableExpression) && updatableExpression.path;
634
686
  return isOnlyDynamicOnCurrentEntity ? updatablePropertyPath : "";
635
687
  }
@@ -652,11 +704,10 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
652
704
  }
653
705
  }
654
706
  if (properties.size) {
655
- var _entityType$annotatio6, _entityType$annotatio7, _entityType$annotatio8, _entityType$annotatio9, _entityType$annotatio10;
656
707
  // Some actions have an operation available based on property --> we need to load the HeaderInfo.Title property
657
708
  // so that the dialog on partial actions is displayed properly (BCP 2180271425)
658
709
  const entityType = converterContext.getEntityType();
659
- const titleProperty = (_entityType$annotatio6 = entityType.annotations) === null || _entityType$annotatio6 === void 0 ? void 0 : (_entityType$annotatio7 = _entityType$annotatio6.UI) === null || _entityType$annotatio7 === void 0 ? void 0 : (_entityType$annotatio8 = _entityType$annotatio7.HeaderInfo) === null || _entityType$annotatio8 === void 0 ? void 0 : (_entityType$annotatio9 = _entityType$annotatio8.Title) === null || _entityType$annotatio9 === void 0 ? void 0 : (_entityType$annotatio10 = _entityType$annotatio9.Value) === null || _entityType$annotatio10 === void 0 ? void 0 : _entityType$annotatio10.path;
710
+ const titleProperty = entityType.annotations?.UI?.HeaderInfo?.Title?.Value?.path;
660
711
  if (titleProperty) {
661
712
  properties.add(titleProperty);
662
713
  }
@@ -674,11 +725,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
674
725
  function getUIHiddenExpForActionsRequiringContext(lineItemAnnotation, currentEntityType, contextDataModelObjectPath) {
675
726
  const aUiHiddenPathExpressions = [];
676
727
  lineItemAnnotation.forEach(dataField => {
677
- var _dataField$ActionTarg, _dataField$Inline;
678
728
  // Check if the lineItem context is the same as that of the action:
679
- if (dataField.$Type === "com.sap.vocabularies.UI.v1.DataFieldForAction" && dataField !== null && dataField !== void 0 && (_dataField$ActionTarg = dataField.ActionTarget) !== null && _dataField$ActionTarg !== void 0 && _dataField$ActionTarg.isBound && currentEntityType === (dataField === null || dataField === void 0 ? void 0 : dataField.ActionTarget.sourceEntityType) || dataField.$Type === "com.sap.vocabularies.UI.v1.DataFieldForIntentBasedNavigation" && dataField.RequiresContext && (dataField === null || dataField === void 0 ? void 0 : (_dataField$Inline = dataField.Inline) === null || _dataField$Inline === void 0 ? void 0 : _dataField$Inline.valueOf()) !== true) {
680
- var _dataField$annotation, _dataField$annotation2, _dataField$annotation3;
681
- if (typeof ((_dataField$annotation = dataField.annotations) === null || _dataField$annotation === void 0 ? void 0 : (_dataField$annotation2 = _dataField$annotation.UI) === null || _dataField$annotation2 === void 0 ? void 0 : (_dataField$annotation3 = _dataField$annotation2.Hidden) === null || _dataField$annotation3 === void 0 ? void 0 : _dataField$annotation3.valueOf()) === "object") {
729
+ if (dataField.$Type === "com.sap.vocabularies.UI.v1.DataFieldForAction" && dataField?.ActionTarget?.isBound && currentEntityType === dataField?.ActionTarget.sourceEntityType || dataField.$Type === "com.sap.vocabularies.UI.v1.DataFieldForIntentBasedNavigation" && dataField.RequiresContext && dataField?.Inline?.valueOf() !== true) {
730
+ if (typeof dataField.annotations?.UI?.Hidden?.valueOf() === "object") {
682
731
  aUiHiddenPathExpressions.push(equal(getHiddenExpressionAtTableLevel(dataField, contextDataModelObjectPath), false));
683
732
  }
684
733
  }
@@ -709,8 +758,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
709
758
  * @returns The binding expression
710
759
  */
711
760
  function getHiddenExpressionAtTableLevel(source, contextDataModelObjectPath) {
712
- var _source$annotations, _source$annotations$U;
713
- const expression = (_source$annotations = source.annotations) === null || _source$annotations === void 0 ? void 0 : (_source$annotations$U = _source$annotations.UI) === null || _source$annotations$U === void 0 ? void 0 : _source$annotations$U.Hidden;
761
+ const expression = source.annotations?.UI?.Hidden;
714
762
  let path = getPathFromActionAnnotation(expression);
715
763
  if (typeof path === "object") {
716
764
  return constant(false);
@@ -722,7 +770,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
722
770
  //check if the navigation property is correct:
723
771
  const splitPathForNavigationProperty = path.split("/");
724
772
  const navigationPath = splitPathForNavigationProperty[0];
725
- if (isNavigationProperty(contextDataModelObjectPath === null || contextDataModelObjectPath === void 0 ? void 0 : contextDataModelObjectPath.targetObject) && contextDataModelObjectPath.targetObject.partner === navigationPath) {
773
+ if (isNavigationProperty(contextDataModelObjectPath?.targetObject) && contextDataModelObjectPath.targetObject.partner === navigationPath) {
726
774
  return pathInModel(splitPathForNavigationProperty.slice(1).join("/"));
727
775
  } else {
728
776
  return constant(true);
@@ -748,8 +796,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
748
796
  function updateManifestActionAndTagIt(dataFieldId, dataField, manifestActions) {
749
797
  return Object.keys(manifestActions).some(actionKey => {
750
798
  if (actionKey === dataFieldId) {
751
- var _ActionTarget;
752
- if (dataField !== null && dataField !== void 0 && (_ActionTarget = dataField.ActionTarget) !== null && _ActionTarget !== void 0 && _ActionTarget.isBound || dataField !== null && dataField !== void 0 && dataField.RequiresContext) {
799
+ if (dataField?.ActionTarget?.isBound || dataField?.RequiresContext) {
753
800
  manifestActions[dataFieldId].requiresSelection = true;
754
801
  }
755
802
  return true;
@@ -770,17 +817,15 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
770
817
  */
771
818
  function hasBoundActionsAlwaysVisibleInToolBar(lineItemAnnotation, manifestActions, currentEntityType) {
772
819
  return lineItemAnnotation.some(dataField => {
773
- var _dataField$Inline2, _dataField$annotation4, _dataField$annotation5, _dataField$annotation6, _dataField$annotation7, _dataField$annotation8, _dataField$annotation9;
774
- if ((dataField.$Type === "com.sap.vocabularies.UI.v1.DataFieldForAction" || dataField.$Type === "com.sap.vocabularies.UI.v1.DataFieldForIntentBasedNavigation") && (dataField === null || dataField === void 0 ? void 0 : (_dataField$Inline2 = dataField.Inline) === null || _dataField$Inline2 === void 0 ? void 0 : _dataField$Inline2.valueOf()) !== true && (((_dataField$annotation4 = dataField.annotations) === null || _dataField$annotation4 === void 0 ? void 0 : (_dataField$annotation5 = _dataField$annotation4.UI) === null || _dataField$annotation5 === void 0 ? void 0 : (_dataField$annotation6 = _dataField$annotation5.Hidden) === null || _dataField$annotation6 === void 0 ? void 0 : _dataField$annotation6.valueOf()) === false || ((_dataField$annotation7 = dataField.annotations) === null || _dataField$annotation7 === void 0 ? void 0 : (_dataField$annotation8 = _dataField$annotation7.UI) === null || _dataField$annotation8 === void 0 ? void 0 : (_dataField$annotation9 = _dataField$annotation8.Hidden) === null || _dataField$annotation9 === void 0 ? void 0 : _dataField$annotation9.valueOf()) === undefined)) {
820
+ if ((dataField.$Type === "com.sap.vocabularies.UI.v1.DataFieldForAction" || dataField.$Type === "com.sap.vocabularies.UI.v1.DataFieldForIntentBasedNavigation") && dataField?.Inline?.valueOf() !== true && (dataField.annotations?.UI?.Hidden?.valueOf() === false || dataField.annotations?.UI?.Hidden?.valueOf() === undefined)) {
775
821
  if (dataField.$Type === "com.sap.vocabularies.UI.v1.DataFieldForAction") {
776
- var _dataField$ActionTarg2;
777
822
  const manifestActionId = generate(["DataFieldForAction", dataField.Action]);
778
823
  // if the DataFieldForActon from annotation also exists in the manifest, its visibility will be evaluated later on
779
824
  if (updateManifestActionAndTagIt(manifestActionId, dataField, manifestActions)) {
780
825
  return false;
781
826
  }
782
827
  // Check if the lineItem context is the same as that of the action:
783
- return (dataField === null || dataField === void 0 ? void 0 : (_dataField$ActionTarg2 = dataField.ActionTarget) === null || _dataField$ActionTarg2 === void 0 ? void 0 : _dataField$ActionTarg2.isBound) && currentEntityType === (dataField === null || dataField === void 0 ? void 0 : dataField.ActionTarget.sourceEntityType);
828
+ return dataField?.ActionTarget?.isBound && currentEntityType === dataField?.ActionTarget.sourceEntityType;
784
829
  } else if (dataField.$Type === "com.sap.vocabularies.UI.v1.DataFieldForIntentBasedNavigation") {
785
830
  // if the DataFieldForIntentBasedNavigation from annotation also exists in the manifest, its visibility will be evaluated later on
786
831
  if (updateManifestActionAndTagIt(`DataFieldForIntentBasedNavigation::${dataField.SemanticObject}::${dataField.Action}`, dataField, manifestActions)) {
@@ -809,10 +854,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
809
854
  }
810
855
  return actions;
811
856
  }, []);
812
- return !!customActions.find(action => {
813
- var _action$visible;
814
- return action.requiresSelection && (action.visible === undefined || ((_action$visible = action.visible) === null || _action$visible === void 0 ? void 0 : _action$visible.toString()) === "true");
815
- });
857
+ return !!customActions.find(action => action.requiresSelection && (action.visible === undefined || action.visible?.toString() === "true"));
816
858
  }
817
859
  /**
818
860
  * Iterates over the custom actions (with key requiresSelection) declared in the manifest for the current line item and returns all the
@@ -827,13 +869,12 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
827
869
  const action = manifestActions[actionKey];
828
870
  if (action.requiresSelection === true && action.visible !== undefined) {
829
871
  if (typeof action.visible === "string") {
830
- var _action$visible2;
831
872
  /*The final aim would be to check if the path expression depends on the parent context
832
873
  and considers only those expressions for the expression evaluation,
833
874
  but currently not possible from the manifest as the visible key is bound on the parent entity.
834
875
  Tricky to differentiate the path as it's done for the Hidden annotation.
835
876
  For the time being we consider all the paths of the manifest*/
836
- aVisiblePathExpressions.push(resolveBindingString(action === null || action === void 0 ? void 0 : (_action$visible2 = action.visible) === null || _action$visible2 === void 0 ? void 0 : _action$visible2.valueOf()));
877
+ aVisiblePathExpressions.push(resolveBindingString(action?.visible?.valueOf()));
837
878
  }
838
879
  }
839
880
  });
@@ -855,13 +896,22 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
855
896
  }
856
897
  _exports.getCapabilityRestriction = getCapabilityRestriction;
857
898
  function getSelectionMode(lineItemAnnotation, visualizationPath, converterContext, isEntitySet, targetCapabilities, deleteButtonVisibilityExpression) {
858
- var _tableManifestSetting;
859
899
  let massEditVisibilityExpression = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : constant(false);
860
900
  let cutButtonVisibilityExpression = arguments.length > 7 && arguments[7] !== undefined ? arguments[7] : constant(false);
861
901
  const tableManifestSettings = converterContext.getManifestControlConfiguration(visualizationPath);
862
- let selectionMode = (_tableManifestSetting = tableManifestSettings.tableSettings) === null || _tableManifestSetting === void 0 ? void 0 : _tableManifestSetting.selectionMode;
863
- // If the selection mode is forced to 'None' in the manifest/macro table parameters, we ignore the rest of the logic and keep it as specified
902
+ const tableType = tableManifestSettings.tableSettings?.type;
903
+ let selectionMode = tableManifestSettings.tableSettings?.selectionMode;
904
+
905
+ // The collapse/Expand action of a tree table is a bound action, as a result, a tree table should always have a selection mode to "Multi" when no selectionMode has been set in the manifest
906
+ if (tableType === "TreeTable" && !selectionMode) {
907
+ return SelectionMode.Multi;
908
+ }
909
+
910
+ // If the selection mode is forced to 'None' in the manifest/macro table parameters, we keep it unless here is a delete button
864
911
  if (!lineItemAnnotation || selectionMode === SelectionMode.None) {
912
+ if (targetCapabilities.isDeletable && deleteButtonVisibilityExpression) {
913
+ return compileExpression(ifElse(deleteButtonVisibilityExpression, constant(SelectionMode.Multi), constant(SelectionMode.None)));
914
+ }
865
915
  return SelectionMode.None;
866
916
  }
867
917
  if (selectionMode === SelectionMode.ForceMulti) {
@@ -946,60 +996,29 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
946
996
  const copyDataField = getCopyAction(lineItemAnnotation.filter(dataField => {
947
997
  return dataFieldIsCopyAction(dataField);
948
998
  }));
949
- const sEntityType = converterContext.getEntityType().fullyQualifiedName;
950
- const visibleExpression = function (dataField) {
951
- var _dataField$annotation10, _dataField$annotation11;
952
- return not(equal(getExpressionFromAnnotation(dataField === null || dataField === void 0 ? void 0 : (_dataField$annotation10 = dataField.annotations) === null || _dataField$annotation10 === void 0 ? void 0 : (_dataField$annotation11 = _dataField$annotation10.UI) === null || _dataField$annotation11 === void 0 ? void 0 : _dataField$annotation11.Hidden, [], undefined, converterContext.getRelativeModelPathFunction()), true));
953
- };
954
- // For the context menu, the visibility should also consider the 'inactiveContext' property:
955
- // only when at least one selected context is active (i.e. "contextmenu/inactiveContext" is false), the action should be visible in the context menu
956
- // This is only relevant when the table manifest setting "creationMode" is "InlineCreationRows"
957
- const visibleForContextMenuExpression = function (dataField) {
958
- return and(visibleExpression(dataField), equal(pathInModel("contextmenu/inactiveContext", "internal"), false));
959
- };
960
999
  if (copyDataField) {
961
- var _copyDataField$Label;
962
1000
  tableActions.push({
963
1001
  type: ActionType.Copy,
964
1002
  annotationPath: converterContext.getEntitySetBasedAnnotationPath(copyDataField.fullyQualifiedName),
965
1003
  key: KeyHelper.generateKeyFromDataField(copyDataField),
966
- visible: compileExpression(visibleExpression(copyDataField)),
967
- visibleForContextMenu: compileExpression(visibleForContextMenuExpression(copyDataField)),
968
- text: ((_copyDataField$Label = copyDataField.Label) === null || _copyDataField$Label === void 0 ? void 0 : _copyDataField$Label.toString()) ?? Library.getResourceBundleFor("sap.fe.core").getText("C_COMMON_COPY"),
1004
+ visible: compileExpression(visibleExpression(copyDataField, converterContext)),
1005
+ visibleForContextMenu: compileExpression(visibleForContextMenuExpression(copyDataField, converterContext)),
1006
+ text: copyDataField.Label?.toString() ?? Library.getResourceBundleFor("sap.fe.core").getText("C_COMMON_COPY"),
969
1007
  isNavigable: true
970
1008
  });
971
1009
  }
972
1010
  lineItemAnnotation.filter(dataField => {
973
1011
  return !dataFieldIsCopyAction(dataField);
974
1012
  }).forEach(dataField => {
975
- var _dataField$Inline3, _dataField$Determinin;
976
- if (isDataFieldForActionAbstract(dataField) && ((_dataField$Inline3 = dataField.Inline) === null || _dataField$Inline3 === void 0 ? void 0 : _dataField$Inline3.valueOf()) !== true && ((_dataField$Determinin = dataField.Determining) === null || _dataField$Determinin === void 0 ? void 0 : _dataField$Determinin.valueOf()) !== true) {
977
- switch (dataField.$Type) {
978
- case "com.sap.vocabularies.UI.v1.DataFieldForAction":
979
- const tableAction = {
980
- type: ActionType.DataFieldForAction,
981
- annotationPath: converterContext.getEntitySetBasedAnnotationPath(dataField.fullyQualifiedName),
982
- key: KeyHelper.generateKeyFromDataField(dataField),
983
- visible: compileExpression(visibleExpression(dataField)),
984
- visibleForContextMenu: compileExpression(visibleForContextMenuExpression(dataField)),
985
- isNavigable: true
986
- };
987
- if (_useEnabledExpression(dataField, sEntityType)) {
988
- tableAction.enabled = getEnabledForAnnotationAction(converterContext, dataField.ActionTarget, true);
989
- }
990
- tableActions.push(tableAction);
991
- break;
992
- case "com.sap.vocabularies.UI.v1.DataFieldForIntentBasedNavigation":
993
- tableActions.push({
994
- type: ActionType.DataFieldForIntentBasedNavigation,
995
- annotationPath: converterContext.getEntitySetBasedAnnotationPath(dataField.fullyQualifiedName),
996
- key: KeyHelper.generateKeyFromDataField(dataField),
997
- visible: compileExpression(visibleExpression(dataField)),
998
- visibleForContextMenu: compileExpression(visibleForContextMenuExpression(dataField))
999
- });
1000
- break;
1001
- default:
1002
- break;
1013
+ if (isDataFieldForActionAbstract(dataField) && dataField.Inline?.valueOf() !== true && dataField.Determining?.valueOf() !== true) {
1014
+ const tableAction = getDataFieldAnnotationAction(dataField, converterContext);
1015
+ if (tableAction) {
1016
+ tableActions.push(tableAction);
1017
+ }
1018
+ } else if (isDataFieldForActionGroup(dataField)) {
1019
+ const dataFieldGroup = getDataFieldAnnotationAction(dataField, converterContext);
1020
+ if (dataFieldGroup) {
1021
+ tableActions.push(dataFieldGroup);
1003
1022
  }
1004
1023
  }
1005
1024
  });
@@ -1007,6 +1026,52 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
1007
1026
  tableActions
1008
1027
  };
1009
1028
  }
1029
+
1030
+ // For the context menu, the visibility should also consider the 'inactiveContext' property:
1031
+ // only when at least one selected context is active (i.e. "contextmenu/inactiveContext" is false), the action should be visible in the context menu
1032
+ // This is only relevant when the table manifest setting "creationMode" is "InlineCreationRows"
1033
+ function visibleForContextMenuExpression(dataField, converterContext) {
1034
+ return and(visibleExpression(dataField, converterContext), equal(pathInModel("contextmenu/inactiveContext", "internal"), false));
1035
+ }
1036
+ function getDataFieldAnnotationAction(dataField, converterContext) {
1037
+ switch (dataField.$Type) {
1038
+ case "com.sap.vocabularies.UI.v1.DataFieldForAction":
1039
+ const tableAction = {
1040
+ type: ActionType.DataFieldForAction,
1041
+ annotationPath: converterContext.getEntitySetBasedAnnotationPath(dataField.fullyQualifiedName),
1042
+ key: KeyHelper.generateKeyFromDataField(dataField),
1043
+ visible: compileExpression(visibleExpression(dataField, converterContext)),
1044
+ visibleForContextMenu: compileExpression(visibleForContextMenuExpression(dataField, converterContext)),
1045
+ isNavigable: true
1046
+ };
1047
+ const sEntityType = converterContext.getEntityType().fullyQualifiedName;
1048
+ if (_useEnabledExpression(dataField, sEntityType)) {
1049
+ tableAction.enabled = getEnabledForAnnotationAction(converterContext, dataField.ActionTarget, true);
1050
+ }
1051
+ return tableAction;
1052
+ case "com.sap.vocabularies.UI.v1.DataFieldForIntentBasedNavigation":
1053
+ return {
1054
+ type: ActionType.DataFieldForIntentBasedNavigation,
1055
+ annotationPath: converterContext.getEntitySetBasedAnnotationPath(dataField.fullyQualifiedName),
1056
+ key: KeyHelper.generateKeyFromDataField(dataField),
1057
+ visible: compileExpression(visibleExpression(dataField, converterContext)),
1058
+ visibleForContextMenu: compileExpression(visibleForContextMenuExpression(dataField, converterContext))
1059
+ };
1060
+ case "com.sap.vocabularies.UI.v1.DataFieldForActionGroup":
1061
+ return {
1062
+ type: ActionType.Menu,
1063
+ key: KeyHelper.generateKeyFromDataField(dataField),
1064
+ id: KeyHelper.generateKeyFromDataField(dataField),
1065
+ text: dataField.Label?.toString(),
1066
+ visible: compileExpression(visibleExpression(dataField, converterContext)),
1067
+ visibleForContextMenu: compileExpression(visibleForContextMenuExpression(dataField, converterContext)),
1068
+ menu: dataField.Actions.map(action => getDataFieldAnnotationAction(action, converterContext))
1069
+ };
1070
+ default:
1071
+ return;
1072
+ }
1073
+ }
1074
+
1010
1075
  /**
1011
1076
  * Generate the bindingExpression for the highlight rowSetting parameter.
1012
1077
  * @param criticalityAnnotation Path or value of the criticality
@@ -1024,15 +1089,14 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
1024
1089
  defaultHighlightRowDefinition = getMessageTypeFromCriticalityType(criticalityAnnotation);
1025
1090
  }
1026
1091
  }
1027
- return formatResult([defaultHighlightRowDefinition, pathInModel(`filteredMessages`, "internal"), isDraftRootOrNode && Entity.HasActive, isDraftRootOrNode && Entity.IsActive, `${isDraftRootOrNode}`, pathInModel("@$ui5.fe.contextPath")], tableFormatters.rowHighlighting, targetEntityType);
1092
+ return formatResult([defaultHighlightRowDefinition, pathInModel(`filteredMessages`, "internal"), isDraftRootOrNode && Entity.HasActive, isDraftRootOrNode && Entity.IsActive, `${isDraftRootOrNode}`, pathInModel("@$ui5.fe.contextPath"), UI.IsInactive], tableFormatters.rowHighlighting, targetEntityType);
1028
1093
  }
1029
1094
  function _getCreationBehaviour(lineItemAnnotation, tableManifestConfiguration, converterContext, navigationSettings, visualizationPath) {
1030
- var _newAction2;
1031
- const navigation = (navigationSettings === null || navigationSettings === void 0 ? void 0 : navigationSettings.create) || (navigationSettings === null || navigationSettings === void 0 ? void 0 : navigationSettings.detail);
1095
+ const navigation = navigationSettings?.create || navigationSettings?.detail;
1032
1096
  const tableManifestSettings = converterContext.getManifestControlConfiguration(visualizationPath);
1033
1097
  const originalTableSettings = tableManifestSettings && tableManifestSettings.tableSettings || {};
1034
1098
  // cross-app
1035
- if (navigation !== null && navigation !== void 0 && navigation.outbound && navigation.outboundDetail && navigationSettings !== null && navigationSettings !== void 0 && navigationSettings.create) {
1099
+ if (navigation?.outbound && navigation.outboundDetail && navigationSettings?.create) {
1036
1100
  return {
1037
1101
  mode: "External",
1038
1102
  outbound: navigation.outbound,
@@ -1051,23 +1115,21 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
1051
1115
  }
1052
1116
  let newAction;
1053
1117
  if (lineItemAnnotation) {
1054
- var _converterContext$get20, _targetAnnotationsCom, _targetAnnotationsSes;
1055
1118
  // in-app
1056
- const targetAnnotations = (_converterContext$get20 = converterContext.getEntitySet()) === null || _converterContext$get20 === void 0 ? void 0 : _converterContext$get20.annotations;
1057
- const targetAnnotationsCommon = targetAnnotations === null || targetAnnotations === void 0 ? void 0 : targetAnnotations.Common,
1058
- targetAnnotationsSession = targetAnnotations === null || targetAnnotations === void 0 ? void 0 : targetAnnotations.Session;
1059
- newAction = (targetAnnotationsCommon === null || targetAnnotationsCommon === void 0 ? void 0 : (_targetAnnotationsCom = targetAnnotationsCommon.DraftRoot) === null || _targetAnnotationsCom === void 0 ? void 0 : _targetAnnotationsCom.NewAction) || (targetAnnotationsSession === null || targetAnnotationsSession === void 0 ? void 0 : (_targetAnnotationsSes = targetAnnotationsSession.StickySessionSupported) === null || _targetAnnotationsSes === void 0 ? void 0 : _targetAnnotationsSes.NewAction);
1119
+ const targetAnnotations = converterContext.getEntitySet()?.annotations;
1120
+ const targetAnnotationsCommon = targetAnnotations?.Common,
1121
+ targetAnnotationsSession = targetAnnotations?.Session;
1122
+ newAction = targetAnnotationsCommon?.DraftRoot?.NewAction || targetAnnotationsSession?.StickySessionSupported?.NewAction;
1060
1123
  if (tableManifestConfiguration.creationMode === CreationMode.CreationRow && newAction) {
1061
1124
  // A combination of 'CreationRow' and 'NewAction' does not make sense
1062
1125
  throw Error(`Creation mode '${CreationMode.CreationRow}' can not be used with a custom 'new' action (${newAction})`);
1063
1126
  }
1064
- if (navigation !== null && navigation !== void 0 && navigation.route) {
1065
- var _newAction;
1127
+ if (navigation?.route) {
1066
1128
  // route specified
1067
1129
  return {
1068
1130
  mode: tableManifestConfiguration.creationMode,
1069
1131
  append: tableManifestConfiguration.createAtEnd,
1070
- newAction: (_newAction = newAction) === null || _newAction === void 0 ? void 0 : _newAction.toString(),
1132
+ newAction: newAction?.toString(),
1071
1133
  navigateToTarget: tableManifestConfiguration.creationMode === CreationMode.NewPage ? navigation.route : undefined // navigate only in NewPage mode
1072
1134
  };
1073
1135
  }
@@ -1077,10 +1139,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
1077
1139
  if (converterContext.getTemplateType() === TemplateType.ListReport) {
1078
1140
  Log.error("The creation mode 'NewPage' is used but the navigation configuration to the sub page is missing.");
1079
1141
  } else {
1080
- var _originalTableSetting;
1081
1142
  tableManifestConfiguration.creationMode = CreationMode.Inline;
1082
1143
  // In case there was no specific configuration for the createAtEnd we force it to false
1083
- if (((_originalTableSetting = originalTableSettings.creationMode) === null || _originalTableSetting === void 0 ? void 0 : _originalTableSetting.createAtEnd) === undefined) {
1144
+ if (originalTableSettings.creationMode?.createAtEnd === undefined) {
1084
1145
  tableManifestConfiguration.createAtEnd = false;
1085
1146
  }
1086
1147
  Log.info("The creation mode was changed from 'NewPage' to 'Inline' due to missing navigation configuration to the sub page.");
@@ -1089,36 +1150,42 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
1089
1150
  return {
1090
1151
  mode: tableManifestConfiguration.creationMode,
1091
1152
  append: tableManifestConfiguration.createAtEnd,
1092
- newAction: (_newAction2 = newAction) === null || _newAction2 === void 0 ? void 0 : _newAction2.toString()
1153
+ newAction: newAction?.toString()
1093
1154
  };
1094
1155
  }
1095
- const _getRowConfigurationProperty = function (lineItemAnnotation, converterContext, navigationSettings, targetPath, tableType) {
1096
- let pressProperty, openInNewTabPressProperty, navigationTarget;
1156
+ const _getRowConfigurationProperty = function (lineItemAnnotation, converterContext, navigationSettings, targetPath, tableType, disableNavigation) {
1157
+ let navigationInfo;
1097
1158
  let criticalityProperty = constant(MessageType.None);
1098
1159
  const targetEntityType = converterContext.getEntityType();
1099
- if (navigationSettings && lineItemAnnotation) {
1100
- var _navigationSettings$d, _navigationSettings$d2, _lineItemAnnotation$a, _lineItemAnnotation$a2, _navigationSettings$d3;
1101
- navigationTarget = ((_navigationSettings$d = navigationSettings.display) === null || _navigationSettings$d === void 0 ? void 0 : _navigationSettings$d.target) || ((_navigationSettings$d2 = navigationSettings.detail) === null || _navigationSettings$d2 === void 0 ? void 0 : _navigationSettings$d2.outbound);
1160
+ const criticalityAnnotation = lineItemAnnotation?.annotations?.UI?.Criticality;
1161
+ if (!disableNavigation && navigationSettings && lineItemAnnotation) {
1162
+ const navigationTarget = navigationSettings.display?.target || navigationSettings.detail?.outbound;
1102
1163
  const targetEntitySet = converterContext.getEntitySet();
1103
- criticalityProperty = getHighlightRowBinding((_lineItemAnnotation$a = lineItemAnnotation.annotations) === null || _lineItemAnnotation$a === void 0 ? void 0 : (_lineItemAnnotation$a2 = _lineItemAnnotation$a.UI) === null || _lineItemAnnotation$a2 === void 0 ? void 0 : _lineItemAnnotation$a2.Criticality, !!ModelHelper.getDraftRoot(targetEntitySet) || !!ModelHelper.getDraftNode(targetEntitySet), targetEntityType);
1164
+ criticalityProperty = getHighlightRowBinding(criticalityAnnotation, !!ModelHelper.getDraftRoot(targetEntitySet) || !!ModelHelper.getDraftNode(targetEntitySet), targetEntityType);
1104
1165
  if (navigationTarget) {
1105
- pressProperty = `API.onChevronPressNavigateOutBound($event, $controller ,'${navigationTarget}', \${$parameters>bindingContext})`;
1106
- openInNewTabPressProperty = `.onOpenInNewTabNavigateOutBound('${navigationTarget}', %{internal>contextmenu/selectedContexts}, "", ${selectionLimitForOpenInNewTab})`;
1166
+ navigationInfo = {
1167
+ type: "Outbound",
1168
+ navigationTarget
1169
+ };
1107
1170
  }
1108
- if (!navigationTarget && (_navigationSettings$d3 = navigationSettings.detail) !== null && _navigationSettings$d3 !== void 0 && _navigationSettings$d3.route) {
1109
- const editable = ModelHelper.getDraftRoot(targetEntitySet) || ModelHelper.getDraftNode(targetEntitySet) ? "!${$parameters>bindingContext}.getProperty('IsActiveEntity')" : "undefined";
1110
- const recreateContext = tableType === "AnalyticalTable" ? ", recreateContext: true" : "";
1111
- pressProperty = `API.onTableRowPress($event, $controller, \${$parameters>bindingContext}, { callExtension: true, targetPath: '${targetPath}', editable: ${editable} ${recreateContext} })`; //Need to access to DraftRoot and DraftNode !!!!!!!
1112
- openInNewTabPressProperty = `API.onOpenInNewTabPress($event, $controller, %{internal>contextmenu/selectedContexts}, { callExtension: true, targetPath: '${targetPath}', navMode: 'openInNewTab' }, ${selectionLimitForOpenInNewTab})`;
1171
+ if (!navigationTarget && navigationSettings.detail?.route) {
1172
+ const checkEditable = ModelHelper.getDraftRoot(targetEntitySet) !== undefined || ModelHelper.getDraftNode(targetEntitySet) !== undefined;
1173
+ navigationInfo = {
1174
+ type: "Navigation",
1175
+ routePath: navigationSettings.detail.route,
1176
+ targetPath,
1177
+ checkEditable,
1178
+ recreateContext: tableType === "AnalyticalTable"
1179
+ };
1113
1180
  }
1114
1181
  }
1115
1182
  const rowNavigatedExpression = formatResult([pathInModel("/deepestPath", "internal")], tableFormatters.navigatedRow, targetEntityType);
1116
1183
  return {
1117
- press: pressProperty,
1118
- openInNewTabPress: openInNewTabPressProperty,
1119
- action: pressProperty ? "Navigation" : undefined,
1184
+ navigationInfo,
1185
+ action: navigationInfo ? "Navigation" : undefined,
1120
1186
  rowHighlighting: compileExpression(criticalityProperty),
1121
1187
  rowNavigated: compileExpression(rowNavigatedExpression),
1188
+ rowCriticalityForInsights: criticalityAnnotation ? criticalityExpressionForIntegrationCards(criticalityAnnotation) : undefined,
1122
1189
  visible: compileExpression(not(UI.IsInactive))
1123
1190
  };
1124
1191
  };
@@ -1144,7 +1211,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
1144
1211
  const groupableProperties = aggregationHelper.getGroupableProperties();
1145
1212
  //For Analytical table, we exclude all properties that are not groupable and used as Text in a groupable Property.
1146
1213
  if (tableType === "AnalyticalTable" && aggregationHelper.isAnalyticsSupported() && groupableProperties) {
1147
- propertiesNotToBeConsidered = groupableProperties.map(property => property.$target).filter(target => target !== undefined).map(target => getAssociatedTextProperty(target)).filter(textProp => textProp && !aggregationHelper.isPropertyGroupable(textProp)).map(prop => prop === null || prop === void 0 ? void 0 : prop.name).filter(name => name !== undefined);
1214
+ propertiesNotToBeConsidered = groupableProperties.map(property => property.$target).filter(target => target !== undefined).map(target => getAssociatedTextProperty(target)).filter(textProp => textProp && !aggregationHelper.isPropertyGroupable(textProp)).map(prop => prop?.name).filter(name => name !== undefined);
1148
1215
  }
1149
1216
  entityType.entityProperties.forEach(property => {
1150
1217
  // Catch already existing columns - which were added before by LineItem Annotations
@@ -1187,9 +1254,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
1187
1254
  // but also the property itself as it can be used as within the sortConditions or on custom columns.
1188
1255
  // This step must be valid also from the columns added via LineItems or from a column available on the p13n.
1189
1256
  if (getDisplayMode(property) === "Description") {
1190
- var _property$annotations10, _property$annotations11;
1191
- restrictionsOnProperties === null || restrictionsOnProperties === void 0 ? void 0 : restrictionsOnProperties.nonSortableProperties.push(property.name);
1192
- if (isPathAnnotationExpression(property === null || property === void 0 ? void 0 : (_property$annotations10 = property.annotations) === null || _property$annotations10 === void 0 ? void 0 : (_property$annotations11 = _property$annotations10.Common) === null || _property$annotations11 === void 0 ? void 0 : _property$annotations11.Text)) {
1257
+ restrictionsOnProperties?.nonSortableProperties.push(property.name);
1258
+ if (isPathAnnotationExpression(property?.annotations?.Common?.Text)) {
1193
1259
  tableColumns.push(getColumnDefinitionFromProperty(property, converterContext.getEntitySetBasedAnnotationPath(property.fullyQualifiedName), property.name, false, false, aggregationHelper, converterContext, displayModeOfDescriptionPropertiesMap, restrictionsOnProperties, tableCreationMode));
1194
1260
  }
1195
1261
  }
@@ -1211,13 +1277,12 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
1211
1277
  * @param restrictionsOnProperties The existing restrictions on properties
1212
1278
  * @param tableCreationMode The creation mode of the table
1213
1279
  * @param relatedPropertiesInfo The properties identified so far for the column
1280
+ * @param relativePathForMultiValue The MDC path used for the 1:n property to allow filtering from MDC
1214
1281
  * @returns The annotation column definition
1215
1282
  */
1216
1283
  _exports.getColumnsFromEntityType = getColumnsFromEntityType;
1217
- const getColumnDefinitionFromProperty = function (property, fullPropertyPath, relativePath, useDataFieldPrefix, availableForAdaptation, aggregationHelper, converterContext, displayModeOfDescriptionPropertiesMap, restrictionsOnProperties, tableCreationMode, relatedPropertiesInfo) {
1218
- var _property$annotations12, _property$annotations13;
1219
- const name = useDataFieldPrefix ? relativePath : `Property::${relativePath}`;
1220
- const key = (useDataFieldPrefix ? "DataField::" : "Property::") + replaceSpecialChars(relativePath);
1284
+ const getColumnDefinitionFromProperty = function (property, fullPropertyPath, relativePath, useDataFieldPrefix, availableForAdaptation, aggregationHelper, converterContext, displayModeOfDescriptionPropertiesMap, restrictionsOnProperties, tableCreationMode, relatedPropertiesInfo, relativePathForMultiValue) {
1285
+ let name, key;
1221
1286
  const semanticObjectAnnotationPath = getSemanticObjectPath(converterContext, property);
1222
1287
  const isHidden = isReferencePropertyStaticallyHidden(property);
1223
1288
  const groupPath = property.name ? _sliceAtSlash(property.name, true, false) : undefined;
@@ -1226,8 +1291,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
1226
1291
  const dataType = getDataFieldDataType(property);
1227
1292
  const propertyTypeConfig = getTypeConfig(property, dataType);
1228
1293
  const isAPropertyFromTextOnlyAnnotation = displayModeOfDescriptionPropertiesMap[relativePath] === "Description";
1229
- const sortable = (!isHidden || isAPropertyFromTextOnlyAnnotation) && !(restrictionsOnProperties !== null && restrictionsOnProperties !== void 0 && restrictionsOnProperties.nonSortableProperties.includes(relativePath));
1230
- const filterable = !isAPropertyFromTextOnlyAnnotation && !(restrictionsOnProperties !== null && restrictionsOnProperties !== void 0 && restrictionsOnProperties.nonFilterableProperties.includes(relativePath));
1294
+ const sortable = (!isHidden || isAPropertyFromTextOnlyAnnotation) && !restrictionsOnProperties?.nonSortableProperties.includes(relativePath);
1295
+ const filterable = !isAPropertyFromTextOnlyAnnotation && !restrictionsOnProperties?.nonFilterableProperties.includes(relativePath);
1231
1296
  const typeConfig = {
1232
1297
  className: property.type || dataType,
1233
1298
  formatOptions: propertyTypeConfig.formatOptions,
@@ -1239,6 +1304,14 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
1239
1304
  }
1240
1305
  const availability = !availableForAdaptation || isHidden || displayModeOfDescriptionPropertiesMap[relativePath] ? "Hidden" : "Adaptation";
1241
1306
  const collectedNavigationPropertyLabels = _getCollectedNavigationPropertyLabels(relativePath, converterContext);
1307
+ if (relativePathForMultiValue) {
1308
+ name = relativePathForMultiValue;
1309
+ key = "DataField::" + replaceSpecialChars(relativePathForMultiValue);
1310
+ relativePath = relativePathForMultiValue;
1311
+ } else {
1312
+ name = useDataFieldPrefix ? relativePath : `Property::${relativePath}`;
1313
+ key = (useDataFieldPrefix ? "DataField::" : "Property::") + replaceSpecialChars(relativePath);
1314
+ }
1242
1315
  const column = {
1243
1316
  key: key,
1244
1317
  type: ColumnType.Annotation,
@@ -1257,7 +1330,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
1257
1330
  exportSettings: exportSettings,
1258
1331
  caseSensitive: isFilteringCaseSensitive(converterContext),
1259
1332
  typeConfig: typeConfig,
1260
- importance: getImportance(converterContext, (_property$annotations12 = property.annotations) === null || _property$annotations12 === void 0 ? void 0 : (_property$annotations13 = _property$annotations12.UI) === null || _property$annotations13 === void 0 ? void 0 : _property$annotations13.DataFieldDefault),
1333
+ importance: getImportance(converterContext, property.annotations?.UI?.DataFieldDefault),
1261
1334
  required: isRequiredColumn(converterContext, property, tableCreationMode),
1262
1335
  additionalLabels: collectedNavigationPropertyLabels
1263
1336
  };
@@ -1283,10 +1356,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
1283
1356
  * @returns The export settings in a the given column
1284
1357
  */
1285
1358
  const createColumnExportSettings = function (column, relatedPropertiesInfo) {
1286
- var _relatedPropertiesInf, _unitProperty, _currencyProperty, _relatedPropertiesInf2, _timezoneProperty, _relatedPropertiesInf3, _timezoneText;
1287
1359
  let unitProperty, timezoneProperty, unitText, timezoneText, utc, isATimezone, currencyProperty, scale;
1288
1360
  const relatedPropertyNames = relatedPropertiesInfo ? Object.keys(relatedPropertiesInfo.properties) : [];
1289
- if (relatedPropertiesInfo && (relatedPropertyNames === null || relatedPropertyNames === void 0 ? void 0 : relatedPropertyNames.length) === 1) {
1361
+ if (relatedPropertiesInfo && relatedPropertyNames?.length === 1) {
1290
1362
  // Create the export settings of a column based on the related (child) property in case there is only one.
1291
1363
  // This is required when we have a text only annotation to compute the export settings from the text instead of the value
1292
1364
  column = relatedPropertiesInfo.properties[relatedPropertyNames[0]].annotationProperty;
@@ -1301,10 +1373,10 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
1301
1373
  isATimezone = isTimezone(column);
1302
1374
  scale = column.scale;
1303
1375
  }
1304
- unitProperty = (relatedPropertiesInfo === null || relatedPropertiesInfo === void 0 ? void 0 : (_relatedPropertiesInf = relatedPropertiesInfo.exportSettings) === null || _relatedPropertiesInf === void 0 ? void 0 : _relatedPropertiesInf.unitProperty) ?? ((_unitProperty = unitProperty) === null || _unitProperty === void 0 ? void 0 : _unitProperty.name) ?? ((_currencyProperty = currencyProperty) === null || _currencyProperty === void 0 ? void 0 : _currencyProperty.name);
1305
- timezoneProperty = (relatedPropertiesInfo === null || relatedPropertiesInfo === void 0 ? void 0 : (_relatedPropertiesInf2 = relatedPropertiesInfo.exportSettings) === null || _relatedPropertiesInf2 === void 0 ? void 0 : _relatedPropertiesInf2.timezoneProperty) ?? ((_timezoneProperty = timezoneProperty) === null || _timezoneProperty === void 0 ? void 0 : _timezoneProperty.name);
1306
- scale = (relatedPropertiesInfo === null || relatedPropertiesInfo === void 0 ? void 0 : (_relatedPropertiesInf3 = relatedPropertiesInfo.exportSettings) === null || _relatedPropertiesInf3 === void 0 ? void 0 : _relatedPropertiesInf3.scale) ?? scale;
1307
- const exportType = getExportDataType(dataType, isATimezone, !!currencyProperty, relatedPropertiesInfo === null || relatedPropertiesInfo === void 0 ? void 0 : relatedPropertiesInfo.exportSettings);
1376
+ unitProperty = relatedPropertiesInfo?.exportSettings?.unitProperty ?? unitProperty?.name ?? currencyProperty?.name;
1377
+ timezoneProperty = relatedPropertiesInfo?.exportSettings?.timezoneProperty ?? timezoneProperty?.name;
1378
+ scale = relatedPropertiesInfo?.exportSettings?.scale ?? scale;
1379
+ const exportType = getExportDataType(dataType, isATimezone, !!currencyProperty, relatedPropertiesInfo?.exportSettings);
1308
1380
  if (timezoneProperty || exportType === "DateTime" && !timezoneText) {
1309
1381
  utc = false;
1310
1382
  }
@@ -1314,12 +1386,12 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
1314
1386
  delimiter: getDelimiter(dataType),
1315
1387
  scale: scale,
1316
1388
  unitProperty: unitProperty,
1317
- unit: (relatedPropertiesInfo === null || relatedPropertiesInfo === void 0 ? void 0 : relatedPropertiesInfo.exportSettings.unit) ?? unitText,
1389
+ unit: relatedPropertiesInfo?.exportSettings.unit ?? unitText,
1318
1390
  timezoneProperty: timezoneProperty,
1319
- timezone: (relatedPropertiesInfo === null || relatedPropertiesInfo === void 0 ? void 0 : relatedPropertiesInfo.exportSettings.timezone) ?? ((_timezoneText = timezoneText) === null || _timezoneText === void 0 ? void 0 : _timezoneText.toString()),
1320
- template: relatedPropertiesInfo === null || relatedPropertiesInfo === void 0 ? void 0 : relatedPropertiesInfo.exportSettings.template,
1391
+ timezone: relatedPropertiesInfo?.exportSettings.timezone ?? timezoneText?.toString(),
1392
+ template: relatedPropertiesInfo?.exportSettings.template,
1321
1393
  //only in case of complex properties, wrap the cell content on the excel exported file
1322
- wrap: relatedPropertiesInfo === null || relatedPropertiesInfo === void 0 ? void 0 : relatedPropertiesInfo.exportSettings.wrap,
1394
+ wrap: relatedPropertiesInfo?.exportSettings.wrap,
1323
1395
  utc: utc
1324
1396
  };
1325
1397
  if (exportSettings.unitProperty || exportSettings.unit) {
@@ -1364,14 +1436,11 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
1364
1436
  * @param annotationColumns The array of columns created based on LineItem annotations.
1365
1437
  * @param columnsToBeCreated The columns to be created
1366
1438
  * @param columnInfo The column definition
1439
+ * @param columnName The name of the column
1367
1440
  */
1368
- function updatePropertyLabel(annotationColumns, columnsToBeCreated, columnInfo) {
1369
- var _linkedAnnotationColu;
1370
- const linkedAnnotationColumns = annotationColumns.filter(col => {
1371
- var _col$propertyInfos;
1372
- return (_col$propertyInfos = col.propertyInfos) === null || _col$propertyInfos === void 0 ? void 0 : _col$propertyInfos.includes(columnInfo.relativePath);
1373
- });
1374
- if ((linkedAnnotationColumns === null || linkedAnnotationColumns === void 0 ? void 0 : linkedAnnotationColumns.length) === 1 && columnsToBeCreated[columnInfo.relativePath] && ((_linkedAnnotationColu = linkedAnnotationColumns[0].propertyInfos) === null || _linkedAnnotationColu === void 0 ? void 0 : _linkedAnnotationColu.length) === 1) {
1441
+ function updatePropertyLabel(annotationColumns, columnsToBeCreated, columnInfo, columnName) {
1442
+ const linkedAnnotationColumns = annotationColumns.filter(col => col.propertyInfos?.includes(columnInfo.relativePath) || columnName && col.propertyInfos?.includes(columnName));
1443
+ if (linkedAnnotationColumns?.length === 1 && (columnsToBeCreated[columnInfo.relativePath] || columnName && columnsToBeCreated[columnName]) && linkedAnnotationColumns[0].propertyInfos?.length === 1) {
1375
1444
  columnInfo.label = linkedAnnotationColumns[0].label;
1376
1445
  columnInfo.tooltip = linkedAnnotationColumns[0].tooltip;
1377
1446
  }
@@ -1382,26 +1451,23 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
1382
1451
  * @returns True for exportable column, false for non exportable column
1383
1452
  */
1384
1453
  function _isExportableColumn(source) {
1385
- var _annotations$UI;
1386
1454
  let propertyType, property;
1387
- const dataFieldDefaultProperty = (_annotations$UI = source.annotations.UI) === null || _annotations$UI === void 0 ? void 0 : _annotations$UI.DataFieldDefault;
1455
+ const dataFieldDefaultProperty = source.annotations.UI?.DataFieldDefault;
1388
1456
  if (isProperty(source)) {
1389
1457
  if (isReferencePropertyStaticallyHidden(source)) {
1390
1458
  return false;
1391
1459
  }
1392
- propertyType = dataFieldDefaultProperty === null || dataFieldDefaultProperty === void 0 ? void 0 : dataFieldDefaultProperty.$Type;
1460
+ propertyType = dataFieldDefaultProperty?.$Type;
1393
1461
  } else if (isReferencePropertyStaticallyHidden(source)) {
1394
1462
  return false;
1395
1463
  } else {
1396
- var _Target, _Target$$target, _Value, _Value$$target, _Value$$target$annota, _Value$$target$annota2, _Value$$target$annota3, _Value2, _Value2$$target, _Value2$$target$annot, _Value2$$target$annot2;
1397
1464
  property = source;
1398
1465
  propertyType = property.$Type;
1399
- if (propertyType === "com.sap.vocabularies.UI.v1.DataFieldForAnnotation" && (_Target = property.Target) !== null && _Target !== void 0 && (_Target$$target = _Target.$target) !== null && _Target$$target !== void 0 && _Target$$target.$Type) {
1400
- var _Target2, _Target2$$target;
1466
+ if (propertyType === "com.sap.vocabularies.UI.v1.DataFieldForAnnotation" && property.Target?.$target?.$Type) {
1401
1467
  //For Chart
1402
- propertyType = (_Target2 = property.Target) === null || _Target2 === void 0 ? void 0 : (_Target2$$target = _Target2.$target) === null || _Target2$$target === void 0 ? void 0 : _Target2$$target.$Type;
1468
+ propertyType = property.Target?.$target?.$Type;
1403
1469
  return propertyType !== undefined && !"com.sap.vocabularies.UI.v1.ChartDefinitionType".includes(propertyType);
1404
- } else if (((_Value = property.Value) === null || _Value === void 0 ? void 0 : (_Value$$target = _Value.$target) === null || _Value$$target === void 0 ? void 0 : (_Value$$target$annota = _Value$$target.annotations) === null || _Value$$target$annota === void 0 ? void 0 : (_Value$$target$annota2 = _Value$$target$annota.Core) === null || _Value$$target$annota2 === void 0 ? void 0 : (_Value$$target$annota3 = _Value$$target$annota2.MediaType) === null || _Value$$target$annota3 === void 0 ? void 0 : _Value$$target$annota3.term) === "Org.OData.Core.V1.MediaType" && ((_Value2 = property.Value) === null || _Value2 === void 0 ? void 0 : (_Value2$$target = _Value2.$target) === null || _Value2$$target === void 0 ? void 0 : (_Value2$$target$annot = _Value2$$target.annotations) === null || _Value2$$target$annot === void 0 ? void 0 : (_Value2$$target$annot2 = _Value2$$target$annot.Core) === null || _Value2$$target$annot2 === void 0 ? void 0 : _Value2$$target$annot2.isURL) !== true) {
1470
+ } else if (property.Value?.$target?.annotations?.Core?.MediaType?.term === "Org.OData.Core.V1.MediaType" && property.Value?.$target?.annotations?.Core?.isURL !== true) {
1405
1471
  //For Stream
1406
1472
  return false;
1407
1473
  }
@@ -1439,7 +1505,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
1439
1505
  * @returns An expression that you can bind to the UI.
1440
1506
  */
1441
1507
  const _getVisibleExpression = function (dataFieldModelPath) {
1442
- var _targetObject$Target, _targetObject$Target$, _targetObject$annotat, _targetObject$annotat2, _propertyValue$annota, _propertyValue$annota2;
1443
1508
  const targetObject = dataFieldModelPath.targetObject;
1444
1509
  let propertyValue;
1445
1510
  if (targetObject) {
@@ -1454,9 +1519,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
1454
1519
  break;
1455
1520
  case "com.sap.vocabularies.UI.v1.DataFieldForAnnotation":
1456
1521
  // if it is a DataFieldForAnnotation pointing to a DataPoint we look at the dataPoint's value
1457
- if ((targetObject === null || targetObject === void 0 ? void 0 : (_targetObject$Target = targetObject.Target) === null || _targetObject$Target === void 0 ? void 0 : (_targetObject$Target$ = _targetObject$Target.$target) === null || _targetObject$Target$ === void 0 ? void 0 : _targetObject$Target$.$Type) === "com.sap.vocabularies.UI.v1.DataPointType") {
1458
- var _targetObject$Target$2;
1459
- propertyValue = (_targetObject$Target$2 = targetObject.Target.$target) === null || _targetObject$Target$2 === void 0 ? void 0 : _targetObject$Target$2.Value.$target;
1522
+ if (targetObject?.Target?.$target?.$Type === "com.sap.vocabularies.UI.v1.DataPointType") {
1523
+ propertyValue = targetObject.Target.$target?.Value.$target;
1460
1524
  }
1461
1525
  break;
1462
1526
  case "com.sap.vocabularies.UI.v1.DataFieldForIntentBasedNavigation":
@@ -1471,7 +1535,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
1471
1535
  // - the UI.Hidden expression in the original annotation does not evaluate to 'true'
1472
1536
  // - the UI.Hidden expression in the target property does not evaluate to 'true'
1473
1537
  // - in case of Analytics it's not visible for an expanded GroupHeader
1474
- return and(...[not(equal(getExpressionFromAnnotation(targetObject === null || targetObject === void 0 ? void 0 : (_targetObject$annotat = targetObject.annotations) === null || _targetObject$annotat === void 0 ? void 0 : (_targetObject$annotat2 = _targetObject$annotat.UI) === null || _targetObject$annotat2 === void 0 ? void 0 : _targetObject$annotat2.Hidden), true)), ifElse(!!propertyValue, propertyValue && not(equal(getExpressionFromAnnotation((_propertyValue$annota = propertyValue.annotations) === null || _propertyValue$annota === void 0 ? void 0 : (_propertyValue$annota2 = _propertyValue$annota.UI) === null || _propertyValue$annota2 === void 0 ? void 0 : _propertyValue$annota2.Hidden), true)), true), or(not(isAnalyticalGroupHeaderExpanded), isAnalyticalLeaf)]);
1538
+ return and(...[not(equal(getExpressionFromAnnotation(targetObject?.annotations?.UI?.Hidden), true)), ifElse(!!propertyValue, propertyValue && not(equal(getExpressionFromAnnotation(propertyValue.annotations?.UI?.Hidden), true)), true), or(not(isAnalyticalGroupHeaderExpanded), isAnalyticalLeaf)]);
1475
1539
  };
1476
1540
  /**
1477
1541
  * Returns hidden binding expressions for a field group.
@@ -1480,15 +1544,12 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
1480
1544
  */
1481
1545
  _exports._getVisibleExpression = _getVisibleExpression;
1482
1546
  const _getFieldGroupHiddenExpressions = function (dataFieldGroup) {
1483
- var _dataFieldGroup$Targe, _dataFieldGroup$Targe2;
1484
1547
  const fieldGroupHiddenExpressions = [];
1485
- if (dataFieldGroup.$Type === "com.sap.vocabularies.UI.v1.DataFieldForAnnotation" && ((_dataFieldGroup$Targe = dataFieldGroup.Target) === null || _dataFieldGroup$Targe === void 0 ? void 0 : (_dataFieldGroup$Targe2 = _dataFieldGroup$Targe.$target) === null || _dataFieldGroup$Targe2 === void 0 ? void 0 : _dataFieldGroup$Targe2.$Type) === "com.sap.vocabularies.UI.v1.FieldGroupType") {
1486
- var _dataFieldGroup$annot, _dataFieldGroup$annot2;
1487
- if (dataFieldGroup !== null && dataFieldGroup !== void 0 && (_dataFieldGroup$annot = dataFieldGroup.annotations) !== null && _dataFieldGroup$annot !== void 0 && (_dataFieldGroup$annot2 = _dataFieldGroup$annot.UI) !== null && _dataFieldGroup$annot2 !== void 0 && _dataFieldGroup$annot2.Hidden) {
1548
+ if (dataFieldGroup.$Type === "com.sap.vocabularies.UI.v1.DataFieldForAnnotation" && dataFieldGroup.Target?.$target?.$Type === "com.sap.vocabularies.UI.v1.FieldGroupType") {
1549
+ if (dataFieldGroup?.annotations?.UI?.Hidden) {
1488
1550
  return compileExpression(not(equal(getExpressionFromAnnotation(dataFieldGroup.annotations.UI.Hidden), true)));
1489
1551
  } else {
1490
- var _dataFieldGroup$Targe3;
1491
- (_dataFieldGroup$Targe3 = dataFieldGroup.Target.$target.Data) === null || _dataFieldGroup$Targe3 === void 0 ? void 0 : _dataFieldGroup$Targe3.forEach(innerDataField => {
1552
+ dataFieldGroup.Target.$target.Data?.forEach(innerDataField => {
1492
1553
  fieldGroupHiddenExpressions.push(_getVisibleExpression({
1493
1554
  targetObject: innerDataField
1494
1555
  }));
@@ -1511,43 +1572,33 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
1511
1572
  return undefined;
1512
1573
  }
1513
1574
  if (isProperty(property) || isNavigationProperty(property)) {
1514
- var _annotations, _annotations$UI2, _property$annotations14, _property$annotations15;
1515
- const dataFieldDefault = (_annotations = property.annotations) === null || _annotations === void 0 ? void 0 : (_annotations$UI2 = _annotations.UI) === null || _annotations$UI2 === void 0 ? void 0 : _annotations$UI2.DataFieldDefault;
1575
+ const dataFieldDefault = property.annotations?.UI?.DataFieldDefault;
1516
1576
  if (dataFieldDefault && !dataFieldDefault.qualifier && dataFieldDefault.Label) {
1517
- var _dataFieldDefault$Lab;
1518
- return (_dataFieldDefault$Lab = dataFieldDefault.Label) === null || _dataFieldDefault$Lab === void 0 ? void 0 : _dataFieldDefault$Lab.toString();
1577
+ return dataFieldDefault.Label?.toString();
1519
1578
  }
1520
- return ((_property$annotations14 = property.annotations.Common) === null || _property$annotations14 === void 0 ? void 0 : (_property$annotations15 = _property$annotations14.Label) === null || _property$annotations15 === void 0 ? void 0 : _property$annotations15.toString()) ?? property.name;
1579
+ return property.annotations.Common?.Label?.toString() ?? property.name;
1521
1580
  } else if (isDataFieldTypes(property)) {
1522
- var _property$Label2, _property$Value, _property$Value$$targ, _property$Value$$targ2, _property$Value$$targ3, _property$Value2, _property$Value2$$tar;
1523
1581
  if (!!isGroup && property.$Type === "com.sap.vocabularies.UI.v1.DataFieldWithIntentBasedNavigation") {
1524
- var _property$Label;
1525
- return property === null || property === void 0 ? void 0 : (_property$Label = property.Label) === null || _property$Label === void 0 ? void 0 : _property$Label.toString();
1582
+ return property?.Label?.toString();
1526
1583
  }
1527
- return (property === null || property === void 0 ? void 0 : (_property$Label2 = property.Label) === null || _property$Label2 === void 0 ? void 0 : _property$Label2.toString()) ?? compileExpression(getExpressionFromAnnotation((_property$Value = property.Value) === null || _property$Value === void 0 ? void 0 : (_property$Value$$targ = _property$Value.$target) === null || _property$Value$$targ === void 0 ? void 0 : (_property$Value$$targ2 = _property$Value$$targ.annotations) === null || _property$Value$$targ2 === void 0 ? void 0 : (_property$Value$$targ3 = _property$Value$$targ2.Common) === null || _property$Value$$targ3 === void 0 ? void 0 : _property$Value$$targ3.Label, [], (_property$Value2 = property.Value) === null || _property$Value2 === void 0 ? void 0 : (_property$Value2$$tar = _property$Value2.$target) === null || _property$Value2$$tar === void 0 ? void 0 : _property$Value2$$tar.name));
1584
+ return property?.Label?.toString() ?? compileExpression(getExpressionFromAnnotation(property.Value?.$target?.annotations?.Common?.Label, [], property.Value?.$target?.name));
1528
1585
  } else if (property.$Type === "com.sap.vocabularies.UI.v1.DataFieldForAnnotation") {
1529
- var _property$Label3, _property$Target, _property$Target$$tar, _property$Target$$tar2, _property$Target$$tar3, _property$Target$$tar4, _property$Target$$tar5, _property$Target$$tar6;
1530
- return ((_property$Label3 = property.Label) === null || _property$Label3 === void 0 ? void 0 : _property$Label3.toString()) ?? compileExpression(getExpressionFromAnnotation((_property$Target = property.Target) === null || _property$Target === void 0 ? void 0 : (_property$Target$$tar = _property$Target.$target) === null || _property$Target$$tar === void 0 ? void 0 : (_property$Target$$tar2 = _property$Target$$tar.Value) === null || _property$Target$$tar2 === void 0 ? void 0 : (_property$Target$$tar3 = _property$Target$$tar2.$target) === null || _property$Target$$tar3 === void 0 ? void 0 : (_property$Target$$tar4 = _property$Target$$tar3.annotations) === null || _property$Target$$tar4 === void 0 ? void 0 : (_property$Target$$tar5 = _property$Target$$tar4.Common) === null || _property$Target$$tar5 === void 0 ? void 0 : (_property$Target$$tar6 = _property$Target$$tar5.Label) === null || _property$Target$$tar6 === void 0 ? void 0 : _property$Target$$tar6.valueOf()));
1586
+ return property.Label?.toString() ?? compileExpression(getExpressionFromAnnotation(property.Target?.$target?.Value?.$target?.annotations?.Common?.Label?.valueOf()));
1531
1587
  } else {
1532
- var _property$Label4;
1533
- return (_property$Label4 = property.Label) === null || _property$Label4 === void 0 ? void 0 : _property$Label4.toString();
1588
+ return property.Label?.toString();
1534
1589
  }
1535
1590
  };
1536
1591
  const _getTooltip = function (source) {
1537
- var _source$annotations2, _source$annotations2$;
1538
1592
  if (!source) {
1539
1593
  return undefined;
1540
1594
  }
1541
- if (isProperty(source) || (_source$annotations2 = source.annotations) !== null && _source$annotations2 !== void 0 && (_source$annotations2$ = _source$annotations2.Common) !== null && _source$annotations2$ !== void 0 && _source$annotations2$.QuickInfo) {
1542
- var _source$annotations3, _source$annotations3$;
1543
- return (_source$annotations3 = source.annotations) !== null && _source$annotations3 !== void 0 && (_source$annotations3$ = _source$annotations3.Common) !== null && _source$annotations3$ !== void 0 && _source$annotations3$.QuickInfo ? compileExpression(getExpressionFromAnnotation(source.annotations.Common.QuickInfo)) : undefined;
1595
+ if (isProperty(source) || source.annotations?.Common?.QuickInfo) {
1596
+ return source.annotations?.Common?.QuickInfo ? compileExpression(getExpressionFromAnnotation(source.annotations.Common.QuickInfo)) : undefined;
1544
1597
  } else if (isDataFieldTypes(source)) {
1545
- var _source$Value, _source$Value$$target, _source$Value$$target2, _source$Value$$target3;
1546
- return (_source$Value = source.Value) !== null && _source$Value !== void 0 && (_source$Value$$target = _source$Value.$target) !== null && _source$Value$$target !== void 0 && (_source$Value$$target2 = _source$Value$$target.annotations) !== null && _source$Value$$target2 !== void 0 && (_source$Value$$target3 = _source$Value$$target2.Common) !== null && _source$Value$$target3 !== void 0 && _source$Value$$target3.QuickInfo ? compileExpression(getExpressionFromAnnotation(source.Value.$target.annotations.Common.QuickInfo)) : undefined;
1598
+ return source.Value?.$target?.annotations?.Common?.QuickInfo ? compileExpression(getExpressionFromAnnotation(source.Value.$target.annotations.Common.QuickInfo)) : undefined;
1547
1599
  } else if (source.$Type === "com.sap.vocabularies.UI.v1.DataFieldForAnnotation") {
1548
- var _source$Target, _datapointTarget$Valu, _datapointTarget$Valu2, _datapointTarget$Valu3, _datapointTarget$Valu4;
1549
- const datapointTarget = (_source$Target = source.Target) === null || _source$Target === void 0 ? void 0 : _source$Target.$target;
1550
- return datapointTarget !== null && datapointTarget !== void 0 && (_datapointTarget$Valu = datapointTarget.Value) !== null && _datapointTarget$Valu !== void 0 && (_datapointTarget$Valu2 = _datapointTarget$Valu.$target) !== null && _datapointTarget$Valu2 !== void 0 && (_datapointTarget$Valu3 = _datapointTarget$Valu2.annotations) !== null && _datapointTarget$Valu3 !== void 0 && (_datapointTarget$Valu4 = _datapointTarget$Valu3.Common) !== null && _datapointTarget$Valu4 !== void 0 && _datapointTarget$Valu4.QuickInfo ? compileExpression(getExpressionFromAnnotation(datapointTarget.Value.$target.annotations.Common.QuickInfo)) : undefined;
1600
+ const datapointTarget = source.Target?.$target;
1601
+ return datapointTarget?.Value?.$target?.annotations?.Common?.QuickInfo ? compileExpression(getExpressionFromAnnotation(datapointTarget.Value.$target.annotations.Common.QuickInfo)) : undefined;
1551
1602
  } else {
1552
1603
  return undefined;
1553
1604
  }
@@ -1576,7 +1627,16 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
1576
1627
  annotationPath = converterContext.getAbsoluteAnnotationPath(name),
1577
1628
  // Check whether the related column already exists.
1578
1629
  relatedColumn = existingColumns.find(column => column.name === name);
1579
- if (relatedColumn === undefined) {
1630
+ const dataModelObjectPath = converterContext.getConverterContextFor(converterContext.getContextPath()).getDataModelObjectPath();
1631
+ const propertyObjectPath = enhanceDataModelPath(dataModelObjectPath, name);
1632
+ if (isMultiValueField(propertyObjectPath)) {
1633
+ const newNameRelativeTargetPath = getContextRelativeTargetObjectPath(propertyObjectPath, false, true);
1634
+ const column = getColumnDefinitionFromProperty(property, annotationPath, name, true, false, aggregationHelper, converterContext, displayModeOfDescriptionPropertiesMap, restrictionsOnProperties, tableCreationMode, undefined, newNameRelativeTargetPath);
1635
+ computeHiddenOnRelatedColumns(existingColumns, name, column);
1636
+ updatePropertyLabel(existingColumns, columnsToBeCreated, column, name);
1637
+ relatedColumns.push(column);
1638
+ relatedPropertyNameMap[name] = newNameRelativeTargetPath ?? name;
1639
+ } else if (relatedColumn === undefined) {
1580
1640
  // Case 1: Key contains DataField prefix to ensure all property columns have the same key format.
1581
1641
  // New created property column is set to hidden.
1582
1642
  const column = getColumnDefinitionFromProperty(property, annotationPath, name, true, false, aggregationHelper, converterContext, displayModeOfDescriptionPropertiesMap, restrictionsOnProperties, tableCreationMode);
@@ -1596,16 +1656,13 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
1596
1656
  updatePropertyLabel(existingColumns, columnsToBeCreated, column);
1597
1657
  relatedColumns.push(column);
1598
1658
  relatedPropertyNameMap[name] = newName;
1599
- } else if (existingColumns.some(column => column.name === newName) && existingColumns.some(column => {
1600
- var _column$propertyInfos;
1601
- return (_column$propertyInfos = column.propertyInfos) === null || _column$propertyInfos === void 0 ? void 0 : _column$propertyInfos.includes(name);
1602
- })) {
1659
+ } else if (existingColumns.some(column => column.name === newName) && existingColumns.some(column => column.propertyInfos?.includes(name))) {
1603
1660
  relatedPropertyNameMap[name] = newName;
1604
1661
  }
1605
- } else if (displayModeOfDescriptionPropertiesMap[name] === "Description" && !relatedColumn.filterable && !(restrictionsOnProperties !== null && restrictionsOnProperties !== void 0 && restrictionsOnProperties.nonFilterableProperties.includes(name))) {
1662
+ } else if (displayModeOfDescriptionPropertiesMap[name] === "Description" && !relatedColumn.filterable && !restrictionsOnProperties?.nonFilterableProperties.includes(name)) {
1606
1663
  // Case 4: The column is a referenced text only property. Set it to hidden, non sortable nor groupable.
1607
1664
  // Case 5: The column isn't already available for filtering as it could be referenced on another column (e.g. text first).
1608
- restrictionsOnProperties === null || restrictionsOnProperties === void 0 ? void 0 : restrictionsOnProperties.nonSortableProperties.push(name);
1665
+ restrictionsOnProperties?.nonSortableProperties.push(name);
1609
1666
  const column = getColumnDefinitionFromProperty(property, annotationPath, name, false, false, aggregationHelper, converterContext, {}, restrictionsOnProperties, tableCreationMode);
1610
1667
  column.isGroupable = false;
1611
1668
  relatedColumns.push(column);
@@ -1614,9 +1671,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
1614
1671
  // The property 'name' has been prefixed with 'Property::' for uniqueness.
1615
1672
  // Update the same in other propertyInfos[] references which point to this property.
1616
1673
  existingColumns.forEach(column => {
1617
- var _column$propertyInfos2, _column$additionalPro;
1618
- column.propertyInfos = (_column$propertyInfos2 = column.propertyInfos) === null || _column$propertyInfos2 === void 0 ? void 0 : _column$propertyInfos2.map(propertyInfo => relatedPropertyNameMap[propertyInfo] ?? propertyInfo);
1619
- column.additionalPropertyInfos = (_column$additionalPro = column.additionalPropertyInfos) === null || _column$additionalPro === void 0 ? void 0 : _column$additionalPro.map(propertyInfo => relatedPropertyNameMap[propertyInfo] ?? propertyInfo);
1674
+ column.propertyInfos = column.propertyInfos?.map(propertyInfo => relatedPropertyNameMap[propertyInfo] ?? propertyInfo);
1675
+ column.additionalPropertyInfos = column.additionalPropertyInfos?.map(propertyInfo => relatedPropertyNameMap[propertyInfo] ?? propertyInfo);
1620
1676
  });
1621
1677
  return relatedColumns;
1622
1678
  };
@@ -1628,15 +1684,12 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
1628
1684
  * @returns The name of annotation columns
1629
1685
  */
1630
1686
  const _getAnnotationColumnName = function (dataField) {
1631
- var _dataField$Value, _dataField$Target, _dataField$Target$$ta, _dataField$Target$$ta2;
1632
1687
  // This is needed as we have flexibility changes already that we have to check against
1633
- if (isDataFieldTypes(dataField) && (_dataField$Value = dataField.Value) !== null && _dataField$Value !== void 0 && _dataField$Value.path) {
1634
- var _dataField$Value2;
1635
- return (_dataField$Value2 = dataField.Value) === null || _dataField$Value2 === void 0 ? void 0 : _dataField$Value2.path;
1636
- } else if (dataField.$Type === "com.sap.vocabularies.UI.v1.DataFieldForAnnotation" && (_dataField$Target = dataField.Target) !== null && _dataField$Target !== void 0 && (_dataField$Target$$ta = _dataField$Target.$target) !== null && _dataField$Target$$ta !== void 0 && (_dataField$Target$$ta2 = _dataField$Target$$ta.Value) !== null && _dataField$Target$$ta2 !== void 0 && _dataField$Target$$ta2.path) {
1637
- var _dataField$Target2, _dataField$Target2$$t;
1688
+ if (isDataFieldTypes(dataField) && dataField.Value?.path) {
1689
+ return dataField.Value?.path;
1690
+ } else if (dataField.$Type === "com.sap.vocabularies.UI.v1.DataFieldForAnnotation" && dataField.Target?.$target?.Value?.path) {
1638
1691
  // This is for removing duplicate properties. For example, 'Progress' Property is removed if it is already defined as a DataPoint
1639
- return (_dataField$Target2 = dataField.Target) === null || _dataField$Target2 === void 0 ? void 0 : (_dataField$Target2$$t = _dataField$Target2.$target) === null || _dataField$Target2$$t === void 0 ? void 0 : _dataField$Target2$$t.Value.path;
1692
+ return dataField.Target?.$target?.Value.path;
1640
1693
  } else {
1641
1694
  return KeyHelper.generateKeyFromDataField(dataField);
1642
1695
  }
@@ -1688,8 +1741,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
1688
1741
  * @returns `showDataFieldsLabel` value from the manifest
1689
1742
  */
1690
1743
  const _getShowDataFieldsLabel = function (fieldGroupName, visualizationPath, converterContext) {
1691
- var _converterContext$get21;
1692
- const columns = (_converterContext$get21 = converterContext.getManifestControlConfiguration(visualizationPath)) === null || _converterContext$get21 === void 0 ? void 0 : _converterContext$get21.columns;
1744
+ const columns = converterContext.getManifestControlConfiguration(visualizationPath)?.columns;
1693
1745
  const columnKeys = columns && Object.keys(columns);
1694
1746
  return columnKeys && !!columnKeys.find(function (key) {
1695
1747
  return key === fieldGroupName && columns[key].showDataFieldsLabel;
@@ -1701,7 +1753,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
1701
1753
  * @returns The relative path
1702
1754
  */
1703
1755
  const _getRelativePath = function (dataField) {
1704
- var _Value3, _dataField$Target3;
1705
1756
  let relativePath = "";
1706
1757
  switch (dataField.$Type) {
1707
1758
  case "com.sap.vocabularies.UI.v1.DataField":
@@ -1709,10 +1760,10 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
1709
1760
  case "com.sap.vocabularies.UI.v1.DataFieldWithUrl":
1710
1761
  case "com.sap.vocabularies.UI.v1.DataFieldWithIntentBasedNavigation":
1711
1762
  case "com.sap.vocabularies.UI.v1.DataFieldWithAction":
1712
- relativePath = dataField === null || dataField === void 0 ? void 0 : (_Value3 = dataField.Value) === null || _Value3 === void 0 ? void 0 : _Value3.path;
1763
+ relativePath = dataField?.Value?.path;
1713
1764
  break;
1714
1765
  case "com.sap.vocabularies.UI.v1.DataFieldForAnnotation":
1715
- relativePath = dataField === null || dataField === void 0 ? void 0 : (_dataField$Target3 = dataField.Target) === null || _dataField$Target3 === void 0 ? void 0 : _dataField$Target3.value;
1766
+ relativePath = dataField?.Target?.value;
1716
1767
  break;
1717
1768
  case "com.sap.vocabularies.UI.v1.DataFieldForAction":
1718
1769
  case "com.sap.vocabularies.UI.v1.DataFieldForIntentBasedNavigation":
@@ -1749,12 +1800,16 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
1749
1800
  * @param dataField The data field being processed
1750
1801
  * @param propertyPath The property path
1751
1802
  * @param nonSortableColumns Collection of non-sortable column names as per annotation
1803
+ * @param relatedPropertiesInfo The related properties linked to the column
1752
1804
  * @returns True if the column is sortable
1753
1805
  */
1754
- const _isColumnSortable = function (dataField, propertyPath, nonSortableColumns) {
1806
+ const _isColumnSortable = function (dataField, propertyPath, nonSortableColumns, relatedPropertiesInfo) {
1755
1807
  return !nonSortableColumns.includes(propertyPath) && (
1756
1808
  // Column is not marked as non-sortable via annotation
1757
- dataField.$Type === "com.sap.vocabularies.UI.v1.DataField" || dataField.$Type === "com.sap.vocabularies.UI.v1.DataFieldWithUrl" || dataField.$Type === "com.sap.vocabularies.UI.v1.DataFieldWithIntentBasedNavigation" || dataField.$Type === "com.sap.vocabularies.UI.v1.DataFieldWithAction");
1809
+ (dataField.$Type === "com.sap.vocabularies.UI.v1.DataField" || dataField.$Type === "com.sap.vocabularies.UI.v1.DataFieldForAnnotation") && Object.keys(relatedPropertiesInfo.properties).some(propName => {
1810
+ const isHidden = isReferencePropertyStaticallyHidden(relatedPropertiesInfo.properties[propName].annotationProperty);
1811
+ return !isHidden && !nonSortableColumns.includes(propName);
1812
+ }) || dataField.$Type === "com.sap.vocabularies.UI.v1.DataFieldWithUrl" || dataField.$Type === "com.sap.vocabularies.UI.v1.DataFieldWithIntentBasedNavigation" || dataField.$Type === "com.sap.vocabularies.UI.v1.DataFieldWithAction");
1758
1813
  };
1759
1814
  /**
1760
1815
  * Returns whether filtering on the table is case sensitive.
@@ -1769,8 +1824,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
1769
1824
  function _getFilterFunctions(ConverterContext) {
1770
1825
  const entitySet = ConverterContext.getEntitySet();
1771
1826
  if (TypeGuards.isEntitySet(entitySet)) {
1772
- var _entitySet$annotation3, _ConverterContext$get;
1773
- return ((_entitySet$annotation3 = entitySet.annotations.Capabilities) === null || _entitySet$annotation3 === void 0 ? void 0 : _entitySet$annotation3.FilterFunctions) ?? ((_ConverterContext$get = ConverterContext.getEntityContainer().annotations.Capabilities) === null || _ConverterContext$get === void 0 ? void 0 : _ConverterContext$get.FilterFunctions);
1827
+ return entitySet.annotations.Capabilities?.FilterFunctions ?? ConverterContext.getEntityContainer().annotations.Capabilities?.FilterFunctions;
1774
1828
  }
1775
1829
  return undefined;
1776
1830
  }
@@ -1823,16 +1877,14 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
1823
1877
  * @returns An object containing a flag true if a property is found and a propertyPath.
1824
1878
  */
1825
1879
  function _findSemanticKeyValuesInFieldGroup(dataFieldGroup, semanticKeyValues) {
1826
- var _dataFieldGroup$Targe4, _dataFieldGroup$Targe5;
1827
1880
  // this info is used in FieldHelper#isDraftIndicatorVisibleInFieldGroup to show a draft indicator at the end of a field group
1828
1881
  const aProperties = [];
1829
1882
  let _propertiesFound = {
1830
1883
  semanticKeyHasPropertyInFieldGroup: false,
1831
1884
  fieldGroupPropertyPath: undefined
1832
1885
  };
1833
- if (dataFieldGroup && dataFieldGroup.$Type === "com.sap.vocabularies.UI.v1.DataFieldForAnnotation" && ((_dataFieldGroup$Targe4 = dataFieldGroup.Target) === null || _dataFieldGroup$Targe4 === void 0 ? void 0 : (_dataFieldGroup$Targe5 = _dataFieldGroup$Targe4.$target) === null || _dataFieldGroup$Targe5 === void 0 ? void 0 : _dataFieldGroup$Targe5.$Type) === "com.sap.vocabularies.UI.v1.FieldGroupType") {
1834
- var _dataFieldGroup$Targe6;
1835
- (_dataFieldGroup$Targe6 = dataFieldGroup.Target.$target.Data) === null || _dataFieldGroup$Targe6 === void 0 ? void 0 : _dataFieldGroup$Targe6.forEach(innerDataField => {
1886
+ if (dataFieldGroup && dataFieldGroup.$Type === "com.sap.vocabularies.UI.v1.DataFieldForAnnotation" && dataFieldGroup.Target?.$target?.$Type === "com.sap.vocabularies.UI.v1.FieldGroupType") {
1887
+ dataFieldGroup.Target.$target.Data?.forEach(innerDataField => {
1836
1888
  if ((innerDataField.$Type === "com.sap.vocabularies.UI.v1.DataField" || innerDataField.$Type === "com.sap.vocabularies.UI.v1.DataFieldWithUrl") && innerDataField.Value) {
1837
1889
  aProperties.push(innerDataField.Value.path);
1838
1890
  }
@@ -1874,8 +1926,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
1874
1926
  return {};
1875
1927
  }
1876
1928
  function _getImpNumber(dataField) {
1877
- var _dataField$annotation12, _dataField$annotation13;
1878
- const importance = dataField === null || dataField === void 0 ? void 0 : (_dataField$annotation12 = dataField.annotations) === null || _dataField$annotation12 === void 0 ? void 0 : (_dataField$annotation13 = _dataField$annotation12.UI) === null || _dataField$annotation13 === void 0 ? void 0 : _dataField$annotation13.Importance;
1929
+ const importance = dataField?.annotations?.UI?.Importance;
1879
1930
  if (importance && importance.includes("UI.ImportanceType/High")) {
1880
1931
  return 3;
1881
1932
  }
@@ -1888,8 +1939,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
1888
1939
  return 0;
1889
1940
  }
1890
1941
  function _getDataFieldImportance(dataField) {
1891
- var _dataField$annotation14, _dataField$annotation15;
1892
- const importance = dataField === null || dataField === void 0 ? void 0 : (_dataField$annotation14 = dataField.annotations) === null || _dataField$annotation14 === void 0 ? void 0 : (_dataField$annotation15 = _dataField$annotation14.UI) === null || _dataField$annotation15 === void 0 ? void 0 : _dataField$annotation15.Importance;
1942
+ const importance = dataField?.annotations?.UI?.Importance;
1893
1943
  return importance ? importance.split("/")[1] : Importance.None;
1894
1944
  }
1895
1945
  /**
@@ -1899,9 +1949,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
1899
1949
  */
1900
1950
 
1901
1951
  function _setExportSettingsForDataPoint(property, column) {
1902
- var _column$exportSetting;
1903
1952
  const targetValuefromDP = getTargetValueOnDataPoint(property);
1904
- if (isDataPointFromDataFieldDefault(property) && typeof targetValuefromDP === "string" && column.exportSettings && ((_column$exportSetting = column.exportSettings) === null || _column$exportSetting === void 0 ? void 0 : _column$exportSetting.unit) !== "%") {
1953
+ if (isDataPointFromDataFieldDefault(property) && typeof targetValuefromDP === "string" && column.exportSettings && column.exportSettings?.unit !== "%") {
1905
1954
  column.exportDataPointTargetValue = targetValuefromDP;
1906
1955
  column.exportSettings.template = "{0}/" + targetValuefromDP;
1907
1956
  }
@@ -1929,16 +1978,12 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
1929
1978
  * @returns The importance value
1930
1979
  */
1931
1980
  function getImportance(converterContext, dataField) {
1932
- var _converterContext$get22, _Value4, _Value4$$target;
1933
1981
  if (!dataField) {
1934
1982
  return undefined;
1935
1983
  }
1936
- const semanticKeys = ((_converterContext$get22 = converterContext.getDataModelObjectPath().targetEntityType.annotations.Common) === null || _converterContext$get22 === void 0 ? void 0 : _converterContext$get22.SemanticKey) ?? [];
1984
+ const semanticKeys = converterContext.getDataModelObjectPath().targetEntityType.annotations.Common?.SemanticKey ?? [];
1937
1985
  const requiredProperties = getRequiredProperties(converterContext);
1938
- const highKeys = [...semanticKeys, ...requiredProperties].map(propertyPath => {
1939
- var _propertyPath$$target;
1940
- return (_propertyPath$$target = propertyPath.$target) === null || _propertyPath$$target === void 0 ? void 0 : _propertyPath$$target.fullyQualifiedName;
1941
- });
1986
+ const highKeys = [...semanticKeys, ...requiredProperties].map(propertyPath => propertyPath.$target?.fullyQualifiedName);
1942
1987
  //Evaluate default Importance is not set explicitly
1943
1988
  let fieldsWithImportance;
1944
1989
  if (isAnnotationOfType(dataField, "com.sap.vocabularies.UI.v1.DataFieldForAnnotation")) {
@@ -1947,26 +1992,23 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
1947
1992
  const fieldGroupData = dataFieldTarget.Data;
1948
1993
  //If a FieldGroup contains a semanticKey or required property, importance set to High
1949
1994
  if (fieldGroupData.some(function (fieldGroupDataField) {
1950
- var _fieldGroupDataField$, _fieldGroupDataField$2;
1951
- return isDataFieldTypes(fieldGroupDataField) && highKeys.includes((_fieldGroupDataField$ = fieldGroupDataField.Value) === null || _fieldGroupDataField$ === void 0 ? void 0 : (_fieldGroupDataField$2 = _fieldGroupDataField$.$target) === null || _fieldGroupDataField$2 === void 0 ? void 0 : _fieldGroupDataField$2.fullyQualifiedName);
1995
+ return isDataFieldTypes(fieldGroupDataField) && highKeys.includes(fieldGroupDataField.Value?.$target?.fullyQualifiedName);
1952
1996
  })) {
1953
1997
  return Importance.High;
1954
1998
  } else {
1955
- var _dataField$annotation16, _dataField$annotation17;
1956
1999
  //If the DataFieldForAnnotation has an Importance we take it
1957
- if (dataField !== null && dataField !== void 0 && (_dataField$annotation16 = dataField.annotations) !== null && _dataField$annotation16 !== void 0 && (_dataField$annotation17 = _dataField$annotation16.UI) !== null && _dataField$annotation17 !== void 0 && _dataField$annotation17.Importance) {
2000
+ if (dataField?.annotations?.UI?.Importance) {
1958
2001
  return _getDataFieldImportance(dataField);
1959
2002
  }
1960
2003
  // else the highest importance (if any) is returned
1961
2004
  fieldsWithImportance = fieldGroupData.filter(function (item) {
1962
- var _item$annotations, _item$annotations$UI;
1963
- return item === null || item === void 0 ? void 0 : (_item$annotations = item.annotations) === null || _item$annotations === void 0 ? void 0 : (_item$annotations$UI = _item$annotations.UI) === null || _item$annotations$UI === void 0 ? void 0 : _item$annotations$UI.Importance;
2005
+ return item?.annotations?.UI?.Importance;
1964
2006
  });
1965
2007
  return _getMaxImportance(fieldsWithImportance);
1966
2008
  }
1967
2009
  }
1968
2010
  }
1969
- return highKeys.includes((_Value4 = dataField.Value) === null || _Value4 === void 0 ? void 0 : (_Value4$$target = _Value4.$target) === null || _Value4$$target === void 0 ? void 0 : _Value4$$target.fullyQualifiedName) ? Importance.High : _getDataFieldImportance(dataField);
2011
+ return highKeys.includes(dataField.Value?.$target?.fullyQualifiedName) ? Importance.High : _getDataFieldImportance(dataField);
1970
2012
  }
1971
2013
  /**
1972
2014
  * Returns line items from metadata annotations.
@@ -1977,7 +2019,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
1977
2019
  */
1978
2020
  _exports.getImportance = getImportance;
1979
2021
  const getColumnsFromAnnotations = function (lineItemAnnotation, visualizationPath, converterContext) {
1980
- var _converterContext$get23, _converterContext$get24, _converterContext$get25, _tableManifestSetting2, _tableManifestSetting3;
1981
2022
  const entityType = converterContext.getAnnotationEntityType(lineItemAnnotation),
1982
2023
  annotationColumns = [],
1983
2024
  columnsToBeCreated = {},
@@ -1985,19 +2026,18 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
1985
2026
  restrictionsOnProperties = getRestrictionsOnProperties(converterContext.getEntitySet()),
1986
2027
  tableManifestSettings = converterContext.getManifestControlConfiguration(visualizationPath),
1987
2028
  tableType = getTableType(converterContext, tableManifestSettings),
1988
- defaultCreationMode = ((_converterContext$get23 = converterContext.getManifestWrapper().getSapFeManifestConfiguration()) === null || _converterContext$get23 === void 0 ? void 0 : (_converterContext$get24 = _converterContext$get23.macros) === null || _converterContext$get24 === void 0 ? void 0 : (_converterContext$get25 = _converterContext$get24.table) === null || _converterContext$get25 === void 0 ? void 0 : _converterContext$get25.defaultCreationMode) === "InlineCreationRows" ? CreationMode.InlineCreationRows : undefined,
1989
- tableCreationMode = (tableManifestSettings === null || tableManifestSettings === void 0 ? void 0 : (_tableManifestSetting2 = tableManifestSettings.tableSettings) === null || _tableManifestSetting2 === void 0 ? void 0 : (_tableManifestSetting3 = _tableManifestSetting2.creationMode) === null || _tableManifestSetting3 === void 0 ? void 0 : _tableManifestSetting3.name) ?? defaultCreationMode ?? CreationMode.Inline;
2029
+ defaultCreationMode = converterContext.getManifestWrapper().getSapFeManifestConfiguration()?.macros?.table?.defaultCreationMode === "InlineCreationRows" ? CreationMode.InlineCreationRows : undefined,
2030
+ tableCreationMode = tableManifestSettings?.tableSettings?.creationMode?.name ?? defaultCreationMode ?? CreationMode.Inline;
1990
2031
  const semanticKeys = converterContext.getAnnotationsByTerm("Common", "com.sap.vocabularies.Common.v1.SemanticKey", [converterContext.getEntityType()])[0];
1991
2032
  if (lineItemAnnotation) {
1992
2033
  const tableConverterContext = converterContext.getConverterContextFor(getTargetObjectPath(converterContext.getDataModelObjectPath()));
1993
2034
  lineItemAnnotation.forEach(dataField => {
1994
- var _dataField$Value3, _dataField$Value3$$ta, _dataField$Target4, _dataField$Target4$$t, _propertyTypeConfig, _propertyTypeConfig2, _dataField$annotation18, _dataField$annotation19, _dataField$annotation20, _dataField$annotation21, _exportSettings;
1995
2035
  // TODO: variable name should be datafield and not lineItem
1996
2036
  if (!_isValidColumn(dataField)) {
1997
2037
  return;
1998
2038
  }
1999
2039
  let exportSettings = null;
2000
- const semanticObjectAnnotationPath = isDataFieldTypes(dataField) && (_dataField$Value3 = dataField.Value) !== null && _dataField$Value3 !== void 0 && (_dataField$Value3$$ta = _dataField$Value3.$target) !== null && _dataField$Value3$$ta !== void 0 && _dataField$Value3$$ta.fullyQualifiedName ? getSemanticObjectPath(converterContext, dataField) : undefined;
2040
+ const semanticObjectAnnotationPath = isDataFieldTypes(dataField) && dataField.Value?.$target?.fullyQualifiedName ? getSemanticObjectPath(converterContext, dataField) : undefined;
2001
2041
  const relativePath = _getRelativePath(dataField);
2002
2042
  // Determine properties which are consumed by this LineItem.
2003
2043
  const relatedPropertiesInfo = collectRelatedPropertiesRecursively(dataField, converterContext, tableType);
@@ -2014,16 +2054,13 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
2014
2054
  const propertyDataModelObjectPath = enhanceDataModelPath(converterContext.getDataModelObjectPath(), relativePath);
2015
2055
  // Determine if we need a situations indicator
2016
2056
  const navigationProperties = propertyDataModelObjectPath.targetEntityType.navigationProperties;
2017
- const situationsNavProps = navigationProperties.filter(navigationProperty => {
2018
- var _navigationProperty$t, _navigationProperty$t2;
2019
- return !navigationProperty.isCollection && ((_navigationProperty$t = navigationProperty.targetType.annotations.Common) === null || _navigationProperty$t === void 0 ? void 0 : (_navigationProperty$t2 = _navigationProperty$t.SAPObjectNodeType) === null || _navigationProperty$t2 === void 0 ? void 0 : _navigationProperty$t2.Name) === "BusinessSituation";
2020
- });
2057
+ const situationsNavProps = navigationProperties.filter(navigationProperty => !navigationProperty.isCollection && navigationProperty.targetType.annotations.Common?.SAPObjectNodeType?.Name === "BusinessSituation");
2021
2058
  const situationsNavProp = situationsNavProps.length >= 1 ? situationsNavProps[0] : undefined;
2022
2059
  if (situationsNavProp && formatOptions) {
2023
2060
  formatOptions.hasSituationsIndicator = true;
2024
2061
  }
2025
2062
  let fieldGroupHiddenExpressions;
2026
- if (dataField.$Type === "com.sap.vocabularies.UI.v1.DataFieldForAnnotation" && ((_dataField$Target4 = dataField.Target) === null || _dataField$Target4 === void 0 ? void 0 : (_dataField$Target4$$t = _dataField$Target4.$target) === null || _dataField$Target4$$t === void 0 ? void 0 : _dataField$Target4$$t.$Type) === "com.sap.vocabularies.UI.v1.FieldGroupType") {
2063
+ if (dataField.$Type === "com.sap.vocabularies.UI.v1.DataFieldForAnnotation" && dataField.Target?.$target?.$Type === "com.sap.vocabularies.UI.v1.FieldGroupType") {
2027
2064
  fieldGroupHiddenExpressions = _getFieldGroupHiddenExpressions(dataField);
2028
2065
  }
2029
2066
  const isMultiValue = _isColumnMultiValued(dataField, tableConverterContext);
@@ -2039,10 +2076,10 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
2039
2076
  className: dataType,
2040
2077
  formatOptions: {
2041
2078
  ...formatOptions,
2042
- ...((_propertyTypeConfig = propertyTypeConfig) === null || _propertyTypeConfig === void 0 ? void 0 : _propertyTypeConfig.formatOptions)
2079
+ ...propertyTypeConfig?.formatOptions
2043
2080
  },
2044
2081
  constraints: {
2045
- ...((_propertyTypeConfig2 = propertyTypeConfig) === null || _propertyTypeConfig2 === void 0 ? void 0 : _propertyTypeConfig2.constraints)
2082
+ ...propertyTypeConfig?.constraints
2046
2083
  }
2047
2084
  };
2048
2085
  const visualSettings = {};
@@ -2050,7 +2087,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
2050
2087
  // for charts
2051
2088
  visualSettings.widthCalculation = null;
2052
2089
  }
2053
- const sortable = !isMultiValue && _isColumnSortable(dataField, relativePath, restrictionsOnProperties.nonSortableProperties);
2090
+ const sortable = !isMultiValue && _isColumnSortable(dataField, relativePath, restrictionsOnProperties.nonSortableProperties, relatedPropertiesInfo);
2054
2091
  const availability = isReferencePropertyStaticallyHidden(dataField) ? "Hidden" : "Default";
2055
2092
  const column = {
2056
2093
  key: KeyHelper.generateKeyFromDataField(dataField),
@@ -2070,14 +2107,14 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
2070
2107
  propertyInfos: relatedPropertyNames.length ? relatedPropertyNames : undefined,
2071
2108
  additionalPropertyInfos: additionalPropertyNames.length > 0 ? additionalPropertyNames : undefined,
2072
2109
  exportSettings: exportSettings,
2073
- width: ((_dataField$annotation18 = dataField.annotations) === null || _dataField$annotation18 === void 0 ? void 0 : (_dataField$annotation19 = _dataField$annotation18.HTML5) === null || _dataField$annotation19 === void 0 ? void 0 : (_dataField$annotation20 = _dataField$annotation19.CssDefaults) === null || _dataField$annotation20 === void 0 ? void 0 : (_dataField$annotation21 = _dataField$annotation20.width) === null || _dataField$annotation21 === void 0 ? void 0 : _dataField$annotation21.valueOf()) || undefined,
2110
+ width: dataField.annotations?.HTML5?.CssDefaults?.width?.valueOf() || undefined,
2074
2111
  importance: getImportance(converterContext, dataField),
2075
2112
  isNavigable: true,
2076
2113
  formatOptions: formatOptions,
2077
2114
  caseSensitive: isFilteringCaseSensitive(converterContext),
2078
2115
  typeConfig: typeConfig,
2079
2116
  visualSettings: visualSettings,
2080
- timezoneText: (_exportSettings = exportSettings) === null || _exportSettings === void 0 ? void 0 : _exportSettings.timezone,
2117
+ timezoneText: exportSettings?.timezone,
2081
2118
  isPartOfLineItem: true,
2082
2119
  isMultiValue
2083
2120
  };
@@ -2153,9 +2190,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
2153
2190
  const isRequiredFieldGroup = function (converterContext, fieldGroup, tableCreationMode) {
2154
2191
  const fieldGroupData = fieldGroup.Data;
2155
2192
  return fieldGroupData.some(function (item) {
2156
- var _item$Value;
2157
2193
  // we exclude boolean type, the end-user may want to keep the underlying check box empty on purpose
2158
- if (isDataField(item) && (item === null || item === void 0 ? void 0 : (_item$Value = item.Value) === null || _item$Value === void 0 ? void 0 : _item$Value.$target.type) !== "Edm.Boolean") {
2194
+ if (isDataField(item) && item?.Value?.$target.type !== "Edm.Boolean") {
2159
2195
  return isStaticallyMandatory(item) || tableCreationMode === CreationMode.InlineCreationRows && isAnnotatedRequiredProperty(item.Value.$target.fullyQualifiedName, converterContext);
2160
2196
  }
2161
2197
  });
@@ -2226,7 +2262,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
2226
2262
  * @returns The binding expression for the 'required' property of the table column.
2227
2263
  */
2228
2264
  const isRequiredColumn = function (converterContext, target, tableCreationMode) {
2229
- var _target$Value, _target$Value$$target;
2230
2265
  const creationMode = tableCreationMode || CreationMode.Inline;
2231
2266
  if (converterContext.getTemplateType() === TemplateType.ListReport || converterContext.getTemplateType() === TemplateType.AnalyticalListPage) {
2232
2267
  return undefined;
@@ -2239,13 +2274,13 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
2239
2274
  return isRequiredDataFieldForAnnotation(converterContext, target, creationMode) ? compileExpression(UI.IsEditable) : undefined;
2240
2275
  }
2241
2276
  //If the underlying property is a boolean, the end-user may want to keep the check box empty on purpose
2242
- if (isDataField(target) && ((_target$Value = target.Value) === null || _target$Value === void 0 ? void 0 : (_target$Value$$target = _target$Value.$target) === null || _target$Value$$target === void 0 ? void 0 : _target$Value$$target.type) !== "Edm.Boolean") {
2277
+ if (isDataField(target) && target.Value?.$target?.type !== "Edm.Boolean") {
2243
2278
  return isStaticallyMandatory(target) || creationMode === CreationMode.InlineCreationRows && isAnnotatedRequiredProperty(target.Value.$target.fullyQualifiedName, converterContext) ? compileExpression(UI.IsEditable) : undefined;
2244
2279
  }
2245
2280
  return undefined;
2246
2281
  };
2247
2282
  const _appendCustomTemplate = function (properties, exportProperties) {
2248
- if (exportProperties !== null && exportProperties !== void 0 && exportProperties.length) {
2283
+ if (exportProperties?.length) {
2249
2284
  properties = exportProperties;
2250
2285
  }
2251
2286
  if (properties) {
@@ -2264,12 +2299,11 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
2264
2299
  * @param annotationColumns
2265
2300
  * @param converterContext
2266
2301
  * @param entityType
2267
- * @param navigationSettings
2268
2302
  * @returns The columns from the manifest
2269
2303
  */
2270
- const getColumnsFromManifest = function (columns, annotationColumns, converterContext, entityType, navigationSettings) {
2304
+ const getColumnsFromManifest = function (columns, annotationColumns, converterContext, entityType) {
2271
2305
  const internalColumns = {};
2272
- function isAnnotationColumn(column, key) {
2306
+ function isColumnOverride(column, key) {
2273
2307
  return annotationColumns.some(annotationColumn => annotationColumn.key === key);
2274
2308
  }
2275
2309
  function isSlotColumn(manifestColumn) {
@@ -2286,12 +2320,12 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
2286
2320
  prop.sortable = !restrictionsOnProperties.nonSortableProperties.includes(property.replace("Property::", ""));
2287
2321
  prop.isGroupable = prop.sortable;
2288
2322
  prop.filterable = !restrictionsOnProperties.nonFilterableProperties.includes(property.replace("Property::", ""));
2323
+ prop.isPartOfCustomColumn = true;
2289
2324
  }
2290
2325
  });
2291
2326
  });
2292
2327
  }
2293
2328
  for (const key in columns) {
2294
- var _manifestColumn$posit;
2295
2329
  const manifestColumn = columns[key];
2296
2330
  KeyHelper.validateKey(key);
2297
2331
  // BaseTableColumn
@@ -2300,35 +2334,35 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
2300
2334
  widthIncludingColumnHeader: manifestColumn.widthIncludingColumnHeader,
2301
2335
  width: manifestColumn.width || undefined,
2302
2336
  position: {
2303
- anchor: (_manifestColumn$posit = manifestColumn.position) === null || _manifestColumn$posit === void 0 ? void 0 : _manifestColumn$posit.anchor,
2337
+ anchor: manifestColumn.position?.anchor,
2304
2338
  placement: manifestColumn.position === undefined ? Placement.After : manifestColumn.position.placement
2305
2339
  },
2306
2340
  caseSensitive: isFilteringCaseSensitive(converterContext)
2307
2341
  };
2308
- if (isAnnotationColumn(manifestColumn, key)) {
2342
+ if (isColumnOverride(manifestColumn, key)) {
2309
2343
  const propertiesToOverwriteAnnotationColumn = {
2310
2344
  ...baseTableColumn,
2311
- importance: manifestColumn === null || manifestColumn === void 0 ? void 0 : manifestColumn.importance,
2312
- horizontalAlign: manifestColumn === null || manifestColumn === void 0 ? void 0 : manifestColumn.horizontalAlign,
2313
- availability: manifestColumn === null || manifestColumn === void 0 ? void 0 : manifestColumn.availability,
2345
+ importance: manifestColumn?.importance,
2346
+ horizontalAlign: manifestColumn?.horizontalAlign,
2347
+ availability: manifestColumn?.availability,
2314
2348
  type: ColumnType.Annotation,
2315
- isNavigable: isAnnotationColumn(manifestColumn, key) ? undefined : isActionNavigable(manifestColumn, navigationSettings, true),
2349
+ isNavigable: undefined,
2316
2350
  settings: manifestColumn.settings,
2317
2351
  formatOptions: _getDefaultFormatOptionsForTable(manifestColumn.formatOptions),
2318
- exportSettings: getCustomExportSettings(manifestColumn === null || manifestColumn === void 0 ? void 0 : manifestColumn.exportSettings, annotationColumns, converterContext, entityType, undefined, key)
2352
+ exportSettings: getCustomExportSettings(manifestColumn?.exportSettings, annotationColumns, converterContext, entityType, undefined, key)
2319
2353
  };
2320
2354
  internalColumns[key] = propertiesToOverwriteAnnotationColumn;
2321
2355
  } else {
2322
2356
  const propertyInfos = _getPropertyNames(manifestColumn.properties, annotationColumns, converterContext, entityType);
2323
2357
  const tooltipText = converterContext.fetchTextFromMetaModel(manifestColumn.tooltip),
2324
2358
  headerText = converterContext.fetchTextFromMetaModel(manifestColumn.header);
2325
- const customColumnExportSettings = propertyInfos ? getCustomExportSettings(manifestColumn === null || manifestColumn === void 0 ? void 0 : manifestColumn.exportSettings, annotationColumns, converterContext, entityType, propertyInfos) : null;
2359
+ const customColumnExportSettings = propertyInfos ? getCustomExportSettings(manifestColumn?.exportSettings, annotationColumns, converterContext, entityType, propertyInfos) : null;
2326
2360
  const baseManifestColumn = {
2327
2361
  ...baseTableColumn,
2328
2362
  header: headerText,
2329
- importance: (manifestColumn === null || manifestColumn === void 0 ? void 0 : manifestColumn.importance) || Importance.None,
2330
- horizontalAlign: (manifestColumn === null || manifestColumn === void 0 ? void 0 : manifestColumn.horizontalAlign) || HorizontalAlign.Begin,
2331
- availability: (manifestColumn === null || manifestColumn === void 0 ? void 0 : manifestColumn.availability) || "Default",
2363
+ importance: manifestColumn?.importance || Importance.None,
2364
+ horizontalAlign: manifestColumn?.horizontalAlign || HorizontalAlign.Begin,
2365
+ availability: manifestColumn?.availability || "Default",
2332
2366
  template: manifestColumn.template,
2333
2367
  propertyInfos: propertyInfos,
2334
2368
  exportSettings: customColumnExportSettings,
@@ -2364,56 +2398,14 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
2364
2398
  };
2365
2399
  internalColumns[key] = customTableColumn;
2366
2400
  } else {
2367
- var _IssueCategoryType$An;
2368
2401
  const message = `The annotation column '${key}' referenced in the manifest is not found`;
2369
- converterContext.getDiagnostics().addIssue(IssueCategory.Manifest, IssueSeverity.Low, message, IssueCategoryType, IssueCategoryType === null || IssueCategoryType === void 0 ? void 0 : (_IssueCategoryType$An = IssueCategoryType.AnnotationColumns) === null || _IssueCategoryType$An === void 0 ? void 0 : _IssueCategoryType$An.InvalidKey);
2402
+ converterContext.getDiagnostics().addIssue(IssueCategory.Manifest, IssueSeverity.Low, message, IssueCategoryType, IssueCategoryType?.AnnotationColumns?.InvalidKey);
2370
2403
  }
2371
2404
  }
2372
2405
  }
2373
2406
  return internalColumns;
2374
2407
  };
2375
2408
 
2376
- /**
2377
- * Adds references to columns that are needed to display the draft indicator column properly.
2378
- * @param draftIndicatorColumn
2379
- * @param tableColumns
2380
- * @param converterContext
2381
- */
2382
- function addReferencesForDraftIndicatorColumn(draftIndicatorColumn, tableColumns, converterContext) {
2383
- function createRelatedColumn(propertyPath) {
2384
- const key = "Property_Technical::" + propertyPath.replace(/\//g, ":");
2385
- const newColumn = {
2386
- key,
2387
- name: key,
2388
- annotationPath: converterContext.getAbsoluteAnnotationPath(propertyPath),
2389
- relativePath: propertyPath,
2390
- isGroupable: false,
2391
- sortable: false,
2392
- availability: "Hidden",
2393
- caseSensitive: false,
2394
- type: ColumnType.Annotation,
2395
- extension: {
2396
- technicallyAggregatable: false,
2397
- technicallyGroupable: true
2398
- }
2399
- };
2400
- tableColumns.push(newColumn);
2401
- draftIndicatorColumn.propertyInfos.push(key);
2402
- }
2403
- draftIndicatorColumn.propertyInfos = [];
2404
- createRelatedColumn("HasDraftEntity");
2405
- createRelatedColumn("DraftAdministrativeData/InProcessByUser");
2406
- createRelatedColumn("DraftAdministrativeData/LastChangedByUser");
2407
- createRelatedColumn("DraftAdministrativeData/LastChangeDateTime");
2408
- const draftAdminDataProperties = enhanceDataModelPath(converterContext.getDataModelObjectPath(), "DraftAdministrativeData").targetEntityType.entityProperties;
2409
- if (draftAdminDataProperties.find(prop => prop.name === "InProcessByUserDescription")) {
2410
- createRelatedColumn("DraftAdministrativeData/InProcessByUserDescription");
2411
- }
2412
- if (draftAdminDataProperties.find(prop => prop.name === "LastChangedByUserDescription")) {
2413
- createRelatedColumn("DraftAdministrativeData/LastChangedByUserDescription");
2414
- }
2415
- }
2416
-
2417
2409
  /**
2418
2410
  * Adds computed columns such as the draft status and situations status.
2419
2411
  * @param tableColumns The table columns collected so far
@@ -2432,11 +2424,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
2432
2424
  // In case a grid table or tree table is used, we display the situations indicator in a separate column
2433
2425
  // so we have to disable it here to ensure, that the field building block
2434
2426
  // does not render it into the ID column
2435
- const columnWithSituationsIndicator = tableColumns.find(column => {
2436
- var _column$formatOptions, _column$formatOptions2;
2437
- return ((_column$formatOptions = column.formatOptions) === null || _column$formatOptions === void 0 ? void 0 : _column$formatOptions.hasSituationsIndicator) !== undefined && ((_column$formatOptions2 = column.formatOptions) === null || _column$formatOptions2 === void 0 ? void 0 : _column$formatOptions2.hasSituationsIndicator) === true;
2438
- });
2439
- if (columnWithSituationsIndicator !== null && columnWithSituationsIndicator !== void 0 && columnWithSituationsIndicator.formatOptions) {
2427
+ const columnWithSituationsIndicator = tableColumns.find(column => column.formatOptions?.hasSituationsIndicator !== undefined && column.formatOptions?.hasSituationsIndicator === true);
2428
+ if (columnWithSituationsIndicator?.formatOptions) {
2440
2429
  // Switch off the situations indicator in the found column
2441
2430
  columnWithSituationsIndicator.formatOptions.hasSituationsIndicator = false;
2442
2431
 
@@ -2466,14 +2455,11 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
2466
2455
  // so we have to disable it here to ensure, that the field building block
2467
2456
  // does not render it into the ID column
2468
2457
  // The additional column is only added for tables on a LR and in case tehe entity is draft enabled!
2469
- const columnsWithDraftIndicator = tableColumns.filter(column => {
2470
- var _column$formatOptions3;
2471
- return ((_column$formatOptions3 = column.formatOptions) === null || _column$formatOptions3 === void 0 ? void 0 : _column$formatOptions3.hasDraftIndicator) === true;
2472
- });
2458
+ const columnsWithDraftIndicator = tableColumns.filter(column => column.formatOptions?.hasDraftIndicator === true);
2473
2459
  if (columnsWithDraftIndicator.length && converterContext.getTemplateType() === TemplateType.ListReport && (ModelHelper.isDraftNode(converterContext.getEntitySet()) || ModelHelper.isDraftRoot(converterContext.getEntitySet()))) {
2474
2460
  // Switch off the draft indicator in the found column
2475
2461
  columnsWithDraftIndicator.forEach(columnWithDraftIndicator => {
2476
- if (columnWithDraftIndicator !== null && columnWithDraftIndicator !== void 0 && columnWithDraftIndicator.formatOptions) {
2462
+ if (columnWithDraftIndicator?.formatOptions) {
2477
2463
  columnWithDraftIndicator.formatOptions.hasDraftIndicator = false;
2478
2464
  }
2479
2465
  });
@@ -2501,24 +2487,18 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
2501
2487
  columnIndexToInsertAfter = tableColumns.findIndex(column => column.availability !== "Hidden");
2502
2488
  }
2503
2489
  tableColumns.splice(columnIndexToInsertAfter + 1, 0, draftIndicatorColumn);
2504
-
2505
- // On an analytical table, we need to explicitely load some data for the draft indicator column --> we add referenced columns for that
2506
- if (tableType === "AnalyticalTable") {
2507
- addReferencesForDraftIndicatorColumn(draftIndicatorColumn, tableColumns, converterContext);
2508
- }
2509
2490
  }
2510
2491
  return tableColumns;
2511
2492
  }
2512
2493
  _exports.addComputedColumns = addComputedColumns;
2513
2494
  function getP13nMode(visualizationPath, converterContext, tableManifestConfiguration) {
2514
- var _tableManifestSetting4;
2515
2495
  const manifestWrapper = converterContext.getManifestWrapper();
2516
2496
  const tableManifestSettings = converterContext.getManifestControlConfiguration(visualizationPath);
2517
2497
  const variantManagement = manifestWrapper.getVariantManagement();
2518
2498
  const modes = [];
2519
2499
  const isAnalyticalTable = tableManifestConfiguration.type === "AnalyticalTable";
2520
2500
  const isResponsiveTable = tableManifestConfiguration.type === "ResponsiveTable";
2521
- if ((tableManifestSettings === null || tableManifestSettings === void 0 ? void 0 : (_tableManifestSetting4 = tableManifestSettings.tableSettings) === null || _tableManifestSetting4 === void 0 ? void 0 : _tableManifestSetting4.personalization) !== undefined) {
2501
+ if (tableManifestSettings?.tableSettings?.personalization !== undefined) {
2522
2502
  // Personalization configured in manifest.
2523
2503
  const personalization = tableManifestSettings.tableSettings.personalization;
2524
2504
  if (personalization === true) {
@@ -2600,10 +2580,10 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
2600
2580
  const sortConditions = {
2601
2581
  sorters: []
2602
2582
  };
2603
- if (presentationVariantAnnotation !== null && presentationVariantAnnotation !== void 0 && presentationVariantAnnotation.SortOrder) {
2583
+ if (presentationVariantAnnotation?.SortOrder) {
2604
2584
  presentationVariantAnnotation.SortOrder.forEach(condition => {
2605
2585
  const conditionProperty = condition.Property;
2606
- if ((conditionProperty === null || conditionProperty === void 0 ? void 0 : conditionProperty.$target) !== undefined && !nonSortableProperties.includes(conditionProperty.$target.name)) {
2586
+ if (conditionProperty?.$target !== undefined && !nonSortableProperties.includes(conditionProperty.$target.name)) {
2607
2587
  const infoName = convertPropertyPathsToInfoNames([conditionProperty], columns)[0];
2608
2588
  if (infoName) {
2609
2589
  sortConditions.sorters.push({
@@ -2617,12 +2597,11 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
2617
2597
  return sortConditions.sorters.length ? sortConditions : undefined;
2618
2598
  }
2619
2599
  function getInitialExpansionLevel(presentationVariantAnnotation) {
2620
- var _presentationVariantA2;
2621
2600
  if (!presentationVariantAnnotation) {
2622
2601
  return undefined;
2623
2602
  }
2624
- const level = (_presentationVariantA2 = presentationVariantAnnotation.InitialExpansionLevel) === null || _presentationVariantA2 === void 0 ? void 0 : _presentationVariantA2.valueOf();
2625
- return typeof level === "number" ? level : undefined;
2603
+ const level = presentationVariantAnnotation.InitialExpansionLevel?.valueOf();
2604
+ return typeof level === "number" ? level + 1 : undefined;
2626
2605
  }
2627
2606
  /**
2628
2607
  * Converts an array of propertyPath to an array of propertyInfo names.
@@ -2634,10 +2613,10 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
2634
2613
  const infoNames = [];
2635
2614
  let propertyInfo, annotationColumn;
2636
2615
  paths.forEach(currentPath => {
2637
- if (currentPath !== null && currentPath !== void 0 && currentPath.value) {
2616
+ if (currentPath?.value) {
2638
2617
  propertyInfo = columns.find(column => {
2639
2618
  annotationColumn = column;
2640
- return !annotationColumn.propertyInfos && annotationColumn.relativePath === (currentPath === null || currentPath === void 0 ? void 0 : currentPath.value);
2619
+ return !annotationColumn.propertyInfos && annotationColumn.relativePath === currentPath?.value;
2641
2620
  });
2642
2621
  if (propertyInfo) {
2643
2622
  infoNames.push(propertyInfo.name);
@@ -2657,7 +2636,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
2657
2636
  const groupConditions = {
2658
2637
  groupLevels: []
2659
2638
  };
2660
- if (presentationVariantAnnotation !== null && presentationVariantAnnotation !== void 0 && presentationVariantAnnotation.GroupBy) {
2639
+ if (presentationVariantAnnotation?.GroupBy) {
2661
2640
  let aGroupBy = presentationVariantAnnotation.GroupBy;
2662
2641
  if (tableType === "ResponsiveTable") {
2663
2642
  aGroupBy = aGroupBy.slice(0, 1);
@@ -2677,15 +2656,19 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
2677
2656
  function _updatePropertyInfosWithAggregatesDefinitions(tableVisualization) {
2678
2657
  const relatedAdditionalPropertyNameMap = {};
2679
2658
  tableVisualization.columns.forEach(column => {
2680
- var _column$additionalPro2;
2681
2659
  column = column;
2682
2660
  const aggregatablePropertyName = Object.keys(tableVisualization.analyticsExtensions).find(aggregate => aggregate === column.name);
2683
2661
  if (aggregatablePropertyName) {
2684
2662
  const aggregatablePropertyDefinition = tableVisualization.analyticsExtensions[aggregatablePropertyName];
2685
2663
  column.aggregatable = !aggregatablePropertyDefinition.fromGroupableProperty;
2686
2664
  column.extension = aggregatablePropertyDefinition ?? {};
2665
+ if (!column.isGroupable && !column.aggregatable) {
2666
+ // The column is neither aggregatable nor groupable --> it's a hidden column to allow filtering in P13N
2667
+ // We need to remove additionalProperties, as it's not needed and causes an error in the MDC table code
2668
+ delete column.extension.additionalProperties;
2669
+ }
2687
2670
  }
2688
- if ((_column$additionalPro2 = column.additionalPropertyInfos) !== null && _column$additionalPro2 !== void 0 && _column$additionalPro2.length) {
2671
+ if (column.additionalPropertyInfos?.length) {
2689
2672
  column.additionalPropertyInfos.forEach(additionalPropertyInfo => {
2690
2673
  // Create propertyInfo for each additional property.
2691
2674
  // The new property 'name' has been prefixed with 'Property_Technical::' for uniqueness and it has been named technical property as it requires dedicated MDC attributes (technicallyGroupable and technicallyAggregatable).
@@ -2696,10 +2679,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
2696
2679
  tableVisualization.columns.forEach(column => {
2697
2680
  column = column;
2698
2681
  if (column.additionalPropertyInfos) {
2699
- var _column$propertyInfos3;
2700
2682
  column.additionalPropertyInfos = column.additionalPropertyInfos.map(propertyInfo => relatedAdditionalPropertyNameMap[propertyInfo] ?? propertyInfo);
2701
2683
  // Add additional properties to the complex property using the hidden annotation.
2702
- column.propertyInfos = (_column$propertyInfos3 = column.propertyInfos) === null || _column$propertyInfos3 === void 0 ? void 0 : _column$propertyInfos3.concat(column.additionalPropertyInfos);
2684
+ column.propertyInfos = column.propertyInfos?.concat(column.additionalPropertyInfos);
2703
2685
  }
2704
2686
  });
2705
2687
  }
@@ -2710,8 +2692,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
2710
2692
  */
2711
2693
  function getRequiredProperties(converterContext) {
2712
2694
  return getContextPropertyRestriction(converterContext.getDataModelObjectPath(), capabilities => {
2713
- var _InsertRestrictions;
2714
- return capabilities === null || capabilities === void 0 ? void 0 : (_InsertRestrictions = capabilities.InsertRestrictions) === null || _InsertRestrictions === void 0 ? void 0 : _InsertRestrictions.RequiredProperties;
2695
+ return capabilities?.InsertRestrictions?.RequiredProperties;
2715
2696
  }, false);
2716
2697
  }
2717
2698
  /**
@@ -2721,10 +2702,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
2721
2702
  * @returns True if the property is required
2722
2703
  */
2723
2704
  function isAnnotatedRequiredProperty(name, converterContext) {
2724
- return getRequiredProperties(converterContext).map(property => {
2725
- var _property$$target;
2726
- return (_property$$target = property.$target) === null || _property$$target === void 0 ? void 0 : _property$$target.fullyQualifiedName;
2727
- }).includes(name);
2705
+ return getRequiredProperties(converterContext).map(property => property.$target?.fullyQualifiedName).includes(name);
2728
2706
  }
2729
2707
  /**
2730
2708
  * Returns a JSON string containing Presentation Variant aggregate conditions.
@@ -2735,7 +2713,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
2735
2713
  */
2736
2714
  function getAggregateConditions(presentationVariantAnnotation, columns, extensionInfoMap) {
2737
2715
  const aggregateConditions = {};
2738
- if (presentationVariantAnnotation !== null && presentationVariantAnnotation !== void 0 && presentationVariantAnnotation.Total) {
2716
+ if (presentationVariantAnnotation?.Total) {
2739
2717
  const aTotals = presentationVariantAnnotation.Total;
2740
2718
  convertPropertyPathsToInfoNames(aTotals, columns).forEach(infoName => {
2741
2719
  aggregateConditions[infoName] = {};
@@ -2790,12 +2768,11 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
2790
2768
  }
2791
2769
  _exports.getStandardActionsConfiguration = getStandardActionsConfiguration;
2792
2770
  function getTableAnnotationConfiguration(lineItemAnnotation, visualizationPath, converterContext, tableManifestConfiguration, columns, navigationSettings, standardActionsConfiguration, presentationVariantAnnotation) {
2793
- var _converterContext$get26, _converterContext$get27, _converterContext$get28;
2794
2771
  // Need to get the target
2795
2772
  const {
2796
2773
  navigationPropertyPath
2797
2774
  } = splitPath(visualizationPath);
2798
- const typeNamePlural = (_converterContext$get26 = converterContext.getDataModelObjectPath().targetEntityType.annotations) === null || _converterContext$get26 === void 0 ? void 0 : (_converterContext$get27 = _converterContext$get26.UI) === null || _converterContext$get27 === void 0 ? void 0 : (_converterContext$get28 = _converterContext$get27.HeaderInfo) === null || _converterContext$get28 === void 0 ? void 0 : _converterContext$get28.TypeNamePlural;
2775
+ const typeNamePlural = converterContext.getDataModelObjectPath().targetEntityType.annotations?.UI?.HeaderInfo?.TypeNamePlural;
2799
2776
  const title = typeNamePlural && compileExpression(getExpressionFromAnnotation(typeNamePlural));
2800
2777
  const entitySet = converterContext.getDataModelObjectPath().targetEntitySet;
2801
2778
  const pageManifestSettings = converterContext.getManifestWrapper();
@@ -2806,7 +2783,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
2806
2783
  const navigationTargetPath = getNavigationTargetPath(converterContext, navigationPropertyPath);
2807
2784
  const selectionMode = getSelectionMode(lineItemAnnotation, visualizationPath, converterContext, hasAbsolutePath, targetCapabilities, standardActionsConfiguration.deleteButtonVisibilityExpression, standardActionsConfiguration.massEditButtonVisibilityExpression, standardActionsConfiguration.cutButtonVisibilityExpression);
2808
2785
  let threshold = navigationPropertyPath ? 10 : 30;
2809
- if (presentationVariantAnnotation !== null && presentationVariantAnnotation !== void 0 && presentationVariantAnnotation.MaxItems) {
2786
+ if (presentationVariantAnnotation?.MaxItems) {
2810
2787
  threshold = presentationVariantAnnotation.MaxItems.valueOf();
2811
2788
  } else if (tableManifestConfiguration.type === "TreeTable") {
2812
2789
  // To make scrolling smooth, we set the threshold value higher for tree tables
@@ -2823,7 +2800,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
2823
2800
  entityTypeName: entitySet && entitySet.entityType ? entitySet.entityType.name : "",
2824
2801
  collection: getTargetObjectPath(converterContext.getDataModelObjectPath()),
2825
2802
  navigationPath: navigationPropertyPath,
2826
- row: _getRowConfigurationProperty(lineItemAnnotation, converterContext, navigationSettings, navigationTargetPath, tableManifestConfiguration.type),
2803
+ row: _getRowConfigurationProperty(lineItemAnnotation, converterContext, navigationSettings, navigationTargetPath, tableManifestConfiguration.type, tableManifestConfiguration.analyticalConfiguration?.aggregationOnLeafLevel // the navigation is disabled if the aggregationOnLeafLevel is set to true
2804
+ ),
2827
2805
  p13nMode,
2828
2806
  isInsertUpdateActionsTemplated: standardActionsConfiguration.isInsertUpdateActionsTemplated,
2829
2807
  updatablePropertyPath: getCurrentEntitySetUpdatablePath(converterContext),
@@ -2836,10 +2814,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
2836
2814
  title: title,
2837
2815
  searchable: tableManifestConfiguration.type !== "AnalyticalTable" && !(isConstant(isSearchable) && isSearchable.value === false),
2838
2816
  initialExpansionLevel: getInitialExpansionLevel(presentationVariantAnnotation),
2839
- requiredProperties: getRequiredProperties(converterContext).filter(property => {
2840
- var _property$$target2;
2841
- return (property === null || property === void 0 ? void 0 : (_property$$target2 = property.$target) === null || _property$$target2 === void 0 ? void 0 : _property$$target2.type) !== "Edm.Boolean";
2842
- }).map(property => property.value)
2817
+ requiredProperties: getRequiredProperties(converterContext).filter(property => property?.$target?.type !== "Edm.Boolean").map(property => property.value)
2843
2818
  };
2844
2819
  }
2845
2820
  /**
@@ -2856,16 +2831,16 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
2856
2831
  let isCurrency = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
2857
2832
  let exportSettings = arguments.length > 3 ? arguments[3] : undefined;
2858
2833
  let exportDataType = "String";
2859
- if (!dataType || exportSettings !== null && exportSettings !== void 0 && exportSettings.dataPointTargetValue) {
2834
+ if (!dataType || exportSettings?.dataPointTargetValue) {
2860
2835
  return exportDataType;
2861
2836
  }
2862
- if (exportSettings !== null && exportSettings !== void 0 && exportSettings.isCurrency || isCurrency) {
2837
+ if (exportSettings?.isCurrency || isCurrency) {
2863
2838
  return "Currency";
2864
2839
  }
2865
2840
  if (isATimezone) {
2866
2841
  return "Timezone";
2867
2842
  }
2868
- if (exportSettings !== null && exportSettings !== void 0 && exportSettings.wrap) {
2843
+ if (exportSettings?.wrap) {
2869
2844
  return exportDataType;
2870
2845
  }
2871
2846
  switch (dataType) {
@@ -2916,17 +2891,16 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
2916
2891
  const resolvedTarget = converterContext.getEntityTypeAnnotation(selectionVariantPath);
2917
2892
  const selection = resolvedTarget.annotation;
2918
2893
  if (selection) {
2919
- var _selection$SelectOpti, _selection$Text;
2920
2894
  const propertyNames = [];
2921
- (_selection$SelectOpti = selection.SelectOptions) === null || _selection$SelectOpti === void 0 ? void 0 : _selection$SelectOpti.forEach(selectOption => {
2895
+ selection.SelectOptions?.forEach(selectOption => {
2922
2896
  const propertyName = selectOption.PropertyName;
2923
- const propertyPath = (propertyName === null || propertyName === void 0 ? void 0 : propertyName.value) ?? "";
2897
+ const propertyPath = propertyName?.value ?? "";
2924
2898
  if (!propertyNames.includes(propertyPath)) {
2925
2899
  propertyNames.push(propertyPath);
2926
2900
  }
2927
2901
  });
2928
2902
  return {
2929
- text: selection === null || selection === void 0 ? void 0 : (_selection$Text = selection.Text) === null || _selection$Text === void 0 ? void 0 : _selection$Text.toString(),
2903
+ text: selection?.Text?.toString(),
2930
2904
  propertyNames: propertyNames
2931
2905
  };
2932
2906
  }
@@ -2973,7 +2947,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
2973
2947
  } else {
2974
2948
  return {
2975
2949
  rowCountMode: tableSettings.rowCountMode ?? "Fixed",
2976
- rowCount: tableSettings.rowCount ? tableSettings.rowCount : 5
2950
+ rowCount: tableSettings.rowCount ?? (tableType === "GridTable" ? 5 : 10)
2977
2951
  };
2978
2952
  }
2979
2953
  } else {
@@ -2987,8 +2961,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
2987
2961
  return _tableSettings.selectAll === true || _tableSettings.selectionLimit === 0 ? 0 : _tableSettings.selectionLimit || 200;
2988
2962
  }
2989
2963
  function _getTableInlineCreationRowCount(_tableSettings) {
2990
- var _tableSettings$creati, _tableSettings$creati2;
2991
- return (_tableSettings$creati = _tableSettings.creationMode) !== null && _tableSettings$creati !== void 0 && _tableSettings$creati.inlineCreationRowCount ? (_tableSettings$creati2 = _tableSettings.creationMode) === null || _tableSettings$creati2 === void 0 ? void 0 : _tableSettings$creati2.inlineCreationRowCount : 1;
2964
+ return _tableSettings.creationMode?.inlineCreationRowCount ? _tableSettings.creationMode?.inlineCreationRowCount : 1;
2992
2965
  }
2993
2966
  function _getEnableExport(tableSettings, converterContext, enablePaste) {
2994
2967
  return tableSettings.enableExport !== undefined ? tableSettings.enableExport : converterContext.getTemplateType() !== "ObjectPage" || enablePaste;
@@ -3006,7 +2979,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
3006
2979
  return tableSettings.widthIncludingColumnHeader ?? false;
3007
2980
  }
3008
2981
  function getFilterConfiguration(tableSettings, lineItemAnnotation, converterContext, selectionVariantAnnotation) {
3009
- var _tableSettings$quickV;
3010
2982
  let hideTableTitle = false;
3011
2983
  const filters = {};
3012
2984
  const targetEntityType = converterContext.getAnnotationEntityType(lineItemAnnotation);
@@ -3040,10 +3012,10 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
3040
3012
  }]
3041
3013
  };
3042
3014
  }
3043
- hideTableTitle = !!((_tableSettings$quickV = tableSettings.quickVariantSelection) !== null && _tableSettings$quickV !== void 0 && _tableSettings$quickV.hideTableTitle);
3015
+ hideTableTitle = !!tableSettings.quickVariantSelection?.hideTableTitle;
3044
3016
  return {
3045
3017
  filters: filters,
3046
- headerVisible: !(filters !== null && filters !== void 0 && filters.quickFilters && hideTableTitle)
3018
+ headerVisible: !(filters?.quickFilters && hideTableTitle)
3047
3019
  };
3048
3020
  }
3049
3021
  /**
@@ -3059,7 +3031,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
3059
3031
  }
3060
3032
  function _getCollectedNavigationPropertyLabels(relativePath, converterContext) {
3061
3033
  const navigationProperties = enhanceDataModelPath(converterContext.getDataModelObjectPath(), relativePath).navigationProperties;
3062
- if ((navigationProperties === null || navigationProperties === void 0 ? void 0 : navigationProperties.length) > 0) {
3034
+ if (navigationProperties?.length > 0) {
3063
3035
  const collectedNavigationPropertyLabels = [];
3064
3036
  navigationProperties.forEach(navProperty => {
3065
3037
  collectedNavigationPropertyLabels.push(getLabel(navProperty) || navProperty.name);
@@ -3074,21 +3046,19 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
3074
3046
  * @returns Whether an expression for enablement is to be generated
3075
3047
  */
3076
3048
  function _useEnabledExpression(dataField, sEntityType) {
3077
- var _dataField$ActionTarg3, _dataField$ActionTarg4, _dataField$ActionTarg5;
3078
3049
  // There are three cases when a table action has an OperationAvailable that leads to an enablement expression
3079
3050
  // and is not dependent upon the table entries.
3080
3051
  // 1. An action with an overload, that is executed against a parent entity.
3081
3052
  // 2. An unbound action
3082
3053
  // 3. A static action (that is, bound to a collection)
3083
3054
  let useEnabledExpression = false;
3084
- if (((_dataField$ActionTarg3 = dataField.ActionTarget) === null || _dataField$ActionTarg3 === void 0 ? void 0 : (_dataField$ActionTarg4 = _dataField$ActionTarg3.annotations) === null || _dataField$ActionTarg4 === void 0 ? void 0 : (_dataField$ActionTarg5 = _dataField$ActionTarg4.Core) === null || _dataField$ActionTarg5 === void 0 ? void 0 : _dataField$ActionTarg5.OperationAvailable) !== undefined) {
3085
- var _dataField$ActionTarg6, _dataField$ActionTarg7, _dataField$ActionTarg8, _dataField$ActionTarg9;
3055
+ if (dataField.ActionTarget?.annotations?.Core?.OperationAvailable !== undefined) {
3086
3056
  // Unbound action. Is recognised, but getExpressionFromAnnotation checks for isBound = true, so not generated.
3087
- const isBound = (_dataField$ActionTarg6 = dataField.ActionTarget) === null || _dataField$ActionTarg6 === void 0 ? void 0 : _dataField$ActionTarg6.isBound;
3057
+ const isBound = dataField.ActionTarget?.isBound;
3088
3058
  //overload action
3089
- const overloadAction = isBound && ((_dataField$ActionTarg7 = dataField.ActionTarget) === null || _dataField$ActionTarg7 === void 0 ? void 0 : _dataField$ActionTarg7.sourceType) !== sEntityType;
3059
+ const overloadAction = isBound && dataField.ActionTarget?.sourceType !== sEntityType;
3090
3060
  //static action
3091
- const staticAction = (_dataField$ActionTarg8 = dataField.ActionTarget) === null || _dataField$ActionTarg8 === void 0 ? void 0 : (_dataField$ActionTarg9 = _dataField$ActionTarg8.parameters[0]) === null || _dataField$ActionTarg9 === void 0 ? void 0 : _dataField$ActionTarg9.isCollection;
3061
+ const staticAction = dataField.ActionTarget?.parameters[0]?.isCollection;
3092
3062
  //copy action
3093
3063
  if (!isBound || overloadAction || staticAction) {
3094
3064
  useEnabledExpression = true;
@@ -3104,16 +3074,15 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
3104
3074
  * @param converterContext The instance of the converter context
3105
3075
  */
3106
3076
  function updateTreeTableManifestConfiguration(tableConfiguration, tableSettings, converterContext) {
3107
- var _tableSettings$creati3, _tableSettings$creati4, _tableSettings$creati5, _tableSettings$creati6, _tableSettings$creati7, _tableSettings$creati8;
3108
3077
  const dataModelObjectPath = converterContext.getDataModelObjectPath();
3109
3078
  tableConfiguration.hierarchyQualifier = tableSettings.hierarchyQualifier;
3110
3079
  const hierarchyParentNavigationPropertyPath = getHierarchyParentNavigationPropertyPath(dataModelObjectPath, tableConfiguration.hierarchyQualifier);
3111
3080
  const nonUpdatableNavigationProperties = getNonUpdatableNavigationProperties(dataModelObjectPath);
3112
- tableConfiguration.isHierarchyParentNodeUpdatable = !(nonUpdatableNavigationProperties !== null && nonUpdatableNavigationProperties !== void 0 && nonUpdatableNavigationProperties.includes(hierarchyParentNavigationPropertyPath));
3081
+ tableConfiguration.isHierarchyParentNodeUpdatable = !nonUpdatableNavigationProperties?.includes(hierarchyParentNavigationPropertyPath);
3113
3082
  tableConfiguration.isNodeMovable = getCustomFunctionInfo(tableSettings.isNodeMovable, tableConfiguration);
3114
3083
  tableConfiguration.isMoveToPositionAllowed = getCustomFunctionInfo(tableSettings.isMoveToPositionAllowed, tableConfiguration);
3115
- tableConfiguration.createEnablement = getCustomFunctionInfo((_tableSettings$creati3 = tableSettings.creationMode) === null || _tableSettings$creati3 === void 0 ? void 0 : _tableSettings$creati3.isCreateEnabled, tableConfiguration);
3116
- if ((_tableSettings$creati4 = tableSettings.creationMode) !== null && _tableSettings$creati4 !== void 0 && (_tableSettings$creati5 = _tableSettings$creati4.nodeType) !== null && _tableSettings$creati5 !== void 0 && _tableSettings$creati5.propertyName && (_tableSettings$creati6 = tableSettings.creationMode) !== null && _tableSettings$creati6 !== void 0 && (_tableSettings$creati7 = _tableSettings$creati6.nodeType) !== null && _tableSettings$creati7 !== void 0 && _tableSettings$creati7.values) {
3084
+ tableConfiguration.createEnablement = getCustomFunctionInfo(tableSettings.creationMode?.isCreateEnabled, tableConfiguration);
3085
+ if (tableSettings.creationMode?.nodeType?.propertyName && tableSettings.creationMode?.nodeType?.values) {
3117
3086
  const values = tableSettings.creationMode.nodeType.values;
3118
3087
  tableConfiguration.nodeType = {
3119
3088
  propertyName: tableSettings.creationMode.nodeType.propertyName,
@@ -3136,7 +3105,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
3136
3105
  }
3137
3106
 
3138
3107
  // Create in place
3139
- if ((_tableSettings$creati8 = tableSettings.creationMode) !== null && _tableSettings$creati8 !== void 0 && _tableSettings$creati8.createInPlace) {
3108
+ if (tableSettings.creationMode?.createInPlace) {
3140
3109
  tableConfiguration.createInPlace = true;
3141
3110
  }
3142
3111
  }
@@ -3169,9 +3138,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
3169
3138
  */
3170
3139
  _exports.getCustomFunctionInfo = getCustomFunctionInfo;
3171
3140
  function getOptimisticBatchSettingsFromManifest(tableManifestSettings) {
3172
- var _tableManifestSetting5;
3173
3141
  // Optimistic batch is set by default
3174
- return (tableManifestSettings === null || tableManifestSettings === void 0 ? void 0 : (_tableManifestSetting5 = tableManifestSettings.tableSettings) === null || _tableManifestSetting5 === void 0 ? void 0 : _tableManifestSetting5.disableRequestCache) || false;
3142
+ return tableManifestSettings?.tableSettings?.disableRequestCache || false;
3175
3143
  }
3176
3144
 
3177
3145
  /**
@@ -3238,33 +3206,31 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
3238
3206
  return fields.replace(/\s/g, "").split(",").map(name => name.trim());
3239
3207
  }
3240
3208
  function getTableManifestConfiguration(lineItemAnnotation, visualizationPath, converterContext) {
3241
- var _globalFEManifestSett, _globalFEManifestSett2, _tableSettings$creati9, _tableSettings$creati10, _converterContext$get29, _converterContext$get30, _tableSettings$creati11, _tableSettings$creati15, _tableSettings$creati16, _tableSettings$creati17, _tableSettings$creati18, _tableSettings$quickV2, _manifestWrapper$getV, _converterContext$get31, _converterContext$get32, _converterContext$get33;
3242
3209
  let checkCondensedLayout = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;
3243
3210
  let selectionVariantAnnotation = arguments.length > 4 ? arguments[4] : undefined;
3244
3211
  const _manifestWrapper = converterContext.getManifestWrapper();
3245
3212
  const tableManifestSettings = converterContext.getManifestControlConfiguration(visualizationPath);
3246
- const tableSettings = (tableManifestSettings === null || tableManifestSettings === void 0 ? void 0 : tableManifestSettings.tableSettings) ?? {};
3213
+ const tableSettings = tableManifestSettings?.tableSettings ?? {};
3247
3214
  const globalFEManifestSettings = _manifestWrapper.getSapFeManifestConfiguration();
3248
- const defaultCreationMode = (globalFEManifestSettings === null || globalFEManifestSettings === void 0 ? void 0 : (_globalFEManifestSett = globalFEManifestSettings.macros) === null || _globalFEManifestSett === void 0 ? void 0 : (_globalFEManifestSett2 = _globalFEManifestSett.table) === null || _globalFEManifestSett2 === void 0 ? void 0 : _globalFEManifestSett2.defaultCreationMode) === "InlineCreationRows" ? CreationMode.InlineCreationRows : undefined;
3249
- const creationMode = ((_tableSettings$creati9 = tableSettings.creationMode) === null || _tableSettings$creati9 === void 0 ? void 0 : _tableSettings$creati9.name) ?? defaultCreationMode ?? CreationMode.NewPage;
3215
+ const defaultCreationMode = globalFEManifestSettings?.macros?.table?.defaultCreationMode === "InlineCreationRows" ? CreationMode.InlineCreationRows : undefined;
3216
+ const creationMode = tableSettings.creationMode?.name ?? defaultCreationMode ?? CreationMode.NewPage;
3250
3217
  const enableAutoColumnWidth = !_manifestWrapper.isPhone();
3251
3218
  const disableCopyToClipboard = tableSettings.disableCopyToClipboard;
3252
3219
  const templateType = converterContext.getTemplateType();
3253
- const dataStateIndicatorFilter = templateType === TemplateType.ListReport ? "API.dataStateIndicatorFilter" : undefined;
3254
3220
  const isCondensedTableLayoutCompliant = checkCondensedLayout && _manifestWrapper.isCondensedLayoutCompliant();
3255
3221
  const oFilterConfiguration = lineItemAnnotation ? getFilterConfiguration(tableSettings, lineItemAnnotation, converterContext, selectionVariantAnnotation) : {};
3256
- const customValidationFunction = (_tableSettings$creati10 = tableSettings.creationMode) === null || _tableSettings$creati10 === void 0 ? void 0 : _tableSettings$creati10.customValidationFunction;
3222
+ const customValidationFunction = tableSettings.creationMode?.customValidationFunction;
3257
3223
  const exportRequestSize = tableSettings.exportRequestSize;
3258
3224
  const tableType = getTableType(converterContext, tableManifestSettings);
3225
+ const analyticalConfiguration = tableSettings.analyticalConfiguration;
3259
3226
  // By default, paste is enabled on an ObjectPage and on a ListReport with a draft TreeTable
3260
- const enablePaste = tableSettings.enablePaste ?? (converterContext.getTemplateType() === "ObjectPage" || tableType === "TreeTable" && ((_converterContext$get29 = converterContext.getEntitySet()) === null || _converterContext$get29 === void 0 ? void 0 : (_converterContext$get30 = _converterContext$get29.annotations.Common) === null || _converterContext$get30 === void 0 ? void 0 : _converterContext$get30.DraftRoot) !== undefined);
3227
+ const enablePaste = tableSettings.enablePaste ?? (converterContext.getTemplateType() === "ObjectPage" || tableType === "TreeTable" && converterContext.getEntitySet()?.annotations.Common?.DraftRoot !== undefined);
3261
3228
  const tableRowMode = _getTableMode(tableType, tableSettings, templateType === TemplateType.ListReport);
3262
3229
  const defaultScrollThreshold = tableType !== "ResponsiveTable" ? 300 : undefined;
3263
3230
  const condensedTableLayout = _getCondensedTableLayout(tableType, tableSettings);
3264
3231
  let inlineCreationRowsHiddenInEditMode = false;
3265
- if ((_tableSettings$creati11 = tableSettings.creationMode) !== null && _tableSettings$creati11 !== void 0 && _tableSettings$creati11.inlineCreationRowsHiddenInEditMode) {
3266
- var _tableSettings$creati12, _tableSettings$creati13, _tableSettings$creati14;
3267
- inlineCreationRowsHiddenInEditMode = typeof ((_tableSettings$creati12 = tableSettings.creationMode) === null || _tableSettings$creati12 === void 0 ? void 0 : _tableSettings$creati12.inlineCreationRowsHiddenInEditMode) === "string" ? ((_tableSettings$creati13 = tableSettings.creationMode) === null || _tableSettings$creati13 === void 0 ? void 0 : _tableSettings$creati13.inlineCreationRowsHiddenInEditMode) === "true" : (_tableSettings$creati14 = tableSettings.creationMode) === null || _tableSettings$creati14 === void 0 ? void 0 : _tableSettings$creati14.inlineCreationRowsHiddenInEditMode;
3232
+ if (tableSettings.creationMode?.inlineCreationRowsHiddenInEditMode) {
3233
+ inlineCreationRowsHiddenInEditMode = typeof tableSettings.creationMode?.inlineCreationRowsHiddenInEditMode === "string" ? tableSettings.creationMode?.inlineCreationRowsHiddenInEditMode === "true" : tableSettings.creationMode?.inlineCreationRowsHiddenInEditMode;
3268
3234
  }
3269
3235
  let useTextForNoDataMessages;
3270
3236
  if (converterContext.getTemplateType() === "ListReport") {
@@ -3274,21 +3240,22 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
3274
3240
  }
3275
3241
  const oConfiguration = {
3276
3242
  // If no createAtEnd is specified it will be false for Inline/CreationDialog create and true otherwise
3277
- createAtEnd: ((_tableSettings$creati15 = tableSettings.creationMode) === null || _tableSettings$creati15 === void 0 ? void 0 : _tableSettings$creati15.createAtEnd) !== undefined ? (_tableSettings$creati16 = tableSettings.creationMode) === null || _tableSettings$creati16 === void 0 ? void 0 : _tableSettings$creati16.createAtEnd : ![CreationMode.Inline, CreationMode.CreationDialog].includes(creationMode),
3243
+ createAtEnd: tableSettings.creationMode?.createAtEnd !== undefined ? tableSettings.creationMode?.createAtEnd : ![CreationMode.Inline, CreationMode.CreationDialog].includes(creationMode),
3278
3244
  creationMode: creationMode,
3279
- creationDialogFields: creationMode === CreationMode.CreationDialog ? getFieldList((_tableSettings$creati17 = tableSettings.creationMode) === null || _tableSettings$creati17 === void 0 ? void 0 : _tableSettings$creati17.creationFields, converterContext) : undefined,
3245
+ creationDialogFields: creationMode === CreationMode.CreationDialog ? getFieldList(tableSettings.creationMode?.creationFields, converterContext) : undefined,
3280
3246
  customValidationFunction: customValidationFunction,
3281
- dataStateIndicatorFilter: dataStateIndicatorFilter,
3247
+ hasDataStateIndicatorFilter: templateType === TemplateType.ListReport,
3282
3248
  // if a custom validation function is provided, disableAddRowButtonForEmptyData should not be considered, i.e. set to false
3283
- disableAddRowButtonForEmptyData: !customValidationFunction ? !!((_tableSettings$creati18 = tableSettings.creationMode) !== null && _tableSettings$creati18 !== void 0 && _tableSettings$creati18.disableAddRowButtonForEmptyData) : false,
3249
+ disableAddRowButtonForEmptyData: !customValidationFunction ? !!tableSettings.creationMode?.disableAddRowButtonForEmptyData : false,
3284
3250
  enableAutoColumnWidth: enableAutoColumnWidth,
3285
3251
  enablePastingOfComputedProperties: tableSettings.enablePastingOfComputedProperties,
3286
3252
  enableExport: _getEnableExport(tableSettings, converterContext, enablePaste),
3253
+ analyticalConfiguration,
3287
3254
  frozenColumnCount: _getFrozenColumnCount(tableSettings),
3288
3255
  widthIncludingColumnHeader: _getWidthIncludingColumnHeader(tableSettings),
3289
3256
  enableFullScreen: _getFullScreenBasedOnDevice(tableSettings, converterContext, _manifestWrapper.isPhone()),
3290
3257
  massEdit: getMassEditSettings(tableSettings, converterContext),
3291
- enableAddCardToInsights: tableSettings === null || tableSettings === void 0 ? void 0 : tableSettings.enableAddCardToInsights,
3258
+ enableAddCardToInsights: tableSettings?.enableAddCardToInsights,
3292
3259
  enablePaste: enablePaste,
3293
3260
  disableCopyToClipboard: disableCopyToClipboard,
3294
3261
  headerVisible: true,
@@ -3297,14 +3264,14 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
3297
3264
  selectionLimit: _getTableSelectionLimit(tableSettings),
3298
3265
  inlineCreationRowCount: _getTableInlineCreationRowCount(tableSettings),
3299
3266
  inlineCreationRowsHiddenInEditMode: inlineCreationRowsHiddenInEditMode,
3300
- showRowCount: tableSettings !== null && tableSettings !== void 0 && (_tableSettings$quickV2 = tableSettings.quickVariantSelection) !== null && _tableSettings$quickV2 !== void 0 && _tableSettings$quickV2.paths ? false : !((_manifestWrapper$getV = _manifestWrapper.getViewConfiguration()) !== null && _manifestWrapper$getV !== void 0 && _manifestWrapper$getV.showCounts),
3267
+ showRowCount: tableSettings?.quickVariantSelection?.paths ? false : !_manifestWrapper.getViewConfiguration()?.showCounts,
3301
3268
  type: tableType,
3302
3269
  disableRequestCache: getOptimisticBatchSettingsFromManifest(tableManifestSettings),
3303
3270
  useCondensedTableLayout: condensedTableLayout && isCondensedTableLayoutCompliant,
3304
3271
  isCompactType: _manifestWrapper.isCompactType(),
3305
3272
  beforeRebindTable: tableSettings.beforeRebindTable,
3306
3273
  exportRequestSize: exportRequestSize,
3307
- enableUploadPlugin: !!((_converterContext$get31 = converterContext.getAnnotationEntityType().annotations) !== null && _converterContext$get31 !== void 0 && (_converterContext$get32 = _converterContext$get31.UI) !== null && _converterContext$get32 !== void 0 && (_converterContext$get33 = _converterContext$get32.MediaResource) !== null && _converterContext$get33 !== void 0 && _converterContext$get33.Stream),
3274
+ enableUploadPlugin: !!converterContext.getAnnotationEntityType().annotations?.UI?.MediaResource?.Stream,
3308
3275
  selectionChange: tableSettings.selectionChange,
3309
3276
  modeForNoDataMessage: useTextForNoDataMessages,
3310
3277
  scrollThreshold: tableSettings.scrollThreshold ?? defaultScrollThreshold
@@ -3324,8 +3291,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
3324
3291
  }
3325
3292
  _exports.getTableManifestConfiguration = getTableManifestConfiguration;
3326
3293
  function getTableType(converterContext, tableManifestSettings) {
3327
- var _tableManifestSetting6;
3328
- if (tableManifestSettings !== null && tableManifestSettings !== void 0 && (_tableManifestSetting6 = tableManifestSettings.tableSettings) !== null && _tableManifestSetting6 !== void 0 && _tableManifestSetting6.type) {
3294
+ if (tableManifestSettings?.tableSettings?.type) {
3329
3295
  // in case the application specified a table type we will use this one
3330
3296
  return tableManifestSettings.tableSettings.type;
3331
3297
  }
@@ -3362,7 +3328,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
3362
3328
  }
3363
3329
  }
3364
3330
  function getTypeConfig(oProperty, dataType) {
3365
- var _oTargetMapping, _propertyTypeConfig$t, _propertyTypeConfig$t2, _propertyTypeConfig$t3, _propertyTypeConfig$t4;
3366
3331
  let oTargetMapping;
3367
3332
  if (isProperty(oProperty)) {
3368
3333
  oTargetMapping = isTypeDefinition(oProperty.targetType) ? EDM_TYPE_MAPPING[oProperty.targetType.underlyingType] : EDM_TYPE_MAPPING[oProperty.type];
@@ -3371,25 +3336,24 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
3371
3336
  oTargetMapping = EDM_TYPE_MAPPING[dataType];
3372
3337
  }
3373
3338
  const propertyTypeConfig = {
3374
- type: (_oTargetMapping = oTargetMapping) === null || _oTargetMapping === void 0 ? void 0 : _oTargetMapping.type,
3339
+ type: oTargetMapping?.type,
3375
3340
  constraints: {},
3376
3341
  formatOptions: {}
3377
3342
  };
3378
3343
  if (isProperty(oProperty) && oTargetMapping !== undefined) {
3379
- var _oTargetMapping$const, _oTargetMapping$const2, _oTargetMapping$const3, _oTargetMapping$const4, _oTargetMapping$const5, _oProperty$annotation, _oProperty$annotation2, _oProperty$annotation3, _oProperty$annotation4, _oTargetMapping$const6, _oProperty$annotation5, _oProperty$annotation6, _oProperty$annotation7, _oProperty$annotation8, _oTargetMapping$const7, _oProperty$annotation9, _oProperty$annotation10;
3380
3344
  propertyTypeConfig.constraints = {
3381
- scale: (_oTargetMapping$const = oTargetMapping.constraints) !== null && _oTargetMapping$const !== void 0 && _oTargetMapping$const.$Scale ? oProperty.scale : undefined,
3382
- precision: (_oTargetMapping$const2 = oTargetMapping.constraints) !== null && _oTargetMapping$const2 !== void 0 && _oTargetMapping$const2.$Precision ? oProperty.precision : undefined,
3383
- maxLength: (_oTargetMapping$const3 = oTargetMapping.constraints) !== null && _oTargetMapping$const3 !== void 0 && _oTargetMapping$const3.$MaxLength ? oProperty.maxLength : undefined,
3384
- nullable: (_oTargetMapping$const4 = oTargetMapping.constraints) !== null && _oTargetMapping$const4 !== void 0 && _oTargetMapping$const4.$Nullable ? oProperty.nullable : undefined,
3385
- minimum: (_oTargetMapping$const5 = oTargetMapping.constraints) !== null && _oTargetMapping$const5 !== void 0 && _oTargetMapping$const5["@Org.OData.Validation.V1.Minimum/$Decimal"] && !isNaN((_oProperty$annotation = oProperty.annotations) === null || _oProperty$annotation === void 0 ? void 0 : (_oProperty$annotation2 = _oProperty$annotation.Validation) === null || _oProperty$annotation2 === void 0 ? void 0 : _oProperty$annotation2.Minimum) ? `${(_oProperty$annotation3 = oProperty.annotations) === null || _oProperty$annotation3 === void 0 ? void 0 : (_oProperty$annotation4 = _oProperty$annotation3.Validation) === null || _oProperty$annotation4 === void 0 ? void 0 : _oProperty$annotation4.Minimum}` : undefined,
3386
- maximum: (_oTargetMapping$const6 = oTargetMapping.constraints) !== null && _oTargetMapping$const6 !== void 0 && _oTargetMapping$const6["@Org.OData.Validation.V1.Maximum/$Decimal"] && !isNaN((_oProperty$annotation5 = oProperty.annotations) === null || _oProperty$annotation5 === void 0 ? void 0 : (_oProperty$annotation6 = _oProperty$annotation5.Validation) === null || _oProperty$annotation6 === void 0 ? void 0 : _oProperty$annotation6.Maximum) ? `${(_oProperty$annotation7 = oProperty.annotations) === null || _oProperty$annotation7 === void 0 ? void 0 : (_oProperty$annotation8 = _oProperty$annotation7.Validation) === null || _oProperty$annotation8 === void 0 ? void 0 : _oProperty$annotation8.Maximum}` : undefined,
3387
- isDigitSequence: propertyTypeConfig.type === "sap.ui.model.odata.type.String" && (_oTargetMapping$const7 = oTargetMapping.constraints) !== null && _oTargetMapping$const7 !== void 0 && _oTargetMapping$const7[`@${"com.sap.vocabularies.Common.v1.IsDigitSequence"}`] && (_oProperty$annotation9 = oProperty.annotations) !== null && _oProperty$annotation9 !== void 0 && (_oProperty$annotation10 = _oProperty$annotation9.Common) !== null && _oProperty$annotation10 !== void 0 && _oProperty$annotation10.IsDigitSequence ? true : undefined
3345
+ scale: oTargetMapping.constraints?.$Scale ? oProperty.scale : undefined,
3346
+ precision: oTargetMapping.constraints?.$Precision ? oProperty.precision : undefined,
3347
+ maxLength: oTargetMapping.constraints?.$MaxLength ? oProperty.maxLength : undefined,
3348
+ nullable: oTargetMapping.constraints?.$Nullable ? oProperty.nullable : undefined,
3349
+ minimum: oTargetMapping.constraints?.["@Org.OData.Validation.V1.Minimum/$Decimal"] && !isNaN(oProperty.annotations?.Validation?.Minimum) ? `${oProperty.annotations?.Validation?.Minimum}` : undefined,
3350
+ maximum: oTargetMapping.constraints?.["@Org.OData.Validation.V1.Maximum/$Decimal"] && !isNaN(oProperty.annotations?.Validation?.Maximum) ? `${oProperty.annotations?.Validation?.Maximum}` : undefined,
3351
+ isDigitSequence: propertyTypeConfig.type === "sap.ui.model.odata.type.String" && oTargetMapping.constraints?.[`@${"com.sap.vocabularies.Common.v1.IsDigitSequence"}`] && oProperty.annotations?.Common?.IsDigitSequence ? true : undefined
3388
3352
  };
3389
3353
  }
3390
3354
  propertyTypeConfig.formatOptions = {
3391
- parseAsString: (propertyTypeConfig === null || propertyTypeConfig === void 0 ? void 0 : (_propertyTypeConfig$t = propertyTypeConfig.type) === null || _propertyTypeConfig$t === void 0 ? void 0 : _propertyTypeConfig$t.indexOf("sap.ui.model.odata.type.Int")) === 0 || (propertyTypeConfig === null || propertyTypeConfig === void 0 ? void 0 : (_propertyTypeConfig$t2 = propertyTypeConfig.type) === null || _propertyTypeConfig$t2 === void 0 ? void 0 : _propertyTypeConfig$t2.indexOf("sap.ui.model.odata.type.Double")) === 0 ? false : undefined,
3392
- emptyString: (propertyTypeConfig === null || propertyTypeConfig === void 0 ? void 0 : (_propertyTypeConfig$t3 = propertyTypeConfig.type) === null || _propertyTypeConfig$t3 === void 0 ? void 0 : _propertyTypeConfig$t3.indexOf("sap.ui.model.odata.type.Int")) === 0 || (propertyTypeConfig === null || propertyTypeConfig === void 0 ? void 0 : (_propertyTypeConfig$t4 = propertyTypeConfig.type) === null || _propertyTypeConfig$t4 === void 0 ? void 0 : _propertyTypeConfig$t4.indexOf("sap.ui.model.odata.type.Double")) === 0 ? "" : undefined,
3355
+ parseAsString: propertyTypeConfig?.type?.indexOf("sap.ui.model.odata.type.Int") === 0 || propertyTypeConfig?.type?.indexOf("sap.ui.model.odata.type.Double") === 0 ? false : undefined,
3356
+ emptyString: propertyTypeConfig?.type?.indexOf("sap.ui.model.odata.type.Int") === 0 || propertyTypeConfig?.type?.indexOf("sap.ui.model.odata.type.Double") === 0 ? "" : undefined,
3393
3357
  parseKeepsEmptyString: propertyTypeConfig.type === "sap.ui.model.odata.type.String" && propertyTypeConfig.constraints.nullable === false ? true : undefined
3394
3358
  };
3395
3359
  return propertyTypeConfig;
@@ -3414,12 +3378,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
3414
3378
  * @param column The given column from lineItem or property of entitySet
3415
3379
  */
3416
3380
  function computeHiddenOnRelatedColumns(existingColumns, name, column) {
3417
- const relatedAnnotationColumns = existingColumns.filter(existingColumn => {
3418
- var _existingColumn$prope;
3419
- return ((_existingColumn$prope = existingColumn.propertyInfos) === null || _existingColumn$prope === void 0 ? void 0 : _existingColumn$prope.includes(name)) && existingColumn.isPartOfLineItem;
3420
- });
3381
+ const relatedAnnotationColumns = existingColumns.filter(existingColumn => existingColumn.propertyInfos?.includes(name) && existingColumn.isPartOfLineItem || existingColumn.isPartOfLineItem && existingColumn.relativePath === column.relativePath);
3421
3382
  column.isPartOfLineItem = !!relatedAnnotationColumns.length;
3422
- if (relatedAnnotationColumns.length && !(relatedAnnotationColumns !== null && relatedAnnotationColumns !== void 0 && relatedAnnotationColumns.some(annotationColumn => annotationColumn.availability !== "Hidden"))) {
3383
+ if (relatedAnnotationColumns.length && !relatedAnnotationColumns?.some(annotationColumn => annotationColumn.availability !== "Hidden")) {
3423
3384
  column.sortable = false;
3424
3385
  column.isGroupable = false;
3425
3386
  column.filterable = false;
@@ -3437,23 +3398,20 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
3437
3398
  * @returns The export settings of the column merging customized export settings with the default values detected on the annotation column
3438
3399
  */
3439
3400
  function getCustomExportSettings(exportSettings, annotationColumns, converterContext, entityType, propertyInfos, columnKey) {
3440
- var _exportSettings$prope, _columnFromAnnotation3, _columnFromAnnotation4, _columnFromAnnotation5, _columnFromAnnotation6, _columnFromAnnotation7;
3441
3401
  let columnFromAnnotations;
3442
3402
  if (columnKey) {
3443
- var _columnFromAnnotation;
3444
3403
  columnFromAnnotations = annotationColumns.find(annotationColumn => annotationColumn.key === columnKey);
3445
- if (((_columnFromAnnotation = columnFromAnnotations) === null || _columnFromAnnotation === void 0 ? void 0 : _columnFromAnnotation.exportSettings) === null) {
3446
- var _columnFromAnnotation2;
3447
- return (_columnFromAnnotation2 = columnFromAnnotations) === null || _columnFromAnnotation2 === void 0 ? void 0 : _columnFromAnnotation2.exportSettings;
3404
+ if (columnFromAnnotations?.exportSettings === null) {
3405
+ return columnFromAnnotations?.exportSettings;
3448
3406
  }
3449
3407
  }
3450
- const enableWrapping = (exportSettings === null || exportSettings === void 0 ? void 0 : exportSettings.wrap) ?? (!!(exportSettings !== null && exportSettings !== void 0 && exportSettings.property && ((_exportSettings$prope = exportSettings.property) === null || _exportSettings$prope === void 0 ? void 0 : _exportSettings$prope.length) > 1) || !!(propertyInfos && propertyInfos.length > 1));
3408
+ const enableWrapping = exportSettings?.wrap ?? (!!(exportSettings?.property && exportSettings.property?.length > 1) || !!(propertyInfos && propertyInfos.length > 1));
3451
3409
  const customExportSettings = {
3452
- ...((_columnFromAnnotation3 = columnFromAnnotations) === null || _columnFromAnnotation3 === void 0 ? void 0 : _columnFromAnnotation3.exportSettings),
3453
- type: (exportSettings === null || exportSettings === void 0 ? void 0 : exportSettings.type) ?? ((_columnFromAnnotation4 = columnFromAnnotations) === null || _columnFromAnnotation4 === void 0 ? void 0 : (_columnFromAnnotation5 = _columnFromAnnotation4.exportSettings) === null || _columnFromAnnotation5 === void 0 ? void 0 : _columnFromAnnotation5.type),
3454
- template: (exportSettings === null || exportSettings === void 0 ? void 0 : exportSettings.template) ?? _appendCustomTemplate(propertyInfos, exportSettings === null || exportSettings === void 0 ? void 0 : exportSettings.property) ?? ((_columnFromAnnotation6 = columnFromAnnotations) === null || _columnFromAnnotation6 === void 0 ? void 0 : (_columnFromAnnotation7 = _columnFromAnnotation6.exportSettings) === null || _columnFromAnnotation7 === void 0 ? void 0 : _columnFromAnnotation7.template),
3455
- property: exportSettings !== null && exportSettings !== void 0 && exportSettings.property ? _getPropertyNames(exportSettings === null || exportSettings === void 0 ? void 0 : exportSettings.property, annotationColumns, converterContext, entityType) : undefined,
3456
- width: exportSettings === null || exportSettings === void 0 ? void 0 : exportSettings.width,
3410
+ ...columnFromAnnotations?.exportSettings,
3411
+ type: exportSettings?.type ?? columnFromAnnotations?.exportSettings?.type,
3412
+ template: exportSettings?.template ?? _appendCustomTemplate(propertyInfos, exportSettings?.property) ?? columnFromAnnotations?.exportSettings?.template,
3413
+ property: exportSettings?.property ? _getPropertyNames(exportSettings?.property, annotationColumns, converterContext, entityType) : undefined,
3414
+ width: exportSettings?.width,
3457
3415
  wrap: enableWrapping
3458
3416
  };
3459
3417
  return removeUndefinedFromExportSettings(customExportSettings);
@@ -3483,4 +3441,4 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
3483
3441
  getCustomFunctionInfo
3484
3442
  };
3485
3443
  }, false);
3486
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDb2x1bW5UeXBlIiwic2VsZWN0aW9uTGltaXRGb3JPcGVuSW5OZXdUYWIiLCJnZXRUYWJsZUFjdGlvbnMiLCJsaW5lSXRlbUFubm90YXRpb24iLCJ2aXN1YWxpemF0aW9uUGF0aCIsImNvbnZlcnRlckNvbnRleHQiLCJzdGFuZGFyZEFjdGlvbnMiLCJuYXZpZ2F0aW9uU2V0dGluZ3MiLCJ0YWJsZUFjdGlvbnMiLCJnZXRUYWJsZUFubm90YXRpb25BY3Rpb25zIiwibWFuaWZlc3RBY3Rpb25zIiwiZ2V0QWN0aW9uc0Zyb21NYW5pZmVzdCIsImdldE1hbmlmZXN0Q29udHJvbENvbmZpZ3VyYXRpb24iLCJhY3Rpb25zIiwiY29weUFjdGlvbnMiLCJmaWx0ZXIiLCJhIiwidHlwZSIsIkFjdGlvblR5cGUiLCJDb3B5IiwiYW5ub3RhdGlvbkFjdGlvbnMiLCJhbm5vdGF0aW9uQW5kU3RhbmRhcmRBY3Rpb25zIiwiY3JlYXRlIiwiZGVsZXRlIiwibWFzc0VkaXQiLCJpbnNpZ2h0cyIsImNyZWF0aW9uUm93IiwiY3V0IiwicGFzdGUiLCJtb3ZlVXAiLCJtb3ZlRG93biIsImFjdGlvbiIsInVuZGVmaW5lZCIsIm1hbmlmZXN0QWN0aW9uIiwiT2JqZWN0IiwidmFsdWVzIiwiX21hbmlmZXN0QWN0aW9uJHBvc2l0IiwiRGVmYXVsdCIsIk1lbnUiLCJwb3NpdGlvbiIsImFuY2hvciIsIlN0YW5kYXJkQWN0aW9uS2V5cyIsIkNyZWF0ZSIsInBsYWNlbWVudCIsIlBsYWNlbWVudCIsIkJlZm9yZSIsIm1hbmlmZXN0QWN0aW9uRW50cmllcyIsImVudHJpZXMiLCJzdGFuZGFyZE1hbmlmZXN0QWN0aW9ucyIsImZyb21FbnRyaWVzIiwiX3JlZiIsImtleSIsInN0YXJ0c1dpdGgiLCJub25TdGFuZGFyZE1hbmlmZXN0QWN0aW9ucyIsIl9yZWYyIiwiYWN0aW9uT3ZlcndyaXRlQ29uZmlnIiwiaXNOYXZpZ2FibGUiLCJPdmVycmlkZVR5cGUiLCJvdmVyd3JpdGUiLCJlbmFibGVPblNlbGVjdCIsImVuYWJsZUF1dG9TY3JvbGwiLCJlbmFibGVkIiwidmlzaWJsZSIsInZpc2libGVGb3JDb250ZXh0TWVudSIsImRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbiIsImNvbW1hbmQiLCJpbnNlcnRDdXN0b21FbGVtZW50cyIsImNvbW1hbmRBY3Rpb25zIiwiX2V4cG9ydHMiLCJnZXRUYWJsZUNvbHVtbnMiLCJhbm5vdGF0aW9uQ29sdW1ucyIsImdldENvbHVtbnNGcm9tQW5ub3RhdGlvbnMiLCJtYW5pZmVzdENvbHVtbnMiLCJnZXRDb2x1bW5zRnJvbU1hbmlmZXN0IiwiY29sdW1ucyIsImdldEFubm90YXRpb25FbnRpdHlUeXBlIiwidGFibGVDb2x1bW5zIiwid2lkdGgiLCJ3aWR0aEluY2x1ZGluZ0NvbHVtbkhlYWRlciIsImltcG9ydGFuY2UiLCJob3Jpem9udGFsQWxpZ24iLCJhdmFpbGFiaWxpdHkiLCJzZXR0aW5ncyIsImZvcm1hdE9wdGlvbnMiLCJleHBvcnRTZXR0aW5ncyIsImFkZENvbXB1dGVkQ29sdW1ucyIsImdldENvbnRleHREZWZpbmluZ1Byb3BlcnRpZXNGcm9tQWdncmVnYXRpb25Bbm5vdGF0aW9uIiwiYWdncmVnYXRpb25IZWxwZXIiLCJjdXN0b21BZ2dyZWdhdGVBbm5vdGF0aW9ucyIsImdldEN1c3RvbUFnZ3JlZ2F0ZURlZmluaXRpb25zIiwiY3VzdG9tQWdncmVnYXRlZGVmaW5pdGlvbnMiLCJmb3JFYWNoIiwiYW5ub3RhdGlvbiIsImFnZ3JlZ2F0ZWRQcm9wZXJ0eSIsIl9lbnRpdHlUeXBlIiwiZW50aXR5UHJvcGVydGllcyIsImZpbmQiLCJwcm9wZXJ0eSIsIm5hbWUiLCJxdWFsaWZpZXIiLCJfYW5ub3RhdGlvbiRhbm5vdGF0aW8iLCJfYW5ub3RhdGlvbiRhbm5vdGF0aW8yIiwiX2FnZ3JlZ2F0ZWRQcm9wZXJ0eSRhIiwiY29udGV4dERlZmluaW5nUHJvcGVydGllcyIsImFubm90YXRpb25zIiwiQWdncmVnYXRpb24iLCJDb250ZXh0RGVmaW5pbmdQcm9wZXJ0aWVzIiwibWFwIiwiY3R4RGVmUHJvcGVydHkiLCJ2YWx1ZSIsImdldEV4dGVuc2lvbkluZm9Gcm9tRW50aXR5VHlwZSIsImVudGl0eVR5cGUiLCJBZ2dyZWdhdGlvbkhlbHBlciIsImlzQW5hbHl0aWNzU3VwcG9ydGVkIiwiY3VycmVuY3lPclVuaXRQcm9wZXJ0aWVzIiwiU2V0IiwiY29sdW1uIiwidGFibGVDb2x1bW4iLCJ1bml0IiwidGFyZ2V0VW5pdFByb3BlcnR5IiwicHJvcCIsImFkZCIsInJlbGF0aXZlUGF0aCIsImNvbnRleHREZWZpbmluZ1Byb3BlcnRpZXNGcm9tQWdncmVnYXRpb24iLCJyZXN1bHQiLCJwcm9wZXJ0eUluZm9zIiwicmF3Q29udGV4dERlZmluaW5nUHJvcGVydGllcyIsImZyb21Hcm91cGFibGVQcm9wZXJ0eSIsImlzUHJvcGVydHlHcm91cGFibGUiLCJfcHJvcGVydHkkYW5ub3RhdGlvbnMiLCJfcHJvcGVydHkkYW5ub3RhdGlvbnMyIiwiaGFzIiwiY29udGV4dERlZmluaW5nUHJvcGVydHlOYW1lIiwiZm91bmRDb2x1bW4iLCJmaW5kQ29sdW1uQnlQYXRoIiwicHVzaCIsImxlbmd0aCIsImFkZGl0aW9uYWxQcm9wZXJ0aWVzIiwidXBkYXRlVGFibGVWaXN1YWxpemF0aW9uRm9yVHlwZSIsInRhYmxlVmlzdWFsaXphdGlvbiIsInByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uIiwiY29udHJvbCIsImFnZ3JlZ2F0aW9uRGF0YSIsImVuYWJsZUFuYWx5dGljcyIsImVuYWJsZSRzZWxlY3QiLCJlbmFibGUkJGdldEtlZXBBbGl2ZUNvbnRleHQiLCJhbmFseXRpY3NFeHRlbnNpb25zIiwiX3VwZGF0ZVByb3BlcnR5SW5mb3NXaXRoQWdncmVnYXRlc0RlZmluaXRpb25zIiwiYWxsb3dlZFRyYW5zZm9ybWF0aW9ucyIsImdldEFsbG93ZWRUcmFuc2Zvcm1hdGlvbnMiLCJlbmFibGVCYXNpY1NlYXJjaCIsImluY2x1ZGVzIiwiZ3JvdXBDb25kaXRpb25zIiwiZ2V0R3JvdXBDb25kaXRpb25zIiwiYWdncmVnYXRlQ29uZGl0aW9ucyIsImdldEFnZ3JlZ2F0ZUNvbmRpdGlvbnMiLCJNb2RlbEhlbHBlciIsImlzT2JqZWN0UGF0aERyYWZ0U3VwcG9ydGVkIiwiZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCIsInJlcXVlc3RBdExlYXN0IiwiX2VudGl0eVR5cGUkYW5ub3RhdGlvIiwiX2VudGl0eVR5cGUkYW5ub3RhdGlvMiIsIl9lbnRpdHlUeXBlJGFubm90YXRpbzMiLCJfZW50aXR5VHlwZSRhbm5vdGF0aW80IiwiY2hhbmdlU2libGluZ0ZvclJvb3RzU3VwcG9ydGVkIiwiSGllcmFyY2h5IiwiaGllcmFyY2h5UXVhbGlmaWVyIiwiQ2hhbmdlU2libGluZ0ZvclJvb3RzU3VwcG9ydGVkIiwiYWxsb3dEcm9wQmV0d2Vlbk5vZGVzIiwiQ2hhbmdlTmV4dFNpYmxpbmdBY3Rpb24iLCJlbmFibGVVcGxvYWRQbHVnaW4iLCJfY29udmVydGVyQ29udGV4dCRnZXQiLCJfY29udmVydGVyQ29udGV4dCRnZXQyIiwiX2NvbnZlcnRlckNvbnRleHQkZ2V0MyIsIl9jb252ZXJ0ZXJDb250ZXh0JGdldDQiLCJfc3RyZWFtUHJvcGVydHkkYW5ub3QiLCJfc3RyZWFtUHJvcGVydHkkYW5ub3QyIiwiX3N0cmVhbVByb3BlcnR5JGFubm90MyIsIl9zdHJlYW1Qcm9wZXJ0eSRhbm5vdDQiLCJfc3RyZWFtUHJvcGVydHkkYW5ub3Q1IiwiX3N0cmVhbVByb3BlcnR5JGFubm90NiIsIl9zdHJlYW1Qcm9wZXJ0eSRhbm5vdDciLCJfc3RyZWFtUHJvcGVydHkkYW5ub3Q4Iiwic3RyZWFtUHJvcGVydHkiLCJVSSIsIk1lZGlhUmVzb3VyY2UiLCJTdHJlYW0iLCIkdGFyZ2V0IiwidXBsb2FkQWN0aW9uIiwidXBsb2FkVGFibGUiLCJzdHJlYW0iLCJmaWxlTmFtZSIsIkNvcmUiLCJDb250ZW50RGlzcG9zaXRpb24iLCJGaWxlbmFtZSIsInBhdGgiLCJmaWxlTmFtZU1heExlbmd0aCIsIm1heExlbmd0aCIsImFjY2VwdGFibGVNZWRpYVR5cGVzIiwiQWNjZXB0YWJsZU1lZGlhVHlwZXMiLCJjbGVhclNlbGVjdGlvbk9uRmlsdGVyIiwiY3JlYXRlUmVxdWVzdGVkUHJvcGVydGllcyIsImxpbmVJdGVtIiwib3BlcmF0aW9uQXZhaWxhYmxlIiwiX2VudGl0eVR5cGUkYW5ub3RhdGlvNSIsIl9jb252ZXJ0ZXJDb250ZXh0JGdldDUiLCJfY29udmVydGVyQ29udGV4dCRnZXQ2Iiwic2VsZWN0ZWRGaWVsZHMiLCJwdXNoRmllbGQiLCJmaWVsZCIsImluZGV4T2YiLCJwdXNoRmllbGRMaXN0IiwiZmllbGRzIiwib3BlcmF0aW9uQXZhaWxhYmxlUHJvcGVydGllcyIsInNwbGl0IiwidmFsaWRQcm9wZXJ0aWVzIiwicHJvcE5hbWUiLCJyZXNvbHZlUGF0aCIsInNlbWFudGljS2V5cyIsIkNvbW1vbiIsIlNlbWFudGljS2V5Iiwic2VtYW50aWNLZXkiLCJjYXBhYmlsaXRpZXNBbm5vdGF0aW9uIiwiZ2V0RW50aXR5U2V0IiwiQ2FwYWJpbGl0aWVzIiwiYWx0ZXJuYXRlQW5kU2Vjb25kYXJ5S2V5cyIsImdldEFsdGVybmF0ZUFuZFNlY29uZGFyeUtleXMiLCJfcHJlc2VudGF0aW9uVmFyaWFudEEiLCJSZXF1ZXN0QXRMZWFzdCIsInByb3BlcnR5UGF0aCIsImdldE5hdmlnYXRpb25BdmFpbGFibGVGaWVsZHNGcm9tTGluZUl0ZW0iLCJfY2FwYWJpbGl0aWVzQW5ub3RhdGkiLCJfY2FwYWJpbGl0aWVzQW5ub3RhdGkyIiwiX2NhcGFiaWxpdGllc0Fubm90YXRpMyIsIl9jYXBhYmlsaXRpZXNBbm5vdGF0aTQiLCJEZWxldGVSZXN0cmljdGlvbnMiLCJEZWxldGFibGUiLCJVcGRhdGVSZXN0cmljdGlvbnMiLCJVcGRhdGFibGUiLCJyZWNvcmQiLCIkVHlwZSIsIklubGluZSIsIkRldGVybWluaW5nIiwiaXNQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb24iLCJOYXZpZ2F0aW9uQXZhaWxhYmxlIiwiZ2V0TmF2aWdhdGlvblRhcmdldFBhdGgiLCJuYXZpZ2F0aW9uUHJvcGVydHlQYXRoIiwibWFuaWZlc3RXcmFwcGVyIiwiZ2V0TWFuaWZlc3RXcmFwcGVyIiwiZ2V0TmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24iLCJuYXZDb25maWciLCJrZXlzIiwiZGF0YU1vZGVsUGF0aCIsImNvbnRleHRQYXRoIiwiZ2V0Q29udGV4dFBhdGgiLCJuYXZDb25maWdGb3JDb250ZXh0UGF0aCIsInRhcmdldEVudGl0eVNldCIsInN0YXJ0aW5nRW50aXR5U2V0IiwiYW5ub3RhdGlvbkNvbHVtbiIsInVwZGF0ZUxpbmtlZFByb3BlcnRpZXMiLCJvQ29sdW1uIiwiX3Byb3BlcnR5JGFubm90YXRpb25zMyIsIl9wcm9wZXJ0eSRhbm5vdGF0aW9uczQiLCJfcHJvcGVydHkkYW5ub3RhdGlvbnM5IiwidW5pdFByb3BlcnR5IiwiZ2V0QXNzb2NpYXRlZEN1cnJlbmN5UHJvcGVydHkiLCJnZXRBc3NvY2lhdGVkVW5pdFByb3BlcnR5IiwidGltZXpvbmVQcm9wZXJ0eSIsImdldEFzc29jaWF0ZWRUaW1lem9uZVByb3BlcnR5IiwidGltZXpvbmUiLCJUaW1lem9uZSIsInVuaXRDb2x1bW4iLCJfcHJvcGVydHkkYW5ub3RhdGlvbnM1IiwiX3Byb3BlcnR5JGFubm90YXRpb25zNiIsIl9wcm9wZXJ0eSRhbm5vdGF0aW9uczciLCJfcHJvcGVydHkkYW5ub3RhdGlvbnM4IiwiTWVhc3VyZXMiLCJJU09DdXJyZW5jeSIsIlVuaXQiLCJ1bml0VGV4dCIsIm9UaW1lem9uZUNvbHVtbiIsInRpbWV6b25lVGV4dCIsInRvU3RyaW5nIiwiZGlzcGxheU1vZGUiLCJnZXREaXNwbGF5TW9kZSIsInRleHRBbm5vdGF0aW9uIiwiVGV4dCIsInRleHRDb2x1bW4iLCJ0ZXh0QXJyYW5nZW1lbnQiLCJ0ZXh0UHJvcGVydHkiLCJtb2RlIiwiZ2V0U2VtYW50aWNLZXlzQW5kVGl0bGVJbmZvIiwiX2NvbnZlcnRlckNvbnRleHQkZ2V0NyIsIl9jb252ZXJ0ZXJDb250ZXh0JGdldDgiLCJfY29udmVydGVyQ29udGV4dCRnZXQ5IiwiX2NvbnZlcnRlckNvbnRleHQkZ2V0MTAiLCJfY29udmVydGVyQ29udGV4dCRnZXQxMSIsIl9jb252ZXJ0ZXJDb250ZXh0JGdldDEyIiwiX2NvbnZlcnRlckNvbnRleHQkZ2V0MTMiLCJfY29udmVydGVyQ29udGV4dCRnZXQxNCIsIl9jb252ZXJ0ZXJDb250ZXh0JGdldDE1IiwiX2NvbnZlcnRlckNvbnRleHQkZ2V0MTYiLCJfY29udmVydGVyQ29udGV4dCRnZXQxNyIsIl9jb252ZXJ0ZXJDb250ZXh0JGdldDE4IiwiX2NvbnZlcnRlckNvbnRleHQkZ2V0MTkiLCJoZWFkZXJJbmZvVGl0bGVQYXRoIiwiSGVhZGVySW5mbyIsIlRpdGxlIiwiVmFsdWUiLCJzZW1hbnRpY0tleUFubm90YXRpb25zIiwiaGVhZGVySW5mb1R5cGVOYW1lIiwiVHlwZU5hbWUiLCJzZW1hbnRpY0tleUNvbHVtbnMiLCJjcmVhdGVUYWJsZVZpc3VhbGl6YXRpb24iLCJwYXJhbXMiLCJpc0NvbmRlbnNlZFRhYmxlTGF5b3V0Q29tcGxpYW50Iiwic2VsZWN0aW9uVmFyaWFudEFubm90YXRpb24iLCJ0YWJsZU1hbmlmZXN0Q29uZmlnIiwiZ2V0VGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24iLCJzcGxpdFBhdGgiLCJuYXZpZ2F0aW9uVGFyZ2V0UGF0aCIsIm9wZXJhdGlvbkF2YWlsYWJsZU1hcCIsImdldE9wZXJhdGlvbkF2YWlsYWJsZU1hcCIsInNlbWFudGljS2V5c0FuZEhlYWRlckluZm9UaXRsZSIsInN0YW5kYXJkQWN0aW9uc0NvbmZpZ3VyYXRpb24iLCJnZXRTdGFuZGFyZEFjdGlvbnNDb25maWd1cmF0aW9uIiwidGFibGVBbm5vdGF0aW9uIiwiZ2V0VGFibGVBbm5vdGF0aW9uQ29uZmlndXJhdGlvbiIsImdldE9wZXJhdGlvbkF2YWlsYWJsZVByb3BlcnRpZXMiLCJoZWFkZXIiLCJ0aXRsZSIsIm9WaXN1YWxpemF0aW9uIiwiVmlzdWFsaXphdGlvblR5cGUiLCJUYWJsZSIsInJlbW92ZUR1cGxpY2F0ZUFjdGlvbnMiLCJKU09OIiwic3RyaW5naWZ5IiwiaGVhZGVySW5mb1RpdGxlIiwiaGVhZGVyVmlzaWJsZSIsImV2ZW50cyIsInBhdGNoU2VudCIsImdldFRlbXBsYXRlVHlwZSIsIlRlbXBsYXRlVHlwZSIsIkxpc3RSZXBvcnQiLCJjcmVhdGVEZWZhdWx0VGFibGVWaXN1YWxpemF0aW9uIiwiaXNCbGFua1RhYmxlIiwiZ2V0Q29sdW1uc0Zyb21FbnRpdHlUeXBlIiwiZ2V0RW50aXR5VHlwZSIsImNyZWF0aW9uTW9kZSIsIkFjdGlvbkhlbHBlciIsImdldEN1cnJlbnRFbnRpdHlTZXRVcGRhdGFibGVQYXRoIiwiX2VudGl0eVNldCRhbm5vdGF0aW9uIiwiX2VudGl0eVNldCRhbm5vdGF0aW9uMiIsInJlc3RyaWN0aW9ucyIsImdldFJlc3RyaWN0aW9ucyIsImVudGl0eVNldCIsInVwZGF0YWJsZSIsImlzVXBkYXRhYmxlIiwiaXNPbmx5RHluYW1pY09uQ3VycmVudEVudGl0eSIsImlzQ29uc3RhbnQiLCJleHByZXNzaW9uIiwibmF2aWdhdGlvbkV4cHJlc3Npb24iLCJfdHlwZSIsInVwZGF0YWJsZUV4cHJlc3Npb24iLCJ1cGRhdGFibGVQcm9wZXJ0eVBhdGgiLCJwcm9wZXJ0aWVzIiwiYWN0aW9uTmFtZSIsInByb3BlcnR5TmFtZSIsInNpemUiLCJfZW50aXR5VHlwZSRhbm5vdGF0aW82IiwiX2VudGl0eVR5cGUkYW5ub3RhdGlvNyIsIl9lbnRpdHlUeXBlJGFubm90YXRpbzgiLCJfZW50aXR5VHlwZSRhbm5vdGF0aW85IiwiX2VudGl0eVR5cGUkYW5ub3RhdGlvMTAiLCJ0aXRsZVByb3BlcnR5IiwiQXJyYXkiLCJmcm9tIiwiam9pbiIsImdldFVJSGlkZGVuRXhwRm9yQWN0aW9uc1JlcXVpcmluZ0NvbnRleHQiLCJjdXJyZW50RW50aXR5VHlwZSIsImNvbnRleHREYXRhTW9kZWxPYmplY3RQYXRoIiwiYVVpSGlkZGVuUGF0aEV4cHJlc3Npb25zIiwiZGF0YUZpZWxkIiwiX2RhdGFGaWVsZCRBY3Rpb25UYXJnIiwiX2RhdGFGaWVsZCRJbmxpbmUiLCJBY3Rpb25UYXJnZXQiLCJpc0JvdW5kIiwic291cmNlRW50aXR5VHlwZSIsIlJlcXVpcmVzQ29udGV4dCIsInZhbHVlT2YiLCJfZGF0YUZpZWxkJGFubm90YXRpb24iLCJfZGF0YUZpZWxkJGFubm90YXRpb24yIiwiX2RhdGFGaWVsZCRhbm5vdGF0aW9uMyIsIkhpZGRlbiIsImVxdWFsIiwiZ2V0SGlkZGVuRXhwcmVzc2lvbkF0VGFibGVMZXZlbCIsImdldFBhdGhGcm9tQWN0aW9uQW5ub3RhdGlvbiIsInNvdXJjZSIsIl9zb3VyY2UkYW5ub3RhdGlvbnMiLCJfc291cmNlJGFubm90YXRpb25zJFUiLCJjb25zdGFudCIsInN1YnN0cmluZyIsInNwbGl0UGF0aEZvck5hdmlnYXRpb25Qcm9wZXJ0eSIsIm5hdmlnYXRpb25QYXRoIiwiaXNOYXZpZ2F0aW9uUHJvcGVydHkiLCJ0YXJnZXRPYmplY3QiLCJwYXJ0bmVyIiwicGF0aEluTW9kZWwiLCJzbGljZSIsInVwZGF0ZU1hbmlmZXN0QWN0aW9uQW5kVGFnSXQiLCJkYXRhRmllbGRJZCIsInNvbWUiLCJhY3Rpb25LZXkiLCJfQWN0aW9uVGFyZ2V0IiwicmVxdWlyZXNTZWxlY3Rpb24iLCJoYXNCb3VuZEFjdGlvbnNBbHdheXNWaXNpYmxlSW5Ub29sQmFyIiwiX2RhdGFGaWVsZCRJbmxpbmUyIiwiX2RhdGFGaWVsZCRhbm5vdGF0aW9uNCIsIl9kYXRhRmllbGQkYW5ub3RhdGlvbjUiLCJfZGF0YUZpZWxkJGFubm90YXRpb242IiwiX2RhdGFGaWVsZCRhbm5vdGF0aW9uNyIsIl9kYXRhRmllbGQkYW5ub3RhdGlvbjgiLCJfZGF0YUZpZWxkJGFubm90YXRpb245IiwiX2RhdGFGaWVsZCRBY3Rpb25UYXJnMiIsIm1hbmlmZXN0QWN0aW9uSWQiLCJnZW5lcmF0ZSIsIkFjdGlvbiIsIlNlbWFudGljT2JqZWN0IiwiaGFzQ3VzdG9tQWN0aW9uc0Fsd2F5c1Zpc2libGVJblRvb2xCYXIiLCJjdXN0b21BY3Rpb25zIiwicmVkdWNlIiwibWVudSIsIm1lbnVBY3Rpb24iLCJfYWN0aW9uJHZpc2libGUiLCJnZXRWaXNpYmxlRXhwRm9yQ3VzdG9tQWN0aW9uc1JlcXVpcmluZ0NvbnRleHQiLCJhVmlzaWJsZVBhdGhFeHByZXNzaW9ucyIsIl9hY3Rpb24kdmlzaWJsZTIiLCJyZXNvbHZlQmluZGluZ1N0cmluZyIsImdldENhcGFiaWxpdHlSZXN0cmljdGlvbiIsImlzRGVsZXRhYmxlIiwiaXNQYXRoRGVsZXRhYmxlIiwiaXNQYXRoVXBkYXRhYmxlIiwiZ2V0U2VsZWN0aW9uTW9kZSIsImlzRW50aXR5U2V0IiwidGFyZ2V0Q2FwYWJpbGl0aWVzIiwiZGVsZXRlQnV0dG9uVmlzaWJpbGl0eUV4cHJlc3Npb24iLCJfdGFibGVNYW5pZmVzdFNldHRpbmciLCJtYXNzRWRpdFZpc2liaWxpdHlFeHByZXNzaW9uIiwiYXJndW1lbnRzIiwiY3V0QnV0dG9uVmlzaWJpbGl0eUV4cHJlc3Npb24iLCJ0YWJsZU1hbmlmZXN0U2V0dGluZ3MiLCJzZWxlY3Rpb25Nb2RlIiwidGFibGVTZXR0aW5ncyIsIlNlbGVjdGlvbk1vZGUiLCJOb25lIiwiRm9yY2VNdWx0aSIsIk11bHRpIiwiRm9yY2VTaW5nbGUiLCJTaW5nbGUiLCJhSGlkZGVuQmluZGluZ0V4cHJlc3Npb25zIiwiYVZpc2libGVCaW5kaW5nRXhwcmVzc2lvbnMiLCJpc1BhcmVudERlbGV0YWJsZSIsInBhcmVudEVudGl0eVNldERlbGV0YWJsZSIsIk9iamVjdFBhZ2UiLCJjb21waWxlRXhwcmVzc2lvbiIsImJNYXNzRWRpdEVuYWJsZWQiLCJBdXRvIiwiYnV0dG9uVmlzaWJpbGl0eUV4cHJlc3Npb24iLCJvciIsImlmRWxzZSIsImFuZCIsIklzRWRpdGFibGUiLCJlZGl0TW9kZWJ1dHRvblZpc2liaWxpdHlFeHByZXNzaW9uIiwiY29uY2F0IiwiY29weURhdGFGaWVsZCIsImdldENvcHlBY3Rpb24iLCJkYXRhRmllbGRJc0NvcHlBY3Rpb24iLCJzRW50aXR5VHlwZSIsImZ1bGx5UXVhbGlmaWVkTmFtZSIsInZpc2libGVFeHByZXNzaW9uIiwiX2RhdGFGaWVsZCRhbm5vdGF0aW9uMTAiLCJfZGF0YUZpZWxkJGFubm90YXRpb24xMSIsIm5vdCIsImdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbiIsImdldFJlbGF0aXZlTW9kZWxQYXRoRnVuY3Rpb24iLCJ2aXNpYmxlRm9yQ29udGV4dE1lbnVFeHByZXNzaW9uIiwiX2NvcHlEYXRhRmllbGQkTGFiZWwiLCJhbm5vdGF0aW9uUGF0aCIsImdldEVudGl0eVNldEJhc2VkQW5ub3RhdGlvblBhdGgiLCJLZXlIZWxwZXIiLCJnZW5lcmF0ZUtleUZyb21EYXRhRmllbGQiLCJ0ZXh0IiwiTGFiZWwiLCJMaWJyYXJ5IiwiZ2V0UmVzb3VyY2VCdW5kbGVGb3IiLCJnZXRUZXh0IiwiX2RhdGFGaWVsZCRJbmxpbmUzIiwiX2RhdGFGaWVsZCREZXRlcm1pbmluIiwiaXNEYXRhRmllbGRGb3JBY3Rpb25BYnN0cmFjdCIsInRhYmxlQWN0aW9uIiwiRGF0YUZpZWxkRm9yQWN0aW9uIiwiX3VzZUVuYWJsZWRFeHByZXNzaW9uIiwiZ2V0RW5hYmxlZEZvckFubm90YXRpb25BY3Rpb24iLCJEYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb24iLCJnZXRIaWdobGlnaHRSb3dCaW5kaW5nIiwiY3JpdGljYWxpdHlBbm5vdGF0aW9uIiwiaXNEcmFmdFJvb3RPck5vZGUiLCJ0YXJnZXRFbnRpdHlUeXBlIiwiZGVmYXVsdEhpZ2hsaWdodFJvd0RlZmluaXRpb24iLCJNZXNzYWdlVHlwZSIsImdldE1lc3NhZ2VUeXBlRnJvbUNyaXRpY2FsaXR5VHlwZSIsImZvcm1hdFJlc3VsdCIsIkVudGl0eSIsIkhhc0FjdGl2ZSIsIklzQWN0aXZlIiwidGFibGVGb3JtYXR0ZXJzIiwicm93SGlnaGxpZ2h0aW5nIiwiX2dldENyZWF0aW9uQmVoYXZpb3VyIiwidGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24iLCJfbmV3QWN0aW9uMiIsIm5hdmlnYXRpb24iLCJkZXRhaWwiLCJvcmlnaW5hbFRhYmxlU2V0dGluZ3MiLCJvdXRib3VuZCIsIm91dGJvdW5kRGV0YWlsIiwiQ3JlYXRpb25Nb2RlIiwiTmV3UGFnZSIsIkV4dGVybmFsIiwiQ3JlYXRpb25EaWFsb2ciLCJMb2ciLCJ3YXJuaW5nIiwibmV3QWN0aW9uIiwiX2NvbnZlcnRlckNvbnRleHQkZ2V0MjAiLCJfdGFyZ2V0QW5ub3RhdGlvbnNDb20iLCJfdGFyZ2V0QW5ub3RhdGlvbnNTZXMiLCJ0YXJnZXRBbm5vdGF0aW9ucyIsInRhcmdldEFubm90YXRpb25zQ29tbW9uIiwidGFyZ2V0QW5ub3RhdGlvbnNTZXNzaW9uIiwiU2Vzc2lvbiIsIkRyYWZ0Um9vdCIsIk5ld0FjdGlvbiIsIlN0aWNreVNlc3Npb25TdXBwb3J0ZWQiLCJDcmVhdGlvblJvdyIsIkVycm9yIiwicm91dGUiLCJfbmV3QWN0aW9uIiwiYXBwZW5kIiwiY3JlYXRlQXRFbmQiLCJuYXZpZ2F0ZVRvVGFyZ2V0IiwiZXJyb3IiLCJfb3JpZ2luYWxUYWJsZVNldHRpbmciLCJpbmZvIiwiX2dldFJvd0NvbmZpZ3VyYXRpb25Qcm9wZXJ0eSIsInRhcmdldFBhdGgiLCJ0YWJsZVR5cGUiLCJwcmVzc1Byb3BlcnR5Iiwib3BlbkluTmV3VGFiUHJlc3NQcm9wZXJ0eSIsIm5hdmlnYXRpb25UYXJnZXQiLCJjcml0aWNhbGl0eVByb3BlcnR5IiwiX25hdmlnYXRpb25TZXR0aW5ncyRkIiwiX25hdmlnYXRpb25TZXR0aW5ncyRkMiIsIl9saW5lSXRlbUFubm90YXRpb24kYSIsIl9saW5lSXRlbUFubm90YXRpb24kYTIiLCJfbmF2aWdhdGlvblNldHRpbmdzJGQzIiwiZGlzcGxheSIsInRhcmdldCIsIkNyaXRpY2FsaXR5IiwiZ2V0RHJhZnRSb290IiwiZ2V0RHJhZnROb2RlIiwiZWRpdGFibGUiLCJyZWNyZWF0ZUNvbnRleHQiLCJyb3dOYXZpZ2F0ZWRFeHByZXNzaW9uIiwibmF2aWdhdGVkUm93IiwicHJlc3MiLCJvcGVuSW5OZXdUYWJQcmVzcyIsInJvd05hdmlnYXRlZCIsIklzSW5hY3RpdmUiLCJjb2x1bW5zVG9CZUNyZWF0ZWQiLCJ0YWJsZUNyZWF0aW9uTW9kZSIsImRpc3BsYXlNb2RlT2ZEZXNjcmlwdGlvblByb3BlcnRpZXNNYXAiLCJyZXN0cmljdGlvbnNPblByb3BlcnRpZXMiLCJwcm9wZXJ0aWVzTm90VG9CZUNvbnNpZGVyZWQiLCJncm91cGFibGVQcm9wZXJ0aWVzIiwiZ2V0R3JvdXBhYmxlUHJvcGVydGllcyIsImdldEFzc29jaWF0ZWRUZXh0UHJvcGVydHkiLCJ0ZXh0UHJvcCIsImV4aXN0cyIsInRhcmdldFR5cGUiLCJyZWxhdGVkUHJvcGVydGllc0luZm8iLCJjb2xsZWN0UmVsYXRlZFByb3BlcnRpZXMiLCJyZWxhdGVkUHJvcGVydHlOYW1lcyIsImFkZGl0aW9uYWxQcm9wZXJ0eU5hbWVzIiwiYWRkUHJvcGVydHlUb0Rpc3BsYXlNb2RlT2ZEZXNjcmlwdGlvblByb3BlcnRpZXNNYXAiLCJjb2x1bW5JbmZvIiwiZ2V0Q29sdW1uRGVmaW5pdGlvbkZyb21Qcm9wZXJ0eSIsImRhdGFQb2ludFRhcmdldFZhbHVlIiwiZXhwb3J0RGF0YVBvaW50VGFyZ2V0VmFsdWUiLCJhbm5vdGF0aW9uUHJvcGVydHkiLCJ1cGRhdGVQcm9wZXJ0eUxhYmVsIiwiYWRkaXRpb25hbFByb3BlcnR5SW5mb3MiLCJhZGRpdGlvbmFsUHJvcGVydHlOYW1lIiwiX3Byb3BlcnR5JGFubm90YXRpb25zMTAiLCJfcHJvcGVydHkkYW5ub3RhdGlvbnMxMSIsIm5vblNvcnRhYmxlUHJvcGVydGllcyIsInJlbGF0ZWRDb2x1bW5zIiwiX2NyZWF0ZVJlbGF0ZWRDb2x1bW5zIiwiZnVsbFByb3BlcnR5UGF0aCIsInVzZURhdGFGaWVsZFByZWZpeCIsImF2YWlsYWJsZUZvckFkYXB0YXRpb24iLCJfcHJvcGVydHkkYW5ub3RhdGlvbnMxMiIsIl9wcm9wZXJ0eSRhbm5vdGF0aW9uczEzIiwicmVwbGFjZVNwZWNpYWxDaGFycyIsInNlbWFudGljT2JqZWN0QW5ub3RhdGlvblBhdGgiLCJnZXRTZW1hbnRpY09iamVjdFBhdGgiLCJpc0hpZGRlbiIsImlzUmVmZXJlbmNlUHJvcGVydHlTdGF0aWNhbGx5SGlkZGVuIiwiZ3JvdXBQYXRoIiwiX3NsaWNlQXRTbGFzaCIsImlzR3JvdXAiLCJsYWJlbCIsImdldExhYmVsIiwiZGF0YVR5cGUiLCJnZXREYXRhRmllbGREYXRhVHlwZSIsInByb3BlcnR5VHlwZUNvbmZpZyIsImdldFR5cGVDb25maWciLCJpc0FQcm9wZXJ0eUZyb21UZXh0T25seUFubm90YXRpb24iLCJzb3J0YWJsZSIsImZpbHRlcmFibGUiLCJub25GaWx0ZXJhYmxlUHJvcGVydGllcyIsInR5cGVDb25maWciLCJjbGFzc05hbWUiLCJjb25zdHJhaW50cyIsIl9pc0V4cG9ydGFibGVDb2x1bW4iLCJjcmVhdGVDb2x1bW5FeHBvcnRTZXR0aW5ncyIsImNvbGxlY3RlZE5hdmlnYXRpb25Qcm9wZXJ0eUxhYmVscyIsIl9nZXRDb2xsZWN0ZWROYXZpZ2F0aW9uUHJvcGVydHlMYWJlbHMiLCJBbm5vdGF0aW9uIiwiZ3JvdXBMYWJlbCIsImdyb3VwIiwic2VtYW50aWNPYmplY3RQYXRoIiwiaXNHcm91cGFibGUiLCJpc0tleSIsImNhc2VTZW5zaXRpdmUiLCJpc0ZpbHRlcmluZ0Nhc2VTZW5zaXRpdmUiLCJnZXRJbXBvcnRhbmNlIiwiRGF0YUZpZWxkRGVmYXVsdCIsInJlcXVpcmVkIiwiaXNSZXF1aXJlZENvbHVtbiIsImFkZGl0aW9uYWxMYWJlbHMiLCJfYWRkVG9vbFRpcCIsIl9zZXRFeHBvcnRTZXR0aW5nc0ZvckRhdGFQb2ludCIsImVuaGFuY2VkQ29sdW1uIiwiZXh0ZW5zaW9uIiwidGVjaG5pY2FsbHlBZ2dyZWdhdGFibGUiLCJ0ZWNobmljYWxseUdyb3VwYWJsZSIsIl9yZWxhdGVkUHJvcGVydGllc0luZiIsIl91bml0UHJvcGVydHkiLCJfY3VycmVuY3lQcm9wZXJ0eSIsIl9yZWxhdGVkUHJvcGVydGllc0luZjIiLCJfdGltZXpvbmVQcm9wZXJ0eSIsIl9yZWxhdGVkUHJvcGVydGllc0luZjMiLCJfdGltZXpvbmVUZXh0IiwidXRjIiwiaXNBVGltZXpvbmUiLCJjdXJyZW5jeVByb3BlcnR5Iiwic2NhbGUiLCJpc1Byb3BlcnR5IiwiZ2V0U3RhdGljVW5pdE9yQ3VycmVuY3kiLCJnZXRTdGF0aWNUaW1lem9uZSIsImlzVGltZXpvbmUiLCJleHBvcnRUeXBlIiwiZ2V0RXhwb3J0RGF0YVR5cGUiLCJpbnB1dEZvcm1hdCIsImdldERhdGVJbnB1dEZvcm1hdCIsImRlbGltaXRlciIsImdldERlbGltaXRlciIsInRlbXBsYXRlIiwid3JhcCIsImF1dG9TY2FsZSIsInJlbW92ZVVuZGVmaW5lZEZyb21FeHBvcnRTZXR0aW5ncyIsInNldHRpbmciLCJfbGlua2VkQW5ub3RhdGlvbkNvbHUiLCJsaW5rZWRBbm5vdGF0aW9uQ29sdW1ucyIsImNvbCIsIl9jb2wkcHJvcGVydHlJbmZvcyIsInRvb2x0aXAiLCJfYW5ub3RhdGlvbnMkVUkiLCJwcm9wZXJ0eVR5cGUiLCJkYXRhRmllbGREZWZhdWx0UHJvcGVydHkiLCJfVGFyZ2V0IiwiX1RhcmdldCQkdGFyZ2V0IiwiX1ZhbHVlIiwiX1ZhbHVlJCR0YXJnZXQiLCJfVmFsdWUkJHRhcmdldCRhbm5vdGEiLCJfVmFsdWUkJHRhcmdldCRhbm5vdGEyIiwiX1ZhbHVlJCR0YXJnZXQkYW5ub3RhMyIsIl9WYWx1ZTIiLCJfVmFsdWUyJCR0YXJnZXQiLCJfVmFsdWUyJCR0YXJnZXQkYW5ub3QiLCJfVmFsdWUyJCR0YXJnZXQkYW5ub3QyIiwiVGFyZ2V0IiwiX1RhcmdldDIiLCJfVGFyZ2V0MiQkdGFyZ2V0IiwiTWVkaWFUeXBlIiwidGVybSIsImlzVVJMIiwiX2lzVmFsaWRDb2x1bW4iLCJfZ2V0VmlzaWJsZUV4cHJlc3Npb24iLCJkYXRhRmllbGRNb2RlbFBhdGgiLCJfdGFyZ2V0T2JqZWN0JFRhcmdldCIsIl90YXJnZXRPYmplY3QkVGFyZ2V0JCIsIl90YXJnZXRPYmplY3QkYW5ub3RhdCIsIl90YXJnZXRPYmplY3QkYW5ub3RhdDIiLCJfcHJvcGVydHlWYWx1ZSRhbm5vdGEiLCJfcHJvcGVydHlWYWx1ZSRhbm5vdGEyIiwicHJvcGVydHlWYWx1ZSIsIl90YXJnZXRPYmplY3QkVGFyZ2V0JDIiLCJpc0FuYWx5dGljYWxHcm91cEhlYWRlckV4cGFuZGVkIiwiaXNBbmFseXRpY2FsTGVhZiIsIl9nZXRGaWVsZEdyb3VwSGlkZGVuRXhwcmVzc2lvbnMiLCJkYXRhRmllbGRHcm91cCIsIl9kYXRhRmllbGRHcm91cCRUYXJnZSIsIl9kYXRhRmllbGRHcm91cCRUYXJnZTIiLCJmaWVsZEdyb3VwSGlkZGVuRXhwcmVzc2lvbnMiLCJfZGF0YUZpZWxkR3JvdXAkYW5ub3QiLCJfZGF0YUZpZWxkR3JvdXAkYW5ub3QyIiwiX2RhdGFGaWVsZEdyb3VwJFRhcmdlMyIsIkRhdGEiLCJpbm5lckRhdGFGaWVsZCIsIl9hbm5vdGF0aW9ucyIsIl9hbm5vdGF0aW9ucyRVSTIiLCJfcHJvcGVydHkkYW5ub3RhdGlvbnMxNCIsIl9wcm9wZXJ0eSRhbm5vdGF0aW9uczE1IiwiZGF0YUZpZWxkRGVmYXVsdCIsIl9kYXRhRmllbGREZWZhdWx0JExhYiIsImlzRGF0YUZpZWxkVHlwZXMiLCJfcHJvcGVydHkkTGFiZWwyIiwiX3Byb3BlcnR5JFZhbHVlIiwiX3Byb3BlcnR5JFZhbHVlJCR0YXJnIiwiX3Byb3BlcnR5JFZhbHVlJCR0YXJnMiIsIl9wcm9wZXJ0eSRWYWx1ZSQkdGFyZzMiLCJfcHJvcGVydHkkVmFsdWUyIiwiX3Byb3BlcnR5JFZhbHVlMiQkdGFyIiwiX3Byb3BlcnR5JExhYmVsIiwiX3Byb3BlcnR5JExhYmVsMyIsIl9wcm9wZXJ0eSRUYXJnZXQiLCJfcHJvcGVydHkkVGFyZ2V0JCR0YXIiLCJfcHJvcGVydHkkVGFyZ2V0JCR0YXIyIiwiX3Byb3BlcnR5JFRhcmdldCQkdGFyMyIsIl9wcm9wZXJ0eSRUYXJnZXQkJHRhcjQiLCJfcHJvcGVydHkkVGFyZ2V0JCR0YXI1IiwiX3Byb3BlcnR5JFRhcmdldCQkdGFyNiIsIl9wcm9wZXJ0eSRMYWJlbDQiLCJfZ2V0VG9vbHRpcCIsIl9zb3VyY2UkYW5ub3RhdGlvbnMyIiwiX3NvdXJjZSRhbm5vdGF0aW9uczIkIiwiUXVpY2tJbmZvIiwiX3NvdXJjZSRhbm5vdGF0aW9uczMiLCJfc291cmNlJGFubm90YXRpb25zMyQiLCJfc291cmNlJFZhbHVlIiwiX3NvdXJjZSRWYWx1ZSQkdGFyZ2V0IiwiX3NvdXJjZSRWYWx1ZSQkdGFyZ2V0MiIsIl9zb3VyY2UkVmFsdWUkJHRhcmdldDMiLCJfc291cmNlJFRhcmdldCIsIl9kYXRhcG9pbnRUYXJnZXQkVmFsdSIsIl9kYXRhcG9pbnRUYXJnZXQkVmFsdTIiLCJfZGF0YXBvaW50VGFyZ2V0JFZhbHUzIiwiX2RhdGFwb2ludFRhcmdldCRWYWx1NCIsImRhdGFwb2ludFRhcmdldCIsImdldFJvd1N0YXR1c1Zpc2liaWxpdHkiLCJjb2xOYW1lIiwiaXNTZW1hbnRpY0tleUluRmllbGRHcm91cCIsImdldEVycm9yU3RhdHVzVGV4dFZpc2liaWxpdHlGb3JtYXR0ZXIiLCJleGlzdGluZ0NvbHVtbnMiLCJyZWxhdGVkUHJvcGVydHlOYW1lTWFwIiwiZ2V0QWJzb2x1dGVBbm5vdGF0aW9uUGF0aCIsInJlbGF0ZWRDb2x1bW4iLCJjb21wdXRlSGlkZGVuT25SZWxhdGVkQ29sdW1ucyIsIm5ld05hbWUiLCJfY29sdW1uJHByb3BlcnR5SW5mb3MiLCJfY29sdW1uJHByb3BlcnR5SW5mb3MyIiwiX2NvbHVtbiRhZGRpdGlvbmFsUHJvIiwicHJvcGVydHlJbmZvIiwiX2dldEFubm90YXRpb25Db2x1bW5OYW1lIiwiX2RhdGFGaWVsZCRWYWx1ZSIsIl9kYXRhRmllbGQkVGFyZ2V0IiwiX2RhdGFGaWVsZCRUYXJnZXQkJHRhIiwiX2RhdGFGaWVsZCRUYXJnZXQkJHRhMiIsIl9kYXRhRmllbGQkVmFsdWUyIiwiX2RhdGFGaWVsZCRUYXJnZXQyIiwiX2RhdGFGaWVsZCRUYXJnZXQyJCR0IiwiY3JlYXRlVGVjaG5pY2FsUHJvcGVydHkiLCJyZWxhdGVkQWRkaXRpb25hbFByb3BlcnR5TmFtZU1hcCIsImNvbHVtbkV4aXN0cyIsImFkZGl0aW9uYWxQcm9wZXJ0eSIsInRlY2huaWNhbENvbHVtbiIsImFnZ3JlZ2F0YWJsZSIsIl9nZXRTaG93RGF0YUZpZWxkc0xhYmVsIiwiZmllbGRHcm91cE5hbWUiLCJfY29udmVydGVyQ29udGV4dCRnZXQyMSIsImNvbHVtbktleXMiLCJzaG93RGF0YUZpZWxkc0xhYmVsIiwiX2dldFJlbGF0aXZlUGF0aCIsIl9WYWx1ZTMiLCJfZGF0YUZpZWxkJFRhcmdldDMiLCJpc0xhc3RTbGFzaCIsImlzTGFzdFBhcnQiLCJpU2xhc2hJbmRleCIsImxhc3RJbmRleE9mIiwiX2lzQ29sdW1uTXVsdGlWYWx1ZWQiLCJwcm9wZXJ0eU9iamVjdFBhdGgiLCJlbmhhbmNlRGF0YU1vZGVsUGF0aCIsImlzTXVsdGlWYWx1ZUZpZWxkIiwiX2lzQ29sdW1uU29ydGFibGUiLCJub25Tb3J0YWJsZUNvbHVtbnMiLCJmaWx0ZXJGdW5jdGlvbnMiLCJfZ2V0RmlsdGVyRnVuY3Rpb25zIiwiaXNBcnJheSIsIkNvbnZlcnRlckNvbnRleHQiLCJUeXBlR3VhcmRzIiwiX2VudGl0eVNldCRhbm5vdGF0aW9uMyIsIl9Db252ZXJ0ZXJDb250ZXh0JGdldCIsIkZpbHRlckZ1bmN0aW9ucyIsImdldEVudGl0eUNvbnRhaW5lciIsIl9nZXREZWZhdWx0Rm9ybWF0T3B0aW9uc0ZvclRhYmxlIiwidGV4dExpbmVzRWRpdCIsIl9maW5kU2VtYW50aWNLZXlWYWx1ZXMiLCJhU2VtYW50aWNLZXlWYWx1ZXMiLCJiU2VtYW50aWNLZXlGb3VuZCIsImkiLCJzZW1hbnRpY0tleUZvdW5kIiwiX2ZpbmRQcm9wZXJ0aWVzIiwic2VtYW50aWNLZXlWYWx1ZXMiLCJmaWVsZEdyb3VwUHJvcGVydGllcyIsInNlbWFudGljS2V5SGFzUHJvcGVydHlJbkZpZWxkR3JvdXAiLCJzUHJvcGVydHlQYXRoIiwidG1wIiwiZmllbGRHcm91cFByb3BlcnR5UGF0aCIsIl9maW5kU2VtYW50aWNLZXlWYWx1ZXNJbkZpZWxkR3JvdXAiLCJfZGF0YUZpZWxkR3JvdXAkVGFyZ2U0IiwiX2RhdGFGaWVsZEdyb3VwJFRhcmdlNSIsImFQcm9wZXJ0aWVzIiwiX3Byb3BlcnRpZXNGb3VuZCIsIl9kYXRhRmllbGRHcm91cCRUYXJnZTYiLCJnZXREZWZhdWx0RHJhZnRJbmRpY2F0b3JGb3JDb2x1bW4iLCJzZW1hbnRpY0tleUluRmllbGRHcm91cCIsImZpZWxkR3JvdXBEcmFmdEluZGljYXRvclByb3BlcnR5UGF0aCIsInNob3dFcnJvck9iamVjdFN0YXR1cyIsImhhc0RyYWZ0SW5kaWNhdG9yIiwiX2dldEltcE51bWJlciIsIl9kYXRhRmllbGQkYW5ub3RhdGlvbjEyIiwiX2RhdGFGaWVsZCRhbm5vdGF0aW9uMTMiLCJJbXBvcnRhbmNlIiwiX2dldERhdGFGaWVsZEltcG9ydGFuY2UiLCJfZGF0YUZpZWxkJGFubm90YXRpb24xNCIsIl9kYXRhRmllbGQkYW5ub3RhdGlvbjE1IiwiX2NvbHVtbiRleHBvcnRTZXR0aW5nIiwidGFyZ2V0VmFsdWVmcm9tRFAiLCJnZXRUYXJnZXRWYWx1ZU9uRGF0YVBvaW50IiwiaXNEYXRhUG9pbnRGcm9tRGF0YUZpZWxkRGVmYXVsdCIsIl9nZXRNYXhJbXBvcnRhbmNlIiwibWF4SW1wTnVtYmVyIiwiaW1wTnVtYmVyIiwiRGF0YUZpZWxkV2l0aE1heEltcG9ydGFuY2UiLCJfY29udmVydGVyQ29udGV4dCRnZXQyMiIsIl9WYWx1ZTQiLCJfVmFsdWU0JCR0YXJnZXQiLCJyZXF1aXJlZFByb3BlcnRpZXMiLCJnZXRSZXF1aXJlZFByb3BlcnRpZXMiLCJoaWdoS2V5cyIsIl9wcm9wZXJ0eVBhdGgkJHRhcmdldCIsImZpZWxkc1dpdGhJbXBvcnRhbmNlIiwiaXNBbm5vdGF0aW9uT2ZUeXBlIiwiZGF0YUZpZWxkVGFyZ2V0IiwiZmllbGRHcm91cERhdGEiLCJmaWVsZEdyb3VwRGF0YUZpZWxkIiwiX2ZpZWxkR3JvdXBEYXRhRmllbGQkIiwiX2ZpZWxkR3JvdXBEYXRhRmllbGQkMiIsIkhpZ2giLCJfZGF0YUZpZWxkJGFubm90YXRpb24xNiIsIl9kYXRhRmllbGQkYW5ub3RhdGlvbjE3IiwiaXRlbSIsIl9pdGVtJGFubm90YXRpb25zIiwiX2l0ZW0kYW5ub3RhdGlvbnMkVUkiLCJfY29udmVydGVyQ29udGV4dCRnZXQyMyIsIl9jb252ZXJ0ZXJDb250ZXh0JGdldDI0IiwiX2NvbnZlcnRlckNvbnRleHQkZ2V0MjUiLCJfdGFibGVNYW5pZmVzdFNldHRpbmcyIiwiX3RhYmxlTWFuaWZlc3RTZXR0aW5nMyIsImdldFJlc3RyaWN0aW9uc09uUHJvcGVydGllcyIsImdldFRhYmxlVHlwZSIsImRlZmF1bHRDcmVhdGlvbk1vZGUiLCJnZXRTYXBGZU1hbmlmZXN0Q29uZmlndXJhdGlvbiIsIm1hY3JvcyIsInRhYmxlIiwiSW5saW5lQ3JlYXRpb25Sb3dzIiwiZ2V0QW5ub3RhdGlvbnNCeVRlcm0iLCJ0YWJsZUNvbnZlcnRlckNvbnRleHQiLCJnZXRDb252ZXJ0ZXJDb250ZXh0Rm9yIiwiZ2V0VGFyZ2V0T2JqZWN0UGF0aCIsIl9kYXRhRmllbGQkVmFsdWUzIiwiX2RhdGFGaWVsZCRWYWx1ZTMkJHRhIiwiX2RhdGFGaWVsZCRUYXJnZXQ0IiwiX2RhdGFGaWVsZCRUYXJnZXQ0JCR0IiwiX3Byb3BlcnR5VHlwZUNvbmZpZyIsIl9wcm9wZXJ0eVR5cGVDb25maWcyIiwiX2RhdGFGaWVsZCRhbm5vdGF0aW9uMTgiLCJfZGF0YUZpZWxkJGFubm90YXRpb24xOSIsIl9kYXRhRmllbGQkYW5ub3RhdGlvbjIwIiwiX2RhdGFGaWVsZCRhbm5vdGF0aW9uMjEiLCJfZXhwb3J0U2V0dGluZ3MiLCJjb2xsZWN0UmVsYXRlZFByb3BlcnRpZXNSZWN1cnNpdmVseSIsInNMYWJlbCIsImlzRmllbGRHcm91cENvbHVtbiIsInByb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aCIsIm5hdmlnYXRpb25Qcm9wZXJ0aWVzIiwic2l0dWF0aW9uc05hdlByb3BzIiwibmF2aWdhdGlvblByb3BlcnR5IiwiX25hdmlnYXRpb25Qcm9wZXJ0eSR0IiwiX25hdmlnYXRpb25Qcm9wZXJ0eSR0MiIsImlzQ29sbGVjdGlvbiIsIlNBUE9iamVjdE5vZGVUeXBlIiwiTmFtZSIsInNpdHVhdGlvbnNOYXZQcm9wIiwiaGFzU2l0dWF0aW9uc0luZGljYXRvciIsImlzTXVsdGlWYWx1ZSIsInZpc3VhbFNldHRpbmdzIiwid2lkdGhDYWxjdWxhdGlvbiIsIkZpZWxkR3JvdXBIaWRkZW5FeHByZXNzaW9ucyIsIkhUTUw1IiwiQ3NzRGVmYXVsdHMiLCJpc1BhcnRPZkxpbmVJdGVtIiwicmVsYXRlZFByb3BlcnR5TmFtZSIsImRpc3BsYXlNb2RlT2ZQcm9wZXJ0eVVzZWRBc0Rlc2NyaXB0aW9uIiwiY3JlYXRlUHJvcGVydHlBbm5vdGF0ZWRUZXh0T25seSIsIl9nZXRQcm9wZXJ0eU5hbWVzIiwibWF0Y2hlZFByb3BlcnRpZXMiLCJpc1JlcXVpcmVkRmllbGRHcm91cCIsImZpZWxkR3JvdXAiLCJfaXRlbSRWYWx1ZSIsImlzRGF0YUZpZWxkIiwiaXNTdGF0aWNhbGx5TWFuZGF0b3J5IiwiaXNBbm5vdGF0ZWRSZXF1aXJlZFByb3BlcnR5IiwiaXNSZXF1aXJlZERhdGFGaWVsZEZvckFubm90YXRpb24iLCJkYXRhRmllbGRGb3JBbm5vdGF0aW9uIiwiRGF0YUZpZWxkRm9yQW5ub3RhdGlvbkZpZWxkQ29udHJvbE5vdE1hbmRhdG9yeSIsImhhc0ZpZWxkQ29udHJvbE5vdE1hbmRhdG9yeSIsImhhc0ZpZWxkR3JvdXBUYXJnZXQiLCJoYXNEYXRhUG9pbnRUYXJnZXQiLCJWaXN1YWxpemF0aW9uIiwiaXNSZXF1aXJlZERhdGFQb2ludCIsImlzUmVxdWlyZWRQcm9wZXJ0eSIsImlzUmF0aW5nVmlzdWFsaXphdGlvbkZyb21EYXRhRmllbGREZWZhdWx0IiwiZGF0YVBvaW50IiwiX3RhcmdldCRWYWx1ZSIsIl90YXJnZXQkVmFsdWUkJHRhcmdldCIsIkFuYWx5dGljYWxMaXN0UGFnZSIsImlzRGF0YUZpZWxkRm9yQW5ub3RhdGlvbiIsIl9hcHBlbmRDdXN0b21UZW1wbGF0ZSIsImV4cG9ydFByb3BlcnRpZXMiLCJpbnRlcm5hbENvbHVtbnMiLCJpc0Fubm90YXRpb25Db2x1bW4iLCJpc1Nsb3RDb2x1bW4iLCJtYW5pZmVzdENvbHVtbiIsIlNsb3QiLCJpc0N1c3RvbUNvbHVtbiIsIl91cGRhdGVMaW5rZWRQcm9wZXJ0aWVzT25DdXN0b21Db2x1bW5zIiwiYW5ub3RhdGlvblRhYmxlQ29sdW1ucyIsInJlcGxhY2UiLCJfbWFuaWZlc3RDb2x1bW4kcG9zaXQiLCJ2YWxpZGF0ZUtleSIsImJhc2VUYWJsZUNvbHVtbiIsIkFmdGVyIiwicHJvcGVydGllc1RvT3ZlcndyaXRlQW5ub3RhdGlvbkNvbHVtbiIsImlzQWN0aW9uTmF2aWdhYmxlIiwiZ2V0Q3VzdG9tRXhwb3J0U2V0dGluZ3MiLCJ0b29sdGlwVGV4dCIsImZldGNoVGV4dEZyb21NZXRhTW9kZWwiLCJoZWFkZXJUZXh0IiwiY3VzdG9tQ29sdW1uRXhwb3J0U2V0dGluZ3MiLCJiYXNlTWFuaWZlc3RDb2x1bW4iLCJIb3Jpem9udGFsQWxpZ24iLCJCZWdpbiIsImlkIiwiY3VzdG9tVGFibGVDb2x1bW4iLCJfSXNzdWVDYXRlZ29yeVR5cGUkQW4iLCJtZXNzYWdlIiwiZ2V0RGlhZ25vc3RpY3MiLCJhZGRJc3N1ZSIsIklzc3VlQ2F0ZWdvcnkiLCJNYW5pZmVzdCIsIklzc3VlU2V2ZXJpdHkiLCJMb3ciLCJJc3N1ZUNhdGVnb3J5VHlwZSIsIkFubm90YXRpb25Db2x1bW5zIiwiSW52YWxpZEtleSIsImFkZFJlZmVyZW5jZXNGb3JEcmFmdEluZGljYXRvckNvbHVtbiIsImRyYWZ0SW5kaWNhdG9yQ29sdW1uIiwiY3JlYXRlUmVsYXRlZENvbHVtbiIsIm5ld0NvbHVtbiIsImRyYWZ0QWRtaW5EYXRhUHJvcGVydGllcyIsImNvbHVtbldpdGhTaXR1YXRpb25zSW5kaWNhdG9yIiwiX2NvbHVtbiRmb3JtYXRPcHRpb25zIiwiX2NvbHVtbiRmb3JtYXRPcHRpb25zMiIsInNpdHVhdGlvbnNJbmRpY2F0b3JDb2x1bW4iLCJwcm9wZXJ0eUtleSIsImlzU2l0dWF0aW9uc0luZGljYXRvciIsIkNvbXB1dGVkIiwiY2xpcGJvYXJkU2V0dGluZ3MiLCJpbmRleE9mRmlyc3RWaXNpYmxlQ29sdW1uIiwiZmluZEluZGV4Iiwic3BsaWNlIiwiY29sdW1uc1dpdGhEcmFmdEluZGljYXRvciIsIl9jb2x1bW4kZm9ybWF0T3B0aW9uczMiLCJpc0RyYWZ0Tm9kZSIsImlzRHJhZnRSb290IiwiY29sdW1uV2l0aERyYWZ0SW5kaWNhdG9yIiwiaXNEcmFmdEluZGljYXRvciIsImNvbHVtbkluZGV4VG9JbnNlcnRBZnRlciIsImdldFAxM25Nb2RlIiwiX3RhYmxlTWFuaWZlc3RTZXR0aW5nNCIsInZhcmlhbnRNYW5hZ2VtZW50IiwiZ2V0VmFyaWFudE1hbmFnZW1lbnQiLCJtb2RlcyIsImlzQW5hbHl0aWNhbFRhYmxlIiwiaXNSZXNwb25zaXZlVGFibGUiLCJwZXJzb25hbGl6YXRpb24iLCJzb3J0IiwiYWdncmVnYXRlIiwiVmFyaWFudE1hbmFnZW1lbnRUeXBlIiwiQ29udHJvbCIsIl9pc0ZpbHRlckJhckhpZGRlbiIsImlzRmlsdGVyQmFySGlkZGVuIiwiaGFzTXVsdGlwbGVWaXN1YWxpemF0aW9ucyIsImdldFNvcnRDb25kaXRpb25zIiwic29ydENvbmRpdGlvbnMiLCJzb3J0ZXJzIiwiU29ydE9yZGVyIiwiY29uZGl0aW9uIiwiY29uZGl0aW9uUHJvcGVydHkiLCJQcm9wZXJ0eSIsImluZm9OYW1lIiwiY29udmVydFByb3BlcnR5UGF0aHNUb0luZm9OYW1lcyIsImRlc2NlbmRpbmciLCJEZXNjZW5kaW5nIiwiZ2V0SW5pdGlhbEV4cGFuc2lvbkxldmVsIiwiX3ByZXNlbnRhdGlvblZhcmlhbnRBMiIsImxldmVsIiwiSW5pdGlhbEV4cGFuc2lvbkxldmVsIiwicGF0aHMiLCJpbmZvTmFtZXMiLCJjdXJyZW50UGF0aCIsImdyb3VwTGV2ZWxzIiwiR3JvdXBCeSIsImFHcm91cEJ5IiwiX2NvbHVtbiRhZGRpdGlvbmFsUHJvMiIsImFnZ3JlZ2F0YWJsZVByb3BlcnR5TmFtZSIsImFnZ3JlZ2F0YWJsZVByb3BlcnR5RGVmaW5pdGlvbiIsImFkZGl0aW9uYWxQcm9wZXJ0eUluZm8iLCJfY29sdW1uJHByb3BlcnR5SW5mb3MzIiwiZ2V0Q29udGV4dFByb3BlcnR5UmVzdHJpY3Rpb24iLCJjYXBhYmlsaXRpZXMiLCJfSW5zZXJ0UmVzdHJpY3Rpb25zIiwiSW5zZXJ0UmVzdHJpY3Rpb25zIiwiUmVxdWlyZWRQcm9wZXJ0aWVzIiwiX3Byb3BlcnR5JCR0YXJnZXQiLCJleHRlbnNpb25JbmZvTWFwIiwiVG90YWwiLCJhVG90YWxzIiwiY3JlYXRpb25CZWhhdmlvdXIiLCJzdGFuZGFyZEFjdGlvbnNDb250ZXh0IiwiZ2VuZXJhdGVTdGFuZGFyZEFjdGlvbnNDb250ZXh0IiwiZ2V0Q3V0VmlzaWJpbGl0eSIsImdldERlbGV0ZVZpc2liaWxpdHkiLCJtYXNzRWRpdEJ1dHRvblZpc2liaWxpdHlFeHByZXNzaW9uIiwiZ2V0TWFzc0VkaXRWaXNpYmlsaXR5IiwiaXNJbnNlcnRVcGRhdGVBY3Rpb25zVGVtcGxhdGVkIiwiZ2V0SW5zZXJ0VXBkYXRlQWN0aW9uc1RlbXBsYXRpbmciLCJpc0RyYWZ0T3JTdGlja3lTdXBwb3J0ZWQiLCJnZXRTdGFuZGFyZEFjdGlvbkN1dCIsImdldFN0YW5kYXJkQWN0aW9uQ3JlYXRlIiwiZ2V0U3RhbmRhcmRBY3Rpb25EZWxldGUiLCJnZXRTdGFuZGFyZEFjdGlvblBhc3RlIiwiZ2V0U3RhbmRhcmRBY3Rpb25NYXNzRWRpdCIsImdldFN0YW5kYXJkQWN0aW9uSW5zaWdodHMiLCJnZXRDcmVhdGlvblJvdyIsImNvbmZpZ3VyYXRpb24iLCJnZXRTdGFuZGFyZEFjdGlvbk1vdmVVcERvd24iLCJfY29udmVydGVyQ29udGV4dCRnZXQyNiIsIl9jb252ZXJ0ZXJDb250ZXh0JGdldDI3IiwiX2NvbnZlcnRlckNvbnRleHQkZ2V0MjgiLCJ0eXBlTmFtZVBsdXJhbCIsIlR5cGVOYW1lUGx1cmFsIiwicGFnZU1hbmlmZXN0U2V0dGluZ3MiLCJoYXNBYnNvbHV0ZVBhdGgiLCJwMTNuTW9kZSIsImdldFRhYmxlSUQiLCJ0aHJlc2hvbGQiLCJNYXhJdGVtcyIsImlzU2VhcmNoYWJsZSIsImlzUGF0aFNlYXJjaGFibGUiLCJhcGlJZCIsImVudGl0eU5hbWUiLCJlbnRpdHlUeXBlTmFtZSIsImNvbGxlY3Rpb24iLCJyb3ciLCJpc0luRGlzcGxheU1vZGUiLCJzZWFyY2hhYmxlIiwiaW5pdGlhbEV4cGFuc2lvbkxldmVsIiwiX3Byb3BlcnR5JCR0YXJnZXQyIiwiaXNDdXJyZW5jeSIsImV4cG9ydERhdGFUeXBlIiwidGFyZ2V0TmF2aWdhdGlvblByb3BlcnR5UGF0aCIsImdldFNlbGVjdGlvblZhcmlhbnRDb25maWd1cmF0aW9uIiwic2VsZWN0aW9uVmFyaWFudFBhdGgiLCJyZXNvbHZlZFRhcmdldCIsImdldEVudGl0eVR5cGVBbm5vdGF0aW9uIiwic2VsZWN0aW9uIiwiX3NlbGVjdGlvbiRTZWxlY3RPcHRpIiwiX3NlbGVjdGlvbiRUZXh0IiwicHJvcGVydHlOYW1lcyIsIlNlbGVjdE9wdGlvbnMiLCJzZWxlY3RPcHRpb24iLCJQcm9wZXJ0eU5hbWUiLCJfZ2V0RnVsbFNjcmVlbkJhc2VkT25EZXZpY2UiLCJpc0lwaG9uZSIsImVuYWJsZUZ1bGxTY3JlZW4iLCJJc3N1ZVR5cGUiLCJGVUxMU0NSRUVOTU9ERV9OT1RfT05fTElTVFJFUE9SVCIsIl9nZXRNdWx0aVNlbGVjdE1vZGUiLCJtdWx0aVNlbGVjdE1vZGUiLCJzZWxlY3RBbGwiLCJ1c2VJY29uVGFiQmFyIiwiX2dldFRhYmxlTW9kZSIsImlzVGVtcGxhdGVMaXN0UmVwb3J0Iiwicm93Q291bnRNb2RlIiwicm93Q291bnQiLCJfZ2V0Q29uZGVuc2VkVGFibGVMYXlvdXQiLCJfdGFibGVUeXBlIiwiX3RhYmxlU2V0dGluZ3MiLCJjb25kZW5zZWRUYWJsZUxheW91dCIsIl9nZXRUYWJsZVNlbGVjdGlvbkxpbWl0Iiwic2VsZWN0aW9uTGltaXQiLCJfZ2V0VGFibGVJbmxpbmVDcmVhdGlvblJvd0NvdW50IiwiX3RhYmxlU2V0dGluZ3MkY3JlYXRpIiwiX3RhYmxlU2V0dGluZ3MkY3JlYXRpMiIsImlubGluZUNyZWF0aW9uUm93Q291bnQiLCJfZ2V0RW5hYmxlRXhwb3J0IiwiZW5hYmxlUGFzdGUiLCJlbmFibGVFeHBvcnQiLCJfZ2V0RnJvemVuQ29sdW1uQ291bnQiLCJmcm96ZW5Db2x1bW5Db3VudCIsIl9nZXRXaWR0aEluY2x1ZGluZ0NvbHVtbkhlYWRlciIsImdldEZpbHRlckNvbmZpZ3VyYXRpb24iLCJfdGFibGVTZXR0aW5ncyRxdWlja1YiLCJoaWRlVGFibGVUaXRsZSIsImZpbHRlcnMiLCJxdWlja1ZhcmlhbnRTZWxlY3Rpb24iLCJxdWlja0ZpbHRlclBhdGhzIiwiZmlsdGVyUGF0aHMiLCJxdWlja0ZpbHRlcnMiLCJzaG93Q291bnRzIiwiaGlkZGVuRmlsdGVycyIsIm5hdlByb3BlcnR5IiwiX2RhdGFGaWVsZCRBY3Rpb25UYXJnMyIsIl9kYXRhRmllbGQkQWN0aW9uVGFyZzQiLCJfZGF0YUZpZWxkJEFjdGlvblRhcmc1IiwidXNlRW5hYmxlZEV4cHJlc3Npb24iLCJPcGVyYXRpb25BdmFpbGFibGUiLCJfZGF0YUZpZWxkJEFjdGlvblRhcmc2IiwiX2RhdGFGaWVsZCRBY3Rpb25UYXJnNyIsIl9kYXRhRmllbGQkQWN0aW9uVGFyZzgiLCJfZGF0YUZpZWxkJEFjdGlvblRhcmc5Iiwib3ZlcmxvYWRBY3Rpb24iLCJzb3VyY2VUeXBlIiwic3RhdGljQWN0aW9uIiwicGFyYW1ldGVycyIsInVwZGF0ZVRyZWVUYWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbiIsInRhYmxlQ29uZmlndXJhdGlvbiIsIl90YWJsZVNldHRpbmdzJGNyZWF0aTMiLCJfdGFibGVTZXR0aW5ncyRjcmVhdGk0IiwiX3RhYmxlU2V0dGluZ3MkY3JlYXRpNSIsIl90YWJsZVNldHRpbmdzJGNyZWF0aTYiLCJfdGFibGVTZXR0aW5ncyRjcmVhdGk3IiwiX3RhYmxlU2V0dGluZ3MkY3JlYXRpOCIsImRhdGFNb2RlbE9iamVjdFBhdGgiLCJoaWVyYXJjaHlQYXJlbnROYXZpZ2F0aW9uUHJvcGVydHlQYXRoIiwiZ2V0SGllcmFyY2h5UGFyZW50TmF2aWdhdGlvblByb3BlcnR5UGF0aCIsIm5vblVwZGF0YWJsZU5hdmlnYXRpb25Qcm9wZXJ0aWVzIiwiZ2V0Tm9uVXBkYXRhYmxlTmF2aWdhdGlvblByb3BlcnRpZXMiLCJpc0hpZXJhcmNoeVBhcmVudE5vZGVVcGRhdGFibGUiLCJpc05vZGVNb3ZhYmxlIiwiZ2V0Q3VzdG9tRnVuY3Rpb25JbmZvIiwiaXNNb3ZlVG9Qb3NpdGlvbkFsbG93ZWQiLCJjcmVhdGVFbmFibGVtZW50IiwiaXNDcmVhdGVFbmFibGVkIiwibm9kZVR5cGUiLCJub2RlVHlwZUluZm8iLCJjcmVhdGlvbkRpYWxvZ0ZpZWxkcyIsImdldEZpZWxkTGlzdCIsImNyZWF0aW9uRmllbGRzIiwiY3JlYXRlSW5QbGFjZSIsImxhc3REb3RJbmRleCIsIm1vZHVsZU5hbWUiLCJtZXRob2ROYW1lIiwiYWRkaXRpb25hbFJlcXVpcmVkTW9kdWxlcyIsImdldE9wdGltaXN0aWNCYXRjaFNldHRpbmdzRnJvbU1hbmlmZXN0IiwiX3RhYmxlTWFuaWZlc3RTZXR0aW5nNSIsImRpc2FibGVSZXF1ZXN0Q2FjaGUiLCJnZXRNYXNzRWRpdFNldHRpbmdzIiwiZGVmYXVsdEZpZWxkQ29uZmlndXJhdGlvbiIsInZpc2libGVGaWVsZHMiLCJpZ25vcmVkRmllbGRzIiwib3BlcmF0aW9uR3JvdXBpbmdNb2RlIiwiT3BlcmF0aW9uR3JvdXBpbmdNb2RlIiwiSXNvbGF0ZWQiLCJDaGFuZ2VTZXQiLCJlbmFibGVNYXNzRWRpdCIsImN1c3RvbUZyYWdtZW50IiwidHJpbSIsIl9nbG9iYWxGRU1hbmlmZXN0U2V0dCIsIl9nbG9iYWxGRU1hbmlmZXN0U2V0dDIiLCJfdGFibGVTZXR0aW5ncyRjcmVhdGk5IiwiX3RhYmxlU2V0dGluZ3MkY3JlYXRpMTAiLCJfY29udmVydGVyQ29udGV4dCRnZXQyOSIsIl9jb252ZXJ0ZXJDb250ZXh0JGdldDMwIiwiX3RhYmxlU2V0dGluZ3MkY3JlYXRpMTEiLCJfdGFibGVTZXR0aW5ncyRjcmVhdGkxNSIsIl90YWJsZVNldHRpbmdzJGNyZWF0aTE2IiwiX3RhYmxlU2V0dGluZ3MkY3JlYXRpMTciLCJfdGFibGVTZXR0aW5ncyRjcmVhdGkxOCIsIl90YWJsZVNldHRpbmdzJHF1aWNrVjIiLCJfbWFuaWZlc3RXcmFwcGVyJGdldFYiLCJfY29udmVydGVyQ29udGV4dCRnZXQzMSIsIl9jb252ZXJ0ZXJDb250ZXh0JGdldDMyIiwiX2NvbnZlcnRlckNvbnRleHQkZ2V0MzMiLCJjaGVja0NvbmRlbnNlZExheW91dCIsIl9tYW5pZmVzdFdyYXBwZXIiLCJnbG9iYWxGRU1hbmlmZXN0U2V0dGluZ3MiLCJlbmFibGVBdXRvQ29sdW1uV2lkdGgiLCJpc1Bob25lIiwiZGlzYWJsZUNvcHlUb0NsaXBib2FyZCIsInRlbXBsYXRlVHlwZSIsImRhdGFTdGF0ZUluZGljYXRvckZpbHRlciIsImlzQ29uZGVuc2VkTGF5b3V0Q29tcGxpYW50Iiwib0ZpbHRlckNvbmZpZ3VyYXRpb24iLCJjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24iLCJleHBvcnRSZXF1ZXN0U2l6ZSIsInRhYmxlUm93TW9kZSIsImRlZmF1bHRTY3JvbGxUaHJlc2hvbGQiLCJpbmxpbmVDcmVhdGlvblJvd3NIaWRkZW5JbkVkaXRNb2RlIiwiX3RhYmxlU2V0dGluZ3MkY3JlYXRpMTIiLCJfdGFibGVTZXR0aW5ncyRjcmVhdGkxMyIsIl90YWJsZVNldHRpbmdzJGNyZWF0aTE0IiwidXNlVGV4dEZvck5vRGF0YU1lc3NhZ2VzIiwiZ2V0VXNlVGV4dEZvck5vRGF0YU1lc3NhZ2VzIiwib0NvbmZpZ3VyYXRpb24iLCJkaXNhYmxlQWRkUm93QnV0dG9uRm9yRW1wdHlEYXRhIiwiZW5hYmxlUGFzdGluZ09mQ29tcHV0ZWRQcm9wZXJ0aWVzIiwiZW5hYmxlQWRkQ2FyZFRvSW5zaWdodHMiLCJzaG93Um93Q291bnQiLCJnZXRWaWV3Q29uZmlndXJhdGlvbiIsInVzZUNvbmRlbnNlZFRhYmxlTGF5b3V0IiwiaXNDb21wYWN0VHlwZSIsImJlZm9yZVJlYmluZFRhYmxlIiwic2VsZWN0aW9uQ2hhbmdlIiwibW9kZUZvck5vRGF0YU1lc3NhZ2UiLCJzY3JvbGxUaHJlc2hvbGQiLCJfdGFibGVNYW5pZmVzdFNldHRpbmc2IiwiaXNQcm9wZXJ0eU5hdmlnYXRlZCIsImluaGVyZWRQcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGgiLCJpc0luaGVyZWRQcm9wZXJ0eU5hdmlnYXRlZCIsIm9Qcm9wZXJ0eSIsIl9vVGFyZ2V0TWFwcGluZyIsIl9wcm9wZXJ0eVR5cGVDb25maWckdCIsIl9wcm9wZXJ0eVR5cGVDb25maWckdDIiLCJfcHJvcGVydHlUeXBlQ29uZmlnJHQzIiwiX3Byb3BlcnR5VHlwZUNvbmZpZyR0NCIsIm9UYXJnZXRNYXBwaW5nIiwiaXNUeXBlRGVmaW5pdGlvbiIsIkVETV9UWVBFX01BUFBJTkciLCJ1bmRlcmx5aW5nVHlwZSIsIl9vVGFyZ2V0TWFwcGluZyRjb25zdCIsIl9vVGFyZ2V0TWFwcGluZyRjb25zdDIiLCJfb1RhcmdldE1hcHBpbmckY29uc3QzIiwiX29UYXJnZXRNYXBwaW5nJGNvbnN0NCIsIl9vVGFyZ2V0TWFwcGluZyRjb25zdDUiLCJfb1Byb3BlcnR5JGFubm90YXRpb24iLCJfb1Byb3BlcnR5JGFubm90YXRpb24yIiwiX29Qcm9wZXJ0eSRhbm5vdGF0aW9uMyIsIl9vUHJvcGVydHkkYW5ub3RhdGlvbjQiLCJfb1RhcmdldE1hcHBpbmckY29uc3Q2IiwiX29Qcm9wZXJ0eSRhbm5vdGF0aW9uNSIsIl9vUHJvcGVydHkkYW5ub3RhdGlvbjYiLCJfb1Byb3BlcnR5JGFubm90YXRpb243IiwiX29Qcm9wZXJ0eSRhbm5vdGF0aW9uOCIsIl9vVGFyZ2V0TWFwcGluZyRjb25zdDciLCJfb1Byb3BlcnR5JGFubm90YXRpb245IiwiX29Qcm9wZXJ0eSRhbm5vdGF0aW9uMTAiLCIkU2NhbGUiLCJwcmVjaXNpb24iLCIkUHJlY2lzaW9uIiwiJE1heExlbmd0aCIsIm51bGxhYmxlIiwiJE51bGxhYmxlIiwibWluaW11bSIsImlzTmFOIiwiVmFsaWRhdGlvbiIsIk1pbmltdW0iLCJtYXhpbXVtIiwiTWF4aW11bSIsImlzRGlnaXRTZXF1ZW5jZSIsIklzRGlnaXRTZXF1ZW5jZSIsInBhcnNlQXNTdHJpbmciLCJlbXB0eVN0cmluZyIsInBhcnNlS2VlcHNFbXB0eVN0cmluZyIsInJlbGF0ZWRBbm5vdGF0aW9uQ29sdW1ucyIsImV4aXN0aW5nQ29sdW1uIiwiX2V4aXN0aW5nQ29sdW1uJHByb3BlIiwiY29sdW1uS2V5IiwiX2V4cG9ydFNldHRpbmdzJHByb3BlIiwiX2NvbHVtbkZyb21Bbm5vdGF0aW9uMyIsIl9jb2x1bW5Gcm9tQW5ub3RhdGlvbjQiLCJfY29sdW1uRnJvbUFubm90YXRpb241IiwiX2NvbHVtbkZyb21Bbm5vdGF0aW9uNiIsIl9jb2x1bW5Gcm9tQW5ub3RhdGlvbjciLCJjb2x1bW5Gcm9tQW5ub3RhdGlvbnMiLCJfY29sdW1uRnJvbUFubm90YXRpb24iLCJfY29sdW1uRnJvbUFubm90YXRpb24yIiwiZW5hYmxlV3JhcHBpbmciLCJjdXN0b21FeHBvcnRTZXR0aW5ncyJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiVGFibGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUge1xuXHRFbnRpdHlTZXQsXG5cdEVudGl0eVR5cGUsXG5cdE5hdmlnYXRpb25Qcm9wZXJ0eSxcblx0UGF0aEFubm90YXRpb25FeHByZXNzaW9uLFxuXHRQcm9wZXJ0eSxcblx0UHJvcGVydHlBbm5vdGF0aW9uVmFsdWUsXG5cdFByb3BlcnR5UGF0aFxufSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXNcIjtcbmltcG9ydCB0eXBlIHsgRmlsdGVyRnVuY3Rpb25zIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3ZvY2FidWxhcmllcy9DYXBhYmlsaXRpZXNcIjtcbmltcG9ydCB0eXBlIHsgRW50aXR5U2V0QW5ub3RhdGlvbnNfQ2FwYWJpbGl0aWVzIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3ZvY2FidWxhcmllcy9DYXBhYmlsaXRpZXNfRWRtXCI7XG5pbXBvcnQgdHlwZSB7IFNlbWFudGljS2V5IH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3ZvY2FidWxhcmllcy9Db21tb25cIjtcbmltcG9ydCB7IENvbW1vbkFubm90YXRpb25UZXJtcyB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvQ29tbW9uXCI7XG5pbXBvcnQgdHlwZSB7IEVudGl0eVNldEFubm90YXRpb25zX0NvbW1vbiB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvQ29tbW9uX0VkbVwiO1xuaW1wb3J0IHR5cGUgeyBFbnRpdHlTZXRBbm5vdGF0aW9uc19TZXNzaW9uIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3ZvY2FidWxhcmllcy9TZXNzaW9uX0VkbVwiO1xuaW1wb3J0IHR5cGUge1xuXHRDcml0aWNhbGl0eSxcblx0RGF0YUZpZWxkLFxuXHREYXRhRmllbGRBYnN0cmFjdFR5cGVzLFxuXHREYXRhRmllbGRGb3JBY3Rpb24sXG5cdERhdGFGaWVsZEZvckFjdGlvblR5cGVzLFxuXHREYXRhRmllbGRGb3JBbm5vdGF0aW9uLFxuXHREYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb24sXG5cdERhdGFGaWVsZFR5cGVzLFxuXHREYXRhUG9pbnQsXG5cdERhdGFQb2ludFR5cGVUeXBlcyxcblx0RmllbGRHcm91cCxcblx0TGluZUl0ZW0sXG5cdFByZXNlbnRhdGlvblZhcmlhbnRUeXBlLFxuXHRTZWxlY3RPcHRpb25UeXBlLFxuXHRTZWxlY3Rpb25WYXJpYW50LFxuXHRTZWxlY3Rpb25WYXJpYW50VHlwZVxufSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL1VJXCI7XG5pbXBvcnQgeyBVSUFubm90YXRpb25UZXJtcywgVUlBbm5vdGF0aW9uVHlwZXMgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL1VJXCI7XG5pbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCB0eXBlIHsgQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uLCBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiB9IGZyb20gXCJzYXAvZmUvYmFzZS9CaW5kaW5nVG9vbGtpdFwiO1xuaW1wb3J0IHtcblx0RURNX1RZUEVfTUFQUElORyxcblx0YW5kLFxuXHRjb21waWxlRXhwcmVzc2lvbixcblx0Y29uc3RhbnQsXG5cdGVxdWFsLFxuXHRmb3JtYXRSZXN1bHQsXG5cdGdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbixcblx0aWZFbHNlLFxuXHRpc0NvbnN0YW50LFxuXHRub3QsXG5cdG9yLFxuXHRwYXRoSW5Nb2RlbCxcblx0cmVzb2x2ZUJpbmRpbmdTdHJpbmdcbn0gZnJvbSBcInNhcC9mZS9iYXNlL0JpbmRpbmdUb29sa2l0XCI7XG5pbXBvcnQgdHlwZSB7IFBhZ2VDb250ZXh0UGF0aFRhcmdldCB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL1RlbXBsYXRlQ29udmVydGVyXCI7XG5pbXBvcnQgdHlwZSB7IENvbXBsZXhQcm9wZXJ0eUluZm8gfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9hbm5vdGF0aW9ucy9EYXRhRmllbGRcIjtcbmltcG9ydCB7XG5cdGNvbGxlY3RSZWxhdGVkUHJvcGVydGllcyxcblx0Y29sbGVjdFJlbGF0ZWRQcm9wZXJ0aWVzUmVjdXJzaXZlbHksXG5cdGdldERhdGFGaWVsZERhdGFUeXBlLFxuXHRnZXRTZW1hbnRpY09iamVjdFBhdGgsXG5cdGdldFRhcmdldFZhbHVlT25EYXRhUG9pbnQsXG5cdGhhc0RhdGFQb2ludFRhcmdldCxcblx0aGFzRmllbGRHcm91cFRhcmdldCxcblx0aXNEYXRhRmllbGQsXG5cdGlzRGF0YUZpZWxkRm9yQWN0aW9uQWJzdHJhY3QsXG5cdGlzRGF0YUZpZWxkRm9yQW5ub3RhdGlvbixcblx0aXNEYXRhRmllbGRUeXBlcyxcblx0aXNEYXRhUG9pbnRGcm9tRGF0YUZpZWxkRGVmYXVsdCxcblx0aXNSYXRpbmdWaXN1YWxpemF0aW9uRnJvbURhdGFGaWVsZERlZmF1bHRcbn0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvYW5ub3RhdGlvbnMvRGF0YUZpZWxkXCI7XG5pbXBvcnQgdHlwZSB7XG5cdEFubm90YXRpb25BY3Rpb24sXG5cdEJhc2VBY3Rpb24sXG5cdENvbWJpbmVkQWN0aW9uLFxuXHRDdXN0b21BY3Rpb24sXG5cdE92ZXJyaWRlVHlwZUFjdGlvblxufSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9jb250cm9scy9Db21tb24vQWN0aW9uXCI7XG5pbXBvcnQge1xuXHRkYXRhRmllbGRJc0NvcHlBY3Rpb24sXG5cdGdldEFjdGlvbnNGcm9tTWFuaWZlc3QsXG5cdGdldENvcHlBY3Rpb24sXG5cdGdldEVuYWJsZWRGb3JBbm5vdGF0aW9uQWN0aW9uLFxuXHRpc0FjdGlvbk5hdmlnYWJsZSxcblx0cmVtb3ZlRHVwbGljYXRlQWN0aW9uc1xufSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9jb250cm9scy9Db21tb24vQWN0aW9uXCI7XG5pbXBvcnQgdHlwZSB7IENvbmZpZ3VyYWJsZU9iamVjdCwgQ3VzdG9tRWxlbWVudCB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2hlbHBlcnMvQ29uZmlndXJhYmxlT2JqZWN0XCI7XG5pbXBvcnQgeyBPdmVycmlkZVR5cGUsIFBsYWNlbWVudCwgaW5zZXJ0Q3VzdG9tRWxlbWVudHMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9oZWxwZXJzL0NvbmZpZ3VyYWJsZU9iamVjdFwiO1xuaW1wb3J0IHsgSXNzdWVDYXRlZ29yeSwgSXNzdWVDYXRlZ29yeVR5cGUsIElzc3VlU2V2ZXJpdHksIElzc3VlVHlwZSB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2hlbHBlcnMvSXNzdWVNYW5hZ2VyXCI7XG5pbXBvcnQgeyBLZXlIZWxwZXIgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9oZWxwZXJzL0tleVwiO1xuaW1wb3J0IHsgRW50aXR5LCBVSSB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0JpbmRpbmdIZWxwZXJcIjtcbmltcG9ydCBNb2RlbEhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0IHsgZ2VuZXJhdGUsIHJlcGxhY2VTcGVjaWFsQ2hhcnMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9TdGFibGVJZEhlbHBlclwiO1xuaW1wb3J0ICogYXMgVHlwZUd1YXJkcyBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9UeXBlR3VhcmRzXCI7XG5pbXBvcnQge1xuXHRpc0Fubm90YXRpb25PZlR5cGUsXG5cdGlzTmF2aWdhdGlvblByb3BlcnR5LFxuXHRpc1BhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbixcblx0aXNQcm9wZXJ0eSxcblx0aXNUeXBlRGVmaW5pdGlvblxufSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9UeXBlR3VhcmRzXCI7XG5pbXBvcnQge1xuXHRlbmhhbmNlRGF0YU1vZGVsUGF0aCxcblx0Z2V0Q29udGV4dFByb3BlcnR5UmVzdHJpY3Rpb24sXG5cdGdldEhpZXJhcmNoeVBhcmVudE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgsXG5cdGdldE5vblVwZGF0YWJsZU5hdmlnYXRpb25Qcm9wZXJ0aWVzLFxuXHRnZXRUYXJnZXRPYmplY3RQYXRoLFxuXHRpc1BhdGhEZWxldGFibGUsXG5cdGlzUGF0aFNlYXJjaGFibGUsXG5cdGlzUGF0aFVwZGF0YWJsZSxcblx0dHlwZSBEYXRhTW9kZWxPYmplY3RQYXRoXG59IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL0RhdGFNb2RlbFBhdGhIZWxwZXJcIjtcbmltcG9ydCB7IGdldERpc3BsYXlNb2RlLCB0eXBlIERpc3BsYXlNb2RlIH0gZnJvbSBcInNhcC9mZS9jb3JlL3RlbXBsYXRpbmcvRGlzcGxheU1vZGVGb3JtYXR0ZXJcIjtcbmltcG9ydCB7IGdldFJlc3RyaWN0aW9uc09uUHJvcGVydGllcywgdHlwZSBSZXN0cmljdGlvbnNPblByb3BlcnRpZXMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9FbnRpdHlTZXRIZWxwZXJcIjtcbmltcG9ydCB7IGhhc0ZpZWxkQ29udHJvbE5vdE1hbmRhdG9yeSwgaXNTdGF0aWNhbGx5TWFuZGF0b3J5IH0gZnJvbSBcInNhcC9mZS9jb3JlL3RlbXBsYXRpbmcvRmllbGRDb250cm9sSGVscGVyXCI7XG5pbXBvcnQge1xuXHRnZXRBc3NvY2lhdGVkQ3VycmVuY3lQcm9wZXJ0eSxcblx0Z2V0QXNzb2NpYXRlZFRleHRQcm9wZXJ0eSxcblx0Z2V0QXNzb2NpYXRlZFRpbWV6b25lUHJvcGVydHksXG5cdGdldEFzc29jaWF0ZWRVbml0UHJvcGVydHksXG5cdGdldFN0YXRpY1RpbWV6b25lLFxuXHRnZXRTdGF0aWNVbml0T3JDdXJyZW5jeSxcblx0aXNUaW1lem9uZVxufSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9Qcm9wZXJ0eUhlbHBlclwiO1xuaW1wb3J0IHsgaXNNdWx0aVZhbHVlRmllbGQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9VSUZvcm1hdHRlcnNcIjtcbmltcG9ydCB0eXBlIHsgRGVmYXVsdFR5cGVGb3JFZG1UeXBlIH0gZnJvbSBcInNhcC9mZS9jb3JlL3R5cGUvRURNXCI7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlc3RyaWN0ZWQtaW1wb3J0c1xuaW1wb3J0IHRhYmxlRm9ybWF0dGVycyBmcm9tIFwic2FwL2ZlL21hY3Jvcy9mb3JtYXR0ZXJzL1RhYmxlRm9ybWF0dGVyXCI7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlc3RyaWN0ZWQtaW1wb3J0c1xuaW1wb3J0IEFjdGlvbkhlbHBlciBmcm9tIFwic2FwL2ZlL21hY3Jvcy9pbnRlcm5hbC9oZWxwZXJzL0FjdGlvbkhlbHBlclwiO1xuaW1wb3J0IExpYnJhcnkgZnJvbSBcInNhcC91aS9jb3JlL0xpYlwiO1xuaW1wb3J0IE1lc3NhZ2VUeXBlIGZyb20gXCJzYXAvdWkvY29yZS9tZXNzYWdlL01lc3NhZ2VUeXBlXCI7XG5pbXBvcnQgdHlwZSBDb252ZXJ0ZXJDb250ZXh0IGZyb20gXCIuLi8uLi9Db252ZXJ0ZXJDb250ZXh0XCI7XG5pbXBvcnQgdHlwZSB7XG5cdEF2YWlsYWJpbGl0eVR5cGUsXG5cdEN1c3RvbURlZmluZWRUYWJsZUNvbHVtbixcblx0Q3VzdG9tRGVmaW5lZFRhYmxlQ29sdW1uRm9yT3ZlcnJpZGUsXG5cdEZvcm1hdE9wdGlvbnNUeXBlLFxuXHRNYW5pZmVzdEFjdGlvbixcblx0TmF2aWdhdGlvblNldHRpbmdzQ29uZmlndXJhdGlvbixcblx0TmF2aWdhdGlvblRhcmdldENvbmZpZ3VyYXRpb24sXG5cdFRhYmxlQ29sdW1uU2V0dGluZ3MsXG5cdFRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uLFxuXHRUYWJsZU1hbmlmZXN0U2V0dGluZ3NDb25maWd1cmF0aW9uXG59IGZyb20gXCIuLi8uLi9NYW5pZmVzdFNldHRpbmdzXCI7XG5pbXBvcnQge1xuXHRBY3Rpb25UeXBlLFxuXHRDcmVhdGlvbk1vZGUsXG5cdEhvcml6b250YWxBbGlnbixcblx0SW1wb3J0YW5jZSxcblx0T3BlcmF0aW9uR3JvdXBpbmdNb2RlLFxuXHRTZWxlY3Rpb25Nb2RlLFxuXHRUZW1wbGF0ZVR5cGUsXG5cdFZhcmlhbnRNYW5hZ2VtZW50VHlwZSxcblx0VmlzdWFsaXphdGlvblR5cGVcbn0gZnJvbSBcIi4uLy4uL01hbmlmZXN0U2V0dGluZ3NcIjtcbmltcG9ydCB0eXBlIE1hbmlmZXN0V3JhcHBlciBmcm9tIFwiLi4vLi4vTWFuaWZlc3RXcmFwcGVyXCI7XG5pbXBvcnQgeyBBZ2dyZWdhdGlvbkhlbHBlciB9IGZyb20gXCIuLi8uLi9oZWxwZXJzL0FnZ3JlZ2F0aW9uXCI7XG5pbXBvcnQgeyBpc1JlZmVyZW5jZVByb3BlcnR5U3RhdGljYWxseUhpZGRlbiB9IGZyb20gXCIuLi8uLi9oZWxwZXJzL0RhdGFGaWVsZEhlbHBlclwiO1xuaW1wb3J0IHsgZ2V0VGFibGVJRCB9IGZyb20gXCIuLi8uLi9oZWxwZXJzL0lEXCI7XG5pbXBvcnQgeyBnZXRNZXNzYWdlVHlwZUZyb21Dcml0aWNhbGl0eVR5cGUgfSBmcm9tIFwiLi9Dcml0aWNhbGl0eVwiO1xuaW1wb3J0IHR5cGUgeyBTdGFuZGFyZEFjdGlvbiB9IGZyb20gXCIuL3RhYmxlL1N0YW5kYXJkQWN0aW9uc1wiO1xuaW1wb3J0IHtcblx0U3RhbmRhcmRBY3Rpb25LZXlzLFxuXHRnZW5lcmF0ZVN0YW5kYXJkQWN0aW9uc0NvbnRleHQsXG5cdGdldENyZWF0aW9uUm93LFxuXHRnZXRDdXRWaXNpYmlsaXR5LFxuXHRnZXREZWxldGVWaXNpYmlsaXR5LFxuXHRnZXRJbnNlcnRVcGRhdGVBY3Rpb25zVGVtcGxhdGluZyxcblx0Z2V0TWFzc0VkaXRWaXNpYmlsaXR5LFxuXHRnZXRSZXN0cmljdGlvbnMsXG5cdGdldFN0YW5kYXJkQWN0aW9uQ3JlYXRlLFxuXHRnZXRTdGFuZGFyZEFjdGlvbkN1dCxcblx0Z2V0U3RhbmRhcmRBY3Rpb25EZWxldGUsXG5cdGdldFN0YW5kYXJkQWN0aW9uSW5zaWdodHMsXG5cdGdldFN0YW5kYXJkQWN0aW9uTWFzc0VkaXQsXG5cdGdldFN0YW5kYXJkQWN0aW9uTW92ZVVwRG93bixcblx0Z2V0U3RhbmRhcmRBY3Rpb25QYXN0ZSxcblx0aXNEcmFmdE9yU3RpY2t5U3VwcG9ydGVkLFxuXHRpc0luRGlzcGxheU1vZGVcbn0gZnJvbSBcIi4vdGFibGUvU3RhbmRhcmRBY3Rpb25zXCI7XG5cbnR5cGUgVXBsb2FkVGFibGVTZXR0aW5ncyA9IHtcblx0c3RyZWFtOiBzdHJpbmc7XG5cdGZpbGVOYW1lPzogc3RyaW5nO1xuXHRmaWxlTmFtZU1heExlbmd0aD86IGludDtcblx0YWNjZXB0YWJsZU1lZGlhVHlwZXM/OiBzdHJpbmdbXTtcblx0bWF4TGVuZ3RoPzogaW50O1xuXHR1cGxvYWRBY3Rpb24/OiBTdGFuZGFyZEFjdGlvbjtcbn07XG50eXBlIFJvd0NvbmZpZ3VyYXRpb24gPSB7XG5cdGFjdGlvbj86IHN0cmluZztcblx0cHJlc3M/OiBzdHJpbmc7XG5cdG9wZW5Jbk5ld1RhYlByZXNzPzogc3RyaW5nO1xuXHRyb3dIaWdobGlnaHRpbmc6IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uO1xuXHRyb3dOYXZpZ2F0ZWQ6IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uO1xuXHR2aXNpYmxlPzogQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb247XG59O1xuXG5leHBvcnQgdHlwZSBNYXNzRWRpdFRhYmxlQ29uZmlndXJhdGlvbiA9IHtcblx0ZW5hYmxlZDogYm9vbGVhbjtcblx0dmlzaWJsZUZpZWxkczogc3RyaW5nW107XG5cdGlnbm9yZWRGaWVsZHM6IHN0cmluZ1tdO1xuXHRvcGVyYXRpb25Hcm91cGluZ01vZGU6IE9wZXJhdGlvbkdyb3VwaW5nTW9kZTtcblx0Y3VzdG9tRnJhZ21lbnQ/OiBzdHJpbmc7XG59O1xuXG50eXBlIFRhYmxlU29ydENvbmRpdGlvbnMgPSB7XG5cdHNvcnRlcnM6IHtcblx0XHRuYW1lOiBzdHJpbmc7XG5cdFx0ZGVzY2VuZGluZzogYm9vbGVhbjtcblx0fVtdO1xufTtcblxudHlwZSBUYWJsZUdyb3VwQ29uZGl0aW9ucyA9IHtcblx0Z3JvdXBMZXZlbHM6IHsgbmFtZTogc3RyaW5nIH1bXTtcbn07XG5cbnR5cGUgVGFibGVBZ2dyZWdhdGVDb25kaXRpb25zID0gUmVjb3JkPHN0cmluZywgb2JqZWN0PjtcblxudHlwZSBUYWJsZVAxM25Nb2RlID0gXCJBZ2dyZWdhdGVcIiB8IFwiQ29sdW1uXCIgfCBcIkZpbHRlclwiIHwgXCJHcm91cFwiIHwgXCJTb3J0XCI7XG5cbmV4cG9ydCB0eXBlIFRhYmxlQW5ub3RhdGlvbkNvbmZpZ3VyYXRpb24gPSB7XG5cdGNvbGxlY3Rpb246IHN0cmluZztcblx0dmFyaWFudE1hbmFnZW1lbnQ6IFZhcmlhbnRNYW5hZ2VtZW50VHlwZTtcblx0ZmlsdGVySWQ/OiBzdHJpbmc7XG5cdGlkOiBzdHJpbmc7XG5cdGFwaUlkOiBzdHJpbmc7XG5cdG5hdmlnYXRpb25QYXRoOiBzdHJpbmc7XG5cdHAxM25Nb2RlPzogVGFibGVQMTNuTW9kZVtdO1xuXHRyb3c/OiBSb3dDb25maWd1cmF0aW9uO1xuXHRzZWxlY3Rpb25Nb2RlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cdGlzSW5zZXJ0VXBkYXRlQWN0aW9uc1RlbXBsYXRlZDogYm9vbGVhbjtcblx0dXBkYXRhYmxlUHJvcGVydHlQYXRoOiBzdHJpbmc7XG5cdGRpc3BsYXlNb2RlPzogYm9vbGVhbjtcblx0dGhyZXNob2xkOiBudW1iZXI7XG5cdGVudGl0eU5hbWU6IHN0cmluZztcblx0ZW50aXR5VHlwZU5hbWU6IHN0cmluZztcblx0c29ydENvbmRpdGlvbnM/OiBUYWJsZVNvcnRDb25kaXRpb25zO1xuXHRncm91cENvbmRpdGlvbnM/OiBUYWJsZUdyb3VwQ29uZGl0aW9ucztcblx0YWdncmVnYXRlQ29uZGl0aW9ucz86IFRhYmxlQWdncmVnYXRlQ29uZGl0aW9ucztcblx0aW5pdGlhbEV4cGFuc2lvbkxldmVsPzogbnVtYmVyO1xuXHRhbGxvd0Ryb3BCZXR3ZWVuTm9kZXM/OiBib29sZWFuO1xuXHRjaGFuZ2VTaWJsaW5nRm9yUm9vdHNTdXBwb3J0ZWQ/OiBib29sZWFuO1xuXHQvKiogQ3JlYXRlIG5ldyBlbnRyaWVzICovXG5cdGNyZWF0ZTogQ3JlYXRlQmVoYXZpb3IgfCBDcmVhdGVCZWhhdmlvckV4dGVybmFsO1xuXHR0aXRsZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXHRzZWFyY2hhYmxlOiBib29sZWFuO1xuXHRyZXF1aXJlZFByb3BlcnRpZXM/OiBzdHJpbmdbXTtcblx0dXBsb2FkVGFibGU/OiBVcGxvYWRUYWJsZVNldHRpbmdzO1xufTtcbi8qKlxuICogTmV3IGVudHJpZXMgYXJlIGNyZWF0ZWQgd2l0aGluIHRoZSBhcHAgKGRlZmF1bHQgY2FzZSlcbiAqL1xuZXhwb3J0IHR5cGUgQ3JlYXRlQmVoYXZpb3IgPSB7XG5cdG1vZGU6IENyZWF0aW9uTW9kZTtcblx0YXBwZW5kOiBib29sZWFuO1xuXHRuZXdBY3Rpb24/OiBzdHJpbmc7XG5cdG5hdmlnYXRlVG9UYXJnZXQ/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBFeHRlcm5hbE1ldGhvZENvbmZpZyA9IHtcblx0bW9kdWxlTmFtZTogc3RyaW5nO1xuXHRtZXRob2ROYW1lOiBzdHJpbmc7XG59O1xuLyoqXG4gKiBOZXcgZW50cmllcyBhcmUgY3JlYXRlZCBieSBuYXZpZ2F0aW5nIHRvIHNvbWUgdGFyZ2V0XG4gKi9cbmV4cG9ydCB0eXBlIENyZWF0ZUJlaGF2aW9yRXh0ZXJuYWwgPSB7XG5cdG1vZGU6IFwiRXh0ZXJuYWxcIjtcblx0b3V0Ym91bmQ6IHN0cmluZztcblx0b3V0Ym91bmREZXRhaWw6IE5hdmlnYXRpb25UYXJnZXRDb25maWd1cmF0aW9uW1wib3V0Ym91bmREZXRhaWxcIl07XG5cdG5hdmlnYXRpb25TZXR0aW5nczogTmF2aWdhdGlvblNldHRpbmdzQ29uZmlndXJhdGlvbjtcbn07XG5leHBvcnQgdHlwZSBUYWJsZUNhcGFiaWxpdHlSZXN0cmljdGlvbiA9IHtcblx0aXNEZWxldGFibGU6IGJvb2xlYW47XG5cdGlzVXBkYXRhYmxlOiBib29sZWFuO1xufTtcbmV4cG9ydCB0eXBlIFRhYmxlRmlsdGVyc0NvbmZpZ3VyYXRpb24gPSB7XG5cdHBhdGhzOiB7XG5cdFx0YW5ub3RhdGlvblBhdGg6IHN0cmluZztcblx0fVtdO1xuXHRzaG93Q291bnRzPzogYm9vbGVhbjtcbn07XG5leHBvcnQgdHlwZSBTZWxlY3Rpb25WYXJpYW50Q29uZmlndXJhdGlvbiA9IHtcblx0cHJvcGVydHlOYW1lczogc3RyaW5nW107XG5cdHRleHQ/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBUYWJsZUNvbnRyb2xDb25maWd1cmF0aW9uID0ge1xuXHRkaXNhYmxlUmVxdWVzdENhY2hlOiBib29sZWFuO1xuXHRjcmVhdGVBdEVuZDogYm9vbGVhbjtcblx0Y3JlYXRlSW5QbGFjZT86IGJvb2xlYW47XG5cdGNyZWF0aW9uTW9kZTogQ3JlYXRpb25Nb2RlO1xuXHRkaXNhYmxlQWRkUm93QnV0dG9uRm9yRW1wdHlEYXRhOiBib29sZWFuO1xuXHRjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb246IHN0cmluZyB8IHVuZGVmaW5lZDtcblx0dXNlQ29uZGVuc2VkVGFibGVMYXlvdXQ6IGJvb2xlYW47XG5cdGVuYWJsZUV4cG9ydDogYm9vbGVhbjtcblx0ZW5hYmxlUGFzdGluZ09mQ29tcHV0ZWRQcm9wZXJ0aWVzPzogYm9vbGVhbjtcblx0ZnJvemVuQ29sdW1uQ291bnQ/OiBudW1iZXI7XG5cdHdpZHRoSW5jbHVkaW5nQ29sdW1uSGVhZGVyPzogYm9vbGVhbjtcblx0aGVhZGVyPzogc3RyaW5nO1xuXHRoZWFkZXJWaXNpYmxlPzogYm9vbGVhbjtcblx0ZmlsdGVycz86IFBhcnRpYWw8UmVjb3JkPFwicXVpY2tGaWx0ZXJzXCIgfCBcImhpZGRlbkZpbHRlcnNcIiwgVGFibGVGaWx0ZXJzQ29uZmlndXJhdGlvbj4+O1xuXHR0eXBlOiBUYWJsZVR5cGU7XG5cdHJvd0NvdW50TW9kZT86IFRhYmxlUm93Q291bnRNb2RlO1xuXHRyb3dDb3VudD86IG51bWJlcjtcblx0c2Nyb2xsVGhyZXNob2xkPzogbnVtYmVyO1xuXHRzZWxlY3RBbGw/OiBib29sZWFuO1xuXHRzZWxlY3Rpb25MaW1pdDogbnVtYmVyO1xuXHRtdWx0aVNlbGVjdE1vZGU6IHN0cmluZyB8IHVuZGVmaW5lZDtcblx0ZW5hYmxlUGFzdGU6IGJvb2xlYW47XG5cdGRpc2FibGVDb3B5VG9DbGlwYm9hcmQ/OiBib29sZWFuO1xuXHRlbmFibGVGdWxsU2NyZWVuOiBib29sZWFuO1xuXHRzaG93Um93Q291bnQ6IGJvb2xlYW47XG5cdGlubGluZUNyZWF0aW9uUm93Q291bnQ/OiBudW1iZXI7XG5cdGlubGluZUNyZWF0aW9uUm93c0hpZGRlbkluRWRpdE1vZGU/OiBib29sZWFuO1xuXHRtYXNzRWRpdDogTWFzc0VkaXRUYWJsZUNvbmZpZ3VyYXRpb247XG5cdGVuYWJsZUF1dG9Db2x1bW5XaWR0aDogYm9vbGVhbjtcblx0ZGF0YVN0YXRlSW5kaWNhdG9yRmlsdGVyOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cdGlzQ29tcGFjdFR5cGU/OiBib29sZWFuO1xuXHRoaWVyYXJjaHlRdWFsaWZpZXI/OiBzdHJpbmc7XG5cdGlzSGllcmFyY2h5UGFyZW50Tm9kZVVwZGF0YWJsZT86IGJvb2xlYW47XG5cdGVuYWJsZUFkZENhcmRUb0luc2lnaHRzPzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcblx0Y3JlYXRpb25EaWFsb2dGaWVsZHM/OiBzdHJpbmdbXTtcblx0bm9kZVR5cGU/OiB7XG5cdFx0cHJvcGVydHlOYW1lOiBzdHJpbmc7XG5cdFx0dmFsdWVzOiB7IHZhbHVlOiBzdHJpbmc7IHRleHQ6IHN0cmluZzsgY3JlYXRpb25EaWFsb2dGaWVsZHM/OiBzdHJpbmdbXSB9W107XG5cdH07XG5cdGNyZWF0ZUVuYWJsZW1lbnQ/OiBFeHRlcm5hbE1ldGhvZENvbmZpZztcblx0aXNOb2RlTW92YWJsZT86IEV4dGVybmFsTWV0aG9kQ29uZmlnO1xuXHRpc01vdmVUb1Bvc2l0aW9uQWxsb3dlZD86IEV4dGVybmFsTWV0aG9kQ29uZmlnO1xuXHRzZWxlY3Rpb25DaGFuZ2U/OiBzdHJpbmc7XG5cdGFkZGl0aW9uYWxSZXF1aXJlZE1vZHVsZXM/OiBzdHJpbmdbXTtcblx0YmVmb3JlUmViaW5kVGFibGU/OiBzdHJpbmc7XG5cdGV4cG9ydFJlcXVlc3RTaXplPzogbnVtYmVyO1xuXHRlbmFibGVVcGxvYWRQbHVnaW4/OiBib29sZWFuO1xuXHRtb2RlRm9yTm9EYXRhTWVzc2FnZT86IHN0cmluZztcbn07XG5leHBvcnQgdHlwZSBUYWJsZVR5cGUgPSBcIkdyaWRUYWJsZVwiIHwgXCJSZXNwb25zaXZlVGFibGVcIiB8IFwiQW5hbHl0aWNhbFRhYmxlXCIgfCBcIlRyZWVUYWJsZVwiO1xuZXhwb3J0IHR5cGUgVGFibGVSb3dDb3VudE1vZGUgPSBcIkF1dG9cIiB8IFwiRml4ZWRcIjtcblxuZW51bSBDb2x1bW5UeXBlIHtcblx0RGVmYXVsdCA9IFwiRGVmYXVsdFwiLCAvLyBEZWZhdWx0IFR5cGUgKEN1c3RvbSBDb2x1bW4pXG5cdEFubm90YXRpb24gPSBcIkFubm90YXRpb25cIixcblx0U2xvdCA9IFwiU2xvdFwiLFxuXHRDb21wdXRlZCA9IFwiQ29tcHV0ZWRcIlxufVxuLy8gQ3VzdG9tIENvbHVtbiBmcm9tIE1hbmlmZXN0XG5leHBvcnQgdHlwZSBNYW5pZmVzdERlZmluZWRDdXN0b21Db2x1bW4gPSBDdXN0b21EZWZpbmVkVGFibGVDb2x1bW4gJiB7XG5cdHR5cGU/OiBDb2x1bW5UeXBlLkRlZmF1bHQ7XG59O1xuLy8gU2xvdCBDb2x1bW4gZnJvbSBCdWlsZGluZyBCbG9ja1xuZXhwb3J0IHR5cGUgRnJhZ21lbnREZWZpbmVkU2xvdENvbHVtbiA9IEN1c3RvbURlZmluZWRUYWJsZUNvbHVtbiAmIHtcblx0dHlwZTogQ29sdW1uVHlwZS5TbG90O1xufTtcbi8vIFByb3BlcnRpZXMgYWxsIENvbHVtblR5cGVzIGhhdmU6XG5leHBvcnQgdHlwZSBCYXNlVGFibGVDb2x1bW4gPSBDb25maWd1cmFibGVPYmplY3QgJiB7XG5cdHR5cGU6IENvbHVtblR5cGU7IC8vT3JpZ2luIG9mIHRoZSBzb3VyY2Ugd2hlcmUgd2UgYXJlIGdldHRpbmcgdGhlIHRlbXBsYXRlZCBpbmZvcm1hdGlvbiBmcm9tXG5cdHdpZHRoPzogc3RyaW5nO1xuXHR3aWR0aEluY2x1ZGluZ0NvbHVtbkhlYWRlcj86IGJvb2xlYW47XG5cdGltcG9ydGFuY2U/OiBJbXBvcnRhbmNlO1xuXHRob3Jpem9udGFsQWxpZ24/OiBIb3Jpem9udGFsQWxpZ247XG5cdGF2YWlsYWJpbGl0eT86IEF2YWlsYWJpbGl0eVR5cGU7XG5cdGlzTmF2aWdhYmxlPzogYm9vbGVhbjtcblx0Y2FzZVNlbnNpdGl2ZTogYm9vbGVhbjtcblx0bGFiZWw/OiBzdHJpbmc7XG5cdHRvb2x0aXA/OiBzdHJpbmc7XG59O1xuLy8gUHJvcGVydGllcyBvbiBDdXN0b20gQ29sdW1ucyBhbmQgU2xvdCBDb2x1bW5zXG5leHBvcnQgdHlwZSBDdXN0b21CYXNlZFRhYmxlQ29sdW1uID0gQmFzZVRhYmxlQ29sdW1uICYge1xuXHRpZDogc3RyaW5nO1xuXHRuYW1lOiBzdHJpbmc7XG5cdGhlYWRlcj86IHN0cmluZztcblx0dGVtcGxhdGU6IHN0cmluZztcblx0cHJvcGVydHlJbmZvcz86IHN0cmluZ1tdO1xuXHRleHBvcnRTZXR0aW5ncz86IENvbHVtbkV4cG9ydFNldHRpbmdzIHwgbnVsbDtcblx0Zm9ybWF0T3B0aW9uczogRm9ybWF0T3B0aW9uc1R5cGU7XG5cdGlzR3JvdXBhYmxlOiBib29sZWFuO1xuXHRpc05hdmlnYWJsZTogYm9vbGVhbjtcblx0c29ydGFibGU6IGJvb2xlYW47XG5cdHZpc3VhbFNldHRpbmdzOiB7IHdpZHRoQ2FsY3VsYXRpb246IG51bGwgfTtcblx0cHJvcGVydGllcz86IHN0cmluZ1tdO1xuXHRyZXF1aXJlZD86IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uO1xufTtcblxuZXhwb3J0IHR5cGUgQ29tcHV0ZWRUYWJsZUNvbHVtbiA9IEJhc2VUYWJsZUNvbHVtbiAmIHtcblx0bmFtZTogc3RyaW5nO1xuXHRsYWJlbDogc3RyaW5nO1xuXHRwcm9wZXJ0eUtleTogc3RyaW5nO1xuXHRpc0RyYWZ0SW5kaWNhdG9yPzogYm9vbGVhbjtcblx0aXNTaXR1YXRpb25zSW5kaWNhdG9yPzogYm9vbGVhbjtcblx0Zm9ybWF0T3B0aW9ucz86IEZvcm1hdE9wdGlvbnNUeXBlIHwgbnVsbDtcblx0cHJvcGVydHlJbmZvcz86IHN0cmluZ1tdO1xuXHRleHBvcnRTZXR0aW5ncz86IENvbHVtbkV4cG9ydFNldHRpbmdzIHwgbnVsbDtcblx0Y2xpcGJvYXJkU2V0dGluZ3M/OiBPYmplY3QgfCBudWxsO1xuXHRyZXF1aXJlZD86IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uO1xufTtcblxuLy8gUHJvcGVydGllcyBkZXJpdmVkIGZyb20gTWFuaWZlc3QgdG8gb3ZlcnJpZGUgQW5ub3RhdGlvbiBjb25maWd1cmF0aW9uc1xuZXhwb3J0IHR5cGUgQW5ub3RhdGlvblRhYmxlQ29sdW1uRm9yT3ZlcnJpZGUgPSBCYXNlVGFibGVDb2x1bW4gJiB7XG5cdHNldHRpbmdzPzogVGFibGVDb2x1bW5TZXR0aW5ncztcblx0Zm9ybWF0T3B0aW9ucz86IEZvcm1hdE9wdGlvbnNUeXBlO1xuXHRleHBvcnRTZXR0aW5ncz86IENvbHVtbkV4cG9ydFNldHRpbmdzIHwgbnVsbDtcbn07XG5leHBvcnQgdHlwZSBQcm9wZXJ0eVR5cGVDb25zdHJhaW50cyA9IFBhcnRpYWw8e1xuXHRzY2FsZTogbnVtYmVyO1xuXHRwcmVjaXNpb246IG51bWJlcjtcblx0bWF4TGVuZ3RoOiBudW1iZXI7XG5cdG51bGxhYmxlOiBib29sZWFuO1xuXHRtaW5pbXVtOiBzdHJpbmc7XG5cdG1heGltdW06IHN0cmluZztcblx0aXNEaWdpdFNlcXVlbmNlOiBib29sZWFuO1xufT47XG5leHBvcnQgdHlwZSBQcm9wZXJ0eVR5cGVGb3JtYXRPcHRpb25zID0gUGFydGlhbDx7XG5cdHBhcnNlQXNTdHJpbmc6IGJvb2xlYW47XG5cdGVtcHR5U3RyaW5nOiBzdHJpbmc7XG5cdHBhcnNlS2VlcHNFbXB0eVN0cmluZzogYm9vbGVhbjtcbn0+O1xuZXhwb3J0IHR5cGUgUHJvcGVydHlUeXBlQ29uZmlnID0ge1xuXHR0eXBlPzogc3RyaW5nO1xuXHRjb25zdHJhaW50czogUHJvcGVydHlUeXBlQ29uc3RyYWludHM7XG5cdGZvcm1hdE9wdGlvbnM6IFByb3BlcnR5VHlwZUZvcm1hdE9wdGlvbnM7XG5cdHR5cGVJbnN0YW5jZT86IHVua25vd247XG5cdGJhc2VUeXBlPzogc3RyaW5nO1xuXHRjbGFzc05hbWU/OiBrZXlvZiB0eXBlb2YgRGVmYXVsdFR5cGVGb3JFZG1UeXBlO1xufTtcbmV4cG9ydCB0eXBlIENvbHVtbkV4cG9ydFNldHRpbmdzID0gUGFydGlhbDx7XG5cdHRlbXBsYXRlOiBzdHJpbmc7XG5cdGxhYmVsOiBzdHJpbmc7XG5cdHdyYXA6IGJvb2xlYW47XG5cdHR5cGU6IHN0cmluZztcblx0aW5wdXRGb3JtYXQ6IHN0cmluZztcblx0Zm9ybWF0OiBzdHJpbmc7XG5cdHNjYWxlOiBudW1iZXI7XG5cdGRlbGltaXRlcjogYm9vbGVhbjtcblx0dW5pdDogc3RyaW5nO1xuXHR1bml0UHJvcGVydHk6IHN0cmluZztcblx0dGltZXpvbmU6IHN0cmluZztcblx0dGltZXpvbmVQcm9wZXJ0eTogc3RyaW5nO1xuXHR1dGM6IGJvb2xlYW47XG5cdGRhdGFQb2ludFRhcmdldFZhbHVlOiBzdHJpbmc7XG5cdGlzQ3VycmVuY3k6IGJvb2xlYW47XG5cdHByb3BlcnR5OiBzdHJpbmdbXTtcblx0d2lkdGg6IG51bWJlcjtcblx0YXV0b1NjYWxlOiBib29sZWFuO1xufT47XG4vLyBQcm9wZXJ0aWVzIGZvciBBbm5vdGF0aW9uIENvbHVtbnNcbmV4cG9ydCB0eXBlIEFubm90YXRpb25UYWJsZUNvbHVtbiA9IEFubm90YXRpb25UYWJsZUNvbHVtbkZvck92ZXJyaWRlICYge1xuXHRuYW1lOiBzdHJpbmc7XG5cdHByb3BlcnR5SW5mb3M/OiBzdHJpbmdbXTtcblx0YW5ub3RhdGlvblBhdGg6IHN0cmluZztcblx0cmVsYXRpdmVQYXRoOiBzdHJpbmc7XG5cdGxhYmVsPzogc3RyaW5nO1xuXHR0b29sdGlwPzogc3RyaW5nO1xuXHRncm91cExhYmVsPzogc3RyaW5nO1xuXHRncm91cD86IHN0cmluZztcblx0RmllbGRHcm91cEhpZGRlbkV4cHJlc3Npb25zPzogQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb247XG5cdHNob3dEYXRhRmllbGRzTGFiZWw/OiBib29sZWFuO1xuXHRyZXF1aXJlZD86IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uO1xuXHRpc0tleT86IGJvb2xlYW47XG5cdGlzR3JvdXBhYmxlPzogYm9vbGVhbjtcblx0dW5pdD86IHN0cmluZztcblx0dW5pdFRleHQ/OiBzdHJpbmc7XG5cdHRpbWV6b25lVGV4dD86IHN0cmluZztcblx0dGltZXpvbmU/OiBzdHJpbmc7XG5cdHNlbWFudGljT2JqZWN0UGF0aD86IHN0cmluZztcblx0c29ydGFibGU6IGJvb2xlYW47XG5cdGZpbHRlcmFibGU/OiBib29sZWFuO1xuXHRleHBvcnRTZXR0aW5ncz86IENvbHVtbkV4cG9ydFNldHRpbmdzIHwgbnVsbDtcblx0dGV4dEFycmFuZ2VtZW50Pzoge1xuXHRcdHRleHRQcm9wZXJ0eTogc3RyaW5nO1xuXHRcdG1vZGU6IERpc3BsYXlNb2RlO1xuXHR9O1xuXHRhZGRpdGlvbmFsUHJvcGVydHlJbmZvcz86IHN0cmluZ1tdO1xuXHR2aXN1YWxTZXR0aW5ncz86IFZpc3VhbFNldHRpbmdzO1xuXHR0eXBlQ29uZmlnPzogUHJvcGVydHlUeXBlQ29uZmlnO1xuXHRpc1BhcnRPZkxpbmVJdGVtPzogYm9vbGVhbjsgLy8gdGVtcG9yYXJ5IGluZGljYXRvciB0byBvbmx5IGFsbG93IGZpbHRlcmluZyBvbiBuYXZpZ2F0aW9uIHByb3BlcnRpZXMgd2hlbiB0aGV5J3JlIHBhcnQgb2YgYSBsaW5lIGl0ZW1cblx0YWRkaXRpb25hbExhYmVscz86IHN0cmluZ1tdO1xuXHRleHBvcnREYXRhUG9pbnRUYXJnZXRWYWx1ZT86IHN0cmluZztcblx0YWdncmVnYXRhYmxlPzogYm9vbGVhbjtcblx0ZXh0ZW5zaW9uPzogRXh0ZW5zaW9uRm9yQW5hbHl0aWNzO1xuXHRpc011bHRpVmFsdWU/OiBib29sZWFuO1xufTtcbmV4cG9ydCB0eXBlIEV4dGVuc2lvbkZvckFuYWx5dGljcyA9IHtcblx0YWRkaXRpb25hbFByb3BlcnRpZXM/OiBzdHJpbmdbXTtcbn07XG5leHBvcnQgdHlwZSBUZWNobmljYWxDb2x1bW4gPSBBbm5vdGF0aW9uVGFibGVDb2x1bW4gJiB7XG5cdGV4dGVuc2lvbj86IHtcblx0XHR0ZWNobmljYWxseUdyb3VwYWJsZTogYm9vbGVhbjtcblx0XHR0ZWNobmljYWxseUFnZ3JlZ2F0YWJsZTogYm9vbGVhbjtcblx0fTtcbn07XG5leHBvcnQgdHlwZSBWaXN1YWxTZXR0aW5ncyA9IHtcblx0d2lkdGhDYWxjdWxhdGlvbj86IFdpZHRoQ2FsY3VsYXRpb247XG59O1xuZXhwb3J0IHR5cGUgV2lkdGhDYWxjdWxhdGlvbiA9IG51bGwgfCB7XG5cdG1pbldpZHRoPzogbnVtYmVyO1xuXHRtYXhXaWR0aD86IG51bWJlcjtcblx0ZGVmYXVsdFdpZHRoPzogbnVtYmVyO1xuXHR0cnVuY2F0ZUxhYmVsPzogYm9vbGVhbjtcblx0Z2FwPzogbnVtYmVyO1xuXHQvLyBvbmx5IHJlbGV2YW50IGZvciBjb21wbGV4IHR5cGVzXG5cdGV4Y2x1ZGVQcm9wZXJ0aWVzPzogc3RyaW5nW107XG5cdHZlcnRpY2FsQXJyYW5nZW1lbnQ/OiBib29sZWFuO1xufTtcblxuZXhwb3J0IHR5cGUgVGFibGVDb2x1bW4gPSBDdXN0b21CYXNlZFRhYmxlQ29sdW1uIHwgQW5ub3RhdGlvblRhYmxlQ29sdW1uIHwgQ29tcHV0ZWRUYWJsZUNvbHVtbiB8IFRlY2huaWNhbENvbHVtbjtcbmV4cG9ydCB0eXBlIE1hbmlmZXN0Q29sdW1uID0gQ3VzdG9tRWxlbWVudDxDdXN0b21CYXNlZFRhYmxlQ29sdW1uIHwgQW5ub3RhdGlvblRhYmxlQ29sdW1uRm9yT3ZlcnJpZGU+O1xuZXhwb3J0IHR5cGUgSW50ZXJuYWxFeHRlbnNpb25Gb3JBbmFseXRpY3MgPSBFeHRlbnNpb25Gb3JBbmFseXRpY3MgJiB7XG5cdGZyb21Hcm91cGFibGVQcm9wZXJ0eTogYm9vbGVhbjtcblx0cmVsYXRpdmVQYXRoOiBzdHJpbmc7XG59O1xuZXhwb3J0IHR5cGUgVGFibGVWaXN1YWxpemF0aW9uID0ge1xuXHR0eXBlOiBWaXN1YWxpemF0aW9uVHlwZS5UYWJsZTtcblx0YW5ub3RhdGlvbjogVGFibGVBbm5vdGF0aW9uQ29uZmlndXJhdGlvbjtcblx0Y29udHJvbDogVGFibGVDb250cm9sQ29uZmlndXJhdGlvbjtcblx0Y29sdW1uczogVGFibGVDb2x1bW5bXTtcblx0YWN0aW9uczogQmFzZUFjdGlvbltdO1xuXHRjb21tYW5kQWN0aW9ucz86IFJlY29yZDxzdHJpbmcsIEN1c3RvbUFjdGlvbj47XG5cdGFuYWx5dGljc0V4dGVuc2lvbnM/OiBSZWNvcmQ8c3RyaW5nLCBJbnRlcm5hbEV4dGVuc2lvbkZvckFuYWx5dGljcz47XG5cdHJlcXVlc3RBdExlYXN0Pzogc3RyaW5nW107XG5cdGVuYWJsZUFuYWx5dGljcz86IGJvb2xlYW47XG5cdGVuYWJsZUJhc2ljU2VhcmNoPzogYm9vbGVhbjtcblx0b3BlcmF0aW9uQXZhaWxhYmxlTWFwOiBzdHJpbmc7XG5cdG9wZXJhdGlvbkF2YWlsYWJsZVByb3BlcnRpZXM6IHN0cmluZztcblx0aGVhZGVySW5mb1RpdGxlOiBzdHJpbmc7XG5cdHNlbWFudGljS2V5czogc3RyaW5nW107XG5cdGhlYWRlckluZm9UeXBlTmFtZTogUHJvcGVydHlBbm5vdGF0aW9uVmFsdWU8U3RyaW5nPiB8IHVuZGVmaW5lZDtcblx0ZW5hYmxlJHNlbGVjdDogYm9vbGVhbjtcblx0ZW5hYmxlJCRnZXRLZWVwQWxpdmVDb250ZXh0OiBib29sZWFuO1xuXHRpc0luc2lnaHRzRW5hYmxlZD86IGJvb2xlYW47XG5cdGhlYWRlcj86IHN0cmluZztcblx0aGVhZGVyVmlzaWJsZT86IGJvb2xlYW47XG5cdGNsZWFyU2VsZWN0aW9uT25GaWx0ZXI6IGJvb2xlYW47XG5cdGV2ZW50cz86IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD47XG59O1xuXG4vLyBtYXhpbXVtIG51bWJlciBvZiBpdGVtcyB0byBvcGVuIGluIG5ldyB0YWJzIHNpbXVsdGFub3VzbHlcbmNvbnN0IHNlbGVjdGlvbkxpbWl0Rm9yT3BlbkluTmV3VGFiID0gMTA7XG4vKipcbiAqIFJldHVybnMgYW4gYXJyYXkgb2YgYWxsIHN0YW5kYXJkLCBhbm5vdGF0aW9uLWJhc2VkLCBhbmQgbWFuaWZlc3QtYmFzZWQgdGFibGUgYWN0aW9ucy5cbiAqIEBwYXJhbSBsaW5lSXRlbUFubm90YXRpb25cbiAqIEBwYXJhbSB2aXN1YWxpemF0aW9uUGF0aFxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHRcbiAqIEBwYXJhbSBzdGFuZGFyZEFjdGlvbnNcbiAqIEBwYXJhbSBuYXZpZ2F0aW9uU2V0dGluZ3NcbiAqIEByZXR1cm5zIFRoZSBjb21wbGV0ZSB0YWJsZSBhY3Rpb25zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRUYWJsZUFjdGlvbnMoXG5cdGxpbmVJdGVtQW5ub3RhdGlvbjogTGluZUl0ZW0sXG5cdHZpc3VhbGl6YXRpb25QYXRoOiBzdHJpbmcsXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pixcblx0c3RhbmRhcmRBY3Rpb25zOiBTdGFuZGFyZEFjdGlvbnNDb25maWd1cmF0aW9uW1wic3RhbmRhcmRBY3Rpb25zXCJdLFxuXHRuYXZpZ2F0aW9uU2V0dGluZ3M/OiBOYXZpZ2F0aW9uU2V0dGluZ3NDb25maWd1cmF0aW9uXG4pOiBDb21iaW5lZEFjdGlvbiB7XG5cdGNvbnN0IHRhYmxlQWN0aW9ucyA9IGdldFRhYmxlQW5ub3RhdGlvbkFjdGlvbnMobGluZUl0ZW1Bbm5vdGF0aW9uLCB2aXN1YWxpemF0aW9uUGF0aCwgY29udmVydGVyQ29udGV4dCk7XG5cdGNvbnN0IG1hbmlmZXN0QWN0aW9ucyA9IGdldEFjdGlvbnNGcm9tTWFuaWZlc3QoXG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXRNYW5pZmVzdENvbnRyb2xDb25maWd1cmF0aW9uPFRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uPih2aXN1YWxpemF0aW9uUGF0aCkuYWN0aW9ucyBhcyBSZWNvcmQ8XG5cdFx0XHRzdHJpbmcsXG5cdFx0XHRNYW5pZmVzdEFjdGlvblxuXHRcdD4sXG5cdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHR0YWJsZUFjdGlvbnMudGFibGVBY3Rpb25zLFxuXHRcdG5hdmlnYXRpb25TZXR0aW5ncyxcblx0XHR0cnVlXG5cdCk7XG5cdC8vIFRoZSBcIkNvcHlcIiBhY3Rpb24gYWx3YXlzIG5lZWRzIHRvIGJlIHBsYWNlZCBhZnRlciB0aGUgXCJDcmVhdGVcIiBhY3Rpb24sIHNvIHdlIG5lZWQgdG8gc2VwYXJhdGUgaXRcblx0Y29uc3QgY29weUFjdGlvbnMgPSB0YWJsZUFjdGlvbnMudGFibGVBY3Rpb25zLmZpbHRlcigoYSkgPT4gYS50eXBlID09PSBBY3Rpb25UeXBlLkNvcHkpO1xuXHRjb25zdCBhbm5vdGF0aW9uQWN0aW9ucyA9IHRhYmxlQWN0aW9ucy50YWJsZUFjdGlvbnMuZmlsdGVyKChhKSA9PiBhLnR5cGUgIT09IEFjdGlvblR5cGUuQ29weSk7XG5cdC8vIENvbWJpbmUgc3RhbmRhcmQsIGFubm90YXRpb24sIGFuZCBjdXN0b20gYWN0aW9ucyB0b2dldGhlciwgcmVzcGVjdGluZyB0aGUgZml4ZWQgb3JkZXIgb2Ygc3RhbmRhcmQgYWN0aW9uc1xuXHRjb25zdCBhbm5vdGF0aW9uQW5kU3RhbmRhcmRBY3Rpb25zID0gKFxuXHRcdFtcblx0XHRcdC4uLmFubm90YXRpb25BY3Rpb25zLFxuXHRcdFx0c3RhbmRhcmRBY3Rpb25zLmNyZWF0ZSxcblx0XHRcdC4uLmNvcHlBY3Rpb25zLFxuXHRcdFx0c3RhbmRhcmRBY3Rpb25zLmRlbGV0ZSxcblx0XHRcdHN0YW5kYXJkQWN0aW9ucy5tYXNzRWRpdCxcblx0XHRcdHN0YW5kYXJkQWN0aW9ucy5pbnNpZ2h0cyxcblx0XHRcdHN0YW5kYXJkQWN0aW9ucy5jcmVhdGlvblJvdywgLy8gTm90IHRlbXBsYXRlZCBhcyBhIGJ1dHRvblxuXHRcdFx0c3RhbmRhcmRBY3Rpb25zLmN1dCxcblx0XHRcdHN0YW5kYXJkQWN0aW9ucy5wYXN0ZSxcblx0XHRcdHN0YW5kYXJkQWN0aW9ucy5tb3ZlVXAsXG5cdFx0XHRzdGFuZGFyZEFjdGlvbnMubW92ZURvd25cblx0XHRdIGFzIEJhc2VBY3Rpb25bXVxuXHQpLmZpbHRlcigoYWN0aW9uKSA9PiBhY3Rpb24gIT09IHVuZGVmaW5lZCk7XG5cdC8vIEFuY2hvciBhbGwgbm9uLWFuY2hvcmVkIG1hbmlmZXN0IGN1c3RvbSBhY3Rpb25zL21lbnVzIGJlZm9yZSB0aGUgc3RhbmRhcmQgYWN0aW9uc1xuXHRmb3IgKGNvbnN0IG1hbmlmZXN0QWN0aW9uIG9mIE9iamVjdC52YWx1ZXMobWFuaWZlc3RBY3Rpb25zLmFjdGlvbnMpKSB7XG5cdFx0aWYgKChtYW5pZmVzdEFjdGlvbi50eXBlID09PSBBY3Rpb25UeXBlLkRlZmF1bHQgfHwgbWFuaWZlc3RBY3Rpb24udHlwZSA9PT0gQWN0aW9uVHlwZS5NZW51KSAmJiAhbWFuaWZlc3RBY3Rpb24ucG9zaXRpb24/LmFuY2hvcikge1xuXHRcdFx0bWFuaWZlc3RBY3Rpb24ucG9zaXRpb24gPSB7XG5cdFx0XHRcdGFuY2hvcjogU3RhbmRhcmRBY3Rpb25LZXlzLkNyZWF0ZSxcblx0XHRcdFx0cGxhY2VtZW50OiBQbGFjZW1lbnQuQmVmb3JlXG5cdFx0XHR9O1xuXHRcdH1cblx0fVxuXHQvLyBJbnNlcnQgdHdpY2UgdG8gYWxsb3cgcmVndWxhciBvdmVycmlkZSBmb3Igbm9uLXN0YW5kYXJkIGFjdGlvbnMgYW5kIHBvc2l0aW9uYWwgb3ZlcnJpZGUgZm9yIHN0YW5kYXJkIGFjdGlvbnNcblx0Y29uc3QgbWFuaWZlc3RBY3Rpb25FbnRyaWVzID0gT2JqZWN0LmVudHJpZXMobWFuaWZlc3RBY3Rpb25zLmFjdGlvbnMpO1xuXHRjb25zdCBzdGFuZGFyZE1hbmlmZXN0QWN0aW9ucyA9IE9iamVjdC5mcm9tRW50cmllcyhtYW5pZmVzdEFjdGlvbkVudHJpZXMuZmlsdGVyKChba2V5XSkgPT4ga2V5LnN0YXJ0c1dpdGgoXCJTdGFuZGFyZEFjdGlvbjo6XCIpKSk7XG5cdGNvbnN0IG5vblN0YW5kYXJkTWFuaWZlc3RBY3Rpb25zID0gT2JqZWN0LmZyb21FbnRyaWVzKG1hbmlmZXN0QWN0aW9uRW50cmllcy5maWx0ZXIoKFtrZXldKSA9PiAhc3RhbmRhcmRNYW5pZmVzdEFjdGlvbnNba2V5XSkpO1xuXHRjb25zdCBhY3Rpb25PdmVyd3JpdGVDb25maWc6IE92ZXJyaWRlVHlwZUFjdGlvbiA9IHtcblx0XHRpc05hdmlnYWJsZTogT3ZlcnJpZGVUeXBlLm92ZXJ3cml0ZSxcblx0XHRlbmFibGVPblNlbGVjdDogT3ZlcnJpZGVUeXBlLm92ZXJ3cml0ZSxcblx0XHRlbmFibGVBdXRvU2Nyb2xsOiBPdmVycmlkZVR5cGUub3ZlcndyaXRlLFxuXHRcdGVuYWJsZWQ6IE92ZXJyaWRlVHlwZS5vdmVyd3JpdGUsXG5cdFx0dmlzaWJsZTogT3ZlcnJpZGVUeXBlLm92ZXJ3cml0ZSxcblx0XHR2aXNpYmxlRm9yQ29udGV4dE1lbnU6IE92ZXJyaWRlVHlwZS5vdmVyd3JpdGUsXG5cdFx0ZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uOiBPdmVycmlkZVR5cGUub3ZlcndyaXRlLFxuXHRcdGNvbW1hbmQ6IE92ZXJyaWRlVHlwZS5vdmVyd3JpdGUsXG5cdFx0cG9zaXRpb246IE92ZXJyaWRlVHlwZS5vdmVyd3JpdGVcblx0fTtcblx0bGV0IGFjdGlvbnMgPSBpbnNlcnRDdXN0b21FbGVtZW50cyhhbm5vdGF0aW9uQW5kU3RhbmRhcmRBY3Rpb25zLCBub25TdGFuZGFyZE1hbmlmZXN0QWN0aW9ucywgYWN0aW9uT3ZlcndyaXRlQ29uZmlnKTtcblx0YWN0aW9ucyA9IGluc2VydEN1c3RvbUVsZW1lbnRzKGFjdGlvbnMsIHN0YW5kYXJkTWFuaWZlc3RBY3Rpb25zLCB7XG5cdFx0cG9zaXRpb246IE92ZXJyaWRlVHlwZS5vdmVyd3JpdGVcblx0fSk7XG5cdHJldHVybiB7XG5cdFx0YWN0aW9ucyxcblx0XHRjb21tYW5kQWN0aW9uczogbWFuaWZlc3RBY3Rpb25zLmNvbW1hbmRBY3Rpb25zXG5cdH07XG59XG4vKipcbiAqIFJldHVybnMgYW4gYXJyYXkgb2YgYWxsIGNvbHVtbnMsIGFubm90YXRpb24tYmFzZWQgYXMgd2VsbCBhcyBtYW5pZmVzdC1iYXNlZC5cbiAqIFRoZXkgYXJlIHNvcnRlZCBhbmQgc29tZSBwcm9wZXJ0aWVzIGNhbiBiZSBvdmVyd3JpdHRlbiB2aWEgdGhlIG1hbmlmZXN0IChjaGVjayBvdXQgdGhlIGtleXMgdGhhdCBjYW4gYmUgb3ZlcndyaXR0ZW4pLlxuICogQHBhcmFtIGxpbmVJdGVtQW5ub3RhdGlvbiBDb2xsZWN0aW9uIG9mIGRhdGEgZmllbGRzIGZvciByZXByZXNlbnRhdGlvbiBpbiBhIHRhYmxlIG9yIGxpc3RcbiAqIEBwYXJhbSB2aXN1YWxpemF0aW9uUGF0aFxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHRcbiAqIEBwYXJhbSBuYXZpZ2F0aW9uU2V0dGluZ3NcbiAqIEByZXR1cm5zIFJldHVybnMgYWxsIHRhYmxlIGNvbHVtbnMgdGhhdCBzaG91bGQgYmUgYXZhaWxhYmxlLCByZWdhcmRsZXNzIG9mIHRlbXBsYXRpbmcgb3IgcGVyc29uYWxpemF0aW9uIG9yIHRoZWlyIG9yaWdpblxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGFibGVDb2x1bW5zKFxuXHRsaW5lSXRlbUFubm90YXRpb246IExpbmVJdGVtLFxuXHR2aXN1YWxpemF0aW9uUGF0aDogc3RyaW5nLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sXG5cdG5hdmlnYXRpb25TZXR0aW5ncz86IE5hdmlnYXRpb25TZXR0aW5nc0NvbmZpZ3VyYXRpb25cbik6IFRhYmxlQ29sdW1uW10ge1xuXHRjb25zdCBhbm5vdGF0aW9uQ29sdW1ucyA9IGdldENvbHVtbnNGcm9tQW5ub3RhdGlvbnMobGluZUl0ZW1Bbm5vdGF0aW9uLCB2aXN1YWxpemF0aW9uUGF0aCwgY29udmVydGVyQ29udGV4dCk7XG5cdGNvbnN0IG1hbmlmZXN0Q29sdW1ucyA9IGdldENvbHVtbnNGcm9tTWFuaWZlc3QoXG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXRNYW5pZmVzdENvbnRyb2xDb25maWd1cmF0aW9uPFRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uPih2aXN1YWxpemF0aW9uUGF0aCkuY29sdW1ucyA/PyB7fSxcblx0XHRhbm5vdGF0aW9uQ29sdW1ucyxcblx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0QW5ub3RhdGlvbkVudGl0eVR5cGUobGluZUl0ZW1Bbm5vdGF0aW9uKSxcblx0XHRuYXZpZ2F0aW9uU2V0dGluZ3Ncblx0KTtcblxuXHRjb25zdCB0YWJsZUNvbHVtbnM6IFRhYmxlQ29sdW1uW10gPSBpbnNlcnRDdXN0b21FbGVtZW50cyhcblx0XHRhbm5vdGF0aW9uQ29sdW1ucyBhcyBUYWJsZUNvbHVtbltdLFxuXHRcdG1hbmlmZXN0Q29sdW1ucyBhcyBSZWNvcmQ8c3RyaW5nLCBDdXN0b21FbGVtZW50PFRhYmxlQ29sdW1uPj4sXG5cdFx0e1xuXHRcdFx0d2lkdGg6IE92ZXJyaWRlVHlwZS5vdmVyd3JpdGUsXG5cdFx0XHR3aWR0aEluY2x1ZGluZ0NvbHVtbkhlYWRlcjogT3ZlcnJpZGVUeXBlLm92ZXJ3cml0ZSxcblx0XHRcdGltcG9ydGFuY2U6IE92ZXJyaWRlVHlwZS5vdmVyd3JpdGUsXG5cdFx0XHRob3Jpem9udGFsQWxpZ246IE92ZXJyaWRlVHlwZS5vdmVyd3JpdGUsXG5cdFx0XHRhdmFpbGFiaWxpdHk6IE92ZXJyaWRlVHlwZS5vdmVyd3JpdGUsXG5cdFx0XHRpc05hdmlnYWJsZTogT3ZlcnJpZGVUeXBlLm92ZXJ3cml0ZSxcblx0XHRcdHNldHRpbmdzOiBPdmVycmlkZVR5cGUub3ZlcndyaXRlLFxuXHRcdFx0Zm9ybWF0T3B0aW9uczogT3ZlcnJpZGVUeXBlLm92ZXJ3cml0ZSxcblx0XHRcdGV4cG9ydFNldHRpbmdzOiBPdmVycmlkZVR5cGUub3ZlcndyaXRlXG5cdFx0fVxuXHQpO1xuXG5cdHJldHVybiBhZGRDb21wdXRlZENvbHVtbnModGFibGVDb2x1bW5zLCB2aXN1YWxpemF0aW9uUGF0aCwgY29udmVydGVyQ29udGV4dCk7XG59XG5cbi8vUmV0dXJucyB0aGUgQ29udGV4dERlZmluaW5nUHJvcGVydGllcyBmcm9tIHRoZSBjdXN0b20gYWdncmVnYXRlIGFubm90YXRpb24gb3IgZnJvbSB0aGUgYWdncmVnYXRpb24gYW5ub3RhdGlvbiBvbiB0aGUgcHJvcGVydHkgaXRzZWxmLlxuZnVuY3Rpb24gZ2V0Q29udGV4dERlZmluaW5nUHJvcGVydGllc0Zyb21BZ2dyZWdhdGlvbkFubm90YXRpb24oYWdncmVnYXRpb25IZWxwZXI6IEFnZ3JlZ2F0aW9uSGVscGVyKTogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+IHtcblx0Y29uc3QgY3VzdG9tQWdncmVnYXRlQW5ub3RhdGlvbnMgPSBhZ2dyZWdhdGlvbkhlbHBlci5nZXRDdXN0b21BZ2dyZWdhdGVEZWZpbml0aW9ucygpO1xuXHRjb25zdCBjdXN0b21BZ2dyZWdhdGVkZWZpbml0aW9uczogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+ID0ge307XG5cdGN1c3RvbUFnZ3JlZ2F0ZUFubm90YXRpb25zLmZvckVhY2goKGFubm90YXRpb24pID0+IHtcblx0XHRjb25zdCBhZ2dyZWdhdGVkUHJvcGVydHkgPSBhZ2dyZWdhdGlvbkhlbHBlci5fZW50aXR5VHlwZS5lbnRpdHlQcm9wZXJ0aWVzLmZpbmQoKHByb3BlcnR5KSA9PiB7XG5cdFx0XHRyZXR1cm4gcHJvcGVydHkubmFtZSA9PT0gYW5ub3RhdGlvbi5xdWFsaWZpZXI7XG5cdFx0fSk7XG5cdFx0aWYgKGFnZ3JlZ2F0ZWRQcm9wZXJ0eSkge1xuXHRcdFx0Y29uc3QgY29udGV4dERlZmluaW5nUHJvcGVydGllcyA9XG5cdFx0XHRcdGFubm90YXRpb24uYW5ub3RhdGlvbnM/LkFnZ3JlZ2F0aW9uPy5Db250ZXh0RGVmaW5pbmdQcm9wZXJ0aWVzID8/XG5cdFx0XHRcdGFnZ3JlZ2F0ZWRQcm9wZXJ0eS5hbm5vdGF0aW9ucy5BZ2dyZWdhdGlvbj8uQ29udGV4dERlZmluaW5nUHJvcGVydGllcztcblx0XHRcdGN1c3RvbUFnZ3JlZ2F0ZWRlZmluaXRpb25zW2FnZ3JlZ2F0ZWRQcm9wZXJ0eS5uYW1lXSA9XG5cdFx0XHRcdGNvbnRleHREZWZpbmluZ1Byb3BlcnRpZXM/Lm1hcCgoY3R4RGVmUHJvcGVydHkpID0+IGN0eERlZlByb3BlcnR5LnZhbHVlKSA/PyBbXTtcblx0XHR9XG5cdH0pO1xuXHRyZXR1cm4gY3VzdG9tQWdncmVnYXRlZGVmaW5pdGlvbnM7XG59XG5cbi8qKlxuICogUmV0cmlldmUgdGhlIGV4dGVuc2lvbiBpbmZvcm1hdGlvbiBmb3IgYWxsIGFnZ3JlZ2FibGUgcHJvcGVydGllcyAuXG4gKiBAcGFyYW0gZW50aXR5VHlwZSBUaGUgdGFyZ2V0IGVudGl0eSB0eXBlLlxuICogQHBhcmFtIHRhYmxlQ29sdW1ucyBUaGUgYXJyYXkgb2YgY29sdW1ucyBmb3IgdGhlIGVudGl0eSB0eXBlLlxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGNvbnZlcnRlciBjb250ZXh0LlxuICogQHJldHVybnMgVGhlIGFnZ3JlZ2F0ZSBkZWZpbml0aW9ucyBmcm9tIHRoZSBlbnRpdHlUeXBlLCBvciB1bmRlZmluZWQgaWYgdGhlIGVudGl0eSBkb2Vzbid0IHN1cHBvcnQgYW5hbHl0aWNhbCBxdWVyaWVzLlxuICovXG5leHBvcnQgY29uc3QgZ2V0RXh0ZW5zaW9uSW5mb0Zyb21FbnRpdHlUeXBlID0gZnVuY3Rpb24gKFxuXHRlbnRpdHlUeXBlOiBFbnRpdHlUeXBlLFxuXHR0YWJsZUNvbHVtbnM6IFRhYmxlQ29sdW1uW10sXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0PlxuKTogUmVjb3JkPHN0cmluZywgSW50ZXJuYWxFeHRlbnNpb25Gb3JBbmFseXRpY3M+IHwgdW5kZWZpbmVkIHtcblx0Y29uc3QgYWdncmVnYXRpb25IZWxwZXIgPSBuZXcgQWdncmVnYXRpb25IZWxwZXIoZW50aXR5VHlwZSwgY29udmVydGVyQ29udGV4dCk7XG5cdGlmICghYWdncmVnYXRpb25IZWxwZXIuaXNBbmFseXRpY3NTdXBwb3J0ZWQoKSkge1xuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblx0Ly8gS2VlcCBhIHNldCBvZiBhbGwgY3VycmVuY3kvdW5pdCBwcm9wZXJ0aWVzLCBhcyB3ZSBkb24ndCB3YW50IHRvIGNvbnNpZGVyIHRoZW0gYXMgYWdncmVnYXRlc1xuXHQvLyBUaGV5IGFyZSBhZ2dyZWdhdGVzIGZvciB0ZWNobmljYWwgcmVhc29ucyAodG8gbWFuYWdlIG11bHRpLXVuaXRzIHNpdHVhdGlvbnMpIGJ1dCBpdCBkb2Vzbid0IG1ha2Ugc2Vuc2UgZnJvbSBhIHVzZXIgc3RhbmRwb2ludFxuXHRjb25zdCBjdXJyZW5jeU9yVW5pdFByb3BlcnRpZXMgPSBuZXcgU2V0KCk7XG5cdHRhYmxlQ29sdW1ucy5mb3JFYWNoKChjb2x1bW4pID0+IHtcblx0XHRjb25zdCB0YWJsZUNvbHVtbiA9IGNvbHVtbiBhcyBBbm5vdGF0aW9uVGFibGVDb2x1bW47XG5cdFx0aWYgKHRhYmxlQ29sdW1uLnVuaXQpIHtcblx0XHRcdGNvbnN0IHRhcmdldFVuaXRQcm9wZXJ0eSA9IHRhYmxlQ29sdW1ucy5maW5kKChwcm9wKSA9PiBwcm9wLm5hbWUgPT09IHRhYmxlQ29sdW1uLnVuaXQpIGFzIEFubm90YXRpb25UYWJsZUNvbHVtbjtcblx0XHRcdGN1cnJlbmN5T3JVbml0UHJvcGVydGllcy5hZGQodGFyZ2V0VW5pdFByb3BlcnR5LnJlbGF0aXZlUGF0aCk7XG5cdFx0fVxuXHR9KTtcblx0Y29uc3QgY29udGV4dERlZmluaW5nUHJvcGVydGllc0Zyb21BZ2dyZWdhdGlvbiA9IGdldENvbnRleHREZWZpbmluZ1Byb3BlcnRpZXNGcm9tQWdncmVnYXRpb25Bbm5vdGF0aW9uKGFnZ3JlZ2F0aW9uSGVscGVyKTtcblx0Y29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCBJbnRlcm5hbEV4dGVuc2lvbkZvckFuYWx5dGljcz4gPSB7fTtcblx0dGFibGVDb2x1bW5zLmZvckVhY2goKGNvbHVtbikgPT4ge1xuXHRcdGNvbnN0IHRhYmxlQ29sdW1uID0gY29sdW1uIGFzIEFubm90YXRpb25UYWJsZUNvbHVtbjtcblx0XHRjb25zdCBwcm9wZXJ0eSA9IGVudGl0eVR5cGUuZW50aXR5UHJvcGVydGllcy5maW5kKChwcm9wKSA9PiBwcm9wLm5hbWUgPT09IHRhYmxlQ29sdW1uLnJlbGF0aXZlUGF0aCk7XG5cdFx0aWYgKHRhYmxlQ29sdW1uLnByb3BlcnR5SW5mb3MgPT09IHVuZGVmaW5lZCAmJiB0YWJsZUNvbHVtbi5yZWxhdGl2ZVBhdGgpIHtcblx0XHRcdGxldCByYXdDb250ZXh0RGVmaW5pbmdQcm9wZXJ0aWVzID0gY29udGV4dERlZmluaW5nUHJvcGVydGllc0Zyb21BZ2dyZWdhdGlvblt0YWJsZUNvbHVtbi5yZWxhdGl2ZVBhdGhdIGFzIHN0cmluZ1tdIHwgdW5kZWZpbmVkO1xuXG5cdFx0XHQvLyBpZiB0aGVyZSBpcyBubyBjdXN0b20gYWdncmVnYXRlIGRlZmluaXRpb24sIGFuZCB0aGUgcHJvcGVydHkgaXMgZ3JvdXBhYmxlLCB0aGVuIHdlIGNhbiB1c2UgdGhlIGRlZmF1bHQgY29udGV4dCBkZWZpbmluZyBwcm9wZXJ0aWVzXG5cdFx0XHRsZXQgZnJvbUdyb3VwYWJsZVByb3BlcnR5ID0gZmFsc2U7XG5cdFx0XHRpZiAoIXJhd0NvbnRleHREZWZpbmluZ1Byb3BlcnRpZXMgJiYgcHJvcGVydHkgJiYgISFhZ2dyZWdhdGlvbkhlbHBlci5pc1Byb3BlcnR5R3JvdXBhYmxlKHByb3BlcnR5KSkge1xuXHRcdFx0XHRmcm9tR3JvdXBhYmxlUHJvcGVydHkgPSB0cnVlO1xuXHRcdFx0XHRyYXdDb250ZXh0RGVmaW5pbmdQcm9wZXJ0aWVzID0gcHJvcGVydHkuYW5ub3RhdGlvbnMuQWdncmVnYXRpb24/LkNvbnRleHREZWZpbmluZ1Byb3BlcnRpZXM/Lm1hcChcblx0XHRcdFx0XHQoY3R4RGVmUHJvcGVydHkpID0+IGN0eERlZlByb3BlcnR5LnZhbHVlXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0XHQvLyBJZ25vcmUgYWdncmVnYXRlcyBjb3JyZXNwb25kaW5nIHRvIGN1cnJlbmNpZXMgb3IgdW5pdHMgb2YgbWVhc3VyZVxuXHRcdFx0aWYgKHJhd0NvbnRleHREZWZpbmluZ1Byb3BlcnRpZXMgJiYgIWN1cnJlbmN5T3JVbml0UHJvcGVydGllcy5oYXModGFibGVDb2x1bW4ucmVsYXRpdmVQYXRoKSkge1xuXHRcdFx0XHRyZXN1bHRbdGFibGVDb2x1bW4ubmFtZV0gPSB7XG5cdFx0XHRcdFx0ZnJvbUdyb3VwYWJsZVByb3BlcnR5OiBmcm9tR3JvdXBhYmxlUHJvcGVydHksXG5cdFx0XHRcdFx0cmVsYXRpdmVQYXRoOiB0YWJsZUNvbHVtbi5yZWxhdGl2ZVBhdGhcblx0XHRcdFx0fTtcblx0XHRcdFx0Y29uc3QgY29udGV4dERlZmluaW5nUHJvcGVydGllczogc3RyaW5nW10gPSBbXTtcblx0XHRcdFx0cmF3Q29udGV4dERlZmluaW5nUHJvcGVydGllcy5mb3JFYWNoKChjb250ZXh0RGVmaW5pbmdQcm9wZXJ0eU5hbWUpID0+IHtcblx0XHRcdFx0XHQvLyBJZ25vcmUgY29udGV4dGRlZmluaW5ncHJvcGVydGllcyBjb3JyZXNwb25kaW5nIHRvIGN1cnJlbmNpZXMgb3IgdW5pdHMgb2YgbWVhc3VyZVxuXHRcdFx0XHRcdGlmIChjdXJyZW5jeU9yVW5pdFByb3BlcnRpZXMuaGFzKGNvbnRleHREZWZpbmluZ1Byb3BlcnR5TmFtZSkpIHtcblx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Y29uc3QgZm91bmRDb2x1bW4gPSBmaW5kQ29sdW1uQnlQYXRoKGNvbnRleHREZWZpbmluZ1Byb3BlcnR5TmFtZSwgdGFibGVDb2x1bW5zKTtcblx0XHRcdFx0XHRpZiAoZm91bmRDb2x1bW4pIHtcblx0XHRcdFx0XHRcdGNvbnRleHREZWZpbmluZ1Byb3BlcnRpZXMucHVzaChmb3VuZENvbHVtbi5uYW1lKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRpZiAoY29udGV4dERlZmluaW5nUHJvcGVydGllcy5sZW5ndGgpIHtcblx0XHRcdFx0XHRyZXN1bHRbdGFibGVDb2x1bW4ubmFtZV0uYWRkaXRpb25hbFByb3BlcnRpZXMgPSBjb250ZXh0RGVmaW5pbmdQcm9wZXJ0aWVzO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9KTtcblx0cmV0dXJuIHJlc3VsdDtcbn07XG4vKipcbiAqIFVwZGF0ZXMgYSB0YWJsZSB2aXN1YWxpemF0aW9uIGZvciBhbmFseXRpY2FsIHVzZSBjYXNlcy5cbiAqIEBwYXJhbSB0YWJsZVZpc3VhbGl6YXRpb24gVGhlIHZpc3VhbGl6YXRpb24gdG8gYmUgdXBkYXRlZFxuICogQHBhcmFtIGVudGl0eVR5cGUgVGhlIGVudGl0eSB0eXBlIGRpc3BsYXllZCBpbiB0aGUgdGFibGVcbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHBhcmFtIHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uIFRoZSBwcmVzZW50YXRpb25WYXJpYW50IGFubm90YXRpb24gKGlmIGFueSlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZVRhYmxlVmlzdWFsaXphdGlvbkZvclR5cGUoXG5cdHRhYmxlVmlzdWFsaXphdGlvbjogVGFibGVWaXN1YWxpemF0aW9uLFxuXHRlbnRpdHlUeXBlOiBFbnRpdHlUeXBlLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sXG5cdHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uPzogUHJlc2VudGF0aW9uVmFyaWFudFR5cGVcbik6IHZvaWQge1xuXHRpZiAodGFibGVWaXN1YWxpemF0aW9uLmNvbnRyb2wudHlwZSA9PT0gXCJBbmFseXRpY2FsVGFibGVcIikge1xuXHRcdGNvbnN0IGFnZ3JlZ2F0aW9uRGF0YSA9IGdldEV4dGVuc2lvbkluZm9Gcm9tRW50aXR5VHlwZShlbnRpdHlUeXBlLCB0YWJsZVZpc3VhbGl6YXRpb24uY29sdW1ucywgY29udmVydGVyQ29udGV4dCksXG5cdFx0XHRhZ2dyZWdhdGlvbkhlbHBlciA9IG5ldyBBZ2dyZWdhdGlvbkhlbHBlcihlbnRpdHlUeXBlLCBjb252ZXJ0ZXJDb250ZXh0KTtcblx0XHRpZiAoYWdncmVnYXRpb25EYXRhKSB7XG5cdFx0XHR0YWJsZVZpc3VhbGl6YXRpb24uZW5hYmxlQW5hbHl0aWNzID0gdHJ1ZTtcblx0XHRcdHRhYmxlVmlzdWFsaXphdGlvbi5lbmFibGUkc2VsZWN0ID0gZmFsc2U7XG5cdFx0XHR0YWJsZVZpc3VhbGl6YXRpb24uZW5hYmxlJCRnZXRLZWVwQWxpdmVDb250ZXh0ID0gZmFsc2U7XG5cdFx0XHR0YWJsZVZpc3VhbGl6YXRpb24uYW5hbHl0aWNzRXh0ZW5zaW9ucyA9IGFnZ3JlZ2F0aW9uRGF0YTtcblx0XHRcdF91cGRhdGVQcm9wZXJ0eUluZm9zV2l0aEFnZ3JlZ2F0ZXNEZWZpbml0aW9ucyh0YWJsZVZpc3VhbGl6YXRpb24pO1xuXHRcdFx0Y29uc3QgYWxsb3dlZFRyYW5zZm9ybWF0aW9ucyA9IGFnZ3JlZ2F0aW9uSGVscGVyLmdldEFsbG93ZWRUcmFuc2Zvcm1hdGlvbnMoKTtcblx0XHRcdHRhYmxlVmlzdWFsaXphdGlvbi5lbmFibGVCYXNpY1NlYXJjaCA9IGFsbG93ZWRUcmFuc2Zvcm1hdGlvbnMgPyBhbGxvd2VkVHJhbnNmb3JtYXRpb25zLmluY2x1ZGVzKFwic2VhcmNoXCIpIDogdHJ1ZTtcblx0XHRcdC8vIEFkZCBncm91cCBhbmQgc29ydCBjb25kaXRpb25zIGZyb20gdGhlIHByZXNlbnRhdGlvbiB2YXJpYW50XG5cdFx0XHR0YWJsZVZpc3VhbGl6YXRpb24uYW5ub3RhdGlvbi5ncm91cENvbmRpdGlvbnMgPSBnZXRHcm91cENvbmRpdGlvbnMoXG5cdFx0XHRcdHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uLFxuXHRcdFx0XHR0YWJsZVZpc3VhbGl6YXRpb24uY29sdW1ucyxcblx0XHRcdFx0dGFibGVWaXN1YWxpemF0aW9uLmNvbnRyb2wudHlwZVxuXHRcdFx0KTtcblx0XHRcdHRhYmxlVmlzdWFsaXphdGlvbi5hbm5vdGF0aW9uLmFnZ3JlZ2F0ZUNvbmRpdGlvbnMgPSBnZXRBZ2dyZWdhdGVDb25kaXRpb25zKFxuXHRcdFx0XHRwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbixcblx0XHRcdFx0dGFibGVWaXN1YWxpemF0aW9uLmNvbHVtbnMsXG5cdFx0XHRcdGFnZ3JlZ2F0aW9uRGF0YVxuXHRcdFx0KTtcblxuXHRcdFx0aWYgKE1vZGVsSGVscGVyLmlzT2JqZWN0UGF0aERyYWZ0U3VwcG9ydGVkKGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpKSkge1xuXHRcdFx0XHQvLyBGb3IgYW4gYW5hbHl0aWNhbCB0YWJsZSBkaXNwbGF5aW5nIGEgZHJhZnQtZW5hYmxlZCBlbnRpdHksIHdlIGFsd2F5cyBsb2FkICdIYXNBY3RpdmVFbnRpdHknXG5cdFx0XHRcdC8vIGJlY2F1c2UgaXQncyBuZWVkZWQgZm9yIHRoZSByb3cgY3JpdGljYWxpdHkgZXhwcmVzc2lvblxuXHRcdFx0XHRpZiAodGFibGVWaXN1YWxpemF0aW9uLnJlcXVlc3RBdExlYXN0KSB7XG5cdFx0XHRcdFx0dGFibGVWaXN1YWxpemF0aW9uLnJlcXVlc3RBdExlYXN0LnB1c2goXCJIYXNBY3RpdmVFbnRpdHlcIik7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dGFibGVWaXN1YWxpemF0aW9uLnJlcXVlc3RBdExlYXN0ID0gW1wiSGFzQWN0aXZlRW50aXR5XCJdO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHRhYmxlVmlzdWFsaXphdGlvbi5jb250cm9sLnR5cGUgPSBcIkdyaWRUYWJsZVwiOyAvLyBBbmFseXRpY2FsVGFibGUgaXNuJ3QgYSByZWFsIHR5cGUgZm9yIHRoZSBNREM6VGFibGUsIHNvIHdlIGFsd2F5cyBzd2l0Y2ggYmFjayB0byBHcmlkXG5cdH0gZWxzZSBpZiAodGFibGVWaXN1YWxpemF0aW9uLmNvbnRyb2wudHlwZSA9PT0gXCJSZXNwb25zaXZlVGFibGVcIikge1xuXHRcdHRhYmxlVmlzdWFsaXphdGlvbi5hbm5vdGF0aW9uLmdyb3VwQ29uZGl0aW9ucyA9IGdldEdyb3VwQ29uZGl0aW9ucyhcblx0XHRcdHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uLFxuXHRcdFx0dGFibGVWaXN1YWxpemF0aW9uLmNvbHVtbnMsXG5cdFx0XHR0YWJsZVZpc3VhbGl6YXRpb24uY29udHJvbC50eXBlXG5cdFx0KTtcblx0fSBlbHNlIGlmICh0YWJsZVZpc3VhbGl6YXRpb24uY29udHJvbC50eXBlID09PSBcIlRyZWVUYWJsZVwiKSB7XG5cdFx0Y29uc3QgYWdncmVnYXRpb25IZWxwZXIgPSBuZXcgQWdncmVnYXRpb25IZWxwZXIoZW50aXR5VHlwZSwgY29udmVydGVyQ29udGV4dCk7XG5cdFx0Y29uc3QgYWxsb3dlZFRyYW5zZm9ybWF0aW9ucyA9IGFnZ3JlZ2F0aW9uSGVscGVyLmdldEFsbG93ZWRUcmFuc2Zvcm1hdGlvbnMoKTtcblx0XHR0YWJsZVZpc3VhbGl6YXRpb24uZW5hYmxlQmFzaWNTZWFyY2ggPSBhbGxvd2VkVHJhbnNmb3JtYXRpb25zID8gYWxsb3dlZFRyYW5zZm9ybWF0aW9ucy5pbmNsdWRlcyhcInNlYXJjaFwiKSA6IHRydWU7XG5cdFx0dGFibGVWaXN1YWxpemF0aW9uLmVuYWJsZSQkZ2V0S2VlcEFsaXZlQ29udGV4dCA9IHRydWU7XG5cdFx0dGFibGVWaXN1YWxpemF0aW9uLmFubm90YXRpb24uY2hhbmdlU2libGluZ0ZvclJvb3RzU3VwcG9ydGVkID0gKGVudGl0eVR5cGU/LmFubm90YXRpb25zLkhpZXJhcmNoeT8uW1xuXHRcdFx0YFJlY3Vyc2l2ZUhpZXJhcmNoeUFjdGlvbnMjJHt0YWJsZVZpc3VhbGl6YXRpb24uY29udHJvbC5oaWVyYXJjaHlRdWFsaWZpZXIgPz8gXCJcIn1gXG5cdFx0XT8uQ2hhbmdlU2libGluZ0ZvclJvb3RzU3VwcG9ydGVkID8/IHRydWUpIGFzIGJvb2xlYW47XG5cblx0XHR0YWJsZVZpc3VhbGl6YXRpb24uYW5ub3RhdGlvbi5hbGxvd0Ryb3BCZXR3ZWVuTm9kZXMgPVxuXHRcdFx0ISFlbnRpdHlUeXBlLmFubm90YXRpb25zLkhpZXJhcmNoeT8uW2BSZWN1cnNpdmVIaWVyYXJjaHlBY3Rpb25zIyR7dGFibGVWaXN1YWxpemF0aW9uLmNvbnRyb2wuaGllcmFyY2h5UXVhbGlmaWVyID8/IFwiXCJ9YF1cblx0XHRcdFx0Py5DaGFuZ2VOZXh0U2libGluZ0FjdGlvbjtcblx0fVxuXG5cdGlmICh0YWJsZVZpc3VhbGl6YXRpb24uY29udHJvbC5lbmFibGVVcGxvYWRQbHVnaW4pIHtcblx0XHRjb25zdCBzdHJlYW1Qcm9wZXJ0eSA9IGNvbnZlcnRlckNvbnRleHQuZ2V0QW5ub3RhdGlvbkVudGl0eVR5cGUoKS5hbm5vdGF0aW9ucz8uVUk/Lk1lZGlhUmVzb3VyY2U/LlN0cmVhbT8uJHRhcmdldDtcblx0XHRpZiAoIXN0cmVhbVByb3BlcnR5KSB7XG5cdFx0XHR0aHJvdyBcIlVJLk1lZGlhUmVzb3VyY2UgYW5ub3RhdGlvbiB3aXRoIFN0cmVhbSBwcm9wZXJ0eSBtaXNzaW5nXCI7XG5cdFx0fVxuXG5cdFx0Ly8gdGhlIHVwbG9hZCBhY3Rpb24gaXMgdHJlYXRlZCBhcyB0aGUgY3JlYXRlIGFjdGlvblxuXHRcdGNvbnN0IHVwbG9hZEFjdGlvbiA9IHRhYmxlVmlzdWFsaXphdGlvbi5hY3Rpb25zLmZpbmQoKGEpID0+IGEua2V5ID09PSBTdGFuZGFyZEFjdGlvbktleXMuQ3JlYXRlKSBhcyBTdGFuZGFyZEFjdGlvbjtcblxuXHRcdHRhYmxlVmlzdWFsaXphdGlvbi5hbm5vdGF0aW9uLnVwbG9hZFRhYmxlID0ge1xuXHRcdFx0c3RyZWFtOiBzdHJlYW1Qcm9wZXJ0eS5uYW1lLFxuXHRcdFx0ZmlsZU5hbWU6IChzdHJlYW1Qcm9wZXJ0eS5hbm5vdGF0aW9ucy5Db3JlPy5Db250ZW50RGlzcG9zaXRpb24/LkZpbGVuYW1lIGFzIFBhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbjxzdHJpbmc+IHwgdW5kZWZpbmVkKT8ucGF0aCxcblx0XHRcdGZpbGVOYW1lTWF4TGVuZ3RoOiBzdHJlYW1Qcm9wZXJ0eS5hbm5vdGF0aW9ucy5Db3JlPy5Db250ZW50RGlzcG9zaXRpb24/LkZpbGVuYW1lPy4kdGFyZ2V0Py5tYXhMZW5ndGgsXG5cdFx0XHRhY2NlcHRhYmxlTWVkaWFUeXBlczogc3RyZWFtUHJvcGVydHkuYW5ub3RhdGlvbnMuQ29yZT8uQWNjZXB0YWJsZU1lZGlhVHlwZXMsXG5cdFx0XHRtYXhMZW5ndGg6IHN0cmVhbVByb3BlcnR5Lm1heExlbmd0aCxcblx0XHRcdHVwbG9hZEFjdGlvbjogdXBsb2FkQWN0aW9uXG5cdFx0fTtcblx0fVxuXG5cdC8vIFdlIGRvbid0IGtlZXAgdGFibGUgc2VsZWN0aW9uIGFmdGVyIHNlYXJjaGluZy9maWx0ZXJpbmcsIGV4Y2VwdCBpbiByZXNwb25zaXZlIHRhYmxlc1xuXHRpZiAodGFibGVWaXN1YWxpemF0aW9uLmNvbnRyb2wudHlwZSAhPT0gXCJSZXNwb25zaXZlVGFibGVcIikge1xuXHRcdHRhYmxlVmlzdWFsaXphdGlvbi5jbGVhclNlbGVjdGlvbk9uRmlsdGVyID0gdHJ1ZTtcblx0fVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBzZWxlY3QgcXVlcnkgd2l0aCB0aGUgc2VsZWN0ZWQgZmllbGRzIGZyb20gdGhlIHBhcmFtZXRlcnMgdGhhdCB3ZXJlIHBhc3NlZC5cbiAqIEBwYXJhbSBsaW5lSXRlbSBUaGUgTGluZUl0ZW0gd2Ugd2FudCB0aGUgcmVxdWVzdGVkIHByb3BlcnRpZXMgZnJvbS5cbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dC5cbiAqIEBwYXJhbSBvcGVyYXRpb25BdmFpbGFibGUgQSBzdHJpbmcgY29udGFpbmluZyB0aGUgYXZhaWxhYmxlIG9wZXJhdGlvbiwgd2hpY2ggd2UnbGwgdGFrZSB0aGUgcHJvcGVydGllcyB0byBhZGQgdG8gdGhlIHNlbGVjdCBxdWVyeS5cbiAqIEBwYXJhbSBwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbiBUaGUgcHJlc2VudGF0aW9uIHZhcmlhbnQgYW5ub3RhdGlvbiB3aGljaCB3ZSdsbCB0YWtlIHRoZSBSZXF1ZXN0QXRMZWFzdCBwcm9wZXJ0aWVzIGZyb20uXG4gKiBAcmV0dXJucyBUaGUgJ3NlbGVjdCcgcXVlcnkgdGhhdCBoYXMgdGhlIHNlbGVjdGVkIGZpZWxkcyBmcm9tIHRoZSBwYXJhbWV0ZXJzIHRoYXQgd2VyZSBwYXNzZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSZXF1ZXN0ZWRQcm9wZXJ0aWVzKFxuXHRsaW5lSXRlbTogTGluZUl0ZW0sXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdG9wZXJhdGlvbkF2YWlsYWJsZT86IHN0cmluZyxcblx0cHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24/OiBQcmVzZW50YXRpb25WYXJpYW50VHlwZVxuKTogc3RyaW5nW10ge1xuXHRjb25zdCBlbnRpdHlUeXBlID0gY29udmVydGVyQ29udGV4dC5nZXRBbm5vdGF0aW9uRW50aXR5VHlwZShsaW5lSXRlbSk7XG5cdGNvbnN0IHNlbGVjdGVkRmllbGRzOiBzdHJpbmdbXSA9IFtdO1xuXHRmdW5jdGlvbiBwdXNoRmllbGQoZmllbGQ6IHN0cmluZyk6IHZvaWQge1xuXHRcdGlmIChmaWVsZCAmJiAhc2VsZWN0ZWRGaWVsZHMuaW5jbHVkZXMoZmllbGQpICYmIGZpZWxkLmluZGV4T2YoXCIvXCIpICE9PSAwKSB7XG5cdFx0XHQvLyBEbyBub3QgYWRkIHNpbmdsZXRvbiBwcm9wZXJ0eSAod2l0aCBhYnNvbHV0ZSBwYXRoKSB0byAkc2VsZWN0XG5cdFx0XHRzZWxlY3RlZEZpZWxkcy5wdXNoKGZpZWxkKTtcblx0XHR9XG5cdH1cblxuXHRmdW5jdGlvbiBwdXNoRmllbGRMaXN0KGZpZWxkczogc3RyaW5nW10pOiB2b2lkIHtcblx0XHRpZiAoZmllbGRzPy5sZW5ndGgpIHtcblx0XHRcdGZpZWxkcy5mb3JFYWNoKHB1c2hGaWVsZCk7XG5cdFx0fVxuXHR9XG5cblx0Y29uc3Qgb3BlcmF0aW9uQXZhaWxhYmxlUHJvcGVydGllcyA9IChvcGVyYXRpb25BdmFpbGFibGUgfHwgXCJcIikuc3BsaXQoXCIsXCIpO1xuXHRjb25zdCB2YWxpZFByb3BlcnRpZXMgPSBvcGVyYXRpb25BdmFpbGFibGVQcm9wZXJ0aWVzLmZpbHRlcihmdW5jdGlvbiAocHJvcE5hbWU6IHN0cmluZykge1xuXHRcdHJldHVybiBlbnRpdHlUeXBlLnJlc29sdmVQYXRoKHByb3BOYW1lKTtcblx0fSk7XG5cdGNvbnN0IHNlbWFudGljS2V5czogc3RyaW5nW10gPSAoZW50aXR5VHlwZS5hbm5vdGF0aW9ucy5Db21tb24/LlNlbWFudGljS2V5IHx8IFtdKS5tYXAoKHNlbWFudGljS2V5KSA9PiBzZW1hbnRpY0tleS52YWx1ZSk7XG5cdGNvbnN0IGNhcGFiaWxpdGllc0Fubm90YXRpb24gPSBjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVNldCgpPy5hbm5vdGF0aW9ucz8uQ2FwYWJpbGl0aWVzO1xuXHRjb25zdCBhbHRlcm5hdGVBbmRTZWNvbmRhcnlLZXlzID0gTW9kZWxIZWxwZXIuZ2V0QWx0ZXJuYXRlQW5kU2Vjb25kYXJ5S2V5cyhlbnRpdHlUeXBlLCBjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVNldCgpIGFzIEVudGl0eVNldCk7XG5cdGlmIChwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbikge1xuXHRcdHB1c2hGaWVsZExpc3QocHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24uUmVxdWVzdEF0TGVhc3Q/Lm1hcCgocHJvcGVydHlQYXRoKSA9PiBwcm9wZXJ0eVBhdGgudmFsdWUpKTtcblx0fVxuXHRwdXNoRmllbGRMaXN0KGdldE5hdmlnYXRpb25BdmFpbGFibGVGaWVsZHNGcm9tTGluZUl0ZW0obGluZUl0ZW0sIGVudGl0eVR5cGUpKTtcblx0cHVzaEZpZWxkTGlzdCh2YWxpZFByb3BlcnRpZXMpO1xuXHRwdXNoRmllbGRMaXN0KHNlbWFudGljS2V5cyk7XG5cdHB1c2hGaWVsZExpc3QoYWx0ZXJuYXRlQW5kU2Vjb25kYXJ5S2V5cyk7XG5cdGlmIChjYXBhYmlsaXRpZXNBbm5vdGF0aW9uKSB7XG5cdFx0cHVzaEZpZWxkKChjYXBhYmlsaXRpZXNBbm5vdGF0aW9uLkRlbGV0ZVJlc3RyaWN0aW9ucz8uRGVsZXRhYmxlIGFzIFBhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbjxib29sZWFuPik/LnBhdGgpO1xuXHRcdHB1c2hGaWVsZCgoY2FwYWJpbGl0aWVzQW5ub3RhdGlvbi5VcGRhdGVSZXN0cmljdGlvbnM/LlVwZGF0YWJsZSBhcyBQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb248Ym9vbGVhbj4pPy5wYXRoKTtcblx0fVxuXG5cdHJldHVybiBzZWxlY3RlZEZpZWxkcztcbn1cblxuLyoqXG4gKiBUaGlzIHJldHVybiB0aGUgcHJvcGVydHkgdGhhdCBhcmUgYXZhaWxhYmxlIGZyb20gdGhlIE5hdmlnYXRpb25BdmFpbGFibGUgYW5ub3RhdGlvbiBvbiBJQk4gRmllbGRzLlxuICogQHBhcmFtIGxpbmVJdGVtIFRoZSBsaW5lIGl0ZW0gYW5ub3RhdGlvbi5cbiAqIEBwYXJhbSBlbnRpdHlUeXBlIFRoZSBFbnRpdHkgVHlwZS5cbiAqIEByZXR1cm5zIEFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIHByb3BlcnRpZXMgbmFtZS5cbiAqL1xuZnVuY3Rpb24gZ2V0TmF2aWdhdGlvbkF2YWlsYWJsZUZpZWxkc0Zyb21MaW5lSXRlbShsaW5lSXRlbTogTGluZUl0ZW0sIGVudGl0eVR5cGU6IEVudGl0eVR5cGUpOiBzdHJpbmdbXSB7XG5cdGNvbnN0IHNlbGVjdGVkRmllbGRzOiBzdHJpbmdbXSA9IFtdO1xuXHRsaW5lSXRlbS5mb3JFYWNoKGZ1bmN0aW9uIChyZWNvcmQpIHtcblx0XHRpZiAoXG5cdFx0XHRyZWNvcmQuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbiAmJlxuXHRcdFx0IXJlY29yZC5JbmxpbmUgJiZcblx0XHRcdCFyZWNvcmQuRGV0ZXJtaW5pbmcgJiZcblx0XHRcdGlzUGF0aEFubm90YXRpb25FeHByZXNzaW9uKHJlY29yZC5OYXZpZ2F0aW9uQXZhaWxhYmxlKVxuXHRcdCkge1xuXHRcdFx0Y29uc3QgcGF0aCA9IChyZWNvcmQuTmF2aWdhdGlvbkF2YWlsYWJsZSBhcyB1bmtub3duIGFzIHsgcGF0aDogc3RyaW5nIH0pLnBhdGg7XG5cdFx0XHRpZiAoZW50aXR5VHlwZS5yZXNvbHZlUGF0aChwYXRoKSkge1xuXHRcdFx0XHRzZWxlY3RlZEZpZWxkcy5wdXNoKHBhdGgpO1xuXHRcdFx0fVxuXHRcdH1cblx0fSk7XG5cdHJldHVybiBzZWxlY3RlZEZpZWxkcztcbn1cblxuLyoqXG4gKiBHZXQgdGhlIG5hdmlnYXRpb24gdGFyZ2V0IHBhdGggZnJvbSBtYW5pZmVzdCBzZXR0aW5ncy5cbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHBhcmFtIG5hdmlnYXRpb25Qcm9wZXJ0eVBhdGggVGhlIG5hdmlnYXRpb24gcGF0aCB0byBjaGVjayBpbiB0aGUgbWFuaWZlc3Qgc2V0dGluZ3NcbiAqIEByZXR1cm5zIE5hdmlnYXRpb24gcGF0aCBmcm9tIG1hbmlmZXN0IHNldHRpbmdzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXROYXZpZ2F0aW9uVGFyZ2V0UGF0aChjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sIG5hdmlnYXRpb25Qcm9wZXJ0eVBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG5cdGNvbnN0IG1hbmlmZXN0V3JhcHBlciA9IGNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RXcmFwcGVyKCk7XG5cdGlmIChuYXZpZ2F0aW9uUHJvcGVydHlQYXRoICYmIG1hbmlmZXN0V3JhcHBlci5nZXROYXZpZ2F0aW9uQ29uZmlndXJhdGlvbihuYXZpZ2F0aW9uUHJvcGVydHlQYXRoKSkge1xuXHRcdGNvbnN0IG5hdkNvbmZpZyA9IG1hbmlmZXN0V3JhcHBlci5nZXROYXZpZ2F0aW9uQ29uZmlndXJhdGlvbihuYXZpZ2F0aW9uUHJvcGVydHlQYXRoKTtcblx0XHRpZiAoT2JqZWN0LmtleXMobmF2Q29uZmlnKS5sZW5ndGggPiAwKSB7XG5cdFx0XHRyZXR1cm4gbmF2aWdhdGlvblByb3BlcnR5UGF0aDtcblx0XHR9XG5cdH1cblx0Y29uc3QgZGF0YU1vZGVsUGF0aCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpO1xuXHRjb25zdCBjb250ZXh0UGF0aCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0Q29udGV4dFBhdGgoKTtcblx0Y29uc3QgbmF2Q29uZmlnRm9yQ29udGV4dFBhdGggPSBtYW5pZmVzdFdyYXBwZXIuZ2V0TmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24oY29udGV4dFBhdGgpO1xuXHRpZiAobmF2Q29uZmlnRm9yQ29udGV4dFBhdGggJiYgT2JqZWN0LmtleXMobmF2Q29uZmlnRm9yQ29udGV4dFBhdGgpLmxlbmd0aCA+IDApIHtcblx0XHRyZXR1cm4gY29udGV4dFBhdGg7XG5cdH1cblx0cmV0dXJuIGRhdGFNb2RlbFBhdGgudGFyZ2V0RW50aXR5U2V0ID8gZGF0YU1vZGVsUGF0aC50YXJnZXRFbnRpdHlTZXQubmFtZSA6IGRhdGFNb2RlbFBhdGguc3RhcnRpbmdFbnRpdHlTZXQubmFtZTtcbn1cbmZ1bmN0aW9uIGZpbmRDb2x1bW5CeVBhdGgocGF0aDogc3RyaW5nLCB0YWJsZUNvbHVtbnM6IFRhYmxlQ29sdW1uW10pOiBUYWJsZUNvbHVtbiB8IHVuZGVmaW5lZCB7XG5cdHJldHVybiB0YWJsZUNvbHVtbnMuZmluZCgoY29sdW1uKSA9PiB7XG5cdFx0Y29uc3QgYW5ub3RhdGlvbkNvbHVtbiA9IGNvbHVtbiBhcyBBbm5vdGF0aW9uVGFibGVDb2x1bW47XG5cdFx0cmV0dXJuIGFubm90YXRpb25Db2x1bW4ucHJvcGVydHlJbmZvcyA9PT0gdW5kZWZpbmVkICYmIGFubm90YXRpb25Db2x1bW4ucmVsYXRpdmVQYXRoID09PSBwYXRoO1xuXHR9KTtcbn1cbi8qKlxuICogU2V0cyB0aGUgJ3VuaXQnLCAndGV4dEFycmFuZ2VtZW50JywgJ3RpbWV6b25lJyBhbmQgJ2V4cG9ydHNldHRpbmdzJyBwcm9wZXJ0aWVzIGluIGNvbHVtbnMgd2hlbiBuZWNlc3NhcnkuXG4gKiBAcGFyYW0gZW50aXR5VHlwZSBUaGUgZW50aXR5IHR5cGUgZGlzcGxheWVkIGluIHRoZSB0YWJsZVxuICogQHBhcmFtIHRhYmxlQ29sdW1ucyBUaGUgY29sdW1ucyB0byBiZSB1cGRhdGVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVMaW5rZWRQcm9wZXJ0aWVzKGVudGl0eVR5cGU6IEVudGl0eVR5cGUsIHRhYmxlQ29sdW1uczogVGFibGVDb2x1bW5bXSk6IHZvaWQge1xuXHR0YWJsZUNvbHVtbnMuZm9yRWFjaCgob0NvbHVtbikgPT4ge1xuXHRcdGNvbnN0IHRhYmxlQ29sdW1uID0gb0NvbHVtbiBhcyBBbm5vdGF0aW9uVGFibGVDb2x1bW47XG5cdFx0aWYgKHRhYmxlQ29sdW1uLnByb3BlcnR5SW5mb3MgPT09IHVuZGVmaW5lZCAmJiB0YWJsZUNvbHVtbi5yZWxhdGl2ZVBhdGgpIHtcblx0XHRcdGNvbnN0IHByb3BlcnR5ID0gZW50aXR5VHlwZS5lbnRpdHlQcm9wZXJ0aWVzLmZpbmQoKHByb3A6IFByb3BlcnR5KSA9PiBwcm9wLm5hbWUgPT09IHRhYmxlQ29sdW1uLnJlbGF0aXZlUGF0aCk7XG5cdFx0XHRpZiAocHJvcGVydHkpIHtcblx0XHRcdFx0Y29uc3QgdW5pdFByb3BlcnR5ID0gZ2V0QXNzb2NpYXRlZEN1cnJlbmN5UHJvcGVydHkocHJvcGVydHkpIHx8IGdldEFzc29jaWF0ZWRVbml0UHJvcGVydHkocHJvcGVydHkpO1xuXHRcdFx0XHRjb25zdCB0aW1lem9uZVByb3BlcnR5ID0gZ2V0QXNzb2NpYXRlZFRpbWV6b25lUHJvcGVydHkocHJvcGVydHkpO1xuXHRcdFx0XHRjb25zdCB0aW1lem9uZSA9IHByb3BlcnR5Py5hbm5vdGF0aW9ucz8uQ29tbW9uPy5UaW1lem9uZTtcblx0XHRcdFx0aWYgKHVuaXRQcm9wZXJ0eSkge1xuXHRcdFx0XHRcdGNvbnN0IHVuaXRDb2x1bW4gPSBmaW5kQ29sdW1uQnlQYXRoKHVuaXRQcm9wZXJ0eS5uYW1lLCB0YWJsZUNvbHVtbnMpO1xuXHRcdFx0XHRcdHRhYmxlQ29sdW1uLnVuaXQgPSB1bml0Q29sdW1uPy5uYW1lO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGNvbnN0IHVuaXQgPSBwcm9wZXJ0eT8uYW5ub3RhdGlvbnM/Lk1lYXN1cmVzPy5JU09DdXJyZW5jeSB8fCBwcm9wZXJ0eT8uYW5ub3RhdGlvbnM/Lk1lYXN1cmVzPy5Vbml0O1xuXHRcdFx0XHRcdGlmICh1bml0KSB7XG5cdFx0XHRcdFx0XHR0YWJsZUNvbHVtbi51bml0VGV4dCA9IGAke3VuaXR9YDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHRpbWV6b25lUHJvcGVydHkpIHtcblx0XHRcdFx0XHRjb25zdCBvVGltZXpvbmVDb2x1bW4gPSBmaW5kQ29sdW1uQnlQYXRoKHRpbWV6b25lUHJvcGVydHkubmFtZSwgdGFibGVDb2x1bW5zKTtcblx0XHRcdFx0XHR0YWJsZUNvbHVtbi50aW1lem9uZSA9IG9UaW1lem9uZUNvbHVtbj8ubmFtZTtcblx0XHRcdFx0fSBlbHNlIGlmICh0aW1lem9uZSkge1xuXHRcdFx0XHRcdHRhYmxlQ29sdW1uLnRpbWV6b25lVGV4dCA9IHRpbWV6b25lLnRvU3RyaW5nKCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29uc3QgZGlzcGxheU1vZGUgPSBnZXREaXNwbGF5TW9kZShwcm9wZXJ0eSksXG5cdFx0XHRcdFx0dGV4dEFubm90YXRpb24gPSBwcm9wZXJ0eS5hbm5vdGF0aW9ucy5Db21tb24/LlRleHQ7XG5cdFx0XHRcdGlmIChpc1BhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbih0ZXh0QW5ub3RhdGlvbikgJiYgZGlzcGxheU1vZGUgIT09IFwiVmFsdWVcIikge1xuXHRcdFx0XHRcdGNvbnN0IHRleHRDb2x1bW4gPSBmaW5kQ29sdW1uQnlQYXRoKHRleHRBbm5vdGF0aW9uLnBhdGgsIHRhYmxlQ29sdW1ucyk7XG5cdFx0XHRcdFx0aWYgKHRleHRDb2x1bW4gJiYgdGV4dENvbHVtbi5uYW1lICE9PSB0YWJsZUNvbHVtbi5uYW1lKSB7XG5cdFx0XHRcdFx0XHR0YWJsZUNvbHVtbi50ZXh0QXJyYW5nZW1lbnQgPSB7XG5cdFx0XHRcdFx0XHRcdHRleHRQcm9wZXJ0eTogdGV4dENvbHVtbi5uYW1lLFxuXHRcdFx0XHRcdFx0XHRtb2RlOiBkaXNwbGF5TW9kZVxuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdC8vIElmIHRleHQgcHJvcGVydGllcyBhcmUgdXNlZCBidXQgaGlkZGVuLCB3ZSBtdXN0IGluY2x1ZGUgdGhlbSB0byB0aGUgZXhwb3J0IGFzIHRoZXJlIGFyZSB1c2VkIGluIHRoZSBwYXN0ZVxuXHRcdFx0XHRcdFx0aWYgKCF0ZXh0Q29sdW1uLmV4cG9ydFNldHRpbmdzKSB7XG5cdFx0XHRcdFx0XHRcdHRleHRDb2x1bW4uZXhwb3J0U2V0dGluZ3MgPSB7IHR5cGU6IFwiU3RyaW5nXCIgfTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH0pO1xufVxuZnVuY3Rpb24gZ2V0U2VtYW50aWNLZXlzQW5kVGl0bGVJbmZvKGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pik6IHtcblx0aGVhZGVySW5mb1RpdGxlUGF0aDogc3RyaW5nO1xuXHRzZW1hbnRpY0tleUNvbHVtbnM6IHN0cmluZ1tdO1xuXHRoZWFkZXJJbmZvVHlwZU5hbWU6IFByb3BlcnR5QW5ub3RhdGlvblZhbHVlPFN0cmluZz4gfCB1bmRlZmluZWQ7XG59IHtcblx0Y29uc3QgaGVhZGVySW5mb1RpdGxlUGF0aCA9IChjb252ZXJ0ZXJDb250ZXh0LmdldEFubm90YXRpb25FbnRpdHlUeXBlKCk/LmFubm90YXRpb25zPy5VST8uSGVhZGVySW5mbz8uVGl0bGUgYXMgRGF0YUZpZWxkVHlwZXMpPy5WYWx1ZVxuXHRcdD8ucGF0aDtcblx0Y29uc3Qgc2VtYW50aWNLZXlBbm5vdGF0aW9ucyA9IGNvbnZlcnRlckNvbnRleHQuZ2V0QW5ub3RhdGlvbkVudGl0eVR5cGUoKT8uYW5ub3RhdGlvbnM/LkNvbW1vbj8uU2VtYW50aWNLZXk7XG5cdGNvbnN0IGhlYWRlckluZm9UeXBlTmFtZSA9IGNvbnZlcnRlckNvbnRleHQ/LmdldEFubm90YXRpb25FbnRpdHlUeXBlKCk/LmFubm90YXRpb25zPy5VST8uSGVhZGVySW5mbz8uVHlwZU5hbWU7XG5cdGNvbnN0IHNlbWFudGljS2V5Q29sdW1uczogc3RyaW5nW10gPSBbXTtcblx0aWYgKHNlbWFudGljS2V5QW5ub3RhdGlvbnMpIHtcblx0XHRzZW1hbnRpY0tleUFubm90YXRpb25zLmZvckVhY2goZnVuY3Rpb24gKG9Db2x1bW4pIHtcblx0XHRcdHNlbWFudGljS2V5Q29sdW1ucy5wdXNoKG9Db2x1bW4udmFsdWUpO1xuXHRcdH0pO1xuXHR9XG5cdHJldHVybiB7IGhlYWRlckluZm9UaXRsZVBhdGgsIHNlbWFudGljS2V5Q29sdW1ucywgaGVhZGVySW5mb1R5cGVOYW1lIH07XG59XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlVGFibGVWaXN1YWxpemF0aW9uKFxuXHRsaW5lSXRlbUFubm90YXRpb246IExpbmVJdGVtLFxuXHR2aXN1YWxpemF0aW9uUGF0aDogc3RyaW5nLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sXG5cdHBhcmFtcz86IFBhcnRpYWw8e1xuXHRcdHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uOiBQcmVzZW50YXRpb25WYXJpYW50VHlwZTtcblx0XHRzZWxlY3Rpb25WYXJpYW50QW5ub3RhdGlvbjogU2VsZWN0aW9uVmFyaWFudFR5cGU7XG5cdFx0aXNDb25kZW5zZWRUYWJsZUxheW91dENvbXBsaWFudDogYm9vbGVhbjtcblx0fT5cbik6IFRhYmxlVmlzdWFsaXphdGlvbiB7XG5cdGNvbnN0IHsgcHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24sIGlzQ29uZGVuc2VkVGFibGVMYXlvdXRDb21wbGlhbnQsIHNlbGVjdGlvblZhcmlhbnRBbm5vdGF0aW9uIH0gPSBwYXJhbXMgPz8ge307XG5cdGNvbnN0IHRhYmxlTWFuaWZlc3RDb25maWcgPSBnZXRUYWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbihcblx0XHRsaW5lSXRlbUFubm90YXRpb24sXG5cdFx0dmlzdWFsaXphdGlvblBhdGgsXG5cdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHRpc0NvbmRlbnNlZFRhYmxlTGF5b3V0Q29tcGxpYW50LFxuXHRcdHNlbGVjdGlvblZhcmlhbnRBbm5vdGF0aW9uXG5cdCk7XG5cdGNvbnN0IHsgbmF2aWdhdGlvblByb3BlcnR5UGF0aCB9ID0gc3BsaXRQYXRoKHZpc3VhbGl6YXRpb25QYXRoKTtcblx0Y29uc3QgbmF2aWdhdGlvblRhcmdldFBhdGggPSBnZXROYXZpZ2F0aW9uVGFyZ2V0UGF0aChjb252ZXJ0ZXJDb250ZXh0LCBuYXZpZ2F0aW9uUHJvcGVydHlQYXRoKTtcblx0Y29uc3QgbmF2aWdhdGlvblNldHRpbmdzID0gY29udmVydGVyQ29udGV4dC5nZXRNYW5pZmVzdFdyYXBwZXIoKS5nZXROYXZpZ2F0aW9uQ29uZmlndXJhdGlvbihuYXZpZ2F0aW9uVGFyZ2V0UGF0aCk7XG5cdGNvbnN0IGNvbHVtbnMgPSBnZXRUYWJsZUNvbHVtbnMobGluZUl0ZW1Bbm5vdGF0aW9uLCB2aXN1YWxpemF0aW9uUGF0aCwgY29udmVydGVyQ29udGV4dCwgbmF2aWdhdGlvblNldHRpbmdzKTtcblx0Y29uc3Qgb3BlcmF0aW9uQXZhaWxhYmxlTWFwID0gZ2V0T3BlcmF0aW9uQXZhaWxhYmxlTWFwKGxpbmVJdGVtQW5ub3RhdGlvbiwgY29udmVydGVyQ29udGV4dCk7XG5cdGNvbnN0IHNlbWFudGljS2V5c0FuZEhlYWRlckluZm9UaXRsZSA9IGdldFNlbWFudGljS2V5c0FuZFRpdGxlSW5mbyhjb252ZXJ0ZXJDb250ZXh0KTtcblx0Y29uc3Qgc3RhbmRhcmRBY3Rpb25zQ29uZmlndXJhdGlvbiA9IGdldFN0YW5kYXJkQWN0aW9uc0NvbmZpZ3VyYXRpb24oXG5cdFx0bGluZUl0ZW1Bbm5vdGF0aW9uLFxuXHRcdHZpc3VhbGl6YXRpb25QYXRoLFxuXHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0dGFibGVNYW5pZmVzdENvbmZpZyxcblx0XHRuYXZpZ2F0aW9uU2V0dGluZ3Ncblx0KTtcblx0Y29uc3QgdGFibGVBbm5vdGF0aW9uID0gZ2V0VGFibGVBbm5vdGF0aW9uQ29uZmlndXJhdGlvbihcblx0XHRsaW5lSXRlbUFubm90YXRpb24sXG5cdFx0dmlzdWFsaXphdGlvblBhdGgsXG5cdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHR0YWJsZU1hbmlmZXN0Q29uZmlnLFxuXHRcdGNvbHVtbnMsXG5cdFx0bmF2aWdhdGlvblNldHRpbmdzLFxuXHRcdHN0YW5kYXJkQWN0aW9uc0NvbmZpZ3VyYXRpb24sXG5cdFx0cHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb25cblx0KTtcblx0Y29uc3QgdGFibGVBY3Rpb25zID0gZ2V0VGFibGVBY3Rpb25zKFxuXHRcdGxpbmVJdGVtQW5ub3RhdGlvbixcblx0XHR2aXN1YWxpemF0aW9uUGF0aCxcblx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdHN0YW5kYXJkQWN0aW9uc0NvbmZpZ3VyYXRpb24uc3RhbmRhcmRBY3Rpb25zLFxuXHRcdG5hdmlnYXRpb25TZXR0aW5nc1xuXHQpO1xuXHRjb25zdCBvcGVyYXRpb25BdmFpbGFibGUgPSBnZXRPcGVyYXRpb25BdmFpbGFibGVQcm9wZXJ0aWVzKG9wZXJhdGlvbkF2YWlsYWJsZU1hcCwgY29udmVydGVyQ29udGV4dCk7XG5cdGxldCBoZWFkZXIgPSB0YWJsZU1hbmlmZXN0Q29uZmlnLmhlYWRlcjtcblx0aGVhZGVyID8/PSB0YWJsZUFubm90YXRpb24udGl0bGUgPT09IFwiXCIgPyB1bmRlZmluZWQgOiB0YWJsZUFubm90YXRpb24udGl0bGU7XG5cdGNvbnN0IG9WaXN1YWxpemF0aW9uOiBUYWJsZVZpc3VhbGl6YXRpb24gPSB7XG5cdFx0dHlwZTogVmlzdWFsaXphdGlvblR5cGUuVGFibGUsXG5cdFx0YW5ub3RhdGlvbjogdGFibGVBbm5vdGF0aW9uLFxuXHRcdGNvbnRyb2w6IHRhYmxlTWFuaWZlc3RDb25maWcsXG5cdFx0YWN0aW9uczogcmVtb3ZlRHVwbGljYXRlQWN0aW9ucyh0YWJsZUFjdGlvbnMuYWN0aW9ucyksXG5cdFx0Y29tbWFuZEFjdGlvbnM6IHRhYmxlQWN0aW9ucy5jb21tYW5kQWN0aW9ucyxcblx0XHRjb2x1bW5zOiBjb2x1bW5zLFxuXHRcdG9wZXJhdGlvbkF2YWlsYWJsZU1hcDogSlNPTi5zdHJpbmdpZnkob3BlcmF0aW9uQXZhaWxhYmxlTWFwKSxcblx0XHRvcGVyYXRpb25BdmFpbGFibGVQcm9wZXJ0aWVzOiBvcGVyYXRpb25BdmFpbGFibGUsXG5cdFx0aGVhZGVySW5mb1RpdGxlOiBzZW1hbnRpY0tleXNBbmRIZWFkZXJJbmZvVGl0bGUuaGVhZGVySW5mb1RpdGxlUGF0aCxcblx0XHRzZW1hbnRpY0tleXM6IHNlbWFudGljS2V5c0FuZEhlYWRlckluZm9UaXRsZS5zZW1hbnRpY0tleUNvbHVtbnMsXG5cdFx0aGVhZGVySW5mb1R5cGVOYW1lOiBzZW1hbnRpY0tleXNBbmRIZWFkZXJJbmZvVGl0bGUuaGVhZGVySW5mb1R5cGVOYW1lLFxuXHRcdGVuYWJsZSRzZWxlY3Q6IHRydWUsXG5cdFx0ZW5hYmxlJCRnZXRLZWVwQWxpdmVDb250ZXh0OiB0cnVlLFxuXHRcdGhlYWRlcjogaGVhZGVyLFxuXHRcdGhlYWRlclZpc2libGU6IHRhYmxlTWFuaWZlc3RDb25maWcuaGVhZGVyVmlzaWJsZSxcblx0XHRyZXF1ZXN0QXRMZWFzdDogY3JlYXRlUmVxdWVzdGVkUHJvcGVydGllcyhsaW5lSXRlbUFubm90YXRpb24sIGNvbnZlcnRlckNvbnRleHQsIG9wZXJhdGlvbkF2YWlsYWJsZSwgcHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24pLFxuXHRcdGNsZWFyU2VsZWN0aW9uT25GaWx0ZXI6IGZhbHNlLFxuXHRcdGV2ZW50czoge1xuXHRcdFx0cGF0Y2hTZW50OlxuXHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0V3JhcHBlcigpLmdldFRlbXBsYXRlVHlwZSgpICE9PSBUZW1wbGF0ZVR5cGUuTGlzdFJlcG9ydFxuXHRcdFx0XHRcdD8gXCIuZWRpdEZsb3cuaGFuZGxlUGF0Y2hTZW50XCJcblx0XHRcdFx0XHQ6IHVuZGVmaW5lZFxuXHRcdH1cblx0fTtcblx0dXBkYXRlTGlua2VkUHJvcGVydGllcyhjb252ZXJ0ZXJDb250ZXh0LmdldEFubm90YXRpb25FbnRpdHlUeXBlKGxpbmVJdGVtQW5ub3RhdGlvbiksIGNvbHVtbnMpO1xuXHR1cGRhdGVUYWJsZVZpc3VhbGl6YXRpb25Gb3JUeXBlKFxuXHRcdG9WaXN1YWxpemF0aW9uLFxuXHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0QW5ub3RhdGlvbkVudGl0eVR5cGUobGluZUl0ZW1Bbm5vdGF0aW9uKSxcblx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uXG5cdCk7XG5cdHJldHVybiBvVmlzdWFsaXphdGlvbjtcbn1cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVEZWZhdWx0VGFibGVWaXN1YWxpemF0aW9uKFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sXG5cdGlzQmxhbmtUYWJsZT86IGJvb2xlYW5cbik6IFRhYmxlVmlzdWFsaXphdGlvbiB7XG5cdGNvbnN0IHRhYmxlTWFuaWZlc3RDb25maWcgPSBnZXRUYWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbih1bmRlZmluZWQsIFwiXCIsIGNvbnZlcnRlckNvbnRleHQsIGZhbHNlKTtcblx0Y29uc3QgY29sdW1ucyA9IGdldENvbHVtbnNGcm9tRW50aXR5VHlwZShcblx0XHR7fSxcblx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVR5cGUoKSxcblx0XHRbXSxcblx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdHRhYmxlTWFuaWZlc3RDb25maWcudHlwZSxcblx0XHR0YWJsZU1hbmlmZXN0Q29uZmlnLmNyZWF0aW9uTW9kZSxcblx0XHR7fVxuXHQpO1xuXHRjb25zdCBvcGVyYXRpb25BdmFpbGFibGVNYXAgPSBnZXRPcGVyYXRpb25BdmFpbGFibGVNYXAodW5kZWZpbmVkLCBjb252ZXJ0ZXJDb250ZXh0KTtcblx0Y29uc3Qgc2VtYW50aWNLZXlzQW5kSGVhZGVySW5mb1RpdGxlID0gZ2V0U2VtYW50aWNLZXlzQW5kVGl0bGVJbmZvKGNvbnZlcnRlckNvbnRleHQpO1xuXHRjb25zdCBuYXZpZ2F0aW9uVGFyZ2V0UGF0aCA9IGdldE5hdmlnYXRpb25UYXJnZXRQYXRoKGNvbnZlcnRlckNvbnRleHQsIFwiXCIpO1xuXHRjb25zdCBuYXZpZ2F0aW9uU2V0dGluZ3MgPSBjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0V3JhcHBlcigpLmdldE5hdmlnYXRpb25Db25maWd1cmF0aW9uKG5hdmlnYXRpb25UYXJnZXRQYXRoKTtcblx0Y29uc3Qgc3RhbmRhcmRBY3Rpb25zQ29uZmlndXJhdGlvbiA9IGdldFN0YW5kYXJkQWN0aW9uc0NvbmZpZ3VyYXRpb24oXG5cdFx0dW5kZWZpbmVkLFxuXHRcdFwiXCIsXG5cdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHR0YWJsZU1hbmlmZXN0Q29uZmlnLFxuXHRcdG5hdmlnYXRpb25TZXR0aW5nc1xuXHQpO1xuXHRjb25zdCBvVmlzdWFsaXphdGlvbjogVGFibGVWaXN1YWxpemF0aW9uID0ge1xuXHRcdHR5cGU6IFZpc3VhbGl6YXRpb25UeXBlLlRhYmxlLFxuXHRcdGFubm90YXRpb246IGdldFRhYmxlQW5ub3RhdGlvbkNvbmZpZ3VyYXRpb24oXG5cdFx0XHR1bmRlZmluZWQsXG5cdFx0XHRcIlwiLFxuXHRcdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHRcdHRhYmxlTWFuaWZlc3RDb25maWcsXG5cdFx0XHRpc0JsYW5rVGFibGUgPyBbXSA6IGNvbHVtbnMsXG5cdFx0XHRuYXZpZ2F0aW9uU2V0dGluZ3MsXG5cdFx0XHRzdGFuZGFyZEFjdGlvbnNDb25maWd1cmF0aW9uXG5cdFx0KSxcblx0XHRjb250cm9sOiB0YWJsZU1hbmlmZXN0Q29uZmlnLFxuXHRcdGFjdGlvbnM6IFtdLFxuXHRcdGNvbHVtbnM6IGNvbHVtbnMsXG5cdFx0b3BlcmF0aW9uQXZhaWxhYmxlTWFwOiBKU09OLnN0cmluZ2lmeShvcGVyYXRpb25BdmFpbGFibGVNYXApLFxuXHRcdG9wZXJhdGlvbkF2YWlsYWJsZVByb3BlcnRpZXM6IGdldE9wZXJhdGlvbkF2YWlsYWJsZVByb3BlcnRpZXMob3BlcmF0aW9uQXZhaWxhYmxlTWFwLCBjb252ZXJ0ZXJDb250ZXh0KSxcblx0XHRoZWFkZXJJbmZvVGl0bGU6IHNlbWFudGljS2V5c0FuZEhlYWRlckluZm9UaXRsZS5oZWFkZXJJbmZvVGl0bGVQYXRoLFxuXHRcdHNlbWFudGljS2V5czogc2VtYW50aWNLZXlzQW5kSGVhZGVySW5mb1RpdGxlLnNlbWFudGljS2V5Q29sdW1ucyxcblx0XHRoZWFkZXJJbmZvVHlwZU5hbWU6IHNlbWFudGljS2V5c0FuZEhlYWRlckluZm9UaXRsZS5oZWFkZXJJbmZvVHlwZU5hbWUsXG5cdFx0ZW5hYmxlJHNlbGVjdDogdHJ1ZSxcblx0XHRlbmFibGUkJGdldEtlZXBBbGl2ZUNvbnRleHQ6IHRydWUsXG5cdFx0aGVhZGVyOiB0YWJsZU1hbmlmZXN0Q29uZmlnLmhlYWRlcixcblx0XHRoZWFkZXJWaXNpYmxlOiB0YWJsZU1hbmlmZXN0Q29uZmlnLmhlYWRlclZpc2libGUsXG5cdFx0Y2xlYXJTZWxlY3Rpb25PbkZpbHRlcjogZmFsc2UsXG5cdFx0ZXZlbnRzOiB7XG5cdFx0XHRwYXRjaFNlbnQ6XG5cdFx0XHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RXcmFwcGVyKCkuZ2V0VGVtcGxhdGVUeXBlKCkgIT09IFRlbXBsYXRlVHlwZS5MaXN0UmVwb3J0XG5cdFx0XHRcdFx0PyBcIi5lZGl0Rmxvdy5oYW5kbGVQYXRjaFNlbnRcIlxuXHRcdFx0XHRcdDogdW5kZWZpbmVkXG5cdFx0fVxuXHR9O1xuXHR1cGRhdGVMaW5rZWRQcm9wZXJ0aWVzKGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5VHlwZSgpLCBjb2x1bW5zKTtcblx0dXBkYXRlVGFibGVWaXN1YWxpemF0aW9uRm9yVHlwZShvVmlzdWFsaXphdGlvbiwgY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlUeXBlKCksIGNvbnZlcnRlckNvbnRleHQpO1xuXHRyZXR1cm4gb1Zpc3VhbGl6YXRpb247XG59XG4vKipcbiAqIEdldHMgdGhlIG1hcCBvZiBDb3JlLk9wZXJhdGlvbkF2YWlsYWJsZSBwcm9wZXJ0eSBwYXRocyBmb3IgYWxsIERhdGFGaWVsZEZvckFjdGlvbnMuXG4gKiBAcGFyYW0gbGluZUl0ZW1Bbm5vdGF0aW9uIFRoZSBpbnN0YW5jZSBvZiB0aGUgbGluZSBpdGVtXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCBUaGUgaW5zdGFuY2Ugb2YgdGhlIGNvbnZlcnRlciBjb250ZXh0XG4gKiBAcmV0dXJucyBUaGUgcmVjb3JkIGNvbnRhaW5pbmcgYWxsIGFjdGlvbiBuYW1lcyBhbmQgdGhlaXIgY29ycmVzcG9uZGluZyBDb3JlLk9wZXJhdGlvbkF2YWlsYWJsZSBwcm9wZXJ0eSBwYXRoc1xuICovXG5mdW5jdGlvbiBnZXRPcGVyYXRpb25BdmFpbGFibGVNYXAoXG5cdGxpbmVJdGVtQW5ub3RhdGlvbjogTGluZUl0ZW0gfCB1bmRlZmluZWQsXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0PlxuKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuXHRyZXR1cm4gQWN0aW9uSGVscGVyLmdldE9wZXJhdGlvbkF2YWlsYWJsZU1hcChsaW5lSXRlbUFubm90YXRpb24sIFwidGFibGVcIiwgY29udmVydGVyQ29udGV4dCk7XG59XG4vKipcbiAqIEdldHMgdXBkYXRhYmxlIHByb3BlcnR5UGF0aCBmb3IgdGhlIGN1cnJlbnQgZW50aXR5c2V0IGlmIHZhbGlkLlxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGluc3RhbmNlIG9mIHRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHJldHVybnMgVGhlIHVwZGF0YWJsZSBwcm9wZXJ0eSBmb3IgdGhlIHJvd3NcbiAqL1xuZnVuY3Rpb24gZ2V0Q3VycmVudEVudGl0eVNldFVwZGF0YWJsZVBhdGgoY29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+KTogc3RyaW5nIHtcblx0Y29uc3QgcmVzdHJpY3Rpb25zID0gZ2V0UmVzdHJpY3Rpb25zKGNvbnZlcnRlckNvbnRleHQpO1xuXHRjb25zdCBlbnRpdHlTZXQgPSBjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVNldCgpO1xuXHRjb25zdCB1cGRhdGFibGUgPSByZXN0cmljdGlvbnMuaXNVcGRhdGFibGU7XG5cdGNvbnN0IGlzT25seUR5bmFtaWNPbkN1cnJlbnRFbnRpdHkgPSAhaXNDb25zdGFudCh1cGRhdGFibGUuZXhwcmVzc2lvbikgJiYgdXBkYXRhYmxlLm5hdmlnYXRpb25FeHByZXNzaW9uLl90eXBlID09PSBcIlVucmVzb2x2YWJsZVwiO1xuXHRjb25zdCB1cGRhdGFibGVFeHByZXNzaW9uID0gZW50aXR5U2V0Py5hbm5vdGF0aW9ucy5DYXBhYmlsaXRpZXM/LlVwZGF0ZVJlc3RyaWN0aW9ucz8uVXBkYXRhYmxlO1xuXHRjb25zdCB1cGRhdGFibGVQcm9wZXJ0eVBhdGggPSBpc1BhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbih1cGRhdGFibGVFeHByZXNzaW9uKSAmJiB1cGRhdGFibGVFeHByZXNzaW9uLnBhdGg7XG5cdHJldHVybiBpc09ubHlEeW5hbWljT25DdXJyZW50RW50aXR5ID8gKHVwZGF0YWJsZVByb3BlcnR5UGF0aCBhcyBzdHJpbmcpIDogXCJcIjtcbn1cbi8qKlxuICogTWV0aG9kIHRvIHJldHJpZXZlIGFsbCBwcm9wZXJ0eSBwYXRocyBhc3NpZ25lZCB0byB0aGUgQ29yZS5PcGVyYXRpb25BdmFpbGFibGUgYW5ub3RhdGlvbi5cbiAqIEBwYXJhbSBvcGVyYXRpb25BdmFpbGFibGVNYXAgVGhlIHJlY29yZCBjb25zaXN0aW5nIG9mIGFjdGlvbnMgYW5kIHRoZWlyIENvcmUuT3BlcmF0aW9uQXZhaWxhYmxlIHByb3BlcnR5IHBhdGhzXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCBUaGUgaW5zdGFuY2Ugb2YgdGhlIGNvbnZlcnRlciBjb250ZXh0XG4gKiBAcmV0dXJucyBUaGUgQ1NWIHN0cmluZyBvZiBhbGwgcHJvcGVydHkgcGF0aHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBDb3JlLk9wZXJhdGlvbkF2YWlsYWJsZSBhbm5vdGF0aW9uXG4gKi9cbmZ1bmN0aW9uIGdldE9wZXJhdGlvbkF2YWlsYWJsZVByb3BlcnRpZXMoXG5cdG9wZXJhdGlvbkF2YWlsYWJsZU1hcDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0PlxuKTogc3RyaW5nIHtcblx0Y29uc3QgcHJvcGVydGllcyA9IG5ldyBTZXQoKTtcblx0Zm9yIChjb25zdCBhY3Rpb25OYW1lIGluIG9wZXJhdGlvbkF2YWlsYWJsZU1hcCkge1xuXHRcdGNvbnN0IHByb3BlcnR5TmFtZSA9IG9wZXJhdGlvbkF2YWlsYWJsZU1hcFthY3Rpb25OYW1lXTtcblx0XHRpZiAocHJvcGVydHlOYW1lID09PSBudWxsKSB7XG5cdFx0XHQvLyBBbm5vdGF0aW9uIGNvbmZpZ3VyZWQgd2l0aCBleHBsaWNpdCAnbnVsbCcgKGFjdGlvbiBhZHZlcnRpc2VtZW50IHJlbGV2YW50KVxuXHRcdFx0cHJvcGVydGllcy5hZGQoYWN0aW9uTmFtZSk7XG5cdFx0fSBlbHNlIGlmICh0eXBlb2YgcHJvcGVydHlOYW1lID09PSBcInN0cmluZ1wiKSB7XG5cdFx0XHQvLyBBZGQgcHJvcGVydHkgcGF0aHMgYW5kIG5vdCBDb25zdGFudCB2YWx1ZXMuXG5cdFx0XHRwcm9wZXJ0aWVzLmFkZChwcm9wZXJ0eU5hbWUpO1xuXHRcdH1cblx0fVxuXHRpZiAocHJvcGVydGllcy5zaXplKSB7XG5cdFx0Ly8gU29tZSBhY3Rpb25zIGhhdmUgYW4gb3BlcmF0aW9uIGF2YWlsYWJsZSBiYXNlZCBvbiBwcm9wZXJ0eSAtLT4gd2UgbmVlZCB0byBsb2FkIHRoZSBIZWFkZXJJbmZvLlRpdGxlIHByb3BlcnR5XG5cdFx0Ly8gc28gdGhhdCB0aGUgZGlhbG9nIG9uIHBhcnRpYWwgYWN0aW9ucyBpcyBkaXNwbGF5ZWQgcHJvcGVybHkgKEJDUCAyMTgwMjcxNDI1KVxuXHRcdGNvbnN0IGVudGl0eVR5cGUgPSBjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVR5cGUoKTtcblx0XHRjb25zdCB0aXRsZVByb3BlcnR5ID0gKGVudGl0eVR5cGUuYW5ub3RhdGlvbnM/LlVJPy5IZWFkZXJJbmZvPy5UaXRsZSBhcyBEYXRhRmllbGRUeXBlcyk/LlZhbHVlPy5wYXRoO1xuXHRcdGlmICh0aXRsZVByb3BlcnR5KSB7XG5cdFx0XHRwcm9wZXJ0aWVzLmFkZCh0aXRsZVByb3BlcnR5KTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIEFycmF5LmZyb20ocHJvcGVydGllcykuam9pbihcIixcIik7XG59XG4vKipcbiAqIEl0ZXJhdGVzIG92ZXIgdGhlIERhdGFGaWVsZEZvckFjdGlvbiBhbmQgRGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uIG9mIGEgbGluZSBpdGVtIGFuZFxuICogcmV0dXJucyBhbGwgdGhlIFVJLkhpZGRlbiBhbm5vdGF0aW9uIGV4cHJlc3Npb25zLlxuICogQHBhcmFtIGxpbmVJdGVtQW5ub3RhdGlvbiBDb2xsZWN0aW9uIG9mIGRhdGEgZmllbGRzIHVzZWQgZm9yIHJlcHJlc2VudGF0aW9uIGluIGEgdGFibGUgb3IgbGlzdFxuICogQHBhcmFtIGN1cnJlbnRFbnRpdHlUeXBlIEN1cnJlbnQgZW50aXR5IHR5cGVcbiAqIEBwYXJhbSBjb250ZXh0RGF0YU1vZGVsT2JqZWN0UGF0aCBPYmplY3QgcGF0aCBvZiB0aGUgZGF0YSBtb2RlbFxuICogQHJldHVybnMgQWxsIHRoZSBgVUkuSGlkZGVuYCBwYXRoIGV4cHJlc3Npb25zIGZvdW5kIGluIHRoZSByZWxldmFudCBhY3Rpb25zXG4gKi9cbmZ1bmN0aW9uIGdldFVJSGlkZGVuRXhwRm9yQWN0aW9uc1JlcXVpcmluZ0NvbnRleHQoXG5cdGxpbmVJdGVtQW5ub3RhdGlvbjogTGluZUl0ZW0sXG5cdGN1cnJlbnRFbnRpdHlUeXBlOiBFbnRpdHlUeXBlLFxuXHRjb250ZXh0RGF0YU1vZGVsT2JqZWN0UGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+XG4pOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj5bXSB7XG5cdGNvbnN0IGFVaUhpZGRlblBhdGhFeHByZXNzaW9uczogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+W10gPSBbXTtcblx0bGluZUl0ZW1Bbm5vdGF0aW9uLmZvckVhY2goKGRhdGFGaWVsZCkgPT4ge1xuXHRcdC8vIENoZWNrIGlmIHRoZSBsaW5lSXRlbSBjb250ZXh0IGlzIHRoZSBzYW1lIGFzIHRoYXQgb2YgdGhlIGFjdGlvbjpcblx0XHRpZiAoXG5cdFx0XHQoZGF0YUZpZWxkLiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBY3Rpb24gJiZcblx0XHRcdFx0ZGF0YUZpZWxkPy5BY3Rpb25UYXJnZXQ/LmlzQm91bmQgJiZcblx0XHRcdFx0Y3VycmVudEVudGl0eVR5cGUgPT09IGRhdGFGaWVsZD8uQWN0aW9uVGFyZ2V0LnNvdXJjZUVudGl0eVR5cGUpIHx8XG5cdFx0XHQoZGF0YUZpZWxkLiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb24gJiZcblx0XHRcdFx0ZGF0YUZpZWxkLlJlcXVpcmVzQ29udGV4dCAmJlxuXHRcdFx0XHRkYXRhRmllbGQ/LklubGluZT8udmFsdWVPZigpICE9PSB0cnVlKVxuXHRcdCkge1xuXHRcdFx0aWYgKHR5cGVvZiBkYXRhRmllbGQuYW5ub3RhdGlvbnM/LlVJPy5IaWRkZW4/LnZhbHVlT2YoKSA9PT0gXCJvYmplY3RcIikge1xuXHRcdFx0XHRhVWlIaWRkZW5QYXRoRXhwcmVzc2lvbnMucHVzaChlcXVhbChnZXRIaWRkZW5FeHByZXNzaW9uQXRUYWJsZUxldmVsKGRhdGFGaWVsZCwgY29udGV4dERhdGFNb2RlbE9iamVjdFBhdGgpLCBmYWxzZSkpO1xuXHRcdFx0fVxuXHRcdH1cblx0fSk7XG5cdHJldHVybiBhVWlIaWRkZW5QYXRoRXhwcmVzc2lvbnM7XG59XG4vKipcbiAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gZ2V0IHRoZSBiaW5kaW5nIGV4cHJlc3Npb24gb2YgdGhlIHBhdGggb2YgYSBEYXRhRmllbGQuXG4gKiBAcGFyYW0gZXhwcmVzc2lvbiBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvblxuICogQHJldHVybnMgVGhlIGJpbmRpbmcgZXhwcmVzc2lvblxuICovXG5mdW5jdGlvbiBnZXRQYXRoRnJvbUFjdGlvbkFubm90YXRpb24oZXhwcmVzc2lvbjogQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24pOiBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiB7XG5cdGxldCBwYXRoOiBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjtcblx0aWYgKGlzUGF0aEFubm90YXRpb25FeHByZXNzaW9uKGV4cHJlc3Npb24pKSB7XG5cdFx0cGF0aCA9IGV4cHJlc3Npb24ucGF0aDtcblx0fSBlbHNlIHtcblx0XHRwYXRoID0gZXhwcmVzc2lvbjtcblx0fVxuXHRyZXR1cm4gcGF0aDtcbn1cbi8qKlxuICogVGhpcyBtZXRob2QgaXMgdXNlZCB0byBjaGFuZ2UgdGhlIGNvbnRleHQgY3VycmVudGx5IHJlZmVyZW5jZWQgYnkgdGhpcyBiaW5kaW5nIGJ5IHJlbW92aW5nIHRoZSBsYXN0IG5hdmlnYXRpb24gcHJvcGVydHkuXG4gKlxuICogSXQgaXMgdXNlZCAoc3BlY2lmaWNhbGx5IGluIHRoaXMgY2FzZSksIHRvIHRyYW5zZm9ybSBhIGJpbmRpbmcgbWFkZSBmb3IgYSBOYXZQcm9wIGNvbnRleHQgL01haW5PYmplY3QvTmF2UHJvcDEvTmF2UHJvcDIsXG4gKiBpbnRvIGEgYmluZGluZyBvbiB0aGUgcHJldmlvdXMgY29udGV4dCAvTWFpbk9iamVjdC9OYXZQcm9wMS5cbiAqIEBwYXJhbSBzb3VyY2UgRGF0YUZpZWxkRm9yQWN0aW9uIHwgRGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uIHwgQ3VzdG9tQWN0aW9uXG4gKiBAcGFyYW0gY29udGV4dERhdGFNb2RlbE9iamVjdFBhdGggRGF0YU1vZGVsT2JqZWN0UGF0aFxuICogQHJldHVybnMgVGhlIGJpbmRpbmcgZXhwcmVzc2lvblxuICovXG5mdW5jdGlvbiBnZXRIaWRkZW5FeHByZXNzaW9uQXRUYWJsZUxldmVsKFxuXHRzb3VyY2U6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMsXG5cdGNvbnRleHREYXRhTW9kZWxPYmplY3RQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoPFBhZ2VDb250ZXh0UGF0aFRhcmdldD5cbik6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjx1bmtub3duPiB7XG5cdGNvbnN0IGV4cHJlc3Npb24gPSBzb3VyY2UuYW5ub3RhdGlvbnM/LlVJPy5IaWRkZW4gYXMgQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb247XG5cdGxldCBwYXRoID0gZ2V0UGF0aEZyb21BY3Rpb25Bbm5vdGF0aW9uKGV4cHJlc3Npb24pO1xuXHRpZiAodHlwZW9mIHBhdGggPT09IFwib2JqZWN0XCIpIHtcblx0XHRyZXR1cm4gY29uc3RhbnQoZmFsc2UpO1xuXHR9IGVsc2UgaWYgKHR5cGVvZiBwYXRoID09PSBcInN0cmluZ1wiKSB7XG5cdFx0aWYgKFwidmlzaWJsZVwiIGluIHNvdXJjZSkge1xuXHRcdFx0cGF0aCA9IHBhdGguc3Vic3RyaW5nKDEsIHBhdGgubGVuZ3RoIC0gMSk7XG5cdFx0fVxuXHRcdGlmIChwYXRoLmluZGV4T2YoXCIvXCIpID4gMCkge1xuXHRcdFx0Ly9jaGVjayBpZiB0aGUgbmF2aWdhdGlvbiBwcm9wZXJ0eSBpcyBjb3JyZWN0OlxuXHRcdFx0Y29uc3Qgc3BsaXRQYXRoRm9yTmF2aWdhdGlvblByb3BlcnR5ID0gcGF0aC5zcGxpdChcIi9cIik7XG5cdFx0XHRjb25zdCBuYXZpZ2F0aW9uUGF0aCA9IHNwbGl0UGF0aEZvck5hdmlnYXRpb25Qcm9wZXJ0eVswXTtcblx0XHRcdGlmIChcblx0XHRcdFx0aXNOYXZpZ2F0aW9uUHJvcGVydHkoY29udGV4dERhdGFNb2RlbE9iamVjdFBhdGg/LnRhcmdldE9iamVjdCkgJiZcblx0XHRcdFx0Y29udGV4dERhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0T2JqZWN0LnBhcnRuZXIgPT09IG5hdmlnYXRpb25QYXRoXG5cdFx0XHQpIHtcblx0XHRcdFx0cmV0dXJuIHBhdGhJbk1vZGVsKHNwbGl0UGF0aEZvck5hdmlnYXRpb25Qcm9wZXJ0eS5zbGljZSgxKS5qb2luKFwiL1wiKSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXR1cm4gY29uc3RhbnQodHJ1ZSk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBjb25zdGFudChmYWxzZSk7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBjb25zdGFudCh0cnVlKTtcbn1cbi8qKlxuICogTG9vcCB0aHJvdWdoIHRoZSBtYW5pZmVzdCBhY3Rpb25zIGFuZCBjaGVjayB0aGUgZm9sbG93aW5nOlxuICpcbiAqIElmIHRoZSBkYXRhIGZpZWxkIGlzIGFsc28gcmVmZXJlbmNlZCBhcyBhIGN1c3RvbSBhY3Rpb24uXG4gKiBJZiB0aGUgdW5kZXJseWluZyBtYW5pZmVzdCBhY3Rpb24gaXMgZWl0aGVyIGEgYm91bmQgYWN0aW9uIG9yIGhhcyB0aGUgJ1JlcXVpcmVzQ29udGV4dCcgcHJvcGVydHkgc2V0IHRvIHRydWUuXG4gKlxuICogSWYgc28sIHRoZSAncmVxdWlyZXNTZWxlY3Rpb24nIHByb3BlcnR5IGlzIGZvcmNlZCB0byAndHJ1ZScgaW4gdGhlIG1hbmlmZXN0LlxuICogQHBhcmFtIGRhdGFGaWVsZElkIElkIG9mIHRoZSBEYXRhRmllbGQgZXZhbHVhdGVkXG4gKiBAcGFyYW0gZGF0YUZpZWxkIERhdGFGaWVsZCBldmFsdWF0ZWRcbiAqIEBwYXJhbSBtYW5pZmVzdEFjdGlvbnMgVGhlIGFjdGlvbnMgZGVmaW5lZCBpbiB0aGUgbWFuaWZlc3RcbiAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgRGF0YUZpZWxkIGlzIGZvdW5kIGFtb25nIHRoZSBtYW5pZmVzdCBhY3Rpb25zXG4gKi9cbmZ1bmN0aW9uIHVwZGF0ZU1hbmlmZXN0QWN0aW9uQW5kVGFnSXQoXG5cdGRhdGFGaWVsZElkOiBzdHJpbmcsXG5cdGRhdGFGaWVsZDogRGF0YUZpZWxkRm9yQWN0aW9uIHwgRGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uLFxuXHRtYW5pZmVzdEFjdGlvbnM6IFJlY29yZDxzdHJpbmcsIEN1c3RvbUFjdGlvbj5cbik6IGJvb2xlYW4ge1xuXHRyZXR1cm4gT2JqZWN0LmtleXMobWFuaWZlc3RBY3Rpb25zKS5zb21lKChhY3Rpb25LZXkpID0+IHtcblx0XHRpZiAoYWN0aW9uS2V5ID09PSBkYXRhRmllbGRJZCkge1xuXHRcdFx0aWYgKFxuXHRcdFx0XHQoZGF0YUZpZWxkIGFzIERhdGFGaWVsZEZvckFjdGlvbik/LkFjdGlvblRhcmdldD8uaXNCb3VuZCB8fFxuXHRcdFx0XHQoZGF0YUZpZWxkIGFzIERhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbik/LlJlcXVpcmVzQ29udGV4dFxuXHRcdFx0KSB7XG5cdFx0XHRcdG1hbmlmZXN0QWN0aW9uc1tkYXRhRmllbGRJZF0ucmVxdWlyZXNTZWxlY3Rpb24gPSB0cnVlO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHRcdHJldHVybiBmYWxzZTtcblx0fSk7XG59XG4vKipcbiAqIExvb3AgdGhyb3VnaCB0aGUgRGF0YUZpZWxkRm9yQWN0aW9uIGFuZCBEYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb24gb2YgYSBsaW5lIGl0ZW0gYW5kXG4gKiBjaGVjayB0aGUgZm9sbG93aW5nOlxuICogSWYgYXQgbGVhc3Qgb25lIG9mIHRoZW0gaXMgYWx3YXlzIHZpc2libGUgaW4gdGhlIHRhYmxlIHRvb2xiYXIgYW5kIHJlcXVpcmVzIGEgY29udGV4dFxuICogSWYgYW4gYWN0aW9uIGlzIGFsc28gZGVmaW5lZCBpbiB0aGUgbWFuaWZlc3QsIGl0IGlzIHNldCBhc2lkZSBhbmQgd2lsbCBiZSBjb25zaWRlcmVkXG4gKiB3aGVuIGdvaW5nIHRocm91Z2ggdGhlIG1hbmlmZXN0LlxuICogQHBhcmFtIGxpbmVJdGVtQW5ub3RhdGlvbiBDb2xsZWN0aW9uIG9mIGRhdGEgZmllbGRzIGZvciByZXByZXNlbnRhdGlvbiBpbiBhIHRhYmxlIG9yIGxpc3RcbiAqIEBwYXJhbSBtYW5pZmVzdEFjdGlvbnMgVGhlIGFjdGlvbnMgZGVmaW5lZCBpbiB0aGUgbWFuaWZlc3RcbiAqIEBwYXJhbSBjdXJyZW50RW50aXR5VHlwZSBDdXJyZW50IEVudGl0eSBUeXBlXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlcmUgaXMgYXQgbGVhc3QgMSBhY3Rpb24gdGhhdCBtZWV0cyB0aGUgY3JpdGVyaWFcbiAqL1xuZnVuY3Rpb24gaGFzQm91bmRBY3Rpb25zQWx3YXlzVmlzaWJsZUluVG9vbEJhcihcblx0bGluZUl0ZW1Bbm5vdGF0aW9uOiBMaW5lSXRlbSxcblx0bWFuaWZlc3RBY3Rpb25zOiBSZWNvcmQ8c3RyaW5nLCBDdXN0b21BY3Rpb24+LFxuXHRjdXJyZW50RW50aXR5VHlwZTogRW50aXR5VHlwZVxuKTogYm9vbGVhbiB7XG5cdHJldHVybiBsaW5lSXRlbUFubm90YXRpb24uc29tZSgoZGF0YUZpZWxkKSA9PiB7XG5cdFx0aWYgKFxuXHRcdFx0KGRhdGFGaWVsZC4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQWN0aW9uIHx8XG5cdFx0XHRcdGRhdGFGaWVsZC4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uKSAmJlxuXHRcdFx0ZGF0YUZpZWxkPy5JbmxpbmU/LnZhbHVlT2YoKSAhPT0gdHJ1ZSAmJlxuXHRcdFx0KGRhdGFGaWVsZC5hbm5vdGF0aW9ucz8uVUk/LkhpZGRlbj8udmFsdWVPZigpID09PSBmYWxzZSB8fCBkYXRhRmllbGQuYW5ub3RhdGlvbnM/LlVJPy5IaWRkZW4/LnZhbHVlT2YoKSA9PT0gdW5kZWZpbmVkKVxuXHRcdCkge1xuXHRcdFx0aWYgKGRhdGFGaWVsZC4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQWN0aW9uKSB7XG5cdFx0XHRcdGNvbnN0IG1hbmlmZXN0QWN0aW9uSWQgPSBnZW5lcmF0ZShbXCJEYXRhRmllbGRGb3JBY3Rpb25cIiwgZGF0YUZpZWxkLkFjdGlvbiBhcyBzdHJpbmddKTtcblx0XHRcdFx0Ly8gaWYgdGhlIERhdGFGaWVsZEZvckFjdG9uIGZyb20gYW5ub3RhdGlvbiBhbHNvIGV4aXN0cyBpbiB0aGUgbWFuaWZlc3QsIGl0cyB2aXNpYmlsaXR5IHdpbGwgYmUgZXZhbHVhdGVkIGxhdGVyIG9uXG5cdFx0XHRcdGlmICh1cGRhdGVNYW5pZmVzdEFjdGlvbkFuZFRhZ0l0KG1hbmlmZXN0QWN0aW9uSWQsIGRhdGFGaWVsZCwgbWFuaWZlc3RBY3Rpb25zKSkge1xuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0XHQvLyBDaGVjayBpZiB0aGUgbGluZUl0ZW0gY29udGV4dCBpcyB0aGUgc2FtZSBhcyB0aGF0IG9mIHRoZSBhY3Rpb246XG5cdFx0XHRcdHJldHVybiBkYXRhRmllbGQ/LkFjdGlvblRhcmdldD8uaXNCb3VuZCAmJiBjdXJyZW50RW50aXR5VHlwZSA9PT0gZGF0YUZpZWxkPy5BY3Rpb25UYXJnZXQuc291cmNlRW50aXR5VHlwZTtcblx0XHRcdH0gZWxzZSBpZiAoZGF0YUZpZWxkLiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb24pIHtcblx0XHRcdFx0Ly8gaWYgdGhlIERhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbiBmcm9tIGFubm90YXRpb24gYWxzbyBleGlzdHMgaW4gdGhlIG1hbmlmZXN0LCBpdHMgdmlzaWJpbGl0eSB3aWxsIGJlIGV2YWx1YXRlZCBsYXRlciBvblxuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0dXBkYXRlTWFuaWZlc3RBY3Rpb25BbmRUYWdJdChcblx0XHRcdFx0XHRcdGBEYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb246OiR7ZGF0YUZpZWxkLlNlbWFudGljT2JqZWN0fTo6JHtkYXRhRmllbGQuQWN0aW9ufWAsXG5cdFx0XHRcdFx0XHRkYXRhRmllbGQsXG5cdFx0XHRcdFx0XHRtYW5pZmVzdEFjdGlvbnNcblx0XHRcdFx0XHQpXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gZGF0YUZpZWxkLlJlcXVpcmVzQ29udGV4dDtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9KTtcbn1cbi8qKlxuICogQ2hlY2tzIGlmIGEgY3VzdG9tIGFjdGlvbiB0aGF0IHJlcXVpcmVzIGEgY29udGV4dCBpcyBhbHdheXMgdmlzaWJsZSBpbiB0aGUgdG9vbGJhci5cbiAqIEBwYXJhbSBtYW5pZmVzdEFjdGlvbnMgVGhlIGFjdGlvbnMgZGVmaW5lZCBpbiB0aGUgbWFuaWZlc3RcbiAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGVyZSBpcyBhdCBsZWFzdCAxIGFjdGlvbiB0aGF0IG1lZXRzIHRoZSBjcml0ZXJpYVxuICovXG5mdW5jdGlvbiBoYXNDdXN0b21BY3Rpb25zQWx3YXlzVmlzaWJsZUluVG9vbEJhcihtYW5pZmVzdEFjdGlvbnM6IFJlY29yZDxzdHJpbmcsIEN1c3RvbUFjdGlvbj4pOiBib29sZWFuIHtcblx0Y29uc3QgY3VzdG9tQWN0aW9ucyA9IE9iamVjdC5rZXlzKG1hbmlmZXN0QWN0aW9ucykucmVkdWNlKChhY3Rpb25zOiBDdXN0b21BY3Rpb25bXSwgYWN0aW9uS2V5KSA9PiB7XG5cdFx0Y29uc3QgYWN0aW9uID0gbWFuaWZlc3RBY3Rpb25zW2FjdGlvbktleV07XG5cdFx0aWYgKCFhY3Rpb24ubWVudSkge1xuXHRcdFx0Ly9zaW1wbGUgY3VzdG9tIGFjdGlvblxuXHRcdFx0YWN0aW9ucy5wdXNoKGFjdGlvbik7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIGdyb3VwZWQgYWN0aW9uc1xuXHRcdFx0YWN0aW9ucyA9IFsuLi5hY3Rpb25zLCAuLi4oYWN0aW9uLm1lbnUuZmlsdGVyKChtZW51QWN0aW9uKSA9PiB0eXBlb2YgbWVudUFjdGlvbiAhPT0gXCJzdHJpbmdcIikgYXMgQ3VzdG9tQWN0aW9uW10pXTtcblx0XHR9XG5cdFx0cmV0dXJuIGFjdGlvbnM7XG5cdH0sIFtdKTtcblx0cmV0dXJuICEhY3VzdG9tQWN0aW9ucy5maW5kKFxuXHRcdChhY3Rpb24pID0+IGFjdGlvbi5yZXF1aXJlc1NlbGVjdGlvbiAmJiAoYWN0aW9uLnZpc2libGUgPT09IHVuZGVmaW5lZCB8fCBhY3Rpb24udmlzaWJsZT8udG9TdHJpbmcoKSA9PT0gXCJ0cnVlXCIpXG5cdCk7XG59XG4vKipcbiAqIEl0ZXJhdGVzIG92ZXIgdGhlIGN1c3RvbSBhY3Rpb25zICh3aXRoIGtleSByZXF1aXJlc1NlbGVjdGlvbikgZGVjbGFyZWQgaW4gdGhlIG1hbmlmZXN0IGZvciB0aGUgY3VycmVudCBsaW5lIGl0ZW0gYW5kIHJldHVybnMgYWxsIHRoZVxuICogdmlzaWJsZSBrZXkgdmFsdWVzIGFzIGFuIGV4cHJlc3Npb24uXG4gKiBAcGFyYW0gbWFuaWZlc3RBY3Rpb25zIFRoZSBhY3Rpb25zIGRlZmluZWQgaW4gdGhlIG1hbmlmZXN0XG4gKiBAcmV0dXJucyBBcnJheTxFeHByZXNzaW9uPGJvb2xlYW4+PiBBbGwgdGhlIHZpc2libGUgcGF0aCBleHByZXNzaW9ucyBvZiB0aGUgYWN0aW9ucyB0aGF0IG1lZXQgdGhlIGNyaXRlcmlhXG4gKi9cbmZ1bmN0aW9uIGdldFZpc2libGVFeHBGb3JDdXN0b21BY3Rpb25zUmVxdWlyaW5nQ29udGV4dChtYW5pZmVzdEFjdGlvbnM6IFJlY29yZDxzdHJpbmcsIEN1c3RvbUFjdGlvbj4pOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj5bXSB7XG5cdGNvbnN0IGFWaXNpYmxlUGF0aEV4cHJlc3Npb25zOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj5bXSA9IFtdO1xuXHRpZiAobWFuaWZlc3RBY3Rpb25zKSB7XG5cdFx0T2JqZWN0LmtleXMobWFuaWZlc3RBY3Rpb25zKS5mb3JFYWNoKChhY3Rpb25LZXkpID0+IHtcblx0XHRcdGNvbnN0IGFjdGlvbiA9IG1hbmlmZXN0QWN0aW9uc1thY3Rpb25LZXldO1xuXHRcdFx0aWYgKGFjdGlvbi5yZXF1aXJlc1NlbGVjdGlvbiA9PT0gdHJ1ZSAmJiBhY3Rpb24udmlzaWJsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGlmICh0eXBlb2YgYWN0aW9uLnZpc2libGUgPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdFx0XHQvKlRoZSBmaW5hbCBhaW0gd291bGQgYmUgdG8gY2hlY2sgaWYgdGhlIHBhdGggZXhwcmVzc2lvbiBkZXBlbmRzIG9uIHRoZSBwYXJlbnQgY29udGV4dFxuXHRcdFx0XHRcdGFuZCBjb25zaWRlcnMgb25seSB0aG9zZSBleHByZXNzaW9ucyBmb3IgdGhlIGV4cHJlc3Npb24gZXZhbHVhdGlvbixcblx0XHRcdFx0XHRidXQgY3VycmVudGx5IG5vdCBwb3NzaWJsZSBmcm9tIHRoZSBtYW5pZmVzdCBhcyB0aGUgdmlzaWJsZSBrZXkgaXMgYm91bmQgb24gdGhlIHBhcmVudCBlbnRpdHkuXG5cdFx0XHRcdFx0VHJpY2t5IHRvIGRpZmZlcmVudGlhdGUgdGhlIHBhdGggYXMgaXQncyBkb25lIGZvciB0aGUgSGlkZGVuIGFubm90YXRpb24uXG5cdFx0XHRcdFx0Rm9yIHRoZSB0aW1lIGJlaW5nIHdlIGNvbnNpZGVyIGFsbCB0aGUgcGF0aHMgb2YgdGhlIG1hbmlmZXN0Ki9cblx0XHRcdFx0XHRhVmlzaWJsZVBhdGhFeHByZXNzaW9ucy5wdXNoKHJlc29sdmVCaW5kaW5nU3RyaW5nKGFjdGlvbj8udmlzaWJsZT8udmFsdWVPZigpKSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXHRyZXR1cm4gYVZpc2libGVQYXRoRXhwcmVzc2lvbnM7XG59XG4vKipcbiAqIEV2YWx1YXRlIGlmIHRoZSBwYXRoIGlzIHN0YXRpY2FsbHkgZGVsZXRhYmxlIG9yIHVwZGF0YWJsZS5cbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcmV0dXJucyBUaGUgdGFibGUgY2FwYWJpbGl0aWVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDYXBhYmlsaXR5UmVzdHJpY3Rpb24oY29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+KTogVGFibGVDYXBhYmlsaXR5UmVzdHJpY3Rpb24ge1xuXHRjb25zdCBpc0RlbGV0YWJsZSA9IGlzUGF0aERlbGV0YWJsZShjb252ZXJ0ZXJDb250ZXh0LmdldERhdGFNb2RlbE9iamVjdFBhdGgoKSk7XG5cdGNvbnN0IGlzVXBkYXRhYmxlID0gaXNQYXRoVXBkYXRhYmxlKGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpKTtcblx0cmV0dXJuIHtcblx0XHRpc0RlbGV0YWJsZTogIShpc0NvbnN0YW50KGlzRGVsZXRhYmxlKSAmJiBpc0RlbGV0YWJsZS52YWx1ZSA9PT0gZmFsc2UpLFxuXHRcdGlzVXBkYXRhYmxlOiAhKGlzQ29uc3RhbnQoaXNVcGRhdGFibGUpICYmIGlzVXBkYXRhYmxlLnZhbHVlID09PSBmYWxzZSlcblx0fTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRTZWxlY3Rpb25Nb2RlKFxuXHRsaW5lSXRlbUFubm90YXRpb246IExpbmVJdGVtIHwgdW5kZWZpbmVkLFxuXHR2aXN1YWxpemF0aW9uUGF0aDogc3RyaW5nLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sXG5cdGlzRW50aXR5U2V0OiBib29sZWFuLFxuXHR0YXJnZXRDYXBhYmlsaXRpZXM6IFRhYmxlQ2FwYWJpbGl0eVJlc3RyaWN0aW9uLFxuXHRkZWxldGVCdXR0b25WaXNpYmlsaXR5RXhwcmVzc2lvbj86IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPixcblx0bWFzc0VkaXRWaXNpYmlsaXR5RXhwcmVzc2lvbjogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+ID0gY29uc3RhbnQoZmFsc2UpLFxuXHRjdXRCdXR0b25WaXNpYmlsaXR5RXhwcmVzc2lvbjogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+ID0gY29uc3RhbnQoZmFsc2UpXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRjb25zdCB0YWJsZU1hbmlmZXN0U2V0dGluZ3MgPSBjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0Q29udHJvbENvbmZpZ3VyYXRpb248VGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24+KHZpc3VhbGl6YXRpb25QYXRoKTtcblx0bGV0IHNlbGVjdGlvbk1vZGUgPSB0YWJsZU1hbmlmZXN0U2V0dGluZ3MudGFibGVTZXR0aW5ncz8uc2VsZWN0aW9uTW9kZTtcblx0Ly8gSWYgdGhlIHNlbGVjdGlvbiBtb2RlIGlzIGZvcmNlZCB0byAnTm9uZScgaW4gdGhlIG1hbmlmZXN0L21hY3JvIHRhYmxlIHBhcmFtZXRlcnMsIHdlIGlnbm9yZSB0aGUgcmVzdCBvZiB0aGUgbG9naWMgYW5kIGtlZXAgaXQgYXMgc3BlY2lmaWVkXG5cdGlmICghbGluZUl0ZW1Bbm5vdGF0aW9uIHx8IHNlbGVjdGlvbk1vZGUgPT09IFNlbGVjdGlvbk1vZGUuTm9uZSkge1xuXHRcdHJldHVybiBTZWxlY3Rpb25Nb2RlLk5vbmU7XG5cdH1cblx0aWYgKHNlbGVjdGlvbk1vZGUgPT09IFNlbGVjdGlvbk1vZGUuRm9yY2VNdWx0aSkge1xuXHRcdHJldHVybiBTZWxlY3Rpb25Nb2RlLk11bHRpO1xuXHR9IGVsc2UgaWYgKHNlbGVjdGlvbk1vZGUgPT09IFNlbGVjdGlvbk1vZGUuRm9yY2VTaW5nbGUpIHtcblx0XHRyZXR1cm4gU2VsZWN0aW9uTW9kZS5TaW5nbGU7XG5cdH1cblx0bGV0IGFIaWRkZW5CaW5kaW5nRXhwcmVzc2lvbnM6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPltdID0gW10sXG5cdFx0YVZpc2libGVCaW5kaW5nRXhwcmVzc2lvbnM6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPltdID0gW107XG5cdGNvbnN0IG1hbmlmZXN0QWN0aW9ucyA9IGdldEFjdGlvbnNGcm9tTWFuaWZlc3QoXG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXRNYW5pZmVzdENvbnRyb2xDb25maWd1cmF0aW9uPFRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uPih2aXN1YWxpemF0aW9uUGF0aCkuYWN0aW9ucyxcblx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdFtdLFxuXHRcdHVuZGVmaW5lZCxcblx0XHRmYWxzZVxuXHQpO1xuXHRsZXQgaXNQYXJlbnREZWxldGFibGUsIHBhcmVudEVudGl0eVNldERlbGV0YWJsZTtcblx0aWYgKGNvbnZlcnRlckNvbnRleHQuZ2V0VGVtcGxhdGVUeXBlKCkgPT09IFRlbXBsYXRlVHlwZS5PYmplY3RQYWdlKSB7XG5cdFx0aXNQYXJlbnREZWxldGFibGUgPSBpc1BhdGhEZWxldGFibGUoY29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCkpO1xuXHRcdHBhcmVudEVudGl0eVNldERlbGV0YWJsZSA9IGlzUGFyZW50RGVsZXRhYmxlID8gY29tcGlsZUV4cHJlc3Npb24oaXNQYXJlbnREZWxldGFibGUsIHRydWUpIDogaXNQYXJlbnREZWxldGFibGU7XG5cdH1cblx0Y29uc3QgYk1hc3NFZGl0RW5hYmxlZDogYm9vbGVhbiA9ICFpc0NvbnN0YW50KG1hc3NFZGl0VmlzaWJpbGl0eUV4cHJlc3Npb24pIHx8IG1hc3NFZGl0VmlzaWJpbGl0eUV4cHJlc3Npb24udmFsdWUgIT09IGZhbHNlO1xuXHRpZiAoIXNlbGVjdGlvbk1vZGUgfHwgc2VsZWN0aW9uTW9kZSA9PT0gU2VsZWN0aW9uTW9kZS5BdXRvKSB7XG5cdFx0c2VsZWN0aW9uTW9kZSA9IFNlbGVjdGlvbk1vZGUuTXVsdGk7XG5cdH1cblx0aWYgKGJNYXNzRWRpdEVuYWJsZWQpIHtcblx0XHQvLyBPdmVycmlkZSBkZWZhdWx0IHNlbGVjdGlvbiBtb2RlIHdoZW4gbWFzcyBlZGl0IGlzIHZpc2libGVcblx0XHRzZWxlY3Rpb25Nb2RlID0gc2VsZWN0aW9uTW9kZSA9PT0gU2VsZWN0aW9uTW9kZS5TaW5nbGUgPyBTZWxlY3Rpb25Nb2RlLlNpbmdsZSA6IFNlbGVjdGlvbk1vZGUuTXVsdGk7XG5cdH1cblx0aWYgKFxuXHRcdGhhc0JvdW5kQWN0aW9uc0Fsd2F5c1Zpc2libGVJblRvb2xCYXIobGluZUl0ZW1Bbm5vdGF0aW9uLCBtYW5pZmVzdEFjdGlvbnMuYWN0aW9ucywgY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlUeXBlKCkpIHx8XG5cdFx0aGFzQ3VzdG9tQWN0aW9uc0Fsd2F5c1Zpc2libGVJblRvb2xCYXIobWFuaWZlc3RBY3Rpb25zLmFjdGlvbnMpXG5cdCkge1xuXHRcdHJldHVybiBzZWxlY3Rpb25Nb2RlO1xuXHR9XG5cdGFIaWRkZW5CaW5kaW5nRXhwcmVzc2lvbnMgPSBnZXRVSUhpZGRlbkV4cEZvckFjdGlvbnNSZXF1aXJpbmdDb250ZXh0KFxuXHRcdGxpbmVJdGVtQW5ub3RhdGlvbixcblx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVR5cGUoKSxcblx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldERhdGFNb2RlbE9iamVjdFBhdGgoKVxuXHQpO1xuXHRhVmlzaWJsZUJpbmRpbmdFeHByZXNzaW9ucyA9IGdldFZpc2libGVFeHBGb3JDdXN0b21BY3Rpb25zUmVxdWlyaW5nQ29udGV4dChtYW5pZmVzdEFjdGlvbnMuYWN0aW9ucyk7XG5cdC8vIE5vIGFjdGlvbiByZXF1aXJpbmcgYSBjb250ZXh0OlxuXHRpZiAoXG5cdFx0YUhpZGRlbkJpbmRpbmdFeHByZXNzaW9ucy5sZW5ndGggPT09IDAgJiZcblx0XHRhVmlzaWJsZUJpbmRpbmdFeHByZXNzaW9ucy5sZW5ndGggPT09IDAgJiZcblx0XHQoY3V0QnV0dG9uVmlzaWJpbGl0eUV4cHJlc3Npb24gfHwgZGVsZXRlQnV0dG9uVmlzaWJpbGl0eUV4cHJlc3Npb24gfHwgYk1hc3NFZGl0RW5hYmxlZClcblx0KSB7XG5cdFx0aWYgKCFpc0VudGl0eVNldCkge1xuXHRcdFx0Ly8gRXhhbXBsZTogT1AgY2FzZVxuXHRcdFx0aWYgKHRhcmdldENhcGFiaWxpdGllcy5pc0RlbGV0YWJsZSB8fCBwYXJlbnRFbnRpdHlTZXREZWxldGFibGUgIT09IFwiZmFsc2VcIiB8fCBiTWFzc0VkaXRFbmFibGVkKSB7XG5cdFx0XHRcdC8vIEJ1aWxkaW5nIGV4cHJlc3Npb24gZm9yIGRlbGV0ZSBhbmQgbWFzcyBlZGl0XG5cdFx0XHRcdGNvbnN0IGJ1dHRvblZpc2liaWxpdHlFeHByZXNzaW9uID0gb3IoXG5cdFx0XHRcdFx0Y3V0QnV0dG9uVmlzaWJpbGl0eUV4cHJlc3Npb24gfHwgdHJ1ZSxcblx0XHRcdFx0XHRkZWxldGVCdXR0b25WaXNpYmlsaXR5RXhwcmVzc2lvbiB8fCB0cnVlLCAvLyBkZWZhdWx0IGRlbGV0ZSB2aXNpYmlsaXR5IGFzIHRydWVcblx0XHRcdFx0XHRtYXNzRWRpdFZpc2liaWxpdHlFeHByZXNzaW9uXG5cdFx0XHRcdCk7XG5cdFx0XHRcdHJldHVybiBjb21waWxlRXhwcmVzc2lvbihcblx0XHRcdFx0XHRpZkVsc2UoYW5kKFVJLklzRWRpdGFibGUsIGJ1dHRvblZpc2liaWxpdHlFeHByZXNzaW9uKSwgY29uc3RhbnQoc2VsZWN0aW9uTW9kZSksIGNvbnN0YW50KFNlbGVjdGlvbk1vZGUuTm9uZSkpXG5cdFx0XHRcdCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXR1cm4gY29tcGlsZUV4cHJlc3Npb24oXG5cdFx0XHRcdFx0aWZFbHNlKGN1dEJ1dHRvblZpc2liaWxpdHlFeHByZXNzaW9uLCBjb25zdGFudChTZWxlY3Rpb25Nb2RlLlNpbmdsZSksIGNvbnN0YW50KFNlbGVjdGlvbk1vZGUuTm9uZSkpXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0XHQvLyBFbnRpdHlTZXQgZGVsZXRhYmxlOlxuXHRcdH0gZWxzZSBpZiAoYk1hc3NFZGl0RW5hYmxlZCkge1xuXHRcdFx0Ly8gZXhhbXBsZTogTFIgc2NlbmFyaW9cblx0XHRcdHJldHVybiBzZWxlY3Rpb25Nb2RlO1xuXHRcdH0gZWxzZSBpZiAodGFyZ2V0Q2FwYWJpbGl0aWVzLmlzRGVsZXRhYmxlICYmIGRlbGV0ZUJ1dHRvblZpc2liaWxpdHlFeHByZXNzaW9uKSB7XG5cdFx0XHRyZXR1cm4gY29tcGlsZUV4cHJlc3Npb24oaWZFbHNlKGRlbGV0ZUJ1dHRvblZpc2liaWxpdHlFeHByZXNzaW9uLCBjb25zdGFudChzZWxlY3Rpb25Nb2RlKSwgY29uc3RhbnQoU2VsZWN0aW9uTW9kZS5Ob25lKSkpO1xuXHRcdFx0Ly8gRW50aXR5U2V0IG5vdCBkZWxldGFibGU6XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBTZWxlY3Rpb25Nb2RlLk5vbmU7XG5cdFx0fVxuXHRcdC8vIFRoZXJlIGFyZSBhY3Rpb25zIHJlcXVpcmluZyBhIGNvbnRleHQ6XG5cdH0gZWxzZSBpZiAoIWlzRW50aXR5U2V0KSB7XG5cdFx0Ly8gRXhhbXBsZTogT1AgY2FzZVxuXHRcdGlmICh0YXJnZXRDYXBhYmlsaXRpZXMuaXNEZWxldGFibGUgfHwgcGFyZW50RW50aXR5U2V0RGVsZXRhYmxlICE9PSBcImZhbHNlXCIgfHwgYk1hc3NFZGl0RW5hYmxlZCkge1xuXHRcdFx0Ly8gVXNlIHNlbGVjdGlvbk1vZGUgaW4gZWRpdCBtb2RlIGlmIGRlbGV0ZSBpcyBlbmFibGVkIG9yIG1hc3MgZWRpdCBpcyB2aXNpYmxlXG5cdFx0XHRjb25zdCBlZGl0TW9kZWJ1dHRvblZpc2liaWxpdHlFeHByZXNzaW9uID0gaWZFbHNlKFxuXHRcdFx0XHRiTWFzc0VkaXRFbmFibGVkICYmICF0YXJnZXRDYXBhYmlsaXRpZXMuaXNEZWxldGFibGUsXG5cdFx0XHRcdG1hc3NFZGl0VmlzaWJpbGl0eUV4cHJlc3Npb24sXG5cdFx0XHRcdGNvbnN0YW50KHRydWUpXG5cdFx0XHQpO1xuXHRcdFx0cmV0dXJuIGNvbXBpbGVFeHByZXNzaW9uKFxuXHRcdFx0XHRpZkVsc2UoXG5cdFx0XHRcdFx0YW5kKFVJLklzRWRpdGFibGUsIGVkaXRNb2RlYnV0dG9uVmlzaWJpbGl0eUV4cHJlc3Npb24pLFxuXHRcdFx0XHRcdGNvbnN0YW50KHNlbGVjdGlvbk1vZGUpLFxuXHRcdFx0XHRcdGlmRWxzZShcblx0XHRcdFx0XHRcdG9yKC4uLmFIaWRkZW5CaW5kaW5nRXhwcmVzc2lvbnMuY29uY2F0KGFWaXNpYmxlQmluZGluZ0V4cHJlc3Npb25zKSksXG5cdFx0XHRcdFx0XHRjb25zdGFudChzZWxlY3Rpb25Nb2RlKSxcblx0XHRcdFx0XHRcdGNvbnN0YW50KFNlbGVjdGlvbk1vZGUuTm9uZSlcblx0XHRcdFx0XHQpXG5cdFx0XHRcdClcblx0XHRcdCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBjb21waWxlRXhwcmVzc2lvbihcblx0XHRcdFx0aWZFbHNlKFxuXHRcdFx0XHRcdG9yKC4uLmFIaWRkZW5CaW5kaW5nRXhwcmVzc2lvbnMuY29uY2F0KGFWaXNpYmxlQmluZGluZ0V4cHJlc3Npb25zKSksXG5cdFx0XHRcdFx0Y29uc3RhbnQoc2VsZWN0aW9uTW9kZSksXG5cdFx0XHRcdFx0Y29uc3RhbnQoU2VsZWN0aW9uTW9kZS5Ob25lKVxuXHRcdFx0XHQpXG5cdFx0XHQpO1xuXHRcdH1cblx0XHQvL0VudGl0eVNldCBkZWxldGFibGU6XG5cdH0gZWxzZSBpZiAodGFyZ2V0Q2FwYWJpbGl0aWVzLmlzRGVsZXRhYmxlIHx8IGJNYXNzRWRpdEVuYWJsZWQpIHtcblx0XHQvLyBFeGFtcGxlOiBMUiBzY2VuYXJpb1xuXHRcdHJldHVybiBzZWxlY3Rpb25Nb2RlO1xuXHRcdC8vRW50aXR5U2V0IG5vdCBkZWxldGFibGU6XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIGNvbXBpbGVFeHByZXNzaW9uKFxuXHRcdFx0aWZFbHNlKFxuXHRcdFx0XHRvciguLi5hSGlkZGVuQmluZGluZ0V4cHJlc3Npb25zLmNvbmNhdChhVmlzaWJsZUJpbmRpbmdFeHByZXNzaW9ucyksIG1hc3NFZGl0VmlzaWJpbGl0eUV4cHJlc3Npb24pLFxuXHRcdFx0XHRjb25zdGFudChzZWxlY3Rpb25Nb2RlKSxcblx0XHRcdFx0Y29uc3RhbnQoU2VsZWN0aW9uTW9kZS5Ob25lKVxuXHRcdFx0KVxuXHRcdCk7XG5cdH1cbn1cblxuLyoqXG4gKiBNZXRob2QgdG8gcmV0cmlldmUgYWxsIHRhYmxlIGFjdGlvbnMgZnJvbSBhbm5vdGF0aW9ucy5cbiAqIEBwYXJhbSBsaW5lSXRlbUFubm90YXRpb25cbiAqIEBwYXJhbSB2aXN1YWxpemF0aW9uUGF0aFxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHRcbiAqIEByZXR1cm5zIFRoZSB0YWJsZSBhbm5vdGF0aW9uIGFjdGlvbnNcbiAqL1xuZnVuY3Rpb24gZ2V0VGFibGVBbm5vdGF0aW9uQWN0aW9ucyhcblx0bGluZUl0ZW1Bbm5vdGF0aW9uOiBMaW5lSXRlbSxcblx0dmlzdWFsaXphdGlvblBhdGg6IHN0cmluZyxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+XG4pOiB7IHRhYmxlQWN0aW9uczogQW5ub3RhdGlvbkFjdGlvbltdIH0ge1xuXHRjb25zdCB0YWJsZUFjdGlvbnM6IEFubm90YXRpb25BY3Rpb25bXSA9IFtdO1xuXHRjb25zdCBjb3B5RGF0YUZpZWxkID0gZ2V0Q29weUFjdGlvbihcblx0XHRsaW5lSXRlbUFubm90YXRpb24uZmlsdGVyKChkYXRhRmllbGQpID0+IHtcblx0XHRcdHJldHVybiBkYXRhRmllbGRJc0NvcHlBY3Rpb24oZGF0YUZpZWxkIGFzIERhdGFGaWVsZEZvckFjdGlvblR5cGVzKTtcblx0XHR9KSBhcyBEYXRhRmllbGRGb3JBY3Rpb25UeXBlc1tdXG5cdCk7XG5cdGNvbnN0IHNFbnRpdHlUeXBlID0gY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlUeXBlKCkuZnVsbHlRdWFsaWZpZWROYW1lO1xuXHRjb25zdCB2aXNpYmxlRXhwcmVzc2lvbiA9IGZ1bmN0aW9uIChcblx0XHRkYXRhRmllbGQ6IERhdGFGaWVsZEZvckFjdGlvbiB8IERhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbiB8IHVuZGVmaW5lZFxuXHQpOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj4ge1xuXHRcdHJldHVybiBub3QoXG5cdFx0XHRlcXVhbChcblx0XHRcdFx0Z2V0RXhwcmVzc2lvbkZyb21Bbm5vdGF0aW9uKFxuXHRcdFx0XHRcdGRhdGFGaWVsZD8uYW5ub3RhdGlvbnM/LlVJPy5IaWRkZW4sXG5cdFx0XHRcdFx0W10sXG5cdFx0XHRcdFx0dW5kZWZpbmVkLFxuXHRcdFx0XHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0UmVsYXRpdmVNb2RlbFBhdGhGdW5jdGlvbigpXG5cdFx0XHRcdCksXG5cdFx0XHRcdHRydWVcblx0XHRcdClcblx0XHQpO1xuXHR9O1xuXHQvLyBGb3IgdGhlIGNvbnRleHQgbWVudSwgdGhlIHZpc2liaWxpdHkgc2hvdWxkIGFsc28gY29uc2lkZXIgdGhlICdpbmFjdGl2ZUNvbnRleHQnIHByb3BlcnR5OlxuXHQvLyBvbmx5IHdoZW4gYXQgbGVhc3Qgb25lIHNlbGVjdGVkIGNvbnRleHQgaXMgYWN0aXZlIChpLmUuIFwiY29udGV4dG1lbnUvaW5hY3RpdmVDb250ZXh0XCIgaXMgZmFsc2UpLCB0aGUgYWN0aW9uIHNob3VsZCBiZSB2aXNpYmxlIGluIHRoZSBjb250ZXh0IG1lbnVcblx0Ly8gVGhpcyBpcyBvbmx5IHJlbGV2YW50IHdoZW4gdGhlIHRhYmxlIG1hbmlmZXN0IHNldHRpbmcgXCJjcmVhdGlvbk1vZGVcIiBpcyBcIklubGluZUNyZWF0aW9uUm93c1wiXG5cdGNvbnN0IHZpc2libGVGb3JDb250ZXh0TWVudUV4cHJlc3Npb24gPSBmdW5jdGlvbiAoXG5cdFx0ZGF0YUZpZWxkOiBEYXRhRmllbGRGb3JBY3Rpb24gfCBEYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb24gfCB1bmRlZmluZWRcblx0KTogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0XHRyZXR1cm4gYW5kKHZpc2libGVFeHByZXNzaW9uKGRhdGFGaWVsZCksIGVxdWFsKHBhdGhJbk1vZGVsKFwiY29udGV4dG1lbnUvaW5hY3RpdmVDb250ZXh0XCIsIFwiaW50ZXJuYWxcIiksIGZhbHNlKSk7XG5cdH07XG5cdGlmIChjb3B5RGF0YUZpZWxkKSB7XG5cdFx0dGFibGVBY3Rpb25zLnB1c2goe1xuXHRcdFx0dHlwZTogQWN0aW9uVHlwZS5Db3B5LFxuXHRcdFx0YW5ub3RhdGlvblBhdGg6IGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0QmFzZWRBbm5vdGF0aW9uUGF0aChjb3B5RGF0YUZpZWxkLmZ1bGx5UXVhbGlmaWVkTmFtZSksXG5cdFx0XHRrZXk6IEtleUhlbHBlci5nZW5lcmF0ZUtleUZyb21EYXRhRmllbGQoY29weURhdGFGaWVsZCksXG5cdFx0XHR2aXNpYmxlOiBjb21waWxlRXhwcmVzc2lvbih2aXNpYmxlRXhwcmVzc2lvbihjb3B5RGF0YUZpZWxkKSksXG5cdFx0XHR2aXNpYmxlRm9yQ29udGV4dE1lbnU6IGNvbXBpbGVFeHByZXNzaW9uKHZpc2libGVGb3JDb250ZXh0TWVudUV4cHJlc3Npb24oY29weURhdGFGaWVsZCkpLFxuXHRcdFx0dGV4dDogY29weURhdGFGaWVsZC5MYWJlbD8udG9TdHJpbmcoKSA/PyBMaWJyYXJ5LmdldFJlc291cmNlQnVuZGxlRm9yKFwic2FwLmZlLmNvcmVcIikhLmdldFRleHQoXCJDX0NPTU1PTl9DT1BZXCIpLFxuXHRcdFx0aXNOYXZpZ2FibGU6IHRydWVcblx0XHR9KTtcblx0fVxuXHRsaW5lSXRlbUFubm90YXRpb25cblx0XHQuZmlsdGVyKChkYXRhRmllbGQpID0+IHtcblx0XHRcdHJldHVybiAhZGF0YUZpZWxkSXNDb3B5QWN0aW9uKGRhdGFGaWVsZCBhcyBEYXRhRmllbGRGb3JBY3Rpb24pO1xuXHRcdH0pXG5cdFx0LmZvckVhY2goKGRhdGFGaWVsZDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcykgPT4ge1xuXHRcdFx0aWYgKFxuXHRcdFx0XHRpc0RhdGFGaWVsZEZvckFjdGlvbkFic3RyYWN0KGRhdGFGaWVsZCkgJiZcblx0XHRcdFx0ZGF0YUZpZWxkLklubGluZT8udmFsdWVPZigpICE9PSB0cnVlICYmXG5cdFx0XHRcdGRhdGFGaWVsZC5EZXRlcm1pbmluZz8udmFsdWVPZigpICE9PSB0cnVlXG5cdFx0XHQpIHtcblx0XHRcdFx0c3dpdGNoIChkYXRhRmllbGQuJFR5cGUpIHtcblx0XHRcdFx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFjdGlvbjpcblx0XHRcdFx0XHRcdGNvbnN0IHRhYmxlQWN0aW9uOiBBbm5vdGF0aW9uQWN0aW9uID0ge1xuXHRcdFx0XHRcdFx0XHR0eXBlOiBBY3Rpb25UeXBlLkRhdGFGaWVsZEZvckFjdGlvbixcblx0XHRcdFx0XHRcdFx0YW5ub3RhdGlvblBhdGg6IGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0QmFzZWRBbm5vdGF0aW9uUGF0aChkYXRhRmllbGQuZnVsbHlRdWFsaWZpZWROYW1lKSxcblx0XHRcdFx0XHRcdFx0a2V5OiBLZXlIZWxwZXIuZ2VuZXJhdGVLZXlGcm9tRGF0YUZpZWxkKGRhdGFGaWVsZCksXG5cdFx0XHRcdFx0XHRcdHZpc2libGU6IGNvbXBpbGVFeHByZXNzaW9uKHZpc2libGVFeHByZXNzaW9uKGRhdGFGaWVsZCkpLFxuXHRcdFx0XHRcdFx0XHR2aXNpYmxlRm9yQ29udGV4dE1lbnU6IGNvbXBpbGVFeHByZXNzaW9uKHZpc2libGVGb3JDb250ZXh0TWVudUV4cHJlc3Npb24oZGF0YUZpZWxkKSksXG5cdFx0XHRcdFx0XHRcdGlzTmF2aWdhYmxlOiB0cnVlXG5cdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0aWYgKF91c2VFbmFibGVkRXhwcmVzc2lvbihkYXRhRmllbGQsIHNFbnRpdHlUeXBlKSkge1xuXHRcdFx0XHRcdFx0XHR0YWJsZUFjdGlvbi5lbmFibGVkID0gZ2V0RW5hYmxlZEZvckFubm90YXRpb25BY3Rpb24oY29udmVydGVyQ29udGV4dCwgZGF0YUZpZWxkLkFjdGlvblRhcmdldCwgdHJ1ZSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR0YWJsZUFjdGlvbnMucHVzaCh0YWJsZUFjdGlvbik7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbjpcblx0XHRcdFx0XHRcdHRhYmxlQWN0aW9ucy5wdXNoKHtcblx0XHRcdFx0XHRcdFx0dHlwZTogQWN0aW9uVHlwZS5EYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb24sXG5cdFx0XHRcdFx0XHRcdGFubm90YXRpb25QYXRoOiBjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVNldEJhc2VkQW5ub3RhdGlvblBhdGgoZGF0YUZpZWxkLmZ1bGx5UXVhbGlmaWVkTmFtZSksXG5cdFx0XHRcdFx0XHRcdGtleTogS2V5SGVscGVyLmdlbmVyYXRlS2V5RnJvbURhdGFGaWVsZChkYXRhRmllbGQpLFxuXHRcdFx0XHRcdFx0XHR2aXNpYmxlOiBjb21waWxlRXhwcmVzc2lvbih2aXNpYmxlRXhwcmVzc2lvbihkYXRhRmllbGQpKSxcblx0XHRcdFx0XHRcdFx0dmlzaWJsZUZvckNvbnRleHRNZW51OiBjb21waWxlRXhwcmVzc2lvbih2aXNpYmxlRm9yQ29udGV4dE1lbnVFeHByZXNzaW9uKGRhdGFGaWVsZCkpXG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHRyZXR1cm4ge1xuXHRcdHRhYmxlQWN0aW9uc1xuXHR9O1xufVxuLyoqXG4gKiBHZW5lcmF0ZSB0aGUgYmluZGluZ0V4cHJlc3Npb24gZm9yIHRoZSBoaWdobGlnaHQgcm93U2V0dGluZyBwYXJhbWV0ZXIuXG4gKiBAcGFyYW0gY3JpdGljYWxpdHlBbm5vdGF0aW9uIFBhdGggb3IgdmFsdWUgb2YgdGhlIGNyaXRpY2FsaXR5XG4gKiBAcGFyYW0gaXNEcmFmdFJvb3RPck5vZGUgIElzIHRoZSBjdXJyZW50IGVudGl0eVNldCBhbiBEcmFmdCByb290IG9yIGEgbm9kZVxuICogQHBhcmFtIHRhcmdldEVudGl0eVR5cGUgVGhlIHRhcmdldGVkIGVudGl0eVR5cGVcbiAqIEByZXR1cm5zIEFuIGV4cHJlc3Npb25CaW5kaW5nXG4gKi9cbmZ1bmN0aW9uIGdldEhpZ2hsaWdodFJvd0JpbmRpbmcoXG5cdGNyaXRpY2FsaXR5QW5ub3RhdGlvbjogQ3JpdGljYWxpdHkgfCB1bmRlZmluZWQsXG5cdGlzRHJhZnRSb290T3JOb2RlOiBib29sZWFuLFxuXHR0YXJnZXRFbnRpdHlUeXBlPzogRW50aXR5VHlwZVxuKTogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPE1lc3NhZ2VUeXBlPiB7XG5cdGxldCBkZWZhdWx0SGlnaGxpZ2h0Um93RGVmaW5pdGlvbjogTWVzc2FnZVR5cGUgfCBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248TWVzc2FnZVR5cGU+ID0gTWVzc2FnZVR5cGUuTm9uZTtcblx0aWYgKGNyaXRpY2FsaXR5QW5ub3RhdGlvbikge1xuXHRcdGlmICh0eXBlb2YgY3JpdGljYWxpdHlBbm5vdGF0aW9uID09PSBcIm9iamVjdFwiKSB7XG5cdFx0XHRkZWZhdWx0SGlnaGxpZ2h0Um93RGVmaW5pdGlvbiA9IGdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbihjcml0aWNhbGl0eUFubm90YXRpb24pIGFzIEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxNZXNzYWdlVHlwZT47XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIEVudW0gVmFsdWUgc28gd2UgZ2V0IHRoZSBjb3JyZXNwb25kaW5nIHN0YXRpYyBwYXJ0XG5cdFx0XHRkZWZhdWx0SGlnaGxpZ2h0Um93RGVmaW5pdGlvbiA9IGdldE1lc3NhZ2VUeXBlRnJvbUNyaXRpY2FsaXR5VHlwZShjcml0aWNhbGl0eUFubm90YXRpb24pO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gZm9ybWF0UmVzdWx0KFxuXHRcdFtcblx0XHRcdGRlZmF1bHRIaWdobGlnaHRSb3dEZWZpbml0aW9uLFxuXHRcdFx0cGF0aEluTW9kZWwoYGZpbHRlcmVkTWVzc2FnZXNgLCBcImludGVybmFsXCIpLFxuXHRcdFx0aXNEcmFmdFJvb3RPck5vZGUgJiYgRW50aXR5Lkhhc0FjdGl2ZSxcblx0XHRcdGlzRHJhZnRSb290T3JOb2RlICYmIEVudGl0eS5Jc0FjdGl2ZSxcblx0XHRcdGAke2lzRHJhZnRSb290T3JOb2RlfWAsXG5cdFx0XHRwYXRoSW5Nb2RlbChcIkAkdWk1LmZlLmNvbnRleHRQYXRoXCIpXG5cdFx0XSxcblx0XHR0YWJsZUZvcm1hdHRlcnMucm93SGlnaGxpZ2h0aW5nLFxuXHRcdHRhcmdldEVudGl0eVR5cGVcblx0KTtcbn1cbmZ1bmN0aW9uIF9nZXRDcmVhdGlvbkJlaGF2aW91cihcblx0bGluZUl0ZW1Bbm5vdGF0aW9uOiBMaW5lSXRlbSB8IHVuZGVmaW5lZCxcblx0dGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb246IFRhYmxlQ29udHJvbENvbmZpZ3VyYXRpb24sXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pixcblx0bmF2aWdhdGlvblNldHRpbmdzOiBOYXZpZ2F0aW9uU2V0dGluZ3NDb25maWd1cmF0aW9uLFxuXHR2aXN1YWxpemF0aW9uUGF0aDogc3RyaW5nXG4pOiBUYWJsZUFubm90YXRpb25Db25maWd1cmF0aW9uW1wiY3JlYXRlXCJdIHtcblx0Y29uc3QgbmF2aWdhdGlvbiA9IG5hdmlnYXRpb25TZXR0aW5ncz8uY3JlYXRlIHx8IG5hdmlnYXRpb25TZXR0aW5ncz8uZGV0YWlsO1xuXHRjb25zdCB0YWJsZU1hbmlmZXN0U2V0dGluZ3M6IFRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uID0gY29udmVydGVyQ29udGV4dC5nZXRNYW5pZmVzdENvbnRyb2xDb25maWd1cmF0aW9uKHZpc3VhbGl6YXRpb25QYXRoKTtcblx0Y29uc3Qgb3JpZ2luYWxUYWJsZVNldHRpbmdzID0gKHRhYmxlTWFuaWZlc3RTZXR0aW5ncyAmJiB0YWJsZU1hbmlmZXN0U2V0dGluZ3MudGFibGVTZXR0aW5ncykgfHwge307XG5cdC8vIGNyb3NzLWFwcFxuXHRpZiAobmF2aWdhdGlvbj8ub3V0Ym91bmQgJiYgbmF2aWdhdGlvbi5vdXRib3VuZERldGFpbCAmJiBuYXZpZ2F0aW9uU2V0dGluZ3M/LmNyZWF0ZSkge1xuXHRcdHJldHVybiB7XG5cdFx0XHRtb2RlOiBcIkV4dGVybmFsXCIsXG5cdFx0XHRvdXRib3VuZDogbmF2aWdhdGlvbi5vdXRib3VuZCxcblx0XHRcdG91dGJvdW5kRGV0YWlsOiBuYXZpZ2F0aW9uLm91dGJvdW5kRGV0YWlsLFxuXHRcdFx0bmF2aWdhdGlvblNldHRpbmdzOiBuYXZpZ2F0aW9uU2V0dGluZ3Ncblx0XHR9O1xuXHR9XG5cdGlmIChcblx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldFRlbXBsYXRlVHlwZSgpID09PSBUZW1wbGF0ZVR5cGUuTGlzdFJlcG9ydCAmJlxuXHRcdCFbQ3JlYXRpb25Nb2RlLk5ld1BhZ2UsIENyZWF0aW9uTW9kZS5FeHRlcm5hbCwgQ3JlYXRpb25Nb2RlLkNyZWF0aW9uRGlhbG9nXS5pbmNsdWRlcyh0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbi5jcmVhdGlvbk1vZGUpXG5cdCkge1xuXHRcdC8vIEZhbGxiYWNrIHRvIFwiTmV3UGFnZVwiXG5cdFx0TG9nLndhcm5pbmcoXG5cdFx0XHRgQ3JlYXRpb24gbW9kZSAnJHt0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbi5jcmVhdGlvbk1vZGV9JyBjYW4gbm90IGJlIHVzZWQgd2l0aGluIHRoZSBMaXN0IFJlcG9ydC4gSW5zdGVhZCwgdGhlIGRlZmF1bHQgbW9kZSBcIk5ld1BhZ2VcIiBpcyB1c2VkLmBcblx0XHQpO1xuXHRcdHRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uLmNyZWF0aW9uTW9kZSA9IENyZWF0aW9uTW9kZS5OZXdQYWdlO1xuXHR9IGVsc2UgaWYgKFxuXHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0VGVtcGxhdGVUeXBlKCkgIT09IFRlbXBsYXRlVHlwZS5MaXN0UmVwb3J0ICYmXG5cdFx0dGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24udHlwZSA9PT0gXCJUcmVlVGFibGVcIiAmJlxuXHRcdCFbQ3JlYXRpb25Nb2RlLk5ld1BhZ2UsIENyZWF0aW9uTW9kZS5JbmxpbmUsIENyZWF0aW9uTW9kZS5DcmVhdGlvbkRpYWxvZ10uaW5jbHVkZXModGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24uY3JlYXRpb25Nb2RlKVxuXHQpIHtcblx0XHQvLyBGYWxsYmFjayB0byBcIk5ld1BhZ2VcIiBpbiBjYXNlIG9mIGEgbm9uLXN1cHBvcnRlZCBtb2RlIGZvciBhIFRyZWVUYWJsZVxuXHRcdExvZy53YXJuaW5nKFxuXHRcdFx0YENyZWF0aW9uIG1vZGUgJyR7dGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24uY3JlYXRpb25Nb2RlfScgY2FuIG5vdCBiZSB1c2VkIHdpdGggYSBUcmVlIFRhYmxlLiBJbnN0ZWFkLCB0aGUgZGVmYXVsdCBtb2RlIFwiTmV3UGFnZVwiIGlzIHVzZWQuYFxuXHRcdCk7XG5cdFx0dGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24uY3JlYXRpb25Nb2RlID0gQ3JlYXRpb25Nb2RlLk5ld1BhZ2U7XG5cdH1cblx0bGV0IG5ld0FjdGlvbjtcblx0aWYgKGxpbmVJdGVtQW5ub3RhdGlvbikge1xuXHRcdC8vIGluLWFwcFxuXHRcdGNvbnN0IHRhcmdldEFubm90YXRpb25zID0gY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlTZXQoKT8uYW5ub3RhdGlvbnM7XG5cdFx0Y29uc3QgdGFyZ2V0QW5ub3RhdGlvbnNDb21tb24gPSB0YXJnZXRBbm5vdGF0aW9ucz8uQ29tbW9uIGFzIEVudGl0eVNldEFubm90YXRpb25zX0NvbW1vbixcblx0XHRcdHRhcmdldEFubm90YXRpb25zU2Vzc2lvbiA9IHRhcmdldEFubm90YXRpb25zPy5TZXNzaW9uIGFzIEVudGl0eVNldEFubm90YXRpb25zX1Nlc3Npb247XG5cdFx0bmV3QWN0aW9uID0gdGFyZ2V0QW5ub3RhdGlvbnNDb21tb24/LkRyYWZ0Um9vdD8uTmV3QWN0aW9uIHx8IHRhcmdldEFubm90YXRpb25zU2Vzc2lvbj8uU3RpY2t5U2Vzc2lvblN1cHBvcnRlZD8uTmV3QWN0aW9uO1xuXHRcdGlmICh0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbi5jcmVhdGlvbk1vZGUgPT09IENyZWF0aW9uTW9kZS5DcmVhdGlvblJvdyAmJiBuZXdBY3Rpb24pIHtcblx0XHRcdC8vIEEgY29tYmluYXRpb24gb2YgJ0NyZWF0aW9uUm93JyBhbmQgJ05ld0FjdGlvbicgZG9lcyBub3QgbWFrZSBzZW5zZVxuXHRcdFx0dGhyb3cgRXJyb3IoYENyZWF0aW9uIG1vZGUgJyR7Q3JlYXRpb25Nb2RlLkNyZWF0aW9uUm93fScgY2FuIG5vdCBiZSB1c2VkIHdpdGggYSBjdXN0b20gJ25ldycgYWN0aW9uICgke25ld0FjdGlvbn0pYCk7XG5cdFx0fVxuXHRcdGlmIChuYXZpZ2F0aW9uPy5yb3V0ZSkge1xuXHRcdFx0Ly8gcm91dGUgc3BlY2lmaWVkXG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRtb2RlOiB0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbi5jcmVhdGlvbk1vZGUsXG5cdFx0XHRcdGFwcGVuZDogdGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24uY3JlYXRlQXRFbmQsXG5cdFx0XHRcdG5ld0FjdGlvbjogbmV3QWN0aW9uPy50b1N0cmluZygpLFxuXHRcdFx0XHRuYXZpZ2F0ZVRvVGFyZ2V0OiB0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbi5jcmVhdGlvbk1vZGUgPT09IENyZWF0aW9uTW9kZS5OZXdQYWdlID8gbmF2aWdhdGlvbi5yb3V0ZSA6IHVuZGVmaW5lZCAvLyBuYXZpZ2F0ZSBvbmx5IGluIE5ld1BhZ2UgbW9kZVxuXHRcdFx0fTtcblx0XHR9XG5cdH1cblx0Ly8gbm8gbmF2aWdhdGlvbiBvciBubyByb3V0ZSBzcGVjaWZpZWQgLSBmYWxsYmFjayB0byBpbmxpbmUgY3JlYXRlIGlmIG9yaWdpbmFsIGNyZWF0aW9uIG1vZGUgd2FzICdOZXdQYWdlJ1xuXHRpZiAodGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24uY3JlYXRpb25Nb2RlID09PSBDcmVhdGlvbk1vZGUuTmV3UGFnZSkge1xuXHRcdGlmIChjb252ZXJ0ZXJDb250ZXh0LmdldFRlbXBsYXRlVHlwZSgpID09PSBUZW1wbGF0ZVR5cGUuTGlzdFJlcG9ydCkge1xuXHRcdFx0TG9nLmVycm9yKFwiVGhlIGNyZWF0aW9uIG1vZGUgJ05ld1BhZ2UnIGlzIHVzZWQgYnV0IHRoZSBuYXZpZ2F0aW9uIGNvbmZpZ3VyYXRpb24gdG8gdGhlIHN1YiBwYWdlIGlzIG1pc3NpbmcuXCIpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbi5jcmVhdGlvbk1vZGUgPSBDcmVhdGlvbk1vZGUuSW5saW5lO1xuXHRcdFx0Ly8gSW4gY2FzZSB0aGVyZSB3YXMgbm8gc3BlY2lmaWMgY29uZmlndXJhdGlvbiBmb3IgdGhlIGNyZWF0ZUF0RW5kIHdlIGZvcmNlIGl0IHRvIGZhbHNlXG5cdFx0XHRpZiAob3JpZ2luYWxUYWJsZVNldHRpbmdzLmNyZWF0aW9uTW9kZT8uY3JlYXRlQXRFbmQgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHR0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbi5jcmVhdGVBdEVuZCA9IGZhbHNlO1xuXHRcdFx0fVxuXHRcdFx0TG9nLmluZm8oXCJUaGUgY3JlYXRpb24gbW9kZSB3YXMgY2hhbmdlZCBmcm9tICdOZXdQYWdlJyB0byAnSW5saW5lJyBkdWUgdG8gbWlzc2luZyBuYXZpZ2F0aW9uIGNvbmZpZ3VyYXRpb24gdG8gdGhlIHN1YiBwYWdlLlwiKTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIHtcblx0XHRtb2RlOiB0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbi5jcmVhdGlvbk1vZGUsXG5cdFx0YXBwZW5kOiB0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbi5jcmVhdGVBdEVuZCxcblx0XHRuZXdBY3Rpb246IG5ld0FjdGlvbj8udG9TdHJpbmcoKVxuXHR9O1xufVxuY29uc3QgX2dldFJvd0NvbmZpZ3VyYXRpb25Qcm9wZXJ0eSA9IGZ1bmN0aW9uIChcblx0bGluZUl0ZW1Bbm5vdGF0aW9uOiBMaW5lSXRlbSB8IHVuZGVmaW5lZCxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+LFxuXHRuYXZpZ2F0aW9uU2V0dGluZ3M6IE5hdmlnYXRpb25TZXR0aW5nc0NvbmZpZ3VyYXRpb24sXG5cdHRhcmdldFBhdGg6IHN0cmluZyxcblx0dGFibGVUeXBlOiBUYWJsZVR5cGVcbik6IFJvd0NvbmZpZ3VyYXRpb24ge1xuXHRsZXQgcHJlc3NQcm9wZXJ0eSwgb3BlbkluTmV3VGFiUHJlc3NQcm9wZXJ0eSwgbmF2aWdhdGlvblRhcmdldDtcblx0bGV0IGNyaXRpY2FsaXR5UHJvcGVydHk6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxNZXNzYWdlVHlwZT4gPSBjb25zdGFudChNZXNzYWdlVHlwZS5Ob25lKTtcblx0Y29uc3QgdGFyZ2V0RW50aXR5VHlwZSA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5VHlwZSgpO1xuXHRpZiAobmF2aWdhdGlvblNldHRpbmdzICYmIGxpbmVJdGVtQW5ub3RhdGlvbikge1xuXHRcdG5hdmlnYXRpb25UYXJnZXQgPSBuYXZpZ2F0aW9uU2V0dGluZ3MuZGlzcGxheT8udGFyZ2V0IHx8IG5hdmlnYXRpb25TZXR0aW5ncy5kZXRhaWw/Lm91dGJvdW5kO1xuXHRcdGNvbnN0IHRhcmdldEVudGl0eVNldCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0KCk7XG5cdFx0Y3JpdGljYWxpdHlQcm9wZXJ0eSA9IGdldEhpZ2hsaWdodFJvd0JpbmRpbmcoXG5cdFx0XHRsaW5lSXRlbUFubm90YXRpb24uYW5ub3RhdGlvbnM/LlVJPy5Dcml0aWNhbGl0eSxcblx0XHRcdCEhTW9kZWxIZWxwZXIuZ2V0RHJhZnRSb290KHRhcmdldEVudGl0eVNldCkgfHwgISFNb2RlbEhlbHBlci5nZXREcmFmdE5vZGUodGFyZ2V0RW50aXR5U2V0KSxcblx0XHRcdHRhcmdldEVudGl0eVR5cGVcblx0XHQpO1xuXHRcdGlmIChuYXZpZ2F0aW9uVGFyZ2V0KSB7XG5cdFx0XHRwcmVzc1Byb3BlcnR5ID0gYEFQSS5vbkNoZXZyb25QcmVzc05hdmlnYXRlT3V0Qm91bmQoJGV2ZW50LCAkY29udHJvbGxlciAsJyR7bmF2aWdhdGlvblRhcmdldH0nLCBcXCR7JHBhcmFtZXRlcnM+YmluZGluZ0NvbnRleHR9KWA7XG5cdFx0XHRvcGVuSW5OZXdUYWJQcmVzc1Byb3BlcnR5ID0gYC5vbk9wZW5Jbk5ld1RhYk5hdmlnYXRlT3V0Qm91bmQoJyR7bmF2aWdhdGlvblRhcmdldH0nLCAle2ludGVybmFsPmNvbnRleHRtZW51L3NlbGVjdGVkQ29udGV4dHN9LCBcIlwiLCAke3NlbGVjdGlvbkxpbWl0Rm9yT3BlbkluTmV3VGFifSlgO1xuXHRcdH1cblx0XHRpZiAoIW5hdmlnYXRpb25UYXJnZXQgJiYgbmF2aWdhdGlvblNldHRpbmdzLmRldGFpbD8ucm91dGUpIHtcblx0XHRcdGNvbnN0IGVkaXRhYmxlID1cblx0XHRcdFx0TW9kZWxIZWxwZXIuZ2V0RHJhZnRSb290KHRhcmdldEVudGl0eVNldCkgfHwgTW9kZWxIZWxwZXIuZ2V0RHJhZnROb2RlKHRhcmdldEVudGl0eVNldClcblx0XHRcdFx0XHQ/IFwiISR7JHBhcmFtZXRlcnM+YmluZGluZ0NvbnRleHR9LmdldFByb3BlcnR5KCdJc0FjdGl2ZUVudGl0eScpXCJcblx0XHRcdFx0XHQ6IFwidW5kZWZpbmVkXCI7XG5cdFx0XHRjb25zdCByZWNyZWF0ZUNvbnRleHQgPSB0YWJsZVR5cGUgPT09IFwiQW5hbHl0aWNhbFRhYmxlXCIgPyBcIiwgcmVjcmVhdGVDb250ZXh0OiB0cnVlXCIgOiBcIlwiO1xuXHRcdFx0cHJlc3NQcm9wZXJ0eSA9IGBBUEkub25UYWJsZVJvd1ByZXNzKCRldmVudCwgJGNvbnRyb2xsZXIsIFxcJHskcGFyYW1ldGVycz5iaW5kaW5nQ29udGV4dH0sIHsgY2FsbEV4dGVuc2lvbjogdHJ1ZSwgdGFyZ2V0UGF0aDogJyR7dGFyZ2V0UGF0aH0nLCBlZGl0YWJsZTogJHtlZGl0YWJsZX0gJHtyZWNyZWF0ZUNvbnRleHR9IH0pYDsgLy9OZWVkIHRvIGFjY2VzcyB0byBEcmFmdFJvb3QgYW5kIERyYWZ0Tm9kZSAhISEhISEhXG5cdFx0XHRvcGVuSW5OZXdUYWJQcmVzc1Byb3BlcnR5ID0gYEFQSS5vbk9wZW5Jbk5ld1RhYlByZXNzKCRldmVudCwgJGNvbnRyb2xsZXIsICV7aW50ZXJuYWw+Y29udGV4dG1lbnUvc2VsZWN0ZWRDb250ZXh0c30sIHsgY2FsbEV4dGVuc2lvbjogdHJ1ZSwgdGFyZ2V0UGF0aDogJyR7dGFyZ2V0UGF0aH0nLCBuYXZNb2RlOiAnb3BlbkluTmV3VGFiJyB9LCAke3NlbGVjdGlvbkxpbWl0Rm9yT3BlbkluTmV3VGFifSlgO1xuXHRcdH1cblx0fVxuXHRjb25zdCByb3dOYXZpZ2F0ZWRFeHByZXNzaW9uOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj4gPSBmb3JtYXRSZXN1bHQoXG5cdFx0W3BhdGhJbk1vZGVsKFwiL2RlZXBlc3RQYXRoXCIsIFwiaW50ZXJuYWxcIildLFxuXHRcdHRhYmxlRm9ybWF0dGVycy5uYXZpZ2F0ZWRSb3csXG5cdFx0dGFyZ2V0RW50aXR5VHlwZVxuXHQpO1xuXHRyZXR1cm4ge1xuXHRcdHByZXNzOiBwcmVzc1Byb3BlcnR5LFxuXHRcdG9wZW5Jbk5ld1RhYlByZXNzOiBvcGVuSW5OZXdUYWJQcmVzc1Byb3BlcnR5LFxuXHRcdGFjdGlvbjogcHJlc3NQcm9wZXJ0eSA/IFwiTmF2aWdhdGlvblwiIDogdW5kZWZpbmVkLFxuXHRcdHJvd0hpZ2hsaWdodGluZzogY29tcGlsZUV4cHJlc3Npb24oY3JpdGljYWxpdHlQcm9wZXJ0eSksXG5cdFx0cm93TmF2aWdhdGVkOiBjb21waWxlRXhwcmVzc2lvbihyb3dOYXZpZ2F0ZWRFeHByZXNzaW9uKSxcblx0XHR2aXNpYmxlOiBjb21waWxlRXhwcmVzc2lvbihub3QoVUkuSXNJbmFjdGl2ZSkpXG5cdH07XG59O1xuLyoqXG4gKiBSZXRyaWV2ZSB0aGUgY29sdW1ucyBmcm9tIHRoZSBlbnRpdHlUeXBlLlxuICogQHBhcmFtIGNvbHVtbnNUb0JlQ3JlYXRlZCBUaGUgY29sdW1ucyB0byBiZSBjcmVhdGVkLlxuICogQHBhcmFtIGVudGl0eVR5cGUgVGhlIHRhcmdldCBlbnRpdHkgdHlwZS5cbiAqIEBwYXJhbSBhbm5vdGF0aW9uQ29sdW1ucyBUaGUgYXJyYXkgb2YgY29sdW1ucyBjcmVhdGVkIGJhc2VkIG9uIExpbmVJdGVtIGFubm90YXRpb25zLlxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGNvbnZlcnRlciBjb250ZXh0LlxuICogQHBhcmFtIHRhYmxlVHlwZSBUaGUgdGFibGUgdHlwZS5cbiAqIEBwYXJhbSB0YWJsZUNyZWF0aW9uTW9kZSBUaGUgY3JlYXRpb24gbW9kZSBvZiB0aGUgdGFibGUuXG4gKiBAcGFyYW0gZGlzcGxheU1vZGVPZkRlc2NyaXB0aW9uUHJvcGVydGllc01hcCBUaGUgbWFwIG9mIHByb3BlcnRpZXMgcmVmZXJlbmNlZCBhcyBkZXNjcmlwdGlvbiBvbiBhIHRleHQgYXJyYW5nZW1lbnQgYW5ub3RhdGlvbi5cbiAqIEBwYXJhbSByZXN0cmljdGlvbnNPblByb3BlcnRpZXMgVGhlIGV4aXN0aW5nIHJlc3RyaWN0aW9ucyBvbiBwcm9wZXJ0aWVzXG4gKiBAcmV0dXJucyBUaGUgY29sdW1uIGZyb20gdGhlIGVudGl0eVR5cGVcbiAqL1xuZXhwb3J0IGNvbnN0IGdldENvbHVtbnNGcm9tRW50aXR5VHlwZSA9IGZ1bmN0aW9uIChcblx0Y29sdW1uc1RvQmVDcmVhdGVkOiBSZWNvcmQ8c3RyaW5nLCBQcm9wZXJ0eT4sXG5cdGVudGl0eVR5cGU6IEVudGl0eVR5cGUsXG5cdGFubm90YXRpb25Db2x1bW5zOiBBbm5vdGF0aW9uVGFibGVDb2x1bW5bXSxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+LFxuXHR0YWJsZVR5cGU6IFRhYmxlVHlwZSxcblx0dGFibGVDcmVhdGlvbk1vZGU6IENyZWF0aW9uTW9kZSxcblx0ZGlzcGxheU1vZGVPZkRlc2NyaXB0aW9uUHJvcGVydGllc01hcDogUmVjb3JkPHN0cmluZywgRGlzcGxheU1vZGU+LFxuXHRyZXN0cmljdGlvbnNPblByb3BlcnRpZXM/OiBSZXN0cmljdGlvbnNPblByb3BlcnRpZXNcbik6IEFubm90YXRpb25UYWJsZUNvbHVtbltdIHtcblx0aWYgKGFubm90YXRpb25Db2x1bW5zID09PSB1bmRlZmluZWQpIHtcblx0XHRhbm5vdGF0aW9uQ29sdW1ucyA9IFtdO1xuXHR9XG5cblx0bGV0IHByb3BlcnRpZXNOb3RUb0JlQ29uc2lkZXJlZDogc3RyaW5nW10gPSBbXTtcblx0Y29uc3QgdGFibGVDb2x1bW5zOiAoQW5ub3RhdGlvblRhYmxlQ29sdW1uIHwgVGVjaG5pY2FsQ29sdW1uKVtdID0gYW5ub3RhdGlvbkNvbHVtbnM7XG5cdGNvbnN0IGFnZ3JlZ2F0aW9uSGVscGVyID0gbmV3IEFnZ3JlZ2F0aW9uSGVscGVyKGVudGl0eVR5cGUsIGNvbnZlcnRlckNvbnRleHQpO1xuXHRjb25zdCBncm91cGFibGVQcm9wZXJ0aWVzID0gYWdncmVnYXRpb25IZWxwZXIuZ2V0R3JvdXBhYmxlUHJvcGVydGllcygpO1xuXHQvL0ZvciBBbmFseXRpY2FsIHRhYmxlLCB3ZSBleGNsdWRlIGFsbCBwcm9wZXJ0aWVzIHRoYXQgYXJlIG5vdCBncm91cGFibGUgYW5kIHVzZWQgYXMgVGV4dCBpbiBhIGdyb3VwYWJsZSBQcm9wZXJ0eS5cblx0aWYgKHRhYmxlVHlwZSA9PT0gXCJBbmFseXRpY2FsVGFibGVcIiAmJiBhZ2dyZWdhdGlvbkhlbHBlci5pc0FuYWx5dGljc1N1cHBvcnRlZCgpICYmIGdyb3VwYWJsZVByb3BlcnRpZXMpIHtcblx0XHRwcm9wZXJ0aWVzTm90VG9CZUNvbnNpZGVyZWQgPSBncm91cGFibGVQcm9wZXJ0aWVzXG5cdFx0XHQubWFwKChwcm9wZXJ0eSkgPT4gcHJvcGVydHkuJHRhcmdldClcblx0XHRcdC5maWx0ZXIoKHRhcmdldCkgPT4gdGFyZ2V0ICE9PSB1bmRlZmluZWQpXG5cdFx0XHQubWFwKCh0YXJnZXQpID0+IGdldEFzc29jaWF0ZWRUZXh0UHJvcGVydHkodGFyZ2V0IGFzIFByb3BlcnR5KSlcblx0XHRcdC5maWx0ZXIoKHRleHRQcm9wKSA9PiB0ZXh0UHJvcCAmJiAhYWdncmVnYXRpb25IZWxwZXIuaXNQcm9wZXJ0eUdyb3VwYWJsZSh0ZXh0UHJvcCkpXG5cdFx0XHQubWFwKChwcm9wKSA9PiBwcm9wPy5uYW1lKVxuXHRcdFx0LmZpbHRlcigobmFtZSkgPT4gbmFtZSAhPT0gdW5kZWZpbmVkKSBhcyBzdHJpbmdbXTtcblx0fVxuXHRlbnRpdHlUeXBlLmVudGl0eVByb3BlcnRpZXMuZm9yRWFjaCgocHJvcGVydHk6IFByb3BlcnR5KSA9PiB7XG5cdFx0Ly8gQ2F0Y2ggYWxyZWFkeSBleGlzdGluZyBjb2x1bW5zIC0gd2hpY2ggd2VyZSBhZGRlZCBiZWZvcmUgYnkgTGluZUl0ZW0gQW5ub3RhdGlvbnNcblx0XHRjb25zdCBleGlzdHMgPSBhbm5vdGF0aW9uQ29sdW1ucy5zb21lKChjb2x1bW4pID0+IHtcblx0XHRcdHJldHVybiBjb2x1bW4ubmFtZSA9PT0gcHJvcGVydHkubmFtZTtcblx0XHR9KTtcblx0XHQvLyBpZiB0YXJnZXQgdHlwZSBleGlzdHMsIGl0IGlzIGEgY29tcGxleCBwcm9wZXJ0eSBhbmQgc2hvdWxkIGJlIGlnbm9yZWRcblx0XHRpZiAoIXByb3BlcnR5LnRhcmdldFR5cGUgJiYgIWV4aXN0cyAmJiAhcHJvcGVydGllc05vdFRvQmVDb25zaWRlcmVkLmluY2x1ZGVzKHByb3BlcnR5Lm5hbWUpKSB7XG5cdFx0XHRjb25zdCByZWxhdGVkUHJvcGVydGllc0luZm86IENvbXBsZXhQcm9wZXJ0eUluZm8gPSBjb2xsZWN0UmVsYXRlZFByb3BlcnRpZXMoXG5cdFx0XHRcdHByb3BlcnR5Lm5hbWUsXG5cdFx0XHRcdHByb3BlcnR5LFxuXHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdFx0XHR0cnVlLFxuXHRcdFx0XHR0YWJsZVR5cGVcblx0XHRcdCk7XG5cdFx0XHRjb25zdCByZWxhdGVkUHJvcGVydHlOYW1lczogc3RyaW5nW10gPSBPYmplY3Qua2V5cyhyZWxhdGVkUHJvcGVydGllc0luZm8ucHJvcGVydGllcyk7XG5cdFx0XHRjb25zdCBhZGRpdGlvbmFsUHJvcGVydHlOYW1lczogc3RyaW5nW10gPSBPYmplY3Qua2V5cyhyZWxhdGVkUHJvcGVydGllc0luZm8uYWRkaXRpb25hbFByb3BlcnRpZXMpO1xuXHRcdFx0Ly8gSW5jbHVkZSB0aGUgdGV4dCBwcm9wZXJ0aWVzIGFuZCB0aGVpciBjb3JyZXNwb25kaW5nIHRleHQgYXJyYW5nZW1lbnRcblx0XHRcdHJlbGF0ZWRQcm9wZXJ0eU5hbWVzLmZvckVhY2goKG5hbWUpID0+IHtcblx0XHRcdFx0YWRkUHJvcGVydHlUb0Rpc3BsYXlNb2RlT2ZEZXNjcmlwdGlvblByb3BlcnRpZXNNYXAoZGlzcGxheU1vZGVPZkRlc2NyaXB0aW9uUHJvcGVydGllc01hcCwgcmVsYXRlZFByb3BlcnRpZXNJbmZvLCBuYW1lKTtcblx0XHRcdH0pO1xuXG5cdFx0XHRjb25zdCBjb2x1bW5JbmZvID0gZ2V0Q29sdW1uRGVmaW5pdGlvbkZyb21Qcm9wZXJ0eShcblx0XHRcdFx0cHJvcGVydHksXG5cdFx0XHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0QmFzZWRBbm5vdGF0aW9uUGF0aChwcm9wZXJ0eS5mdWxseVF1YWxpZmllZE5hbWUpLFxuXHRcdFx0XHRwcm9wZXJ0eS5uYW1lLFxuXHRcdFx0XHR0cnVlLFxuXHRcdFx0XHR0cnVlLFxuXHRcdFx0XHRhZ2dyZWdhdGlvbkhlbHBlcixcblx0XHRcdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHRcdFx0ZGlzcGxheU1vZGVPZkRlc2NyaXB0aW9uUHJvcGVydGllc01hcCxcblx0XHRcdFx0cmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzLFxuXHRcdFx0XHR0YWJsZUNyZWF0aW9uTW9kZSxcblx0XHRcdFx0cmVsYXRlZFByb3BlcnRpZXNJbmZvXG5cdFx0XHQpO1xuXHRcdFx0aWYgKHJlbGF0ZWRQcm9wZXJ0eU5hbWVzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0Y29sdW1uSW5mby5wcm9wZXJ0eUluZm9zID0gcmVsYXRlZFByb3BlcnR5TmFtZXM7XG5cdFx0XHRcdGlmIChyZWxhdGVkUHJvcGVydGllc0luZm8uZXhwb3J0U2V0dGluZ3MuZGF0YVBvaW50VGFyZ2V0VmFsdWUpIHtcblx0XHRcdFx0XHRjb2x1bW5JbmZvLmV4cG9ydERhdGFQb2ludFRhcmdldFZhbHVlID0gcmVsYXRlZFByb3BlcnRpZXNJbmZvLmV4cG9ydFNldHRpbmdzLmRhdGFQb2ludFRhcmdldFZhbHVlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdC8vIENvbGxlY3QgaW5mb3JtYXRpb24gb2YgcmVsYXRlZCBjb2x1bW5zIHRvIGJlIGNyZWF0ZWQuXG5cdFx0XHRcdHJlbGF0ZWRQcm9wZXJ0eU5hbWVzLmZvckVhY2goKG5hbWUpID0+IHtcblx0XHRcdFx0XHRjb2x1bW5zVG9CZUNyZWF0ZWRbbmFtZV0gPSByZWxhdGVkUHJvcGVydGllc0luZm8ucHJvcGVydGllc1tuYW1lXS5hbm5vdGF0aW9uUHJvcGVydHk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdFx0Ly8gdXBkYXRlIFByb3BlcnR5IExhYmVsIHdoZW4gaXQncyByZWZlcmVuY2VkIG9ubHkgb25jZSBpbiBhIGNvbHVtbiwgbmV3IGxhYmVsIHdpbGwgYmUgdGhlIGxhYmVsIG9mIHRoZSBjb2x1bW5cblx0XHRcdHVwZGF0ZVByb3BlcnR5TGFiZWwoYW5ub3RhdGlvbkNvbHVtbnMsIGNvbHVtbnNUb0JlQ3JlYXRlZCwgY29sdW1uSW5mbyk7XG5cdFx0XHRpZiAoYWRkaXRpb25hbFByb3BlcnR5TmFtZXMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRjb2x1bW5JbmZvLmFkZGl0aW9uYWxQcm9wZXJ0eUluZm9zID0gYWRkaXRpb25hbFByb3BlcnR5TmFtZXM7XG5cdFx0XHRcdC8vIENyZWF0ZSBjb2x1bW5zIGZvciBhZGRpdGlvbmFsIHByb3BlcnRpZXMgaWRlbnRpZmllZCBmb3IgQUxQIHVzZSBjYXNlLlxuXHRcdFx0XHRhZGRpdGlvbmFsUHJvcGVydHlOYW1lcy5mb3JFYWNoKChhZGRpdGlvbmFsUHJvcGVydHlOYW1lKSA9PiB7XG5cdFx0XHRcdFx0Ly8gSW50ZW50aW9uYWwgb3ZlcndyaXRlIGFzIHdlIHJlcXVpcmUgb25seSBvbmUgbmV3IFByb3BlcnR5SW5mbyBmb3IgYSByZWxhdGVkIFByb3BlcnR5LlxuXHRcdFx0XHRcdGNvbHVtbnNUb0JlQ3JlYXRlZFthZGRpdGlvbmFsUHJvcGVydHlOYW1lXSA9IHJlbGF0ZWRQcm9wZXJ0aWVzSW5mby5hZGRpdGlvbmFsUHJvcGVydGllc1thZGRpdGlvbmFsUHJvcGVydHlOYW1lXTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0XHR0YWJsZUNvbHVtbnMucHVzaChjb2x1bW5JbmZvKTtcblx0XHR9XG5cdFx0Ly8gSW4gY2FzZSBhIHByb3BlcnR5IGhhcyBkZWZpbmVkIGEgI1RleHRPbmx5IHRleHQgYXJyYW5nZW1lbnQgdGhhdCBwb2ludHMgdG8gYSB0ZXh0IHByb3BlcnR5IChhbmQgbm90IGEgJ2hhcmQgY29kZWQgdGV4dCcpIGRvbid0IG9ubHkgY3JlYXRlIHRoZSBjb21wbGV4IHByb3BlcnR5IHdpdGggdGhlIHRleHQgcHJvcGVydHkgYXMgYSBjaGlsZCBwcm9wZXJ0eSxcblx0XHQvLyBidXQgYWxzbyB0aGUgcHJvcGVydHkgaXRzZWxmIGFzIGl0IGNhbiBiZSB1c2VkIGFzIHdpdGhpbiB0aGUgc29ydENvbmRpdGlvbnMgb3Igb24gY3VzdG9tIGNvbHVtbnMuXG5cdFx0Ly8gVGhpcyBzdGVwIG11c3QgYmUgdmFsaWQgYWxzbyBmcm9tIHRoZSBjb2x1bW5zIGFkZGVkIHZpYSBMaW5lSXRlbXMgb3IgZnJvbSBhIGNvbHVtbiBhdmFpbGFibGUgb24gdGhlIHAxM24uXG5cdFx0aWYgKGdldERpc3BsYXlNb2RlKHByb3BlcnR5KSA9PT0gXCJEZXNjcmlwdGlvblwiKSB7XG5cdFx0XHRyZXN0cmljdGlvbnNPblByb3BlcnRpZXM/Lm5vblNvcnRhYmxlUHJvcGVydGllcy5wdXNoKHByb3BlcnR5Lm5hbWUpO1xuXHRcdFx0aWYgKGlzUGF0aEFubm90YXRpb25FeHByZXNzaW9uKHByb3BlcnR5Py5hbm5vdGF0aW9ucz8uQ29tbW9uPy5UZXh0KSkge1xuXHRcdFx0XHR0YWJsZUNvbHVtbnMucHVzaChcblx0XHRcdFx0XHRnZXRDb2x1bW5EZWZpbml0aW9uRnJvbVByb3BlcnR5KFxuXHRcdFx0XHRcdFx0cHJvcGVydHksXG5cdFx0XHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVNldEJhc2VkQW5ub3RhdGlvblBhdGgocHJvcGVydHkuZnVsbHlRdWFsaWZpZWROYW1lKSxcblx0XHRcdFx0XHRcdHByb3BlcnR5Lm5hbWUsXG5cdFx0XHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0XHRcdGZhbHNlLFxuXHRcdFx0XHRcdFx0YWdncmVnYXRpb25IZWxwZXIsXG5cdFx0XHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdFx0XHRcdFx0ZGlzcGxheU1vZGVPZkRlc2NyaXB0aW9uUHJvcGVydGllc01hcCxcblx0XHRcdFx0XHRcdHJlc3RyaWN0aW9uc09uUHJvcGVydGllcyxcblx0XHRcdFx0XHRcdHRhYmxlQ3JlYXRpb25Nb2RlXG5cdFx0XHRcdFx0KVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblx0fSk7XG5cdC8vIENyZWF0ZSBhIHByb3BlcnR5SW5mbyBmb3IgZWFjaCByZWxhdGVkIHByb3BlcnR5LlxuXHRjb25zdCByZWxhdGVkQ29sdW1ucyA9IF9jcmVhdGVSZWxhdGVkQ29sdW1ucyhcblx0XHRjb2x1bW5zVG9CZUNyZWF0ZWQsXG5cdFx0dGFibGVDb2x1bW5zLFxuXHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0ZW50aXR5VHlwZSxcblx0XHRkaXNwbGF5TW9kZU9mRGVzY3JpcHRpb25Qcm9wZXJ0aWVzTWFwLFxuXHRcdHRhYmxlQ3JlYXRpb25Nb2RlLFxuXHRcdHJlc3RyaWN0aW9uc09uUHJvcGVydGllc1xuXHQpO1xuXHRyZXR1cm4gdGFibGVDb2x1bW5zLmNvbmNhdChyZWxhdGVkQ29sdW1ucyk7XG59O1xuLyoqXG4gKiBDcmVhdGUgYSBjb2x1bW4gZGVmaW5pdGlvbiBmcm9tIGEgcHJvcGVydHkuXG4gKiBAcGFyYW0gcHJvcGVydHkgRW50aXR5IHR5cGUgcHJvcGVydHkgZm9yIHdoaWNoIHRoZSBjb2x1bW4gaXMgY3JlYXRlZFxuICogQHBhcmFtIGZ1bGxQcm9wZXJ0eVBhdGggVGhlIGZ1bGwgcGF0aCB0byB0aGUgdGFyZ2V0IHByb3BlcnR5XG4gKiBAcGFyYW0gcmVsYXRpdmVQYXRoIFRoZSByZWxhdGl2ZSBwYXRoIHRvIHRoZSB0YXJnZXQgcHJvcGVydHkgYmFzZWQgb24gdGhlIGNvbnRleHRcbiAqIEBwYXJhbSB1c2VEYXRhRmllbGRQcmVmaXggU2hvdWxkIGJlIHByZWZpeGVkIHdpdGggXCJEYXRhRmllbGQ6OlwiLCBlbHNlIGl0IHdpbGwgYmUgcHJlZml4ZWQgd2l0aCBcIlByb3BlcnR5OjpcIlxuICogQHBhcmFtIGF2YWlsYWJsZUZvckFkYXB0YXRpb24gRGVjaWRlcyB3aGV0aGVyIHRoZSBjb2x1bW4gc2hvdWxkIGJlIGF2YWlsYWJsZSBmb3IgYWRhcHRhdGlvblxuICogQHBhcmFtIGFnZ3JlZ2F0aW9uSGVscGVyIFRoZSBhZ2dyZWdhdGlvbkhlbHBlciBmb3IgdGhlIGVudGl0eVxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGNvbnZlcnRlciBjb250ZXh0XG4gKiBAcGFyYW0gZGlzcGxheU1vZGVPZkRlc2NyaXB0aW9uUHJvcGVydGllc01hcCBUaGUgbWFwIG9mIHByb3BlcnRpZXMgcmVmZXJlbmNlZCBhcyBkZXNjcmlwdGlvbiBvbiBhIHRleHQgYXJyYW5nZW1lbnQgYW5ub3RhdGlvblxuICogQHBhcmFtIHJlc3RyaWN0aW9uc09uUHJvcGVydGllcyBUaGUgZXhpc3RpbmcgcmVzdHJpY3Rpb25zIG9uIHByb3BlcnRpZXNcbiAqIEBwYXJhbSB0YWJsZUNyZWF0aW9uTW9kZSBUaGUgY3JlYXRpb24gbW9kZSBvZiB0aGUgdGFibGVcbiAqIEBwYXJhbSByZWxhdGVkUHJvcGVydGllc0luZm8gVGhlIHByb3BlcnRpZXMgaWRlbnRpZmllZCBzbyBmYXIgZm9yIHRoZSBjb2x1bW5cbiAqIEByZXR1cm5zIFRoZSBhbm5vdGF0aW9uIGNvbHVtbiBkZWZpbml0aW9uXG4gKi9cbmNvbnN0IGdldENvbHVtbkRlZmluaXRpb25Gcm9tUHJvcGVydHkgPSBmdW5jdGlvbiAoXG5cdHByb3BlcnR5OiBQcm9wZXJ0eSxcblx0ZnVsbFByb3BlcnR5UGF0aDogc3RyaW5nLFxuXHRyZWxhdGl2ZVBhdGg6IHN0cmluZyxcblx0dXNlRGF0YUZpZWxkUHJlZml4OiBib29sZWFuLFxuXHRhdmFpbGFibGVGb3JBZGFwdGF0aW9uOiBib29sZWFuLFxuXHRhZ2dyZWdhdGlvbkhlbHBlcjogQWdncmVnYXRpb25IZWxwZXIsXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pixcblx0ZGlzcGxheU1vZGVPZkRlc2NyaXB0aW9uUHJvcGVydGllc01hcDogUmVjb3JkPHN0cmluZywgRGlzcGxheU1vZGU+LFxuXHRyZXN0cmljdGlvbnNPblByb3BlcnRpZXM/OiBSZXN0cmljdGlvbnNPblByb3BlcnRpZXMsXG5cdHRhYmxlQ3JlYXRpb25Nb2RlPzogQ3JlYXRpb25Nb2RlLFxuXHRyZWxhdGVkUHJvcGVydGllc0luZm8/OiBDb21wbGV4UHJvcGVydHlJbmZvXG4pOiBBbm5vdGF0aW9uVGFibGVDb2x1bW4gfCBUZWNobmljYWxDb2x1bW4ge1xuXHRjb25zdCBuYW1lID0gdXNlRGF0YUZpZWxkUHJlZml4ID8gcmVsYXRpdmVQYXRoIDogYFByb3BlcnR5Ojoke3JlbGF0aXZlUGF0aH1gO1xuXHRjb25zdCBrZXkgPSAodXNlRGF0YUZpZWxkUHJlZml4ID8gXCJEYXRhRmllbGQ6OlwiIDogXCJQcm9wZXJ0eTo6XCIpICsgcmVwbGFjZVNwZWNpYWxDaGFycyhyZWxhdGl2ZVBhdGgpO1xuXHRjb25zdCBzZW1hbnRpY09iamVjdEFubm90YXRpb25QYXRoID0gZ2V0U2VtYW50aWNPYmplY3RQYXRoKGNvbnZlcnRlckNvbnRleHQsIHByb3BlcnR5KTtcblx0Y29uc3QgaXNIaWRkZW4gPSBpc1JlZmVyZW5jZVByb3BlcnR5U3RhdGljYWxseUhpZGRlbihwcm9wZXJ0eSk7XG5cdGNvbnN0IGdyb3VwUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkID0gcHJvcGVydHkubmFtZSA/IF9zbGljZUF0U2xhc2gocHJvcGVydHkubmFtZSwgdHJ1ZSwgZmFsc2UpIDogdW5kZWZpbmVkO1xuXHRjb25zdCBpc0dyb3VwOiBib29sZWFuID0gZ3JvdXBQYXRoICE9IHByb3BlcnR5Lm5hbWU7XG5cdGNvbnN0IGxhYmVsID0gZ2V0TGFiZWwocHJvcGVydHksIGlzR3JvdXApO1xuXHRjb25zdCBkYXRhVHlwZTogc3RyaW5nIHwgdW5kZWZpbmVkID0gZ2V0RGF0YUZpZWxkRGF0YVR5cGUocHJvcGVydHkpO1xuXHRjb25zdCBwcm9wZXJ0eVR5cGVDb25maWcgPSBnZXRUeXBlQ29uZmlnKHByb3BlcnR5LCBkYXRhVHlwZSk7XG5cdGNvbnN0IGlzQVByb3BlcnR5RnJvbVRleHRPbmx5QW5ub3RhdGlvbiA9IGRpc3BsYXlNb2RlT2ZEZXNjcmlwdGlvblByb3BlcnRpZXNNYXBbcmVsYXRpdmVQYXRoXSA9PT0gXCJEZXNjcmlwdGlvblwiO1xuXHRjb25zdCBzb3J0YWJsZSA9XG5cdFx0KCFpc0hpZGRlbiB8fCBpc0FQcm9wZXJ0eUZyb21UZXh0T25seUFubm90YXRpb24pICYmICFyZXN0cmljdGlvbnNPblByb3BlcnRpZXM/Lm5vblNvcnRhYmxlUHJvcGVydGllcy5pbmNsdWRlcyhyZWxhdGl2ZVBhdGgpO1xuXHRjb25zdCBmaWx0ZXJhYmxlID0gIWlzQVByb3BlcnR5RnJvbVRleHRPbmx5QW5ub3RhdGlvbiAmJiAhcmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzPy5ub25GaWx0ZXJhYmxlUHJvcGVydGllcy5pbmNsdWRlcyhyZWxhdGl2ZVBhdGgpO1xuXHRjb25zdCB0eXBlQ29uZmlnID0ge1xuXHRcdGNsYXNzTmFtZTogcHJvcGVydHkudHlwZSB8fCBkYXRhVHlwZSxcblx0XHRmb3JtYXRPcHRpb25zOiBwcm9wZXJ0eVR5cGVDb25maWcuZm9ybWF0T3B0aW9ucyxcblx0XHRjb25zdHJhaW50czogcHJvcGVydHlUeXBlQ29uZmlnLmNvbnN0cmFpbnRzXG5cdH07XG5cdGxldCBleHBvcnRTZXR0aW5nczogQ29sdW1uRXhwb3J0U2V0dGluZ3MgfCBudWxsID0gbnVsbDtcblx0aWYgKF9pc0V4cG9ydGFibGVDb2x1bW4ocHJvcGVydHkpKSB7XG5cdFx0ZXhwb3J0U2V0dGluZ3MgPSBjcmVhdGVDb2x1bW5FeHBvcnRTZXR0aW5ncyhwcm9wZXJ0eSwgcmVsYXRlZFByb3BlcnRpZXNJbmZvKTtcblx0fVxuXHRjb25zdCBhdmFpbGFiaWxpdHk6IEF2YWlsYWJpbGl0eVR5cGUgPVxuXHRcdCFhdmFpbGFibGVGb3JBZGFwdGF0aW9uIHx8IGlzSGlkZGVuIHx8IGRpc3BsYXlNb2RlT2ZEZXNjcmlwdGlvblByb3BlcnRpZXNNYXBbcmVsYXRpdmVQYXRoXSA/IFwiSGlkZGVuXCIgOiBcIkFkYXB0YXRpb25cIjtcblx0Y29uc3QgY29sbGVjdGVkTmF2aWdhdGlvblByb3BlcnR5TGFiZWxzOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCA9IF9nZXRDb2xsZWN0ZWROYXZpZ2F0aW9uUHJvcGVydHlMYWJlbHMocmVsYXRpdmVQYXRoLCBjb252ZXJ0ZXJDb250ZXh0KTtcblxuXHRjb25zdCBjb2x1bW46IEFubm90YXRpb25UYWJsZUNvbHVtbiA9IHtcblx0XHRrZXk6IGtleSxcblx0XHR0eXBlOiBDb2x1bW5UeXBlLkFubm90YXRpb24sXG5cdFx0bGFiZWw6IGxhYmVsLFxuXHRcdGdyb3VwTGFiZWw6IGlzR3JvdXAgPyBnZXRMYWJlbChwcm9wZXJ0eSkgOiB1bmRlZmluZWQsXG5cdFx0Z3JvdXA6IGlzR3JvdXAgPyBncm91cFBhdGggOiB1bmRlZmluZWQsXG5cdFx0YW5ub3RhdGlvblBhdGg6IGZ1bGxQcm9wZXJ0eVBhdGgsXG5cdFx0c2VtYW50aWNPYmplY3RQYXRoOiBzZW1hbnRpY09iamVjdEFubm90YXRpb25QYXRoLFxuXHRcdGF2YWlsYWJpbGl0eTogYXZhaWxhYmlsaXR5LFxuXHRcdG5hbWU6IG5hbWUsXG5cdFx0cmVsYXRpdmVQYXRoOiByZWxhdGl2ZVBhdGgsXG5cdFx0c29ydGFibGU6IHNvcnRhYmxlLFxuXHRcdGZpbHRlcmFibGU6IGZpbHRlcmFibGUsXG5cdFx0aXNHcm91cGFibGU6IGFnZ3JlZ2F0aW9uSGVscGVyLmlzQW5hbHl0aWNzU3VwcG9ydGVkKCkgPyAhIWFnZ3JlZ2F0aW9uSGVscGVyLmlzUHJvcGVydHlHcm91cGFibGUocHJvcGVydHkpIDogc29ydGFibGUsXG5cdFx0aXNLZXk6IHByb3BlcnR5LmlzS2V5LFxuXHRcdGV4cG9ydFNldHRpbmdzOiBleHBvcnRTZXR0aW5ncyxcblx0XHRjYXNlU2Vuc2l0aXZlOiBpc0ZpbHRlcmluZ0Nhc2VTZW5zaXRpdmUoY29udmVydGVyQ29udGV4dCksXG5cdFx0dHlwZUNvbmZpZzogdHlwZUNvbmZpZyBhcyBQcm9wZXJ0eVR5cGVDb25maWcsXG5cdFx0aW1wb3J0YW5jZTogZ2V0SW1wb3J0YW5jZShjb252ZXJ0ZXJDb250ZXh0LCBwcm9wZXJ0eS5hbm5vdGF0aW9ucz8uVUk/LkRhdGFGaWVsZERlZmF1bHQpLFxuXHRcdHJlcXVpcmVkOiBpc1JlcXVpcmVkQ29sdW1uKGNvbnZlcnRlckNvbnRleHQsIHByb3BlcnR5LCB0YWJsZUNyZWF0aW9uTW9kZSksXG5cdFx0YWRkaXRpb25hbExhYmVsczogY29sbGVjdGVkTmF2aWdhdGlvblByb3BlcnR5TGFiZWxzXG5cdH07XG5cdF9hZGRUb29sVGlwKHByb3BlcnR5LCBjb2x1bW4pO1xuXHRfc2V0RXhwb3J0U2V0dGluZ3NGb3JEYXRhUG9pbnQocHJvcGVydHksIGNvbHVtbik7XG5cblx0aWYgKFxuXHRcdGFnZ3JlZ2F0aW9uSGVscGVyLmlzQW5hbHl0aWNzU3VwcG9ydGVkKCkgJiZcblx0XHRNb2RlbEhlbHBlci5pc09iamVjdFBhdGhEcmFmdFN1cHBvcnRlZChjb252ZXJ0ZXJDb250ZXh0LmdldERhdGFNb2RlbE9iamVjdFBhdGgoKSkgJiZcblx0XHQocmVsYXRpdmVQYXRoID09PSBcIkhhc0FjdGl2ZUVudGl0eVwiIHx8IHJlbGF0aXZlUGF0aCA9PT0gXCJIYXNEcmFmdEVudGl0eVwiKVxuXHQpIHtcblx0XHQvLyBJbiBjYXNlIG9mIGFuYWx5dGljYWwgdGFibGUgb24gYSBkcmFmdC1lbmFibGVkIGVudGl0eSwgd2UgYWx3YXlzIGNvbnNpZGVyIHRoZSBIYXNEcmFmdEVudGl0eSBhbmQgSGFzQWN0aXZlRW50aXR5IHByb3BlcnRpZXMgYXNcblx0XHQvLyB0ZWNobmljYWxseSBncm91cGFibGUsIGFzIHdlIG5lZWQgdG8gbG9hZCB0aGVtIGZvciBvdXIgaW50ZXJuYWwgbG9naWMuXG5cdFx0Y29uc3QgZW5oYW5jZWRDb2x1bW4gPSBjb2x1bW4gYXMgVGVjaG5pY2FsQ29sdW1uO1xuXHRcdGVuaGFuY2VkQ29sdW1uLmV4dGVuc2lvbiA9IHtcblx0XHRcdHRlY2huaWNhbGx5QWdncmVnYXRhYmxlOiBmYWxzZSxcblx0XHRcdHRlY2huaWNhbGx5R3JvdXBhYmxlOiB0cnVlXG5cdFx0fTtcblx0XHRyZXR1cm4gZW5oYW5jZWRDb2x1bW47XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIGNvbHVtbjtcblx0fVxufTtcbi8qKlxuICogQ3JlYXRlIHRoZSBleHBvcnQgc2V0dGluZ3MgZm9yIGEgZ2l2ZW4gY29sdW1uLlxuICogQHBhcmFtIGNvbHVtbiBUaGUgZ2l2ZW4gY29sdW1uIGZyb20gYSBsaW5lIGl0ZW0gYXMgYSBkYXRhIGZpZWxkIG9yIGEgcHJvcGVydHkgZnJvbSB0aGUgZW50aXR5IHR5cGVcbiAqIEBwYXJhbSByZWxhdGVkUHJvcGVydGllc0luZm8gVGhlIHJlbGF0ZWQgcHJvcGVydGllcyBsaW5rZWQgdG8gdGhlIGNvbHVtbiAobmFtZWQgYWxzbyBjb21wbGV4IHByb3BlcnR5KVxuICogQHJldHVybnMgVGhlIGV4cG9ydCBzZXR0aW5ncyBpbiBhIHRoZSBnaXZlbiBjb2x1bW5cbiAqL1xuY29uc3QgY3JlYXRlQ29sdW1uRXhwb3J0U2V0dGluZ3MgPSBmdW5jdGlvbiAoXG5cdGNvbHVtbjogUHJvcGVydHkgfCBEYXRhRmllbGRBYnN0cmFjdFR5cGVzLFxuXHRyZWxhdGVkUHJvcGVydGllc0luZm8/OiBDb21wbGV4UHJvcGVydHlJbmZvXG4pOiBDb2x1bW5FeHBvcnRTZXR0aW5ncyB7XG5cdGxldCB1bml0UHJvcGVydHksIHRpbWV6b25lUHJvcGVydHksIHVuaXRUZXh0LCB0aW1lem9uZVRleHQsIHV0YywgaXNBVGltZXpvbmUsIGN1cnJlbmN5UHJvcGVydHksIHNjYWxlO1xuXHRjb25zdCByZWxhdGVkUHJvcGVydHlOYW1lcyA9IHJlbGF0ZWRQcm9wZXJ0aWVzSW5mbyA/IE9iamVjdC5rZXlzKHJlbGF0ZWRQcm9wZXJ0aWVzSW5mby5wcm9wZXJ0aWVzKSA6IFtdO1xuXHRpZiAocmVsYXRlZFByb3BlcnRpZXNJbmZvICYmIHJlbGF0ZWRQcm9wZXJ0eU5hbWVzPy5sZW5ndGggPT09IDEpIHtcblx0XHQvLyBDcmVhdGUgdGhlIGV4cG9ydCBzZXR0aW5ncyBvZiBhIGNvbHVtbiBiYXNlZCBvbiB0aGUgcmVsYXRlZCAoY2hpbGQpIHByb3BlcnR5IGluIGNhc2UgdGhlcmUgaXMgb25seSBvbmUuXG5cdFx0Ly8gVGhpcyBpcyByZXF1aXJlZCB3aGVuIHdlIGhhdmUgYSB0ZXh0IG9ubHkgYW5ub3RhdGlvbiB0byBjb21wdXRlIHRoZSBleHBvcnQgc2V0dGluZ3MgZnJvbSB0aGUgdGV4dCBpbnN0ZWFkIG9mIHRoZSB2YWx1ZVxuXHRcdGNvbHVtbiA9IHJlbGF0ZWRQcm9wZXJ0aWVzSW5mby5wcm9wZXJ0aWVzW3JlbGF0ZWRQcm9wZXJ0eU5hbWVzWzBdXS5hbm5vdGF0aW9uUHJvcGVydHk7XG5cdH1cblx0Y29uc3QgZGF0YVR5cGUgPSBnZXREYXRhRmllbGREYXRhVHlwZShjb2x1bW4pO1xuXHRpZiAoaXNQcm9wZXJ0eShjb2x1bW4pKSB7XG5cdFx0dW5pdFByb3BlcnR5ID0gZ2V0QXNzb2NpYXRlZFVuaXRQcm9wZXJ0eShjb2x1bW4pO1xuXHRcdGN1cnJlbmN5UHJvcGVydHkgPSBnZXRBc3NvY2lhdGVkQ3VycmVuY3lQcm9wZXJ0eShjb2x1bW4pO1xuXHRcdHRpbWV6b25lUHJvcGVydHkgPSBnZXRBc3NvY2lhdGVkVGltZXpvbmVQcm9wZXJ0eShjb2x1bW4pO1xuXHRcdHVuaXRUZXh0ID0gZ2V0U3RhdGljVW5pdE9yQ3VycmVuY3koY29sdW1uKTtcblx0XHR0aW1lem9uZVRleHQgPSBnZXRTdGF0aWNUaW1lem9uZShjb2x1bW4pO1xuXHRcdGlzQVRpbWV6b25lID0gaXNUaW1lem9uZShjb2x1bW4pO1xuXHRcdHNjYWxlID0gY29sdW1uLnNjYWxlO1xuXHR9XG5cdHVuaXRQcm9wZXJ0eSA9IHJlbGF0ZWRQcm9wZXJ0aWVzSW5mbz8uZXhwb3J0U2V0dGluZ3M/LnVuaXRQcm9wZXJ0eSA/PyB1bml0UHJvcGVydHk/Lm5hbWUgPz8gY3VycmVuY3lQcm9wZXJ0eT8ubmFtZTtcblx0dGltZXpvbmVQcm9wZXJ0eSA9IHJlbGF0ZWRQcm9wZXJ0aWVzSW5mbz8uZXhwb3J0U2V0dGluZ3M/LnRpbWV6b25lUHJvcGVydHkgPz8gdGltZXpvbmVQcm9wZXJ0eT8ubmFtZTtcblx0c2NhbGUgPSByZWxhdGVkUHJvcGVydGllc0luZm8/LmV4cG9ydFNldHRpbmdzPy5zY2FsZSA/PyBzY2FsZTtcblx0Y29uc3QgZXhwb3J0VHlwZSA9IGdldEV4cG9ydERhdGFUeXBlKGRhdGFUeXBlLCBpc0FUaW1lem9uZSwgISFjdXJyZW5jeVByb3BlcnR5LCByZWxhdGVkUHJvcGVydGllc0luZm8/LmV4cG9ydFNldHRpbmdzKTtcblx0aWYgKHRpbWV6b25lUHJvcGVydHkgfHwgKGV4cG9ydFR5cGUgPT09IFwiRGF0ZVRpbWVcIiAmJiAhdGltZXpvbmVUZXh0KSkge1xuXHRcdHV0YyA9IGZhbHNlO1xuXHR9XG5cdGNvbnN0IGV4cG9ydFNldHRpbmdzOiBDb2x1bW5FeHBvcnRTZXR0aW5ncyA9IHtcblx0XHR0eXBlOiBleHBvcnRUeXBlLFxuXHRcdGlucHV0Rm9ybWF0OiBnZXREYXRlSW5wdXRGb3JtYXQoZGF0YVR5cGUpLFxuXHRcdGRlbGltaXRlcjogZ2V0RGVsaW1pdGVyKGRhdGFUeXBlKSxcblx0XHRzY2FsZTogc2NhbGUsXG5cdFx0dW5pdFByb3BlcnR5OiB1bml0UHJvcGVydHksXG5cdFx0dW5pdDogcmVsYXRlZFByb3BlcnRpZXNJbmZvPy5leHBvcnRTZXR0aW5ncy51bml0ID8/IHVuaXRUZXh0LFxuXHRcdHRpbWV6b25lUHJvcGVydHk6IHRpbWV6b25lUHJvcGVydHksXG5cdFx0dGltZXpvbmU6IHJlbGF0ZWRQcm9wZXJ0aWVzSW5mbz8uZXhwb3J0U2V0dGluZ3MudGltZXpvbmUgPz8gdGltZXpvbmVUZXh0Py50b1N0cmluZygpLFxuXHRcdHRlbXBsYXRlOiByZWxhdGVkUHJvcGVydGllc0luZm8/LmV4cG9ydFNldHRpbmdzLnRlbXBsYXRlLFxuXHRcdC8vb25seSBpbiBjYXNlIG9mIGNvbXBsZXggcHJvcGVydGllcywgd3JhcCB0aGUgY2VsbCBjb250ZW50XHRvbiB0aGUgZXhjZWwgZXhwb3J0ZWQgZmlsZVxuXHRcdHdyYXA6IHJlbGF0ZWRQcm9wZXJ0aWVzSW5mbz8uZXhwb3J0U2V0dGluZ3Mud3JhcCxcblx0XHR1dGM6IHV0Y1xuXHR9O1xuXHRpZiAoZXhwb3J0U2V0dGluZ3MudW5pdFByb3BlcnR5IHx8IGV4cG9ydFNldHRpbmdzLnVuaXQpIHtcblx0XHRleHBvcnRTZXR0aW5ncy5hdXRvU2NhbGUgPSB0cnVlO1xuXHR9XG5cdHJldHVybiByZW1vdmVVbmRlZmluZWRGcm9tRXhwb3J0U2V0dGluZ3MoZXhwb3J0U2V0dGluZ3MpO1xufTtcbi8qKlxuICogR2V0cyB0aGUgZXhwb3J0IGZvcm1hdCB0ZW1wbGF0ZSBmb3IgY29sdW1ucyB3aXRoIGRhdGVzLlxuICogQHBhcmFtIGRhdGFUeXBlIFRoZSBkYXRhIHR5cGUgb2YgdGhlIGNvbHVtblxuICogQHJldHVybnMgVGhlIGlucHV0Rm9ybWF0XG4gKi9cbmNvbnN0IGdldERhdGVJbnB1dEZvcm1hdCA9IGZ1bmN0aW9uIChkYXRhVHlwZT86IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdHJldHVybiBkYXRhVHlwZSA9PT0gXCJFZG0uRGF0ZVwiID8gXCJZWVlZLU1NLUREXCIgOiB1bmRlZmluZWQ7XG59O1xuLyoqXG4gKiBHZXRzIHRoZSBkZWxpbWl0ZXIgaW4gbnVtZXJpYyBjb2x1bW5zLlxuICogVGhlIGRlbGltaXRlciBpcyB1c2VkIHRvIGRpc3BsYXkgdGhvdXNhbmRzIHNlcGFyYXRvciBpbiBudW1lcmljIGNvbHVtbnMuXG4gKiBAcGFyYW0gZGF0YVR5cGUgVGhlIGRhdGEgdHlwZSBvZiB0aGUgY29sdW1uXG4gKiBAcmV0dXJucyBUcnVlIHRvIGRpc3BsYXkgdGhvdXNhbmRzIHNlcGFyYXRvciBpbiBudW1lcmljIGNvbHVtbnNcbiAqL1xuY29uc3QgZ2V0RGVsaW1pdGVyID0gZnVuY3Rpb24gKGRhdGFUeXBlPzogc3RyaW5nKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG5cdHJldHVybiBkYXRhVHlwZSA9PT0gXCJFZG0uSW50NjRcIiA/IHRydWUgOiB1bmRlZmluZWQ7XG59O1xuLyoqXG4gKiBSZW1vdmVzIHVuZGVmaW5lZCB2YWx1ZXMgZnJvbSB0aGUgZXhwb3J0IHNldHRpbmdzIG9iamVjdCBvZiBhIGNvbHVtbi5cbiAqIEBwYXJhbSBleHBvcnRTZXR0aW5ncyBUaGUgZXhwb3J0IHNldHRpbmdzIGNvbmZpZ3VyYXRpb25zIGZvciBhIGNvbHVtblxuICogQHJldHVybnMgVGhlIGV4cG9ydCBzZXR0aW5ncyBjb25maWd1cmF0aW9ucyB3aXRob3V0IHVuZGVmaW5lZCB2YWx1ZXNcbiAqL1xuY29uc3QgcmVtb3ZlVW5kZWZpbmVkRnJvbUV4cG9ydFNldHRpbmdzID0gZnVuY3Rpb24gKGV4cG9ydFNldHRpbmdzOiBDb2x1bW5FeHBvcnRTZXR0aW5ncyk6IENvbHVtbkV4cG9ydFNldHRpbmdzIHtcblx0Ly9SZW1vdmUgdW5kZWZpbmVkIHNldHRpbmdzIGZyb20gZXhwb3J0U2V0dGluZyBvYmplY3Rcblx0Zm9yIChjb25zdCBzZXR0aW5nIGluIGV4cG9ydFNldHRpbmdzKSB7XG5cdFx0aWYgKGV4cG9ydFNldHRpbmdzW3NldHRpbmcgYXMga2V5b2YgQ29sdW1uRXhwb3J0U2V0dGluZ3NdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdGRlbGV0ZSBleHBvcnRTZXR0aW5nc1tzZXR0aW5nIGFzIGtleW9mIENvbHVtbkV4cG9ydFNldHRpbmdzXTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIGV4cG9ydFNldHRpbmdzO1xufTtcbi8qKlxuICogVXBkYXRlIHByb3BlcnR5IGxhYmVsIGluIGNhc2UgaXQncyBvbmx5IHJlZmVyZW5jZWQgaW4gb25lIGNvbHVtbi4gVGhlIGxhYmVsIG9mIHRoZSBjb2x1bW4gbXVzdCBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIHByb3BlcnR5IGxhYmVsLlxuICogVGhpcyB1cGRhdGUgYWxzbyBpcyBhcHBsaWVkIGZvciB0aGUgdG9vbHRpcCBhcyBpdCBpcyBiYXNlZCBvbiB0aGUgY29sdW1uJ3MgbGFiZWwuXG4gKiBAcGFyYW0gYW5ub3RhdGlvbkNvbHVtbnMgVGhlIGFycmF5IG9mIGNvbHVtbnMgY3JlYXRlZCBiYXNlZCBvbiBMaW5lSXRlbSBhbm5vdGF0aW9ucy5cbiAqIEBwYXJhbSBjb2x1bW5zVG9CZUNyZWF0ZWQgVGhlIGNvbHVtbnMgdG8gYmUgY3JlYXRlZFxuICogQHBhcmFtIGNvbHVtbkluZm8gVGhlIGNvbHVtbiBkZWZpbml0aW9uXG4gKi9cbmZ1bmN0aW9uIHVwZGF0ZVByb3BlcnR5TGFiZWwoXG5cdGFubm90YXRpb25Db2x1bW5zOiBBbm5vdGF0aW9uVGFibGVDb2x1bW5bXSxcblx0Y29sdW1uc1RvQmVDcmVhdGVkOiBSZWNvcmQ8c3RyaW5nLCBQcm9wZXJ0eT4sXG5cdGNvbHVtbkluZm86IEFubm90YXRpb25UYWJsZUNvbHVtblxuKTogdm9pZCB7XG5cdGNvbnN0IGxpbmtlZEFubm90YXRpb25Db2x1bW5zID0gYW5ub3RhdGlvbkNvbHVtbnMuZmlsdGVyKChjb2wpID0+IGNvbC5wcm9wZXJ0eUluZm9zPy5pbmNsdWRlcyhjb2x1bW5JbmZvLnJlbGF0aXZlUGF0aCkpO1xuXHRpZiAoXG5cdFx0bGlua2VkQW5ub3RhdGlvbkNvbHVtbnM/Lmxlbmd0aCA9PT0gMSAmJlxuXHRcdGNvbHVtbnNUb0JlQ3JlYXRlZFtjb2x1bW5JbmZvLnJlbGF0aXZlUGF0aF0gJiZcblx0XHRsaW5rZWRBbm5vdGF0aW9uQ29sdW1uc1swXS5wcm9wZXJ0eUluZm9zPy5sZW5ndGggPT09IDFcblx0KSB7XG5cdFx0Y29sdW1uSW5mby5sYWJlbCA9IGxpbmtlZEFubm90YXRpb25Db2x1bW5zWzBdLmxhYmVsO1xuXHRcdGNvbHVtbkluZm8udG9vbHRpcCA9IGxpbmtlZEFubm90YXRpb25Db2x1bW5zWzBdLnRvb2x0aXA7XG5cdH1cbn1cbi8qKlxuICogUmV0dXJucyBCb29sZWFuIHRydWUgZm9yIGV4cG9ydGFibGUgY29sdW1ucywgZmFsc2UgZm9yIG5vbiBleHBvcnRhYmxlIGNvbHVtbnMuXG4gKiBAcGFyYW0gc291cmNlIFRoZSBkYXRhRmllbGQgb3IgcHJvcGVydHkgdG8gYmUgZXZhbHVhdGVkXG4gKiBAcmV0dXJucyBUcnVlIGZvciBleHBvcnRhYmxlIGNvbHVtbiwgZmFsc2UgZm9yIG5vbiBleHBvcnRhYmxlIGNvbHVtblxuICovXG5mdW5jdGlvbiBfaXNFeHBvcnRhYmxlQ29sdW1uKHNvdXJjZTogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyB8IFByb3BlcnR5KTogYm9vbGVhbiB7XG5cdGxldCBwcm9wZXJ0eVR5cGUsIHByb3BlcnR5O1xuXHRjb25zdCBkYXRhRmllbGREZWZhdWx0UHJvcGVydHkgPSAoc291cmNlIGFzIFByb3BlcnR5KS5hbm5vdGF0aW9ucy5VST8uRGF0YUZpZWxkRGVmYXVsdDtcblx0aWYgKGlzUHJvcGVydHkoc291cmNlKSkge1xuXHRcdGlmIChpc1JlZmVyZW5jZVByb3BlcnR5U3RhdGljYWxseUhpZGRlbihzb3VyY2UpKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHRcdHByb3BlcnR5VHlwZSA9IGRhdGFGaWVsZERlZmF1bHRQcm9wZXJ0eT8uJFR5cGU7XG5cdH0gZWxzZSBpZiAoaXNSZWZlcmVuY2VQcm9wZXJ0eVN0YXRpY2FsbHlIaWRkZW4oc291cmNlKSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fSBlbHNlIHtcblx0XHRwcm9wZXJ0eSA9IHNvdXJjZTtcblx0XHRwcm9wZXJ0eVR5cGUgPSBwcm9wZXJ0eS4kVHlwZTtcblx0XHRpZiAocHJvcGVydHlUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBbm5vdGF0aW9uICYmIChwcm9wZXJ0eSBhcyBEYXRhRmllbGRGb3JBbm5vdGF0aW9uKS5UYXJnZXQ/LiR0YXJnZXQ/LiRUeXBlKSB7XG5cdFx0XHQvL0ZvciBDaGFydFxuXHRcdFx0cHJvcGVydHlUeXBlID0gKHByb3BlcnR5IGFzIERhdGFGaWVsZEZvckFubm90YXRpb24pLlRhcmdldD8uJHRhcmdldD8uJFR5cGU7XG5cdFx0XHRyZXR1cm4gcHJvcGVydHlUeXBlICE9PSB1bmRlZmluZWQgJiYgIVVJQW5ub3RhdGlvblR5cGVzLkNoYXJ0RGVmaW5pdGlvblR5cGUuaW5jbHVkZXMocHJvcGVydHlUeXBlKTtcblx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0KHByb3BlcnR5IGFzIERhdGFGaWVsZCkuVmFsdWU/LiR0YXJnZXQ/LmFubm90YXRpb25zPy5Db3JlPy5NZWRpYVR5cGU/LnRlcm0gPT09IFwiT3JnLk9EYXRhLkNvcmUuVjEuTWVkaWFUeXBlXCIgJiZcblx0XHRcdChwcm9wZXJ0eSBhcyBEYXRhRmllbGQpLlZhbHVlPy4kdGFyZ2V0Py5hbm5vdGF0aW9ucz8uQ29yZT8uaXNVUkwgIT09IHRydWVcblx0XHQpIHtcblx0XHRcdC8vRm9yIFN0cmVhbVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gcHJvcGVydHlUeXBlXG5cdFx0PyAhW1xuXHRcdFx0XHRVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBY3Rpb24sXG5cdFx0XHRcdFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbixcblx0XHRcdFx0VUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQWN0aW9uR3JvdXBcblx0XHQgIF0uaW5jbHVkZXMocHJvcGVydHlUeXBlKVxuXHRcdDogdHJ1ZTtcbn1cbi8qKlxuICogUmV0dXJucyBCb29sZWFuIHRydWUgZm9yIHZhbGlkIGNvbHVtbnMsIGZhbHNlIGZvciBpbnZhbGlkIGNvbHVtbnMuXG4gKiBAcGFyYW0gZGF0YUZpZWxkIERpZmZlcmVudCBEYXRhRmllbGQgdHlwZXMgZGVmaW5lZCBpbiB0aGUgYW5ub3RhdGlvbnNcbiAqIEByZXR1cm5zIFRydWUgZm9yIHZhbGlkIGNvbHVtbnMsIGZhbHNlIGZvciBpbnZhbGlkIGNvbHVtbnNcbiAqL1xuY29uc3QgX2lzVmFsaWRDb2x1bW4gPSBmdW5jdGlvbiAoZGF0YUZpZWxkOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzKTogYm9vbGVhbiB7XG5cdHN3aXRjaCAoZGF0YUZpZWxkLiRUeXBlKSB7XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBY3Rpb246XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb246XG5cdFx0XHRyZXR1cm4gISFkYXRhRmllbGQuSW5saW5lO1xuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aEFjdGlvbjpcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhJbnRlbnRCYXNlZE5hdmlnYXRpb246XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGQ6XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoVXJsOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQW5ub3RhdGlvbjpcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhOYXZpZ2F0aW9uUGF0aDpcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdGRlZmF1bHQ6XG5cdFx0XHQvLyBUb2RvOiBSZXBsYWNlIHdpdGggcHJvcGVyIExvZyBzdGF0ZW1lbnQgb25jZSBhdmFpbGFibGVcblx0XHRcdC8vICB0aHJvdyBuZXcgRXJyb3IoXCJVbmhhbmRsZWQgRGF0YUZpZWxkIEFic3RyYWN0IHR5cGU6IFwiICsgZGF0YUZpZWxkLiRUeXBlKTtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0fVxufTtcbi8qKlxuICogUmV0dXJucyB0aGUgYmluZGluZyBleHByZXNzaW9uIHRvIGV2YWx1YXRlIHRoZSB2aXNpYmlsaXR5IG9mIGEgRGF0YUZpZWxkIG9yIERhdGFQb2ludCBhbm5vdGF0aW9uLlxuICpcbiAqIFNBUCBGaW9yaSBlbGVtZW50cyB3aWxsIGV2YWx1YXRlIGVpdGhlciB0aGUgVUkuSGlkZGVuIGFubm90YXRpb24gZGVmaW5lZCBvbiB0aGUgYW5ub3RhdGlvbiBpdHNlbGYgb3Igb24gdGhlIHRhcmdldCBwcm9wZXJ0eS5cbiAqIEBwYXJhbSBkYXRhRmllbGRNb2RlbFBhdGggVGhlIG1ldGFwYXRoIHJlZmVycmluZyB0byB0aGUgYW5ub3RhdGlvbiB0aGF0IGlzIGV2YWx1YXRlZCBieSBTQVAgRmlvcmkgZWxlbWVudHMuXG4gKiBAcmV0dXJucyBBbiBleHByZXNzaW9uIHRoYXQgeW91IGNhbiBiaW5kIHRvIHRoZSBVSS5cbiAqL1xuZXhwb3J0IGNvbnN0IF9nZXRWaXNpYmxlRXhwcmVzc2lvbiA9IGZ1bmN0aW9uIChcblx0ZGF0YUZpZWxkTW9kZWxQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoPERhdGFGaWVsZEFic3RyYWN0VHlwZXMgfCBEYXRhUG9pbnRUeXBlVHlwZXM+XG4pOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj4ge1xuXHRjb25zdCB0YXJnZXRPYmplY3QgPSBkYXRhRmllbGRNb2RlbFBhdGgudGFyZ2V0T2JqZWN0O1xuXHRsZXQgcHJvcGVydHlWYWx1ZTtcblx0aWYgKHRhcmdldE9iamVjdCkge1xuXHRcdHN3aXRjaCAodGFyZ2V0T2JqZWN0LiRUeXBlKSB7XG5cdFx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZDpcblx0XHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aFVybDpcblx0XHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aE5hdmlnYXRpb25QYXRoOlxuXHRcdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoSW50ZW50QmFzZWROYXZpZ2F0aW9uOlxuXHRcdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoQWN0aW9uOlxuXHRcdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhUG9pbnRUeXBlOlxuXHRcdFx0XHRwcm9wZXJ0eVZhbHVlID0gdGFyZ2V0T2JqZWN0LlZhbHVlLiR0YXJnZXQ7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBbm5vdGF0aW9uOlxuXHRcdFx0XHQvLyBpZiBpdCBpcyBhIERhdGFGaWVsZEZvckFubm90YXRpb24gcG9pbnRpbmcgdG8gYSBEYXRhUG9pbnQgd2UgbG9vayBhdCB0aGUgZGF0YVBvaW50J3MgdmFsdWVcblx0XHRcdFx0aWYgKHRhcmdldE9iamVjdD8uVGFyZ2V0Py4kdGFyZ2V0Py4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YVBvaW50VHlwZSkge1xuXHRcdFx0XHRcdHByb3BlcnR5VmFsdWUgPSB0YXJnZXRPYmplY3QuVGFyZ2V0LiR0YXJnZXQ/LlZhbHVlLiR0YXJnZXQ7XG5cdFx0XHRcdH1cblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbjpcblx0XHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQWN0aW9uOlxuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0cHJvcGVydHlWYWx1ZSA9IHVuZGVmaW5lZDtcblx0XHR9XG5cdH1cblx0Y29uc3QgaXNBbmFseXRpY2FsR3JvdXBIZWFkZXJFeHBhbmRlZCA9IC8qZm9ybWF0T3B0aW9ucz8uaXNBbmFseXRpY3MgPyBVSS5Jc0V4cGFuZGVkIDoqLyBjb25zdGFudChmYWxzZSk7XG5cdGNvbnN0IGlzQW5hbHl0aWNhbExlYWYgPSAvKmZvcm1hdE9wdGlvbnM/LmlzQW5hbHl0aWNzID8gZXF1YWwoVUkuTm9kZUxldmVsLCAwKSA6Ki8gY29uc3RhbnQoZmFsc2UpO1xuXHQvLyBBIGRhdGEgZmllbGQgaXMgdmlzaWJsZSBpZjpcblx0Ly8gLSB0aGUgVUkuSGlkZGVuIGV4cHJlc3Npb24gaW4gdGhlIG9yaWdpbmFsIGFubm90YXRpb24gZG9lcyBub3QgZXZhbHVhdGUgdG8gJ3RydWUnXG5cdC8vIC0gdGhlIFVJLkhpZGRlbiBleHByZXNzaW9uIGluIHRoZSB0YXJnZXQgcHJvcGVydHkgZG9lcyBub3QgZXZhbHVhdGUgdG8gJ3RydWUnXG5cdC8vIC0gaW4gY2FzZSBvZiBBbmFseXRpY3MgaXQncyBub3QgdmlzaWJsZSBmb3IgYW4gZXhwYW5kZWQgR3JvdXBIZWFkZXJcblx0cmV0dXJuIGFuZChcblx0XHQuLi5bXG5cdFx0XHRub3QoZXF1YWwoZ2V0RXhwcmVzc2lvbkZyb21Bbm5vdGF0aW9uKHRhcmdldE9iamVjdD8uYW5ub3RhdGlvbnM/LlVJPy5IaWRkZW4pLCB0cnVlKSksXG5cdFx0XHRpZkVsc2UoXG5cdFx0XHRcdCEhcHJvcGVydHlWYWx1ZSxcblx0XHRcdFx0cHJvcGVydHlWYWx1ZSAmJiBub3QoZXF1YWwoZ2V0RXhwcmVzc2lvbkZyb21Bbm5vdGF0aW9uKHByb3BlcnR5VmFsdWUuYW5ub3RhdGlvbnM/LlVJPy5IaWRkZW4pLCB0cnVlKSksXG5cdFx0XHRcdHRydWVcblx0XHRcdCksXG5cdFx0XHRvcihub3QoaXNBbmFseXRpY2FsR3JvdXBIZWFkZXJFeHBhbmRlZCksIGlzQW5hbHl0aWNhbExlYWYpXG5cdFx0XVxuXHQpO1xufTtcbi8qKlxuICogUmV0dXJucyBoaWRkZW4gYmluZGluZyBleHByZXNzaW9ucyBmb3IgYSBmaWVsZCBncm91cC5cbiAqIEBwYXJhbSBkYXRhRmllbGRHcm91cCBEYXRhRmllbGQgZGVmaW5lZCBpbiB0aGUgYW5ub3RhdGlvbnNcbiAqIEByZXR1cm5zIENvbXBpbGUgYmluZGluZyBvZiBmaWVsZCBncm91cCBleHByZXNzaW9ucy5cbiAqL1xuY29uc3QgX2dldEZpZWxkR3JvdXBIaWRkZW5FeHByZXNzaW9ucyA9IGZ1bmN0aW9uIChkYXRhRmllbGRHcm91cDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyk6IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIHwgdW5kZWZpbmVkIHtcblx0Y29uc3QgZmllbGRHcm91cEhpZGRlbkV4cHJlc3Npb25zOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj5bXSA9IFtdO1xuXHRpZiAoXG5cdFx0ZGF0YUZpZWxkR3JvdXAuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFubm90YXRpb24gJiZcblx0XHRkYXRhRmllbGRHcm91cC5UYXJnZXQ/LiR0YXJnZXQ/LiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5GaWVsZEdyb3VwVHlwZVxuXHQpIHtcblx0XHRpZiAoZGF0YUZpZWxkR3JvdXA/LmFubm90YXRpb25zPy5VST8uSGlkZGVuKSB7XG5cdFx0XHRyZXR1cm4gY29tcGlsZUV4cHJlc3Npb24obm90KGVxdWFsKGdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbihkYXRhRmllbGRHcm91cC5hbm5vdGF0aW9ucy5VSS5IaWRkZW4pLCB0cnVlKSkpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRkYXRhRmllbGRHcm91cC5UYXJnZXQuJHRhcmdldC5EYXRhPy5mb3JFYWNoKChpbm5lckRhdGFGaWVsZDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyB8IERhdGFQb2ludFR5cGVUeXBlcykgPT4ge1xuXHRcdFx0XHRmaWVsZEdyb3VwSGlkZGVuRXhwcmVzc2lvbnMucHVzaChcblx0XHRcdFx0XHRfZ2V0VmlzaWJsZUV4cHJlc3Npb24oeyB0YXJnZXRPYmplY3Q6IGlubmVyRGF0YUZpZWxkIH0gYXMgRGF0YU1vZGVsT2JqZWN0UGF0aDxcblx0XHRcdFx0XHRcdERhdGFGaWVsZEFic3RyYWN0VHlwZXMgfCBEYXRhUG9pbnRUeXBlVHlwZXNcblx0XHRcdFx0XHQ+KVxuXHRcdFx0XHQpO1xuXHRcdFx0fSk7XG5cdFx0XHRyZXR1cm4gY29tcGlsZUV4cHJlc3Npb24oaWZFbHNlKG9yKC4uLmZpZWxkR3JvdXBIaWRkZW5FeHByZXNzaW9ucyksIGNvbnN0YW50KHRydWUpLCBjb25zdGFudChmYWxzZSkpKTtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxufTtcbi8qKlxuICogUmV0dXJucyB0aGUgbGFiZWwgZm9yIHRoZSBwcm9wZXJ0eSBhbmQgZGF0YUZpZWxkLlxuICogQHBhcmFtIFtwcm9wZXJ0eV0gUHJvcGVydHksIERhdGFGaWVsZCBvciBOYXZpZ2F0aW9uIFByb3BlcnR5IGRlZmluZWQgaW4gdGhlIGFubm90YXRpb25zXG4gKiBAcGFyYW0gaXNHcm91cFxuICogQHJldHVybnMgTGFiZWwgb2YgdGhlIHByb3BlcnR5IG9yIERhdGFGaWVsZFxuICovXG5jb25zdCBnZXRMYWJlbCA9IGZ1bmN0aW9uIChwcm9wZXJ0eTogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyB8IFByb3BlcnR5IHwgTmF2aWdhdGlvblByb3BlcnR5LCBpc0dyb3VwID0gZmFsc2UpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRpZiAoIXByb3BlcnR5KSB7XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxuXHRpZiAoaXNQcm9wZXJ0eShwcm9wZXJ0eSkgfHwgaXNOYXZpZ2F0aW9uUHJvcGVydHkocHJvcGVydHkpKSB7XG5cdFx0Y29uc3QgZGF0YUZpZWxkRGVmYXVsdCA9IChwcm9wZXJ0eSBhcyBQcm9wZXJ0eSkuYW5ub3RhdGlvbnM/LlVJPy5EYXRhRmllbGREZWZhdWx0O1xuXHRcdGlmIChkYXRhRmllbGREZWZhdWx0ICYmICFkYXRhRmllbGREZWZhdWx0LnF1YWxpZmllciAmJiBkYXRhRmllbGREZWZhdWx0LkxhYmVsKSB7XG5cdFx0XHRyZXR1cm4gZGF0YUZpZWxkRGVmYXVsdC5MYWJlbD8udG9TdHJpbmcoKTtcblx0XHR9XG5cdFx0cmV0dXJuIHByb3BlcnR5LmFubm90YXRpb25zLkNvbW1vbj8uTGFiZWw/LnRvU3RyaW5nKCkgPz8gcHJvcGVydHkubmFtZTtcblx0fSBlbHNlIGlmIChpc0RhdGFGaWVsZFR5cGVzKHByb3BlcnR5KSkge1xuXHRcdGlmICghIWlzR3JvdXAgJiYgcHJvcGVydHkuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhJbnRlbnRCYXNlZE5hdmlnYXRpb24pIHtcblx0XHRcdHJldHVybiBwcm9wZXJ0eT8uTGFiZWw/LnRvU3RyaW5nKCk7XG5cdFx0fVxuXHRcdHJldHVybiAoXG5cdFx0XHRwcm9wZXJ0eT8uTGFiZWw/LnRvU3RyaW5nKCkgPz9cblx0XHRcdGNvbXBpbGVFeHByZXNzaW9uKFxuXHRcdFx0XHRnZXRFeHByZXNzaW9uRnJvbUFubm90YXRpb24ocHJvcGVydHkuVmFsdWU/LiR0YXJnZXQ/LmFubm90YXRpb25zPy5Db21tb24/LkxhYmVsLCBbXSwgcHJvcGVydHkuVmFsdWU/LiR0YXJnZXQ/Lm5hbWUpXG5cdFx0XHQpXG5cdFx0KTtcblx0fSBlbHNlIGlmIChwcm9wZXJ0eS4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQW5ub3RhdGlvbikge1xuXHRcdHJldHVybiAoXG5cdFx0XHRwcm9wZXJ0eS5MYWJlbD8udG9TdHJpbmcoKSA/P1xuXHRcdFx0Y29tcGlsZUV4cHJlc3Npb24oXG5cdFx0XHRcdGdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbigocHJvcGVydHkuVGFyZ2V0Py4kdGFyZ2V0IGFzIERhdGFQb2ludCk/LlZhbHVlPy4kdGFyZ2V0Py5hbm5vdGF0aW9ucz8uQ29tbW9uPy5MYWJlbD8udmFsdWVPZigpKVxuXHRcdFx0KVxuXHRcdCk7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIHByb3BlcnR5LkxhYmVsPy50b1N0cmluZygpO1xuXHR9XG59O1xuY29uc3QgX2dldFRvb2x0aXAgPSBmdW5jdGlvbiAoc291cmNlOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzIHwgUHJvcGVydHkpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRpZiAoIXNvdXJjZSkge1xuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblx0aWYgKGlzUHJvcGVydHkoc291cmNlKSB8fCBzb3VyY2UuYW5ub3RhdGlvbnM/LkNvbW1vbj8uUXVpY2tJbmZvKSB7XG5cdFx0cmV0dXJuIHNvdXJjZS5hbm5vdGF0aW9ucz8uQ29tbW9uPy5RdWlja0luZm9cblx0XHRcdD8gY29tcGlsZUV4cHJlc3Npb24oZ2V0RXhwcmVzc2lvbkZyb21Bbm5vdGF0aW9uKHNvdXJjZS5hbm5vdGF0aW9ucy5Db21tb24uUXVpY2tJbmZvKSlcblx0XHRcdDogdW5kZWZpbmVkO1xuXHR9IGVsc2UgaWYgKGlzRGF0YUZpZWxkVHlwZXMoc291cmNlKSkge1xuXHRcdHJldHVybiBzb3VyY2UuVmFsdWU/LiR0YXJnZXQ/LmFubm90YXRpb25zPy5Db21tb24/LlF1aWNrSW5mb1xuXHRcdFx0PyBjb21waWxlRXhwcmVzc2lvbihnZXRFeHByZXNzaW9uRnJvbUFubm90YXRpb24oc291cmNlLlZhbHVlLiR0YXJnZXQuYW5ub3RhdGlvbnMuQ29tbW9uLlF1aWNrSW5mbykpXG5cdFx0XHQ6IHVuZGVmaW5lZDtcblx0fSBlbHNlIGlmIChzb3VyY2UuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFubm90YXRpb24pIHtcblx0XHRjb25zdCBkYXRhcG9pbnRUYXJnZXQgPSBzb3VyY2UuVGFyZ2V0Py4kdGFyZ2V0IGFzIERhdGFQb2ludDtcblx0XHRyZXR1cm4gZGF0YXBvaW50VGFyZ2V0Py5WYWx1ZT8uJHRhcmdldD8uYW5ub3RhdGlvbnM/LkNvbW1vbj8uUXVpY2tJbmZvXG5cdFx0XHQ/IGNvbXBpbGVFeHByZXNzaW9uKGdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbihkYXRhcG9pbnRUYXJnZXQuVmFsdWUuJHRhcmdldC5hbm5vdGF0aW9ucy5Db21tb24uUXVpY2tJbmZvKSlcblx0XHRcdDogdW5kZWZpbmVkO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cbn07XG5leHBvcnQgZnVuY3Rpb24gZ2V0Um93U3RhdHVzVmlzaWJpbGl0eShjb2xOYW1lOiBzdHJpbmcsIGlzU2VtYW50aWNLZXlJbkZpZWxkR3JvdXA/OiBib29sZWFuKTogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0cmV0dXJuIGZvcm1hdFJlc3VsdChcblx0XHRbXG5cdFx0XHRwYXRoSW5Nb2RlbChgc2VtYW50aWNLZXlIYXNEcmFmdEluZGljYXRvcmAsIFwiaW50ZXJuYWxcIiksXG5cdFx0XHRwYXRoSW5Nb2RlbChgZmlsdGVyZWRNZXNzYWdlc2AsIFwiaW50ZXJuYWxcIiksXG5cdFx0XHRjb2xOYW1lLFxuXHRcdFx0aXNTZW1hbnRpY0tleUluRmllbGRHcm91cFxuXHRcdF0sXG5cdFx0dGFibGVGb3JtYXR0ZXJzLmdldEVycm9yU3RhdHVzVGV4dFZpc2liaWxpdHlGb3JtYXR0ZXJcblx0KTtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIFByb3BlcnR5SW5mbyBmb3IgZWFjaCBpZGVudGlmaWVkIHByb3BlcnR5IGNvbnN1bWVkIGJ5IGEgTGluZUl0ZW0uXG4gKiBAcGFyYW0gY29sdW1uc1RvQmVDcmVhdGVkIElkZW50aWZpZWQgcHJvcGVydGllcy5cbiAqIEBwYXJhbSBleGlzdGluZ0NvbHVtbnMgVGhlIGxpc3Qgb2YgY29sdW1ucyBjcmVhdGVkIGZvciBMaW5lSXRlbXMgYW5kIFByb3BlcnRpZXMgb2YgZW50aXR5VHlwZS5cbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dC5cbiAqIEBwYXJhbSBlbnRpdHlUeXBlIFRoZSBlbnRpdHkgdHlwZSBmb3IgdGhlIExpbmVJdGVtXG4gKiBAcGFyYW0gZGlzcGxheU1vZGVPZkRlc2NyaXB0aW9uUHJvcGVydGllc01hcCBUaGUgbWFwIG9mIHByb3BlcnRpZXMgcmVmZXJlbmNlZCBhcyB0ZXh0IG9uIGEgdGV4dCBhcnJhbmdlbWVudCBhbm5vdGF0aW9uLlxuICogQHBhcmFtIHRhYmxlQ3JlYXRpb25Nb2RlIFRoZSBjcmVhdGlvbiBtb2RlIG9mIHRoZSB0YWJsZVxuICogQHBhcmFtIHJlc3RyaWN0aW9uc09uUHJvcGVydGllcyBUaGUgZXhpc3RpbmcgcmVzdHJpY3Rpb25zIG9uIHByb3BlcnRpZXNcbiAqIEByZXR1cm5zIFRoZSBhcnJheSBvZiBjb2x1bW5zIGNyZWF0ZWQuXG4gKi9cbmNvbnN0IF9jcmVhdGVSZWxhdGVkQ29sdW1ucyA9IGZ1bmN0aW9uIChcblx0Y29sdW1uc1RvQmVDcmVhdGVkOiBSZWNvcmQ8c3RyaW5nLCBQcm9wZXJ0eT4sXG5cdGV4aXN0aW5nQ29sdW1uczogQW5ub3RhdGlvblRhYmxlQ29sdW1uW10sXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pixcblx0ZW50aXR5VHlwZTogRW50aXR5VHlwZSxcblx0ZGlzcGxheU1vZGVPZkRlc2NyaXB0aW9uUHJvcGVydGllc01hcDogUmVjb3JkPHN0cmluZywgRGlzcGxheU1vZGU+LFxuXHR0YWJsZUNyZWF0aW9uTW9kZT86IENyZWF0aW9uTW9kZSxcblx0cmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzPzogUmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzXG4pOiBBbm5vdGF0aW9uVGFibGVDb2x1bW5bXSB7XG5cdGNvbnN0IHJlbGF0ZWRDb2x1bW5zOiAoQW5ub3RhdGlvblRhYmxlQ29sdW1uIHwgVGVjaG5pY2FsQ29sdW1uKVtdID0gW107XG5cdGNvbnN0IHJlbGF0ZWRQcm9wZXJ0eU5hbWVNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblx0Y29uc3QgYWdncmVnYXRpb25IZWxwZXIgPSBuZXcgQWdncmVnYXRpb25IZWxwZXIoZW50aXR5VHlwZSwgY29udmVydGVyQ29udGV4dCk7XG5cdE9iamVjdC5rZXlzKGNvbHVtbnNUb0JlQ3JlYXRlZCkuZm9yRWFjaCgobmFtZSkgPT4ge1xuXHRcdGNvbnN0IHByb3BlcnR5ID0gY29sdW1uc1RvQmVDcmVhdGVkW25hbWVdLFxuXHRcdFx0YW5ub3RhdGlvblBhdGggPSBjb252ZXJ0ZXJDb250ZXh0LmdldEFic29sdXRlQW5ub3RhdGlvblBhdGgobmFtZSksXG5cdFx0XHQvLyBDaGVjayB3aGV0aGVyIHRoZSByZWxhdGVkIGNvbHVtbiBhbHJlYWR5IGV4aXN0cy5cblx0XHRcdHJlbGF0ZWRDb2x1bW4gPSBleGlzdGluZ0NvbHVtbnMuZmluZCgoY29sdW1uKSA9PiBjb2x1bW4ubmFtZSA9PT0gbmFtZSk7XG5cdFx0aWYgKHJlbGF0ZWRDb2x1bW4gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Ly8gQ2FzZSAxOiBLZXkgY29udGFpbnMgRGF0YUZpZWxkIHByZWZpeCB0byBlbnN1cmUgYWxsIHByb3BlcnR5IGNvbHVtbnMgaGF2ZSB0aGUgc2FtZSBrZXkgZm9ybWF0LlxuXHRcdFx0Ly8gTmV3IGNyZWF0ZWQgcHJvcGVydHkgY29sdW1uIGlzIHNldCB0byBoaWRkZW4uXG5cdFx0XHRjb25zdCBjb2x1bW4gPSBnZXRDb2x1bW5EZWZpbml0aW9uRnJvbVByb3BlcnR5KFxuXHRcdFx0XHRwcm9wZXJ0eSxcblx0XHRcdFx0YW5ub3RhdGlvblBhdGgsXG5cdFx0XHRcdG5hbWUsXG5cdFx0XHRcdHRydWUsXG5cdFx0XHRcdGZhbHNlLFxuXHRcdFx0XHRhZ2dyZWdhdGlvbkhlbHBlcixcblx0XHRcdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHRcdFx0ZGlzcGxheU1vZGVPZkRlc2NyaXB0aW9uUHJvcGVydGllc01hcCxcblx0XHRcdFx0cmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzLFxuXHRcdFx0XHR0YWJsZUNyZWF0aW9uTW9kZVxuXHRcdFx0KTtcblx0XHRcdGNvbXB1dGVIaWRkZW5PblJlbGF0ZWRDb2x1bW5zKGV4aXN0aW5nQ29sdW1ucywgbmFtZSwgY29sdW1uKTtcblx0XHRcdHVwZGF0ZVByb3BlcnR5TGFiZWwoZXhpc3RpbmdDb2x1bW5zLCBjb2x1bW5zVG9CZUNyZWF0ZWQsIGNvbHVtbik7XG5cdFx0XHRyZWxhdGVkQ29sdW1ucy5wdXNoKGNvbHVtbik7XG5cdFx0fSBlbHNlIGlmIChyZWxhdGVkQ29sdW1uLmFubm90YXRpb25QYXRoICE9PSBhbm5vdGF0aW9uUGF0aCB8fCByZWxhdGVkQ29sdW1uLnByb3BlcnR5SW5mb3MpIHtcblx0XHRcdC8vIENhc2UgMjogVGhlIGV4aXN0aW5nIGNvbHVtbiBwb2ludHMgdG8gYSBMaW5lSXRlbSAob3IpXG5cdFx0XHQvLyBDYXNlIDM6IFRoaXMgaXMgYSBzZWxmIHJlZmVyZW5jZSBmcm9tIGFuIGV4aXN0aW5nIGNvbHVtblxuXHRcdFx0Y29uc3QgbmV3TmFtZSA9IGBQcm9wZXJ0eTo6JHtuYW1lfWA7XG5cdFx0XHQvLyBDaGVja2luZyB3aGV0aGVyIHRoZSByZWxhdGVkIHByb3BlcnR5IGNvbHVtbiBoYXMgYWxyZWFkeSBiZWVuIGNyZWF0ZWQgaW4gYSBwcmV2aW91cyBpdGVyYXRpb24uXG5cdFx0XHRpZiAoIWV4aXN0aW5nQ29sdW1ucy5zb21lKChjb2x1bW4pID0+IGNvbHVtbi5uYW1lID09PSBuZXdOYW1lKSkge1xuXHRcdFx0XHQvLyBDcmVhdGUgYSBuZXcgcHJvcGVydHkgY29sdW1uIHdpdGggJ1Byb3BlcnR5OjonIHByZWZpeCxcblx0XHRcdFx0Ly8gU2V0IGl0IHRvIGhpZGRlbiBhcyBpdCBpcyBvbmx5IGNvbnN1bWVkIGJ5IENvbXBsZXggcHJvcGVydHkgaW5mb3MuXG5cdFx0XHRcdGNvbnN0IGNvbHVtbiA9IGdldENvbHVtbkRlZmluaXRpb25Gcm9tUHJvcGVydHkoXG5cdFx0XHRcdFx0cHJvcGVydHksXG5cdFx0XHRcdFx0YW5ub3RhdGlvblBhdGgsXG5cdFx0XHRcdFx0bmFtZSxcblx0XHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0XHRhZ2dyZWdhdGlvbkhlbHBlcixcblx0XHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdFx0XHRcdGRpc3BsYXlNb2RlT2ZEZXNjcmlwdGlvblByb3BlcnRpZXNNYXAsXG5cdFx0XHRcdFx0cmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzLFxuXHRcdFx0XHRcdHRhYmxlQ3JlYXRpb25Nb2RlXG5cdFx0XHRcdCk7XG5cdFx0XHRcdGNvbXB1dGVIaWRkZW5PblJlbGF0ZWRDb2x1bW5zKGV4aXN0aW5nQ29sdW1ucywgbmFtZSwgY29sdW1uKTtcblx0XHRcdFx0dXBkYXRlUHJvcGVydHlMYWJlbChleGlzdGluZ0NvbHVtbnMsIGNvbHVtbnNUb0JlQ3JlYXRlZCwgY29sdW1uKTtcblx0XHRcdFx0cmVsYXRlZENvbHVtbnMucHVzaChjb2x1bW4pO1xuXHRcdFx0XHRyZWxhdGVkUHJvcGVydHlOYW1lTWFwW25hbWVdID0gbmV3TmFtZTtcblx0XHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRcdGV4aXN0aW5nQ29sdW1ucy5zb21lKChjb2x1bW4pID0+IGNvbHVtbi5uYW1lID09PSBuZXdOYW1lKSAmJlxuXHRcdFx0XHRleGlzdGluZ0NvbHVtbnMuc29tZSgoY29sdW1uKSA9PiBjb2x1bW4ucHJvcGVydHlJbmZvcz8uaW5jbHVkZXMobmFtZSkpXG5cdFx0XHQpIHtcblx0XHRcdFx0cmVsYXRlZFByb3BlcnR5TmFtZU1hcFtuYW1lXSA9IG5ld05hbWU7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChcblx0XHRcdGRpc3BsYXlNb2RlT2ZEZXNjcmlwdGlvblByb3BlcnRpZXNNYXBbbmFtZV0gPT09IFwiRGVzY3JpcHRpb25cIiAmJlxuXHRcdFx0IXJlbGF0ZWRDb2x1bW4uZmlsdGVyYWJsZSAmJlxuXHRcdFx0IXJlc3RyaWN0aW9uc09uUHJvcGVydGllcz8ubm9uRmlsdGVyYWJsZVByb3BlcnRpZXMuaW5jbHVkZXMobmFtZSlcblx0XHQpIHtcblx0XHRcdC8vIENhc2UgNDogVGhlIGNvbHVtbiBpcyBhIHJlZmVyZW5jZWQgdGV4dCBvbmx5IHByb3BlcnR5LiBTZXQgaXQgdG8gaGlkZGVuLCBub24gc29ydGFibGUgbm9yIGdyb3VwYWJsZS5cblx0XHRcdC8vIENhc2UgNTogVGhlIGNvbHVtbiBpc24ndCBhbHJlYWR5IGF2YWlsYWJsZSBmb3IgZmlsdGVyaW5nIGFzIGl0IGNvdWxkIGJlIHJlZmVyZW5jZWQgb24gYW5vdGhlciBjb2x1bW4gKGUuZy4gdGV4dCBmaXJzdCkuXG5cdFx0XHRyZXN0cmljdGlvbnNPblByb3BlcnRpZXM/Lm5vblNvcnRhYmxlUHJvcGVydGllcy5wdXNoKG5hbWUpO1xuXHRcdFx0Y29uc3QgY29sdW1uID0gZ2V0Q29sdW1uRGVmaW5pdGlvbkZyb21Qcm9wZXJ0eShcblx0XHRcdFx0cHJvcGVydHksXG5cdFx0XHRcdGFubm90YXRpb25QYXRoLFxuXHRcdFx0XHRuYW1lLFxuXHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0ZmFsc2UsXG5cdFx0XHRcdGFnZ3JlZ2F0aW9uSGVscGVyLFxuXHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdFx0XHR7fSxcblx0XHRcdFx0cmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzLFxuXHRcdFx0XHR0YWJsZUNyZWF0aW9uTW9kZVxuXHRcdFx0KTtcblx0XHRcdGNvbHVtbi5pc0dyb3VwYWJsZSA9IGZhbHNlO1xuXHRcdFx0cmVsYXRlZENvbHVtbnMucHVzaChjb2x1bW4pO1xuXHRcdH1cblx0fSk7XG5cdC8vIFRoZSBwcm9wZXJ0eSAnbmFtZScgaGFzIGJlZW4gcHJlZml4ZWQgd2l0aCAnUHJvcGVydHk6OicgZm9yIHVuaXF1ZW5lc3MuXG5cdC8vIFVwZGF0ZSB0aGUgc2FtZSBpbiBvdGhlciBwcm9wZXJ0eUluZm9zW10gcmVmZXJlbmNlcyB3aGljaCBwb2ludCB0byB0aGlzIHByb3BlcnR5LlxuXHRleGlzdGluZ0NvbHVtbnMuZm9yRWFjaCgoY29sdW1uKSA9PiB7XG5cdFx0Y29sdW1uLnByb3BlcnR5SW5mb3MgPSBjb2x1bW4ucHJvcGVydHlJbmZvcz8ubWFwKChwcm9wZXJ0eUluZm8pID0+IHJlbGF0ZWRQcm9wZXJ0eU5hbWVNYXBbcHJvcGVydHlJbmZvXSA/PyBwcm9wZXJ0eUluZm8pO1xuXHRcdGNvbHVtbi5hZGRpdGlvbmFsUHJvcGVydHlJbmZvcyA9IGNvbHVtbi5hZGRpdGlvbmFsUHJvcGVydHlJbmZvcz8ubWFwKFxuXHRcdFx0KHByb3BlcnR5SW5mbykgPT4gcmVsYXRlZFByb3BlcnR5TmFtZU1hcFtwcm9wZXJ0eUluZm9dID8/IHByb3BlcnR5SW5mb1xuXHRcdCk7XG5cdH0pO1xuXHRyZXR1cm4gcmVsYXRlZENvbHVtbnM7XG59O1xuLyoqXG4gKiBHZXR0aW5nIHRoZSBDb2x1bW4gTmFtZVxuICogSWYgaXQgcG9pbnRzIHRvIGEgRGF0YUZpZWxkIHdpdGggb25lIHByb3BlcnR5IG9yIERhdGFQb2ludCB3aXRoIG9uZSBwcm9wZXJ0eSwgaXQgd2lsbCB1c2UgdGhlIHByb3BlcnR5IG5hbWVcbiAqIGhlcmUgdG8gYmUgY29uc2lzdGVudCB3aXRoIHRoZSBleGlzdGluZyBmbGV4IGNoYW5nZXMuXG4gKiBAcGFyYW0gZGF0YUZpZWxkIERpZmZlcmVudCBEYXRhRmllbGQgdHlwZXMgZGVmaW5lZCBpbiB0aGUgYW5ub3RhdGlvbnNcbiAqIEByZXR1cm5zIFRoZSBuYW1lIG9mIGFubm90YXRpb24gY29sdW1uc1xuICovXG5jb25zdCBfZ2V0QW5ub3RhdGlvbkNvbHVtbk5hbWUgPSBmdW5jdGlvbiAoZGF0YUZpZWxkOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzKTogc3RyaW5nIHtcblx0Ly8gVGhpcyBpcyBuZWVkZWQgYXMgd2UgaGF2ZSBmbGV4aWJpbGl0eSBjaGFuZ2VzIGFscmVhZHkgdGhhdCB3ZSBoYXZlIHRvIGNoZWNrIGFnYWluc3Rcblx0aWYgKGlzRGF0YUZpZWxkVHlwZXMoZGF0YUZpZWxkKSAmJiBkYXRhRmllbGQuVmFsdWU/LnBhdGgpIHtcblx0XHRyZXR1cm4gZGF0YUZpZWxkLlZhbHVlPy5wYXRoO1xuXHR9IGVsc2UgaWYgKGRhdGFGaWVsZC4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQW5ub3RhdGlvbiAmJiAoZGF0YUZpZWxkLlRhcmdldD8uJHRhcmdldCBhcyBEYXRhUG9pbnQpPy5WYWx1ZT8ucGF0aCkge1xuXHRcdC8vIFRoaXMgaXMgZm9yIHJlbW92aW5nIGR1cGxpY2F0ZSBwcm9wZXJ0aWVzLiBGb3IgZXhhbXBsZSwgJ1Byb2dyZXNzJyBQcm9wZXJ0eSBpcyByZW1vdmVkIGlmIGl0IGlzIGFscmVhZHkgZGVmaW5lZCBhcyBhIERhdGFQb2ludFxuXHRcdHJldHVybiAoZGF0YUZpZWxkLlRhcmdldD8uJHRhcmdldCBhcyBEYXRhUG9pbnQpPy5WYWx1ZS5wYXRoO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBLZXlIZWxwZXIuZ2VuZXJhdGVLZXlGcm9tRGF0YUZpZWxkKGRhdGFGaWVsZCk7XG5cdH1cbn07XG4vKipcbiAqIENyZWF0ZXMgYSBQcm9wZXJ0eUluZm8gZm9yIHRoZSBpZGVudGlmaWVkIGFkZGl0aW9uYWwgcHJvcGVydHkgZm9yIHRoZSBBTFAgdGFibGUgdXNlLWNhc2UuXG4gKlxuICogRm9yIGUuZy4gSWYgVUkuSGlkZGVuIHBvaW50cyB0byBhIHByb3BlcnR5LCBpbmNsdWRlIHRoaXMgdGVjaG5pY2FsIHByb3BlcnR5IGluIHRoZSBhZGRpdGlvbmFsUHJvcGVydGllcyBvZiBDb21wbGV4UHJvcGVydHlJbmZvIG9iamVjdC5cbiAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBiZSBjcmVhdGVkLlxuICogQHBhcmFtIGNvbHVtbnMgVGhlIGxpc3Qgb2YgY29sdW1ucyBjcmVhdGVkIGZvciBMaW5lSXRlbXMgYW5kIFByb3BlcnRpZXMgb2YgZW50aXR5VHlwZSBmcm9tIHRoZSB0YWJsZSB2aXN1YWxpemF0aW9uLlxuICogQHBhcmFtIHJlbGF0ZWRBZGRpdGlvbmFsUHJvcGVydHlOYW1lTWFwXG4gKi9cbmNvbnN0IGNyZWF0ZVRlY2huaWNhbFByb3BlcnR5ID0gZnVuY3Rpb24gKFxuXHRuYW1lOiBzdHJpbmcsXG5cdGNvbHVtbnM6IFRhYmxlQ29sdW1uW10sXG5cdHJlbGF0ZWRBZGRpdGlvbmFsUHJvcGVydHlOYW1lTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4pOiB2b2lkIHtcblx0Y29uc3Qga2V5ID0gYFByb3BlcnR5X1RlY2huaWNhbDo6JHtuYW1lfWA7XG5cdC8vIFZhbGlkYXRlIGlmIHRoZSB0ZWNobmljYWwgcHJvcGVydHkgaGFzbid0IHlldCBiZWVuIGNyZWF0ZWQgb24gcHJldmlvdXMgaXRlcmF0aW9ucy5cblx0Y29uc3QgY29sdW1uRXhpc3RzID0gY29sdW1ucy5maW5kKChjb2x1bW4pID0+IGNvbHVtbi5rZXkgPT09IGtleSk7XG5cdC8vIFJldHJpZXZlIHRoZSBzaW1wbGUgcHJvcGVydHkgdXNlZCBieSB0aGUgaGlkZGVuIGFubm90YXRpb24sIGl0IHdpbGwgYmUgdXNlZCBhcyBhIGJhc2UgZm9yIHRoZSBtYW5kYXRvcnkgYXR0cmlidXRlcyBvZiBuZXdseSBjcmVhdGVkIHRlY2huaWNhbCBwcm9wZXJ0eS4gRm9yIGUuZy4gcmVsYXRpdmVQYXRoXG5cdGNvbnN0IGFkZGl0aW9uYWxQcm9wZXJ0eSA9XG5cdFx0IWNvbHVtbkV4aXN0cyAmJiAoY29sdW1ucy5maW5kKChjb2x1bW4pID0+IGNvbHVtbi5uYW1lID09PSBuYW1lICYmICFjb2x1bW4ucHJvcGVydHlJbmZvcykgYXMgQW5ub3RhdGlvblRhYmxlQ29sdW1uKSE7XG5cdGlmIChhZGRpdGlvbmFsUHJvcGVydHkpIHtcblx0XHRjb25zdCB0ZWNobmljYWxDb2x1bW46IFRlY2huaWNhbENvbHVtbiA9IHtcblx0XHRcdGtleToga2V5LFxuXHRcdFx0dHlwZTogQ29sdW1uVHlwZS5Bbm5vdGF0aW9uLFxuXHRcdFx0bGFiZWw6IGFkZGl0aW9uYWxQcm9wZXJ0eS5sYWJlbCxcblx0XHRcdGFubm90YXRpb25QYXRoOiBhZGRpdGlvbmFsUHJvcGVydHkuYW5ub3RhdGlvblBhdGgsXG5cdFx0XHRhdmFpbGFiaWxpdHk6IFwiSGlkZGVuXCIsXG5cdFx0XHRuYW1lOiBrZXksXG5cdFx0XHRyZWxhdGl2ZVBhdGg6IGFkZGl0aW9uYWxQcm9wZXJ0eS5yZWxhdGl2ZVBhdGgsXG5cdFx0XHRzb3J0YWJsZTogZmFsc2UsXG5cdFx0XHRpc0dyb3VwYWJsZTogZmFsc2UsXG5cdFx0XHRpc0tleTogZmFsc2UsXG5cdFx0XHRleHBvcnRTZXR0aW5nczogbnVsbCxcblx0XHRcdGNhc2VTZW5zaXRpdmU6IGZhbHNlLFxuXHRcdFx0YWdncmVnYXRhYmxlOiBmYWxzZSxcblx0XHRcdGZpbHRlcmFibGU6IGZhbHNlLFxuXHRcdFx0ZXh0ZW5zaW9uOiB7XG5cdFx0XHRcdHRlY2huaWNhbGx5R3JvdXBhYmxlOiB0cnVlLFxuXHRcdFx0XHR0ZWNobmljYWxseUFnZ3JlZ2F0YWJsZTogdHJ1ZVxuXHRcdFx0fVxuXHRcdH07XG5cdFx0Y29sdW1ucy5wdXNoKHRlY2huaWNhbENvbHVtbik7XG5cdFx0cmVsYXRlZEFkZGl0aW9uYWxQcm9wZXJ0eU5hbWVNYXBbbmFtZV0gPSB0ZWNobmljYWxDb2x1bW4ubmFtZTtcblx0fVxufTtcbi8qKlxuICogRGV0ZXJtaW5lcyBpZiB0aGUgZGF0YSBmaWVsZCBsYWJlbHMgaGF2ZSB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIHRhYmxlLlxuICogQHBhcmFtIGZpZWxkR3JvdXBOYW1lIFRoZSBgRGF0YUZpZWxkYCBuYW1lIGJlaW5nIHByb2Nlc3NlZC5cbiAqIEBwYXJhbSB2aXN1YWxpemF0aW9uUGF0aFxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHRcbiAqIEByZXR1cm5zIGBzaG93RGF0YUZpZWxkc0xhYmVsYCB2YWx1ZSBmcm9tIHRoZSBtYW5pZmVzdFxuICovXG5jb25zdCBfZ2V0U2hvd0RhdGFGaWVsZHNMYWJlbCA9IGZ1bmN0aW9uIChcblx0ZmllbGRHcm91cE5hbWU6IHN0cmluZyxcblx0dmlzdWFsaXphdGlvblBhdGg6IHN0cmluZyxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+XG4pOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcblx0Y29uc3QgY29sdW1ucyA9IGNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RDb250cm9sQ29uZmlndXJhdGlvbjxUYWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbj4odmlzdWFsaXphdGlvblBhdGgpPy5jb2x1bW5zO1xuXHRjb25zdCBjb2x1bW5LZXlzID0gY29sdW1ucyAmJiBPYmplY3Qua2V5cyhjb2x1bW5zKTtcblx0cmV0dXJuIChcblx0XHRjb2x1bW5LZXlzICYmXG5cdFx0ISFjb2x1bW5LZXlzLmZpbmQoZnVuY3Rpb24gKGtleTogc3RyaW5nKSB7XG5cdFx0XHRyZXR1cm4ga2V5ID09PSBmaWVsZEdyb3VwTmFtZSAmJiAoY29sdW1uc1trZXldIGFzIEN1c3RvbURlZmluZWRUYWJsZUNvbHVtbkZvck92ZXJyaWRlKS5zaG93RGF0YUZpZWxkc0xhYmVsO1xuXHRcdH0pXG5cdCk7XG59O1xuLyoqXG4gKiBEZXRlcm1pbmVzIHRoZSByZWxhdGl2ZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB3aXRoIHJlc3BlY3QgdG8gdGhlIHJvb3QgZW50aXR5LlxuICogQHBhcmFtIGRhdGFGaWVsZCBUaGUgYERhdGFGaWVsZGAgYmVpbmcgcHJvY2Vzc2VkLlxuICogQHJldHVybnMgVGhlIHJlbGF0aXZlIHBhdGhcbiAqL1xuY29uc3QgX2dldFJlbGF0aXZlUGF0aCA9IGZ1bmN0aW9uIChkYXRhRmllbGQ6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMpOiBzdHJpbmcge1xuXHRsZXQgcmVsYXRpdmVQYXRoID0gXCJcIjtcblx0c3dpdGNoIChkYXRhRmllbGQuJFR5cGUpIHtcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZDpcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhOYXZpZ2F0aW9uUGF0aDpcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhVcmw6XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoSW50ZW50QmFzZWROYXZpZ2F0aW9uOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aEFjdGlvbjpcblx0XHRcdHJlbGF0aXZlUGF0aCA9IChkYXRhRmllbGQgYXMgRGF0YUZpZWxkKT8uVmFsdWU/LnBhdGg7XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFubm90YXRpb246XG5cdFx0XHRyZWxhdGl2ZVBhdGggPSBkYXRhRmllbGQ/LlRhcmdldD8udmFsdWU7XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFjdGlvbjpcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbjpcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFjdGlvbkdyb3VwOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aEFjdGlvbkdyb3VwOlxuXHRcdFx0cmVsYXRpdmVQYXRoID0gS2V5SGVscGVyLmdlbmVyYXRlS2V5RnJvbURhdGFGaWVsZChkYXRhRmllbGQpO1xuXHRcdFx0YnJlYWs7XG5cdH1cblx0cmV0dXJuIHJlbGF0aXZlUGF0aDtcbn07XG5jb25zdCBfc2xpY2VBdFNsYXNoID0gZnVuY3Rpb24gKHBhdGg6IHN0cmluZywgaXNMYXN0U2xhc2g6IGJvb2xlYW4sIGlzTGFzdFBhcnQ6IGJvb2xlYW4pOiBzdHJpbmcge1xuXHRjb25zdCBpU2xhc2hJbmRleCA9IGlzTGFzdFNsYXNoID8gcGF0aC5sYXN0SW5kZXhPZihcIi9cIikgOiBwYXRoLmluZGV4T2YoXCIvXCIpO1xuXHRpZiAoaVNsYXNoSW5kZXggPT09IC0xKSB7XG5cdFx0cmV0dXJuIHBhdGg7XG5cdH1cblx0cmV0dXJuIGlzTGFzdFBhcnQgPyBwYXRoLnN1YnN0cmluZyhpU2xhc2hJbmRleCArIDEsIHBhdGgubGVuZ3RoKSA6IHBhdGguc3Vic3RyaW5nKDAsIGlTbGFzaEluZGV4KTtcbn07XG4vKipcbiAqIERldGVybWluZXMgaWYgdGhlIGNvbHVtbiBjb250YWlucyBhIG11bHRpLXZhbHVlIGZpZWxkLlxuICogQHBhcmFtIGRhdGFGaWVsZCBUaGUgRGF0YUZpZWxkIGJlaW5nIHByb2Nlc3NlZFxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGNvbnZlcnRlciBjb250ZXh0XG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBEYXRhRmllbGQgY29ycmVzcG9uZHMgdG8gYSBtdWx0aS12YWx1ZSBmaWVsZC5cbiAqL1xuY29uc3QgX2lzQ29sdW1uTXVsdGlWYWx1ZWQgPSBmdW5jdGlvbiAoXG5cdGRhdGFGaWVsZDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+XG4pOiBib29sZWFuIHtcblx0aWYgKGlzRGF0YUZpZWxkVHlwZXMoZGF0YUZpZWxkKSAmJiBpc1BhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbihkYXRhRmllbGQuVmFsdWUpKSB7XG5cdFx0Y29uc3QgcHJvcGVydHlPYmplY3RQYXRoID0gZW5oYW5jZURhdGFNb2RlbFBhdGg8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pihcblx0XHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpLFxuXHRcdFx0ZGF0YUZpZWxkLlZhbHVlLnBhdGhcblx0XHQpO1xuXHRcdHJldHVybiBpc011bHRpVmFsdWVGaWVsZChwcm9wZXJ0eU9iamVjdFBhdGgpO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxufTtcbi8qKlxuICogRGV0ZXJtaW5lIHdoZXRoZXIgYSBjb2x1bW4gaXMgc29ydGFibGUuXG4gKiBAcGFyYW0gZGF0YUZpZWxkIFRoZSBkYXRhIGZpZWxkIGJlaW5nIHByb2Nlc3NlZFxuICogQHBhcmFtIHByb3BlcnR5UGF0aCBUaGUgcHJvcGVydHkgcGF0aFxuICogQHBhcmFtIG5vblNvcnRhYmxlQ29sdW1ucyBDb2xsZWN0aW9uIG9mIG5vbi1zb3J0YWJsZSBjb2x1bW4gbmFtZXMgYXMgcGVyIGFubm90YXRpb25cbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGNvbHVtbiBpcyBzb3J0YWJsZVxuICovXG5jb25zdCBfaXNDb2x1bW5Tb3J0YWJsZSA9IGZ1bmN0aW9uIChkYXRhRmllbGQ6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMsIHByb3BlcnR5UGF0aDogc3RyaW5nLCBub25Tb3J0YWJsZUNvbHVtbnM6IHN0cmluZ1tdKTogYm9vbGVhbiB7XG5cdHJldHVybiAoXG5cdFx0IW5vblNvcnRhYmxlQ29sdW1ucy5pbmNsdWRlcyhwcm9wZXJ0eVBhdGgpICYmIC8vIENvbHVtbiBpcyBub3QgbWFya2VkIGFzIG5vbi1zb3J0YWJsZSB2aWEgYW5ub3RhdGlvblxuXHRcdChkYXRhRmllbGQuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZCB8fFxuXHRcdFx0ZGF0YUZpZWxkLiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoVXJsIHx8XG5cdFx0XHRkYXRhRmllbGQuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhJbnRlbnRCYXNlZE5hdmlnYXRpb24gfHxcblx0XHRcdGRhdGFGaWVsZC4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aEFjdGlvbilcblx0KTtcbn07XG4vKipcbiAqIFJldHVybnMgd2hldGhlciBmaWx0ZXJpbmcgb24gdGhlIHRhYmxlIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGluc3RhbmNlIG9mIHRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHJldHVybnMgUmV0dXJucyAnZmFsc2UnIGlmIEZpbHRlckZ1bmN0aW9ucyBhbm5vdGF0aW9uIHN1cHBvcnRzICd0b2xvd2VyJywgZWxzZSAndHJ1ZSdcbiAqL1xuZXhwb3J0IGNvbnN0IGlzRmlsdGVyaW5nQ2FzZVNlbnNpdGl2ZSA9IGZ1bmN0aW9uIChjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4pOiBib29sZWFuIHtcblx0Y29uc3QgZmlsdGVyRnVuY3Rpb25zOiBGaWx0ZXJGdW5jdGlvbnMgfCB1bmRlZmluZWQgPSBfZ2V0RmlsdGVyRnVuY3Rpb25zKGNvbnZlcnRlckNvbnRleHQpO1xuXHRyZXR1cm4gQXJyYXkuaXNBcnJheShmaWx0ZXJGdW5jdGlvbnMpID8gIShmaWx0ZXJGdW5jdGlvbnMgYXMgU3RyaW5nW10pLmluY2x1ZGVzKFwidG9sb3dlclwiKSA6IHRydWU7XG59O1xuZnVuY3Rpb24gX2dldEZpbHRlckZ1bmN0aW9ucyhDb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4pOiBGaWx0ZXJGdW5jdGlvbnMgfCB1bmRlZmluZWQge1xuXHRjb25zdCBlbnRpdHlTZXQgPSBDb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVNldCgpO1xuXHRpZiAoVHlwZUd1YXJkcy5pc0VudGl0eVNldChlbnRpdHlTZXQpKSB7XG5cdFx0cmV0dXJuIChcblx0XHRcdGVudGl0eVNldC5hbm5vdGF0aW9ucy5DYXBhYmlsaXRpZXM/LkZpbHRlckZ1bmN0aW9ucyA/P1xuXHRcdFx0Q29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlDb250YWluZXIoKS5hbm5vdGF0aW9ucy5DYXBhYmlsaXRpZXM/LkZpbHRlckZ1bmN0aW9uc1xuXHRcdCk7XG5cdH1cblx0cmV0dXJuIHVuZGVmaW5lZDtcbn1cbi8qKlxuICogUmV0dXJucyBkZWZhdWx0IGZvcm1hdCBvcHRpb25zIGZvciB0ZXh0IGZpZWxkcyBpbiBhIHRhYmxlLlxuICogQHBhcmFtIGZvcm1hdE9wdGlvbnNcbiAqIEByZXR1cm5zIENvbGxlY3Rpb24gb2YgZm9ybWF0IG9wdGlvbnMgd2l0aCBkZWZhdWx0IHZhbHVlc1xuICovXG5mdW5jdGlvbiBfZ2V0RGVmYXVsdEZvcm1hdE9wdGlvbnNGb3JUYWJsZShmb3JtYXRPcHRpb25zOiBGb3JtYXRPcHRpb25zVHlwZSB8IHVuZGVmaW5lZCk6IEZvcm1hdE9wdGlvbnNUeXBlIHwgdW5kZWZpbmVkIHtcblx0cmV0dXJuIGZvcm1hdE9wdGlvbnMgPT09IHVuZGVmaW5lZFxuXHRcdD8gdW5kZWZpbmVkXG5cdFx0OiB7XG5cdFx0XHRcdHRleHRMaW5lc0VkaXQ6IDQsXG5cdFx0XHRcdC4uLmZvcm1hdE9wdGlvbnNcblx0XHQgIH07XG59XG5mdW5jdGlvbiBfZmluZFNlbWFudGljS2V5VmFsdWVzKHNlbWFudGljS2V5czogU2VtYW50aWNLZXksIG5hbWU6IHN0cmluZyk6IHsgdmFsdWVzOiBzdHJpbmdbXTsgc2VtYW50aWNLZXlGb3VuZDogYm9vbGVhbiB9IHtcblx0Y29uc3QgYVNlbWFudGljS2V5VmFsdWVzOiBzdHJpbmdbXSA9IFtdO1xuXHRsZXQgYlNlbWFudGljS2V5Rm91bmQgPSBmYWxzZTtcblx0Zm9yIChsZXQgaSA9IDA7IGkgPCBzZW1hbnRpY0tleXMubGVuZ3RoOyBpKyspIHtcblx0XHRhU2VtYW50aWNLZXlWYWx1ZXMucHVzaChzZW1hbnRpY0tleXNbaV0udmFsdWUpO1xuXHRcdGlmIChzZW1hbnRpY0tleXNbaV0udmFsdWUgPT09IG5hbWUpIHtcblx0XHRcdGJTZW1hbnRpY0tleUZvdW5kID0gdHJ1ZTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIHtcblx0XHR2YWx1ZXM6IGFTZW1hbnRpY0tleVZhbHVlcyxcblx0XHRzZW1hbnRpY0tleUZvdW5kOiBiU2VtYW50aWNLZXlGb3VuZFxuXHR9O1xufVxuZnVuY3Rpb24gX2ZpbmRQcm9wZXJ0aWVzKFxuXHRzZW1hbnRpY0tleVZhbHVlczogc3RyaW5nW10sXG5cdGZpZWxkR3JvdXBQcm9wZXJ0aWVzOiBzdHJpbmdbXVxuKTogeyBzZW1hbnRpY0tleUhhc1Byb3BlcnR5SW5GaWVsZEdyb3VwOiBib29sZWFuOyBmaWVsZEdyb3VwUHJvcGVydHlQYXRoPzogc3RyaW5nIH0ge1xuXHRsZXQgc2VtYW50aWNLZXlIYXNQcm9wZXJ0eUluRmllbGRHcm91cCA9IGZhbHNlO1xuXHRsZXQgc1Byb3BlcnR5UGF0aDtcblx0aWYgKHNlbWFudGljS2V5VmFsdWVzICYmIHNlbWFudGljS2V5VmFsdWVzLmxlbmd0aCA+PSAxICYmIGZpZWxkR3JvdXBQcm9wZXJ0aWVzICYmIGZpZWxkR3JvdXBQcm9wZXJ0aWVzLmxlbmd0aCA+PSAxKSB7XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBzZW1hbnRpY0tleVZhbHVlcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0aWYgKFtzZW1hbnRpY0tleVZhbHVlc1tpXV0uc29tZSgodG1wKSA9PiBmaWVsZEdyb3VwUHJvcGVydGllcy5pbmNsdWRlcyh0bXApKSkge1xuXHRcdFx0XHRzZW1hbnRpY0tleUhhc1Byb3BlcnR5SW5GaWVsZEdyb3VwID0gdHJ1ZTtcblx0XHRcdFx0c1Byb3BlcnR5UGF0aCA9IHNlbWFudGljS2V5VmFsdWVzW2ldO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0cmV0dXJuIHtcblx0XHRzZW1hbnRpY0tleUhhc1Byb3BlcnR5SW5GaWVsZEdyb3VwOiBzZW1hbnRpY0tleUhhc1Byb3BlcnR5SW5GaWVsZEdyb3VwLFxuXHRcdGZpZWxkR3JvdXBQcm9wZXJ0eVBhdGg6IHNQcm9wZXJ0eVBhdGhcblx0fTtcbn1cbi8qKlxuICogRmluZCB0aGUgZmlyc3QgcHJvcGVydHkgaW4gdGhlIGZpZWxkR3JvdXAgdGhhdCBpcyBwYXJ0IG9mIHRoZSBzZW1hbnRpYyBrZXlzLlxuICogQHBhcmFtIGRhdGFGaWVsZEdyb3VwXG4gKiBAcGFyYW0gc2VtYW50aWNLZXlWYWx1ZXNcbiAqIEByZXR1cm5zIEFuIG9iamVjdCBjb250YWluaW5nIGEgZmxhZyB0cnVlIGlmIGEgcHJvcGVydHkgaXMgZm91bmQgYW5kIGEgcHJvcGVydHlQYXRoLlxuICovXG5mdW5jdGlvbiBfZmluZFNlbWFudGljS2V5VmFsdWVzSW5GaWVsZEdyb3VwKFxuXHRkYXRhRmllbGRHcm91cDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyB8IG51bGwsXG5cdHNlbWFudGljS2V5VmFsdWVzOiBzdHJpbmdbXVxuKTogeyBzZW1hbnRpY0tleUhhc1Byb3BlcnR5SW5GaWVsZEdyb3VwOiBib29sZWFuOyBwcm9wZXJ0eVBhdGg/OiBzdHJpbmcgfSB7XG5cdC8vIHRoaXMgaW5mbyBpcyB1c2VkIGluIEZpZWxkSGVscGVyI2lzRHJhZnRJbmRpY2F0b3JWaXNpYmxlSW5GaWVsZEdyb3VwIHRvIHNob3cgYSBkcmFmdCBpbmRpY2F0b3IgYXQgdGhlIGVuZCBvZiBhIGZpZWxkIGdyb3VwXG5cdGNvbnN0IGFQcm9wZXJ0aWVzOiBzdHJpbmdbXSA9IFtdO1xuXHRsZXQgX3Byb3BlcnRpZXNGb3VuZDogeyBzZW1hbnRpY0tleUhhc1Byb3BlcnR5SW5GaWVsZEdyb3VwOiBib29sZWFuOyBmaWVsZEdyb3VwUHJvcGVydHlQYXRoPzogc3RyaW5nIH0gPSB7XG5cdFx0c2VtYW50aWNLZXlIYXNQcm9wZXJ0eUluRmllbGRHcm91cDogZmFsc2UsXG5cdFx0ZmllbGRHcm91cFByb3BlcnR5UGF0aDogdW5kZWZpbmVkXG5cdH07XG5cdGlmIChcblx0XHRkYXRhRmllbGRHcm91cCAmJlxuXHRcdGRhdGFGaWVsZEdyb3VwLiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBbm5vdGF0aW9uICYmXG5cdFx0ZGF0YUZpZWxkR3JvdXAuVGFyZ2V0Py4kdGFyZ2V0Py4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRmllbGRHcm91cFR5cGVcblx0KSB7XG5cdFx0ZGF0YUZpZWxkR3JvdXAuVGFyZ2V0LiR0YXJnZXQuRGF0YT8uZm9yRWFjaCgoaW5uZXJEYXRhRmllbGQ6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMpID0+IHtcblx0XHRcdGlmIChcblx0XHRcdFx0KGlubmVyRGF0YUZpZWxkLiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGQgfHwgaW5uZXJEYXRhRmllbGQuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhVcmwpICYmXG5cdFx0XHRcdGlubmVyRGF0YUZpZWxkLlZhbHVlXG5cdFx0XHQpIHtcblx0XHRcdFx0YVByb3BlcnRpZXMucHVzaChpbm5lckRhdGFGaWVsZC5WYWx1ZS5wYXRoKTtcblx0XHRcdH1cblx0XHRcdF9wcm9wZXJ0aWVzRm91bmQgPSBfZmluZFByb3BlcnRpZXMoc2VtYW50aWNLZXlWYWx1ZXMsIGFQcm9wZXJ0aWVzKTtcblx0XHR9KTtcblx0fVxuXHRyZXR1cm4ge1xuXHRcdHNlbWFudGljS2V5SGFzUHJvcGVydHlJbkZpZWxkR3JvdXA6IF9wcm9wZXJ0aWVzRm91bmQuc2VtYW50aWNLZXlIYXNQcm9wZXJ0eUluRmllbGRHcm91cCxcblx0XHRwcm9wZXJ0eVBhdGg6IF9wcm9wZXJ0aWVzRm91bmQuZmllbGRHcm91cFByb3BlcnR5UGF0aFxuXHR9O1xufVxuLyoqXG4gKiBSZXR1cm5zIGRlZmF1bHQgZm9ybWF0IG9wdGlvbnMgd2l0aCBkcmFmdEluZGljYXRvciBmb3IgYSBjb2x1bW4uXG4gKiBAcGFyYW0gbmFtZVxuICogQHBhcmFtIHNlbWFudGljS2V5c1xuICogQHBhcmFtIGRhdGFGaWVsZEdyb3VwXG4gKiBAcmV0dXJucyBDb2xsZWN0aW9uIG9mIGZvcm1hdCBvcHRpb25zIHdpdGggZGVmYXVsdCB2YWx1ZXNcbiAqL1xuZnVuY3Rpb24gZ2V0RGVmYXVsdERyYWZ0SW5kaWNhdG9yRm9yQ29sdW1uKFxuXHRuYW1lOiBzdHJpbmcsXG5cdHNlbWFudGljS2V5czogU2VtYW50aWNLZXksXG5cdGRhdGFGaWVsZEdyb3VwOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzIHwgbnVsbFxuKTogUGFydGlhbDx7XG5cdGZpZWxkR3JvdXBEcmFmdEluZGljYXRvclByb3BlcnR5UGF0aDogc3RyaW5nO1xuXHRmaWVsZEdyb3VwTmFtZTogc3RyaW5nO1xuXHRzaG93RXJyb3JPYmplY3RTdGF0dXM6IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uO1xuXHRoYXNEcmFmdEluZGljYXRvcjogYm9vbGVhbjtcbn0+IHtcblx0aWYgKCFzZW1hbnRpY0tleXMpIHtcblx0XHRyZXR1cm4ge307XG5cdH1cblx0Y29uc3Qgc2VtYW50aWNLZXkgPSBfZmluZFNlbWFudGljS2V5VmFsdWVzKHNlbWFudGljS2V5cywgbmFtZSk7XG5cdGNvbnN0IHNlbWFudGljS2V5SW5GaWVsZEdyb3VwID0gX2ZpbmRTZW1hbnRpY0tleVZhbHVlc0luRmllbGRHcm91cChkYXRhRmllbGRHcm91cCwgc2VtYW50aWNLZXkudmFsdWVzKTtcblx0aWYgKHNlbWFudGljS2V5SW5GaWVsZEdyb3VwLnNlbWFudGljS2V5SGFzUHJvcGVydHlJbkZpZWxkR3JvdXApIHtcblx0XHQvLyBTZW1hbnRpYyBLZXkgaGFzIGEgcHJvcGVydHkgaW4gYSBGaWVsZEdyb3VwXG5cdFx0cmV0dXJuIHtcblx0XHRcdC8vVE9ETyB3ZSBzaG91bGQgcmF0aGVyIHN0b3JlIGhhc1NlbWFudGljS2V5SW5GaWVsZEdyb3VwXG5cdFx0XHRmaWVsZEdyb3VwRHJhZnRJbmRpY2F0b3JQcm9wZXJ0eVBhdGg6IHNlbWFudGljS2V5SW5GaWVsZEdyb3VwLnByb3BlcnR5UGF0aCxcblx0XHRcdGZpZWxkR3JvdXBOYW1lOiBuYW1lLFxuXHRcdFx0c2hvd0Vycm9yT2JqZWN0U3RhdHVzOiBjb21waWxlRXhwcmVzc2lvbihnZXRSb3dTdGF0dXNWaXNpYmlsaXR5KG5hbWUsIHRydWUpKVxuXHRcdH07XG5cdH0gZWxzZSBpZiAoc2VtYW50aWNLZXkuc2VtYW50aWNLZXlGb3VuZCkge1xuXHRcdHJldHVybiB7XG5cdFx0XHRoYXNEcmFmdEluZGljYXRvcjogdHJ1ZSxcblx0XHRcdHNob3dFcnJvck9iamVjdFN0YXR1czogY29tcGlsZUV4cHJlc3Npb24oZ2V0Um93U3RhdHVzVmlzaWJpbGl0eShuYW1lLCBmYWxzZSkpXG5cdFx0fTtcblx0fVxuXHRyZXR1cm4ge307XG59XG5mdW5jdGlvbiBfZ2V0SW1wTnVtYmVyKGRhdGFGaWVsZDogRGF0YUZpZWxkVHlwZXMpOiBudW1iZXIge1xuXHRjb25zdCBpbXBvcnRhbmNlID0gZGF0YUZpZWxkPy5hbm5vdGF0aW9ucz8uVUk/LkltcG9ydGFuY2UgYXMgc3RyaW5nO1xuXHRpZiAoaW1wb3J0YW5jZSAmJiBpbXBvcnRhbmNlLmluY2x1ZGVzKFwiVUkuSW1wb3J0YW5jZVR5cGUvSGlnaFwiKSkge1xuXHRcdHJldHVybiAzO1xuXHR9XG5cdGlmIChpbXBvcnRhbmNlICYmIGltcG9ydGFuY2UuaW5jbHVkZXMoXCJVSS5JbXBvcnRhbmNlVHlwZS9NZWRpdW1cIikpIHtcblx0XHRyZXR1cm4gMjtcblx0fVxuXHRpZiAoaW1wb3J0YW5jZSAmJiBpbXBvcnRhbmNlLmluY2x1ZGVzKFwiVUkuSW1wb3J0YW5jZVR5cGUvTG93XCIpKSB7XG5cdFx0cmV0dXJuIDE7XG5cdH1cblx0cmV0dXJuIDA7XG59XG5mdW5jdGlvbiBfZ2V0RGF0YUZpZWxkSW1wb3J0YW5jZShkYXRhRmllbGQ6IERhdGFGaWVsZFR5cGVzKTogSW1wb3J0YW5jZSB7XG5cdGNvbnN0IGltcG9ydGFuY2UgPSBkYXRhRmllbGQ/LmFubm90YXRpb25zPy5VST8uSW1wb3J0YW5jZSBhcyBzdHJpbmc7XG5cdHJldHVybiBpbXBvcnRhbmNlID8gKGltcG9ydGFuY2Uuc3BsaXQoXCIvXCIpWzFdIGFzIEltcG9ydGFuY2UpIDogSW1wb3J0YW5jZS5Ob25lO1xufVxuLyoqXG4gKiBTZXRzIHRoZSBleHBvcnQgc2V0dGluZ3Mgb2YgYSBjb2x1bW4gY29udGFpbmluZyBkYXRhcG9pbnRzLlxuICogQHBhcmFtIHByb3BlcnR5IFRoZSBwcm9wZXJ0eSByZWZlcmVuY2VkIG9uIGEgZ2l2ZW4gY29sdW1uXG4gKiBAcGFyYW0gY29sdW1uIFRoZSBjb2x1bW4gdG8gYmUgdXBkYXRlZFxuICovXG5cbmZ1bmN0aW9uIF9zZXRFeHBvcnRTZXR0aW5nc0ZvckRhdGFQb2ludChwcm9wZXJ0eTogUHJvcGVydHksIGNvbHVtbjogQW5ub3RhdGlvblRhYmxlQ29sdW1uKTogdm9pZCB7XG5cdGNvbnN0IHRhcmdldFZhbHVlZnJvbURQID0gZ2V0VGFyZ2V0VmFsdWVPbkRhdGFQb2ludChwcm9wZXJ0eSk7XG5cdGlmIChcblx0XHRpc0RhdGFQb2ludEZyb21EYXRhRmllbGREZWZhdWx0KHByb3BlcnR5KSAmJlxuXHRcdHR5cGVvZiB0YXJnZXRWYWx1ZWZyb21EUCA9PT0gXCJzdHJpbmdcIiAmJlxuXHRcdGNvbHVtbi5leHBvcnRTZXR0aW5ncyAmJlxuXHRcdGNvbHVtbi5leHBvcnRTZXR0aW5ncz8udW5pdCAhPT0gXCIlXCJcblx0KSB7XG5cdFx0Y29sdW1uLmV4cG9ydERhdGFQb2ludFRhcmdldFZhbHVlID0gdGFyZ2V0VmFsdWVmcm9tRFA7XG5cdFx0Y29sdW1uLmV4cG9ydFNldHRpbmdzLnRlbXBsYXRlID0gXCJ7MH0vXCIgKyB0YXJnZXRWYWx1ZWZyb21EUDtcblx0fVxufVxuXG5mdW5jdGlvbiBfZ2V0TWF4SW1wb3J0YW5jZShmaWVsZHM6IERhdGFGaWVsZFR5cGVzW10pOiBJbXBvcnRhbmNlIHtcblx0aWYgKGZpZWxkcyAmJiBmaWVsZHMubGVuZ3RoID4gMCkge1xuXHRcdGxldCBtYXhJbXBOdW1iZXIgPSAtMTtcblx0XHRsZXQgaW1wTnVtYmVyID0gLTE7XG5cdFx0bGV0IERhdGFGaWVsZFdpdGhNYXhJbXBvcnRhbmNlO1xuXHRcdGZvciAoY29uc3QgZmllbGQgb2YgZmllbGRzKSB7XG5cdFx0XHRpbXBOdW1iZXIgPSBfZ2V0SW1wTnVtYmVyKGZpZWxkKTtcblx0XHRcdGlmIChpbXBOdW1iZXIgPiBtYXhJbXBOdW1iZXIpIHtcblx0XHRcdFx0bWF4SW1wTnVtYmVyID0gaW1wTnVtYmVyO1xuXHRcdFx0XHREYXRhRmllbGRXaXRoTWF4SW1wb3J0YW5jZSA9IGZpZWxkO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gX2dldERhdGFGaWVsZEltcG9ydGFuY2UoRGF0YUZpZWxkV2l0aE1heEltcG9ydGFuY2UgYXMgRGF0YUZpZWxkVHlwZXMpO1xuXHR9XG5cdHJldHVybiBJbXBvcnRhbmNlLk5vbmU7XG59XG4vKipcbiAqIFJldHVybnMgdGhlIGltcG9ydGFuY2UgdmFsdWUgZm9yIGEgY29sdW1uLlxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHRcbiAqIEBwYXJhbSBkYXRhRmllbGRcbiAqIEByZXR1cm5zIFRoZSBpbXBvcnRhbmNlIHZhbHVlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbXBvcnRhbmNlKFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sXG5cdGRhdGFGaWVsZDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyB8IHVuZGVmaW5lZFxuKTogSW1wb3J0YW5jZSB8IHVuZGVmaW5lZCB7XG5cdGlmICghZGF0YUZpZWxkKSB7XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxuXHRjb25zdCBzZW1hbnRpY0tleXMgPSBjb252ZXJ0ZXJDb250ZXh0LmdldERhdGFNb2RlbE9iamVjdFBhdGgoKS50YXJnZXRFbnRpdHlUeXBlLmFubm90YXRpb25zLkNvbW1vbj8uU2VtYW50aWNLZXkgPz8gW107XG5cdGNvbnN0IHJlcXVpcmVkUHJvcGVydGllcyA9IGdldFJlcXVpcmVkUHJvcGVydGllcyhjb252ZXJ0ZXJDb250ZXh0KTtcblx0Y29uc3QgaGlnaEtleXMgPSBbLi4uc2VtYW50aWNLZXlzLCAuLi5yZXF1aXJlZFByb3BlcnRpZXNdLm1hcCgocHJvcGVydHlQYXRoKSA9PiBwcm9wZXJ0eVBhdGguJHRhcmdldD8uZnVsbHlRdWFsaWZpZWROYW1lKTtcblx0Ly9FdmFsdWF0ZSBkZWZhdWx0IEltcG9ydGFuY2UgaXMgbm90IHNldCBleHBsaWNpdGx5XG5cdGxldCBmaWVsZHNXaXRoSW1wb3J0YW5jZTtcblx0aWYgKGlzQW5ub3RhdGlvbk9mVHlwZTxEYXRhRmllbGRGb3JBbm5vdGF0aW9uPihkYXRhRmllbGQsIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFubm90YXRpb24pKSB7XG5cdFx0Y29uc3QgZGF0YUZpZWxkVGFyZ2V0ID0gZGF0YUZpZWxkLlRhcmdldC4kdGFyZ2V0O1xuXHRcdGlmIChpc0Fubm90YXRpb25PZlR5cGU8RmllbGRHcm91cD4oZGF0YUZpZWxkVGFyZ2V0LCBVSUFubm90YXRpb25UeXBlcy5GaWVsZEdyb3VwVHlwZSkpIHtcblx0XHRcdGNvbnN0IGZpZWxkR3JvdXBEYXRhID0gZGF0YUZpZWxkVGFyZ2V0LkRhdGE7XG5cdFx0XHQvL0lmIGEgRmllbGRHcm91cCBjb250YWlucyBhIHNlbWFudGljS2V5IG9yIHJlcXVpcmVkIHByb3BlcnR5LCBpbXBvcnRhbmNlIHNldCB0byBIaWdoXG5cdFx0XHRpZiAoXG5cdFx0XHRcdGZpZWxkR3JvdXBEYXRhLnNvbWUoZnVuY3Rpb24gKGZpZWxkR3JvdXBEYXRhRmllbGQ6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMpOiBib29sZWFuIHtcblx0XHRcdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHRcdFx0aXNEYXRhRmllbGRUeXBlcyhmaWVsZEdyb3VwRGF0YUZpZWxkKSAmJiBoaWdoS2V5cy5pbmNsdWRlcyhmaWVsZEdyb3VwRGF0YUZpZWxkLlZhbHVlPy4kdGFyZ2V0Py5mdWxseVF1YWxpZmllZE5hbWUpXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fSlcblx0XHRcdCkge1xuXHRcdFx0XHRyZXR1cm4gSW1wb3J0YW5jZS5IaWdoO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ly9JZiB0aGUgRGF0YUZpZWxkRm9yQW5ub3RhdGlvbiBoYXMgYW4gSW1wb3J0YW5jZSB3ZSB0YWtlIGl0XG5cdFx0XHRcdGlmIChkYXRhRmllbGQ/LmFubm90YXRpb25zPy5VST8uSW1wb3J0YW5jZSkge1xuXHRcdFx0XHRcdHJldHVybiBfZ2V0RGF0YUZpZWxkSW1wb3J0YW5jZShkYXRhRmllbGQgYXMgdW5rbm93biBhcyBEYXRhRmllbGRUeXBlcyk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly8gZWxzZSB0aGUgaGlnaGVzdCBpbXBvcnRhbmNlIChpZiBhbnkpIGlzIHJldHVybmVkXG5cdFx0XHRcdGZpZWxkc1dpdGhJbXBvcnRhbmNlID0gZmllbGRHcm91cERhdGEuZmlsdGVyKGZ1bmN0aW9uIChpdGVtKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGl0ZW0/LmFubm90YXRpb25zPy5VST8uSW1wb3J0YW5jZTtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHJldHVybiBfZ2V0TWF4SW1wb3J0YW5jZShmaWVsZHNXaXRoSW1wb3J0YW5jZSBhcyBEYXRhRmllbGRUeXBlc1tdKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0cmV0dXJuIGhpZ2hLZXlzLmluY2x1ZGVzKChkYXRhRmllbGQgYXMgRGF0YUZpZWxkVHlwZXMpLlZhbHVlPy4kdGFyZ2V0Py5mdWxseVF1YWxpZmllZE5hbWUpXG5cdFx0PyBJbXBvcnRhbmNlLkhpZ2hcblx0XHQ6IF9nZXREYXRhRmllbGRJbXBvcnRhbmNlKGRhdGFGaWVsZCBhcyB1bmtub3duIGFzIERhdGFGaWVsZFR5cGVzKTtcbn1cbi8qKlxuICogUmV0dXJucyBsaW5lIGl0ZW1zIGZyb20gbWV0YWRhdGEgYW5ub3RhdGlvbnMuXG4gKiBAcGFyYW0gbGluZUl0ZW1Bbm5vdGF0aW9uIENvbGxlY3Rpb24gb2YgZGF0YSBmaWVsZHMgd2l0aCB0aGVpciBhbm5vdGF0aW9uc1xuICogQHBhcmFtIHZpc3VhbGl6YXRpb25QYXRoIFRoZSB2aXN1YWxpemF0aW9uIHBhdGhcbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHJldHVybnMgVGhlIGNvbHVtbnMgZnJvbSB0aGUgYW5ub3RhdGlvbnNcbiAqL1xuY29uc3QgZ2V0Q29sdW1uc0Zyb21Bbm5vdGF0aW9ucyA9IGZ1bmN0aW9uIChcblx0bGluZUl0ZW1Bbm5vdGF0aW9uOiBMaW5lSXRlbSxcblx0dmlzdWFsaXphdGlvblBhdGg6IHN0cmluZyxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+XG4pOiBBbm5vdGF0aW9uVGFibGVDb2x1bW5bXSB7XG5cdGNvbnN0IGVudGl0eVR5cGU6IEVudGl0eVR5cGUgPSBjb252ZXJ0ZXJDb250ZXh0LmdldEFubm90YXRpb25FbnRpdHlUeXBlKGxpbmVJdGVtQW5ub3RhdGlvbiksXG5cdFx0YW5ub3RhdGlvbkNvbHVtbnM6IEFubm90YXRpb25UYWJsZUNvbHVtbltdID0gW10sXG5cdFx0Y29sdW1uc1RvQmVDcmVhdGVkOiBSZWNvcmQ8c3RyaW5nLCBQcm9wZXJ0eT4gPSB7fSxcblx0XHRkaXNwbGF5TW9kZU9mRGVzY3JpcHRpb25Qcm9wZXJ0aWVzTWFwOiBSZWNvcmQ8c3RyaW5nLCBEaXNwbGF5TW9kZT4gPSB7fSxcblx0XHRyZXN0cmljdGlvbnNPblByb3BlcnRpZXMgPSBnZXRSZXN0cmljdGlvbnNPblByb3BlcnRpZXMoY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlTZXQoKSksXG5cdFx0dGFibGVNYW5pZmVzdFNldHRpbmdzOiBUYWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbiA9IGNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RDb250cm9sQ29uZmlndXJhdGlvbih2aXN1YWxpemF0aW9uUGF0aCksXG5cdFx0dGFibGVUeXBlID0gZ2V0VGFibGVUeXBlKGNvbnZlcnRlckNvbnRleHQsIHRhYmxlTWFuaWZlc3RTZXR0aW5ncyksXG5cdFx0ZGVmYXVsdENyZWF0aW9uTW9kZSA9XG5cdFx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0V3JhcHBlcigpLmdldFNhcEZlTWFuaWZlc3RDb25maWd1cmF0aW9uKCk/Lm1hY3Jvcz8udGFibGU/LmRlZmF1bHRDcmVhdGlvbk1vZGUgPT09XG5cdFx0XHRcIklubGluZUNyZWF0aW9uUm93c1wiXG5cdFx0XHRcdD8gQ3JlYXRpb25Nb2RlLklubGluZUNyZWF0aW9uUm93c1xuXHRcdFx0XHQ6IHVuZGVmaW5lZCxcblx0XHR0YWJsZUNyZWF0aW9uTW9kZTogQ3JlYXRpb25Nb2RlID1cblx0XHRcdHRhYmxlTWFuaWZlc3RTZXR0aW5ncz8udGFibGVTZXR0aW5ncz8uY3JlYXRpb25Nb2RlPy5uYW1lID8/IGRlZmF1bHRDcmVhdGlvbk1vZGUgPz8gQ3JlYXRpb25Nb2RlLklubGluZTtcblx0Y29uc3Qgc2VtYW50aWNLZXlzOiBTZW1hbnRpY0tleSA9IGNvbnZlcnRlckNvbnRleHQuZ2V0QW5ub3RhdGlvbnNCeVRlcm0oXCJDb21tb25cIiwgQ29tbW9uQW5ub3RhdGlvblRlcm1zLlNlbWFudGljS2V5LCBbXG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlUeXBlKClcblx0XSlbMF0gYXMgU2VtYW50aWNLZXk7XG5cdGlmIChsaW5lSXRlbUFubm90YXRpb24pIHtcblx0XHRjb25zdCB0YWJsZUNvbnZlcnRlckNvbnRleHQgPSBjb252ZXJ0ZXJDb250ZXh0LmdldENvbnZlcnRlckNvbnRleHRGb3I8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pihcblx0XHRcdGdldFRhcmdldE9iamVjdFBhdGgoY29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCkpXG5cdFx0KTtcblx0XHRsaW5lSXRlbUFubm90YXRpb24uZm9yRWFjaCgoZGF0YUZpZWxkKSA9PiB7XG5cdFx0XHQvLyBUT0RPOiB2YXJpYWJsZSBuYW1lIHNob3VsZCBiZSBkYXRhZmllbGQgYW5kIG5vdCBsaW5lSXRlbVxuXHRcdFx0aWYgKCFfaXNWYWxpZENvbHVtbihkYXRhRmllbGQpKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGxldCBleHBvcnRTZXR0aW5nczogQ29sdW1uRXhwb3J0U2V0dGluZ3MgfCBudWxsID0gbnVsbDtcblx0XHRcdGNvbnN0IHNlbWFudGljT2JqZWN0QW5ub3RhdGlvblBhdGggPVxuXHRcdFx0XHRpc0RhdGFGaWVsZFR5cGVzKGRhdGFGaWVsZCkgJiYgZGF0YUZpZWxkLlZhbHVlPy4kdGFyZ2V0Py5mdWxseVF1YWxpZmllZE5hbWVcblx0XHRcdFx0XHQ/IGdldFNlbWFudGljT2JqZWN0UGF0aChjb252ZXJ0ZXJDb250ZXh0LCBkYXRhRmllbGQpXG5cdFx0XHRcdFx0OiB1bmRlZmluZWQ7XG5cdFx0XHRjb25zdCByZWxhdGl2ZVBhdGggPSBfZ2V0UmVsYXRpdmVQYXRoKGRhdGFGaWVsZCk7XG5cdFx0XHQvLyBEZXRlcm1pbmUgcHJvcGVydGllcyB3aGljaCBhcmUgY29uc3VtZWQgYnkgdGhpcyBMaW5lSXRlbS5cblx0XHRcdGNvbnN0IHJlbGF0ZWRQcm9wZXJ0aWVzSW5mbzogQ29tcGxleFByb3BlcnR5SW5mbyA9IGNvbGxlY3RSZWxhdGVkUHJvcGVydGllc1JlY3Vyc2l2ZWx5KGRhdGFGaWVsZCwgY29udmVydGVyQ29udGV4dCwgdGFibGVUeXBlKTtcblx0XHRcdGNvbnN0IHJlbGF0ZWRQcm9wZXJ0eU5hbWVzOiBzdHJpbmdbXSA9IE9iamVjdC5rZXlzKHJlbGF0ZWRQcm9wZXJ0aWVzSW5mby5wcm9wZXJ0aWVzKTtcblx0XHRcdGNvbnN0IGFkZGl0aW9uYWxQcm9wZXJ0eU5hbWVzOiBzdHJpbmdbXSA9IE9iamVjdC5rZXlzKHJlbGF0ZWRQcm9wZXJ0aWVzSW5mby5hZGRpdGlvbmFsUHJvcGVydGllcyk7XG5cdFx0XHRjb25zdCBncm91cFBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHJlbGF0aXZlUGF0aCA/IF9zbGljZUF0U2xhc2gocmVsYXRpdmVQYXRoLCB0cnVlLCBmYWxzZSkgOiB1bmRlZmluZWQ7XG5cdFx0XHRjb25zdCBpc0dyb3VwOiBib29sZWFuID0gZ3JvdXBQYXRoICE9IHJlbGF0aXZlUGF0aDtcblx0XHRcdGNvbnN0IHNMYWJlbDogc3RyaW5nIHwgdW5kZWZpbmVkID0gZ2V0TGFiZWwoZGF0YUZpZWxkLCBpc0dyb3VwKTtcblx0XHRcdGNvbnN0IG5hbWUgPSBfZ2V0QW5ub3RhdGlvbkNvbHVtbk5hbWUoZGF0YUZpZWxkKTtcblx0XHRcdGNvbnN0IGlzRmllbGRHcm91cENvbHVtbjogYm9vbGVhbiA9IGdyb3VwUGF0aCA/IGdyb3VwUGF0aC5pbmNsdWRlcyhgQCR7VUlBbm5vdGF0aW9uVGVybXMuRmllbGRHcm91cH1gKSA6IGZhbHNlO1xuXHRcdFx0Y29uc3Qgc2hvd0RhdGFGaWVsZHNMYWJlbDogYm9vbGVhbiB8IHVuZGVmaW5lZCA9IGlzRmllbGRHcm91cENvbHVtblxuXHRcdFx0XHQ/IF9nZXRTaG93RGF0YUZpZWxkc0xhYmVsKG5hbWUsIHZpc3VhbGl6YXRpb25QYXRoLCBjb252ZXJ0ZXJDb250ZXh0KVxuXHRcdFx0XHQ6IGZhbHNlO1xuXHRcdFx0Y29uc3QgZGF0YVR5cGU6IHN0cmluZyB8IHVuZGVmaW5lZCA9IGdldERhdGFGaWVsZERhdGFUeXBlKGRhdGFGaWVsZCk7XG5cdFx0XHRjb25zdCBmb3JtYXRPcHRpb25zID0gX2dldERlZmF1bHRGb3JtYXRPcHRpb25zRm9yVGFibGUoZ2V0RGVmYXVsdERyYWZ0SW5kaWNhdG9yRm9yQ29sdW1uKG5hbWUsIHNlbWFudGljS2V5cywgZGF0YUZpZWxkKSk7XG5cdFx0XHRjb25zdCBwcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGggPSBlbmhhbmNlRGF0YU1vZGVsUGF0aDxEYXRhRmllbGRBYnN0cmFjdFR5cGVzPihcblx0XHRcdFx0Y29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCksXG5cdFx0XHRcdHJlbGF0aXZlUGF0aFxuXHRcdFx0KTtcblx0XHRcdC8vIERldGVybWluZSBpZiB3ZSBuZWVkIGEgc2l0dWF0aW9ucyBpbmRpY2F0b3Jcblx0XHRcdGNvbnN0IG5hdmlnYXRpb25Qcm9wZXJ0aWVzOiBOYXZpZ2F0aW9uUHJvcGVydHlbXSA9IHByb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRFbnRpdHlUeXBlLm5hdmlnYXRpb25Qcm9wZXJ0aWVzO1xuXHRcdFx0Y29uc3Qgc2l0dWF0aW9uc05hdlByb3BzID0gbmF2aWdhdGlvblByb3BlcnRpZXMuZmlsdGVyKFxuXHRcdFx0XHQobmF2aWdhdGlvblByb3BlcnR5KSA9PlxuXHRcdFx0XHRcdCFuYXZpZ2F0aW9uUHJvcGVydHkuaXNDb2xsZWN0aW9uICYmXG5cdFx0XHRcdFx0bmF2aWdhdGlvblByb3BlcnR5LnRhcmdldFR5cGUuYW5ub3RhdGlvbnMuQ29tbW9uPy5TQVBPYmplY3ROb2RlVHlwZT8uTmFtZSA9PT0gXCJCdXNpbmVzc1NpdHVhdGlvblwiXG5cdFx0XHQpO1xuXHRcdFx0Y29uc3Qgc2l0dWF0aW9uc05hdlByb3A6IE5hdmlnYXRpb25Qcm9wZXJ0eSB8IHVuZGVmaW5lZCA9IHNpdHVhdGlvbnNOYXZQcm9wcy5sZW5ndGggPj0gMSA/IHNpdHVhdGlvbnNOYXZQcm9wc1swXSA6IHVuZGVmaW5lZDtcblx0XHRcdGlmIChzaXR1YXRpb25zTmF2UHJvcCAmJiBmb3JtYXRPcHRpb25zKSB7XG5cdFx0XHRcdGZvcm1hdE9wdGlvbnMuaGFzU2l0dWF0aW9uc0luZGljYXRvciA9IHRydWU7XG5cdFx0XHR9XG5cblx0XHRcdGxldCBmaWVsZEdyb3VwSGlkZGVuRXhwcmVzc2lvbnM6IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uO1xuXHRcdFx0aWYgKFxuXHRcdFx0XHRkYXRhRmllbGQuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFubm90YXRpb24gJiZcblx0XHRcdFx0ZGF0YUZpZWxkLlRhcmdldD8uJHRhcmdldD8uJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkZpZWxkR3JvdXBUeXBlXG5cdFx0XHQpIHtcblx0XHRcdFx0ZmllbGRHcm91cEhpZGRlbkV4cHJlc3Npb25zID0gX2dldEZpZWxkR3JvdXBIaWRkZW5FeHByZXNzaW9ucyhkYXRhRmllbGQpO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgaXNNdWx0aVZhbHVlID0gX2lzQ29sdW1uTXVsdGlWYWx1ZWQoZGF0YUZpZWxkLCB0YWJsZUNvbnZlcnRlckNvbnRleHQpO1xuXHRcdFx0aWYgKCFpc011bHRpVmFsdWUgJiYgX2lzRXhwb3J0YWJsZUNvbHVtbihkYXRhRmllbGQpKSB7XG5cdFx0XHRcdC8vZXhjbHVkZSB0aGUgdHlwZXMgbGlzdGVkIGFib3ZlIGZvciB0aGUgRXhwb3J0IChnZW5lcmF0ZXMgZXJyb3Igb24gRXhwb3J0IGFzIFBERilcblx0XHRcdFx0ZXhwb3J0U2V0dGluZ3MgPSBjcmVhdGVDb2x1bW5FeHBvcnRTZXR0aW5ncyhkYXRhRmllbGQsIHJlbGF0ZWRQcm9wZXJ0aWVzSW5mbyk7XG5cdFx0XHR9XG5cdFx0XHRsZXQgcHJvcGVydHlUeXBlQ29uZmlnOiBQcm9wZXJ0eVR5cGVDb25maWcgfCB1bmRlZmluZWQ7XG5cdFx0XHRpZiAoZGF0YVR5cGUpIHtcblx0XHRcdFx0cHJvcGVydHlUeXBlQ29uZmlnID0gZ2V0VHlwZUNvbmZpZyhkYXRhRmllbGQsIGRhdGFUeXBlKTtcblx0XHRcdH1cblx0XHRcdGNvbnN0IHR5cGVDb25maWc6IFByb3BlcnR5VHlwZUNvbmZpZyA9IHtcblx0XHRcdFx0Y2xhc3NOYW1lOiBkYXRhVHlwZSBhcyBrZXlvZiB0eXBlb2YgRGVmYXVsdFR5cGVGb3JFZG1UeXBlLFxuXHRcdFx0XHRmb3JtYXRPcHRpb25zOiB7XG5cdFx0XHRcdFx0Li4uZm9ybWF0T3B0aW9ucyxcblx0XHRcdFx0XHQuLi5wcm9wZXJ0eVR5cGVDb25maWc/LmZvcm1hdE9wdGlvbnNcblx0XHRcdFx0fSxcblx0XHRcdFx0Y29uc3RyYWludHM6IHsgLi4ucHJvcGVydHlUeXBlQ29uZmlnPy5jb25zdHJhaW50cyB9XG5cdFx0XHR9O1xuXHRcdFx0Y29uc3QgdmlzdWFsU2V0dGluZ3M6IFZpc3VhbFNldHRpbmdzID0ge307XG5cdFx0XHRpZiAoIWRhdGFUeXBlIHx8ICF0eXBlQ29uZmlnKSB7XG5cdFx0XHRcdC8vIGZvciBjaGFydHNcblx0XHRcdFx0dmlzdWFsU2V0dGluZ3Mud2lkdGhDYWxjdWxhdGlvbiA9IG51bGw7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBzb3J0YWJsZSA9ICFpc011bHRpVmFsdWUgJiYgX2lzQ29sdW1uU29ydGFibGUoZGF0YUZpZWxkLCByZWxhdGl2ZVBhdGgsIHJlc3RyaWN0aW9uc09uUHJvcGVydGllcy5ub25Tb3J0YWJsZVByb3BlcnRpZXMpO1xuXHRcdFx0Y29uc3QgYXZhaWxhYmlsaXR5ID0gaXNSZWZlcmVuY2VQcm9wZXJ0eVN0YXRpY2FsbHlIaWRkZW4oZGF0YUZpZWxkKSA/IFwiSGlkZGVuXCIgOiBcIkRlZmF1bHRcIjtcblx0XHRcdGNvbnN0IGNvbHVtbjogQW5ub3RhdGlvblRhYmxlQ29sdW1uID0ge1xuXHRcdFx0XHRrZXk6IEtleUhlbHBlci5nZW5lcmF0ZUtleUZyb21EYXRhRmllbGQoZGF0YUZpZWxkKSxcblx0XHRcdFx0dHlwZTogQ29sdW1uVHlwZS5Bbm5vdGF0aW9uLFxuXHRcdFx0XHRsYWJlbDogc0xhYmVsLFxuXHRcdFx0XHRncm91cExhYmVsOiBpc0dyb3VwID8gZ2V0TGFiZWwoZGF0YUZpZWxkKSA6IHVuZGVmaW5lZCxcblx0XHRcdFx0Z3JvdXA6IGlzR3JvdXAgPyBncm91cFBhdGggOiB1bmRlZmluZWQsXG5cdFx0XHRcdEZpZWxkR3JvdXBIaWRkZW5FeHByZXNzaW9uczogZmllbGRHcm91cEhpZGRlbkV4cHJlc3Npb25zLFxuXHRcdFx0XHRhbm5vdGF0aW9uUGF0aDogY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlTZXRCYXNlZEFubm90YXRpb25QYXRoKGRhdGFGaWVsZC5mdWxseVF1YWxpZmllZE5hbWUpLFxuXHRcdFx0XHRzZW1hbnRpY09iamVjdFBhdGg6IHNlbWFudGljT2JqZWN0QW5ub3RhdGlvblBhdGgsXG5cdFx0XHRcdGF2YWlsYWJpbGl0eTogYXZhaWxhYmlsaXR5LFxuXHRcdFx0XHRuYW1lOiBuYW1lLFxuXHRcdFx0XHRzaG93RGF0YUZpZWxkc0xhYmVsOiBzaG93RGF0YUZpZWxkc0xhYmVsLFxuXHRcdFx0XHRyZXF1aXJlZDogaXNSZXF1aXJlZENvbHVtbihjb252ZXJ0ZXJDb250ZXh0LCBkYXRhRmllbGQgYXMgRGF0YUZpZWxkVHlwZXMsIHRhYmxlQ3JlYXRpb25Nb2RlKSxcblx0XHRcdFx0cmVsYXRpdmVQYXRoOiByZWxhdGl2ZVBhdGgsXG5cdFx0XHRcdHNvcnRhYmxlOiBzb3J0YWJsZSxcblx0XHRcdFx0cHJvcGVydHlJbmZvczogcmVsYXRlZFByb3BlcnR5TmFtZXMubGVuZ3RoID8gcmVsYXRlZFByb3BlcnR5TmFtZXMgOiB1bmRlZmluZWQsXG5cdFx0XHRcdGFkZGl0aW9uYWxQcm9wZXJ0eUluZm9zOiBhZGRpdGlvbmFsUHJvcGVydHlOYW1lcy5sZW5ndGggPiAwID8gYWRkaXRpb25hbFByb3BlcnR5TmFtZXMgOiB1bmRlZmluZWQsXG5cdFx0XHRcdGV4cG9ydFNldHRpbmdzOiBleHBvcnRTZXR0aW5ncyxcblx0XHRcdFx0d2lkdGg6IChkYXRhRmllbGQuYW5ub3RhdGlvbnM/LkhUTUw1Py5Dc3NEZWZhdWx0cz8ud2lkdGg/LnZhbHVlT2YoKSBhcyBzdHJpbmcpIHx8IHVuZGVmaW5lZCxcblx0XHRcdFx0aW1wb3J0YW5jZTogZ2V0SW1wb3J0YW5jZShjb252ZXJ0ZXJDb250ZXh0LCBkYXRhRmllbGQgYXMgRGF0YUZpZWxkVHlwZXMpLFxuXHRcdFx0XHRpc05hdmlnYWJsZTogdHJ1ZSxcblx0XHRcdFx0Zm9ybWF0T3B0aW9uczogZm9ybWF0T3B0aW9ucyxcblx0XHRcdFx0Y2FzZVNlbnNpdGl2ZTogaXNGaWx0ZXJpbmdDYXNlU2Vuc2l0aXZlKGNvbnZlcnRlckNvbnRleHQpLFxuXHRcdFx0XHR0eXBlQ29uZmlnOiB0eXBlQ29uZmlnLFxuXHRcdFx0XHR2aXN1YWxTZXR0aW5nczogdmlzdWFsU2V0dGluZ3MsXG5cdFx0XHRcdHRpbWV6b25lVGV4dDogZXhwb3J0U2V0dGluZ3M/LnRpbWV6b25lLFxuXHRcdFx0XHRpc1BhcnRPZkxpbmVJdGVtOiB0cnVlLFxuXHRcdFx0XHRpc011bHRpVmFsdWVcblx0XHRcdH07XG5cdFx0XHRjb25zdCB0b29sdGlwID0gX2dldFRvb2x0aXAoZGF0YUZpZWxkKSA/PyBzTGFiZWw7XG5cdFx0XHRpZiAodG9vbHRpcCkge1xuXHRcdFx0XHRjb2x1bW4udG9vbHRpcCA9IHRvb2x0aXA7XG5cdFx0XHR9XG5cdFx0XHRpZiAocmVsYXRlZFByb3BlcnRpZXNJbmZvLmV4cG9ydFNldHRpbmdzLmRhdGFQb2ludFRhcmdldFZhbHVlKSB7XG5cdFx0XHRcdGNvbHVtbi5leHBvcnREYXRhUG9pbnRUYXJnZXRWYWx1ZSA9IHJlbGF0ZWRQcm9wZXJ0aWVzSW5mby5leHBvcnRTZXR0aW5ncy5kYXRhUG9pbnRUYXJnZXRWYWx1ZTtcblx0XHRcdH1cblx0XHRcdGFubm90YXRpb25Db2x1bW5zLnB1c2goY29sdW1uKTtcblx0XHRcdC8vIENvbGxlY3QgaW5mb3JtYXRpb24gb2YgcmVsYXRlZCBjb2x1bW5zIHRvIGJlIGNyZWF0ZWQuXG5cdFx0XHRyZWxhdGVkUHJvcGVydHlOYW1lcy5mb3JFYWNoKChyZWxhdGVkUHJvcGVydHlOYW1lKSA9PiB7XG5cdFx0XHRcdGNvbHVtbnNUb0JlQ3JlYXRlZFtyZWxhdGVkUHJvcGVydHlOYW1lXSA9IHJlbGF0ZWRQcm9wZXJ0aWVzSW5mby5wcm9wZXJ0aWVzW3JlbGF0ZWRQcm9wZXJ0eU5hbWVdLmFubm90YXRpb25Qcm9wZXJ0eTtcblx0XHRcdFx0Ly8gSW4gY2FzZSBvZiBhIG11bHRpLXZhbHVlLCByZWxhdGVkIHByb3BlcnRpZXMgY2Fubm90IGJlIHNvcnRlZCBhcyB3ZSBnbyB0aHJvdWdoIGEgMS1uIHJlbGF0aW9uXG5cdFx0XHRcdGlmIChpc011bHRpVmFsdWUpIHtcblx0XHRcdFx0XHRyZXN0cmljdGlvbnNPblByb3BlcnRpZXMubm9uU29ydGFibGVQcm9wZXJ0aWVzLnB1c2gocmVsYXRlZFByb3BlcnR5TmFtZSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0YWRkUHJvcGVydHlUb0Rpc3BsYXlNb2RlT2ZEZXNjcmlwdGlvblByb3BlcnRpZXNNYXAoXG5cdFx0XHRcdFx0ZGlzcGxheU1vZGVPZkRlc2NyaXB0aW9uUHJvcGVydGllc01hcCxcblx0XHRcdFx0XHRyZWxhdGVkUHJvcGVydGllc0luZm8sXG5cdFx0XHRcdFx0cmVsYXRlZFByb3BlcnR5TmFtZVxuXHRcdFx0XHQpO1xuXHRcdFx0XHQvLyBJbiBjYXNlIHRoZSBsaW5lSXRlbSBwb2ludHMgdG8gYSBuYXZpZ2F0aW9uIHByb3BlcnR5IHdpdGggYSB0ZXh0QXJyYW5nZW1lbnQgVGV4dE9ubHksIHdlIG5lZWQgdG8gY3JlYXRlIHRoZSBjb2x1bW4gd2l0aCB0aGUgdmFsdWUgbmF2aWdhdGlvbiBwcm9wZXJ0eS5cblx0XHRcdFx0Ly8gVGhlIHRleHQgcHJvcGVydHkgaXMgcmVmZXJlbmNlZCBvbiB0aGUgcmVsYXRlZCBwcm9wZXJ0aWVzIG9mIHRoZSBsaW5lSXRlbSwgc28gd2lsbCBiZSBjcmVhdGVkIG9uIHRoZSBfY3JlYXRlUmVsYXRlZENvbHVtbnMgbWV0aG9kLlxuXHRcdFx0XHRpZiAocmVsYXRlZFByb3BlcnRpZXNJbmZvLnByb3BlcnRpZXNbcmVsYXRlZFByb3BlcnR5TmFtZV0uZGlzcGxheU1vZGVPZlByb3BlcnR5VXNlZEFzRGVzY3JpcHRpb24gPT09IFwiRGVzY3JpcHRpb25cIikge1xuXHRcdFx0XHRcdGNyZWF0ZVByb3BlcnR5QW5ub3RhdGVkVGV4dE9ubHkoXG5cdFx0XHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdFx0XHRcdFx0cHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoLFxuXHRcdFx0XHRcdFx0ZGF0YUZpZWxkLFxuXHRcdFx0XHRcdFx0Y29sdW1uc1RvQmVDcmVhdGVkLFxuXHRcdFx0XHRcdFx0cmVsYXRpdmVQYXRoLFxuXHRcdFx0XHRcdFx0cmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0XHQvLyBDcmVhdGUgY29sdW1ucyBmb3IgYWRkaXRpb25hbCBwcm9wZXJ0aWVzIGlkZW50aWZpZWQgZm9yIEFMUCB1c2UgY2FzZS5cblx0XHRcdGFkZGl0aW9uYWxQcm9wZXJ0eU5hbWVzLmZvckVhY2goKGFkZGl0aW9uYWxQcm9wZXJ0eU5hbWUpID0+IHtcblx0XHRcdFx0Ly8gSW50ZW50aW9uYWwgb3ZlcndyaXRlIGFzIHdlIHJlcXVpcmUgb25seSBvbmUgbmV3IFByb3BlcnR5SW5mbyBmb3IgYSByZWxhdGVkIFByb3BlcnR5LlxuXHRcdFx0XHRjb2x1bW5zVG9CZUNyZWF0ZWRbYWRkaXRpb25hbFByb3BlcnR5TmFtZV0gPSByZWxhdGVkUHJvcGVydGllc0luZm8uYWRkaXRpb25hbFByb3BlcnRpZXNbYWRkaXRpb25hbFByb3BlcnR5TmFtZV07XG5cdFx0XHR9KTtcblx0XHR9KTtcblx0fVxuXHQvLyBHZXQgY29sdW1ucyBmcm9tIHRoZSBQcm9wZXJ0aWVzIG9mIEVudGl0eVR5cGVcblx0cmV0dXJuIGdldENvbHVtbnNGcm9tRW50aXR5VHlwZShcblx0XHRjb2x1bW5zVG9CZUNyZWF0ZWQsXG5cdFx0ZW50aXR5VHlwZSxcblx0XHRhbm5vdGF0aW9uQ29sdW1ucyxcblx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdHRhYmxlVHlwZSxcblx0XHR0YWJsZUNyZWF0aW9uTW9kZSxcblx0XHRkaXNwbGF5TW9kZU9mRGVzY3JpcHRpb25Qcm9wZXJ0aWVzTWFwLFxuXHRcdHJlc3RyaWN0aW9uc09uUHJvcGVydGllc1xuXHQpO1xufTtcbi8qKlxuICogR2V0cyB0aGUgcHJvcGVydHkgbmFtZXMgZnJvbSB0aGUgbWFuaWZlc3QgYW5kIGNoZWNrcyBhZ2FpbnN0IGV4aXN0aW5nIHByb3BlcnRpZXMgYWxyZWFkeSBhZGRlZCBieSBhbm5vdGF0aW9ucy5cbiAqIElmIGEgbm90IHlldCBzdG9yZWQgcHJvcGVydHkgaXMgZm91bmQgaXQgYWRkcyBpdCBmb3Igc29ydGluZyBhbmQgZmlsdGVyaW5nIG9ubHkgdG8gdGhlIGFubm90YXRpb25Db2x1bW5zLlxuICogQHBhcmFtIHByb3BlcnRpZXNcbiAqIEBwYXJhbSBhbm5vdGF0aW9uQ29sdW1uc1xuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHRcbiAqIEBwYXJhbSBlbnRpdHlUeXBlXG4gKiBAcmV0dXJucyBUaGUgY29sdW1ucyBmcm9tIHRoZSBhbm5vdGF0aW9uc1xuICovXG5jb25zdCBfZ2V0UHJvcGVydHlOYW1lcyA9IGZ1bmN0aW9uIChcblx0cHJvcGVydGllczogc3RyaW5nW10gfCB1bmRlZmluZWQsXG5cdGFubm90YXRpb25Db2x1bW5zOiBBbm5vdGF0aW9uVGFibGVDb2x1bW5bXSxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+LFxuXHRlbnRpdHlUeXBlOiBFbnRpdHlUeXBlXG4pOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCB7XG5cdGxldCBtYXRjaGVkUHJvcGVydGllczogc3RyaW5nW10gfCB1bmRlZmluZWQ7XG5cdGlmIChwcm9wZXJ0aWVzKSB7XG5cdFx0bWF0Y2hlZFByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLm1hcChmdW5jdGlvbiAocHJvcGVydHlQYXRoKSB7XG5cdFx0XHRjb25zdCBhbm5vdGF0aW9uQ29sdW1uID0gYW5ub3RhdGlvbkNvbHVtbnMuZmluZChmdW5jdGlvbiAoYW5ub3RhdGlvbkNvbHVtbikge1xuXHRcdFx0XHRyZXR1cm4gYW5ub3RhdGlvbkNvbHVtbi5yZWxhdGl2ZVBhdGggPT09IHByb3BlcnR5UGF0aCAmJiBhbm5vdGF0aW9uQ29sdW1uLnByb3BlcnR5SW5mb3MgPT09IHVuZGVmaW5lZDtcblx0XHRcdH0pO1xuXHRcdFx0aWYgKGFubm90YXRpb25Db2x1bW4pIHtcblx0XHRcdFx0cmV0dXJuIGFubm90YXRpb25Db2x1bW4ubmFtZTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IHJlbGF0ZWRDb2x1bW5zID0gX2NyZWF0ZVJlbGF0ZWRDb2x1bW5zKFxuXHRcdFx0XHRcdHsgW3Byb3BlcnR5UGF0aF06IGVudGl0eVR5cGUucmVzb2x2ZVBhdGgocHJvcGVydHlQYXRoKSB9LFxuXHRcdFx0XHRcdGFubm90YXRpb25Db2x1bW5zLFxuXHRcdFx0XHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0XHRcdFx0ZW50aXR5VHlwZSxcblx0XHRcdFx0XHR7fVxuXHRcdFx0XHQpO1xuXHRcdFx0XHRhbm5vdGF0aW9uQ29sdW1ucy5wdXNoKHJlbGF0ZWRDb2x1bW5zWzBdKTtcblx0XHRcdFx0cmV0dXJuIHJlbGF0ZWRDb2x1bW5zWzBdLm5hbWU7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblx0cmV0dXJuIG1hdGNoZWRQcm9wZXJ0aWVzO1xufTtcblxuLyoqXG4gKiBEZXRlcm1pbmVzIGlmIHRoZSBmaWVsZCBncm91cCBoYXMgdG8gYmUgZmxhZ2dlZCBhcyByZXF1aXJlZC5cbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHBhcmFtIGZpZWxkR3JvdXAgVGhlIGZpZWxkR3JvdXAgYmVpbmcgcHJvY2Vzc2VkXG4gKiBAcGFyYW0gdGFibGVDcmVhdGlvbk1vZGUgVGhlIGNyZWF0aW9uIG1vZGUgb2YgdGhlIHVuZGVybHlpbmcgdGFibGVcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGZpZWxkR3JvdXAgaXMgcmVxdWlyZWQuXG4gKi9cbmNvbnN0IGlzUmVxdWlyZWRGaWVsZEdyb3VwID0gZnVuY3Rpb24gKFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sXG5cdGZpZWxkR3JvdXA6IEZpZWxkR3JvdXAsXG5cdHRhYmxlQ3JlYXRpb25Nb2RlOiBDcmVhdGlvbk1vZGVcbik6IGJvb2xlYW4ge1xuXHRjb25zdCBmaWVsZEdyb3VwRGF0YSA9IGZpZWxkR3JvdXAuRGF0YTtcblx0cmV0dXJuIGZpZWxkR3JvdXBEYXRhLnNvbWUoZnVuY3Rpb24gKGl0ZW0pIHtcblx0XHQvLyB3ZSBleGNsdWRlIGJvb2xlYW4gdHlwZSwgdGhlIGVuZC11c2VyIG1heSB3YW50IHRvIGtlZXAgdGhlIHVuZGVybHlpbmcgY2hlY2sgYm94IGVtcHR5IG9uIHB1cnBvc2Vcblx0XHRpZiAoaXNEYXRhRmllbGQoaXRlbSkgJiYgaXRlbT8uVmFsdWU/LiR0YXJnZXQudHlwZSAhPT0gXCJFZG0uQm9vbGVhblwiKSB7XG5cdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHRpc1N0YXRpY2FsbHlNYW5kYXRvcnkoaXRlbSkgfHxcblx0XHRcdFx0KHRhYmxlQ3JlYXRpb25Nb2RlID09PSBDcmVhdGlvbk1vZGUuSW5saW5lQ3JlYXRpb25Sb3dzICYmXG5cdFx0XHRcdFx0aXNBbm5vdGF0ZWRSZXF1aXJlZFByb3BlcnR5KGl0ZW0uVmFsdWUuJHRhcmdldC5mdWxseVF1YWxpZmllZE5hbWUsIGNvbnZlcnRlckNvbnRleHQpKVxuXHRcdFx0KTtcblx0XHR9XG5cdH0pO1xufTtcblxuLyoqXG4gKiBEZXRlcm1pbmVzIGlmIHRoZSBkYXRhRmllbGRGb3JBbm5vdGF0aW9uIGhhcyB0byBiZSBmbGFnZ2VkIGFzIHJlcXVpcmVkLlxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGNvbnZlcnRlciBjb250ZXh0XG4gKiBAcGFyYW0gZGF0YUZpZWxkRm9yQW5ub3RhdGlvbiBUaGUgcHJvcGVydHkgYmVpbmcgcHJvY2Vzc2VkXG4gKiBAcGFyYW0gdGFibGVDcmVhdGlvbk1vZGUgVGhlIGNyZWF0aW9uIG1vZGUgb2YgdGhlIHVuZGVybHlpbmcgdGFibGVcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIHByb3BlcnR5IGlzIHJlcXVpcmVkLlxuICovXG5jb25zdCBpc1JlcXVpcmVkRGF0YUZpZWxkRm9yQW5ub3RhdGlvbiA9IGZ1bmN0aW9uIChcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+LFxuXHRkYXRhRmllbGRGb3JBbm5vdGF0aW9uOiBEYXRhRmllbGRGb3JBbm5vdGF0aW9uLFxuXHR0YWJsZUNyZWF0aW9uTW9kZTogQ3JlYXRpb25Nb2RlXG4pOiBib29sZWFuIHtcblx0Y29uc3QgZGF0YUZpZWxkVGFyZ2V0ID0gZGF0YUZpZWxkRm9yQW5ub3RhdGlvbi5UYXJnZXQuJHRhcmdldDtcblx0Y29uc3QgRGF0YUZpZWxkRm9yQW5ub3RhdGlvbkZpZWxkQ29udHJvbE5vdE1hbmRhdG9yeSA9IGhhc0ZpZWxkQ29udHJvbE5vdE1hbmRhdG9yeShkYXRhRmllbGRGb3JBbm5vdGF0aW9uKTtcblx0Ly8gQ2hlY2sgaWYgdGhlIERhdGFGaWVsZEZvckFubm90YXRpb24gcG9pbnRzIHRvIGEgRmllbGRHcm91cFxuXHRpZiAoaGFzRmllbGRHcm91cFRhcmdldChkYXRhRmllbGRGb3JBbm5vdGF0aW9uKSkge1xuXHRcdGlmIChpc1JlcXVpcmVkRmllbGRHcm91cChjb252ZXJ0ZXJDb250ZXh0LCBkYXRhRmllbGRUYXJnZXQgYXMgRmllbGRHcm91cCwgdGFibGVDcmVhdGlvbk1vZGUpKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cdFx0Y29uc3QgZmllbGRHcm91cERhdGEgPSAoZGF0YUZpZWxkVGFyZ2V0IGFzIEZpZWxkR3JvdXApLkRhdGE7XG5cdFx0cmV0dXJuIGZpZWxkR3JvdXBEYXRhLnNvbWUoKGlubmVyRGF0YUZpZWxkOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzKSA9PiB7XG5cdFx0XHRyZXR1cm4gaXNSZXF1aXJlZENvbHVtbihjb252ZXJ0ZXJDb250ZXh0LCBpbm5lckRhdGFGaWVsZCwgdGFibGVDcmVhdGlvbk1vZGUpO1xuXHRcdH0pO1xuXHR9XG5cdC8qSWYgdGhlIHVuZGVybHlpbmcgZGF0YXBvaW50IGlzIGEgcmF0aW5nIGluZGljYXRvciwgdGhlIGVuZC11c2VyIG1heSB3YW50IHRvIGtlZXAgdGhlIHJhdGluZyBlbXB0eSAodmFsdWUgMCkgb24gcHVycG9zZS5cblx0QmVzaWRlcywgY3VycmVudGx5LCBvbmx5IGEgZmllbGRDb250cm9sIHNldCBvbiBhIGRhdGFGaWVsZEZvckFubm90YXRpb24gcG9pbnRpbmcgdG8gYSBkYXRhUG9pbnQgaGFzIGFuIGluZmx1ZW5jZSBpbiB0aGUgdGFibGUuXG5cdEFjY29yZGluZ2x5LCBpZiBhIGRhdGFwb2ludCBjb21lcyBmcm9tIGEgZGF0YUZpZWxkRm9yQW5ub3RhdGlvbiB3aXRoIGEgZmllbGRDb250cm9sIHNldCBhcyBub3QgbWFuZGF0b3J5LCB0aGlzIGRhdGFQb2ludCBtdXN0IG5vdCBiZSBmbGFnZ2VkIGFzIFwicmVxdWlyZWRcIiovXG5cdGlmIChoYXNEYXRhUG9pbnRUYXJnZXQoZGF0YUZpZWxkRm9yQW5ub3RhdGlvbikgJiYgKGRhdGFGaWVsZFRhcmdldCBhcyBEYXRhUG9pbnQpLlZpc3VhbGl6YXRpb24gIT09IFwiVUkuVmlzdWFsaXphdGlvblR5cGUvUmF0aW5nXCIpIHtcblx0XHRpZiAoRGF0YUZpZWxkRm9yQW5ub3RhdGlvbkZpZWxkQ29udHJvbE5vdE1hbmRhdG9yeSkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0XHRpZiAoaXNTdGF0aWNhbGx5TWFuZGF0b3J5KGRhdGFGaWVsZEZvckFubm90YXRpb24pKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cdFx0cmV0dXJuIGlzUmVxdWlyZWREYXRhUG9pbnQoY29udmVydGVyQ29udGV4dCwgZGF0YUZpZWxkVGFyZ2V0IGFzIERhdGFQb2ludCwgdGFibGVDcmVhdGlvbk1vZGUpO1xuXHR9XG5cdHJldHVybiBmYWxzZTtcbn07XG5cbi8qKlxuICogRGV0ZXJtaW5lcyBpZiB0aGUgcHJvcGVydHkgaGFzIHRvIGJlIGZsYWdnZWQgYXMgcmVxdWlyZWQuXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCBUaGUgY29udmVydGVyIGNvbnRleHRcbiAqIEBwYXJhbSBwcm9wZXJ0eSBUaGUgcHJvcGVydHkgYmVpbmcgcHJvY2Vzc2VkXG4gKiBAcGFyYW0gdGFibGVDcmVhdGlvbk1vZGUgVGhlIGNyZWF0aW9uIG1vZGUgb2YgdGhlIHVuZGVybHlpbmcgdGFibGVcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIHByb3BlcnR5IGlzIHJlcXVpcmVkLlxuICovXG5jb25zdCBpc1JlcXVpcmVkUHJvcGVydHkgPSBmdW5jdGlvbiAoXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pixcblx0cHJvcGVydHk6IFByb3BlcnR5LFxuXHR0YWJsZUNyZWF0aW9uTW9kZTogQ3JlYXRpb25Nb2RlXG4pOiBib29sZWFuIHtcblx0cmV0dXJuIChcblx0XHRwcm9wZXJ0eS50eXBlICE9PSBcIkVkbS5Cb29sZWFuXCIgJiZcblx0XHQhaXNSYXRpbmdWaXN1YWxpemF0aW9uRnJvbURhdGFGaWVsZERlZmF1bHQocHJvcGVydHkpICYmXG5cdFx0KGlzU3RhdGljYWxseU1hbmRhdG9yeShwcm9wZXJ0eSkgfHxcblx0XHRcdCh0YWJsZUNyZWF0aW9uTW9kZSA9PT0gQ3JlYXRpb25Nb2RlLklubGluZUNyZWF0aW9uUm93cyAmJlxuXHRcdFx0XHRpc0Fubm90YXRlZFJlcXVpcmVkUHJvcGVydHkocHJvcGVydHkuZnVsbHlRdWFsaWZpZWROYW1lLCBjb252ZXJ0ZXJDb250ZXh0KSkpXG5cdCk7XG59O1xuXG4vKipcbiAqIERldGVybWluZXMgaWYgdGhlIGRhdGFQb2ludCBoYXMgdG8gYmUgZmxhZ2dlZCBhcyByZXF1aXJlZC5cbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHBhcmFtIGRhdGFQb2ludCBUaGUgZGF0YVBvaW50IGJlaW5nIHByb2Nlc3NlZFxuICogQHBhcmFtIHRhYmxlQ3JlYXRpb25Nb2RlIFRoZSBjcmVhdGlvbiBtb2RlIG9mIHRoZSB1bmRlcmx5aW5nIHRhYmxlXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBkYXRhUG9pbnQgaXMgcmVxdWlyZWQuXG4gKi9cbmNvbnN0IGlzUmVxdWlyZWREYXRhUG9pbnQgPSBmdW5jdGlvbiAoXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pixcblx0ZGF0YVBvaW50OiBEYXRhUG9pbnQsXG5cdHRhYmxlQ3JlYXRpb25Nb2RlOiBDcmVhdGlvbk1vZGVcbik6IGJvb2xlYW4ge1xuXHRyZXR1cm4gKFxuXHRcdGlzU3RhdGljYWxseU1hbmRhdG9yeShkYXRhUG9pbnQpIHx8XG5cdFx0KHRhYmxlQ3JlYXRpb25Nb2RlID09PSBDcmVhdGlvbk1vZGUuSW5saW5lQ3JlYXRpb25Sb3dzICYmXG5cdFx0XHRpc0Fubm90YXRlZFJlcXVpcmVkUHJvcGVydHkoZGF0YVBvaW50LlZhbHVlLiR0YXJnZXQuZnVsbHlRdWFsaWZpZWROYW1lLCBjb252ZXJ0ZXJDb250ZXh0KSlcblx0KTtcbn07XG5cbi8qKlxuICogRGV0ZXJtaW5lcyBpZiB0aGUgdW5kZXJseWluZyBjb2x1bW4gaGFzIHRvIGJlIGZsYWdnZWQgYXMgcmVxdWlyZWQuXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCBUaGUgY29udmVydGVyIGNvbnRleHRcbiAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBiZWluZyBwcm9jZXNzZWRcbiAqIEBwYXJhbSB0YWJsZUNyZWF0aW9uTW9kZSBUaGUgY3JlYXRpb24gbW9kZSBvZiB0aGUgdW5kZXJseWluZyB0YWJsZVxuICogQHJldHVybnMgVGhlIGJpbmRpbmcgZXhwcmVzc2lvbiBmb3IgdGhlICdyZXF1aXJlZCcgcHJvcGVydHkgb2YgdGhlIHRhYmxlIGNvbHVtbi5cbiAqL1xuY29uc3QgaXNSZXF1aXJlZENvbHVtbiA9IGZ1bmN0aW9uIChcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+LFxuXHR0YXJnZXQ6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMgfCBQcm9wZXJ0eSxcblx0dGFibGVDcmVhdGlvbk1vZGU/OiBDcmVhdGlvbk1vZGVcbik6IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIHtcblx0Y29uc3QgY3JlYXRpb25Nb2RlID0gdGFibGVDcmVhdGlvbk1vZGUgfHwgQ3JlYXRpb25Nb2RlLklubGluZTtcblx0aWYgKFxuXHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0VGVtcGxhdGVUeXBlKCkgPT09IFRlbXBsYXRlVHlwZS5MaXN0UmVwb3J0IHx8XG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSA9PT0gVGVtcGxhdGVUeXBlLkFuYWx5dGljYWxMaXN0UGFnZVxuXHQpIHtcblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cdGlmIChpc1Byb3BlcnR5KHRhcmdldCkpIHtcblx0XHRyZXR1cm4gaXNSZXF1aXJlZFByb3BlcnR5KGNvbnZlcnRlckNvbnRleHQsIHRhcmdldCwgY3JlYXRpb25Nb2RlKSA/IGNvbXBpbGVFeHByZXNzaW9uKFVJLklzRWRpdGFibGUpIDogdW5kZWZpbmVkO1xuXHR9XG5cdC8vIENoZWNrIGlmIHRoZSBkYXRhRmllbGQgaXMgb2YgdHlwZSBEYXRhRmllbGRGb3JBbm5vdGF0aW9uXG5cdGlmIChpc0RhdGFGaWVsZEZvckFubm90YXRpb24odGFyZ2V0KSkge1xuXHRcdHJldHVybiBpc1JlcXVpcmVkRGF0YUZpZWxkRm9yQW5ub3RhdGlvbihjb252ZXJ0ZXJDb250ZXh0LCB0YXJnZXQsIGNyZWF0aW9uTW9kZSkgPyBjb21waWxlRXhwcmVzc2lvbihVSS5Jc0VkaXRhYmxlKSA6IHVuZGVmaW5lZDtcblx0fVxuXHQvL0lmIHRoZSB1bmRlcmx5aW5nIHByb3BlcnR5IGlzIGEgYm9vbGVhbiwgdGhlIGVuZC11c2VyIG1heSB3YW50IHRvIGtlZXAgdGhlIGNoZWNrIGJveCBlbXB0eSBvbiBwdXJwb3NlXG5cdGlmIChpc0RhdGFGaWVsZCh0YXJnZXQpICYmIHRhcmdldC5WYWx1ZT8uJHRhcmdldD8udHlwZSAhPT0gXCJFZG0uQm9vbGVhblwiKSB7XG5cdFx0cmV0dXJuIGlzU3RhdGljYWxseU1hbmRhdG9yeSh0YXJnZXQpIHx8XG5cdFx0XHQoY3JlYXRpb25Nb2RlID09PSBDcmVhdGlvbk1vZGUuSW5saW5lQ3JlYXRpb25Sb3dzICYmXG5cdFx0XHRcdGlzQW5ub3RhdGVkUmVxdWlyZWRQcm9wZXJ0eSh0YXJnZXQuVmFsdWUuJHRhcmdldC5mdWxseVF1YWxpZmllZE5hbWUsIGNvbnZlcnRlckNvbnRleHQpKVxuXHRcdFx0PyBjb21waWxlRXhwcmVzc2lvbihVSS5Jc0VkaXRhYmxlKVxuXHRcdFx0OiB1bmRlZmluZWQ7XG5cdH1cblx0cmV0dXJuIHVuZGVmaW5lZDtcbn07XG5jb25zdCBfYXBwZW5kQ3VzdG9tVGVtcGxhdGUgPSBmdW5jdGlvbiAocHJvcGVydGllczogc3RyaW5nW10gfCB1bmRlZmluZWQsIGV4cG9ydFByb3BlcnRpZXM6IHN0cmluZ1tdIHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0aWYgKGV4cG9ydFByb3BlcnRpZXM/Lmxlbmd0aCkge1xuXHRcdHByb3BlcnRpZXMgPSBleHBvcnRQcm9wZXJ0aWVzO1xuXHR9XG5cdGlmIChwcm9wZXJ0aWVzKSB7XG5cdFx0cmV0dXJuIHByb3BlcnRpZXNcblx0XHRcdC5tYXAoKHByb3BlcnR5KSA9PiB7XG5cdFx0XHRcdHJldHVybiBgeyR7cHJvcGVydGllcyEuaW5kZXhPZihwcm9wZXJ0eSl9fWA7XG5cdFx0XHR9KVxuXHRcdFx0LmpvaW4oYCR7XCJcXG5cIn1gKTtcblx0fVxuXHRyZXR1cm4gdW5kZWZpbmVkO1xufTtcbi8qKlxuICogUmV0dXJucyB0YWJsZSBjb2x1bW4gZGVmaW5pdGlvbnMgZnJvbSBtYW5pZmVzdC5cbiAqXG4gKiBUaGVzZSBtYXkgYmUgY3VzdG9tIGNvbHVtbnMgZGVmaW5lZCBpbiB0aGUgbWFuaWZlc3QsIHNsb3QgY29sdW1ucyBjb21pbmcgdGhyb3VnaFxuICogYSBidWlsZGluZyBibG9jaywgb3IgYW5ub3RhdGlvbiBjb2x1bW5zIHRvIG92ZXJ3cml0ZSBhbm5vdGF0aW9uLWJhc2VkIGNvbHVtbnMuXG4gKiBAcGFyYW0gY29sdW1uc1xuICogQHBhcmFtIGFubm90YXRpb25Db2x1bW5zXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dFxuICogQHBhcmFtIGVudGl0eVR5cGVcbiAqIEBwYXJhbSBuYXZpZ2F0aW9uU2V0dGluZ3NcbiAqIEByZXR1cm5zIFRoZSBjb2x1bW5zIGZyb20gdGhlIG1hbmlmZXN0XG4gKi9cbmNvbnN0IGdldENvbHVtbnNGcm9tTWFuaWZlc3QgPSBmdW5jdGlvbiAoXG5cdGNvbHVtbnM6IFJlY29yZDxzdHJpbmcsIEN1c3RvbURlZmluZWRUYWJsZUNvbHVtbiB8IEN1c3RvbURlZmluZWRUYWJsZUNvbHVtbkZvck92ZXJyaWRlPixcblx0YW5ub3RhdGlvbkNvbHVtbnM6IEFubm90YXRpb25UYWJsZUNvbHVtbltdLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sXG5cdGVudGl0eVR5cGU6IEVudGl0eVR5cGUsXG5cdG5hdmlnYXRpb25TZXR0aW5ncz86IE5hdmlnYXRpb25TZXR0aW5nc0NvbmZpZ3VyYXRpb25cbik6IFJlY29yZDxzdHJpbmcsIE1hbmlmZXN0Q29sdW1uPiB7XG5cdGNvbnN0IGludGVybmFsQ29sdW1uczogUmVjb3JkPHN0cmluZywgTWFuaWZlc3RDb2x1bW4+ID0ge307XG5cdGZ1bmN0aW9uIGlzQW5ub3RhdGlvbkNvbHVtbihcblx0XHRjb2x1bW46IEN1c3RvbURlZmluZWRUYWJsZUNvbHVtbiB8IEN1c3RvbURlZmluZWRUYWJsZUNvbHVtbkZvck92ZXJyaWRlLFxuXHRcdGtleTogc3RyaW5nXG5cdCk6IGNvbHVtbiBpcyBDdXN0b21EZWZpbmVkVGFibGVDb2x1bW5Gb3JPdmVycmlkZSB7XG5cdFx0cmV0dXJuIGFubm90YXRpb25Db2x1bW5zLnNvbWUoKGFubm90YXRpb25Db2x1bW4pID0+IGFubm90YXRpb25Db2x1bW4ua2V5ID09PSBrZXkpO1xuXHR9XG5cdGZ1bmN0aW9uIGlzU2xvdENvbHVtbihtYW5pZmVzdENvbHVtbjogQ3VzdG9tRGVmaW5lZFRhYmxlQ29sdW1uKTogbWFuaWZlc3RDb2x1bW4gaXMgRnJhZ21lbnREZWZpbmVkU2xvdENvbHVtbiB7XG5cdFx0cmV0dXJuIG1hbmlmZXN0Q29sdW1uLnR5cGUgPT09IENvbHVtblR5cGUuU2xvdDtcblx0fVxuXHRmdW5jdGlvbiBpc0N1c3RvbUNvbHVtbihtYW5pZmVzdENvbHVtbjogQ3VzdG9tRGVmaW5lZFRhYmxlQ29sdW1uKTogbWFuaWZlc3RDb2x1bW4gaXMgTWFuaWZlc3REZWZpbmVkQ3VzdG9tQ29sdW1uIHtcblx0XHRyZXR1cm4gbWFuaWZlc3RDb2x1bW4udHlwZSA9PT0gdW5kZWZpbmVkICYmICEhbWFuaWZlc3RDb2x1bW4udGVtcGxhdGU7XG5cdH1cblx0ZnVuY3Rpb24gX3VwZGF0ZUxpbmtlZFByb3BlcnRpZXNPbkN1c3RvbUNvbHVtbnMocHJvcGVydHlJbmZvczogc3RyaW5nW10sIGFubm90YXRpb25UYWJsZUNvbHVtbnM6IEFubm90YXRpb25UYWJsZUNvbHVtbltdKTogdm9pZCB7XG5cdFx0Y29uc3QgcmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzID0gZ2V0UmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzKGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0KCkpO1xuXHRcdHByb3BlcnR5SW5mb3MuZm9yRWFjaCgocHJvcGVydHkpID0+IHtcblx0XHRcdGFubm90YXRpb25UYWJsZUNvbHVtbnMuZm9yRWFjaCgocHJvcCkgPT4ge1xuXHRcdFx0XHRpZiAocHJvcC5uYW1lID09PSBwcm9wZXJ0eSkge1xuXHRcdFx0XHRcdHByb3Auc29ydGFibGUgPSAhcmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzLm5vblNvcnRhYmxlUHJvcGVydGllcy5pbmNsdWRlcyhwcm9wZXJ0eS5yZXBsYWNlKFwiUHJvcGVydHk6OlwiLCBcIlwiKSk7XG5cdFx0XHRcdFx0cHJvcC5pc0dyb3VwYWJsZSA9IHByb3Auc29ydGFibGU7XG5cdFx0XHRcdFx0cHJvcC5maWx0ZXJhYmxlID0gIXJlc3RyaWN0aW9uc09uUHJvcGVydGllcy5ub25GaWx0ZXJhYmxlUHJvcGVydGllcy5pbmNsdWRlcyhwcm9wZXJ0eS5yZXBsYWNlKFwiUHJvcGVydHk6OlwiLCBcIlwiKSk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH0pO1xuXHR9XG5cdGZvciAoY29uc3Qga2V5IGluIGNvbHVtbnMpIHtcblx0XHRjb25zdCBtYW5pZmVzdENvbHVtbiA9IGNvbHVtbnNba2V5XTtcblx0XHRLZXlIZWxwZXIudmFsaWRhdGVLZXkoa2V5KTtcblx0XHQvLyBCYXNlVGFibGVDb2x1bW5cblx0XHRjb25zdCBiYXNlVGFibGVDb2x1bW4gPSB7XG5cdFx0XHRrZXk6IGtleSxcblx0XHRcdHdpZHRoSW5jbHVkaW5nQ29sdW1uSGVhZGVyOiBtYW5pZmVzdENvbHVtbi53aWR0aEluY2x1ZGluZ0NvbHVtbkhlYWRlcixcblx0XHRcdHdpZHRoOiBtYW5pZmVzdENvbHVtbi53aWR0aCB8fCB1bmRlZmluZWQsXG5cdFx0XHRwb3NpdGlvbjoge1xuXHRcdFx0XHRhbmNob3I6IG1hbmlmZXN0Q29sdW1uLnBvc2l0aW9uPy5hbmNob3IsXG5cdFx0XHRcdHBsYWNlbWVudDogbWFuaWZlc3RDb2x1bW4ucG9zaXRpb24gPT09IHVuZGVmaW5lZCA/IFBsYWNlbWVudC5BZnRlciA6IG1hbmlmZXN0Q29sdW1uLnBvc2l0aW9uLnBsYWNlbWVudFxuXHRcdFx0fSxcblx0XHRcdGNhc2VTZW5zaXRpdmU6IGlzRmlsdGVyaW5nQ2FzZVNlbnNpdGl2ZShjb252ZXJ0ZXJDb250ZXh0KVxuXHRcdH07XG5cdFx0aWYgKGlzQW5ub3RhdGlvbkNvbHVtbihtYW5pZmVzdENvbHVtbiwga2V5KSkge1xuXHRcdFx0Y29uc3QgcHJvcGVydGllc1RvT3ZlcndyaXRlQW5ub3RhdGlvbkNvbHVtbjogQ3VzdG9tRWxlbWVudDxBbm5vdGF0aW9uVGFibGVDb2x1bW5Gb3JPdmVycmlkZT4gPSB7XG5cdFx0XHRcdC4uLmJhc2VUYWJsZUNvbHVtbixcblx0XHRcdFx0aW1wb3J0YW5jZTogbWFuaWZlc3RDb2x1bW4/LmltcG9ydGFuY2UsXG5cdFx0XHRcdGhvcml6b250YWxBbGlnbjogbWFuaWZlc3RDb2x1bW4/Lmhvcml6b250YWxBbGlnbixcblx0XHRcdFx0YXZhaWxhYmlsaXR5OiBtYW5pZmVzdENvbHVtbj8uYXZhaWxhYmlsaXR5LFxuXHRcdFx0XHR0eXBlOiBDb2x1bW5UeXBlLkFubm90YXRpb24sXG5cdFx0XHRcdGlzTmF2aWdhYmxlOiBpc0Fubm90YXRpb25Db2x1bW4obWFuaWZlc3RDb2x1bW4sIGtleSlcblx0XHRcdFx0XHQ/IHVuZGVmaW5lZFxuXHRcdFx0XHRcdDogaXNBY3Rpb25OYXZpZ2FibGUobWFuaWZlc3RDb2x1bW4sIG5hdmlnYXRpb25TZXR0aW5ncywgdHJ1ZSksXG5cdFx0XHRcdHNldHRpbmdzOiBtYW5pZmVzdENvbHVtbi5zZXR0aW5ncyxcblx0XHRcdFx0Zm9ybWF0T3B0aW9uczogX2dldERlZmF1bHRGb3JtYXRPcHRpb25zRm9yVGFibGUobWFuaWZlc3RDb2x1bW4uZm9ybWF0T3B0aW9ucyksXG5cdFx0XHRcdGV4cG9ydFNldHRpbmdzOiBnZXRDdXN0b21FeHBvcnRTZXR0aW5ncyhcblx0XHRcdFx0XHRtYW5pZmVzdENvbHVtbj8uZXhwb3J0U2V0dGluZ3MsXG5cdFx0XHRcdFx0YW5ub3RhdGlvbkNvbHVtbnMsXG5cdFx0XHRcdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHRcdFx0XHRlbnRpdHlUeXBlLFxuXHRcdFx0XHRcdHVuZGVmaW5lZCxcblx0XHRcdFx0XHRrZXlcblx0XHRcdFx0KVxuXHRcdFx0fTtcblx0XHRcdGludGVybmFsQ29sdW1uc1trZXldID0gcHJvcGVydGllc1RvT3ZlcndyaXRlQW5ub3RhdGlvbkNvbHVtbjtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29uc3QgcHJvcGVydHlJbmZvczogc3RyaW5nW10gfCB1bmRlZmluZWQgPSBfZ2V0UHJvcGVydHlOYW1lcyhcblx0XHRcdFx0bWFuaWZlc3RDb2x1bW4ucHJvcGVydGllcyxcblx0XHRcdFx0YW5ub3RhdGlvbkNvbHVtbnMsXG5cdFx0XHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0XHRcdGVudGl0eVR5cGVcblx0XHRcdCk7XG5cdFx0XHRjb25zdCB0b29sdGlwVGV4dCA9IGNvbnZlcnRlckNvbnRleHQuZmV0Y2hUZXh0RnJvbU1ldGFNb2RlbChtYW5pZmVzdENvbHVtbi50b29sdGlwKSxcblx0XHRcdFx0aGVhZGVyVGV4dCA9IGNvbnZlcnRlckNvbnRleHQuZmV0Y2hUZXh0RnJvbU1ldGFNb2RlbChtYW5pZmVzdENvbHVtbi5oZWFkZXIpO1xuXG5cdFx0XHRjb25zdCBjdXN0b21Db2x1bW5FeHBvcnRTZXR0aW5nczogQ29sdW1uRXhwb3J0U2V0dGluZ3MgfCBudWxsID0gcHJvcGVydHlJbmZvc1xuXHRcdFx0XHQ/IGdldEN1c3RvbUV4cG9ydFNldHRpbmdzKG1hbmlmZXN0Q29sdW1uPy5leHBvcnRTZXR0aW5ncywgYW5ub3RhdGlvbkNvbHVtbnMsIGNvbnZlcnRlckNvbnRleHQsIGVudGl0eVR5cGUsIHByb3BlcnR5SW5mb3MpXG5cdFx0XHRcdDogbnVsbDtcblx0XHRcdGNvbnN0IGJhc2VNYW5pZmVzdENvbHVtbiA9IHtcblx0XHRcdFx0Li4uYmFzZVRhYmxlQ29sdW1uLFxuXHRcdFx0XHRoZWFkZXI6IGhlYWRlclRleHQsXG5cdFx0XHRcdGltcG9ydGFuY2U6IG1hbmlmZXN0Q29sdW1uPy5pbXBvcnRhbmNlIHx8IEltcG9ydGFuY2UuTm9uZSxcblx0XHRcdFx0aG9yaXpvbnRhbEFsaWduOiBtYW5pZmVzdENvbHVtbj8uaG9yaXpvbnRhbEFsaWduIHx8IEhvcml6b250YWxBbGlnbi5CZWdpbixcblx0XHRcdFx0YXZhaWxhYmlsaXR5OiBtYW5pZmVzdENvbHVtbj8uYXZhaWxhYmlsaXR5IHx8IFwiRGVmYXVsdFwiLFxuXHRcdFx0XHR0ZW1wbGF0ZTogbWFuaWZlc3RDb2x1bW4udGVtcGxhdGUsXG5cdFx0XHRcdHByb3BlcnR5SW5mb3M6IHByb3BlcnR5SW5mb3MsXG5cdFx0XHRcdGV4cG9ydFNldHRpbmdzOiBjdXN0b21Db2x1bW5FeHBvcnRTZXR0aW5ncyxcblx0XHRcdFx0aWQ6IGBDdXN0b21Db2x1bW46OiR7a2V5fWAsXG5cdFx0XHRcdG5hbWU6IGBDdXN0b21Db2x1bW46OiR7a2V5fWAsXG5cdFx0XHRcdC8vTmVlZGVkIGZvciBNREM6XG5cdFx0XHRcdGZvcm1hdE9wdGlvbnM6IHsgdGV4dExpbmVzRWRpdDogNCB9LFxuXHRcdFx0XHRpc0dyb3VwYWJsZTogZmFsc2UsXG5cdFx0XHRcdGlzTmF2aWdhYmxlOiBmYWxzZSxcblx0XHRcdFx0c29ydGFibGU6IGZhbHNlLFxuXHRcdFx0XHR2aXN1YWxTZXR0aW5nczogeyB3aWR0aENhbGN1bGF0aW9uOiBudWxsIH0sXG5cdFx0XHRcdHRvb2x0aXA6IHRvb2x0aXBUZXh0ID8gdG9vbHRpcFRleHQgOiBoZWFkZXJUZXh0LFxuXHRcdFx0XHRwcm9wZXJ0aWVzOiBtYW5pZmVzdENvbHVtbi5wcm9wZXJ0aWVzLFxuXHRcdFx0XHRyZXF1aXJlZDpcblx0XHRcdFx0XHRtYW5pZmVzdENvbHVtbi5yZXF1aXJlZCAmJlxuXHRcdFx0XHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0VGVtcGxhdGVUeXBlKCkgIT09IFRlbXBsYXRlVHlwZS5MaXN0UmVwb3J0ICYmXG5cdFx0XHRcdFx0Y29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSAhPT0gVGVtcGxhdGVUeXBlLkFuYWx5dGljYWxMaXN0UGFnZVxuXHRcdFx0XHRcdFx0PyBjb21waWxlRXhwcmVzc2lvbihVSS5Jc0VkaXRhYmxlKVxuXHRcdFx0XHRcdFx0OiB1bmRlZmluZWRcblx0XHRcdH07XG5cdFx0XHRpZiAocHJvcGVydHlJbmZvcykge1xuXHRcdFx0XHRfdXBkYXRlTGlua2VkUHJvcGVydGllc09uQ3VzdG9tQ29sdW1ucyhwcm9wZXJ0eUluZm9zLCBhbm5vdGF0aW9uQ29sdW1ucyk7XG5cdFx0XHR9XG5cdFx0XHRpZiAoaXNTbG90Q29sdW1uKG1hbmlmZXN0Q29sdW1uKSkge1xuXHRcdFx0XHRjb25zdCBjdXN0b21UYWJsZUNvbHVtbjogQ3VzdG9tRWxlbWVudDxDdXN0b21CYXNlZFRhYmxlQ29sdW1uPiA9IHtcblx0XHRcdFx0XHQuLi5iYXNlTWFuaWZlc3RDb2x1bW4sXG5cdFx0XHRcdFx0dHlwZTogQ29sdW1uVHlwZS5TbG90XG5cdFx0XHRcdH07XG5cdFx0XHRcdGludGVybmFsQ29sdW1uc1trZXldID0gY3VzdG9tVGFibGVDb2x1bW47XG5cdFx0XHR9IGVsc2UgaWYgKGlzQ3VzdG9tQ29sdW1uKG1hbmlmZXN0Q29sdW1uKSkge1xuXHRcdFx0XHRjb25zdCBjdXN0b21UYWJsZUNvbHVtbjogQ3VzdG9tRWxlbWVudDxDdXN0b21CYXNlZFRhYmxlQ29sdW1uPiA9IHtcblx0XHRcdFx0XHQuLi5iYXNlTWFuaWZlc3RDb2x1bW4sXG5cdFx0XHRcdFx0dHlwZTogQ29sdW1uVHlwZS5EZWZhdWx0XG5cdFx0XHRcdH07XG5cdFx0XHRcdGludGVybmFsQ29sdW1uc1trZXldID0gY3VzdG9tVGFibGVDb2x1bW47XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCBtZXNzYWdlID0gYFRoZSBhbm5vdGF0aW9uIGNvbHVtbiAnJHtrZXl9JyByZWZlcmVuY2VkIGluIHRoZSBtYW5pZmVzdCBpcyBub3QgZm91bmRgO1xuXHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0XG5cdFx0XHRcdFx0LmdldERpYWdub3N0aWNzKClcblx0XHRcdFx0XHQuYWRkSXNzdWUoXG5cdFx0XHRcdFx0XHRJc3N1ZUNhdGVnb3J5Lk1hbmlmZXN0LFxuXHRcdFx0XHRcdFx0SXNzdWVTZXZlcml0eS5Mb3csXG5cdFx0XHRcdFx0XHRtZXNzYWdlLFxuXHRcdFx0XHRcdFx0SXNzdWVDYXRlZ29yeVR5cGUsXG5cdFx0XHRcdFx0XHRJc3N1ZUNhdGVnb3J5VHlwZT8uQW5ub3RhdGlvbkNvbHVtbnM/LkludmFsaWRLZXlcblx0XHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHRyZXR1cm4gaW50ZXJuYWxDb2x1bW5zO1xufTtcblxuLyoqXG4gKiBBZGRzIHJlZmVyZW5jZXMgdG8gY29sdW1ucyB0aGF0IGFyZSBuZWVkZWQgdG8gZGlzcGxheSB0aGUgZHJhZnQgaW5kaWNhdG9yIGNvbHVtbiBwcm9wZXJseS5cbiAqIEBwYXJhbSBkcmFmdEluZGljYXRvckNvbHVtblxuICogQHBhcmFtIHRhYmxlQ29sdW1uc1xuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHRcbiAqL1xuZnVuY3Rpb24gYWRkUmVmZXJlbmNlc0ZvckRyYWZ0SW5kaWNhdG9yQ29sdW1uKFxuXHRkcmFmdEluZGljYXRvckNvbHVtbjogQ29tcHV0ZWRUYWJsZUNvbHVtbixcblx0dGFibGVDb2x1bW5zOiBUYWJsZUNvbHVtbltdLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD5cbik6IHZvaWQge1xuXHRmdW5jdGlvbiBjcmVhdGVSZWxhdGVkQ29sdW1uKHByb3BlcnR5UGF0aDogc3RyaW5nKTogdm9pZCB7XG5cdFx0Y29uc3Qga2V5ID0gXCJQcm9wZXJ0eV9UZWNobmljYWw6OlwiICsgcHJvcGVydHlQYXRoLnJlcGxhY2UoL1xcLy9nLCBcIjpcIik7XG5cdFx0Y29uc3QgbmV3Q29sdW1uOiBUZWNobmljYWxDb2x1bW4gPSB7XG5cdFx0XHRrZXksXG5cdFx0XHRuYW1lOiBrZXksXG5cdFx0XHRhbm5vdGF0aW9uUGF0aDogY29udmVydGVyQ29udGV4dC5nZXRBYnNvbHV0ZUFubm90YXRpb25QYXRoKHByb3BlcnR5UGF0aCksXG5cdFx0XHRyZWxhdGl2ZVBhdGg6IHByb3BlcnR5UGF0aCxcblx0XHRcdGlzR3JvdXBhYmxlOiBmYWxzZSxcblx0XHRcdHNvcnRhYmxlOiBmYWxzZSxcblx0XHRcdGF2YWlsYWJpbGl0eTogXCJIaWRkZW5cIixcblx0XHRcdGNhc2VTZW5zaXRpdmU6IGZhbHNlLFxuXHRcdFx0dHlwZTogQ29sdW1uVHlwZS5Bbm5vdGF0aW9uLFxuXHRcdFx0ZXh0ZW5zaW9uOiB7XG5cdFx0XHRcdHRlY2huaWNhbGx5QWdncmVnYXRhYmxlOiBmYWxzZSxcblx0XHRcdFx0dGVjaG5pY2FsbHlHcm91cGFibGU6IHRydWVcblx0XHRcdH1cblx0XHR9O1xuXHRcdHRhYmxlQ29sdW1ucy5wdXNoKG5ld0NvbHVtbik7XG5cdFx0ZHJhZnRJbmRpY2F0b3JDb2x1bW4ucHJvcGVydHlJbmZvcyEucHVzaChrZXkpO1xuXHR9XG5cblx0ZHJhZnRJbmRpY2F0b3JDb2x1bW4ucHJvcGVydHlJbmZvcyA9IFtdO1xuXHRjcmVhdGVSZWxhdGVkQ29sdW1uKFwiSGFzRHJhZnRFbnRpdHlcIik7XG5cdGNyZWF0ZVJlbGF0ZWRDb2x1bW4oXCJEcmFmdEFkbWluaXN0cmF0aXZlRGF0YS9JblByb2Nlc3NCeVVzZXJcIik7XG5cdGNyZWF0ZVJlbGF0ZWRDb2x1bW4oXCJEcmFmdEFkbWluaXN0cmF0aXZlRGF0YS9MYXN0Q2hhbmdlZEJ5VXNlclwiKTtcblx0Y3JlYXRlUmVsYXRlZENvbHVtbihcIkRyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhL0xhc3RDaGFuZ2VEYXRlVGltZVwiKTtcblxuXHRjb25zdCBkcmFmdEFkbWluRGF0YVByb3BlcnRpZXMgPSBlbmhhbmNlRGF0YU1vZGVsUGF0aChjb252ZXJ0ZXJDb250ZXh0LmdldERhdGFNb2RlbE9iamVjdFBhdGgoKSwgXCJEcmFmdEFkbWluaXN0cmF0aXZlRGF0YVwiKVxuXHRcdC50YXJnZXRFbnRpdHlUeXBlLmVudGl0eVByb3BlcnRpZXM7XG5cdGlmIChkcmFmdEFkbWluRGF0YVByb3BlcnRpZXMuZmluZCgocHJvcCkgPT4gcHJvcC5uYW1lID09PSBcIkluUHJvY2Vzc0J5VXNlckRlc2NyaXB0aW9uXCIpKSB7XG5cdFx0Y3JlYXRlUmVsYXRlZENvbHVtbihcIkRyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhL0luUHJvY2Vzc0J5VXNlckRlc2NyaXB0aW9uXCIpO1xuXHR9XG5cdGlmIChkcmFmdEFkbWluRGF0YVByb3BlcnRpZXMuZmluZCgocHJvcCkgPT4gcHJvcC5uYW1lID09PSBcIkxhc3RDaGFuZ2VkQnlVc2VyRGVzY3JpcHRpb25cIikpIHtcblx0XHRjcmVhdGVSZWxhdGVkQ29sdW1uKFwiRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEvTGFzdENoYW5nZWRCeVVzZXJEZXNjcmlwdGlvblwiKTtcblx0fVxufVxuXG4vKipcbiAqIEFkZHMgY29tcHV0ZWQgY29sdW1ucyBzdWNoIGFzIHRoZSBkcmFmdCBzdGF0dXMgYW5kIHNpdHVhdGlvbnMgc3RhdHVzLlxuICogQHBhcmFtIHRhYmxlQ29sdW1ucyBUaGUgdGFibGUgY29sdW1ucyBjb2xsZWN0ZWQgc28gZmFyXG4gKiBAcGFyYW0gdmlzdWFsaXphdGlvblBhdGhcbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcmV0dXJucyBUaGUgZW5yaWNoZWQgc2V0IG9mIHRhYmxlIGNvbHVtbnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZENvbXB1dGVkQ29sdW1ucyhcblx0dGFibGVDb2x1bW5zOiBUYWJsZUNvbHVtbltdLFxuXHR2aXN1YWxpemF0aW9uUGF0aDogc3RyaW5nLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD5cbik6IFRhYmxlQ29sdW1uW10ge1xuXHRjb25zdCB0YWJsZU1hbmlmZXN0U2V0dGluZ3M6IFRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uID0gY29udmVydGVyQ29udGV4dC5nZXRNYW5pZmVzdENvbnRyb2xDb25maWd1cmF0aW9uKHZpc3VhbGl6YXRpb25QYXRoKTtcblx0Y29uc3QgdGFibGVUeXBlID0gZ2V0VGFibGVUeXBlKGNvbnZlcnRlckNvbnRleHQsIHRhYmxlTWFuaWZlc3RTZXR0aW5ncyk7XG5cblx0aWYgKCFbXCJHcmlkVGFibGVcIiwgXCJUcmVlVGFibGVcIiwgXCJBbmFseXRpY2FsVGFibGVcIl0uaW5jbHVkZXModGFibGVUeXBlKSkge1xuXHRcdC8vIENvbXB1dGVkIGNvbHVtbnMgYXJlIG5vdCB1c2VkIGluIFJlc3BvbnNpdmUgdGFibGVzXG5cdFx0cmV0dXJuIHRhYmxlQ29sdW1ucztcblx0fVxuXG5cdC8vIEluIGNhc2UgYSBncmlkIHRhYmxlIG9yIHRyZWUgdGFibGUgaXMgdXNlZCwgd2UgZGlzcGxheSB0aGUgc2l0dWF0aW9ucyBpbmRpY2F0b3IgaW4gYSBzZXBhcmF0ZSBjb2x1bW5cblx0Ly8gc28gd2UgaGF2ZSB0byBkaXNhYmxlIGl0IGhlcmUgdG8gZW5zdXJlLCB0aGF0IHRoZSBmaWVsZCBidWlsZGluZyBibG9ja1xuXHQvLyBkb2VzIG5vdCByZW5kZXIgaXQgaW50byB0aGUgSUQgY29sdW1uXG5cdGNvbnN0IGNvbHVtbldpdGhTaXR1YXRpb25zSW5kaWNhdG9yOiBUYWJsZUNvbHVtbiB8IHVuZGVmaW5lZCA9IHRhYmxlQ29sdW1ucy5maW5kKFxuXHRcdChjb2x1bW4pID0+IGNvbHVtbi5mb3JtYXRPcHRpb25zPy5oYXNTaXR1YXRpb25zSW5kaWNhdG9yICE9PSB1bmRlZmluZWQgJiYgY29sdW1uLmZvcm1hdE9wdGlvbnM/Lmhhc1NpdHVhdGlvbnNJbmRpY2F0b3IgPT09IHRydWVcblx0KTtcblx0aWYgKGNvbHVtbldpdGhTaXR1YXRpb25zSW5kaWNhdG9yPy5mb3JtYXRPcHRpb25zKSB7XG5cdFx0Ly8gU3dpdGNoIG9mZiB0aGUgc2l0dWF0aW9ucyBpbmRpY2F0b3IgaW4gdGhlIGZvdW5kIGNvbHVtblxuXHRcdGNvbHVtbldpdGhTaXR1YXRpb25zSW5kaWNhdG9yLmZvcm1hdE9wdGlvbnMuaGFzU2l0dWF0aW9uc0luZGljYXRvciA9IGZhbHNlO1xuXG5cdFx0Ly8gSW5zZXJ0IGEgc2VwYXJhdGUgc2l0dWF0aW9ucyBpbmRpY2F0b3IgY29sdW1uXG5cdFx0Y29uc3Qgc2l0dWF0aW9uc0luZGljYXRvckNvbHVtbjogQ29tcHV0ZWRUYWJsZUNvbHVtbiA9IHtcblx0XHRcdGtleTogXCJzaXR1YXRpb25zSW5kaWNhdG9yXCIsXG5cdFx0XHRuYW1lOiBcInNpdHVhdGlvbnNJbmRpY2F0b3JcIixcblx0XHRcdHByb3BlcnR5S2V5OiBjb2x1bW5XaXRoU2l0dWF0aW9uc0luZGljYXRvci5uYW1lLFxuXHRcdFx0aXNTaXR1YXRpb25zSW5kaWNhdG9yOiB0cnVlLFxuXHRcdFx0YXZhaWxhYmlsaXR5OiBcIkRlZmF1bHRcIixcblx0XHRcdGxhYmVsOiBcIntzYXAuZmUuaTE4bj5DX1NJVFVBVElPTlNfU1RBVFVTX0NPTFVNTl9MQUJFTF9UT09MVElQfVwiLFxuXHRcdFx0dG9vbHRpcDogXCJ7c2FwLmZlLmkxOG4+Q19TSVRVQVRJT05TX1NUQVRVU19DT0xVTU5fTEFCRUxfVE9PTFRJUH1cIixcblx0XHRcdHR5cGU6IENvbHVtblR5cGUuQ29tcHV0ZWQsXG5cdFx0XHRmb3JtYXRPcHRpb25zOiBudWxsLFxuXHRcdFx0ZXhwb3J0U2V0dGluZ3M6IG51bGwsXG5cdFx0XHRjbGlwYm9hcmRTZXR0aW5nczogbnVsbCxcblx0XHRcdHByb3BlcnR5SW5mb3M6IHVuZGVmaW5lZCxcblx0XHRcdGNhc2VTZW5zaXRpdmU6IGZhbHNlXG5cdFx0fTtcblxuXHRcdC8vIFBsYWNlIHRoZSBkcmFmdCBzdGF0dXMgY29sdW1uIGFmdGVyIHRoZSBmaXJzdCB2aXNpYmxlIGNvbHVtblxuXHRcdGNvbnN0IGluZGV4T2ZGaXJzdFZpc2libGVDb2x1bW46IGludCA9IHRhYmxlQ29sdW1ucy5maW5kSW5kZXgoKGNvbHVtbikgPT4gY29sdW1uLmF2YWlsYWJpbGl0eSAhPT0gXCJIaWRkZW5cIik7XG5cdFx0dGFibGVDb2x1bW5zLnNwbGljZShpbmRleE9mRmlyc3RWaXNpYmxlQ29sdW1uICsgMSwgMCwgc2l0dWF0aW9uc0luZGljYXRvckNvbHVtbik7XG5cdH1cblxuXHQvLyBJbiBjYXNlIGEgZ3JpZCB0YWJsZSBvciB0cmVlIHRhYmxlIGlzIHVzZWQsIHdlIGRpc3BsYXkgdGhlIGRyYWZ0IGluZGljYXRvciBpbiBhIHNlcGFyYXRlIGNvbHVtblxuXHQvLyBzbyB3ZSBoYXZlIHRvIGRpc2FibGUgaXQgaGVyZSB0byBlbnN1cmUsIHRoYXQgdGhlIGZpZWxkIGJ1aWxkaW5nIGJsb2NrXG5cdC8vIGRvZXMgbm90IHJlbmRlciBpdCBpbnRvIHRoZSBJRCBjb2x1bW5cblx0Ly8gVGhlIGFkZGl0aW9uYWwgY29sdW1uIGlzIG9ubHkgYWRkZWQgZm9yIHRhYmxlcyBvbiBhIExSIGFuZCBpbiBjYXNlIHRlaGUgZW50aXR5IGlzIGRyYWZ0IGVuYWJsZWQhXG5cdGNvbnN0IGNvbHVtbnNXaXRoRHJhZnRJbmRpY2F0b3I6IFRhYmxlQ29sdW1uW10gPSB0YWJsZUNvbHVtbnMuZmlsdGVyKChjb2x1bW4pID0+IGNvbHVtbi5mb3JtYXRPcHRpb25zPy5oYXNEcmFmdEluZGljYXRvciA9PT0gdHJ1ZSk7XG5cdGlmIChcblx0XHRjb2x1bW5zV2l0aERyYWZ0SW5kaWNhdG9yLmxlbmd0aCAmJlxuXHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0VGVtcGxhdGVUeXBlKCkgPT09IFRlbXBsYXRlVHlwZS5MaXN0UmVwb3J0ICYmXG5cdFx0KE1vZGVsSGVscGVyLmlzRHJhZnROb2RlKGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0KCkpIHx8IE1vZGVsSGVscGVyLmlzRHJhZnRSb290KGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0KCkpKVxuXHQpIHtcblx0XHQvLyBTd2l0Y2ggb2ZmIHRoZSBkcmFmdCBpbmRpY2F0b3IgaW4gdGhlIGZvdW5kIGNvbHVtblxuXHRcdGNvbHVtbnNXaXRoRHJhZnRJbmRpY2F0b3IuZm9yRWFjaCgoY29sdW1uV2l0aERyYWZ0SW5kaWNhdG9yOiBUYWJsZUNvbHVtbikgPT4ge1xuXHRcdFx0aWYgKGNvbHVtbldpdGhEcmFmdEluZGljYXRvcj8uZm9ybWF0T3B0aW9ucykge1xuXHRcdFx0XHRjb2x1bW5XaXRoRHJhZnRJbmRpY2F0b3IuZm9ybWF0T3B0aW9ucy5oYXNEcmFmdEluZGljYXRvciA9IGZhbHNlO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0Ly8gSW5zZXJ0IGEgc2VwYXJhdGUgZHJhZnQgaW5kaWNhdG9yIGNvbHVtblxuXHRcdGNvbnN0IGRyYWZ0SW5kaWNhdG9yQ29sdW1uOiBDb21wdXRlZFRhYmxlQ29sdW1uID0ge1xuXHRcdFx0a2V5OiBcImRyYWZ0U3RhdHVzXCIsXG5cdFx0XHRuYW1lOiBcImRyYWZ0U3RhdHVzXCIsXG5cdFx0XHRwcm9wZXJ0eUtleTogY29sdW1uc1dpdGhEcmFmdEluZGljYXRvclswXS5uYW1lLFxuXHRcdFx0aXNEcmFmdEluZGljYXRvcjogdHJ1ZSxcblx0XHRcdGF2YWlsYWJpbGl0eTogXCJEZWZhdWx0XCIsXG5cdFx0XHRsYWJlbDogXCJ7c2FwLmZlLmkxOG4+Q19EUkFGVF9TVEFUVVNfQ09MVU1OX0xBQkVMX1RPT0xUSVB9XCIsXG5cdFx0XHR0b29sdGlwOiBcIntzYXAuZmUuaTE4bj5DX0RSQUZUX1NUQVRVU19DT0xVTU5fTEFCRUxfVE9PTFRJUH1cIixcblx0XHRcdHR5cGU6IENvbHVtblR5cGUuQ29tcHV0ZWQsXG5cdFx0XHRmb3JtYXRPcHRpb25zOiBudWxsLFxuXHRcdFx0ZXhwb3J0U2V0dGluZ3M6IG51bGwsXG5cdFx0XHRjYXNlU2Vuc2l0aXZlOiBmYWxzZVxuXHRcdH07XG5cdFx0bGV0IGNvbHVtbkluZGV4VG9JbnNlcnRBZnRlcjogaW50ID0gMDtcblx0XHRpZiAoY29sdW1uV2l0aFNpdHVhdGlvbnNJbmRpY2F0b3IpIHtcblx0XHRcdC8vIElmIHRoZXJlJ3MgYSBzaXR1YXRpb25zIGluZGljYXRvciBjb2x1bW4sIHBsYWNlIHRoZSBkcmFmdCBzdGF0dXMgY29sdW1uIGJlZm9yZSBpdFxuXHRcdFx0Y29sdW1uSW5kZXhUb0luc2VydEFmdGVyID1cblx0XHRcdFx0dGFibGVDb2x1bW5zLmZpbmRJbmRleCgoY29sdW1uKSA9PiAoY29sdW1uIGFzIENvbXB1dGVkVGFibGVDb2x1bW4pLmlzU2l0dWF0aW9uc0luZGljYXRvciA9PT0gdHJ1ZSkgLSAxO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBPdGhlcndpc2UgcGxhY2UgdGhlIGRyYWZ0IHN0YXR1cyBjb2x1bW4gYWZ0ZXIgdGhlIGZpcnN0IHZpc2libGUgY29sdW1uXG5cdFx0XHRjb2x1bW5JbmRleFRvSW5zZXJ0QWZ0ZXIgPSB0YWJsZUNvbHVtbnMuZmluZEluZGV4KChjb2x1bW4pID0+IGNvbHVtbi5hdmFpbGFiaWxpdHkgIT09IFwiSGlkZGVuXCIpO1xuXHRcdH1cblx0XHR0YWJsZUNvbHVtbnMuc3BsaWNlKGNvbHVtbkluZGV4VG9JbnNlcnRBZnRlciArIDEsIDAsIGRyYWZ0SW5kaWNhdG9yQ29sdW1uKTtcblxuXHRcdC8vIE9uIGFuIGFuYWx5dGljYWwgdGFibGUsIHdlIG5lZWQgdG8gZXhwbGljaXRlbHkgbG9hZCBzb21lIGRhdGEgZm9yIHRoZSBkcmFmdCBpbmRpY2F0b3IgY29sdW1uIC0tPiB3ZSBhZGQgcmVmZXJlbmNlZCBjb2x1bW5zIGZvciB0aGF0XG5cdFx0aWYgKHRhYmxlVHlwZSA9PT0gXCJBbmFseXRpY2FsVGFibGVcIikge1xuXHRcdFx0YWRkUmVmZXJlbmNlc0ZvckRyYWZ0SW5kaWNhdG9yQ29sdW1uKGRyYWZ0SW5kaWNhdG9yQ29sdW1uLCB0YWJsZUNvbHVtbnMsIGNvbnZlcnRlckNvbnRleHQpO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiB0YWJsZUNvbHVtbnM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRQMTNuTW9kZShcblx0dmlzdWFsaXphdGlvblBhdGg6IHN0cmluZyxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+LFxuXHR0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbjogVGFibGVDb250cm9sQ29uZmlndXJhdGlvblxuKTogVGFibGVQMTNuTW9kZVtdIHwgdW5kZWZpbmVkIHtcblx0Y29uc3QgbWFuaWZlc3RXcmFwcGVyOiBNYW5pZmVzdFdyYXBwZXIgPSBjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0V3JhcHBlcigpO1xuXHRjb25zdCB0YWJsZU1hbmlmZXN0U2V0dGluZ3M6IFRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uID0gY29udmVydGVyQ29udGV4dC5nZXRNYW5pZmVzdENvbnRyb2xDb25maWd1cmF0aW9uKHZpc3VhbGl6YXRpb25QYXRoKTtcblx0Y29uc3QgdmFyaWFudE1hbmFnZW1lbnQ6IFZhcmlhbnRNYW5hZ2VtZW50VHlwZSA9IG1hbmlmZXN0V3JhcHBlci5nZXRWYXJpYW50TWFuYWdlbWVudCgpO1xuXHRjb25zdCBtb2RlczogVGFibGVQMTNuTW9kZVtdID0gW107XG5cdGNvbnN0IGlzQW5hbHl0aWNhbFRhYmxlID0gdGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24udHlwZSA9PT0gXCJBbmFseXRpY2FsVGFibGVcIjtcblx0Y29uc3QgaXNSZXNwb25zaXZlVGFibGUgPSB0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbi50eXBlID09PSBcIlJlc3BvbnNpdmVUYWJsZVwiO1xuXHRpZiAodGFibGVNYW5pZmVzdFNldHRpbmdzPy50YWJsZVNldHRpbmdzPy5wZXJzb25hbGl6YXRpb24gIT09IHVuZGVmaW5lZCkge1xuXHRcdC8vIFBlcnNvbmFsaXphdGlvbiBjb25maWd1cmVkIGluIG1hbmlmZXN0LlxuXHRcdGNvbnN0IHBlcnNvbmFsaXphdGlvbiA9IHRhYmxlTWFuaWZlc3RTZXR0aW5ncy50YWJsZVNldHRpbmdzLnBlcnNvbmFsaXphdGlvbjtcblx0XHRpZiAocGVyc29uYWxpemF0aW9uID09PSB0cnVlKSB7XG5cdFx0XHQvLyBUYWJsZSBwZXJzb25hbGl6YXRpb24gZnVsbHkgZW5hYmxlZC5cblx0XHRcdHN3aXRjaCAodGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24udHlwZSkge1xuXHRcdFx0XHRjYXNlIFwiQW5hbHl0aWNhbFRhYmxlXCI6XG5cdFx0XHRcdFx0cmV0dXJuIFtcIlNvcnRcIiwgXCJDb2x1bW5cIiwgXCJGaWx0ZXJcIiwgXCJHcm91cFwiLCBcIkFnZ3JlZ2F0ZVwiXTtcblx0XHRcdFx0Y2FzZSBcIlJlc3BvbnNpdmVUYWJsZVwiOlxuXHRcdFx0XHRcdHJldHVybiBbXCJTb3J0XCIsIFwiQ29sdW1uXCIsIFwiRmlsdGVyXCIsIFwiR3JvdXBcIl07XG5cdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0cmV0dXJuIFtcIlNvcnRcIiwgXCJDb2x1bW5cIiwgXCJGaWx0ZXJcIl07XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmICh0eXBlb2YgcGVyc29uYWxpemF0aW9uID09PSBcIm9iamVjdFwiKSB7XG5cdFx0XHQvLyBTcGVjaWZpYyBwZXJzb25hbGl6YXRpb24gb3B0aW9ucyBlbmFibGVkIGluIG1hbmlmZXN0LiBVc2UgdGhlbSBhcyBpcy5cblx0XHRcdGlmIChwZXJzb25hbGl6YXRpb24uc29ydCkge1xuXHRcdFx0XHRtb2Rlcy5wdXNoKFwiU29ydFwiKTtcblx0XHRcdH1cblx0XHRcdGlmIChwZXJzb25hbGl6YXRpb24uY29sdW1uKSB7XG5cdFx0XHRcdG1vZGVzLnB1c2goXCJDb2x1bW5cIik7XG5cdFx0XHR9XG5cdFx0XHRpZiAocGVyc29uYWxpemF0aW9uLmZpbHRlcikge1xuXHRcdFx0XHRtb2Rlcy5wdXNoKFwiRmlsdGVyXCIpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHBlcnNvbmFsaXphdGlvbi5ncm91cCAmJiAoaXNBbmFseXRpY2FsVGFibGUgfHwgaXNSZXNwb25zaXZlVGFibGUpKSB7XG5cdFx0XHRcdG1vZGVzLnB1c2goXCJHcm91cFwiKTtcblx0XHRcdH1cblx0XHRcdGlmIChwZXJzb25hbGl6YXRpb24uYWdncmVnYXRlICYmIGlzQW5hbHl0aWNhbFRhYmxlKSB7XG5cdFx0XHRcdG1vZGVzLnB1c2goXCJBZ2dyZWdhdGVcIik7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbW9kZXMubGVuZ3RoID4gMCA/IG1vZGVzIDogdW5kZWZpbmVkO1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHQvLyBObyBwZXJzb25hbGl6YXRpb24gY29uZmlndXJlZCBpbiBtYW5pZmVzdC5cblx0XHRtb2Rlcy5wdXNoKFwiU29ydFwiKTtcblx0XHRtb2Rlcy5wdXNoKFwiQ29sdW1uXCIpO1xuXHRcdGlmIChjb252ZXJ0ZXJDb250ZXh0LmdldFRlbXBsYXRlVHlwZSgpID09PSBUZW1wbGF0ZVR5cGUuTGlzdFJlcG9ydCkge1xuXHRcdFx0aWYgKHZhcmlhbnRNYW5hZ2VtZW50ID09PSBWYXJpYW50TWFuYWdlbWVudFR5cGUuQ29udHJvbCB8fCBfaXNGaWx0ZXJCYXJIaWRkZW4obWFuaWZlc3RXcmFwcGVyLCBjb252ZXJ0ZXJDb250ZXh0KSkge1xuXHRcdFx0XHQvLyBGZWF0dXJlIHBhcml0eSB3aXRoIFYyLlxuXHRcdFx0XHQvLyBFbmFibGUgdGFibGUgZmlsdGVyaW5nIGJ5IGRlZmF1bHQgb25seSBpbiBjYXNlIG9mIENvbnRyb2wgbGV2ZWwgdmFyaWFudCBtYW5hZ2VtZW50LlxuXHRcdFx0XHQvLyBPciB3aGVuIHRoZSBMUiBmaWx0ZXIgYmFyIGlzIGhpZGRlbiB2aWEgbWFuaWZlc3Qgc2V0dGluZ1xuXHRcdFx0XHRtb2Rlcy5wdXNoKFwiRmlsdGVyXCIpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRtb2Rlcy5wdXNoKFwiRmlsdGVyXCIpO1xuXHRcdH1cblx0XHRpZiAoaXNBbmFseXRpY2FsVGFibGUpIHtcblx0XHRcdG1vZGVzLnB1c2goXCJHcm91cFwiKTtcblx0XHRcdG1vZGVzLnB1c2goXCJBZ2dyZWdhdGVcIik7XG5cdFx0fVxuXHRcdGlmIChpc1Jlc3BvbnNpdmVUYWJsZSkge1xuXHRcdFx0bW9kZXMucHVzaChcIkdyb3VwXCIpO1xuXHRcdH1cblx0XHRyZXR1cm4gbW9kZXM7XG5cdH1cbn1cbi8qKlxuICogUmV0dXJucyBhIEJvb2xlYW4gdmFsdWUgc3VnZ2VzdGluZyBpZiBhIGZpbHRlciBiYXIgaXMgYmVpbmcgdXNlZCBvbiB0aGUgcGFnZS5cbiAqXG4gKiBDaGFydCBoYXMgYSBkZXBlbmRlbmN5IHRvIGZpbHRlciBiYXIgKGlzc3VlIHdpdGggbG9hZGluZyBkYXRhKS4gT25jZSByZXNvbHZlZCwgdGhlIGNoZWNrIGZvciBjaGFydCBzaG91bGQgYmUgcmVtb3ZlZCBoZXJlLlxuICogVW50aWwgdGhlbiwgaGlkaW5nIGZpbHRlciBiYXIgaXMgbm93IGFsbG93ZWQgaWYgYSBjaGFydCBpcyBiZWluZyB1c2VkIG9uIExSLlxuICogQHBhcmFtIG1hbmlmZXN0V3JhcHBlciBNYW5pZmVzdCBzZXR0aW5ncyBnZXR0ZXIgZm9yIHRoZSBwYWdlXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCBUaGUgaW5zdGFuY2Ugb2YgdGhlIGNvbnZlcnRlciBjb250ZXh0XG4gKiBAcmV0dXJucyBCb29sZWFuIHN1Z2dlc3RpbmcgaWYgYSBmaWx0ZXIgYmFyIGlzIGJlaW5nIHVzZWQgb24gdGhlIHBhZ2UuXG4gKi9cbmZ1bmN0aW9uIF9pc0ZpbHRlckJhckhpZGRlbihtYW5pZmVzdFdyYXBwZXI6IE1hbmlmZXN0V3JhcHBlciwgY29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+KTogYm9vbGVhbiB7XG5cdHJldHVybiAoXG5cdFx0bWFuaWZlc3RXcmFwcGVyLmlzRmlsdGVyQmFySGlkZGVuKCkgJiZcblx0XHQhY29udmVydGVyQ29udGV4dC5nZXRNYW5pZmVzdFdyYXBwZXIoKS5oYXNNdWx0aXBsZVZpc3VhbGl6YXRpb25zKCkgJiZcblx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldFRlbXBsYXRlVHlwZSgpICE9PSBUZW1wbGF0ZVR5cGUuQW5hbHl0aWNhbExpc3RQYWdlXG5cdCk7XG59XG4vKipcbiAqIFJldHVybnMgYSBKU09OIHN0cmluZyBjb250YWluaW5nIHRoZSBzb3J0IGNvbmRpdGlvbnMgZm9yIHRoZSBwcmVzZW50YXRpb24gdmFyaWFudC5cbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBpbnN0YW5jZSBvZiB0aGUgY29udmVydGVyIGNvbnRleHRcbiAqIEBwYXJhbSBwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbiBQcmVzZW50YXRpb24gdmFyaWFudCBhbm5vdGF0aW9uXG4gKiBAcGFyYW0gY29sdW1ucyBUYWJsZSBjb2x1bW5zIHByb2Nlc3NlZCBieSB0aGUgY29udmVydGVyXG4gKiBAcmV0dXJucyBTb3J0IGNvbmRpdGlvbnMgZm9yIGEgcHJlc2VudGF0aW9uIHZhcmlhbnQuXG4gKi9cbmZ1bmN0aW9uIGdldFNvcnRDb25kaXRpb25zKFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sXG5cdHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uOiBQcmVzZW50YXRpb25WYXJpYW50VHlwZSB8IHVuZGVmaW5lZCxcblx0Y29sdW1uczogVGFibGVDb2x1bW5bXVxuKTogVGFibGVTb3J0Q29uZGl0aW9ucyB8IHVuZGVmaW5lZCB7XG5cdC8vIEN1cnJlbnRseSBuYXZpZ2F0aW9uIHByb3BlcnR5IGlzIG5vdCBzdXBwb3J0ZWQgYXMgc29ydGVyXG5cdGNvbnN0IG5vblNvcnRhYmxlUHJvcGVydGllcyA9IGdldFJlc3RyaWN0aW9uc09uUHJvcGVydGllcyhjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVNldCgpKS5ub25Tb3J0YWJsZVByb3BlcnRpZXM7XG5cdGNvbnN0IHNvcnRDb25kaXRpb25zOiBUYWJsZVNvcnRDb25kaXRpb25zID0ge1xuXHRcdHNvcnRlcnM6IFtdXG5cdH07XG5cdGlmIChwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbj8uU29ydE9yZGVyKSB7XG5cdFx0cHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24uU29ydE9yZGVyLmZvckVhY2goKGNvbmRpdGlvbikgPT4ge1xuXHRcdFx0Y29uc3QgY29uZGl0aW9uUHJvcGVydHkgPSBjb25kaXRpb24uUHJvcGVydHk7XG5cdFx0XHRpZiAoY29uZGl0aW9uUHJvcGVydHk/LiR0YXJnZXQgIT09IHVuZGVmaW5lZCAmJiAhbm9uU29ydGFibGVQcm9wZXJ0aWVzLmluY2x1ZGVzKGNvbmRpdGlvblByb3BlcnR5LiR0YXJnZXQubmFtZSkpIHtcblx0XHRcdFx0Y29uc3QgaW5mb05hbWUgPSBjb252ZXJ0UHJvcGVydHlQYXRoc1RvSW5mb05hbWVzKFtjb25kaXRpb25Qcm9wZXJ0eV0sIGNvbHVtbnMpWzBdO1xuXHRcdFx0XHRpZiAoaW5mb05hbWUpIHtcblx0XHRcdFx0XHRzb3J0Q29uZGl0aW9ucy5zb3J0ZXJzLnB1c2goe1xuXHRcdFx0XHRcdFx0bmFtZTogaW5mb05hbWUsXG5cdFx0XHRcdFx0XHRkZXNjZW5kaW5nOiAhIWNvbmRpdGlvbi5EZXNjZW5kaW5nXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXHRyZXR1cm4gc29ydENvbmRpdGlvbnMuc29ydGVycy5sZW5ndGggPyBzb3J0Q29uZGl0aW9ucyA6IHVuZGVmaW5lZDtcbn1cbmZ1bmN0aW9uIGdldEluaXRpYWxFeHBhbnNpb25MZXZlbChwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbjogUHJlc2VudGF0aW9uVmFyaWFudFR5cGUgfCB1bmRlZmluZWQpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuXHRpZiAoIXByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uKSB7XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxuXHRjb25zdCBsZXZlbCA9IHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uLkluaXRpYWxFeHBhbnNpb25MZXZlbD8udmFsdWVPZigpO1xuXHRyZXR1cm4gdHlwZW9mIGxldmVsID09PSBcIm51bWJlclwiID8gbGV2ZWwgOiB1bmRlZmluZWQ7XG59XG4vKipcbiAqIENvbnZlcnRzIGFuIGFycmF5IG9mIHByb3BlcnR5UGF0aCB0byBhbiBhcnJheSBvZiBwcm9wZXJ0eUluZm8gbmFtZXMuXG4gKiBAcGFyYW0gcGF0aHMgVGhlIGFycmF5IHRvIGJlIGNvbnZlcnRlZFxuICogQHBhcmFtIGNvbHVtbnMgVGhlIGFycmF5IG9mIHByb3BlcnR5SW5mb3NcbiAqIEByZXR1cm5zIEFuIGFycmF5IG9mIHByb3BlcnR5SW5mbyBuYW1lc1xuICovXG5mdW5jdGlvbiBjb252ZXJ0UHJvcGVydHlQYXRoc1RvSW5mb05hbWVzKHBhdGhzOiBQcm9wZXJ0eVBhdGhbXSwgY29sdW1uczogVGFibGVDb2x1bW5bXSk6IHN0cmluZ1tdIHtcblx0Y29uc3QgaW5mb05hbWVzOiBzdHJpbmdbXSA9IFtdO1xuXHRsZXQgcHJvcGVydHlJbmZvOiBUYWJsZUNvbHVtbiB8IHVuZGVmaW5lZCwgYW5ub3RhdGlvbkNvbHVtbjogQW5ub3RhdGlvblRhYmxlQ29sdW1uO1xuXHRwYXRocy5mb3JFYWNoKChjdXJyZW50UGF0aCkgPT4ge1xuXHRcdGlmIChjdXJyZW50UGF0aD8udmFsdWUpIHtcblx0XHRcdHByb3BlcnR5SW5mbyA9IGNvbHVtbnMuZmluZCgoY29sdW1uKSA9PiB7XG5cdFx0XHRcdGFubm90YXRpb25Db2x1bW4gPSBjb2x1bW4gYXMgQW5ub3RhdGlvblRhYmxlQ29sdW1uO1xuXHRcdFx0XHRyZXR1cm4gIWFubm90YXRpb25Db2x1bW4ucHJvcGVydHlJbmZvcyAmJiBhbm5vdGF0aW9uQ29sdW1uLnJlbGF0aXZlUGF0aCA9PT0gY3VycmVudFBhdGg/LnZhbHVlO1xuXHRcdFx0fSk7XG5cdFx0XHRpZiAocHJvcGVydHlJbmZvKSB7XG5cdFx0XHRcdGluZm9OYW1lcy5wdXNoKHByb3BlcnR5SW5mby5uYW1lKTtcblx0XHRcdH1cblx0XHR9XG5cdH0pO1xuXHRyZXR1cm4gaW5mb05hbWVzO1xufVxuLyoqXG4gKiBSZXR1cm5zIGEgSlNPTiBzdHJpbmcgY29udGFpbmluZyBQcmVzZW50YXRpb24gVmFyaWFudCBncm91cCBjb25kaXRpb25zLlxuICogQHBhcmFtIHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uIFByZXNlbnRhdGlvbiB2YXJpYW50IGFubm90YXRpb25cbiAqIEBwYXJhbSBjb2x1bW5zIENvbnZlcnRlciBwcm9jZXNzZWQgdGFibGUgY29sdW1uc1xuICogQHBhcmFtIHRhYmxlVHlwZSBUaGUgdGFibGUgdHlwZS5cbiAqIEByZXR1cm5zIEdyb3VwIGNvbmRpdGlvbnMgZm9yIGEgUHJlc2VudGF0aW9uIHZhcmlhbnQuXG4gKi9cbmZ1bmN0aW9uIGdldEdyb3VwQ29uZGl0aW9ucyhcblx0cHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb246IFByZXNlbnRhdGlvblZhcmlhbnRUeXBlIHwgdW5kZWZpbmVkLFxuXHRjb2x1bW5zOiBUYWJsZUNvbHVtbltdLFxuXHR0YWJsZVR5cGU6IHN0cmluZ1xuKTogVGFibGVHcm91cENvbmRpdGlvbnMgfCB1bmRlZmluZWQge1xuXHRjb25zdCBncm91cENvbmRpdGlvbnM6IFRhYmxlR3JvdXBDb25kaXRpb25zID0ge1xuXHRcdGdyb3VwTGV2ZWxzOiBbXVxuXHR9O1xuXHRpZiAocHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24/Lkdyb3VwQnkpIHtcblx0XHRsZXQgYUdyb3VwQnkgPSBwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbi5Hcm91cEJ5O1xuXHRcdGlmICh0YWJsZVR5cGUgPT09IFwiUmVzcG9uc2l2ZVRhYmxlXCIpIHtcblx0XHRcdGFHcm91cEJ5ID0gYUdyb3VwQnkuc2xpY2UoMCwgMSk7XG5cdFx0fVxuXHRcdGdyb3VwQ29uZGl0aW9ucy5ncm91cExldmVscyA9IGNvbnZlcnRQcm9wZXJ0eVBhdGhzVG9JbmZvTmFtZXMoYUdyb3VwQnksIGNvbHVtbnMpLm1hcCgoaW5mb05hbWUpID0+IHtcblx0XHRcdHJldHVybiB7IG5hbWU6IGluZm9OYW1lIH07XG5cdFx0fSk7XG5cdH1cblx0cmV0dXJuIGdyb3VwQ29uZGl0aW9ucy5ncm91cExldmVscy5sZW5ndGggPyBncm91cENvbmRpdGlvbnMgOiB1bmRlZmluZWQ7XG59XG4vKipcbiAqIFVwZGF0ZXMgdGhlIGNvbHVtbidzIHByb3BlcnR5SW5mb3Mgb2YgYSBhbmFseXRpY2FsIHRhYmxlIGludGVncmF0aW5nIGFsbCBleHRlbnNpb25zIGFuZCBiaW5kaW5nLXJlbGV2YW50IHByb3BlcnR5IGluZm8gcGFydC5cbiAqIEBwYXJhbSB0YWJsZVZpc3VhbGl6YXRpb24gVGhlIHZpc3VhbGl6YXRpb24gdG8gYmUgdXBkYXRlZFxuICovXG5mdW5jdGlvbiBfdXBkYXRlUHJvcGVydHlJbmZvc1dpdGhBZ2dyZWdhdGVzRGVmaW5pdGlvbnModGFibGVWaXN1YWxpemF0aW9uOiBUYWJsZVZpc3VhbGl6YXRpb24pOiB2b2lkIHtcblx0Y29uc3QgcmVsYXRlZEFkZGl0aW9uYWxQcm9wZXJ0eU5hbWVNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblx0dGFibGVWaXN1YWxpemF0aW9uLmNvbHVtbnMuZm9yRWFjaCgoY29sdW1uKSA9PiB7XG5cdFx0Y29sdW1uID0gY29sdW1uIGFzIEFubm90YXRpb25UYWJsZUNvbHVtbjtcblx0XHRjb25zdCBhZ2dyZWdhdGFibGVQcm9wZXJ0eU5hbWUgPSBPYmplY3Qua2V5cyh0YWJsZVZpc3VhbGl6YXRpb24uYW5hbHl0aWNzRXh0ZW5zaW9ucyEpLmZpbmQoXG5cdFx0XHQoYWdncmVnYXRlKSA9PiBhZ2dyZWdhdGUgPT09IGNvbHVtbi5uYW1lXG5cdFx0KTtcblx0XHRpZiAoYWdncmVnYXRhYmxlUHJvcGVydHlOYW1lKSB7XG5cdFx0XHRjb25zdCBhZ2dyZWdhdGFibGVQcm9wZXJ0eURlZmluaXRpb24gPSB0YWJsZVZpc3VhbGl6YXRpb24uYW5hbHl0aWNzRXh0ZW5zaW9ucyFbYWdncmVnYXRhYmxlUHJvcGVydHlOYW1lXTtcblx0XHRcdGNvbHVtbi5hZ2dyZWdhdGFibGUgPSAhYWdncmVnYXRhYmxlUHJvcGVydHlEZWZpbml0aW9uLmZyb21Hcm91cGFibGVQcm9wZXJ0eTtcblx0XHRcdGNvbHVtbi5leHRlbnNpb24gPSBhZ2dyZWdhdGFibGVQcm9wZXJ0eURlZmluaXRpb24gPz8ge307XG5cdFx0fVxuXHRcdGlmIChjb2x1bW4uYWRkaXRpb25hbFByb3BlcnR5SW5mb3M/Lmxlbmd0aCkge1xuXHRcdFx0Y29sdW1uLmFkZGl0aW9uYWxQcm9wZXJ0eUluZm9zLmZvckVhY2goKGFkZGl0aW9uYWxQcm9wZXJ0eUluZm8pID0+IHtcblx0XHRcdFx0Ly8gQ3JlYXRlIHByb3BlcnR5SW5mbyBmb3IgZWFjaCBhZGRpdGlvbmFsIHByb3BlcnR5LlxuXHRcdFx0XHQvLyBUaGUgbmV3IHByb3BlcnR5ICduYW1lJyBoYXMgYmVlbiBwcmVmaXhlZCB3aXRoICdQcm9wZXJ0eV9UZWNobmljYWw6OicgZm9yIHVuaXF1ZW5lc3MgYW5kIGl0IGhhcyBiZWVuIG5hbWVkIHRlY2huaWNhbCBwcm9wZXJ0eSBhcyBpdCByZXF1aXJlcyBkZWRpY2F0ZWQgTURDIGF0dHJpYnV0ZXMgKHRlY2huaWNhbGx5R3JvdXBhYmxlIGFuZCB0ZWNobmljYWxseUFnZ3JlZ2F0YWJsZSkuXG5cdFx0XHRcdGNyZWF0ZVRlY2huaWNhbFByb3BlcnR5KGFkZGl0aW9uYWxQcm9wZXJ0eUluZm8sIHRhYmxlVmlzdWFsaXphdGlvbi5jb2x1bW5zLCByZWxhdGVkQWRkaXRpb25hbFByb3BlcnR5TmFtZU1hcCk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdH0pO1xuXHR0YWJsZVZpc3VhbGl6YXRpb24uY29sdW1ucy5mb3JFYWNoKChjb2x1bW4pID0+IHtcblx0XHRjb2x1bW4gPSBjb2x1bW4gYXMgQW5ub3RhdGlvblRhYmxlQ29sdW1uO1xuXHRcdGlmIChjb2x1bW4uYWRkaXRpb25hbFByb3BlcnR5SW5mb3MpIHtcblx0XHRcdGNvbHVtbi5hZGRpdGlvbmFsUHJvcGVydHlJbmZvcyA9IGNvbHVtbi5hZGRpdGlvbmFsUHJvcGVydHlJbmZvcy5tYXAoXG5cdFx0XHRcdChwcm9wZXJ0eUluZm8pID0+IHJlbGF0ZWRBZGRpdGlvbmFsUHJvcGVydHlOYW1lTWFwW3Byb3BlcnR5SW5mb10gPz8gcHJvcGVydHlJbmZvXG5cdFx0XHQpO1xuXHRcdFx0Ly8gQWRkIGFkZGl0aW9uYWwgcHJvcGVydGllcyB0byB0aGUgY29tcGxleCBwcm9wZXJ0eSB1c2luZyB0aGUgaGlkZGVuIGFubm90YXRpb24uXG5cdFx0XHRjb2x1bW4ucHJvcGVydHlJbmZvcyA9IGNvbHVtbi5wcm9wZXJ0eUluZm9zPy5jb25jYXQoY29sdW1uLmFkZGl0aW9uYWxQcm9wZXJ0eUluZm9zKTtcblx0XHR9XG5cdH0pO1xufVxuLyoqXG4gKiBQcm92aWRlcyB0aGUgcmVxdWlyZWQgcHJvcGVydGllcyBzZXQgb24gdGhlIGFubm90YXRpb25zLlxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgIFRoZSBpbnN0YW5jZSBvZiB0aGUgY29udmVydGVyIGNvbnRleHRcbiAqIEByZXR1cm5zIFRoZSBwYXRocyBvZiB0aGUgcmVzdHJpY3RlZCBwcm9wZXJ0aWVzXG4gKi9cbmZ1bmN0aW9uIGdldFJlcXVpcmVkUHJvcGVydGllcyhjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4pOiBQcm9wZXJ0eVBhdGhbXSB7XG5cdHJldHVybiBnZXRDb250ZXh0UHJvcGVydHlSZXN0cmljdGlvbihcblx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldERhdGFNb2RlbE9iamVjdFBhdGgoKSxcblx0XHQoY2FwYWJpbGl0aWVzKSA9PiB7XG5cdFx0XHRyZXR1cm4gKGNhcGFiaWxpdGllcyBhcyBFbnRpdHlTZXRBbm5vdGF0aW9uc19DYXBhYmlsaXRpZXMgfCB1bmRlZmluZWQpPy5JbnNlcnRSZXN0cmljdGlvbnM/LlJlcXVpcmVkUHJvcGVydGllcztcblx0XHR9LFxuXHRcdGZhbHNlXG5cdCk7XG59XG4vKipcbiAqIERldGVybWluZXMgaWYgdGhlIHByb3BlcnR5IGlzIGFubm90YXRlZCBhcyBhIHJlcXVpcmVkIHByb3BlcnR5LlxuICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5XG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCBUaGUgaW5zdGFuY2Ugb2YgdGhlIGNvbnZlcnRlciBjb250ZXh0XG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBwcm9wZXJ0eSBpcyByZXF1aXJlZFxuICovXG5mdW5jdGlvbiBpc0Fubm90YXRlZFJlcXVpcmVkUHJvcGVydHkobmFtZTogc3RyaW5nLCBjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4pOiBib29sZWFuIHtcblx0cmV0dXJuIGdldFJlcXVpcmVkUHJvcGVydGllcyhjb252ZXJ0ZXJDb250ZXh0KVxuXHRcdC5tYXAoKHByb3BlcnR5KSA9PiBwcm9wZXJ0eS4kdGFyZ2V0Py5mdWxseVF1YWxpZmllZE5hbWUpXG5cdFx0LmluY2x1ZGVzKG5hbWUpO1xufVxuLyoqXG4gKiBSZXR1cm5zIGEgSlNPTiBzdHJpbmcgY29udGFpbmluZyBQcmVzZW50YXRpb24gVmFyaWFudCBhZ2dyZWdhdGUgY29uZGl0aW9ucy5cbiAqIEBwYXJhbSBwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbiBQcmVzZW50YXRpb24gdmFyaWFudCBhbm5vdGF0aW9uXG4gKiBAcGFyYW0gY29sdW1ucyBDb252ZXJ0ZXIgcHJvY2Vzc2VkIHRhYmxlIGNvbHVtbnNcbiAqIEBwYXJhbSBleHRlbnNpb25JbmZvTWFwXG4gKiBAcmV0dXJucyBHcm91cCBjb25kaXRpb25zIGZvciBhIFByZXNlbnRhdGlvbiB2YXJpYW50LlxuICovXG5mdW5jdGlvbiBnZXRBZ2dyZWdhdGVDb25kaXRpb25zKFxuXHRwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbjogUHJlc2VudGF0aW9uVmFyaWFudFR5cGUgfCB1bmRlZmluZWQsXG5cdGNvbHVtbnM6IFRhYmxlQ29sdW1uW10sXG5cdGV4dGVuc2lvbkluZm9NYXA6IFJlY29yZDxzdHJpbmcsIEludGVybmFsRXh0ZW5zaW9uRm9yQW5hbHl0aWNzPlxuKTogVGFibGVBZ2dyZWdhdGVDb25kaXRpb25zIHwgdW5kZWZpbmVkIHtcblx0Y29uc3QgYWdncmVnYXRlQ29uZGl0aW9uczogVGFibGVBZ2dyZWdhdGVDb25kaXRpb25zID0ge307XG5cdGlmIChwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbj8uVG90YWwpIHtcblx0XHRjb25zdCBhVG90YWxzID0gcHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24uVG90YWw7XG5cdFx0Y29udmVydFByb3BlcnR5UGF0aHNUb0luZm9OYW1lcyhhVG90YWxzLCBjb2x1bW5zKS5mb3JFYWNoKChpbmZvTmFtZSkgPT4ge1xuXHRcdFx0YWdncmVnYXRlQ29uZGl0aW9uc1tpbmZvTmFtZV0gPSB7fTtcblx0XHR9KTtcblx0fSBlbHNlIHtcblx0XHRmb3IgKGNvbnN0IGtleSBpbiBleHRlbnNpb25JbmZvTWFwKSB7XG5cdFx0XHRpZiAoIWV4dGVuc2lvbkluZm9NYXBba2V5XS5mcm9tR3JvdXBhYmxlUHJvcGVydHkpIHtcblx0XHRcdFx0YWdncmVnYXRlQ29uZGl0aW9uc1trZXldID0ge307XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdHJldHVybiBPYmplY3Qua2V5cyhhZ2dyZWdhdGVDb25kaXRpb25zKS5sZW5ndGggPyBhZ2dyZWdhdGVDb25kaXRpb25zIDogdW5kZWZpbmVkO1xufVxuZXhwb3J0IHR5cGUgU3RhbmRhcmRBY3Rpb25zQ29uZmlndXJhdGlvbiA9IHtcblx0Y3JlYXRpb25CZWhhdmlvdXI6IFRhYmxlQW5ub3RhdGlvbkNvbmZpZ3VyYXRpb25bXCJjcmVhdGVcIl07XG5cdGN1dEJ1dHRvblZpc2liaWxpdHlFeHByZXNzaW9uOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj47XG5cdGRlbGV0ZUJ1dHRvblZpc2liaWxpdHlFeHByZXNzaW9uOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj47XG5cdG1hc3NFZGl0QnV0dG9uVmlzaWJpbGl0eUV4cHJlc3Npb246IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPjtcblx0aXNJbnNlcnRVcGRhdGVBY3Rpb25zVGVtcGxhdGVkOiBib29sZWFuO1xuXHRzdGFuZGFyZEFjdGlvbnM6IHtcblx0XHRjcmVhdGU6IFN0YW5kYXJkQWN0aW9uO1xuXHRcdGRlbGV0ZTogU3RhbmRhcmRBY3Rpb247XG5cdFx0cGFzdGU6IFN0YW5kYXJkQWN0aW9uO1xuXHRcdG1hc3NFZGl0OiBTdGFuZGFyZEFjdGlvbjtcblx0XHRpbnNpZ2h0czogU3RhbmRhcmRBY3Rpb247XG5cdFx0Y3JlYXRpb25Sb3c6IFN0YW5kYXJkQWN0aW9uO1xuXHRcdGN1dDogU3RhbmRhcmRBY3Rpb247XG5cdFx0bW92ZVVwPzogU3RhbmRhcmRBY3Rpb247XG5cdFx0bW92ZURvd24/OiBTdGFuZGFyZEFjdGlvbjtcblx0fTtcbn07XG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIHN0YW5kYXJkIGFjdGlvbnMgYW5kIGFkamFjZW50IHByb3BlcnRpZXMgdGhhdCBhcmUgbmVlZGVkIGluIHRoZSBmdXJ0aGVyIGNvbnZlcnNpb24gcHJvY2Vzcy5cbiAqIEBwYXJhbSBsaW5lSXRlbUFubm90YXRpb24gQ29sbGVjdGlvbiBvZiBkYXRhIGZpZWxkcyB1c2VkIGZvciByZXByZXNlbnRhdGlvbiBpbiBhIHRhYmxlIG9yIGxpc3RcbiAqIEBwYXJhbSB2aXN1YWxpemF0aW9uUGF0aCBUaGUgdmlzdWFsaXphdGlvbiBwYXRoXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCBUaGUgaW5zdGFuY2Ugb2YgdGhlIGNvbnZlcnRlciBjb250ZXh0XG4gKiBAcGFyYW0gdGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24gVGhlIHRhYmxlIG1hbmlmZXN0IGNvbmZpZ3VyYXRpb25cbiAqIEBwYXJhbSBuYXZpZ2F0aW9uU2V0dGluZ3MgVGhlIG5hdmlnYXRpb24gdGFyZ2V0IG1hbmlmZXN0IGNvbmZpZ3VyYXRpb25cbiAqIEByZXR1cm5zIFN0YW5kYXJkIGFjdGlvbnMgYW5kIGNvbm5lY3RlZCBwcm9wZXJ0aWVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTdGFuZGFyZEFjdGlvbnNDb25maWd1cmF0aW9uKFxuXHRsaW5lSXRlbUFubm90YXRpb246IExpbmVJdGVtIHwgdW5kZWZpbmVkLFxuXHR2aXN1YWxpemF0aW9uUGF0aDogc3RyaW5nLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sXG5cdHRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uOiBUYWJsZUNvbnRyb2xDb25maWd1cmF0aW9uLFxuXHRuYXZpZ2F0aW9uU2V0dGluZ3M6IE5hdmlnYXRpb25TZXR0aW5nc0NvbmZpZ3VyYXRpb25cbik6IFN0YW5kYXJkQWN0aW9uc0NvbmZpZ3VyYXRpb24ge1xuXHRjb25zdCBjcmVhdGlvbkJlaGF2aW91ciA9IF9nZXRDcmVhdGlvbkJlaGF2aW91cihcblx0XHRsaW5lSXRlbUFubm90YXRpb24sXG5cdFx0dGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24sXG5cdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHRuYXZpZ2F0aW9uU2V0dGluZ3MsXG5cdFx0dmlzdWFsaXphdGlvblBhdGhcblx0KTtcblx0Y29uc3Qgc3RhbmRhcmRBY3Rpb25zQ29udGV4dCA9IGdlbmVyYXRlU3RhbmRhcmRBY3Rpb25zQ29udGV4dChcblx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdGNyZWF0aW9uQmVoYXZpb3VyLm1vZGUgYXMgQ3JlYXRpb25Nb2RlLFxuXHRcdHRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uXG5cdCk7XG5cdGNvbnN0IGN1dEJ1dHRvblZpc2liaWxpdHlFeHByZXNzaW9uID0gZ2V0Q3V0VmlzaWJpbGl0eShjb252ZXJ0ZXJDb250ZXh0LCBzdGFuZGFyZEFjdGlvbnNDb250ZXh0KTtcblx0Y29uc3QgZGVsZXRlQnV0dG9uVmlzaWJpbGl0eUV4cHJlc3Npb24gPSBnZXREZWxldGVWaXNpYmlsaXR5KGNvbnZlcnRlckNvbnRleHQsIHN0YW5kYXJkQWN0aW9uc0NvbnRleHQpO1xuXHRjb25zdCBtYXNzRWRpdEJ1dHRvblZpc2liaWxpdHlFeHByZXNzaW9uID0gZ2V0TWFzc0VkaXRWaXNpYmlsaXR5KGNvbnZlcnRlckNvbnRleHQsIHN0YW5kYXJkQWN0aW9uc0NvbnRleHQpO1xuXHRjb25zdCBpc0luc2VydFVwZGF0ZUFjdGlvbnNUZW1wbGF0ZWQgPSBnZXRJbnNlcnRVcGRhdGVBY3Rpb25zVGVtcGxhdGluZyhcblx0XHRzdGFuZGFyZEFjdGlvbnNDb250ZXh0LFxuXHRcdGlzRHJhZnRPclN0aWNreVN1cHBvcnRlZChjb252ZXJ0ZXJDb250ZXh0KVxuXHQpO1xuXHRjb25zdCBzdGFuZGFyZEFjdGlvbnMgPSB7XG5cdFx0Y3V0OiBnZXRTdGFuZGFyZEFjdGlvbkN1dChjb252ZXJ0ZXJDb250ZXh0LCBzdGFuZGFyZEFjdGlvbnNDb250ZXh0KSxcblx0XHRjcmVhdGU6IGdldFN0YW5kYXJkQWN0aW9uQ3JlYXRlKGNvbnZlcnRlckNvbnRleHQsIHN0YW5kYXJkQWN0aW9uc0NvbnRleHQpLFxuXHRcdGRlbGV0ZTogZ2V0U3RhbmRhcmRBY3Rpb25EZWxldGUoY29udmVydGVyQ29udGV4dCwgc3RhbmRhcmRBY3Rpb25zQ29udGV4dCksXG5cdFx0cGFzdGU6IGdldFN0YW5kYXJkQWN0aW9uUGFzdGUoY29udmVydGVyQ29udGV4dCwgc3RhbmRhcmRBY3Rpb25zQ29udGV4dCwgaXNJbnNlcnRVcGRhdGVBY3Rpb25zVGVtcGxhdGVkKSxcblx0XHRtYXNzRWRpdDogZ2V0U3RhbmRhcmRBY3Rpb25NYXNzRWRpdChjb252ZXJ0ZXJDb250ZXh0LCBzdGFuZGFyZEFjdGlvbnNDb250ZXh0KSxcblx0XHRpbnNpZ2h0czogZ2V0U3RhbmRhcmRBY3Rpb25JbnNpZ2h0cyhjb252ZXJ0ZXJDb250ZXh0LCBzdGFuZGFyZEFjdGlvbnNDb250ZXh0LCB2aXN1YWxpemF0aW9uUGF0aCksXG5cdFx0Y3JlYXRpb25Sb3c6IGdldENyZWF0aW9uUm93KGNvbnZlcnRlckNvbnRleHQsIHN0YW5kYXJkQWN0aW9uc0NvbnRleHQpXG5cdH07XG5cdGNvbnN0IGNvbmZpZ3VyYXRpb246IFN0YW5kYXJkQWN0aW9uc0NvbmZpZ3VyYXRpb24gPSB7XG5cdFx0Y3JlYXRpb25CZWhhdmlvdXIsXG5cdFx0Y3V0QnV0dG9uVmlzaWJpbGl0eUV4cHJlc3Npb24sXG5cdFx0ZGVsZXRlQnV0dG9uVmlzaWJpbGl0eUV4cHJlc3Npb24sXG5cdFx0bWFzc0VkaXRCdXR0b25WaXNpYmlsaXR5RXhwcmVzc2lvbixcblx0XHRpc0luc2VydFVwZGF0ZUFjdGlvbnNUZW1wbGF0ZWQsXG5cdFx0c3RhbmRhcmRBY3Rpb25zXG5cdH07XG5cblx0aWYgKHN0YW5kYXJkQWN0aW9uc0NvbnRleHQudGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24udHlwZSA9PT0gXCJUcmVlVGFibGVcIikge1xuXHRcdGNvbmZpZ3VyYXRpb24uc3RhbmRhcmRBY3Rpb25zLm1vdmVVcCA9IGdldFN0YW5kYXJkQWN0aW9uTW92ZVVwRG93bihjb252ZXJ0ZXJDb250ZXh0LCBzdGFuZGFyZEFjdGlvbnNDb250ZXh0LCB0cnVlKTtcblx0XHRjb25maWd1cmF0aW9uLnN0YW5kYXJkQWN0aW9ucy5tb3ZlRG93biA9IGdldFN0YW5kYXJkQWN0aW9uTW92ZVVwRG93bihjb252ZXJ0ZXJDb250ZXh0LCBzdGFuZGFyZEFjdGlvbnNDb250ZXh0LCBmYWxzZSk7XG5cdH1cblxuXHRyZXR1cm4gY29uZmlndXJhdGlvbjtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRUYWJsZUFubm90YXRpb25Db25maWd1cmF0aW9uKFxuXHRsaW5lSXRlbUFubm90YXRpb246IExpbmVJdGVtIHwgdW5kZWZpbmVkLFxuXHR2aXN1YWxpemF0aW9uUGF0aDogc3RyaW5nLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sXG5cdHRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uOiBUYWJsZUNvbnRyb2xDb25maWd1cmF0aW9uLFxuXHRjb2x1bW5zOiBUYWJsZUNvbHVtbltdLFxuXHRuYXZpZ2F0aW9uU2V0dGluZ3M6IE5hdmlnYXRpb25TZXR0aW5nc0NvbmZpZ3VyYXRpb24sXG5cdHN0YW5kYXJkQWN0aW9uc0NvbmZpZ3VyYXRpb246IFN0YW5kYXJkQWN0aW9uc0NvbmZpZ3VyYXRpb24sXG5cdHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uPzogUHJlc2VudGF0aW9uVmFyaWFudFR5cGVcbik6IFRhYmxlQW5ub3RhdGlvbkNvbmZpZ3VyYXRpb24ge1xuXHQvLyBOZWVkIHRvIGdldCB0aGUgdGFyZ2V0XG5cdGNvbnN0IHsgbmF2aWdhdGlvblByb3BlcnR5UGF0aCB9ID0gc3BsaXRQYXRoKHZpc3VhbGl6YXRpb25QYXRoKTtcblx0Y29uc3QgdHlwZU5hbWVQbHVyYWwgPSBjb252ZXJ0ZXJDb250ZXh0LmdldERhdGFNb2RlbE9iamVjdFBhdGgoKS50YXJnZXRFbnRpdHlUeXBlLmFubm90YXRpb25zPy5VST8uSGVhZGVySW5mbz8uVHlwZU5hbWVQbHVyYWw7XG5cdGNvbnN0IHRpdGxlID0gdHlwZU5hbWVQbHVyYWwgJiYgY29tcGlsZUV4cHJlc3Npb24oZ2V0RXhwcmVzc2lvbkZyb21Bbm5vdGF0aW9uKHR5cGVOYW1lUGx1cmFsKSk7XG5cdGNvbnN0IGVudGl0eVNldCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpLnRhcmdldEVudGl0eVNldDtcblx0Y29uc3QgcGFnZU1hbmlmZXN0U2V0dGluZ3M6IE1hbmlmZXN0V3JhcHBlciA9IGNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RXcmFwcGVyKCk7XG5cdGNvbnN0IGhhc0Fic29sdXRlUGF0aCA9IG5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgubGVuZ3RoID09PSAwO1xuXHRjb25zdCBwMTNuTW9kZSA9IGdldFAxM25Nb2RlKHZpc3VhbGl6YXRpb25QYXRoLCBjb252ZXJ0ZXJDb250ZXh0LCB0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbik7XG5cdGNvbnN0IGlkID0gbmF2aWdhdGlvblByb3BlcnR5UGF0aCA/IGdldFRhYmxlSUQodmlzdWFsaXphdGlvblBhdGgpIDogZ2V0VGFibGVJRChjb252ZXJ0ZXJDb250ZXh0LmdldENvbnRleHRQYXRoKCksIFwiTGluZUl0ZW1cIik7XG5cdGNvbnN0IHRhcmdldENhcGFiaWxpdGllcyA9IGdldENhcGFiaWxpdHlSZXN0cmljdGlvbihjb252ZXJ0ZXJDb250ZXh0KTtcblx0Y29uc3QgbmF2aWdhdGlvblRhcmdldFBhdGggPSBnZXROYXZpZ2F0aW9uVGFyZ2V0UGF0aChjb252ZXJ0ZXJDb250ZXh0LCBuYXZpZ2F0aW9uUHJvcGVydHlQYXRoKTtcblx0Y29uc3Qgc2VsZWN0aW9uTW9kZSA9IGdldFNlbGVjdGlvbk1vZGUoXG5cdFx0bGluZUl0ZW1Bbm5vdGF0aW9uLFxuXHRcdHZpc3VhbGl6YXRpb25QYXRoLFxuXHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0aGFzQWJzb2x1dGVQYXRoLFxuXHRcdHRhcmdldENhcGFiaWxpdGllcyxcblx0XHRzdGFuZGFyZEFjdGlvbnNDb25maWd1cmF0aW9uLmRlbGV0ZUJ1dHRvblZpc2liaWxpdHlFeHByZXNzaW9uLFxuXHRcdHN0YW5kYXJkQWN0aW9uc0NvbmZpZ3VyYXRpb24ubWFzc0VkaXRCdXR0b25WaXNpYmlsaXR5RXhwcmVzc2lvbixcblx0XHRzdGFuZGFyZEFjdGlvbnNDb25maWd1cmF0aW9uLmN1dEJ1dHRvblZpc2liaWxpdHlFeHByZXNzaW9uXG5cdCk7XG5cdGxldCB0aHJlc2hvbGQgPSBuYXZpZ2F0aW9uUHJvcGVydHlQYXRoID8gMTAgOiAzMDtcblx0aWYgKHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uPy5NYXhJdGVtcykge1xuXHRcdHRocmVzaG9sZCA9IHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uLk1heEl0ZW1zLnZhbHVlT2YoKTtcblx0fSBlbHNlIGlmICh0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbi50eXBlID09PSBcIlRyZWVUYWJsZVwiKSB7XG5cdFx0Ly8gVG8gbWFrZSBzY3JvbGxpbmcgc21vb3RoLCB3ZSBzZXQgdGhlIHRocmVzaG9sZCB2YWx1ZSBoaWdoZXIgZm9yIHRyZWUgdGFibGVzXG5cdFx0dGhyZXNob2xkID0gMjAwO1xuXHR9IGVsc2UgaWYgKHRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uLnR5cGUgPT09IFwiR3JpZFRhYmxlXCIgfHwgdGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24udHlwZSA9PT0gXCJBbmFseXRpY2FsVGFibGVcIikge1xuXHRcdHRocmVzaG9sZCA9IDEwMDtcblx0fVxuXHRjb25zdCB2YXJpYW50TWFuYWdlbWVudDogVmFyaWFudE1hbmFnZW1lbnRUeXBlID0gcGFnZU1hbmlmZXN0U2V0dGluZ3MuZ2V0VmFyaWFudE1hbmFnZW1lbnQoKTtcblx0Y29uc3QgaXNTZWFyY2hhYmxlID0gaXNQYXRoU2VhcmNoYWJsZShjb252ZXJ0ZXJDb250ZXh0LmdldERhdGFNb2RlbE9iamVjdFBhdGgoKSk7XG5cdHJldHVybiB7XG5cdFx0aWQ6IGlkLFxuXHRcdGFwaUlkOiBnZW5lcmF0ZShbaWQsIFwiVGFibGVcIl0pLFxuXHRcdGVudGl0eU5hbWU6IGVudGl0eVNldCA/IGVudGl0eVNldC5uYW1lIDogXCJcIixcblx0XHRlbnRpdHlUeXBlTmFtZTogZW50aXR5U2V0ICYmIGVudGl0eVNldC5lbnRpdHlUeXBlID8gZW50aXR5U2V0LmVudGl0eVR5cGUubmFtZSA6IFwiXCIsXG5cdFx0Y29sbGVjdGlvbjogZ2V0VGFyZ2V0T2JqZWN0UGF0aChjb252ZXJ0ZXJDb250ZXh0LmdldERhdGFNb2RlbE9iamVjdFBhdGgoKSksXG5cdFx0bmF2aWdhdGlvblBhdGg6IG5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgsXG5cdFx0cm93OiBfZ2V0Um93Q29uZmlndXJhdGlvblByb3BlcnR5KFxuXHRcdFx0bGluZUl0ZW1Bbm5vdGF0aW9uLFxuXHRcdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHRcdG5hdmlnYXRpb25TZXR0aW5ncyxcblx0XHRcdG5hdmlnYXRpb25UYXJnZXRQYXRoLFxuXHRcdFx0dGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24udHlwZVxuXHRcdCksXG5cdFx0cDEzbk1vZGUsXG5cdFx0aXNJbnNlcnRVcGRhdGVBY3Rpb25zVGVtcGxhdGVkOiBzdGFuZGFyZEFjdGlvbnNDb25maWd1cmF0aW9uLmlzSW5zZXJ0VXBkYXRlQWN0aW9uc1RlbXBsYXRlZCxcblx0XHR1cGRhdGFibGVQcm9wZXJ0eVBhdGg6IGdldEN1cnJlbnRFbnRpdHlTZXRVcGRhdGFibGVQYXRoKGNvbnZlcnRlckNvbnRleHQpLFxuXHRcdGRpc3BsYXlNb2RlOiBpc0luRGlzcGxheU1vZGUoY29udmVydGVyQ29udGV4dCwgdHJ1ZSksXG5cdFx0Y3JlYXRlOiBzdGFuZGFyZEFjdGlvbnNDb25maWd1cmF0aW9uLmNyZWF0aW9uQmVoYXZpb3VyLFxuXHRcdHNlbGVjdGlvbk1vZGU6IHNlbGVjdGlvbk1vZGUsXG5cdFx0dmFyaWFudE1hbmFnZW1lbnQ6IHZhcmlhbnRNYW5hZ2VtZW50ID09PSBcIkNvbnRyb2xcIiAmJiAhcDEzbk1vZGUgPyBWYXJpYW50TWFuYWdlbWVudFR5cGUuTm9uZSA6IHZhcmlhbnRNYW5hZ2VtZW50LFxuXHRcdHRocmVzaG9sZDogdGhyZXNob2xkLFxuXHRcdHNvcnRDb25kaXRpb25zOiBnZXRTb3J0Q29uZGl0aW9ucyhjb252ZXJ0ZXJDb250ZXh0LCBwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbiwgY29sdW1ucyksXG5cdFx0dGl0bGU6IHRpdGxlLFxuXHRcdHNlYXJjaGFibGU6IHRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uLnR5cGUgIT09IFwiQW5hbHl0aWNhbFRhYmxlXCIgJiYgIShpc0NvbnN0YW50KGlzU2VhcmNoYWJsZSkgJiYgaXNTZWFyY2hhYmxlLnZhbHVlID09PSBmYWxzZSksXG5cdFx0aW5pdGlhbEV4cGFuc2lvbkxldmVsOiBnZXRJbml0aWFsRXhwYW5zaW9uTGV2ZWwocHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24pLFxuXHRcdHJlcXVpcmVkUHJvcGVydGllczogZ2V0UmVxdWlyZWRQcm9wZXJ0aWVzKGNvbnZlcnRlckNvbnRleHQpXG5cdFx0XHQuZmlsdGVyKChwcm9wZXJ0eSkgPT4gcHJvcGVydHk/LiR0YXJnZXQ/LnR5cGUgIT09IFwiRWRtLkJvb2xlYW5cIilcblx0XHRcdC5tYXAoKHByb3BlcnR5KSA9PiBwcm9wZXJ0eS52YWx1ZSlcblx0fTtcbn1cbi8qKlxuICogR2V0cyB0aGUgZGF0YSB0eXBlIG9mIGEgY29sdW1uIGZvciB0aGUgZXhwb3J0LlxuICogQHBhcmFtIGRhdGFUeXBlIFRoZSBkYXRhIHR5cGUgb2YgYSBwcm9wZXJ0eSwgY29sdW1uXG4gKiBAcGFyYW0gaXNBVGltZXpvbmUgSXMgdGhlIGdpdmVuIHByb3BlcnR5IGEgdGltZXpvbmVcbiAqIEBwYXJhbSBpc0N1cnJlbmN5IElzIHRoZSBnaXZlbiBwcm9wZXJ0eSBhIGN1cnJlbmN5XG4gKiBAcGFyYW0gZXhwb3J0U2V0dGluZ3MgVGhlIGFscmVhZHkgZGV0ZWN0ZWQgZXhwb3J0IHNldHRpbmdzIGZyb20gZGF0YWZpZWxkc1xuICogQHJldHVybnMgVGhlIHN1cHBvcnRlZCBleHBvcnQgdHlwZVxuICovXG5mdW5jdGlvbiBnZXRFeHBvcnREYXRhVHlwZShcblx0ZGF0YVR5cGU6IHN0cmluZyB8IHVuZGVmaW5lZCxcblx0aXNBVGltZXpvbmUgPSBmYWxzZSxcblx0aXNDdXJyZW5jeSA9IGZhbHNlLFxuXHRleHBvcnRTZXR0aW5ncz86IENvbHVtbkV4cG9ydFNldHRpbmdzXG4pOiBzdHJpbmcge1xuXHRsZXQgZXhwb3J0RGF0YVR5cGUgPSBcIlN0cmluZ1wiO1xuXHRpZiAoIWRhdGFUeXBlIHx8IGV4cG9ydFNldHRpbmdzPy5kYXRhUG9pbnRUYXJnZXRWYWx1ZSkge1xuXHRcdHJldHVybiBleHBvcnREYXRhVHlwZTtcblx0fVxuXHRpZiAoZXhwb3J0U2V0dGluZ3M/LmlzQ3VycmVuY3kgfHwgaXNDdXJyZW5jeSkge1xuXHRcdHJldHVybiBcIkN1cnJlbmN5XCI7XG5cdH1cblx0aWYgKGlzQVRpbWV6b25lKSB7XG5cdFx0cmV0dXJuIFwiVGltZXpvbmVcIjtcblx0fVxuXHRpZiAoZXhwb3J0U2V0dGluZ3M/LndyYXApIHtcblx0XHRyZXR1cm4gZXhwb3J0RGF0YVR5cGU7XG5cdH1cblx0c3dpdGNoIChkYXRhVHlwZSkge1xuXHRcdGNhc2UgXCJFZG0uRGVjaW1hbFwiOlxuXHRcdGNhc2UgXCJFZG0uSW50MzJcIjpcblx0XHRjYXNlIFwiRWRtLkludDY0XCI6XG5cdFx0Y2FzZSBcIkVkbS5Eb3VibGVcIjpcblx0XHRjYXNlIFwiRWRtLkJ5dGVcIjpcblx0XHRcdGV4cG9ydERhdGFUeXBlID0gXCJOdW1iZXJcIjtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgXCJFZG0uRGF0ZU9mVGltZVwiOlxuXHRcdGNhc2UgXCJFZG0uRGF0ZVwiOlxuXHRcdFx0ZXhwb3J0RGF0YVR5cGUgPSBcIkRhdGVcIjtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgXCJFZG0uRGF0ZVRpbWVPZmZzZXRcIjpcblx0XHRcdGV4cG9ydERhdGFUeXBlID0gXCJEYXRlVGltZVwiO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSBcIkVkbS5UaW1lT2ZEYXlcIjpcblx0XHRcdGV4cG9ydERhdGFUeXBlID0gXCJUaW1lXCI7XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIFwiRWRtLkJvb2xlYW5cIjpcblx0XHRcdGV4cG9ydERhdGFUeXBlID0gXCJCb29sZWFuXCI7XG5cdFx0XHRicmVhaztcblx0XHRkZWZhdWx0OlxuXHRcdFx0ZXhwb3J0RGF0YVR5cGUgPSBcIlN0cmluZ1wiO1xuXHR9XG5cdHJldHVybiBleHBvcnREYXRhVHlwZTtcbn1cbi8qKlxuICogU3BsaXRzIHRoZSB2aXN1YWxpemF0aW9uIHBhdGggaW50byBuYXZpZ2F0aW9uIHByb3BlcnR5IHBhdGggYW5kIGFubm90YXRpb24uXG4gKiBAcGFyYW0gdmlzdWFsaXphdGlvblBhdGhcbiAqIEByZXR1cm5zIFRoZSBzcGxpdCBwYXRoXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzcGxpdFBhdGgodmlzdWFsaXphdGlvblBhdGg6IHN0cmluZyk6IHsgbmF2aWdhdGlvblByb3BlcnR5UGF0aDogc3RyaW5nOyBhbm5vdGF0aW9uUGF0aDogc3RyaW5nIH0ge1xuXHRjb25zdCBbdGFyZ2V0TmF2aWdhdGlvblByb3BlcnR5UGF0aCwgYW5ub3RhdGlvblBhdGhdID0gdmlzdWFsaXphdGlvblBhdGguc3BsaXQoXCJAXCIpO1xuXHRsZXQgbmF2aWdhdGlvblByb3BlcnR5UGF0aCA9IHRhcmdldE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGg7XG5cdGlmIChuYXZpZ2F0aW9uUHJvcGVydHlQYXRoLmxhc3RJbmRleE9mKFwiL1wiKSA9PT0gbmF2aWdhdGlvblByb3BlcnR5UGF0aC5sZW5ndGggLSAxKSB7XG5cdFx0Ly8gRHJvcCB0cmFpbGluZyBzbGFzaFxuXHRcdG5hdmlnYXRpb25Qcm9wZXJ0eVBhdGggPSBuYXZpZ2F0aW9uUHJvcGVydHlQYXRoLnN1YnN0cmluZygwLCBuYXZpZ2F0aW9uUHJvcGVydHlQYXRoLmxlbmd0aCAtIDEpO1xuXHR9XG5cdHJldHVybiB7IG5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgsIGFubm90YXRpb25QYXRoIH07XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0U2VsZWN0aW9uVmFyaWFudENvbmZpZ3VyYXRpb24oXG5cdHNlbGVjdGlvblZhcmlhbnRQYXRoOiBzdHJpbmcsXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0PlxuKTogU2VsZWN0aW9uVmFyaWFudENvbmZpZ3VyYXRpb24gfCB1bmRlZmluZWQge1xuXHRjb25zdCByZXNvbHZlZFRhcmdldCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5VHlwZUFubm90YXRpb24oc2VsZWN0aW9uVmFyaWFudFBhdGgpO1xuXHRjb25zdCBzZWxlY3Rpb246IFNlbGVjdGlvblZhcmlhbnQgPSByZXNvbHZlZFRhcmdldC5hbm5vdGF0aW9uIGFzIFNlbGVjdGlvblZhcmlhbnQ7XG5cdGlmIChzZWxlY3Rpb24pIHtcblx0XHRjb25zdCBwcm9wZXJ0eU5hbWVzOiBzdHJpbmdbXSA9IFtdO1xuXHRcdHNlbGVjdGlvbi5TZWxlY3RPcHRpb25zPy5mb3JFYWNoKChzZWxlY3RPcHRpb246IFNlbGVjdE9wdGlvblR5cGUpID0+IHtcblx0XHRcdGNvbnN0IHByb3BlcnR5TmFtZSA9IHNlbGVjdE9wdGlvbi5Qcm9wZXJ0eU5hbWU7XG5cdFx0XHRjb25zdCBwcm9wZXJ0eVBhdGg6IHN0cmluZyA9IHByb3BlcnR5TmFtZT8udmFsdWUgPz8gXCJcIjtcblx0XHRcdGlmICghcHJvcGVydHlOYW1lcy5pbmNsdWRlcyhwcm9wZXJ0eVBhdGgpKSB7XG5cdFx0XHRcdHByb3BlcnR5TmFtZXMucHVzaChwcm9wZXJ0eVBhdGgpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdHJldHVybiB7XG5cdFx0XHR0ZXh0OiBzZWxlY3Rpb24/LlRleHQ/LnRvU3RyaW5nKCksXG5cdFx0XHRwcm9wZXJ0eU5hbWVzOiBwcm9wZXJ0eU5hbWVzXG5cdFx0fTtcblx0fVxuXHRyZXR1cm4gdW5kZWZpbmVkO1xufVxuZnVuY3Rpb24gX2dldEZ1bGxTY3JlZW5CYXNlZE9uRGV2aWNlKFxuXHR0YWJsZVNldHRpbmdzOiBUYWJsZU1hbmlmZXN0U2V0dGluZ3NDb25maWd1cmF0aW9uLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sXG5cdGlzSXBob25lOiBib29sZWFuXG4pOiBib29sZWFuIHtcblx0Ly8gSWYgZW5hYmxlRnVsbFNjcmVlbiBpcyBub3Qgc2V0LCB1c2UgYXMgZGVmYXVsdCB0cnVlIG9uIHBob25lIGFuZCBmYWxzZSBvdGhlcndpc2Vcblx0bGV0IGVuYWJsZUZ1bGxTY3JlZW4gPSB0YWJsZVNldHRpbmdzLmVuYWJsZUZ1bGxTY3JlZW4gPz8gaXNJcGhvbmU7XG5cdC8vIE1ha2Ugc3VyZSB0aGF0IGVuYWJsZUZ1bGxTY3JlZW4gaXMgbm90IHNldCBvbiBMaXN0UmVwb3J0IGZvciBkZXNrdG9wIG9yIHRhYmxldFxuXHRpZiAoIWlzSXBob25lICYmIGVuYWJsZUZ1bGxTY3JlZW4gJiYgY29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSA9PT0gVGVtcGxhdGVUeXBlLkxpc3RSZXBvcnQpIHtcblx0XHRlbmFibGVGdWxsU2NyZWVuID0gZmFsc2U7XG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXREaWFnbm9zdGljcygpLmFkZElzc3VlKElzc3VlQ2F0ZWdvcnkuTWFuaWZlc3QsIElzc3VlU2V2ZXJpdHkuTG93LCBJc3N1ZVR5cGUuRlVMTFNDUkVFTk1PREVfTk9UX09OX0xJU1RSRVBPUlQpO1xuXHR9XG5cdHJldHVybiBlbmFibGVGdWxsU2NyZWVuO1xufVxuZnVuY3Rpb24gX2dldE11bHRpU2VsZWN0TW9kZShcblx0dGFibGVTZXR0aW5nczogVGFibGVNYW5pZmVzdFNldHRpbmdzQ29uZmlndXJhdGlvbixcblx0dGFibGVUeXBlOiBUYWJsZVR5cGUsXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0PlxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0bGV0IG11bHRpU2VsZWN0TW9kZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXHRpZiAodGFibGVUeXBlICE9PSBcIlJlc3BvbnNpdmVUYWJsZVwiKSB7XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxuXHRzd2l0Y2ggKGNvbnZlcnRlckNvbnRleHQuZ2V0VGVtcGxhdGVUeXBlKCkpIHtcblx0XHRjYXNlIFRlbXBsYXRlVHlwZS5MaXN0UmVwb3J0OlxuXHRcdGNhc2UgVGVtcGxhdGVUeXBlLk9iamVjdFBhZ2U6XG5cdFx0XHRtdWx0aVNlbGVjdE1vZGUgPSB0YWJsZVNldHRpbmdzLnNlbGVjdEFsbCA9PT0gZmFsc2UgPyBcIkNsZWFyQWxsXCIgOiBcIkRlZmF1bHRcIjtcblx0XHRcdGlmIChjb252ZXJ0ZXJDb250ZXh0LmdldFRlbXBsYXRlVHlwZSgpID09PSBUZW1wbGF0ZVR5cGUuT2JqZWN0UGFnZSAmJiBjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0V3JhcHBlcigpLnVzZUljb25UYWJCYXIoKSkge1xuXHRcdFx0XHRtdWx0aVNlbGVjdE1vZGUgPSAhdGFibGVTZXR0aW5ncy5zZWxlY3RBbGwgPyBcIkNsZWFyQWxsXCIgOiBcIkRlZmF1bHRcIjtcblx0XHRcdH1cblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgVGVtcGxhdGVUeXBlLkFuYWx5dGljYWxMaXN0UGFnZTpcblx0XHRcdG11bHRpU2VsZWN0TW9kZSA9ICF0YWJsZVNldHRpbmdzLnNlbGVjdEFsbCA/IFwiQ2xlYXJBbGxcIiA6IFwiRGVmYXVsdFwiO1xuXHRcdFx0YnJlYWs7XG5cdFx0ZGVmYXVsdDpcblx0fVxuXHRyZXR1cm4gbXVsdGlTZWxlY3RNb2RlO1xufVxuZnVuY3Rpb24gX2dldFRhYmxlTW9kZShcblx0dGFibGVUeXBlOiBUYWJsZVR5cGUsXG5cdHRhYmxlU2V0dGluZ3M6IFRhYmxlTWFuaWZlc3RTZXR0aW5nc0NvbmZpZ3VyYXRpb24sXG5cdGlzVGVtcGxhdGVMaXN0UmVwb3J0OiBib29sZWFuXG4pOiB7IHJvd0NvdW50TW9kZT86IFRhYmxlUm93Q291bnRNb2RlOyByb3dDb3VudD86IG51bWJlciB9IHtcblx0aWYgKHRhYmxlVHlwZSAhPT0gXCJSZXNwb25zaXZlVGFibGVcIikge1xuXHRcdGlmIChpc1RlbXBsYXRlTGlzdFJlcG9ydCkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0cm93Q291bnRNb2RlOiBcIkF1dG9cIixcblx0XHRcdFx0cm93Q291bnQ6IDNcblx0XHRcdH07XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdHJvd0NvdW50TW9kZTogdGFibGVTZXR0aW5ncy5yb3dDb3VudE1vZGUgPz8gXCJGaXhlZFwiLFxuXHRcdFx0XHRyb3dDb3VudDogdGFibGVTZXR0aW5ncy5yb3dDb3VudCA/IHRhYmxlU2V0dGluZ3Mucm93Q291bnQgOiA1XG5cdFx0XHR9O1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHRyZXR1cm4ge307XG5cdH1cbn1cbmZ1bmN0aW9uIF9nZXRDb25kZW5zZWRUYWJsZUxheW91dChfdGFibGVUeXBlOiBUYWJsZVR5cGUsIF90YWJsZVNldHRpbmdzOiBUYWJsZU1hbmlmZXN0U2V0dGluZ3NDb25maWd1cmF0aW9uKTogYm9vbGVhbiB7XG5cdHJldHVybiBfdGFibGVTZXR0aW5ncy5jb25kZW5zZWRUYWJsZUxheW91dCAhPT0gdW5kZWZpbmVkICYmIF90YWJsZVR5cGUgIT09IFwiUmVzcG9uc2l2ZVRhYmxlXCJcblx0XHQ/IF90YWJsZVNldHRpbmdzLmNvbmRlbnNlZFRhYmxlTGF5b3V0XG5cdFx0OiBmYWxzZTtcbn1cbmZ1bmN0aW9uIF9nZXRUYWJsZVNlbGVjdGlvbkxpbWl0KF90YWJsZVNldHRpbmdzOiBUYWJsZU1hbmlmZXN0U2V0dGluZ3NDb25maWd1cmF0aW9uKTogbnVtYmVyIHtcblx0cmV0dXJuIF90YWJsZVNldHRpbmdzLnNlbGVjdEFsbCA9PT0gdHJ1ZSB8fCBfdGFibGVTZXR0aW5ncy5zZWxlY3Rpb25MaW1pdCA9PT0gMCA/IDAgOiBfdGFibGVTZXR0aW5ncy5zZWxlY3Rpb25MaW1pdCB8fCAyMDA7XG59XG5mdW5jdGlvbiBfZ2V0VGFibGVJbmxpbmVDcmVhdGlvblJvd0NvdW50KF90YWJsZVNldHRpbmdzOiBUYWJsZU1hbmlmZXN0U2V0dGluZ3NDb25maWd1cmF0aW9uKTogbnVtYmVyIHtcblx0cmV0dXJuIF90YWJsZVNldHRpbmdzLmNyZWF0aW9uTW9kZT8uaW5saW5lQ3JlYXRpb25Sb3dDb3VudCA/IF90YWJsZVNldHRpbmdzLmNyZWF0aW9uTW9kZT8uaW5saW5lQ3JlYXRpb25Sb3dDb3VudCA6IDE7XG59XG5cbmZ1bmN0aW9uIF9nZXRFbmFibGVFeHBvcnQoXG5cdHRhYmxlU2V0dGluZ3M6IFRhYmxlTWFuaWZlc3RTZXR0aW5nc0NvbmZpZ3VyYXRpb24sXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pixcblx0ZW5hYmxlUGFzdGU6IGJvb2xlYW5cbik6IGJvb2xlYW4ge1xuXHRyZXR1cm4gdGFibGVTZXR0aW5ncy5lbmFibGVFeHBvcnQgIT09IHVuZGVmaW5lZFxuXHRcdD8gdGFibGVTZXR0aW5ncy5lbmFibGVFeHBvcnRcblx0XHQ6IGNvbnZlcnRlckNvbnRleHQuZ2V0VGVtcGxhdGVUeXBlKCkgIT09IFwiT2JqZWN0UGFnZVwiIHx8IGVuYWJsZVBhc3RlO1xufVxuZnVuY3Rpb24gX2dldEZyb3plbkNvbHVtbkNvdW50KHRhYmxlU2V0dGluZ3M6IFRhYmxlTWFuaWZlc3RTZXR0aW5nc0NvbmZpZ3VyYXRpb24pOiBudW1iZXIgfCB1bmRlZmluZWQge1xuXHRyZXR1cm4gdGFibGVTZXR0aW5ncy5mcm96ZW5Db2x1bW5Db3VudDtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIHdpZHRoSW5jbHVkaW5nQ29sdW1uSGVhZGVyIHZhbHVlIGZyb20gdGhlIHRhYmxlU2V0dGluZ3MgaWYgaXQgZXhpc3RzLlxuICogQHBhcmFtIHRhYmxlU2V0dGluZ3MgVGFibGVTZXR0aW5ncyBPYmplY3RcbiAqIEByZXR1cm5zIFJldHVybnMgdGhlIHZhbHVlIG9mIHdpZHRoSW5jbHVkaW5nQ29sdW1uSGVhZGVyIG9yIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIF9nZXRXaWR0aEluY2x1ZGluZ0NvbHVtbkhlYWRlcih0YWJsZVNldHRpbmdzOiBUYWJsZU1hbmlmZXN0U2V0dGluZ3NDb25maWd1cmF0aW9uKTogYm9vbGVhbiB7XG5cdHJldHVybiB0YWJsZVNldHRpbmdzLndpZHRoSW5jbHVkaW5nQ29sdW1uSGVhZGVyID8/IGZhbHNlO1xufVxuXG5mdW5jdGlvbiBnZXRGaWx0ZXJDb25maWd1cmF0aW9uKFxuXHR0YWJsZVNldHRpbmdzOiBUYWJsZU1hbmlmZXN0U2V0dGluZ3NDb25maWd1cmF0aW9uLFxuXHRsaW5lSXRlbUFubm90YXRpb246IExpbmVJdGVtLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sXG5cdHNlbGVjdGlvblZhcmlhbnRBbm5vdGF0aW9uOiBTZWxlY3Rpb25WYXJpYW50VHlwZSB8IHVuZGVmaW5lZFxuKToge1xuXHRmaWx0ZXJzOiBQYXJ0aWFsPFJlY29yZDxcInF1aWNrRmlsdGVyc1wiIHwgXCJoaWRkZW5GaWx0ZXJzXCIsIFRhYmxlRmlsdGVyc0NvbmZpZ3VyYXRpb24+Pjtcblx0aGVhZGVyVmlzaWJsZTogYm9vbGVhbjtcbn0ge1xuXHRsZXQgaGlkZVRhYmxlVGl0bGUgPSBmYWxzZTtcblx0Y29uc3QgZmlsdGVyczogUGFydGlhbDxSZWNvcmQ8XCJxdWlja0ZpbHRlcnNcIiB8IFwiaGlkZGVuRmlsdGVyc1wiLCBUYWJsZUZpbHRlcnNDb25maWd1cmF0aW9uPj4gPSB7fTtcblx0Y29uc3QgdGFyZ2V0RW50aXR5VHlwZSA9IGNvbnZlcnRlckNvbnRleHQuZ2V0QW5ub3RhdGlvbkVudGl0eVR5cGUobGluZUl0ZW1Bbm5vdGF0aW9uKTtcblx0aWYgKHRhYmxlU2V0dGluZ3MucXVpY2tWYXJpYW50U2VsZWN0aW9uKSB7XG5cdFx0Y29uc3QgcXVpY2tGaWx0ZXJQYXRocyA9ICh0YWJsZVNldHRpbmdzLnF1aWNrVmFyaWFudFNlbGVjdGlvbi5wYXRocyA/PyBbXSkucmVkdWNlKFxuXHRcdFx0KGZpbHRlclBhdGhzOiB7IGFubm90YXRpb25QYXRoOiBzdHJpbmcgfVtdLCBwYXRoKSA9PiB7XG5cdFx0XHRcdGlmICh0YXJnZXRFbnRpdHlUeXBlLnJlc29sdmVQYXRoKHBhdGguYW5ub3RhdGlvblBhdGgpKSB7XG5cdFx0XHRcdFx0ZmlsdGVyUGF0aHMucHVzaCh7IGFubm90YXRpb25QYXRoOiBwYXRoLmFubm90YXRpb25QYXRoIH0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBmaWx0ZXJQYXRocztcblx0XHRcdH0sXG5cdFx0XHRbXVxuXHRcdCk7XG5cdFx0aWYgKHF1aWNrRmlsdGVyUGF0aHMubGVuZ3RoKSB7XG5cdFx0XHRmaWx0ZXJzLnF1aWNrRmlsdGVycyA9IHtcblx0XHRcdFx0c2hvd0NvdW50czogdGFibGVTZXR0aW5ncy5xdWlja1ZhcmlhbnRTZWxlY3Rpb24uc2hvd0NvdW50cyxcblx0XHRcdFx0cGF0aHM6IHF1aWNrRmlsdGVyUGF0aHNcblx0XHRcdH07XG5cdFx0fVxuXHR9XG5cdGlmIChzZWxlY3Rpb25WYXJpYW50QW5ub3RhdGlvbikge1xuXHRcdC8qKlxuXHRcdCAqIFByb3ZpZGUgU2VsZWN0aW9uIFZhcmlhbnQgdG8gaGlkZGVuRmlsdGVycyBpbiBvcmRlciB0byBzZXQgdGhlIFNWIGZpbHRlcnMgdG8gdGhlIHRhYmxlLlxuXHRcdCAqIE1EQyBUYWJsZSBvdmVycmlkZXMgYmluZGluZyBGaWx0ZXIgYW5kIGZyb20gU0FQIEZFIHRoZSBvbmx5IG1ldGhvZCB3aGVyZSB3ZSBhcmUgYWJsZSB0byBhZGRcblx0XHQgKiBhZGRpdGlvbmFsIGZpbHRlciBpcyAncmViaW5kVGFibGUnIGludG8gVGFibGUgZGVsZWdhdGUuXG5cdFx0ICogVG8gYXZvaWQgaW1wbGVtZW50aW5nIHNwZWNpZmljIExSIGZlYXR1cmUgdG8gU0FQIEZFIE1hY3JvIFRhYmxlLCB0aGUgZmlsdGVyKHMpICBub3QgbWFuYWdlZCBieSB0aGUgRmlsdGVyQmFyXG5cdFx0ICogY2FuIGJlIHBhc3NlZCB0byBtYWNybyB0YWJsZSB2aWEgcGFyYW1ldGVyL2NvbnRleHQgbmFtZWQgZmlsdGVycyBhbmQga2V5IGhpZGRlbkZpbHRlcnMuXG5cdFx0ICovXG5cdFx0ZmlsdGVycy5oaWRkZW5GaWx0ZXJzID0geyBwYXRoczogW3sgYW5ub3RhdGlvblBhdGg6IGBAJHtzZWxlY3Rpb25WYXJpYW50QW5ub3RhdGlvbi5mdWxseVF1YWxpZmllZE5hbWUuc3BsaXQoXCJAXCIpWzFdfWAgfV0gfTtcblx0fVxuXG5cdGhpZGVUYWJsZVRpdGxlID0gISF0YWJsZVNldHRpbmdzLnF1aWNrVmFyaWFudFNlbGVjdGlvbj8uaGlkZVRhYmxlVGl0bGU7XG5cdHJldHVybiB7XG5cdFx0ZmlsdGVyczogZmlsdGVycyxcblx0XHRoZWFkZXJWaXNpYmxlOiAhKGZpbHRlcnM/LnF1aWNrRmlsdGVycyAmJiBoaWRlVGFibGVUaXRsZSlcblx0fTtcbn1cbi8qKlxuICogQWRkcyB0aGUgdG9vbHRpcCBjb25maWd1cmF0aW9uIGZvciBhIGdpdmVuIGNvbHVtbi5cbiAqIEBwYXJhbSBwcm9wZXJ0eSBUaGUgcHJvcGVydHkgcmVmZXJlbmNlZCBvbiB0aGUgY29sdW1uXG4gKiBAcGFyYW0gY29sdW1uIFRoZSBjb2x1bW4gdG8gYmUgdXBkYXRlZFxuICovXG5mdW5jdGlvbiBfYWRkVG9vbFRpcChwcm9wZXJ0eTogUHJvcGVydHksIGNvbHVtbjogQW5ub3RhdGlvblRhYmxlQ29sdW1uKTogdm9pZCB7XG5cdGNvbnN0IHRvb2x0aXAgPSBfZ2V0VG9vbHRpcChwcm9wZXJ0eSkgPz8gY29sdW1uLmxhYmVsO1xuXHRpZiAodG9vbHRpcCkge1xuXHRcdGNvbHVtbi50b29sdGlwID0gdG9vbHRpcDtcblx0fVxufVxuZnVuY3Rpb24gX2dldENvbGxlY3RlZE5hdmlnYXRpb25Qcm9wZXJ0eUxhYmVscyhcblx0cmVsYXRpdmVQYXRoOiBzdHJpbmcsXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0PlxuKTogc3RyaW5nW10gfCB1bmRlZmluZWQge1xuXHRjb25zdCBuYXZpZ2F0aW9uUHJvcGVydGllcyA9IGVuaGFuY2VEYXRhTW9kZWxQYXRoKGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpLCByZWxhdGl2ZVBhdGgpLm5hdmlnYXRpb25Qcm9wZXJ0aWVzO1xuXHRpZiAobmF2aWdhdGlvblByb3BlcnRpZXM/Lmxlbmd0aCA+IDApIHtcblx0XHRjb25zdCBjb2xsZWN0ZWROYXZpZ2F0aW9uUHJvcGVydHlMYWJlbHM6IHN0cmluZ1tdID0gW107XG5cdFx0bmF2aWdhdGlvblByb3BlcnRpZXMuZm9yRWFjaCgobmF2UHJvcGVydHkpID0+IHtcblx0XHRcdGNvbGxlY3RlZE5hdmlnYXRpb25Qcm9wZXJ0eUxhYmVscy5wdXNoKGdldExhYmVsKG5hdlByb3BlcnR5KSB8fCBuYXZQcm9wZXJ0eS5uYW1lKTtcblx0XHR9KTtcblx0XHRyZXR1cm4gY29sbGVjdGVkTmF2aWdhdGlvblByb3BlcnR5TGFiZWxzO1xuXHR9XG59XG4vKipcbiAqIERldGVybWluZXMgaWYgdGhlIGFjdGlvbiB3aWxsIGhhdmUgYW4gZXhwcmVzc2lvbiBmb3IgZW5hYmxlbWVudCBnZW5lcmF0ZWQuXG4gKiBAcGFyYW0gZGF0YUZpZWxkIFRoZSBkYXRhRmllbGQgY29udGFpbmluZyBhbiBhY3Rpb25cbiAqIEBwYXJhbSBzRW50aXR5VHlwZSBUaGUgY3VycmVudCBlbnRpdHkgZm9yIHRlbXBsYXRpbmdcbiAqIEByZXR1cm5zIFdoZXRoZXIgYW4gZXhwcmVzc2lvbiBmb3IgZW5hYmxlbWVudCBpcyB0byBiZSBnZW5lcmF0ZWRcbiAqL1xuZnVuY3Rpb24gX3VzZUVuYWJsZWRFeHByZXNzaW9uKGRhdGFGaWVsZDogRGF0YUZpZWxkRm9yQWN0aW9uVHlwZXMsIHNFbnRpdHlUeXBlOiBzdHJpbmcpOiBib29sZWFuIHtcblx0Ly8gVGhlcmUgYXJlIHRocmVlIGNhc2VzIHdoZW4gYSB0YWJsZSBhY3Rpb24gaGFzIGFuIE9wZXJhdGlvbkF2YWlsYWJsZSB0aGF0IGxlYWRzIHRvIGFuIGVuYWJsZW1lbnQgZXhwcmVzc2lvblxuXHQvLyBhbmQgaXMgbm90IGRlcGVuZGVudCB1cG9uIHRoZSB0YWJsZSBlbnRyaWVzLlxuXHQvLyAxLiBBbiBhY3Rpb24gd2l0aCBhbiBvdmVybG9hZCwgdGhhdCBpcyBleGVjdXRlZCBhZ2FpbnN0IGEgcGFyZW50IGVudGl0eS5cblx0Ly8gMi4gQW4gdW5ib3VuZCBhY3Rpb25cblx0Ly8gMy4gQSBzdGF0aWMgYWN0aW9uICh0aGF0IGlzLCBib3VuZCB0byBhIGNvbGxlY3Rpb24pXG5cdGxldCB1c2VFbmFibGVkRXhwcmVzc2lvbiA9IGZhbHNlO1xuXHRpZiAoZGF0YUZpZWxkLkFjdGlvblRhcmdldD8uYW5ub3RhdGlvbnM/LkNvcmU/Lk9wZXJhdGlvbkF2YWlsYWJsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0Ly8gVW5ib3VuZCBhY3Rpb24uIElzIHJlY29nbmlzZWQsIGJ1dCBnZXRFeHByZXNzaW9uRnJvbUFubm90YXRpb24gY2hlY2tzIGZvciBpc0JvdW5kID0gdHJ1ZSwgc28gbm90IGdlbmVyYXRlZC5cblx0XHRjb25zdCBpc0JvdW5kID0gZGF0YUZpZWxkLkFjdGlvblRhcmdldD8uaXNCb3VuZDtcblx0XHQvL292ZXJsb2FkIGFjdGlvblxuXHRcdGNvbnN0IG92ZXJsb2FkQWN0aW9uID0gaXNCb3VuZCAmJiBkYXRhRmllbGQuQWN0aW9uVGFyZ2V0Py5zb3VyY2VUeXBlICE9PSBzRW50aXR5VHlwZTtcblx0XHQvL3N0YXRpYyBhY3Rpb25cblx0XHRjb25zdCBzdGF0aWNBY3Rpb24gPSBkYXRhRmllbGQuQWN0aW9uVGFyZ2V0Py5wYXJhbWV0ZXJzWzBdPy5pc0NvbGxlY3Rpb247XG5cdFx0Ly9jb3B5IGFjdGlvblxuXHRcdGlmICghaXNCb3VuZCB8fCBvdmVybG9hZEFjdGlvbiB8fCBzdGF0aWNBY3Rpb24pIHtcblx0XHRcdHVzZUVuYWJsZWRFeHByZXNzaW9uID0gdHJ1ZTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIHVzZUVuYWJsZWRFeHByZXNzaW9uO1xufVxuXG4vKipcbiAqIFVwZGF0ZXMgdGhlIHRhYmxlIGNvbnRyb2wgY29uZmlndXJhdGlvbiB3aXRoIFRyZWUtVGFibGUgc3BlY2lmaWMgaW5mb3JtYXRpb24uXG4gKiBAcGFyYW0gdGFibGVDb25maWd1cmF0aW9uIFRoZSB0YWJsZSBjb25maWd1cmF0aW9uXG4gKiBAcGFyYW0gdGFibGVTZXR0aW5ncyBTZXR0aW5ncyBmcm9tIHRoZSBtYW5pZmVzdFxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGluc3RhbmNlIG9mIHRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICovXG5mdW5jdGlvbiB1cGRhdGVUcmVlVGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24oXG5cdHRhYmxlQ29uZmlndXJhdGlvbjogVGFibGVDb250cm9sQ29uZmlndXJhdGlvbixcblx0dGFibGVTZXR0aW5nczogVGFibGVNYW5pZmVzdFNldHRpbmdzQ29uZmlndXJhdGlvbixcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dFxuKTogdm9pZCB7XG5cdGNvbnN0IGRhdGFNb2RlbE9iamVjdFBhdGggPSBjb252ZXJ0ZXJDb250ZXh0LmdldERhdGFNb2RlbE9iamVjdFBhdGgoKTtcblx0dGFibGVDb25maWd1cmF0aW9uLmhpZXJhcmNoeVF1YWxpZmllciA9IHRhYmxlU2V0dGluZ3MuaGllcmFyY2h5UXVhbGlmaWVyO1xuXHRjb25zdCBoaWVyYXJjaHlQYXJlbnROYXZpZ2F0aW9uUHJvcGVydHlQYXRoID0gZ2V0SGllcmFyY2h5UGFyZW50TmF2aWdhdGlvblByb3BlcnR5UGF0aChcblx0XHRkYXRhTW9kZWxPYmplY3RQYXRoLFxuXHRcdHRhYmxlQ29uZmlndXJhdGlvbi5oaWVyYXJjaHlRdWFsaWZpZXIhXG5cdCk7XG5cdGNvbnN0IG5vblVwZGF0YWJsZU5hdmlnYXRpb25Qcm9wZXJ0aWVzID0gZ2V0Tm9uVXBkYXRhYmxlTmF2aWdhdGlvblByb3BlcnRpZXMoZGF0YU1vZGVsT2JqZWN0UGF0aCk7XG5cdHRhYmxlQ29uZmlndXJhdGlvbi5pc0hpZXJhcmNoeVBhcmVudE5vZGVVcGRhdGFibGUgPSAhbm9uVXBkYXRhYmxlTmF2aWdhdGlvblByb3BlcnRpZXM/LmluY2x1ZGVzKGhpZXJhcmNoeVBhcmVudE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgpO1xuXHR0YWJsZUNvbmZpZ3VyYXRpb24uaXNOb2RlTW92YWJsZSA9IGdldEN1c3RvbUZ1bmN0aW9uSW5mbyh0YWJsZVNldHRpbmdzLmlzTm9kZU1vdmFibGUsIHRhYmxlQ29uZmlndXJhdGlvbik7XG5cdHRhYmxlQ29uZmlndXJhdGlvbi5pc01vdmVUb1Bvc2l0aW9uQWxsb3dlZCA9IGdldEN1c3RvbUZ1bmN0aW9uSW5mbyh0YWJsZVNldHRpbmdzLmlzTW92ZVRvUG9zaXRpb25BbGxvd2VkLCB0YWJsZUNvbmZpZ3VyYXRpb24pO1xuXHR0YWJsZUNvbmZpZ3VyYXRpb24uY3JlYXRlRW5hYmxlbWVudCA9IGdldEN1c3RvbUZ1bmN0aW9uSW5mbyh0YWJsZVNldHRpbmdzLmNyZWF0aW9uTW9kZT8uaXNDcmVhdGVFbmFibGVkLCB0YWJsZUNvbmZpZ3VyYXRpb24pO1xuXG5cdGlmICh0YWJsZVNldHRpbmdzLmNyZWF0aW9uTW9kZT8ubm9kZVR5cGU/LnByb3BlcnR5TmFtZSAmJiB0YWJsZVNldHRpbmdzLmNyZWF0aW9uTW9kZT8ubm9kZVR5cGU/LnZhbHVlcykge1xuXHRcdGNvbnN0IHZhbHVlcyA9IHRhYmxlU2V0dGluZ3MuY3JlYXRpb25Nb2RlLm5vZGVUeXBlLnZhbHVlcztcblx0XHR0YWJsZUNvbmZpZ3VyYXRpb24ubm9kZVR5cGUgPSB7XG5cdFx0XHRwcm9wZXJ0eU5hbWU6IHRhYmxlU2V0dGluZ3MuY3JlYXRpb25Nb2RlLm5vZGVUeXBlLnByb3BlcnR5TmFtZSxcblx0XHRcdHZhbHVlczogT2JqZWN0LmtleXModmFsdWVzKS5tYXAoKHZhbHVlKSA9PiB7XG5cdFx0XHRcdGNvbnN0IG5vZGVUeXBlSW5mbyA9IHZhbHVlc1t2YWx1ZV07XG5cblx0XHRcdFx0aWYgKHR5cGVvZiBub2RlVHlwZUluZm8gPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0dmFsdWUsXG5cdFx0XHRcdFx0XHR0ZXh0OiBub2RlVHlwZUluZm9cblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0XHR2YWx1ZSxcblx0XHRcdFx0XHRcdHRleHQ6IG5vZGVUeXBlSW5mby5sYWJlbCxcblx0XHRcdFx0XHRcdGNyZWF0aW9uRGlhbG9nRmllbGRzOlxuXHRcdFx0XHRcdFx0XHR0YWJsZUNvbmZpZ3VyYXRpb24uY3JlYXRpb25Nb2RlID09PSBDcmVhdGlvbk1vZGUuQ3JlYXRpb25EaWFsb2dcblx0XHRcdFx0XHRcdFx0XHQ/IGdldEZpZWxkTGlzdChub2RlVHlwZUluZm8uY3JlYXRpb25GaWVsZHMsIGNvbnZlcnRlckNvbnRleHQpXG5cdFx0XHRcdFx0XHRcdFx0OiB1bmRlZmluZWRcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9XG5cdFx0XHR9KVxuXHRcdH07XG5cdH1cblxuXHQvLyBDcmVhdGUgaW4gcGxhY2Vcblx0aWYgKHRhYmxlU2V0dGluZ3MuY3JlYXRpb25Nb2RlPy5jcmVhdGVJblBsYWNlKSB7XG5cdFx0dGFibGVDb25maWd1cmF0aW9uLmNyZWF0ZUluUGxhY2UgPSB0cnVlO1xuXHR9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDdXN0b21GdW5jdGlvbkluZm8oXG5cdHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG5cdHRhYmxlQ29uZmlndXJhdGlvbjogVGFibGVDb250cm9sQ29uZmlndXJhdGlvblxuKTogRXh0ZXJuYWxNZXRob2RDb25maWcgfCB1bmRlZmluZWQge1xuXHRpZiAoIXZhbHVlKSB7XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxuXHRjb25zdCBsYXN0RG90SW5kZXggPSB2YWx1ZS5sYXN0SW5kZXhPZihcIi5cIikgfHwgLTE7XG5cdGNvbnN0IG1vZHVsZU5hbWUgPSB2YWx1ZS5zdWJzdHJpbmcoMCwgbGFzdERvdEluZGV4KS5yZXBsYWNlKC9cXC4vZ2ksIFwiL1wiKTtcblx0Y29uc3QgbWV0aG9kTmFtZSA9IHZhbHVlLnN1YnN0cmluZyhsYXN0RG90SW5kZXggKyAxKTtcblxuXHQvLyBBZGQgdGhlIGN1c3RvbSBtb2R1bGUgaW4gdGhlIGxpc3Qgb2YgcmVxdWlyZWQgbW9kdWxlcyBpZiBuZWNlc3Nhcnlcblx0aWYgKCFtb2R1bGVOYW1lLnN0YXJ0c1dpdGgoXCIvZXh0ZW5zaW9uL1wiKSkge1xuXHRcdGlmICghdGFibGVDb25maWd1cmF0aW9uLmFkZGl0aW9uYWxSZXF1aXJlZE1vZHVsZXMpIHtcblx0XHRcdHRhYmxlQ29uZmlndXJhdGlvbi5hZGRpdGlvbmFsUmVxdWlyZWRNb2R1bGVzID0gW21vZHVsZU5hbWVdO1xuXHRcdH0gZWxzZSBpZiAoIXRhYmxlQ29uZmlndXJhdGlvbi5hZGRpdGlvbmFsUmVxdWlyZWRNb2R1bGVzLmluY2x1ZGVzKG1vZHVsZU5hbWUpKSB7XG5cdFx0XHR0YWJsZUNvbmZpZ3VyYXRpb24uYWRkaXRpb25hbFJlcXVpcmVkTW9kdWxlcy5wdXNoKG1vZHVsZU5hbWUpO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiB7IG1vZHVsZU5hbWUsIG1ldGhvZE5hbWUgfTtcbn1cblxuLyoqXG4gKiBSZXRyaWV2ZSB0aGUgdGFibGUgY29udHJvbCBjb25maWd1cmF0aW9uIG9wdGltaXN0aWMgYmF0Y2ggaW5mb3JtYXRpb24uXG4gKiBAcGFyYW0gdGFibGVNYW5pZmVzdFNldHRpbmdzIFRoZSB0YWJsZSBjb25maWd1cmF0aW9uXG4gQHJldHVybnMgVHJ1ZSBpZiBPcHRpbWlzdGljIGJhdGNoIG1vZGUgaXMgZGlzYWJsZWRcbiAqL1xuZnVuY3Rpb24gZ2V0T3B0aW1pc3RpY0JhdGNoU2V0dGluZ3NGcm9tTWFuaWZlc3QodGFibGVNYW5pZmVzdFNldHRpbmdzOiBUYWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbik6IGJvb2xlYW4ge1xuXHQvLyBPcHRpbWlzdGljIGJhdGNoIGlzIHNldCBieSBkZWZhdWx0XG5cdHJldHVybiB0YWJsZU1hbmlmZXN0U2V0dGluZ3M/LnRhYmxlU2V0dGluZ3M/LmRpc2FibGVSZXF1ZXN0Q2FjaGUgfHwgZmFsc2U7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgc2V0dGluZ3MgY29taW5nIGZyb20gdGhlIG1hbmlmZXN0IHJlbGF0ZWQgdG8gdGhlIG1hc3MgZWRpdCBkaWFsb2cuXG4gKiBAcGFyYW0gdGFibGVTZXR0aW5ncyBUaGUgdGFibGUgY29uZmlndXJhdGlvblxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGluc3RhbmNlIG9mIHRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHJldHVybnMgVGhlIG1hc3MgZWRpdCBjb25maWd1cmF0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWFzc0VkaXRTZXR0aW5ncyhcblx0dGFibGVTZXR0aW5nczogVGFibGVNYW5pZmVzdFNldHRpbmdzQ29uZmlndXJhdGlvbixcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+XG4pOiBNYXNzRWRpdFRhYmxlQ29uZmlndXJhdGlvbiB7XG5cdGNvbnN0IGRlZmF1bHRGaWVsZENvbmZpZ3VyYXRpb24gPSB7XG5cdFx0dmlzaWJsZUZpZWxkczogW10sXG5cdFx0aWdub3JlZEZpZWxkczogW10sXG5cdFx0b3BlcmF0aW9uR3JvdXBpbmdNb2RlOlxuXHRcdFx0Y29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSA9PT0gVGVtcGxhdGVUeXBlLkxpc3RSZXBvcnRcblx0XHRcdFx0PyBPcGVyYXRpb25Hcm91cGluZ01vZGUuSXNvbGF0ZWRcblx0XHRcdFx0OiBPcGVyYXRpb25Hcm91cGluZ01vZGUuQ2hhbmdlU2V0XG5cdH07XG5cdGlmICghdGFibGVTZXR0aW5ncy5lbmFibGVNYXNzRWRpdCkge1xuXHRcdHJldHVybiB7IGVuYWJsZWQ6IGZhbHNlLCAuLi5kZWZhdWx0RmllbGRDb25maWd1cmF0aW9uIH07XG5cdH1cblx0aWYgKHRhYmxlU2V0dGluZ3MuZW5hYmxlTWFzc0VkaXQgPT09IHRydWUpIHtcblx0XHRyZXR1cm4geyBlbmFibGVkOiB0YWJsZVNldHRpbmdzLmVuYWJsZU1hc3NFZGl0LCAuLi5kZWZhdWx0RmllbGRDb25maWd1cmF0aW9uIH07XG5cdH0gZWxzZSBpZiAodHlwZW9mIHRhYmxlU2V0dGluZ3MuZW5hYmxlTWFzc0VkaXQgPT09IFwib2JqZWN0XCIpIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0ZW5hYmxlZDogdHJ1ZSxcblx0XHRcdHZpc2libGVGaWVsZHM6IGdldEZpZWxkTGlzdCh0YWJsZVNldHRpbmdzLmVuYWJsZU1hc3NFZGl0LnZpc2libGVGaWVsZHMsIGNvbnZlcnRlckNvbnRleHQpLFxuXHRcdFx0aWdub3JlZEZpZWxkczogZ2V0RmllbGRMaXN0KHRhYmxlU2V0dGluZ3MuZW5hYmxlTWFzc0VkaXQuaWdub3JlZEZpZWxkcywgY29udmVydGVyQ29udGV4dCksXG5cdFx0XHRvcGVyYXRpb25Hcm91cGluZ01vZGU6XG5cdFx0XHRcdHRhYmxlU2V0dGluZ3MuZW5hYmxlTWFzc0VkaXQub3BlcmF0aW9uR3JvdXBpbmdNb2RlICYmXG5cdFx0XHRcdE9iamVjdC52YWx1ZXMoT3BlcmF0aW9uR3JvdXBpbmdNb2RlKS5pbmNsdWRlcyh0YWJsZVNldHRpbmdzLmVuYWJsZU1hc3NFZGl0Lm9wZXJhdGlvbkdyb3VwaW5nTW9kZSlcblx0XHRcdFx0XHQ/IHRhYmxlU2V0dGluZ3MuZW5hYmxlTWFzc0VkaXQub3BlcmF0aW9uR3JvdXBpbmdNb2RlXG5cdFx0XHRcdFx0OiBkZWZhdWx0RmllbGRDb25maWd1cmF0aW9uLm9wZXJhdGlvbkdyb3VwaW5nTW9kZSxcblx0XHRcdGN1c3RvbUZyYWdtZW50OiB0YWJsZVNldHRpbmdzLmVuYWJsZU1hc3NFZGl0LmN1c3RvbUZyYWdtZW50XG5cdFx0fTtcblx0fVxuXHRyZXR1cm4geyBlbmFibGVkOiBmYWxzZSwgLi4uZGVmYXVsdEZpZWxkQ29uZmlndXJhdGlvbiB9O1xufVxuXG4vKipcbiAqIEdldHMgYSBsaXN0IG9mIHRoZSBmaWVsZHMgY29taW5nIGZyb20gdGhlIG1hbmlmZXN0LlxuICogQHBhcmFtIGZpZWxkcyBUaGUgZmllbGRzLCBjb3VsZCBiZSBhIEZpZWxkR3JvdXAgb3IgZmllbGRzIHNlcGFyYXRlZCBieSBhIGNvbW1hXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCBUaGUgaW5zdGFuY2Ugb2YgdGhlIGNvbnZlcnRlciBjb250ZXh0XG4gKiBAcmV0dXJucyBUaGUgbGlzdCBvZiBmaWVsZHMuXG4gKi9cbmZ1bmN0aW9uIGdldEZpZWxkTGlzdChmaWVsZHM6IHN0cmluZyB8IHVuZGVmaW5lZCwgY29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+KTogc3RyaW5nW10ge1xuXHRpZiAoIWZpZWxkcykge1xuXHRcdHJldHVybiBbXTtcblx0fVxuXHRpZiAoZmllbGRzLnN0YXJ0c1dpdGgoVUlBbm5vdGF0aW9uVGVybXMuRmllbGRHcm91cCkpIHtcblx0XHRjb25zdCBmaWVsZEdyb3VwID0gY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlUeXBlQW5ub3RhdGlvbjxGaWVsZEdyb3VwPihgQCR7ZmllbGRzfWApO1xuXHRcdGlmIChpc0Fubm90YXRpb25PZlR5cGU8RmllbGRHcm91cD4oZmllbGRHcm91cC5hbm5vdGF0aW9uLCBVSUFubm90YXRpb25UeXBlcy5GaWVsZEdyb3VwVHlwZSkpIHtcblx0XHRcdHJldHVybiBmaWVsZEdyb3VwLmFubm90YXRpb24uRGF0YS5yZWR1Y2UoKHByb3BlcnRpZXM6IHN0cmluZ1tdLCBmaWVsZCkgPT4ge1xuXHRcdFx0XHRpZiAoaXNEYXRhRmllbGQoZmllbGQpICYmIGlzUGF0aEFubm90YXRpb25FeHByZXNzaW9uKGZpZWxkLlZhbHVlKSkge1xuXHRcdFx0XHRcdHByb3BlcnRpZXMucHVzaChmaWVsZC5WYWx1ZS5wYXRoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gcHJvcGVydGllcztcblx0XHRcdH0sIFtdKTtcblx0XHR9XG5cdFx0cmV0dXJuIFtdO1xuXHR9XG5cdHJldHVybiBmaWVsZHNcblx0XHQucmVwbGFjZSgvXFxzL2csIFwiXCIpXG5cdFx0LnNwbGl0KFwiLFwiKVxuXHRcdC5tYXAoKG5hbWUpID0+IG5hbWUudHJpbSgpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uKFxuXHRsaW5lSXRlbUFubm90YXRpb246IExpbmVJdGVtIHwgdW5kZWZpbmVkLFxuXHR2aXN1YWxpemF0aW9uUGF0aDogc3RyaW5nLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sXG5cdGNoZWNrQ29uZGVuc2VkTGF5b3V0ID0gdHJ1ZSxcblx0c2VsZWN0aW9uVmFyaWFudEFubm90YXRpb24/OiBTZWxlY3Rpb25WYXJpYW50VHlwZVxuKTogVGFibGVDb250cm9sQ29uZmlndXJhdGlvbiB7XG5cdGNvbnN0IF9tYW5pZmVzdFdyYXBwZXIgPSBjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0V3JhcHBlcigpO1xuXHRjb25zdCB0YWJsZU1hbmlmZXN0U2V0dGluZ3M6IFRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uID0gY29udmVydGVyQ29udGV4dC5nZXRNYW5pZmVzdENvbnRyb2xDb25maWd1cmF0aW9uKHZpc3VhbGl6YXRpb25QYXRoKTtcblx0Y29uc3QgdGFibGVTZXR0aW5ncyA9IHRhYmxlTWFuaWZlc3RTZXR0aW5ncz8udGFibGVTZXR0aW5ncyA/PyB7fTtcblx0Y29uc3QgZ2xvYmFsRkVNYW5pZmVzdFNldHRpbmdzID0gX21hbmlmZXN0V3JhcHBlci5nZXRTYXBGZU1hbmlmZXN0Q29uZmlndXJhdGlvbigpO1xuXHRjb25zdCBkZWZhdWx0Q3JlYXRpb25Nb2RlID1cblx0XHRnbG9iYWxGRU1hbmlmZXN0U2V0dGluZ3M/Lm1hY3Jvcz8udGFibGU/LmRlZmF1bHRDcmVhdGlvbk1vZGUgPT09IFwiSW5saW5lQ3JlYXRpb25Sb3dzXCIgPyBDcmVhdGlvbk1vZGUuSW5saW5lQ3JlYXRpb25Sb3dzIDogdW5kZWZpbmVkO1xuXHRjb25zdCBjcmVhdGlvbk1vZGU6IENyZWF0aW9uTW9kZSA9IHRhYmxlU2V0dGluZ3MuY3JlYXRpb25Nb2RlPy5uYW1lID8/IGRlZmF1bHRDcmVhdGlvbk1vZGUgPz8gQ3JlYXRpb25Nb2RlLk5ld1BhZ2U7XG5cdGNvbnN0IGVuYWJsZUF1dG9Db2x1bW5XaWR0aCA9ICFfbWFuaWZlc3RXcmFwcGVyLmlzUGhvbmUoKTtcblx0Y29uc3QgZGlzYWJsZUNvcHlUb0NsaXBib2FyZCA9IHRhYmxlU2V0dGluZ3MuZGlzYWJsZUNvcHlUb0NsaXBib2FyZDtcblx0Y29uc3QgdGVtcGxhdGVUeXBlID0gY29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKTtcblx0Y29uc3QgZGF0YVN0YXRlSW5kaWNhdG9yRmlsdGVyID0gdGVtcGxhdGVUeXBlID09PSBUZW1wbGF0ZVR5cGUuTGlzdFJlcG9ydCA/IFwiQVBJLmRhdGFTdGF0ZUluZGljYXRvckZpbHRlclwiIDogdW5kZWZpbmVkO1xuXHRjb25zdCBpc0NvbmRlbnNlZFRhYmxlTGF5b3V0Q29tcGxpYW50ID0gY2hlY2tDb25kZW5zZWRMYXlvdXQgJiYgX21hbmlmZXN0V3JhcHBlci5pc0NvbmRlbnNlZExheW91dENvbXBsaWFudCgpO1xuXHRjb25zdCBvRmlsdGVyQ29uZmlndXJhdGlvbiA9IGxpbmVJdGVtQW5ub3RhdGlvblxuXHRcdD8gZ2V0RmlsdGVyQ29uZmlndXJhdGlvbih0YWJsZVNldHRpbmdzLCBsaW5lSXRlbUFubm90YXRpb24sIGNvbnZlcnRlckNvbnRleHQsIHNlbGVjdGlvblZhcmlhbnRBbm5vdGF0aW9uKVxuXHRcdDoge307XG5cdGNvbnN0IGN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbiA9IHRhYmxlU2V0dGluZ3MuY3JlYXRpb25Nb2RlPy5jdXN0b21WYWxpZGF0aW9uRnVuY3Rpb247XG5cdGNvbnN0IGV4cG9ydFJlcXVlc3RTaXplID0gdGFibGVTZXR0aW5ncy5leHBvcnRSZXF1ZXN0U2l6ZTtcblx0Y29uc3QgdGFibGVUeXBlID0gZ2V0VGFibGVUeXBlKGNvbnZlcnRlckNvbnRleHQsIHRhYmxlTWFuaWZlc3RTZXR0aW5ncyk7XG5cdC8vIEJ5IGRlZmF1bHQsIHBhc3RlIGlzIGVuYWJsZWQgb24gYW4gT2JqZWN0UGFnZSBhbmQgb24gYSBMaXN0UmVwb3J0IHdpdGggYSBkcmFmdCBUcmVlVGFibGVcblx0Y29uc3QgZW5hYmxlUGFzdGUgPVxuXHRcdHRhYmxlU2V0dGluZ3MuZW5hYmxlUGFzdGUgPz9cblx0XHQoY29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSA9PT0gXCJPYmplY3RQYWdlXCIgfHxcblx0XHRcdCh0YWJsZVR5cGUgPT09IFwiVHJlZVRhYmxlXCIgJiYgKGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0KCkgYXMgRW50aXR5U2V0KT8uYW5ub3RhdGlvbnMuQ29tbW9uPy5EcmFmdFJvb3QgIT09IHVuZGVmaW5lZCkpO1xuXHRjb25zdCB0YWJsZVJvd01vZGUgPSBfZ2V0VGFibGVNb2RlKHRhYmxlVHlwZSwgdGFibGVTZXR0aW5ncywgdGVtcGxhdGVUeXBlID09PSBUZW1wbGF0ZVR5cGUuTGlzdFJlcG9ydCk7XG5cdGNvbnN0IGRlZmF1bHRTY3JvbGxUaHJlc2hvbGQgPSB0YWJsZVR5cGUgIT09IFwiUmVzcG9uc2l2ZVRhYmxlXCIgPyAzMDAgOiB1bmRlZmluZWQ7XG5cdGNvbnN0IGNvbmRlbnNlZFRhYmxlTGF5b3V0ID0gX2dldENvbmRlbnNlZFRhYmxlTGF5b3V0KHRhYmxlVHlwZSwgdGFibGVTZXR0aW5ncyk7XG5cdGxldCBpbmxpbmVDcmVhdGlvblJvd3NIaWRkZW5JbkVkaXRNb2RlID0gZmFsc2U7XG5cdGlmICh0YWJsZVNldHRpbmdzLmNyZWF0aW9uTW9kZT8uaW5saW5lQ3JlYXRpb25Sb3dzSGlkZGVuSW5FZGl0TW9kZSkge1xuXHRcdGlubGluZUNyZWF0aW9uUm93c0hpZGRlbkluRWRpdE1vZGUgPVxuXHRcdFx0dHlwZW9mIHRhYmxlU2V0dGluZ3MuY3JlYXRpb25Nb2RlPy5pbmxpbmVDcmVhdGlvblJvd3NIaWRkZW5JbkVkaXRNb2RlID09PSBcInN0cmluZ1wiXG5cdFx0XHRcdD8gdGFibGVTZXR0aW5ncy5jcmVhdGlvbk1vZGU/LmlubGluZUNyZWF0aW9uUm93c0hpZGRlbkluRWRpdE1vZGUgPT09IFwidHJ1ZVwiXG5cdFx0XHRcdDogdGFibGVTZXR0aW5ncy5jcmVhdGlvbk1vZGU/LmlubGluZUNyZWF0aW9uUm93c0hpZGRlbkluRWRpdE1vZGU7XG5cdH1cblx0bGV0IHVzZVRleHRGb3JOb0RhdGFNZXNzYWdlczogc3RyaW5nO1xuXHRpZiAoY29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSA9PT0gXCJMaXN0UmVwb3J0XCIpIHtcblx0XHR1c2VUZXh0Rm9yTm9EYXRhTWVzc2FnZXMgPSBcImlsbHVzdHJhdGVkTWVzc2FnZS1BdXRvXCI7XG5cdH0gZWxzZSB7XG5cdFx0dXNlVGV4dEZvck5vRGF0YU1lc3NhZ2VzID0gX21hbmlmZXN0V3JhcHBlci5nZXRVc2VUZXh0Rm9yTm9EYXRhTWVzc2FnZXMoKSA/IFwidGV4dFwiIDogXCJpbGx1c3RyYXRlZE1lc3NhZ2UtRG90XCI7XG5cdH1cblx0Y29uc3Qgb0NvbmZpZ3VyYXRpb24gPSB7XG5cdFx0Ly8gSWYgbm8gY3JlYXRlQXRFbmQgaXMgc3BlY2lmaWVkIGl0IHdpbGwgYmUgZmFsc2UgZm9yIElubGluZS9DcmVhdGlvbkRpYWxvZyBjcmVhdGUgYW5kIHRydWUgb3RoZXJ3aXNlXG5cdFx0Y3JlYXRlQXRFbmQ6XG5cdFx0XHR0YWJsZVNldHRpbmdzLmNyZWF0aW9uTW9kZT8uY3JlYXRlQXRFbmQgIT09IHVuZGVmaW5lZFxuXHRcdFx0XHQ/IHRhYmxlU2V0dGluZ3MuY3JlYXRpb25Nb2RlPy5jcmVhdGVBdEVuZFxuXHRcdFx0XHQ6ICFbQ3JlYXRpb25Nb2RlLklubGluZSwgQ3JlYXRpb25Nb2RlLkNyZWF0aW9uRGlhbG9nXS5pbmNsdWRlcyhjcmVhdGlvbk1vZGUpLFxuXHRcdGNyZWF0aW9uTW9kZTogY3JlYXRpb25Nb2RlLFxuXHRcdGNyZWF0aW9uRGlhbG9nRmllbGRzOlxuXHRcdFx0Y3JlYXRpb25Nb2RlID09PSBDcmVhdGlvbk1vZGUuQ3JlYXRpb25EaWFsb2dcblx0XHRcdFx0PyBnZXRGaWVsZExpc3QodGFibGVTZXR0aW5ncy5jcmVhdGlvbk1vZGU/LmNyZWF0aW9uRmllbGRzLCBjb252ZXJ0ZXJDb250ZXh0KVxuXHRcdFx0XHQ6IHVuZGVmaW5lZCxcblx0XHRjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb246IGN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbixcblx0XHRkYXRhU3RhdGVJbmRpY2F0b3JGaWx0ZXI6IGRhdGFTdGF0ZUluZGljYXRvckZpbHRlcixcblx0XHQvLyBpZiBhIGN1c3RvbSB2YWxpZGF0aW9uIGZ1bmN0aW9uIGlzIHByb3ZpZGVkLCBkaXNhYmxlQWRkUm93QnV0dG9uRm9yRW1wdHlEYXRhIHNob3VsZCBub3QgYmUgY29uc2lkZXJlZCwgaS5lLiBzZXQgdG8gZmFsc2Vcblx0XHRkaXNhYmxlQWRkUm93QnV0dG9uRm9yRW1wdHlEYXRhOiAhY3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uID8gISF0YWJsZVNldHRpbmdzLmNyZWF0aW9uTW9kZT8uZGlzYWJsZUFkZFJvd0J1dHRvbkZvckVtcHR5RGF0YSA6IGZhbHNlLFxuXHRcdGVuYWJsZUF1dG9Db2x1bW5XaWR0aDogZW5hYmxlQXV0b0NvbHVtbldpZHRoLFxuXHRcdGVuYWJsZVBhc3RpbmdPZkNvbXB1dGVkUHJvcGVydGllczogdGFibGVTZXR0aW5ncy5lbmFibGVQYXN0aW5nT2ZDb21wdXRlZFByb3BlcnRpZXMsXG5cdFx0ZW5hYmxlRXhwb3J0OiBfZ2V0RW5hYmxlRXhwb3J0KHRhYmxlU2V0dGluZ3MsIGNvbnZlcnRlckNvbnRleHQsIGVuYWJsZVBhc3RlKSxcblx0XHRmcm96ZW5Db2x1bW5Db3VudDogX2dldEZyb3plbkNvbHVtbkNvdW50KHRhYmxlU2V0dGluZ3MpLFxuXHRcdHdpZHRoSW5jbHVkaW5nQ29sdW1uSGVhZGVyOiBfZ2V0V2lkdGhJbmNsdWRpbmdDb2x1bW5IZWFkZXIodGFibGVTZXR0aW5ncyksXG5cdFx0ZW5hYmxlRnVsbFNjcmVlbjogX2dldEZ1bGxTY3JlZW5CYXNlZE9uRGV2aWNlKHRhYmxlU2V0dGluZ3MsIGNvbnZlcnRlckNvbnRleHQsIF9tYW5pZmVzdFdyYXBwZXIuaXNQaG9uZSgpKSxcblx0XHRtYXNzRWRpdDogZ2V0TWFzc0VkaXRTZXR0aW5ncyh0YWJsZVNldHRpbmdzLCBjb252ZXJ0ZXJDb250ZXh0KSxcblx0XHRlbmFibGVBZGRDYXJkVG9JbnNpZ2h0czogdGFibGVTZXR0aW5ncz8uZW5hYmxlQWRkQ2FyZFRvSW5zaWdodHMsXG5cdFx0ZW5hYmxlUGFzdGU6IGVuYWJsZVBhc3RlLFxuXHRcdGRpc2FibGVDb3B5VG9DbGlwYm9hcmQ6IGRpc2FibGVDb3B5VG9DbGlwYm9hcmQsXG5cdFx0aGVhZGVyVmlzaWJsZTogdHJ1ZSxcblx0XHRoZWFkZXI6IHRhYmxlU2V0dGluZ3MuaGVhZGVyLFxuXHRcdG11bHRpU2VsZWN0TW9kZTogX2dldE11bHRpU2VsZWN0TW9kZSh0YWJsZVNldHRpbmdzLCB0YWJsZVR5cGUsIGNvbnZlcnRlckNvbnRleHQpLFxuXHRcdHNlbGVjdGlvbkxpbWl0OiBfZ2V0VGFibGVTZWxlY3Rpb25MaW1pdCh0YWJsZVNldHRpbmdzKSxcblx0XHRpbmxpbmVDcmVhdGlvblJvd0NvdW50OiBfZ2V0VGFibGVJbmxpbmVDcmVhdGlvblJvd0NvdW50KHRhYmxlU2V0dGluZ3MpLFxuXHRcdGlubGluZUNyZWF0aW9uUm93c0hpZGRlbkluRWRpdE1vZGU6IGlubGluZUNyZWF0aW9uUm93c0hpZGRlbkluRWRpdE1vZGUsXG5cdFx0c2hvd1Jvd0NvdW50OiB0YWJsZVNldHRpbmdzPy5xdWlja1ZhcmlhbnRTZWxlY3Rpb24/LnBhdGhzID8gZmFsc2UgOiAhX21hbmlmZXN0V3JhcHBlci5nZXRWaWV3Q29uZmlndXJhdGlvbigpPy5zaG93Q291bnRzLFxuXHRcdHR5cGU6IHRhYmxlVHlwZSxcblx0XHRkaXNhYmxlUmVxdWVzdENhY2hlOiBnZXRPcHRpbWlzdGljQmF0Y2hTZXR0aW5nc0Zyb21NYW5pZmVzdCh0YWJsZU1hbmlmZXN0U2V0dGluZ3MpLFxuXHRcdHVzZUNvbmRlbnNlZFRhYmxlTGF5b3V0OiBjb25kZW5zZWRUYWJsZUxheW91dCAmJiBpc0NvbmRlbnNlZFRhYmxlTGF5b3V0Q29tcGxpYW50LFxuXHRcdGlzQ29tcGFjdFR5cGU6IF9tYW5pZmVzdFdyYXBwZXIuaXNDb21wYWN0VHlwZSgpLFxuXHRcdGJlZm9yZVJlYmluZFRhYmxlOiB0YWJsZVNldHRpbmdzLmJlZm9yZVJlYmluZFRhYmxlLFxuXHRcdGV4cG9ydFJlcXVlc3RTaXplOiBleHBvcnRSZXF1ZXN0U2l6ZSxcblx0XHRlbmFibGVVcGxvYWRQbHVnaW46ICEhY29udmVydGVyQ29udGV4dC5nZXRBbm5vdGF0aW9uRW50aXR5VHlwZSgpLmFubm90YXRpb25zPy5VST8uTWVkaWFSZXNvdXJjZT8uU3RyZWFtLFxuXHRcdHNlbGVjdGlvbkNoYW5nZTogdGFibGVTZXR0aW5ncy5zZWxlY3Rpb25DaGFuZ2UsXG5cdFx0bW9kZUZvck5vRGF0YU1lc3NhZ2U6IHVzZVRleHRGb3JOb0RhdGFNZXNzYWdlcyxcblx0XHRzY3JvbGxUaHJlc2hvbGQ6IHRhYmxlU2V0dGluZ3Muc2Nyb2xsVGhyZXNob2xkID8/IGRlZmF1bHRTY3JvbGxUaHJlc2hvbGRcblx0fTtcblxuXHRjb25zdCB0YWJsZUNvbmZpZ3VyYXRpb246IFRhYmxlQ29udHJvbENvbmZpZ3VyYXRpb24gPSB7IC4uLm9Db25maWd1cmF0aW9uLCAuLi50YWJsZVJvd01vZGUsIC4uLm9GaWx0ZXJDb25maWd1cmF0aW9uIH07XG5cdGlmICh0YWJsZVR5cGUgPT09IFwiVHJlZVRhYmxlXCIpIHtcblx0XHR1cGRhdGVUcmVlVGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24odGFibGVDb25maWd1cmF0aW9uLCB0YWJsZVNldHRpbmdzLCBjb252ZXJ0ZXJDb250ZXh0KTtcblx0fVxuXG5cdGlmICh0YWJsZVNldHRpbmdzLmhlYWRlclZpc2libGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHRhYmxlQ29uZmlndXJhdGlvbi5oZWFkZXJWaXNpYmxlID0gdGFibGVTZXR0aW5ncy5oZWFkZXJWaXNpYmxlO1xuXHR9XG5cblx0cmV0dXJuIHRhYmxlQ29uZmlndXJhdGlvbjtcbn1cblxuZnVuY3Rpb24gZ2V0VGFibGVUeXBlKFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sXG5cdHRhYmxlTWFuaWZlc3RTZXR0aW5ncz86IFRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uXG4pOiBUYWJsZVR5cGUge1xuXHRpZiAodGFibGVNYW5pZmVzdFNldHRpbmdzPy50YWJsZVNldHRpbmdzPy50eXBlKSB7XG5cdFx0Ly8gaW4gY2FzZSB0aGUgYXBwbGljYXRpb24gc3BlY2lmaWVkIGEgdGFibGUgdHlwZSB3ZSB3aWxsIHVzZSB0aGlzIG9uZVxuXHRcdHJldHVybiB0YWJsZU1hbmlmZXN0U2V0dGluZ3MudGFibGVTZXR0aW5ncy50eXBlO1xuXHR9XG5cblx0Ly8gZGVmYXVsdCBpcyB0aGUgUmVzcG9uc2l2ZVRhYmxlXG5cdHJldHVybiBcIlJlc3BvbnNpdmVUYWJsZVwiO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBwcm9wZXJ0eSB1c2luZyB0aGUgdGV4dCBhcnJhbmdlbWVudCBhbm5vdGF0aW9uIHNldCB0byB0ZXh0IG9ubHkuXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCBUaGUgY29udmVydGVyIGNvbnRleHQuXG4gKiBAcGFyYW0gcHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoIFRoZSBjb3JyZXNwb25kaW5nIERhdGFNb2RlbE9iamVjdFBhdGguXG4gKiBAcGFyYW0gbGluZUl0ZW0gVGhlIGNvbHVtbiB0byBiZSBldmFsdWF0ZWQuXG4gKiBAcGFyYW0gY29sdW1uc1RvQmVDcmVhdGVkIFRoZSBsaXN0IG9mIGNvbHVtbnMgdG8gYmUgY3JlYXRlZC5cbiAqIEBwYXJhbSByZWxhdGl2ZVBhdGggVGhlIHJlbGF0aXZlIHBhdGggdG8gdGhlIHRhcmdldCBwcm9wZXJ0eSBiYXNlZCBvbiB0aGUgY29udGV4dC5cbiAqIEBwYXJhbSByZXN0cmljdGlvbnNPblByb3BlcnRpZXMgVGhlIGV4aXN0aW5nIHJlc3RyaWN0aW9ucyBvbiBwcm9wZXJ0aWVzXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVByb3BlcnR5QW5ub3RhdGVkVGV4dE9ubHkoXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pixcblx0cHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoPERhdGFGaWVsZEFic3RyYWN0VHlwZXM+LFxuXHRsaW5lSXRlbTogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyxcblx0Y29sdW1uc1RvQmVDcmVhdGVkOiBSZWNvcmQ8c3RyaW5nLCBQcm9wZXJ0eT4sXG5cdHJlbGF0aXZlUGF0aDogc3RyaW5nLFxuXHRyZXN0cmljdGlvbnNPblByb3BlcnRpZXM6IFJlc3RyaWN0aW9uc09uUHJvcGVydGllc1xuKTogdm9pZCB7XG5cdGNvbnN0IGlzUHJvcGVydHlOYXZpZ2F0ZWQgPVxuXHRcdHByb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aC5uYXZpZ2F0aW9uUHJvcGVydGllcy5sZW5ndGggIT09IGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpLm5hdmlnYXRpb25Qcm9wZXJ0aWVzLmxlbmd0aDtcblx0aWYgKGlzUHJvcGVydHlOYXZpZ2F0ZWQgJiYgaXNEYXRhRmllbGQobGluZUl0ZW0pKSB7XG5cdFx0Y29sdW1uc1RvQmVDcmVhdGVkW3JlbGF0aXZlUGF0aF0gPSBsaW5lSXRlbS5WYWx1ZS4kdGFyZ2V0O1xuXHRcdHJlc3RyaWN0aW9uc09uUHJvcGVydGllcy5ub25Tb3J0YWJsZVByb3BlcnRpZXMucHVzaChyZWxhdGl2ZVBhdGgpO1xuXHR9IGVsc2UgaWYgKGlzRGF0YUZpZWxkRm9yQW5ub3RhdGlvbihsaW5lSXRlbSkgJiYgaGFzRmllbGRHcm91cFRhcmdldChsaW5lSXRlbSkpIHtcblx0XHQobGluZUl0ZW0uVGFyZ2V0LiR0YXJnZXQgYXMgRmllbGRHcm91cCkuRGF0YS5mb3JFYWNoKChmaWVsZCkgPT4ge1xuXHRcdFx0aWYgKGlzRGF0YUZpZWxkKGZpZWxkKSAmJiBnZXREaXNwbGF5TW9kZShmaWVsZC5WYWx1ZS4kdGFyZ2V0KSA9PT0gXCJEZXNjcmlwdGlvblwiKSB7XG5cdFx0XHRcdGNvbnN0IGluaGVyZWRQcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGggPSBlbmhhbmNlRGF0YU1vZGVsUGF0aChcblx0XHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldERhdGFNb2RlbE9iamVjdFBhdGgoKSxcblx0XHRcdFx0XHRmaWVsZC5WYWx1ZS5wYXRoXG5cdFx0XHRcdCk7XG5cdFx0XHRcdGNvbnN0IGlzSW5oZXJlZFByb3BlcnR5TmF2aWdhdGVkID1cblx0XHRcdFx0XHRpbmhlcmVkUHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoLm5hdmlnYXRpb25Qcm9wZXJ0aWVzLmxlbmd0aCAhPT1cblx0XHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldERhdGFNb2RlbE9iamVjdFBhdGgoKS5uYXZpZ2F0aW9uUHJvcGVydGllcy5sZW5ndGg7XG5cdFx0XHRcdGlmIChpc0luaGVyZWRQcm9wZXJ0eU5hdmlnYXRlZCkge1xuXHRcdFx0XHRcdGNvbHVtbnNUb0JlQ3JlYXRlZFtmaWVsZC5WYWx1ZS5wYXRoXSA9IGZpZWxkLlZhbHVlLiR0YXJnZXQ7XG5cdFx0XHRcdFx0cmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzLm5vblNvcnRhYmxlUHJvcGVydGllcy5wdXNoKGZpZWxkLlZhbHVlLnBhdGgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFR5cGVDb25maWcob1Byb3BlcnR5OiBQcm9wZXJ0eSB8IERhdGFGaWVsZEFic3RyYWN0VHlwZXMgfCB1bmRlZmluZWQsIGRhdGFUeXBlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBQcm9wZXJ0eVR5cGVDb25maWcge1xuXHRsZXQgb1RhcmdldE1hcHBpbmc7XG5cdGlmIChpc1Byb3BlcnR5KG9Qcm9wZXJ0eSkpIHtcblx0XHRvVGFyZ2V0TWFwcGluZyA9IGlzVHlwZURlZmluaXRpb24ob1Byb3BlcnR5LnRhcmdldFR5cGUpXG5cdFx0XHQ/IEVETV9UWVBFX01BUFBJTkdbb1Byb3BlcnR5LnRhcmdldFR5cGUudW5kZXJseWluZ1R5cGVdXG5cdFx0XHQ6IEVETV9UWVBFX01BUFBJTkdbb1Byb3BlcnR5LnR5cGVdO1xuXHR9XG5cdGlmIChvVGFyZ2V0TWFwcGluZyA9PT0gdW5kZWZpbmVkICYmIGRhdGFUeXBlICE9PSB1bmRlZmluZWQpIHtcblx0XHRvVGFyZ2V0TWFwcGluZyA9IEVETV9UWVBFX01BUFBJTkdbZGF0YVR5cGVdO1xuXHR9XG5cdGNvbnN0IHByb3BlcnR5VHlwZUNvbmZpZzogUHJvcGVydHlUeXBlQ29uZmlnID0ge1xuXHRcdHR5cGU6IG9UYXJnZXRNYXBwaW5nPy50eXBlLFxuXHRcdGNvbnN0cmFpbnRzOiB7fSxcblx0XHRmb3JtYXRPcHRpb25zOiB7fVxuXHR9O1xuXHRpZiAoaXNQcm9wZXJ0eShvUHJvcGVydHkpICYmIG9UYXJnZXRNYXBwaW5nICE9PSB1bmRlZmluZWQpIHtcblx0XHRwcm9wZXJ0eVR5cGVDb25maWcuY29uc3RyYWludHMgPSB7XG5cdFx0XHRzY2FsZTogb1RhcmdldE1hcHBpbmcuY29uc3RyYWludHM/LiRTY2FsZSA/IG9Qcm9wZXJ0eS5zY2FsZSA6IHVuZGVmaW5lZCxcblx0XHRcdHByZWNpc2lvbjogb1RhcmdldE1hcHBpbmcuY29uc3RyYWludHM/LiRQcmVjaXNpb24gPyBvUHJvcGVydHkucHJlY2lzaW9uIDogdW5kZWZpbmVkLFxuXHRcdFx0bWF4TGVuZ3RoOiBvVGFyZ2V0TWFwcGluZy5jb25zdHJhaW50cz8uJE1heExlbmd0aCA/IG9Qcm9wZXJ0eS5tYXhMZW5ndGggOiB1bmRlZmluZWQsXG5cdFx0XHRudWxsYWJsZTogb1RhcmdldE1hcHBpbmcuY29uc3RyYWludHM/LiROdWxsYWJsZSA/IG9Qcm9wZXJ0eS5udWxsYWJsZSA6IHVuZGVmaW5lZCxcblx0XHRcdG1pbmltdW06XG5cdFx0XHRcdG9UYXJnZXRNYXBwaW5nLmNvbnN0cmFpbnRzPy5bXCJAT3JnLk9EYXRhLlZhbGlkYXRpb24uVjEuTWluaW11bS8kRGVjaW1hbFwiXSAmJlxuXHRcdFx0XHQhaXNOYU4ob1Byb3BlcnR5LmFubm90YXRpb25zPy5WYWxpZGF0aW9uPy5NaW5pbXVtKVxuXHRcdFx0XHRcdD8gYCR7b1Byb3BlcnR5LmFubm90YXRpb25zPy5WYWxpZGF0aW9uPy5NaW5pbXVtfWBcblx0XHRcdFx0XHQ6IHVuZGVmaW5lZCxcblx0XHRcdG1heGltdW06XG5cdFx0XHRcdG9UYXJnZXRNYXBwaW5nLmNvbnN0cmFpbnRzPy5bXCJAT3JnLk9EYXRhLlZhbGlkYXRpb24uVjEuTWF4aW11bS8kRGVjaW1hbFwiXSAmJlxuXHRcdFx0XHQhaXNOYU4ob1Byb3BlcnR5LmFubm90YXRpb25zPy5WYWxpZGF0aW9uPy5NYXhpbXVtKVxuXHRcdFx0XHRcdD8gYCR7b1Byb3BlcnR5LmFubm90YXRpb25zPy5WYWxpZGF0aW9uPy5NYXhpbXVtfWBcblx0XHRcdFx0XHQ6IHVuZGVmaW5lZCxcblx0XHRcdGlzRGlnaXRTZXF1ZW5jZTpcblx0XHRcdFx0cHJvcGVydHlUeXBlQ29uZmlnLnR5cGUgPT09IFwic2FwLnVpLm1vZGVsLm9kYXRhLnR5cGUuU3RyaW5nXCIgJiZcblx0XHRcdFx0b1RhcmdldE1hcHBpbmcuY29uc3RyYWludHM/LltgQCR7Q29tbW9uQW5ub3RhdGlvblRlcm1zLklzRGlnaXRTZXF1ZW5jZX1gXSAmJlxuXHRcdFx0XHRvUHJvcGVydHkuYW5ub3RhdGlvbnM/LkNvbW1vbj8uSXNEaWdpdFNlcXVlbmNlXG5cdFx0XHRcdFx0PyB0cnVlXG5cdFx0XHRcdFx0OiB1bmRlZmluZWRcblx0XHR9O1xuXHR9XG5cdHByb3BlcnR5VHlwZUNvbmZpZy5mb3JtYXRPcHRpb25zID0ge1xuXHRcdHBhcnNlQXNTdHJpbmc6XG5cdFx0XHRwcm9wZXJ0eVR5cGVDb25maWc/LnR5cGU/LmluZGV4T2YoXCJzYXAudWkubW9kZWwub2RhdGEudHlwZS5JbnRcIikgPT09IDAgfHxcblx0XHRcdHByb3BlcnR5VHlwZUNvbmZpZz8udHlwZT8uaW5kZXhPZihcInNhcC51aS5tb2RlbC5vZGF0YS50eXBlLkRvdWJsZVwiKSA9PT0gMFxuXHRcdFx0XHQ/IGZhbHNlXG5cdFx0XHRcdDogdW5kZWZpbmVkLFxuXHRcdGVtcHR5U3RyaW5nOlxuXHRcdFx0cHJvcGVydHlUeXBlQ29uZmlnPy50eXBlPy5pbmRleE9mKFwic2FwLnVpLm1vZGVsLm9kYXRhLnR5cGUuSW50XCIpID09PSAwIHx8XG5cdFx0XHRwcm9wZXJ0eVR5cGVDb25maWc/LnR5cGU/LmluZGV4T2YoXCJzYXAudWkubW9kZWwub2RhdGEudHlwZS5Eb3VibGVcIikgPT09IDBcblx0XHRcdFx0PyBcIlwiXG5cdFx0XHRcdDogdW5kZWZpbmVkLFxuXHRcdHBhcnNlS2VlcHNFbXB0eVN0cmluZzpcblx0XHRcdHByb3BlcnR5VHlwZUNvbmZpZy50eXBlID09PSBcInNhcC51aS5tb2RlbC5vZGF0YS50eXBlLlN0cmluZ1wiICYmIHByb3BlcnR5VHlwZUNvbmZpZy5jb25zdHJhaW50cy5udWxsYWJsZSA9PT0gZmFsc2Vcblx0XHRcdFx0PyB0cnVlXG5cdFx0XHRcdDogdW5kZWZpbmVkXG5cdH07XG5cdHJldHVybiBwcm9wZXJ0eVR5cGVDb25maWc7XG59XG4vKipcbiAqIEFkZCBhIGRlc2NyaXB0aW9uIHByb3BlcnR5IHRvIHRoZSBsaXN0IG9mIGRlc2NyaXB0aW9uIHByb3BlcnRpZXMgdXNlZCBieSB0aGUgY29sdW1ucyBvZiBhIHRhYmxlXG4gKiBAcGFyYW0gdGV4dFByb3BlcnRpZXMgVGhlIGxpc3Qgb2YgcHJvcGVydGllcyByZWZlcmVuY2VkIGFzIHRleHQgb24gYSB0ZXh0IGFycmFuZ2VtZW50IGFubm90YXRpb25cbiAqIEBwYXJhbSByZWxhdGVkUHJvcGVydGllc0luZm8gVGhlIHJlbGF0ZWQgcHJvcGVydGllcyBsaW5rZWQgdG8gdGhlIGNvbHVtbiAobmFtZWQgYWxzbyBjb21wbGV4IHByb3BlcnR5KVxuICogQHBhcmFtIHJlbGF0ZWRQcm9wZXJ0eU5hbWUgVGhlIHByb3BlcnR5IG5hbWUgdG8gYmUgYWRkZWRcbiAqL1xuXG5mdW5jdGlvbiBhZGRQcm9wZXJ0eVRvRGlzcGxheU1vZGVPZkRlc2NyaXB0aW9uUHJvcGVydGllc01hcChcblx0ZGlzcGxheU1vZGVPZkRlc2NyaXB0aW9uUHJvcGVydGllc01hcDogUmVjb3JkPHN0cmluZywgRGlzcGxheU1vZGU+LFxuXHRyZWxhdGVkUHJvcGVydGllc0luZm86IENvbXBsZXhQcm9wZXJ0eUluZm8sXG5cdHJlbGF0ZWRQcm9wZXJ0eU5hbWU6IHN0cmluZ1xuKTogdm9pZCB7XG5cdGlmIChcblx0XHRyZWxhdGVkUHJvcGVydGllc0luZm8ucHJvcGVydGllc1tyZWxhdGVkUHJvcGVydHlOYW1lXS5kaXNwbGF5TW9kZU9mUHJvcGVydHlVc2VkQXNEZXNjcmlwdGlvbiAmJlxuXHRcdCFkaXNwbGF5TW9kZU9mRGVzY3JpcHRpb25Qcm9wZXJ0aWVzTWFwW3JlbGF0ZWRQcm9wZXJ0eU5hbWVdXG5cdCkge1xuXHRcdGRpc3BsYXlNb2RlT2ZEZXNjcmlwdGlvblByb3BlcnRpZXNNYXBbcmVsYXRlZFByb3BlcnR5TmFtZV0gPVxuXHRcdFx0cmVsYXRlZFByb3BlcnRpZXNJbmZvLnByb3BlcnRpZXNbcmVsYXRlZFByb3BlcnR5TmFtZV0uZGlzcGxheU1vZGVPZlByb3BlcnR5VXNlZEFzRGVzY3JpcHRpb24hO1xuXHR9XG59XG5cbi8qKlxuICogQ29tcHV0ZXMgdGhlIHJlZmVyZW5jZWQgcHJvcGVydGllcyBvZiBhIExpbmVJdGVtIGluIGNhc2UgdGhlIExpbmVJdGVtIGlzIGFubm90YXRlZCBhcyBoaWRkZW4uXG4gKiBAcGFyYW0gZXhpc3RpbmdDb2x1bW5zIFRoZSBsaXN0IG9mIGNvbHVtbnMgY3JlYXRlZCBmcm9tIExpbmVJdGVtcyBhbmQgZnJvbSBwcm9wZXJ0aWVzIG9mIGVudGl0eVR5cGVcbiAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBiZSBldmFsdWF0ZWRcbiAqIEBwYXJhbSBjb2x1bW4gVGhlIGdpdmVuIGNvbHVtbiBmcm9tIGxpbmVJdGVtIG9yIHByb3BlcnR5IG9mIGVudGl0eVNldFxuICovXG5mdW5jdGlvbiBjb21wdXRlSGlkZGVuT25SZWxhdGVkQ29sdW1ucyhleGlzdGluZ0NvbHVtbnM6IEFubm90YXRpb25UYWJsZUNvbHVtbltdLCBuYW1lOiBzdHJpbmcsIGNvbHVtbjogQW5ub3RhdGlvblRhYmxlQ29sdW1uKTogdm9pZCB7XG5cdGNvbnN0IHJlbGF0ZWRBbm5vdGF0aW9uQ29sdW1ucyA9IGV4aXN0aW5nQ29sdW1ucy5maWx0ZXIoXG5cdFx0KGV4aXN0aW5nQ29sdW1uKSA9PiBleGlzdGluZ0NvbHVtbi5wcm9wZXJ0eUluZm9zPy5pbmNsdWRlcyhuYW1lKSAmJiBleGlzdGluZ0NvbHVtbi5pc1BhcnRPZkxpbmVJdGVtXG5cdCk7XG5cdGNvbHVtbi5pc1BhcnRPZkxpbmVJdGVtID0gISFyZWxhdGVkQW5ub3RhdGlvbkNvbHVtbnMubGVuZ3RoO1xuXHRpZiAoXG5cdFx0cmVsYXRlZEFubm90YXRpb25Db2x1bW5zLmxlbmd0aCAmJlxuXHRcdCFyZWxhdGVkQW5ub3RhdGlvbkNvbHVtbnM/LnNvbWUoKGFubm90YXRpb25Db2x1bW4pID0+IGFubm90YXRpb25Db2x1bW4uYXZhaWxhYmlsaXR5ICE9PSBcIkhpZGRlblwiKVxuXHQpIHtcblx0XHRjb2x1bW4uc29ydGFibGUgPSBmYWxzZTtcblx0XHRjb2x1bW4uaXNHcm91cGFibGUgPSBmYWxzZTtcblx0XHRjb2x1bW4uZmlsdGVyYWJsZSA9IGZhbHNlO1xuXHR9XG59XG5cbi8qKlxuICogR2V0cyB0aGUgZXhwb3J0IHNldHRpbmdzIHByb3BlcnRpZXMgb2YgYSBtYW5pZmVzdCBjb2x1bW4uXG4gKiBAcGFyYW0gZXhwb3J0U2V0dGluZ3MgVGhlIGN1c3RvbWl6ZWQvb3ZlcndyaXR0ZW4gZXhwb3J0IHNldHRpbmdzIG9mIGEgbWFuaWZlc3QgY29sdW1uXG4gKiBAcGFyYW0gYW5ub3RhdGlvbkNvbHVtbnMgVGhlIGxpc3Qgb2YgY29sdW1ucyBjcmVhdGVkIGZyb20gTGluZUl0ZW1zXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCBUaGUgY29udmVydGVyIGNvbnRleHRcbiAqIEBwYXJhbSBlbnRpdHlUeXBlIFRoZSB0YXJnZXQgZW50aXR5IHR5cGVcbiAqIEBwYXJhbSBwcm9wZXJ0eUluZm9zIFRoZSBwcm9wZXJ0aWVzIGxpbmtlZCB0byBhIGNvbXBsZXggY29sdW1uXG4gKiBAcGFyYW0gY29sdW1uS2V5IFRoZSBjb2x1bW4ga2V5IG9mIHRoZSBjb2x1bW4gdG8gYmUgb3ZlcndyaXR0ZW5cbiAqIEByZXR1cm5zIFRoZSBleHBvcnQgc2V0dGluZ3Mgb2YgdGhlIGNvbHVtbiBtZXJnaW5nIGN1c3RvbWl6ZWQgZXhwb3J0IHNldHRpbmdzIHdpdGggdGhlIGRlZmF1bHQgdmFsdWVzIGRldGVjdGVkIG9uIHRoZSBhbm5vdGF0aW9uIGNvbHVtblxuICovXG5mdW5jdGlvbiBnZXRDdXN0b21FeHBvcnRTZXR0aW5ncyhcblx0ZXhwb3J0U2V0dGluZ3M6IENvbHVtbkV4cG9ydFNldHRpbmdzIHwgdW5kZWZpbmVkLFxuXHRhbm5vdGF0aW9uQ29sdW1uczogQW5ub3RhdGlvblRhYmxlQ29sdW1uW10sXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pixcblx0ZW50aXR5VHlwZTogRW50aXR5VHlwZSxcblx0cHJvcGVydHlJbmZvcz86IHN0cmluZ1tdLFxuXHRjb2x1bW5LZXk/OiBzdHJpbmdcbik6IENvbHVtbkV4cG9ydFNldHRpbmdzIHwgbnVsbCB7XG5cdGxldCBjb2x1bW5Gcm9tQW5ub3RhdGlvbnM7XG5cdGlmIChjb2x1bW5LZXkpIHtcblx0XHRjb2x1bW5Gcm9tQW5ub3RhdGlvbnMgPSBhbm5vdGF0aW9uQ29sdW1ucy5maW5kKChhbm5vdGF0aW9uQ29sdW1uKSA9PiBhbm5vdGF0aW9uQ29sdW1uLmtleSA9PT0gY29sdW1uS2V5KTtcblx0XHRpZiAoY29sdW1uRnJvbUFubm90YXRpb25zPy5leHBvcnRTZXR0aW5ncyA9PT0gbnVsbCkge1xuXHRcdFx0cmV0dXJuIGNvbHVtbkZyb21Bbm5vdGF0aW9ucz8uZXhwb3J0U2V0dGluZ3M7XG5cdFx0fVxuXHR9XG5cdGNvbnN0IGVuYWJsZVdyYXBwaW5nID1cblx0XHRleHBvcnRTZXR0aW5ncz8ud3JhcCA/P1xuXHRcdCghIShleHBvcnRTZXR0aW5ncz8ucHJvcGVydHkgJiYgZXhwb3J0U2V0dGluZ3MucHJvcGVydHk/Lmxlbmd0aCA+IDEpIHx8ICEhKHByb3BlcnR5SW5mb3MgJiYgcHJvcGVydHlJbmZvcy5sZW5ndGggPiAxKSk7XG5cdGNvbnN0IGN1c3RvbUV4cG9ydFNldHRpbmdzOiBDb2x1bW5FeHBvcnRTZXR0aW5ncyA9IHtcblx0XHQuLi5jb2x1bW5Gcm9tQW5ub3RhdGlvbnM/LmV4cG9ydFNldHRpbmdzLFxuXHRcdHR5cGU6IGV4cG9ydFNldHRpbmdzPy50eXBlID8/IGNvbHVtbkZyb21Bbm5vdGF0aW9ucz8uZXhwb3J0U2V0dGluZ3M/LnR5cGUsXG5cdFx0dGVtcGxhdGU6XG5cdFx0XHRleHBvcnRTZXR0aW5ncz8udGVtcGxhdGUgPz9cblx0XHRcdF9hcHBlbmRDdXN0b21UZW1wbGF0ZShwcm9wZXJ0eUluZm9zLCBleHBvcnRTZXR0aW5ncz8ucHJvcGVydHkpID8/XG5cdFx0XHRjb2x1bW5Gcm9tQW5ub3RhdGlvbnM/LmV4cG9ydFNldHRpbmdzPy50ZW1wbGF0ZSxcblx0XHRwcm9wZXJ0eTogZXhwb3J0U2V0dGluZ3M/LnByb3BlcnR5XG5cdFx0XHQ/IF9nZXRQcm9wZXJ0eU5hbWVzKGV4cG9ydFNldHRpbmdzPy5wcm9wZXJ0eSwgYW5ub3RhdGlvbkNvbHVtbnMsIGNvbnZlcnRlckNvbnRleHQsIGVudGl0eVR5cGUpXG5cdFx0XHQ6IHVuZGVmaW5lZCxcblx0XHR3aWR0aDogZXhwb3J0U2V0dGluZ3M/LndpZHRoLFxuXHRcdHdyYXA6IGVuYWJsZVdyYXBwaW5nXG5cdH07XG5cdHJldHVybiByZW1vdmVVbmRlZmluZWRGcm9tRXhwb3J0U2V0dGluZ3MoY3VzdG9tRXhwb3J0U2V0dGluZ3MpO1xufVxuXG5leHBvcnQgZGVmYXVsdCB7XG5cdGdldFRhYmxlQWN0aW9ucyxcblx0Z2V0VGFibGVDb2x1bW5zLFxuXHRnZXRDb2x1bW5zRnJvbUVudGl0eVR5cGUsXG5cdHVwZGF0ZUxpbmtlZFByb3BlcnRpZXMsXG5cdGNyZWF0ZVRhYmxlVmlzdWFsaXphdGlvbixcblx0Y3JlYXRlRGVmYXVsdFRhYmxlVmlzdWFsaXphdGlvbixcblx0Z2V0Q2FwYWJpbGl0eVJlc3RyaWN0aW9uLFxuXHRnZXRJbXBvcnRhbmNlLFxuXHRnZXRTZWxlY3Rpb25Nb2RlLFxuXHRnZXRSb3dTdGF0dXNWaXNpYmlsaXR5LFxuXHRnZXRQMTNuTW9kZSxcblx0Z2V0U3RhbmRhcmRBY3Rpb25zQ29uZmlndXJhdGlvbixcblx0Z2V0VGFibGVBbm5vdGF0aW9uQ29uZmlndXJhdGlvbixcblx0aXNGaWx0ZXJpbmdDYXNlU2Vuc2l0aXZlLFxuXHRzcGxpdFBhdGgsXG5cdGdldFNlbGVjdGlvblZhcmlhbnRDb25maWd1cmF0aW9uLFxuXHRnZXRUYWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbixcblx0Z2V0VHlwZUNvbmZpZyxcblx0dXBkYXRlVGFibGVWaXN1YWxpemF0aW9uRm9yVHlwZSxcblx0Y3JlYXRlUmVxdWVzdGVkUHJvcGVydGllcyxcblx0Z2V0TmF2aWdhdGlvblRhcmdldFBhdGgsXG5cdGdldEN1c3RvbUZ1bmN0aW9uSW5mb1xufTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7RUEySEE7RUFFQTtFQTJIQTtBQUNBO0FBQ0E7RUFZQTtBQUNBO0FBQ0E7RUFGQSxJQTZFS0EsVUFBVSxFQU1mO0VBQUEsV0FOS0EsVUFBVTtJQUFWQSxVQUFVO0lBQVZBLFVBQVU7SUFBVkEsVUFBVTtJQUFWQSxVQUFVO0VBQUEsR0FBVkEsVUFBVSxLQUFWQSxVQUFVLFNBVWY7RUFJQTtFQWFBO0VBOEJBO0VBZ0RBO0VBMkZBO0VBQ0EsTUFBTUMsNkJBQTZCLEdBQUcsRUFBRTtFQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDTyxTQUFTQyxlQUFlQSxD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QUFFbkUsSUFBSSxPQUFBeXhDLHNCQUFBLEdBQUlJLHFCQUFxQixjQUFBSixzQkFBQSx3QkFBQUMsc0JBQUEsR0FBckJELHNCQUFBLENBQXVCdHRDLGNBQWMsY0FBQXV0QyxzQkFBQSx1QkFBckNBLHNCQUFBLENBQXVDMXhDLElBQUk7TUFDekVtcEIsUUFBUSxFQUNQLENBQUFobEIsY0FBYyxhQUFkQSxjQUFjLHVCQUFkQSxjQUFjLENBQUVnbEIsUUFBUSxLQUN4QjBSLHFCQUFxQixDQUFDajBCLGFBQWEsRUFBRXpDLGNBQWMsYUFBZEEsY0FBYyx1QkFBZEEsY0FBYyxDQUFFYSxRQUFRLENBQUMsTUFBQTJzQyxzQkFBQSxHQUM5REUscUJBQXFCLGNBQUFGLHNCQUFBLHdCQUFBQyxzQkFBQSxHQUFyQkQsc0JBQUEsQ0FBdUJ4dEMsY0FBYyxjQUFBeXRDLHNCQUFBLHVCQUFyQ0Esc0JBQUEsQ0FBdUN6b0IsUUFBUTtNQUNoRG5rQixRQUFRLEVBQUViLGNBQWMsYUFBZEEsY0FBYyxlQUFkQSxjQUFjLENBQUVhLFFBQVEsR0FDL0JzMEIsaUJBQWlCLENBQUNuMUIsY0FBYyxhQUFkQSxjQUFjLHVCQUFkQSxjQUFjLENBQUVhLFFBQVEsRUFBRTNCLGlCQUFpQixFQUFFakUsZ0JBQWdCLEVBQUUwRyxVQUFVLENBQUMsR0FDNUYvRSxTQUFTO01BQ1o2QyxLQUFLLEVBQUVPLGNBQWMsYUFBZEEsY0FBYyx1QkFBZEEsY0FBYyxDQUFFUCxLQUFLO01BQzVCd2xCLElBQUksRUFBRTRvQjtJQUNQLENBQUM7SUFDRCxPQUFPMW9CLGlDQUFpQyxDQUFDMm9CLG9CQUFvQixDQUFDO0VBQy9EO0VBQUMsT0FFYztJQUNkaHpDLGVBQWU7SUFDZm1FLGVBQWU7SUFDZnFSLHdCQUF3QjtJQUN4QnZGLHNCQUFzQjtJQUN0QnNELHdCQUF3QjtJQUN4QitCLCtCQUErQjtJQUMvQjhGLHdCQUF3QjtJQUN4QjhNLGFBQWE7SUFDYjFNLGdCQUFnQjtJQUNoQnVVLHNCQUFzQjtJQUN0QjBQLFdBQVc7SUFDWHRyQiwrQkFBK0I7SUFDL0JFLCtCQUErQjtJQUMvQjRULHdCQUF3QjtJQUN4QnBVLFNBQVM7SUFDVDB4QixnQ0FBZ0M7SUFDaEMzeEIsNkJBQTZCO0lBQzdCa1QsYUFBYTtJQUNidGUsK0JBQStCO0lBQy9CK0QseUJBQXlCO0lBQ3pCNEMsdUJBQXVCO0lBQ3ZCbTdCO0VBQ0QsQ0FBQztBQUFBIiwiaWdub3JlTGlzdCI6W119
3444
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDb2x1bW5UeXBlIiwiZ2V0VGFibGVBY3Rpb25zIiwibGluZUl0ZW1Bbm5vdGF0aW9uIiwidmlzdWFsaXphdGlvblBhdGgiLCJjb252ZXJ0ZXJDb250ZXh0Iiwic3RhbmRhcmRBY3Rpb25zIiwibmF2aWdhdGlvblNldHRpbmdzIiwidGFibGVBY3Rpb25zIiwiZ2V0VGFibGVBbm5vdGF0aW9uQWN0aW9ucyIsIm1hbmlmZXN0QWN0aW9ucyIsImdldEFjdGlvbnNGcm9tTWFuaWZlc3QiLCJnZXRNYW5pZmVzdENvbnRyb2xDb25maWd1cmF0aW9uIiwiYWN0aW9ucyIsImNvcHlBY3Rpb25zIiwiZmlsdGVyIiwiYSIsInR5cGUiLCJBY3Rpb25UeXBlIiwiQ29weSIsImFubm90YXRpb25BY3Rpb25zIiwiYW5ub3RhdGlvbkFuZFN0YW5kYXJkQWN0aW9ucyIsImNyZWF0ZSIsImRlbGV0ZSIsIm1hc3NFZGl0IiwiaW5zaWdodHMiLCJjcmVhdGlvblJvdyIsImN1dCIsInBhc3RlIiwibW92ZVVwIiwibW92ZURvd24iLCJhY3Rpb24iLCJ1bmRlZmluZWQiLCJtYW5pZmVzdEFjdGlvbiIsIk9iamVjdCIsInZhbHVlcyIsIkRlZmF1bHQiLCJNZW51IiwicG9zaXRpb24iLCJhbmNob3IiLCJTdGFuZGFyZEFjdGlvbktleXMiLCJDcmVhdGUiLCJwbGFjZW1lbnQiLCJQbGFjZW1lbnQiLCJCZWZvcmUiLCJtYW5pZmVzdEFjdGlvbkVudHJpZXMiLCJlbnRyaWVzIiwic3RhbmRhcmRNYW5pZmVzdEFjdGlvbnMiLCJmcm9tRW50cmllcyIsIl9yZWYiLCJrZXkiLCJzdGFydHNXaXRoIiwibm9uU3RhbmRhcmRNYW5pZmVzdEFjdGlvbnMiLCJfcmVmMiIsImFjdGlvbk92ZXJ3cml0ZUNvbmZpZyIsImlzTmF2aWdhYmxlIiwiT3ZlcnJpZGVUeXBlIiwib3ZlcndyaXRlIiwiZW5hYmxlT25TZWxlY3QiLCJlbmFibGVBdXRvU2Nyb2xsIiwiZW5hYmxlZCIsInZpc2libGUiLCJ2aXNpYmxlRm9yQ29udGV4dE1lbnUiLCJkZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb24iLCJjb21tYW5kIiwibWVudSIsImFubm90YXRpb25NZW51QWN0aW9uSXRlbXMiLCJnZXRBbm5vdGF0aW9uTWVudUFjdGlvbkl0ZW1zIiwibWF0Y2hpbmdNYW5pZmVzdEFjdGlvbnMiLCJnZXRNYXRjaGluZ01hbmlmZXN0QWN0aW9uIiwib3ZlcndyaXR0ZW5NZW51QWN0aW9uSXRlbXMiLCJpbnNlcnRDdXN0b21FbGVtZW50cyIsInByZXBhcmVNZW51QWN0aW9ucyIsInJlbW92ZUR1cGxpY2F0ZUFjdGlvbnMiLCJnZXRWaXNpYmlsaXR5RW5hYmxlbWVudE1lbnVBY3Rpb25zIiwiY29tbWFuZEFjdGlvbnMiLCJfZXhwb3J0cyIsImdldFRhYmxlQ29sdW1ucyIsImFubm90YXRpb25Db2x1bW5zIiwiZ2V0Q29sdW1uc0Zyb21Bbm5vdGF0aW9ucyIsIm1hbmlmZXN0Q29sdW1ucyIsImdldENvbHVtbnNGcm9tTWFuaWZlc3QiLCJjb2x1bW5zIiwiZ2V0QW5ub3RhdGlvbkVudGl0eVR5cGUiLCJ0YWJsZUNvbHVtbnMiLCJ3aWR0aCIsIndpZHRoSW5jbHVkaW5nQ29sdW1uSGVhZGVyIiwiaW1wb3J0YW5jZSIsImhvcml6b250YWxBbGlnbiIsImF2YWlsYWJpbGl0eSIsInNldHRpbmdzIiwiZm9ybWF0T3B0aW9ucyIsImV4cG9ydFNldHRpbmdzIiwiYWRkQ29tcHV0ZWRDb2x1bW5zIiwiZ2V0Q29udGV4dERlZmluaW5nUHJvcGVydGllc0Zyb21BZ2dyZWdhdGlvbkFubm90YXRpb24iLCJhZ2dyZWdhdGlvbkhlbHBlciIsImN1c3RvbUFnZ3JlZ2F0ZUFubm90YXRpb25zIiwiZ2V0Q3VzdG9tQWdncmVnYXRlRGVmaW5pdGlvbnMiLCJjdXN0b21BZ2dyZWdhdGVkZWZpbml0aW9ucyIsImZvckVhY2giLCJhbm5vdGF0aW9uIiwiYWdncmVnYXRlZFByb3BlcnR5IiwiX2VudGl0eVR5cGUiLCJlbnRpdHlQcm9wZXJ0aWVzIiwiZmluZCIsInByb3BlcnR5IiwibmFtZSIsInF1YWxpZmllciIsImNvbnRleHREZWZpbmluZ1Byb3BlcnRpZXMiLCJhbm5vdGF0aW9ucyIsIkFnZ3JlZ2F0aW9uIiwiQ29udGV4dERlZmluaW5nUHJvcGVydGllcyIsIm1hcCIsImN0eERlZlByb3BlcnR5IiwidmFsdWUiLCJnZXRFeHRlbnNpb25JbmZvRnJvbUVudGl0eVR5cGUiLCJlbnRpdHlUeXBlIiwiQWdncmVnYXRpb25IZWxwZXIiLCJpc0FuYWx5dGljc1N1cHBvcnRlZCIsImN1cnJlbmN5T3JVbml0UHJvcGVydGllcyIsIlNldCIsImNvbHVtbiIsInRhYmxlQ29sdW1uIiwidW5pdCIsInRhcmdldFVuaXRQcm9wZXJ0eSIsInByb3AiLCJhZGQiLCJyZWxhdGl2ZVBhdGgiLCJjb250ZXh0RGVmaW5pbmdQcm9wZXJ0aWVzRnJvbUFnZ3JlZ2F0aW9uIiwicmVzdWx0IiwicHJvcGVydHlJbmZvcyIsInJhd0NvbnRleHREZWZpbmluZ1Byb3BlcnRpZXMiLCJmcm9tR3JvdXBhYmxlUHJvcGVydHkiLCJpc1Byb3BlcnR5R3JvdXBhYmxlIiwiaGFzIiwiY29udGV4dERlZmluaW5nUHJvcGVydHlOYW1lIiwiZm91bmRDb2x1bW4iLCJmaW5kQ29sdW1uQnlQYXRoIiwicHVzaCIsImxlbmd0aCIsImFkZGl0aW9uYWxQcm9wZXJ0aWVzIiwidXBkYXRlVGFibGVWaXN1YWxpemF0aW9uRm9yVHlwZSIsInRhYmxlVmlzdWFsaXphdGlvbiIsInByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uIiwiY29udHJvbCIsImFnZ3JlZ2F0aW9uRGF0YSIsImVuYWJsZUFuYWx5dGljcyIsImVuYWJsZSRzZWxlY3QiLCJlbmFibGUkJGdldEtlZXBBbGl2ZUNvbnRleHQiLCJhbmFseXRpY3NFeHRlbnNpb25zIiwiX3VwZGF0ZVByb3BlcnR5SW5mb3NXaXRoQWdncmVnYXRlc0RlZmluaXRpb25zIiwiYWxsb3dlZFRyYW5zZm9ybWF0aW9ucyIsImdldEFsbG93ZWRUcmFuc2Zvcm1hdGlvbnMiLCJlbmFibGVCYXNpY1NlYXJjaCIsImluY2x1ZGVzIiwiZ3JvdXBDb25kaXRpb25zIiwiZ2V0R3JvdXBDb25kaXRpb25zIiwiYWdncmVnYXRlQ29uZGl0aW9ucyIsImdldEFnZ3JlZ2F0ZUNvbmRpdGlvbnMiLCJNb2RlbEhlbHBlciIsImlzT2JqZWN0UGF0aERyYWZ0U3VwcG9ydGVkIiwiZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCIsInJlcXVlc3RBdExlYXN0IiwiaXNEcmFmdFJvb3QiLCJnZXRFbnRpdHlTZXQiLCJMb2ciLCJlcnJvciIsImNoYW5nZVNpYmxpbmdGb3JSb290c1N1cHBvcnRlZCIsIkhpZXJhcmNoeSIsImhpZXJhcmNoeVF1YWxpZmllciIsIkNoYW5nZVNpYmxpbmdGb3JSb290c1N1cHBvcnRlZCIsImFsbG93RHJvcEJldHdlZW5Ob2RlcyIsIkNoYW5nZU5leHRTaWJsaW5nQWN0aW9uIiwiZW5hYmxlVXBsb2FkUGx1Z2luIiwic3RyZWFtUHJvcGVydHkiLCJVSSIsIk1lZGlhUmVzb3VyY2UiLCJTdHJlYW0iLCIkdGFyZ2V0IiwidXBsb2FkQWN0aW9uIiwidXBsb2FkVGFibGUiLCJzdHJlYW0iLCJmaWxlTmFtZSIsIkNvcmUiLCJDb250ZW50RGlzcG9zaXRpb24iLCJGaWxlbmFtZSIsInBhdGgiLCJmaWxlTmFtZU1heExlbmd0aCIsIm1heExlbmd0aCIsImFjY2VwdGFibGVNZWRpYVR5cGVzIiwiQWNjZXB0YWJsZU1lZGlhVHlwZXMiLCJjcmVhdGVSZXF1ZXN0ZWRQcm9wZXJ0aWVzIiwibGluZUl0ZW0iLCJvcGVyYXRpb25BdmFpbGFibGUiLCJzZWxlY3RlZEZpZWxkcyIsInB1c2hGaWVsZCIsImZpZWxkIiwiaW5kZXhPZiIsInB1c2hGaWVsZExpc3QiLCJmaWVsZHMiLCJvcGVyYXRpb25BdmFpbGFibGVQcm9wZXJ0aWVzIiwic3BsaXQiLCJ2YWxpZFByb3BlcnRpZXMiLCJwcm9wTmFtZSIsInJlc29sdmVQYXRoIiwic2VtYW50aWNLZXlzIiwiQ29tbW9uIiwiU2VtYW50aWNLZXkiLCJzZW1hbnRpY0tleSIsImNhcGFiaWxpdGllc0Fubm90YXRpb24iLCJDYXBhYmlsaXRpZXMiLCJhbHRlcm5hdGVBbmRTZWNvbmRhcnlLZXlzIiwiZ2V0QWx0ZXJuYXRlQW5kU2Vjb25kYXJ5S2V5cyIsIlJlcXVlc3RBdExlYXN0IiwicHJvcGVydHlQYXRoIiwiZ2V0TmF2aWdhdGlvbkF2YWlsYWJsZUZpZWxkc0Zyb21MaW5lSXRlbSIsIkRlbGV0ZVJlc3RyaWN0aW9ucyIsIkRlbGV0YWJsZSIsIlVwZGF0ZVJlc3RyaWN0aW9ucyIsIlVwZGF0YWJsZSIsInJlY29yZCIsIiRUeXBlIiwiSW5saW5lIiwiRGV0ZXJtaW5pbmciLCJpc1BhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbiIsIk5hdmlnYXRpb25BdmFpbGFibGUiLCJnZXROYXZpZ2F0aW9uVGFyZ2V0UGF0aCIsIm5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgiLCJtYW5pZmVzdFdyYXBwZXIiLCJnZXRNYW5pZmVzdFdyYXBwZXIiLCJnZXROYXZpZ2F0aW9uQ29uZmlndXJhdGlvbiIsIm5hdkNvbmZpZyIsImtleXMiLCJkYXRhTW9kZWxQYXRoIiwiY29udGV4dFBhdGgiLCJnZXRDb250ZXh0UGF0aCIsIm5hdkNvbmZpZ0ZvckNvbnRleHRQYXRoIiwidGFyZ2V0RW50aXR5U2V0Iiwic3RhcnRpbmdFbnRpdHlTZXQiLCJhbm5vdGF0aW9uQ29sdW1uIiwidXBkYXRlTGlua2VkUHJvcGVydGllcyIsImRhdGFNb2RlbE9iamVjdFBhdGgiLCJnZXRDb252ZXJ0ZXJDb250ZXh0Rm9yIiwib0NvbHVtbiIsInByb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aCIsImVuaGFuY2VEYXRhTW9kZWxQYXRoIiwidGFyZ2V0T2JqZWN0IiwiYWRkQ3VycmVuY3lPclVvTVRvUHJvcGVydHkiLCJ0aW1lem9uZVByb3BlcnR5IiwiZ2V0QXNzb2NpYXRlZFRpbWV6b25lUHJvcGVydHkiLCJ0aW1lem9uZSIsIlRpbWV6b25lIiwib1RpbWV6b25lQ29sdW1uIiwidGltZXpvbmVUZXh0IiwidG9TdHJpbmciLCJhZGRUZXh0QXJyYW5nZW50SW5mb1RvUHJvcGVydHkiLCJjdXJyZW5jeU9yVW9NUHJvcGVydHkiLCJnZXRBc3NvY2lhdGVkQ3VycmVuY3lQcm9wZXJ0eVBhdGgiLCJnZXRBc3NvY2lhdGVkVW5pdFByb3BlcnR5UGF0aCIsImN1cnJlbmN5T3JVb01Qcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGgiLCJjdXJyZW5jeU9yVW9NUmVsYXRpdmVQYXRoIiwiZ2V0Q29udGV4dFJlbGF0aXZlVGFyZ2V0T2JqZWN0UGF0aCIsInVuaXRDb2x1bW4iLCJNZWFzdXJlcyIsIklTT0N1cnJlbmN5IiwiVW5pdCIsInVuaXRUZXh0IiwiZGlzcGxheU1vZGUiLCJnZXREaXNwbGF5TW9kZSIsInRleHRQcm9wZXJ0eVBhdGgiLCJnZXRBc3NvY2lhdGVkVGV4dFByb3BlcnR5UGF0aCIsInRleHRQcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGgiLCJ0ZXh0UmVsYXRpdmVQYXRoIiwidGV4dENvbHVtbiIsInRleHRBcnJhbmdlbWVudCIsInRleHRQcm9wZXJ0eSIsIm1vZGUiLCJnZXRTZW1hbnRpY0tleXNBbmRUaXRsZUluZm8iLCJoZWFkZXJJbmZvVGl0bGVQYXRoIiwiSGVhZGVySW5mbyIsIlRpdGxlIiwiVmFsdWUiLCJzZW1hbnRpY0tleUFubm90YXRpb25zIiwiaGVhZGVySW5mb1R5cGVOYW1lIiwiVHlwZU5hbWUiLCJzZW1hbnRpY0tleUNvbHVtbnMiLCJjcmVhdGVUYWJsZVZpc3VhbGl6YXRpb24iLCJwYXJhbXMiLCJpc0NvbmRlbnNlZFRhYmxlTGF5b3V0Q29tcGxpYW50Iiwic2VsZWN0aW9uVmFyaWFudEFubm90YXRpb24iLCJ0YWJsZU1hbmlmZXN0Q29uZmlnIiwiZ2V0VGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24iLCJzcGxpdFBhdGgiLCJuYXZpZ2F0aW9uVGFyZ2V0UGF0aCIsIm9wZXJhdGlvbkF2YWlsYWJsZU1hcCIsImdldE9wZXJhdGlvbkF2YWlsYWJsZU1hcCIsInNlbWFudGljS2V5c0FuZEhlYWRlckluZm9UaXRsZSIsInN0YW5kYXJkQWN0aW9uc0NvbmZpZ3VyYXRpb24iLCJnZXRTdGFuZGFyZEFjdGlvbnNDb25maWd1cmF0aW9uIiwidGFibGVBbm5vdGF0aW9uIiwiZ2V0VGFibGVBbm5vdGF0aW9uQ29uZmlndXJhdGlvbiIsImdldE9wZXJhdGlvbkF2YWlsYWJsZVByb3BlcnRpZXMiLCJoZWFkZXIiLCJ0aXRsZSIsIm9WaXN1YWxpemF0aW9uIiwiVmlzdWFsaXphdGlvblR5cGUiLCJUYWJsZSIsIkpTT04iLCJzdHJpbmdpZnkiLCJoZWFkZXJJbmZvVGl0bGUiLCJoZWFkZXJWaXNpYmxlIiwiaGFuZGxlUGF0Y2hTZW50IiwiZ2V0VGVtcGxhdGVUeXBlIiwiVGVtcGxhdGVUeXBlIiwiTGlzdFJlcG9ydCIsImNyZWF0ZURlZmF1bHRUYWJsZVZpc3VhbGl6YXRpb24iLCJpc0JsYW5rVGFibGUiLCJnZXRDb2x1bW5zRnJvbUVudGl0eVR5cGUiLCJnZXRFbnRpdHlUeXBlIiwiY3JlYXRpb25Nb2RlIiwiQWN0aW9uSGVscGVyIiwiZ2V0Q3VycmVudEVudGl0eVNldFVwZGF0YWJsZVBhdGgiLCJyZXN0cmljdGlvbnMiLCJnZXRSZXN0cmljdGlvbnMiLCJlbnRpdHlTZXQiLCJ1cGRhdGFibGUiLCJpc1VwZGF0YWJsZSIsImlzT25seUR5bmFtaWNPbkN1cnJlbnRFbnRpdHkiLCJpc0NvbnN0YW50IiwiZXhwcmVzc2lvbiIsIm5hdmlnYXRpb25FeHByZXNzaW9uIiwiX3R5cGUiLCJ1cGRhdGFibGVFeHByZXNzaW9uIiwidXBkYXRhYmxlUHJvcGVydHlQYXRoIiwicHJvcGVydGllcyIsImFjdGlvbk5hbWUiLCJwcm9wZXJ0eU5hbWUiLCJzaXplIiwidGl0bGVQcm9wZXJ0eSIsIkFycmF5IiwiZnJvbSIsImpvaW4iLCJnZXRVSUhpZGRlbkV4cEZvckFjdGlvbnNSZXF1aXJpbmdDb250ZXh0IiwiY3VycmVudEVudGl0eVR5cGUiLCJjb250ZXh0RGF0YU1vZGVsT2JqZWN0UGF0aCIsImFVaUhpZGRlblBhdGhFeHByZXNzaW9ucyIsImRhdGFGaWVsZCIsIkFjdGlvblRhcmdldCIsImlzQm91bmQiLCJzb3VyY2VFbnRpdHlUeXBlIiwiUmVxdWlyZXNDb250ZXh0IiwidmFsdWVPZiIsIkhpZGRlbiIsImVxdWFsIiwiZ2V0SGlkZGVuRXhwcmVzc2lvbkF0VGFibGVMZXZlbCIsImdldFBhdGhGcm9tQWN0aW9uQW5ub3RhdGlvbiIsInNvdXJjZSIsImNvbnN0YW50Iiwic3Vic3RyaW5nIiwic3BsaXRQYXRoRm9yTmF2aWdhdGlvblByb3BlcnR5IiwibmF2aWdhdGlvblBhdGgiLCJpc05hdmlnYXRpb25Qcm9wZXJ0eSIsInBhcnRuZXIiLCJwYXRoSW5Nb2RlbCIsInNsaWNlIiwidXBkYXRlTWFuaWZlc3RBY3Rpb25BbmRUYWdJdCIsImRhdGFGaWVsZElkIiwic29tZSIsImFjdGlvbktleSIsInJlcXVpcmVzU2VsZWN0aW9uIiwiaGFzQm91bmRBY3Rpb25zQWx3YXlzVmlzaWJsZUluVG9vbEJhciIsIm1hbmlmZXN0QWN0aW9uSWQiLCJnZW5lcmF0ZSIsIkFjdGlvbiIsIlNlbWFudGljT2JqZWN0IiwiaGFzQ3VzdG9tQWN0aW9uc0Fsd2F5c1Zpc2libGVJblRvb2xCYXIiLCJjdXN0b21BY3Rpb25zIiwicmVkdWNlIiwibWVudUFjdGlvbiIsImdldFZpc2libGVFeHBGb3JDdXN0b21BY3Rpb25zUmVxdWlyaW5nQ29udGV4dCIsImFWaXNpYmxlUGF0aEV4cHJlc3Npb25zIiwicmVzb2x2ZUJpbmRpbmdTdHJpbmciLCJnZXRDYXBhYmlsaXR5UmVzdHJpY3Rpb24iLCJpc0RlbGV0YWJsZSIsImlzUGF0aERlbGV0YWJsZSIsImlzUGF0aFVwZGF0YWJsZSIsImdldFNlbGVjdGlvbk1vZGUiLCJpc0VudGl0eVNldCIsInRhcmdldENhcGFiaWxpdGllcyIsImRlbGV0ZUJ1dHRvblZpc2liaWxpdHlFeHByZXNzaW9uIiwibWFzc0VkaXRWaXNpYmlsaXR5RXhwcmVzc2lvbiIsImFyZ3VtZW50cyIsImN1dEJ1dHRvblZpc2liaWxpdHlFeHByZXNzaW9uIiwidGFibGVNYW5pZmVzdFNldHRpbmdzIiwidGFibGVUeXBlIiwidGFibGVTZXR0aW5ncyIsInNlbGVjdGlvbk1vZGUiLCJTZWxlY3Rpb25Nb2RlIiwiTXVsdGkiLCJOb25lIiwiY29tcGlsZUV4cHJlc3Npb24iLCJpZkVsc2UiLCJGb3JjZU11bHRpIiwiRm9yY2VTaW5nbGUiLCJTaW5nbGUiLCJhSGlkZGVuQmluZGluZ0V4cHJlc3Npb25zIiwiYVZpc2libGVCaW5kaW5nRXhwcmVzc2lvbnMiLCJpc1BhcmVudERlbGV0YWJsZSIsInBhcmVudEVudGl0eVNldERlbGV0YWJsZSIsIk9iamVjdFBhZ2UiLCJiTWFzc0VkaXRFbmFibGVkIiwiQXV0byIsImJ1dHRvblZpc2liaWxpdHlFeHByZXNzaW9uIiwib3IiLCJhbmQiLCJJc0VkaXRhYmxlIiwiZWRpdE1vZGVidXR0b25WaXNpYmlsaXR5RXhwcmVzc2lvbiIsImNvbmNhdCIsImNvcHlEYXRhRmllbGQiLCJnZXRDb3B5QWN0aW9uIiwiZGF0YUZpZWxkSXNDb3B5QWN0aW9uIiwiYW5ub3RhdGlvblBhdGgiLCJnZXRFbnRpdHlTZXRCYXNlZEFubm90YXRpb25QYXRoIiwiZnVsbHlRdWFsaWZpZWROYW1lIiwiS2V5SGVscGVyIiwiZ2VuZXJhdGVLZXlGcm9tRGF0YUZpZWxkIiwidmlzaWJsZUV4cHJlc3Npb24iLCJ2aXNpYmxlRm9yQ29udGV4dE1lbnVFeHByZXNzaW9uIiwidGV4dCIsIkxhYmVsIiwiTGlicmFyeSIsImdldFJlc291cmNlQnVuZGxlRm9yIiwiZ2V0VGV4dCIsImlzRGF0YUZpZWxkRm9yQWN0aW9uQWJzdHJhY3QiLCJ0YWJsZUFjdGlvbiIsImdldERhdGFGaWVsZEFubm90YXRpb25BY3Rpb24iLCJpc0RhdGFGaWVsZEZvckFjdGlvbkdyb3VwIiwiZGF0YUZpZWxkR3JvdXAiLCJEYXRhRmllbGRGb3JBY3Rpb24iLCJzRW50aXR5VHlwZSIsIl91c2VFbmFibGVkRXhwcmVzc2lvbiIsImdldEVuYWJsZWRGb3JBbm5vdGF0aW9uQWN0aW9uIiwiRGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uIiwiaWQiLCJBY3Rpb25zIiwiZ2V0SGlnaGxpZ2h0Um93QmluZGluZyIsImNyaXRpY2FsaXR5QW5ub3RhdGlvbiIsImlzRHJhZnRSb290T3JOb2RlIiwidGFyZ2V0RW50aXR5VHlwZSIsImRlZmF1bHRIaWdobGlnaHRSb3dEZWZpbml0aW9uIiwiTWVzc2FnZVR5cGUiLCJnZXRFeHByZXNzaW9uRnJvbUFubm90YXRpb24iLCJnZXRNZXNzYWdlVHlwZUZyb21Dcml0aWNhbGl0eVR5cGUiLCJmb3JtYXRSZXN1bHQiLCJFbnRpdHkiLCJIYXNBY3RpdmUiLCJJc0FjdGl2ZSIsIklzSW5hY3RpdmUiLCJ0YWJsZUZvcm1hdHRlcnMiLCJyb3dIaWdobGlnaHRpbmciLCJfZ2V0Q3JlYXRpb25CZWhhdmlvdXIiLCJ0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbiIsIm5hdmlnYXRpb24iLCJkZXRhaWwiLCJvcmlnaW5hbFRhYmxlU2V0dGluZ3MiLCJvdXRib3VuZCIsIm91dGJvdW5kRGV0YWlsIiwiQ3JlYXRpb25Nb2RlIiwiTmV3UGFnZSIsIkV4dGVybmFsIiwiQ3JlYXRpb25EaWFsb2ciLCJ3YXJuaW5nIiwibmV3QWN0aW9uIiwidGFyZ2V0QW5ub3RhdGlvbnMiLCJ0YXJnZXRBbm5vdGF0aW9uc0NvbW1vbiIsInRhcmdldEFubm90YXRpb25zU2Vzc2lvbiIsIlNlc3Npb24iLCJEcmFmdFJvb3QiLCJOZXdBY3Rpb24iLCJTdGlja3lTZXNzaW9uU3VwcG9ydGVkIiwiQ3JlYXRpb25Sb3ciLCJFcnJvciIsInJvdXRlIiwiYXBwZW5kIiwiY3JlYXRlQXRFbmQiLCJuYXZpZ2F0ZVRvVGFyZ2V0IiwiaW5mbyIsIl9nZXRSb3dDb25maWd1cmF0aW9uUHJvcGVydHkiLCJ0YXJnZXRQYXRoIiwiZGlzYWJsZU5hdmlnYXRpb24iLCJuYXZpZ2F0aW9uSW5mbyIsImNyaXRpY2FsaXR5UHJvcGVydHkiLCJDcml0aWNhbGl0eSIsIm5hdmlnYXRpb25UYXJnZXQiLCJkaXNwbGF5IiwidGFyZ2V0IiwiZ2V0RHJhZnRSb290IiwiZ2V0RHJhZnROb2RlIiwiY2hlY2tFZGl0YWJsZSIsInJvdXRlUGF0aCIsInJlY3JlYXRlQ29udGV4dCIsInJvd05hdmlnYXRlZEV4cHJlc3Npb24iLCJuYXZpZ2F0ZWRSb3ciLCJyb3dOYXZpZ2F0ZWQiLCJyb3dDcml0aWNhbGl0eUZvckluc2lnaHRzIiwiY3JpdGljYWxpdHlFeHByZXNzaW9uRm9ySW50ZWdyYXRpb25DYXJkcyIsIm5vdCIsImNvbHVtbnNUb0JlQ3JlYXRlZCIsInRhYmxlQ3JlYXRpb25Nb2RlIiwiZGlzcGxheU1vZGVPZkRlc2NyaXB0aW9uUHJvcGVydGllc01hcCIsInJlc3RyaWN0aW9uc09uUHJvcGVydGllcyIsInByb3BlcnRpZXNOb3RUb0JlQ29uc2lkZXJlZCIsImdyb3VwYWJsZVByb3BlcnRpZXMiLCJnZXRHcm91cGFibGVQcm9wZXJ0aWVzIiwiZ2V0QXNzb2NpYXRlZFRleHRQcm9wZXJ0eSIsInRleHRQcm9wIiwiZXhpc3RzIiwidGFyZ2V0VHlwZSIsInJlbGF0ZWRQcm9wZXJ0aWVzSW5mbyIsImNvbGxlY3RSZWxhdGVkUHJvcGVydGllcyIsInJlbGF0ZWRQcm9wZXJ0eU5hbWVzIiwiYWRkaXRpb25hbFByb3BlcnR5TmFtZXMiLCJhZGRQcm9wZXJ0eVRvRGlzcGxheU1vZGVPZkRlc2NyaXB0aW9uUHJvcGVydGllc01hcCIsImNvbHVtbkluZm8iLCJnZXRDb2x1bW5EZWZpbml0aW9uRnJvbVByb3BlcnR5IiwiZGF0YVBvaW50VGFyZ2V0VmFsdWUiLCJleHBvcnREYXRhUG9pbnRUYXJnZXRWYWx1ZSIsImFubm90YXRpb25Qcm9wZXJ0eSIsInVwZGF0ZVByb3BlcnR5TGFiZWwiLCJhZGRpdGlvbmFsUHJvcGVydHlJbmZvcyIsImFkZGl0aW9uYWxQcm9wZXJ0eU5hbWUiLCJub25Tb3J0YWJsZVByb3BlcnRpZXMiLCJUZXh0IiwicmVsYXRlZENvbHVtbnMiLCJfY3JlYXRlUmVsYXRlZENvbHVtbnMiLCJmdWxsUHJvcGVydHlQYXRoIiwidXNlRGF0YUZpZWxkUHJlZml4IiwiYXZhaWxhYmxlRm9yQWRhcHRhdGlvbiIsInJlbGF0aXZlUGF0aEZvck11bHRpVmFsdWUiLCJzZW1hbnRpY09iamVjdEFubm90YXRpb25QYXRoIiwiZ2V0U2VtYW50aWNPYmplY3RQYXRoIiwiaXNIaWRkZW4iLCJpc1JlZmVyZW5jZVByb3BlcnR5U3RhdGljYWxseUhpZGRlbiIsImdyb3VwUGF0aCIsIl9zbGljZUF0U2xhc2giLCJpc0dyb3VwIiwibGFiZWwiLCJnZXRMYWJlbCIsImRhdGFUeXBlIiwiZ2V0RGF0YUZpZWxkRGF0YVR5cGUiLCJwcm9wZXJ0eVR5cGVDb25maWciLCJnZXRUeXBlQ29uZmlnIiwiaXNBUHJvcGVydHlGcm9tVGV4dE9ubHlBbm5vdGF0aW9uIiwic29ydGFibGUiLCJmaWx0ZXJhYmxlIiwibm9uRmlsdGVyYWJsZVByb3BlcnRpZXMiLCJ0eXBlQ29uZmlnIiwiY2xhc3NOYW1lIiwiY29uc3RyYWludHMiLCJfaXNFeHBvcnRhYmxlQ29sdW1uIiwiY3JlYXRlQ29sdW1uRXhwb3J0U2V0dGluZ3MiLCJjb2xsZWN0ZWROYXZpZ2F0aW9uUHJvcGVydHlMYWJlbHMiLCJfZ2V0Q29sbGVjdGVkTmF2aWdhdGlvblByb3BlcnR5TGFiZWxzIiwicmVwbGFjZVNwZWNpYWxDaGFycyIsIkFubm90YXRpb24iLCJncm91cExhYmVsIiwiZ3JvdXAiLCJzZW1hbnRpY09iamVjdFBhdGgiLCJpc0dyb3VwYWJsZSIsImlzS2V5IiwiY2FzZVNlbnNpdGl2ZSIsImlzRmlsdGVyaW5nQ2FzZVNlbnNpdGl2ZSIsImdldEltcG9ydGFuY2UiLCJEYXRhRmllbGREZWZhdWx0IiwicmVxdWlyZWQiLCJpc1JlcXVpcmVkQ29sdW1uIiwiYWRkaXRpb25hbExhYmVscyIsIl9hZGRUb29sVGlwIiwiX3NldEV4cG9ydFNldHRpbmdzRm9yRGF0YVBvaW50IiwiZW5oYW5jZWRDb2x1bW4iLCJleHRlbnNpb24iLCJ0ZWNobmljYWxseUFnZ3JlZ2F0YWJsZSIsInRlY2huaWNhbGx5R3JvdXBhYmxlIiwidW5pdFByb3BlcnR5IiwidXRjIiwiaXNBVGltZXpvbmUiLCJjdXJyZW5jeVByb3BlcnR5Iiwic2NhbGUiLCJpc1Byb3BlcnR5IiwiZ2V0QXNzb2NpYXRlZFVuaXRQcm9wZXJ0eSIsImdldEFzc29jaWF0ZWRDdXJyZW5jeVByb3BlcnR5IiwiZ2V0U3RhdGljVW5pdE9yQ3VycmVuY3kiLCJnZXRTdGF0aWNUaW1lem9uZSIsImlzVGltZXpvbmUiLCJleHBvcnRUeXBlIiwiZ2V0RXhwb3J0RGF0YVR5cGUiLCJpbnB1dEZvcm1hdCIsImdldERhdGVJbnB1dEZvcm1hdCIsImRlbGltaXRlciIsImdldERlbGltaXRlciIsInRlbXBsYXRlIiwid3JhcCIsImF1dG9TY2FsZSIsInJlbW92ZVVuZGVmaW5lZEZyb21FeHBvcnRTZXR0aW5ncyIsInNldHRpbmciLCJjb2x1bW5OYW1lIiwibGlua2VkQW5ub3RhdGlvbkNvbHVtbnMiLCJjb2wiLCJ0b29sdGlwIiwicHJvcGVydHlUeXBlIiwiZGF0YUZpZWxkRGVmYXVsdFByb3BlcnR5IiwiVGFyZ2V0IiwiTWVkaWFUeXBlIiwidGVybSIsImlzVVJMIiwiX2lzVmFsaWRDb2x1bW4iLCJfZ2V0VmlzaWJsZUV4cHJlc3Npb24iLCJkYXRhRmllbGRNb2RlbFBhdGgiLCJwcm9wZXJ0eVZhbHVlIiwiaXNBbmFseXRpY2FsR3JvdXBIZWFkZXJFeHBhbmRlZCIsImlzQW5hbHl0aWNhbExlYWYiLCJfZ2V0RmllbGRHcm91cEhpZGRlbkV4cHJlc3Npb25zIiwiZmllbGRHcm91cEhpZGRlbkV4cHJlc3Npb25zIiwiRGF0YSIsImlubmVyRGF0YUZpZWxkIiwiZGF0YUZpZWxkRGVmYXVsdCIsImlzRGF0YUZpZWxkVHlwZXMiLCJfZ2V0VG9vbHRpcCIsIlF1aWNrSW5mbyIsImRhdGFwb2ludFRhcmdldCIsImdldFJvd1N0YXR1c1Zpc2liaWxpdHkiLCJjb2xOYW1lIiwiaXNTZW1hbnRpY0tleUluRmllbGRHcm91cCIsImdldEVycm9yU3RhdHVzVGV4dFZpc2liaWxpdHlGb3JtYXR0ZXIiLCJleGlzdGluZ0NvbHVtbnMiLCJyZWxhdGVkUHJvcGVydHlOYW1lTWFwIiwiZ2V0QWJzb2x1dGVBbm5vdGF0aW9uUGF0aCIsInJlbGF0ZWRDb2x1bW4iLCJwcm9wZXJ0eU9iamVjdFBhdGgiLCJpc011bHRpVmFsdWVGaWVsZCIsIm5ld05hbWVSZWxhdGl2ZVRhcmdldFBhdGgiLCJjb21wdXRlSGlkZGVuT25SZWxhdGVkQ29sdW1ucyIsIm5ld05hbWUiLCJwcm9wZXJ0eUluZm8iLCJfZ2V0QW5ub3RhdGlvbkNvbHVtbk5hbWUiLCJjcmVhdGVUZWNobmljYWxQcm9wZXJ0eSIsInJlbGF0ZWRBZGRpdGlvbmFsUHJvcGVydHlOYW1lTWFwIiwiY29sdW1uRXhpc3RzIiwiYWRkaXRpb25hbFByb3BlcnR5IiwidGVjaG5pY2FsQ29sdW1uIiwiYWdncmVnYXRhYmxlIiwiX2dldFNob3dEYXRhRmllbGRzTGFiZWwiLCJmaWVsZEdyb3VwTmFtZSIsImNvbHVtbktleXMiLCJzaG93RGF0YUZpZWxkc0xhYmVsIiwiX2dldFJlbGF0aXZlUGF0aCIsImlzTGFzdFNsYXNoIiwiaXNMYXN0UGFydCIsImlTbGFzaEluZGV4IiwibGFzdEluZGV4T2YiLCJfaXNDb2x1bW5NdWx0aVZhbHVlZCIsIl9pc0NvbHVtblNvcnRhYmxlIiwibm9uU29ydGFibGVDb2x1bW5zIiwiZmlsdGVyRnVuY3Rpb25zIiwiX2dldEZpbHRlckZ1bmN0aW9ucyIsImlzQXJyYXkiLCJDb252ZXJ0ZXJDb250ZXh0IiwiVHlwZUd1YXJkcyIsIkZpbHRlckZ1bmN0aW9ucyIsImdldEVudGl0eUNvbnRhaW5lciIsIl9nZXREZWZhdWx0Rm9ybWF0T3B0aW9uc0ZvclRhYmxlIiwidGV4dExpbmVzRWRpdCIsIl9maW5kU2VtYW50aWNLZXlWYWx1ZXMiLCJhU2VtYW50aWNLZXlWYWx1ZXMiLCJiU2VtYW50aWNLZXlGb3VuZCIsImkiLCJzZW1hbnRpY0tleUZvdW5kIiwiX2ZpbmRQcm9wZXJ0aWVzIiwic2VtYW50aWNLZXlWYWx1ZXMiLCJmaWVsZEdyb3VwUHJvcGVydGllcyIsInNlbWFudGljS2V5SGFzUHJvcGVydHlJbkZpZWxkR3JvdXAiLCJzUHJvcGVydHlQYXRoIiwidG1wIiwiZmllbGRHcm91cFByb3BlcnR5UGF0aCIsIl9maW5kU2VtYW50aWNLZXlWYWx1ZXNJbkZpZWxkR3JvdXAiLCJhUHJvcGVydGllcyIsIl9wcm9wZXJ0aWVzRm91bmQiLCJnZXREZWZhdWx0RHJhZnRJbmRpY2F0b3JGb3JDb2x1bW4iLCJzZW1hbnRpY0tleUluRmllbGRHcm91cCIsImZpZWxkR3JvdXBEcmFmdEluZGljYXRvclByb3BlcnR5UGF0aCIsInNob3dFcnJvck9iamVjdFN0YXR1cyIsImhhc0RyYWZ0SW5kaWNhdG9yIiwiX2dldEltcE51bWJlciIsIkltcG9ydGFuY2UiLCJfZ2V0RGF0YUZpZWxkSW1wb3J0YW5jZSIsInRhcmdldFZhbHVlZnJvbURQIiwiZ2V0VGFyZ2V0VmFsdWVPbkRhdGFQb2ludCIsImlzRGF0YVBvaW50RnJvbURhdGFGaWVsZERlZmF1bHQiLCJfZ2V0TWF4SW1wb3J0YW5jZSIsIm1heEltcE51bWJlciIsImltcE51bWJlciIsIkRhdGFGaWVsZFdpdGhNYXhJbXBvcnRhbmNlIiwicmVxdWlyZWRQcm9wZXJ0aWVzIiwiZ2V0UmVxdWlyZWRQcm9wZXJ0aWVzIiwiaGlnaEtleXMiLCJmaWVsZHNXaXRoSW1wb3J0YW5jZSIsImlzQW5ub3RhdGlvbk9mVHlwZSIsImRhdGFGaWVsZFRhcmdldCIsImZpZWxkR3JvdXBEYXRhIiwiZmllbGRHcm91cERhdGFGaWVsZCIsIkhpZ2giLCJpdGVtIiwiZ2V0UmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzIiwiZ2V0VGFibGVUeXBlIiwiZGVmYXVsdENyZWF0aW9uTW9kZSIsImdldFNhcEZlTWFuaWZlc3RDb25maWd1cmF0aW9uIiwibWFjcm9zIiwidGFibGUiLCJJbmxpbmVDcmVhdGlvblJvd3MiLCJnZXRBbm5vdGF0aW9uc0J5VGVybSIsInRhYmxlQ29udmVydGVyQ29udGV4dCIsImdldFRhcmdldE9iamVjdFBhdGgiLCJjb2xsZWN0UmVsYXRlZFByb3BlcnRpZXNSZWN1cnNpdmVseSIsInNMYWJlbCIsImlzRmllbGRHcm91cENvbHVtbiIsIm5hdmlnYXRpb25Qcm9wZXJ0aWVzIiwic2l0dWF0aW9uc05hdlByb3BzIiwibmF2aWdhdGlvblByb3BlcnR5IiwiaXNDb2xsZWN0aW9uIiwiU0FQT2JqZWN0Tm9kZVR5cGUiLCJOYW1lIiwic2l0dWF0aW9uc05hdlByb3AiLCJoYXNTaXR1YXRpb25zSW5kaWNhdG9yIiwiaXNNdWx0aVZhbHVlIiwidmlzdWFsU2V0dGluZ3MiLCJ3aWR0aENhbGN1bGF0aW9uIiwiRmllbGRHcm91cEhpZGRlbkV4cHJlc3Npb25zIiwiSFRNTDUiLCJDc3NEZWZhdWx0cyIsImlzUGFydE9mTGluZUl0ZW0iLCJyZWxhdGVkUHJvcGVydHlOYW1lIiwiZGlzcGxheU1vZGVPZlByb3BlcnR5VXNlZEFzRGVzY3JpcHRpb24iLCJjcmVhdGVQcm9wZXJ0eUFubm90YXRlZFRleHRPbmx5IiwiX2dldFByb3BlcnR5TmFtZXMiLCJtYXRjaGVkUHJvcGVydGllcyIsImlzUmVxdWlyZWRGaWVsZEdyb3VwIiwiZmllbGRHcm91cCIsImlzRGF0YUZpZWxkIiwiaXNTdGF0aWNhbGx5TWFuZGF0b3J5IiwiaXNBbm5vdGF0ZWRSZXF1aXJlZFByb3BlcnR5IiwiaXNSZXF1aXJlZERhdGFGaWVsZEZvckFubm90YXRpb24iLCJkYXRhRmllbGRGb3JBbm5vdGF0aW9uIiwiRGF0YUZpZWxkRm9yQW5ub3RhdGlvbkZpZWxkQ29udHJvbE5vdE1hbmRhdG9yeSIsImhhc0ZpZWxkQ29udHJvbE5vdE1hbmRhdG9yeSIsImhhc0ZpZWxkR3JvdXBUYXJnZXQiLCJoYXNEYXRhUG9pbnRUYXJnZXQiLCJWaXN1YWxpemF0aW9uIiwiaXNSZXF1aXJlZERhdGFQb2ludCIsImlzUmVxdWlyZWRQcm9wZXJ0eSIsImlzUmF0aW5nVmlzdWFsaXphdGlvbkZyb21EYXRhRmllbGREZWZhdWx0IiwiZGF0YVBvaW50IiwiQW5hbHl0aWNhbExpc3RQYWdlIiwiaXNEYXRhRmllbGRGb3JBbm5vdGF0aW9uIiwiX2FwcGVuZEN1c3RvbVRlbXBsYXRlIiwiZXhwb3J0UHJvcGVydGllcyIsImludGVybmFsQ29sdW1ucyIsImlzQ29sdW1uT3ZlcnJpZGUiLCJpc1Nsb3RDb2x1bW4iLCJtYW5pZmVzdENvbHVtbiIsIlNsb3QiLCJpc0N1c3RvbUNvbHVtbiIsIl91cGRhdGVMaW5rZWRQcm9wZXJ0aWVzT25DdXN0b21Db2x1bW5zIiwiYW5ub3RhdGlvblRhYmxlQ29sdW1ucyIsInJlcGxhY2UiLCJpc1BhcnRPZkN1c3RvbUNvbHVtbiIsInZhbGlkYXRlS2V5IiwiYmFzZVRhYmxlQ29sdW1uIiwiQWZ0ZXIiLCJwcm9wZXJ0aWVzVG9PdmVyd3JpdGVBbm5vdGF0aW9uQ29sdW1uIiwiZ2V0Q3VzdG9tRXhwb3J0U2V0dGluZ3MiLCJ0b29sdGlwVGV4dCIsImZldGNoVGV4dEZyb21NZXRhTW9kZWwiLCJoZWFkZXJUZXh0IiwiY3VzdG9tQ29sdW1uRXhwb3J0U2V0dGluZ3MiLCJiYXNlTWFuaWZlc3RDb2x1bW4iLCJIb3Jpem9udGFsQWxpZ24iLCJCZWdpbiIsImN1c3RvbVRhYmxlQ29sdW1uIiwibWVzc2FnZSIsImdldERpYWdub3N0aWNzIiwiYWRkSXNzdWUiLCJJc3N1ZUNhdGVnb3J5IiwiTWFuaWZlc3QiLCJJc3N1ZVNldmVyaXR5IiwiTG93IiwiSXNzdWVDYXRlZ29yeVR5cGUiLCJBbm5vdGF0aW9uQ29sdW1ucyIsIkludmFsaWRLZXkiLCJjb2x1bW5XaXRoU2l0dWF0aW9uc0luZGljYXRvciIsInNpdHVhdGlvbnNJbmRpY2F0b3JDb2x1bW4iLCJwcm9wZXJ0eUtleSIsImlzU2l0dWF0aW9uc0luZGljYXRvciIsIkNvbXB1dGVkIiwiY2xpcGJvYXJkU2V0dGluZ3MiLCJpbmRleE9mRmlyc3RWaXNpYmxlQ29sdW1uIiwiZmluZEluZGV4Iiwic3BsaWNlIiwiY29sdW1uc1dpdGhEcmFmdEluZGljYXRvciIsImlzRHJhZnROb2RlIiwiY29sdW1uV2l0aERyYWZ0SW5kaWNhdG9yIiwiZHJhZnRJbmRpY2F0b3JDb2x1bW4iLCJpc0RyYWZ0SW5kaWNhdG9yIiwiY29sdW1uSW5kZXhUb0luc2VydEFmdGVyIiwiZ2V0UDEzbk1vZGUiLCJ2YXJpYW50TWFuYWdlbWVudCIsImdldFZhcmlhbnRNYW5hZ2VtZW50IiwibW9kZXMiLCJpc0FuYWx5dGljYWxUYWJsZSIsImlzUmVzcG9uc2l2ZVRhYmxlIiwicGVyc29uYWxpemF0aW9uIiwic29ydCIsImFnZ3JlZ2F0ZSIsIlZhcmlhbnRNYW5hZ2VtZW50VHlwZSIsIkNvbnRyb2wiLCJfaXNGaWx0ZXJCYXJIaWRkZW4iLCJpc0ZpbHRlckJhckhpZGRlbiIsImhhc011bHRpcGxlVmlzdWFsaXphdGlvbnMiLCJnZXRTb3J0Q29uZGl0aW9ucyIsInNvcnRDb25kaXRpb25zIiwic29ydGVycyIsIlNvcnRPcmRlciIsImNvbmRpdGlvbiIsImNvbmRpdGlvblByb3BlcnR5IiwiUHJvcGVydHkiLCJpbmZvTmFtZSIsImNvbnZlcnRQcm9wZXJ0eVBhdGhzVG9JbmZvTmFtZXMiLCJkZXNjZW5kaW5nIiwiRGVzY2VuZGluZyIsImdldEluaXRpYWxFeHBhbnNpb25MZXZlbCIsImxldmVsIiwiSW5pdGlhbEV4cGFuc2lvbkxldmVsIiwicGF0aHMiLCJpbmZvTmFtZXMiLCJjdXJyZW50UGF0aCIsImdyb3VwTGV2ZWxzIiwiR3JvdXBCeSIsImFHcm91cEJ5IiwiYWdncmVnYXRhYmxlUHJvcGVydHlOYW1lIiwiYWdncmVnYXRhYmxlUHJvcGVydHlEZWZpbml0aW9uIiwiYWRkaXRpb25hbFByb3BlcnR5SW5mbyIsImdldENvbnRleHRQcm9wZXJ0eVJlc3RyaWN0aW9uIiwiY2FwYWJpbGl0aWVzIiwiSW5zZXJ0UmVzdHJpY3Rpb25zIiwiUmVxdWlyZWRQcm9wZXJ0aWVzIiwiZXh0ZW5zaW9uSW5mb01hcCIsIlRvdGFsIiwiYVRvdGFscyIsImNyZWF0aW9uQmVoYXZpb3VyIiwic3RhbmRhcmRBY3Rpb25zQ29udGV4dCIsImdlbmVyYXRlU3RhbmRhcmRBY3Rpb25zQ29udGV4dCIsImdldEN1dFZpc2liaWxpdHkiLCJnZXREZWxldGVWaXNpYmlsaXR5IiwibWFzc0VkaXRCdXR0b25WaXNpYmlsaXR5RXhwcmVzc2lvbiIsImdldE1hc3NFZGl0VmlzaWJpbGl0eSIsImlzSW5zZXJ0VXBkYXRlQWN0aW9uc1RlbXBsYXRlZCIsImdldEluc2VydFVwZGF0ZUFjdGlvbnNUZW1wbGF0aW5nIiwiaXNEcmFmdE9yU3RpY2t5U3VwcG9ydGVkIiwiZ2V0U3RhbmRhcmRBY3Rpb25DdXQiLCJnZXRTdGFuZGFyZEFjdGlvbkNyZWF0ZSIsImdldFN0YW5kYXJkQWN0aW9uRGVsZXRlIiwiZ2V0U3RhbmRhcmRBY3Rpb25QYXN0ZSIsImdldFN0YW5kYXJkQWN0aW9uTWFzc0VkaXQiLCJnZXRTdGFuZGFyZEFjdGlvbkluc2lnaHRzIiwiZ2V0Q3JlYXRpb25Sb3ciLCJjb25maWd1cmF0aW9uIiwiZ2V0U3RhbmRhcmRBY3Rpb25Nb3ZlVXBEb3duIiwidHlwZU5hbWVQbHVyYWwiLCJUeXBlTmFtZVBsdXJhbCIsInBhZ2VNYW5pZmVzdFNldHRpbmdzIiwiaGFzQWJzb2x1dGVQYXRoIiwicDEzbk1vZGUiLCJnZXRUYWJsZUlEIiwidGhyZXNob2xkIiwiTWF4SXRlbXMiLCJpc1NlYXJjaGFibGUiLCJpc1BhdGhTZWFyY2hhYmxlIiwiYXBpSWQiLCJlbnRpdHlOYW1lIiwiZW50aXR5VHlwZU5hbWUiLCJjb2xsZWN0aW9uIiwicm93IiwiYW5hbHl0aWNhbENvbmZpZ3VyYXRpb24iLCJhZ2dyZWdhdGlvbk9uTGVhZkxldmVsIiwiaXNJbkRpc3BsYXlNb2RlIiwic2VhcmNoYWJsZSIsImluaXRpYWxFeHBhbnNpb25MZXZlbCIsImlzQ3VycmVuY3kiLCJleHBvcnREYXRhVHlwZSIsInRhcmdldE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgiLCJnZXRTZWxlY3Rpb25WYXJpYW50Q29uZmlndXJhdGlvbiIsInNlbGVjdGlvblZhcmlhbnRQYXRoIiwicmVzb2x2ZWRUYXJnZXQiLCJnZXRFbnRpdHlUeXBlQW5ub3RhdGlvbiIsInNlbGVjdGlvbiIsInByb3BlcnR5TmFtZXMiLCJTZWxlY3RPcHRpb25zIiwic2VsZWN0T3B0aW9uIiwiUHJvcGVydHlOYW1lIiwiX2dldEZ1bGxTY3JlZW5CYXNlZE9uRGV2aWNlIiwiaXNJcGhvbmUiLCJlbmFibGVGdWxsU2NyZWVuIiwiSXNzdWVUeXBlIiwiRlVMTFNDUkVFTk1PREVfTk9UX09OX0xJU1RSRVBPUlQiLCJfZ2V0TXVsdGlTZWxlY3RNb2RlIiwibXVsdGlTZWxlY3RNb2RlIiwic2VsZWN0QWxsIiwidXNlSWNvblRhYkJhciIsIl9nZXRUYWJsZU1vZGUiLCJpc1RlbXBsYXRlTGlzdFJlcG9ydCIsInJvd0NvdW50TW9kZSIsInJvd0NvdW50IiwiX2dldENvbmRlbnNlZFRhYmxlTGF5b3V0IiwiX3RhYmxlVHlwZSIsIl90YWJsZVNldHRpbmdzIiwiY29uZGVuc2VkVGFibGVMYXlvdXQiLCJfZ2V0VGFibGVTZWxlY3Rpb25MaW1pdCIsInNlbGVjdGlvbkxpbWl0IiwiX2dldFRhYmxlSW5saW5lQ3JlYXRpb25Sb3dDb3VudCIsImlubGluZUNyZWF0aW9uUm93Q291bnQiLCJfZ2V0RW5hYmxlRXhwb3J0IiwiZW5hYmxlUGFzdGUiLCJlbmFibGVFeHBvcnQiLCJfZ2V0RnJvemVuQ29sdW1uQ291bnQiLCJmcm96ZW5Db2x1bW5Db3VudCIsIl9nZXRXaWR0aEluY2x1ZGluZ0NvbHVtbkhlYWRlciIsImdldEZpbHRlckNvbmZpZ3VyYXRpb24iLCJoaWRlVGFibGVUaXRsZSIsImZpbHRlcnMiLCJxdWlja1ZhcmlhbnRTZWxlY3Rpb24iLCJxdWlja0ZpbHRlclBhdGhzIiwiZmlsdGVyUGF0aHMiLCJxdWlja0ZpbHRlcnMiLCJzaG93Q291bnRzIiwiaGlkZGVuRmlsdGVycyIsIm5hdlByb3BlcnR5IiwidXNlRW5hYmxlZEV4cHJlc3Npb24iLCJPcGVyYXRpb25BdmFpbGFibGUiLCJvdmVybG9hZEFjdGlvbiIsInNvdXJjZVR5cGUiLCJzdGF0aWNBY3Rpb24iLCJwYXJhbWV0ZXJzIiwidXBkYXRlVHJlZVRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uIiwidGFibGVDb25maWd1cmF0aW9uIiwiaGllcmFyY2h5UGFyZW50TmF2aWdhdGlvblByb3BlcnR5UGF0aCIsImdldEhpZXJhcmNoeVBhcmVudE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgiLCJub25VcGRhdGFibGVOYXZpZ2F0aW9uUHJvcGVydGllcyIsImdldE5vblVwZGF0YWJsZU5hdmlnYXRpb25Qcm9wZXJ0aWVzIiwiaXNIaWVyYXJjaHlQYXJlbnROb2RlVXBkYXRhYmxlIiwiaXNOb2RlTW92YWJsZSIsImdldEN1c3RvbUZ1bmN0aW9uSW5mbyIsImlzTW92ZVRvUG9zaXRpb25BbGxvd2VkIiwiY3JlYXRlRW5hYmxlbWVudCIsImlzQ3JlYXRlRW5hYmxlZCIsIm5vZGVUeXBlIiwibm9kZVR5cGVJbmZvIiwiY3JlYXRpb25EaWFsb2dGaWVsZHMiLCJnZXRGaWVsZExpc3QiLCJjcmVhdGlvbkZpZWxkcyIsImNyZWF0ZUluUGxhY2UiLCJsYXN0RG90SW5kZXgiLCJtb2R1bGVOYW1lIiwibWV0aG9kTmFtZSIsImFkZGl0aW9uYWxSZXF1aXJlZE1vZHVsZXMiLCJnZXRPcHRpbWlzdGljQmF0Y2hTZXR0aW5nc0Zyb21NYW5pZmVzdCIsImRpc2FibGVSZXF1ZXN0Q2FjaGUiLCJnZXRNYXNzRWRpdFNldHRpbmdzIiwiZGVmYXVsdEZpZWxkQ29uZmlndXJhdGlvbiIsInZpc2libGVGaWVsZHMiLCJpZ25vcmVkRmllbGRzIiwib3BlcmF0aW9uR3JvdXBpbmdNb2RlIiwiT3BlcmF0aW9uR3JvdXBpbmdNb2RlIiwiSXNvbGF0ZWQiLCJDaGFuZ2VTZXQiLCJlbmFibGVNYXNzRWRpdCIsImN1c3RvbUZyYWdtZW50IiwidHJpbSIsImNoZWNrQ29uZGVuc2VkTGF5b3V0IiwiX21hbmlmZXN0V3JhcHBlciIsImdsb2JhbEZFTWFuaWZlc3RTZXR0aW5ncyIsImVuYWJsZUF1dG9Db2x1bW5XaWR0aCIsImlzUGhvbmUiLCJkaXNhYmxlQ29weVRvQ2xpcGJvYXJkIiwidGVtcGxhdGVUeXBlIiwiaXNDb25kZW5zZWRMYXlvdXRDb21wbGlhbnQiLCJvRmlsdGVyQ29uZmlndXJhdGlvbiIsImN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbiIsImV4cG9ydFJlcXVlc3RTaXplIiwidGFibGVSb3dNb2RlIiwiZGVmYXVsdFNjcm9sbFRocmVzaG9sZCIsImlubGluZUNyZWF0aW9uUm93c0hpZGRlbkluRWRpdE1vZGUiLCJ1c2VUZXh0Rm9yTm9EYXRhTWVzc2FnZXMiLCJnZXRVc2VUZXh0Rm9yTm9EYXRhTWVzc2FnZXMiLCJvQ29uZmlndXJhdGlvbiIsImhhc0RhdGFTdGF0ZUluZGljYXRvckZpbHRlciIsImRpc2FibGVBZGRSb3dCdXR0b25Gb3JFbXB0eURhdGEiLCJlbmFibGVQYXN0aW5nT2ZDb21wdXRlZFByb3BlcnRpZXMiLCJlbmFibGVBZGRDYXJkVG9JbnNpZ2h0cyIsInNob3dSb3dDb3VudCIsImdldFZpZXdDb25maWd1cmF0aW9uIiwidXNlQ29uZGVuc2VkVGFibGVMYXlvdXQiLCJpc0NvbXBhY3RUeXBlIiwiYmVmb3JlUmViaW5kVGFibGUiLCJzZWxlY3Rpb25DaGFuZ2UiLCJtb2RlRm9yTm9EYXRhTWVzc2FnZSIsInNjcm9sbFRocmVzaG9sZCIsImlzUHJvcGVydHlOYXZpZ2F0ZWQiLCJpbmhlcmVkUHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoIiwiaXNJbmhlcmVkUHJvcGVydHlOYXZpZ2F0ZWQiLCJvUHJvcGVydHkiLCJvVGFyZ2V0TWFwcGluZyIsImlzVHlwZURlZmluaXRpb24iLCJFRE1fVFlQRV9NQVBQSU5HIiwidW5kZXJseWluZ1R5cGUiLCIkU2NhbGUiLCJwcmVjaXNpb24iLCIkUHJlY2lzaW9uIiwiJE1heExlbmd0aCIsIm51bGxhYmxlIiwiJE51bGxhYmxlIiwibWluaW11bSIsImlzTmFOIiwiVmFsaWRhdGlvbiIsIk1pbmltdW0iLCJtYXhpbXVtIiwiTWF4aW11bSIsImlzRGlnaXRTZXF1ZW5jZSIsIklzRGlnaXRTZXF1ZW5jZSIsInBhcnNlQXNTdHJpbmciLCJlbXB0eVN0cmluZyIsInBhcnNlS2VlcHNFbXB0eVN0cmluZyIsInJlbGF0ZWRBbm5vdGF0aW9uQ29sdW1ucyIsImV4aXN0aW5nQ29sdW1uIiwiY29sdW1uS2V5IiwiY29sdW1uRnJvbUFubm90YXRpb25zIiwiZW5hYmxlV3JhcHBpbmciLCJjdXN0b21FeHBvcnRTZXR0aW5ncyJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiVGFibGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUge1xuXHRFbnRpdHlTZXQsXG5cdEVudGl0eVR5cGUsXG5cdE5hdmlnYXRpb25Qcm9wZXJ0eSxcblx0UGF0aEFubm90YXRpb25FeHByZXNzaW9uLFxuXHRQcm9wZXJ0eSxcblx0UHJvcGVydHlBbm5vdGF0aW9uVmFsdWUsXG5cdFByb3BlcnR5UGF0aFxufSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXNcIjtcbmltcG9ydCB0eXBlIHsgRmlsdGVyRnVuY3Rpb25zIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3ZvY2FidWxhcmllcy9DYXBhYmlsaXRpZXNcIjtcbmltcG9ydCB0eXBlIHsgRW50aXR5U2V0QW5ub3RhdGlvbnNfQ2FwYWJpbGl0aWVzIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3ZvY2FidWxhcmllcy9DYXBhYmlsaXRpZXNfRWRtXCI7XG5pbXBvcnQgdHlwZSB7IFNlbWFudGljS2V5IH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3ZvY2FidWxhcmllcy9Db21tb25cIjtcbmltcG9ydCB7IENvbW1vbkFubm90YXRpb25UZXJtcyB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvQ29tbW9uXCI7XG5pbXBvcnQgdHlwZSB7IEVudGl0eVNldEFubm90YXRpb25zX0NvbW1vbiB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvQ29tbW9uX0VkbVwiO1xuaW1wb3J0IHR5cGUgeyBFbnRpdHlTZXRBbm5vdGF0aW9uc19TZXNzaW9uIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3ZvY2FidWxhcmllcy9TZXNzaW9uX0VkbVwiO1xuaW1wb3J0IHR5cGUge1xuXHRDcml0aWNhbGl0eSxcblx0RGF0YUZpZWxkLFxuXHREYXRhRmllbGRBYnN0cmFjdFR5cGVzLFxuXHREYXRhRmllbGRGb3JBY3Rpb24sXG5cdERhdGFGaWVsZEZvckFjdGlvbkdyb3VwLFxuXHREYXRhRmllbGRGb3JBY3Rpb25UeXBlcyxcblx0RGF0YUZpZWxkRm9yQW5ub3RhdGlvbixcblx0RGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uLFxuXHREYXRhRmllbGRUeXBlcyxcblx0RGF0YVBvaW50LFxuXHREYXRhUG9pbnRUeXBlVHlwZXMsXG5cdEZpZWxkR3JvdXAsXG5cdExpbmVJdGVtLFxuXHRQcmVzZW50YXRpb25WYXJpYW50VHlwZSxcblx0U2VsZWN0T3B0aW9uVHlwZSxcblx0U2VsZWN0aW9uVmFyaWFudCxcblx0U2VsZWN0aW9uVmFyaWFudFR5cGVcbn0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3ZvY2FidWxhcmllcy9VSVwiO1xuaW1wb3J0IHsgVUlBbm5vdGF0aW9uVGVybXMsIFVJQW5ub3RhdGlvblR5cGVzIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3ZvY2FidWxhcmllcy9VSVwiO1xuaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgdHlwZSB7IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiwgQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24gfSBmcm9tIFwic2FwL2ZlL2Jhc2UvQmluZGluZ1Rvb2xraXRcIjtcbmltcG9ydCB7XG5cdEVETV9UWVBFX01BUFBJTkcsXG5cdGFuZCxcblx0Y29tcGlsZUV4cHJlc3Npb24sXG5cdGNvbnN0YW50LFxuXHRlcXVhbCxcblx0Zm9ybWF0UmVzdWx0LFxuXHRnZXRFeHByZXNzaW9uRnJvbUFubm90YXRpb24sXG5cdGlmRWxzZSxcblx0aXNDb25zdGFudCxcblx0bm90LFxuXHRvcixcblx0cGF0aEluTW9kZWwsXG5cdHJlc29sdmVCaW5kaW5nU3RyaW5nXG59IGZyb20gXCJzYXAvZmUvYmFzZS9CaW5kaW5nVG9vbGtpdFwiO1xuaW1wb3J0IHR5cGUgeyBQYWdlQ29udGV4dFBhdGhUYXJnZXQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9UZW1wbGF0ZUNvbnZlcnRlclwiO1xuaW1wb3J0IHR5cGUgeyBDb21wbGV4UHJvcGVydHlJbmZvIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvYW5ub3RhdGlvbnMvRGF0YUZpZWxkXCI7XG5pbXBvcnQge1xuXHRjb2xsZWN0UmVsYXRlZFByb3BlcnRpZXMsXG5cdGNvbGxlY3RSZWxhdGVkUHJvcGVydGllc1JlY3Vyc2l2ZWx5LFxuXHRnZXREYXRhRmllbGREYXRhVHlwZSxcblx0Z2V0U2VtYW50aWNPYmplY3RQYXRoLFxuXHRnZXRUYXJnZXRWYWx1ZU9uRGF0YVBvaW50LFxuXHRoYXNEYXRhUG9pbnRUYXJnZXQsXG5cdGhhc0ZpZWxkR3JvdXBUYXJnZXQsXG5cdGlzRGF0YUZpZWxkLFxuXHRpc0RhdGFGaWVsZEZvckFjdGlvbkFic3RyYWN0LFxuXHRpc0RhdGFGaWVsZEZvckFjdGlvbkdyb3VwLFxuXHRpc0RhdGFGaWVsZEZvckFubm90YXRpb24sXG5cdGlzRGF0YUZpZWxkVHlwZXMsXG5cdGlzRGF0YVBvaW50RnJvbURhdGFGaWVsZERlZmF1bHQsXG5cdGlzUmF0aW5nVmlzdWFsaXphdGlvbkZyb21EYXRhRmllbGREZWZhdWx0LFxuXHR2aXNpYmxlRXhwcmVzc2lvblxufSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9hbm5vdGF0aW9ucy9EYXRhRmllbGRcIjtcbmltcG9ydCB0eXBlIHtcblx0QW5ub3RhdGlvbkFjdGlvbixcblx0QW5ub3RhdGlvbkFjdGlvbkdyb3VwLFxuXHRCYXNlQWN0aW9uLFxuXHRDb21iaW5lZEFjdGlvbixcblx0Q3VzdG9tQWN0aW9uLFxuXHRPdmVycmlkZVR5cGVBY3Rpb25cbn0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvY29udHJvbHMvQ29tbW9uL0FjdGlvblwiO1xuaW1wb3J0IHtcblx0ZGF0YUZpZWxkSXNDb3B5QWN0aW9uLFxuXHRnZXRBY3Rpb25zRnJvbU1hbmlmZXN0LFxuXHRnZXRBbm5vdGF0aW9uTWVudUFjdGlvbkl0ZW1zLFxuXHRnZXRDb3B5QWN0aW9uLFxuXHRnZXRFbmFibGVkRm9yQW5ub3RhdGlvbkFjdGlvbixcblx0Z2V0TWF0Y2hpbmdNYW5pZmVzdEFjdGlvbixcblx0Z2V0VmlzaWJpbGl0eUVuYWJsZW1lbnRNZW51QWN0aW9ucyxcblx0cHJlcGFyZU1lbnVBY3Rpb25zLFxuXHRyZW1vdmVEdXBsaWNhdGVBY3Rpb25zXG59IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2NvbnRyb2xzL0NvbW1vbi9BY3Rpb25cIjtcbmltcG9ydCB0eXBlIHsgQ29uZmlndXJhYmxlT2JqZWN0LCBDdXN0b21FbGVtZW50IH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvaGVscGVycy9Db25maWd1cmFibGVPYmplY3RcIjtcbmltcG9ydCB7IE92ZXJyaWRlVHlwZSwgUGxhY2VtZW50LCBpbnNlcnRDdXN0b21FbGVtZW50cyB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2hlbHBlcnMvQ29uZmlndXJhYmxlT2JqZWN0XCI7XG5pbXBvcnQgeyBJc3N1ZUNhdGVnb3J5LCBJc3N1ZUNhdGVnb3J5VHlwZSwgSXNzdWVTZXZlcml0eSwgSXNzdWVUeXBlIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvaGVscGVycy9Jc3N1ZU1hbmFnZXJcIjtcbmltcG9ydCB7IEtleUhlbHBlciB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2hlbHBlcnMvS2V5XCI7XG5pbXBvcnQgeyBFbnRpdHksIFVJIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvQmluZGluZ0hlbHBlclwiO1xuaW1wb3J0IE1vZGVsSGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01vZGVsSGVscGVyXCI7XG5pbXBvcnQgeyBnZW5lcmF0ZSwgcmVwbGFjZVNwZWNpYWxDaGFycyB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1N0YWJsZUlkSGVscGVyXCI7XG5pbXBvcnQgKiBhcyBUeXBlR3VhcmRzIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1R5cGVHdWFyZHNcIjtcbmltcG9ydCB7XG5cdGlzQW5ub3RhdGlvbk9mVHlwZSxcblx0aXNOYXZpZ2F0aW9uUHJvcGVydHksXG5cdGlzUGF0aEFubm90YXRpb25FeHByZXNzaW9uLFxuXHRpc1Byb3BlcnR5LFxuXHRpc1R5cGVEZWZpbml0aW9uXG59IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1R5cGVHdWFyZHNcIjtcbmltcG9ydCB7IGNyaXRpY2FsaXR5RXhwcmVzc2lvbkZvckludGVncmF0aW9uQ2FyZHMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9Dcml0aWNhbGl0eUZvcm1hdHRlcnNcIjtcbmltcG9ydCB7XG5cdGVuaGFuY2VEYXRhTW9kZWxQYXRoLFxuXHRnZXRDb250ZXh0UHJvcGVydHlSZXN0cmljdGlvbixcblx0Z2V0Q29udGV4dFJlbGF0aXZlVGFyZ2V0T2JqZWN0UGF0aCxcblx0Z2V0SGllcmFyY2h5UGFyZW50TmF2aWdhdGlvblByb3BlcnR5UGF0aCxcblx0Z2V0Tm9uVXBkYXRhYmxlTmF2aWdhdGlvblByb3BlcnRpZXMsXG5cdGdldFRhcmdldE9iamVjdFBhdGgsXG5cdGlzUGF0aERlbGV0YWJsZSxcblx0aXNQYXRoU2VhcmNoYWJsZSxcblx0aXNQYXRoVXBkYXRhYmxlLFxuXHR0eXBlIERhdGFNb2RlbE9iamVjdFBhdGhcbn0gZnJvbSBcInNhcC9mZS9jb3JlL3RlbXBsYXRpbmcvRGF0YU1vZGVsUGF0aEhlbHBlclwiO1xuaW1wb3J0IHsgZ2V0RGlzcGxheU1vZGUsIHR5cGUgRGlzcGxheU1vZGUgfSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9EaXNwbGF5TW9kZUZvcm1hdHRlclwiO1xuaW1wb3J0IHsgZ2V0UmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzLCB0eXBlIFJlc3RyaWN0aW9uc09uUHJvcGVydGllcyB9IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL0VudGl0eVNldEhlbHBlclwiO1xuaW1wb3J0IHsgaGFzRmllbGRDb250cm9sTm90TWFuZGF0b3J5LCBpc1N0YXRpY2FsbHlNYW5kYXRvcnkgfSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9GaWVsZENvbnRyb2xIZWxwZXJcIjtcbmltcG9ydCB7XG5cdGdldEFzc29jaWF0ZWRDdXJyZW5jeVByb3BlcnR5LFxuXHRnZXRBc3NvY2lhdGVkQ3VycmVuY3lQcm9wZXJ0eVBhdGgsXG5cdGdldEFzc29jaWF0ZWRUZXh0UHJvcGVydHksXG5cdGdldEFzc29jaWF0ZWRUZXh0UHJvcGVydHlQYXRoLFxuXHRnZXRBc3NvY2lhdGVkVGltZXpvbmVQcm9wZXJ0eSxcblx0Z2V0QXNzb2NpYXRlZFVuaXRQcm9wZXJ0eSxcblx0Z2V0QXNzb2NpYXRlZFVuaXRQcm9wZXJ0eVBhdGgsXG5cdGdldFN0YXRpY1RpbWV6b25lLFxuXHRnZXRTdGF0aWNVbml0T3JDdXJyZW5jeSxcblx0aXNUaW1lem9uZVxufSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9Qcm9wZXJ0eUhlbHBlclwiO1xuaW1wb3J0IHsgaXNNdWx0aVZhbHVlRmllbGQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9VSUZvcm1hdHRlcnNcIjtcbmltcG9ydCB0eXBlIHsgRGVmYXVsdFR5cGVGb3JFZG1UeXBlIH0gZnJvbSBcInNhcC9mZS9jb3JlL3R5cGUvRURNXCI7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlc3RyaWN0ZWQtaW1wb3J0c1xuaW1wb3J0IHRhYmxlRm9ybWF0dGVycyBmcm9tIFwic2FwL2ZlL21hY3Jvcy9mb3JtYXR0ZXJzL1RhYmxlRm9ybWF0dGVyXCI7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlc3RyaWN0ZWQtaW1wb3J0c1xuaW1wb3J0IEFjdGlvbkhlbHBlciBmcm9tIFwic2FwL2ZlL21hY3Jvcy9pbnRlcm5hbC9oZWxwZXJzL0FjdGlvbkhlbHBlclwiO1xuaW1wb3J0IExpYnJhcnkgZnJvbSBcInNhcC91aS9jb3JlL0xpYlwiO1xuaW1wb3J0IE1lc3NhZ2VUeXBlIGZyb20gXCJzYXAvdWkvY29yZS9tZXNzYWdlL01lc3NhZ2VUeXBlXCI7XG5pbXBvcnQgdHlwZSBDb252ZXJ0ZXJDb250ZXh0IGZyb20gXCIuLi8uLi9Db252ZXJ0ZXJDb250ZXh0XCI7XG5pbXBvcnQgdHlwZSB7XG5cdEF2YWlsYWJpbGl0eVR5cGUsXG5cdEN1c3RvbURlZmluZWRUYWJsZUNvbHVtbixcblx0Q3VzdG9tRGVmaW5lZFRhYmxlQ29sdW1uRm9yT3ZlcnJpZGUsXG5cdEZvcm1hdE9wdGlvbnNUeXBlLFxuXHRNYW5pZmVzdEFjdGlvbixcblx0TmF2aWdhdGlvblNldHRpbmdzQ29uZmlndXJhdGlvbixcblx0TmF2aWdhdGlvblRhcmdldENvbmZpZ3VyYXRpb24sXG5cdFRhYmxlQ29sdW1uU2V0dGluZ3MsXG5cdFRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uLFxuXHRUYWJsZU1hbmlmZXN0U2V0dGluZ3NDb25maWd1cmF0aW9uXG59IGZyb20gXCIuLi8uLi9NYW5pZmVzdFNldHRpbmdzXCI7XG5pbXBvcnQge1xuXHRBY3Rpb25UeXBlLFxuXHRDcmVhdGlvbk1vZGUsXG5cdEhvcml6b250YWxBbGlnbixcblx0SW1wb3J0YW5jZSxcblx0T3BlcmF0aW9uR3JvdXBpbmdNb2RlLFxuXHRTZWxlY3Rpb25Nb2RlLFxuXHRUZW1wbGF0ZVR5cGUsXG5cdFZhcmlhbnRNYW5hZ2VtZW50VHlwZSxcblx0VmlzdWFsaXphdGlvblR5cGVcbn0gZnJvbSBcIi4uLy4uL01hbmlmZXN0U2V0dGluZ3NcIjtcbmltcG9ydCB0eXBlIE1hbmlmZXN0V3JhcHBlciBmcm9tIFwiLi4vLi4vTWFuaWZlc3RXcmFwcGVyXCI7XG5pbXBvcnQgeyBBZ2dyZWdhdGlvbkhlbHBlciB9IGZyb20gXCIuLi8uLi9oZWxwZXJzL0FnZ3JlZ2F0aW9uXCI7XG5pbXBvcnQgeyBpc1JlZmVyZW5jZVByb3BlcnR5U3RhdGljYWxseUhpZGRlbiB9IGZyb20gXCIuLi8uLi9oZWxwZXJzL0RhdGFGaWVsZEhlbHBlclwiO1xuaW1wb3J0IHsgZ2V0VGFibGVJRCB9IGZyb20gXCIuLi8uLi9oZWxwZXJzL0lEXCI7XG5pbXBvcnQgeyBnZXRNZXNzYWdlVHlwZUZyb21Dcml0aWNhbGl0eVR5cGUgfSBmcm9tIFwiLi9Dcml0aWNhbGl0eVwiO1xuaW1wb3J0IHR5cGUgeyBTdGFuZGFyZEFjdGlvbiB9IGZyb20gXCIuL3RhYmxlL1N0YW5kYXJkQWN0aW9uc1wiO1xuaW1wb3J0IHtcblx0U3RhbmRhcmRBY3Rpb25LZXlzLFxuXHRnZW5lcmF0ZVN0YW5kYXJkQWN0aW9uc0NvbnRleHQsXG5cdGdldENyZWF0aW9uUm93LFxuXHRnZXRDdXRWaXNpYmlsaXR5LFxuXHRnZXREZWxldGVWaXNpYmlsaXR5LFxuXHRnZXRJbnNlcnRVcGRhdGVBY3Rpb25zVGVtcGxhdGluZyxcblx0Z2V0TWFzc0VkaXRWaXNpYmlsaXR5LFxuXHRnZXRSZXN0cmljdGlvbnMsXG5cdGdldFN0YW5kYXJkQWN0aW9uQ3JlYXRlLFxuXHRnZXRTdGFuZGFyZEFjdGlvbkN1dCxcblx0Z2V0U3RhbmRhcmRBY3Rpb25EZWxldGUsXG5cdGdldFN0YW5kYXJkQWN0aW9uSW5zaWdodHMsXG5cdGdldFN0YW5kYXJkQWN0aW9uTWFzc0VkaXQsXG5cdGdldFN0YW5kYXJkQWN0aW9uTW92ZVVwRG93bixcblx0Z2V0U3RhbmRhcmRBY3Rpb25QYXN0ZSxcblx0aXNEcmFmdE9yU3RpY2t5U3VwcG9ydGVkLFxuXHRpc0luRGlzcGxheU1vZGVcbn0gZnJvbSBcIi4vdGFibGUvU3RhbmRhcmRBY3Rpb25zXCI7XG5cbnR5cGUgVXBsb2FkVGFibGVTZXR0aW5ncyA9IHtcblx0c3RyZWFtOiBzdHJpbmc7XG5cdGZpbGVOYW1lPzogc3RyaW5nO1xuXHRmaWxlTmFtZU1heExlbmd0aD86IGludDtcblx0YWNjZXB0YWJsZU1lZGlhVHlwZXM/OiBzdHJpbmdbXTtcblx0bWF4TGVuZ3RoPzogaW50O1xuXHR1cGxvYWRBY3Rpb24/OiBTdGFuZGFyZEFjdGlvbjtcbn07XG5cbnR5cGUgUm93TmF2aWdhdGlvbkluZm8gPVxuXHR8IHtcblx0XHRcdHR5cGU6IFwiT3V0Ym91bmRcIjtcblx0XHRcdG5hdmlnYXRpb25UYXJnZXQ6IHN0cmluZztcblx0XHRcdG5hdmlnYXRpb25JbkVkaXRNb2RlPzogYm9vbGVhbjtcblx0ICB9XG5cdHwge1xuXHRcdFx0dHlwZTogXCJOYXZpZ2F0aW9uXCI7XG5cdFx0XHR0YXJnZXRQYXRoOiBzdHJpbmc7XG5cdFx0XHRjaGVja0VkaXRhYmxlOiBib29sZWFuO1xuXHRcdFx0cmVjcmVhdGVDb250ZXh0OiBib29sZWFuO1xuXHRcdFx0cm91dGVQYXRoOiBzdHJpbmc7XG5cdFx0XHRuYXZpZ2F0aW9uSW5FZGl0TW9kZT86IGJvb2xlYW47XG5cdCAgfTtcblxudHlwZSBSb3dDb25maWd1cmF0aW9uID0ge1xuXHRhY3Rpb24/OiBzdHJpbmc7XG5cdG5hdmlnYXRpb25JbmZvPzogUm93TmF2aWdhdGlvbkluZm87XG5cdHJvd0hpZ2hsaWdodGluZzogQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb247XG5cdHJvd05hdmlnYXRlZDogQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb247XG5cdHJvd0NyaXRpY2FsaXR5Rm9ySW5zaWdodHM/OiBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjtcblx0dmlzaWJsZT86IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uO1xufTtcblxuZXhwb3J0IHR5cGUgTWFzc0VkaXRUYWJsZUNvbmZpZ3VyYXRpb24gPSB7XG5cdGVuYWJsZWQ6IGJvb2xlYW47XG5cdHZpc2libGVGaWVsZHM6IHN0cmluZ1tdO1xuXHRpZ25vcmVkRmllbGRzOiBzdHJpbmdbXTtcblx0b3BlcmF0aW9uR3JvdXBpbmdNb2RlOiBPcGVyYXRpb25Hcm91cGluZ01vZGU7XG5cdGN1c3RvbUZyYWdtZW50Pzogc3RyaW5nO1xufTtcblxudHlwZSBUYWJsZVNvcnRDb25kaXRpb25zID0ge1xuXHRzb3J0ZXJzOiB7XG5cdFx0bmFtZTogc3RyaW5nO1xuXHRcdGRlc2NlbmRpbmc6IGJvb2xlYW47XG5cdH1bXTtcbn07XG5cbnR5cGUgVGFibGVHcm91cENvbmRpdGlvbnMgPSB7XG5cdGdyb3VwTGV2ZWxzOiB7IG5hbWU6IHN0cmluZyB9W107XG59O1xuXG50eXBlIFRhYmxlQWdncmVnYXRlQ29uZGl0aW9ucyA9IFJlY29yZDxzdHJpbmcsIG9iamVjdD47XG5cbnR5cGUgVGFibGVQMTNuTW9kZSA9IFwiQWdncmVnYXRlXCIgfCBcIkNvbHVtblwiIHwgXCJGaWx0ZXJcIiB8IFwiR3JvdXBcIiB8IFwiU29ydFwiO1xuXG5leHBvcnQgdHlwZSBBbmFseXRpY2FsQ29uZmlndXJhdGlvbiA9IHtcblx0YWdncmVnYXRpb25PbkxlYWZMZXZlbD86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgdHlwZSBUYWJsZUFubm90YXRpb25Db25maWd1cmF0aW9uID0ge1xuXHRjb2xsZWN0aW9uOiBzdHJpbmc7XG5cdHZhcmlhbnRNYW5hZ2VtZW50OiBWYXJpYW50TWFuYWdlbWVudFR5cGU7XG5cdGZpbHRlcklkPzogc3RyaW5nO1xuXHRpZDogc3RyaW5nO1xuXHRhcGlJZDogc3RyaW5nO1xuXHRuYXZpZ2F0aW9uUGF0aDogc3RyaW5nO1xuXHRwMTNuTW9kZT86IFRhYmxlUDEzbk1vZGVbXTtcblx0cm93PzogUm93Q29uZmlndXJhdGlvbjtcblx0c2VsZWN0aW9uTW9kZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXHRpc0luc2VydFVwZGF0ZUFjdGlvbnNUZW1wbGF0ZWQ6IGJvb2xlYW47XG5cdHVwZGF0YWJsZVByb3BlcnR5UGF0aDogc3RyaW5nO1xuXHRkaXNwbGF5TW9kZT86IGJvb2xlYW47XG5cdHRocmVzaG9sZDogbnVtYmVyO1xuXHRlbnRpdHlOYW1lOiBzdHJpbmc7XG5cdGVudGl0eVR5cGVOYW1lOiBzdHJpbmc7XG5cdHNvcnRDb25kaXRpb25zPzogVGFibGVTb3J0Q29uZGl0aW9ucztcblx0Z3JvdXBDb25kaXRpb25zPzogVGFibGVHcm91cENvbmRpdGlvbnM7XG5cdGFnZ3JlZ2F0ZUNvbmRpdGlvbnM/OiBUYWJsZUFnZ3JlZ2F0ZUNvbmRpdGlvbnM7XG5cdGluaXRpYWxFeHBhbnNpb25MZXZlbD86IG51bWJlcjtcblx0YWxsb3dEcm9wQmV0d2Vlbk5vZGVzPzogYm9vbGVhbjtcblx0Y2hhbmdlU2libGluZ0ZvclJvb3RzU3VwcG9ydGVkPzogYm9vbGVhbjtcblx0LyoqIENyZWF0ZSBuZXcgZW50cmllcyAqL1xuXHRjcmVhdGU6IENyZWF0ZUJlaGF2aW9yIHwgQ3JlYXRlQmVoYXZpb3JFeHRlcm5hbDtcblx0dGl0bGU6IHN0cmluZyB8IHVuZGVmaW5lZDtcblx0c2VhcmNoYWJsZTogYm9vbGVhbjtcblx0cmVxdWlyZWRQcm9wZXJ0aWVzPzogc3RyaW5nW107XG5cdHVwbG9hZFRhYmxlPzogVXBsb2FkVGFibGVTZXR0aW5ncztcbn07XG4vKipcbiAqIE5ldyBlbnRyaWVzIGFyZSBjcmVhdGVkIHdpdGhpbiB0aGUgYXBwIChkZWZhdWx0IGNhc2UpXG4gKi9cbmV4cG9ydCB0eXBlIENyZWF0ZUJlaGF2aW9yID0ge1xuXHRtb2RlOiBDcmVhdGlvbk1vZGU7XG5cdGFwcGVuZDogYm9vbGVhbjtcblx0bmV3QWN0aW9uPzogc3RyaW5nO1xuXHRuYXZpZ2F0ZVRvVGFyZ2V0Pzogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgRXh0ZXJuYWxNZXRob2RDb25maWcgPSB7XG5cdG1vZHVsZU5hbWU6IHN0cmluZztcblx0bWV0aG9kTmFtZTogc3RyaW5nO1xufTtcbi8qKlxuICogTmV3IGVudHJpZXMgYXJlIGNyZWF0ZWQgYnkgbmF2aWdhdGluZyB0byBzb21lIHRhcmdldFxuICovXG5leHBvcnQgdHlwZSBDcmVhdGVCZWhhdmlvckV4dGVybmFsID0ge1xuXHRtb2RlOiBcIkV4dGVybmFsXCI7XG5cdG91dGJvdW5kOiBzdHJpbmc7XG5cdG91dGJvdW5kRGV0YWlsOiBOYXZpZ2F0aW9uVGFyZ2V0Q29uZmlndXJhdGlvbltcIm91dGJvdW5kRGV0YWlsXCJdO1xuXHRuYXZpZ2F0aW9uU2V0dGluZ3M6IE5hdmlnYXRpb25TZXR0aW5nc0NvbmZpZ3VyYXRpb247XG59O1xuZXhwb3J0IHR5cGUgVGFibGVDYXBhYmlsaXR5UmVzdHJpY3Rpb24gPSB7XG5cdGlzRGVsZXRhYmxlOiBib29sZWFuO1xuXHRpc1VwZGF0YWJsZTogYm9vbGVhbjtcbn07XG5leHBvcnQgdHlwZSBUYWJsZUZpbHRlcnNDb25maWd1cmF0aW9uID0ge1xuXHRwYXRoczoge1xuXHRcdGFubm90YXRpb25QYXRoOiBzdHJpbmc7XG5cdH1bXTtcblx0c2hvd0NvdW50cz86IGJvb2xlYW47XG59O1xuZXhwb3J0IHR5cGUgU2VsZWN0aW9uVmFyaWFudENvbmZpZ3VyYXRpb24gPSB7XG5cdHByb3BlcnR5TmFtZXM6IHN0cmluZ1tdO1xuXHR0ZXh0Pzogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgVGFibGVDb250cm9sQ29uZmlndXJhdGlvbiA9IHtcblx0ZGlzYWJsZVJlcXVlc3RDYWNoZTogYm9vbGVhbjtcblx0Y3JlYXRlQXRFbmQ6IGJvb2xlYW47XG5cdGNyZWF0ZUluUGxhY2U/OiBib29sZWFuO1xuXHRjcmVhdGlvbk1vZGU6IENyZWF0aW9uTW9kZTtcblx0ZGlzYWJsZUFkZFJvd0J1dHRvbkZvckVtcHR5RGF0YTogYm9vbGVhbjtcblx0Y3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cdHVzZUNvbmRlbnNlZFRhYmxlTGF5b3V0OiBib29sZWFuO1xuXHRlbmFibGVFeHBvcnQ6IGJvb2xlYW47XG5cdGVuYWJsZVBhc3RpbmdPZkNvbXB1dGVkUHJvcGVydGllcz86IGJvb2xlYW47XG5cdGZyb3plbkNvbHVtbkNvdW50PzogbnVtYmVyO1xuXHR3aWR0aEluY2x1ZGluZ0NvbHVtbkhlYWRlcj86IGJvb2xlYW47XG5cdGhlYWRlcj86IHN0cmluZztcblx0aGVhZGVyVmlzaWJsZT86IGJvb2xlYW47XG5cdGZpbHRlcnM/OiBQYXJ0aWFsPFJlY29yZDxcInF1aWNrRmlsdGVyc1wiIHwgXCJoaWRkZW5GaWx0ZXJzXCIsIFRhYmxlRmlsdGVyc0NvbmZpZ3VyYXRpb24+Pjtcblx0dHlwZTogVGFibGVUeXBlO1xuXHRyb3dDb3VudE1vZGU/OiBUYWJsZVJvd0NvdW50TW9kZTtcblx0cm93Q291bnQ/OiBudW1iZXI7XG5cdHNjcm9sbFRocmVzaG9sZD86IG51bWJlcjtcblx0c2VsZWN0QWxsPzogYm9vbGVhbjtcblx0c2VsZWN0aW9uTGltaXQ6IG51bWJlcjtcblx0bXVsdGlTZWxlY3RNb2RlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cdGVuYWJsZVBhc3RlOiBib29sZWFuO1xuXHRkaXNhYmxlQ29weVRvQ2xpcGJvYXJkPzogYm9vbGVhbjtcblx0ZW5hYmxlRnVsbFNjcmVlbjogYm9vbGVhbjtcblx0c2hvd1Jvd0NvdW50OiBib29sZWFuO1xuXHRpbmxpbmVDcmVhdGlvblJvd0NvdW50PzogbnVtYmVyO1xuXHRpbmxpbmVDcmVhdGlvblJvd3NIaWRkZW5JbkVkaXRNb2RlPzogYm9vbGVhbjtcblx0bWFzc0VkaXQ6IE1hc3NFZGl0VGFibGVDb25maWd1cmF0aW9uO1xuXHRlbmFibGVBdXRvQ29sdW1uV2lkdGg6IGJvb2xlYW47XG5cdGhhc0RhdGFTdGF0ZUluZGljYXRvckZpbHRlcjogYm9vbGVhbjtcblx0aXNDb21wYWN0VHlwZT86IGJvb2xlYW47XG5cdGhpZXJhcmNoeVF1YWxpZmllcj86IHN0cmluZztcblx0aXNIaWVyYXJjaHlQYXJlbnROb2RlVXBkYXRhYmxlPzogYm9vbGVhbjtcblx0ZW5hYmxlQWRkQ2FyZFRvSW5zaWdodHM/OiBib29sZWFuIHwgdW5kZWZpbmVkO1xuXHRjcmVhdGlvbkRpYWxvZ0ZpZWxkcz86IHN0cmluZ1tdO1xuXHRub2RlVHlwZT86IHtcblx0XHRwcm9wZXJ0eU5hbWU6IHN0cmluZztcblx0XHR2YWx1ZXM6IHsgdmFsdWU6IHN0cmluZzsgdGV4dDogc3RyaW5nOyBjcmVhdGlvbkRpYWxvZ0ZpZWxkcz86IHN0cmluZ1tdIH1bXTtcblx0fTtcblx0Y3JlYXRlRW5hYmxlbWVudD86IEV4dGVybmFsTWV0aG9kQ29uZmlnO1xuXHRpc05vZGVNb3ZhYmxlPzogRXh0ZXJuYWxNZXRob2RDb25maWc7XG5cdGlzTW92ZVRvUG9zaXRpb25BbGxvd2VkPzogRXh0ZXJuYWxNZXRob2RDb25maWc7XG5cdHNlbGVjdGlvbkNoYW5nZT86IHN0cmluZztcblx0YWRkaXRpb25hbFJlcXVpcmVkTW9kdWxlcz86IHN0cmluZ1tdO1xuXHRiZWZvcmVSZWJpbmRUYWJsZT86IHN0cmluZztcblx0ZXhwb3J0UmVxdWVzdFNpemU/OiBudW1iZXI7XG5cdGVuYWJsZVVwbG9hZFBsdWdpbj86IGJvb2xlYW47XG5cdG1vZGVGb3JOb0RhdGFNZXNzYWdlPzogc3RyaW5nO1xuXHRhbmFseXRpY2FsQ29uZmlndXJhdGlvbj86IEFuYWx5dGljYWxDb25maWd1cmF0aW9uO1xufTtcbmV4cG9ydCB0eXBlIFRhYmxlVHlwZSA9IFwiR3JpZFRhYmxlXCIgfCBcIlJlc3BvbnNpdmVUYWJsZVwiIHwgXCJBbmFseXRpY2FsVGFibGVcIiB8IFwiVHJlZVRhYmxlXCI7XG5leHBvcnQgdHlwZSBUYWJsZVJvd0NvdW50TW9kZSA9IFwiQXV0b1wiIHwgXCJGaXhlZFwiIHwgXCJJbnRlcmFjdGl2ZVwiO1xuXG5lbnVtIENvbHVtblR5cGUge1xuXHREZWZhdWx0ID0gXCJEZWZhdWx0XCIsIC8vIERlZmF1bHQgVHlwZSAoQ3VzdG9tIENvbHVtbilcblx0QW5ub3RhdGlvbiA9IFwiQW5ub3RhdGlvblwiLFxuXHRTbG90ID0gXCJTbG90XCIsXG5cdENvbXB1dGVkID0gXCJDb21wdXRlZFwiXG59XG4vLyBDdXN0b20gQ29sdW1uIGZyb20gTWFuaWZlc3RcbmV4cG9ydCB0eXBlIE1hbmlmZXN0RGVmaW5lZEN1c3RvbUNvbHVtbiA9IEN1c3RvbURlZmluZWRUYWJsZUNvbHVtbiAmIHtcblx0dHlwZT86IENvbHVtblR5cGUuRGVmYXVsdDtcbn07XG4vLyBTbG90IENvbHVtbiBmcm9tIEJ1aWxkaW5nIEJsb2NrXG5leHBvcnQgdHlwZSBGcmFnbWVudERlZmluZWRTbG90Q29sdW1uID0gQ3VzdG9tRGVmaW5lZFRhYmxlQ29sdW1uICYge1xuXHR0eXBlOiBDb2x1bW5UeXBlLlNsb3Q7XG59O1xuLy8gUHJvcGVydGllcyBhbGwgQ29sdW1uVHlwZXMgaGF2ZTpcbmV4cG9ydCB0eXBlIEJhc2VUYWJsZUNvbHVtbiA9IENvbmZpZ3VyYWJsZU9iamVjdCAmIHtcblx0dHlwZTogQ29sdW1uVHlwZTsgLy9PcmlnaW4gb2YgdGhlIHNvdXJjZSB3aGVyZSB3ZSBhcmUgZ2V0dGluZyB0aGUgdGVtcGxhdGVkIGluZm9ybWF0aW9uIGZyb21cblx0d2lkdGg/OiBzdHJpbmc7XG5cdHdpZHRoSW5jbHVkaW5nQ29sdW1uSGVhZGVyPzogYm9vbGVhbjtcblx0aW1wb3J0YW5jZT86IEltcG9ydGFuY2U7XG5cdGhvcml6b250YWxBbGlnbj86IEhvcml6b250YWxBbGlnbjtcblx0YXZhaWxhYmlsaXR5PzogQXZhaWxhYmlsaXR5VHlwZTtcblx0aXNOYXZpZ2FibGU/OiBib29sZWFuO1xuXHRjYXNlU2Vuc2l0aXZlOiBib29sZWFuO1xuXHRsYWJlbD86IHN0cmluZztcblx0dG9vbHRpcD86IHN0cmluZztcbn07XG4vLyBQcm9wZXJ0aWVzIG9uIEN1c3RvbSBDb2x1bW5zIGFuZCBTbG90IENvbHVtbnNcbmV4cG9ydCB0eXBlIEN1c3RvbUJhc2VkVGFibGVDb2x1bW4gPSBCYXNlVGFibGVDb2x1bW4gJiB7XG5cdGlkOiBzdHJpbmc7XG5cdG5hbWU6IHN0cmluZztcblx0aGVhZGVyPzogc3RyaW5nO1xuXHR0ZW1wbGF0ZTogc3RyaW5nO1xuXHRwcm9wZXJ0eUluZm9zPzogc3RyaW5nW107XG5cdGV4cG9ydFNldHRpbmdzPzogQ29sdW1uRXhwb3J0U2V0dGluZ3MgfCBudWxsO1xuXHRmb3JtYXRPcHRpb25zOiBGb3JtYXRPcHRpb25zVHlwZTtcblx0aXNHcm91cGFibGU6IGJvb2xlYW47XG5cdGlzTmF2aWdhYmxlOiBib29sZWFuO1xuXHRzb3J0YWJsZTogYm9vbGVhbjtcblx0dmlzdWFsU2V0dGluZ3M6IHsgd2lkdGhDYWxjdWxhdGlvbjogbnVsbCB9O1xuXHRwcm9wZXJ0aWVzPzogc3RyaW5nW107XG5cdHJlcXVpcmVkPzogQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb247XG59O1xuXG5leHBvcnQgdHlwZSBDb21wdXRlZFRhYmxlQ29sdW1uID0gQmFzZVRhYmxlQ29sdW1uICYge1xuXHRuYW1lOiBzdHJpbmc7XG5cdGxhYmVsOiBzdHJpbmc7XG5cdHByb3BlcnR5S2V5OiBzdHJpbmc7XG5cdGlzRHJhZnRJbmRpY2F0b3I/OiBib29sZWFuO1xuXHRpc1NpdHVhdGlvbnNJbmRpY2F0b3I/OiBib29sZWFuO1xuXHRmb3JtYXRPcHRpb25zPzogRm9ybWF0T3B0aW9uc1R5cGUgfCBudWxsO1xuXHRwcm9wZXJ0eUluZm9zPzogc3RyaW5nW107XG5cdGV4cG9ydFNldHRpbmdzPzogQ29sdW1uRXhwb3J0U2V0dGluZ3MgfCBudWxsO1xuXHRjbGlwYm9hcmRTZXR0aW5ncz86IE9iamVjdCB8IG51bGw7XG5cdHJlcXVpcmVkPzogQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb247XG59O1xuXG4vLyBQcm9wZXJ0aWVzIGRlcml2ZWQgZnJvbSBNYW5pZmVzdCB0byBvdmVycmlkZSBBbm5vdGF0aW9uIGNvbmZpZ3VyYXRpb25zXG5leHBvcnQgdHlwZSBBbm5vdGF0aW9uVGFibGVDb2x1bW5Gb3JPdmVycmlkZSA9IEJhc2VUYWJsZUNvbHVtbiAmIHtcblx0c2V0dGluZ3M/OiBUYWJsZUNvbHVtblNldHRpbmdzO1xuXHRmb3JtYXRPcHRpb25zPzogRm9ybWF0T3B0aW9uc1R5cGU7XG5cdGV4cG9ydFNldHRpbmdzPzogQ29sdW1uRXhwb3J0U2V0dGluZ3MgfCBudWxsO1xufTtcbmV4cG9ydCB0eXBlIFByb3BlcnR5VHlwZUNvbnN0cmFpbnRzID0gUGFydGlhbDx7XG5cdHNjYWxlOiBudW1iZXI7XG5cdHByZWNpc2lvbjogbnVtYmVyO1xuXHRtYXhMZW5ndGg6IG51bWJlcjtcblx0bnVsbGFibGU6IGJvb2xlYW47XG5cdG1pbmltdW06IHN0cmluZztcblx0bWF4aW11bTogc3RyaW5nO1xuXHRpc0RpZ2l0U2VxdWVuY2U6IGJvb2xlYW47XG59PjtcbmV4cG9ydCB0eXBlIFByb3BlcnR5VHlwZUZvcm1hdE9wdGlvbnMgPSBQYXJ0aWFsPHtcblx0cGFyc2VBc1N0cmluZzogYm9vbGVhbjtcblx0ZW1wdHlTdHJpbmc6IHN0cmluZztcblx0cGFyc2VLZWVwc0VtcHR5U3RyaW5nOiBib29sZWFuO1xufT47XG5leHBvcnQgdHlwZSBQcm9wZXJ0eVR5cGVDb25maWcgPSB7XG5cdHR5cGU/OiBzdHJpbmc7XG5cdGNvbnN0cmFpbnRzOiBQcm9wZXJ0eVR5cGVDb25zdHJhaW50cztcblx0Zm9ybWF0T3B0aW9uczogUHJvcGVydHlUeXBlRm9ybWF0T3B0aW9ucztcblx0dHlwZUluc3RhbmNlPzogdW5rbm93bjtcblx0YmFzZVR5cGU/OiBzdHJpbmc7XG5cdGNsYXNzTmFtZT86IGtleW9mIHR5cGVvZiBEZWZhdWx0VHlwZUZvckVkbVR5cGU7XG59O1xuZXhwb3J0IHR5cGUgQ29sdW1uRXhwb3J0U2V0dGluZ3MgPSBQYXJ0aWFsPHtcblx0dGVtcGxhdGU6IHN0cmluZztcblx0bGFiZWw6IHN0cmluZztcblx0d3JhcDogYm9vbGVhbjtcblx0dHlwZTogc3RyaW5nO1xuXHRpbnB1dEZvcm1hdDogc3RyaW5nO1xuXHRmb3JtYXQ6IHN0cmluZztcblx0c2NhbGU6IG51bWJlcjtcblx0ZGVsaW1pdGVyOiBib29sZWFuO1xuXHR1bml0OiBzdHJpbmc7XG5cdHVuaXRQcm9wZXJ0eTogc3RyaW5nO1xuXHR0aW1lem9uZTogc3RyaW5nO1xuXHR0aW1lem9uZVByb3BlcnR5OiBzdHJpbmc7XG5cdHV0YzogYm9vbGVhbjtcblx0ZGF0YVBvaW50VGFyZ2V0VmFsdWU6IHN0cmluZztcblx0aXNDdXJyZW5jeTogYm9vbGVhbjtcblx0cHJvcGVydHk6IHN0cmluZ1tdO1xuXHR3aWR0aDogbnVtYmVyO1xuXHRhdXRvU2NhbGU6IGJvb2xlYW47XG59Pjtcbi8vIFByb3BlcnRpZXMgZm9yIEFubm90YXRpb24gQ29sdW1uc1xuZXhwb3J0IHR5cGUgQW5ub3RhdGlvblRhYmxlQ29sdW1uID0gQW5ub3RhdGlvblRhYmxlQ29sdW1uRm9yT3ZlcnJpZGUgJiB7XG5cdG5hbWU6IHN0cmluZztcblx0cHJvcGVydHlJbmZvcz86IHN0cmluZ1tdO1xuXHRhbm5vdGF0aW9uUGF0aDogc3RyaW5nO1xuXHRyZWxhdGl2ZVBhdGg6IHN0cmluZztcblx0bGFiZWw/OiBzdHJpbmc7XG5cdHRvb2x0aXA/OiBzdHJpbmc7XG5cdGdyb3VwTGFiZWw/OiBzdHJpbmc7XG5cdGdyb3VwPzogc3RyaW5nO1xuXHRGaWVsZEdyb3VwSGlkZGVuRXhwcmVzc2lvbnM/OiBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjtcblx0c2hvd0RhdGFGaWVsZHNMYWJlbD86IGJvb2xlYW47XG5cdHJlcXVpcmVkPzogQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb247XG5cdGlzS2V5PzogYm9vbGVhbjtcblx0aXNHcm91cGFibGU/OiBib29sZWFuO1xuXHR1bml0Pzogc3RyaW5nO1xuXHR1bml0VGV4dD86IHN0cmluZztcblx0dGltZXpvbmVUZXh0Pzogc3RyaW5nO1xuXHR0aW1lem9uZT86IHN0cmluZztcblx0c2VtYW50aWNPYmplY3RQYXRoPzogc3RyaW5nO1xuXHRzb3J0YWJsZTogYm9vbGVhbjtcblx0ZmlsdGVyYWJsZT86IGJvb2xlYW47XG5cdGV4cG9ydFNldHRpbmdzPzogQ29sdW1uRXhwb3J0U2V0dGluZ3MgfCBudWxsO1xuXHR0ZXh0QXJyYW5nZW1lbnQ/OiB7XG5cdFx0dGV4dFByb3BlcnR5OiBzdHJpbmc7XG5cdFx0bW9kZTogRGlzcGxheU1vZGU7XG5cdH07XG5cdGFkZGl0aW9uYWxQcm9wZXJ0eUluZm9zPzogc3RyaW5nW107XG5cdHZpc3VhbFNldHRpbmdzPzogVmlzdWFsU2V0dGluZ3M7XG5cdHR5cGVDb25maWc/OiBQcm9wZXJ0eVR5cGVDb25maWc7XG5cdGlzUGFydE9mTGluZUl0ZW0/OiBib29sZWFuOyAvLyB0ZW1wb3JhcnkgaW5kaWNhdG9yIHRvIG9ubHkgYWxsb3cgZmlsdGVyaW5nIG9uIG5hdmlnYXRpb24gcHJvcGVydGllcyB3aGVuIHRoZXkncmUgcGFydCBvZiBhIGxpbmUgaXRlbVxuXHRpc1BhcnRPZkN1c3RvbUNvbHVtbj86IGJvb2xlYW47XG5cdGFkZGl0aW9uYWxMYWJlbHM/OiBzdHJpbmdbXTtcblx0ZXhwb3J0RGF0YVBvaW50VGFyZ2V0VmFsdWU/OiBzdHJpbmc7XG5cdGFnZ3JlZ2F0YWJsZT86IGJvb2xlYW47XG5cdGV4dGVuc2lvbj86IEV4dGVuc2lvbkZvckFuYWx5dGljcztcblx0aXNNdWx0aVZhbHVlPzogYm9vbGVhbjtcbn07XG5leHBvcnQgdHlwZSBFeHRlbnNpb25Gb3JBbmFseXRpY3MgPSB7XG5cdGFkZGl0aW9uYWxQcm9wZXJ0aWVzPzogc3RyaW5nW107XG59O1xuZXhwb3J0IHR5cGUgVGVjaG5pY2FsQ29sdW1uID0gQW5ub3RhdGlvblRhYmxlQ29sdW1uICYge1xuXHRleHRlbnNpb24/OiB7XG5cdFx0dGVjaG5pY2FsbHlHcm91cGFibGU6IGJvb2xlYW47XG5cdFx0dGVjaG5pY2FsbHlBZ2dyZWdhdGFibGU6IGJvb2xlYW47XG5cdH07XG59O1xuZXhwb3J0IHR5cGUgVmlzdWFsU2V0dGluZ3MgPSB7XG5cdHdpZHRoQ2FsY3VsYXRpb24/OiBXaWR0aENhbGN1bGF0aW9uO1xufTtcbmV4cG9ydCB0eXBlIFdpZHRoQ2FsY3VsYXRpb24gPSBudWxsIHwge1xuXHRtaW5XaWR0aD86IG51bWJlcjtcblx0bWF4V2lkdGg/OiBudW1iZXI7XG5cdGRlZmF1bHRXaWR0aD86IG51bWJlcjtcblx0dHJ1bmNhdGVMYWJlbD86IGJvb2xlYW47XG5cdGdhcD86IG51bWJlcjtcblx0Ly8gb25seSByZWxldmFudCBmb3IgY29tcGxleCB0eXBlc1xuXHRleGNsdWRlUHJvcGVydGllcz86IHN0cmluZ1tdO1xuXHR2ZXJ0aWNhbEFycmFuZ2VtZW50PzogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCB0eXBlIFRhYmxlQ29sdW1uID0gQ3VzdG9tQmFzZWRUYWJsZUNvbHVtbiB8IEFubm90YXRpb25UYWJsZUNvbHVtbiB8IENvbXB1dGVkVGFibGVDb2x1bW4gfCBUZWNobmljYWxDb2x1bW47XG5leHBvcnQgdHlwZSBNYW5pZmVzdENvbHVtbiA9IEN1c3RvbUVsZW1lbnQ8Q3VzdG9tQmFzZWRUYWJsZUNvbHVtbiB8IEFubm90YXRpb25UYWJsZUNvbHVtbkZvck92ZXJyaWRlPjtcbmV4cG9ydCB0eXBlIEludGVybmFsRXh0ZW5zaW9uRm9yQW5hbHl0aWNzID0gRXh0ZW5zaW9uRm9yQW5hbHl0aWNzICYge1xuXHRmcm9tR3JvdXBhYmxlUHJvcGVydHk6IGJvb2xlYW47XG5cdHJlbGF0aXZlUGF0aDogc3RyaW5nO1xufTtcbmV4cG9ydCB0eXBlIFRhYmxlVmlzdWFsaXphdGlvbiA9IHtcblx0dHlwZTogVmlzdWFsaXphdGlvblR5cGUuVGFibGU7XG5cdGFubm90YXRpb246IFRhYmxlQW5ub3RhdGlvbkNvbmZpZ3VyYXRpb247XG5cdGNvbnRyb2w6IFRhYmxlQ29udHJvbENvbmZpZ3VyYXRpb247XG5cdGNvbHVtbnM6IFRhYmxlQ29sdW1uW107XG5cdGFjdGlvbnM6IEJhc2VBY3Rpb25bXTtcblx0Y29tbWFuZEFjdGlvbnM/OiBSZWNvcmQ8c3RyaW5nLCBDdXN0b21BY3Rpb24+O1xuXHRhbmFseXRpY3NFeHRlbnNpb25zPzogUmVjb3JkPHN0cmluZywgSW50ZXJuYWxFeHRlbnNpb25Gb3JBbmFseXRpY3M+O1xuXHRyZXF1ZXN0QXRMZWFzdD86IHN0cmluZ1tdO1xuXHRlbmFibGVBbmFseXRpY3M/OiBib29sZWFuO1xuXHRlbmFibGVCYXNpY1NlYXJjaD86IGJvb2xlYW47XG5cdG9wZXJhdGlvbkF2YWlsYWJsZU1hcDogc3RyaW5nO1xuXHRvcGVyYXRpb25BdmFpbGFibGVQcm9wZXJ0aWVzOiBzdHJpbmc7XG5cdGhlYWRlckluZm9UaXRsZTogc3RyaW5nO1xuXHRzZW1hbnRpY0tleXM6IHN0cmluZ1tdO1xuXHRoZWFkZXJJbmZvVHlwZU5hbWU6IFByb3BlcnR5QW5ub3RhdGlvblZhbHVlPFN0cmluZz4gfCB1bmRlZmluZWQ7XG5cdGVuYWJsZSRzZWxlY3Q6IGJvb2xlYW47XG5cdGVuYWJsZSQkZ2V0S2VlcEFsaXZlQ29udGV4dDogYm9vbGVhbjtcblx0aXNJbnNpZ2h0c0VuYWJsZWQ/OiBib29sZWFuO1xuXHRoZWFkZXI/OiBzdHJpbmc7XG5cdGhlYWRlclZpc2libGU/OiBib29sZWFuO1xuXHRoYW5kbGVQYXRjaFNlbnQ6IGJvb2xlYW47XG59O1xuXG4vKipcbiAqIFJldHVybnMgYW4gYXJyYXkgb2YgYWxsIHN0YW5kYXJkLCBhbm5vdGF0aW9uLWJhc2VkLCBhbmQgbWFuaWZlc3QtYmFzZWQgdGFibGUgYWN0aW9ucy5cbiAqIEBwYXJhbSBsaW5lSXRlbUFubm90YXRpb25cbiAqIEBwYXJhbSB2aXN1YWxpemF0aW9uUGF0aFxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHRcbiAqIEBwYXJhbSBzdGFuZGFyZEFjdGlvbnNcbiAqIEBwYXJhbSBuYXZpZ2F0aW9uU2V0dGluZ3NcbiAqIEByZXR1cm5zIFRoZSBjb21wbGV0ZSB0YWJsZSBhY3Rpb25zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRUYWJsZUFjdGlvbnMoXG5cdGxpbmVJdGVtQW5ub3RhdGlvbjogTGluZUl0ZW0sXG5cdHZpc3VhbGl6YXRpb25QYXRoOiBzdHJpbmcsXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pixcblx0c3RhbmRhcmRBY3Rpb25zOiBTdGFuZGFyZEFjdGlvbnNDb25maWd1cmF0aW9uW1wic3RhbmRhcmRBY3Rpb25zXCJdLFxuXHRuYXZpZ2F0aW9uU2V0dGluZ3M/OiBOYXZpZ2F0aW9uU2V0dGluZ3NDb25maWd1cmF0aW9uXG4pOiBDb21iaW5lZEFjdGlvbiB7XG5cdC8vIDEuIEdldCBhY3Rpb25zIGZyb20gYW5ub3RhdGlvbnNcblx0Y29uc3QgdGFibGVBY3Rpb25zID0gZ2V0VGFibGVBbm5vdGF0aW9uQWN0aW9ucyhsaW5lSXRlbUFubm90YXRpb24sIHZpc3VhbGl6YXRpb25QYXRoLCBjb252ZXJ0ZXJDb250ZXh0KTtcblx0Ly8gMi4gR2V0IGFjdGlvbnMgZnJvbSBtYW5pZmVzdFxuXHRjb25zdCBtYW5pZmVzdEFjdGlvbnMgPSBnZXRBY3Rpb25zRnJvbU1hbmlmZXN0KFxuXHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RDb250cm9sQ29uZmlndXJhdGlvbjxUYWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbj4odmlzdWFsaXphdGlvblBhdGgpLmFjdGlvbnMgYXMgUmVjb3JkPFxuXHRcdFx0c3RyaW5nLFxuXHRcdFx0TWFuaWZlc3RBY3Rpb25cblx0XHQ+LFxuXHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0dGFibGVBY3Rpb25zLnRhYmxlQWN0aW9ucyxcblx0XHRuYXZpZ2F0aW9uU2V0dGluZ3MsXG5cdFx0dHJ1ZVxuXHQpO1xuXHQvLyBUaGUgXCJDb3B5XCIgYWN0aW9uIGFsd2F5cyBuZWVkcyB0byBiZSBwbGFjZWQgYWZ0ZXIgdGhlIFwiQ3JlYXRlXCIgYWN0aW9uLCBzbyB3ZSBuZWVkIHRvIHNlcGFyYXRlIGl0XG5cdGNvbnN0IGNvcHlBY3Rpb25zID0gdGFibGVBY3Rpb25zLnRhYmxlQWN0aW9ucy5maWx0ZXIoKGEpID0+IGEudHlwZSA9PT0gQWN0aW9uVHlwZS5Db3B5KTtcblx0Y29uc3QgYW5ub3RhdGlvbkFjdGlvbnMgPSB0YWJsZUFjdGlvbnMudGFibGVBY3Rpb25zLmZpbHRlcigoYSkgPT4gYS50eXBlICE9PSBBY3Rpb25UeXBlLkNvcHkpO1xuXHQvLyBDb21iaW5lIHN0YW5kYXJkLCBhbm5vdGF0aW9uLCBhbmQgY3VzdG9tIGFjdGlvbnMgdG9nZXRoZXIsIHJlc3BlY3RpbmcgdGhlIGZpeGVkIG9yZGVyIG9mIHN0YW5kYXJkIGFjdGlvbnNcblx0Y29uc3QgYW5ub3RhdGlvbkFuZFN0YW5kYXJkQWN0aW9ucyA9IChcblx0XHRbXG5cdFx0XHQuLi5hbm5vdGF0aW9uQWN0aW9ucyxcblx0XHRcdHN0YW5kYXJkQWN0aW9ucy5jcmVhdGUsXG5cdFx0XHQuLi5jb3B5QWN0aW9ucyxcblx0XHRcdHN0YW5kYXJkQWN0aW9ucy5kZWxldGUsXG5cdFx0XHRzdGFuZGFyZEFjdGlvbnMubWFzc0VkaXQsXG5cdFx0XHRzdGFuZGFyZEFjdGlvbnMuaW5zaWdodHMsXG5cdFx0XHRzdGFuZGFyZEFjdGlvbnMuY3JlYXRpb25Sb3csIC8vIE5vdCB0ZW1wbGF0ZWQgYXMgYSBidXR0b25cblx0XHRcdHN0YW5kYXJkQWN0aW9ucy5jdXQsXG5cdFx0XHRzdGFuZGFyZEFjdGlvbnMucGFzdGUsXG5cdFx0XHRzdGFuZGFyZEFjdGlvbnMubW92ZVVwLFxuXHRcdFx0c3RhbmRhcmRBY3Rpb25zLm1vdmVEb3duXG5cdFx0XSBhcyBCYXNlQWN0aW9uW11cblx0KS5maWx0ZXIoKGFjdGlvbikgPT4gYWN0aW9uICE9PSB1bmRlZmluZWQpO1xuXHQvLyBBbmNob3IgYWxsIG5vbi1hbmNob3JlZCBtYW5pZmVzdCBjdXN0b20gYWN0aW9ucy9tZW51cyBiZWZvcmUgdGhlIHN0YW5kYXJkIGFjdGlvbnNcblx0Zm9yIChjb25zdCBtYW5pZmVzdEFjdGlvbiBvZiBPYmplY3QudmFsdWVzKG1hbmlmZXN0QWN0aW9ucy5hY3Rpb25zKSkge1xuXHRcdGlmICgobWFuaWZlc3RBY3Rpb24udHlwZSA9PT0gQWN0aW9uVHlwZS5EZWZhdWx0IHx8IG1hbmlmZXN0QWN0aW9uLnR5cGUgPT09IEFjdGlvblR5cGUuTWVudSkgJiYgIW1hbmlmZXN0QWN0aW9uLnBvc2l0aW9uPy5hbmNob3IpIHtcblx0XHRcdG1hbmlmZXN0QWN0aW9uLnBvc2l0aW9uID0ge1xuXHRcdFx0XHRhbmNob3I6IFN0YW5kYXJkQWN0aW9uS2V5cy5DcmVhdGUsXG5cdFx0XHRcdHBsYWNlbWVudDogUGxhY2VtZW50LkJlZm9yZVxuXHRcdFx0fTtcblx0XHR9XG5cdH1cblx0Ly8gSW5zZXJ0IHR3aWNlIHRvIGFsbG93IHJlZ3VsYXIgb3ZlcnJpZGUgZm9yIG5vbi1zdGFuZGFyZCBhY3Rpb25zIGFuZCBwb3NpdGlvbmFsIG92ZXJyaWRlIGZvciBzdGFuZGFyZCBhY3Rpb25zXG5cdGNvbnN0IG1hbmlmZXN0QWN0aW9uRW50cmllcyA9IE9iamVjdC5lbnRyaWVzKG1hbmlmZXN0QWN0aW9ucy5hY3Rpb25zKTtcblx0Y29uc3Qgc3RhbmRhcmRNYW5pZmVzdEFjdGlvbnMgPSBPYmplY3QuZnJvbUVudHJpZXMobWFuaWZlc3RBY3Rpb25FbnRyaWVzLmZpbHRlcigoW2tleV0pID0+IGtleS5zdGFydHNXaXRoKFwiU3RhbmRhcmRBY3Rpb246OlwiKSkpO1xuXHRjb25zdCBub25TdGFuZGFyZE1hbmlmZXN0QWN0aW9ucyA9IE9iamVjdC5mcm9tRW50cmllcyhtYW5pZmVzdEFjdGlvbkVudHJpZXMuZmlsdGVyKChba2V5XSkgPT4gIXN0YW5kYXJkTWFuaWZlc3RBY3Rpb25zW2tleV0pKTtcblx0Y29uc3QgYWN0aW9uT3ZlcndyaXRlQ29uZmlnOiBPdmVycmlkZVR5cGVBY3Rpb24gPSB7XG5cdFx0aXNOYXZpZ2FibGU6IE92ZXJyaWRlVHlwZS5vdmVyd3JpdGUsXG5cdFx0ZW5hYmxlT25TZWxlY3Q6IE92ZXJyaWRlVHlwZS5vdmVyd3JpdGUsXG5cdFx0ZW5hYmxlQXV0b1Njcm9sbDogT3ZlcnJpZGVUeXBlLm92ZXJ3cml0ZSxcblx0XHRlbmFibGVkOiBPdmVycmlkZVR5cGUub3ZlcndyaXRlLFxuXHRcdHZpc2libGU6IE92ZXJyaWRlVHlwZS5vdmVyd3JpdGUsXG5cdFx0dmlzaWJsZUZvckNvbnRleHRNZW51OiBPdmVycmlkZVR5cGUub3ZlcndyaXRlLFxuXHRcdGRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbjogT3ZlcnJpZGVUeXBlLm92ZXJ3cml0ZSxcblx0XHRjb21tYW5kOiBPdmVycmlkZVR5cGUub3ZlcndyaXRlLFxuXHRcdHBvc2l0aW9uOiBPdmVycmlkZVR5cGUub3ZlcndyaXRlLFxuXHRcdG1lbnU6IE92ZXJyaWRlVHlwZS5vdmVyd3JpdGVcblx0fTtcblx0Ly8gMy4gR2V0IGFsbCBhbm5vdGF0aW9uIG1lbnUgaXRlbXNcblx0Y29uc3QgYW5ub3RhdGlvbk1lbnVBY3Rpb25JdGVtcyA9IGdldEFubm90YXRpb25NZW51QWN0aW9uSXRlbXMoYW5ub3RhdGlvbkFjdGlvbnMpO1xuXHQvLyA0LiBGaW5kIG1hbmlmZXN0IGFjdGlvbnMgd2hpY2ggb3ZlcnJpZGUgYW55IGFubm90YXRpb24gbWVudSBpdGVtc1xuXHRjb25zdCBtYXRjaGluZ01hbmlmZXN0QWN0aW9ucyA9IGdldE1hdGNoaW5nTWFuaWZlc3RBY3Rpb24oYW5ub3RhdGlvbk1lbnVBY3Rpb25JdGVtcywgbWFuaWZlc3RBY3Rpb25zLmFjdGlvbnMpO1xuXHQvLyA1LiBHZXQgb3ZlcnJpZGRlbiBhbm5vdGF0aW9uIG1lbnUgaXRlbXNcblx0Y29uc3Qgb3ZlcndyaXR0ZW5NZW51QWN0aW9uSXRlbXMgPSBpbnNlcnRDdXN0b21FbGVtZW50cyhhbm5vdGF0aW9uTWVudUFjdGlvbkl0ZW1zLCBtYXRjaGluZ01hbmlmZXN0QWN0aW9ucywgYWN0aW9uT3ZlcndyaXRlQ29uZmlnKTtcblx0Ly8gNi4gT3ZlcnJpZGUgYWxsIGFjdGlvbnNcblx0bGV0IGFjdGlvbnMgPSBpbnNlcnRDdXN0b21FbGVtZW50cyhhbm5vdGF0aW9uQW5kU3RhbmRhcmRBY3Rpb25zLCBub25TdGFuZGFyZE1hbmlmZXN0QWN0aW9ucywgYWN0aW9uT3ZlcndyaXRlQ29uZmlnKSBhcyBDdXN0b21BY3Rpb25bXTtcblx0YWN0aW9ucyA9IGluc2VydEN1c3RvbUVsZW1lbnRzKGFjdGlvbnMsIHN0YW5kYXJkTWFuaWZlc3RBY3Rpb25zLCB7XG5cdFx0cG9zaXRpb246IE92ZXJyaWRlVHlwZS5vdmVyd3JpdGVcblx0fSk7XG5cdC8vIDcuIFJlcGxhY2Ugb3JpZ2luYWwgbWVudSBpdGVtcyB3aXRoIHRoZWlyIGNvcnJlc3BvbmRpbmcgb3ZlcnJpZGRlbiBtZW51IGl0ZW1zXG5cdHByZXBhcmVNZW51QWN0aW9ucyhhY3Rpb25zLCBvdmVyd3JpdHRlbk1lbnVBY3Rpb25JdGVtcyk7XG5cdC8vIDguIFJlbW92ZSBkdXBsaWNhdGUgYWN0aW9ucyB3aGljaCBhcmUgbWVudSBpdGVtc1xuXHRhY3Rpb25zID0gcmVtb3ZlRHVwbGljYXRlQWN0aW9ucyhhY3Rpb25zKTtcblx0Ly8gOS4gSGlkZSBtZW51cyB3aGVyZSBhbGwgbWVudSBpdGVtcyBhcmUgaGlkZGVuXG5cdGFjdGlvbnMgPSBnZXRWaXNpYmlsaXR5RW5hYmxlbWVudE1lbnVBY3Rpb25zKGFjdGlvbnMpO1xuXHRyZXR1cm4ge1xuXHRcdGFjdGlvbnM6IGFjdGlvbnMsXG5cdFx0Y29tbWFuZEFjdGlvbnM6IG1hbmlmZXN0QWN0aW9ucy5jb21tYW5kQWN0aW9uc1xuXHR9O1xufVxuLyoqXG4gKiBSZXR1cm5zIGFuIGFycmF5IG9mIGFsbCBjb2x1bW5zLCBhbm5vdGF0aW9uLWJhc2VkIGFzIHdlbGwgYXMgbWFuaWZlc3QtYmFzZWQuXG4gKiBUaGV5IGFyZSBzb3J0ZWQgYW5kIHNvbWUgcHJvcGVydGllcyBjYW4gYmUgb3ZlcndyaXR0ZW4gdmlhIHRoZSBtYW5pZmVzdCAoY2hlY2sgb3V0IHRoZSBrZXlzIHRoYXQgY2FuIGJlIG92ZXJ3cml0dGVuKS5cbiAqIEBwYXJhbSBsaW5lSXRlbUFubm90YXRpb24gQ29sbGVjdGlvbiBvZiBkYXRhIGZpZWxkcyBmb3IgcmVwcmVzZW50YXRpb24gaW4gYSB0YWJsZSBvciBsaXN0XG4gKiBAcGFyYW0gdmlzdWFsaXphdGlvblBhdGhcbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcmV0dXJucyBSZXR1cm5zIGFsbCB0YWJsZSBjb2x1bW5zIHRoYXQgc2hvdWxkIGJlIGF2YWlsYWJsZSwgcmVnYXJkbGVzcyBvZiB0ZW1wbGF0aW5nIG9yIHBlcnNvbmFsaXphdGlvbiBvciB0aGVpciBvcmlnaW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFRhYmxlQ29sdW1ucyhcblx0bGluZUl0ZW1Bbm5vdGF0aW9uOiBMaW5lSXRlbSxcblx0dmlzdWFsaXphdGlvblBhdGg6IHN0cmluZyxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+XG4pOiBUYWJsZUNvbHVtbltdIHtcblx0Y29uc3QgYW5ub3RhdGlvbkNvbHVtbnMgPSBnZXRDb2x1bW5zRnJvbUFubm90YXRpb25zKGxpbmVJdGVtQW5ub3RhdGlvbiwgdmlzdWFsaXphdGlvblBhdGgsIGNvbnZlcnRlckNvbnRleHQpO1xuXHRjb25zdCBtYW5pZmVzdENvbHVtbnMgPSBnZXRDb2x1bW5zRnJvbU1hbmlmZXN0KFxuXHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RDb250cm9sQ29uZmlndXJhdGlvbjxUYWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbj4odmlzdWFsaXphdGlvblBhdGgpLmNvbHVtbnMgPz8ge30sXG5cdFx0YW5ub3RhdGlvbkNvbHVtbnMsXG5cdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldEFubm90YXRpb25FbnRpdHlUeXBlKGxpbmVJdGVtQW5ub3RhdGlvbilcblx0KTtcblxuXHRjb25zdCB0YWJsZUNvbHVtbnM6IFRhYmxlQ29sdW1uW10gPSBpbnNlcnRDdXN0b21FbGVtZW50cyhcblx0XHRhbm5vdGF0aW9uQ29sdW1ucyBhcyBUYWJsZUNvbHVtbltdLFxuXHRcdG1hbmlmZXN0Q29sdW1ucyBhcyBSZWNvcmQ8c3RyaW5nLCBDdXN0b21FbGVtZW50PFRhYmxlQ29sdW1uPj4sXG5cdFx0e1xuXHRcdFx0d2lkdGg6IE92ZXJyaWRlVHlwZS5vdmVyd3JpdGUsXG5cdFx0XHR3aWR0aEluY2x1ZGluZ0NvbHVtbkhlYWRlcjogT3ZlcnJpZGVUeXBlLm92ZXJ3cml0ZSxcblx0XHRcdGltcG9ydGFuY2U6IE92ZXJyaWRlVHlwZS5vdmVyd3JpdGUsXG5cdFx0XHRob3Jpem9udGFsQWxpZ246IE92ZXJyaWRlVHlwZS5vdmVyd3JpdGUsXG5cdFx0XHRhdmFpbGFiaWxpdHk6IE92ZXJyaWRlVHlwZS5vdmVyd3JpdGUsXG5cdFx0XHRpc05hdmlnYWJsZTogT3ZlcnJpZGVUeXBlLm92ZXJ3cml0ZSxcblx0XHRcdHNldHRpbmdzOiBPdmVycmlkZVR5cGUub3ZlcndyaXRlLFxuXHRcdFx0Zm9ybWF0T3B0aW9uczogT3ZlcnJpZGVUeXBlLm92ZXJ3cml0ZSxcblx0XHRcdGV4cG9ydFNldHRpbmdzOiBPdmVycmlkZVR5cGUub3ZlcndyaXRlXG5cdFx0fVxuXHQpO1xuXG5cdHJldHVybiBhZGRDb21wdXRlZENvbHVtbnModGFibGVDb2x1bW5zLCB2aXN1YWxpemF0aW9uUGF0aCwgY29udmVydGVyQ29udGV4dCk7XG59XG5cbi8vUmV0dXJucyB0aGUgQ29udGV4dERlZmluaW5nUHJvcGVydGllcyBmcm9tIHRoZSBjdXN0b20gYWdncmVnYXRlIGFubm90YXRpb24gb3IgZnJvbSB0aGUgYWdncmVnYXRpb24gYW5ub3RhdGlvbiBvbiB0aGUgcHJvcGVydHkgaXRzZWxmLlxuZnVuY3Rpb24gZ2V0Q29udGV4dERlZmluaW5nUHJvcGVydGllc0Zyb21BZ2dyZWdhdGlvbkFubm90YXRpb24oYWdncmVnYXRpb25IZWxwZXI6IEFnZ3JlZ2F0aW9uSGVscGVyKTogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+IHtcblx0Y29uc3QgY3VzdG9tQWdncmVnYXRlQW5ub3RhdGlvbnMgPSBhZ2dyZWdhdGlvbkhlbHBlci5nZXRDdXN0b21BZ2dyZWdhdGVEZWZpbml0aW9ucygpO1xuXHRjb25zdCBjdXN0b21BZ2dyZWdhdGVkZWZpbml0aW9uczogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+ID0ge307XG5cdGN1c3RvbUFnZ3JlZ2F0ZUFubm90YXRpb25zLmZvckVhY2goKGFubm90YXRpb24pID0+IHtcblx0XHRjb25zdCBhZ2dyZWdhdGVkUHJvcGVydHkgPSBhZ2dyZWdhdGlvbkhlbHBlci5fZW50aXR5VHlwZS5lbnRpdHlQcm9wZXJ0aWVzLmZpbmQoKHByb3BlcnR5KSA9PiB7XG5cdFx0XHRyZXR1cm4gcHJvcGVydHkubmFtZSA9PT0gYW5ub3RhdGlvbi5xdWFsaWZpZXI7XG5cdFx0fSk7XG5cdFx0aWYgKGFnZ3JlZ2F0ZWRQcm9wZXJ0eSkge1xuXHRcdFx0Y29uc3QgY29udGV4dERlZmluaW5nUHJvcGVydGllcyA9XG5cdFx0XHRcdGFubm90YXRpb24uYW5ub3RhdGlvbnM/LkFnZ3JlZ2F0aW9uPy5Db250ZXh0RGVmaW5pbmdQcm9wZXJ0aWVzID8/XG5cdFx0XHRcdGFnZ3JlZ2F0ZWRQcm9wZXJ0eS5hbm5vdGF0aW9ucy5BZ2dyZWdhdGlvbj8uQ29udGV4dERlZmluaW5nUHJvcGVydGllcztcblx0XHRcdGN1c3RvbUFnZ3JlZ2F0ZWRlZmluaXRpb25zW2FnZ3JlZ2F0ZWRQcm9wZXJ0eS5uYW1lXSA9XG5cdFx0XHRcdGNvbnRleHREZWZpbmluZ1Byb3BlcnRpZXM/Lm1hcCgoY3R4RGVmUHJvcGVydHkpID0+IGN0eERlZlByb3BlcnR5LnZhbHVlKSA/PyBbXTtcblx0XHR9XG5cdH0pO1xuXHRyZXR1cm4gY3VzdG9tQWdncmVnYXRlZGVmaW5pdGlvbnM7XG59XG5cbi8qKlxuICogUmV0cmlldmUgdGhlIGV4dGVuc2lvbiBpbmZvcm1hdGlvbiBmb3IgYWxsIGFnZ3JlZ2FibGUgcHJvcGVydGllcyAuXG4gKiBAcGFyYW0gZW50aXR5VHlwZSBUaGUgdGFyZ2V0IGVudGl0eSB0eXBlLlxuICogQHBhcmFtIHRhYmxlQ29sdW1ucyBUaGUgYXJyYXkgb2YgY29sdW1ucyBmb3IgdGhlIGVudGl0eSB0eXBlLlxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGNvbnZlcnRlciBjb250ZXh0LlxuICogQHJldHVybnMgVGhlIGFnZ3JlZ2F0ZSBkZWZpbml0aW9ucyBmcm9tIHRoZSBlbnRpdHlUeXBlLCBvciB1bmRlZmluZWQgaWYgdGhlIGVudGl0eSBkb2Vzbid0IHN1cHBvcnQgYW5hbHl0aWNhbCBxdWVyaWVzLlxuICovXG5leHBvcnQgY29uc3QgZ2V0RXh0ZW5zaW9uSW5mb0Zyb21FbnRpdHlUeXBlID0gZnVuY3Rpb24gKFxuXHRlbnRpdHlUeXBlOiBFbnRpdHlUeXBlLFxuXHR0YWJsZUNvbHVtbnM6IFRhYmxlQ29sdW1uW10sXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0PlxuKTogUmVjb3JkPHN0cmluZywgSW50ZXJuYWxFeHRlbnNpb25Gb3JBbmFseXRpY3M+IHwgdW5kZWZpbmVkIHtcblx0Y29uc3QgYWdncmVnYXRpb25IZWxwZXIgPSBuZXcgQWdncmVnYXRpb25IZWxwZXIoZW50aXR5VHlwZSwgY29udmVydGVyQ29udGV4dCk7XG5cdGlmICghYWdncmVnYXRpb25IZWxwZXIuaXNBbmFseXRpY3NTdXBwb3J0ZWQoKSkge1xuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblx0Ly8gS2VlcCBhIHNldCBvZiBhbGwgY3VycmVuY3kvdW5pdCBwcm9wZXJ0aWVzLCBhcyB3ZSBkb24ndCB3YW50IHRvIGNvbnNpZGVyIHRoZW0gYXMgYWdncmVnYXRlc1xuXHQvLyBUaGV5IGFyZSBhZ2dyZWdhdGVzIGZvciB0ZWNobmljYWwgcmVhc29ucyAodG8gbWFuYWdlIG11bHRpLXVuaXRzIHNpdHVhdGlvbnMpIGJ1dCBpdCBkb2Vzbid0IG1ha2Ugc2Vuc2UgZnJvbSBhIHVzZXIgc3RhbmRwb2ludFxuXHRjb25zdCBjdXJyZW5jeU9yVW5pdFByb3BlcnRpZXMgPSBuZXcgU2V0KCk7XG5cdHRhYmxlQ29sdW1ucy5mb3JFYWNoKChjb2x1bW4pID0+IHtcblx0XHRjb25zdCB0YWJsZUNvbHVtbiA9IGNvbHVtbiBhcyBBbm5vdGF0aW9uVGFibGVDb2x1bW47XG5cdFx0aWYgKHRhYmxlQ29sdW1uLnVuaXQpIHtcblx0XHRcdGNvbnN0IHRhcmdldFVuaXRQcm9wZXJ0eSA9IHRhYmxlQ29sdW1ucy5maW5kKChwcm9wKSA9PiBwcm9wLm5hbWUgPT09IHRhYmxlQ29sdW1uLnVuaXQpIGFzIEFubm90YXRpb25UYWJsZUNvbHVtbjtcblx0XHRcdGN1cnJlbmN5T3JVbml0UHJvcGVydGllcy5hZGQodGFyZ2V0VW5pdFByb3BlcnR5LnJlbGF0aXZlUGF0aCk7XG5cdFx0fVxuXHR9KTtcblx0Y29uc3QgY29udGV4dERlZmluaW5nUHJvcGVydGllc0Zyb21BZ2dyZWdhdGlvbiA9IGdldENvbnRleHREZWZpbmluZ1Byb3BlcnRpZXNGcm9tQWdncmVnYXRpb25Bbm5vdGF0aW9uKGFnZ3JlZ2F0aW9uSGVscGVyKTtcblx0Y29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCBJbnRlcm5hbEV4dGVuc2lvbkZvckFuYWx5dGljcz4gPSB7fTtcblx0dGFibGVDb2x1bW5zLmZvckVhY2goKGNvbHVtbikgPT4ge1xuXHRcdGNvbnN0IHRhYmxlQ29sdW1uID0gY29sdW1uIGFzIEFubm90YXRpb25UYWJsZUNvbHVtbjtcblx0XHRjb25zdCBwcm9wZXJ0eSA9IGVudGl0eVR5cGUuZW50aXR5UHJvcGVydGllcy5maW5kKChwcm9wKSA9PiBwcm9wLm5hbWUgPT09IHRhYmxlQ29sdW1uLnJlbGF0aXZlUGF0aCk7XG5cdFx0aWYgKHRhYmxlQ29sdW1uLnByb3BlcnR5SW5mb3MgPT09IHVuZGVmaW5lZCAmJiB0YWJsZUNvbHVtbi5yZWxhdGl2ZVBhdGgpIHtcblx0XHRcdGxldCByYXdDb250ZXh0RGVmaW5pbmdQcm9wZXJ0aWVzID0gY29udGV4dERlZmluaW5nUHJvcGVydGllc0Zyb21BZ2dyZWdhdGlvblt0YWJsZUNvbHVtbi5yZWxhdGl2ZVBhdGhdIGFzIHN0cmluZ1tdIHwgdW5kZWZpbmVkO1xuXG5cdFx0XHQvLyBpZiB0aGVyZSBpcyBubyBjdXN0b20gYWdncmVnYXRlIGRlZmluaXRpb24sIGFuZCB0aGUgcHJvcGVydHkgaXMgZ3JvdXBhYmxlLCB0aGVuIHdlIGNhbiB1c2UgdGhlIGRlZmF1bHQgY29udGV4dCBkZWZpbmluZyBwcm9wZXJ0aWVzXG5cdFx0XHRsZXQgZnJvbUdyb3VwYWJsZVByb3BlcnR5ID0gZmFsc2U7XG5cdFx0XHRpZiAoIXJhd0NvbnRleHREZWZpbmluZ1Byb3BlcnRpZXMgJiYgcHJvcGVydHkgJiYgISFhZ2dyZWdhdGlvbkhlbHBlci5pc1Byb3BlcnR5R3JvdXBhYmxlKHByb3BlcnR5KSkge1xuXHRcdFx0XHRmcm9tR3JvdXBhYmxlUHJvcGVydHkgPSB0cnVlO1xuXHRcdFx0XHRyYXdDb250ZXh0RGVmaW5pbmdQcm9wZXJ0aWVzID0gcHJvcGVydHkuYW5ub3RhdGlvbnMuQWdncmVnYXRpb24/LkNvbnRleHREZWZpbmluZ1Byb3BlcnRpZXM/Lm1hcChcblx0XHRcdFx0XHQoY3R4RGVmUHJvcGVydHkpID0+IGN0eERlZlByb3BlcnR5LnZhbHVlXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0XHQvLyBJZ25vcmUgYWdncmVnYXRlcyBjb3JyZXNwb25kaW5nIHRvIGN1cnJlbmNpZXMgb3IgdW5pdHMgb2YgbWVhc3VyZVxuXHRcdFx0aWYgKHJhd0NvbnRleHREZWZpbmluZ1Byb3BlcnRpZXMgJiYgIWN1cnJlbmN5T3JVbml0UHJvcGVydGllcy5oYXModGFibGVDb2x1bW4ucmVsYXRpdmVQYXRoKSkge1xuXHRcdFx0XHRyZXN1bHRbdGFibGVDb2x1bW4ubmFtZV0gPSB7XG5cdFx0XHRcdFx0ZnJvbUdyb3VwYWJsZVByb3BlcnR5OiBmcm9tR3JvdXBhYmxlUHJvcGVydHksXG5cdFx0XHRcdFx0cmVsYXRpdmVQYXRoOiB0YWJsZUNvbHVtbi5yZWxhdGl2ZVBhdGhcblx0XHRcdFx0fTtcblx0XHRcdFx0Y29uc3QgY29udGV4dERlZmluaW5nUHJvcGVydGllczogc3RyaW5nW10gPSBbXTtcblx0XHRcdFx0cmF3Q29udGV4dERlZmluaW5nUHJvcGVydGllcy5mb3JFYWNoKChjb250ZXh0RGVmaW5pbmdQcm9wZXJ0eU5hbWUpID0+IHtcblx0XHRcdFx0XHQvLyBJZ25vcmUgY29udGV4dGRlZmluaW5ncHJvcGVydGllcyBjb3JyZXNwb25kaW5nIHRvIGN1cnJlbmNpZXMgb3IgdW5pdHMgb2YgbWVhc3VyZVxuXHRcdFx0XHRcdGlmIChjdXJyZW5jeU9yVW5pdFByb3BlcnRpZXMuaGFzKGNvbnRleHREZWZpbmluZ1Byb3BlcnR5TmFtZSkpIHtcblx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Y29uc3QgZm91bmRDb2x1bW4gPSBmaW5kQ29sdW1uQnlQYXRoKGNvbnRleHREZWZpbmluZ1Byb3BlcnR5TmFtZSwgdGFibGVDb2x1bW5zKTtcblx0XHRcdFx0XHRpZiAoZm91bmRDb2x1bW4pIHtcblx0XHRcdFx0XHRcdGNvbnRleHREZWZpbmluZ1Byb3BlcnRpZXMucHVzaChmb3VuZENvbHVtbi5uYW1lKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRpZiAoY29udGV4dERlZmluaW5nUHJvcGVydGllcy5sZW5ndGgpIHtcblx0XHRcdFx0XHRyZXN1bHRbdGFibGVDb2x1bW4ubmFtZV0uYWRkaXRpb25hbFByb3BlcnRpZXMgPSBjb250ZXh0RGVmaW5pbmdQcm9wZXJ0aWVzO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9KTtcblx0cmV0dXJuIHJlc3VsdDtcbn07XG4vKipcbiAqIFVwZGF0ZXMgYSB0YWJsZSB2aXN1YWxpemF0aW9uIGZvciBhbmFseXRpY2FsIHVzZSBjYXNlcy5cbiAqIEBwYXJhbSB0YWJsZVZpc3VhbGl6YXRpb24gVGhlIHZpc3VhbGl6YXRpb24gdG8gYmUgdXBkYXRlZFxuICogQHBhcmFtIGVudGl0eVR5cGUgVGhlIGVudGl0eSB0eXBlIGRpc3BsYXllZCBpbiB0aGUgdGFibGVcbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHBhcmFtIHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uIFRoZSBwcmVzZW50YXRpb25WYXJpYW50IGFubm90YXRpb24gKGlmIGFueSlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZVRhYmxlVmlzdWFsaXphdGlvbkZvclR5cGUoXG5cdHRhYmxlVmlzdWFsaXphdGlvbjogVGFibGVWaXN1YWxpemF0aW9uLFxuXHRlbnRpdHlUeXBlOiBFbnRpdHlUeXBlLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sXG5cdHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uPzogUHJlc2VudGF0aW9uVmFyaWFudFR5cGVcbik6IHZvaWQge1xuXHRpZiAodGFibGVWaXN1YWxpemF0aW9uLmNvbnRyb2wudHlwZSA9PT0gXCJBbmFseXRpY2FsVGFibGVcIikge1xuXHRcdGNvbnN0IGFnZ3JlZ2F0aW9uRGF0YSA9IGdldEV4dGVuc2lvbkluZm9Gcm9tRW50aXR5VHlwZShlbnRpdHlUeXBlLCB0YWJsZVZpc3VhbGl6YXRpb24uY29sdW1ucywgY29udmVydGVyQ29udGV4dCksXG5cdFx0XHRhZ2dyZWdhdGlvbkhlbHBlciA9IG5ldyBBZ2dyZWdhdGlvbkhlbHBlcihlbnRpdHlUeXBlLCBjb252ZXJ0ZXJDb250ZXh0KTtcblx0XHRpZiAoYWdncmVnYXRpb25EYXRhKSB7XG5cdFx0XHR0YWJsZVZpc3VhbGl6YXRpb24uZW5hYmxlQW5hbHl0aWNzID0gdHJ1ZTtcblx0XHRcdHRhYmxlVmlzdWFsaXphdGlvbi5lbmFibGUkc2VsZWN0ID0gZmFsc2U7XG5cdFx0XHR0YWJsZVZpc3VhbGl6YXRpb24uZW5hYmxlJCRnZXRLZWVwQWxpdmVDb250ZXh0ID0gZmFsc2U7XG5cdFx0XHR0YWJsZVZpc3VhbGl6YXRpb24uYW5hbHl0aWNzRXh0ZW5zaW9ucyA9IGFnZ3JlZ2F0aW9uRGF0YTtcblx0XHRcdF91cGRhdGVQcm9wZXJ0eUluZm9zV2l0aEFnZ3JlZ2F0ZXNEZWZpbml0aW9ucyh0YWJsZVZpc3VhbGl6YXRpb24pO1xuXHRcdFx0Y29uc3QgYWxsb3dlZFRyYW5zZm9ybWF0aW9ucyA9IGFnZ3JlZ2F0aW9uSGVscGVyLmdldEFsbG93ZWRUcmFuc2Zvcm1hdGlvbnMoKTtcblx0XHRcdHRhYmxlVmlzdWFsaXphdGlvbi5lbmFibGVCYXNpY1NlYXJjaCA9IGFsbG93ZWRUcmFuc2Zvcm1hdGlvbnMgPyBhbGxvd2VkVHJhbnNmb3JtYXRpb25zLmluY2x1ZGVzKFwic2VhcmNoXCIpIDogdHJ1ZTtcblx0XHRcdC8vIEFkZCBncm91cCBhbmQgc29ydCBjb25kaXRpb25zIGZyb20gdGhlIHByZXNlbnRhdGlvbiB2YXJpYW50XG5cdFx0XHR0YWJsZVZpc3VhbGl6YXRpb24uYW5ub3RhdGlvbi5ncm91cENvbmRpdGlvbnMgPSBnZXRHcm91cENvbmRpdGlvbnMoXG5cdFx0XHRcdHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uLFxuXHRcdFx0XHR0YWJsZVZpc3VhbGl6YXRpb24uY29sdW1ucyxcblx0XHRcdFx0dGFibGVWaXN1YWxpemF0aW9uLmNvbnRyb2wudHlwZVxuXHRcdFx0KTtcblx0XHRcdHRhYmxlVmlzdWFsaXphdGlvbi5hbm5vdGF0aW9uLmFnZ3JlZ2F0ZUNvbmRpdGlvbnMgPSBnZXRBZ2dyZWdhdGVDb25kaXRpb25zKFxuXHRcdFx0XHRwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbixcblx0XHRcdFx0dGFibGVWaXN1YWxpemF0aW9uLmNvbHVtbnMsXG5cdFx0XHRcdGFnZ3JlZ2F0aW9uRGF0YVxuXHRcdFx0KTtcblxuXHRcdFx0aWYgKE1vZGVsSGVscGVyLmlzT2JqZWN0UGF0aERyYWZ0U3VwcG9ydGVkKGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpKSkge1xuXHRcdFx0XHQvLyBGb3IgYW4gYW5hbHl0aWNhbCB0YWJsZSBkaXNwbGF5aW5nIGEgZHJhZnQtZW5hYmxlZCBlbnRpdHksIHdlIGFsd2F5cyBsb2FkICdIYXNBY3RpdmVFbnRpdHknXG5cdFx0XHRcdC8vIGJlY2F1c2UgaXQncyBuZWVkZWQgZm9yIHRoZSByb3cgY3JpdGljYWxpdHkgZXhwcmVzc2lvblxuXHRcdFx0XHRpZiAodGFibGVWaXN1YWxpemF0aW9uLnJlcXVlc3RBdExlYXN0KSB7XG5cdFx0XHRcdFx0dGFibGVWaXN1YWxpemF0aW9uLnJlcXVlc3RBdExlYXN0LnB1c2goXCJIYXNBY3RpdmVFbnRpdHlcIik7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dGFibGVWaXN1YWxpemF0aW9uLnJlcXVlc3RBdExlYXN0ID0gW1wiSGFzQWN0aXZlRW50aXR5XCJdO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gV2UgYWx3YXlzIGxvYWQgJ0hhc0RyYWZ0RW50aXR5JyBpbiBhIExSIGJlY2F1c2UgaXQncyBuZWVkZWQgdG8gbmF2aWdhdGUgdG8gdGhlIGRyYWZ0IGluc3RhbmNlIGlmIHRoZXJlJ3Mgb25lIHdoZW4gY2xpY2tpbmcgb24gdGhlIGFjdGl2ZSBpbnN0YW5jZVxuXHRcdFx0XHRpZiAoTW9kZWxIZWxwZXIuaXNEcmFmdFJvb3QoY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlTZXQoKSkpIHtcblx0XHRcdFx0XHR0YWJsZVZpc3VhbGl6YXRpb24ucmVxdWVzdEF0TGVhc3QucHVzaChcIkhhc0RyYWZ0RW50aXR5XCIpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdExvZy5lcnJvcihgQWdncmVnYXRpb24gbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBlbnRpdHkgdHlwZTogJHtlbnRpdHlUeXBlLm5hbWV9YCk7XG5cdFx0fVxuXHRcdHRhYmxlVmlzdWFsaXphdGlvbi5jb250cm9sLnR5cGUgPSBcIkdyaWRUYWJsZVwiOyAvLyBBbmFseXRpY2FsVGFibGUgaXNuJ3QgYSByZWFsIHR5cGUgZm9yIHRoZSBNREM6VGFibGUsIHNvIHdlIGFsd2F5cyBzd2l0Y2ggYmFjayB0byBHcmlkXG5cdH0gZWxzZSBpZiAodGFibGVWaXN1YWxpemF0aW9uLmNvbnRyb2wudHlwZSA9PT0gXCJSZXNwb25zaXZlVGFibGVcIikge1xuXHRcdHRhYmxlVmlzdWFsaXphdGlvbi5hbm5vdGF0aW9uLmdyb3VwQ29uZGl0aW9ucyA9IGdldEdyb3VwQ29uZGl0aW9ucyhcblx0XHRcdHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uLFxuXHRcdFx0dGFibGVWaXN1YWxpemF0aW9uLmNvbHVtbnMsXG5cdFx0XHR0YWJsZVZpc3VhbGl6YXRpb24uY29udHJvbC50eXBlXG5cdFx0KTtcblx0fSBlbHNlIGlmICh0YWJsZVZpc3VhbGl6YXRpb24uY29udHJvbC50eXBlID09PSBcIlRyZWVUYWJsZVwiKSB7XG5cdFx0Y29uc3QgYWdncmVnYXRpb25IZWxwZXIgPSBuZXcgQWdncmVnYXRpb25IZWxwZXIoZW50aXR5VHlwZSwgY29udmVydGVyQ29udGV4dCk7XG5cdFx0Y29uc3QgYWxsb3dlZFRyYW5zZm9ybWF0aW9ucyA9IGFnZ3JlZ2F0aW9uSGVscGVyLmdldEFsbG93ZWRUcmFuc2Zvcm1hdGlvbnMoKTtcblx0XHR0YWJsZVZpc3VhbGl6YXRpb24uZW5hYmxlQmFzaWNTZWFyY2ggPSBhbGxvd2VkVHJhbnNmb3JtYXRpb25zID8gYWxsb3dlZFRyYW5zZm9ybWF0aW9ucy5pbmNsdWRlcyhcInNlYXJjaFwiKSA6IHRydWU7XG5cdFx0dGFibGVWaXN1YWxpemF0aW9uLmVuYWJsZSQkZ2V0S2VlcEFsaXZlQ29udGV4dCA9IHRydWU7XG5cdFx0dGFibGVWaXN1YWxpemF0aW9uLmFubm90YXRpb24uY2hhbmdlU2libGluZ0ZvclJvb3RzU3VwcG9ydGVkID0gKGVudGl0eVR5cGU/LmFubm90YXRpb25zLkhpZXJhcmNoeT8uW1xuXHRcdFx0YFJlY3Vyc2l2ZUhpZXJhcmNoeUFjdGlvbnMjJHt0YWJsZVZpc3VhbGl6YXRpb24uY29udHJvbC5oaWVyYXJjaHlRdWFsaWZpZXIgPz8gXCJcIn1gXG5cdFx0XT8uQ2hhbmdlU2libGluZ0ZvclJvb3RzU3VwcG9ydGVkID8/IHRydWUpIGFzIGJvb2xlYW47XG5cblx0XHR0YWJsZVZpc3VhbGl6YXRpb24uYW5ub3RhdGlvbi5hbGxvd0Ryb3BCZXR3ZWVuTm9kZXMgPVxuXHRcdFx0ISFlbnRpdHlUeXBlLmFubm90YXRpb25zLkhpZXJhcmNoeT8uW2BSZWN1cnNpdmVIaWVyYXJjaHlBY3Rpb25zIyR7dGFibGVWaXN1YWxpemF0aW9uLmNvbnRyb2wuaGllcmFyY2h5UXVhbGlmaWVyID8/IFwiXCJ9YF1cblx0XHRcdFx0Py5DaGFuZ2VOZXh0U2libGluZ0FjdGlvbjtcblxuXHRcdC8vIFdlIGFsd2F5cyBsb2FkICdIYXNEcmFmdEVudGl0eScgaW4gYSBMUiBiZWNhdXNlIGl0J3MgbmVlZGVkIHRvIG5hdmlnYXRlIHRvIHRoZSBkcmFmdCBpbnN0YW5jZSBpZiB0aGVyZSdzIG9uZSB3aGVuIGNsaWNraW5nIG9uIHRoZSBhY3RpdmUgaW5zdGFuY2Vcblx0XHRpZiAoTW9kZWxIZWxwZXIuaXNEcmFmdFJvb3QoY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlTZXQoKSkpIHtcblx0XHRcdGlmICh0YWJsZVZpc3VhbGl6YXRpb24ucmVxdWVzdEF0TGVhc3QpIHtcblx0XHRcdFx0dGFibGVWaXN1YWxpemF0aW9uLnJlcXVlc3RBdExlYXN0LnB1c2goXCJIYXNEcmFmdEVudGl0eVwiKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRhYmxlVmlzdWFsaXphdGlvbi5yZXF1ZXN0QXRMZWFzdCA9IFtcIkhhc0RyYWZ0RW50aXR5XCJdO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdGlmICh0YWJsZVZpc3VhbGl6YXRpb24uY29udHJvbC5lbmFibGVVcGxvYWRQbHVnaW4pIHtcblx0XHRjb25zdCBzdHJlYW1Qcm9wZXJ0eSA9IGNvbnZlcnRlckNvbnRleHQuZ2V0QW5ub3RhdGlvbkVudGl0eVR5cGUoKS5hbm5vdGF0aW9ucz8uVUk/Lk1lZGlhUmVzb3VyY2U/LlN0cmVhbT8uJHRhcmdldDtcblx0XHRpZiAoIXN0cmVhbVByb3BlcnR5KSB7XG5cdFx0XHR0aHJvdyBcIlVJLk1lZGlhUmVzb3VyY2UgYW5ub3RhdGlvbiB3aXRoIFN0cmVhbSBwcm9wZXJ0eSBtaXNzaW5nXCI7XG5cdFx0fVxuXG5cdFx0Ly8gdGhlIHVwbG9hZCBhY3Rpb24gaXMgdHJlYXRlZCBhcyB0aGUgY3JlYXRlIGFjdGlvblxuXHRcdGNvbnN0IHVwbG9hZEFjdGlvbiA9IHRhYmxlVmlzdWFsaXphdGlvbi5hY3Rpb25zLmZpbmQoKGEpID0+IGEua2V5ID09PSBTdGFuZGFyZEFjdGlvbktleXMuQ3JlYXRlKSBhcyBTdGFuZGFyZEFjdGlvbjtcblxuXHRcdHRhYmxlVmlzdWFsaXphdGlvbi5hbm5vdGF0aW9uLnVwbG9hZFRhYmxlID0ge1xuXHRcdFx0c3RyZWFtOiBzdHJlYW1Qcm9wZXJ0eS5uYW1lLFxuXHRcdFx0ZmlsZU5hbWU6IChzdHJlYW1Qcm9wZXJ0eS5hbm5vdGF0aW9ucy5Db3JlPy5Db250ZW50RGlzcG9zaXRpb24/LkZpbGVuYW1lIGFzIFBhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbjxzdHJpbmc+IHwgdW5kZWZpbmVkKT8ucGF0aCxcblx0XHRcdGZpbGVOYW1lTWF4TGVuZ3RoOiBzdHJlYW1Qcm9wZXJ0eS5hbm5vdGF0aW9ucy5Db3JlPy5Db250ZW50RGlzcG9zaXRpb24/LkZpbGVuYW1lPy4kdGFyZ2V0Py5tYXhMZW5ndGgsXG5cdFx0XHRhY2NlcHRhYmxlTWVkaWFUeXBlczogc3RyZWFtUHJvcGVydHkuYW5ub3RhdGlvbnMuQ29yZT8uQWNjZXB0YWJsZU1lZGlhVHlwZXMsXG5cdFx0XHRtYXhMZW5ndGg6IHN0cmVhbVByb3BlcnR5Lm1heExlbmd0aCxcblx0XHRcdHVwbG9hZEFjdGlvbjogdXBsb2FkQWN0aW9uXG5cdFx0fTtcblx0fVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBzZWxlY3QgcXVlcnkgd2l0aCB0aGUgc2VsZWN0ZWQgZmllbGRzIGZyb20gdGhlIHBhcmFtZXRlcnMgdGhhdCB3ZXJlIHBhc3NlZC5cbiAqIEBwYXJhbSBsaW5lSXRlbSBUaGUgTGluZUl0ZW0gd2Ugd2FudCB0aGUgcmVxdWVzdGVkIHByb3BlcnRpZXMgZnJvbS5cbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dC5cbiAqIEBwYXJhbSBvcGVyYXRpb25BdmFpbGFibGUgQSBzdHJpbmcgY29udGFpbmluZyB0aGUgYXZhaWxhYmxlIG9wZXJhdGlvbiwgd2hpY2ggd2UnbGwgdGFrZSB0aGUgcHJvcGVydGllcyB0byBhZGQgdG8gdGhlIHNlbGVjdCBxdWVyeS5cbiAqIEBwYXJhbSBwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbiBUaGUgcHJlc2VudGF0aW9uIHZhcmlhbnQgYW5ub3RhdGlvbiB3aGljaCB3ZSdsbCB0YWtlIHRoZSBSZXF1ZXN0QXRMZWFzdCBwcm9wZXJ0aWVzIGZyb20uXG4gKiBAcmV0dXJucyBUaGUgJ3NlbGVjdCcgcXVlcnkgdGhhdCBoYXMgdGhlIHNlbGVjdGVkIGZpZWxkcyBmcm9tIHRoZSBwYXJhbWV0ZXJzIHRoYXQgd2VyZSBwYXNzZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSZXF1ZXN0ZWRQcm9wZXJ0aWVzKFxuXHRsaW5lSXRlbTogTGluZUl0ZW0sXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdG9wZXJhdGlvbkF2YWlsYWJsZT86IHN0cmluZyxcblx0cHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24/OiBQcmVzZW50YXRpb25WYXJpYW50VHlwZVxuKTogc3RyaW5nW10ge1xuXHRjb25zdCBlbnRpdHlUeXBlID0gY29udmVydGVyQ29udGV4dC5nZXRBbm5vdGF0aW9uRW50aXR5VHlwZShsaW5lSXRlbSk7XG5cdGNvbnN0IHNlbGVjdGVkRmllbGRzOiBzdHJpbmdbXSA9IFtdO1xuXHRmdW5jdGlvbiBwdXNoRmllbGQoZmllbGQ6IHN0cmluZyk6IHZvaWQge1xuXHRcdGlmIChmaWVsZCAmJiAhc2VsZWN0ZWRGaWVsZHMuaW5jbHVkZXMoZmllbGQpICYmIGZpZWxkLmluZGV4T2YoXCIvXCIpICE9PSAwKSB7XG5cdFx0XHQvLyBEbyBub3QgYWRkIHNpbmdsZXRvbiBwcm9wZXJ0eSAod2l0aCBhYnNvbHV0ZSBwYXRoKSB0byAkc2VsZWN0XG5cdFx0XHRzZWxlY3RlZEZpZWxkcy5wdXNoKGZpZWxkKTtcblx0XHR9XG5cdH1cblxuXHRmdW5jdGlvbiBwdXNoRmllbGRMaXN0KGZpZWxkczogc3RyaW5nW10pOiB2b2lkIHtcblx0XHRpZiAoZmllbGRzPy5sZW5ndGgpIHtcblx0XHRcdGZpZWxkcy5mb3JFYWNoKHB1c2hGaWVsZCk7XG5cdFx0fVxuXHR9XG5cblx0Y29uc3Qgb3BlcmF0aW9uQXZhaWxhYmxlUHJvcGVydGllcyA9IChvcGVyYXRpb25BdmFpbGFibGUgfHwgXCJcIikuc3BsaXQoXCIsXCIpO1xuXHRjb25zdCB2YWxpZFByb3BlcnRpZXMgPSBvcGVyYXRpb25BdmFpbGFibGVQcm9wZXJ0aWVzLmZpbHRlcihmdW5jdGlvbiAocHJvcE5hbWU6IHN0cmluZykge1xuXHRcdHJldHVybiBlbnRpdHlUeXBlLnJlc29sdmVQYXRoKHByb3BOYW1lKTtcblx0fSk7XG5cdGNvbnN0IHNlbWFudGljS2V5czogc3RyaW5nW10gPSAoZW50aXR5VHlwZS5hbm5vdGF0aW9ucy5Db21tb24/LlNlbWFudGljS2V5IHx8IFtdKS5tYXAoKHNlbWFudGljS2V5KSA9PiBzZW1hbnRpY0tleS52YWx1ZSk7XG5cdGNvbnN0IGNhcGFiaWxpdGllc0Fubm90YXRpb24gPSBjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVNldCgpPy5hbm5vdGF0aW9ucz8uQ2FwYWJpbGl0aWVzO1xuXHRjb25zdCBhbHRlcm5hdGVBbmRTZWNvbmRhcnlLZXlzID0gTW9kZWxIZWxwZXIuZ2V0QWx0ZXJuYXRlQW5kU2Vjb25kYXJ5S2V5cyhlbnRpdHlUeXBlLCBjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVNldCgpIGFzIEVudGl0eVNldCk7XG5cdGlmIChwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbikge1xuXHRcdHB1c2hGaWVsZExpc3QocHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24uUmVxdWVzdEF0TGVhc3Q/Lm1hcCgocHJvcGVydHlQYXRoKSA9PiBwcm9wZXJ0eVBhdGgudmFsdWUpKTtcblx0fVxuXHRwdXNoRmllbGRMaXN0KGdldE5hdmlnYXRpb25BdmFpbGFibGVGaWVsZHNGcm9tTGluZUl0ZW0obGluZUl0ZW0sIGVudGl0eVR5cGUpKTtcblx0cHVzaEZpZWxkTGlzdCh2YWxpZFByb3BlcnRpZXMpO1xuXHRwdXNoRmllbGRMaXN0KHNlbWFudGljS2V5cyk7XG5cdHB1c2hGaWVsZExpc3QoYWx0ZXJuYXRlQW5kU2Vjb25kYXJ5S2V5cyk7XG5cdGlmIChjYXBhYmlsaXRpZXNBbm5vdGF0aW9uKSB7XG5cdFx0cHVzaEZpZWxkKChjYXBhYmlsaXRpZXNBbm5vdGF0aW9uLkRlbGV0ZVJlc3RyaWN0aW9ucz8uRGVsZXRhYmxlIGFzIFBhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbjxib29sZWFuPik/LnBhdGgpO1xuXHRcdHB1c2hGaWVsZCgoY2FwYWJpbGl0aWVzQW5ub3RhdGlvbi5VcGRhdGVSZXN0cmljdGlvbnM/LlVwZGF0YWJsZSBhcyBQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb248Ym9vbGVhbj4pPy5wYXRoKTtcblx0fVxuXG5cdHJldHVybiBzZWxlY3RlZEZpZWxkcztcbn1cblxuLyoqXG4gKiBUaGlzIHJldHVybiB0aGUgcHJvcGVydHkgdGhhdCBhcmUgYXZhaWxhYmxlIGZyb20gdGhlIE5hdmlnYXRpb25BdmFpbGFibGUgYW5ub3RhdGlvbiBvbiBJQk4gRmllbGRzLlxuICogQHBhcmFtIGxpbmVJdGVtIFRoZSBsaW5lIGl0ZW0gYW5ub3RhdGlvbi5cbiAqIEBwYXJhbSBlbnRpdHlUeXBlIFRoZSBFbnRpdHkgVHlwZS5cbiAqIEByZXR1cm5zIEFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIHByb3BlcnRpZXMgbmFtZS5cbiAqL1xuZnVuY3Rpb24gZ2V0TmF2aWdhdGlvbkF2YWlsYWJsZUZpZWxkc0Zyb21MaW5lSXRlbShsaW5lSXRlbTogTGluZUl0ZW0sIGVudGl0eVR5cGU6IEVudGl0eVR5cGUpOiBzdHJpbmdbXSB7XG5cdGNvbnN0IHNlbGVjdGVkRmllbGRzOiBzdHJpbmdbXSA9IFtdO1xuXHRsaW5lSXRlbS5mb3JFYWNoKGZ1bmN0aW9uIChyZWNvcmQpIHtcblx0XHRpZiAoXG5cdFx0XHRyZWNvcmQuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbiAmJlxuXHRcdFx0IXJlY29yZC5JbmxpbmUgJiZcblx0XHRcdCFyZWNvcmQuRGV0ZXJtaW5pbmcgJiZcblx0XHRcdGlzUGF0aEFubm90YXRpb25FeHByZXNzaW9uKHJlY29yZC5OYXZpZ2F0aW9uQXZhaWxhYmxlKVxuXHRcdCkge1xuXHRcdFx0Y29uc3QgcGF0aCA9IChyZWNvcmQuTmF2aWdhdGlvbkF2YWlsYWJsZSBhcyB1bmtub3duIGFzIHsgcGF0aDogc3RyaW5nIH0pLnBhdGg7XG5cdFx0XHRpZiAoZW50aXR5VHlwZS5yZXNvbHZlUGF0aChwYXRoKSkge1xuXHRcdFx0XHRzZWxlY3RlZEZpZWxkcy5wdXNoKHBhdGgpO1xuXHRcdFx0fVxuXHRcdH1cblx0fSk7XG5cdHJldHVybiBzZWxlY3RlZEZpZWxkcztcbn1cblxuLyoqXG4gKiBHZXQgdGhlIG5hdmlnYXRpb24gdGFyZ2V0IHBhdGggZnJvbSBtYW5pZmVzdCBzZXR0aW5ncy5cbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHBhcmFtIG5hdmlnYXRpb25Qcm9wZXJ0eVBhdGggVGhlIG5hdmlnYXRpb24gcGF0aCB0byBjaGVjayBpbiB0aGUgbWFuaWZlc3Qgc2V0dGluZ3NcbiAqIEByZXR1cm5zIE5hdmlnYXRpb24gcGF0aCBmcm9tIG1hbmlmZXN0IHNldHRpbmdzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXROYXZpZ2F0aW9uVGFyZ2V0UGF0aChjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sIG5hdmlnYXRpb25Qcm9wZXJ0eVBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG5cdGNvbnN0IG1hbmlmZXN0V3JhcHBlciA9IGNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RXcmFwcGVyKCk7XG5cdGlmIChuYXZpZ2F0aW9uUHJvcGVydHlQYXRoICYmIG1hbmlmZXN0V3JhcHBlci5nZXROYXZpZ2F0aW9uQ29uZmlndXJhdGlvbihuYXZpZ2F0aW9uUHJvcGVydHlQYXRoKSkge1xuXHRcdGNvbnN0IG5hdkNvbmZpZyA9IG1hbmlmZXN0V3JhcHBlci5nZXROYXZpZ2F0aW9uQ29uZmlndXJhdGlvbihuYXZpZ2F0aW9uUHJvcGVydHlQYXRoKTtcblx0XHRpZiAoT2JqZWN0LmtleXMobmF2Q29uZmlnKS5sZW5ndGggPiAwKSB7XG5cdFx0XHRyZXR1cm4gbmF2aWdhdGlvblByb3BlcnR5UGF0aDtcblx0XHR9XG5cdH1cblx0Y29uc3QgZGF0YU1vZGVsUGF0aCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpO1xuXHRjb25zdCBjb250ZXh0UGF0aCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0Q29udGV4dFBhdGgoKTtcblx0Y29uc3QgbmF2Q29uZmlnRm9yQ29udGV4dFBhdGggPSBtYW5pZmVzdFdyYXBwZXIuZ2V0TmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24oY29udGV4dFBhdGgpO1xuXHRpZiAobmF2Q29uZmlnRm9yQ29udGV4dFBhdGggJiYgT2JqZWN0LmtleXMobmF2Q29uZmlnRm9yQ29udGV4dFBhdGgpLmxlbmd0aCA+IDApIHtcblx0XHRyZXR1cm4gY29udGV4dFBhdGg7XG5cdH1cblx0cmV0dXJuIGRhdGFNb2RlbFBhdGgudGFyZ2V0RW50aXR5U2V0ID8gZGF0YU1vZGVsUGF0aC50YXJnZXRFbnRpdHlTZXQubmFtZSA6IGRhdGFNb2RlbFBhdGguc3RhcnRpbmdFbnRpdHlTZXQubmFtZTtcbn1cbmZ1bmN0aW9uIGZpbmRDb2x1bW5CeVBhdGgocGF0aDogc3RyaW5nLCB0YWJsZUNvbHVtbnM6IFRhYmxlQ29sdW1uW10pOiBUYWJsZUNvbHVtbiB8IHVuZGVmaW5lZCB7XG5cdHJldHVybiB0YWJsZUNvbHVtbnMuZmluZCgoY29sdW1uKSA9PiB7XG5cdFx0Y29uc3QgYW5ub3RhdGlvbkNvbHVtbiA9IGNvbHVtbiBhcyBBbm5vdGF0aW9uVGFibGVDb2x1bW47XG5cdFx0cmV0dXJuIGFubm90YXRpb25Db2x1bW4ucHJvcGVydHlJbmZvcyA9PT0gdW5kZWZpbmVkICYmIGFubm90YXRpb25Db2x1bW4ucmVsYXRpdmVQYXRoID09PSBwYXRoO1xuXHR9KTtcbn1cbi8qKlxuICogU2V0cyB0aGUgJ3VuaXQnLCAndGV4dEFycmFuZ2VtZW50JywgJ3RpbWV6b25lJyBhbmQgJ2V4cG9ydHNldHRpbmdzJyBwcm9wZXJ0aWVzIGluIGNvbHVtbnMgd2hlbiBuZWNlc3NhcnkuXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCBUaGUgaW5zdGFuY2Ugb2YgdGhlIGNvbnZlcnRlciBjb250ZXh0XG4gKiBAcGFyYW0gdGFibGVDb2x1bW5zIFRoZSBjb2x1bW5zIHRvIGJlIHVwZGF0ZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZUxpbmtlZFByb3BlcnRpZXMoY29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCwgdGFibGVDb2x1bW5zOiBUYWJsZUNvbHVtbltdKTogdm9pZCB7XG5cdGNvbnN0IGRhdGFNb2RlbE9iamVjdFBhdGggPSBjb252ZXJ0ZXJDb250ZXh0LmdldENvbnZlcnRlckNvbnRleHRGb3IoY29udmVydGVyQ29udGV4dC5nZXRDb250ZXh0UGF0aCgpKS5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCk7XG5cdHRhYmxlQ29sdW1ucy5mb3JFYWNoKChvQ29sdW1uKSA9PiB7XG5cdFx0Y29uc3QgdGFibGVDb2x1bW4gPSBvQ29sdW1uIGFzIEFubm90YXRpb25UYWJsZUNvbHVtbjtcblx0XHRpZiAodGFibGVDb2x1bW4ucHJvcGVydHlJbmZvcyA9PT0gdW5kZWZpbmVkICYmIHRhYmxlQ29sdW1uLnJlbGF0aXZlUGF0aCkge1xuXHRcdFx0Y29uc3QgcHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoID0gZW5oYW5jZURhdGFNb2RlbFBhdGg8UHJvcGVydHk+KGRhdGFNb2RlbE9iamVjdFBhdGgsIHRhYmxlQ29sdW1uLnJlbGF0aXZlUGF0aCk7XG5cdFx0XHRjb25zdCBwcm9wZXJ0eSA9IHByb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRPYmplY3Q7XG5cdFx0XHRpZiAocHJvcGVydHkpIHtcblx0XHRcdFx0YWRkQ3VycmVuY3lPclVvTVRvUHJvcGVydHkocHJvcGVydHksIHByb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aCwgdGFibGVDb2x1bW5zLCB0YWJsZUNvbHVtbik7XG5cdFx0XHRcdGNvbnN0IHRpbWV6b25lUHJvcGVydHkgPSBnZXRBc3NvY2lhdGVkVGltZXpvbmVQcm9wZXJ0eShwcm9wZXJ0eSk7XG5cdFx0XHRcdGNvbnN0IHRpbWV6b25lID0gcHJvcGVydHk/LmFubm90YXRpb25zPy5Db21tb24/LlRpbWV6b25lO1xuXHRcdFx0XHRpZiAodGltZXpvbmVQcm9wZXJ0eSkge1xuXHRcdFx0XHRcdGNvbnN0IG9UaW1lem9uZUNvbHVtbiA9IGZpbmRDb2x1bW5CeVBhdGgodGltZXpvbmVQcm9wZXJ0eS5uYW1lLCB0YWJsZUNvbHVtbnMpO1xuXHRcdFx0XHRcdHRhYmxlQ29sdW1uLnRpbWV6b25lID0gb1RpbWV6b25lQ29sdW1uPy5uYW1lO1xuXHRcdFx0XHR9IGVsc2UgaWYgKHRpbWV6b25lKSB7XG5cdFx0XHRcdFx0dGFibGVDb2x1bW4udGltZXpvbmVUZXh0ID0gdGltZXpvbmUudG9TdHJpbmcoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRhZGRUZXh0QXJyYW5nZW50SW5mb1RvUHJvcGVydHkocHJvcGVydHksIHByb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aCwgdGFibGVDb2x1bW5zLCB0YWJsZUNvbHVtbik7XG5cdFx0XHR9XG5cdFx0fVxuXHR9KTtcbn1cblxuLyoqXG4gKiBBZGRzIHRoZSBcInVuaXRcIiBwcm9wZXJ0eSBpbnRvIHRoZSBjb2x1bW5zIHdoZW4gbmVjY2VzYXJ5IGZvciBjb2x1bW5zIHdpdGggdW5pdCBvZiBtZWFzdXJlIGFuZCBjdXJyZW5jaWVzLlxuICogQHBhcmFtIHByb3BlcnR5IFRoZSBwcm9wZXJ0eSByZWZlcmVuY2VkIG9uIHRoZSBjb2x1bW5cbiAqIEBwYXJhbSBkYXRhTW9kZWxPYmplY3RQYXRoIFRoZSBwcm9wZXJ0eSBEYXRhTW9kZWxPYmplY3RQYXRoLlxuICogQHBhcmFtIHRhYmxlQ29sdW1ucyBUaGUgbGlzdCBvZiBjb2x1bW5zIGRpc3BsYXllZCBvbiB0aGUgdGFibGVcbiAqIEBwYXJhbSB0YWJsZUNvbHVtbiBUaGUgdGFibGUgY29sdW1uIHdoaWNoIGFkZHMgdGhlIGN1cnJlbmN5IG9yIHVuaXRcbiAqIEByZXR1cm5zIFRoZSB1cGRhdGVkIHByb3BlcnR5IHdpdGggdGhlIFVvTSBvciBjdXJyZW5jeVxuICovXG5cbmZ1bmN0aW9uIGFkZEN1cnJlbmN5T3JVb01Ub1Byb3BlcnR5KFxuXHRwcm9wZXJ0eTogUHJvcGVydHksXG5cdHByb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aDxQcm9wZXJ0eT4sXG5cdHRhYmxlQ29sdW1uczogVGFibGVDb2x1bW5bXSxcblx0dGFibGVDb2x1bW46IEFubm90YXRpb25UYWJsZUNvbHVtblxuKTogdm9pZCB7XG5cdGNvbnN0IGN1cnJlbmN5T3JVb01Qcm9wZXJ0eSA9IGdldEFzc29jaWF0ZWRDdXJyZW5jeVByb3BlcnR5UGF0aChwcm9wZXJ0eSkgfHwgZ2V0QXNzb2NpYXRlZFVuaXRQcm9wZXJ0eVBhdGgocHJvcGVydHkpO1xuXHRpZiAoY3VycmVuY3lPclVvTVByb3BlcnR5KSB7XG5cdFx0Y29uc3QgY3VycmVuY3lPclVvTVByb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aCA9IGVuaGFuY2VEYXRhTW9kZWxQYXRoPFByb3BlcnR5Pihwcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGgsIGN1cnJlbmN5T3JVb01Qcm9wZXJ0eSk7XG5cdFx0Y29uc3QgY3VycmVuY3lPclVvTVJlbGF0aXZlUGF0aCA9IGdldENvbnRleHRSZWxhdGl2ZVRhcmdldE9iamVjdFBhdGgoY3VycmVuY3lPclVvTVByb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aCk7XG5cdFx0aWYgKGN1cnJlbmN5T3JVb01SZWxhdGl2ZVBhdGgpIHtcblx0XHRcdGNvbnN0IHVuaXRDb2x1bW4gPSBmaW5kQ29sdW1uQnlQYXRoKGN1cnJlbmN5T3JVb01SZWxhdGl2ZVBhdGgsIHRhYmxlQ29sdW1ucyk7XG5cdFx0XHR0YWJsZUNvbHVtbi51bml0ID0gdW5pdENvbHVtbj8ubmFtZTtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0Y29uc3QgdW5pdCA9IHByb3BlcnR5Py5hbm5vdGF0aW9ucz8uTWVhc3VyZXM/LklTT0N1cnJlbmN5IHx8IHByb3BlcnR5Py5hbm5vdGF0aW9ucz8uTWVhc3VyZXM/LlVuaXQ7XG5cdFx0aWYgKHVuaXQpIHtcblx0XHRcdHRhYmxlQ29sdW1uLnVuaXRUZXh0ID0gYCR7dW5pdH1gO1xuXHRcdH1cblx0fVxufVxuXG4vKipcbiAqIEFkZCB0aGUgXCJ0ZXh0QXJyYW5nZW1lbnRcIiBvYmplY3QgdG8gY29sdW1ucyB3aGVuIG5lY2Vzc2FyeSBmb3IgY29sdW1ucyBjb250YWluaW5nIHRleHQsIHN1Y2ggYXMgZGVzY3JpcHRpb25zLlxuICogQHBhcmFtIHByb3BlcnR5IFRoZSBwcm9wZXJ0eSByZWZlcmVuY2VkIGJ5IHRoZSBjb2x1bW5cbiAqIEBwYXJhbSBkYXRhTW9kZWxPYmplY3RQYXRoIFRoZSBwcm9wZXJ0eSBEYXRhTW9kZWxPYmplY3RQYXRoLlxuICogQHBhcmFtIHRhYmxlQ29sdW1ucyBUaGUgbGlzdCBvZiBjb2x1bW5zIGRpc3BsYXllZCBvbiB0aGUgdGFibGVcbiAqIEBwYXJhbSB0YWJsZUNvbHVtbiBUaGUgdGFibGUgY29sdW1uIHdoaWNoIGFkZHMgdGhlIHRleHRcbiAqIEByZXR1cm5zIFRoZSB1cGRhdGVkIHByb3BlcnR5IHdpdGggdGV4dCBhcnJhbmdlbWVudCBpbmZvcm1hdGlvblxuICovXG5cbmZ1bmN0aW9uIGFkZFRleHRBcnJhbmdlbnRJbmZvVG9Qcm9wZXJ0eShcblx0cHJvcGVydHk6IFByb3BlcnR5LFxuXHRwcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGg8UHJvcGVydHk+LFxuXHR0YWJsZUNvbHVtbnM6IFRhYmxlQ29sdW1uW10sXG5cdHRhYmxlQ29sdW1uOiBBbm5vdGF0aW9uVGFibGVDb2x1bW5cbik6IHZvaWQge1xuXHRjb25zdCBkaXNwbGF5TW9kZSA9IGdldERpc3BsYXlNb2RlKHByb3BlcnR5KSxcblx0XHR0ZXh0UHJvcGVydHlQYXRoID0gZ2V0QXNzb2NpYXRlZFRleHRQcm9wZXJ0eVBhdGgocHJvcGVydHkpO1xuXHRpZiAodGV4dFByb3BlcnR5UGF0aCAmJiBkaXNwbGF5TW9kZSAhPT0gXCJWYWx1ZVwiKSB7XG5cdFx0Y29uc3QgdGV4dFByb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aCA9IGVuaGFuY2VEYXRhTW9kZWxQYXRoPFByb3BlcnR5Pihwcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGgsIHRleHRQcm9wZXJ0eVBhdGgpO1xuXHRcdGNvbnN0IHRleHRSZWxhdGl2ZVBhdGggPSBnZXRDb250ZXh0UmVsYXRpdmVUYXJnZXRPYmplY3RQYXRoKHRleHRQcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGgpO1xuXHRcdGlmICh0ZXh0UmVsYXRpdmVQYXRoKSB7XG5cdFx0XHRjb25zdCB0ZXh0Q29sdW1uID0gZmluZENvbHVtbkJ5UGF0aCh0ZXh0UmVsYXRpdmVQYXRoLCB0YWJsZUNvbHVtbnMpO1xuXHRcdFx0aWYgKHRleHRDb2x1bW4gJiYgdGV4dENvbHVtbi5uYW1lICE9PSB0YWJsZUNvbHVtbi5uYW1lKSB7XG5cdFx0XHRcdHRhYmxlQ29sdW1uLnRleHRBcnJhbmdlbWVudCA9IHtcblx0XHRcdFx0XHR0ZXh0UHJvcGVydHk6IHRleHRDb2x1bW4ubmFtZSxcblx0XHRcdFx0XHRtb2RlOiBkaXNwbGF5TW9kZVxuXHRcdFx0XHR9O1xuXHRcdFx0XHQvLyBJZiB0ZXh0IHByb3BlcnRpZXMgYXJlIHVzZWQgYnV0IGhpZGRlbiwgd2UgbXVzdCBpbmNsdWRlIHRoZW0gdG8gdGhlIGV4cG9ydCBhcyB0aGVyZSBhcmUgdXNlZCBpbiB0aGUgcGFzdGVcblx0XHRcdFx0aWYgKCF0ZXh0Q29sdW1uLmV4cG9ydFNldHRpbmdzKSB7XG5cdFx0XHRcdFx0dGV4dENvbHVtbi5leHBvcnRTZXR0aW5ncyA9IHsgdHlwZTogXCJTdHJpbmdcIiB9O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59XG5cbmZ1bmN0aW9uIGdldFNlbWFudGljS2V5c0FuZFRpdGxlSW5mbyhjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4pOiB7XG5cdGhlYWRlckluZm9UaXRsZVBhdGg6IHN0cmluZztcblx0c2VtYW50aWNLZXlDb2x1bW5zOiBzdHJpbmdbXTtcblx0aGVhZGVySW5mb1R5cGVOYW1lOiBQcm9wZXJ0eUFubm90YXRpb25WYWx1ZTxTdHJpbmc+IHwgdW5kZWZpbmVkO1xufSB7XG5cdGNvbnN0IGhlYWRlckluZm9UaXRsZVBhdGggPSAoY29udmVydGVyQ29udGV4dC5nZXRBbm5vdGF0aW9uRW50aXR5VHlwZSgpPy5hbm5vdGF0aW9ucz8uVUk/LkhlYWRlckluZm8/LlRpdGxlIGFzIERhdGFGaWVsZFR5cGVzKT8uVmFsdWVcblx0XHQ/LnBhdGg7XG5cdGNvbnN0IHNlbWFudGljS2V5QW5ub3RhdGlvbnMgPSBjb252ZXJ0ZXJDb250ZXh0LmdldEFubm90YXRpb25FbnRpdHlUeXBlKCk/LmFubm90YXRpb25zPy5Db21tb24/LlNlbWFudGljS2V5O1xuXHRjb25zdCBoZWFkZXJJbmZvVHlwZU5hbWUgPSBjb252ZXJ0ZXJDb250ZXh0Py5nZXRBbm5vdGF0aW9uRW50aXR5VHlwZSgpPy5hbm5vdGF0aW9ucz8uVUk/LkhlYWRlckluZm8/LlR5cGVOYW1lO1xuXHRjb25zdCBzZW1hbnRpY0tleUNvbHVtbnM6IHN0cmluZ1tdID0gW107XG5cdGlmIChzZW1hbnRpY0tleUFubm90YXRpb25zKSB7XG5cdFx0c2VtYW50aWNLZXlBbm5vdGF0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChvQ29sdW1uKSB7XG5cdFx0XHRzZW1hbnRpY0tleUNvbHVtbnMucHVzaChvQ29sdW1uLnZhbHVlKTtcblx0XHR9KTtcblx0fVxuXHRyZXR1cm4geyBoZWFkZXJJbmZvVGl0bGVQYXRoLCBzZW1hbnRpY0tleUNvbHVtbnMsIGhlYWRlckluZm9UeXBlTmFtZSB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVRhYmxlVmlzdWFsaXphdGlvbihcblx0bGluZUl0ZW1Bbm5vdGF0aW9uOiBMaW5lSXRlbSxcblx0dmlzdWFsaXphdGlvblBhdGg6IHN0cmluZyxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+LFxuXHRwYXJhbXM/OiBQYXJ0aWFsPHtcblx0XHRwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbjogUHJlc2VudGF0aW9uVmFyaWFudFR5cGU7XG5cdFx0c2VsZWN0aW9uVmFyaWFudEFubm90YXRpb246IFNlbGVjdGlvblZhcmlhbnRUeXBlO1xuXHRcdGlzQ29uZGVuc2VkVGFibGVMYXlvdXRDb21wbGlhbnQ6IGJvb2xlYW47XG5cdH0+XG4pOiBUYWJsZVZpc3VhbGl6YXRpb24ge1xuXHRjb25zdCB7IHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uLCBpc0NvbmRlbnNlZFRhYmxlTGF5b3V0Q29tcGxpYW50LCBzZWxlY3Rpb25WYXJpYW50QW5ub3RhdGlvbiB9ID0gcGFyYW1zID8/IHt9O1xuXHRjb25zdCB0YWJsZU1hbmlmZXN0Q29uZmlnID0gZ2V0VGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24oXG5cdFx0bGluZUl0ZW1Bbm5vdGF0aW9uLFxuXHRcdHZpc3VhbGl6YXRpb25QYXRoLFxuXHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0aXNDb25kZW5zZWRUYWJsZUxheW91dENvbXBsaWFudCxcblx0XHRzZWxlY3Rpb25WYXJpYW50QW5ub3RhdGlvblxuXHQpO1xuXHRjb25zdCB7IG5hdmlnYXRpb25Qcm9wZXJ0eVBhdGggfSA9IHNwbGl0UGF0aCh2aXN1YWxpemF0aW9uUGF0aCk7XG5cdGNvbnN0IG5hdmlnYXRpb25UYXJnZXRQYXRoID0gZ2V0TmF2aWdhdGlvblRhcmdldFBhdGgoY29udmVydGVyQ29udGV4dCwgbmF2aWdhdGlvblByb3BlcnR5UGF0aCk7XG5cdGNvbnN0IG5hdmlnYXRpb25TZXR0aW5ncyA9IGNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RXcmFwcGVyKCkuZ2V0TmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24obmF2aWdhdGlvblRhcmdldFBhdGgpO1xuXHRjb25zdCBjb2x1bW5zID0gZ2V0VGFibGVDb2x1bW5zKGxpbmVJdGVtQW5ub3RhdGlvbiwgdmlzdWFsaXphdGlvblBhdGgsIGNvbnZlcnRlckNvbnRleHQpO1xuXHRjb25zdCBvcGVyYXRpb25BdmFpbGFibGVNYXAgPSBnZXRPcGVyYXRpb25BdmFpbGFibGVNYXAobGluZUl0ZW1Bbm5vdGF0aW9uLCBjb252ZXJ0ZXJDb250ZXh0KTtcblx0Y29uc3Qgc2VtYW50aWNLZXlzQW5kSGVhZGVySW5mb1RpdGxlID0gZ2V0U2VtYW50aWNLZXlzQW5kVGl0bGVJbmZvKGNvbnZlcnRlckNvbnRleHQpO1xuXHRjb25zdCBzdGFuZGFyZEFjdGlvbnNDb25maWd1cmF0aW9uID0gZ2V0U3RhbmRhcmRBY3Rpb25zQ29uZmlndXJhdGlvbihcblx0XHRsaW5lSXRlbUFubm90YXRpb24sXG5cdFx0dmlzdWFsaXphdGlvblBhdGgsXG5cdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHR0YWJsZU1hbmlmZXN0Q29uZmlnLFxuXHRcdG5hdmlnYXRpb25TZXR0aW5nc1xuXHQpO1xuXHRjb25zdCB0YWJsZUFubm90YXRpb24gPSBnZXRUYWJsZUFubm90YXRpb25Db25maWd1cmF0aW9uKFxuXHRcdGxpbmVJdGVtQW5ub3RhdGlvbixcblx0XHR2aXN1YWxpemF0aW9uUGF0aCxcblx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdHRhYmxlTWFuaWZlc3RDb25maWcsXG5cdFx0Y29sdW1ucyxcblx0XHRuYXZpZ2F0aW9uU2V0dGluZ3MsXG5cdFx0c3RhbmRhcmRBY3Rpb25zQ29uZmlndXJhdGlvbixcblx0XHRwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvblxuXHQpO1xuXHRjb25zdCB0YWJsZUFjdGlvbnMgPSBnZXRUYWJsZUFjdGlvbnMoXG5cdFx0bGluZUl0ZW1Bbm5vdGF0aW9uLFxuXHRcdHZpc3VhbGl6YXRpb25QYXRoLFxuXHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0c3RhbmRhcmRBY3Rpb25zQ29uZmlndXJhdGlvbi5zdGFuZGFyZEFjdGlvbnMsXG5cdFx0bmF2aWdhdGlvblNldHRpbmdzXG5cdCk7XG5cdGNvbnN0IG9wZXJhdGlvbkF2YWlsYWJsZSA9IGdldE9wZXJhdGlvbkF2YWlsYWJsZVByb3BlcnRpZXMob3BlcmF0aW9uQXZhaWxhYmxlTWFwLCBjb252ZXJ0ZXJDb250ZXh0KTtcblx0bGV0IGhlYWRlciA9IHRhYmxlTWFuaWZlc3RDb25maWcuaGVhZGVyO1xuXHRoZWFkZXIgPz89IHRhYmxlQW5ub3RhdGlvbi50aXRsZSA9PT0gXCJcIiA/IHVuZGVmaW5lZCA6IHRhYmxlQW5ub3RhdGlvbi50aXRsZTtcblx0Y29uc3Qgb1Zpc3VhbGl6YXRpb246IFRhYmxlVmlzdWFsaXphdGlvbiA9IHtcblx0XHR0eXBlOiBWaXN1YWxpemF0aW9uVHlwZS5UYWJsZSxcblx0XHRhbm5vdGF0aW9uOiB0YWJsZUFubm90YXRpb24sXG5cdFx0Y29udHJvbDogdGFibGVNYW5pZmVzdENvbmZpZyxcblx0XHRhY3Rpb25zOiB0YWJsZUFjdGlvbnMuYWN0aW9ucyxcblx0XHRjb21tYW5kQWN0aW9uczogdGFibGVBY3Rpb25zLmNvbW1hbmRBY3Rpb25zLFxuXHRcdGNvbHVtbnM6IGNvbHVtbnMsXG5cdFx0b3BlcmF0aW9uQXZhaWxhYmxlTWFwOiBKU09OLnN0cmluZ2lmeShvcGVyYXRpb25BdmFpbGFibGVNYXApLFxuXHRcdG9wZXJhdGlvbkF2YWlsYWJsZVByb3BlcnRpZXM6IG9wZXJhdGlvbkF2YWlsYWJsZSxcblx0XHRoZWFkZXJJbmZvVGl0bGU6IHNlbWFudGljS2V5c0FuZEhlYWRlckluZm9UaXRsZS5oZWFkZXJJbmZvVGl0bGVQYXRoLFxuXHRcdHNlbWFudGljS2V5czogc2VtYW50aWNLZXlzQW5kSGVhZGVySW5mb1RpdGxlLnNlbWFudGljS2V5Q29sdW1ucyxcblx0XHRoZWFkZXJJbmZvVHlwZU5hbWU6IHNlbWFudGljS2V5c0FuZEhlYWRlckluZm9UaXRsZS5oZWFkZXJJbmZvVHlwZU5hbWUsXG5cdFx0ZW5hYmxlJHNlbGVjdDogdHJ1ZSxcblx0XHRlbmFibGUkJGdldEtlZXBBbGl2ZUNvbnRleHQ6IHRydWUsXG5cdFx0aGVhZGVyOiBoZWFkZXIsXG5cdFx0aGVhZGVyVmlzaWJsZTogdGFibGVNYW5pZmVzdENvbmZpZy5oZWFkZXJWaXNpYmxlLFxuXHRcdHJlcXVlc3RBdExlYXN0OiBjcmVhdGVSZXF1ZXN0ZWRQcm9wZXJ0aWVzKGxpbmVJdGVtQW5ub3RhdGlvbiwgY29udmVydGVyQ29udGV4dCwgb3BlcmF0aW9uQXZhaWxhYmxlLCBwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbiksXG5cdFx0aGFuZGxlUGF0Y2hTZW50OiBjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0V3JhcHBlcigpLmdldFRlbXBsYXRlVHlwZSgpICE9PSBUZW1wbGF0ZVR5cGUuTGlzdFJlcG9ydFxuXHR9O1xuXHR1cGRhdGVMaW5rZWRQcm9wZXJ0aWVzKGNvbnZlcnRlckNvbnRleHQsIGNvbHVtbnMpO1xuXHR1cGRhdGVUYWJsZVZpc3VhbGl6YXRpb25Gb3JUeXBlKFxuXHRcdG9WaXN1YWxpemF0aW9uLFxuXHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0QW5ub3RhdGlvbkVudGl0eVR5cGUobGluZUl0ZW1Bbm5vdGF0aW9uKSxcblx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uXG5cdCk7XG5cdHJldHVybiBvVmlzdWFsaXphdGlvbjtcbn1cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVEZWZhdWx0VGFibGVWaXN1YWxpemF0aW9uKFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sXG5cdGlzQmxhbmtUYWJsZT86IGJvb2xlYW5cbik6IFRhYmxlVmlzdWFsaXphdGlvbiB7XG5cdGNvbnN0IHRhYmxlTWFuaWZlc3RDb25maWcgPSBnZXRUYWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbih1bmRlZmluZWQsIFwiXCIsIGNvbnZlcnRlckNvbnRleHQsIGZhbHNlKTtcblx0Y29uc3QgY29sdW1ucyA9IGdldENvbHVtbnNGcm9tRW50aXR5VHlwZShcblx0XHR7fSxcblx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVR5cGUoKSxcblx0XHRbXSxcblx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdHRhYmxlTWFuaWZlc3RDb25maWcudHlwZSxcblx0XHR0YWJsZU1hbmlmZXN0Q29uZmlnLmNyZWF0aW9uTW9kZSxcblx0XHR7fVxuXHQpO1xuXHRjb25zdCBvcGVyYXRpb25BdmFpbGFibGVNYXAgPSBnZXRPcGVyYXRpb25BdmFpbGFibGVNYXAodW5kZWZpbmVkLCBjb252ZXJ0ZXJDb250ZXh0KTtcblx0Y29uc3Qgc2VtYW50aWNLZXlzQW5kSGVhZGVySW5mb1RpdGxlID0gZ2V0U2VtYW50aWNLZXlzQW5kVGl0bGVJbmZvKGNvbnZlcnRlckNvbnRleHQpO1xuXHRjb25zdCBuYXZpZ2F0aW9uVGFyZ2V0UGF0aCA9IGdldE5hdmlnYXRpb25UYXJnZXRQYXRoKGNvbnZlcnRlckNvbnRleHQsIFwiXCIpO1xuXHRjb25zdCBuYXZpZ2F0aW9uU2V0dGluZ3MgPSBjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0V3JhcHBlcigpLmdldE5hdmlnYXRpb25Db25maWd1cmF0aW9uKG5hdmlnYXRpb25UYXJnZXRQYXRoKTtcblx0Y29uc3Qgc3RhbmRhcmRBY3Rpb25zQ29uZmlndXJhdGlvbiA9IGdldFN0YW5kYXJkQWN0aW9uc0NvbmZpZ3VyYXRpb24oXG5cdFx0dW5kZWZpbmVkLFxuXHRcdFwiXCIsXG5cdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHR0YWJsZU1hbmlmZXN0Q29uZmlnLFxuXHRcdG5hdmlnYXRpb25TZXR0aW5nc1xuXHQpO1xuXHRjb25zdCBvVmlzdWFsaXphdGlvbjogVGFibGVWaXN1YWxpemF0aW9uID0ge1xuXHRcdHR5cGU6IFZpc3VhbGl6YXRpb25UeXBlLlRhYmxlLFxuXHRcdGFubm90YXRpb246IGdldFRhYmxlQW5ub3RhdGlvbkNvbmZpZ3VyYXRpb24oXG5cdFx0XHR1bmRlZmluZWQsXG5cdFx0XHRcIlwiLFxuXHRcdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHRcdHRhYmxlTWFuaWZlc3RDb25maWcsXG5cdFx0XHRpc0JsYW5rVGFibGUgPyBbXSA6IGNvbHVtbnMsXG5cdFx0XHRuYXZpZ2F0aW9uU2V0dGluZ3MsXG5cdFx0XHRzdGFuZGFyZEFjdGlvbnNDb25maWd1cmF0aW9uXG5cdFx0KSxcblx0XHRjb250cm9sOiB0YWJsZU1hbmlmZXN0Q29uZmlnLFxuXHRcdGFjdGlvbnM6IFtdLFxuXHRcdGNvbHVtbnM6IGNvbHVtbnMsXG5cdFx0b3BlcmF0aW9uQXZhaWxhYmxlTWFwOiBKU09OLnN0cmluZ2lmeShvcGVyYXRpb25BdmFpbGFibGVNYXApLFxuXHRcdG9wZXJhdGlvbkF2YWlsYWJsZVByb3BlcnRpZXM6IGdldE9wZXJhdGlvbkF2YWlsYWJsZVByb3BlcnRpZXMob3BlcmF0aW9uQXZhaWxhYmxlTWFwLCBjb252ZXJ0ZXJDb250ZXh0KSxcblx0XHRoZWFkZXJJbmZvVGl0bGU6IHNlbWFudGljS2V5c0FuZEhlYWRlckluZm9UaXRsZS5oZWFkZXJJbmZvVGl0bGVQYXRoLFxuXHRcdHNlbWFudGljS2V5czogc2VtYW50aWNLZXlzQW5kSGVhZGVySW5mb1RpdGxlLnNlbWFudGljS2V5Q29sdW1ucyxcblx0XHRoZWFkZXJJbmZvVHlwZU5hbWU6IHNlbWFudGljS2V5c0FuZEhlYWRlckluZm9UaXRsZS5oZWFkZXJJbmZvVHlwZU5hbWUsXG5cdFx0ZW5hYmxlJHNlbGVjdDogdHJ1ZSxcblx0XHRlbmFibGUkJGdldEtlZXBBbGl2ZUNvbnRleHQ6IHRydWUsXG5cdFx0aGVhZGVyOiB0YWJsZU1hbmlmZXN0Q29uZmlnLmhlYWRlcixcblx0XHRoZWFkZXJWaXNpYmxlOiB0YWJsZU1hbmlmZXN0Q29uZmlnLmhlYWRlclZpc2libGUsXG5cdFx0aGFuZGxlUGF0Y2hTZW50OiBjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0V3JhcHBlcigpLmdldFRlbXBsYXRlVHlwZSgpICE9PSBUZW1wbGF0ZVR5cGUuTGlzdFJlcG9ydFxuXHR9O1xuXHR1cGRhdGVMaW5rZWRQcm9wZXJ0aWVzKGNvbnZlcnRlckNvbnRleHQsIGNvbHVtbnMpO1xuXHR1cGRhdGVUYWJsZVZpc3VhbGl6YXRpb25Gb3JUeXBlKG9WaXN1YWxpemF0aW9uLCBjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVR5cGUoKSwgY29udmVydGVyQ29udGV4dCk7XG5cdHJldHVybiBvVmlzdWFsaXphdGlvbjtcbn1cbi8qKlxuICogR2V0cyB0aGUgbWFwIG9mIENvcmUuT3BlcmF0aW9uQXZhaWxhYmxlIHByb3BlcnR5IHBhdGhzIGZvciBhbGwgRGF0YUZpZWxkRm9yQWN0aW9ucy5cbiAqIEBwYXJhbSBsaW5lSXRlbUFubm90YXRpb24gVGhlIGluc3RhbmNlIG9mIHRoZSBsaW5lIGl0ZW1cbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBpbnN0YW5jZSBvZiB0aGUgY29udmVydGVyIGNvbnRleHRcbiAqIEByZXR1cm5zIFRoZSByZWNvcmQgY29udGFpbmluZyBhbGwgYWN0aW9uIG5hbWVzIGFuZCB0aGVpciBjb3JyZXNwb25kaW5nIENvcmUuT3BlcmF0aW9uQXZhaWxhYmxlIHByb3BlcnR5IHBhdGhzXG4gKi9cbmZ1bmN0aW9uIGdldE9wZXJhdGlvbkF2YWlsYWJsZU1hcChcblx0bGluZUl0ZW1Bbm5vdGF0aW9uOiBMaW5lSXRlbSB8IHVuZGVmaW5lZCxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+XG4pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG5cdHJldHVybiBBY3Rpb25IZWxwZXIuZ2V0T3BlcmF0aW9uQXZhaWxhYmxlTWFwKGxpbmVJdGVtQW5ub3RhdGlvbiwgXCJ0YWJsZVwiLCBjb252ZXJ0ZXJDb250ZXh0KTtcbn1cbi8qKlxuICogR2V0cyB1cGRhdGFibGUgcHJvcGVydHlQYXRoIGZvciB0aGUgY3VycmVudCBlbnRpdHlzZXQgaWYgdmFsaWQuXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCBUaGUgaW5zdGFuY2Ugb2YgdGhlIGNvbnZlcnRlciBjb250ZXh0XG4gKiBAcmV0dXJucyBUaGUgdXBkYXRhYmxlIHByb3BlcnR5IGZvciB0aGUgcm93c1xuICovXG5mdW5jdGlvbiBnZXRDdXJyZW50RW50aXR5U2V0VXBkYXRhYmxlUGF0aChjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4pOiBzdHJpbmcge1xuXHRjb25zdCByZXN0cmljdGlvbnMgPSBnZXRSZXN0cmljdGlvbnMoY29udmVydGVyQ29udGV4dCk7XG5cdGNvbnN0IGVudGl0eVNldCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0KCk7XG5cdGNvbnN0IHVwZGF0YWJsZSA9IHJlc3RyaWN0aW9ucy5pc1VwZGF0YWJsZTtcblx0Y29uc3QgaXNPbmx5RHluYW1pY09uQ3VycmVudEVudGl0eSA9ICFpc0NvbnN0YW50KHVwZGF0YWJsZS5leHByZXNzaW9uKSAmJiB1cGRhdGFibGUubmF2aWdhdGlvbkV4cHJlc3Npb24uX3R5cGUgPT09IFwiVW5yZXNvbHZhYmxlXCI7XG5cdGNvbnN0IHVwZGF0YWJsZUV4cHJlc3Npb24gPSBlbnRpdHlTZXQ/LmFubm90YXRpb25zLkNhcGFiaWxpdGllcz8uVXBkYXRlUmVzdHJpY3Rpb25zPy5VcGRhdGFibGU7XG5cdGNvbnN0IHVwZGF0YWJsZVByb3BlcnR5UGF0aCA9IGlzUGF0aEFubm90YXRpb25FeHByZXNzaW9uKHVwZGF0YWJsZUV4cHJlc3Npb24pICYmIHVwZGF0YWJsZUV4cHJlc3Npb24ucGF0aDtcblx0cmV0dXJuIGlzT25seUR5bmFtaWNPbkN1cnJlbnRFbnRpdHkgPyAodXBkYXRhYmxlUHJvcGVydHlQYXRoIGFzIHN0cmluZykgOiBcIlwiO1xufVxuLyoqXG4gKiBNZXRob2QgdG8gcmV0cmlldmUgYWxsIHByb3BlcnR5IHBhdGhzIGFzc2lnbmVkIHRvIHRoZSBDb3JlLk9wZXJhdGlvbkF2YWlsYWJsZSBhbm5vdGF0aW9uLlxuICogQHBhcmFtIG9wZXJhdGlvbkF2YWlsYWJsZU1hcCBUaGUgcmVjb3JkIGNvbnNpc3Rpbmcgb2YgYWN0aW9ucyBhbmQgdGhlaXIgQ29yZS5PcGVyYXRpb25BdmFpbGFibGUgcHJvcGVydHkgcGF0aHNcbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBpbnN0YW5jZSBvZiB0aGUgY29udmVydGVyIGNvbnRleHRcbiAqIEByZXR1cm5zIFRoZSBDU1Ygc3RyaW5nIG9mIGFsbCBwcm9wZXJ0eSBwYXRocyBhc3NvY2lhdGVkIHdpdGggdGhlIENvcmUuT3BlcmF0aW9uQXZhaWxhYmxlIGFubm90YXRpb25cbiAqL1xuZnVuY3Rpb24gZ2V0T3BlcmF0aW9uQXZhaWxhYmxlUHJvcGVydGllcyhcblx0b3BlcmF0aW9uQXZhaWxhYmxlTWFwOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+XG4pOiBzdHJpbmcge1xuXHRjb25zdCBwcm9wZXJ0aWVzID0gbmV3IFNldCgpO1xuXHRmb3IgKGNvbnN0IGFjdGlvbk5hbWUgaW4gb3BlcmF0aW9uQXZhaWxhYmxlTWFwKSB7XG5cdFx0Y29uc3QgcHJvcGVydHlOYW1lID0gb3BlcmF0aW9uQXZhaWxhYmxlTWFwW2FjdGlvbk5hbWVdO1xuXHRcdGlmIChwcm9wZXJ0eU5hbWUgPT09IG51bGwpIHtcblx0XHRcdC8vIEFubm90YXRpb24gY29uZmlndXJlZCB3aXRoIGV4cGxpY2l0ICdudWxsJyAoYWN0aW9uIGFkdmVydGlzZW1lbnQgcmVsZXZhbnQpXG5cdFx0XHRwcm9wZXJ0aWVzLmFkZChhY3Rpb25OYW1lKTtcblx0XHR9IGVsc2UgaWYgKHR5cGVvZiBwcm9wZXJ0eU5hbWUgPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdC8vIEFkZCBwcm9wZXJ0eSBwYXRocyBhbmQgbm90IENvbnN0YW50IHZhbHVlcy5cblx0XHRcdHByb3BlcnRpZXMuYWRkKHByb3BlcnR5TmFtZSk7XG5cdFx0fVxuXHR9XG5cdGlmIChwcm9wZXJ0aWVzLnNpemUpIHtcblx0XHQvLyBTb21lIGFjdGlvbnMgaGF2ZSBhbiBvcGVyYXRpb24gYXZhaWxhYmxlIGJhc2VkIG9uIHByb3BlcnR5IC0tPiB3ZSBuZWVkIHRvIGxvYWQgdGhlIEhlYWRlckluZm8uVGl0bGUgcHJvcGVydHlcblx0XHQvLyBzbyB0aGF0IHRoZSBkaWFsb2cgb24gcGFydGlhbCBhY3Rpb25zIGlzIGRpc3BsYXllZCBwcm9wZXJseSAoQkNQIDIxODAyNzE0MjUpXG5cdFx0Y29uc3QgZW50aXR5VHlwZSA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5VHlwZSgpO1xuXHRcdGNvbnN0IHRpdGxlUHJvcGVydHkgPSAoZW50aXR5VHlwZS5hbm5vdGF0aW9ucz8uVUk/LkhlYWRlckluZm8/LlRpdGxlIGFzIERhdGFGaWVsZFR5cGVzKT8uVmFsdWU/LnBhdGg7XG5cdFx0aWYgKHRpdGxlUHJvcGVydHkpIHtcblx0XHRcdHByb3BlcnRpZXMuYWRkKHRpdGxlUHJvcGVydHkpO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gQXJyYXkuZnJvbShwcm9wZXJ0aWVzKS5qb2luKFwiLFwiKTtcbn1cbi8qKlxuICogSXRlcmF0ZXMgb3ZlciB0aGUgRGF0YUZpZWxkRm9yQWN0aW9uIGFuZCBEYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb24gb2YgYSBsaW5lIGl0ZW0gYW5kXG4gKiByZXR1cm5zIGFsbCB0aGUgVUkuSGlkZGVuIGFubm90YXRpb24gZXhwcmVzc2lvbnMuXG4gKiBAcGFyYW0gbGluZUl0ZW1Bbm5vdGF0aW9uIENvbGxlY3Rpb24gb2YgZGF0YSBmaWVsZHMgdXNlZCBmb3IgcmVwcmVzZW50YXRpb24gaW4gYSB0YWJsZSBvciBsaXN0XG4gKiBAcGFyYW0gY3VycmVudEVudGl0eVR5cGUgQ3VycmVudCBlbnRpdHkgdHlwZVxuICogQHBhcmFtIGNvbnRleHREYXRhTW9kZWxPYmplY3RQYXRoIE9iamVjdCBwYXRoIG9mIHRoZSBkYXRhIG1vZGVsXG4gKiBAcmV0dXJucyBBbGwgdGhlIGBVSS5IaWRkZW5gIHBhdGggZXhwcmVzc2lvbnMgZm91bmQgaW4gdGhlIHJlbGV2YW50IGFjdGlvbnNcbiAqL1xuZnVuY3Rpb24gZ2V0VUlIaWRkZW5FeHBGb3JBY3Rpb25zUmVxdWlyaW5nQ29udGV4dChcblx0bGluZUl0ZW1Bbm5vdGF0aW9uOiBMaW5lSXRlbSxcblx0Y3VycmVudEVudGl0eVR5cGU6IEVudGl0eVR5cGUsXG5cdGNvbnRleHREYXRhTW9kZWxPYmplY3RQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoPFBhZ2VDb250ZXh0UGF0aFRhcmdldD5cbik6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPltdIHtcblx0Y29uc3QgYVVpSGlkZGVuUGF0aEV4cHJlc3Npb25zOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj5bXSA9IFtdO1xuXHRsaW5lSXRlbUFubm90YXRpb24uZm9yRWFjaCgoZGF0YUZpZWxkKSA9PiB7XG5cdFx0Ly8gQ2hlY2sgaWYgdGhlIGxpbmVJdGVtIGNvbnRleHQgaXMgdGhlIHNhbWUgYXMgdGhhdCBvZiB0aGUgYWN0aW9uOlxuXHRcdGlmIChcblx0XHRcdChkYXRhRmllbGQuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFjdGlvbiAmJlxuXHRcdFx0XHRkYXRhRmllbGQ/LkFjdGlvblRhcmdldD8uaXNCb3VuZCAmJlxuXHRcdFx0XHRjdXJyZW50RW50aXR5VHlwZSA9PT0gZGF0YUZpZWxkPy5BY3Rpb25UYXJnZXQuc291cmNlRW50aXR5VHlwZSkgfHxcblx0XHRcdChkYXRhRmllbGQuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbiAmJlxuXHRcdFx0XHRkYXRhRmllbGQuUmVxdWlyZXNDb250ZXh0ICYmXG5cdFx0XHRcdGRhdGFGaWVsZD8uSW5saW5lPy52YWx1ZU9mKCkgIT09IHRydWUpXG5cdFx0KSB7XG5cdFx0XHRpZiAodHlwZW9mIGRhdGFGaWVsZC5hbm5vdGF0aW9ucz8uVUk/LkhpZGRlbj8udmFsdWVPZigpID09PSBcIm9iamVjdFwiKSB7XG5cdFx0XHRcdGFVaUhpZGRlblBhdGhFeHByZXNzaW9ucy5wdXNoKGVxdWFsKGdldEhpZGRlbkV4cHJlc3Npb25BdFRhYmxlTGV2ZWwoZGF0YUZpZWxkLCBjb250ZXh0RGF0YU1vZGVsT2JqZWN0UGF0aCksIGZhbHNlKSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9KTtcblx0cmV0dXJuIGFVaUhpZGRlblBhdGhFeHByZXNzaW9ucztcbn1cbi8qKlxuICogVGhpcyBtZXRob2QgaXMgdXNlZCB0byBnZXQgdGhlIGJpbmRpbmcgZXhwcmVzc2lvbiBvZiB0aGUgcGF0aCBvZiBhIERhdGFGaWVsZC5cbiAqIEBwYXJhbSBleHByZXNzaW9uIENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uXG4gKiBAcmV0dXJucyBUaGUgYmluZGluZyBleHByZXNzaW9uXG4gKi9cbmZ1bmN0aW9uIGdldFBhdGhGcm9tQWN0aW9uQW5ub3RhdGlvbihleHByZXNzaW9uOiBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbik6IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIHtcblx0bGV0IHBhdGg6IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uO1xuXHRpZiAoaXNQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb24oZXhwcmVzc2lvbikpIHtcblx0XHRwYXRoID0gZXhwcmVzc2lvbi5wYXRoO1xuXHR9IGVsc2Uge1xuXHRcdHBhdGggPSBleHByZXNzaW9uO1xuXHR9XG5cdHJldHVybiBwYXRoO1xufVxuLyoqXG4gKiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGNoYW5nZSB0aGUgY29udGV4dCBjdXJyZW50bHkgcmVmZXJlbmNlZCBieSB0aGlzIGJpbmRpbmcgYnkgcmVtb3ZpbmcgdGhlIGxhc3QgbmF2aWdhdGlvbiBwcm9wZXJ0eS5cbiAqXG4gKiBJdCBpcyB1c2VkIChzcGVjaWZpY2FsbHkgaW4gdGhpcyBjYXNlKSwgdG8gdHJhbnNmb3JtIGEgYmluZGluZyBtYWRlIGZvciBhIE5hdlByb3AgY29udGV4dCAvTWFpbk9iamVjdC9OYXZQcm9wMS9OYXZQcm9wMixcbiAqIGludG8gYSBiaW5kaW5nIG9uIHRoZSBwcmV2aW91cyBjb250ZXh0IC9NYWluT2JqZWN0L05hdlByb3AxLlxuICogQHBhcmFtIHNvdXJjZSBEYXRhRmllbGRGb3JBY3Rpb24gfCBEYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb24gfCBDdXN0b21BY3Rpb25cbiAqIEBwYXJhbSBjb250ZXh0RGF0YU1vZGVsT2JqZWN0UGF0aCBEYXRhTW9kZWxPYmplY3RQYXRoXG4gKiBAcmV0dXJucyBUaGUgYmluZGluZyBleHByZXNzaW9uXG4gKi9cbmZ1bmN0aW9uIGdldEhpZGRlbkV4cHJlc3Npb25BdFRhYmxlTGV2ZWwoXG5cdHNvdXJjZTogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyxcblx0Y29udGV4dERhdGFNb2RlbE9iamVjdFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGg8UGFnZUNvbnRleHRQYXRoVGFyZ2V0PlxuKTogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPHVua25vd24+IHtcblx0Y29uc3QgZXhwcmVzc2lvbiA9IHNvdXJjZS5hbm5vdGF0aW9ucz8uVUk/LkhpZGRlbiBhcyBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjtcblx0bGV0IHBhdGggPSBnZXRQYXRoRnJvbUFjdGlvbkFubm90YXRpb24oZXhwcmVzc2lvbik7XG5cdGlmICh0eXBlb2YgcGF0aCA9PT0gXCJvYmplY3RcIikge1xuXHRcdHJldHVybiBjb25zdGFudChmYWxzZSk7XG5cdH0gZWxzZSBpZiAodHlwZW9mIHBhdGggPT09IFwic3RyaW5nXCIpIHtcblx0XHRpZiAoXCJ2aXNpYmxlXCIgaW4gc291cmNlKSB7XG5cdFx0XHRwYXRoID0gcGF0aC5zdWJzdHJpbmcoMSwgcGF0aC5sZW5ndGggLSAxKTtcblx0XHR9XG5cdFx0aWYgKHBhdGguaW5kZXhPZihcIi9cIikgPiAwKSB7XG5cdFx0XHQvL2NoZWNrIGlmIHRoZSBuYXZpZ2F0aW9uIHByb3BlcnR5IGlzIGNvcnJlY3Q6XG5cdFx0XHRjb25zdCBzcGxpdFBhdGhGb3JOYXZpZ2F0aW9uUHJvcGVydHkgPSBwYXRoLnNwbGl0KFwiL1wiKTtcblx0XHRcdGNvbnN0IG5hdmlnYXRpb25QYXRoID0gc3BsaXRQYXRoRm9yTmF2aWdhdGlvblByb3BlcnR5WzBdO1xuXHRcdFx0aWYgKFxuXHRcdFx0XHRpc05hdmlnYXRpb25Qcm9wZXJ0eShjb250ZXh0RGF0YU1vZGVsT2JqZWN0UGF0aD8udGFyZ2V0T2JqZWN0KSAmJlxuXHRcdFx0XHRjb250ZXh0RGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRPYmplY3QucGFydG5lciA9PT0gbmF2aWdhdGlvblBhdGhcblx0XHRcdCkge1xuXHRcdFx0XHRyZXR1cm4gcGF0aEluTW9kZWwoc3BsaXRQYXRoRm9yTmF2aWdhdGlvblByb3BlcnR5LnNsaWNlKDEpLmpvaW4oXCIvXCIpKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybiBjb25zdGFudCh0cnVlKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIGNvbnN0YW50KGZhbHNlKTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIGNvbnN0YW50KHRydWUpO1xufVxuLyoqXG4gKiBMb29wIHRocm91Z2ggdGhlIG1hbmlmZXN0IGFjdGlvbnMgYW5kIGNoZWNrIHRoZSBmb2xsb3dpbmc6XG4gKlxuICogSWYgdGhlIGRhdGEgZmllbGQgaXMgYWxzbyByZWZlcmVuY2VkIGFzIGEgY3VzdG9tIGFjdGlvbi5cbiAqIElmIHRoZSB1bmRlcmx5aW5nIG1hbmlmZXN0IGFjdGlvbiBpcyBlaXRoZXIgYSBib3VuZCBhY3Rpb24gb3IgaGFzIHRoZSAnUmVxdWlyZXNDb250ZXh0JyBwcm9wZXJ0eSBzZXQgdG8gdHJ1ZS5cbiAqXG4gKiBJZiBzbywgdGhlICdyZXF1aXJlc1NlbGVjdGlvbicgcHJvcGVydHkgaXMgZm9yY2VkIHRvICd0cnVlJyBpbiB0aGUgbWFuaWZlc3QuXG4gKiBAcGFyYW0gZGF0YUZpZWxkSWQgSWQgb2YgdGhlIERhdGFGaWVsZCBldmFsdWF0ZWRcbiAqIEBwYXJhbSBkYXRhRmllbGQgRGF0YUZpZWxkIGV2YWx1YXRlZFxuICogQHBhcmFtIG1hbmlmZXN0QWN0aW9ucyBUaGUgYWN0aW9ucyBkZWZpbmVkIGluIHRoZSBtYW5pZmVzdFxuICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBEYXRhRmllbGQgaXMgZm91bmQgYW1vbmcgdGhlIG1hbmlmZXN0IGFjdGlvbnNcbiAqL1xuZnVuY3Rpb24gdXBkYXRlTWFuaWZlc3RBY3Rpb25BbmRUYWdJdChcblx0ZGF0YUZpZWxkSWQ6IHN0cmluZyxcblx0ZGF0YUZpZWxkOiBEYXRhRmllbGRGb3JBY3Rpb24gfCBEYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb24sXG5cdG1hbmlmZXN0QWN0aW9uczogUmVjb3JkPHN0cmluZywgQ3VzdG9tQWN0aW9uPlxuKTogYm9vbGVhbiB7XG5cdHJldHVybiBPYmplY3Qua2V5cyhtYW5pZmVzdEFjdGlvbnMpLnNvbWUoKGFjdGlvbktleSkgPT4ge1xuXHRcdGlmIChhY3Rpb25LZXkgPT09IGRhdGFGaWVsZElkKSB7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdChkYXRhRmllbGQgYXMgRGF0YUZpZWxkRm9yQWN0aW9uKT8uQWN0aW9uVGFyZ2V0Py5pc0JvdW5kIHx8XG5cdFx0XHRcdChkYXRhRmllbGQgYXMgRGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uKT8uUmVxdWlyZXNDb250ZXh0XG5cdFx0XHQpIHtcblx0XHRcdFx0bWFuaWZlc3RBY3Rpb25zW2RhdGFGaWVsZElkXS5yZXF1aXJlc1NlbGVjdGlvbiA9IHRydWU7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9KTtcbn1cbi8qKlxuICogTG9vcCB0aHJvdWdoIHRoZSBEYXRhRmllbGRGb3JBY3Rpb24gYW5kIERhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbiBvZiBhIGxpbmUgaXRlbSBhbmRcbiAqIGNoZWNrIHRoZSBmb2xsb3dpbmc6XG4gKiBJZiBhdCBsZWFzdCBvbmUgb2YgdGhlbSBpcyBhbHdheXMgdmlzaWJsZSBpbiB0aGUgdGFibGUgdG9vbGJhciBhbmQgcmVxdWlyZXMgYSBjb250ZXh0XG4gKiBJZiBhbiBhY3Rpb24gaXMgYWxzbyBkZWZpbmVkIGluIHRoZSBtYW5pZmVzdCwgaXQgaXMgc2V0IGFzaWRlIGFuZCB3aWxsIGJlIGNvbnNpZGVyZWRcbiAqIHdoZW4gZ29pbmcgdGhyb3VnaCB0aGUgbWFuaWZlc3QuXG4gKiBAcGFyYW0gbGluZUl0ZW1Bbm5vdGF0aW9uIENvbGxlY3Rpb24gb2YgZGF0YSBmaWVsZHMgZm9yIHJlcHJlc2VudGF0aW9uIGluIGEgdGFibGUgb3IgbGlzdFxuICogQHBhcmFtIG1hbmlmZXN0QWN0aW9ucyBUaGUgYWN0aW9ucyBkZWZpbmVkIGluIHRoZSBtYW5pZmVzdFxuICogQHBhcmFtIGN1cnJlbnRFbnRpdHlUeXBlIEN1cnJlbnQgRW50aXR5IFR5cGVcbiAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGVyZSBpcyBhdCBsZWFzdCAxIGFjdGlvbiB0aGF0IG1lZXRzIHRoZSBjcml0ZXJpYVxuICovXG5mdW5jdGlvbiBoYXNCb3VuZEFjdGlvbnNBbHdheXNWaXNpYmxlSW5Ub29sQmFyKFxuXHRsaW5lSXRlbUFubm90YXRpb246IExpbmVJdGVtLFxuXHRtYW5pZmVzdEFjdGlvbnM6IFJlY29yZDxzdHJpbmcsIEN1c3RvbUFjdGlvbj4sXG5cdGN1cnJlbnRFbnRpdHlUeXBlOiBFbnRpdHlUeXBlXG4pOiBib29sZWFuIHtcblx0cmV0dXJuIGxpbmVJdGVtQW5ub3RhdGlvbi5zb21lKChkYXRhRmllbGQpID0+IHtcblx0XHRpZiAoXG5cdFx0XHQoZGF0YUZpZWxkLiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBY3Rpb24gfHxcblx0XHRcdFx0ZGF0YUZpZWxkLiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb24pICYmXG5cdFx0XHRkYXRhRmllbGQ/LklubGluZT8udmFsdWVPZigpICE9PSB0cnVlICYmXG5cdFx0XHQoZGF0YUZpZWxkLmFubm90YXRpb25zPy5VST8uSGlkZGVuPy52YWx1ZU9mKCkgPT09IGZhbHNlIHx8IGRhdGFGaWVsZC5hbm5vdGF0aW9ucz8uVUk/LkhpZGRlbj8udmFsdWVPZigpID09PSB1bmRlZmluZWQpXG5cdFx0KSB7XG5cdFx0XHRpZiAoZGF0YUZpZWxkLiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBY3Rpb24pIHtcblx0XHRcdFx0Y29uc3QgbWFuaWZlc3RBY3Rpb25JZCA9IGdlbmVyYXRlKFtcIkRhdGFGaWVsZEZvckFjdGlvblwiLCBkYXRhRmllbGQuQWN0aW9uIGFzIHN0cmluZ10pO1xuXHRcdFx0XHQvLyBpZiB0aGUgRGF0YUZpZWxkRm9yQWN0b24gZnJvbSBhbm5vdGF0aW9uIGFsc28gZXhpc3RzIGluIHRoZSBtYW5pZmVzdCwgaXRzIHZpc2liaWxpdHkgd2lsbCBiZSBldmFsdWF0ZWQgbGF0ZXIgb25cblx0XHRcdFx0aWYgKHVwZGF0ZU1hbmlmZXN0QWN0aW9uQW5kVGFnSXQobWFuaWZlc3RBY3Rpb25JZCwgZGF0YUZpZWxkLCBtYW5pZmVzdEFjdGlvbnMpKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdC8vIENoZWNrIGlmIHRoZSBsaW5lSXRlbSBjb250ZXh0IGlzIHRoZSBzYW1lIGFzIHRoYXQgb2YgdGhlIGFjdGlvbjpcblx0XHRcdFx0cmV0dXJuIGRhdGFGaWVsZD8uQWN0aW9uVGFyZ2V0Py5pc0JvdW5kICYmIGN1cnJlbnRFbnRpdHlUeXBlID09PSBkYXRhRmllbGQ/LkFjdGlvblRhcmdldC5zb3VyY2VFbnRpdHlUeXBlO1xuXHRcdFx0fSBlbHNlIGlmIChkYXRhRmllbGQuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbikge1xuXHRcdFx0XHQvLyBpZiB0aGUgRGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uIGZyb20gYW5ub3RhdGlvbiBhbHNvIGV4aXN0cyBpbiB0aGUgbWFuaWZlc3QsIGl0cyB2aXNpYmlsaXR5IHdpbGwgYmUgZXZhbHVhdGVkIGxhdGVyIG9uXG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHR1cGRhdGVNYW5pZmVzdEFjdGlvbkFuZFRhZ0l0KFxuXHRcdFx0XHRcdFx0YERhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbjo6JHtkYXRhRmllbGQuU2VtYW50aWNPYmplY3R9Ojoke2RhdGFGaWVsZC5BY3Rpb259YCxcblx0XHRcdFx0XHRcdGRhdGFGaWVsZCxcblx0XHRcdFx0XHRcdG1hbmlmZXN0QWN0aW9uc1xuXHRcdFx0XHRcdClcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBkYXRhRmllbGQuUmVxdWlyZXNDb250ZXh0O1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH0pO1xufVxuLyoqXG4gKiBDaGVja3MgaWYgYSBjdXN0b20gYWN0aW9uIHRoYXQgcmVxdWlyZXMgYSBjb250ZXh0IGlzIGFsd2F5cyB2aXNpYmxlIGluIHRoZSB0b29sYmFyLlxuICogQHBhcmFtIG1hbmlmZXN0QWN0aW9ucyBUaGUgYWN0aW9ucyBkZWZpbmVkIGluIHRoZSBtYW5pZmVzdFxuICogQHJldHVybnMgYHRydWVgIGlmIHRoZXJlIGlzIGF0IGxlYXN0IDEgYWN0aW9uIHRoYXQgbWVldHMgdGhlIGNyaXRlcmlhXG4gKi9cbmZ1bmN0aW9uIGhhc0N1c3RvbUFjdGlvbnNBbHdheXNWaXNpYmxlSW5Ub29sQmFyKG1hbmlmZXN0QWN0aW9uczogUmVjb3JkPHN0cmluZywgQ3VzdG9tQWN0aW9uPik6IGJvb2xlYW4ge1xuXHRjb25zdCBjdXN0b21BY3Rpb25zID0gT2JqZWN0LmtleXMobWFuaWZlc3RBY3Rpb25zKS5yZWR1Y2UoKGFjdGlvbnM6IEN1c3RvbUFjdGlvbltdLCBhY3Rpb25LZXkpID0+IHtcblx0XHRjb25zdCBhY3Rpb24gPSBtYW5pZmVzdEFjdGlvbnNbYWN0aW9uS2V5XTtcblx0XHRpZiAoIWFjdGlvbi5tZW51KSB7XG5cdFx0XHQvL3NpbXBsZSBjdXN0b20gYWN0aW9uXG5cdFx0XHRhY3Rpb25zLnB1c2goYWN0aW9uKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gZ3JvdXBlZCBhY3Rpb25zXG5cdFx0XHRhY3Rpb25zID0gWy4uLmFjdGlvbnMsIC4uLihhY3Rpb24ubWVudS5maWx0ZXIoKG1lbnVBY3Rpb24pID0+IHR5cGVvZiBtZW51QWN0aW9uICE9PSBcInN0cmluZ1wiKSBhcyBDdXN0b21BY3Rpb25bXSldO1xuXHRcdH1cblx0XHRyZXR1cm4gYWN0aW9ucztcblx0fSwgW10pO1xuXHRyZXR1cm4gISFjdXN0b21BY3Rpb25zLmZpbmQoXG5cdFx0KGFjdGlvbikgPT4gYWN0aW9uLnJlcXVpcmVzU2VsZWN0aW9uICYmIChhY3Rpb24udmlzaWJsZSA9PT0gdW5kZWZpbmVkIHx8IGFjdGlvbi52aXNpYmxlPy50b1N0cmluZygpID09PSBcInRydWVcIilcblx0KTtcbn1cbi8qKlxuICogSXRlcmF0ZXMgb3ZlciB0aGUgY3VzdG9tIGFjdGlvbnMgKHdpdGgga2V5IHJlcXVpcmVzU2VsZWN0aW9uKSBkZWNsYXJlZCBpbiB0aGUgbWFuaWZlc3QgZm9yIHRoZSBjdXJyZW50IGxpbmUgaXRlbSBhbmQgcmV0dXJucyBhbGwgdGhlXG4gKiB2aXNpYmxlIGtleSB2YWx1ZXMgYXMgYW4gZXhwcmVzc2lvbi5cbiAqIEBwYXJhbSBtYW5pZmVzdEFjdGlvbnMgVGhlIGFjdGlvbnMgZGVmaW5lZCBpbiB0aGUgbWFuaWZlc3RcbiAqIEByZXR1cm5zIEFycmF5PEV4cHJlc3Npb248Ym9vbGVhbj4+IEFsbCB0aGUgdmlzaWJsZSBwYXRoIGV4cHJlc3Npb25zIG9mIHRoZSBhY3Rpb25zIHRoYXQgbWVldCB0aGUgY3JpdGVyaWFcbiAqL1xuZnVuY3Rpb24gZ2V0VmlzaWJsZUV4cEZvckN1c3RvbUFjdGlvbnNSZXF1aXJpbmdDb250ZXh0KG1hbmlmZXN0QWN0aW9uczogUmVjb3JkPHN0cmluZywgQ3VzdG9tQWN0aW9uPik6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPltdIHtcblx0Y29uc3QgYVZpc2libGVQYXRoRXhwcmVzc2lvbnM6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPltdID0gW107XG5cdGlmIChtYW5pZmVzdEFjdGlvbnMpIHtcblx0XHRPYmplY3Qua2V5cyhtYW5pZmVzdEFjdGlvbnMpLmZvckVhY2goKGFjdGlvbktleSkgPT4ge1xuXHRcdFx0Y29uc3QgYWN0aW9uID0gbWFuaWZlc3RBY3Rpb25zW2FjdGlvbktleV07XG5cdFx0XHRpZiAoYWN0aW9uLnJlcXVpcmVzU2VsZWN0aW9uID09PSB0cnVlICYmIGFjdGlvbi52aXNpYmxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0aWYgKHR5cGVvZiBhY3Rpb24udmlzaWJsZSA9PT0gXCJzdHJpbmdcIikge1xuXHRcdFx0XHRcdC8qVGhlIGZpbmFsIGFpbSB3b3VsZCBiZSB0byBjaGVjayBpZiB0aGUgcGF0aCBleHByZXNzaW9uIGRlcGVuZHMgb24gdGhlIHBhcmVudCBjb250ZXh0XG5cdFx0XHRcdFx0YW5kIGNvbnNpZGVycyBvbmx5IHRob3NlIGV4cHJlc3Npb25zIGZvciB0aGUgZXhwcmVzc2lvbiBldmFsdWF0aW9uLFxuXHRcdFx0XHRcdGJ1dCBjdXJyZW50bHkgbm90IHBvc3NpYmxlIGZyb20gdGhlIG1hbmlmZXN0IGFzIHRoZSB2aXNpYmxlIGtleSBpcyBib3VuZCBvbiB0aGUgcGFyZW50IGVudGl0eS5cblx0XHRcdFx0XHRUcmlja3kgdG8gZGlmZmVyZW50aWF0ZSB0aGUgcGF0aCBhcyBpdCdzIGRvbmUgZm9yIHRoZSBIaWRkZW4gYW5ub3RhdGlvbi5cblx0XHRcdFx0XHRGb3IgdGhlIHRpbWUgYmVpbmcgd2UgY29uc2lkZXIgYWxsIHRoZSBwYXRocyBvZiB0aGUgbWFuaWZlc3QqL1xuXHRcdFx0XHRcdGFWaXNpYmxlUGF0aEV4cHJlc3Npb25zLnB1c2gocmVzb2x2ZUJpbmRpbmdTdHJpbmcoYWN0aW9uPy52aXNpYmxlPy52YWx1ZU9mKCkpKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cdHJldHVybiBhVmlzaWJsZVBhdGhFeHByZXNzaW9ucztcbn1cbi8qKlxuICogRXZhbHVhdGUgaWYgdGhlIHBhdGggaXMgc3RhdGljYWxseSBkZWxldGFibGUgb3IgdXBkYXRhYmxlLlxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHRcbiAqIEByZXR1cm5zIFRoZSB0YWJsZSBjYXBhYmlsaXRpZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENhcGFiaWxpdHlSZXN0cmljdGlvbihjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4pOiBUYWJsZUNhcGFiaWxpdHlSZXN0cmljdGlvbiB7XG5cdGNvbnN0IGlzRGVsZXRhYmxlID0gaXNQYXRoRGVsZXRhYmxlKGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpKTtcblx0Y29uc3QgaXNVcGRhdGFibGUgPSBpc1BhdGhVcGRhdGFibGUoY29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCkpO1xuXHRyZXR1cm4ge1xuXHRcdGlzRGVsZXRhYmxlOiAhKGlzQ29uc3RhbnQoaXNEZWxldGFibGUpICYmIGlzRGVsZXRhYmxlLnZhbHVlID09PSBmYWxzZSksXG5cdFx0aXNVcGRhdGFibGU6ICEoaXNDb25zdGFudChpc1VwZGF0YWJsZSkgJiYgaXNVcGRhdGFibGUudmFsdWUgPT09IGZhbHNlKVxuXHR9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldFNlbGVjdGlvbk1vZGUoXG5cdGxpbmVJdGVtQW5ub3RhdGlvbjogTGluZUl0ZW0gfCB1bmRlZmluZWQsXG5cdHZpc3VhbGl6YXRpb25QYXRoOiBzdHJpbmcsXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pixcblx0aXNFbnRpdHlTZXQ6IGJvb2xlYW4sXG5cdHRhcmdldENhcGFiaWxpdGllczogVGFibGVDYXBhYmlsaXR5UmVzdHJpY3Rpb24sXG5cdGRlbGV0ZUJ1dHRvblZpc2liaWxpdHlFeHByZXNzaW9uPzogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+LFxuXHRtYXNzRWRpdFZpc2liaWxpdHlFeHByZXNzaW9uOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj4gPSBjb25zdGFudChmYWxzZSksXG5cdGN1dEJ1dHRvblZpc2liaWxpdHlFeHByZXNzaW9uOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj4gPSBjb25zdGFudChmYWxzZSlcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdGNvbnN0IHRhYmxlTWFuaWZlc3RTZXR0aW5ncyA9IGNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RDb250cm9sQ29uZmlndXJhdGlvbjxUYWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbj4odmlzdWFsaXphdGlvblBhdGgpO1xuXHRjb25zdCB0YWJsZVR5cGUgPSB0YWJsZU1hbmlmZXN0U2V0dGluZ3MudGFibGVTZXR0aW5ncz8udHlwZTtcblx0bGV0IHNlbGVjdGlvbk1vZGUgPSB0YWJsZU1hbmlmZXN0U2V0dGluZ3MudGFibGVTZXR0aW5ncz8uc2VsZWN0aW9uTW9kZTtcblxuXHQvLyBUaGUgY29sbGFwc2UvRXhwYW5kIGFjdGlvbiBvZiBhIHRyZWUgdGFibGUgaXMgYSBib3VuZCBhY3Rpb24sIGFzIGEgcmVzdWx0LCBhIHRyZWUgdGFibGUgc2hvdWxkIGFsd2F5cyBoYXZlIGEgc2VsZWN0aW9uIG1vZGUgdG8gXCJNdWx0aVwiIHdoZW4gbm8gc2VsZWN0aW9uTW9kZSBoYXMgYmVlbiBzZXQgaW4gdGhlIG1hbmlmZXN0XG5cdGlmICh0YWJsZVR5cGUgPT09IFwiVHJlZVRhYmxlXCIgJiYgIXNlbGVjdGlvbk1vZGUpIHtcblx0XHRyZXR1cm4gU2VsZWN0aW9uTW9kZS5NdWx0aTtcblx0fVxuXG5cdC8vIElmIHRoZSBzZWxlY3Rpb24gbW9kZSBpcyBmb3JjZWQgdG8gJ05vbmUnIGluIHRoZSBtYW5pZmVzdC9tYWNybyB0YWJsZSBwYXJhbWV0ZXJzLCB3ZSBrZWVwIGl0IHVubGVzcyBoZXJlIGlzIGEgZGVsZXRlIGJ1dHRvblxuXHRpZiAoIWxpbmVJdGVtQW5ub3RhdGlvbiB8fCBzZWxlY3Rpb25Nb2RlID09PSBTZWxlY3Rpb25Nb2RlLk5vbmUpIHtcblx0XHRpZiAodGFyZ2V0Q2FwYWJpbGl0aWVzLmlzRGVsZXRhYmxlICYmIGRlbGV0ZUJ1dHRvblZpc2liaWxpdHlFeHByZXNzaW9uKSB7XG5cdFx0XHRyZXR1cm4gY29tcGlsZUV4cHJlc3Npb24oaWZFbHNlKGRlbGV0ZUJ1dHRvblZpc2liaWxpdHlFeHByZXNzaW9uLCBjb25zdGFudChTZWxlY3Rpb25Nb2RlLk11bHRpKSwgY29uc3RhbnQoU2VsZWN0aW9uTW9kZS5Ob25lKSkpO1xuXHRcdH1cblx0XHRyZXR1cm4gU2VsZWN0aW9uTW9kZS5Ob25lO1xuXHR9XG5cdGlmIChzZWxlY3Rpb25Nb2RlID09PSBTZWxlY3Rpb25Nb2RlLkZvcmNlTXVsdGkpIHtcblx0XHRyZXR1cm4gU2VsZWN0aW9uTW9kZS5NdWx0aTtcblx0fSBlbHNlIGlmIChzZWxlY3Rpb25Nb2RlID09PSBTZWxlY3Rpb25Nb2RlLkZvcmNlU2luZ2xlKSB7XG5cdFx0cmV0dXJuIFNlbGVjdGlvbk1vZGUuU2luZ2xlO1xuXHR9XG5cdGxldCBhSGlkZGVuQmluZGluZ0V4cHJlc3Npb25zOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj5bXSA9IFtdLFxuXHRcdGFWaXNpYmxlQmluZGluZ0V4cHJlc3Npb25zOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj5bXSA9IFtdO1xuXHRjb25zdCBtYW5pZmVzdEFjdGlvbnMgPSBnZXRBY3Rpb25zRnJvbU1hbmlmZXN0KFxuXHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RDb250cm9sQ29uZmlndXJhdGlvbjxUYWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbj4odmlzdWFsaXphdGlvblBhdGgpLmFjdGlvbnMsXG5cdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHRbXSxcblx0XHR1bmRlZmluZWQsXG5cdFx0ZmFsc2Vcblx0KTtcblx0bGV0IGlzUGFyZW50RGVsZXRhYmxlLCBwYXJlbnRFbnRpdHlTZXREZWxldGFibGU7XG5cdGlmIChjb252ZXJ0ZXJDb250ZXh0LmdldFRlbXBsYXRlVHlwZSgpID09PSBUZW1wbGF0ZVR5cGUuT2JqZWN0UGFnZSkge1xuXHRcdGlzUGFyZW50RGVsZXRhYmxlID0gaXNQYXRoRGVsZXRhYmxlKGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpKTtcblx0XHRwYXJlbnRFbnRpdHlTZXREZWxldGFibGUgPSBpc1BhcmVudERlbGV0YWJsZSA/IGNvbXBpbGVFeHByZXNzaW9uKGlzUGFyZW50RGVsZXRhYmxlLCB0cnVlKSA6IGlzUGFyZW50RGVsZXRhYmxlO1xuXHR9XG5cdGNvbnN0IGJNYXNzRWRpdEVuYWJsZWQ6IGJvb2xlYW4gPSAhaXNDb25zdGFudChtYXNzRWRpdFZpc2liaWxpdHlFeHByZXNzaW9uKSB8fCBtYXNzRWRpdFZpc2liaWxpdHlFeHByZXNzaW9uLnZhbHVlICE9PSBmYWxzZTtcblx0aWYgKCFzZWxlY3Rpb25Nb2RlIHx8IHNlbGVjdGlvbk1vZGUgPT09IFNlbGVjdGlvbk1vZGUuQXV0bykge1xuXHRcdHNlbGVjdGlvbk1vZGUgPSBTZWxlY3Rpb25Nb2RlLk11bHRpO1xuXHR9XG5cdGlmIChiTWFzc0VkaXRFbmFibGVkKSB7XG5cdFx0Ly8gT3ZlcnJpZGUgZGVmYXVsdCBzZWxlY3Rpb24gbW9kZSB3aGVuIG1hc3MgZWRpdCBpcyB2aXNpYmxlXG5cdFx0c2VsZWN0aW9uTW9kZSA9IHNlbGVjdGlvbk1vZGUgPT09IFNlbGVjdGlvbk1vZGUuU2luZ2xlID8gU2VsZWN0aW9uTW9kZS5TaW5nbGUgOiBTZWxlY3Rpb25Nb2RlLk11bHRpO1xuXHR9XG5cdGlmIChcblx0XHRoYXNCb3VuZEFjdGlvbnNBbHdheXNWaXNpYmxlSW5Ub29sQmFyKGxpbmVJdGVtQW5ub3RhdGlvbiwgbWFuaWZlc3RBY3Rpb25zLmFjdGlvbnMsIGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5VHlwZSgpKSB8fFxuXHRcdGhhc0N1c3RvbUFjdGlvbnNBbHdheXNWaXNpYmxlSW5Ub29sQmFyKG1hbmlmZXN0QWN0aW9ucy5hY3Rpb25zKVxuXHQpIHtcblx0XHRyZXR1cm4gc2VsZWN0aW9uTW9kZTtcblx0fVxuXHRhSGlkZGVuQmluZGluZ0V4cHJlc3Npb25zID0gZ2V0VUlIaWRkZW5FeHBGb3JBY3Rpb25zUmVxdWlyaW5nQ29udGV4dChcblx0XHRsaW5lSXRlbUFubm90YXRpb24sXG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlUeXBlKCksXG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKClcblx0KTtcblx0YVZpc2libGVCaW5kaW5nRXhwcmVzc2lvbnMgPSBnZXRWaXNpYmxlRXhwRm9yQ3VzdG9tQWN0aW9uc1JlcXVpcmluZ0NvbnRleHQobWFuaWZlc3RBY3Rpb25zLmFjdGlvbnMpO1xuXHQvLyBObyBhY3Rpb24gcmVxdWlyaW5nIGEgY29udGV4dDpcblx0aWYgKFxuXHRcdGFIaWRkZW5CaW5kaW5nRXhwcmVzc2lvbnMubGVuZ3RoID09PSAwICYmXG5cdFx0YVZpc2libGVCaW5kaW5nRXhwcmVzc2lvbnMubGVuZ3RoID09PSAwICYmXG5cdFx0KGN1dEJ1dHRvblZpc2liaWxpdHlFeHByZXNzaW9uIHx8IGRlbGV0ZUJ1dHRvblZpc2liaWxpdHlFeHByZXNzaW9uIHx8IGJNYXNzRWRpdEVuYWJsZWQpXG5cdCkge1xuXHRcdGlmICghaXNFbnRpdHlTZXQpIHtcblx0XHRcdC8vIEV4YW1wbGU6IE9QIGNhc2Vcblx0XHRcdGlmICh0YXJnZXRDYXBhYmlsaXRpZXMuaXNEZWxldGFibGUgfHwgcGFyZW50RW50aXR5U2V0RGVsZXRhYmxlICE9PSBcImZhbHNlXCIgfHwgYk1hc3NFZGl0RW5hYmxlZCkge1xuXHRcdFx0XHQvLyBCdWlsZGluZyBleHByZXNzaW9uIGZvciBkZWxldGUgYW5kIG1hc3MgZWRpdFxuXHRcdFx0XHRjb25zdCBidXR0b25WaXNpYmlsaXR5RXhwcmVzc2lvbiA9IG9yKFxuXHRcdFx0XHRcdGN1dEJ1dHRvblZpc2liaWxpdHlFeHByZXNzaW9uIHx8IHRydWUsXG5cdFx0XHRcdFx0ZGVsZXRlQnV0dG9uVmlzaWJpbGl0eUV4cHJlc3Npb24gfHwgdHJ1ZSwgLy8gZGVmYXVsdCBkZWxldGUgdmlzaWJpbGl0eSBhcyB0cnVlXG5cdFx0XHRcdFx0bWFzc0VkaXRWaXNpYmlsaXR5RXhwcmVzc2lvblxuXHRcdFx0XHQpO1xuXHRcdFx0XHRyZXR1cm4gY29tcGlsZUV4cHJlc3Npb24oXG5cdFx0XHRcdFx0aWZFbHNlKGFuZChVSS5Jc0VkaXRhYmxlLCBidXR0b25WaXNpYmlsaXR5RXhwcmVzc2lvbiksIGNvbnN0YW50KHNlbGVjdGlvbk1vZGUpLCBjb25zdGFudChTZWxlY3Rpb25Nb2RlLk5vbmUpKVxuXHRcdFx0XHQpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmV0dXJuIGNvbXBpbGVFeHByZXNzaW9uKFxuXHRcdFx0XHRcdGlmRWxzZShjdXRCdXR0b25WaXNpYmlsaXR5RXhwcmVzc2lvbiwgY29uc3RhbnQoU2VsZWN0aW9uTW9kZS5TaW5nbGUpLCBjb25zdGFudChTZWxlY3Rpb25Nb2RlLk5vbmUpKVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdFx0Ly8gRW50aXR5U2V0IGRlbGV0YWJsZTpcblx0XHR9IGVsc2UgaWYgKGJNYXNzRWRpdEVuYWJsZWQpIHtcblx0XHRcdC8vIGV4YW1wbGU6IExSIHNjZW5hcmlvXG5cdFx0XHRyZXR1cm4gc2VsZWN0aW9uTW9kZTtcblx0XHR9IGVsc2UgaWYgKHRhcmdldENhcGFiaWxpdGllcy5pc0RlbGV0YWJsZSAmJiBkZWxldGVCdXR0b25WaXNpYmlsaXR5RXhwcmVzc2lvbikge1xuXHRcdFx0cmV0dXJuIGNvbXBpbGVFeHByZXNzaW9uKGlmRWxzZShkZWxldGVCdXR0b25WaXNpYmlsaXR5RXhwcmVzc2lvbiwgY29uc3RhbnQoc2VsZWN0aW9uTW9kZSksIGNvbnN0YW50KFNlbGVjdGlvbk1vZGUuTm9uZSkpKTtcblx0XHRcdC8vIEVudGl0eVNldCBub3QgZGVsZXRhYmxlOlxuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gU2VsZWN0aW9uTW9kZS5Ob25lO1xuXHRcdH1cblx0XHQvLyBUaGVyZSBhcmUgYWN0aW9ucyByZXF1aXJpbmcgYSBjb250ZXh0OlxuXHR9IGVsc2UgaWYgKCFpc0VudGl0eVNldCkge1xuXHRcdC8vIEV4YW1wbGU6IE9QIGNhc2Vcblx0XHRpZiAodGFyZ2V0Q2FwYWJpbGl0aWVzLmlzRGVsZXRhYmxlIHx8IHBhcmVudEVudGl0eVNldERlbGV0YWJsZSAhPT0gXCJmYWxzZVwiIHx8IGJNYXNzRWRpdEVuYWJsZWQpIHtcblx0XHRcdC8vIFVzZSBzZWxlY3Rpb25Nb2RlIGluIGVkaXQgbW9kZSBpZiBkZWxldGUgaXMgZW5hYmxlZCBvciBtYXNzIGVkaXQgaXMgdmlzaWJsZVxuXHRcdFx0Y29uc3QgZWRpdE1vZGVidXR0b25WaXNpYmlsaXR5RXhwcmVzc2lvbiA9IGlmRWxzZShcblx0XHRcdFx0Yk1hc3NFZGl0RW5hYmxlZCAmJiAhdGFyZ2V0Q2FwYWJpbGl0aWVzLmlzRGVsZXRhYmxlLFxuXHRcdFx0XHRtYXNzRWRpdFZpc2liaWxpdHlFeHByZXNzaW9uLFxuXHRcdFx0XHRjb25zdGFudCh0cnVlKVxuXHRcdFx0KTtcblx0XHRcdHJldHVybiBjb21waWxlRXhwcmVzc2lvbihcblx0XHRcdFx0aWZFbHNlKFxuXHRcdFx0XHRcdGFuZChVSS5Jc0VkaXRhYmxlLCBlZGl0TW9kZWJ1dHRvblZpc2liaWxpdHlFeHByZXNzaW9uKSxcblx0XHRcdFx0XHRjb25zdGFudChzZWxlY3Rpb25Nb2RlKSxcblx0XHRcdFx0XHRpZkVsc2UoXG5cdFx0XHRcdFx0XHRvciguLi5hSGlkZGVuQmluZGluZ0V4cHJlc3Npb25zLmNvbmNhdChhVmlzaWJsZUJpbmRpbmdFeHByZXNzaW9ucykpLFxuXHRcdFx0XHRcdFx0Y29uc3RhbnQoc2VsZWN0aW9uTW9kZSksXG5cdFx0XHRcdFx0XHRjb25zdGFudChTZWxlY3Rpb25Nb2RlLk5vbmUpXG5cdFx0XHRcdFx0KVxuXHRcdFx0XHQpXG5cdFx0XHQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gY29tcGlsZUV4cHJlc3Npb24oXG5cdFx0XHRcdGlmRWxzZShcblx0XHRcdFx0XHRvciguLi5hSGlkZGVuQmluZGluZ0V4cHJlc3Npb25zLmNvbmNhdChhVmlzaWJsZUJpbmRpbmdFeHByZXNzaW9ucykpLFxuXHRcdFx0XHRcdGNvbnN0YW50KHNlbGVjdGlvbk1vZGUpLFxuXHRcdFx0XHRcdGNvbnN0YW50KFNlbGVjdGlvbk1vZGUuTm9uZSlcblx0XHRcdFx0KVxuXHRcdFx0KTtcblx0XHR9XG5cdFx0Ly9FbnRpdHlTZXQgZGVsZXRhYmxlOlxuXHR9IGVsc2UgaWYgKHRhcmdldENhcGFiaWxpdGllcy5pc0RlbGV0YWJsZSB8fCBiTWFzc0VkaXRFbmFibGVkKSB7XG5cdFx0Ly8gRXhhbXBsZTogTFIgc2NlbmFyaW9cblx0XHRyZXR1cm4gc2VsZWN0aW9uTW9kZTtcblx0XHQvL0VudGl0eVNldCBub3QgZGVsZXRhYmxlOlxuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBjb21waWxlRXhwcmVzc2lvbihcblx0XHRcdGlmRWxzZShcblx0XHRcdFx0b3IoLi4uYUhpZGRlbkJpbmRpbmdFeHByZXNzaW9ucy5jb25jYXQoYVZpc2libGVCaW5kaW5nRXhwcmVzc2lvbnMpLCBtYXNzRWRpdFZpc2liaWxpdHlFeHByZXNzaW9uKSxcblx0XHRcdFx0Y29uc3RhbnQoc2VsZWN0aW9uTW9kZSksXG5cdFx0XHRcdGNvbnN0YW50KFNlbGVjdGlvbk1vZGUuTm9uZSlcblx0XHRcdClcblx0XHQpO1xuXHR9XG59XG5cbi8qKlxuICogTWV0aG9kIHRvIHJldHJpZXZlIGFsbCB0YWJsZSBhY3Rpb25zIGZyb20gYW5ub3RhdGlvbnMuXG4gKiBAcGFyYW0gbGluZUl0ZW1Bbm5vdGF0aW9uXG4gKiBAcGFyYW0gdmlzdWFsaXphdGlvblBhdGhcbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcmV0dXJucyBUaGUgdGFibGUgYW5ub3RhdGlvbiBhY3Rpb25zXG4gKi9cbmZ1bmN0aW9uIGdldFRhYmxlQW5ub3RhdGlvbkFjdGlvbnMoXG5cdGxpbmVJdGVtQW5ub3RhdGlvbjogTGluZUl0ZW0sXG5cdHZpc3VhbGl6YXRpb25QYXRoOiBzdHJpbmcsXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0PlxuKTogeyB0YWJsZUFjdGlvbnM6IEFycmF5PEFubm90YXRpb25BY3Rpb24gfCBBbm5vdGF0aW9uQWN0aW9uR3JvdXA+IH0ge1xuXHRjb25zdCB0YWJsZUFjdGlvbnM6IEFycmF5PEFubm90YXRpb25BY3Rpb24gfCBBbm5vdGF0aW9uQWN0aW9uR3JvdXA+ID0gW107XG5cdGNvbnN0IGNvcHlEYXRhRmllbGQgPSBnZXRDb3B5QWN0aW9uKFxuXHRcdGxpbmVJdGVtQW5ub3RhdGlvbi5maWx0ZXIoKGRhdGFGaWVsZCkgPT4ge1xuXHRcdFx0cmV0dXJuIGRhdGFGaWVsZElzQ29weUFjdGlvbihkYXRhRmllbGQgYXMgRGF0YUZpZWxkRm9yQWN0aW9uVHlwZXMpO1xuXHRcdH0pIGFzIERhdGFGaWVsZEZvckFjdGlvblR5cGVzW11cblx0KTtcblx0aWYgKGNvcHlEYXRhRmllbGQpIHtcblx0XHR0YWJsZUFjdGlvbnMucHVzaCh7XG5cdFx0XHR0eXBlOiBBY3Rpb25UeXBlLkNvcHksXG5cdFx0XHRhbm5vdGF0aW9uUGF0aDogY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlTZXRCYXNlZEFubm90YXRpb25QYXRoKGNvcHlEYXRhRmllbGQuZnVsbHlRdWFsaWZpZWROYW1lKSxcblx0XHRcdGtleTogS2V5SGVscGVyLmdlbmVyYXRlS2V5RnJvbURhdGFGaWVsZChjb3B5RGF0YUZpZWxkKSxcblx0XHRcdHZpc2libGU6IGNvbXBpbGVFeHByZXNzaW9uKHZpc2libGVFeHByZXNzaW9uKGNvcHlEYXRhRmllbGQsIGNvbnZlcnRlckNvbnRleHQpKSxcblx0XHRcdHZpc2libGVGb3JDb250ZXh0TWVudTogY29tcGlsZUV4cHJlc3Npb24odmlzaWJsZUZvckNvbnRleHRNZW51RXhwcmVzc2lvbihjb3B5RGF0YUZpZWxkLCBjb252ZXJ0ZXJDb250ZXh0KSksXG5cdFx0XHR0ZXh0OiBjb3B5RGF0YUZpZWxkLkxhYmVsPy50b1N0cmluZygpID8/IExpYnJhcnkuZ2V0UmVzb3VyY2VCdW5kbGVGb3IoXCJzYXAuZmUuY29yZVwiKSEuZ2V0VGV4dChcIkNfQ09NTU9OX0NPUFlcIiksXG5cdFx0XHRpc05hdmlnYWJsZTogdHJ1ZVxuXHRcdH0pO1xuXHR9XG5cdGxpbmVJdGVtQW5ub3RhdGlvblxuXHRcdC5maWx0ZXIoKGRhdGFGaWVsZCkgPT4ge1xuXHRcdFx0cmV0dXJuICFkYXRhRmllbGRJc0NvcHlBY3Rpb24oZGF0YUZpZWxkIGFzIERhdGFGaWVsZEZvckFjdGlvbik7XG5cdFx0fSlcblx0XHQuZm9yRWFjaCgoZGF0YUZpZWxkOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzKSA9PiB7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdGlzRGF0YUZpZWxkRm9yQWN0aW9uQWJzdHJhY3QoZGF0YUZpZWxkKSAmJlxuXHRcdFx0XHRkYXRhRmllbGQuSW5saW5lPy52YWx1ZU9mKCkgIT09IHRydWUgJiZcblx0XHRcdFx0ZGF0YUZpZWxkLkRldGVybWluaW5nPy52YWx1ZU9mKCkgIT09IHRydWVcblx0XHRcdCkge1xuXHRcdFx0XHRjb25zdCB0YWJsZUFjdGlvbiA9IGdldERhdGFGaWVsZEFubm90YXRpb25BY3Rpb24oZGF0YUZpZWxkLCBjb252ZXJ0ZXJDb250ZXh0KTtcblx0XHRcdFx0aWYgKHRhYmxlQWN0aW9uKSB7XG5cdFx0XHRcdFx0dGFibGVBY3Rpb25zLnB1c2godGFibGVBY3Rpb24pO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKGlzRGF0YUZpZWxkRm9yQWN0aW9uR3JvdXAoZGF0YUZpZWxkKSkge1xuXHRcdFx0XHRjb25zdCBkYXRhRmllbGRHcm91cCA9IGdldERhdGFGaWVsZEFubm90YXRpb25BY3Rpb24oZGF0YUZpZWxkLCBjb252ZXJ0ZXJDb250ZXh0KTtcblx0XHRcdFx0aWYgKGRhdGFGaWVsZEdyb3VwKSB7XG5cdFx0XHRcdFx0dGFibGVBY3Rpb25zLnB1c2goZGF0YUZpZWxkR3JvdXApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0cmV0dXJuIHtcblx0XHR0YWJsZUFjdGlvbnNcblx0fTtcbn1cblxuLy8gRm9yIHRoZSBjb250ZXh0IG1lbnUsIHRoZSB2aXNpYmlsaXR5IHNob3VsZCBhbHNvIGNvbnNpZGVyIHRoZSAnaW5hY3RpdmVDb250ZXh0JyBwcm9wZXJ0eTpcbi8vIG9ubHkgd2hlbiBhdCBsZWFzdCBvbmUgc2VsZWN0ZWQgY29udGV4dCBpcyBhY3RpdmUgKGkuZS4gXCJjb250ZXh0bWVudS9pbmFjdGl2ZUNvbnRleHRcIiBpcyBmYWxzZSksIHRoZSBhY3Rpb24gc2hvdWxkIGJlIHZpc2libGUgaW4gdGhlIGNvbnRleHQgbWVudVxuLy8gVGhpcyBpcyBvbmx5IHJlbGV2YW50IHdoZW4gdGhlIHRhYmxlIG1hbmlmZXN0IHNldHRpbmcgXCJjcmVhdGlvbk1vZGVcIiBpcyBcIklubGluZUNyZWF0aW9uUm93c1wiXG5mdW5jdGlvbiB2aXNpYmxlRm9yQ29udGV4dE1lbnVFeHByZXNzaW9uKFxuXHRkYXRhRmllbGQ6IERhdGFGaWVsZEZvckFjdGlvbiB8IERhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbiB8IERhdGFGaWVsZEZvckFjdGlvbkdyb3VwIHwgdW5kZWZpbmVkLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD5cbik6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPiB7XG5cdHJldHVybiBhbmQodmlzaWJsZUV4cHJlc3Npb24oZGF0YUZpZWxkLCBjb252ZXJ0ZXJDb250ZXh0KSwgZXF1YWwocGF0aEluTW9kZWwoXCJjb250ZXh0bWVudS9pbmFjdGl2ZUNvbnRleHRcIiwgXCJpbnRlcm5hbFwiKSwgZmFsc2UpKTtcbn1cblxuZnVuY3Rpb24gZ2V0RGF0YUZpZWxkQW5ub3RhdGlvbkFjdGlvbihcblx0ZGF0YUZpZWxkOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD5cbik6IEFubm90YXRpb25BY3Rpb24gfCBBbm5vdGF0aW9uQWN0aW9uR3JvdXAgfCB2b2lkIHtcblx0c3dpdGNoIChkYXRhRmllbGQuJFR5cGUpIHtcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFjdGlvbjpcblx0XHRcdGNvbnN0IHRhYmxlQWN0aW9uOiBBbm5vdGF0aW9uQWN0aW9uID0ge1xuXHRcdFx0XHR0eXBlOiBBY3Rpb25UeXBlLkRhdGFGaWVsZEZvckFjdGlvbixcblx0XHRcdFx0YW5ub3RhdGlvblBhdGg6IGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0QmFzZWRBbm5vdGF0aW9uUGF0aChkYXRhRmllbGQuZnVsbHlRdWFsaWZpZWROYW1lKSxcblx0XHRcdFx0a2V5OiBLZXlIZWxwZXIuZ2VuZXJhdGVLZXlGcm9tRGF0YUZpZWxkKGRhdGFGaWVsZCksXG5cdFx0XHRcdHZpc2libGU6IGNvbXBpbGVFeHByZXNzaW9uKHZpc2libGVFeHByZXNzaW9uKGRhdGFGaWVsZCwgY29udmVydGVyQ29udGV4dCkpLFxuXHRcdFx0XHR2aXNpYmxlRm9yQ29udGV4dE1lbnU6IGNvbXBpbGVFeHByZXNzaW9uKHZpc2libGVGb3JDb250ZXh0TWVudUV4cHJlc3Npb24oZGF0YUZpZWxkLCBjb252ZXJ0ZXJDb250ZXh0KSksXG5cdFx0XHRcdGlzTmF2aWdhYmxlOiB0cnVlXG5cdFx0XHR9O1xuXHRcdFx0Y29uc3Qgc0VudGl0eVR5cGUgPSBjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVR5cGUoKS5mdWxseVF1YWxpZmllZE5hbWU7XG5cdFx0XHRpZiAoX3VzZUVuYWJsZWRFeHByZXNzaW9uKGRhdGFGaWVsZCwgc0VudGl0eVR5cGUpKSB7XG5cdFx0XHRcdHRhYmxlQWN0aW9uLmVuYWJsZWQgPSBnZXRFbmFibGVkRm9yQW5ub3RhdGlvbkFjdGlvbihjb252ZXJ0ZXJDb250ZXh0LCBkYXRhRmllbGQuQWN0aW9uVGFyZ2V0LCB0cnVlKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiB0YWJsZUFjdGlvbjtcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbjpcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdHR5cGU6IEFjdGlvblR5cGUuRGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uLFxuXHRcdFx0XHRhbm5vdGF0aW9uUGF0aDogY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlTZXRCYXNlZEFubm90YXRpb25QYXRoKGRhdGFGaWVsZC5mdWxseVF1YWxpZmllZE5hbWUpLFxuXHRcdFx0XHRrZXk6IEtleUhlbHBlci5nZW5lcmF0ZUtleUZyb21EYXRhRmllbGQoZGF0YUZpZWxkKSxcblx0XHRcdFx0dmlzaWJsZTogY29tcGlsZUV4cHJlc3Npb24odmlzaWJsZUV4cHJlc3Npb24oZGF0YUZpZWxkLCBjb252ZXJ0ZXJDb250ZXh0KSksXG5cdFx0XHRcdHZpc2libGVGb3JDb250ZXh0TWVudTogY29tcGlsZUV4cHJlc3Npb24odmlzaWJsZUZvckNvbnRleHRNZW51RXhwcmVzc2lvbihkYXRhRmllbGQsIGNvbnZlcnRlckNvbnRleHQpKVxuXHRcdFx0fTtcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFjdGlvbkdyb3VwOlxuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0dHlwZTogQWN0aW9uVHlwZS5NZW51LFxuXHRcdFx0XHRrZXk6IEtleUhlbHBlci5nZW5lcmF0ZUtleUZyb21EYXRhRmllbGQoZGF0YUZpZWxkKSxcblx0XHRcdFx0aWQ6IEtleUhlbHBlci5nZW5lcmF0ZUtleUZyb21EYXRhRmllbGQoZGF0YUZpZWxkKSxcblx0XHRcdFx0dGV4dDogZGF0YUZpZWxkLkxhYmVsPy50b1N0cmluZygpLFxuXHRcdFx0XHR2aXNpYmxlOiBjb21waWxlRXhwcmVzc2lvbih2aXNpYmxlRXhwcmVzc2lvbihkYXRhRmllbGQsIGNvbnZlcnRlckNvbnRleHQpKSxcblx0XHRcdFx0dmlzaWJsZUZvckNvbnRleHRNZW51OiBjb21waWxlRXhwcmVzc2lvbih2aXNpYmxlRm9yQ29udGV4dE1lbnVFeHByZXNzaW9uKGRhdGFGaWVsZCwgY29udmVydGVyQ29udGV4dCkpLFxuXHRcdFx0XHRtZW51OiBkYXRhRmllbGQuQWN0aW9ucy5tYXAoKGFjdGlvbikgPT4gZ2V0RGF0YUZpZWxkQW5ub3RhdGlvbkFjdGlvbihhY3Rpb24sIGNvbnZlcnRlckNvbnRleHQpKVxuXHRcdFx0fSBhcyBBbm5vdGF0aW9uQWN0aW9uR3JvdXA7XG5cdFx0ZGVmYXVsdDpcblx0XHRcdHJldHVybjtcblx0fVxufVxuXG4vKipcbiAqIEdlbmVyYXRlIHRoZSBiaW5kaW5nRXhwcmVzc2lvbiBmb3IgdGhlIGhpZ2hsaWdodCByb3dTZXR0aW5nIHBhcmFtZXRlci5cbiAqIEBwYXJhbSBjcml0aWNhbGl0eUFubm90YXRpb24gUGF0aCBvciB2YWx1ZSBvZiB0aGUgY3JpdGljYWxpdHlcbiAqIEBwYXJhbSBpc0RyYWZ0Um9vdE9yTm9kZSAgSXMgdGhlIGN1cnJlbnQgZW50aXR5U2V0IGFuIERyYWZ0IHJvb3Qgb3IgYSBub2RlXG4gKiBAcGFyYW0gdGFyZ2V0RW50aXR5VHlwZSBUaGUgdGFyZ2V0ZWQgZW50aXR5VHlwZVxuICogQHJldHVybnMgQW4gZXhwcmVzc2lvbkJpbmRpbmdcbiAqL1xuZnVuY3Rpb24gZ2V0SGlnaGxpZ2h0Um93QmluZGluZyhcblx0Y3JpdGljYWxpdHlBbm5vdGF0aW9uOiBDcml0aWNhbGl0eSB8IHVuZGVmaW5lZCxcblx0aXNEcmFmdFJvb3RPck5vZGU6IGJvb2xlYW4sXG5cdHRhcmdldEVudGl0eVR5cGU/OiBFbnRpdHlUeXBlXG4pOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248TWVzc2FnZVR5cGU+IHtcblx0bGV0IGRlZmF1bHRIaWdobGlnaHRSb3dEZWZpbml0aW9uOiBNZXNzYWdlVHlwZSB8IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxNZXNzYWdlVHlwZT4gPSBNZXNzYWdlVHlwZS5Ob25lO1xuXHRpZiAoY3JpdGljYWxpdHlBbm5vdGF0aW9uKSB7XG5cdFx0aWYgKHR5cGVvZiBjcml0aWNhbGl0eUFubm90YXRpb24gPT09IFwib2JqZWN0XCIpIHtcblx0XHRcdGRlZmF1bHRIaWdobGlnaHRSb3dEZWZpbml0aW9uID0gZ2V0RXhwcmVzc2lvbkZyb21Bbm5vdGF0aW9uKGNyaXRpY2FsaXR5QW5ub3RhdGlvbikgYXMgQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPE1lc3NhZ2VUeXBlPjtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gRW51bSBWYWx1ZSBzbyB3ZSBnZXQgdGhlIGNvcnJlc3BvbmRpbmcgc3RhdGljIHBhcnRcblx0XHRcdGRlZmF1bHRIaWdobGlnaHRSb3dEZWZpbml0aW9uID0gZ2V0TWVzc2FnZVR5cGVGcm9tQ3JpdGljYWxpdHlUeXBlKGNyaXRpY2FsaXR5QW5ub3RhdGlvbik7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBmb3JtYXRSZXN1bHQoXG5cdFx0W1xuXHRcdFx0ZGVmYXVsdEhpZ2hsaWdodFJvd0RlZmluaXRpb24sXG5cdFx0XHRwYXRoSW5Nb2RlbChgZmlsdGVyZWRNZXNzYWdlc2AsIFwiaW50ZXJuYWxcIiksXG5cdFx0XHRpc0RyYWZ0Um9vdE9yTm9kZSAmJiBFbnRpdHkuSGFzQWN0aXZlLFxuXHRcdFx0aXNEcmFmdFJvb3RPck5vZGUgJiYgRW50aXR5LklzQWN0aXZlLFxuXHRcdFx0YCR7aXNEcmFmdFJvb3RPck5vZGV9YCxcblx0XHRcdHBhdGhJbk1vZGVsKFwiQCR1aTUuZmUuY29udGV4dFBhdGhcIiksXG5cdFx0XHRVSS5Jc0luYWN0aXZlXG5cdFx0XSxcblx0XHR0YWJsZUZvcm1hdHRlcnMucm93SGlnaGxpZ2h0aW5nLFxuXHRcdHRhcmdldEVudGl0eVR5cGVcblx0KTtcbn1cbmZ1bmN0aW9uIF9nZXRDcmVhdGlvbkJlaGF2aW91cihcblx0bGluZUl0ZW1Bbm5vdGF0aW9uOiBMaW5lSXRlbSB8IHVuZGVmaW5lZCxcblx0dGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb246IFRhYmxlQ29udHJvbENvbmZpZ3VyYXRpb24sXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pixcblx0bmF2aWdhdGlvblNldHRpbmdzOiBOYXZpZ2F0aW9uU2V0dGluZ3NDb25maWd1cmF0aW9uLFxuXHR2aXN1YWxpemF0aW9uUGF0aDogc3RyaW5nXG4pOiBUYWJsZUFubm90YXRpb25Db25maWd1cmF0aW9uW1wiY3JlYXRlXCJdIHtcblx0Y29uc3QgbmF2aWdhdGlvbiA9IG5hdmlnYXRpb25TZXR0aW5ncz8uY3JlYXRlIHx8IG5hdmlnYXRpb25TZXR0aW5ncz8uZGV0YWlsO1xuXHRjb25zdCB0YWJsZU1hbmlmZXN0U2V0dGluZ3M6IFRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uID0gY29udmVydGVyQ29udGV4dC5nZXRNYW5pZmVzdENvbnRyb2xDb25maWd1cmF0aW9uKHZpc3VhbGl6YXRpb25QYXRoKTtcblx0Y29uc3Qgb3JpZ2luYWxUYWJsZVNldHRpbmdzID0gKHRhYmxlTWFuaWZlc3RTZXR0aW5ncyAmJiB0YWJsZU1hbmlmZXN0U2V0dGluZ3MudGFibGVTZXR0aW5ncykgfHwge307XG5cdC8vIGNyb3NzLWFwcFxuXHRpZiAobmF2aWdhdGlvbj8ub3V0Ym91bmQgJiYgbmF2aWdhdGlvbi5vdXRib3VuZERldGFpbCAmJiBuYXZpZ2F0aW9uU2V0dGluZ3M/LmNyZWF0ZSkge1xuXHRcdHJldHVybiB7XG5cdFx0XHRtb2RlOiBcIkV4dGVybmFsXCIsXG5cdFx0XHRvdXRib3VuZDogbmF2aWdhdGlvbi5vdXRib3VuZCxcblx0XHRcdG91dGJvdW5kRGV0YWlsOiBuYXZpZ2F0aW9uLm91dGJvdW5kRGV0YWlsLFxuXHRcdFx0bmF2aWdhdGlvblNldHRpbmdzOiBuYXZpZ2F0aW9uU2V0dGluZ3Ncblx0XHR9O1xuXHR9XG5cdGlmIChcblx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldFRlbXBsYXRlVHlwZSgpID09PSBUZW1wbGF0ZVR5cGUuTGlzdFJlcG9ydCAmJlxuXHRcdCFbQ3JlYXRpb25Nb2RlLk5ld1BhZ2UsIENyZWF0aW9uTW9kZS5FeHRlcm5hbCwgQ3JlYXRpb25Nb2RlLkNyZWF0aW9uRGlhbG9nXS5pbmNsdWRlcyh0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbi5jcmVhdGlvbk1vZGUpXG5cdCkge1xuXHRcdC8vIEZhbGxiYWNrIHRvIFwiTmV3UGFnZVwiXG5cdFx0TG9nLndhcm5pbmcoXG5cdFx0XHRgQ3JlYXRpb24gbW9kZSAnJHt0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbi5jcmVhdGlvbk1vZGV9JyBjYW4gbm90IGJlIHVzZWQgd2l0aGluIHRoZSBMaXN0IFJlcG9ydC4gSW5zdGVhZCwgdGhlIGRlZmF1bHQgbW9kZSBcIk5ld1BhZ2VcIiBpcyB1c2VkLmBcblx0XHQpO1xuXHRcdHRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uLmNyZWF0aW9uTW9kZSA9IENyZWF0aW9uTW9kZS5OZXdQYWdlO1xuXHR9IGVsc2UgaWYgKFxuXHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0VGVtcGxhdGVUeXBlKCkgIT09IFRlbXBsYXRlVHlwZS5MaXN0UmVwb3J0ICYmXG5cdFx0dGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24udHlwZSA9PT0gXCJUcmVlVGFibGVcIiAmJlxuXHRcdCFbQ3JlYXRpb25Nb2RlLk5ld1BhZ2UsIENyZWF0aW9uTW9kZS5JbmxpbmUsIENyZWF0aW9uTW9kZS5DcmVhdGlvbkRpYWxvZ10uaW5jbHVkZXModGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24uY3JlYXRpb25Nb2RlKVxuXHQpIHtcblx0XHQvLyBGYWxsYmFjayB0byBcIk5ld1BhZ2VcIiBpbiBjYXNlIG9mIGEgbm9uLXN1cHBvcnRlZCBtb2RlIGZvciBhIFRyZWVUYWJsZVxuXHRcdExvZy53YXJuaW5nKFxuXHRcdFx0YENyZWF0aW9uIG1vZGUgJyR7dGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24uY3JlYXRpb25Nb2RlfScgY2FuIG5vdCBiZSB1c2VkIHdpdGggYSBUcmVlIFRhYmxlLiBJbnN0ZWFkLCB0aGUgZGVmYXVsdCBtb2RlIFwiTmV3UGFnZVwiIGlzIHVzZWQuYFxuXHRcdCk7XG5cdFx0dGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24uY3JlYXRpb25Nb2RlID0gQ3JlYXRpb25Nb2RlLk5ld1BhZ2U7XG5cdH1cblx0bGV0IG5ld0FjdGlvbjtcblx0aWYgKGxpbmVJdGVtQW5ub3RhdGlvbikge1xuXHRcdC8vIGluLWFwcFxuXHRcdGNvbnN0IHRhcmdldEFubm90YXRpb25zID0gY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlTZXQoKT8uYW5ub3RhdGlvbnM7XG5cdFx0Y29uc3QgdGFyZ2V0QW5ub3RhdGlvbnNDb21tb24gPSB0YXJnZXRBbm5vdGF0aW9ucz8uQ29tbW9uIGFzIEVudGl0eVNldEFubm90YXRpb25zX0NvbW1vbixcblx0XHRcdHRhcmdldEFubm90YXRpb25zU2Vzc2lvbiA9IHRhcmdldEFubm90YXRpb25zPy5TZXNzaW9uIGFzIEVudGl0eVNldEFubm90YXRpb25zX1Nlc3Npb247XG5cdFx0bmV3QWN0aW9uID0gdGFyZ2V0QW5ub3RhdGlvbnNDb21tb24/LkRyYWZ0Um9vdD8uTmV3QWN0aW9uIHx8IHRhcmdldEFubm90YXRpb25zU2Vzc2lvbj8uU3RpY2t5U2Vzc2lvblN1cHBvcnRlZD8uTmV3QWN0aW9uO1xuXHRcdGlmICh0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbi5jcmVhdGlvbk1vZGUgPT09IENyZWF0aW9uTW9kZS5DcmVhdGlvblJvdyAmJiBuZXdBY3Rpb24pIHtcblx0XHRcdC8vIEEgY29tYmluYXRpb24gb2YgJ0NyZWF0aW9uUm93JyBhbmQgJ05ld0FjdGlvbicgZG9lcyBub3QgbWFrZSBzZW5zZVxuXHRcdFx0dGhyb3cgRXJyb3IoYENyZWF0aW9uIG1vZGUgJyR7Q3JlYXRpb25Nb2RlLkNyZWF0aW9uUm93fScgY2FuIG5vdCBiZSB1c2VkIHdpdGggYSBjdXN0b20gJ25ldycgYWN0aW9uICgke25ld0FjdGlvbn0pYCk7XG5cdFx0fVxuXHRcdGlmIChuYXZpZ2F0aW9uPy5yb3V0ZSkge1xuXHRcdFx0Ly8gcm91dGUgc3BlY2lmaWVkXG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRtb2RlOiB0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbi5jcmVhdGlvbk1vZGUsXG5cdFx0XHRcdGFwcGVuZDogdGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24uY3JlYXRlQXRFbmQsXG5cdFx0XHRcdG5ld0FjdGlvbjogbmV3QWN0aW9uPy50b1N0cmluZygpLFxuXHRcdFx0XHRuYXZpZ2F0ZVRvVGFyZ2V0OiB0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbi5jcmVhdGlvbk1vZGUgPT09IENyZWF0aW9uTW9kZS5OZXdQYWdlID8gbmF2aWdhdGlvbi5yb3V0ZSA6IHVuZGVmaW5lZCAvLyBuYXZpZ2F0ZSBvbmx5IGluIE5ld1BhZ2UgbW9kZVxuXHRcdFx0fTtcblx0XHR9XG5cdH1cblx0Ly8gbm8gbmF2aWdhdGlvbiBvciBubyByb3V0ZSBzcGVjaWZpZWQgLSBmYWxsYmFjayB0byBpbmxpbmUgY3JlYXRlIGlmIG9yaWdpbmFsIGNyZWF0aW9uIG1vZGUgd2FzICdOZXdQYWdlJ1xuXHRpZiAodGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24uY3JlYXRpb25Nb2RlID09PSBDcmVhdGlvbk1vZGUuTmV3UGFnZSkge1xuXHRcdGlmIChjb252ZXJ0ZXJDb250ZXh0LmdldFRlbXBsYXRlVHlwZSgpID09PSBUZW1wbGF0ZVR5cGUuTGlzdFJlcG9ydCkge1xuXHRcdFx0TG9nLmVycm9yKFwiVGhlIGNyZWF0aW9uIG1vZGUgJ05ld1BhZ2UnIGlzIHVzZWQgYnV0IHRoZSBuYXZpZ2F0aW9uIGNvbmZpZ3VyYXRpb24gdG8gdGhlIHN1YiBwYWdlIGlzIG1pc3NpbmcuXCIpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbi5jcmVhdGlvbk1vZGUgPSBDcmVhdGlvbk1vZGUuSW5saW5lO1xuXHRcdFx0Ly8gSW4gY2FzZSB0aGVyZSB3YXMgbm8gc3BlY2lmaWMgY29uZmlndXJhdGlvbiBmb3IgdGhlIGNyZWF0ZUF0RW5kIHdlIGZvcmNlIGl0IHRvIGZhbHNlXG5cdFx0XHRpZiAob3JpZ2luYWxUYWJsZVNldHRpbmdzLmNyZWF0aW9uTW9kZT8uY3JlYXRlQXRFbmQgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHR0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbi5jcmVhdGVBdEVuZCA9IGZhbHNlO1xuXHRcdFx0fVxuXHRcdFx0TG9nLmluZm8oXCJUaGUgY3JlYXRpb24gbW9kZSB3YXMgY2hhbmdlZCBmcm9tICdOZXdQYWdlJyB0byAnSW5saW5lJyBkdWUgdG8gbWlzc2luZyBuYXZpZ2F0aW9uIGNvbmZpZ3VyYXRpb24gdG8gdGhlIHN1YiBwYWdlLlwiKTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIHtcblx0XHRtb2RlOiB0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbi5jcmVhdGlvbk1vZGUsXG5cdFx0YXBwZW5kOiB0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbi5jcmVhdGVBdEVuZCxcblx0XHRuZXdBY3Rpb246IG5ld0FjdGlvbj8udG9TdHJpbmcoKVxuXHR9O1xufVxuY29uc3QgX2dldFJvd0NvbmZpZ3VyYXRpb25Qcm9wZXJ0eSA9IGZ1bmN0aW9uIChcblx0bGluZUl0ZW1Bbm5vdGF0aW9uOiBMaW5lSXRlbSB8IHVuZGVmaW5lZCxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+LFxuXHRuYXZpZ2F0aW9uU2V0dGluZ3M6IE5hdmlnYXRpb25TZXR0aW5nc0NvbmZpZ3VyYXRpb24sXG5cdHRhcmdldFBhdGg6IHN0cmluZyxcblx0dGFibGVUeXBlOiBUYWJsZVR5cGUsXG5cdGRpc2FibGVOYXZpZ2F0aW9uPzogYm9vbGVhblxuKTogUm93Q29uZmlndXJhdGlvbiB7XG5cdGxldCBuYXZpZ2F0aW9uSW5mbzogUm93TmF2aWdhdGlvbkluZm8gfCB1bmRlZmluZWQ7XG5cdGxldCBjcml0aWNhbGl0eVByb3BlcnR5OiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248TWVzc2FnZVR5cGU+ID0gY29uc3RhbnQoTWVzc2FnZVR5cGUuTm9uZSk7XG5cdGNvbnN0IHRhcmdldEVudGl0eVR5cGUgPSBjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVR5cGUoKTtcblx0Y29uc3QgY3JpdGljYWxpdHlBbm5vdGF0aW9uID0gbGluZUl0ZW1Bbm5vdGF0aW9uPy5hbm5vdGF0aW9ucz8uVUk/LkNyaXRpY2FsaXR5O1xuXHRpZiAoIWRpc2FibGVOYXZpZ2F0aW9uICYmIG5hdmlnYXRpb25TZXR0aW5ncyAmJiBsaW5lSXRlbUFubm90YXRpb24pIHtcblx0XHRjb25zdCBuYXZpZ2F0aW9uVGFyZ2V0ID0gbmF2aWdhdGlvblNldHRpbmdzLmRpc3BsYXk/LnRhcmdldCB8fCBuYXZpZ2F0aW9uU2V0dGluZ3MuZGV0YWlsPy5vdXRib3VuZDtcblx0XHRjb25zdCB0YXJnZXRFbnRpdHlTZXQgPSBjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVNldCgpO1xuXHRcdGNyaXRpY2FsaXR5UHJvcGVydHkgPSBnZXRIaWdobGlnaHRSb3dCaW5kaW5nKFxuXHRcdFx0Y3JpdGljYWxpdHlBbm5vdGF0aW9uLFxuXHRcdFx0ISFNb2RlbEhlbHBlci5nZXREcmFmdFJvb3QodGFyZ2V0RW50aXR5U2V0KSB8fCAhIU1vZGVsSGVscGVyLmdldERyYWZ0Tm9kZSh0YXJnZXRFbnRpdHlTZXQpLFxuXHRcdFx0dGFyZ2V0RW50aXR5VHlwZVxuXHRcdCk7XG5cdFx0aWYgKG5hdmlnYXRpb25UYXJnZXQpIHtcblx0XHRcdG5hdmlnYXRpb25JbmZvID0geyB0eXBlOiBcIk91dGJvdW5kXCIsIG5hdmlnYXRpb25UYXJnZXQgfTtcblx0XHR9XG5cdFx0aWYgKCFuYXZpZ2F0aW9uVGFyZ2V0ICYmIG5hdmlnYXRpb25TZXR0aW5ncy5kZXRhaWw/LnJvdXRlKSB7XG5cdFx0XHRjb25zdCBjaGVja0VkaXRhYmxlID1cblx0XHRcdFx0TW9kZWxIZWxwZXIuZ2V0RHJhZnRSb290KHRhcmdldEVudGl0eVNldCkgIT09IHVuZGVmaW5lZCB8fCBNb2RlbEhlbHBlci5nZXREcmFmdE5vZGUodGFyZ2V0RW50aXR5U2V0KSAhPT0gdW5kZWZpbmVkO1xuXHRcdFx0bmF2aWdhdGlvbkluZm8gPSB7XG5cdFx0XHRcdHR5cGU6IFwiTmF2aWdhdGlvblwiLFxuXHRcdFx0XHRyb3V0ZVBhdGg6IG5hdmlnYXRpb25TZXR0aW5ncy5kZXRhaWwucm91dGUsXG5cdFx0XHRcdHRhcmdldFBhdGgsXG5cdFx0XHRcdGNoZWNrRWRpdGFibGUsXG5cdFx0XHRcdHJlY3JlYXRlQ29udGV4dDogdGFibGVUeXBlID09PSBcIkFuYWx5dGljYWxUYWJsZVwiXG5cdFx0XHR9O1xuXHRcdH1cblx0fVxuXHRjb25zdCByb3dOYXZpZ2F0ZWRFeHByZXNzaW9uOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj4gPSBmb3JtYXRSZXN1bHQoXG5cdFx0W3BhdGhJbk1vZGVsKFwiL2RlZXBlc3RQYXRoXCIsIFwiaW50ZXJuYWxcIildLFxuXHRcdHRhYmxlRm9ybWF0dGVycy5uYXZpZ2F0ZWRSb3csXG5cdFx0dGFyZ2V0RW50aXR5VHlwZVxuXHQpO1xuXHRyZXR1cm4ge1xuXHRcdG5hdmlnYXRpb25JbmZvLFxuXHRcdGFjdGlvbjogbmF2aWdhdGlvbkluZm8gPyBcIk5hdmlnYXRpb25cIiA6IHVuZGVmaW5lZCxcblx0XHRyb3dIaWdobGlnaHRpbmc6IGNvbXBpbGVFeHByZXNzaW9uKGNyaXRpY2FsaXR5UHJvcGVydHkpLFxuXHRcdHJvd05hdmlnYXRlZDogY29tcGlsZUV4cHJlc3Npb24ocm93TmF2aWdhdGVkRXhwcmVzc2lvbiksXG5cdFx0cm93Q3JpdGljYWxpdHlGb3JJbnNpZ2h0czogY3JpdGljYWxpdHlBbm5vdGF0aW9uID8gY3JpdGljYWxpdHlFeHByZXNzaW9uRm9ySW50ZWdyYXRpb25DYXJkcyhjcml0aWNhbGl0eUFubm90YXRpb24pIDogdW5kZWZpbmVkLFxuXHRcdHZpc2libGU6IGNvbXBpbGVFeHByZXNzaW9uKG5vdChVSS5Jc0luYWN0aXZlKSlcblx0fTtcbn07XG4vKipcbiAqIFJldHJpZXZlIHRoZSBjb2x1bW5zIGZyb20gdGhlIGVudGl0eVR5cGUuXG4gKiBAcGFyYW0gY29sdW1uc1RvQmVDcmVhdGVkIFRoZSBjb2x1bW5zIHRvIGJlIGNyZWF0ZWQuXG4gKiBAcGFyYW0gZW50aXR5VHlwZSBUaGUgdGFyZ2V0IGVudGl0eSB0eXBlLlxuICogQHBhcmFtIGFubm90YXRpb25Db2x1bW5zIFRoZSBhcnJheSBvZiBjb2x1bW5zIGNyZWF0ZWQgYmFzZWQgb24gTGluZUl0ZW0gYW5ub3RhdGlvbnMuXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCBUaGUgY29udmVydGVyIGNvbnRleHQuXG4gKiBAcGFyYW0gdGFibGVUeXBlIFRoZSB0YWJsZSB0eXBlLlxuICogQHBhcmFtIHRhYmxlQ3JlYXRpb25Nb2RlIFRoZSBjcmVhdGlvbiBtb2RlIG9mIHRoZSB0YWJsZS5cbiAqIEBwYXJhbSBkaXNwbGF5TW9kZU9mRGVzY3JpcHRpb25Qcm9wZXJ0aWVzTWFwIFRoZSBtYXAgb2YgcHJvcGVydGllcyByZWZlcmVuY2VkIGFzIGRlc2NyaXB0aW9uIG9uIGEgdGV4dCBhcnJhbmdlbWVudCBhbm5vdGF0aW9uLlxuICogQHBhcmFtIHJlc3RyaWN0aW9uc09uUHJvcGVydGllcyBUaGUgZXhpc3RpbmcgcmVzdHJpY3Rpb25zIG9uIHByb3BlcnRpZXNcbiAqIEByZXR1cm5zIFRoZSBjb2x1bW4gZnJvbSB0aGUgZW50aXR5VHlwZVxuICovXG5leHBvcnQgY29uc3QgZ2V0Q29sdW1uc0Zyb21FbnRpdHlUeXBlID0gZnVuY3Rpb24gKFxuXHRjb2x1bW5zVG9CZUNyZWF0ZWQ6IFJlY29yZDxzdHJpbmcsIFByb3BlcnR5Pixcblx0ZW50aXR5VHlwZTogRW50aXR5VHlwZSxcblx0YW5ub3RhdGlvbkNvbHVtbnM6IEFubm90YXRpb25UYWJsZUNvbHVtbltdLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sXG5cdHRhYmxlVHlwZTogVGFibGVUeXBlLFxuXHR0YWJsZUNyZWF0aW9uTW9kZTogQ3JlYXRpb25Nb2RlLFxuXHRkaXNwbGF5TW9kZU9mRGVzY3JpcHRpb25Qcm9wZXJ0aWVzTWFwOiBSZWNvcmQ8c3RyaW5nLCBEaXNwbGF5TW9kZT4sXG5cdHJlc3RyaWN0aW9uc09uUHJvcGVydGllcz86IFJlc3RyaWN0aW9uc09uUHJvcGVydGllc1xuKTogQW5ub3RhdGlvblRhYmxlQ29sdW1uW10ge1xuXHRpZiAoYW5ub3RhdGlvbkNvbHVtbnMgPT09IHVuZGVmaW5lZCkge1xuXHRcdGFubm90YXRpb25Db2x1bW5zID0gW107XG5cdH1cblxuXHRsZXQgcHJvcGVydGllc05vdFRvQmVDb25zaWRlcmVkOiBzdHJpbmdbXSA9IFtdO1xuXHRjb25zdCB0YWJsZUNvbHVtbnM6IChBbm5vdGF0aW9uVGFibGVDb2x1bW4gfCBUZWNobmljYWxDb2x1bW4pW10gPSBhbm5vdGF0aW9uQ29sdW1ucztcblx0Y29uc3QgYWdncmVnYXRpb25IZWxwZXIgPSBuZXcgQWdncmVnYXRpb25IZWxwZXIoZW50aXR5VHlwZSwgY29udmVydGVyQ29udGV4dCk7XG5cdGNvbnN0IGdyb3VwYWJsZVByb3BlcnRpZXMgPSBhZ2dyZWdhdGlvbkhlbHBlci5nZXRHcm91cGFibGVQcm9wZXJ0aWVzKCk7XG5cdC8vRm9yIEFuYWx5dGljYWwgdGFibGUsIHdlIGV4Y2x1ZGUgYWxsIHByb3BlcnRpZXMgdGhhdCBhcmUgbm90IGdyb3VwYWJsZSBhbmQgdXNlZCBhcyBUZXh0IGluIGEgZ3JvdXBhYmxlIFByb3BlcnR5LlxuXHRpZiAodGFibGVUeXBlID09PSBcIkFuYWx5dGljYWxUYWJsZVwiICYmIGFnZ3JlZ2F0aW9uSGVscGVyLmlzQW5hbHl0aWNzU3VwcG9ydGVkKCkgJiYgZ3JvdXBhYmxlUHJvcGVydGllcykge1xuXHRcdHByb3BlcnRpZXNOb3RUb0JlQ29uc2lkZXJlZCA9IGdyb3VwYWJsZVByb3BlcnRpZXNcblx0XHRcdC5tYXAoKHByb3BlcnR5KSA9PiBwcm9wZXJ0eS4kdGFyZ2V0KVxuXHRcdFx0LmZpbHRlcigodGFyZ2V0KSA9PiB0YXJnZXQgIT09IHVuZGVmaW5lZClcblx0XHRcdC5tYXAoKHRhcmdldCkgPT4gZ2V0QXNzb2NpYXRlZFRleHRQcm9wZXJ0eSh0YXJnZXQgYXMgUHJvcGVydHkpKVxuXHRcdFx0LmZpbHRlcigodGV4dFByb3ApID0+IHRleHRQcm9wICYmICFhZ2dyZWdhdGlvbkhlbHBlci5pc1Byb3BlcnR5R3JvdXBhYmxlKHRleHRQcm9wKSlcblx0XHRcdC5tYXAoKHByb3ApID0+IHByb3A/Lm5hbWUpXG5cdFx0XHQuZmlsdGVyKChuYW1lKSA9PiBuYW1lICE9PSB1bmRlZmluZWQpIGFzIHN0cmluZ1tdO1xuXHR9XG5cdGVudGl0eVR5cGUuZW50aXR5UHJvcGVydGllcy5mb3JFYWNoKChwcm9wZXJ0eTogUHJvcGVydHkpID0+IHtcblx0XHQvLyBDYXRjaCBhbHJlYWR5IGV4aXN0aW5nIGNvbHVtbnMgLSB3aGljaCB3ZXJlIGFkZGVkIGJlZm9yZSBieSBMaW5lSXRlbSBBbm5vdGF0aW9uc1xuXHRcdGNvbnN0IGV4aXN0cyA9IGFubm90YXRpb25Db2x1bW5zLnNvbWUoKGNvbHVtbikgPT4ge1xuXHRcdFx0cmV0dXJuIGNvbHVtbi5uYW1lID09PSBwcm9wZXJ0eS5uYW1lO1xuXHRcdH0pO1xuXHRcdC8vIGlmIHRhcmdldCB0eXBlIGV4aXN0cywgaXQgaXMgYSBjb21wbGV4IHByb3BlcnR5IGFuZCBzaG91bGQgYmUgaWdub3JlZFxuXHRcdGlmICghcHJvcGVydHkudGFyZ2V0VHlwZSAmJiAhZXhpc3RzICYmICFwcm9wZXJ0aWVzTm90VG9CZUNvbnNpZGVyZWQuaW5jbHVkZXMocHJvcGVydHkubmFtZSkpIHtcblx0XHRcdGNvbnN0IHJlbGF0ZWRQcm9wZXJ0aWVzSW5mbzogQ29tcGxleFByb3BlcnR5SW5mbyA9IGNvbGxlY3RSZWxhdGVkUHJvcGVydGllcyhcblx0XHRcdFx0cHJvcGVydHkubmFtZSxcblx0XHRcdFx0cHJvcGVydHksXG5cdFx0XHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0XHRcdHRydWUsXG5cdFx0XHRcdHRhYmxlVHlwZVxuXHRcdFx0KTtcblx0XHRcdGNvbnN0IHJlbGF0ZWRQcm9wZXJ0eU5hbWVzOiBzdHJpbmdbXSA9IE9iamVjdC5rZXlzKHJlbGF0ZWRQcm9wZXJ0aWVzSW5mby5wcm9wZXJ0aWVzKTtcblx0XHRcdGNvbnN0IGFkZGl0aW9uYWxQcm9wZXJ0eU5hbWVzOiBzdHJpbmdbXSA9IE9iamVjdC5rZXlzKHJlbGF0ZWRQcm9wZXJ0aWVzSW5mby5hZGRpdGlvbmFsUHJvcGVydGllcyk7XG5cdFx0XHQvLyBJbmNsdWRlIHRoZSB0ZXh0IHByb3BlcnRpZXMgYW5kIHRoZWlyIGNvcnJlc3BvbmRpbmcgdGV4dCBhcnJhbmdlbWVudFxuXHRcdFx0cmVsYXRlZFByb3BlcnR5TmFtZXMuZm9yRWFjaCgobmFtZSkgPT4ge1xuXHRcdFx0XHRhZGRQcm9wZXJ0eVRvRGlzcGxheU1vZGVPZkRlc2NyaXB0aW9uUHJvcGVydGllc01hcChkaXNwbGF5TW9kZU9mRGVzY3JpcHRpb25Qcm9wZXJ0aWVzTWFwLCByZWxhdGVkUHJvcGVydGllc0luZm8sIG5hbWUpO1xuXHRcdFx0fSk7XG5cblx0XHRcdGNvbnN0IGNvbHVtbkluZm8gPSBnZXRDb2x1bW5EZWZpbml0aW9uRnJvbVByb3BlcnR5KFxuXHRcdFx0XHRwcm9wZXJ0eSxcblx0XHRcdFx0Y29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlTZXRCYXNlZEFubm90YXRpb25QYXRoKHByb3BlcnR5LmZ1bGx5UXVhbGlmaWVkTmFtZSksXG5cdFx0XHRcdHByb3BlcnR5Lm5hbWUsXG5cdFx0XHRcdHRydWUsXG5cdFx0XHRcdHRydWUsXG5cdFx0XHRcdGFnZ3JlZ2F0aW9uSGVscGVyLFxuXHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdFx0XHRkaXNwbGF5TW9kZU9mRGVzY3JpcHRpb25Qcm9wZXJ0aWVzTWFwLFxuXHRcdFx0XHRyZXN0cmljdGlvbnNPblByb3BlcnRpZXMsXG5cdFx0XHRcdHRhYmxlQ3JlYXRpb25Nb2RlLFxuXHRcdFx0XHRyZWxhdGVkUHJvcGVydGllc0luZm9cblx0XHRcdCk7XG5cdFx0XHRpZiAocmVsYXRlZFByb3BlcnR5TmFtZXMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRjb2x1bW5JbmZvLnByb3BlcnR5SW5mb3MgPSByZWxhdGVkUHJvcGVydHlOYW1lcztcblx0XHRcdFx0aWYgKHJlbGF0ZWRQcm9wZXJ0aWVzSW5mby5leHBvcnRTZXR0aW5ncy5kYXRhUG9pbnRUYXJnZXRWYWx1ZSkge1xuXHRcdFx0XHRcdGNvbHVtbkluZm8uZXhwb3J0RGF0YVBvaW50VGFyZ2V0VmFsdWUgPSByZWxhdGVkUHJvcGVydGllc0luZm8uZXhwb3J0U2V0dGluZ3MuZGF0YVBvaW50VGFyZ2V0VmFsdWU7XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly8gQ29sbGVjdCBpbmZvcm1hdGlvbiBvZiByZWxhdGVkIGNvbHVtbnMgdG8gYmUgY3JlYXRlZC5cblx0XHRcdFx0cmVsYXRlZFByb3BlcnR5TmFtZXMuZm9yRWFjaCgobmFtZSkgPT4ge1xuXHRcdFx0XHRcdGNvbHVtbnNUb0JlQ3JlYXRlZFtuYW1lXSA9IHJlbGF0ZWRQcm9wZXJ0aWVzSW5mby5wcm9wZXJ0aWVzW25hbWVdLmFubm90YXRpb25Qcm9wZXJ0eTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0XHQvLyB1cGRhdGUgUHJvcGVydHkgTGFiZWwgd2hlbiBpdCdzIHJlZmVyZW5jZWQgb25seSBvbmNlIGluIGEgY29sdW1uLCBuZXcgbGFiZWwgd2lsbCBiZSB0aGUgbGFiZWwgb2YgdGhlIGNvbHVtblxuXHRcdFx0dXBkYXRlUHJvcGVydHlMYWJlbChhbm5vdGF0aW9uQ29sdW1ucywgY29sdW1uc1RvQmVDcmVhdGVkLCBjb2x1bW5JbmZvKTtcblx0XHRcdGlmIChhZGRpdGlvbmFsUHJvcGVydHlOYW1lcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdGNvbHVtbkluZm8uYWRkaXRpb25hbFByb3BlcnR5SW5mb3MgPSBhZGRpdGlvbmFsUHJvcGVydHlOYW1lcztcblx0XHRcdFx0Ly8gQ3JlYXRlIGNvbHVtbnMgZm9yIGFkZGl0aW9uYWwgcHJvcGVydGllcyBpZGVudGlmaWVkIGZvciBBTFAgdXNlIGNhc2UuXG5cdFx0XHRcdGFkZGl0aW9uYWxQcm9wZXJ0eU5hbWVzLmZvckVhY2goKGFkZGl0aW9uYWxQcm9wZXJ0eU5hbWUpID0+IHtcblx0XHRcdFx0XHQvLyBJbnRlbnRpb25hbCBvdmVyd3JpdGUgYXMgd2UgcmVxdWlyZSBvbmx5IG9uZSBuZXcgUHJvcGVydHlJbmZvIGZvciBhIHJlbGF0ZWQgUHJvcGVydHkuXG5cdFx0XHRcdFx0Y29sdW1uc1RvQmVDcmVhdGVkW2FkZGl0aW9uYWxQcm9wZXJ0eU5hbWVdID0gcmVsYXRlZFByb3BlcnRpZXNJbmZvLmFkZGl0aW9uYWxQcm9wZXJ0aWVzW2FkZGl0aW9uYWxQcm9wZXJ0eU5hbWVdO1xuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHRcdHRhYmxlQ29sdW1ucy5wdXNoKGNvbHVtbkluZm8pO1xuXHRcdH1cblx0XHQvLyBJbiBjYXNlIGEgcHJvcGVydHkgaGFzIGRlZmluZWQgYSAjVGV4dE9ubHkgdGV4dCBhcnJhbmdlbWVudCB0aGF0IHBvaW50cyB0byBhIHRleHQgcHJvcGVydHkgKGFuZCBub3QgYSAnaGFyZCBjb2RlZCB0ZXh0JykgZG9uJ3Qgb25seSBjcmVhdGUgdGhlIGNvbXBsZXggcHJvcGVydHkgd2l0aCB0aGUgdGV4dCBwcm9wZXJ0eSBhcyBhIGNoaWxkIHByb3BlcnR5LFxuXHRcdC8vIGJ1dCBhbHNvIHRoZSBwcm9wZXJ0eSBpdHNlbGYgYXMgaXQgY2FuIGJlIHVzZWQgYXMgd2l0aGluIHRoZSBzb3J0Q29uZGl0aW9ucyBvciBvbiBjdXN0b20gY29sdW1ucy5cblx0XHQvLyBUaGlzIHN0ZXAgbXVzdCBiZSB2YWxpZCBhbHNvIGZyb20gdGhlIGNvbHVtbnMgYWRkZWQgdmlhIExpbmVJdGVtcyBvciBmcm9tIGEgY29sdW1uIGF2YWlsYWJsZSBvbiB0aGUgcDEzbi5cblx0XHRpZiAoZ2V0RGlzcGxheU1vZGUocHJvcGVydHkpID09PSBcIkRlc2NyaXB0aW9uXCIpIHtcblx0XHRcdHJlc3RyaWN0aW9uc09uUHJvcGVydGllcz8ubm9uU29ydGFibGVQcm9wZXJ0aWVzLnB1c2gocHJvcGVydHkubmFtZSk7XG5cdFx0XHRpZiAoaXNQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb24ocHJvcGVydHk/LmFubm90YXRpb25zPy5Db21tb24/LlRleHQpKSB7XG5cdFx0XHRcdHRhYmxlQ29sdW1ucy5wdXNoKFxuXHRcdFx0XHRcdGdldENvbHVtbkRlZmluaXRpb25Gcm9tUHJvcGVydHkoXG5cdFx0XHRcdFx0XHRwcm9wZXJ0eSxcblx0XHRcdFx0XHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0QmFzZWRBbm5vdGF0aW9uUGF0aChwcm9wZXJ0eS5mdWxseVF1YWxpZmllZE5hbWUpLFxuXHRcdFx0XHRcdFx0cHJvcGVydHkubmFtZSxcblx0XHRcdFx0XHRcdGZhbHNlLFxuXHRcdFx0XHRcdFx0ZmFsc2UsXG5cdFx0XHRcdFx0XHRhZ2dyZWdhdGlvbkhlbHBlcixcblx0XHRcdFx0XHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0XHRcdFx0XHRkaXNwbGF5TW9kZU9mRGVzY3JpcHRpb25Qcm9wZXJ0aWVzTWFwLFxuXHRcdFx0XHRcdFx0cmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzLFxuXHRcdFx0XHRcdFx0dGFibGVDcmVhdGlvbk1vZGVcblx0XHRcdFx0XHQpXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9KTtcblx0Ly8gQ3JlYXRlIGEgcHJvcGVydHlJbmZvIGZvciBlYWNoIHJlbGF0ZWQgcHJvcGVydHkuXG5cdGNvbnN0IHJlbGF0ZWRDb2x1bW5zID0gX2NyZWF0ZVJlbGF0ZWRDb2x1bW5zKFxuXHRcdGNvbHVtbnNUb0JlQ3JlYXRlZCxcblx0XHR0YWJsZUNvbHVtbnMsXG5cdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHRlbnRpdHlUeXBlLFxuXHRcdGRpc3BsYXlNb2RlT2ZEZXNjcmlwdGlvblByb3BlcnRpZXNNYXAsXG5cdFx0dGFibGVDcmVhdGlvbk1vZGUsXG5cdFx0cmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzXG5cdCk7XG5cdHJldHVybiB0YWJsZUNvbHVtbnMuY29uY2F0KHJlbGF0ZWRDb2x1bW5zKTtcbn07XG4vKipcbiAqIENyZWF0ZSBhIGNvbHVtbiBkZWZpbml0aW9uIGZyb20gYSBwcm9wZXJ0eS5cbiAqIEBwYXJhbSBwcm9wZXJ0eSBFbnRpdHkgdHlwZSBwcm9wZXJ0eSBmb3Igd2hpY2ggdGhlIGNvbHVtbiBpcyBjcmVhdGVkXG4gKiBAcGFyYW0gZnVsbFByb3BlcnR5UGF0aCBUaGUgZnVsbCBwYXRoIHRvIHRoZSB0YXJnZXQgcHJvcGVydHlcbiAqIEBwYXJhbSByZWxhdGl2ZVBhdGggVGhlIHJlbGF0aXZlIHBhdGggdG8gdGhlIHRhcmdldCBwcm9wZXJ0eSBiYXNlZCBvbiB0aGUgY29udGV4dFxuICogQHBhcmFtIHVzZURhdGFGaWVsZFByZWZpeCBTaG91bGQgYmUgcHJlZml4ZWQgd2l0aCBcIkRhdGFGaWVsZDo6XCIsIGVsc2UgaXQgd2lsbCBiZSBwcmVmaXhlZCB3aXRoIFwiUHJvcGVydHk6OlwiXG4gKiBAcGFyYW0gYXZhaWxhYmxlRm9yQWRhcHRhdGlvbiBEZWNpZGVzIHdoZXRoZXIgdGhlIGNvbHVtbiBzaG91bGQgYmUgYXZhaWxhYmxlIGZvciBhZGFwdGF0aW9uXG4gKiBAcGFyYW0gYWdncmVnYXRpb25IZWxwZXIgVGhlIGFnZ3JlZ2F0aW9uSGVscGVyIGZvciB0aGUgZW50aXR5XG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCBUaGUgY29udmVydGVyIGNvbnRleHRcbiAqIEBwYXJhbSBkaXNwbGF5TW9kZU9mRGVzY3JpcHRpb25Qcm9wZXJ0aWVzTWFwIFRoZSBtYXAgb2YgcHJvcGVydGllcyByZWZlcmVuY2VkIGFzIGRlc2NyaXB0aW9uIG9uIGEgdGV4dCBhcnJhbmdlbWVudCBhbm5vdGF0aW9uXG4gKiBAcGFyYW0gcmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzIFRoZSBleGlzdGluZyByZXN0cmljdGlvbnMgb24gcHJvcGVydGllc1xuICogQHBhcmFtIHRhYmxlQ3JlYXRpb25Nb2RlIFRoZSBjcmVhdGlvbiBtb2RlIG9mIHRoZSB0YWJsZVxuICogQHBhcmFtIHJlbGF0ZWRQcm9wZXJ0aWVzSW5mbyBUaGUgcHJvcGVydGllcyBpZGVudGlmaWVkIHNvIGZhciBmb3IgdGhlIGNvbHVtblxuICogQHBhcmFtIHJlbGF0aXZlUGF0aEZvck11bHRpVmFsdWUgVGhlIE1EQyBwYXRoIHVzZWQgZm9yIHRoZSAxOm4gcHJvcGVydHkgdG8gYWxsb3cgZmlsdGVyaW5nIGZyb20gTURDXG4gKiBAcmV0dXJucyBUaGUgYW5ub3RhdGlvbiBjb2x1bW4gZGVmaW5pdGlvblxuICovXG5jb25zdCBnZXRDb2x1bW5EZWZpbml0aW9uRnJvbVByb3BlcnR5ID0gZnVuY3Rpb24gKFxuXHRwcm9wZXJ0eTogUHJvcGVydHksXG5cdGZ1bGxQcm9wZXJ0eVBhdGg6IHN0cmluZyxcblx0cmVsYXRpdmVQYXRoOiBzdHJpbmcsXG5cdHVzZURhdGFGaWVsZFByZWZpeDogYm9vbGVhbixcblx0YXZhaWxhYmxlRm9yQWRhcHRhdGlvbjogYm9vbGVhbixcblx0YWdncmVnYXRpb25IZWxwZXI6IEFnZ3JlZ2F0aW9uSGVscGVyLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sXG5cdGRpc3BsYXlNb2RlT2ZEZXNjcmlwdGlvblByb3BlcnRpZXNNYXA6IFJlY29yZDxzdHJpbmcsIERpc3BsYXlNb2RlPixcblx0cmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzPzogUmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzLFxuXHR0YWJsZUNyZWF0aW9uTW9kZT86IENyZWF0aW9uTW9kZSxcblx0cmVsYXRlZFByb3BlcnRpZXNJbmZvPzogQ29tcGxleFByb3BlcnR5SW5mbyxcblx0cmVsYXRpdmVQYXRoRm9yTXVsdGlWYWx1ZT86IHN0cmluZ1xuKTogQW5ub3RhdGlvblRhYmxlQ29sdW1uIHwgVGVjaG5pY2FsQ29sdW1uIHtcblx0bGV0IG5hbWUsIGtleTtcblx0Y29uc3Qgc2VtYW50aWNPYmplY3RBbm5vdGF0aW9uUGF0aCA9IGdldFNlbWFudGljT2JqZWN0UGF0aChjb252ZXJ0ZXJDb250ZXh0LCBwcm9wZXJ0eSk7XG5cdGNvbnN0IGlzSGlkZGVuID0gaXNSZWZlcmVuY2VQcm9wZXJ0eVN0YXRpY2FsbHlIaWRkZW4ocHJvcGVydHkpO1xuXHRjb25zdCBncm91cFBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHByb3BlcnR5Lm5hbWUgPyBfc2xpY2VBdFNsYXNoKHByb3BlcnR5Lm5hbWUsIHRydWUsIGZhbHNlKSA6IHVuZGVmaW5lZDtcblx0Y29uc3QgaXNHcm91cDogYm9vbGVhbiA9IGdyb3VwUGF0aCAhPSBwcm9wZXJ0eS5uYW1lO1xuXHRjb25zdCBsYWJlbCA9IGdldExhYmVsKHByb3BlcnR5LCBpc0dyb3VwKTtcblx0Y29uc3QgZGF0YVR5cGU6IHN0cmluZyB8IHVuZGVmaW5lZCA9IGdldERhdGFGaWVsZERhdGFUeXBlKHByb3BlcnR5KTtcblx0Y29uc3QgcHJvcGVydHlUeXBlQ29uZmlnID0gZ2V0VHlwZUNvbmZpZyhwcm9wZXJ0eSwgZGF0YVR5cGUpO1xuXHRjb25zdCBpc0FQcm9wZXJ0eUZyb21UZXh0T25seUFubm90YXRpb24gPSBkaXNwbGF5TW9kZU9mRGVzY3JpcHRpb25Qcm9wZXJ0aWVzTWFwW3JlbGF0aXZlUGF0aF0gPT09IFwiRGVzY3JpcHRpb25cIjtcblx0Y29uc3Qgc29ydGFibGUgPVxuXHRcdCghaXNIaWRkZW4gfHwgaXNBUHJvcGVydHlGcm9tVGV4dE9ubHlBbm5vdGF0aW9uKSAmJiAhcmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzPy5ub25Tb3J0YWJsZVByb3BlcnRpZXMuaW5jbHVkZXMocmVsYXRpdmVQYXRoKTtcblx0Y29uc3QgZmlsdGVyYWJsZSA9ICFpc0FQcm9wZXJ0eUZyb21UZXh0T25seUFubm90YXRpb24gJiYgIXJlc3RyaWN0aW9uc09uUHJvcGVydGllcz8ubm9uRmlsdGVyYWJsZVByb3BlcnRpZXMuaW5jbHVkZXMocmVsYXRpdmVQYXRoKTtcblx0Y29uc3QgdHlwZUNvbmZpZyA9IHtcblx0XHRjbGFzc05hbWU6IHByb3BlcnR5LnR5cGUgfHwgZGF0YVR5cGUsXG5cdFx0Zm9ybWF0T3B0aW9uczogcHJvcGVydHlUeXBlQ29uZmlnLmZvcm1hdE9wdGlvbnMsXG5cdFx0Y29uc3RyYWludHM6IHByb3BlcnR5VHlwZUNvbmZpZy5jb25zdHJhaW50c1xuXHR9O1xuXHRsZXQgZXhwb3J0U2V0dGluZ3M6IENvbHVtbkV4cG9ydFNldHRpbmdzIHwgbnVsbCA9IG51bGw7XG5cdGlmIChfaXNFeHBvcnRhYmxlQ29sdW1uKHByb3BlcnR5KSkge1xuXHRcdGV4cG9ydFNldHRpbmdzID0gY3JlYXRlQ29sdW1uRXhwb3J0U2V0dGluZ3MocHJvcGVydHksIHJlbGF0ZWRQcm9wZXJ0aWVzSW5mbyk7XG5cdH1cblx0Y29uc3QgYXZhaWxhYmlsaXR5OiBBdmFpbGFiaWxpdHlUeXBlID1cblx0XHQhYXZhaWxhYmxlRm9yQWRhcHRhdGlvbiB8fCBpc0hpZGRlbiB8fCBkaXNwbGF5TW9kZU9mRGVzY3JpcHRpb25Qcm9wZXJ0aWVzTWFwW3JlbGF0aXZlUGF0aF0gPyBcIkhpZGRlblwiIDogXCJBZGFwdGF0aW9uXCI7XG5cdGNvbnN0IGNvbGxlY3RlZE5hdmlnYXRpb25Qcm9wZXJ0eUxhYmVsczogc3RyaW5nW10gfCB1bmRlZmluZWQgPSBfZ2V0Q29sbGVjdGVkTmF2aWdhdGlvblByb3BlcnR5TGFiZWxzKHJlbGF0aXZlUGF0aCwgY29udmVydGVyQ29udGV4dCk7XG5cdGlmIChyZWxhdGl2ZVBhdGhGb3JNdWx0aVZhbHVlKSB7XG5cdFx0bmFtZSA9IHJlbGF0aXZlUGF0aEZvck11bHRpVmFsdWU7XG5cdFx0a2V5ID0gXCJEYXRhRmllbGQ6OlwiICsgcmVwbGFjZVNwZWNpYWxDaGFycyhyZWxhdGl2ZVBhdGhGb3JNdWx0aVZhbHVlKTtcblx0XHRyZWxhdGl2ZVBhdGggPSByZWxhdGl2ZVBhdGhGb3JNdWx0aVZhbHVlO1xuXHR9IGVsc2Uge1xuXHRcdG5hbWUgPSB1c2VEYXRhRmllbGRQcmVmaXggPyByZWxhdGl2ZVBhdGggOiBgUHJvcGVydHk6OiR7cmVsYXRpdmVQYXRofWA7XG5cdFx0a2V5ID0gKHVzZURhdGFGaWVsZFByZWZpeCA/IFwiRGF0YUZpZWxkOjpcIiA6IFwiUHJvcGVydHk6OlwiKSArIHJlcGxhY2VTcGVjaWFsQ2hhcnMocmVsYXRpdmVQYXRoKTtcblx0fVxuXG5cdGNvbnN0IGNvbHVtbjogQW5ub3RhdGlvblRhYmxlQ29sdW1uID0ge1xuXHRcdGtleToga2V5LFxuXHRcdHR5cGU6IENvbHVtblR5cGUuQW5ub3RhdGlvbixcblx0XHRsYWJlbDogbGFiZWwsXG5cdFx0Z3JvdXBMYWJlbDogaXNHcm91cCA/IGdldExhYmVsKHByb3BlcnR5KSA6IHVuZGVmaW5lZCxcblx0XHRncm91cDogaXNHcm91cCA/IGdyb3VwUGF0aCA6IHVuZGVmaW5lZCxcblx0XHRhbm5vdGF0aW9uUGF0aDogZnVsbFByb3BlcnR5UGF0aCxcblx0XHRzZW1hbnRpY09iamVjdFBhdGg6IHNlbWFudGljT2JqZWN0QW5ub3RhdGlvblBhdGgsXG5cdFx0YXZhaWxhYmlsaXR5OiBhdmFpbGFiaWxpdHksXG5cdFx0bmFtZTogbmFtZSxcblx0XHRyZWxhdGl2ZVBhdGg6IHJlbGF0aXZlUGF0aCxcblx0XHRzb3J0YWJsZTogc29ydGFibGUsXG5cdFx0ZmlsdGVyYWJsZTogZmlsdGVyYWJsZSxcblx0XHRpc0dyb3VwYWJsZTogYWdncmVnYXRpb25IZWxwZXIuaXNBbmFseXRpY3NTdXBwb3J0ZWQoKSA/ICEhYWdncmVnYXRpb25IZWxwZXIuaXNQcm9wZXJ0eUdyb3VwYWJsZShwcm9wZXJ0eSkgOiBzb3J0YWJsZSxcblx0XHRpc0tleTogcHJvcGVydHkuaXNLZXksXG5cdFx0ZXhwb3J0U2V0dGluZ3M6IGV4cG9ydFNldHRpbmdzLFxuXHRcdGNhc2VTZW5zaXRpdmU6IGlzRmlsdGVyaW5nQ2FzZVNlbnNpdGl2ZShjb252ZXJ0ZXJDb250ZXh0KSxcblx0XHR0eXBlQ29uZmlnOiB0eXBlQ29uZmlnIGFzIFByb3BlcnR5VHlwZUNvbmZpZyxcblx0XHRpbXBvcnRhbmNlOiBnZXRJbXBvcnRhbmNlKGNvbnZlcnRlckNvbnRleHQsIHByb3BlcnR5LmFubm90YXRpb25zPy5VST8uRGF0YUZpZWxkRGVmYXVsdCksXG5cdFx0cmVxdWlyZWQ6IGlzUmVxdWlyZWRDb2x1bW4oY29udmVydGVyQ29udGV4dCwgcHJvcGVydHksIHRhYmxlQ3JlYXRpb25Nb2RlKSxcblx0XHRhZGRpdGlvbmFsTGFiZWxzOiBjb2xsZWN0ZWROYXZpZ2F0aW9uUHJvcGVydHlMYWJlbHNcblx0fTtcblx0X2FkZFRvb2xUaXAocHJvcGVydHksIGNvbHVtbik7XG5cdF9zZXRFeHBvcnRTZXR0aW5nc0ZvckRhdGFQb2ludChwcm9wZXJ0eSwgY29sdW1uKTtcblxuXHRpZiAoXG5cdFx0YWdncmVnYXRpb25IZWxwZXIuaXNBbmFseXRpY3NTdXBwb3J0ZWQoKSAmJlxuXHRcdE1vZGVsSGVscGVyLmlzT2JqZWN0UGF0aERyYWZ0U3VwcG9ydGVkKGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpKSAmJlxuXHRcdChyZWxhdGl2ZVBhdGggPT09IFwiSGFzQWN0aXZlRW50aXR5XCIgfHwgcmVsYXRpdmVQYXRoID09PSBcIkhhc0RyYWZ0RW50aXR5XCIpXG5cdCkge1xuXHRcdC8vIEluIGNhc2Ugb2YgYW5hbHl0aWNhbCB0YWJsZSBvbiBhIGRyYWZ0LWVuYWJsZWQgZW50aXR5LCB3ZSBhbHdheXMgY29uc2lkZXIgdGhlIEhhc0RyYWZ0RW50aXR5IGFuZCBIYXNBY3RpdmVFbnRpdHkgcHJvcGVydGllcyBhc1xuXHRcdC8vIHRlY2huaWNhbGx5IGdyb3VwYWJsZSwgYXMgd2UgbmVlZCB0byBsb2FkIHRoZW0gZm9yIG91ciBpbnRlcm5hbCBsb2dpYy5cblx0XHRjb25zdCBlbmhhbmNlZENvbHVtbiA9IGNvbHVtbiBhcyBUZWNobmljYWxDb2x1bW47XG5cdFx0ZW5oYW5jZWRDb2x1bW4uZXh0ZW5zaW9uID0ge1xuXHRcdFx0dGVjaG5pY2FsbHlBZ2dyZWdhdGFibGU6IGZhbHNlLFxuXHRcdFx0dGVjaG5pY2FsbHlHcm91cGFibGU6IHRydWVcblx0XHR9O1xuXHRcdHJldHVybiBlbmhhbmNlZENvbHVtbjtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gY29sdW1uO1xuXHR9XG59O1xuLyoqXG4gKiBDcmVhdGUgdGhlIGV4cG9ydCBzZXR0aW5ncyBmb3IgYSBnaXZlbiBjb2x1bW4uXG4gKiBAcGFyYW0gY29sdW1uIFRoZSBnaXZlbiBjb2x1bW4gZnJvbSBhIGxpbmUgaXRlbSBhcyBhIGRhdGEgZmllbGQgb3IgYSBwcm9wZXJ0eSBmcm9tIHRoZSBlbnRpdHkgdHlwZVxuICogQHBhcmFtIHJlbGF0ZWRQcm9wZXJ0aWVzSW5mbyBUaGUgcmVsYXRlZCBwcm9wZXJ0aWVzIGxpbmtlZCB0byB0aGUgY29sdW1uIChuYW1lZCBhbHNvIGNvbXBsZXggcHJvcGVydHkpXG4gKiBAcmV0dXJucyBUaGUgZXhwb3J0IHNldHRpbmdzIGluIGEgdGhlIGdpdmVuIGNvbHVtblxuICovXG5jb25zdCBjcmVhdGVDb2x1bW5FeHBvcnRTZXR0aW5ncyA9IGZ1bmN0aW9uIChcblx0Y29sdW1uOiBQcm9wZXJ0eSB8IERhdGFGaWVsZEFic3RyYWN0VHlwZXMsXG5cdHJlbGF0ZWRQcm9wZXJ0aWVzSW5mbz86IENvbXBsZXhQcm9wZXJ0eUluZm9cbik6IENvbHVtbkV4cG9ydFNldHRpbmdzIHtcblx0bGV0IHVuaXRQcm9wZXJ0eSwgdGltZXpvbmVQcm9wZXJ0eSwgdW5pdFRleHQsIHRpbWV6b25lVGV4dCwgdXRjLCBpc0FUaW1lem9uZSwgY3VycmVuY3lQcm9wZXJ0eSwgc2NhbGU7XG5cdGNvbnN0IHJlbGF0ZWRQcm9wZXJ0eU5hbWVzID0gcmVsYXRlZFByb3BlcnRpZXNJbmZvID8gT2JqZWN0LmtleXMocmVsYXRlZFByb3BlcnRpZXNJbmZvLnByb3BlcnRpZXMpIDogW107XG5cdGlmIChyZWxhdGVkUHJvcGVydGllc0luZm8gJiYgcmVsYXRlZFByb3BlcnR5TmFtZXM/Lmxlbmd0aCA9PT0gMSkge1xuXHRcdC8vIENyZWF0ZSB0aGUgZXhwb3J0IHNldHRpbmdzIG9mIGEgY29sdW1uIGJhc2VkIG9uIHRoZSByZWxhdGVkIChjaGlsZCkgcHJvcGVydHkgaW4gY2FzZSB0aGVyZSBpcyBvbmx5IG9uZS5cblx0XHQvLyBUaGlzIGlzIHJlcXVpcmVkIHdoZW4gd2UgaGF2ZSBhIHRleHQgb25seSBhbm5vdGF0aW9uIHRvIGNvbXB1dGUgdGhlIGV4cG9ydCBzZXR0aW5ncyBmcm9tIHRoZSB0ZXh0IGluc3RlYWQgb2YgdGhlIHZhbHVlXG5cdFx0Y29sdW1uID0gcmVsYXRlZFByb3BlcnRpZXNJbmZvLnByb3BlcnRpZXNbcmVsYXRlZFByb3BlcnR5TmFtZXNbMF1dLmFubm90YXRpb25Qcm9wZXJ0eTtcblx0fVxuXHRjb25zdCBkYXRhVHlwZSA9IGdldERhdGFGaWVsZERhdGFUeXBlKGNvbHVtbik7XG5cdGlmIChpc1Byb3BlcnR5KGNvbHVtbikpIHtcblx0XHR1bml0UHJvcGVydHkgPSBnZXRBc3NvY2lhdGVkVW5pdFByb3BlcnR5KGNvbHVtbik7XG5cdFx0Y3VycmVuY3lQcm9wZXJ0eSA9IGdldEFzc29jaWF0ZWRDdXJyZW5jeVByb3BlcnR5KGNvbHVtbik7XG5cdFx0dGltZXpvbmVQcm9wZXJ0eSA9IGdldEFzc29jaWF0ZWRUaW1lem9uZVByb3BlcnR5KGNvbHVtbik7XG5cdFx0dW5pdFRleHQgPSBnZXRTdGF0aWNVbml0T3JDdXJyZW5jeShjb2x1bW4pO1xuXHRcdHRpbWV6b25lVGV4dCA9IGdldFN0YXRpY1RpbWV6b25lKGNvbHVtbik7XG5cdFx0aXNBVGltZXpvbmUgPSBpc1RpbWV6b25lKGNvbHVtbik7XG5cdFx0c2NhbGUgPSBjb2x1bW4uc2NhbGU7XG5cdH1cblx0dW5pdFByb3BlcnR5ID0gcmVsYXRlZFByb3BlcnRpZXNJbmZvPy5leHBvcnRTZXR0aW5ncz8udW5pdFByb3BlcnR5ID8/IHVuaXRQcm9wZXJ0eT8ubmFtZSA/PyBjdXJyZW5jeVByb3BlcnR5Py5uYW1lO1xuXHR0aW1lem9uZVByb3BlcnR5ID0gcmVsYXRlZFByb3BlcnRpZXNJbmZvPy5leHBvcnRTZXR0aW5ncz8udGltZXpvbmVQcm9wZXJ0eSA/PyB0aW1lem9uZVByb3BlcnR5Py5uYW1lO1xuXHRzY2FsZSA9IHJlbGF0ZWRQcm9wZXJ0aWVzSW5mbz8uZXhwb3J0U2V0dGluZ3M/LnNjYWxlID8/IHNjYWxlO1xuXHRjb25zdCBleHBvcnRUeXBlID0gZ2V0RXhwb3J0RGF0YVR5cGUoZGF0YVR5cGUsIGlzQVRpbWV6b25lLCAhIWN1cnJlbmN5UHJvcGVydHksIHJlbGF0ZWRQcm9wZXJ0aWVzSW5mbz8uZXhwb3J0U2V0dGluZ3MpO1xuXHRpZiAodGltZXpvbmVQcm9wZXJ0eSB8fCAoZXhwb3J0VHlwZSA9PT0gXCJEYXRlVGltZVwiICYmICF0aW1lem9uZVRleHQpKSB7XG5cdFx0dXRjID0gZmFsc2U7XG5cdH1cblx0Y29uc3QgZXhwb3J0U2V0dGluZ3M6IENvbHVtbkV4cG9ydFNldHRpbmdzID0ge1xuXHRcdHR5cGU6IGV4cG9ydFR5cGUsXG5cdFx0aW5wdXRGb3JtYXQ6IGdldERhdGVJbnB1dEZvcm1hdChkYXRhVHlwZSksXG5cdFx0ZGVsaW1pdGVyOiBnZXREZWxpbWl0ZXIoZGF0YVR5cGUpLFxuXHRcdHNjYWxlOiBzY2FsZSxcblx0XHR1bml0UHJvcGVydHk6IHVuaXRQcm9wZXJ0eSxcblx0XHR1bml0OiByZWxhdGVkUHJvcGVydGllc0luZm8/LmV4cG9ydFNldHRpbmdzLnVuaXQgPz8gdW5pdFRleHQsXG5cdFx0dGltZXpvbmVQcm9wZXJ0eTogdGltZXpvbmVQcm9wZXJ0eSxcblx0XHR0aW1lem9uZTogcmVsYXRlZFByb3BlcnRpZXNJbmZvPy5leHBvcnRTZXR0aW5ncy50aW1lem9uZSA/PyB0aW1lem9uZVRleHQ/LnRvU3RyaW5nKCksXG5cdFx0dGVtcGxhdGU6IHJlbGF0ZWRQcm9wZXJ0aWVzSW5mbz8uZXhwb3J0U2V0dGluZ3MudGVtcGxhdGUsXG5cdFx0Ly9vbmx5IGluIGNhc2Ugb2YgY29tcGxleCBwcm9wZXJ0aWVzLCB3cmFwIHRoZSBjZWxsIGNvbnRlbnRcdG9uIHRoZSBleGNlbCBleHBvcnRlZCBmaWxlXG5cdFx0d3JhcDogcmVsYXRlZFByb3BlcnRpZXNJbmZvPy5leHBvcnRTZXR0aW5ncy53cmFwLFxuXHRcdHV0YzogdXRjXG5cdH07XG5cdGlmIChleHBvcnRTZXR0aW5ncy51bml0UHJvcGVydHkgfHwgZXhwb3J0U2V0dGluZ3MudW5pdCkge1xuXHRcdGV4cG9ydFNldHRpbmdzLmF1dG9TY2FsZSA9IHRydWU7XG5cdH1cblx0cmV0dXJuIHJlbW92ZVVuZGVmaW5lZEZyb21FeHBvcnRTZXR0aW5ncyhleHBvcnRTZXR0aW5ncyk7XG59O1xuLyoqXG4gKiBHZXRzIHRoZSBleHBvcnQgZm9ybWF0IHRlbXBsYXRlIGZvciBjb2x1bW5zIHdpdGggZGF0ZXMuXG4gKiBAcGFyYW0gZGF0YVR5cGUgVGhlIGRhdGEgdHlwZSBvZiB0aGUgY29sdW1uXG4gKiBAcmV0dXJucyBUaGUgaW5wdXRGb3JtYXRcbiAqL1xuY29uc3QgZ2V0RGF0ZUlucHV0Rm9ybWF0ID0gZnVuY3Rpb24gKGRhdGFUeXBlPzogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0cmV0dXJuIGRhdGFUeXBlID09PSBcIkVkbS5EYXRlXCIgPyBcIllZWVktTU0tRERcIiA6IHVuZGVmaW5lZDtcbn07XG4vKipcbiAqIEdldHMgdGhlIGRlbGltaXRlciBpbiBudW1lcmljIGNvbHVtbnMuXG4gKiBUaGUgZGVsaW1pdGVyIGlzIHVzZWQgdG8gZGlzcGxheSB0aG91c2FuZHMgc2VwYXJhdG9yIGluIG51bWVyaWMgY29sdW1ucy5cbiAqIEBwYXJhbSBkYXRhVHlwZSBUaGUgZGF0YSB0eXBlIG9mIHRoZSBjb2x1bW5cbiAqIEByZXR1cm5zIFRydWUgdG8gZGlzcGxheSB0aG91c2FuZHMgc2VwYXJhdG9yIGluIG51bWVyaWMgY29sdW1uc1xuICovXG5jb25zdCBnZXREZWxpbWl0ZXIgPSBmdW5jdGlvbiAoZGF0YVR5cGU/OiBzdHJpbmcpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcblx0cmV0dXJuIGRhdGFUeXBlID09PSBcIkVkbS5JbnQ2NFwiID8gdHJ1ZSA6IHVuZGVmaW5lZDtcbn07XG4vKipcbiAqIFJlbW92ZXMgdW5kZWZpbmVkIHZhbHVlcyBmcm9tIHRoZSBleHBvcnQgc2V0dGluZ3Mgb2JqZWN0IG9mIGEgY29sdW1uLlxuICogQHBhcmFtIGV4cG9ydFNldHRpbmdzIFRoZSBleHBvcnQgc2V0dGluZ3MgY29uZmlndXJhdGlvbnMgZm9yIGEgY29sdW1uXG4gKiBAcmV0dXJucyBUaGUgZXhwb3J0IHNldHRpbmdzIGNvbmZpZ3VyYXRpb25zIHdpdGhvdXQgdW5kZWZpbmVkIHZhbHVlc1xuICovXG5jb25zdCByZW1vdmVVbmRlZmluZWRGcm9tRXhwb3J0U2V0dGluZ3MgPSBmdW5jdGlvbiAoZXhwb3J0U2V0dGluZ3M6IENvbHVtbkV4cG9ydFNldHRpbmdzKTogQ29sdW1uRXhwb3J0U2V0dGluZ3Mge1xuXHQvL1JlbW92ZSB1bmRlZmluZWQgc2V0dGluZ3MgZnJvbSBleHBvcnRTZXR0aW5nIG9iamVjdFxuXHRmb3IgKGNvbnN0IHNldHRpbmcgaW4gZXhwb3J0U2V0dGluZ3MpIHtcblx0XHRpZiAoZXhwb3J0U2V0dGluZ3Nbc2V0dGluZyBhcyBrZXlvZiBDb2x1bW5FeHBvcnRTZXR0aW5nc10gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0ZGVsZXRlIGV4cG9ydFNldHRpbmdzW3NldHRpbmcgYXMga2V5b2YgQ29sdW1uRXhwb3J0U2V0dGluZ3NdO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gZXhwb3J0U2V0dGluZ3M7XG59O1xuLyoqXG4gKiBVcGRhdGUgcHJvcGVydHkgbGFiZWwgaW4gY2FzZSBpdCdzIG9ubHkgcmVmZXJlbmNlZCBpbiBvbmUgY29sdW1uLiBUaGUgbGFiZWwgb2YgdGhlIGNvbHVtbiBtdXN0IGJlIHVzZWQgaW5zdGVhZCBvZiB0aGUgcHJvcGVydHkgbGFiZWwuXG4gKiBUaGlzIHVwZGF0ZSBhbHNvIGlzIGFwcGxpZWQgZm9yIHRoZSB0b29sdGlwIGFzIGl0IGlzIGJhc2VkIG9uIHRoZSBjb2x1bW4ncyBsYWJlbC5cbiAqIEBwYXJhbSBhbm5vdGF0aW9uQ29sdW1ucyBUaGUgYXJyYXkgb2YgY29sdW1ucyBjcmVhdGVkIGJhc2VkIG9uIExpbmVJdGVtIGFubm90YXRpb25zLlxuICogQHBhcmFtIGNvbHVtbnNUb0JlQ3JlYXRlZCBUaGUgY29sdW1ucyB0byBiZSBjcmVhdGVkXG4gKiBAcGFyYW0gY29sdW1uSW5mbyBUaGUgY29sdW1uIGRlZmluaXRpb25cbiAqIEBwYXJhbSBjb2x1bW5OYW1lIFRoZSBuYW1lIG9mIHRoZSBjb2x1bW5cbiAqL1xuZnVuY3Rpb24gdXBkYXRlUHJvcGVydHlMYWJlbChcblx0YW5ub3RhdGlvbkNvbHVtbnM6IEFubm90YXRpb25UYWJsZUNvbHVtbltdLFxuXHRjb2x1bW5zVG9CZUNyZWF0ZWQ6IFJlY29yZDxzdHJpbmcsIFByb3BlcnR5Pixcblx0Y29sdW1uSW5mbzogQW5ub3RhdGlvblRhYmxlQ29sdW1uLFxuXHRjb2x1bW5OYW1lPzogc3RyaW5nXG4pOiB2b2lkIHtcblx0Y29uc3QgbGlua2VkQW5ub3RhdGlvbkNvbHVtbnMgPSBhbm5vdGF0aW9uQ29sdW1ucy5maWx0ZXIoXG5cdFx0KGNvbCkgPT4gY29sLnByb3BlcnR5SW5mb3M/LmluY2x1ZGVzKGNvbHVtbkluZm8ucmVsYXRpdmVQYXRoKSB8fCAoY29sdW1uTmFtZSAmJiBjb2wucHJvcGVydHlJbmZvcz8uaW5jbHVkZXMoY29sdW1uTmFtZSkpXG5cdCk7XG5cdGlmIChcblx0XHRsaW5rZWRBbm5vdGF0aW9uQ29sdW1ucz8ubGVuZ3RoID09PSAxICYmXG5cdFx0KGNvbHVtbnNUb0JlQ3JlYXRlZFtjb2x1bW5JbmZvLnJlbGF0aXZlUGF0aF0gfHwgKGNvbHVtbk5hbWUgJiYgY29sdW1uc1RvQmVDcmVhdGVkW2NvbHVtbk5hbWVdKSkgJiZcblx0XHRsaW5rZWRBbm5vdGF0aW9uQ29sdW1uc1swXS5wcm9wZXJ0eUluZm9zPy5sZW5ndGggPT09IDFcblx0KSB7XG5cdFx0Y29sdW1uSW5mby5sYWJlbCA9IGxpbmtlZEFubm90YXRpb25Db2x1bW5zWzBdLmxhYmVsO1xuXHRcdGNvbHVtbkluZm8udG9vbHRpcCA9IGxpbmtlZEFubm90YXRpb25Db2x1bW5zWzBdLnRvb2x0aXA7XG5cdH1cbn1cbi8qKlxuICogUmV0dXJucyBCb29sZWFuIHRydWUgZm9yIGV4cG9ydGFibGUgY29sdW1ucywgZmFsc2UgZm9yIG5vbiBleHBvcnRhYmxlIGNvbHVtbnMuXG4gKiBAcGFyYW0gc291cmNlIFRoZSBkYXRhRmllbGQgb3IgcHJvcGVydHkgdG8gYmUgZXZhbHVhdGVkXG4gKiBAcmV0dXJucyBUcnVlIGZvciBleHBvcnRhYmxlIGNvbHVtbiwgZmFsc2UgZm9yIG5vbiBleHBvcnRhYmxlIGNvbHVtblxuICovXG5mdW5jdGlvbiBfaXNFeHBvcnRhYmxlQ29sdW1uKHNvdXJjZTogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyB8IFByb3BlcnR5KTogYm9vbGVhbiB7XG5cdGxldCBwcm9wZXJ0eVR5cGUsIHByb3BlcnR5O1xuXHRjb25zdCBkYXRhRmllbGREZWZhdWx0UHJvcGVydHkgPSAoc291cmNlIGFzIFByb3BlcnR5KS5hbm5vdGF0aW9ucy5VST8uRGF0YUZpZWxkRGVmYXVsdDtcblx0aWYgKGlzUHJvcGVydHkoc291cmNlKSkge1xuXHRcdGlmIChpc1JlZmVyZW5jZVByb3BlcnR5U3RhdGljYWxseUhpZGRlbihzb3VyY2UpKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHRcdHByb3BlcnR5VHlwZSA9IGRhdGFGaWVsZERlZmF1bHRQcm9wZXJ0eT8uJFR5cGU7XG5cdH0gZWxzZSBpZiAoaXNSZWZlcmVuY2VQcm9wZXJ0eVN0YXRpY2FsbHlIaWRkZW4oc291cmNlKSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fSBlbHNlIHtcblx0XHRwcm9wZXJ0eSA9IHNvdXJjZTtcblx0XHRwcm9wZXJ0eVR5cGUgPSBwcm9wZXJ0eS4kVHlwZTtcblx0XHRpZiAocHJvcGVydHlUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBbm5vdGF0aW9uICYmIChwcm9wZXJ0eSBhcyBEYXRhRmllbGRGb3JBbm5vdGF0aW9uKS5UYXJnZXQ/LiR0YXJnZXQ/LiRUeXBlKSB7XG5cdFx0XHQvL0ZvciBDaGFydFxuXHRcdFx0cHJvcGVydHlUeXBlID0gKHByb3BlcnR5IGFzIERhdGFGaWVsZEZvckFubm90YXRpb24pLlRhcmdldD8uJHRhcmdldD8uJFR5cGU7XG5cdFx0XHRyZXR1cm4gcHJvcGVydHlUeXBlICE9PSB1bmRlZmluZWQgJiYgIVVJQW5ub3RhdGlvblR5cGVzLkNoYXJ0RGVmaW5pdGlvblR5cGUuaW5jbHVkZXMocHJvcGVydHlUeXBlKTtcblx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0KHByb3BlcnR5IGFzIERhdGFGaWVsZCkuVmFsdWU/LiR0YXJnZXQ/LmFubm90YXRpb25zPy5Db3JlPy5NZWRpYVR5cGU/LnRlcm0gPT09IFwiT3JnLk9EYXRhLkNvcmUuVjEuTWVkaWFUeXBlXCIgJiZcblx0XHRcdChwcm9wZXJ0eSBhcyBEYXRhRmllbGQpLlZhbHVlPy4kdGFyZ2V0Py5hbm5vdGF0aW9ucz8uQ29yZT8uaXNVUkwgIT09IHRydWVcblx0XHQpIHtcblx0XHRcdC8vRm9yIFN0cmVhbVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gcHJvcGVydHlUeXBlXG5cdFx0PyAhW1xuXHRcdFx0XHRVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBY3Rpb24sXG5cdFx0XHRcdFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbixcblx0XHRcdFx0VUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQWN0aW9uR3JvdXBcblx0XHQgIF0uaW5jbHVkZXMocHJvcGVydHlUeXBlKVxuXHRcdDogdHJ1ZTtcbn1cbi8qKlxuICogUmV0dXJucyBCb29sZWFuIHRydWUgZm9yIHZhbGlkIGNvbHVtbnMsIGZhbHNlIGZvciBpbnZhbGlkIGNvbHVtbnMuXG4gKiBAcGFyYW0gZGF0YUZpZWxkIERpZmZlcmVudCBEYXRhRmllbGQgdHlwZXMgZGVmaW5lZCBpbiB0aGUgYW5ub3RhdGlvbnNcbiAqIEByZXR1cm5zIFRydWUgZm9yIHZhbGlkIGNvbHVtbnMsIGZhbHNlIGZvciBpbnZhbGlkIGNvbHVtbnNcbiAqL1xuY29uc3QgX2lzVmFsaWRDb2x1bW4gPSBmdW5jdGlvbiAoZGF0YUZpZWxkOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzKTogYm9vbGVhbiB7XG5cdHN3aXRjaCAoZGF0YUZpZWxkLiRUeXBlKSB7XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBY3Rpb246XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb246XG5cdFx0XHRyZXR1cm4gISFkYXRhRmllbGQuSW5saW5lO1xuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aEFjdGlvbjpcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhJbnRlbnRCYXNlZE5hdmlnYXRpb246XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGQ6XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoVXJsOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQW5ub3RhdGlvbjpcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhOYXZpZ2F0aW9uUGF0aDpcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdGRlZmF1bHQ6XG5cdFx0XHQvLyBUb2RvOiBSZXBsYWNlIHdpdGggcHJvcGVyIExvZyBzdGF0ZW1lbnQgb25jZSBhdmFpbGFibGVcblx0XHRcdC8vICB0aHJvdyBuZXcgRXJyb3IoXCJVbmhhbmRsZWQgRGF0YUZpZWxkIEFic3RyYWN0IHR5cGU6IFwiICsgZGF0YUZpZWxkLiRUeXBlKTtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0fVxufTtcbi8qKlxuICogUmV0dXJucyB0aGUgYmluZGluZyBleHByZXNzaW9uIHRvIGV2YWx1YXRlIHRoZSB2aXNpYmlsaXR5IG9mIGEgRGF0YUZpZWxkIG9yIERhdGFQb2ludCBhbm5vdGF0aW9uLlxuICpcbiAqIFNBUCBGaW9yaSBlbGVtZW50cyB3aWxsIGV2YWx1YXRlIGVpdGhlciB0aGUgVUkuSGlkZGVuIGFubm90YXRpb24gZGVmaW5lZCBvbiB0aGUgYW5ub3RhdGlvbiBpdHNlbGYgb3Igb24gdGhlIHRhcmdldCBwcm9wZXJ0eS5cbiAqIEBwYXJhbSBkYXRhRmllbGRNb2RlbFBhdGggVGhlIG1ldGFwYXRoIHJlZmVycmluZyB0byB0aGUgYW5ub3RhdGlvbiB0aGF0IGlzIGV2YWx1YXRlZCBieSBTQVAgRmlvcmkgZWxlbWVudHMuXG4gKiBAcmV0dXJucyBBbiBleHByZXNzaW9uIHRoYXQgeW91IGNhbiBiaW5kIHRvIHRoZSBVSS5cbiAqL1xuZXhwb3J0IGNvbnN0IF9nZXRWaXNpYmxlRXhwcmVzc2lvbiA9IGZ1bmN0aW9uIChcblx0ZGF0YUZpZWxkTW9kZWxQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoPERhdGFGaWVsZEFic3RyYWN0VHlwZXMgfCBEYXRhUG9pbnRUeXBlVHlwZXM+XG4pOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj4ge1xuXHRjb25zdCB0YXJnZXRPYmplY3QgPSBkYXRhRmllbGRNb2RlbFBhdGgudGFyZ2V0T2JqZWN0O1xuXHRsZXQgcHJvcGVydHlWYWx1ZTtcblx0aWYgKHRhcmdldE9iamVjdCkge1xuXHRcdHN3aXRjaCAodGFyZ2V0T2JqZWN0LiRUeXBlKSB7XG5cdFx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZDpcblx0XHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aFVybDpcblx0XHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aE5hdmlnYXRpb25QYXRoOlxuXHRcdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoSW50ZW50QmFzZWROYXZpZ2F0aW9uOlxuXHRcdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoQWN0aW9uOlxuXHRcdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhUG9pbnRUeXBlOlxuXHRcdFx0XHRwcm9wZXJ0eVZhbHVlID0gdGFyZ2V0T2JqZWN0LlZhbHVlLiR0YXJnZXQ7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBbm5vdGF0aW9uOlxuXHRcdFx0XHQvLyBpZiBpdCBpcyBhIERhdGFGaWVsZEZvckFubm90YXRpb24gcG9pbnRpbmcgdG8gYSBEYXRhUG9pbnQgd2UgbG9vayBhdCB0aGUgZGF0YVBvaW50J3MgdmFsdWVcblx0XHRcdFx0aWYgKHRhcmdldE9iamVjdD8uVGFyZ2V0Py4kdGFyZ2V0Py4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YVBvaW50VHlwZSkge1xuXHRcdFx0XHRcdHByb3BlcnR5VmFsdWUgPSB0YXJnZXRPYmplY3QuVGFyZ2V0LiR0YXJnZXQ/LlZhbHVlLiR0YXJnZXQ7XG5cdFx0XHRcdH1cblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbjpcblx0XHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQWN0aW9uOlxuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0cHJvcGVydHlWYWx1ZSA9IHVuZGVmaW5lZDtcblx0XHR9XG5cdH1cblx0Y29uc3QgaXNBbmFseXRpY2FsR3JvdXBIZWFkZXJFeHBhbmRlZCA9IC8qZm9ybWF0T3B0aW9ucz8uaXNBbmFseXRpY3MgPyBVSS5Jc0V4cGFuZGVkIDoqLyBjb25zdGFudChmYWxzZSk7XG5cdGNvbnN0IGlzQW5hbHl0aWNhbExlYWYgPSAvKmZvcm1hdE9wdGlvbnM/LmlzQW5hbHl0aWNzID8gZXF1YWwoVUkuTm9kZUxldmVsLCAwKSA6Ki8gY29uc3RhbnQoZmFsc2UpO1xuXHQvLyBBIGRhdGEgZmllbGQgaXMgdmlzaWJsZSBpZjpcblx0Ly8gLSB0aGUgVUkuSGlkZGVuIGV4cHJlc3Npb24gaW4gdGhlIG9yaWdpbmFsIGFubm90YXRpb24gZG9lcyBub3QgZXZhbHVhdGUgdG8gJ3RydWUnXG5cdC8vIC0gdGhlIFVJLkhpZGRlbiBleHByZXNzaW9uIGluIHRoZSB0YXJnZXQgcHJvcGVydHkgZG9lcyBub3QgZXZhbHVhdGUgdG8gJ3RydWUnXG5cdC8vIC0gaW4gY2FzZSBvZiBBbmFseXRpY3MgaXQncyBub3QgdmlzaWJsZSBmb3IgYW4gZXhwYW5kZWQgR3JvdXBIZWFkZXJcblx0cmV0dXJuIGFuZChcblx0XHQuLi5bXG5cdFx0XHRub3QoZXF1YWwoZ2V0RXhwcmVzc2lvbkZyb21Bbm5vdGF0aW9uKHRhcmdldE9iamVjdD8uYW5ub3RhdGlvbnM/LlVJPy5IaWRkZW4pLCB0cnVlKSksXG5cdFx0XHRpZkVsc2UoXG5cdFx0XHRcdCEhcHJvcGVydHlWYWx1ZSxcblx0XHRcdFx0cHJvcGVydHlWYWx1ZSAmJiBub3QoZXF1YWwoZ2V0RXhwcmVzc2lvbkZyb21Bbm5vdGF0aW9uKHByb3BlcnR5VmFsdWUuYW5ub3RhdGlvbnM/LlVJPy5IaWRkZW4pLCB0cnVlKSksXG5cdFx0XHRcdHRydWVcblx0XHRcdCksXG5cdFx0XHRvcihub3QoaXNBbmFseXRpY2FsR3JvdXBIZWFkZXJFeHBhbmRlZCksIGlzQW5hbHl0aWNhbExlYWYpXG5cdFx0XVxuXHQpO1xufTtcbi8qKlxuICogUmV0dXJucyBoaWRkZW4gYmluZGluZyBleHByZXNzaW9ucyBmb3IgYSBmaWVsZCBncm91cC5cbiAqIEBwYXJhbSBkYXRhRmllbGRHcm91cCBEYXRhRmllbGQgZGVmaW5lZCBpbiB0aGUgYW5ub3RhdGlvbnNcbiAqIEByZXR1cm5zIENvbXBpbGUgYmluZGluZyBvZiBmaWVsZCBncm91cCBleHByZXNzaW9ucy5cbiAqL1xuY29uc3QgX2dldEZpZWxkR3JvdXBIaWRkZW5FeHByZXNzaW9ucyA9IGZ1bmN0aW9uIChkYXRhRmllbGRHcm91cDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyk6IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIHwgdW5kZWZpbmVkIHtcblx0Y29uc3QgZmllbGRHcm91cEhpZGRlbkV4cHJlc3Npb25zOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj5bXSA9IFtdO1xuXHRpZiAoXG5cdFx0ZGF0YUZpZWxkR3JvdXAuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFubm90YXRpb24gJiZcblx0XHRkYXRhRmllbGRHcm91cC5UYXJnZXQ/LiR0YXJnZXQ/LiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5GaWVsZEdyb3VwVHlwZVxuXHQpIHtcblx0XHRpZiAoZGF0YUZpZWxkR3JvdXA/LmFubm90YXRpb25zPy5VST8uSGlkZGVuKSB7XG5cdFx0XHRyZXR1cm4gY29tcGlsZUV4cHJlc3Npb24obm90KGVxdWFsKGdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbihkYXRhRmllbGRHcm91cC5hbm5vdGF0aW9ucy5VSS5IaWRkZW4pLCB0cnVlKSkpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRkYXRhRmllbGRHcm91cC5UYXJnZXQuJHRhcmdldC5EYXRhPy5mb3JFYWNoKChpbm5lckRhdGFGaWVsZDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyB8IERhdGFQb2ludFR5cGVUeXBlcykgPT4ge1xuXHRcdFx0XHRmaWVsZEdyb3VwSGlkZGVuRXhwcmVzc2lvbnMucHVzaChcblx0XHRcdFx0XHRfZ2V0VmlzaWJsZUV4cHJlc3Npb24oeyB0YXJnZXRPYmplY3Q6IGlubmVyRGF0YUZpZWxkIH0gYXMgRGF0YU1vZGVsT2JqZWN0UGF0aDxcblx0XHRcdFx0XHRcdERhdGFGaWVsZEFic3RyYWN0VHlwZXMgfCBEYXRhUG9pbnRUeXBlVHlwZXNcblx0XHRcdFx0XHQ+KVxuXHRcdFx0XHQpO1xuXHRcdFx0fSk7XG5cdFx0XHRyZXR1cm4gY29tcGlsZUV4cHJlc3Npb24oaWZFbHNlKG9yKC4uLmZpZWxkR3JvdXBIaWRkZW5FeHByZXNzaW9ucyksIGNvbnN0YW50KHRydWUpLCBjb25zdGFudChmYWxzZSkpKTtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxufTtcbi8qKlxuICogUmV0dXJucyB0aGUgbGFiZWwgZm9yIHRoZSBwcm9wZXJ0eSBhbmQgZGF0YUZpZWxkLlxuICogQHBhcmFtIFtwcm9wZXJ0eV0gUHJvcGVydHksIERhdGFGaWVsZCBvciBOYXZpZ2F0aW9uIFByb3BlcnR5IGRlZmluZWQgaW4gdGhlIGFubm90YXRpb25zXG4gKiBAcGFyYW0gaXNHcm91cFxuICogQHJldHVybnMgTGFiZWwgb2YgdGhlIHByb3BlcnR5IG9yIERhdGFGaWVsZFxuICovXG5jb25zdCBnZXRMYWJlbCA9IGZ1bmN0aW9uIChwcm9wZXJ0eTogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyB8IFByb3BlcnR5IHwgTmF2aWdhdGlvblByb3BlcnR5LCBpc0dyb3VwID0gZmFsc2UpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRpZiAoIXByb3BlcnR5KSB7XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxuXHRpZiAoaXNQcm9wZXJ0eShwcm9wZXJ0eSkgfHwgaXNOYXZpZ2F0aW9uUHJvcGVydHkocHJvcGVydHkpKSB7XG5cdFx0Y29uc3QgZGF0YUZpZWxkRGVmYXVsdCA9IChwcm9wZXJ0eSBhcyBQcm9wZXJ0eSkuYW5ub3RhdGlvbnM/LlVJPy5EYXRhRmllbGREZWZhdWx0O1xuXHRcdGlmIChkYXRhRmllbGREZWZhdWx0ICYmICFkYXRhRmllbGREZWZhdWx0LnF1YWxpZmllciAmJiBkYXRhRmllbGREZWZhdWx0LkxhYmVsKSB7XG5cdFx0XHRyZXR1cm4gZGF0YUZpZWxkRGVmYXVsdC5MYWJlbD8udG9TdHJpbmcoKTtcblx0XHR9XG5cdFx0cmV0dXJuIHByb3BlcnR5LmFubm90YXRpb25zLkNvbW1vbj8uTGFiZWw/LnRvU3RyaW5nKCkgPz8gcHJvcGVydHkubmFtZTtcblx0fSBlbHNlIGlmIChpc0RhdGFGaWVsZFR5cGVzKHByb3BlcnR5KSkge1xuXHRcdGlmICghIWlzR3JvdXAgJiYgcHJvcGVydHkuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhJbnRlbnRCYXNlZE5hdmlnYXRpb24pIHtcblx0XHRcdHJldHVybiBwcm9wZXJ0eT8uTGFiZWw/LnRvU3RyaW5nKCk7XG5cdFx0fVxuXHRcdHJldHVybiAoXG5cdFx0XHRwcm9wZXJ0eT8uTGFiZWw/LnRvU3RyaW5nKCkgPz9cblx0XHRcdGNvbXBpbGVFeHByZXNzaW9uKFxuXHRcdFx0XHRnZXRFeHByZXNzaW9uRnJvbUFubm90YXRpb24ocHJvcGVydHkuVmFsdWU/LiR0YXJnZXQ/LmFubm90YXRpb25zPy5Db21tb24/LkxhYmVsLCBbXSwgcHJvcGVydHkuVmFsdWU/LiR0YXJnZXQ/Lm5hbWUpXG5cdFx0XHQpXG5cdFx0KTtcblx0fSBlbHNlIGlmIChwcm9wZXJ0eS4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQW5ub3RhdGlvbikge1xuXHRcdHJldHVybiAoXG5cdFx0XHRwcm9wZXJ0eS5MYWJlbD8udG9TdHJpbmcoKSA/P1xuXHRcdFx0Y29tcGlsZUV4cHJlc3Npb24oXG5cdFx0XHRcdGdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbigocHJvcGVydHkuVGFyZ2V0Py4kdGFyZ2V0IGFzIERhdGFQb2ludCk/LlZhbHVlPy4kdGFyZ2V0Py5hbm5vdGF0aW9ucz8uQ29tbW9uPy5MYWJlbD8udmFsdWVPZigpKVxuXHRcdFx0KVxuXHRcdCk7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIHByb3BlcnR5LkxhYmVsPy50b1N0cmluZygpO1xuXHR9XG59O1xuY29uc3QgX2dldFRvb2x0aXAgPSBmdW5jdGlvbiAoc291cmNlOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzIHwgUHJvcGVydHkpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRpZiAoIXNvdXJjZSkge1xuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblx0aWYgKGlzUHJvcGVydHkoc291cmNlKSB8fCBzb3VyY2UuYW5ub3RhdGlvbnM/LkNvbW1vbj8uUXVpY2tJbmZvKSB7XG5cdFx0cmV0dXJuIHNvdXJjZS5hbm5vdGF0aW9ucz8uQ29tbW9uPy5RdWlja0luZm9cblx0XHRcdD8gY29tcGlsZUV4cHJlc3Npb24oZ2V0RXhwcmVzc2lvbkZyb21Bbm5vdGF0aW9uKHNvdXJjZS5hbm5vdGF0aW9ucy5Db21tb24uUXVpY2tJbmZvKSlcblx0XHRcdDogdW5kZWZpbmVkO1xuXHR9IGVsc2UgaWYgKGlzRGF0YUZpZWxkVHlwZXMoc291cmNlKSkge1xuXHRcdHJldHVybiBzb3VyY2UuVmFsdWU/LiR0YXJnZXQ/LmFubm90YXRpb25zPy5Db21tb24/LlF1aWNrSW5mb1xuXHRcdFx0PyBjb21waWxlRXhwcmVzc2lvbihnZXRFeHByZXNzaW9uRnJvbUFubm90YXRpb24oc291cmNlLlZhbHVlLiR0YXJnZXQuYW5ub3RhdGlvbnMuQ29tbW9uLlF1aWNrSW5mbykpXG5cdFx0XHQ6IHVuZGVmaW5lZDtcblx0fSBlbHNlIGlmIChzb3VyY2UuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFubm90YXRpb24pIHtcblx0XHRjb25zdCBkYXRhcG9pbnRUYXJnZXQgPSBzb3VyY2UuVGFyZ2V0Py4kdGFyZ2V0IGFzIERhdGFQb2ludDtcblx0XHRyZXR1cm4gZGF0YXBvaW50VGFyZ2V0Py5WYWx1ZT8uJHRhcmdldD8uYW5ub3RhdGlvbnM/LkNvbW1vbj8uUXVpY2tJbmZvXG5cdFx0XHQ/IGNvbXBpbGVFeHByZXNzaW9uKGdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbihkYXRhcG9pbnRUYXJnZXQuVmFsdWUuJHRhcmdldC5hbm5vdGF0aW9ucy5Db21tb24uUXVpY2tJbmZvKSlcblx0XHRcdDogdW5kZWZpbmVkO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cbn07XG5leHBvcnQgZnVuY3Rpb24gZ2V0Um93U3RhdHVzVmlzaWJpbGl0eShjb2xOYW1lOiBzdHJpbmcsIGlzU2VtYW50aWNLZXlJbkZpZWxkR3JvdXA/OiBib29sZWFuKTogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0cmV0dXJuIGZvcm1hdFJlc3VsdChcblx0XHRbXG5cdFx0XHRwYXRoSW5Nb2RlbChgc2VtYW50aWNLZXlIYXNEcmFmdEluZGljYXRvcmAsIFwiaW50ZXJuYWxcIiksXG5cdFx0XHRwYXRoSW5Nb2RlbChgZmlsdGVyZWRNZXNzYWdlc2AsIFwiaW50ZXJuYWxcIiksXG5cdFx0XHRjb2xOYW1lLFxuXHRcdFx0aXNTZW1hbnRpY0tleUluRmllbGRHcm91cFxuXHRcdF0sXG5cdFx0dGFibGVGb3JtYXR0ZXJzLmdldEVycm9yU3RhdHVzVGV4dFZpc2liaWxpdHlGb3JtYXR0ZXJcblx0KTtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIFByb3BlcnR5SW5mbyBmb3IgZWFjaCBpZGVudGlmaWVkIHByb3BlcnR5IGNvbnN1bWVkIGJ5IGEgTGluZUl0ZW0uXG4gKiBAcGFyYW0gY29sdW1uc1RvQmVDcmVhdGVkIElkZW50aWZpZWQgcHJvcGVydGllcy5cbiAqIEBwYXJhbSBleGlzdGluZ0NvbHVtbnMgVGhlIGxpc3Qgb2YgY29sdW1ucyBjcmVhdGVkIGZvciBMaW5lSXRlbXMgYW5kIFByb3BlcnRpZXMgb2YgZW50aXR5VHlwZS5cbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dC5cbiAqIEBwYXJhbSBlbnRpdHlUeXBlIFRoZSBlbnRpdHkgdHlwZSBmb3IgdGhlIExpbmVJdGVtXG4gKiBAcGFyYW0gZGlzcGxheU1vZGVPZkRlc2NyaXB0aW9uUHJvcGVydGllc01hcCBUaGUgbWFwIG9mIHByb3BlcnRpZXMgcmVmZXJlbmNlZCBhcyB0ZXh0IG9uIGEgdGV4dCBhcnJhbmdlbWVudCBhbm5vdGF0aW9uLlxuICogQHBhcmFtIHRhYmxlQ3JlYXRpb25Nb2RlIFRoZSBjcmVhdGlvbiBtb2RlIG9mIHRoZSB0YWJsZVxuICogQHBhcmFtIHJlc3RyaWN0aW9uc09uUHJvcGVydGllcyBUaGUgZXhpc3RpbmcgcmVzdHJpY3Rpb25zIG9uIHByb3BlcnRpZXNcbiAqIEByZXR1cm5zIFRoZSBhcnJheSBvZiBjb2x1bW5zIGNyZWF0ZWQuXG4gKi9cbmNvbnN0IF9jcmVhdGVSZWxhdGVkQ29sdW1ucyA9IGZ1bmN0aW9uIChcblx0Y29sdW1uc1RvQmVDcmVhdGVkOiBSZWNvcmQ8c3RyaW5nLCBQcm9wZXJ0eT4sXG5cdGV4aXN0aW5nQ29sdW1uczogQW5ub3RhdGlvblRhYmxlQ29sdW1uW10sXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pixcblx0ZW50aXR5VHlwZTogRW50aXR5VHlwZSxcblx0ZGlzcGxheU1vZGVPZkRlc2NyaXB0aW9uUHJvcGVydGllc01hcDogUmVjb3JkPHN0cmluZywgRGlzcGxheU1vZGU+LFxuXHR0YWJsZUNyZWF0aW9uTW9kZT86IENyZWF0aW9uTW9kZSxcblx0cmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzPzogUmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzXG4pOiBBbm5vdGF0aW9uVGFibGVDb2x1bW5bXSB7XG5cdGNvbnN0IHJlbGF0ZWRDb2x1bW5zOiAoQW5ub3RhdGlvblRhYmxlQ29sdW1uIHwgVGVjaG5pY2FsQ29sdW1uKVtdID0gW107XG5cdGNvbnN0IHJlbGF0ZWRQcm9wZXJ0eU5hbWVNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblx0Y29uc3QgYWdncmVnYXRpb25IZWxwZXIgPSBuZXcgQWdncmVnYXRpb25IZWxwZXIoZW50aXR5VHlwZSwgY29udmVydGVyQ29udGV4dCk7XG5cdE9iamVjdC5rZXlzKGNvbHVtbnNUb0JlQ3JlYXRlZCkuZm9yRWFjaCgobmFtZSkgPT4ge1xuXHRcdGNvbnN0IHByb3BlcnR5ID0gY29sdW1uc1RvQmVDcmVhdGVkW25hbWVdLFxuXHRcdFx0YW5ub3RhdGlvblBhdGggPSBjb252ZXJ0ZXJDb250ZXh0LmdldEFic29sdXRlQW5ub3RhdGlvblBhdGgobmFtZSksXG5cdFx0XHQvLyBDaGVjayB3aGV0aGVyIHRoZSByZWxhdGVkIGNvbHVtbiBhbHJlYWR5IGV4aXN0cy5cblx0XHRcdHJlbGF0ZWRDb2x1bW4gPSBleGlzdGluZ0NvbHVtbnMuZmluZCgoY29sdW1uKSA9PiBjb2x1bW4ubmFtZSA9PT0gbmFtZSk7XG5cdFx0Y29uc3QgZGF0YU1vZGVsT2JqZWN0UGF0aCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0Q29udmVydGVyQ29udGV4dEZvcihjb252ZXJ0ZXJDb250ZXh0LmdldENvbnRleHRQYXRoKCkpLmdldERhdGFNb2RlbE9iamVjdFBhdGgoKTtcblx0XHRjb25zdCBwcm9wZXJ0eU9iamVjdFBhdGggPSBlbmhhbmNlRGF0YU1vZGVsUGF0aDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+KGRhdGFNb2RlbE9iamVjdFBhdGgsIG5hbWUpO1xuXHRcdGlmIChpc011bHRpVmFsdWVGaWVsZChwcm9wZXJ0eU9iamVjdFBhdGgpKSB7XG5cdFx0XHRjb25zdCBuZXdOYW1lUmVsYXRpdmVUYXJnZXRQYXRoID0gZ2V0Q29udGV4dFJlbGF0aXZlVGFyZ2V0T2JqZWN0UGF0aChwcm9wZXJ0eU9iamVjdFBhdGgsIGZhbHNlLCB0cnVlKTtcblx0XHRcdGNvbnN0IGNvbHVtbiA9IGdldENvbHVtbkRlZmluaXRpb25Gcm9tUHJvcGVydHkoXG5cdFx0XHRcdHByb3BlcnR5LFxuXHRcdFx0XHRhbm5vdGF0aW9uUGF0aCxcblx0XHRcdFx0bmFtZSxcblx0XHRcdFx0dHJ1ZSxcblx0XHRcdFx0ZmFsc2UsXG5cdFx0XHRcdGFnZ3JlZ2F0aW9uSGVscGVyLFxuXHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdFx0XHRkaXNwbGF5TW9kZU9mRGVzY3JpcHRpb25Qcm9wZXJ0aWVzTWFwLFxuXHRcdFx0XHRyZXN0cmljdGlvbnNPblByb3BlcnRpZXMsXG5cdFx0XHRcdHRhYmxlQ3JlYXRpb25Nb2RlLFxuXHRcdFx0XHR1bmRlZmluZWQsXG5cdFx0XHRcdG5ld05hbWVSZWxhdGl2ZVRhcmdldFBhdGhcblx0XHRcdCk7XG5cdFx0XHRjb21wdXRlSGlkZGVuT25SZWxhdGVkQ29sdW1ucyhleGlzdGluZ0NvbHVtbnMsIG5hbWUsIGNvbHVtbik7XG5cdFx0XHR1cGRhdGVQcm9wZXJ0eUxhYmVsKGV4aXN0aW5nQ29sdW1ucywgY29sdW1uc1RvQmVDcmVhdGVkLCBjb2x1bW4sIG5hbWUpO1xuXHRcdFx0cmVsYXRlZENvbHVtbnMucHVzaChjb2x1bW4pO1xuXHRcdFx0cmVsYXRlZFByb3BlcnR5TmFtZU1hcFtuYW1lXSA9IG5ld05hbWVSZWxhdGl2ZVRhcmdldFBhdGggPz8gbmFtZTtcblx0XHR9IGVsc2UgaWYgKHJlbGF0ZWRDb2x1bW4gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Ly8gQ2FzZSAxOiBLZXkgY29udGFpbnMgRGF0YUZpZWxkIHByZWZpeCB0byBlbnN1cmUgYWxsIHByb3BlcnR5IGNvbHVtbnMgaGF2ZSB0aGUgc2FtZSBrZXkgZm9ybWF0LlxuXHRcdFx0Ly8gTmV3IGNyZWF0ZWQgcHJvcGVydHkgY29sdW1uIGlzIHNldCB0byBoaWRkZW4uXG5cdFx0XHRjb25zdCBjb2x1bW4gPSBnZXRDb2x1bW5EZWZpbml0aW9uRnJvbVByb3BlcnR5KFxuXHRcdFx0XHRwcm9wZXJ0eSxcblx0XHRcdFx0YW5ub3RhdGlvblBhdGgsXG5cdFx0XHRcdG5hbWUsXG5cdFx0XHRcdHRydWUsXG5cdFx0XHRcdGZhbHNlLFxuXHRcdFx0XHRhZ2dyZWdhdGlvbkhlbHBlcixcblx0XHRcdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHRcdFx0ZGlzcGxheU1vZGVPZkRlc2NyaXB0aW9uUHJvcGVydGllc01hcCxcblx0XHRcdFx0cmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzLFxuXHRcdFx0XHR0YWJsZUNyZWF0aW9uTW9kZVxuXHRcdFx0KTtcblx0XHRcdGNvbXB1dGVIaWRkZW5PblJlbGF0ZWRDb2x1bW5zKGV4aXN0aW5nQ29sdW1ucywgbmFtZSwgY29sdW1uKTtcblx0XHRcdHVwZGF0ZVByb3BlcnR5TGFiZWwoZXhpc3RpbmdDb2x1bW5zLCBjb2x1bW5zVG9CZUNyZWF0ZWQsIGNvbHVtbik7XG5cdFx0XHRyZWxhdGVkQ29sdW1ucy5wdXNoKGNvbHVtbik7XG5cdFx0fSBlbHNlIGlmIChyZWxhdGVkQ29sdW1uLmFubm90YXRpb25QYXRoICE9PSBhbm5vdGF0aW9uUGF0aCB8fCByZWxhdGVkQ29sdW1uLnByb3BlcnR5SW5mb3MpIHtcblx0XHRcdC8vIENhc2UgMjogVGhlIGV4aXN0aW5nIGNvbHVtbiBwb2ludHMgdG8gYSBMaW5lSXRlbSAob3IpXG5cdFx0XHQvLyBDYXNlIDM6IFRoaXMgaXMgYSBzZWxmIHJlZmVyZW5jZSBmcm9tIGFuIGV4aXN0aW5nIGNvbHVtblxuXHRcdFx0Y29uc3QgbmV3TmFtZSA9IGBQcm9wZXJ0eTo6JHtuYW1lfWA7XG5cdFx0XHQvLyBDaGVja2luZyB3aGV0aGVyIHRoZSByZWxhdGVkIHByb3BlcnR5IGNvbHVtbiBoYXMgYWxyZWFkeSBiZWVuIGNyZWF0ZWQgaW4gYSBwcmV2aW91cyBpdGVyYXRpb24uXG5cdFx0XHRpZiAoIWV4aXN0aW5nQ29sdW1ucy5zb21lKChjb2x1bW4pID0+IGNvbHVtbi5uYW1lID09PSBuZXdOYW1lKSkge1xuXHRcdFx0XHQvLyBDcmVhdGUgYSBuZXcgcHJvcGVydHkgY29sdW1uIHdpdGggJ1Byb3BlcnR5OjonIHByZWZpeCxcblx0XHRcdFx0Ly8gU2V0IGl0IHRvIGhpZGRlbiBhcyBpdCBpcyBvbmx5IGNvbnN1bWVkIGJ5IENvbXBsZXggcHJvcGVydHkgaW5mb3MuXG5cdFx0XHRcdGNvbnN0IGNvbHVtbiA9IGdldENvbHVtbkRlZmluaXRpb25Gcm9tUHJvcGVydHkoXG5cdFx0XHRcdFx0cHJvcGVydHksXG5cdFx0XHRcdFx0YW5ub3RhdGlvblBhdGgsXG5cdFx0XHRcdFx0bmFtZSxcblx0XHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0XHRhZ2dyZWdhdGlvbkhlbHBlcixcblx0XHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdFx0XHRcdGRpc3BsYXlNb2RlT2ZEZXNjcmlwdGlvblByb3BlcnRpZXNNYXAsXG5cdFx0XHRcdFx0cmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzLFxuXHRcdFx0XHRcdHRhYmxlQ3JlYXRpb25Nb2RlXG5cdFx0XHRcdCk7XG5cdFx0XHRcdGNvbXB1dGVIaWRkZW5PblJlbGF0ZWRDb2x1bW5zKGV4aXN0aW5nQ29sdW1ucywgbmFtZSwgY29sdW1uKTtcblx0XHRcdFx0dXBkYXRlUHJvcGVydHlMYWJlbChleGlzdGluZ0NvbHVtbnMsIGNvbHVtbnNUb0JlQ3JlYXRlZCwgY29sdW1uKTtcblx0XHRcdFx0cmVsYXRlZENvbHVtbnMucHVzaChjb2x1bW4pO1xuXHRcdFx0XHRyZWxhdGVkUHJvcGVydHlOYW1lTWFwW25hbWVdID0gbmV3TmFtZTtcblx0XHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRcdGV4aXN0aW5nQ29sdW1ucy5zb21lKChjb2x1bW4pID0+IGNvbHVtbi5uYW1lID09PSBuZXdOYW1lKSAmJlxuXHRcdFx0XHRleGlzdGluZ0NvbHVtbnMuc29tZSgoY29sdW1uKSA9PiBjb2x1bW4ucHJvcGVydHlJbmZvcz8uaW5jbHVkZXMobmFtZSkpXG5cdFx0XHQpIHtcblx0XHRcdFx0cmVsYXRlZFByb3BlcnR5TmFtZU1hcFtuYW1lXSA9IG5ld05hbWU7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChcblx0XHRcdGRpc3BsYXlNb2RlT2ZEZXNjcmlwdGlvblByb3BlcnRpZXNNYXBbbmFtZV0gPT09IFwiRGVzY3JpcHRpb25cIiAmJlxuXHRcdFx0IXJlbGF0ZWRDb2x1bW4uZmlsdGVyYWJsZSAmJlxuXHRcdFx0IXJlc3RyaWN0aW9uc09uUHJvcGVydGllcz8ubm9uRmlsdGVyYWJsZVByb3BlcnRpZXMuaW5jbHVkZXMobmFtZSlcblx0XHQpIHtcblx0XHRcdC8vIENhc2UgNDogVGhlIGNvbHVtbiBpcyBhIHJlZmVyZW5jZWQgdGV4dCBvbmx5IHByb3BlcnR5LiBTZXQgaXQgdG8gaGlkZGVuLCBub24gc29ydGFibGUgbm9yIGdyb3VwYWJsZS5cblx0XHRcdC8vIENhc2UgNTogVGhlIGNvbHVtbiBpc24ndCBhbHJlYWR5IGF2YWlsYWJsZSBmb3IgZmlsdGVyaW5nIGFzIGl0IGNvdWxkIGJlIHJlZmVyZW5jZWQgb24gYW5vdGhlciBjb2x1bW4gKGUuZy4gdGV4dCBmaXJzdCkuXG5cdFx0XHRyZXN0cmljdGlvbnNPblByb3BlcnRpZXM/Lm5vblNvcnRhYmxlUHJvcGVydGllcy5wdXNoKG5hbWUpO1xuXHRcdFx0Y29uc3QgY29sdW1uID0gZ2V0Q29sdW1uRGVmaW5pdGlvbkZyb21Qcm9wZXJ0eShcblx0XHRcdFx0cHJvcGVydHksXG5cdFx0XHRcdGFubm90YXRpb25QYXRoLFxuXHRcdFx0XHRuYW1lLFxuXHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0ZmFsc2UsXG5cdFx0XHRcdGFnZ3JlZ2F0aW9uSGVscGVyLFxuXHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdFx0XHR7fSxcblx0XHRcdFx0cmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzLFxuXHRcdFx0XHR0YWJsZUNyZWF0aW9uTW9kZVxuXHRcdFx0KTtcblx0XHRcdGNvbHVtbi5pc0dyb3VwYWJsZSA9IGZhbHNlO1xuXHRcdFx0cmVsYXRlZENvbHVtbnMucHVzaChjb2x1bW4pO1xuXHRcdH1cblx0fSk7XG5cdC8vIFRoZSBwcm9wZXJ0eSAnbmFtZScgaGFzIGJlZW4gcHJlZml4ZWQgd2l0aCAnUHJvcGVydHk6OicgZm9yIHVuaXF1ZW5lc3MuXG5cdC8vIFVwZGF0ZSB0aGUgc2FtZSBpbiBvdGhlciBwcm9wZXJ0eUluZm9zW10gcmVmZXJlbmNlcyB3aGljaCBwb2ludCB0byB0aGlzIHByb3BlcnR5LlxuXHRleGlzdGluZ0NvbHVtbnMuZm9yRWFjaCgoY29sdW1uKSA9PiB7XG5cdFx0Y29sdW1uLnByb3BlcnR5SW5mb3MgPSBjb2x1bW4ucHJvcGVydHlJbmZvcz8ubWFwKChwcm9wZXJ0eUluZm8pID0+IHJlbGF0ZWRQcm9wZXJ0eU5hbWVNYXBbcHJvcGVydHlJbmZvXSA/PyBwcm9wZXJ0eUluZm8pO1xuXHRcdGNvbHVtbi5hZGRpdGlvbmFsUHJvcGVydHlJbmZvcyA9IGNvbHVtbi5hZGRpdGlvbmFsUHJvcGVydHlJbmZvcz8ubWFwKFxuXHRcdFx0KHByb3BlcnR5SW5mbykgPT4gcmVsYXRlZFByb3BlcnR5TmFtZU1hcFtwcm9wZXJ0eUluZm9dID8/IHByb3BlcnR5SW5mb1xuXHRcdCk7XG5cdH0pO1xuXHRyZXR1cm4gcmVsYXRlZENvbHVtbnM7XG59O1xuLyoqXG4gKiBHZXR0aW5nIHRoZSBDb2x1bW4gTmFtZVxuICogSWYgaXQgcG9pbnRzIHRvIGEgRGF0YUZpZWxkIHdpdGggb25lIHByb3BlcnR5IG9yIERhdGFQb2ludCB3aXRoIG9uZSBwcm9wZXJ0eSwgaXQgd2lsbCB1c2UgdGhlIHByb3BlcnR5IG5hbWVcbiAqIGhlcmUgdG8gYmUgY29uc2lzdGVudCB3aXRoIHRoZSBleGlzdGluZyBmbGV4IGNoYW5nZXMuXG4gKiBAcGFyYW0gZGF0YUZpZWxkIERpZmZlcmVudCBEYXRhRmllbGQgdHlwZXMgZGVmaW5lZCBpbiB0aGUgYW5ub3RhdGlvbnNcbiAqIEByZXR1cm5zIFRoZSBuYW1lIG9mIGFubm90YXRpb24gY29sdW1uc1xuICovXG5jb25zdCBfZ2V0QW5ub3RhdGlvbkNvbHVtbk5hbWUgPSBmdW5jdGlvbiAoZGF0YUZpZWxkOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzKTogc3RyaW5nIHtcblx0Ly8gVGhpcyBpcyBuZWVkZWQgYXMgd2UgaGF2ZSBmbGV4aWJpbGl0eSBjaGFuZ2VzIGFscmVhZHkgdGhhdCB3ZSBoYXZlIHRvIGNoZWNrIGFnYWluc3Rcblx0aWYgKGlzRGF0YUZpZWxkVHlwZXMoZGF0YUZpZWxkKSAmJiBkYXRhRmllbGQuVmFsdWU/LnBhdGgpIHtcblx0XHRyZXR1cm4gZGF0YUZpZWxkLlZhbHVlPy5wYXRoO1xuXHR9IGVsc2UgaWYgKGRhdGFGaWVsZC4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQW5ub3RhdGlvbiAmJiAoZGF0YUZpZWxkLlRhcmdldD8uJHRhcmdldCBhcyBEYXRhUG9pbnQpPy5WYWx1ZT8ucGF0aCkge1xuXHRcdC8vIFRoaXMgaXMgZm9yIHJlbW92aW5nIGR1cGxpY2F0ZSBwcm9wZXJ0aWVzLiBGb3IgZXhhbXBsZSwgJ1Byb2dyZXNzJyBQcm9wZXJ0eSBpcyByZW1vdmVkIGlmIGl0IGlzIGFscmVhZHkgZGVmaW5lZCBhcyBhIERhdGFQb2ludFxuXHRcdHJldHVybiAoZGF0YUZpZWxkLlRhcmdldD8uJHRhcmdldCBhcyBEYXRhUG9pbnQpPy5WYWx1ZS5wYXRoO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBLZXlIZWxwZXIuZ2VuZXJhdGVLZXlGcm9tRGF0YUZpZWxkKGRhdGFGaWVsZCk7XG5cdH1cbn07XG4vKipcbiAqIENyZWF0ZXMgYSBQcm9wZXJ0eUluZm8gZm9yIHRoZSBpZGVudGlmaWVkIGFkZGl0aW9uYWwgcHJvcGVydHkgZm9yIHRoZSBBTFAgdGFibGUgdXNlLWNhc2UuXG4gKlxuICogRm9yIGUuZy4gSWYgVUkuSGlkZGVuIHBvaW50cyB0byBhIHByb3BlcnR5LCBpbmNsdWRlIHRoaXMgdGVjaG5pY2FsIHByb3BlcnR5IGluIHRoZSBhZGRpdGlvbmFsUHJvcGVydGllcyBvZiBDb21wbGV4UHJvcGVydHlJbmZvIG9iamVjdC5cbiAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBiZSBjcmVhdGVkLlxuICogQHBhcmFtIGNvbHVtbnMgVGhlIGxpc3Qgb2YgY29sdW1ucyBjcmVhdGVkIGZvciBMaW5lSXRlbXMgYW5kIFByb3BlcnRpZXMgb2YgZW50aXR5VHlwZSBmcm9tIHRoZSB0YWJsZSB2aXN1YWxpemF0aW9uLlxuICogQHBhcmFtIHJlbGF0ZWRBZGRpdGlvbmFsUHJvcGVydHlOYW1lTWFwXG4gKi9cbmNvbnN0IGNyZWF0ZVRlY2huaWNhbFByb3BlcnR5ID0gZnVuY3Rpb24gKFxuXHRuYW1lOiBzdHJpbmcsXG5cdGNvbHVtbnM6IFRhYmxlQ29sdW1uW10sXG5cdHJlbGF0ZWRBZGRpdGlvbmFsUHJvcGVydHlOYW1lTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4pOiB2b2lkIHtcblx0Y29uc3Qga2V5ID0gYFByb3BlcnR5X1RlY2huaWNhbDo6JHtuYW1lfWA7XG5cdC8vIFZhbGlkYXRlIGlmIHRoZSB0ZWNobmljYWwgcHJvcGVydHkgaGFzbid0IHlldCBiZWVuIGNyZWF0ZWQgb24gcHJldmlvdXMgaXRlcmF0aW9ucy5cblx0Y29uc3QgY29sdW1uRXhpc3RzID0gY29sdW1ucy5maW5kKChjb2x1bW4pID0+IGNvbHVtbi5rZXkgPT09IGtleSk7XG5cdC8vIFJldHJpZXZlIHRoZSBzaW1wbGUgcHJvcGVydHkgdXNlZCBieSB0aGUgaGlkZGVuIGFubm90YXRpb24sIGl0IHdpbGwgYmUgdXNlZCBhcyBhIGJhc2UgZm9yIHRoZSBtYW5kYXRvcnkgYXR0cmlidXRlcyBvZiBuZXdseSBjcmVhdGVkIHRlY2huaWNhbCBwcm9wZXJ0eS4gRm9yIGUuZy4gcmVsYXRpdmVQYXRoXG5cdGNvbnN0IGFkZGl0aW9uYWxQcm9wZXJ0eSA9XG5cdFx0IWNvbHVtbkV4aXN0cyAmJiAoY29sdW1ucy5maW5kKChjb2x1bW4pID0+IGNvbHVtbi5uYW1lID09PSBuYW1lICYmICFjb2x1bW4ucHJvcGVydHlJbmZvcykgYXMgQW5ub3RhdGlvblRhYmxlQ29sdW1uKSE7XG5cdGlmIChhZGRpdGlvbmFsUHJvcGVydHkpIHtcblx0XHRjb25zdCB0ZWNobmljYWxDb2x1bW46IFRlY2huaWNhbENvbHVtbiA9IHtcblx0XHRcdGtleToga2V5LFxuXHRcdFx0dHlwZTogQ29sdW1uVHlwZS5Bbm5vdGF0aW9uLFxuXHRcdFx0bGFiZWw6IGFkZGl0aW9uYWxQcm9wZXJ0eS5sYWJlbCxcblx0XHRcdGFubm90YXRpb25QYXRoOiBhZGRpdGlvbmFsUHJvcGVydHkuYW5ub3RhdGlvblBhdGgsXG5cdFx0XHRhdmFpbGFiaWxpdHk6IFwiSGlkZGVuXCIsXG5cdFx0XHRuYW1lOiBrZXksXG5cdFx0XHRyZWxhdGl2ZVBhdGg6IGFkZGl0aW9uYWxQcm9wZXJ0eS5yZWxhdGl2ZVBhdGgsXG5cdFx0XHRzb3J0YWJsZTogZmFsc2UsXG5cdFx0XHRpc0dyb3VwYWJsZTogZmFsc2UsXG5cdFx0XHRpc0tleTogZmFsc2UsXG5cdFx0XHRleHBvcnRTZXR0aW5nczogbnVsbCxcblx0XHRcdGNhc2VTZW5zaXRpdmU6IGZhbHNlLFxuXHRcdFx0YWdncmVnYXRhYmxlOiBmYWxzZSxcblx0XHRcdGZpbHRlcmFibGU6IGZhbHNlLFxuXHRcdFx0ZXh0ZW5zaW9uOiB7XG5cdFx0XHRcdHRlY2huaWNhbGx5R3JvdXBhYmxlOiB0cnVlLFxuXHRcdFx0XHR0ZWNobmljYWxseUFnZ3JlZ2F0YWJsZTogdHJ1ZVxuXHRcdFx0fVxuXHRcdH07XG5cdFx0Y29sdW1ucy5wdXNoKHRlY2huaWNhbENvbHVtbik7XG5cdFx0cmVsYXRlZEFkZGl0aW9uYWxQcm9wZXJ0eU5hbWVNYXBbbmFtZV0gPSB0ZWNobmljYWxDb2x1bW4ubmFtZTtcblx0fVxufTtcbi8qKlxuICogRGV0ZXJtaW5lcyBpZiB0aGUgZGF0YSBmaWVsZCBsYWJlbHMgaGF2ZSB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIHRhYmxlLlxuICogQHBhcmFtIGZpZWxkR3JvdXBOYW1lIFRoZSBgRGF0YUZpZWxkYCBuYW1lIGJlaW5nIHByb2Nlc3NlZC5cbiAqIEBwYXJhbSB2aXN1YWxpemF0aW9uUGF0aFxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHRcbiAqIEByZXR1cm5zIGBzaG93RGF0YUZpZWxkc0xhYmVsYCB2YWx1ZSBmcm9tIHRoZSBtYW5pZmVzdFxuICovXG5jb25zdCBfZ2V0U2hvd0RhdGFGaWVsZHNMYWJlbCA9IGZ1bmN0aW9uIChcblx0ZmllbGRHcm91cE5hbWU6IHN0cmluZyxcblx0dmlzdWFsaXphdGlvblBhdGg6IHN0cmluZyxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+XG4pOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcblx0Y29uc3QgY29sdW1ucyA9IGNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RDb250cm9sQ29uZmlndXJhdGlvbjxUYWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbj4odmlzdWFsaXphdGlvblBhdGgpPy5jb2x1bW5zO1xuXHRjb25zdCBjb2x1bW5LZXlzID0gY29sdW1ucyAmJiBPYmplY3Qua2V5cyhjb2x1bW5zKTtcblx0cmV0dXJuIChcblx0XHRjb2x1bW5LZXlzICYmXG5cdFx0ISFjb2x1bW5LZXlzLmZpbmQoZnVuY3Rpb24gKGtleTogc3RyaW5nKSB7XG5cdFx0XHRyZXR1cm4ga2V5ID09PSBmaWVsZEdyb3VwTmFtZSAmJiAoY29sdW1uc1trZXldIGFzIEN1c3RvbURlZmluZWRUYWJsZUNvbHVtbkZvck92ZXJyaWRlKS5zaG93RGF0YUZpZWxkc0xhYmVsO1xuXHRcdH0pXG5cdCk7XG59O1xuLyoqXG4gKiBEZXRlcm1pbmVzIHRoZSByZWxhdGl2ZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB3aXRoIHJlc3BlY3QgdG8gdGhlIHJvb3QgZW50aXR5LlxuICogQHBhcmFtIGRhdGFGaWVsZCBUaGUgYERhdGFGaWVsZGAgYmVpbmcgcHJvY2Vzc2VkLlxuICogQHJldHVybnMgVGhlIHJlbGF0aXZlIHBhdGhcbiAqL1xuY29uc3QgX2dldFJlbGF0aXZlUGF0aCA9IGZ1bmN0aW9uIChkYXRhRmllbGQ6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMpOiBzdHJpbmcge1xuXHRsZXQgcmVsYXRpdmVQYXRoID0gXCJcIjtcblx0c3dpdGNoIChkYXRhRmllbGQuJFR5cGUpIHtcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZDpcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhOYXZpZ2F0aW9uUGF0aDpcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhVcmw6XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoSW50ZW50QmFzZWROYXZpZ2F0aW9uOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aEFjdGlvbjpcblx0XHRcdHJlbGF0aXZlUGF0aCA9IChkYXRhRmllbGQgYXMgRGF0YUZpZWxkKT8uVmFsdWU/LnBhdGg7XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFubm90YXRpb246XG5cdFx0XHRyZWxhdGl2ZVBhdGggPSBkYXRhRmllbGQ/LlRhcmdldD8udmFsdWU7XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFjdGlvbjpcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbjpcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFjdGlvbkdyb3VwOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aEFjdGlvbkdyb3VwOlxuXHRcdFx0cmVsYXRpdmVQYXRoID0gS2V5SGVscGVyLmdlbmVyYXRlS2V5RnJvbURhdGFGaWVsZChkYXRhRmllbGQpO1xuXHRcdFx0YnJlYWs7XG5cdH1cblx0cmV0dXJuIHJlbGF0aXZlUGF0aDtcbn07XG5jb25zdCBfc2xpY2VBdFNsYXNoID0gZnVuY3Rpb24gKHBhdGg6IHN0cmluZywgaXNMYXN0U2xhc2g6IGJvb2xlYW4sIGlzTGFzdFBhcnQ6IGJvb2xlYW4pOiBzdHJpbmcge1xuXHRjb25zdCBpU2xhc2hJbmRleCA9IGlzTGFzdFNsYXNoID8gcGF0aC5sYXN0SW5kZXhPZihcIi9cIikgOiBwYXRoLmluZGV4T2YoXCIvXCIpO1xuXHRpZiAoaVNsYXNoSW5kZXggPT09IC0xKSB7XG5cdFx0cmV0dXJuIHBhdGg7XG5cdH1cblx0cmV0dXJuIGlzTGFzdFBhcnQgPyBwYXRoLnN1YnN0cmluZyhpU2xhc2hJbmRleCArIDEsIHBhdGgubGVuZ3RoKSA6IHBhdGguc3Vic3RyaW5nKDAsIGlTbGFzaEluZGV4KTtcbn07XG4vKipcbiAqIERldGVybWluZXMgaWYgdGhlIGNvbHVtbiBjb250YWlucyBhIG11bHRpLXZhbHVlIGZpZWxkLlxuICogQHBhcmFtIGRhdGFGaWVsZCBUaGUgRGF0YUZpZWxkIGJlaW5nIHByb2Nlc3NlZFxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGNvbnZlcnRlciBjb250ZXh0XG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBEYXRhRmllbGQgY29ycmVzcG9uZHMgdG8gYSBtdWx0aS12YWx1ZSBmaWVsZC5cbiAqL1xuY29uc3QgX2lzQ29sdW1uTXVsdGlWYWx1ZWQgPSBmdW5jdGlvbiAoXG5cdGRhdGFGaWVsZDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+XG4pOiBib29sZWFuIHtcblx0aWYgKGlzRGF0YUZpZWxkVHlwZXMoZGF0YUZpZWxkKSAmJiBpc1BhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbihkYXRhRmllbGQuVmFsdWUpKSB7XG5cdFx0Y29uc3QgcHJvcGVydHlPYmplY3RQYXRoID0gZW5oYW5jZURhdGFNb2RlbFBhdGg8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pihcblx0XHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpLFxuXHRcdFx0ZGF0YUZpZWxkLlZhbHVlLnBhdGhcblx0XHQpO1xuXHRcdHJldHVybiBpc011bHRpVmFsdWVGaWVsZChwcm9wZXJ0eU9iamVjdFBhdGgpO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxufTtcbi8qKlxuICogRGV0ZXJtaW5lIHdoZXRoZXIgYSBjb2x1bW4gaXMgc29ydGFibGUuXG4gKiBAcGFyYW0gZGF0YUZpZWxkIFRoZSBkYXRhIGZpZWxkIGJlaW5nIHByb2Nlc3NlZFxuICogQHBhcmFtIHByb3BlcnR5UGF0aCBUaGUgcHJvcGVydHkgcGF0aFxuICogQHBhcmFtIG5vblNvcnRhYmxlQ29sdW1ucyBDb2xsZWN0aW9uIG9mIG5vbi1zb3J0YWJsZSBjb2x1bW4gbmFtZXMgYXMgcGVyIGFubm90YXRpb25cbiAqIEBwYXJhbSByZWxhdGVkUHJvcGVydGllc0luZm8gVGhlIHJlbGF0ZWQgcHJvcGVydGllcyBsaW5rZWQgdG8gdGhlIGNvbHVtblxuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgY29sdW1uIGlzIHNvcnRhYmxlXG4gKi9cbmNvbnN0IF9pc0NvbHVtblNvcnRhYmxlID0gZnVuY3Rpb24gKFxuXHRkYXRhRmllbGQ6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMsXG5cdHByb3BlcnR5UGF0aDogc3RyaW5nLFxuXHRub25Tb3J0YWJsZUNvbHVtbnM6IHN0cmluZ1tdLFxuXHRyZWxhdGVkUHJvcGVydGllc0luZm86IENvbXBsZXhQcm9wZXJ0eUluZm9cbik6IGJvb2xlYW4ge1xuXHRyZXR1cm4gKFxuXHRcdCFub25Tb3J0YWJsZUNvbHVtbnMuaW5jbHVkZXMocHJvcGVydHlQYXRoKSAmJiAvLyBDb2x1bW4gaXMgbm90IG1hcmtlZCBhcyBub24tc29ydGFibGUgdmlhIGFubm90YXRpb25cblx0XHQoKChkYXRhRmllbGQuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZCB8fCBkYXRhRmllbGQuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFubm90YXRpb24pICYmXG5cdFx0XHRPYmplY3Qua2V5cyhyZWxhdGVkUHJvcGVydGllc0luZm8ucHJvcGVydGllcykuc29tZSgocHJvcE5hbWUpID0+IHtcblx0XHRcdFx0Y29uc3QgaXNIaWRkZW4gPSBpc1JlZmVyZW5jZVByb3BlcnR5U3RhdGljYWxseUhpZGRlbihyZWxhdGVkUHJvcGVydGllc0luZm8ucHJvcGVydGllc1twcm9wTmFtZV0uYW5ub3RhdGlvblByb3BlcnR5KTtcblx0XHRcdFx0cmV0dXJuICFpc0hpZGRlbiAmJiAhbm9uU29ydGFibGVDb2x1bW5zLmluY2x1ZGVzKHByb3BOYW1lKTtcblx0XHRcdH0pKSB8fFxuXHRcdFx0ZGF0YUZpZWxkLiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoVXJsIHx8XG5cdFx0XHRkYXRhRmllbGQuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhJbnRlbnRCYXNlZE5hdmlnYXRpb24gfHxcblx0XHRcdGRhdGFGaWVsZC4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aEFjdGlvbilcblx0KTtcbn07XG4vKipcbiAqIFJldHVybnMgd2hldGhlciBmaWx0ZXJpbmcgb24gdGhlIHRhYmxlIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGluc3RhbmNlIG9mIHRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHJldHVybnMgUmV0dXJucyAnZmFsc2UnIGlmIEZpbHRlckZ1bmN0aW9ucyBhbm5vdGF0aW9uIHN1cHBvcnRzICd0b2xvd2VyJywgZWxzZSAndHJ1ZSdcbiAqL1xuZXhwb3J0IGNvbnN0IGlzRmlsdGVyaW5nQ2FzZVNlbnNpdGl2ZSA9IGZ1bmN0aW9uIChjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4pOiBib29sZWFuIHtcblx0Y29uc3QgZmlsdGVyRnVuY3Rpb25zOiBGaWx0ZXJGdW5jdGlvbnMgfCB1bmRlZmluZWQgPSBfZ2V0RmlsdGVyRnVuY3Rpb25zKGNvbnZlcnRlckNvbnRleHQpO1xuXHRyZXR1cm4gQXJyYXkuaXNBcnJheShmaWx0ZXJGdW5jdGlvbnMpID8gIShmaWx0ZXJGdW5jdGlvbnMgYXMgU3RyaW5nW10pLmluY2x1ZGVzKFwidG9sb3dlclwiKSA6IHRydWU7XG59O1xuZnVuY3Rpb24gX2dldEZpbHRlckZ1bmN0aW9ucyhDb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4pOiBGaWx0ZXJGdW5jdGlvbnMgfCB1bmRlZmluZWQge1xuXHRjb25zdCBlbnRpdHlTZXQgPSBDb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVNldCgpO1xuXHRpZiAoVHlwZUd1YXJkcy5pc0VudGl0eVNldChlbnRpdHlTZXQpKSB7XG5cdFx0cmV0dXJuIChcblx0XHRcdGVudGl0eVNldC5hbm5vdGF0aW9ucy5DYXBhYmlsaXRpZXM/LkZpbHRlckZ1bmN0aW9ucyA/P1xuXHRcdFx0Q29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlDb250YWluZXIoKS5hbm5vdGF0aW9ucy5DYXBhYmlsaXRpZXM/LkZpbHRlckZ1bmN0aW9uc1xuXHRcdCk7XG5cdH1cblx0cmV0dXJuIHVuZGVmaW5lZDtcbn1cbi8qKlxuICogUmV0dXJucyBkZWZhdWx0IGZvcm1hdCBvcHRpb25zIGZvciB0ZXh0IGZpZWxkcyBpbiBhIHRhYmxlLlxuICogQHBhcmFtIGZvcm1hdE9wdGlvbnNcbiAqIEByZXR1cm5zIENvbGxlY3Rpb24gb2YgZm9ybWF0IG9wdGlvbnMgd2l0aCBkZWZhdWx0IHZhbHVlc1xuICovXG5mdW5jdGlvbiBfZ2V0RGVmYXVsdEZvcm1hdE9wdGlvbnNGb3JUYWJsZShmb3JtYXRPcHRpb25zOiBGb3JtYXRPcHRpb25zVHlwZSB8IHVuZGVmaW5lZCk6IEZvcm1hdE9wdGlvbnNUeXBlIHwgdW5kZWZpbmVkIHtcblx0cmV0dXJuIGZvcm1hdE9wdGlvbnMgPT09IHVuZGVmaW5lZFxuXHRcdD8gdW5kZWZpbmVkXG5cdFx0OiB7XG5cdFx0XHRcdHRleHRMaW5lc0VkaXQ6IDQsXG5cdFx0XHRcdC4uLmZvcm1hdE9wdGlvbnNcblx0XHQgIH07XG59XG5mdW5jdGlvbiBfZmluZFNlbWFudGljS2V5VmFsdWVzKHNlbWFudGljS2V5czogU2VtYW50aWNLZXksIG5hbWU6IHN0cmluZyk6IHsgdmFsdWVzOiBzdHJpbmdbXTsgc2VtYW50aWNLZXlGb3VuZDogYm9vbGVhbiB9IHtcblx0Y29uc3QgYVNlbWFudGljS2V5VmFsdWVzOiBzdHJpbmdbXSA9IFtdO1xuXHRsZXQgYlNlbWFudGljS2V5Rm91bmQgPSBmYWxzZTtcblx0Zm9yIChsZXQgaSA9IDA7IGkgPCBzZW1hbnRpY0tleXMubGVuZ3RoOyBpKyspIHtcblx0XHRhU2VtYW50aWNLZXlWYWx1ZXMucHVzaChzZW1hbnRpY0tleXNbaV0udmFsdWUpO1xuXHRcdGlmIChzZW1hbnRpY0tleXNbaV0udmFsdWUgPT09IG5hbWUpIHtcblx0XHRcdGJTZW1hbnRpY0tleUZvdW5kID0gdHJ1ZTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIHtcblx0XHR2YWx1ZXM6IGFTZW1hbnRpY0tleVZhbHVlcyxcblx0XHRzZW1hbnRpY0tleUZvdW5kOiBiU2VtYW50aWNLZXlGb3VuZFxuXHR9O1xufVxuZnVuY3Rpb24gX2ZpbmRQcm9wZXJ0aWVzKFxuXHRzZW1hbnRpY0tleVZhbHVlczogc3RyaW5nW10sXG5cdGZpZWxkR3JvdXBQcm9wZXJ0aWVzOiBzdHJpbmdbXVxuKTogeyBzZW1hbnRpY0tleUhhc1Byb3BlcnR5SW5GaWVsZEdyb3VwOiBib29sZWFuOyBmaWVsZEdyb3VwUHJvcGVydHlQYXRoPzogc3RyaW5nIH0ge1xuXHRsZXQgc2VtYW50aWNLZXlIYXNQcm9wZXJ0eUluRmllbGRHcm91cCA9IGZhbHNlO1xuXHRsZXQgc1Byb3BlcnR5UGF0aDtcblx0aWYgKHNlbWFudGljS2V5VmFsdWVzICYmIHNlbWFudGljS2V5VmFsdWVzLmxlbmd0aCA+PSAxICYmIGZpZWxkR3JvdXBQcm9wZXJ0aWVzICYmIGZpZWxkR3JvdXBQcm9wZXJ0aWVzLmxlbmd0aCA+PSAxKSB7XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBzZW1hbnRpY0tleVZhbHVlcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0aWYgKFtzZW1hbnRpY0tleVZhbHVlc1tpXV0uc29tZSgodG1wKSA9PiBmaWVsZEdyb3VwUHJvcGVydGllcy5pbmNsdWRlcyh0bXApKSkge1xuXHRcdFx0XHRzZW1hbnRpY0tleUhhc1Byb3BlcnR5SW5GaWVsZEdyb3VwID0gdHJ1ZTtcblx0XHRcdFx0c1Byb3BlcnR5UGF0aCA9IHNlbWFudGljS2V5VmFsdWVzW2ldO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0cmV0dXJuIHtcblx0XHRzZW1hbnRpY0tleUhhc1Byb3BlcnR5SW5GaWVsZEdyb3VwOiBzZW1hbnRpY0tleUhhc1Byb3BlcnR5SW5GaWVsZEdyb3VwLFxuXHRcdGZpZWxkR3JvdXBQcm9wZXJ0eVBhdGg6IHNQcm9wZXJ0eVBhdGhcblx0fTtcbn1cbi8qKlxuICogRmluZCB0aGUgZmlyc3QgcHJvcGVydHkgaW4gdGhlIGZpZWxkR3JvdXAgdGhhdCBpcyBwYXJ0IG9mIHRoZSBzZW1hbnRpYyBrZXlzLlxuICogQHBhcmFtIGRhdGFGaWVsZEdyb3VwXG4gKiBAcGFyYW0gc2VtYW50aWNLZXlWYWx1ZXNcbiAqIEByZXR1cm5zIEFuIG9iamVjdCBjb250YWluaW5nIGEgZmxhZyB0cnVlIGlmIGEgcHJvcGVydHkgaXMgZm91bmQgYW5kIGEgcHJvcGVydHlQYXRoLlxuICovXG5mdW5jdGlvbiBfZmluZFNlbWFudGljS2V5VmFsdWVzSW5GaWVsZEdyb3VwKFxuXHRkYXRhRmllbGRHcm91cDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyB8IG51bGwsXG5cdHNlbWFudGljS2V5VmFsdWVzOiBzdHJpbmdbXVxuKTogeyBzZW1hbnRpY0tleUhhc1Byb3BlcnR5SW5GaWVsZEdyb3VwOiBib29sZWFuOyBwcm9wZXJ0eVBhdGg/OiBzdHJpbmcgfSB7XG5cdC8vIHRoaXMgaW5mbyBpcyB1c2VkIGluIEZpZWxkSGVscGVyI2lzRHJhZnRJbmRpY2F0b3JWaXNpYmxlSW5GaWVsZEdyb3VwIHRvIHNob3cgYSBkcmFmdCBpbmRpY2F0b3IgYXQgdGhlIGVuZCBvZiBhIGZpZWxkIGdyb3VwXG5cdGNvbnN0IGFQcm9wZXJ0aWVzOiBzdHJpbmdbXSA9IFtdO1xuXHRsZXQgX3Byb3BlcnRpZXNGb3VuZDogeyBzZW1hbnRpY0tleUhhc1Byb3BlcnR5SW5GaWVsZEdyb3VwOiBib29sZWFuOyBmaWVsZEdyb3VwUHJvcGVydHlQYXRoPzogc3RyaW5nIH0gPSB7XG5cdFx0c2VtYW50aWNLZXlIYXNQcm9wZXJ0eUluRmllbGRHcm91cDogZmFsc2UsXG5cdFx0ZmllbGRHcm91cFByb3BlcnR5UGF0aDogdW5kZWZpbmVkXG5cdH07XG5cdGlmIChcblx0XHRkYXRhRmllbGRHcm91cCAmJlxuXHRcdGRhdGFGaWVsZEdyb3VwLiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBbm5vdGF0aW9uICYmXG5cdFx0ZGF0YUZpZWxkR3JvdXAuVGFyZ2V0Py4kdGFyZ2V0Py4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRmllbGRHcm91cFR5cGVcblx0KSB7XG5cdFx0ZGF0YUZpZWxkR3JvdXAuVGFyZ2V0LiR0YXJnZXQuRGF0YT8uZm9yRWFjaCgoaW5uZXJEYXRhRmllbGQ6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMpID0+IHtcblx0XHRcdGlmIChcblx0XHRcdFx0KGlubmVyRGF0YUZpZWxkLiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGQgfHwgaW5uZXJEYXRhRmllbGQuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhVcmwpICYmXG5cdFx0XHRcdGlubmVyRGF0YUZpZWxkLlZhbHVlXG5cdFx0XHQpIHtcblx0XHRcdFx0YVByb3BlcnRpZXMucHVzaChpbm5lckRhdGFGaWVsZC5WYWx1ZS5wYXRoKTtcblx0XHRcdH1cblx0XHRcdF9wcm9wZXJ0aWVzRm91bmQgPSBfZmluZFByb3BlcnRpZXMoc2VtYW50aWNLZXlWYWx1ZXMsIGFQcm9wZXJ0aWVzKTtcblx0XHR9KTtcblx0fVxuXHRyZXR1cm4ge1xuXHRcdHNlbWFudGljS2V5SGFzUHJvcGVydHlJbkZpZWxkR3JvdXA6IF9wcm9wZXJ0aWVzRm91bmQuc2VtYW50aWNLZXlIYXNQcm9wZXJ0eUluRmllbGRHcm91cCxcblx0XHRwcm9wZXJ0eVBhdGg6IF9wcm9wZXJ0aWVzRm91bmQuZmllbGRHcm91cFByb3BlcnR5UGF0aFxuXHR9O1xufVxuLyoqXG4gKiBSZXR1cm5zIGRlZmF1bHQgZm9ybWF0IG9wdGlvbnMgd2l0aCBkcmFmdEluZGljYXRvciBmb3IgYSBjb2x1bW4uXG4gKiBAcGFyYW0gbmFtZVxuICogQHBhcmFtIHNlbWFudGljS2V5c1xuICogQHBhcmFtIGRhdGFGaWVsZEdyb3VwXG4gKiBAcmV0dXJucyBDb2xsZWN0aW9uIG9mIGZvcm1hdCBvcHRpb25zIHdpdGggZGVmYXVsdCB2YWx1ZXNcbiAqL1xuZnVuY3Rpb24gZ2V0RGVmYXVsdERyYWZ0SW5kaWNhdG9yRm9yQ29sdW1uKFxuXHRuYW1lOiBzdHJpbmcsXG5cdHNlbWFudGljS2V5czogU2VtYW50aWNLZXksXG5cdGRhdGFGaWVsZEdyb3VwOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzIHwgbnVsbFxuKTogUGFydGlhbDx7XG5cdGZpZWxkR3JvdXBEcmFmdEluZGljYXRvclByb3BlcnR5UGF0aDogc3RyaW5nO1xuXHRmaWVsZEdyb3VwTmFtZTogc3RyaW5nO1xuXHRzaG93RXJyb3JPYmplY3RTdGF0dXM6IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uO1xuXHRoYXNEcmFmdEluZGljYXRvcjogYm9vbGVhbjtcbn0+IHtcblx0aWYgKCFzZW1hbnRpY0tleXMpIHtcblx0XHRyZXR1cm4ge307XG5cdH1cblx0Y29uc3Qgc2VtYW50aWNLZXkgPSBfZmluZFNlbWFudGljS2V5VmFsdWVzKHNlbWFudGljS2V5cywgbmFtZSk7XG5cdGNvbnN0IHNlbWFudGljS2V5SW5GaWVsZEdyb3VwID0gX2ZpbmRTZW1hbnRpY0tleVZhbHVlc0luRmllbGRHcm91cChkYXRhRmllbGRHcm91cCwgc2VtYW50aWNLZXkudmFsdWVzKTtcblx0aWYgKHNlbWFudGljS2V5SW5GaWVsZEdyb3VwLnNlbWFudGljS2V5SGFzUHJvcGVydHlJbkZpZWxkR3JvdXApIHtcblx0XHQvLyBTZW1hbnRpYyBLZXkgaGFzIGEgcHJvcGVydHkgaW4gYSBGaWVsZEdyb3VwXG5cdFx0cmV0dXJuIHtcblx0XHRcdC8vVE9ETyB3ZSBzaG91bGQgcmF0aGVyIHN0b3JlIGhhc1NlbWFudGljS2V5SW5GaWVsZEdyb3VwXG5cdFx0XHRmaWVsZEdyb3VwRHJhZnRJbmRpY2F0b3JQcm9wZXJ0eVBhdGg6IHNlbWFudGljS2V5SW5GaWVsZEdyb3VwLnByb3BlcnR5UGF0aCxcblx0XHRcdGZpZWxkR3JvdXBOYW1lOiBuYW1lLFxuXHRcdFx0c2hvd0Vycm9yT2JqZWN0U3RhdHVzOiBjb21waWxlRXhwcmVzc2lvbihnZXRSb3dTdGF0dXNWaXNpYmlsaXR5KG5hbWUsIHRydWUpKVxuXHRcdH07XG5cdH0gZWxzZSBpZiAoc2VtYW50aWNLZXkuc2VtYW50aWNLZXlGb3VuZCkge1xuXHRcdHJldHVybiB7XG5cdFx0XHRoYXNEcmFmdEluZGljYXRvcjogdHJ1ZSxcblx0XHRcdHNob3dFcnJvck9iamVjdFN0YXR1czogY29tcGlsZUV4cHJlc3Npb24oZ2V0Um93U3RhdHVzVmlzaWJpbGl0eShuYW1lLCBmYWxzZSkpXG5cdFx0fTtcblx0fVxuXHRyZXR1cm4ge307XG59XG5mdW5jdGlvbiBfZ2V0SW1wTnVtYmVyKGRhdGFGaWVsZDogRGF0YUZpZWxkVHlwZXMpOiBudW1iZXIge1xuXHRjb25zdCBpbXBvcnRhbmNlID0gZGF0YUZpZWxkPy5hbm5vdGF0aW9ucz8uVUk/LkltcG9ydGFuY2UgYXMgc3RyaW5nO1xuXHRpZiAoaW1wb3J0YW5jZSAmJiBpbXBvcnRhbmNlLmluY2x1ZGVzKFwiVUkuSW1wb3J0YW5jZVR5cGUvSGlnaFwiKSkge1xuXHRcdHJldHVybiAzO1xuXHR9XG5cdGlmIChpbXBvcnRhbmNlICYmIGltcG9ydGFuY2UuaW5jbHVkZXMoXCJVSS5JbXBvcnRhbmNlVHlwZS9NZWRpdW1cIikpIHtcblx0XHRyZXR1cm4gMjtcblx0fVxuXHRpZiAoaW1wb3J0YW5jZSAmJiBpbXBvcnRhbmNlLmluY2x1ZGVzKFwiVUkuSW1wb3J0YW5jZVR5cGUvTG93XCIpKSB7XG5cdFx0cmV0dXJuIDE7XG5cdH1cblx0cmV0dXJuIDA7XG59XG5mdW5jdGlvbiBfZ2V0RGF0YUZpZWxkSW1wb3J0YW5jZShkYXRhRmllbGQ6IERhdGFGaWVsZFR5cGVzKTogSW1wb3J0YW5jZSB7XG5cdGNvbnN0IGltcG9ydGFuY2UgPSBkYXRhRmllbGQ/LmFubm90YXRpb25zPy5VST8uSW1wb3J0YW5jZSBhcyBzdHJpbmc7XG5cdHJldHVybiBpbXBvcnRhbmNlID8gKGltcG9ydGFuY2Uuc3BsaXQoXCIvXCIpWzFdIGFzIEltcG9ydGFuY2UpIDogSW1wb3J0YW5jZS5Ob25lO1xufVxuLyoqXG4gKiBTZXRzIHRoZSBleHBvcnQgc2V0dGluZ3Mgb2YgYSBjb2x1bW4gY29udGFpbmluZyBkYXRhcG9pbnRzLlxuICogQHBhcmFtIHByb3BlcnR5IFRoZSBwcm9wZXJ0eSByZWZlcmVuY2VkIG9uIGEgZ2l2ZW4gY29sdW1uXG4gKiBAcGFyYW0gY29sdW1uIFRoZSBjb2x1bW4gdG8gYmUgdXBkYXRlZFxuICovXG5cbmZ1bmN0aW9uIF9zZXRFeHBvcnRTZXR0aW5nc0ZvckRhdGFQb2ludChwcm9wZXJ0eTogUHJvcGVydHksIGNvbHVtbjogQW5ub3RhdGlvblRhYmxlQ29sdW1uKTogdm9pZCB7XG5cdGNvbnN0IHRhcmdldFZhbHVlZnJvbURQID0gZ2V0VGFyZ2V0VmFsdWVPbkRhdGFQb2ludChwcm9wZXJ0eSk7XG5cdGlmIChcblx0XHRpc0RhdGFQb2ludEZyb21EYXRhRmllbGREZWZhdWx0KHByb3BlcnR5KSAmJlxuXHRcdHR5cGVvZiB0YXJnZXRWYWx1ZWZyb21EUCA9PT0gXCJzdHJpbmdcIiAmJlxuXHRcdGNvbHVtbi5leHBvcnRTZXR0aW5ncyAmJlxuXHRcdGNvbHVtbi5leHBvcnRTZXR0aW5ncz8udW5pdCAhPT0gXCIlXCJcblx0KSB7XG5cdFx0Y29sdW1uLmV4cG9ydERhdGFQb2ludFRhcmdldFZhbHVlID0gdGFyZ2V0VmFsdWVmcm9tRFA7XG5cdFx0Y29sdW1uLmV4cG9ydFNldHRpbmdzLnRlbXBsYXRlID0gXCJ7MH0vXCIgKyB0YXJnZXRWYWx1ZWZyb21EUDtcblx0fVxufVxuXG5mdW5jdGlvbiBfZ2V0TWF4SW1wb3J0YW5jZShmaWVsZHM6IERhdGFGaWVsZFR5cGVzW10pOiBJbXBvcnRhbmNlIHtcblx0aWYgKGZpZWxkcyAmJiBmaWVsZHMubGVuZ3RoID4gMCkge1xuXHRcdGxldCBtYXhJbXBOdW1iZXIgPSAtMTtcblx0XHRsZXQgaW1wTnVtYmVyID0gLTE7XG5cdFx0bGV0IERhdGFGaWVsZFdpdGhNYXhJbXBvcnRhbmNlO1xuXHRcdGZvciAoY29uc3QgZmllbGQgb2YgZmllbGRzKSB7XG5cdFx0XHRpbXBOdW1iZXIgPSBfZ2V0SW1wTnVtYmVyKGZpZWxkKTtcblx0XHRcdGlmIChpbXBOdW1iZXIgPiBtYXhJbXBOdW1iZXIpIHtcblx0XHRcdFx0bWF4SW1wTnVtYmVyID0gaW1wTnVtYmVyO1xuXHRcdFx0XHREYXRhRmllbGRXaXRoTWF4SW1wb3J0YW5jZSA9IGZpZWxkO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gX2dldERhdGFGaWVsZEltcG9ydGFuY2UoRGF0YUZpZWxkV2l0aE1heEltcG9ydGFuY2UgYXMgRGF0YUZpZWxkVHlwZXMpO1xuXHR9XG5cdHJldHVybiBJbXBvcnRhbmNlLk5vbmU7XG59XG4vKipcbiAqIFJldHVybnMgdGhlIGltcG9ydGFuY2UgdmFsdWUgZm9yIGEgY29sdW1uLlxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHRcbiAqIEBwYXJhbSBkYXRhRmllbGRcbiAqIEByZXR1cm5zIFRoZSBpbXBvcnRhbmNlIHZhbHVlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbXBvcnRhbmNlKFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sXG5cdGRhdGFGaWVsZDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyB8IHVuZGVmaW5lZFxuKTogSW1wb3J0YW5jZSB8IHVuZGVmaW5lZCB7XG5cdGlmICghZGF0YUZpZWxkKSB7XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxuXHRjb25zdCBzZW1hbnRpY0tleXMgPSBjb252ZXJ0ZXJDb250ZXh0LmdldERhdGFNb2RlbE9iamVjdFBhdGgoKS50YXJnZXRFbnRpdHlUeXBlLmFubm90YXRpb25zLkNvbW1vbj8uU2VtYW50aWNLZXkgPz8gW107XG5cdGNvbnN0IHJlcXVpcmVkUHJvcGVydGllcyA9IGdldFJlcXVpcmVkUHJvcGVydGllcyhjb252ZXJ0ZXJDb250ZXh0KTtcblx0Y29uc3QgaGlnaEtleXMgPSBbLi4uc2VtYW50aWNLZXlzLCAuLi5yZXF1aXJlZFByb3BlcnRpZXNdLm1hcCgocHJvcGVydHlQYXRoKSA9PiBwcm9wZXJ0eVBhdGguJHRhcmdldD8uZnVsbHlRdWFsaWZpZWROYW1lKTtcblx0Ly9FdmFsdWF0ZSBkZWZhdWx0IEltcG9ydGFuY2UgaXMgbm90IHNldCBleHBsaWNpdGx5XG5cdGxldCBmaWVsZHNXaXRoSW1wb3J0YW5jZTtcblx0aWYgKGlzQW5ub3RhdGlvbk9mVHlwZTxEYXRhRmllbGRGb3JBbm5vdGF0aW9uPihkYXRhRmllbGQsIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFubm90YXRpb24pKSB7XG5cdFx0Y29uc3QgZGF0YUZpZWxkVGFyZ2V0ID0gZGF0YUZpZWxkLlRhcmdldC4kdGFyZ2V0O1xuXHRcdGlmIChpc0Fubm90YXRpb25PZlR5cGU8RmllbGRHcm91cD4oZGF0YUZpZWxkVGFyZ2V0LCBVSUFubm90YXRpb25UeXBlcy5GaWVsZEdyb3VwVHlwZSkpIHtcblx0XHRcdGNvbnN0IGZpZWxkR3JvdXBEYXRhID0gZGF0YUZpZWxkVGFyZ2V0LkRhdGE7XG5cdFx0XHQvL0lmIGEgRmllbGRHcm91cCBjb250YWlucyBhIHNlbWFudGljS2V5IG9yIHJlcXVpcmVkIHByb3BlcnR5LCBpbXBvcnRhbmNlIHNldCB0byBIaWdoXG5cdFx0XHRpZiAoXG5cdFx0XHRcdGZpZWxkR3JvdXBEYXRhLnNvbWUoZnVuY3Rpb24gKGZpZWxkR3JvdXBEYXRhRmllbGQ6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMpOiBib29sZWFuIHtcblx0XHRcdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHRcdFx0aXNEYXRhRmllbGRUeXBlcyhmaWVsZEdyb3VwRGF0YUZpZWxkKSAmJiBoaWdoS2V5cy5pbmNsdWRlcyhmaWVsZEdyb3VwRGF0YUZpZWxkLlZhbHVlPy4kdGFyZ2V0Py5mdWxseVF1YWxpZmllZE5hbWUpXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fSlcblx0XHRcdCkge1xuXHRcdFx0XHRyZXR1cm4gSW1wb3J0YW5jZS5IaWdoO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ly9JZiB0aGUgRGF0YUZpZWxkRm9yQW5ub3RhdGlvbiBoYXMgYW4gSW1wb3J0YW5jZSB3ZSB0YWtlIGl0XG5cdFx0XHRcdGlmIChkYXRhRmllbGQ/LmFubm90YXRpb25zPy5VST8uSW1wb3J0YW5jZSkge1xuXHRcdFx0XHRcdHJldHVybiBfZ2V0RGF0YUZpZWxkSW1wb3J0YW5jZShkYXRhRmllbGQgYXMgdW5rbm93biBhcyBEYXRhRmllbGRUeXBlcyk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly8gZWxzZSB0aGUgaGlnaGVzdCBpbXBvcnRhbmNlIChpZiBhbnkpIGlzIHJldHVybmVkXG5cdFx0XHRcdGZpZWxkc1dpdGhJbXBvcnRhbmNlID0gZmllbGRHcm91cERhdGEuZmlsdGVyKGZ1bmN0aW9uIChpdGVtKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGl0ZW0/LmFubm90YXRpb25zPy5VST8uSW1wb3J0YW5jZTtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHJldHVybiBfZ2V0TWF4SW1wb3J0YW5jZShmaWVsZHNXaXRoSW1wb3J0YW5jZSBhcyBEYXRhRmllbGRUeXBlc1tdKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0cmV0dXJuIGhpZ2hLZXlzLmluY2x1ZGVzKChkYXRhRmllbGQgYXMgRGF0YUZpZWxkVHlwZXMpLlZhbHVlPy4kdGFyZ2V0Py5mdWxseVF1YWxpZmllZE5hbWUpXG5cdFx0PyBJbXBvcnRhbmNlLkhpZ2hcblx0XHQ6IF9nZXREYXRhRmllbGRJbXBvcnRhbmNlKGRhdGFGaWVsZCBhcyB1bmtub3duIGFzIERhdGFGaWVsZFR5cGVzKTtcbn1cbi8qKlxuICogUmV0dXJucyBsaW5lIGl0ZW1zIGZyb20gbWV0YWRhdGEgYW5ub3RhdGlvbnMuXG4gKiBAcGFyYW0gbGluZUl0ZW1Bbm5vdGF0aW9uIENvbGxlY3Rpb24gb2YgZGF0YSBmaWVsZHMgd2l0aCB0aGVpciBhbm5vdGF0aW9uc1xuICogQHBhcmFtIHZpc3VhbGl6YXRpb25QYXRoIFRoZSB2aXN1YWxpemF0aW9uIHBhdGhcbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHJldHVybnMgVGhlIGNvbHVtbnMgZnJvbSB0aGUgYW5ub3RhdGlvbnNcbiAqL1xuY29uc3QgZ2V0Q29sdW1uc0Zyb21Bbm5vdGF0aW9ucyA9IGZ1bmN0aW9uIChcblx0bGluZUl0ZW1Bbm5vdGF0aW9uOiBMaW5lSXRlbSxcblx0dmlzdWFsaXphdGlvblBhdGg6IHN0cmluZyxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+XG4pOiBBbm5vdGF0aW9uVGFibGVDb2x1bW5bXSB7XG5cdGNvbnN0IGVudGl0eVR5cGU6IEVudGl0eVR5cGUgPSBjb252ZXJ0ZXJDb250ZXh0LmdldEFubm90YXRpb25FbnRpdHlUeXBlKGxpbmVJdGVtQW5ub3RhdGlvbiksXG5cdFx0YW5ub3RhdGlvbkNvbHVtbnM6IEFubm90YXRpb25UYWJsZUNvbHVtbltdID0gW10sXG5cdFx0Y29sdW1uc1RvQmVDcmVhdGVkOiBSZWNvcmQ8c3RyaW5nLCBQcm9wZXJ0eT4gPSB7fSxcblx0XHRkaXNwbGF5TW9kZU9mRGVzY3JpcHRpb25Qcm9wZXJ0aWVzTWFwOiBSZWNvcmQ8c3RyaW5nLCBEaXNwbGF5TW9kZT4gPSB7fSxcblx0XHRyZXN0cmljdGlvbnNPblByb3BlcnRpZXMgPSBnZXRSZXN0cmljdGlvbnNPblByb3BlcnRpZXMoY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlTZXQoKSksXG5cdFx0dGFibGVNYW5pZmVzdFNldHRpbmdzOiBUYWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbiA9IGNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RDb250cm9sQ29uZmlndXJhdGlvbih2aXN1YWxpemF0aW9uUGF0aCksXG5cdFx0dGFibGVUeXBlID0gZ2V0VGFibGVUeXBlKGNvbnZlcnRlckNvbnRleHQsIHRhYmxlTWFuaWZlc3RTZXR0aW5ncyksXG5cdFx0ZGVmYXVsdENyZWF0aW9uTW9kZSA9XG5cdFx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0V3JhcHBlcigpLmdldFNhcEZlTWFuaWZlc3RDb25maWd1cmF0aW9uKCk/Lm1hY3Jvcz8udGFibGU/LmRlZmF1bHRDcmVhdGlvbk1vZGUgPT09XG5cdFx0XHRcIklubGluZUNyZWF0aW9uUm93c1wiXG5cdFx0XHRcdD8gQ3JlYXRpb25Nb2RlLklubGluZUNyZWF0aW9uUm93c1xuXHRcdFx0XHQ6IHVuZGVmaW5lZCxcblx0XHR0YWJsZUNyZWF0aW9uTW9kZTogQ3JlYXRpb25Nb2RlID1cblx0XHRcdHRhYmxlTWFuaWZlc3RTZXR0aW5ncz8udGFibGVTZXR0aW5ncz8uY3JlYXRpb25Nb2RlPy5uYW1lID8/IGRlZmF1bHRDcmVhdGlvbk1vZGUgPz8gQ3JlYXRpb25Nb2RlLklubGluZTtcblx0Y29uc3Qgc2VtYW50aWNLZXlzOiBTZW1hbnRpY0tleSA9IGNvbnZlcnRlckNvbnRleHQuZ2V0QW5ub3RhdGlvbnNCeVRlcm0oXCJDb21tb25cIiwgQ29tbW9uQW5ub3RhdGlvblRlcm1zLlNlbWFudGljS2V5LCBbXG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlUeXBlKClcblx0XSlbMF0gYXMgU2VtYW50aWNLZXk7XG5cdGlmIChsaW5lSXRlbUFubm90YXRpb24pIHtcblx0XHRjb25zdCB0YWJsZUNvbnZlcnRlckNvbnRleHQgPSBjb252ZXJ0ZXJDb250ZXh0LmdldENvbnZlcnRlckNvbnRleHRGb3I8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pihcblx0XHRcdGdldFRhcmdldE9iamVjdFBhdGgoY29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCkpXG5cdFx0KTtcblx0XHRsaW5lSXRlbUFubm90YXRpb24uZm9yRWFjaCgoZGF0YUZpZWxkKSA9PiB7XG5cdFx0XHQvLyBUT0RPOiB2YXJpYWJsZSBuYW1lIHNob3VsZCBiZSBkYXRhZmllbGQgYW5kIG5vdCBsaW5lSXRlbVxuXHRcdFx0aWYgKCFfaXNWYWxpZENvbHVtbihkYXRhRmllbGQpKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGxldCBleHBvcnRTZXR0aW5nczogQ29sdW1uRXhwb3J0U2V0dGluZ3MgfCBudWxsID0gbnVsbDtcblx0XHRcdGNvbnN0IHNlbWFudGljT2JqZWN0QW5ub3RhdGlvblBhdGggPVxuXHRcdFx0XHRpc0RhdGFGaWVsZFR5cGVzKGRhdGFGaWVsZCkgJiYgZGF0YUZpZWxkLlZhbHVlPy4kdGFyZ2V0Py5mdWxseVF1YWxpZmllZE5hbWVcblx0XHRcdFx0XHQ/IGdldFNlbWFudGljT2JqZWN0UGF0aChjb252ZXJ0ZXJDb250ZXh0LCBkYXRhRmllbGQpXG5cdFx0XHRcdFx0OiB1bmRlZmluZWQ7XG5cdFx0XHRjb25zdCByZWxhdGl2ZVBhdGggPSBfZ2V0UmVsYXRpdmVQYXRoKGRhdGFGaWVsZCk7XG5cdFx0XHQvLyBEZXRlcm1pbmUgcHJvcGVydGllcyB3aGljaCBhcmUgY29uc3VtZWQgYnkgdGhpcyBMaW5lSXRlbS5cblx0XHRcdGNvbnN0IHJlbGF0ZWRQcm9wZXJ0aWVzSW5mbzogQ29tcGxleFByb3BlcnR5SW5mbyA9IGNvbGxlY3RSZWxhdGVkUHJvcGVydGllc1JlY3Vyc2l2ZWx5KGRhdGFGaWVsZCwgY29udmVydGVyQ29udGV4dCwgdGFibGVUeXBlKTtcblx0XHRcdGNvbnN0IHJlbGF0ZWRQcm9wZXJ0eU5hbWVzOiBzdHJpbmdbXSA9IE9iamVjdC5rZXlzKHJlbGF0ZWRQcm9wZXJ0aWVzSW5mby5wcm9wZXJ0aWVzKTtcblx0XHRcdGNvbnN0IGFkZGl0aW9uYWxQcm9wZXJ0eU5hbWVzOiBzdHJpbmdbXSA9IE9iamVjdC5rZXlzKHJlbGF0ZWRQcm9wZXJ0aWVzSW5mby5hZGRpdGlvbmFsUHJvcGVydGllcyk7XG5cdFx0XHRjb25zdCBncm91cFBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHJlbGF0aXZlUGF0aCA/IF9zbGljZUF0U2xhc2gocmVsYXRpdmVQYXRoLCB0cnVlLCBmYWxzZSkgOiB1bmRlZmluZWQ7XG5cdFx0XHRjb25zdCBpc0dyb3VwOiBib29sZWFuID0gZ3JvdXBQYXRoICE9IHJlbGF0aXZlUGF0aDtcblx0XHRcdGNvbnN0IHNMYWJlbDogc3RyaW5nIHwgdW5kZWZpbmVkID0gZ2V0TGFiZWwoZGF0YUZpZWxkLCBpc0dyb3VwKTtcblx0XHRcdGNvbnN0IG5hbWUgPSBfZ2V0QW5ub3RhdGlvbkNvbHVtbk5hbWUoZGF0YUZpZWxkKTtcblx0XHRcdGNvbnN0IGlzRmllbGRHcm91cENvbHVtbjogYm9vbGVhbiA9IGdyb3VwUGF0aCA/IGdyb3VwUGF0aC5pbmNsdWRlcyhgQCR7VUlBbm5vdGF0aW9uVGVybXMuRmllbGRHcm91cH1gKSA6IGZhbHNlO1xuXHRcdFx0Y29uc3Qgc2hvd0RhdGFGaWVsZHNMYWJlbDogYm9vbGVhbiB8IHVuZGVmaW5lZCA9IGlzRmllbGRHcm91cENvbHVtblxuXHRcdFx0XHQ/IF9nZXRTaG93RGF0YUZpZWxkc0xhYmVsKG5hbWUsIHZpc3VhbGl6YXRpb25QYXRoLCBjb252ZXJ0ZXJDb250ZXh0KVxuXHRcdFx0XHQ6IGZhbHNlO1xuXHRcdFx0Y29uc3QgZGF0YVR5cGU6IHN0cmluZyB8IHVuZGVmaW5lZCA9IGdldERhdGFGaWVsZERhdGFUeXBlKGRhdGFGaWVsZCk7XG5cdFx0XHRjb25zdCBmb3JtYXRPcHRpb25zID0gX2dldERlZmF1bHRGb3JtYXRPcHRpb25zRm9yVGFibGUoZ2V0RGVmYXVsdERyYWZ0SW5kaWNhdG9yRm9yQ29sdW1uKG5hbWUsIHNlbWFudGljS2V5cywgZGF0YUZpZWxkKSk7XG5cdFx0XHRjb25zdCBwcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGggPSBlbmhhbmNlRGF0YU1vZGVsUGF0aDxEYXRhRmllbGRBYnN0cmFjdFR5cGVzPihcblx0XHRcdFx0Y29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCksXG5cdFx0XHRcdHJlbGF0aXZlUGF0aFxuXHRcdFx0KTtcblx0XHRcdC8vIERldGVybWluZSBpZiB3ZSBuZWVkIGEgc2l0dWF0aW9ucyBpbmRpY2F0b3Jcblx0XHRcdGNvbnN0IG5hdmlnYXRpb25Qcm9wZXJ0aWVzOiBOYXZpZ2F0aW9uUHJvcGVydHlbXSA9IHByb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRFbnRpdHlUeXBlLm5hdmlnYXRpb25Qcm9wZXJ0aWVzO1xuXHRcdFx0Y29uc3Qgc2l0dWF0aW9uc05hdlByb3BzID0gbmF2aWdhdGlvblByb3BlcnRpZXMuZmlsdGVyKFxuXHRcdFx0XHQobmF2aWdhdGlvblByb3BlcnR5KSA9PlxuXHRcdFx0XHRcdCFuYXZpZ2F0aW9uUHJvcGVydHkuaXNDb2xsZWN0aW9uICYmXG5cdFx0XHRcdFx0bmF2aWdhdGlvblByb3BlcnR5LnRhcmdldFR5cGUuYW5ub3RhdGlvbnMuQ29tbW9uPy5TQVBPYmplY3ROb2RlVHlwZT8uTmFtZSA9PT0gXCJCdXNpbmVzc1NpdHVhdGlvblwiXG5cdFx0XHQpO1xuXHRcdFx0Y29uc3Qgc2l0dWF0aW9uc05hdlByb3A6IE5hdmlnYXRpb25Qcm9wZXJ0eSB8IHVuZGVmaW5lZCA9IHNpdHVhdGlvbnNOYXZQcm9wcy5sZW5ndGggPj0gMSA/IHNpdHVhdGlvbnNOYXZQcm9wc1swXSA6IHVuZGVmaW5lZDtcblx0XHRcdGlmIChzaXR1YXRpb25zTmF2UHJvcCAmJiBmb3JtYXRPcHRpb25zKSB7XG5cdFx0XHRcdGZvcm1hdE9wdGlvbnMuaGFzU2l0dWF0aW9uc0luZGljYXRvciA9IHRydWU7XG5cdFx0XHR9XG5cblx0XHRcdGxldCBmaWVsZEdyb3VwSGlkZGVuRXhwcmVzc2lvbnM6IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uO1xuXHRcdFx0aWYgKFxuXHRcdFx0XHRkYXRhRmllbGQuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFubm90YXRpb24gJiZcblx0XHRcdFx0ZGF0YUZpZWxkLlRhcmdldD8uJHRhcmdldD8uJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkZpZWxkR3JvdXBUeXBlXG5cdFx0XHQpIHtcblx0XHRcdFx0ZmllbGRHcm91cEhpZGRlbkV4cHJlc3Npb25zID0gX2dldEZpZWxkR3JvdXBIaWRkZW5FeHByZXNzaW9ucyhkYXRhRmllbGQpO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgaXNNdWx0aVZhbHVlID0gX2lzQ29sdW1uTXVsdGlWYWx1ZWQoZGF0YUZpZWxkLCB0YWJsZUNvbnZlcnRlckNvbnRleHQpO1xuXHRcdFx0aWYgKCFpc011bHRpVmFsdWUgJiYgX2lzRXhwb3J0YWJsZUNvbHVtbihkYXRhRmllbGQpKSB7XG5cdFx0XHRcdC8vZXhjbHVkZSB0aGUgdHlwZXMgbGlzdGVkIGFib3ZlIGZvciB0aGUgRXhwb3J0IChnZW5lcmF0ZXMgZXJyb3Igb24gRXhwb3J0IGFzIFBERilcblx0XHRcdFx0ZXhwb3J0U2V0dGluZ3MgPSBjcmVhdGVDb2x1bW5FeHBvcnRTZXR0aW5ncyhkYXRhRmllbGQsIHJlbGF0ZWRQcm9wZXJ0aWVzSW5mbyk7XG5cdFx0XHR9XG5cdFx0XHRsZXQgcHJvcGVydHlUeXBlQ29uZmlnOiBQcm9wZXJ0eVR5cGVDb25maWcgfCB1bmRlZmluZWQ7XG5cdFx0XHRpZiAoZGF0YVR5cGUpIHtcblx0XHRcdFx0cHJvcGVydHlUeXBlQ29uZmlnID0gZ2V0VHlwZUNvbmZpZyhkYXRhRmllbGQsIGRhdGFUeXBlKTtcblx0XHRcdH1cblx0XHRcdGNvbnN0IHR5cGVDb25maWc6IFByb3BlcnR5VHlwZUNvbmZpZyA9IHtcblx0XHRcdFx0Y2xhc3NOYW1lOiBkYXRhVHlwZSBhcyBrZXlvZiB0eXBlb2YgRGVmYXVsdFR5cGVGb3JFZG1UeXBlLFxuXHRcdFx0XHRmb3JtYXRPcHRpb25zOiB7XG5cdFx0XHRcdFx0Li4uZm9ybWF0T3B0aW9ucyxcblx0XHRcdFx0XHQuLi5wcm9wZXJ0eVR5cGVDb25maWc/LmZvcm1hdE9wdGlvbnNcblx0XHRcdFx0fSxcblx0XHRcdFx0Y29uc3RyYWludHM6IHsgLi4ucHJvcGVydHlUeXBlQ29uZmlnPy5jb25zdHJhaW50cyB9XG5cdFx0XHR9O1xuXHRcdFx0Y29uc3QgdmlzdWFsU2V0dGluZ3M6IFZpc3VhbFNldHRpbmdzID0ge307XG5cdFx0XHRpZiAoIWRhdGFUeXBlIHx8ICF0eXBlQ29uZmlnKSB7XG5cdFx0XHRcdC8vIGZvciBjaGFydHNcblx0XHRcdFx0dmlzdWFsU2V0dGluZ3Mud2lkdGhDYWxjdWxhdGlvbiA9IG51bGw7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBzb3J0YWJsZSA9XG5cdFx0XHRcdCFpc011bHRpVmFsdWUgJiZcblx0XHRcdFx0X2lzQ29sdW1uU29ydGFibGUoZGF0YUZpZWxkLCByZWxhdGl2ZVBhdGgsIHJlc3RyaWN0aW9uc09uUHJvcGVydGllcy5ub25Tb3J0YWJsZVByb3BlcnRpZXMsIHJlbGF0ZWRQcm9wZXJ0aWVzSW5mbyk7XG5cdFx0XHRjb25zdCBhdmFpbGFiaWxpdHkgPSBpc1JlZmVyZW5jZVByb3BlcnR5U3RhdGljYWxseUhpZGRlbihkYXRhRmllbGQpID8gXCJIaWRkZW5cIiA6IFwiRGVmYXVsdFwiO1xuXHRcdFx0Y29uc3QgY29sdW1uOiBBbm5vdGF0aW9uVGFibGVDb2x1bW4gPSB7XG5cdFx0XHRcdGtleTogS2V5SGVscGVyLmdlbmVyYXRlS2V5RnJvbURhdGFGaWVsZChkYXRhRmllbGQpLFxuXHRcdFx0XHR0eXBlOiBDb2x1bW5UeXBlLkFubm90YXRpb24sXG5cdFx0XHRcdGxhYmVsOiBzTGFiZWwsXG5cdFx0XHRcdGdyb3VwTGFiZWw6IGlzR3JvdXAgPyBnZXRMYWJlbChkYXRhRmllbGQpIDogdW5kZWZpbmVkLFxuXHRcdFx0XHRncm91cDogaXNHcm91cCA/IGdyb3VwUGF0aCA6IHVuZGVmaW5lZCxcblx0XHRcdFx0RmllbGRHcm91cEhpZGRlbkV4cHJlc3Npb25zOiBmaWVsZEdyb3VwSGlkZGVuRXhwcmVzc2lvbnMsXG5cdFx0XHRcdGFubm90YXRpb25QYXRoOiBjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVNldEJhc2VkQW5ub3RhdGlvblBhdGgoZGF0YUZpZWxkLmZ1bGx5UXVhbGlmaWVkTmFtZSksXG5cdFx0XHRcdHNlbWFudGljT2JqZWN0UGF0aDogc2VtYW50aWNPYmplY3RBbm5vdGF0aW9uUGF0aCxcblx0XHRcdFx0YXZhaWxhYmlsaXR5OiBhdmFpbGFiaWxpdHksXG5cdFx0XHRcdG5hbWU6IG5hbWUsXG5cdFx0XHRcdHNob3dEYXRhRmllbGRzTGFiZWw6IHNob3dEYXRhRmllbGRzTGFiZWwsXG5cdFx0XHRcdHJlcXVpcmVkOiBpc1JlcXVpcmVkQ29sdW1uKGNvbnZlcnRlckNvbnRleHQsIGRhdGFGaWVsZCBhcyBEYXRhRmllbGRUeXBlcywgdGFibGVDcmVhdGlvbk1vZGUpLFxuXHRcdFx0XHRyZWxhdGl2ZVBhdGg6IHJlbGF0aXZlUGF0aCxcblx0XHRcdFx0c29ydGFibGU6IHNvcnRhYmxlLFxuXHRcdFx0XHRwcm9wZXJ0eUluZm9zOiByZWxhdGVkUHJvcGVydHlOYW1lcy5sZW5ndGggPyByZWxhdGVkUHJvcGVydHlOYW1lcyA6IHVuZGVmaW5lZCxcblx0XHRcdFx0YWRkaXRpb25hbFByb3BlcnR5SW5mb3M6IGFkZGl0aW9uYWxQcm9wZXJ0eU5hbWVzLmxlbmd0aCA+IDAgPyBhZGRpdGlvbmFsUHJvcGVydHlOYW1lcyA6IHVuZGVmaW5lZCxcblx0XHRcdFx0ZXhwb3J0U2V0dGluZ3M6IGV4cG9ydFNldHRpbmdzLFxuXHRcdFx0XHR3aWR0aDogKGRhdGFGaWVsZC5hbm5vdGF0aW9ucz8uSFRNTDU/LkNzc0RlZmF1bHRzPy53aWR0aD8udmFsdWVPZigpIGFzIHN0cmluZykgfHwgdW5kZWZpbmVkLFxuXHRcdFx0XHRpbXBvcnRhbmNlOiBnZXRJbXBvcnRhbmNlKGNvbnZlcnRlckNvbnRleHQsIGRhdGFGaWVsZCBhcyBEYXRhRmllbGRUeXBlcyksXG5cdFx0XHRcdGlzTmF2aWdhYmxlOiB0cnVlLFxuXHRcdFx0XHRmb3JtYXRPcHRpb25zOiBmb3JtYXRPcHRpb25zLFxuXHRcdFx0XHRjYXNlU2Vuc2l0aXZlOiBpc0ZpbHRlcmluZ0Nhc2VTZW5zaXRpdmUoY29udmVydGVyQ29udGV4dCksXG5cdFx0XHRcdHR5cGVDb25maWc6IHR5cGVDb25maWcsXG5cdFx0XHRcdHZpc3VhbFNldHRpbmdzOiB2aXN1YWxTZXR0aW5ncyxcblx0XHRcdFx0dGltZXpvbmVUZXh0OiBleHBvcnRTZXR0aW5ncz8udGltZXpvbmUsXG5cdFx0XHRcdGlzUGFydE9mTGluZUl0ZW06IHRydWUsXG5cdFx0XHRcdGlzTXVsdGlWYWx1ZVxuXHRcdFx0fTtcblx0XHRcdGNvbnN0IHRvb2x0aXAgPSBfZ2V0VG9vbHRpcChkYXRhRmllbGQpID8/IHNMYWJlbDtcblx0XHRcdGlmICh0b29sdGlwKSB7XG5cdFx0XHRcdGNvbHVtbi50b29sdGlwID0gdG9vbHRpcDtcblx0XHRcdH1cblx0XHRcdGlmIChyZWxhdGVkUHJvcGVydGllc0luZm8uZXhwb3J0U2V0dGluZ3MuZGF0YVBvaW50VGFyZ2V0VmFsdWUpIHtcblx0XHRcdFx0Y29sdW1uLmV4cG9ydERhdGFQb2ludFRhcmdldFZhbHVlID0gcmVsYXRlZFByb3BlcnRpZXNJbmZvLmV4cG9ydFNldHRpbmdzLmRhdGFQb2ludFRhcmdldFZhbHVlO1xuXHRcdFx0fVxuXHRcdFx0YW5ub3RhdGlvbkNvbHVtbnMucHVzaChjb2x1bW4pO1xuXHRcdFx0Ly8gQ29sbGVjdCBpbmZvcm1hdGlvbiBvZiByZWxhdGVkIGNvbHVtbnMgdG8gYmUgY3JlYXRlZC5cblx0XHRcdHJlbGF0ZWRQcm9wZXJ0eU5hbWVzLmZvckVhY2goKHJlbGF0ZWRQcm9wZXJ0eU5hbWUpID0+IHtcblx0XHRcdFx0Y29sdW1uc1RvQmVDcmVhdGVkW3JlbGF0ZWRQcm9wZXJ0eU5hbWVdID0gcmVsYXRlZFByb3BlcnRpZXNJbmZvLnByb3BlcnRpZXNbcmVsYXRlZFByb3BlcnR5TmFtZV0uYW5ub3RhdGlvblByb3BlcnR5O1xuXHRcdFx0XHQvLyBJbiBjYXNlIG9mIGEgbXVsdGktdmFsdWUsIHJlbGF0ZWQgcHJvcGVydGllcyBjYW5ub3QgYmUgc29ydGVkIGFzIHdlIGdvIHRocm91Z2ggYSAxLW4gcmVsYXRpb25cblx0XHRcdFx0aWYgKGlzTXVsdGlWYWx1ZSkge1xuXHRcdFx0XHRcdHJlc3RyaWN0aW9uc09uUHJvcGVydGllcy5ub25Tb3J0YWJsZVByb3BlcnRpZXMucHVzaChyZWxhdGVkUHJvcGVydHlOYW1lKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRhZGRQcm9wZXJ0eVRvRGlzcGxheU1vZGVPZkRlc2NyaXB0aW9uUHJvcGVydGllc01hcChcblx0XHRcdFx0XHRkaXNwbGF5TW9kZU9mRGVzY3JpcHRpb25Qcm9wZXJ0aWVzTWFwLFxuXHRcdFx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzSW5mbyxcblx0XHRcdFx0XHRyZWxhdGVkUHJvcGVydHlOYW1lXG5cdFx0XHRcdCk7XG5cdFx0XHRcdC8vIEluIGNhc2UgdGhlIGxpbmVJdGVtIHBvaW50cyB0byBhIG5hdmlnYXRpb24gcHJvcGVydHkgd2l0aCBhIHRleHRBcnJhbmdlbWVudCBUZXh0T25seSwgd2UgbmVlZCB0byBjcmVhdGUgdGhlIGNvbHVtbiB3aXRoIHRoZSB2YWx1ZSBuYXZpZ2F0aW9uIHByb3BlcnR5LlxuXHRcdFx0XHQvLyBUaGUgdGV4dCBwcm9wZXJ0eSBpcyByZWZlcmVuY2VkIG9uIHRoZSByZWxhdGVkIHByb3BlcnRpZXMgb2YgdGhlIGxpbmVJdGVtLCBzbyB3aWxsIGJlIGNyZWF0ZWQgb24gdGhlIF9jcmVhdGVSZWxhdGVkQ29sdW1ucyBtZXRob2QuXG5cdFx0XHRcdGlmIChyZWxhdGVkUHJvcGVydGllc0luZm8ucHJvcGVydGllc1tyZWxhdGVkUHJvcGVydHlOYW1lXS5kaXNwbGF5TW9kZU9mUHJvcGVydHlVc2VkQXNEZXNjcmlwdGlvbiA9PT0gXCJEZXNjcmlwdGlvblwiKSB7XG5cdFx0XHRcdFx0Y3JlYXRlUHJvcGVydHlBbm5vdGF0ZWRUZXh0T25seShcblx0XHRcdFx0XHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0XHRcdFx0XHRwcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGgsXG5cdFx0XHRcdFx0XHRkYXRhRmllbGQsXG5cdFx0XHRcdFx0XHRjb2x1bW5zVG9CZUNyZWF0ZWQsXG5cdFx0XHRcdFx0XHRyZWxhdGl2ZVBhdGgsXG5cdFx0XHRcdFx0XHRyZXN0cmljdGlvbnNPblByb3BlcnRpZXNcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHRcdC8vIENyZWF0ZSBjb2x1bW5zIGZvciBhZGRpdGlvbmFsIHByb3BlcnRpZXMgaWRlbnRpZmllZCBmb3IgQUxQIHVzZSBjYXNlLlxuXHRcdFx0YWRkaXRpb25hbFByb3BlcnR5TmFtZXMuZm9yRWFjaCgoYWRkaXRpb25hbFByb3BlcnR5TmFtZSkgPT4ge1xuXHRcdFx0XHQvLyBJbnRlbnRpb25hbCBvdmVyd3JpdGUgYXMgd2UgcmVxdWlyZSBvbmx5IG9uZSBuZXcgUHJvcGVydHlJbmZvIGZvciBhIHJlbGF0ZWQgUHJvcGVydHkuXG5cdFx0XHRcdGNvbHVtbnNUb0JlQ3JlYXRlZFthZGRpdGlvbmFsUHJvcGVydHlOYW1lXSA9IHJlbGF0ZWRQcm9wZXJ0aWVzSW5mby5hZGRpdGlvbmFsUHJvcGVydGllc1thZGRpdGlvbmFsUHJvcGVydHlOYW1lXTtcblx0XHRcdH0pO1xuXHRcdH0pO1xuXHR9XG5cdC8vIEdldCBjb2x1bW5zIGZyb20gdGhlIFByb3BlcnRpZXMgb2YgRW50aXR5VHlwZVxuXHRyZXR1cm4gZ2V0Q29sdW1uc0Zyb21FbnRpdHlUeXBlKFxuXHRcdGNvbHVtbnNUb0JlQ3JlYXRlZCxcblx0XHRlbnRpdHlUeXBlLFxuXHRcdGFubm90YXRpb25Db2x1bW5zLFxuXHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0dGFibGVUeXBlLFxuXHRcdHRhYmxlQ3JlYXRpb25Nb2RlLFxuXHRcdGRpc3BsYXlNb2RlT2ZEZXNjcmlwdGlvblByb3BlcnRpZXNNYXAsXG5cdFx0cmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzXG5cdCk7XG59O1xuLyoqXG4gKiBHZXRzIHRoZSBwcm9wZXJ0eSBuYW1lcyBmcm9tIHRoZSBtYW5pZmVzdCBhbmQgY2hlY2tzIGFnYWluc3QgZXhpc3RpbmcgcHJvcGVydGllcyBhbHJlYWR5IGFkZGVkIGJ5IGFubm90YXRpb25zLlxuICogSWYgYSBub3QgeWV0IHN0b3JlZCBwcm9wZXJ0eSBpcyBmb3VuZCBpdCBhZGRzIGl0IGZvciBzb3J0aW5nIGFuZCBmaWx0ZXJpbmcgb25seSB0byB0aGUgYW5ub3RhdGlvbkNvbHVtbnMuXG4gKiBAcGFyYW0gcHJvcGVydGllc1xuICogQHBhcmFtIGFubm90YXRpb25Db2x1bW5zXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dFxuICogQHBhcmFtIGVudGl0eVR5cGVcbiAqIEByZXR1cm5zIFRoZSBjb2x1bW5zIGZyb20gdGhlIGFubm90YXRpb25zXG4gKi9cbmNvbnN0IF9nZXRQcm9wZXJ0eU5hbWVzID0gZnVuY3Rpb24gKFxuXHRwcm9wZXJ0aWVzOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCxcblx0YW5ub3RhdGlvbkNvbHVtbnM6IEFubm90YXRpb25UYWJsZUNvbHVtbltdLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sXG5cdGVudGl0eVR5cGU6IEVudGl0eVR5cGVcbik6IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHtcblx0bGV0IG1hdGNoZWRQcm9wZXJ0aWVzOiBzdHJpbmdbXSB8IHVuZGVmaW5lZDtcblx0aWYgKHByb3BlcnRpZXMpIHtcblx0XHRtYXRjaGVkUHJvcGVydGllcyA9IHByb3BlcnRpZXMubWFwKGZ1bmN0aW9uIChwcm9wZXJ0eVBhdGgpIHtcblx0XHRcdGNvbnN0IGFubm90YXRpb25Db2x1bW4gPSBhbm5vdGF0aW9uQ29sdW1ucy5maW5kKGZ1bmN0aW9uIChhbm5vdGF0aW9uQ29sdW1uKSB7XG5cdFx0XHRcdHJldHVybiBhbm5vdGF0aW9uQ29sdW1uLnJlbGF0aXZlUGF0aCA9PT0gcHJvcGVydHlQYXRoICYmIGFubm90YXRpb25Db2x1bW4ucHJvcGVydHlJbmZvcyA9PT0gdW5kZWZpbmVkO1xuXHRcdFx0fSk7XG5cdFx0XHRpZiAoYW5ub3RhdGlvbkNvbHVtbikge1xuXHRcdFx0XHRyZXR1cm4gYW5ub3RhdGlvbkNvbHVtbi5uYW1lO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3QgcmVsYXRlZENvbHVtbnMgPSBfY3JlYXRlUmVsYXRlZENvbHVtbnMoXG5cdFx0XHRcdFx0eyBbcHJvcGVydHlQYXRoXTogZW50aXR5VHlwZS5yZXNvbHZlUGF0aChwcm9wZXJ0eVBhdGgpIH0sXG5cdFx0XHRcdFx0YW5ub3RhdGlvbkNvbHVtbnMsXG5cdFx0XHRcdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHRcdFx0XHRlbnRpdHlUeXBlLFxuXHRcdFx0XHRcdHt9XG5cdFx0XHRcdCk7XG5cdFx0XHRcdGFubm90YXRpb25Db2x1bW5zLnB1c2gocmVsYXRlZENvbHVtbnNbMF0pO1xuXHRcdFx0XHRyZXR1cm4gcmVsYXRlZENvbHVtbnNbMF0ubmFtZTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXHRyZXR1cm4gbWF0Y2hlZFByb3BlcnRpZXM7XG59O1xuXG4vKipcbiAqIERldGVybWluZXMgaWYgdGhlIGZpZWxkIGdyb3VwIGhhcyB0byBiZSBmbGFnZ2VkIGFzIHJlcXVpcmVkLlxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGNvbnZlcnRlciBjb250ZXh0XG4gKiBAcGFyYW0gZmllbGRHcm91cCBUaGUgZmllbGRHcm91cCBiZWluZyBwcm9jZXNzZWRcbiAqIEBwYXJhbSB0YWJsZUNyZWF0aW9uTW9kZSBUaGUgY3JlYXRpb24gbW9kZSBvZiB0aGUgdW5kZXJseWluZyB0YWJsZVxuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgZmllbGRHcm91cCBpcyByZXF1aXJlZC5cbiAqL1xuY29uc3QgaXNSZXF1aXJlZEZpZWxkR3JvdXAgPSBmdW5jdGlvbiAoXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pixcblx0ZmllbGRHcm91cDogRmllbGRHcm91cCxcblx0dGFibGVDcmVhdGlvbk1vZGU6IENyZWF0aW9uTW9kZVxuKTogYm9vbGVhbiB7XG5cdGNvbnN0IGZpZWxkR3JvdXBEYXRhID0gZmllbGRHcm91cC5EYXRhO1xuXHRyZXR1cm4gZmllbGRHcm91cERhdGEuc29tZShmdW5jdGlvbiAoaXRlbSkge1xuXHRcdC8vIHdlIGV4Y2x1ZGUgYm9vbGVhbiB0eXBlLCB0aGUgZW5kLXVzZXIgbWF5IHdhbnQgdG8ga2VlcCB0aGUgdW5kZXJseWluZyBjaGVjayBib3ggZW1wdHkgb24gcHVycG9zZVxuXHRcdGlmIChpc0RhdGFGaWVsZChpdGVtKSAmJiBpdGVtPy5WYWx1ZT8uJHRhcmdldC50eXBlICE9PSBcIkVkbS5Cb29sZWFuXCIpIHtcblx0XHRcdHJldHVybiAoXG5cdFx0XHRcdGlzU3RhdGljYWxseU1hbmRhdG9yeShpdGVtKSB8fFxuXHRcdFx0XHQodGFibGVDcmVhdGlvbk1vZGUgPT09IENyZWF0aW9uTW9kZS5JbmxpbmVDcmVhdGlvblJvd3MgJiZcblx0XHRcdFx0XHRpc0Fubm90YXRlZFJlcXVpcmVkUHJvcGVydHkoaXRlbS5WYWx1ZS4kdGFyZ2V0LmZ1bGx5UXVhbGlmaWVkTmFtZSwgY29udmVydGVyQ29udGV4dCkpXG5cdFx0XHQpO1xuXHRcdH1cblx0fSk7XG59O1xuXG4vKipcbiAqIERldGVybWluZXMgaWYgdGhlIGRhdGFGaWVsZEZvckFubm90YXRpb24gaGFzIHRvIGJlIGZsYWdnZWQgYXMgcmVxdWlyZWQuXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCBUaGUgY29udmVydGVyIGNvbnRleHRcbiAqIEBwYXJhbSBkYXRhRmllbGRGb3JBbm5vdGF0aW9uIFRoZSBwcm9wZXJ0eSBiZWluZyBwcm9jZXNzZWRcbiAqIEBwYXJhbSB0YWJsZUNyZWF0aW9uTW9kZSBUaGUgY3JlYXRpb24gbW9kZSBvZiB0aGUgdW5kZXJseWluZyB0YWJsZVxuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgcHJvcGVydHkgaXMgcmVxdWlyZWQuXG4gKi9cbmNvbnN0IGlzUmVxdWlyZWREYXRhRmllbGRGb3JBbm5vdGF0aW9uID0gZnVuY3Rpb24gKFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sXG5cdGRhdGFGaWVsZEZvckFubm90YXRpb246IERhdGFGaWVsZEZvckFubm90YXRpb24sXG5cdHRhYmxlQ3JlYXRpb25Nb2RlOiBDcmVhdGlvbk1vZGVcbik6IGJvb2xlYW4ge1xuXHRjb25zdCBkYXRhRmllbGRUYXJnZXQgPSBkYXRhRmllbGRGb3JBbm5vdGF0aW9uLlRhcmdldC4kdGFyZ2V0O1xuXHRjb25zdCBEYXRhRmllbGRGb3JBbm5vdGF0aW9uRmllbGRDb250cm9sTm90TWFuZGF0b3J5ID0gaGFzRmllbGRDb250cm9sTm90TWFuZGF0b3J5KGRhdGFGaWVsZEZvckFubm90YXRpb24pO1xuXHQvLyBDaGVjayBpZiB0aGUgRGF0YUZpZWxkRm9yQW5ub3RhdGlvbiBwb2ludHMgdG8gYSBGaWVsZEdyb3VwXG5cdGlmIChoYXNGaWVsZEdyb3VwVGFyZ2V0KGRhdGFGaWVsZEZvckFubm90YXRpb24pKSB7XG5cdFx0aWYgKGlzUmVxdWlyZWRGaWVsZEdyb3VwKGNvbnZlcnRlckNvbnRleHQsIGRhdGFGaWVsZFRhcmdldCBhcyBGaWVsZEdyb3VwLCB0YWJsZUNyZWF0aW9uTW9kZSkpIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblx0XHRjb25zdCBmaWVsZEdyb3VwRGF0YSA9IChkYXRhRmllbGRUYXJnZXQgYXMgRmllbGRHcm91cCkuRGF0YTtcblx0XHRyZXR1cm4gZmllbGRHcm91cERhdGEuc29tZSgoaW5uZXJEYXRhRmllbGQ6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMpID0+IHtcblx0XHRcdHJldHVybiBpc1JlcXVpcmVkQ29sdW1uKGNvbnZlcnRlckNvbnRleHQsIGlubmVyRGF0YUZpZWxkLCB0YWJsZUNyZWF0aW9uTW9kZSk7XG5cdFx0fSk7XG5cdH1cblx0LypJZiB0aGUgdW5kZXJseWluZyBkYXRhcG9pbnQgaXMgYSByYXRpbmcgaW5kaWNhdG9yLCB0aGUgZW5kLXVzZXIgbWF5IHdhbnQgdG8ga2VlcCB0aGUgcmF0aW5nIGVtcHR5ICh2YWx1ZSAwKSBvbiBwdXJwb3NlLlxuXHRCZXNpZGVzLCBjdXJyZW50bHksIG9ubHkgYSBmaWVsZENvbnRyb2wgc2V0IG9uIGEgZGF0YUZpZWxkRm9yQW5ub3RhdGlvbiBwb2ludGluZyB0byBhIGRhdGFQb2ludCBoYXMgYW4gaW5mbHVlbmNlIGluIHRoZSB0YWJsZS5cblx0QWNjb3JkaW5nbHksIGlmIGEgZGF0YXBvaW50IGNvbWVzIGZyb20gYSBkYXRhRmllbGRGb3JBbm5vdGF0aW9uIHdpdGggYSBmaWVsZENvbnRyb2wgc2V0IGFzIG5vdCBtYW5kYXRvcnksIHRoaXMgZGF0YVBvaW50IG11c3Qgbm90IGJlIGZsYWdnZWQgYXMgXCJyZXF1aXJlZFwiKi9cblx0aWYgKGhhc0RhdGFQb2ludFRhcmdldChkYXRhRmllbGRGb3JBbm5vdGF0aW9uKSAmJiAoZGF0YUZpZWxkVGFyZ2V0IGFzIERhdGFQb2ludCkuVmlzdWFsaXphdGlvbiAhPT0gXCJVSS5WaXN1YWxpemF0aW9uVHlwZS9SYXRpbmdcIikge1xuXHRcdGlmIChEYXRhRmllbGRGb3JBbm5vdGF0aW9uRmllbGRDb250cm9sTm90TWFuZGF0b3J5KSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHRcdGlmIChpc1N0YXRpY2FsbHlNYW5kYXRvcnkoZGF0YUZpZWxkRm9yQW5ub3RhdGlvbikpIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblx0XHRyZXR1cm4gaXNSZXF1aXJlZERhdGFQb2ludChjb252ZXJ0ZXJDb250ZXh0LCBkYXRhRmllbGRUYXJnZXQgYXMgRGF0YVBvaW50LCB0YWJsZUNyZWF0aW9uTW9kZSk7XG5cdH1cblx0cmV0dXJuIGZhbHNlO1xufTtcblxuLyoqXG4gKiBEZXRlcm1pbmVzIGlmIHRoZSBwcm9wZXJ0eSBoYXMgdG8gYmUgZmxhZ2dlZCBhcyByZXF1aXJlZC5cbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHBhcmFtIHByb3BlcnR5IFRoZSBwcm9wZXJ0eSBiZWluZyBwcm9jZXNzZWRcbiAqIEBwYXJhbSB0YWJsZUNyZWF0aW9uTW9kZSBUaGUgY3JlYXRpb24gbW9kZSBvZiB0aGUgdW5kZXJseWluZyB0YWJsZVxuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgcHJvcGVydHkgaXMgcmVxdWlyZWQuXG4gKi9cbmNvbnN0IGlzUmVxdWlyZWRQcm9wZXJ0eSA9IGZ1bmN0aW9uIChcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+LFxuXHRwcm9wZXJ0eTogUHJvcGVydHksXG5cdHRhYmxlQ3JlYXRpb25Nb2RlOiBDcmVhdGlvbk1vZGVcbik6IGJvb2xlYW4ge1xuXHRyZXR1cm4gKFxuXHRcdHByb3BlcnR5LnR5cGUgIT09IFwiRWRtLkJvb2xlYW5cIiAmJlxuXHRcdCFpc1JhdGluZ1Zpc3VhbGl6YXRpb25Gcm9tRGF0YUZpZWxkRGVmYXVsdChwcm9wZXJ0eSkgJiZcblx0XHQoaXNTdGF0aWNhbGx5TWFuZGF0b3J5KHByb3BlcnR5KSB8fFxuXHRcdFx0KHRhYmxlQ3JlYXRpb25Nb2RlID09PSBDcmVhdGlvbk1vZGUuSW5saW5lQ3JlYXRpb25Sb3dzICYmXG5cdFx0XHRcdGlzQW5ub3RhdGVkUmVxdWlyZWRQcm9wZXJ0eShwcm9wZXJ0eS5mdWxseVF1YWxpZmllZE5hbWUsIGNvbnZlcnRlckNvbnRleHQpKSlcblx0KTtcbn07XG5cbi8qKlxuICogRGV0ZXJtaW5lcyBpZiB0aGUgZGF0YVBvaW50IGhhcyB0byBiZSBmbGFnZ2VkIGFzIHJlcXVpcmVkLlxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGNvbnZlcnRlciBjb250ZXh0XG4gKiBAcGFyYW0gZGF0YVBvaW50IFRoZSBkYXRhUG9pbnQgYmVpbmcgcHJvY2Vzc2VkXG4gKiBAcGFyYW0gdGFibGVDcmVhdGlvbk1vZGUgVGhlIGNyZWF0aW9uIG1vZGUgb2YgdGhlIHVuZGVybHlpbmcgdGFibGVcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGRhdGFQb2ludCBpcyByZXF1aXJlZC5cbiAqL1xuY29uc3QgaXNSZXF1aXJlZERhdGFQb2ludCA9IGZ1bmN0aW9uIChcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+LFxuXHRkYXRhUG9pbnQ6IERhdGFQb2ludCxcblx0dGFibGVDcmVhdGlvbk1vZGU6IENyZWF0aW9uTW9kZVxuKTogYm9vbGVhbiB7XG5cdHJldHVybiAoXG5cdFx0aXNTdGF0aWNhbGx5TWFuZGF0b3J5KGRhdGFQb2ludCkgfHxcblx0XHQodGFibGVDcmVhdGlvbk1vZGUgPT09IENyZWF0aW9uTW9kZS5JbmxpbmVDcmVhdGlvblJvd3MgJiZcblx0XHRcdGlzQW5ub3RhdGVkUmVxdWlyZWRQcm9wZXJ0eShkYXRhUG9pbnQuVmFsdWUuJHRhcmdldC5mdWxseVF1YWxpZmllZE5hbWUsIGNvbnZlcnRlckNvbnRleHQpKVxuXHQpO1xufTtcblxuLyoqXG4gKiBEZXRlcm1pbmVzIGlmIHRoZSB1bmRlcmx5aW5nIGNvbHVtbiBoYXMgdG8gYmUgZmxhZ2dlZCBhcyByZXF1aXJlZC5cbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IGJlaW5nIHByb2Nlc3NlZFxuICogQHBhcmFtIHRhYmxlQ3JlYXRpb25Nb2RlIFRoZSBjcmVhdGlvbiBtb2RlIG9mIHRoZSB1bmRlcmx5aW5nIHRhYmxlXG4gKiBAcmV0dXJucyBUaGUgYmluZGluZyBleHByZXNzaW9uIGZvciB0aGUgJ3JlcXVpcmVkJyBwcm9wZXJ0eSBvZiB0aGUgdGFibGUgY29sdW1uLlxuICovXG5jb25zdCBpc1JlcXVpcmVkQ29sdW1uID0gZnVuY3Rpb24gKFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sXG5cdHRhcmdldDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyB8IFByb3BlcnR5LFxuXHR0YWJsZUNyZWF0aW9uTW9kZT86IENyZWF0aW9uTW9kZVxuKTogQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24ge1xuXHRjb25zdCBjcmVhdGlvbk1vZGUgPSB0YWJsZUNyZWF0aW9uTW9kZSB8fCBDcmVhdGlvbk1vZGUuSW5saW5lO1xuXHRpZiAoXG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSA9PT0gVGVtcGxhdGVUeXBlLkxpc3RSZXBvcnQgfHxcblx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldFRlbXBsYXRlVHlwZSgpID09PSBUZW1wbGF0ZVR5cGUuQW5hbHl0aWNhbExpc3RQYWdlXG5cdCkge1xuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblx0aWYgKGlzUHJvcGVydHkodGFyZ2V0KSkge1xuXHRcdHJldHVybiBpc1JlcXVpcmVkUHJvcGVydHkoY29udmVydGVyQ29udGV4dCwgdGFyZ2V0LCBjcmVhdGlvbk1vZGUpID8gY29tcGlsZUV4cHJlc3Npb24oVUkuSXNFZGl0YWJsZSkgOiB1bmRlZmluZWQ7XG5cdH1cblx0Ly8gQ2hlY2sgaWYgdGhlIGRhdGFGaWVsZCBpcyBvZiB0eXBlIERhdGFGaWVsZEZvckFubm90YXRpb25cblx0aWYgKGlzRGF0YUZpZWxkRm9yQW5ub3RhdGlvbih0YXJnZXQpKSB7XG5cdFx0cmV0dXJuIGlzUmVxdWlyZWREYXRhRmllbGRGb3JBbm5vdGF0aW9uKGNvbnZlcnRlckNvbnRleHQsIHRhcmdldCwgY3JlYXRpb25Nb2RlKSA/IGNvbXBpbGVFeHByZXNzaW9uKFVJLklzRWRpdGFibGUpIDogdW5kZWZpbmVkO1xuXHR9XG5cdC8vSWYgdGhlIHVuZGVybHlpbmcgcHJvcGVydHkgaXMgYSBib29sZWFuLCB0aGUgZW5kLXVzZXIgbWF5IHdhbnQgdG8ga2VlcCB0aGUgY2hlY2sgYm94IGVtcHR5IG9uIHB1cnBvc2Vcblx0aWYgKGlzRGF0YUZpZWxkKHRhcmdldCkgJiYgdGFyZ2V0LlZhbHVlPy4kdGFyZ2V0Py50eXBlICE9PSBcIkVkbS5Cb29sZWFuXCIpIHtcblx0XHRyZXR1cm4gaXNTdGF0aWNhbGx5TWFuZGF0b3J5KHRhcmdldCkgfHxcblx0XHRcdChjcmVhdGlvbk1vZGUgPT09IENyZWF0aW9uTW9kZS5JbmxpbmVDcmVhdGlvblJvd3MgJiZcblx0XHRcdFx0aXNBbm5vdGF0ZWRSZXF1aXJlZFByb3BlcnR5KHRhcmdldC5WYWx1ZS4kdGFyZ2V0LmZ1bGx5UXVhbGlmaWVkTmFtZSwgY29udmVydGVyQ29udGV4dCkpXG5cdFx0XHQ/IGNvbXBpbGVFeHByZXNzaW9uKFVJLklzRWRpdGFibGUpXG5cdFx0XHQ6IHVuZGVmaW5lZDtcblx0fVxuXHRyZXR1cm4gdW5kZWZpbmVkO1xufTtcbmNvbnN0IF9hcHBlbmRDdXN0b21UZW1wbGF0ZSA9IGZ1bmN0aW9uIChwcm9wZXJ0aWVzOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCwgZXhwb3J0UHJvcGVydGllczogc3RyaW5nW10gfCB1bmRlZmluZWQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRpZiAoZXhwb3J0UHJvcGVydGllcz8ubGVuZ3RoKSB7XG5cdFx0cHJvcGVydGllcyA9IGV4cG9ydFByb3BlcnRpZXM7XG5cdH1cblx0aWYgKHByb3BlcnRpZXMpIHtcblx0XHRyZXR1cm4gcHJvcGVydGllc1xuXHRcdFx0Lm1hcCgocHJvcGVydHkpID0+IHtcblx0XHRcdFx0cmV0dXJuIGB7JHtwcm9wZXJ0aWVzIS5pbmRleE9mKHByb3BlcnR5KX19YDtcblx0XHRcdH0pXG5cdFx0XHQuam9pbihgJHtcIlxcblwifWApO1xuXHR9XG5cdHJldHVybiB1bmRlZmluZWQ7XG59O1xuLyoqXG4gKiBSZXR1cm5zIHRhYmxlIGNvbHVtbiBkZWZpbml0aW9ucyBmcm9tIG1hbmlmZXN0LlxuICpcbiAqIFRoZXNlIG1heSBiZSBjdXN0b20gY29sdW1ucyBkZWZpbmVkIGluIHRoZSBtYW5pZmVzdCwgc2xvdCBjb2x1bW5zIGNvbWluZyB0aHJvdWdoXG4gKiBhIGJ1aWxkaW5nIGJsb2NrLCBvciBhbm5vdGF0aW9uIGNvbHVtbnMgdG8gb3ZlcndyaXRlIGFubm90YXRpb24tYmFzZWQgY29sdW1ucy5cbiAqIEBwYXJhbSBjb2x1bW5zXG4gKiBAcGFyYW0gYW5ub3RhdGlvbkNvbHVtbnNcbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcGFyYW0gZW50aXR5VHlwZVxuICogQHJldHVybnMgVGhlIGNvbHVtbnMgZnJvbSB0aGUgbWFuaWZlc3RcbiAqL1xuY29uc3QgZ2V0Q29sdW1uc0Zyb21NYW5pZmVzdCA9IGZ1bmN0aW9uIChcblx0Y29sdW1uczogUmVjb3JkPHN0cmluZywgQ3VzdG9tRGVmaW5lZFRhYmxlQ29sdW1uIHwgQ3VzdG9tRGVmaW5lZFRhYmxlQ29sdW1uRm9yT3ZlcnJpZGU+LFxuXHRhbm5vdGF0aW9uQ29sdW1uczogQW5ub3RhdGlvblRhYmxlQ29sdW1uW10sXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pixcblx0ZW50aXR5VHlwZTogRW50aXR5VHlwZVxuKTogUmVjb3JkPHN0cmluZywgTWFuaWZlc3RDb2x1bW4+IHtcblx0Y29uc3QgaW50ZXJuYWxDb2x1bW5zOiBSZWNvcmQ8c3RyaW5nLCBNYW5pZmVzdENvbHVtbj4gPSB7fTtcblx0ZnVuY3Rpb24gaXNDb2x1bW5PdmVycmlkZShcblx0XHRjb2x1bW46IEN1c3RvbURlZmluZWRUYWJsZUNvbHVtbiB8IEN1c3RvbURlZmluZWRUYWJsZUNvbHVtbkZvck92ZXJyaWRlLFxuXHRcdGtleTogc3RyaW5nXG5cdCk6IGNvbHVtbiBpcyBDdXN0b21EZWZpbmVkVGFibGVDb2x1bW5Gb3JPdmVycmlkZSB7XG5cdFx0cmV0dXJuIGFubm90YXRpb25Db2x1bW5zLnNvbWUoKGFubm90YXRpb25Db2x1bW4pID0+IGFubm90YXRpb25Db2x1bW4ua2V5ID09PSBrZXkpO1xuXHR9XG5cdGZ1bmN0aW9uIGlzU2xvdENvbHVtbihtYW5pZmVzdENvbHVtbjogQ3VzdG9tRGVmaW5lZFRhYmxlQ29sdW1uKTogbWFuaWZlc3RDb2x1bW4gaXMgRnJhZ21lbnREZWZpbmVkU2xvdENvbHVtbiB7XG5cdFx0cmV0dXJuIG1hbmlmZXN0Q29sdW1uLnR5cGUgPT09IENvbHVtblR5cGUuU2xvdDtcblx0fVxuXHRmdW5jdGlvbiBpc0N1c3RvbUNvbHVtbihtYW5pZmVzdENvbHVtbjogQ3VzdG9tRGVmaW5lZFRhYmxlQ29sdW1uKTogbWFuaWZlc3RDb2x1bW4gaXMgTWFuaWZlc3REZWZpbmVkQ3VzdG9tQ29sdW1uIHtcblx0XHRyZXR1cm4gbWFuaWZlc3RDb2x1bW4udHlwZSA9PT0gdW5kZWZpbmVkICYmICEhbWFuaWZlc3RDb2x1bW4udGVtcGxhdGU7XG5cdH1cblx0ZnVuY3Rpb24gX3VwZGF0ZUxpbmtlZFByb3BlcnRpZXNPbkN1c3RvbUNvbHVtbnMocHJvcGVydHlJbmZvczogc3RyaW5nW10sIGFubm90YXRpb25UYWJsZUNvbHVtbnM6IEFubm90YXRpb25UYWJsZUNvbHVtbltdKTogdm9pZCB7XG5cdFx0Y29uc3QgcmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzID0gZ2V0UmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzKGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0KCkpO1xuXHRcdHByb3BlcnR5SW5mb3MuZm9yRWFjaCgocHJvcGVydHkpID0+IHtcblx0XHRcdGFubm90YXRpb25UYWJsZUNvbHVtbnMuZm9yRWFjaCgocHJvcCkgPT4ge1xuXHRcdFx0XHRpZiAocHJvcC5uYW1lID09PSBwcm9wZXJ0eSkge1xuXHRcdFx0XHRcdHByb3Auc29ydGFibGUgPSAhcmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzLm5vblNvcnRhYmxlUHJvcGVydGllcy5pbmNsdWRlcyhwcm9wZXJ0eS5yZXBsYWNlKFwiUHJvcGVydHk6OlwiLCBcIlwiKSk7XG5cdFx0XHRcdFx0cHJvcC5pc0dyb3VwYWJsZSA9IHByb3Auc29ydGFibGU7XG5cdFx0XHRcdFx0cHJvcC5maWx0ZXJhYmxlID0gIXJlc3RyaWN0aW9uc09uUHJvcGVydGllcy5ub25GaWx0ZXJhYmxlUHJvcGVydGllcy5pbmNsdWRlcyhwcm9wZXJ0eS5yZXBsYWNlKFwiUHJvcGVydHk6OlwiLCBcIlwiKSk7XG5cdFx0XHRcdFx0cHJvcC5pc1BhcnRPZkN1c3RvbUNvbHVtbiA9IHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH0pO1xuXHR9XG5cdGZvciAoY29uc3Qga2V5IGluIGNvbHVtbnMpIHtcblx0XHRjb25zdCBtYW5pZmVzdENvbHVtbiA9IGNvbHVtbnNba2V5XTtcblx0XHRLZXlIZWxwZXIudmFsaWRhdGVLZXkoa2V5KTtcblx0XHQvLyBCYXNlVGFibGVDb2x1bW5cblx0XHRjb25zdCBiYXNlVGFibGVDb2x1bW4gPSB7XG5cdFx0XHRrZXk6IGtleSxcblx0XHRcdHdpZHRoSW5jbHVkaW5nQ29sdW1uSGVhZGVyOiBtYW5pZmVzdENvbHVtbi53aWR0aEluY2x1ZGluZ0NvbHVtbkhlYWRlcixcblx0XHRcdHdpZHRoOiBtYW5pZmVzdENvbHVtbi53aWR0aCB8fCB1bmRlZmluZWQsXG5cdFx0XHRwb3NpdGlvbjoge1xuXHRcdFx0XHRhbmNob3I6IG1hbmlmZXN0Q29sdW1uLnBvc2l0aW9uPy5hbmNob3IsXG5cdFx0XHRcdHBsYWNlbWVudDogbWFuaWZlc3RDb2x1bW4ucG9zaXRpb24gPT09IHVuZGVmaW5lZCA/IFBsYWNlbWVudC5BZnRlciA6IG1hbmlmZXN0Q29sdW1uLnBvc2l0aW9uLnBsYWNlbWVudFxuXHRcdFx0fSxcblx0XHRcdGNhc2VTZW5zaXRpdmU6IGlzRmlsdGVyaW5nQ2FzZVNlbnNpdGl2ZShjb252ZXJ0ZXJDb250ZXh0KVxuXHRcdH07XG5cdFx0aWYgKGlzQ29sdW1uT3ZlcnJpZGUobWFuaWZlc3RDb2x1bW4sIGtleSkpIHtcblx0XHRcdGNvbnN0IHByb3BlcnRpZXNUb092ZXJ3cml0ZUFubm90YXRpb25Db2x1bW46IEN1c3RvbUVsZW1lbnQ8QW5ub3RhdGlvblRhYmxlQ29sdW1uRm9yT3ZlcnJpZGU+ID0ge1xuXHRcdFx0XHQuLi5iYXNlVGFibGVDb2x1bW4sXG5cdFx0XHRcdGltcG9ydGFuY2U6IG1hbmlmZXN0Q29sdW1uPy5pbXBvcnRhbmNlLFxuXHRcdFx0XHRob3Jpem9udGFsQWxpZ246IG1hbmlmZXN0Q29sdW1uPy5ob3Jpem9udGFsQWxpZ24sXG5cdFx0XHRcdGF2YWlsYWJpbGl0eTogbWFuaWZlc3RDb2x1bW4/LmF2YWlsYWJpbGl0eSxcblx0XHRcdFx0dHlwZTogQ29sdW1uVHlwZS5Bbm5vdGF0aW9uLFxuXHRcdFx0XHRpc05hdmlnYWJsZTogdW5kZWZpbmVkLFxuXHRcdFx0XHRzZXR0aW5nczogbWFuaWZlc3RDb2x1bW4uc2V0dGluZ3MsXG5cdFx0XHRcdGZvcm1hdE9wdGlvbnM6IF9nZXREZWZhdWx0Rm9ybWF0T3B0aW9uc0ZvclRhYmxlKG1hbmlmZXN0Q29sdW1uLmZvcm1hdE9wdGlvbnMpLFxuXHRcdFx0XHRleHBvcnRTZXR0aW5nczogZ2V0Q3VzdG9tRXhwb3J0U2V0dGluZ3MoXG5cdFx0XHRcdFx0bWFuaWZlc3RDb2x1bW4/LmV4cG9ydFNldHRpbmdzLFxuXHRcdFx0XHRcdGFubm90YXRpb25Db2x1bW5zLFxuXHRcdFx0XHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0XHRcdFx0ZW50aXR5VHlwZSxcblx0XHRcdFx0XHR1bmRlZmluZWQsXG5cdFx0XHRcdFx0a2V5XG5cdFx0XHRcdClcblx0XHRcdH07XG5cdFx0XHRpbnRlcm5hbENvbHVtbnNba2V5XSA9IHByb3BlcnRpZXNUb092ZXJ3cml0ZUFubm90YXRpb25Db2x1bW47XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0IHByb3BlcnR5SW5mb3M6IHN0cmluZ1tdIHwgdW5kZWZpbmVkID0gX2dldFByb3BlcnR5TmFtZXMoXG5cdFx0XHRcdG1hbmlmZXN0Q29sdW1uLnByb3BlcnRpZXMsXG5cdFx0XHRcdGFubm90YXRpb25Db2x1bW5zLFxuXHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdFx0XHRlbnRpdHlUeXBlXG5cdFx0XHQpO1xuXHRcdFx0Y29uc3QgdG9vbHRpcFRleHQgPSBjb252ZXJ0ZXJDb250ZXh0LmZldGNoVGV4dEZyb21NZXRhTW9kZWwobWFuaWZlc3RDb2x1bW4udG9vbHRpcCksXG5cdFx0XHRcdGhlYWRlclRleHQgPSBjb252ZXJ0ZXJDb250ZXh0LmZldGNoVGV4dEZyb21NZXRhTW9kZWwobWFuaWZlc3RDb2x1bW4uaGVhZGVyKTtcblxuXHRcdFx0Y29uc3QgY3VzdG9tQ29sdW1uRXhwb3J0U2V0dGluZ3M6IENvbHVtbkV4cG9ydFNldHRpbmdzIHwgbnVsbCA9IHByb3BlcnR5SW5mb3Ncblx0XHRcdFx0PyBnZXRDdXN0b21FeHBvcnRTZXR0aW5ncyhtYW5pZmVzdENvbHVtbj8uZXhwb3J0U2V0dGluZ3MsIGFubm90YXRpb25Db2x1bW5zLCBjb252ZXJ0ZXJDb250ZXh0LCBlbnRpdHlUeXBlLCBwcm9wZXJ0eUluZm9zKVxuXHRcdFx0XHQ6IG51bGw7XG5cdFx0XHRjb25zdCBiYXNlTWFuaWZlc3RDb2x1bW4gPSB7XG5cdFx0XHRcdC4uLmJhc2VUYWJsZUNvbHVtbixcblx0XHRcdFx0aGVhZGVyOiBoZWFkZXJUZXh0LFxuXHRcdFx0XHRpbXBvcnRhbmNlOiBtYW5pZmVzdENvbHVtbj8uaW1wb3J0YW5jZSB8fCBJbXBvcnRhbmNlLk5vbmUsXG5cdFx0XHRcdGhvcml6b250YWxBbGlnbjogbWFuaWZlc3RDb2x1bW4/Lmhvcml6b250YWxBbGlnbiB8fCBIb3Jpem9udGFsQWxpZ24uQmVnaW4sXG5cdFx0XHRcdGF2YWlsYWJpbGl0eTogbWFuaWZlc3RDb2x1bW4/LmF2YWlsYWJpbGl0eSB8fCBcIkRlZmF1bHRcIixcblx0XHRcdFx0dGVtcGxhdGU6IG1hbmlmZXN0Q29sdW1uLnRlbXBsYXRlLFxuXHRcdFx0XHRwcm9wZXJ0eUluZm9zOiBwcm9wZXJ0eUluZm9zLFxuXHRcdFx0XHRleHBvcnRTZXR0aW5nczogY3VzdG9tQ29sdW1uRXhwb3J0U2V0dGluZ3MsXG5cdFx0XHRcdGlkOiBgQ3VzdG9tQ29sdW1uOjoke2tleX1gLFxuXHRcdFx0XHRuYW1lOiBgQ3VzdG9tQ29sdW1uOjoke2tleX1gLFxuXHRcdFx0XHQvL05lZWRlZCBmb3IgTURDOlxuXHRcdFx0XHRmb3JtYXRPcHRpb25zOiB7IHRleHRMaW5lc0VkaXQ6IDQgfSxcblx0XHRcdFx0aXNHcm91cGFibGU6IGZhbHNlLFxuXHRcdFx0XHRpc05hdmlnYWJsZTogZmFsc2UsXG5cdFx0XHRcdHNvcnRhYmxlOiBmYWxzZSxcblx0XHRcdFx0dmlzdWFsU2V0dGluZ3M6IHsgd2lkdGhDYWxjdWxhdGlvbjogbnVsbCB9LFxuXHRcdFx0XHR0b29sdGlwOiB0b29sdGlwVGV4dCA/IHRvb2x0aXBUZXh0IDogaGVhZGVyVGV4dCxcblx0XHRcdFx0cHJvcGVydGllczogbWFuaWZlc3RDb2x1bW4ucHJvcGVydGllcyxcblx0XHRcdFx0cmVxdWlyZWQ6XG5cdFx0XHRcdFx0bWFuaWZlc3RDb2x1bW4ucmVxdWlyZWQgJiZcblx0XHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldFRlbXBsYXRlVHlwZSgpICE9PSBUZW1wbGF0ZVR5cGUuTGlzdFJlcG9ydCAmJlxuXHRcdFx0XHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0VGVtcGxhdGVUeXBlKCkgIT09IFRlbXBsYXRlVHlwZS5BbmFseXRpY2FsTGlzdFBhZ2Vcblx0XHRcdFx0XHRcdD8gY29tcGlsZUV4cHJlc3Npb24oVUkuSXNFZGl0YWJsZSlcblx0XHRcdFx0XHRcdDogdW5kZWZpbmVkXG5cdFx0XHR9O1xuXHRcdFx0aWYgKHByb3BlcnR5SW5mb3MpIHtcblx0XHRcdFx0X3VwZGF0ZUxpbmtlZFByb3BlcnRpZXNPbkN1c3RvbUNvbHVtbnMocHJvcGVydHlJbmZvcywgYW5ub3RhdGlvbkNvbHVtbnMpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKGlzU2xvdENvbHVtbihtYW5pZmVzdENvbHVtbikpIHtcblx0XHRcdFx0Y29uc3QgY3VzdG9tVGFibGVDb2x1bW46IEN1c3RvbUVsZW1lbnQ8Q3VzdG9tQmFzZWRUYWJsZUNvbHVtbj4gPSB7XG5cdFx0XHRcdFx0Li4uYmFzZU1hbmlmZXN0Q29sdW1uLFxuXHRcdFx0XHRcdHR5cGU6IENvbHVtblR5cGUuU2xvdFxuXHRcdFx0XHR9O1xuXHRcdFx0XHRpbnRlcm5hbENvbHVtbnNba2V5XSA9IGN1c3RvbVRhYmxlQ29sdW1uO1xuXHRcdFx0fSBlbHNlIGlmIChpc0N1c3RvbUNvbHVtbihtYW5pZmVzdENvbHVtbikpIHtcblx0XHRcdFx0Y29uc3QgY3VzdG9tVGFibGVDb2x1bW46IEN1c3RvbUVsZW1lbnQ8Q3VzdG9tQmFzZWRUYWJsZUNvbHVtbj4gPSB7XG5cdFx0XHRcdFx0Li4uYmFzZU1hbmlmZXN0Q29sdW1uLFxuXHRcdFx0XHRcdHR5cGU6IENvbHVtblR5cGUuRGVmYXVsdFxuXHRcdFx0XHR9O1xuXHRcdFx0XHRpbnRlcm5hbENvbHVtbnNba2V5XSA9IGN1c3RvbVRhYmxlQ29sdW1uO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3QgbWVzc2FnZSA9IGBUaGUgYW5ub3RhdGlvbiBjb2x1bW4gJyR7a2V5fScgcmVmZXJlbmNlZCBpbiB0aGUgbWFuaWZlc3QgaXMgbm90IGZvdW5kYDtcblx0XHRcdFx0Y29udmVydGVyQ29udGV4dFxuXHRcdFx0XHRcdC5nZXREaWFnbm9zdGljcygpXG5cdFx0XHRcdFx0LmFkZElzc3VlKFxuXHRcdFx0XHRcdFx0SXNzdWVDYXRlZ29yeS5NYW5pZmVzdCxcblx0XHRcdFx0XHRcdElzc3VlU2V2ZXJpdHkuTG93LFxuXHRcdFx0XHRcdFx0bWVzc2FnZSxcblx0XHRcdFx0XHRcdElzc3VlQ2F0ZWdvcnlUeXBlLFxuXHRcdFx0XHRcdFx0SXNzdWVDYXRlZ29yeVR5cGU/LkFubm90YXRpb25Db2x1bW5zPy5JbnZhbGlkS2V5XG5cdFx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0cmV0dXJuIGludGVybmFsQ29sdW1ucztcbn07XG5cbi8qKlxuICogQWRkcyBjb21wdXRlZCBjb2x1bW5zIHN1Y2ggYXMgdGhlIGRyYWZ0IHN0YXR1cyBhbmQgc2l0dWF0aW9ucyBzdGF0dXMuXG4gKiBAcGFyYW0gdGFibGVDb2x1bW5zIFRoZSB0YWJsZSBjb2x1bW5zIGNvbGxlY3RlZCBzbyBmYXJcbiAqIEBwYXJhbSB2aXN1YWxpemF0aW9uUGF0aFxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHRcbiAqIEByZXR1cm5zIFRoZSBlbnJpY2hlZCBzZXQgb2YgdGFibGUgY29sdW1uc1xuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkQ29tcHV0ZWRDb2x1bW5zKFxuXHR0YWJsZUNvbHVtbnM6IFRhYmxlQ29sdW1uW10sXG5cdHZpc3VhbGl6YXRpb25QYXRoOiBzdHJpbmcsXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0PlxuKTogVGFibGVDb2x1bW5bXSB7XG5cdGNvbnN0IHRhYmxlTWFuaWZlc3RTZXR0aW5nczogVGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24gPSBjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0Q29udHJvbENvbmZpZ3VyYXRpb24odmlzdWFsaXphdGlvblBhdGgpO1xuXHRjb25zdCB0YWJsZVR5cGUgPSBnZXRUYWJsZVR5cGUoY29udmVydGVyQ29udGV4dCwgdGFibGVNYW5pZmVzdFNldHRpbmdzKTtcblxuXHRpZiAoIVtcIkdyaWRUYWJsZVwiLCBcIlRyZWVUYWJsZVwiLCBcIkFuYWx5dGljYWxUYWJsZVwiXS5pbmNsdWRlcyh0YWJsZVR5cGUpKSB7XG5cdFx0Ly8gQ29tcHV0ZWQgY29sdW1ucyBhcmUgbm90IHVzZWQgaW4gUmVzcG9uc2l2ZSB0YWJsZXNcblx0XHRyZXR1cm4gdGFibGVDb2x1bW5zO1xuXHR9XG5cblx0Ly8gSW4gY2FzZSBhIGdyaWQgdGFibGUgb3IgdHJlZSB0YWJsZSBpcyB1c2VkLCB3ZSBkaXNwbGF5IHRoZSBzaXR1YXRpb25zIGluZGljYXRvciBpbiBhIHNlcGFyYXRlIGNvbHVtblxuXHQvLyBzbyB3ZSBoYXZlIHRvIGRpc2FibGUgaXQgaGVyZSB0byBlbnN1cmUsIHRoYXQgdGhlIGZpZWxkIGJ1aWxkaW5nIGJsb2NrXG5cdC8vIGRvZXMgbm90IHJlbmRlciBpdCBpbnRvIHRoZSBJRCBjb2x1bW5cblx0Y29uc3QgY29sdW1uV2l0aFNpdHVhdGlvbnNJbmRpY2F0b3I6IFRhYmxlQ29sdW1uIHwgdW5kZWZpbmVkID0gdGFibGVDb2x1bW5zLmZpbmQoXG5cdFx0KGNvbHVtbikgPT4gY29sdW1uLmZvcm1hdE9wdGlvbnM/Lmhhc1NpdHVhdGlvbnNJbmRpY2F0b3IgIT09IHVuZGVmaW5lZCAmJiBjb2x1bW4uZm9ybWF0T3B0aW9ucz8uaGFzU2l0dWF0aW9uc0luZGljYXRvciA9PT0gdHJ1ZVxuXHQpO1xuXHRpZiAoY29sdW1uV2l0aFNpdHVhdGlvbnNJbmRpY2F0b3I/LmZvcm1hdE9wdGlvbnMpIHtcblx0XHQvLyBTd2l0Y2ggb2ZmIHRoZSBzaXR1YXRpb25zIGluZGljYXRvciBpbiB0aGUgZm91bmQgY29sdW1uXG5cdFx0Y29sdW1uV2l0aFNpdHVhdGlvbnNJbmRpY2F0b3IuZm9ybWF0T3B0aW9ucy5oYXNTaXR1YXRpb25zSW5kaWNhdG9yID0gZmFsc2U7XG5cblx0XHQvLyBJbnNlcnQgYSBzZXBhcmF0ZSBzaXR1YXRpb25zIGluZGljYXRvciBjb2x1bW5cblx0XHRjb25zdCBzaXR1YXRpb25zSW5kaWNhdG9yQ29sdW1uOiBDb21wdXRlZFRhYmxlQ29sdW1uID0ge1xuXHRcdFx0a2V5OiBcInNpdHVhdGlvbnNJbmRpY2F0b3JcIixcblx0XHRcdG5hbWU6IFwic2l0dWF0aW9uc0luZGljYXRvclwiLFxuXHRcdFx0cHJvcGVydHlLZXk6IGNvbHVtbldpdGhTaXR1YXRpb25zSW5kaWNhdG9yLm5hbWUsXG5cdFx0XHRpc1NpdHVhdGlvbnNJbmRpY2F0b3I6IHRydWUsXG5cdFx0XHRhdmFpbGFiaWxpdHk6IFwiRGVmYXVsdFwiLFxuXHRcdFx0bGFiZWw6IFwie3NhcC5mZS5pMThuPkNfU0lUVUFUSU9OU19TVEFUVVNfQ09MVU1OX0xBQkVMX1RPT0xUSVB9XCIsXG5cdFx0XHR0b29sdGlwOiBcIntzYXAuZmUuaTE4bj5DX1NJVFVBVElPTlNfU1RBVFVTX0NPTFVNTl9MQUJFTF9UT09MVElQfVwiLFxuXHRcdFx0dHlwZTogQ29sdW1uVHlwZS5Db21wdXRlZCxcblx0XHRcdGZvcm1hdE9wdGlvbnM6IG51bGwsXG5cdFx0XHRleHBvcnRTZXR0aW5nczogbnVsbCxcblx0XHRcdGNsaXBib2FyZFNldHRpbmdzOiBudWxsLFxuXHRcdFx0cHJvcGVydHlJbmZvczogdW5kZWZpbmVkLFxuXHRcdFx0Y2FzZVNlbnNpdGl2ZTogZmFsc2Vcblx0XHR9O1xuXG5cdFx0Ly8gUGxhY2UgdGhlIGRyYWZ0IHN0YXR1cyBjb2x1bW4gYWZ0ZXIgdGhlIGZpcnN0IHZpc2libGUgY29sdW1uXG5cdFx0Y29uc3QgaW5kZXhPZkZpcnN0VmlzaWJsZUNvbHVtbjogaW50ID0gdGFibGVDb2x1bW5zLmZpbmRJbmRleCgoY29sdW1uKSA9PiBjb2x1bW4uYXZhaWxhYmlsaXR5ICE9PSBcIkhpZGRlblwiKTtcblx0XHR0YWJsZUNvbHVtbnMuc3BsaWNlKGluZGV4T2ZGaXJzdFZpc2libGVDb2x1bW4gKyAxLCAwLCBzaXR1YXRpb25zSW5kaWNhdG9yQ29sdW1uKTtcblx0fVxuXG5cdC8vIEluIGNhc2UgYSBncmlkIHRhYmxlIG9yIHRyZWUgdGFibGUgaXMgdXNlZCwgd2UgZGlzcGxheSB0aGUgZHJhZnQgaW5kaWNhdG9yIGluIGEgc2VwYXJhdGUgY29sdW1uXG5cdC8vIHNvIHdlIGhhdmUgdG8gZGlzYWJsZSBpdCBoZXJlIHRvIGVuc3VyZSwgdGhhdCB0aGUgZmllbGQgYnVpbGRpbmcgYmxvY2tcblx0Ly8gZG9lcyBub3QgcmVuZGVyIGl0IGludG8gdGhlIElEIGNvbHVtblxuXHQvLyBUaGUgYWRkaXRpb25hbCBjb2x1bW4gaXMgb25seSBhZGRlZCBmb3IgdGFibGVzIG9uIGEgTFIgYW5kIGluIGNhc2UgdGVoZSBlbnRpdHkgaXMgZHJhZnQgZW5hYmxlZCFcblx0Y29uc3QgY29sdW1uc1dpdGhEcmFmdEluZGljYXRvcjogVGFibGVDb2x1bW5bXSA9IHRhYmxlQ29sdW1ucy5maWx0ZXIoKGNvbHVtbikgPT4gY29sdW1uLmZvcm1hdE9wdGlvbnM/Lmhhc0RyYWZ0SW5kaWNhdG9yID09PSB0cnVlKTtcblx0aWYgKFxuXHRcdGNvbHVtbnNXaXRoRHJhZnRJbmRpY2F0b3IubGVuZ3RoICYmXG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSA9PT0gVGVtcGxhdGVUeXBlLkxpc3RSZXBvcnQgJiZcblx0XHQoTW9kZWxIZWxwZXIuaXNEcmFmdE5vZGUoY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlTZXQoKSkgfHwgTW9kZWxIZWxwZXIuaXNEcmFmdFJvb3QoY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlTZXQoKSkpXG5cdCkge1xuXHRcdC8vIFN3aXRjaCBvZmYgdGhlIGRyYWZ0IGluZGljYXRvciBpbiB0aGUgZm91bmQgY29sdW1uXG5cdFx0Y29sdW1uc1dpdGhEcmFmdEluZGljYXRvci5mb3JFYWNoKChjb2x1bW5XaXRoRHJhZnRJbmRpY2F0b3I6IFRhYmxlQ29sdW1uKSA9PiB7XG5cdFx0XHRpZiAoY29sdW1uV2l0aERyYWZ0SW5kaWNhdG9yPy5mb3JtYXRPcHRpb25zKSB7XG5cdFx0XHRcdGNvbHVtbldpdGhEcmFmdEluZGljYXRvci5mb3JtYXRPcHRpb25zLmhhc0RyYWZ0SW5kaWNhdG9yID0gZmFsc2U7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHQvLyBJbnNlcnQgYSBzZXBhcmF0ZSBkcmFmdCBpbmRpY2F0b3IgY29sdW1uXG5cdFx0Y29uc3QgZHJhZnRJbmRpY2F0b3JDb2x1bW46IENvbXB1dGVkVGFibGVDb2x1bW4gPSB7XG5cdFx0XHRrZXk6IFwiZHJhZnRTdGF0dXNcIixcblx0XHRcdG5hbWU6IFwiZHJhZnRTdGF0dXNcIixcblx0XHRcdHByb3BlcnR5S2V5OiBjb2x1bW5zV2l0aERyYWZ0SW5kaWNhdG9yWzBdLm5hbWUsXG5cdFx0XHRpc0RyYWZ0SW5kaWNhdG9yOiB0cnVlLFxuXHRcdFx0YXZhaWxhYmlsaXR5OiBcIkRlZmF1bHRcIixcblx0XHRcdGxhYmVsOiBcIntzYXAuZmUuaTE4bj5DX0RSQUZUX1NUQVRVU19DT0xVTU5fTEFCRUxfVE9PTFRJUH1cIixcblx0XHRcdHRvb2x0aXA6IFwie3NhcC5mZS5pMThuPkNfRFJBRlRfU1RBVFVTX0NPTFVNTl9MQUJFTF9UT09MVElQfVwiLFxuXHRcdFx0dHlwZTogQ29sdW1uVHlwZS5Db21wdXRlZCxcblx0XHRcdGZvcm1hdE9wdGlvbnM6IG51bGwsXG5cdFx0XHRleHBvcnRTZXR0aW5nczogbnVsbCxcblx0XHRcdGNhc2VTZW5zaXRpdmU6IGZhbHNlXG5cdFx0fTtcblx0XHRsZXQgY29sdW1uSW5kZXhUb0luc2VydEFmdGVyOiBpbnQgPSAwO1xuXHRcdGlmIChjb2x1bW5XaXRoU2l0dWF0aW9uc0luZGljYXRvcikge1xuXHRcdFx0Ly8gSWYgdGhlcmUncyBhIHNpdHVhdGlvbnMgaW5kaWNhdG9yIGNvbHVtbiwgcGxhY2UgdGhlIGRyYWZ0IHN0YXR1cyBjb2x1bW4gYmVmb3JlIGl0XG5cdFx0XHRjb2x1bW5JbmRleFRvSW5zZXJ0QWZ0ZXIgPVxuXHRcdFx0XHR0YWJsZUNvbHVtbnMuZmluZEluZGV4KChjb2x1bW4pID0+IChjb2x1bW4gYXMgQ29tcHV0ZWRUYWJsZUNvbHVtbikuaXNTaXR1YXRpb25zSW5kaWNhdG9yID09PSB0cnVlKSAtIDE7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIE90aGVyd2lzZSBwbGFjZSB0aGUgZHJhZnQgc3RhdHVzIGNvbHVtbiBhZnRlciB0aGUgZmlyc3QgdmlzaWJsZSBjb2x1bW5cblx0XHRcdGNvbHVtbkluZGV4VG9JbnNlcnRBZnRlciA9IHRhYmxlQ29sdW1ucy5maW5kSW5kZXgoKGNvbHVtbikgPT4gY29sdW1uLmF2YWlsYWJpbGl0eSAhPT0gXCJIaWRkZW5cIik7XG5cdFx0fVxuXHRcdHRhYmxlQ29sdW1ucy5zcGxpY2UoY29sdW1uSW5kZXhUb0luc2VydEFmdGVyICsgMSwgMCwgZHJhZnRJbmRpY2F0b3JDb2x1bW4pO1xuXHR9XG5cblx0cmV0dXJuIHRhYmxlQ29sdW1ucztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFAxM25Nb2RlKFxuXHR2aXN1YWxpemF0aW9uUGF0aDogc3RyaW5nLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sXG5cdHRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uOiBUYWJsZUNvbnRyb2xDb25maWd1cmF0aW9uXG4pOiBUYWJsZVAxM25Nb2RlW10gfCB1bmRlZmluZWQge1xuXHRjb25zdCBtYW5pZmVzdFdyYXBwZXI6IE1hbmlmZXN0V3JhcHBlciA9IGNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RXcmFwcGVyKCk7XG5cdGNvbnN0IHRhYmxlTWFuaWZlc3RTZXR0aW5nczogVGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24gPSBjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0Q29udHJvbENvbmZpZ3VyYXRpb24odmlzdWFsaXphdGlvblBhdGgpO1xuXHRjb25zdCB2YXJpYW50TWFuYWdlbWVudDogVmFyaWFudE1hbmFnZW1lbnRUeXBlID0gbWFuaWZlc3RXcmFwcGVyLmdldFZhcmlhbnRNYW5hZ2VtZW50KCk7XG5cdGNvbnN0IG1vZGVzOiBUYWJsZVAxM25Nb2RlW10gPSBbXTtcblx0Y29uc3QgaXNBbmFseXRpY2FsVGFibGUgPSB0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbi50eXBlID09PSBcIkFuYWx5dGljYWxUYWJsZVwiO1xuXHRjb25zdCBpc1Jlc3BvbnNpdmVUYWJsZSA9IHRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uLnR5cGUgPT09IFwiUmVzcG9uc2l2ZVRhYmxlXCI7XG5cdGlmICh0YWJsZU1hbmlmZXN0U2V0dGluZ3M/LnRhYmxlU2V0dGluZ3M/LnBlcnNvbmFsaXphdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0Ly8gUGVyc29uYWxpemF0aW9uIGNvbmZpZ3VyZWQgaW4gbWFuaWZlc3QuXG5cdFx0Y29uc3QgcGVyc29uYWxpemF0aW9uID0gdGFibGVNYW5pZmVzdFNldHRpbmdzLnRhYmxlU2V0dGluZ3MucGVyc29uYWxpemF0aW9uO1xuXHRcdGlmIChwZXJzb25hbGl6YXRpb24gPT09IHRydWUpIHtcblx0XHRcdC8vIFRhYmxlIHBlcnNvbmFsaXphdGlvbiBmdWxseSBlbmFibGVkLlxuXHRcdFx0c3dpdGNoICh0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbi50eXBlKSB7XG5cdFx0XHRcdGNhc2UgXCJBbmFseXRpY2FsVGFibGVcIjpcblx0XHRcdFx0XHRyZXR1cm4gW1wiU29ydFwiLCBcIkNvbHVtblwiLCBcIkZpbHRlclwiLCBcIkdyb3VwXCIsIFwiQWdncmVnYXRlXCJdO1xuXHRcdFx0XHRjYXNlIFwiUmVzcG9uc2l2ZVRhYmxlXCI6XG5cdFx0XHRcdFx0cmV0dXJuIFtcIlNvcnRcIiwgXCJDb2x1bW5cIiwgXCJGaWx0ZXJcIiwgXCJHcm91cFwiXTtcblx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRyZXR1cm4gW1wiU29ydFwiLCBcIkNvbHVtblwiLCBcIkZpbHRlclwiXTtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKHR5cGVvZiBwZXJzb25hbGl6YXRpb24gPT09IFwib2JqZWN0XCIpIHtcblx0XHRcdC8vIFNwZWNpZmljIHBlcnNvbmFsaXphdGlvbiBvcHRpb25zIGVuYWJsZWQgaW4gbWFuaWZlc3QuIFVzZSB0aGVtIGFzIGlzLlxuXHRcdFx0aWYgKHBlcnNvbmFsaXphdGlvbi5zb3J0KSB7XG5cdFx0XHRcdG1vZGVzLnB1c2goXCJTb3J0XCIpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHBlcnNvbmFsaXphdGlvbi5jb2x1bW4pIHtcblx0XHRcdFx0bW9kZXMucHVzaChcIkNvbHVtblwiKTtcblx0XHRcdH1cblx0XHRcdGlmIChwZXJzb25hbGl6YXRpb24uZmlsdGVyKSB7XG5cdFx0XHRcdG1vZGVzLnB1c2goXCJGaWx0ZXJcIik7XG5cdFx0XHR9XG5cdFx0XHRpZiAocGVyc29uYWxpemF0aW9uLmdyb3VwICYmIChpc0FuYWx5dGljYWxUYWJsZSB8fCBpc1Jlc3BvbnNpdmVUYWJsZSkpIHtcblx0XHRcdFx0bW9kZXMucHVzaChcIkdyb3VwXCIpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHBlcnNvbmFsaXphdGlvbi5hZ2dyZWdhdGUgJiYgaXNBbmFseXRpY2FsVGFibGUpIHtcblx0XHRcdFx0bW9kZXMucHVzaChcIkFnZ3JlZ2F0ZVwiKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBtb2Rlcy5sZW5ndGggPiAwID8gbW9kZXMgOiB1bmRlZmluZWQ7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdC8vIE5vIHBlcnNvbmFsaXphdGlvbiBjb25maWd1cmVkIGluIG1hbmlmZXN0LlxuXHRcdG1vZGVzLnB1c2goXCJTb3J0XCIpO1xuXHRcdG1vZGVzLnB1c2goXCJDb2x1bW5cIik7XG5cdFx0aWYgKGNvbnZlcnRlckNvbnRleHQuZ2V0VGVtcGxhdGVUeXBlKCkgPT09IFRlbXBsYXRlVHlwZS5MaXN0UmVwb3J0KSB7XG5cdFx0XHRpZiAodmFyaWFudE1hbmFnZW1lbnQgPT09IFZhcmlhbnRNYW5hZ2VtZW50VHlwZS5Db250cm9sIHx8IF9pc0ZpbHRlckJhckhpZGRlbihtYW5pZmVzdFdyYXBwZXIsIGNvbnZlcnRlckNvbnRleHQpKSB7XG5cdFx0XHRcdC8vIEZlYXR1cmUgcGFyaXR5IHdpdGggVjIuXG5cdFx0XHRcdC8vIEVuYWJsZSB0YWJsZSBmaWx0ZXJpbmcgYnkgZGVmYXVsdCBvbmx5IGluIGNhc2Ugb2YgQ29udHJvbCBsZXZlbCB2YXJpYW50IG1hbmFnZW1lbnQuXG5cdFx0XHRcdC8vIE9yIHdoZW4gdGhlIExSIGZpbHRlciBiYXIgaXMgaGlkZGVuIHZpYSBtYW5pZmVzdCBzZXR0aW5nXG5cdFx0XHRcdG1vZGVzLnB1c2goXCJGaWx0ZXJcIik7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdG1vZGVzLnB1c2goXCJGaWx0ZXJcIik7XG5cdFx0fVxuXHRcdGlmIChpc0FuYWx5dGljYWxUYWJsZSkge1xuXHRcdFx0bW9kZXMucHVzaChcIkdyb3VwXCIpO1xuXHRcdFx0bW9kZXMucHVzaChcIkFnZ3JlZ2F0ZVwiKTtcblx0XHR9XG5cdFx0aWYgKGlzUmVzcG9uc2l2ZVRhYmxlKSB7XG5cdFx0XHRtb2Rlcy5wdXNoKFwiR3JvdXBcIik7XG5cdFx0fVxuXHRcdHJldHVybiBtb2Rlcztcblx0fVxufVxuLyoqXG4gKiBSZXR1cm5zIGEgQm9vbGVhbiB2YWx1ZSBzdWdnZXN0aW5nIGlmIGEgZmlsdGVyIGJhciBpcyBiZWluZyB1c2VkIG9uIHRoZSBwYWdlLlxuICpcbiAqIENoYXJ0IGhhcyBhIGRlcGVuZGVuY3kgdG8gZmlsdGVyIGJhciAoaXNzdWUgd2l0aCBsb2FkaW5nIGRhdGEpLiBPbmNlIHJlc29sdmVkLCB0aGUgY2hlY2sgZm9yIGNoYXJ0IHNob3VsZCBiZSByZW1vdmVkIGhlcmUuXG4gKiBVbnRpbCB0aGVuLCBoaWRpbmcgZmlsdGVyIGJhciBpcyBub3cgYWxsb3dlZCBpZiBhIGNoYXJ0IGlzIGJlaW5nIHVzZWQgb24gTFIuXG4gKiBAcGFyYW0gbWFuaWZlc3RXcmFwcGVyIE1hbmlmZXN0IHNldHRpbmdzIGdldHRlciBmb3IgdGhlIHBhZ2VcbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBpbnN0YW5jZSBvZiB0aGUgY29udmVydGVyIGNvbnRleHRcbiAqIEByZXR1cm5zIEJvb2xlYW4gc3VnZ2VzdGluZyBpZiBhIGZpbHRlciBiYXIgaXMgYmVpbmcgdXNlZCBvbiB0aGUgcGFnZS5cbiAqL1xuZnVuY3Rpb24gX2lzRmlsdGVyQmFySGlkZGVuKG1hbmlmZXN0V3JhcHBlcjogTWFuaWZlc3RXcmFwcGVyLCBjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4pOiBib29sZWFuIHtcblx0cmV0dXJuIChcblx0XHRtYW5pZmVzdFdyYXBwZXIuaXNGaWx0ZXJCYXJIaWRkZW4oKSAmJlxuXHRcdCFjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0V3JhcHBlcigpLmhhc011bHRpcGxlVmlzdWFsaXphdGlvbnMoKSAmJlxuXHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0VGVtcGxhdGVUeXBlKCkgIT09IFRlbXBsYXRlVHlwZS5BbmFseXRpY2FsTGlzdFBhZ2Vcblx0KTtcbn1cbi8qKlxuICogUmV0dXJucyBhIEpTT04gc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHNvcnQgY29uZGl0aW9ucyBmb3IgdGhlIHByZXNlbnRhdGlvbiB2YXJpYW50LlxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGluc3RhbmNlIG9mIHRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHBhcmFtIHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uIFByZXNlbnRhdGlvbiB2YXJpYW50IGFubm90YXRpb25cbiAqIEBwYXJhbSBjb2x1bW5zIFRhYmxlIGNvbHVtbnMgcHJvY2Vzc2VkIGJ5IHRoZSBjb252ZXJ0ZXJcbiAqIEByZXR1cm5zIFNvcnQgY29uZGl0aW9ucyBmb3IgYSBwcmVzZW50YXRpb24gdmFyaWFudC5cbiAqL1xuZnVuY3Rpb24gZ2V0U29ydENvbmRpdGlvbnMoXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pixcblx0cHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb246IFByZXNlbnRhdGlvblZhcmlhbnRUeXBlIHwgdW5kZWZpbmVkLFxuXHRjb2x1bW5zOiBUYWJsZUNvbHVtbltdXG4pOiBUYWJsZVNvcnRDb25kaXRpb25zIHwgdW5kZWZpbmVkIHtcblx0Ly8gQ3VycmVudGx5IG5hdmlnYXRpb24gcHJvcGVydHkgaXMgbm90IHN1cHBvcnRlZCBhcyBzb3J0ZXJcblx0Y29uc3Qgbm9uU29ydGFibGVQcm9wZXJ0aWVzID0gZ2V0UmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzKGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0KCkpLm5vblNvcnRhYmxlUHJvcGVydGllcztcblx0Y29uc3Qgc29ydENvbmRpdGlvbnM6IFRhYmxlU29ydENvbmRpdGlvbnMgPSB7XG5cdFx0c29ydGVyczogW11cblx0fTtcblx0aWYgKHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uPy5Tb3J0T3JkZXIpIHtcblx0XHRwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbi5Tb3J0T3JkZXIuZm9yRWFjaCgoY29uZGl0aW9uKSA9PiB7XG5cdFx0XHRjb25zdCBjb25kaXRpb25Qcm9wZXJ0eSA9IGNvbmRpdGlvbi5Qcm9wZXJ0eTtcblx0XHRcdGlmIChjb25kaXRpb25Qcm9wZXJ0eT8uJHRhcmdldCAhPT0gdW5kZWZpbmVkICYmICFub25Tb3J0YWJsZVByb3BlcnRpZXMuaW5jbHVkZXMoY29uZGl0aW9uUHJvcGVydHkuJHRhcmdldC5uYW1lKSkge1xuXHRcdFx0XHRjb25zdCBpbmZvTmFtZSA9IGNvbnZlcnRQcm9wZXJ0eVBhdGhzVG9JbmZvTmFtZXMoW2NvbmRpdGlvblByb3BlcnR5XSwgY29sdW1ucylbMF07XG5cdFx0XHRcdGlmIChpbmZvTmFtZSkge1xuXHRcdFx0XHRcdHNvcnRDb25kaXRpb25zLnNvcnRlcnMucHVzaCh7XG5cdFx0XHRcdFx0XHRuYW1lOiBpbmZvTmFtZSxcblx0XHRcdFx0XHRcdGRlc2NlbmRpbmc6ICEhY29uZGl0aW9uLkRlc2NlbmRpbmdcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cdHJldHVybiBzb3J0Q29uZGl0aW9ucy5zb3J0ZXJzLmxlbmd0aCA/IHNvcnRDb25kaXRpb25zIDogdW5kZWZpbmVkO1xufVxuZnVuY3Rpb24gZ2V0SW5pdGlhbEV4cGFuc2lvbkxldmVsKHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uOiBQcmVzZW50YXRpb25WYXJpYW50VHlwZSB8IHVuZGVmaW5lZCk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG5cdGlmICghcHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24pIHtcblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cdGNvbnN0IGxldmVsID0gcHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24uSW5pdGlhbEV4cGFuc2lvbkxldmVsPy52YWx1ZU9mKCk7XG5cdHJldHVybiB0eXBlb2YgbGV2ZWwgPT09IFwibnVtYmVyXCIgPyBsZXZlbCArIDEgOiB1bmRlZmluZWQ7XG59XG4vKipcbiAqIENvbnZlcnRzIGFuIGFycmF5IG9mIHByb3BlcnR5UGF0aCB0byBhbiBhcnJheSBvZiBwcm9wZXJ0eUluZm8gbmFtZXMuXG4gKiBAcGFyYW0gcGF0aHMgVGhlIGFycmF5IHRvIGJlIGNvbnZlcnRlZFxuICogQHBhcmFtIGNvbHVtbnMgVGhlIGFycmF5IG9mIHByb3BlcnR5SW5mb3NcbiAqIEByZXR1cm5zIEFuIGFycmF5IG9mIHByb3BlcnR5SW5mbyBuYW1lc1xuICovXG5mdW5jdGlvbiBjb252ZXJ0UHJvcGVydHlQYXRoc1RvSW5mb05hbWVzKHBhdGhzOiBQcm9wZXJ0eVBhdGhbXSwgY29sdW1uczogVGFibGVDb2x1bW5bXSk6IHN0cmluZ1tdIHtcblx0Y29uc3QgaW5mb05hbWVzOiBzdHJpbmdbXSA9IFtdO1xuXHRsZXQgcHJvcGVydHlJbmZvOiBUYWJsZUNvbHVtbiB8IHVuZGVmaW5lZCwgYW5ub3RhdGlvbkNvbHVtbjogQW5ub3RhdGlvblRhYmxlQ29sdW1uO1xuXHRwYXRocy5mb3JFYWNoKChjdXJyZW50UGF0aCkgPT4ge1xuXHRcdGlmIChjdXJyZW50UGF0aD8udmFsdWUpIHtcblx0XHRcdHByb3BlcnR5SW5mbyA9IGNvbHVtbnMuZmluZCgoY29sdW1uKSA9PiB7XG5cdFx0XHRcdGFubm90YXRpb25Db2x1bW4gPSBjb2x1bW4gYXMgQW5ub3RhdGlvblRhYmxlQ29sdW1uO1xuXHRcdFx0XHRyZXR1cm4gIWFubm90YXRpb25Db2x1bW4ucHJvcGVydHlJbmZvcyAmJiBhbm5vdGF0aW9uQ29sdW1uLnJlbGF0aXZlUGF0aCA9PT0gY3VycmVudFBhdGg/LnZhbHVlO1xuXHRcdFx0fSk7XG5cdFx0XHRpZiAocHJvcGVydHlJbmZvKSB7XG5cdFx0XHRcdGluZm9OYW1lcy5wdXNoKHByb3BlcnR5SW5mby5uYW1lKTtcblx0XHRcdH1cblx0XHR9XG5cdH0pO1xuXHRyZXR1cm4gaW5mb05hbWVzO1xufVxuLyoqXG4gKiBSZXR1cm5zIGEgSlNPTiBzdHJpbmcgY29udGFpbmluZyBQcmVzZW50YXRpb24gVmFyaWFudCBncm91cCBjb25kaXRpb25zLlxuICogQHBhcmFtIHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uIFByZXNlbnRhdGlvbiB2YXJpYW50IGFubm90YXRpb25cbiAqIEBwYXJhbSBjb2x1bW5zIENvbnZlcnRlciBwcm9jZXNzZWQgdGFibGUgY29sdW1uc1xuICogQHBhcmFtIHRhYmxlVHlwZSBUaGUgdGFibGUgdHlwZS5cbiAqIEByZXR1cm5zIEdyb3VwIGNvbmRpdGlvbnMgZm9yIGEgUHJlc2VudGF0aW9uIHZhcmlhbnQuXG4gKi9cbmZ1bmN0aW9uIGdldEdyb3VwQ29uZGl0aW9ucyhcblx0cHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb246IFByZXNlbnRhdGlvblZhcmlhbnRUeXBlIHwgdW5kZWZpbmVkLFxuXHRjb2x1bW5zOiBUYWJsZUNvbHVtbltdLFxuXHR0YWJsZVR5cGU6IHN0cmluZ1xuKTogVGFibGVHcm91cENvbmRpdGlvbnMgfCB1bmRlZmluZWQge1xuXHRjb25zdCBncm91cENvbmRpdGlvbnM6IFRhYmxlR3JvdXBDb25kaXRpb25zID0ge1xuXHRcdGdyb3VwTGV2ZWxzOiBbXVxuXHR9O1xuXHRpZiAocHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24/Lkdyb3VwQnkpIHtcblx0XHRsZXQgYUdyb3VwQnkgPSBwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbi5Hcm91cEJ5O1xuXHRcdGlmICh0YWJsZVR5cGUgPT09IFwiUmVzcG9uc2l2ZVRhYmxlXCIpIHtcblx0XHRcdGFHcm91cEJ5ID0gYUdyb3VwQnkuc2xpY2UoMCwgMSk7XG5cdFx0fVxuXHRcdGdyb3VwQ29uZGl0aW9ucy5ncm91cExldmVscyA9IGNvbnZlcnRQcm9wZXJ0eVBhdGhzVG9JbmZvTmFtZXMoYUdyb3VwQnksIGNvbHVtbnMpLm1hcCgoaW5mb05hbWUpID0+IHtcblx0XHRcdHJldHVybiB7IG5hbWU6IGluZm9OYW1lIH07XG5cdFx0fSk7XG5cdH1cblx0cmV0dXJuIGdyb3VwQ29uZGl0aW9ucy5ncm91cExldmVscy5sZW5ndGggPyBncm91cENvbmRpdGlvbnMgOiB1bmRlZmluZWQ7XG59XG4vKipcbiAqIFVwZGF0ZXMgdGhlIGNvbHVtbidzIHByb3BlcnR5SW5mb3Mgb2YgYSBhbmFseXRpY2FsIHRhYmxlIGludGVncmF0aW5nIGFsbCBleHRlbnNpb25zIGFuZCBiaW5kaW5nLXJlbGV2YW50IHByb3BlcnR5IGluZm8gcGFydC5cbiAqIEBwYXJhbSB0YWJsZVZpc3VhbGl6YXRpb24gVGhlIHZpc3VhbGl6YXRpb24gdG8gYmUgdXBkYXRlZFxuICovXG5mdW5jdGlvbiBfdXBkYXRlUHJvcGVydHlJbmZvc1dpdGhBZ2dyZWdhdGVzRGVmaW5pdGlvbnModGFibGVWaXN1YWxpemF0aW9uOiBUYWJsZVZpc3VhbGl6YXRpb24pOiB2b2lkIHtcblx0Y29uc3QgcmVsYXRlZEFkZGl0aW9uYWxQcm9wZXJ0eU5hbWVNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblx0dGFibGVWaXN1YWxpemF0aW9uLmNvbHVtbnMuZm9yRWFjaCgoY29sdW1uKSA9PiB7XG5cdFx0Y29sdW1uID0gY29sdW1uIGFzIEFubm90YXRpb25UYWJsZUNvbHVtbjtcblx0XHRjb25zdCBhZ2dyZWdhdGFibGVQcm9wZXJ0eU5hbWUgPSBPYmplY3Qua2V5cyh0YWJsZVZpc3VhbGl6YXRpb24uYW5hbHl0aWNzRXh0ZW5zaW9ucyEpLmZpbmQoXG5cdFx0XHQoYWdncmVnYXRlKSA9PiBhZ2dyZWdhdGUgPT09IGNvbHVtbi5uYW1lXG5cdFx0KTtcblx0XHRpZiAoYWdncmVnYXRhYmxlUHJvcGVydHlOYW1lKSB7XG5cdFx0XHRjb25zdCBhZ2dyZWdhdGFibGVQcm9wZXJ0eURlZmluaXRpb24gPSB0YWJsZVZpc3VhbGl6YXRpb24uYW5hbHl0aWNzRXh0ZW5zaW9ucyFbYWdncmVnYXRhYmxlUHJvcGVydHlOYW1lXTtcblx0XHRcdGNvbHVtbi5hZ2dyZWdhdGFibGUgPSAhYWdncmVnYXRhYmxlUHJvcGVydHlEZWZpbml0aW9uLmZyb21Hcm91cGFibGVQcm9wZXJ0eTtcblx0XHRcdGNvbHVtbi5leHRlbnNpb24gPSBhZ2dyZWdhdGFibGVQcm9wZXJ0eURlZmluaXRpb24gPz8ge307XG5cdFx0XHRpZiAoIWNvbHVtbi5pc0dyb3VwYWJsZSAmJiAhY29sdW1uLmFnZ3JlZ2F0YWJsZSkge1xuXHRcdFx0XHQvLyBUaGUgY29sdW1uIGlzIG5laXRoZXIgYWdncmVnYXRhYmxlIG5vciBncm91cGFibGUgLS0+IGl0J3MgYSBoaWRkZW4gY29sdW1uIHRvIGFsbG93IGZpbHRlcmluZyBpbiBQMTNOXG5cdFx0XHRcdC8vIFdlIG5lZWQgdG8gcmVtb3ZlIGFkZGl0aW9uYWxQcm9wZXJ0aWVzLCBhcyBpdCdzIG5vdCBuZWVkZWQgYW5kIGNhdXNlcyBhbiBlcnJvciBpbiB0aGUgTURDIHRhYmxlIGNvZGVcblx0XHRcdFx0ZGVsZXRlIGNvbHVtbi5leHRlbnNpb24uYWRkaXRpb25hbFByb3BlcnRpZXM7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmIChjb2x1bW4uYWRkaXRpb25hbFByb3BlcnR5SW5mb3M/Lmxlbmd0aCkge1xuXHRcdFx0Y29sdW1uLmFkZGl0aW9uYWxQcm9wZXJ0eUluZm9zLmZvckVhY2goKGFkZGl0aW9uYWxQcm9wZXJ0eUluZm8pID0+IHtcblx0XHRcdFx0Ly8gQ3JlYXRlIHByb3BlcnR5SW5mbyBmb3IgZWFjaCBhZGRpdGlvbmFsIHByb3BlcnR5LlxuXHRcdFx0XHQvLyBUaGUgbmV3IHByb3BlcnR5ICduYW1lJyBoYXMgYmVlbiBwcmVmaXhlZCB3aXRoICdQcm9wZXJ0eV9UZWNobmljYWw6OicgZm9yIHVuaXF1ZW5lc3MgYW5kIGl0IGhhcyBiZWVuIG5hbWVkIHRlY2huaWNhbCBwcm9wZXJ0eSBhcyBpdCByZXF1aXJlcyBkZWRpY2F0ZWQgTURDIGF0dHJpYnV0ZXMgKHRlY2huaWNhbGx5R3JvdXBhYmxlIGFuZCB0ZWNobmljYWxseUFnZ3JlZ2F0YWJsZSkuXG5cdFx0XHRcdGNyZWF0ZVRlY2huaWNhbFByb3BlcnR5KGFkZGl0aW9uYWxQcm9wZXJ0eUluZm8sIHRhYmxlVmlzdWFsaXphdGlvbi5jb2x1bW5zLCByZWxhdGVkQWRkaXRpb25hbFByb3BlcnR5TmFtZU1hcCk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdH0pO1xuXHR0YWJsZVZpc3VhbGl6YXRpb24uY29sdW1ucy5mb3JFYWNoKChjb2x1bW4pID0+IHtcblx0XHRjb2x1bW4gPSBjb2x1bW4gYXMgQW5ub3RhdGlvblRhYmxlQ29sdW1uO1xuXHRcdGlmIChjb2x1bW4uYWRkaXRpb25hbFByb3BlcnR5SW5mb3MpIHtcblx0XHRcdGNvbHVtbi5hZGRpdGlvbmFsUHJvcGVydHlJbmZvcyA9IGNvbHVtbi5hZGRpdGlvbmFsUHJvcGVydHlJbmZvcy5tYXAoXG5cdFx0XHRcdChwcm9wZXJ0eUluZm8pID0+IHJlbGF0ZWRBZGRpdGlvbmFsUHJvcGVydHlOYW1lTWFwW3Byb3BlcnR5SW5mb10gPz8gcHJvcGVydHlJbmZvXG5cdFx0XHQpO1xuXHRcdFx0Ly8gQWRkIGFkZGl0aW9uYWwgcHJvcGVydGllcyB0byB0aGUgY29tcGxleCBwcm9wZXJ0eSB1c2luZyB0aGUgaGlkZGVuIGFubm90YXRpb24uXG5cdFx0XHRjb2x1bW4ucHJvcGVydHlJbmZvcyA9IGNvbHVtbi5wcm9wZXJ0eUluZm9zPy5jb25jYXQoY29sdW1uLmFkZGl0aW9uYWxQcm9wZXJ0eUluZm9zKTtcblx0XHR9XG5cdH0pO1xufVxuLyoqXG4gKiBQcm92aWRlcyB0aGUgcmVxdWlyZWQgcHJvcGVydGllcyBzZXQgb24gdGhlIGFubm90YXRpb25zLlxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgIFRoZSBpbnN0YW5jZSBvZiB0aGUgY29udmVydGVyIGNvbnRleHRcbiAqIEByZXR1cm5zIFRoZSBwYXRocyBvZiB0aGUgcmVzdHJpY3RlZCBwcm9wZXJ0aWVzXG4gKi9cbmZ1bmN0aW9uIGdldFJlcXVpcmVkUHJvcGVydGllcyhjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4pOiBQcm9wZXJ0eVBhdGhbXSB7XG5cdHJldHVybiBnZXRDb250ZXh0UHJvcGVydHlSZXN0cmljdGlvbihcblx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldERhdGFNb2RlbE9iamVjdFBhdGgoKSxcblx0XHQoY2FwYWJpbGl0aWVzKSA9PiB7XG5cdFx0XHRyZXR1cm4gKGNhcGFiaWxpdGllcyBhcyBFbnRpdHlTZXRBbm5vdGF0aW9uc19DYXBhYmlsaXRpZXMgfCB1bmRlZmluZWQpPy5JbnNlcnRSZXN0cmljdGlvbnM/LlJlcXVpcmVkUHJvcGVydGllcztcblx0XHR9LFxuXHRcdGZhbHNlXG5cdCk7XG59XG4vKipcbiAqIERldGVybWluZXMgaWYgdGhlIHByb3BlcnR5IGlzIGFubm90YXRlZCBhcyBhIHJlcXVpcmVkIHByb3BlcnR5LlxuICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5XG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCBUaGUgaW5zdGFuY2Ugb2YgdGhlIGNvbnZlcnRlciBjb250ZXh0XG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBwcm9wZXJ0eSBpcyByZXF1aXJlZFxuICovXG5mdW5jdGlvbiBpc0Fubm90YXRlZFJlcXVpcmVkUHJvcGVydHkobmFtZTogc3RyaW5nLCBjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4pOiBib29sZWFuIHtcblx0cmV0dXJuIGdldFJlcXVpcmVkUHJvcGVydGllcyhjb252ZXJ0ZXJDb250ZXh0KVxuXHRcdC5tYXAoKHByb3BlcnR5KSA9PiBwcm9wZXJ0eS4kdGFyZ2V0Py5mdWxseVF1YWxpZmllZE5hbWUpXG5cdFx0LmluY2x1ZGVzKG5hbWUpO1xufVxuLyoqXG4gKiBSZXR1cm5zIGEgSlNPTiBzdHJpbmcgY29udGFpbmluZyBQcmVzZW50YXRpb24gVmFyaWFudCBhZ2dyZWdhdGUgY29uZGl0aW9ucy5cbiAqIEBwYXJhbSBwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbiBQcmVzZW50YXRpb24gdmFyaWFudCBhbm5vdGF0aW9uXG4gKiBAcGFyYW0gY29sdW1ucyBDb252ZXJ0ZXIgcHJvY2Vzc2VkIHRhYmxlIGNvbHVtbnNcbiAqIEBwYXJhbSBleHRlbnNpb25JbmZvTWFwXG4gKiBAcmV0dXJucyBHcm91cCBjb25kaXRpb25zIGZvciBhIFByZXNlbnRhdGlvbiB2YXJpYW50LlxuICovXG5mdW5jdGlvbiBnZXRBZ2dyZWdhdGVDb25kaXRpb25zKFxuXHRwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbjogUHJlc2VudGF0aW9uVmFyaWFudFR5cGUgfCB1bmRlZmluZWQsXG5cdGNvbHVtbnM6IFRhYmxlQ29sdW1uW10sXG5cdGV4dGVuc2lvbkluZm9NYXA6IFJlY29yZDxzdHJpbmcsIEludGVybmFsRXh0ZW5zaW9uRm9yQW5hbHl0aWNzPlxuKTogVGFibGVBZ2dyZWdhdGVDb25kaXRpb25zIHwgdW5kZWZpbmVkIHtcblx0Y29uc3QgYWdncmVnYXRlQ29uZGl0aW9uczogVGFibGVBZ2dyZWdhdGVDb25kaXRpb25zID0ge307XG5cdGlmIChwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbj8uVG90YWwpIHtcblx0XHRjb25zdCBhVG90YWxzID0gcHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24uVG90YWw7XG5cdFx0Y29udmVydFByb3BlcnR5UGF0aHNUb0luZm9OYW1lcyhhVG90YWxzLCBjb2x1bW5zKS5mb3JFYWNoKChpbmZvTmFtZSkgPT4ge1xuXHRcdFx0YWdncmVnYXRlQ29uZGl0aW9uc1tpbmZvTmFtZV0gPSB7fTtcblx0XHR9KTtcblx0fSBlbHNlIHtcblx0XHRmb3IgKGNvbnN0IGtleSBpbiBleHRlbnNpb25JbmZvTWFwKSB7XG5cdFx0XHRpZiAoIWV4dGVuc2lvbkluZm9NYXBba2V5XS5mcm9tR3JvdXBhYmxlUHJvcGVydHkpIHtcblx0XHRcdFx0YWdncmVnYXRlQ29uZGl0aW9uc1trZXldID0ge307XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdHJldHVybiBPYmplY3Qua2V5cyhhZ2dyZWdhdGVDb25kaXRpb25zKS5sZW5ndGggPyBhZ2dyZWdhdGVDb25kaXRpb25zIDogdW5kZWZpbmVkO1xufVxuZXhwb3J0IHR5cGUgU3RhbmRhcmRBY3Rpb25zQ29uZmlndXJhdGlvbiA9IHtcblx0Y3JlYXRpb25CZWhhdmlvdXI6IFRhYmxlQW5ub3RhdGlvbkNvbmZpZ3VyYXRpb25bXCJjcmVhdGVcIl07XG5cdGN1dEJ1dHRvblZpc2liaWxpdHlFeHByZXNzaW9uOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj47XG5cdGRlbGV0ZUJ1dHRvblZpc2liaWxpdHlFeHByZXNzaW9uOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj47XG5cdG1hc3NFZGl0QnV0dG9uVmlzaWJpbGl0eUV4cHJlc3Npb246IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPjtcblx0aXNJbnNlcnRVcGRhdGVBY3Rpb25zVGVtcGxhdGVkOiBib29sZWFuO1xuXHRzdGFuZGFyZEFjdGlvbnM6IHtcblx0XHRjcmVhdGU6IFN0YW5kYXJkQWN0aW9uO1xuXHRcdGRlbGV0ZTogU3RhbmRhcmRBY3Rpb247XG5cdFx0cGFzdGU6IFN0YW5kYXJkQWN0aW9uO1xuXHRcdG1hc3NFZGl0OiBTdGFuZGFyZEFjdGlvbjtcblx0XHRpbnNpZ2h0czogU3RhbmRhcmRBY3Rpb247XG5cdFx0Y3JlYXRpb25Sb3c6IFN0YW5kYXJkQWN0aW9uO1xuXHRcdGN1dDogU3RhbmRhcmRBY3Rpb247XG5cdFx0bW92ZVVwPzogU3RhbmRhcmRBY3Rpb247XG5cdFx0bW92ZURvd24/OiBTdGFuZGFyZEFjdGlvbjtcblx0fTtcbn07XG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIHN0YW5kYXJkIGFjdGlvbnMgYW5kIGFkamFjZW50IHByb3BlcnRpZXMgdGhhdCBhcmUgbmVlZGVkIGluIHRoZSBmdXJ0aGVyIGNvbnZlcnNpb24gcHJvY2Vzcy5cbiAqIEBwYXJhbSBsaW5lSXRlbUFubm90YXRpb24gQ29sbGVjdGlvbiBvZiBkYXRhIGZpZWxkcyB1c2VkIGZvciByZXByZXNlbnRhdGlvbiBpbiBhIHRhYmxlIG9yIGxpc3RcbiAqIEBwYXJhbSB2aXN1YWxpemF0aW9uUGF0aCBUaGUgdmlzdWFsaXphdGlvbiBwYXRoXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCBUaGUgaW5zdGFuY2Ugb2YgdGhlIGNvbnZlcnRlciBjb250ZXh0XG4gKiBAcGFyYW0gdGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24gVGhlIHRhYmxlIG1hbmlmZXN0IGNvbmZpZ3VyYXRpb25cbiAqIEBwYXJhbSBuYXZpZ2F0aW9uU2V0dGluZ3MgVGhlIG5hdmlnYXRpb24gdGFyZ2V0IG1hbmlmZXN0IGNvbmZpZ3VyYXRpb25cbiAqIEByZXR1cm5zIFN0YW5kYXJkIGFjdGlvbnMgYW5kIGNvbm5lY3RlZCBwcm9wZXJ0aWVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTdGFuZGFyZEFjdGlvbnNDb25maWd1cmF0aW9uKFxuXHRsaW5lSXRlbUFubm90YXRpb246IExpbmVJdGVtIHwgdW5kZWZpbmVkLFxuXHR2aXN1YWxpemF0aW9uUGF0aDogc3RyaW5nLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sXG5cdHRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uOiBUYWJsZUNvbnRyb2xDb25maWd1cmF0aW9uLFxuXHRuYXZpZ2F0aW9uU2V0dGluZ3M6IE5hdmlnYXRpb25TZXR0aW5nc0NvbmZpZ3VyYXRpb25cbik6IFN0YW5kYXJkQWN0aW9uc0NvbmZpZ3VyYXRpb24ge1xuXHRjb25zdCBjcmVhdGlvbkJlaGF2aW91ciA9IF9nZXRDcmVhdGlvbkJlaGF2aW91cihcblx0XHRsaW5lSXRlbUFubm90YXRpb24sXG5cdFx0dGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24sXG5cdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHRuYXZpZ2F0aW9uU2V0dGluZ3MsXG5cdFx0dmlzdWFsaXphdGlvblBhdGhcblx0KTtcblx0Y29uc3Qgc3RhbmRhcmRBY3Rpb25zQ29udGV4dCA9IGdlbmVyYXRlU3RhbmRhcmRBY3Rpb25zQ29udGV4dChcblx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdGNyZWF0aW9uQmVoYXZpb3VyLm1vZGUgYXMgQ3JlYXRpb25Nb2RlLFxuXHRcdHRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uXG5cdCk7XG5cdGNvbnN0IGN1dEJ1dHRvblZpc2liaWxpdHlFeHByZXNzaW9uID0gZ2V0Q3V0VmlzaWJpbGl0eShjb252ZXJ0ZXJDb250ZXh0LCBzdGFuZGFyZEFjdGlvbnNDb250ZXh0KTtcblx0Y29uc3QgZGVsZXRlQnV0dG9uVmlzaWJpbGl0eUV4cHJlc3Npb24gPSBnZXREZWxldGVWaXNpYmlsaXR5KGNvbnZlcnRlckNvbnRleHQsIHN0YW5kYXJkQWN0aW9uc0NvbnRleHQpO1xuXHRjb25zdCBtYXNzRWRpdEJ1dHRvblZpc2liaWxpdHlFeHByZXNzaW9uID0gZ2V0TWFzc0VkaXRWaXNpYmlsaXR5KGNvbnZlcnRlckNvbnRleHQsIHN0YW5kYXJkQWN0aW9uc0NvbnRleHQpO1xuXHRjb25zdCBpc0luc2VydFVwZGF0ZUFjdGlvbnNUZW1wbGF0ZWQgPSBnZXRJbnNlcnRVcGRhdGVBY3Rpb25zVGVtcGxhdGluZyhcblx0XHRzdGFuZGFyZEFjdGlvbnNDb250ZXh0LFxuXHRcdGlzRHJhZnRPclN0aWNreVN1cHBvcnRlZChjb252ZXJ0ZXJDb250ZXh0KVxuXHQpO1xuXHRjb25zdCBzdGFuZGFyZEFjdGlvbnMgPSB7XG5cdFx0Y3V0OiBnZXRTdGFuZGFyZEFjdGlvbkN1dChjb252ZXJ0ZXJDb250ZXh0LCBzdGFuZGFyZEFjdGlvbnNDb250ZXh0KSxcblx0XHRjcmVhdGU6IGdldFN0YW5kYXJkQWN0aW9uQ3JlYXRlKGNvbnZlcnRlckNvbnRleHQsIHN0YW5kYXJkQWN0aW9uc0NvbnRleHQpLFxuXHRcdGRlbGV0ZTogZ2V0U3RhbmRhcmRBY3Rpb25EZWxldGUoY29udmVydGVyQ29udGV4dCwgc3RhbmRhcmRBY3Rpb25zQ29udGV4dCksXG5cdFx0cGFzdGU6IGdldFN0YW5kYXJkQWN0aW9uUGFzdGUoY29udmVydGVyQ29udGV4dCwgc3RhbmRhcmRBY3Rpb25zQ29udGV4dCwgaXNJbnNlcnRVcGRhdGVBY3Rpb25zVGVtcGxhdGVkKSxcblx0XHRtYXNzRWRpdDogZ2V0U3RhbmRhcmRBY3Rpb25NYXNzRWRpdChjb252ZXJ0ZXJDb250ZXh0LCBzdGFuZGFyZEFjdGlvbnNDb250ZXh0KSxcblx0XHRpbnNpZ2h0czogZ2V0U3RhbmRhcmRBY3Rpb25JbnNpZ2h0cyhjb252ZXJ0ZXJDb250ZXh0LCBzdGFuZGFyZEFjdGlvbnNDb250ZXh0LCB2aXN1YWxpemF0aW9uUGF0aCksXG5cdFx0Y3JlYXRpb25Sb3c6IGdldENyZWF0aW9uUm93KGNvbnZlcnRlckNvbnRleHQsIHN0YW5kYXJkQWN0aW9uc0NvbnRleHQpXG5cdH07XG5cdGNvbnN0IGNvbmZpZ3VyYXRpb246IFN0YW5kYXJkQWN0aW9uc0NvbmZpZ3VyYXRpb24gPSB7XG5cdFx0Y3JlYXRpb25CZWhhdmlvdXIsXG5cdFx0Y3V0QnV0dG9uVmlzaWJpbGl0eUV4cHJlc3Npb24sXG5cdFx0ZGVsZXRlQnV0dG9uVmlzaWJpbGl0eUV4cHJlc3Npb24sXG5cdFx0bWFzc0VkaXRCdXR0b25WaXNpYmlsaXR5RXhwcmVzc2lvbixcblx0XHRpc0luc2VydFVwZGF0ZUFjdGlvbnNUZW1wbGF0ZWQsXG5cdFx0c3RhbmRhcmRBY3Rpb25zXG5cdH07XG5cblx0aWYgKHN0YW5kYXJkQWN0aW9uc0NvbnRleHQudGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24udHlwZSA9PT0gXCJUcmVlVGFibGVcIikge1xuXHRcdGNvbmZpZ3VyYXRpb24uc3RhbmRhcmRBY3Rpb25zLm1vdmVVcCA9IGdldFN0YW5kYXJkQWN0aW9uTW92ZVVwRG93bihjb252ZXJ0ZXJDb250ZXh0LCBzdGFuZGFyZEFjdGlvbnNDb250ZXh0LCB0cnVlKTtcblx0XHRjb25maWd1cmF0aW9uLnN0YW5kYXJkQWN0aW9ucy5tb3ZlRG93biA9IGdldFN0YW5kYXJkQWN0aW9uTW92ZVVwRG93bihjb252ZXJ0ZXJDb250ZXh0LCBzdGFuZGFyZEFjdGlvbnNDb250ZXh0LCBmYWxzZSk7XG5cdH1cblxuXHRyZXR1cm4gY29uZmlndXJhdGlvbjtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRUYWJsZUFubm90YXRpb25Db25maWd1cmF0aW9uKFxuXHRsaW5lSXRlbUFubm90YXRpb246IExpbmVJdGVtIHwgdW5kZWZpbmVkLFxuXHR2aXN1YWxpemF0aW9uUGF0aDogc3RyaW5nLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sXG5cdHRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uOiBUYWJsZUNvbnRyb2xDb25maWd1cmF0aW9uLFxuXHRjb2x1bW5zOiBUYWJsZUNvbHVtbltdLFxuXHRuYXZpZ2F0aW9uU2V0dGluZ3M6IE5hdmlnYXRpb25TZXR0aW5nc0NvbmZpZ3VyYXRpb24sXG5cdHN0YW5kYXJkQWN0aW9uc0NvbmZpZ3VyYXRpb246IFN0YW5kYXJkQWN0aW9uc0NvbmZpZ3VyYXRpb24sXG5cdHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uPzogUHJlc2VudGF0aW9uVmFyaWFudFR5cGVcbik6IFRhYmxlQW5ub3RhdGlvbkNvbmZpZ3VyYXRpb24ge1xuXHQvLyBOZWVkIHRvIGdldCB0aGUgdGFyZ2V0XG5cdGNvbnN0IHsgbmF2aWdhdGlvblByb3BlcnR5UGF0aCB9ID0gc3BsaXRQYXRoKHZpc3VhbGl6YXRpb25QYXRoKTtcblx0Y29uc3QgdHlwZU5hbWVQbHVyYWwgPSBjb252ZXJ0ZXJDb250ZXh0LmdldERhdGFNb2RlbE9iamVjdFBhdGgoKS50YXJnZXRFbnRpdHlUeXBlLmFubm90YXRpb25zPy5VST8uSGVhZGVySW5mbz8uVHlwZU5hbWVQbHVyYWw7XG5cdGNvbnN0IHRpdGxlID0gdHlwZU5hbWVQbHVyYWwgJiYgY29tcGlsZUV4cHJlc3Npb24oZ2V0RXhwcmVzc2lvbkZyb21Bbm5vdGF0aW9uKHR5cGVOYW1lUGx1cmFsKSk7XG5cdGNvbnN0IGVudGl0eVNldCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpLnRhcmdldEVudGl0eVNldDtcblx0Y29uc3QgcGFnZU1hbmlmZXN0U2V0dGluZ3M6IE1hbmlmZXN0V3JhcHBlciA9IGNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RXcmFwcGVyKCk7XG5cdGNvbnN0IGhhc0Fic29sdXRlUGF0aCA9IG5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgubGVuZ3RoID09PSAwO1xuXHRjb25zdCBwMTNuTW9kZSA9IGdldFAxM25Nb2RlKHZpc3VhbGl6YXRpb25QYXRoLCBjb252ZXJ0ZXJDb250ZXh0LCB0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbik7XG5cdGNvbnN0IGlkID0gbmF2aWdhdGlvblByb3BlcnR5UGF0aCA/IGdldFRhYmxlSUQodmlzdWFsaXphdGlvblBhdGgpIDogZ2V0VGFibGVJRChjb252ZXJ0ZXJDb250ZXh0LmdldENvbnRleHRQYXRoKCksIFwiTGluZUl0ZW1cIik7XG5cdGNvbnN0IHRhcmdldENhcGFiaWxpdGllcyA9IGdldENhcGFiaWxpdHlSZXN0cmljdGlvbihjb252ZXJ0ZXJDb250ZXh0KTtcblx0Y29uc3QgbmF2aWdhdGlvblRhcmdldFBhdGggPSBnZXROYXZpZ2F0aW9uVGFyZ2V0UGF0aChjb252ZXJ0ZXJDb250ZXh0LCBuYXZpZ2F0aW9uUHJvcGVydHlQYXRoKTtcblx0Y29uc3Qgc2VsZWN0aW9uTW9kZSA9IGdldFNlbGVjdGlvbk1vZGUoXG5cdFx0bGluZUl0ZW1Bbm5vdGF0aW9uLFxuXHRcdHZpc3VhbGl6YXRpb25QYXRoLFxuXHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0aGFzQWJzb2x1dGVQYXRoLFxuXHRcdHRhcmdldENhcGFiaWxpdGllcyxcblx0XHRzdGFuZGFyZEFjdGlvbnNDb25maWd1cmF0aW9uLmRlbGV0ZUJ1dHRvblZpc2liaWxpdHlFeHByZXNzaW9uLFxuXHRcdHN0YW5kYXJkQWN0aW9uc0NvbmZpZ3VyYXRpb24ubWFzc0VkaXRCdXR0b25WaXNpYmlsaXR5RXhwcmVzc2lvbixcblx0XHRzdGFuZGFyZEFjdGlvbnNDb25maWd1cmF0aW9uLmN1dEJ1dHRvblZpc2liaWxpdHlFeHByZXNzaW9uXG5cdCk7XG5cdGxldCB0aHJlc2hvbGQgPSBuYXZpZ2F0aW9uUHJvcGVydHlQYXRoID8gMTAgOiAzMDtcblx0aWYgKHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uPy5NYXhJdGVtcykge1xuXHRcdHRocmVzaG9sZCA9IHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uLk1heEl0ZW1zLnZhbHVlT2YoKTtcblx0fSBlbHNlIGlmICh0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbi50eXBlID09PSBcIlRyZWVUYWJsZVwiKSB7XG5cdFx0Ly8gVG8gbWFrZSBzY3JvbGxpbmcgc21vb3RoLCB3ZSBzZXQgdGhlIHRocmVzaG9sZCB2YWx1ZSBoaWdoZXIgZm9yIHRyZWUgdGFibGVzXG5cdFx0dGhyZXNob2xkID0gMjAwO1xuXHR9IGVsc2UgaWYgKHRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uLnR5cGUgPT09IFwiR3JpZFRhYmxlXCIgfHwgdGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24udHlwZSA9PT0gXCJBbmFseXRpY2FsVGFibGVcIikge1xuXHRcdHRocmVzaG9sZCA9IDEwMDtcblx0fVxuXHRjb25zdCB2YXJpYW50TWFuYWdlbWVudDogVmFyaWFudE1hbmFnZW1lbnRUeXBlID0gcGFnZU1hbmlmZXN0U2V0dGluZ3MuZ2V0VmFyaWFudE1hbmFnZW1lbnQoKTtcblx0Y29uc3QgaXNTZWFyY2hhYmxlID0gaXNQYXRoU2VhcmNoYWJsZShjb252ZXJ0ZXJDb250ZXh0LmdldERhdGFNb2RlbE9iamVjdFBhdGgoKSk7XG5cdHJldHVybiB7XG5cdFx0aWQ6IGlkLFxuXHRcdGFwaUlkOiBnZW5lcmF0ZShbaWQsIFwiVGFibGVcIl0pLFxuXHRcdGVudGl0eU5hbWU6IGVudGl0eVNldCA/IGVudGl0eVNldC5uYW1lIDogXCJcIixcblx0XHRlbnRpdHlUeXBlTmFtZTogZW50aXR5U2V0ICYmIGVudGl0eVNldC5lbnRpdHlUeXBlID8gZW50aXR5U2V0LmVudGl0eVR5cGUubmFtZSA6IFwiXCIsXG5cdFx0Y29sbGVjdGlvbjogZ2V0VGFyZ2V0T2JqZWN0UGF0aChjb252ZXJ0ZXJDb250ZXh0LmdldERhdGFNb2RlbE9iamVjdFBhdGgoKSksXG5cdFx0bmF2aWdhdGlvblBhdGg6IG5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgsXG5cdFx0cm93OiBfZ2V0Um93Q29uZmlndXJhdGlvblByb3BlcnR5KFxuXHRcdFx0bGluZUl0ZW1Bbm5vdGF0aW9uLFxuXHRcdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHRcdG5hdmlnYXRpb25TZXR0aW5ncyxcblx0XHRcdG5hdmlnYXRpb25UYXJnZXRQYXRoLFxuXHRcdFx0dGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24udHlwZSxcblx0XHRcdHRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uLmFuYWx5dGljYWxDb25maWd1cmF0aW9uPy5hZ2dyZWdhdGlvbk9uTGVhZkxldmVsIC8vIHRoZSBuYXZpZ2F0aW9uIGlzIGRpc2FibGVkIGlmIHRoZSBhZ2dyZWdhdGlvbk9uTGVhZkxldmVsIGlzIHNldCB0byB0cnVlXG5cdFx0KSxcblx0XHRwMTNuTW9kZSxcblx0XHRpc0luc2VydFVwZGF0ZUFjdGlvbnNUZW1wbGF0ZWQ6IHN0YW5kYXJkQWN0aW9uc0NvbmZpZ3VyYXRpb24uaXNJbnNlcnRVcGRhdGVBY3Rpb25zVGVtcGxhdGVkLFxuXHRcdHVwZGF0YWJsZVByb3BlcnR5UGF0aDogZ2V0Q3VycmVudEVudGl0eVNldFVwZGF0YWJsZVBhdGgoY29udmVydGVyQ29udGV4dCksXG5cdFx0ZGlzcGxheU1vZGU6IGlzSW5EaXNwbGF5TW9kZShjb252ZXJ0ZXJDb250ZXh0LCB0cnVlKSxcblx0XHRjcmVhdGU6IHN0YW5kYXJkQWN0aW9uc0NvbmZpZ3VyYXRpb24uY3JlYXRpb25CZWhhdmlvdXIsXG5cdFx0c2VsZWN0aW9uTW9kZTogc2VsZWN0aW9uTW9kZSxcblx0XHR2YXJpYW50TWFuYWdlbWVudDogdmFyaWFudE1hbmFnZW1lbnQgPT09IFwiQ29udHJvbFwiICYmICFwMTNuTW9kZSA/IFZhcmlhbnRNYW5hZ2VtZW50VHlwZS5Ob25lIDogdmFyaWFudE1hbmFnZW1lbnQsXG5cdFx0dGhyZXNob2xkOiB0aHJlc2hvbGQsXG5cdFx0c29ydENvbmRpdGlvbnM6IGdldFNvcnRDb25kaXRpb25zKGNvbnZlcnRlckNvbnRleHQsIHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uLCBjb2x1bW5zKSxcblx0XHR0aXRsZTogdGl0bGUsXG5cdFx0c2VhcmNoYWJsZTogdGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24udHlwZSAhPT0gXCJBbmFseXRpY2FsVGFibGVcIiAmJiAhKGlzQ29uc3RhbnQoaXNTZWFyY2hhYmxlKSAmJiBpc1NlYXJjaGFibGUudmFsdWUgPT09IGZhbHNlKSxcblx0XHRpbml0aWFsRXhwYW5zaW9uTGV2ZWw6IGdldEluaXRpYWxFeHBhbnNpb25MZXZlbChwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbiksXG5cdFx0cmVxdWlyZWRQcm9wZXJ0aWVzOiBnZXRSZXF1aXJlZFByb3BlcnRpZXMoY29udmVydGVyQ29udGV4dClcblx0XHRcdC5maWx0ZXIoKHByb3BlcnR5KSA9PiBwcm9wZXJ0eT8uJHRhcmdldD8udHlwZSAhPT0gXCJFZG0uQm9vbGVhblwiKVxuXHRcdFx0Lm1hcCgocHJvcGVydHkpID0+IHByb3BlcnR5LnZhbHVlKVxuXHR9O1xufVxuLyoqXG4gKiBHZXRzIHRoZSBkYXRhIHR5cGUgb2YgYSBjb2x1bW4gZm9yIHRoZSBleHBvcnQuXG4gKiBAcGFyYW0gZGF0YVR5cGUgVGhlIGRhdGEgdHlwZSBvZiBhIHByb3BlcnR5LCBjb2x1bW5cbiAqIEBwYXJhbSBpc0FUaW1lem9uZSBJcyB0aGUgZ2l2ZW4gcHJvcGVydHkgYSB0aW1lem9uZVxuICogQHBhcmFtIGlzQ3VycmVuY3kgSXMgdGhlIGdpdmVuIHByb3BlcnR5IGEgY3VycmVuY3lcbiAqIEBwYXJhbSBleHBvcnRTZXR0aW5ncyBUaGUgYWxyZWFkeSBkZXRlY3RlZCBleHBvcnQgc2V0dGluZ3MgZnJvbSBkYXRhZmllbGRzXG4gKiBAcmV0dXJucyBUaGUgc3VwcG9ydGVkIGV4cG9ydCB0eXBlXG4gKi9cbmZ1bmN0aW9uIGdldEV4cG9ydERhdGFUeXBlKFxuXHRkYXRhVHlwZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuXHRpc0FUaW1lem9uZSA9IGZhbHNlLFxuXHRpc0N1cnJlbmN5ID0gZmFsc2UsXG5cdGV4cG9ydFNldHRpbmdzPzogQ29sdW1uRXhwb3J0U2V0dGluZ3Ncbik6IHN0cmluZyB7XG5cdGxldCBleHBvcnREYXRhVHlwZSA9IFwiU3RyaW5nXCI7XG5cdGlmICghZGF0YVR5cGUgfHwgZXhwb3J0U2V0dGluZ3M/LmRhdGFQb2ludFRhcmdldFZhbHVlKSB7XG5cdFx0cmV0dXJuIGV4cG9ydERhdGFUeXBlO1xuXHR9XG5cdGlmIChleHBvcnRTZXR0aW5ncz8uaXNDdXJyZW5jeSB8fCBpc0N1cnJlbmN5KSB7XG5cdFx0cmV0dXJuIFwiQ3VycmVuY3lcIjtcblx0fVxuXHRpZiAoaXNBVGltZXpvbmUpIHtcblx0XHRyZXR1cm4gXCJUaW1lem9uZVwiO1xuXHR9XG5cdGlmIChleHBvcnRTZXR0aW5ncz8ud3JhcCkge1xuXHRcdHJldHVybiBleHBvcnREYXRhVHlwZTtcblx0fVxuXHRzd2l0Y2ggKGRhdGFUeXBlKSB7XG5cdFx0Y2FzZSBcIkVkbS5EZWNpbWFsXCI6XG5cdFx0Y2FzZSBcIkVkbS5JbnQzMlwiOlxuXHRcdGNhc2UgXCJFZG0uSW50NjRcIjpcblx0XHRjYXNlIFwiRWRtLkRvdWJsZVwiOlxuXHRcdGNhc2UgXCJFZG0uQnl0ZVwiOlxuXHRcdFx0ZXhwb3J0RGF0YVR5cGUgPSBcIk51bWJlclwiO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSBcIkVkbS5EYXRlT2ZUaW1lXCI6XG5cdFx0Y2FzZSBcIkVkbS5EYXRlXCI6XG5cdFx0XHRleHBvcnREYXRhVHlwZSA9IFwiRGF0ZVwiO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSBcIkVkbS5EYXRlVGltZU9mZnNldFwiOlxuXHRcdFx0ZXhwb3J0RGF0YVR5cGUgPSBcIkRhdGVUaW1lXCI7XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIFwiRWRtLlRpbWVPZkRheVwiOlxuXHRcdFx0ZXhwb3J0RGF0YVR5cGUgPSBcIlRpbWVcIjtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgXCJFZG0uQm9vbGVhblwiOlxuXHRcdFx0ZXhwb3J0RGF0YVR5cGUgPSBcIkJvb2xlYW5cIjtcblx0XHRcdGJyZWFrO1xuXHRcdGRlZmF1bHQ6XG5cdFx0XHRleHBvcnREYXRhVHlwZSA9IFwiU3RyaW5nXCI7XG5cdH1cblx0cmV0dXJuIGV4cG9ydERhdGFUeXBlO1xufVxuLyoqXG4gKiBTcGxpdHMgdGhlIHZpc3VhbGl6YXRpb24gcGF0aCBpbnRvIG5hdmlnYXRpb24gcHJvcGVydHkgcGF0aCBhbmQgYW5ub3RhdGlvbi5cbiAqIEBwYXJhbSB2aXN1YWxpemF0aW9uUGF0aFxuICogQHJldHVybnMgVGhlIHNwbGl0IHBhdGhcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNwbGl0UGF0aCh2aXN1YWxpemF0aW9uUGF0aDogc3RyaW5nKTogeyBuYXZpZ2F0aW9uUHJvcGVydHlQYXRoOiBzdHJpbmc7IGFubm90YXRpb25QYXRoOiBzdHJpbmcgfSB7XG5cdGNvbnN0IFt0YXJnZXROYXZpZ2F0aW9uUHJvcGVydHlQYXRoLCBhbm5vdGF0aW9uUGF0aF0gPSB2aXN1YWxpemF0aW9uUGF0aC5zcGxpdChcIkBcIik7XG5cdGxldCBuYXZpZ2F0aW9uUHJvcGVydHlQYXRoID0gdGFyZ2V0TmF2aWdhdGlvblByb3BlcnR5UGF0aDtcblx0aWYgKG5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgubGFzdEluZGV4T2YoXCIvXCIpID09PSBuYXZpZ2F0aW9uUHJvcGVydHlQYXRoLmxlbmd0aCAtIDEpIHtcblx0XHQvLyBEcm9wIHRyYWlsaW5nIHNsYXNoXG5cdFx0bmF2aWdhdGlvblByb3BlcnR5UGF0aCA9IG5hdmlnYXRpb25Qcm9wZXJ0eVBhdGguc3Vic3RyaW5nKDAsIG5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgubGVuZ3RoIC0gMSk7XG5cdH1cblx0cmV0dXJuIHsgbmF2aWdhdGlvblByb3BlcnR5UGF0aCwgYW5ub3RhdGlvblBhdGggfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRTZWxlY3Rpb25WYXJpYW50Q29uZmlndXJhdGlvbihcblx0c2VsZWN0aW9uVmFyaWFudFBhdGg6IHN0cmluZyxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+XG4pOiBTZWxlY3Rpb25WYXJpYW50Q29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZCB7XG5cdGNvbnN0IHJlc29sdmVkVGFyZ2V0ID0gY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlUeXBlQW5ub3RhdGlvbihzZWxlY3Rpb25WYXJpYW50UGF0aCk7XG5cdGNvbnN0IHNlbGVjdGlvbjogU2VsZWN0aW9uVmFyaWFudCA9IHJlc29sdmVkVGFyZ2V0LmFubm90YXRpb24gYXMgU2VsZWN0aW9uVmFyaWFudDtcblx0aWYgKHNlbGVjdGlvbikge1xuXHRcdGNvbnN0IHByb3BlcnR5TmFtZXM6IHN0cmluZ1tdID0gW107XG5cdFx0c2VsZWN0aW9uLlNlbGVjdE9wdGlvbnM/LmZvckVhY2goKHNlbGVjdE9wdGlvbjogU2VsZWN0T3B0aW9uVHlwZSkgPT4ge1xuXHRcdFx0Y29uc3QgcHJvcGVydHlOYW1lID0gc2VsZWN0T3B0aW9uLlByb3BlcnR5TmFtZTtcblx0XHRcdGNvbnN0IHByb3BlcnR5UGF0aDogc3RyaW5nID0gcHJvcGVydHlOYW1lPy52YWx1ZSA/PyBcIlwiO1xuXHRcdFx0aWYgKCFwcm9wZXJ0eU5hbWVzLmluY2x1ZGVzKHByb3BlcnR5UGF0aCkpIHtcblx0XHRcdFx0cHJvcGVydHlOYW1lcy5wdXNoKHByb3BlcnR5UGF0aCk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0cmV0dXJuIHtcblx0XHRcdHRleHQ6IHNlbGVjdGlvbj8uVGV4dD8udG9TdHJpbmcoKSxcblx0XHRcdHByb3BlcnR5TmFtZXM6IHByb3BlcnR5TmFtZXNcblx0XHR9O1xuXHR9XG5cdHJldHVybiB1bmRlZmluZWQ7XG59XG5mdW5jdGlvbiBfZ2V0RnVsbFNjcmVlbkJhc2VkT25EZXZpY2UoXG5cdHRhYmxlU2V0dGluZ3M6IFRhYmxlTWFuaWZlc3RTZXR0aW5nc0NvbmZpZ3VyYXRpb24sXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pixcblx0aXNJcGhvbmU6IGJvb2xlYW5cbik6IGJvb2xlYW4ge1xuXHQvLyBJZiBlbmFibGVGdWxsU2NyZWVuIGlzIG5vdCBzZXQsIHVzZSBhcyBkZWZhdWx0IHRydWUgb24gcGhvbmUgYW5kIGZhbHNlIG90aGVyd2lzZVxuXHRsZXQgZW5hYmxlRnVsbFNjcmVlbiA9IHRhYmxlU2V0dGluZ3MuZW5hYmxlRnVsbFNjcmVlbiA/PyBpc0lwaG9uZTtcblx0Ly8gTWFrZSBzdXJlIHRoYXQgZW5hYmxlRnVsbFNjcmVlbiBpcyBub3Qgc2V0IG9uIExpc3RSZXBvcnQgZm9yIGRlc2t0b3Agb3IgdGFibGV0XG5cdGlmICghaXNJcGhvbmUgJiYgZW5hYmxlRnVsbFNjcmVlbiAmJiBjb252ZXJ0ZXJDb250ZXh0LmdldFRlbXBsYXRlVHlwZSgpID09PSBUZW1wbGF0ZVR5cGUuTGlzdFJlcG9ydCkge1xuXHRcdGVuYWJsZUZ1bGxTY3JlZW4gPSBmYWxzZTtcblx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldERpYWdub3N0aWNzKCkuYWRkSXNzdWUoSXNzdWVDYXRlZ29yeS5NYW5pZmVzdCwgSXNzdWVTZXZlcml0eS5Mb3csIElzc3VlVHlwZS5GVUxMU0NSRUVOTU9ERV9OT1RfT05fTElTVFJFUE9SVCk7XG5cdH1cblx0cmV0dXJuIGVuYWJsZUZ1bGxTY3JlZW47XG59XG5mdW5jdGlvbiBfZ2V0TXVsdGlTZWxlY3RNb2RlKFxuXHR0YWJsZVNldHRpbmdzOiBUYWJsZU1hbmlmZXN0U2V0dGluZ3NDb25maWd1cmF0aW9uLFxuXHR0YWJsZVR5cGU6IFRhYmxlVHlwZSxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+XG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRsZXQgbXVsdGlTZWxlY3RNb2RlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cdGlmICh0YWJsZVR5cGUgIT09IFwiUmVzcG9uc2l2ZVRhYmxlXCIpIHtcblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cdHN3aXRjaCAoY29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSkge1xuXHRcdGNhc2UgVGVtcGxhdGVUeXBlLkxpc3RSZXBvcnQ6XG5cdFx0Y2FzZSBUZW1wbGF0ZVR5cGUuT2JqZWN0UGFnZTpcblx0XHRcdG11bHRpU2VsZWN0TW9kZSA9IHRhYmxlU2V0dGluZ3Muc2VsZWN0QWxsID09PSBmYWxzZSA/IFwiQ2xlYXJBbGxcIiA6IFwiRGVmYXVsdFwiO1xuXHRcdFx0aWYgKGNvbnZlcnRlckNvbnRleHQuZ2V0VGVtcGxhdGVUeXBlKCkgPT09IFRlbXBsYXRlVHlwZS5PYmplY3RQYWdlICYmIGNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RXcmFwcGVyKCkudXNlSWNvblRhYkJhcigpKSB7XG5cdFx0XHRcdG11bHRpU2VsZWN0TW9kZSA9ICF0YWJsZVNldHRpbmdzLnNlbGVjdEFsbCA/IFwiQ2xlYXJBbGxcIiA6IFwiRGVmYXVsdFwiO1xuXHRcdFx0fVxuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSBUZW1wbGF0ZVR5cGUuQW5hbHl0aWNhbExpc3RQYWdlOlxuXHRcdFx0bXVsdGlTZWxlY3RNb2RlID0gIXRhYmxlU2V0dGluZ3Muc2VsZWN0QWxsID8gXCJDbGVhckFsbFwiIDogXCJEZWZhdWx0XCI7XG5cdFx0XHRicmVhaztcblx0XHRkZWZhdWx0OlxuXHR9XG5cdHJldHVybiBtdWx0aVNlbGVjdE1vZGU7XG59XG5mdW5jdGlvbiBfZ2V0VGFibGVNb2RlKFxuXHR0YWJsZVR5cGU6IFRhYmxlVHlwZSxcblx0dGFibGVTZXR0aW5nczogVGFibGVNYW5pZmVzdFNldHRpbmdzQ29uZmlndXJhdGlvbixcblx0aXNUZW1wbGF0ZUxpc3RSZXBvcnQ6IGJvb2xlYW5cbik6IHsgcm93Q291bnRNb2RlPzogVGFibGVSb3dDb3VudE1vZGU7IHJvd0NvdW50PzogbnVtYmVyIH0ge1xuXHRpZiAodGFibGVUeXBlICE9PSBcIlJlc3BvbnNpdmVUYWJsZVwiKSB7XG5cdFx0aWYgKGlzVGVtcGxhdGVMaXN0UmVwb3J0KSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRyb3dDb3VudE1vZGU6IFwiQXV0b1wiLFxuXHRcdFx0XHRyb3dDb3VudDogM1xuXHRcdFx0fTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0cm93Q291bnRNb2RlOiB0YWJsZVNldHRpbmdzLnJvd0NvdW50TW9kZSA/PyBcIkZpeGVkXCIsXG5cdFx0XHRcdHJvd0NvdW50OiB0YWJsZVNldHRpbmdzLnJvd0NvdW50ID8/ICh0YWJsZVR5cGUgPT09IFwiR3JpZFRhYmxlXCIgPyA1IDogMTApXG5cdFx0XHR9O1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHRyZXR1cm4ge307XG5cdH1cbn1cbmZ1bmN0aW9uIF9nZXRDb25kZW5zZWRUYWJsZUxheW91dChfdGFibGVUeXBlOiBUYWJsZVR5cGUsIF90YWJsZVNldHRpbmdzOiBUYWJsZU1hbmlmZXN0U2V0dGluZ3NDb25maWd1cmF0aW9uKTogYm9vbGVhbiB7XG5cdHJldHVybiBfdGFibGVTZXR0aW5ncy5jb25kZW5zZWRUYWJsZUxheW91dCAhPT0gdW5kZWZpbmVkICYmIF90YWJsZVR5cGUgIT09IFwiUmVzcG9uc2l2ZVRhYmxlXCJcblx0XHQ/IF90YWJsZVNldHRpbmdzLmNvbmRlbnNlZFRhYmxlTGF5b3V0XG5cdFx0OiBmYWxzZTtcbn1cbmZ1bmN0aW9uIF9nZXRUYWJsZVNlbGVjdGlvbkxpbWl0KF90YWJsZVNldHRpbmdzOiBUYWJsZU1hbmlmZXN0U2V0dGluZ3NDb25maWd1cmF0aW9uKTogbnVtYmVyIHtcblx0cmV0dXJuIF90YWJsZVNldHRpbmdzLnNlbGVjdEFsbCA9PT0gdHJ1ZSB8fCBfdGFibGVTZXR0aW5ncy5zZWxlY3Rpb25MaW1pdCA9PT0gMCA/IDAgOiBfdGFibGVTZXR0aW5ncy5zZWxlY3Rpb25MaW1pdCB8fCAyMDA7XG59XG5mdW5jdGlvbiBfZ2V0VGFibGVJbmxpbmVDcmVhdGlvblJvd0NvdW50KF90YWJsZVNldHRpbmdzOiBUYWJsZU1hbmlmZXN0U2V0dGluZ3NDb25maWd1cmF0aW9uKTogbnVtYmVyIHtcblx0cmV0dXJuIF90YWJsZVNldHRpbmdzLmNyZWF0aW9uTW9kZT8uaW5saW5lQ3JlYXRpb25Sb3dDb3VudCA/IF90YWJsZVNldHRpbmdzLmNyZWF0aW9uTW9kZT8uaW5saW5lQ3JlYXRpb25Sb3dDb3VudCA6IDE7XG59XG5cbmZ1bmN0aW9uIF9nZXRFbmFibGVFeHBvcnQoXG5cdHRhYmxlU2V0dGluZ3M6IFRhYmxlTWFuaWZlc3RTZXR0aW5nc0NvbmZpZ3VyYXRpb24sXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pixcblx0ZW5hYmxlUGFzdGU6IGJvb2xlYW5cbik6IGJvb2xlYW4ge1xuXHRyZXR1cm4gdGFibGVTZXR0aW5ncy5lbmFibGVFeHBvcnQgIT09IHVuZGVmaW5lZFxuXHRcdD8gdGFibGVTZXR0aW5ncy5lbmFibGVFeHBvcnRcblx0XHQ6IGNvbnZlcnRlckNvbnRleHQuZ2V0VGVtcGxhdGVUeXBlKCkgIT09IFwiT2JqZWN0UGFnZVwiIHx8IGVuYWJsZVBhc3RlO1xufVxuZnVuY3Rpb24gX2dldEZyb3plbkNvbHVtbkNvdW50KHRhYmxlU2V0dGluZ3M6IFRhYmxlTWFuaWZlc3RTZXR0aW5nc0NvbmZpZ3VyYXRpb24pOiBudW1iZXIgfCB1bmRlZmluZWQge1xuXHRyZXR1cm4gdGFibGVTZXR0aW5ncy5mcm96ZW5Db2x1bW5Db3VudDtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIHdpZHRoSW5jbHVkaW5nQ29sdW1uSGVhZGVyIHZhbHVlIGZyb20gdGhlIHRhYmxlU2V0dGluZ3MgaWYgaXQgZXhpc3RzLlxuICogQHBhcmFtIHRhYmxlU2V0dGluZ3MgVGFibGVTZXR0aW5ncyBPYmplY3RcbiAqIEByZXR1cm5zIFJldHVybnMgdGhlIHZhbHVlIG9mIHdpZHRoSW5jbHVkaW5nQ29sdW1uSGVhZGVyIG9yIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIF9nZXRXaWR0aEluY2x1ZGluZ0NvbHVtbkhlYWRlcih0YWJsZVNldHRpbmdzOiBUYWJsZU1hbmlmZXN0U2V0dGluZ3NDb25maWd1cmF0aW9uKTogYm9vbGVhbiB7XG5cdHJldHVybiB0YWJsZVNldHRpbmdzLndpZHRoSW5jbHVkaW5nQ29sdW1uSGVhZGVyID8/IGZhbHNlO1xufVxuXG5mdW5jdGlvbiBnZXRGaWx0ZXJDb25maWd1cmF0aW9uKFxuXHR0YWJsZVNldHRpbmdzOiBUYWJsZU1hbmlmZXN0U2V0dGluZ3NDb25maWd1cmF0aW9uLFxuXHRsaW5lSXRlbUFubm90YXRpb246IExpbmVJdGVtLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sXG5cdHNlbGVjdGlvblZhcmlhbnRBbm5vdGF0aW9uOiBTZWxlY3Rpb25WYXJpYW50VHlwZSB8IHVuZGVmaW5lZFxuKToge1xuXHRmaWx0ZXJzOiBQYXJ0aWFsPFJlY29yZDxcInF1aWNrRmlsdGVyc1wiIHwgXCJoaWRkZW5GaWx0ZXJzXCIsIFRhYmxlRmlsdGVyc0NvbmZpZ3VyYXRpb24+Pjtcblx0aGVhZGVyVmlzaWJsZTogYm9vbGVhbjtcbn0ge1xuXHRsZXQgaGlkZVRhYmxlVGl0bGUgPSBmYWxzZTtcblx0Y29uc3QgZmlsdGVyczogUGFydGlhbDxSZWNvcmQ8XCJxdWlja0ZpbHRlcnNcIiB8IFwiaGlkZGVuRmlsdGVyc1wiLCBUYWJsZUZpbHRlcnNDb25maWd1cmF0aW9uPj4gPSB7fTtcblx0Y29uc3QgdGFyZ2V0RW50aXR5VHlwZSA9IGNvbnZlcnRlckNvbnRleHQuZ2V0QW5ub3RhdGlvbkVudGl0eVR5cGUobGluZUl0ZW1Bbm5vdGF0aW9uKTtcblx0aWYgKHRhYmxlU2V0dGluZ3MucXVpY2tWYXJpYW50U2VsZWN0aW9uKSB7XG5cdFx0Y29uc3QgcXVpY2tGaWx0ZXJQYXRocyA9ICh0YWJsZVNldHRpbmdzLnF1aWNrVmFyaWFudFNlbGVjdGlvbi5wYXRocyA/PyBbXSkucmVkdWNlKFxuXHRcdFx0KGZpbHRlclBhdGhzOiB7IGFubm90YXRpb25QYXRoOiBzdHJpbmcgfVtdLCBwYXRoKSA9PiB7XG5cdFx0XHRcdGlmICh0YXJnZXRFbnRpdHlUeXBlLnJlc29sdmVQYXRoKHBhdGguYW5ub3RhdGlvblBhdGgpKSB7XG5cdFx0XHRcdFx0ZmlsdGVyUGF0aHMucHVzaCh7IGFubm90YXRpb25QYXRoOiBwYXRoLmFubm90YXRpb25QYXRoIH0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBmaWx0ZXJQYXRocztcblx0XHRcdH0sXG5cdFx0XHRbXVxuXHRcdCk7XG5cdFx0aWYgKHF1aWNrRmlsdGVyUGF0aHMubGVuZ3RoKSB7XG5cdFx0XHRmaWx0ZXJzLnF1aWNrRmlsdGVycyA9IHtcblx0XHRcdFx0c2hvd0NvdW50czogdGFibGVTZXR0aW5ncy5xdWlja1ZhcmlhbnRTZWxlY3Rpb24uc2hvd0NvdW50cyxcblx0XHRcdFx0cGF0aHM6IHF1aWNrRmlsdGVyUGF0aHNcblx0XHRcdH07XG5cdFx0fVxuXHR9XG5cdGlmIChzZWxlY3Rpb25WYXJpYW50QW5ub3RhdGlvbikge1xuXHRcdC8qKlxuXHRcdCAqIFByb3ZpZGUgU2VsZWN0aW9uIFZhcmlhbnQgdG8gaGlkZGVuRmlsdGVycyBpbiBvcmRlciB0byBzZXQgdGhlIFNWIGZpbHRlcnMgdG8gdGhlIHRhYmxlLlxuXHRcdCAqIE1EQyBUYWJsZSBvdmVycmlkZXMgYmluZGluZyBGaWx0ZXIgYW5kIGZyb20gU0FQIEZFIHRoZSBvbmx5IG1ldGhvZCB3aGVyZSB3ZSBhcmUgYWJsZSB0byBhZGRcblx0XHQgKiBhZGRpdGlvbmFsIGZpbHRlciBpcyAncmViaW5kVGFibGUnIGludG8gVGFibGUgZGVsZWdhdGUuXG5cdFx0ICogVG8gYXZvaWQgaW1wbGVtZW50aW5nIHNwZWNpZmljIExSIGZlYXR1cmUgdG8gU0FQIEZFIE1hY3JvIFRhYmxlLCB0aGUgZmlsdGVyKHMpICBub3QgbWFuYWdlZCBieSB0aGUgRmlsdGVyQmFyXG5cdFx0ICogY2FuIGJlIHBhc3NlZCB0byBtYWNybyB0YWJsZSB2aWEgcGFyYW1ldGVyL2NvbnRleHQgbmFtZWQgZmlsdGVycyBhbmQga2V5IGhpZGRlbkZpbHRlcnMuXG5cdFx0ICovXG5cdFx0ZmlsdGVycy5oaWRkZW5GaWx0ZXJzID0geyBwYXRoczogW3sgYW5ub3RhdGlvblBhdGg6IGBAJHtzZWxlY3Rpb25WYXJpYW50QW5ub3RhdGlvbi5mdWxseVF1YWxpZmllZE5hbWUuc3BsaXQoXCJAXCIpWzFdfWAgfV0gfTtcblx0fVxuXG5cdGhpZGVUYWJsZVRpdGxlID0gISF0YWJsZVNldHRpbmdzLnF1aWNrVmFyaWFudFNlbGVjdGlvbj8uaGlkZVRhYmxlVGl0bGU7XG5cdHJldHVybiB7XG5cdFx0ZmlsdGVyczogZmlsdGVycyxcblx0XHRoZWFkZXJWaXNpYmxlOiAhKGZpbHRlcnM/LnF1aWNrRmlsdGVycyAmJiBoaWRlVGFibGVUaXRsZSlcblx0fTtcbn1cbi8qKlxuICogQWRkcyB0aGUgdG9vbHRpcCBjb25maWd1cmF0aW9uIGZvciBhIGdpdmVuIGNvbHVtbi5cbiAqIEBwYXJhbSBwcm9wZXJ0eSBUaGUgcHJvcGVydHkgcmVmZXJlbmNlZCBvbiB0aGUgY29sdW1uXG4gKiBAcGFyYW0gY29sdW1uIFRoZSBjb2x1bW4gdG8gYmUgdXBkYXRlZFxuICovXG5mdW5jdGlvbiBfYWRkVG9vbFRpcChwcm9wZXJ0eTogUHJvcGVydHksIGNvbHVtbjogQW5ub3RhdGlvblRhYmxlQ29sdW1uKTogdm9pZCB7XG5cdGNvbnN0IHRvb2x0aXAgPSBfZ2V0VG9vbHRpcChwcm9wZXJ0eSkgPz8gY29sdW1uLmxhYmVsO1xuXHRpZiAodG9vbHRpcCkge1xuXHRcdGNvbHVtbi50b29sdGlwID0gdG9vbHRpcDtcblx0fVxufVxuZnVuY3Rpb24gX2dldENvbGxlY3RlZE5hdmlnYXRpb25Qcm9wZXJ0eUxhYmVscyhcblx0cmVsYXRpdmVQYXRoOiBzdHJpbmcsXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0PlxuKTogc3RyaW5nW10gfCB1bmRlZmluZWQge1xuXHRjb25zdCBuYXZpZ2F0aW9uUHJvcGVydGllcyA9IGVuaGFuY2VEYXRhTW9kZWxQYXRoKGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpLCByZWxhdGl2ZVBhdGgpLm5hdmlnYXRpb25Qcm9wZXJ0aWVzO1xuXHRpZiAobmF2aWdhdGlvblByb3BlcnRpZXM/Lmxlbmd0aCA+IDApIHtcblx0XHRjb25zdCBjb2xsZWN0ZWROYXZpZ2F0aW9uUHJvcGVydHlMYWJlbHM6IHN0cmluZ1tdID0gW107XG5cdFx0bmF2aWdhdGlvblByb3BlcnRpZXMuZm9yRWFjaCgobmF2UHJvcGVydHkpID0+IHtcblx0XHRcdGNvbGxlY3RlZE5hdmlnYXRpb25Qcm9wZXJ0eUxhYmVscy5wdXNoKGdldExhYmVsKG5hdlByb3BlcnR5KSB8fCBuYXZQcm9wZXJ0eS5uYW1lKTtcblx0XHR9KTtcblx0XHRyZXR1cm4gY29sbGVjdGVkTmF2aWdhdGlvblByb3BlcnR5TGFiZWxzO1xuXHR9XG59XG4vKipcbiAqIERldGVybWluZXMgaWYgdGhlIGFjdGlvbiB3aWxsIGhhdmUgYW4gZXhwcmVzc2lvbiBmb3IgZW5hYmxlbWVudCBnZW5lcmF0ZWQuXG4gKiBAcGFyYW0gZGF0YUZpZWxkIFRoZSBkYXRhRmllbGQgY29udGFpbmluZyBhbiBhY3Rpb25cbiAqIEBwYXJhbSBzRW50aXR5VHlwZSBUaGUgY3VycmVudCBlbnRpdHkgZm9yIHRlbXBsYXRpbmdcbiAqIEByZXR1cm5zIFdoZXRoZXIgYW4gZXhwcmVzc2lvbiBmb3IgZW5hYmxlbWVudCBpcyB0byBiZSBnZW5lcmF0ZWRcbiAqL1xuZnVuY3Rpb24gX3VzZUVuYWJsZWRFeHByZXNzaW9uKGRhdGFGaWVsZDogRGF0YUZpZWxkRm9yQWN0aW9uVHlwZXMsIHNFbnRpdHlUeXBlOiBzdHJpbmcpOiBib29sZWFuIHtcblx0Ly8gVGhlcmUgYXJlIHRocmVlIGNhc2VzIHdoZW4gYSB0YWJsZSBhY3Rpb24gaGFzIGFuIE9wZXJhdGlvbkF2YWlsYWJsZSB0aGF0IGxlYWRzIHRvIGFuIGVuYWJsZW1lbnQgZXhwcmVzc2lvblxuXHQvLyBhbmQgaXMgbm90IGRlcGVuZGVudCB1cG9uIHRoZSB0YWJsZSBlbnRyaWVzLlxuXHQvLyAxLiBBbiBhY3Rpb24gd2l0aCBhbiBvdmVybG9hZCwgdGhhdCBpcyBleGVjdXRlZCBhZ2FpbnN0IGEgcGFyZW50IGVudGl0eS5cblx0Ly8gMi4gQW4gdW5ib3VuZCBhY3Rpb25cblx0Ly8gMy4gQSBzdGF0aWMgYWN0aW9uICh0aGF0IGlzLCBib3VuZCB0byBhIGNvbGxlY3Rpb24pXG5cdGxldCB1c2VFbmFibGVkRXhwcmVzc2lvbiA9IGZhbHNlO1xuXHRpZiAoZGF0YUZpZWxkLkFjdGlvblRhcmdldD8uYW5ub3RhdGlvbnM/LkNvcmU/Lk9wZXJhdGlvbkF2YWlsYWJsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0Ly8gVW5ib3VuZCBhY3Rpb24uIElzIHJlY29nbmlzZWQsIGJ1dCBnZXRFeHByZXNzaW9uRnJvbUFubm90YXRpb24gY2hlY2tzIGZvciBpc0JvdW5kID0gdHJ1ZSwgc28gbm90IGdlbmVyYXRlZC5cblx0XHRjb25zdCBpc0JvdW5kID0gZGF0YUZpZWxkLkFjdGlvblRhcmdldD8uaXNCb3VuZDtcblx0XHQvL292ZXJsb2FkIGFjdGlvblxuXHRcdGNvbnN0IG92ZXJsb2FkQWN0aW9uID0gaXNCb3VuZCAmJiBkYXRhRmllbGQuQWN0aW9uVGFyZ2V0Py5zb3VyY2VUeXBlICE9PSBzRW50aXR5VHlwZTtcblx0XHQvL3N0YXRpYyBhY3Rpb25cblx0XHRjb25zdCBzdGF0aWNBY3Rpb24gPSBkYXRhRmllbGQuQWN0aW9uVGFyZ2V0Py5wYXJhbWV0ZXJzWzBdPy5pc0NvbGxlY3Rpb247XG5cdFx0Ly9jb3B5IGFjdGlvblxuXHRcdGlmICghaXNCb3VuZCB8fCBvdmVybG9hZEFjdGlvbiB8fCBzdGF0aWNBY3Rpb24pIHtcblx0XHRcdHVzZUVuYWJsZWRFeHByZXNzaW9uID0gdHJ1ZTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIHVzZUVuYWJsZWRFeHByZXNzaW9uO1xufVxuXG4vKipcbiAqIFVwZGF0ZXMgdGhlIHRhYmxlIGNvbnRyb2wgY29uZmlndXJhdGlvbiB3aXRoIFRyZWUtVGFibGUgc3BlY2lmaWMgaW5mb3JtYXRpb24uXG4gKiBAcGFyYW0gdGFibGVDb25maWd1cmF0aW9uIFRoZSB0YWJsZSBjb25maWd1cmF0aW9uXG4gKiBAcGFyYW0gdGFibGVTZXR0aW5ncyBTZXR0aW5ncyBmcm9tIHRoZSBtYW5pZmVzdFxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGluc3RhbmNlIG9mIHRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICovXG5mdW5jdGlvbiB1cGRhdGVUcmVlVGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24oXG5cdHRhYmxlQ29uZmlndXJhdGlvbjogVGFibGVDb250cm9sQ29uZmlndXJhdGlvbixcblx0dGFibGVTZXR0aW5nczogVGFibGVNYW5pZmVzdFNldHRpbmdzQ29uZmlndXJhdGlvbixcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dFxuKTogdm9pZCB7XG5cdGNvbnN0IGRhdGFNb2RlbE9iamVjdFBhdGggPSBjb252ZXJ0ZXJDb250ZXh0LmdldERhdGFNb2RlbE9iamVjdFBhdGgoKTtcblx0dGFibGVDb25maWd1cmF0aW9uLmhpZXJhcmNoeVF1YWxpZmllciA9IHRhYmxlU2V0dGluZ3MuaGllcmFyY2h5UXVhbGlmaWVyO1xuXHRjb25zdCBoaWVyYXJjaHlQYXJlbnROYXZpZ2F0aW9uUHJvcGVydHlQYXRoID0gZ2V0SGllcmFyY2h5UGFyZW50TmF2aWdhdGlvblByb3BlcnR5UGF0aChcblx0XHRkYXRhTW9kZWxPYmplY3RQYXRoLFxuXHRcdHRhYmxlQ29uZmlndXJhdGlvbi5oaWVyYXJjaHlRdWFsaWZpZXIhXG5cdCk7XG5cdGNvbnN0IG5vblVwZGF0YWJsZU5hdmlnYXRpb25Qcm9wZXJ0aWVzID0gZ2V0Tm9uVXBkYXRhYmxlTmF2aWdhdGlvblByb3BlcnRpZXMoZGF0YU1vZGVsT2JqZWN0UGF0aCk7XG5cdHRhYmxlQ29uZmlndXJhdGlvbi5pc0hpZXJhcmNoeVBhcmVudE5vZGVVcGRhdGFibGUgPSAhbm9uVXBkYXRhYmxlTmF2aWdhdGlvblByb3BlcnRpZXM/LmluY2x1ZGVzKGhpZXJhcmNoeVBhcmVudE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgpO1xuXHR0YWJsZUNvbmZpZ3VyYXRpb24uaXNOb2RlTW92YWJsZSA9IGdldEN1c3RvbUZ1bmN0aW9uSW5mbyh0YWJsZVNldHRpbmdzLmlzTm9kZU1vdmFibGUsIHRhYmxlQ29uZmlndXJhdGlvbik7XG5cdHRhYmxlQ29uZmlndXJhdGlvbi5pc01vdmVUb1Bvc2l0aW9uQWxsb3dlZCA9IGdldEN1c3RvbUZ1bmN0aW9uSW5mbyh0YWJsZVNldHRpbmdzLmlzTW92ZVRvUG9zaXRpb25BbGxvd2VkLCB0YWJsZUNvbmZpZ3VyYXRpb24pO1xuXHR0YWJsZUNvbmZpZ3VyYXRpb24uY3JlYXRlRW5hYmxlbWVudCA9IGdldEN1c3RvbUZ1bmN0aW9uSW5mbyh0YWJsZVNldHRpbmdzLmNyZWF0aW9uTW9kZT8uaXNDcmVhdGVFbmFibGVkLCB0YWJsZUNvbmZpZ3VyYXRpb24pO1xuXG5cdGlmICh0YWJsZVNldHRpbmdzLmNyZWF0aW9uTW9kZT8ubm9kZVR5cGU/LnByb3BlcnR5TmFtZSAmJiB0YWJsZVNldHRpbmdzLmNyZWF0aW9uTW9kZT8ubm9kZVR5cGU/LnZhbHVlcykge1xuXHRcdGNvbnN0IHZhbHVlcyA9IHRhYmxlU2V0dGluZ3MuY3JlYXRpb25Nb2RlLm5vZGVUeXBlLnZhbHVlcztcblx0XHR0YWJsZUNvbmZpZ3VyYXRpb24ubm9kZVR5cGUgPSB7XG5cdFx0XHRwcm9wZXJ0eU5hbWU6IHRhYmxlU2V0dGluZ3MuY3JlYXRpb25Nb2RlLm5vZGVUeXBlLnByb3BlcnR5TmFtZSxcblx0XHRcdHZhbHVlczogT2JqZWN0LmtleXModmFsdWVzKS5tYXAoKHZhbHVlKSA9PiB7XG5cdFx0XHRcdGNvbnN0IG5vZGVUeXBlSW5mbyA9IHZhbHVlc1t2YWx1ZV07XG5cblx0XHRcdFx0aWYgKHR5cGVvZiBub2RlVHlwZUluZm8gPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0dmFsdWUsXG5cdFx0XHRcdFx0XHR0ZXh0OiBub2RlVHlwZUluZm9cblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0XHR2YWx1ZSxcblx0XHRcdFx0XHRcdHRleHQ6IG5vZGVUeXBlSW5mby5sYWJlbCxcblx0XHRcdFx0XHRcdGNyZWF0aW9uRGlhbG9nRmllbGRzOlxuXHRcdFx0XHRcdFx0XHR0YWJsZUNvbmZpZ3VyYXRpb24uY3JlYXRpb25Nb2RlID09PSBDcmVhdGlvbk1vZGUuQ3JlYXRpb25EaWFsb2dcblx0XHRcdFx0XHRcdFx0XHQ/IGdldEZpZWxkTGlzdChub2RlVHlwZUluZm8uY3JlYXRpb25GaWVsZHMsIGNvbnZlcnRlckNvbnRleHQpXG5cdFx0XHRcdFx0XHRcdFx0OiB1bmRlZmluZWRcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9XG5cdFx0XHR9KVxuXHRcdH07XG5cdH1cblxuXHQvLyBDcmVhdGUgaW4gcGxhY2Vcblx0aWYgKHRhYmxlU2V0dGluZ3MuY3JlYXRpb25Nb2RlPy5jcmVhdGVJblBsYWNlKSB7XG5cdFx0dGFibGVDb25maWd1cmF0aW9uLmNyZWF0ZUluUGxhY2UgPSB0cnVlO1xuXHR9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDdXN0b21GdW5jdGlvbkluZm8oXG5cdHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG5cdHRhYmxlQ29uZmlndXJhdGlvbjogVGFibGVDb250cm9sQ29uZmlndXJhdGlvblxuKTogRXh0ZXJuYWxNZXRob2RDb25maWcgfCB1bmRlZmluZWQge1xuXHRpZiAoIXZhbHVlKSB7XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxuXHRjb25zdCBsYXN0RG90SW5kZXggPSB2YWx1ZS5sYXN0SW5kZXhPZihcIi5cIikgfHwgLTE7XG5cdGNvbnN0IG1vZHVsZU5hbWUgPSB2YWx1ZS5zdWJzdHJpbmcoMCwgbGFzdERvdEluZGV4KS5yZXBsYWNlKC9cXC4vZ2ksIFwiL1wiKTtcblx0Y29uc3QgbWV0aG9kTmFtZSA9IHZhbHVlLnN1YnN0cmluZyhsYXN0RG90SW5kZXggKyAxKTtcblxuXHQvLyBBZGQgdGhlIGN1c3RvbSBtb2R1bGUgaW4gdGhlIGxpc3Qgb2YgcmVxdWlyZWQgbW9kdWxlcyBpZiBuZWNlc3Nhcnlcblx0aWYgKCFtb2R1bGVOYW1lLnN0YXJ0c1dpdGgoXCIvZXh0ZW5zaW9uL1wiKSkge1xuXHRcdGlmICghdGFibGVDb25maWd1cmF0aW9uLmFkZGl0aW9uYWxSZXF1aXJlZE1vZHVsZXMpIHtcblx0XHRcdHRhYmxlQ29uZmlndXJhdGlvbi5hZGRpdGlvbmFsUmVxdWlyZWRNb2R1bGVzID0gW21vZHVsZU5hbWVdO1xuXHRcdH0gZWxzZSBpZiAoIXRhYmxlQ29uZmlndXJhdGlvbi5hZGRpdGlvbmFsUmVxdWlyZWRNb2R1bGVzLmluY2x1ZGVzKG1vZHVsZU5hbWUpKSB7XG5cdFx0XHR0YWJsZUNvbmZpZ3VyYXRpb24uYWRkaXRpb25hbFJlcXVpcmVkTW9kdWxlcy5wdXNoKG1vZHVsZU5hbWUpO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiB7IG1vZHVsZU5hbWUsIG1ldGhvZE5hbWUgfTtcbn1cblxuLyoqXG4gKiBSZXRyaWV2ZSB0aGUgdGFibGUgY29udHJvbCBjb25maWd1cmF0aW9uIG9wdGltaXN0aWMgYmF0Y2ggaW5mb3JtYXRpb24uXG4gKiBAcGFyYW0gdGFibGVNYW5pZmVzdFNldHRpbmdzIFRoZSB0YWJsZSBjb25maWd1cmF0aW9uXG4gQHJldHVybnMgVHJ1ZSBpZiBPcHRpbWlzdGljIGJhdGNoIG1vZGUgaXMgZGlzYWJsZWRcbiAqL1xuZnVuY3Rpb24gZ2V0T3B0aW1pc3RpY0JhdGNoU2V0dGluZ3NGcm9tTWFuaWZlc3QodGFibGVNYW5pZmVzdFNldHRpbmdzOiBUYWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbik6IGJvb2xlYW4ge1xuXHQvLyBPcHRpbWlzdGljIGJhdGNoIGlzIHNldCBieSBkZWZhdWx0XG5cdHJldHVybiB0YWJsZU1hbmlmZXN0U2V0dGluZ3M/LnRhYmxlU2V0dGluZ3M/LmRpc2FibGVSZXF1ZXN0Q2FjaGUgfHwgZmFsc2U7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgc2V0dGluZ3MgY29taW5nIGZyb20gdGhlIG1hbmlmZXN0IHJlbGF0ZWQgdG8gdGhlIG1hc3MgZWRpdCBkaWFsb2cuXG4gKiBAcGFyYW0gdGFibGVTZXR0aW5ncyBUaGUgdGFibGUgY29uZmlndXJhdGlvblxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGluc3RhbmNlIG9mIHRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHJldHVybnMgVGhlIG1hc3MgZWRpdCBjb25maWd1cmF0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWFzc0VkaXRTZXR0aW5ncyhcblx0dGFibGVTZXR0aW5nczogVGFibGVNYW5pZmVzdFNldHRpbmdzQ29uZmlndXJhdGlvbixcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+XG4pOiBNYXNzRWRpdFRhYmxlQ29uZmlndXJhdGlvbiB7XG5cdGNvbnN0IGRlZmF1bHRGaWVsZENvbmZpZ3VyYXRpb24gPSB7XG5cdFx0dmlzaWJsZUZpZWxkczogW10sXG5cdFx0aWdub3JlZEZpZWxkczogW10sXG5cdFx0b3BlcmF0aW9uR3JvdXBpbmdNb2RlOlxuXHRcdFx0Y29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSA9PT0gVGVtcGxhdGVUeXBlLkxpc3RSZXBvcnRcblx0XHRcdFx0PyBPcGVyYXRpb25Hcm91cGluZ01vZGUuSXNvbGF0ZWRcblx0XHRcdFx0OiBPcGVyYXRpb25Hcm91cGluZ01vZGUuQ2hhbmdlU2V0XG5cdH07XG5cdGlmICghdGFibGVTZXR0aW5ncy5lbmFibGVNYXNzRWRpdCkge1xuXHRcdHJldHVybiB7IGVuYWJsZWQ6IGZhbHNlLCAuLi5kZWZhdWx0RmllbGRDb25maWd1cmF0aW9uIH07XG5cdH1cblx0aWYgKHRhYmxlU2V0dGluZ3MuZW5hYmxlTWFzc0VkaXQgPT09IHRydWUpIHtcblx0XHRyZXR1cm4geyBlbmFibGVkOiB0YWJsZVNldHRpbmdzLmVuYWJsZU1hc3NFZGl0LCAuLi5kZWZhdWx0RmllbGRDb25maWd1cmF0aW9uIH07XG5cdH0gZWxzZSBpZiAodHlwZW9mIHRhYmxlU2V0dGluZ3MuZW5hYmxlTWFzc0VkaXQgPT09IFwib2JqZWN0XCIpIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0ZW5hYmxlZDogdHJ1ZSxcblx0XHRcdHZpc2libGVGaWVsZHM6IGdldEZpZWxkTGlzdCh0YWJsZVNldHRpbmdzLmVuYWJsZU1hc3NFZGl0LnZpc2libGVGaWVsZHMsIGNvbnZlcnRlckNvbnRleHQpLFxuXHRcdFx0aWdub3JlZEZpZWxkczogZ2V0RmllbGRMaXN0KHRhYmxlU2V0dGluZ3MuZW5hYmxlTWFzc0VkaXQuaWdub3JlZEZpZWxkcywgY29udmVydGVyQ29udGV4dCksXG5cdFx0XHRvcGVyYXRpb25Hcm91cGluZ01vZGU6XG5cdFx0XHRcdHRhYmxlU2V0dGluZ3MuZW5hYmxlTWFzc0VkaXQub3BlcmF0aW9uR3JvdXBpbmdNb2RlICYmXG5cdFx0XHRcdE9iamVjdC52YWx1ZXMoT3BlcmF0aW9uR3JvdXBpbmdNb2RlKS5pbmNsdWRlcyh0YWJsZVNldHRpbmdzLmVuYWJsZU1hc3NFZGl0Lm9wZXJhdGlvbkdyb3VwaW5nTW9kZSlcblx0XHRcdFx0XHQ/IHRhYmxlU2V0dGluZ3MuZW5hYmxlTWFzc0VkaXQub3BlcmF0aW9uR3JvdXBpbmdNb2RlXG5cdFx0XHRcdFx0OiBkZWZhdWx0RmllbGRDb25maWd1cmF0aW9uLm9wZXJhdGlvbkdyb3VwaW5nTW9kZSxcblx0XHRcdGN1c3RvbUZyYWdtZW50OiB0YWJsZVNldHRpbmdzLmVuYWJsZU1hc3NFZGl0LmN1c3RvbUZyYWdtZW50XG5cdFx0fTtcblx0fVxuXHRyZXR1cm4geyBlbmFibGVkOiBmYWxzZSwgLi4uZGVmYXVsdEZpZWxkQ29uZmlndXJhdGlvbiB9O1xufVxuXG4vKipcbiAqIEdldHMgYSBsaXN0IG9mIHRoZSBmaWVsZHMgY29taW5nIGZyb20gdGhlIG1hbmlmZXN0LlxuICogQHBhcmFtIGZpZWxkcyBUaGUgZmllbGRzLCBjb3VsZCBiZSBhIEZpZWxkR3JvdXAgb3IgZmllbGRzIHNlcGFyYXRlZCBieSBhIGNvbW1hXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCBUaGUgaW5zdGFuY2Ugb2YgdGhlIGNvbnZlcnRlciBjb250ZXh0XG4gKiBAcmV0dXJucyBUaGUgbGlzdCBvZiBmaWVsZHMuXG4gKi9cbmZ1bmN0aW9uIGdldEZpZWxkTGlzdChmaWVsZHM6IHN0cmluZyB8IHVuZGVmaW5lZCwgY29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+KTogc3RyaW5nW10ge1xuXHRpZiAoIWZpZWxkcykge1xuXHRcdHJldHVybiBbXTtcblx0fVxuXHRpZiAoZmllbGRzLnN0YXJ0c1dpdGgoVUlBbm5vdGF0aW9uVGVybXMuRmllbGRHcm91cCkpIHtcblx0XHRjb25zdCBmaWVsZEdyb3VwID0gY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlUeXBlQW5ub3RhdGlvbjxGaWVsZEdyb3VwPihgQCR7ZmllbGRzfWApO1xuXHRcdGlmIChpc0Fubm90YXRpb25PZlR5cGU8RmllbGRHcm91cD4oZmllbGRHcm91cC5hbm5vdGF0aW9uLCBVSUFubm90YXRpb25UeXBlcy5GaWVsZEdyb3VwVHlwZSkpIHtcblx0XHRcdHJldHVybiBmaWVsZEdyb3VwLmFubm90YXRpb24uRGF0YS5yZWR1Y2UoKHByb3BlcnRpZXM6IHN0cmluZ1tdLCBmaWVsZCkgPT4ge1xuXHRcdFx0XHRpZiAoaXNEYXRhRmllbGQoZmllbGQpICYmIGlzUGF0aEFubm90YXRpb25FeHByZXNzaW9uKGZpZWxkLlZhbHVlKSkge1xuXHRcdFx0XHRcdHByb3BlcnRpZXMucHVzaChmaWVsZC5WYWx1ZS5wYXRoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gcHJvcGVydGllcztcblx0XHRcdH0sIFtdKTtcblx0XHR9XG5cdFx0cmV0dXJuIFtdO1xuXHR9XG5cdHJldHVybiBmaWVsZHNcblx0XHQucmVwbGFjZSgvXFxzL2csIFwiXCIpXG5cdFx0LnNwbGl0KFwiLFwiKVxuXHRcdC5tYXAoKG5hbWUpID0+IG5hbWUudHJpbSgpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uKFxuXHRsaW5lSXRlbUFubm90YXRpb246IExpbmVJdGVtIHwgdW5kZWZpbmVkLFxuXHR2aXN1YWxpemF0aW9uUGF0aDogc3RyaW5nLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sXG5cdGNoZWNrQ29uZGVuc2VkTGF5b3V0ID0gdHJ1ZSxcblx0c2VsZWN0aW9uVmFyaWFudEFubm90YXRpb24/OiBTZWxlY3Rpb25WYXJpYW50VHlwZVxuKTogVGFibGVDb250cm9sQ29uZmlndXJhdGlvbiB7XG5cdGNvbnN0IF9tYW5pZmVzdFdyYXBwZXIgPSBjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0V3JhcHBlcigpO1xuXHRjb25zdCB0YWJsZU1hbmlmZXN0U2V0dGluZ3M6IFRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uID0gY29udmVydGVyQ29udGV4dC5nZXRNYW5pZmVzdENvbnRyb2xDb25maWd1cmF0aW9uKHZpc3VhbGl6YXRpb25QYXRoKTtcblx0Y29uc3QgdGFibGVTZXR0aW5ncyA9IHRhYmxlTWFuaWZlc3RTZXR0aW5ncz8udGFibGVTZXR0aW5ncyA/PyB7fTtcblx0Y29uc3QgZ2xvYmFsRkVNYW5pZmVzdFNldHRpbmdzID0gX21hbmlmZXN0V3JhcHBlci5nZXRTYXBGZU1hbmlmZXN0Q29uZmlndXJhdGlvbigpO1xuXHRjb25zdCBkZWZhdWx0Q3JlYXRpb25Nb2RlID1cblx0XHRnbG9iYWxGRU1hbmlmZXN0U2V0dGluZ3M/Lm1hY3Jvcz8udGFibGU/LmRlZmF1bHRDcmVhdGlvbk1vZGUgPT09IFwiSW5saW5lQ3JlYXRpb25Sb3dzXCIgPyBDcmVhdGlvbk1vZGUuSW5saW5lQ3JlYXRpb25Sb3dzIDogdW5kZWZpbmVkO1xuXHRjb25zdCBjcmVhdGlvbk1vZGU6IENyZWF0aW9uTW9kZSA9IHRhYmxlU2V0dGluZ3MuY3JlYXRpb25Nb2RlPy5uYW1lID8/IGRlZmF1bHRDcmVhdGlvbk1vZGUgPz8gQ3JlYXRpb25Nb2RlLk5ld1BhZ2U7XG5cdGNvbnN0IGVuYWJsZUF1dG9Db2x1bW5XaWR0aCA9ICFfbWFuaWZlc3RXcmFwcGVyLmlzUGhvbmUoKTtcblx0Y29uc3QgZGlzYWJsZUNvcHlUb0NsaXBib2FyZCA9IHRhYmxlU2V0dGluZ3MuZGlzYWJsZUNvcHlUb0NsaXBib2FyZDtcblx0Y29uc3QgdGVtcGxhdGVUeXBlID0gY29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKTtcblx0Y29uc3QgaXNDb25kZW5zZWRUYWJsZUxheW91dENvbXBsaWFudCA9IGNoZWNrQ29uZGVuc2VkTGF5b3V0ICYmIF9tYW5pZmVzdFdyYXBwZXIuaXNDb25kZW5zZWRMYXlvdXRDb21wbGlhbnQoKTtcblx0Y29uc3Qgb0ZpbHRlckNvbmZpZ3VyYXRpb24gPSBsaW5lSXRlbUFubm90YXRpb25cblx0XHQ/IGdldEZpbHRlckNvbmZpZ3VyYXRpb24odGFibGVTZXR0aW5ncywgbGluZUl0ZW1Bbm5vdGF0aW9uLCBjb252ZXJ0ZXJDb250ZXh0LCBzZWxlY3Rpb25WYXJpYW50QW5ub3RhdGlvbilcblx0XHQ6IHt9O1xuXHRjb25zdCBjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24gPSB0YWJsZVNldHRpbmdzLmNyZWF0aW9uTW9kZT8uY3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uO1xuXHRjb25zdCBleHBvcnRSZXF1ZXN0U2l6ZSA9IHRhYmxlU2V0dGluZ3MuZXhwb3J0UmVxdWVzdFNpemU7XG5cdGNvbnN0IHRhYmxlVHlwZSA9IGdldFRhYmxlVHlwZShjb252ZXJ0ZXJDb250ZXh0LCB0YWJsZU1hbmlmZXN0U2V0dGluZ3MpO1xuXHRjb25zdCBhbmFseXRpY2FsQ29uZmlndXJhdGlvbiA9IHRhYmxlU2V0dGluZ3MuYW5hbHl0aWNhbENvbmZpZ3VyYXRpb247XG5cdC8vIEJ5IGRlZmF1bHQsIHBhc3RlIGlzIGVuYWJsZWQgb24gYW4gT2JqZWN0UGFnZSBhbmQgb24gYSBMaXN0UmVwb3J0IHdpdGggYSBkcmFmdCBUcmVlVGFibGVcblx0Y29uc3QgZW5hYmxlUGFzdGUgPVxuXHRcdHRhYmxlU2V0dGluZ3MuZW5hYmxlUGFzdGUgPz9cblx0XHQoY29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSA9PT0gXCJPYmplY3RQYWdlXCIgfHxcblx0XHRcdCh0YWJsZVR5cGUgPT09IFwiVHJlZVRhYmxlXCIgJiYgKGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0KCkgYXMgRW50aXR5U2V0KT8uYW5ub3RhdGlvbnMuQ29tbW9uPy5EcmFmdFJvb3QgIT09IHVuZGVmaW5lZCkpO1xuXHRjb25zdCB0YWJsZVJvd01vZGUgPSBfZ2V0VGFibGVNb2RlKHRhYmxlVHlwZSwgdGFibGVTZXR0aW5ncywgdGVtcGxhdGVUeXBlID09PSBUZW1wbGF0ZVR5cGUuTGlzdFJlcG9ydCk7XG5cdGNvbnN0IGRlZmF1bHRTY3JvbGxUaHJlc2hvbGQgPSB0YWJsZVR5cGUgIT09IFwiUmVzcG9uc2l2ZVRhYmxlXCIgPyAzMDAgOiB1bmRlZmluZWQ7XG5cdGNvbnN0IGNvbmRlbnNlZFRhYmxlTGF5b3V0ID0gX2dldENvbmRlbnNlZFRhYmxlTGF5b3V0KHRhYmxlVHlwZSwgdGFibGVTZXR0aW5ncyk7XG5cdGxldCBpbmxpbmVDcmVhdGlvblJvd3NIaWRkZW5JbkVkaXRNb2RlID0gZmFsc2U7XG5cdGlmICh0YWJsZVNldHRpbmdzLmNyZWF0aW9uTW9kZT8uaW5saW5lQ3JlYXRpb25Sb3dzSGlkZGVuSW5FZGl0TW9kZSkge1xuXHRcdGlubGluZUNyZWF0aW9uUm93c0hpZGRlbkluRWRpdE1vZGUgPVxuXHRcdFx0dHlwZW9mIHRhYmxlU2V0dGluZ3MuY3JlYXRpb25Nb2RlPy5pbmxpbmVDcmVhdGlvblJvd3NIaWRkZW5JbkVkaXRNb2RlID09PSBcInN0cmluZ1wiXG5cdFx0XHRcdD8gdGFibGVTZXR0aW5ncy5jcmVhdGlvbk1vZGU/LmlubGluZUNyZWF0aW9uUm93c0hpZGRlbkluRWRpdE1vZGUgPT09IFwidHJ1ZVwiXG5cdFx0XHRcdDogdGFibGVTZXR0aW5ncy5jcmVhdGlvbk1vZGU/LmlubGluZUNyZWF0aW9uUm93c0hpZGRlbkluRWRpdE1vZGU7XG5cdH1cblx0bGV0IHVzZVRleHRGb3JOb0RhdGFNZXNzYWdlczogc3RyaW5nO1xuXHRpZiAoY29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSA9PT0gXCJMaXN0UmVwb3J0XCIpIHtcblx0XHR1c2VUZXh0Rm9yTm9EYXRhTWVzc2FnZXMgPSBcImlsbHVzdHJhdGVkTWVzc2FnZS1BdXRvXCI7XG5cdH0gZWxzZSB7XG5cdFx0dXNlVGV4dEZvck5vRGF0YU1lc3NhZ2VzID0gX21hbmlmZXN0V3JhcHBlci5nZXRVc2VUZXh0Rm9yTm9EYXRhTWVzc2FnZXMoKSA/IFwidGV4dFwiIDogXCJpbGx1c3RyYXRlZE1lc3NhZ2UtRG90XCI7XG5cdH1cblx0Y29uc3Qgb0NvbmZpZ3VyYXRpb24gPSB7XG5cdFx0Ly8gSWYgbm8gY3JlYXRlQXRFbmQgaXMgc3BlY2lmaWVkIGl0IHdpbGwgYmUgZmFsc2UgZm9yIElubGluZS9DcmVhdGlvbkRpYWxvZyBjcmVhdGUgYW5kIHRydWUgb3RoZXJ3aXNlXG5cdFx0Y3JlYXRlQXRFbmQ6XG5cdFx0XHR0YWJsZVNldHRpbmdzLmNyZWF0aW9uTW9kZT8uY3JlYXRlQXRFbmQgIT09IHVuZGVmaW5lZFxuXHRcdFx0XHQ/IHRhYmxlU2V0dGluZ3MuY3JlYXRpb25Nb2RlPy5jcmVhdGVBdEVuZFxuXHRcdFx0XHQ6ICFbQ3JlYXRpb25Nb2RlLklubGluZSwgQ3JlYXRpb25Nb2RlLkNyZWF0aW9uRGlhbG9nXS5pbmNsdWRlcyhjcmVhdGlvbk1vZGUpLFxuXHRcdGNyZWF0aW9uTW9kZTogY3JlYXRpb25Nb2RlLFxuXHRcdGNyZWF0aW9uRGlhbG9nRmllbGRzOlxuXHRcdFx0Y3JlYXRpb25Nb2RlID09PSBDcmVhdGlvbk1vZGUuQ3JlYXRpb25EaWFsb2dcblx0XHRcdFx0PyBnZXRGaWVsZExpc3QodGFibGVTZXR0aW5ncy5jcmVhdGlvbk1vZGU/LmNyZWF0aW9uRmllbGRzLCBjb252ZXJ0ZXJDb250ZXh0KVxuXHRcdFx0XHQ6IHVuZGVmaW5lZCxcblx0XHRjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb246IGN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbixcblx0XHRoYXNEYXRhU3RhdGVJbmRpY2F0b3JGaWx0ZXI6IHRlbXBsYXRlVHlwZSA9PT0gVGVtcGxhdGVUeXBlLkxpc3RSZXBvcnQsXG5cdFx0Ly8gaWYgYSBjdXN0b20gdmFsaWRhdGlvbiBmdW5jdGlvbiBpcyBwcm92aWRlZCwgZGlzYWJsZUFkZFJvd0J1dHRvbkZvckVtcHR5RGF0YSBzaG91bGQgbm90IGJlIGNvbnNpZGVyZWQsIGkuZS4gc2V0IHRvIGZhbHNlXG5cdFx0ZGlzYWJsZUFkZFJvd0J1dHRvbkZvckVtcHR5RGF0YTogIWN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbiA/ICEhdGFibGVTZXR0aW5ncy5jcmVhdGlvbk1vZGU/LmRpc2FibGVBZGRSb3dCdXR0b25Gb3JFbXB0eURhdGEgOiBmYWxzZSxcblx0XHRlbmFibGVBdXRvQ29sdW1uV2lkdGg6IGVuYWJsZUF1dG9Db2x1bW5XaWR0aCxcblx0XHRlbmFibGVQYXN0aW5nT2ZDb21wdXRlZFByb3BlcnRpZXM6IHRhYmxlU2V0dGluZ3MuZW5hYmxlUGFzdGluZ09mQ29tcHV0ZWRQcm9wZXJ0aWVzLFxuXHRcdGVuYWJsZUV4cG9ydDogX2dldEVuYWJsZUV4cG9ydCh0YWJsZVNldHRpbmdzLCBjb252ZXJ0ZXJDb250ZXh0LCBlbmFibGVQYXN0ZSksXG5cdFx0YW5hbHl0aWNhbENvbmZpZ3VyYXRpb24sXG5cdFx0ZnJvemVuQ29sdW1uQ291bnQ6IF9nZXRGcm96ZW5Db2x1bW5Db3VudCh0YWJsZVNldHRpbmdzKSxcblx0XHR3aWR0aEluY2x1ZGluZ0NvbHVtbkhlYWRlcjogX2dldFdpZHRoSW5jbHVkaW5nQ29sdW1uSGVhZGVyKHRhYmxlU2V0dGluZ3MpLFxuXHRcdGVuYWJsZUZ1bGxTY3JlZW46IF9nZXRGdWxsU2NyZWVuQmFzZWRPbkRldmljZSh0YWJsZVNldHRpbmdzLCBjb252ZXJ0ZXJDb250ZXh0LCBfbWFuaWZlc3RXcmFwcGVyLmlzUGhvbmUoKSksXG5cdFx0bWFzc0VkaXQ6IGdldE1hc3NFZGl0U2V0dGluZ3ModGFibGVTZXR0aW5ncywgY29udmVydGVyQ29udGV4dCksXG5cdFx0ZW5hYmxlQWRkQ2FyZFRvSW5zaWdodHM6IHRhYmxlU2V0dGluZ3M/LmVuYWJsZUFkZENhcmRUb0luc2lnaHRzLFxuXHRcdGVuYWJsZVBhc3RlOiBlbmFibGVQYXN0ZSxcblx0XHRkaXNhYmxlQ29weVRvQ2xpcGJvYXJkOiBkaXNhYmxlQ29weVRvQ2xpcGJvYXJkLFxuXHRcdGhlYWRlclZpc2libGU6IHRydWUsXG5cdFx0aGVhZGVyOiB0YWJsZVNldHRpbmdzLmhlYWRlcixcblx0XHRtdWx0aVNlbGVjdE1vZGU6IF9nZXRNdWx0aVNlbGVjdE1vZGUodGFibGVTZXR0aW5ncywgdGFibGVUeXBlLCBjb252ZXJ0ZXJDb250ZXh0KSxcblx0XHRzZWxlY3Rpb25MaW1pdDogX2dldFRhYmxlU2VsZWN0aW9uTGltaXQodGFibGVTZXR0aW5ncyksXG5cdFx0aW5saW5lQ3JlYXRpb25Sb3dDb3VudDogX2dldFRhYmxlSW5saW5lQ3JlYXRpb25Sb3dDb3VudCh0YWJsZVNldHRpbmdzKSxcblx0XHRpbmxpbmVDcmVhdGlvblJvd3NIaWRkZW5JbkVkaXRNb2RlOiBpbmxpbmVDcmVhdGlvblJvd3NIaWRkZW5JbkVkaXRNb2RlLFxuXHRcdHNob3dSb3dDb3VudDogdGFibGVTZXR0aW5ncz8ucXVpY2tWYXJpYW50U2VsZWN0aW9uPy5wYXRocyA/IGZhbHNlIDogIV9tYW5pZmVzdFdyYXBwZXIuZ2V0Vmlld0NvbmZpZ3VyYXRpb24oKT8uc2hvd0NvdW50cyxcblx0XHR0eXBlOiB0YWJsZVR5cGUsXG5cdFx0ZGlzYWJsZVJlcXVlc3RDYWNoZTogZ2V0T3B0aW1pc3RpY0JhdGNoU2V0dGluZ3NGcm9tTWFuaWZlc3QodGFibGVNYW5pZmVzdFNldHRpbmdzKSxcblx0XHR1c2VDb25kZW5zZWRUYWJsZUxheW91dDogY29uZGVuc2VkVGFibGVMYXlvdXQgJiYgaXNDb25kZW5zZWRUYWJsZUxheW91dENvbXBsaWFudCxcblx0XHRpc0NvbXBhY3RUeXBlOiBfbWFuaWZlc3RXcmFwcGVyLmlzQ29tcGFjdFR5cGUoKSxcblx0XHRiZWZvcmVSZWJpbmRUYWJsZTogdGFibGVTZXR0aW5ncy5iZWZvcmVSZWJpbmRUYWJsZSxcblx0XHRleHBvcnRSZXF1ZXN0U2l6ZTogZXhwb3J0UmVxdWVzdFNpemUsXG5cdFx0ZW5hYmxlVXBsb2FkUGx1Z2luOiAhIWNvbnZlcnRlckNvbnRleHQuZ2V0QW5ub3RhdGlvbkVudGl0eVR5cGUoKS5hbm5vdGF0aW9ucz8uVUk/Lk1lZGlhUmVzb3VyY2U/LlN0cmVhbSxcblx0XHRzZWxlY3Rpb25DaGFuZ2U6IHRhYmxlU2V0dGluZ3Muc2VsZWN0aW9uQ2hhbmdlLFxuXHRcdG1vZGVGb3JOb0RhdGFNZXNzYWdlOiB1c2VUZXh0Rm9yTm9EYXRhTWVzc2FnZXMsXG5cdFx0c2Nyb2xsVGhyZXNob2xkOiB0YWJsZVNldHRpbmdzLnNjcm9sbFRocmVzaG9sZCA/PyBkZWZhdWx0U2Nyb2xsVGhyZXNob2xkXG5cdH07XG5cblx0Y29uc3QgdGFibGVDb25maWd1cmF0aW9uOiBUYWJsZUNvbnRyb2xDb25maWd1cmF0aW9uID0geyAuLi5vQ29uZmlndXJhdGlvbiwgLi4udGFibGVSb3dNb2RlLCAuLi5vRmlsdGVyQ29uZmlndXJhdGlvbiB9O1xuXHRpZiAodGFibGVUeXBlID09PSBcIlRyZWVUYWJsZVwiKSB7XG5cdFx0dXBkYXRlVHJlZVRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uKHRhYmxlQ29uZmlndXJhdGlvbiwgdGFibGVTZXR0aW5ncywgY29udmVydGVyQ29udGV4dCk7XG5cdH1cblxuXHRpZiAodGFibGVTZXR0aW5ncy5oZWFkZXJWaXNpYmxlICE9PSB1bmRlZmluZWQpIHtcblx0XHR0YWJsZUNvbmZpZ3VyYXRpb24uaGVhZGVyVmlzaWJsZSA9IHRhYmxlU2V0dGluZ3MuaGVhZGVyVmlzaWJsZTtcblx0fVxuXG5cdHJldHVybiB0YWJsZUNvbmZpZ3VyYXRpb247XG59XG5cbmZ1bmN0aW9uIGdldFRhYmxlVHlwZShcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+LFxuXHR0YWJsZU1hbmlmZXN0U2V0dGluZ3M/OiBUYWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvblxuKTogVGFibGVUeXBlIHtcblx0aWYgKHRhYmxlTWFuaWZlc3RTZXR0aW5ncz8udGFibGVTZXR0aW5ncz8udHlwZSkge1xuXHRcdC8vIGluIGNhc2UgdGhlIGFwcGxpY2F0aW9uIHNwZWNpZmllZCBhIHRhYmxlIHR5cGUgd2Ugd2lsbCB1c2UgdGhpcyBvbmVcblx0XHRyZXR1cm4gdGFibGVNYW5pZmVzdFNldHRpbmdzLnRhYmxlU2V0dGluZ3MudHlwZTtcblx0fVxuXG5cdC8vIGRlZmF1bHQgaXMgdGhlIFJlc3BvbnNpdmVUYWJsZVxuXHRyZXR1cm4gXCJSZXNwb25zaXZlVGFibGVcIjtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgcHJvcGVydHkgdXNpbmcgdGhlIHRleHQgYXJyYW5nZW1lbnQgYW5ub3RhdGlvbiBzZXQgdG8gdGV4dCBvbmx5LlxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGNvbnZlcnRlciBjb250ZXh0LlxuICogQHBhcmFtIHByb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aCBUaGUgY29ycmVzcG9uZGluZyBEYXRhTW9kZWxPYmplY3RQYXRoLlxuICogQHBhcmFtIGxpbmVJdGVtIFRoZSBjb2x1bW4gdG8gYmUgZXZhbHVhdGVkLlxuICogQHBhcmFtIGNvbHVtbnNUb0JlQ3JlYXRlZCBUaGUgbGlzdCBvZiBjb2x1bW5zIHRvIGJlIGNyZWF0ZWQuXG4gKiBAcGFyYW0gcmVsYXRpdmVQYXRoIFRoZSByZWxhdGl2ZSBwYXRoIHRvIHRoZSB0YXJnZXQgcHJvcGVydHkgYmFzZWQgb24gdGhlIGNvbnRleHQuXG4gKiBAcGFyYW0gcmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzIFRoZSBleGlzdGluZyByZXN0cmljdGlvbnMgb24gcHJvcGVydGllc1xuICovXG5mdW5jdGlvbiBjcmVhdGVQcm9wZXJ0eUFubm90YXRlZFRleHRPbmx5KFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sXG5cdHByb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aDxEYXRhRmllbGRBYnN0cmFjdFR5cGVzPixcblx0bGluZUl0ZW06IERhdGFGaWVsZEFic3RyYWN0VHlwZXMsXG5cdGNvbHVtbnNUb0JlQ3JlYXRlZDogUmVjb3JkPHN0cmluZywgUHJvcGVydHk+LFxuXHRyZWxhdGl2ZVBhdGg6IHN0cmluZyxcblx0cmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzOiBSZXN0cmljdGlvbnNPblByb3BlcnRpZXNcbik6IHZvaWQge1xuXHRjb25zdCBpc1Byb3BlcnR5TmF2aWdhdGVkID1cblx0XHRwcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGgubmF2aWdhdGlvblByb3BlcnRpZXMubGVuZ3RoICE9PSBjb252ZXJ0ZXJDb250ZXh0LmdldERhdGFNb2RlbE9iamVjdFBhdGgoKS5uYXZpZ2F0aW9uUHJvcGVydGllcy5sZW5ndGg7XG5cdGlmIChpc1Byb3BlcnR5TmF2aWdhdGVkICYmIGlzRGF0YUZpZWxkKGxpbmVJdGVtKSkge1xuXHRcdGNvbHVtbnNUb0JlQ3JlYXRlZFtyZWxhdGl2ZVBhdGhdID0gbGluZUl0ZW0uVmFsdWUuJHRhcmdldDtcblx0XHRyZXN0cmljdGlvbnNPblByb3BlcnRpZXMubm9uU29ydGFibGVQcm9wZXJ0aWVzLnB1c2gocmVsYXRpdmVQYXRoKTtcblx0fSBlbHNlIGlmIChpc0RhdGFGaWVsZEZvckFubm90YXRpb24obGluZUl0ZW0pICYmIGhhc0ZpZWxkR3JvdXBUYXJnZXQobGluZUl0ZW0pKSB7XG5cdFx0KGxpbmVJdGVtLlRhcmdldC4kdGFyZ2V0IGFzIEZpZWxkR3JvdXApLkRhdGEuZm9yRWFjaCgoZmllbGQpID0+IHtcblx0XHRcdGlmIChpc0RhdGFGaWVsZChmaWVsZCkgJiYgZ2V0RGlzcGxheU1vZGUoZmllbGQuVmFsdWUuJHRhcmdldCkgPT09IFwiRGVzY3JpcHRpb25cIikge1xuXHRcdFx0XHRjb25zdCBpbmhlcmVkUHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoID0gZW5oYW5jZURhdGFNb2RlbFBhdGgoXG5cdFx0XHRcdFx0Y29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCksXG5cdFx0XHRcdFx0ZmllbGQuVmFsdWUucGF0aFxuXHRcdFx0XHQpO1xuXHRcdFx0XHRjb25zdCBpc0luaGVyZWRQcm9wZXJ0eU5hdmlnYXRlZCA9XG5cdFx0XHRcdFx0aW5oZXJlZFByb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aC5uYXZpZ2F0aW9uUHJvcGVydGllcy5sZW5ndGggIT09XG5cdFx0XHRcdFx0Y29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCkubmF2aWdhdGlvblByb3BlcnRpZXMubGVuZ3RoO1xuXHRcdFx0XHRpZiAoaXNJbmhlcmVkUHJvcGVydHlOYXZpZ2F0ZWQpIHtcblx0XHRcdFx0XHRjb2x1bW5zVG9CZUNyZWF0ZWRbZmllbGQuVmFsdWUucGF0aF0gPSBmaWVsZC5WYWx1ZS4kdGFyZ2V0O1xuXHRcdFx0XHRcdHJlc3RyaWN0aW9uc09uUHJvcGVydGllcy5ub25Tb3J0YWJsZVByb3BlcnRpZXMucHVzaChmaWVsZC5WYWx1ZS5wYXRoKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUeXBlQ29uZmlnKG9Qcm9wZXJ0eTogUHJvcGVydHkgfCBEYXRhRmllbGRBYnN0cmFjdFR5cGVzIHwgdW5kZWZpbmVkLCBkYXRhVHlwZTogc3RyaW5nIHwgdW5kZWZpbmVkKTogUHJvcGVydHlUeXBlQ29uZmlnIHtcblx0bGV0IG9UYXJnZXRNYXBwaW5nO1xuXHRpZiAoaXNQcm9wZXJ0eShvUHJvcGVydHkpKSB7XG5cdFx0b1RhcmdldE1hcHBpbmcgPSBpc1R5cGVEZWZpbml0aW9uKG9Qcm9wZXJ0eS50YXJnZXRUeXBlKVxuXHRcdFx0PyBFRE1fVFlQRV9NQVBQSU5HW29Qcm9wZXJ0eS50YXJnZXRUeXBlLnVuZGVybHlpbmdUeXBlXVxuXHRcdFx0OiBFRE1fVFlQRV9NQVBQSU5HW29Qcm9wZXJ0eS50eXBlXTtcblx0fVxuXHRpZiAob1RhcmdldE1hcHBpbmcgPT09IHVuZGVmaW5lZCAmJiBkYXRhVHlwZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0b1RhcmdldE1hcHBpbmcgPSBFRE1fVFlQRV9NQVBQSU5HW2RhdGFUeXBlXTtcblx0fVxuXHRjb25zdCBwcm9wZXJ0eVR5cGVDb25maWc6IFByb3BlcnR5VHlwZUNvbmZpZyA9IHtcblx0XHR0eXBlOiBvVGFyZ2V0TWFwcGluZz8udHlwZSxcblx0XHRjb25zdHJhaW50czoge30sXG5cdFx0Zm9ybWF0T3B0aW9uczoge31cblx0fTtcblx0aWYgKGlzUHJvcGVydHkob1Byb3BlcnR5KSAmJiBvVGFyZ2V0TWFwcGluZyAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cHJvcGVydHlUeXBlQ29uZmlnLmNvbnN0cmFpbnRzID0ge1xuXHRcdFx0c2NhbGU6IG9UYXJnZXRNYXBwaW5nLmNvbnN0cmFpbnRzPy4kU2NhbGUgPyBvUHJvcGVydHkuc2NhbGUgOiB1bmRlZmluZWQsXG5cdFx0XHRwcmVjaXNpb246IG9UYXJnZXRNYXBwaW5nLmNvbnN0cmFpbnRzPy4kUHJlY2lzaW9uID8gb1Byb3BlcnR5LnByZWNpc2lvbiA6IHVuZGVmaW5lZCxcblx0XHRcdG1heExlbmd0aDogb1RhcmdldE1hcHBpbmcuY29uc3RyYWludHM/LiRNYXhMZW5ndGggPyBvUHJvcGVydHkubWF4TGVuZ3RoIDogdW5kZWZpbmVkLFxuXHRcdFx0bnVsbGFibGU6IG9UYXJnZXRNYXBwaW5nLmNvbnN0cmFpbnRzPy4kTnVsbGFibGUgPyBvUHJvcGVydHkubnVsbGFibGUgOiB1bmRlZmluZWQsXG5cdFx0XHRtaW5pbXVtOlxuXHRcdFx0XHRvVGFyZ2V0TWFwcGluZy5jb25zdHJhaW50cz8uW1wiQE9yZy5PRGF0YS5WYWxpZGF0aW9uLlYxLk1pbmltdW0vJERlY2ltYWxcIl0gJiZcblx0XHRcdFx0IWlzTmFOKG9Qcm9wZXJ0eS5hbm5vdGF0aW9ucz8uVmFsaWRhdGlvbj8uTWluaW11bSlcblx0XHRcdFx0XHQ/IGAke29Qcm9wZXJ0eS5hbm5vdGF0aW9ucz8uVmFsaWRhdGlvbj8uTWluaW11bX1gXG5cdFx0XHRcdFx0OiB1bmRlZmluZWQsXG5cdFx0XHRtYXhpbXVtOlxuXHRcdFx0XHRvVGFyZ2V0TWFwcGluZy5jb25zdHJhaW50cz8uW1wiQE9yZy5PRGF0YS5WYWxpZGF0aW9uLlYxLk1heGltdW0vJERlY2ltYWxcIl0gJiZcblx0XHRcdFx0IWlzTmFOKG9Qcm9wZXJ0eS5hbm5vdGF0aW9ucz8uVmFsaWRhdGlvbj8uTWF4aW11bSlcblx0XHRcdFx0XHQ/IGAke29Qcm9wZXJ0eS5hbm5vdGF0aW9ucz8uVmFsaWRhdGlvbj8uTWF4aW11bX1gXG5cdFx0XHRcdFx0OiB1bmRlZmluZWQsXG5cdFx0XHRpc0RpZ2l0U2VxdWVuY2U6XG5cdFx0XHRcdHByb3BlcnR5VHlwZUNvbmZpZy50eXBlID09PSBcInNhcC51aS5tb2RlbC5vZGF0YS50eXBlLlN0cmluZ1wiICYmXG5cdFx0XHRcdG9UYXJnZXRNYXBwaW5nLmNvbnN0cmFpbnRzPy5bYEAke0NvbW1vbkFubm90YXRpb25UZXJtcy5Jc0RpZ2l0U2VxdWVuY2V9YF0gJiZcblx0XHRcdFx0b1Byb3BlcnR5LmFubm90YXRpb25zPy5Db21tb24/LklzRGlnaXRTZXF1ZW5jZVxuXHRcdFx0XHRcdD8gdHJ1ZVxuXHRcdFx0XHRcdDogdW5kZWZpbmVkXG5cdFx0fTtcblx0fVxuXHRwcm9wZXJ0eVR5cGVDb25maWcuZm9ybWF0T3B0aW9ucyA9IHtcblx0XHRwYXJzZUFzU3RyaW5nOlxuXHRcdFx0cHJvcGVydHlUeXBlQ29uZmlnPy50eXBlPy5pbmRleE9mKFwic2FwLnVpLm1vZGVsLm9kYXRhLnR5cGUuSW50XCIpID09PSAwIHx8XG5cdFx0XHRwcm9wZXJ0eVR5cGVDb25maWc/LnR5cGU/LmluZGV4T2YoXCJzYXAudWkubW9kZWwub2RhdGEudHlwZS5Eb3VibGVcIikgPT09IDBcblx0XHRcdFx0PyBmYWxzZVxuXHRcdFx0XHQ6IHVuZGVmaW5lZCxcblx0XHRlbXB0eVN0cmluZzpcblx0XHRcdHByb3BlcnR5VHlwZUNvbmZpZz8udHlwZT8uaW5kZXhPZihcInNhcC51aS5tb2RlbC5vZGF0YS50eXBlLkludFwiKSA9PT0gMCB8fFxuXHRcdFx0cHJvcGVydHlUeXBlQ29uZmlnPy50eXBlPy5pbmRleE9mKFwic2FwLnVpLm1vZGVsLm9kYXRhLnR5cGUuRG91YmxlXCIpID09PSAwXG5cdFx0XHRcdD8gXCJcIlxuXHRcdFx0XHQ6IHVuZGVmaW5lZCxcblx0XHRwYXJzZUtlZXBzRW1wdHlTdHJpbmc6XG5cdFx0XHRwcm9wZXJ0eVR5cGVDb25maWcudHlwZSA9PT0gXCJzYXAudWkubW9kZWwub2RhdGEudHlwZS5TdHJpbmdcIiAmJiBwcm9wZXJ0eVR5cGVDb25maWcuY29uc3RyYWludHMubnVsbGFibGUgPT09IGZhbHNlXG5cdFx0XHRcdD8gdHJ1ZVxuXHRcdFx0XHQ6IHVuZGVmaW5lZFxuXHR9O1xuXHRyZXR1cm4gcHJvcGVydHlUeXBlQ29uZmlnO1xufVxuLyoqXG4gKiBBZGQgYSBkZXNjcmlwdGlvbiBwcm9wZXJ0eSB0byB0aGUgbGlzdCBvZiBkZXNjcmlwdGlvbiBwcm9wZXJ0aWVzIHVzZWQgYnkgdGhlIGNvbHVtbnMgb2YgYSB0YWJsZVxuICogQHBhcmFtIHRleHRQcm9wZXJ0aWVzIFRoZSBsaXN0IG9mIHByb3BlcnRpZXMgcmVmZXJlbmNlZCBhcyB0ZXh0IG9uIGEgdGV4dCBhcnJhbmdlbWVudCBhbm5vdGF0aW9uXG4gKiBAcGFyYW0gcmVsYXRlZFByb3BlcnRpZXNJbmZvIFRoZSByZWxhdGVkIHByb3BlcnRpZXMgbGlua2VkIHRvIHRoZSBjb2x1bW4gKG5hbWVkIGFsc28gY29tcGxleCBwcm9wZXJ0eSlcbiAqIEBwYXJhbSByZWxhdGVkUHJvcGVydHlOYW1lIFRoZSBwcm9wZXJ0eSBuYW1lIHRvIGJlIGFkZGVkXG4gKi9cblxuZnVuY3Rpb24gYWRkUHJvcGVydHlUb0Rpc3BsYXlNb2RlT2ZEZXNjcmlwdGlvblByb3BlcnRpZXNNYXAoXG5cdGRpc3BsYXlNb2RlT2ZEZXNjcmlwdGlvblByb3BlcnRpZXNNYXA6IFJlY29yZDxzdHJpbmcsIERpc3BsYXlNb2RlPixcblx0cmVsYXRlZFByb3BlcnRpZXNJbmZvOiBDb21wbGV4UHJvcGVydHlJbmZvLFxuXHRyZWxhdGVkUHJvcGVydHlOYW1lOiBzdHJpbmdcbik6IHZvaWQge1xuXHRpZiAoXG5cdFx0cmVsYXRlZFByb3BlcnRpZXNJbmZvLnByb3BlcnRpZXNbcmVsYXRlZFByb3BlcnR5TmFtZV0uZGlzcGxheU1vZGVPZlByb3BlcnR5VXNlZEFzRGVzY3JpcHRpb24gJiZcblx0XHQhZGlzcGxheU1vZGVPZkRlc2NyaXB0aW9uUHJvcGVydGllc01hcFtyZWxhdGVkUHJvcGVydHlOYW1lXVxuXHQpIHtcblx0XHRkaXNwbGF5TW9kZU9mRGVzY3JpcHRpb25Qcm9wZXJ0aWVzTWFwW3JlbGF0ZWRQcm9wZXJ0eU5hbWVdID1cblx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzSW5mby5wcm9wZXJ0aWVzW3JlbGF0ZWRQcm9wZXJ0eU5hbWVdLmRpc3BsYXlNb2RlT2ZQcm9wZXJ0eVVzZWRBc0Rlc2NyaXB0aW9uITtcblx0fVxufVxuXG4vKipcbiAqIENvbXB1dGVzIHRoZSByZWZlcmVuY2VkIHByb3BlcnRpZXMgb2YgYSBMaW5lSXRlbSBpbiBjYXNlIHRoZSBMaW5lSXRlbSBpcyBhbm5vdGF0ZWQgYXMgaGlkZGVuLlxuICogQHBhcmFtIGV4aXN0aW5nQ29sdW1ucyBUaGUgbGlzdCBvZiBjb2x1bW5zIGNyZWF0ZWQgZnJvbSBMaW5lSXRlbXMgYW5kIGZyb20gcHJvcGVydGllcyBvZiBlbnRpdHlUeXBlXG4gKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gYmUgZXZhbHVhdGVkXG4gKiBAcGFyYW0gY29sdW1uIFRoZSBnaXZlbiBjb2x1bW4gZnJvbSBsaW5lSXRlbSBvciBwcm9wZXJ0eSBvZiBlbnRpdHlTZXRcbiAqL1xuZnVuY3Rpb24gY29tcHV0ZUhpZGRlbk9uUmVsYXRlZENvbHVtbnMoZXhpc3RpbmdDb2x1bW5zOiBBbm5vdGF0aW9uVGFibGVDb2x1bW5bXSwgbmFtZTogc3RyaW5nLCBjb2x1bW46IEFubm90YXRpb25UYWJsZUNvbHVtbik6IHZvaWQge1xuXHRjb25zdCByZWxhdGVkQW5ub3RhdGlvbkNvbHVtbnMgPSBleGlzdGluZ0NvbHVtbnMuZmlsdGVyKFxuXHRcdChleGlzdGluZ0NvbHVtbikgPT5cblx0XHRcdChleGlzdGluZ0NvbHVtbi5wcm9wZXJ0eUluZm9zPy5pbmNsdWRlcyhuYW1lKSAmJiBleGlzdGluZ0NvbHVtbi5pc1BhcnRPZkxpbmVJdGVtKSB8fFxuXHRcdFx0KGV4aXN0aW5nQ29sdW1uLmlzUGFydE9mTGluZUl0ZW0gJiYgZXhpc3RpbmdDb2x1bW4ucmVsYXRpdmVQYXRoID09PSBjb2x1bW4ucmVsYXRpdmVQYXRoKVxuXHQpO1xuXHRjb2x1bW4uaXNQYXJ0T2ZMaW5lSXRlbSA9ICEhcmVsYXRlZEFubm90YXRpb25Db2x1bW5zLmxlbmd0aDtcblx0aWYgKFxuXHRcdHJlbGF0ZWRBbm5vdGF0aW9uQ29sdW1ucy5sZW5ndGggJiZcblx0XHQhcmVsYXRlZEFubm90YXRpb25Db2x1bW5zPy5zb21lKChhbm5vdGF0aW9uQ29sdW1uKSA9PiBhbm5vdGF0aW9uQ29sdW1uLmF2YWlsYWJpbGl0eSAhPT0gXCJIaWRkZW5cIilcblx0KSB7XG5cdFx0Y29sdW1uLnNvcnRhYmxlID0gZmFsc2U7XG5cdFx0Y29sdW1uLmlzR3JvdXBhYmxlID0gZmFsc2U7XG5cdFx0Y29sdW1uLmZpbHRlcmFibGUgPSBmYWxzZTtcblx0fVxufVxuXG4vKipcbiAqIEdldHMgdGhlIGV4cG9ydCBzZXR0aW5ncyBwcm9wZXJ0aWVzIG9mIGEgbWFuaWZlc3QgY29sdW1uLlxuICogQHBhcmFtIGV4cG9ydFNldHRpbmdzIFRoZSBjdXN0b21pemVkL292ZXJ3cml0dGVuIGV4cG9ydCBzZXR0aW5ncyBvZiBhIG1hbmlmZXN0IGNvbHVtblxuICogQHBhcmFtIGFubm90YXRpb25Db2x1bW5zIFRoZSBsaXN0IG9mIGNvbHVtbnMgY3JlYXRlZCBmcm9tIExpbmVJdGVtc1xuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGNvbnZlcnRlciBjb250ZXh0XG4gKiBAcGFyYW0gZW50aXR5VHlwZSBUaGUgdGFyZ2V0IGVudGl0eSB0eXBlXG4gKiBAcGFyYW0gcHJvcGVydHlJbmZvcyBUaGUgcHJvcGVydGllcyBsaW5rZWQgdG8gYSBjb21wbGV4IGNvbHVtblxuICogQHBhcmFtIGNvbHVtbktleSBUaGUgY29sdW1uIGtleSBvZiB0aGUgY29sdW1uIHRvIGJlIG92ZXJ3cml0dGVuXG4gKiBAcmV0dXJucyBUaGUgZXhwb3J0IHNldHRpbmdzIG9mIHRoZSBjb2x1bW4gbWVyZ2luZyBjdXN0b21pemVkIGV4cG9ydCBzZXR0aW5ncyB3aXRoIHRoZSBkZWZhdWx0IHZhbHVlcyBkZXRlY3RlZCBvbiB0aGUgYW5ub3RhdGlvbiBjb2x1bW5cbiAqL1xuZnVuY3Rpb24gZ2V0Q3VzdG9tRXhwb3J0U2V0dGluZ3MoXG5cdGV4cG9ydFNldHRpbmdzOiBDb2x1bW5FeHBvcnRTZXR0aW5ncyB8IHVuZGVmaW5lZCxcblx0YW5ub3RhdGlvbkNvbHVtbnM6IEFubm90YXRpb25UYWJsZUNvbHVtbltdLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sXG5cdGVudGl0eVR5cGU6IEVudGl0eVR5cGUsXG5cdHByb3BlcnR5SW5mb3M/OiBzdHJpbmdbXSxcblx0Y29sdW1uS2V5Pzogc3RyaW5nXG4pOiBDb2x1bW5FeHBvcnRTZXR0aW5ncyB8IG51bGwge1xuXHRsZXQgY29sdW1uRnJvbUFubm90YXRpb25zO1xuXHRpZiAoY29sdW1uS2V5KSB7XG5cdFx0Y29sdW1uRnJvbUFubm90YXRpb25zID0gYW5ub3RhdGlvbkNvbHVtbnMuZmluZCgoYW5ub3RhdGlvbkNvbHVtbikgPT4gYW5ub3RhdGlvbkNvbHVtbi5rZXkgPT09IGNvbHVtbktleSk7XG5cdFx0aWYgKGNvbHVtbkZyb21Bbm5vdGF0aW9ucz8uZXhwb3J0U2V0dGluZ3MgPT09IG51bGwpIHtcblx0XHRcdHJldHVybiBjb2x1bW5Gcm9tQW5ub3RhdGlvbnM/LmV4cG9ydFNldHRpbmdzO1xuXHRcdH1cblx0fVxuXHRjb25zdCBlbmFibGVXcmFwcGluZyA9XG5cdFx0ZXhwb3J0U2V0dGluZ3M/LndyYXAgPz9cblx0XHQoISEoZXhwb3J0U2V0dGluZ3M/LnByb3BlcnR5ICYmIGV4cG9ydFNldHRpbmdzLnByb3BlcnR5Py5sZW5ndGggPiAxKSB8fCAhIShwcm9wZXJ0eUluZm9zICYmIHByb3BlcnR5SW5mb3MubGVuZ3RoID4gMSkpO1xuXHRjb25zdCBjdXN0b21FeHBvcnRTZXR0aW5nczogQ29sdW1uRXhwb3J0U2V0dGluZ3MgPSB7XG5cdFx0Li4uY29sdW1uRnJvbUFubm90YXRpb25zPy5leHBvcnRTZXR0aW5ncyxcblx0XHR0eXBlOiBleHBvcnRTZXR0aW5ncz8udHlwZSA/PyBjb2x1bW5Gcm9tQW5ub3RhdGlvbnM/LmV4cG9ydFNldHRpbmdzPy50eXBlLFxuXHRcdHRlbXBsYXRlOlxuXHRcdFx0ZXhwb3J0U2V0dGluZ3M/LnRlbXBsYXRlID8/XG5cdFx0XHRfYXBwZW5kQ3VzdG9tVGVtcGxhdGUocHJvcGVydHlJbmZvcywgZXhwb3J0U2V0dGluZ3M/LnByb3BlcnR5KSA/P1xuXHRcdFx0Y29sdW1uRnJvbUFubm90YXRpb25zPy5leHBvcnRTZXR0aW5ncz8udGVtcGxhdGUsXG5cdFx0cHJvcGVydHk6IGV4cG9ydFNldHRpbmdzPy5wcm9wZXJ0eVxuXHRcdFx0PyBfZ2V0UHJvcGVydHlOYW1lcyhleHBvcnRTZXR0aW5ncz8ucHJvcGVydHksIGFubm90YXRpb25Db2x1bW5zLCBjb252ZXJ0ZXJDb250ZXh0LCBlbnRpdHlUeXBlKVxuXHRcdFx0OiB1bmRlZmluZWQsXG5cdFx0d2lkdGg6IGV4cG9ydFNldHRpbmdzPy53aWR0aCxcblx0XHR3cmFwOiBlbmFibGVXcmFwcGluZ1xuXHR9O1xuXHRyZXR1cm4gcmVtb3ZlVW5kZWZpbmVkRnJvbUV4cG9ydFNldHRpbmdzKGN1c3RvbUV4cG9ydFNldHRpbmdzKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuXHRnZXRUYWJsZUFjdGlvbnMsXG5cdGdldFRhYmxlQ29sdW1ucyxcblx0Z2V0Q29sdW1uc0Zyb21FbnRpdHlUeXBlLFxuXHR1cGRhdGVMaW5rZWRQcm9wZXJ0aWVzLFxuXHRjcmVhdGVUYWJsZVZpc3VhbGl6YXRpb24sXG5cdGNyZWF0ZURlZmF1bHRUYWJsZVZpc3VhbGl6YXRpb24sXG5cdGdldENhcGFiaWxpdHlSZXN0cmljdGlvbixcblx0Z2V0SW1wb3J0YW5jZSxcblx0Z2V0U2VsZWN0aW9uTW9kZSxcblx0Z2V0Um93U3RhdHVzVmlzaWJpbGl0eSxcblx0Z2V0UDEzbk1vZGUsXG5cdGdldFN0YW5kYXJkQWN0aW9uc0NvbmZpZ3VyYXRpb24sXG5cdGdldFRhYmxlQW5ub3RhdGlvbkNvbmZpZ3VyYXRpb24sXG5cdGlzRmlsdGVyaW5nQ2FzZVNlbnNpdGl2ZSxcblx0c3BsaXRQYXRoLFxuXHRnZXRTZWxlY3Rpb25WYXJpYW50Q29uZmlndXJhdGlvbixcblx0Z2V0VGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24sXG5cdGdldFR5cGVDb25maWcsXG5cdHVwZGF0ZVRhYmxlVmlzdWFsaXphdGlvbkZvclR5cGUsXG5cdGNyZWF0ZVJlcXVlc3RlZFByb3BlcnRpZXMsXG5cdGdldE5hdmlnYXRpb25UYXJnZXRQYXRoLFxuXHRnZXRDdXN0b21GdW5jdGlvbkluZm9cbn07XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQXVJQTtFQUVBO0VBK0lBO0FBQ0E7QUFDQTtFQVlBO0FBQ0E7QUFDQTtFQUZBLElBOEVLQSxVQUFVLDBCQUFWQSxVQUFVO0lBQVZBLFVBQVU7SUFBVkEsVUFBVTtJQUFWQSxVQUFVO0lBQVZBLFVBQVU7SUFBQSxPQUFWQSxVQUFVO0VBQUEsRUFBVkEsVUFBVSxTQU1mO0VBSUE7RUFJQTtFQWFBO0VBOEJBO0VBZ0RBO0VBMkZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNPLFNBQVNDLGVBQWVBLENBQzlCQyxrQkFBNEIsRUFDNUJDLGlCQUF5QixFQUN6QkMsZ0JBQXlELEVBQ3pEQyxlQUFnRSxFQUNoRUMsa0JBQW9ELEVBQ25DO0lBQ2pCO0lBQ0EsTUFBTUMsWUFBWSxHQUFHQyx5QkFBeUIsQ0FBQ04sa0JBQWtCLEVBQUVDLGlCQUFpQixFQUFFQyxnQkFBZ0IsQ0FBQztJQUN2RztJQUNBLE1BQU1LLGVBQWUsR0FBR0Msc0JBQXNCLENBQzdDTixnQkFB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