@sapui5/sap.fe.core 1.100.0 → 1.102.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 (295) hide show
  1. package/package.json +4 -4
  2. package/src/sap/fe/core/.library +2 -3
  3. package/src/sap/fe/core/AppComponent.js +23 -30
  4. package/src/sap/fe/core/AppComponent.ts +35 -40
  5. package/src/sap/fe/core/AppStateHandler.js +8 -8
  6. package/src/sap/fe/core/AppStateHandler.ts +11 -11
  7. package/src/sap/fe/core/BaseController.js +9 -9
  8. package/src/sap/fe/core/BaseController.ts +3 -4
  9. package/src/sap/fe/core/CommonUtils.js +122 -101
  10. package/src/sap/fe/core/CommonUtils.ts +239 -193
  11. package/src/sap/fe/core/ExtensionAPI.js +12 -13
  12. package/src/sap/fe/core/ExtensionAPI.ts +21 -31
  13. package/src/sap/fe/core/PageController.js +19 -13
  14. package/src/sap/fe/core/PageController.ts +40 -34
  15. package/src/sap/fe/core/TemplateComponent.js +198 -123
  16. package/src/sap/fe/core/TemplateComponent.ts +109 -121
  17. package/src/sap/fe/core/TemplateModel.js +7 -9
  18. package/src/sap/fe/core/TemplateModel.ts +3 -3
  19. package/src/sap/fe/core/buildingBlocks/AttributeModel.js +60 -0
  20. package/src/sap/fe/core/buildingBlocks/AttributeModel.ts +37 -0
  21. package/src/sap/fe/core/buildingBlocks/BuildingBlock.js +165 -0
  22. package/src/sap/fe/core/buildingBlocks/BuildingBlock.ts +178 -0
  23. package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.js +935 -0
  24. package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.ts +837 -0
  25. package/src/sap/fe/core/buildingBlocks/TraceInfo.js +436 -0
  26. package/src/sap/fe/core/buildingBlocks/TraceInfo.ts +431 -0
  27. package/src/sap/fe/core/{BusyLocker.js → controllerextensions/BusyLocker.js} +1 -1
  28. package/src/sap/fe/core/{BusyLocker.ts → controllerextensions/BusyLocker.ts} +7 -7
  29. package/src/sap/fe/core/controllerextensions/EditFlow.js +660 -288
  30. package/src/sap/fe/core/controllerextensions/EditFlow.ts +513 -331
  31. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +11 -11
  32. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +6 -7
  33. package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +43 -25
  34. package/src/sap/fe/core/controllerextensions/InternalEditFlow.ts +132 -103
  35. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +16 -16
  36. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +64 -55
  37. package/src/sap/fe/core/controllerextensions/InternalRouting.js +166 -99
  38. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +187 -149
  39. package/src/sap/fe/core/controllerextensions/KPIManagement.js +14 -14
  40. package/src/sap/fe/core/controllerextensions/KPIManagement.ts +12 -11
  41. package/src/sap/fe/core/controllerextensions/MassEdit.js +13 -12
  42. package/src/sap/fe/core/controllerextensions/MassEdit.ts +22 -22
  43. package/src/sap/fe/core/controllerextensions/MessageHandler.js +14 -26
  44. package/src/sap/fe/core/controllerextensions/MessageHandler.ts +20 -30
  45. package/src/sap/fe/core/controllerextensions/PageReady.js +25 -23
  46. package/src/sap/fe/core/controllerextensions/PageReady.ts +49 -47
  47. package/src/sap/fe/core/controllerextensions/Paginator.js +24 -15
  48. package/src/sap/fe/core/controllerextensions/Paginator.ts +35 -20
  49. package/src/sap/fe/core/controllerextensions/Placeholder.js +10 -10
  50. package/src/sap/fe/core/controllerextensions/Placeholder.ts +12 -14
  51. package/src/sap/fe/core/controllerextensions/Routing.js +11 -11
  52. package/src/sap/fe/core/controllerextensions/Routing.ts +12 -13
  53. package/src/sap/fe/core/controllerextensions/Share.js +34 -16
  54. package/src/sap/fe/core/controllerextensions/Share.ts +50 -32
  55. package/src/sap/fe/core/controllerextensions/SideEffects.js +15 -15
  56. package/src/sap/fe/core/controllerextensions/SideEffects.ts +64 -65
  57. package/src/sap/fe/core/controllerextensions/ViewState.js +27 -31
  58. package/src/sap/fe/core/controllerextensions/ViewState.ts +103 -102
  59. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js +105 -0
  60. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.ts +98 -0
  61. package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.js +360 -0
  62. package/src/sap/fe/core/{actions → controllerextensions}/collaboration/ActivitySync.ts +90 -132
  63. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +146 -0
  64. package/src/sap/fe/core/{actions → controllerextensions}/collaboration/CollaborationCommon.ts +18 -8
  65. package/src/sap/fe/core/controllerextensions/collaboration/Manage.js +264 -0
  66. package/src/sap/fe/core/{actions → controllerextensions}/collaboration/Manage.ts +35 -33
  67. package/src/sap/fe/core/controllerextensions/collaboration/ManageDialog.fragment.xml +100 -0
  68. package/src/sap/fe/core/{actions → controllerextensions}/collaboration/UserDetails.fragment.xml +5 -7
  69. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +1584 -0
  70. package/src/sap/fe/core/{TransactionHelper.ts → controllerextensions/editFlow/TransactionHelper.ts} +190 -159
  71. package/src/sap/fe/core/controllerextensions/editFlow/draft.js +780 -0
  72. package/src/sap/fe/core/{actions → controllerextensions/editFlow}/draft.ts +329 -76
  73. package/src/sap/fe/core/controllerextensions/editFlow/operations.js +1149 -0
  74. package/src/sap/fe/core/{actions → controllerextensions/editFlow}/operations.ts +169 -97
  75. package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +190 -0
  76. package/src/sap/fe/core/{actions → controllerextensions/editFlow}/sticky.ts +76 -12
  77. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +592 -0
  78. package/src/sap/fe/core/{actions → controllerextensions/messageHandler}/messageHandling.ts +83 -60
  79. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +940 -0
  80. package/src/sap/fe/core/{RouterProxy.ts → controllerextensions/routing/RouterProxy.ts} +52 -36
  81. package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +21 -18
  82. package/src/sap/fe/core/controls/Any.js +28 -0
  83. package/src/sap/fe/core/controls/Any.ts +30 -0
  84. package/src/sap/fe/core/controls/CommandExecution.js +50 -16
  85. package/src/sap/fe/core/controls/CommandExecution.ts +31 -22
  86. package/src/sap/fe/core/controls/ConditionalWrapper.js +136 -65
  87. package/src/sap/fe/core/controls/ConditionalWrapper.ts +49 -58
  88. package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.js +371 -0
  89. package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.ts +282 -0
  90. package/src/sap/fe/core/controls/CustomQuickViewPage.js +74 -36
  91. package/src/sap/fe/core/controls/CustomQuickViewPage.ts +23 -32
  92. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossDraft.fragment.xml +52 -5
  93. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +127 -67
  94. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.ts +127 -67
  95. package/src/sap/fe/core/controls/FieldWrapper.js +171 -87
  96. package/src/sap/fe/core/controls/FieldWrapper.ts +69 -80
  97. package/src/sap/fe/core/controls/FileWrapper.js +360 -0
  98. package/src/sap/fe/core/controls/FileWrapper.ts +202 -0
  99. package/src/sap/fe/core/controls/FilterBar.js +154 -119
  100. package/src/sap/fe/core/controls/FilterBar.ts +128 -123
  101. package/src/sap/fe/core/controls/FormElementWrapper.js +102 -37
  102. package/src/sap/fe/core/controls/FormElementWrapper.ts +43 -35
  103. package/src/sap/fe/core/controls/MassEditSelect.js +33 -0
  104. package/src/sap/fe/core/controls/MassEditSelect.ts +45 -0
  105. package/src/sap/fe/core/controls/filterbar/FilterContainer.js +111 -89
  106. package/src/sap/fe/core/controls/filterbar/FilterContainer.ts +86 -82
  107. package/src/sap/fe/core/controls/filterbar/VisualFilter.js +242 -193
  108. package/src/sap/fe/core/controls/filterbar/VisualFilter.ts +211 -204
  109. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +152 -116
  110. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.ts +105 -105
  111. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +2 -2
  112. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +23 -28
  113. package/src/sap/fe/core/controls/massEdit/MassEditDialog.fragment.xml +41 -81
  114. package/src/sap/fe/core/controls/massEdit/MassEditField.fragment.xml +107 -0
  115. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +550 -35
  116. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.ts +604 -35
  117. package/src/sap/fe/core/converters/ManifestSettings.js +3 -1
  118. package/src/sap/fe/core/converters/ManifestSettings.ts +9 -2
  119. package/src/sap/fe/core/converters/MetaModelConverter.js +11 -40
  120. package/src/sap/fe/core/converters/MetaModelConverter.ts +56 -84
  121. package/src/sap/fe/core/converters/annotations/DataField.js +20 -5
  122. package/src/sap/fe/core/converters/annotations/DataField.ts +27 -6
  123. package/src/sap/fe/core/converters/controls/Common/Action.js +14 -21
  124. package/src/sap/fe/core/converters/controls/Common/Action.ts +23 -28
  125. package/src/sap/fe/core/converters/controls/Common/Chart.js +17 -10
  126. package/src/sap/fe/core/converters/controls/Common/Chart.ts +20 -14
  127. package/src/sap/fe/core/converters/controls/Common/Form.js +16 -18
  128. package/src/sap/fe/core/converters/controls/Common/Form.ts +20 -20
  129. package/src/sap/fe/core/converters/controls/Common/KPI.js +1 -1
  130. package/src/sap/fe/core/converters/controls/Common/KPI.ts +2 -3
  131. package/src/sap/fe/core/converters/controls/Common/Table.js +389 -173
  132. package/src/sap/fe/core/converters/controls/Common/Table.ts +440 -244
  133. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +26 -16
  134. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +27 -19
  135. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +78 -47
  136. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +146 -107
  137. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +6 -6
  138. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.ts +20 -18
  139. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +30 -25
  140. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +39 -34
  141. package/src/sap/fe/core/converters/helpers/Aggregation.js +10 -2
  142. package/src/sap/fe/core/converters/helpers/Aggregation.ts +18 -13
  143. package/src/sap/fe/core/converters/helpers/BindingHelper.js +3 -2
  144. package/src/sap/fe/core/converters/helpers/BindingHelper.ts +6 -5
  145. package/src/sap/fe/core/converters/objectPage/FormMenuActions.js +1 -1
  146. package/src/sap/fe/core/converters/objectPage/FormMenuActions.ts +0 -4
  147. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +27 -24
  148. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +49 -40
  149. package/src/sap/fe/core/converters/templates/ListReportConverter.js +33 -22
  150. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +77 -62
  151. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +28 -28
  152. package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +38 -45
  153. package/src/sap/fe/core/designtime/AppComponent.designtime.js +3 -3
  154. package/src/sap/fe/core/designtime/AppComponent.designtime.ts +8 -6
  155. package/src/sap/fe/core/formatters/KPIFormatter.js +3 -12
  156. package/src/sap/fe/core/formatters/KPIFormatter.ts +3 -2
  157. package/src/sap/fe/core/formatters/TableFormatter.js +74 -13
  158. package/src/sap/fe/core/formatters/TableFormatter.ts +71 -16
  159. package/src/sap/fe/core/formatters/ValueFormatter.js +4 -4
  160. package/src/sap/fe/core/formatters/ValueFormatter.ts +4 -7
  161. package/src/sap/fe/core/fpm/Component.js +46 -17
  162. package/src/sap/fe/core/fpm/Component.ts +11 -16
  163. package/src/sap/fe/core/helpers/AppStartupHelper.js +4 -4
  164. package/src/sap/fe/core/helpers/AppStartupHelper.ts +3 -3
  165. package/src/sap/fe/core/helpers/BindingExpression.js +10 -7
  166. package/src/sap/fe/core/helpers/BindingExpression.ts +37 -35
  167. package/src/sap/fe/core/helpers/ClassSupport.js +273 -256
  168. package/src/sap/fe/core/helpers/ClassSupport.ts +315 -237
  169. package/src/sap/fe/core/helpers/FPMHelper.js +3 -2
  170. package/src/sap/fe/core/helpers/FPMHelper.ts +9 -8
  171. package/src/sap/fe/core/helpers/MassEditHelper.js +522 -147
  172. package/src/sap/fe/core/helpers/MassEditHelper.ts +563 -236
  173. package/src/sap/fe/core/helpers/ModelHelper.js +29 -1
  174. package/src/sap/fe/core/helpers/ModelHelper.ts +39 -26
  175. package/src/sap/fe/core/helpers/PasteHelper.js +4 -4
  176. package/src/sap/fe/core/helpers/PasteHelper.ts +4 -3
  177. package/src/sap/fe/core/helpers/SemanticDateOperators.js +3 -3
  178. package/src/sap/fe/core/helpers/SemanticDateOperators.ts +3 -1
  179. package/src/sap/fe/core/helpers/SemanticKeyHelper.js +1 -1
  180. package/src/sap/fe/core/helpers/SemanticKeyHelper.ts +1 -1
  181. package/src/sap/fe/core/helpers/StableIdHelper.js +5 -7
  182. package/src/sap/fe/core/helpers/StableIdHelper.ts +8 -8
  183. package/src/sap/fe/core/{Synchronization.js → helpers/Synchronization.js} +1 -1
  184. package/src/sap/fe/core/{Synchronization.ts → helpers/Synchronization.ts} +1 -1
  185. package/src/sap/fe/core/jsx-runtime/jsx.js +35 -5
  186. package/src/sap/fe/core/jsx-runtime/jsx.ts +22 -8
  187. package/src/sap/fe/core/library.js +13 -5
  188. package/src/sap/fe/core/library.ts +26 -17
  189. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +1 -1
  190. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +0 -3
  191. package/src/sap/fe/core/messagebundle.properties +135 -180
  192. package/src/sap/fe/core/messagebundle_ar.properties +31 -64
  193. package/src/sap/fe/core/messagebundle_bg.properties +31 -64
  194. package/src/sap/fe/core/messagebundle_ca.properties +31 -64
  195. package/src/sap/fe/core/messagebundle_cs.properties +31 -64
  196. package/src/sap/fe/core/messagebundle_cy.properties +32 -65
  197. package/src/sap/fe/core/messagebundle_da.properties +31 -64
  198. package/src/sap/fe/core/messagebundle_de.properties +29 -62
  199. package/src/sap/fe/core/messagebundle_el.properties +32 -65
  200. package/src/sap/fe/core/messagebundle_en.properties +32 -65
  201. package/src/sap/fe/core/messagebundle_en_GB.properties +29 -62
  202. package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +41 -74
  203. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +32 -65
  204. package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +20 -6
  205. package/src/sap/fe/core/messagebundle_es.properties +31 -64
  206. package/src/sap/fe/core/messagebundle_es_MX.properties +31 -64
  207. package/src/sap/fe/core/messagebundle_et.properties +31 -64
  208. package/src/sap/fe/core/messagebundle_fi.properties +29 -62
  209. package/src/sap/fe/core/messagebundle_fr.properties +36 -69
  210. package/src/sap/fe/core/messagebundle_fr_CA.properties +33 -66
  211. package/src/sap/fe/core/messagebundle_hi.properties +29 -62
  212. package/src/sap/fe/core/messagebundle_hr.properties +32 -65
  213. package/src/sap/fe/core/messagebundle_hu.properties +30 -63
  214. package/src/sap/fe/core/messagebundle_id.properties +32 -65
  215. package/src/sap/fe/core/messagebundle_it.properties +31 -64
  216. package/src/sap/fe/core/messagebundle_iw.properties +31 -64
  217. package/src/sap/fe/core/messagebundle_ja.properties +29 -62
  218. package/src/sap/fe/core/messagebundle_kk.properties +31 -64
  219. package/src/sap/fe/core/messagebundle_ko.properties +31 -64
  220. package/src/sap/fe/core/messagebundle_lt.properties +31 -64
  221. package/src/sap/fe/core/messagebundle_lv.properties +32 -65
  222. package/src/sap/fe/core/messagebundle_ms.properties +31 -64
  223. package/src/sap/fe/core/messagebundle_nl.properties +31 -64
  224. package/src/sap/fe/core/messagebundle_no.properties +31 -64
  225. package/src/sap/fe/core/messagebundle_pl.properties +34 -67
  226. package/src/sap/fe/core/messagebundle_pt.properties +32 -65
  227. package/src/sap/fe/core/messagebundle_pt_PT.properties +31 -64
  228. package/src/sap/fe/core/messagebundle_ro.properties +33 -66
  229. package/src/sap/fe/core/messagebundle_ru.properties +33 -66
  230. package/src/sap/fe/core/messagebundle_sh.properties +31 -64
  231. package/src/sap/fe/core/messagebundle_sk.properties +31 -64
  232. package/src/sap/fe/core/messagebundle_sl.properties +29 -62
  233. package/src/sap/fe/core/messagebundle_sv.properties +30 -63
  234. package/src/sap/fe/core/messagebundle_th.properties +31 -64
  235. package/src/sap/fe/core/messagebundle_tr.properties +31 -64
  236. package/src/sap/fe/core/messagebundle_uk.properties +32 -65
  237. package/src/sap/fe/core/messagebundle_vi.properties +31 -64
  238. package/src/sap/fe/core/messagebundle_zh_CN.properties +32 -65
  239. package/src/sap/fe/core/messagebundle_zh_TW.properties +34 -67
  240. package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +4 -4
  241. package/src/sap/fe/core/services/AsyncComponentServiceFactory.ts +1 -1
  242. package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +5 -5
  243. package/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +1 -2
  244. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +11 -8
  245. package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +15 -13
  246. package/src/sap/fe/core/services/NavigationServiceFactory.js +5 -5
  247. package/src/sap/fe/core/services/NavigationServiceFactory.ts +9 -5
  248. package/src/sap/fe/core/services/ResourceModelServiceFactory.js +4 -4
  249. package/src/sap/fe/core/services/ResourceModelServiceFactory.ts +1 -1
  250. package/src/sap/fe/core/services/RoutingServiceFactory.js +105 -66
  251. package/src/sap/fe/core/services/RoutingServiceFactory.ts +59 -49
  252. package/src/sap/fe/core/services/ShellServicesFactory.js +104 -29
  253. package/src/sap/fe/core/services/ShellServicesFactory.ts +64 -30
  254. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +4 -4
  255. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +1 -1
  256. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +11 -10
  257. package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +38 -51
  258. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +43 -5
  259. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.ts +6 -3
  260. package/src/sap/fe/core/support/CommonHelper.js +1 -1
  261. package/src/sap/fe/core/support/CommonHelper.ts +0 -3
  262. package/src/sap/fe/core/templating/DataModelPathHelper.js +2 -9
  263. package/src/sap/fe/core/templating/DataModelPathHelper.ts +32 -38
  264. package/src/sap/fe/core/templating/DisplayModeFormatter.js +23 -3
  265. package/src/sap/fe/core/templating/DisplayModeFormatter.ts +27 -6
  266. package/src/sap/fe/core/templating/EntitySetHelper.js +1 -9
  267. package/src/sap/fe/core/templating/EntitySetHelper.ts +11 -13
  268. package/src/sap/fe/core/templating/FilterHelper.js +4 -4
  269. package/src/sap/fe/core/templating/FilterHelper.ts +6 -5
  270. package/src/sap/fe/core/templating/PropertyHelper.js +70 -33
  271. package/src/sap/fe/core/templating/PropertyHelper.ts +49 -27
  272. package/src/sap/fe/core/templating/UIFormatters.js +133 -22
  273. package/src/sap/fe/core/templating/UIFormatters.ts +144 -50
  274. package/src/sap/fe/core/type/DateTimeWithTimezone.js +47 -0
  275. package/src/sap/fe/core/type/DateTimeWithTimezone.ts +23 -0
  276. package/src/sap/fe/core/type/Email.js +26 -8
  277. package/src/sap/fe/core/type/Email.ts +8 -7
  278. package/src/sap/fe/core/AnnotationHelper.js +0 -312
  279. package/src/sap/fe/core/AnnotationHelper.ts +0 -315
  280. package/src/sap/fe/core/RouterProxy.js +0 -926
  281. package/src/sap/fe/core/TransactionHelper.js +0 -1562
  282. package/src/sap/fe/core/actions/collaboration/ActivitySync.js +0 -392
  283. package/src/sap/fe/core/actions/collaboration/CollaborationCommon.js +0 -136
  284. package/src/sap/fe/core/actions/collaboration/Manage.js +0 -262
  285. package/src/sap/fe/core/actions/collaboration/ManageDialog.fragment.xml +0 -103
  286. package/src/sap/fe/core/actions/draft.js +0 -523
  287. package/src/sap/fe/core/actions/messageHandling.js +0 -567
  288. package/src/sap/fe/core/actions/nonDraft.js +0 -20
  289. package/src/sap/fe/core/actions/nonDraft.ts +0 -12
  290. package/src/sap/fe/core/actions/operations.js +0 -1096
  291. package/src/sap/fe/core/actions/sticky.js +0 -130
  292. package/src/sap/fe/core/controllerextensions/ControllerExtensionMetadata.js +0 -78
  293. package/src/sap/fe/core/controllerextensions/ControllerExtensionMetadata.ts +0 -65
  294. package/src/sap/fe/core/formatters/CriticalityFormatter.js +0 -77
  295. package/src/sap/fe/core/formatters/CriticalityFormatter.ts +0 -58
