@sapui5/sap.fe.core 1.108.2 → 1.110.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 (359) hide show
  1. package/README.md +5 -1
  2. package/package.json +11 -9
  3. package/src/.eslintrc +7 -0
  4. package/src/sap/fe/core/.library +39 -37
  5. package/src/sap/fe/core/.supportrc +3 -3
  6. package/src/sap/fe/core/ActionRuntime.js +72 -27
  7. package/src/sap/fe/core/ActionRuntime.ts +104 -21
  8. package/src/sap/fe/core/AppComponent.js +102 -120
  9. package/src/sap/fe/core/AppComponent.ts +148 -45
  10. package/src/sap/fe/core/AppStateHandler.js +105 -91
  11. package/src/sap/fe/core/AppStateHandler.ts +85 -23
  12. package/src/sap/fe/core/BaseController.js +5 -20
  13. package/src/sap/fe/core/BaseController.ts +11 -2
  14. package/src/sap/fe/core/CommonUtils.js +770 -1079
  15. package/src/sap/fe/core/CommonUtils.ts +750 -491
  16. package/src/sap/fe/core/ExtensionAPI.js +69 -96
  17. package/src/sap/fe/core/ExtensionAPI.ts +15 -17
  18. package/src/sap/fe/core/PageController.js +21 -46
  19. package/src/sap/fe/core/PageController.ts +11 -2
  20. package/src/sap/fe/core/TemplateComponent.js +6 -51
  21. package/src/sap/fe/core/TemplateComponent.ts +27 -16
  22. package/src/sap/fe/core/TemplateModel.js +18 -24
  23. package/src/sap/fe/core/TemplateModel.ts +25 -6
  24. package/src/sap/fe/core/buildingBlocks/AttributeModel.js +8 -23
  25. package/src/sap/fe/core/buildingBlocks/AttributeModel.ts +5 -4
  26. package/src/sap/fe/core/buildingBlocks/BuildingBlock.js +146 -180
  27. package/src/sap/fe/core/buildingBlocks/BuildingBlock.ts +144 -57
  28. package/src/sap/fe/core/buildingBlocks/BuildingBlockFormatter.js +1 -1
  29. package/src/sap/fe/core/buildingBlocks/BuildingBlockFragment.js +43 -0
  30. package/src/sap/fe/core/buildingBlocks/BuildingBlockFragment.ts +11 -0
  31. package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.js +436 -556
  32. package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.ts +288 -157
  33. package/src/sap/fe/core/buildingBlocks/TraceInfo.js +215 -202
  34. package/src/sap/fe/core/buildingBlocks/TraceInfo.ts +93 -51
  35. package/src/sap/fe/core/controllerextensions/BusyLocker.js +11 -26
  36. package/src/sap/fe/core/controllerextensions/EditFlow.js +407 -596
  37. package/src/sap/fe/core/controllerextensions/EditFlow.ts +163 -56
  38. package/src/sap/fe/core/controllerextensions/Feedback.js +70 -0
  39. package/src/sap/fe/core/controllerextensions/Feedback.ts +64 -0
  40. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +12 -23
  41. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +1 -1
  42. package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +127 -182
  43. package/src/sap/fe/core/controllerextensions/InternalEditFlow.ts +65 -32
  44. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +96 -198
  45. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +4 -5
  46. package/src/sap/fe/core/controllerextensions/InternalRouting.js +134 -291
  47. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +21 -12
  48. package/src/sap/fe/core/controllerextensions/KPIManagement.js +111 -214
  49. package/src/sap/fe/core/controllerextensions/KPIManagement.ts +44 -44
  50. package/src/sap/fe/core/controllerextensions/MassEdit.js +24 -44
  51. package/src/sap/fe/core/controllerextensions/MassEdit.ts +3 -2
  52. package/src/sap/fe/core/controllerextensions/MessageHandler.js +39 -52
  53. package/src/sap/fe/core/controllerextensions/MessageHandler.ts +26 -7
  54. package/src/sap/fe/core/controllerextensions/PageReady.js +81 -119
  55. package/src/sap/fe/core/controllerextensions/PageReady.ts +36 -15
  56. package/src/sap/fe/core/controllerextensions/Paginator.js +16 -51
  57. package/src/sap/fe/core/controllerextensions/Paginator.ts +1 -3
  58. package/src/sap/fe/core/controllerextensions/Placeholder.js +7 -33
  59. package/src/sap/fe/core/controllerextensions/Routing.js +24 -32
  60. package/src/sap/fe/core/controllerextensions/Routing.ts +6 -1
  61. package/src/sap/fe/core/controllerextensions/RoutingListener.js +1 -1
  62. package/src/sap/fe/core/controllerextensions/Share.js +53 -98
  63. package/src/sap/fe/core/controllerextensions/Share.ts +6 -3
  64. package/src/sap/fe/core/controllerextensions/SideEffects.js +103 -174
  65. package/src/sap/fe/core/controllerextensions/SideEffects.ts +37 -22
  66. package/src/sap/fe/core/controllerextensions/ViewState.js +341 -276
  67. package/src/sap/fe/core/controllerextensions/ViewState.ts +236 -84
  68. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js +6 -22
  69. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.ts +8 -2
  70. package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.js +66 -88
  71. package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.ts +64 -17
  72. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +28 -34
  73. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.ts +22 -1
  74. package/src/sap/fe/core/controllerextensions/collaboration/Manage.js +69 -65
  75. package/src/sap/fe/core/controllerextensions/collaboration/Manage.ts +31 -12
  76. package/src/sap/fe/core/controllerextensions/collaboration/ManageDialog.fragment.xml +15 -13
  77. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +273 -906
  78. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +142 -420
  79. package/src/sap/fe/core/controllerextensions/editFlow/draft.js +49 -115
  80. package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +12 -7
  81. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.js +70 -89
  82. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.ts +313 -320
  83. package/src/sap/fe/core/controllerextensions/editFlow/operations.js +582 -683
  84. package/src/sap/fe/core/controllerextensions/editFlow/operations.ts +507 -386
  85. package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +111 -102
  86. package/src/sap/fe/core/controllerextensions/editFlow/sticky.ts +102 -79
  87. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +689 -154
  88. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +866 -31
  89. package/src/sap/fe/core/controllerextensions/pageReady/DataQueryWatcher.js +24 -101
  90. package/src/sap/fe/core/controllerextensions/pageReady/DataQueryWatcher.ts +5 -5
  91. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +91 -217
  92. package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +3 -20
  93. package/src/sap/fe/core/controls/ActionParameterDialogValueHelp.fragment.xml +1 -0
  94. package/src/sap/fe/core/controls/ActionPartial.fragment.xml +46 -46
  95. package/src/sap/fe/core/controls/Any.js +1 -1
  96. package/src/sap/fe/core/controls/AnyElement.js +1 -1
  97. package/src/sap/fe/core/controls/CommandExecution.js +4 -26
  98. package/src/sap/fe/core/controls/ConditionalWrapper.js +16 -33
  99. package/src/sap/fe/core/controls/ConditionalWrapper.ts +16 -2
  100. package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.js +41 -94
  101. package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.ts +1 -1
  102. package/src/sap/fe/core/controls/CustomQuickViewPage.js +5 -34
  103. package/src/sap/fe/core/controls/CustomQuickViewPage.ts +5 -7
  104. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossDraft.fragment.xml +7 -7
  105. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +56 -58
  106. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.ts +53 -33
  107. package/src/sap/fe/core/controls/FieldWrapper.js +6 -49
  108. package/src/sap/fe/core/controls/FileWrapper.js +51 -136
  109. package/src/sap/fe/core/controls/FileWrapper.ts +25 -29
  110. package/src/sap/fe/core/controls/FilterBar.js +19 -54
  111. package/src/sap/fe/core/controls/FormElementWrapper.js +1 -22
  112. package/src/sap/fe/core/controls/MassEditSelect.js +1 -1
  113. package/src/sap/fe/core/controls/MultiValueParameterDelegate.js +1 -5
  114. package/src/sap/fe/core/controls/MultiValueParameterDelegate.ts +2 -2
  115. package/src/sap/fe/core/controls/NonComputedVisibleKeyFieldsDialog.fragment.xml +24 -46
  116. package/src/sap/fe/core/controls/filterbar/FilterContainer.js +14 -41
  117. package/src/sap/fe/core/controls/filterbar/FilterContainer.ts +4 -4
  118. package/src/sap/fe/core/controls/filterbar/VisualFilter.js +26 -67
  119. package/src/sap/fe/core/controls/filterbar/VisualFilter.ts +20 -20
  120. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +12 -48
  121. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +17 -46
  122. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +3 -3
  123. package/src/sap/fe/core/controls/massEdit/MassEditField.fragment.xml +1 -0
  124. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +6 -78
  125. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.ts +4 -4
  126. package/src/sap/fe/core/converters/ConverterContext.js +44 -98
  127. package/src/sap/fe/core/converters/ConverterContext.ts +1 -1
  128. package/src/sap/fe/core/converters/ManifestSettings.js +1 -20
  129. package/src/sap/fe/core/converters/ManifestSettings.ts +16 -9
  130. package/src/sap/fe/core/converters/ManifestWrapper.js +97 -158
  131. package/src/sap/fe/core/converters/ManifestWrapper.ts +4 -0
  132. package/src/sap/fe/core/converters/MetaModelConverter.js +28 -167
  133. package/src/sap/fe/core/converters/MetaModelConverter.ts +9 -3
  134. package/src/sap/fe/core/converters/TemplateConverter.js +10 -22
  135. package/src/sap/fe/core/converters/TemplateConverter.ts +10 -7
  136. package/src/sap/fe/core/converters/annotations/DataField.js +88 -132
  137. package/src/sap/fe/core/converters/annotations/DataField.ts +90 -38
  138. package/src/sap/fe/core/converters/common/AnnotationConverter.js +57 -379
  139. package/src/sap/fe/core/converters/controls/Common/Action.js +45 -115
  140. package/src/sap/fe/core/converters/controls/Common/Action.ts +17 -5
  141. package/src/sap/fe/core/converters/controls/Common/Chart.js +20 -73
  142. package/src/sap/fe/core/converters/controls/Common/Chart.ts +21 -14
  143. package/src/sap/fe/core/converters/controls/Common/Criticality.js +1 -9
  144. package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +40 -94
  145. package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +44 -31
  146. package/src/sap/fe/core/converters/controls/Common/Form.js +26 -63
  147. package/src/sap/fe/core/converters/controls/Common/Form.ts +24 -10
  148. package/src/sap/fe/core/converters/controls/Common/KPI.js +13 -63
  149. package/src/sap/fe/core/converters/controls/Common/Table.js +368 -707
  150. package/src/sap/fe/core/converters/controls/Common/Table.ts +308 -197
  151. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +54 -109
  152. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +15 -9
  153. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +69 -210
  154. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +23 -16
  155. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +12 -80
  156. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +3 -1
  157. package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.js +1 -19
  158. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +45 -136
  159. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.ts +10 -10
  160. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +82 -173
  161. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +48 -22
  162. package/src/sap/fe/core/converters/helpers/Aggregation.js +24 -66
  163. package/src/sap/fe/core/converters/helpers/Aggregation.ts +3 -7
  164. package/src/sap/fe/core/converters/helpers/BindingHelper.js +9 -19
  165. package/src/sap/fe/core/converters/helpers/BindingHelper.ts +0 -1
  166. package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +20 -48
  167. package/src/sap/fe/core/converters/helpers/ConfigurableObject.ts +5 -1
  168. package/src/sap/fe/core/converters/helpers/DataFieldHelper.js +12 -51
  169. package/src/sap/fe/core/converters/helpers/DataFieldHelper.ts +13 -11
  170. package/src/sap/fe/core/converters/helpers/ID.js +3 -17
  171. package/src/sap/fe/core/converters/helpers/ID.ts +2 -3
  172. package/src/sap/fe/core/converters/helpers/IssueManager.js +1 -6
  173. package/src/sap/fe/core/converters/helpers/Key.js +10 -19
  174. package/src/sap/fe/core/converters/helpers/Key.ts +3 -3
  175. package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.js +2 -20
  176. package/src/sap/fe/core/converters/objectPage/FormMenuActions.js +2 -37
  177. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +126 -131
  178. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +112 -31
  179. package/src/sap/fe/core/converters/templates/ListReportConverter.js +67 -131
  180. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +58 -27
  181. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +106 -183
  182. package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +73 -104
  183. package/src/sap/fe/core/designtime/AppComponent.designtime.js +74 -67
  184. package/src/sap/fe/core/designtime/AppComponent.designtime.ts +77 -69
  185. package/src/sap/fe/core/formatters/CollaborationFormatter.js +20 -29
  186. package/src/sap/fe/core/formatters/CollaborationFormatter.ts +21 -0
  187. package/src/sap/fe/core/formatters/FPMFormatter.js +3 -7
  188. package/src/sap/fe/core/formatters/KPIFormatter.js +5 -13
  189. package/src/sap/fe/core/formatters/StandardFormatter.js +3 -18
  190. package/src/sap/fe/core/formatters/StandardFormatter.ts +3 -2
  191. package/src/sap/fe/core/formatters/TableFormatter.js +87 -53
  192. package/src/sap/fe/core/formatters/TableFormatter.ts +96 -9
  193. package/src/sap/fe/core/formatters/TableFormatterTypes.js +1 -4
  194. package/src/sap/fe/core/formatters/ValueFormatter.js +1 -37
  195. package/src/sap/fe/core/fpm/Component.js +2 -17
  196. package/src/sap/fe/core/helpers/AnnotationEnum.js +10 -20
  197. package/src/sap/fe/core/helpers/AnnotationEnum.ts +6 -6
  198. package/src/sap/fe/core/helpers/AppStartupHelper.js +16 -52
  199. package/src/sap/fe/core/helpers/AppStartupHelper.ts +1 -1
  200. package/src/sap/fe/core/helpers/BindingToolkit.js +106 -364
  201. package/src/sap/fe/core/helpers/BindingToolkit.ts +30 -7
  202. package/src/sap/fe/core/helpers/ClassSupport.js +16 -97
  203. package/src/sap/fe/core/helpers/ClassSupport.ts +7 -4
  204. package/src/sap/fe/core/helpers/DeleteHelper.js +621 -0
  205. package/src/sap/fe/core/helpers/DeleteHelper.ts +796 -0
  206. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +1 -12
  207. package/src/sap/fe/core/helpers/EditState.js +2 -5
  208. package/src/sap/fe/core/helpers/ExcelFormatHelper.js +1 -10
  209. package/src/sap/fe/core/helpers/FPMHelper.js +3 -8
  210. package/src/sap/fe/core/helpers/FPMHelper.ts +2 -1
  211. package/src/sap/fe/core/helpers/KeepAliveHelper.js +8 -38
  212. package/src/sap/fe/core/helpers/KeepAliveRefreshTypes.js +1 -5
  213. package/src/sap/fe/core/helpers/LoaderUtils.js +1 -7
  214. package/src/sap/fe/core/helpers/MassEditHelper.js +177 -289
  215. package/src/sap/fe/core/helpers/MassEditHelper.ts +124 -91
  216. package/src/sap/fe/core/helpers/MessageStrip.js +12 -28
  217. package/src/sap/fe/core/helpers/MessageStrip.ts +7 -7
  218. package/src/sap/fe/core/helpers/ModelHelper.js +62 -103
  219. package/src/sap/fe/core/helpers/ModelHelper.ts +58 -20
  220. package/src/sap/fe/core/helpers/PasteHelper.js +28 -51
  221. package/src/sap/fe/core/helpers/PasteHelper.ts +10 -9
  222. package/src/sap/fe/core/helpers/SemanticDateOperators.js +112 -136
  223. package/src/sap/fe/core/helpers/SemanticDateOperators.ts +111 -111
  224. package/src/sap/fe/core/helpers/SemanticKeyHelper.js +5 -11
  225. package/src/sap/fe/core/helpers/SideEffectsHelper.js +26 -32
  226. package/src/sap/fe/core/helpers/StableIdHelper.js +166 -218
  227. package/src/sap/fe/core/helpers/StableIdHelper.ts +175 -191
  228. package/src/sap/fe/core/helpers/Synchronization.js +1 -8
  229. package/src/sap/fe/core/helpers/ToES6Promise.js +1 -4
  230. package/src/sap/fe/core/helpers/TypeGuards.js +22 -0
  231. package/src/sap/fe/core/helpers/TypeGuards.ts +9 -0
  232. package/src/sap/fe/core/jsx-runtime/Fragment.js +1 -3
  233. package/src/sap/fe/core/jsx-runtime/ViewLoader.js +3 -23
  234. package/src/sap/fe/core/jsx-runtime/jsx-control.js +3 -23
  235. package/src/sap/fe/core/jsx-runtime/jsx-control.ts +2 -1
  236. package/src/sap/fe/core/jsx-runtime/jsx-xml.js +4 -16
  237. package/src/sap/fe/core/jsx-runtime/jsx-xml.ts +1 -1
  238. package/src/sap/fe/core/jsx-runtime/jsx.js +2 -5
  239. package/src/sap/fe/core/jsx-runtime/jsxs.js +1 -1
  240. package/src/sap/fe/core/jsx-runtime/useMDXComponents.js +4 -27
  241. package/src/sap/fe/core/jsx-runtime/useMDXComponents.tsx +1 -1
  242. package/src/sap/fe/core/library.js +9 -48
  243. package/src/sap/fe/core/library.support.js +3 -2
  244. package/src/sap/fe/core/library.support.ts +3 -1
  245. package/src/sap/fe/core/library.ts +3 -8
  246. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +74 -39
  247. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +71 -26
  248. package/src/sap/fe/core/messagebundle.properties +113 -67
  249. package/src/sap/fe/core/messagebundle_ar.properties +20 -3
  250. package/src/sap/fe/core/messagebundle_bg.properties +22 -5
  251. package/src/sap/fe/core/messagebundle_ca.properties +21 -4
  252. package/src/sap/fe/core/messagebundle_cs.properties +21 -4
  253. package/src/sap/fe/core/messagebundle_cy.properties +22 -5
  254. package/src/sap/fe/core/messagebundle_da.properties +20 -3
  255. package/src/sap/fe/core/messagebundle_de.properties +38 -21
  256. package/src/sap/fe/core/messagebundle_el.properties +20 -3
  257. package/src/sap/fe/core/messagebundle_en.properties +38 -21
  258. package/src/sap/fe/core/messagebundle_en_GB.properties +20 -3
  259. package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +41 -28
  260. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +41 -24
  261. package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +42 -29
  262. package/src/sap/fe/core/messagebundle_es.properties +40 -23
  263. package/src/sap/fe/core/messagebundle_es_MX.properties +20 -3
  264. package/src/sap/fe/core/messagebundle_et.properties +20 -3
  265. package/src/sap/fe/core/messagebundle_fi.properties +20 -3
  266. package/src/sap/fe/core/messagebundle_fr.properties +21 -4
  267. package/src/sap/fe/core/messagebundle_fr_CA.properties +22 -5
  268. package/src/sap/fe/core/messagebundle_hi.properties +20 -3
  269. package/src/sap/fe/core/messagebundle_hr.properties +22 -5
  270. package/src/sap/fe/core/messagebundle_hu.properties +20 -3
  271. package/src/sap/fe/core/messagebundle_id.properties +20 -3
  272. package/src/sap/fe/core/messagebundle_it.properties +23 -6
  273. package/src/sap/fe/core/messagebundle_iw.properties +20 -3
  274. package/src/sap/fe/core/messagebundle_ja.properties +22 -5
  275. package/src/sap/fe/core/messagebundle_kk.properties +21 -4
  276. package/src/sap/fe/core/messagebundle_ko.properties +20 -3
  277. package/src/sap/fe/core/messagebundle_lt.properties +20 -3
  278. package/src/sap/fe/core/messagebundle_lv.properties +20 -3
  279. package/src/sap/fe/core/messagebundle_ms.properties +20 -3
  280. package/src/sap/fe/core/messagebundle_nl.properties +20 -3
  281. package/src/sap/fe/core/messagebundle_no.properties +20 -3
  282. package/src/sap/fe/core/messagebundle_pl.properties +21 -4
  283. package/src/sap/fe/core/messagebundle_pt.properties +20 -3
  284. package/src/sap/fe/core/messagebundle_pt_PT.properties +20 -3
  285. package/src/sap/fe/core/messagebundle_ro.properties +20 -3
  286. package/src/sap/fe/core/messagebundle_ru.properties +20 -3
  287. package/src/sap/fe/core/messagebundle_sh.properties +20 -3
  288. package/src/sap/fe/core/messagebundle_sk.properties +20 -3
  289. package/src/sap/fe/core/messagebundle_sl.properties +26 -9
  290. package/src/sap/fe/core/messagebundle_sv.properties +20 -3
  291. package/src/sap/fe/core/messagebundle_th.properties +21 -4
  292. package/src/sap/fe/core/messagebundle_tr.properties +20 -3
  293. package/src/sap/fe/core/messagebundle_uk.properties +23 -6
  294. package/src/sap/fe/core/messagebundle_vi.properties +20 -3
  295. package/src/sap/fe/core/messagebundle_zh_CN.properties +20 -3
  296. package/src/sap/fe/core/messagebundle_zh_TW.properties +20 -3
  297. package/src/sap/fe/core/operationsHelper.js +74 -101
  298. package/src/sap/fe/core/operationsHelper.ts +113 -44
  299. package/src/sap/fe/core/rootView/Fcl.controller.js +151 -228
  300. package/src/sap/fe/core/rootView/Fcl.controller.ts +90 -15
  301. package/src/sap/fe/core/rootView/Fcl.view.xml +1 -8
  302. package/src/sap/fe/core/rootView/NavContainer.controller.js +41 -78
  303. package/src/sap/fe/core/rootView/NavContainer.controller.ts +32 -38
  304. package/src/sap/fe/core/rootView/RootViewBaseController.js +110 -181
  305. package/src/sap/fe/core/rootView/RootViewBaseController.ts +37 -17
  306. package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +1 -18
  307. package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +13 -52
  308. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +1 -22
  309. package/src/sap/fe/core/services/NavigationServiceFactory.js +45 -87
  310. package/src/sap/fe/core/services/NavigationServiceFactory.ts +17 -10
  311. package/src/sap/fe/core/services/ResourceModelServiceFactory.js +4 -28
  312. package/src/sap/fe/core/services/RoutingServiceFactory.js +92 -250
  313. package/src/sap/fe/core/services/RoutingServiceFactory.ts +8 -12
  314. package/src/sap/fe/core/services/ShellServicesFactory.js +122 -251
  315. package/src/sap/fe/core/services/ShellServicesFactory.ts +19 -4
  316. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +188 -273
  317. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +143 -154
  318. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +37 -135
  319. package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +59 -94
  320. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +2 -16
  321. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.ts +1 -1
  322. package/src/sap/fe/core/support/AnnotationIssue.support.js +6 -9
  323. package/src/sap/fe/core/support/AnnotationIssue.support.ts +4 -4
  324. package/src/sap/fe/core/support/CollectionFacetMissingID.support.js +6 -9
  325. package/src/sap/fe/core/support/CollectionFacetMissingID.support.ts +3 -3
  326. package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.js +6 -9
  327. package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.ts +3 -3
  328. package/src/sap/fe/core/support/CommonHelper.js +7 -16
  329. package/src/sap/fe/core/support/Diagnostics.js +1 -10
  330. package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.js +6 -9
  331. package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.ts +3 -3
  332. package/src/sap/fe/core/templating/CommonFormatters.js +1 -15
  333. package/src/sap/fe/core/templating/CriticalityFormatters.js +4 -20
  334. package/src/sap/fe/core/templating/DataFieldFormatters.js +1 -20
  335. package/src/sap/fe/core/templating/DataModelPathHelper.js +49 -121
  336. package/src/sap/fe/core/templating/DataModelPathHelper.ts +41 -31
  337. package/src/sap/fe/core/templating/DisplayModeFormatter.js +8 -15
  338. package/src/sap/fe/core/templating/DisplayModeFormatter.ts +7 -7
  339. package/src/sap/fe/core/templating/EntitySetHelper.js +6 -31
  340. package/src/sap/fe/core/templating/FieldControlHelper.js +4 -21
  341. package/src/sap/fe/core/templating/FieldControlHelper.ts +1 -1
  342. package/src/sap/fe/core/templating/FilterHelper.js +40 -111
  343. package/src/sap/fe/core/templating/FilterHelper.ts +20 -16
  344. package/src/sap/fe/core/templating/FilterTemplating.js +1 -19
  345. package/src/sap/fe/core/templating/FilterTemplating.ts +1 -1
  346. package/src/sap/fe/core/templating/PropertyFormatters.js +1 -34
  347. package/src/sap/fe/core/templating/PropertyHelper.js +120 -163
  348. package/src/sap/fe/core/templating/PropertyHelper.ts +69 -33
  349. package/src/sap/fe/core/templating/SemanticObjectHelper.js +46 -0
  350. package/src/sap/fe/core/templating/SemanticObjectHelper.ts +34 -0
  351. package/src/sap/fe/core/templating/UIFormatters.js +40 -180
  352. package/src/sap/fe/core/templating/UIFormatters.ts +37 -43
  353. package/src/sap/fe/core/type/DateTimeWithTimezone.js +3 -14
  354. package/src/sap/fe/core/type/Email.js +1 -10
  355. package/src/sap/fe/core/type/TypeUtil.js +1 -11
  356. package/ui5.yaml +0 -1
  357. package/src/sap/fe/core/controls/ActionParameterDialogFieldValueHelp.fragment.xml +0 -35
  358. package/src/sap/fe/core/helpers/LRMessageStrip.js +0 -234
  359. package/src/sap/fe/core/helpers/LRMessageStrip.ts +0 -216
@@ -18,24 +18,20 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
18
18
  // Called for
19
19
  // 1. Out Parameters.
