@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
@@ -2,18 +2,26 @@
2
2
  * SAP UI development toolkit for HTML5 (SAPUI5)
3
3
  * (c) Copyright 2009-2021 SAP SE. All rights reserved
4
4
  */
5
- sap.ui.define(["sap/m/Dialog", "sap/ui/core/XMLTemplateProcessor", "sap/ui/model/json/JSONModel", "sap/ui/core/Fragment", "sap/ui/core/util/XMLPreprocessor", "sap/base/Log", "sap/fe/core/CommonUtils", "sap/m/Button", "../converters/MetaModelConverter", "sap/fe/macros/field/FieldTemplating", "../templating/UIFormatters", "../templating/FieldControlHelper", "sap/fe/core/templating/PropertyHelper"], function (Dialog, XMLTemplateProcessor, JSONModel, Fragment, XMLPreprocessor, Log, CommonUtils, Button, MetaModelConverter, FieldTemplating, UIFormatters, FieldControlHelper, PropertyHelper) {
5
+ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/library", "sap/fe/core/templating/DataModelPathHelper", "sap/fe/core/templating/PropertyHelper", "sap/fe/macros/field/FieldTemplating", "sap/m/Button", "sap/m/Dialog", "sap/m/MessageToast", "sap/ui/core/Core", "sap/ui/core/Fragment", "sap/ui/core/util/XMLPreprocessor", "sap/ui/core/XMLTemplateProcessor", "sap/ui/mdc/enum/EditMode", "sap/ui/model/json/JSONModel", "../controls/Any", "../converters/MetaModelConverter", "../templating/FieldControlHelper", "../templating/UIFormatters"], function (Log, CommonUtils, FELibrary, DataModelPathHelper, PropertyHelper, FieldTemplating, Button, Dialog, MessageToast, Core, Fragment, XMLPreprocessor, XMLTemplateProcessor, EditMode, JSONModel, Any, MetaModelConverter, FieldControlHelper, UIFormatters) {
6
6
  "use strict";
7
7
 
8
- var hasValueHelpWithFixedValues = PropertyHelper.hasValueHelpWithFixedValues;
9
- var isReadOnlyExpression = FieldControlHelper.isReadOnlyExpression;
8
+ var isCollectionField = UIFormatters.isCollectionField;
10
9
  var getRequiredExpression = UIFormatters.getRequiredExpression;
11
- var getEditableExpression = UIFormatters.getEditableExpression;
12
- var getTextBinding = FieldTemplating.getTextBinding;
10
+ var getEditMode = UIFormatters.getEditMode;
11
+ var isReadOnlyExpression = FieldControlHelper.isReadOnlyExpression;
13
12
  var getInvolvedDataModelObjects = MetaModelConverter.getInvolvedDataModelObjects;
14
13
  var convertMetaModelContext = MetaModelConverter.convertMetaModelContext;
14
+ var setEditStyleProperties = FieldTemplating.setEditStyleProperties;
15
+ var getTextBinding = FieldTemplating.getTextBinding;
16
+ var hasValueHelpWithFixedValues = PropertyHelper.hasValueHelpWithFixedValues;
17
+ var enhanceDataModelPath = DataModelPathHelper.enhanceDataModelPath;
18
+
19
+ function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function () {}; return { s: F, n: function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function (e) { throw e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function () { it = it.call(o); }, n: function () { var step = it.next(); normalCompletion = step.done; return step; }, e: function (e) { didErr = true; err = e; }, f: function () { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
20
+
21
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
22
+
23
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
15
24
 
16
- var aValidDataTypes = ["Edm.Boolean", "Edm.Byte", "Edm.Decimal", "Edm.Double", "Edm.Float", "Edm.Guid", "Edm.Int16", "Edm.Int32", "Edm.Int64", "Edm.SByte", "Edm.Single", "Edm.String"];
17
25
  var MassEditHelper = {
18
26
  /**
19
27
  * Initializes the value at final or deepest level path with a blank array.
@@ -57,7 +65,7 @@ sap.ui.define(["sap/m/Dialog", "sap/ui/core/XMLTemplateProcessor", "sap/ui/model
57
65
  * @returns {boolean}
58
66
  */
59
67
  getUniqueValues: function (sValue, index, self) {
60
- if (sValue) {
68
+ if (sValue != undefined && sValue != null) {
61
69
  return self.indexOf(sValue) === index;
62
70
  }
63
71
  },
@@ -111,7 +119,7 @@ sap.ui.define(["sap/m/Dialog", "sap/ui/core/XMLTemplateProcessor", "sap/ui/model
111
119
  } else if (aUniquePropertyValues.length === 0) {
112
120
  return "Empty/" + sDataPropertyPath;
113
121
  } else if (aUniquePropertyValues.length === 1) {
114
- return sDataPropertyPath;
122
+ return sDataPropertyPath + "/" + aUniquePropertyValues[0];
115
123
  }
116
124
  }
117
125
  },
@@ -132,6 +140,47 @@ sap.ui.define(["sap/m/Dialog", "sap/ui/core/XMLTemplateProcessor", "sap/ui/model
132
140
 
133
141
  return hiddenValue;
134
142
  },
143
+ getInputType: function (propertyInfo, dataFieldConverted, oDataModelPath) {
144
+ var editStyleProperties = {};
145
+ var inputType;
146
+
147
+ if (propertyInfo) {
148
+ setEditStyleProperties(editStyleProperties, dataFieldConverted, oDataModelPath, true);
149
+ inputType = (editStyleProperties === null || editStyleProperties === void 0 ? void 0 : editStyleProperties.editStyle) || "";
150
+ }
151
+
152
+ var isValidForMassEdit = inputType && ["DatePicker", "TimePicker", "DateTimePicker", "RatingIndicator"].indexOf(inputType) === -1 && !isCollectionField(oDataModelPath) && !hasValueHelpWithFixedValues(propertyInfo);
153
+ return (isValidForMassEdit || "") && inputType;
154
+ },
155
+ getIsFieldGrp: function (dataFieldConverted) {
156
+ return dataFieldConverted && dataFieldConverted.$Type === "com.sap.vocabularies.UI.v1.DataFieldForAnnotation" && dataFieldConverted.Target && dataFieldConverted.Target.value && dataFieldConverted.Target.value.indexOf("FieldGroup") > -1;
157
+ },
158
+
159
+ /**
160
+ * Get text path for the mass edit field.
161
+ *
162
+ * @param {string} property Property path
163
+ * @param {any} textBinding Text Binding Info
164
+ * @param {string} displayMode Display mode
165
+ * @returns {string | undefined} Text Property Path if it exists
166
+ */
167
+ getTextPath: function (property, textBinding, displayMode) {
168
+ var descriptionPath;
169
+
170
+ if (textBinding && (textBinding.path || textBinding.parameters && textBinding.parameters.length) && property) {
171
+ if (textBinding.path && displayMode === "Description") {
172
+ descriptionPath = textBinding.path;
173
+ } else if (textBinding.parameters) {
174
+ textBinding.parameters.forEach(function (props) {
175
+ if (props.path && props.path !== property) {
176
+ descriptionPath = props.path;
177
+ }
178
+ });
179
+ }
180
+ }
181
+
182
+ return descriptionPath;
183
+ },
135
184
 
136
185
  /**
137
186
  * Initializes a JSON Model for properties of dialog fields [label, visiblity, dataproperty, etc.].
@@ -146,6 +195,7 @@ sap.ui.define(["sap/m/Dialog", "sap/ui/core/XMLTemplateProcessor", "sap/ui/model
146
195
  sCurrentEntitySetName = oTable.data("metaPath"),
147
196
  aTableFields = MassEditHelper.getTableFields(oTable),
148
197
  oEntityTypeContext = oMetaModel.getContext(sCurrentEntitySetName + "/@"),
198
+ oEntitySetContext = oMetaModel.getContext(sCurrentEntitySetName),
149
199
  oDataModelObjectPath = getInvolvedDataModelObjects(oEntityTypeContext);
150
200
  var oDataFieldModel = new JSONModel();
151
201
  var oResult;
@@ -153,20 +203,17 @@ sap.ui.define(["sap/m/Dialog", "sap/ui/core/XMLTemplateProcessor", "sap/ui/model
153
203
  var bValueHelpEnabled;
154
204
  var sUnitPropertyPath;
155
205
  var bValueHelpEnabledForUnit;
156
- var bIsImmutable;
157
- var bIsComputed;
158
- var bChartProperty;
159
206
  var oTextBinding;
160
- var bValidDataType;
161
- var bInValidInputType;
162
207
  aTableFields.forEach(function (oColumnInfo) {
163
208
  var sDataPropertyPath = oColumnInfo.dataProperty;
164
209
 
165
210
  if (sDataPropertyPath) {
211
+ var _oDataFieldConverted$, _oDataFieldConverted$2;
212
+
166
213
  var oPropertyInfo = sDataPropertyPath && oMetaModel.getObject(sCurrentEntitySetName + "/" + sDataPropertyPath + "@");
167
214
  bValueHelpEnabled = sDataPropertyPath && oMetaModel.getObject(sCurrentEntitySetName + "/" + sDataPropertyPath + "@") && oMetaModel.getObject(sCurrentEntitySetName + "/" + sDataPropertyPath + "@")["@com.sap.vocabularies.Common.v1.ValueList"];
168
215
  sUnitPropertyPath = oPropertyInfo && oPropertyInfo["@Org.OData.Measures.V1.Unit"] && oPropertyInfo["@Org.OData.Measures.V1.Unit"].$Path || oPropertyInfo && oPropertyInfo["@Org.OData.Measures.V1.ISOCurrency"] && oPropertyInfo["@Org.OData.Measures.V1.ISOCurrency"].$Path;
169
- sLabelText = oColumnInfo.label || oPropertyInfo && oPropertyInfo["@com.sap.vocabularies.Common.v1.Label"];
216
+ sLabelText = oColumnInfo.label || oPropertyInfo && oPropertyInfo["@com.sap.vocabularies.Common.v1.Label"] || oColumnInfo.dataProperty;
170
217
  bValueHelpEnabledForUnit = sUnitPropertyPath && oMetaModel.getObject(sCurrentEntitySetName + "/" + sUnitPropertyPath + "@") && oMetaModel.getObject(sCurrentEntitySetName + "/" + sUnitPropertyPath + "@")["@com.sap.vocabularies.Common.v1.ValueList"];
171
218
 
172
219
  if (oDataModelObjectPath) {
@@ -181,9 +228,14 @@ sap.ui.define(["sap/m/Dialog", "sap/ui/core/XMLTemplateProcessor", "sap/ui/model
181
228
  oDataFieldConverted = convertMetaModelContext(oFieldContext),
182
229
  oPropertyContext = oMetaModel.getContext(sCurrentEntitySetName + "/" + sDataPropertyPath + "@"),
183
230
  oInterface = oPropertyContext && oPropertyContext.getInterface();
184
- bIsImmutable = oPropertyContext && oPropertyContext.getProperty() && oPropertyContext.getProperty()["@Org.OData.Core.V1.Immutable"];
185
- bIsComputed = oPropertyContext && oPropertyContext.getProperty() && oPropertyContext.getProperty()["@Org.OData.Core.V1.Computed"];
231
+ var oDataModelPath = getInvolvedDataModelObjects(oFieldContext, oEntitySetContext);
232
+
233
+ if ((oDataFieldConverted === null || oDataFieldConverted === void 0 ? void 0 : (_oDataFieldConverted$ = oDataFieldConverted.Value) === null || _oDataFieldConverted$ === void 0 ? void 0 : (_oDataFieldConverted$2 = _oDataFieldConverted$.path) === null || _oDataFieldConverted$2 === void 0 ? void 0 : _oDataFieldConverted$2.length) > 0) {
234
+ oDataModelPath = enhanceDataModelPath(oDataModelPath, sDataPropertyPath);
235
+ }
236
+
186
237
  var bHiddenField = MassEditHelper.getHiddenValueForContexts(oFieldContext && oFieldContext.getObject()["@com.sap.vocabularies.UI.v1.Hidden"], aContexts) || false;
238
+ var isImage = oPropertyInfo && oPropertyInfo["@com.sap.vocabularies.UI.v1.IsImageURL"];
187
239
  oInterface.context = {
188
240
  getModel: function () {
189
241
  return oInterface.getModel();
@@ -192,17 +244,34 @@ sap.ui.define(["sap/m/Dialog", "sap/ui/core/XMLTemplateProcessor", "sap/ui/model
192
244
  return sCurrentEntitySetName + "/" + sDataPropertyPath;
193
245
  }
194
246
  };
195
- oPropertyInfo = oDataFieldConverted && oDataFieldConverted.Value && oDataFieldConverted.Value.$target || oDataFieldConverted && oDataFieldConverted.Target && oDataFieldConverted.Target.$target; // Datafield is not included in the FieldControl calculation, needs to be implemented
247
+ oPropertyInfo = oDataFieldConverted._type === "Property" ? oDataFieldConverted : oDataFieldConverted && oDataFieldConverted.Value && oDataFieldConverted.Value.$target || oDataFieldConverted && oDataFieldConverted.Target && oDataFieldConverted.Target.$target; // Datafield is not included in the FieldControl calculation, needs to be implemented
248
+
249
+ var chartProperty = oPropertyInfo && oPropertyInfo.term && oPropertyInfo.term === "com.sap.vocabularies.UI.v1.Chart";
250
+ var isAction = !!oDataFieldConverted.Action;
251
+ var isFieldGrp = MassEditHelper.getIsFieldGrp(oDataFieldConverted);
252
+
253
+ if (isImage || bHiddenField || chartProperty || isAction || isFieldGrp) {
254
+ return;
255
+ } // EditMode and InputType
196
256
 
197
- var isReadOnly = isReadOnlyExpression(oPropertyInfo);
198
- bChartProperty = oPropertyInfo && oPropertyInfo.term && oPropertyInfo.term === "com.sap.vocabularies.UI.v1.Chart";
199
- bValidDataType = oPropertyInfo && aValidDataTypes.indexOf(oPropertyInfo.type) !== -1;
200
- bInValidInputType = oColumnInfo && oColumnInfo.inputType && (oColumnInfo.inputType === "sap.m.RatingIndicator" || oColumnInfo.inputType === "sap.ui.mdc.MultiValueField") || hasValueHelpWithFixedValues(oPropertyInfo);
201
257
 
202
- if (sDataPropertyPath && !bHiddenField && !bIsImmutable && !bIsComputed && !bChartProperty && bValidDataType && !bInValidInputType && oColumnInfo.inputType && getEditableExpression(oPropertyInfo, oDataFieldConverted, oDataModelObjectPath) !== "false") {
258
+ var propertyForFieldControl = oPropertyInfo && oPropertyInfo.Value ? oPropertyInfo.Value : oPropertyInfo;
259
+ var expBinding = getEditMode(propertyForFieldControl, oDataModelPath, false, false, oDataFieldConverted, true);
260
+ var editModeValues = Object.keys(EditMode);
261
+ var editModeIsStatic = !!expBinding && editModeValues.includes(expBinding);
262
+ var editable = !!expBinding && (editModeIsStatic && expBinding === EditMode.Editable || !editModeIsStatic);
263
+
264
+ if (!editable) {
265
+ return;
266
+ }
267
+
268
+ var inputType = MassEditHelper.getInputType(oPropertyInfo, oDataFieldConverted, oDataModelPath);
269
+
270
+ if (inputType) {
271
+ var isReadOnly = isReadOnlyExpression(oPropertyInfo);
272
+ var displayMode = CommonUtils.computeDisplayMode(oPropertyContext.getObject());
203
273
  oResult = {
204
- "label": sLabelText + ":",
205
- "visible": sDataPropertyPath && !bHiddenField && !bIsImmutable && !bIsComputed && getEditableExpression(oPropertyInfo, oDataFieldConverted, oDataModelObjectPath),
274
+ "label": sLabelText,
206
275
  "dataProperty": sDataPropertyPath,
207
276
  "isValueHelpEnabled": bValueHelpEnabled ? bValueHelpEnabled : false,
208
277
  "unitProperty": sUnitPropertyPath ? sUnitPropertyPath : false,
@@ -213,9 +282,14 @@ sap.ui.define(["sap/m/Dialog", "sap/ui/core/XMLTemplateProcessor", "sap/ui/model
213
282
  "defaultSelectionPath": sDataPropertyPath ? MassEditHelper.getDefaultSelectionPathComboBox(aContexts, sDataPropertyPath) : false,
214
283
  "defaultSelectionUnitPath": sUnitPropertyPath ? MassEditHelper.getDefaultSelectionPathComboBox(aContexts, sUnitPropertyPath) : false,
215
284
  "entitySet": sCurrentEntitySetName,
216
- "textBinding": oTextBinding,
285
+ "display": displayMode,
286
+ "descriptionPath": MassEditHelper.getTextPath(sDataPropertyPath, oTextBinding, displayMode),
217
287
  "nullable": oPropertyInfo.nullable !== undefined ? oPropertyInfo.nullable : true,
218
- "isPropertyReadOnly": isReadOnly !== undefined ? isReadOnly : false
288
+ "isPropertyReadOnly": isReadOnly !== undefined ? isReadOnly : false,
289
+ "inputType": inputType,
290
+ "editMode": editable ? expBinding : undefined,
291
+ "unitDataPath": sUnitPropertyPath && "fieldsInfo>/unitData/",
292
+ "valuesPath": "fieldsInfo>/values/"
219
293
  };
220
294
  aDataArray.push(oResult);
221
295
  }
@@ -224,21 +298,18 @@ sap.ui.define(["sap/m/Dialog", "sap/ui/core/XMLTemplateProcessor", "sap/ui/model
224
298
  oDataFieldModel.setData(aDataArray);
225
299
  return oDataFieldModel;
226
300
  },
227
- getInputTypeForColumn: function (oColumn) {
228
- return oColumn.getTemplate().getContent && oColumn.getTemplate().getContent() && oColumn.getTemplate().getContent().getContentEdit && oColumn.getTemplate().getContent().getContentEdit() && oColumn.getTemplate().getContent().getContentEdit()[0] && oColumn.getTemplate().getContent().getContentEdit()[0].getMetadata().getName();
229
- },
230
301
  getTableFields: function (oTable) {
231
302
  var aColumns = oTable && oTable.getColumns() || [];
303
+ var columnsData = oTable && oTable.getParent().getTableDefinition().columns;
232
304
  return aColumns.map(function (oColumn) {
233
305
  var sDataProperty = oColumn && oColumn.getDataProperty(),
234
- aRealtedColumnInfo = oTable.data("columns") && oTable.data("columns").customData.filter(function (oColumnInfo) {
306
+ aRealtedColumnInfo = columnsData && columnsData.filter(function (oColumnInfo) {
235
307
  return oColumnInfo.name === sDataProperty && oColumnInfo.type === "Annotation";
236
308
  });
237
309
  return {
238
310
  "dataProperty": sDataProperty,
239
311
  "label": oColumn.getHeader(),
240
- "annotationPath": aRealtedColumnInfo && aRealtedColumnInfo[0] && aRealtedColumnInfo[0].annotationPath,
241
- "inputType": MassEditHelper.getInputTypeForColumn(oColumn)
312
+ "annotationPath": aRealtedColumnInfo && aRealtedColumnInfo[0] && aRealtedColumnInfo[0].annotationPath
242
313
  };
243
314
  });
244
315
  },
@@ -251,6 +322,7 @@ sap.ui.define(["sap/m/Dialog", "sap/ui/core/XMLTemplateProcessor", "sap/ui/model
251
322
  "clearFieldValue": "< Clear Values >",
252
323
  "massEditTitle": oResourceBundle.getText("C_MASS_EDIT_DIALOG_TITLE", iSelectedContexts.toString()),
253
324
  "applyButtonText": bDisplayMode ? oResourceBundle.getText("C_MASS_EDIT_SAVE_BUTTON_TEXT") : oResourceBundle.getText("C_MASS_EDIT_APPLY_BUTTON_TEXT"),
325
+ "useValueHelpValue": "< Use Value Help >",
254
326
  "cancelButtonText": oResourceBundle.getText("C_MASS_EDIT_CANCEL_BUTTON_TEXT")
255
327
  };
256
328
  },
@@ -266,13 +338,16 @@ sap.ui.define(["sap/m/Dialog", "sap/ui/core/XMLTemplateProcessor", "sap/ui/model
266
338
 
267
339
  switch (sInputType) {
268
340
  //TODO - Add for other control types as well (Radio Button, Email, Input, MDC Fields, Image etc.)
269
- case "sap.m.DatePicker":
341
+ case "DatePicker":
270
342
  sResult = "Dates";
271
343
  break;
272
344
 
273
- case "sap.m.CheckBox":
345
+ case "CheckBox":
274
346
  sResult = "Settings";
275
347
  break;
348
+
349
+ default:
350
+ sResult = "Values";
276
351
  }
277
352
 
278
353
  return sResult;
@@ -288,77 +363,205 @@ sap.ui.define(["sap/m/Dialog", "sap/ui/core/XMLTemplateProcessor", "sap/ui/model
288
363
  * @param {boolean} bUOMField
289
364
  */
290
365
  setDefaultValuesToDialog: function (aValues, aContexts, oDefaultValues, oPropertyInfo, bUOMField) {
291
- var sPropertyPath = oPropertyInfo.dataProperty,
366
+ var sPropertyPath = bUOMField ? oPropertyInfo.unitProperty : oPropertyInfo.dataProperty,
292
367
  sInputType = oPropertyInfo.inputType,
293
368
  bPropertyRequired = oPropertyInfo.isFieldRequired;
294
- var sSuffixForKeepExisting = MassEditHelper.getSuffixForKeepExisiting(sInputType); //TODO - Add <<Use Value Help or control implmentation>> and related key by checking if value help is enabled for property or Unit.
369
+ var sSuffixForKeepExisting = MassEditHelper.getSuffixForKeepExisiting(sInputType);
370
+ aValues.defaultOptions = aValues.defaultOptions || []; //TODO - Add <<Use Value Help or control implmentation>> and related key by checking if value help is enabled for property or Unit.
295
371
  //TODO - Add option Apply to Empty Fields only for Both Value Help and controls.
296
372
 
297
373
  var bValueExistsForPropertyPath = aContexts.some(function (oSelectedContext) {
298
374
  return oSelectedContext.getObject(sPropertyPath);
299
375
  });
300
376
 
377
+ if (sInputType === "CheckBox") {
378
+ var falseEntry = {
379
+ text: "No",
380
+ key: "".concat(sPropertyPath, "/false"),
381
+ textInfo: {
382
+ value: false
383
+ }
384
+ };
385
+ var truthyEntry = {
386
+ text: "Yes",
387
+ key: "".concat(sPropertyPath, "/true"),
388
+ textInfo: {
389
+ value: true
390
+ }
391
+ };
392
+ aValues.unshift(falseEntry);
393
+ aValues.defaultOptions.unshift(falseEntry);
394
+ aValues.unshift(truthyEntry);
395
+ aValues.defaultOptions.unshift(truthyEntry);
396
+ }
397
+
398
+ if (oPropertyInfo.isValueHelpEnabled || oPropertyInfo.isValueHelpEnabledForUnit && bUOMField) {
399
+ var vhdEntry = {
400
+ text: oDefaultValues.useValueHelpValue,
401
+ key: "UseValueHelpValue/" + sPropertyPath
402
+ };
403
+ aValues.unshift(vhdEntry);
404
+ aValues.defaultOptions.unshift(vhdEntry);
405
+ }
406
+
301
407
  if (bValueExistsForPropertyPath) {
302
408
  if (bPropertyRequired !== "true" && !bUOMField) {
303
- aValues.unshift({
409
+ var clearEntry = {
304
410
  text: oDefaultValues.clearFieldValue,
305
411
  key: "ClearFieldValue/" + sPropertyPath
306
- });
412
+ };
413
+ aValues.unshift(clearEntry);
414
+ aValues.defaultOptions.unshift(clearEntry);
307
415
  }
308
416
  } else {
309
- aValues.unshift({
417
+ var emptyEntry = {
310
418
  text: oDefaultValues.leaveBlankValue,
311
419
  key: "Empty/" + sPropertyPath
312
- });
420
+ };
421
+ aValues.unshift(emptyEntry);
422
+ aValues.defaultOptions.unshift(emptyEntry);
313
423
  }
314
424
 
315
- aValues.unshift({
425
+ var keepEntry = {
316
426
  text: oDefaultValues.keepExistingPrefix + " " + sSuffixForKeepExisting + " >",
317
427
  key: "Default/" + sPropertyPath
318
- });
428
+ };
429
+ aValues.unshift(keepEntry);
430
+ aValues.defaultOptions.unshift(keepEntry);
319
431
  },
320
- getTextArrangementInfo: function (sProperty, oTextBinding, sCurrentEntitySet, oSelectedContext) {
321
- var oMetaModel = oSelectedContext.getModel().getMetaModel();
322
- var sDisplayMode = CommonUtils.computeDisplayMode(oMetaModel.getObject(sCurrentEntitySet + "/" + sProperty + "@"));
323
- var sDescriptionPath, sValue, sDescriptionValue, sFullText;
324
-
325
- if (oTextBinding && (oTextBinding.path || oTextBinding.parameters && oTextBinding.parameters.length) && sProperty) {
326
- if (oTextBinding.path) {
327
- if (sDisplayMode === "Description") {
328
- sValue = oSelectedContext.getObject(sProperty);
329
- sDescriptionValue = oSelectedContext.getObject(oTextBinding.path);
330
- sFullText = sDescriptionValue;
331
- } else if (sDisplayMode === "Value") {
332
- sValue = oSelectedContext.getObject(sProperty);
333
- sFullText = sValue;
334
- }
335
- } else if (oTextBinding.parameters) {
336
- oTextBinding.parameters.forEach(function (oProps) {
337
- if (oProps.path && oProps.path !== sProperty) {
338
- sDescriptionPath = oProps.path;
339
- }
340
- });
341
- sValue = oSelectedContext.getObject(sProperty);
342
- sDescriptionValue = oSelectedContext.getObject(sDescriptionPath);
343
432
 
344
- if (sDisplayMode === "ValueDescription" && sValue && sDescriptionValue) {
345
- sFullText = sValue + " (" + sDescriptionValue + ")";
346
- } else if (sDisplayMode === "DescriptionValue" && sDescriptionValue && sValue) {
347
- sFullText = sDescriptionValue + " (" + sValue + ")";
348
- }
433
+ /**
434
+ * Get text arrangement info for a context property.
435
+ *
436
+ * @param {string} property Property Path
437
+ * @param {string} descriptionPath Path to text association of the property
438
+ * @param {string} displayMode Display mode of the property and text association
439
+ * @param {Context} selectedContext Context to find the full text
440
+ * @returns {TextArrangementInfo}
441
+ */
442
+ getTextArrangementInfo: function (property, descriptionPath, displayMode, selectedContext) {
443
+ var value = selectedContext.getObject(property),
444
+ descriptionValue,
445
+ fullText;
446
+
447
+ if (descriptionPath && property) {
448
+ switch (displayMode) {
449
+ case "Description":
450
+ descriptionValue = selectedContext.getObject(descriptionPath);
451
+ fullText = descriptionValue;
452
+ break;
453
+
454
+ case "Value":
455
+ value = selectedContext.getObject(property);
456
+ fullText = value;
457
+ break;
458
+
459
+ case "ValueDescription":
460
+ value = selectedContext.getObject(property);
461
+ descriptionValue = selectedContext.getObject(descriptionPath);
462
+ fullText = value + " (" + descriptionValue + ")";
463
+ break;
464
+
465
+ case "DescriptionValue":
466
+ value = selectedContext.getObject(property);
467
+ descriptionValue = selectedContext.getObject(descriptionPath);
468
+ fullText = descriptionValue + " (" + value + ")";
469
+ break;
470
+
471
+ default:
472
+ Log.info("Display Property not applicable: " + property);
473
+ break;
349
474
  }
475
+ }
350
476
 
351
- return {
352
- "textArrangement": sDisplayMode,
353
- "valuePath": sProperty,
354
- "descriptionPath": sDescriptionPath,
355
- "value": sValue,
356
- "description": sDescriptionValue,
357
- "fullText": sFullText
358
- };
477
+ return {
478
+ "textArrangement": displayMode,
479
+ "valuePath": property,
480
+ "descriptionPath": descriptionPath,
481
+ "value": value,
482
+ "description": descriptionValue,
483
+ "fullText": fullText
484
+ };
485
+ },
486
+
487
+ /**
488
+ * Return the visibility valuue for the ManagedObject Any.
489
+ *
490
+ * @param {AnyType} any The ManagedObject Any to be used to calculate the visible value of the binding.
491
+ * @returns {boolean} Returns true if the mass edit field is editable.
492
+ */
493
+ isEditable: function (any) {
494
+ var binding = any.getBinding("any");
495
+ var value = binding.getExternalValue();
496
+ return value === EditMode.Editable;
497
+ },
498
+
499
+ /**
500
+ * Calculate and update the visibility of mass edit field on change of the ManagedObject Any binding.
501
+ *
502
+ * @param {JSONModel} oDialogDataModel Model to be used runtime.
503
+ * @param {string} dataProperty Field name.
504
+ */
505
+ onContextEditableChange: function (oDialogDataModel, dataProperty) {
506
+ var objectsForVisibility = oDialogDataModel.getProperty("/values/" + dataProperty + "/objectsForVisibility") || [];
507
+ var editable = objectsForVisibility.some(MassEditHelper.isEditable);
508
+
509
+ if (editable) {
510
+ oDialogDataModel.setProperty("/values/" + dataProperty + "/visible", editable);
359
511
  }
512
+ },
360
513
 
361
- return undefined;
514
+ /**
515
+ * Update Managed Object Any for visibility of the mass edit fields.
516
+ *
517
+ * @param {AnyType} mOToUse The ManagedObject Any to be used to calculate the visible value of the binding.
518
+ * @param {JSONModel} oDialogDataModel Model to be used runtime.
519
+ * @param {string} dataProperty Field name.
520
+ * @param {any} values Values of the field.
521
+ */
522
+ updateOnContextChange: function (mOToUse, oDialogDataModel, dataProperty, values) {
523
+ var binding = mOToUse.getBinding("any");
524
+ values.objectsForVisibility = values.objectsForVisibility || [];
525
+ values.objectsForVisibility.push(mOToUse);
526
+ binding.attachChange(MassEditHelper.onContextEditableChange.bind(null, oDialogDataModel, dataProperty));
527
+ },
528
+
529
+ /**
530
+ * Get bound object to calculate the visibility of contexts.
531
+ *
532
+ * @param {BindingExpression<boolean> | ExpressionOrPrimitive<boolean>} expBinding Binding String object.
533
+ * @param {object} context Context the binding value.
534
+ * @returns {AnyType} The ManagedObject Any to be used to calculate the visible value of the binding.
535
+ */
536
+ getBoundObject: function (expBinding, context) {
537
+ var mOToUse = new Any({
538
+ any: expBinding
539
+ });
540
+ var model = context.getModel();
541
+ mOToUse.setModel(model);
542
+ mOToUse.setBindingContext(context);
543
+ return mOToUse;
544
+ },
545
+
546
+ /**
547
+ * Get the visibility of the field.
548
+ *
549
+ * @param {BindingExpression<boolean> | ExpressionOrPrimitive<boolean>} expBinding Binding String object.
550
+ * @param {JSONModel} oDialogDataModel Model to be used runtime.
551
+ * @param {string} dataProperty Field name.
552
+ * @param {any} values Values of the field.
553
+ * @param {object} context Context the binding value.
554
+ * @returns {boolean} Returns true if the mass edit field is editable.
555
+ */
556
+ getFieldVisiblity: function (expBinding, oDialogDataModel, dataProperty, values, context) {
557
+ var mOToUse = MassEditHelper.getBoundObject(expBinding, context);
558
+ var isContextEditable = MassEditHelper.isEditable(mOToUse);
559
+
560
+ if (!isContextEditable) {
561
+ MassEditHelper.updateOnContextChange(mOToUse, oDialogDataModel, dataProperty, values);
562
+ }
563
+
564
+ return isContextEditable;
362
565
  },
363
566
 
364
567
  /**
@@ -369,76 +572,146 @@ sap.ui.define(["sap/m/Dialog", "sap/ui/core/XMLTemplateProcessor", "sap/ui/model
369
572
  * @param {Array} aContexts Contexts for mass edit
370
573
  * @param {Array} aDataArray Array containing data related to the dialog used by both the static and the runtime model
371
574
  * @param {object} oDefaultValues Default values from i18n
575
+ * @param {Context} dialogContext Transient context for mass edit dialog.
372
576
  * @returns {object}
373
577
  */
374
- setRuntimeModelOnDialog: function (aContexts, aDataArray, oDefaultValues) {
578
+ setRuntimeModelOnDialog: function (aContexts, aDataArray, oDefaultValues, dialogContext) {
375
579
  var aValues = [];
376
580
  var aUnitData = [];
377
581
  var aResults = [];
378
582
  var aReadOnlyFieldInfo = [];
379
- var oDistinctValueMap = {};
380
- var sPropertyName;
583
+ var oData = {
584
+ "values": aValues,
585
+ "unitData": aUnitData,
586
+ "results": aResults,
587
+ "readablePropertyData": aReadOnlyFieldInfo,
588
+ "selectedKey": undefined
589
+ };
590
+ var oDialogDataModel = new JSONModel(oData);
381
591
  aDataArray.forEach(function (oData) {
382
592
  var oTextInfo;
593
+ var sPropertyKey;
594
+ var sUnitPropertyName;
595
+ var oDistinctValueMap = {};
596
+ var oDistinctUnitMap = {};
383
597
 
384
598
  if (oData.dataProperty && oData.dataProperty.indexOf("/") > -1) {
385
- var aFinalPath = MassEditHelper.initLastLevelOfPropertyPath(oData.dataProperty, aValues);
599
+ var aFinalPath = MassEditHelper.initLastLevelOfPropertyPath(oData.dataProperty, aValues
600
+ /*, dialogContext */
601
+ );
386
602
  var aPropertyPaths = oData.dataProperty.split("/");
387
- var sPropertyKey;
388
-
389
- for (var i = 0; i < aContexts.length; i++) {
390
- var sMultiLevelPathValue = aContexts[i].getObject(oData.dataProperty);
391
- sPropertyKey = oData.dataProperty + "/" + sMultiLevelPathValue;
392
-
393
- if (!oDistinctValueMap[sPropertyKey] && aFinalPath[aPropertyPaths[aPropertyPaths.length - 1]]) {
394
- oTextInfo = MassEditHelper.getTextArrangementInfo(oData.dataProperty, oData.textBinding, oData.entitySet, aContexts[i]);
395
- aFinalPath[aPropertyPaths[aPropertyPaths.length - 1]].push({
396
- "text": oTextInfo && oTextInfo.fullText || sMultiLevelPathValue,
397
- "key": oData.dataProperty,
398
- "textInfo": oTextInfo
399
- });
400
- oDistinctValueMap[sPropertyKey] = sMultiLevelPathValue;
401
- }
603
+
604
+ var _iterator = _createForOfIteratorHelper(aContexts),
605
+ _step;
606
+
607
+ try {
608
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
609
+ var context = _step.value;
610
+ var sMultiLevelPathValue = context.getObject(oData.dataProperty);
611
+ sPropertyKey = oData.dataProperty + "/" + sMultiLevelPathValue;
612
+
613
+ if (!oDistinctValueMap[sPropertyKey] && aFinalPath[aPropertyPaths[aPropertyPaths.length - 1]]) {
614
+ oTextInfo = MassEditHelper.getTextArrangementInfo(oData.dataProperty, oData.descriptionPath, oData.display, context);
615
+ aFinalPath[aPropertyPaths[aPropertyPaths.length - 1]].push({
616
+ "text": oTextInfo && oTextInfo.fullText || sMultiLevelPathValue,
617
+ "key": sPropertyKey,
618
+ "textInfo": oTextInfo
619
+ });
620
+ oDistinctValueMap[sPropertyKey] = sMultiLevelPathValue;
621
+ }
622
+ } // if (Object.keys(oDistinctValueMap).length === 1) {
623
+ // dialogContext.setProperty(oData.dataProperty, sPropertyKey && oDistinctValueMap[sPropertyKey]);
624
+ // }
625
+
626
+ } catch (err) {
627
+ _iterator.e(err);
628
+ } finally {
629
+ _iterator.f();
402
630
  }
631
+
632
+ aFinalPath[aPropertyPaths[aPropertyPaths.length - 1]].textInfo = {
633
+ descriptionPath: oData.descriptionPath,
634
+ valuePath: oData.dataProperty,
635
+ displayMode: oData.display
636
+ };
403
637
  } else {
404
638
  aValues[oData.dataProperty] = aValues[oData.dataProperty] || [];
639
+ aValues[oData.dataProperty]["selectOptions"] = aValues[oData.dataProperty]["selectOptions"] || [];
405
640
 
406
641
  if (oData.unitProperty) {
407
642
  aUnitData[oData.unitProperty] = aUnitData[oData.unitProperty] || [];
643
+ aUnitData[oData.unitProperty]["selectOptions"] = aUnitData[oData.unitProperty]["selectOptions"] || [];
408
644
  }
409
645
 
410
- for (var _i = 0; _i < aContexts.length; _i++) {
411
- var oDataObject = aContexts[_i].getObject();
646
+ var _iterator2 = _createForOfIteratorHelper(aContexts),
647
+ _step2;
412
648
 
413
- sPropertyName = oData.dataProperty + "/" + oDataObject[oData.dataProperty];
649
+ try {
650
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
651
+ var _context = _step2.value;
414
652
 
415
- if (oData.dataProperty && oDataObject[oData.dataProperty] && !oDistinctValueMap[sPropertyName]) {
416
- oTextInfo = MassEditHelper.getTextArrangementInfo(oData.dataProperty, oData.textBinding, oData.entitySet, aContexts[_i]);
417
- aValues[oData.dataProperty].push({
418
- "text": oTextInfo && oTextInfo.fullText || oDataObject[oData.dataProperty],
419
- "key": oData.dataProperty,
420
- "textInfo": oTextInfo
421
- });
422
- oDistinctValueMap[sPropertyName] = oDataObject[oData.dataProperty];
423
- }
653
+ var oDataObject = _context.getObject();
424
654
 
425
- if (oData.unitProperty && oDataObject[oData.unitProperty]) {
426
- sPropertyName = oData.unitProperty + "/" + oDataObject[oData.unitProperty];
655
+ sPropertyKey = oData.dataProperty + "/" + oDataObject[oData.dataProperty];
427
656
 
428
- if (!oDistinctValueMap[sPropertyName]) {
429
- oTextInfo = MassEditHelper.getTextArrangementInfo(oData.unitProperty, oData.textBinding, oData.entitySet, aContexts[_i]);
430
- aUnitData[oData.unitProperty].push({
431
- "text": oTextInfo && oTextInfo.fullText || oDataObject[oData.unitProperty],
432
- "key": oData.unitProperty,
433
- "textInfo": oTextInfo
434
- });
435
- oDistinctValueMap[sPropertyName] = oDataObject[oData.unitProperty];
657
+ if (oData.dataProperty && oDataObject[oData.dataProperty] && !oDistinctValueMap[sPropertyKey]) {
658
+ if (oData.inputType != "CheckBox") {
659
+ oTextInfo = MassEditHelper.getTextArrangementInfo(oData.dataProperty, oData.descriptionPath, oData.display, _context);
660
+ var entry = {
661
+ "text": oTextInfo && oTextInfo.fullText || oDataObject[oData.dataProperty],
662
+ "key": sPropertyKey,
663
+ "textInfo": oTextInfo
664
+ };
665
+ aValues[oData.dataProperty].push(entry);
666
+ aValues[oData.dataProperty]["selectOptions"].push(entry);
667
+ }
668
+
669
+ oDistinctValueMap[sPropertyKey] = oDataObject[oData.dataProperty];
670
+ }
671
+
672
+ if (oData.unitProperty && oDataObject[oData.unitProperty]) {
673
+ sUnitPropertyName = oData.unitProperty + "/" + oDataObject[oData.unitProperty];
674
+
675
+ if (!oDistinctUnitMap[sUnitPropertyName]) {
676
+ if (oData.inputType != "CheckBox") {
677
+ oTextInfo = MassEditHelper.getTextArrangementInfo(oData.unitProperty, oData.descriptionPath, oData.display, _context);
678
+ var unitEntry = {
679
+ "text": oTextInfo && oTextInfo.fullText || oDataObject[oData.unitProperty],
680
+ "key": sUnitPropertyName,
681
+ "textInfo": oTextInfo
682
+ };
683
+ aUnitData[oData.unitProperty].push(unitEntry);
684
+ aUnitData[oData.unitProperty]["selectOptions"].push(unitEntry);
685
+ }
686
+
687
+ oDistinctUnitMap[sUnitPropertyName] = oDataObject[oData.unitProperty];
688
+ }
436
689
  }
437
690
  }
691
+ } catch (err) {
692
+ _iterator2.e(err);
693
+ } finally {
694
+ _iterator2.f();
438
695
  }
696
+
697
+ aValues[oData.dataProperty].textInfo = {
698
+ descriptionPath: oData.descriptionPath,
699
+ valuePath: oData.dataProperty,
700
+ displayMode: oData.display
701
+ };
702
+ }
703
+
704
+ if (Object.keys(oDistinctValueMap).length === 1) {
705
+ dialogContext.setProperty(oData.dataProperty, sPropertyKey && oDistinctValueMap[sPropertyKey]);
706
+ }
707
+
708
+ if (Object.keys(oDistinctUnitMap).length === 1) {
709
+ dialogContext.setProperty(oData.unitProperty, sUnitPropertyName && oDistinctUnitMap[sUnitPropertyName]);
439
710
  }
440
711
  });
441
712
  aDataArray.forEach(function (oData) {
713
+ var values = {};
714
+
442
715
  if (oData.dataProperty.indexOf("/") > -1) {
443
716
  var sMultiLevelPropPathValue = MassEditHelper.getValueForMultiLevelPath(oData.dataProperty, aValues);
444
717
 
@@ -450,12 +723,19 @@ sap.ui.define(["sap/m/Dialog", "sap/ui/core/XMLTemplateProcessor", "sap/ui/model
450
723
  } else {
451
724
  MassEditHelper.setDefaultValuesToDialog(sMultiLevelPropPathValue, aContexts, oDefaultValues, oData);
452
725
  }
453
- } else if (aValues[oData.dataProperty] && aValues[oData.dataProperty].length) {
726
+
727
+ values = sMultiLevelPropPathValue;
728
+ } else if (aValues[oData.dataProperty]) {
729
+ aValues[oData.dataProperty] = aValues[oData.dataProperty] || [];
454
730
  MassEditHelper.setDefaultValuesToDialog(aValues[oData.dataProperty], aContexts, oDefaultValues, oData);
731
+ values = aValues[oData.dataProperty];
455
732
  }
456
733
 
457
734
  if (aUnitData[oData.unitProperty] && aUnitData[oData.unitProperty].length) {
458
735
  MassEditHelper.setDefaultValuesToDialog(aUnitData[oData.unitProperty], aContexts, oDefaultValues, oData, true);
736
+ aUnitData[oData.unitProperty].textInfo = {};
737
+ aUnitData[oData.unitProperty].selectedKey = MassEditHelper.getDefaultSelectionPathComboBox(aContexts, oData.unitProperty);
738
+ aUnitData[oData.unitProperty].inputType = oData.inputType;
459
739
  } else if (oData.dataProperty && aValues[oData.dataProperty] && !aValues[oData.dataProperty].length || oData.unitProperty && aUnitData[oData.unitProperty] && !aUnitData[oData.unitProperty].length) {
460
740
  var bClearFieldOrBlankValueExists = aValues[oData.dataProperty] && aValues[oData.dataProperty].some(function (obj) {
461
741
  return obj.text === "< Clear Values >" || obj.text === "< Leave Blank >";
@@ -472,11 +752,17 @@ sap.ui.define(["sap/m/Dialog", "sap/ui/core/XMLTemplateProcessor", "sap/ui/model
472
752
  return obj.text === "< Clear Values >" || obj.text === "< Leave Blank >";
473
753
  });
474
754
 
475
- if (oData.unitProperty && !bClearFieldOrBlankUnitValueExists) {
476
- aUnitData[oData.unitProperty].push({
477
- text: oDefaultValues.leaveBlankValue,
478
- key: "Empty/" + oData.unitProperty
479
- });
755
+ if (oData.unitProperty) {
756
+ if (!bClearFieldOrBlankUnitValueExists) {
757
+ aUnitData[oData.unitProperty].push({
758
+ text: oDefaultValues.leaveBlankValue,
759
+ key: "Empty/" + oData.unitProperty
760
+ });
761
+ }
762
+
763
+ aUnitData[oData.unitProperty].textInfo = {};
764
+ aUnitData[oData.unitProperty].selectedKey = MassEditHelper.getDefaultSelectionPathComboBox(aContexts, oData.unitProperty);
765
+ aUnitData[oData.unitProperty].inputType = oData.inputType;
480
766
  }
481
767
  }
482
768
 
@@ -494,18 +780,54 @@ sap.ui.define(["sap/m/Dialog", "sap/ui/core/XMLTemplateProcessor", "sap/ui/model
494
780
  propertyValue: oData.isPropertyReadOnly.operands[0].operand2.value,
495
781
  type: "Path"
496
782
  });
783
+ } // Setting visbility of the mass edit field.
784
+
785
+
786
+ if (oData.editMode) {
787
+ values.visible = oData.editMode === EditMode.Editable || aContexts.some(MassEditHelper.getFieldVisiblity.bind(MassEditHelper, oData.editMode, oDialogDataModel, oData.dataProperty, values));
788
+ } else {
789
+ values.visible = true;
497
790
  }
791
+
792
+ values.selectedKey = MassEditHelper.getDefaultSelectionPathComboBox(aContexts, oData.dataProperty);
793
+ values.inputType = oData.inputType;
794
+ values.unitProperty = oData.unitProperty;
498
795
  });
499
- var oData = {
500
- "values": aValues,
501
- "unitData": aUnitData,
502
- "results": aResults,
503
- "readablePropertyData": aReadOnlyFieldInfo
504
- };
505
- var oDialogDataModel = new JSONModel(oData);
506
796
  return oDialogDataModel;
507
797
  },
508
798
 
799
+ /**
800
+ * Gets transient context for dialog.
801
+ *
802
+ * @param {Table} table Instance of Table.
803
+ * @param {Dialog} dialog Mass Edit Dialog.
804
+ * @returns {object} Promise returning instance of dialog.
805
+ */
806
+ getDialogContext: function (table, dialog) {
807
+ var transCtx = dialog && dialog.getBindingContext();
808
+
809
+ if (!transCtx) {
810
+ var model = table.getModel();
811
+ var listBinding = table.getRowBinding();
812
+ var transientListBinding = model.bindList(listBinding.getPath(), listBinding.getContext(), [], [], {
813
+ $$updateGroupId: "submitLater"
814
+ });
815
+
816
+ transientListBinding.refreshInternal = function () {
817
+ /* */
818
+ };
819
+
820
+ transCtx = transientListBinding.create({}, true);
821
+ }
822
+
823
+ return transCtx;
824
+ },
825
+ onDialogOpen: function (event) {
826
+ var source = event.getSource();
827
+ var fieldsInfoModel = source.getModel("fieldsInfo");
828
+ fieldsInfoModel.setProperty("/isOpen", true);
829
+ },
830
+
509
831
  /**
510
832
  * Create the mass edit dialog.
511
833
  *
@@ -517,10 +839,11 @@ sap.ui.define(["sap/m/Dialog", "sap/ui/core/XMLTemplateProcessor", "sap/ui/model
517
839
  createDialog: function (oTable, aContexts, oController) {
518
840
  var sFragmentName = "sap/fe/core/controls/massEdit/MassEditDialog",
519
841
  aDataArray = [],
520
- oResourceBundle = sap.ui.getCore().getLibraryResourceBundle("sap.fe.core"),
842
+ oResourceBundle = Core.getLibraryResourceBundle("sap.fe.core"),
521
843
  oDefaultValues = MassEditHelper.getDefaultTextsForDialog(oResourceBundle, aContexts.length, oTable),
522
844
  oDataFieldModel = MassEditHelper.prepareDataForDialog(oTable, aContexts, aDataArray),
523
- oDialogDataModel = MassEditHelper.setRuntimeModelOnDialog(aContexts, aDataArray, oDefaultValues);
845
+ dialogContext = MassEditHelper.getDialogContext(oTable),
846
+ oDialogDataModel = MassEditHelper.setRuntimeModelOnDialog(aContexts, aDataArray, oDefaultValues, dialogContext);
524
847
  return new Promise(function (resolve, reject) {
525
848
  var oFragment = XMLTemplateProcessor.loadTemplate(sFragmentName, "fragment");
526
849
  return Promise.resolve(XMLPreprocessor.process(oFragment, {
@@ -536,20 +859,28 @@ sap.ui.define(["sap/m/Dialog", "sap/ui/core/XMLTemplateProcessor", "sap/ui/model
536
859
  return Fragment.load({
537
860
  definition: oFragment
538
861
  }).then(function (oDialogContent) {
862
+ var DraftStatus = FELibrary.DraftStatus;
539
863
  var oDialog = new Dialog({
540
864
  title: oDefaultValues.massEditTitle,
541
865
  content: [oDialogContent],
866
+ afterOpen: MassEditHelper.onDialogOpen,
542
867
  beginButton: new Button({
543
868
  text: oDefaultValues.applyButtonText,
544
869
  type: "Emphasized",
545
870
  press: function (oEvent) {
871
+ var _oController$getView, _oController$getView$;
872
+
873
+ (_oController$getView = oController.getView()) === null || _oController$getView === void 0 ? void 0 : (_oController$getView$ = _oController$getView.getBindingContext("internal")) === null || _oController$getView$ === void 0 ? void 0 : _oController$getView$.setProperty("skipPatchHandlers", true);
546
874
  var oDialog = oEvent.getSource().getParent();
547
875
  var oModel = oDialog.getModel("fieldsInfo");
548
876
  var aResults = oModel.getProperty("/results");
549
877
  var aPropertyReadableInfo = oModel.getProperty("/readablePropertyData");
550
878
  var changePromise = [];
551
879
  var bReadOnlyField = false;
552
- aContexts.forEach(function (oSelectedContext) {
880
+ var groupId; //let index = 0;
881
+
882
+ var errorValues = [];
883
+ aContexts.forEach(function (oSelectedContext, idx) {
553
884
  aResults.forEach(function (oResult) {
554
885
  //TODO - Add save implementation for Value Help.
555
886
  if (aPropertyReadableInfo) {
@@ -564,22 +895,63 @@ sap.ui.define(["sap/m/Dialog", "sap/ui/core/XMLTemplateProcessor", "sap/ui/model
564
895
  });
565
896
  }
566
897
 
898
+ groupId = "$auto." + idx; //index += 1;
899
+
900
+ oController._editFlow.setDraftStatus(DraftStatus.Saving); //let promiseCount = 0;
901
+
902
+
567
903
  if (oResult.keyValue && oResult.value !== "Default" && !bReadOnlyField) {
568
- changePromise.push(oSelectedContext.setProperty(oResult.keyValue, oResult.value));
904
+ changePromise.push(oSelectedContext.setProperty(oResult.keyValue, oResult.value, groupId).then(function () {
905
+ return oSelectedContext;
906
+ }).catch(function (oError) {
907
+ errorValues.push(oSelectedContext.getObject());
908
+ Log.error("Mass Edit: Something went wrong in updating entries.", oError);
909
+ }));
569
910
  }
570
911
  });
571
912
  });
572
- return Promise.all(changePromise).then(function (oRes) {
573
- var oListBinding = oTable.getRowBinding(),
574
- oExtensionAPI = oController && oController.getExtensionAPI();
913
+ Promise.allSettled(changePromise).then(function () {
914
+ var oListBinding = oTable.getRowBinding();
915
+ var oExtensionAPI = oController && oController.getExtensionAPI();
575
916
  return oExtensionAPI.refresh(oListBinding.getPath()).then(function () {
576
- oDialog.close();
577
- oDialog.destroy();
578
- return oRes;
917
+ var subtitleColumn = CommonUtils.getMessageColumn(oTable);
918
+ var messages = sap.ui.getCore().getMessageManager().getMessageModel().getData();
919
+ var boundTransitionErrorContexts = [];
920
+ messages.forEach(function (message, idx) {
921
+ var messageTargets = message.getTargets();
922
+
923
+ if (messageTargets && messageTargets.length === 1 && messageTargets[0].length && message.persistent === true) {
924
+ var boundTransitionErrorContext = aContexts.find(function (oContext) {
925
+ return message.getTarget().indexOf(oContext.getPath()) !== -1;
926
+ });
927
+ boundTransitionErrorContexts.push(boundTransitionErrorContext);
928
+ message.additionalText = boundTransitionErrorContext ? boundTransitionErrorContext.getObject()[subtitleColumn] : undefined;
929
+ }
930
+ });
931
+
932
+ if (boundTransitionErrorContexts.length === 0 && errorValues.length === 0) {
933
+ oController._editFlow.setDraftStatus(DraftStatus.Saved);
934
+
935
+ var successToast = oResourceBundle.getText("C_MASS_EDIT_SUCCESS_TOAST");
936
+ MessageToast.show(successToast);
937
+ } else {
938
+ if (errorValues.length + boundTransitionErrorContexts.length < oTable.getSelectedContexts().length) {
939
+ oController._editFlow.setDraftStatus(DraftStatus.Saved);
940
+ } else if (errorValues.length + boundTransitionErrorContexts.length === oTable.getSelectedContexts().length) {
941
+ oController._editFlow.setDraftStatus(DraftStatus.Clear);
942
+ }
943
+ }
944
+
945
+ oController._editFlow.getMessageHandler().showMessages();
946
+
947
+ if (oDialog.isOpen()) {
948
+ var _oController$getView2, _oController$getView3;
949
+
950
+ oDialog.close();
951
+ oDialog.destroy();
952
+ (_oController$getView2 = oController.getView()) === null || _oController$getView2 === void 0 ? void 0 : (_oController$getView3 = _oController$getView2.getBindingContext("internal")) === null || _oController$getView3 === void 0 ? void 0 : _oController$getView3.setProperty("skipPatchHandlers", false);
953
+ }
579
954
  });
580
- }).catch(function (oError) {
581
- //TODO - Add error handling part for the Dialog
582
- Log.error("Mass Edit: Something went wrong in updating entries.", oError);
583
955
  });
584
956
  }
585
957
  }),
@@ -592,7 +964,10 @@ sap.ui.define(["sap/m/Dialog", "sap/ui/core/XMLTemplateProcessor", "sap/ui/model
592
964
  }
593
965
  })
594
966
  });
967
+ var model = oTable.getModel();
595
968
  oDialog.setModel(oDialogDataModel, "fieldsInfo");
969
+ oDialog.setModel(model);
970
+ oDialog.setBindingContext(dialogContext);
596
971
  resolve(oDialog);
597
972
  });
598
973
  }).catch(reject);
@@ -601,4 +976,4 @@ sap.ui.define(["sap/m/Dialog", "sap/ui/core/XMLTemplateProcessor", "sap/ui/model
601
976
  };
602
977
  return MassEditHelper;
603
978
  }, false);
604
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIk1hc3NFZGl0SGVscGVyLnRzIl0sIm5hbWVzIjpbImFWYWxpZERhdGFUeXBlcyIsIk1hc3NFZGl0SGVscGVyIiwiaW5pdExhc3RMZXZlbE9mUHJvcGVydHlQYXRoIiwic1BhdGgiLCJhVmFsdWVzIiwiYUZpbmFsUGF0aCIsImluZGV4IiwiYVBhdGhzIiwic3BsaXQiLCJzRnVsbFBhdGgiLCJmb3JFYWNoIiwic1Byb3BlcnR5UGF0aCIsImdldFVuaXF1ZVZhbHVlcyIsInNWYWx1ZSIsInNlbGYiLCJpbmRleE9mIiwiZ2V0VmFsdWVGb3JNdWx0aUxldmVsUGF0aCIsInNEYXRhUHJvcGVydHlQYXRoIiwib1ZhbHVlcyIsImFQcm9wZXJ0eVBhdGhzIiwiUmVzdWx0IiwiZ2V0RGVmYXVsdFNlbGVjdGlvblBhdGhDb21ib0JveCIsImFDb250ZXh0cyIsImxlbmd0aCIsIm9TZWxlY3RlZENvbnRleHQiLCJhUHJvcGVydHlWYWx1ZXMiLCJvQ29udGV4dCIsIm9EYXRhT2JqZWN0IiwiZ2V0T2JqZWN0Iiwic011bHRpTGV2ZWxQYXRoQ29uZGl0aW9uIiwiaGFzT3duUHJvcGVydHkiLCJwdXNoIiwiYVVuaXF1ZVByb3BlcnR5VmFsdWVzIiwiZmlsdGVyIiwiZ2V0SGlkZGVuVmFsdWVGb3JDb250ZXh0cyIsImhpZGRlblZhbHVlIiwiJFBhdGgiLCJzb21lIiwicHJlcGFyZURhdGFGb3JEaWFsb2ciLCJvVGFibGUiLCJhRGF0YUFycmF5Iiwib01ldGFNb2RlbCIsImdldE1vZGVsIiwiZ2V0TWV0YU1vZGVsIiwic0N1cnJlbnRFbnRpdHlTZXROYW1lIiwiZGF0YSIsImFUYWJsZUZpZWxkcyIsImdldFRhYmxlRmllbGRzIiwib0VudGl0eVR5cGVDb250ZXh0IiwiZ2V0Q29udGV4dCIsIm9EYXRhTW9kZWxPYmplY3RQYXRoIiwiZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzIiwib0RhdGFGaWVsZE1vZGVsIiwiSlNPTk1vZGVsIiwib1Jlc3VsdCIsInNMYWJlbFRleHQiLCJiVmFsdWVIZWxwRW5hYmxlZCIsInNVbml0UHJvcGVydHlQYXRoIiwiYlZhbHVlSGVscEVuYWJsZWRGb3JVbml0IiwiYklzSW1tdXRhYmxlIiwiYklzQ29tcHV0ZWQiLCJiQ2hhcnRQcm9wZXJ0eSIsIm9UZXh0QmluZGluZyIsImJWYWxpZERhdGFUeXBlIiwiYkluVmFsaWRJbnB1dFR5cGUiLCJvQ29sdW1uSW5mbyIsImRhdGFQcm9wZXJ0eSIsIm9Qcm9wZXJ0eUluZm8iLCJsYWJlbCIsInRhcmdldE9iamVjdCIsInRhcmdldEVudGl0eVR5cGUiLCJlbnRpdHlQcm9wZXJ0aWVzIiwib1Byb3BlcnR5IiwibmFtZSIsImdldFRleHRCaW5kaW5nIiwib0ZpZWxkQ29udGV4dCIsImFubm90YXRpb25QYXRoIiwib0RhdGFGaWVsZENvbnZlcnRlZCIsImNvbnZlcnRNZXRhTW9kZWxDb250ZXh0Iiwib1Byb3BlcnR5Q29udGV4dCIsIm9JbnRlcmZhY2UiLCJnZXRJbnRlcmZhY2UiLCJnZXRQcm9wZXJ0eSIsImJIaWRkZW5GaWVsZCIsImNvbnRleHQiLCJnZXRQYXRoIiwiVmFsdWUiLCIkdGFyZ2V0IiwiVGFyZ2V0IiwiaXNSZWFkT25seSIsImlzUmVhZE9ubHlFeHByZXNzaW9uIiwidGVybSIsInR5cGUiLCJpbnB1dFR5cGUiLCJoYXNWYWx1ZUhlbHBXaXRoRml4ZWRWYWx1ZXMiLCJnZXRFZGl0YWJsZUV4cHJlc3Npb24iLCJnZXRSZXF1aXJlZEV4cHJlc3Npb24iLCJudWxsYWJsZSIsInVuZGVmaW5lZCIsInNldERhdGEiLCJnZXRJbnB1dFR5cGVGb3JDb2x1bW4iLCJvQ29sdW1uIiwiZ2V0VGVtcGxhdGUiLCJnZXRDb250ZW50IiwiZ2V0Q29udGVudEVkaXQiLCJnZXRNZXRhZGF0YSIsImdldE5hbWUiLCJhQ29sdW1ucyIsImdldENvbHVtbnMiLCJtYXAiLCJzRGF0YVByb3BlcnR5IiwiZ2V0RGF0YVByb3BlcnR5IiwiYVJlYWx0ZWRDb2x1bW5JbmZvIiwiY3VzdG9tRGF0YSIsImdldEhlYWRlciIsImdldERlZmF1bHRUZXh0c0ZvckRpYWxvZyIsIm9SZXNvdXJjZUJ1bmRsZSIsImlTZWxlY3RlZENvbnRleHRzIiwiYkRpc3BsYXlNb2RlIiwiZ2V0VGV4dCIsInRvU3RyaW5nIiwiZ2V0U3VmZml4Rm9yS2VlcEV4aXNpdGluZyIsInNJbnB1dFR5cGUiLCJzUmVzdWx0Iiwic2V0RGVmYXVsdFZhbHVlc1RvRGlhbG9nIiwib0RlZmF1bHRWYWx1ZXMiLCJiVU9NRmllbGQiLCJiUHJvcGVydHlSZXF1aXJlZCIsImlzRmllbGRSZXF1aXJlZCIsInNTdWZmaXhGb3JLZWVwRXhpc3RpbmciLCJiVmFsdWVFeGlzdHNGb3JQcm9wZXJ0eVBhdGgiLCJ1bnNoaWZ0IiwidGV4dCIsImNsZWFyRmllbGRWYWx1ZSIsImtleSIsImxlYXZlQmxhbmtWYWx1ZSIsImtlZXBFeGlzdGluZ1ByZWZpeCIsImdldFRleHRBcnJhbmdlbWVudEluZm8iLCJzUHJvcGVydHkiLCJzQ3VycmVudEVudGl0eVNldCIsInNEaXNwbGF5TW9kZSIsIkNvbW1vblV0aWxzIiwiY29tcHV0ZURpc3BsYXlNb2RlIiwic0Rlc2NyaXB0aW9uUGF0aCIsInNEZXNjcmlwdGlvblZhbHVlIiwic0Z1bGxUZXh0IiwicGF0aCIsInBhcmFtZXRlcnMiLCJvUHJvcHMiLCJzZXRSdW50aW1lTW9kZWxPbkRpYWxvZyIsImFVbml0RGF0YSIsImFSZXN1bHRzIiwiYVJlYWRPbmx5RmllbGRJbmZvIiwib0Rpc3RpbmN0VmFsdWVNYXAiLCJzUHJvcGVydHlOYW1lIiwib0RhdGEiLCJvVGV4dEluZm8iLCJzUHJvcGVydHlLZXkiLCJpIiwic011bHRpTGV2ZWxQYXRoVmFsdWUiLCJ0ZXh0QmluZGluZyIsImVudGl0eVNldCIsImZ1bGxUZXh0IiwidW5pdFByb3BlcnR5Iiwic011bHRpTGV2ZWxQcm9wUGF0aFZhbHVlIiwiYkNsZWFyRmllbGRPckJsYW5rVmFsdWVFeGlzdHMiLCJvYmoiLCJiQ2xlYXJGaWVsZE9yQmxhbmtVbml0VmFsdWVFeGlzdHMiLCJpc1Byb3BlcnR5UmVhZE9ubHkiLCJ2YWx1ZSIsIm9wZXJhbmRzIiwib3BlcmFuZDEiLCJvcGVyYW5kMiIsInByb3BlcnR5UGF0aCIsInByb3BlcnR5VmFsdWUiLCJvRGlhbG9nRGF0YU1vZGVsIiwiY3JlYXRlRGlhbG9nIiwib0NvbnRyb2xsZXIiLCJzRnJhZ21lbnROYW1lIiwic2FwIiwidWkiLCJnZXRDb3JlIiwiZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJvRnJhZ21lbnQiLCJYTUxUZW1wbGF0ZVByb2Nlc3NvciIsImxvYWRUZW1wbGF0ZSIsIlhNTFByZXByb2Nlc3NvciIsInByb2Nlc3MiLCJiaW5kaW5nQ29udGV4dHMiLCJkYXRhRmllbGRNb2RlbCIsImNyZWF0ZUJpbmRpbmdDb250ZXh0IiwibW9kZWxzIiwidGhlbiIsIkZyYWdtZW50IiwibG9hZCIsImRlZmluaXRpb24iLCJvRGlhbG9nQ29udGVudCIsIm9EaWFsb2ciLCJEaWFsb2ciLCJ0aXRsZSIsIm1hc3NFZGl0VGl0bGUiLCJjb250ZW50IiwiYmVnaW5CdXR0b24iLCJCdXR0b24iLCJhcHBseUJ1dHRvblRleHQiLCJwcmVzcyIsIm9FdmVudCIsImdldFNvdXJjZSIsImdldFBhcmVudCIsIm9Nb2RlbCIsImFQcm9wZXJ0eVJlYWRhYmxlSW5mbyIsImNoYW5nZVByb21pc2UiLCJiUmVhZE9ubHlGaWVsZCIsImtleVZhbHVlIiwicHJvcGVydHkiLCJzZXRQcm9wZXJ0eSIsImFsbCIsIm9SZXMiLCJvTGlzdEJpbmRpbmciLCJnZXRSb3dCaW5kaW5nIiwib0V4dGVuc2lvbkFQSSIsImdldEV4dGVuc2lvbkFQSSIsInJlZnJlc2giLCJjbG9zZSIsImRlc3Ryb3kiLCJjYXRjaCIsIm9FcnJvciIsIkxvZyIsImVycm9yIiwiZW5kQnV0dG9uIiwiY2FuY2VsQnV0dG9uVGV4dCIsInNldE1vZGVsIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUF3QkEsTUFBTUEsZUFBZSxHQUFHLENBQ3ZC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T0F4Rk0sQ0FBUDtBQXlGQTtBQS9vQnFCLEdBQXZCO1NBa3BCZXhMLGMiLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBEaWFsb2cgZnJvbSBcInNhcC9tL0RpYWxvZ1wiO1xuaW1wb3J0IFhNTFRlbXBsYXRlUHJvY2Vzc29yIGZyb20gXCJzYXAvdWkvY29yZS9YTUxUZW1wbGF0ZVByb2Nlc3NvclwiO1xuaW1wb3J0IEpTT05Nb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL2pzb24vSlNPTk1vZGVsXCI7XG5pbXBvcnQgRnJhZ21lbnQgZnJvbSBcInNhcC91aS9jb3JlL0ZyYWdtZW50XCI7XG5pbXBvcnQgWE1MUHJlcHJvY2Vzc29yIGZyb20gXCJzYXAvdWkvY29yZS91dGlsL1hNTFByZXByb2Nlc3NvclwiO1xuaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgQ29tbW9uVXRpbHMgZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgVGFibGUgZnJvbSBcInNhcC91aS9tZGMvVGFibGVcIjtcbmltcG9ydCBSZXNvdXJjZUJ1bmRsZSBmcm9tIFwic2FwL2Jhc2UvaTE4bi9SZXNvdXJjZUJ1bmRsZVwiO1xuaW1wb3J0IEJ1dHRvbiBmcm9tIFwic2FwL20vQnV0dG9uXCI7XG5pbXBvcnQgUGFnZUNvbnRyb2xsZXIgZnJvbSBcInNhcC9mZS9jb3JlL1BhZ2VDb250cm9sbGVyXCI7XG5pbXBvcnQgeyBjb252ZXJ0TWV0YU1vZGVsQ29udGV4dCwgZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzIH0gZnJvbSBcIi4uL2NvbnZlcnRlcnMvTWV0YU1vZGVsQ29udmVydGVyXCI7XG5pbXBvcnQgeyBnZXRUZXh0QmluZGluZyB9IGZyb20gXCJzYXAvZmUvbWFjcm9zL2ZpZWxkL0ZpZWxkVGVtcGxhdGluZ1wiO1xuaW1wb3J0IHsgZ2V0RWRpdGFibGVFeHByZXNzaW9uLCBnZXRSZXF1aXJlZEV4cHJlc3Npb24gfSBmcm9tIFwiLi4vdGVtcGxhdGluZy9VSUZvcm1hdHRlcnNcIjtcbmltcG9ydCB7IGlzUmVhZE9ubHlFeHByZXNzaW9uIH0gZnJvbSBcIi4uL3RlbXBsYXRpbmcvRmllbGRDb250cm9sSGVscGVyXCI7XG5pbXBvcnQgeyBoYXNWYWx1ZUhlbHBXaXRoRml4ZWRWYWx1ZXMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9Qcm9wZXJ0eUhlbHBlclwiO1xuXG4vKiBUaGlzIGNsYXNzIGNvbnRhaW5zIGhlbHBlcnMgdG8gYmUgdXNlZCBmb3IgbWFzcyBlZGl0IGZ1bmN0aW9uYWxpdHkgKi9cbnR5cGUgVGV4dEFycmFuZ2VtZW50SW5mbyA9IHtcblx0dGV4dEFycmFuZ2VtZW50OiBzdHJpbmc7XG5cdHZhbHVlUGF0aDogc3RyaW5nO1xuXHRkZXNjcmlwdGlvblBhdGg/OiBzdHJpbmc7XG5cdHZhbHVlOiBzdHJpbmc7XG5cdGRlc2NyaXB0aW9uOiBzdHJpbmc7XG5cdGZ1bGxUZXh0OiBzdHJpbmc7XG59O1xuY29uc3QgYVZhbGlkRGF0YVR5cGVzID0gW1xuXHRcIkVkbS5Cb29sZWFuXCIsXG5cdFwiRWRtLkJ5dGVcIixcblx0XCJFZG0uRGVjaW1hbFwiLFxuXHRcIkVkbS5Eb3VibGVcIixcblx0XCJFZG0uRmxvYXRcIixcblx0XCJFZG0uR3VpZFwiLFxuXHRcIkVkbS5JbnQxNlwiLFxuXHRcIkVkbS5JbnQzMlwiLFxuXHRcIkVkbS5JbnQ2NFwiLFxuXHRcIkVkbS5TQnl0ZVwiLFxuXHRcIkVkbS5TaW5nbGVcIixcblx0XCJFZG0uU3RyaW5nXCJcbl07XG5jb25zdCBNYXNzRWRpdEhlbHBlciA9IHtcblx0LyoqXG5cdCAqIEluaXRpYWxpemVzIHRoZSB2YWx1ZSBhdCBmaW5hbCBvciBkZWVwZXN0IGxldmVsIHBhdGggd2l0aCBhIGJsYW5rIGFycmF5LlxuXHQgKiBSZXR1cm4gYW4gZW1wdHkgYXJyYXkgcG9pbnRpbmcgdG8gdGhlIGZpbmFsIG9yIGRlZXBlc3QgbGV2ZWwgcGF0aC5cblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNQYXRoIFByb3BlcnR5IHBhdGhcblx0ICogQHBhcmFtIHtBcnJheX0gYVZhbHVlcyBBcnJheSBpbnN0YW5jZSB3aGVyZSB0aGUgZGVmYXVsdCBkYXRhIG5lZWRzIHRvIGJlIGFkZGVkXG5cdCAqIEByZXR1cm5zIHtBcnJheX1cblx0ICovXG5cdGluaXRMYXN0TGV2ZWxPZlByb3BlcnR5UGF0aDogZnVuY3Rpb24oc1BhdGg6IHN0cmluZywgYVZhbHVlczogYW55KSB7XG5cdFx0bGV0IGFGaW5hbFBhdGg6IGFueTtcblx0XHRsZXQgaW5kZXggPSAwO1xuXHRcdGNvbnN0IGFQYXRocyA9IHNQYXRoLnNwbGl0KFwiL1wiKTtcblx0XHRsZXQgc0Z1bGxQYXRoID0gXCJcIjtcblx0XHRhUGF0aHMuZm9yRWFjaChmdW5jdGlvbihzUHJvcGVydHlQYXRoOiBzdHJpbmcpIHtcblx0XHRcdGlmICghYVZhbHVlc1tzUHJvcGVydHlQYXRoXSAmJiBpbmRleCA9PT0gMCkge1xuXHRcdFx0XHRhVmFsdWVzW3NQcm9wZXJ0eVBhdGhdID0ge307XG5cdFx0XHRcdGFGaW5hbFBhdGggPSBhVmFsdWVzW3NQcm9wZXJ0eVBhdGhdO1xuXHRcdFx0XHRzRnVsbFBhdGggPSBzRnVsbFBhdGggKyBzUHJvcGVydHlQYXRoO1xuXHRcdFx0XHRpbmRleCsrO1xuXHRcdFx0fSBlbHNlIGlmICghYUZpbmFsUGF0aFtzUHJvcGVydHlQYXRoXSkge1xuXHRcdFx0XHRzRnVsbFBhdGggPSBzRnVsbFBhdGggKyBcIi9cIiArIHNQcm9wZXJ0eVBhdGg7XG5cdFx0XHRcdGlmIChzRnVsbFBhdGggIT09IHNQYXRoKSB7XG5cdFx0XHRcdFx0YUZpbmFsUGF0aFtzUHJvcGVydHlQYXRoXSA9IHt9O1xuXHRcdFx0XHRcdGFGaW5hbFBhdGggPSBhRmluYWxQYXRoW3NQcm9wZXJ0eVBhdGhdO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGFGaW5hbFBhdGhbc1Byb3BlcnR5UGF0aF0gPSBbXTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdHJldHVybiBhRmluYWxQYXRoO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBNZXRob2QgdG8gZ2V0IHVuaXF1ZSB2YWx1ZXMgZm9yIGdpdmVuIGFycmF5IHZhbHVlcy5cblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNWYWx1ZSBQcm9wZXJ0eSB2YWx1ZVxuXHQgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggSW5kZXggb2YgdGhlIHByb3BlcnR5IHZhbHVlXG5cdCAqIEBwYXJhbSB7QXJyYXl9IHNlbGYgSW5zdGFuY2Ugb2YgdGhlIGFycmF5XG5cdCAqIEByZXR1cm5zIHtib29sZWFufVxuXHQgKi9cblx0Z2V0VW5pcXVlVmFsdWVzOiBmdW5jdGlvbihzVmFsdWU6IHN0cmluZywgaW5kZXg6IG51bWJlciwgc2VsZjogYW55W10pIHtcblx0XHRpZiAoc1ZhbHVlKSB7XG5cdFx0XHRyZXR1cm4gc2VsZi5pbmRleE9mKHNWYWx1ZSkgPT09IGluZGV4O1xuXHRcdH1cblx0fSxcblxuXHQvKipcblx0ICogR2V0cyB0aGUgcHJvcGVydHkgdmFsdWUgZm9yIGEgbXVsdGktbGV2ZWwgcGF0aCAoZm9yIGV4YW1wbGU6IF9NYXRlcmlhbHMvTWF0ZXJpYWxfRGV0YWlscyBnZXRzIHRoZSB2YWx1ZSBvZiBNYXRlcmlhbF9EZXRhaWxzIHVuZGVyIF9NYXRlcmlhbHMgT2JqZWN0KS5cblx0ICogUmV0dXJucyB0aGUgcHJvcGVydHlWYWx1ZSwgd2hpY2ggY2FuIGJlIG9mIGFueSB0eXBlIChzdHJpbmcsIG51bWJlciwgZXRjLi4pLlxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc0RhdGFQcm9wZXJ0eVBhdGggUHJvcGVydHkgcGF0aFxuXHQgKiBAcGFyYW0ge29iamVjdH0gb1ZhbHVlcyBPYmplY3Qgb2YgcHJvcGVydHkgdmFsdWVzXG5cdCAqIEByZXR1cm5zIHsqfVxuXHQgKi9cblx0Z2V0VmFsdWVGb3JNdWx0aUxldmVsUGF0aDogZnVuY3Rpb24oc0RhdGFQcm9wZXJ0eVBhdGg6IHN0cmluZywgb1ZhbHVlczogYW55KSB7XG5cdFx0aWYgKHNEYXRhUHJvcGVydHlQYXRoICYmIHNEYXRhUHJvcGVydHlQYXRoLmluZGV4T2YoXCIvXCIpID4gMCkge1xuXHRcdFx0Y29uc3QgYVByb3BlcnR5UGF0aHMgPSBzRGF0YVByb3BlcnR5UGF0aC5zcGxpdChcIi9cIik7XG5cdFx0XHRsZXQgUmVzdWx0OiBhbnk7XG5cdFx0XHRhUHJvcGVydHlQYXRocy5mb3JFYWNoKGZ1bmN0aW9uKHNQYXRoOiBzdHJpbmcpIHtcblx0XHRcdFx0UmVzdWx0ID0gb1ZhbHVlcyAmJiBvVmFsdWVzW3NQYXRoXSA/IG9WYWx1ZXNbc1BhdGhdIDogUmVzdWx0ICYmIFJlc3VsdFtzUGF0aF07XG5cdFx0XHR9KTtcblx0XHRcdHJldHVybiBSZXN1bHQ7XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBrZXkgcGF0aCBmb3IgdGhlIGtleSBvZiBhIGNvbWJvIGJveCB0aGF0IG11c3QgYmUgc2VsZWN0ZWQgaW5pdGlhbGx5IHdoZW4gdGhlIGRpYWxvZyBvcGVuczpcblx0ICogPT4gSWYgcHJvcGVydHlWYWx1ZSBmb3IgYWxsIHNlbGVjdGVkIGNvbnRleHRzIGlzIGRpZmZlcmVudCwgdGhlbiA8IEtlZXAgRXhpc3RpbmcgVmFsdWVzID4gaXMgcHJlc2VsZWN0ZWQuXG5cdCAqID0+IElmIHByb3BlcnR5VmFsdWUgZm9yIGFsbCBzZWxlY3RlZCBjb250ZXh0cyBpcyB0aGUgc2FtZSwgdGhlbiB0aGUgcHJvcGVydHlWYWx1ZSBpcyBwcmVzZWxlY3RlZC5cblx0ICogPT4gSWYgcHJvcGVydHlWYWx1ZSBmb3IgYWxsIHNlbGVjdGVkIGNvbnRleHRzIGlzIGVtcHR5LCB0aGVuIDwgTGVhdmUgQmxhbmsgPiBpcyBwcmVzZWxlY3RlZC5cblx0ICpcblx0ICpcblx0ICogQHBhcmFtIHtBcnJheX0gYUNvbnRleHRzIENvbnRleHRzIGZvciBtYXNzIGVkaXRcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNEYXRhUHJvcGVydHlQYXRoIERhdGEgcHJvcGVydHkgcGF0aFxuXHQgKiBAcmV0dXJucyB7c3RyaW5nfVxuXHQgKi9cblx0Z2V0RGVmYXVsdFNlbGVjdGlvblBhdGhDb21ib0JveDogZnVuY3Rpb24oYUNvbnRleHRzOiBhbnlbXSwgc0RhdGFQcm9wZXJ0eVBhdGg6IHN0cmluZykge1xuXHRcdGlmIChzRGF0YVByb3BlcnR5UGF0aCAmJiBhQ29udGV4dHMubGVuZ3RoID4gMCkge1xuXHRcdFx0Y29uc3Qgb1NlbGVjdGVkQ29udGV4dCA9IGFDb250ZXh0cyxcblx0XHRcdFx0YVByb3BlcnR5VmFsdWVzOiBhbnlbXSA9IFtdO1xuXHRcdFx0b1NlbGVjdGVkQ29udGV4dC5mb3JFYWNoKGZ1bmN0aW9uKG9Db250ZXh0OiBhbnkpIHtcblx0XHRcdFx0Y29uc3Qgb0RhdGFPYmplY3QgPSBvQ29udGV4dC5nZXRPYmplY3QoKTtcblx0XHRcdFx0Y29uc3Qgc011bHRpTGV2ZWxQYXRoQ29uZGl0aW9uID1cblx0XHRcdFx0XHRzRGF0YVByb3BlcnR5UGF0aC5pbmRleE9mKFwiL1wiKSA+IC0xICYmIG9EYXRhT2JqZWN0Lmhhc093blByb3BlcnR5KHNEYXRhUHJvcGVydHlQYXRoLnNwbGl0KFwiL1wiKVswXSk7XG5cdFx0XHRcdGlmIChvQ29udGV4dCAmJiAob0RhdGFPYmplY3QuaGFzT3duUHJvcGVydHkoc0RhdGFQcm9wZXJ0eVBhdGgpIHx8IHNNdWx0aUxldmVsUGF0aENvbmRpdGlvbikpIHtcblx0XHRcdFx0XHRhUHJvcGVydHlWYWx1ZXMucHVzaChvQ29udGV4dC5nZXRPYmplY3Qoc0RhdGFQcm9wZXJ0eVBhdGgpKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0XHRjb25zdCBhVW5pcXVlUHJvcGVydHlWYWx1ZXMgPSBhUHJvcGVydHlWYWx1ZXMuZmlsdGVyKE1hc3NFZGl0SGVscGVyLmdldFVuaXF1ZVZhbHVlcyk7XG5cdFx0XHRpZiAoYVVuaXF1ZVByb3BlcnR5VmFsdWVzLmxlbmd0aCA+IDEpIHtcblx0XHRcdFx0cmV0dXJuIFwiRGVmYXVsdC9cIiArIHNEYXRhUHJvcGVydHlQYXRoO1xuXHRcdFx0fSBlbHNlIGlmIChhVW5pcXVlUHJvcGVydHlWYWx1ZXMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRcdHJldHVybiBcIkVtcHR5L1wiICsgc0RhdGFQcm9wZXJ0eVBhdGg7XG5cdFx0XHR9IGVsc2UgaWYgKGFVbmlxdWVQcm9wZXJ0eVZhbHVlcy5sZW5ndGggPT09IDEpIHtcblx0XHRcdFx0cmV0dXJuIHNEYXRhUHJvcGVydHlQYXRoO1xuXHRcdFx0fVxuXHRcdH1cblx0fSxcblxuXHQvKipcblx0ICogQ2hlY2tzIGhpZGRlbiBhbm5vdGF0aW9uIHZhbHVlIFtib3RoIHN0YXRpYyBhbmQgcGF0aCBiYXNlZF0gZm9yIHRhYmxlJ3Mgc2VsZWN0ZWQgY29udGV4dC5cblx0ICpcblx0ICogQHBhcmFtIHsqfSBoaWRkZW5WYWx1ZSBIaWRkZW4gYW5ub3RhdGlvbiB2YWx1ZSAvIHBhdGggZm9yIGZpZWxkXG5cdCAqIEBwYXJhbSB7QXJyYXl9IGFDb250ZXh0cyBDb250ZXh0cyBmb3IgbWFzcyBlZGl0XG5cdCAqIEByZXR1cm5zIHtib29sZWFufVxuXHQgKi9cblx0Z2V0SGlkZGVuVmFsdWVGb3JDb250ZXh0czogZnVuY3Rpb24oaGlkZGVuVmFsdWU6IGFueSwgYUNvbnRleHRzOiBhbnlbXSkge1xuXHRcdGlmIChoaWRkZW5WYWx1ZSAmJiBoaWRkZW5WYWx1ZS4kUGF0aCkge1xuXHRcdFx0cmV0dXJuICFhQ29udGV4dHMuc29tZShmdW5jdGlvbihvU2VsZWN0ZWRDb250ZXh0OiBhbnkpIHtcblx0XHRcdFx0cmV0dXJuIG9TZWxlY3RlZENvbnRleHQuZ2V0T2JqZWN0KGhpZGRlblZhbHVlLiRQYXRoKSA9PT0gZmFsc2U7XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0cmV0dXJuIGhpZGRlblZhbHVlO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBJbml0aWFsaXplcyBhIEpTT04gTW9kZWwgZm9yIHByb3BlcnRpZXMgb2YgZGlhbG9nIGZpZWxkcyBbbGFiZWwsIHZpc2libGl0eSwgZGF0YXByb3BlcnR5LCBldGMuXS5cblx0ICpcblx0ICogQHBhcmFtIHtvYmplY3R9IG9UYWJsZSBJbnN0YW5jZSBvZiBUYWJsZVxuXHQgKiBAcGFyYW0ge0FycmF5fSBhQ29udGV4dHMgQ29udGV4dHMgZm9yIG1hc3MgZWRpdFxuXHQgKiBAcGFyYW0ge0FycmF5fSBhRGF0YUFycmF5IEFycmF5IGNvbnRhaW5pbmcgZGF0YSByZWxhdGVkIHRvIHRoZSBkaWFsb2cgdXNlZCBieSBib3RoIHRoZSBzdGF0aWMgYW5kIHRoZSBydW50aW1lIG1vZGVsXG5cdCAqIEByZXR1cm5zIHtvYmplY3R9XG5cdCAqL1xuXHRwcmVwYXJlRGF0YUZvckRpYWxvZzogZnVuY3Rpb24ob1RhYmxlOiBUYWJsZSwgYUNvbnRleHRzOiBhbnlbXSwgYURhdGFBcnJheTogYW55W10pIHtcblx0XHRjb25zdCBvTWV0YU1vZGVsID0gb1RhYmxlICYmIChvVGFibGUuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKSBhcyBhbnkpLFxuXHRcdFx0c0N1cnJlbnRFbnRpdHlTZXROYW1lID0gb1RhYmxlLmRhdGEoXCJtZXRhUGF0aFwiKSxcblx0XHRcdGFUYWJsZUZpZWxkcyA9IE1hc3NFZGl0SGVscGVyLmdldFRhYmxlRmllbGRzKG9UYWJsZSksXG5cdFx0XHRvRW50aXR5VHlwZUNvbnRleHQgPSBvTWV0YU1vZGVsLmdldENvbnRleHQoc0N1cnJlbnRFbnRpdHlTZXROYW1lICsgXCIvQFwiKSxcblx0XHRcdG9EYXRhTW9kZWxPYmplY3RQYXRoID0gZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzKG9FbnRpdHlUeXBlQ29udGV4dCk7XG5cblx0XHRjb25zdCBvRGF0YUZpZWxkTW9kZWwgPSBuZXcgSlNPTk1vZGVsKCk7XG5cdFx0bGV0IG9SZXN1bHQ7XG5cdFx0bGV0IHNMYWJlbFRleHQ7XG5cdFx0bGV0IGJWYWx1ZUhlbHBFbmFibGVkO1xuXHRcdGxldCBzVW5pdFByb3BlcnR5UGF0aDtcblx0XHRsZXQgYlZhbHVlSGVscEVuYWJsZWRGb3JVbml0O1xuXHRcdGxldCBiSXNJbW11dGFibGU7XG5cdFx0bGV0IGJJc0NvbXB1dGVkO1xuXHRcdGxldCBiQ2hhcnRQcm9wZXJ0eTtcblx0XHRsZXQgb1RleHRCaW5kaW5nO1xuXHRcdGxldCBiVmFsaWREYXRhVHlwZTtcblx0XHRsZXQgYkluVmFsaWRJbnB1dFR5cGU7XG5cblx0XHRhVGFibGVGaWVsZHMuZm9yRWFjaChmdW5jdGlvbihvQ29sdW1uSW5mbzogYW55KSB7XG5cdFx0XHRjb25zdCBzRGF0YVByb3BlcnR5UGF0aCA9IG9Db2x1bW5JbmZvLmRhdGFQcm9wZXJ0eTtcblx0XHRcdGlmIChzRGF0YVByb3BlcnR5UGF0aCkge1xuXHRcdFx0XHRsZXQgb1Byb3BlcnR5SW5mbyA9IHNEYXRhUHJvcGVydHlQYXRoICYmIG9NZXRhTW9kZWwuZ2V0T2JqZWN0KHNDdXJyZW50RW50aXR5U2V0TmFtZSArIFwiL1wiICsgc0RhdGFQcm9wZXJ0eVBhdGggKyBcIkBcIik7XG5cdFx0XHRcdGJWYWx1ZUhlbHBFbmFibGVkID1cblx0XHRcdFx0XHRzRGF0YVByb3BlcnR5UGF0aCAmJlxuXHRcdFx0XHRcdG9NZXRhTW9kZWwuZ2V0T2JqZWN0KHNDdXJyZW50RW50aXR5U2V0TmFtZSArIFwiL1wiICsgc0RhdGFQcm9wZXJ0eVBhdGggKyBcIkBcIikgJiZcblx0XHRcdFx0XHRvTWV0YU1vZGVsLmdldE9iamVjdChzQ3VycmVudEVudGl0eVNldE5hbWUgKyBcIi9cIiArIHNEYXRhUHJvcGVydHlQYXRoICsgXCJAXCIpW1xuXHRcdFx0XHRcdFx0XCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLlZhbHVlTGlzdFwiXG5cdFx0XHRcdFx0XTtcblx0XHRcdFx0c1VuaXRQcm9wZXJ0eVBhdGggPVxuXHRcdFx0XHRcdChvUHJvcGVydHlJbmZvICYmIG9Qcm9wZXJ0eUluZm9bXCJAT3JnLk9EYXRhLk1lYXN1cmVzLlYxLlVuaXRcIl0gJiYgb1Byb3BlcnR5SW5mb1tcIkBPcmcuT0RhdGEuTWVhc3VyZXMuVjEuVW5pdFwiXS4kUGF0aCkgfHxcblx0XHRcdFx0XHQob1Byb3BlcnR5SW5mbyAmJlxuXHRcdFx0XHRcdFx0b1Byb3BlcnR5SW5mb1tcIkBPcmcuT0RhdGEuTWVhc3VyZXMuVjEuSVNPQ3VycmVuY3lcIl0gJiZcblx0XHRcdFx0XHRcdG9Qcm9wZXJ0eUluZm9bXCJAT3JnLk9EYXRhLk1lYXN1cmVzLlYxLklTT0N1cnJlbmN5XCJdLiRQYXRoKTtcblx0XHRcdFx0c0xhYmVsVGV4dCA9IG9Db2x1bW5JbmZvLmxhYmVsIHx8IChvUHJvcGVydHlJbmZvICYmIG9Qcm9wZXJ0eUluZm9bXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkxhYmVsXCJdKTtcblx0XHRcdFx0YlZhbHVlSGVscEVuYWJsZWRGb3JVbml0ID1cblx0XHRcdFx0XHRzVW5pdFByb3BlcnR5UGF0aCAmJlxuXHRcdFx0XHRcdG9NZXRhTW9kZWwuZ2V0T2JqZWN0KHNDdXJyZW50RW50aXR5U2V0TmFtZSArIFwiL1wiICsgc1VuaXRQcm9wZXJ0eVBhdGggKyBcIkBcIikgJiZcblx0XHRcdFx0XHRvTWV0YU1vZGVsLmdldE9iamVjdChzQ3VycmVudEVudGl0eVNldE5hbWUgKyBcIi9cIiArIHNVbml0UHJvcGVydHlQYXRoICsgXCJAXCIpW1xuXHRcdFx0XHRcdFx0XCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLlZhbHVlTGlzdFwiXG5cdFx0XHRcdFx0XTtcblx0XHRcdFx0aWYgKG9EYXRhTW9kZWxPYmplY3RQYXRoKSB7XG5cdFx0XHRcdFx0b0RhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0T2JqZWN0ID0gb0RhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0RW50aXR5VHlwZS5lbnRpdHlQcm9wZXJ0aWVzLmZpbHRlcihmdW5jdGlvbihcblx0XHRcdFx0XHRcdG9Qcm9wZXJ0eTogYW55XG5cdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gb1Byb3BlcnR5Lm5hbWUgPT09IHNEYXRhUHJvcGVydHlQYXRoO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdG9EYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldE9iamVjdCA9IG9EYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldE9iamVjdFswXSB8fCB7fTtcblx0XHRcdFx0b1RleHRCaW5kaW5nID0gZ2V0VGV4dEJpbmRpbmcob0RhdGFNb2RlbE9iamVjdFBhdGgsIHt9LCB0cnVlKSB8fCB7fTtcblx0XHRcdFx0Y29uc3Qgb0ZpZWxkQ29udGV4dCA9IG9NZXRhTW9kZWwuZ2V0Q29udGV4dChvQ29sdW1uSW5mby5hbm5vdGF0aW9uUGF0aCksXG5cdFx0XHRcdFx0b0RhdGFGaWVsZENvbnZlcnRlZCA9IGNvbnZlcnRNZXRhTW9kZWxDb250ZXh0KG9GaWVsZENvbnRleHQpLFxuXHRcdFx0XHRcdG9Qcm9wZXJ0eUNvbnRleHQgPSBvTWV0YU1vZGVsLmdldENvbnRleHQoc0N1cnJlbnRFbnRpdHlTZXROYW1lICsgXCIvXCIgKyBzRGF0YVByb3BlcnR5UGF0aCArIFwiQFwiKSxcblx0XHRcdFx0XHRvSW50ZXJmYWNlID0gb1Byb3BlcnR5Q29udGV4dCAmJiBvUHJvcGVydHlDb250ZXh0LmdldEludGVyZmFjZSgpO1xuXHRcdFx0XHRiSXNJbW11dGFibGUgPVxuXHRcdFx0XHRcdG9Qcm9wZXJ0eUNvbnRleHQgJiYgb1Byb3BlcnR5Q29udGV4dC5nZXRQcm9wZXJ0eSgpICYmIG9Qcm9wZXJ0eUNvbnRleHQuZ2V0UHJvcGVydHkoKVtcIkBPcmcuT0RhdGEuQ29yZS5WMS5JbW11dGFibGVcIl07XG5cdFx0XHRcdGJJc0NvbXB1dGVkID1cblx0XHRcdFx0XHRvUHJvcGVydHlDb250ZXh0ICYmIG9Qcm9wZXJ0eUNvbnRleHQuZ2V0UHJvcGVydHkoKSAmJiBvUHJvcGVydHlDb250ZXh0LmdldFByb3BlcnR5KClbXCJAT3JnLk9EYXRhLkNvcmUuVjEuQ29tcHV0ZWRcIl07XG5cdFx0XHRcdGNvbnN0IGJIaWRkZW5GaWVsZCA9XG5cdFx0XHRcdFx0TWFzc0VkaXRIZWxwZXIuZ2V0SGlkZGVuVmFsdWVGb3JDb250ZXh0cyhcblx0XHRcdFx0XHRcdG9GaWVsZENvbnRleHQgJiYgb0ZpZWxkQ29udGV4dC5nZXRPYmplY3QoKVtcIkBjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5IaWRkZW5cIl0sXG5cdFx0XHRcdFx0XHRhQ29udGV4dHNcblx0XHRcdFx0XHQpIHx8IGZhbHNlO1xuXHRcdFx0XHRvSW50ZXJmYWNlLmNvbnRleHQgPSB7XG5cdFx0XHRcdFx0Z2V0TW9kZWw6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIG9JbnRlcmZhY2UuZ2V0TW9kZWwoKTtcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdGdldFBhdGg6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHNDdXJyZW50RW50aXR5U2V0TmFtZSArIFwiL1wiICsgc0RhdGFQcm9wZXJ0eVBhdGg7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9O1xuXHRcdFx0XHRvUHJvcGVydHlJbmZvID1cblx0XHRcdFx0XHQob0RhdGFGaWVsZENvbnZlcnRlZCAmJiBvRGF0YUZpZWxkQ29udmVydGVkLlZhbHVlICYmIG9EYXRhRmllbGRDb252ZXJ0ZWQuVmFsdWUuJHRhcmdldCkgfHxcblx0XHRcdFx0XHQob0RhdGFGaWVsZENvbnZlcnRlZCAmJiBvRGF0YUZpZWxkQ29udmVydGVkLlRhcmdldCAmJiBvRGF0YUZpZWxkQ29udmVydGVkLlRhcmdldC4kdGFyZ2V0KTtcblx0XHRcdFx0Ly8gRGF0YWZpZWxkIGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgRmllbGRDb250cm9sIGNhbGN1bGF0aW9uLCBuZWVkcyB0byBiZSBpbXBsZW1lbnRlZFxuXHRcdFx0XHRjb25zdCBpc1JlYWRPbmx5ID0gaXNSZWFkT25seUV4cHJlc3Npb24ob1Byb3BlcnR5SW5mbyk7XG5cdFx0XHRcdGJDaGFydFByb3BlcnR5ID0gb1Byb3BlcnR5SW5mbyAmJiBvUHJvcGVydHlJbmZvLnRlcm0gJiYgb1Byb3BlcnR5SW5mby50ZXJtID09PSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkNoYXJ0XCI7XG5cdFx0XHRcdGJWYWxpZERhdGFUeXBlID0gb1Byb3BlcnR5SW5mbyAmJiBhVmFsaWREYXRhVHlwZXMuaW5kZXhPZihvUHJvcGVydHlJbmZvLnR5cGUpICE9PSAtMTtcblx0XHRcdFx0YkluVmFsaWRJbnB1dFR5cGUgPVxuXHRcdFx0XHRcdChvQ29sdW1uSW5mbyAmJlxuXHRcdFx0XHRcdFx0b0NvbHVtbkluZm8uaW5wdXRUeXBlICYmXG5cdFx0XHRcdFx0XHQob0NvbHVtbkluZm8uaW5wdXRUeXBlID09PSBcInNhcC5tLlJhdGluZ0luZGljYXRvclwiIHx8IG9Db2x1bW5JbmZvLmlucHV0VHlwZSA9PT0gXCJzYXAudWkubWRjLk11bHRpVmFsdWVGaWVsZFwiKSkgfHxcblx0XHRcdFx0XHRoYXNWYWx1ZUhlbHBXaXRoRml4ZWRWYWx1ZXMob1Byb3BlcnR5SW5mbyk7XG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHRzRGF0YVByb3BlcnR5UGF0aCAmJlxuXHRcdFx0XHRcdCFiSGlkZGVuRmllbGQgJiZcblx0XHRcdFx0XHQhYklzSW1tdXRhYmxlICYmXG5cdFx0XHRcdFx0IWJJc0NvbXB1dGVkICYmXG5cdFx0XHRcdFx0IWJDaGFydFByb3BlcnR5ICYmXG5cdFx0XHRcdFx0YlZhbGlkRGF0YVR5cGUgJiZcblx0XHRcdFx0XHQhYkluVmFsaWRJbnB1dFR5cGUgJiZcblx0XHRcdFx0XHRvQ29sdW1uSW5mby5pbnB1dFR5cGUgJiZcblx0XHRcdFx0XHRnZXRFZGl0YWJsZUV4cHJlc3Npb24ob1Byb3BlcnR5SW5mbywgb0RhdGFGaWVsZENvbnZlcnRlZCwgb0RhdGFNb2RlbE9iamVjdFBhdGgpICE9PSBcImZhbHNlXCJcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0b1Jlc3VsdCA9IHtcblx0XHRcdFx0XHRcdFwibGFiZWxcIjogc0xhYmVsVGV4dCArIFwiOlwiLFxuXHRcdFx0XHRcdFx0XCJ2aXNpYmxlXCI6XG5cdFx0XHRcdFx0XHRcdHNEYXRhUHJvcGVydHlQYXRoICYmXG5cdFx0XHRcdFx0XHRcdCFiSGlkZGVuRmllbGQgJiZcblx0XHRcdFx0XHRcdFx0IWJJc0ltbXV0YWJsZSAmJlxuXHRcdFx0XHRcdFx0XHQhYklzQ29tcHV0ZWQgJiZcblx0XHRcdFx0XHRcdFx0Z2V0RWRpdGFibGVFeHByZXNzaW9uKG9Qcm9wZXJ0eUluZm8sIG9EYXRhRmllbGRDb252ZXJ0ZWQsIG9EYXRhTW9kZWxPYmplY3RQYXRoKSxcblx0XHRcdFx0XHRcdFwiZGF0YVByb3BlcnR5XCI6IHNEYXRhUHJvcGVydHlQYXRoLFxuXHRcdFx0XHRcdFx0XCJpc1ZhbHVlSGVscEVuYWJsZWRcIjogYlZhbHVlSGVscEVuYWJsZWQgPyBiVmFsdWVIZWxwRW5hYmxlZCA6IGZhbHNlLFxuXHRcdFx0XHRcdFx0XCJ1bml0UHJvcGVydHlcIjogc1VuaXRQcm9wZXJ0eVBhdGggPyBzVW5pdFByb3BlcnR5UGF0aCA6IGZhbHNlLFxuXHRcdFx0XHRcdFx0XCJpc1ZhbHVlSGVscEVuYWJsZWRGb3JVbml0XCI6IGJWYWx1ZUhlbHBFbmFibGVkRm9yVW5pdCA/IGJWYWx1ZUhlbHBFbmFibGVkRm9yVW5pdCA6IGZhbHNlLFxuXHRcdFx0XHRcdFx0XCJwcm9wZXJ0eVBhdGhGb3JWYWx1ZUhlbHBcIjogc0N1cnJlbnRFbnRpdHlTZXROYW1lICsgXCIvXCIgKyBzRGF0YVByb3BlcnR5UGF0aCxcblx0XHRcdFx0XHRcdFwicHJvcGVydHlQYXRoRm9yVmFsdWVIZWxwVW5pdFwiOiBzQ3VycmVudEVudGl0eVNldE5hbWUgKyBcIi9cIiArIHNVbml0UHJvcGVydHlQYXRoLFxuXHRcdFx0XHRcdFx0XCJpc0ZpZWxkUmVxdWlyZWRcIjogZ2V0UmVxdWlyZWRFeHByZXNzaW9uKG9Qcm9wZXJ0eUluZm8sIG9EYXRhRmllbGRDb252ZXJ0ZWQsIHRydWUpLFxuXHRcdFx0XHRcdFx0XCJkZWZhdWx0U2VsZWN0aW9uUGF0aFwiOiBzRGF0YVByb3BlcnR5UGF0aFxuXHRcdFx0XHRcdFx0XHQ/IE1hc3NFZGl0SGVscGVyLmdldERlZmF1bHRTZWxlY3Rpb25QYXRoQ29tYm9Cb3goYUNvbnRleHRzLCBzRGF0YVByb3BlcnR5UGF0aClcblx0XHRcdFx0XHRcdFx0OiBmYWxzZSxcblx0XHRcdFx0XHRcdFwiZGVmYXVsdFNlbGVjdGlvblVuaXRQYXRoXCI6IHNVbml0UHJvcGVydHlQYXRoXG5cdFx0XHRcdFx0XHRcdD8gTWFzc0VkaXRIZWxwZXIuZ2V0RGVmYXVsdFNlbGVjdGlvblBhdGhDb21ib0JveChhQ29udGV4dHMsIHNVbml0UHJvcGVydHlQYXRoKVxuXHRcdFx0XHRcdFx0XHQ6IGZhbHNlLFxuXHRcdFx0XHRcdFx0XCJlbnRpdHlTZXRcIjogc0N1cnJlbnRFbnRpdHlTZXROYW1lLFxuXHRcdFx0XHRcdFx0XCJ0ZXh0QmluZGluZ1wiOiBvVGV4dEJpbmRpbmcsXG5cdFx0XHRcdFx0XHRcIm51bGxhYmxlXCI6IG9Qcm9wZXJ0eUluZm8ubnVsbGFibGUgIT09IHVuZGVmaW5lZCA/IG9Qcm9wZXJ0eUluZm8ubnVsbGFibGUgOiB0cnVlLFxuXHRcdFx0XHRcdFx0XCJpc1Byb3BlcnR5UmVhZE9ubHlcIjogaXNSZWFkT25seSAhPT0gdW5kZWZpbmVkID8gaXNSZWFkT25seSA6IGZhbHNlXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRhRGF0YUFycmF5LnB1c2gob1Jlc3VsdCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblx0XHRvRGF0YUZpZWxkTW9kZWwuc2V0RGF0YShhRGF0YUFycmF5KTtcblx0XHRyZXR1cm4gb0RhdGFGaWVsZE1vZGVsO1xuXHR9LFxuXG5cdGdldElucHV0VHlwZUZvckNvbHVtbjogZnVuY3Rpb24ob0NvbHVtbjogYW55KSB7XG5cdFx0cmV0dXJuIChcblx0XHRcdG9Db2x1bW4uZ2V0VGVtcGxhdGUoKS5nZXRDb250ZW50ICYmXG5cdFx0XHRvQ29sdW1uLmdldFRlbXBsYXRlKCkuZ2V0Q29udGVudCgpICYmXG5cdFx0XHRvQ29sdW1uLmdldFRlbXBsYXRlKCkuZ2V0Q29udGVudCgpLmdldENvbnRlbnRFZGl0ICYmXG5cdFx0XHRvQ29sdW1uXG5cdFx0XHRcdC5nZXRUZW1wbGF0ZSgpXG5cdFx0XHRcdC5nZXRDb250ZW50KClcblx0XHRcdFx0LmdldENvbnRlbnRFZGl0KCkgJiZcblx0XHRcdG9Db2x1bW5cblx0XHRcdFx0LmdldFRlbXBsYXRlKClcblx0XHRcdFx0LmdldENvbnRlbnQoKVxuXHRcdFx0XHQuZ2V0Q29udGVudEVkaXQoKVswXSAmJlxuXHRcdFx0b0NvbHVtblxuXHRcdFx0XHQuZ2V0VGVtcGxhdGUoKVxuXHRcdFx0XHQuZ2V0Q29udGVudCgpXG5cdFx0XHRcdC5nZXRDb250ZW50RWRpdCgpWzBdXG5cdFx0XHRcdC5nZXRNZXRhZGF0YSgpXG5cdFx0XHRcdC5nZXROYW1lKClcblx0XHQpO1xuXHR9LFxuXG5cdGdldFRhYmxlRmllbGRzOiBmdW5jdGlvbihvVGFibGU6IGFueSkge1xuXHRcdGNvbnN0IGFDb2x1bW5zID0gKG9UYWJsZSAmJiBvVGFibGUuZ2V0Q29sdW1ucygpKSB8fCBbXTtcblx0XHRyZXR1cm4gYUNvbHVtbnMubWFwKGZ1bmN0aW9uKG9Db2x1bW46IGFueSkge1xuXHRcdFx0Y29uc3Qgc0RhdGFQcm9wZXJ0eSA9IG9Db2x1bW4gJiYgb0NvbHVtbi5nZXREYXRhUHJvcGVydHkoKSxcblx0XHRcdFx0YVJlYWx0ZWRDb2x1bW5JbmZvID1cblx0XHRcdFx0XHRvVGFibGUuZGF0YShcImNvbHVtbnNcIikgJiZcblx0XHRcdFx0XHRvVGFibGUuZGF0YShcImNvbHVtbnNcIikuY3VzdG9tRGF0YS5maWx0ZXIoZnVuY3Rpb24ob0NvbHVtbkluZm86IGFueSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIG9Db2x1bW5JbmZvLm5hbWUgPT09IHNEYXRhUHJvcGVydHkgJiYgb0NvbHVtbkluZm8udHlwZSA9PT0gXCJBbm5vdGF0aW9uXCI7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcImRhdGFQcm9wZXJ0eVwiOiBzRGF0YVByb3BlcnR5LFxuXHRcdFx0XHRcImxhYmVsXCI6IG9Db2x1bW4uZ2V0SGVhZGVyKCksXG5cdFx0XHRcdFwiYW5ub3RhdGlvblBhdGhcIjogYVJlYWx0ZWRDb2x1bW5JbmZvICYmIGFSZWFsdGVkQ29sdW1uSW5mb1swXSAmJiBhUmVhbHRlZENvbHVtbkluZm9bMF0uYW5ub3RhdGlvblBhdGgsXG5cdFx0XHRcdFwiaW5wdXRUeXBlXCI6IE1hc3NFZGl0SGVscGVyLmdldElucHV0VHlwZUZvckNvbHVtbihvQ29sdW1uKVxuXHRcdFx0fTtcblx0XHR9KTtcblx0fSxcblxuXHRnZXREZWZhdWx0VGV4dHNGb3JEaWFsb2c6IGZ1bmN0aW9uKG9SZXNvdXJjZUJ1bmRsZTogYW55LCBpU2VsZWN0ZWRDb250ZXh0czogYW55LCBvVGFibGU6IGFueSkge1xuXHRcdC8vIFRoZSBjb25maXJtIGJ1dHRvbiB0ZXh0IGlzIFwiU2F2ZVwiIGZvciB0YWJsZSBpbiBEaXNwbGF5IG1vZGUgYW5kIFwiQXBwbHlcIiBmb3IgdGFibGUgaW4gZWRpdCBtb2RlLiBUaGlzIGNhbiBiZSBsYXRlciBleHBvc2VkIGlmIG5lZWRlZC5cblx0XHRjb25zdCBiRGlzcGxheU1vZGUgPSBvVGFibGUuZGF0YShcImRpc3BsYXlNb2RlUHJvcGVydHlCaW5kaW5nXCIpID09PSBcInRydWVcIjtcblxuXHRcdHJldHVybiB7XG5cdFx0XHRcImtlZXBFeGlzdGluZ1ByZWZpeFwiOiBcIjwgS2VlcFwiLFxuXHRcdFx0XCJsZWF2ZUJsYW5rVmFsdWVcIjogXCI8IExlYXZlIEJsYW5rID5cIixcblx0XHRcdFwiY2xlYXJGaWVsZFZhbHVlXCI6IFwiPCBDbGVhciBWYWx1ZXMgPlwiLFxuXHRcdFx0XCJtYXNzRWRpdFRpdGxlXCI6IG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19NQVNTX0VESVRfRElBTE9HX1RJVExFXCIsIGlTZWxlY3RlZENvbnRleHRzLnRvU3RyaW5nKCkpLFxuXHRcdFx0XCJhcHBseUJ1dHRvblRleHRcIjogYkRpc3BsYXlNb2RlXG5cdFx0XHRcdD8gb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX01BU1NfRURJVF9TQVZFX0JVVFRPTl9URVhUXCIpXG5cdFx0XHRcdDogb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX01BU1NfRURJVF9BUFBMWV9CVVRUT05fVEVYVFwiKSxcblx0XHRcdFwiY2FuY2VsQnV0dG9uVGV4dFwiOiBvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfTUFTU19FRElUX0NBTkNFTF9CVVRUT05fVEVYVFwiKVxuXHRcdH07XG5cdH0sXG5cblx0LyoqXG5cdCAqIEFkZHMgYSBzdWZmaXggdG8gdGhlICdrZWVwIGV4aXN0aW5nJyBwcm9wZXJ0eSBvZiB0aGUgY29tYm9Cb3guXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzSW5wdXRUeXBlIElucHV0VHlwZSBvZiB0aGUgZmllbGRcblx0ICogQHJldHVybnMge3N0cmluZ31cblx0ICovXG5cdGdldFN1ZmZpeEZvcktlZXBFeGlzaXRpbmc6IGZ1bmN0aW9uKHNJbnB1dFR5cGU6IHN0cmluZykge1xuXHRcdGxldCBzUmVzdWx0ID0gXCJWYWx1ZXNcIjtcblxuXHRcdHN3aXRjaCAoc0lucHV0VHlwZSkge1xuXHRcdFx0Ly9UT0RPIC0gQWRkIGZvciBvdGhlciBjb250cm9sIHR5cGVzIGFzIHdlbGwgKFJhZGlvIEJ1dHRvbiwgRW1haWwsIElucHV0LCBNREMgRmllbGRzLCBJbWFnZSBldGMuKVxuXHRcdFx0Y2FzZSBcInNhcC5tLkRhdGVQaWNrZXJcIjpcblx0XHRcdFx0c1Jlc3VsdCA9IFwiRGF0ZXNcIjtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFwic2FwLm0uQ2hlY2tCb3hcIjpcblx0XHRcdFx0c1Jlc3VsdCA9IFwiU2V0dGluZ3NcIjtcblx0XHRcdFx0YnJlYWs7XG5cdFx0fVxuXHRcdHJldHVybiBzUmVzdWx0O1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBBZGRzIGRlZmF1bHQgdmFsdWVzIHRvIHRoZSBtb2RlbCBbS2VlcCBFeGlzdGluZyBWYWx1ZXMsIExlYXZlIEJsYW5rXS5cblx0ICpcblx0ICogQHBhcmFtIHtBcnJheX0gYVZhbHVlcyBBcnJheSBpbnN0YW5jZSB3aGVyZSB0aGUgZGVmYXVsdCBkYXRhIG5lZWRzIHRvIGJlIGFkZGVkXG5cdCAqIEBwYXJhbSB7QXJyYXl9IGFDb250ZXh0cyBDb250ZXh0cyBmb3IgbWFzcyBlZGl0XG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvRGVmYXVsdFZhbHVlcyBEZWZhdWx0IHZhbHVlcyBmcm9tIEFwcGxpY2F0aW9uIE1hbmlmZXN0XG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvUHJvcGVydHlJbmZvIFByb3BlcnR5IGluZm9ybWF0aW9uXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gYlVPTUZpZWxkXG5cdCAqL1xuXHRzZXREZWZhdWx0VmFsdWVzVG9EaWFsb2c6IGZ1bmN0aW9uKGFWYWx1ZXM6IGFueVtdLCBhQ29udGV4dHM6IGFueVtdLCBvRGVmYXVsdFZhbHVlczogYW55LCBvUHJvcGVydHlJbmZvOiBhbnksIGJVT01GaWVsZD86IGJvb2xlYW4pIHtcblx0XHRjb25zdCBzUHJvcGVydHlQYXRoID0gb1Byb3BlcnR5SW5mby5kYXRhUHJvcGVydHksXG5cdFx0XHRzSW5wdXRUeXBlID0gb1Byb3BlcnR5SW5mby5pbnB1dFR5cGUsXG5cdFx0XHRiUHJvcGVydHlSZXF1aXJlZCA9IG9Qcm9wZXJ0eUluZm8uaXNGaWVsZFJlcXVpcmVkO1xuXHRcdGNvbnN0IHNTdWZmaXhGb3JLZWVwRXhpc3RpbmcgPSBNYXNzRWRpdEhlbHBlci5nZXRTdWZmaXhGb3JLZWVwRXhpc2l0aW5nKHNJbnB1dFR5cGUpO1xuXHRcdC8vVE9ETyAtIEFkZCA8PFVzZSBWYWx1ZSBIZWxwIG9yIGNvbnRyb2wgaW1wbG1lbnRhdGlvbj4+IGFuZCByZWxhdGVkIGtleSBieSBjaGVja2luZyBpZiB2YWx1ZSBoZWxwIGlzIGVuYWJsZWQgZm9yIHByb3BlcnR5IG9yIFVuaXQuXG5cdFx0Ly9UT0RPIC0gQWRkIG9wdGlvbiBBcHBseSB0byBFbXB0eSBGaWVsZHMgb25seSBmb3IgQm90aCBWYWx1ZSBIZWxwIGFuZCBjb250cm9scy5cblx0XHRjb25zdCBiVmFsdWVFeGlzdHNGb3JQcm9wZXJ0eVBhdGggPSBhQ29udGV4dHMuc29tZShmdW5jdGlvbihvU2VsZWN0ZWRDb250ZXh0OiBhbnkpIHtcblx0XHRcdHJldHVybiBvU2VsZWN0ZWRDb250ZXh0LmdldE9iamVjdChzUHJvcGVydHlQYXRoKTtcblx0XHR9KTtcblx0XHRpZiAoYlZhbHVlRXhpc3RzRm9yUHJvcGVydHlQYXRoKSB7XG5cdFx0XHRpZiAoYlByb3BlcnR5UmVxdWlyZWQgIT09IFwidHJ1ZVwiICYmICFiVU9NRmllbGQpIHtcblx0XHRcdFx0YVZhbHVlcy51bnNoaWZ0KHsgdGV4dDogb0RlZmF1bHRWYWx1ZXMuY2xlYXJGaWVsZFZhbHVlLCBrZXk6IFwiQ2xlYXJGaWVsZFZhbHVlL1wiICsgc1Byb3BlcnR5UGF0aCB9KTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0YVZhbHVlcy51bnNoaWZ0KHsgdGV4dDogb0RlZmF1bHRWYWx1ZXMubGVhdmVCbGFua1ZhbHVlLCBrZXk6IFwiRW1wdHkvXCIgKyBzUHJvcGVydHlQYXRoIH0pO1xuXHRcdH1cblx0XHRhVmFsdWVzLnVuc2hpZnQoe1xuXHRcdFx0dGV4dDogb0RlZmF1bHRWYWx1ZXMua2VlcEV4aXN0aW5nUHJlZml4ICsgXCIgXCIgKyBzU3VmZml4Rm9yS2VlcEV4aXN0aW5nICsgXCIgPlwiLFxuXHRcdFx0a2V5OiBcIkRlZmF1bHQvXCIgKyBzUHJvcGVydHlQYXRoXG5cdFx0fSk7XG5cdH0sXG5cblx0Z2V0VGV4dEFycmFuZ2VtZW50SW5mbzogZnVuY3Rpb24oXG5cdFx0c1Byb3BlcnR5OiBhbnksXG5cdFx0b1RleHRCaW5kaW5nOiBhbnksXG5cdFx0c0N1cnJlbnRFbnRpdHlTZXQ6IGFueSxcblx0XHRvU2VsZWN0ZWRDb250ZXh0OiBhbnlcblx0KTogVGV4dEFycmFuZ2VtZW50SW5mbyB8IHVuZGVmaW5lZCB7XG5cdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG9TZWxlY3RlZENvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKTtcblx0XHRjb25zdCBzRGlzcGxheU1vZGUgPSBDb21tb25VdGlscy5jb21wdXRlRGlzcGxheU1vZGUob01ldGFNb2RlbC5nZXRPYmplY3Qoc0N1cnJlbnRFbnRpdHlTZXQgKyBcIi9cIiArIHNQcm9wZXJ0eSArIFwiQFwiKSk7XG5cdFx0bGV0IHNEZXNjcmlwdGlvblBhdGgsIHNWYWx1ZSwgc0Rlc2NyaXB0aW9uVmFsdWUsIHNGdWxsVGV4dDtcblx0XHRpZiAob1RleHRCaW5kaW5nICYmIChvVGV4dEJpbmRpbmcucGF0aCB8fCAob1RleHRCaW5kaW5nLnBhcmFtZXRlcnMgJiYgb1RleHRCaW5kaW5nLnBhcmFtZXRlcnMubGVuZ3RoKSkgJiYgc1Byb3BlcnR5KSB7XG5cdFx0XHRpZiAob1RleHRCaW5kaW5nLnBhdGgpIHtcblx0XHRcdFx0aWYgKHNEaXNwbGF5TW9kZSA9PT0gXCJEZXNjcmlwdGlvblwiKSB7XG5cdFx0XHRcdFx0c1ZhbHVlID0gb1NlbGVjdGVkQ29udGV4dC5nZXRPYmplY3Qoc1Byb3BlcnR5KTtcblx0XHRcdFx0XHRzRGVzY3JpcHRpb25WYWx1ZSA9IG9TZWxlY3RlZENvbnRleHQuZ2V0T2JqZWN0KG9UZXh0QmluZGluZy5wYXRoKTtcblx0XHRcdFx0XHRzRnVsbFRleHQgPSBzRGVzY3JpcHRpb25WYWx1ZTtcblx0XHRcdFx0fSBlbHNlIGlmIChzRGlzcGxheU1vZGUgPT09IFwiVmFsdWVcIikge1xuXHRcdFx0XHRcdHNWYWx1ZSA9IG9TZWxlY3RlZENvbnRleHQuZ2V0T2JqZWN0KHNQcm9wZXJ0eSk7XG5cdFx0XHRcdFx0c0Z1bGxUZXh0ID0gc1ZhbHVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKG9UZXh0QmluZGluZy5wYXJhbWV0ZXJzKSB7XG5cdFx0XHRcdG9UZXh0QmluZGluZy5wYXJhbWV0ZXJzLmZvckVhY2goZnVuY3Rpb24ob1Byb3BzOiBhbnkpIHtcblx0XHRcdFx0XHRpZiAob1Byb3BzLnBhdGggJiYgb1Byb3BzLnBhdGggIT09IHNQcm9wZXJ0eSkge1xuXHRcdFx0XHRcdFx0c0Rlc2NyaXB0aW9uUGF0aCA9IG9Qcm9wcy5wYXRoO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHRcdHNWYWx1ZSA9IG9TZWxlY3RlZENvbnRleHQuZ2V0T2JqZWN0KHNQcm9wZXJ0eSk7XG5cdFx0XHRcdHNEZXNjcmlwdGlvblZhbHVlID0gb1NlbGVjdGVkQ29udGV4dC5nZXRPYmplY3Qoc0Rlc2NyaXB0aW9uUGF0aCk7XG5cdFx0XHRcdGlmIChzRGlzcGxheU1vZGUgPT09IFwiVmFsdWVEZXNjcmlwdGlvblwiICYmIHNWYWx1ZSAmJiBzRGVzY3JpcHRpb25WYWx1ZSkge1xuXHRcdFx0XHRcdHNGdWxsVGV4dCA9IHNWYWx1ZSArIFwiIChcIiArIHNEZXNjcmlwdGlvblZhbHVlICsgXCIpXCI7XG5cdFx0XHRcdH0gZWxzZSBpZiAoc0Rpc3BsYXlNb2RlID09PSBcIkRlc2NyaXB0aW9uVmFsdWVcIiAmJiBzRGVzY3JpcHRpb25WYWx1ZSAmJiBzVmFsdWUpIHtcblx0XHRcdFx0XHRzRnVsbFRleHQgPSBzRGVzY3JpcHRpb25WYWx1ZSArIFwiIChcIiArIHNWYWx1ZSArIFwiKVwiO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcInRleHRBcnJhbmdlbWVudFwiOiBzRGlzcGxheU1vZGUsXG5cdFx0XHRcdFwidmFsdWVQYXRoXCI6IHNQcm9wZXJ0eSxcblx0XHRcdFx0XCJkZXNjcmlwdGlvblBhdGhcIjogc0Rlc2NyaXB0aW9uUGF0aCxcblx0XHRcdFx0XCJ2YWx1ZVwiOiBzVmFsdWUsXG5cdFx0XHRcdFwiZGVzY3JpcHRpb25cIjogc0Rlc2NyaXB0aW9uVmFsdWUsXG5cdFx0XHRcdFwiZnVsbFRleHRcIjogc0Z1bGxUZXh0XG5cdFx0XHR9O1xuXHRcdH1cblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBJbml0aWFsaXplcyBhIHJ1bnRpbWUgbW9kZWw6XG5cdCAqID0+IFRoZSBtb2RlbCBjb25zaXN0cyBvZiB2YWx1ZXMgc2hvd24gaW4gdGhlIGNvbWJvQm94IG9mIHRoZSBkaWFsb2cgKExlYXZlIEJsYW5rLCBLZWVwIEV4aXN0aW5nIFZhbHVlcywgb3IgYW55IHByb3BlcnR5IHZhbHVlIGZvciB0aGUgc2VsZWN0ZWQgY29udGV4dCwgZXRjLilcblx0ICogPT4gVGhlIG1vZGVsIHdpbGwgY2FwdHVyZSBydW50aW1lIGNoYW5nZXMgaW4gdGhlIHJlc3VsdHMgcHJvcGVydHkgKHRoZSB2YWx1ZSBlbnRlcmVkIGluIHRoZSBjb21ib0JveCkuXG5cdCAqXG5cdCAqIEBwYXJhbSB7QXJyYXl9IGFDb250ZXh0cyBDb250ZXh0cyBmb3IgbWFzcyBlZGl0XG5cdCAqIEBwYXJhbSB7QXJyYXl9IGFEYXRhQXJyYXkgQXJyYXkgY29udGFpbmluZyBkYXRhIHJlbGF0ZWQgdG8gdGhlIGRpYWxvZyB1c2VkIGJ5IGJvdGggdGhlIHN0YXRpYyBhbmQgdGhlIHJ1bnRpbWUgbW9kZWxcblx0ICogQHBhcmFtIHtvYmplY3R9IG9EZWZhdWx0VmFsdWVzIERlZmF1bHQgdmFsdWVzIGZyb20gaTE4blxuXHQgKiBAcmV0dXJucyB7b2JqZWN0fVxuXHQgKi9cblx0c2V0UnVudGltZU1vZGVsT25EaWFsb2c6IGZ1bmN0aW9uKGFDb250ZXh0czogYW55W10sIGFEYXRhQXJyYXk6IGFueVtdLCBvRGVmYXVsdFZhbHVlczogYW55KSB7XG5cdFx0Y29uc3QgYVZhbHVlczogYW55W10gPSBbXTtcblx0XHRjb25zdCBhVW5pdERhdGE6IGFueVtdID0gW107XG5cdFx0Y29uc3QgYVJlc3VsdHM6IGFueVtdID0gW107XG5cdFx0Y29uc3QgYVJlYWRPbmx5RmllbGRJbmZvOiBhbnlbXSA9IFtdO1xuXHRcdGNvbnN0IG9EaXN0aW5jdFZhbHVlTWFwOiBhbnkgPSB7fTtcblx0XHRsZXQgc1Byb3BlcnR5TmFtZTtcblx0XHRhRGF0YUFycmF5LmZvckVhY2goZnVuY3Rpb24ob0RhdGE6IGFueSkge1xuXHRcdFx0bGV0IG9UZXh0SW5mbztcblx0XHRcdGlmIChvRGF0YS5kYXRhUHJvcGVydHkgJiYgb0RhdGEuZGF0YVByb3BlcnR5LmluZGV4T2YoXCIvXCIpID4gLTEpIHtcblx0XHRcdFx0Y29uc3QgYUZpbmFsUGF0aCA9IE1hc3NFZGl0SGVscGVyLmluaXRMYXN0TGV2ZWxPZlByb3BlcnR5UGF0aChvRGF0YS5kYXRhUHJvcGVydHksIGFWYWx1ZXMpO1xuXHRcdFx0XHRjb25zdCBhUHJvcGVydHlQYXRocyA9IG9EYXRhLmRhdGFQcm9wZXJ0eS5zcGxpdChcIi9cIik7XG5cdFx0XHRcdGxldCBzUHJvcGVydHlLZXk7XG5cdFx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgYUNvbnRleHRzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdFx0Y29uc3Qgc011bHRpTGV2ZWxQYXRoVmFsdWUgPSBhQ29udGV4dHNbaV0uZ2V0T2JqZWN0KG9EYXRhLmRhdGFQcm9wZXJ0eSk7XG5cdFx0XHRcdFx0c1Byb3BlcnR5S2V5ID0gb0RhdGEuZGF0YVByb3BlcnR5ICsgXCIvXCIgKyBzTXVsdGlMZXZlbFBhdGhWYWx1ZTtcblx0XHRcdFx0XHRpZiAoIW9EaXN0aW5jdFZhbHVlTWFwW3NQcm9wZXJ0eUtleV0gJiYgYUZpbmFsUGF0aFthUHJvcGVydHlQYXRoc1thUHJvcGVydHlQYXRocy5sZW5ndGggLSAxXV0pIHtcblx0XHRcdFx0XHRcdG9UZXh0SW5mbyA9IE1hc3NFZGl0SGVscGVyLmdldFRleHRBcnJhbmdlbWVudEluZm8oXG5cdFx0XHRcdFx0XHRcdG9EYXRhLmRhdGFQcm9wZXJ0eSxcblx0XHRcdFx0XHRcdFx0b0RhdGEudGV4dEJpbmRpbmcsXG5cdFx0XHRcdFx0XHRcdG9EYXRhLmVudGl0eVNldCxcblx0XHRcdFx0XHRcdFx0YUNvbnRleHRzW2ldXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0YUZpbmFsUGF0aFthUHJvcGVydHlQYXRoc1thUHJvcGVydHlQYXRocy5sZW5ndGggLSAxXV0ucHVzaCh7XG5cdFx0XHRcdFx0XHRcdFwidGV4dFwiOiAob1RleHRJbmZvICYmIG9UZXh0SW5mby5mdWxsVGV4dCkgfHwgc011bHRpTGV2ZWxQYXRoVmFsdWUsXG5cdFx0XHRcdFx0XHRcdFwia2V5XCI6IG9EYXRhLmRhdGFQcm9wZXJ0eSxcblx0XHRcdFx0XHRcdFx0XCJ0ZXh0SW5mb1wiOiBvVGV4dEluZm9cblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0b0Rpc3RpbmN0VmFsdWVNYXBbc1Byb3BlcnR5S2V5XSA9IHNNdWx0aUxldmVsUGF0aFZhbHVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0YVZhbHVlc1tvRGF0YS5kYXRhUHJvcGVydHldID0gYVZhbHVlc1tvRGF0YS5kYXRhUHJvcGVydHldIHx8IFtdO1xuXHRcdFx0XHRpZiAob0RhdGEudW5pdFByb3BlcnR5KSB7XG5cdFx0XHRcdFx0YVVuaXREYXRhW29EYXRhLnVuaXRQcm9wZXJ0eV0gPSBhVW5pdERhdGFbb0RhdGEudW5pdFByb3BlcnR5XSB8fCBbXTtcblx0XHRcdFx0fVxuXHRcdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGFDb250ZXh0cy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRcdGNvbnN0IG9EYXRhT2JqZWN0ID0gYUNvbnRleHRzW2ldLmdldE9iamVjdCgpO1xuXHRcdFx0XHRcdHNQcm9wZXJ0eU5hbWUgPSBvRGF0YS5kYXRhUHJvcGVydHkgKyBcIi9cIiArIG9EYXRhT2JqZWN0W29EYXRhLmRhdGFQcm9wZXJ0eV07XG5cdFx0XHRcdFx0aWYgKG9EYXRhLmRhdGFQcm9wZXJ0eSAmJiBvRGF0YU9iamVjdFtvRGF0YS5kYXRhUHJvcGVydHldICYmICFvRGlzdGluY3RWYWx1ZU1hcFtzUHJvcGVydHlOYW1lXSkge1xuXHRcdFx0XHRcdFx0b1RleHRJbmZvID0gTWFzc0VkaXRIZWxwZXIuZ2V0VGV4dEFycmFuZ2VtZW50SW5mbyhcblx0XHRcdFx0XHRcdFx0b0RhdGEuZGF0YVByb3BlcnR5LFxuXHRcdFx0XHRcdFx0XHRvRGF0YS50ZXh0QmluZGluZyxcblx0XHRcdFx0XHRcdFx0b0RhdGEuZW50aXR5U2V0LFxuXHRcdFx0XHRcdFx0XHRhQ29udGV4dHNbaV1cblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRhVmFsdWVzW29EYXRhLmRhdGFQcm9wZXJ0eV0ucHVzaCh7XG5cdFx0XHRcdFx0XHRcdFwidGV4dFwiOiAob1RleHRJbmZvICYmIG9UZXh0SW5mby5mdWxsVGV4dCkgfHwgb0RhdGFPYmplY3Rbb0RhdGEuZGF0YVByb3BlcnR5XSxcblx0XHRcdFx0XHRcdFx0XCJrZXlcIjogb0RhdGEuZGF0YVByb3BlcnR5LFxuXHRcdFx0XHRcdFx0XHRcInRleHRJbmZvXCI6IG9UZXh0SW5mb1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRvRGlzdGluY3RWYWx1ZU1hcFtzUHJvcGVydHlOYW1lXSA9IG9EYXRhT2JqZWN0W29EYXRhLmRhdGFQcm9wZXJ0eV07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChvRGF0YS51bml0UHJvcGVydHkgJiYgb0RhdGFPYmplY3Rbb0RhdGEudW5pdFByb3BlcnR5XSkge1xuXHRcdFx0XHRcdFx0c1Byb3BlcnR5TmFtZSA9IG9EYXRhLnVuaXRQcm9wZXJ0eSArIFwiL1wiICsgb0RhdGFPYmplY3Rbb0RhdGEudW5pdFByb3BlcnR5XTtcblx0XHRcdFx0XHRcdGlmICghb0Rpc3RpbmN0VmFsdWVNYXBbc1Byb3BlcnR5TmFtZV0pIHtcblx0XHRcdFx0XHRcdFx0b1RleHRJbmZvID0gTWFzc0VkaXRIZWxwZXIuZ2V0VGV4dEFycmFuZ2VtZW50SW5mbyhcblx0XHRcdFx0XHRcdFx0XHRvRGF0YS51bml0UHJvcGVydHksXG5cdFx0XHRcdFx0XHRcdFx0b0RhdGEudGV4dEJpbmRpbmcsXG5cdFx0XHRcdFx0XHRcdFx0b0RhdGEuZW50aXR5U2V0LFxuXHRcdFx0XHRcdFx0XHRcdGFDb250ZXh0c1tpXVxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRhVW5pdERhdGFbb0RhdGEudW5pdFByb3BlcnR5XS5wdXNoKHtcblx0XHRcdFx0XHRcdFx0XHRcInRleHRcIjogKG9UZXh0SW5mbyAmJiBvVGV4dEluZm8uZnVsbFRleHQpIHx8IG9EYXRhT2JqZWN0W29EYXRhLnVuaXRQcm9wZXJ0eV0sXG5cdFx0XHRcdFx0XHRcdFx0XCJrZXlcIjogb0RhdGEudW5pdFByb3BlcnR5LFxuXHRcdFx0XHRcdFx0XHRcdFwidGV4dEluZm9cIjogb1RleHRJbmZvXG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRvRGlzdGluY3RWYWx1ZU1hcFtzUHJvcGVydHlOYW1lXSA9IG9EYXRhT2JqZWN0W29EYXRhLnVuaXRQcm9wZXJ0eV07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0YURhdGFBcnJheS5mb3JFYWNoKGZ1bmN0aW9uKG9EYXRhOiBhbnkpIHtcblx0XHRcdGlmIChvRGF0YS5kYXRhUHJvcGVydHkuaW5kZXhPZihcIi9cIikgPiAtMSkge1xuXHRcdFx0XHRjb25zdCBzTXVsdGlMZXZlbFByb3BQYXRoVmFsdWUgPSBNYXNzRWRpdEhlbHBlci5nZXRWYWx1ZUZvck11bHRpTGV2ZWxQYXRoKG9EYXRhLmRhdGFQcm9wZXJ0eSwgYVZhbHVlcyk7XG5cdFx0XHRcdGlmICghc011bHRpTGV2ZWxQcm9wUGF0aFZhbHVlKSB7XG5cdFx0XHRcdFx0c011bHRpTGV2ZWxQcm9wUGF0aFZhbHVlLnB1c2goeyB0ZXh0OiBvRGVmYXVsdFZhbHVlcy5sZWF2ZUJsYW5rVmFsdWUsIGtleTogXCJFbXB0eS9cIiArIG9EYXRhLmRhdGFQcm9wZXJ0eSB9KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRNYXNzRWRpdEhlbHBlci5zZXREZWZhdWx0VmFsdWVzVG9EaWFsb2coc011bHRpTGV2ZWxQcm9wUGF0aFZhbHVlLCBhQ29udGV4dHMsIG9EZWZhdWx0VmFsdWVzLCBvRGF0YSk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAoYVZhbHVlc1tvRGF0YS5kYXRhUHJvcGVydHldICYmIGFWYWx1ZXNbb0RhdGEuZGF0YVByb3BlcnR5XS5sZW5ndGgpIHtcblx0XHRcdFx0TWFzc0VkaXRIZWxwZXIuc2V0RGVmYXVsdFZhbHVlc1RvRGlhbG9nKGFWYWx1ZXNbb0RhdGEuZGF0YVByb3BlcnR5XSwgYUNvbnRleHRzLCBvRGVmYXVsdFZhbHVlcywgb0RhdGEpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKGFVbml0RGF0YVtvRGF0YS51bml0UHJvcGVydHldICYmIGFVbml0RGF0YVtvRGF0YS51bml0UHJvcGVydHldLmxlbmd0aCkge1xuXHRcdFx0XHRNYXNzRWRpdEhlbHBlci5zZXREZWZhdWx0VmFsdWVzVG9EaWFsb2coYVVuaXREYXRhW29EYXRhLnVuaXRQcm9wZXJ0eV0sIGFDb250ZXh0cywgb0RlZmF1bHRWYWx1ZXMsIG9EYXRhLCB0cnVlKTtcblx0XHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRcdChvRGF0YS5kYXRhUHJvcGVydHkgJiYgYVZhbHVlc1tvRGF0YS5kYXRhUHJvcGVydHldICYmICFhVmFsdWVzW29EYXRhLmRhdGFQcm9wZXJ0eV0ubGVuZ3RoKSB8fFxuXHRcdFx0XHQob0RhdGEudW5pdFByb3BlcnR5ICYmIGFVbml0RGF0YVtvRGF0YS51bml0UHJvcGVydHldICYmICFhVW5pdERhdGFbb0RhdGEudW5pdFByb3BlcnR5XS5sZW5ndGgpXG5cdFx0XHQpIHtcblx0XHRcdFx0Y29uc3QgYkNsZWFyRmllbGRPckJsYW5rVmFsdWVFeGlzdHMgPVxuXHRcdFx0XHRcdGFWYWx1ZXNbb0RhdGEuZGF0YVByb3BlcnR5XSAmJlxuXHRcdFx0XHRcdGFWYWx1ZXNbb0RhdGEuZGF0YVByb3BlcnR5XS5zb21lKGZ1bmN0aW9uKG9iajogYW55KSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gb2JqLnRleHQgPT09IFwiPCBDbGVhciBWYWx1ZXMgPlwiIHx8IG9iai50ZXh0ID09PSBcIjwgTGVhdmUgQmxhbmsgPlwiO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRpZiAob0RhdGEuZGF0YVByb3BlcnR5ICYmICFiQ2xlYXJGaWVsZE9yQmxhbmtWYWx1ZUV4aXN0cykge1xuXHRcdFx0XHRcdGFWYWx1ZXNbb0RhdGEuZGF0YVByb3BlcnR5XS5wdXNoKHsgdGV4dDogb0RlZmF1bHRWYWx1ZXMubGVhdmVCbGFua1ZhbHVlLCBrZXk6IFwiRW1wdHkvXCIgKyBvRGF0YS5kYXRhUHJvcGVydHkgfSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29uc3QgYkNsZWFyRmllbGRPckJsYW5rVW5pdFZhbHVlRXhpc3RzID1cblx0XHRcdFx0XHRhVW5pdERhdGFbb0RhdGEudW5pdFByb3BlcnR5XSAmJlxuXHRcdFx0XHRcdGFVbml0RGF0YVtvRGF0YS51bml0UHJvcGVydHldLnNvbWUoZnVuY3Rpb24ob2JqOiBhbnkpIHtcblx0XHRcdFx0XHRcdHJldHVybiBvYmoudGV4dCA9PT0gXCI8IENsZWFyIFZhbHVlcyA+XCIgfHwgb2JqLnRleHQgPT09IFwiPCBMZWF2ZSBCbGFuayA+XCI7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdGlmIChvRGF0YS51bml0UHJvcGVydHkgJiYgIWJDbGVhckZpZWxkT3JCbGFua1VuaXRWYWx1ZUV4aXN0cykge1xuXHRcdFx0XHRcdGFVbml0RGF0YVtvRGF0YS51bml0UHJvcGVydHldLnB1c2goe1xuXHRcdFx0XHRcdFx0dGV4dDogb0RlZmF1bHRWYWx1ZXMubGVhdmVCbGFua1ZhbHVlLFxuXHRcdFx0XHRcdFx0a2V5OiBcIkVtcHR5L1wiICsgb0RhdGEudW5pdFByb3BlcnR5XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmIChvRGF0YS5pc1Byb3BlcnR5UmVhZE9ubHkgJiYgdHlwZW9mIG9EYXRhLmlzUHJvcGVydHlSZWFkT25seSA9PT0gXCJib29sZWFuXCIpIHtcblx0XHRcdFx0YVJlYWRPbmx5RmllbGRJbmZvLnB1c2goeyBcInByb3BlcnR5XCI6IG9EYXRhLmRhdGFQcm9wZXJ0eSwgdmFsdWU6IG9EYXRhLmlzUHJvcGVydHlSZWFkT25seSwgdHlwZTogXCJEZWZhdWx0XCIgfSk7XG5cdFx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0XHRvRGF0YS5pc1Byb3BlcnR5UmVhZE9ubHkgJiZcblx0XHRcdFx0b0RhdGEuaXNQcm9wZXJ0eVJlYWRPbmx5Lm9wZXJhbmRzICYmXG5cdFx0XHRcdG9EYXRhLmlzUHJvcGVydHlSZWFkT25seS5vcGVyYW5kc1swXSAmJlxuXHRcdFx0XHRvRGF0YS5pc1Byb3BlcnR5UmVhZE9ubHkub3BlcmFuZHNbMF0ub3BlcmFuZDEgJiZcblx0XHRcdFx0b0RhdGEuaXNQcm9wZXJ0eVJlYWRPbmx5Lm9wZXJhbmRzWzBdLm9wZXJhbmQyXG5cdFx0XHQpIHtcblx0XHRcdFx0Ly8gVGhpcyBuZWVkcyB0byBiZSByZWZhY3RvcmVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgUmVhZE9ubHlFeHByZXNzaW9uIGNoYW5nZVxuXHRcdFx0XHRhUmVhZE9ubHlGaWVsZEluZm8ucHVzaCh7XG5cdFx0XHRcdFx0XCJwcm9wZXJ0eVwiOiBvRGF0YS5kYXRhUHJvcGVydHksXG5cdFx0XHRcdFx0cHJvcGVydHlQYXRoOiBvRGF0YS5pc1Byb3BlcnR5UmVhZE9ubHkub3BlcmFuZHNbMF0ub3BlcmFuZDEucGF0aCxcblx0XHRcdFx0XHRwcm9wZXJ0eVZhbHVlOiBvRGF0YS5pc1Byb3BlcnR5UmVhZE9ubHkub3BlcmFuZHNbMF0ub3BlcmFuZDIudmFsdWUsXG5cdFx0XHRcdFx0dHlwZTogXCJQYXRoXCJcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0Y29uc3Qgb0RhdGEgPSB7IFwidmFsdWVzXCI6IGFWYWx1ZXMsIFwidW5pdERhdGFcIjogYVVuaXREYXRhLCBcInJlc3VsdHNcIjogYVJlc3VsdHMsIFwicmVhZGFibGVQcm9wZXJ0eURhdGFcIjogYVJlYWRPbmx5RmllbGRJbmZvIH07XG5cdFx0Y29uc3Qgb0RpYWxvZ0RhdGFNb2RlbCA9IG5ldyBKU09OTW9kZWwob0RhdGEpO1xuXHRcdHJldHVybiBvRGlhbG9nRGF0YU1vZGVsO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBDcmVhdGUgdGhlIG1hc3MgZWRpdCBkaWFsb2cuXG5cdCAqXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvVGFibGUgSW5zdGFuY2Ugb2YgVGFibGVcblx0ICogQHBhcmFtIHtBcnJheX0gYUNvbnRleHRzIENvbnRleHRzIGZvciBtYXNzIGVkaXRcblx0ICogQHBhcmFtIHtvYmplY3R9IG9Db250cm9sbGVyIENvbnRyb2xsZXIgZm9yIHRoZSB2aWV3XG5cdCAqIEByZXR1cm5zIHtvYmplY3R9IFByb21pc2UgcmV0dXJuaW5nIGluc3RhbmNlIG9mIGRpYWxvZy5cblx0ICovXG5cdGNyZWF0ZURpYWxvZzogZnVuY3Rpb24ob1RhYmxlOiBUYWJsZSwgYUNvbnRleHRzOiBhbnlbXSwgb0NvbnRyb2xsZXI6IFBhZ2VDb250cm9sbGVyKSB7XG5cdFx0Y29uc3Qgc0ZyYWdtZW50TmFtZSA9IFwic2FwL2ZlL2NvcmUvY29udHJvbHMvbWFzc0VkaXQvTWFzc0VkaXREaWFsb2dcIixcblx0XHRcdGFEYXRhQXJyYXk6IGFueVtdID0gW10sXG5cdFx0XHRvUmVzb3VyY2VCdW5kbGUgPSBzYXAudWkuZ2V0Q29yZSgpLmdldExpYnJhcnlSZXNvdXJjZUJ1bmRsZShcInNhcC5mZS5jb3JlXCIpIGFzIFJlc291cmNlQnVuZGxlLFxuXHRcdFx0b0RlZmF1bHRWYWx1ZXMgPSBNYXNzRWRpdEhlbHBlci5nZXREZWZhdWx0VGV4dHNGb3JEaWFsb2cob1Jlc291cmNlQnVuZGxlLCBhQ29udGV4dHMubGVuZ3RoLCBvVGFibGUpLFxuXHRcdFx0b0RhdGFGaWVsZE1vZGVsID0gTWFzc0VkaXRIZWxwZXIucHJlcGFyZURhdGFGb3JEaWFsb2cob1RhYmxlLCBhQ29udGV4dHMsIGFEYXRhQXJyYXkpLFxuXHRcdFx0b0RpYWxvZ0RhdGFNb2RlbCA9IE1hc3NFZGl0SGVscGVyLnNldFJ1bnRpbWVNb2RlbE9uRGlhbG9nKGFDb250ZXh0cywgYURhdGFBcnJheSwgb0RlZmF1bHRWYWx1ZXMpO1xuXG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmU6ICh2YWx1ZTogYW55KSA9PiB2b2lkLCByZWplY3Q6IChyZWFzb24/OiBhbnkpID0+IHZvaWQpIHtcblx0XHRcdGNvbnN0IG9GcmFnbWVudCA9IFhNTFRlbXBsYXRlUHJvY2Vzc29yLmxvYWRUZW1wbGF0ZShzRnJhZ21lbnROYW1lLCBcImZyYWdtZW50XCIpO1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZShcblx0XHRcdFx0WE1MUHJlcHJvY2Vzc29yLnByb2Nlc3MoXG5cdFx0XHRcdFx0b0ZyYWdtZW50LFxuXHRcdFx0XHRcdHsgbmFtZTogc0ZyYWdtZW50TmFtZSB9LFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGJpbmRpbmdDb250ZXh0czoge1xuXHRcdFx0XHRcdFx0XHRkYXRhRmllbGRNb2RlbDogb0RhdGFGaWVsZE1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KFwiL1wiKVxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdG1vZGVsczoge1xuXHRcdFx0XHRcdFx0XHRkYXRhRmllbGRNb2RlbDogb0RhdGFGaWVsZE1vZGVsXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHQpXG5cdFx0XHQpXG5cdFx0XHRcdC50aGVuKGZ1bmN0aW9uKG9GcmFnbWVudDogYW55KSB7XG5cdFx0XHRcdFx0cmV0dXJuIEZyYWdtZW50LmxvYWQoeyBkZWZpbml0aW9uOiBvRnJhZ21lbnQgfSkudGhlbihmdW5jdGlvbihvRGlhbG9nQ29udGVudDogYW55KSB7XG5cdFx0XHRcdFx0XHRjb25zdCBvRGlhbG9nID0gbmV3IERpYWxvZyh7XG5cdFx0XHRcdFx0XHRcdHRpdGxlOiBvRGVmYXVsdFZhbHVlcy5tYXNzRWRpdFRpdGxlLFxuXHRcdFx0XHRcdFx0XHRjb250ZW50OiBbb0RpYWxvZ0NvbnRlbnRdLFxuXHRcdFx0XHRcdFx0XHRiZWdpbkJ1dHRvbjogbmV3IEJ1dHRvbih7XG5cdFx0XHRcdFx0XHRcdFx0dGV4dDogb0RlZmF1bHRWYWx1ZXMuYXBwbHlCdXR0b25UZXh0LFxuXHRcdFx0XHRcdFx0XHRcdHR5cGU6IFwiRW1waGFzaXplZFwiLFxuXHRcdFx0XHRcdFx0XHRcdHByZXNzOiBmdW5jdGlvbihvRXZlbnQ6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0Y29uc3Qgb0RpYWxvZyA9IG9FdmVudC5nZXRTb3VyY2UoKS5nZXRQYXJlbnQoKTtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IG9Nb2RlbCA9IG9EaWFsb2cuZ2V0TW9kZWwoXCJmaWVsZHNJbmZvXCIpO1xuXHRcdFx0XHRcdFx0XHRcdFx0Y29uc3QgYVJlc3VsdHMgPSBvTW9kZWwuZ2V0UHJvcGVydHkoXCIvcmVzdWx0c1wiKTtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IGFQcm9wZXJ0eVJlYWRhYmxlSW5mbyA9IG9Nb2RlbC5nZXRQcm9wZXJ0eShcIi9yZWFkYWJsZVByb3BlcnR5RGF0YVwiKTtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IGNoYW5nZVByb21pc2U6IGFueVtdID0gW107XG5cdFx0XHRcdFx0XHRcdFx0XHRsZXQgYlJlYWRPbmx5RmllbGQgPSBmYWxzZTtcblxuXHRcdFx0XHRcdFx0XHRcdFx0YUNvbnRleHRzLmZvckVhY2goZnVuY3Rpb24ob1NlbGVjdGVkQ29udGV4dDogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGFSZXN1bHRzLmZvckVhY2goZnVuY3Rpb24ob1Jlc3VsdDogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly9UT0RPIC0gQWRkIHNhdmUgaW1wbGVtZW50YXRpb24gZm9yIFZhbHVlIEhlbHAuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKGFQcm9wZXJ0eVJlYWRhYmxlSW5mbykge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YlJlYWRPbmx5RmllbGQgPSBhUHJvcGVydHlSZWFkYWJsZUluZm8uc29tZShmdW5jdGlvbihvUHJvcGVydHlJbmZvOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKG9SZXN1bHQua2V5VmFsdWUgPT09IG9Qcm9wZXJ0eUluZm8ucHJvcGVydHkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAob1Byb3BlcnR5SW5mby50eXBlID09PSBcIkRlZmF1bHRcIikge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG9Qcm9wZXJ0eUluZm8udmFsdWUgPT09IHRydWU7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmIChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9Qcm9wZXJ0eUluZm8udHlwZSA9PT0gXCJQYXRoXCIgJiZcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9Qcm9wZXJ0eUluZm8ucHJvcGVydHlWYWx1ZSAmJlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0b1Byb3BlcnR5SW5mby5wcm9wZXJ0eVBhdGhcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiAoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9TZWxlY3RlZENvbnRleHQuZ2V0T2JqZWN0KG9Qcm9wZXJ0eUluZm8ucHJvcGVydHlQYXRoKSA9PT1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0b1Byb3BlcnR5SW5mby5wcm9wZXJ0eVZhbHVlXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChvUmVzdWx0LmtleVZhbHVlICYmIG9SZXN1bHQudmFsdWUgIT09IFwiRGVmYXVsdFwiICYmICFiUmVhZE9ubHlGaWVsZCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y2hhbmdlUHJvbWlzZS5wdXNoKG9TZWxlY3RlZENvbnRleHQuc2V0UHJvcGVydHkob1Jlc3VsdC5rZXlWYWx1ZSwgb1Jlc3VsdC52YWx1ZSkpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBQcm9taXNlLmFsbChjaGFuZ2VQcm9taXNlKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQudGhlbihmdW5jdGlvbihvUmVzOiBhbnlbXSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IG9MaXN0QmluZGluZyA9IG9UYWJsZS5nZXRSb3dCaW5kaW5nKCksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvRXh0ZW5zaW9uQVBJID0gb0NvbnRyb2xsZXIgJiYgKG9Db250cm9sbGVyLmdldEV4dGVuc2lvbkFQSSgpIGFzIGFueSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG9FeHRlbnNpb25BUEkucmVmcmVzaChvTGlzdEJpbmRpbmcuZ2V0UGF0aCgpKS50aGVuKGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0b0RpYWxvZy5jbG9zZSgpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0b0RpYWxvZy5kZXN0cm95KCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gb1Jlcztcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly9UT0RPIC0gQWRkIGVycm9yIGhhbmRsaW5nIHBhcnQgZm9yIHRoZSBEaWFsb2dcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJNYXNzIEVkaXQ6IFNvbWV0aGluZyB3ZW50IHdyb25nIGluIHVwZGF0aW5nIGVudHJpZXMuXCIsIG9FcnJvcik7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSksXG5cdFx0XHRcdFx0XHRcdGVuZEJ1dHRvbjogbmV3IEJ1dHRvbih7XG5cdFx0XHRcdFx0XHRcdFx0dGV4dDogb0RlZmF1bHRWYWx1ZXMuY2FuY2VsQnV0dG9uVGV4dCxcblx0XHRcdFx0XHRcdFx0XHRwcmVzczogZnVuY3Rpb24ob0V2ZW50OiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IG9EaWFsb2cgPSBvRXZlbnQuZ2V0U291cmNlKCkuZ2V0UGFyZW50KCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRvRGlhbG9nLmNsb3NlKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRvRGlhbG9nLmRlc3Ryb3koKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdG9EaWFsb2cuc2V0TW9kZWwob0RpYWxvZ0RhdGFNb2RlbCwgXCJmaWVsZHNJbmZvXCIpO1xuXHRcdFx0XHRcdFx0cmVzb2x2ZShvRGlhbG9nKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSlcblx0XHRcdFx0LmNhdGNoKHJlamVjdCk7XG5cdFx0fSk7XG5cdH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IE1hc3NFZGl0SGVscGVyO1xuIl19
979
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIk1hc3NFZGl0SGVscGVyLnRzIl0sIm5hbWVzIjpbIk1hc3NFZGl0SGVscGVyIiwiaW5pdExhc3RMZXZlbE9mUHJvcGVydHlQYXRoIiwic1BhdGgiLCJhVmFsdWVzIiwiYUZpbmFsUGF0aCIsImluZGV4IiwiYVBhdGhzIiwic3BsaXQiLCJzRnVsbFBhdGgiLCJmb3JFYWNoIiwic1Byb3BlcnR5UGF0aCIsImdldFVuaXF1ZVZhbHVlcyIsInNWYWx1ZSIsInNlbGYiLCJ1bmRlZmluZWQiLCJpbmRleE9mIiwiZ2V0VmFsdWVGb3JNdWx0aUxldmVsUGF0aCIsInNEYXRhUHJvcGVydHlQYXRoIiwib1ZhbHVlcyIsImFQcm9wZXJ0eVBhdGhzIiwiUmVzdWx0IiwiZ2V0RGVmYXVsdFNlbGVjdGlvblBhdGhDb21ib0JveCIsImFDb250ZXh0cyIsImxlbmd0aCIsIm9TZWxlY3RlZENvbnRleHQiLCJhUHJvcGVydHlWYWx1ZXMiLCJvQ29udGV4dCIsIm9EYXRhT2JqZWN0IiwiZ2V0T2JqZWN0Iiwic011bHRpTGV2ZWxQYXRoQ29uZGl0aW9uIiwiaGFzT3duUHJvcGVydHkiLCJwdXNoIiwiYVVuaXF1ZVByb3BlcnR5VmFsdWVzIiwiZmlsdGVyIiwiZ2V0SGlkZGVuVmFsdWVGb3JDb250ZXh0cyIsImhpZGRlblZhbHVlIiwiJFBhdGgiLCJzb21lIiwiZ2V0SW5wdXRUeXBlIiwicHJvcGVydHlJbmZvIiwiZGF0YUZpZWxkQ29udmVydGVkIiwib0RhdGFNb2RlbFBhdGgiLCJlZGl0U3R5bGVQcm9wZXJ0aWVzIiwiaW5wdXRUeXBlIiwic2V0RWRpdFN0eWxlUHJvcGVydGllcyIsImVkaXRTdHlsZSIsImlzVmFsaWRGb3JNYXNzRWRpdCIsImlzQ29sbGVjdGlvbkZpZWxkIiwiaGFzVmFsdWVIZWxwV2l0aEZpeGVkVmFsdWVzIiwiZ2V0SXNGaWVsZEdycCIsIiRUeXBlIiwiVGFyZ2V0IiwidmFsdWUiLCJnZXRUZXh0UGF0aCIsInByb3BlcnR5IiwidGV4dEJpbmRpbmciLCJkaXNwbGF5TW9kZSIsImRlc2NyaXB0aW9uUGF0aCIsInBhdGgiLCJwYXJhbWV0ZXJzIiwicHJvcHMiLCJwcmVwYXJlRGF0YUZvckRpYWxvZyIsIm9UYWJsZSIsImFEYXRhQXJyYXkiLCJvTWV0YU1vZGVsIiwiZ2V0TW9kZWwiLCJnZXRNZXRhTW9kZWwiLCJzQ3VycmVudEVudGl0eVNldE5hbWUiLCJkYXRhIiwiYVRhYmxlRmllbGRzIiwiZ2V0VGFibGVGaWVsZHMiLCJvRW50aXR5VHlwZUNvbnRleHQiLCJnZXRDb250ZXh0Iiwib0VudGl0eVNldENvbnRleHQiLCJvRGF0YU1vZGVsT2JqZWN0UGF0aCIsImdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyIsIm9EYXRhRmllbGRNb2RlbCIsIkpTT05Nb2RlbCIsIm9SZXN1bHQiLCJzTGFiZWxUZXh0IiwiYlZhbHVlSGVscEVuYWJsZWQiLCJzVW5pdFByb3BlcnR5UGF0aCIsImJWYWx1ZUhlbHBFbmFibGVkRm9yVW5pdCIsIm9UZXh0QmluZGluZyIsIm9Db2x1bW5JbmZvIiwiZGF0YVByb3BlcnR5Iiwib1Byb3BlcnR5SW5mbyIsImxhYmVsIiwidGFyZ2V0T2JqZWN0IiwidGFyZ2V0RW50aXR5VHlwZSIsImVudGl0eVByb3BlcnRpZXMiLCJvUHJvcGVydHkiLCJuYW1lIiwiZ2V0VGV4dEJpbmRpbmciLCJvRmllbGRDb250ZXh0IiwiYW5ub3RhdGlvblBhdGgiLCJvRGF0YUZpZWxkQ29udmVydGVkIiwiY29udmVydE1ldGFNb2RlbENvbnRleHQiLCJvUHJvcGVydHlDb250ZXh0Iiwib0ludGVyZmFjZSIsImdldEludGVyZmFjZSIsIlZhbHVlIiwiZW5oYW5jZURhdGFNb2RlbFBhdGgiLCJiSGlkZGVuRmllbGQiLCJpc0ltYWdlIiwiY29udGV4dCIsImdldFBhdGgiLCJfdHlwZSIsIiR0YXJnZXQiLCJjaGFydFByb3BlcnR5IiwidGVybSIsImlzQWN0aW9uIiwiQWN0aW9uIiwiaXNGaWVsZEdycCIsInByb3BlcnR5Rm9yRmllbGRDb250cm9sIiwiZXhwQmluZGluZyIsImdldEVkaXRNb2RlIiwiZWRpdE1vZGVWYWx1ZXMiLCJPYmplY3QiLCJrZXlzIiwiRWRpdE1vZGUiLCJlZGl0TW9kZUlzU3RhdGljIiwiaW5jbHVkZXMiLCJlZGl0YWJsZSIsIkVkaXRhYmxlIiwiaXNSZWFkT25seSIsImlzUmVhZE9ubHlFeHByZXNzaW9uIiwiQ29tbW9uVXRpbHMiLCJjb21wdXRlRGlzcGxheU1vZGUiLCJnZXRSZXF1aXJlZEV4cHJlc3Npb24iLCJudWxsYWJsZSIsInNldERhdGEiLCJhQ29sdW1ucyIsImdldENvbHVtbnMiLCJjb2x1bW5zRGF0YSIsImdldFBhcmVudCIsImdldFRhYmxlRGVmaW5pdGlvbiIsImNvbHVtbnMiLCJtYXAiLCJvQ29sdW1uIiwic0RhdGFQcm9wZXJ0eSIsImdldERhdGFQcm9wZXJ0eSIsImFSZWFsdGVkQ29sdW1uSW5mbyIsInR5cGUiLCJnZXRIZWFkZXIiLCJnZXREZWZhdWx0VGV4dHNGb3JEaWFsb2ciLCJvUmVzb3VyY2VCdW5kbGUiLCJpU2VsZWN0ZWRDb250ZXh0cyIsImJEaXNwbGF5TW9kZSIsImdldFRleHQiLCJ0b1N0cmluZyIsImdldFN1ZmZpeEZvcktlZXBFeGlzaXRpbmciLCJzSW5wdXRUeXBlIiwic1Jlc3VsdCIsInNldERlZmF1bHRWYWx1ZXNUb0RpYWxvZyIsIm9EZWZhdWx0VmFsdWVzIiwiYlVPTUZpZWxkIiwidW5pdFByb3BlcnR5IiwiYlByb3BlcnR5UmVxdWlyZWQiLCJpc0ZpZWxkUmVxdWlyZWQiLCJzU3VmZml4Rm9yS2VlcEV4aXN0aW5nIiwiZGVmYXVsdE9wdGlvbnMiLCJiVmFsdWVFeGlzdHNGb3JQcm9wZXJ0eVBhdGgiLCJmYWxzZUVudHJ5IiwidGV4dCIsImtleSIsInRleHRJbmZvIiwidHJ1dGh5RW50cnkiLCJ1bnNoaWZ0IiwiaXNWYWx1ZUhlbHBFbmFibGVkIiwiaXNWYWx1ZUhlbHBFbmFibGVkRm9yVW5pdCIsInZoZEVudHJ5IiwidXNlVmFsdWVIZWxwVmFsdWUiLCJjbGVhckVudHJ5IiwiY2xlYXJGaWVsZFZhbHVlIiwiZW1wdHlFbnRyeSIsImxlYXZlQmxhbmtWYWx1ZSIsImtlZXBFbnRyeSIsImtlZXBFeGlzdGluZ1ByZWZpeCIsImdldFRleHRBcnJhbmdlbWVudEluZm8iLCJzZWxlY3RlZENvbnRleHQiLCJkZXNjcmlwdGlvblZhbHVlIiwiZnVsbFRleHQiLCJMb2ciLCJpbmZvIiwiaXNFZGl0YWJsZSIsImFueSIsImJpbmRpbmciLCJnZXRCaW5kaW5nIiwiZ2V0RXh0ZXJuYWxWYWx1ZSIsIm9uQ29udGV4dEVkaXRhYmxlQ2hhbmdlIiwib0RpYWxvZ0RhdGFNb2RlbCIsIm9iamVjdHNGb3JWaXNpYmlsaXR5IiwiZ2V0UHJvcGVydHkiLCJzZXRQcm9wZXJ0eSIsInVwZGF0ZU9uQ29udGV4dENoYW5nZSIsIm1PVG9Vc2UiLCJ2YWx1ZXMiLCJhdHRhY2hDaGFuZ2UiLCJiaW5kIiwiZ2V0Qm91bmRPYmplY3QiLCJBbnkiLCJtb2RlbCIsInNldE1vZGVsIiwic2V0QmluZGluZ0NvbnRleHQiLCJnZXRGaWVsZFZpc2libGl0eSIsImlzQ29udGV4dEVkaXRhYmxlIiwic2V0UnVudGltZU1vZGVsT25EaWFsb2ciLCJkaWFsb2dDb250ZXh0IiwiYVVuaXREYXRhIiwiYVJlc3VsdHMiLCJhUmVhZE9ubHlGaWVsZEluZm8iLCJvRGF0YSIsIm9UZXh0SW5mbyIsInNQcm9wZXJ0eUtleSIsInNVbml0UHJvcGVydHlOYW1lIiwib0Rpc3RpbmN0VmFsdWVNYXAiLCJvRGlzdGluY3RVbml0TWFwIiwic011bHRpTGV2ZWxQYXRoVmFsdWUiLCJkaXNwbGF5IiwidmFsdWVQYXRoIiwiZW50cnkiLCJ1bml0RW50cnkiLCJzTXVsdGlMZXZlbFByb3BQYXRoVmFsdWUiLCJzZWxlY3RlZEtleSIsImJDbGVhckZpZWxkT3JCbGFua1ZhbHVlRXhpc3RzIiwib2JqIiwiYkNsZWFyRmllbGRPckJsYW5rVW5pdFZhbHVlRXhpc3RzIiwiaXNQcm9wZXJ0eVJlYWRPbmx5Iiwib3BlcmFuZHMiLCJvcGVyYW5kMSIsIm9wZXJhbmQyIiwicHJvcGVydHlQYXRoIiwicHJvcGVydHlWYWx1ZSIsImVkaXRNb2RlIiwidmlzaWJsZSIsImdldERpYWxvZ0NvbnRleHQiLCJ0YWJsZSIsImRpYWxvZyIsInRyYW5zQ3R4IiwiZ2V0QmluZGluZ0NvbnRleHQiLCJsaXN0QmluZGluZyIsImdldFJvd0JpbmRpbmciLCJ0cmFuc2llbnRMaXN0QmluZGluZyIsImJpbmRMaXN0IiwiJCR1cGRhdGVHcm91cElkIiwicmVmcmVzaEludGVybmFsIiwiY3JlYXRlIiwib25EaWFsb2dPcGVuIiwiZXZlbnQiLCJzb3VyY2UiLCJnZXRTb3VyY2UiLCJmaWVsZHNJbmZvTW9kZWwiLCJjcmVhdGVEaWFsb2ciLCJvQ29udHJvbGxlciIsInNGcmFnbWVudE5hbWUiLCJDb3JlIiwiZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJvRnJhZ21lbnQiLCJYTUxUZW1wbGF0ZVByb2Nlc3NvciIsImxvYWRUZW1wbGF0ZSIsIlhNTFByZXByb2Nlc3NvciIsInByb2Nlc3MiLCJiaW5kaW5nQ29udGV4dHMiLCJkYXRhRmllbGRNb2RlbCIsImNyZWF0ZUJpbmRpbmdDb250ZXh0IiwibW9kZWxzIiwidGhlbiIsIkZyYWdtZW50IiwibG9hZCIsImRlZmluaXRpb24iLCJvRGlhbG9nQ29udGVudCIsIkRyYWZ0U3RhdHVzIiwiRkVMaWJyYXJ5Iiwib0RpYWxvZyIsIkRpYWxvZyIsInRpdGxlIiwibWFzc0VkaXRUaXRsZSIsImNvbnRlbnQiLCJhZnRlck9wZW4iLCJiZWdpbkJ1dHRvbiIsIkJ1dHRvbiIsImFwcGx5QnV0dG9uVGV4dCIsInByZXNzIiwib0V2ZW50IiwiZ2V0VmlldyIsIm9Nb2RlbCIsImFQcm9wZXJ0eVJlYWRhYmxlSW5mbyIsImNoYW5nZVByb21pc2UiLCJiUmVhZE9ubHlGaWVsZCIsImdyb3VwSWQiLCJlcnJvclZhbHVlcyIsImlkeCIsImtleVZhbHVlIiwiX2VkaXRGbG93Iiwic2V0RHJhZnRTdGF0dXMiLCJTYXZpbmciLCJjYXRjaCIsIm9FcnJvciIsImVycm9yIiwiYWxsU2V0dGxlZCIsIm9MaXN0QmluZGluZyIsIm9FeHRlbnNpb25BUEkiLCJnZXRFeHRlbnNpb25BUEkiLCJyZWZyZXNoIiwic3VidGl0bGVDb2x1bW4iLCJnZXRNZXNzYWdlQ29sdW1uIiwibWVzc2FnZXMiLCJzYXAiLCJ1aSIsImdldENvcmUiLCJnZXRNZXNzYWdlTWFuYWdlciIsImdldE1lc3NhZ2VNb2RlbCIsImdldERhdGEiLCJib3VuZFRyYW5zaXRpb25FcnJvckNvbnRleHRzIiwibWVzc2FnZSIsIm1lc3NhZ2VUYXJnZXRzIiwiZ2V0VGFyZ2V0cyIsInBlcnNpc3RlbnQiLCJib3VuZFRyYW5zaXRpb25FcnJvckNvbnRleHQiLCJmaW5kIiwiZ2V0VGFyZ2V0IiwiYWRkaXRpb25hbFRleHQiLCJTYXZlZCIsInN1Y2Nlc3NUb2FzdCIsIk1lc3NhZ2VUb2FzdCIsInNob3ciLCJnZXRTZWxlY3RlZENvbnRleHRzIiwiQ2xlYXIiLCJnZXRNZXNzYWdlSGFuZGxlciIsInNob3dNZXNzYWdlcyIsImlzT3BlbiIsImNsb3NlIiwiZGVzdHJveSIsImVuZEJ1dHRvbiIsImNhbmNlbEJ1dHRvblRleHQiXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQTBDQSxNQUFNQSxjQUFjLEdBQUc7QUFDdEI7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNDQyxJQUFBQSwyQkFBMkIsRUFBRSxVQUFVQyxLQUFWLEVBQXlCQyxPQUF6QixFQUFnRTtBQUM1RixVQUFJQyxVQUFKO0FBQ0EsVUFBSUMsS0FBSyxHQUFHLENBQVo7QUFDQSxVQUFNQyxNQUFNLEdBQUdKLEtBQUssQ0FBQ0ssS0FBTixDQUFZLEdBQVosQ0FBZjtBQUNBLFVBQUlDLFNBQVMsR0FBRyxFQUFoQjtBQUNBRixNQUFBQSxNQUFNLENBQUNHLE9BQVAsQ0FBZSxVQUFVQyxhQUFWLEVBQWlDO0FBQy9DLFlBQUksQ0FBQ1AsT0FBTyxDQUFDTyxhQUFELENB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Q0EsaURBQUNsRixXQUFXLENBQUNrQyxPQUFaLEVBQUQsbUZBQUMsc0JBQXVCaEQsaUJBQXZCLENBQXlDLFVBQXpDLENBQUQsZ0ZBQWdGOUMsV0FBaEYsQ0FDQyxtQkFERCxFQUVDLEtBRkQ7QUFJQTtBQUNELHFCQS9DTSxDQUFQO0FBZ0RBLG1CQW5ERDtBQW9EQTtBQTlHc0IsZUFBWCxDQUphO0FBb0gxQitJLGNBQUFBLFNBQVMsRUFBRSxJQUFJckQsTUFBSixDQUFXO0FBQ3JCeEgsZ0JBQUFBLElBQUksRUFBRVQsY0FBYyxDQUFDdUwsZ0JBREE7QUFFckJwRCxnQkFBQUEsS0FBSyxFQUFFLFVBQVVDLE1BQVYsRUFBdUI7QUFDN0Isc0JBQU1WLE9BQU8sR0FBR1UsTUFBTSxDQUFDcEMsU0FBUCxHQUFtQnBILFNBQW5CLEVBQWhCO0FBQ0E4SSxrQkFBQUEsT0FBTyxDQUFDMEQsS0FBUjtBQUNBMUQsa0JBQUFBLE9BQU8sQ0FBQzJELE9BQVI7QUFDQTtBQU5vQixlQUFYO0FBcEhlLGFBQVgsQ0FBaEI7QUE2SEEsZ0JBQU10SSxLQUFLLEdBQUc1SSxNQUFNLENBQUNHLFFBQVAsRUFBZDtBQUNBb04sWUFBQUEsT0FBTyxDQUFDMUUsUUFBUixDQUFpQlosZ0JBQWpCLEVBQW1DLFlBQW5DO0FBQ0FzRixZQUFBQSxPQUFPLENBQUMxRSxRQUFSLENBQWlCRCxLQUFqQjtBQUNBMkUsWUFBQUEsT0FBTyxDQUFDekUsaUJBQVIsQ0FBMEJJLGFBQTFCO0FBQ0FtRCxZQUFBQSxPQUFPLENBQUNrQixPQUFELENBQVA7QUFDQSxXQXBJTSxDQUFQO0FBcUlBLFNBcEpLLEVBcUpMdUIsS0FySkssQ0FxSkN4QyxNQXJKRCxDQUFQO0FBc0pBLE9BeEpNLENBQVA7QUF5SkE7QUFsOUJxQixHQUF2QjtTQXE5QmVwUSxjIiwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCBDb21tb25VdGlscyBmcm9tIFwic2FwL2ZlL2NvcmUvQ29tbW9uVXRpbHNcIjtcbmltcG9ydCB7IEJpbmRpbmdFeHByZXNzaW9uLCBFeHByZXNzaW9uT3JQcmltaXRpdmUgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9CaW5kaW5nRXhwcmVzc2lvblwiO1xuaW1wb3J0IEZFTGlicmFyeSBmcm9tIFwic2FwL2ZlL2NvcmUvbGlicmFyeVwiO1xuaW1wb3J0IFBhZ2VDb250cm9sbGVyIGZyb20gXCJzYXAvZmUvY29yZS9QYWdlQ29udHJvbGxlclwiO1xuaW1wb3J0IHsgRGF0YU1vZGVsT2JqZWN0UGF0aCwgZW5oYW5jZURhdGFNb2RlbFBhdGggfSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9EYXRhTW9kZWxQYXRoSGVscGVyXCI7XG5pbXBvcnQgeyBoYXNWYWx1ZUhlbHBXaXRoRml4ZWRWYWx1ZXMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9Qcm9wZXJ0eUhlbHBlclwiO1xuaW1wb3J0IHsgZ2V0VGV4dEJpbmRpbmcsIHNldEVkaXRTdHlsZVByb3BlcnRpZXMgfSBmcm9tIFwic2FwL2ZlL21hY3Jvcy9maWVsZC9GaWVsZFRlbXBsYXRpbmdcIjtcbmltcG9ydCB7IEZpZWxkUHJvcGVydGllcyB9IGZyb20gXCJzYXAvZmUvbWFjcm9zL2ludGVybmFsL0ZpZWxkLm1ldGFkYXRhXCI7XG5pbXBvcnQgQnV0dG9uIGZyb20gXCJzYXAvbS9CdXR0b25cIjtcbmltcG9ydCBEaWFsb2cgZnJvbSBcInNhcC9tL0RpYWxvZ1wiO1xuaW1wb3J0IE1lc3NhZ2VUb2FzdCBmcm9tIFwic2FwL20vTWVzc2FnZVRvYXN0XCI7XG5pbXBvcnQgQ29yZSBmcm9tIFwic2FwL3VpL2NvcmUvQ29yZVwiO1xuaW1wb3J0IEZyYWdtZW50IGZyb20gXCJzYXAvdWkvY29yZS9GcmFnbWVudFwiO1xuaW1wb3J0IFhNTFByZXByb2Nlc3NvciBmcm9tIFwic2FwL3VpL2NvcmUvdXRpbC9YTUxQcmVwcm9jZXNzb3JcIjtcbmltcG9ydCBYTUxUZW1wbGF0ZVByb2Nlc3NvciBmcm9tIFwic2FwL3VpL2NvcmUvWE1MVGVtcGxhdGVQcm9jZXNzb3JcIjtcbmltcG9ydCBFZGl0TW9kZSBmcm9tIFwic2FwL3VpL21kYy9lbnVtL0VkaXRNb2RlXCI7XG5pbXBvcnQgVGFibGUgZnJvbSBcInNhcC91aS9tZGMvVGFibGVcIjtcbmltcG9ydCBKU09OTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9qc29uL0pTT05Nb2RlbFwiO1xuaW1wb3J0IENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgT0RhdGFMaXN0QmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTGlzdEJpbmRpbmdcIjtcbmltcG9ydCB7IENvcmVFeCB9IGZyb20gXCJ0eXBlcy9leHRlbnNpb25fdHlwZXNcIjtcbmltcG9ydCBBbnksIHsgQW55VHlwZSB9IGZyb20gXCIuLi9jb250cm9scy9BbnlcIjtcbmltcG9ydCB7IGNvbnZlcnRNZXRhTW9kZWxDb250ZXh0LCBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMgfSBmcm9tIFwiLi4vY29udmVydGVycy9NZXRhTW9kZWxDb252ZXJ0ZXJcIjtcbmltcG9ydCB7IGlzUmVhZE9ubHlFeHByZXNzaW9uIH0gZnJvbSBcIi4uL3RlbXBsYXRpbmcvRmllbGRDb250cm9sSGVscGVyXCI7XG5pbXBvcnQgeyBnZXRFZGl0TW9kZSwgZ2V0UmVxdWlyZWRFeHByZXNzaW9uLCBpc0NvbGxlY3Rpb25GaWVsZCB9IGZyb20gXCIuLi90ZW1wbGF0aW5nL1VJRm9ybWF0dGVyc1wiO1xuaW1wb3J0IHsgSW50ZXJuYWxNb2RlbENvbnRleHQgfSBmcm9tIFwiLi9Nb2RlbEhlbHBlclwiO1xuXG4vKiBUaGlzIGNsYXNzIGNvbnRhaW5zIGhlbHBlcnMgdG8gYmUgdXNlZCBmb3IgbWFzcyBlZGl0IGZ1bmN0aW9uYWxpdHkgKi9cbnR5cGUgVGV4dEFycmFuZ2VtZW50SW5mbyA9IHtcblx0dGV4dEFycmFuZ2VtZW50OiBzdHJpbmc7XG5cdHZhbHVlUGF0aDogc3RyaW5nO1xuXHRkZXNjcmlwdGlvblBhdGg/OiBzdHJpbmc7XG5cdHZhbHVlOiBzdHJpbmc7XG5cdGRlc2NyaXB0aW9uOiBzdHJpbmc7XG5cdGZ1bGxUZXh0OiBzdHJpbmc7XG59O1xuXG50eXBlIEJpbmRpbmdJbmZvID0ge1xuXHRwYXRoPzogc3RyaW5nO1xuXHRtb2RlbD86IHN0cmluZyB8IG9iamVjdDtcblx0cGFyYW1ldGVycz86IEFycmF5PEJpbmRpbmdJbmZvPjtcbn07XG5cbmNvbnN0IE1hc3NFZGl0SGVscGVyID0ge1xuXHQvKipcblx0ICogSW5pdGlhbGl6ZXMgdGhlIHZhbHVlIGF0IGZpbmFsIG9yIGRlZXBlc3QgbGV2ZWwgcGF0aCB3aXRoIGEgYmxhbmsgYXJyYXkuXG5cdCAqIFJldHVybiBhbiBlbXB0eSBhcnJheSBwb2ludGluZyB0byB0aGUgZmluYWwgb3IgZGVlcGVzdCBsZXZlbCBwYXRoLlxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc1BhdGggUHJvcGVydHkgcGF0aFxuXHQgKiBAcGFyYW0ge0FycmF5fSBhVmFsdWVzIEFycmF5IGluc3RhbmNlIHdoZXJlIHRoZSBkZWZhdWx0IGRhdGEgbmVlZHMgdG8gYmUgYWRkZWRcblx0ICogQHJldHVybnMge0FycmF5fVxuXHQgKi9cblx0aW5pdExhc3RMZXZlbE9mUHJvcGVydHlQYXRoOiBmdW5jdGlvbiAoc1BhdGg6IHN0cmluZywgYVZhbHVlczogYW55IC8qLCB0cmFuc0N0eDogQ29udGV4dCAqLykge1xuXHRcdGxldCBhRmluYWxQYXRoOiBhbnk7XG5cdFx0bGV0IGluZGV4ID0gMDtcblx0XHRjb25zdCBhUGF0aHMgPSBzUGF0aC5zcGxpdChcIi9cIik7XG5cdFx0bGV0IHNGdWxsUGF0aCA9IFwiXCI7XG5cdFx0YVBhdGhzLmZvckVhY2goZnVuY3Rpb24gKHNQcm9wZXJ0eVBhdGg6IHN0cmluZykge1xuXHRcdFx0aWYgKCFhVmFsdWVzW3NQcm9wZXJ0eVBhdGhdICYmIGluZGV4ID09PSAwKSB7XG5cdFx0XHRcdGFWYWx1ZXNbc1Byb3BlcnR5UGF0aF0gPSB7fTtcblx0XHRcdFx0YUZpbmFsUGF0aCA9IGFWYWx1ZXNbc1Byb3BlcnR5UGF0aF07XG5cdFx0XHRcdHNGdWxsUGF0aCA9IHNGdWxsUGF0aCArIHNQcm9wZXJ0eVBhdGg7XG5cdFx0XHRcdGluZGV4Kys7XG5cdFx0XHR9IGVsc2UgaWYgKCFhRmluYWxQYXRoW3NQcm9wZXJ0eVBhdGhdKSB7XG5cdFx0XHRcdHNGdWxsUGF0aCA9IHNGdWxsUGF0aCArIFwiL1wiICsgc1Byb3BlcnR5UGF0aDtcblx0XHRcdFx0aWYgKHNGdWxsUGF0aCAhPT0gc1BhdGgpIHtcblx0XHRcdFx0XHRhRmluYWxQYXRoW3NQcm9wZXJ0eVBhdGhdID0ge307XG5cdFx0XHRcdFx0YUZpbmFsUGF0aCA9IGFGaW5hbFBhdGhbc1Byb3BlcnR5UGF0aF07XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0YUZpbmFsUGF0aFtzUHJvcGVydHlQYXRoXSA9IFtdO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0cmV0dXJuIGFGaW5hbFBhdGg7XG5cdH0sXG5cblx0LyoqXG5cdCAqIE1ldGhvZCB0byBnZXQgdW5pcXVlIHZhbHVlcyBmb3IgZ2l2ZW4gYXJyYXkgdmFsdWVzLlxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc1ZhbHVlIFByb3BlcnR5IHZhbHVlXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCBJbmRleCBvZiB0aGUgcHJvcGVydHkgdmFsdWVcblx0ICogQHBhcmFtIHtBcnJheX0gc2VsZiBJbnN0YW5jZSBvZiB0aGUgYXJyYXlcblx0ICogQHJldHVybnMge2Jvb2xlYW59XG5cdCAqL1xuXHRnZXRVbmlxdWVWYWx1ZXM6IGZ1bmN0aW9uIChzVmFsdWU6IHN0cmluZywgaW5kZXg6IG51bWJlciwgc2VsZjogYW55W10pIHtcblx0XHRpZiAoc1ZhbHVlICE9IHVuZGVmaW5lZCAmJiBzVmFsdWUgIT0gbnVsbCkge1xuXHRcdFx0cmV0dXJuIHNlbGYuaW5kZXhPZihzVmFsdWUpID09PSBpbmRleDtcblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIHByb3BlcnR5IHZhbHVlIGZvciBhIG11bHRpLWxldmVsIHBhdGggKGZvciBleGFtcGxlOiBfTWF0ZXJpYWxzL01hdGVyaWFsX0RldGFpbHMgZ2V0cyB0aGUgdmFsdWUgb2YgTWF0ZXJpYWxfRGV0YWlscyB1bmRlciBfTWF0ZXJpYWxzIE9iamVjdCkuXG5cdCAqIFJldHVybnMgdGhlIHByb3BlcnR5VmFsdWUsIHdoaWNoIGNhbiBiZSBvZiBhbnkgdHlwZSAoc3RyaW5nLCBudW1iZXIsIGV0Yy4uKS5cblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNEYXRhUHJvcGVydHlQYXRoIFByb3BlcnR5IHBhdGhcblx0ICogQHBhcmFtIHtvYmplY3R9IG9WYWx1ZXMgT2JqZWN0IG9mIHByb3BlcnR5IHZhbHVlc1xuXHQgKiBAcmV0dXJucyB7Kn1cblx0ICovXG5cdGdldFZhbHVlRm9yTXVsdGlMZXZlbFBhdGg6IGZ1bmN0aW9uIChzRGF0YVByb3BlcnR5UGF0aDogc3RyaW5nLCBvVmFsdWVzOiBhbnkpIHtcblx0XHRpZiAoc0RhdGFQcm9wZXJ0eVBhdGggJiYgc0RhdGFQcm9wZXJ0eVBhdGguaW5kZXhPZihcIi9cIikgPiAwKSB7XG5cdFx0XHRjb25zdCBhUHJvcGVydHlQYXRocyA9IHNEYXRhUHJvcGVydHlQYXRoLnNwbGl0KFwiL1wiKTtcblx0XHRcdGxldCBSZXN1bHQ6IGFueTtcblx0XHRcdGFQcm9wZXJ0eVBhdGhzLmZvckVhY2goZnVuY3Rpb24gKHNQYXRoOiBzdHJpbmcpIHtcblx0XHRcdFx0UmVzdWx0ID0gb1ZhbHVlcyAmJiBvVmFsdWVzW3NQYXRoXSA/IG9WYWx1ZXNbc1BhdGhdIDogUmVzdWx0ICYmIFJlc3VsdFtzUGF0aF07XG5cdFx0XHR9KTtcblx0XHRcdHJldHVybiBSZXN1bHQ7XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBrZXkgcGF0aCBmb3IgdGhlIGtleSBvZiBhIGNvbWJvIGJveCB0aGF0IG11c3QgYmUgc2VsZWN0ZWQgaW5pdGlhbGx5IHdoZW4gdGhlIGRpYWxvZyBvcGVuczpcblx0ICogPT4gSWYgcHJvcGVydHlWYWx1ZSBmb3IgYWxsIHNlbGVjdGVkIGNvbnRleHRzIGlzIGRpZmZlcmVudCwgdGhlbiA8IEtlZXAgRXhpc3RpbmcgVmFsdWVzID4gaXMgcHJlc2VsZWN0ZWQuXG5cdCAqID0+IElmIHByb3BlcnR5VmFsdWUgZm9yIGFsbCBzZWxlY3RlZCBjb250ZXh0cyBpcyB0aGUgc2FtZSwgdGhlbiB0aGUgcHJvcGVydHlWYWx1ZSBpcyBwcmVzZWxlY3RlZC5cblx0ICogPT4gSWYgcHJvcGVydHlWYWx1ZSBmb3IgYWxsIHNlbGVjdGVkIGNvbnRleHRzIGlzIGVtcHR5LCB0aGVuIDwgTGVhdmUgQmxhbmsgPiBpcyBwcmVzZWxlY3RlZC5cblx0ICpcblx0ICpcblx0ICogQHBhcmFtIHtBcnJheX0gYUNvbnRleHRzIENvbnRleHRzIGZvciBtYXNzIGVkaXRcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNEYXRhUHJvcGVydHlQYXRoIERhdGEgcHJvcGVydHkgcGF0aFxuXHQgKiBAcmV0dXJucyB7c3RyaW5nfVxuXHQgKi9cblx0Z2V0RGVmYXVsdFNlbGVjdGlvblBhdGhDb21ib0JveDogZnVuY3Rpb24gKGFDb250ZXh0czogYW55W10sIHNEYXRhUHJvcGVydHlQYXRoOiBzdHJpbmcpIHtcblx0XHRpZiAoc0RhdGFQcm9wZXJ0eVBhdGggJiYgYUNvbnRleHRzLmxlbmd0aCA+IDApIHtcblx0XHRcdGNvbnN0IG9TZWxlY3RlZENvbnRleHQgPSBhQ29udGV4dHMsXG5cdFx0XHRcdGFQcm9wZXJ0eVZhbHVlczogYW55W10gPSBbXTtcblx0XHRcdG9TZWxlY3RlZENvbnRleHQuZm9yRWFjaChmdW5jdGlvbiAob0NvbnRleHQ6IGFueSkge1xuXHRcdFx0XHRjb25zdCBvRGF0YU9iamVjdCA9IG9Db250ZXh0LmdldE9iamVjdCgpO1xuXHRcdFx0XHRjb25zdCBzTXVsdGlMZXZlbFBhdGhDb25kaXRpb24gPVxuXHRcdFx0XHRcdHNEYXRhUHJvcGVydHlQYXRoLmluZGV4T2YoXCIvXCIpID4gLTEgJiYgb0RhdGFPYmplY3QuaGFzT3duUHJvcGVydHkoc0RhdGFQcm9wZXJ0eVBhdGguc3BsaXQoXCIvXCIpWzBdKTtcblx0XHRcdFx0aWYgKG9Db250ZXh0ICYmIChvRGF0YU9iamVjdC5oYXNPd25Qcm9wZXJ0eShzRGF0YVByb3BlcnR5UGF0aCkgfHwgc011bHRpTGV2ZWxQYXRoQ29uZGl0aW9uKSkge1xuXHRcdFx0XHRcdGFQcm9wZXJ0eVZhbHVlcy5wdXNoKG9Db250ZXh0LmdldE9iamVjdChzRGF0YVByb3BlcnR5UGF0aCkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHRcdGNvbnN0IGFVbmlxdWVQcm9wZXJ0eVZhbHVlcyA9IGFQcm9wZXJ0eVZhbHVlcy5maWx0ZXIoTWFzc0VkaXRIZWxwZXIuZ2V0VW5pcXVlVmFsdWVzKTtcblx0XHRcdGlmIChhVW5pcXVlUHJvcGVydHlWYWx1ZXMubGVuZ3RoID4gMSkge1xuXHRcdFx0XHRyZXR1cm4gXCJEZWZhdWx0L1wiICsgc0RhdGFQcm9wZXJ0eVBhdGg7XG5cdFx0XHR9IGVsc2UgaWYgKGFVbmlxdWVQcm9wZXJ0eVZhbHVlcy5sZW5ndGggPT09IDApIHtcblx0XHRcdFx0cmV0dXJuIFwiRW1wdHkvXCIgKyBzRGF0YVByb3BlcnR5UGF0aDtcblx0XHRcdH0gZWxzZSBpZiAoYVVuaXF1ZVByb3BlcnR5VmFsdWVzLmxlbmd0aCA9PT0gMSkge1xuXHRcdFx0XHRyZXR1cm4gc0RhdGFQcm9wZXJ0eVBhdGggKyBcIi9cIiArIGFVbmlxdWVQcm9wZXJ0eVZhbHVlc1swXTtcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIENoZWNrcyBoaWRkZW4gYW5ub3RhdGlvbiB2YWx1ZSBbYm90aCBzdGF0aWMgYW5kIHBhdGggYmFzZWRdIGZvciB0YWJsZSdzIHNlbGVjdGVkIGNvbnRleHQuXG5cdCAqXG5cdCAqIEBwYXJhbSB7Kn0gaGlkZGVuVmFsdWUgSGlkZGVuIGFubm90YXRpb24gdmFsdWUgLyBwYXRoIGZvciBmaWVsZFxuXHQgKiBAcGFyYW0ge0FycmF5fSBhQ29udGV4dHMgQ29udGV4dHMgZm9yIG1hc3MgZWRpdFxuXHQgKiBAcmV0dXJucyB7Ym9vbGVhbn1cblx0ICovXG5cdGdldEhpZGRlblZhbHVlRm9yQ29udGV4dHM6IGZ1bmN0aW9uIChoaWRkZW5WYWx1ZTogYW55LCBhQ29udGV4dHM6IGFueVtdKSB7XG5cdFx0aWYgKGhpZGRlblZhbHVlICYmIGhpZGRlblZhbHVlLiRQYXRoKSB7XG5cdFx0XHRyZXR1cm4gIWFDb250ZXh0cy5zb21lKGZ1bmN0aW9uIChvU2VsZWN0ZWRDb250ZXh0OiBhbnkpIHtcblx0XHRcdFx0cmV0dXJuIG9TZWxlY3RlZENvbnRleHQuZ2V0T2JqZWN0KGhpZGRlblZhbHVlLiRQYXRoKSA9PT0gZmFsc2U7XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0cmV0dXJuIGhpZGRlblZhbHVlO1xuXHR9LFxuXG5cdGdldElucHV0VHlwZTogZnVuY3Rpb24gKHByb3BlcnR5SW5mbzogYW55LCBkYXRhRmllbGRDb252ZXJ0ZWQ6IGFueSwgb0RhdGFNb2RlbFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGgpOiBzdHJpbmcge1xuXHRcdGNvbnN0IGVkaXRTdHlsZVByb3BlcnRpZXMgPSB7fSBhcyBGaWVsZFByb3BlcnRpZXM7XG5cdFx0bGV0IGlucHV0VHlwZSE6IHN0cmluZztcblx0XHRpZiAocHJvcGVydHlJbmZvKSB7XG5cdFx0XHRzZXRFZGl0U3R5bGVQcm9wZXJ0aWVzKGVkaXRTdHlsZVByb3BlcnRpZXMsIGRhdGFGaWVsZENvbnZlcnRlZCwgb0RhdGFNb2RlbFBhdGgsIHRydWUpO1xuXHRcdFx0aW5wdXRUeXBlID0gZWRpdFN0eWxlUHJvcGVydGllcz8uZWRpdFN0eWxlIHx8IFwiXCI7XG5cdFx0fVxuXHRcdGNvbnN0IGlzVmFsaWRGb3JNYXNzRWRpdCA9XG5cdFx0XHRpbnB1dFR5cGUgJiZcblx0XHRcdFtcIkRhdGVQaWNrZXJcIiwgXCJUaW1lUGlja2VyXCIsIFwiRGF0ZVRpbWVQaWNrZXJcIiwgXCJSYXRpbmdJbmRpY2F0b3JcIl0uaW5kZXhPZihpbnB1dFR5cGUpID09PSAtMSAmJlxuXHRcdFx0IWlzQ29sbGVjdGlvbkZpZWxkKG9EYXRhTW9kZWxQYXRoKSAmJlxuXHRcdFx0IWhhc1ZhbHVlSGVscFdpdGhGaXhlZFZhbHVlcyhwcm9wZXJ0eUluZm8pO1xuXG5cdFx0cmV0dXJuIChpc1ZhbGlkRm9yTWFzc0VkaXQgfHwgXCJcIikgJiYgaW5wdXRUeXBlO1xuXHR9LFxuXG5cdGdldElzRmllbGRHcnA6IGZ1bmN0aW9uIChkYXRhRmllbGRDb252ZXJ0ZWQ6IGFueSk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiAoXG5cdFx0XHRkYXRhRmllbGRDb252ZXJ0ZWQgJiZcblx0XHRcdGRhdGFGaWVsZENvbnZlcnRlZC4kVHlwZSA9PT0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5EYXRhRmllbGRGb3JBbm5vdGF0aW9uXCIgJiZcblx0XHRcdGRhdGFGaWVsZENvbnZlcnRlZC5UYXJnZXQgJiZcblx0XHRcdGRhdGFGaWVsZENvbnZlcnRlZC5UYXJnZXQudmFsdWUgJiZcblx0XHRcdGRhdGFGaWVsZENvbnZlcnRlZC5UYXJnZXQudmFsdWUuaW5kZXhPZihcIkZpZWxkR3JvdXBcIikgPiAtMVxuXHRcdCk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEdldCB0ZXh0IHBhdGggZm9yIHRoZSBtYXNzIGVkaXQgZmllbGQuXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBQcm9wZXJ0eSBwYXRoXG5cdCAqIEBwYXJhbSB7YW55fSB0ZXh0QmluZGluZyBUZXh0IEJpbmRpbmcgSW5mb1xuXHQgKiBAcGFyYW0ge3N0cmluZ30gZGlzcGxheU1vZGUgRGlzcGxheSBtb2RlXG5cdCAqIEByZXR1cm5zIHtzdHJpbmcgfCB1bmRlZmluZWR9IFRleHQgUHJvcGVydHkgUGF0aCBpZiBpdCBleGlzdHNcblx0ICovXG5cdGdldFRleHRQYXRoOiBmdW5jdGlvbiAocHJvcGVydHk6IHN0cmluZywgdGV4dEJpbmRpbmc6IGFueSwgZGlzcGxheU1vZGU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdFx0bGV0IGRlc2NyaXB0aW9uUGF0aDtcblx0XHRpZiAodGV4dEJpbmRpbmcgJiYgKHRleHRCaW5kaW5nLnBhdGggfHwgKHRleHRCaW5kaW5nLnBhcmFtZXRlcnMgJiYgdGV4dEJpbmRpbmcucGFyYW1ldGVycy5sZW5ndGgpKSAmJiBwcm9wZXJ0eSkge1xuXHRcdFx0aWYgKHRleHRCaW5kaW5nLnBhdGggJiYgZGlzcGxheU1vZGUgPT09IFwiRGVzY3JpcHRpb25cIikge1xuXHRcdFx0XHRkZXNjcmlwdGlvblBhdGggPSB0ZXh0QmluZGluZy5wYXRoO1xuXHRcdFx0fSBlbHNlIGlmICh0ZXh0QmluZGluZy5wYXJhbWV0ZXJzKSB7XG5cdFx0XHRcdHRleHRCaW5kaW5nLnBhcmFtZXRlcnMuZm9yRWFjaChmdW5jdGlvbiAocHJvcHM6IEJpbmRpbmdJbmZvKSB7XG5cdFx0XHRcdFx0aWYgKHByb3BzLnBhdGggJiYgcHJvcHMucGF0aCAhPT0gcHJvcGVydHkpIHtcblx0XHRcdFx0XHRcdGRlc2NyaXB0aW9uUGF0aCA9IHByb3BzLnBhdGg7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGRlc2NyaXB0aW9uUGF0aDtcblx0fSxcblxuXHQvKipcblx0ICogSW5pdGlhbGl6ZXMgYSBKU09OIE1vZGVsIGZvciBwcm9wZXJ0aWVzIG9mIGRpYWxvZyBmaWVsZHMgW2xhYmVsLCB2aXNpYmxpdHksIGRhdGFwcm9wZXJ0eSwgZXRjLl0uXG5cdCAqXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvVGFibGUgSW5zdGFuY2Ugb2YgVGFibGVcblx0ICogQHBhcmFtIHtBcnJheX0gYUNvbnRleHRzIENvbnRleHRzIGZvciBtYXNzIGVkaXRcblx0ICogQHBhcmFtIHtBcnJheX0gYURhdGFBcnJheSBBcnJheSBjb250YWluaW5nIGRhdGEgcmVsYXRlZCB0byB0aGUgZGlhbG9nIHVzZWQgYnkgYm90aCB0aGUgc3RhdGljIGFuZCB0aGUgcnVudGltZSBtb2RlbFxuXHQgKiBAcmV0dXJucyB7b2JqZWN0fVxuXHQgKi9cblx0cHJlcGFyZURhdGFGb3JEaWFsb2c6IGZ1bmN0aW9uIChvVGFibGU6IFRhYmxlLCBhQ29udGV4dHM6IGFueVtdLCBhRGF0YUFycmF5OiBhbnlbXSkge1xuXHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvVGFibGUgJiYgKG9UYWJsZS5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpIGFzIGFueSksXG5cdFx0XHRzQ3VycmVudEVudGl0eVNldE5hbWUgPSBvVGFibGUuZGF0YShcIm1ldGFQYXRoXCIpLFxuXHRcdFx0YVRhYmxlRmllbGRzID0gTWFzc0VkaXRIZWxwZXIuZ2V0VGFibGVGaWVsZHMob1RhYmxlKSxcblx0XHRcdG9FbnRpdHlUeXBlQ29udGV4dCA9IG9NZXRhTW9kZWwuZ2V0Q29udGV4dChzQ3VycmVudEVudGl0eVNldE5hbWUgKyBcIi9AXCIpLFxuXHRcdFx0b0VudGl0eVNldENvbnRleHQgPSBvTWV0YU1vZGVsLmdldENvbnRleHQoc0N1cnJlbnRFbnRpdHlTZXROYW1lKSxcblx0XHRcdG9EYXRhTW9kZWxPYmplY3RQYXRoID0gZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzKG9FbnRpdHlUeXBlQ29udGV4dCk7XG5cblx0XHRjb25zdCBvRGF0YUZpZWxkTW9kZWwgPSBuZXcgSlNPTk1vZGVsKCk7XG5cdFx0bGV0IG9SZXN1bHQ7XG5cdFx0bGV0IHNMYWJlbFRleHQ7XG5cdFx0bGV0IGJWYWx1ZUhlbHBFbmFibGVkO1xuXHRcdGxldCBzVW5pdFByb3BlcnR5UGF0aDtcblx0XHRsZXQgYlZhbHVlSGVscEVuYWJsZWRGb3JVbml0O1xuXHRcdGxldCBvVGV4dEJpbmRpbmc7XG5cblx0XHRhVGFibGVGaWVsZHMuZm9yRWFjaChmdW5jdGlvbiAob0NvbHVtbkluZm86IGFueSkge1xuXHRcdFx0Y29uc3Qgc0RhdGFQcm9wZXJ0eVBhdGggPSBvQ29sdW1uSW5mby5kYXRhUHJvcGVydHk7XG5cdFx0XHRpZiAoc0RhdGFQcm9wZXJ0eVBhdGgpIHtcblx0XHRcdFx0bGV0IG9Qcm9wZXJ0eUluZm8gPSBzRGF0YVByb3BlcnR5UGF0aCAmJiBvTWV0YU1vZGVsLmdldE9iamVjdChzQ3VycmVudEVudGl0eVNldE5hbWUgKyBcIi9cIiArIHNEYXRhUHJvcGVydHlQYXRoICsgXCJAXCIpO1xuXHRcdFx0XHRiVmFsdWVIZWxwRW5hYmxlZCA9XG5cdFx0XHRcdFx0c0RhdGFQcm9wZXJ0eVBhdGggJiZcblx0XHRcdFx0XHRvTWV0YU1vZGVsLmdldE9iamVjdChzQ3VycmVudEVudGl0eVNldE5hbWUgKyBcIi9cIiArIHNEYXRhUHJvcGVydHlQYXRoICsgXCJAXCIpICYmXG5cdFx0XHRcdFx0b01ldGFNb2RlbC5nZXRPYmplY3Qoc0N1cnJlbnRFbnRpdHlTZXROYW1lICsgXCIvXCIgKyBzRGF0YVByb3BlcnR5UGF0aCArIFwiQFwiKVtcblx0XHRcdFx0XHRcdFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5WYWx1ZUxpc3RcIlxuXHRcdFx0XHRcdF07XG5cdFx0XHRcdHNVbml0UHJvcGVydHlQYXRoID1cblx0XHRcdFx0XHQob1Byb3BlcnR5SW5mbyAmJiBvUHJvcGVydHlJbmZvW1wiQE9yZy5PRGF0YS5NZWFzdXJlcy5WMS5Vbml0XCJdICYmIG9Qcm9wZXJ0eUluZm9bXCJAT3JnLk9EYXRhLk1lYXN1cmVzLlYxLlVuaXRcIl0uJFBhdGgpIHx8XG5cdFx0XHRcdFx0KG9Qcm9wZXJ0eUluZm8gJiZcblx0XHRcdFx0XHRcdG9Qcm9wZXJ0eUluZm9bXCJAT3JnLk9EYXRhLk1lYXN1cmVzLlYxLklTT0N1cnJlbmN5XCJdICYmXG5cdFx0XHRcdFx0XHRvUHJvcGVydHlJbmZvW1wiQE9yZy5PRGF0YS5NZWFzdXJlcy5WMS5JU09DdXJyZW5jeVwiXS4kUGF0aCk7XG5cdFx0XHRcdHNMYWJlbFRleHQgPVxuXHRcdFx0XHRcdG9Db2x1bW5JbmZvLmxhYmVsIHx8XG5cdFx0XHRcdFx0KG9Qcm9wZXJ0eUluZm8gJiYgb1Byb3BlcnR5SW5mb1tcIkBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuTGFiZWxcIl0pIHx8XG5cdFx0XHRcdFx0b0NvbHVtbkluZm8uZGF0YVByb3BlcnR5O1xuXHRcdFx0XHRiVmFsdWVIZWxwRW5hYmxlZEZvclVuaXQgPVxuXHRcdFx0XHRcdHNVbml0UHJvcGVydHlQYXRoICYmXG5cdFx0XHRcdFx0b01ldGFNb2RlbC5nZXRPYmplY3Qoc0N1cnJlbnRFbnRpdHlTZXROYW1lICsgXCIvXCIgKyBzVW5pdFByb3BlcnR5UGF0aCArIFwiQFwiKSAmJlxuXHRcdFx0XHRcdG9NZXRhTW9kZWwuZ2V0T2JqZWN0KHNDdXJyZW50RW50aXR5U2V0TmFtZSArIFwiL1wiICsgc1VuaXRQcm9wZXJ0eVBhdGggKyBcIkBcIilbXG5cdFx0XHRcdFx0XHRcIkBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuVmFsdWVMaXN0XCJcblx0XHRcdFx0XHRdO1xuXHRcdFx0XHRpZiAob0RhdGFNb2RlbE9iamVjdFBhdGgpIHtcblx0XHRcdFx0XHRvRGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRPYmplY3QgPSBvRGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRFbnRpdHlUeXBlLmVudGl0eVByb3BlcnRpZXMuZmlsdGVyKGZ1bmN0aW9uIChcblx0XHRcdFx0XHRcdG9Qcm9wZXJ0eTogYW55XG5cdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gb1Byb3BlcnR5Lm5hbWUgPT09IHNEYXRhUHJvcGVydHlQYXRoO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdG9EYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldE9iamVjdCA9IG9EYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldE9iamVjdFswXSB8fCB7fTtcblx0XHRcdFx0b1RleHRCaW5kaW5nID0gZ2V0VGV4dEJpbmRpbmcob0RhdGFNb2RlbE9iamVjdFBhdGgsIHt9LCB0cnVlKSB8fCB7fTtcblx0XHRcdFx0Y29uc3Qgb0ZpZWxkQ29udGV4dCA9IG9NZXRhTW9kZWwuZ2V0Q29udGV4dChvQ29sdW1uSW5mby5hbm5vdGF0aW9uUGF0aCksXG5cdFx0XHRcdFx0b0RhdGFGaWVsZENvbnZlcnRlZCA9IGNvbnZlcnRNZXRhTW9kZWxDb250ZXh0KG9GaWVsZENvbnRleHQpLFxuXHRcdFx0XHRcdG9Qcm9wZXJ0eUNvbnRleHQgPSBvTWV0YU1vZGVsLmdldENvbnRleHQoc0N1cnJlbnRFbnRpdHlTZXROYW1lICsgXCIvXCIgKyBzRGF0YVByb3BlcnR5UGF0aCArIFwiQFwiKSxcblx0XHRcdFx0XHRvSW50ZXJmYWNlID0gb1Byb3BlcnR5Q29udGV4dCAmJiBvUHJvcGVydHlDb250ZXh0LmdldEludGVyZmFjZSgpO1xuXG5cdFx0XHRcdGxldCBvRGF0YU1vZGVsUGF0aCA9IGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyhvRmllbGRDb250ZXh0LCBvRW50aXR5U2V0Q29udGV4dCk7XG5cdFx0XHRcdGlmIChvRGF0YUZpZWxkQ29udmVydGVkPy5WYWx1ZT8ucGF0aD8ubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdG9EYXRhTW9kZWxQYXRoID0gZW5oYW5jZURhdGFNb2RlbFBhdGgob0RhdGFNb2RlbFBhdGgsIHNEYXRhUHJvcGVydHlQYXRoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb25zdCBiSGlkZGVuRmllbGQgPVxuXHRcdFx0XHRcdE1hc3NFZGl0SGVscGVyLmdldEhpZGRlblZhbHVlRm9yQ29udGV4dHMoXG5cdFx0XHRcdFx0XHRvRmllbGRDb250ZXh0ICYmIG9GaWVsZENvbnRleHQuZ2V0T2JqZWN0KClbXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuSGlkZGVuXCJdLFxuXHRcdFx0XHRcdFx0YUNvbnRleHRzXG5cdFx0XHRcdFx0KSB8fCBmYWxzZTtcblx0XHRcdFx0Y29uc3QgaXNJbWFnZSA9IG9Qcm9wZXJ0eUluZm8gJiYgb1Byb3BlcnR5SW5mb1tcIkBjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5Jc0ltYWdlVVJMXCJdO1xuXG5cdFx0XHRcdG9JbnRlcmZhY2UuY29udGV4dCA9IHtcblx0XHRcdFx0XHRnZXRNb2RlbDogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIG9JbnRlcmZhY2UuZ2V0TW9kZWwoKTtcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdGdldFBhdGg6IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdHJldHVybiBzQ3VycmVudEVudGl0eVNldE5hbWUgKyBcIi9cIiArIHNEYXRhUHJvcGVydHlQYXRoO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fTtcblx0XHRcdFx0b1Byb3BlcnR5SW5mbyA9XG5cdFx0XHRcdFx0b0RhdGFGaWVsZENvbnZlcnRlZC5fdHlwZSA9PT0gXCJQcm9wZXJ0eVwiXG5cdFx0XHRcdFx0XHQ/IG9EYXRhRmllbGRDb252ZXJ0ZWRcblx0XHRcdFx0XHRcdDogKG9EYXRhRmllbGRDb252ZXJ0ZWQgJiYgb0RhdGFGaWVsZENvbnZlcnRlZC5WYWx1ZSAmJiBvRGF0YUZpZWxkQ29udmVydGVkLlZhbHVlLiR0YXJnZXQpIHx8XG5cdFx0XHRcdFx0XHQgIChvRGF0YUZpZWxkQ29udmVydGVkICYmIG9EYXRhRmllbGRDb252ZXJ0ZWQuVGFyZ2V0ICYmIG9EYXRhRmllbGRDb252ZXJ0ZWQuVGFyZ2V0LiR0YXJnZXQpO1xuXHRcdFx0XHQvLyBEYXRhZmllbGQgaXMgbm90IGluY2x1ZGVkIGluIHRoZSBGaWVsZENvbnRyb2wgY2FsY3VsYXRpb24sIG5lZWRzIHRvIGJlIGltcGxlbWVudGVkXG5cblx0XHRcdFx0Y29uc3QgY2hhcnRQcm9wZXJ0eSA9IG9Qcm9wZXJ0eUluZm8gJiYgb1Byb3BlcnR5SW5mby50ZXJtICYmIG9Qcm9wZXJ0eUluZm8udGVybSA9PT0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5DaGFydFwiO1xuXHRcdFx0XHRjb25zdCBpc0FjdGlvbiA9ICEhb0RhdGFGaWVsZENvbnZlcnRlZC5BY3Rpb247XG5cdFx0XHRcdGNvbnN0IGlzRmllbGRHcnAgPSBNYXNzRWRpdEhlbHBlci5nZXRJc0ZpZWxkR3JwKG9EYXRhRmllbGRDb252ZXJ0ZWQpO1xuXG5cdFx0XHRcdGlmIChpc0ltYWdlIHx8IGJIaWRkZW5GaWVsZCB8fCBjaGFydFByb3BlcnR5IHx8IGlzQWN0aW9uIHx8IGlzRmllbGRHcnApIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBFZGl0TW9kZSBhbmQgSW5wdXRUeXBlXG5cdFx0XHRcdGNvbnN0IHByb3BlcnR5Rm9yRmllbGRDb250cm9sID0gb1Byb3BlcnR5SW5mbyAmJiBvUHJvcGVydHlJbmZvLlZhbHVlID8gb1Byb3BlcnR5SW5mby5WYWx1ZSA6IG9Qcm9wZXJ0eUluZm87XG5cdFx0XHRcdGNvbnN0IGV4cEJpbmRpbmcgPSBnZXRFZGl0TW9kZShwcm9wZXJ0eUZvckZpZWxkQ29udHJvbCwgb0RhdGFNb2RlbFBhdGgsIGZhbHNlLCBmYWxzZSwgb0RhdGFGaWVsZENvbnZlcnRlZCwgdHJ1ZSk7XG5cdFx0XHRcdGNvbnN0IGVkaXRNb2RlVmFsdWVzID0gT2JqZWN0LmtleXMoRWRpdE1vZGUpO1xuXHRcdFx0XHRjb25zdCBlZGl0TW9kZUlzU3RhdGljID0gISFleHBCaW5kaW5nICYmIGVkaXRNb2RlVmFsdWVzLmluY2x1ZGVzKGV4cEJpbmRpbmcgYXMgRWRpdE1vZGUpO1xuXHRcdFx0XHRjb25zdCBlZGl0YWJsZSA9ICEhZXhwQmluZGluZyAmJiAoKGVkaXRNb2RlSXNTdGF0aWMgJiYgZXhwQmluZGluZyA9PT0gRWRpdE1vZGUuRWRpdGFibGUpIHx8ICFlZGl0TW9kZUlzU3RhdGljKTtcblxuXHRcdFx0XHRpZiAoIWVkaXRhYmxlKSB7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Y29uc3QgaW5wdXRUeXBlID0gTWFzc0VkaXRIZWxwZXIuZ2V0SW5wdXRUeXBlKG9Qcm9wZXJ0eUluZm8sIG9EYXRhRmllbGRDb252ZXJ0ZWQsIG9EYXRhTW9kZWxQYXRoKTtcblxuXHRcdFx0XHRpZiAoaW5wdXRUeXBlKSB7XG5cdFx0XHRcdFx0Y29uc3QgaXNSZWFkT25seSA9IGlzUmVhZE9ubHlFeHByZXNzaW9uKG9Qcm9wZXJ0eUluZm8pO1xuXHRcdFx0XHRcdGNvbnN0IGRpc3BsYXlNb2RlID0gQ29tbW9uVXRpbHMuY29tcHV0ZURpc3BsYXlNb2RlKG9Qcm9wZXJ0eUNvbnRleHQuZ2V0T2JqZWN0KCkpO1xuXHRcdFx0XHRcdG9SZXN1bHQgPSB7XG5cdFx0XHRcdFx0XHRcImxhYmVsXCI6IHNMYWJlbFRleHQsXG5cdFx0XHRcdFx0XHRcImRhdGFQcm9wZXJ0eVwiOiBzRGF0YVByb3BlcnR5UGF0aCxcblx0XHRcdFx0XHRcdFwiaXNWYWx1ZUhlbHBFbmFibGVkXCI6IGJWYWx1ZUhlbHBFbmFibGVkID8gYlZhbHVlSGVscEVuYWJsZWQgOiBmYWxzZSxcblx0XHRcdFx0XHRcdFwidW5pdFByb3BlcnR5XCI6IHNVbml0UHJvcGVydHlQYXRoID8gc1VuaXRQcm9wZXJ0eVBhdGggOiBmYWxzZSxcblx0XHRcdFx0XHRcdFwiaXNWYWx1ZUhlbHBFbmFibGVkRm9yVW5pdFwiOiBiVmFsdWVIZWxwRW5hYmxlZEZvclVuaXQgPyBiVmFsdWVIZWxwRW5hYmxlZEZvclVuaXQgOiBmYWxzZSxcblx0XHRcdFx0XHRcdFwicHJvcGVydHlQYXRoRm9yVmFsdWVIZWxwXCI6IHNDdXJyZW50RW50aXR5U2V0TmFtZSArIFwiL1wiICsgc0RhdGFQcm9wZXJ0eVBhdGgsXG5cdFx0XHRcdFx0XHRcInByb3BlcnR5UGF0aEZvclZhbHVlSGVscFVuaXRcIjogc0N1cnJlbnRFbnRpdHlTZXROYW1lICsgXCIvXCIgKyBzVW5pdFByb3BlcnR5UGF0aCxcblx0XHRcdFx0XHRcdFwiaXNGaWVsZFJlcXVpcmVkXCI6IGdldFJlcXVpcmVkRXhwcmVzc2lvbihvUHJvcGVydHlJbmZvLCBvRGF0YUZpZWxkQ29udmVydGVkLCB0cnVlKSxcblx0XHRcdFx0XHRcdFwiZGVmYXVsdFNlbGVjdGlvblBhdGhcIjogc0RhdGFQcm9wZXJ0eVBhdGhcblx0XHRcdFx0XHRcdFx0PyBNYXNzRWRpdEhlbHBlci5nZXREZWZhdWx0U2VsZWN0aW9uUGF0aENvbWJvQm94KGFDb250ZXh0cywgc0RhdGFQcm9wZXJ0eVBhdGgpXG5cdFx0XHRcdFx0XHRcdDogZmFsc2UsXG5cdFx0XHRcdFx0XHRcImRlZmF1bHRTZWxlY3Rpb25Vbml0UGF0aFwiOiBzVW5pdFByb3BlcnR5UGF0aFxuXHRcdFx0XHRcdFx0XHQ/IE1hc3NFZGl0SGVscGVyLmdldERlZmF1bHRTZWxlY3Rpb25QYXRoQ29tYm9Cb3goYUNvbnRleHRzLCBzVW5pdFByb3BlcnR5UGF0aClcblx0XHRcdFx0XHRcdFx0OiBmYWxzZSxcblx0XHRcdFx0XHRcdFwiZW50aXR5U2V0XCI6IHNDdXJyZW50RW50aXR5U2V0TmFtZSxcblx0XHRcdFx0XHRcdFwiZGlzcGxheVwiOiBkaXNwbGF5TW9kZSxcblx0XHRcdFx0XHRcdFwiZGVzY3JpcHRpb25QYXRoXCI6IE1hc3NFZGl0SGVscGVyLmdldFRleHRQYXRoKHNEYXRhUHJvcGVydHlQYXRoLCBvVGV4dEJpbmRpbmcsIGRpc3BsYXlNb2RlKSxcblx0XHRcdFx0XHRcdFwibnVsbGFibGVcIjogb1Byb3BlcnR5SW5mby5udWxsYWJsZSAhPT0gdW5kZWZpbmVkID8gb1Byb3BlcnR5SW5mby5udWxsYWJsZSA6IHRydWUsXG5cdFx0XHRcdFx0XHRcImlzUHJvcGVydHlSZWFkT25seVwiOiBpc1JlYWRPbmx5ICE9PSB1bmRlZmluZWQgPyBpc1JlYWRPbmx5IDogZmFsc2UsXG5cdFx0XHRcdFx0XHRcImlucHV0VHlwZVwiOiBpbnB1dFR5cGUsXG5cdFx0XHRcdFx0XHRcImVkaXRNb2RlXCI6IGVkaXRhYmxlID8gZXhwQmluZGluZyA6IHVuZGVmaW5lZCxcblx0XHRcdFx0XHRcdFwidW5pdERhdGFQYXRoXCI6IHNVbml0UHJvcGVydHlQYXRoICYmIFwiZmllbGRzSW5mbz4vdW5pdERhdGEvXCIsXG5cdFx0XHRcdFx0XHRcInZhbHVlc1BhdGhcIjogXCJmaWVsZHNJbmZvPi92YWx1ZXMvXCJcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdGFEYXRhQXJyYXkucHVzaChvUmVzdWx0KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdG9EYXRhRmllbGRNb2RlbC5zZXREYXRhKGFEYXRhQXJyYXkpO1xuXHRcdHJldHVybiBvRGF0YUZpZWxkTW9kZWw7XG5cdH0sXG5cblx0Z2V0VGFibGVGaWVsZHM6IGZ1bmN0aW9uIChvVGFibGU6IGFueSkge1xuXHRcdGNvbnN0IGFDb2x1bW5zID0gKG9UYWJsZSAmJiBvVGFibGUuZ2V0Q29sdW1ucygpKSB8fCBbXTtcblx0XHRjb25zdCBjb2x1bW5zRGF0YSA9IG9UYWJsZSAmJiBvVGFibGUuZ2V0UGFyZW50KCkuZ2V0VGFibGVEZWZpbml0aW9uKCkuY29sdW1ucztcblx0XHRyZXR1cm4gYUNvbHVtbnMubWFwKGZ1bmN0aW9uIChvQ29sdW1uOiBhbnkpIHtcblx0XHRcdGNvbnN0IHNEYXRhUHJvcGVydHkgPSBvQ29sdW1uICYmIG9Db2x1bW4uZ2V0RGF0YVByb3BlcnR5KCksXG5cdFx0XHRcdGFSZWFsdGVkQ29sdW1uSW5mbyA9XG5cdFx0XHRcdFx0Y29sdW1uc0RhdGEgJiZcblx0XHRcdFx0XHRjb2x1bW5zRGF0YS5maWx0ZXIoZnVuY3Rpb24gKG9Db2x1bW5JbmZvOiBhbnkpIHtcblx0XHRcdFx0XHRcdHJldHVybiBvQ29sdW1uSW5mby5uYW1lID09PSBzRGF0YVByb3BlcnR5ICYmIG9Db2x1bW5JbmZvLnR5cGUgPT09IFwiQW5ub3RhdGlvblwiO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XCJkYXRhUHJvcGVydHlcIjogc0RhdGFQcm9wZXJ0eSxcblx0XHRcdFx0XCJsYWJlbFwiOiBvQ29sdW1uLmdldEhlYWRlcigpLFxuXHRcdFx0XHRcImFubm90YXRpb25QYXRoXCI6IGFSZWFsdGVkQ29sdW1uSW5mbyAmJiBhUmVhbHRlZENvbHVtbkluZm9bMF0gJiYgYVJlYWx0ZWRDb2x1bW5JbmZvWzBdLmFubm90YXRpb25QYXRoXG5cdFx0XHR9O1xuXHRcdH0pO1xuXHR9LFxuXG5cdGdldERlZmF1bHRUZXh0c0ZvckRpYWxvZzogZnVuY3Rpb24gKG9SZXNvdXJjZUJ1bmRsZTogYW55LCBpU2VsZWN0ZWRDb250ZXh0czogYW55LCBvVGFibGU6IGFueSkge1xuXHRcdC8vIFRoZSBjb25maXJtIGJ1dHRvbiB0ZXh0IGlzIFwiU2F2ZVwiIGZvciB0YWJsZSBpbiBEaXNwbGF5IG1vZGUgYW5kIFwiQXBwbHlcIiBmb3IgdGFibGUgaW4gZWRpdCBtb2RlLiBUaGlzIGNhbiBiZSBsYXRlciBleHBvc2VkIGlmIG5lZWRlZC5cblx0XHRjb25zdCBiRGlzcGxheU1vZGUgPSBvVGFibGUuZGF0YShcImRpc3BsYXlNb2RlUHJvcGVydHlCaW5kaW5nXCIpID09PSBcInRydWVcIjtcblxuXHRcdHJldHVybiB7XG5cdFx0XHRcImtlZXBFeGlzdGluZ1ByZWZpeFwiOiBcIjwgS2VlcFwiLFxuXHRcdFx0XCJsZWF2ZUJsYW5rVmFsdWVcIjogXCI8IExlYXZlIEJsYW5rID5cIixcblx0XHRcdFwiY2xlYXJGaWVsZFZhbHVlXCI6IFwiPCBDbGVhciBWYWx1ZXMgPlwiLFxuXHRcdFx0XCJtYXNzRWRpdFRpdGxlXCI6IG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19NQVNTX0VESVRfRElBTE9HX1RJVExFXCIsIGlTZWxlY3RlZENvbnRleHRzLnRvU3RyaW5nKCkpLFxuXHRcdFx0XCJhcHBseUJ1dHRvblRleHRcIjogYkRpc3BsYXlNb2RlXG5cdFx0XHRcdD8gb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX01BU1NfRURJVF9TQVZFX0JVVFRPTl9URVhUXCIpXG5cdFx0XHRcdDogb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX01BU1NfRURJVF9BUFBMWV9CVVRUT05fVEVYVFwiKSxcblx0XHRcdFwidXNlVmFsdWVIZWxwVmFsdWVcIjogXCI8IFVzZSBWYWx1ZSBIZWxwID5cIixcblx0XHRcdFwiY2FuY2VsQnV0dG9uVGV4dFwiOiBvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfTUFTU19FRElUX0NBTkNFTF9CVVRUT05fVEVYVFwiKVxuXHRcdH07XG5cdH0sXG5cblx0LyoqXG5cdCAqIEFkZHMgYSBzdWZmaXggdG8gdGhlICdrZWVwIGV4aXN0aW5nJyBwcm9wZXJ0eSBvZiB0aGUgY29tYm9Cb3guXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzSW5wdXRUeXBlIElucHV0VHlwZSBvZiB0aGUgZmllbGRcblx0ICogQHJldHVybnMge3N0cmluZ31cblx0ICovXG5cdGdldFN1ZmZpeEZvcktlZXBFeGlzaXRpbmc6IGZ1bmN0aW9uIChzSW5wdXRUeXBlOiBzdHJpbmcpIHtcblx0XHRsZXQgc1Jlc3VsdCA9IFwiVmFsdWVzXCI7XG5cblx0XHRzd2l0Y2ggKHNJbnB1dFR5cGUpIHtcblx0XHRcdC8vVE9ETyAtIEFkZCBmb3Igb3RoZXIgY29udHJvbCB0eXBlcyBhcyB3ZWxsIChSYWRpbyBCdXR0b24sIEVtYWlsLCBJbnB1dCwgTURDIEZpZWxkcywgSW1hZ2UgZXRjLilcblx0XHRcdGNhc2UgXCJEYXRlUGlja2VyXCI6XG5cdFx0XHRcdHNSZXN1bHQgPSBcIkRhdGVzXCI7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSBcIkNoZWNrQm94XCI6XG5cdFx0XHRcdHNSZXN1bHQgPSBcIlNldHRpbmdzXCI7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0c1Jlc3VsdCA9IFwiVmFsdWVzXCI7XG5cdFx0fVxuXHRcdHJldHVybiBzUmVzdWx0O1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBBZGRzIGRlZmF1bHQgdmFsdWVzIHRvIHRoZSBtb2RlbCBbS2VlcCBFeGlzdGluZyBWYWx1ZXMsIExlYXZlIEJsYW5rXS5cblx0ICpcblx0ICogQHBhcmFtIHtBcnJheX0gYVZhbHVlcyBBcnJheSBpbnN0YW5jZSB3aGVyZSB0aGUgZGVmYXVsdCBkYXRhIG5lZWRzIHRvIGJlIGFkZGVkXG5cdCAqIEBwYXJhbSB7QXJyYXl9IGFDb250ZXh0cyBDb250ZXh0cyBmb3IgbWFzcyBlZGl0XG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvRGVmYXVsdFZhbHVlcyBEZWZhdWx0IHZhbHVlcyBmcm9tIEFwcGxpY2F0aW9uIE1hbmlmZXN0XG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvUHJvcGVydHlJbmZvIFByb3BlcnR5IGluZm9ybWF0aW9uXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gYlVPTUZpZWxkXG5cdCAqL1xuXHRzZXREZWZhdWx0VmFsdWVzVG9EaWFsb2c6IGZ1bmN0aW9uIChhVmFsdWVzOiBhbnksIGFDb250ZXh0czogYW55W10sIG9EZWZhdWx0VmFsdWVzOiBhbnksIG9Qcm9wZXJ0eUluZm86IGFueSwgYlVPTUZpZWxkPzogYm9vbGVhbikge1xuXHRcdGNvbnN0IHNQcm9wZXJ0eVBhdGggPSBiVU9NRmllbGQgPyBvUHJvcGVydHlJbmZvLnVuaXRQcm9wZXJ0eSA6IG9Qcm9wZXJ0eUluZm8uZGF0YVByb3BlcnR5LFxuXHRcdFx0c0lucHV0VHlwZSA9IG9Qcm9wZXJ0eUluZm8uaW5wdXRUeXBlLFxuXHRcdFx0YlByb3BlcnR5UmVxdWlyZWQgPSBvUHJvcGVydHlJbmZvLmlzRmllbGRSZXF1aXJlZDtcblx0XHRjb25zdCBzU3VmZml4Rm9yS2VlcEV4aXN0aW5nID0gTWFzc0VkaXRIZWxwZXIuZ2V0U3VmZml4Rm9yS2VlcEV4aXNpdGluZyhzSW5wdXRUeXBlKTtcblx0XHRhVmFsdWVzLmRlZmF1bHRPcHRpb25zID0gYVZhbHVlcy5kZWZhdWx0T3B0aW9ucyB8fCBbXTtcblx0XHQvL1RPRE8gLSBBZGQgPDxVc2UgVmFsdWUgSGVscCBvciBjb250cm9sIGltcGxtZW50YXRpb24+PiBhbmQgcmVsYXRlZCBrZXkgYnkgY2hlY2tpbmcgaWYgdmFsdWUgaGVscCBpcyBlbmFibGVkIGZvciBwcm9wZXJ0eSBvciBVbml0LlxuXHRcdC8vVE9ETyAtIEFkZCBvcHRpb24gQXBwbHkgdG8gRW1wdHkgRmllbGRzIG9ubHkgZm9yIEJvdGggVmFsdWUgSGVscCBhbmQgY29udHJvbHMuXG5cdFx0Y29uc3QgYlZhbHVlRXhpc3RzRm9yUHJvcGVydHlQYXRoID0gYUNvbnRleHRzLnNvbWUoZnVuY3Rpb24gKG9TZWxlY3RlZENvbnRleHQ6IGFueSkge1xuXHRcdFx0cmV0dXJuIG9TZWxlY3RlZENvbnRleHQuZ2V0T2JqZWN0KHNQcm9wZXJ0eVBhdGgpO1xuXHRcdH0pO1xuXG5cdFx0aWYgKHNJbnB1dFR5cGUgPT09IFwiQ2hlY2tCb3hcIikge1xuXHRcdFx0Y29uc3QgZmFsc2VFbnRyeSA9IHsgdGV4dDogXCJOb1wiLCBrZXk6IGAke3NQcm9wZXJ0eVBhdGh9L2ZhbHNlYCwgdGV4dEluZm86IHsgdmFsdWU6IGZhbHNlIH0gfTtcblx0XHRcdGNvbnN0IHRydXRoeUVudHJ5ID0geyB0ZXh0OiBcIlllc1wiLCBrZXk6IGAke3NQcm9wZXJ0eVBhdGh9L3RydWVgLCB0ZXh0SW5mbzogeyB2YWx1ZTogdHJ1ZSB9IH07XG5cdFx0XHRhVmFsdWVzLnVuc2hpZnQoZmFsc2VFbnRyeSk7XG5cdFx0XHRhVmFsdWVzLmRlZmF1bHRPcHRpb25zLnVuc2hpZnQoZmFsc2VFbnRyeSk7XG5cdFx0XHRhVmFsdWVzLnVuc2hpZnQodHJ1dGh5RW50cnkpO1xuXHRcdFx0YVZhbHVlcy5kZWZhdWx0T3B0aW9ucy51bnNoaWZ0KHRydXRoeUVudHJ5KTtcblx0XHR9XG5cblx0XHRpZiAob1Byb3BlcnR5SW5mby5pc1ZhbHVlSGVscEVuYWJsZWQgfHwgKG9Qcm9wZXJ0eUluZm8uaXNWYWx1ZUhlbHBFbmFibGVkRm9yVW5pdCAmJiBiVU9NRmllbGQpKSB7XG5cdFx0XHRjb25zdCB2aGRFbnRyeSA9IHsgdGV4dDogb0RlZmF1bHRWYWx1ZXMudXNlVmFsdWVIZWxwVmFsdWUsIGtleTogXCJVc2VWYWx1ZUhlbHBWYWx1ZS9cIiArIHNQcm9wZXJ0eVBhdGggfTtcblx0XHRcdGFWYWx1ZXMudW5zaGlmdCh2aGRFbnRyeSk7XG5cdFx0XHRhVmFsdWVzLmRlZmF1bHRPcHRpb25zLnVuc2hpZnQodmhkRW50cnkpO1xuXHRcdH1cblxuXHRcdGlmIChiVmFsdWVFeGlzdHNGb3JQcm9wZXJ0eVBhdGgpIHtcblx0XHRcdGlmIChiUHJvcGVydHlSZXF1aXJlZCAhPT0gXCJ0cnVlXCIgJiYgIWJVT01GaWVsZCkge1xuXHRcdFx0XHRjb25zdCBjbGVhckVudHJ5ID0geyB0ZXh0OiBvRGVmYXVsdFZhbHVlcy5jbGVhckZpZWxkVmFsdWUsIGtleTogXCJDbGVhckZpZWxkVmFsdWUvXCIgKyBzUHJvcGVydHlQYXRoIH07XG5cdFx0XHRcdGFWYWx1ZXMudW5zaGlmdChjbGVhckVudHJ5KTtcblx0XHRcdFx0YVZhbHVlcy5kZWZhdWx0T3B0aW9ucy51bnNoaWZ0KGNsZWFyRW50cnkpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zdCBlbXB0eUVudHJ5ID0geyB0ZXh0OiBvRGVmYXVsdFZhbHVlcy5sZWF2ZUJsYW5rVmFsdWUsIGtleTogXCJFbXB0eS9cIiArIHNQcm9wZXJ0eVBhdGggfTtcblx0XHRcdGFWYWx1ZXMudW5zaGlmdChlbXB0eUVudHJ5KTtcblx0XHRcdGFWYWx1ZXMuZGVmYXVsdE9wdGlvbnMudW5zaGlmdChlbXB0eUVudHJ5KTtcblx0XHR9XG5cdFx0Y29uc3Qga2VlcEVudHJ5ID0ge1xuXHRcdFx0dGV4dDogb0RlZmF1bHRWYWx1ZXMua2VlcEV4aXN0aW5nUHJlZml4ICsgXCIgXCIgKyBzU3VmZml4Rm9yS2VlcEV4aXN0aW5nICsgXCIgPlwiLFxuXHRcdFx0a2V5OiBcIkRlZmF1bHQvXCIgKyBzUHJvcGVydHlQYXRoXG5cdFx0fTtcblx0XHRhVmFsdWVzLnVuc2hpZnQoa2VlcEVudHJ5KTtcblx0XHRhVmFsdWVzLmRlZmF1bHRPcHRpb25zLnVuc2hpZnQoa2VlcEVudHJ5KTtcblx0fSxcblxuXHQvKipcblx0ICogR2V0IHRleHQgYXJyYW5nZW1lbnQgaW5mbyBmb3IgYSBjb250ZXh0IHByb3BlcnR5LlxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgUGF0aFxuXHQgKiBAcGFyYW0ge3N0cmluZ30gZGVzY3JpcHRpb25QYXRoIFBhdGggdG8gdGV4dCBhc3NvY2lhdGlvbiBvZiB0aGUgcHJvcGVydHlcblx0ICogQHBhcmFtIHtzdHJpbmd9IGRpc3BsYXlNb2RlIERpc3BsYXkgbW9kZSBvZiB0aGUgcHJvcGVydHkgYW5kIHRleHQgYXNzb2NpYXRpb25cblx0ICogQHBhcmFtIHtDb250ZXh0fSBzZWxlY3RlZENvbnRleHQgQ29udGV4dCB0byBmaW5kIHRoZSBmdWxsIHRleHRcblx0ICogQHJldHVybnMge1RleHRBcnJhbmdlbWVudEluZm99XG5cdCAqL1xuXHRnZXRUZXh0QXJyYW5nZW1lbnRJbmZvOiBmdW5jdGlvbiAoXG5cdFx0cHJvcGVydHk6IHN0cmluZyxcblx0XHRkZXNjcmlwdGlvblBhdGg6IHN0cmluZyxcblx0XHRkaXNwbGF5TW9kZTogc3RyaW5nLFxuXHRcdHNlbGVjdGVkQ29udGV4dDogQ29udGV4dFxuXHQpOiBUZXh0QXJyYW5nZW1lbnRJbmZvIHtcblx0XHRsZXQgdmFsdWUgPSBzZWxlY3RlZENvbnRleHQuZ2V0T2JqZWN0KHByb3BlcnR5KSxcblx0XHRcdGRlc2NyaXB0aW9uVmFsdWUsXG5cdFx0XHRmdWxsVGV4dDtcblx0XHRpZiAoZGVzY3JpcHRpb25QYXRoICYmIHByb3BlcnR5KSB7XG5cdFx0XHRzd2l0Y2ggKGRpc3BsYXlNb2RlKSB7XG5cdFx0XHRcdGNhc2UgXCJEZXNjcmlwdGlvblwiOlxuXHRcdFx0XHRcdGRlc2NyaXB0aW9uVmFsdWUgPSBzZWxlY3RlZENvbnRleHQuZ2V0T2JqZWN0KGRlc2NyaXB0aW9uUGF0aCk7XG5cdFx0XHRcdFx0ZnVsbFRleHQgPSBkZXNjcmlwdGlvblZhbHVlO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIFwiVmFsdWVcIjpcblx0XHRcdFx0XHR2YWx1ZSA9IHNlbGVjdGVkQ29udGV4dC5nZXRPYmplY3QocHJvcGVydHkpO1xuXHRcdFx0XHRcdGZ1bGxUZXh0ID0gdmFsdWU7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgXCJWYWx1ZURlc2NyaXB0aW9uXCI6XG5cdFx0XHRcdFx0dmFsdWUgPSBzZWxlY3RlZENvbnRleHQuZ2V0T2JqZWN0KHByb3BlcnR5KTtcblx0XHRcdFx0XHRkZXNjcmlwdGlvblZhbHVlID0gc2VsZWN0ZWRDb250ZXh0LmdldE9iamVjdChkZXNjcmlwdGlvblBhdGgpO1xuXHRcdFx0XHRcdGZ1bGxUZXh0ID0gdmFsdWUgKyBcIiAoXCIgKyBkZXNjcmlwdGlvblZhbHVlICsgXCIpXCI7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgXCJEZXNjcmlwdGlvblZhbHVlXCI6XG5cdFx0XHRcdFx0dmFsdWUgPSBzZWxlY3RlZENvbnRleHQuZ2V0T2JqZWN0KHByb3BlcnR5KTtcblx0XHRcdFx0XHRkZXNjcmlwdGlvblZhbHVlID0gc2VsZWN0ZWRDb250ZXh0LmdldE9iamVjdChkZXNjcmlwdGlvblBhdGgpO1xuXHRcdFx0XHRcdGZ1bGxUZXh0ID0gZGVzY3JpcHRpb25WYWx1ZSArIFwiIChcIiArIHZhbHVlICsgXCIpXCI7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0TG9nLmluZm8oXCJEaXNwbGF5IFByb3BlcnR5IG5vdCBhcHBsaWNhYmxlOiBcIiArIHByb3BlcnR5KTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0XCJ0ZXh0QXJyYW5nZW1lbnRcIjogZGlzcGxheU1vZGUsXG5cdFx0XHRcInZhbHVlUGF0aFwiOiBwcm9wZXJ0eSxcblx0XHRcdFwiZGVzY3JpcHRpb25QYXRoXCI6IGRlc2NyaXB0aW9uUGF0aCxcblx0XHRcdFwidmFsdWVcIjogdmFsdWUsXG5cdFx0XHRcImRlc2NyaXB0aW9uXCI6IGRlc2NyaXB0aW9uVmFsdWUsXG5cdFx0XHRcImZ1bGxUZXh0XCI6IGZ1bGxUZXh0XG5cdFx0fTtcblx0fSxcblxuXHQvKipcblx0ICogUmV0dXJuIHRoZSB2aXNpYmlsaXR5IHZhbHV1ZSBmb3IgdGhlIE1hbmFnZWRPYmplY3QgQW55LlxuXHQgKlxuXHQgKiBAcGFyYW0ge0FueVR5cGV9IGFueSBUaGUgTWFuYWdlZE9iamVjdCBBbnkgdG8gYmUgdXNlZCB0byBjYWxjdWxhdGUgdGhlIHZpc2libGUgdmFsdWUgb2YgdGhlIGJpbmRpbmcuXG5cdCAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIHRydWUgaWYgdGhlIG1hc3MgZWRpdCBmaWVsZCBpcyBlZGl0YWJsZS5cblx0ICovXG5cdGlzRWRpdGFibGU6IGZ1bmN0aW9uIChhbnk6IEFueVR5cGUpOiBib29sZWFuIHtcblx0XHRjb25zdCBiaW5kaW5nID0gYW55LmdldEJpbmRpbmcoXCJhbnlcIik7XG5cdFx0Y29uc3QgdmFsdWUgPSAoYmluZGluZyBhcyBhbnkpLmdldEV4dGVybmFsVmFsdWUoKTtcblx0XHRyZXR1cm4gdmFsdWUgPT09IEVkaXRNb2RlLkVkaXRhYmxlO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBDYWxjdWxhdGUgYW5kIHVwZGF0ZSB0aGUgdmlzaWJpbGl0eSBvZiBtYXNzIGVkaXQgZmllbGQgb24gY2hhbmdlIG9mIHRoZSBNYW5hZ2VkT2JqZWN0IEFueSBiaW5kaW5nLlxuXHQgKlxuXHQgKiBAcGFyYW0ge0pTT05Nb2RlbH0gb0RpYWxvZ0RhdGFNb2RlbCBNb2RlbCB0byBiZSB1c2VkIHJ1bnRpbWUuXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBkYXRhUHJvcGVydHkgRmllbGQgbmFtZS5cblx0ICovXG5cdG9uQ29udGV4dEVkaXRhYmxlQ2hhbmdlOiBmdW5jdGlvbiAob0RpYWxvZ0RhdGFNb2RlbDogSlNPTk1vZGVsLCBkYXRhUHJvcGVydHk6IHN0cmluZyk6IHZvaWQge1xuXHRcdGNvbnN0IG9iamVjdHNGb3JWaXNpYmlsaXR5ID0gb0RpYWxvZ0RhdGFNb2RlbC5nZXRQcm9wZXJ0eShcIi92YWx1ZXMvXCIgKyBkYXRhUHJvcGVydHkgKyBcIi9vYmplY3RzRm9yVmlzaWJpbGl0eVwiKSB8fCBbXTtcblx0XHRjb25zdCBlZGl0YWJsZSA9IG9iamVjdHNGb3JWaXNpYmlsaXR5LnNvbWUoTWFzc0VkaXRIZWxwZXIuaXNFZGl0YWJsZSk7XG5cblx0XHRpZiAoZWRpdGFibGUpIHtcblx0XHRcdG9EaWFsb2dEYXRhTW9kZWwuc2V0UHJvcGVydHkoXCIvdmFsdWVzL1wiICsgZGF0YVByb3BlcnR5ICsgXCIvdmlzaWJsZVwiLCBlZGl0YWJsZSk7XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBVcGRhdGUgTWFuYWdlZCBPYmplY3QgQW55IGZvciB2aXNpYmlsaXR5IG9mIHRoZSBtYXNzIGVkaXQgZmllbGRzLlxuXHQgKlxuXHQgKiBAcGFyYW0ge0FueVR5cGV9IG1PVG9Vc2UgVGhlIE1hbmFnZWRPYmplY3QgQW55IHRvIGJlIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSB2aXNpYmxlIHZhbHVlIG9mIHRoZSBiaW5kaW5nLlxuXHQgKiBAcGFyYW0ge0pTT05Nb2RlbH0gb0RpYWxvZ0RhdGFNb2RlbCBNb2RlbCB0byBiZSB1c2VkIHJ1bnRpbWUuXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBkYXRhUHJvcGVydHkgRmllbGQgbmFtZS5cblx0ICogQHBhcmFtIHthbnl9IHZhbHVlcyBWYWx1ZXMgb2YgdGhlIGZpZWxkLlxuXHQgKi9cblx0dXBkYXRlT25Db250ZXh0Q2hhbmdlOiBmdW5jdGlvbiAobU9Ub1VzZTogQW55VHlwZSwgb0RpYWxvZ0RhdGFNb2RlbDogSlNPTk1vZGVsLCBkYXRhUHJvcGVydHk6IHN0cmluZywgdmFsdWVzOiBhbnkpIHtcblx0XHRjb25zdCBiaW5kaW5nID0gbU9Ub1VzZS5nZXRCaW5kaW5nKFwiYW55XCIpO1xuXG5cdFx0dmFsdWVzLm9iamVjdHNGb3JWaXNpYmlsaXR5ID0gdmFsdWVzLm9iamVjdHNGb3JWaXNpYmlsaXR5IHx8IFtdO1xuXHRcdHZhbHVlcy5vYmplY3RzRm9yVmlzaWJpbGl0eS5wdXNoKG1PVG9Vc2UpO1xuXG5cdFx0YmluZGluZy5hdHRhY2hDaGFuZ2UoTWFzc0VkaXRIZWxwZXIub25Db250ZXh0RWRpdGFibGVDaGFuZ2UuYmluZChudWxsLCBvRGlhbG9nRGF0YU1vZGVsLCBkYXRhUHJvcGVydHkpKTtcblx0fSxcblxuXHQvKipcblx0ICogR2V0IGJvdW5kIG9iamVjdCB0byBjYWxjdWxhdGUgdGhlIHZpc2liaWxpdHkgb2YgY29udGV4dHMuXG5cdCAqXG5cdCAqIEBwYXJhbSB7QmluZGluZ0V4cHJlc3Npb248Ym9vbGVhbj4gfCBFeHByZXNzaW9uT3JQcmltaXRpdmU8Ym9vbGVhbj59IGV4cEJpbmRpbmcgQmluZGluZyBTdHJpbmcgb2JqZWN0LlxuXHQgKiBAcGFyYW0ge29iamVjdH0gY29udGV4dCBDb250ZXh0IHRoZSBiaW5kaW5nIHZhbHVlLlxuXHQgKiBAcmV0dXJucyB7QW55VHlwZX0gVGhlIE1hbmFnZWRPYmplY3QgQW55IHRvIGJlIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSB2aXNpYmxlIHZhbHVlIG9mIHRoZSBiaW5kaW5nLlxuXHQgKi9cblx0Z2V0Qm91bmRPYmplY3Q6IGZ1bmN0aW9uIChleHBCaW5kaW5nOiBCaW5kaW5nRXhwcmVzc2lvbjxzdHJpbmc+IHwgRXhwcmVzc2lvbk9yUHJpbWl0aXZlPHN0cmluZz4sIGNvbnRleHQ6IENvbnRleHQpOiBBbnlUeXBlIHtcblx0XHRjb25zdCBtT1RvVXNlID0gbmV3IEFueSh7IGFueTogZXhwQmluZGluZyB9KTtcblx0XHRjb25zdCBtb2RlbCA9IGNvbnRleHQuZ2V0TW9kZWwoKTtcblx0XHRtT1RvVXNlLnNldE1vZGVsKG1vZGVsKTtcblx0XHRtT1RvVXNlLnNldEJpbmRpbmdDb250ZXh0KGNvbnRleHQpO1xuXG5cdFx0cmV0dXJuIG1PVG9Vc2U7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEdldCB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgZmllbGQuXG5cdCAqXG5cdCAqIEBwYXJhbSB7QmluZGluZ0V4cHJlc3Npb248Ym9vbGVhbj4gfCBFeHByZXNzaW9uT3JQcmltaXRpdmU8Ym9vbGVhbj59IGV4cEJpbmRpbmcgQmluZGluZyBTdHJpbmcgb2JqZWN0LlxuXHQgKiBAcGFyYW0ge0pTT05Nb2RlbH0gb0RpYWxvZ0RhdGFNb2RlbCBNb2RlbCB0byBiZSB1c2VkIHJ1bnRpbWUuXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBkYXRhUHJvcGVydHkgRmllbGQgbmFtZS5cblx0ICogQHBhcmFtIHthbnl9IHZhbHVlcyBWYWx1ZXMgb2YgdGhlIGZpZWxkLlxuXHQgKiBAcGFyYW0ge29iamVjdH0gY29udGV4dCBDb250ZXh0IHRoZSBiaW5kaW5nIHZhbHVlLlxuXHQgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIHRoZSBtYXNzIGVkaXQgZmllbGQgaXMgZWRpdGFibGUuXG5cdCAqL1xuXHRnZXRGaWVsZFZpc2libGl0eTogZnVuY3Rpb24gKFxuXHRcdGV4cEJpbmRpbmc6IEJpbmRpbmdFeHByZXNzaW9uPHN0cmluZz4gfCBFeHByZXNzaW9uT3JQcmltaXRpdmU8c3RyaW5nPixcblx0XHRvRGlhbG9nRGF0YU1vZGVsOiBKU09OTW9kZWwsXG5cdFx0ZGF0YVByb3BlcnR5OiBzdHJpbmcsXG5cdFx0dmFsdWVzOiBhbnksXG5cdFx0Y29udGV4dDogQ29udGV4dFxuXHQpOiBib29sZWFuIHtcblx0XHRjb25zdCBtT1RvVXNlID0gTWFzc0VkaXRIZWxwZXIuZ2V0Qm91bmRPYmplY3QoZXhwQmluZGluZywgY29udGV4dCk7XG5cdFx0Y29uc3QgaXNDb250ZXh0RWRpdGFibGUgPSBNYXNzRWRpdEhlbHBlci5pc0VkaXRhYmxlKG1PVG9Vc2UpO1xuXG5cdFx0aWYgKCFpc0NvbnRleHRFZGl0YWJsZSkge1xuXHRcdFx0TWFzc0VkaXRIZWxwZXIudXBkYXRlT25Db250ZXh0Q2hhbmdlKG1PVG9Vc2UsIG9EaWFsb2dEYXRhTW9kZWwsIGRhdGFQcm9wZXJ0eSwgdmFsdWVzKTtcblx0XHR9XG5cdFx0cmV0dXJuIGlzQ29udGV4dEVkaXRhYmxlO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBJbml0aWFsaXplcyBhIHJ1bnRpbWUgbW9kZWw6XG5cdCAqID0+IFRoZSBtb2RlbCBjb25zaXN0cyBvZiB2YWx1ZXMgc2hvd24gaW4gdGhlIGNvbWJvQm94IG9mIHRoZSBkaWFsb2cgKExlYXZlIEJsYW5rLCBLZWVwIEV4aXN0aW5nIFZhbHVlcywgb3IgYW55IHByb3BlcnR5IHZhbHVlIGZvciB0aGUgc2VsZWN0ZWQgY29udGV4dCwgZXRjLilcblx0ICogPT4gVGhlIG1vZGVsIHdpbGwgY2FwdHVyZSBydW50aW1lIGNoYW5nZXMgaW4gdGhlIHJlc3VsdHMgcHJvcGVydHkgKHRoZSB2YWx1ZSBlbnRlcmVkIGluIHRoZSBjb21ib0JveCkuXG5cdCAqXG5cdCAqIEBwYXJhbSB7QXJyYXl9IGFDb250ZXh0cyBDb250ZXh0cyBmb3IgbWFzcyBlZGl0XG5cdCAqIEBwYXJhbSB7QXJyYXl9IGFEYXRhQXJyYXkgQXJyYXkgY29udGFpbmluZyBkYXRhIHJlbGF0ZWQgdG8gdGhlIGRpYWxvZyB1c2VkIGJ5IGJvdGggdGhlIHN0YXRpYyBhbmQgdGhlIHJ1bnRpbWUgbW9kZWxcblx0ICogQHBhcmFtIHtvYmplY3R9IG9EZWZhdWx0VmFsdWVzIERlZmF1bHQgdmFsdWVzIGZyb20gaTE4blxuXHQgKiBAcGFyYW0ge0NvbnRleHR9IGRpYWxvZ0NvbnRleHQgVHJhbnNpZW50IGNvbnRleHQgZm9yIG1hc3MgZWRpdCBkaWFsb2cuXG5cdCAqIEByZXR1cm5zIHtvYmplY3R9XG5cdCAqL1xuXHRzZXRSdW50aW1lTW9kZWxPbkRpYWxvZzogZnVuY3Rpb24gKGFDb250ZXh0czogYW55W10sIGFEYXRhQXJyYXk6IGFueVtdLCBvRGVmYXVsdFZhbHVlczogYW55LCBkaWFsb2dDb250ZXh0OiBDb250ZXh0KSB7XG5cdFx0Y29uc3QgYVZhbHVlczogYW55W10gPSBbXTtcblx0XHRjb25zdCBhVW5pdERhdGE6IGFueVtdID0gW107XG5cdFx0Y29uc3QgYVJlc3VsdHM6IGFueVtdID0gW107XG5cdFx0Y29uc3QgYVJlYWRPbmx5RmllbGRJbmZvOiBhbnlbXSA9IFtdO1xuXHRcdGNvbnN0IG9EYXRhID0ge1xuXHRcdFx0XCJ2YWx1ZXNcIjogYVZhbHVlcyxcblx0XHRcdFwidW5pdERhdGFcIjogYVVuaXREYXRhLFxuXHRcdFx0XCJyZXN1bHRzXCI6IGFSZXN1bHRzLFxuXHRcdFx0XCJyZWFkYWJsZVByb3BlcnR5RGF0YVwiOiBhUmVhZE9ubHlGaWVsZEluZm8sXG5cdFx0XHRcInNlbGVjdGVkS2V5XCI6IHVuZGVmaW5lZFxuXHRcdH07XG5cdFx0Y29uc3Qgb0RpYWxvZ0RhdGFNb2RlbCA9IG5ldyBKU09OTW9kZWwob0RhdGEpO1xuXHRcdGFEYXRhQXJyYXkuZm9yRWFjaChmdW5jdGlvbiAob0RhdGE6IGFueSkge1xuXHRcdFx0bGV0IG9UZXh0SW5mbztcblx0XHRcdGxldCBzUHJvcGVydHlLZXk7XG5cdFx0XHRsZXQgc1VuaXRQcm9wZXJ0eU5hbWU7XG5cdFx0XHRjb25zdCBvRGlzdGluY3RWYWx1ZU1hcDogYW55ID0ge307XG5cdFx0XHRjb25zdCBvRGlzdGluY3RVbml0TWFwOiBhbnkgPSB7fTtcblx0XHRcdGlmIChvRGF0YS5kYXRhUHJvcGVydHkgJiYgb0RhdGEuZGF0YVByb3BlcnR5LmluZGV4T2YoXCIvXCIpID4gLTEpIHtcblx0XHRcdFx0Y29uc3QgYUZpbmFsUGF0aCA9IE1hc3NFZGl0SGVscGVyLmluaXRMYXN0TGV2ZWxPZlByb3BlcnR5UGF0aChvRGF0YS5kYXRhUHJvcGVydHksIGFWYWx1ZXMgLyosIGRpYWxvZ0NvbnRleHQgKi8pO1xuXHRcdFx0XHRjb25zdCBhUHJvcGVydHlQYXRocyA9IG9EYXRhLmRhdGFQcm9wZXJ0eS5zcGxpdChcIi9cIik7XG5cblx0XHRcdFx0Zm9yIChjb25zdCBjb250ZXh0IG9mIGFDb250ZXh0cykge1xuXHRcdFx0XHRcdGNvbnN0IHNNdWx0aUxldmVsUGF0aFZhbHVlID0gY29udGV4dC5nZXRPYmplY3Qob0RhdGEuZGF0YVByb3BlcnR5KTtcblx0XHRcdFx0XHRzUHJvcGVydHlLZXkgPSBvRGF0YS5kYXRhUHJvcGVydHkgKyBcIi9cIiArIHNNdWx0aUxldmVsUGF0aFZhbHVlO1xuXHRcdFx0XHRcdGlmICghb0Rpc3RpbmN0VmFsdWVNYXBbc1Byb3BlcnR5S2V5XSAmJiBhRmluYWxQYXRoW2FQcm9wZXJ0eVBhdGhzW2FQcm9wZXJ0eVBhdGhzLmxlbmd0aCAtIDFdXSkge1xuXHRcdFx0XHRcdFx0b1RleHRJbmZvID0gTWFzc0VkaXRIZWxwZXIuZ2V0VGV4dEFycmFuZ2VtZW50SW5mbyhcblx0XHRcdFx0XHRcdFx0b0RhdGEuZGF0YVByb3BlcnR5LFxuXHRcdFx0XHRcdFx0XHRvRGF0YS5kZXNjcmlwdGlvblBhdGgsXG5cdFx0XHRcdFx0XHRcdG9EYXRhLmRpc3BsYXksXG5cdFx0XHRcdFx0XHRcdGNvbnRleHRcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRhRmluYWxQYXRoW2FQcm9wZXJ0eVBhdGhzW2FQcm9wZXJ0eVBhdGhzLmxlbmd0aCAtIDFdXS5wdXNoKHtcblx0XHRcdFx0XHRcdFx0XCJ0ZXh0XCI6IChvVGV4dEluZm8gJiYgb1RleHRJbmZvLmZ1bGxUZXh0KSB8fCBzTXVsdGlMZXZlbFBhdGhWYWx1ZSxcblx0XHRcdFx0XHRcdFx0XCJrZXlcIjogc1Byb3BlcnR5S2V5LFxuXHRcdFx0XHRcdFx0XHRcInRleHRJbmZvXCI6IG9UZXh0SW5mb1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRvRGlzdGluY3RWYWx1ZU1hcFtzUHJvcGVydHlLZXldID0gc011bHRpTGV2ZWxQYXRoVmFsdWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdC8vIGlmIChPYmplY3Qua2V5cyhvRGlzdGluY3RWYWx1ZU1hcCkubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRcdC8vIFx0ZGlhbG9nQ29udGV4dC5zZXRQcm9wZXJ0eShvRGF0YS5kYXRhUHJvcGVydHksIHNQcm9wZXJ0eUtleSAmJiBvRGlzdGluY3RWYWx1ZU1hcFtzUHJvcGVydHlLZXldKTtcblx0XHRcdFx0Ly8gfVxuXG5cdFx0XHRcdGFGaW5hbFBhdGhbYVByb3BlcnR5UGF0aHNbYVByb3BlcnR5UGF0aHMubGVuZ3RoIC0gMV1dLnRleHRJbmZvID0ge1xuXHRcdFx0XHRcdGRlc2NyaXB0aW9uUGF0aDogb0RhdGEuZGVzY3JpcHRpb25QYXRoLFxuXHRcdFx0XHRcdHZhbHVlUGF0aDogb0RhdGEuZGF0YVByb3BlcnR5LFxuXHRcdFx0XHRcdGRpc3BsYXlNb2RlOiBvRGF0YS5kaXNwbGF5XG5cdFx0XHRcdH07XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRhVmFsdWVzW29EYXRhLmRhdGFQcm9wZXJ0eV0gPSBhVmFsdWVzW29EYXRhLmRhdGFQcm9wZXJ0eV0gfHwgW107XG5cdFx0XHRcdGFWYWx1ZXNbb0RhdGEuZGF0YVByb3BlcnR5XVtcInNlbGVjdE9wdGlvbnNcIl0gPSBhVmFsdWVzW29EYXRhLmRhdGFQcm9wZXJ0eV1bXCJzZWxlY3RPcHRpb25zXCJdIHx8IFtdO1xuXHRcdFx0XHRpZiAob0RhdGEudW5pdFByb3BlcnR5KSB7XG5cdFx0XHRcdFx0YVVuaXREYXRhW29EYXRhLnVuaXRQcm9wZXJ0eV0gPSBhVW5pdERhdGFbb0RhdGEudW5pdFByb3BlcnR5XSB8fCBbXTtcblx0XHRcdFx0XHRhVW5pdERhdGFbb0RhdGEudW5pdFByb3BlcnR5XVtcInNlbGVjdE9wdGlvbnNcIl0gPSBhVW5pdERhdGFbb0RhdGEudW5pdFByb3BlcnR5XVtcInNlbGVjdE9wdGlvbnNcIl0gfHwgW107XG5cdFx0XHRcdH1cblx0XHRcdFx0Zm9yIChjb25zdCBjb250ZXh0IG9mIGFDb250ZXh0cykge1xuXHRcdFx0XHRcdGNvbnN0IG9EYXRhT2JqZWN0ID0gY29udGV4dC5nZXRPYmplY3QoKTtcblx0XHRcdFx0XHRzUHJvcGVydHlLZXkgPSBvRGF0YS5kYXRhUHJvcGVydHkgKyBcIi9cIiArIG9EYXRhT2JqZWN0W29EYXRhLmRhdGFQcm9wZXJ0eV07XG5cdFx0XHRcdFx0aWYgKG9EYXRhLmRhdGFQcm9wZXJ0eSAmJiBvRGF0YU9iamVjdFtvRGF0YS5kYXRhUHJvcGVydHldICYmICFvRGlzdGluY3RWYWx1ZU1hcFtzUHJvcGVydHlLZXldKSB7XG5cdFx0XHRcdFx0XHRpZiAob0RhdGEuaW5wdXRUeXBlICE9IFwiQ2hlY2tCb3hcIikge1xuXHRcdFx0XHRcdFx0XHRvVGV4dEluZm8gPSBNYXNzRWRpdEhlbHBlci5nZXRUZXh0QXJyYW5nZW1lbnRJbmZvKFxuXHRcdFx0XHRcdFx0XHRcdG9EYXRhLmRhdGFQcm9wZXJ0eSxcblx0XHRcdFx0XHRcdFx0XHRvRGF0YS5kZXNjcmlwdGlvblBhdGgsXG5cdFx0XHRcdFx0XHRcdFx0b0RhdGEuZGlzcGxheSxcblx0XHRcdFx0XHRcdFx0XHRjb250ZXh0XG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IGVudHJ5ID0ge1xuXHRcdFx0XHRcdFx0XHRcdFwidGV4dFwiOiAob1RleHRJbmZvICYmIG9UZXh0SW5mby5mdWxsVGV4dCkgfHwgb0RhdGFPYmplY3Rbb0RhdGEuZGF0YVByb3BlcnR5XSxcblx0XHRcdFx0XHRcdFx0XHRcImtleVwiOiBzUHJvcGVydHlLZXksXG5cdFx0XHRcdFx0XHRcdFx0XCJ0ZXh0SW5mb1wiOiBvVGV4dEluZm9cblx0XHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdFx0YVZhbHVlc1tvRGF0YS5kYXRhUHJvcGVydHldLnB1c2goZW50cnkpO1xuXHRcdFx0XHRcdFx0XHRhVmFsdWVzW29EYXRhLmRhdGFQcm9wZXJ0eV1bXCJzZWxlY3RPcHRpb25zXCJdLnB1c2goZW50cnkpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0b0Rpc3RpbmN0VmFsdWVNYXBbc1Byb3BlcnR5S2V5XSA9IG9EYXRhT2JqZWN0W29EYXRhLmRhdGFQcm9wZXJ0eV07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChvRGF0YS51bml0UHJvcGVydHkgJiYgb0RhdGFPYmplY3Rbb0RhdGEudW5pdFByb3BlcnR5XSkge1xuXHRcdFx0XHRcdFx0c1VuaXRQcm9wZXJ0eU5hbWUgPSBvRGF0YS51bml0UHJvcGVydHkgKyBcIi9cIiArIG9EYXRhT2JqZWN0W29EYXRhLnVuaXRQcm9wZXJ0eV07XG5cdFx0XHRcdFx0XHRpZiAoIW9EaXN0aW5jdFVuaXRNYXBbc1VuaXRQcm9wZXJ0eU5hbWVdKSB7XG5cdFx0XHRcdFx0XHRcdGlmIChvRGF0YS5pbnB1dFR5cGUgIT0gXCJDaGVja0JveFwiKSB7XG5cdFx0XHRcdFx0XHRcdFx0b1RleHRJbmZvID0gTWFzc0VkaXRIZWxwZXIuZ2V0VGV4dEFycmFuZ2VtZW50SW5mbyhcblx0XHRcdFx0XHRcdFx0XHRcdG9EYXRhLnVuaXRQcm9wZXJ0eSxcblx0XHRcdFx0XHRcdFx0XHRcdG9EYXRhLmRlc2NyaXB0aW9uUGF0aCxcblx0XHRcdFx0XHRcdFx0XHRcdG9EYXRhLmRpc3BsYXksXG5cdFx0XHRcdFx0XHRcdFx0XHRjb250ZXh0XG5cdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCB1bml0RW50cnkgPSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcInRleHRcIjogKG9UZXh0SW5mbyAmJiBvVGV4dEluZm8uZnVsbFRleHQpIHx8IG9EYXRhT2JqZWN0W29EYXRhLnVuaXRQcm9wZXJ0eV0sXG5cdFx0XHRcdFx0XHRcdFx0XHRcImtleVwiOiBzVW5pdFByb3BlcnR5TmFtZSxcblx0XHRcdFx0XHRcdFx0XHRcdFwidGV4dEluZm9cIjogb1RleHRJbmZvXG5cdFx0XHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdFx0XHRhVW5pdERhdGFbb0RhdGEudW5pdFByb3BlcnR5XS5wdXNoKHVuaXRFbnRyeSk7XG5cdFx0XHRcdFx0XHRcdFx0YVVuaXREYXRhW29EYXRhLnVuaXRQcm9wZXJ0eV1bXCJzZWxlY3RPcHRpb25zXCJdLnB1c2godW5pdEVudHJ5KTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRvRGlzdGluY3RVbml0TWFwW3NVbml0UHJvcGVydHlOYW1lXSA9IG9EYXRhT2JqZWN0W29EYXRhLnVuaXRQcm9wZXJ0eV07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGFWYWx1ZXNbb0RhdGEuZGF0YVByb3BlcnR5XS50ZXh0SW5mbyA9IHtcblx0XHRcdFx0XHRkZXNjcmlwdGlvblBhdGg6IG9EYXRhLmRlc2NyaXB0aW9uUGF0aCxcblx0XHRcdFx0XHR2YWx1ZVBhdGg6IG9EYXRhLmRhdGFQcm9wZXJ0eSxcblx0XHRcdFx0XHRkaXNwbGF5TW9kZTogb0RhdGEuZGlzcGxheVxuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXHRcdFx0aWYgKE9iamVjdC5rZXlzKG9EaXN0aW5jdFZhbHVlTWFwKS5sZW5ndGggPT09IDEpIHtcblx0XHRcdFx0ZGlhbG9nQ29udGV4dC5zZXRQcm9wZXJ0eShvRGF0YS5kYXRhUHJvcGVydHksIHNQcm9wZXJ0eUtleSAmJiBvRGlzdGluY3RWYWx1ZU1hcFtzUHJvcGVydHlLZXldKTtcblx0XHRcdH1cblx0XHRcdGlmIChPYmplY3Qua2V5cyhvRGlzdGluY3RVbml0TWFwKS5sZW5ndGggPT09IDEpIHtcblx0XHRcdFx0ZGlhbG9nQ29udGV4dC5zZXRQcm9wZXJ0eShvRGF0YS51bml0UHJvcGVydHksIHNVbml0UHJvcGVydHlOYW1lICYmIG9EaXN0aW5jdFVuaXRNYXBbc1VuaXRQcm9wZXJ0eU5hbWVdKTtcblx0XHRcdH1cblx0XHR9KTtcblx0XHRhRGF0YUFycmF5LmZvckVhY2goZnVuY3Rpb24gKG9EYXRhOiBhbnkpIHtcblx0XHRcdGxldCB2YWx1ZXM6IGFueSA9IHt9O1xuXHRcdFx0aWYgKG9EYXRhLmRhdGFQcm9wZXJ0eS5pbmRleE9mKFwiL1wiKSA+IC0xKSB7XG5cdFx0XHRcdGNvbnN0IHNNdWx0aUxldmVsUHJvcFBhdGhWYWx1ZSA9IE1hc3NFZGl0SGVscGVyLmdldFZhbHVlRm9yTXVsdGlMZXZlbFBhdGgob0RhdGEuZGF0YVByb3BlcnR5LCBhVmFsdWVzKTtcblx0XHRcdFx0aWYgKCFzTXVsdGlMZXZlbFByb3BQYXRoVmFsdWUpIHtcblx0XHRcdFx0XHRzTXVsdGlMZXZlbFByb3BQYXRoVmFsdWUucHVzaCh7IHRleHQ6IG9EZWZhdWx0VmFsdWVzLmxlYXZlQmxhbmtWYWx1ZSwga2V5OiBcIkVtcHR5L1wiICsgb0RhdGEuZGF0YVByb3BlcnR5IH0pO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdE1hc3NFZGl0SGVscGVyLnNldERlZmF1bHRWYWx1ZXNUb0RpYWxvZyhzTXVsdGlMZXZlbFByb3BQYXRoVmFsdWUsIGFDb250ZXh0cywgb0RlZmF1bHRWYWx1ZXMsIG9EYXRhKTtcblx0XHRcdFx0fVxuXHRcdFx0XHR2YWx1ZXMgPSBzTXVsdGlMZXZlbFByb3BQYXRoVmFsdWU7XG5cdFx0XHR9IGVsc2UgaWYgKGFWYWx1ZXNbb0RhdGEuZGF0YVByb3BlcnR5XSkge1xuXHRcdFx0XHRhVmFsdWVzW29EYXRhLmRhdGFQcm9wZXJ0eV0gPSBhVmFsdWVzW29EYXRhLmRhdGFQcm9wZXJ0eV0gfHwgW107XG5cdFx0XHRcdE1hc3NFZGl0SGVscGVyLnNldERlZmF1bHRWYWx1ZXNUb0RpYWxvZyhhVmFsdWVzW29EYXRhLmRhdGFQcm9wZXJ0eV0sIGFDb250ZXh0cywgb0RlZmF1bHRWYWx1ZXMsIG9EYXRhKTtcblx0XHRcdFx0dmFsdWVzID0gYVZhbHVlc1tvRGF0YS5kYXRhUHJvcGVydHldO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoYVVuaXREYXRhW29EYXRhLnVuaXRQcm9wZXJ0eV0gJiYgYVVuaXREYXRhW29EYXRhLnVuaXRQcm9wZXJ0eV0ubGVuZ3RoKSB7XG5cdFx0XHRcdE1hc3NFZGl0SGVscGVyLnNldERlZmF1bHRWYWx1ZXNUb0RpYWxvZyhhVW5pdERhdGFbb0RhdGEudW5pdFByb3BlcnR5XSwgYUNvbnRleHRzLCBvRGVmYXVsdFZhbHVlcywgb0RhdGEsIHRydWUpO1xuXHRcdFx0XHRhVW5pdERhdGFbb0RhdGEudW5pdFByb3BlcnR5XS50ZXh0SW5mbyA9IHt9O1xuXHRcdFx0XHRhVW5pdERhdGFbb0RhdGEudW5pdFByb3BlcnR5XS5zZWxlY3RlZEtleSA9IE1hc3NFZGl0SGVscGVyLmdldERlZmF1bHRTZWxlY3Rpb25QYXRoQ29tYm9Cb3goYUNvbnRleHRzLCBvRGF0YS51bml0UHJvcGVydHkpO1xuXHRcdFx0XHRhVW5pdERhdGFbb0RhdGEudW5pdFByb3BlcnR5XS5pbnB1dFR5cGUgPSBvRGF0YS5pbnB1dFR5cGU7XG5cdFx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0XHQob0RhdGEuZGF0YVByb3BlcnR5ICYmIGFWYWx1ZXNbb0RhdGEuZGF0YVByb3BlcnR5XSAmJiAhYVZhbHVlc1tvRGF0YS5kYXRhUHJvcGVydHldLmxlbmd0aCkgfHxcblx0XHRcdFx0KG9EYXRhLnVuaXRQcm9wZXJ0eSAmJiBhVW5pdERhdGFbb0RhdGEudW5pdFByb3BlcnR5XSAmJiAhYVVuaXREYXRhW29EYXRhLnVuaXRQcm9wZXJ0eV0ubGVuZ3RoKVxuXHRcdFx0KSB7XG5cdFx0XHRcdGNvbnN0IGJDbGVhckZpZWxkT3JCbGFua1ZhbHVlRXhpc3RzID1cblx0XHRcdFx0XHRhVmFsdWVzW29EYXRhLmRhdGFQcm9wZXJ0eV0gJiZcblx0XHRcdFx0XHRhVmFsdWVzW29EYXRhLmRhdGFQcm9wZXJ0eV0uc29tZShmdW5jdGlvbiAob2JqOiBhbnkpIHtcblx0XHRcdFx0XHRcdHJldHVybiBvYmoudGV4dCA9PT0gXCI8IENsZWFyIFZhbHVlcyA+XCIgfHwgb2JqLnRleHQgPT09IFwiPCBMZWF2ZSBCbGFuayA+XCI7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdGlmIChvRGF0YS5kYXRhUHJvcGVydHkgJiYgIWJDbGVhckZpZWxkT3JCbGFua1ZhbHVlRXhpc3RzKSB7XG5cdFx0XHRcdFx0YVZhbHVlc1tvRGF0YS5kYXRhUHJvcGVydHldLnB1c2goeyB0ZXh0OiBvRGVmYXVsdFZhbHVlcy5sZWF2ZUJsYW5rVmFsdWUsIGtleTogXCJFbXB0eS9cIiArIG9EYXRhLmRhdGFQcm9wZXJ0eSB9KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb25zdCBiQ2xlYXJGaWVsZE9yQmxhbmtVbml0VmFsdWVFeGlzdHMgPVxuXHRcdFx0XHRcdGFVbml0RGF0YVtvRGF0YS51bml0UHJvcGVydHldICYmXG5cdFx0XHRcdFx0YVVuaXREYXRhW29EYXRhLnVuaXRQcm9wZXJ0eV0uc29tZShmdW5jdGlvbiAob2JqOiBhbnkpIHtcblx0XHRcdFx0XHRcdHJldHVybiBvYmoudGV4dCA9PT0gXCI8IENsZWFyIFZhbHVlcyA+XCIgfHwgb2JqLnRleHQgPT09IFwiPCBMZWF2ZSBCbGFuayA+XCI7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdGlmIChvRGF0YS51bml0UHJvcGVydHkpIHtcblx0XHRcdFx0XHRpZiAoIWJDbGVhckZpZWxkT3JCbGFua1VuaXRWYWx1ZUV4aXN0cykge1xuXHRcdFx0XHRcdFx0YVVuaXREYXRhW29EYXRhLnVuaXRQcm9wZXJ0eV0ucHVzaCh7XG5cdFx0XHRcdFx0XHRcdHRleHQ6IG9EZWZhdWx0VmFsdWVzLmxlYXZlQmxhbmtWYWx1ZSxcblx0XHRcdFx0XHRcdFx0a2V5OiBcIkVtcHR5L1wiICsgb0RhdGEudW5pdFByb3BlcnR5XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0YVVuaXREYXRhW29EYXRhLnVuaXRQcm9wZXJ0eV0udGV4dEluZm8gPSB7fTtcblx0XHRcdFx0XHRhVW5pdERhdGFbb0RhdGEudW5pdFByb3BlcnR5XS5zZWxlY3RlZEtleSA9IE1hc3NFZGl0SGVscGVyLmdldERlZmF1bHRTZWxlY3Rpb25QYXRoQ29tYm9Cb3goXG5cdFx0XHRcdFx0XHRhQ29udGV4dHMsXG5cdFx0XHRcdFx0XHRvRGF0YS51bml0UHJvcGVydHlcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdGFVbml0RGF0YVtvRGF0YS51bml0UHJvcGVydHldLmlucHV0VHlwZSA9IG9EYXRhLmlucHV0VHlwZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKG9EYXRhLmlzUHJvcGVydHlSZWFkT25seSAmJiB0eXBlb2Ygb0RhdGEuaXNQcm9wZXJ0eVJlYWRPbmx5ID09PSBcImJvb2xlYW5cIikge1xuXHRcdFx0XHRhUmVhZE9ubHlGaWVsZEluZm8ucHVzaCh7IFwicHJvcGVydHlcIjogb0RhdGEuZGF0YVByb3BlcnR5LCB2YWx1ZTogb0RhdGEuaXNQcm9wZXJ0eVJlYWRPbmx5LCB0eXBlOiBcIkRlZmF1bHRcIiB9KTtcblx0XHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRcdG9EYXRhLmlzUHJvcGVydHlSZWFkT25seSAmJlxuXHRcdFx0XHRvRGF0YS5pc1Byb3BlcnR5UmVhZE9ubHkub3BlcmFuZHMgJiZcblx0XHRcdFx0b0RhdGEuaXNQcm9wZXJ0eVJlYWRPbmx5Lm9wZXJhbmRzWzBdICYmXG5cdFx0XHRcdG9EYXRhLmlzUHJvcGVydHlSZWFkT25seS5vcGVyYW5kc1swXS5vcGVyYW5kMSAmJlxuXHRcdFx0XHRvRGF0YS5pc1Byb3BlcnR5UmVhZE9ubHkub3BlcmFuZHNbMF0ub3BlcmFuZDJcblx0XHRcdCkge1xuXHRcdFx0XHQvLyBUaGlzIG5lZWRzIHRvIGJlIHJlZmFjdG9yZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBSZWFkT25seUV4cHJlc3Npb24gY2hhbmdlXG5cdFx0XHRcdGFSZWFkT25seUZpZWxkSW5mby5wdXNoKHtcblx0XHRcdFx0XHRcInByb3BlcnR5XCI6IG9EYXRhLmRhdGFQcm9wZXJ0eSxcblx0XHRcdFx0XHRwcm9wZXJ0eVBhdGg6IG9EYXRhLmlzUHJvcGVydHlSZWFkT25seS5vcGVyYW5kc1swXS5vcGVyYW5kMS5wYXRoLFxuXHRcdFx0XHRcdHByb3BlcnR5VmFsdWU6IG9EYXRhLmlzUHJvcGVydHlSZWFkT25seS5vcGVyYW5kc1swXS5vcGVyYW5kMi52YWx1ZSxcblx0XHRcdFx0XHR0eXBlOiBcIlBhdGhcIlxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU2V0dGluZyB2aXNiaWxpdHkgb2YgdGhlIG1hc3MgZWRpdCBmaWVsZC5cblx0XHRcdGlmIChvRGF0YS5lZGl0TW9kZSkge1xuXHRcdFx0XHR2YWx1ZXMudmlzaWJsZSA9XG5cdFx0XHRcdFx0b0RhdGEuZWRpdE1vZGUgPT09IEVkaXRNb2RlLkVkaXRhYmxlIHx8XG5cdFx0XHRcdFx0YUNvbnRleHRzLnNvbWUoXG5cdFx0XHRcdFx0XHRNYXNzRWRpdEhlbHBlci5nZXRGaWVsZFZpc2libGl0eS5iaW5kKE1hc3NFZGl0SGVscGVyLCBvRGF0YS5lZGl0TW9kZSwgb0RpYWxvZ0RhdGFNb2RlbCwgb0RhdGEuZGF0YVByb3BlcnR5LCB2YWx1ZXMpXG5cdFx0XHRcdFx0KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHZhbHVlcy52aXNpYmxlID0gdHJ1ZTtcblx0XHRcdH1cblx0XHRcdHZhbHVlcy5zZWxlY3RlZEtleSA9IE1hc3NFZGl0SGVscGVyLmdldERlZmF1bHRTZWxlY3Rpb25QYXRoQ29tYm9Cb3goYUNvbnRleHRzLCBvRGF0YS5kYXRhUHJvcGVydHkpO1xuXHRcdFx0dmFsdWVzLmlucHV0VHlwZSA9IG9EYXRhLmlucHV0VHlwZTtcblx0XHRcdHZhbHVlcy51bml0UHJvcGVydHkgPSBvRGF0YS51bml0UHJvcGVydHk7XG5cdFx0fSk7XG5cblx0XHRyZXR1cm4gb0RpYWxvZ0RhdGFNb2RlbDtcblx0fSxcblx0LyoqXG5cdCAqIEdldHMgdHJhbnNpZW50IGNvbnRleHQgZm9yIGRpYWxvZy5cblx0ICpcblx0ICogQHBhcmFtIHtUYWJsZX0gdGFibGUgSW5zdGFuY2Ugb2YgVGFibGUuXG5cdCAqIEBwYXJhbSB7RGlhbG9nfSBkaWFsb2cgTWFzcyBFZGl0IERpYWxvZy5cblx0ICogQHJldHVybnMge29iamVjdH0gUHJvbWlzZSByZXR1cm5pbmcgaW5zdGFuY2Ugb2YgZGlhbG9nLlxuXHQgKi9cblx0Z2V0RGlhbG9nQ29udGV4dDogZnVuY3Rpb24gKHRhYmxlOiBUYWJsZSwgZGlhbG9nPzogRGlhbG9nKTogQ29udGV4dCB7XG5cdFx0bGV0IHRyYW5zQ3R4OiBDb250ZXh0ID0gKGRpYWxvZyAmJiBkaWFsb2cuZ2V0QmluZGluZ0NvbnRleHQoKSkgYXMgQ29udGV4dDtcblxuXHRcdGlmICghdHJhbnNDdHgpIHtcblx0XHRcdGNvbnN0IG1vZGVsID0gdGFibGUuZ2V0TW9kZWwoKTtcblx0XHRcdGNvbnN0IGxpc3RCaW5kaW5nID0gdGFibGUuZ2V0Um93QmluZGluZygpO1xuXHRcdFx0Y29uc3QgdHJhbnNpZW50TGlzdEJpbmRpbmcgPSBtb2RlbC5iaW5kTGlzdChsaXN0QmluZGluZy5nZXRQYXRoKCksIGxpc3RCaW5kaW5nLmdldENvbnRleHQoKSwgW10sIFtdLCB7XG5cdFx0XHRcdCQkdXBkYXRlR3JvdXBJZDogXCJzdWJtaXRMYXRlclwiXG5cdFx0XHR9KSBhcyBPRGF0YUxpc3RCaW5kaW5nO1xuXHRcdFx0KHRyYW5zaWVudExpc3RCaW5kaW5nIGFzIGFueSkucmVmcmVzaEludGVybmFsID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0XHQvKiAqL1xuXHRcdFx0fTtcblx0XHRcdHRyYW5zQ3R4ID0gdHJhbnNpZW50TGlzdEJpbmRpbmcuY3JlYXRlKHt9LCB0cnVlKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdHJhbnNDdHg7XG5cdH0sXG5cblx0b25EaWFsb2dPcGVuOiBmdW5jdGlvbiAoZXZlbnQ6IGFueSk6IHZvaWQge1xuXHRcdGNvbnN0IHNvdXJjZSA9IGV2ZW50LmdldFNvdXJjZSgpO1xuXHRcdGNvbnN0IGZpZWxkc0luZm9Nb2RlbCA9IHNvdXJjZS5nZXRNb2RlbChcImZpZWxkc0luZm9cIik7XG5cdFx0ZmllbGRzSW5mb01vZGVsLnNldFByb3BlcnR5KFwiL2lzT3BlblwiLCB0cnVlKTtcblx0fSxcblxuXHQvKipcblx0ICogQ3JlYXRlIHRoZSBtYXNzIGVkaXQgZGlhbG9nLlxuXHQgKlxuXHQgKiBAcGFyYW0ge29iamVjdH0gb1RhYmxlIEluc3RhbmNlIG9mIFRhYmxlXG5cdCAqIEBwYXJhbSB7QXJyYXl9IGFDb250ZXh0cyBDb250ZXh0cyBmb3IgbWFzcyBlZGl0XG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvQ29udHJvbGxlciBDb250cm9sbGVyIGZvciB0aGUgdmlld1xuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSBQcm9taXNlIHJldHVybmluZyBpbnN0YW5jZSBvZiBkaWFsb2cuXG5cdCAqL1xuXHRjcmVhdGVEaWFsb2c6IGZ1bmN0aW9uIChvVGFibGU6IFRhYmxlLCBhQ29udGV4dHM6IGFueVtdLCBvQ29udHJvbGxlcjogUGFnZUNvbnRyb2xsZXIpIHtcblx0XHRjb25zdCBzRnJhZ21lbnROYW1lID0gXCJzYXAvZmUvY29yZS9jb250cm9scy9tYXNzRWRpdC9NYXNzRWRpdERpYWxvZ1wiLFxuXHRcdFx0YURhdGFBcnJheTogYW55W10gPSBbXSxcblx0XHRcdG9SZXNvdXJjZUJ1bmRsZSA9IChDb3JlIGFzIENvcmVFeCkuZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlKFwic2FwLmZlLmNvcmVcIiksXG5cdFx0XHRvRGVmYXVsdFZhbHVlcyA9IE1hc3NFZGl0SGVscGVyLmdldERlZmF1bHRUZXh0c0ZvckRpYWxvZyhvUmVzb3VyY2VCdW5kbGUsIGFDb250ZXh0cy5sZW5ndGgsIG9UYWJsZSksXG5cdFx0XHRvRGF0YUZpZWxkTW9kZWwgPSBNYXNzRWRpdEhlbHBlci5wcmVwYXJlRGF0YUZvckRpYWxvZyhvVGFibGUsIGFDb250ZXh0cywgYURhdGFBcnJheSksXG5cdFx0XHRkaWFsb2dDb250ZXh0ID0gTWFzc0VkaXRIZWxwZXIuZ2V0RGlhbG9nQ29udGV4dChvVGFibGUpLFxuXHRcdFx0b0RpYWxvZ0RhdGFNb2RlbCA9IE1hc3NFZGl0SGVscGVyLnNldFJ1bnRpbWVNb2RlbE9uRGlhbG9nKGFDb250ZXh0cywgYURhdGFBcnJheSwgb0RlZmF1bHRWYWx1ZXMsIGRpYWxvZ0NvbnRleHQpO1xuXG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlOiAodmFsdWU6IGFueSkgPT4gdm9pZCwgcmVqZWN0OiAocmVhc29uPzogYW55KSA9PiB2b2lkKSB7XG5cdFx0XHRjb25zdCBvRnJhZ21lbnQgPSBYTUxUZW1wbGF0ZVByb2Nlc3Nvci5sb2FkVGVtcGxhdGUoc0ZyYWdtZW50TmFtZSwgXCJmcmFnbWVudFwiKTtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoXG5cdFx0XHRcdFhNTFByZXByb2Nlc3Nvci5wcm9jZXNzKFxuXHRcdFx0XHRcdG9GcmFnbWVudCxcblx0XHRcdFx0XHR7IG5hbWU6IHNGcmFnbWVudE5hbWUgfSxcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRiaW5kaW5nQ29udGV4dHM6IHtcblx0XHRcdFx0XHRcdFx0ZGF0YUZpZWxkTW9kZWw6IG9EYXRhRmllbGRNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChcIi9cIilcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRtb2RlbHM6IHtcblx0XHRcdFx0XHRcdFx0ZGF0YUZpZWxkTW9kZWw6IG9EYXRhRmllbGRNb2RlbFxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0KVxuXHRcdFx0KVxuXHRcdFx0XHQudGhlbihmdW5jdGlvbiAob0ZyYWdtZW50OiBhbnkpIHtcblx0XHRcdFx0XHRyZXR1cm4gRnJhZ21lbnQubG9hZCh7IGRlZmluaXRpb246IG9GcmFnbWVudCB9KS50aGVuKGZ1bmN0aW9uIChvRGlhbG9nQ29udGVudDogYW55KSB7XG5cdFx0XHRcdFx0XHRjb25zdCBEcmFmdFN0YXR1cyA9IEZFTGlicmFyeS5EcmFmdFN0YXR1cztcblx0XHRcdFx0XHRcdGNvbnN0IG9EaWFsb2cgPSBuZXcgRGlhbG9nKHtcblx0XHRcdFx0XHRcdFx0dGl0bGU6IG9EZWZhdWx0VmFsdWVzLm1hc3NFZGl0VGl0bGUsXG5cdFx0XHRcdFx0XHRcdGNvbnRlbnQ6IFtvRGlhbG9nQ29udGVudF0sXG5cdFx0XHRcdFx0XHRcdGFmdGVyT3BlbjogTWFzc0VkaXRIZWxwZXIub25EaWFsb2dPcGVuLFxuXHRcdFx0XHRcdFx0XHRiZWdpbkJ1dHRvbjogbmV3IEJ1dHRvbih7XG5cdFx0XHRcdFx0XHRcdFx0dGV4dDogb0RlZmF1bHRWYWx1ZXMuYXBwbHlCdXR0b25UZXh0LFxuXHRcdFx0XHRcdFx0XHRcdHR5cGU6IFwiRW1waGFzaXplZFwiLFxuXHRcdFx0XHRcdFx0XHRcdHByZXNzOiBmdW5jdGlvbiAob0V2ZW50OiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdChvQ29udHJvbGxlci5nZXRWaWV3KCk/LmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQpPy5zZXRQcm9wZXJ0eShcblx0XHRcdFx0XHRcdFx0XHRcdFx0XCJza2lwUGF0Y2hIYW5kbGVyc1wiLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHR0cnVlXG5cdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0Y29uc3Qgb0RpYWxvZyA9IG9FdmVudC5nZXRTb3VyY2UoKS5nZXRQYXJlbnQoKTtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IG9Nb2RlbCA9IG9EaWFsb2cuZ2V0TW9kZWwoXCJmaWVsZHNJbmZvXCIpO1xuXHRcdFx0XHRcdFx0XHRcdFx0Y29uc3QgYVJlc3VsdHMgPSBvTW9kZWwuZ2V0UHJvcGVydHkoXCIvcmVzdWx0c1wiKTtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IGFQcm9wZXJ0eVJlYWRhYmxlSW5mbyA9IG9Nb2RlbC5nZXRQcm9wZXJ0eShcIi9yZWFkYWJsZVByb3BlcnR5RGF0YVwiKTtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IGNoYW5nZVByb21pc2U6IGFueVtdID0gW107XG5cdFx0XHRcdFx0XHRcdFx0XHRsZXQgYlJlYWRPbmx5RmllbGQgPSBmYWxzZTtcblx0XHRcdFx0XHRcdFx0XHRcdGxldCBncm91cElkO1xuXHRcdFx0XHRcdFx0XHRcdFx0Ly9sZXQgaW5kZXggPSAwO1xuXHRcdFx0XHRcdFx0XHRcdFx0bGV0IGVycm9yVmFsdWVzOiBhbnlbXSA9IFtdO1xuXHRcdFx0XHRcdFx0XHRcdFx0YUNvbnRleHRzLmZvckVhY2goZnVuY3Rpb24gKG9TZWxlY3RlZENvbnRleHQ6IGFueSwgaWR4OiBudW1iZXIpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0YVJlc3VsdHMuZm9yRWFjaChmdW5jdGlvbiAob1Jlc3VsdDogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly9UT0RPIC0gQWRkIHNhdmUgaW1wbGVtZW50YXRpb24gZm9yIFZhbHVlIEhlbHAuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKGFQcm9wZXJ0eVJlYWRhYmxlSW5mbykge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YlJlYWRPbmx5RmllbGQgPSBhUHJvcGVydHlSZWFkYWJsZUluZm8uc29tZShmdW5jdGlvbiAob1Byb3BlcnR5SW5mbzogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChvUmVzdWx0LmtleVZhbHVlID09PSBvUHJvcGVydHlJbmZvLnByb3BlcnR5KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKG9Qcm9wZXJ0eUluZm8udHlwZSA9PT0gXCJEZWZhdWx0XCIpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBvUHJvcGVydHlJbmZvLnZhbHVlID09PSB0cnVlO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvUHJvcGVydHlJbmZvLnR5cGUgPT09IFwiUGF0aFwiICYmXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvUHJvcGVydHlJbmZvLnByb3BlcnR5VmFsdWUgJiZcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9Qcm9wZXJ0eUluZm8ucHJvcGVydHlQYXRoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvU2VsZWN0ZWRDb250ZXh0LmdldE9iamVjdChvUHJvcGVydHlJbmZvLnByb3BlcnR5UGF0aCkgPT09XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9Qcm9wZXJ0eUluZm8ucHJvcGVydHlWYWx1ZVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRncm91cElkID0gXCIkYXV0by5cIiArIGlkeDtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvL2luZGV4ICs9IDE7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0b0NvbnRyb2xsZXIuX2VkaXRGbG93LnNldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLlNhdmluZyk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly9sZXQgcHJvbWlzZUNvdW50ID0gMDtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAob1Jlc3VsdC5rZXlWYWx1ZSAmJiBvUmVzdWx0LnZhbHVlICE9PSBcIkRlZmF1bHRcIiAmJiAhYlJlYWRPbmx5RmllbGQpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNoYW5nZVByb21pc2UucHVzaChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0b1NlbGVjdGVkQ29udGV4dFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC5zZXRQcm9wZXJ0eShvUmVzdWx0LmtleVZhbHVlLCBvUmVzdWx0LnZhbHVlLCBncm91cElkKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBvU2VsZWN0ZWRDb250ZXh0O1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZXJyb3JWYWx1ZXMucHVzaChvU2VsZWN0ZWRDb250ZXh0LmdldE9iamVjdCgpKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdExvZy5lcnJvcihcIk1hc3MgRWRpdDogU29tZXRoaW5nIHdlbnQgd3JvbmcgaW4gdXBkYXRpbmcgZW50cmllcy5cIiwgb0Vycm9yKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0XHRcdFx0XHRcdChQcm9taXNlIGFzIGFueSkuYWxsU2V0dGxlZChjaGFuZ2VQcm9taXNlKS50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0Y29uc3Qgb0xpc3RCaW5kaW5nID0gb1RhYmxlLmdldFJvd0JpbmRpbmcoKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0Y29uc3Qgb0V4dGVuc2lvbkFQSSA9IG9Db250cm9sbGVyICYmIChvQ29udHJvbGxlci5nZXRFeHRlbnNpb25BUEkoKSBhcyBhbnkpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gb0V4dGVuc2lvbkFQSS5yZWZyZXNoKG9MaXN0QmluZGluZy5nZXRQYXRoKCkpLnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGxldCBzdWJ0aXRsZUNvbHVtbiA9IENvbW1vblV0aWxzLmdldE1lc3NhZ2VDb2x1bW4ob1RhYmxlKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRsZXQgbWVzc2FnZXMgPSBzYXAudWkuZ2V0Q29yZSgpLmdldE1lc3NhZ2VNYW5hZ2VyKCkuZ2V0TWVzc2FnZU1vZGVsKCkuZ2V0RGF0YSgpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGxldCBib3VuZFRyYW5zaXRpb25FcnJvckNvbnRleHRzID0gW10gYXMgYW55O1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG1lc3NhZ2VzLmZvckVhY2goZnVuY3Rpb24gKG1lc3NhZ2U6IGFueSwgaWR4OiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IG1lc3NhZ2VUYXJnZXRzID0gbWVzc2FnZS5nZXRUYXJnZXRzKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG1lc3NhZ2VUYXJnZXRzICYmXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG1lc3NhZ2VUYXJnZXRzLmxlbmd0aCA9PT0gMSAmJlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRtZXNzYWdlVGFyZ2V0c1swXS5sZW5ndGggJiZcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0bWVzc2FnZS5wZXJzaXN0ZW50ID09PSB0cnVlXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0bGV0IGJvdW5kVHJhbnNpdGlvbkVycm9yQ29udGV4dCA9IGFDb250ZXh0cy5maW5kKGZ1bmN0aW9uIChvQ29udGV4dDogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG1lc3NhZ2UuZ2V0VGFyZ2V0KCkuaW5kZXhPZihvQ29udGV4dC5nZXRQYXRoKCkpICE9PSAtMTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGJvdW5kVHJhbnNpdGlvbkVycm9yQ29udGV4dHMucHVzaChib3VuZFRyYW5zaXRpb25FcnJvckNvbnRleHQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRtZXNzYWdlLmFkZGl0aW9uYWxUZXh0ID0gYm91bmRUcmFuc2l0aW9uRXJyb3JDb250ZXh0XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PyBib3VuZFRyYW5zaXRpb25FcnJvckNvbnRleHQuZ2V0T2JqZWN0KClbc3VidGl0bGVDb2x1bW5dXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0OiB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKGJvdW5kVHJhbnNpdGlvbkVycm9yQ29udGV4dHMubGVuZ3RoID09PSAwICYmIGVycm9yVmFsdWVzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0b0NvbnRyb2xsZXIuX2VkaXRGbG93LnNldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLlNhdmVkKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IHN1Y2Nlc3NUb2FzdCA9IG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19NQVNTX0VESVRfU1VDQ0VTU19UT0FTVFwiKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdE1lc3NhZ2VUb2FzdC5zaG93KHN1Y2Nlc3NUb2FzdCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZXJyb3JWYWx1ZXMubGVuZ3RoICsgYm91bmRUcmFuc2l0aW9uRXJyb3JDb250ZXh0cy5sZW5ndGggPFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQob1RhYmxlIGFzIGFueSkuZ2V0U2VsZWN0ZWRDb250ZXh0cygpLmxlbmd0aFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9Db250cm9sbGVyLl9lZGl0Rmxvdy5zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5TYXZlZCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRlcnJvclZhbHVlcy5sZW5ndGggKyBib3VuZFRyYW5zaXRpb25FcnJvckNvbnRleHRzLmxlbmd0aCA9PT1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0KG9UYWJsZSBhcyBhbnkpLmdldFNlbGVjdGVkQ29udGV4dHMoKS5sZW5ndGhcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvQ29udHJvbGxlci5fZWRpdEZsb3cuc2V0RHJhZnRTdGF0dXMoRHJhZnRTdGF0dXMuQ2xlYXIpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvQ29udHJvbGxlci5fZWRpdEZsb3cuZ2V0TWVzc2FnZUhhbmRsZXIoKS5zaG93TWVzc2FnZXMoKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAob0RpYWxvZy5pc09wZW4oKSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0b0RpYWxvZy5jbG9zZSgpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0b0RpYWxvZy5kZXN0cm95KCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQob0NvbnRyb2xsZXIuZ2V0VmlldygpPy5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0KT8uc2V0UHJvcGVydHkoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFwic2tpcFBhdGNoSGFuZGxlcnNcIixcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZmFsc2Vcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSksXG5cdFx0XHRcdFx0XHRcdGVuZEJ1dHRvbjogbmV3IEJ1dHRvbih7XG5cdFx0XHRcdFx0XHRcdFx0dGV4dDogb0RlZmF1bHRWYWx1ZXMuY2FuY2VsQnV0dG9uVGV4dCxcblx0XHRcdFx0XHRcdFx0XHRwcmVzczogZnVuY3Rpb24gKG9FdmVudDogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBvRGlhbG9nID0gb0V2ZW50LmdldFNvdXJjZSgpLmdldFBhcmVudCgpO1xuXHRcdFx0XHRcdFx0XHRcdFx0b0RpYWxvZy5jbG9zZSgpO1xuXHRcdFx0XHRcdFx0XHRcdFx0b0RpYWxvZy5kZXN0cm95KCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRjb25zdCBtb2RlbCA9IG9UYWJsZS5nZXRNb2RlbCgpO1xuXHRcdFx0XHRcdFx0b0RpYWxvZy5zZXRNb2RlbChvRGlhbG9nRGF0YU1vZGVsLCBcImZpZWxkc0luZm9cIik7XG5cdFx0XHRcdFx0XHRvRGlhbG9nLnNldE1vZGVsKG1vZGVsKTtcblx0XHRcdFx0XHRcdG9EaWFsb2cuc2V0QmluZGluZ0NvbnRleHQoZGlhbG9nQ29udGV4dCk7XG5cdFx0XHRcdFx0XHRyZXNvbHZlKG9EaWFsb2cpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQuY2F0Y2gocmVqZWN0KTtcblx0XHR9KTtcblx0fVxufTtcblxuZXhwb3J0IGRlZmF1bHQgTWFzc0VkaXRIZWxwZXI7XG4iXX0=