@@ -0,0 +1,1584 @@
1
+ /*!
2
+ * SAP UI development toolkit for HTML5 (SAPUI5)
3
+ * (c) Copyright 2009-2021 SAP SE. All rights reserved
4
+ */
5
+ sap.ui.define(["sap/base/Log", "sap/base/util/UriParameters", "sap/fe/core/CommonUtils", "sap/fe/core/controllerextensions/BusyLocker", "sap/fe/core/controllerextensions/editFlow/draft", "sap/fe/core/controllerextensions/editFlow/operations", "sap/fe/core/controllerextensions/editFlow/sticky", "sap/fe/core/controllerextensions/messageHandler/messageHandling", "sap/fe/core/helpers/FPMHelper", "sap/fe/core/helpers/ModelHelper", "sap/fe/core/library", "sap/m/Button", "sap/m/CheckBox", "sap/m/Dialog", "sap/m/MessageBox", "sap/m/MessageToast", "sap/m/Popover", "sap/m/Text", "sap/m/VBox", "sap/ui/core/Core", "sap/ui/core/Fragment", "sap/ui/core/library", "sap/ui/core/util/XMLPreprocessor", "sap/ui/core/XMLTemplateProcessor", "sap/ui/model/json/JSONModel"], function (Log, UriParameters, CommonUtils, BusyLocker, draft, operations, sticky, messageHandling, FPMHelper, ModelHelper, FELibrary, Button, CheckBox, Dialog, MessageBox, MessageToast, Popover, Text, VBox, Core, Fragment, coreLibrary, XMLPreprocessor, XMLTemplateProcessor, JSONModel) {
6
+ "use strict";
7
+
8
+ var CreationMode = FELibrary.CreationMode;
9
+ var ProgrammingModel = FELibrary.ProgrammingModel;
10
+ var ValueState = coreLibrary.ValueState;
11
+ /* Make sure that the mParameters is not the oEvent */
12
+
13
+ function getParameters(mParameters) {
14
+ if (mParameters && mParameters.getMetadata && mParameters.getMetadata().getName() === "sap.ui.base.Event") {
15
+ mParameters = {};
16
+ }
17
+
18
+ return mParameters || {};
19
+ }
20
+
21
+ var TransactionHelper = /*#__PURE__*/function () {
22
+ function TransactionHelper(oAppComponent, oLockObject) {
23
+ this._bIsModified = false;
24
+ this._bCreateMode = false;
25
+ this._bContinueDiscard = false;
26
+ this._oAppComponent = oAppComponent;
27
+ this.oLockObject = oLockObject;
28
+ }
29
+
30
+ var _proto = TransactionHelper.prototype;
31
+
32
+ _proto.getProgrammingModel = function getProgrammingModel(oContext) {
33
+ if (!this.sProgrammingModel && oContext) {
34
+ var sPath;
35
+
36
+ if (oContext.isA("sap.ui.model.odata.v4.Context")) {
37
+ sPath = oContext.getPath();
38
+ } else {
39
+ sPath = oContext.isRelative() ? oContext.getResolvedPath() : oContext.getPath();
40
+ }
41
+
42
+ if (ModelHelper.isDraftSupported(oContext.getModel().getMetaModel(), sPath)) {
43
+ this.sProgrammingModel = ProgrammingModel.Draft;
44
+ } else if (ModelHelper.isStickySessionSupported(oContext.getModel().getMetaModel())) {
45
+ this.sProgrammingModel = ProgrammingModel.Sticky;
46
+ } else {
47
+ // as the transaction helper is a singleton we don't store the non draft as the user could
48
+ // start with a non draft child page and navigates back to a draft enabled one
49
+ return ProgrammingModel.NonDraft;
50
+ }
51
+ }
52
+
53
+ return this.sProgrammingModel;
54
+ }
55
+ /**
56
+ * Validates a document.
57
+ *
58
+ * @memberof sap.fe.core.TransactionHelper
59
+ * @static
60
+ * @param {sap.ui.model.odata.v4.Context} oContext Context of the document to be validated
61
+ * @param {object} [mParameters] Can contain the following attributes:
62
+ * * @param {object} [mParameters.data] A map of data that should be validated
63
+ * * @param {string} [mParameters.customValidationFunction] A string representing the path to the validation function
64
+ * @param {object} oView Contains the object of the current view
65
+ * @returns {Promise} Promise resolves with result of the custom validation function
66
+ * @ui5-restricted
67
+ * @final
68
+ */
69
+ ;
70
+
71
+ _proto.validateDocument = function validateDocument(oContext, mParameters, oView) {
72
+ var sCustomValidationFunction = mParameters && mParameters.customValidationFunction;
73
+
74
+ if (sCustomValidationFunction) {
75
+ var sModule = sCustomValidationFunction.substring(0, sCustomValidationFunction.lastIndexOf(".") || -1).replace(/\./gi, "/"),
76
+ sFunctionName = sCustomValidationFunction.substring(sCustomValidationFunction.lastIndexOf(".") + 1, sCustomValidationFunction.length),
77
+ mData = mParameters.data;
78
+ delete mData["@$ui5.context.isTransient"];
79
+ return FPMHelper.validationWrapper(sModule, sFunctionName, mData, oView, oContext);
80
+ }
81
+
82
+ return Promise.resolve([]);
83
+ }
84
+ /**
85
+ * Creates a new document.
86
+ *
87
+ * @memberof sap.fe.core.TransactionHelper
88
+ * @static
89
+ * @param {sap.ui.model.odata.v4.ODataListBinding} oMainListBinding OData V4 ListBinding object
90
+ * @param {object} [mInParameters] Optional, can contain the following attributes:
91
+ * @param {map} [mInParameters.data] A map of data that should be sent within the POST
92
+ * @param {string} [mInParameters.busyMode] Global (default), Local, None TODO: to be refactored
93
+ * @param {map} [mInParameters.keepTransientContextOnFailed] If set, the context stays in the list if the POST failed and POST will be repeated with the next change
94
+ * @param {map} [mInParameters.inactive] If set, the context is set as inactive for empty rows
95
+ * @param oResourceBundle
96
+ * @param messageHandler
97
+ * @param bFromCopyPaste
98
+ * @param oView The current view
99
+ * @returns {Promise} Promise resolves with new binding context
100
+ * @ui5-restricted
101
+ * @final
102
+ */
103
+ ;
104
+
105
+ _proto.createDocument = function createDocument(oMainListBinding, mInParameters, oResourceBundle, messageHandler) {
106
+ var bFromCopyPaste = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;
107
+ var oView = arguments.length > 5 ? arguments[5] : undefined;
108
+
109
+ // eslint-disable-next-line @typescript-eslint/no-this-alias
110
+ var that = this,
111
+ oModel = oMainListBinding.getModel(),
112
+ oMetaModel = oModel.getMetaModel(),
113
+ sMetaPath = oMetaModel.getMetaPath(oMainListBinding.getHeaderContext().getPath()),
114
+ sCreateHash = this._getAppComponent().getRouterProxy().getHash(),
115
+ oComponentData = this._getAppComponent().getComponentData(),
116
+ oStartupParameters = oComponentData && oComponentData.startupParameters || {},
117
+ sNewAction = !oMainListBinding.isRelative() ? this._getNewAction(oStartupParameters, sCreateHash, oMetaModel, sMetaPath) : undefined;
118
+
119
+ var oCreationPromise;
120
+ var mBindingParameters = {
121
+ "$$patchWithoutSideEffects": true
122
+ };
123
+ var sMessagesPath = oMetaModel.getObject(sMetaPath + "/@com.sap.vocabularies.Common.v1.Messages/$Path");
124
+ var sBusyPath = "/busy";
125
+ var sFunctionName = oMetaModel.getObject(sMetaPath + "@com.sap.vocabularies.Common.v1.DefaultValuesFunction") || oMetaModel.getObject(ModelHelper.getTargetEntitySet(oMetaModel.getContext(sMetaPath)) + "@com.sap.vocabularies.Common.v1.DefaultValuesFunction");
126
+ var bFunctionOnNavProp;
127
+ var oNewDocumentContext;
128
+
129
+ if (sFunctionName) {
130
+ if (oMetaModel.getObject(sMetaPath + "@com.sap.vocabularies.Common.v1.DefaultValuesFunction") && ModelHelper.getTargetEntitySet(oMetaModel.getContext(sMetaPath)) !== sMetaPath) {
131
+ bFunctionOnNavProp = true;
132
+ } else {
133
+ bFunctionOnNavProp = false;
134
+ }
135
+ }
136
+
137
+ if (sMessagesPath) {
138
+ mBindingParameters["$select"] = sMessagesPath;
139
+ }
140
+
141
+ var mParameters = getParameters(mInParameters);
142
+
143
+ if (!oMainListBinding) {
144
+ return Promise.reject("Binding required for new document creation");
145
+ }
146
+
147
+ var sProgrammingModel = this.getProgrammingModel(oMainListBinding);
148
+
149
+ if (sProgrammingModel !== ProgrammingModel.Draft && sProgrammingModel !== ProgrammingModel.Sticky) {
150
+ return Promise.reject("Create document only allowed for draft or sticky session supported services");
151
+ }
152
+
153
+ if (mParameters.busyMode === "Local") {
154
+ // in case of local busy mode we use the list binding name
155
+ // there's no APY yet so we have to use the .sId TODO provide a public method?
156
+ sBusyPath = "/busyLocal/" + oMainListBinding.sId;
157
+ }
158
+
159
+ mParameters.beforeCreateCallBack = bFromCopyPaste ? null : mParameters.beforeCreateCallBack;
160
+ BusyLocker.lock(this.oLockObject, sBusyPath);
161
+ var oResourceBundleCore = Core.getLibraryResourceBundle("sap.fe.core");
162
+
163
+ if (sNewAction) {
164
+ oCreationPromise = this.callAction(sNewAction, {
165
+ contexts: oMainListBinding.getHeaderContext(),
166
+ showActionParameterDialog: true,
167
+ label: this._getSpecificCreateActionDialogLabel(oMetaModel, sMetaPath, sNewAction, oResourceBundleCore),
168
+ bindingParameters: mBindingParameters,
169
+ parentControl: mParameters.parentControl,
170
+ bIsCreateAction: true
171
+ }, null, messageHandler);
172
+ } else {
173
+ var bIsNewPageCreation = mParameters.creationMode !== CreationMode.CreationRow && mParameters.creationMode !== CreationMode.Inline;
174
+ var aNonComputedVisibleKeyFields = bIsNewPageCreation ? CommonUtils.getNonComputedVisibleFields(oMetaModel, sMetaPath, oView) : [];
175
+ sFunctionName = bFromCopyPaste ? null : sFunctionName;
176
+ var sFunctionPath, oFunctionContext;
177
+
178
+ if (sFunctionName) {
179
+ //bound to the source entity:
180
+ if (bFunctionOnNavProp) {
181
+ sFunctionPath = oMainListBinding.getContext() && oMetaModel.getMetaPath(oMainListBinding.getContext().getPath()) + "/" + sFunctionName;
182
+ oFunctionContext = oMainListBinding.getContext();
183
+ } else {
184
+ sFunctionPath = oMainListBinding.getHeaderContext() && oMetaModel.getMetaPath(oMainListBinding.getHeaderContext().getPath()) + "/" + sFunctionName;
185
+ oFunctionContext = oMainListBinding.getHeaderContext();
186
+ }
187
+ }
188
+
189
+ var oFunction = sFunctionPath && oMetaModel.createBindingContext(sFunctionPath);
190
+
191
+ if (oFunction && oFunction.getObject() && oFunction.getObject()[0].$IsBound) {
192
+ oCreationPromise = operations.callBoundFunction(sFunctionName, oFunctionContext, oModel);
193
+ } else {
194
+ oCreationPromise = operations.callFunctionImport(sFunctionName, oModel);
195
+ }
196
+
197
+ oCreationPromise = oCreationPromise.then(function (oContext) {
198
+ if (oContext) {
199
+ return oContext.getObject();
200
+ } else {
201
+ return undefined;
202
+ }
203
+ }).catch(function (oError) {
204
+ Log.error("Error while executing the function " + sFunctionName, oError);
205
+ throw oError;
206
+ }).then(function (oData) {
207
+ mParameters.data = oData ? Object.assign({}, oData, mParameters.data) : mParameters.data;
208
+
209
+ if (mParameters.data) {
210
+ delete mParameters.data["@odata.context"];
211
+ }
212
+
213
+ if (aNonComputedVisibleKeyFields.length > 0) {
214
+ var oTransientListBinding = oModel.bindList(oMainListBinding.getPath(), oMainListBinding.getContext(), [], [], {
215
+ $$updateGroupId: "submitLater"
216
+ });
217
+
218
+ oTransientListBinding.refreshInternal = function () {
219
+ /* */
220
+ };
221
+
222
+ oNewDocumentContext = oTransientListBinding.create(mParameters.data, true);
223
+ return that._launchDialogWithKeyFields(oMainListBinding, oTransientListBinding, oNewDocumentContext, aNonComputedVisibleKeyFields, oModel, mParameters, messageHandler);
224
+ } else {
225
+ var onBeforeCreatePromise;
226
+
227
+ if (mParameters.beforeCreateCallBack) {
228
+ onBeforeCreatePromise = mParameters.beforeCreateCallBack({
229
+ contextPath: oMainListBinding && oMainListBinding.getPath()
230
+ });
231
+ } else {
232
+ onBeforeCreatePromise = Promise.resolve();
233
+ }
234
+
235
+ return onBeforeCreatePromise.then(function () {
236
+ oNewDocumentContext = oMainListBinding.create(mParameters.data, true, mParameters.createAtEnd, mParameters.inactive);
237
+
238
+ if (!mParameters.inactive) {
239
+ return that.onAfterCreateCompletion(oMainListBinding, oNewDocumentContext, mParameters);
240
+ }
241
+ });
242
+ }
243
+ }).catch(function (oError) {
244
+ Log.error("Error while creating the new document", oError);
245
+ throw oError;
246
+ });
247
+ }
248
+
249
+ return oCreationPromise.then(function (oResult) {
250
+ if (!oMainListBinding.isRelative()) {
251
+ // the create mode shall currently only be set on creating a root document
252
+ that._bCreateMode = true;
253
+ }
254
+
255
+ oNewDocumentContext = oNewDocumentContext || oResult && oResult.response; // TODO: where does this one coming from???
256
+
257
+ if (oResult && oResult.bConsiderDocumentModified) {
258
+ that.handleDocumentModifications();
259
+ }
260
+
261
+ return messageHandler.showMessageDialog().then(function () {
262
+ return oNewDocumentContext;
263
+ });
264
+ }).catch(function (oError) {
265
+ return messageHandler.showMessageDialog().then(function () {
266
+ // for instance, on cancel of create dialog, the promise is rejected
267
+ // a return here would restore the promise chain and result in errors while routing
268
+ // solution - reject here as well
269
+ if (oError && oError.bDeleteTransientContext && oNewDocumentContext.isTransient()) {
270
+ // This is a workaround suggested by model as Context.delete results in an error
271
+ // TODO: remove the $direct once model resolves this issue
272
+ // this line shows the expected console error Uncaught (in promise) Error: Request canceled: POST Travel; group: submitLater
273
+ oNewDocumentContext.delete("$direct");
274
+ }
275
+
276
+ return Promise.reject(oError);
277
+ });
278
+ }).finally(function () {
279
+ BusyLocker.unlock(that.oLockObject, sBusyPath);
280
+ });
281
+ }
282
+ /**
283
+ * Find the active contexts of the documents, only for the draft roots.
284
+ *
285
+ * @memberof sap.fe.core.TransactionHelper
286
+ * @static
287
+ * @param {sap.ui.model.odata.v4.Context[]} aContexts Contexts Either one context or an array with contexts to be deleted
288
+ * @param bFindActiveContexts
289
+ * @returns {Array} Array of the active contexts
290
+ */
291
+ ;
292
+
293
+ _proto.findActiveDraftRootContexts = function findActiveDraftRootContexts(aContexts, bFindActiveContexts) {
294
+ if (!bFindActiveContexts) {
295
+ return Promise.resolve();
296
+ }
297
+
298
+ var activeContexts = aContexts.reduce(function (aResult, oContext) {
299
+ var oMetaModel = oContext.getModel().getMetaModel();
300
+ var sMetaPath = oMetaModel.getMetaPath(oContext.getPath());
301
+
302
+ if (oMetaModel.getObject(sMetaPath + "@com.sap.vocabularies.Common.v1.DraftRoot")) {
303
+ var bIsActiveEntity = oContext.getObject().IsActiveEntity,
304
+ bHasActiveEntity = oContext.getObject().HasActiveEntity;
305
+
306
+ if (!bIsActiveEntity && bHasActiveEntity) {
307
+ var oActiveContext = oContext.getModel().bindContext(oContext.getPath() + "/SiblingEntity").getBoundContext();
308
+ aResult.push(oActiveContext);
309
+ }
310
+ }
311
+
312
+ return aResult;
313
+ }, []);
314
+ return Promise.all(activeContexts.map(function (oContext) {
315
+ return oContext.requestCanonicalPath().then(function () {
316
+ return oContext;
317
+ }, function () {
318
+ return;
319
+ });
320
+ }));
321
+ };
322
+
323
+ _proto.afterDeleteProcess = function afterDeleteProcess(mParameters, checkBox, aContexts, oResourceBundle) {
324
+ var oInternalModelContext = mParameters.internalModelContext;
325
+
326
+ if (oInternalModelContext && oInternalModelContext.getProperty("deleteEnabled") != undefined) {
327
+ if (checkBox.isCheckBoxVisible === true && checkBox.isCheckBoxSelected === false) {
328
+ //if unsaved objects are not deleted then we need to set the enabled to true and update the model data for next deletion
329
+ oInternalModelContext.setProperty("deleteEnabled", true);
330
+ var obj = Object.assign(oInternalModelContext.getObject(), {});
331
+ obj.selectedContexts = obj.selectedContexts.filter(function (element) {
332
+ return obj.deletableContexts.indexOf(element) === -1;
333
+ });
334
+ obj.deletableContexts = [];
335
+ obj.selectedContexts = [];
336
+ obj.numberOfSelectedContexts = obj.selectedContexts.length;
337
+ oInternalModelContext.setProperty("", obj);
338
+ } else {
339
+ oInternalModelContext.setProperty("deleteEnabled", false);
340
+ oInternalModelContext.setProperty("selectedContexts", []);
341
+ oInternalModelContext.setProperty("numberOfSelectedContexts", 0);
342
+ }
343
+ }
344
+
345
+ if (aContexts.length === 1) {
346
+ MessageToast.show(CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_DELETE_TOAST_SINGULAR", oResourceBundle, null, mParameters.entitySetName));
347
+ } else {
348
+ MessageToast.show(CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_DELETE_TOAST_PLURAL", oResourceBundle, null, mParameters.entitySetName));
349
+ }
350
+ }
351
+ /**
352
+ * Delete one or multiple document(s).
353
+ *
354
+ * @memberof sap.fe.core.TransactionHelper
355
+ * @static
356
+ * @param {sap.ui.model.odata.v4.Context} vContexts Contexts Either one context or an array with contexts to be deleted
357
+ * @param {object} mParameters Optional, can contain the following attributes:
358
+ * @param {string} mParameters.title Title of the object to be deleted
359
+ * @param {string} mParameters.description Description of the object to be deleted
360
+ * @param {integer} mParameters.numberOfSelectedContexts Number of objects selected
361
+ * @param {boolean} mParameters.noDialog To disable the confirmation dialog
362
+ * @param oResourceBundle
363
+ * @param messageHandler
364
+ * @returns {Promise}
365
+ */
366
+ ;
367
+
368
+ _proto.deleteDocument = function deleteDocument(vContexts, mParameters, oResourceBundle, messageHandler) {
369
+ var fnReject,
370
+ fnResolve,
371
+ aDeletableContexts = [],
372
+ isCheckBoxVisible = false,
373
+ isLockedTextVisible = false,
374
+ cannotBeDeletedTextVisible = false,
375
+ isCheckBoxSelected,
376
+ bDialogConfirmed = false; // eslint-disable-next-line @typescript-eslint/no-this-alias
377
+
378
+ var that = this,
379
+ oResourceBundleCore = Core.getLibraryResourceBundle("sap.fe.core");
380
+ var aParams;
381
+ var oDeleteMessage = {
382
+ title: oResourceBundleCore.getText("C_COMMON_OBJECT_PAGE_DELETE")
383
+ };
384
+ messageHandling.removeBoundTransitionMessages();
385
+ BusyLocker.lock(this.oLockObject);
386
+
387
+ if (!Array.isArray(vContexts)) {
388
+ vContexts = [vContexts];
389
+ }
390
+
391
+ Promise.resolve(this.getProgrammingModel(vContexts[0])).then(function (sProgrammingModel) {
392
+ if (mParameters) {
393
+ if (!mParameters.numberOfSelectedContexts) {
394
+ if (sProgrammingModel === ProgrammingModel.Draft) {
395
+ for (var i = 0; i < vContexts.length; i++) {
396
+ var oContextData = vContexts[i].getObject();
397
+
398
+ if (oContextData.IsActiveEntity === true && oContextData.HasDraftEntity === true && oContextData.DraftAdministrativeData && oContextData.DraftAdministrativeData.InProcessByUser && !oContextData.DraftAdministrativeData.DraftIsCreatedByMe) {
399
+ MessageBox.show(CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_CONFIRM_DELETE_WITH_SINGLE_OBJECT_LOCKED", oResourceBundle), {
400
+ title: oResourceBundleCore.getText("C_COMMON_OBJECT_PAGE_DELETE"),
401
+ onClose: fnReject
402
+ });
403
+ return;
404
+ }
405
+ }
406
+ }
407
+
408
+ mParameters = getParameters(mParameters);
409
+
410
+ if (mParameters.title) {
411
+ if (mParameters.description) {
412
+ aParams = [mParameters.title, mParameters.description];
413
+ } else {
414
+ aParams = [mParameters.title, ""];
415
+ }
416
+
417
+ oDeleteMessage.text = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_CONFIRM_DELETE_WITH_OBJECTINFO", oResourceBundle, aParams, mParameters.entitySetName);
418
+ } else {
419
+ oDeleteMessage.text = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_CONFIRM_DELETE_WITH_OBJECTTITLE_SINGULAR", oResourceBundle);
420
+ }
421
+
422
+ aDeletableContexts = vContexts;
423
+ } else {
424
+ oDeleteMessage = {
425
+ title: oResourceBundleCore.getText("C_COMMON_OBJECT_PAGE_DELETE")
426
+ };
427
+
428
+ if (mParameters.numberOfSelectedContexts === 1 && mParameters.numberOfSelectedContexts === vContexts.length) {
429
+ aDeletableContexts = vContexts;
430
+ oDeleteMessage.text = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_CONFIRM_DELETE_WITH_OBJECTTITLE_SINGULAR", oResourceBundle, null, mParameters.entitySetName);
431
+ } else if (mParameters.numberOfSelectedContexts === 1 && mParameters.unSavedContexts.length === 1) {
432
+ //only one unsaved object
433
+ aDeletableContexts = mParameters.unSavedContexts;
434
+ var draftAdminData = aDeletableContexts[0].getObject()["DraftAdministrativeData"];
435
+ var sLastChangedByUser = "";
436
+
437
+ if (draftAdminData) {
438
+ sLastChangedByUser = draftAdminData["LastChangedByUserDescription"] || draftAdminData["LastChangedByUser"] || "";
439
+ }
440
+
441
+ aParams = [sLastChangedByUser];
442
+ oDeleteMessage.text = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_CONFIRM_DELETE_WITH_UNSAVED_CHANGES", oResourceBundle, aParams);
443
+ } else if (mParameters.numberOfSelectedContexts === mParameters.unSavedContexts.length) {
444
+ //only multiple unsaved objects
445
+ aDeletableContexts = mParameters.unSavedContexts;
446
+ oDeleteMessage.text = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_CONFIRM_DELETE_WITH_UNSAVED_CHANGES_MULTIPLE_OBJECTS", oResourceBundle);
447
+ } else if (mParameters.numberOfSelectedContexts === vContexts.concat(mParameters.unSavedContexts.concat(mParameters.lockedContexts)).length) {
448
+ //only unsaved, locked ,deletable objects but not non-deletable objects
449
+ aDeletableContexts = vContexts.concat(mParameters.unSavedContexts);
450
+ oDeleteMessage.text = aDeletableContexts.length === 1 ? CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_CONFIRM_DELETE_WITH_OBJECTTITLE_SINGULAR", oResourceBundle, null, mParameters.entitySetName) : CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_CONFIRM_DELETE_WITH_OBJECTTITLE_PLURAL", oResourceBundle, null, mParameters.entitySetName);
451
+ } else {
452
+ //if non-deletable objects exists along with any of unsaved ,deletable objects
453
+ aDeletableContexts = vContexts.concat(mParameters.unSavedContexts);
454
+ cannotBeDeletedTextVisible = true;
455
+ oDeleteMessage.text = aDeletableContexts.length === 1 ? CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_CONFIRM_DELETE_WITH_OBJECTTITLE_SINGULAR_NON_DELETABLE", oResourceBundle, null, mParameters.entitySetName) : CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_CONFIRM_DELETE_WITH_OBJECTTITLE_PLURAL_NON_DELETABLE", oResourceBundle, null, mParameters.entitySetName);
456
+ oDeleteMessage.nonDeletableText = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_CONFIRM_DELETE_WITH_OBJECTINFO_AND_FEW_OBJECTS_NON_DELETABLE", oResourceBundle, [mParameters.numberOfSelectedContexts - vContexts.concat(mParameters.unSavedContexts).length, mParameters.numberOfSelectedContexts]);
457
+ }
458
+
459
+ if (mParameters.lockedContexts.length == 1) {
460
+ //setting the locked text if locked objects exist
461
+ isLockedTextVisible = true;
462
+ oDeleteMessage.nonDeletableText = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_CONFIRM_DELETE_WITH_OBJECTINFO_AND_ONE_OBJECT_LOCKED", oResourceBundle, [mParameters.numberOfSelectedContexts]);
463
+ }
464
+
465
+ if (mParameters.lockedContexts.length > 1) {
466
+ //setting the locked text if locked objects exist
467
+ isLockedTextVisible = true;
468
+ oDeleteMessage.nonDeletableText = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_CONFIRM_DELETE_WITH_OBJECTINFO_AND_FEW_OBJECTS_LOCKED", oResourceBundle, [mParameters.lockedContexts.length, mParameters.numberOfSelectedContexts]);
469
+ }
470
+
471
+ if (mParameters.unSavedContexts.length > 0 && mParameters.unSavedContexts.length !== mParameters.numberOfSelectedContexts) {
472
+ if ((cannotBeDeletedTextVisible || isLockedTextVisible) && aDeletableContexts.length === mParameters.unSavedContexts.length) {
473
+ //if only unsaved and either or both of locked and non-deletable objects exist then we hide the check box
474
+ isCheckBoxVisible = false;
475
+ aDeletableContexts = mParameters.unSavedContexts;
476
+
477
+ if (mParameters.unSavedContexts.length === 1) {
478
+ oDeleteMessage.text = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_CONFIRM_DELETE_WITH_UNSAVED_AND_FEW_OBJECTS_LOCKED_SINGULAR", oResourceBundle);
479
+ } else {
480
+ oDeleteMessage.text = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_CONFIRM_DELETE_WITH_UNSAVED_AND_FEW_OBJECTS_LOCKED_PLURAL", oResourceBundle);
481
+ }
482
+ } else {
483
+ if (mParameters.unSavedContexts.length === 1) {
484
+ oDeleteMessage.checkBoxText = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_CONFIRM_DELETE_WITH_OBJECTINFO_AND_FEW_OBJECTS_UNSAVED_SINGULAR", oResourceBundle);
485
+ } else {
486
+ oDeleteMessage.checkBoxText = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_CONFIRM_DELETE_WITH_OBJECTINFO_AND_FEW_OBJECTS_UNSAVED_PLURAL", oResourceBundle);
487
+ }
488
+
489
+ isCheckBoxVisible = true;
490
+ }
491
+ }
492
+
493
+ if (cannotBeDeletedTextVisible && isLockedTextVisible) {
494
+ //if both locked and non-deletable objects exist along with deletable objects
495
+ if (mParameters.unSavedContexts.length > 1) {
496
+ oDeleteMessage.nonDeletableText = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_CONFIRM_DELETE_WITH_OBJECTINFO_AND_FEW_OBJECTS_LOCKED_AND_NON_DELETABLE", oResourceBundle, [mParameters.numberOfSelectedContexts - vContexts.concat(mParameters.unSavedContexts).length - mParameters.lockedContexts.length, mParameters.lockedContexts.length, mParameters.numberOfSelectedContexts]);
497
+ }
498
+
499
+ if (mParameters.unSavedContexts.length == 1) {
500
+ oDeleteMessage.nonDeletableText = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_CONFIRM_DELETE_WITH_OBJECTINFO_AND_ONE_OBJECT_LOCKED_AND_NON_DELETABLE", oResourceBundle, [mParameters.numberOfSelectedContexts - vContexts.concat(mParameters.unSavedContexts).length - mParameters.lockedContexts.length, mParameters.numberOfSelectedContexts]);
501
+ }
502
+ }
503
+ }
504
+ }
505
+
506
+ var oNonDeletableMessageTextControl, oDeleteMessageTextControl;
507
+ var oContent = new VBox({
508
+ items: [oNonDeletableMessageTextControl = new Text({
509
+ text: oDeleteMessage.nonDeletableText,
510
+ visible: isLockedTextVisible || cannotBeDeletedTextVisible
511
+ }), oDeleteMessageTextControl = new Text({
512
+ text: oDeleteMessage.text
513
+ }), new CheckBox({
514
+ text: oDeleteMessage.checkBoxText,
515
+ selected: true,
516
+ select: function (oEvent) {
517
+ var selected = oEvent.getSource().getSelected();
518
+
519
+ if (selected) {
520
+ aDeletableContexts = vContexts.concat(mParameters.unSavedContexts);
521
+ isCheckBoxSelected = true;
522
+ } else {
523
+ aDeletableContexts = vContexts;
524
+ isCheckBoxSelected = false;
525
+ }
526
+ },
527
+ visible: isCheckBoxVisible
528
+ })]
529
+ });
530
+ var sTitle = oResourceBundleCore.getText("C_COMMON_OBJECT_PAGE_DELETE");
531
+
532
+ var fnConfirm = function () {
533
+ bDialogConfirmed = true;
534
+ BusyLocker.lock(that.oLockObject);
535
+ var aContexts = aDeletableContexts;
536
+ var onBeforeDeletePromise;
537
+
538
+ if (mParameters.beforeDeleteCallBack) {
539
+ onBeforeDeletePromise = mParameters.beforeDeleteCallBack({
540
+ contexts: aContexts
541
+ });
542
+ } else {
543
+ onBeforeDeletePromise = Promise.resolve();
544
+ }
545
+
546
+ return onBeforeDeletePromise.then(that.findActiveDraftRootContexts.bind(that, aContexts, mParameters.bFindActiveContexts)).then(function (activeContexts) {
547
+ //make sure to fetch the active contexts before deleting the drafts
548
+ return Promise.all(aContexts.map(function (oContext) {
549
+ //delete the draft
550
+ return draft.deleteDraft(oContext);
551
+ })).catch(function (oError) {
552
+ return messageHandler.showMessages().then(function () {
553
+ // re-throw error to enforce rejecting the general promise
554
+ throw oError;
555
+ });
556
+ }).then(function () {
557
+ var checkBox = {
558
+ "isCheckBoxVisible": isCheckBoxVisible,
559
+ "isCheckBoxSelected": isCheckBoxSelected
560
+ };
561
+
562
+ if (activeContexts && activeContexts.length) {
563
+ return Promise.all(activeContexts.map(function (oContext) {
564
+ return oContext.delete();
565
+ })).then(function () {
566
+ that.afterDeleteProcess(mParameters, checkBox, aContexts, oResourceBundle);
567
+ return messageHandler.showMessageDialog().then(fnResolve);
568
+ });
569
+ } else {
570
+ that.afterDeleteProcess(mParameters, checkBox, aContexts, oResourceBundle);
571
+ return messageHandler.showMessageDialog().then(fnResolve);
572
+ }
573
+ });
574
+ }).catch(function () {
575
+ fnReject();
576
+ }).finally(function () {
577
+ BusyLocker.unlock(that.oLockObject);
578
+ });
579
+ };
580
+
581
+ var oDialog = new Dialog({
582
+ title: sTitle,
583
+ state: "Warning",
584
+ content: [oContent],
585
+ ariaLabelledBy: oNonDeletableMessageTextControl.getVisible() ? [oNonDeletableMessageTextControl, oDeleteMessageTextControl] : oDeleteMessageTextControl,
586
+ beginButton: new Button({
587
+ text: oResourceBundleCore.getText("C_COMMON_OBJECT_PAGE_DELETE"),
588
+ type: "Emphasized",
589
+ press: function () {
590
+ oDialog.close();
591
+ return fnConfirm();
592
+ }
593
+ }),
594
+ endButton: new Button({
595
+ text: CommonUtils.getTranslatedText("C_COMMON_DIALOG_CANCEL", oResourceBundle),
596
+ press: function () {
597
+ oDialog.close();
598
+ }
599
+ }),
600
+ afterClose: function () {
601
+ oDialog.destroy(); // if dialog is closed unconfirmed (e.g. via "Cancel" or Escape button), ensure to reject promise
602
+
603
+ if (!bDialogConfirmed) {
604
+ fnReject();
605
+ }
606
+ }
607
+ });
608
+
609
+ if (mParameters.noDialog) {
610
+ return fnConfirm();
611
+ } else {
612
+ oDialog.addStyleClass("sapUiContentPadding");
613
+ oDialog.open();
614
+ }
615
+ }).finally(function () {
616
+ BusyLocker.unlock(that.oLockObject);
617
+ }).catch(function () {
618
+ Log.warning("Couldn't get Programming model");
619
+ fnReject();
620
+ });
621
+ return new Promise(function (resolve, reject) {
622
+ fnReject = reject;
623
+ fnResolve = resolve;
624
+ });
625
+ }
626
+ /**
627
+ * Edits a document.
628
+ *
629
+ * @memberof sap.fe.core.TransactionHelper
630
+ * @static
631
+ * @param {sap.ui.model.odata.v4.Context} oContext Context of the active document
632
+ * @param {object} oView Current view
633
+ * @param messageHandler
634
+ * @returns {Promise} Promise resolves with the new draft context in case of draft programming model
635
+ * @ui5-restricted
636
+ * @final
637
+ */
638
+ ;
639
+
640
+ _proto.editDocument = function editDocument(oContext, oView, messageHandler) {
641
+ // eslint-disable-next-line @typescript-eslint/no-this-alias
642
+ var that = this;
643
+ var sProgrammingModel = this.getProgrammingModel(oContext);
644
+ var oEditPromise;
645
+
646
+ if (!oContext) {
647
+ return Promise.reject(new Error("Binding context to active document is required"));
648
+ }
649
+
650
+ this._bIsModified = false;
651
+ BusyLocker.lock(that.oLockObject); // before triggering the edit action we'll have to remove all bound transition messages
652
+
653
+ messageHandler.removeTransitionMessages();
654
+
655
+ if (sProgrammingModel === ProgrammingModel.Draft) {
656
+ oEditPromise = draft.createDraftFromActiveDocument(oContext, this._getAppComponent(), {
657
+ bPreserveChanges: true,
658
+ oView: oView
659
+ });
660
+ } else if (sProgrammingModel === ProgrammingModel.Sticky) {
661
+ oEditPromise = sticky.editDocumentInStickySession(oContext, this._getAppComponent());
662
+ } else {
663
+ BusyLocker.unlock(that.oLockObject);
664
+ return Promise.reject(new Error("Edit is only allowed for draft or sticky session supported services"));
665
+ }
666
+
667
+ return oEditPromise.then(function (oNewContext) {
668
+ that._bCreateMode = false;
669
+ return messageHandler.showMessageDialog().then(function () {
670
+ return oNewContext;
671
+ });
672
+ }).catch(function (err) {
673
+ return messageHandler.showMessages().then(function () {
674
+ return Promise.reject(err);
675
+ });
676
+ }).finally(function () {
677
+ BusyLocker.unlock(that.oLockObject);
678
+ });
679
+ }
680
+ /**
681
+ * Cancel 'edit' mode of a document.
682
+ *
683
+ * @memberof sap.fe.core.TransactionHelper
684
+ * @static
685
+ * @param {sap.ui.model.odata.v4.Context} oContext Context of the document to be canceled or deleted
686
+ * @param {object} [mInParameters] Optional, can contain the following attributes:
687
+ * @param {sap.m.Button} mInParameters.cancelButton Cancel Button of the discard popover (mandatory for now)
688
+ * @param {boolean} mInParameters.skipDiscardPopover Optional, supresses the discard popover incase of draft applications while navigating out of OP
689
+ * @param oResourceBundle
690
+ * @param messageHandler
691
+ * @returns {Promise} Promise resolves with ???
692
+ * @ui5-restricted
693
+ * @final
694
+ */
695
+ ;
696
+
697
+ _proto.cancelDocument = function cancelDocument(oContext, mInParameters, oResourceBundle, messageHandler) {
698
+ // eslint-disable-next-line @typescript-eslint/no-this-alias
699
+ var that = this;
700
+ var sProgrammingModel; //context must always be passed - mandatory parameter
701
+
702
+ if (!oContext) {
703
+ return Promise.reject("No context exists. Pass a meaningful context");
704
+ }
705
+
706
+ BusyLocker.lock(that.oLockObject);
707
+ var mParameters = getParameters(mInParameters);
708
+ var oParamsContext = oContext,
709
+ oCancelButton = mParameters.cancelButton,
710
+ oModel = oParamsContext.getModel();
711
+ var onBeforeCancelPromise, sCanonicalPath;
712
+ return Promise.resolve(this.getProgrammingModel(oContext)).then(function (sPModel) {
713
+ sProgrammingModel = sPModel;
714
+
715
+ if (sPModel === ProgrammingModel.Draft) {
716
+ var draftDataContext = oModel.bindContext(oParamsContext.getPath() + "/DraftAdministrativeData").getBoundContext();
717
+
718
+ if (!that._bIsModified) {
719
+ return draftDataContext.requestObject().then(function (draftAdminData) {
720
+ if (draftAdminData) {
721
+ that._bIsModified = !(draftAdminData.CreationDateTime === draftAdminData.LastChangeDateTime);
722
+ }
723
+ });
724
+ }
725
+ }
726
+ }).then(function () {
727
+ if (!mParameters.skipDiscardPopover) {
728
+ return that._showDiscardPopover(oCancelButton, that._bIsModified, oResourceBundle);
729
+ } else {
730
+ return Promise.resolve();
731
+ }
732
+ }).then(function () {
733
+ if (mParameters.beforeCancelCallBack) {
734
+ onBeforeCancelPromise = mParameters.beforeCancelCallBack({
735
+ context: oContext
736
+ });
737
+ } else {
738
+ onBeforeCancelPromise = Promise.resolve();
739
+ }
740
+
741
+ return onBeforeCancelPromise;
742
+ }).then(function () {
743
+ // eslint-disable-next-line default-case
744
+ switch (sProgrammingModel) {
745
+ case ProgrammingModel.Draft:
746
+ return oParamsContext.requestObject("HasActiveEntity").then(function (bHasActiveEntity) {
747
+ var oDeletePromise;
748
+
749
+ if (!bHasActiveEntity) {
750
+ if (oParamsContext && oParamsContext.hasPendingChanges()) {
751
+ oParamsContext.getBinding().resetChanges();
752
+ }
753
+
754
+ oDeletePromise = draft.deleteDraft(oParamsContext);
755
+ return oDeletePromise;
756
+ } else {
757
+ var oActiveContext = oModel.bindContext(oParamsContext.getPath() + "/SiblingEntity").getBoundContext();
758
+ return oActiveContext.requestCanonicalPath().then(function (sPath) {
759
+ sCanonicalPath = sPath;
760
+
761
+ if (oParamsContext && oParamsContext.hasPendingChanges()) {
762
+ oParamsContext.getBinding().resetChanges();
763
+ }
764
+
765
+ oDeletePromise = draft.deleteDraft(oParamsContext);
766
+ return oDeletePromise;
767
+ }, function () {
768
+ draft.deleteDraft(oParamsContext);
769
+ return;
770
+ }).then(function () {
771
+ //oParamsContext.delete() in the previous promise doesnt return anything upon success.
772
+ if (!sCanonicalPath) {
773
+ return;
774
+ }
775
+
776
+ if (oActiveContext.getPath() !== sCanonicalPath) {
777
+ // the active context is using the sibling entity - this path is not accessible anymore as we deleted the draft
778
+ // document - therefore we need to create a new context with the canonical path
779
+ oActiveContext = oModel.bindContext(sCanonicalPath).getBoundContext();
780
+ }
781
+
782
+ return oActiveContext;
783
+ });
784
+ }
785
+ });
786
+
787
+ case ProgrammingModel.Sticky:
788
+ return sticky.discardDocument(oContext).then(function (oContext) {
789
+ if (oContext) {
790
+ if (oContext.hasPendingChanges()) {
791
+ oContext.getBinding().resetChanges();
792
+ }
793
+
794
+ if (!that._bCreateMode) {
795
+ oContext.refresh();
796
+ return oContext;
797
+ }
798
+ }
799
+
800
+ return false;
801
+ });
802
+
803
+ default:
804
+ return Promise.reject("Cancel document only allowed for draft or sticky session supported services");
805
+ }
806
+ }).then(function (context) {
807
+ that._bIsModified = false; // remove existing bound transition messages
808
+
809
+ messageHandler.removeTransitionMessages(); // show unbound messages
810
+
811
+ return messageHandler.showMessages().then(function () {
812
+ return context;
813
+ });
814
+ }).catch(function (err) {
815
+ return messageHandler.showMessages().then(function () {
816
+ return Promise.reject(err);
817
+ });
818
+ }).finally(function () {
819
+ BusyLocker.unlock(that.oLockObject);
820
+ });
821
+ }
822
+ /**
823
+ * Saves the document.
824
+ *
825
+ * @memberof sap.fe.core.TransactionHelper
826
+ * @static
827
+ * @param {sap.ui.model.odata.v4.Context} oContext Context of the document to be saved
828
+ * @param oResourceBundle
829
+ * @param bExecuteSideEffectsOnError
830
+ * @param aBindings
831
+ * @param messageHandler
832
+ * @returns {Promise} Promise resolves with ???
833
+ * @ui5-restricted
834
+ * @final
835
+ */
836
+ ;
837
+
838
+ _proto.saveDocument = function saveDocument(oContext, oResourceBundle, bExecuteSideEffectsOnError, aBindings, messageHandler) {
839
+ // eslint-disable-next-line @typescript-eslint/no-this-alias
840
+ var that = this;
841
+ var sProgrammingModel = this.getProgrammingModel(oContext);
842
+ var oSavePromise;
843
+
844
+ if (!oContext) {
845
+ return Promise.reject(new Error("Binding context to draft document is required"));
846
+ } // in case of saving / activating the bound transition messages shall be removed before the PATCH/POST
847
+ // is sent to the backend
848
+
849
+
850
+ messageHandler.removeTransitionMessages();
851
+ BusyLocker.lock(that.oLockObject);
852
+
853
+ if (sProgrammingModel === ProgrammingModel.Draft) {
854
+ oSavePromise = draft.activateDocument(oContext, this._getAppComponent(), {});
855
+ } else if (sProgrammingModel === ProgrammingModel.Sticky) {
856
+ var bEnableStrictHandling = UriParameters.fromQuery(window.location.search).get("sap-fe-save-strict-mode") === "true";
857
+ oSavePromise = sticky.activateDocument(oContext, bEnableStrictHandling);
858
+ } else {
859
+ BusyLocker.unlock(that.oLockObject);
860
+ return Promise.reject(new Error("Save is only allowed for draft or sticky session supported services"));
861
+ }
862
+
863
+ return oSavePromise.then(function (oActiveDocument) {
864
+ var bNewObject = that.sProgrammingModel === ProgrammingModel.Sticky ? that._bCreateMode : !oContext.getObject().HasActiveEntity;
865
+ MessageToast.show(bNewObject ? CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_CREATED", oResourceBundle) : CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_SAVED", oResourceBundle));
866
+ that._bIsModified = false;
867
+ return messageHandler.showMessageDialog().then(function () {
868
+ return oActiveDocument;
869
+ });
870
+ }).catch(function (err) {
871
+ if (aBindings && aBindings.length > 0) {
872
+ /* The sideEffects are executed only for table items in transient state */
873
+ aBindings.forEach(function (oListBinding) {
874
+ if (!CommonUtils.hasTransientContext(oListBinding) && bExecuteSideEffectsOnError) {
875
+ var oAppComponent = that._getAppComponent();
876
+
877
+ oAppComponent.getSideEffectsService().requestSideEffectsForNavigationProperty(oListBinding.getPath(), oContext);
878
+ }
879
+ });
880
+ }
881
+
882
+ return messageHandler.showMessages().then(function () {
883
+ return Promise.reject(err);
884
+ });
885
+ }).finally(function () {
886
+ BusyLocker.unlock(that.oLockObject);
887
+ });
888
+ }
889
+ /**
890
+ * Calls a bound or unbound action.
891
+ *
892
+ * @function
893
+ * @static
894
+ * @name sap.fe.core.TransactionHelper.callAction
895
+ * @memberof sap.fe.core.TransactionHelper
896
+ * @param {string} sActionName The name of the action to be called
897
+ * @param {map} [mParameters] Contains the following attributes:
898
+ * @param {sap.ui.model.odata.v4.Context} [mParameters.contexts] Mandatory for a bound action: Either one context or an array with contexts for which the action is to be called
899
+ * @param {sap.ui.model.odata.v4.ODataModel} [mParameters.model] Mandatory for an unbound action: An instance of an OData V4 model
900
+ * @param {string} [mParameters.invocationGrouping] Mode how actions are to be called: 'ChangeSet' to put all action calls into one changeset, 'Isolated' to put them into separate changesets
901
+ * @param {string} [mParameters.label] A human-readable label for the action
902
+ * @param {boolean} [mParameters.bGetBoundContext] If specified, the action promise returns the bound context
903
+ * @param {object} oView Contains the object of the current view
904
+ * @param messageHandler
905
+ * @returns {Promise} Promise resolves with an array of response objects (TODO: to be changed)
906
+ * @ui5-restricted
907
+ * @final
908
+ **/
909
+ ;
910
+
911
+ _proto.callAction = function callAction(sActionName, mParameters, oView, messageHandler) {
912
+ mParameters = getParameters(mParameters); // eslint-disable-next-line @typescript-eslint/no-this-alias
913
+
914
+ var that = this;
915
+ var oContext, oModel, oPromise;
916
+ var mBindingParameters = mParameters.bindingParameters;
917
+
918
+ if (!sActionName) {
919
+ return Promise.reject("Provide name of action to be executed");
920
+ } // action imports are not directly obtained from the metaModel by it is present inside the entityContainer
921
+ // and the acions it refers to present outside the entitycontainer, hence to obtain kind of the action
922
+ // split() on its name was required
923
+
924
+
925
+ var sName = sActionName.split("/")[1];
926
+ sActionName = sName || sActionName;
927
+ oContext = sName ? undefined : mParameters.contexts; //checking whether the context is an array with more than 0 length or not an array(create action)
928
+
929
+ if (oContext && (Array.isArray(oContext) && oContext.length || !Array.isArray(oContext))) {
930
+ oContext = Array.isArray(oContext) ? oContext[0] : oContext;
931
+ oModel = oContext.getModel();
932
+ }
933
+
934
+ if (mParameters.model) {
935
+ oModel = mParameters.model;
936
+ }
937
+
938
+ if (!oModel) {
939
+ return Promise.reject("Pass a context for a bound action or pass the model for an unbound action");
940
+ } // get the binding parameters $select and $expand for the side effect on this action
941
+ // also gather additional property paths to be requested such as text associations
942
+
943
+
944
+ var oAppComponent = that._getAppComponent();
945
+
946
+ var mSideEffectsParameters = oAppComponent.getSideEffectsService().getODataActionSideEffects(sActionName, oContext) || {};
947
+
948
+ if (oContext && oModel) {
949
+ oPromise = new Promise(function (resolve, reject) {
950
+ var oApplicableContextDialog;
951
+ var oController = {
952
+ onClose: function () {
953
+ // User cancels action
954
+ oApplicableContextDialog.close();
955
+ resolve();
956
+ },
957
+ onContinue: function () {
958
+ // Users continues the action with the bound contexts
959
+ oApplicableContextDialog.close();
960
+ resolve(mParameters.applicableContext);
961
+ }
962
+ };
963
+
964
+ var fnOpenAndFillDialog = function () {
965
+ var oDialogContent;
966
+ var nNotApplicable = mParameters.notApplicableContext.length,
967
+ aNotApplicableItems = [];
968
+
969
+ for (var i = 0; i < mParameters.notApplicableContext.length; i++) {
970
+ oDialogContent = mParameters.notApplicableContext[i].getObject();
971
+ aNotApplicableItems.push(oDialogContent);
972
+ }
973
+
974
+ var oNotApplicableItemsModel = new JSONModel(aNotApplicableItems);
975
+ var oTotals = new JSONModel({
976
+ total: nNotApplicable,
977
+ label: mParameters.label
978
+ });
979
+ oApplicableContextDialog.setModel(oNotApplicableItemsModel, "notApplicable");
980
+ oApplicableContextDialog.setModel(oTotals, "totals");
981
+ oApplicableContextDialog.open();
982
+ };
983
+
984
+ if (mParameters.notApplicableContext && mParameters.notApplicableContext.length >= 1) {
985
+ // Show the contexts that are not applicable and will not therefore be processed
986
+ var sFragmentName = "sap.fe.core.controls.ActionPartial";
987
+ var oDialogFragment = XMLTemplateProcessor.loadTemplate(sFragmentName, "fragment");
988
+ var oMetaModel = oModel.getMetaModel();
989
+ var sCanonicalPath = mParameters.contexts[0].getCanonicalPath();
990
+ var sEntitySet = sCanonicalPath.substr(0, sCanonicalPath.indexOf("(")) + "/";
991
+ var oDialogLabelModel = new JSONModel({
992
+ title: mParameters.label
993
+ });
994
+ Promise.resolve(XMLPreprocessor.process(oDialogFragment, {
995
+ name: sFragmentName
996
+ }, {
997
+ bindingContexts: {
998
+ entityType: oMetaModel.createBindingContext(sEntitySet),
999
+ label: oDialogLabelModel.createBindingContext("/")
1000
+ },
1001
+ models: {
1002
+ entityType: oMetaModel,
1003
+ metaModel: oMetaModel,
1004
+ label: oDialogLabelModel
1005
+ }
1006
+ })).then(function (oFragment) {
1007
+ return Fragment.load({
1008
+ definition: oFragment,
1009
+ controller: oController
1010
+ });
1011
+ }).then(function (oPopover) {
1012
+ oApplicableContextDialog = oPopover;
1013
+ mParameters.parentControl.addDependent(oPopover);
1014
+ fnOpenAndFillDialog();
1015
+ }).catch(reject);
1016
+ } else {
1017
+ resolve(mParameters.contexts);
1018
+ }
1019
+ }).then(function (contextToProcess) {
1020
+ if (contextToProcess) {
1021
+ return operations.callBoundAction(sActionName, contextToProcess, oModel, oAppComponent, {
1022
+ invocationGrouping: mParameters.invocationGrouping,
1023
+ label: mParameters.label,
1024
+ showActionParameterDialog: true,
1025
+ mBindingParameters: mBindingParameters,
1026
+ entitySetName: mParameters.entitySetName,
1027
+ additionalSideEffect: mSideEffectsParameters,
1028
+ onSubmitted: function () {
1029
+ messageHandler.removeTransitionMessages();
1030
+ BusyLocker.lock(that.oLockObject);
1031
+ },
1032
+ onResponse: function () {
1033
+ BusyLocker.unlock(that.oLockObject);
1034
+ },
1035
+ parentControl: mParameters.parentControl,
1036
+ controlId: mParameters.controlId,
1037
+ internalModelContext: mParameters.internalModelContext,
1038
+ operationAvailableMap: mParameters.operationAvailableMap,
1039
+ bIsCreateAction: mParameters.bIsCreateAction,
1040
+ bGetBoundContext: mParameters.bGetBoundContext,
1041
+ bObjectPage: mParameters.bObjectPage,
1042
+ messageHandler: messageHandler,
1043
+ defaultValuesExtensionFunction: mParameters.defaultValuesExtensionFunction
1044
+ });
1045
+ } else {
1046
+ return null;
1047
+ }
1048
+ });
1049
+ } else {
1050
+ // TODO: confirm if action import needs side effects.
1051
+ oPromise = operations.callActionImport(sActionName, oModel, oAppComponent, {
1052
+ label: mParameters.label,
1053
+ showActionParameterDialog: true,
1054
+ bindingParameters: mBindingParameters,
1055
+ entitySetName: mParameters.entitySetName,
1056
+ onSubmitted: function () {
1057
+ BusyLocker.lock(that.oLockObject);
1058
+ },
1059
+ onResponse: function () {
1060
+ BusyLocker.unlock(that.oLockObject);
1061
+ },
1062
+ parentControl: mParameters.parentControl,
1063
+ internalModelContext: mParameters.internalModelContext,
1064
+ operationAvailableMap: mParameters.operationAvailableMap,
1065
+ messageHandler: messageHandler,
1066
+ bObjectPage: mParameters.bObjectPage
1067
+ });
1068
+ }
1069
+
1070
+ return oPromise.then(function (oResult) {
1071
+ // Succeeded
1072
+ return that._handleActionResponse(messageHandler, mParameters, sActionName).then(function () {
1073
+ return oResult;
1074
+ });
1075
+ }).catch(function (err) {
1076
+ return that._handleActionResponse(messageHandler, mParameters, sActionName).then(function () {
1077
+ return Promise.reject(err);
1078
+ });
1079
+ });
1080
+ }
1081
+ /**
1082
+ * Handles messages for action call.
1083
+ *
1084
+ * @function
1085
+ * @name sap.fe.core.TransactionHelper#_handleActionResponse
1086
+ * @memberof sap.fe.core.TransactionHelper
1087
+ * @param messageHandler
1088
+ * @param {object} mParameters Parameters to be considered for the action.
1089
+ * @param {string} sActionName The name of the action to be called
1090
+ * @returns {Promise} Promise after message dialog is opened if required.
1091
+ * @ui5-restricted
1092
+ * @final
1093
+ */
1094
+ ;
1095
+
1096
+ _proto._handleActionResponse = function _handleActionResponse(messageHandler, mParameters, sActionName) {
1097
+ var aTransientMessages = messageHandling.getMessages(true, true);
1098
+
1099
+ if (aTransientMessages.length > 0 && mParameters && mParameters.internalModelContext) {
1100
+ mParameters.internalModelContext.setProperty("sActionName", mParameters.label ? mParameters.label : sActionName);
1101
+ }
1102
+
1103
+ return messageHandler.showMessages();
1104
+ }
1105
+ /**
1106
+ * Handles validation errors for the 'discard' action.
1107
+ *
1108
+ * @function
1109
+ * @name sap.fe.core.TransactionHelper#handleValidationError
1110
+ * @memberof sap.fe.core.TransactionHelper
1111
+ * @static
1112
+ * @ui5-restricted
1113
+ * @final
1114
+ */
1115
+ ;
1116
+
1117
+ _proto.handleValidationError = function handleValidationError() {
1118
+ var oMessageManager = Core.getMessageManager(),
1119
+ errorToRemove = oMessageManager.getMessageModel().getData().filter(function (error) {
1120
+ // only needs to handle validation messages, technical and persistent errors needs not to be checked here.
1121
+ if (error.validation) {
1122
+ return error;
1123
+ }
1124
+ });
1125
+ oMessageManager.removeMessages(errorToRemove);
1126
+ }
1127
+ /**
1128
+ * Shows a popover if it needs to be shown.
1129
+ * TODO: Popover is shown if user has modified any data.
1130
+ * TODO: Popover is shown if there's a difference from draft admin data.
1131
+ * @static
1132
+ * @name sap.fe.core.TransactionHelper._showDiscardPopover
1133
+ * @memberof sap.fe.core.TransactionHelper
1134
+ * @param {sap.ui.core.Control} oCancelButton The control which will open the popover
1135
+ * @param bIsModified
1136
+ * @param oResourceBundle
1137
+ * @returns {Promise} Promise resolves if user confirms discard, rejects if otherwise, rejects if no control passed to open popover
1138
+ * @ui5-restricted
1139
+ * @final
1140
+ */
1141
+ ;
1142
+
1143
+ _proto._showDiscardPopover = function _showDiscardPopover(oCancelButton, bIsModified, oResourceBundle) {
1144
+ // TODO: Implement this popover as a fragment as in v2??
1145
+ // eslint-disable-next-line @typescript-eslint/no-this-alias
1146
+ var that = this;
1147
+ that._bContinueDiscard = false; // to be implemented
1148
+
1149
+ return new Promise(function (resolve, reject) {
1150
+ if (!oCancelButton) {
1151
+ reject("Cancel button not found");
1152
+ } //Show popover only when data is changed.
1153
+
1154
+
1155
+ if (bIsModified) {
1156
+ var fnOnAfterDiscard = function () {
1157
+ oCancelButton.setEnabled(true);
1158
+
1159
+ if (that._bContinueDiscard) {
1160
+ resolve();
1161
+ } else {
1162
+ reject("Discard operation was rejected. Document has not been discarded");
1163
+ }
1164
+
1165
+ that._oPopover.detachAfterClose(fnOnAfterDiscard);
1166
+ };
1167
+
1168
+ if (!that._oPopover) {
1169
+ var oText = new Text({
1170
+ //This text is the same as LR v2.
1171
+ //TODO: Display message provided by app developer???
1172
+ text: CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_DRAFT_DISCARD_MESSAGE", oResourceBundle)
1173
+ }),
1174
+ oButton = new Button({
1175
+ text: CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_DRAFT_DISCARD_BUTTON", oResourceBundle),
1176
+ width: "100%",
1177
+ press: function () {
1178
+ that.handleValidationError();
1179
+ that._bContinueDiscard = true;
1180
+
1181
+ that._oPopover.close();
1182
+ },
1183
+ ariaLabelledBy: oText
1184
+ });
1185
+ that._oPopover = new Popover({
1186
+ showHeader: false,
1187
+ placement: "Top",
1188
+ content: [new VBox({
1189
+ items: [oText, oButton]
1190
+ })],
1191
+ beforeOpen: function () {
1192
+ // make sure to NOT trigger multiple cancel flows
1193
+ oCancelButton.setEnabled(false);
1194
+
1195
+ that._oPopover.setInitialFocus(oButton);
1196
+ }
1197
+ });
1198
+
1199
+ that._oPopover.addStyleClass("sapUiContentPadding");
1200
+ }
1201
+
1202
+ that._oPopover.attachAfterClose(fnOnAfterDiscard);
1203
+
1204
+ that._oPopover.openBy(oCancelButton, false);
1205
+ } else {
1206
+ that.handleValidationError();
1207
+ resolve();
1208
+ }
1209
+ });
1210
+ }
1211
+ /**
1212
+ * Sets the document to modified state on patch event.
1213
+ *
1214
+ * @function
1215
+ * @static
1216
+ * @name sap.fe.core.TransactionHelper.handleDocumentModifications
1217
+ * @memberof sap.fe.core.TransactionHelper
1218
+ * @ui5-restricted
1219
+ * @final
1220
+ */
1221
+ ;
1222
+
1223
+ _proto.handleDocumentModifications = function handleDocumentModifications() {
1224
+ this._bIsModified = true;
1225
+ }
1226
+ /**
1227
+ * Retrieves the owner component.
1228
+ *
1229
+ * @function
1230
+ * @static
1231
+ * @private
1232
+ * @name sap.fe.core.TransactionHelper._getOwnerComponent
1233
+ * @memberof sap.fe.core.TransactionHelper
1234
+ * @returns {sap.fe.core.AppComponent} The app component
1235
+ * @ui5-restricted
1236
+ * @final
1237
+ **/
1238
+ ;
1239
+
1240
+ _proto._getAppComponent = function _getAppComponent() {
1241
+ return this._oAppComponent;
1242
+ };
1243
+
1244
+ _proto._onFieldChange = function _onFieldChange(oEvent, oCreateButton, messageHandler, fnValidateRequiredProperties) {
1245
+ messageHandler.removeTransitionMessages();
1246
+ var oField = oEvent.getSource();
1247
+ var oFieldPromise = oEvent.getParameter("promise");
1248
+
1249
+ if (oFieldPromise) {
1250
+ return oFieldPromise.then(function (value) {
1251
+ // Setting value of field as '' in case of value help and validating other fields
1252
+ oField.setValue(value);
1253
+ fnValidateRequiredProperties();
1254
+ return oField.getValue();
1255
+ }).catch(function (value) {
1256
+ if (value !== "") {
1257
+ //disabling the continue button in case of invalid value in field
1258
+ oCreateButton.setEnabled(false);
1259
+ } else {
1260
+ // validating all the fields in case of empty value in field
1261
+ oField.setValue(value);
1262
+ fnValidateRequiredProperties();
1263
+ }
1264
+ });
1265
+ }
1266
+ };
1267
+
1268
+ _proto._launchDialogWithKeyFields = function _launchDialogWithKeyFields(oListBinding, oTransientListBinding, oTransientContext, mFields, oModel, mParameters, messageHandler) {
1269
+ // eslint-disable-next-line @typescript-eslint/no-this-alias
1270
+ var that = this;
1271
+ var oDialog;
1272
+ var oParentControl = mParameters.parentControl,
1273
+ bSuccess = false;
1274
+ return new Promise(function (resolve, reject) {
1275
+ var sFragmentName = "sap/fe/core/controls/NonComputedVisibleKeyFieldsDialog";
1276
+
1277
+ var oFragment = XMLTemplateProcessor.loadTemplate(sFragmentName, "fragment"),
1278
+ oResourceBundle = oParentControl.getController().oResourceBundle,
1279
+ oMetaModel = oModel.getMetaModel(),
1280
+ aImmutableFields = [],
1281
+ oAppComponent = that._getAppComponent(),
1282
+ sPath = oListBinding.isRelative() ? oListBinding.getResolvedPath() : oListBinding.getPath(),
1283
+ oEntitySetContext = oMetaModel.createBindingContext(sPath),
1284
+ sMetaPath = oMetaModel.getMetaPath(sPath);
1285
+
1286
+ for (var i in mFields) {
1287
+ aImmutableFields.push(oMetaModel.createBindingContext(sMetaPath + "/" + mFields[i]));
1288
+ }
1289
+
1290
+ var oImmutableCtxModel = new JSONModel(aImmutableFields);
1291
+ var oImmutableCtx = oImmutableCtxModel.createBindingContext("/");
1292
+ return Promise.resolve(XMLPreprocessor.process(oFragment, {
1293
+ name: sFragmentName
1294
+ }, {
1295
+ bindingContexts: {
1296
+ entitySet: oEntitySetContext,
1297
+ fields: oImmutableCtx
1298
+ },
1299
+ models: {
1300
+ entitySet: oEntitySetContext.getModel(),
1301
+ fields: oImmutableCtx.getModel(),
1302
+ metaModel: oMetaModel
1303
+ }
1304
+ })).then(function (oFragment) {
1305
+ var aFormElements = [];
1306
+ var mFieldValueMap = {};
1307
+ var oCreateButton;
1308
+
1309
+ var validateRequiredProperties = function () {
1310
+ return Promise.all(aFormElements.map(function (oFormElement) {
1311
+ return oFormElement.getFields()[0];
1312
+ }).filter(function (oField) {
1313
+ // The continue button should remain disabled in case of error in any field of the create dialog
1314
+ return oField.getRequired() || oField.getValueState() === ValueState.Error && oField.getValue() !== "";
1315
+ }).map(function (oField) {
1316
+ var sFieldId = oField.getId();
1317
+
1318
+ if (sFieldId in mFieldValueMap) {
1319
+ return Promise.resolve(mFieldValueMap[sFieldId]).then(function (vValue) {
1320
+ return oField.getValueState() === ValueState.Error ? undefined : vValue;
1321
+ }).catch(function () {
1322
+ return undefined;
1323
+ });
1324
+ }
1325
+
1326
+ return oField.getValueState() === ValueState.Error ? undefined : oField.getValue();
1327
+ })).then(function (aResults) {
1328
+ return aResults.every(function (vValue) {
1329
+ return vValue !== undefined && vValue !== null && vValue !== "";
1330
+ });
1331
+ }).catch(function () {
1332
+ return false;
1333
+ }).then(function (bEnabled) {
1334
+ oCreateButton.setEnabled(bEnabled);
1335
+ });
1336
+ };
1337
+
1338
+ var oController = {
1339
+ /*
1340
+ fired on focus out from field or on selecting a value from the valuehelp.
1341
+ the create button is enabled when a value is added.
1342
+ liveChange is not fired when value is added from valuehelp.
1343
+ value validation is not done for create button enablement.
1344
+ */
1345
+ handleChange: function (oEvent) {
1346
+ var sFieldId = oEvent.getParameter("id");
1347
+ mFieldValueMap[sFieldId] = that._onFieldChange(oEvent, oCreateButton, messageHandler, validateRequiredProperties);
1348
+ },
1349
+
1350
+ /*
1351
+ fired on key press. the create button is enabled when a value is added.
1352
+ liveChange is not fired when value is added from valuehelp.
1353
+ value validation is not done for create button enablement.
1354
+ */
1355
+ handleLiveChange: function (oEvent) {
1356
+ var sFieldId = oEvent.getParameter("id");
1357
+ var vValue = oEvent.getParameter("value");
1358
+ mFieldValueMap[sFieldId] = vValue;
1359
+ validateRequiredProperties();
1360
+ }
1361
+ };
1362
+ return Fragment.load({
1363
+ definition: oFragment,
1364
+ controller: oController
1365
+ }).then(function (oDialogContent) {
1366
+ oDialog = new Dialog({
1367
+ title: CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_SAPFE_ACTION_CREATE", oResourceBundle),
1368
+ content: [oDialogContent],
1369
+ beginButton: {
1370
+ text: CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_SAPFE_ACTION_CREATE_BUTTON", oResourceBundle),
1371
+ type: "Emphasized",
1372
+ press: function (oEvent) {
1373
+ var oCreateButton = oEvent.getSource();
1374
+ oCreateButton.setEnabled(false);
1375
+ BusyLocker.lock(oDialog);
1376
+ mParameters.bIsCreateDialog = true;
1377
+ return Promise.all(Object.keys(mFieldValueMap).map(function (sKey) {
1378
+ return mFieldValueMap[sKey].then(function (oValue) {
1379
+ var oDialogValue = {};
1380
+ oDialogValue[sKey] = oValue;
1381
+ return oDialogValue;
1382
+ });
1383
+ })).then(function (aValues) {
1384
+ var onBeforeCreatePromise;
1385
+
1386
+ if (mParameters.beforeCreateCallBack) {
1387
+ onBeforeCreatePromise = mParameters.beforeCreateCallBack({
1388
+ contextPath: oListBinding && oListBinding.getPath(),
1389
+ createParameters: aValues
1390
+ });
1391
+ } else {
1392
+ onBeforeCreatePromise = Promise.resolve();
1393
+ }
1394
+
1395
+ return onBeforeCreatePromise;
1396
+ }).then(function () {
1397
+ var oPromise = that.onAfterCreateCompletion(oTransientListBinding, oTransientContext, mParameters);
1398
+ oModel.submitBatch("submitLater");
1399
+ return oPromise;
1400
+ }).then(function (oResponse) {
1401
+ if (!oResponse || oResponse && oResponse.bKeepDialogOpen !== true) {
1402
+ oDialog.setBindingContext(null);
1403
+ oDialog.close();
1404
+ resolve(oResponse);
1405
+ }
1406
+ }).catch(function (oError) {
1407
+ reject(oError);
1408
+ }).finally(function () {
1409
+ BusyLocker.unlock(oDialog);
1410
+ oCreateButton.setEnabled(true);
1411
+ return messageHandler.showMessages();
1412
+ });
1413
+ }
1414
+ },
1415
+ endButton: {
1416
+ text: CommonUtils.getTranslatedText("C_COMMON_ACTION_PARAMETER_DIALOG_CANCEL", oResourceBundle),
1417
+ press: function () {
1418
+ oDialog.close();
1419
+ }
1420
+ },
1421
+ afterClose: function () {
1422
+ var _oDialog$getBindingCo;
1423
+
1424
+ // show footer as per UX guidelines when dialog is not open
1425
+ (_oDialog$getBindingCo = oDialog.getBindingContext("internal")) === null || _oDialog$getBindingCo === void 0 ? void 0 : _oDialog$getBindingCo.setProperty("isCreateDialogOpen", false);
1426
+ oDialog.destroy();
1427
+
1428
+ if (!bSuccess) {
1429
+ reject({
1430
+ bDeleteTransientContext: true,
1431
+ navigateBackFromTransientState: true
1432
+ });
1433
+ }
1434
+ }
1435
+ });
1436
+ aFormElements = oDialogContent.getAggregation("form").getAggregation("formContainers")[0].getAggregation("formElements");
1437
+
1438
+ if (oParentControl && oParentControl.addDependent) {
1439
+ // if there is a parent control specified add the dialog as dependent
1440
+ oParentControl.addDependent(oDialog);
1441
+ }
1442
+
1443
+ oCreateButton = oDialog.getBeginButton();
1444
+ oDialog.setBindingContext(oTransientContext);
1445
+ return CommonUtils.setUserDefaults(oAppComponent, aImmutableFields, oTransientContext, false, mParameters.createAction, mParameters.data).then(function () {
1446
+ validateRequiredProperties(); // footer must not be visible when the dialog is open as per UX guidelines
1447
+
1448
+ oDialog.getBindingContext("internal").setProperty("isCreateDialogOpen", true);
1449
+ oDialog.open();
1450
+ }).catch(function (oError) {
1451
+ return messageHandler.showMessages().then(function () {
1452
+ return Promise.reject(oError);
1453
+ });
1454
+ });
1455
+ });
1456
+ });
1457
+ });
1458
+ };
1459
+
1460
+ _proto.onAfterCreateCompletion = function onAfterCreateCompletion(oListBinding, oNewDocumentContext, mParameters) {
1461
+ var fnResolve, fnReject;
1462
+ var oPromise = new Promise(function (resolve, reject) {
1463
+ fnResolve = resolve;
1464
+ fnReject = reject;
1465
+ }); // eslint-disable-next-line @typescript-eslint/no-this-alias
1466
+
1467
+ var that = this; // Workaround suggested by OData model v4 colleagues
1468
+
1469
+ var fnCreateCompleted = function (oEvent) {
1470
+ var oContext = oEvent.getParameter("context"),
1471
+ bSuccess = oEvent.getParameter("success");
1472
+
1473
+ if (oContext === oNewDocumentContext) {
1474
+ oListBinding.detachCreateCompleted(fnCreateCompleted, that);
1475
+
1476
+ if (!bSuccess) {
1477
+ var oError = {
1478
+ bDeleteTransientContext: false
1479
+ };
1480
+
1481
+ if (!mParameters.keepTransientContextOnFailed) {
1482
+ // the context is deleted
1483
+ // this is needed to avoid console errors TO be checked with model colleagues
1484
+ oContext.created().then(undefined, function () {
1485
+ Log.trace("transient creation context deleted");
1486
+ }).catch(function (oError) {
1487
+ Log.trace("transient creation context deletion error", oError);
1488
+ });
1489
+
1490
+ if (!mParameters.bIsCreateDialog) {
1491
+ // if current state is transient (...), browser will come back to previous state
1492
+ oError.navigateBackFromTransientState = true;
1493
+ oError.bDeleteTransientContext = true;
1494
+ fnReject(oError);
1495
+ }
1496
+ }
1497
+
1498
+ fnResolve({
1499
+ bKeepDialogOpen: true
1500
+ });
1501
+ } else {
1502
+ fnResolve();
1503
+ }
1504
+ }
1505
+ };
1506
+
1507
+ oListBinding.attachCreateCompleted(fnCreateCompleted, this);
1508
+ return oPromise;
1509
+ }
1510
+ /**
1511
+ * Retrieves the name of the NewAction to be executed.
1512
+ *
1513
+ * @function
1514
+ * @static
1515
+ * @private
1516
+ * @name sap.fe.core.TransactionHelper._getNewAction
1517
+ * @memberof sap.fe.core.TransactionHelper
1518
+ * @param {object} oStartupParameters Startup parameters of the application
1519
+ * @param {string} sCreateHash Hash to be checked for action type
1520
+ * @param {object} oMetaModel The MetaModel used to check for NewAction parameter
1521
+ * @param {string} sMetaPath The MetaPath
1522
+ * @returns {string} The name of the action
1523
+ * @ui5-restricted
1524
+ * @final
1525
+ **/
1526
+ ;
1527
+
1528
+ _proto._getNewAction = function _getNewAction(oStartupParameters, sCreateHash, oMetaModel, sMetaPath) {
1529
+ var sNewAction;
1530
+
1531
+ if (oStartupParameters && oStartupParameters.preferredMode && sCreateHash.indexOf("i-action=createWith") > -1) {
1532
+ var sPreferredMode = oStartupParameters.preferredMode[0];
1533
+ sNewAction = sPreferredMode.indexOf("createWith:") > -1 ? sPreferredMode.substr(sPreferredMode.lastIndexOf(":") + 1) : undefined;
1534
+ } else {
1535
+ sNewAction = oMetaModel && oMetaModel.getObject !== undefined ? oMetaModel.getObject(sMetaPath + "@com.sap.vocabularies.Session.v1.StickySessionSupported/NewAction") || oMetaModel.getObject(sMetaPath + "@com.sap.vocabularies.Common.v1.DraftRoot/NewAction") : undefined;
1536
+ }
1537
+
1538
+ return sNewAction;
1539
+ }
1540
+ /**
1541
+ * Retrieves the label for the title of a specific create action dialog, e.g. Create Sales Order from Quotation.
1542
+ *
1543
+ * The following priority is applied:
1544
+ * 1. label of line-item annotation.
1545
+ * 2. label annotated in the action.
1546
+ * 3. "Create" as a constant from i18n.
1547
+ *
1548
+ * @function
1549
+ * @static
1550
+ * @private
1551
+ * @name sap.fe.core.TransactionHelper._getSpecificCreateActionDialogLabel
1552
+ * @memberof sap.fe.core.TransactionHelper
1553
+ * @param {object} oMetaModel The MetaModel used to check for the NewAction parameter
1554
+ * @param {string} sMetaPath The MetaPath
1555
+ * @param {string} sNewAction Contains the name of the action to be executed
1556
+ * @param {object} oResourceBundleCore ResourceBundle to access the default Create label
1557
+ * @returns {string} The label for the Create Action Dialog
1558
+ * @ui5-restricted
1559
+ * @final
1560
+ **/
1561
+ ;
1562
+
1563
+ _proto._getSpecificCreateActionDialogLabel = function _getSpecificCreateActionDialogLabel(oMetaModel, sMetaPath, sNewAction, oResourceBundleCore) {
1564
+ var fnGetLabelFromLineItemAnnotation = function () {
1565
+ if (oMetaModel && oMetaModel.getObject(sMetaPath + "/@com.sap.vocabularies.UI.v1.LineItem")) {
1566
+ var iLineItemIndex = oMetaModel.getObject(sMetaPath + "/@com.sap.vocabularies.UI.v1.LineItem").findIndex(function (oLineItem) {
1567
+ var aLineItemAction = oLineItem.Action ? oLineItem.Action.split("(") : undefined;
1568
+ return aLineItemAction ? aLineItemAction[0] === sNewAction : false;
1569
+ });
1570
+ return iLineItemIndex > -1 ? oMetaModel.getObject(sMetaPath + "/@com.sap.vocabularies.UI.v1.LineItem")[iLineItemIndex].Label : undefined;
1571
+ } else {
1572
+ return undefined;
1573
+ }
1574
+ };
1575
+
1576
+ return fnGetLabelFromLineItemAnnotation() || oMetaModel && oMetaModel.getObject(sMetaPath + "/" + sNewAction + "@com.sap.vocabularies.Common.v1.Label") || oResourceBundleCore && oResourceBundleCore.getText("C_TRANSACTION_HELPER_SAPFE_ACTION_CREATE");
1577
+ };
1578
+
1579
+ return TransactionHelper;
1580
+ }();
1581
+
1582
+ return TransactionHelper;
1583
+ }, false);
1584
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlRyYW5zYWN0aW9uSGVscGVyLnRzIl0sIm5hbWVzIjpbIkNyZWF0aW9uTW9kZSIsIkZFTGlicmFyeSIsIlByb2dyYW1taW5nTW9kZWwiLCJWYWx1ZVN0YXRlIiwiY29yZUxpYnJhcnkiLCJnZXRQYXJhbWV0ZXJzIiwibVBhcmFtZXRlcnMiLCJnZXRNZXRhZGF0YSIsImdldE5hbWUiLCJUcmFuc2FjdGlvbkhlbHBlciIsIm9BcHBDb21wb25lbnQiLCJvTG9ja09iamVjdCIsIl9iSXNNb2RpZmllZCIsIl9iQ3JlYXRlTW9kZSIsIl9iQ29udGludWVEaXNjYXJkIiwiX29BcHBDb21wb25lbnQiLCJnZXRQcm9ncmFtbWluZ01vZGVsIiwib0NvbnRleHQiLCJzUHJvZ3JhbW1pbmdNb2RlbCIsInNQYXRoIiwiaXNBIiwiZ2V0UGF0aCIsImlzUmVsYXRpdmUiLCJnZXRSZXNvbHZlZFBhdGgiLCJNb2RlbEhlbHBlciIsImlzRHJhZnRTdXBwb3J0ZWQiLCJnZXRNb2RlbCIsImdldE1ldGFNb2RlbCIsIkRyYWZ0IiwiaXNTdGlja3lTZXNzaW9uU3VwcG9ydGVkIiwiU3RpY2t5IiwiTm9uRHJhZnQiLCJ2YWxpZGF0ZURvY3VtZW50Iiwib1ZpZXciLCJzQ3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uIiwiY3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uIiwic01vZHVsZSIsInN1YnN0cmluZyIsImxhc3RJbmRleE9mIiwicmVwbGFjZSIsInNGdW5jdGlvbk5hbWUiLCJsZW5ndGgiLCJtRGF0YSIsImRhdGEiLCJGUE1IZWxwZXIiLCJ2YWxpZGF0aW9uV3JhcHBlciIsIlByb21pc2UiLCJyZXNvbHZlIiwiY3JlYXRlRG9jdW1lbnQiLCJvTWFpbkxpc3RCaW5kaW5nIiwibUluUGFyYW1ldGVycyIsIm9SZXNvdXJjZUJ1bmRsZSIsIm1lc3NhZ2VIYW5kbGVyIiwiYkZyb21Db3B5UGFzdGUiLCJ0aGF0Iiwib01vZGVsIiwib01ldGFNb2RlbCIsInNNZXRhUGF0aCIsImdldE1ldGFQYXRoIiwiZ2V0SGVhZGVyQ29udGV4dCIsInNDcmVhdGVIYXNoIiwiX2dldEFwcENvbXBvbmVudCIsImdldFJvdXRlclByb3h5IiwiZ2V0SGFzaCIsIm9Db21wb25lbnREYXRhIiwiZ2V0Q29tcG9uZW50RGF0YSIsIm9TdGFydHVwUGFyYW1ldGVycyIsInN0YXJ0dXBQYXJhbWV0ZXJzIiwic05ld0FjdGlvbiIsIl9nZXROZXdBY3Rpb24iLCJ1bmRlZmluZWQiLCJvQ3JlYXRpb25Qcm9taXNlIiwibUJpbmRpbmdQYXJhbWV0ZXJzIiwic01lc3NhZ2VzUGF0aCIsImdldE9iamVjdCIsInNCdXN5UGF0aCIsImdldFRhcmdldEVudGl0eVNldCIsImdldENvbnRleHQiLCJiRnVuY3Rpb25Pbk5hdlByb3AiLCJvTmV3RG9jdW1lbnRDb250ZXh0IiwicmVqZWN0IiwiYnVzeU1vZGUiLCJzSWQiLCJiZWZvcmVDcmVhdGVDYWxsQmFjayIsIkJ1c3lMb2NrZXIiLCJsb2NrIiwib1Jlc291cmNlQnVuZGxlQ29yZSIsIkNvcmUiLCJnZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUiLCJjYWxsQWN0aW9uIiwiY29udGV4dHMiLCJzaG93QWN0aW9uUGFyYW1ldGVyRGlhbG9nIiwibGFiZWwiLCJfZ2V0U3BlY2lmaWNDcmVhdGVBY3Rpb25EaWFsb2dMYWJlbCIsImJpbmRpbmdQYXJhbWV0ZXJzIiwicGFyZW50Q29udHJvbCIsImJJc0NyZWF0ZUFjdGlvbiIsImJJc05ld1BhZ2VDcmVhdGlvbiIsImNyZWF0aW9uTW9kZSIsIkNyZWF0aW9uUm93IiwiSW5saW5lIiwiYU5vbkNvbXB1dGVkVmlzaWJsZUtleUZpZWxkcyIsIkNvbW1vblV0aWxzIiwiZ2V0Tm9uQ29tcHV0ZWRWaXNpYmxlRmllbGRzIiwic0Z1bmN0aW9uUGF0aCIsIm9GdW5jdGlvbkNvbnRleHQiLCJvRnVuY3Rpb24iLCJjcmVhdGVCaW5kaW5nQ29udGV4dCIsIiRJc0JvdW5kIiwib3BlcmF0aW9ucyIsImNhbGxCb3VuZEZ1bmN0aW9uIiwiY2FsbEZ1bmN0aW9uSW1wb3J0IiwidGhlbiIsImNhdGNoIiwib0Vycm9yIiwiTG9nIiwiZXJyb3IiLCJvRGF0YSIsIk9iamVjdCIsImFzc2lnbiIsIm9UcmFuc2llbnRMaXN0QmluZGluZyIsImJpbmRMaXN0IiwiJCR1cGRhdGVHcm91cElkIiwicmVmcmVzaEludGVybmFsIiwiY3JlYXRlIiwiX2xhdW5jaERpYWxvZ1dpdGhLZXlGaWVsZHMiLCJvbkJlZm9yZUNyZWF0ZVByb21pc2UiLCJjb250ZXh0UGF0aCIsImNyZWF0ZUF0RW5kIiwiaW5hY3RpdmUiLCJvbkFmdGVyQ3JlYXRlQ29tcGxldGlvbiIsIm9SZXN1bHQiLCJyZXNwb25zZSIsImJDb25zaWRlckRvY3VtZW50TW9kaWZpZWQiLCJoYW5kbGVEb2N1bWVudE1vZGlmaWNhdGlvbnMiLCJzaG93TWVzc2FnZURpYWxvZyIsImJEZWxldGVUcmFuc2llbnRDb250ZXh0IiwiaXNUcmFuc2llbnQiLCJkZWxldGUiLCJmaW5hbGx5IiwidW5sb2NrIiwiZmluZEFjdGl2ZURyYWZ0Um9vdENvbnRleHRzIiwiYUNvbnRleHRzIiwiYkZpbmRBY3RpdmVDb250ZXh0cyIsImFjdGl2ZUNvbnRleHRzIiwicmVkdWNlIiwiYVJlc3VsdCIsImJJc0FjdGl2ZUVudGl0eSIsIklzQWN0aXZlRW50aXR5IiwiYkhhc0FjdGl2ZUVudGl0eSIsIkhhc0FjdGl2ZUVudGl0eSIsIm9BY3RpdmVDb250ZXh0IiwiYmluZENvbnRleHQiLCJnZXRCb3VuZENvbnRleHQiLCJwdXNoIiwiYWxsIiwibWFwIiwicmVxdWVzdENhbm9uaWNhbFBhdGgiLCJhZnRlckRlbGV0ZVByb2Nlc3MiLCJjaGVja0JveCIsIm9JbnRlcm5hbE1vZGVsQ29udGV4dCIsImludGVybmFsTW9kZWxDb250ZXh0IiwiZ2V0UHJvcGVydHkiLCJpc0NoZWNrQm94VmlzaWJsZSIsImlzQ2hlY2tCb3hTZWxlY3RlZCIsInNldFByb3BlcnR5Iiwib2JqIiwic2VsZWN0ZWRDb250ZXh0cyIsImZpbHRlciIsImVsZW1lbnQiLCJkZWxldGFibGVDb250ZXh0cyIsImluZGV4T2YiLCJudW1iZXJPZlNlbGVjdGVkQ29udGV4dHMiLCJNZXNzYWdlVG9hc3QiLCJzaG93IiwiZ2V0VHJhbnNsYXRlZFRleHQiLCJlbnRpdHlTZXROYW1lIiwiZGVsZXRlRG9jdW1lbnQiLCJ2Q29udGV4dHMiLCJmblJlamVjdCIsImZuUmVzb2x2ZSIsImFEZWxldGFibGVDb250ZXh0cyIsImlzTG9ja2VkVGV4dFZpc2libGUiLCJjYW5ub3RCZURlbGV0ZWRUZXh0VmlzaWJsZSIsImJEaWFsb2dDb25maXJtZWQiLCJhUGFyYW1zIiwib0RlbGV0ZU1lc3NhZ2UiLCJ0aXRsZSIsImdldFRleHQiLCJtZXNzYWdlSGFuZGxpbmciLCJyZW1vdmVCb3VuZFRyYW5zaXRpb25NZXNzYWdlcyIsIkFycmF5IiwiaXNBcnJheSIsImkiLCJvQ29udGV4dERhdGEiLCJIYXNEcmFmdEVudGl0eSIsIkRyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhIiwiSW5Qcm9jZXNzQnlVc2VyIiwiRHJhZnRJc0NyZWF0ZWRCeU1lIiwiTWVzc2FnZUJveCIsIm9uQ2xvc2UiLCJkZXNjcmlwdGlvbiIsInRleHQiLCJ1blNhdmVkQ29udGV4dHMiLCJkcmFmdEFkbWluRGF0YSIsInNMYXN0Q2hhbmdlZEJ5VXNlciIsImNvbmNhdCIsImxvY2tlZENvbnRleHRzIiwibm9uRGVsZXRhYmxlVGV4dCIsImNoZWNrQm94VGV4dCIsIm9Ob25EZWxldGFibGVNZXNzYWdlVGV4dENvbnRyb2wiLCJvRGVsZXRlTWVzc2FnZVRleHRDb250cm9sIiwib0NvbnRlbnQiLCJWQm94IiwiaXRlbXMiLCJUZXh0IiwidmlzaWJsZSIsIkNoZWNrQm94Iiwic2VsZWN0ZWQiLCJzZWxlY3QiLCJvRXZlbnQiLCJnZXRTb3VyY2UiLCJnZXRTZWxlY3RlZCIsInNUaXRsZSIsImZuQ29uZmlybSIsIm9uQmVmb3JlRGVsZXRlUHJvbWlzZSIsImJlZm9yZURlbGV0ZUNhbGxCYWNrIiwiYmluZCIsImRyYWZ0IiwiZGVsZXRlRHJhZnQiLCJzaG93TWVzc2FnZXMiLCJvRGlhbG9nIiwiRGlhbG9nIiwic3RhdGUiLCJjb250ZW50IiwiYXJpYUxhYmVsbGVkQnkiLCJnZXRWaXNpYmxlIiwiYmVnaW5CdXR0b24iLCJCdXR0b24iLCJ0eXBlIiwicHJlc3MiLCJjbG9zZSIsImVuZEJ1dHRvbiIsImFmdGVyQ2xvc2UiLCJkZXN0cm95Iiwibm9EaWFsb2ciLCJhZGRTdHlsZUNsYXNzIiwib3BlbiIsIndhcm5pbmciLCJlZGl0RG9jdW1lbnQiLCJvRWRpdFByb21pc2UiLCJFcnJvciIsInJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcyIsImNyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50IiwiYlByZXNlcnZlQ2hhbmdlcyIsInN0aWNreSIsImVkaXREb2N1bWVudEluU3RpY2t5U2Vzc2lvbiIsIm9OZXdDb250ZXh0IiwiZXJyIiwiY2FuY2VsRG9jdW1lbnQiLCJvUGFyYW1zQ29udGV4dCIsIm9DYW5jZWxCdXR0b24iLCJjYW5jZWxCdXR0b24iLCJvbkJlZm9yZUNhbmNlbFByb21pc2UiLCJzQ2Fub25pY2FsUGF0aCIsInNQTW9kZWwiLCJkcmFmdERhdGFDb250ZXh0IiwicmVxdWVzdE9iamVjdCIsIkNyZWF0aW9uRGF0ZVRpbWUiLCJMYXN0Q2hhbmdlRGF0ZVRpbWUiLCJza2lwRGlzY2FyZFBvcG92ZXIiLCJfc2hvd0Rpc2NhcmRQb3BvdmVyIiwiYmVmb3JlQ2FuY2VsQ2FsbEJhY2siLCJjb250ZXh0Iiwib0RlbGV0ZVByb21pc2UiLCJoYXNQZW5kaW5nQ2hhbmdlcyIsImdldEJpbmRpbmciLCJyZXNldENoYW5nZXMiLCJkaXNjYXJkRG9jdW1lbnQiLCJyZWZyZXNoIiwic2F2ZURvY3VtZW50IiwiYkV4ZWN1dGVTaWRlRWZmZWN0c09uRXJyb3IiLCJhQmluZGluZ3MiLCJvU2F2ZVByb21pc2UiLCJhY3RpdmF0ZURvY3VtZW50IiwiYkVuYWJsZVN0cmljdEhhbmRsaW5nIiwiVXJpUGFyYW1ldGVycyIsImZyb21RdWVyeSIsIndpbmRvdyIsImxvY2F0aW9uIiwic2VhcmNoIiwiZ2V0Iiwib0FjdGl2ZURvY3VtZW50IiwiYk5ld09iamVjdCIsImZvckVhY2giLCJvTGlzdEJpbmRpbmciLCJoYXNUcmFuc2llbnRDb250ZXh0IiwiZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlIiwicmVxdWVzdFNpZGVFZmZlY3RzRm9yTmF2aWdhdGlvblByb3BlcnR5Iiwic0FjdGlvbk5hbWUiLCJvUHJvbWlzZSIsInNOYW1lIiwic3BsaXQiLCJtb2RlbCIsIm1TaWRlRWZmZWN0c1BhcmFtZXRlcnMiLCJnZXRPRGF0YUFjdGlvblNpZGVFZmZlY3RzIiwib0FwcGxpY2FibGVDb250ZXh0RGlhbG9nIiwib0NvbnRyb2xsZXIiLCJvbkNvbnRpbnVlIiwiYXBwbGljYWJsZUNvbnRleHQiLCJmbk9wZW5BbmRGaWxsRGlhbG9nIiwib0RpYWxvZ0NvbnRlbnQiLCJuTm90QXBwbGljYWJsZSIsIm5vdEFwcGxpY2FibGVDb250ZXh0IiwiYU5vdEFwcGxpY2FibGVJdGVtcyIsIm9Ob3RBcHBsaWNhYmxlSXRlbXNNb2RlbCIsIkpTT05Nb2RlbCIsIm9Ub3RhbHMiLCJ0b3RhbCIsInNldE1vZGVsIiwic0ZyYWdtZW50TmFtZSIsIm9EaWFsb2dGcmFnbWVudCIsIlhNTFRlbXBsYXRlUHJvY2Vzc29yIiwibG9hZFRlbXBsYXRlIiwiZ2V0Q2Fub25pY2FsUGF0aCIsInNFbnRpdHlTZXQiLCJzdWJzdHIiLCJvRGlhbG9nTGFiZWxNb2RlbCIsIlhNTFByZXByb2Nlc3NvciIsInByb2Nlc3MiLCJuYW1lIiwiYmluZGluZ0NvbnRleHRzIiwiZW50aXR5VHlwZSIsIm1vZGVscyIsIm1ldGFNb2RlbCIsIm9GcmFnbWVudCIsIkZyYWdtZW50IiwibG9hZCIsImRlZmluaXRpb24iLCJjb250cm9sbGVyIiwib1BvcG92ZXIiLCJhZGREZXBlbmRlbnQiLCJjb250ZXh0VG9Qcm9jZXNzIiwiY2FsbEJvdW5kQWN0aW9uIiwiaW52b2NhdGlvbkdyb3VwaW5nIiwiYWRkaXRpb25hbFNpZGVFZmZlY3QiLCJvblN1Ym1pdHRlZCIsIm9uUmVzcG9uc2UiLCJjb250cm9sSWQiLCJvcGVyYXRpb25BdmFpbGFibGVNYXAiLCJiR2V0Qm91bmRDb250ZXh0IiwiYk9iamVjdFBhZ2UiLCJkZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb24iLCJjYWxsQWN0aW9uSW1wb3J0IiwiX2hhbmRsZUFjdGlvblJlc3BvbnNlIiwiYVRyYW5zaWVudE1lc3NhZ2VzIiwiZ2V0TWVzc2FnZXMiLCJoYW5kbGVWYWxpZGF0aW9uRXJyb3IiLCJvTWVzc2FnZU1hbmFnZXIiLCJnZXRNZXNzYWdlTWFuYWdlciIsImVycm9yVG9SZW1vdmUiLCJnZXRNZXNzYWdlTW9kZWwiLCJnZXREYXRhIiwidmFsaWRhdGlvbiIsInJlbW92ZU1lc3NhZ2VzIiwiYklzTW9kaWZpZWQiLCJmbk9uQWZ0ZXJEaXNjYXJkIiwic2V0RW5hYmxlZCIsIl9vUG9wb3ZlciIsImRldGFjaEFmdGVyQ2xvc2UiLCJvVGV4dCIsIm9CdXR0b24iLCJ3aWR0aCIsIlBvcG92ZXIiLCJzaG93SGVhZGVyIiwicGxhY2VtZW50IiwiYmVmb3JlT3BlbiIsInNldEluaXRpYWxGb2N1cyIsImF0dGFjaEFmdGVyQ2xvc2UiLCJvcGVuQnkiLCJfb25GaWVsZENoYW5nZSIsIm9DcmVhdGVCdXR0b24iLCJmblZhbGlkYXRlUmVxdWlyZWRQcm9wZXJ0aWVzIiwib0ZpZWxkIiwib0ZpZWxkUHJvbWlzZSIsImdldFBhcmFtZXRlciIsInZhbHVlIiwic2V0VmFsdWUiLCJnZXRWYWx1ZSIsIm9UcmFuc2llbnRDb250ZXh0IiwibUZpZWxkcyIsIm9QYXJlbnRDb250cm9sIiwiYlN1Y2Nlc3MiLCJnZXRDb250cm9sbGVyIiwiYUltbXV0YWJsZUZpZWxkcyIsIm9FbnRpdHlTZXRDb250ZXh0Iiwib0ltbXV0YWJsZUN0eE1vZGVsIiwib0ltbXV0YWJsZUN0eCIsImVudGl0eVNldCIsImZpZWxkcyIsImFGb3JtRWxlbWVudHMiLCJtRmllbGRWYWx1ZU1hcCIsInZhbGlkYXRlUmVxdWlyZWRQcm9wZXJ0aWVzIiwib0Zvcm1FbGVtZW50IiwiZ2V0RmllbGRzIiwiZ2V0UmVxdWlyZWQiLCJnZXRWYWx1ZVN0YXRlIiwic0ZpZWxkSWQiLCJnZXRJZCIsInZWYWx1ZSIsImFSZXN1bHRzIiwiZXZlcnkiLCJiRW5hYmxlZCIsImhhbmRsZUNoYW5nZSIsImhhbmRsZUxpdmVDaGFuZ2UiLCJiSXNDcmVhdGVEaWFsb2ciLCJrZXlzIiwic0tleSIsIm9WYWx1ZSIsIm9EaWFsb2dWYWx1ZSIsImFWYWx1ZXMiLCJjcmVhdGVQYXJhbWV0ZXJzIiwic3VibWl0QmF0Y2giLCJvUmVzcG9uc2UiLCJiS2VlcERpYWxvZ09wZW4iLCJzZXRCaW5kaW5nQ29udGV4dCIsImdldEJpbmRpbmdDb250ZXh0IiwibmF2aWdhdGVCYWNrRnJvbVRyYW5zaWVudFN0YXRlIiwiZ2V0QWdncmVnYXRpb24iLCJnZXRCZWdpbkJ1dHRvbiIsInNldFVzZXJEZWZhdWx0cyIsImNyZWF0ZUFjdGlvbiIsImZuQ3JlYXRlQ29tcGxldGVkIiwiZGV0YWNoQ3JlYXRlQ29tcGxldGVkIiwia2VlcFRyYW5zaWVudENvbnRleHRPbkZhaWxlZCIsImNyZWF0ZWQiLCJ0cmFjZSIsImF0dGFjaENyZWF0ZUNvbXBsZXRlZCIsInByZWZlcnJlZE1vZGUiLCJzUHJlZmVycmVkTW9kZSIsImZuR2V0TGFiZWxGcm9tTGluZUl0ZW1Bbm5vdGF0aW9uIiwiaUxpbmVJdGVtSW5kZXgiLCJmaW5kSW5kZXgiLCJvTGluZUl0ZW0iLCJhTGluZUl0ZW1BY3Rpb24iLCJBY3Rpb24iLCJMYWJlbCJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTs7OztBQThCQSxNQUFNQSxZQUFZLEdBQUdDLFNBQVMsQ0FBQ0QsWUFBL0I7QUFDQSxNQUFNRSxnQkFBZ0IsR0FBR0QsU0FBUyxDQUFDQyxnQkFBbkM7QUFDQSxNQUFNQyxVQUFVLEdBQUdDLFdBQVcsQ0FBQ0QsVUFBL0I7QUFDQTs7QUFDQSxXQUFTRSxhQUFULENBQXVCQyxXQUF2QixFQUF5QztBQUN4QyxRQUFJQSxXQUFXLElBQUlBLFdBQVcsQ0FBQ0MsV0FBM0IsSUFB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bmRsZSBmcm9tIFwic2FwL2Jhc2UvaTE4bi9SZXNvdXJjZUJ1bmRsZVwiO1xuaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgVXJpUGFyYW1ldGVycyBmcm9tIFwic2FwL2Jhc2UvdXRpbC9VcmlQYXJhbWV0ZXJzXCI7XG5pbXBvcnQgQXBwQ29tcG9uZW50IGZyb20gXCJzYXAvZmUvY29yZS9BcHBDb21wb25lbnRcIjtcbmltcG9ydCBDb21tb25VdGlscyBmcm9tIFwic2FwL2ZlL2NvcmUvQ29tbW9uVXRpbHNcIjtcbmltcG9ydCBCdXN5TG9ja2VyIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9CdXN5TG9ja2VyXCI7XG5pbXBvcnQgZHJhZnQgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2VkaXRGbG93L2RyYWZ0XCI7XG5pbXBvcnQgb3BlcmF0aW9ucyBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvZWRpdEZsb3cvb3BlcmF0aW9uc1wiO1xuaW1wb3J0IHN0aWNreSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvZWRpdEZsb3cvc3RpY2t5XCI7XG5pbXBvcnQgbWVzc2FnZUhhbmRsaW5nIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9tZXNzYWdlSGFuZGxlci9tZXNzYWdlSGFuZGxpbmdcIjtcbmltcG9ydCBGUE1IZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvRlBNSGVscGVyXCI7XG5pbXBvcnQgTW9kZWxIZWxwZXIsIHsgSW50ZXJuYWxNb2RlbENvbnRleHQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0IEZFTGlicmFyeSBmcm9tIFwic2FwL2ZlL2NvcmUvbGlicmFyeVwiO1xuaW1wb3J0IEJ1dHRvbiBmcm9tIFwic2FwL20vQnV0dG9uXCI7XG5pbXBvcnQgQ2hlY2tCb3ggZnJvbSBcInNhcC9tL0NoZWNrQm94XCI7XG5pbXBvcnQgRGlhbG9nIGZyb20gXCJzYXAvbS9EaWFsb2dcIjtcbmltcG9ydCBNZXNzYWdlQm94IGZyb20gXCJzYXAvbS9NZXNzYWdlQm94XCI7XG5pbXBvcnQgTWVzc2FnZVRvYXN0IGZyb20gXCJzYXAvbS9NZXNzYWdlVG9hc3RcIjtcbmltcG9ydCBQb3BvdmVyIGZyb20gXCJzYXAvbS9Qb3BvdmVyXCI7XG5pbXBvcnQgVGV4dCBmcm9tIFwic2FwL20vVGV4dFwiO1xuaW1wb3J0IFZCb3ggZnJvbSBcInNhcC9tL1ZCb3hcIjtcbmltcG9ydCBDb3JlIGZyb20gXCJzYXAvdWkvY29yZS9Db3JlXCI7XG5pbXBvcnQgRnJhZ21lbnQgZnJvbSBcInNhcC91aS9jb3JlL0ZyYWdtZW50XCI7XG5pbXBvcnQgY29yZUxpYnJhcnkgZnJvbSBcInNhcC91aS9jb3JlL2xpYnJhcnlcIjtcbmltcG9ydCBWaWV3IGZyb20gXCJzYXAvdWkvY29yZS9tdmMvVmlld1wiO1xuaW1wb3J0IFhNTFByZXByb2Nlc3NvciBmcm9tIFwic2FwL3VpL2NvcmUvdXRpbC9YTUxQcmVwcm9jZXNzb3JcIjtcbmltcG9ydCBYTUxUZW1wbGF0ZVByb2Nlc3NvciBmcm9tIFwic2FwL3VpL2NvcmUvWE1MVGVtcGxhdGVQcm9jZXNzb3JcIjtcbmltcG9ydCBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvQ29udGV4dFwiO1xuaW1wb3J0IEpTT05Nb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL2pzb24vSlNPTk1vZGVsXCI7XG5pbXBvcnQgT0RhdGFNZXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1ldGFNb2RlbFwiO1xuaW1wb3J0IHsgQ29yZUV4IH0gZnJvbSBcInR5cGVzL2V4dGVuc2lvbl90eXBlc1wiO1xuXG5jb25zdCBDcmVhdGlvbk1vZGUgPSBGRUxpYnJhcnkuQ3JlYXRpb25Nb2RlO1xuY29uc3QgUHJvZ3JhbW1pbmdNb2RlbCA9IEZFTGlicmFyeS5Qcm9ncmFtbWluZ01vZGVsO1xuY29uc3QgVmFsdWVTdGF0ZSA9IGNvcmVMaWJyYXJ5LlZhbHVlU3RhdGU7XG4vKiBNYWtlIHN1cmUgdGhhdCB0aGUgbVBhcmFtZXRlcnMgaXMgbm90IHRoZSBvRXZlbnQgKi9cbmZ1bmN0aW9uIGdldFBhcmFtZXRlcnMobVBhcmFtZXRlcnM6IGFueSkge1xuXHRpZiAobVBhcmFtZXRlcnMgJiYgbVBhcmFtZXRlcnMuZ2V0TWV0YWRhdGEgJiYgbVBhcmFtZXRlcnMuZ2V0TWV0YWRhdGEoKS5nZXROYW1lKCkgPT09IFwic2FwLnVpLmJhc2UuRXZlbnRcIikge1xuXHRcdG1QYXJhbWV0ZXJzID0ge307XG5cdH1cblx0cmV0dXJuIG1QYXJhbWV0ZXJzIHx8IHt9O1xufVxuXG5jbGFzcyBUcmFuc2FjdGlvbkhlbHBlciB7XG5cdF9vQXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQ7XG5cdG9Mb2NrT2JqZWN0OiBhbnk7XG5cdHNQcm9ncmFtbWluZ01vZGVsPzogdHlwZW9mIFByb2dyYW1taW5nTW9kZWw7XG5cdF9iSXNNb2RpZmllZDogYm9vbGVhbiA9IGZhbHNlO1xuXHRfYkNyZWF0ZU1vZGU6IGJvb2xlYW4gPSBmYWxzZTtcblx0X2JDb250aW51ZURpc2NhcmQ6IGJvb2xlYW4gPSBmYWxzZTtcblx0X29Qb3BvdmVyITogUG9wb3Zlcjtcblx0Y29uc3RydWN0b3Iob0FwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LCBvTG9ja09iamVjdDogYW55KSB7XG5cdFx0dGhpcy5fb0FwcENvbXBvbmVudCA9IG9BcHBDb21wb25lbnQ7XG5cdFx0dGhpcy5vTG9ja09iamVjdCA9IG9Mb2NrT2JqZWN0O1xuXHR9XG5cdGdldFByb2dyYW1taW5nTW9kZWwob0NvbnRleHQ/OiBhbnkpOiB0eXBlb2YgUHJvZ3JhbW1pbmdNb2RlbCB7XG5cdFx0aWYgKCF0aGlzLnNQcm9ncmFtbWluZ01vZGVsICYmIG9Db250ZXh0KSB7XG5cdFx0XHRsZXQgc1BhdGg7XG5cdFx0XHRpZiAob0NvbnRleHQuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHRcIikpIHtcblx0XHRcdFx0c1BhdGggPSBvQ29udGV4dC5nZXRQYXRoKCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRzUGF0aCA9IG9Db250ZXh0LmlzUmVsYXRpdmUoKSA/IG9Db250ZXh0LmdldFJlc29sdmVkUGF0aCgpIDogb0NvbnRleHQuZ2V0UGF0aCgpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKE1vZGVsSGVscGVyLmlzRHJhZnRTdXBwb3J0ZWQob0NvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKSwgc1BhdGgpKSB7XG5cdFx0XHRcdHRoaXMuc1Byb2dyYW1taW5nTW9kZWwgPSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0O1xuXHRcdFx0fSBlbHNlIGlmIChNb2RlbEhlbHBlci5pc1N0aWNreVNlc3Npb25TdXBwb3J0ZWQob0NvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKSkpIHtcblx0XHRcdFx0dGhpcy5zUHJvZ3JhbW1pbmdNb2RlbCA9IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5O1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ly8gYXMgdGhlIHRyYW5zYWN0aW9uIGhlbHBlciBpcyBhIHNpbmdsZXRvbiB3ZSBkb24ndCBzdG9yZSB0aGUgbm9uIGRyYWZ0IGFzIHRoZSB1c2VyIGNvdWxkXG5cdFx0XHRcdC8vIHN0YXJ0IHdpdGggYSBub24gZHJhZnQgY2hpbGQgcGFnZSBhbmQgbmF2aWdhdGVzIGJhY2sgdG8gYSBkcmFmdCBlbmFibGVkIG9uZVxuXHRcdFx0XHRyZXR1cm4gUHJvZ3JhbW1pbmdNb2RlbC5Ob25EcmFmdDtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMuc1Byb2dyYW1taW5nTW9kZWwgYXMgdHlwZW9mIFByb2dyYW1taW5nTW9kZWw7XG5cdH1cblxuXHQvKipcblx0ICogVmFsaWRhdGVzIGEgZG9jdW1lbnQuXG5cdCAqXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5UcmFuc2FjdGlvbkhlbHBlclxuXHQgKiBAc3RhdGljXG5cdCAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9Db250ZXh0IENvbnRleHQgb2YgdGhlIGRvY3VtZW50IHRvIGJlIHZhbGlkYXRlZFxuXHQgKiBAcGFyYW0ge29iamVjdH0gW21QYXJhbWV0ZXJzXSBDYW4gY29udGFpbiB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG5cdCAqICogQHBhcmFtIHtvYmplY3R9IFttUGFyYW1ldGVycy5kYXRhXSBBIG1hcCBvZiBkYXRhIHRoYXQgc2hvdWxkIGJlIHZhbGlkYXRlZFxuXHQgKiAqIEBwYXJhbSB7c3RyaW5nfSBbbVBhcmFtZXRlcnMuY3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uXSBBIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHBhdGggdG8gdGhlIHZhbGlkYXRpb24gZnVuY3Rpb25cblx0ICogQHBhcmFtIHtvYmplY3R9IG9WaWV3IENvbnRhaW5zIHRoZSBvYmplY3Qgb2YgdGhlIGN1cnJlbnQgdmlld1xuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX0gUHJvbWlzZSByZXNvbHZlcyB3aXRoIHJlc3VsdCBvZiB0aGUgY3VzdG9tIHZhbGlkYXRpb24gZnVuY3Rpb25cblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0dmFsaWRhdGVEb2N1bWVudChvQ29udGV4dDogYW55LCBtUGFyYW1ldGVyczogYW55LCBvVmlldzogVmlldyk6IFByb21pc2U8YW55PiB7XG5cdFx0Y29uc3Qgc0N1c3RvbVZhbGlkYXRpb25GdW5jdGlvbiA9IG1QYXJhbWV0ZXJzICYmIG1QYXJhbWV0ZXJzLmN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbjtcblx0XHRpZiAoc0N1c3RvbVZhbGlkYXRpb25GdW5jdGlvbikge1xuXHRcdFx0Y29uc3Qgc01vZHVsZSA9IHNDdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24uc3Vic3RyaW5nKDAsIHNDdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24ubGFzdEluZGV4T2YoXCIuXCIpIHx8IC0xKS5yZXBsYWNlKC9cXC4vZ2ksIFwiL1wiKSxcblx0XHRcdFx0c0Z1bmN0aW9uTmFtZSA9IHNDdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24uc3Vic3RyaW5nKFxuXHRcdFx0XHRcdHNDdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24ubGFzdEluZGV4T2YoXCIuXCIpICsgMSxcblx0XHRcdFx0XHRzQ3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uLmxlbmd0aFxuXHRcdFx0XHQpLFxuXHRcdFx0XHRtRGF0YSA9IG1QYXJhbWV0ZXJzLmRhdGE7XG5cdFx0XHRkZWxldGUgbURhdGFbXCJAJHVpNS5jb250ZXh0LmlzVHJhbnNpZW50XCJdO1xuXHRcdFx0cmV0dXJuIEZQTUhlbHBlci52YWxpZGF0aW9uV3JhcHBlcihzTW9kdWxlLCBzRnVuY3Rpb25OYW1lLCBtRGF0YSwgb1ZpZXcsIG9Db250ZXh0KTtcblx0XHR9XG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZShbXSk7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIG5ldyBkb2N1bWVudC5cblx0ICpcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLlRyYW5zYWN0aW9uSGVscGVyXG5cdCAqIEBzdGF0aWNcblx0ICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ30gb01haW5MaXN0QmluZGluZyBPRGF0YSBWNCBMaXN0QmluZGluZyBvYmplY3Rcblx0ICogQHBhcmFtIHtvYmplY3R9IFttSW5QYXJhbWV0ZXJzXSBPcHRpb25hbCwgY2FuIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuXHQgKiBAcGFyYW0ge21hcH0gW21JblBhcmFtZXRlcnMuZGF0YV0gQSBtYXAgb2YgZGF0YSB0aGF0IHNob3VsZCBiZSBzZW50IHdpdGhpbiB0aGUgUE9TVFxuXHQgKiBAcGFyYW0ge3N0cmluZ30gW21JblBhcmFtZXRlcnMuYnVzeU1vZGVdIEdsb2JhbCAoZGVmYXVsdCksIExvY2FsLCBOb25lIFRPRE86IHRvIGJlIHJlZmFjdG9yZWRcblx0ICogQHBhcmFtIHttYXB9IFttSW5QYXJhbWV0ZXJzLmtlZXBUcmFuc2llbnRDb250ZXh0T25GYWlsZWRdIElmIHNldCwgdGhlIGNvbnRleHQgc3RheXMgaW4gdGhlIGxpc3QgaWYgdGhlIFBPU1QgZmFpbGVkIGFuZCBQT1NUIHdpbGwgYmUgcmVwZWF0ZWQgd2l0aCB0aGUgbmV4dCBjaGFuZ2Vcblx0ICogQHBhcmFtIHttYXB9IFttSW5QYXJhbWV0ZXJzLmluYWN0aXZlXSBJZiBzZXQsIHRoZSBjb250ZXh0IGlzIHNldCBhcyBpbmFjdGl2ZSBmb3IgZW1wdHkgcm93c1xuXHQgKiBAcGFyYW0gb1Jlc291cmNlQnVuZGxlXG5cdCAqIEBwYXJhbSBtZXNzYWdlSGFuZGxlclxuXHQgKiBAcGFyYW0gYkZyb21Db3B5UGFzdGVcblx0ICogQHBhcmFtIG9WaWV3IFRoZSBjdXJyZW50IHZpZXdcblx0ICogQHJldHVybnMge1Byb21pc2V9IFByb21pc2UgcmVzb2x2ZXMgd2l0aCBuZXcgYmluZGluZyBjb250ZXh0XG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAZmluYWxcblx0ICovXG5cdGNyZWF0ZURvY3VtZW50KFxuXHRcdG9NYWluTGlzdEJpbmRpbmc6IGFueSxcblx0XHRtSW5QYXJhbWV0ZXJzOiB7IGRhdGE/OiBhbnk7IGJ1c3lNb2RlPzogc3RyaW5nIHwgdW5kZWZpbmVkOyBrZWVwVHJhbnNpZW50Q29udGV4dE9uRmFpbGVkPzogYW55OyBpbmFjdGl2ZT86IGJvb2xlYW4gfSB8IHVuZGVmaW5lZCxcblx0XHRvUmVzb3VyY2VCdW5kbGU6IGFueSxcblx0XHRtZXNzYWdlSGFuZGxlcjogYW55LFxuXHRcdGJGcm9tQ29weVBhc3RlOiBib29sZWFuID0gZmFsc2UsXG5cdFx0b1ZpZXc6IGFueVxuXHQpIHtcblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXRoaXMtYWxpYXNcblx0XHRjb25zdCB0aGF0ID0gdGhpcyxcblx0XHRcdG9Nb2RlbCA9IG9NYWluTGlzdEJpbmRpbmcuZ2V0TW9kZWwoKSxcblx0XHRcdG9NZXRhTW9kZWwgPSBvTW9kZWwuZ2V0TWV0YU1vZGVsKCksXG5cdFx0XHRzTWV0YVBhdGggPSBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKG9NYWluTGlzdEJpbmRpbmcuZ2V0SGVhZGVyQ29udGV4dCgpLmdldFBhdGgoKSksXG5cdFx0XHRzQ3JlYXRlSGFzaCA9IHRoaXMuX2dldEFwcENvbXBvbmVudCgpLmdldFJvdXRlclByb3h5KCkuZ2V0SGFzaCgpLFxuXHRcdFx0b0NvbXBvbmVudERhdGEgPSB0aGlzLl9nZXRBcHBDb21wb25lbnQoKS5nZXRDb21wb25lbnREYXRhKCksXG5cdFx0XHRvU3RhcnR1cFBhcmFtZXRlcnMgPSAob0NvbXBvbmVudERhdGEgJiYgb0NvbXBvbmVudERhdGEuc3RhcnR1cFBhcmFtZXRlcnMpIHx8IHt9LFxuXHRcdFx0c05ld0FjdGlvbiA9ICFvTWFpbkxpc3RCaW5kaW5nLmlzUmVsYXRpdmUoKVxuXHRcdFx0XHQ/IHRoaXMuX2dldE5ld0FjdGlvbihvU3RhcnR1cFBhcmFtZXRlcnMsIHNDcmVhdGVIYXNoLCBvTWV0YU1vZGVsLCBzTWV0YVBhdGgpXG5cdFx0XHRcdDogdW5kZWZpbmVkO1xuXHRcdGxldCBvQ3JlYXRpb25Qcm9taXNlO1xuXHRcdGNvbnN0IG1CaW5kaW5nUGFyYW1ldGVyczogYW55ID0geyBcIiQkcGF0Y2hXaXRob3V0U2lkZUVmZmVjdHNcIjogdHJ1ZSB9O1xuXHRcdGNvbnN0IHNNZXNzYWdlc1BhdGggPSBvTWV0YU1vZGVsLmdldE9iamVjdChzTWV0YVBhdGggKyBcIi9AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLk1lc3NhZ2VzLyRQYXRoXCIpO1xuXHRcdGxldCBzQnVzeVBhdGggPSBcIi9idXN5XCI7XG5cdFx0bGV0IHNGdW5jdGlvbk5hbWUgPVxuXHRcdFx0b01ldGFNb2RlbC5nZXRPYmplY3Qoc01ldGFQYXRoICsgXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRlZmF1bHRWYWx1ZXNGdW5jdGlvblwiKSB8fFxuXHRcdFx0b01ldGFNb2RlbC5nZXRPYmplY3QoXG5cdFx0XHRcdE1vZGVsSGVscGVyLmdldFRhcmdldEVudGl0eVNldChvTWV0YU1vZGVsLmdldENvbnRleHQoc01ldGFQYXRoKSkgKyBcIkBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRGVmYXVsdFZhbHVlc0Z1bmN0aW9uXCJcblx0XHRcdCk7XG5cdFx0bGV0IGJGdW5jdGlvbk9uTmF2UHJvcDtcblx0XHRsZXQgb05ld0RvY3VtZW50Q29udGV4dDogYW55O1xuXHRcdGlmIChzRnVuY3Rpb25OYW1lKSB7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdG9NZXRhTW9kZWwuZ2V0T2JqZWN0KHNNZXRhUGF0aCArIFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EZWZhdWx0VmFsdWVzRnVuY3Rpb25cIikgJiZcblx0XHRcdFx0TW9kZWxIZWxwZXIuZ2V0VGFyZ2V0RW50aXR5U2V0KG9NZXRhTW9kZWwuZ2V0Q29udGV4dChzTWV0YVBhdGgpKSAhPT0gc01ldGFQYXRoXG5cdFx0XHQpIHtcblx0XHRcdFx0YkZ1bmN0aW9uT25OYXZQcm9wID0gdHJ1ZTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGJGdW5jdGlvbk9uTmF2UHJvcCA9IGZhbHNlO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAoc01lc3NhZ2VzUGF0aCkge1xuXHRcdFx0bUJpbmRpbmdQYXJhbWV0ZXJzW1wiJHNlbGVjdFwiXSA9IHNNZXNzYWdlc1BhdGg7XG5cdFx0fVxuXHRcdGNvbnN0IG1QYXJhbWV0ZXJzID0gZ2V0UGFyYW1ldGVycyhtSW5QYXJhbWV0ZXJzKTtcblx0XHRpZiAoIW9NYWluTGlzdEJpbmRpbmcpIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChcIkJpbmRpbmcgcmVxdWlyZWQgZm9yIG5ldyBkb2N1bWVudCBjcmVhdGlvblwiKTtcblx0XHR9XG5cdFx0Y29uc3Qgc1Byb2dyYW1taW5nTW9kZWwgPSB0aGlzLmdldFByb2dyYW1taW5nTW9kZWwob01haW5MaXN0QmluZGluZyk7XG5cdFx0aWYgKHNQcm9ncmFtbWluZ01vZGVsICE9PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0ICYmIHNQcm9ncmFtbWluZ01vZGVsICE9PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSkge1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KFwiQ3JlYXRlIGRvY3VtZW50IG9ubHkgYWxsb3dlZCBmb3IgZHJhZnQgb3Igc3RpY2t5IHNlc3Npb24gc3VwcG9ydGVkIHNlcnZpY2VzXCIpO1xuXHRcdH1cblx0XHRpZiAobVBhcmFtZXRlcnMuYnVzeU1vZGUgPT09IFwiTG9jYWxcIikge1xuXHRcdFx0Ly8gaW4gY2FzZSBvZiBsb2NhbCBidXN5IG1vZGUgd2UgdXNlIHRoZSBsaXN0IGJpbmRpbmcgbmFtZVxuXHRcdFx0Ly8gdGhlcmUncyBubyBBUFkgeWV0IHNvIHdlIGhhdmUgdG8gdXNlIHRoZSAuc0lkIFRPRE8gcHJvdmlkZSBhIHB1YmxpYyBtZXRob2Q/XG5cdFx0XHRzQnVzeVBhdGggPSBcIi9idXN5TG9jYWwvXCIgKyBvTWFpbkxpc3RCaW5kaW5nLnNJZDtcblx0XHR9XG5cdFx0bVBhcmFtZXRlcnMuYmVmb3JlQ3JlYXRlQ2FsbEJhY2sgPSBiRnJvbUNvcHlQYXN0ZSA/IG51bGwgOiBtUGFyYW1ldGVycy5iZWZvcmVDcmVhdGVDYWxsQmFjaztcblx0XHRCdXN5TG9ja2VyLmxvY2sodGhpcy5vTG9ja09iamVjdCwgc0J1c3lQYXRoKTtcblx0XHRjb25zdCBvUmVzb3VyY2VCdW5kbGVDb3JlID0gKENvcmUgYXMgQ29yZUV4KS5nZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUoXCJzYXAuZmUuY29yZVwiKTtcblx0XHRpZiAoc05ld0FjdGlvbikge1xuXHRcdFx0b0NyZWF0aW9uUHJvbWlzZSA9IHRoaXMuY2FsbEFjdGlvbihcblx0XHRcdFx0c05ld0FjdGlvbixcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGNvbnRleHRzOiBvTWFpbkxpc3RCaW5kaW5nLmdldEhlYWRlckNvbnRleHQoKSxcblx0XHRcdFx0XHRzaG93QWN0aW9uUGFyYW1ldGVyRGlhbG9nOiB0cnVlLFxuXHRcdFx0XHRcdGxhYmVsOiB0aGlzLl9nZXRTcGVjaWZpY0NyZWF0ZUFjdGlvbkRpYWxvZ0xhYmVsKFxuXHRcdFx0XHRcdFx0b01ldGFNb2RlbCxcblx0XHRcdFx0XHRcdHNNZXRhUGF0aCxcblx0XHRcdFx0XHRcdHNOZXdBY3Rpb24sXG5cdFx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGVDb3JlIGFzIFJlc291cmNlQnVuZGxlXG5cdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRiaW5kaW5nUGFyYW1ldGVyczogbUJpbmRpbmdQYXJhbWV0ZXJzLFxuXHRcdFx0XHRcdHBhcmVudENvbnRyb2w6IG1QYXJhbWV0ZXJzLnBhcmVudENvbnRyb2wsXG5cdFx0XHRcdFx0YklzQ3JlYXRlQWN0aW9uOiB0cnVlXG5cdFx0XHRcdH0sXG5cdFx0XHRcdG51bGwsXG5cdFx0XHRcdG1lc3NhZ2VIYW5kbGVyXG5cdFx0XHQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zdCBiSXNOZXdQYWdlQ3JlYXRpb24gPVxuXHRcdFx0XHRtUGFyYW1ldGVycy5jcmVhdGlvbk1vZGUgIT09IENyZWF0aW9uTW9kZS5DcmVhdGlvblJvdyAmJiBtUGFyYW1ldGVycy5jcmVhdGlvbk1vZGUgIT09IENyZWF0aW9uTW9kZS5JbmxpbmU7XG5cdFx0XHRjb25zdCBhTm9uQ29tcHV0ZWRWaXNpYmxlS2V5RmllbGRzID0gYklzTmV3UGFnZUNyZWF0aW9uXG5cdFx0XHRcdD8gQ29tbW9uVXRpbHMuZ2V0Tm9uQ29tcHV0ZWRWaXNpYmxlRmllbGRzKG9NZXRhTW9kZWwsIHNNZXRhUGF0aCwgb1ZpZXcpXG5cdFx0XHRcdDogW107XG5cdFx0XHRzRnVuY3Rpb25OYW1lID0gYkZyb21Db3B5UGFzdGUgPyBudWxsIDogc0Z1bmN0aW9uTmFtZTtcblx0XHRcdGxldCBzRnVuY3Rpb25QYXRoLCBvRnVuY3Rpb25Db250ZXh0O1xuXHRcdFx0aWYgKHNGdW5jdGlvbk5hbWUpIHtcblx0XHRcdFx0Ly9ib3VuZCB0byB0aGUgc291cmNlIGVudGl0eTpcblx0XHRcdFx0aWYgKGJGdW5jdGlvbk9uTmF2UHJvcCkge1xuXHRcdFx0XHRcdHNGdW5jdGlvblBhdGggPVxuXHRcdFx0XHRcdFx0b01haW5MaXN0QmluZGluZy5nZXRDb250ZXh0KCkgJiZcblx0XHRcdFx0XHRcdG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgob01haW5MaXN0QmluZGluZy5nZXRDb250ZXh0KCkuZ2V0UGF0aCgpKSArIFwiL1wiICsgc0Z1bmN0aW9uTmFtZTtcblx0XHRcdFx0XHRvRnVuY3Rpb25Db250ZXh0ID0gb01haW5MaXN0QmluZGluZy5nZXRDb250ZXh0KCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0c0Z1bmN0aW9uUGF0aCA9XG5cdFx0XHRcdFx0XHRvTWFpbkxpc3RCaW5kaW5nLmdldEhlYWRlckNvbnRleHQoKSAmJlxuXHRcdFx0XHRcdFx0b01ldGFNb2RlbC5nZXRNZXRhUGF0aChvTWFpbkxpc3RCaW5kaW5nLmdldEhlYWRlckNvbnRleHQoKS5nZXRQYXRoKCkpICsgXCIvXCIgKyBzRnVuY3Rpb25OYW1lO1xuXHRcdFx0XHRcdG9GdW5jdGlvbkNvbnRleHQgPSBvTWFpbkxpc3RCaW5kaW5nLmdldEhlYWRlckNvbnRleHQoKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0Y29uc3Qgb0Z1bmN0aW9uID0gc0Z1bmN0aW9uUGF0aCAmJiBvTWV0YU1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KHNGdW5jdGlvblBhdGgpO1xuXHRcdFx0aWYgKG9GdW5jdGlvbiAmJiBvRnVuY3Rpb24uZ2V0T2JqZWN0KCkgJiYgb0Z1bmN0aW9uLmdldE9iamVjdCgpWzBdLiRJc0JvdW5kKSB7XG5cdFx0XHRcdG9DcmVhdGlvblByb21pc2UgPSBvcGVyYXRpb25zLmNhbGxCb3VuZEZ1bmN0aW9uKHNGdW5jdGlvbk5hbWUsIG9GdW5jdGlvbkNvbnRleHQsIG9Nb2RlbCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRvQ3JlYXRpb25Qcm9taXNlID0gb3BlcmF0aW9ucy5jYWxsRnVuY3Rpb25JbXBvcnQoc0Z1bmN0aW9uTmFtZSwgb01vZGVsKTtcblx0XHRcdH1cblxuXHRcdFx0b0NyZWF0aW9uUHJvbWlzZSA9IG9DcmVhdGlvblByb21pc2Vcblx0XHRcdFx0LnRoZW4oZnVuY3Rpb24gKG9Db250ZXh0OiBhbnkpIHtcblx0XHRcdFx0XHRpZiAob0NvbnRleHQpIHtcblx0XHRcdFx0XHRcdHJldHVybiBvQ29udGV4dC5nZXRPYmplY3QoKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBleGVjdXRpbmcgdGhlIGZ1bmN0aW9uIFwiICsgc0Z1bmN0aW9uTmFtZSwgb0Vycm9yKTtcblx0XHRcdFx0XHR0aHJvdyBvRXJyb3I7XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC50aGVuKGZ1bmN0aW9uIChvRGF0YTogYW55KSB7XG5cdFx0XHRcdFx0bVBhcmFtZXRlcnMuZGF0YSA9IG9EYXRhID8gT2JqZWN0LmFzc2lnbih7fSwgb0RhdGEsIG1QYXJhbWV0ZXJzLmRhdGEpIDogbVBhcmFtZXRlcnMuZGF0YTtcblx0XHRcdFx0XHRpZiAobVBhcmFtZXRlcnMuZGF0YSkge1xuXHRcdFx0XHRcdFx0ZGVsZXRlIG1QYXJhbWV0ZXJzLmRhdGFbXCJAb2RhdGEuY29udGV4dFwiXTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKGFOb25Db21wdXRlZFZpc2libGVLZXlGaWVsZHMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdFx0Y29uc3Qgb1RyYW5zaWVudExpc3RCaW5kaW5nID0gb01vZGVsLmJpbmRMaXN0KG9NYWluTGlzdEJpbmRpbmcuZ2V0UGF0aCgpLCBvTWFpbkxpc3RCaW5kaW5nLmdldENvbnRleHQoKSwgW10sIFtdLCB7XG5cdFx0XHRcdFx0XHRcdCQkdXBkYXRlR3JvdXBJZDogXCJzdWJtaXRMYXRlclwiXG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdG9UcmFuc2llbnRMaXN0QmluZGluZy5yZWZyZXNoSW50ZXJuYWwgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdC8qICovXG5cdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0b05ld0RvY3VtZW50Q29udGV4dCA9IG9UcmFuc2llbnRMaXN0QmluZGluZy5jcmVhdGUobVBhcmFtZXRlcnMuZGF0YSwgdHJ1ZSk7XG5cdFx0XHRcdFx0XHRyZXR1cm4gdGhhdC5fbGF1bmNoRGlhbG9nV2l0aEtleUZpZWxkcyhcblx0XHRcdFx0XHRcdFx0b01haW5MaXN0QmluZGluZyxcblx0XHRcdFx0XHRcdFx0b1RyYW5zaWVudExpc3RCaW5kaW5nLFxuXHRcdFx0XHRcdFx0XHRvTmV3RG9jdW1lbnRDb250ZXh0LFxuXHRcdFx0XHRcdFx0XHRhTm9uQ29tcHV0ZWRWaXNpYmxlS2V5RmllbGRzLFxuXHRcdFx0XHRcdFx0XHRvTW9kZWwsXG5cdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLFxuXHRcdFx0XHRcdFx0XHRtZXNzYWdlSGFuZGxlclxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0bGV0IG9uQmVmb3JlQ3JlYXRlUHJvbWlzZTtcblx0XHRcdFx0XHRcdGlmIChtUGFyYW1ldGVycy5iZWZvcmVDcmVhdGVDYWxsQmFjaykge1xuXHRcdFx0XHRcdFx0XHRvbkJlZm9yZUNyZWF0ZVByb21pc2UgPSBtUGFyYW1ldGVycy5iZWZvcmVDcmVhdGVDYWxsQmFjayh7XG5cdFx0XHRcdFx0XHRcdFx0Y29udGV4dFBhdGg6IG9NYWluTGlzdEJpbmRpbmcgJiYgb01haW5MaXN0QmluZGluZy5nZXRQYXRoKClcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRvbkJlZm9yZUNyZWF0ZVByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHJldHVybiBvbkJlZm9yZUNyZWF0ZVByb21pc2UudGhlbihmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdG9OZXdEb2N1bWVudENvbnRleHQgPSBvTWFpbkxpc3RCaW5kaW5nLmNyZWF0ZShcblx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5kYXRhLFxuXHRcdFx0XHRcdFx0XHRcdHRydWUsXG5cdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMuY3JlYXRlQXRFbmQsXG5cdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMuaW5hY3RpdmVcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0aWYgKCFtUGFyYW1ldGVycy5pbmFjdGl2ZSkge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiB0aGF0Lm9uQWZ0ZXJDcmVhdGVDb21wbGV0aW9uKG9NYWluTGlzdEJpbmRpbmcsIG9OZXdEb2N1bWVudENvbnRleHQsIG1QYXJhbWV0ZXJzKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KVxuXHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgY3JlYXRpbmcgdGhlIG5ldyBkb2N1bWVudFwiLCBvRXJyb3IpO1xuXHRcdFx0XHRcdHRocm93IG9FcnJvcjtcblx0XHRcdFx0fSk7XG5cdFx0fVxuXHRcdHJldHVybiBvQ3JlYXRpb25Qcm9taXNlXG5cdFx0XHQudGhlbihmdW5jdGlvbiAob1Jlc3VsdDogYW55KSB7XG5cdFx0XHRcdGlmICghb01haW5MaXN0QmluZGluZy5pc1JlbGF0aXZlKCkpIHtcblx0XHRcdFx0XHQvLyB0aGUgY3JlYXRlIG1vZGUgc2hhbGwgY3VycmVudGx5IG9ubHkgYmUgc2V0IG9uIGNyZWF0aW5nIGEgcm9vdCBkb2N1bWVudFxuXHRcdFx0XHRcdHRoYXQuX2JDcmVhdGVNb2RlID0gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRvTmV3RG9jdW1lbnRDb250ZXh0ID0gb05ld0RvY3VtZW50Q29udGV4dCB8fCAob1Jlc3VsdCAmJiBvUmVzdWx0LnJlc3BvbnNlKTtcblx0XHRcdFx0Ly8gVE9ETzogd2hlcmUgZG9lcyB0aGlzIG9uZSBjb21pbmcgZnJvbT8/P1xuXHRcdFx0XHRpZiAob1Jlc3VsdCAmJiBvUmVzdWx0LmJDb25zaWRlckRvY3VtZW50TW9kaWZpZWQpIHtcblx0XHRcdFx0XHR0aGF0LmhhbmRsZURvY3VtZW50TW9kaWZpY2F0aW9ucygpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZURpYWxvZygpLnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdHJldHVybiBvTmV3RG9jdW1lbnRDb250ZXh0O1xuXHRcdFx0XHR9KTtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdHJldHVybiBtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZURpYWxvZygpLnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdC8vIGZvciBpbnN0YW5jZSwgb24gY2FuY2VsIG9mIGNyZWF0ZSBkaWFsb2csIHRoZSBwcm9taXNlIGlzIHJlamVjdGVkXG5cdFx0XHRcdFx0Ly8gYSByZXR1cm4gaGVyZSB3b3VsZCByZXN0b3JlIHRoZSBwcm9taXNlIGNoYWluIGFuZCByZXN1bHQgaW4gZXJyb3JzIHdoaWxlIHJvdXRpbmdcblx0XHRcdFx0XHQvLyBzb2x1dGlvbiAtICByZWplY3QgaGVyZSBhcyB3ZWxsXG5cdFx0XHRcdFx0aWYgKG9FcnJvciAmJiBvRXJyb3IuYkRlbGV0ZVRyYW5zaWVudENvbnRleHQgJiYgb05ld0RvY3VtZW50Q29udGV4dC5pc1RyYW5zaWVudCgpKSB7XG5cdFx0XHRcdFx0XHQvLyBUaGlzIGlzIGEgd29ya2Fyb3VuZCBzdWdnZXN0ZWQgYnkgbW9kZWwgYXMgQ29udGV4dC5kZWxldGUgcmVzdWx0cyBpbiBhbiBlcnJvclxuXHRcdFx0XHRcdFx0Ly8gVE9ETzogcmVtb3ZlIHRoZSAkZGlyZWN0IG9uY2UgbW9kZWwgcmVzb2x2ZXMgdGhpcyBpc3N1ZVxuXHRcdFx0XHRcdFx0Ly8gdGhpcyBsaW5lIHNob3dzIHRoZSBleHBlY3RlZCBjb25zb2xlIGVycm9yIFVuY2F1Z2h0IChpbiBwcm9taXNlKSBFcnJvcjogUmVxdWVzdCBjYW5jZWxlZDogUE9TVCBUcmF2ZWw7IGdyb3VwOiBzdWJtaXRMYXRlclxuXHRcdFx0XHRcdFx0b05ld0RvY3VtZW50Q29udGV4dC5kZWxldGUoXCIkZGlyZWN0XCIpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3Qob0Vycm9yKTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9KVxuXHRcdFx0LmZpbmFsbHkoZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRCdXN5TG9ja2VyLnVubG9jayh0aGF0Lm9Mb2NrT2JqZWN0LCBzQnVzeVBhdGgpO1xuXHRcdFx0fSk7XG5cdH1cblx0LyoqXG5cdCAqIEZpbmQgdGhlIGFjdGl2ZSBjb250ZXh0cyBvZiB0aGUgZG9jdW1lbnRzLCBvbmx5IGZvciB0aGUgZHJhZnQgcm9vdHMuXG5cdCAqXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5UcmFuc2FjdGlvbkhlbHBlclxuXHQgKiBAc3RhdGljXG5cdCAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHRbXX0gYUNvbnRleHRzIENvbnRleHRzIEVpdGhlciBvbmUgY29udGV4dCBvciBhbiBhcnJheSB3aXRoIGNvbnRleHRzIHRvIGJlIGRlbGV0ZWRcblx0ICogQHBhcmFtIGJGaW5kQWN0aXZlQ29udGV4dHNcblx0ICogQHJldHVybnMge0FycmF5fSBBcnJheSBvZiB0aGUgYWN0aXZlIGNvbnRleHRzXG5cdCAqL1xuXHRmaW5kQWN0aXZlRHJhZnRSb290Q29udGV4dHMoYUNvbnRleHRzOiBhbnlbXSwgYkZpbmRBY3RpdmVDb250ZXh0czogYW55KSB7XG5cdFx0aWYgKCFiRmluZEFjdGl2ZUNvbnRleHRzKSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0fVxuXHRcdGNvbnN0IGFjdGl2ZUNvbnRleHRzID0gYUNvbnRleHRzLnJlZHVjZShmdW5jdGlvbiAoYVJlc3VsdDogYW55LCBvQ29udGV4dDogYW55KSB7XG5cdFx0XHRjb25zdCBvTWV0YU1vZGVsID0gb0NvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKTtcblx0XHRcdGNvbnN0IHNNZXRhUGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgob0NvbnRleHQuZ2V0UGF0aCgpKTtcblx0XHRcdGlmIChvTWV0YU1vZGVsLmdldE9iamVjdChzTWV0YVBhdGggKyBcIkBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnRSb290XCIpKSB7XG5cdFx0XHRcdGNvbnN0IGJJc0FjdGl2ZUVudGl0eSA9IG9Db250ZXh0LmdldE9iamVjdCgpLklzQWN0aXZlRW50aXR5LFxuXHRcdFx0XHRcdGJIYXNBY3RpdmVFbnRpdHkgPSBvQ29udGV4dC5nZXRPYmplY3QoKS5IYXNBY3RpdmVFbnRpdHk7XG5cdFx0XHRcdGlmICghYklzQWN0aXZlRW50aXR5ICYmIGJIYXNBY3RpdmVFbnRpdHkpIHtcblx0XHRcdFx0XHRjb25zdCBvQWN0aXZlQ29udGV4dCA9IG9Db250ZXh0XG5cdFx0XHRcdFx0XHQuZ2V0TW9kZWwoKVxuXHRcdFx0XHRcdFx0LmJpbmRDb250ZXh0KG9Db250ZXh0LmdldFBhdGgoKSArIFwiL1NpYmxpbmdFbnRpdHlcIilcblx0XHRcdFx0XHRcdC5nZXRCb3VuZENvbnRleHQoKTtcblx0XHRcdFx0XHRhUmVzdWx0LnB1c2gob0FjdGl2ZUNvbnRleHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gYVJlc3VsdDtcblx0XHR9LCBbXSk7XG5cdFx0cmV0dXJuIFByb21pc2UuYWxsKFxuXHRcdFx0YWN0aXZlQ29udGV4dHMubWFwKGZ1bmN0aW9uIChvQ29udGV4dDogYW55KSB7XG5cdFx0XHRcdHJldHVybiBvQ29udGV4dC5yZXF1ZXN0Q2Fub25pY2FsUGF0aCgpLnRoZW4oXG5cdFx0XHRcdFx0ZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIG9Db250ZXh0O1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0ZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0KTtcblx0XHRcdH0pXG5cdFx0KTtcblx0fVxuXHRhZnRlckRlbGV0ZVByb2Nlc3MobVBhcmFtZXRlcnM6IGFueSwgY2hlY2tCb3g6IGFueSwgYUNvbnRleHRzOiBhbnksIG9SZXNvdXJjZUJ1bmRsZTogYW55KSB7XG5cdFx0Y29uc3Qgb0ludGVybmFsTW9kZWxDb250ZXh0ID0gbVBhcmFtZXRlcnMuaW50ZXJuYWxNb2RlbENvbnRleHQ7XG5cdFx0aWYgKG9JbnRlcm5hbE1vZGVsQ29udGV4dCAmJiBvSW50ZXJuYWxNb2RlbENvbnRleHQuZ2V0UHJvcGVydHkoXCJkZWxldGVFbmFibGVkXCIpICE9IHVuZGVmaW5lZCkge1xuXHRcdFx0aWYgKGNoZWNrQm94LmlzQ2hlY2tCb3hWaXNpYmxlID09PSB0cnVlICYmIGNoZWNrQm94LmlzQ2hlY2tCb3hTZWxlY3RlZCA9PT0gZmFsc2UpIHtcblx0XHRcdFx0Ly9pZiB1bnNhdmVkIG9iamVjdHMgYXJlIG5vdCBkZWxldGVkIHRoZW4gd2UgbmVlZCB0byBzZXQgdGhlIGVuYWJsZWQgdG8gdHJ1ZSBhbmQgdXBkYXRlIHRoZSBtb2RlbCBkYXRhIGZvciBuZXh0IGRlbGV0aW9uXG5cdFx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcImRlbGV0ZUVuYWJsZWRcIiwgdHJ1ZSk7XG5cdFx0XHRcdGNvbnN0IG9iaiA9IE9iamVjdC5hc3NpZ24ob0ludGVybmFsTW9kZWxDb250ZXh0LmdldE9iamVjdCgpLCB7fSk7XG5cdFx0XHRcdG9iai5zZWxlY3RlZENvbnRleHRzID0gb2JqLnNlbGVjdGVkQ29udGV4dHMuZmlsdGVyKGZ1bmN0aW9uIChlbGVtZW50OiBhbnkpIHtcblx0XHRcdFx0XHRyZXR1cm4gb2JqLmRlbGV0YWJsZUNvbnRleHRzLmluZGV4T2YoZWxlbWVudCkgPT09IC0xO1xuXHRcdFx0XHR9KTtcblx0XHRcdFx0b2JqLmRlbGV0YWJsZUNvbnRleHRzID0gW107XG5cdFx0XHRcdG9iai5zZWxlY3RlZENvbnRleHRzID0gW107XG5cdFx0XHRcdG9iai5udW1iZXJPZlNlbGVjdGVkQ29udGV4dHMgPSBvYmouc2VsZWN0ZWRDb250ZXh0cy5sZW5ndGg7XG5cdFx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcIlwiLCBvYmopO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwiZGVsZXRlRW5hYmxlZFwiLCBmYWxzZSk7XG5cdFx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcInNlbGVjdGVkQ29udGV4dHNcIiwgW10pO1xuXHRcdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJudW1iZXJPZlNlbGVjdGVkQ29udGV4dHNcIiwgMCk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmIChhQ29udGV4dHMubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRNZXNzYWdlVG9hc3Quc2hvdyhcblx0XHRcdFx0Q29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXG5cdFx0XHRcdFx0XCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9PQkpFQ1RfUEFHRV9ERUxFVEVfVE9BU1RfU0lOR1VMQVJcIixcblx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGUsXG5cdFx0XHRcdFx0bnVsbCxcblx0XHRcdFx0XHRtUGFyYW1ldGVycy5lbnRpdHlTZXROYW1lXG5cdFx0XHRcdClcblx0XHRcdCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdE1lc3NhZ2VUb2FzdC5zaG93KFxuXHRcdFx0XHRDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcblx0XHRcdFx0XHRcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX09CSkVDVF9QQUdFX0RFTEVURV9UT0FTVF9QTFVSQUxcIixcblx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGUsXG5cdFx0XHRcdFx0bnVsbCxcblx0XHRcdFx0XHRtUGFyYW1ldGVycy5lbnRpdHlTZXROYW1lXG5cdFx0XHRcdClcblx0XHRcdCk7XG5cdFx0fVxuXHR9XG5cdC8qKlxuXHQgKiBEZWxldGUgb25lIG9yIG11bHRpcGxlIGRvY3VtZW50KHMpLlxuXHQgKlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuVHJhbnNhY3Rpb25IZWxwZXJcblx0ICogQHN0YXRpY1xuXHQgKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSB2Q29udGV4dHMgQ29udGV4dHMgRWl0aGVyIG9uZSBjb250ZXh0IG9yIGFuIGFycmF5IHdpdGggY29udGV4dHMgdG8gYmUgZGVsZXRlZFxuXHQgKiBAcGFyYW0ge29iamVjdH0gbVBhcmFtZXRlcnMgT3B0aW9uYWwsIGNhbiBjb250YWluIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0ICogQHBhcmFtIHtzdHJpbmd9IG1QYXJhbWV0ZXJzLnRpdGxlIFRpdGxlIG9mIHRoZSBvYmplY3QgdG8gYmUgZGVsZXRlZFxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbVBhcmFtZXRlcnMuZGVzY3JpcHRpb24gRGVzY3JpcHRpb24gb2YgdGhlIG9iamVjdCB0byBiZSBkZWxldGVkXG5cdCAqIEBwYXJhbSB7aW50ZWdlcn0gbVBhcmFtZXRlcnMubnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzIE51bWJlciBvZiBvYmplY3RzIHNlbGVjdGVkXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gbVBhcmFtZXRlcnMubm9EaWFsb2cgVG8gZGlzYWJsZSB0aGUgY29uZmlybWF0aW9uIGRpYWxvZ1xuXHQgKiBAcGFyYW0gb1Jlc291cmNlQnVuZGxlXG5cdCAqIEBwYXJhbSBtZXNzYWdlSGFuZGxlclxuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX1cblx0ICovXG5cdGRlbGV0ZURvY3VtZW50KHZDb250ZXh0czogYW55LCBtUGFyYW1ldGVyczogYW55LCBvUmVzb3VyY2VCdW5kbGU6IGFueSwgbWVzc2FnZUhhbmRsZXI6IGFueSkge1xuXHRcdGxldCBmblJlamVjdDogRnVuY3Rpb24sXG5cdFx0XHRmblJlc29sdmU6IEZ1bmN0aW9uLFxuXHRcdFx0YURlbGV0YWJsZUNvbnRleHRzOiBhbnlbXSA9IFtdLFxuXHRcdFx0aXNDaGVja0JveFZpc2libGUgPSBmYWxzZSxcblx0XHRcdGlzTG9ja2VkVGV4dFZpc2libGUgPSBmYWxzZSxcblx0XHRcdGNhbm5vdEJlRGVsZXRlZFRleHRWaXNpYmxlID0gZmFsc2UsXG5cdFx0XHRpc0NoZWNrQm94U2VsZWN0ZWQ6IGJvb2xlYW4sXG5cdFx0XHRiRGlhbG9nQ29uZmlybWVkID0gZmFsc2U7XG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzXG5cdFx0Y29uc3QgdGhhdCA9IHRoaXMsXG5cdFx0XHRvUmVzb3VyY2VCdW5kbGVDb3JlID0gKENvcmUgYXMgQ29yZUV4KS5nZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUoXCJzYXAuZmUuY29yZVwiKSBhcyBSZXNvdXJjZUJ1bmRsZTtcblx0XHRsZXQgYVBhcmFtcztcblx0XHRsZXQgb0RlbGV0ZU1lc3NhZ2U6IGFueSA9IHtcblx0XHRcdHRpdGxlOiBvUmVzb3VyY2VCdW5kbGVDb3JlLmdldFRleHQoXCJDX0NPTU1PTl9PQkpFQ1RfUEFHRV9ERUxFVEVcIilcblx0XHR9O1xuXHRcdG1lc3NhZ2VIYW5kbGluZy5yZW1vdmVCb3VuZFRyYW5zaXRpb25NZXNzYWdlcygpO1xuXHRcdEJ1c3lMb2NrZXIubG9jayh0aGlzLm9Mb2NrT2JqZWN0KTtcblx0XHRpZiAoIUFycmF5LmlzQXJyYXkodkNvbnRleHRzKSkge1xuXHRcdFx0dkNvbnRleHRzID0gW3ZDb250ZXh0c107XG5cdFx0fVxuXHRcdFByb21pc2UucmVzb2x2ZSh0aGlzLmdldFByb2dyYW1taW5nTW9kZWwodkNvbnRleHRzWzBdKSlcblx0XHRcdC50aGVuKGZ1bmN0aW9uIChzUHJvZ3JhbW1pbmdNb2RlbDogYW55KSB7XG5cdFx0XHRcdGlmIChtUGFyYW1ldGVycykge1xuXHRcdFx0XHRcdGlmICghbVBhcmFtZXRlcnMubnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzKSB7XG5cdFx0XHRcdFx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQpIHtcblx0XHRcdFx0XHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCB2Q29udGV4dHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBvQ29udGV4dERhdGEgPSB2Q29udGV4dHNbaV0uZ2V0T2JqZWN0KCk7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0XHRcdFx0b0NvbnRleHREYXRhLklzQWN0aXZlRW50aXR5ID09PSB0cnVlICYmXG5cdFx0XHRcdFx0XHRcdFx0XHRvQ29udGV4dERhdGEuSGFzRHJhZnRFbnRpdHkgPT09IHRydWUgJiZcblx0XHRcdFx0XHRcdFx0XHRcdG9Db250ZXh0RGF0YS5EcmFmdEFkbWluaXN0cmF0aXZlRGF0YSAmJlxuXHRcdFx0XHRcdFx0XHRcdFx0b0NvbnRleHREYXRhLkRyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhLkluUHJvY2Vzc0J5VXNlciAmJlxuXHRcdFx0XHRcdFx0XHRcdFx0IW9Db250ZXh0RGF0YS5EcmFmdEFkbWluaXN0cmF0aXZlRGF0YS5EcmFmdElzQ3JlYXRlZEJ5TWVcblx0XHRcdFx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdFx0XHRcdE1lc3NhZ2VCb3guc2hvdyhcblx0XHRcdFx0XHRcdFx0XHRcdFx0Q29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9PQkpFQ1RfUEFHRV9DT05GSVJNX0RFTEVURV9XSVRIX1NJTkdMRV9PQkpFQ1RfTE9DS0VEXCIsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0b1Jlc291cmNlQnVuZGxlXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0aXRsZTogb1Jlc291cmNlQnVuZGxlQ29yZS5nZXRUZXh0KFwiQ19DT01NT05fT0JKRUNUX1BBR0VfREVMRVRFXCIpLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9uQ2xvc2U6IGZuUmVqZWN0XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRtUGFyYW1ldGVycyA9IGdldFBhcmFtZXRlcnMobVBhcmFtZXRlcnMpO1xuXHRcdFx0XHRcdFx0aWYgKG1QYXJhbWV0ZXJzLnRpdGxlKSB7XG5cdFx0XHRcdFx0XHRcdGlmIChtUGFyYW1ldGVycy5kZXNjcmlwdGlvbikge1xuXHRcdFx0XHRcdFx0XHRcdGFQYXJhbXMgPSBbbVBhcmFtZXRlcnMudGl0bGUsIG1QYXJhbWV0ZXJzLmRlc2NyaXB0aW9uXTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRhUGFyYW1zID0gW21QYXJhbWV0ZXJzLnRpdGxlLCBcIlwiXTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRvRGVsZXRlTWVzc2FnZS50ZXh0ID0gQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXG5cdFx0XHRcdFx0XHRcdFx0XCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9PQkpFQ1RfUEFHRV9DT05GSVJNX0RFTEVURV9XSVRIX09CSkVDVElORk9cIixcblx0XHRcdFx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGUsXG5cdFx0XHRcdFx0XHRcdFx0YVBhcmFtcyxcblx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5lbnRpdHlTZXROYW1lXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRvRGVsZXRlTWVzc2FnZS50ZXh0ID0gQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXG5cdFx0XHRcdFx0XHRcdFx0XCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9PQkpFQ1RfUEFHRV9DT05GSVJNX0RFTEVURV9XSVRIX09CSkVDVFRJVExFX1NJTkdVTEFSXCIsXG5cdFx0XHRcdFx0XHRcdFx0b1Jlc291cmNlQnVuZGxlXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRhRGVsZXRhYmxlQ29udGV4dHMgPSB2Q29udGV4dHM7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdG9EZWxldGVNZXNzYWdlID0ge1xuXHRcdFx0XHRcdFx0XHR0aXRsZTogb1Jlc291cmNlQnVuZGxlQ29yZS5nZXRUZXh0KFwiQ19DT01NT05fT0JKRUNUX1BBR0VfREVMRVRFXCIpXG5cdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0aWYgKG1QYXJhbWV0ZXJzLm51bWJlck9mU2VsZWN0ZWRDb250ZXh0cyA9PT0gMSAmJiBtUGFyYW1ldGVycy5udW1iZXJPZlNlbGVjdGVkQ29udGV4dHMgPT09IHZDb250ZXh0cy5sZW5ndGgpIHtcblx0XHRcdFx0XHRcdFx0YURlbGV0YWJsZUNvbnRleHRzID0gdkNvbnRleHRzO1xuXHRcdFx0XHRcdFx0XHRvRGVsZXRlTWVzc2FnZS50ZXh0ID0gQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXG5cdFx0XHRcdFx0XHRcdFx0XCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9PQkpFQ1RfUEFHRV9DT05GSVJNX0RFTEVURV9XSVRIX09CSkVDVFRJVExFX1NJTkdVTEFSXCIsXG5cdFx0XHRcdFx0XHRcdFx0b1Jlc291cmNlQnVuZGxlLFxuXHRcdFx0XHRcdFx0XHRcdG51bGwsXG5cdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMuZW50aXR5U2V0TmFtZVxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIGlmIChtUGFyYW1ldGVycy5udW1iZXJPZlNlbGVjdGVkQ29udGV4dHMgPT09IDEgJiYgbVBhcmFtZXRlcnMudW5TYXZlZENvbnRleHRzLmxlbmd0aCA9PT0gMSkge1xuXHRcdFx0XHRcdFx0XHQvL29ubHkgb25lIHVuc2F2ZWQgb2JqZWN0XG5cdFx0XHRcdFx0XHRcdGFEZWxldGFibGVDb250ZXh0cyA9IG1QYXJhbWV0ZXJzLnVuU2F2ZWRDb250ZXh0cztcblx0XHRcdFx0XHRcdFx0Y29uc3QgZHJhZnRBZG1pbkRhdGEgPSBhRGVsZXRhYmxlQ29udGV4dHNbMF0uZ2V0T2JqZWN0KClbXCJEcmFmdEFkbWluaXN0cmF0aXZlRGF0YVwiXTtcblx0XHRcdFx0XHRcdFx0bGV0IHNMYXN0Q2hhbmdlZEJ5VXNlciA9IFwiXCI7XG5cdFx0XHRcdFx0XHRcdGlmIChkcmFmdEFkbWluRGF0YSkge1xuXHRcdFx0XHRcdFx0XHRcdHNMYXN0Q2hhbmdlZEJ5VXNlciA9XG5cdFx0XHRcdFx0XHRcdFx0XHRkcmFmdEFkbWluRGF0YVtcIkxhc3RDaGFuZ2VkQnlVc2VyRGVzY3JpcHRpb25cIl0gfHwgZHJhZnRBZG1pbkRhdGFbXCJMYXN0Q2hhbmdlZEJ5VXNlclwiXSB8fCBcIlwiO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdGFQYXJhbXMgPSBbc0xhc3RDaGFuZ2VkQnlVc2VyXTtcblx0XHRcdFx0XHRcdFx0b0RlbGV0ZU1lc3NhZ2UudGV4dCA9IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFxuXHRcdFx0XHRcdFx0XHRcdFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfT0JKRUNUX1BBR0VfQ09ORklSTV9ERUxFVEVfV0lUSF9VTlNBVkVEX0NIQU5HRVNcIixcblx0XHRcdFx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGUsXG5cdFx0XHRcdFx0XHRcdFx0YVBhcmFtc1xuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIGlmIChtUGFyYW1ldGVycy5udW1iZXJPZlNlbGVjdGVkQ29udGV4dHMgPT09IG1QYXJhbWV0ZXJzLnVuU2F2ZWRDb250ZXh0cy5sZW5ndGgpIHtcblx0XHRcdFx0XHRcdFx0Ly9vbmx5IG11bHRpcGxlIHVuc2F2ZWQgb2JqZWN0c1xuXHRcdFx0XHRcdFx0XHRhRGVsZXRhYmxlQ29udGV4dHMgPSBtUGFyYW1ldGVycy51blNhdmVkQ29udGV4dHM7XG5cdFx0XHRcdFx0XHRcdG9EZWxldGVNZXNzYWdlLnRleHQgPSBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcblx0XHRcdFx0XHRcdFx0XHRcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX09CSkVDVF9QQUdFX0NPTkZJUk1fREVMRVRFX1dJVEhfVU5TQVZFRF9DSEFOR0VTX01VTFRJUExFX09CSkVDVFNcIixcblx0XHRcdFx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGVcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLm51bWJlck9mU2VsZWN0ZWRDb250ZXh0cyA9PT1cblx0XHRcdFx0XHRcdFx0dkNvbnRleHRzLmNvbmNhdChtUGFyYW1ldGVycy51blNhdmVkQ29udGV4dHMuY29uY2F0KG1QYXJhbWV0ZXJzLmxvY2tlZENvbnRleHRzKSkubGVuZ3RoXG5cdFx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdFx0Ly9vbmx5IHVuc2F2ZWQsIGxvY2tlZCAsZGVsZXRhYmxlIG9iamVjdHMgYnV0IG5vdCBub24tZGVsZXRhYmxlIG9iamVjdHNcblx0XHRcdFx0XHRcdFx0YURlbGV0YWJsZUNvbnRleHRzID0gdkNvbnRleHRzLmNvbmNhdChtUGFyYW1ldGVycy51blNhdmVkQ29udGV4dHMpO1xuXHRcdFx0XHRcdFx0XHRvRGVsZXRlTWVzc2FnZS50ZXh0ID1cblx0XHRcdFx0XHRcdFx0XHRhRGVsZXRhYmxlQ29udGV4dHMubGVuZ3RoID09PSAxXG5cdFx0XHRcdFx0XHRcdFx0XHQ/IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfT0JKRUNUX1BBR0VfQ09ORklSTV9ERUxFVEVfV0lUSF9PQkpFQ1RUSVRMRV9TSU5HVUxBUlwiLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRudWxsLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmVudGl0eVNldE5hbWVcblx0XHRcdFx0XHRcdFx0XHRcdCAgKVxuXHRcdFx0XHRcdFx0XHRcdFx0OiBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX09CSkVDVF9QQUdFX0NPTkZJUk1fREVMRVRFX1dJVEhfT0JKRUNUVElUTEVfUExVUkFMXCIsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0b1Jlc291cmNlQnVuZGxlLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG51bGwsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMuZW50aXR5U2V0TmFtZVxuXHRcdFx0XHRcdFx0XHRcdFx0ICApO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0Ly9pZiBub24tZGVsZXRhYmxlIG9iamVjdHMgZXhpc3RzIGFsb25nIHdpdGggYW55IG9mIHVuc2F2ZWQgLGRlbGV0YWJsZSBvYmplY3RzXG5cdFx0XHRcdFx0XHRcdGFEZWxldGFibGVDb250ZXh0cyA9IHZDb250ZXh0cy5jb25jYXQobVBhcmFtZXRlcnMudW5TYXZlZENvbnRleHRzKTtcblx0XHRcdFx0XHRcdFx0Y2Fubm90QmVEZWxldGVkVGV4dFZpc2libGUgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHRvRGVsZXRlTWVzc2FnZS50ZXh0ID1cblx0XHRcdFx0XHRcdFx0XHRhRGVsZXRhYmxlQ29udGV4dHMubGVuZ3RoID09PSAxXG5cdFx0XHRcdFx0XHRcdFx0XHQ/IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfT0JKRUNUX1BBR0VfQ09ORklSTV9ERUxFVEVfV0lUSF9PQkpFQ1RUSVRMRV9TSU5HVUxBUl9OT05fREVMRVRBQkxFXCIsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0b1Jlc291cmNlQnVuZGxlLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG51bGwsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMuZW50aXR5U2V0TmFtZVxuXHRcdFx0XHRcdFx0XHRcdFx0ICApXG5cdFx0XHRcdFx0XHRcdFx0XHQ6IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfT0JKRUNUX1BBR0VfQ09ORklSTV9ERUxFVEVfV0lUSF9PQkpFQ1RUSVRMRV9QTFVSQUxfTk9OX0RFTEVUQUJMRVwiLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRudWxsLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmVudGl0eVNldE5hbWVcblx0XHRcdFx0XHRcdFx0XHRcdCAgKTtcblx0XHRcdFx0XHRcdFx0b0RlbGV0ZU1lc3NhZ2Uubm9uRGVsZXRhYmxlVGV4dCA9IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFxuXHRcdFx0XHRcdFx0XHRcdFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfT0JKRUNUX1BBR0VfQ09ORklSTV9ERUxFVEVfV0lUSF9PQkpFQ1RJTkZPX0FORF9GRVdfT0JKRUNUU19OT05fREVMRVRBQkxFXCIsXG5cdFx0XHRcdFx0XHRcdFx0b1Jlc291cmNlQnVuZGxlLFxuXHRcdFx0XHRcdFx0XHRcdFtcblx0XHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLm51bWJlck9mU2VsZWN0ZWRDb250ZXh0cyAtIHZDb250ZXh0cy5jb25jYXQobVBhcmFtZXRlcnMudW5TYXZlZENvbnRleHRzKS5sZW5ndGgsXG5cdFx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5udW1iZXJPZlNlbGVjdGVkQ29udGV4dHNcblx0XHRcdFx0XHRcdFx0XHRdXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAobVBhcmFtZXRlcnMubG9ja2VkQ29udGV4dHMubGVuZ3RoID09IDEpIHtcblx0XHRcdFx0XHRcdFx0Ly9zZXR0aW5nIHRoZSBsb2NrZWQgdGV4dCBpZiBsb2NrZWQgb2JqZWN0cyBleGlzdFxuXHRcdFx0XHRcdFx0XHRpc0xvY2tlZFRleHRWaXNpYmxlID0gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0b0RlbGV0ZU1lc3NhZ2Uubm9uRGVsZXRhYmxlVGV4dCA9IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFxuXHRcdFx0XHRcdFx0XHRcdFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfT0JKRUNUX1BBR0VfQ09ORklSTV9ERUxFVEVfV0lUSF9PQkpFQ1RJTkZPX0FORF9PTkVfT0JKRUNUX0xPQ0tFRFwiLFxuXHRcdFx0XHRcdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZSxcblx0XHRcdFx0XHRcdFx0XHRbbVBhcmFtZXRlcnMubnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzXVxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0aWYgKG1QYXJhbWV0ZXJzLmxvY2tlZENvbnRleHRzLmxlbmd0aCA+IDEpIHtcblx0XHRcdFx0XHRcdFx0Ly9zZXR0aW5nIHRoZSBsb2NrZWQgdGV4dCBpZiBsb2NrZWQgb2JqZWN0cyBleGlzdFxuXHRcdFx0XHRcdFx0XHRpc0xvY2tlZFRleHRWaXNpYmxlID0gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0b0RlbGV0ZU1lc3NhZ2Uubm9uRGVsZXRhYmxlVGV4dCA9IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFxuXHRcdFx0XHRcdFx0XHRcdFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfT0JKRUNUX1BBR0VfQ09ORklSTV9ERUxFVEVfV0lUSF9PQkpFQ1RJTkZPX0FORF9GRVdfT0JKRUNUU19MT0NLRURcIixcblx0XHRcdFx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGUsXG5cdFx0XHRcdFx0XHRcdFx0W21QYXJhbWV0ZXJzLmxvY2tlZENvbnRleHRzLmxlbmd0aCwgbVBhcmFtZXRlcnMubnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzXVxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy51blNhdmVkQ29udGV4dHMubGVuZ3RoID4gMCAmJlxuXHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy51blNhdmVkQ29udGV4dHMubGVuZ3RoICE9PSBtUGFyYW1ldGVycy5udW1iZXJPZlNlbGVjdGVkQ29udGV4dHNcblx0XHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRcdFx0KGNhbm5vdEJlRGVsZXRlZFRleHRWaXNpYmxlIHx8IGlzTG9ja2VkVGV4dFZpc2libGUpICYmXG5cdFx0XHRcdFx0XHRcdFx0YURlbGV0YWJsZUNvbnRleHRzLmxlbmd0aCA9PT0gbVBhcmFtZXRlcnMudW5TYXZlZENvbnRleHRzLmxlbmd0aFxuXHRcdFx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdFx0XHQvL2lmIG9ubHkgdW5zYXZlZCBhbmQgZWl0aGVyIG9yIGJvdGggb2YgbG9ja2VkIGFuZCBub24tZGVsZXRhYmxlIG9iamVjdHMgZXhpc3QgdGhlbiB3ZSBoaWRlIHRoZSBjaGVjayBib3hcblx0XHRcdFx0XHRcdFx0XHRpc0NoZWNrQm94VmlzaWJsZSA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0XHRcdGFEZWxldGFibGVDb250ZXh0cyA9IG1QYXJhbWV0ZXJzLnVuU2F2ZWRDb250ZXh0cztcblx0XHRcdFx0XHRcdFx0XHRpZiAobVBhcmFtZXRlcnMudW5TYXZlZENvbnRleHRzLmxlbmd0aCA9PT0gMSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0b0RlbGV0ZU1lc3NhZ2UudGV4dCA9IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX09CSkVDVF9QQUdFX0NPTkZJUk1fREVMRVRFX1dJVEhfVU5TQVZFRF9BTkRfRkVXX09CSkVDVFNfTE9DS0VEX1NJTkdVTEFSXCIsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZVxuXHRcdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0b0RlbGV0ZU1lc3NhZ2UudGV4dCA9IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX09CSkVDVF9QQUdFX0NPTkZJUk1fREVMRVRFX1dJVEhfVU5TQVZFRF9BTkRfRkVXX09CSkVDVFNfTE9DS0VEX1BMVVJBTFwiLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGVcblx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdGlmIChtUGFyYW1ldGVycy51blNhdmVkQ29udGV4dHMubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRvRGVsZXRlTWVzc2FnZS5jaGVja0JveFRleHQgPSBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9PQkpFQ1RfUEFHRV9DT05GSVJNX0RFTEVURV9XSVRIX09CSkVDVElORk9fQU5EX0ZFV19PQkpFQ1RTX1VOU0FWRURfU0lOR1VMQVJcIixcblx0XHRcdFx0XHRcdFx0XHRcdFx0b1Jlc291cmNlQnVuZGxlXG5cdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRvRGVsZXRlTWVzc2FnZS5jaGVja0JveFRleHQgPSBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9PQkpFQ1RfUEFHRV9DT05GSVJNX0RFTEVURV9XSVRIX09CSkVDVElORk9fQU5EX0ZFV19PQkpFQ1RTX1VOU0FWRURfUExVUkFMXCIsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZVxuXHRcdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0aXNDaGVja0JveFZpc2libGUgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAoY2Fubm90QmVEZWxldGVkVGV4dFZpc2libGUgJiYgaXNMb2NrZWRUZXh0VmlzaWJsZSkge1xuXHRcdFx0XHRcdFx0XHQvL2lmIGJvdGggbG9ja2VkIGFuZCBub24tZGVsZXRhYmxlIG9iamVjdHMgZXhpc3QgYWxvbmcgd2l0aCBkZWxldGFibGUgb2JqZWN0c1xuXHRcdFx0XHRcdFx0XHRpZiAobVBhcmFtZXRlcnMudW5TYXZlZENvbnRleHRzLmxlbmd0aCA+IDEpIHtcblx0XHRcdFx0XHRcdFx0XHRvRGVsZXRlTWVzc2FnZS5ub25EZWxldGFibGVUZXh0ID0gQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXG5cdFx0XHRcdFx0XHRcdFx0XHRcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX09CSkVDVF9QQUdFX0NPTkZJUk1fREVMRVRFX1dJVEhfT0JKRUNUSU5GT19BTkRfRkVXX09CSkVDVFNfTE9DS0VEX0FORF9OT05fREVMRVRBQkxFXCIsXG5cdFx0XHRcdFx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGUsXG5cdFx0XHRcdFx0XHRcdFx0XHRbXG5cdFx0XHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLm51bWJlck9mU2VsZWN0ZWRDb250ZXh0cyAtXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dkNvbnRleHRzLmNvbmNhdChtUGFyYW1ldGVycy51blNhdmVkQ29udGV4dHMpLmxlbmd0aCAtXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMubG9ja2VkQ29udGV4dHMubGVuZ3RoLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5sb2NrZWRDb250ZXh0cy5sZW5ndGgsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLm51bWJlck9mU2VsZWN0ZWRDb250ZXh0c1xuXHRcdFx0XHRcdFx0XHRcdFx0XVxuXHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0aWYgKG1QYXJhbWV0ZXJzLnVuU2F2ZWRDb250ZXh0cy5sZW5ndGggPT0gMSkge1xuXHRcdFx0XHRcdFx0XHRcdG9EZWxldGVNZXNzYWdlLm5vbkRlbGV0YWJsZVRleHQgPSBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcblx0XHRcdFx0XHRcdFx0XHRcdFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfT0JKRUNUX1BBR0VfQ09ORklSTV9ERUxFVEVfV0lUSF9PQkpFQ1RJTkZPX0FORF9PTkVfT0JKRUNUX0xPQ0tFRF9BTkRfTk9OX0RFTEVUQUJMRVwiLFxuXHRcdFx0XHRcdFx0XHRcdFx0b1Jlc291cmNlQnVuZGxlLFxuXHRcdFx0XHRcdFx0XHRcdFx0W1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5udW1iZXJPZlNlbGVjdGVkQ29udGV4dHMgLVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHZDb250ZXh0cy5jb25jYXQobVBhcmFtZXRlcnMudW5TYXZlZENvbnRleHRzKS5sZW5ndGggLVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmxvY2tlZENvbnRleHRzLmxlbmd0aCxcblx0XHRcdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMubnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzXG5cdFx0XHRcdFx0XHRcdFx0XHRdXG5cdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRsZXQgb05vbkRlbGV0YWJsZU1lc3NhZ2VUZXh0Q29udHJvbCwgb0RlbGV0ZU1lc3NhZ2VUZXh0Q29udHJvbDtcblx0XHRcdFx0Y29uc3Qgb0NvbnRlbnQgPSBuZXcgVkJveCh7XG5cdFx0XHRcdFx0aXRlbXM6IFtcblx0XHRcdFx0XHRcdChvTm9uRGVsZXRhYmxlTWVzc2FnZVRleHRDb250cm9sID0gbmV3IFRleHQoe1xuXHRcdFx0XHRcdFx0XHR0ZXh0OiBvRGVsZXRlTWVzc2FnZS5ub25EZWxldGFibGVUZXh0LFxuXHRcdFx0XHRcdFx0XHR2aXNpYmxlOiBpc0xvY2tlZFRleHRWaXNpYmxlIHx8IGNhbm5vdEJlRGVsZXRlZFRleHRWaXNpYmxlXG5cdFx0XHRcdFx0XHR9KSksXG5cdFx0XHRcdFx0XHQob0RlbGV0ZU1lc3NhZ2VUZXh0Q29udHJvbCA9IG5ldyBUZXh0KHtcblx0XHRcdFx0XHRcdFx0dGV4dDogb0RlbGV0ZU1lc3NhZ2UudGV4dFxuXHRcdFx0XHRcdFx0fSkpLFxuXHRcdFx0XHRcdFx0bmV3IENoZWNrQm94KHtcblx0XHRcdFx0XHRcdFx0dGV4dDogb0RlbGV0ZU1lc3NhZ2UuY2hlY2tCb3hUZXh0LFxuXHRcdFx0XHRcdFx0XHRzZWxlY3RlZDogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0c2VsZWN0OiBmdW5jdGlvbiAob0V2ZW50OiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBzZWxlY3RlZCA9IG9FdmVudC5nZXRTb3VyY2UoKS5nZXRTZWxlY3RlZCgpO1xuXHRcdFx0XHRcdFx0XHRcdGlmIChzZWxlY3RlZCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0YURlbGV0YWJsZUNvbnRleHRzID0gdkNvbnRleHRzLmNvbmNhdChtUGFyYW1ldGVycy51blNhdmVkQ29udGV4dHMpO1xuXHRcdFx0XHRcdFx0XHRcdFx0aXNDaGVja0JveFNlbGVjdGVkID0gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0YURlbGV0YWJsZUNvbnRleHRzID0gdkNvbnRleHRzO1xuXHRcdFx0XHRcdFx0XHRcdFx0aXNDaGVja0JveFNlbGVjdGVkID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHR2aXNpYmxlOiBpc0NoZWNrQm94VmlzaWJsZVxuXHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRdXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRjb25zdCBzVGl0bGUgPSBvUmVzb3VyY2VCdW5kbGVDb3JlLmdldFRleHQoXCJDX0NPTU1PTl9PQkpFQ1RfUEFHRV9ERUxFVEVcIik7XG5cdFx0XHRcdGNvbnN0IGZuQ29uZmlybSA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRiRGlhbG9nQ29uZmlybWVkID0gdHJ1ZTtcblx0XHRcdFx0XHRCdXN5TG9ja2VyLmxvY2sodGhhdC5vTG9ja09iamVjdCk7XG5cdFx0XHRcdFx0Y29uc3QgYUNvbnRleHRzID0gYURlbGV0YWJsZUNvbnRleHRzO1xuXHRcdFx0XHRcdGxldCBvbkJlZm9yZURlbGV0ZVByb21pc2U7XG5cdFx0XHRcdFx0aWYgKG1QYXJhbWV0ZXJzLmJlZm9yZURlbGV0ZUNhbGxCYWNrKSB7XG5cdFx0XHRcdFx0XHRvbkJlZm9yZURlbGV0ZVByb21pc2UgPSBtUGFyYW1ldGVycy5iZWZvcmVEZWxldGVDYWxsQmFjayh7IGNvbnRleHRzOiBhQ29udGV4dHMgfSk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdG9uQmVmb3JlRGVsZXRlUHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gb25CZWZvcmVEZWxldGVQcm9taXNlXG5cdFx0XHRcdFx0XHQudGhlbih0aGF0LmZpbmRBY3RpdmVEcmFmdFJvb3RDb250ZXh0cy5iaW5kKHRoYXQsIGFDb250ZXh0cywgbVBhcmFtZXRlcnMuYkZpbmRBY3RpdmVDb250ZXh0cykpXG5cdFx0XHRcdFx0XHQudGhlbihmdW5jdGlvbiAoYWN0aXZlQ29udGV4dHM6IGFueSkge1xuXHRcdFx0XHRcdFx0XHQvL21ha2Ugc3VyZSB0byBmZXRjaCB0aGUgYWN0aXZlIGNvbnRleHRzIGJlZm9yZSBkZWxldGluZyB0aGUgZHJhZnRzXG5cdFx0XHRcdFx0XHRcdHJldHVybiBQcm9taXNlLmFsbChcblx0XHRcdFx0XHRcdFx0XHRhQ29udGV4dHMubWFwKGZ1bmN0aW9uIChvQ29udGV4dDogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHQvL2RlbGV0ZSB0aGUgZHJhZnRcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBkcmFmdC5kZWxldGVEcmFmdChvQ29udGV4dCk7XG5cdFx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZXMoKS50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gcmUtdGhyb3cgZXJyb3IgdG8gZW5mb3JjZSByZWplY3RpbmcgdGhlIGdlbmVyYWwgcHJvbWlzZVxuXHRcdFx0XHRcdFx0XHRcdFx0XHR0aHJvdyBvRXJyb3I7XG5cdFx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHRcdC50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IGNoZWNrQm94ID0ge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcImlzQ2hlY2tCb3hWaXNpYmxlXCI6IGlzQ2hlY2tCb3hWaXNpYmxlLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcImlzQ2hlY2tCb3hTZWxlY3RlZFwiOiBpc0NoZWNrQm94U2VsZWN0ZWRcblx0XHRcdFx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoYWN0aXZlQ29udGV4dHMgJiYgYWN0aXZlQ29udGV4dHMubGVuZ3RoKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBQcm9taXNlLmFsbChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhY3RpdmVDb250ZXh0cy5tYXAoZnVuY3Rpb24gKG9Db250ZXh0OiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBvQ29udGV4dC5kZWxldGUoKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQpLnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHRoYXQuYWZ0ZXJEZWxldGVQcm9jZXNzKG1QYXJhbWV0ZXJzLCBjaGVja0JveCwgYUNvbnRleHRzLCBvUmVzb3VyY2VCdW5kbGUpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZURpYWxvZygpLnRoZW4oZm5SZXNvbHZlKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR0aGF0LmFmdGVyRGVsZXRlUHJvY2VzcyhtUGFyYW1ldGVycywgY2hlY2tCb3gsIGFDb250ZXh0cywgb1Jlc291cmNlQnVuZGxlKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG1lc3NhZ2VIYW5kbGVyLnNob3dNZXNzYWdlRGlhbG9nKCkudGhlbihmblJlc29sdmUpO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdGZuUmVqZWN0KCk7XG5cdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0LmZpbmFsbHkoZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRCdXN5TG9ja2VyLnVubG9jayh0aGF0Lm9Mb2NrT2JqZWN0KTtcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9O1xuXHRcdFx0XHRjb25zdCBvRGlhbG9nID0gbmV3IERpYWxvZyh7XG5cdFx0XHRcdFx0dGl0bGU6IHNUaXRsZSxcblx0XHRcdFx0XHRzdGF0ZTogXCJXYXJuaW5nXCIsXG5cdFx0XHRcdFx0Y29udGVudDogW29Db250ZW50XSxcblx0XHRcdFx0XHRhcmlhTGFiZWxsZWRCeTogb05vbkRlbGV0YWJsZU1lc3NhZ2VUZXh0Q29udHJvbC5nZXRWaXNpYmxlKClcblx0XHRcdFx0XHRcdD8gW29Ob25EZWxldGFibGVNZXNzYWdlVGV4dENvbnRyb2wsIG9EZWxldGVNZXNzYWdlVGV4dENvbnRyb2xdXG5cdFx0XHRcdFx0XHQ6IG9EZWxldGVNZXNzYWdlVGV4dENvbnRyb2wsXG5cdFx0XHRcdFx0YmVnaW5CdXR0b246IG5ldyBCdXR0b24oe1xuXHRcdFx0XHRcdFx0dGV4dDogb1Jlc291cmNlQnVuZGxlQ29yZS5nZXRUZXh0KFwiQ19DT01NT05fT0JKRUNUX1BBR0VfREVMRVRFXCIpLFxuXHRcdFx0XHRcdFx0dHlwZTogXCJFbXBoYXNpemVkXCIsXG5cdFx0XHRcdFx0XHRwcmVzczogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRvRGlhbG9nLmNsb3NlKCk7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBmbkNvbmZpcm0oKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KSxcblx0XHRcdFx0XHRlbmRCdXR0b246IG5ldyBCdXR0b24oe1xuXHRcdFx0XHRcdFx0dGV4dDogQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXCJDX0NPTU1PTl9ESUFMT0dfQ0FOQ0VMXCIsIG9SZXNvdXJjZUJ1bmRsZSksXG5cdFx0XHRcdFx0XHRwcmVzczogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRvRGlhbG9nLmNsb3NlKCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSksXG5cdFx0XHRcdFx0YWZ0ZXJDbG9zZTogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0b0RpYWxvZy5kZXN0cm95KCk7XG5cdFx0XHRcdFx0XHQvLyBpZiBkaWFsb2cgaXMgY2xvc2VkIHVuY29uZmlybWVkIChlLmcuIHZpYSBcIkNhbmNlbFwiIG9yIEVzY2FwZSBidXR0b24pLCBlbnN1cmUgdG8gcmVqZWN0IHByb21pc2Vcblx0XHRcdFx0XHRcdGlmICghYkRpYWxvZ0NvbmZpcm1lZCkge1xuXHRcdFx0XHRcdFx0XHRmblJlamVjdCgpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBhcyBhbnkpO1xuXHRcdFx0XHRpZiAobVBhcmFtZXRlcnMubm9EaWFsb2cpIHtcblx0XHRcdFx0XHRyZXR1cm4gZm5Db25maXJtKCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0b0RpYWxvZy5hZGRTdHlsZUNsYXNzKFwic2FwVWlDb250ZW50UGFkZGluZ1wiKTtcblx0XHRcdFx0XHRvRGlhbG9nLm9wZW4oKTtcblx0XHRcdFx0fVxuXHRcdFx0fSlcblx0XHRcdC5maW5hbGx5KGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0QnVzeUxvY2tlci51bmxvY2sodGhhdC5vTG9ja09iamVjdCk7XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0TG9nLndhcm5pbmcoXCJDb3VsZG4ndCBnZXQgUHJvZ3JhbW1pbmcgbW9kZWxcIik7XG5cdFx0XHRcdGZuUmVqZWN0KCk7XG5cdFx0XHR9KTtcblx0XHRyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmU6ICh2YWx1ZTogYW55KSA9PiB2b2lkLCByZWplY3Q6IChyZWFzb24/OiBhbnkpID0+IHZvaWQpIHtcblx0XHRcdGZuUmVqZWN0ID0gcmVqZWN0O1xuXHRcdFx0Zm5SZXNvbHZlID0gcmVzb2x2ZTtcblx0XHR9KTtcblx0fVxuXHQvKipcblx0ICogRWRpdHMgYSBkb2N1bWVudC5cblx0ICpcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLlRyYW5zYWN0aW9uSGVscGVyXG5cdCAqIEBzdGF0aWNcblx0ICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dH0gb0NvbnRleHQgQ29udGV4dCBvZiB0aGUgYWN0aXZlIGRvY3VtZW50XG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvVmlldyBDdXJyZW50IHZpZXdcblx0ICogQHBhcmFtIG1lc3NhZ2VIYW5kbGVyXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBQcm9taXNlIHJlc29sdmVzIHdpdGggdGhlIG5ldyBkcmFmdCBjb250ZXh0IGluIGNhc2Ugb2YgZHJhZnQgcHJvZ3JhbW1pbmcgbW9kZWxcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0ZWRpdERvY3VtZW50KG9Db250ZXh0OiBhbnksIG9WaWV3OiBvYmplY3QsIG1lc3NhZ2VIYW5kbGVyOiBhbnkpIHtcblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXRoaXMtYWxpYXNcblx0XHRjb25zdCB0aGF0ID0gdGhpcztcblx0XHRjb25zdCBzUHJvZ3JhbW1pbmdNb2RlbCA9IHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChvQ29udGV4dCk7XG5cdFx0bGV0IG9FZGl0UHJvbWlzZTtcblx0XHRpZiAoIW9Db250ZXh0KSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiQmluZGluZyBjb250ZXh0IHRvIGFjdGl2ZSBkb2N1bWVudCBpcyByZXF1aXJlZFwiKSk7XG5cdFx0fVxuXHRcdHRoaXMuX2JJc01vZGlmaWVkID0gZmFsc2U7XG5cdFx0QnVzeUxvY2tlci5sb2NrKHRoYXQub0xvY2tPYmplY3QpO1xuXHRcdC8vIGJlZm9yZSB0cmlnZ2VyaW5nIHRoZSBlZGl0IGFjdGlvbiB3ZSdsbCBoYXZlIHRvIHJlbW92ZSBhbGwgYm91bmQgdHJhbnNpdGlvbiBtZXNzYWdlc1xuXHRcdG1lc3NhZ2VIYW5kbGVyLnJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcygpO1xuXHRcdGlmIChzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCkge1xuXHRcdFx0b0VkaXRQcm9taXNlID0gZHJhZnQuY3JlYXRlRHJhZnRGcm9tQWN0aXZlRG9jdW1lbnQob0NvbnRleHQsIHRoaXMuX2dldEFwcENvbXBvbmVudCgpLCB7XG5cdFx0XHRcdGJQcmVzZXJ2ZUNoYW5nZXM6IHRydWUsXG5cdFx0XHRcdG9WaWV3OiBvVmlld1xuXHRcdFx0fSBhcyBhbnkpO1xuXHRcdH0gZWxzZSBpZiAoc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5KSB7XG5cdFx0XHRvRWRpdFByb21pc2UgPSBzdGlja3kuZWRpdERvY3VtZW50SW5TdGlja3lTZXNzaW9uKG9Db250ZXh0LCB0aGlzLl9nZXRBcHBDb21wb25lbnQoKSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdEJ1c3lMb2NrZXIudW5sb2NrKHRoYXQub0xvY2tPYmplY3QpO1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkVkaXQgaXMgb25seSBhbGxvd2VkIGZvciBkcmFmdCBvciBzdGlja3kgc2Vzc2lvbiBzdXBwb3J0ZWQgc2VydmljZXNcIikpO1xuXHRcdH1cblx0XHRyZXR1cm4gb0VkaXRQcm9taXNlXG5cdFx0XHQudGhlbihmdW5jdGlvbiAob05ld0NvbnRleHQ6IGFueSkge1xuXHRcdFx0XHR0aGF0Ll9iQ3JlYXRlTW9kZSA9IGZhbHNlO1xuXHRcdFx0XHRyZXR1cm4gbWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VEaWFsb2coKS50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRyZXR1cm4gb05ld0NvbnRleHQ7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaChmdW5jdGlvbiAoZXJyOiBhbnkpIHtcblx0XHRcdFx0cmV0dXJuIG1lc3NhZ2VIYW5kbGVyLnNob3dNZXNzYWdlcygpLnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChlcnIpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH0pXG5cdFx0XHQuZmluYWxseShmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdEJ1c3lMb2NrZXIudW5sb2NrKHRoYXQub0xvY2tPYmplY3QpO1xuXHRcdFx0fSk7XG5cdH1cblx0LyoqXG5cdCAqIENhbmNlbCAnZWRpdCcgbW9kZSBvZiBhIGRvY3VtZW50LlxuXHQgKlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuVHJhbnNhY3Rpb25IZWxwZXJcblx0ICogQHN0YXRpY1xuXHQgKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSBvQ29udGV4dCBDb250ZXh0IG9mIHRoZSBkb2N1bWVudCB0byBiZSBjYW5jZWxlZCBvciBkZWxldGVkXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBbbUluUGFyYW1ldGVyc10gT3B0aW9uYWwsIGNhbiBjb250YWluIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0ICogQHBhcmFtIHtzYXAubS5CdXR0b259IG1JblBhcmFtZXRlcnMuY2FuY2VsQnV0dG9uIENhbmNlbCBCdXR0b24gb2YgdGhlIGRpc2NhcmQgcG9wb3ZlciAobWFuZGF0b3J5IGZvciBub3cpXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gbUluUGFyYW1ldGVycy5za2lwRGlzY2FyZFBvcG92ZXIgT3B0aW9uYWwsIHN1cHJlc3NlcyB0aGUgZGlzY2FyZCBwb3BvdmVyIGluY2FzZSBvZiBkcmFmdCBhcHBsaWNhdGlvbnMgd2hpbGUgbmF2aWdhdGluZyBvdXQgb2YgT1Bcblx0ICogQHBhcmFtIG9SZXNvdXJjZUJ1bmRsZVxuXHQgKiBAcGFyYW0gbWVzc2FnZUhhbmRsZXJcblx0ICogQHJldHVybnMge1Byb21pc2V9IFByb21pc2UgcmVzb2x2ZXMgd2l0aCA/Pz9cblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0Y2FuY2VsRG9jdW1lbnQoXG5cdFx0b0NvbnRleHQ6IGFueSxcblx0XHRtSW5QYXJhbWV0ZXJzOiB7IGNhbmNlbEJ1dHRvbjogYW55OyBza2lwRGlzY2FyZFBvcG92ZXI6IGJvb2xlYW4gfSB8IHVuZGVmaW5lZCxcblx0XHRvUmVzb3VyY2VCdW5kbGU6IGFueSxcblx0XHRtZXNzYWdlSGFuZGxlcjogYW55XG5cdCkge1xuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdGhpcy1hbGlhc1xuXHRcdGNvbnN0IHRoYXQgPSB0aGlzO1xuXHRcdGxldCBzUHJvZ3JhbW1pbmdNb2RlbDogdHlwZW9mIFByb2dyYW1taW5nTW9kZWw7XG5cdFx0Ly9jb250ZXh0IG11c3QgYWx3YXlzIGJlIHBhc3NlZCAtIG1hbmRhdG9yeSBwYXJhbWV0ZXJcblx0XHRpZiAoIW9Db250ZXh0KSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoXCJObyBjb250ZXh0IGV4aXN0cy4gUGFzcyBhIG1lYW5pbmdmdWwgY29udGV4dFwiKTtcblx0XHR9XG5cdFx0QnVzeUxvY2tlci5sb2NrKHRoYXQub0xvY2tPYmplY3QpO1xuXHRcdGNvbnN0IG1QYXJhbWV0ZXJzID0gZ2V0UGFyYW1ldGVycyhtSW5QYXJhbWV0ZXJzKTtcblx0XHRjb25zdCBvUGFyYW1zQ29udGV4dCA9IG9Db250ZXh0LFxuXHRcdFx0b0NhbmNlbEJ1dHRvbiA9IG1QYXJhbWV0ZXJzLmNhbmNlbEJ1dHRvbixcblx0XHRcdG9Nb2RlbCA9IG9QYXJhbXNDb250ZXh0LmdldE1vZGVsKCk7XG5cdFx0bGV0IG9uQmVmb3JlQ2FuY2VsUHJvbWlzZSwgc0Nhbm9uaWNhbFBhdGg6IHN0cmluZztcblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChvQ29udGV4dCkpXG5cdFx0XHQudGhlbihmdW5jdGlvbiAoc1BNb2RlbDogYW55KSB7XG5cdFx0XHRcdHNQcm9ncmFtbWluZ01vZGVsID0gc1BNb2RlbDtcblx0XHRcdFx0aWYgKHNQTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQpIHtcblx0XHRcdFx0XHRjb25zdCBkcmFmdERhdGFDb250ZXh0ID0gb01vZGVsLmJpbmRDb250ZXh0KG9QYXJhbXNDb250ZXh0LmdldFBhdGgoKSArIFwiL0RyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhXCIpLmdldEJvdW5kQ29udGV4dCgpO1xuXHRcdFx0XHRcdGlmICghdGhhdC5fYklzTW9kaWZpZWQpIHtcblx0XHRcdFx0XHRcdHJldHVybiBkcmFmdERhdGFDb250ZXh0LnJlcXVlc3RPYmplY3QoKS50aGVuKGZ1bmN0aW9uIChkcmFmdEFkbWluRGF0YTogYW55KSB7XG5cdFx0XHRcdFx0XHRcdGlmIChkcmFmdEFkbWluRGF0YSkge1xuXHRcdFx0XHRcdFx0XHRcdHRoYXQuX2JJc01vZGlmaWVkID0gIShkcmFmdEFkbWluRGF0YS5DcmVhdGlvbkRhdGVUaW1lID09PSBkcmFmdEFkbWluRGF0YS5MYXN0Q2hhbmdlRGF0ZVRpbWUpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0pXG5cdFx0XHQudGhlbihmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdGlmICghbVBhcmFtZXRlcnMuc2tpcERpc2NhcmRQb3BvdmVyKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRoYXQuX3Nob3dEaXNjYXJkUG9wb3ZlcihvQ2FuY2VsQnV0dG9uLCB0aGF0Ll9iSXNNb2RpZmllZCwgb1Jlc291cmNlQnVuZGxlKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pXG5cdFx0XHQudGhlbihmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdGlmIChtUGFyYW1ldGVycy5iZWZvcmVDYW5jZWxDYWxsQmFjaykge1xuXHRcdFx0XHRcdG9uQmVmb3JlQ2FuY2VsUHJvbWlzZSA9IG1QYXJhbWV0ZXJzLmJlZm9yZUNhbmNlbENhbGxCYWNrKHsgY29udGV4dDogb0NvbnRleHQgfSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0b25CZWZvcmVDYW5jZWxQcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIG9uQmVmb3JlQ2FuY2VsUHJvbWlzZTtcblx0XHRcdH0pXG5cdFx0XHQudGhlbihmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBkZWZhdWx0LWNhc2Vcblx0XHRcdFx0c3dpdGNoIChzUHJvZ3JhbW1pbmdNb2RlbCkge1xuXHRcdFx0XHRcdGNhc2UgUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdDpcblx0XHRcdFx0XHRcdHJldHVybiBvUGFyYW1zQ29udGV4dC5yZXF1ZXN0T2JqZWN0KFwiSGFzQWN0aXZlRW50aXR5XCIpLnRoZW4oZnVuY3Rpb24gKGJIYXNBY3RpdmVFbnRpdHk6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRsZXQgb0RlbGV0ZVByb21pc2U7XG5cdFx0XHRcdFx0XHRcdGlmICghYkhhc0FjdGl2ZUVudGl0eSkge1xuXHRcdFx0XHRcdFx0XHRcdGlmIChvUGFyYW1zQ29udGV4dCAmJiBvUGFyYW1zQ29udGV4dC5oYXNQZW5kaW5nQ2hhbmdlcygpKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRvUGFyYW1zQ29udGV4dC5nZXRCaW5kaW5nKCkucmVzZXRDaGFuZ2VzKCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdG9EZWxldGVQcm9taXNlID0gZHJhZnQuZGVsZXRlRHJhZnQob1BhcmFtc0NvbnRleHQpO1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBvRGVsZXRlUHJvbWlzZTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRsZXQgb0FjdGl2ZUNvbnRleHQgPSBvTW9kZWwuYmluZENvbnRleHQob1BhcmFtc0NvbnRleHQuZ2V0UGF0aCgpICsgXCIvU2libGluZ0VudGl0eVwiKS5nZXRCb3VuZENvbnRleHQoKTtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gb0FjdGl2ZUNvbnRleHRcblx0XHRcdFx0XHRcdFx0XHRcdC5yZXF1ZXN0Q2Fub25pY2FsUGF0aCgpXG5cdFx0XHRcdFx0XHRcdFx0XHQudGhlbihcblx0XHRcdFx0XHRcdFx0XHRcdFx0ZnVuY3Rpb24gKHNQYXRoOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRzQ2Fub25pY2FsUGF0aCA9IHNQYXRoO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChvUGFyYW1zQ29udGV4dCAmJiBvUGFyYW1zQ29udGV4dC5oYXNQZW5kaW5nQ2hhbmdlcygpKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvUGFyYW1zQ29udGV4dC5nZXRCaW5kaW5nKCkucmVzZXRDaGFuZ2VzKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9EZWxldGVQcm9taXNlID0gZHJhZnQuZGVsZXRlRHJhZnQob1BhcmFtc0NvbnRleHQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBvRGVsZXRlUHJvbWlzZTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0ZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGRyYWZ0LmRlbGV0ZURyYWZ0KG9QYXJhbXNDb250ZXh0KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHRcdFx0XHRcdC50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly9vUGFyYW1zQ29udGV4dC5kZWxldGUoKSBpbiB0aGUgcHJldmlvdXMgcHJvbWlzZSBkb2VzbnQgcmV0dXJuIGFueXRoaW5nIHVwb24gc3VjY2Vzcy5cblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKCFzQ2Fub25pY2FsUGF0aCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAob0FjdGl2ZUNvbnRleHQuZ2V0UGF0aCgpICE9PSBzQ2Fub25pY2FsUGF0aCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIHRoZSBhY3RpdmUgY29udGV4dCBpcyB1c2luZyB0aGUgc2libGluZyBlbnRpdHkgLSB0aGlzIHBhdGggaXMgbm90IGFjY2Vzc2libGUgYW55bW9yZSBhcyB3ZSBkZWxldGVkIHRoZSBkcmFmdFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIGRvY3VtZW50IC0gdGhlcmVmb3JlIHdlIG5lZWQgdG8gY3JlYXRlIGEgbmV3IGNvbnRleHQgd2l0aCB0aGUgY2Fub25pY2FsIHBhdGhcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvQWN0aXZlQ29udGV4dCA9IG9Nb2RlbC5iaW5kQ29udGV4dChzQ2Fub25pY2FsUGF0aCkuZ2V0Qm91bmRDb250ZXh0KCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG9BY3RpdmVDb250ZXh0O1xuXHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdGNhc2UgUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3k6XG5cdFx0XHRcdFx0XHRyZXR1cm4gc3RpY2t5LmRpc2NhcmREb2N1bWVudChvQ29udGV4dCkudGhlbihmdW5jdGlvbiAob0NvbnRleHQ6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRpZiAob0NvbnRleHQpIHtcblx0XHRcdFx0XHRcdFx0XHRpZiAob0NvbnRleHQuaGFzUGVuZGluZ0NoYW5nZXMoKSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0b0NvbnRleHQuZ2V0QmluZGluZygpLnJlc2V0Q2hhbmdlcygpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRpZiAoIXRoYXQuX2JDcmVhdGVNb2RlKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRvQ29udGV4dC5yZWZyZXNoKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gb0NvbnRleHQ7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoXCJDYW5jZWwgZG9jdW1lbnQgb25seSBhbGxvd2VkIGZvciBkcmFmdCBvciBzdGlja3kgc2Vzc2lvbiBzdXBwb3J0ZWQgc2VydmljZXNcIik7XG5cdFx0XHRcdH1cblx0XHRcdH0pXG5cdFx0XHQudGhlbihmdW5jdGlvbiAoY29udGV4dDogYW55KSB7XG5cdFx0XHRcdHRoYXQuX2JJc01vZGlmaWVkID0gZmFsc2U7XG5cdFx0XHRcdC8vIHJlbW92ZSBleGlzdGluZyBib3VuZCB0cmFuc2l0aW9uIG1lc3NhZ2VzXG5cdFx0XHRcdG1lc3NhZ2VIYW5kbGVyLnJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcygpO1xuXHRcdFx0XHQvLyBzaG93IHVuYm91bmQgbWVzc2FnZXNcblx0XHRcdFx0cmV0dXJuIG1lc3NhZ2VIYW5kbGVyLnNob3dNZXNzYWdlcygpLnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdHJldHVybiBjb250ZXh0O1xuXHRcdFx0XHR9KTtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24gKGVycjogYW55KSB7XG5cdFx0XHRcdHJldHVybiBtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZXMoKS50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyKTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9KVxuXHRcdFx0LmZpbmFsbHkoZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRCdXN5TG9ja2VyLnVubG9jayh0aGF0Lm9Mb2NrT2JqZWN0KTtcblx0XHRcdH0pO1xuXHR9XG5cdC8qKlxuXHQgKiBTYXZlcyB0aGUgZG9jdW1lbnQuXG5cdCAqXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5UcmFuc2FjdGlvbkhlbHBlclxuXHQgKiBAc3RhdGljXG5cdCAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9Db250ZXh0IENvbnRleHQgb2YgdGhlIGRvY3VtZW50IHRvIGJlIHNhdmVkXG5cdCAqIEBwYXJhbSBvUmVzb3VyY2VCdW5kbGVcblx0ICogQHBhcmFtIGJFeGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yXG5cdCAqIEBwYXJhbSBhQmluZGluZ3Ncblx0ICogQHBhcmFtIG1lc3NhZ2VIYW5kbGVyXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBQcm9taXNlIHJlc29sdmVzIHdpdGggPz8/XG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAZmluYWxcblx0ICovXG5cdHNhdmVEb2N1bWVudChvQ29udGV4dDogYW55LCBvUmVzb3VyY2VCdW5kbGU6IGFueSwgYkV4ZWN1dGVTaWRlRWZmZWN0c09uRXJyb3I6IGFueSwgYUJpbmRpbmdzOiBhbnksIG1lc3NhZ2VIYW5kbGVyOiBhbnkpIHtcblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXRoaXMtYWxpYXNcblx0XHRjb25zdCB0aGF0ID0gdGhpcztcblx0XHRjb25zdCBzUHJvZ3JhbW1pbmdNb2RlbCA9IHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChvQ29udGV4dCk7XG5cdFx0bGV0IG9TYXZlUHJvbWlzZTtcblx0XHRpZiAoIW9Db250ZXh0KSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiQmluZGluZyBjb250ZXh0IHRvIGRyYWZ0IGRvY3VtZW50IGlzIHJlcXVpcmVkXCIpKTtcblx0XHR9XG5cdFx0Ly8gaW4gY2FzZSBvZiBzYXZpbmcgLyBhY3RpdmF0aW5nIHRoZSBib3VuZCB0cmFuc2l0aW9uIG1lc3NhZ2VzIHNoYWxsIGJlIHJlbW92ZWQgYmVmb3JlIHRoZSBQQVRDSC9QT1NUXG5cdFx0Ly8gaXMgc2VudCB0byB0aGUgYmFja2VuZFxuXHRcdG1lc3NhZ2VIYW5kbGVyLnJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcygpO1xuXHRcdEJ1c3lMb2NrZXIubG9jayh0aGF0Lm9Mb2NrT2JqZWN0KTtcblx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQpIHtcblx0XHRcdG9TYXZlUHJvbWlzZSA9IGRyYWZ0LmFjdGl2YXRlRG9jdW1lbnQob0NvbnRleHQsIHRoaXMuX2dldEFwcENvbXBvbmVudCgpLCB7fSk7XG5cdFx0fSBlbHNlIGlmIChzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kpIHtcblx0XHRcdGNvbnN0IGJFbmFibGVTdHJpY3RIYW5kbGluZyA9IFVyaVBhcmFtZXRlcnMuZnJvbVF1ZXJ5KHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpLmdldChcInNhcC1mZS1zYXZlLXN0cmljdC1tb2RlXCIpID09PSBcInRydWVcIjtcblx0XHRcdG9TYXZlUHJvbWlzZSA9IHN0aWNreS5hY3RpdmF0ZURvY3VtZW50KG9Db250ZXh0LCBiRW5hYmxlU3RyaWN0SGFuZGxpbmcpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRCdXN5TG9ja2VyLnVubG9jayh0aGF0Lm9Mb2NrT2JqZWN0KTtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJTYXZlIGlzIG9ubHkgYWxsb3dlZCBmb3IgZHJhZnQgb3Igc3RpY2t5IHNlc3Npb24gc3VwcG9ydGVkIHNlcnZpY2VzXCIpKTtcblx0XHR9XG5cdFx0cmV0dXJuIG9TYXZlUHJvbWlzZVxuXHRcdFx0LnRoZW4oZnVuY3Rpb24gKG9BY3RpdmVEb2N1bWVudDogYW55KSB7XG5cdFx0XHRcdGNvbnN0IGJOZXdPYmplY3QgPVxuXHRcdFx0XHRcdHRoYXQuc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5ID8gdGhhdC5fYkNyZWF0ZU1vZGUgOiAhb0NvbnRleHQuZ2V0T2JqZWN0KCkuSGFzQWN0aXZlRW50aXR5O1xuXHRcdFx0XHRNZXNzYWdlVG9hc3Quc2hvdyhcblx0XHRcdFx0XHRiTmV3T2JqZWN0XG5cdFx0XHRcdFx0XHQ/IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfT0JKRUNUX0NSRUFURURcIiwgb1Jlc291cmNlQnVuZGxlKVxuXHRcdFx0XHRcdFx0OiBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX09CSkVDVF9TQVZFRFwiLCBvUmVzb3VyY2VCdW5kbGUpXG5cdFx0XHRcdCk7XG5cdFx0XHRcdHRoYXQuX2JJc01vZGlmaWVkID0gZmFsc2U7XG5cdFx0XHRcdHJldHVybiBtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZURpYWxvZygpLnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdHJldHVybiBvQWN0aXZlRG9jdW1lbnQ7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaChmdW5jdGlvbiAoZXJyOiBhbnkpIHtcblx0XHRcdFx0aWYgKGFCaW5kaW5ncyAmJiBhQmluZGluZ3MubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdC8qIFRoZSBzaWRlRWZmZWN0cyBhcmUgZXhlY3V0ZWQgb25seSBmb3IgdGFibGUgaXRlbXMgaW4gdHJhbnNpZW50IHN0YXRlICovXG5cdFx0XHRcdFx0YUJpbmRpbmdzLmZvckVhY2goZnVuY3Rpb24gKG9MaXN0QmluZGluZzogYW55KSB7XG5cdFx0XHRcdFx0XHRpZiAoIUNvbW1vblV0aWxzLmhhc1RyYW5zaWVudENvbnRleHQob0xpc3RCaW5kaW5nKSAmJiBiRXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvcikge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBvQXBwQ29tcG9uZW50ID0gdGhhdC5fZ2V0QXBwQ29tcG9uZW50KCk7XG5cdFx0XHRcdFx0XHRcdG9BcHBDb21wb25lbnQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKCkucmVxdWVzdFNpZGVFZmZlY3RzRm9yTmF2aWdhdGlvblByb3BlcnR5KG9MaXN0QmluZGluZy5nZXRQYXRoKCksIG9Db250ZXh0KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gbWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VzKCkudGhlbihmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KGVycik7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSlcblx0XHRcdC5maW5hbGx5KGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0QnVzeUxvY2tlci51bmxvY2sodGhhdC5vTG9ja09iamVjdCk7XG5cdFx0XHR9KTtcblx0fVxuXHQvKipcblx0ICogQ2FsbHMgYSBib3VuZCBvciB1bmJvdW5kIGFjdGlvbi5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBzdGF0aWNcblx0ICogQG5hbWUgc2FwLmZlLmNvcmUuVHJhbnNhY3Rpb25IZWxwZXIuY2FsbEFjdGlvblxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuVHJhbnNhY3Rpb25IZWxwZXJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNBY3Rpb25OYW1lIFRoZSBuYW1lIG9mIHRoZSBhY3Rpb24gdG8gYmUgY2FsbGVkXG5cdCAqIEBwYXJhbSB7bWFwfSBbbVBhcmFtZXRlcnNdIENvbnRhaW5zIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0ICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dH0gW21QYXJhbWV0ZXJzLmNvbnRleHRzXSBNYW5kYXRvcnkgZm9yIGEgYm91bmQgYWN0aW9uOiBFaXRoZXIgb25lIGNvbnRleHQgb3IgYW4gYXJyYXkgd2l0aCBjb250ZXh0cyBmb3Igd2hpY2ggdGhlIGFjdGlvbiBpcyB0byBiZSBjYWxsZWRcblx0ICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFNb2RlbH0gW21QYXJhbWV0ZXJzLm1vZGVsXSBNYW5kYXRvcnkgZm9yIGFuIHVuYm91bmQgYWN0aW9uOiBBbiBpbnN0YW5jZSBvZiBhbiBPRGF0YSBWNCBtb2RlbFxuXHQgKiBAcGFyYW0ge3N0cmluZ30gW21QYXJhbWV0ZXJzLmludm9jYXRpb25Hcm91cGluZ10gTW9kZSBob3cgYWN0aW9ucyBhcmUgdG8gYmUgY2FsbGVkOiAnQ2hhbmdlU2V0JyB0byBwdXQgYWxsIGFjdGlvbiBjYWxscyBpbnRvIG9uZSBjaGFuZ2VzZXQsICdJc29sYXRlZCcgdG8gcHV0IHRoZW0gaW50byBzZXBhcmF0ZSBjaGFuZ2VzZXRzXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBbbVBhcmFtZXRlcnMubGFiZWxdIEEgaHVtYW4tcmVhZGFibGUgbGFiZWwgZm9yIHRoZSBhY3Rpb25cblx0ICogQHBhcmFtIHtib29sZWFufSBbbVBhcmFtZXRlcnMuYkdldEJvdW5kQ29udGV4dF0gSWYgc3BlY2lmaWVkLCB0aGUgYWN0aW9uIHByb21pc2UgcmV0dXJucyB0aGUgYm91bmQgY29udGV4dFxuXHQgKiBAcGFyYW0ge29iamVjdH0gb1ZpZXcgQ29udGFpbnMgdGhlIG9iamVjdCBvZiB0aGUgY3VycmVudCB2aWV3XG5cdCAqIEBwYXJhbSBtZXNzYWdlSGFuZGxlclxuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX0gUHJvbWlzZSByZXNvbHZlcyB3aXRoIGFuIGFycmF5IG9mIHJlc3BvbnNlIG9iamVjdHMgKFRPRE86IHRvIGJlIGNoYW5nZWQpXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAZmluYWxcblx0ICoqL1xuXHRjYWxsQWN0aW9uKHNBY3Rpb25OYW1lOiBzdHJpbmcsIG1QYXJhbWV0ZXJzOiBhbnksIG9WaWV3OiBWaWV3IHwgbnVsbCwgbWVzc2FnZUhhbmRsZXI6IGFueSkge1xuXHRcdG1QYXJhbWV0ZXJzID0gZ2V0UGFyYW1ldGVycyhtUGFyYW1ldGVycyk7XG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzXG5cdFx0Y29uc3QgdGhhdCA9IHRoaXM7XG5cdFx0bGV0IG9Db250ZXh0LCBvTW9kZWw6IGFueSwgb1Byb21pc2U7XG5cdFx0Y29uc3QgbUJpbmRpbmdQYXJhbWV0ZXJzID0gbVBhcmFtZXRlcnMuYmluZGluZ1BhcmFtZXRlcnM7XG5cdFx0aWYgKCFzQWN0aW9uTmFtZSkge1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KFwiUHJvdmlkZSBuYW1lIG9mIGFjdGlvbiB0byBiZSBleGVjdXRlZFwiKTtcblx0XHR9XG5cdFx0Ly8gYWN0aW9uIGltcG9ydHMgYXJlIG5vdCBkaXJlY3RseSBvYnRhaW5lZCBmcm9tIHRoZSBtZXRhTW9kZWwgYnkgaXQgaXMgcHJlc2VudCBpbnNpZGUgdGhlIGVudGl0eUNvbnRhaW5lclxuXHRcdC8vIGFuZCB0aGUgYWNpb25zIGl0IHJlZmVycyB0byBwcmVzZW50IG91dHNpZGUgdGhlIGVudGl0eWNvbnRhaW5lciwgaGVuY2UgdG8gb2J0YWluIGtpbmQgb2YgdGhlIGFjdGlvblxuXHRcdC8vIHNwbGl0KCkgb24gaXRzIG5hbWUgd2FzIHJlcXVpcmVkXG5cdFx0Y29uc3Qgc05hbWUgPSBzQWN0aW9uTmFtZS5zcGxpdChcIi9cIilbMV07XG5cdFx0c0FjdGlvbk5hbWUgPSBzTmFtZSB8fCBzQWN0aW9uTmFtZTtcblx0XHRvQ29udGV4dCA9IHNOYW1lID8gdW5kZWZpbmVkIDogbVBhcmFtZXRlcnMuY29udGV4dHM7XG5cdFx0Ly9jaGVja2luZyB3aGV0aGVyIHRoZSBjb250ZXh0IGlzIGFuIGFycmF5IHdpdGggbW9yZSB0aGFuIDAgbGVuZ3RoIG9yIG5vdCBhbiBhcnJheShjcmVhdGUgYWN0aW9uKVxuXHRcdGlmIChvQ29udGV4dCAmJiAoKEFycmF5LmlzQXJyYXkob0NvbnRleHQpICYmIG9Db250ZXh0Lmxlbmd0aCkgfHwgIUFycmF5LmlzQXJyYXkob0NvbnRleHQpKSkge1xuXHRcdFx0b0NvbnRleHQgPSBBcnJheS5pc0FycmF5KG9Db250ZXh0KSA/IG9Db250ZXh0WzBdIDogb0NvbnRleHQ7XG5cdFx0XHRvTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpO1xuXHRcdH1cblx0XHRpZiAobVBhcmFtZXRlcnMubW9kZWwpIHtcblx0XHRcdG9Nb2RlbCA9IG1QYXJhbWV0ZXJzLm1vZGVsO1xuXHRcdH1cblx0XHRpZiAoIW9Nb2RlbCkge1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KFwiUGFzcyBhIGNvbnRleHQgZm9yIGEgYm91bmQgYWN0aW9uIG9yIHBhc3MgdGhlIG1vZGVsIGZvciBhbiB1bmJvdW5kIGFjdGlvblwiKTtcblx0XHR9XG5cdFx0Ly8gZ2V0IHRoZSBiaW5kaW5nIHBhcmFtZXRlcnMgJHNlbGVjdCBhbmQgJGV4cGFuZCBmb3IgdGhlIHNpZGUgZWZmZWN0IG9uIHRoaXMgYWN0aW9uXG5cdFx0Ly8gYWxzbyBnYXRoZXIgYWRkaXRpb25hbCBwcm9wZXJ0eSBwYXRocyB0byBiZSByZXF1ZXN0ZWQgc3VjaCBhcyB0ZXh0IGFzc29jaWF0aW9uc1xuXHRcdGNvbnN0IG9BcHBDb21wb25lbnQgPSB0aGF0Ll9nZXRBcHBDb21wb25lbnQoKTtcblx0XHRjb25zdCBtU2lkZUVmZmVjdHNQYXJhbWV0ZXJzID0gb0FwcENvbXBvbmVudC5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKS5nZXRPRGF0YUFjdGlvblNpZGVFZmZlY3RzKHNBY3Rpb25OYW1lLCBvQ29udGV4dCkgfHwge307XG5cdFx0aWYgKG9Db250ZXh0ICYmIG9Nb2RlbCkge1xuXHRcdFx0b1Byb21pc2UgPSBuZXcgUHJvbWlzZTx2b2lkPihmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG5cdFx0XHRcdGxldCBvQXBwbGljYWJsZUNvbnRleHREaWFsb2c6IERpYWxvZztcblx0XHRcdFx0Y29uc3Qgb0NvbnRyb2xsZXIgPSB7XG5cdFx0XHRcdFx0b25DbG9zZTogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0Ly8gVXNlciBjYW5jZWxzIGFjdGlvblxuXHRcdFx0XHRcdFx0b0FwcGxpY2FibGVDb250ZXh0RGlhbG9nLmNsb3NlKCk7XG5cdFx0XHRcdFx0XHRyZXNvbHZlKCk7XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRvbkNvbnRpbnVlOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHQvLyBVc2VycyBjb250aW51ZXMgdGhlIGFjdGlvbiB3aXRoIHRoZSBib3VuZCBjb250ZXh0c1xuXHRcdFx0XHRcdFx0b0FwcGxpY2FibGVDb250ZXh0RGlhbG9nLmNsb3NlKCk7XG5cdFx0XHRcdFx0XHRyZXNvbHZlKG1QYXJhbWV0ZXJzLmFwcGxpY2FibGVDb250ZXh0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH07XG5cdFx0XHRcdGNvbnN0IGZuT3BlbkFuZEZpbGxEaWFsb2cgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0bGV0IG9EaWFsb2dDb250ZW50O1xuXHRcdFx0XHRcdGNvbnN0IG5Ob3RBcHBsaWNhYmxlID0gbVBhcmFtZXRlcnMubm90QXBwbGljYWJsZUNvbnRleHQubGVuZ3RoLFxuXHRcdFx0XHRcdFx0YU5vdEFwcGxpY2FibGVJdGVtcyA9IFtdO1xuXHRcdFx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgbVBhcmFtZXRlcnMubm90QXBwbGljYWJsZUNvbnRleHQubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0XHRcdG9EaWFsb2dDb250ZW50ID0gbVBhcmFtZXRlcnMubm90QXBwbGljYWJsZUNvbnRleHRbaV0uZ2V0T2JqZWN0KCk7XG5cdFx0XHRcdFx0XHRhTm90QXBwbGljYWJsZUl0ZW1zLnB1c2gob0RpYWxvZ0NvbnRlbnQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRjb25zdCBvTm90QXBwbGljYWJsZUl0ZW1zTW9kZWwgPSBuZXcgSlNPTk1vZGVsKGFOb3RBcHBsaWNhYmxlSXRlbXMpO1xuXHRcdFx0XHRcdGNvbnN0IG9Ub3RhbHMgPSBuZXcgSlNPTk1vZGVsKHsgdG90YWw6IG5Ob3RBcHBsaWNhYmxlLCBsYWJlbDogbVBhcmFtZXRlcnMubGFiZWwgfSk7XG5cdFx0XHRcdFx0b0FwcGxpY2FibGVDb250ZXh0RGlhbG9nLnNldE1vZGVsKG9Ob3RBcHBsaWNhYmxlSXRlbXNNb2RlbCwgXCJub3RBcHBsaWNhYmxlXCIpO1xuXHRcdFx0XHRcdG9BcHBsaWNhYmxlQ29udGV4dERpYWxvZy5zZXRNb2RlbChvVG90YWxzLCBcInRvdGFsc1wiKTtcblx0XHRcdFx0XHRvQXBwbGljYWJsZUNvbnRleHREaWFsb2cub3BlbigpO1xuXHRcdFx0XHR9O1xuXHRcdFx0XHRpZiAobVBhcmFtZXRlcnMubm90QXBwbGljYWJsZUNvbnRleHQgJiYgbVBhcmFtZXRlcnMubm90QXBwbGljYWJsZUNvbnRleHQubGVuZ3RoID49IDEpIHtcblx0XHRcdFx0XHQvLyBTaG93IHRoZSBjb250ZXh0cyB0aGF0IGFyZSBub3QgYXBwbGljYWJsZSBhbmQgd2lsbCBub3QgdGhlcmVmb3JlIGJlIHByb2Nlc3NlZFxuXHRcdFx0XHRcdGNvbnN0IHNGcmFnbWVudE5hbWUgPSBcInNhcC5mZS5jb3JlLmNvbnRyb2xzLkFjdGlvblBhcnRpYWxcIjtcblx0XHRcdFx0XHRjb25zdCBvRGlhbG9nRnJhZ21lbnQgPSBYTUxUZW1wbGF0ZVByb2Nlc3Nvci5sb2FkVGVtcGxhdGUoc0ZyYWdtZW50TmFtZSwgXCJmcmFnbWVudFwiKTtcblx0XHRcdFx0XHRjb25zdCBvTWV0YU1vZGVsID0gb01vZGVsLmdldE1ldGFNb2RlbCgpO1xuXHRcdFx0XHRcdGNvbnN0IHNDYW5vbmljYWxQYXRoID0gbVBhcmFtZXRlcnMuY29udGV4dHNbMF0uZ2V0Q2Fub25pY2FsUGF0aCgpO1xuXHRcdFx0XHRcdGNvbnN0IHNFbnRpdHlTZXQgPSBzQ2Fub25pY2FsUGF0aC5zdWJzdHIoMCwgc0Nhbm9uaWNhbFBhdGguaW5kZXhPZihcIihcIikpICsgXCIvXCI7XG5cdFx0XHRcdFx0Y29uc3Qgb0RpYWxvZ0xhYmVsTW9kZWwgPSBuZXcgSlNPTk1vZGVsKHtcblx0XHRcdFx0XHRcdHRpdGxlOiBtUGFyYW1ldGVycy5sYWJlbFxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFByb21pc2UucmVzb2x2ZShcblx0XHRcdFx0XHRcdFhNTFByZXByb2Nlc3Nvci5wcm9jZXNzKFxuXHRcdFx0XHRcdFx0XHRvRGlhbG9nRnJhZ21lbnQsXG5cdFx0XHRcdFx0XHRcdHsgbmFtZTogc0ZyYWdtZW50TmFtZSB9LFxuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0YmluZGluZ0NvbnRleHRzOiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRlbnRpdHlUeXBlOiBvTWV0YU1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KHNFbnRpdHlTZXQpLFxuXHRcdFx0XHRcdFx0XHRcdFx0bGFiZWw6IG9EaWFsb2dMYWJlbE1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KFwiL1wiKVxuXHRcdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdFx0bW9kZWxzOiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRlbnRpdHlUeXBlOiBvTWV0YU1vZGVsLFxuXHRcdFx0XHRcdFx0XHRcdFx0bWV0YU1vZGVsOiBvTWV0YU1vZGVsLFxuXHRcdFx0XHRcdFx0XHRcdFx0bGFiZWw6IG9EaWFsb2dMYWJlbE1vZGVsXG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0LnRoZW4oZnVuY3Rpb24gKG9GcmFnbWVudDogYW55KSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBGcmFnbWVudC5sb2FkKHsgZGVmaW5pdGlvbjogb0ZyYWdtZW50LCBjb250cm9sbGVyOiBvQ29udHJvbGxlciB9KTtcblx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHQudGhlbihmdW5jdGlvbiAob1BvcG92ZXI6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRvQXBwbGljYWJsZUNvbnRleHREaWFsb2cgPSBvUG9wb3Zlcjtcblx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMucGFyZW50Q29udHJvbC5hZGREZXBlbmRlbnQob1BvcG92ZXIpO1xuXHRcdFx0XHRcdFx0XHRmbk9wZW5BbmRGaWxsRGlhbG9nKCk7XG5cdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0LmNhdGNoKHJlamVjdCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cmVzb2x2ZShtUGFyYW1ldGVycy5jb250ZXh0cyk7XG5cdFx0XHRcdH1cblx0XHRcdH0pLnRoZW4oZnVuY3Rpb24gKGNvbnRleHRUb1Byb2Nlc3M6IGFueSkge1xuXHRcdFx0XHRpZiAoY29udGV4dFRvUHJvY2Vzcykge1xuXHRcdFx0XHRcdHJldHVybiBvcGVyYXRpb25zLmNhbGxCb3VuZEFjdGlvbihzQWN0aW9uTmFtZSwgY29udGV4dFRvUHJvY2Vzcywgb01vZGVsLCBvQXBwQ29tcG9uZW50LCB7XG5cdFx0XHRcdFx0XHRpbnZvY2F0aW9uR3JvdXBpbmc6IG1QYXJhbWV0ZXJzLmludm9jYXRpb25Hcm91cGluZyxcblx0XHRcdFx0XHRcdGxhYmVsOiBtUGFyYW1ldGVycy5sYWJlbCxcblx0XHRcdFx0XHRcdHNob3dBY3Rpb25QYXJhbWV0ZXJEaWFsb2c6IHRydWUsXG5cdFx0XHRcdFx0XHRtQmluZGluZ1BhcmFtZXRlcnM6IG1CaW5kaW5nUGFyYW1ldGVycyxcblx0XHRcdFx0XHRcdGVudGl0eVNldE5hbWU6IG1QYXJhbWV0ZXJzLmVudGl0eVNldE5hbWUsXG5cdFx0XHRcdFx0XHRhZGRpdGlvbmFsU2lkZUVmZmVjdDogbVNpZGVFZmZlY3RzUGFyYW1ldGVycyxcblx0XHRcdFx0XHRcdG9uU3VibWl0dGVkOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdG1lc3NhZ2VIYW5kbGVyLnJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcygpO1xuXHRcdFx0XHRcdFx0XHRCdXN5TG9ja2VyLmxvY2sodGhhdC5vTG9ja09iamVjdCk7XG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0b25SZXNwb25zZTogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRCdXN5TG9ja2VyLnVubG9jayh0aGF0Lm9Mb2NrT2JqZWN0KTtcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRwYXJlbnRDb250cm9sOiBtUGFyYW1ldGVycy5wYXJlbnRDb250cm9sLFxuXHRcdFx0XHRcdFx0Y29udHJvbElkOiBtUGFyYW1ldGVycy5jb250cm9sSWQsXG5cdFx0XHRcdFx0XHRpbnRlcm5hbE1vZGVsQ29udGV4dDogbVBhcmFtZXRlcnMuaW50ZXJuYWxNb2RlbENvbnRleHQsXG5cdFx0XHRcdFx0XHRvcGVyYXRpb25BdmFpbGFibGVNYXA6IG1QYXJhbWV0ZXJzLm9wZXJhdGlvbkF2YWlsYWJsZU1hcCxcblx0XHRcdFx0XHRcdGJJc0NyZWF0ZUFjdGlvbjogbVBhcmFtZXRlcnMuYklzQ3JlYXRlQWN0aW9uLFxuXHRcdFx0XHRcdFx0YkdldEJvdW5kQ29udGV4dDogbVBhcmFtZXRlcnMuYkdldEJvdW5kQ29udGV4dCxcblx0XHRcdFx0XHRcdGJPYmplY3RQYWdlOiBtUGFyYW1ldGVycy5iT2JqZWN0UGFnZSxcblx0XHRcdFx0XHRcdG1lc3NhZ2VIYW5kbGVyOiBtZXNzYWdlSGFuZGxlcixcblx0XHRcdFx0XHRcdGRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbjogbVBhcmFtZXRlcnMuZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBUT0RPOiBjb25maXJtIGlmIGFjdGlvbiBpbXBvcnQgbmVlZHMgc2lkZSBlZmZlY3RzLlxuXHRcdFx0b1Byb21pc2UgPSBvcGVyYXRpb25zLmNhbGxBY3Rpb25JbXBvcnQoc0FjdGlvbk5hbWUsIG9Nb2RlbCwgb0FwcENvbXBvbmVudCwge1xuXHRcdFx0XHRsYWJlbDogbVBhcmFtZXRlcnMubGFiZWwsXG5cdFx0XHRcdHNob3dBY3Rpb25QYXJhbWV0ZXJEaWFsb2c6IHRydWUsXG5cdFx0XHRcdGJpbmRpbmdQYXJhbWV0ZXJzOiBtQmluZGluZ1BhcmFtZXRlcnMsXG5cdFx0XHRcdGVudGl0eVNldE5hbWU6IG1QYXJhbWV0ZXJzLmVudGl0eVNldE5hbWUsXG5cdFx0XHRcdG9uU3VibWl0dGVkOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0QnVzeUxvY2tlci5sb2NrKHRoYXQub0xvY2tPYmplY3QpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRvblJlc3BvbnNlOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0QnVzeUxvY2tlci51bmxvY2sodGhhdC5vTG9ja09iamVjdCk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHBhcmVudENvbnRyb2w6IG1QYXJhbWV0ZXJzLnBhcmVudENvbnRyb2wsXG5cdFx0XHRcdGludGVybmFsTW9kZWxDb250ZXh0OiBtUGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dCxcblx0XHRcdFx0b3BlcmF0aW9uQXZhaWxhYmxlTWFwOiBtUGFyYW1ldGVycy5vcGVyYXRpb25BdmFpbGFibGVNYXAsXG5cdFx0XHRcdG1lc3NhZ2VIYW5kbGVyOiBtZXNzYWdlSGFuZGxlcixcblx0XHRcdFx0Yk9iamVjdFBhZ2U6IG1QYXJhbWV0ZXJzLmJPYmplY3RQYWdlXG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0cmV0dXJuIG9Qcm9taXNlXG5cdFx0XHQudGhlbihmdW5jdGlvbiAob1Jlc3VsdDogYW55KSB7XG5cdFx0XHRcdC8vIFN1Y2NlZWRlZFxuXHRcdFx0XHRyZXR1cm4gdGhhdC5faGFuZGxlQWN0aW9uUmVzcG9uc2UobWVzc2FnZUhhbmRsZXIsIG1QYXJhbWV0ZXJzLCBzQWN0aW9uTmFtZSkudGhlbihmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG9SZXN1bHQ7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaChmdW5jdGlvbiAoZXJyOiBhbnkpIHtcblx0XHRcdFx0cmV0dXJuIHRoYXQuX2hhbmRsZUFjdGlvblJlc3BvbnNlKG1lc3NhZ2VIYW5kbGVyLCBtUGFyYW1ldGVycywgc0FjdGlvbk5hbWUpLnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChlcnIpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXHR9XG5cdC8qKlxuXHQgKiBIYW5kbGVzIG1lc3NhZ2VzIGZvciBhY3Rpb24gY2FsbC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIHNhcC5mZS5jb3JlLlRyYW5zYWN0aW9uSGVscGVyI19oYW5kbGVBY3Rpb25SZXNwb25zZVxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuVHJhbnNhY3Rpb25IZWxwZXJcblx0ICogQHBhcmFtIG1lc3NhZ2VIYW5kbGVyXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBtUGFyYW1ldGVycyBQYXJhbWV0ZXJzIHRvIGJlIGNvbnNpZGVyZWQgZm9yIHRoZSBhY3Rpb24uXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzQWN0aW9uTmFtZSBUaGUgbmFtZSBvZiB0aGUgYWN0aW9uIHRvIGJlIGNhbGxlZFxuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX0gUHJvbWlzZSBhZnRlciBtZXNzYWdlIGRpYWxvZyBpcyBvcGVuZWQgaWYgcmVxdWlyZWQuXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAZmluYWxcblx0ICovXG5cdF9oYW5kbGVBY3Rpb25SZXNwb25zZShtZXNzYWdlSGFuZGxlcjogYW55LCBtUGFyYW1ldGVyczogYW55LCBzQWN0aW9uTmFtZTogc3RyaW5nKSB7XG5cdFx0Y29uc3QgYVRyYW5zaWVudE1lc3NhZ2VzID0gbWVzc2FnZUhhbmRsaW5nLmdldE1lc3NhZ2VzKHRydWUsIHRydWUpO1xuXHRcdGlmIChhVHJhbnNpZW50TWVzc2FnZXMubGVuZ3RoID4gMCAmJiBtUGFyYW1ldGVycyAmJiBtUGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dCkge1xuXHRcdFx0bVBhcmFtZXRlcnMuaW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJzQWN0aW9uTmFtZVwiLCBtUGFyYW1ldGVycy5sYWJlbCA/IG1QYXJhbWV0ZXJzLmxhYmVsIDogc0FjdGlvbk5hbWUpO1xuXHRcdH1cblx0XHRyZXR1cm4gbWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VzKCk7XG5cdH1cblx0LyoqXG5cdCAqIEhhbmRsZXMgdmFsaWRhdGlvbiBlcnJvcnMgZm9yIHRoZSAnZGlzY2FyZCcgYWN0aW9uLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgc2FwLmZlLmNvcmUuVHJhbnNhY3Rpb25IZWxwZXIjaGFuZGxlVmFsaWRhdGlvbkVycm9yXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5UcmFuc2FjdGlvbkhlbHBlclxuXHQgKiBAc3RhdGljXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAZmluYWxcblx0ICovXG5cdGhhbmRsZVZhbGlkYXRpb25FcnJvcigpIHtcblx0XHRjb25zdCBvTWVzc2FnZU1hbmFnZXIgPSBDb3JlLmdldE1lc3NhZ2VNYW5hZ2VyKCksXG5cdFx0XHRlcnJvclRvUmVtb3ZlID0gb01lc3NhZ2VNYW5hZ2VyXG5cdFx0XHRcdC5nZXRNZXNzYWdlTW9kZWwoKVxuXHRcdFx0XHQuZ2V0RGF0YSgpXG5cdFx0XHRcdC5maWx0ZXIoZnVuY3Rpb24gKGVycm9yOiBhbnkpIHtcblx0XHRcdFx0XHQvLyBvbmx5IG5lZWRzIHRvIGhhbmRsZSB2YWxpZGF0aW9uIG1lc3NhZ2VzLCB0ZWNobmljYWwgYW5kIHBlcnNpc3RlbnQgZXJyb3JzIG5lZWRzIG5vdCB0byBiZSBjaGVja2VkIGhlcmUuXG5cdFx0XHRcdFx0aWYgKGVycm9yLnZhbGlkYXRpb24pIHtcblx0XHRcdFx0XHRcdHJldHVybiBlcnJvcjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdG9NZXNzYWdlTWFuYWdlci5yZW1vdmVNZXNzYWdlcyhlcnJvclRvUmVtb3ZlKTtcblx0fVxuXHQvKipcblx0ICogU2hvd3MgYSBwb3BvdmVyIGlmIGl0IG5lZWRzIHRvIGJlIHNob3duLlxuXHQgKiBUT0RPOiBQb3BvdmVyIGlzIHNob3duIGlmIHVzZXIgaGFzIG1vZGlmaWVkIGFueSBkYXRhLlxuXHQgKiBUT0RPOiBQb3BvdmVyIGlzIHNob3duIGlmIHRoZXJlJ3MgYSBkaWZmZXJlbmNlIGZyb20gZHJhZnQgYWRtaW4gZGF0YS5cblx0ICogQHN0YXRpY1xuXHQgKiBAbmFtZSBzYXAuZmUuY29yZS5UcmFuc2FjdGlvbkhlbHBlci5fc2hvd0Rpc2NhcmRQb3BvdmVyXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5UcmFuc2FjdGlvbkhlbHBlclxuXHQgKiBAcGFyYW0ge3NhcC51aS5jb3JlLkNvbnRyb2x9IG9DYW5jZWxCdXR0b24gVGhlIGNvbnRyb2wgd2hpY2ggd2lsbCBvcGVuIHRoZSBwb3BvdmVyXG5cdCAqIEBwYXJhbSBiSXNNb2RpZmllZFxuXHQgKiBAcGFyYW0gb1Jlc291cmNlQnVuZGxlXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBQcm9taXNlIHJlc29sdmVzIGlmIHVzZXIgY29uZmlybXMgZGlzY2FyZCwgcmVqZWN0cyBpZiBvdGhlcndpc2UsIHJlamVjdHMgaWYgbm8gY29udHJvbCBwYXNzZWQgdG8gb3BlbiBwb3BvdmVyXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAZmluYWxcblx0ICovXG5cdF9zaG93RGlzY2FyZFBvcG92ZXIob0NhbmNlbEJ1dHRvbjogYW55LCBiSXNNb2RpZmllZDogYW55LCBvUmVzb3VyY2VCdW5kbGU6IGFueSkge1xuXHRcdC8vIFRPRE86IEltcGxlbWVudCB0aGlzIHBvcG92ZXIgYXMgYSBmcmFnbWVudCBhcyBpbiB2Mj8/XG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzXG5cdFx0Y29uc3QgdGhhdCA9IHRoaXM7XG5cdFx0dGhhdC5fYkNvbnRpbnVlRGlzY2FyZCA9IGZhbHNlO1xuXHRcdC8vIHRvIGJlIGltcGxlbWVudGVkXG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcblx0XHRcdGlmICghb0NhbmNlbEJ1dHRvbikge1xuXHRcdFx0XHRyZWplY3QoXCJDYW5jZWwgYnV0dG9uIG5vdCBmb3VuZFwiKTtcblx0XHRcdH1cblx0XHRcdC8vU2hvdyBwb3BvdmVyIG9ubHkgd2hlbiBkYXRhIGlzIGNoYW5nZWQuXG5cdFx0XHRpZiAoYklzTW9kaWZpZWQpIHtcblx0XHRcdFx0Y29uc3QgZm5PbkFmdGVyRGlzY2FyZCA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRvQ2FuY2VsQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7XG5cdFx0XHRcdFx0aWYgKHRoYXQuX2JDb250aW51ZURpc2NhcmQpIHtcblx0XHRcdFx0XHRcdHJlc29sdmUoKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0cmVqZWN0KFwiRGlzY2FyZCBvcGVyYXRpb24gd2FzIHJlamVjdGVkLiBEb2N1bWVudCBoYXMgbm90IGJlZW4gZGlzY2FyZGVkXCIpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHR0aGF0Ll9vUG9wb3Zlci5kZXRhY2hBZnRlckNsb3NlKGZuT25BZnRlckRpc2NhcmQpO1xuXHRcdFx0XHR9O1xuXHRcdFx0XHRpZiAoIXRoYXQuX29Qb3BvdmVyKSB7XG5cdFx0XHRcdFx0Y29uc3Qgb1RleHQgPSBuZXcgVGV4dCh7XG5cdFx0XHRcdFx0XHRcdC8vVGhpcyB0ZXh0IGlzIHRoZSBzYW1lIGFzIExSIHYyLlxuXHRcdFx0XHRcdFx0XHQvL1RPRE86IERpc3BsYXkgbWVzc2FnZSBwcm92aWRlZCBieSBhcHAgZGV2ZWxvcGVyPz8/XG5cdFx0XHRcdFx0XHRcdHRleHQ6IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfRFJBRlRfRElTQ0FSRF9NRVNTQUdFXCIsIG9SZXNvdXJjZUJ1bmRsZSlcblx0XHRcdFx0XHRcdH0pLFxuXHRcdFx0XHRcdFx0b0J1dHRvbiA9IG5ldyBCdXR0b24oe1xuXHRcdFx0XHRcdFx0XHR0ZXh0OiBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0RSQUZUX0RJU0NBUkRfQlVUVE9OXCIsIG9SZXNvdXJjZUJ1bmRsZSksXG5cdFx0XHRcdFx0XHRcdHdpZHRoOiBcIjEwMCVcIixcblx0XHRcdFx0XHRcdFx0cHJlc3M6IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0XHR0aGF0LmhhbmRsZVZhbGlkYXRpb25FcnJvcigpO1xuXHRcdFx0XHRcdFx0XHRcdHRoYXQuX2JDb250aW51ZURpc2NhcmQgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHRcdHRoYXQuX29Qb3BvdmVyLmNsb3NlKCk7XG5cdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdGFyaWFMYWJlbGxlZEJ5OiBvVGV4dFxuXHRcdFx0XHRcdFx0fSBhcyBhbnkpO1xuXHRcdFx0XHRcdHRoYXQuX29Qb3BvdmVyID0gbmV3IFBvcG92ZXIoe1xuXHRcdFx0XHRcdFx0c2hvd0hlYWRlcjogZmFsc2UsXG5cdFx0XHRcdFx0XHRwbGFjZW1lbnQ6IFwiVG9wXCIsXG5cdFx0XHRcdFx0XHRjb250ZW50OiBbXG5cdFx0XHRcdFx0XHRcdG5ldyBWQm94KHtcblx0XHRcdFx0XHRcdFx0XHRpdGVtczogW29UZXh0LCBvQnV0dG9uXVxuXHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XSxcblx0XHRcdFx0XHRcdGJlZm9yZU9wZW46IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0Ly8gbWFrZSBzdXJlIHRvIE5PVCB0cmlnZ2VyIG11bHRpcGxlIGNhbmNlbCBmbG93c1xuXHRcdFx0XHRcdFx0XHRvQ2FuY2VsQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpO1xuXHRcdFx0XHRcdFx0XHR0aGF0Ll9vUG9wb3Zlci5zZXRJbml0aWFsRm9jdXMob0J1dHRvbik7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0dGhhdC5fb1BvcG92ZXIuYWRkU3R5bGVDbGFzcyhcInNhcFVpQ29udGVudFBhZGRpbmdcIik7XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhhdC5fb1BvcG92ZXIuYXR0YWNoQWZ0ZXJDbG9zZShmbk9uQWZ0ZXJEaXNjYXJkKTtcblx0XHRcdFx0dGhhdC5fb1BvcG92ZXIub3BlbkJ5KG9DYW5jZWxCdXR0b24sIGZhbHNlKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRoYXQuaGFuZGxlVmFsaWRhdGlvbkVycm9yKCk7XG5cdFx0XHRcdHJlc29sdmUoKTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXHQvKipcblx0ICogU2V0cyB0aGUgZG9jdW1lbnQgdG8gbW9kaWZpZWQgc3RhdGUgb24gcGF0Y2ggZXZlbnQuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAc3RhdGljXG5cdCAqIEBuYW1lIHNhcC5mZS5jb3JlLlRyYW5zYWN0aW9uSGVscGVyLmhhbmRsZURvY3VtZW50TW9kaWZpY2F0aW9uc1xuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuVHJhbnNhY3Rpb25IZWxwZXJcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0aGFuZGxlRG9jdW1lbnRNb2RpZmljYXRpb25zKCkge1xuXHRcdHRoaXMuX2JJc01vZGlmaWVkID0gdHJ1ZTtcblx0fVxuXHQvKipcblx0ICogUmV0cmlldmVzIHRoZSBvd25lciBjb21wb25lbnQuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAc3RhdGljXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBuYW1lIHNhcC5mZS5jb3JlLlRyYW5zYWN0aW9uSGVscGVyLl9nZXRPd25lckNvbXBvbmVudFxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuVHJhbnNhY3Rpb25IZWxwZXJcblx0ICogQHJldHVybnMge3NhcC5mZS5jb3JlLkFwcENvbXBvbmVudH0gVGhlIGFwcCBjb21wb25lbnRcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBmaW5hbFxuXHQgKiovXG5cdF9nZXRBcHBDb21wb25lbnQoKSB7XG5cdFx0cmV0dXJuIHRoaXMuX29BcHBDb21wb25lbnQ7XG5cdH1cblxuXHRfb25GaWVsZENoYW5nZShvRXZlbnQ6IGFueSwgb0NyZWF0ZUJ1dHRvbjogYW55LCBtZXNzYWdlSGFuZGxlcjogYW55LCBmblZhbGlkYXRlUmVxdWlyZWRQcm9wZXJ0aWVzOiBGdW5jdGlvbikge1xuXHRcdG1lc3NhZ2VIYW5kbGVyLnJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcygpO1xuXHRcdGNvbnN0IG9GaWVsZCA9IG9FdmVudC5nZXRTb3VyY2UoKTtcblx0XHRjb25zdCBvRmllbGRQcm9taXNlID0gb0V2ZW50LmdldFBhcmFtZXRlcihcInByb21pc2VcIik7XG5cdFx0aWYgKG9GaWVsZFByb21pc2UpIHtcblx0XHRcdHJldHVybiBvRmllbGRQcm9taXNlXG5cdFx0XHRcdC50aGVuKGZ1bmN0aW9uICh2YWx1ZTogYW55KSB7XG5cdFx0XHRcdFx0Ly8gU2V0dGluZyB2YWx1ZSBvZiBmaWVsZCBhcyAnJyBpbiBjYXNlIG9mIHZhbHVlIGhlbHAgYW5kIHZhbGlkYXRpbmcgb3RoZXIgZmllbGRzXG5cdFx0XHRcdFx0b0ZpZWxkLnNldFZhbHVlKHZhbHVlKTtcblx0XHRcdFx0XHRmblZhbGlkYXRlUmVxdWlyZWRQcm9wZXJ0aWVzKCk7XG5cdFx0XHRcdFx0cmV0dXJuIG9GaWVsZC5nZXRWYWx1ZSgpO1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKHZhbHVlOiBhbnkpIHtcblx0XHRcdFx0XHRpZiAodmFsdWUgIT09IFwiXCIpIHtcblx0XHRcdFx0XHRcdC8vZGlzYWJsaW5nIHRoZSBjb250aW51ZSBidXR0b24gaW4gY2FzZSBvZiBpbnZhbGlkIHZhbHVlIGluIGZpZWxkXG5cdFx0XHRcdFx0XHRvQ3JlYXRlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHQvLyB2YWxpZGF0aW5nIGFsbCB0aGUgZmllbGRzIGluIGNhc2Ugb2YgZW1wdHkgdmFsdWUgaW4gZmllbGRcblx0XHRcdFx0XHRcdG9GaWVsZC5zZXRWYWx1ZSh2YWx1ZSk7XG5cdFx0XHRcdFx0XHRmblZhbGlkYXRlUmVxdWlyZWRQcm9wZXJ0aWVzKCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHR9XG5cdH1cblxuXHRfbGF1bmNoRGlhbG9nV2l0aEtleUZpZWxkcyhcblx0XHRvTGlzdEJpbmRpbmc6IGFueSxcblx0XHRvVHJhbnNpZW50TGlzdEJpbmRpbmc6IGFueSxcblx0XHRvVHJhbnNpZW50Q29udGV4dDogYW55LFxuXHRcdG1GaWVsZHM6IGFueSxcblx0XHRvTW9kZWw6IGFueSxcblx0XHRtUGFyYW1ldGVyczogYW55LFxuXHRcdG1lc3NhZ2VIYW5kbGVyOiBhbnlcblx0KSB7XG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzXG5cdFx0Y29uc3QgdGhhdCA9IHRoaXM7XG5cdFx0bGV0IG9EaWFsb2c6IERpYWxvZztcblx0XHRjb25zdCBvUGFyZW50Q29udHJvbCA9IG1QYXJhbWV0ZXJzLnBhcmVudENvbnRyb2wsXG5cdFx0XHRiU3VjY2VzcyA9IGZhbHNlO1xuXHRcdHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZTogKHZhbHVlOiBhbnkpID0+IHZvaWQsIHJlamVjdDogKHJlYXNvbj86IGFueSkgPT4gdm9pZCkge1xuXHRcdFx0Y29uc3Qgc0ZyYWdtZW50TmFtZSA9IFwic2FwL2ZlL2NvcmUvY29udHJvbHMvTm9uQ29tcHV0ZWRWaXNpYmxlS2V5RmllbGRzRGlhbG9nXCI7XG5cdFx0XHRjb25zdCBvRnJhZ21lbnQgPSBYTUxUZW1wbGF0ZVByb2Nlc3Nvci5sb2FkVGVtcGxhdGUoc0ZyYWdtZW50TmFtZSwgXCJmcmFnbWVudFwiKSxcblx0XHRcdFx0b1Jlc291cmNlQnVuZGxlID0gb1BhcmVudENvbnRyb2wuZ2V0Q29udHJvbGxlcigpLm9SZXNvdXJjZUJ1bmRsZSxcblx0XHRcdFx0b01ldGFNb2RlbCA9IG9Nb2RlbC5nZXRNZXRhTW9kZWwoKSxcblx0XHRcdFx0YUltbXV0YWJsZUZpZWxkczogYW55W10gPSBbXSxcblx0XHRcdFx0b0FwcENvbXBvbmVudCA9IHRoYXQuX2dldEFwcENvbXBvbmVudCgpLFxuXHRcdFx0XHRzUGF0aCA9IG9MaXN0QmluZGluZy5pc1JlbGF0aXZlKCkgPyBvTGlzdEJpbmRpbmcuZ2V0UmVzb2x2ZWRQYXRoKCkgOiBvTGlzdEJpbmRpbmcuZ2V0UGF0aCgpLFxuXHRcdFx0XHRvRW50aXR5U2V0Q29udGV4dCA9IG9NZXRhTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoc1BhdGgpLFxuXHRcdFx0XHRzTWV0YVBhdGggPSBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKHNQYXRoKTtcblx0XHRcdGZvciAoY29uc3QgaSBpbiBtRmllbGRzKSB7XG5cdFx0XHRcdGFJbW11dGFibGVGaWVsZHMucHVzaChvTWV0YU1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KHNNZXRhUGF0aCArIFwiL1wiICsgbUZpZWxkc1tpXSkpO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3Qgb0ltbXV0YWJsZUN0eE1vZGVsID0gbmV3IEpTT05Nb2RlbChhSW1tdXRhYmxlRmllbGRzKTtcblx0XHRcdGNvbnN0IG9JbW11dGFibGVDdHggPSBvSW1tdXRhYmxlQ3R4TW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoXCIvXCIpIGFzIENvbnRleHQ7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFxuXHRcdFx0XHRYTUxQcmVwcm9jZXNzb3IucHJvY2Vzcyhcblx0XHRcdFx0XHRvRnJhZ21lbnQsXG5cdFx0XHRcdFx0eyBuYW1lOiBzRnJhZ21lbnROYW1lIH0sXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0YmluZGluZ0NvbnRleHRzOiB7XG5cdFx0XHRcdFx0XHRcdGVudGl0eVNldDogb0VudGl0eVNldENvbnRleHQsXG5cdFx0XHRcdFx0XHRcdGZpZWxkczogb0ltbXV0YWJsZUN0eFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdG1vZGVsczoge1xuXHRcdFx0XHRcdFx0XHRlbnRpdHlTZXQ6IG9FbnRpdHlTZXRDb250ZXh0LmdldE1vZGVsKCksXG5cdFx0XHRcdFx0XHRcdGZpZWxkczogb0ltbXV0YWJsZUN0eC5nZXRNb2RlbCgpLFxuXHRcdFx0XHRcdFx0XHRtZXRhTW9kZWw6IG9NZXRhTW9kZWxcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdClcblx0XHRcdCkudGhlbihmdW5jdGlvbiAob0ZyYWdtZW50OiBhbnkpIHtcblx0XHRcdFx0bGV0IGFGb3JtRWxlbWVudHM6IGFueVtdID0gW107XG5cdFx0XHRcdGNvbnN0IG1GaWVsZFZhbHVlTWFwOiBhbnkgPSB7fTtcblx0XHRcdFx0bGV0IG9DcmVhdGVCdXR0b246IEJ1dHRvbjtcblx0XHRcdFx0Y29uc3QgdmFsaWRhdGVSZXF1aXJlZFByb3BlcnRpZXMgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0cmV0dXJuIFByb21pc2UuYWxsKFxuXHRcdFx0XHRcdFx0YUZvcm1FbGVtZW50c1xuXHRcdFx0XHRcdFx0XHQubWFwKGZ1bmN0aW9uIChvRm9ybUVsZW1lbnQ6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBvRm9ybUVsZW1lbnQuZ2V0RmllbGRzKClbMF07XG5cdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHRcdC5maWx0ZXIoZnVuY3Rpb24gKG9GaWVsZDogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gVGhlIGNvbnRpbnVlIGJ1dHRvbiBzaG91bGQgcmVtYWluIGRpc2FibGVkIGluIGNhc2Ugb2YgZXJyb3IgaW4gYW55IGZpZWxkIG9mIHRoZSBjcmVhdGUgZGlhbG9nXG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG9GaWVsZC5nZXRSZXF1aXJlZCgpIHx8IChvRmllbGQuZ2V0VmFsdWVTdGF0ZSgpID09PSBWYWx1ZVN0YXRlLkVycm9yICYmIG9GaWVsZC5nZXRWYWx1ZSgpICE9PSBcIlwiKTtcblx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0Lm1hcChmdW5jdGlvbiAob0ZpZWxkOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBzRmllbGRJZCA9IG9GaWVsZC5nZXRJZCgpO1xuXHRcdFx0XHRcdFx0XHRcdGlmIChzRmllbGRJZCBpbiBtRmllbGRWYWx1ZU1hcCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZShtRmllbGRWYWx1ZU1hcFtzRmllbGRJZF0pXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC50aGVuKGZ1bmN0aW9uICh2VmFsdWU6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBvRmllbGQuZ2V0VmFsdWVTdGF0ZSgpID09PSBWYWx1ZVN0YXRlLkVycm9yID8gdW5kZWZpbmVkIDogdlZhbHVlO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gb0ZpZWxkLmdldFZhbHVlU3RhdGUoKSA9PT0gVmFsdWVTdGF0ZS5FcnJvciA/IHVuZGVmaW5lZCA6IG9GaWVsZC5nZXRWYWx1ZSgpO1xuXHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdClcblx0XHRcdFx0XHRcdC50aGVuKGZ1bmN0aW9uIChhUmVzdWx0czogYW55W10pIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIGFSZXN1bHRzLmV2ZXJ5KGZ1bmN0aW9uICh2VmFsdWU6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiB2VmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2VmFsdWUgIT09IG51bGwgJiYgdlZhbHVlICE9PSBcIlwiO1xuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0LnRoZW4oZnVuY3Rpb24gKGJFbmFibGVkOiBib29sZWFuKSB7XG5cdFx0XHRcdFx0XHRcdG9DcmVhdGVCdXR0b24uc2V0RW5hYmxlZChiRW5hYmxlZCk7XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fTtcblx0XHRcdFx0Y29uc3Qgb0NvbnRyb2xsZXIgPSB7XG5cdFx0XHRcdFx0LypcbiAgICBcdFx0XHRcdFx0XHRcdFx0XHRmaXJlZCBvbiBmb2N1cyBvdXQgZnJvbSBmaWVsZCBvciBvbiBzZWxlY3RpbmcgYSB2YWx1ZSBmcm9tIHRoZSB2YWx1ZWhlbHAuXG4gICAgXHRcdFx0XHRcdFx0XHRcdFx0dGhlIGNyZWF0ZSBidXR0b24gaXMgZW5hYmxlZCB3aGVuIGEgdmFsdWUgaXMgYWRkZWQuXG4gICAgXHRcdFx0XHRcdFx0XHRcdFx0bGl2ZUNoYW5nZSBpcyBub3QgZmlyZWQgd2hlbiB2YWx1ZSBpcyBhZGRlZCBmcm9tIHZhbHVlaGVscC5cbiAgICBcdFx0XHRcdFx0XHRcdFx0XHR2YWx1ZSB2YWxpZGF0aW9uIGlzIG5vdCBkb25lIGZvciBjcmVhdGUgYnV0dG9uIGVuYWJsZW1lbnQuXG4gICAgXHRcdFx0XHRcdFx0XHRcdCovXG5cdFx0XHRcdFx0aGFuZGxlQ2hhbmdlOiBmdW5jdGlvbiAob0V2ZW50OiBhbnkpIHtcblx0XHRcdFx0XHRcdGNvbnN0IHNGaWVsZElkID0gb0V2ZW50LmdldFBhcmFtZXRlcihcImlkXCIpO1xuXHRcdFx0XHRcdFx0bUZpZWxkVmFsdWVNYXBbc0ZpZWxkSWRdID0gdGhhdC5fb25GaWVsZENoYW5nZShvRXZlbnQsIG9DcmVhdGVCdXR0b24sIG1lc3NhZ2VIYW5kbGVyLCB2YWxpZGF0ZVJlcXVpcmVkUHJvcGVydGllcyk7XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHQvKlxuICAgIFx0XHRcdFx0XHRcdFx0XHRcdGZpcmVkIG9uIGtleSBwcmVzcy4gdGhlIGNyZWF0ZSBidXR0b24gaXMgZW5hYmxlZCB3aGVuIGEgdmFsdWUgaXMgYWRkZWQuXG4gICAgXHRcdFx0XHRcdFx0XHRcdFx0bGl2ZUNoYW5nZSBpcyBub3QgZmlyZWQgd2hlbiB2YWx1ZSBpcyBhZGRlZCBmcm9tIHZhbHVlaGVscC5cbiAgICBcdFx0XHRcdFx0XHRcdFx0XHR2YWx1ZSB2YWxpZGF0aW9uIGlzIG5vdCBkb25lIGZvciBjcmVhdGUgYnV0dG9uIGVuYWJsZW1lbnQuXG4gICAgXHRcdFx0XHRcdFx0XHRcdCovXG5cdFx0XHRcdFx0aGFuZGxlTGl2ZUNoYW5nZTogZnVuY3Rpb24gKG9FdmVudDogYW55KSB7XG5cdFx0XHRcdFx0XHRjb25zdCBzRmllbGRJZCA9IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJpZFwiKTtcblx0XHRcdFx0XHRcdGNvbnN0IHZWYWx1ZSA9IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJ2YWx1ZVwiKTtcblx0XHRcdFx0XHRcdG1GaWVsZFZhbHVlTWFwW3NGaWVsZElkXSA9IHZWYWx1ZTtcblx0XHRcdFx0XHRcdHZhbGlkYXRlUmVxdWlyZWRQcm9wZXJ0aWVzKCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9O1xuXHRcdFx0XHRyZXR1cm4gRnJhZ21lbnQubG9hZCh7XG5cdFx0XHRcdFx0ZGVmaW5pdGlvbjogb0ZyYWdtZW50LFxuXHRcdFx0XHRcdGNvbnRyb2xsZXI6IG9Db250cm9sbGVyXG5cdFx0XHRcdH0pLnRoZW4oZnVuY3Rpb24gKG9EaWFsb2dDb250ZW50OiBhbnkpIHtcblx0XHRcdFx0XHRvRGlhbG9nID0gbmV3IERpYWxvZyh7XG5cdFx0XHRcdFx0XHR0aXRsZTogQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9TQVBGRV9BQ1RJT05fQ1JFQVRFXCIsIG9SZXNvdXJjZUJ1bmRsZSksXG5cdFx0XHRcdFx0XHRjb250ZW50OiBbb0RpYWxvZ0NvbnRlbnRdLFxuXHRcdFx0XHRcdFx0YmVnaW5CdXR0b246IHtcblx0XHRcdFx0XHRcdFx0dGV4dDogQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9TQVBGRV9BQ1RJT05fQ1JFQVRFX0JVVFRPTlwiLCBvUmVzb3VyY2VCdW5kbGUpLFxuXHRcdFx0XHRcdFx0XHR0eXBlOiBcIkVtcGhhc2l6ZWRcIixcblx0XHRcdFx0XHRcdFx0cHJlc3M6IGZ1bmN0aW9uIChvRXZlbnQ6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IG9DcmVhdGVCdXR0b24gPSBvRXZlbnQuZ2V0U291cmNlKCk7XG5cdFx0XHRcdFx0XHRcdFx0b0NyZWF0ZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTtcblx0XHRcdFx0XHRcdFx0XHRCdXN5TG9ja2VyLmxvY2sob0RpYWxvZyk7XG5cdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMuYklzQ3JlYXRlRGlhbG9nID0gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5hbGwoXG5cdFx0XHRcdFx0XHRcdFx0XHRPYmplY3Qua2V5cyhtRmllbGRWYWx1ZU1hcCkubWFwKGZ1bmN0aW9uIChzS2V5OiBzdHJpbmcpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG1GaWVsZFZhbHVlTWFwW3NLZXldLnRoZW4oZnVuY3Rpb24gKG9WYWx1ZTogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y29uc3Qgb0RpYWxvZ1ZhbHVlOiBhbnkgPSB7fTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvRGlhbG9nVmFsdWVbc0tleV0gPSBvVmFsdWU7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG9EaWFsb2dWYWx1ZTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHRcdFx0XHRcdC50aGVuKGZ1bmN0aW9uIChhVmFsdWVzOiBhbnlbXSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRsZXQgb25CZWZvcmVDcmVhdGVQcm9taXNlO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAobVBhcmFtZXRlcnMuYmVmb3JlQ3JlYXRlQ2FsbEJhY2spIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvbkJlZm9yZUNyZWF0ZVByb21pc2UgPSBtUGFyYW1ldGVycy5iZWZvcmVDcmVhdGVDYWxsQmFjayh7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjb250ZXh0UGF0aDogb0xpc3RCaW5kaW5nICYmIG9MaXN0QmluZGluZy5nZXRQYXRoKCksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjcmVhdGVQYXJhbWV0ZXJzOiBhVmFsdWVzXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0b25CZWZvcmVDcmVhdGVQcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG9uQmVmb3JlQ3JlYXRlUHJvbWlzZTtcblx0XHRcdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHRcdFx0XHQudGhlbihmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IG9Qcm9taXNlID0gdGhhdC5vbkFmdGVyQ3JlYXRlQ29tcGxldGlvbihcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvVHJhbnNpZW50TGlzdEJpbmRpbmcsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0b1RyYW5zaWVudENvbnRleHQsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnNcblx0XHRcdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0b01vZGVsLnN1Ym1pdEJhdGNoKFwic3VibWl0TGF0ZXJcIik7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBvUHJvbWlzZTtcblx0XHRcdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHRcdFx0XHQudGhlbihmdW5jdGlvbiAob1Jlc3BvbnNlOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKCFvUmVzcG9uc2UgfHwgKG9SZXNwb25zZSAmJiBvUmVzcG9uc2UuYktlZXBEaWFsb2dPcGVuICE9PSB0cnVlKSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9EaWFsb2cuc2V0QmluZGluZ0NvbnRleHQobnVsbCBhcyBhbnkpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9EaWFsb2cuY2xvc2UoKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXNvbHZlKG9SZXNwb25zZSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJlamVjdChvRXJyb3IpO1xuXHRcdFx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0XHRcdC5maW5hbGx5KGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0QnVzeUxvY2tlci51bmxvY2sob0RpYWxvZyk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdG9DcmVhdGVCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG1lc3NhZ2VIYW5kbGVyLnNob3dNZXNzYWdlcygpO1xuXHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRlbmRCdXR0b246IHtcblx0XHRcdFx0XHRcdFx0dGV4dDogQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXCJDX0NPTU1PTl9BQ1RJT05fUEFSQU1FVEVSX0RJQUxPR19DQU5DRUxcIiwgb1Jlc291cmNlQnVuZGxlKSxcblx0XHRcdFx0XHRcdFx0cHJlc3M6IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0XHRvRGlhbG9nLmNsb3NlKCk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRhZnRlckNsb3NlOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdC8vIHNob3cgZm9vdGVyIGFzIHBlciBVWCBndWlkZWxpbmVzIHdoZW4gZGlhbG9nIGlzIG5vdCBvcGVuXG5cdFx0XHRcdFx0XHRcdChvRGlhbG9nLmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQpPy5zZXRQcm9wZXJ0eShcImlzQ3JlYXRlRGlhbG9nT3BlblwiLCBmYWxzZSk7XG5cdFx0XHRcdFx0XHRcdG9EaWFsb2cuZGVzdHJveSgpO1xuXHRcdFx0XHRcdFx0XHRpZiAoIWJTdWNjZXNzKSB7XG5cdFx0XHRcdFx0XHRcdFx0cmVqZWN0KHtcblx0XHRcdFx0XHRcdFx0XHRcdGJEZWxldGVUcmFuc2llbnRDb250ZXh0OiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRcdFx0bmF2aWdhdGVCYWNrRnJvbVRyYW5zaWVudFN0YXRlOiB0cnVlXG5cdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGFzIGFueSk7XG5cdFx0XHRcdFx0YUZvcm1FbGVtZW50cyA9IG9EaWFsb2dDb250ZW50XG5cdFx0XHRcdFx0XHQuZ2V0QWdncmVnYXRpb24oXCJmb3JtXCIpXG5cdFx0XHRcdFx0XHQuZ2V0QWdncmVnYXRpb24oXCJmb3JtQ29udGFpbmVyc1wiKVswXVxuXHRcdFx0XHRcdFx0LmdldEFnZ3JlZ2F0aW9uKFwiZm9ybUVsZW1lbnRzXCIpO1xuXHRcdFx0XHRcdGlmIChvUGFyZW50Q29udHJvbCAmJiBvUGFyZW50Q29udHJvbC5hZGREZXBlbmRlbnQpIHtcblx0XHRcdFx0XHRcdC8vIGlmIHRoZXJlIGlzIGEgcGFyZW50IGNvbnRyb2wgc3BlY2lmaWVkIGFkZCB0aGUgZGlhbG9nIGFzIGRlcGVuZGVudFxuXHRcdFx0XHRcdFx0b1BhcmVudENvbnRyb2wuYWRkRGVwZW5kZW50KG9EaWFsb2cpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRvQ3JlYXRlQnV0dG9uID0gb0RpYWxvZy5nZXRCZWdpbkJ1dHRvbigpO1xuXHRcdFx0XHRcdG9EaWFsb2cuc2V0QmluZGluZ0NvbnRleHQob1RyYW5zaWVudENvbnRleHQpO1xuXHRcdFx0XHRcdHJldHVybiBDb21tb25VdGlscy5zZXRVc2VyRGVmYXVsdHMoXG5cdFx0XHRcdFx0XHRvQXBwQ29tcG9uZW50LFxuXHRcdFx0XHRcdFx0YUltbXV0YWJsZUZpZWxkcyxcblx0XHRcdFx0XHRcdG9UcmFuc2llbnRDb250ZXh0LFxuXHRcdFx0XHRcdFx0ZmFsc2UsXG5cdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5jcmVhdGVBY3Rpb24sXG5cdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5kYXRhXG5cdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0LnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHR2YWxpZGF0ZVJlcXVpcmVkUHJvcGVydGllcygpO1xuXHRcdFx0XHRcdFx0XHQvLyBmb290ZXIgbXVzdCBub3QgYmUgdmlzaWJsZSB3aGVuIHRoZSBkaWFsb2cgaXMgb3BlbiBhcyBwZXIgVVggZ3VpZGVsaW5lc1xuXHRcdFx0XHRcdFx0XHQob0RpYWxvZy5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0KS5zZXRQcm9wZXJ0eShcImlzQ3JlYXRlRGlhbG9nT3BlblwiLCB0cnVlKTtcblx0XHRcdFx0XHRcdFx0b0RpYWxvZy5vcGVuKCk7XG5cdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gbWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VzKCkudGhlbihmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KG9FcnJvcik7XG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cdFx0fSk7XG5cdH1cblx0b25BZnRlckNyZWF0ZUNvbXBsZXRpb24ob0xpc3RCaW5kaW5nOiBhbnksIG9OZXdEb2N1bWVudENvbnRleHQ6IGFueSwgbVBhcmFtZXRlcnM6IGFueSkge1xuXHRcdGxldCBmblJlc29sdmU6IEZ1bmN0aW9uLCBmblJlamVjdDogRnVuY3Rpb247XG5cdFx0Y29uc3Qgb1Byb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG5cdFx0XHRmblJlc29sdmUgPSByZXNvbHZlO1xuXHRcdFx0Zm5SZWplY3QgPSByZWplY3Q7XG5cdFx0fSk7XG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzXG5cdFx0Y29uc3QgdGhhdCA9IHRoaXM7XG5cdFx0Ly8gV29ya2Fyb3VuZCBzdWdnZXN0ZWQgYnkgT0RhdGEgbW9kZWwgdjQgY29sbGVhZ3Vlc1xuXHRcdGNvbnN0IGZuQ3JlYXRlQ29tcGxldGVkID0gZnVuY3Rpb24gKG9FdmVudDogYW55KSB7XG5cdFx0XHRjb25zdCBvQ29udGV4dCA9IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJjb250ZXh0XCIpLFxuXHRcdFx0XHRiU3VjY2VzcyA9IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJzdWNjZXNzXCIpO1xuXHRcdFx0aWYgKG9Db250ZXh0ID09PSBvTmV3RG9jdW1lbnRDb250ZXh0KSB7XG5cdFx0XHRcdG9MaXN0QmluZGluZy5kZXRhY2hDcmVhdGVDb21wbGV0ZWQoZm5DcmVhdGVDb21wbGV0ZWQsIHRoYXQpO1xuXHRcdFx0XHRpZiAoIWJTdWNjZXNzKSB7XG5cdFx0XHRcdFx0Y29uc3Qgb0Vycm9yOiBhbnkgPSB7IGJEZWxldGVUcmFuc2llbnRDb250ZXh0OiBmYWxzZSB9O1xuXHRcdFx0XHRcdGlmICghbVBhcmFtZXRlcnMua2VlcFRyYW5zaWVudENvbnRleHRPbkZhaWxlZCkge1xuXHRcdFx0XHRcdFx0Ly8gdGhlIGNvbnRleHQgaXMgZGVsZXRlZFxuXG5cdFx0XHRcdFx0XHQvLyB0aGlzIGlzIG5lZWRlZCB0byBhdm9pZCBjb25zb2xlIGVycm9ycyBUTyBiZSBjaGVja2VkIHdpdGggbW9kZWwgY29sbGVhZ3Vlc1xuXHRcdFx0XHRcdFx0b0NvbnRleHRcblx0XHRcdFx0XHRcdFx0LmNyZWF0ZWQoKVxuXHRcdFx0XHRcdFx0XHQudGhlbih1bmRlZmluZWQsIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0XHRMb2cudHJhY2UoXCJ0cmFuc2llbnQgY3JlYXRpb24gY29udGV4dCBkZWxldGVkXCIpO1xuXHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0TG9nLnRyYWNlKFwidHJhbnNpZW50IGNyZWF0aW9uIGNvbnRleHQgZGVsZXRpb24gZXJyb3JcIiwgb0Vycm9yKTtcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRpZiAoIW1QYXJhbWV0ZXJzLmJJc0NyZWF0ZURpYWxvZykge1xuXHRcdFx0XHRcdFx0XHQvLyBpZiBjdXJyZW50IHN0YXRlIGlzIHRyYW5zaWVudCAoLi4uKSwgYnJvd3NlciB3aWxsIGNvbWUgYmFjayB0byBwcmV2aW91cyBzdGF0ZVxuXHRcdFx0XHRcdFx0XHRvRXJyb3IubmF2aWdhdGVCYWNrRnJvbVRyYW5zaWVudFN0YXRlID0gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0b0Vycm9yLmJEZWxldGVUcmFuc2llbnRDb250ZXh0ID0gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0Zm5SZWplY3Qob0Vycm9yKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Zm5SZXNvbHZlKHsgYktlZXBEaWFsb2dPcGVuOiB0cnVlIH0pO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGZuUmVzb2x2ZSgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fTtcblx0XHRvTGlzdEJpbmRpbmcuYXR0YWNoQ3JlYXRlQ29tcGxldGVkKGZuQ3JlYXRlQ29tcGxldGVkLCB0aGlzKTtcblx0XHRyZXR1cm4gb1Byb21pc2U7XG5cdH1cblx0LyoqXG5cdCAqIFJldHJpZXZlcyB0aGUgbmFtZSBvZiB0aGUgTmV3QWN0aW9uIHRvIGJlIGV4ZWN1dGVkLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQHN0YXRpY1xuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAbmFtZSBzYXAuZmUuY29yZS5UcmFuc2FjdGlvbkhlbHBlci5fZ2V0TmV3QWN0aW9uXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5UcmFuc2FjdGlvbkhlbHBlclxuXHQgKiBAcGFyYW0ge29iamVjdH0gb1N0YXJ0dXBQYXJhbWV0ZXJzIFN0YXJ0dXAgcGFyYW1ldGVycyBvZiB0aGUgYXBwbGljYXRpb25cblx0ICogQHBhcmFtIHtzdHJpbmd9IHNDcmVhdGVIYXNoIEhhc2ggdG8gYmUgY2hlY2tlZCBmb3IgYWN0aW9uIHR5cGVcblx0ICogQHBhcmFtIHtvYmplY3R9IG9NZXRhTW9kZWwgVGhlIE1ldGFNb2RlbCB1c2VkIHRvIGNoZWNrIGZvciBOZXdBY3Rpb24gcGFyYW1ldGVyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzTWV0YVBhdGggVGhlIE1ldGFQYXRoXG5cdCAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBuYW1lIG9mIHRoZSBhY3Rpb25cblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBmaW5hbFxuXHQgKiovXG5cdF9nZXROZXdBY3Rpb24ob1N0YXJ0dXBQYXJhbWV0ZXJzOiBhbnksIHNDcmVhdGVIYXNoOiBzdHJpbmcsIG9NZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsLCBzTWV0YVBhdGg6IHN0cmluZykge1xuXHRcdGxldCBzTmV3QWN0aW9uO1xuXG5cdFx0aWYgKG9TdGFydHVwUGFyYW1ldGVycyAmJiBvU3RhcnR1cFBhcmFtZXRlcnMucHJlZmVycmVkTW9kZSAmJiBzQ3JlYXRlSGFzaC5pbmRleE9mKFwiaS1hY3Rpb249Y3JlYXRlV2l0aFwiKSA+IC0xKSB7XG5cdFx0XHRjb25zdCBzUHJlZmVycmVkTW9kZSA9IG9TdGFydHVwUGFyYW1ldGVycy5wcmVmZXJyZWRNb2RlWzBdO1xuXHRcdFx0c05ld0FjdGlvbiA9XG5cdFx0XHRcdHNQcmVmZXJyZWRNb2RlLmluZGV4T2YoXCJjcmVhdGVXaXRoOlwiKSA+IC0xID8gc1ByZWZlcnJlZE1vZGUuc3Vic3RyKHNQcmVmZXJyZWRNb2RlLmxhc3RJbmRleE9mKFwiOlwiKSArIDEpIDogdW5kZWZpbmVkO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRzTmV3QWN0aW9uID1cblx0XHRcdFx0b01ldGFNb2RlbCAmJiBvTWV0YU1vZGVsLmdldE9iamVjdCAhPT0gdW5kZWZpbmVkXG5cdFx0XHRcdFx0PyBvTWV0YU1vZGVsLmdldE9iamVjdChzTWV0YVBhdGggKyBcIkBjb20uc2FwLnZvY2FidWxhcmllcy5TZXNzaW9uLnYxLlN0aWNreVNlc3Npb25TdXBwb3J0ZWQvTmV3QWN0aW9uXCIpIHx8XG5cdFx0XHRcdFx0ICBvTWV0YU1vZGVsLmdldE9iamVjdChzTWV0YVBhdGggKyBcIkBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnRSb290L05ld0FjdGlvblwiKVxuXHRcdFx0XHRcdDogdW5kZWZpbmVkO1xuXHRcdH1cblx0XHRyZXR1cm4gc05ld0FjdGlvbjtcblx0fVxuXHQvKipcblx0ICogUmV0cmlldmVzIHRoZSBsYWJlbCBmb3IgdGhlIHRpdGxlIG9mIGEgc3BlY2lmaWMgY3JlYXRlIGFjdGlvbiBkaWFsb2csIGUuZy4gQ3JlYXRlIFNhbGVzIE9yZGVyIGZyb20gUXVvdGF0aW9uLlxuXHQgKlxuXHQgKiBUaGUgZm9sbG93aW5nIHByaW9yaXR5IGlzIGFwcGxpZWQ6XG5cdCAqIDEuIGxhYmVsIG9mIGxpbmUtaXRlbSBhbm5vdGF0aW9uLlxuXHQgKiAyLiBsYWJlbCBhbm5vdGF0ZWQgaW4gdGhlIGFjdGlvbi5cblx0ICogMy4gXCJDcmVhdGVcIiBhcyBhIGNvbnN0YW50IGZyb20gaTE4bi5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBzdGF0aWNcblx0ICogQHByaXZhdGVcblx0ICogQG5hbWUgc2FwLmZlLmNvcmUuVHJhbnNhY3Rpb25IZWxwZXIuX2dldFNwZWNpZmljQ3JlYXRlQWN0aW9uRGlhbG9nTGFiZWxcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLlRyYW5zYWN0aW9uSGVscGVyXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvTWV0YU1vZGVsIFRoZSBNZXRhTW9kZWwgdXNlZCB0byBjaGVjayBmb3IgdGhlIE5ld0FjdGlvbiBwYXJhbWV0ZXJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNNZXRhUGF0aCBUaGUgTWV0YVBhdGhcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNOZXdBY3Rpb24gQ29udGFpbnMgdGhlIG5hbWUgb2YgdGhlIGFjdGlvbiB0byBiZSBleGVjdXRlZFxuXHQgKiBAcGFyYW0ge29iamVjdH0gb1Jlc291cmNlQnVuZGxlQ29yZSBSZXNvdXJjZUJ1bmRsZSB0byBhY2Nlc3MgdGhlIGRlZmF1bHQgQ3JlYXRlIGxhYmVsXG5cdCAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBsYWJlbCBmb3IgdGhlIENyZWF0ZSBBY3Rpb24gRGlhbG9nXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAZmluYWxcblx0ICoqL1xuXHRfZ2V0U3BlY2lmaWNDcmVhdGVBY3Rpb25EaWFsb2dMYWJlbChcblx0XHRvTWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbCxcblx0XHRzTWV0YVBhdGg6IHN0cmluZyxcblx0XHRzTmV3QWN0aW9uOiBzdHJpbmcsXG5cdFx0b1Jlc291cmNlQnVuZGxlQ29yZTogUmVzb3VyY2VCdW5kbGVcblx0KSB7XG5cdFx0Y29uc3QgZm5HZXRMYWJlbEZyb21MaW5lSXRlbUFubm90YXRpb24gPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRpZiAob01ldGFNb2RlbCAmJiBvTWV0YU1vZGVsLmdldE9iamVjdChzTWV0YVBhdGggKyBcIi9AY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuTGluZUl0ZW1cIikpIHtcblx0XHRcdFx0Y29uc3QgaUxpbmVJdGVtSW5kZXggPSBvTWV0YU1vZGVsXG5cdFx0XHRcdFx0LmdldE9iamVjdChzTWV0YVBhdGggKyBcIi9AY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuTGluZUl0ZW1cIilcblx0XHRcdFx0XHQuZmluZEluZGV4KGZ1bmN0aW9uIChvTGluZUl0ZW06IGFueSkge1xuXHRcdFx0XHRcdFx0Y29uc3QgYUxpbmVJdGVtQWN0aW9uID0gb0xpbmVJdGVtLkFjdGlvbiA/IG9MaW5lSXRlbS5BY3Rpb24uc3BsaXQoXCIoXCIpIDogdW5kZWZpbmVkO1xuXHRcdFx0XHRcdFx0cmV0dXJuIGFMaW5lSXRlbUFjdGlvbiA/IGFMaW5lSXRlbUFjdGlvblswXSA9PT0gc05ld0FjdGlvbiA6IGZhbHNlO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRyZXR1cm4gaUxpbmVJdGVtSW5kZXggPiAtMVxuXHRcdFx0XHRcdD8gb01ldGFNb2RlbC5nZXRPYmplY3Qoc01ldGFQYXRoICsgXCIvQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkxpbmVJdGVtXCIpW2lMaW5lSXRlbUluZGV4XS5MYWJlbFxuXHRcdFx0XHRcdDogdW5kZWZpbmVkO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0cmV0dXJuIChcblx0XHRcdGZuR2V0TGFiZWxGcm9tTGluZUl0ZW1Bbm5vdGF0aW9uKCkgfHxcblx0XHRcdChvTWV0YU1vZGVsICYmIG9NZXRhTW9kZWwuZ2V0T2JqZWN0KHNNZXRhUGF0aCArIFwiL1wiICsgc05ld0FjdGlvbiArIFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5MYWJlbFwiKSkgfHxcblx0XHRcdChvUmVzb3VyY2VCdW5kbGVDb3JlICYmIG9SZXNvdXJjZUJ1bmRsZUNvcmUuZ2V0VGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX1NBUEZFX0FDVElPTl9DUkVBVEVcIikpXG5cdFx0KTtcblx0fVxufVxuXG5leHBvcnQgZGVmYXVsdCBUcmFuc2FjdGlvbkhlbHBlcjtcbiJdfQ==