20
20
  // 2. Transient context property change.
21
+
21
22
  var source = Core.byId(mdcFieldId);
22
23
  var transCtx = source && source.getBindingContext();
23
24
  var fieldInfoModel = source && source.getModel("fieldsInfo");
24
25
  var values = fieldInfoModel.getProperty("/values/".concat(dataProperty)) || fieldInfoModel.getProperty("/unitData/".concat(dataProperty)) || [];
25
-
26
26
  if (transCtx && (values.inputType === "InputWithValueHelp" || values.inputType === "InputWithUnit") && !values.valueListInfo) {
27
27
  MassEditHandlers._setValueListInfo(transCtx, source, fieldInfoModel, dataProperty);
28
28
  }
29
-
30
29
  var isDialogOpen = fieldInfoModel && fieldInfoModel.getProperty("/isOpen");
31
-
32
30
  if (!isDialogOpen || !source.getVisible()) {
33
31
  return;
34
32
  }
35
-
36
33
  MassEditHandlers._updateSelectKey(source, dataProperty, newValue);
37
34
  },
38
-
39
35
  /**
40
36
  * Called for change in the MDC field.
41
37
  * This is called on selection done through VHD.
@@ -48,19 +44,17 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
48
44
  handleMDCFieldChange: function (event, propertyName) {
49
45
  // Called for
50
46
  // 1. VHD property change.
47
+
51
48
  var source = event && event.getSource();
52
49
  var changePromise = event && event.getParameter("promise");
53
50
  var comboBox = source.getContent();
54
-
55
51
  if (!comboBox || !propertyName) {
56
52
  return;
57
53
  }
58
-
59
54
  changePromise.then(MassEditHandlers._updateSelectKeyForMDCFieldChange.bind(MassEditHandlers, source, propertyName)).catch(function (err) {
60
55
  Log.warning("VHD selection couldn't be populated in the mass edit field.".concat(err));
61
56
  });
62
57
  },
63
-
64
58
  /**
65
59
  * Called for selection change through the drop down.
66
60
  *
@@ -71,31 +65,24 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
71
65
  // Called for Manual selection from dropdown(comboBox or select)
72
66
  // 1. VHD select.
73
67
  // 2. Any value change in the control.
68
+
74
69
  var source = event && event.getSource();
75
70
  var key = source.getSelectedKey();
76
71
  var params = source && key && key.split("/");
77
72
  var propertyName;
78
-
79
73
  if (params[0] === "UseValueHelpValue") {
80
74
  var prevItem = event.getParameter("previousSelectedItem");
81
75
  var selectKey = prevItem.getKey();
82
76
  propertyName = params.slice(1).join("/");
83
-
84
77
  MassEditHandlers._onVHSelect(source, propertyName, selectKey);
85
-
86
78
  return;
87
79
  }
88
-
89
80
  var fieldInfoModel = source && source.getModel("fieldsInfo");
90
81
  propertyName = MassEditHandlers._getPropertyNameFromKey(key);
91
-
92
82
  MassEditHandlers._updateSuggestionForFieldsWithInParameters(fieldInfoModel, propertyName, key.startsWith("Default/") || key.startsWith("ClearFieldValue/"), true);
93
-
94
83
  MassEditHandlers._updateSuggestionForFieldsWithOutParameters(fieldInfoModel, propertyName, key.startsWith("Default/") || key.startsWith("ClearFieldValue/"), false);
95
-
96
84
  MassEditHandlers._updateResults(source, params, true);
97
85
  },
98
-
99
86
  /**
100
87
  * Update selections to results and the suggests in drop downs.
101
88
  *
@@ -108,20 +95,14 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
108
95
  var transCtx = source && source.getBindingContext();
109
96
  var fieldInfoModel = source && source.getModel("fieldsInfo");
110
97
  var values = fieldInfoModel.getProperty("/values/".concat(propertyName)) || fieldInfoModel.getProperty("/unitData/".concat(propertyName)) || [];
111
-
112
98
  if (transCtx && (values.inputType === "InputWithValueHelp" || values.inputType === "InputWithUnit") && !values.valueListInfo) {
113
99
  MassEditHandlers._setValueListInfo(transCtx, source, fieldInfoModel, propertyName);
114
100
  }
115
-
116
101
  MassEditHandlers._updateSuggestionForFieldsWithOutParameters(fieldInfoModel, propertyName, false, true);
117
-
118
102
  MassEditHandlers._updateSuggestionForFieldsWithInParameters(fieldInfoModel, propertyName, false, true);
119
-
120
103
  var formattedValue = source.getFormFormattedValue();
121
-
122
104
  MassEditHandlers._updateSelectKey(source, propertyName, value, formattedValue);
123
105
  },
124
-
125
106
  /**
126
107
  * Update suggests for all drop downs with InParameter as the propertyName.
127
108
  *
@@ -139,7 +120,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
139
120
  fieldPaths.forEach(MassEditHandlers._updateInParameterSuggetions.bind(MassEditHandlers, fieldInfoModel, "/values/", propertyName, resetValues, keepExistingSelection));
140
121
  unitFieldPaths.forEach(MassEditHandlers._updateInParameterSuggetions.bind(MassEditHandlers, fieldInfoModel, "/unitData/", propertyName, resetValues, keepExistingSelection));
141
122
  },
142
-
143
123
  /**
144
124
  * Update suggests for a drop down with InParameter as the srcPropertyName.
145
125
  *
@@ -153,16 +133,13 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
153
133
  */
154
134
  _updateInParameterSuggetions: function (fieldInfoModel, pathPrefix, srcPropertyName, resetValues, keepExistingSelection, propertyName) {
155
135
  var valueListInfo = fieldInfoModel.getProperty("".concat(pathPrefix + propertyName, "/valueListInfo"));
156
-
157
136
  if (valueListInfo && srcPropertyName != propertyName) {
158
137
  var inParameters = valueListInfo.inParameters;
159
-
160
138
  if (inParameters && inParameters.length > 0 && inParameters.includes(srcPropertyName)) {
161
139
  MassEditHandlers._updateFieldPathSuggestions(fieldInfoModel, pathPrefix + propertyName, resetValues, keepExistingSelection);
162
140
  }
163
141
  }
164
142
  },
165
-
166
143
  /**
167
144
  * Update suggests for all OutParameter's drop downs of the propertyName.
168
145
  *
@@ -174,22 +151,17 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
174
151
  */
175
152
  _updateSuggestionForFieldsWithOutParameters: function (fieldInfoModel, propertyName, resetValues, keepExistingSelection) {
176
153
  var valueListInfo = fieldInfoModel.getProperty("/values/".concat(propertyName, "/valueListInfo")) || fieldInfoModel.getProperty("/unitData/".concat(propertyName, "/valueListInfo"));
177
-
178
154
  if (valueListInfo && valueListInfo.outParameters) {
179
155
  var outParameters = valueListInfo.outParameters;
180
-
181
156
  if (outParameters.length && outParameters.length > 0) {
182
157
  MassEditHandlers._updateOutParameterSuggetions(outParameters, fieldInfoModel, resetValues, keepExistingSelection);
183
-
184
158
  var pathPrefix = fieldInfoModel.getProperty("/values/".concat(propertyName)) && "/values/".concat(propertyName) || fieldInfoModel.getProperty("/unitData/".concat(propertyName)) && "/unitData/".concat(propertyName);
185
-
186
159
  if (pathPrefix) {
187
160
  MassEditHandlers._updateFieldPathSuggestions(fieldInfoModel, pathPrefix, false, true);
188
161
  }
189
162
  }
190
163
  }
191
164
  },
192
-
193
165
  /**
194
166
  * Update suggests for a drop down with InParameter as the srcPropertyName.
195
167
  *
@@ -212,7 +184,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
212
184
  }
213
185
  });
214
186
  },
215
-
216
187
  /**
217
188
  * Update suggests for a drop down of a field.
218
189
  *
@@ -229,7 +200,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
229
200
  var existingSelection = keepExistingSelection && options.find(function (option) {
230
201
  return option.key === selectedKey;
231
202
  });
232
-
233
203
  if (resetValues) {
234
204
  var selectOptions = options.selectOptions;
235
205
  options.length = 0;
@@ -245,15 +215,12 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
245
215
  return options.push(defaultOption);
246
216
  });
247
217
  }
248
-
249
218
  fieldInfoModel.setProperty(fieldPathAbsolute, options);
250
-
251
219
  if (existingSelection && !options.includes(existingSelection)) {
252
220
  options.push(existingSelection);
253
221
  fieldInfoModel.setProperty("".concat(fieldPathAbsolute, "/selectedKey"), selectedKey);
254
222
  }
255
223
  },
256
-
257
224
  /**
258
225
  * Update In and Out Parameters in the MED.
259
226
  *
@@ -265,18 +232,14 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
265
232
  */
266
233
  _setValueListInfo: function (transCtx, source, fieldInfoModel, propertyName) {
267
234
  var propPath = fieldInfoModel.getProperty("/values/".concat(propertyName)) && "/values/" || fieldInfoModel.getProperty("/unitData/".concat(propertyName)) && "/unitData/";
268
-
269
235
  if (fieldInfoModel.getProperty("".concat(propPath).concat(propertyName, "/valueListInfo"))) {
270
236
  return;
271
237
  }
272
-
273
238
  var valueListInfo = fieldInfoModel.getProperty("".concat(propPath).concat(propertyName, "/valueListInfo"));
274
-
275
239
  if (!valueListInfo) {
276
240
  MassEditHandlers._requestValueList(transCtx, source, fieldInfoModel, propertyName);
277
241
  }
278
242
  },
279
-
280
243
  /**
281
244
  * Request and update In and Out Parameters in the MED.
282
245
  *
@@ -288,7 +251,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
288
251
  */
289
252
  _requestValueList: function (transCtx, source, fieldInfoModel, propertyName) {
290
253
  var _fieldValueHelp$getDe;
291
-
292
254
  var metaPath = ModelHelper.getMetaPathForContext(transCtx);
293
255
  var propertyPath = metaPath && "".concat(metaPath, "/").concat(propertyName);
294
256
  var dependents = source === null || source === void 0 ? void 0 : source.getDependents();
@@ -297,11 +259,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
297
259
  return dependent.getId() === fieldHelp;
298
260
  });
299
261
  var payload = (_fieldValueHelp$getDe = fieldValueHelp.getDelegate()) === null || _fieldValueHelp$getDe === void 0 ? void 0 : _fieldValueHelp$getDe.payload;
300
-
301
262
  if (!(fieldValueHelp !== null && fieldValueHelp !== void 0 && fieldValueHelp.getBindingContext())) {
302
263
  fieldValueHelp === null || fieldValueHelp === void 0 ? void 0 : fieldValueHelp.setBindingContext(transCtx);
303
264
  }
304
-
305
265
  var metaModel = transCtx.getModel().getMetaModel();
306
266
  ValueListHelper.createVHUIModel(fieldValueHelp, propertyPath, metaModel);
307
267
  var valueListInfo = ValueListHelper.getValueListInfo(fieldValueHelp, propertyPath, payload);
@@ -317,7 +277,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
317
277
  })
318
278
  };
319
279
  fieldInfoModel.setProperty("".concat(propPath).concat(propertyName, "/valueListInfo"), info);
320
-
321
280
  if (info.outParameters.length > 0) {
322
281
  MassEditHandlers._updateFieldPathSuggestions(fieldInfoModel, "/values/".concat(propertyName), false, true);
323
282
  }
@@ -325,7 +284,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
325
284
  Log.warning("Mass Edit: Couldn't load valueList info for ".concat(propertyPath));
326
285
  });
327
286
  },
328
-
329
287
  /**
330
288
  * Get field help control from MDC field.
331
289
  *
@@ -341,7 +299,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
341
299
  return dependent.getId() === fieldHelp;
342
300
  });
343
301
  },
344
-
345
302
  /**
346
303
  * Colled on drop down selection of VHD option.
347
304
  *
@@ -353,20 +310,17 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
353
310
  _onVHSelect: function (source, propertyName, selectKey) {
354
311
  // Called for
355
312
  // 1. VHD selected.
313
+
356
314
  var fieldInfoModel = source && source.getModel("fieldsInfo");
357
315
  var propPath = fieldInfoModel.getProperty("/values/".concat(propertyName)) && "/values/" || fieldInfoModel.getProperty("/unitData/".concat(propertyName)) && "/unitData/";
358
316
  var transCtx = source.getBindingContext();
359
-
360
317
  var fieldValueHelp = MassEditHandlers._getValueHelp(transCtx, source.getParent());
361
-
362
318
  if (!(fieldValueHelp !== null && fieldValueHelp !== void 0 && fieldValueHelp.getBindingContext())) {
363
319
  fieldValueHelp === null || fieldValueHelp === void 0 ? void 0 : fieldValueHelp.setBindingContext(transCtx);
364
320
  }
365
-
366
321
  source.fireValueHelpRequest();
367
322
  fieldInfoModel.setProperty("".concat(propPath + propertyName, "/selectedKey"), selectKey);
368
323
  },
369
-
370
324
  /**
371
325
  * Gets Property name from selection key.
372
326
  *
@@ -376,16 +330,13 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
376
330
  */
377
331
  _getPropertyNameFromKey: function (key) {
378
332
  var propertyName = "";
379
-
380
333
  if (key.startsWith("Default/") || key.startsWith("ClearFieldValue/") || key.startsWith("UseValueHelpValue/")) {
381
334
  propertyName = key.substring(key.indexOf("/") + 1);
382
335
  } else {
383
336
  propertyName = key.substring(0, key.lastIndexOf("/"));
384
337
  }
385
-
386
338
  return propertyName;
387
339
  },
388
-
389
340
  /**
390
341
  * Update selection to Custom Mass Edit Select from MDC field.
391
342
  *
@@ -400,28 +351,23 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
400
351
  // 1. VHD property change
401
352
  // 2. Out Parameters.
402
353
  // 3. Transient context property change.
403
- var comboBox = source.getContent();
404
354
 
355
+ var comboBox = source.getContent();
405
356
  if (!comboBox || !propertyName) {
406
357
  return;
407
358
  }
408
-
409
359
  var key = comboBox.getSelectedKey();
410
-
411
360
  if ((key.startsWith("Default/") || key.startsWith("ClearFieldValue/")) && !value) {
412
361
  return;
413
362
  }
414
-
415
363
  var formattedText = MassEditHandlers._valueExists(fullText) ? fullText : value;
416
364
  var fieldInfoModel = source && source.getModel("fieldsInfo");
417
365
  var values = fieldInfoModel.getProperty("/values/".concat(propertyName)) || fieldInfoModel.getProperty("/unitData/".concat(propertyName)) || [];
418
366
  var propPath = fieldInfoModel.getProperty("/values/".concat(propertyName)) && "/values/" || fieldInfoModel.getProperty("/unitData/".concat(propertyName)) && "/unitData/";
419
367
  var relatedField = values.find(function (fieldData) {
420
368
  var _fieldData$textInfo;
421
-
422
369
  return (fieldData === null || fieldData === void 0 ? void 0 : (_fieldData$textInfo = fieldData.textInfo) === null || _fieldData$textInfo === void 0 ? void 0 : _fieldData$textInfo.value) === value || fieldData.text === value;
423
370
  });
424
-
425
371
  if (relatedField) {
426
372
  if (fullText && relatedField.textInfo && relatedField.textInfo.descriptionPath && (relatedField.text != formattedText || relatedField.textInfo.fullText != formattedText)) {
427
373
  // Update the full text only when provided.
@@ -429,12 +375,10 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
429
375
  relatedField.textInfo.fullText = formattedText;
430
376
  relatedField.textInfo.description = source.getAdditionalValue();
431
377
  }
432
-
433
378
  if (relatedField.key === key) {
434
379
  fieldInfoModel.setProperty("".concat(propPath + propertyName, "/selectedKey"), key);
435
380
  return;
436
381
  }
437
-
438
382
  key = relatedField.key;
439
383
  } else if ([undefined, null, ""].indexOf(value) === -1) {
440
384
  key = "".concat(propertyName, "/").concat(value);
@@ -457,12 +401,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
457
401
  } else {
458
402
  key = "Default/".concat(propertyName);
459
403
  }
460
-
461
404
  fieldInfoModel.setProperty("".concat(propPath + propertyName, "/selectedKey"), key);
462
-
463
405
  MassEditHandlers._updateResults(comboBox);
464
406
  },
465
-
466
407
  /**
467
408
  * Get Value from Drop down.
468
409
  *
@@ -472,13 +413,11 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
472
413
  */
473
414
  _getValue: function (source) {
474
415
  var _getSelectedItem;
475
-
476
416
  return source.getMetadata().getName() === "sap.fe.core.controls.MassEditSelect" ? (_getSelectedItem = source.getSelectedItem()) === null || _getSelectedItem === void 0 ? void 0 : _getSelectedItem.getText() : source.getValue();
477
417
  },
478
418
  _getValueOnEmpty: function (oSource, fieldsInfoModel, value, sPropertyName) {
479
419
  if (!value) {
480
420
  var values = fieldsInfoModel.getProperty("/values/".concat(sPropertyName)) || fieldsInfoModel.getProperty("/unitData/".concat(sPropertyName)) || [];
481
-
482
421
  if (values.unitProperty) {
483
422
  value = 0;
484
423
  oSource.setValue(value);
@@ -486,13 +425,11 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
486
425
  value = false;
487
426
  }
488
427
  }
489
-
490
428
  return value;
491
429
  },
492
430
  _valueExists: function (value) {
493
431
  return value != undefined && value != null;
494
432
  },
