@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
@@ -17,31 +17,31 @@ sap.ui.define(["sap/base/Log", "sap/ui/core/service/Service", "sap/ui/core/servi
17
17
  *
18
18
  */
19
19
  let ShellServiceMock = /*#__PURE__*/function (_Service) {
20
- _inheritsLoose(ShellServiceMock, _Service);
21
20
  function ShellServiceMock() {
22
21
  return _Service.apply(this, arguments) || this;
23
22
  }
23
+ _inheritsLoose(ShellServiceMock, _Service);
24
24
  var _proto = ShellServiceMock.prototype;
25
25
  _proto.init = function init() {
26
26
  this.initPromise = Promise.resolve(this);
27
27
  this.instanceType = "mock";
28
28
  };
29
- _proto.getLinks = async function getLinks( /*oArgs: object*/
29
+ _proto.getLinks = async function getLinks(/*oArgs: object*/
30
30
  ) {
31
31
  return Promise.resolve([]);
32
32
  };
33
33
  _proto.__fetchSemanticObject = async function __fetchSemanticObject() {
34
34
  return Promise.resolve([]);
35
35
  };
36
- _proto.getLinksWithCache = async function getLinksWithCache( /*oArgs: object*/
36
+ _proto.getLinksWithCache = async function getLinksWithCache(/*oArgs: object*/
37
37
  ) {
38
38
  return Promise.resolve([]);
39
39
  };
40
- _proto.toExternal = function toExternal( /*oNavArgumentsArr: Array<object>, oComponent: object*/
40
+ _proto.toExternal = function toExternal(/*oNavArgumentsArr: Array<object>, oComponent: object*/
41
41
  ) {
42
42
  /* Do Nothing */
43
43
  };
44
- _proto.getStartupAppState = async function getStartupAppState( /*oArgs: object*/
44
+ _proto.getStartupAppState = async function getStartupAppState(/*oArgs: object*/
45
45
  ) {
46
46
  return Promise.resolve(undefined);
47
47
  };
@@ -51,45 +51,45 @@ sap.ui.define(["sap/base/Log", "sap/ui/core/service/Service", "sap/ui/core/servi
51
51
  _proto.backToPreviousApp = function backToPreviousApp() {
52
52
  /* Do Nothing */
53
53
  };
54
- _proto.hrefForExternal = async function hrefForExternal( /*oArgs?: object, oComponent?: object, bAsync?: boolean*/
54
+ _proto.hrefForExternal = async function hrefForExternal(/*oArgs?: object, oComponent?: object, bAsync?: boolean*/
55
55
  ) {
56
56
  return Promise.resolve("");
57
57
  };
58
- _proto.getHref = async function getHref( /*oArgs?: object, oComponent?: object, bAsync?: boolean*/
58
+ _proto.getHref = async function getHref(/*oArgs?: object, oComponent?: object, bAsync?: boolean*/
59
59
  ) {
60
60
  return Promise.resolve("");
61
61
  };
62
62
  _proto.getHash = function getHash() {
63
63
  return window.location.href;
64
64
  };
65
- _proto.getAppState = async function getAppState( /*oComponent: object, sAppStateKey: string*/
65
+ _proto.getAppState = async function getAppState(/*oComponent: object, sAppStateKey: string*/
66
66
  ) {
67
67
  return Promise.resolve({});
68
68
  };
69
- _proto.createEmptyAppState = async function createEmptyAppState( /*oComponent: object*/
69
+ _proto.createEmptyAppState = async function createEmptyAppState(/*oComponent: object*/
70
70
  ) {
71
71
  return Promise.resolve({});
72
72
  };
73
- _proto.createEmptyAppStateAsync = async function createEmptyAppStateAsync( /*oComponent: object*/
73
+ _proto.createEmptyAppStateAsync = async function createEmptyAppStateAsync(/*oComponent: object*/
74
74
  ) {
75
75
  return Promise.resolve({});
76
76
  };
77
- _proto.navigate = async function navigate( /*oTarget: Target,oComponent?: Component*/
77
+ _proto.navigate = async function navigate(/*oTarget: Target,oComponent?: Component*/
78
78
  ) {
79
79
  return Promise.resolve(undefined);
80
80
  };
81
- _proto.isNavigationSupported = async function isNavigationSupported( /*oNavArgumentsArr: Array<object>, oComponent: object*/
81
+ _proto.isNavigationSupported = async function isNavigationSupported(/*oNavArgumentsArr: Array<object>, oComponent: object*/
82
82
  ) {
83
83
  return Promise.resolve([]);
84
84
  };
85
85
  _proto.isInitialNavigation = async function isInitialNavigation() {
86
86
  return Promise.resolve(false);
87
87
  };
88
- _proto.expandCompactHash = async function expandCompactHash( /*sHashFragment: string*/
88
+ _proto.expandCompactHash = async function expandCompactHash(/*sHashFragment: string*/
89
89
  ) {
90
90
  return Promise.resolve("");
91
91
  };
92
- _proto.parseShellHash = function parseShellHash( /*sHash: string*/
92
+ _proto.parseShellHash = function parseShellHash(/*sHash: string*/
93
93
  ) {
94
94
  return {};
95
95
  };
@@ -105,22 +105,22 @@ sap.ui.define(["sap/base/Log", "sap/ui/core/service/Service", "sap/ui/core/servi
105
105
  const regex = /#[^/]*\/(.*)/.exec(sHash);
106
106
  return {
107
107
  shellPart: "",
108
- appSpecificRoute: (regex === null || regex === void 0 ? void 0 : regex.length) === 2 ? regex[1] : ""
108
+ appSpecificRoute: regex?.length === 2 ? regex[1] : ""
109
109
  };
110
110
  };
111
- _proto.constructShellHash = function constructShellHash( /*oNewShellHash: object*/
111
+ _proto.constructShellHash = function constructShellHash(/*oNewShellHash: object*/
112
112
  ) {
113
113
  return "";
114
114
  };
115
- _proto.setDirtyFlag = function setDirtyFlag( /*bDirty: boolean*/
115
+ _proto.setDirtyFlag = function setDirtyFlag(/*bDirty: boolean*/
116
116
  ) {
117
117
  /* Do Nothing */
118
118
  };
119
- _proto.registerDirtyStateProvider = function registerDirtyStateProvider( /*fnDirtyStateProvider: Function*/
119
+ _proto.registerDirtyStateProvider = function registerDirtyStateProvider(/*fnDirtyStateProvider: Function*/
120
120
  ) {
121
121
  /* Do Nothing */
122
122
  };
123
- _proto.deregisterDirtyStateProvider = function deregisterDirtyStateProvider( /*fnDirtyStateProvider: Function*/
123
+ _proto.deregisterDirtyStateProvider = function deregisterDirtyStateProvider(/*fnDirtyStateProvider: Function*/
124
124
  ) {
125
125
  /* Do Nothing */
126
126
  };
@@ -133,25 +133,25 @@ sap.ui.define(["sap/base/Log", "sap/ui/core/service/Service", "sap/ui/core/servi
133
133
  _proto.hasUShell = function hasUShell() {
134
134
  return false;
135
135
  };
136
- _proto.registerNavigationFilter = function registerNavigationFilter( /*fnNavFilter: Function*/
136
+ _proto.registerNavigationFilter = function registerNavigationFilter(/*fnNavFilter: Function*/
137
137
  ) {
138
138
  /* Do Nothing */
139
139
  };
140
- _proto.unregisterNavigationFilter = function unregisterNavigationFilter( /*fnNavFilter: Function*/
140
+ _proto.unregisterNavigationFilter = function unregisterNavigationFilter(/*fnNavFilter: Function*/
141
141
  ) {
142
142
  /* Do Nothing */
143
143
  };
144
- _proto.setBackNavigation = async function setBackNavigation( /*fnCallBack?: Function*/
144
+ _proto.setBackNavigation = async function setBackNavigation(/*fnCallBack?: Function*/
145
145
  ) {
146
146
  /* Do Nothing */
147
147
  return Promise.resolve();
148
148
  };
149
- _proto.setHierarchy = async function setHierarchy( /*aHierarchyLevels: Array<object>*/
149
+ _proto.setHierarchy = async function setHierarchy(/*aHierarchyLevels: Array<object>*/
150
150
  ) {
151
151
  /* Do Nothing */
152
152
  return Promise.resolve();
153
153
  };
154
- _proto.setTitle = async function setTitle( /*sTitle: string*/
154
+ _proto.setTitle = async function setTitle(/*sTitle: string*/
155
155
  ) {
156
156
  /* Do Nothing */
157
157
  return Promise.resolve();
@@ -166,7 +166,7 @@ sap.ui.define(["sap/base/Log", "sap/ui/core/service/Service", "sap/ui/core/servi
166
166
  return "";
167
167
  }
168
168
  };
169
- _proto.getPrimaryIntent = async function getPrimaryIntent( /*sSemanticObject: string, mParameters?: object*/
169
+ _proto.getPrimaryIntent = async function getPrimaryIntent(/*sSemanticObject: string, mParameters?: object*/
170
170
  ) {
171
171
  return Promise.resolve(undefined);
172
172
  };
@@ -234,7 +234,6 @@ sap.ui.define(["sap/base/Log", "sap/ui/core/service/Service", "sap/ui/core/servi
234
234
  *
235
235
  */
236
236
  let ShellServices = /*#__PURE__*/function (_Service2) {
237
- _inheritsLoose(ShellServices, _Service2);
238
237
  function ShellServices() {
239
238
  var _this;
240
239
  for (var _len = arguments.length, args = new Array(_len), _key2 = 0; _key2 < _len; _key2++) {
@@ -245,6 +244,7 @@ sap.ui.define(["sap/base/Log", "sap/ui/core/service/Service", "sap/ui/core/servi
245
244
  return _this;
246
245
  }
247
246
  _exports.ShellServices = ShellServices;
247
+ _inheritsLoose(ShellServices, _Service2);
248
248
  var _proto2 = ShellServices.prototype;
249
249
  _proto2.init = function init() {
250
250
  const oContext = this.getContext();
@@ -384,7 +384,7 @@ sap.ui.define(["sap/base/Log", "sap/ui/core/service/Service", "sap/ui/core/servi
384
384
  _proto2.getInframeUrl = async function getInframeUrl() {
385
385
  const ushellContainer = this.getShellContainer();
386
386
  let appUrl;
387
- if (ushellContainer !== null && ushellContainer !== void 0 && ushellContainer.inAppRuntime()) {
387
+ if (ushellContainer?.inAppRuntime()) {
388
388
  try {
389
389
  appUrl = await ushellContainer.getFLPUrlAsync(true);
390
390
  } catch (error) {
@@ -525,7 +525,7 @@ sap.ui.define(["sap/base/Log", "sap/ui/core/service/Service", "sap/ui/core/servi
525
525
  */;
526
526
  _proto2.isFlpOptimisticBatchPluginLoaded = function isFlpOptimisticBatchPluginLoaded() {
527
527
  const flpPluginsRendererExtensions = this.getRegisteredPlugins().RendererExtensions;
528
- if (flpPluginsRendererExtensions !== null && flpPluginsRendererExtensions !== void 0 && flpPluginsRendererExtensions.hasOwnProperty("MANAGE_FE_CACHES") && !!flpPluginsRendererExtensions.MANAGE_FE_CACHES.enabled) {
528
+ if (flpPluginsRendererExtensions?.hasOwnProperty("MANAGE_FE_CACHES") && !!flpPluginsRendererExtensions.MANAGE_FE_CACHES.enabled) {
529
529
  return true;
530
530
  } else {
531
531
  return false;
@@ -691,8 +691,7 @@ sap.ui.define(["sap/base/Log", "sap/ui/core/service/Service", "sap/ui/core/servi
691
691
  */;
692
692
  _proto2.waitForPluginsLoad = async function waitForPluginsLoad() {
693
693
  return new Promise(resolve => {
694
- var _this$shellPluginMana;
695
- if (!((_this$shellPluginMana = this.shellPluginManager) !== null && _this$shellPluginMana !== void 0 && _this$shellPluginMana.getPluginLoadingPromise)) {
694
+ if (!this.shellPluginManager?.getPluginLoadingPromise) {
696
695
  resolve(false);
697
696
  } else {
698
697
  // eslint-disable-next-line promise/catch-or-return
@@ -755,8 +754,7 @@ sap.ui.define(["sap/base/Log", "sap/ui/core/service/Service", "sap/ui/core/servi
755
754
  * @returns Data
756
755
  */;
757
756
  _proto2.getApplicationPersonalizationData = async function getApplicationPersonalizationData(itemName) {
758
- var _await$this$getApplic;
759
- return await ((_await$this$getApplic = await this.getApplicationPersonalizer(itemName)) === null || _await$this$getApplic === void 0 ? void 0 : _await$this$getApplic.getPersData());
757
+ return await (await this.getApplicationPersonalizer(itemName))?.getPersData();
760
758
  }
761
759
 
762
760
  /**
@@ -802,10 +800,10 @@ sap.ui.define(["sap/base/Log", "sap/ui/core/service/Service", "sap/ui/core/servi
802
800
  */
803
801
  _exports.ShellServices = ShellServices;
804
802
  let ShellServicesFactory = /*#__PURE__*/function (_ServiceFactory) {
805
- _inheritsLoose(ShellServicesFactory, _ServiceFactory);
806
803
  function ShellServicesFactory() {
807
804
  return _ServiceFactory.apply(this, arguments) || this;
808
805
  }
806
+ _inheritsLoose(ShellServicesFactory, _ServiceFactory);
809
807
  var _proto3 = ShellServicesFactory.prototype;
810
808
  /**
811
809
  * Creates either a standard or a mock Shell service depending on the configuration.
@@ -837,4 +835,4 @@ sap.ui.define(["sap/base/Log", "sap/ui/core/service/Service", "sap/ui/core/servi
837
835
  }(ServiceFactory);
838
836
  return ShellServicesFactory;
839
837
  }, false);
840
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJTaGVsbFNlcnZpY2VNb2NrIiwiX1NlcnZpY2UiLCJfaW5oZXJpdHNMb29zZSIsImFwcGx5IiwiYXJndW1lbnRzIiwiX3Byb3RvIiwicHJvdG90eXBlIiwiaW5pdCIsImluaXRQcm9taXNlIiwiUHJvbWlzZSIsInJlc29sdmUiLCJpbnN0YW5jZVR5cGUiLCJnZXRMaW5rcyIsIl9fZmV0Y2hTZW1hbnRpY09iamVjdCIsImdldExpbmtzV2l0aENhY2hlIiwidG9FeHRlcm5hbCIsImdldFN0YXJ0dXBBcHBTdGF0ZSIsInVuZGVmaW5lZCIsImlzSmFtQWN0aXZlIiwiYmFja1RvUHJldmlvdXNBcHAiLCJocmVmRm9yRXh0ZXJuYWwiLCJnZXRIcmVmIiwiZ2V0SGFzaCIsIndpbmRvdyIsImxvY2F0aW9uIiwiaHJlZiIsImdldEFwcFN0YXRlIiwiY3JlYXRlRW1wdHlBcHBTdGF0ZSIsImNyZWF0ZUVtcHR5QXBwU3RhdGVBc3luYyIsIm5hdmlnYXRlIiwiaXNOYXZpZ2F0aW9uU3VwcG9ydGVkIiwiaXNJbml0aWFsTmF2aWdhdGlvbiIsImV4cGFuZENvbXBhY3RIYXNoIiwicGFyc2VTaGVsbEhhc2giLCJzcGxpdEhhc2giLCJzSGFzaCIsInJlZ2V4IiwiZXhlYyIsInNoZWxsUGFydCIsImFwcFNwZWNpZmljUm91dGUiLCJsZW5ndGgiLCJjb25zdHJ1Y3RTaGVsbEhhc2giLCJzZXREaXJ0eUZsYWciLCJyZWdpc3RlckRpcnR5U3RhdGVQcm92aWRlciIsImRlcmVnaXN0ZXJEaXJ0eVN0YXRlUHJvdmlkZXIiLCJnZXRVc2VyIiwiZ2V0VXNlckluaXRpYWxzIiwiaGFzVVNoZWxsIiwicmVnaXN0ZXJOYXZpZ2F0aW9uRmlsdGVyIiwidW5yZWdpc3Rlck5hdmlnYXRpb25GaWx0ZXIiLCJzZXRCYWNrTmF2aWdhdGlvbiIsInNldEhpZXJhcmNoeSIsInNldFRpdGxlIiwiZ2V0Q29udGVudERlbnNpdHkiLCJkb2N1bWVudCIsImJvZHkiLCJjbGFzc0xpc3QiLCJjb250YWlucyIsImdldFByaW1hcnlJbnRlbnQiLCJ3YWl0Rm9yUGx1Z2luc0xvYWQiLCJnZXRUaXRsZSIsImdldFBlcnNvbmFsaXplciIsIl9wZXJzSWQiLCJfc2NvcGUiLCJfY29tcG9uZW50IiwiZ2V0UGVyc0RhdGEiLCJoaXN0b3J5RW5hYmxlZCIsInN1Z2dlc3Rpb25zRW5hYmxlZCIsImFwcHMiLCJzZXRQZXJzRGF0YSIsImdldEFwcGxpY2F0aW9uUGVyc29uYWxpemVyIiwiX2l0ZW1OYW1lIiwiZ2V0QXBwbGljYXRpb25QZXJzb25hbGl6YXRpb25EYXRhIiwic2V0QXBwbGljYXRpb25QZXJzb25hbGl6YXRpb25EYXRhIiwiX29iamVjdCIsImRlbGV0ZVBlcnNvbmFsaXphdGlvbkNvbnRhaW5lciIsIl9rZXkiLCJnZXRTaGVsbENvbmZpZyIsImdldFJlZ2lzdGVyZWRQbHVnaW5zIiwiQXBwV2FybXVwIiwiUmVuZGVyZXJFeHRlbnNpb25zIiwiVXNlckRlZmF1bHRzIiwiVXNlckltYWdlIiwiaXNGbHBPcHRpbWlzdGljQmF0Y2hQbHVnaW5Mb2FkZWQiLCJwYXJzZVBhcmFtZXRlcnMiLCJnZXRFeHRlbnNpb25TZXJ2aWNlIiwiZ2V0SW5mcmFtZVVybCIsIlNlcnZpY2UiLCJTaGVsbFNlcnZpY2VzIiwiX1NlcnZpY2UyIiwiX3RoaXMiLCJfbGVuIiwiYXJncyIsIkFycmF5IiwiX2tleTIiLCJjYWxsIiwiYXBwbGljYXRpb25QZXJzb25uYWxpemVycyIsIl9leHBvcnRzIiwiX3Byb3RvMiIsIm9Db250ZXh0IiwiZ2V0Q29udGV4dCIsImFwcENvbXBvbmVudCIsInNjb3BlT2JqZWN0Iiwib1NoZWxsQ29udGFpbmVyIiwic2V0dGluZ3MiLCJzaGVsbENvbnRhaW5lciIsImxpbmtzQ2FjaGUiLCJmbkZpbmRTZW1hbnRpY09iamVjdHNJbkNhY2hlIiwib0FyZ3MiLCJhQ2FjaGVkU2VtYW50aWNPYmplY3RzIiwiYU5vbkNhY2hlZFNlbWFudGljT2JqZWN0cyIsImxpbmtGaWx0ZXIiLCJzZW1hbnRpY09iamVjdCIsInB1c2giLCJsaW5rcyIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwidmFsdWUiLCJvbGRBcmdzIiwibmV3QXJncyIsImNhY2hlZExpbmtzIiwicmVqZWN0IiwicmVzb2x2ZUZuIiwicmVqZWN0Rm4iLCJuYXZpZ2F0aW9uU2VydmljZVAiLCJnZXRTZXJ2aWNlQXN5bmMiLCJ1c2VySW5mb1NlcnZpY2VQIiwib1VybFBhcnNpbmdTZXJ2aWNlUHJvbWlzZSIsIm9TaGVsbE5hdmlnYXRpb25TZXJ2aWNlUHJvbWlzZSIsIm9TaGVsbFBsdWdpbk1hbmFnZXJQcm9taXNlIiwib1NoZWxsUGVyc29uYWxpemF0aW9uU2VydmljZVByb21pc2UiLCJvU2hlbGxFeHRlbnNpb25TZXJ2aWNlUHJvbWlzZSIsImFsbCIsInRoZW4iLCJfcmVmIiwibmF2aWdhdGlvblNlcnZpY2UiLCJ1c2VySW5mb1NlcnZpY2UiLCJvVXJsUGFyc2luZ1NlcnZpY2UiLCJvU2hlbGxOYXZpZ2F0aW9uIiwib1NoZWxsUGVyc29uYWxpemF0aW9uU2VydmljZSIsIm9TaGVsbFBsdWdpbk1hbmFnZXIiLCJvU2hlbGxFeHRlbnNpb25TZXJ2aWNlIiwiYXBwbGljYXRpb25OYXZpZ2F0aW9uIiwidXJsUGFyc2luZ1NlcnZpY2UiLCJzaGVsbE5hdmlnYXRpb24iLCJzaGVsbFBlcnNvbmFsaXphdGlvblNlcnZpY2UiLCJzaGVsbFBsdWdpbk1hbmFnZXIiLCJleHRlbnNpb25TZXJ2aWNlIiwiY2F0Y2giLCJnZXRTZW1hbnRpY09iamVjdHMiLCJvQ2FjaGVSZXN1bHRzIiwiYUxpbmtzIiwib1NlbWFudGljT2JqZWN0c0xpbmtzIiwiaSIsImFzc2lnbiIsImFNZXJnZWRMaW5rcyIsImoiLCJpdGVtIiwiZ2V0U2hlbGxVSVNlcnZpY2UiLCJnZXRTZXJ2aWNlIiwiZ2V0U2hlbGxDb250YWluZXIiLCJ1c2hlbGxDb250YWluZXIiLCJhcHBVcmwiLCJpbkFwcFJ1bnRpbWUiLCJnZXRGTFBVcmxBc3luYyIsImVycm9yIiwiTG9nIiwib05hdkFyZ3VtZW50c0FyciIsIm9Db21wb25lbnQiLCJvVGFyZ2V0Iiwic0FwcFN0YXRlS2V5IiwiYVRhcmdldHMiLCJzSGFzaEZyYWdtZW50IiwiZ2V0U2hlbGxIYXNoIiwiZmxwUGx1Z2luc1JlbmRlcmVyRXh0ZW5zaW9ucyIsImhhc093blByb3BlcnR5IiwiTUFOQUdFX0ZFX0NBQ0hFUyIsImVuYWJsZWQiLCJvTmV3U2hlbGxIYXNoIiwiYkRpcnR5IiwiZm5EaXJ0eVN0YXRlUHJvdmlkZXIiLCJnZXRJbml0aWFscyIsImZuTmF2RmlsdGVyIiwiZm5DYWxsQmFjayIsImFIaWVyYXJjaHlMZXZlbHMiLCJzVGl0bGUiLCJzU2VtYW50aWNPYmplY3QiLCJtUGFyYW1ldGVycyIsInByaW1hcnlJbnRlbnQiLCJpc0FycmF5IiwiX3RoaXMkc2hlbGxQbHVnaW5NYW5hIiwiZ2V0UGx1Z2luTG9hZGluZ1Byb21pc2UiLCJmYWlsIiwib0Vycm9yIiwicGVyc0lkIiwic2NvcGUiLCJjb21wb25lbnQiLCJrZXlDYXRlZ29yeSIsImNvbnN0YW50cyIsIkZJWEVEX0tFWSIsIndyaXRlRnJlcXVlbmN5IiwiTE9XIiwiY2xpZW50U3RvcmFnZUFsbG93ZWQiLCJ2YWxpZGl0eSIsIkluZmluaXR5Iiwia2V5IiwiZGVsZXRlQ29udGFpbmVyIiwiaXRlbU5hbWUiLCJjb250YWluZXIiLCJnZXRNYW5pZmVzdCIsImlkIiwiX2F3YWl0JHRoaXMkZ2V0QXBwbGljIiwiZGF0YSIsInVybCIsIlNoZWxsU2VydmljZXNGYWN0b3J5IiwiX1NlcnZpY2VGYWN0b3J5IiwiX3Byb3RvMyIsImNyZWF0ZUluc3RhbmNlIiwic2VydmljZUNvbnRleHQiLCJzYXAiLCJ1aSIsInJlcXVpcmUiLCJzaGVsbFNlcnZpY2UiLCJnZXRTaGVsbFNlcnZpY2VzIiwiaW50ZXJuYWxNb2RlbCIsImdldE1vZGVsIiwic2VtYW50aWNPYmplY3RzIiwic2V0UHJvcGVydHkiLCJTZXJ2aWNlRmFjdG9yeSJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiU2hlbGxTZXJ2aWNlc0ZhY3RvcnkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgdHlwZSBDb21wb25lbnQgZnJvbSBcInNhcC91aS9jb3JlL0NvbXBvbmVudFwiO1xuaW1wb3J0IFNlcnZpY2UgZnJvbSBcInNhcC91aS9jb3JlL3NlcnZpY2UvU2VydmljZVwiO1xuaW1wb3J0IFNlcnZpY2VGYWN0b3J5IGZyb20gXCJzYXAvdWkvY29yZS9zZXJ2aWNlL1NlcnZpY2VGYWN0b3J5XCI7XG5pbXBvcnQgdHlwZSBKU09OTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9qc29uL0pTT05Nb2RlbFwiO1xuaW1wb3J0IHR5cGUgQ29udGFpbmVyIGZyb20gXCJzYXAvdXNoZWxsL0NvbnRhaW5lclwiO1xuaW1wb3J0IHR5cGUgRXh0ZW5zaW9uIGZyb20gXCJzYXAvdXNoZWxsL3NlcnZpY2VzL0V4dGVuc2lvblwiO1xuaW1wb3J0IHR5cGUgTmF2aWdhdGlvbiBmcm9tIFwic2FwL3VzaGVsbC9zZXJ2aWNlcy9OYXZpZ2F0aW9uXCI7XG5pbXBvcnQgdHlwZSB7IExpbmssIExpbmtGaWx0ZXIsIFRhcmdldCB9IGZyb20gXCJzYXAvdXNoZWxsL3NlcnZpY2VzL05hdmlnYXRpb25cIjtcbmltcG9ydCB0eXBlIFBlcnNvbmFsaXphdGlvblYyIGZyb20gXCJzYXAvdXNoZWxsL3NlcnZpY2VzL1BlcnNvbmFsaXphdGlvblYyXCI7XG5pbXBvcnQgeyB0eXBlIFBlcnNJZCwgdHlwZSBTY29wZSB9IGZyb20gXCJzYXAvdXNoZWxsL3NlcnZpY2VzL1BlcnNvbmFsaXphdGlvblYyXCI7XG5pbXBvcnQgdHlwZSBTaGVsbE5hdmlnYXRpb24gZnJvbSBcInNhcC91c2hlbGwvc2VydmljZXMvU2hlbGxOYXZpZ2F0aW9uXCI7XG5pbXBvcnQgdHlwZSBVUkxQYXJzaW5nIGZyb20gXCJzYXAvdXNoZWxsL3NlcnZpY2VzL1VSTFBhcnNpbmdcIjtcbmltcG9ydCB0eXBlIHsgUGFyc2VkSGFzaCB9IGZyb20gXCJzYXAvdXNoZWxsL3NlcnZpY2VzL1VSTFBhcnNpbmdcIjtcbmltcG9ydCB0eXBlIFVzZXJJbmZvIGZyb20gXCJzYXAvdXNoZWxsL3NlcnZpY2VzL1VzZXJJbmZvXCI7XG5pbXBvcnQgdHlwZSBTaGVsbFVJU2VydmljZSBmcm9tIFwic2FwL3VzaGVsbC91aTVzZXJ2aWNlL1NoZWxsVUlTZXJ2aWNlXCI7XG5pbXBvcnQgdHlwZSB7IFNlcnZpY2VDb250ZXh0IH0gZnJvbSBcInR5cGVzL21ldGFtb2RlbF90eXBlc1wiO1xuaW1wb3J0IHR5cGUgQXBwQ29tcG9uZW50IGZyb20gXCIuLi9BcHBDb21wb25lbnRcIjtcblxuZXhwb3J0IHR5cGUgU3RhcnR1cEFwcFN0YXRlID0ge1xuXHRnZXREYXRhKCk6IHtcblx0XHRzZWxlY3Rpb25WYXJpYW50Pzoge1xuXHRcdFx0U2VsZWN0T3B0aW9ucz86IHtcblx0XHRcdFx0UHJvcGVydHlOYW1lOiBzdHJpbmc7XG5cdFx0XHRcdFJhbmdlczoge1xuXHRcdFx0XHRcdE9wdGlvbjogc3RyaW5nO1xuXHRcdFx0XHRcdFNpZ246IHN0cmluZztcblx0XHRcdFx0XHRMb3c6IHN0cmluZztcblx0XHRcdFx0fVtdO1xuXHRcdFx0fVtdO1xuXHRcdH07XG5cdH07XG59O1xuXG4vLyBzZWU6IHNhcFxcdXNoZWxsXFxzZXJ2aWNlc1xcX1BlcnNvbmFsaXphdGlvblxcY29uc3RhbnRzLmpzXG5leHBvcnQgdHlwZSBQZXJzb25hbGl6YXRpb25XaXRoQ29uc3RhbnRzID0gUGVyc29uYWxpemF0aW9uVjIgJiB7XG5cdGNvbnN0YW50czoge1xuXHRcdGtleUNhdGVnb3J5OiB7XG5cdFx0XHRGSVhFRF9LRVk6IHN0cmluZztcblx0XHRcdEdFTkVSQVRFRF9LRVk6IHN0cmluZztcblx0XHR9O1xuXHRcdHdyaXRlRnJlcXVlbmN5OiB7XG5cdFx0XHRISUdIOiBzdHJpbmc7XG5cdFx0XHRMT1c6IHN0cmluZztcblx0XHR9O1xuXHR9O1xufTtcblxuZXhwb3J0IHR5cGUgUGVyc29uYWxpemVyVHlwZSA9IHtcblx0Z2V0UGVyc0RhdGE6ICgpID0+IFByb21pc2U8b2JqZWN0Pjtcblx0c2V0UGVyc0RhdGE6IChwZXJzRGF0YTogb2JqZWN0KSA9PiB2b2lkO1xufTtcblxuZXhwb3J0IHR5cGUgU2hlbGxDb25maWdUeXBlID0ge1xuXHRhcHBzOiB7XG5cdFx0aW5wdXRGaWVsZEhpc3Rvcnk6IHtcblx0XHRcdGVuYWJsZWQ6IGJvb2xlYW47XG5cdFx0fTtcblx0fTtcbn07XG5cbmV4cG9ydCB0eXBlIEZMUFBsdWdpbiA9IHtcblx0Y29tcG9uZW50OiBzdHJpbmc7XG5cdGVuYWJsZWQ6IGJvb2xlYW47XG5cdHVybDogc3RyaW5nO1xuXHRjb25maWc6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG59O1xuXG5leHBvcnQgdHlwZSBSZWdpc3RlcmVkUGx1Z2luc01hcFR5cGUgPSB7XG5cdEFwcFdhcm11cDogUmVjb3JkPHN0cmluZywgRkxQUGx1Z2luPiB8IHt9O1xuXHRSZW5kZXJlckV4dGVuc2lvbnM6IFJlY29yZDxzdHJpbmcsIEZMUFBsdWdpbj4gfCB7fTtcblx0VXNlckRlZmF1bHRzOiBSZWNvcmQ8c3RyaW5nLCBGTFBQbHVnaW4+IHwge307XG5cdFVzZXJJbWFnZTogUmVjb3JkPHN0cmluZywgRkxQUGx1Z2luPiB8IHt9O1xufTtcblxuLyoqXG4gKiBAaW50ZXJmYWNlIElTaGVsbFNlcnZpY2VzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSVNoZWxsU2VydmljZXMge1xuXHRpbml0UHJvbWlzZTogUHJvbWlzZTxJU2hlbGxTZXJ2aWNlcz47XG5cdGluc3RhbmNlVHlwZTogc3RyaW5nO1xuXHRzZW1hbnRpY09iamVjdHM6IHN0cmluZ1tdO1xuXG5cdGdldExpbmtzKG9BcmdzPzogT21pdDxMaW5rRmlsdGVyLCBcInVpNUNvbXBvbmVudFwiPltdKTogUHJvbWlzZTxMaW5rW11bXT47XG5cblx0Z2V0TGlua3NXaXRoQ2FjaGUob0FyZ3M/OiBPbWl0PExpbmtGaWx0ZXIsIFwidWk1Q29tcG9uZW50XCI+W10pOiBQcm9taXNlPExpbmtbXVtdPjtcblxuXHR0b0V4dGVybmFsKG9OYXZBcmd1bWVudHNBcnI6IG9iamVjdCwgb0NvbXBvbmVudD86IG9iamVjdCk6IHZvaWQ7XG5cblx0Z2V0U3RhcnR1cEFwcFN0YXRlKG9BcmdzOiBvYmplY3QpOiBQcm9taXNlPHVuZGVmaW5lZCB8IFN0YXJ0dXBBcHBTdGF0ZT47XG5cblx0YmFja1RvUHJldmlvdXNBcHAoKTogdm9pZDtcblxuXHRocmVmRm9yRXh0ZXJuYWwob0FyZ3M/OiBvYmplY3QsIG9Db21wb25lbnQ/OiBvYmplY3QpOiBQcm9taXNlPHN0cmluZz47XG5cblx0Z2V0SHJlZihvVGFyZ2V0OiBvYmplY3QsIG9Db21wb25lbnQ6IENvbXBvbmVudCk6IFByb21pc2U8c3RyaW5nPjtcblxuXHRnZXRBcHBTdGF0ZShvQ29tcG9uZW50OiBDb21wb25lbnQsIHNBcHBTdGF0ZUtleTogc3RyaW5nKTogUHJvbWlzZTx1bmtub3duPjtcblxuXHRjcmVhdGVFbXB0eUFwcFN0YXRlKG9Db21wb25lbnQ6IENvbXBvbmVudCk6IG9iamVjdDtcblxuXHRjcmVhdGVFbXB0eUFwcFN0YXRlKG9Db21wb25lbnQ6IENvbXBvbmVudCk6IFByb21pc2U8dW5rbm93bj47XG5cblx0bmF2aWdhdGUob1RhcmdldDogVGFyZ2V0LCBvQ29tcG9uZW50PzogQ29tcG9uZW50KTogUHJvbWlzZTx1bmRlZmluZWQ+O1xuXG5cdGlzTmF2aWdhdGlvblN1cHBvcnRlZChvTmF2QXJndW1lbnRzQXJyOiBBcnJheTxvYmplY3Q+LCBvQ29tcG9uZW50Pzogb2JqZWN0KTogUHJvbWlzZTx7IHN1cHBvcnRlZDogYm9vbGVhbiB9W10+O1xuXG5cdGlzSW5pdGlhbE5hdmlnYXRpb24oKTogUHJvbWlzZTxib29sZWFuPjtcblxuXHRleHBhbmRDb21wYWN0SGFzaChzSGFzaEZyYWdtZW50OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz47XG5cblx0Z2V0SGFzaCgpOiBzdHJpbmc7XG5cblx0cGFyc2VTaGVsbEhhc2goc0hhc2g6IHN0cmluZyk6IFBhcnNlZEhhc2g7XG5cblx0c3BsaXRIYXNoKHNIYXNoOiBzdHJpbmcpOiBSZXR1cm5UeXBlPFVSTFBhcnNpbmdbXCJzcGxpdEhhc2hcIl0+O1xuXG5cdGNvbnN0cnVjdFNoZWxsSGFzaChvTmV3U2hlbGxIYXNoOiBvYmplY3QpOiBzdHJpbmc7XG5cblx0c2V0RGlydHlGbGFnKGJEaXJ0eTogYm9vbGVhbik6IHZvaWQ7XG5cblx0cmVnaXN0ZXJEaXJ0eVN0YXRlUHJvdmlkZXIoZm5EaXJ0eVN0YXRlUHJvdmlkZXI6IEZ1bmN0aW9uKTogdm9pZDtcblxuXHRkZXJlZ2lzdGVyRGlydHlTdGF0ZVByb3ZpZGVyKGZuRGlydHlTdGF0ZVByb3ZpZGVyOiBGdW5jdGlvbik6IHZvaWQ7XG5cblx0Z2V0VXNlcigpOiBVc2VySW5mbztcblx0Z2V0VXNlckluaXRpYWxzKCk6IHN0cmluZztcblxuXHRoYXNVU2hlbGwoKTogYm9vbGVhbjtcblxuXHRyZWdpc3Rlck5hdmlnYXRpb25GaWx0ZXIoZm5OYXZGaWx0ZXI6IEZ1bmN0aW9uKTogdm9pZDtcblxuXHR1bnJlZ2lzdGVyTmF2aWdhdGlvbkZpbHRlcihmbk5hdkZpbHRlcjogRnVuY3Rpb24pOiB2b2lkO1xuXG5cdHNldEJhY2tOYXZpZ2F0aW9uKGZuQ2FsbEJhY2s/OiBGdW5jdGlvbik6IFByb21pc2U8dm9pZD47XG5cblx0c2V0SGllcmFyY2h5KGFIaWVyYXJjaHlMZXZlbHM6IEFycmF5PG9iamVjdD4pOiBQcm9taXNlPHZvaWQ+O1xuXG5cdHNldFRpdGxlKHNUaXRsZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPjtcblxuXHRpc0phbUFjdGl2ZSgpOiBib29sZWFuO1xuXG5cdGdldENvbnRlbnREZW5zaXR5KCk6IHN0cmluZztcblxuXHRnZXRQcmltYXJ5SW50ZW50KHNTZW1hbnRpY09iamVjdDogc3RyaW5nLCBtUGFyYW1ldGVycz86IG9iamVjdCk6IFByb21pc2U8TGluaz47XG5cblx0d2FpdEZvclBsdWdpbnNMb2FkKCk6IFByb21pc2U8Ym9vbGVhbj47XG5cblx0Z2V0UmVnaXN0ZXJlZFBsdWdpbnMoKTogUmVnaXN0ZXJlZFBsdWdpbnNNYXBUeXBlO1xuXG5cdGlzRmxwT3B0aW1pc3RpY0JhdGNoUGx1Z2luTG9hZGVkKCk6IGJvb2xlYW47XG5cblx0Z2V0VGl0bGUoKTogUHJvbWlzZTxzdHJpbmc+O1xuXG5cdGdldFBlcnNvbmFsaXplcihwZXJzSWQ6IFBlcnNJZCwgc2NvcGU6IFNjb3BlLCBjb21wb25lbnQ/OiBDb21wb25lbnQpOiBQcm9taXNlPFBlcnNvbmFsaXplclR5cGU+O1xuXG5cdGRlbGV0ZVBlcnNvbmFsaXphdGlvbkNvbnRhaW5lcihrZXk6IHN0cmluZywgc2NvcGU/OiBvYmplY3QpOiBQcm9taXNlPHZvaWQ+O1xuXG5cdGdldFNoZWxsQ29uZmlnKCk6IFNoZWxsQ29uZmlnVHlwZTtcblxuXHRwYXJzZVBhcmFtZXRlcnModXJsOiBzdHJpbmcpOiBSZXR1cm5UeXBlPFVSTFBhcnNpbmdbXCJwYXJzZVBhcmFtZXRlcnNcIl0+O1xuXG5cdGdldEV4dGVuc2lvblNlcnZpY2UoKTogRXh0ZW5zaW9uO1xuXG5cdGdldEluZnJhbWVVcmwoKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+O1xuXG5cdGdldEFwcGxpY2F0aW9uUGVyc29uYWxpemVyKGl0ZW1OYW1lOiBzdHJpbmcpOiBQcm9taXNlPFBlcnNvbmFsaXplclR5cGU+O1xuXG5cdGdldEFwcGxpY2F0aW9uUGVyc29uYWxpemF0aW9uRGF0YShpdGVtTmFtZTogc3RyaW5nKTogUHJvbWlzZTxPYmplY3QgfCB1bmRlZmluZWQ+O1xuXG5cdHNldEFwcGxpY2F0aW9uUGVyc29uYWxpemF0aW9uRGF0YShpdGVtTmFtZTogc3RyaW5nLCBvYmplY3Q6IE9iamVjdCk6IFByb21pc2U8dm9pZD47XG59XG50eXBlIE5hdmlnYXRpb25FeHRlbnNpb24gPSBOYXZpZ2F0aW9uICYge1xuXHRnZXRTdGFydHVwQXBwU3RhdGUob0FwcENvbXBvbmVudDogQ29tcG9uZW50KTogUHJvbWlzZTxTdGFydHVwQXBwU3RhdGUgfCB1bmRlZmluZWQ+O1xuXHRnZXRBcHBTdGF0ZShvQXBwQ29tcG9uZW50OiBDb21wb25lbnQsIHNBcHBTdGF0ZUtleTogc3RyaW5nKTogUHJvbWlzZTxvYmplY3Q+O1xuXHRjcmVhdGVFbXB0eUFwcFN0YXRlKFxuXHRcdG9BcHBDb21wb25lbnQ6IENvbXBvbmVudCxcblx0XHRiVHJhbnNpZW50RW5mb3JjZWQ/OiBib29sZWFuLFxuXHRcdHNQZXJzaXN0ZW5jeU1ldGhvZD86IHN0cmluZyxcblx0XHRvUGVyc2lzdGVuY3lTZXR0aW5ncz86IG9iamVjdFxuXHQpOiBQcm9taXNlPG9iamVjdD47XG59O1xuXG4vKipcbiAqIE1vY2sgaW1wbGVtZW50YXRpb24gb2YgdGhlIFNoZWxsU2VydmljZSBmb3IgT3BlbkZFXG4gKlxuICovXG5jbGFzcyBTaGVsbFNlcnZpY2VNb2NrIGV4dGVuZHMgU2VydmljZTxTaGVsbFNlcnZpY2VzU2V0dGluZ3M+IGltcGxlbWVudHMgSVNoZWxsU2VydmljZXMge1xuXHRpbml0UHJvbWlzZSE6IFByb21pc2U8SVNoZWxsU2VydmljZXM+O1xuXG5cdGluc3RhbmNlVHlwZSE6IHN0cmluZztcblxuXHRzZW1hbnRpY09iamVjdHMhOiBzdHJpbmdbXTtcblxuXHRpbml0KCk6IHZvaWQge1xuXHRcdHRoaXMuaW5pdFByb21pc2UgPSBQcm9taXNlLnJlc29sdmUodGhpcyBhcyBJU2hlbGxTZXJ2aWNlcyk7XG5cdFx0dGhpcy5pbnN0YW5jZVR5cGUgPSBcIm1vY2tcIjtcblx0fVxuXG5cdGFzeW5jIGdldExpbmtzKC8qb0FyZ3M6IG9iamVjdCovKTogUHJvbWlzZTxMaW5rW11bXT4ge1xuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoW10pO1xuXHR9XG5cblx0YXN5bmMgX19mZXRjaFNlbWFudGljT2JqZWN0KCk6IFByb21pc2U8c3RyaW5nW10+IHtcblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFtdKTtcblx0fVxuXG5cdGFzeW5jIGdldExpbmtzV2l0aENhY2hlKC8qb0FyZ3M6IG9iamVjdCovKTogUHJvbWlzZTxMaW5rW11bXT4ge1xuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoW10pO1xuXHR9XG5cblx0dG9FeHRlcm5hbCgvKm9OYXZBcmd1bWVudHNBcnI6IEFycmF5PG9iamVjdD4sIG9Db21wb25lbnQ6IG9iamVjdCovKTogdm9pZCB7XG5cdFx0LyogRG8gTm90aGluZyAqL1xuXHR9XG5cblx0YXN5bmMgZ2V0U3RhcnR1cEFwcFN0YXRlKC8qb0FyZ3M6IG9iamVjdCovKTogUHJvbWlzZTxTdGFydHVwQXBwU3RhdGUgfCB1bmRlZmluZWQ+IHtcblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHVuZGVmaW5lZCk7XG5cdH1cblxuXHRpc0phbUFjdGl2ZSgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRiYWNrVG9QcmV2aW91c0FwcCgpOiB2b2lkIHtcblx0XHQvKiBEbyBOb3RoaW5nICovXG5cdH1cblxuXHRhc3luYyBocmVmRm9yRXh0ZXJuYWwoLypvQXJncz86IG9iamVjdCwgb0NvbXBvbmVudD86IG9iamVjdCwgYkFzeW5jPzogYm9vbGVhbiovKTogUHJvbWlzZTxzdHJpbmc+IHtcblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFwiXCIpO1xuXHR9XG5cblx0YXN5bmMgZ2V0SHJlZigvKm9BcmdzPzogb2JqZWN0LCBvQ29tcG9uZW50Pzogb2JqZWN0LCBiQXN5bmM/OiBib29sZWFuKi8pOiBQcm9taXNlPHN0cmluZz4ge1xuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoXCJcIik7XG5cdH1cblxuXHRnZXRIYXNoKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xuXHR9XG5cblx0YXN5bmMgZ2V0QXBwU3RhdGUoLypvQ29tcG9uZW50OiBvYmplY3QsIHNBcHBTdGF0ZUtleTogc3RyaW5nKi8pOiBQcm9taXNlPHVua25vd24+IHtcblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHt9KTtcblx0fVxuXG5cdGFzeW5jIGNyZWF0ZUVtcHR5QXBwU3RhdGUoLypvQ29tcG9uZW50OiBvYmplY3QqLyk6IFByb21pc2U8dW5rbm93bj4ge1xuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoe30pO1xuXHR9XG5cblx0YXN5bmMgY3JlYXRlRW1wdHlBcHBTdGF0ZUFzeW5jKC8qb0NvbXBvbmVudDogb2JqZWN0Ki8pOiBQcm9taXNlPHVua25vd24+IHtcblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHt9KTtcblx0fVxuXG5cdGFzeW5jIG5hdmlnYXRlKC8qb1RhcmdldDogVGFyZ2V0LG9Db21wb25lbnQ/OiBDb21wb25lbnQqLyk6IFByb21pc2U8dW5kZWZpbmVkPiB7XG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSh1bmRlZmluZWQpO1xuXHR9XG5cblx0YXN5bmMgaXNOYXZpZ2F0aW9uU3VwcG9ydGVkKC8qb05hdkFyZ3VtZW50c0FycjogQXJyYXk8b2JqZWN0Piwgb0NvbXBvbmVudDogb2JqZWN0Ki8pOiBQcm9taXNlPHsgc3VwcG9ydGVkOiBib29sZWFuIH1bXT4ge1xuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoW10pO1xuXHR9XG5cblx0YXN5bmMgaXNJbml0aWFsTmF2aWdhdGlvbigpOiBQcm9taXNlPGJvb2xlYW4+IHtcblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcblx0fVxuXG5cdGFzeW5jIGV4cGFuZENvbXBhY3RIYXNoKC8qc0hhc2hGcmFnbWVudDogc3RyaW5nKi8pOiBQcm9taXNlPHN0cmluZz4ge1xuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoXCJcIik7XG5cdH1cblxuXHRwYXJzZVNoZWxsSGFzaCgvKnNIYXNoOiBzdHJpbmcqLyk6IFBhcnNlZEhhc2gge1xuXHRcdHJldHVybiB7fSBhcyB1bmtub3duIGFzIFBhcnNlZEhhc2g7XG5cdH1cblxuXHRzcGxpdEhhc2goc0hhc2g6IHN0cmluZyk6IFJldHVyblR5cGU8VVJMUGFyc2luZ1tcInNwbGl0SGFzaFwiXT4ge1xuXHRcdC8qKlxuXHRcdCAqIEZvciBhbiBBcHBsaWNhdGlvbiB3aXRob3V0IFNoZWxsLCB0aGUgaGFzaCBpcyBzaW1pbGFyIHRvIDogIy9TYWxlc09yZGVyTWFuYWdlKDExMTExMTExLWFhYWEtYmJiYi1jY2NjLWRkZGRlZWVlZmZmZilcblx0XHQgKiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgOlxuXHRcdCAqIHtcblx0XHRcdHNoZWxsUGFydDogXCJcIixcblx0XHRcdGFwcFNwZWNpZmljUm91dGU6IFwiU2FsZXNPcmRlck1hbmFnZSgxMTExMTExMS1hYWFhLWJiYmItY2NjYy1kZGRkZWVlZWZmZmYpXCJcblx0XHR9XG5cdFx0ICovXG5cdFx0Y29uc3QgcmVnZXggPSAvI1teL10qXFwvKC4qKS8uZXhlYyhzSGFzaCk7XG5cdFx0cmV0dXJuIHtcblx0XHRcdHNoZWxsUGFydDogXCJcIixcblx0XHRcdGFwcFNwZWNpZmljUm91dGU6IHJlZ2V4Py5sZW5ndGggPT09IDIgPyByZWdleFsxXSA6IFwiXCJcblx0XHR9O1xuXHR9XG5cblx0Y29uc3RydWN0U2hlbGxIYXNoKC8qb05ld1NoZWxsSGFzaDogb2JqZWN0Ki8pOiBzdHJpbmcge1xuXHRcdHJldHVybiBcIlwiO1xuXHR9XG5cblx0c2V0RGlydHlGbGFnKC8qYkRpcnR5OiBib29sZWFuKi8pOiB2b2lkIHtcblx0XHQvKiBEbyBOb3RoaW5nICovXG5cdH1cblxuXHRyZWdpc3RlckRpcnR5U3RhdGVQcm92aWRlcigvKmZuRGlydHlTdGF0ZVByb3ZpZGVyOiBGdW5jdGlvbiovKTogdm9pZCB7XG5cdFx0LyogRG8gTm90aGluZyAqL1xuXHR9XG5cblx0ZGVyZWdpc3RlckRpcnR5U3RhdGVQcm92aWRlcigvKmZuRGlydHlTdGF0ZVByb3ZpZGVyOiBGdW5jdGlvbiovKTogdm9pZCB7XG5cdFx0LyogRG8gTm90aGluZyAqL1xuXHR9XG5cblx0Z2V0VXNlcigpOiBVc2VySW5mbyB7XG5cdFx0cmV0dXJuIHt9IGFzIFVzZXJJbmZvO1xuXHR9XG5cblx0Z2V0VXNlckluaXRpYWxzKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIFwiXCI7XG5cdH1cblxuXHRoYXNVU2hlbGwoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0cmVnaXN0ZXJOYXZpZ2F0aW9uRmlsdGVyKC8qZm5OYXZGaWx0ZXI6IEZ1bmN0aW9uKi8pOiB2b2lkIHtcblx0XHQvKiBEbyBOb3RoaW5nICovXG5cdH1cblxuXHR1bnJlZ2lzdGVyTmF2aWdhdGlvbkZpbHRlcigvKmZuTmF2RmlsdGVyOiBGdW5jdGlvbiovKTogdm9pZCB7XG5cdFx0LyogRG8gTm90aGluZyAqL1xuXHR9XG5cblx0YXN5bmMgc2V0QmFja05hdmlnYXRpb24oLypmbkNhbGxCYWNrPzogRnVuY3Rpb24qLyk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8qIERvIE5vdGhpbmcgKi9cblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblxuXHRhc3luYyBzZXRIaWVyYXJjaHkoLyphSGllcmFyY2h5TGV2ZWxzOiBBcnJheTxvYmplY3Q+Ki8pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvKiBEbyBOb3RoaW5nICovXG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG5cblx0YXN5bmMgc2V0VGl0bGUoLypzVGl0bGU6IHN0cmluZyovKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0LyogRG8gTm90aGluZyAqL1xuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0fVxuXG5cdGdldENvbnRlbnREZW5zaXR5KCk6IHN0cmluZyB7XG5cdFx0Ly8gaW4gY2FzZSB0aGVyZSBpcyBubyBzaGVsbCB3ZSBwcm9iYWJseSBuZWVkIHRvIGxvb2sgYXQgdGhlIGNsYXNzZXMgYmVpbmcgZGVmaW5lZCBvbiB0aGUgYm9keVxuXHRcdGlmIChkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5jb250YWlucyhcInNhcFVpU2l6ZUNvenlcIikpIHtcblx0XHRcdHJldHVybiBcImNvenlcIjtcblx0XHR9IGVsc2UgaWYgKGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmNvbnRhaW5zKFwic2FwVWlTaXplQ29tcGFjdFwiKSkge1xuXHRcdFx0cmV0dXJuIFwiY29tcGFjdFwiO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gXCJcIjtcblx0XHR9XG5cdH1cblxuXHRhc3luYyBnZXRQcmltYXJ5SW50ZW50KC8qc1NlbWFudGljT2JqZWN0OiBzdHJpbmcsIG1QYXJhbWV0ZXJzPzogb2JqZWN0Ki8pOiBQcm9taXNlPExpbms+IHtcblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHVuZGVmaW5lZCBhcyB1bmtub3duIGFzIExpbmspO1xuXHR9XG5cblx0YXN5bmMgd2FpdEZvclBsdWdpbnNMb2FkKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUodHJ1ZSk7XG5cdH1cblxuXHRhc3luYyBnZXRUaXRsZSgpOiBQcm9taXNlPHN0cmluZz4ge1xuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoXCJcIik7XG5cdH1cblxuXHRhc3luYyBnZXRQZXJzb25hbGl6ZXIoX3BlcnNJZDogUGVyc0lkLCBfc2NvcGU6IFNjb3BlLCBfY29tcG9uZW50PzogQ29tcG9uZW50KTogUHJvbWlzZTxQZXJzb25hbGl6ZXJUeXBlPiB7XG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSh7XG5cdFx0XHRnZXRQZXJzRGF0YTogYXN5bmMgKCkgPT5cblx0XHRcdFx0UHJvbWlzZS5yZXNvbHZlKHtcblx0XHRcdFx0XHRoaXN0b3J5RW5hYmxlZDogZmFsc2UsXG5cdFx0XHRcdFx0c3VnZ2VzdGlvbnNFbmFibGVkOiBmYWxzZSxcblx0XHRcdFx0XHRhcHBzOiB7fVxuXHRcdFx0XHR9KSxcblx0XHRcdHNldFBlcnNEYXRhOiAoKSA9PiB7fVxuXHRcdH0pO1xuXHR9XG5cblx0YXN5bmMgZ2V0QXBwbGljYXRpb25QZXJzb25hbGl6ZXIoX2l0ZW1OYW1lOiBzdHJpbmcpOiBQcm9taXNlPFBlcnNvbmFsaXplclR5cGU+IHtcblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHtcblx0XHRcdGdldFBlcnNEYXRhOiBhc3luYyAoKSA9PiBQcm9taXNlLnJlc29sdmUoe30pLFxuXHRcdFx0c2V0UGVyc0RhdGE6ICgpID0+IHt9XG5cdFx0fSk7XG5cdH1cblxuXHRhc3luYyBnZXRBcHBsaWNhdGlvblBlcnNvbmFsaXphdGlvbkRhdGEoX2l0ZW1OYW1lOiBzdHJpbmcpOiBQcm9taXNlPG9iamVjdD4ge1xuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoe30pO1xuXHR9XG5cblx0YXN5bmMgc2V0QXBwbGljYXRpb25QZXJzb25hbGl6YXRpb25EYXRhKF9pdGVtTmFtZTogc3RyaW5nLCBfb2JqZWN0OiBPYmplY3QpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblxuXHRhc3luYyBkZWxldGVQZXJzb25hbGl6YXRpb25Db250YWluZXIoX2tleTogc3RyaW5nLCBfc2NvcGU/OiBvYmplY3QpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblxuXHRnZXRTaGVsbENvbmZpZygpOiBTaGVsbENvbmZpZ1R5cGUge1xuXHRcdHJldHVybiB7fSBhcyBTaGVsbENvbmZpZ1R5cGU7XG5cdH1cblxuXHRnZXRSZWdpc3RlcmVkUGx1Z2lucygpOiBSZWdpc3RlcmVkUGx1Z2luc01hcFR5cGUge1xuXHRcdHJldHVybiB7XG5cdFx0XHRBcHBXYXJtdXA6IHt9LFxuXHRcdFx0UmVuZGVyZXJFeHRlbnNpb25zOiB7fSxcblx0XHRcdFVzZXJEZWZhdWx0czoge30sXG5cdFx0XHRVc2VySW1hZ2U6IHt9XG5cdFx0fTtcblx0fVxuXG5cdGlzRmxwT3B0aW1pc3RpY0JhdGNoUGx1Z2luTG9hZGVkKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdHBhcnNlUGFyYW1ldGVycygpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4ge1xuXHRcdHJldHVybiB7fTtcblx0fVxuXG5cdGdldEV4dGVuc2lvblNlcnZpY2UoKTogRXh0ZW5zaW9uIHtcblx0XHRyZXR1cm4ge30gYXMgRXh0ZW5zaW9uO1xuXHR9XG5cblx0YXN5bmMgZ2V0SW5mcmFtZVVybCgpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoXCJcIik7XG5cdH1cbn1cblxuLyoqXG4gKiBAdHlwZWRlZiBTaGVsbFNlcnZpY2VzU2V0dGluZ3NcbiAqL1xuZXhwb3J0IHR5cGUgU2hlbGxTZXJ2aWNlc1NldHRpbmdzID0ge1xuXHRzaGVsbENvbnRhaW5lcj86IENvbnRhaW5lcjtcbn07XG5cbnR5cGUgU2hlbGxQbHVnaW5NYW5hZ2VyID0ge1xuXHRnZXRQbHVnaW5Mb2FkaW5nUHJvbWlzZShjYXRlZ29yeTogc3RyaW5nKTogalF1ZXJ5LlByb21pc2U7XG5cdGdldFJlZ2lzdGVyZWRQbHVnaW5zKCk6IFJlZ2lzdGVyZWRQbHVnaW5zTWFwVHlwZTtcbn07XG5cbnR5cGUgUHJpdmF0ZVNoZWxsVXNlciA9IHtcblx0Z2V0SW5pdGlhbHMoKTogc3RyaW5nO1xuXHRpc0phbUFjdGl2ZSgpOiBib29sZWFuO1xuXHRnZXRDb250ZW50RGVuc2l0eSgpOiBzdHJpbmc7XG59O1xuXG4vKipcbiAqIEJhc2UgaW1wbGVtZW50YXRpb24gb2YgdGhlIFNoZWxsU2VydmljZXNcbiAqXG4gKi9cbmV4cG9ydCBjbGFzcyBTaGVsbFNlcnZpY2VzIGV4dGVuZHMgU2VydmljZTxSZXF1aXJlZDxTaGVsbFNlcnZpY2VzU2V0dGluZ3M+PiBpbXBsZW1lbnRzIElTaGVsbFNlcnZpY2VzIHtcblx0cmVzb2x2ZUZuITogRnVuY3Rpb247XG5cblx0cmVqZWN0Rm4hOiAoKSA9PiB2b2lkO1xuXG5cdGluaXRQcm9taXNlITogUHJvbWlzZTxJU2hlbGxTZXJ2aWNlcz47XG5cblx0YXBwbGljYXRpb25OYXZpZ2F0aW9uITogTmF2aWdhdGlvbkV4dGVuc2lvbjtcblxuXHR1c2VySW5mb1NlcnZpY2UhOiBVc2VySW5mbztcblxuXHR1cmxQYXJzaW5nU2VydmljZSE6IFVSTFBhcnNpbmc7XG5cblx0c2hlbGxOYXZpZ2F0aW9uITogU2hlbGxOYXZpZ2F0aW9uO1xuXG5cdHNoZWxsUGx1Z2luTWFuYWdlciE6IFNoZWxsUGx1Z2luTWFuYWdlcjtcblxuXHRvU2hlbGxDb250YWluZXIhOiBDb250YWluZXIgJiB7IGdldFVzZXI6ICgpID0+IFByaXZhdGVTaGVsbFVzZXIgfTtcblxuXHRzaGVsbFBlcnNvbmFsaXphdGlvblNlcnZpY2UhOiBQZXJzb25hbGl6YXRpb25XaXRoQ29uc3RhbnRzO1xuXG5cdGluc3RhbmNlVHlwZSE6IHN0cmluZztcblxuXHRsaW5rc0NhY2hlITogUmVjb3JkPHN0cmluZywgeyBsaW5rczogTGlua1tdIH0+O1xuXG5cdHNlbWFudGljT2JqZWN0cyE6IHN0cmluZ1tdO1xuXG5cdGZuRmluZFNlbWFudGljT2JqZWN0c0luQ2FjaGUhOiBGdW5jdGlvbjtcblxuXHRleHRlbnNpb25TZXJ2aWNlITogRXh0ZW5zaW9uO1xuXG5cdGFwcENvbXBvbmVudCE6IENvbXBvbmVudDtcblxuXHRwcml2YXRlIGFwcGxpY2F0aW9uUGVyc29ubmFsaXplcnM6IFJlY29yZDxzdHJpbmcsIFByb21pc2U8UGVyc29uYWxpemVyVHlwZT4+ID0ge307XG5cblx0aW5pdCgpOiB2b2lkIHtcblx0XHRjb25zdCBvQ29udGV4dCA9IHRoaXMuZ2V0Q29udGV4dCgpO1xuXHRcdHRoaXMuYXBwQ29tcG9uZW50ID0gb0NvbnRleHQuc2NvcGVPYmplY3QgYXMgQ29tcG9uZW50O1xuXHRcdHRoaXMub1NoZWxsQ29udGFpbmVyID0gb0NvbnRleHQuc2V0dGluZ3Muc2hlbGxDb250YWluZXI7XG5cdFx0dGhpcy5pbnN0YW5jZVR5cGUgPSBcInJlYWxcIjtcblx0XHR0aGlzLmxpbmtzQ2FjaGUgPSB7fTtcblx0XHR0aGlzLmZuRmluZFNlbWFudGljT2JqZWN0c0luQ2FjaGUgPSBmdW5jdGlvbiAob0FyZ3M6IExpbmtGaWx0ZXJbXSk6IG9iamVjdCB7XG5cdFx0XHRjb25zdCBhQ2FjaGVkU2VtYW50aWNPYmplY3RzOiBMaW5rW11bXSA9IFtdO1xuXHRcdFx0Y29uc3QgYU5vbkNhY2hlZFNlbWFudGljT2JqZWN0czogTGlua0ZpbHRlcltdID0gW107XG5cdFx0XHRmb3IgKGNvbnN0IGxpbmtGaWx0ZXIgb2Ygb0FyZ3MpIHtcblx0XHRcdFx0aWYgKCEhbGlua0ZpbHRlciAmJiAhIWxpbmtGaWx0ZXIuc2VtYW50aWNPYmplY3QpIHtcblx0XHRcdFx0XHRpZiAodGhpcy5saW5rc0NhY2hlW2xpbmtGaWx0ZXIuc2VtYW50aWNPYmplY3RdKSB7XG5cdFx0XHRcdFx0XHRhQ2FjaGVkU2VtYW50aWNPYmplY3RzLnB1c2godGhpcy5saW5rc0NhY2hlW2xpbmtGaWx0ZXIuc2VtYW50aWNPYmplY3RdLmxpbmtzKTtcblx0XHRcdFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShsaW5rRmlsdGVyLCBcImxpbmtzXCIsIHtcblx0XHRcdFx0XHRcdFx0dmFsdWU6IHRoaXMubGlua3NDYWNoZVtsaW5rRmlsdGVyLnNlbWFudGljT2JqZWN0XS5saW5rc1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGFOb25DYWNoZWRTZW1hbnRpY09iamVjdHMucHVzaChsaW5rRmlsdGVyKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiB7IG9sZEFyZ3M6IG9BcmdzLCBuZXdBcmdzOiBhTm9uQ2FjaGVkU2VtYW50aWNPYmplY3RzLCBjYWNoZWRMaW5rczogYUNhY2hlZFNlbWFudGljT2JqZWN0cyB9O1xuXHRcdH07XG5cdFx0dGhpcy5pbml0UHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRcdHRoaXMucmVzb2x2ZUZuID0gcmVzb2x2ZTtcblx0XHRcdHRoaXMucmVqZWN0Rm4gPSByZWplY3Q7XG5cdFx0fSk7XG5cdFx0Y29uc3QgbmF2aWdhdGlvblNlcnZpY2VQID0gdGhpcy5vU2hlbGxDb250YWluZXIuZ2V0U2VydmljZUFzeW5jKFwiTmF2aWdhdGlvblwiKTtcblx0XHRjb25zdCB1c2VySW5mb1NlcnZpY2VQID0gdGhpcy5vU2hlbGxDb250YWluZXIuZ2V0U2VydmljZUFzeW5jKFwiVXNlckluZm9cIik7XG5cdFx0Y29uc3Qgb1VybFBhcnNpbmdTZXJ2aWNlUHJvbWlzZSA9IHRoaXMub1NoZWxsQ29udGFpbmVyLmdldFNlcnZpY2VBc3luYyhcIlVSTFBhcnNpbmdcIik7XG5cdFx0Y29uc3Qgb1NoZWxsTmF2aWdhdGlvblNlcnZpY2VQcm9taXNlID0gdGhpcy5vU2hlbGxDb250YWluZXIuZ2V0U2VydmljZUFzeW5jKFwiU2hlbGxOYXZpZ2F0aW9uSW50ZXJuYWxcIik7XG5cdFx0Y29uc3Qgb1NoZWxsUGx1Z2luTWFuYWdlclByb21pc2UgPSB0aGlzLm9TaGVsbENvbnRhaW5lci5nZXRTZXJ2aWNlQXN5bmMoXCJQbHVnaW5NYW5hZ2VyXCIpO1xuXHRcdGNvbnN0IG9TaGVsbFBlcnNvbmFsaXphdGlvblNlcnZpY2VQcm9taXNlID0gdGhpcy5vU2hlbGxDb250YWluZXIuZ2V0U2VydmljZUFzeW5jKFwiUGVyc29uYWxpemF0aW9uVjJcIik7XG5cdFx0Y29uc3Qgb1NoZWxsRXh0ZW5zaW9uU2VydmljZVByb21pc2UgPSB0aGlzLm9TaGVsbENvbnRhaW5lci5nZXRTZXJ2aWNlQXN5bmMoXCJFeHRlbnNpb25cIik7XG5cblx0XHRQcm9taXNlLmFsbChbXG5cdFx0XHRuYXZpZ2F0aW9uU2VydmljZVAsXG5cdFx0XHR1c2VySW5mb1NlcnZpY2VQLFxuXHRcdFx0b1VybFBhcnNpbmdTZXJ2aWNlUHJvbWlzZSxcblx0XHRcdG9TaGVsbE5hdmlnYXRpb25TZXJ2aWNlUHJvbWlzZSxcblx0XHRcdG9TaGVsbFBlcnNvbmFsaXphdGlvblNlcnZpY2VQcm9taXNlLFxuXHRcdFx0b1NoZWxsUGx1Z2luTWFuYWdlclByb21pc2UsXG5cdFx0XHRvU2hlbGxFeHRlbnNpb25TZXJ2aWNlUHJvbWlzZVxuXHRcdF0pXG5cdFx0XHQudGhlbihcblx0XHRcdFx0KFtcblx0XHRcdFx0XHRuYXZpZ2F0aW9uU2VydmljZSxcblx0XHRcdFx0XHR1c2VySW5mb1NlcnZpY2UsXG5cdFx0XHRcdFx0b1VybFBhcnNpbmdTZXJ2aWNlLFxuXHRcdFx0XHRcdG9TaGVsbE5hdmlnYXRpb24sXG5cdFx0XHRcdFx0b1NoZWxsUGVyc29uYWxpemF0aW9uU2VydmljZSxcblx0XHRcdFx0XHRvU2hlbGxQbHVnaW5NYW5hZ2VyLFxuXHRcdFx0XHRcdG9TaGVsbEV4dGVuc2lvblNlcnZpY2Vcblx0XHRcdFx0XSkgPT4ge1xuXHRcdFx0XHRcdHRoaXMuYXBwbGljYXRpb25OYXZpZ2F0aW9uID0gbmF2aWdhdGlvblNlcnZpY2UgYXMgTmF2aWdhdGlvbkV4dGVuc2lvbjtcblx0XHRcdFx0XHR0aGlzLnVzZXJJbmZvU2VydmljZSA9IHVzZXJJbmZvU2VydmljZSBhcyBVc2VySW5mbztcblx0XHRcdFx0XHR0aGlzLnVybFBhcnNpbmdTZXJ2aWNlID0gb1VybFBhcnNpbmdTZXJ2aWNlIGFzIFVSTFBhcnNpbmc7XG5cdFx0XHRcdFx0dGhpcy5zaGVsbE5hdmlnYXRpb24gPSBvU2hlbGxOYXZpZ2F0aW9uIGFzIFNoZWxsTmF2aWdhdGlvbjtcblx0XHRcdFx0XHR0aGlzLnNoZWxsUGVyc29uYWxpemF0aW9uU2VydmljZSA9IG9TaGVsbFBlcnNvbmFsaXphdGlvblNlcnZpY2UgYXMgUGVyc29uYWxpemF0aW9uV2l0aENvbnN0YW50cztcblx0XHRcdFx0XHR0aGlzLnNoZWxsUGx1Z2luTWFuYWdlciA9IG9TaGVsbFBsdWdpbk1hbmFnZXIgYXMgU2hlbGxQbHVnaW5NYW5hZ2VyO1xuXHRcdFx0XHRcdHRoaXMuZXh0ZW5zaW9uU2VydmljZSA9IG9TaGVsbEV4dGVuc2lvblNlcnZpY2UgYXMgRXh0ZW5zaW9uO1xuXHRcdFx0XHRcdHRoaXMucmVzb2x2ZUZuKCk7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cdFx0XHQpXG5cdFx0XHQuY2F0Y2godGhpcy5yZWplY3RGbik7XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmVzIHRoZSB0YXJnZXQgbGlua3MgY29uZmlndXJlZCBmb3IgYSBnaXZlbiBzZW1hbnRpYyBvYmplY3QgJiBhY3Rpb25cblx0ICogV2lsbCByZXRyaWV2ZSB0aGUgQ3Jvc3NBcHBsaWNhdGlvbk5hdmlnYXRpb25cblx0ICogc2VydmljZSByZWZlcmVuY2UgY2FsbCB0aGUgZ2V0TGlua3MgbWV0aG9kLiBJbiBjYXNlIHNlcnZpY2UgaXMgbm90IGF2YWlsYWJsZSBvciBhbnkgZXhjZXB0aW9uXG5cdCAqIG1ldGhvZCB0aHJvd3MgZXhjZXB0aW9uIGVycm9yIGluIGNvbnNvbGUuXG5cdCAqIEBwYXJhbSBvQXJncyBDaGVjayB0aGUgZGVmaW5pdGlvbiBvZlxuXHQgKiBzYXAudXNoZWxsLnNlcnZpY2VzLkNyb3NzQXBwbGljYXRpb25OYXZpZ2F0aW9uPT5nZXRMaW5rcyBhcmd1bWVudHNcblx0ICogQHJldHVybnMgUHJvbWlzZSB3aGljaCB3aWxsIGJlIHJlc29sdmVkIHRvIHRhcmdldCBsaW5rcyBhcnJheVxuXHQgKi9cblx0YXN5bmMgZ2V0TGlua3Mob0FyZ3M/OiBMaW5rRmlsdGVyW10pOiBQcm9taXNlPExpbmtbXVtdPiB7XG5cdFx0cmV0dXJuIHRoaXMuYXBwbGljYXRpb25OYXZpZ2F0aW9uLmdldExpbmtzKG9BcmdzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIGEgbGlzdCBvZiBzZW1hbnRpYyBvYmplY3RzIG9mIHRoZSBpbnRlbnRzIHRoZSBjdXJyZW50IHVzZXIgY2FuIG5hdmlnYXRlIHRvLlxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHRoYXQgcmVzb2x2ZSB3aXRoIGFuIGFycmF5IG9mIHN0cmluZ3MgcmVwcmVzZW50aW5nIHRoZSBzZW1hbnRpYyBvYmplY3RzIG9mIHRoZSBpbnRlbnRzIHRoZSBjdXJyZW50IHVzZXIgY2FuIG5hdmlnYXRlIHRvLCBvciByZWplY3RzIHdpdGggYW4gZXJyb3IgbWVzc2FnZVxuXHQgKi9cblx0YXN5bmMgX19mZXRjaFNlbWFudGljT2JqZWN0KCk6IFByb21pc2U8c3RyaW5nW10+IHtcblx0XHRyZXR1cm4gdGhpcy5hcHBsaWNhdGlvbk5hdmlnYXRpb24uZ2V0U2VtYW50aWNPYmplY3RzKCk7XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmVzIHRoZSB0YXJnZXQgbGlua3MgY29uZmlndXJlZCBmb3IgYSBnaXZlbiBzZW1hbnRpYyBvYmplY3QgJiBhY3Rpb24gaW4gY2FjaGVcblx0ICogV2lsbCByZXRyaWV2ZSB0aGUgQ3Jvc3NBcHBsaWNhdGlvbk5hdmlnYXRpb25cblx0ICogc2VydmljZSByZWZlcmVuY2UgY2FsbCB0aGUgZ2V0TGlua3MgbWV0aG9kLiBJbiBjYXNlIHNlcnZpY2UgaXMgbm90IGF2YWlsYWJsZSBvciBhbnkgZXhjZXB0aW9uXG5cdCAqIG1ldGhvZCB0aHJvd3MgZXhjZXB0aW9uIGVycm9yIGluIGNvbnNvbGUuXG5cdCAqIEBwYXJhbSBvQXJncyBDaGVjayB0aGUgZGVmaW5pdGlvbiBvZlxuXHQgKiBzYXAudXNoZWxsLnNlcnZpY2VzLkNyb3NzQXBwbGljYXRpb25OYXZpZ2F0aW9uPT5nZXRMaW5rcyBhcmd1bWVudHNcblx0ICogQHJldHVybnMgUHJvbWlzZSB3aGljaCB3aWxsIGJlIHJlc29sdmVkIHRvIHRhcmdldCBsaW5rcyBhcnJheVxuXHQgKi9cblx0YXN5bmMgZ2V0TGlua3NXaXRoQ2FjaGUob0FyZ3M/OiBMaW5rRmlsdGVyW10pOiBQcm9taXNlPExpbmtbXVtdPiB7XG5cdFx0aWYgKChvQXJncyBhcyBPYmplY3RbXSkubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm4gW107XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0IG9DYWNoZVJlc3VsdHMgPSB0aGlzLmZuRmluZFNlbWFudGljT2JqZWN0c0luQ2FjaGUob0FyZ3MpO1xuXG5cdFx0XHRpZiAob0NhY2hlUmVzdWx0cy5uZXdBcmdzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0XHRyZXR1cm4gb0NhY2hlUmVzdWx0cy5jYWNoZWRMaW5rcztcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IGFMaW5rcyA9IGF3YWl0IHRoaXMuYXBwbGljYXRpb25OYXZpZ2F0aW9uLmdldExpbmtzKG9DYWNoZVJlc3VsdHMubmV3QXJncyk7XG5cdFx0XHRcdGlmIChhTGlua3MubGVuZ3RoICE9PSAwKSB7XG5cdFx0XHRcdFx0Y29uc3Qgb1NlbWFudGljT2JqZWN0c0xpbmtzOiBSZWNvcmQ8c3RyaW5nLCB7IGxpbmtzOiBMaW5rW10gfT4gPSB7fTtcblxuXHRcdFx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgYUxpbmtzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdFx0XHRpZiAoYUxpbmtzW2ldLmxlbmd0aCA+IDAgJiYgb0NhY2hlUmVzdWx0cy5uZXdBcmdzW2ldWzBdLmxpbmtzID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdFx0b1NlbWFudGljT2JqZWN0c0xpbmtzW29DYWNoZVJlc3VsdHMubmV3QXJnc1tpXVswXS5zZW1hbnRpY09iamVjdF0gPSB7XG5cdFx0XHRcdFx0XHRcdFx0bGlua3M6IGFMaW5rc1tpXVxuXHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0XHR0aGlzLmxpbmtzQ2FjaGUgPSBPYmplY3QuYXNzaWduKHRoaXMubGlua3NDYWNoZSwgb1NlbWFudGljT2JqZWN0c0xpbmtzKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAob0NhY2hlUmVzdWx0cy5jYWNoZWRMaW5rcy5sZW5ndGggPT09IDApIHtcblx0XHRcdFx0XHRyZXR1cm4gYUxpbmtzO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGNvbnN0IGFNZXJnZWRMaW5rcyA9IFtdO1xuXHRcdFx0XHRcdGxldCBqID0gMDtcblxuXHRcdFx0XHRcdGZvciAoY29uc3QgaXRlbSBvZiBvQ2FjaGVSZXN1bHRzLm9sZEFyZ3MpIHtcblx0XHRcdFx0XHRcdGlmIChqIDwgYUxpbmtzLmxlbmd0aCkge1xuXHRcdFx0XHRcdFx0XHRpZiAoYUxpbmtzW2pdLmxlbmd0aCA+IDAgJiYgaXRlbVswXS5zZW1hbnRpY09iamVjdCA9PT0gb0NhY2hlUmVzdWx0cy5uZXdBcmdzW2pdWzBdLnNlbWFudGljT2JqZWN0KSB7XG5cdFx0XHRcdFx0XHRcdFx0YU1lcmdlZExpbmtzLnB1c2goYUxpbmtzW2pdKTtcblx0XHRcdFx0XHRcdFx0XHRqKys7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0YU1lcmdlZExpbmtzLnB1c2goaXRlbVswXS5saW5rcyk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdGFNZXJnZWRMaW5rcy5wdXNoKGl0ZW1bMF0ubGlua3MpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gYU1lcmdlZExpbmtzO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0YXN5bmMgZ2V0U2hlbGxVSVNlcnZpY2UoKTogUHJvbWlzZTxTaGVsbFVJU2VydmljZT4ge1xuXHRcdHJldHVybiB0aGlzLmFwcENvbXBvbmVudC5nZXRTZXJ2aWNlKFwiU2hlbGxVSVNlcnZpY2VcIik7XG5cdH1cblxuXHQvKipcblx0ICogV2lsbCByZXRyaWV2ZSB0aGUgU2hlbGxDb250YWluZXIuXG5cdCAqIEByZXR1cm5zIE9iamVjdCB3aXRoIHByZWRlZmluZWQgc2hlbGxDb250YWluZXIgbWV0aG9kc1xuXHQgKi9cblx0Z2V0U2hlbGxDb250YWluZXIoKTogQ29udGFpbmVyIHtcblx0XHRyZXR1cm4gdGhpcy5vU2hlbGxDb250YWluZXI7XG5cdH1cblxuXHRhc3luYyBnZXRJbmZyYW1lVXJsKCk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG5cdFx0Y29uc3QgdXNoZWxsQ29udGFpbmVyID0gdGhpcy5nZXRTaGVsbENvbnRhaW5lcigpO1xuXHRcdGxldCBhcHBVcmw6IHN0cmluZyB8IHVuZGVmaW5lZDtcblx0XHRpZiAodXNoZWxsQ29udGFpbmVyPy5pbkFwcFJ1bnRpbWUoKSkge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0YXBwVXJsID0gYXdhaXQgdXNoZWxsQ29udGFpbmVyLmdldEZMUFVybEFzeW5jKHRydWUpO1xuXHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgZ2V0dGluZyB0aGUgRkxQIFVSTFwiLCBlcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gYXBwVXJsO1xuXHR9XG5cblx0LyoqXG5cdCAqIFdpbGwgY2FsbCB0b0V4dGVybmFsIG1ldGhvZCBvZiBDcm9zc0FwcGxpY2F0aW9uTmF2aWdhdGlvbiBzZXJ2aWNlIHdpdGggTmF2aWdhdGlvbiBBcmd1bWVudHMgYW5kIG9Db21wb25lbnQuXG5cdCAqIEBwYXJhbSBvTmF2QXJndW1lbnRzQXJyIEFuZFxuXHQgKiBAcGFyYW0gb0NvbXBvbmVudCBDaGVjayB0aGUgZGVmaW5pdGlvbiBvZlxuXHQgKiBzYXAudXNoZWxsLnNlcnZpY2VzLkNyb3NzQXBwbGljYXRpb25OYXZpZ2F0aW9uPT50b0V4dGVybmFsIGFyZ3VtZW50c1xuXHQgKi9cblx0dG9FeHRlcm5hbChvTmF2QXJndW1lbnRzQXJyOiBUYXJnZXQsIG9Db21wb25lbnQ/OiBDb21wb25lbnQpOiB2b2lkIHtcblx0XHR0aGlzLm5hdmlnYXRlKG9OYXZBcmd1bWVudHNBcnIsIG9Db21wb25lbnQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlcyB0aGUgdGFyZ2V0IHN0YXJ0dXBBcHBTdGF0ZVxuXHQgKiBXaWxsIGNoZWNrIHRoZSBleGlzdGFuY2Ugb2YgdGhlIFNoZWxsQ29udGFpbmVyIGFuZCByZXRyaWV2ZSB0aGUgQ3Jvc3NBcHBsaWNhdGlvbk5hdmlnYXRpb25cblx0ICogc2VydmljZSByZWZlcmVuY2UgY2FsbCB0aGUgZ2V0U3RhcnR1cEFwcFN0YXRlIG1ldGhvZC4gSW4gY2FzZSBzZXJ2aWNlIGlzIG5vdCBhdmFpbGFibGUgb3IgYW55IGV4Y2VwdGlvblxuXHQgKiBtZXRob2QgdGhyb3dzIGV4Y2VwdGlvbiBlcnJvciBpbiBjb25zb2xlLlxuXHQgKiBAcGFyYW0gb0FyZ3MgQ2hlY2sgdGhlIGRlZmluaXRpb24gb2Zcblx0ICogc2FwLnVzaGVsbC5zZXJ2aWNlcy5Dcm9zc0FwcGxpY2F0aW9uTmF2aWdhdGlvbj0+Z2V0U3RhcnR1cEFwcFN0YXRlIGFyZ3VtZW50c1xuXHQgKiBAcmV0dXJucyBQcm9taXNlIHdoaWNoIHdpbGwgYmUgcmVzb2x2ZWQgdG8gT2JqZWN0XG5cdCAqL1xuXHRhc3luYyBnZXRTdGFydHVwQXBwU3RhdGUob0FyZ3M6IENvbXBvbmVudCk6IFByb21pc2U8dW5kZWZpbmVkIHwgU3RhcnR1cEFwcFN0YXRlPiB7XG5cdFx0cmV0dXJuIHRoaXMuYXBwbGljYXRpb25OYXZpZ2F0aW9uLmdldFN0YXJ0dXBBcHBTdGF0ZShvQXJncyk7XG5cdH1cblxuXHQvKipcblx0ICogV2lsbCBjYWxsIGJhY2tUb1ByZXZpb3VzQXBwIG1ldGhvZCBvZiBDcm9zc0FwcGxpY2F0aW9uTmF2aWdhdGlvbiBzZXJ2aWNlLlxuXHQgKiBAcmV0dXJucyBTb21ldGhpbmcgdGhhdCBpbmRpY2F0ZSB3ZSd2ZSBuYXZpZ2F0ZWRcblx0ICovXG5cdGFzeW5jIGJhY2tUb1ByZXZpb3VzQXBwKCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdHJldHVybiB0aGlzLmFwcGxpY2F0aW9uTmF2aWdhdGlvbi5iYWNrVG9QcmV2aW91c0FwcCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFdpbGwgY2FsbCBocmVmRm9yRXh0ZXJuYWwgbWV0aG9kIG9mIENyb3NzQXBwbGljYXRpb25OYXZpZ2F0aW9uIHNlcnZpY2UuXG5cdCAqIEBwYXJhbSBvQXJncyBDaGVjayB0aGUgZGVmaW5pdGlvbiBvZlxuXHQgKiBAcGFyYW0gb0NvbXBvbmVudCBUaGUgYXBwQ29tcG9uZW50XG5cdCAqIHNhcC51c2hlbGwuc2VydmljZXMuQ3Jvc3NBcHBsaWNhdGlvbk5hdmlnYXRpb249PmhyZWZGb3JFeHRlcm5hbCBhcmd1bWVudHNcblx0ICogQHJldHVybnMgUHJvbWlzZSB3aGljaCB3aWxsIGJlIHJlc29sdmVkIHRvIHN0cmluZ1xuXHQgKi9cblx0YXN5bmMgaHJlZkZvckV4dGVybmFsKG9BcmdzOiBUYXJnZXQsIG9Db21wb25lbnQ/OiBDb21wb25lbnQpOiBQcm9taXNlPHN0cmluZz4ge1xuXHRcdHJldHVybiB0aGlzLmFwcGxpY2F0aW9uTmF2aWdhdGlvbi5nZXRIcmVmKG9BcmdzLCBvQ29tcG9uZW50KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIGEgcHJvbWlzZSByZXNvbHZpbmcgdG8gYSBVUkwgdGhhdCBsYXVuY2hlcyBhbiBhcHAgd2l0aCBjZXJ0YWluIHBhcmFtZXRlcnMuXG5cdCAqIFRoaXMgQVBJIGNhbiBiZSB1c2VkIHRvIGNvbnZlcnQgdGhlIGludGVybmFsIHNoZWxsIGhhc2ggZm9ybWF0IGludG8gdGhlIFVSTCBmb3JtYXQgZm9yIHVzZSBpbiBsaW5rIHRhZ3MuXG5cdCAqIFRoZSByZXN1bHRpbmcgaHJlZiBpcyBmdWxseSBlbmNvZGVkIGFuZCBjYW5ub3QgYmUgdXNlZCBpbiBvdGhlciBBUElzIHRoYXQgZXhwZWN0IHRoZSBpbnRlcm5hbCBkZWNvZGVkIGhhc2guXG5cdCAqIEBwYXJhbSBbb1RhcmdldF0gVGhlIG5hdmlnYXRpb24gdGFyZ2V0IHRvIHRyYW5zZm9ybS4gV2hlbiwgb21pdHRlZCB0aGUgY3VycmVudCBoYXNoIGlzIHVzZWQgYXMgdGhlIGJhc2lzIGZvciB0aGUgY2FsY3VsYXRpb24uXG5cdCAqIEBwYXJhbSBbb0NvbXBvbmVudF0gQSBVSTUgY29tcG9uZW50LCB1c2VkIHRvIGxvZ2ljYWxseSBhdHRhY2ggYW55IHJlbGF0ZWQgYXBwIHN0YXRlLlxuXHQgKiBAcmV0dXJucyBBIHByb21pc2UgcmVzb2x2aW5nIHRoZSBlbmNvZGVkIGhyZWYuXG5cdCAqL1xuXHRhc3luYyBnZXRIcmVmKG9UYXJnZXQ6IFRhcmdldCwgb0NvbXBvbmVudD86IENvbXBvbmVudCk6IFByb21pc2U8c3RyaW5nPiB7XG5cdFx0cmV0dXJuIHRoaXMuYXBwbGljYXRpb25OYXZpZ2F0aW9uLmdldEhyZWYob1RhcmdldCwgb0NvbXBvbmVudCk7XG5cdH1cblxuXHQvKipcblx0ICogV2lsbCBjYWxsIGdldEFwcFN0YXRlIG1ldGhvZCBvZiBDcm9zc0FwcGxpY2F0aW9uTmF2aWdhdGlvbiBzZXJ2aWNlIHdpdGggb0NvbXBvbmVudCBhbmQgb0FwcFN0YXRlS2V5LlxuXHQgKiBAcGFyYW0gb0NvbXBvbmVudFxuXHQgKiBAcGFyYW0gc0FwcFN0YXRlS2V5IENoZWNrIHRoZSBkZWZpbml0aW9uIG9mXG5cdCAqIHNhcC51c2hlbGwuc2VydmljZXMuQ3Jvc3NBcHBsaWNhdGlvbk5hdmlnYXRpb249PmdldEFwcFN0YXRlIGFyZ3VtZW50c1xuXHQgKiBAcmV0dXJucyBQcm9taXNlIHdoaWNoIHdpbGwgYmUgcmVzb2x2ZWQgdG8gb2JqZWN0XG5cdCAqL1xuXHRhc3luYyBnZXRBcHBTdGF0ZShvQ29tcG9uZW50OiBDb21wb25lbnQsIHNBcHBTdGF0ZUtleTogc3RyaW5nKTogUHJvbWlzZTx1bmtub3duPiB7XG5cdFx0cmV0dXJuIHRoaXMuYXBwbGljYXRpb25OYXZpZ2F0aW9uLmdldEFwcFN0YXRlKG9Db21wb25lbnQsIHNBcHBTdGF0ZUtleSk7XG5cdH1cblxuXHQvKipcblx0ICogV2lsbCBjYWxsIGNyZWF0ZUVtcHR5QXBwU3RhdGUgbWV0aG9kIG9mIENyb3NzQXBwbGljYXRpb25OYXZpZ2F0aW9uIHNlcnZpY2Ugd2l0aCBvQ29tcG9uZW50LlxuXHQgKiBAcGFyYW0gb0NvbXBvbmVudCBDaGVjayB0aGUgZGVmaW5pdGlvbiBvZlxuXHQgKiBzYXAudXNoZWxsLnNlcnZpY2VzLkNyb3NzQXBwbGljYXRpb25OYXZpZ2F0aW9uPT5jcmVhdGVFbXB0eUFwcFN0YXRlIGFyZ3VtZW50c1xuXHQgKiBAcmV0dXJucyBQcm9taXNlIHdoaWNoIHdpbGwgYmUgcmVzb2x2ZWQgdG8gb2JqZWN0XG5cdCAqL1xuXHRhc3luYyBjcmVhdGVFbXB0eUFwcFN0YXRlKG9Db21wb25lbnQ6IENvbXBvbmVudCk6IFByb21pc2U8dW5rbm93bj4ge1xuXHRcdHJldHVybiB0aGlzLmFwcGxpY2F0aW9uTmF2aWdhdGlvbi5jcmVhdGVFbXB0eUFwcFN0YXRlKG9Db21wb25lbnQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFdpbGwgY2FsbCBpc05hdmlnYXRpb25TdXBwb3J0ZWQgbWV0aG9kIG9mIENyb3NzQXBwbGljYXRpb25OYXZpZ2F0aW9uIHNlcnZpY2Ugd2l0aCBOYXZpZ2F0aW9uIEFyZ3VtZW50cyBhbmQgb0NvbXBvbmVudC5cblx0ICogQHBhcmFtIGFUYXJnZXRzXG5cdCAqIEBwYXJhbSBvQ29tcG9uZW50IENoZWNrIHRoZSBkZWZpbml0aW9uIG9mXG5cdCAqIHNhcC51c2hlbGwuc2VydmljZXMuQ3Jvc3NBcHBsaWNhdGlvbk5hdmlnYXRpb249PmlzTmF2aWdhdGlvblN1cHBvcnRlZCBhcmd1bWVudHNcblx0ICogQHJldHVybnMgUHJvbWlzZSB3aGljaCB3aWxsIGJlIHJlc29sdmVkIHRvIG9iamVjdFxuXHQgKi9cblx0YXN5bmMgaXNOYXZpZ2F0aW9uU3VwcG9ydGVkKGFUYXJnZXRzOiBUYXJnZXRbXSwgb0NvbXBvbmVudDogQ29tcG9uZW50KTogUHJvbWlzZTx7IHN1cHBvcnRlZDogYm9vbGVhbiB9W10+IHtcblx0XHRyZXR1cm4gdGhpcy5hcHBsaWNhdGlvbk5hdmlnYXRpb24uaXNOYXZpZ2F0aW9uU3VwcG9ydGVkKGFUYXJnZXRzLCBvQ29tcG9uZW50KSBhcyB1bmtub3duIGFzIFByb21pc2U8eyBzdXBwb3J0ZWQ6IGJvb2xlYW4gfVtdPjtcblx0fVxuXG5cdC8qKlxuXHQgKiBUcmlnZ2VycyBhIG5hdmlnYXRpb24gdG8gYSBzcGVjaWZpZWQgdGFyZ2V0IG91dHNpZGUgb2YgdGhlIGN1cnJlbnRseSBydW5uaW5nIGFwcGxpY2F0aW9uLlxuXHQgKiBAcGFyYW0gb1RhcmdldCBUaGUgbmF2aWdhdGlvbiB0YXJnZXQuXG5cdCAqIEBwYXJhbSBbb0NvbXBvbmVudF0gQSBVSTUgY29tcG9uZW50LCB1c2VkIHRvIGxvZ2ljYWxseSBhdHRhY2ggYW55IHJlbGF0ZWQgYXBwIHN0YXRlLlxuXHQgKiBAcmV0dXJucyBBIFByb21pc2UgcmVzb2x2aW5nIG9uY2UgdGhlIG5hdmlnYXRpb24gd2FzIHRyaWdnZXJlZC4gVGhlIFByb21pc2UgbWlnaHQgbmV2ZXIgcmVqZWN0IG9yIHJlc29sdmVcblx0ICogICAgICAgICAgICAgICAgICAgIHdoZW4gYW4gZXJyb3Igb2NjdXJzIGR1cmluZyB0aGUgbmF2aWdhdGlvbi5cblx0ICovXG5cdGFzeW5jIG5hdmlnYXRlKG9UYXJnZXQ6IFRhcmdldCwgb0NvbXBvbmVudD86IENvbXBvbmVudCk6IFByb21pc2U8dW5kZWZpbmVkPiB7XG5cdFx0cmV0dXJuIChhd2FpdCB0aGlzLmFwcGxpY2F0aW9uTmF2aWdhdGlvbi5uYXZpZ2F0ZShvVGFyZ2V0LCBvQ29tcG9uZW50KSkgYXMgdW5rbm93biBhcyBQcm9taXNlPHVuZGVmaW5lZD47XG5cdH1cblxuXHQvKipcblx0ICogV2lsbCBjYWxsIGlzSW5pdGlhbE5hdmlnYXRpb25Bc3luYyBtZXRob2Qgb2YgQ3Jvc3NBcHBsaWNhdGlvbk5hdmlnYXRpb24gc2VydmljZS5cblx0ICogQHJldHVybnMgUHJvbWlzZSB3aGljaCB3aWxsIGJlIHJlc29sdmVkIHRvIGJvb2xlYW5cblx0ICovXG5cdGFzeW5jIGlzSW5pdGlhbE5hdmlnYXRpb24oKTogUHJvbWlzZTxib29sZWFuPiB7XG5cdFx0cmV0dXJuIHRoaXMuYXBwbGljYXRpb25OYXZpZ2F0aW9uLmlzSW5pdGlhbE5hdmlnYXRpb24oKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBXaWxsIGNhbGwgZXhwYW5kQ29tcGFjdEhhc2ggbWV0aG9kIG9mIENyb3NzQXBwbGljYXRpb25OYXZpZ2F0aW9uIHNlcnZpY2UuXG5cdCAqIEBwYXJhbSBzSGFzaEZyYWdtZW50IEFuIChpbnRlcm5hbCBmb3JtYXQpIHNoZWxsIGhhc2hcblx0ICogQHJldHVybnMgQSBwcm9taXNlIHRoZSBzdWNjZXNzIGhhbmRsZXIgb2YgdGhlIHJlc29sdmUgcHJvbWlzZSBnZXQgYW4gZXhwYW5kZWQgc2hlbGwgaGFzaCBhcyBmaXJzdCBhcmd1bWVudFxuXHQgKi9cblx0YXN5bmMgZXhwYW5kQ29tcGFjdEhhc2goc0hhc2hGcmFnbWVudDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHNIYXNoRnJhZ21lbnQpOyAvL3RoaXMubmF2VGFyZ2V0UmVzb2x1dGlvbi5leHBhbmRDb21wYWN0SGFzaChzSGFzaEZyYWdtZW50KTtcblx0fVxuXG5cdGdldEhhc2goKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gYCMke3RoaXMudXJsUGFyc2luZ1NlcnZpY2UuZ2V0U2hlbGxIYXNoKHdpbmRvdy5sb2NhdGlvbi5ocmVmKX1gO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgYSBtYXAgb2YgYWxsIHRoZSBwbHVnaW5zIHdoaWNoIGFyZSByZWdpc3RlcmVkIHdpdGggdGhlIFBsdWdpbk1hbmFnZXIsIHNvcnRlZCBieSBzdXBwb3J0ZWQgcGx1Z2luIGNhdGVnb3JpZXMuXG5cdCAqIEByZXR1cm5zIE1hcCBvZiByZWdpc3RlcmVkIHBsdWdpbnNcblx0ICovXG5cdGdldFJlZ2lzdGVyZWRQbHVnaW5zKCk6IFJlZ2lzdGVyZWRQbHVnaW5zTWFwVHlwZSB7XG5cdFx0cmV0dXJuIHRoaXMuc2hlbGxQbHVnaW5NYW5hZ2VyLmdldFJlZ2lzdGVyZWRQbHVnaW5zKCk7XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2sgZm9yIHRoZSBvcHRpbWlzdGljIGJhdGNoIHBsdWdpbiBzZXR1cCBpbiB0aGUgRkxQLlxuXHQgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBvcHRpbWlzdGljIGJhdGNoIHBsdWdpbiBpcyBzZXQgdXAgYW5kIGVuYWJsZWQuXG5cdCAqL1xuXHRpc0ZscE9wdGltaXN0aWNCYXRjaFBsdWdpbkxvYWRlZCgpOiBib29sZWFuIHtcblx0XHRjb25zdCBmbHBQbHVnaW5zUmVuZGVyZXJFeHRlbnNpb25zID0gdGhpcy5nZXRSZWdpc3RlcmVkUGx1Z2lucygpLlJlbmRlcmVyRXh0ZW5zaW9ucztcblx0XHRpZiAoXG5cdFx0XHRmbHBQbHVnaW5zUmVuZGVyZXJFeHRlbnNpb25zPy5oYXNPd25Qcm9wZXJ0eShcIk1BTkFHRV9GRV9DQUNIRVNcIikgJiZcblx0XHRcdCEhKGZscFBsdWdpbnNSZW5kZXJlckV4dGVuc2lvbnMgYXMgUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgb2JqZWN0Pj4pLk1BTkFHRV9GRV9DQUNIRVMuZW5hYmxlZFxuXHRcdCkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogV2lsbCBjYWxsIHBhcnNlU2hlbGxIYXNoIG1ldGhvZCBvZiBVUkxQYXJzaW5nIHNlcnZpY2Ugd2l0aCBnaXZlbiBzSGFzaC5cblx0ICogQHBhcmFtIHNIYXNoIENoZWNrIHRoZSBkZWZpbml0aW9uIG9mXG5cdCAqIHNhcC51c2hlbGwuc2VydmljZXMuVVJMUGFyc2luZz0+cGFyc2VTaGVsbEhhc2ggYXJndW1lbnRzXG5cdCAqIEByZXR1cm5zIFRoZSBwYXJzZWQgdXJsXG5cdCAqL1xuXHRwYXJzZVNoZWxsSGFzaChzSGFzaDogc3RyaW5nKTogUGFyc2VkSGFzaCB7XG5cdFx0cmV0dXJuIHRoaXMudXJsUGFyc2luZ1NlcnZpY2UucGFyc2VTaGVsbEhhc2goc0hhc2gpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFdpbGwgY2FsbCBzcGxpdEhhc2ggbWV0aG9kIG9mIFVSTFBhcnNpbmcgc2VydmljZSB3aXRoIGdpdmVuIHNIYXNoLlxuXHQgKiBAcGFyYW0gc0hhc2ggQ2hlY2sgdGhlIGRlZmluaXRpb24gb2Zcblx0ICogc2FwLnVzaGVsbC5zZXJ2aWNlcy5VUkxQYXJzaW5nPT5zcGxpdEhhc2ggYXJndW1lbnRzXG5cdCAqIEByZXR1cm5zIFByb21pc2Ugd2hpY2ggd2lsbCBiZSByZXNvbHZlZCB0byBvYmplY3Rcblx0ICovXG5cdHNwbGl0SGFzaChzSGFzaDogc3RyaW5nKTogeyBzaGVsbFBhcnQ/OiBzdHJpbmc7IGFwcFNwZWNpZmljUm91dGU/OiBzdHJpbmcgfSB7XG5cdFx0cmV0dXJuIHRoaXMudXJsUGFyc2luZ1NlcnZpY2Uuc3BsaXRIYXNoKHNIYXNoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBXaWxsIGNhbGwgY29uc3RydWN0U2hlbGxIYXNoIG1ldGhvZCBvZiBVUkxQYXJzaW5nIHNlcnZpY2Ugd2l0aCBnaXZlbiBzSGFzaC5cblx0ICogQHBhcmFtIG9OZXdTaGVsbEhhc2ggQ2hlY2sgdGhlIGRlZmluaXRpb24gb2Zcblx0ICogc2FwLnVzaGVsbC5zZXJ2aWNlcy5VUkxQYXJzaW5nPT5jb25zdHJ1Y3RTaGVsbEhhc2ggYXJndW1lbnRzXG5cdCAqIEByZXR1cm5zIFNoZWxsIEhhc2ggc3RyaW5nXG5cdCAqL1xuXHRjb25zdHJ1Y3RTaGVsbEhhc2gob05ld1NoZWxsSGFzaDogb2JqZWN0KTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy51cmxQYXJzaW5nU2VydmljZS5jb25zdHJ1Y3RTaGVsbEhhc2gob05ld1NoZWxsSGFzaCk7XG5cdH1cblxuXHQvKipcblx0ICogV2lsbCBjYWxsIHNldERpcnR5RmxhZyBtZXRob2Qgd2l0aCBnaXZlbiBkaXJ0eSBzdGF0ZS5cblx0ICogQHBhcmFtIGJEaXJ0eSBDaGVjayB0aGUgZGVmaW5pdGlvbiBvZiBzYXAudXNoZWxsLkNvbnRhaW5lci5zZXREaXJ0eUZsYWcgYXJndW1lbnRzXG5cdCAqL1xuXHRzZXREaXJ0eUZsYWcoYkRpcnR5OiBib29sZWFuKTogdm9pZCB7XG5cdFx0dGhpcy5vU2hlbGxDb250YWluZXIuc2V0RGlydHlGbGFnKGJEaXJ0eSk7XG5cdH1cblxuXHQvKipcblx0ICogV2lsbCBjYWxsIHJlZ2lzdGVyRGlydHlTdGF0ZVByb3ZpZGVyIG1ldGhvZCB3aXRoIGdpdmVuIGRpcnR5IHN0YXRlIHByb3ZpZGVyIGNhbGxiYWNrIG1ldGhvZC5cblx0ICogQHBhcmFtIGZuRGlydHlTdGF0ZVByb3ZpZGVyIENoZWNrIHRoZSBkZWZpbml0aW9uIG9mIHNhcC51c2hlbGwuQ29udGFpbmVyLnJlZ2lzdGVyRGlydHlTdGF0ZVByb3ZpZGVyIGFyZ3VtZW50c1xuXHQgKi9cblx0cmVnaXN0ZXJEaXJ0eVN0YXRlUHJvdmlkZXIoZm5EaXJ0eVN0YXRlUHJvdmlkZXI6ICgpID0+IGJvb2xlYW4pOiB2b2lkIHtcblx0XHR0aGlzLm9TaGVsbENvbnRhaW5lci5yZWdpc3RlckRpcnR5U3RhdGVQcm92aWRlcihmbkRpcnR5U3RhdGVQcm92aWRlcik7XG5cdH1cblxuXHQvKipcblx0ICogV2lsbCBjYWxsIGRlcmVnaXN0ZXJEaXJ0eVN0YXRlUHJvdmlkZXIgbWV0aG9kIHdpdGggZ2l2ZW4gZGlydHkgc3RhdGUgcHJvdmlkZXIgY2FsbGJhY2sgbWV0aG9kLlxuXHQgKiBAcGFyYW0gZm5EaXJ0eVN0YXRlUHJvdmlkZXIgQ2hlY2sgdGhlIGRlZmluaXRpb24gb2Ygc2FwLnVzaGVsbC5Db250YWluZXIuZGVyZWdpc3RlckRpcnR5U3RhdGVQcm92aWRlciBhcmd1bWVudHNcblx0ICovXG5cdGRlcmVnaXN0ZXJEaXJ0eVN0YXRlUHJvdmlkZXIoZm5EaXJ0eVN0YXRlUHJvdmlkZXI6ICgpID0+IGJvb2xlYW4pOiB2b2lkIHtcblx0XHR0aGlzLm9TaGVsbENvbnRhaW5lci5kZXJlZ2lzdGVyRGlydHlTdGF0ZVByb3ZpZGVyKGZuRGlydHlTdGF0ZVByb3ZpZGVyKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBXaWxsIGNhbGwgZ2V0VXNlciBtZXRob2Qgb2YgdXNoZWxsIGNvbnRhaW5lci5cblx0ICogQHJldHVybnMgUmV0dXJucyBVc2VyIG9iamVjdFxuXHQgKi9cblx0Z2V0VXNlcigpOiBVc2VySW5mbyB7XG5cdFx0cmV0dXJuIHRoaXMudXNlckluZm9TZXJ2aWNlO1xuXHR9XG5cblx0aXNKYW1BY3RpdmUoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMub1NoZWxsQ29udGFpbmVyLmdldFVzZXIoKS5pc0phbUFjdGl2ZSgpO1xuXHR9XG5cblx0Z2V0VXNlckluaXRpYWxzKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMub1NoZWxsQ29udGFpbmVyLmdldFVzZXIoKS5nZXRJbml0aWFscygpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFdpbGwgY2hlY2sgaWYgdXNoZWxsIGNvbnRhaW5lciBpcyBhdmFpbGFibGUgb3Igbm90LlxuXHQgKiBAcmV0dXJucyBSZXR1cm5zIHRydWVcblx0ICovXG5cdGhhc1VTaGVsbCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBXaWxsIGNhbGwgcmVnaXN0ZXJOYXZpZ2F0aW9uRmlsdGVyIG1ldGhvZCBvZiBzaGVsbE5hdmlnYXRpb24uXG5cdCAqIEBwYXJhbSBmbk5hdkZpbHRlciBUaGUgZmlsdGVyIGZ1bmN0aW9uIHRvIHJlZ2lzdGVyXG5cdCAqL1xuXHRyZWdpc3Rlck5hdmlnYXRpb25GaWx0ZXIoZm5OYXZGaWx0ZXI6IEZ1bmN0aW9uKTogdm9pZCB7XG5cdFx0dGhpcy5zaGVsbE5hdmlnYXRpb24ucmVnaXN0ZXJOYXZpZ2F0aW9uRmlsdGVyKGZuTmF2RmlsdGVyKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBXaWxsIGNhbGwgdW5yZWdpc3Rlck5hdmlnYXRpb25GaWx0ZXIgbWV0aG9kIG9mIHNoZWxsTmF2aWdhdGlvbi5cblx0ICogQHBhcmFtIGZuTmF2RmlsdGVyIFRoZSBmaWx0ZXIgZnVuY3Rpb24gdG8gdW5yZWdpc3RlclxuXHQgKi9cblx0dW5yZWdpc3Rlck5hdmlnYXRpb25GaWx0ZXIoZm5OYXZGaWx0ZXI6IEZ1bmN0aW9uKTogdm9pZCB7XG5cdFx0dGhpcy5zaGVsbE5hdmlnYXRpb24udW5yZWdpc3Rlck5hdmlnYXRpb25GaWx0ZXIoZm5OYXZGaWx0ZXIpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFdpbGwgY2FsbCBzZXRCYWNrTmF2aWdhdGlvbiBtZXRob2Qgb2YgU2hlbGxVSVNlcnZpY2Vcblx0ICogdGhhdCBkaXNwbGF5cyB0aGUgYmFjayBidXR0b24gaW4gdGhlIHNoZWxsIGhlYWRlci5cblx0ICogQHBhcmFtIGZuQ2FsbEJhY2sgQSBjYWxsYmFjayBmdW5jdGlvbiBjYWxsZWQgd2hlbiB0aGUgYnV0dG9uIGlzIGNsaWNrZWQgaW4gdGhlIFVJLlxuXHQgKi9cblx0YXN5bmMgc2V0QmFja05hdmlnYXRpb24oZm5DYWxsQmFjazogRnVuY3Rpb24pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQoYXdhaXQgdGhpcy5nZXRTaGVsbFVJU2VydmljZSgpKS5zZXRCYWNrTmF2aWdhdGlvbihmbkNhbGxCYWNrKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBXaWxsIGNhbGwgc2V0SGllcmFyY2h5IG1ldGhvZCBvZiBTaGVsbFVJU2VydmljZVxuXHQgKiB0aGF0IGRpc3BsYXlzIHRoZSBnaXZlbiBoaWVyYXJjaHkgaW4gdGhlIHNoZWxsIGhlYWRlci5cblx0ICogQHBhcmFtIFthSGllcmFyY2h5TGV2ZWxzXSBBbiBhcnJheSByZXByZXNlbnRpbmcgaGllcmFyY2hpZXMgb2YgdGhlIGN1cnJlbnRseSBkaXNwbGF5ZWQgYXBwLlxuXHQgKi9cblx0YXN5bmMgc2V0SGllcmFyY2h5KGFIaWVyYXJjaHlMZXZlbHM6IG9iamVjdFtdKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0KGF3YWl0IHRoaXMuZ2V0U2hlbGxVSVNlcnZpY2UoKSkuc2V0SGllcmFyY2h5KGFIaWVyYXJjaHlMZXZlbHMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFdpbGwgY2FsbCBzZXRUaXRsZSBtZXRob2Qgb2YgU2hlbGxVSVNlcnZpY2Vcblx0ICogdGhhdCBkaXNwbGF5cyB0aGUgZ2l2ZW4gdGl0bGUgaW4gdGhlIHNoZWxsIGhlYWRlci5cblx0ICogQHBhcmFtIFtzVGl0bGVdIFRoZSBuZXcgdGl0bGUuIFRoZSBkZWZhdWx0IHRpdGxlIGlzIHNldCBpZiB0aGlzIGFyZ3VtZW50IGlzIG5vdCBnaXZlbi5cblx0ICovXG5cdGFzeW5jIHNldFRpdGxlKHNUaXRsZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0KGF3YWl0IHRoaXMuZ2V0U2hlbGxVSVNlcnZpY2UoKSkuc2V0VGl0bGUoc1RpdGxlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBXaWxsIGNhbGwgZ2V0VGl0bGUgbWV0aG9kIG9mIFNoZWxsVUlTZXJ2aWNlXG5cdCAqIHRoYXQgZGlzcGxheXMgdGhlIGdpdmVuIHRpdGxlIGluIHRoZSBzaGVsbCBoZWFkZXIuXG5cdCAqIEByZXR1cm5zIFRoZSB0aXRsZSBvZiB0aGUgYXBwbGljYXRpb24uXG5cdCAqL1xuXHRhc3luYyBnZXRUaXRsZSgpOiBQcm9taXNlPHN0cmluZz4ge1xuXHRcdHJldHVybiAoYXdhaXQgdGhpcy5nZXRTaGVsbFVJU2VydmljZSgpKS5nZXRUaXRsZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlcyB0aGUgY3VycmVudGx5IGRlZmluZWQgY29udGVudCBkZW5zaXR5LlxuXHQgKiBAcmV0dXJucyBUaGUgY29udGVudCBkZW5zaXR5IHZhbHVlXG5cdCAqL1xuXHRnZXRDb250ZW50RGVuc2l0eSgpOiBzdHJpbmcge1xuXHRcdHJldHVybiB0aGlzLm9TaGVsbENvbnRhaW5lci5nZXRVc2VyKCkuZ2V0Q29udGVudERlbnNpdHkoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBGb3IgYSBnaXZlbiBzZW1hbnRpYyBvYmplY3QsIHRoaXMgbWV0aG9kIGNvbnNpZGVycyBhbGwgYWN0aW9ucyBhc3NvY2lhdGVkIHdpdGggdGhlIHNlbWFudGljIG9iamVjdCBhbmRcblx0ICogcmV0dXJucyB0aGUgb25lIHRhZ2dlZCBhcyBhIFwicHJpbWFyeUFjdGlvblwiLiBJZiBubyBpbmJvdW5kIHRhZ2dlZCBhcyBcInByaW1hcnlBY3Rpb25cIiBleGlzdHMsIHRoZW4gaXQgcmV0dXJuc1xuXHQgKiB0aGUgaW50ZW50IG9mIHRoZSBmaXJzdCBpbmJvdW5kIChhZnRlciBzb3J0aW5nIGhhcyBiZWVuIGFwcGxpZWQpIG1hdGNoaW5nIHRoZSBhY3Rpb24gXCJkaXNwbGF5RmFjdFNoZWV0XCIuXG5cdCAqIEBwYXJhbSBzU2VtYW50aWNPYmplY3QgU2VtYW50aWMgb2JqZWN0LlxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMgU2VlICNDcm9zc0FwcGxpY2F0aW9uTmF2aWdhdGlvbiNnZXRMaW5rcyBmb3IgZGVzY3JpcHRpb24uXG5cdCAqIEByZXR1cm5zIFByb21pc2Ugd2hpY2ggd2lsbCBiZSByZXNvbHZlZCB3aXRoIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSBpbnRlbnQgaWYgaXQgZXhpc3RzLlxuXHQgKi9cblx0YXN5bmMgZ2V0UHJpbWFyeUludGVudChzU2VtYW50aWNPYmplY3Q6IHN0cmluZywgbVBhcmFtZXRlcnM/OiBMaW5rRmlsdGVyKTogUHJvbWlzZTxMaW5rPiB7XG5cdFx0Y29uc3QgcHJpbWFyeUludGVudCA9IGF3YWl0IHRoaXMuYXBwbGljYXRpb25OYXZpZ2F0aW9uLmdldFByaW1hcnlJbnRlbnQoc1NlbWFudGljT2JqZWN0LCBtUGFyYW1ldGVycyk7XG5cdFx0aWYgKEFycmF5LmlzQXJyYXkocHJpbWFyeUludGVudCkpIHtcblx0XHRcdHJldHVybiBwcmltYXJ5SW50ZW50WzBdO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gcHJpbWFyeUludGVudDtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogV2FpdCBmb3IgdGhlIHJlbmRlciBleHRlbnNpb25zIHBsdWdpbiB0byBiZSBsb2FkZWQuXG5cdCAqIEByZXR1cm5zIFRydWUgaWYgd2UgYXJlIGFibGUgdG8gd2FpdCBmb3IgaXQsIG90aGVyd2lzZSB3ZSBjb3VsZG4ndCBhbmQgY2Fubm90IHJlbHkgb24gaXQuXG5cdCAqL1xuXHRhc3luYyB3YWl0Rm9yUGx1Z2luc0xvYWQoKTogUHJvbWlzZTxib29sZWFuPiB7XG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG5cdFx0XHRpZiAoIXRoaXMuc2hlbGxQbHVnaW5NYW5hZ2VyPy5nZXRQbHVnaW5Mb2FkaW5nUHJvbWlzZSkge1xuXHRcdFx0XHRyZXNvbHZlKGZhbHNlKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcm9taXNlL2NhdGNoLW9yLXJldHVyblxuXHRcdFx0XHR0aGlzLnNoZWxsUGx1Z2luTWFuYWdlclxuXHRcdFx0XHRcdC5nZXRQbHVnaW5Mb2FkaW5nUHJvbWlzZShcIlJlbmRlcmVyRXh0ZW5zaW9uc1wiKVxuXHRcdFx0XHRcdC5mYWlsKChvRXJyb3I6IHVua25vd24pID0+IHtcblx0XHRcdFx0XHRcdExvZy5lcnJvcihvRXJyb3IgYXMgc3RyaW5nLCBcInNhcC5mZS5jb3JlLnNlcnZpY2VzLlNoZWxsU2VydmljZXNGYWN0b3J5LndhaXRGb3JQbHVnaW5zTG9hZFwiKTtcblx0XHRcdFx0XHRcdHJlc29sdmUoZmFsc2UpO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0LnRoZW4oKCkgPT4gcmVzb2x2ZSh0cnVlKSk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IHRoZSBwZXJzb25hbGl6ZXIgZnJvbSB0aGUgc2hlbGwgc2VydmljZS5cblx0ICogV2Ugc2V0IHNvbWUgZGVmYXVsdHMgZm9yIHRoZSBzY29wZSBvYmplY3QuXG5cdCAqIEBwYXJhbSBwZXJzSWQgUGVyc29uYWxpemF0aW9uIG9iamVjdFxuXHQgKiBAcGFyYW0gc2NvcGUgU2NvcGUgb2JqZWN0XG5cdCAqIEBwYXJhbSBjb21wb25lbnRcblx0ICogQHJldHVybnMgUGVyc29uYWxpemVyIG9iamVjdCB3aGljaCBoYW5kbGVzIHBlcnNvbmFsaXphdGlvblxuXHQgKi9cblx0YXN5bmMgZ2V0UGVyc29uYWxpemVyKHBlcnNJZDogUGVyc0lkLCBzY29wZTogU2NvcGUsIGNvbXBvbmVudD86IENvbXBvbmVudCk6IFByb21pc2U8UGVyc29uYWxpemVyVHlwZT4ge1xuXHRcdHNjb3BlID0ge1xuXHRcdFx0Ly8gbWVyZ2Ugc29tZSBkZWZhdWx0c1xuXHRcdFx0a2V5Q2F0ZWdvcnk6IHRoaXMuc2hlbGxQZXJzb25hbGl6YXRpb25TZXJ2aWNlLmNvbnN0YW50cy5rZXlDYXRlZ29yeS5GSVhFRF9LRVksXG5cdFx0XHR3cml0ZUZyZXF1ZW5jeTogdGhpcy5zaGVsbFBlcnNvbmFsaXphdGlvblNlcnZpY2UuY29uc3RhbnRzLndyaXRlRnJlcXVlbmN5LkxPVyxcblx0XHRcdGNsaWVudFN0b3JhZ2VBbGxvd2VkOiBmYWxzZSxcblx0XHRcdHZhbGlkaXR5OiBJbmZpbml0eSxcblx0XHRcdC4uLnNjb3BlXG5cdFx0fTtcblx0XHRyZXR1cm4gKGF3YWl0IHRoaXMuc2hlbGxQZXJzb25hbGl6YXRpb25TZXJ2aWNlLmdldFBlcnNvbmFsaXplcihwZXJzSWQsIHNjb3BlLCBjb21wb25lbnQpKSBhcyBQZXJzb25hbGl6ZXJUeXBlO1xuXHR9XG5cblx0LyoqXG5cdCAqIERlbGV0ZXMgYSBjb250YWluZXIgaWRlbnRpZmllZCBieSBzQ29udGFpbmVyS2V5LlxuXHQgKiBAcGFyYW0ga2V5IENvbnRhaW5lciBrZXlcblx0ICogQHBhcmFtIHNjb3BlIFNjb3BlIG9iamVjdFxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHdoaWNoIGlzIHJlc29sdmVkIHdoZW4gdGhlIGNvbnRhaW5lciBpcyBkZWxldGVkXG5cdCAqL1xuXHRhc3luYyBkZWxldGVQZXJzb25hbGl6YXRpb25Db250YWluZXIoa2V5OiBzdHJpbmcsIHNjb3BlPzogb2JqZWN0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0cmV0dXJuIHRoaXMuc2hlbGxQZXJzb25hbGl6YXRpb25TZXJ2aWNlLmRlbGV0ZUNvbnRhaW5lcihrZXksIHNjb3BlIGFzIHVua25vd24gYXMgb2JqZWN0KSBhcyBQcm9taXNlPHZvaWQ+O1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgbWV0aG9kIGluaXRpYWxpemVzIHRoZSBwZXJzb25hbGl6ZXIgdG8gYWNjZXNzIHRoZSBBcHBsaWNhdGlvbiBkYXRhIHN0b3JlZCBpbiB0aGUgc2hlbGwgUGVyc29uYWxpemF0aW9uLlxuXHQgKiBAcGFyYW0gaXRlbU5hbWUgVGhlIG5hbWUgb2YgdGhlIGl0ZW0gZm9yIHdoaWNoIHRoZSBwZXJzb25hbGl6ZXIgaXMgY3JlYXRlZC5cblx0ICogQHJldHVybnMgQSBwZXJzb25hbGl6ZXJcblx0ICovXG5cdHB1YmxpYyBhc3luYyBnZXRBcHBsaWNhdGlvblBlcnNvbmFsaXplcihpdGVtTmFtZTogc3RyaW5nKTogUHJvbWlzZTxQZXJzb25hbGl6ZXJUeXBlPiB7XG5cdFx0aWYgKCF0aGlzLmFwcGxpY2F0aW9uUGVyc29ubmFsaXplcnNbaXRlbU5hbWVdKSB7XG5cdFx0XHR0aGlzLmFwcGxpY2F0aW9uUGVyc29ubmFsaXplcnNbaXRlbU5hbWVdID0gdGhpcy5nZXRQZXJzb25hbGl6ZXIoXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRjb250YWluZXI6IGBBcHBsaWNhdGlvbiMkeyh0aGlzLmFwcENvbXBvbmVudCBhcyBBcHBDb21wb25lbnQpLmdldE1hbmlmZXN0KClbXCJzYXAuYXBwXCJdLmlkfWAsXG5cdFx0XHRcdFx0aXRlbTogaXRlbU5hbWVcblx0XHRcdFx0fSxcblx0XHRcdFx0e30sXG5cdFx0XHRcdHRoaXMuYXBwQ29tcG9uZW50XG5cdFx0XHQpO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy5hcHBsaWNhdGlvblBlcnNvbm5hbGl6ZXJzW2l0ZW1OYW1lXTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGRhdGEgZnJvbSB0aGUgcGVyc29uYWxpemF0aW9uIHNlcnZpY2UuXG5cdCAqIEBwYXJhbSBpdGVtTmFtZVxuXHQgKiBAcmV0dXJucyBEYXRhXG5cdCAqL1xuXHRwdWJsaWMgYXN5bmMgZ2V0QXBwbGljYXRpb25QZXJzb25hbGl6YXRpb25EYXRhKGl0ZW1OYW1lOiBzdHJpbmcpOiBQcm9taXNlPG9iamVjdCB8IHVuZGVmaW5lZD4ge1xuXHRcdHJldHVybiAoYXdhaXQgKGF3YWl0IHRoaXMuZ2V0QXBwbGljYXRpb25QZXJzb25hbGl6ZXIoaXRlbU5hbWUpKT8uZ2V0UGVyc0RhdGEoKSkgYXMgb2JqZWN0IHwgdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgbWV0aG9kIHN0b3JlcyBhbiBvYmplY3QgaW4gdGhlIHBlcnNvbmFsaXphdGlvbiBzZXJ2aWNlLlxuXHQgKiBAcGFyYW0gaXRlbU5hbWVcblx0ICogQHBhcmFtIGRhdGFcblx0ICogQHJldHVybnMgQSBwcm9taXNlXG5cdCAqL1xuXHRwdWJsaWMgYXN5bmMgc2V0QXBwbGljYXRpb25QZXJzb25hbGl6YXRpb25EYXRhKGl0ZW1OYW1lOiBzdHJpbmcsIGRhdGE6IG9iamVjdCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdChhd2FpdCB0aGlzLmdldEFwcGxpY2F0aW9uUGVyc29uYWxpemVyKGl0ZW1OYW1lKSkuc2V0UGVyc0RhdGEoZGF0YSk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IHRoZSBzaGVsbCBjb25maWcgZnJvbSB0aGUgd2luZG93cyBvYmplY3QuXG5cdCAqIEByZXR1cm5zIFNoZWxsIGNvbmZpZyBvYmplY3Rcblx0ICovXG5cdGdldFNoZWxsQ29uZmlnKCk6IFNoZWxsQ29uZmlnVHlwZSB7XG5cdFx0cmV0dXJuICh3aW5kb3cgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCBvYmplY3Q+KVtcInNhcC11c2hlbGwtY29uZmlnXCJdIGFzIFNoZWxsQ29uZmlnVHlwZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBQYXJzZSBwYXJhbWV0ZXJzIGZyb20gYSBVUkkgcXVlcnkgc3RyaW5nIChzdGFydGluZyB3aXRoID8pIGludG8gYSBwYXJhbWV0ZXIgb2JqZWN0LlxuXHQgKiBAcGFyYW0gdXJsIENoZWNrIHRoZSBkZWZpbml0aW9uIG9mXG5cdCAqIFBhcmFtZXRlciBzdHJpbmdcblx0ICogQHJldHVybnMgQW4gb2JqZWN0IGNvbnRhaW5nIHN0cmluZyBhcnJheXNcblx0ICovXG5cdHBhcnNlUGFyYW1ldGVycyh1cmw6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPiB7XG5cdFx0cmV0dXJuIHRoaXMudXJsUGFyc2luZ1NlcnZpY2UucGFyc2VQYXJhbWV0ZXJzKHVybCk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IHRoZSBzaGVsbCBleHRlbnNpb24gc2VydmljZS5cblx0ICogQHJldHVybnMgU2hlbGwgZXh0ZW5zaW9uIHNlcnZpY2Vcblx0ICovXG5cdGdldEV4dGVuc2lvblNlcnZpY2UoKTogRXh0ZW5zaW9uIHtcblx0XHRyZXR1cm4gdGhpcy5leHRlbnNpb25TZXJ2aWNlO1xuXHR9XG59XG5cbi8qKlxuICogU2VydmljZSBGYWN0b3J5IGZvciB0aGUgU2hlbGxTZXJ2aWNlc1xuICpcbiAqL1xuY2xhc3MgU2hlbGxTZXJ2aWNlc0ZhY3RvcnkgZXh0ZW5kcyBTZXJ2aWNlRmFjdG9yeTxTaGVsbFNlcnZpY2VzU2V0dGluZ3M+IHtcblx0LyoqXG5cdCAqIENyZWF0ZXMgZWl0aGVyIGEgc3RhbmRhcmQgb3IgYSBtb2NrIFNoZWxsIHNlcnZpY2UgZGVwZW5kaW5nIG9uIHRoZSBjb25maWd1cmF0aW9uLlxuXHQgKiBAcGFyYW0gc2VydmljZUNvbnRleHQgVGhlIHNoZWxsc2VydmljZSBjb250ZXh0XG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSBmb3IgYSBzaGVsbCBzZXJ2aWNlIGltcGxlbWVudGF0aW9uXG5cdCAqIEBzZWUgU2VydmljZUZhY3RvcnkjY3JlYXRlSW5zdGFuY2Vcblx0ICovXG5cdGFzeW5jIGNyZWF0ZUluc3RhbmNlKHNlcnZpY2VDb250ZXh0OiBTZXJ2aWNlQ29udGV4dDxTaGVsbFNlcnZpY2VzU2V0dGluZ3M+KTogUHJvbWlzZTxJU2hlbGxTZXJ2aWNlcz4ge1xuXHRcdHNlcnZpY2VDb250ZXh0LnNldHRpbmdzLnNoZWxsQ29udGFpbmVyID0gc2FwLnVpLnJlcXVpcmUoXCJzYXAvdXNoZWxsL0NvbnRhaW5lclwiKTtcblx0XHRjb25zdCBzaGVsbFNlcnZpY2UgPSBzZXJ2aWNlQ29udGV4dC5zZXR0aW5ncy5zaGVsbENvbnRhaW5lclxuXHRcdFx0PyBuZXcgU2hlbGxTZXJ2aWNlcyhzZXJ2aWNlQ29udGV4dCBhcyBTZXJ2aWNlQ29udGV4dDxSZXF1aXJlZDxTaGVsbFNlcnZpY2VzU2V0dGluZ3M+Pilcblx0XHRcdDogbmV3IFNoZWxsU2VydmljZU1vY2soc2VydmljZUNvbnRleHQpO1xuXHRcdGF3YWl0IHNoZWxsU2VydmljZS5pbml0UHJvbWlzZTtcblx0XHQvLyBFbnJpY2ggdGhlIGFwcENvbXBvbmVudCB3aXRoIHRoaXMgbWV0aG9kXG5cdFx0Y29uc3QgYXBwQ29tcG9uZW50ID0gc2VydmljZUNvbnRleHQuc2NvcGVPYmplY3Q7XG5cdFx0YXBwQ29tcG9uZW50LmdldFNoZWxsU2VydmljZXMgPSAoKTogSVNoZWxsU2VydmljZXMgPT4gc2hlbGxTZXJ2aWNlO1xuXHRcdGNvbnN0IGludGVybmFsTW9kZWwgPSBhcHBDb21wb25lbnQuZ2V0TW9kZWwoXCJpbnRlcm5hbFwiKTtcblx0XHRpZiAoaW50ZXJuYWxNb2RlbCkge1xuXHRcdFx0bGV0IHNlbWFudGljT2JqZWN0czogc3RyaW5nW10gPSBbXTtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdHNlbWFudGljT2JqZWN0cyA9IGF3YWl0IHNoZWxsU2VydmljZS5fX2ZldGNoU2VtYW50aWNPYmplY3QoKTtcblx0XHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGNhbGxpbmcgZ2V0U2VtYW50aWNPYmplY3RzXCIsIGVycm9yIGFzIHN0cmluZyk7XG5cdFx0XHR9IGZpbmFsbHkge1xuXHRcdFx0XHQoaW50ZXJuYWxNb2RlbCBhcyBKU09OTW9kZWwpLnNldFByb3BlcnR5KFwiL3NlbWFudGljT2JqZWN0c1wiLCBzZW1hbnRpY09iamVjdHMpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gc2hlbGxTZXJ2aWNlO1xuXHR9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFNoZWxsU2VydmljZXNGYWN0b3J5O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0VBa0NBO0VBeUNBO0FBQ0E7QUFDQTtFQTBHQTtBQUNBO0FBQ0E7QUFDQTtFQUhBLElBSU1BLGdCQUFnQiwwQkFBQUMsUUFBQTtJQUFBQyxjQUFBLENBQUFGLGdCQUFBLEVBQUFDLFFBQUE7SUFBQSxTQUFBRCxpQkFBQTtNQUFBLE9BQUFDLFFBQUEsQ0FBQUUsS0FBQSxPQUFBQyxTQUFBO0lBQUE7SUFBQSxJQUFBQyxNQUFBLEdBQUFMLGdCQUFBLENBQUFNLFNBQUE7SUFBQUQsTUFBQSxDQU9yQkUsSUFBSSxHQUFKLFNBQUFBLEtBQUEsRUFBYTtNQUNaLElBQUksQ0FBQ0MsV0FBVyxHQUFHQyxPQUFPLENBQUNDLE9BQU8sQ0FBQyxJQUFzQixDQUFDO01BQzFELElBQUksQ0FBQ0MsWUFBWSxHQUFHLE1BQU07SUFDM0IsQ0FBQztJQUFBTixNQUFBLENBRUtPLFFBQVEsR0FBZCxlQUFBQSxTQUFBLENBQWU7SUFBQSxFQUFzQztNQUNwRCxPQUFPSCxPQUFPLENBQUNDLE9BQU8sQ0FBQyxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUFBTCxNQUFBLENBRUtRLHFCQUFxQixHQUEzQixlQUFBQSxzQkFBQSxFQUFpRDtNQUNoRCxPQUFPSixPQUFPLENBQUNDLE9BQU8sQ0FBQyxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUFBTCxNQUFBLENBRUtTLGlCQUFpQixHQUF2QixlQUFBQSxrQkFBQSxDQUF3QjtJQUFBLEVBQXNDO01BQzdELE9BQU9MLE9BQU8sQ0FBQ0MsT0FBTyxDQUFDLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBQUFMLE1BQUEsQ0FFRFUsVUFBVSxHQUFWLFNBQUFBLFdBQUEsQ0FBVztJQUFBLEVBQStEO01BQ3pFO0lBQUEsQ0FDQTtJQUFBVixNQUFBLENBRUtXLGtCQUFrQixHQUF4QixlQUFB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
838
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJTaGVsbFNlcnZpY2VNb2NrIiwiX1NlcnZpY2UiLCJhcHBseSIsImFyZ3VtZW50cyIsIl9pbmhlcml0c0xvb3NlIiwiX3Byb3RvIiwicHJvdG90eXBlIiwiaW5pdCIsImluaXRQcm9taXNlIiwiUHJvbWlzZSIsInJlc29sdmUiLCJpbnN0YW5jZVR5cGUiLCJnZXRMaW5rcyIsIl9fZmV0Y2hTZW1hbnRpY09iamVjdCIsImdldExpbmtzV2l0aENhY2hlIiwidG9FeHRlcm5hbCIsImdldFN0YXJ0dXBBcHBTdGF0ZSIsInVuZGVmaW5lZCIsImlzSmFtQWN0aXZlIiwiYmFja1RvUHJldmlvdXNBcHAiLCJocmVmRm9yRXh0ZXJuYWwiLCJnZXRIcmVmIiwiZ2V0SGFzaCIsIndpbmRvdyIsImxvY2F0aW9uIiwiaHJlZiIsImdldEFwcFN0YXRlIiwiY3JlYXRlRW1wdHlBcHBTdGF0ZSIsImNyZWF0ZUVtcHR5QXBwU3RhdGVBc3luYyIsIm5hdmlnYXRlIiwiaXNOYXZpZ2F0aW9uU3VwcG9ydGVkIiwiaXNJbml0aWFsTmF2aWdhdGlvbiIsImV4cGFuZENvbXBhY3RIYXNoIiwicGFyc2VTaGVsbEhhc2giLCJzcGxpdEhhc2giLCJzSGFzaCIsInJlZ2V4IiwiZXhlYyIsInNoZWxsUGFydCIsImFwcFNwZWNpZmljUm91dGUiLCJsZW5ndGgiLCJjb25zdHJ1Y3RTaGVsbEhhc2giLCJzZXREaXJ0eUZsYWciLCJyZWdpc3RlckRpcnR5U3RhdGVQcm92aWRlciIsImRlcmVnaXN0ZXJEaXJ0eVN0YXRlUHJvdmlkZXIiLCJnZXRVc2VyIiwiZ2V0VXNlckluaXRpYWxzIiwiaGFzVVNoZWxsIiwicmVnaXN0ZXJOYXZpZ2F0aW9uRmlsdGVyIiwidW5yZWdpc3Rlck5hdmlnYXRpb25GaWx0ZXIiLCJzZXRCYWNrTmF2aWdhdGlvbiIsInNldEhpZXJhcmNoeSIsInNldFRpdGxlIiwiZ2V0Q29udGVudERlbnNpdHkiLCJkb2N1bWVudCIsImJvZHkiLCJjbGFzc0xpc3QiLCJjb250YWlucyIsImdldFByaW1hcnlJbnRlbnQiLCJ3YWl0Rm9yUGx1Z2luc0xvYWQiLCJnZXRUaXRsZSIsImdldFBlcnNvbmFsaXplciIsIl9wZXJzSWQiLCJfc2NvcGUiLCJfY29tcG9uZW50IiwiZ2V0UGVyc0RhdGEiLCJoaXN0b3J5RW5hYmxlZCIsInN1Z2dlc3Rpb25zRW5hYmxlZCIsImFwcHMiLCJzZXRQZXJzRGF0YSIsImdldEFwcGxpY2F0aW9uUGVyc29uYWxpemVyIiwiX2l0ZW1OYW1lIiwiZ2V0QXBwbGljYXRpb25QZXJzb25hbGl6YXRpb25EYXRhIiwic2V0QXBwbGljYXRpb25QZXJzb25hbGl6YXRpb25EYXRhIiwiX29iamVjdCIsImRlbGV0ZVBlcnNvbmFsaXphdGlvbkNvbnRhaW5lciIsIl9rZXkiLCJnZXRTaGVsbENvbmZpZyIsImdldFJlZ2lzdGVyZWRQbHVnaW5zIiwiQXBwV2FybXVwIiwiUmVuZGVyZXJFeHRlbnNpb25zIiwiVXNlckRlZmF1bHRzIiwiVXNlckltYWdlIiwiaXNGbHBPcHRpbWlzdGljQmF0Y2hQbHVnaW5Mb2FkZWQiLCJwYXJzZVBhcmFtZXRlcnMiLCJnZXRFeHRlbnNpb25TZXJ2aWNlIiwiZ2V0SW5mcmFtZVVybCIsIlNlcnZpY2UiLCJTaGVsbFNlcnZpY2VzIiwiX1NlcnZpY2UyIiwiX3RoaXMiLCJfbGVuIiwiYXJncyIsIkFycmF5IiwiX2tleTIiLCJjYWxsIiwiYXBwbGljYXRpb25QZXJzb25uYWxpemVycyIsIl9leHBvcnRzIiwiX3Byb3RvMiIsIm9Db250ZXh0IiwiZ2V0Q29udGV4dCIsImFwcENvbXBvbmVudCIsInNjb3BlT2JqZWN0Iiwib1NoZWxsQ29udGFpbmVyIiwic2V0dGluZ3MiLCJzaGVsbENvbnRhaW5lciIsImxpbmtzQ2FjaGUiLCJmbkZpbmRTZW1hbnRpY09iamVjdHNJbkNhY2hlIiwib0FyZ3MiLCJhQ2FjaGVkU2VtYW50aWNPYmplY3RzIiwiYU5vbkNhY2hlZFNlbWFudGljT2JqZWN0cyIsImxpbmtGaWx0ZXIiLCJzZW1hbnRpY09iamVjdCIsInB1c2giLCJsaW5rcyIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwidmFsdWUiLCJvbGRBcmdzIiwibmV3QXJncyIsImNhY2hlZExpbmtzIiwicmVqZWN0IiwicmVzb2x2ZUZuIiwicmVqZWN0Rm4iLCJuYXZpZ2F0aW9uU2VydmljZVAiLCJnZXRTZXJ2aWNlQXN5bmMiLCJ1c2VySW5mb1NlcnZpY2VQIiwib1VybFBhcnNpbmdTZXJ2aWNlUHJvbWlzZSIsIm9TaGVsbE5hdmlnYXRpb25TZXJ2aWNlUHJvbWlzZSIsIm9TaGVsbFBsdWdpbk1hbmFnZXJQcm9taXNlIiwib1NoZWxsUGVyc29uYWxpemF0aW9uU2VydmljZVByb21pc2UiLCJvU2hlbGxFeHRlbnNpb25TZXJ2aWNlUHJvbWlzZSIsImFsbCIsInRoZW4iLCJfcmVmIiwibmF2aWdhdGlvblNlcnZpY2UiLCJ1c2VySW5mb1NlcnZpY2UiLCJvVXJsUGFyc2luZ1NlcnZpY2UiLCJvU2hlbGxOYXZpZ2F0aW9uIiwib1NoZWxsUGVyc29uYWxpemF0aW9uU2VydmljZSIsIm9TaGVsbFBsdWdpbk1hbmFnZXIiLCJvU2hlbGxFeHRlbnNpb25TZXJ2aWNlIiwiYXBwbGljYXRpb25OYXZpZ2F0aW9uIiwidXJsUGFyc2luZ1NlcnZpY2UiLCJzaGVsbE5hdmlnYXRpb24iLCJzaGVsbFBlcnNvbmFsaXphdGlvblNlcnZpY2UiLCJzaGVsbFBsdWdpbk1hbmFnZXIiLCJleHRlbnNpb25TZXJ2aWNlIiwiY2F0Y2giLCJnZXRTZW1hbnRpY09iamVjdHMiLCJvQ2FjaGVSZXN1bHRzIiwiYUxpbmtzIiwib1NlbWFudGljT2JqZWN0c0xpbmtzIiwiaSIsImFzc2lnbiIsImFNZXJnZWRMaW5rcyIsImoiLCJpdGVtIiwiZ2V0U2hlbGxVSVNlcnZpY2UiLCJnZXRTZXJ2aWNlIiwiZ2V0U2hlbGxDb250YWluZXIiLCJ1c2hlbGxDb250YWluZXIiLCJhcHBVcmwiLCJpbkFwcFJ1bnRpbWUiLCJnZXRGTFBVcmxBc3luYyIsImVycm9yIiwiTG9nIiwib05hdkFyZ3VtZW50c0FyciIsIm9Db21wb25lbnQiLCJvVGFyZ2V0Iiwic0FwcFN0YXRlS2V5IiwiYVRhcmdldHMiLCJzSGFzaEZyYWdtZW50IiwiZ2V0U2hlbGxIYXNoIiwiZmxwUGx1Z2luc1JlbmRlcmVyRXh0ZW5zaW9ucyIsImhhc093blByb3BlcnR5IiwiTUFOQUdFX0ZFX0NBQ0hFUyIsImVuYWJsZWQiLCJvTmV3U2hlbGxIYXNoIiwiYkRpcnR5IiwiZm5EaXJ0eVN0YXRlUHJvdmlkZXIiLCJnZXRJbml0aWFscyIsImZuTmF2RmlsdGVyIiwiZm5DYWxsQmFjayIsImFIaWVyYXJjaHlMZXZlbHMiLCJzVGl0bGUiLCJzU2VtYW50aWNPYmplY3QiLCJtUGFyYW1ldGVycyIsInByaW1hcnlJbnRlbnQiLCJpc0FycmF5IiwiZ2V0UGx1Z2luTG9hZGluZ1Byb21pc2UiLCJmYWlsIiwib0Vycm9yIiwicGVyc0lkIiwic2NvcGUiLCJjb21wb25lbnQiLCJrZXlDYXRlZ29yeSIsImNvbnN0YW50cyIsIkZJWEVEX0tFWSIsIndyaXRlRnJlcXVlbmN5IiwiTE9XIiwiY2xpZW50U3RvcmFnZUFsbG93ZWQiLCJ2YWxpZGl0eSIsIkluZmluaXR5Iiwia2V5IiwiZGVsZXRlQ29udGFpbmVyIiwiaXRlbU5hbWUiLCJjb250YWluZXIiLCJnZXRNYW5pZmVzdCIsImlkIiwiZGF0YSIsInVybCIsIlNoZWxsU2VydmljZXNGYWN0b3J5IiwiX1NlcnZpY2VGYWN0b3J5IiwiX3Byb3RvMyIsImNyZWF0ZUluc3RhbmNlIiwic2VydmljZUNvbnRleHQiLCJzYXAiLCJ1aSIsInJlcXVpcmUiLCJzaGVsbFNlcnZpY2UiLCJnZXRTaGVsbFNlcnZpY2VzIiwiaW50ZXJuYWxNb2RlbCIsImdldE1vZGVsIiwic2VtYW50aWNPYmplY3RzIiwic2V0UHJvcGVydHkiLCJTZXJ2aWNlRmFjdG9yeSJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiU2hlbGxTZXJ2aWNlc0ZhY3RvcnkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgdHlwZSBDb21wb25lbnQgZnJvbSBcInNhcC91aS9jb3JlL0NvbXBvbmVudFwiO1xuaW1wb3J0IFNlcnZpY2UgZnJvbSBcInNhcC91aS9jb3JlL3NlcnZpY2UvU2VydmljZVwiO1xuaW1wb3J0IFNlcnZpY2VGYWN0b3J5IGZyb20gXCJzYXAvdWkvY29yZS9zZXJ2aWNlL1NlcnZpY2VGYWN0b3J5XCI7XG5pbXBvcnQgdHlwZSBKU09OTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9qc29uL0pTT05Nb2RlbFwiO1xuaW1wb3J0IHR5cGUgQ29udGFpbmVyIGZyb20gXCJzYXAvdXNoZWxsL0NvbnRhaW5lclwiO1xuaW1wb3J0IHR5cGUgRXh0ZW5zaW9uIGZyb20gXCJzYXAvdXNoZWxsL3NlcnZpY2VzL0V4dGVuc2lvblwiO1xuaW1wb3J0IHR5cGUgTmF2aWdhdGlvbiBmcm9tIFwic2FwL3VzaGVsbC9zZXJ2aWNlcy9OYXZpZ2F0aW9uXCI7XG5pbXBvcnQgdHlwZSB7IExpbmssIExpbmtGaWx0ZXIsIFRhcmdldCB9IGZyb20gXCJzYXAvdXNoZWxsL3NlcnZpY2VzL05hdmlnYXRpb25cIjtcbmltcG9ydCB0eXBlIFBlcnNvbmFsaXphdGlvblYyIGZyb20gXCJzYXAvdXNoZWxsL3NlcnZpY2VzL1BlcnNvbmFsaXphdGlvblYyXCI7XG5pbXBvcnQgeyB0eXBlIFBlcnNJZCwgdHlwZSBTY29wZSB9IGZyb20gXCJzYXAvdXNoZWxsL3NlcnZpY2VzL1BlcnNvbmFsaXphdGlvblYyXCI7XG5pbXBvcnQgdHlwZSBTaGVsbE5hdmlnYXRpb24gZnJvbSBcInNhcC91c2hlbGwvc2VydmljZXMvU2hlbGxOYXZpZ2F0aW9uXCI7XG5pbXBvcnQgdHlwZSBVUkxQYXJzaW5nIGZyb20gXCJzYXAvdXNoZWxsL3NlcnZpY2VzL1VSTFBhcnNpbmdcIjtcbmltcG9ydCB0eXBlIHsgUGFyc2VkSGFzaCB9IGZyb20gXCJzYXAvdXNoZWxsL3NlcnZpY2VzL1VSTFBhcnNpbmdcIjtcbmltcG9ydCB0eXBlIFVzZXJJbmZvIGZyb20gXCJzYXAvdXNoZWxsL3NlcnZpY2VzL1VzZXJJbmZvXCI7XG5pbXBvcnQgdHlwZSBTaGVsbFVJU2VydmljZSBmcm9tIFwic2FwL3VzaGVsbC91aTVzZXJ2aWNlL1NoZWxsVUlTZXJ2aWNlXCI7XG5pbXBvcnQgdHlwZSB7IFNlcnZpY2VDb250ZXh0IH0gZnJvbSBcInR5cGVzL21ldGFtb2RlbF90eXBlc1wiO1xuaW1wb3J0IHR5cGUgQXBwQ29tcG9uZW50IGZyb20gXCIuLi9BcHBDb21wb25lbnRcIjtcblxuZXhwb3J0IHR5cGUgU3RhcnR1cEFwcFN0YXRlID0ge1xuXHRnZXREYXRhKCk6IHtcblx0XHRzZWxlY3Rpb25WYXJpYW50Pzoge1xuXHRcdFx0U2VsZWN0T3B0aW9ucz86IHtcblx0XHRcdFx0UHJvcGVydHlOYW1lOiBzdHJpbmc7XG5cdFx0XHRcdFJhbmdlczoge1xuXHRcdFx0XHRcdE9wdGlvbjogc3RyaW5nO1xuXHRcdFx0XHRcdFNpZ246IHN0cmluZztcblx0XHRcdFx0XHRMb3c6IHN0cmluZztcblx0XHRcdFx0fVtdO1xuXHRcdFx0fVtdO1xuXHRcdH07XG5cdH07XG59O1xuXG4vLyBzZWU6IHNhcFxcdXNoZWxsXFxzZXJ2aWNlc1xcX1BlcnNvbmFsaXphdGlvblxcY29uc3RhbnRzLmpzXG5leHBvcnQgdHlwZSBQZXJzb25hbGl6YXRpb25XaXRoQ29uc3RhbnRzID0gUGVyc29uYWxpemF0aW9uVjIgJiB7XG5cdGNvbnN0YW50czoge1xuXHRcdGtleUNhdGVnb3J5OiB7XG5cdFx0XHRGSVhFRF9LRVk6IHN0cmluZztcblx0XHRcdEdFTkVSQVRFRF9LRVk6IHN0cmluZztcblx0XHR9O1xuXHRcdHdyaXRlRnJlcXVlbmN5OiB7XG5cdFx0XHRISUdIOiBzdHJpbmc7XG5cdFx0XHRMT1c6IHN0cmluZztcblx0XHR9O1xuXHR9O1xufTtcblxuZXhwb3J0IHR5cGUgUGVyc29uYWxpemVyVHlwZSA9IHtcblx0Z2V0UGVyc0RhdGE6ICgpID0+IFByb21pc2U8b2JqZWN0Pjtcblx0c2V0UGVyc0RhdGE6IChwZXJzRGF0YTogb2JqZWN0KSA9PiB2b2lkO1xufTtcblxuZXhwb3J0IHR5cGUgU2hlbGxDb25maWdUeXBlID0ge1xuXHRhcHBzOiB7XG5cdFx0aW5wdXRGaWVsZEhpc3Rvcnk6IHtcblx0XHRcdGVuYWJsZWQ6IGJvb2xlYW47XG5cdFx0fTtcblx0fTtcbn07XG5cbmV4cG9ydCB0eXBlIEZMUFBsdWdpbiA9IHtcblx0Y29tcG9uZW50OiBzdHJpbmc7XG5cdGVuYWJsZWQ6IGJvb2xlYW47XG5cdHVybDogc3RyaW5nO1xuXHRjb25maWc6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG59O1xuXG5leHBvcnQgdHlwZSBSZWdpc3RlcmVkUGx1Z2luc01hcFR5cGUgPSB7XG5cdEFwcFdhcm11cDogUmVjb3JkPHN0cmluZywgRkxQUGx1Z2luPiB8IHt9O1xuXHRSZW5kZXJlckV4dGVuc2lvbnM6IFJlY29yZDxzdHJpbmcsIEZMUFBsdWdpbj4gfCB7fTtcblx0VXNlckRlZmF1bHRzOiBSZWNvcmQ8c3RyaW5nLCBGTFBQbHVnaW4+IHwge307XG5cdFVzZXJJbWFnZTogUmVjb3JkPHN0cmluZywgRkxQUGx1Z2luPiB8IHt9O1xufTtcblxuLyoqXG4gKiBAaW50ZXJmYWNlIElTaGVsbFNlcnZpY2VzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSVNoZWxsU2VydmljZXMge1xuXHRpbml0UHJvbWlzZTogUHJvbWlzZTxJU2hlbGxTZXJ2aWNlcz47XG5cdGluc3RhbmNlVHlwZTogc3RyaW5nO1xuXHRzZW1hbnRpY09iamVjdHM6IHN0cmluZ1tdO1xuXG5cdGdldExpbmtzKG9BcmdzPzogT21pdDxMaW5rRmlsdGVyLCBcInVpNUNvbXBvbmVudFwiPltdKTogUHJvbWlzZTxMaW5rW11bXT47XG5cblx0Z2V0TGlua3NXaXRoQ2FjaGUob0FyZ3M/OiBPbWl0PExpbmtGaWx0ZXIsIFwidWk1Q29tcG9uZW50XCI+W10pOiBQcm9taXNlPExpbmtbXVtdPjtcblxuXHR0b0V4dGVybmFsKG9OYXZBcmd1bWVudHNBcnI6IG9iamVjdCwgb0NvbXBvbmVudD86IG9iamVjdCk6IHZvaWQ7XG5cblx0Z2V0U3RhcnR1cEFwcFN0YXRlKG9BcmdzOiBvYmplY3QpOiBQcm9taXNlPHVuZGVmaW5lZCB8IFN0YXJ0dXBBcHBTdGF0ZT47XG5cblx0YmFja1RvUHJldmlvdXNBcHAoKTogdm9pZDtcblxuXHRocmVmRm9yRXh0ZXJuYWwob0FyZ3M/OiBvYmplY3QsIG9Db21wb25lbnQ/OiBvYmplY3QpOiBQcm9taXNlPHN0cmluZz47XG5cblx0Z2V0SHJlZihvVGFyZ2V0OiBvYmplY3QsIG9Db21wb25lbnQ6IENvbXBvbmVudCk6IFByb21pc2U8c3RyaW5nPjtcblxuXHRnZXRBcHBTdGF0ZShvQ29tcG9uZW50OiBDb21wb25lbnQsIHNBcHBTdGF0ZUtleTogc3RyaW5nKTogUHJvbWlzZTx1bmtub3duPjtcblxuXHRjcmVhdGVFbXB0eUFwcFN0YXRlKG9Db21wb25lbnQ6IENvbXBvbmVudCk6IG9iamVjdDtcblxuXHRjcmVhdGVFbXB0eUFwcFN0YXRlKG9Db21wb25lbnQ6IENvbXBvbmVudCk6IFByb21pc2U8dW5rbm93bj47XG5cblx0bmF2aWdhdGUob1RhcmdldDogVGFyZ2V0LCBvQ29tcG9uZW50PzogQ29tcG9uZW50KTogUHJvbWlzZTx1bmRlZmluZWQ+O1xuXG5cdGlzTmF2aWdhdGlvblN1cHBvcnRlZChvTmF2QXJndW1lbnRzQXJyOiBBcnJheTxvYmplY3Q+LCBvQ29tcG9uZW50Pzogb2JqZWN0KTogUHJvbWlzZTx7IHN1cHBvcnRlZDogYm9vbGVhbiB9W10+O1xuXG5cdGlzSW5pdGlhbE5hdmlnYXRpb24oKTogUHJvbWlzZTxib29sZWFuPjtcblxuXHRleHBhbmRDb21wYWN0SGFzaChzSGFzaEZyYWdtZW50OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz47XG5cblx0Z2V0SGFzaCgpOiBzdHJpbmc7XG5cblx0cGFyc2VTaGVsbEhhc2goc0hhc2g6IHN0cmluZyk6IFBhcnNlZEhhc2g7XG5cblx0c3BsaXRIYXNoKHNIYXNoOiBzdHJpbmcpOiBSZXR1cm5UeXBlPFVSTFBhcnNpbmdbXCJzcGxpdEhhc2hcIl0+O1xuXG5cdGNvbnN0cnVjdFNoZWxsSGFzaChvTmV3U2hlbGxIYXNoOiBvYmplY3QpOiBzdHJpbmc7XG5cblx0c2V0RGlydHlGbGFnKGJEaXJ0eTogYm9vbGVhbik6IHZvaWQ7XG5cblx0cmVnaXN0ZXJEaXJ0eVN0YXRlUHJvdmlkZXIoZm5EaXJ0eVN0YXRlUHJvdmlkZXI6IEZ1bmN0aW9uKTogdm9pZDtcblxuXHRkZXJlZ2lzdGVyRGlydHlTdGF0ZVByb3ZpZGVyKGZuRGlydHlTdGF0ZVByb3ZpZGVyOiBGdW5jdGlvbik6IHZvaWQ7XG5cblx0Z2V0VXNlcigpOiBVc2VySW5mbztcblx0Z2V0VXNlckluaXRpYWxzKCk6IHN0cmluZztcblxuXHRoYXNVU2hlbGwoKTogYm9vbGVhbjtcblxuXHRyZWdpc3Rlck5hdmlnYXRpb25GaWx0ZXIoZm5OYXZGaWx0ZXI6IEZ1bmN0aW9uKTogdm9pZDtcblxuXHR1bnJlZ2lzdGVyTmF2aWdhdGlvbkZpbHRlcihmbk5hdkZpbHRlcjogRnVuY3Rpb24pOiB2b2lkO1xuXG5cdHNldEJhY2tOYXZpZ2F0aW9uKGZuQ2FsbEJhY2s/OiBGdW5jdGlvbik6IFByb21pc2U8dm9pZD47XG5cblx0c2V0SGllcmFyY2h5KGFIaWVyYXJjaHlMZXZlbHM6IEFycmF5PG9iamVjdD4pOiBQcm9taXNlPHZvaWQ+O1xuXG5cdHNldFRpdGxlKHNUaXRsZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPjtcblxuXHRpc0phbUFjdGl2ZSgpOiBib29sZWFuO1xuXG5cdGdldENvbnRlbnREZW5zaXR5KCk6IHN0cmluZztcblxuXHRnZXRQcmltYXJ5SW50ZW50KHNTZW1hbnRpY09iamVjdDogc3RyaW5nLCBtUGFyYW1ldGVycz86IG9iamVjdCk6IFByb21pc2U8TGluaz47XG5cblx0d2FpdEZvclBsdWdpbnNMb2FkKCk6IFByb21pc2U8Ym9vbGVhbj47XG5cblx0Z2V0UmVnaXN0ZXJlZFBsdWdpbnMoKTogUmVnaXN0ZXJlZFBsdWdpbnNNYXBUeXBlO1xuXG5cdGlzRmxwT3B0aW1pc3RpY0JhdGNoUGx1Z2luTG9hZGVkKCk6IGJvb2xlYW47XG5cblx0Z2V0VGl0bGUoKTogUHJvbWlzZTxzdHJpbmc+O1xuXG5cdGdldFBlcnNvbmFsaXplcihwZXJzSWQ6IFBlcnNJZCwgc2NvcGU6IFNjb3BlLCBjb21wb25lbnQ/OiBDb21wb25lbnQpOiBQcm9taXNlPFBlcnNvbmFsaXplclR5cGU+O1xuXG5cdGRlbGV0ZVBlcnNvbmFsaXphdGlvbkNvbnRhaW5lcihrZXk6IHN0cmluZywgc2NvcGU/OiBvYmplY3QpOiBQcm9taXNlPHZvaWQ+O1xuXG5cdGdldFNoZWxsQ29uZmlnKCk6IFNoZWxsQ29uZmlnVHlwZTtcblxuXHRwYXJzZVBhcmFtZXRlcnModXJsOiBzdHJpbmcpOiBSZXR1cm5UeXBlPFVSTFBhcnNpbmdbXCJwYXJzZVBhcmFtZXRlcnNcIl0+O1xuXG5cdGdldEV4dGVuc2lvblNlcnZpY2UoKTogRXh0ZW5zaW9uO1xuXG5cdGdldEluZnJhbWVVcmwoKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+O1xuXG5cdGdldEFwcGxpY2F0aW9uUGVyc29uYWxpemVyKGl0ZW1OYW1lOiBzdHJpbmcpOiBQcm9taXNlPFBlcnNvbmFsaXplclR5cGU+O1xuXG5cdGdldEFwcGxpY2F0aW9uUGVyc29uYWxpemF0aW9uRGF0YShpdGVtTmFtZTogc3RyaW5nKTogUHJvbWlzZTxPYmplY3QgfCB1bmRlZmluZWQ+O1xuXG5cdHNldEFwcGxpY2F0aW9uUGVyc29uYWxpemF0aW9uRGF0YShpdGVtTmFtZTogc3RyaW5nLCBvYmplY3Q6IE9iamVjdCk6IFByb21pc2U8dm9pZD47XG59XG50eXBlIE5hdmlnYXRpb25FeHRlbnNpb24gPSBOYXZpZ2F0aW9uICYge1xuXHRnZXRTdGFydHVwQXBwU3RhdGUob0FwcENvbXBvbmVudDogQ29tcG9uZW50KTogUHJvbWlzZTxTdGFydHVwQXBwU3RhdGUgfCB1bmRlZmluZWQ+O1xuXHRnZXRBcHBTdGF0ZShvQXBwQ29tcG9uZW50OiBDb21wb25lbnQsIHNBcHBTdGF0ZUtleTogc3RyaW5nKTogUHJvbWlzZTxvYmplY3Q+O1xuXHRjcmVhdGVFbXB0eUFwcFN0YXRlKFxuXHRcdG9BcHBDb21wb25lbnQ6IENvbXBvbmVudCxcblx0XHRiVHJhbnNpZW50RW5mb3JjZWQ/OiBib29sZWFuLFxuXHRcdHNQZXJzaXN0ZW5jeU1ldGhvZD86IHN0cmluZyxcblx0XHRvUGVyc2lzdGVuY3lTZXR0aW5ncz86IG9iamVjdFxuXHQpOiBQcm9taXNlPG9iamVjdD47XG59O1xuXG4vKipcbiAqIE1vY2sgaW1wbGVtZW50YXRpb24gb2YgdGhlIFNoZWxsU2VydmljZSBmb3IgT3BlbkZFXG4gKlxuICovXG5jbGFzcyBTaGVsbFNlcnZpY2VNb2NrIGV4dGVuZHMgU2VydmljZTxTaGVsbFNlcnZpY2VzU2V0dGluZ3M+IGltcGxlbWVudHMgSVNoZWxsU2VydmljZXMge1xuXHRpbml0UHJvbWlzZSE6IFByb21pc2U8SVNoZWxsU2VydmljZXM+O1xuXG5cdGluc3RhbmNlVHlwZSE6IHN0cmluZztcblxuXHRzZW1hbnRpY09iamVjdHMhOiBzdHJpbmdbXTtcblxuXHRpbml0KCk6IHZvaWQge1xuXHRcdHRoaXMuaW5pdFByb21pc2UgPSBQcm9taXNlLnJlc29sdmUodGhpcyBhcyBJU2hlbGxTZXJ2aWNlcyk7XG5cdFx0dGhpcy5pbnN0YW5jZVR5cGUgPSBcIm1vY2tcIjtcblx0fVxuXG5cdGFzeW5jIGdldExpbmtzKC8qb0FyZ3M6IG9iamVjdCovKTogUHJvbWlzZTxMaW5rW11bXT4ge1xuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoW10pO1xuXHR9XG5cblx0YXN5bmMgX19mZXRjaFNlbWFudGljT2JqZWN0KCk6IFByb21pc2U8c3RyaW5nW10+IHtcblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFtdKTtcblx0fVxuXG5cdGFzeW5jIGdldExpbmtzV2l0aENhY2hlKC8qb0FyZ3M6IG9iamVjdCovKTogUHJvbWlzZTxMaW5rW11bXT4ge1xuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoW10pO1xuXHR9XG5cblx0dG9FeHRlcm5hbCgvKm9OYXZBcmd1bWVudHNBcnI6IEFycmF5PG9iamVjdD4sIG9Db21wb25lbnQ6IG9iamVjdCovKTogdm9pZCB7XG5cdFx0LyogRG8gTm90aGluZyAqL1xuXHR9XG5cblx0YXN5bmMgZ2V0U3RhcnR1cEFwcFN0YXRlKC8qb0FyZ3M6IG9iamVjdCovKTogUHJvbWlzZTxTdGFydHVwQXBwU3RhdGUgfCB1bmRlZmluZWQ+IHtcblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHVuZGVmaW5lZCk7XG5cdH1cblxuXHRpc0phbUFjdGl2ZSgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRiYWNrVG9QcmV2aW91c0FwcCgpOiB2b2lkIHtcblx0XHQvKiBEbyBOb3RoaW5nICovXG5cdH1cblxuXHRhc3luYyBocmVmRm9yRXh0ZXJuYWwoLypvQXJncz86IG9iamVjdCwgb0NvbXBvbmVudD86IG9iamVjdCwgYkFzeW5jPzogYm9vbGVhbiovKTogUHJvbWlzZTxzdHJpbmc+IHtcblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFwiXCIpO1xuXHR9XG5cblx0YXN5bmMgZ2V0SHJlZigvKm9BcmdzPzogb2JqZWN0LCBvQ29tcG9uZW50Pzogb2JqZWN0LCBiQXN5bmM/OiBib29sZWFuKi8pOiBQcm9taXNlPHN0cmluZz4ge1xuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoXCJcIik7XG5cdH1cblxuXHRnZXRIYXNoKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xuXHR9XG5cblx0YXN5bmMgZ2V0QXBwU3RhdGUoLypvQ29tcG9uZW50OiBvYmplY3QsIHNBcHBTdGF0ZUtleTogc3RyaW5nKi8pOiBQcm9taXNlPHVua25vd24+IHtcblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHt9KTtcblx0fVxuXG5cdGFzeW5jIGNyZWF0ZUVtcHR5QXBwU3RhdGUoLypvQ29tcG9uZW50OiBvYmplY3QqLyk6IFByb21pc2U8dW5rbm93bj4ge1xuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoe30pO1xuXHR9XG5cblx0YXN5bmMgY3JlYXRlRW1wdHlBcHBTdGF0ZUFzeW5jKC8qb0NvbXBvbmVudDogb2JqZWN0Ki8pOiBQcm9taXNlPHVua25vd24+IHtcblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHt9KTtcblx0fVxuXG5cdGFzeW5jIG5hdmlnYXRlKC8qb1RhcmdldDogVGFyZ2V0LG9Db21wb25lbnQ/OiBDb21wb25lbnQqLyk6IFByb21pc2U8dW5kZWZpbmVkPiB7XG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSh1bmRlZmluZWQpO1xuXHR9XG5cblx0YXN5bmMgaXNOYXZpZ2F0aW9uU3VwcG9ydGVkKC8qb05hdkFyZ3VtZW50c0FycjogQXJyYXk8b2JqZWN0Piwgb0NvbXBvbmVudDogb2JqZWN0Ki8pOiBQcm9taXNlPHsgc3VwcG9ydGVkOiBib29sZWFuIH1bXT4ge1xuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoW10pO1xuXHR9XG5cblx0YXN5bmMgaXNJbml0aWFsTmF2aWdhdGlvbigpOiBQcm9taXNlPGJvb2xlYW4+IHtcblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcblx0fVxuXG5cdGFzeW5jIGV4cGFuZENvbXBhY3RIYXNoKC8qc0hhc2hGcmFnbWVudDogc3RyaW5nKi8pOiBQcm9taXNlPHN0cmluZz4ge1xuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoXCJcIik7XG5cdH1cblxuXHRwYXJzZVNoZWxsSGFzaCgvKnNIYXNoOiBzdHJpbmcqLyk6IFBhcnNlZEhhc2gge1xuXHRcdHJldHVybiB7fSBhcyB1bmtub3duIGFzIFBhcnNlZEhhc2g7XG5cdH1cblxuXHRzcGxpdEhhc2goc0hhc2g6IHN0cmluZyk6IFJldHVyblR5cGU8VVJMUGFyc2luZ1tcInNwbGl0SGFzaFwiXT4ge1xuXHRcdC8qKlxuXHRcdCAqIEZvciBhbiBBcHBsaWNhdGlvbiB3aXRob3V0IFNoZWxsLCB0aGUgaGFzaCBpcyBzaW1pbGFyIHRvIDogIy9TYWxlc09yZGVyTWFuYWdlKDExMTExMTExLWFhYWEtYmJiYi1jY2NjLWRkZGRlZWVlZmZmZilcblx0XHQgKiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgOlxuXHRcdCAqIHtcblx0XHRcdHNoZWxsUGFydDogXCJcIixcblx0XHRcdGFwcFNwZWNpZmljUm91dGU6IFwiU2FsZXNPcmRlck1hbmFnZSgxMTExMTExMS1hYWFhLWJiYmItY2NjYy1kZGRkZWVlZWZmZmYpXCJcblx0XHR9XG5cdFx0ICovXG5cdFx0Y29uc3QgcmVnZXggPSAvI1teL10qXFwvKC4qKS8uZXhlYyhzSGFzaCk7XG5cdFx0cmV0dXJuIHtcblx0XHRcdHNoZWxsUGFydDogXCJcIixcblx0XHRcdGFwcFNwZWNpZmljUm91dGU6IHJlZ2V4Py5sZW5ndGggPT09IDIgPyByZWdleFsxXSA6IFwiXCJcblx0XHR9O1xuXHR9XG5cblx0Y29uc3RydWN0U2hlbGxIYXNoKC8qb05ld1NoZWxsSGFzaDogb2JqZWN0Ki8pOiBzdHJpbmcge1xuXHRcdHJldHVybiBcIlwiO1xuXHR9XG5cblx0c2V0RGlydHlGbGFnKC8qYkRpcnR5OiBib29sZWFuKi8pOiB2b2lkIHtcblx0XHQvKiBEbyBOb3RoaW5nICovXG5cdH1cblxuXHRyZWdpc3RlckRpcnR5U3RhdGVQcm92aWRlcigvKmZuRGlydHlTdGF0ZVByb3ZpZGVyOiBGdW5jdGlvbiovKTogdm9pZCB7XG5cdFx0LyogRG8gTm90aGluZyAqL1xuXHR9XG5cblx0ZGVyZWdpc3RlckRpcnR5U3RhdGVQcm92aWRlcigvKmZuRGlydHlTdGF0ZVByb3ZpZGVyOiBGdW5jdGlvbiovKTogdm9pZCB7XG5cdFx0LyogRG8gTm90aGluZyAqL1xuXHR9XG5cblx0Z2V0VXNlcigpOiBVc2VySW5mbyB7XG5cdFx0cmV0dXJuIHt9IGFzIFVzZXJJbmZvO1xuXHR9XG5cblx0Z2V0VXNlckluaXRpYWxzKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIFwiXCI7XG5cdH1cblxuXHRoYXNVU2hlbGwoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0cmVnaXN0ZXJOYXZpZ2F0aW9uRmlsdGVyKC8qZm5OYXZGaWx0ZXI6IEZ1bmN0aW9uKi8pOiB2b2lkIHtcblx0XHQvKiBEbyBOb3RoaW5nICovXG5cdH1cblxuXHR1bnJlZ2lzdGVyTmF2aWdhdGlvbkZpbHRlcigvKmZuTmF2RmlsdGVyOiBGdW5jdGlvbiovKTogdm9pZCB7XG5cdFx0LyogRG8gTm90aGluZyAqL1xuXHR9XG5cblx0YXN5bmMgc2V0QmFja05hdmlnYXRpb24oLypmbkNhbGxCYWNrPzogRnVuY3Rpb24qLyk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8qIERvIE5vdGhpbmcgKi9cblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblxuXHRhc3luYyBzZXRIaWVyYXJjaHkoLyphSGllcmFyY2h5TGV2ZWxzOiBBcnJheTxvYmplY3Q+Ki8pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvKiBEbyBOb3RoaW5nICovXG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG5cblx0YXN5bmMgc2V0VGl0bGUoLypzVGl0bGU6IHN0cmluZyovKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0LyogRG8gTm90aGluZyAqL1xuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0fVxuXG5cdGdldENvbnRlbnREZW5zaXR5KCk6IHN0cmluZyB7XG5cdFx0Ly8gaW4gY2FzZSB0aGVyZSBpcyBubyBzaGVsbCB3ZSBwcm9iYWJseSBuZWVkIHRvIGxvb2sgYXQgdGhlIGNsYXNzZXMgYmVpbmcgZGVmaW5lZCBvbiB0aGUgYm9keVxuXHRcdGlmIChkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5jb250YWlucyhcInNhcFVpU2l6ZUNvenlcIikpIHtcblx0XHRcdHJldHVybiBcImNvenlcIjtcblx0XHR9IGVsc2UgaWYgKGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmNvbnRhaW5zKFwic2FwVWlTaXplQ29tcGFjdFwiKSkge1xuXHRcdFx0cmV0dXJuIFwiY29tcGFjdFwiO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gXCJcIjtcblx0XHR9XG5cdH1cblxuXHRhc3luYyBnZXRQcmltYXJ5SW50ZW50KC8qc1NlbWFudGljT2JqZWN0OiBzdHJpbmcsIG1QYXJhbWV0ZXJzPzogb2JqZWN0Ki8pOiBQcm9taXNlPExpbms+IHtcblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHVuZGVmaW5lZCBhcyB1bmtub3duIGFzIExpbmspO1xuXHR9XG5cblx0YXN5bmMgd2FpdEZvclBsdWdpbnNMb2FkKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUodHJ1ZSk7XG5cdH1cblxuXHRhc3luYyBnZXRUaXRsZSgpOiBQcm9taXNlPHN0cmluZz4ge1xuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoXCJcIik7XG5cdH1cblxuXHRhc3luYyBnZXRQZXJzb25hbGl6ZXIoX3BlcnNJZDogUGVyc0lkLCBfc2NvcGU6IFNjb3BlLCBfY29tcG9uZW50PzogQ29tcG9uZW50KTogUHJvbWlzZTxQZXJzb25hbGl6ZXJUeXBlPiB7XG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSh7XG5cdFx0XHRnZXRQZXJzRGF0YTogYXN5bmMgKCkgPT5cblx0XHRcdFx0UHJvbWlzZS5yZXNvbHZlKHtcblx0XHRcdFx0XHRoaXN0b3J5RW5hYmxlZDogZmFsc2UsXG5cdFx0XHRcdFx0c3VnZ2VzdGlvbnNFbmFibGVkOiBmYWxzZSxcblx0XHRcdFx0XHRhcHBzOiB7fVxuXHRcdFx0XHR9KSxcblx0XHRcdHNldFBlcnNEYXRhOiAoKSA9PiB7fVxuXHRcdH0pO1xuXHR9XG5cblx0YXN5bmMgZ2V0QXBwbGljYXRpb25QZXJzb25hbGl6ZXIoX2l0ZW1OYW1lOiBzdHJpbmcpOiBQcm9taXNlPFBlcnNvbmFsaXplclR5cGU+IHtcblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHtcblx0XHRcdGdldFBlcnNEYXRhOiBhc3luYyAoKSA9PiBQcm9taXNlLnJlc29sdmUoe30pLFxuXHRcdFx0c2V0UGVyc0RhdGE6ICgpID0+IHt9XG5cdFx0fSk7XG5cdH1cblxuXHRhc3luYyBnZXRBcHBsaWNhdGlvblBlcnNvbmFsaXphdGlvbkRhdGEoX2l0ZW1OYW1lOiBzdHJpbmcpOiBQcm9taXNlPG9iamVjdD4ge1xuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoe30pO1xuXHR9XG5cblx0YXN5bmMgc2V0QXBwbGljYXRpb25QZXJzb25hbGl6YXRpb25EYXRhKF9pdGVtTmFtZTogc3RyaW5nLCBfb2JqZWN0OiBPYmplY3QpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblxuXHRhc3luYyBkZWxldGVQZXJzb25hbGl6YXRpb25Db250YWluZXIoX2tleTogc3RyaW5nLCBfc2NvcGU/OiBvYmplY3QpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblxuXHRnZXRTaGVsbENvbmZpZygpOiBTaGVsbENvbmZpZ1R5cGUge1xuXHRcdHJldHVybiB7fSBhcyBTaGVsbENvbmZpZ1R5cGU7XG5cdH1cblxuXHRnZXRSZWdpc3RlcmVkUGx1Z2lucygpOiBSZWdpc3RlcmVkUGx1Z2luc01hcFR5cGUge1xuXHRcdHJldHVybiB7XG5cdFx0XHRBcHBXYXJtdXA6IHt9LFxuXHRcdFx0UmVuZGVyZXJFeHRlbnNpb25zOiB7fSxcblx0XHRcdFVzZXJEZWZhdWx0czoge30sXG5cdFx0XHRVc2VySW1hZ2U6IHt9XG5cdFx0fTtcblx0fVxuXG5cdGlzRmxwT3B0aW1pc3RpY0JhdGNoUGx1Z2luTG9hZGVkKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdHBhcnNlUGFyYW1ldGVycygpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4ge1xuXHRcdHJldHVybiB7fTtcblx0fVxuXG5cdGdldEV4dGVuc2lvblNlcnZpY2UoKTogRXh0ZW5zaW9uIHtcblx0XHRyZXR1cm4ge30gYXMgRXh0ZW5zaW9uO1xuXHR9XG5cblx0YXN5bmMgZ2V0SW5mcmFtZVVybCgpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoXCJcIik7XG5cdH1cbn1cblxuLyoqXG4gKiBAdHlwZWRlZiBTaGVsbFNlcnZpY2VzU2V0dGluZ3NcbiAqL1xuZXhwb3J0IHR5cGUgU2hlbGxTZXJ2aWNlc1NldHRpbmdzID0ge1xuXHRzaGVsbENvbnRhaW5lcj86IENvbnRhaW5lcjtcbn07XG5cbnR5cGUgU2hlbGxQbHVnaW5NYW5hZ2VyID0ge1xuXHRnZXRQbHVnaW5Mb2FkaW5nUHJvbWlzZShjYXRlZ29yeTogc3RyaW5nKTogalF1ZXJ5LlByb21pc2U7XG5cdGdldFJlZ2lzdGVyZWRQbHVnaW5zKCk6IFJlZ2lzdGVyZWRQbHVnaW5zTWFwVHlwZTtcbn07XG5cbnR5cGUgUHJpdmF0ZVNoZWxsVXNlciA9IHtcblx0Z2V0SW5pdGlhbHMoKTogc3RyaW5nO1xuXHRpc0phbUFjdGl2ZSgpOiBib29sZWFuO1xuXHRnZXRDb250ZW50RGVuc2l0eSgpOiBzdHJpbmc7XG59O1xuXG4vKipcbiAqIEJhc2UgaW1wbGVtZW50YXRpb24gb2YgdGhlIFNoZWxsU2VydmljZXNcbiAqXG4gKi9cbmV4cG9ydCBjbGFzcyBTaGVsbFNlcnZpY2VzIGV4dGVuZHMgU2VydmljZTxSZXF1aXJlZDxTaGVsbFNlcnZpY2VzU2V0dGluZ3M+PiBpbXBsZW1lbnRzIElTaGVsbFNlcnZpY2VzIHtcblx0cmVzb2x2ZUZuITogRnVuY3Rpb247XG5cblx0cmVqZWN0Rm4hOiAoKSA9PiB2b2lkO1xuXG5cdGluaXRQcm9taXNlITogUHJvbWlzZTxJU2hlbGxTZXJ2aWNlcz47XG5cblx0YXBwbGljYXRpb25OYXZpZ2F0aW9uITogTmF2aWdhdGlvbkV4dGVuc2lvbjtcblxuXHR1c2VySW5mb1NlcnZpY2UhOiBVc2VySW5mbztcblxuXHR1cmxQYXJzaW5nU2VydmljZSE6IFVSTFBhcnNpbmc7XG5cblx0c2hlbGxOYXZpZ2F0aW9uITogU2hlbGxOYXZpZ2F0aW9uO1xuXG5cdHNoZWxsUGx1Z2luTWFuYWdlciE6IFNoZWxsUGx1Z2luTWFuYWdlcjtcblxuXHRvU2hlbGxDb250YWluZXIhOiBDb250YWluZXIgJiB7IGdldFVzZXI6ICgpID0+IFByaXZhdGVTaGVsbFVzZXIgfTtcblxuXHRzaGVsbFBlcnNvbmFsaXphdGlvblNlcnZpY2UhOiBQZXJzb25hbGl6YXRpb25XaXRoQ29uc3RhbnRzO1xuXG5cdGluc3RhbmNlVHlwZSE6IHN0cmluZztcblxuXHRsaW5rc0NhY2hlITogUmVjb3JkPHN0cmluZywgeyBsaW5rczogTGlua1tdIH0+O1xuXG5cdHNlbWFudGljT2JqZWN0cyE6IHN0cmluZ1tdO1xuXG5cdGZuRmluZFNlbWFudGljT2JqZWN0c0luQ2FjaGUhOiBGdW5jdGlvbjtcblxuXHRleHRlbnNpb25TZXJ2aWNlITogRXh0ZW5zaW9uO1xuXG5cdGFwcENvbXBvbmVudCE6IENvbXBvbmVudDtcblxuXHRwcml2YXRlIGFwcGxpY2F0aW9uUGVyc29ubmFsaXplcnM6IFJlY29yZDxzdHJpbmcsIFByb21pc2U8UGVyc29uYWxpemVyVHlwZT4+ID0ge307XG5cblx0aW5pdCgpOiB2b2lkIHtcblx0XHRjb25zdCBvQ29udGV4dCA9IHRoaXMuZ2V0Q29udGV4dCgpO1xuXHRcdHRoaXMuYXBwQ29tcG9uZW50ID0gb0NvbnRleHQuc2NvcGVPYmplY3QgYXMgQ29tcG9uZW50O1xuXHRcdHRoaXMub1NoZWxsQ29udGFpbmVyID0gb0NvbnRleHQuc2V0dGluZ3Muc2hlbGxDb250YWluZXI7XG5cdFx0dGhpcy5pbnN0YW5jZVR5cGUgPSBcInJlYWxcIjtcblx0XHR0aGlzLmxpbmtzQ2FjaGUgPSB7fTtcblx0XHR0aGlzLmZuRmluZFNlbWFudGljT2JqZWN0c0luQ2FjaGUgPSBmdW5jdGlvbiAob0FyZ3M6IExpbmtGaWx0ZXJbXSk6IG9iamVjdCB7XG5cdFx0XHRjb25zdCBhQ2FjaGVkU2VtYW50aWNPYmplY3RzOiBMaW5rW11bXSA9IFtdO1xuXHRcdFx0Y29uc3QgYU5vbkNhY2hlZFNlbWFudGljT2JqZWN0czogTGlua0ZpbHRlcltdID0gW107XG5cdFx0XHRmb3IgKGNvbnN0IGxpbmtGaWx0ZXIgb2Ygb0FyZ3MpIHtcblx0XHRcdFx0aWYgKCEhbGlua0ZpbHRlciAmJiAhIWxpbmtGaWx0ZXIuc2VtYW50aWNPYmplY3QpIHtcblx0XHRcdFx0XHRpZiAodGhpcy5saW5rc0NhY2hlW2xpbmtGaWx0ZXIuc2VtYW50aWNPYmplY3RdKSB7XG5cdFx0XHRcdFx0XHRhQ2FjaGVkU2VtYW50aWNPYmplY3RzLnB1c2godGhpcy5saW5rc0NhY2hlW2xpbmtGaWx0ZXIuc2VtYW50aWNPYmplY3RdLmxpbmtzKTtcblx0XHRcdFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShsaW5rRmlsdGVyLCBcImxpbmtzXCIsIHtcblx0XHRcdFx0XHRcdFx0dmFsdWU6IHRoaXMubGlua3NDYWNoZVtsaW5rRmlsdGVyLnNlbWFudGljT2JqZWN0XS5saW5rc1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGFOb25DYWNoZWRTZW1hbnRpY09iamVjdHMucHVzaChsaW5rRmlsdGVyKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiB7IG9sZEFyZ3M6IG9BcmdzLCBuZXdBcmdzOiBhTm9uQ2FjaGVkU2VtYW50aWNPYmplY3RzLCBjYWNoZWRMaW5rczogYUNhY2hlZFNlbWFudGljT2JqZWN0cyB9O1xuXHRcdH07XG5cdFx0dGhpcy5pbml0UHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRcdHRoaXMucmVzb2x2ZUZuID0gcmVzb2x2ZTtcblx0XHRcdHRoaXMucmVqZWN0Rm4gPSByZWplY3Q7XG5cdFx0fSk7XG5cdFx0Y29uc3QgbmF2aWdhdGlvblNlcnZpY2VQID0gdGhpcy5vU2hlbGxDb250YWluZXIuZ2V0U2VydmljZUFzeW5jKFwiTmF2aWdhdGlvblwiKTtcblx0XHRjb25zdCB1c2VySW5mb1NlcnZpY2VQID0gdGhpcy5vU2hlbGxDb250YWluZXIuZ2V0U2VydmljZUFzeW5jKFwiVXNlckluZm9cIik7XG5cdFx0Y29uc3Qgb1VybFBhcnNpbmdTZXJ2aWNlUHJvbWlzZSA9IHRoaXMub1NoZWxsQ29udGFpbmVyLmdldFNlcnZpY2VBc3luYyhcIlVSTFBhcnNpbmdcIik7XG5cdFx0Y29uc3Qgb1NoZWxsTmF2aWdhdGlvblNlcnZpY2VQcm9taXNlID0gdGhpcy5vU2hlbGxDb250YWluZXIuZ2V0U2VydmljZUFzeW5jKFwiU2hlbGxOYXZpZ2F0aW9uSW50ZXJuYWxcIik7XG5cdFx0Y29uc3Qgb1NoZWxsUGx1Z2luTWFuYWdlclByb21pc2UgPSB0aGlzLm9TaGVsbENvbnRhaW5lci5nZXRTZXJ2aWNlQXN5bmMoXCJQbHVnaW5NYW5hZ2VyXCIpO1xuXHRcdGNvbnN0IG9TaGVsbFBlcnNvbmFsaXphdGlvblNlcnZpY2VQcm9taXNlID0gdGhpcy5vU2hlbGxDb250YWluZXIuZ2V0U2VydmljZUFzeW5jKFwiUGVyc29uYWxpemF0aW9uVjJcIik7XG5cdFx0Y29uc3Qgb1NoZWxsRXh0ZW5zaW9uU2VydmljZVByb21pc2UgPSB0aGlzLm9TaGVsbENvbnRhaW5lci5nZXRTZXJ2aWNlQXN5bmMoXCJFeHRlbnNpb25cIik7XG5cblx0XHRQcm9taXNlLmFsbChbXG5cdFx0XHRuYXZpZ2F0aW9uU2VydmljZVAsXG5cdFx0XHR1c2VySW5mb1NlcnZpY2VQLFxuXHRcdFx0b1VybFBhcnNpbmdTZXJ2aWNlUHJvbWlzZSxcblx0XHRcdG9TaGVsbE5hdmlnYXRpb25TZXJ2aWNlUHJvbWlzZSxcblx0XHRcdG9TaGVsbFBlcnNvbmFsaXphdGlvblNlcnZpY2VQcm9taXNlLFxuXHRcdFx0b1NoZWxsUGx1Z2luTWFuYWdlclByb21pc2UsXG5cdFx0XHRvU2hlbGxFeHRlbnNpb25TZXJ2aWNlUHJvbWlzZVxuXHRcdF0pXG5cdFx0XHQudGhlbihcblx0XHRcdFx0KFtcblx0XHRcdFx0XHRuYXZpZ2F0aW9uU2VydmljZSxcblx0XHRcdFx0XHR1c2VySW5mb1NlcnZpY2UsXG5cdFx0XHRcdFx0b1VybFBhcnNpbmdTZXJ2aWNlLFxuXHRcdFx0XHRcdG9TaGVsbE5hdmlnYXRpb24sXG5cdFx0XHRcdFx0b1NoZWxsUGVyc29uYWxpemF0aW9uU2VydmljZSxcblx0XHRcdFx0XHRvU2hlbGxQbHVnaW5NYW5hZ2VyLFxuXHRcdFx0XHRcdG9TaGVsbEV4dGVuc2lvblNlcnZpY2Vcblx0XHRcdFx0XSkgPT4ge1xuXHRcdFx0XHRcdHRoaXMuYXBwbGljYXRpb25OYXZpZ2F0aW9uID0gbmF2aWdhdGlvblNlcnZpY2UgYXMgTmF2aWdhdGlvbkV4dGVuc2lvbjtcblx0XHRcdFx0XHR0aGlzLnVzZXJJbmZvU2VydmljZSA9IHVzZXJJbmZvU2VydmljZSBhcyBVc2VySW5mbztcblx0XHRcdFx0XHR0aGlzLnVybFBhcnNpbmdTZXJ2aWNlID0gb1VybFBhcnNpbmdTZXJ2aWNlIGFzIFVSTFBhcnNpbmc7XG5cdFx0XHRcdFx0dGhpcy5zaGVsbE5hdmlnYXRpb24gPSBvU2hlbGxOYXZpZ2F0aW9uIGFzIFNoZWxsTmF2aWdhdGlvbjtcblx0XHRcdFx0XHR0aGlzLnNoZWxsUGVyc29uYWxpemF0aW9uU2VydmljZSA9IG9TaGVsbFBlcnNvbmFsaXphdGlvblNlcnZpY2UgYXMgUGVyc29uYWxpemF0aW9uV2l0aENvbnN0YW50cztcblx0XHRcdFx0XHR0aGlzLnNoZWxsUGx1Z2luTWFuYWdlciA9IG9TaGVsbFBsdWdpbk1hbmFnZXIgYXMgU2hlbGxQbHVnaW5NYW5hZ2VyO1xuXHRcdFx0XHRcdHRoaXMuZXh0ZW5zaW9uU2VydmljZSA9IG9TaGVsbEV4dGVuc2lvblNlcnZpY2UgYXMgRXh0ZW5zaW9uO1xuXHRcdFx0XHRcdHRoaXMucmVzb2x2ZUZuKCk7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cdFx0XHQpXG5cdFx0XHQuY2F0Y2godGhpcy5yZWplY3RGbik7XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmVzIHRoZSB0YXJnZXQgbGlua3MgY29uZmlndXJlZCBmb3IgYSBnaXZlbiBzZW1hbnRpYyBvYmplY3QgJiBhY3Rpb25cblx0ICogV2lsbCByZXRyaWV2ZSB0aGUgQ3Jvc3NBcHBsaWNhdGlvbk5hdmlnYXRpb25cblx0ICogc2VydmljZSByZWZlcmVuY2UgY2FsbCB0aGUgZ2V0TGlua3MgbWV0aG9kLiBJbiBjYXNlIHNlcnZpY2UgaXMgbm90IGF2YWlsYWJsZSBvciBhbnkgZXhjZXB0aW9uXG5cdCAqIG1ldGhvZCB0aHJvd3MgZXhjZXB0aW9uIGVycm9yIGluIGNvbnNvbGUuXG5cdCAqIEBwYXJhbSBvQXJncyBDaGVjayB0aGUgZGVmaW5pdGlvbiBvZlxuXHQgKiBzYXAudXNoZWxsLnNlcnZpY2VzLkNyb3NzQXBwbGljYXRpb25OYXZpZ2F0aW9uPT5nZXRMaW5rcyBhcmd1bWVudHNcblx0ICogQHJldHVybnMgUHJvbWlzZSB3aGljaCB3aWxsIGJlIHJlc29sdmVkIHRvIHRhcmdldCBsaW5rcyBhcnJheVxuXHQgKi9cblx0YXN5bmMgZ2V0TGlua3Mob0FyZ3M/OiBMaW5rRmlsdGVyW10pOiBQcm9taXNlPExpbmtbXVtdPiB7XG5cdFx0cmV0dXJuIHRoaXMuYXBwbGljYXRpb25OYXZpZ2F0aW9uLmdldExpbmtzKG9BcmdzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIGEgbGlzdCBvZiBzZW1hbnRpYyBvYmplY3RzIG9mIHRoZSBpbnRlbnRzIHRoZSBjdXJyZW50IHVzZXIgY2FuIG5hdmlnYXRlIHRvLlxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHRoYXQgcmVzb2x2ZSB3aXRoIGFuIGFycmF5IG9mIHN0cmluZ3MgcmVwcmVzZW50aW5nIHRoZSBzZW1hbnRpYyBvYmplY3RzIG9mIHRoZSBpbnRlbnRzIHRoZSBjdXJyZW50IHVzZXIgY2FuIG5hdmlnYXRlIHRvLCBvciByZWplY3RzIHdpdGggYW4gZXJyb3IgbWVzc2FnZVxuXHQgKi9cblx0YXN5bmMgX19mZXRjaFNlbWFudGljT2JqZWN0KCk6IFByb21pc2U8c3RyaW5nW10+IHtcblx0XHRyZXR1cm4gdGhpcy5hcHBsaWNhdGlvbk5hdmlnYXRpb24uZ2V0U2VtYW50aWNPYmplY3RzKCk7XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmVzIHRoZSB0YXJnZXQgbGlua3MgY29uZmlndXJlZCBmb3IgYSBnaXZlbiBzZW1hbnRpYyBvYmplY3QgJiBhY3Rpb24gaW4gY2FjaGVcblx0ICogV2lsbCByZXRyaWV2ZSB0aGUgQ3Jvc3NBcHBsaWNhdGlvbk5hdmlnYXRpb25cblx0ICogc2VydmljZSByZWZlcmVuY2UgY2FsbCB0aGUgZ2V0TGlua3MgbWV0aG9kLiBJbiBjYXNlIHNlcnZpY2UgaXMgbm90IGF2YWlsYWJsZSBvciBhbnkgZXhjZXB0aW9uXG5cdCAqIG1ldGhvZCB0aHJvd3MgZXhjZXB0aW9uIGVycm9yIGluIGNvbnNvbGUuXG5cdCAqIEBwYXJhbSBvQXJncyBDaGVjayB0aGUgZGVmaW5pdGlvbiBvZlxuXHQgKiBzYXAudXNoZWxsLnNlcnZpY2VzLkNyb3NzQXBwbGljYXRpb25OYXZpZ2F0aW9uPT5nZXRMaW5rcyBhcmd1bWVudHNcblx0ICogQHJldHVybnMgUHJvbWlzZSB3aGljaCB3aWxsIGJlIHJlc29sdmVkIHRvIHRhcmdldCBsaW5rcyBhcnJheVxuXHQgKi9cblx0YXN5bmMgZ2V0TGlua3NXaXRoQ2FjaGUob0FyZ3M/OiBMaW5rRmlsdGVyW10pOiBQcm9taXNlPExpbmtbXVtdPiB7XG5cdFx0aWYgKChvQXJncyBhcyBPYmplY3RbXSkubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm4gW107XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0IG9DYWNoZVJlc3VsdHMgPSB0aGlzLmZuRmluZFNlbWFudGljT2JqZWN0c0luQ2FjaGUob0FyZ3MpO1xuXG5cdFx0XHRpZiAob0NhY2hlUmVzdWx0cy5uZXdBcmdzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0XHRyZXR1cm4gb0NhY2hlUmVzdWx0cy5jYWNoZWRMaW5rcztcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IGFMaW5rcyA9IGF3YWl0IHRoaXMuYXBwbGljYXRpb25OYXZpZ2F0aW9uLmdldExpbmtzKG9DYWNoZVJlc3VsdHMubmV3QXJncyk7XG5cdFx0XHRcdGlmIChhTGlua3MubGVuZ3RoICE9PSAwKSB7XG5cdFx0XHRcdFx0Y29uc3Qgb1NlbWFudGljT2JqZWN0c0xpbmtzOiBSZWNvcmQ8c3RyaW5nLCB7IGxpbmtzOiBMaW5rW10gfT4gPSB7fTtcblxuXHRcdFx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgYUxpbmtzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdFx0XHRpZiAoYUxpbmtzW2ldLmxlbmd0aCA+IDAgJiYgb0NhY2hlUmVzdWx0cy5uZXdBcmdzW2ldWzBdLmxpbmtzID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdFx0b1NlbWFudGljT2JqZWN0c0xpbmtzW29DYWNoZVJlc3VsdHMubmV3QXJnc1tpXVswXS5zZW1hbnRpY09iamVjdF0gPSB7XG5cdFx0XHRcdFx0XHRcdFx0bGlua3M6IGFMaW5rc1tpXVxuXHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0XHR0aGlzLmxpbmtzQ2FjaGUgPSBPYmplY3QuYXNzaWduKHRoaXMubGlua3NDYWNoZSwgb1NlbWFudGljT2JqZWN0c0xpbmtzKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAob0NhY2hlUmVzdWx0cy5jYWNoZWRMaW5rcy5sZW5ndGggPT09IDApIHtcblx0XHRcdFx0XHRyZXR1cm4gYUxpbmtzO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGNvbnN0IGFNZXJnZWRMaW5rcyA9IFtdO1xuXHRcdFx0XHRcdGxldCBqID0gMDtcblxuXHRcdFx0XHRcdGZvciAoY29uc3QgaXRlbSBvZiBvQ2FjaGVSZXN1bHRzLm9sZEFyZ3MpIHtcblx0XHRcdFx0XHRcdGlmIChqIDwgYUxpbmtzLmxlbmd0aCkge1xuXHRcdFx0XHRcdFx0XHRpZiAoYUxpbmtzW2pdLmxlbmd0aCA+IDAgJiYgaXRlbVswXS5zZW1hbnRpY09iamVjdCA9PT0gb0NhY2hlUmVzdWx0cy5uZXdBcmdzW2pdWzBdLnNlbWFudGljT2JqZWN0KSB7XG5cdFx0XHRcdFx0XHRcdFx0YU1lcmdlZExpbmtzLnB1c2goYUxpbmtzW2pdKTtcblx0XHRcdFx0XHRcdFx0XHRqKys7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0YU1lcmdlZExpbmtzLnB1c2goaXRlbVswXS5saW5rcyk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdGFNZXJnZWRMaW5rcy5wdXNoKGl0ZW1bMF0ubGlua3MpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gYU1lcmdlZExpbmtzO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0YXN5bmMgZ2V0U2hlbGxVSVNlcnZpY2UoKTogUHJvbWlzZTxTaGVsbFVJU2VydmljZT4ge1xuXHRcdHJldHVybiB0aGlzLmFwcENvbXBvbmVudC5nZXRTZXJ2aWNlKFwiU2hlbGxVSVNlcnZpY2VcIik7XG5cdH1cblxuXHQvKipcblx0ICogV2lsbCByZXRyaWV2ZSB0aGUgU2hlbGxDb250YWluZXIuXG5cdCAqIEByZXR1cm5zIE9iamVjdCB3aXRoIHByZWRlZmluZWQgc2hlbGxDb250YWluZXIgbWV0aG9kc1xuXHQgKi9cblx0Z2V0U2hlbGxDb250YWluZXIoKTogQ29udGFpbmVyIHtcblx0XHRyZXR1cm4gdGhpcy5vU2hlbGxDb250YWluZXI7XG5cdH1cblxuXHRhc3luYyBnZXRJbmZyYW1lVXJsKCk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG5cdFx0Y29uc3QgdXNoZWxsQ29udGFpbmVyID0gdGhpcy5nZXRTaGVsbENvbnRhaW5lcigpO1xuXHRcdGxldCBhcHBVcmw6IHN0cmluZyB8IHVuZGVmaW5lZDtcblx0XHRpZiAodXNoZWxsQ29udGFpbmVyPy5pbkFwcFJ1bnRpbWUoKSkge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0YXBwVXJsID0gYXdhaXQgdXNoZWxsQ29udGFpbmVyLmdldEZMUFVybEFzeW5jKHRydWUpO1xuXHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgZ2V0dGluZyB0aGUgRkxQIFVSTFwiLCBlcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gYXBwVXJsO1xuXHR9XG5cblx0LyoqXG5cdCAqIFdpbGwgY2FsbCB0b0V4dGVybmFsIG1ldGhvZCBvZiBDcm9zc0FwcGxpY2F0aW9uTmF2aWdhdGlvbiBzZXJ2aWNlIHdpdGggTmF2aWdhdGlvbiBBcmd1bWVudHMgYW5kIG9Db21wb25lbnQuXG5cdCAqIEBwYXJhbSBvTmF2QXJndW1lbnRzQXJyIEFuZFxuXHQgKiBAcGFyYW0gb0NvbXBvbmVudCBDaGVjayB0aGUgZGVmaW5pdGlvbiBvZlxuXHQgKiBzYXAudXNoZWxsLnNlcnZpY2VzLkNyb3NzQXBwbGljYXRpb25OYXZpZ2F0aW9uPT50b0V4dGVybmFsIGFyZ3VtZW50c1xuXHQgKi9cblx0dG9FeHRlcm5hbChvTmF2QXJndW1lbnRzQXJyOiBUYXJnZXQsIG9Db21wb25lbnQ/OiBDb21wb25lbnQpOiB2b2lkIHtcblx0XHR0aGlzLm5hdmlnYXRlKG9OYXZBcmd1bWVudHNBcnIsIG9Db21wb25lbnQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlcyB0aGUgdGFyZ2V0IHN0YXJ0dXBBcHBTdGF0ZVxuXHQgKiBXaWxsIGNoZWNrIHRoZSBleGlzdGFuY2Ugb2YgdGhlIFNoZWxsQ29udGFpbmVyIGFuZCByZXRyaWV2ZSB0aGUgQ3Jvc3NBcHBsaWNhdGlvbk5hdmlnYXRpb25cblx0ICogc2VydmljZSByZWZlcmVuY2UgY2FsbCB0aGUgZ2V0U3RhcnR1cEFwcFN0YXRlIG1ldGhvZC4gSW4gY2FzZSBzZXJ2aWNlIGlzIG5vdCBhdmFpbGFibGUgb3IgYW55IGV4Y2VwdGlvblxuXHQgKiBtZXRob2QgdGhyb3dzIGV4Y2VwdGlvbiBlcnJvciBpbiBjb25zb2xlLlxuXHQgKiBAcGFyYW0gb0FyZ3MgQ2hlY2sgdGhlIGRlZmluaXRpb24gb2Zcblx0ICogc2FwLnVzaGVsbC5zZXJ2aWNlcy5Dcm9zc0FwcGxpY2F0aW9uTmF2aWdhdGlvbj0+Z2V0U3RhcnR1cEFwcFN0YXRlIGFyZ3VtZW50c1xuXHQgKiBAcmV0dXJucyBQcm9taXNlIHdoaWNoIHdpbGwgYmUgcmVzb2x2ZWQgdG8gT2JqZWN0XG5cdCAqL1xuXHRhc3luYyBnZXRTdGFydHVwQXBwU3RhdGUob0FyZ3M6IENvbXBvbmVudCk6IFByb21pc2U8dW5kZWZpbmVkIHwgU3RhcnR1cEFwcFN0YXRlPiB7XG5cdFx0cmV0dXJuIHRoaXMuYXBwbGljYXRpb25OYXZpZ2F0aW9uLmdldFN0YXJ0dXBBcHBTdGF0ZShvQXJncyk7XG5cdH1cblxuXHQvKipcblx0ICogV2lsbCBjYWxsIGJhY2tUb1ByZXZpb3VzQXBwIG1ldGhvZCBvZiBDcm9zc0FwcGxpY2F0aW9uTmF2aWdhdGlvbiBzZXJ2aWNlLlxuXHQgKiBAcmV0dXJucyBTb21ldGhpbmcgdGhhdCBpbmRpY2F0ZSB3ZSd2ZSBuYXZpZ2F0ZWRcblx0ICovXG5cdGFzeW5jIGJhY2tUb1ByZXZpb3VzQXBwKCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdHJldHVybiB0aGlzLmFwcGxpY2F0aW9uTmF2aWdhdGlvbi5iYWNrVG9QcmV2aW91c0FwcCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFdpbGwgY2FsbCBocmVmRm9yRXh0ZXJuYWwgbWV0aG9kIG9mIENyb3NzQXBwbGljYXRpb25OYXZpZ2F0aW9uIHNlcnZpY2UuXG5cdCAqIEBwYXJhbSBvQXJncyBDaGVjayB0aGUgZGVmaW5pdGlvbiBvZlxuXHQgKiBAcGFyYW0gb0NvbXBvbmVudCBUaGUgYXBwQ29tcG9uZW50XG5cdCAqIHNhcC51c2hlbGwuc2VydmljZXMuQ3Jvc3NBcHBsaWNhdGlvbk5hdmlnYXRpb249PmhyZWZGb3JFeHRlcm5hbCBhcmd1bWVudHNcblx0ICogQHJldHVybnMgUHJvbWlzZSB3aGljaCB3aWxsIGJlIHJlc29sdmVkIHRvIHN0cmluZ1xuXHQgKi9cblx0YXN5bmMgaHJlZkZvckV4dGVybmFsKG9BcmdzOiBUYXJnZXQsIG9Db21wb25lbnQ/OiBDb21wb25lbnQpOiBQcm9taXNlPHN0cmluZz4ge1xuXHRcdHJldHVybiB0aGlzLmFwcGxpY2F0aW9uTmF2aWdhdGlvbi5nZXRIcmVmKG9BcmdzLCBvQ29tcG9uZW50KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIGEgcHJvbWlzZSByZXNvbHZpbmcgdG8gYSBVUkwgdGhhdCBsYXVuY2hlcyBhbiBhcHAgd2l0aCBjZXJ0YWluIHBhcmFtZXRlcnMuXG5cdCAqIFRoaXMgQVBJIGNhbiBiZSB1c2VkIHRvIGNvbnZlcnQgdGhlIGludGVybmFsIHNoZWxsIGhhc2ggZm9ybWF0IGludG8gdGhlIFVSTCBmb3JtYXQgZm9yIHVzZSBpbiBsaW5rIHRhZ3MuXG5cdCAqIFRoZSByZXN1bHRpbmcgaHJlZiBpcyBmdWxseSBlbmNvZGVkIGFuZCBjYW5ub3QgYmUgdXNlZCBpbiBvdGhlciBBUElzIHRoYXQgZXhwZWN0IHRoZSBpbnRlcm5hbCBkZWNvZGVkIGhhc2guXG5cdCAqIEBwYXJhbSBbb1RhcmdldF0gVGhlIG5hdmlnYXRpb24gdGFyZ2V0IHRvIHRyYW5zZm9ybS4gV2hlbiwgb21pdHRlZCB0aGUgY3VycmVudCBoYXNoIGlzIHVzZWQgYXMgdGhlIGJhc2lzIGZvciB0aGUgY2FsY3VsYXRpb24uXG5cdCAqIEBwYXJhbSBbb0NvbXBvbmVudF0gQSBVSTUgY29tcG9uZW50LCB1c2VkIHRvIGxvZ2ljYWxseSBhdHRhY2ggYW55IHJlbGF0ZWQgYXBwIHN0YXRlLlxuXHQgKiBAcmV0dXJucyBBIHByb21pc2UgcmVzb2x2aW5nIHRoZSBlbmNvZGVkIGhyZWYuXG5cdCAqL1xuXHRhc3luYyBnZXRIcmVmKG9UYXJnZXQ6IFRhcmdldCwgb0NvbXBvbmVudD86IENvbXBvbmVudCk6IFByb21pc2U8c3RyaW5nPiB7XG5cdFx0cmV0dXJuIHRoaXMuYXBwbGljYXRpb25OYXZpZ2F0aW9uLmdldEhyZWYob1RhcmdldCwgb0NvbXBvbmVudCk7XG5cdH1cblxuXHQvKipcblx0ICogV2lsbCBjYWxsIGdldEFwcFN0YXRlIG1ldGhvZCBvZiBDcm9zc0FwcGxpY2F0aW9uTmF2aWdhdGlvbiBzZXJ2aWNlIHdpdGggb0NvbXBvbmVudCBhbmQgb0FwcFN0YXRlS2V5LlxuXHQgKiBAcGFyYW0gb0NvbXBvbmVudFxuXHQgKiBAcGFyYW0gc0FwcFN0YXRlS2V5IENoZWNrIHRoZSBkZWZpbml0aW9uIG9mXG5cdCAqIHNhcC51c2hlbGwuc2VydmljZXMuQ3Jvc3NBcHBsaWNhdGlvbk5hdmlnYXRpb249PmdldEFwcFN0YXRlIGFyZ3VtZW50c1xuXHQgKiBAcmV0dXJucyBQcm9taXNlIHdoaWNoIHdpbGwgYmUgcmVzb2x2ZWQgdG8gb2JqZWN0XG5cdCAqL1xuXHRhc3luYyBnZXRBcHBTdGF0ZShvQ29tcG9uZW50OiBDb21wb25lbnQsIHNBcHBTdGF0ZUtleTogc3RyaW5nKTogUHJvbWlzZTx1bmtub3duPiB7XG5cdFx0cmV0dXJuIHRoaXMuYXBwbGljYXRpb25OYXZpZ2F0aW9uLmdldEFwcFN0YXRlKG9Db21wb25lbnQsIHNBcHBTdGF0ZUtleSk7XG5cdH1cblxuXHQvKipcblx0ICogV2lsbCBjYWxsIGNyZWF0ZUVtcHR5QXBwU3RhdGUgbWV0aG9kIG9mIENyb3NzQXBwbGljYXRpb25OYXZpZ2F0aW9uIHNlcnZpY2Ugd2l0aCBvQ29tcG9uZW50LlxuXHQgKiBAcGFyYW0gb0NvbXBvbmVudCBDaGVjayB0aGUgZGVmaW5pdGlvbiBvZlxuXHQgKiBzYXAudXNoZWxsLnNlcnZpY2VzLkNyb3NzQXBwbGljYXRpb25OYXZpZ2F0aW9uPT5jcmVhdGVFbXB0eUFwcFN0YXRlIGFyZ3VtZW50c1xuXHQgKiBAcmV0dXJucyBQcm9taXNlIHdoaWNoIHdpbGwgYmUgcmVzb2x2ZWQgdG8gb2JqZWN0XG5cdCAqL1xuXHRhc3luYyBjcmVhdGVFbXB0eUFwcFN0YXRlKG9Db21wb25lbnQ6IENvbXBvbmVudCk6IFByb21pc2U8dW5rbm93bj4ge1xuXHRcdHJldHVybiB0aGlzLmFwcGxpY2F0aW9uTmF2aWdhdGlvbi5jcmVhdGVFbXB0eUFwcFN0YXRlKG9Db21wb25lbnQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFdpbGwgY2FsbCBpc05hdmlnYXRpb25TdXBwb3J0ZWQgbWV0aG9kIG9mIENyb3NzQXBwbGljYXRpb25OYXZpZ2F0aW9uIHNlcnZpY2Ugd2l0aCBOYXZpZ2F0aW9uIEFyZ3VtZW50cyBhbmQgb0NvbXBvbmVudC5cblx0ICogQHBhcmFtIGFUYXJnZXRzXG5cdCAqIEBwYXJhbSBvQ29tcG9uZW50IENoZWNrIHRoZSBkZWZpbml0aW9uIG9mXG5cdCAqIHNhcC51c2hlbGwuc2VydmljZXMuQ3Jvc3NBcHBsaWNhdGlvbk5hdmlnYXRpb249PmlzTmF2aWdhdGlvblN1cHBvcnRlZCBhcmd1bWVudHNcblx0ICogQHJldHVybnMgUHJvbWlzZSB3aGljaCB3aWxsIGJlIHJlc29sdmVkIHRvIG9iamVjdFxuXHQgKi9cblx0YXN5bmMgaXNOYXZpZ2F0aW9uU3VwcG9ydGVkKGFUYXJnZXRzOiBUYXJnZXRbXSwgb0NvbXBvbmVudDogQ29tcG9uZW50KTogUHJvbWlzZTx7IHN1cHBvcnRlZDogYm9vbGVhbiB9W10+IHtcblx0XHRyZXR1cm4gdGhpcy5hcHBsaWNhdGlvbk5hdmlnYXRpb24uaXNOYXZpZ2F0aW9uU3VwcG9ydGVkKGFUYXJnZXRzLCBvQ29tcG9uZW50KSBhcyB1bmtub3duIGFzIFByb21pc2U8eyBzdXBwb3J0ZWQ6IGJvb2xlYW4gfVtdPjtcblx0fVxuXG5cdC8qKlxuXHQgKiBUcmlnZ2VycyBhIG5hdmlnYXRpb24gdG8gYSBzcGVjaWZpZWQgdGFyZ2V0IG91dHNpZGUgb2YgdGhlIGN1cnJlbnRseSBydW5uaW5nIGFwcGxpY2F0aW9uLlxuXHQgKiBAcGFyYW0gb1RhcmdldCBUaGUgbmF2aWdhdGlvbiB0YXJnZXQuXG5cdCAqIEBwYXJhbSBbb0NvbXBvbmVudF0gQSBVSTUgY29tcG9uZW50LCB1c2VkIHRvIGxvZ2ljYWxseSBhdHRhY2ggYW55IHJlbGF0ZWQgYXBwIHN0YXRlLlxuXHQgKiBAcmV0dXJucyBBIFByb21pc2UgcmVzb2x2aW5nIG9uY2UgdGhlIG5hdmlnYXRpb24gd2FzIHRyaWdnZXJlZC4gVGhlIFByb21pc2UgbWlnaHQgbmV2ZXIgcmVqZWN0IG9yIHJlc29sdmVcblx0ICogICAgICAgICAgICAgICAgICAgIHdoZW4gYW4gZXJyb3Igb2NjdXJzIGR1cmluZyB0aGUgbmF2aWdhdGlvbi5cblx0ICovXG5cdGFzeW5jIG5hdmlnYXRlKG9UYXJnZXQ6IFRhcmdldCwgb0NvbXBvbmVudD86IENvbXBvbmVudCk6IFByb21pc2U8dW5kZWZpbmVkPiB7XG5cdFx0cmV0dXJuIChhd2FpdCB0aGlzLmFwcGxpY2F0aW9uTmF2aWdhdGlvbi5uYXZpZ2F0ZShvVGFyZ2V0LCBvQ29tcG9uZW50KSkgYXMgdW5rbm93biBhcyBQcm9taXNlPHVuZGVmaW5lZD47XG5cdH1cblxuXHQvKipcblx0ICogV2lsbCBjYWxsIGlzSW5pdGlhbE5hdmlnYXRpb25Bc3luYyBtZXRob2Qgb2YgQ3Jvc3NBcHBsaWNhdGlvbk5hdmlnYXRpb24gc2VydmljZS5cblx0ICogQHJldHVybnMgUHJvbWlzZSB3aGljaCB3aWxsIGJlIHJlc29sdmVkIHRvIGJvb2xlYW5cblx0ICovXG5cdGFzeW5jIGlzSW5pdGlhbE5hdmlnYXRpb24oKTogUHJvbWlzZTxib29sZWFuPiB7XG5cdFx0cmV0dXJuIHRoaXMuYXBwbGljYXRpb25OYXZpZ2F0aW9uLmlzSW5pdGlhbE5hdmlnYXRpb24oKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBXaWxsIGNhbGwgZXhwYW5kQ29tcGFjdEhhc2ggbWV0aG9kIG9mIENyb3NzQXBwbGljYXRpb25OYXZpZ2F0aW9uIHNlcnZpY2UuXG5cdCAqIEBwYXJhbSBzSGFzaEZyYWdtZW50IEFuIChpbnRlcm5hbCBmb3JtYXQpIHNoZWxsIGhhc2hcblx0ICogQHJldHVybnMgQSBwcm9taXNlIHRoZSBzdWNjZXNzIGhhbmRsZXIgb2YgdGhlIHJlc29sdmUgcHJvbWlzZSBnZXQgYW4gZXhwYW5kZWQgc2hlbGwgaGFzaCBhcyBmaXJzdCBhcmd1bWVudFxuXHQgKi9cblx0YXN5bmMgZXhwYW5kQ29tcGFjdEhhc2goc0hhc2hGcmFnbWVudDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHNIYXNoRnJhZ21lbnQpOyAvL3RoaXMubmF2VGFyZ2V0UmVzb2x1dGlvbi5leHBhbmRDb21wYWN0SGFzaChzSGFzaEZyYWdtZW50KTtcblx0fVxuXG5cdGdldEhhc2goKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gYCMke3RoaXMudXJsUGFyc2luZ1NlcnZpY2UuZ2V0U2hlbGxIYXNoKHdpbmRvdy5sb2NhdGlvbi5ocmVmKX1gO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgYSBtYXAgb2YgYWxsIHRoZSBwbHVnaW5zIHdoaWNoIGFyZSByZWdpc3RlcmVkIHdpdGggdGhlIFBsdWdpbk1hbmFnZXIsIHNvcnRlZCBieSBzdXBwb3J0ZWQgcGx1Z2luIGNhdGVnb3JpZXMuXG5cdCAqIEByZXR1cm5zIE1hcCBvZiByZWdpc3RlcmVkIHBsdWdpbnNcblx0ICovXG5cdGdldFJlZ2lzdGVyZWRQbHVnaW5zKCk6IFJlZ2lzdGVyZWRQbHVnaW5zTWFwVHlwZSB7XG5cdFx0cmV0dXJuIHRoaXMuc2hlbGxQbHVnaW5NYW5hZ2VyLmdldFJlZ2lzdGVyZWRQbHVnaW5zKCk7XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2sgZm9yIHRoZSBvcHRpbWlzdGljIGJhdGNoIHBsdWdpbiBzZXR1cCBpbiB0aGUgRkxQLlxuXHQgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBvcHRpbWlzdGljIGJhdGNoIHBsdWdpbiBpcyBzZXQgdXAgYW5kIGVuYWJsZWQuXG5cdCAqL1xuXHRpc0ZscE9wdGltaXN0aWNCYXRjaFBsdWdpbkxvYWRlZCgpOiBib29sZWFuIHtcblx0XHRjb25zdCBmbHBQbHVnaW5zUmVuZGVyZXJFeHRlbnNpb25zID0gdGhpcy5nZXRSZWdpc3RlcmVkUGx1Z2lucygpLlJlbmRlcmVyRXh0ZW5zaW9ucztcblx0XHRpZiAoXG5cdFx0XHRmbHBQbHVnaW5zUmVuZGVyZXJFeHRlbnNpb25zPy5oYXNPd25Qcm9wZXJ0eShcIk1BTkFHRV9GRV9DQUNIRVNcIikgJiZcblx0XHRcdCEhKGZscFBsdWdpbnNSZW5kZXJlckV4dGVuc2lvbnMgYXMgUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgb2JqZWN0Pj4pLk1BTkFHRV9GRV9DQUNIRVMuZW5hYmxlZFxuXHRcdCkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogV2lsbCBjYWxsIHBhcnNlU2hlbGxIYXNoIG1ldGhvZCBvZiBVUkxQYXJzaW5nIHNlcnZpY2Ugd2l0aCBnaXZlbiBzSGFzaC5cblx0ICogQHBhcmFtIHNIYXNoIENoZWNrIHRoZSBkZWZpbml0aW9uIG9mXG5cdCAqIHNhcC51c2hlbGwuc2VydmljZXMuVVJMUGFyc2luZz0+cGFyc2VTaGVsbEhhc2ggYXJndW1lbnRzXG5cdCAqIEByZXR1cm5zIFRoZSBwYXJzZWQgdXJsXG5cdCAqL1xuXHRwYXJzZVNoZWxsSGFzaChzSGFzaDogc3RyaW5nKTogUGFyc2VkSGFzaCB7XG5cdFx0cmV0dXJuIHRoaXMudXJsUGFyc2luZ1NlcnZpY2UucGFyc2VTaGVsbEhhc2goc0hhc2gpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFdpbGwgY2FsbCBzcGxpdEhhc2ggbWV0aG9kIG9mIFVSTFBhcnNpbmcgc2VydmljZSB3aXRoIGdpdmVuIHNIYXNoLlxuXHQgKiBAcGFyYW0gc0hhc2ggQ2hlY2sgdGhlIGRlZmluaXRpb24gb2Zcblx0ICogc2FwLnVzaGVsbC5zZXJ2aWNlcy5VUkxQYXJzaW5nPT5zcGxpdEhhc2ggYXJndW1lbnRzXG5cdCAqIEByZXR1cm5zIFByb21pc2Ugd2hpY2ggd2lsbCBiZSByZXNvbHZlZCB0byBvYmplY3Rcblx0ICovXG5cdHNwbGl0SGFzaChzSGFzaDogc3RyaW5nKTogeyBzaGVsbFBhcnQ/OiBzdHJpbmc7IGFwcFNwZWNpZmljUm91dGU/OiBzdHJpbmcgfSB7XG5cdFx0cmV0dXJuIHRoaXMudXJsUGFyc2luZ1NlcnZpY2Uuc3BsaXRIYXNoKHNIYXNoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBXaWxsIGNhbGwgY29uc3RydWN0U2hlbGxIYXNoIG1ldGhvZCBvZiBVUkxQYXJzaW5nIHNlcnZpY2Ugd2l0aCBnaXZlbiBzSGFzaC5cblx0ICogQHBhcmFtIG9OZXdTaGVsbEhhc2ggQ2hlY2sgdGhlIGRlZmluaXRpb24gb2Zcblx0ICogc2FwLnVzaGVsbC5zZXJ2aWNlcy5VUkxQYXJzaW5nPT5jb25zdHJ1Y3RTaGVsbEhhc2ggYXJndW1lbnRzXG5cdCAqIEByZXR1cm5zIFNoZWxsIEhhc2ggc3RyaW5nXG5cdCAqL1xuXHRjb25zdHJ1Y3RTaGVsbEhhc2gob05ld1NoZWxsSGFzaDogb2JqZWN0KTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy51cmxQYXJzaW5nU2VydmljZS5jb25zdHJ1Y3RTaGVsbEhhc2gob05ld1NoZWxsSGFzaCk7XG5cdH1cblxuXHQvKipcblx0ICogV2lsbCBjYWxsIHNldERpcnR5RmxhZyBtZXRob2Qgd2l0aCBnaXZlbiBkaXJ0eSBzdGF0ZS5cblx0ICogQHBhcmFtIGJEaXJ0eSBDaGVjayB0aGUgZGVmaW5pdGlvbiBvZiBzYXAudXNoZWxsLkNvbnRhaW5lci5zZXREaXJ0eUZsYWcgYXJndW1lbnRzXG5cdCAqL1xuXHRzZXREaXJ0eUZsYWcoYkRpcnR5OiBib29sZWFuKTogdm9pZCB7XG5cdFx0dGhpcy5vU2hlbGxDb250YWluZXIuc2V0RGlydHlGbGFnKGJEaXJ0eSk7XG5cdH1cblxuXHQvKipcblx0ICogV2lsbCBjYWxsIHJlZ2lzdGVyRGlydHlTdGF0ZVByb3ZpZGVyIG1ldGhvZCB3aXRoIGdpdmVuIGRpcnR5IHN0YXRlIHByb3ZpZGVyIGNhbGxiYWNrIG1ldGhvZC5cblx0ICogQHBhcmFtIGZuRGlydHlTdGF0ZVByb3ZpZGVyIENoZWNrIHRoZSBkZWZpbml0aW9uIG9mIHNhcC51c2hlbGwuQ29udGFpbmVyLnJlZ2lzdGVyRGlydHlTdGF0ZVByb3ZpZGVyIGFyZ3VtZW50c1xuXHQgKi9cblx0cmVnaXN0ZXJEaXJ0eVN0YXRlUHJvdmlkZXIoZm5EaXJ0eVN0YXRlUHJvdmlkZXI6ICgpID0+IGJvb2xlYW4pOiB2b2lkIHtcblx0XHR0aGlzLm9TaGVsbENvbnRhaW5lci5yZWdpc3RlckRpcnR5U3RhdGVQcm92aWRlcihmbkRpcnR5U3RhdGVQcm92aWRlcik7XG5cdH1cblxuXHQvKipcblx0ICogV2lsbCBjYWxsIGRlcmVnaXN0ZXJEaXJ0eVN0YXRlUHJvdmlkZXIgbWV0aG9kIHdpdGggZ2l2ZW4gZGlydHkgc3RhdGUgcHJvdmlkZXIgY2FsbGJhY2sgbWV0aG9kLlxuXHQgKiBAcGFyYW0gZm5EaXJ0eVN0YXRlUHJvdmlkZXIgQ2hlY2sgdGhlIGRlZmluaXRpb24gb2Ygc2FwLnVzaGVsbC5Db250YWluZXIuZGVyZWdpc3RlckRpcnR5U3RhdGVQcm92aWRlciBhcmd1bWVudHNcblx0ICovXG5cdGRlcmVnaXN0ZXJEaXJ0eVN0YXRlUHJvdmlkZXIoZm5EaXJ0eVN0YXRlUHJvdmlkZXI6ICgpID0+IGJvb2xlYW4pOiB2b2lkIHtcblx0XHR0aGlzLm9TaGVsbENvbnRhaW5lci5kZXJlZ2lzdGVyRGlydHlTdGF0ZVByb3ZpZGVyKGZuRGlydHlTdGF0ZVByb3ZpZGVyKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBXaWxsIGNhbGwgZ2V0VXNlciBtZXRob2Qgb2YgdXNoZWxsIGNvbnRhaW5lci5cblx0ICogQHJldHVybnMgUmV0dXJucyBVc2VyIG9iamVjdFxuXHQgKi9cblx0Z2V0VXNlcigpOiBVc2VySW5mbyB7XG5cdFx0cmV0dXJuIHRoaXMudXNlckluZm9TZXJ2aWNlO1xuXHR9XG5cblx0aXNKYW1BY3RpdmUoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMub1NoZWxsQ29udGFpbmVyLmdldFVzZXIoKS5pc0phbUFjdGl2ZSgpO1xuXHR9XG5cblx0Z2V0VXNlckluaXRpYWxzKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMub1NoZWxsQ29udGFpbmVyLmdldFVzZXIoKS5nZXRJbml0aWFscygpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFdpbGwgY2hlY2sgaWYgdXNoZWxsIGNvbnRhaW5lciBpcyBhdmFpbGFibGUgb3Igbm90LlxuXHQgKiBAcmV0dXJucyBSZXR1cm5zIHRydWVcblx0ICovXG5cdGhhc1VTaGVsbCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBXaWxsIGNhbGwgcmVnaXN0ZXJOYXZpZ2F0aW9uRmlsdGVyIG1ldGhvZCBvZiBzaGVsbE5hdmlnYXRpb24uXG5cdCAqIEBwYXJhbSBmbk5hdkZpbHRlciBUaGUgZmlsdGVyIGZ1bmN0aW9uIHRvIHJlZ2lzdGVyXG5cdCAqL1xuXHRyZWdpc3Rlck5hdmlnYXRpb25GaWx0ZXIoZm5OYXZGaWx0ZXI6IEZ1bmN0aW9uKTogdm9pZCB7XG5cdFx0dGhpcy5zaGVsbE5hdmlnYXRpb24ucmVnaXN0ZXJOYXZpZ2F0aW9uRmlsdGVyKGZuTmF2RmlsdGVyKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBXaWxsIGNhbGwgdW5yZWdpc3Rlck5hdmlnYXRpb25GaWx0ZXIgbWV0aG9kIG9mIHNoZWxsTmF2aWdhdGlvbi5cblx0ICogQHBhcmFtIGZuTmF2RmlsdGVyIFRoZSBmaWx0ZXIgZnVuY3Rpb24gdG8gdW5yZWdpc3RlclxuXHQgKi9cblx0dW5yZWdpc3Rlck5hdmlnYXRpb25GaWx0ZXIoZm5OYXZGaWx0ZXI6IEZ1bmN0aW9uKTogdm9pZCB7XG5cdFx0dGhpcy5zaGVsbE5hdmlnYXRpb24udW5yZWdpc3Rlck5hdmlnYXRpb25GaWx0ZXIoZm5OYXZGaWx0ZXIpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFdpbGwgY2FsbCBzZXRCYWNrTmF2aWdhdGlvbiBtZXRob2Qgb2YgU2hlbGxVSVNlcnZpY2Vcblx0ICogdGhhdCBkaXNwbGF5cyB0aGUgYmFjayBidXR0b24gaW4gdGhlIHNoZWxsIGhlYWRlci5cblx0ICogQHBhcmFtIGZuQ2FsbEJhY2sgQSBjYWxsYmFjayBmdW5jdGlvbiBjYWxsZWQgd2hlbiB0aGUgYnV0dG9uIGlzIGNsaWNrZWQgaW4gdGhlIFVJLlxuXHQgKi9cblx0YXN5bmMgc2V0QmFja05hdmlnYXRpb24oZm5DYWxsQmFjazogRnVuY3Rpb24pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQoYXdhaXQgdGhpcy5nZXRTaGVsbFVJU2VydmljZSgpKS5zZXRCYWNrTmF2aWdhdGlvbihmbkNhbGxCYWNrKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBXaWxsIGNhbGwgc2V0SGllcmFyY2h5IG1ldGhvZCBvZiBTaGVsbFVJU2VydmljZVxuXHQgKiB0aGF0IGRpc3BsYXlzIHRoZSBnaXZlbiBoaWVyYXJjaHkgaW4gdGhlIHNoZWxsIGhlYWRlci5cblx0ICogQHBhcmFtIFthSGllcmFyY2h5TGV2ZWxzXSBBbiBhcnJheSByZXByZXNlbnRpbmcgaGllcmFyY2hpZXMgb2YgdGhlIGN1cnJlbnRseSBkaXNwbGF5ZWQgYXBwLlxuXHQgKi9cblx0YXN5bmMgc2V0SGllcmFyY2h5KGFIaWVyYXJjaHlMZXZlbHM6IG9iamVjdFtdKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0KGF3YWl0IHRoaXMuZ2V0U2hlbGxVSVNlcnZpY2UoKSkuc2V0SGllcmFyY2h5KGFIaWVyYXJjaHlMZXZlbHMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFdpbGwgY2FsbCBzZXRUaXRsZSBtZXRob2Qgb2YgU2hlbGxVSVNlcnZpY2Vcblx0ICogdGhhdCBkaXNwbGF5cyB0aGUgZ2l2ZW4gdGl0bGUgaW4gdGhlIHNoZWxsIGhlYWRlci5cblx0ICogQHBhcmFtIFtzVGl0bGVdIFRoZSBuZXcgdGl0bGUuIFRoZSBkZWZhdWx0IHRpdGxlIGlzIHNldCBpZiB0aGlzIGFyZ3VtZW50IGlzIG5vdCBnaXZlbi5cblx0ICovXG5cdGFzeW5jIHNldFRpdGxlKHNUaXRsZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0KGF3YWl0IHRoaXMuZ2V0U2hlbGxVSVNlcnZpY2UoKSkuc2V0VGl0bGUoc1RpdGxlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBXaWxsIGNhbGwgZ2V0VGl0bGUgbWV0aG9kIG9mIFNoZWxsVUlTZXJ2aWNlXG5cdCAqIHRoYXQgZGlzcGxheXMgdGhlIGdpdmVuIHRpdGxlIGluIHRoZSBzaGVsbCBoZWFkZXIuXG5cdCAqIEByZXR1cm5zIFRoZSB0aXRsZSBvZiB0aGUgYXBwbGljYXRpb24uXG5cdCAqL1xuXHRhc3luYyBnZXRUaXRsZSgpOiBQcm9taXNlPHN0cmluZz4ge1xuXHRcdHJldHVybiAoYXdhaXQgdGhpcy5nZXRTaGVsbFVJU2VydmljZSgpKS5nZXRUaXRsZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlcyB0aGUgY3VycmVudGx5IGRlZmluZWQgY29udGVudCBkZW5zaXR5LlxuXHQgKiBAcmV0dXJucyBUaGUgY29udGVudCBkZW5zaXR5IHZhbHVlXG5cdCAqL1xuXHRnZXRDb250ZW50RGVuc2l0eSgpOiBzdHJpbmcge1xuXHRcdHJldHVybiB0aGlzLm9TaGVsbENvbnRhaW5lci5nZXRVc2VyKCkuZ2V0Q29udGVudERlbnNpdHkoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBGb3IgYSBnaXZlbiBzZW1hbnRpYyBvYmplY3QsIHRoaXMgbWV0aG9kIGNvbnNpZGVycyBhbGwgYWN0aW9ucyBhc3NvY2lhdGVkIHdpdGggdGhlIHNlbWFudGljIG9iamVjdCBhbmRcblx0ICogcmV0dXJucyB0aGUgb25lIHRhZ2dlZCBhcyBhIFwicHJpbWFyeUFjdGlvblwiLiBJZiBubyBpbmJvdW5kIHRhZ2dlZCBhcyBcInByaW1hcnlBY3Rpb25cIiBleGlzdHMsIHRoZW4gaXQgcmV0dXJuc1xuXHQgKiB0aGUgaW50ZW50IG9mIHRoZSBmaXJzdCBpbmJvdW5kIChhZnRlciBzb3J0aW5nIGhhcyBiZWVuIGFwcGxpZWQpIG1hdGNoaW5nIHRoZSBhY3Rpb24gXCJkaXNwbGF5RmFjdFNoZWV0XCIuXG5cdCAqIEBwYXJhbSBzU2VtYW50aWNPYmplY3QgU2VtYW50aWMgb2JqZWN0LlxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMgU2VlICNDcm9zc0FwcGxpY2F0aW9uTmF2aWdhdGlvbiNnZXRMaW5rcyBmb3IgZGVzY3JpcHRpb24uXG5cdCAqIEByZXR1cm5zIFByb21pc2Ugd2hpY2ggd2lsbCBiZSByZXNvbHZlZCB3aXRoIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSBpbnRlbnQgaWYgaXQgZXhpc3RzLlxuXHQgKi9cblx0YXN5bmMgZ2V0UHJpbWFyeUludGVudChzU2VtYW50aWNPYmplY3Q6IHN0cmluZywgbVBhcmFtZXRlcnM/OiBMaW5rRmlsdGVyKTogUHJvbWlzZTxMaW5rPiB7XG5cdFx0Y29uc3QgcHJpbWFyeUludGVudCA9IGF3YWl0IHRoaXMuYXBwbGljYXRpb25OYXZpZ2F0aW9uLmdldFByaW1hcnlJbnRlbnQoc1NlbWFudGljT2JqZWN0LCBtUGFyYW1ldGVycyk7XG5cdFx0aWYgKEFycmF5LmlzQXJyYXkocHJpbWFyeUludGVudCkpIHtcblx0XHRcdHJldHVybiBwcmltYXJ5SW50ZW50WzBdO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gcHJpbWFyeUludGVudDtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogV2FpdCBmb3IgdGhlIHJlbmRlciBleHRlbnNpb25zIHBsdWdpbiB0byBiZSBsb2FkZWQuXG5cdCAqIEByZXR1cm5zIFRydWUgaWYgd2UgYXJlIGFibGUgdG8gd2FpdCBmb3IgaXQsIG90aGVyd2lzZSB3ZSBjb3VsZG4ndCBhbmQgY2Fubm90IHJlbHkgb24gaXQuXG5cdCAqL1xuXHRhc3luYyB3YWl0Rm9yUGx1Z2luc0xvYWQoKTogUHJvbWlzZTxib29sZWFuPiB7XG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG5cdFx0XHRpZiAoIXRoaXMuc2hlbGxQbHVnaW5NYW5hZ2VyPy5nZXRQbHVnaW5Mb2FkaW5nUHJvbWlzZSkge1xuXHRcdFx0XHRyZXNvbHZlKGZhbHNlKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcm9taXNlL2NhdGNoLW9yLXJldHVyblxuXHRcdFx0XHR0aGlzLnNoZWxsUGx1Z2luTWFuYWdlclxuXHRcdFx0XHRcdC5nZXRQbHVnaW5Mb2FkaW5nUHJvbWlzZShcIlJlbmRlcmVyRXh0ZW5zaW9uc1wiKVxuXHRcdFx0XHRcdC5mYWlsKChvRXJyb3I6IHVua25vd24pID0+IHtcblx0XHRcdFx0XHRcdExvZy5lcnJvcihvRXJyb3IgYXMgc3RyaW5nLCBcInNhcC5mZS5jb3JlLnNlcnZpY2VzLlNoZWxsU2VydmljZXNGYWN0b3J5LndhaXRGb3JQbHVnaW5zTG9hZFwiKTtcblx0XHRcdFx0XHRcdHJlc29sdmUoZmFsc2UpO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0LnRoZW4oKCkgPT4gcmVzb2x2ZSh0cnVlKSk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IHRoZSBwZXJzb25hbGl6ZXIgZnJvbSB0aGUgc2hlbGwgc2VydmljZS5cblx0ICogV2Ugc2V0IHNvbWUgZGVmYXVsdHMgZm9yIHRoZSBzY29wZSBvYmplY3QuXG5cdCAqIEBwYXJhbSBwZXJzSWQgUGVyc29uYWxpemF0aW9uIG9iamVjdFxuXHQgKiBAcGFyYW0gc2NvcGUgU2NvcGUgb2JqZWN0XG5cdCAqIEBwYXJhbSBjb21wb25lbnRcblx0ICogQHJldHVybnMgUGVyc29uYWxpemVyIG9iamVjdCB3aGljaCBoYW5kbGVzIHBlcnNvbmFsaXphdGlvblxuXHQgKi9cblx0YXN5bmMgZ2V0UGVyc29uYWxpemVyKHBlcnNJZDogUGVyc0lkLCBzY29wZTogU2NvcGUsIGNvbXBvbmVudD86IENvbXBvbmVudCk6IFByb21pc2U8UGVyc29uYWxpemVyVHlwZT4ge1xuXHRcdHNjb3BlID0ge1xuXHRcdFx0Ly8gbWVyZ2Ugc29tZSBkZWZhdWx0c1xuXHRcdFx0a2V5Q2F0ZWdvcnk6IHRoaXMuc2hlbGxQZXJzb25hbGl6YXRpb25TZXJ2aWNlLmNvbnN0YW50cy5rZXlDYXRlZ29yeS5GSVhFRF9LRVksXG5cdFx0XHR3cml0ZUZyZXF1ZW5jeTogdGhpcy5zaGVsbFBlcnNvbmFsaXphdGlvblNlcnZpY2UuY29uc3RhbnRzLndyaXRlRnJlcXVlbmN5LkxPVyxcblx0XHRcdGNsaWVudFN0b3JhZ2VBbGxvd2VkOiBmYWxzZSxcblx0XHRcdHZhbGlkaXR5OiBJbmZpbml0eSxcblx0XHRcdC4uLnNjb3BlXG5cdFx0fTtcblx0XHRyZXR1cm4gKGF3YWl0IHRoaXMuc2hlbGxQZXJzb25hbGl6YXRpb25TZXJ2aWNlLmdldFBlcnNvbmFsaXplcihwZXJzSWQsIHNjb3BlLCBjb21wb25lbnQpKSBhcyBQZXJzb25hbGl6ZXJUeXBlO1xuXHR9XG5cblx0LyoqXG5cdCAqIERlbGV0ZXMgYSBjb250YWluZXIgaWRlbnRpZmllZCBieSBzQ29udGFpbmVyS2V5LlxuXHQgKiBAcGFyYW0ga2V5IENvbnRhaW5lciBrZXlcblx0ICogQHBhcmFtIHNjb3BlIFNjb3BlIG9iamVjdFxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHdoaWNoIGlzIHJlc29sdmVkIHdoZW4gdGhlIGNvbnRhaW5lciBpcyBkZWxldGVkXG5cdCAqL1xuXHRhc3luYyBkZWxldGVQZXJzb25hbGl6YXRpb25Db250YWluZXIoa2V5OiBzdHJpbmcsIHNjb3BlPzogb2JqZWN0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0cmV0dXJuIHRoaXMuc2hlbGxQZXJzb25hbGl6YXRpb25TZXJ2aWNlLmRlbGV0ZUNvbnRhaW5lcihrZXksIHNjb3BlIGFzIHVua25vd24gYXMgb2JqZWN0KSBhcyBQcm9taXNlPHZvaWQ+O1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgbWV0aG9kIGluaXRpYWxpemVzIHRoZSBwZXJzb25hbGl6ZXIgdG8gYWNjZXNzIHRoZSBBcHBsaWNhdGlvbiBkYXRhIHN0b3JlZCBpbiB0aGUgc2hlbGwgUGVyc29uYWxpemF0aW9uLlxuXHQgKiBAcGFyYW0gaXRlbU5hbWUgVGhlIG5hbWUgb2YgdGhlIGl0ZW0gZm9yIHdoaWNoIHRoZSBwZXJzb25hbGl6ZXIgaXMgY3JlYXRlZC5cblx0ICogQHJldHVybnMgQSBwZXJzb25hbGl6ZXJcblx0ICovXG5cdHB1YmxpYyBhc3luYyBnZXRBcHBsaWNhdGlvblBlcnNvbmFsaXplcihpdGVtTmFtZTogc3RyaW5nKTogUHJvbWlzZTxQZXJzb25hbGl6ZXJUeXBlPiB7XG5cdFx0aWYgKCF0aGlzLmFwcGxpY2F0aW9uUGVyc29ubmFsaXplcnNbaXRlbU5hbWVdKSB7XG5cdFx0XHR0aGlzLmFwcGxpY2F0aW9uUGVyc29ubmFsaXplcnNbaXRlbU5hbWVdID0gdGhpcy5nZXRQZXJzb25hbGl6ZXIoXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRjb250YWluZXI6IGBBcHBsaWNhdGlvbiMkeyh0aGlzLmFwcENvbXBvbmVudCBhcyBBcHBDb21wb25lbnQpLmdldE1hbmlmZXN0KClbXCJzYXAuYXBwXCJdLmlkfWAsXG5cdFx0XHRcdFx0aXRlbTogaXRlbU5hbWVcblx0XHRcdFx0fSxcblx0XHRcdFx0e30sXG5cdFx0XHRcdHRoaXMuYXBwQ29tcG9uZW50XG5cdFx0XHQpO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy5hcHBsaWNhdGlvblBlcnNvbm5hbGl6ZXJzW2l0ZW1OYW1lXTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGRhdGEgZnJvbSB0aGUgcGVyc29uYWxpemF0aW9uIHNlcnZpY2UuXG5cdCAqIEBwYXJhbSBpdGVtTmFtZVxuXHQgKiBAcmV0dXJucyBEYXRhXG5cdCAqL1xuXHRwdWJsaWMgYXN5bmMgZ2V0QXBwbGljYXRpb25QZXJzb25hbGl6YXRpb25EYXRhKGl0ZW1OYW1lOiBzdHJpbmcpOiBQcm9taXNlPG9iamVjdCB8IHVuZGVmaW5lZD4ge1xuXHRcdHJldHVybiAoYXdhaXQgKGF3YWl0IHRoaXMuZ2V0QXBwbGljYXRpb25QZXJzb25hbGl6ZXIoaXRlbU5hbWUpKT8uZ2V0UGVyc0RhdGEoKSkgYXMgb2JqZWN0IHwgdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgbWV0aG9kIHN0b3JlcyBhbiBvYmplY3QgaW4gdGhlIHBlcnNvbmFsaXphdGlvbiBzZXJ2aWNlLlxuXHQgKiBAcGFyYW0gaXRlbU5hbWVcblx0ICogQHBhcmFtIGRhdGFcblx0ICogQHJldHVybnMgQSBwcm9taXNlXG5cdCAqL1xuXHRwdWJsaWMgYXN5bmMgc2V0QXBwbGljYXRpb25QZXJzb25hbGl6YXRpb25EYXRhKGl0ZW1OYW1lOiBzdHJpbmcsIGRhdGE6IG9iamVjdCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdChhd2FpdCB0aGlzLmdldEFwcGxpY2F0aW9uUGVyc29uYWxpemVyKGl0ZW1OYW1lKSkuc2V0UGVyc0RhdGEoZGF0YSk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IHRoZSBzaGVsbCBjb25maWcgZnJvbSB0aGUgd2luZG93cyBvYmplY3QuXG5cdCAqIEByZXR1cm5zIFNoZWxsIGNvbmZpZyBvYmplY3Rcblx0ICovXG5cdGdldFNoZWxsQ29uZmlnKCk6IFNoZWxsQ29uZmlnVHlwZSB7XG5cdFx0cmV0dXJuICh3aW5kb3cgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCBvYmplY3Q+KVtcInNhcC11c2hlbGwtY29uZmlnXCJdIGFzIFNoZWxsQ29uZmlnVHlwZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBQYXJzZSBwYXJhbWV0ZXJzIGZyb20gYSBVUkkgcXVlcnkgc3RyaW5nIChzdGFydGluZyB3aXRoID8pIGludG8gYSBwYXJhbWV0ZXIgb2JqZWN0LlxuXHQgKiBAcGFyYW0gdXJsIENoZWNrIHRoZSBkZWZpbml0aW9uIG9mXG5cdCAqIFBhcmFtZXRlciBzdHJpbmdcblx0ICogQHJldHVybnMgQW4gb2JqZWN0IGNvbnRhaW5nIHN0cmluZyBhcnJheXNcblx0ICovXG5cdHBhcnNlUGFyYW1ldGVycyh1cmw6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPiB7XG5cdFx0cmV0dXJuIHRoaXMudXJsUGFyc2luZ1NlcnZpY2UucGFyc2VQYXJhbWV0ZXJzKHVybCk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IHRoZSBzaGVsbCBleHRlbnNpb24gc2VydmljZS5cblx0ICogQHJldHVybnMgU2hlbGwgZXh0ZW5zaW9uIHNlcnZpY2Vcblx0ICovXG5cdGdldEV4dGVuc2lvblNlcnZpY2UoKTogRXh0ZW5zaW9uIHtcblx0XHRyZXR1cm4gdGhpcy5leHRlbnNpb25TZXJ2aWNlO1xuXHR9XG59XG5cbi8qKlxuICogU2VydmljZSBGYWN0b3J5IGZvciB0aGUgU2hlbGxTZXJ2aWNlc1xuICpcbiAqL1xuY2xhc3MgU2hlbGxTZXJ2aWNlc0ZhY3RvcnkgZXh0ZW5kcyBTZXJ2aWNlRmFjdG9yeTxTaGVsbFNlcnZpY2VzU2V0dGluZ3M+IHtcblx0LyoqXG5cdCAqIENyZWF0ZXMgZWl0aGVyIGEgc3RhbmRhcmQgb3IgYSBtb2NrIFNoZWxsIHNlcnZpY2UgZGVwZW5kaW5nIG9uIHRoZSBjb25maWd1cmF0aW9uLlxuXHQgKiBAcGFyYW0gc2VydmljZUNvbnRleHQgVGhlIHNoZWxsc2VydmljZSBjb250ZXh0XG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSBmb3IgYSBzaGVsbCBzZXJ2aWNlIGltcGxlbWVudGF0aW9uXG5cdCAqIEBzZWUgU2VydmljZUZhY3RvcnkjY3JlYXRlSW5zdGFuY2Vcblx0ICovXG5cdGFzeW5jIGNyZWF0ZUluc3RhbmNlKHNlcnZpY2VDb250ZXh0OiBTZXJ2aWNlQ29udGV4dDxTaGVsbFNlcnZpY2VzU2V0dGluZ3M+KTogUHJvbWlzZTxJU2hlbGxTZXJ2aWNlcz4ge1xuXHRcdHNlcnZpY2VDb250ZXh0LnNldHRpbmdzLnNoZWxsQ29udGFpbmVyID0gc2FwLnVpLnJlcXVpcmUoXCJzYXAvdXNoZWxsL0NvbnRhaW5lclwiKTtcblx0XHRjb25zdCBzaGVsbFNlcnZpY2UgPSBzZXJ2aWNlQ29udGV4dC5zZXR0aW5ncy5zaGVsbENvbnRhaW5lclxuXHRcdFx0PyBuZXcgU2hlbGxTZXJ2aWNlcyhzZXJ2aWNlQ29udGV4dCBhcyBTZXJ2aWNlQ29udGV4dDxSZXF1aXJlZDxTaGVsbFNlcnZpY2VzU2V0dGluZ3M+Pilcblx0XHRcdDogbmV3IFNoZWxsU2VydmljZU1vY2soc2VydmljZUNvbnRleHQpO1xuXHRcdGF3YWl0IHNoZWxsU2VydmljZS5pbml0UHJvbWlzZTtcblx0XHQvLyBFbnJpY2ggdGhlIGFwcENvbXBvbmVudCB3aXRoIHRoaXMgbWV0aG9kXG5cdFx0Y29uc3QgYXBwQ29tcG9uZW50ID0gc2VydmljZUNvbnRleHQuc2NvcGVPYmplY3Q7XG5cdFx0YXBwQ29tcG9uZW50LmdldFNoZWxsU2VydmljZXMgPSAoKTogSVNoZWxsU2VydmljZXMgPT4gc2hlbGxTZXJ2aWNlO1xuXHRcdGNvbnN0IGludGVybmFsTW9kZWwgPSBhcHBDb21wb25lbnQuZ2V0TW9kZWwoXCJpbnRlcm5hbFwiKTtcblx0XHRpZiAoaW50ZXJuYWxNb2RlbCkge1xuXHRcdFx0bGV0IHNlbWFudGljT2JqZWN0czogc3RyaW5nW10gPSBbXTtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdHNlbWFudGljT2JqZWN0cyA9IGF3YWl0IHNoZWxsU2VydmljZS5fX2ZldGNoU2VtYW50aWNPYmplY3QoKTtcblx0XHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGNhbGxpbmcgZ2V0U2VtYW50aWNPYmplY3RzXCIsIGVycm9yIGFzIHN0cmluZyk7XG5cdFx0XHR9IGZpbmFsbHkge1xuXHRcdFx0XHQoaW50ZXJuYWxNb2RlbCBhcyBKU09OTW9kZWwpLnNldFByb3BlcnR5KFwiL3NlbWFudGljT2JqZWN0c1wiLCBzZW1hbnRpY09iamVjdHMpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gc2hlbGxTZXJ2aWNlO1xu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M0QsYUFBQTtFQUFBLEVBdm1CaUNELE9BQU87RUEwbUIxQztBQUNBO0FBQ0E7QUFDQTtFQUhBVSxRQUFBLENBQUFULGFBQUEsR0FBQUEsYUFBQTtFQUFBLElBSU00SCxvQkFBb0IsMEJBQUFDLGVBQUE7SUFBQSxTQUFBRCxxQkFBQTtNQUFBLE9BQUFDLGVBQUEsQ0FBQW5OLEtBQUEsT0FBQUMsU0FBQTtJQUFBO0lBQUFDLGNBQUEsQ0FBQWdOLG9CQUFBLEVBQUFDLGVBQUE7SUFBQSxJQUFBQyxPQUFBLEdBQUFGLG9CQUFBLENBQUE5TSxTQUFBO0lBQ3pCO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtJQUxDZ04sT0FBQSxDQU1NQyxjQUFjLEdBQXBCLGVBQU1BLGNBQWNBLENBQUNDLGNBQXFELEVBQTJCO01BQ3BHQSxjQUFjLENBQUNoSCxRQUFRLENBQUNDLGNBQWMsR0FBR2dILEdBQUcsQ0FBQ0MsRUFBRSxDQUFDQyxPQUFPLENBQUMsc0JBQXNCLENBQUM7TUFDL0UsTUFBTUMsWUFBWSxHQUFHSixjQUFjLENBQUNoSCxRQUFRLENBQUNDLGNBQWMsR0FDeEQsSUFBSWpCLGFBQWEsQ0FBQ2dJLGNBQWlFLENBQUMsR0FDcEYsSUFBSXhOLGdCQUFnQixDQUFDd04sY0FBYyxDQUFDO01BQ3ZDLE1BQU1JLFlBQVksQ0FBQ3BOLFdBQVc7TUFDOUI7TUFDQSxNQUFNNkYsWUFBWSxHQUFHbUgsY0FBYyxDQUFDbEgsV0FBVztNQUMvQ0QsWUFBWSxDQUFDd0gsZ0JBQWdCLEdBQUcsTUFBc0JELFlBQVk7TUFDbEUsTUFBTUUsYUFBYSxHQUFHekgsWUFBWSxDQUFDMEgsUUFBUSxDQUFDLFVBQVUsQ0FBQztNQUN2RCxJQUFJRCxhQUFhLEVBQUU7UUFDbEIsSUFBSUUsZUFBeUIsR0FBRyxFQUFFO1FBQ2xDLElBQUk7VUFDSEEsZUFBZSxHQUFHLE1BQU1KLFlBQVksQ0FBQy9NLHFCQUFxQixDQUFDLENBQUM7UUFDN0QsQ0FBQyxDQUFDLE9BQU93SixLQUFjLEVBQUU7VUFDeEJDLEdBQUcsQ0FBQ0QsS0FBSyxDQUFDLHdDQUF3QyxFQUFFQSxLQUFlLENBQUM7UUFDckUsQ0FBQyxTQUFTO1VBQ1J5RCxhQUFhLENBQWVHLFdBQVcsQ0FBQyxrQkFBa0IsRUFBRUQsZUFBZSxDQUFDO1FBQzlFO01BQ0Q7TUFDQSxPQUFPSixZQUFZO0lBQ3BCLENBQUM7SUFBQSxPQUFBUixvQkFBQTtFQUFBLEVBNUJpQ2MsY0FBYztFQUFBLE9BK0JsQ2Qsb0JBQW9CO0FBQUEiLCJpZ25vcmVMaXN0IjpbXX0=