495
-
496
433
  /**
497
434
  * Updates selections to runtime model.
498
435
  *
@@ -510,13 +447,10 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
510
447
  // 3. transient context property change.
511
448
  var fieldsInfoModel = oSource && oSource.getModel("fieldsInfo");
512
449
  var oFieldsInfoData = fieldsInfoModel && fieldsInfoModel.getData();
513
-
514
450
  var value = MassEditHandlers._getValue(oSource);
515
-
516
451
  aParams = aParams.length > 0 ? aParams : oSource && oSource.getSelectedKey() && oSource.getSelectedKey().split("/");
517
452
  var oDataObject;
518
453
  var sPropertyName = oSource.data("fieldPath");
519
-
520
454
  if (aParams[0] === "Default") {
521
455
  oDataObject = {
522
456
  keyValue: aParams[1],
@@ -540,7 +474,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
540
474
  var propertyValues = fieldsInfoModel.getProperty("/values/".concat(propertyName)) || fieldsInfoModel.getProperty("/unitData/".concat(propertyName)) || [];
541
475
  var relatedField = (propertyValues || []).find(function (oFieldData) {
542
476
  var _oFieldData$textInfo;
543
-
544
477
  return (oFieldData === null || oFieldData === void 0 ? void 0 : (_oFieldData$textInfo = oFieldData.textInfo) === null || _oFieldData$textInfo === void 0 ? void 0 : _oFieldData$textInfo.value) === value || oFieldData.text === value;
545
478
  });
546
479
  oDataObject = {
@@ -548,24 +481,19 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
548
481
  value: relatedField.textInfo && MassEditHandlers._valueExists(relatedField.textInfo.value) ? relatedField.textInfo.value : relatedField.text
549
482
  };
550
483
  }
551
-
552
484
  var bExistingElementindex = -1;
553
-
554
485
  for (var i = 0; i < oFieldsInfoData.results.length; i++) {
555
486
  if (oFieldsInfoData.results[i].keyValue === oDataObject.keyValue) {
556
487
  bExistingElementindex = i;
557
488
  }
558
489
  }
559
-
560
490
  if (bExistingElementindex !== -1) {
561
491
  oFieldsInfoData.results[bExistingElementindex] = oDataObject;
562
492
  } else {
563
493
  oFieldsInfoData.results.push(oDataObject);
564
494
  }
565
-
566
495
  if (updateTransCtx && !oDataObject.keyValue.includes("/")) {
567
496
  var transCtx = oSource.getBindingContext();
568
-
569
497
  if (aParams[0] === "Default" || aParams[0] === "ClearFieldValue") {
570
498
  transCtx.setProperty(oDataObject.keyValue, null);
571
499
  } else if (oDataObject) {
@@ -576,4 +504,4 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
576
504
  };
577
505
  return MassEditHandlers;
578
506
  }, false);
579
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJNYXNzRWRpdEhhbmRsZXJzIiwiY29udGV4dFByb3BlcnR5Q2hhbmdlIiwibmV3VmFsdWUiLCJkYXRhUHJvcGVydHkiLCJtZGNGaWVsZElkIiwic291cmNlIiwiQ29yZSIsImJ5SWQiLCJ0cmFuc0N0eCIsImdldEJpbmRpbmdDb250ZXh0IiwiZmllbGRJbmZvTW9kZWwiLCJnZXRNb2RlbCIsInZhbHVlcyIsImdldFByb3BlcnR5IiwiaW5wdXRUeXBlIiwidmFsdWVMaXN0SW5mbyIsIl9zZXRWYWx1ZUxpc3RJbmZvIiwiaXNEaWFsb2dPcGVuIiwiZ2V0VmlzaWJsZSIsIl91cGRhdGVTZWxlY3RLZXkiLCJoYW5kbGVNRENGaWVsZENoYW5nZSIsImV2ZW50IiwicHJvcGVydHlOYW1lIiwiZ2V0U291cmNlIiwiY2hhbmdlUHJvbWlzZSIsImdldFBhcmFtZXRlciIsImNvbWJvQm94IiwiZ2V0Q29udGVudCIsInRoZW4iLCJfdXBkYXRlU2VsZWN0S2V5Rm9yTURDRmllbGRDaGFuZ2UiLCJiaW5kIiwiY2F0Y2giLCJlcnIiLCJMb2ciLCJ3YXJuaW5nIiwiaGFuZGxlU2VsZWN0aW9uQ2hhbmdlIiwia2V5IiwiZ2V0U2VsZWN0ZWRLZXkiLCJwYXJhbXMiLCJzcGxpdCIsInByZXZJdGVtIiwic2VsZWN0S2V5IiwiZ2V0S2V5Iiwic2xpY2UiLCJqb2luIiwiX29uVkhTZWxlY3QiLCJfZ2V0UHJvcGVydHlOYW1lRnJvbUtleSIsIl91cGRhdGVTdWdnZXN0aW9uRm9yRmllbGRzV2l0aEluUGFyYW1ldGVycyIsInN0YXJ0c1dpdGgiLCJfdXBkYXRlU3VnZ2VzdGlvbkZvckZpZWxkc1dpdGhPdXRQYXJhbWV0ZXJzIiwiX3VwZGF0ZVJlc3VsdHMiLCJ2YWx1ZSIsImZvcm1hdHRlZFZhbHVlIiwiZ2V0Rm9ybUZvcm1hdHRlZFZhbHVlIiwicmVzZXRWYWx1ZXMiLCJrZWVwRXhpc3RpbmdTZWxlY3Rpb24iLCJ1bml0RGF0YSIsImZpZWxkUGF0aHMiLCJPYmplY3QiLCJrZXlzIiwidW5pdEZpZWxkUGF0aHMiLCJmb3JFYWNoIiwiX3VwZGF0ZUluUGFyYW1ldGVyU3VnZ2V0aW9ucyIsInBhdGhQcmVmaXgiLCJzcmNQcm9wZXJ0eU5hbWUiLCJpblBhcmFtZXRlcnMiLCJsZW5ndGgiLCJpbmNsdWRlcyIsIl91cGRhdGVGaWVsZFBhdGhTdWdnZXN0aW9ucyIsIm91dFBhcmFtZXRlcnMiLCJfdXBkYXRlT3V0UGFyYW1ldGVyU3VnZ2V0aW9ucyIsIm91dFBhcmFtZXRlciIsImZpZWxkUGF0aEFic29sdXRlIiwib3B0aW9ucyIsImRlZmF1bHRPcHRpb25zIiwic2VsZWN0ZWRLZXkiLCJleGlzdGluZ1NlbGVjdGlvbiIsImZpbmQiLCJvcHRpb24iLCJzZWxlY3RPcHRpb25zIiwiZGVmYXVsdE9wdGlvbiIsInB1c2giLCJzZWxlY3RPcHRpb24iLCJzZXRQcm9wZXJ0eSIsInByb3BQYXRoIiwiX3JlcXVlc3RWYWx1ZUxpc3QiLCJtZXRhUGF0aCIsIk1vZGVsSGVscGVyIiwiZ2V0TWV0YVBhdGhGb3JDb250ZXh0IiwicHJvcGVydHlQYXRoIiwiZGVwZW5kZW50cyIsImdldERlcGVuZGVudHMiLCJmaWVsZEhlbHAiLCJnZXRGaWVsZEhlbHAiLCJmaWVsZFZhbHVlSGVscCIsImRlcGVuZGVudCIsImdldElkIiwicGF5bG9hZCIsImdldERlbGVnYXRlIiwic2V0QmluZGluZ0NvbnRleHQiLCJtZXRhTW9kZWwiLCJnZXRNZXRhTW9kZWwiLCJWYWx1ZUxpc3RIZWxwZXIiLCJjcmVhdGVWSFVJTW9kZWwiLCJnZXRWYWx1ZUxpc3RJbmZvIiwidkxpbmZvcyIsInZMaW5mbyIsImluZm8iLCJ2aFBhcmFtZXRlcnMiLCJnZXRJblBhcmFtZXRlcnMiLCJtYXAiLCJpblBhcmFtIiwiaGVscFBhdGgiLCJnZXRPdXRQYXJhbWV0ZXJzIiwib3V0UGFyYW0iLCJfZ2V0VmFsdWVIZWxwIiwiZ2V0UGFyZW50IiwiZmlyZVZhbHVlSGVscFJlcXVlc3QiLCJzdWJzdHJpbmciLCJpbmRleE9mIiwibGFzdEluZGV4T2YiLCJmdWxsVGV4dCIsImZvcm1hdHRlZFRleHQiLCJfdmFsdWVFeGlzdHMiLCJyZWxhdGVkRmllbGQiLCJmaWVsZERhdGEiLCJ0ZXh0SW5mbyIsInRleHQiLCJkZXNjcmlwdGlvblBhdGgiLCJkZXNjcmlwdGlvbiIsImdldEFkZGl0aW9uYWxWYWx1ZSIsInVuZGVmaW5lZCIsInNlbGVjdGlvbkluZm8iLCJ0ZXh0QXJyYW5nZW1lbnQiLCJnZXREaXNwbGF5IiwiZ2V0VmFsdWUiLCJ2YWx1ZVBhdGgiLCJfZ2V0VmFsdWUiLCJnZXRNZXRhZGF0YSIsImdldE5hbWUiLCJnZXRTZWxlY3RlZEl0ZW0iLCJnZXRUZXh0IiwiX2dldFZhbHVlT25FbXB0eSIsIm9Tb3VyY2UiLCJmaWVsZHNJbmZvTW9kZWwiLCJzUHJvcGVydHlOYW1lIiwidW5pdFByb3BlcnR5Iiwic2V0VmFsdWUiLCJhUGFyYW1zIiwidXBkYXRlVHJhbnNDdHgiLCJvRmllbGRzSW5mb0RhdGEiLCJnZXREYXRhIiwib0RhdGFPYmplY3QiLCJkYXRhIiwia2V5VmFsdWUiLCJwcm9wZXJ0eVZhbHVlcyIsIm9GaWVsZERhdGEiLCJiRXhpc3RpbmdFbGVtZW50aW5kZXgiLCJpIiwicmVzdWx0cyJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiTWFzc0VkaXRIYW5kbGVycy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvbnN0cnVjdG9yIGZvciBhIG5ldyBWaXN1YWwgRmlsdGVyIENvbnRhaW5lci5cbiAqIFVzZWQgZm9yIHZpc3VhbCBmaWx0ZXJzXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFtzSWRdIElEIGZvciB0aGUgbmV3IGNvbnRyb2wsIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGlmIG5vIElEIGlzIGdpdmVuXG4gKiBAZXh0ZW5kcyBzYXAudWkubWRjLmZpbHRlcmJhci5JRmlsdGVyQ29udGFpbmVyXG4gKiBAY2xhc3NcbiAqIEBwcml2YXRlXG4gKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbHMuZmlsdGVyYmFyLlZpc3VhbEZpbHRlckNvbnRhaW5lclxuICovXG5pbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCBNb2RlbEhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0IFZhbHVlTGlzdEhlbHBlciwgeyBWYWx1ZUhlbHBQYXlsb2FkLCBWYWx1ZUxpc3RJbmZvIH0gZnJvbSBcInNhcC9mZS9tYWNyb3MvaW50ZXJuYWwvdmFsdWVoZWxwL1ZhbHVlTGlzdEhlbHBlck5ld1wiO1xuaW1wb3J0IHR5cGUgQ29tYm9Cb3ggZnJvbSBcInNhcC9tL0NvbWJvQm94XCI7XG5pbXBvcnQgdHlwZSBTZWxlY3QgZnJvbSBcInNhcC9tL1NlbGVjdFwiO1xuaW1wb3J0IHR5cGUgQ29udHJvbCBmcm9tIFwic2FwL3VpL2NvcmUvQ29udHJvbFwiO1xuaW1wb3J0IENvcmUgZnJvbSBcInNhcC91aS9jb3JlL0NvcmVcIjtcbmltcG9ydCB0eXBlIEZpZWxkIGZyb20gXCJzYXAvdWkvbWRjL0ZpZWxkXCI7XG5pbXBvcnQgVmFsdWVIZWxwIGZyb20gXCJzYXAvdWkvbWRjL1ZhbHVlSGVscFwiO1xuaW1wb3J0IHR5cGUgSlNPTk1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvanNvbi9KU09OTW9kZWxcIjtcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgT0RhdGFNZXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1ldGFNb2RlbFwiO1xuXG5jb25zdCBNYXNzRWRpdEhhbmRsZXJzOiBhbnkgPSB7XG5cdC8qKlxuXHQgKiBDYWxsZWQgZm9yIHByb3BlcnR5IGNoYW5nZSBpbiB0aGUgdHJhbnNpZW50IGNvbnRleHQuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAcGFyYW0gbmV3VmFsdWUgTmV3IHZhbHVlIG9mIHRoZSBwcm9wZXJ0eS5cblx0ICogQHBhcmFtIGRhdGFQcm9wZXJ0eSBGaW5hbCBjb250ZXh0IHJldHVybmVkIGFmdGVyIHRoZSBwYWdpbmF0b3IgYWN0aW9uXG5cdCAqIEBwYXJhbSBtZGNGaWVsZElkIEZpbmFsIGNvbnRleHQgcmV0dXJuZWQgYWZ0ZXIgdGhlIHBhZ2luYXRvciBhY3Rpb25cblx0ICovXG5cdGNvbnRleHRQcm9wZXJ0eUNoYW5nZTogZnVuY3Rpb24gKG5ld1ZhbHVlOiBhbnksIGRhdGFQcm9wZXJ0eTogc3RyaW5nLCBtZGNGaWVsZElkOiBzdHJpbmcpIHtcblx0XHQvLyBDYWxsZWQgZm9yXG5cdFx0Ly8gMS4gT3V0IFBhcmFtZXRlcnMuXG5cdFx0Ly8gMi4gVHJhbnNpZW50IGNvbnRleHQgcHJvcGVydHkgY2hhbmdlLlxuXG5cdFx0Y29uc3Qgc291cmNlID0gQ29yZS5ieUlkKG1kY0ZpZWxkSWQpIGFzIEZpZWxkO1xuXHRcdGNvbnN0IHRyYW5zQ3R4ID0gc291cmNlICYmIChzb3VyY2UuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBDb250ZXh0KTtcblx0XHRjb25zdCBmaWVsZEluZm9Nb2RlbCA9IHNvdXJjZSAmJiAoc291cmNlLmdldE1vZGVsKFwiZmllbGRzSW5mb1wiKSBhcyBKU09OTW9kZWwpO1xuXHRcdGNvbnN0IHZhbHVlcyA9XG5cdFx0XHRmaWVsZEluZm9Nb2RlbC5nZXRQcm9wZXJ0eShgL3ZhbHVlcy8ke2RhdGFQcm9wZXJ0eX1gKSB8fCBmaWVsZEluZm9Nb2RlbC5nZXRQcm9wZXJ0eShgL3VuaXREYXRhLyR7ZGF0YVByb3BlcnR5fWApIHx8IFtdO1xuXG5cdFx0aWYgKHRyYW5zQ3R4ICYmICh2YWx1ZXMuaW5wdXRUeXBlID09PSBcIklucHV0V2l0aFZhbHVlSGVscFwiIHx8IHZhbHVlcy5pbnB1dFR5cGUgPT09IFwiSW5wdXRXaXRoVW5pdFwiKSAmJiAhdmFsdWVzLnZhbHVlTGlzdEluZm8pIHtcblx0XHRcdE1hc3NFZGl0SGFuZGxlcnMuX3NldFZhbHVlTGlzdEluZm8odHJhbnNDdHgsIHNvdXJjZSwgZmllbGRJbmZvTW9kZWwsIGRhdGFQcm9wZXJ0eSk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgaXNEaWFsb2dPcGVuID0gZmllbGRJbmZvTW9kZWwgJiYgZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoXCIvaXNPcGVuXCIpO1xuXHRcdGlmICghaXNEaWFsb2dPcGVuIHx8ICFzb3VyY2UuZ2V0VmlzaWJsZSgpKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0TWFzc0VkaXRIYW5kbGVycy5fdXBkYXRlU2VsZWN0S2V5KHNvdXJjZSwgZGF0YVByb3BlcnR5LCBuZXdWYWx1ZSk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIENhbGxlZCBmb3IgY2hhbmdlIGluIHRoZSBNREMgZmllbGQuXG5cdCAqIFRoaXMgaXMgY2FsbGVkIG9uIHNlbGVjdGlvbiBkb25lIHRocm91Z2ggVkhELlxuXHQgKiBUaGlzIGlzIG5vdCBjYWxsZWQgb24gY2hhbmdlIG9mIHRoZSBkcm9wZG93biBhcyB3ZSBhcmUgdXNpbmcgYSBjdXN0b20gTWFzc0VkaXRTZWxlY3QgY29udHJvbCBhbmQgbm90IGdlbmVyYWwgU2VsZWN0LlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQHBhcmFtIGV2ZW50IEV2ZW50IG9iamVjdCBmb3IgY2hhbmdlLlxuXHQgKiBAcGFyYW0gcHJvcGVydHlOYW1lIFByb3BlcnR5IHBhdGguXG5cdCAqL1xuXHRoYW5kbGVNRENGaWVsZENoYW5nZTogZnVuY3Rpb24gKGV2ZW50OiBhbnksIHByb3BlcnR5TmFtZTogc3RyaW5nKSB7XG5cdFx0Ly8gQ2FsbGVkIGZvclxuXHRcdC8vIDEuIFZIRCBwcm9wZXJ0eSBjaGFuZ2UuXG5cblx0XHRjb25zdCBzb3VyY2UgPSBldmVudCAmJiBldmVudC5nZXRTb3VyY2UoKTtcblx0XHRjb25zdCBjaGFuZ2VQcm9taXNlID0gZXZlbnQgJiYgZXZlbnQuZ2V0UGFyYW1ldGVyKFwicHJvbWlzZVwiKTtcblx0XHRjb25zdCBjb21ib0JveCA9IHNvdXJjZS5nZXRDb250ZW50KCk7XG5cdFx0aWYgKCFjb21ib0JveCB8fCAhcHJvcGVydHlOYW1lKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y2hhbmdlUHJvbWlzZVxuXHRcdFx0LnRoZW4oTWFzc0VkaXRIYW5kbGVycy5fdXBkYXRlU2VsZWN0S2V5Rm9yTURDRmllbGRDaGFuZ2UuYmluZChNYXNzRWRpdEhhbmRsZXJzLCBzb3VyY2UsIHByb3BlcnR5TmFtZSkpXG5cdFx0XHQuY2F0Y2goKGVycjogYW55KSA9PiB7XG5cdFx0XHRcdExvZy53YXJuaW5nKGBWSEQgc2VsZWN0aW9uIGNvdWxkbid0IGJlIHBvcHVsYXRlZCBpbiB0aGUgbWFzcyBlZGl0IGZpZWxkLiR7ZXJyfWApO1xuXHRcdFx0fSk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIENhbGxlZCBmb3Igc2VsZWN0aW9uIGNoYW5nZSB0aHJvdWdoIHRoZSBkcm9wIGRvd24uXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAcGFyYW0gZXZlbnQgRXZlbnQgb2JqZWN0IGZvciBjaGFuZ2UuXG5cdCAqL1xuXHRoYW5kbGVTZWxlY3Rpb25DaGFuZ2U6IGZ1bmN0aW9uIChldmVudDogYW55KSB7XG5cdFx0Ly8gQ2FsbGVkIGZvciBNYW51YWwgc2VsZWN0aW9uIGZyb20gZHJvcGRvd24oY29tYm9Cb3ggb3Igc2VsZWN0KVxuXHRcdC8vIDEuIFZIRCBzZWxlY3QuXG5cdFx0Ly8gMi4gQW55IHZhbHVlIGNoYW5nZSBpbiB0aGUgY29udHJvbC5cblxuXHRcdGNvbnN0IHNvdXJjZSA9IGV2ZW50ICYmIGV2ZW50LmdldFNvdXJjZSgpO1xuXHRcdGNvbnN0IGtleSA9IHNvdXJjZS5nZXRTZWxlY3RlZEtleSgpIGFzIHN0cmluZztcblx0XHRjb25zdCBwYXJhbXMgPSBzb3VyY2UgJiYga2V5ICYmIGtleS5zcGxpdChcIi9cIik7XG5cdFx0bGV0IHByb3BlcnR5TmFtZTtcblxuXHRcdGlmIChwYXJhbXNbMF0gPT09IFwiVXNlVmFsdWVIZWxwVmFsdWVcIikge1xuXHRcdFx0Y29uc3QgcHJldkl0ZW0gPSBldmVudC5nZXRQYXJhbWV0ZXIoXCJwcmV2aW91c1NlbGVjdGVkSXRlbVwiKTtcblx0XHRcdGNvbnN0IHNlbGVjdEtleSA9IHByZXZJdGVtLmdldEtleSgpO1xuXHRcdFx0cHJvcGVydHlOYW1lID0gcGFyYW1zLnNsaWNlKDEpLmpvaW4oXCIvXCIpO1xuXHRcdFx0TWFzc0VkaXRIYW5kbGVycy5fb25WSFNlbGVjdChzb3VyY2UsIHByb3BlcnR5TmFtZSwgc2VsZWN0S2V5KTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCBmaWVsZEluZm9Nb2RlbCA9IHNvdXJjZSAmJiAoc291cmNlLmdldE1vZGVsKFwiZmllbGRzSW5mb1wiKSBhcyBKU09OTW9kZWwpO1xuXHRcdHByb3BlcnR5TmFtZSA9IE1hc3NFZGl0SGFuZGxlcnMuX2dldFByb3BlcnR5TmFtZUZyb21LZXkoa2V5KTtcblx0XHRNYXNzRWRpdEhhbmRsZXJzLl91cGRhdGVTdWdnZXN0aW9uRm9yRmllbGRzV2l0aEluUGFyYW1ldGVycyhcblx0XHRcdGZpZWxkSW5mb01vZGVsLFxuXHRcdFx0cHJvcGVydHlOYW1lLFxuXHRcdFx0a2V5LnN0YXJ0c1dpdGgoXCJEZWZhdWx0L1wiKSB8fCBrZXkuc3RhcnRzV2l0aChcIkNsZWFyRmllbGRWYWx1ZS9cIiksXG5cdFx0XHR0cnVlXG5cdFx0KTtcblx0XHRNYXNzRWRpdEhhbmRsZXJzLl91cGRhdGVTdWdnZXN0aW9uRm9yRmllbGRzV2l0aE91dFBhcmFtZXRlcnMoXG5cdFx0XHRmaWVsZEluZm9Nb2RlbCxcblx0XHRcdHByb3BlcnR5TmFtZSxcblx0XHRcdGtleS5zdGFydHNXaXRoKFwiRGVmYXVsdC9cIikgfHwga2V5LnN0YXJ0c1dpdGgoXCJDbGVhckZpZWxkVmFsdWUvXCIpLFxuXHRcdFx0ZmFsc2Vcblx0XHQpO1xuXHRcdE1hc3NFZGl0SGFuZGxlcnMuX3VwZGF0ZVJlc3VsdHMoc291cmNlLCBwYXJhbXMsIHRydWUpO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBVcGRhdGUgc2VsZWN0aW9ucyB0byByZXN1bHRzIGFuZCB0aGUgc3VnZ2VzdHMgaW4gZHJvcCBkb3ducy5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSBzb3VyY2UgTURDIGZpZWxkIHRoYXQgd2FzIGNoYW5nZWQuXG5cdCAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgUHJvcGVydHkgcGF0aC5cblx0ICogQHBhcmFtIHZhbHVlIE5ldyB2YWx1ZS5cblx0ICovXG5cdF91cGRhdGVTZWxlY3RLZXlGb3JNRENGaWVsZENoYW5nZTogZnVuY3Rpb24gKHNvdXJjZTogYW55LCBwcm9wZXJ0eU5hbWU6IHN0cmluZywgdmFsdWU6IGFueSk6IHZvaWQge1xuXHRcdGNvbnN0IHRyYW5zQ3R4ID0gc291cmNlICYmIHNvdXJjZS5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdGNvbnN0IGZpZWxkSW5mb01vZGVsID0gc291cmNlICYmIChzb3VyY2UuZ2V0TW9kZWwoXCJmaWVsZHNJbmZvXCIpIGFzIEpTT05Nb2RlbCk7XG5cdFx0Y29uc3QgdmFsdWVzID1cblx0XHRcdGZpZWxkSW5mb01vZGVsLmdldFByb3BlcnR5KGAvdmFsdWVzLyR7cHJvcGVydHlOYW1lfWApIHx8IGZpZWxkSW5mb01vZGVsLmdldFByb3BlcnR5KGAvdW5pdERhdGEvJHtwcm9wZXJ0eU5hbWV9YCkgfHwgW107XG5cblx0XHRpZiAodHJhbnNDdHggJiYgKHZhbHVlcy5pbnB1dFR5cGUgPT09IFwiSW5wdXRXaXRoVmFsdWVIZWxwXCIgfHwgdmFsdWVzLmlucHV0VHlwZSA9PT0gXCJJbnB1dFdpdGhVbml0XCIpICYmICF2YWx1ZXMudmFsdWVMaXN0SW5mbykge1xuXHRcdFx0TWFzc0VkaXRIYW5kbGVycy5fc2V0VmFsdWVMaXN0SW5mbyh0cmFuc0N0eCwgc291cmNlLCBmaWVsZEluZm9Nb2RlbCwgcHJvcGVydHlOYW1lKTtcblx0XHR9XG5cblx0XHRNYXNzRWRpdEhhbmRsZXJzLl91cGRhdGVTdWdnZXN0aW9uRm9yRmllbGRzV2l0aE91dFBhcmFtZXRlcnMoZmllbGRJbmZvTW9kZWwsIHByb3BlcnR5TmFtZSwgZmFsc2UsIHRydWUpO1xuXHRcdE1hc3NFZGl0SGFuZGxlcnMuX3VwZGF0ZVN1Z2dlc3Rpb25Gb3JGaWVsZHNXaXRoSW5QYXJhbWV0ZXJzKGZpZWxkSW5mb01vZGVsLCBwcm9wZXJ0eU5hbWUsIGZhbHNlLCB0cnVlKTtcblxuXHRcdGNvbnN0IGZvcm1hdHRlZFZhbHVlID0gc291cmNlLmdldEZvcm1Gb3JtYXR0ZWRWYWx1ZSgpO1xuXHRcdE1hc3NFZGl0SGFuZGxlcnMuX3VwZGF0ZVNlbGVjdEtleShzb3VyY2UsIHByb3BlcnR5TmFtZSwgdmFsdWUsIGZvcm1hdHRlZFZhbHVlKTtcblx0fSxcblxuXHQvKipcblx0ICogVXBkYXRlIHN1Z2dlc3RzIGZvciBhbGwgZHJvcCBkb3ducyB3aXRoIEluUGFyYW1ldGVyIGFzIHRoZSBwcm9wZXJ0eU5hbWUuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAcGFyYW0gZmllbGRJbmZvTW9kZWwgUnVudGltZSBtb2RlbCB3aXRoIHBhcmFtZXRlcnMgc3RvcmUgaW5mb3JtYXRpb24uXG5cdCAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgUHJvcGVydHkgcGF0aC5cblx0ICogQHBhcmFtIHJlc2V0VmFsdWVzIFNob3VsZCB0aGUgdmFsdWVzIGJlIHJlc2V0IHRvIG9yaWdpbmFsIHN0YXRlLlxuXHQgKiBAcGFyYW0ga2VlcEV4aXN0aW5nU2VsZWN0aW9uIFNob3VsZCB0aGUgZXhpc3Rpbmcgc2VsZWN0aW9uIGJlZm9yZSB1cGRhdGUgcmVtYWluLlxuXHQgKi9cblx0X3VwZGF0ZVN1Z2dlc3Rpb25Gb3JGaWVsZHNXaXRoSW5QYXJhbWV0ZXJzOiBmdW5jdGlvbiAoXG5cdFx0ZmllbGRJbmZvTW9kZWw6IEpTT05Nb2RlbCxcblx0XHRwcm9wZXJ0eU5hbWU6IHN0cmluZyxcblx0XHRyZXNldFZhbHVlczogYm9vbGVhbixcblx0XHRrZWVwRXhpc3RpbmdTZWxlY3Rpb246IGJvb2xlYW5cblx0KTogdm9pZCB7XG5cdFx0Y29uc3QgdmFsdWVzID0gZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoXCIvdmFsdWVzXCIpO1xuXHRcdGNvbnN0IHVuaXREYXRhID0gZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoXCIvdW5pdERhdGFcIik7XG5cdFx0Y29uc3QgZmllbGRQYXRocyA9IE9iamVjdC5rZXlzKHZhbHVlcyk7XG5cdFx0Y29uc3QgdW5pdEZpZWxkUGF0aHMgPSBPYmplY3Qua2V5cyh1bml0RGF0YSk7XG5cblx0XHRmaWVsZFBhdGhzLmZvckVhY2goXG5cdFx0XHRNYXNzRWRpdEhhbmRsZXJzLl91cGRhdGVJblBhcmFtZXRlclN1Z2dldGlvbnMuYmluZChcblx0XHRcdFx0TWFzc0VkaXRIYW5kbGVycyxcblx0XHRcdFx0ZmllbGRJbmZvTW9kZWwsXG5cdFx0XHRcdFwiL3ZhbHVlcy9cIixcblx0XHRcdFx0cHJvcGVydHlOYW1lLFxuXHRcdFx0XHRyZXNldFZhbHVlcyxcblx0XHRcdFx0a2VlcEV4aXN0aW5nU2VsZWN0aW9uXG5cdFx0XHQpXG5cdFx0KTtcblx0XHR1bml0RmllbGRQYXRocy5mb3JFYWNoKFxuXHRcdFx0TWFzc0VkaXRIYW5kbGVycy5fdXBkYXRlSW5QYXJhbWV0ZXJTdWdnZXRpb25zLmJpbmQoXG5cdFx0XHRcdE1hc3NFZGl0SGFuZGxlcnMsXG5cdFx0XHRcdGZpZWxkSW5mb01vZGVsLFxuXHRcdFx0XHRcIi91bml0RGF0YS9cIixcblx0XHRcdFx0cHJvcGVydHlOYW1lLFxuXHRcdFx0XHRyZXNldFZhbHVlcyxcblx0XHRcdFx0a2VlcEV4aXN0aW5nU2VsZWN0aW9uXG5cdFx0XHQpXG5cdFx0KTtcblx0fSxcblxuXHQvKipcblx0ICogVXBkYXRlIHN1Z2dlc3RzIGZvciBhIGRyb3AgZG93biB3aXRoIEluUGFyYW1ldGVyIGFzIHRoZSBzcmNQcm9wZXJ0eU5hbWUuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAcGFyYW0gZmllbGRJbmZvTW9kZWwgUnVudGltZSBtb2RlbCB3aXRoIHBhcmFtZXRlcnMgc3RvcmUgaW5mb3JtYXRpb24uXG5cdCAqIEBwYXJhbSBwYXRoUHJlZml4IFBhdGggaW4gdGhlIHJ1bnRpbWUgbW9kZWwuXG5cdCAqIEBwYXJhbSBzcmNQcm9wZXJ0eU5hbWUgVGhlIEluUGFyYW1ldGVyIFByb3BlcnR5IHBhdGguXG5cdCAqIEBwYXJhbSByZXNldFZhbHVlcyBTaG91bGQgdGhlIHZhbHVlcyBiZSByZXNldCB0byBvcmlnaW5hbCBzdGF0ZS5cblx0ICogQHBhcmFtIGtlZXBFeGlzdGluZ1NlbGVjdGlvbiBTaG91bGQgdGhlIGV4aXN0aW5nIHNlbGVjdGlvbiBiZWZvcmUgdXBkYXRlIHJlbWFpbi5cblx0ICogQHBhcmFtIHByb3BlcnR5TmFtZSBQcm9wZXJ0eSBwYXRoIHRoYXQgbmVlZHMgdXBkYXRlIG9mIHN1Z2dlc3Rpb25zLlxuXHQgKi9cblx0X3VwZGF0ZUluUGFyYW1ldGVyU3VnZ2V0aW9uczogZnVuY3Rpb24gKFxuXHRcdGZpZWxkSW5mb01vZGVsOiBKU09OTW9kZWwsXG5cdFx0cGF0aFByZWZpeDogc3RyaW5nLFxuXHRcdHNyY1Byb3BlcnR5TmFtZTogc3RyaW5nLFxuXHRcdHJlc2V0VmFsdWVzOiBib29sZWFuLFxuXHRcdGtlZXBFeGlzdGluZ1NlbGVjdGlvbjogYm9vbGVhbixcblx0XHRwcm9wZXJ0eU5hbWU6IHN0cmluZ1xuXHQpIHtcblx0XHRjb25zdCB2YWx1ZUxpc3RJbmZvID0gZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoYCR7cGF0aFByZWZpeCArIHByb3BlcnR5TmFtZX0vdmFsdWVMaXN0SW5mb2ApO1xuXHRcdGlmICh2YWx1ZUxpc3RJbmZvICYmIHNyY1Byb3BlcnR5TmFtZSAhPSBwcm9wZXJ0eU5hbWUpIHtcblx0XHRcdGNvbnN0IGluUGFyYW1ldGVycyA9IHZhbHVlTGlzdEluZm8uaW5QYXJhbWV0ZXJzO1xuXHRcdFx0aWYgKGluUGFyYW1ldGVycyAmJiBpblBhcmFtZXRlcnMubGVuZ3RoID4gMCAmJiBpblBhcmFtZXRlcnMuaW5jbHVkZXMoc3JjUHJvcGVydHlOYW1lKSkge1xuXHRcdFx0XHRNYXNzRWRpdEhhbmRsZXJzLl91cGRhdGVGaWVsZFBhdGhTdWdnZXN0aW9ucyhmaWVsZEluZm9Nb2RlbCwgcGF0aFByZWZpeCArIHByb3BlcnR5TmFtZSwgcmVzZXRWYWx1ZXMsIGtlZXBFeGlzdGluZ1NlbGVjdGlvbik7XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBVcGRhdGUgc3VnZ2VzdHMgZm9yIGFsbCBPdXRQYXJhbWV0ZXIncyBkcm9wIGRvd25zIG9mIHRoZSBwcm9wZXJ0eU5hbWUuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAcGFyYW0gZmllbGRJbmZvTW9kZWwgUnVudGltZSBtb2RlbCB3aXRoIHBhcmFtZXRlcnMgc3RvcmUgaW5mb3JtYXRpb24uXG5cdCAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgUHJvcGVydHkgcGF0aC5cblx0ICogQHBhcmFtIHJlc2V0VmFsdWVzIFNob3VsZCB0aGUgdmFsdWVzIGJlIHJlc2V0IHRvIG9yaWdpbmFsIHN0YXRlLlxuXHQgKiBAcGFyYW0ga2VlcEV4aXN0aW5nU2VsZWN0aW9uIFNob3VsZCB0aGUgZXhpc3Rpbmcgc2VsZWN0aW9uIGJlZm9yZSB1cGRhdGUgcmVtYWluLlxuXHQgKi9cblx0X3VwZGF0ZVN1Z2dlc3Rpb25Gb3JGaWVsZHNXaXRoT3V0UGFyYW1ldGVyczogZnVuY3Rpb24gKFxuXHRcdGZpZWxkSW5mb01vZGVsOiBKU09OTW9kZWwsXG5cdFx0cHJvcGVydHlOYW1lOiBzdHJpbmcsXG5cdFx0cmVzZXRWYWx1ZXM6IGJvb2xlYW4sXG5cdFx0a2VlcEV4aXN0aW5nU2VsZWN0aW9uOiBib29sZWFuXG5cdCk6IHZvaWQge1xuXHRcdGNvbnN0IHZhbHVlTGlzdEluZm8gPVxuXHRcdFx0ZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoYC92YWx1ZXMvJHtwcm9wZXJ0eU5hbWV9L3ZhbHVlTGlzdEluZm9gKSB8fFxuXHRcdFx0ZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoYC91bml0RGF0YS8ke3Byb3BlcnR5TmFtZX0vdmFsdWVMaXN0SW5mb2ApO1xuXG5cdFx0aWYgKHZhbHVlTGlzdEluZm8gJiYgdmFsdWVMaXN0SW5mby5vdXRQYXJhbWV0ZXJzKSB7XG5cdFx0XHRjb25zdCBvdXRQYXJhbWV0ZXJzID0gdmFsdWVMaXN0SW5mby5vdXRQYXJhbWV0ZXJzO1xuXHRcdFx0aWYgKG91dFBhcmFtZXRlcnMubGVuZ3RoICYmIG91dFBhcmFtZXRlcnMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRNYXNzRWRpdEhhbmRsZXJzLl91cGRhdGVPdXRQYXJhbWV0ZXJTdWdnZXRpb25zKG91dFBhcmFtZXRlcnMsIGZpZWxkSW5mb01vZGVsLCByZXNldFZhbHVlcywga2VlcEV4aXN0aW5nU2VsZWN0aW9uKTtcblx0XHRcdFx0Y29uc3QgcGF0aFByZWZpeCA9XG5cdFx0XHRcdFx0KGZpZWxkSW5mb01vZGVsLmdldFByb3BlcnR5KGAvdmFsdWVzLyR7cHJvcGVydHlOYW1lfWApICYmIGAvdmFsdWVzLyR7cHJvcGVydHlOYW1lfWApIHx8XG5cdFx0XHRcdFx0KGZpZWxkSW5mb01vZGVsLmdldFByb3BlcnR5KGAvdW5pdERhdGEvJHtwcm9wZXJ0eU5hbWV9YCkgJiYgYC91bml0RGF0YS8ke3Byb3BlcnR5TmFtZX1gKTtcblx0XHRcdFx0aWYgKHBhdGhQcmVmaXgpIHtcblx0XHRcdFx0XHRNYXNzRWRpdEhhbmRsZXJzLl91cGRhdGVGaWVsZFBhdGhTdWdnZXN0aW9ucyhmaWVsZEluZm9Nb2RlbCwgcGF0aFByZWZpeCwgZmFsc2UsIHRydWUpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBVcGRhdGUgc3VnZ2VzdHMgZm9yIGEgZHJvcCBkb3duIHdpdGggSW5QYXJhbWV0ZXIgYXMgdGhlIHNyY1Byb3BlcnR5TmFtZS5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSBvdXRQYXJhbWV0ZXJzIFN0cmluZyBhcnJhcnkgb2YgT3V0UGFyYW1ldGVyIHByb3BlcnR5IHBhdGhzLlxuXHQgKiBAcGFyYW0gZmllbGRJbmZvTW9kZWwgUnVudGltZSBtb2RlbCB3aXRoIHBhcmFtZXRlcnMgc3RvcmUgaW5mb3JtYXRpb24uXG5cdCAqIEBwYXJhbSByZXNldFZhbHVlcyBTaG91bGQgdGhlIHZhbHVlcyBiZSByZXNldCB0byBvcmlnaW5hbCBzdGF0ZS5cblx0ICogQHBhcmFtIGtlZXBFeGlzdGluZ1NlbGVjdGlvbiBTaG91bGQgdGhlIGV4aXN0aW5nIHNlbGVjdGlvbiBiZWZvcmUgdXBkYXRlIHJlbWFpbi5cblx0ICovXG5cdF91cGRhdGVPdXRQYXJhbWV0ZXJTdWdnZXRpb25zOiBmdW5jdGlvbiAoXG5cdFx0b3V0UGFyYW1ldGVyczogc3RyaW5nW10sXG5cdFx0ZmllbGRJbmZvTW9kZWw6IEpTT05Nb2RlbCxcblx0XHRyZXNldFZhbHVlczogYm9vbGVhbixcblx0XHRrZWVwRXhpc3RpbmdTZWxlY3Rpb246IGJvb2xlYW5cblx0KSB7XG5cdFx0Y29uc3QgdmFsdWVzID0gZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoXCIvdmFsdWVzXCIpO1xuXHRcdGNvbnN0IHVuaXREYXRhID0gZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoXCIvdW5pdERhdGFcIik7XG5cdFx0Y29uc3QgZmllbGRQYXRocyA9IE9iamVjdC5rZXlzKHZhbHVlcyk7XG5cdFx0Y29uc3QgdW5pdEZpZWxkUGF0aHMgPSBPYmplY3Qua2V5cyh1bml0RGF0YSk7XG5cblx0XHRvdXRQYXJhbWV0ZXJzLmZvckVhY2goKG91dFBhcmFtZXRlcjogc3RyaW5nKSA9PiB7XG5cdFx0XHRpZiAoZmllbGRQYXRocy5pbmNsdWRlcyhvdXRQYXJhbWV0ZXIpKSB7XG5cdFx0XHRcdE1hc3NFZGl0SGFuZGxlcnMuX3VwZGF0ZUZpZWxkUGF0aFN1Z2dlc3Rpb25zKGZpZWxkSW5mb01vZGVsLCBgL3ZhbHVlcy8ke291dFBhcmFtZXRlcn1gLCByZXNldFZhbHVlcywga2VlcEV4aXN0aW5nU2VsZWN0aW9uKTtcblx0XHRcdH0gZWxzZSBpZiAodW5pdEZpZWxkUGF0aHMuaW5jbHVkZXMob3V0UGFyYW1ldGVyKSkge1xuXHRcdFx0XHRNYXNzRWRpdEhhbmRsZXJzLl91cGRhdGVGaWVsZFBhdGhTdWdnZXN0aW9ucyhcblx0XHRcdFx0XHRmaWVsZEluZm9Nb2RlbCxcblx0XHRcdFx0XHRgL3VuaXREYXRhLyR7b3V0UGFyYW1ldGVyfWAsXG5cdFx0XHRcdFx0cmVzZXRWYWx1ZXMsXG5cdFx0XHRcdFx0a2VlcEV4aXN0aW5nU2VsZWN0aW9uXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIFVwZGF0ZSBzdWdnZXN0cyBmb3IgYSBkcm9wIGRvd24gb2YgYSBmaWVsZC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSBmaWVsZEluZm9Nb2RlbCBSdW50aW1lIG1vZGVsIHdpdGggcGFyYW1ldGVycyBzdG9yZSBpbmZvcm1hdGlvbi5cblx0ICogQHBhcmFtIGZpZWxkUGF0aEFic29sdXRlIENvbXBsZXRlIHJ1bnRpbWUgcHJvcGVydHkgcGF0aC5cblx0ICogQHBhcmFtIHJlc2V0VmFsdWVzIFNob3VsZCB0aGUgdmFsdWVzIGJlIHJlc2V0IHRvIG9yaWdpbmFsIHN0YXRlLlxuXHQgKiBAcGFyYW0ga2VlcEV4aXN0aW5nU2VsZWN0aW9uIFNob3VsZCB0aGUgZXhpc3Rpbmcgc2VsZWN0aW9uIGJlZm9yZSB1cGRhdGUgcmVtYWluLlxuXHQgKi9cblx0X3VwZGF0ZUZpZWxkUGF0aFN1Z2dlc3Rpb25zOiBmdW5jdGlvbiAoXG5cdFx0ZmllbGRJbmZvTW9kZWw6IEpTT05Nb2RlbCxcblx0XHRmaWVsZFBhdGhBYnNvbHV0ZTogc3RyaW5nLFxuXHRcdHJlc2V0VmFsdWVzOiBib29sZWFuLFxuXHRcdGtlZXBFeGlzdGluZ1NlbGVjdGlvbjogYm9vbGVhblxuXHQpIHtcblx0XHRjb25zdCBvcHRpb25zID0gZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoZmllbGRQYXRoQWJzb2x1dGUpO1xuXHRcdGNvbnN0IGRlZmF1bHRPcHRpb25zID0gb3B0aW9ucy5kZWZhdWx0T3B0aW9ucztcblx0XHRjb25zdCBzZWxlY3RlZEtleSA9IGZpZWxkSW5mb01vZGVsLmdldFByb3BlcnR5KGAke2ZpZWxkUGF0aEFic29sdXRlfS9zZWxlY3RlZEtleWApO1xuXHRcdGNvbnN0IGV4aXN0aW5nU2VsZWN0aW9uID0ga2VlcEV4aXN0aW5nU2VsZWN0aW9uICYmIG9wdGlvbnMuZmluZCgob3B0aW9uOiBhbnkpID0+IG9wdGlvbi5rZXkgPT09IHNlbGVjdGVkS2V5KTtcblx0XHRpZiAocmVzZXRWYWx1ZXMpIHtcblx0XHRcdGNvbnN0IHNlbGVjdE9wdGlvbnMgPSBvcHRpb25zLnNlbGVjdE9wdGlvbnM7XG5cdFx0XHRvcHRpb25zLmxlbmd0aCA9IDA7XG5cdFx0XHRkZWZhdWx0T3B0aW9ucy5mb3JFYWNoKChkZWZhdWx0T3B0aW9uOiBhbnkpID0+IG9wdGlvbnMucHVzaChkZWZhdWx0T3B0aW9uKSk7XG5cdFx0XHRzZWxlY3RPcHRpb25zLmZvckVhY2goKHNlbGVjdE9wdGlvbjogYW55KSA9PiBvcHRpb25zLnB1c2goc2VsZWN0T3B0aW9uKSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG9wdGlvbnMubGVuZ3RoID0gMDtcblx0XHRcdGRlZmF1bHRPcHRpb25zLmZvckVhY2goKGRlZmF1bHRPcHRpb246IGFueSkgPT4gb3B0aW9ucy5wdXNoKGRlZmF1bHRPcHRpb24pKTtcblx0XHR9XG5cblx0XHRmaWVsZEluZm9Nb2RlbC5zZXRQcm9wZXJ0eShmaWVsZFBhdGhBYnNvbHV0ZSwgb3B0aW9ucyk7XG5cblx0XHRpZiAoZXhpc3RpbmdTZWxlY3Rpb24gJiYgIW9wdGlvbnMuaW5jbHVkZXMoZXhpc3RpbmdTZWxlY3Rpb24pKSB7XG5cdFx0XHRvcHRpb25zLnB1c2goZXhpc3RpbmdTZWxlY3Rpb24pO1xuXHRcdFx0ZmllbGRJbmZvTW9kZWwuc2V0UHJvcGVydHkoYCR7ZmllbGRQYXRoQWJzb2x1dGV9L3NlbGVjdGVkS2V5YCwgc2VsZWN0ZWRLZXkpO1xuXHRcdH1cblx0fSxcblxuXHQvKipcblx0ICogVXBkYXRlIEluIGFuZCBPdXQgUGFyYW1ldGVycyBpbiB0aGUgTUVELlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQHBhcmFtIHRyYW5zQ3R4IFRoZSB0cmFuc2llbnQgY29udGV4dCBvZiB0aGUgTUVELlxuXHQgKiBAcGFyYW0gc291cmNlIE1EQyBmaWVsZC5cblx0ICogQHBhcmFtIGZpZWxkSW5mb01vZGVsIFJ1bnRpbWUgbW9kZWwgd2l0aCBwYXJhbWV0ZXJzIHN0b3JlIGluZm9ybWF0aW9uLlxuXHQgKiBAcGFyYW0gcHJvcGVydHlOYW1lIFByb3BlcnR5IHBhdGguXG5cdCAqL1xuXHRfc2V0VmFsdWVMaXN0SW5mbzogZnVuY3Rpb24gKHRyYW5zQ3R4OiBDb250ZXh0LCBzb3VyY2U6IEZpZWxkLCBmaWVsZEluZm9Nb2RlbDogSlNPTk1vZGVsLCBwcm9wZXJ0eU5hbWU6IHN0cmluZyk6IHZvaWQge1xuXHRcdGNvbnN0IHByb3BQYXRoID1cblx0XHRcdChmaWVsZEluZm9Nb2RlbC5nZXRQcm9wZXJ0eShgL3ZhbHVlcy8ke3Byb3BlcnR5TmFtZX1gKSAmJiBcIi92YWx1ZXMvXCIpIHx8XG5cdFx0XHQoZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoYC91bml0RGF0YS8ke3Byb3BlcnR5TmFtZX1gKSAmJiBcIi91bml0RGF0YS9cIik7XG5cblx0XHRpZiAoZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoYCR7cHJvcFBhdGh9JHtwcm9wZXJ0eU5hbWV9L3ZhbHVlTGlzdEluZm9gKSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRjb25zdCB2YWx1ZUxpc3RJbmZvID0gZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoYCR7cHJvcFBhdGh9JHtwcm9wZXJ0eU5hbWV9L3ZhbHVlTGlzdEluZm9gKTtcblxuXHRcdGlmICghdmFsdWVMaXN0SW5mbykge1xuXHRcdFx0TWFzc0VkaXRIYW5kbGVycy5fcmVxdWVzdFZhbHVlTGlzdCh0cmFuc0N0eCwgc291cmNlLCBmaWVsZEluZm9Nb2RlbCwgcHJvcGVydHlOYW1lKTtcblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIFJlcXVlc3QgYW5kIHVwZGF0ZSBJbiBhbmQgT3V0IFBhcmFtZXRlcnMgaW4gdGhlIE1FRC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSB0cmFuc0N0eCBUaGUgdHJhbnNpZW50IGNvbnRleHQgb2YgdGhlIE1FRC5cblx0ICogQHBhcmFtIHNvdXJjZSBNREMgZmllbGQuXG5cdCAqIEBwYXJhbSBmaWVsZEluZm9Nb2RlbCBSdW50aW1lIG1vZGVsIHdpdGggcGFyYW1ldGVycyBzdG9yZSBpbmZvcm1hdGlvbi5cblx0ICogQHBhcmFtIHByb3BlcnR5TmFtZSBQcm9wZXJ0eSBwYXRoLlxuXHQgKi9cblx0X3JlcXVlc3RWYWx1ZUxpc3Q6IGZ1bmN0aW9uICh0cmFuc0N0eDogQ29udGV4dCwgc291cmNlOiBGaWVsZCwgZmllbGRJbmZvTW9kZWw6IEpTT05Nb2RlbCwgcHJvcGVydHlOYW1lOiBzdHJpbmcpOiB2b2lkIHtcblx0XHRjb25zdCBtZXRhUGF0aCA9IE1vZGVsSGVscGVyLmdldE1ldGFQYXRoRm9yQ29udGV4dCh0cmFuc0N0eCk7XG5cdFx0Y29uc3QgcHJvcGVydHlQYXRoID0gKG1ldGFQYXRoICYmIGAke21ldGFQYXRofS8ke3Byb3BlcnR5TmFtZX1gKSBhcyBzdHJpbmc7XG5cdFx0Y29uc3QgZGVwZW5kZW50cyA9IHNvdXJjZT8uZ2V0RGVwZW5kZW50cygpO1xuXHRcdGNvbnN0IGZpZWxkSGVscCA9IHNvdXJjZT8uZ2V0RmllbGRIZWxwKCk7XG5cdFx0Y29uc3QgZmllbGRWYWx1ZUhlbHAgPSBkZXBlbmRlbnRzPy5maW5kKChkZXBlbmRlbnQ6IGFueSkgPT4gZGVwZW5kZW50LmdldElkKCkgPT09IGZpZWxkSGVscCkgYXMgVmFsdWVIZWxwO1xuXHRcdGNvbnN0IHBheWxvYWQgPSAoZmllbGRWYWx1ZUhlbHAuZ2V0RGVsZWdhdGUoKSBhcyBhbnkpPy5wYXlsb2FkIGFzIFZhbHVlSGVscFBheWxvYWQ7XG5cdFx0aWYgKCFmaWVsZFZhbHVlSGVscD8uZ2V0QmluZGluZ0NvbnRleHQoKSkge1xuXHRcdFx0ZmllbGRWYWx1ZUhlbHA/LnNldEJpbmRpbmdDb250ZXh0KHRyYW5zQ3R4KTtcblx0XHR9XG5cdFx0Y29uc3QgbWV0YU1vZGVsID0gdHJhbnNDdHguZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKSBhcyBPRGF0YU1ldGFNb2RlbDtcblx0XHRWYWx1ZUxpc3RIZWxwZXIuY3JlYXRlVkhVSU1vZGVsKGZpZWxkVmFsdWVIZWxwLCBwcm9wZXJ0eVBhdGgsIG1ldGFNb2RlbCk7XG5cdFx0Y29uc3QgdmFsdWVMaXN0SW5mbyA9IFZhbHVlTGlzdEhlbHBlci5nZXRWYWx1ZUxpc3RJbmZvKGZpZWxkVmFsdWVIZWxwLCBwcm9wZXJ0eVBhdGgsIHBheWxvYWQpO1xuXG5cdFx0dmFsdWVMaXN0SW5mb1xuXHRcdFx0LnRoZW4oKHZMaW5mb3M6IFZhbHVlTGlzdEluZm9bXSkgPT4ge1xuXHRcdFx0XHRjb25zdCB2TGluZm8gPSB2TGluZm9zWzBdO1xuXHRcdFx0XHRjb25zdCBwcm9wUGF0aCA9XG5cdFx0XHRcdFx0KGZpZWxkSW5mb01vZGVsLmdldFByb3BlcnR5KGAvdmFsdWVzLyR7cHJvcGVydHlOYW1lfWApICYmIFwiL3ZhbHVlcy9cIikgfHxcblx0XHRcdFx0XHQoZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoYC91bml0RGF0YS8ke3Byb3BlcnR5TmFtZX1gKSAmJiBcIi91bml0RGF0YS9cIik7XG5cdFx0XHRcdGNvbnN0IGluZm86IGFueSA9IHtcblx0XHRcdFx0XHRpblBhcmFtZXRlcnM6XG5cdFx0XHRcdFx0XHR2TGluZm8udmhQYXJhbWV0ZXJzICYmIFZhbHVlTGlzdEhlbHBlci5nZXRJblBhcmFtZXRlcnModkxpbmZvLnZoUGFyYW1ldGVycykubWFwKChpblBhcmFtOiBhbnkpID0+IGluUGFyYW0uaGVscFBhdGgpLFxuXHRcdFx0XHRcdG91dFBhcmFtZXRlcnM6XG5cdFx0XHRcdFx0XHR2TGluZm8udmhQYXJhbWV0ZXJzICYmXG5cdFx0XHRcdFx0XHRWYWx1ZUxpc3RIZWxwZXIuZ2V0T3V0UGFyYW1ldGVycyh2TGluZm8udmhQYXJhbWV0ZXJzKS5tYXAoKG91dFBhcmFtOiBhbnkpID0+IG91dFBhcmFtLmhlbHBQYXRoKVxuXHRcdFx0XHR9O1xuXHRcdFx0XHRmaWVsZEluZm9Nb2RlbC5zZXRQcm9wZXJ0eShgJHtwcm9wUGF0aH0ke3Byb3BlcnR5TmFtZX0vdmFsdWVMaXN0SW5mb2AsIGluZm8pO1xuXHRcdFx0XHRpZiAoaW5mby5vdXRQYXJhbWV0ZXJzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRNYXNzRWRpdEhhbmRsZXJzLl91cGRhdGVGaWVsZFBhdGhTdWdnZXN0aW9ucyhmaWVsZEluZm9Nb2RlbCwgYC92YWx1ZXMvJHtwcm9wZXJ0eU5hbWV9YCwgZmFsc2UsIHRydWUpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKCgpID0+IHtcblx0XHRcdFx0TG9nLndhcm5pbmcoYE1hc3MgRWRpdDogQ291bGRuJ3QgbG9hZCB2YWx1ZUxpc3QgaW5mbyBmb3IgJHtwcm9wZXJ0eVBhdGh9YCk7XG5cdFx0XHR9KTtcblx0fSxcblxuXHQvKipcblx0ICogR2V0IGZpZWxkIGhlbHAgY29udHJvbCBmcm9tIE1EQyBmaWVsZC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSB0cmFuc0N0eCBUaGUgdHJhbnNpZW50IGNvbnRleHQgb2YgdGhlIE1FRC5cblx0ICogQHBhcmFtIHNvdXJjZSBNREMgZmllbGQuXG5cdCAqIEByZXR1cm5zIEZpZWxkIEhlbHAgY29udHJvbC5cblx0ICovXG5cdF9nZXRWYWx1ZUhlbHA6IGZ1bmN0aW9uICh0cmFuc0N0eDogQ29udGV4dCwgc291cmNlOiBGaWVsZCk6IGFueSB7XG5cdFx0Y29uc3QgZGVwZW5kZW50cyA9IHNvdXJjZT8uZ2V0RGVwZW5kZW50cygpO1xuXHRcdGNvbnN0IGZpZWxkSGVscCA9IHNvdXJjZT8uZ2V0RmllbGRIZWxwKCk7XG5cdFx0cmV0dXJuIGRlcGVuZGVudHM/LmZpbmQoKGRlcGVuZGVudDogYW55KSA9PiBkZXBlbmRlbnQuZ2V0SWQoKSA9PT0gZmllbGRIZWxwKTtcblx0fSxcblxuXHQvKipcblx0ICogQ29sbGVkIG9uIGRyb3AgZG93biBzZWxlY3Rpb24gb2YgVkhEIG9wdGlvbi5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSBzb3VyY2UgQ3VzdG9tIE1hc3MgRWRpdCBTZWxlY3QgY29udHJvbC5cblx0ICogQHBhcmFtIHByb3BlcnR5TmFtZSBQcm9wZXJ0eSBwYXRoLlxuXHQgKiBAcGFyYW0gc2VsZWN0S2V5IFByZXZpb3VzIGtleSBiZWZvcmUgdGhlIFZIRCB3YXMgc2VsZWN0ZWQuXG5cdCAqL1xuXHRfb25WSFNlbGVjdDogZnVuY3Rpb24gKHNvdXJjZTogYW55LCBwcm9wZXJ0eU5hbWU6IHN0cmluZywgc2VsZWN0S2V5OiBzdHJpbmcpOiB2b2lkIHtcblx0XHQvLyBDYWxsZWQgZm9yXG5cdFx0Ly8gMS4gVkhEIHNlbGVjdGVkLlxuXG5cdFx0Y29uc3QgZmllbGRJbmZvTW9kZWwgPSBzb3VyY2UgJiYgc291cmNlLmdldE1vZGVsKFwiZmllbGRzSW5mb1wiKTtcblx0XHRjb25zdCBwcm9wUGF0aCA9XG5cdFx0XHQoZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoYC92YWx1ZXMvJHtwcm9wZXJ0eU5hbWV9YCkgJiYgXCIvdmFsdWVzL1wiKSB8fFxuXHRcdFx0KGZpZWxkSW5mb01vZGVsLmdldFByb3BlcnR5KGAvdW5pdERhdGEvJHtwcm9wZXJ0eU5hbWV9YCkgJiYgXCIvdW5pdERhdGEvXCIpO1xuXHRcdGNvbnN0IHRyYW5zQ3R4ID0gc291cmNlLmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0Y29uc3QgZmllbGRWYWx1ZUhlbHAgPSBNYXNzRWRpdEhhbmRsZXJzLl9nZXRWYWx1ZUhlbHAodHJhbnNDdHgsIHNvdXJjZS5nZXRQYXJlbnQoKSk7XG5cdFx0aWYgKCFmaWVsZFZhbHVlSGVscD8uZ2V0QmluZGluZ0NvbnRleHQoKSkge1xuXHRcdFx0ZmllbGRWYWx1ZUhlbHA/LnNldEJpbmRpbmdDb250ZXh0KHRyYW5zQ3R4KTtcblx0XHR9XG5cdFx0c291cmNlLmZpcmVWYWx1ZUhlbHBSZXF1ZXN0KCk7XG5cblx0XHRmaWVsZEluZm9Nb2RlbC5zZXRQcm9wZXJ0eShgJHtwcm9wUGF0aCArIHByb3BlcnR5TmFtZX0vc2VsZWN0ZWRLZXlgLCBzZWxlY3RLZXkpO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBHZXRzIFByb3BlcnR5IG5hbWUgZnJvbSBzZWxlY3Rpb24ga2V5LlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQHBhcmFtIGtleSBTZWxlY3Rpb24ga2V5LlxuXHQgKiBAcmV0dXJucyBQcm9wZXJ0eSBuYW1lLlxuXHQgKi9cblx0X2dldFByb3BlcnR5TmFtZUZyb21LZXk6IGZ1bmN0aW9uIChrZXk6IHN0cmluZykge1xuXHRcdGxldCBwcm9wZXJ0eU5hbWUgPSBcIlwiO1xuXHRcdGlmIChrZXkuc3RhcnRzV2l0aChcIkRlZmF1bHQvXCIpIHx8IGtleS5zdGFydHNXaXRoKFwiQ2xlYXJGaWVsZFZhbHVlL1wiKSB8fCBrZXkuc3RhcnRzV2l0aChcIlVzZVZhbHVlSGVscFZhbHVlL1wiKSkge1xuXHRcdFx0cHJvcGVydHlOYW1lID0ga2V5LnN1YnN0cmluZyhrZXkuaW5kZXhPZihcIi9cIikgKyAxKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cHJvcGVydHlOYW1lID0ga2V5LnN1YnN0cmluZygwLCBrZXkubGFzdEluZGV4T2YoXCIvXCIpKTtcblx0XHR9XG5cdFx0cmV0dXJuIHByb3BlcnR5TmFtZTtcblx0fSxcblxuXHQvKipcblx0ICogVXBkYXRlIHNlbGVjdGlvbiB0byBDdXN0b20gTWFzcyBFZGl0IFNlbGVjdCBmcm9tIE1EQyBmaWVsZC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSBzb3VyY2UgTURDIGZpZWxkLlxuXHQgKiBAcGFyYW0gcHJvcGVydHlOYW1lIFByb3BlcnR5IHBhdGguXG5cdCAqIEBwYXJhbSB2YWx1ZSBWYWx1ZSB0byB1cGRhdGUuXG5cdCAqIEBwYXJhbSBmdWxsVGV4dCBGdWxsIHRleHQgdG8gdXNlLlxuXHQgKi9cblx0X3VwZGF0ZVNlbGVjdEtleTogZnVuY3Rpb24gKHNvdXJjZTogRmllbGQsIHByb3BlcnR5TmFtZTogc3RyaW5nLCB2YWx1ZTogYW55LCBmdWxsVGV4dD86IGFueSk6IHZvaWQge1xuXHRcdC8vIENhbGxlZCBmb3Jcblx0XHQvLyAxLiBWSEQgcHJvcGVydHkgY2hhbmdlXG5cdFx0Ly8gMi4gT3V0IFBhcmFtZXRlcnMuXG5cdFx0Ly8gMy4gVHJhbnNpZW50IGNvbnRleHQgcHJvcGVydHkgY2hhbmdlLlxuXG5cdFx0Y29uc3QgY29tYm9Cb3ggPSBzb3VyY2UuZ2V0Q29udGVudCgpIGFzIENvbWJvQm94O1xuXHRcdGlmICghY29tYm9Cb3ggfHwgIXByb3BlcnR5TmFtZSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRsZXQga2V5OiBzdHJpbmcgPSBjb21ib0JveC5nZXRTZWxlY3RlZEtleSgpO1xuXHRcdGlmICgoa2V5LnN0YXJ0c1dpdGgoXCJEZWZhdWx0L1wiKSB8fCBrZXkuc3RhcnRzV2l0aChcIkNsZWFyRmllbGRWYWx1ZS9cIikpICYmICF2YWx1ZSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNvbnN0IGZvcm1hdHRlZFRleHQgPSBNYXNzRWRpdEhhbmRsZXJzLl92YWx1ZUV4aXN0cyhmdWxsVGV4dCkgPyBmdWxsVGV4dCA6IHZhbHVlO1xuXHRcdGNvbnN0IGZpZWxkSW5mb01vZGVsID0gc291cmNlICYmIChzb3VyY2UuZ2V0TW9kZWwoXCJmaWVsZHNJbmZvXCIpIGFzIEpTT05Nb2RlbCk7XG5cdFx0Y29uc3QgdmFsdWVzID1cblx0XHRcdGZpZWxkSW5mb01vZGVsLmdldFByb3BlcnR5KGAvdmFsdWVzLyR7cHJvcGVydHlOYW1lfWApIHx8IGZpZWxkSW5mb01vZGVsLmdldFByb3BlcnR5KGAvdW5pdERhdGEvJHtwcm9wZXJ0eU5hbWV9YCkgfHwgW107XG5cdFx0Y29uc3QgcHJvcFBhdGggPVxuXHRcdFx0KGZpZWxkSW5mb01vZGVsLmdldFByb3BlcnR5KGAvdmFsdWVzLyR7cHJvcGVydHlOYW1lfWApICYmIFwiL3ZhbHVlcy9cIikgfHxcblx0XHRcdChmaWVsZEluZm9Nb2RlbC5nZXRQcm9wZXJ0eShgL3VuaXREYXRhLyR7cHJvcGVydHlOYW1lfWApICYmIFwiL3VuaXREYXRhL1wiKTtcblxuXHRcdGNvbnN0IHJlbGF0ZWRGaWVsZCA9IHZhbHVlcy5maW5kKChmaWVsZERhdGE6IGFueSkgPT4gZmllbGREYXRhPy50ZXh0SW5mbz8udmFsdWUgPT09IHZhbHVlIHx8IGZpZWxkRGF0YS50ZXh0ID09PSB2YWx1ZSk7XG5cblx0XHRpZiAocmVsYXRlZEZpZWxkKSB7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdGZ1bGxUZXh0ICYmXG5cdFx0XHRcdHJlbGF0ZWRGaWVsZC50ZXh0SW5mbyAmJlxuXHRcdFx0XHRyZWxhdGVkRmllbGQudGV4dEluZm8uZGVzY3JpcHRpb25QYXRoICYmXG5cdFx0XHRcdChyZWxhdGVkRmllbGQudGV4dCAhPSBmb3JtYXR0ZWRUZXh0IHx8IHJlbGF0ZWRGaWVsZC50ZXh0SW5mby5mdWxsVGV4dCAhPSBmb3JtYXR0ZWRUZXh0KVxuXHRcdFx0KSB7XG5cdFx0XHRcdC8vIFVwZGF0ZSB0aGUgZnVsbCB0ZXh0IG9ubHkgd2hlbiBwcm92aWRlZC5cblx0XHRcdFx0cmVsYXRlZEZpZWxkLnRleHQgPSBmb3JtYXR0ZWRUZXh0O1xuXHRcdFx0XHRyZWxhdGVkRmllbGQudGV4dEluZm8uZnVsbFRleHQgPSBmb3JtYXR0ZWRUZXh0O1xuXHRcdFx0XHRyZWxhdGVkRmllbGQudGV4dEluZm8uZGVzY3JpcHRpb24gPSBzb3VyY2UuZ2V0QWRkaXRpb25hbFZhbHVlKCk7XG5cdFx0XHR9XG5cdFx0XHRpZiAocmVsYXRlZEZpZWxkLmtleSA9PT0ga2V5KSB7XG5cdFx0XHRcdGZpZWxkSW5mb01vZGVsLnNldFByb3BlcnR5KGAke3Byb3BQYXRoICsgcHJvcGVydHlOYW1lfS9zZWxlY3RlZEtleWAsIGtleSk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGtleSA9IHJlbGF0ZWRGaWVsZC5rZXk7XG5cdFx0fSBlbHNlIGlmIChbdW5kZWZpbmVkLCBudWxsLCBcIlwiXS5pbmRleE9mKHZhbHVlKSA9PT0gLTEpIHtcblx0XHRcdGtleSA9IGAke3Byb3BlcnR5TmFtZX0vJHt2YWx1ZX1gO1xuXHRcdFx0Y29uc3Qgc2VsZWN0aW9uSW5mbyA9IHtcblx0XHRcdFx0dGV4dDogZm9ybWF0dGVkVGV4dCxcblx0XHRcdFx0a2V5LFxuXHRcdFx0XHR0ZXh0SW5mbzoge1xuXHRcdFx0XHRcdGRlc2NyaXB0aW9uOiBzb3VyY2UuZ2V0QWRkaXRpb25hbFZhbHVlKCksXG5cdFx0XHRcdFx0ZGVzY3JpcHRpb25QYXRoOiB2YWx1ZXMgJiYgdmFsdWVzLnRleHRJbmZvICYmIHZhbHVlcy50ZXh0SW5mby5kZXNjcmlwdGlvblBhdGgsXG5cdFx0XHRcdFx0ZnVsbFRleHQ6IGZvcm1hdHRlZFRleHQsXG5cdFx0XHRcdFx0dGV4dEFycmFuZ2VtZW50OiBzb3VyY2UuZ2V0RGlzcGxheSgpLFxuXHRcdFx0XHRcdHZhbHVlOiBzb3VyY2UuZ2V0VmFsdWUoKSxcblx0XHRcdFx0XHR2YWx1ZVBhdGg6IHByb3BlcnR5TmFtZVxuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXHRcdFx0dmFsdWVzLnB1c2goc2VsZWN0aW9uSW5mbyk7XG5cdFx0XHR2YWx1ZXMuc2VsZWN0T3B0aW9ucyA9IHZhbHVlcy5zZWxlY3RPcHRpb25zIHx8IFtdO1xuXHRcdFx0dmFsdWVzLnNlbGVjdE9wdGlvbnMucHVzaChzZWxlY3Rpb25JbmZvKTtcblx0XHRcdGZpZWxkSW5mb01vZGVsLnNldFByb3BlcnR5KHByb3BQYXRoICsgcHJvcGVydHlOYW1lLCB2YWx1ZXMpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRrZXkgPSBgRGVmYXVsdC8ke3Byb3BlcnR5TmFtZX1gO1xuXHRcdH1cblxuXHRcdGZpZWxkSW5mb01vZGVsLnNldFByb3BlcnR5KGAke3Byb3BQYXRoICsgcHJvcGVydHlOYW1lfS9zZWxlY3RlZEtleWAsIGtleSk7XG5cdFx0TWFzc0VkaXRIYW5kbGVycy5fdXBkYXRlUmVzdWx0cyhjb21ib0JveCk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEdldCBWYWx1ZSBmcm9tIERyb3AgZG93bi5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSBzb3VyY2UgRHJvcCBkb3duIGNvbnRyb2wuXG5cdCAqIEByZXR1cm5zIFZhbHVlIG9mIHNlbGVjdGlvbi5cblx0ICovXG5cdF9nZXRWYWx1ZTogZnVuY3Rpb24gKHNvdXJjZTogQ29udHJvbCkge1xuXHRcdHJldHVybiBzb3VyY2UuZ2V0TWV0YWRhdGEoKS5nZXROYW1lKCkgPT09IFwic2FwLmZlLmNvcmUuY29udHJvbHMuTWFzc0VkaXRTZWxlY3RcIlxuXHRcdFx0PyAoc291cmNlIGFzIFNlbGVjdCkuZ2V0U2VsZWN0ZWRJdGVtKCk/LmdldFRleHQoKVxuXHRcdFx0OiAoc291cmNlIGFzIENvbWJvQm94KS5nZXRWYWx1ZSgpO1xuXHR9LFxuXG5cdF9nZXRWYWx1ZU9uRW1wdHk6IGZ1bmN0aW9uIChvU291cmNlOiBhbnksIGZpZWxkc0luZm9Nb2RlbDogSlNPTk1vZGVsLCB2YWx1ZTogYW55LCBzUHJvcGVydHlOYW1lOiBzdHJpbmcpIHtcblx0XHRpZiAoIXZhbHVlKSB7XG5cdFx0XHRjb25zdCB2YWx1ZXMgPVxuXHRcdFx0XHRmaWVsZHNJbmZvTW9kZWwuZ2V0UHJvcGVydHkoYC92YWx1ZXMvJHtzUHJvcGVydHlOYW1lfWApIHx8IGZpZWxkc0luZm9Nb2RlbC5nZXRQcm9wZXJ0eShgL3VuaXREYXRhLyR7c1Byb3BlcnR5TmFtZX1gKSB8fCBbXTtcblx0XHRcdGlmICh2YWx1ZXMudW5pdFByb3BlcnR5KSB7XG5cdFx0XHRcdHZhbHVlID0gMDtcblx0XHRcdFx0b1NvdXJjZS5zZXRWYWx1ZSh2YWx1ZSk7XG5cdFx0XHR9IGVsc2UgaWYgKHZhbHVlcy5pbnB1dFR5cGUgPT09IFwiQ2hlY2tCb3hcIikge1xuXHRcdFx0XHR2YWx1ZSA9IGZhbHNlO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gdmFsdWU7XG5cdH0sXG5cblx0X3ZhbHVlRXhpc3RzOiBmdW5jdGlvbiAodmFsdWU6IGFueSkge1xuXHRcdHJldHVybiB2YWx1ZSAhPSB1bmRlZmluZWQgJiYgdmFsdWUgIT0gbnVsbDtcblx0fSxcblxuXHQvKipcblx0ICogVXBkYXRlcyBzZWxlY3Rpb25zIHRvIHJ1bnRpbWUgbW9kZWwuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAcGFyYW0gb1NvdXJjZSBEcm9wIGRvd24gY29udHJvbC5cblx0ICogQHBhcmFtIGFQYXJhbXMgUGFydHMgb2Yga2V5IGluIHJ1bnRpbWUgbW9kZWwuXG5cdCAqIEBwYXJhbSB1cGRhdGVUcmFuc0N0eCBTaG91bGQgdHJhbnNpZW50IGNvbnRleHQgYmUgdXBkYXRlZCB3aXRoIHRoZSB2YWx1ZS5cblx0ICovXG5cdF91cGRhdGVSZXN1bHRzOiBmdW5jdGlvbiAob1NvdXJjZTogYW55LCBhUGFyYW1zOiBBcnJheTxzdHJpbmc+ID0gW10sIHVwZGF0ZVRyYW5zQ3R4OiBib29sZWFuKSB7XG5cdFx0Ly8gQ2FsbGVkIGZvclxuXHRcdC8vIDEuIFZIRCBwcm9wZXJ0eSBjaGFuZ2UuXG5cdFx0Ly8gMi4gT3V0IHBhcmFtZXRlci5cblx0XHQvLyAzLiB0cmFuc2llbnQgY29udGV4dCBwcm9wZXJ0eSBjaGFuZ2UuXG5cdFx0Y29uc3QgZmllbGRzSW5mb01vZGVsID0gb1NvdXJjZSAmJiBvU291cmNlLmdldE1vZGVsKFwiZmllbGRzSW5mb1wiKTtcblx0XHRjb25zdCBvRmllbGRzSW5mb0RhdGEgPSBmaWVsZHNJbmZvTW9kZWwgJiYgZmllbGRzSW5mb01vZGVsLmdldERhdGEoKTtcblx0XHRsZXQgdmFsdWUgPSBNYXNzRWRpdEhhbmRsZXJzLl9nZXRWYWx1ZShvU291cmNlIGFzIENvbnRyb2wpO1xuXHRcdGFQYXJhbXMgPSBhUGFyYW1zLmxlbmd0aCA+IDAgPyBhUGFyYW1zIDogb1NvdXJjZSAmJiBvU291cmNlLmdldFNlbGVjdGVkS2V5KCkgJiYgb1NvdXJjZS5nZXRTZWxlY3RlZEtleSgpLnNwbGl0KFwiL1wiKTtcblxuXHRcdGxldCBvRGF0YU9iamVjdDtcblx0XHRjb25zdCBzUHJvcGVydHlOYW1lID0gb1NvdXJjZS5kYXRhKFwiZmllbGRQYXRoXCIpO1xuXG5cdFx0aWYgKGFQYXJhbXNbMF0gPT09IFwiRGVmYXVsdFwiKSB7XG5cdFx0XHRvRGF0YU9iamVjdCA9IHtcblx0XHRcdFx0a2V5VmFsdWU6IGFQYXJhbXNbMV0sXG5cdFx0XHRcdHZhbHVlOiBhUGFyYW1zWzBdXG5cdFx0XHR9O1xuXHRcdH0gZWxzZSBpZiAoYVBhcmFtc1swXSA9PT0gXCJDbGVhckZpZWxkVmFsdWVcIikge1xuXHRcdFx0dmFsdWUgPSBcIlwiO1xuXHRcdFx0dmFsdWUgPSBNYXNzRWRpdEhhbmRsZXJzLl9nZXRWYWx1ZU9uRW1wdHkob1NvdXJjZSwgZmllbGRzSW5mb01vZGVsLCB2YWx1ZSwgc1Byb3BlcnR5TmFtZSk7XG5cdFx0XHRvRGF0YU9iamVjdCA9IHtcblx0XHRcdFx0a2V5VmFsdWU6IGFQYXJhbXNbMV0sXG5cdFx0XHRcdHZhbHVlOiB2YWx1ZVxuXHRcdFx0fTtcblx0XHR9IGVsc2UgaWYgKCFhUGFyYW1zKSB7XG5cdFx0XHR2YWx1ZSA9IE1hc3NFZGl0SGFuZGxlcnMuX2dldFZhbHVlT25FbXB0eShvU291cmNlLCBmaWVsZHNJbmZvTW9kZWwsIHZhbHVlLCBzUHJvcGVydHlOYW1lKTtcblx0XHRcdG9EYXRhT2JqZWN0ID0ge1xuXHRcdFx0XHRrZXlWYWx1ZTogc1Byb3BlcnR5TmFtZSxcblx0XHRcdFx0dmFsdWU6IHZhbHVlXG5cdFx0XHR9O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zdCBwcm9wZXJ0eU5hbWUgPSBhUGFyYW1zLnNsaWNlKDAsIC0xKS5qb2luKFwiL1wiKTtcblx0XHRcdGNvbnN0IHByb3BlcnR5VmFsdWVzID1cblx0XHRcdFx0ZmllbGRzSW5mb01vZGVsLmdldFByb3BlcnR5KGAvdmFsdWVzLyR7cHJvcGVydHlOYW1lfWApIHx8IGZpZWxkc0luZm9Nb2RlbC5nZXRQcm9wZXJ0eShgL3VuaXREYXRhLyR7cHJvcGVydHlOYW1lfWApIHx8IFtdO1xuXG5cdFx0XHRjb25zdCByZWxhdGVkRmllbGQgPSAocHJvcGVydHlWYWx1ZXMgfHwgW10pLmZpbmQoZnVuY3Rpb24gKG9GaWVsZERhdGE6IGFueSkge1xuXHRcdFx0XHRyZXR1cm4gb0ZpZWxkRGF0YT8udGV4dEluZm8/LnZhbHVlID09PSB2YWx1ZSB8fCBvRmllbGREYXRhLnRleHQgPT09IHZhbHVlO1xuXHRcdFx0fSk7XG5cdFx0XHRvRGF0YU9iamVjdCA9IHtcblx0XHRcdFx0a2V5VmFsdWU6IHByb3BlcnR5TmFtZSxcblx0XHRcdFx0dmFsdWU6XG5cdFx0XHRcdFx0cmVsYXRlZEZpZWxkLnRleHRJbmZvICYmIE1hc3NFZGl0SGFuZGxlcnMuX3ZhbHVlRXhpc3RzKHJlbGF0ZWRGaWVsZC50ZXh0SW5mby52YWx1ZSlcblx0XHRcdFx0XHRcdD8gcmVsYXRlZEZpZWxkLnRleHRJbmZvLnZhbHVlXG5cdFx0XHRcdFx0XHQ6IHJlbGF0ZWRGaWVsZC50ZXh0XG5cdFx0XHR9O1xuXHRcdH1cblx0XHRsZXQgYkV4aXN0aW5nRWxlbWVudGluZGV4ID0gLTE7XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBvRmllbGRzSW5mb0RhdGEucmVzdWx0cy5sZW5ndGg7IGkrKykge1xuXHRcdFx0aWYgKG9GaWVsZHNJbmZvRGF0YS5yZXN1bHRzW2ldLmtleVZhbHVlID09PSBvRGF0YU9iamVjdC5rZXlWYWx1ZSkge1xuXHRcdFx0XHRiRXhpc3RpbmdFbGVtZW50aW5kZXggPSBpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAoYkV4aXN0aW5nRWxlbWVudGluZGV4ICE9PSAtMSkge1xuXHRcdFx0b0ZpZWxkc0luZm9EYXRhLnJlc3VsdHNbYkV4aXN0aW5nRWxlbWVudGluZGV4XSA9IG9EYXRhT2JqZWN0O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRvRmllbGRzSW5mb0RhdGEucmVzdWx0cy5wdXNoKG9EYXRhT2JqZWN0KTtcblx0XHR9XG5cdFx0aWYgKHVwZGF0ZVRyYW5zQ3R4ICYmICFvRGF0YU9iamVjdC5rZXlWYWx1ZS5pbmNsdWRlcyhcIi9cIikpIHtcblx0XHRcdGNvbnN0IHRyYW5zQ3R4ID0gb1NvdXJjZS5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdFx0aWYgKGFQYXJhbXNbMF0gPT09IFwiRGVmYXVsdFwiIHx8IGFQYXJhbXNbMF0gPT09IFwiQ2xlYXJGaWVsZFZhbHVlXCIpIHtcblx0XHRcdFx0dHJhbnNDdHguc2V0UHJvcGVydHkob0RhdGFPYmplY3Qua2V5VmFsdWUsIG51bGwpO1xuXHRcdFx0fSBlbHNlIGlmIChvRGF0YU9iamVjdCkge1xuXHRcdFx0XHR0cmFuc0N0eC5zZXRQcm9wZXJ0eShvRGF0YU9iamVjdC5rZXlWYWx1ZSwgb0RhdGFPYmplY3QudmFsdWUpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufTtcblxuZXhwb3J0IGRlZmF1bHQgTWFzc0VkaXRIYW5kbGVycztcbiJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQUE7QUFBQTs7OztFQXVCQSxJQUFNQSxnQkFBcUIsR0FBRztJQUM3QjtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0lBQ0NDLHFCQUFxQixFQUFFLFVBQVVDLFFBQVYsRUFBeUJDLFlBQXpCLEVBQStDQyxVQUEvQyxFQUFtRTtNQUN6RjtNQUNBO01BQ0E7TUFFQSxJQUFNQyxNQUFNLEdBQUdDLElBQUksQ0FBQ0MsSUFBTCxDQUFVSCxVQUFWLENBQWY7TUFDQSxJQUFNSSxRQUFRLEdBQUdILE1BQU0sSUFBS0EsTUFBTSxDQUFDSSxpQkFBUCxFQUE1QjtNQUNBLElBQU1DLGNBQWMsR0FBR0wsTUFBTSxJQUFLQSxNQUFNLENBQUNNLFFBQVAsQ0FBZ0IsWUFBaEIsQ0FBbEM7TUFDQSxJQUFNQyxNQUFN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
507
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJNYXNzRWRpdEhhbmRsZXJzIiwiY29udGV4dFByb3BlcnR5Q2hhbmdlIiwibmV3VmFsdWUiLCJkYXRhUHJvcGVydHkiLCJtZGNGaWVsZElkIiwic291cmNlIiwiQ29yZSIsImJ5SWQiLCJ0cmFuc0N0eCIsImdldEJpbmRpbmdDb250ZXh0IiwiZmllbGRJbmZvTW9kZWwiLCJnZXRNb2RlbCIsInZhbHVlcyIsImdldFByb3BlcnR5IiwiaW5wdXRUeXBlIiwidmFsdWVMaXN0SW5mbyIsIl9zZXRWYWx1ZUxpc3RJbmZvIiwiaXNEaWFsb2dPcGVuIiwiZ2V0VmlzaWJsZSIsIl91cGRhdGVTZWxlY3RLZXkiLCJoYW5kbGVNRENGaWVsZENoYW5nZSIsImV2ZW50IiwicHJvcGVydHlOYW1lIiwiZ2V0U291cmNlIiwiY2hhbmdlUHJvbWlzZSIsImdldFBhcmFtZXRlciIsImNvbWJvQm94IiwiZ2V0Q29udGVudCIsInRoZW4iLCJfdXBkYXRlU2VsZWN0S2V5Rm9yTURDRmllbGRDaGFuZ2UiLCJiaW5kIiwiY2F0Y2giLCJlcnIiLCJMb2ciLCJ3YXJuaW5nIiwiaGFuZGxlU2VsZWN0aW9uQ2hhbmdlIiwia2V5IiwiZ2V0U2VsZWN0ZWRLZXkiLCJwYXJhbXMiLCJzcGxpdCIsInByZXZJdGVtIiwic2VsZWN0S2V5IiwiZ2V0S2V5Iiwic2xpY2UiLCJqb2luIiwiX29uVkhTZWxlY3QiLCJfZ2V0UHJvcGVydHlOYW1lRnJvbUtleSIsIl91cGRhdGVTdWdnZXN0aW9uRm9yRmllbGRzV2l0aEluUGFyYW1ldGVycyIsInN0YXJ0c1dpdGgiLCJfdXBkYXRlU3VnZ2VzdGlvbkZvckZpZWxkc1dpdGhPdXRQYXJhbWV0ZXJzIiwiX3VwZGF0ZVJlc3VsdHMiLCJ2YWx1ZSIsImZvcm1hdHRlZFZhbHVlIiwiZ2V0Rm9ybUZvcm1hdHRlZFZhbHVlIiwicmVzZXRWYWx1ZXMiLCJrZWVwRXhpc3RpbmdTZWxlY3Rpb24iLCJ1bml0RGF0YSIsImZpZWxkUGF0aHMiLCJPYmplY3QiLCJrZXlzIiwidW5pdEZpZWxkUGF0aHMiLCJmb3JFYWNoIiwiX3VwZGF0ZUluUGFyYW1ldGVyU3VnZ2V0aW9ucyIsInBhdGhQcmVmaXgiLCJzcmNQcm9wZXJ0eU5hbWUiLCJpblBhcmFtZXRlcnMiLCJsZW5ndGgiLCJpbmNsdWRlcyIsIl91cGRhdGVGaWVsZFBhdGhTdWdnZXN0aW9ucyIsIm91dFBhcmFtZXRlcnMiLCJfdXBkYXRlT3V0UGFyYW1ldGVyU3VnZ2V0aW9ucyIsIm91dFBhcmFtZXRlciIsImZpZWxkUGF0aEFic29sdXRlIiwib3B0aW9ucyIsImRlZmF1bHRPcHRpb25zIiwic2VsZWN0ZWRLZXkiLCJleGlzdGluZ1NlbGVjdGlvbiIsImZpbmQiLCJvcHRpb24iLCJzZWxlY3RPcHRpb25zIiwiZGVmYXVsdE9wdGlvbiIsInB1c2giLCJzZWxlY3RPcHRpb24iLCJzZXRQcm9wZXJ0eSIsInByb3BQYXRoIiwiX3JlcXVlc3RWYWx1ZUxpc3QiLCJtZXRhUGF0aCIsIk1vZGVsSGVscGVyIiwiZ2V0TWV0YVBhdGhGb3JDb250ZXh0IiwicHJvcGVydHlQYXRoIiwiZGVwZW5kZW50cyIsImdldERlcGVuZGVudHMiLCJmaWVsZEhlbHAiLCJnZXRGaWVsZEhlbHAiLCJmaWVsZFZhbHVlSGVscCIsImRlcGVuZGVudCIsImdldElkIiwicGF5bG9hZCIsImdldERlbGVnYXRlIiwic2V0QmluZGluZ0NvbnRleHQiLCJtZXRhTW9kZWwiLCJnZXRNZXRhTW9kZWwiLCJWYWx1ZUxpc3RIZWxwZXIiLCJjcmVhdGVWSFVJTW9kZWwiLCJnZXRWYWx1ZUxpc3RJbmZvIiwidkxpbmZvcyIsInZMaW5mbyIsImluZm8iLCJ2aFBhcmFtZXRlcnMiLCJnZXRJblBhcmFtZXRlcnMiLCJtYXAiLCJpblBhcmFtIiwiaGVscFBhdGgiLCJnZXRPdXRQYXJhbWV0ZXJzIiwib3V0UGFyYW0iLCJfZ2V0VmFsdWVIZWxwIiwiZ2V0UGFyZW50IiwiZmlyZVZhbHVlSGVscFJlcXVlc3QiLCJzdWJzdHJpbmciLCJpbmRleE9mIiwibGFzdEluZGV4T2YiLCJmdWxsVGV4dCIsImZvcm1hdHRlZFRleHQiLCJfdmFsdWVFeGlzdHMiLCJyZWxhdGVkRmllbGQiLCJmaWVsZERhdGEiLCJ0ZXh0SW5mbyIsInRleHQiLCJkZXNjcmlwdGlvblBhdGgiLCJkZXNjcmlwdGlvbiIsImdldEFkZGl0aW9uYWxWYWx1ZSIsInVuZGVmaW5lZCIsInNlbGVjdGlvbkluZm8iLCJ0ZXh0QXJyYW5nZW1lbnQiLCJnZXREaXNwbGF5IiwiZ2V0VmFsdWUiLCJ2YWx1ZVBhdGgiLCJfZ2V0VmFsdWUiLCJnZXRNZXRhZGF0YSIsImdldE5hbWUiLCJnZXRTZWxlY3RlZEl0ZW0iLCJnZXRUZXh0IiwiX2dldFZhbHVlT25FbXB0eSIsIm9Tb3VyY2UiLCJmaWVsZHNJbmZvTW9kZWwiLCJzUHJvcGVydHlOYW1lIiwidW5pdFByb3BlcnR5Iiwic2V0VmFsdWUiLCJhUGFyYW1zIiwidXBkYXRlVHJhbnNDdHgiLCJvRmllbGRzSW5mb0RhdGEiLCJnZXREYXRhIiwib0RhdGFPYmplY3QiLCJkYXRhIiwia2V5VmFsdWUiLCJwcm9wZXJ0eVZhbHVlcyIsIm9GaWVsZERhdGEiLCJiRXhpc3RpbmdFbGVtZW50aW5kZXgiLCJpIiwicmVzdWx0cyJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiTWFzc0VkaXRIYW5kbGVycy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvbnN0cnVjdG9yIGZvciBhIG5ldyBWaXN1YWwgRmlsdGVyIENvbnRhaW5lci5cbiAqIFVzZWQgZm9yIHZpc3VhbCBmaWx0ZXJzXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFtzSWRdIElEIGZvciB0aGUgbmV3IGNvbnRyb2wsIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGlmIG5vIElEIGlzIGdpdmVuXG4gKiBAZXh0ZW5kcyBzYXAudWkubWRjLmZpbHRlcmJhci5JRmlsdGVyQ29udGFpbmVyXG4gKiBAY2xhc3NcbiAqIEBwcml2YXRlXG4gKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbHMuZmlsdGVyYmFyLlZpc3VhbEZpbHRlckNvbnRhaW5lclxuICovXG5pbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCBNb2RlbEhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0IHR5cGUgeyBWYWx1ZUhlbHBQYXlsb2FkLCBWYWx1ZUxpc3RJbmZvIH0gZnJvbSBcInNhcC9mZS9tYWNyb3MvaW50ZXJuYWwvdmFsdWVoZWxwL1ZhbHVlTGlzdEhlbHBlck5ld1wiO1xuaW1wb3J0IFZhbHVlTGlzdEhlbHBlciBmcm9tIFwic2FwL2ZlL21hY3Jvcy9pbnRlcm5hbC92YWx1ZWhlbHAvVmFsdWVMaXN0SGVscGVyTmV3XCI7XG5pbXBvcnQgdHlwZSBDb21ib0JveCBmcm9tIFwic2FwL20vQ29tYm9Cb3hcIjtcbmltcG9ydCB0eXBlIFNlbGVjdCBmcm9tIFwic2FwL20vU2VsZWN0XCI7XG5pbXBvcnQgdHlwZSBDb250cm9sIGZyb20gXCJzYXAvdWkvY29yZS9Db250cm9sXCI7XG5pbXBvcnQgQ29yZSBmcm9tIFwic2FwL3VpL2NvcmUvQ29yZVwiO1xuaW1wb3J0IHR5cGUgRmllbGQgZnJvbSBcInNhcC91aS9tZGMvRmllbGRcIjtcbmltcG9ydCB0eXBlIFZhbHVlSGVscCBmcm9tIFwic2FwL3VpL21kYy9WYWx1ZUhlbHBcIjtcbmltcG9ydCB0eXBlIEpTT05Nb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL2pzb24vSlNPTk1vZGVsXCI7XG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQ29udGV4dFwiO1xuXG5jb25zdCBNYXNzRWRpdEhhbmRsZXJzOiBhbnkgPSB7XG5cdC8qKlxuXHQgKiBDYWxsZWQgZm9yIHByb3BlcnR5IGNoYW5nZSBpbiB0aGUgdHJhbnNpZW50IGNvbnRleHQuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAcGFyYW0gbmV3VmFsdWUgTmV3IHZhbHVlIG9mIHRoZSBwcm9wZXJ0eS5cblx0ICogQHBhcmFtIGRhdGFQcm9wZXJ0eSBGaW5hbCBjb250ZXh0IHJldHVybmVkIGFmdGVyIHRoZSBwYWdpbmF0b3IgYWN0aW9uXG5cdCAqIEBwYXJhbSBtZGNGaWVsZElkIEZpbmFsIGNvbnRleHQgcmV0dXJuZWQgYWZ0ZXIgdGhlIHBhZ2luYXRvciBhY3Rpb25cblx0ICovXG5cdGNvbnRleHRQcm9wZXJ0eUNoYW5nZTogZnVuY3Rpb24gKG5ld1ZhbHVlOiBhbnksIGRhdGFQcm9wZXJ0eTogc3RyaW5nLCBtZGNGaWVsZElkOiBzdHJpbmcpIHtcblx0XHQvLyBDYWxsZWQgZm9yXG5cdFx0Ly8gMS4gT3V0IFBhcmFtZXRlcnMuXG5cdFx0Ly8gMi4gVHJhbnNpZW50IGNvbnRleHQgcHJvcGVydHkgY2hhbmdlLlxuXG5cdFx0Y29uc3Qgc291cmNlID0gQ29yZS5ieUlkKG1kY0ZpZWxkSWQpIGFzIEZpZWxkO1xuXHRcdGNvbnN0IHRyYW5zQ3R4ID0gc291cmNlICYmIChzb3VyY2UuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBDb250ZXh0KTtcblx0XHRjb25zdCBmaWVsZEluZm9Nb2RlbCA9IHNvdXJjZSAmJiAoc291cmNlLmdldE1vZGVsKFwiZmllbGRzSW5mb1wiKSBhcyBKU09OTW9kZWwpO1xuXHRcdGNvbnN0IHZhbHVlcyA9XG5cdFx0XHRmaWVsZEluZm9Nb2RlbC5nZXRQcm9wZXJ0eShgL3ZhbHVlcy8ke2RhdGFQcm9wZXJ0eX1gKSB8fCBmaWVsZEluZm9Nb2RlbC5nZXRQcm9wZXJ0eShgL3VuaXREYXRhLyR7ZGF0YVByb3BlcnR5fWApIHx8IFtdO1xuXG5cdFx0aWYgKHRyYW5zQ3R4ICYmICh2YWx1ZXMuaW5wdXRUeXBlID09PSBcIklucHV0V2l0aFZhbHVlSGVscFwiIHx8IHZhbHVlcy5pbnB1dFR5cGUgPT09IFwiSW5wdXRXaXRoVW5pdFwiKSAmJiAhdmFsdWVzLnZhbHVlTGlzdEluZm8pIHtcblx0XHRcdE1hc3NFZGl0SGFuZGxlcnMuX3NldFZhbHVlTGlzdEluZm8odHJhbnNDdHgsIHNvdXJjZSwgZmllbGRJbmZvTW9kZWwsIGRhdGFQcm9wZXJ0eSk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgaXNEaWFsb2dPcGVuID0gZmllbGRJbmZvTW9kZWwgJiYgZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoXCIvaXNPcGVuXCIpO1xuXHRcdGlmICghaXNEaWFsb2dPcGVuIHx8ICFzb3VyY2UuZ2V0VmlzaWJsZSgpKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0TWFzc0VkaXRIYW5kbGVycy5fdXBkYXRlU2VsZWN0S2V5KHNvdXJjZSwgZGF0YVByb3BlcnR5LCBuZXdWYWx1ZSk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIENhbGxlZCBmb3IgY2hhbmdlIGluIHRoZSBNREMgZmllbGQuXG5cdCAqIFRoaXMgaXMgY2FsbGVkIG9uIHNlbGVjdGlvbiBkb25lIHRocm91Z2ggVkhELlxuXHQgKiBUaGlzIGlzIG5vdCBjYWxsZWQgb24gY2hhbmdlIG9mIHRoZSBkcm9wZG93biBhcyB3ZSBhcmUgdXNpbmcgYSBjdXN0b20gTWFzc0VkaXRTZWxlY3QgY29udHJvbCBhbmQgbm90IGdlbmVyYWwgU2VsZWN0LlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQHBhcmFtIGV2ZW50IEV2ZW50IG9iamVjdCBmb3IgY2hhbmdlLlxuXHQgKiBAcGFyYW0gcHJvcGVydHlOYW1lIFByb3BlcnR5IHBhdGguXG5cdCAqL1xuXHRoYW5kbGVNRENGaWVsZENoYW5nZTogZnVuY3Rpb24gKGV2ZW50OiBhbnksIHByb3BlcnR5TmFtZTogc3RyaW5nKSB7XG5cdFx0Ly8gQ2FsbGVkIGZvclxuXHRcdC8vIDEuIFZIRCBwcm9wZXJ0eSBjaGFuZ2UuXG5cblx0XHRjb25zdCBzb3VyY2UgPSBldmVudCAmJiBldmVudC5nZXRTb3VyY2UoKTtcblx0XHRjb25zdCBjaGFuZ2VQcm9taXNlID0gZXZlbnQgJiYgZXZlbnQuZ2V0UGFyYW1ldGVyKFwicHJvbWlzZVwiKTtcblx0XHRjb25zdCBjb21ib0JveCA9IHNvdXJjZS5nZXRDb250ZW50KCk7XG5cdFx0aWYgKCFjb21ib0JveCB8fCAhcHJvcGVydHlOYW1lKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y2hhbmdlUHJvbWlzZVxuXHRcdFx0LnRoZW4oTWFzc0VkaXRIYW5kbGVycy5fdXBkYXRlU2VsZWN0S2V5Rm9yTURDRmllbGRDaGFuZ2UuYmluZChNYXNzRWRpdEhhbmRsZXJzLCBzb3VyY2UsIHByb3BlcnR5TmFtZSkpXG5cdFx0XHQuY2F0Y2goKGVycjogYW55KSA9PiB7XG5cdFx0XHRcdExvZy53YXJuaW5nKGBWSEQgc2VsZWN0aW9uIGNvdWxkbid0IGJlIHBvcHVsYXRlZCBpbiB0aGUgbWFzcyBlZGl0IGZpZWxkLiR7ZXJyfWApO1xuXHRcdFx0fSk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIENhbGxlZCBmb3Igc2VsZWN0aW9uIGNoYW5nZSB0aHJvdWdoIHRoZSBkcm9wIGRvd24uXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAcGFyYW0gZXZlbnQgRXZlbnQgb2JqZWN0IGZvciBjaGFuZ2UuXG5cdCAqL1xuXHRoYW5kbGVTZWxlY3Rpb25DaGFuZ2U6IGZ1bmN0aW9uIChldmVudDogYW55KSB7XG5cdFx0Ly8gQ2FsbGVkIGZvciBNYW51YWwgc2VsZWN0aW9uIGZyb20gZHJvcGRvd24oY29tYm9Cb3ggb3Igc2VsZWN0KVxuXHRcdC8vIDEuIFZIRCBzZWxlY3QuXG5cdFx0Ly8gMi4gQW55IHZhbHVlIGNoYW5nZSBpbiB0aGUgY29udHJvbC5cblxuXHRcdGNvbnN0IHNvdXJjZSA9IGV2ZW50ICYmIGV2ZW50LmdldFNvdXJjZSgpO1xuXHRcdGNvbnN0IGtleSA9IHNvdXJjZS5nZXRTZWxlY3RlZEtleSgpIGFzIHN0cmluZztcblx0XHRjb25zdCBwYXJhbXMgPSBzb3VyY2UgJiYga2V5ICYmIGtleS5zcGxpdChcIi9cIik7XG5cdFx0bGV0IHByb3BlcnR5TmFtZTtcblxuXHRcdGlmIChwYXJhbXNbMF0gPT09IFwiVXNlVmFsdWVIZWxwVmFsdWVcIikge1xuXHRcdFx0Y29uc3QgcHJldkl0ZW0gPSBldmVudC5nZXRQYXJhbWV0ZXIoXCJwcmV2aW91c1NlbGVjdGVkSXRlbVwiKTtcblx0XHRcdGNvbnN0IHNlbGVjdEtleSA9IHByZXZJdGVtLmdldEtleSgpO1xuXHRcdFx0cHJvcGVydHlOYW1lID0gcGFyYW1zLnNsaWNlKDEpLmpvaW4oXCIvXCIpO1xuXHRcdFx0TWFzc0VkaXRIYW5kbGVycy5fb25WSFNlbGVjdChzb3VyY2UsIHByb3BlcnR5TmFtZSwgc2VsZWN0S2V5KTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCBmaWVsZEluZm9Nb2RlbCA9IHNvdXJjZSAmJiAoc291cmNlLmdldE1vZGVsKFwiZmllbGRzSW5mb1wiKSBhcyBKU09OTW9kZWwpO1xuXHRcdHByb3BlcnR5TmFtZSA9IE1hc3NFZGl0SGFuZGxlcnMuX2dldFByb3BlcnR5TmFtZUZyb21LZXkoa2V5KTtcblx0XHRNYXNzRWRpdEhhbmRsZXJzLl91cGRhdGVTdWdnZXN0aW9uRm9yRmllbGRzV2l0aEluUGFyYW1ldGVycyhcblx0XHRcdGZpZWxkSW5mb01vZGVsLFxuXHRcdFx0cHJvcGVydHlOYW1lLFxuXHRcdFx0a2V5LnN0YXJ0c1dpdGgoXCJEZWZhdWx0L1wiKSB8fCBrZXkuc3RhcnRzV2l0aChcIkNsZWFyRmllbGRWYWx1ZS9cIiksXG5cdFx0XHR0cnVlXG5cdFx0KTtcblx0XHRNYXNzRWRpdEhhbmRsZXJzLl91cGRhdGVTdWdnZXN0aW9uRm9yRmllbGRzV2l0aE91dFBhcmFtZXRlcnMoXG5cdFx0XHRmaWVsZEluZm9Nb2RlbCxcblx0XHRcdHByb3BlcnR5TmFtZSxcblx0XHRcdGtleS5zdGFydHNXaXRoKFwiRGVmYXVsdC9cIikgfHwga2V5LnN0YXJ0c1dpdGgoXCJDbGVhckZpZWxkVmFsdWUvXCIpLFxuXHRcdFx0ZmFsc2Vcblx0XHQpO1xuXHRcdE1hc3NFZGl0SGFuZGxlcnMuX3VwZGF0ZVJlc3VsdHMoc291cmNlLCBwYXJhbXMsIHRydWUpO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBVcGRhdGUgc2VsZWN0aW9ucyB0byByZXN1bHRzIGFuZCB0aGUgc3VnZ2VzdHMgaW4gZHJvcCBkb3ducy5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSBzb3VyY2UgTURDIGZpZWxkIHRoYXQgd2FzIGNoYW5nZWQuXG5cdCAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgUHJvcGVydHkgcGF0aC5cblx0ICogQHBhcmFtIHZhbHVlIE5ldyB2YWx1ZS5cblx0ICovXG5cdF91cGRhdGVTZWxlY3RLZXlGb3JNRENGaWVsZENoYW5nZTogZnVuY3Rpb24gKHNvdXJjZTogYW55LCBwcm9wZXJ0eU5hbWU6IHN0cmluZywgdmFsdWU6IGFueSk6IHZvaWQge1xuXHRcdGNvbnN0IHRyYW5zQ3R4ID0gc291cmNlICYmIHNvdXJjZS5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdGNvbnN0IGZpZWxkSW5mb01vZGVsID0gc291cmNlICYmIChzb3VyY2UuZ2V0TW9kZWwoXCJmaWVsZHNJbmZvXCIpIGFzIEpTT05Nb2RlbCk7XG5cdFx0Y29uc3QgdmFsdWVzID1cblx0XHRcdGZpZWxkSW5mb01vZGVsLmdldFByb3BlcnR5KGAvdmFsdWVzLyR7cHJvcGVydHlOYW1lfWApIHx8IGZpZWxkSW5mb01vZGVsLmdldFByb3BlcnR5KGAvdW5pdERhdGEvJHtwcm9wZXJ0eU5hbWV9YCkgfHwgW107XG5cblx0XHRpZiAodHJhbnNDdHggJiYgKHZhbHVlcy5pbnB1dFR5cGUgPT09IFwiSW5wdXRXaXRoVmFsdWVIZWxwXCIgfHwgdmFsdWVzLmlucHV0VHlwZSA9PT0gXCJJbnB1dFdpdGhVbml0XCIpICYmICF2YWx1ZXMudmFsdWVMaXN0SW5mbykge1xuXHRcdFx0TWFzc0VkaXRIYW5kbGVycy5fc2V0VmFsdWVMaXN0SW5mbyh0cmFuc0N0eCwgc291cmNlLCBmaWVsZEluZm9Nb2RlbCwgcHJvcGVydHlOYW1lKTtcblx0XHR9XG5cblx0XHRNYXNzRWRpdEhhbmRsZXJzLl91cGRhdGVTdWdnZXN0aW9uRm9yRmllbGRzV2l0aE91dFBhcmFtZXRlcnMoZmllbGRJbmZvTW9kZWwsIHByb3BlcnR5TmFtZSwgZmFsc2UsIHRydWUpO1xuXHRcdE1hc3NFZGl0SGFuZGxlcnMuX3VwZGF0ZVN1Z2dlc3Rpb25Gb3JGaWVsZHNXaXRoSW5QYXJhbWV0ZXJzKGZpZWxkSW5mb01vZGVsLCBwcm9wZXJ0eU5hbWUsIGZhbHNlLCB0cnVlKTtcblxuXHRcdGNvbnN0IGZvcm1hdHRlZFZhbHVlID0gc291cmNlLmdldEZvcm1Gb3JtYXR0ZWRWYWx1ZSgpO1xuXHRcdE1hc3NFZGl0SGFuZGxlcnMuX3VwZGF0ZVNlbGVjdEtleShzb3VyY2UsIHByb3BlcnR5TmFtZSwgdmFsdWUsIGZvcm1hdHRlZFZhbHVlKTtcblx0fSxcblxuXHQvKipcblx0ICogVXBkYXRlIHN1Z2dlc3RzIGZvciBhbGwgZHJvcCBkb3ducyB3aXRoIEluUGFyYW1ldGVyIGFzIHRoZSBwcm9wZXJ0eU5hbWUuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAcGFyYW0gZmllbGRJbmZvTW9kZWwgUnVudGltZSBtb2RlbCB3aXRoIHBhcmFtZXRlcnMgc3RvcmUgaW5mb3JtYXRpb24uXG5cdCAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgUHJvcGVydHkgcGF0aC5cblx0ICogQHBhcmFtIHJlc2V0VmFsdWVzIFNob3VsZCB0aGUgdmFsdWVzIGJlIHJlc2V0IHRvIG9yaWdpbmFsIHN0YXRlLlxuXHQgKiBAcGFyYW0ga2VlcEV4aXN0aW5nU2VsZWN0aW9uIFNob3VsZCB0aGUgZXhpc3Rpbmcgc2VsZWN0aW9uIGJlZm9yZSB1cGRhdGUgcmVtYWluLlxuXHQgKi9cblx0X3VwZGF0ZVN1Z2dlc3Rpb25Gb3JGaWVsZHNXaXRoSW5QYXJhbWV0ZXJzOiBmdW5jdGlvbiAoXG5cdFx0ZmllbGRJbmZvTW9kZWw6IEpTT05Nb2RlbCxcblx0XHRwcm9wZXJ0eU5hbWU6IHN0cmluZyxcblx0XHRyZXNldFZhbHVlczogYm9vbGVhbixcblx0XHRrZWVwRXhpc3RpbmdTZWxlY3Rpb246IGJvb2xlYW5cblx0KTogdm9pZCB7XG5cdFx0Y29uc3QgdmFsdWVzID0gZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoXCIvdmFsdWVzXCIpO1xuXHRcdGNvbnN0IHVuaXREYXRhID0gZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoXCIvdW5pdERhdGFcIik7XG5cdFx0Y29uc3QgZmllbGRQYXRocyA9IE9iamVjdC5rZXlzKHZhbHVlcyk7XG5cdFx0Y29uc3QgdW5pdEZpZWxkUGF0aHMgPSBPYmplY3Qua2V5cyh1bml0RGF0YSk7XG5cblx0XHRmaWVsZFBhdGhzLmZvckVhY2goXG5cdFx0XHRNYXNzRWRpdEhhbmRsZXJzLl91cGRhdGVJblBhcmFtZXRlclN1Z2dldGlvbnMuYmluZChcblx0XHRcdFx0TWFzc0VkaXRIYW5kbGVycyxcblx0XHRcdFx0ZmllbGRJbmZvTW9kZWwsXG5cdFx0XHRcdFwiL3ZhbHVlcy9cIixcblx0XHRcdFx0cHJvcGVydHlOYW1lLFxuXHRcdFx0XHRyZXNldFZhbHVlcyxcblx0XHRcdFx0a2VlcEV4aXN0aW5nU2VsZWN0aW9uXG5cdFx0XHQpXG5cdFx0KTtcblx0XHR1bml0RmllbGRQYXRocy5mb3JFYWNoKFxuXHRcdFx0TWFzc0VkaXRIYW5kbGVycy5fdXBkYXRlSW5QYXJhbWV0ZXJTdWdnZXRpb25zLmJpbmQoXG5cdFx0XHRcdE1hc3NFZGl0SGFuZGxlcnMsXG5cdFx0XHRcdGZpZWxkSW5mb01vZGVsLFxuXHRcdFx0XHRcIi91bml0RGF0YS9cIixcblx0XHRcdFx0cHJvcGVydHlOYW1lLFxuXHRcdFx0XHRyZXNldFZhbHVlcyxcblx0XHRcdFx0a2VlcEV4aXN0aW5nU2VsZWN0aW9uXG5cdFx0XHQpXG5cdFx0KTtcblx0fSxcblxuXHQvKipcblx0ICogVXBkYXRlIHN1Z2dlc3RzIGZvciBhIGRyb3AgZG93biB3aXRoIEluUGFyYW1ldGVyIGFzIHRoZSBzcmNQcm9wZXJ0eU5hbWUuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAcGFyYW0gZmllbGRJbmZvTW9kZWwgUnVudGltZSBtb2RlbCB3aXRoIHBhcmFtZXRlcnMgc3RvcmUgaW5mb3JtYXRpb24uXG5cdCAqIEBwYXJhbSBwYXRoUHJlZml4IFBhdGggaW4gdGhlIHJ1bnRpbWUgbW9kZWwuXG5cdCAqIEBwYXJhbSBzcmNQcm9wZXJ0eU5hbWUgVGhlIEluUGFyYW1ldGVyIFByb3BlcnR5IHBhdGguXG5cdCAqIEBwYXJhbSByZXNldFZhbHVlcyBTaG91bGQgdGhlIHZhbHVlcyBiZSByZXNldCB0byBvcmlnaW5hbCBzdGF0ZS5cblx0ICogQHBhcmFtIGtlZXBFeGlzdGluZ1NlbGVjdGlvbiBTaG91bGQgdGhlIGV4aXN0aW5nIHNlbGVjdGlvbiBiZWZvcmUgdXBkYXRlIHJlbWFpbi5cblx0ICogQHBhcmFtIHByb3BlcnR5TmFtZSBQcm9wZXJ0eSBwYXRoIHRoYXQgbmVlZHMgdXBkYXRlIG9mIHN1Z2dlc3Rpb25zLlxuXHQgKi9cblx0X3VwZGF0ZUluUGFyYW1ldGVyU3VnZ2V0aW9uczogZnVuY3Rpb24gKFxuXHRcdGZpZWxkSW5mb01vZGVsOiBKU09OTW9kZWwsXG5cdFx0cGF0aFByZWZpeDogc3RyaW5nLFxuXHRcdHNyY1Byb3BlcnR5TmFtZTogc3RyaW5nLFxuXHRcdHJlc2V0VmFsdWVzOiBib29sZWFuLFxuXHRcdGtlZXBFeGlzdGluZ1NlbGVjdGlvbjogYm9vbGVhbixcblx0XHRwcm9wZXJ0eU5hbWU6IHN0cmluZ1xuXHQpIHtcblx0XHRjb25zdCB2YWx1ZUxpc3RJbmZvID0gZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoYCR7cGF0aFByZWZpeCArIHByb3BlcnR5TmFtZX0vdmFsdWVMaXN0SW5mb2ApO1xuXHRcdGlmICh2YWx1ZUxpc3RJbmZvICYmIHNyY1Byb3BlcnR5TmFtZSAhPSBwcm9wZXJ0eU5hbWUpIHtcblx0XHRcdGNvbnN0IGluUGFyYW1ldGVycyA9IHZhbHVlTGlzdEluZm8uaW5QYXJhbWV0ZXJzO1xuXHRcdFx0aWYgKGluUGFyYW1ldGVycyAmJiBpblBhcmFtZXRlcnMubGVuZ3RoID4gMCAmJiBpblBhcmFtZXRlcnMuaW5jbHVkZXMoc3JjUHJvcGVydHlOYW1lKSkge1xuXHRcdFx0XHRNYXNzRWRpdEhhbmRsZXJzLl91cGRhdGVGaWVsZFBhdGhTdWdnZXN0aW9ucyhmaWVsZEluZm9Nb2RlbCwgcGF0aFByZWZpeCArIHByb3BlcnR5TmFtZSwgcmVzZXRWYWx1ZXMsIGtlZXBFeGlzdGluZ1NlbGVjdGlvbik7XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBVcGRhdGUgc3VnZ2VzdHMgZm9yIGFsbCBPdXRQYXJhbWV0ZXIncyBkcm9wIGRvd25zIG9mIHRoZSBwcm9wZXJ0eU5hbWUuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAcGFyYW0gZmllbGRJbmZvTW9kZWwgUnVudGltZSBtb2RlbCB3aXRoIHBhcmFtZXRlcnMgc3RvcmUgaW5mb3JtYXRpb24uXG5cdCAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgUHJvcGVydHkgcGF0aC5cblx0ICogQHBhcmFtIHJlc2V0VmFsdWVzIFNob3VsZCB0aGUgdmFsdWVzIGJlIHJlc2V0IHRvIG9yaWdpbmFsIHN0YXRlLlxuXHQgKiBAcGFyYW0ga2VlcEV4aXN0aW5nU2VsZWN0aW9uIFNob3VsZCB0aGUgZXhpc3Rpbmcgc2VsZWN0aW9uIGJlZm9yZSB1cGRhdGUgcmVtYWluLlxuXHQgKi9cblx0X3VwZGF0ZVN1Z2dlc3Rpb25Gb3JGaWVsZHNXaXRoT3V0UGFyYW1ldGVyczogZnVuY3Rpb24gKFxuXHRcdGZpZWxkSW5mb01vZGVsOiBKU09OTW9kZWwsXG5cdFx0cHJvcGVydHlOYW1lOiBzdHJpbmcsXG5cdFx0cmVzZXRWYWx1ZXM6IGJvb2xlYW4sXG5cdFx0a2VlcEV4aXN0aW5nU2VsZWN0aW9uOiBib29sZWFuXG5cdCk6IHZvaWQge1xuXHRcdGNvbnN0IHZhbHVlTGlzdEluZm8gPVxuXHRcdFx0ZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoYC92YWx1ZXMvJHtwcm9wZXJ0eU5hbWV9L3ZhbHVlTGlzdEluZm9gKSB8fFxuXHRcdFx0ZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoYC91bml0RGF0YS8ke3Byb3BlcnR5TmFtZX0vdmFsdWVMaXN0SW5mb2ApO1xuXG5cdFx0aWYgKHZhbHVlTGlzdEluZm8gJiYgdmFsdWVMaXN0SW5mby5vdXRQYXJhbWV0ZXJzKSB7XG5cdFx0XHRjb25zdCBvdXRQYXJhbWV0ZXJzID0gdmFsdWVMaXN0SW5mby5vdXRQYXJhbWV0ZXJzO1xuXHRcdFx0aWYgKG91dFBhcmFtZXRlcnMubGVuZ3RoICYmIG91dFBhcmFtZXRlcnMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRNYXNzRWRpdEhhbmRsZXJzLl91cGRhdGVPdXRQYXJhbWV0ZXJTdWdnZXRpb25zKG91dFBhcmFtZXRlcnMsIGZpZWxkSW5mb01vZGVsLCByZXNldFZhbHVlcywga2VlcEV4aXN0aW5nU2VsZWN0aW9uKTtcblx0XHRcdFx0Y29uc3QgcGF0aFByZWZpeCA9XG5cdFx0XHRcdFx0KGZpZWxkSW5mb01vZGVsLmdldFByb3BlcnR5KGAvdmFsdWVzLyR7cHJvcGVydHlOYW1lfWApICYmIGAvdmFsdWVzLyR7cHJvcGVydHlOYW1lfWApIHx8XG5cdFx0XHRcdFx0KGZpZWxkSW5mb01vZGVsLmdldFByb3BlcnR5KGAvdW5pdERhdGEvJHtwcm9wZXJ0eU5hbWV9YCkgJiYgYC91bml0RGF0YS8ke3Byb3BlcnR5TmFtZX1gKTtcblx0XHRcdFx0aWYgKHBhdGhQcmVmaXgpIHtcblx0XHRcdFx0XHRNYXNzRWRpdEhhbmRsZXJzLl91cGRhdGVGaWVsZFBhdGhTdWdnZXN0aW9ucyhmaWVsZEluZm9Nb2RlbCwgcGF0aFByZWZpeCwgZmFsc2UsIHRydWUpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBVcGRhdGUgc3VnZ2VzdHMgZm9yIGEgZHJvcCBkb3duIHdpdGggSW5QYXJhbWV0ZXIgYXMgdGhlIHNyY1Byb3BlcnR5TmFtZS5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSBvdXRQYXJhbWV0ZXJzIFN0cmluZyBhcnJhcnkgb2YgT3V0UGFyYW1ldGVyIHByb3BlcnR5IHBhdGhzLlxuXHQgKiBAcGFyYW0gZmllbGRJbmZvTW9kZWwgUnVudGltZSBtb2RlbCB3aXRoIHBhcmFtZXRlcnMgc3RvcmUgaW5mb3JtYXRpb24uXG5cdCAqIEBwYXJhbSByZXNldFZhbHVlcyBTaG91bGQgdGhlIHZhbHVlcyBiZSByZXNldCB0byBvcmlnaW5hbCBzdGF0ZS5cblx0ICogQHBhcmFtIGtlZXBFeGlzdGluZ1NlbGVjdGlvbiBTaG91bGQgdGhlIGV4aXN0aW5nIHNlbGVjdGlvbiBiZWZvcmUgdXBkYXRlIHJlbWFpbi5cblx0ICovXG5cdF91cGRhdGVPdXRQYXJhbWV0ZXJTdWdnZXRpb25zOiBmdW5jdGlvbiAoXG5cdFx0b3V0UGFyYW1ldGVyczogc3RyaW5nW10sXG5cdFx0ZmllbGRJbmZvTW9kZWw6IEpTT05Nb2RlbCxcblx0XHRyZXNldFZhbHVlczogYm9vbGVhbixcblx0XHRrZWVwRXhpc3RpbmdTZWxlY3Rpb246IGJvb2xlYW5cblx0KSB7XG5cdFx0Y29uc3QgdmFsdWVzID0gZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoXCIvdmFsdWVzXCIpO1xuXHRcdGNvbnN0IHVuaXREYXRhID0gZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoXCIvdW5pdERhdGFcIik7XG5cdFx0Y29uc3QgZmllbGRQYXRocyA9IE9iamVjdC5rZXlzKHZhbHVlcyk7XG5cdFx0Y29uc3QgdW5pdEZpZWxkUGF0aHMgPSBPYmplY3Qua2V5cyh1bml0RGF0YSk7XG5cblx0XHRvdXRQYXJhbWV0ZXJzLmZvckVhY2goKG91dFBhcmFtZXRlcjogc3RyaW5nKSA9PiB7XG5cdFx0XHRpZiAoZmllbGRQYXRocy5pbmNsdWRlcyhvdXRQYXJhbWV0ZXIpKSB7XG5cdFx0XHRcdE1hc3NFZGl0SGFuZGxlcnMuX3VwZGF0ZUZpZWxkUGF0aFN1Z2dlc3Rpb25zKGZpZWxkSW5mb01vZGVsLCBgL3ZhbHVlcy8ke291dFBhcmFtZXRlcn1gLCByZXNldFZhbHVlcywga2VlcEV4aXN0aW5nU2VsZWN0aW9uKTtcblx0XHRcdH0gZWxzZSBpZiAodW5pdEZpZWxkUGF0aHMuaW5jbHVkZXMob3V0UGFyYW1ldGVyKSkge1xuXHRcdFx0XHRNYXNzRWRpdEhhbmRsZXJzLl91cGRhdGVGaWVsZFBhdGhTdWdnZXN0aW9ucyhcblx0XHRcdFx0XHRmaWVsZEluZm9Nb2RlbCxcblx0XHRcdFx0XHRgL3VuaXREYXRhLyR7b3V0UGFyYW1ldGVyfWAsXG5cdFx0XHRcdFx0cmVzZXRWYWx1ZXMsXG5cdFx0XHRcdFx0a2VlcEV4aXN0aW5nU2VsZWN0aW9uXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIFVwZGF0ZSBzdWdnZXN0cyBmb3IgYSBkcm9wIGRvd24gb2YgYSBmaWVsZC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSBmaWVsZEluZm9Nb2RlbCBSdW50aW1lIG1vZGVsIHdpdGggcGFyYW1ldGVycyBzdG9yZSBpbmZvcm1hdGlvbi5cblx0ICogQHBhcmFtIGZpZWxkUGF0aEFic29sdXRlIENvbXBsZXRlIHJ1bnRpbWUgcHJvcGVydHkgcGF0aC5cblx0ICogQHBhcmFtIHJlc2V0VmFsdWVzIFNob3VsZCB0aGUgdmFsdWVzIGJlIHJlc2V0IHRvIG9yaWdpbmFsIHN0YXRlLlxuXHQgKiBAcGFyYW0ga2VlcEV4aXN0aW5nU2VsZWN0aW9uIFNob3VsZCB0aGUgZXhpc3Rpbmcgc2VsZWN0aW9uIGJlZm9yZSB1cGRhdGUgcmVtYWluLlxuXHQgKi9cblx0X3VwZGF0ZUZpZWxkUGF0aFN1Z2dlc3Rpb25zOiBmdW5jdGlvbiAoXG5cdFx0ZmllbGRJbmZvTW9kZWw6IEpTT05Nb2RlbCxcblx0XHRmaWVsZFBhdGhBYnNvbHV0ZTogc3RyaW5nLFxuXHRcdHJlc2V0VmFsdWVzOiBib29sZWFuLFxuXHRcdGtlZXBFeGlzdGluZ1NlbGVjdGlvbjogYm9vbGVhblxuXHQpIHtcblx0XHRjb25zdCBvcHRpb25zID0gZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoZmllbGRQYXRoQWJzb2x1dGUpO1xuXHRcdGNvbnN0IGRlZmF1bHRPcHRpb25zID0gb3B0aW9ucy5kZWZhdWx0T3B0aW9ucztcblx0XHRjb25zdCBzZWxlY3RlZEtleSA9IGZpZWxkSW5mb01vZGVsLmdldFByb3BlcnR5KGAke2ZpZWxkUGF0aEFic29sdXRlfS9zZWxlY3RlZEtleWApO1xuXHRcdGNvbnN0IGV4aXN0aW5nU2VsZWN0aW9uID0ga2VlcEV4aXN0aW5nU2VsZWN0aW9uICYmIG9wdGlvbnMuZmluZCgob3B0aW9uOiBhbnkpID0+IG9wdGlvbi5rZXkgPT09IHNlbGVjdGVkS2V5KTtcblx0XHRpZiAocmVzZXRWYWx1ZXMpIHtcblx0XHRcdGNvbnN0IHNlbGVjdE9wdGlvbnMgPSBvcHRpb25zLnNlbGVjdE9wdGlvbnM7XG5cdFx0XHRvcHRpb25zLmxlbmd0aCA9IDA7XG5cdFx0XHRkZWZhdWx0T3B0aW9ucy5mb3JFYWNoKChkZWZhdWx0T3B0aW9uOiBhbnkpID0+IG9wdGlvbnMucHVzaChkZWZhdWx0T3B0aW9uKSk7XG5cdFx0XHRzZWxlY3RPcHRpb25zLmZvckVhY2goKHNlbGVjdE9wdGlvbjogYW55KSA9PiBvcHRpb25zLnB1c2goc2VsZWN0T3B0aW9uKSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG9wdGlvbnMubGVuZ3RoID0gMDtcblx0XHRcdGRlZmF1bHRPcHRpb25zLmZvckVhY2goKGRlZmF1bHRPcHRpb246IGFueSkgPT4gb3B0aW9ucy5wdXNoKGRlZmF1bHRPcHRpb24pKTtcblx0XHR9XG5cblx0XHRmaWVsZEluZm9Nb2RlbC5zZXRQcm9wZXJ0eShmaWVsZFBhdGhBYnNvbHV0ZSwgb3B0aW9ucyk7XG5cblx0XHRpZiAoZXhpc3RpbmdTZWxlY3Rpb24gJiYgIW9wdGlvbnMuaW5jbHVkZXMoZXhpc3RpbmdTZWxlY3Rpb24pKSB7XG5cdFx0XHRvcHRpb25zLnB1c2goZXhpc3RpbmdTZWxlY3Rpb24pO1xuXHRcdFx0ZmllbGRJbmZvTW9kZWwuc2V0UHJvcGVydHkoYCR7ZmllbGRQYXRoQWJzb2x1dGV9L3NlbGVjdGVkS2V5YCwgc2VsZWN0ZWRLZXkpO1xuXHRcdH1cblx0fSxcblxuXHQvKipcblx0ICogVXBkYXRlIEluIGFuZCBPdXQgUGFyYW1ldGVycyBpbiB0aGUgTUVELlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQHBhcmFtIHRyYW5zQ3R4IFRoZSB0cmFuc2llbnQgY29udGV4dCBvZiB0aGUgTUVELlxuXHQgKiBAcGFyYW0gc291cmNlIE1EQyBmaWVsZC5cblx0ICogQHBhcmFtIGZpZWxkSW5mb01vZGVsIFJ1bnRpbWUgbW9kZWwgd2l0aCBwYXJhbWV0ZXJzIHN0b3JlIGluZm9ybWF0aW9uLlxuXHQgKiBAcGFyYW0gcHJvcGVydHlOYW1lIFByb3BlcnR5IHBhdGguXG5cdCAqL1xuXHRfc2V0VmFsdWVMaXN0SW5mbzogZnVuY3Rpb24gKHRyYW5zQ3R4OiBDb250ZXh0LCBzb3VyY2U6IEZpZWxkLCBmaWVsZEluZm9Nb2RlbDogSlNPTk1vZGVsLCBwcm9wZXJ0eU5hbWU6IHN0cmluZyk6IHZvaWQge1xuXHRcdGNvbnN0IHByb3BQYXRoID1cblx0XHRcdChmaWVsZEluZm9Nb2RlbC5nZXRQcm9wZXJ0eShgL3ZhbHVlcy8ke3Byb3BlcnR5TmFtZX1gKSAmJiBcIi92YWx1ZXMvXCIpIHx8XG5cdFx0XHQoZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoYC91bml0RGF0YS8ke3Byb3BlcnR5TmFtZX1gKSAmJiBcIi91bml0RGF0YS9cIik7XG5cblx0XHRpZiAoZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoYCR7cHJvcFBhdGh9JHtwcm9wZXJ0eU5hbWV9L3ZhbHVlTGlzdEluZm9gKSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRjb25zdCB2YWx1ZUxpc3RJbmZvID0gZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoYCR7cHJvcFBhdGh9JHtwcm9wZXJ0eU5hbWV9L3ZhbHVlTGlzdEluZm9gKTtcblxuXHRcdGlmICghdmFsdWVMaXN0SW5mbykge1xuXHRcdFx0TWFzc0VkaXRIYW5kbGVycy5fcmVxdWVzdFZhbHVlTGlzdCh0cmFuc0N0eCwgc291cmNlLCBmaWVsZEluZm9Nb2RlbCwgcHJvcGVydHlOYW1lKTtcblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIFJlcXVlc3QgYW5kIHVwZGF0ZSBJbiBhbmQgT3V0IFBhcmFtZXRlcnMgaW4gdGhlIE1FRC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSB0cmFuc0N0eCBUaGUgdHJhbnNpZW50IGNvbnRleHQgb2YgdGhlIE1FRC5cblx0ICogQHBhcmFtIHNvdXJjZSBNREMgZmllbGQuXG5cdCAqIEBwYXJhbSBmaWVsZEluZm9Nb2RlbCBSdW50aW1lIG1vZGVsIHdpdGggcGFyYW1ldGVycyBzdG9yZSBpbmZvcm1hdGlvbi5cblx0ICogQHBhcmFtIHByb3BlcnR5TmFtZSBQcm9wZXJ0eSBwYXRoLlxuXHQgKi9cblx0X3JlcXVlc3RWYWx1ZUxpc3Q6IGZ1bmN0aW9uICh0cmFuc0N0eDogQ29udGV4dCwgc291cmNlOiBGaWVsZCwgZmllbGRJbmZvTW9kZWw6IEpTT05Nb2RlbCwgcHJvcGVydHlOYW1lOiBzdHJpbmcpOiB2b2lkIHtcblx0XHRjb25zdCBtZXRhUGF0aCA9IE1vZGVsSGVscGVyLmdldE1ldGFQYXRoRm9yQ29udGV4dCh0cmFuc0N0eCk7XG5cdFx0Y29uc3QgcHJvcGVydHlQYXRoID0gKG1ldGFQYXRoICYmIGAke21ldGFQYXRofS8ke3Byb3BlcnR5TmFtZX1gKSBhcyBzdHJpbmc7XG5cdFx0Y29uc3QgZGVwZW5kZW50cyA9IHNvdXJjZT8uZ2V0RGVwZW5kZW50cygpO1xuXHRcdGNvbnN0IGZpZWxkSGVscCA9IHNvdXJjZT8uZ2V0RmllbGRIZWxwKCk7XG5cdFx0Y29uc3QgZmllbGRWYWx1ZUhlbHAgPSBkZXBlbmRlbnRzPy5maW5kKChkZXBlbmRlbnQ6IGFueSkgPT4gZGVwZW5kZW50LmdldElkKCkgPT09IGZpZWxkSGVscCkgYXMgVmFsdWVIZWxwO1xuXHRcdGNvbnN0IHBheWxvYWQgPSAoZmllbGRWYWx1ZUhlbHAuZ2V0RGVsZWdhdGUoKSBhcyBhbnkpPy5wYXlsb2FkIGFzIFZhbHVlSGVscFBheWxvYWQ7XG5cdFx0aWYgKCFmaWVsZFZhbHVlSGVscD8uZ2V0QmluZGluZ0NvbnRleHQoKSkge1xuXHRcdFx0ZmllbGRWYWx1ZUhlbHA/LnNldEJpbmRpbmdDb250ZXh0KHRyYW5zQ3R4KTtcblx0XHR9XG5cdFx0Y29uc3QgbWV0YU1vZGVsID0gdHJhbnNDdHguZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKTtcblx0XHRWYWx1ZUxpc3RIZWxwZXIuY3JlYXRlVkhVSU1vZGVsKGZpZWxkVmFsdWVIZWxwLCBwcm9wZXJ0eVBhdGgsIG1ldGFNb2RlbCk7XG5cdFx0Y29uc3QgdmFsdWVMaXN0SW5mbyA9IFZhbHVlTGlzdEhlbHBlci5nZXRWYWx1ZUxpc3RJbmZvKGZpZWxkVmFsdWVIZWxwLCBwcm9wZXJ0eVBhdGgsIHBheWxvYWQpO1xuXG5cdFx0dmFsdWVMaXN0SW5mb1xuXHRcdFx0LnRoZW4oKHZMaW5mb3M6IFZhbHVlTGlzdEluZm9bXSkgPT4ge1xuXHRcdFx0XHRjb25zdCB2TGluZm8gPSB2TGluZm9zWzBdO1xuXHRcdFx0XHRjb25zdCBwcm9wUGF0aCA9XG5cdFx0XHRcdFx0KGZpZWxkSW5mb01vZGVsLmdldFByb3BlcnR5KGAvdmFsdWVzLyR7cHJvcGVydHlOYW1lfWApICYmIFwiL3ZhbHVlcy9cIikgfHxcblx0XHRcdFx0XHQoZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoYC91bml0RGF0YS8ke3Byb3BlcnR5TmFtZX1gKSAmJiBcIi91bml0RGF0YS9cIik7XG5cdFx0XHRcdGNvbnN0IGluZm86IGFueSA9IHtcblx0XHRcdFx0XHRpblBhcmFtZXRlcnM6XG5cdFx0XHRcdFx0XHR2TGluZm8udmhQYXJhbWV0ZXJzICYmIFZhbHVlTGlzdEhlbHBlci5nZXRJblBhcmFtZXRlcnModkxpbmZvLnZoUGFyYW1ldGVycykubWFwKChpblBhcmFtOiBhbnkpID0+IGluUGFyYW0uaGVscFBhdGgpLFxuXHRcdFx0XHRcdG91dFBhcmFtZXRlcnM6XG5cdFx0XHRcdFx0XHR2TGluZm8udmhQYXJhbWV0ZXJzICYmXG5cdFx0XHRcdFx0XHRWYWx1ZUxpc3RIZWxwZXIuZ2V0T3V0UGFyYW1ldGVycyh2TGluZm8udmhQYXJhbWV0ZXJzKS5tYXAoKG91dFBhcmFtOiBhbnkpID0+IG91dFBhcmFtLmhlbHBQYXRoKVxuXHRcdFx0XHR9O1xuXHRcdFx0XHRmaWVsZEluZm9Nb2RlbC5zZXRQcm9wZXJ0eShgJHtwcm9wUGF0aH0ke3Byb3BlcnR5TmFtZX0vdmFsdWVMaXN0SW5mb2AsIGluZm8pO1xuXHRcdFx0XHRpZiAoaW5mby5vdXRQYXJhbWV0ZXJzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRNYXNzRWRpdEhhbmRsZXJzLl91cGRhdGVGaWVsZFBhdGhTdWdnZXN0aW9ucyhmaWVsZEluZm9Nb2RlbCwgYC92YWx1ZXMvJHtwcm9wZXJ0eU5hbWV9YCwgZmFsc2UsIHRydWUpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKCgpID0+IHtcblx0XHRcdFx0TG9nLndhcm5pbmcoYE1hc3MgRWRpdDogQ291bGRuJ3QgbG9hZCB2YWx1ZUxpc3QgaW5mbyBmb3IgJHtwcm9wZXJ0eVBhdGh9YCk7XG5cdFx0XHR9KTtcblx0fSxcblxuXHQvKipcblx0ICogR2V0IGZpZWxkIGhlbHAgY29udHJvbCBmcm9tIE1EQyBmaWVsZC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSB0cmFuc0N0eCBUaGUgdHJhbnNpZW50IGNvbnRleHQgb2YgdGhlIE1FRC5cblx0ICogQHBhcmFtIHNvdXJjZSBNREMgZmllbGQuXG5cdCAqIEByZXR1cm5zIEZpZWxkIEhlbHAgY29udHJvbC5cblx0ICovXG5cdF9nZXRWYWx1ZUhlbHA6IGZ1bmN0aW9uICh0cmFuc0N0eDogQ29udGV4dCwgc291cmNlOiBGaWVsZCk6IGFueSB7XG5cdFx0Y29uc3QgZGVwZW5kZW50cyA9IHNvdXJjZT8uZ2V0RGVwZW5kZW50cygpO1xuXHRcdGNvbnN0IGZpZWxkSGVscCA9IHNvdXJjZT8uZ2V0RmllbGRIZWxwKCk7XG5cdFx0cmV0dXJuIGRlcGVuZGVudHM/LmZpbmQoKGRlcGVuZGVudDogYW55KSA9PiBkZXBlbmRlbnQuZ2V0SWQoKSA9PT0gZmllbGRIZWxwKTtcblx0fSxcblxuXHQvKipcblx0ICogQ29sbGVkIG9uIGRyb3AgZG93biBzZWxlY3Rpb24gb2YgVkhEIG9wdGlvbi5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSBzb3VyY2UgQ3VzdG9tIE1hc3MgRWRpdCBTZWxlY3QgY29udHJvbC5cblx0ICogQHBhcmFtIHByb3BlcnR5TmFtZSBQcm9wZXJ0eSBwYXRoLlxuXHQgKiBAcGFyYW0gc2VsZWN0S2V5IFByZXZpb3VzIGtleSBiZWZvcmUgdGhlIFZIRCB3YXMgc2VsZWN0ZWQuXG5cdCAqL1xuXHRfb25WSFNlbGVjdDogZnVuY3Rpb24gKHNvdXJjZTogYW55LCBwcm9wZXJ0eU5hbWU6IHN0cmluZywgc2VsZWN0S2V5OiBzdHJpbmcpOiB2b2lkIHtcblx0XHQvLyBDYWxsZWQgZm9yXG5cdFx0Ly8gMS4gVkhEIHNlbGVjdGVkLlxuXG5cdFx0Y29uc3QgZmllbGRJbmZvTW9kZWwgPSBzb3VyY2UgJiYgc291cmNlLmdldE1vZGVsKFwiZmllbGRzSW5mb1wiKTtcblx0XHRjb25zdCBwcm9wUGF0aCA9XG5cdFx0XHQoZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoYC92YWx1ZXMvJHtwcm9wZXJ0eU5hbWV9YCkgJiYgXCIvdmFsdWVzL1wiKSB8fFxuXHRcdFx0KGZpZWxkSW5mb01vZGVsLmdldFByb3BlcnR5KGAvdW5pdERhdGEvJHtwcm9wZXJ0eU5hbWV9YCkgJiYgXCIvdW5pdERhdGEvXCIpO1xuXHRcdGNvbnN0IHRyYW5zQ3R4ID0gc291cmNlLmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0Y29uc3QgZmllbGRWYWx1ZUhlbHAgPSBNYXNzRWRpdEhhbmRsZXJzLl9nZXRWYWx1ZUhlbHAodHJhbnNDdHgsIHNvdXJjZS5nZXRQYXJlbnQoKSk7XG5cdFx0aWYgKCFmaWVsZFZhbHVlSGVscD8uZ2V0QmluZGluZ0NvbnRleHQoKSkge1xuXHRcdFx0ZmllbGRWYWx1ZUhlbHA/LnNldEJpbmRpbmdDb250ZXh0KHRyYW5zQ3R4KTtcblx0XHR9XG5cdFx0c291cmNlLmZpcmVWYWx1ZUhlbHBSZXF1ZXN0KCk7XG5cblx0XHRmaWVsZEluZm9Nb2RlbC5zZXRQcm9wZXJ0eShgJHtwcm9wUGF0aCArIHByb3BlcnR5TmFtZX0vc2VsZWN0ZWRLZXlgLCBzZWxlY3RLZXkpO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBHZXRzIFByb3BlcnR5IG5hbWUgZnJvbSBzZWxlY3Rpb24ga2V5LlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQHBhcmFtIGtleSBTZWxlY3Rpb24ga2V5LlxuXHQgKiBAcmV0dXJucyBQcm9wZXJ0eSBuYW1lLlxuXHQgKi9cblx0X2dldFByb3BlcnR5TmFtZUZyb21LZXk6IGZ1bmN0aW9uIChrZXk6IHN0cmluZykge1xuXHRcdGxldCBwcm9wZXJ0eU5hbWUgPSBcIlwiO1xuXHRcdGlmIChrZXkuc3RhcnRzV2l0aChcIkRlZmF1bHQvXCIpIHx8IGtleS5zdGFydHNXaXRoKFwiQ2xlYXJGaWVsZFZhbHVlL1wiKSB8fCBrZXkuc3RhcnRzV2l0aChcIlVzZVZhbHVlSGVscFZhbHVlL1wiKSkge1xuXHRcdFx0cHJvcGVydHlOYW1lID0ga2V5LnN1YnN0cmluZyhrZXkuaW5kZXhPZihcIi9cIikgKyAxKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cHJvcGVydHlOYW1lID0ga2V5LnN1YnN0cmluZygwLCBrZXkubGFzdEluZGV4T2YoXCIvXCIpKTtcblx0XHR9XG5cdFx0cmV0dXJuIHByb3BlcnR5TmFtZTtcblx0fSxcblxuXHQvKipcblx0ICogVXBkYXRlIHNlbGVjdGlvbiB0byBDdXN0b20gTWFzcyBFZGl0IFNlbGVjdCBmcm9tIE1EQyBmaWVsZC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSBzb3VyY2UgTURDIGZpZWxkLlxuXHQgKiBAcGFyYW0gcHJvcGVydHlOYW1lIFByb3BlcnR5IHBhdGguXG5cdCAqIEBwYXJhbSB2YWx1ZSBWYWx1ZSB0byB1cGRhdGUuXG5cdCAqIEBwYXJhbSBmdWxsVGV4dCBGdWxsIHRleHQgdG8gdXNlLlxuXHQgKi9cblx0X3VwZGF0ZVNlbGVjdEtleTogZnVuY3Rpb24gKHNvdXJjZTogRmllbGQsIHByb3BlcnR5TmFtZTogc3RyaW5nLCB2YWx1ZTogYW55LCBmdWxsVGV4dD86IGFueSk6IHZvaWQge1xuXHRcdC8vIENhbGxlZCBmb3Jcblx0XHQvLyAxLiBWSEQgcHJvcGVydHkgY2hhbmdlXG5cdFx0Ly8gMi4gT3V0IFBhcmFtZXRlcnMuXG5cdFx0Ly8gMy4gVHJhbnNpZW50IGNvbnRleHQgcHJvcGVydHkgY2hhbmdlLlxuXG5cdFx0Y29uc3QgY29tYm9Cb3ggPSBzb3VyY2UuZ2V0Q29udGVudCgpIGFzIENvbWJvQm94O1xuXHRcdGlmICghY29tYm9Cb3ggfHwgIXByb3BlcnR5TmFtZSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRsZXQga2V5OiBzdHJpbmcgPSBjb21ib0JveC5nZXRTZWxlY3RlZEtleSgpO1xuXHRcdGlmICgoa2V5LnN0YXJ0c1dpdGgoXCJEZWZhdWx0L1wiKSB8fCBrZXkuc3RhcnRzV2l0aChcIkNsZWFyRmllbGRWYWx1ZS9cIikpICYmICF2YWx1ZSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNvbnN0IGZvcm1hdHRlZFRleHQgPSBNYXNzRWRpdEhhbmRsZXJzLl92YWx1ZUV4aXN0cyhmdWxsVGV4dCkgPyBmdWxsVGV4dCA6IHZhbHVlO1xuXHRcdGNvbnN0IGZpZWxkSW5mb01vZGVsID0gc291cmNlICYmIChzb3VyY2UuZ2V0TW9kZWwoXCJmaWVsZHNJbmZvXCIpIGFzIEpTT05Nb2RlbCk7XG5cdFx0Y29uc3QgdmFsdWVzID1cblx0XHRcdGZpZWxkSW5mb01vZGVsLmdldFByb3BlcnR5KGAvdmFsdWVzLyR7cHJvcGVydHlOYW1lfWApIHx8IGZpZWxkSW5mb01vZGVsLmdldFByb3BlcnR5KGAvdW5pdERhdGEvJHtwcm9wZXJ0eU5hbWV9YCkgfHwgW107XG5cdFx0Y29uc3QgcHJvcFBhdGggPVxuXHRcdFx0KGZpZWxkSW5mb01vZGVsLmdldFByb3BlcnR5KGAvdmFsdWVzLyR7cHJvcGVydHlOYW1lfWApICYmIFwiL3ZhbHVlcy9cIikgfHxcblx0XHRcdChmaWVsZEluZm9Nb2RlbC5nZXRQcm9wZXJ0eShgL3VuaXREYXRhLyR7cHJvcGVydHlOYW1lfWApICYmIFwiL3VuaXREYXRhL1wiKTtcblxuXHRcdGNvbnN0IHJlbGF0ZWRGaWVsZCA9IHZhbHVlcy5maW5kKChmaWVsZERhdGE6IGFueSkgPT4gZmllbGREYXRhPy50ZXh0SW5mbz8udmFsdWUgPT09IHZhbHVlIHx8IGZpZWxkRGF0YS50ZXh0ID09PSB2YWx1ZSk7XG5cblx0XHRpZiAocmVsYXRlZEZpZWxkKSB7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdGZ1bGxUZXh0ICYmXG5cdFx0XHRcdHJlbGF0ZWRGaWVsZC50ZXh0SW5mbyAmJlxuXHRcdFx0XHRyZWxhdGVkRmllbGQudGV4dEluZm8uZGVzY3JpcHRpb25QYXRoICYmXG5cdFx0XHRcdChyZWxhdGVkRmllbGQudGV4dCAhPSBmb3JtYXR0ZWRUZXh0IHx8IHJlbGF0ZWRGaWVsZC50ZXh0SW5mby5mdWxsVGV4dCAhPSBmb3JtYXR0ZWRUZXh0KVxuXHRcdFx0KSB7XG5cdFx0XHRcdC8vIFVwZGF0ZSB0aGUgZnVsbCB0ZXh0IG9ubHkgd2hlbiBwcm92aWRlZC5cblx0XHRcdFx0cmVsYXRlZEZpZWxkLnRleHQgPSBmb3JtYXR0ZWRUZXh0O1xuXHRcdFx0XHRyZWxhdGVkRmllbGQudGV4dEluZm8uZnVsbFRleHQgPSBmb3JtYXR0ZWRUZXh0O1xuXHRcdFx0XHRyZWxhdGVkRmllbGQudGV4dEluZm8uZGVzY3JpcHRpb24gPSBzb3VyY2UuZ2V0QWRkaXRpb25hbFZhbHVlKCk7XG5cdFx0XHR9XG5cdFx0XHRpZiAocmVsYXRlZEZpZWxkLmtleSA9PT0ga2V5KSB7XG5cdFx0XHRcdGZpZWxkSW5mb01vZGVsLnNldFByb3BlcnR5KGAke3Byb3BQYXRoICsgcHJvcGVydHlOYW1lfS9zZWxlY3RlZEtleWAsIGtleSk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGtleSA9IHJlbGF0ZWRGaWVsZC5rZXk7XG5cdFx0fSBlbHNlIGlmIChbdW5kZWZpbmVkLCBudWxsLCBcIlwiXS5pbmRleE9mKHZhbHVlKSA9PT0gLTEpIHtcblx0XHRcdGtleSA9IGAke3Byb3BlcnR5TmFtZX0vJHt2YWx1ZX1gO1xuXHRcdFx0Y29uc3Qgc2VsZWN0aW9uSW5mbyA9IHtcblx0XHRcdFx0dGV4dDogZm9ybWF0dGVkVGV4dCxcblx0XHRcdFx0a2V5LFxuXHRcdFx0XHR0ZXh0SW5mbzoge1xuXHRcdFx0XHRcdGRlc2NyaXB0aW9uOiBzb3VyY2UuZ2V0QWRkaXRpb25hbFZhbHVlKCksXG5cdFx0XHRcdFx0ZGVzY3JpcHRpb25QYXRoOiB2YWx1ZXMgJiYgdmFsdWVzLnRleHRJbmZvICYmIHZhbHVlcy50ZXh0SW5mby5kZXNjcmlwdGlvblBhdGgsXG5cdFx0XHRcdFx0ZnVsbFRleHQ6IGZvcm1hdHRlZFRleHQsXG5cdFx0XHRcdFx0dGV4dEFycmFuZ2VtZW50OiBzb3VyY2UuZ2V0RGlzcGxheSgpLFxuXHRcdFx0XHRcdHZhbHVlOiBzb3VyY2UuZ2V0VmFsdWUoKSxcblx0XHRcdFx0XHR2YWx1ZVBhdGg6IHByb3BlcnR5TmFtZVxuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXHRcdFx0dmFsdWVzLnB1c2goc2VsZWN0aW9uSW5mbyk7XG5cdFx0XHR2YWx1ZXMuc2VsZWN0T3B0aW9ucyA9IHZhbHVlcy5zZWxlY3RPcHRpb25zIHx8IFtdO1xuXHRcdFx0dmFsdWVzLnNlbGVjdE9wdGlvbnMucHVzaChzZWxlY3Rpb25JbmZvKTtcblx0XHRcdGZpZWxkSW5mb01vZGVsLnNldFByb3BlcnR5KHByb3BQYXRoICsgcHJvcGVydHlOYW1lLCB2YWx1ZXMpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRrZXkgPSBgRGVmYXVsdC8ke3Byb3BlcnR5TmFtZX1gO1xuXHRcdH1cblxuXHRcdGZpZWxkSW5mb01vZGVsLnNldFByb3BlcnR5KGAke3Byb3BQYXRoICsgcHJvcGVydHlOYW1lfS9zZWxlY3RlZEtleWAsIGtleSk7XG5cdFx0TWFzc0VkaXRIYW5kbGVycy5fdXBkYXRlUmVzdWx0cyhjb21ib0JveCk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEdldCBWYWx1ZSBmcm9tIERyb3AgZG93bi5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSBzb3VyY2UgRHJvcCBkb3duIGNvbnRyb2wuXG5cdCAqIEByZXR1cm5zIFZhbHVlIG9mIHNlbGVjdGlvbi5cblx0ICovXG5cdF9nZXRWYWx1ZTogZnVuY3Rpb24gKHNvdXJjZTogQ29udHJvbCkge1xuXHRcdHJldHVybiBzb3VyY2UuZ2V0TWV0YWRhdGEoKS5nZXROYW1lKCkgPT09IFwic2FwLmZlLmNvcmUuY29udHJvbHMuTWFzc0VkaXRTZWxlY3RcIlxuXHRcdFx0PyAoc291cmNlIGFzIFNlbGVjdCkuZ2V0U2VsZWN0ZWRJdGVtKCk/LmdldFRleHQoKVxuXHRcdFx0OiAoc291cmNlIGFzIENvbWJvQm94KS5nZXRWYWx1ZSgpO1xuXHR9LFxuXG5cdF9nZXRWYWx1ZU9uRW1wdHk6IGZ1bmN0aW9uIChvU291cmNlOiBhbnksIGZpZWxkc0luZm9Nb2RlbDogSlNPTk1vZGVsLCB2YWx1ZTogYW55LCBzUHJvcGVydHlOYW1lOiBzdHJpbmcpIHtcblx0XHRpZiAoIXZhbHVlKSB7XG5cdFx0XHRjb25zdCB2YWx1ZXMgPVxuXHRcdFx0XHRmaWVsZHNJbmZvTW9kZWwuZ2V0UHJvcGVydHkoYC92YWx1ZXMvJHtzUHJvcGVydHlOYW1lfWApIHx8IGZpZWxkc0luZm9Nb2RlbC5nZXRQcm9wZXJ0eShgL3VuaXREYXRhLyR7c1Byb3BlcnR5TmFtZX1gKSB8fCBbXTtcblx0XHRcdGlmICh2YWx1ZXMudW5pdFByb3BlcnR5KSB7XG5cdFx0XHRcdHZhbHVlID0gMDtcblx0XHRcdFx0b1NvdXJjZS5zZXRWYWx1ZSh2YWx1ZSk7XG5cdFx0XHR9IGVsc2UgaWYgKHZhbHVlcy5pbnB1dFR5cGUgPT09IFwiQ2hlY2tCb3hcIikge1xuXHRcdFx0XHR2YWx1ZSA9IGZhbHNlO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gdmFsdWU7XG5cdH0sXG5cblx0X3ZhbHVlRXhpc3RzOiBmdW5jdGlvbiAodmFsdWU6IGFueSkge1xuXHRcdHJldHVybiB2YWx1ZSAhPSB1bmRlZmluZWQgJiYgdmFsdWUgIT0gbnVsbDtcblx0fSxcblxuXHQvKipcblx0ICogVXBkYXRlcyBzZWxlY3Rpb25zIHRvIHJ1bnRpbWUgbW9kZWwuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAcGFyYW0gb1NvdXJjZSBEcm9wIGRvd24gY29udHJvbC5cblx0ICogQHBhcmFtIGFQYXJhbXMgUGFydHMgb2Yga2V5IGluIHJ1bnRpbWUgbW9kZWwuXG5cdCAqIEBwYXJhbSB1cGRhdGVUcmFuc0N0eCBTaG91bGQgdHJhbnNpZW50IGNvbnRleHQgYmUgdXBkYXRlZCB3aXRoIHRoZSB2YWx1ZS5cblx0ICovXG5cdF91cGRhdGVSZXN1bHRzOiBmdW5jdGlvbiAob1NvdXJjZTogYW55LCBhUGFyYW1zOiBBcnJheTxzdHJpbmc+ID0gW10sIHVwZGF0ZVRyYW5zQ3R4OiBib29sZWFuKSB7XG5cdFx0Ly8gQ2FsbGVkIGZvclxuXHRcdC8vIDEuIFZIRCBwcm9wZXJ0eSBjaGFuZ2UuXG5cdFx0Ly8gMi4gT3V0IHBhcmFtZXRlci5cblx0XHQvLyAzLiB0cmFuc2llbnQgY29udGV4dCBwcm9wZXJ0eSBjaGFuZ2UuXG5cdFx0Y29uc3QgZmllbGRzSW5mb01vZGVsID0gb1NvdXJjZSAmJiBvU291cmNlLmdldE1vZGVsKFwiZmllbGRzSW5mb1wiKTtcblx0XHRjb25zdCBvRmllbGRzSW5mb0RhdGEgPSBmaWVsZHNJbmZvTW9kZWwgJiYgZmllbGRzSW5mb01vZGVsLmdldERhdGEoKTtcblx0XHRsZXQgdmFsdWUgPSBNYXNzRWRpdEhhbmRsZXJzLl9nZXRWYWx1ZShvU291cmNlIGFzIENvbnRyb2wpO1xuXHRcdGFQYXJhbXMgPSBhUGFyYW1zLmxlbmd0aCA+IDAgPyBhUGFyYW1zIDogb1NvdXJjZSAmJiBvU291cmNlLmdldFNlbGVjdGVkS2V5KCkgJiYgb1NvdXJjZS5nZXRTZWxlY3RlZEtleSgpLnNwbGl0KFwiL1wiKTtcblxuXHRcdGxldCBvRGF0YU9iamVjdDtcblx0XHRjb25zdCBzUHJvcGVydHlOYW1lID0gb1NvdXJjZS5kYXRhKFwiZmllbGRQYXRoXCIpO1xuXG5cdFx0aWYgKGFQYXJhbXNbMF0gPT09IFwiRGVmYXVsdFwiKSB7XG5cdFx0XHRvRGF0YU9iamVjdCA9IHtcblx0XHRcdFx0a2V5VmFsdWU6IGFQYXJhbXNbMV0sXG5cdFx0XHRcdHZhbHVlOiBhUGFyYW1zWzBdXG5cdFx0XHR9O1xuXHRcdH0gZWxzZSBpZiAoYVBhcmFtc1swXSA9PT0gXCJDbGVhckZpZWxkVmFsdWVcIikge1xuXHRcdFx0dmFsdWUgPSBcIlwiO1xuXHRcdFx0dmFsdWUgPSBNYXNzRWRpdEhhbmRsZXJzLl9nZXRWYWx1ZU9uRW1wdHkob1NvdXJjZSwgZmllbGRzSW5mb01vZGVsLCB2YWx1ZSwgc1Byb3BlcnR5TmFtZSk7XG5cdFx0XHRvRGF0YU9iamVjdCA9IHtcblx0XHRcdFx0a2V5VmFsdWU6IGFQYXJhbXNbMV0sXG5cdFx0XHRcdHZhbHVlOiB2YWx1ZVxuXHRcdFx0fTtcblx0XHR9IGVsc2UgaWYgKCFhUGFyYW1zKSB7XG5cdFx0XHR2YWx1ZSA9IE1hc3NFZGl0SGFuZGxlcnMuX2dldFZhbHVlT25FbXB0eShvU291cmNlLCBmaWVsZHNJbmZvTW9kZWwsIHZhbHVlLCBzUHJvcGVydHlOYW1lKTtcblx0XHRcdG9EYXRhT2JqZWN0ID0ge1xuXHRcdFx0XHRrZXlWYWx1ZTogc1Byb3BlcnR5TmFtZSxcblx0XHRcdFx0dmFsdWU6IHZhbHVlXG5cdFx0XHR9O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zdCBwcm9wZXJ0eU5hbWUgPSBhUGFyYW1zLnNsaWNlKDAsIC0xKS5qb2luKFwiL1wiKTtcblx0XHRcdGNvbnN0IHByb3BlcnR5VmFsdWVzID1cblx0XHRcdFx0ZmllbGRzSW5mb01vZGVsLmdldFByb3BlcnR5KGAvdmFsdWVzLyR7cHJvcGVydHlOYW1lfWApIHx8IGZpZWxkc0luZm9Nb2RlbC5nZXRQcm9wZXJ0eShgL3VuaXREYXRhLyR7cHJvcGVydHlOYW1lfWApIHx8IFtdO1xuXG5cdFx0XHRjb25zdCByZWxhdGVkRmllbGQgPSAocHJvcGVydHlWYWx1ZXMgfHwgW10pLmZpbmQoZnVuY3Rpb24gKG9GaWVsZERhdGE6IGFueSkge1xuXHRcdFx0XHRyZXR1cm4gb0ZpZWxkRGF0YT8udGV4dEluZm8/LnZhbHVlID09PSB2YWx1ZSB8fCBvRmllbGREYXRhLnRleHQgPT09IHZhbHVlO1xuXHRcdFx0fSk7XG5cdFx0XHRvRGF0YU9iamVjdCA9IHtcblx0XHRcdFx0a2V5VmFsdWU6IHByb3BlcnR5TmFtZSxcblx0XHRcdFx0dmFsdWU6XG5cdFx0XHRcdFx0cmVsYXRlZEZpZWxkLnRleHRJbmZvICYmIE1hc3NFZGl0SGFuZGxlcnMuX3ZhbHVlRXhpc3RzKHJlbGF0ZWRGaWVsZC50ZXh0SW5mby52YWx1ZSlcblx0XHRcdFx0XHRcdD8gcmVsYXRlZEZpZWxkLnRleHRJbmZvLnZhbHVlXG5cdFx0XHRcdFx0XHQ6IHJlbGF0ZWRGaWVsZC50ZXh0XG5cdFx0XHR9O1xuXHRcdH1cblx0XHRsZXQgYkV4aXN0aW5nRWxlbWVudGluZGV4ID0gLTE7XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBvRmllbGRzSW5mb0RhdGEucmVzdWx0cy5sZW5ndGg7IGkrKykge1xuXHRcdFx0aWYgKG9GaWVsZHNJbmZvRGF0YS5yZXN1bHRzW2ldLmtleVZhbHVlID09PSBvRGF0YU9iamVjdC5rZXlWYWx1ZSkge1xuXHRcdFx0XHRiRXhpc3RpbmdFbGVtZW50aW5kZXggPSBpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAoYkV4aXN0aW5nRWxlbWVudGluZGV4ICE9PSAtMSkge1xuXHRcdFx0b0ZpZWxkc0luZm9EYXRhLnJlc3VsdHNbYkV4aXN0aW5nRWxlbWVudGluZGV4XSA9IG9EYXRhT2JqZWN0O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRvRmllbGRzSW5mb0RhdGEucmVzdWx0cy5wdXNoKG9EYXRhT2JqZWN0KTtcblx0XHR9XG5cdFx0aWYgKHVwZGF0ZVRyYW5zQ3R4ICYmICFvRGF0YU9iamVjdC5rZXlWYWx1ZS5pbmNsdWRlcyhcIi9cIikpIHtcblx0XHRcdGNvbnN0IHRyYW5zQ3R4ID0gb1NvdXJjZS5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdFx0aWYgKGFQYXJhbXNbMF0gPT09IFwiRGVmYXVsdFwiIHx8IGFQYXJhbXNbMF0gPT09IFwiQ2xlYXJGaWVsZFZhbHVlXCIpIHtcblx0XHRcdFx0dHJhbnNDdHguc2V0UHJvcGVydHkob0RhdGFPYmplY3Qua2V5VmFsdWUsIG51bGwpO1xuXHRcdFx0fSBlbHNlIGlmIChvRGF0YU9iamVjdCkge1xuXHRcdFx0XHR0cmFuc0N0eC5zZXRQcm9wZXJ0eShvRGF0YU9iamVjdC5rZXlWYWx1ZSwgb0RhdGFPYmplY3QudmFsdWUpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufTtcblxuZXhwb3J0IGRlZmF1bHQgTWFzc0VkaXRIYW5kbGVycztcbiJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQUE7QUFBQTs7OztFQXVCQSxJQUFNQSxnQkFBcUIsR0FBRztJQUM3QjtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0lBQ0NDLHFCQUFxQixFQUFFLFVBQVVDLFFBQWEsRUFBRUMsWUFBb0IsRUFBRUMsVUFBa0IsRUFBRTtNQUN6RjtNQUNBO01BQ0E7O01BRUEsSUFBTUMsTUFBTSxHQUFHQyxJQUFJLENBQUNDLElBQUksQ0FBQ0gsVUFBVSxDQUFVO01BQzdDLElBQU1JLFFBQVEsR0FBR0gsTUFBTSxJQUFLQSxNQUFNLENBQUNJLGlCQUFpQixFQUFjO01BQ2xFLElBQU1DLGNBQWMsR0FBR0wsTUFBTSxJQUFLQSxNQUFNLENBQUNNLFFBQVEsQ0FBQyxZQUFZLENBQWU7TUFDN0UsSUFBTUMsTUFBTSxHQUNYRixjQUFj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