@sapui5/sap.fe.core 1.110.0 → 1.111.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 (654) hide show
  1. package/README.md +0 -4
  2. package/package.json +2 -23
  3. package/src/sap/fe/core/.library +1 -1
  4. package/src/sap/fe/core/ActionRuntime-dbg.js +182 -0
  5. package/src/sap/fe/core/ActionRuntime.js +3 -181
  6. package/src/sap/fe/core/ActionRuntime.js.map +1 -0
  7. package/src/sap/fe/core/ActionRuntime.ts +3 -5
  8. package/src/sap/fe/core/AppComponent-dbg.js +435 -0
  9. package/src/sap/fe/core/AppComponent.js +3 -439
  10. package/src/sap/fe/core/AppComponent.js.map +1 -0
  11. package/src/sap/fe/core/AppComponent.ts +0 -3
  12. package/src/sap/fe/core/AppStateHandler-dbg.js +200 -0
  13. package/src/sap/fe/core/AppStateHandler.js +3 -227
  14. package/src/sap/fe/core/AppStateHandler.js.map +1 -0
  15. package/src/sap/fe/core/BaseController-dbg.js +76 -0
  16. package/src/sap/fe/core/BaseController.js +3 -73
  17. package/src/sap/fe/core/BaseController.js.map +1 -0
  18. package/src/sap/fe/core/CommonUtils-dbg.js +2135 -0
  19. package/src/sap/fe/core/CommonUtils.js +3 -2296
  20. package/src/sap/fe/core/CommonUtils.js.map +1 -0
  21. package/src/sap/fe/core/CommonUtils.ts +34 -28
  22. package/src/sap/fe/core/ExtensionAPI-dbg.js +273 -0
  23. package/src/sap/fe/core/ExtensionAPI.js +3 -280
  24. package/src/sap/fe/core/ExtensionAPI.js.map +1 -0
  25. package/src/sap/fe/core/PageController-dbg.js +203 -0
  26. package/src/sap/fe/core/PageController.js +3 -200
  27. package/src/sap/fe/core/PageController.js.map +1 -0
  28. package/src/sap/fe/core/TemplateComponent-dbg.js +218 -0
  29. package/src/sap/fe/core/TemplateComponent.js +3 -216
  30. package/src/sap/fe/core/TemplateComponent.js.map +1 -0
  31. package/src/sap/fe/core/TemplateModel-dbg.js +75 -0
  32. package/src/sap/fe/core/TemplateModel.js +3 -72
  33. package/src/sap/fe/core/TemplateModel.js.map +1 -0
  34. package/src/sap/fe/core/buildingBlocks/AttributeModel-dbg.js +57 -0
  35. package/src/sap/fe/core/buildingBlocks/AttributeModel.js +3 -54
  36. package/src/sap/fe/core/buildingBlocks/AttributeModel.js.map +1 -0
  37. package/src/sap/fe/core/buildingBlocks/BuildingBlock-dbg.js +410 -0
  38. package/src/sap/fe/core/buildingBlocks/BuildingBlock.js +11 -355
  39. package/src/sap/fe/core/buildingBlocks/BuildingBlock.js.map +1 -0
  40. package/src/sap/fe/core/buildingBlocks/BuildingBlock.ts +118 -52
  41. package/src/sap/fe/core/buildingBlocks/BuildingBlockFormatter-dbg.js +14 -0
  42. package/src/sap/fe/core/buildingBlocks/BuildingBlockFormatter.js +3 -11
  43. package/src/sap/fe/core/buildingBlocks/BuildingBlockFormatter.js.map +1 -0
  44. package/src/sap/fe/core/buildingBlocks/BuildingBlockFragment-dbg.js +44 -0
  45. package/src/sap/fe/core/buildingBlocks/BuildingBlockFragment.js +3 -40
  46. package/src/sap/fe/core/buildingBlocks/BuildingBlockFragment.js.map +1 -0
  47. package/src/sap/fe/core/buildingBlocks/BuildingBlockFragment.ts +3 -0
  48. package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime-dbg.js +932 -0
  49. package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.js +16 -1292
  50. package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.js.map +1 -0
  51. package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.ts +40 -42
  52. package/src/sap/fe/core/buildingBlocks/TraceInfo-dbg.js +434 -0
  53. package/src/sap/fe/core/buildingBlocks/TraceInfo.js +3 -481
  54. package/src/sap/fe/core/buildingBlocks/TraceInfo.js.map +1 -0
  55. package/src/sap/fe/core/buildingBlocks/TraceInfo.ts +5 -5
  56. package/src/sap/fe/core/controllerextensions/BusyLocker-dbg.js +92 -0
  57. package/src/sap/fe/core/controllerextensions/BusyLocker.js +3 -89
  58. package/src/sap/fe/core/controllerextensions/BusyLocker.js.map +1 -0
  59. package/src/sap/fe/core/controllerextensions/EditFlow-dbg.js +1659 -0
  60. package/src/sap/fe/core/controllerextensions/EditFlow.js +3 -1868
  61. package/src/sap/fe/core/controllerextensions/EditFlow.js.map +1 -0
  62. package/src/sap/fe/core/controllerextensions/EditFlow.ts +180 -125
  63. package/src/sap/fe/core/controllerextensions/Feedback-dbg.js +70 -0
  64. package/src/sap/fe/core/controllerextensions/Feedback.js +3 -67
  65. package/src/sap/fe/core/controllerextensions/Feedback.js.map +1 -0
  66. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation-dbg.js +83 -0
  67. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +3 -84
  68. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js.map +1 -0
  69. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +6 -8
  70. package/src/sap/fe/core/controllerextensions/InternalEditFlow-dbg.js +711 -0
  71. package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +3 -707
  72. package/src/sap/fe/core/controllerextensions/InternalEditFlow.js.map +1 -0
  73. package/src/sap/fe/core/controllerextensions/InternalEditFlow.ts +79 -48
  74. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation-dbg.js +791 -0
  75. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +3 -696
  76. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js.map +1 -0
  77. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +107 -7
  78. package/src/sap/fe/core/controllerextensions/InternalRouting-dbg.js +984 -0
  79. package/src/sap/fe/core/controllerextensions/InternalRouting.js +3 -996
  80. package/src/sap/fe/core/controllerextensions/InternalRouting.js.map +1 -0
  81. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +43 -23
  82. package/src/sap/fe/core/controllerextensions/KPIManagement-dbg.js +1013 -0
  83. package/src/sap/fe/core/controllerextensions/KPIManagement.js +3 -1011
  84. package/src/sap/fe/core/controllerextensions/KPIManagement.js.map +1 -0
  85. package/src/sap/fe/core/controllerextensions/KPIManagement.ts +12 -10
  86. package/src/sap/fe/core/controllerextensions/MassEdit-dbg.js +135 -0
  87. package/src/sap/fe/core/controllerextensions/MassEdit.js +3 -133
  88. package/src/sap/fe/core/controllerextensions/MassEdit.js.map +1 -0
  89. package/src/sap/fe/core/controllerextensions/MassEdit.ts +1 -1
  90. package/src/sap/fe/core/controllerextensions/MessageHandler-dbg.js +221 -0
  91. package/src/sap/fe/core/controllerextensions/MessageHandler.js +3 -224
  92. package/src/sap/fe/core/controllerextensions/MessageHandler.js.map +1 -0
  93. package/src/sap/fe/core/controllerextensions/PageReady-dbg.js +254 -0
  94. package/src/sap/fe/core/controllerextensions/PageReady.js +3 -279
  95. package/src/sap/fe/core/controllerextensions/PageReady.js.map +1 -0
  96. package/src/sap/fe/core/controllerextensions/PageReady.ts +2 -2
  97. package/src/sap/fe/core/controllerextensions/Paginator-dbg.js +169 -0
  98. package/src/sap/fe/core/controllerextensions/Paginator.js +3 -174
  99. package/src/sap/fe/core/controllerextensions/Paginator.js.map +1 -0
  100. package/src/sap/fe/core/controllerextensions/Paginator.ts +4 -5
  101. package/src/sap/fe/core/controllerextensions/Placeholder-dbg.js +132 -0
  102. package/src/sap/fe/core/controllerextensions/Placeholder.js +3 -130
  103. package/src/sap/fe/core/controllerextensions/Placeholder.js.map +1 -0
  104. package/src/sap/fe/core/controllerextensions/Routing-dbg.js +138 -0
  105. package/src/sap/fe/core/controllerextensions/Routing.js +3 -135
  106. package/src/sap/fe/core/controllerextensions/Routing.js.map +1 -0
  107. package/src/sap/fe/core/controllerextensions/RoutingListener-dbg.js +10 -0
  108. package/src/sap/fe/core/controllerextensions/RoutingListener.js +3 -7
  109. package/src/sap/fe/core/controllerextensions/RoutingListener.js.map +1 -0
  110. package/src/sap/fe/core/controllerextensions/Share-dbg.js +317 -0
  111. package/src/sap/fe/core/controllerextensions/Share.js +3 -356
  112. package/src/sap/fe/core/controllerextensions/Share.js.map +1 -0
  113. package/src/sap/fe/core/controllerextensions/Share.ts +6 -1
  114. package/src/sap/fe/core/controllerextensions/SideEffects-dbg.js +553 -0
  115. package/src/sap/fe/core/controllerextensions/SideEffects.js +3 -651
  116. package/src/sap/fe/core/controllerextensions/SideEffects.js.map +1 -0
  117. package/src/sap/fe/core/controllerextensions/SideEffects.ts +411 -553
  118. package/src/sap/fe/core/controllerextensions/ViewState-dbg.js +903 -0
  119. package/src/sap/fe/core/controllerextensions/ViewState.js +3 -967
  120. package/src/sap/fe/core/controllerextensions/ViewState.js.map +1 -0
  121. package/src/sap/fe/core/controllerextensions/ViewState.ts +90 -41
  122. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase-dbg.js +99 -0
  123. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js +3 -96
  124. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js.map +1 -0
  125. package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync-dbg.js +314 -0
  126. package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.js +3 -336
  127. package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.js.map +1 -0
  128. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon-dbg.js +152 -0
  129. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +3 -161
  130. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js.map +1 -0
  131. package/src/sap/fe/core/controllerextensions/collaboration/Manage-dbg.js +243 -0
  132. package/src/sap/fe/core/controllerextensions/collaboration/Manage.js +3 -302
  133. package/src/sap/fe/core/controllerextensions/collaboration/Manage.js.map +1 -0
  134. package/src/sap/fe/core/controllerextensions/dialog/OperationsDialog.block-dbg.js +252 -0
  135. package/src/sap/fe/core/controllerextensions/dialog/OperationsDialog.block.js +6 -0
  136. package/src/sap/fe/core/controllerextensions/dialog/OperationsDialog.block.js.map +1 -0
  137. package/src/sap/fe/core/controllerextensions/dialog/OperationsDialog.block.tsx +188 -0
  138. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper-dbg.js +1196 -0
  139. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +3 -1479
  140. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js.map +1 -0
  141. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +239 -289
  142. package/src/sap/fe/core/controllerextensions/editFlow/draft-dbg.js +689 -0
  143. package/src/sap/fe/core/controllerextensions/editFlow/draft.js +3 -785
  144. package/src/sap/fe/core/controllerextensions/editFlow/draft.js.map +1 -0
  145. package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +134 -142
  146. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup-dbg.js +236 -0
  147. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.js +3 -287
  148. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.js.map +1 -0
  149. package/src/sap/fe/core/controllerextensions/editFlow/operations-dbg.js +1422 -0
  150. package/src/sap/fe/core/controllerextensions/editFlow/operations.js +3 -1598
  151. package/src/sap/fe/core/controllerextensions/editFlow/operations.js.map +1 -0
  152. package/src/sap/fe/core/controllerextensions/editFlow/operations.ts +40 -24
  153. package/src/sap/fe/core/controllerextensions/editFlow/sticky-dbg.js +185 -0
  154. package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +3 -214
  155. package/src/sap/fe/core/controllerextensions/editFlow/sticky.js.map +1 -0
  156. package/src/sap/fe/core/controllerextensions/editFlow/sticky.ts +4 -5
  157. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling-dbg.js +1219 -0
  158. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +3 -1213
  159. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js.map +1 -0
  160. package/src/sap/fe/core/controllerextensions/pageReady/DataQueryWatcher-dbg.js +304 -0
  161. package/src/sap/fe/core/controllerextensions/pageReady/DataQueryWatcher.js +3 -339
  162. package/src/sap/fe/core/controllerextensions/pageReady/DataQueryWatcher.js.map +1 -0
  163. package/src/sap/fe/core/controllerextensions/routing/NavigationReason-dbg.js +15 -0
  164. package/src/sap/fe/core/controllerextensions/routing/NavigationReason.js +6 -0
  165. package/src/sap/fe/core/controllerextensions/routing/NavigationReason.js.map +1 -0
  166. package/src/sap/fe/core/controllerextensions/routing/NavigationReason.ts +6 -0
  167. package/src/sap/fe/core/controllerextensions/routing/RouterProxy-dbg.js +798 -0
  168. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +3 -799
  169. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js.map +1 -0
  170. package/src/sap/fe/core/controls/Any-dbg.js +32 -0
  171. package/src/sap/fe/core/controls/Any.js +3 -29
  172. package/src/sap/fe/core/controls/Any.js.map +1 -0
  173. package/src/sap/fe/core/controls/AnyElement-dbg.js +29 -0
  174. package/src/sap/fe/core/controls/AnyElement.js +3 -26
  175. package/src/sap/fe/core/controls/AnyElement.js.map +1 -0
  176. package/src/sap/fe/core/controls/CommandExecution-dbg.js +72 -0
  177. package/src/sap/fe/core/controls/CommandExecution.js +3 -69
  178. package/src/sap/fe/core/controls/CommandExecution.js.map +1 -0
  179. package/src/sap/fe/core/controls/ConditionalWrapper-dbg.js +151 -0
  180. package/src/sap/fe/core/controls/ConditionalWrapper.js +3 -148
  181. package/src/sap/fe/core/controls/ConditionalWrapper.js.map +1 -0
  182. package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper-dbg.js +330 -0
  183. package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.js +3 -328
  184. package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.js.map +1 -0
  185. package/src/sap/fe/core/controls/CustomQuickViewPage-dbg.js +126 -0
  186. package/src/sap/fe/core/controls/CustomQuickViewPage.js +3 -124
  187. package/src/sap/fe/core/controls/CustomQuickViewPage.js.map +1 -0
  188. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler-dbg.js +170 -0
  189. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +3 -171
  190. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js.map +1 -0
  191. package/src/sap/fe/core/controls/FieldWrapper-dbg.js +194 -0
  192. package/src/sap/fe/core/controls/FieldWrapper.js +3 -191
  193. package/src/sap/fe/core/controls/FieldWrapper.js.map +1 -0
  194. package/src/sap/fe/core/controls/FileWrapper-dbg.js +280 -0
  195. package/src/sap/fe/core/controls/FileWrapper.js +3 -277
  196. package/src/sap/fe/core/controls/FileWrapper.js.map +1 -0
  197. package/src/sap/fe/core/controls/FilterBar-dbg.js +167 -0
  198. package/src/sap/fe/core/controls/FilterBar.js +3 -166
  199. package/src/sap/fe/core/controls/FilterBar.js.map +1 -0
  200. package/src/sap/fe/core/controls/FormElementWrapper-dbg.js +92 -0
  201. package/src/sap/fe/core/controls/FormElementWrapper.js +3 -89
  202. package/src/sap/fe/core/controls/FormElementWrapper.js.map +1 -0
  203. package/src/sap/fe/core/controls/MassEditSelect-dbg.js +33 -0
  204. package/src/sap/fe/core/controls/MassEditSelect.js +3 -30
  205. package/src/sap/fe/core/controls/MassEditSelect.js.map +1 -0
  206. package/src/sap/fe/core/controls/MultiValueParameterDelegate-dbg.js +37 -0
  207. package/src/sap/fe/core/controls/MultiValueParameterDelegate.js +3 -34
  208. package/src/sap/fe/core/controls/MultiValueParameterDelegate.js.map +1 -0
  209. package/src/sap/fe/core/controls/filterbar/FilterContainer-dbg.js +119 -0
  210. package/src/sap/fe/core/controls/filterbar/FilterContainer.js +3 -121
  211. package/src/sap/fe/core/controls/filterbar/FilterContainer.js.map +1 -0
  212. package/src/sap/fe/core/controls/filterbar/VisualFilter-dbg.js +267 -0
  213. package/src/sap/fe/core/controls/filterbar/VisualFilter.js +3 -264
  214. package/src/sap/fe/core/controls/filterbar/VisualFilter.js.map +1 -0
  215. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer-dbg.js +150 -0
  216. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +3 -150
  217. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js.map +1 -0
  218. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils-dbg.js +310 -0
  219. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +3 -307
  220. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js.map +1 -0
  221. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +1 -1
  222. package/src/sap/fe/core/controls/massEdit/MassEditHandlers-dbg.js +491 -0
  223. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +3 -504
  224. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js.map +1 -0
  225. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.ts +2 -2
  226. package/src/sap/fe/core/converters/ConverterContext-dbg.js +403 -0
  227. package/src/sap/fe/core/converters/ConverterContext.js +3 -406
  228. package/src/sap/fe/core/converters/ConverterContext.js.map +1 -0
  229. package/src/sap/fe/core/converters/ManifestSettings-dbg.js +88 -0
  230. package/src/sap/fe/core/converters/ManifestSettings.js +3 -84
  231. package/src/sap/fe/core/converters/ManifestSettings.js.map +1 -0
  232. package/src/sap/fe/core/converters/ManifestSettings.ts +3 -1
  233. package/src/sap/fe/core/converters/ManifestWrapper-dbg.js +402 -0
  234. package/src/sap/fe/core/converters/ManifestWrapper.js +3 -406
  235. package/src/sap/fe/core/converters/ManifestWrapper.js.map +1 -0
  236. package/src/sap/fe/core/converters/MetaModelConverter-dbg.js +1161 -0
  237. package/src/sap/fe/core/converters/MetaModelConverter.js +3 -1225
  238. package/src/sap/fe/core/converters/MetaModelConverter.js.map +1 -0
  239. package/src/sap/fe/core/converters/MetaModelConverter.ts +193 -199
  240. package/src/sap/fe/core/converters/TemplateConverter-dbg.js +89 -0
  241. package/src/sap/fe/core/converters/TemplateConverter.js +3 -86
  242. package/src/sap/fe/core/converters/TemplateConverter.js.map +1 -0
  243. package/src/sap/fe/core/converters/annotations/DataField-dbg.js +396 -0
  244. package/src/sap/fe/core/converters/annotations/DataField.js +3 -394
  245. package/src/sap/fe/core/converters/annotations/DataField.js.map +1 -0
  246. package/src/sap/fe/core/converters/annotations/DataField.ts +5 -5
  247. package/src/sap/fe/core/converters/common/AnnotationConverter-dbg.js +1948 -0
  248. package/src/sap/fe/core/converters/common/AnnotationConverter.js +3 -1868
  249. package/src/sap/fe/core/converters/common/AnnotationConverter.js.map +1 -0
  250. package/src/sap/fe/core/converters/controls/Common/Action-dbg.js +424 -0
  251. package/src/sap/fe/core/converters/controls/Common/Action.js +3 -446
  252. package/src/sap/fe/core/converters/controls/Common/Action.js.map +1 -0
  253. package/src/sap/fe/core/converters/controls/Common/Action.ts +31 -14
  254. package/src/sap/fe/core/converters/controls/Common/Chart-dbg.js +276 -0
  255. package/src/sap/fe/core/converters/controls/Common/Chart.js +3 -260
  256. package/src/sap/fe/core/converters/controls/Common/Chart.js.map +1 -0
  257. package/src/sap/fe/core/converters/controls/Common/Chart.ts +52 -7
  258. package/src/sap/fe/core/converters/controls/Common/Criticality-dbg.js +42 -0
  259. package/src/sap/fe/core/converters/controls/Common/Criticality.js +3 -39
  260. package/src/sap/fe/core/converters/controls/Common/Criticality.js.map +1 -0
  261. package/src/sap/fe/core/converters/controls/Common/DataVisualization-dbg.js +247 -0
  262. package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +3 -242
  263. package/src/sap/fe/core/converters/controls/Common/DataVisualization.js.map +1 -0
  264. package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +1 -1
  265. package/src/sap/fe/core/converters/controls/Common/Form-dbg.js +229 -0
  266. package/src/sap/fe/core/converters/controls/Common/Form.js +3 -234
  267. package/src/sap/fe/core/converters/controls/Common/Form.js.map +1 -0
  268. package/src/sap/fe/core/converters/controls/Common/KPI-dbg.js +374 -0
  269. package/src/sap/fe/core/converters/controls/Common/KPI.js +3 -371
  270. package/src/sap/fe/core/converters/controls/Common/KPI.js.map +1 -0
  271. package/src/sap/fe/core/converters/controls/Common/Table-dbg.js +2596 -0
  272. package/src/sap/fe/core/converters/controls/Common/Table.js +3 -2527
  273. package/src/sap/fe/core/converters/controls/Common/Table.js.map +1 -0
  274. package/src/sap/fe/core/converters/controls/Common/Table.ts +214 -77
  275. package/src/sap/fe/core/converters/controls/Common/table/StandardActions-dbg.js +522 -0
  276. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +3 -527
  277. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js.map +1 -0
  278. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +51 -50
  279. package/src/sap/fe/core/converters/controls/ListReport/FilterBar-dbg.js +786 -0
  280. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +3 -845
  281. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js.map +1 -0
  282. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +0 -64
  283. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters-dbg.js +291 -0
  284. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +3 -316
  285. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js.map +1 -0
  286. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +30 -12
  287. package/src/sap/fe/core/converters/controls/ObjectPage/Avatar-dbg.js +56 -0
  288. package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.js +3 -53
  289. package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.js.map +1 -0
  290. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet-dbg.js +438 -0
  291. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +3 -431
  292. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js.map +1 -0
  293. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection-dbg.js +597 -0
  294. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +3 -630
  295. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js.map +1 -0
  296. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +1 -1
  297. package/src/sap/fe/core/converters/helpers/Aggregation-dbg.js +204 -0
  298. package/src/sap/fe/core/converters/helpers/Aggregation.js +3 -204
  299. package/src/sap/fe/core/converters/helpers/Aggregation.js.map +1 -0
  300. package/src/sap/fe/core/converters/helpers/BindingHelper-dbg.js +100 -0
  301. package/src/sap/fe/core/converters/helpers/BindingHelper.js +3 -99
  302. package/src/sap/fe/core/converters/helpers/BindingHelper.js.map +1 -0
  303. package/src/sap/fe/core/converters/helpers/ConfigurableObject-dbg.js +199 -0
  304. package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +3 -199
  305. package/src/sap/fe/core/converters/helpers/ConfigurableObject.js.map +1 -0
  306. package/src/sap/fe/core/converters/helpers/DataFieldHelper-dbg.js +143 -0
  307. package/src/sap/fe/core/converters/helpers/DataFieldHelper.js +3 -140
  308. package/src/sap/fe/core/converters/helpers/DataFieldHelper.js.map +1 -0
  309. package/src/sap/fe/core/converters/helpers/DataFieldHelper.ts +2 -1
  310. package/src/sap/fe/core/converters/helpers/ID-dbg.js +92 -0
  311. package/src/sap/fe/core/converters/helpers/ID.js +3 -89
  312. package/src/sap/fe/core/converters/helpers/ID.js.map +1 -0
  313. package/src/sap/fe/core/converters/helpers/IssueManager-dbg.js +62 -0
  314. package/src/sap/fe/core/converters/helpers/IssueManager.js +3 -59
  315. package/src/sap/fe/core/converters/helpers/IssueManager.js.map +1 -0
  316. package/src/sap/fe/core/converters/helpers/Key-dbg.js +62 -0
  317. package/src/sap/fe/core/converters/helpers/Key.js +3 -59
  318. package/src/sap/fe/core/converters/helpers/Key.js.map +1 -0
  319. package/src/sap/fe/core/converters/helpers/Key.ts +1 -1
  320. package/src/sap/fe/core/converters/helpers/SelectionVariantHelper-dbg.js +80 -0
  321. package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.js +3 -77
  322. package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.js.map +1 -0
  323. package/src/sap/fe/core/converters/objectPage/FormMenuActions-dbg.js +142 -0
  324. package/src/sap/fe/core/converters/objectPage/FormMenuActions.js +3 -139
  325. package/src/sap/fe/core/converters/objectPage/FormMenuActions.js.map +1 -0
  326. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction-dbg.js +406 -0
  327. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +3 -422
  328. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js.map +1 -0
  329. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +132 -111
  330. package/src/sap/fe/core/converters/templates/ListReportConverter-dbg.js +557 -0
  331. package/src/sap/fe/core/converters/templates/ListReportConverter.js +3 -589
  332. package/src/sap/fe/core/converters/templates/ListReportConverter.js.map +1 -0
  333. package/src/sap/fe/core/converters/templates/ObjectPageConverter-dbg.js +474 -0
  334. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +3 -477
  335. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js.map +1 -0
  336. package/src/sap/fe/core/designtime/AppComponent-dbg.designtime.js +103 -0
  337. package/src/sap/fe/core/designtime/AppComponent.designtime.js +3 -100
  338. package/src/sap/fe/core/designtime/AppComponent.designtime.js.map +1 -0
  339. package/src/sap/fe/core/designtime/library-preload.designtime.js +7 -0
  340. package/src/sap/fe/core/designtime/library-preload.designtime.js.map +1 -0
  341. package/src/sap/fe/core/formatters/CollaborationFormatter-dbg.js +95 -0
  342. package/src/sap/fe/core/formatters/CollaborationFormatter.js +3 -92
  343. package/src/sap/fe/core/formatters/CollaborationFormatter.js.map +1 -0
  344. package/src/sap/fe/core/formatters/FPMFormatter-dbg.js +46 -0
  345. package/src/sap/fe/core/formatters/FPMFormatter.js +3 -44
  346. package/src/sap/fe/core/formatters/FPMFormatter.js.map +1 -0
  347. package/src/sap/fe/core/formatters/FPMFormatter.ts +3 -2
  348. package/src/sap/fe/core/formatters/FiscalFormat-dbg.js +343 -0
  349. package/src/sap/fe/core/formatters/FiscalFormat.js +6 -0
  350. package/src/sap/fe/core/formatters/FiscalFormat.js.map +1 -0
  351. package/src/sap/fe/core/formatters/FiscalFormat.ts +319 -0
  352. package/src/sap/fe/core/formatters/KPIFormatter-dbg.js +86 -0
  353. package/src/sap/fe/core/formatters/KPIFormatter.js +3 -83
  354. package/src/sap/fe/core/formatters/KPIFormatter.js.map +1 -0
  355. package/src/sap/fe/core/formatters/StandardFormatter-dbg.js +80 -0
  356. package/src/sap/fe/core/formatters/StandardFormatter.js +3 -78
  357. package/src/sap/fe/core/formatters/StandardFormatter.js.map +1 -0
  358. package/src/sap/fe/core/formatters/TableFormatter-dbg.js +276 -0
  359. package/src/sap/fe/core/formatters/TableFormatter.js +3 -275
  360. package/src/sap/fe/core/formatters/TableFormatter.js.map +1 -0
  361. package/src/sap/fe/core/formatters/TableFormatter.ts +1 -1
  362. package/src/sap/fe/core/formatters/TableFormatterTypes-dbg.js +20 -0
  363. package/src/sap/fe/core/formatters/TableFormatterTypes.js +3 -17
  364. package/src/sap/fe/core/formatters/TableFormatterTypes.js.map +1 -0
  365. package/src/sap/fe/core/formatters/ValueFormatter-dbg.js +172 -0
  366. package/src/sap/fe/core/formatters/ValueFormatter.js +3 -161
  367. package/src/sap/fe/core/formatters/ValueFormatter.js.map +1 -0
  368. package/src/sap/fe/core/formatters/ValueFormatter.ts +25 -8
  369. package/src/sap/fe/core/fpm/Component-dbg.js +94 -0
  370. package/src/sap/fe/core/fpm/Component.js +3 -91
  371. package/src/sap/fe/core/fpm/Component.js.map +1 -0
  372. package/src/sap/fe/core/fpm/manifest.json +1 -1
  373. package/src/sap/fe/core/helpers/AnnotationEnum-dbg.js +30 -0
  374. package/src/sap/fe/core/helpers/AnnotationEnum.js +3 -36
  375. package/src/sap/fe/core/helpers/AnnotationEnum.js.map +1 -0
  376. package/src/sap/fe/core/helpers/AppStartupHelper-dbg.js +334 -0
  377. package/src/sap/fe/core/helpers/AppStartupHelper.js +3 -335
  378. package/src/sap/fe/core/helpers/AppStartupHelper.js.map +1 -0
  379. package/src/sap/fe/core/helpers/BindingToolkit-dbg.js +1739 -0
  380. package/src/sap/fe/core/helpers/BindingToolkit.js +3 -1611
  381. package/src/sap/fe/core/helpers/BindingToolkit.js.map +1 -0
  382. package/src/sap/fe/core/helpers/BindingToolkit.ts +277 -97
  383. package/src/sap/fe/core/helpers/ClassSupport-dbg.js +421 -0
  384. package/src/sap/fe/core/helpers/ClassSupport.js +3 -420
  385. package/src/sap/fe/core/helpers/ClassSupport.js.map +1 -0
  386. package/src/sap/fe/core/helpers/ClassSupport.ts +13 -15
  387. package/src/sap/fe/core/helpers/DeleteHelper-dbg.js +526 -0
  388. package/src/sap/fe/core/helpers/DeleteHelper.js +3 -618
  389. package/src/sap/fe/core/helpers/DeleteHelper.js.map +1 -0
  390. package/src/sap/fe/core/helpers/DeleteHelper.ts +116 -134
  391. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper-dbg.js +55 -0
  392. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +3 -52
  393. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js.map +1 -0
  394. package/src/sap/fe/core/helpers/EditState-dbg.js +80 -0
  395. package/src/sap/fe/core/helpers/EditState.js +3 -77
  396. package/src/sap/fe/core/helpers/EditState.js.map +1 -0
  397. package/src/sap/fe/core/helpers/ExcelFormatHelper-dbg.js +55 -0
  398. package/src/sap/fe/core/helpers/ExcelFormatHelper.js +3 -52
  399. package/src/sap/fe/core/helpers/ExcelFormatHelper.js.map +1 -0
  400. package/src/sap/fe/core/helpers/FPMHelper-dbg.js +55 -0
  401. package/src/sap/fe/core/helpers/FPMHelper.js +3 -52
  402. package/src/sap/fe/core/helpers/FPMHelper.js.map +1 -0
  403. package/src/sap/fe/core/helpers/KeepAliveHelper-dbg.js +180 -0
  404. package/src/sap/fe/core/helpers/KeepAliveHelper.js +3 -177
  405. package/src/sap/fe/core/helpers/KeepAliveHelper.js.map +1 -0
  406. package/src/sap/fe/core/helpers/KeepAliveRefreshTypes-dbg.js +28 -0
  407. package/src/sap/fe/core/helpers/KeepAliveRefreshTypes.js +3 -25
  408. package/src/sap/fe/core/helpers/KeepAliveRefreshTypes.js.map +1 -0
  409. package/src/sap/fe/core/helpers/LoaderUtils-dbg.js +29 -0
  410. package/src/sap/fe/core/helpers/LoaderUtils.js +3 -30
  411. package/src/sap/fe/core/helpers/LoaderUtils.js.map +1 -0
  412. package/src/sap/fe/core/helpers/MassEditHelper-dbg.js +1229 -0
  413. package/src/sap/fe/core/helpers/MassEditHelper.js +3 -1309
  414. package/src/sap/fe/core/helpers/MassEditHelper.js.map +1 -0
  415. package/src/sap/fe/core/helpers/MassEditHelper.ts +6 -6
  416. package/src/sap/fe/core/helpers/MessageStrip-dbg.js +65 -0
  417. package/src/sap/fe/core/helpers/MessageStrip.js +3 -62
  418. package/src/sap/fe/core/helpers/MessageStrip.js.map +1 -0
  419. package/src/sap/fe/core/helpers/ModelHelper-dbg.js +489 -0
  420. package/src/sap/fe/core/helpers/ModelHelper.js +3 -503
  421. package/src/sap/fe/core/helpers/ModelHelper.js.map +1 -0
  422. package/src/sap/fe/core/helpers/ModelHelper.ts +13 -36
  423. package/src/sap/fe/core/helpers/PasteHelper-dbg.js +174 -0
  424. package/src/sap/fe/core/helpers/PasteHelper.js +3 -185
  425. package/src/sap/fe/core/helpers/PasteHelper.js.map +1 -0
  426. package/src/sap/fe/core/helpers/SemanticDateOperators-dbg.js +371 -0
  427. package/src/sap/fe/core/helpers/SemanticDateOperators.js +3 -368
  428. package/src/sap/fe/core/helpers/SemanticDateOperators.js.map +1 -0
  429. package/src/sap/fe/core/helpers/SemanticKeyHelper-dbg.js +70 -0
  430. package/src/sap/fe/core/helpers/SemanticKeyHelper.js +3 -67
  431. package/src/sap/fe/core/helpers/SemanticKeyHelper.js.map +1 -0
  432. package/src/sap/fe/core/helpers/SideEffectsHelper-dbg.js +141 -0
  433. package/src/sap/fe/core/helpers/SideEffectsHelper.js +3 -137
  434. package/src/sap/fe/core/helpers/SideEffectsHelper.js.map +1 -0
  435. package/src/sap/fe/core/helpers/SideEffectsHelper.ts +3 -2
  436. package/src/sap/fe/core/helpers/StableIdHelper-dbg.js +204 -0
  437. package/src/sap/fe/core/helpers/StableIdHelper.js +3 -208
  438. package/src/sap/fe/core/helpers/StableIdHelper.js.map +1 -0
  439. package/src/sap/fe/core/helpers/Synchronization-dbg.js +35 -0
  440. package/src/sap/fe/core/helpers/Synchronization.js +3 -33
  441. package/src/sap/fe/core/helpers/Synchronization.js.map +1 -0
  442. package/src/sap/fe/core/helpers/ToES6Promise-dbg.js +29 -0
  443. package/src/sap/fe/core/helpers/ToES6Promise.js +3 -26
  444. package/src/sap/fe/core/helpers/ToES6Promise.js.map +1 -0
  445. package/src/sap/fe/core/helpers/TypeGuards-dbg.js +20 -0
  446. package/src/sap/fe/core/helpers/TypeGuards.js +3 -19
  447. package/src/sap/fe/core/helpers/TypeGuards.js.map +1 -0
  448. package/src/sap/fe/core/helpers/TypeGuards.ts +5 -1
  449. package/src/sap/fe/core/jsx-runtime/Fragment-dbg.js +14 -0
  450. package/src/sap/fe/core/jsx-runtime/Fragment.js +3 -11
  451. package/src/sap/fe/core/jsx-runtime/Fragment.js.map +1 -0
  452. package/src/sap/fe/core/jsx-runtime/ViewLoader-dbg.js +76 -0
  453. package/src/sap/fe/core/jsx-runtime/ViewLoader.js +3 -86
  454. package/src/sap/fe/core/jsx-runtime/ViewLoader.js.map +1 -0
  455. package/src/sap/fe/core/jsx-runtime/jsx-control-dbg.js +124 -0
  456. package/src/sap/fe/core/jsx-runtime/jsx-control.js +3 -98
  457. package/src/sap/fe/core/jsx-runtime/jsx-control.js.map +1 -0
  458. package/src/sap/fe/core/jsx-runtime/jsx-control.ts +43 -17
  459. package/src/sap/fe/core/jsx-runtime/jsx-dbg.js +41 -0
  460. package/src/sap/fe/core/jsx-runtime/jsx-xml-dbg.js +94 -0
  461. package/src/sap/fe/core/jsx-runtime/jsx-xml.js +3 -90
  462. package/src/sap/fe/core/jsx-runtime/jsx-xml.js.map +1 -0
  463. package/src/sap/fe/core/jsx-runtime/jsx-xml.ts +1 -1
  464. package/src/sap/fe/core/jsx-runtime/jsx.js +3 -28
  465. package/src/sap/fe/core/jsx-runtime/jsx.js.map +1 -0
  466. package/src/sap/fe/core/jsx-runtime/jsx.ts +19 -1
  467. package/src/sap/fe/core/jsx-runtime/jsxs-dbg.js +10 -0
  468. package/src/sap/fe/core/jsx-runtime/jsxs.js +3 -7
  469. package/src/sap/fe/core/jsx-runtime/jsxs.js.map +1 -0
  470. package/src/sap/fe/core/jsx-runtime/useMDXComponents-dbg.js +154 -0
  471. package/src/sap/fe/core/jsx-runtime/useMDXComponents.js +3 -153
  472. package/src/sap/fe/core/jsx-runtime/useMDXComponents.js.map +1 -0
  473. package/src/sap/fe/core/library-dbg.js +437 -0
  474. package/src/sap/fe/core/library-preload.js +900 -0
  475. package/src/sap/fe/core/library-preload.js.map +1 -0
  476. package/src/sap/fe/core/library-preload.support.js +177 -0
  477. package/src/sap/fe/core/library-preload.support.js.map +1 -0
  478. package/src/sap/fe/core/library.js +3 -461
  479. package/src/sap/fe/core/library.js.map +1 -0
  480. package/src/sap/fe/core/library.support.js +1 -1
  481. package/src/sap/fe/core/library.ts +12 -25
  482. package/src/sap/fe/core/manifest.json +100 -0
  483. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration-dbg.js +99 -0
  484. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +3 -96
  485. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js.map +1 -0
  486. package/src/sap/fe/core/messagebundle.properties +6 -0
  487. package/src/sap/fe/core/messagebundle_ar.properties +22 -0
  488. package/src/sap/fe/core/messagebundle_bg.properties +22 -0
  489. package/src/sap/fe/core/messagebundle_ca.properties +22 -0
  490. package/src/sap/fe/core/messagebundle_cs.properties +22 -0
  491. package/src/sap/fe/core/messagebundle_cy.properties +22 -0
  492. package/src/sap/fe/core/messagebundle_da.properties +22 -0
  493. package/src/sap/fe/core/messagebundle_de.properties +22 -0
  494. package/src/sap/fe/core/messagebundle_el.properties +22 -0
  495. package/src/sap/fe/core/messagebundle_en.properties +22 -0
  496. package/src/sap/fe/core/messagebundle_en_GB.properties +22 -0
  497. package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +22 -0
  498. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +4 -0
  499. package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +4 -0
  500. package/src/sap/fe/core/messagebundle_es.properties +22 -0
  501. package/src/sap/fe/core/messagebundle_es_MX.properties +22 -0
  502. package/src/sap/fe/core/messagebundle_et.properties +22 -0
  503. package/src/sap/fe/core/messagebundle_fi.properties +22 -0
  504. package/src/sap/fe/core/messagebundle_fr.properties +22 -0
  505. package/src/sap/fe/core/messagebundle_fr_CA.properties +22 -0
  506. package/src/sap/fe/core/messagebundle_hi.properties +22 -0
  507. package/src/sap/fe/core/messagebundle_hr.properties +23 -1
  508. package/src/sap/fe/core/messagebundle_hu.properties +22 -0
  509. package/src/sap/fe/core/messagebundle_id.properties +22 -0
  510. package/src/sap/fe/core/messagebundle_it.properties +22 -0
  511. package/src/sap/fe/core/messagebundle_iw.properties +22 -0
  512. package/src/sap/fe/core/messagebundle_ja.properties +22 -0
  513. package/src/sap/fe/core/messagebundle_kk.properties +22 -0
  514. package/src/sap/fe/core/messagebundle_ko.properties +22 -0
  515. package/src/sap/fe/core/messagebundle_lt.properties +22 -0
  516. package/src/sap/fe/core/messagebundle_lv.properties +22 -0
  517. package/src/sap/fe/core/messagebundle_ms.properties +22 -0
  518. package/src/sap/fe/core/messagebundle_nl.properties +22 -0
  519. package/src/sap/fe/core/messagebundle_no.properties +22 -0
  520. package/src/sap/fe/core/messagebundle_pl.properties +22 -0
  521. package/src/sap/fe/core/messagebundle_pt.properties +22 -0
  522. package/src/sap/fe/core/messagebundle_pt_PT.properties +22 -0
  523. package/src/sap/fe/core/messagebundle_ro.properties +22 -0
  524. package/src/sap/fe/core/messagebundle_ru.properties +22 -0
  525. package/src/sap/fe/core/messagebundle_sh.properties +22 -0
  526. package/src/sap/fe/core/messagebundle_sk.properties +22 -0
  527. package/src/sap/fe/core/messagebundle_sl.properties +22 -0
  528. package/src/sap/fe/core/messagebundle_sv.properties +22 -0
  529. package/src/sap/fe/core/messagebundle_th.properties +22 -0
  530. package/src/sap/fe/core/messagebundle_tr.properties +22 -0
  531. package/src/sap/fe/core/messagebundle_uk.properties +22 -0
  532. package/src/sap/fe/core/messagebundle_vi.properties +22 -0
  533. package/src/sap/fe/core/messagebundle_zh_CN.properties +22 -0
  534. package/src/sap/fe/core/messagebundle_zh_TW.properties +22 -0
  535. package/src/sap/fe/core/operationsHelper-dbg.js +155 -0
  536. package/src/sap/fe/core/operationsHelper.js +3 -205
  537. package/src/sap/fe/core/operationsHelper.js.map +1 -0
  538. package/src/sap/fe/core/operationsHelper.ts +14 -68
  539. package/src/sap/fe/core/rootView/Fcl-dbg.controller.js +837 -0
  540. package/src/sap/fe/core/rootView/Fcl.controller.js +3 -855
  541. package/src/sap/fe/core/rootView/Fcl.controller.js.map +1 -0
  542. package/src/sap/fe/core/rootView/NavContainer-dbg.controller.js +190 -0
  543. package/src/sap/fe/core/rootView/NavContainer.controller.js +3 -190
  544. package/src/sap/fe/core/rootView/NavContainer.controller.js.map +1 -0
  545. package/src/sap/fe/core/rootView/RootViewBaseController-dbg.js +506 -0
  546. package/src/sap/fe/core/rootView/RootViewBaseController.js +3 -538
  547. package/src/sap/fe/core/rootView/RootViewBaseController.js.map +1 -0
  548. package/src/sap/fe/core/rootView/RootViewBaseController.ts +3 -4
  549. package/src/sap/fe/core/services/AsyncComponentServiceFactory-dbg.js +60 -0
  550. package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +3 -60
  551. package/src/sap/fe/core/services/AsyncComponentServiceFactory.js.map +1 -0
  552. package/src/sap/fe/core/services/CacheHandlerServiceFactory-dbg.js +196 -0
  553. package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +3 -219
  554. package/src/sap/fe/core/services/CacheHandlerServiceFactory.js.map +1 -0
  555. package/src/sap/fe/core/services/EnvironmentServiceFactory-dbg.js +80 -0
  556. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +3 -82
  557. package/src/sap/fe/core/services/EnvironmentServiceFactory.js.map +1 -0
  558. package/src/sap/fe/core/services/NavigationServiceFactory-dbg.js +320 -0
  559. package/src/sap/fe/core/services/NavigationServiceFactory.js +3 -320
  560. package/src/sap/fe/core/services/NavigationServiceFactory.js.map +1 -0
  561. package/src/sap/fe/core/services/ResourceModelServiceFactory-dbg.js +91 -0
  562. package/src/sap/fe/core/services/ResourceModelServiceFactory.js +3 -89
  563. package/src/sap/fe/core/services/ResourceModelServiceFactory.js.map +1 -0
  564. package/src/sap/fe/core/services/RoutingServiceFactory-dbg.js +817 -0
  565. package/src/sap/fe/core/services/RoutingServiceFactory.js +3 -847
  566. package/src/sap/fe/core/services/RoutingServiceFactory.js.map +1 -0
  567. package/src/sap/fe/core/services/RoutingServiceFactory.ts +6 -3
  568. package/src/sap/fe/core/services/ShellServicesFactory-dbg.js +732 -0
  569. package/src/sap/fe/core/services/ShellServicesFactory.js +3 -752
  570. package/src/sap/fe/core/services/ShellServicesFactory.js.map +1 -0
  571. package/src/sap/fe/core/services/SideEffectsServiceFactory-dbg.js +569 -0
  572. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +3 -599
  573. package/src/sap/fe/core/services/SideEffectsServiceFactory.js.map +1 -0
  574. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +3 -3
  575. package/src/sap/fe/core/services/TemplatedViewServiceFactory-dbg.js +355 -0
  576. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +3 -387
  577. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js.map +1 -0
  578. package/src/sap/fe/core/services/view/TemplatingErrorPage-dbg.controller.js +37 -0
  579. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +3 -34
  580. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js.map +1 -0
  581. package/src/sap/fe/core/support/AnnotationIssue.support.js +4 -4
  582. package/src/sap/fe/core/support/CollectionFacetMissingID.support.js +3 -3
  583. package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.js +3 -3
  584. package/src/sap/fe/core/support/CommonHelper-dbg.js +63 -0
  585. package/src/sap/fe/core/support/CommonHelper.js +3 -60
  586. package/src/sap/fe/core/support/CommonHelper.js.map +1 -0
  587. package/src/sap/fe/core/support/Diagnostics-dbg.js +44 -0
  588. package/src/sap/fe/core/support/Diagnostics.js +3 -49
  589. package/src/sap/fe/core/support/Diagnostics.js.map +1 -0
  590. package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.js +3 -3
  591. package/src/sap/fe/core/templating/CommonFormatters-dbg.js +70 -0
  592. package/src/sap/fe/core/templating/CommonFormatters.js +3 -66
  593. package/src/sap/fe/core/templating/CommonFormatters.js.map +1 -0
  594. package/src/sap/fe/core/templating/CommonFormatters.ts +9 -3
  595. package/src/sap/fe/core/templating/CriticalityFormatters-dbg.js +136 -0
  596. package/src/sap/fe/core/templating/CriticalityFormatters.js +3 -133
  597. package/src/sap/fe/core/templating/CriticalityFormatters.js.map +1 -0
  598. package/src/sap/fe/core/templating/DataFieldFormatters-dbg.js +58 -0
  599. package/src/sap/fe/core/templating/DataFieldFormatters.js +3 -55
  600. package/src/sap/fe/core/templating/DataFieldFormatters.js.map +1 -0
  601. package/src/sap/fe/core/templating/DataModelPathHelper-dbg.js +363 -0
  602. package/src/sap/fe/core/templating/DataModelPathHelper.js +3 -372
  603. package/src/sap/fe/core/templating/DataModelPathHelper.js.map +1 -0
  604. package/src/sap/fe/core/templating/DataModelPathHelper.ts +17 -8
  605. package/src/sap/fe/core/templating/DisplayModeFormatter-dbg.js +56 -0
  606. package/src/sap/fe/core/templating/DisplayModeFormatter.js +3 -124
  607. package/src/sap/fe/core/templating/DisplayModeFormatter.js.map +1 -0
  608. package/src/sap/fe/core/templating/DisplayModeFormatter.ts +0 -47
  609. package/src/sap/fe/core/templating/EntitySetHelper-dbg.js +68 -0
  610. package/src/sap/fe/core/templating/EntitySetHelper.js +3 -81
  611. package/src/sap/fe/core/templating/EntitySetHelper.js.map +1 -0
  612. package/src/sap/fe/core/templating/FieldControlHelper-dbg.js +77 -0
  613. package/src/sap/fe/core/templating/FieldControlHelper.js +3 -74
  614. package/src/sap/fe/core/templating/FieldControlHelper.js.map +1 -0
  615. package/src/sap/fe/core/templating/FilterHelper-dbg.js +346 -0
  616. package/src/sap/fe/core/templating/FilterHelper.js +3 -339
  617. package/src/sap/fe/core/templating/FilterHelper.js.map +1 -0
  618. package/src/sap/fe/core/templating/FilterHelper.ts +2 -21
  619. package/src/sap/fe/core/templating/FilterTemplating-dbg.js +62 -0
  620. package/src/sap/fe/core/templating/FilterTemplating.js +3 -59
  621. package/src/sap/fe/core/templating/FilterTemplating.js.map +1 -0
  622. package/src/sap/fe/core/templating/PropertyFormatters-dbg.js +93 -0
  623. package/src/sap/fe/core/templating/PropertyFormatters.js +3 -90
  624. package/src/sap/fe/core/templating/PropertyFormatters.js.map +1 -0
  625. package/src/sap/fe/core/templating/PropertyHelper-dbg.js +340 -0
  626. package/src/sap/fe/core/templating/PropertyHelper.js +3 -337
  627. package/src/sap/fe/core/templating/PropertyHelper.js.map +1 -0
  628. package/src/sap/fe/core/templating/SemanticObjectHelper-dbg.js +91 -0
  629. package/src/sap/fe/core/templating/SemanticObjectHelper.js +3 -43
  630. package/src/sap/fe/core/templating/SemanticObjectHelper.js.map +1 -0
  631. package/src/sap/fe/core/templating/SemanticObjectHelper.ts +45 -1
  632. package/src/sap/fe/core/templating/UIFormatters-dbg.js +498 -0
  633. package/src/sap/fe/core/templating/UIFormatters.js +3 -544
  634. package/src/sap/fe/core/templating/UIFormatters.js.map +1 -0
  635. package/src/sap/fe/core/templating/UIFormatters.ts +60 -110
  636. package/src/sap/fe/core/type/DateTimeWithTimezone-dbg.js +35 -0
  637. package/src/sap/fe/core/type/DateTimeWithTimezone.js +3 -33
  638. package/src/sap/fe/core/type/DateTimeWithTimezone.js.map +1 -0
  639. package/src/sap/fe/core/type/EDM-dbg.js +84 -0
  640. package/src/sap/fe/core/type/EDM.js +6 -0
  641. package/src/sap/fe/core/type/EDM.js.map +1 -0
  642. package/src/sap/fe/core/type/EDM.ts +70 -0
  643. package/src/sap/fe/core/type/Email-dbg.js +29 -0
  644. package/src/sap/fe/core/type/Email.js +3 -26
  645. package/src/sap/fe/core/type/Email.js.map +1 -0
  646. package/src/sap/fe/core/type/FiscalDate-dbg.js +174 -0
  647. package/src/sap/fe/core/type/FiscalDate.js +6 -0
  648. package/src/sap/fe/core/type/FiscalDate.js.map +1 -0
  649. package/src/sap/fe/core/type/FiscalDate.ts +179 -0
  650. package/src/sap/fe/core/type/TypeUtil-dbg.js +58 -0
  651. package/src/sap/fe/core/type/TypeUtil.js +3 -55
  652. package/src/sap/fe/core/type/TypeUtil.js.map +1 -0
  653. package/src/sap/fe/core/type/TypeUtil.ts +1 -0
  654. package/src/.eslintrc +0 -7
@@ -0,0 +1,1219 @@
1
+ /*!
2
+ * SAP UI development toolkit for HTML5 (SAPUI5)
3
+ * (c) Copyright 2009-2023 SAP SE. All rights reserved
4
+ */
5
+ sap.ui.define(["sap/m/Bar", "sap/m/Button", "sap/m/Dialog", "sap/m/FormattedText", "sap/m/MessageBox", "sap/m/MessageItem", "sap/m/MessageToast", "sap/m/MessageView", "sap/m/Text", "sap/ui/core/Core", "sap/ui/core/format/DateFormat", "sap/ui/core/IconPool", "sap/ui/core/library", "sap/ui/core/message/Message", "sap/ui/model/Filter", "sap/ui/model/FilterOperator", "sap/ui/model/json/JSONModel", "sap/ui/model/Sorter", "../../CommonUtils"], function (Bar, Button, Dialog, FormattedText, MessageBox, MessageItem, MessageToast, MessageView, Text, Core, DateFormat, IconPool, CoreLib, Message, Filter, FilterOperator, JSONModel, Sorter, CommonUtils) {
6
+ "use strict";
7
+
8
+ const MessageType = CoreLib.MessageType;
9
+ let aMessageList = [];
10
+ let aMessageDataList = [];
11
+ let aResolveFunctions = [];
12
+ let oDialog;
13
+ let oBackButton;
14
+ let oMessageView;
15
+ function fnFormatTechnicalDetails() {
16
+ let sPreviousGroupName;
17
+
18
+ // Insert technical detail if it exists
19
+ function insertDetail(oProperty) {
20
+ return oProperty.property ? "( ${" + oProperty.property + '} ? ("<p>' + oProperty.property.substr(Math.max(oProperty.property.lastIndexOf("/"), oProperty.property.lastIndexOf(".")) + 1) + ' : " + ' + "${" + oProperty.property + '} + "</p>") : "" )' : "";
21
+ }
22
+ // Insert groupname if it exists
23
+ function insertGroupName(oProperty) {
24
+ let sHTML = "";
25
+ if (oProperty.groupName && oProperty.property && oProperty.groupName !== sPreviousGroupName) {
26
+ sHTML += "( ${" + oProperty.property + '} ? "<br><h3>' + oProperty.groupName + '</h3>" : "" ) + ';
27
+ sPreviousGroupName = oProperty.groupName;
28
+ }
29
+ return sHTML;
30
+ }
31
+
32
+ // List of technical details to be shown
33
+ function getPaths() {
34
+ const sTD = "technicalDetails"; // name of property in message model data for technical details
35
+ return [{
36
+ groupName: "",
37
+ property: `${sTD}/status`
38
+ }, {
39
+ groupName: "",
40
+ property: `${sTD}/statusText`
41
+ }, {
42
+ groupName: "Application",
43
+ property: `${sTD}/error/@SAP__common.Application/ComponentId`
44
+ }, {
45
+ groupName: "Application",
46
+ property: `${sTD}/error/@SAP__common.Application/ServiceId`
47
+ }, {
48
+ groupName: "Application",
49
+ property: `${sTD}/error/@SAP__common.Application/ServiceRepository`
50
+ }, {
51
+ groupName: "Application",
52
+ property: `${sTD}/error/@SAP__common.Application/ServiceVersion`
53
+ }, {
54
+ groupName: "ErrorResolution",
55
+ property: `${sTD}/error/@SAP__common.ErrorResolution/Analysis`
56
+ }, {
57
+ groupName: "ErrorResolution",
58
+ property: `${sTD}/error/@SAP__common.ErrorResolution/Note`
59
+ }, {
60
+ groupName: "ErrorResolution",
61
+ property: `${sTD}/error/@SAP__common.ErrorResolution/DetailedNote`
62
+ }, {
63
+ groupName: "ErrorResolution",
64
+ property: `${sTD}/error/@SAP__common.ExceptionCategory`
65
+ }, {
66
+ groupName: "ErrorResolution",
67
+ property: `${sTD}/error/@SAP__common.TimeStamp`
68
+ }, {
69
+ groupName: "ErrorResolution",
70
+ property: `${sTD}/error/@SAP__common.TransactionId`
71
+ }, {
72
+ groupName: "Messages",
73
+ property: `${sTD}/error/code`
74
+ }, {
75
+ groupName: "Messages",
76
+ property: `${sTD}/error/message`
77
+ }];
78
+ }
79
+ let sHTML = "Object.keys(" + "${technicalDetails}" + ').length > 0 ? "<h2>Technical Details</h2>" : "" ';
80
+ getPaths().forEach(function (oProperty) {
81
+ sHTML = `${sHTML + insertGroupName(oProperty)}${insertDetail(oProperty)} + `;
82
+ });
83
+ return sHTML;
84
+ }
85
+ function fnFormatDescription() {
86
+ return "(${" + 'description} ? ("<h2>Description</h2>" + ${' + 'description}) : "")';
87
+ }
88
+ /**
89
+ * Calculates the highest priority message type(Error/Warning/Success/Information) from the available messages.
90
+ *
91
+ * @function
92
+ * @name sap.fe.core.actions.messageHandling.fnGetHighestMessagePriority
93
+ * @memberof sap.fe.core.actions.messageHandling
94
+ * @param [aMessages] Messages list
95
+ * @returns Highest priority message from the available messages
96
+ * @private
97
+ * @ui5-restricted
98
+ */
99
+ function fnGetHighestMessagePriority(aMessages) {
100
+ let sMessagePriority = MessageType.None;
101
+ const iLength = aMessages.length;
102
+ const oMessageCount = {
103
+ Error: 0,
104
+ Warning: 0,
105
+ Success: 0,
106
+ Information: 0
107
+ };
108
+ for (let i = 0; i < iLength; i++) {
109
+ ++oMessageCount[aMessages[i].getType()];
110
+ }
111
+ if (oMessageCount[MessageType.Error] > 0) {
112
+ sMessagePriority = MessageType.Error;
113
+ } else if (oMessageCount[MessageType.Warning] > 0) {
114
+ sMessagePriority = MessageType.Warning;
115
+ } else if (oMessageCount[MessageType.Success] > 0) {
116
+ sMessagePriority = MessageType.Success;
117
+ } else if (oMessageCount[MessageType.Information] > 0) {
118
+ sMessagePriority = MessageType.Information;
119
+ }
120
+ return sMessagePriority;
121
+ }
122
+ // function which modify e-Tag messages only.
123
+ // returns : true, if any e-Tag message is modified, otherwise false.
124
+ function fnModifyETagMessagesOnly(oMessageManager, oResourceBundle, concurrentEditFlag) {
125
+ const aMessages = oMessageManager.getMessageModel().getObject("/");
126
+ let bMessagesModified = false;
127
+ let sEtagMessage = "";
128
+ aMessages.forEach(function (oMessage, i) {
129
+ const oTechnicalDetails = oMessage.getTechnicalDetails && oMessage.getTechnicalDetails();
130
+ if (oTechnicalDetails && oTechnicalDetails.httpStatus === 412) {
131
+ if (oTechnicalDetails.isConcurrentModification && concurrentEditFlag) {
132
+ sEtagMessage = sEtagMessage || oResourceBundle.getText("C_APP_COMPONENT_SAPFE_ETAG_TECHNICAL_ISSUES_CONCURRENT_MODIFICATION");
133
+ } else {
134
+ sEtagMessage = sEtagMessage || oResourceBundle.getText("C_APP_COMPONENT_SAPFE_ETAG_TECHNICAL_ISSUES");
135
+ }
136
+ oMessageManager.removeMessages(aMessages[i]);
137
+ oMessage.setMessage(sEtagMessage);
138
+ oMessage.target = "";
139
+ oMessageManager.addMessages(oMessage);
140
+ bMessagesModified = true;
141
+ }
142
+ });
143
+ return bMessagesModified;
144
+ }
145
+ // Dialog close Handling
146
+ function dialogCloseHandler() {
147
+ oDialog.close();
148
+ oBackButton.setVisible(false);
149
+ aMessageList = [];
150
+ const oMessageDialogModel = oMessageView.getModel();
151
+ if (oMessageDialogModel) {
152
+ oMessageDialogModel.setData({});
153
+ }
154
+ removeUnboundTransitionMessages();
155
+ }
156
+ function getRetryAfterMessage(oMessage, bMessageDialog) {
157
+ const dNow = new Date();
158
+ const oTechnicalDetails = oMessage.getTechnicalDetails();
159
+ const oResourceBundle = Core.getLibraryResourceBundle("sap.fe.core");
160
+ let sRetryAfterMessage;
161
+ if (oTechnicalDetails && oTechnicalDetails.httpStatus === 503 && oTechnicalDetails.retryAfter) {
162
+ const dRetryAfter = oTechnicalDetails.retryAfter;
163
+ let oDateFormat;
164
+ if (dNow.getFullYear() !== dRetryAfter.getFullYear()) {
165
+ //different years
166
+ oDateFormat = DateFormat.getDateTimeInstance({
167
+ pattern: "MMMM dd, yyyy 'at' hh:mm a"
168
+ });
169
+ sRetryAfterMessage = oResourceBundle.getText("C_MESSAGE_HANDLING_SAPFE_503_ERROR", [oDateFormat.format(dRetryAfter)]);
170
+ } else if (dNow.getFullYear() == dRetryAfter.getFullYear()) {
171
+ //same year
172
+ if (bMessageDialog) {
173
+ //less than 2 min
174
+ sRetryAfterMessage = `${oResourceBundle.getText("C_MESSAGE_HANDLING_SAPFE_503_TITLE")} ${oResourceBundle.getText("C_MESSAGE_HANDLING_SAPFE_503_DESC")}`;
175
+ } else if (dNow.getMonth() !== dRetryAfter.getMonth() || dNow.getDate() !== dRetryAfter.getDate()) {
176
+ oDateFormat = DateFormat.getDateTimeInstance({
177
+ pattern: "MMMM dd 'at' hh:mm a"
178
+ }); //different months or different days of same month
179
+ sRetryAfterMessage = oResourceBundle.getText("C_MESSAGE_HANDLING_SAPFE_503_ERROR", [oDateFormat.format(dRetryAfter)]);
180
+ } else {
181
+ //same day
182
+ oDateFormat = DateFormat.getDateTimeInstance({
183
+ pattern: "hh:mm a"
184
+ });
185
+ sRetryAfterMessage = oResourceBundle.getText("C_MESSAGE_HANDLING_SAPFE_503_ERROR_DAY", [oDateFormat.format(dRetryAfter)]);
186
+ }
187
+ }
188
+ }
189
+ if (oTechnicalDetails && oTechnicalDetails.httpStatus === 503 && !oTechnicalDetails.retryAfter) {
190
+ sRetryAfterMessage = oResourceBundle.getText("C_MESSAGE_HANDLING_SAPFE_503_ERROR_NO_RETRY_AFTER");
191
+ }
192
+ return sRetryAfterMessage;
193
+ }
194
+ function prepareMessageViewForDialog(oMessageDialogModel, bStrictHandlingFlow, multi412) {
195
+ let oMessageTemplate;
196
+ if (!bStrictHandlingFlow) {
197
+ oMessageTemplate = new MessageItem(undefined, {
198
+ counter: {
199
+ path: "counter"
200
+ },
201
+ title: "{message}",
202
+ subtitle: "{additionalText}",
203
+ longtextUrl: "{descriptionUrl}",
204
+ type: {
205
+ path: "type"
206
+ },
207
+ groupName: "{headerName}",
208
+ description: "{= ${" + "description} || ${technicalDetails} ? " + '"<html><body>" + ' + fnFormatDescription() + " + " + fnFormatTechnicalDetails() + '"</body></html>"' + ' : "" }',
209
+ markupDescription: true
210
+ });
211
+ } else if (multi412) {
212
+ oMessageTemplate = new MessageItem(undefined, {
213
+ counter: {
214
+ path: "counter"
215
+ },
216
+ title: "{message}",
217
+ subtitle: "{additionalText}",
218
+ longtextUrl: "{descriptionUrl}",
219
+ type: {
220
+ path: "type"
221
+ },
222
+ description: "{description}",
223
+ markupDescription: true
224
+ });
225
+ } else {
226
+ oMessageTemplate = new MessageItem({
227
+ title: "{message}",
228
+ type: {
229
+ path: "type"
230
+ },
231
+ longtextUrl: "{descriptionUrl}"
232
+ });
233
+ }
234
+ oMessageView = new MessageView({
235
+ showDetailsPageHeader: false,
236
+ itemSelect: function () {
237
+ oBackButton.setVisible(true);
238
+ },
239
+ items: {
240
+ path: "/",
241
+ template: oMessageTemplate
242
+ }
243
+ });
244
+ oMessageView.setGroupItems(true);
245
+ oBackButton = oBackButton || new Button({
246
+ icon: IconPool.getIconURI("nav-back"),
247
+ visible: false,
248
+ press: function () {
249
+ oMessageView.navigateBack();
250
+ this.setVisible(false);
251
+ }
252
+ });
253
+ // Update proper ETag Mismatch error
254
+ oMessageView.setModel(oMessageDialogModel);
255
+ return {
256
+ oMessageView,
257
+ oBackButton
258
+ };
259
+ }
260
+ function showUnboundMessages(aCustomMessages, oContext, bShowBoundTransition, concurrentEditFlag, control, sActionName, bOnlyForTest, onBeforeShowMessage, viewType) {
261
+ let aTransitionMessages = this.getMessages();
262
+ const oMessageManager = Core.getMessageManager();
263
+ let sHighestPriority;
264
+ let sHighestPriorityText;
265
+ const aFilters = [new Filter({
266
+ path: "persistent",
267
+ operator: FilterOperator.NE,
268
+ value1: false
269
+ })];
270
+ let showMessageDialog = false,
271
+ showMessageBox = false;
272
+ if (bShowBoundTransition) {
273
+ aTransitionMessages = aTransitionMessages.concat(getMessages(true, true));
274
+ // we only want to show bound transition messages not bound state messages hence add a filter for the same
275
+ aFilters.push(new Filter({
276
+ path: "persistent",
277
+ operator: FilterOperator.EQ,
278
+ value1: true
279
+ }));
280
+ const fnCheckControlIdInDialog = function (aControlIds) {
281
+ let index = Infinity,
282
+ oControl = Core.byId(aControlIds[0]);
283
+ const errorFieldControl = Core.byId(aControlIds[0]);
284
+ while (oControl) {
285
+ const fieldRankinDialog = oControl instanceof Dialog ? errorFieldControl.getParent().findElements(true).indexOf(errorFieldControl) : Infinity;
286
+ if (oControl instanceof Dialog) {
287
+ if (index > fieldRankinDialog) {
288
+ index = fieldRankinDialog;
289
+ // Set the focus to the dialog's control
290
+ errorFieldControl.focus();
291
+ }
292
+ // messages with target inside sap.m.Dialog should not bring up the message dialog
293
+ return false;
294
+ }
295
+ oControl = oControl.getParent();
296
+ }
297
+ return true;
298
+ };
299
+ aFilters.push(new Filter({
300
+ path: "controlIds",
301
+ test: fnCheckControlIdInDialog,
302
+ caseSensitive: true
303
+ }));
304
+ } else {
305
+ // only unbound messages have to be shown so add filter accordingly
306
+ aFilters.push(new Filter({
307
+ path: "target",
308
+ operator: FilterOperator.EQ,
309
+ value1: ""
310
+ }));
311
+ }
312
+ if (aCustomMessages && aCustomMessages.length) {
313
+ aCustomMessages.forEach(function (oMessage) {
314
+ const messageCode = oMessage.code ? oMessage.code : "";
315
+ oMessageManager.addMessages(new Message({
316
+ message: oMessage.text,
317
+ type: oMessage.type,
318
+ target: "",
319
+ persistent: true,
320
+ code: messageCode
321
+ }));
322
+ //The target and persistent properties of the message are hardcoded as "" and true because the function deals with only unbound messages.
323
+ });
324
+ }
325
+
326
+ const oMessageDialogModel = oMessageView && oMessageView.getModel() || new JSONModel();
327
+ const bHasEtagMessage = this.modifyETagMessagesOnly(oMessageManager, Core.getLibraryResourceBundle("sap.fe.core"), concurrentEditFlag);
328
+ if (aTransitionMessages.length === 1 && aTransitionMessages[0].getCode() === "503") {
329
+ showMessageBox = true;
330
+ } else if (aTransitionMessages.length !== 0) {
331
+ showMessageDialog = true;
332
+ }
333
+ let showMessageParameters;
334
+ let aModelDataArray = [];
335
+ if (showMessageDialog || !showMessageBox && !onBeforeShowMessage) {
336
+ const oListBinding = oMessageManager.getMessageModel().bindList("/", undefined, undefined, aFilters),
337
+ aCurrentContexts = oListBinding.getCurrentContexts();
338
+ if (aCurrentContexts && aCurrentContexts.length > 0) {
339
+ showMessageDialog = true;
340
+ // Don't show dialog incase there are no errors to show
341
+
342
+ // if false, show messages in dialog
343
+ // As fitering has already happened here hence
344
+ // using the message model again for the message dialog view and then filtering on that binding again is unnecessary.
345
+ // So we create new json model to use for the message dialog view.
346
+ const aMessages = [];
347
+ aCurrentContexts.forEach(function (currentContext) {
348
+ const oMessage = currentContext.getObject();
349
+ aMessages.push(oMessage);
350
+ aMessageDataList = aMessages;
351
+ });
352
+ let existingMessages = [];
353
+ if (Array.isArray(oMessageDialogModel.getData())) {
354
+ existingMessages = oMessageDialogModel.getData();
355
+ }
356
+ const oUniqueObj = {};
357
+ aModelDataArray = aMessageDataList.concat(existingMessages).filter(function (obj) {
358
+ // remove entries having duplicate message ids
359
+ return !oUniqueObj[obj.id] && (oUniqueObj[obj.id] = true);
360
+ });
361
+ oMessageDialogModel.setData(aModelDataArray);
362
+ }
363
+ }
364
+ if (onBeforeShowMessage) {
365
+ showMessageParameters = {
366
+ showMessageBox,
367
+ showMessageDialog
368
+ };
369
+ showMessageParameters = onBeforeShowMessage(aTransitionMessages, showMessageParameters);
370
+ showMessageBox = showMessageParameters.showMessageBox;
371
+ showMessageDialog = showMessageParameters.showMessageDialog;
372
+ if (showMessageDialog) {
373
+ aModelDataArray = showMessageParameters.filteredMessages ? showMessageParameters.filteredMessages : aModelDataArray;
374
+ }
375
+ }
376
+ if (aTransitionMessages.length === 0 && !aCustomMessages && !bHasEtagMessage) {
377
+ // Don't show the popup if there are no transient messages
378
+ return Promise.resolve(true);
379
+ } else if (aTransitionMessages.length === 1 && aTransitionMessages[0].getType() === MessageType.Success && !aCustomMessages) {
380
+ return new Promise(resolve => {
381
+ MessageToast.show(aTransitionMessages[0].message);
382
+ if (oMessageDialogModel) {
383
+ oMessageDialogModel.setData({});
384
+ }
385
+ oMessageManager.removeMessages(aTransitionMessages);
386
+ resolve();
387
+ });
388
+ } else if (showMessageDialog) {
389
+ messageHandling.updateMessageObjectGroupName(aModelDataArray, control, sActionName, viewType);
390
+ oMessageDialogModel.setData(aModelDataArray); // set the messages here so that if any of them are filtered for APD, they are filtered here as well.
391
+ aResolveFunctions = aResolveFunctions || [];
392
+ return new Promise(function (resolve, reject) {
393
+ aResolveFunctions.push(resolve);
394
+ Core.getLibraryResourceBundle("sap.fe.core", true).then(function (oResourceBundle) {
395
+ const bStrictHandlingFlow = false;
396
+ if (showMessageParameters && showMessageParameters.fnGetMessageSubtitle) {
397
+ oMessageDialogModel.getData().forEach(function (oMessage) {
398
+ showMessageParameters.fnGetMessageSubtitle(oMessage);
399
+ });
400
+ }
401
+ const oMessageObject = prepareMessageViewForDialog(oMessageDialogModel, bStrictHandlingFlow);
402
+ const oSorter = new Sorter("", undefined, undefined, (obj1, obj2) => {
403
+ const rankA = getMessageRank(obj1);
404
+ const rankB = getMessageRank(obj2);
405
+ if (rankA < rankB) {
406
+ return -1;
407
+ }
408
+ if (rankA > rankB) {
409
+ return 1;
410
+ }
411
+ return 0;
412
+ });
413
+ oMessageObject.oMessageView.getBinding("items").sort(oSorter);
414
+ oDialog = oDialog && oDialog.isOpen() ? oDialog : new Dialog({
415
+ resizable: true,
416
+ endButton: new Button({
417
+ press: function () {
418
+ dialogCloseHandler();
419
+ // also remove bound transition messages if we were showing them
420
+ oMessageManager.removeMessages(aModelDataArray);
421
+ },
422
+ text: oResourceBundle.getText("C_COMMON_SAPFE_CLOSE")
423
+ }),
424
+ customHeader: new Bar({
425
+ contentMiddle: [new Text({
426
+ text: oResourceBundle.getText("C_MESSAGE_HANDLING_SAPFE_ERROR_MESSAGES_PAGE_TITLE")
427
+ })],
428
+ contentLeft: [oBackButton]
429
+ }),
430
+ contentWidth: "37.5em",
431
+ contentHeight: "21.5em",
432
+ verticalScrolling: false,
433
+ afterClose: function () {
434
+ for (let i = 0; i < aResolveFunctions.length; i++) {
435
+ aResolveFunctions[i].call();
436
+ }
437
+ aResolveFunctions = [];
438
+ }
439
+ });
440
+ oDialog.removeAllContent();
441
+ oDialog.addContent(oMessageObject.oMessageView);
442
+ if (bHasEtagMessage) {
443
+ sap.ui.require(["sap/m/ButtonType"], function (ButtonType) {
444
+ oDialog.setBeginButton(new Button({
445
+ press: function () {
446
+ dialogCloseHandler();
447
+ if (oContext.hasPendingChanges()) {
448
+ oContext.getBinding().resetChanges();
449
+ }
450
+ oContext.refresh();
451
+ },
452
+ text: oResourceBundle.getText("C_COMMON_SAPFE_REFRESH"),
453
+ type: ButtonType.Emphasized
454
+ }));
455
+ });
456
+ } else {
457
+ oDialog.destroyBeginButton();
458
+ }
459
+ sHighestPriority = fnGetHighestMessagePriority(oMessageView.getItems());
460
+ sHighestPriorityText = getTranslatedTextForMessageDialog(sHighestPriority);
461
+ oDialog.setState(sHighestPriority);
462
+ oDialog.getCustomHeader().getContentMiddle()[0].setText(sHighestPriorityText);
463
+ oMessageView.navigateBack();
464
+ oDialog.open();
465
+ if (bOnlyForTest) {
466
+ resolve(oDialog);
467
+ }
468
+ }).catch(reject);
469
+ });
470
+ } else if (showMessageBox) {
471
+ return new Promise(function (resolve) {
472
+ const oMessage = aTransitionMessages[0];
473
+ if (oMessage.technicalDetails && aMessageList.indexOf(oMessage.technicalDetails.originalMessage.message) === -1) {
474
+ aMessageList.push(oMessage.technicalDetails.originalMessage.message);
475
+ let formattedTextString = "<html><body>";
476
+ const retryAfterMessage = getRetryAfterMessage(oMessage, true);
477
+ if (retryAfterMessage) {
478
+ formattedTextString = `<h6>${retryAfterMessage}</h6><br>`;
479
+ }
480
+ if (showMessageParameters && showMessageParameters.fnGetMessageSubtitle) {
481
+ showMessageParameters.fnGetMessageSubtitle(oMessage);
482
+ }
483
+ if (oMessage.getCode() !== "503" && oMessage.getAdditionalText() !== undefined) {
484
+ formattedTextString = `${formattedTextString + oMessage.getAdditionalText()}: ${oMessage.getMessage()}</html></body>`;
485
+ } else {
486
+ formattedTextString = `${formattedTextString + oMessage.getMessage()}</html></body>`;
487
+ }
488
+ const formattedText = new FormattedText({
489
+ htmlText: formattedTextString
490
+ });
491
+ MessageBox.error(formattedText, {
492
+ onClose: function () {
493
+ aMessageList = [];
494
+ if (bShowBoundTransition) {
495
+ removeBoundTransitionMessages();
496
+ }
497
+ removeUnboundTransitionMessages();
498
+ resolve(true);
499
+ }
500
+ });
501
+ }
502
+ });
503
+ } else {
504
+ return Promise.resolve(true);
505
+ }
506
+ }
507
+
508
+ /**
509
+ * This function sets the group name for all messages in a dialog.
510
+ *
511
+ * @param aModelDataArray Messages array
512
+ * @param control
513
+ * @param sActionName
514
+ * @param viewType
515
+ */
516
+ function updateMessageObjectGroupName(aModelDataArray, control, sActionName, viewType) {
517
+ aModelDataArray.forEach(aModelData => {
518
+ var _aModelData$target;
519
+ aModelData["headerName"] = "";
520
+ if (!((_aModelData$target = aModelData.target) !== null && _aModelData$target !== void 0 && _aModelData$target.length)) {
521
+ // unbound transiiton messages
522
+ aModelData["headerName"] = "General";
523
+ } else if (aModelData.target.length) {
524
+ // LR flow
525
+ if (viewType === "ListReport") {
526
+ messageHandling.setGroupNameLRTable(control, aModelData, sActionName);
527
+ } else if (viewType === "ObjectPage") {
528
+ // OP Display mode
529
+ messageHandling.setGroupNameOPDisplayMode(aModelData, sActionName, control);
530
+ } else {
531
+ aModelData["headerName"] = messageHandling.getLastActionTextAndActionName(sActionName);
532
+ }
533
+ }
534
+ });
535
+ }
536
+
537
+ /**
538
+ * This function will set the group name of Message Object for LR table.
539
+ *
540
+ * @param oElem
541
+ * @param aModelData
542
+ * @param sActionName
543
+ */
544
+ function setGroupNameLRTable(oElem, aModelData, sActionName) {
545
+ const oRowBinding = oElem && oElem.getRowBinding();
546
+ if (oRowBinding) {
547
+ var _aModelData$target2;
548
+ const sElemeBindingPath = `${oElem.getRowBinding().getPath()}`;
549
+ if (((_aModelData$target2 = aModelData.target) === null || _aModelData$target2 === void 0 ? void 0 : _aModelData$target2.indexOf(sElemeBindingPath)) === 0) {
550
+ const allRowContexts = oElem.getRowBinding().getContexts();
551
+ allRowContexts.forEach(rowContext => {
552
+ var _aModelData$target3;
553
+ if ((_aModelData$target3 = aModelData.target) !== null && _aModelData$target3 !== void 0 && _aModelData$target3.includes(rowContext.getPath())) {
554
+ const contextPath = `${rowContext.getPath()}/`;
555
+ const identifierColumn = oElem.getParent().getIdentifierColumn();
556
+ const rowIdentifier = identifierColumn && rowContext.getObject()[identifierColumn];
557
+ const columnPropertyName = messageHandling.getTableColProperty(oElem, aModelData, contextPath);
558
+ const {
559
+ sTableTargetColName
560
+ } = messageHandling.getTableColInfo(oElem, columnPropertyName);
561
+
562
+ // if target has some column name and column is visible in UI
563
+ if (columnPropertyName && sTableTargetColName) {
564
+ // header will be row Identifier, if found from above code otherwise it should be table name
565
+ aModelData["headerName"] = rowIdentifier ? ` ${rowIdentifier}` : oElem.getHeader();
566
+ } else {
567
+ // if column data not found (may be the column is hidden), add grouping as Last Action
568
+ aModelData["headerName"] = messageHandling.getLastActionTextAndActionName(sActionName);
569
+ }
570
+ }
571
+ });
572
+ }
573
+ }
574
+ }
575
+
576
+ /**
577
+ * This function will set the group name of Message Object in OP Display mode.
578
+ *
579
+ * @param aModelData Message Object
580
+ * @param sActionName Action name
581
+ * @param control
582
+ */
583
+ function setGroupNameOPDisplayMode(aModelData, sActionName, control) {
584
+ const oViewContext = control === null || control === void 0 ? void 0 : control.getBindingContext();
585
+ const opLayout = (control === null || control === void 0 ? void 0 : control.getContent) && (control === null || control === void 0 ? void 0 : control.getContent()[0]);
586
+ let bIsGeneralGroupName = true;
587
+ if (opLayout) {
588
+ messageHandling.getVisibleSectionsFromObjectPageLayout(opLayout).forEach(function (oSection) {
589
+ const subSections = oSection.getSubSections();
590
+ subSections.forEach(function (oSubSection) {
591
+ oSubSection.findElements(true).forEach(function (oElem) {
592
+ if (oElem.isA("sap.ui.mdc.Table")) {
593
+ const oRowBinding = oElem.getRowBinding(),
594
+ setSectionNameInGroup = true;
595
+ let childTableElement;
596
+ oElem.findElements(true).forEach(oElement => {
597
+ if (oElement.isA("sap.m.Table") || oElement.isA("sap.ui.table.Table")) {
598
+ childTableElement = oElement;
599
+ }
600
+ });
601
+ if (oRowBinding) {
602
+ var _oElem$getRowBinding, _aModelData$target4;
603
+ const sElemeBindingPath = `${oViewContext === null || oViewContext === void 0 ? void 0 : oViewContext.getPath()}/${(_oElem$getRowBinding = oElem.getRowBinding()) === null || _oElem$getRowBinding === void 0 ? void 0 : _oElem$getRowBinding.getPath()}`;
604
+ if (((_aModelData$target4 = aModelData.target) === null || _aModelData$target4 === void 0 ? void 0 : _aModelData$target4.indexOf(sElemeBindingPath)) === 0) {
605
+ const obj = messageHandling.getTableColumnDataAndSetSubtile(aModelData, oElem, childTableElement, oRowBinding, sActionName, setSectionNameInGroup, fnCallbackSetGroupName);
606
+ const {
607
+ oTargetTableInfo
608
+ } = obj;
609
+ if (setSectionNameInGroup) {
610
+ const identifierColumn = oElem.getParent().getIdentifierColumn();
611
+ if (identifierColumn) {
612
+ const allRowContexts = oElem.getRowBinding().getContexts();
613
+ allRowContexts.forEach(rowContext => {
614
+ var _aModelData$target5;
615
+ if ((_aModelData$target5 = aModelData.target) !== null && _aModelData$target5 !== void 0 && _aModelData$target5.includes(rowContext.getPath())) {
616
+ const rowIdentifier = identifierColumn ? rowContext.getObject()[identifierColumn] : undefined;
617
+ aModelData["additionalText"] = `${rowIdentifier}, ${oTargetTableInfo.sTableTargetColName}`;
618
+ }
619
+ });
620
+ } else {
621
+ aModelData["additionalText"] = `${oTargetTableInfo.sTableTargetColName}`;
622
+ }
623
+ let headerName = oElem.getHeaderVisible() && oTargetTableInfo.tableHeader;
624
+ if (!headerName) {
625
+ headerName = oSubSection.getTitle();
626
+ } else {
627
+ const oResourceBundle = Core.getLibraryResourceBundle("sap.fe.core");
628
+ headerName = `${oResourceBundle.getText("T_MESSAGE_GROUP_TITLE_TABLE_DENOMINATOR")}: ${headerName}`;
629
+ }
630
+ aModelData["headerName"] = headerName;
631
+ bIsGeneralGroupName = false;
632
+ }
633
+ }
634
+ }
635
+ }
636
+ });
637
+ });
638
+ });
639
+ }
640
+ if (bIsGeneralGroupName) {
641
+ var _aModelData$target6;
642
+ const sElemeBindingPath = `${oViewContext === null || oViewContext === void 0 ? void 0 : oViewContext.getPath()}`;
643
+ if (((_aModelData$target6 = aModelData.target) === null || _aModelData$target6 === void 0 ? void 0 : _aModelData$target6.indexOf(sElemeBindingPath)) === 0) {
644
+ // check if OP context path is part of target, set Last Action as group name
645
+ const headerName = messageHandling.getLastActionTextAndActionName(sActionName);
646
+ aModelData["headerName"] = headerName;
647
+ } else {
648
+ aModelData["headerName"] = "General";
649
+ }
650
+ }
651
+ }
652
+ function getLastActionTextAndActionName(sActionName) {
653
+ const sLastActionText = Core.getLibraryResourceBundle("sap.fe.core").getText("T_MESSAGE_BUTTON_SAPFE_MESSAGE_GROUP_LAST_ACTION");
654
+ return sActionName ? `${sLastActionText}: ${sActionName}` : "";
655
+ }
656
+
657
+ /**
658
+ * This function will give rank based on Message Group/Header name, which will be used for Sorting messages in Message dialog
659
+ * Last Action should be shown at top, next Row Id and last General.
660
+ *
661
+ * @param obj
662
+ * @returns Rank of message
663
+ */
664
+ function getMessageRank(obj) {
665
+ var _obj$headerName, _obj$headerName2;
666
+ if ((_obj$headerName = obj.headerName) !== null && _obj$headerName !== void 0 && _obj$headerName.toString().includes("Last Action")) {
667
+ return 1;
668
+ } else if ((_obj$headerName2 = obj.headerName) !== null && _obj$headerName2 !== void 0 && _obj$headerName2.toString().includes("General")) {
669
+ return 3;
670
+ } else {
671
+ return 2;
672
+ }
673
+ }
674
+
675
+ /**
676
+ * This function will set the group name which can either General or Last Action.
677
+ *
678
+ * @param aMessage
679
+ * @param sActionName
680
+ * @param bIsGeneralGroupName
681
+ */
682
+ const fnCallbackSetGroupName = (aMessage, sActionName, bIsGeneralGroupName) => {
683
+ if (bIsGeneralGroupName) {
684
+ const sGeneralGroupText = Core.getLibraryResourceBundle("sap.fe.core").getText("T_MESSAGE_BUTTON_SAPFE_MESSAGE_GROUP_GENERAL");
685
+ aMessage["headerName"] = sGeneralGroupText;
686
+ } else {
687
+ aMessage["headerName"] = messageHandling.getLastActionTextAndActionName(sActionName);
688
+ }
689
+ };
690
+
691
+ /**
692
+ * This function will get the table row/column info and set subtitle.
693
+ *
694
+ * @param aMessage
695
+ * @param oTable
696
+ * @param oElement
697
+ * @param oRowBinding
698
+ * @param sActionName
699
+ * @param setSectionNameInGroup
700
+ * @param fnSetGroupName
701
+ * @returns Table info and Subtitle.
702
+ */
703
+ function getTableColumnDataAndSetSubtile(aMessage, oTable, oElement, oRowBinding, sActionName, setSectionNameInGroup, fnSetGroupName) {
704
+ const oTargetTableInfo = messageHandling.getTableAndTargetInfo(oTable, aMessage, oElement, oRowBinding);
705
+ const oResourceBundle = Core.getLibraryResourceBundle("sap.fe.core");
706
+ oTargetTableInfo.tableHeader = oTable.getHeader();
707
+ let sControlId, bIsCreationRow;
708
+ if (!oTargetTableInfo.oTableRowContext) {
709
+ sControlId = aMessage.getControlIds().find(function (sId) {
710
+ return messageHandling.isControlInTable(oTable, sId);
711
+ });
712
+ }
713
+ if (sControlId) {
714
+ const oControl = Core.byId(sControlId);
715
+ bIsCreationRow = messageHandling.isControlPartOfCreationRow(oControl);
716
+ }
717
+ if (!oTargetTableInfo.sTableTargetColName) {
718
+ // if the column is not present on UI or the target does not have a table field in it, use Last Action for grouping
719
+ if (aMessage.persistent && sActionName) {
720
+ fnSetGroupName(aMessage, sActionName);
721
+ setSectionNameInGroup = false;
722
+ }
723
+ }
724
+ const subTitle = messageHandling.getMessageSubtitle(aMessage, oTargetTableInfo.oTableRowBindingContexts, oTargetTableInfo.oTableRowContext, oTargetTableInfo.sTableTargetColName, oResourceBundle, oTable, bIsCreationRow);
725
+ return {
726
+ oTargetTableInfo,
727
+ subTitle
728
+ };
729
+ }
730
+
731
+ /**
732
+ * This function will create the subtitle based on Table Row/Column data.
733
+ *
734
+ * @param message
735
+ * @param oTableRowBindingContexts
736
+ * @param oTableRowContext
737
+ * @param sTableTargetColName
738
+ * @param oResourceBundle
739
+ * @param oTable
740
+ * @param bIsCreationRow
741
+ * @param oTargetedControl
742
+ * @returns Message subtitle.
743
+ */
744
+ function getMessageSubtitle(message, oTableRowBindingContexts, oTableRowContext, sTableTargetColName, oResourceBundle, oTable, bIsCreationRow, oTargetedControl) {
745
+ let sMessageSubtitle;
746
+ let sRowSubtitleValue;
747
+ const sTableFirstColProperty = oTable.getParent().getIdentifierColumn();
748
+ const oColFromTableSettings = messageHandling.fetchColumnInfo(message, oTable);
749
+ if (bIsCreationRow) {
750
+ sMessageSubtitle = CommonUtils.getTranslatedText("T_MESSAGE_ITEM_SUBTITLE", oResourceBundle, [oResourceBundle.getText("T_MESSAGE_ITEM_SUBTITLE_CREATION_ROW_INDICATOR"), sTableTargetColName ? sTableTargetColName : oColFromTableSettings.label]);
751
+ } else {
752
+ const oTableFirstColBindingContextTextAnnotation = messageHandling.getTableFirstColBindingContextForTextAnnotation(oTable, oTableRowContext, sTableFirstColProperty);
753
+ const sTableFirstColTextAnnotationPath = oTableFirstColBindingContextTextAnnotation ? oTableFirstColBindingContextTextAnnotation.getObject("$Path") : undefined;
754
+ const sTableFirstColTextArrangement = sTableFirstColTextAnnotationPath && oTableFirstColBindingContextTextAnnotation ? oTableFirstColBindingContextTextAnnotation.getObject("@com.sap.vocabularies.UI.v1.TextArrangement/$EnumMember") : undefined;
755
+ if (oTableRowBindingContexts.length > 0) {
756
+ // set Row subtitle text
757
+ if (oTargetedControl) {
758
+ // The UI error is on the first column, we then get the control input as the row indicator:
759
+ sRowSubtitleValue = oTargetedControl.getValue();
760
+ } else if (oTableRowContext && sTableFirstColProperty) {
761
+ sRowSubtitleValue = messageHandling.getTableFirstColValue(sTableFirstColProperty, oTableRowContext, sTableFirstColTextAnnotationPath, sTableFirstColTextArrangement);
762
+ } else {
763
+ sRowSubtitleValue = undefined;
764
+ }
765
+ // set the message subtitle
766
+ const oColumnInfo = messageHandling.determineColumnInfo(oColFromTableSettings, oResourceBundle);
767
+ if (sRowSubtitleValue && sTableTargetColName) {
768
+ sMessageSubtitle = CommonUtils.getTranslatedText("T_MESSAGE_ITEM_SUBTITLE", oResourceBundle, [sRowSubtitleValue, sTableTargetColName]);
769
+ } else if (sRowSubtitleValue && oColumnInfo.sColumnIndicator === "Hidden") {
770
+ sMessageSubtitle = `${oResourceBundle.getText("T_MESSAGE_GROUP_DESCRIPTION_TABLE_ROW")}: ${sRowSubtitleValue}, ${oColumnInfo.sColumnValue}`;
771
+ } else if (sRowSubtitleValue && oColumnInfo.sColumnIndicator === "Unknown") {
772
+ sMessageSubtitle = CommonUtils.getTranslatedText("T_MESSAGE_ITEM_SUBTITLE", oResourceBundle, [sRowSubtitleValue, oColumnInfo.sColumnValue]);
773
+ } else if (sRowSubtitleValue && oColumnInfo.sColumnIndicator === "undefined") {
774
+ sMessageSubtitle = `${oResourceBundle.getText("T_MESSAGE_GROUP_DESCRIPTION_TABLE_ROW")}: ${sRowSubtitleValue}`;
775
+ } else if (!sRowSubtitleValue && sTableTargetColName) {
776
+ sMessageSubtitle = oResourceBundle.getText("T_MESSAGE_GROUP_DESCRIPTION_TABLE_COLUMN") + ": " + sTableTargetColName;
777
+ } else if (!sRowSubtitleValue && oColumnInfo.sColumnIndicator === "Hidden") {
778
+ sMessageSubtitle = oColumnInfo.sColumnValue;
779
+ } else {
780
+ sMessageSubtitle = null;
781
+ }
782
+ } else {
783
+ sMessageSubtitle = null;
784
+ }
785
+ }
786
+ return sMessageSubtitle;
787
+ }
788
+
789
+ /**
790
+ * This function will get the first column for text Annotation, this is needed to set subtitle of Message.
791
+ *
792
+ * @param oTable
793
+ * @param oTableRowContext
794
+ * @param sTableFirstColProperty
795
+ * @returns Binding context.
796
+ */
797
+ function getTableFirstColBindingContextForTextAnnotation(oTable, oTableRowContext, sTableFirstColProperty) {
798
+ let oBindingContext;
799
+ if (oTableRowContext && sTableFirstColProperty) {
800
+ const oModel = oTable === null || oTable === void 0 ? void 0 : oTable.getModel();
801
+ const oMetaModel = oModel === null || oModel === void 0 ? void 0 : oModel.getMetaModel();
802
+ const sMetaPath = oMetaModel === null || oMetaModel === void 0 ? void 0 : oMetaModel.getMetaPath(oTableRowContext.getPath());
803
+ if (oMetaModel !== null && oMetaModel !== void 0 && oMetaModel.getObject(`${sMetaPath}/${sTableFirstColProperty}@com.sap.vocabularies.Common.v1.Text/$Path`)) {
804
+ oBindingContext = oMetaModel.createBindingContext(`${sMetaPath}/${sTableFirstColProperty}@com.sap.vocabularies.Common.v1.Text`);
805
+ }
806
+ }
807
+ return oBindingContext;
808
+ }
809
+
810
+ /**
811
+ * This function will get the value of first Column of Table, with its text Arrangement.
812
+ *
813
+ * @param sTableFirstColProperty
814
+ * @param oTableRowContext
815
+ * @param sTextAnnotationPath
816
+ * @param sTextArrangement
817
+ * @returns Column Value.
818
+ */
819
+ function getTableFirstColValue(sTableFirstColProperty, oTableRowContext, sTextAnnotationPath, sTextArrangement) {
820
+ const sCodeValue = oTableRowContext.getValue(sTableFirstColProperty);
821
+ let sTextValue;
822
+ let sComputedValue = sCodeValue;
823
+ if (sTextAnnotationPath) {
824
+ if (sTableFirstColProperty.lastIndexOf("/") > 0) {
825
+ // the target property is replaced with the text annotation path
826
+ sTableFirstColProperty = sTableFirstColProperty.slice(0, sTableFirstColProperty.lastIndexOf("/") + 1);
827
+ sTableFirstColProperty = sTableFirstColProperty.concat(sTextAnnotationPath);
828
+ } else {
829
+ sTableFirstColProperty = sTextAnnotationPath;
830
+ }
831
+ sTextValue = oTableRowContext.getValue(sTableFirstColProperty);
832
+ if (sTextValue) {
833
+ if (sTextArrangement) {
834
+ const sEnumNumber = sTextArrangement.slice(sTextArrangement.indexOf("/") + 1);
835
+ switch (sEnumNumber) {
836
+ case "TextOnly":
837
+ sComputedValue = sTextValue;
838
+ break;
839
+ case "TextFirst":
840
+ sComputedValue = `${sTextValue} (${sCodeValue})`;
841
+ break;
842
+ case "TextLast":
843
+ sComputedValue = `${sCodeValue} (${sTextValue})`;
844
+ break;
845
+ case "TextSeparate":
846
+ sComputedValue = sCodeValue;
847
+ break;
848
+ default:
849
+ }
850
+ } else {
851
+ sComputedValue = `${sTextValue} (${sCodeValue})`;
852
+ }
853
+ }
854
+ }
855
+ return sComputedValue;
856
+ }
857
+
858
+ /**
859
+ * The method that is called to retrieve the column info from the associated message of the message popover.
860
+ *
861
+ * @private
862
+ * @param oMessage Message object
863
+ * @param oTable MdcTable
864
+ * @returns Returns the column info.
865
+ */
866
+ function fetchColumnInfo(oMessage, oTable) {
867
+ const sColNameFromMessageObj = oMessage === null || oMessage === void 0 ? void 0 : oMessage.getTargets()[0].split("/").pop();
868
+ return oTable.getParent().getTableDefinition().columns.find(function (oColumn) {
869
+ return oColumn.key.split("::").pop() === sColNameFromMessageObj;
870
+ });
871
+ }
872
+
873
+ /**
874
+ * This function get the Column data depending on its availability in Table, this is needed for setting subtitle of Message.
875
+ *
876
+ * @param oColFromTableSettings
877
+ * @param oResourceBundle
878
+ * @returns Column data.
879
+ */
880
+ function determineColumnInfo(oColFromTableSettings, oResourceBundle) {
881
+ const oColumnInfo = {
882
+ sColumnIndicator: String,
883
+ sColumnValue: String
884
+ };
885
+ if (oColFromTableSettings) {
886
+ // if column is neither in table definition nor personalization, show only row subtitle text
887
+ if (oColFromTableSettings.availability === "Hidden") {
888
+ oColumnInfo.sColumnValue = undefined;
889
+ oColumnInfo.sColumnIndicator = "undefined";
890
+ } else {
891
+ //if column is in table personalization but not in table definition, show Column (Hidden) : <colName>
892
+ oColumnInfo.sColumnValue = `${oResourceBundle.getText("T_MESSAGE_GROUP_DESCRIPTION_TABLE_COLUMN")} (${oResourceBundle.getText("T_COLUMN_INDICATOR_IN_TABLE_DEFINITION")}): ${oColFromTableSettings.label}`;
893
+ oColumnInfo.sColumnIndicator = "Hidden";
894
+ }
895
+ } else {
896
+ oColumnInfo.sColumnValue = oResourceBundle.getText("T_MESSAGE_ITEM_SUBTITLE_INDICATOR_UNKNOWN");
897
+ oColumnInfo.sColumnIndicator = "Unknown";
898
+ }
899
+ return oColumnInfo;
900
+ }
901
+
902
+ /**
903
+ * This function check if a given control id is a part of Table.
904
+ *
905
+ * @param oTable
906
+ * @param sControlId
907
+ * @returns True if control is part of table.
908
+ */
909
+ function isControlInTable(oTable, sControlId) {
910
+ const oControl = Core.byId(sControlId);
911
+ if (oControl && !oControl.isA("sap.ui.table.Table") && !oControl.isA("sap.m.Table")) {
912
+ return oTable.findElements(true, function (oElem) {
913
+ return oElem.getId() === oControl;
914
+ });
915
+ }
916
+ return false;
917
+ }
918
+ function isControlPartOfCreationRow(oControl) {
919
+ let oParentControl = oControl === null || oControl === void 0 ? void 0 : oControl.getParent();
920
+ while (oParentControl && !((_oParentControl = oParentControl) !== null && _oParentControl !== void 0 && _oParentControl.isA("sap.ui.table.Row")) && !((_oParentControl2 = oParentControl) !== null && _oParentControl2 !== void 0 && _oParentControl2.isA("sap.ui.table.CreationRow")) && !((_oParentControl3 = oParentControl) !== null && _oParentControl3 !== void 0 && _oParentControl3.isA("sap.m.ColumnListItem"))) {
921
+ var _oParentControl, _oParentControl2, _oParentControl3;
922
+ oParentControl = oParentControl.getParent();
923
+ }
924
+ return !!oParentControl && oParentControl.isA("sap.ui.table.CreationRow");
925
+ }
926
+ function getTranslatedTextForMessageDialog(sHighestPriority) {
927
+ const oResourceBundle = Core.getLibraryResourceBundle("sap.fe.core");
928
+ switch (sHighestPriority) {
929
+ case "Error":
930
+ return oResourceBundle.getText("C_COMMON_SAPFE_ERROR_MESSAGES_PAGE_TITLE_ERROR");
931
+ case "Information":
932
+ return oResourceBundle.getText("C_MESSAGE_HANDLING_SAPFE_ERROR_MESSAGES_PAGE_TITLE_INFO");
933
+ case "Success":
934
+ return oResourceBundle.getText("C_MESSAGE_HANDLING_SAPFE_ERROR_MESSAGES_PAGE_TITLE_SUCCESS");
935
+ case "Warning":
936
+ return oResourceBundle.getText("C_MESSAGE_HANDLING_SAPFE_ERROR_MESSAGES_PAGE_TITLE_WARNING");
937
+ default:
938
+ return oResourceBundle.getText("C_MESSAGE_HANDLING_SAPFE_ERROR_MESSAGES_PAGE_TITLE");
939
+ }
940
+ }
941
+ function removeUnboundTransitionMessages() {
942
+ removeTransitionMessages(false);
943
+ }
944
+ function removeBoundTransitionMessages(sPathToBeRemoved) {
945
+ removeTransitionMessages(true, sPathToBeRemoved);
946
+ }
947
+ function getMessagesFromMessageModel(oMessageModel, sPathToBeRemoved) {
948
+ if (sPathToBeRemoved === undefined) {
949
+ return oMessageModel.getObject("/");
950
+ }
951
+ const listBinding = oMessageModel.bindList("/");
952
+ listBinding.filter(new Filter({
953
+ path: "target",
954
+ operator: FilterOperator.StartsWith,
955
+ value1: sPathToBeRemoved
956
+ }));
957
+ return listBinding.getCurrentContexts().map(function (oContext) {
958
+ return oContext.getObject();
959
+ });
960
+ }
961
+ function getMessages() {
962
+ let bBoundMessages = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
963
+ let bTransitionOnly = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
964
+ let sPathToBeRemoved = arguments.length > 2 ? arguments[2] : undefined;
965
+ let i;
966
+ const oMessageManager = Core.getMessageManager(),
967
+ oMessageModel = oMessageManager.getMessageModel(),
968
+ oResourceBundle = Core.getLibraryResourceBundle("sap.fe.core"),
969
+ aTransitionMessages = [];
970
+ let aMessages = [];
971
+ if (bBoundMessages && bTransitionOnly && sPathToBeRemoved) {
972
+ aMessages = getMessagesFromMessageModel(oMessageModel, sPathToBeRemoved);
973
+ } else {
974
+ aMessages = oMessageModel.getObject("/");
975
+ }
976
+ for (i = 0; i < aMessages.length; i++) {
977
+ if ((!bTransitionOnly || aMessages[i].persistent) && (bBoundMessages && aMessages[i].target !== "" || !bBoundMessages && (!aMessages[i].target || aMessages[i].target === ""))) {
978
+ aTransitionMessages.push(aMessages[i]);
979
+ }
980
+ }
981
+ for (i = 0; i < aTransitionMessages.length; i++) {
982
+ if (aTransitionMessages[i].code === "503" && aTransitionMessages[i].message !== "" && aTransitionMessages[i].message.indexOf(oResourceBundle.getText("C_MESSAGE_HANDLING_SAPFE_503_BACKEND_PREFIX")) === -1) {
983
+ aTransitionMessages[i].message = `\n${oResourceBundle.getText("C_MESSAGE_HANDLING_SAPFE_503_BACKEND_PREFIX")}${aTransitionMessages[i].message}`;
984
+ }
985
+ }
986
+ //Filtering messages again here to avoid showing pure technical messages raised by the model
987
+ const backendMessages = [];
988
+ for (i = 0; i < aTransitionMessages.length; i++) {
989
+ if (aTransitionMessages[i].technicalDetails && (aTransitionMessages[i].technicalDetails.originalMessage !== undefined && aTransitionMessages[i].technicalDetails.originalMessage !== null || aTransitionMessages[i].technicalDetails.httpStatus !== undefined && aTransitionMessages[i].technicalDetails.httpStatus !== null) || aTransitionMessages[i].code) {
990
+ backendMessages.push(aTransitionMessages[i]);
991
+ }
992
+ }
993
+ return backendMessages;
994
+ }
995
+ function removeTransitionMessages(bBoundMessages, sPathToBeRemoved) {
996
+ const aMessagesToBeDeleted = getMessages(bBoundMessages, true, sPathToBeRemoved);
997
+ if (aMessagesToBeDeleted.length > 0) {
998
+ Core.getMessageManager().removeMessages(aMessagesToBeDeleted);
999
+ }
1000
+ }
1001
+ //TODO: This must be moved out of message handling
1002
+ function setMessageSubtitle(oTable, aContexts, message) {
1003
+ const subtitleColumn = oTable.getParent().getIdentifierColumn();
1004
+ const errorContext = aContexts.find(function (oContext) {
1005
+ return message.getTargets()[0].indexOf(oContext.getPath()) !== -1;
1006
+ });
1007
+ message.additionalText = errorContext ? errorContext.getObject()[subtitleColumn] : undefined;
1008
+ }
1009
+
1010
+ /**
1011
+ * The method retrieves the visible sections from an object page.
1012
+ *
1013
+ * @param oObjectPageLayout The objectPageLayout object for which we want to retrieve the visible sections.
1014
+ * @returns Array of visible sections.
1015
+ * @private
1016
+ */
1017
+ function getVisibleSectionsFromObjectPageLayout(oObjectPageLayout) {
1018
+ return oObjectPageLayout.getSections().filter(function (oSection) {
1019
+ return oSection.getVisible();
1020
+ });
1021
+ }
1022
+
1023
+ /**
1024
+ * This function checks if control ids from message are a part of a given subsection.
1025
+ *
1026
+ * @param subSection
1027
+ * @param oMessageObject
1028
+ * @returns SubSection matching control ids.
1029
+ */
1030
+ function getControlFromMessageRelatingToSubSection(subSection, oMessageObject) {
1031
+ return subSection.findElements(true, oElem => {
1032
+ return fnFilterUponIds(oMessageObject.getControlIds(), oElem);
1033
+ }).sort(function (a, b) {
1034
+ // controls are sorted in order to have the table on top of the array
1035
+ // it will help to compute the subtitle of the message based on the type of related controls
1036
+ if (a.isA("sap.ui.mdc.Table") && !b.isA("sap.ui.mdc.Table")) {
1037
+ return -1;
1038
+ }
1039
+ return 1;
1040
+ });
1041
+ }
1042
+ function getTableColProperty(oTable, oMessageObject, oContextPath) {
1043
+ //this function escapes a string to use it as a regex
1044
+ const fnRegExpescape = function (s) {
1045
+ return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, "\\$&");
1046
+ };
1047
+ // based on the target path of the message we retrieve the property name.
1048
+ // to achieve it we remove the bindingContext path and the row binding path from the target
1049
+ if (!oContextPath) {
1050
+ var _oTable$getBindingCon;
1051
+ oContextPath = new RegExp(`${fnRegExpescape(`${(_oTable$getBindingCon = oTable.getBindingContext()) === null || _oTable$getBindingCon === void 0 ? void 0 : _oTable$getBindingCon.getPath()}/${oTable.getRowBinding().getPath()}`)}\\(.*\\)/`);
1052
+ }
1053
+ return oMessageObject.getTargets()[0].replace(oContextPath, "");
1054
+ }
1055
+
1056
+ /**
1057
+ * This function gives the column information if it matches with the property name from target of message.
1058
+ *
1059
+ * @param oTable
1060
+ * @param sTableTargetColProperty
1061
+ * @returns Column name and property.
1062
+ */
1063
+ function getTableColInfo(oTable, sTableTargetColProperty) {
1064
+ let sTableTargetColName;
1065
+ let oTableTargetCol = oTable.getColumns().find(function (column) {
1066
+ return column.getDataProperty() == sTableTargetColProperty;
1067
+ });
1068
+ if (!oTableTargetCol) {
1069
+ /* If the target column is not found, we check for a custom column */
1070
+ const oCustomColumn = oTable.getControlDelegate().getColumnsFor(oTable).find(function (oColumn) {
1071
+ if (!!oColumn.template && oColumn.propertyInfos) {
1072
+ return oColumn.propertyInfos[0] === sTableTargetColProperty || oColumn.propertyInfos[0].replace("Property::", "") === sTableTargetColProperty;
1073
+ } else {
1074
+ return false;
1075
+ }
1076
+ });
1077
+ if (oCustomColumn) {
1078
+ var _oTableTargetCol;
1079
+ oTableTargetCol = oCustomColumn;
1080
+ sTableTargetColProperty = (_oTableTargetCol = oTableTargetCol) === null || _oTableTargetCol === void 0 ? void 0 : _oTableTargetCol.name;
1081
+ sTableTargetColName = oTable.getColumns().find(function (oColumn) {
1082
+ return sTableTargetColProperty === oColumn.getDataProperty();
1083
+ }).getHeader();
1084
+ } else {
1085
+ /* If the target column is not found, we check for a field group */
1086
+ const aColumns = oTable.getControlDelegate().getColumnsFor(oTable);
1087
+ oTableTargetCol = aColumns.find(function (oColumn) {
1088
+ if (oColumn.key.indexOf("::FieldGroup::") !== -1) {
1089
+ var _oColumn$propertyInfo;
1090
+ return (_oColumn$propertyInfo = oColumn.propertyInfos) === null || _oColumn$propertyInfo === void 0 ? void 0 : _oColumn$propertyInfo.find(function () {
1091
+ return aColumns.find(function (tableColumn) {
1092
+ return tableColumn.relativePath === sTableTargetColProperty;
1093
+ });
1094
+ });
1095
+ }
1096
+ });
1097
+ /* check if the column with the field group is visible in the table: */
1098
+ let bIsTableTargetColVisible = false;
1099
+ if (oTableTargetCol && oTableTargetCol.label) {
1100
+ bIsTableTargetColVisible = oTable.getColumns().some(function (column) {
1101
+ return column.getHeader() === oTableTargetCol.label;
1102
+ });
1103
+ }
1104
+ sTableTargetColName = bIsTableTargetColVisible && oTableTargetCol.label;
1105
+ sTableTargetColProperty = bIsTableTargetColVisible && oTableTargetCol.key;
1106
+ }
1107
+ } else {
1108
+ sTableTargetColName = oTableTargetCol && oTableTargetCol.getHeader();
1109
+ }
1110
+ return {
1111
+ sTableTargetColName: sTableTargetColName,
1112
+ sTableTargetColProperty: sTableTargetColProperty
1113
+ };
1114
+ }
1115
+
1116
+ /**
1117
+ * This function gives Table and column info if any of it matches the target from Message.
1118
+ *
1119
+ * @param oTable
1120
+ * @param oMessageObject
1121
+ * @param oElement
1122
+ * @param oRowBinding
1123
+ * @returns Table info matching the message target.
1124
+ */
1125
+ function getTableAndTargetInfo(oTable, oMessageObject, oElement, oRowBinding) {
1126
+ const oTargetTableInfo = {};
1127
+ oTargetTableInfo.sTableTargetColProperty = getTableColProperty(oTable, oMessageObject);
1128
+ const oTableColInfo = getTableColInfo(oTable, oTargetTableInfo.sTableTargetColProperty);
1129
+ oTargetTableInfo.oTableRowBindingContexts = oElement.isA("sap.ui.table.Table") ? oRowBinding.getContexts() : oRowBinding.getCurrentContexts();
1130
+ oTargetTableInfo.sTableTargetColName = oTableColInfo.sTableTargetColName;
1131
+ oTargetTableInfo.sTableTargetColProperty = oTableColInfo.sTableTargetColProperty;
1132
+ oTargetTableInfo.oTableRowContext = oTargetTableInfo.oTableRowBindingContexts.find(function (rowContext) {
1133
+ return rowContext && oMessageObject.getTargets()[0].indexOf(rowContext.getPath()) === 0;
1134
+ });
1135
+ return oTargetTableInfo;
1136
+ }
1137
+
1138
+ /**
1139
+ *
1140
+ * @param aControlIds
1141
+ * @param oItem
1142
+ * @returns True if the item matches one of the controls
1143
+ */
1144
+ function fnFilterUponIds(aControlIds, oItem) {
1145
+ return aControlIds.some(function (sControlId) {
1146
+ if (sControlId === oItem.getId()) {
1147
+ return true;
1148
+ }
1149
+ return false;
1150
+ });
1151
+ }
1152
+
1153
+ /**
1154
+ * This function gives the group name having section and subsection data.
1155
+ *
1156
+ * @param section
1157
+ * @param subSection
1158
+ * @param bMultipleSubSections
1159
+ * @param oTargetTableInfo
1160
+ * @param oResourceBundle
1161
+ * @returns Group name.
1162
+ */
1163
+ function createSectionGroupName(section, subSection, bMultipleSubSections, oTargetTableInfo, oResourceBundle) {
1164
+ return section.getTitle() + (subSection.getTitle() && bMultipleSubSections ? `, ${subSection.getTitle()}` : "") + (oTargetTableInfo ? `, ${oResourceBundle.getText("T_MESSAGE_GROUP_TITLE_TABLE_DENOMINATOR")}: ${oTargetTableInfo.tableHeader}` : "");
1165
+ }
1166
+ function bIsOrphanElement(oElement, aElements) {
1167
+ return !aElements.some(function (oElem) {
1168
+ let oParentElement = oElement.getParent();
1169
+ while (oParentElement && oParentElement !== oElem) {
1170
+ oParentElement = oParentElement.getParent();
1171
+ }
1172
+ return oParentElement ? true : false;
1173
+ });
1174
+ }
1175
+
1176
+ /**
1177
+ * Static functions for Fiori Message Handling
1178
+ *
1179
+ * @namespace
1180
+ * @alias sap.fe.core.actions.messageHandling
1181
+ * @private
1182
+ * @experimental This module is only for experimental use! <br/><b>This is only a POC and maybe deleted</b>
1183
+ * @since 1.56.0
1184
+ */
1185
+ const messageHandling = {
1186
+ getMessages: getMessages,
1187
+ showUnboundMessages: showUnboundMessages,
1188
+ removeUnboundTransitionMessages: removeUnboundTransitionMessages,
1189
+ removeBoundTransitionMessages: removeBoundTransitionMessages,
1190
+ modifyETagMessagesOnly: fnModifyETagMessagesOnly,
1191
+ getRetryAfterMessage: getRetryAfterMessage,
1192
+ prepareMessageViewForDialog: prepareMessageViewForDialog,
1193
+ setMessageSubtitle: setMessageSubtitle,
1194
+ getVisibleSectionsFromObjectPageLayout: getVisibleSectionsFromObjectPageLayout,
1195
+ getControlFromMessageRelatingToSubSection: getControlFromMessageRelatingToSubSection,
1196
+ fnFilterUponIds: fnFilterUponIds,
1197
+ getTableAndTargetInfo: getTableAndTargetInfo,
1198
+ createSectionGroupName: createSectionGroupName,
1199
+ bIsOrphanElement: bIsOrphanElement,
1200
+ getLastActionTextAndActionName: getLastActionTextAndActionName,
1201
+ getTableColumnDataAndSetSubtile: getTableColumnDataAndSetSubtile,
1202
+ getTableColInfo: getTableColInfo,
1203
+ getTableColProperty: getTableColProperty,
1204
+ getMessageSubtitle: getMessageSubtitle,
1205
+ determineColumnInfo: determineColumnInfo,
1206
+ fetchColumnInfo: fetchColumnInfo,
1207
+ getTableFirstColBindingContextForTextAnnotation: getTableFirstColBindingContextForTextAnnotation,
1208
+ getMessageRank: getMessageRank,
1209
+ fnCallbackSetGroupName: fnCallbackSetGroupName,
1210
+ getTableFirstColValue: getTableFirstColValue,
1211
+ setGroupNameOPDisplayMode: setGroupNameOPDisplayMode,
1212
+ updateMessageObjectGroupName: updateMessageObjectGroupName,
1213
+ setGroupNameLRTable: setGroupNameLRTable,
1214
+ isControlInTable: isControlInTable,
1215
+ isControlPartOfCreationRow: isControlPartOfCreationRow
1216
+ };
1217
+ return messageHandling;
1218
+ }, false);
1219
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJNZXNzYWdlVHlwZSIsIkNvcmVMaWIiLCJhTWVzc2FnZUxpc3QiLCJhTWVzc2FnZURhdGFMaXN0IiwiYVJlc29sdmVGdW5jdGlvbnMiLCJvRGlhbG9nIiwib0JhY2tCdXR0b24iLCJvTWVzc2FnZVZpZXciLCJmbkZvcm1hdFRlY2huaWNhbERldGFpbHMiLCJzUHJldmlvdXNHcm91cE5hbWUiLCJpbnNlcnREZXRhaWwiLCJvUHJvcGVydHkiLCJwcm9wZXJ0eSIsInN1YnN0ciIsIk1hdGgiLCJtYXgiLCJsYXN0SW5kZXhPZiIsImluc2VydEdyb3VwTmFtZSIsInNIVE1MIiwiZ3JvdXBOYW1lIiwiZ2V0UGF0aHMiLCJzVEQiLCJmb3JFYWNoIiwiZm5Gb3JtYXREZXNjcmlwdGlvbiIsImZuR2V0SGlnaGVzdE1lc3NhZ2VQcmlvcml0eSIsImFNZXNzYWdlcyIsInNNZXNzYWdlUHJpb3JpdHkiLCJOb25lIiwiaUxlbmd0aCIsImxlbmd0aCIsIm9NZXNzYWdlQ291bnQiLCJFcnJvciIsIldhcm5pbmciLCJTdWNjZXNzIiwiSW5mb3JtYXRpb24iLCJpIiwiZ2V0VHlwZSIsImZuTW9kaWZ5RVRhZ01lc3NhZ2VzT25seSIsIm9NZXNzYWdlTWFuYWdlciIsIm9SZXNvdXJjZUJ1bmRsZSIsImNvbmN1cnJlbnRFZGl0RmxhZyIsImdldE1lc3NhZ2VNb2RlbCIsImdldE9iamVjdCIsImJNZXNzYWdlc01vZGlmaWVkIiwic0V0YWdNZXNzYWdlIiwib01lc3NhZ2UiLCJvVGVjaG5pY2FsRGV0YWlscyIsImdldFRlY2huaWNhbERldGFpbHMiLCJodHRwU3RhdHVzIiwiaXNDb25jdXJyZW50TW9kaWZpY2F0aW9uIiwiZ2V0VGV4dCIsInJlbW92ZU1lc3NhZ2VzIiwic2V0TWVzc2FnZSIsInRhcmdldCIsImFkZE1lc3NhZ2VzIiwiZGlhbG9nQ2xvc2VIYW5kbGVyIiwiY2xvc2UiLCJzZXRWaXNpYmxlIiwib01lc3NhZ2VEaWFsb2dNb2RlbCIsImdldE1vZGVsIiwic2V0RGF0YSIsInJlbW92ZVVuYm91bmRUcmFuc2l0aW9uTWVzc2FnZXMiLCJnZXRSZXRyeUFmdGVyTWVzc2FnZSIsImJNZXNzYWdlRGlhbG9nIiwiZE5vdyIsIkRhdGUiLCJDb3JlIiwiZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlIiwic1JldHJ5QWZ0ZXJNZXNzYWdlIiwicmV0cnlBZnRlciIsImRSZXRyeUFmdGVyIiwib0RhdGVGb3JtYXQiLCJnZXRGdWxsWWVhciIsIkRhdGVGb3JtYXQiLCJnZXREYXRlVGltZUluc3RhbmNlIiwicGF0dGVybiIsImZvcm1hdCIsImdldE1vbnRoIiwiZ2V0RGF0ZSIsInByZXBhcmVNZXNzYWdlVmlld0ZvckRpYWxvZyIsImJTdHJpY3RIYW5kbGluZ0Zsb3ciLCJtdWx0aTQxMiIsIm9NZXNzYWdlVGVtcGxhdGUiLCJNZXNzYWdlSXRlbSIsInVuZGVmaW5lZCIsImNvdW50ZXIiLCJwYXRoIiwidGl0bGUiLCJzdWJ0aXRsZSIsImxvbmd0ZXh0VXJsIiwidHlwZSIsImRlc2NyaXB0aW9uIiwibWFya3VwRGVzY3JpcHRpb24iLCJNZXNzYWdlVmlldyIsInNob3dEZXRhaWxzUGFnZUhlYWRlciIsIml0ZW1TZWxlY3QiLCJpdGVtcyIsInRlbXBsYXRlIiwic2V0R3JvdXBJdGVtcyIsIkJ1dHRvbiIsImljb24iLCJJY29uUG9vbCIsImdldEljb25VUkkiLCJ2aXNpYmxlIiwicHJlc3MiLCJuYXZpZ2F0ZUJhY2siLCJzZXRNb2RlbCIsInNob3dVbmJvdW5kTWVzc2FnZXMiLCJhQ3VzdG9tTWVzc2FnZXMiLCJvQ29udGV4dCIsImJTaG93Qm91bmRUcmFuc2l0aW9uIiwiY29udHJvbCIsInNBY3Rpb25OYW1lIiwiYk9ubHlGb3JUZXN0Iiwib25CZWZvcmVTaG93TWVzc2FnZSIsInZpZXdUeXBlIiwiYVRyYW5zaXRpb25NZXNzYWdlcyIsImdldE1lc3NhZ2VzIiwiZ2V0TWVzc2FnZU1hbmFnZXIiLCJzSGlnaGVzdFByaW9yaXR5Iiwic0hpZ2hlc3RQcmlvcml0eVRleHQiLCJhRmlsdGVycyIsIkZpbHRlciIsIm9wZXJhdG9yIiwiRmlsdGVyT3BlcmF0b3IiLCJORSIsInZhbHVlMSIsInNob3dNZXNzYWdlRGlhbG9nIiwic2hvd01lc3NhZ2VCb3giLCJjb25jYXQiLCJwdXNoIiwiRVEiLCJmbkNoZWNrQ29udHJvbElkSW5EaWFsb2ciLCJhQ29udHJvbElkcyIsImluZGV4IiwiSW5maW5pdHkiLCJvQ29udHJvbCIsImJ5SWQiLCJlcnJvckZpZWxkQ29udHJvbCIsImZpZWxkUmFua2luRGlhbG9nIiwiRGlhbG9nIiwiZ2V0UGFyZW50IiwiZmluZEVsZW1lbnRzIiwiaW5kZXhPZiIsImZvY3VzIiwidGVzdCIsImNhc2VTZW5zaXRpdmUiLCJtZXNzYWdlQ29kZSIsImNvZGUiLCJNZXNzYWdlIiwibWVzc2FnZSIsInRleHQiLCJwZXJzaXN0ZW50IiwiSlNPTk1vZGVsIiwiYkhhc0V0YWdNZXNzYWdlIiwibW9kaWZ5RVRhZ01lc3NhZ2VzT25seSIsImdldENvZGUiLCJzaG93TWVzc2FnZVBhcmFtZXRlcnMiLCJhTW9kZWxEYXRhQXJyYXkiLCJvTGlzdEJpbmRpbmciLCJiaW5kTGlzdCIsImFDdXJyZW50Q29udGV4dHMiLCJnZXRDdXJyZW50Q29udGV4dHMiLCJjdXJyZW50Q29udGV4dCIsImV4aXN0aW5nTWVzc2FnZXMiLCJBcnJheSIsImlzQXJyYXkiLCJnZXREYXRhIiwib1VuaXF1ZU9iaiIsImZpbHRlciIsIm9iaiIsImlkIiwiZmlsdGVyZWRNZXNzYWdlcyIsIlByb21pc2UiLCJyZXNvbHZlIiwiTWVzc2FnZVRvYXN0Iiwic2hvdyIsIm1lc3NhZ2VIYW5kbGluZyIsInVwZGF0ZU1lc3NhZ2VPYmplY3RHcm91cE5hbWUiLCJyZWplY3QiLCJ0aGVuIiwiZm5HZXRNZXNzYWdlU3VidGl0bGUiLCJvTWVzc2FnZU9iamVjdCIsIm9Tb3J0ZXIiLCJTb3J0ZXIiLCJvYmoxIiwib2JqMiIsInJhbmtBIiwiZ2V0TWVzc2FnZVJhbmsiLCJyYW5rQiIsImdldEJpbmRpbmciLCJzb3J0IiwiaXNPcGVuIiwicmVzaXphYmxlIiwiZW5kQnV0dG9uIiwiY3VzdG9tSGVhZGVyIiwiQmFyIiwiY29udGVudE1pZGRsZSIsIlRleHQiLCJjb250ZW50TGVmdCIsImNvbnRlbnRXaWR0aCIsImNvbnRlbnRIZWlnaHQiLCJ2ZXJ0aWNhbFNjcm9sbGluZyIsImFmdGVyQ2xvc2UiLCJjYWxsIiwicmVtb3ZlQWxsQ29udGVudCIsImFkZENvbnRlbnQiLCJzYXAiLCJ1aSIsInJlcXVpcmUiLCJCdXR0b25UeXBlIiwic2V0QmVnaW5CdXR0b24iLCJoYXNQZW5kaW5nQ2hhbmdlcyIsInJlc2V0Q2hhbmdlcyIsInJlZnJlc2giLCJFbXBoYXNpemVkIiwiZGVzdHJveUJlZ2luQnV0dG9uIiwiZ2V0SXRlbXMiLCJnZXRUcmFuc2xhdGVkVGV4dEZvck1lc3NhZ2VEaWFsb2ciLCJzZXRTdGF0ZSIsImdldEN1c3RvbUhlYWRlciIsImdldENvbnRlbnRNaWRkbGUiLCJzZXRUZXh0Iiwib3BlbiIsImNhdGNoIiwidGVjaG5pY2FsRGV0YWlscyIsIm9yaWdpbmFsTWVzc2FnZSIsImZvcm1hdHRlZFRleHRTdHJpbmciLCJyZXRyeUFmdGVyTWVzc2FnZSIsImdldEFkZGl0aW9uYWxUZXh0IiwiZ2V0TWVzc2FnZSIsImZvcm1hdHRlZFRleHQiLCJGb3JtYXR0ZWRUZXh0IiwiaHRtbFRleHQiLCJNZXNzYWdlQm94IiwiZXJyb3IiLCJvbkNsb3NlIiwicmVtb3ZlQm91bmRUcmFuc2l0aW9uTWVzc2FnZXMiLCJhTW9kZWxEYXRhIiwic2V0R3JvdXBOYW1lTFJUYWJsZSIsInNldEdyb3VwTmFtZU9QRGlzcGxheU1vZGUiLCJnZXRMYXN0QWN0aW9uVGV4dEFuZEFjdGlvbk5hbWUiLCJvRWxlbSIsIm9Sb3dCaW5kaW5nIiwiZ2V0Um93QmluZGluZyIsInNFbGVtZUJpbmRpbmdQYXRoIiwiZ2V0UGF0aCIsImFsbFJvd0NvbnRleHRzIiwiZ2V0Q29udGV4dHMiLCJyb3dDb250ZXh0IiwiaW5jbHVkZXMiLCJjb250ZXh0UGF0aCIsImlkZW50aWZpZXJDb2x1bW4iLCJnZXRJZGVudGlmaWVyQ29sdW1uIiwicm93SWRlbnRpZmllciIsImNvbHVtblByb3BlcnR5TmFtZSIsImdldFRhYmxlQ29sUHJvcGVydHkiLCJzVGFibGVUYXJnZXRDb2xOYW1lIiwiZ2V0VGFibGVDb2xJbmZvIiwiZ2V0SGVhZGVyIiwib1ZpZXdDb250ZXh0IiwiZ2V0QmluZGluZ0NvbnRleHQiLCJvcExheW91dCIsImdldENvbnRlbnQiLCJiSXNHZW5lcmFsR3JvdXBOYW1lIiwiZ2V0VmlzaWJsZVNlY3Rpb25zRnJvbU9iamVjdFBhZ2VMYXlvdXQiLCJvU2VjdGlvbiIsInN1YlNlY3Rpb25zIiwiZ2V0U3ViU2VjdGlvbnMiLCJvU3ViU2VjdGlvbiIsImlzQSIsInNldFNlY3Rpb25OYW1lSW5Hcm91cCIsImNoaWxkVGFibGVFbGVtZW50Iiwib0VsZW1lbnQiLCJnZXRUYWJsZUNvbHVtbkRhdGFBbmRTZXRTdWJ0aWxlIiwiZm5DYWxsYmFja1NldEdyb3VwTmFtZSIsIm9UYXJnZXRUYWJsZUluZm8iLCJoZWFkZXJOYW1lIiwiZ2V0SGVhZGVyVmlzaWJsZSIsInRhYmxlSGVhZGVyIiwiZ2V0VGl0bGUiLCJzTGFzdEFjdGlvblRleHQiLCJ0b1N0cmluZyIsImFNZXNzYWdlIiwic0dlbmVyYWxHcm91cFRleHQiLCJvVGFibGUiLCJmblNldEdyb3VwTmFtZSIsImdldFRhYmxlQW5kVGFyZ2V0SW5mbyIsInNDb250cm9sSWQiLCJiSXNDcmVhdGlvblJvdyIsIm9UYWJsZVJvd0NvbnRleHQiLCJnZXRDb250cm9sSWRzIiwiZmluZCIsInNJZCIsImlzQ29udHJvbEluVGFibGUiLCJpc0NvbnRyb2xQYXJ0T2ZDcmVhdGlvblJvdyIsInN1YlRpdGxlIiwiZ2V0TWVzc2FnZVN1YnRpdGxlIiwib1RhYmxlUm93QmluZGluZ0NvbnRleHRzIiwib1RhcmdldGVkQ29udHJvbCIsInNNZXNzYWdlU3VidGl0bGUiLCJzUm93U3VidGl0bGVWYWx1ZSIsInNUYWJsZUZpcnN0Q29sUHJvcGVydHkiLCJvQ29sRnJvbVRhYmxlU2V0dGluZ3MiLCJmZXRjaENvbHVtbkluZm8iLCJDb21tb25VdGlscyIsImdldFRyYW5zbGF0ZWRUZXh0IiwibGFiZWwiLCJvVGFibGVGaXJzdENvbEJpbmRpbmdDb250ZXh0VGV4dEFubm90YXRpb24iLCJnZXRUYWJsZUZpcnN0Q29sQmluZGluZ0NvbnRleHRGb3JUZXh0QW5ub3RhdGlvbiIsInNUYWJsZUZpcnN0Q29sVGV4dEFubm90YXRpb25QYXRoIiwic1RhYmxlRmlyc3RDb2xUZXh0QXJyYW5nZW1lbnQiLCJnZXRWYWx1ZSIsImdldFRhYmxlRmlyc3RDb2xWYWx1ZSIsIm9Db2x1bW5JbmZvIiwiZGV0ZXJtaW5lQ29sdW1uSW5mbyIsInNDb2x1bW5JbmRpY2F0b3IiLCJzQ29sdW1uVmFsdWUiLCJvQmluZGluZ0NvbnRleHQiLCJvTW9kZWwiLCJvTWV0YU1vZGVsIiwiZ2V0TWV0YU1vZGVsIiwic01ldGFQYXRoIiwiZ2V0TWV0YVBhdGgiLCJjcmVhdGVCaW5kaW5nQ29udGV4dCIsInNUZXh0QW5ub3RhdGlvblBhdGgiLCJzVGV4dEFycmFuZ2VtZW50Iiwic0NvZGVWYWx1ZSIsInNUZXh0VmFsdWUiLCJzQ29tcHV0ZWRWYWx1ZSIsInNsaWNlIiwic0VudW1OdW1iZXIiLCJzQ29sTmFtZUZyb21NZXNzYWdlT2JqIiwiZ2V0VGFyZ2V0cyIsInNwbGl0IiwicG9wIiwiZ2V0VGFibGVEZWZpbml0aW9uIiwiY29sdW1ucyIsIm9Db2x1bW4iLCJrZXkiLCJTdHJpbmciLCJhdmFpbGFiaWxpdHkiLCJnZXRJZCIsIm9QYXJlbnRDb250cm9sIiwicmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzIiwic1BhdGhUb0JlUmVtb3ZlZCIsImdldE1lc3NhZ2VzRnJvbU1lc3NhZ2VNb2RlbCIsIm9NZXNzYWdlTW9kZWwiLCJsaXN0QmluZGluZyIsIlN0YXJ0c1dpdGgiLCJtYXAiLCJiQm91bmRNZXNzYWdlcyIsImJUcmFuc2l0aW9uT25seSIsImJhY2tlbmRNZXNzYWdlcyIsImFNZXNzYWdlc1RvQmVEZWxldGVkIiwic2V0TWVzc2FnZVN1YnRpdGxlIiwiYUNvbnRleHRzIiwic3VidGl0bGVDb2x1bW4iLCJlcnJvckNvbnRleHQiLCJhZGRpdGlvbmFsVGV4dCIsIm9PYmplY3RQYWdlTGF5b3V0IiwiZ2V0U2VjdGlvbnMiLCJnZXRWaXNpYmxlIiwiZ2V0Q29udHJvbEZyb21NZXNzYWdlUmVsYXRpbmdUb1N1YlNlY3Rpb24iLCJzdWJTZWN0aW9uIiwiZm5GaWx0ZXJVcG9uSWRzIiwiYSIsImIiLCJvQ29udGV4dFBhdGgiLCJmblJlZ0V4cGVzY2FwZSIsInMiLCJyZXBsYWNlIiwiUmVnRXhwIiwic1RhYmxlVGFyZ2V0Q29sUHJvcGVydHkiLCJvVGFibGVUYXJnZXRDb2wiLCJnZXRDb2x1bW5zIiwiY29sdW1uIiwiZ2V0RGF0YVByb3BlcnR5Iiwib0N1c3RvbUNvbHVtbiIsImdldENvbnRyb2xEZWxlZ2F0ZSIsImdldENvbHVtbnNGb3IiLCJwcm9wZXJ0eUluZm9zIiwibmFtZSIsImFDb2x1bW5zIiwidGFibGVDb2x1bW4iLCJyZWxhdGl2ZVBhdGgiLCJiSXNUYWJsZVRhcmdldENvbFZpc2libGUiLCJzb21lIiwib1RhYmxlQ29sSW5mbyIsIm9JdGVtIiwiY3JlYXRlU2VjdGlvbkdyb3VwTmFtZSIsInNlY3Rpb24iLCJiTXVsdGlwbGVTdWJTZWN0aW9ucyIsImJJc09ycGhhbkVsZW1lbnQiLCJhRWxlbWVudHMiLCJvUGFyZW50RWxlbWVudCJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsibWVzc2FnZUhhbmRsaW5nLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZXNvdXJjZUJ1bmRsZSBmcm9tIFwic2FwL2Jhc2UvaTE4bi9SZXNvdXJjZUJ1bmRsZVwiO1xuaW1wb3J0IEJhciBmcm9tIFwic2FwL20vQmFyXCI7XG5pbXBvcnQgQnV0dG9uIGZyb20gXCJzYXAvbS9CdXR0b25cIjtcbmltcG9ydCBEaWFsb2cgZnJvbSBcInNhcC9tL0RpYWxvZ1wiO1xuaW1wb3J0IEZvcm1hdHRlZFRleHQgZnJvbSBcInNhcC9tL0Zvcm1hdHRlZFRleHRcIjtcbmltcG9ydCBNZXNzYWdlQm94IGZyb20gXCJzYXAvbS9NZXNzYWdlQm94XCI7XG5pbXBvcnQgTWVzc2FnZUl0ZW0gZnJvbSBcInNhcC9tL01lc3NhZ2VJdGVtXCI7XG5pbXBvcnQgTWVzc2FnZVRvYXN0IGZyb20gXCJzYXAvbS9NZXNzYWdlVG9hc3RcIjtcbmltcG9ydCBNZXNzYWdlVmlldyBmcm9tIFwic2FwL20vTWVzc2FnZVZpZXdcIjtcbmltcG9ydCBUZXh0IGZyb20gXCJzYXAvbS9UZXh0XCI7XG5pbXBvcnQgdHlwZSBNYW5hZ2VkT2JqZWN0IGZyb20gXCJzYXAvdWkvYmFzZS9NYW5hZ2VkT2JqZWN0XCI7XG5pbXBvcnQgdHlwZSBDb250cm9sIGZyb20gXCJzYXAvdWkvY29yZS9Db250cm9sXCI7XG5pbXBvcnQgQ29yZSBmcm9tIFwic2FwL3VpL2NvcmUvQ29yZVwiO1xuaW1wb3J0IFVJNUVsZW1lbnQgZnJvbSBcInNhcC91aS9jb3JlL0VsZW1lbnRcIjtcbmltcG9ydCBEYXRlRm9ybWF0IGZyb20gXCJzYXAvdWkvY29yZS9mb3JtYXQvRGF0ZUZvcm1hdFwiO1xuaW1wb3J0IEljb25Qb29sIGZyb20gXCJzYXAvdWkvY29yZS9JY29uUG9vbFwiO1xuaW1wb3J0IENvcmVMaWIgZnJvbSBcInNhcC91aS9jb3JlL2xpYnJhcnlcIjtcbmltcG9ydCBNZXNzYWdlIGZyb20gXCJzYXAvdWkvY29yZS9tZXNzYWdlL01lc3NhZ2VcIjtcbmltcG9ydCBUYWJsZSBmcm9tIFwic2FwL3VpL21kYy9UYWJsZVwiO1xuaW1wb3J0IHR5cGUgQmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL0JpbmRpbmdcIjtcbmltcG9ydCBGaWx0ZXIgZnJvbSBcInNhcC91aS9tb2RlbC9GaWx0ZXJcIjtcbmltcG9ydCBGaWx0ZXJPcGVyYXRvciBmcm9tIFwic2FwL3VpL21vZGVsL0ZpbHRlck9wZXJhdG9yXCI7XG5pbXBvcnQgSlNPTk1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvanNvbi9KU09OTW9kZWxcIjtcbmltcG9ydCBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQ29udGV4dFwiO1xuaW1wb3J0IE9EYXRhTGlzdEJpbmRpbmcgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YUxpc3RCaW5kaW5nXCI7XG5pbXBvcnQgU29ydGVyIGZyb20gXCJzYXAvdWkvbW9kZWwvU29ydGVyXCI7XG5pbXBvcnQgQ29sdW1uIGZyb20gXCJzYXAvdWkvdGFibGUvQ29sdW1uXCI7XG5pbXBvcnQgdHlwZSBPYmplY3RQYWdlTGF5b3V0IGZyb20gXCJzYXAvdXhhcC9PYmplY3RQYWdlTGF5b3V0XCI7XG5pbXBvcnQgT2JqZWN0UGFnZVNlY3Rpb24gZnJvbSBcInNhcC91eGFwL09iamVjdFBhZ2VTZWN0aW9uXCI7XG5pbXBvcnQgT2JqZWN0UGFnZVN1YlNlY3Rpb24gZnJvbSBcInNhcC91eGFwL09iamVjdFBhZ2VTdWJTZWN0aW9uXCI7XG5pbXBvcnQgQ29tbW9uVXRpbHMgZnJvbSBcIi4uLy4uL0NvbW1vblV0aWxzXCI7XG5cbmNvbnN0IE1lc3NhZ2VUeXBlID0gQ29yZUxpYi5NZXNzYWdlVHlwZTtcbmxldCBhTWVzc2FnZUxpc3Q6IGFueVtdID0gW107XG5sZXQgYU1lc3NhZ2VEYXRhTGlzdDogYW55W10gPSBbXTtcbmxldCBhUmVzb2x2ZUZ1bmN0aW9uczogYW55W10gPSBbXTtcbmxldCBvRGlhbG9nOiBEaWFsb2c7XG5sZXQgb0JhY2tCdXR0b246IEJ1dHRvbjtcbmxldCBvTWVzc2FnZVZpZXc6IE1lc3NhZ2VWaWV3O1xuXG5leHBvcnQgdHlwZSBNZXNzYWdlV2l0aEhlYWRlciA9IE1lc3NhZ2UgJiB7XG5cdGhlYWRlck5hbWU/OiBzdHJpbmc7XG5cdHRhcmdldD86IHN0cmluZztcblx0YWRkaXRpb25hbFRleHQ/OiBzdHJpbmc7XG59O1xuXG50eXBlIFRhcmdldFRhYmxlSW5mb1R5cGUgPSB7XG5cdG9UYWJsZVJvd0JpbmRpbmdDb250ZXh0czogQ29udGV4dFtdO1xuXHRvVGFibGVSb3dDb250ZXh0OiBDb250ZXh0IHwgdW5kZWZpbmVkO1xuXHRzVGFibGVUYXJnZXRDb2xOYW1lOiBzdHJpbmcgfCBib29sZWFuO1xuXHRzVGFibGVUYXJnZXRDb2xQcm9wZXJ0eTogc3RyaW5nO1xuXHR0YWJsZUhlYWRlcjogc3RyaW5nO1xufTtcblxudHlwZSBDb2xJbmZvQW5kU3VidGl0bGVUeXBlID0ge1xuXHRvVGFyZ2V0VGFibGVJbmZvOiBUYXJnZXRUYWJsZUluZm9UeXBlO1xuXHRzdWJUaXRsZT86IHN0cmluZyB8IG51bGw7XG59O1xuXG50eXBlIENvbHVtbkluZm9UeXBlID0ge1xuXHRzQ29sdW1uVmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcblx0c0NvbHVtbkluZGljYXRvcjogc3RyaW5nO1xufTtcblxudHlwZSBDb2x1bW5XaXRoTGFiZWxUeXBlID0gQ29sdW1uICYge1xuXHRsYWJlbD86IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIG1lc3NhZ2VIYW5kbGluZ1R5cGUgPSB7XG5cdGdldE1lc3NhZ2VzOiAoYkJvdW5kTWVzc2FnZXM/OiBhbnksIGJUcmFuc2l0aW9uT25seT86IGFueSkgPT4gYW55W107XG5cdHNob3dVbmJvdW5kTWVzc2FnZXM6IChcblx0XHRhQ3VzdG9tTWVzc2FnZXM/OiBhbnlbXSxcblx0XHRvQ29udGV4dD86IGFueSxcblx0XHRiU2hvd0JvdW5kVHJhbnNpdGlvbj86IGJvb2xlYW4sXG5cdFx0Y29uY3VycmVudEVkaXRGbGFnPzogYm9vbGVhbixcblx0XHRvQ29udHJvbD86IENvbnRyb2wsXG5cdFx0c0FjdGlvbk5hbWU/OiBzdHJpbmcgfCB1bmRlZmluZWQsXG5cdFx0Yk9ubHlGb3JUZXN0PzogYm9vbGVhbixcblx0XHRvbkJlZm9yZVNob3dNZXNzYWdlPzogKG1lc3NhZ2VzOiBhbnksIHNob3dNZXNzYWdlUGFyYW1ldGVyczogYW55KSA9PiBhbnksXG5cdFx0dmlld1R5cGU/OiBzdHJpbmdcblx0KSA9PiBQcm9taXNlPGFueT47XG5cdHJlbW92ZVVuYm91bmRUcmFuc2l0aW9uTWVzc2FnZXM6ICgpID0+IHZvaWQ7XG5cdG1vZGlmeUVUYWdNZXNzYWdlc09ubHk6IChvTWVzc2FnZU1hbmFnZXI6IGFueSwgb1Jlc291cmNlQnVuZGxlOiBSZXNvdXJjZUJ1bmRsZSwgY29uY3VycmVudEVkaXRGbGFnOiBib29sZWFuIHwgdW5kZWZpbmVkKSA9PiBib29sZWFuO1xuXHRyZW1vdmVCb3VuZFRyYW5zaXRpb25NZXNzYWdlczogKHNQYXRoVG9CZVJlbW92ZWQ/OiBzdHJpbmcpID0+IHZvaWQ7XG5cdGdldFJldHJ5QWZ0ZXJNZXNzYWdlOiAob01lc3NhZ2U6IGFueSwgYk1lc3NhZ2VEaWFsb2c/OiBhbnkpID0+IGFueTtcblx0cHJlcGFyZU1lc3NhZ2VWaWV3Rm9yRGlhbG9nOiAob01lc3NhZ2VEaWFsb2dNb2RlbDogSlNPTk1vZGVsLCBiU3RyaWN0SGFuZGxpbmdGbG93OiBib29sZWFuLCBpc011bHRpNDEyPzogYm9vbGVhbikgPT4gYW55O1xuXHRzZXRNZXNzYWdlU3VidGl0bGU6IChvVGFibGU6IFRhYmxlLCBhQ29udGV4dHM6IENvbnRleHRbXSwgbWVzc2FnZTogTWVzc2FnZVdpdGhIZWFkZXIpID0+IHZvaWQ7XG5cdGdldFZpc2libGVTZWN0aW9uc0Zyb21PYmplY3RQYWdlTGF5b3V0OiAob09iamVjdFBhZ2VMYXlvdXQ6IENvbnRyb2wpID0+IGFueTtcblx0Z2V0Q29udHJvbEZyb21NZXNzYWdlUmVsYXRpbmdUb1N1YlNlY3Rpb246IChzdWJTZWN0aW9uOiBPYmplY3RQYWdlU3ViU2VjdGlvbiwgb01lc3NhZ2VPYmplY3Q6IE1lc3NhZ2VXaXRoSGVhZGVyKSA9PiBVSTVFbGVtZW50W107XG5cdGZuRmlsdGVyVXBvbklkczogKGFDb250cm9sSWRzOiBzdHJpbmdbXSwgb0l0ZW06IFVJNUVsZW1lbnQpID0+IGJvb2xlYW47XG5cdGdldFRhYmxlQW5kVGFyZ2V0SW5mbzogKFxuXHRcdG9UYWJsZTogVGFibGUsXG5cdFx0b01lc3NhZ2VPYmplY3Q6IE1lc3NhZ2VXaXRoSGVhZGVyLFxuXHRcdG9FbGVtZW50OiBVSTVFbGVtZW50IHwgdW5kZWZpbmVkLFxuXHRcdG9Sb3dCaW5kaW5nOiBCaW5kaW5nXG5cdCkgPT4gVGFyZ2V0VGFibGVJbmZvVHlwZTtcblx0Y3JlYXRlU2VjdGlvbkdyb3VwTmFtZTogKFxuXHRcdHNlY3Rpb246IE9iamVjdFBhZ2VTZWN0aW9uLFxuXHRcdHN1YlNlY3Rpb246IE9iamVjdFBhZ2VTdWJTZWN0aW9uLFxuXHRcdGJNdWx0aXBsZVN1YlNlY3Rpb25zOiBib29sZWFuLFxuXHRcdG9UYXJnZXRUYWJsZUluZm86IFRhcmdldFRhYmxlSW5mb1R5cGUsXG5cdFx0b1Jlc291cmNlQnVuZGxlOiBSZXNvdXJjZUJ1bmRsZVxuXHQpID0+IHN0cmluZztcblx0YklzT3JwaGFuRWxlbWVudDogKG9FbGVtZW50OiBVSTVFbGVtZW50LCBhRWxlbWVudHM6IFVJNUVsZW1lbnRbXSkgPT4gYm9vbGVhbjtcblx0Z2V0TGFzdEFjdGlvblRleHRBbmRBY3Rpb25OYW1lOiAoc0FjdGlvbk5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCkgPT4gc3RyaW5nO1xuXHRnZXRUYWJsZUNvbHVtbkRhdGFBbmRTZXRTdWJ0aWxlOiAoXG5cdFx0YU1lc3NhZ2U6IE1lc3NhZ2VXaXRoSGVhZGVyLFxuXHRcdG9UYWJsZTogVGFibGUsXG5cdFx0b0VsZW1lbnQ6IFVJNUVsZW1lbnQgfCB1bmRlZmluZWQsXG5cdFx0b1Jvd0JpbmRpbmc6IEJpbmRpbmcsXG5cdFx0c0FjdGlvbk5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCxcblx0XHRzZXRTZWN0aW9uTmFtZUluR3JvdXA6IEJvb2xlYW4sXG5cdFx0Zm5DYWxsYmFja1NldEdyb3VwTmFtZTogYW55XG5cdCkgPT4gQ29sSW5mb0FuZFN1YnRpdGxlVHlwZTtcblx0Z2V0VGFibGVDb2xJbmZvOiAob1RhYmxlOiBDb250cm9sLCBzVGFibGVUYXJnZXRDb2xQcm9wZXJ0eTogc3RyaW5nKSA9PiBhbnk7XG5cdGdldFRhYmxlQ29sUHJvcGVydHk6IChvVGFibGU6IENvbnRyb2wsIG9NZXNzYWdlT2JqZWN0OiBNZXNzYWdlV2l0aEhlYWRlciwgb0NvbnRleHRQYXRoPzogYW55KSA9PiBhbnk7XG5cdGdldE1lc3NhZ2VTdWJ0aXRsZTogKFxuXHRcdG1lc3NhZ2U6IE1lc3NhZ2VXaXRoSGVhZGVyLFxuXHRcdG9UYWJsZVJvd0JpbmRpbmdDb250ZXh0czogQ29udGV4dFtdLFxuXHRcdG9UYWJsZVJvd0NvbnRleHQ6IENvbnRleHQgfCB1bmRlZmluZWQsXG5cdFx0c1RhYmxlVGFyZ2V0Q29sTmFtZTogc3RyaW5nIHwgYm9vbGVhbixcblx0XHRvUmVzb3VyY2VCdW5kbGU6IFJlc291cmNlQnVuZGxlLFxuXHRcdG9UYWJsZTogVGFibGUsXG5cdFx0YklzQ3JlYXRpb25Sb3c6IGJvb2xlYW4gfCB1bmRlZmluZWQsXG5cdFx0b1RhcmdldGVkQ29udHJvbD86IENvbnRyb2xcblx0KSA9PiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkO1xuXHRkZXRlcm1pbmVDb2x1bW5JbmZvOiAob0NvbEZyb21UYWJsZVNldHRpbmdzOiBhbnksIG9SZXNvdXJjZUJ1bmRsZTogUmVzb3VyY2VCdW5kbGUpID0+IENvbHVtbkluZm9UeXBlO1xuXHRmZXRjaENvbHVtbkluZm86IChvTWVzc2FnZTogTWVzc2FnZVdpdGhIZWFkZXIsIG9UYWJsZTogVGFibGUpID0+IENvbHVtbjtcblx0Z2V0VGFibGVGaXJzdENvbEJpbmRpbmdDb250ZXh0Rm9yVGV4dEFubm90YXRpb246IChcblx0XHRvVGFibGU6IFRhYmxlLFxuXHRcdG9UYWJsZVJvd0NvbnRleHQ6IENvbnRleHQgfCB1bmRlZmluZWQsXG5cdFx0c1RhYmxlRmlyc3RDb2xQcm9wZXJ0eTogc3RyaW5nXG5cdCkgPT4gQ29udGV4dCB8IG51bGwgfCB1bmRlZmluZWQ7XG5cdGdldE1lc3NhZ2VSYW5rOiAob2JqOiBNZXNzYWdlV2l0aEhlYWRlcikgPT4gbnVtYmVyO1xuXHRmbkNhbGxiYWNrU2V0R3JvdXBOYW1lOiAoYU1lc3NhZ2U6IE1lc3NhZ2VXaXRoSGVhZGVyLCBzQWN0aW9uTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkLCBiSXNHZW5lcmFsR3JvdXBOYW1lPzogQm9vbGVhbikgPT4gYW55O1xuXHRnZXRUYWJsZUZpcnN0Q29sVmFsdWU6IChcblx0XHRzVGFibGVGaXJzdENvbFByb3BlcnR5OiBzdHJpbmcsXG5cdFx0b1RhYmxlUm93Q29udGV4dDogQ29udGV4dCxcblx0XHRzVGV4dEFubm90YXRpb25QYXRoOiBzdHJpbmcsXG5cdFx0c1RleHRBcnJhbmdlbWVudDogc3RyaW5nXG5cdCkgPT4gc3RyaW5nO1xuXHRzZXRHcm91cE5hbWVPUERpc3BsYXlNb2RlOiAoYU1vZGVsRGF0YTogTWVzc2FnZVdpdGhIZWFkZXIsIHNBY3Rpb25OYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQsIGNvbnRyb2w6IGFueSkgPT4gdm9pZDtcblx0dXBkYXRlTWVzc2FnZU9iamVjdEdyb3VwTmFtZTogKFxuXHRcdGFNb2RlbERhdGFBcnJheTogTWVzc2FnZVdpdGhIZWFkZXJbXSxcblx0XHRjb250cm9sOiBDb250cm9sIHwgdW5kZWZpbmVkLFxuXHRcdHNBY3Rpb25OYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQsXG5cdFx0dmlld1R5cGU6IHN0cmluZyB8IHVuZGVmaW5lZFxuXHQpID0+IHZvaWQ7XG5cdHNldEdyb3VwTmFtZUxSVGFibGU6IChjb250cm9sOiBDb250cm9sIHwgdW5kZWZpbmVkLCBhTW9kZWxEYXRhOiBNZXNzYWdlV2l0aEhlYWRlciwgc0FjdGlvbk5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCkgPT4gdm9pZDtcblx0aXNDb250cm9sSW5UYWJsZTogKG9UYWJsZTogVGFibGUsIHNDb250cm9sSWQ6IHN0cmluZykgPT4gVUk1RWxlbWVudFtdIHwgYm9vbGVhbjtcblx0aXNDb250cm9sUGFydE9mQ3JlYXRpb25Sb3c6IChvQ29udHJvbDogVUk1RWxlbWVudCB8IHVuZGVmaW5lZCkgPT4gYm9vbGVhbjtcbn07XG5cbmZ1bmN0aW9uIGZuRm9ybWF0VGVjaG5pY2FsRGV0YWlscygpIHtcblx0bGV0IHNQcmV2aW91c0dyb3VwTmFtZTogc3RyaW5nO1xuXG5cdC8vIEluc2VydCB0ZWNobmljYWwgZGV0YWlsIGlmIGl0IGV4aXN0c1xuXHRmdW5jdGlvbiBpbnNlcnREZXRhaWwob1Byb3BlcnR5OiBhbnkpIHtcblx0XHRyZXR1cm4gb1Byb3BlcnR5LnByb3BlcnR5XG5cdFx0XHQ/IFwiKCAke1wiICtcblx0XHRcdFx0XHRvUHJvcGVydHkucHJvcGVydHkgK1xuXHRcdFx0XHRcdCd9ID8gKFwiPHA+JyArXG5cdFx0XHRcdFx0b1Byb3BlcnR5LnByb3BlcnR5LnN1YnN0cihNYXRoLm1heChvUHJvcGVydHkucHJvcGVydHkubGFzdEluZGV4T2YoXCIvXCIpLCBvUHJvcGVydHkucHJvcGVydHkubGFzdEluZGV4T2YoXCIuXCIpKSArIDEpICtcblx0XHRcdFx0XHQnIDogXCIgKyAnICtcblx0XHRcdFx0XHRcIiR7XCIgK1xuXHRcdFx0XHRcdG9Qcm9wZXJ0eS5wcm9wZXJ0eSArXG5cdFx0XHRcdFx0J30gKyBcIjwvcD5cIikgOiBcIlwiICknXG5cdFx0XHQ6IFwiXCI7XG5cdH1cblx0Ly8gSW5zZXJ0IGdyb3VwbmFtZSBpZiBpdCBleGlzdHNcblx0ZnVuY3Rpb24gaW5zZXJ0R3JvdXBOYW1lKG9Qcm9wZXJ0eTogYW55KSB7XG5cdFx0bGV0IHNIVE1MID0gXCJcIjtcblx0XHRpZiAob1Byb3BlcnR5Lmdyb3VwTmFtZSAmJiBvUHJvcGVydHkucHJvcGVydHkgJiYgb1Byb3BlcnR5Lmdyb3VwTmFtZSAhPT0gc1ByZXZpb3VzR3JvdXBOYW1lKSB7XG5cdFx0XHRzSFRNTCArPSBcIiggJHtcIiArIG9Qcm9wZXJ0eS5wcm9wZXJ0eSArICd9ID8gXCI8YnI+PGgzPicgKyBvUHJvcGVydHkuZ3JvdXBOYW1lICsgJzwvaDM+XCIgOiBcIlwiICkgKyAnO1xuXHRcdFx0c1ByZXZpb3VzR3JvdXBOYW1lID0gb1Byb3BlcnR5Lmdyb3VwTmFtZTtcblx0XHR9XG5cdFx0cmV0dXJuIHNIVE1MO1xuXHR9XG5cblx0Ly8gTGlzdCBvZiB0ZWNobmljYWwgZGV0YWlscyB0byBiZSBzaG93blxuXHRmdW5jdGlvbiBnZXRQYXRocygpIHtcblx0XHRjb25zdCBzVEQgPSBcInRlY2huaWNhbERldGFpbHNcIjsgLy8gbmFtZSBvZiBwcm9wZXJ0eSBpbiBtZXNzYWdlIG1vZGVsIGRhdGEgZm9yIHRlY2huaWNhbCBkZXRhaWxzXG5cdFx0cmV0dXJuIFtcblx0XHRcdHsgZ3JvdXBOYW1lOiBcIlwiLCBwcm9wZXJ0eTogYCR7c1REfS9zdGF0dXNgIH0sXG5cdFx0XHR7IGdyb3VwTmFtZTogXCJcIiwgcHJvcGVydHk6IGAke3NURH0vc3RhdHVzVGV4dGAgfSxcblx0XHRcdHsgZ3JvdXBOYW1lOiBcIkFwcGxpY2F0aW9uXCIsIHByb3BlcnR5OiBgJHtzVER9L2Vycm9yL0BTQVBfX2NvbW1vbi5BcHBsaWNhdGlvbi9Db21wb25lbnRJZGAgfSxcblx0XHRcdHsgZ3JvdXBOYW1lOiBcIkFwcGxpY2F0aW9uXCIsIHByb3BlcnR5OiBgJHtzVER9L2Vycm9yL0BTQVBfX2NvbW1vbi5BcHBsaWNhdGlvbi9TZXJ2aWNlSWRgIH0sXG5cdFx0XHR7IGdyb3VwTmFtZTogXCJBcHBsaWNhdGlvblwiLCBwcm9wZXJ0eTogYCR7c1REfS9lcnJvci9AU0FQX19jb21tb24uQXBwbGljYXRpb24vU2VydmljZVJlcG9zaXRvcnlgIH0sXG5cdFx0XHR7IGdyb3VwTmFtZTogXCJBcHBsaWNhdGlvblwiLCBwcm9wZXJ0eTogYCR7c1REfS9lcnJvci9AU0FQX19jb21tb24uQXBwbGljYXRpb24vU2VydmljZVZlcnNpb25gIH0sXG5cdFx0XHR7IGdyb3VwTmFtZTogXCJFcnJvclJlc29sdXRpb25cIiwgcHJvcGVydHk6IGAke3NURH0vZXJyb3IvQFNBUF9fY29tbW9uLkVycm9yUmVzb2x1dGlvbi9BbmFseXNpc2AgfSxcblx0XHRcdHsgZ3JvdXBOYW1lOiBcIkVycm9yUmVzb2x1dGlvblwiLCBwcm9wZXJ0eTogYCR7c1REfS9lcnJvci9AU0FQX19jb21tb24uRXJyb3JSZXNvbHV0aW9uL05vdGVgIH0sXG5cdFx0XHR7IGdyb3VwTmFtZTogXCJFcnJvclJlc29sdXRpb25cIiwgcHJvcGVydHk6IGAke3NURH0vZXJyb3IvQFNBUF9fY29tbW9uLkVycm9yUmVzb2x1dGlvbi9EZXRhaWxlZE5vdGVgIH0sXG5cdFx0XHR7IGdyb3VwTmFtZTogXCJFcnJvclJlc29sdXRpb25cIiwgcHJvcGVydHk6IGAke3NURH0vZXJyb3IvQFNBUF9fY29tbW9uLkV4Y2VwdGlvbkNhdGVnb3J5YCB9LFxuXHRcdFx0eyBncm91cE5hbWU6IFwiRXJyb3JSZXNvbHV0aW9uXCIsIHByb3BlcnR5OiBgJHtzVER9L2Vycm9yL0BTQVBfX2NvbW1vbi5UaW1lU3RhbXBgIH0sXG5cdFx0XHR7IGdyb3VwTmFtZTogXCJFcnJvclJlc29sdXRpb25cIiwgcHJvcGVydHk6IGAke3NURH0vZXJyb3IvQFNBUF9fY29tbW9uLlRyYW5zYWN0aW9uSWRgIH0sXG5cdFx0XHR7IGdyb3VwTmFtZTogXCJNZXNzYWdlc1wiLCBwcm9wZXJ0eTogYCR7c1REfS9lcnJvci9jb2RlYCB9LFxuXHRcdFx0eyBncm91cE5hbWU6IFwiTWVzc2FnZXNcIiwgcHJvcGVydHk6IGAke3NURH0vZXJyb3IvbWVzc2FnZWAgfVxuXHRcdF07XG5cdH1cblxuXHRsZXQgc0hUTUwgPSBcIk9iamVjdC5rZXlzKFwiICsgXCIke3RlY2huaWNhbERldGFpbHN9XCIgKyAnKS5sZW5ndGggPiAwID8gXCI8aDI+VGVjaG5pY2FsIERldGFpbHM8L2gyPlwiIDogXCJcIiAnO1xuXHRnZXRQYXRocygpLmZvckVhY2goZnVuY3Rpb24gKG9Qcm9wZXJ0eTogeyBncm91cE5hbWU6IHN0cmluZzsgcHJvcGVydHk6IHN0cmluZyB9KSB7XG5cdFx0c0hUTUwgPSBgJHtzSFRNTCArIGluc2VydEdyb3VwTmFtZShvUHJvcGVydHkpfSR7aW5zZXJ0RGV0YWlsKG9Qcm9wZXJ0eSl9ICsgYDtcblx0fSk7XG5cdHJldHVybiBzSFRNTDtcbn1cbmZ1bmN0aW9uIGZuRm9ybWF0RGVzY3JpcHRpb24oKSB7XG5cdHJldHVybiBcIigke1wiICsgJ2Rlc2NyaXB0aW9ufSA/IChcIjxoMj5EZXNjcmlwdGlvbjwvaDI+XCIgKyAkeycgKyAnZGVzY3JpcHRpb259KSA6IFwiXCIpJztcbn1cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgaGlnaGVzdCBwcmlvcml0eSBtZXNzYWdlIHR5cGUoRXJyb3IvV2FybmluZy9TdWNjZXNzL0luZm9ybWF0aW9uKSBmcm9tIHRoZSBhdmFpbGFibGUgbWVzc2FnZXMuXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAbmFtZSBzYXAuZmUuY29yZS5hY3Rpb25zLm1lc3NhZ2VIYW5kbGluZy5mbkdldEhpZ2hlc3RNZXNzYWdlUHJpb3JpdHlcbiAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5hY3Rpb25zLm1lc3NhZ2VIYW5kbGluZ1xuICogQHBhcmFtIFthTWVzc2FnZXNdIE1lc3NhZ2VzIGxpc3RcbiAqIEByZXR1cm5zIEhpZ2hlc3QgcHJpb3JpdHkgbWVzc2FnZSBmcm9tIHRoZSBhdmFpbGFibGUgbWVzc2FnZXNcbiAqIEBwcml2YXRlXG4gKiBAdWk1LXJlc3RyaWN0ZWRcbiAqL1xuZnVuY3Rpb24gZm5HZXRIaWdoZXN0TWVzc2FnZVByaW9yaXR5KGFNZXNzYWdlczogYW55W10pIHtcblx0bGV0IHNNZXNzYWdlUHJpb3JpdHkgPSBNZXNzYWdlVHlwZS5Ob25lO1xuXHRjb25zdCBpTGVuZ3RoID0gYU1lc3NhZ2VzLmxlbmd0aDtcblx0Y29uc3Qgb01lc3NhZ2VDb3VudDogYW55ID0geyBFcnJvcjogMCwgV2FybmluZzogMCwgU3VjY2VzczogMCwgSW5mb3JtYXRpb246IDAgfTtcblxuXHRmb3IgKGxldCBpID0gMDsgaSA8IGlMZW5ndGg7IGkrKykge1xuXHRcdCsrb01lc3NhZ2VDb3VudFthTWVzc2FnZXNbaV0uZ2V0VHlwZSgpXTtcblx0fVxuXHRpZiAob01lc3NhZ2VDb3VudFtNZXNzYWdlVHlwZS5FcnJvcl0gPiAwKSB7XG5cdFx0c01lc3NhZ2VQcmlvcml0eSA9IE1lc3NhZ2VUeXBlLkVycm9yO1xuXHR9IGVsc2UgaWYgKG9NZXNzYWdlQ291bnRbTWVzc2FnZVR5cGUuV2FybmluZ10gPiAwKSB7XG5cdFx0c01lc3NhZ2VQcmlvcml0eSA9IE1lc3NhZ2VUeXBlLldhcm5pbmc7XG5cdH0gZWxzZSBpZiAob01lc3NhZ2VDb3VudFtNZXNzYWdlVHlwZS5TdWNjZXNzXSA+IDApIHtcblx0XHRzTWVzc2FnZVByaW9yaXR5ID0gTWVzc2FnZVR5cGUuU3VjY2Vzcztcblx0fSBlbHNlIGlmIChvTWVzc2FnZUNvdW50W01lc3NhZ2VUeXBlLkluZm9ybWF0aW9uXSA+IDApIHtcblx0XHRzTWVzc2FnZVByaW9yaXR5ID0gTWVzc2FnZVR5cGUuSW5mb3JtYXRpb247XG5cdH1cblx0cmV0dXJuIHNNZXNzYWdlUHJpb3JpdHk7XG59XG4vLyBmdW5jdGlvbiB3aGljaCBtb2RpZnkgZS1UYWcgbWVzc2FnZXMgb25seS5cbi8vIHJldHVybnMgOiB0cnVlLCBpZiBhbnkgZS1UYWcgbWVzc2FnZSBpcyBtb2RpZmllZCwgb3RoZXJ3aXNlIGZhbHNlLlxuZnVuY3Rpb24gZm5Nb2RpZnlFVGFnTWVzc2FnZXNPbmx5KG9NZXNzYWdlTWFuYWdlcjogYW55LCBvUmVzb3VyY2VCdW5kbGU6IFJlc291cmNlQnVuZGxlLCBjb25jdXJyZW50RWRpdEZsYWc6IGJvb2xlYW4gfCB1bmRlZmluZWQpIHtcblx0Y29uc3QgYU1lc3NhZ2VzID0gb01lc3NhZ2VNYW5hZ2VyLmdldE1lc3NhZ2VNb2RlbCgpLmdldE9iamVjdChcIi9cIik7XG5cdGxldCBiTWVzc2FnZXNNb2RpZmllZCA9IGZhbHNlO1xuXHRsZXQgc0V0YWdNZXNzYWdlID0gXCJcIjtcblx0YU1lc3NhZ2VzLmZvckVhY2goZnVuY3Rpb24gKG9NZXNzYWdlOiBhbnksIGk6IGFueSkge1xuXHRcdGNvbnN0IG9UZWNobmljYWxEZXRhaWxzID0gb01lc3NhZ2UuZ2V0VGVjaG5pY2FsRGV0YWlscyAmJiBvTWVzc2FnZS5nZXRUZWNobmljYWxEZXRhaWxzKCk7XG5cdFx0aWYgKG9UZWNobmljYWxEZXRhaWxzICYmIG9UZWNobmljYWxEZXRhaWxzLmh0dHBTdGF0dXMgPT09IDQxMikge1xuXHRcdFx0aWYgKG9UZWNobmljYWxEZXRhaWxzLmlzQ29uY3VycmVudE1vZGlmaWNhdGlvbiAmJiBjb25jdXJyZW50RWRpdEZsYWcpIHtcblx0XHRcdFx0c0V0YWdNZXNzYWdlID1cblx0XHRcdFx0XHRzRXRhZ01lc3NhZ2UgfHwgb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0FQUF9DT01QT05FTlRfU0FQRkVfRVRBR19URUNITklDQUxfSVNTVUVTX0NPTkNVUlJFTlRfTU9ESUZJQ0FUSU9OXCIpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0c0V0YWdNZXNzYWdlID0gc0V0YWdNZXNzYWdlIHx8IG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19BUFBfQ09NUE9ORU5UX1NBUEZFX0VUQUdfVEVDSE5JQ0FMX0lTU1VFU1wiKTtcblx0XHRcdH1cblx0XHRcdG9NZXNzYWdlTWFuYWdlci5yZW1vdmVNZXNzYWdlcyhhTWVzc2FnZXNbaV0pO1xuXHRcdFx0b01lc3NhZ2Uuc2V0TWVzc2FnZShzRXRhZ01lc3NhZ2UpO1xuXHRcdFx0b01lc3NhZ2UudGFyZ2V0ID0gXCJcIjtcblx0XHRcdG9NZXNzYWdlTWFuYWdlci5hZGRNZXNzYWdlcyhvTWVzc2FnZSk7XG5cdFx0XHRiTWVzc2FnZXNNb2RpZmllZCA9IHRydWU7XG5cdFx0fVxuXHR9KTtcblx0cmV0dXJuIGJNZXNzYWdlc01vZGlmaWVkO1xufVxuLy8gRGlhbG9nIGNsb3NlIEhhbmRsaW5nXG5mdW5jdGlvbiBkaWFsb2dDbG9zZUhhbmRsZXIoKSB7XG5cdG9EaWFsb2cuY2xvc2UoKTtcblx0b0JhY2tCdXR0b24uc2V0VmlzaWJsZShmYWxzZSk7XG5cdGFNZXNzYWdlTGlzdCA9IFtdO1xuXHRjb25zdCBvTWVzc2FnZURpYWxvZ01vZGVsOiBhbnkgPSBvTWVzc2FnZVZpZXcuZ2V0TW9kZWwoKTtcblx0aWYgKG9NZXNzYWdlRGlhbG9nTW9kZWwpIHtcblx0XHRvTWVzc2FnZURpYWxvZ01vZGVsLnNldERhdGEoe30pO1xuXHR9XG5cdHJlbW92ZVVuYm91bmRUcmFuc2l0aW9uTWVzc2FnZXMoKTtcbn1cbmZ1bmN0aW9uIGdldFJldHJ5QWZ0ZXJNZXNzYWdlKG9NZXNzYWdlOiBhbnksIGJNZXNzYWdlRGlhbG9nPzogYW55KSB7XG5cdGNvbnN0IGROb3cgPSBuZXcgRGF0ZSgpO1xuXHRjb25zdCBvVGVjaG5pY2FsRGV0YWlscyA9IG9NZXNzYWdlLmdldFRlY2huaWNhbERldGFpbHMoKTtcblx0Y29uc3Qgb1Jlc291cmNlQnVuZGxlID0gQ29yZS5nZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUoXCJzYXAuZmUuY29yZVwiKTtcblx0bGV0IHNSZXRyeUFmdGVyTWVzc2FnZTtcblx0aWYgKG9UZWNobmljYWxEZXRhaWxzICYmIG9UZWNobmljYWxEZXRhaWxzLmh0dHBTdGF0dXMgPT09IDUwMyAmJiBvVGVjaG5pY2FsRGV0YWlscy5yZXRyeUFmdGVyKSB7XG5cdFx0Y29uc3QgZFJldHJ5QWZ0ZXIgPSBvVGVjaG5pY2FsRGV0YWlscy5yZXRyeUFmdGVyO1xuXHRcdGxldCBvRGF0ZUZvcm1hdDtcblx0XHRpZiAoZE5vdy5nZXRGdWxsWWVhcigpICE9PSBkUmV0cnlBZnRlci5nZXRGdWxsWWVhcigpKSB7XG5cdFx0XHQvL2RpZmZlcmVudCB5ZWFyc1xuXHRcdFx0b0RhdGVGb3JtYXQgPSBEYXRlRm9ybWF0LmdldERhdGVUaW1lSW5zdGFuY2Uoe1xuXHRcdFx0XHRwYXR0ZXJuOiBcIk1NTU0gZGQsIHl5eXkgJ2F0JyBoaDptbSBhXCJcblx0XHRcdH0pO1xuXHRcdFx0c1JldHJ5QWZ0ZXJNZXNzYWdlID0gb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX01FU1NBR0VfSEFORExJTkdfU0FQRkVfNTAzX0VSUk9SXCIsIFtvRGF0ZUZvcm1hdC5mb3JtYXQoZFJldHJ5QWZ0ZXIpXSk7XG5cdFx0fSBlbHNlIGlmIChkTm93LmdldEZ1bGxZZWFyKCkgPT0gZFJldHJ5QWZ0ZXIuZ2V0RnVsbFllYXIoKSkge1xuXHRcdFx0Ly9zYW1lIHllYXJcblx0XHRcdGlmIChiTWVzc2FnZURpYWxvZykge1xuXHRcdFx0XHQvL2xlc3MgdGhhbiAyIG1pblxuXHRcdFx0XHRzUmV0cnlBZnRlck1lc3NhZ2UgPSBgJHtvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfTUVTU0FHRV9IQU5ETElOR19TQVBGRV81MDNfVElUTEVcIil9ICR7b1Jlc291cmNlQnVuZGxlLmdldFRleHQoXG5cdFx0XHRcdFx0XCJDX01FU1NBR0VfSEFORExJTkdfU0FQRkVfNTAzX0RFU0NcIlxuXHRcdFx0XHQpfWA7XG5cdFx0XHR9IGVsc2UgaWYgKGROb3cuZ2V0TW9udGgoKSAhPT0gZFJldHJ5QWZ0ZXIuZ2V0TW9udGgoKSB8fCBkTm93LmdldERhdGUoKSAhPT0gZFJldHJ5QWZ0ZXIuZ2V0RGF0ZSgpKSB7XG5cdFx0XHRcdG9EYXRlRm9ybWF0ID0gRGF0ZUZvcm1hdC5nZXREYXRlVGltZUluc3RhbmNlKHtcblx0XHRcdFx0XHRwYXR0ZXJuOiBcIk1NTU0gZGQgJ2F0JyBoaDptbSBhXCJcblx0XHRcdFx0fSk7IC8vZGlmZmVyZW50IG1vbnRocyBvciBkaWZmZXJlbnQgZGF5cyBvZiBzYW1lIG1vbnRoXG5cdFx0XHRcdHNSZXRyeUFmdGVyTWVzc2FnZSA9IG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19NRVNTQUdFX0hBTkRMSU5HX1NBUEZFXzUwM19FUlJPUlwiLCBbb0RhdGVGb3JtYXQuZm9ybWF0KGRSZXRyeUFmdGVyKV0pO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ly9zYW1lIGRheVxuXHRcdFx0XHRvRGF0ZUZvcm1hdCA9IERhdGVGb3JtYXQuZ2V0RGF0ZVRpbWVJbnN0YW5jZSh7XG5cdFx0XHRcdFx0cGF0dGVybjogXCJoaDptbSBhXCJcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHNSZXRyeUFmdGVyTWVzc2FnZSA9IG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19NRVNTQUdFX0hBTkRMSU5HX1NBUEZFXzUwM19FUlJPUl9EQVlcIiwgW29EYXRlRm9ybWF0LmZvcm1hdChkUmV0cnlBZnRlcildKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRpZiAob1RlY2huaWNhbERldGFpbHMgJiYgb1RlY2huaWNhbERldGFpbHMuaHR0cFN0YXR1cyA9PT0gNTAzICYmICFvVGVjaG5pY2FsRGV0YWlscy5yZXRyeUFmdGVyKSB7XG5cdFx0c1JldHJ5QWZ0ZXJNZXNzYWdlID0gb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX01FU1NBR0VfSEFORExJTkdfU0FQRkVfNTAzX0VSUk9SX05PX1JFVFJZX0FGVEVSXCIpO1xuXHR9XG5cdHJldHVybiBzUmV0cnlBZnRlck1lc3NhZ2U7XG59XG5cbmZ1bmN0aW9uIHByZXBhcmVNZXNzYWdlVmlld0ZvckRpYWxvZyhvTWVzc2FnZURpYWxvZ01vZGVsOiBKU09OTW9kZWwsIGJTdHJpY3RIYW5kbGluZ0Zsb3c6IGJvb2xlYW4sIG11bHRpNDEyPzogYm9vbGVhbikge1xuXHRsZXQgb01lc3NhZ2VUZW1wbGF0ZTogTWVzc2FnZUl0ZW07XG5cdGlmICghYlN0cmljdEhhbmRsaW5nRmxvdykge1xuXHRcdG9NZXNzYWdlVGVtcGxhdGUgPSBuZXcgTWVzc2FnZUl0ZW0odW5kZWZpbmVkLCB7XG5cdFx0XHRjb3VudGVyOiB7IHBhdGg6IFwiY291bnRlclwiIH0sXG5cdFx0XHR0aXRsZTogXCJ7bWVzc2FnZX1cIixcblx0XHRcdHN1YnRpdGxlOiBcInthZGRpdGlvbmFsVGV4dH1cIixcblx0XHRcdGxvbmd0ZXh0VXJsOiBcIntkZXNjcmlwdGlvblVybH1cIixcblx0XHRcdHR5cGU6IHsgcGF0aDogXCJ0eXBlXCIgfSxcblx0XHRcdGdyb3VwTmFtZTogXCJ7aGVhZGVyTmFtZX1cIixcblx0XHRcdGRlc2NyaXB0aW9uOlxuXHRcdFx0XHRcIns9ICR7XCIgK1xuXHRcdFx0XHRcImRlc2NyaXB0aW9ufSB8fCAke3RlY2huaWNhbERldGFpbHN9ID8gXCIgK1xuXHRcdFx0XHQnXCI8aHRtbD48Ym9keT5cIiArICcgK1xuXHRcdFx0XHRmbkZvcm1hdERlc2NyaXB0aW9uKCkgK1xuXHRcdFx0XHRcIiArIFwiICtcblx0XHRcdFx0Zm5Gb3JtYXRUZWNobmljYWxEZXRhaWxzKCkgK1xuXHRcdFx0XHQnXCI8L2JvZHk+PC9odG1sPlwiJyArXG5cdFx0XHRcdCcgOiBcIlwiIH0nLFxuXHRcdFx0bWFya3VwRGVzY3JpcHRpb246IHRydWVcblx0XHR9KTtcblx0fSBlbHNlIGlmIChtdWx0aTQxMikge1xuXHRcdG9NZXNzYWdlVGVtcGxhdGUgPSBuZXcgTWVzc2FnZUl0ZW0odW5kZWZpbmVkLCB7XG5cdFx0XHRjb3VudGVyOiB7IHBhdGg6IFwiY291bnRlclwiIH0sXG5cdFx0XHR0aXRsZTogXCJ7bWVzc2FnZX1cIixcblx0XHRcdHN1YnRpdGxlOiBcInthZGRpdGlvbmFsVGV4dH1cIixcblx0XHRcdGxvbmd0ZXh0VXJsOiBcIntkZXNjcmlwdGlvblVybH1cIixcblx0XHRcdHR5cGU6IHsgcGF0aDogXCJ0eXBlXCIgfSxcblx0XHRcdGRlc2NyaXB0aW9uOiBcIntkZXNjcmlwdGlvbn1cIixcblx0XHRcdG1hcmt1cERlc2NyaXB0aW9uOiB0cnVlXG5cdFx0fSk7XG5cdH0gZWxzZSB7XG5cdFx0b01lc3NhZ2VUZW1wbGF0ZSA9IG5ldyBNZXNzYWdlSXRlbSh7XG5cdFx0XHR0aXRsZTogXCJ7bWVzc2FnZX1cIixcblx0XHRcdHR5cGU6IHsgcGF0aDogXCJ0eXBlXCIgfSxcblx0XHRcdGxvbmd0ZXh0VXJsOiBcIntkZXNjcmlwdGlvblVybH1cIlxuXHRcdH0pO1xuXHR9XG5cdG9NZXNzYWdlVmlldyA9IG5ldyBNZXNzYWdlVmlldyh7XG5cdFx0c2hvd0RldGFpbHNQYWdlSGVhZGVyOiBmYWxzZSxcblx0XHRpdGVtU2VsZWN0OiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRvQmFja0J1dHRvbi5zZXRWaXNpYmxlKHRydWUpO1xuXHRcdH0sXG5cdFx0aXRlbXM6IHtcblx0XHRcdHBhdGg6IFwiL1wiLFxuXHRcdFx0dGVtcGxhdGU6IG9NZXNzYWdlVGVtcGxhdGVcblx0XHR9XG5cdH0pO1xuXHRvTWVzc2FnZVZpZXcuc2V0R3JvdXBJdGVtcyh0cnVlKTtcblx0b0JhY2tCdXR0b24gPVxuXHRcdG9CYWNrQnV0dG9uIHx8XG5cdFx0bmV3IEJ1dHRvbih7XG5cdFx0XHRpY29uOiBJY29uUG9vbC5nZXRJY29uVVJJKFwibmF2LWJhY2tcIiksXG5cdFx0XHR2aXNpYmxlOiBmYWxzZSxcblx0XHRcdHByZXNzOiBmdW5jdGlvbiAodGhpczogQnV0dG9uKSB7XG5cdFx0XHRcdG9NZXNzYWdlVmlldy5uYXZpZ2F0ZUJhY2soKTtcblx0XHRcdFx0dGhpcy5zZXRWaXNpYmxlKGZhbHNlKTtcblx0XHRcdH1cblx0XHR9KTtcblx0Ly8gVXBkYXRlIHByb3BlciBFVGFnIE1pc21hdGNoIGVycm9yXG5cdG9NZXNzYWdlVmlldy5zZXRNb2RlbChvTWVzc2FnZURpYWxvZ01vZGVsKTtcblx0cmV0dXJuIHtcblx0XHRvTWVzc2FnZVZpZXcsXG5cdFx0b0JhY2tCdXR0b25cblx0fTtcbn1cblxuZnVuY3Rpb24gc2hvd1VuYm91bmRNZXNzYWdlcyhcblx0dGhpczogbWVzc2FnZUhhbmRsaW5nVHlwZSxcblx0YUN1c3RvbU1lc3NhZ2VzPzogYW55W10sXG5cdG9Db250ZXh0PzogYW55LFxuXHRiU2hvd0JvdW5kVHJhbnNpdGlvbj86IGJvb2xlYW4sXG5cdGNvbmN1cnJlbnRFZGl0RmxhZz86IGJvb2xlYW4sXG5cdGNvbnRyb2w/OiBDb250cm9sLFxuXHRzQWN0aW9uTmFtZT86IHN0cmluZyB8IHVuZGVmaW5lZCxcblx0Yk9ubHlGb3JUZXN0PzogYm9vbGVhbixcblx0b25CZWZvcmVTaG93TWVzc2FnZT86IChtZXNzYWdlczogYW55LCBzaG93TWVzc2FnZVBhcmFtZXRlcnM6IGFueSkgPT4gYW55LFxuXHR2aWV3VHlwZT86IHN0cmluZ1xuKTogUHJvbWlzZTxhbnk+IHtcblx0bGV0IGFUcmFuc2l0aW9uTWVzc2FnZXMgPSB0aGlzLmdldE1lc3NhZ2VzKCk7XG5cdGNvbnN0IG9NZXNzYWdlTWFuYWdlciA9IENvcmUuZ2V0TWVzc2FnZU1hbmFnZXIoKTtcblx0bGV0IHNIaWdoZXN0UHJpb3JpdHk7XG5cdGxldCBzSGlnaGVzdFByaW9yaXR5VGV4dDtcblx0Y29uc3QgYUZpbHRlcnMgPSBbbmV3IEZpbHRlcih7IHBhdGg6IFwicGVyc2lzdGVudFwiLCBvcGVyYXRvcjogRmlsdGVyT3BlcmF0b3IuTkUsIHZhbHVlMTogZmFsc2UgfSldO1xuXHRsZXQgc2hvd01lc3NhZ2VEaWFsb2c6IGJvb2xlYW4gfCB1bmRlZmluZWQgPSBmYWxzZSxcblx0XHRzaG93TWVzc2FnZUJveDogYm9vbGVhbiB8IHVuZGVmaW5lZCA9IGZhbHNlO1xuXG5cdGlmIChiU2hvd0JvdW5kVHJhbnNpdGlvbikge1xuXHRcdGFUcmFuc2l0aW9uTWVzc2FnZXMgPSBhVHJhbnNpdGlvbk1lc3NhZ2VzLmNvbmNhdChnZXRNZXNzYWdlcyh0cnVlLCB0cnVlKSk7XG5cdFx0Ly8gd2Ugb25seSB3YW50IHRvIHNob3cgYm91bmQgdHJhbnNpdGlvbiBtZXNzYWdlcyBub3QgYm91bmQgc3RhdGUgbWVzc2FnZXMgaGVuY2UgYWRkIGEgZmlsdGVyIGZvciB0aGUgc2FtZVxuXHRcdGFGaWx0ZXJzLnB1c2gobmV3IEZpbHRlcih7IHBhdGg6IFwicGVyc2lzdGVudFwiLCBvcGVyYXRvcjogRmlsdGVyT3BlcmF0b3IuRVEsIHZhbHVlMTogdHJ1ZSB9KSk7XG5cdFx0Y29uc3QgZm5DaGVja0NvbnRyb2xJZEluRGlhbG9nID0gZnVuY3Rpb24gKGFDb250cm9sSWRzOiBhbnkpIHtcblx0XHRcdGxldCBpbmRleCA9IEluZmluaXR5LFxuXHRcdFx0XHRvQ29udHJvbCA9IENvcmUuYnlJZChhQ29udHJvbElkc1swXSkgYXMgTWFuYWdlZE9iamVjdCB8IG51bGw7XG5cdFx0XHRjb25zdCBlcnJvckZpZWxkQ29udHJvbCA9IENvcmUuYnlJZChhQ29udHJvbElkc1swXSkgYXMgQ29udHJvbDtcblx0XHRcdHdoaWxlIChvQ29udHJvbCkge1xuXHRcdFx0XHRjb25zdCBmaWVsZFJhbmtpbkRpYWxvZyA9XG5cdFx0XHRcdFx0b0NvbnRyb2wgaW5zdGFuY2VvZiBEaWFsb2dcblx0XHRcdFx0XHRcdD8gKGVycm9yRmllbGRDb250cm9sLmdldFBhcmVudCgpIGFzIGFueSkuZmluZEVsZW1lbnRzKHRydWUpLmluZGV4T2YoZXJyb3JGaWVsZENvbnRyb2wpXG5cdFx0XHRcdFx0XHQ6IEluZmluaXR5O1xuXHRcdFx0XHRpZiAob0NvbnRyb2wgaW5zdGFuY2VvZiBEaWFsb2cpIHtcblx0XHRcdFx0XHRpZiAoaW5kZXggPiBmaWVsZFJhbmtpbkRpYWxvZykge1xuXHRcdFx0XHRcdFx0aW5kZXggPSBmaWVsZFJhbmtpbkRpYWxvZztcblx0XHRcdFx0XHRcdC8vIFNldCB0aGUgZm9jdXMgdG8gdGhlIGRpYWxvZydzIGNvbnRyb2xcblx0XHRcdFx0XHRcdGVycm9yRmllbGRDb250cm9sLmZvY3VzKCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdC8vIG1lc3NhZ2VzIHdpdGggdGFyZ2V0IGluc2lkZSBzYXAubS5EaWFsb2cgc2hvdWxkIG5vdCBicmluZyB1cCB0aGUgbWVzc2FnZSBkaWFsb2dcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdFx0b0NvbnRyb2wgPSBvQ29udHJvbC5nZXRQYXJlbnQoKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH07XG5cdFx0YUZpbHRlcnMucHVzaChcblx0XHRcdG5ldyBGaWx0ZXIoe1xuXHRcdFx0XHRwYXRoOiBcImNvbnRyb2xJZHNcIixcblx0XHRcdFx0dGVzdDogZm5DaGVja0NvbnRyb2xJZEluRGlhbG9nLFxuXHRcdFx0XHRjYXNlU2Vuc2l0aXZlOiB0cnVlXG5cdFx0XHR9KVxuXHRcdCk7XG5cdH0gZWxzZSB7XG5cdFx0Ly8gb25seSB1bmJvdW5kIG1lc3NhZ2VzIGhhdmUgdG8gYmUgc2hvd24gc28gYWRkIGZpbHRlciBhY2NvcmRpbmdseVxuXHRcdGFGaWx0ZXJzLnB1c2gobmV3IEZpbHRlcih7IHBhdGg6IFwidGFyZ2V0XCIsIG9wZXJhdG9yOiBGaWx0ZXJPcGVyYXRvci5FUSwgdmFsdWUxOiBcIlwiIH0pKTtcblx0fVxuXHRpZiAoYUN1c3RvbU1lc3NhZ2VzICYmIGFDdXN0b21NZXNzYWdlcy5sZW5ndGgpIHtcblx0XHRhQ3VzdG9tTWVzc2FnZXMuZm9yRWFjaChmdW5jdGlvbiAob01lc3NhZ2U6IGFueSkge1xuXHRcdFx0Y29uc3QgbWVzc2FnZUNvZGUgPSBvTWVzc2FnZS5jb2RlID8gb01lc3NhZ2UuY29kZSA6IFwiXCI7XG5cdFx0XHRvTWVzc2FnZU1hbmFnZXIuYWRkTWVzc2FnZXMoXG5cdFx0XHRcdG5ldyBNZXNzYWdlKHtcblx0XHRcdFx0XHRtZXNzYWdlOiBvTWVzc2FnZS50ZXh0LFxuXHRcdFx0XHRcdHR5cGU6IG9NZXNzYWdlLnR5cGUsXG5cdFx0XHRcdFx0dGFyZ2V0OiBcIlwiLFxuXHRcdFx0XHRcdHBlcnNpc3RlbnQ6IHRydWUsXG5cdFx0XHRcdFx0Y29kZTogbWVzc2FnZUNvZGVcblx0XHRcdFx0fSlcblx0XHRcdCk7XG5cdFx0XHQvL1RoZSB0YXJnZXQgYW5kIHBlcnNpc3RlbnQgcHJvcGVydGllcyBvZiB0aGUgbWVzc2FnZSBhcmUgaGFyZGNvZGVkIGFzIFwiXCIgYW5kIHRydWUgYmVjYXVzZSB0aGUgZnVuY3Rpb24gZGVhbHMgd2l0aCBvbmx5IHVuYm91bmQgbWVzc2FnZXMuXG5cdFx0fSk7XG5cdH1cblx0Y29uc3Qgb01lc3NhZ2VEaWFsb2dNb2RlbCA9IChvTWVzc2FnZVZpZXcgJiYgKG9NZXNzYWdlVmlldy5nZXRNb2RlbCgpIGFzIEpTT05Nb2RlbCkpIHx8IG5ldyBKU09OTW9kZWwoKTtcblx0Y29uc3QgYkhhc0V0YWdNZXNzYWdlID0gdGhpcy5tb2RpZnlFVGFnTWVzc2FnZXNPbmx5KG9NZXNzYWdlTWFuYWdlciwgQ29yZS5nZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUoXCJzYXAuZmUuY29yZVwiKSwgY29uY3VycmVudEVkaXRGbGFnKTtcblxuXHRpZiAoYVRyYW5zaXRpb25NZXNzYWdlcy5sZW5ndGggPT09IDEgJiYgYVRyYW5zaXRpb25NZXNzYWdlc1swXS5nZXRDb2RlKCkgPT09IFwiNTAzXCIpIHtcblx0XHRzaG93TWVzc2FnZUJveCA9IHRydWU7XG5cdH0gZWxzZSBpZiAoYVRyYW5zaXRpb25NZXNzYWdlcy5sZW5ndGggIT09IDApIHtcblx0XHRzaG93TWVzc2FnZURpYWxvZyA9IHRydWU7XG5cdH1cblx0bGV0IHNob3dNZXNzYWdlUGFyYW1ldGVyczogYW55O1xuXHRsZXQgYU1vZGVsRGF0YUFycmF5OiBNZXNzYWdlV2l0aEhlYWRlcltdID0gW107XG5cdGlmIChzaG93TWVzc2FnZURpYWxvZyB8fCAoIXNob3dNZXNzYWdlQm94ICYmICFvbkJlZm9yZVNob3dNZXNzYWdlKSkge1xuXHRcdGNvbnN0IG9MaXN0QmluZGluZyA9IG9NZXNzYWdlTWFuYWdlci5nZXRNZXNzYWdlTW9kZWwoKS5iaW5kTGlzdChcIi9cIiwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGFGaWx0ZXJzKSxcblx0XHRcdGFDdXJyZW50Q29udGV4dHMgPSBvTGlzdEJpbmRpbmcuZ2V0Q3VycmVudENvbnRleHRzKCk7XG5cdFx0aWYgKGFDdXJyZW50Q29udGV4dHMgJiYgYUN1cnJlbnRDb250ZXh0cy5sZW5ndGggPiAwKSB7XG5cdFx0XHRzaG93TWVzc2FnZURpYWxvZyA9IHRydWU7XG5cdFx0XHQvLyBEb24ndCBzaG93IGRpYWxvZyBpbmNhc2UgdGhlcmUgYXJlIG5vIGVycm9ycyB0byBzaG93XG5cblx0XHRcdC8vIGlmIGZhbHNlLCBzaG93IG1lc3NhZ2VzIGluIGRpYWxvZ1xuXHRcdFx0Ly8gQXMgZml0ZXJpbmcgaGFzIGFscmVhZHkgaGFwcGVuZWQgaGVyZSBoZW5jZVxuXHRcdFx0Ly8gdXNpbmcgdGhlIG1lc3NhZ2UgbW9kZWwgYWdhaW4gZm9yIHRoZSBtZXNzYWdlIGRpYWxvZyB2aWV3IGFuZCB0aGVuIGZpbHRlcmluZyBvbiB0aGF0IGJpbmRpbmcgYWdhaW4gaXMgdW5uZWNlc3NhcnkuXG5cdFx0XHQvLyBTbyB3ZSBjcmVhdGUgbmV3IGpzb24gbW9kZWwgdG8gdXNlIGZvciB0aGUgbWVzc2FnZSBkaWFsb2cgdmlldy5cblx0XHRcdGNvbnN0IGFNZXNzYWdlczogYW55W10gPSBbXTtcblx0XHRcdGFDdXJyZW50Q29udGV4dHMuZm9yRWFjaChmdW5jdGlvbiAoY3VycmVudENvbnRleHQ6IGFueSkge1xuXHRcdFx0XHRjb25zdCBvTWVzc2FnZSA9IGN1cnJlbnRDb250ZXh0LmdldE9iamVjdCgpO1xuXHRcdFx0XHRhTWVzc2FnZXMucHVzaChvTWVzc2FnZSk7XG5cdFx0XHRcdGFNZXNzYWdlRGF0YUxpc3QgPSBhTWVzc2FnZXM7XG5cdFx0XHR9KTtcblx0XHRcdGxldCBleGlzdGluZ01lc3NhZ2VzOiBhbnlbXSA9IFtdO1xuXHRcdFx0aWYgKEFycmF5LmlzQXJyYXkob01lc3NhZ2VEaWFsb2dNb2RlbC5nZXREYXRhKCkpKSB7XG5cdFx0XHRcdGV4aXN0aW5nTWVzc2FnZXMgPSBvTWVzc2FnZURpYWxvZ01vZGVsLmdldERhdGEoKTtcblx0XHRcdH1cblx0XHRcdGNvbnN0IG9VbmlxdWVPYmo6IGFueSA9IHt9O1xuXG5cdFx0XHRhTW9kZWxEYXRhQXJyYXkgPSBhTWVzc2FnZURhdGFMaXN0LmNvbmNhdChleGlzdGluZ01lc3NhZ2VzKS5maWx0ZXIoZnVuY3Rpb24gKG9iaikge1xuXHRcdFx0XHQvLyByZW1vdmUgZW50cmllcyBoYXZpbmcgZHVwbGljYXRlIG1lc3NhZ2UgaWRzXG5cdFx0XHRcdHJldHVybiAhb1VuaXF1ZU9ialtvYmouaWRdICYmIChvVW5pcXVlT2JqW29iai5pZF0gPSB0cnVlKTtcblx0XHRcdH0pO1xuXHRcdFx0b01lc3NhZ2VEaWFsb2dNb2RlbC5zZXREYXRhKGFNb2RlbERhdGFBcnJheSk7XG5cdFx0fVxuXHR9XG5cdGlmIChvbkJlZm9yZVNob3dNZXNzYWdlKSB7XG5cdFx0c2hvd01lc3NhZ2VQYXJhbWV0ZXJzID0geyBzaG93TWVzc2FnZUJveCwgc2hvd01lc3NhZ2VEaWFsb2cgfTtcblx0XHRzaG93TWVzc2FnZVBhcmFtZXRlcnMgPSBvbkJlZm9yZVNob3dNZXNzYWdlKGFUcmFuc2l0aW9uTWVzc2FnZXMsIHNob3dNZXNzYWdlUGFyYW1ldGVycyk7XG5cdFx0c2hvd01lc3NhZ2VCb3ggPSBzaG93TWVzc2FnZVBhcmFtZXRlcnMuc2hvd01lc3NhZ2VCb3g7XG5cdFx0c2hvd01lc3NhZ2VEaWFsb2cgPSBzaG93TWVzc2FnZVBhcmFtZXRlcnMuc2hvd01lc3NhZ2VEaWFsb2c7XG5cdFx0aWYgKHNob3dNZXNzYWdlRGlhbG9nKSB7XG5cdFx0XHRhTW9kZWxEYXRhQXJyYXkgPSBzaG93TWVzc2FnZVBhcmFtZXRlcnMuZmlsdGVyZWRNZXNzYWdlcyA/IHNob3dNZXNzYWdlUGFyYW1ldGVycy5maWx0ZXJlZE1lc3NhZ2VzIDogYU1vZGVsRGF0YUFycmF5O1xuXHRcdH1cblx0fVxuXHRpZiAoYVRyYW5zaXRpb25NZXNzYWdlcy5sZW5ndGggPT09IDAgJiYgIWFDdXN0b21NZXNzYWdlcyAmJiAhYkhhc0V0YWdNZXNzYWdlKSB7XG5cdFx0Ly8gRG9uJ3Qgc2hvdyB0aGUgcG9wdXAgaWYgdGhlcmUgYXJlIG5vIHRyYW5zaWVudCBtZXNzYWdlc1xuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUodHJ1ZSk7XG5cdH0gZWxzZSBpZiAoYVRyYW5zaXRpb25NZXNzYWdlcy5sZW5ndGggPT09IDEgJiYgYVRyYW5zaXRpb25NZXNzYWdlc1swXS5nZXRUeXBlKCkgPT09IE1lc3NhZ2VUeXBlLlN1Y2Nlc3MgJiYgIWFDdXN0b21NZXNzYWdlcykge1xuXHRcdHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuXHRcdFx0TWVzc2FnZVRvYXN0LnNob3coYVRyYW5zaXRpb25NZXNzYWdlc1swXS5tZXNzYWdlKTtcblx0XHRcdGlmIChvTWVzc2FnZURpYWxvZ01vZGVsKSB7XG5cdFx0XHRcdG9NZXNzYWdlRGlhbG9nTW9kZWwuc2V0RGF0YSh7fSk7XG5cdFx0XHR9XG5cdFx0XHRvTWVzc2FnZU1hbmFnZXIucmVtb3ZlTWVzc2FnZXMoYVRyYW5zaXRpb25NZXNzYWdlcyk7XG5cdFx0XHRyZXNvbHZlKCk7XG5cdFx0fSk7XG5cdH0gZWxzZSBpZiAoc2hvd01lc3NhZ2VEaWFsb2cpIHtcblx0XHRtZXNzYWdlSGFuZGxpbmcudXBkYXRlTWVzc2FnZU9iamVjdEdyb3VwTmFtZShhTW9kZWxEYXRhQXJyYXksIGNvbnRyb2wsIHNBY3Rpb25OYW1lLCB2aWV3VHlwZSk7XG5cdFx0b01lc3NhZ2VEaWFsb2dNb2RlbC5zZXREYXRhKGFNb2RlbERhdGFBcnJheSk7IC8vIHNldCB0aGUgbWVzc2FnZXMgaGVyZSBzbyB0aGF0IGlmIGFueSBvZiB0aGVtIGFyZSBmaWx0ZXJlZCBmb3IgQVBELCB0aGV5IGFyZSBmaWx0ZXJlZCBoZXJlIGFzIHdlbGwuXG5cdFx0YVJlc29sdmVGdW5jdGlvbnMgPSBhUmVzb2x2ZUZ1bmN0aW9ucyB8fCBbXTtcblx0XHRyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmU6ICh2YWx1ZTogYW55KSA9PiB2b2lkLCByZWplY3Q6IChyZWFzb24/OiBhbnkpID0+IHZvaWQpIHtcblx0XHRcdGFSZXNvbHZlRnVuY3Rpb25zLnB1c2gocmVzb2x2ZSk7XG5cdFx0XHRDb3JlLmdldExpYnJhcnlSZXNvdXJjZUJ1bmRsZShcInNhcC5mZS5jb3JlXCIsIHRydWUpXG5cdFx0XHRcdC50aGVuKGZ1bmN0aW9uIChvUmVzb3VyY2VCdW5kbGU6IFJlc291cmNlQnVuZGxlKSB7XG5cdFx0XHRcdFx0Y29uc3QgYlN0cmljdEhhbmRsaW5nRmxvdyA9IGZhbHNlO1xuXHRcdFx0XHRcdGlmIChzaG93TWVzc2FnZVBhcmFtZXRlcnMgJiYgc2hvd01lc3NhZ2VQYXJhbWV0ZXJzLmZuR2V0TWVzc2FnZVN1YnRpdGxlKSB7XG5cdFx0XHRcdFx0XHRvTWVzc2FnZURpYWxvZ01vZGVsLmdldERhdGEoKS5mb3JFYWNoKGZ1bmN0aW9uIChvTWVzc2FnZTogYW55KSB7XG5cdFx0XHRcdFx0XHRcdHNob3dNZXNzYWdlUGFyYW1ldGVycy5mbkdldE1lc3NhZ2VTdWJ0aXRsZShvTWVzc2FnZSk7XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRjb25zdCBvTWVzc2FnZU9iamVjdCA9IHByZXBhcmVNZXNzYWdlVmlld0ZvckRpYWxvZyhvTWVzc2FnZURpYWxvZ01vZGVsLCBiU3RyaWN0SGFuZGxpbmdGbG93KTtcblx0XHRcdFx0XHRjb25zdCBvU29ydGVyID0gbmV3IFNvcnRlcihcIlwiLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgKG9iajE6IGFueSwgb2JqMjogYW55KSA9PiB7XG5cdFx0XHRcdFx0XHRjb25zdCByYW5rQSA9IGdldE1lc3NhZ2VSYW5rKG9iajEpO1xuXHRcdFx0XHRcdFx0Y29uc3QgcmFua0IgPSBnZXRNZXNzYWdlUmFuayhvYmoyKTtcblxuXHRcdFx0XHRcdFx0aWYgKHJhbmtBIDwgcmFua0IpIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIC0xO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0aWYgKHJhbmtBID4gcmFua0IpIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIDE7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRyZXR1cm4gMDtcblx0XHRcdFx0XHR9KTtcblxuXHRcdFx0XHRcdChvTWVzc2FnZU9iamVjdC5vTWVzc2FnZVZpZXcuZ2V0QmluZGluZyhcIml0ZW1zXCIpIGFzIE9EYXRhTGlzdEJpbmRpbmcpLnNvcnQob1NvcnRlcik7XG5cblx0XHRcdFx0XHRvRGlhbG9nID1cblx0XHRcdFx0XHRcdG9EaWFsb2cgJiYgb0RpYWxvZy5pc09wZW4oKVxuXHRcdFx0XHRcdFx0XHQ/IG9EaWFsb2dcblx0XHRcdFx0XHRcdFx0OiBuZXcgRGlhbG9nKHtcblx0XHRcdFx0XHRcdFx0XHRcdHJlc2l6YWJsZTogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0XHRcdGVuZEJ1dHRvbjogbmV3IEJ1dHRvbih7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHByZXNzOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZGlhbG9nQ2xvc2VIYW5kbGVyKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gYWxzbyByZW1vdmUgYm91bmQgdHJhbnNpdGlvbiBtZXNzYWdlcyBpZiB3ZSB3ZXJlIHNob3dpbmcgdGhlbVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9NZXNzYWdlTWFuYWdlci5yZW1vdmVNZXNzYWdlcyhhTW9kZWxEYXRhQXJyYXkpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHRcdFx0XHR0ZXh0OiBvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfQ09NTU9OX1NBUEZFX0NMT1NFXCIpXG5cdFx0XHRcdFx0XHRcdFx0XHR9KSxcblx0XHRcdFx0XHRcdFx0XHRcdGN1c3RvbUhlYWRlcjogbmV3IEJhcih7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnRlbnRNaWRkbGU6IFtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRuZXcgVGV4dCh7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0ZXh0OiBvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfTUVTU0FHRV9IQU5ETElOR19TQVBGRV9FUlJPUl9NRVNTQUdFU19QQUdFX1RJVExFXCIpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0XHRcdFx0XSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0Y29udGVudExlZnQ6IFtvQmFja0J1dHRvbl1cblx0XHRcdFx0XHRcdFx0XHRcdH0pLFxuXHRcdFx0XHRcdFx0XHRcdFx0Y29udGVudFdpZHRoOiBcIjM3LjVlbVwiLFxuXHRcdFx0XHRcdFx0XHRcdFx0Y29udGVudEhlaWdodDogXCIyMS41ZW1cIixcblx0XHRcdFx0XHRcdFx0XHRcdHZlcnRpY2FsU2Nyb2xsaW5nOiBmYWxzZSxcblx0XHRcdFx0XHRcdFx0XHRcdGFmdGVyQ2xvc2U6IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBhUmVzb2x2ZUZ1bmN0aW9ucy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFSZXNvbHZlRnVuY3Rpb25zW2ldLmNhbGwoKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRhUmVzb2x2ZUZ1bmN0aW9ucyA9IFtdO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHQgIH0pO1xuXHRcdFx0XHRcdG9EaWFsb2cucmVtb3ZlQWxsQ29udGVudCgpO1xuXHRcdFx0XHRcdG9EaWFsb2cuYWRkQ29udGVudChvTWVzc2FnZU9iamVjdC5vTWVzc2FnZVZpZXcpO1xuXG5cdFx0XHRcdFx0aWYgKGJIYXNFdGFnTWVzc2FnZSkge1xuXHRcdFx0XHRcdFx0c2FwLnVpLnJlcXVpcmUoW1wic2FwL20vQnV0dG9uVHlwZVwiXSwgZnVuY3Rpb24gKEJ1dHRvblR5cGU6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRvRGlhbG9nLnNldEJlZ2luQnV0dG9uKFxuXHRcdFx0XHRcdFx0XHRcdG5ldyBCdXR0b24oe1xuXHRcdFx0XHRcdFx0XHRcdFx0cHJlc3M6IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0ZGlhbG9nQ2xvc2VIYW5kbGVyKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChvQ29udGV4dC5oYXNQZW5kaW5nQ2hhbmdlcygpKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0b0NvbnRleHQuZ2V0QmluZGluZygpLnJlc2V0Q2hhbmdlcygpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdG9Db250ZXh0LnJlZnJlc2goKTtcblx0XHRcdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdFx0XHR0ZXh0OiBvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfQ09NTU9OX1NBUEZFX1JFRlJFU0hcIiksXG5cdFx0XHRcdFx0XHRcdFx0XHR0eXBlOiBCdXR0b25UeXBlLkVtcGhhc2l6ZWRcblx0XHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdG9EaWFsb2cuZGVzdHJveUJlZ2luQnV0dG9uKCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHNIaWdoZXN0UHJpb3JpdHkgPSBmbkdldEhpZ2hlc3RNZXNzYWdlUHJpb3JpdHkob01lc3NhZ2VWaWV3LmdldEl0ZW1zKCkpO1xuXHRcdFx0XHRcdHNIaWdoZXN0UHJpb3JpdHlUZXh0ID0gZ2V0VHJhbnNsYXRlZFRleHRGb3JNZXNzYWdlRGlhbG9nKHNIaWdoZXN0UHJpb3JpdHkpO1xuXHRcdFx0XHRcdG9EaWFsb2cuc2V0U3RhdGUoc0hpZ2hlc3RQcmlvcml0eSk7XG5cdFx0XHRcdFx0KG9EaWFsb2cuZ2V0Q3VzdG9tSGVhZGVyKCkgYXMgYW55KS5nZXRDb250ZW50TWlkZGxlKClbMF0uc2V0VGV4dChzSGlnaGVzdFByaW9yaXR5VGV4dCk7XG5cdFx0XHRcdFx0b01lc3NhZ2VWaWV3Lm5hdmlnYXRlQmFjaygpO1xuXHRcdFx0XHRcdG9EaWFsb2cub3BlbigpO1xuXHRcdFx0XHRcdGlmIChiT25seUZvclRlc3QpIHtcblx0XHRcdFx0XHRcdHJlc29sdmUob0RpYWxvZyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KVxuXHRcdFx0XHQuY2F0Y2gocmVqZWN0KTtcblx0XHR9KTtcblx0fSBlbHNlIGlmIChzaG93TWVzc2FnZUJveCkge1xuXHRcdHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuXHRcdFx0Y29uc3Qgb01lc3NhZ2UgPSBhVHJhbnNpdGlvbk1lc3NhZ2VzWzBdO1xuXHRcdFx0aWYgKG9NZXNzYWdlLnRlY2huaWNhbERldGFpbHMgJiYgYU1lc3NhZ2VMaXN0LmluZGV4T2Yob01lc3NhZ2UudGVjaG5pY2FsRGV0YWlscy5vcmlnaW5hbE1lc3NhZ2UubWVzc2FnZSkgPT09IC0xKSB7XG5cdFx0XHRcdGFNZXNzYWdlTGlzdC5wdXNoKG9NZXNzYWdlLnRlY2huaWNhbERldGFpbHMub3JpZ2luYWxNZXNzYWdlLm1lc3NhZ2UpO1xuXHRcdFx0XHRsZXQgZm9ybWF0dGVkVGV4dFN0cmluZyA9IFwiPGh0bWw+PGJvZHk+XCI7XG5cdFx0XHRcdGNvbnN0IHJldHJ5QWZ0ZXJNZXNzYWdlID0gZ2V0UmV0cnlBZnRlck1lc3NhZ2Uob01lc3NhZ2UsIHRydWUpO1xuXHRcdFx0XHRpZiAocmV0cnlBZnRlck1lc3NhZ2UpIHtcblx0XHRcdFx0XHRmb3JtYXR0ZWRUZXh0U3RyaW5nID0gYDxoNj4ke3JldHJ5QWZ0ZXJNZXNzYWdlfTwvaDY+PGJyPmA7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHNob3dNZXNzYWdlUGFyYW1ldGVycyAmJiBzaG93TWVzc2FnZVBhcmFtZXRlcnMuZm5HZXRNZXNzYWdlU3VidGl0bGUpIHtcblx0XHRcdFx0XHRzaG93TWVzc2FnZVBhcmFtZXRlcnMuZm5HZXRNZXNzYWdlU3VidGl0bGUob01lc3NhZ2UpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChvTWVzc2FnZS5nZXRDb2RlKCkgIT09IFwiNTAzXCIgJiYgb01lc3NhZ2UuZ2V0QWRkaXRpb25hbFRleHQoKSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0Zm9ybWF0dGVkVGV4dFN0cmluZyA9IGAke2Zvcm1hdHRlZFRleHRTdHJpbmcgKyBvTWVzc2FnZS5nZXRBZGRpdGlvbmFsVGV4dCgpfTogJHtvTWVzc2FnZS5nZXRNZXNzYWdlKCl9PC9odG1sPjwvYm9keT5gO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGZvcm1hdHRlZFRleHRTdHJpbmcgPSBgJHtmb3JtYXR0ZWRUZXh0U3RyaW5nICsgb01lc3NhZ2UuZ2V0TWVzc2FnZSgpfTwvaHRtbD48L2JvZHk+YDtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb25zdCBmb3JtYXR0ZWRUZXh0OiBhbnkgPSBuZXcgRm9ybWF0dGVkVGV4dCh7XG5cdFx0XHRcdFx0aHRtbFRleHQ6IGZvcm1hdHRlZFRleHRTdHJpbmdcblx0XHRcdFx0fSk7XG5cdFx0XHRcdE1lc3NhZ2VCb3guZXJyb3IoZm9ybWF0dGVkVGV4dCwge1xuXHRcdFx0XHRcdG9uQ2xvc2U6IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdGFNZXNzYWdlTGlzdCA9IFtdO1xuXHRcdFx0XHRcdFx0aWYgKGJTaG93Qm91bmRUcmFuc2l0aW9uKSB7XG5cdFx0XHRcdFx0XHRcdHJlbW92ZUJvdW5kVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRyZW1vdmVVbmJvdW5kVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cdFx0XHRcdFx0XHRyZXNvbHZlKHRydWUpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSh0cnVlKTtcblx0fVxufVxuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgZ3JvdXAgbmFtZSBmb3IgYWxsIG1lc3NhZ2VzIGluIGEgZGlhbG9nLlxuICpcbiAqIEBwYXJhbSBhTW9kZWxEYXRhQXJyYXkgTWVzc2FnZXMgYXJyYXlcbiAqIEBwYXJhbSBjb250cm9sXG4gKiBAcGFyYW0gc0FjdGlvbk5hbWVcbiAqIEBwYXJhbSB2aWV3VHlwZVxuICovXG5mdW5jdGlvbiB1cGRhdGVNZXNzYWdlT2JqZWN0R3JvdXBOYW1lKFxuXHRhTW9kZWxEYXRhQXJyYXk6IE1lc3NhZ2VXaXRoSGVhZGVyW10sXG5cdGNvbnRyb2w6IENvbnRyb2wgfCB1bmRlZmluZWQsXG5cdHNBY3Rpb25OYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQsXG5cdHZpZXdUeXBlOiBzdHJpbmcgfCB1bmRlZmluZWRcbikge1xuXHRhTW9kZWxEYXRhQXJyYXkuZm9yRWFjaCgoYU1vZGVsRGF0YTogTWVzc2FnZVdpdGhIZWFkZXIpID0+IHtcblx0XHRhTW9kZWxEYXRhW1wiaGVhZGVyTmFtZVwiXSA9IFwiXCI7XG5cdFx0aWYgKCFhTW9kZWxEYXRhLnRhcmdldD8ubGVuZ3RoKSB7XG5cdFx0XHQvLyB1bmJvdW5kIHRyYW5zaWl0b24gbWVzc2FnZXNcblx0XHRcdGFNb2RlbERhdGFbXCJoZWFkZXJOYW1lXCJdID0gXCJHZW5lcmFsXCI7XG5cdFx0fSBlbHNlIGlmIChhTW9kZWxEYXRhLnRhcmdldC5sZW5ndGgpIHtcblx0XHRcdC8vIExSIGZsb3dcblx0XHRcdGlmICh2aWV3VHlwZSA9PT0gXCJMaXN0UmVwb3J0XCIpIHtcblx0XHRcdFx0bWVzc2FnZUhhbmRsaW5nLnNldEdyb3VwTmFtZUxSVGFibGUoY29udHJvbCwgYU1vZGVsRGF0YSwgc0FjdGlvbk5hbWUpO1xuXHRcdFx0fSBlbHNlIGlmICh2aWV3VHlwZSA9PT0gXCJPYmplY3RQYWdlXCIpIHtcblx0XHRcdFx0Ly8gT1AgRGlzcGxheSBtb2RlXG5cdFx0XHRcdG1lc3NhZ2VIYW5kbGluZy5zZXRHcm91cE5hbWVPUERpc3BsYXlNb2RlKGFNb2RlbERhdGEsIHNBY3Rpb25OYW1lLCBjb250cm9sKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGFNb2RlbERhdGFbXCJoZWFkZXJOYW1lXCJdID0gbWVzc2FnZUhhbmRsaW5nLmdldExhc3RBY3Rpb25UZXh0QW5kQWN0aW9uTmFtZShzQWN0aW9uTmFtZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9KTtcbn1cblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIHdpbGwgc2V0IHRoZSBncm91cCBuYW1lIG9mIE1lc3NhZ2UgT2JqZWN0IGZvciBMUiB0YWJsZS5cbiAqXG4gKiBAcGFyYW0gb0VsZW1cbiAqIEBwYXJhbSBhTW9kZWxEYXRhXG4gKiBAcGFyYW0gc0FjdGlvbk5hbWVcbiAqL1xuZnVuY3Rpb24gc2V0R3JvdXBOYW1lTFJUYWJsZShvRWxlbTogQ29udHJvbCB8IHVuZGVmaW5lZCwgYU1vZGVsRGF0YTogTWVzc2FnZVdpdGhIZWFkZXIsIHNBY3Rpb25OYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcblx0Y29uc3Qgb1Jvd0JpbmRpbmcgPSBvRWxlbSAmJiAob0VsZW0gYXMgVGFibGUpLmdldFJvd0JpbmRpbmcoKTtcblx0aWYgKG9Sb3dCaW5kaW5nKSB7XG5cdFx0Y29uc3Qgc0VsZW1lQmluZGluZ1BhdGggPSBgJHsob0VsZW0gYXMgVGFibGUpLmdldFJvd0JpbmRpbmcoKS5nZXRQYXRoKCl9YDtcblx0XHRpZiAoYU1vZGVsRGF0YS50YXJnZXQ/LmluZGV4T2Yoc0VsZW1lQmluZGluZ1BhdGgpID09PSAwKSB7XG5cdFx0XHRjb25zdCBhbGxSb3dDb250ZXh0cyA9ICgob0VsZW0gYXMgVGFibGUpLmdldFJvd0JpbmRpbmcoKSBhcyBPRGF0YUxpc3RCaW5kaW5nKS5nZXRDb250ZXh0cygpO1xuXHRcdFx0YWxsUm93Q29udGV4dHMuZm9yRWFjaCgocm93Q29udGV4dDogQ29udGV4dCkgPT4ge1xuXHRcdFx0XHRpZiAoYU1vZGVsRGF0YS50YXJnZXQ/LmluY2x1ZGVzKHJvd0NvbnRleHQuZ2V0UGF0aCgpKSkge1xuXHRcdFx0XHRcdGNvbnN0IGNvbnRleHRQYXRoID0gYCR7cm93Q29udGV4dC5nZXRQYXRoKCl9L2A7XG5cdFx0XHRcdFx0Y29uc3QgaWRlbnRpZmllckNvbHVtbiA9IChvRWxlbS5nZXRQYXJlbnQoKSBhcyBhbnkpLmdldElkZW50aWZpZXJDb2x1bW4oKTtcblx0XHRcdFx0XHRjb25zdCByb3dJZGVudGlmaWVyID0gaWRlbnRpZmllckNvbHVtbiAmJiByb3dDb250ZXh0LmdldE9iamVjdCgpW2lkZW50aWZpZXJDb2x1bW5dO1xuXHRcdFx0XHRcdGNvbnN0IGNvbHVtblByb3BlcnR5TmFtZSA9IG1lc3NhZ2VIYW5kbGluZy5nZXRUYWJsZUNvbFByb3BlcnR5KG9FbGVtLCBhTW9kZWxEYXRhLCBjb250ZXh0UGF0aCk7XG5cdFx0XHRcdFx0Y29uc3QgeyBzVGFibGVUYXJnZXRDb2xOYW1lIH0gPSBtZXNzYWdlSGFuZGxpbmcuZ2V0VGFibGVDb2xJbmZvKG9FbGVtLCBjb2x1bW5Qcm9wZXJ0eU5hbWUpO1xuXG5cdFx0XHRcdFx0Ly8gaWYgdGFyZ2V0IGhhcyBzb21lIGNvbHVtbiBuYW1lIGFuZCBjb2x1bW4gaXMgdmlzaWJsZSBpbiBVSVxuXHRcdFx0XHRcdGlmIChjb2x1bW5Qcm9wZXJ0eU5hbWUgJiYgc1RhYmxlVGFyZ2V0Q29sTmFtZSkge1xuXHRcdFx0XHRcdFx0Ly8gaGVhZGVyIHdpbGwgYmUgcm93IElkZW50aWZpZXIsIGlmIGZvdW5kIGZyb20gYWJvdmUgY29kZSBvdGhlcndpc2UgaXQgc2hvdWxkIGJlIHRhYmxlIG5hbWVcblx0XHRcdFx0XHRcdGFNb2RlbERhdGFbXCJoZWFkZXJOYW1lXCJdID0gcm93SWRlbnRpZmllciA/IGAgJHtyb3dJZGVudGlmaWVyfWAgOiAob0VsZW0gYXMgVGFibGUpLmdldEhlYWRlcigpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHQvLyBpZiBjb2x1bW4gZGF0YSBub3QgZm91bmQgKG1heSBiZSB0aGUgY29sdW1uIGlzIGhpZGRlbiksIGFkZCBncm91cGluZyBhcyBMYXN0IEFjdGlvblxuXHRcdFx0XHRcdFx0YU1vZGVsRGF0YVtcImhlYWRlck5hbWVcIl0gPSBtZXNzYWdlSGFuZGxpbmcuZ2V0TGFzdEFjdGlvblRleHRBbmRBY3Rpb25OYW1lKHNBY3Rpb25OYW1lKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH1cblx0fVxufVxuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gd2lsbCBzZXQgdGhlIGdyb3VwIG5hbWUgb2YgTWVzc2FnZSBPYmplY3QgaW4gT1AgRGlzcGxheSBtb2RlLlxuICpcbiAqIEBwYXJhbSBhTW9kZWxEYXRhIE1lc3NhZ2UgT2JqZWN0XG4gKiBAcGFyYW0gc0FjdGlvbk5hbWUgIEFjdGlvbiBuYW1lXG4gKiBAcGFyYW0gY29udHJvbFxuICovXG5mdW5jdGlvbiBzZXRHcm91cE5hbWVPUERpc3BsYXlNb2RlKGFNb2RlbERhdGE6IE1lc3NhZ2VXaXRoSGVhZGVyLCBzQWN0aW9uTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkLCBjb250cm9sOiBhbnkpIHtcblx0Y29uc3Qgb1ZpZXdDb250ZXh0ID0gY29udHJvbD8uZ2V0QmluZGluZ0NvbnRleHQoKTtcblx0Y29uc3Qgb3BMYXlvdXQ6IENvbnRyb2wgPSBjb250cm9sPy5nZXRDb250ZW50ICYmIGNvbnRyb2w/LmdldENvbnRlbnQoKVswXTtcblx0bGV0IGJJc0dlbmVyYWxHcm91cE5hbWUgPSB0cnVlO1xuXHRpZiAob3BMYXlvdXQpIHtcblx0XHRtZXNzYWdlSGFuZGxpbmcuZ2V0VmlzaWJsZVNlY3Rpb25zRnJvbU9iamVjdFBhZ2VMYXlvdXQob3BMYXlvdXQpLmZvckVhY2goZnVuY3Rpb24gKG9TZWN0aW9uOiBPYmplY3RQYWdlU2VjdGlvbikge1xuXHRcdFx0Y29uc3Qgc3ViU2VjdGlvbnMgPSBvU2VjdGlvbi5nZXRTdWJTZWN0aW9ucygpO1xuXHRcdFx0c3ViU2VjdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAob1N1YlNlY3Rpb246IE9iamVjdFBhZ2VTdWJTZWN0aW9uKSB7XG5cdFx0XHRcdG9TdWJTZWN0aW9uLmZpbmRFbGVtZW50cyh0cnVlKS5mb3JFYWNoKGZ1bmN0aW9uIChvRWxlbTogYW55KSB7XG5cdFx0XHRcdFx0aWYgKG9FbGVtLmlzQShcInNhcC51aS5tZGMuVGFibGVcIikpIHtcblx0XHRcdFx0XHRcdGNvbnN0IG9Sb3dCaW5kaW5nID0gb0VsZW0uZ2V0Um93QmluZGluZygpLFxuXHRcdFx0XHRcdFx0XHRzZXRTZWN0aW9uTmFtZUluR3JvdXAgPSB0cnVlO1xuXHRcdFx0XHRcdFx0bGV0IGNoaWxkVGFibGVFbGVtZW50OiBVSTVFbGVtZW50IHwgdW5kZWZpbmVkO1xuXG5cdFx0XHRcdFx0XHRvRWxlbS5maW5kRWxlbWVudHModHJ1ZSkuZm9yRWFjaCgob0VsZW1lbnQ6IGFueSkgPT4ge1xuXHRcdFx0XHRcdFx0XHRpZiAob0VsZW1lbnQuaXNBKFwic2FwLm0uVGFibGVcIikgfHwgb0VsZW1lbnQuaXNBKFwic2FwLnVpLnRhYmxlLlRhYmxlXCIpKSB7XG5cdFx0XHRcdFx0XHRcdFx0Y2hpbGRUYWJsZUVsZW1lbnQgPSBvRWxlbWVudDtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRpZiAob1Jvd0JpbmRpbmcpIHtcblx0XHRcdFx0XHRcdFx0Y29uc3Qgc0VsZW1lQmluZGluZ1BhdGggPSBgJHtvVmlld0NvbnRleHQ/LmdldFBhdGgoKX0vJHtvRWxlbS5nZXRSb3dCaW5kaW5nKCk/LmdldFBhdGgoKX1gO1xuXHRcdFx0XHRcdFx0XHRpZiAoYU1vZGVsRGF0YS50YXJnZXQ/LmluZGV4T2Yoc0VsZW1lQmluZGluZ1BhdGgpID09PSAwKSB7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3Qgb2JqID0gbWVzc2FnZUhhbmRsaW5nLmdldFRhYmxlQ29sdW1uRGF0YUFuZFNldFN1YnRpbGUoXG5cdFx0XHRcdFx0XHRcdFx0XHRhTW9kZWxEYXRhLFxuXHRcdFx0XHRcdFx0XHRcdFx0b0VsZW0sXG5cdFx0XHRcdFx0XHRcdFx0XHRjaGlsZFRhYmxlRWxlbWVudCxcblx0XHRcdFx0XHRcdFx0XHRcdG9Sb3dCaW5kaW5nLFxuXHRcdFx0XHRcdFx0XHRcdFx0c0FjdGlvbk5hbWUsXG5cdFx0XHRcdFx0XHRcdFx0XHRzZXRTZWN0aW9uTmFtZUluR3JvdXAsXG5cdFx0XHRcdFx0XHRcdFx0XHRmbkNhbGxiYWNrU2V0R3JvdXBOYW1lXG5cdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCB7IG9UYXJnZXRUYWJsZUluZm8gfSA9IG9iajtcblxuXHRcdFx0XHRcdFx0XHRcdGlmIChzZXRTZWN0aW9uTmFtZUluR3JvdXApIHtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IGlkZW50aWZpZXJDb2x1bW4gPSBvRWxlbS5nZXRQYXJlbnQoKS5nZXRJZGVudGlmaWVyQ29sdW1uKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoaWRlbnRpZmllckNvbHVtbikge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBhbGxSb3dDb250ZXh0cyA9IG9FbGVtLmdldFJvd0JpbmRpbmcoKS5nZXRDb250ZXh0cygpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRhbGxSb3dDb250ZXh0cy5mb3JFYWNoKChyb3dDb250ZXh0OiBDb250ZXh0KSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKGFNb2RlbERhdGEudGFyZ2V0Py5pbmNsdWRlcyhyb3dDb250ZXh0LmdldFBhdGgoKSkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IHJvd0lkZW50aWZpZXIgPSBpZGVudGlmaWVyQ29sdW1uXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdD8gcm93Q29udGV4dC5nZXRPYmplY3QoKVtpZGVudGlmaWVyQ29sdW1uXVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ6IHVuZGVmaW5lZDtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFNb2RlbERhdGFbXCJhZGRpdGlvbmFsVGV4dFwiXSA9IGAke3Jvd0lkZW50aWZpZXJ9LCAke29UYXJnZXRUYWJsZUluZm8uc1RhYmxlVGFyZ2V0Q29sTmFtZX1gO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRhTW9kZWxEYXRhW1wiYWRkaXRpb25hbFRleHRcIl0gPSBgJHtvVGFyZ2V0VGFibGVJbmZvLnNUYWJsZVRhcmdldENvbE5hbWV9YDtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdFx0bGV0IGhlYWRlck5hbWUgPSBvRWxlbS5nZXRIZWFkZXJWaXNpYmxlKCkgJiYgb1RhcmdldFRhYmxlSW5mby50YWJsZUhlYWRlcjtcblx0XHRcdFx0XHRcdFx0XHRcdGlmICghaGVhZGVyTmFtZSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRoZWFkZXJOYW1lID0gb1N1YlNlY3Rpb24uZ2V0VGl0bGUoKTtcblx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IG9SZXNvdXJjZUJ1bmRsZSA9IENvcmUuZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlKFwic2FwLmZlLmNvcmVcIik7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGhlYWRlck5hbWUgPSBgJHtvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIlRfTUVTU0FHRV9HUk9VUF9USVRMRV9UQUJMRV9ERU5PTUlOQVRPUlwiKX06ICR7aGVhZGVyTmFtZX1gO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0YU1vZGVsRGF0YVtcImhlYWRlck5hbWVcIl0gPSBoZWFkZXJOYW1lO1xuXHRcdFx0XHRcdFx0XHRcdFx0YklzR2VuZXJhbEdyb3VwTmFtZSA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblx0XHR9KTtcblx0fVxuXG5cdGlmIChiSXNHZW5lcmFsR3JvdXBOYW1lKSB7XG5cdFx0Y29uc3Qgc0VsZW1lQmluZGluZ1BhdGggPSBgJHtvVmlld0NvbnRleHQ/LmdldFBhdGgoKX1gO1xuXHRcdGlmIChhTW9kZWxEYXRhLnRhcmdldD8uaW5kZXhPZihzRWxlbWVCaW5kaW5nUGF0aCkgPT09IDApIHtcblx0XHRcdC8vIGNoZWNrIGlmIE9QIGNvbnRleHQgcGF0aCBpcyBwYXJ0IG9mIHRhcmdldCwgc2V0IExhc3QgQWN0aW9uIGFzIGdyb3VwIG5hbWVcblx0XHRcdGNvbnN0IGhlYWRlck5hbWUgPSBtZXNzYWdlSGFuZGxpbmcuZ2V0TGFzdEFjdGlvblRleHRBbmRBY3Rpb25OYW1lKHNBY3Rpb25OYW1lKTtcblx0XHRcdGFNb2RlbERhdGFbXCJoZWFkZXJOYW1lXCJdID0gaGVhZGVyTmFtZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0YU1vZGVsRGF0YVtcImhlYWRlck5hbWVcIl0gPSBcIkdlbmVyYWxcIjtcblx0XHR9XG5cdH1cbn1cblxuZnVuY3Rpb24gZ2V0TGFzdEFjdGlvblRleHRBbmRBY3Rpb25OYW1lKHNBY3Rpb25OYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuXHRjb25zdCBzTGFzdEFjdGlvblRleHQgPSBDb3JlLmdldExpYnJhcnlSZXNvdXJjZUJ1bmRsZShcInNhcC5mZS5jb3JlXCIpLmdldFRleHQoXCJUX01FU1NBR0VfQlVUVE9OX1NBUEZFX01FU1NBR0VfR1JPVVBfTEFTVF9BQ1RJT05cIik7XG5cdHJldHVybiBzQWN0aW9uTmFtZSA/IGAke3NMYXN0QWN0aW9uVGV4dH06ICR7c0FjdGlvbk5hbWV9YCA6IFwiXCI7XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiB3aWxsIGdpdmUgcmFuayBiYXNlZCBvbiBNZXNzYWdlIEdyb3VwL0hlYWRlciBuYW1lLCB3aGljaCB3aWxsIGJlIHVzZWQgZm9yIFNvcnRpbmcgbWVzc2FnZXMgaW4gTWVzc2FnZSBkaWFsb2dcbiAqIExhc3QgQWN0aW9uIHNob3VsZCBiZSBzaG93biBhdCB0b3AsIG5leHQgUm93IElkIGFuZCBsYXN0IEdlbmVyYWwuXG4gKlxuICogQHBhcmFtIG9ialxuICogQHJldHVybnMgUmFuayBvZiBtZXNzYWdlXG4gKi9cbmZ1bmN0aW9uIGdldE1lc3NhZ2VSYW5rKG9iajogTWVzc2FnZVdpdGhIZWFkZXIpOiBudW1iZXIge1xuXHRpZiAob2JqLmhlYWRlck5hbWU/LnRvU3RyaW5nKCkuaW5jbHVkZXMoXCJMYXN0IEFjdGlvblwiKSkge1xuXHRcdHJldHVybiAxO1xuXHR9IGVsc2UgaWYgKG9iai5oZWFkZXJOYW1lPy50b1N0cmluZygpLmluY2x1ZGVzKFwiR2VuZXJhbFwiKSkge1xuXHRcdHJldHVybiAzO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiAyO1xuXHR9XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiB3aWxsIHNldCB0aGUgZ3JvdXAgbmFtZSB3aGljaCBjYW4gZWl0aGVyIEdlbmVyYWwgb3IgTGFzdCBBY3Rpb24uXG4gKlxuICogQHBhcmFtIGFNZXNzYWdlXG4gKiBAcGFyYW0gc0FjdGlvbk5hbWVcbiAqIEBwYXJhbSBiSXNHZW5lcmFsR3JvdXBOYW1lXG4gKi9cbmNvbnN0IGZuQ2FsbGJhY2tTZXRHcm91cE5hbWUgPSAoYU1lc3NhZ2U6IE1lc3NhZ2VXaXRoSGVhZGVyLCBzQWN0aW9uTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkLCBiSXNHZW5lcmFsR3JvdXBOYW1lPzogQm9vbGVhbikgPT4ge1xuXHRpZiAoYklzR2VuZXJhbEdyb3VwTmFtZSkge1xuXHRcdGNvbnN0IHNHZW5lcmFsR3JvdXBUZXh0ID0gQ29yZS5nZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUoXCJzYXAuZmUuY29yZVwiKS5nZXRUZXh0KFwiVF9NRVNTQUdFX0JVVFRPTl9TQVBGRV9NRVNTQUdFX0dST1VQX0dFTkVSQUxcIik7XG5cdFx0YU1lc3NhZ2VbXCJoZWFkZXJOYW1lXCJdID0gc0dlbmVyYWxHcm91cFRleHQ7XG5cdH0gZWxzZSB7XG5cdFx0YU1lc3NhZ2VbXCJoZWFkZXJOYW1lXCJdID0gbWVzc2FnZUhhbmRsaW5nLmdldExhc3RBY3Rpb25UZXh0QW5kQWN0aW9uTmFtZShzQWN0aW9uTmFtZSk7XG5cdH1cbn07XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiB3aWxsIGdldCB0aGUgdGFibGUgcm93L2NvbHVtbiBpbmZvIGFuZCBzZXQgc3VidGl0bGUuXG4gKlxuICogQHBhcmFtIGFNZXNzYWdlXG4gKiBAcGFyYW0gb1RhYmxlXG4gKiBAcGFyYW0gb0VsZW1lbnRcbiAqIEBwYXJhbSBvUm93QmluZGluZ1xuICogQHBhcmFtIHNBY3Rpb25OYW1lXG4gKiBAcGFyYW0gc2V0U2VjdGlvbk5hbWVJbkdyb3VwXG4gKiBAcGFyYW0gZm5TZXRHcm91cE5hbWVcbiAqIEByZXR1cm5zIFRhYmxlIGluZm8gYW5kIFN1YnRpdGxlLlxuICovXG5mdW5jdGlvbiBnZXRUYWJsZUNvbHVtbkRhdGFBbmRTZXRTdWJ0aWxlKFxuXHRhTWVzc2FnZTogTWVzc2FnZVdpdGhIZWFkZXIsXG5cdG9UYWJsZTogVGFibGUsXG5cdG9FbGVtZW50OiBVSTVFbGVtZW50IHwgdW5kZWZpbmVkLFxuXHRvUm93QmluZGluZzogQmluZGluZyxcblx0c0FjdGlvbk5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCxcblx0c2V0U2VjdGlvbk5hbWVJbkdyb3VwOiBCb29sZWFuLFxuXHRmblNldEdyb3VwTmFtZTogYW55XG4pIHtcblx0Y29uc3Qgb1RhcmdldFRhYmxlSW5mbyA9IG1lc3NhZ2VIYW5kbGluZy5nZXRUYWJsZUFuZFRhcmdldEluZm8ob1RhYmxlLCBhTWVzc2FnZSwgb0VsZW1lbnQsIG9Sb3dCaW5kaW5nKTtcblx0Y29uc3Qgb1Jlc291cmNlQnVuZGxlID0gQ29yZS5nZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUoXCJzYXAuZmUuY29yZVwiKSBhcyBhbnk7XG5cdG9UYXJnZXRUYWJsZUluZm8udGFibGVIZWFkZXIgPSBvVGFibGUuZ2V0SGVhZGVyKCk7XG5cblx0bGV0IHNDb250cm9sSWQsIGJJc0NyZWF0aW9uUm93O1xuXHRpZiAoIW9UYXJnZXRUYWJsZUluZm8ub1RhYmxlUm93Q29udGV4dCkge1xuXHRcdHNDb250cm9sSWQgPSBhTWVzc2FnZS5nZXRDb250cm9sSWRzKCkuZmluZChmdW5jdGlvbiAoc0lkOiBzdHJpbmcpIHtcblx0XHRcdHJldHVybiBtZXNzYWdlSGFuZGxpbmcuaXNDb250cm9sSW5UYWJsZShvVGFibGUsIHNJZCk7XG5cdFx0fSk7XG5cdH1cblxuXHRpZiAoc0NvbnRyb2xJZCkge1xuXHRcdGNvbnN0IG9Db250cm9sID0gQ29yZS5ieUlkKHNDb250cm9sSWQpO1xuXHRcdGJJc0NyZWF0aW9uUm93ID0gbWVzc2FnZUhhbmRsaW5nLmlzQ29udHJvbFBhcnRPZkNyZWF0aW9uUm93KG9Db250cm9sKTtcblx0fVxuXG5cdGlmICghb1RhcmdldFRhYmxlSW5mby5zVGFibGVUYXJnZXRDb2xOYW1lKSB7XG5cdFx0Ly8gaWYgdGhlIGNvbHVtbiBpcyBub3QgcHJlc2VudCBvbiBVSSBvciB0aGUgdGFyZ2V0IGRvZXMgbm90IGhhdmUgYSB0YWJsZSBmaWVsZCBpbiBpdCwgdXNlIExhc3QgQWN0aW9uIGZvciBncm91cGluZ1xuXHRcdGlmICgoYU1lc3NhZ2UgYXMgYW55KS5wZXJzaXN0ZW50ICYmIHNBY3Rpb25OYW1lKSB7XG5cdFx0XHRmblNldEdyb3VwTmFtZShhTWVzc2FnZSwgc0FjdGlvbk5hbWUpO1xuXHRcdFx0c2V0U2VjdGlvbk5hbWVJbkdyb3VwID0gZmFsc2U7XG5cdFx0fVxuXHR9XG5cblx0Y29uc3Qgc3ViVGl0bGUgPSBtZXNzYWdlSGFuZGxpbmcuZ2V0TWVzc2FnZVN1YnRpdGxlKFxuXHRcdGFNZXNzYWdlLFxuXHRcdG9UYXJnZXRUYWJsZUluZm8ub1RhYmxlUm93QmluZGluZ0NvbnRleHRzLFxuXHRcdG9UYXJnZXRUYWJsZUluZm8ub1RhYmxlUm93Q29udGV4dCxcblx0XHRvVGFyZ2V0VGFibGVJbmZvLnNUYWJsZVRhcmdldENvbE5hbWUsXG5cdFx0b1Jlc291cmNlQnVuZGxlLFxuXHRcdG9UYWJsZSxcblx0XHRiSXNDcmVhdGlvblJvd1xuXHQpO1xuXG5cdHJldHVybiB7IG9UYXJnZXRUYWJsZUluZm8sIHN1YlRpdGxlIH07XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiB3aWxsIGNyZWF0ZSB0aGUgc3VidGl0bGUgYmFzZWQgb24gVGFibGUgUm93L0NvbHVtbiBkYXRhLlxuICpcbiAqIEBwYXJhbSBtZXNzYWdlXG4gKiBAcGFyYW0gb1RhYmxlUm93QmluZGluZ0NvbnRleHRzXG4gKiBAcGFyYW0gb1RhYmxlUm93Q29udGV4dFxuICogQHBhcmFtIHNUYWJsZVRhcmdldENvbE5hbWVcbiAqIEBwYXJhbSBvUmVzb3VyY2VCdW5kbGVcbiAqIEBwYXJhbSBvVGFibGVcbiAqIEBwYXJhbSBiSXNDcmVhdGlvblJvd1xuICogQHBhcmFtIG9UYXJnZXRlZENvbnRyb2xcbiAqIEByZXR1cm5zIE1lc3NhZ2Ugc3VidGl0bGUuXG4gKi9cbmZ1bmN0aW9uIGdldE1lc3NhZ2VTdWJ0aXRsZShcblx0bWVzc2FnZTogTWVzc2FnZVdpdGhIZWFkZXIsXG5cdG9UYWJsZVJvd0JpbmRpbmdDb250ZXh0czogQ29udGV4dFtdLFxuXHRvVGFibGVSb3dDb250ZXh0OiBDb250ZXh0IHwgdW5kZWZpbmVkLFxuXHRzVGFibGVUYXJnZXRDb2xOYW1lOiBzdHJpbmcgfCBib29sZWFuLFxuXHRvUmVzb3VyY2VCdW5kbGU6IFJlc291cmNlQnVuZGxlLFxuXHRvVGFibGU6IFRhYmxlLFxuXHRiSXNDcmVhdGlvblJvdzogYm9vbGVhbiB8IHVuZGVmaW5lZCxcblx0b1RhcmdldGVkQ29udHJvbD86IENvbnRyb2xcbik6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQge1xuXHRsZXQgc01lc3NhZ2VTdWJ0aXRsZTtcblx0bGV0IHNSb3dTdWJ0aXRsZVZhbHVlO1xuXHRjb25zdCBzVGFibGVGaXJzdENvbFByb3BlcnR5ID0gKG9UYWJsZSBhcyBhbnkpLmdldFBhcmVudCgpLmdldElkZW50aWZpZXJDb2x1bW4oKTtcblx0Y29uc3Qgb0NvbEZyb21UYWJsZVNldHRpbmdzID0gbWVzc2FnZUhhbmRsaW5nLmZldGNoQ29sdW1uSW5mbyhtZXNzYWdlLCBvVGFibGUpO1xuXHRpZiAoYklzQ3JlYXRpb25Sb3cpIHtcblx0XHRzTWVzc2FnZVN1YnRpdGxlID0gQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXCJUX01FU1NBR0VfSVRFTV9TVUJUSVRMRVwiLCBvUmVzb3VyY2VCdW5kbGUsIFtcblx0XHRcdG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiVF9NRVNTQUdFX0lURU1fU1VCVElUTEVfQ1JFQVRJT05fUk9XX0lORElDQVRPUlwiKSxcblx0XHRcdHNUYWJsZVRhcmdldENvbE5hbWUgPyBzVGFibGVUYXJnZXRDb2xOYW1lIDogKG9Db2xGcm9tVGFibGVTZXR0aW5ncyBhcyBDb2x1bW5XaXRoTGFiZWxUeXBlKS5sYWJlbFxuXHRcdF0pO1xuXHR9IGVsc2Uge1xuXHRcdGNvbnN0IG9UYWJsZUZpcnN0Q29sQmluZGluZ0NvbnRleHRUZXh0QW5ub3RhdGlvbiA9IG1lc3NhZ2VIYW5kbGluZy5nZXRUYWJsZUZpcnN0Q29sQmluZGluZ0NvbnRleHRGb3JUZXh0QW5ub3RhdGlvbihcblx0XHRcdG9UYWJsZSxcblx0XHRcdG9UYWJsZVJvd0NvbnRleHQsXG5cdFx0XHRzVGFibGVGaXJzdENvbFByb3BlcnR5XG5cdFx0KTtcblx0XHRjb25zdCBzVGFibGVGaXJzdENvbFRleHRBbm5vdGF0aW9uUGF0aCA9IG9UYWJsZUZpcnN0Q29sQmluZGluZ0NvbnRleHRUZXh0QW5ub3RhdGlvblxuXHRcdFx0PyBvVGFibGVGaXJzdENvbEJpbmRpbmdDb250ZXh0VGV4dEFubm90YXRpb24uZ2V0T2JqZWN0KFwiJFBhdGhcIilcblx0XHRcdDogdW5kZWZpbmVkO1xuXHRcdGNvbnN0IHNUYWJsZUZpcnN0Q29sVGV4dEFycmFuZ2VtZW50ID1cblx0XHRcdHNUYWJsZUZpcnN0Q29sVGV4dEFubm90YXRpb25QYXRoICYmIG9UYWJsZUZpcnN0Q29sQmluZGluZ0NvbnRleHRUZXh0QW5ub3RhdGlvblxuXHRcdFx0XHQ/IG9UYWJsZUZpcnN0Q29sQmluZGluZ0NvbnRleHRUZXh0QW5ub3RhdGlvbi5nZXRPYmplY3QoXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuVGV4dEFycmFuZ2VtZW50LyRFbnVtTWVtYmVyXCIpXG5cdFx0XHRcdDogdW5kZWZpbmVkO1xuXHRcdGlmIChvVGFibGVSb3dCaW5kaW5nQ29udGV4dHMubGVuZ3RoID4gMCkge1xuXHRcdFx0Ly8gc2V0IFJvdyBzdWJ0aXRsZSB0ZXh0XG5cdFx0XHRpZiAob1RhcmdldGVkQ29udHJvbCkge1xuXHRcdFx0XHQvLyBUaGUgVUkgZXJyb3IgaXMgb24gdGhlIGZpcnN0IGNvbHVtbiwgd2UgdGhlbiBnZXQgdGhlIGNvbnRyb2wgaW5wdXQgYXMgdGhlIHJvdyBpbmRpY2F0b3I6XG5cdFx0XHRcdHNSb3dTdWJ0aXRsZVZhbHVlID0gKG9UYXJnZXRlZENvbnRyb2wgYXMgYW55KS5nZXRWYWx1ZSgpO1xuXHRcdFx0fSBlbHNlIGlmIChvVGFibGVSb3dDb250ZXh0ICYmIHNUYWJsZUZpcnN0Q29sUHJvcGVydHkpIHtcblx0XHRcdFx0c1Jvd1N1YnRpdGxlVmFsdWUgPSBtZXNzYWdlSGFuZGxpbmcuZ2V0VGFibGVGaXJzdENvbFZhbHVlKFxuXHRcdFx0XHRcdHNUYWJsZUZpcnN0Q29sUHJvcGVydHksXG5cdFx0XHRcdFx0b1RhYmxlUm93Q29udGV4dCxcblx0XHRcdFx0XHRzVGFibGVGaXJzdENvbFRleHRBbm5vdGF0aW9uUGF0aCxcblx0XHRcdFx0XHRzVGFibGVGaXJzdENvbFRleHRBcnJhbmdlbWVudFxuXHRcdFx0XHQpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0c1Jvd1N1YnRpdGxlVmFsdWUgPSB1bmRlZmluZWQ7XG5cdFx0XHR9XG5cdFx0XHQvLyBzZXQgdGhlIG1lc3NhZ2Ugc3VidGl0bGVcblx0XHRcdGNvbnN0IG9Db2x1bW5JbmZvOiBDb2x1bW5JbmZvVHlwZSA9IG1lc3NhZ2VIYW5kbGluZy5kZXRlcm1pbmVDb2x1bW5JbmZvKG9Db2xGcm9tVGFibGVTZXR0aW5ncywgb1Jlc291cmNlQnVuZGxlKTtcblx0XHRcdGlmIChzUm93U3VidGl0bGVWYWx1ZSAmJiBzVGFibGVUYXJnZXRDb2xOYW1lKSB7XG5cdFx0XHRcdHNNZXNzYWdlU3VidGl0bGUgPSBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcIlRfTUVTU0FHRV9JVEVNX1NVQlRJVExFXCIsIG9SZXNvdXJjZUJ1bmRsZSwgW1xuXHRcdFx0XHRcdHNSb3dTdWJ0aXRsZVZhbHVlLFxuXHRcdFx0XHRcdHNUYWJsZVRhcmdldENvbE5hbWVcblx0XHRcdFx0XSk7XG5cdFx0XHR9IGVsc2UgaWYgKHNSb3dTdWJ0aXRsZVZhbHVlICYmIG9Db2x1bW5JbmZvLnNDb2x1bW5JbmRpY2F0b3IgPT09IFwiSGlkZGVuXCIpIHtcblx0XHRcdFx0c01lc3NhZ2VTdWJ0aXRsZSA9IGAke29SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiVF9NRVNTQUdFX0dST1VQX0RFU0NSSVBUSU9OX1RBQkxFX1JPV1wiKX06ICR7c1Jvd1N1YnRpdGxlVmFsdWV9LCAke1xuXHRcdFx0XHRcdG9Db2x1bW5JbmZvLnNDb2x1bW5WYWx1ZVxuXHRcdFx0XHR9YDtcblx0XHRcdH0gZWxzZSBpZiAoc1Jvd1N1YnRpdGxlVmFsdWUgJiYgb0NvbHVtbkluZm8uc0NvbHVtbkluZGljYXRvciA9PT0gXCJVbmtub3duXCIpIHtcblx0XHRcdFx0c01lc3NhZ2VTdWJ0aXRsZSA9IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFwiVF9NRVNTQUdFX0lURU1fU1VCVElUTEVcIiwgb1Jlc291cmNlQnVuZGxlLCBbXG5cdFx0XHRcdFx0c1Jvd1N1YnRpdGxlVmFsdWUsXG5cdFx0XHRcdFx0b0NvbHVtbkluZm8uc0NvbHVtblZhbHVlXG5cdFx0XHRcdF0pO1xuXHRcdFx0fSBlbHNlIGlmIChzUm93U3VidGl0bGVWYWx1ZSAmJiBvQ29sdW1uSW5mby5zQ29sdW1uSW5kaWNhdG9yID09PSBcInVuZGVmaW5lZFwiKSB7XG5cdFx0XHRcdHNNZXNzYWdlU3VidGl0bGUgPSBgJHtvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIlRfTUVTU0FHRV9HUk9VUF9ERVNDUklQVElPTl9UQUJMRV9ST1dcIil9OiAke3NSb3dTdWJ0aXRsZVZhbHVlfWA7XG5cdFx0XHR9IGVsc2UgaWYgKCFzUm93U3VidGl0bGVWYWx1ZSAmJiBzVGFibGVUYXJnZXRDb2xOYW1lKSB7XG5cdFx0XHRcdHNNZXNzYWdlU3VidGl0bGUgPSBvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIlRfTUVTU0FHRV9HUk9VUF9ERVNDUklQVElPTl9UQUJMRV9DT0xVTU5cIikgKyBcIjogXCIgKyBzVGFibGVUYXJnZXRDb2xOYW1lO1xuXHRcdFx0fSBlbHNlIGlmICghc1Jvd1N1YnRpdGxlVmFsdWUgJiYgb0NvbHVtbkluZm8uc0NvbHVtbkluZGljYXRvciA9PT0gXCJIaWRkZW5cIikge1xuXHRcdFx0XHRzTWVzc2FnZVN1YnRpdGxlID0gb0NvbHVtbkluZm8uc0NvbHVtblZhbHVlO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0c01lc3NhZ2VTdWJ0aXRsZSA9IG51bGw7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdHNNZXNzYWdlU3VidGl0bGUgPSBudWxsO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBzTWVzc2FnZVN1YnRpdGxlO1xufVxuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gd2lsbCBnZXQgdGhlIGZpcnN0IGNvbHVtbiBmb3IgdGV4dCBBbm5vdGF0aW9uLCB0aGlzIGlzIG5lZWRlZCB0byBzZXQgc3VidGl0bGUgb2YgTWVzc2FnZS5cbiAqXG4gKiBAcGFyYW0gb1RhYmxlXG4gKiBAcGFyYW0gb1RhYmxlUm93Q29udGV4dFxuICogQHBhcmFtIHNUYWJsZUZpcnN0Q29sUHJvcGVydHlcbiAqIEByZXR1cm5zIEJpbmRpbmcgY29udGV4dC5cbiAqL1xuZnVuY3Rpb24gZ2V0VGFibGVGaXJzdENvbEJpbmRpbmdDb250ZXh0Rm9yVGV4dEFubm90YXRpb24oXG5cdG9UYWJsZTogVGFibGUsXG5cdG9UYWJsZVJvd0NvbnRleHQ6IENvbnRleHQgfCB1bmRlZmluZWQsXG5cdHNUYWJsZUZpcnN0Q29sUHJvcGVydHk6IHN0cmluZ1xuKTogQ29udGV4dCB8IG51bGwgfCB1bmRlZmluZWQge1xuXHRsZXQgb0JpbmRpbmdDb250ZXh0O1xuXHRpZiAob1RhYmxlUm93Q29udGV4dCAmJiBzVGFibGVGaXJzdENvbFByb3BlcnR5KSB7XG5cdFx0Y29uc3Qgb01vZGVsID0gb1RhYmxlPy5nZXRNb2RlbCgpO1xuXHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvTW9kZWw/LmdldE1ldGFNb2RlbCgpO1xuXHRcdGNvbnN0IHNNZXRhUGF0aCA9IChvTWV0YU1vZGVsIGFzIGFueSk/LmdldE1ldGFQYXRoKG9UYWJsZVJvd0NvbnRleHQuZ2V0UGF0aCgpKTtcblx0XHRpZiAob01ldGFNb2RlbD8uZ2V0T2JqZWN0KGAke3NNZXRhUGF0aH0vJHtzVGFibGVGaXJzdENvbFByb3BlcnR5fUBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuVGV4dC8kUGF0aGApKSB7XG5cdFx0XHRvQmluZGluZ0NvbnRleHQgPSBvTWV0YU1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KGAke3NNZXRhUGF0aH0vJHtzVGFibGVGaXJzdENvbFByb3BlcnR5fUBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuVGV4dGApO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gb0JpbmRpbmdDb250ZXh0O1xufVxuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gd2lsbCBnZXQgdGhlIHZhbHVlIG9mIGZpcnN0IENvbHVtbiBvZiBUYWJsZSwgd2l0aCBpdHMgdGV4dCBBcnJhbmdlbWVudC5cbiAqXG4gKiBAcGFyYW0gc1RhYmxlRmlyc3RDb2xQcm9wZXJ0eVxuICogQHBhcmFtIG9UYWJsZVJvd0NvbnRleHRcbiAqIEBwYXJhbSBzVGV4dEFubm90YXRpb25QYXRoXG4gKiBAcGFyYW0gc1RleHRBcnJhbmdlbWVudFxuICogQHJldHVybnMgQ29sdW1uIFZhbHVlLlxuICovXG5mdW5jdGlvbiBnZXRUYWJsZUZpcnN0Q29sVmFsdWUoXG5cdHNUYWJsZUZpcnN0Q29sUHJvcGVydHk6IHN0cmluZyxcblx0b1RhYmxlUm93Q29udGV4dDogQ29udGV4dCxcblx0c1RleHRBbm5vdGF0aW9uUGF0aDogc3RyaW5nLFxuXHRzVGV4dEFycmFuZ2VtZW50OiBzdHJpbmdcbik6IHN0cmluZyB7XG5cdGNvbnN0IHNDb2RlVmFsdWUgPSAob1RhYmxlUm93Q29udGV4dCBhcyBhbnkpLmdldFZhbHVlKHNUYWJsZUZpcnN0Q29sUHJvcGVydHkpO1xuXHRsZXQgc1RleHRWYWx1ZTtcblx0bGV0IHNDb21wdXRlZFZhbHVlID0gc0NvZGVWYWx1ZTtcblx0aWYgKHNUZXh0QW5ub3RhdGlvblBhdGgpIHtcblx0XHRpZiAoc1RhYmxlRmlyc3RDb2xQcm9wZXJ0eS5sYXN0SW5kZXhPZihcIi9cIikgPiAwKSB7XG5cdFx0XHQvLyB0aGUgdGFyZ2V0IHByb3BlcnR5IGlzIHJlcGxhY2VkIHdpdGggdGhlIHRleHQgYW5ub3RhdGlvbiBwYXRoXG5cdFx0XHRzVGFibGVGaXJzdENvbFByb3BlcnR5ID0gc1RhYmxlRmlyc3RDb2xQcm9wZXJ0eS5zbGljZSgwLCBzVGFibGVGaXJzdENvbFByb3BlcnR5Lmxhc3RJbmRleE9mKFwiL1wiKSArIDEpO1xuXHRcdFx0c1RhYmxlRmlyc3RDb2xQcm9wZXJ0eSA9IHNUYWJsZUZpcnN0Q29sUHJvcGVydHkuY29uY2F0KHNUZXh0QW5ub3RhdGlvblBhdGgpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRzVGFibGVGaXJzdENvbFByb3BlcnR5ID0gc1RleHRBbm5vdGF0aW9uUGF0aDtcblx0XHR9XG5cdFx0c1RleHRWYWx1ZSA9IChvVGFibGVSb3dDb250ZXh0IGFzIGFueSkuZ2V0VmFsdWUoc1RhYmxlRmlyc3RDb2xQcm9wZXJ0eSk7XG5cdFx0aWYgKHNUZXh0VmFsdWUpIHtcblx0XHRcdGlmIChzVGV4dEFycmFuZ2VtZW50KSB7XG5cdFx0XHRcdGNvbnN0IHNFbnVtTnVtYmVyID0gc1RleHRBcnJhbmdlbWVudC5zbGljZShzVGV4dEFycmFuZ2VtZW50LmluZGV4T2YoXCIvXCIpICsgMSk7XG5cdFx0XHRcdHN3aXRjaCAoc0VudW1OdW1iZXIpIHtcblx0XHRcdFx0XHRjYXNlIFwiVGV4dE9ubHlcIjpcblx0XHRcdFx0XHRcdHNDb21wdXRlZFZhbHVlID0gc1RleHRWYWx1ZTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgXCJUZXh0Rmlyc3RcIjpcblx0XHRcdFx0XHRcdHNDb21wdXRlZFZhbHVlID0gYCR7c1RleHRWYWx1ZX0gKCR7c0NvZGVWYWx1ZX0pYDtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgXCJUZXh0TGFzdFwiOlxuXHRcdFx0XHRcdFx0c0NvbXB1dGVkVmFsdWUgPSBgJHtzQ29kZVZhbHVlfSAoJHtzVGV4dFZhbHVlfSlgO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSBcIlRleHRTZXBhcmF0ZVwiOlxuXHRcdFx0XHRcdFx0c0NvbXB1dGVkVmFsdWUgPSBzQ29kZVZhbHVlO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0c0NvbXB1dGVkVmFsdWUgPSBgJHtzVGV4dFZhbHVlfSAoJHtzQ29kZVZhbHVlfSlgO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHRyZXR1cm4gc0NvbXB1dGVkVmFsdWU7XG59XG5cbi8qKlxuICogVGhlIG1ldGhvZCB0aGF0IGlzIGNhbGxlZCB0byByZXRyaWV2ZSB0aGUgY29sdW1uIGluZm8gZnJvbSB0aGUgYXNzb2NpYXRlZCBtZXNzYWdlIG9mIHRoZSBtZXNzYWdlIHBvcG92ZXIuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSBvTWVzc2FnZSBNZXNzYWdlIG9iamVjdFxuICogQHBhcmFtIG9UYWJsZSBNZGNUYWJsZVxuICogQHJldHVybnMgUmV0dXJucyB0aGUgY29sdW1uIGluZm8uXG4gKi9cbmZ1bmN0aW9uIGZldGNoQ29sdW1uSW5mbyhvTWVzc2FnZTogTWVzc2FnZVdpdGhIZWFkZXIsIG9UYWJsZTogVGFibGUpOiBDb2x1bW4ge1xuXHRjb25zdCBzQ29sTmFtZUZyb21NZXNzYWdlT2JqID0gb01lc3NhZ2U/LmdldFRhcmdldHMoKVswXS5zcGxpdChcIi9cIikucG9wKCk7XG5cdHJldHVybiAob1RhYmxlIGFzIGFueSlcblx0XHQuZ2V0UGFyZW50KClcblx0XHQuZ2V0VGFibGVEZWZpbml0aW9uKClcblx0XHQuY29sdW1ucy5maW5kKGZ1bmN0aW9uIChvQ29sdW1uOiBhbnkpIHtcblx0XHRcdHJldHVybiBvQ29sdW1uLmtleS5zcGxpdChcIjo6XCIpLnBvcCgpID09PSBzQ29sTmFtZUZyb21NZXNzYWdlT2JqO1xuXHRcdH0pO1xufVxuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gZ2V0IHRoZSBDb2x1bW4gZGF0YSBkZXBlbmRpbmcgb24gaXRzIGF2YWlsYWJpbGl0eSBpbiBUYWJsZSwgdGhpcyBpcyBuZWVkZWQgZm9yIHNldHRpbmcgc3VidGl0bGUgb2YgTWVzc2FnZS5cbiAqXG4gKiBAcGFyYW0gb0NvbEZyb21UYWJsZVNldHRpbmdzXG4gKiBAcGFyYW0gb1Jlc291cmNlQnVuZGxlXG4gKiBAcmV0dXJucyBDb2x1bW4gZGF0YS5cbiAqL1xuZnVuY3Rpb24gZGV0ZXJtaW5lQ29sdW1uSW5mbyhvQ29sRnJvbVRhYmxlU2V0dGluZ3M6IGFueSwgb1Jlc291cmNlQnVuZGxlOiBSZXNvdXJjZUJ1bmRsZSk6IENvbHVtbkluZm9UeXBlIHtcblx0Y29uc3Qgb0NvbHVtbkluZm86IGFueSA9IHsgc0NvbHVtbkluZGljYXRvcjogU3RyaW5nLCBzQ29sdW1uVmFsdWU6IFN0cmluZyB9O1xuXHRpZiAob0NvbEZyb21UYWJsZVNldHRpbmdzKSB7XG5cdFx0Ly8gaWYgY29sdW1uIGlzIG5laXRoZXIgaW4gdGFibGUgZGVmaW5pdGlvbiBub3IgcGVyc29uYWxpemF0aW9uLCBzaG93IG9ubHkgcm93IHN1YnRpdGxlIHRleHRcblx0XHRpZiAob0NvbEZyb21UYWJsZVNldHRpbmdzLmF2YWlsYWJpbGl0eSA9PT0gXCJIaWRkZW5cIikge1xuXHRcdFx0b0NvbHVtbkluZm8uc0NvbHVtblZhbHVlID0gdW5kZWZpbmVkO1xuXHRcdFx0b0NvbHVtbkluZm8uc0NvbHVtbkluZGljYXRvciA9IFwidW5kZWZpbmVkXCI7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vaWYgY29sdW1uIGlzIGluIHRhYmxlIHBlcnNvbmFsaXphdGlvbiBidXQgbm90IGluIHRhYmxlIGRlZmluaXRpb24sIHNob3cgQ29sdW1uIChIaWRkZW4pIDogPGNvbE5hbWU+XG5cdFx0XHRvQ29sdW1uSW5mby5zQ29sdW1uVmFsdWUgPSBgJHtvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIlRfTUVTU0FHRV9HUk9VUF9ERVNDUklQVElPTl9UQUJMRV9DT0xVTU5cIil9ICgke29SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFxuXHRcdFx0XHRcIlRfQ09MVU1OX0lORElDQVRPUl9JTl9UQUJMRV9ERUZJTklUSU9OXCJcblx0XHRcdCl9KTogJHtvQ29sRnJvbVRhYmxlU2V0dGluZ3MubGFiZWx9YDtcblx0XHRcdG9Db2x1bW5JbmZvLnNDb2x1bW5JbmRpY2F0b3IgPSBcIkhpZGRlblwiO1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHRvQ29sdW1uSW5mby5zQ29sdW1uVmFsdWUgPSBvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIlRfTUVTU0FHRV9JVEVNX1NVQlRJVExFX0lORElDQVRPUl9VTktOT1dOXCIpO1xuXHRcdG9Db2x1bW5JbmZvLnNDb2x1bW5JbmRpY2F0b3IgPSBcIlVua25vd25cIjtcblx0fVxuXHRyZXR1cm4gb0NvbHVtbkluZm87XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBjaGVjayBpZiBhIGdpdmVuIGNvbnRyb2wgaWQgaXMgYSBwYXJ0IG9mIFRhYmxlLlxuICpcbiAqIEBwYXJhbSBvVGFibGVcbiAqIEBwYXJhbSBzQ29udHJvbElkXG4gKiBAcmV0dXJucyBUcnVlIGlmIGNvbnRyb2wgaXMgcGFydCBvZiB0YWJsZS5cbiAqL1xuZnVuY3Rpb24gaXNDb250cm9sSW5UYWJsZShvVGFibGU6IFRhYmxlLCBzQ29udHJvbElkOiBzdHJpbmcpOiBVSTVFbGVtZW50W10gfCBib29sZWFuIHtcblx0Y29uc3Qgb0NvbnRyb2w6IGFueSA9IENvcmUuYnlJZChzQ29udHJvbElkKTtcblx0aWYgKG9Db250cm9sICYmICFvQ29udHJvbC5pc0EoXCJzYXAudWkudGFibGUuVGFibGVcIikgJiYgIW9Db250cm9sLmlzQShcInNhcC5tLlRhYmxlXCIpKSB7XG5cdFx0cmV0dXJuIG9UYWJsZS5maW5kRWxlbWVudHModHJ1ZSwgZnVuY3Rpb24gKG9FbGVtOiBhbnkpIHtcblx0XHRcdHJldHVybiBvRWxlbS5nZXRJZCgpID09PSBvQ29udHJvbDtcblx0XHR9KTtcblx0fVxuXHRyZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGlzQ29udHJvbFBhcnRPZkNyZWF0aW9uUm93KG9Db250cm9sOiBVSTVFbGVtZW50IHwgdW5kZWZpbmVkKSB7XG5cdGxldCBvUGFyZW50Q29udHJvbCA9IG9Db250cm9sPy5nZXRQYXJlbnQoKTtcblx0d2hpbGUgKFxuXHRcdG9QYXJlbnRDb250cm9sICYmXG5cdFx0IW9QYXJlbnRDb250cm9sPy5pc0EoXCJzYXAudWkudGFibGUuUm93XCIpICYmXG5cdFx0IW9QYXJlbnRDb250cm9sPy5pc0EoXCJzYXAudWkudGFibGUuQ3JlYXRpb25Sb3dcIikgJiZcblx0XHQhb1BhcmVudENvbnRyb2w/LmlzQShcInNhcC5tLkNvbHVtbkxpc3RJdGVtXCIpXG5cdCkge1xuXHRcdG9QYXJlbnRDb250cm9sID0gb1BhcmVudENvbnRyb2wuZ2V0UGFyZW50KCk7XG5cdH1cblxuXHRyZXR1cm4gISFvUGFyZW50Q29udHJvbCAmJiBvUGFyZW50Q29udHJvbC5pc0EoXCJzYXAudWkudGFibGUuQ3JlYXRpb25Sb3dcIik7XG59XG5cbmZ1bmN0aW9uIGdldFRyYW5zbGF0ZWRUZXh0Rm9yTWVzc2FnZURpYWxvZyhzSGlnaGVzdFByaW9yaXR5OiBhbnkpIHtcblx0Y29uc3Qgb1Jlc291cmNlQnVuZGxlID0gQ29yZS5nZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUoXCJzYXAuZmUuY29yZVwiKTtcblx0c3dpdGNoIChzSGlnaGVzdFByaW9yaXR5KSB7XG5cdFx0Y2FzZSBcIkVycm9yXCI6XG5cdFx0XHRyZXR1cm4gb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0NPTU1PTl9TQVBGRV9FUlJPUl9NRVNTQUdFU19QQUdFX1RJVExFX0VSUk9SXCIpO1xuXHRcdGNhc2UgXCJJbmZvcm1hdGlvblwiOlxuXHRcdFx0cmV0dXJuIG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19NRVNTQUdFX0hBTkRMSU5HX1NBUEZFX0VSUk9SX01FU1NBR0VTX1BBR0VfVElUTEVfSU5GT1wiKTtcblx0XHRjYXNlIFwiU3VjY2Vzc1wiOlxuXHRcdFx0cmV0dXJuIG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19NRVNTQUdFX0hBTkRMSU5HX1NBUEZFX0VSUk9SX01FU1NBR0VTX1BBR0VfVElUTEVfU1VDQ0VTU1wiKTtcblx0XHRjYXNlIFwiV2FybmluZ1wiOlxuXHRcdFx0cmV0dXJuIG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19NRVNTQUdFX0hBTkRMSU5HX1NBUEZFX0VSUk9SX01FU1NBR0VTX1BBR0VfVElUTEVfV0FSTklOR1wiKTtcblx0XHRkZWZhdWx0OlxuXHRcdFx0cmV0dXJuIG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19NRVNTQUdFX0hBTkRMSU5HX1NBUEZFX0VSUk9SX01FU1NBR0VTX1BBR0VfVElUTEVcIik7XG5cdH1cbn1cbmZ1bmN0aW9uIHJlbW92ZVVuYm91bmRUcmFuc2l0aW9uTWVzc2FnZXMoKSB7XG5cdHJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcyhmYWxzZSk7XG59XG5mdW5jdGlvbiByZW1vdmVCb3VuZFRyYW5zaXRpb25NZXNzYWdlcyhzUGF0aFRvQmVSZW1vdmVkPzogc3RyaW5nKSB7XG5cdHJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcyh0cnVlLCBzUGF0aFRvQmVSZW1vdmVkKTtcbn1cblxuZnVuY3Rpb24gZ2V0TWVzc2FnZXNGcm9tTWVzc2FnZU1vZGVsKG9NZXNzYWdlTW9kZWw6IGFueSwgc1BhdGhUb0JlUmVtb3ZlZD86IHN0cmluZykge1xuXHRpZiAoc1BhdGhUb0JlUmVtb3ZlZCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIG9NZXNzYWdlTW9kZWwuZ2V0T2JqZWN0KFwiL1wiKTtcblx0fVxuXHRjb25zdCBsaXN0QmluZGluZyA9IG9NZXNzYWdlTW9kZWwuYmluZExpc3QoXCIvXCIpO1xuXG5cdGxpc3RCaW5kaW5nLmZpbHRlcihcblx0XHRuZXcgRmlsdGVyKHtcblx0XHRcdHBhdGg6IFwidGFyZ2V0XCIsXG5cdFx0XHRvcGVyYXRvcjogRmlsdGVyT3BlcmF0b3IuU3RhcnRzV2l0aCxcblx0XHRcdHZhbHVlMTogc1BhdGhUb0JlUmVtb3ZlZFxuXHRcdH0pXG5cdCk7XG5cblx0cmV0dXJuIGxpc3RCaW5kaW5nLmdldEN1cnJlbnRDb250ZXh0cygpLm1hcChmdW5jdGlvbiAob0NvbnRleHQ6IGFueSkge1xuXHRcdHJldHVybiBvQ29udGV4dC5nZXRPYmplY3QoKTtcblx0fSk7XG59XG5mdW5jdGlvbiBnZXRNZXNzYWdlcyhiQm91bmRNZXNzYWdlczogYm9vbGVhbiA9IGZhbHNlLCBiVHJhbnNpdGlvbk9ubHk6IGJvb2xlYW4gPSBmYWxzZSwgc1BhdGhUb0JlUmVtb3ZlZD86IHN0cmluZykge1xuXHRsZXQgaTtcblx0Y29uc3Qgb01lc3NhZ2VNYW5hZ2VyID0gQ29yZS5nZXRNZXNzYWdlTWFuYWdlcigpLFxuXHRcdG9NZXNzYWdlTW9kZWwgPSBvTWVzc2FnZU1hbmFnZXIuZ2V0TWVzc2FnZU1vZGVsKCksXG5cdFx0b1Jlc291cmNlQnVuZGxlID0gQ29yZS5nZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUoXCJzYXAuZmUuY29yZVwiKSxcblx0XHRhVHJhbnNpdGlvbk1lc3NhZ2VzID0gW107XG5cdGxldCBhTWVzc2FnZXM6IGFueVtdID0gW107XG5cdGlmIChiQm91bmRNZXNzYWdlcyAmJiBiVHJhbnNpdGlvbk9ubHkgJiYgc1BhdGhUb0JlUmVtb3ZlZCkge1xuXHRcdGFNZXNzYWdlcyA9IGdldE1lc3NhZ2VzRnJvbU1lc3NhZ2VNb2RlbChvTWVzc2FnZU1vZGVsLCBzUGF0aFRvQmVSZW1vdmVkKTtcblx0fSBlbHNlIHtcblx0XHRhTWVzc2FnZXMgPSBvTWVzc2FnZU1vZGVsLmdldE9iamVjdChcIi9cIik7XG5cdH1cblx0Zm9yIChpID0gMDsgaSA8IGFNZXNzYWdlcy5sZW5ndGg7IGkrKykge1xuXHRcdGlmIChcblx0XHRcdCghYlRyYW5zaXRpb25Pbmx5IHx8IGFNZXNzYWdlc1tpXS5wZXJzaXN0ZW50KSAmJlxuXHRcdFx0KChiQm91bmRNZXNzYWdlcyAmJiBhTWVzc2FnZXNbaV0udGFyZ2V0ICE9PSBcIlwiKSB8fCAoIWJCb3VuZE1lc3NhZ2VzICYmICghYU1lc3NhZ2VzW2ldLnRhcmdldCB8fCBhTWVzc2FnZXNbaV0udGFyZ2V0ID09PSBcIlwiKSkpXG5cdFx0KSB7XG5cdFx0XHRhVHJhbnNpdGlvbk1lc3NhZ2VzLnB1c2goYU1lc3NhZ2VzW2ldKTtcblx0XHR9XG5cdH1cblxuXHRmb3IgKGkgPSAwOyBpIDwgYVRyYW5zaXRpb25NZXNzYWdlcy5sZW5ndGg7IGkrKykge1xuXHRcdGlmIChcblx0XHRcdGFUcmFuc2l0aW9uTWVzc2FnZXNbaV0uY29kZSA9PT0gXCI1MDNcIiAmJlxuXHRcdFx0YVRyYW5zaXRpb25NZXNzYWdlc1tpXS5tZXNzYWdlICE9PSBcIlwiICYmXG5cdFx0XHRhVHJhbnNpdGlvbk1lc3NhZ2VzW2ldLm1lc3NhZ2UuaW5kZXhPZihvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfTUVTU0FHRV9IQU5ETElOR19TQVBGRV81MDNfQkFDS0VORF9QUkVGSVhcIikpID09PSAtMVxuXHRcdCkge1xuXHRcdFx0YVRyYW5zaXRpb25NZXNzYWdlc1tpXS5tZXNzYWdlID0gYFxcbiR7b1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX01FU1NBR0VfSEFORExJTkdfU0FQRkVfNTAzX0JBQ0tFTkRfUFJFRklYXCIpfSR7XG5cdFx0XHRcdGFUcmFuc2l0aW9uTWVzc2FnZXNbaV0ubWVzc2FnZVxuXHRcdFx0fWA7XG5cdFx0fVxuXHR9XG5cdC8vRmlsdGVyaW5nIG1lc3NhZ2VzIGFnYWluIGhlcmUgdG8gYXZvaWQgc2hvd2luZyBwdXJlIHRlY2huaWNhbCBtZXNzYWdlcyByYWlzZWQgYnkgdGhlIG1vZGVsXG5cdGNvbnN0IGJhY2tlbmRNZXNzYWdlczogYW55ID0gW107XG5cdGZvciAoaSA9IDA7IGkgPCBhVHJhbnNpdGlvbk1lc3NhZ2VzLmxlbmd0aDsgaSsrKSB7XG5cdFx0aWYgKFxuXHRcdFx0KGFUcmFuc2l0aW9uTWVzc2FnZXNbaV0udGVjaG5pY2FsRGV0YWlscyAmJlxuXHRcdFx0XHQoKGFUcmFuc2l0aW9uTWVzc2FnZXNbaV0udGVjaG5pY2FsRGV0YWlscy5vcmlnaW5hbE1lc3NhZ2UgIT09IHVuZGVmaW5lZCAmJlxuXHRcdFx0XHRcdGFUcmFuc2l0aW9uTWVzc2FnZXNbaV0udGVjaG5pY2FsRGV0YWlscy5vcmlnaW5hbE1lc3NhZ2UgIT09IG51bGwpIHx8XG5cdFx0XHRcdFx0KGFUcmFuc2l0aW9uTWVzc2FnZXNbaV0udGVjaG5pY2FsRGV0YWlscy5odHRwU3RhdHVzICE9PSB1bmRlZmluZWQgJiZcblx0XHRcdFx0XHRcdGFUcmFuc2l0aW9uTWVzc2FnZXNbaV0udGVjaG5pY2FsRGV0YWlscy5odHRwU3RhdHVzICE9PSBudWxsKSkpIHx8XG5cdFx0XHRhVHJhbnNpdGlvbk1lc3NhZ2VzW2ldLmNvZGVcblx0XHQpIHtcblx0XHRcdGJhY2tlbmRNZXNzYWdlcy5wdXNoKGFUcmFuc2l0aW9uTWVzc2FnZXNbaV0pO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gYmFja2VuZE1lc3NhZ2VzO1xufVxuZnVuY3Rpb24gcmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzKGJCb3VuZE1lc3NhZ2VzOiBhbnksIHNQYXRoVG9CZVJlbW92ZWQ/OiBzdHJpbmcpIHtcblx0Y29uc3QgYU1lc3NhZ2VzVG9CZURlbGV0ZWQgPSBnZXRNZXNzYWdlcyhiQm91bmRNZXNzYWdlcywgdHJ1ZSwgc1BhdGhUb0JlUmVtb3ZlZCk7XG5cblx0aWYgKGFNZXNzYWdlc1RvQmVEZWxldGVkLmxlbmd0aCA+IDApIHtcblx0XHRDb3JlLmdldE1lc3NhZ2VNYW5hZ2VyKCkucmVtb3ZlTWVzc2FnZXMoYU1lc3NhZ2VzVG9CZURlbGV0ZWQpO1xuXHR9XG59XG4vL1RPRE86IFRoaXMgbXVzdCBiZSBtb3ZlZCBvdXQgb2YgbWVzc2FnZSBoYW5kbGluZ1xuZnVuY3Rpb24gc2V0TWVzc2FnZVN1YnRpdGxlKG9UYWJsZTogVGFibGUsIGFDb250ZXh0czogQ29udGV4dFtdLCBtZXNzYWdlOiBNZXNzYWdlV2l0aEhlYWRlcikge1xuXHRjb25zdCBzdWJ0aXRsZUNvbHVtbiA9IChvVGFibGUuZ2V0UGFyZW50KCkgYXMgYW55KS5nZXRJZGVudGlmaWVyQ29sdW1uKCk7XG5cdGNvbnN0IGVycm9yQ29udGV4dCA9IGFDb250ZXh0cy5maW5kKGZ1bmN0aW9uIChvQ29udGV4dDogYW55KSB7XG5cdFx0cmV0dXJuIG1lc3NhZ2UuZ2V0VGFyZ2V0cygpWzBdLmluZGV4T2Yob0NvbnRleHQuZ2V0UGF0aCgpKSAhPT0gLTE7XG5cdH0pO1xuXHRtZXNzYWdlLmFkZGl0aW9uYWxUZXh0ID0gZXJyb3JDb250ZXh0ID8gZXJyb3JDb250ZXh0LmdldE9iamVjdCgpW3N1YnRpdGxlQ29sdW1uXSA6IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBUaGUgbWV0aG9kIHJldHJpZXZlcyB0aGUgdmlzaWJsZSBzZWN0aW9ucyBmcm9tIGFuIG9iamVjdCBwYWdlLlxuICpcbiAqIEBwYXJhbSBvT2JqZWN0UGFnZUxheW91dCBUaGUgb2JqZWN0UGFnZUxheW91dCBvYmplY3QgZm9yIHdoaWNoIHdlIHdhbnQgdG8gcmV0cmlldmUgdGhlIHZpc2libGUgc2VjdGlvbnMuXG4gKiBAcmV0dXJucyBBcnJheSBvZiB2aXNpYmxlIHNlY3Rpb25zLlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gZ2V0VmlzaWJsZVNlY3Rpb25zRnJvbU9iamVjdFBhZ2VMYXlvdXQob09iamVjdFBhZ2VMYXlvdXQ6IENvbnRyb2wgfCBPYmplY3RQYWdlTGF5b3V0KSB7XG5cdHJldHVybiAob09iamVjdFBhZ2VMYXlvdXQgYXMgT2JqZWN0UGFnZUxheW91dCkuZ2V0U2VjdGlvbnMoKS5maWx0ZXIoZnVuY3Rpb24gKG9TZWN0aW9uOiBPYmplY3RQYWdlU2VjdGlvbikge1xuXHRcdHJldHVybiBvU2VjdGlvbi5nZXRWaXNpYmxlKCk7XG5cdH0pO1xufVxuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gY2hlY2tzIGlmIGNvbnRyb2wgaWRzIGZyb20gbWVzc2FnZSBhcmUgYSBwYXJ0IG9mIGEgZ2l2ZW4gc3Vic2VjdGlvbi5cbiAqXG4gKiBAcGFyYW0gc3ViU2VjdGlvblxuICogQHBhcmFtIG9NZXNzYWdlT2JqZWN0XG4gKiBAcmV0dXJucyBTdWJTZWN0aW9uIG1hdGNoaW5nIGNvbnRyb2wgaWRzLlxuICovXG5mdW5jdGlvbiBnZXRDb250cm9sRnJvbU1lc3NhZ2VSZWxhdGluZ1RvU3ViU2VjdGlvbihzdWJTZWN0aW9uOiBPYmplY3RQYWdlU3ViU2VjdGlvbiwgb01lc3NhZ2VPYmplY3Q6IE1lc3NhZ2VXaXRoSGVhZGVyKTogVUk1RWxlbWVudFtdIHtcblx0cmV0dXJuIHN1YlNlY3Rpb25cblx0XHQuZmluZEVsZW1lbnRzKHRydWUsIChvRWxlbTogYW55KSA9PiB7XG5cdFx0XHRyZXR1cm4gZm5GaWx0ZXJVcG9uSWRzKG9NZXNzYWdlT2JqZWN0LmdldENvbnRyb2xJZHMoKSwgb0VsZW0pO1xuXHRcdH0pXG5cdFx0LnNvcnQoZnVuY3Rpb24gKGE6IGFueSwgYjogYW55KSB7XG5cdFx0XHQvLyBjb250cm9scyBhcmUgc29ydGVkIGluIG9yZGVyIHRvIGhhdmUgdGhlIHRhYmxlIG9uIHRvcCBvZiB0aGUgYXJyYXlcblx0XHRcdC8vIGl0IHdpbGwgaGVscCB0byBjb21wdXRlIHRoZSBzdWJ0aXRsZSBvZiB0aGUgbWVzc2FnZSBiYXNlZCBvbiB0aGUgdHlwZSBvZiByZWxhdGVkIGNvbnRyb2xzXG5cdFx0XHRpZiAoYS5pc0EoXCJzYXAudWkubWRjLlRhYmxlXCIpICYmICFiLmlzQShcInNhcC51aS5tZGMuVGFibGVcIikpIHtcblx0XHRcdFx0cmV0dXJuIC0xO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIDE7XG5cdFx0fSk7XG59XG5cbmZ1bmN0aW9uIGdldFRhYmxlQ29sUHJvcGVydHkob1RhYmxlOiBDb250cm9sLCBvTWVzc2FnZU9iamVjdDogTWVzc2FnZVdpdGhIZWFkZXIsIG9Db250ZXh0UGF0aD86IGFueSkge1xuXHQvL3RoaXMgZnVuY3Rpb24gZXNjYXBlcyBhIHN0cmluZyB0byB1c2UgaXQgYXMgYSByZWdleFxuXHRjb25zdCBmblJlZ0V4cGVzY2FwZSA9IGZ1bmN0aW9uIChzOiBzdHJpbmcpIHtcblx0XHRyZXR1cm4gcy5yZXBsYWNlKC9bLVxcL1xcXFxeJCorPy4oKXxbXFxde31dL2csIFwiXFxcXCQmXCIpO1xuXHR9O1xuXHQvLyBiYXNlZCBvbiB0aGUgdGFyZ2V0IHBhdGggb2YgdGhlIG1lc3NhZ2Ugd2UgcmV0cmlldmUgdGhlIHByb3BlcnR5IG5hbWUuXG5cdC8vIHRvIGFjaGlldmUgaXQgd2UgcmVtb3ZlIHRoZSBiaW5kaW5nQ29udGV4dCBwYXRoIGFuZCB0aGUgcm93IGJpbmRpbmcgcGF0aCBmcm9tIHRoZSB0YXJnZXRcblx0aWYgKCFvQ29udGV4dFBhdGgpIHtcblx0XHRvQ29udGV4dFBhdGggPSBuZXcgUmVnRXhwKFxuXHRcdFx0YCR7Zm5SZWdFeHBlc2NhcGUoYCR7b1RhYmxlLmdldEJpbmRpbmdDb250ZXh0KCk/LmdldFBhdGgoKX0vJHsob1RhYmxlIGFzIFRhYmxlKS5nZXRSb3dCaW5kaW5nKCkuZ2V0UGF0aCgpfWApfVxcXFwoLipcXFxcKS9gXG5cdFx0KTtcblx0fVxuXHRyZXR1cm4gb01lc3NhZ2VPYmplY3QuZ2V0VGFyZ2V0cygpWzBdLnJlcGxhY2Uob0NvbnRleHRQYXRoLCBcIlwiKTtcbn1cblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIGdpdmVzIHRoZSBjb2x1bW4gaW5mb3JtYXRpb24gaWYgaXQgbWF0Y2hlcyB3aXRoIHRoZSBwcm9wZXJ0eSBuYW1lIGZyb20gdGFyZ2V0IG9mIG1lc3NhZ2UuXG4gKlxuICogQHBhcmFtIG9UYWJsZVxuICogQHBhcmFtIHNUYWJsZVRhcmdldENvbFByb3BlcnR5XG4gKiBAcmV0dXJucyBDb2x1bW4gbmFtZSBhbmQgcHJvcGVydHkuXG4gKi9cbmZ1bmN0aW9uIGdldFRhYmxlQ29sSW5mbyhvVGFibGU6IENvbnRyb2wsIHNUYWJsZVRhcmdldENvbFByb3BlcnR5OiBzdHJpbmcpIHtcblx0bGV0IHNUYWJsZVRhcmdldENvbE5hbWU6IHN0cmluZztcblx0bGV0IG9UYWJsZVRhcmdldENvbCA9IChvVGFibGUgYXMgVGFibGUpLmdldENvbHVtbnMoKS5maW5kKGZ1bmN0aW9uIChjb2x1bW46IGFueSkge1xuXHRcdHJldHVybiBjb2x1bW4uZ2V0RGF0YVByb3BlcnR5KCkgPT0gc1RhYmxlVGFyZ2V0Q29sUHJvcGVydHk7XG5cdH0pO1xuXHRpZiAoIW9UYWJsZVRhcmdldENvbCkge1xuXHRcdC8qIElmIHRoZSB0YXJnZXQgY29sdW1uIGlzIG5vdCBmb3VuZCwgd2UgY2hlY2sgZm9yIGEgY3VzdG9tIGNvbHVtbiAqL1xuXHRcdGNvbnN0IG9DdXN0b21Db2x1bW4gPSAob1RhYmxlIGFzIFRhYmxlKVxuXHRcdFx0LmdldENvbnRyb2xEZWxlZ2F0ZSgpXG5cdFx0XHQuZ2V0Q29sdW1uc0ZvcihvVGFibGUpXG5cdFx0XHQuZmluZChmdW5jdGlvbiAob0NvbHVtbjogYW55KSB7XG5cdFx0XHRcdGlmICghIW9Db2x1bW4udGVtcGxhdGUgJiYgb0NvbHVtbi5wcm9wZXJ0eUluZm9zKSB7XG5cdFx0XHRcdFx0cmV0dXJuIChcblx0XHRcdFx0XHRcdG9Db2x1bW4ucHJvcGVydHlJbmZvc1swXSA9PT0gc1RhYmxlVGFyZ2V0Q29sUHJvcGVydHkgfHxcblx0XHRcdFx0XHRcdG9Db2x1bW4ucHJvcGVydHlJbmZvc1swXS5yZXBsYWNlKFwiUHJvcGVydHk6OlwiLCBcIlwiKSA9PT0gc1RhYmxlVGFyZ2V0Q29sUHJvcGVydHlcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0aWYgKG9DdXN0b21Db2x1bW4pIHtcblx0XHRcdG9UYWJsZVRhcmdldENvbCA9IG9DdXN0b21Db2x1bW47XG5cdFx0XHRzVGFibGVUYXJnZXRDb2xQcm9wZXJ0eSA9IChvVGFibGVUYXJnZXRDb2wgYXMgYW55KT8ubmFtZTtcblxuXHRcdFx0c1RhYmxlVGFyZ2V0Q29sTmFtZSA9IChvVGFibGUgYXMgYW55KVxuXHRcdFx0XHQuZ2V0Q29sdW1ucygpXG5cdFx0XHRcdC5maW5kKGZ1bmN0aW9uIChvQ29sdW1uOiBhbnkpIHtcblx0XHRcdFx0XHRyZXR1cm4gc1RhYmxlVGFyZ2V0Q29sUHJvcGVydHkgPT09IG9Db2x1bW4uZ2V0RGF0YVByb3BlcnR5KCk7XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5nZXRIZWFkZXIoKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0LyogSWYgdGhlIHRhcmdldCBjb2x1bW4gaXMgbm90IGZvdW5kLCB3ZSBjaGVjayBmb3IgYSBmaWVsZCBncm91cCAqL1xuXHRcdFx0Y29uc3QgYUNvbHVtbnMgPSAob1RhYmxlIGFzIFRhYmxlKS5nZXRDb250cm9sRGVsZWdhdGUoKS5nZXRDb2x1bW5zRm9yKG9UYWJsZSk7XG5cdFx0XHRvVGFibGVUYXJnZXRDb2wgPSBhQ29sdW1ucy5maW5kKGZ1bmN0aW9uIChvQ29sdW1uOiBhbnkpIHtcblx0XHRcdFx0aWYgKG9Db2x1bW4ua2V5LmluZGV4T2YoXCI6OkZpZWxkR3JvdXA6OlwiKSAhPT0gLTEpIHtcblx0XHRcdFx0XHRyZXR1cm4gb0NvbHVtbi5wcm9wZXJ0eUluZm9zPy5maW5kKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdHJldHVybiBhQ29sdW1ucy5maW5kKGZ1bmN0aW9uICh0YWJsZUNvbHVtbjogYW55KSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiB0YWJsZUNvbHVtbi5yZWxhdGl2ZVBhdGggPT09IHNUYWJsZVRhcmdldENvbFByb3BlcnR5O1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdFx0LyogY2hlY2sgaWYgdGhlIGNvbHVtbiB3aXRoIHRoZSBmaWVsZCBncm91cCBpcyB2aXNpYmxlIGluIHRoZSB0YWJsZTogKi9cblx0XHRcdGxldCBiSXNUYWJsZVRhcmdldENvbFZpc2libGUgPSBmYWxzZTtcblx0XHRcdGlmIChvVGFibGVUYXJnZXRDb2wgJiYgKG9UYWJsZVRhcmdldENvbCBhcyBhbnkpLmxhYmVsKSB7XG5cdFx0XHRcdGJJc1RhYmxlVGFyZ2V0Q29sVmlzaWJsZSA9IChvVGFibGUgYXMgVGFibGUpLmdldENvbHVtbnMoKS5zb21lKGZ1bmN0aW9uIChjb2x1bW46IGFueSkge1xuXHRcdFx0XHRcdHJldHVybiBjb2x1bW4uZ2V0SGVhZGVyKCkgPT09IChvVGFibGVUYXJnZXRDb2wgYXMgYW55KS5sYWJlbDtcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0XHRzVGFibGVUYXJnZXRDb2xOYW1lID0gYklzVGFibGVUYXJnZXRDb2xWaXNpYmxlICYmIChvVGFibGVUYXJnZXRDb2wgYXMgYW55KS5sYWJlbDtcblx0XHRcdHNUYWJsZVRhcmdldENvbFByb3BlcnR5ID0gYklzVGFibGVUYXJnZXRDb2xWaXNpYmxlICYmIChvVGFibGVUYXJnZXRDb2wgYXMgYW55KS5rZXk7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdHNUYWJsZVRhcmdldENvbE5hbWUgPSBvVGFibGVUYXJnZXRDb2wgJiYgb1RhYmxlVGFyZ2V0Q29sLmdldEhlYWRlcigpO1xuXHR9XG5cdHJldHVybiB7IHNUYWJsZVRhcmdldENvbE5hbWU6IHNUYWJsZVRhcmdldENvbE5hbWUsIHNUYWJsZVRhcmdldENvbFByb3BlcnR5OiBzVGFibGVUYXJnZXRDb2xQcm9wZXJ0eSB9O1xufVxuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gZ2l2ZXMgVGFibGUgYW5kIGNvbHVtbiBpbmZvIGlmIGFueSBvZiBpdCBtYXRjaGVzIHRoZSB0YXJnZXQgZnJvbSBNZXNzYWdlLlxuICpcbiAqIEBwYXJhbSBvVGFibGVcbiAqIEBwYXJhbSBvTWVzc2FnZU9iamVjdFxuICogQHBhcmFtIG9FbGVtZW50XG4gKiBAcGFyYW0gb1Jvd0JpbmRpbmdcbiAqIEByZXR1cm5zIFRhYmxlIGluZm8gbWF0Y2hpbmcgdGhlIG1lc3NhZ2UgdGFyZ2V0LlxuICovXG5mdW5jdGlvbiBnZXRUYWJsZUFuZFRhcmdldEluZm8ob1RhYmxlOiBUYWJsZSwgb01lc3NhZ2VPYmplY3Q6IE1lc3NhZ2VXaXRoSGVhZGVyLCBvRWxlbWVudDogYW55LCBvUm93QmluZGluZzogQmluZGluZyk6IFRhcmdldFRhYmxlSW5mb1R5cGUge1xuXHRjb25zdCBvVGFyZ2V0VGFibGVJbmZvOiBhbnkgPSB7fTtcblx0b1RhcmdldFRhYmxlSW5mby5zVGFibGVUYXJnZXRDb2xQcm9wZXJ0eSA9IGdldFRhYmxlQ29sUHJvcGVydHkob1RhYmxlLCBvTWVzc2FnZU9iamVjdCk7XG5cdGNvbnN0IG9UYWJsZUNvbEluZm8gPSBnZXRUYWJsZUNvbEluZm8ob1RhYmxlLCBvVGFyZ2V0VGFibGVJbmZvLnNUYWJsZVRhcmdldENvbFByb3BlcnR5KTtcblx0b1RhcmdldFRhYmxlSW5mby5vVGFibGVSb3dCaW5kaW5nQ29udGV4dHMgPSBvRWxlbWVudC5pc0EoXCJzYXAudWkudGFibGUuVGFibGVcIilcblx0XHQ/IChvUm93QmluZGluZyBhcyBPRGF0YUxpc3RCaW5kaW5nKS5nZXRDb250ZXh0cygpXG5cdFx0OiAob1Jvd0JpbmRpbmcgYXMgT0RhdGFMaXN0QmluZGluZykuZ2V0Q3VycmVudENvbnRleHRzKCk7XG5cdG9UYXJnZXRUYWJsZUluZm8uc1RhYmxlVGFyZ2V0Q29sTmFtZSA9IG9UYWJsZUNvbEluZm8uc1RhYmxlVGFyZ2V0Q29sTmFtZTtcblx0b1RhcmdldFRhYmxlSW5mby5zVGFibGVUYXJnZXRDb2xQcm9wZXJ0eSA9IG9UYWJsZUNvbEluZm8uc1RhYmxlVGFyZ2V0Q29sUHJvcGVydHk7XG5cdG9UYXJnZXRUYWJsZUluZm8ub1RhYmxlUm93Q29udGV4dCA9IG9UYXJnZXRUYWJsZUluZm8ub1RhYmxlUm93QmluZGluZ0NvbnRleHRzLmZpbmQoZnVuY3Rpb24gKHJvd0NvbnRleHQ6IGFueSkge1xuXHRcdHJldHVybiByb3dDb250ZXh0ICYmIG9NZXNzYWdlT2JqZWN0LmdldFRhcmdldHMoKVswXS5pbmRleE9mKHJvd0NvbnRleHQuZ2V0UGF0aCgpKSA9PT0gMDtcblx0fSk7XG5cdHJldHVybiBvVGFyZ2V0VGFibGVJbmZvO1xufVxuXG4vKipcbiAqXG4gKiBAcGFyYW0gYUNvbnRyb2xJZHNcbiAqIEBwYXJhbSBvSXRlbVxuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgaXRlbSBtYXRjaGVzIG9uZSBvZiB0aGUgY29udHJvbHNcbiAqL1xuZnVuY3Rpb24gZm5GaWx0ZXJVcG9uSWRzKGFDb250cm9sSWRzOiBzdHJpbmdbXSwgb0l0ZW06IFVJNUVsZW1lbnQpOiBib29sZWFuIHtcblx0cmV0dXJuIGFDb250cm9sSWRzLnNvbWUoZnVuY3Rpb24gKHNDb250cm9sSWQpIHtcblx0XHRpZiAoc0NvbnRyb2xJZCA9PT0gb0l0ZW0uZ2V0SWQoKSkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHRcdHJldHVybiBmYWxzZTtcblx0fSk7XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBnaXZlcyB0aGUgZ3JvdXAgbmFtZSBoYXZpbmcgc2VjdGlvbiBhbmQgc3Vic2VjdGlvbiBkYXRhLlxuICpcbiAqIEBwYXJhbSBzZWN0aW9uXG4gKiBAcGFyYW0gc3ViU2VjdGlvblxuICogQHBhcmFtIGJNdWx0aXBsZVN1YlNlY3Rpb25zXG4gKiBAcGFyYW0gb1RhcmdldFRhYmxlSW5mb1xuICogQHBhcmFtIG9SZXNvdXJjZUJ1bmRsZVxuICogQHJldHVybnMgR3JvdXAgbmFtZS5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlU2VjdGlvbkdyb3VwTmFtZShcblx0c2VjdGlvbjogT2JqZWN0UGFnZVNlY3Rpb24sXG5cdHN1YlNlY3Rpb246IE9iamVjdFBhZ2VTdWJTZWN0aW9uLFxuXHRiTXVsdGlwbGVTdWJTZWN0aW9uczogYm9vbGVhbixcblx0b1RhcmdldFRhYmxlSW5mbzogVGFyZ2V0VGFibGVJbmZvVHlwZSxcblx0b1Jlc291cmNlQnVuZGxlOiBSZXNvdXJjZUJ1bmRsZVxuKTogc3RyaW5nIHtcblx0cmV0dXJuIChcblx0XHRzZWN0aW9uLmdldFRpdGxlKCkgK1xuXHRcdChzdWJTZWN0aW9uLmdldFRpdGxlKCkgJiYgYk11bHRpcGxlU3ViU2VjdGlvbnMgPyBgLCAke3N1YlNlY3Rpb24uZ2V0VGl0bGUoKX1gIDogXCJcIikgK1xuXHRcdChvVGFyZ2V0VGFibGVJbmZvID8gYCwgJHtvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIlRfTUVTU0FHRV9HUk9VUF9USVRMRV9UQUJMRV9ERU5PTUlOQVRPUlwiKX06ICR7b1RhcmdldFRhYmxlSW5mby50YWJsZUhlYWRlcn1gIDogXCJcIilcblx0KTtcbn1cblxuZnVuY3Rpb24gYklzT3JwaGFuRWxlbWVudChvRWxlbWVudDogVUk1RWxlbWVudCwgYUVsZW1lbnRzOiBVSTVFbGVtZW50W10pOiBib29sZWFuIHtcblx0cmV0dXJuICFhRWxlbWVudHMuc29tZShmdW5jdGlvbiAob0VsZW06IGFueSkge1xuXHRcdGxldCBvUGFyZW50RWxlbWVudCA9IG9FbGVtZW50LmdldFBhcmVudCgpO1xuXHRcdHdoaWxlIChvUGFyZW50RWxlbWVudCAmJiBvUGFyZW50RWxlbWVudCAhPT0gb0VsZW0pIHtcblx0XHRcdG9QYXJlbnRFbGVtZW50ID0gb1BhcmVudEVsZW1lbnQuZ2V0UGFyZW50KCk7XG5cdFx0fVxuXHRcdHJldHVybiBvUGFyZW50RWxlbWVudCA/IHRydWUgOiBmYWxzZTtcblx0fSk7XG59XG5cbi8qKlxuICogU3RhdGljIGZ1bmN0aW9ucyBmb3IgRmlvcmkgTWVzc2FnZSBIYW5kbGluZ1xuICpcbiAqIEBuYW1lc3BhY2VcbiAqIEBhbGlhcyBzYXAuZmUuY29yZS5hY3Rpb25zLm1lc3NhZ2VIYW5kbGluZ1xuICogQHByaXZhdGVcbiAqIEBleHBlcmltZW50YWwgVGhpcyBtb2R1bGUgaXMgb25seSBmb3IgZXhwZXJpbWVudGFsIHVzZSEgPGJyLz48Yj5UaGlzIGlzIG9ubHkgYSBQT0MgYW5kIG1heWJlIGRlbGV0ZWQ8L2I+XG4gKiBAc2luY2UgMS41Ni4wXG4gKi9cbmNvbnN0IG1lc3NhZ2VIYW5kbGluZzogbWVzc2FnZUhhbmRsaW5nVHlwZSA9IHtcblx0Z2V0TWVzc2FnZXM6IGdldE1lc3NhZ2VzLFxuXHRzaG93VW5ib3VuZE1lc3NhZ2VzOiBzaG93VW5ib3VuZE1lc3NhZ2VzLFxuXHRyZW1vdmVVbmJvdW5kVHJhbnNpdGlvbk1lc3NhZ2VzOiByZW1vdmVVbmJvdW5kVHJhbnNpdGlvbk1lc3NhZ2VzLFxuXHRyZW1vdmVCb3VuZFRyYW5zaXRpb25NZXNzYWdlczogcmVtb3ZlQm91bmRUcmFuc2l0aW9uTWVzc2FnZXMsXG5cdG1vZGlmeUVUYWdNZXNzYWdlc09ubHk6IGZuTW9kaWZ5RVRhZ01lc3NhZ2VzT25seSxcblx0Z2V0UmV0cnlBZnRlck1lc3NhZ2U6IGdldFJldHJ5QWZ0ZXJNZXNzYWdlLFxuXHRwcmVwYXJlTWVzc2FnZVZpZXdGb3JEaWFsb2c6IHByZXBhcmVNZXNzYWdlVmlld0ZvckRpYWxvZyxcblx0c2V0TWVzc2FnZVN1YnRpdGxlOiBzZXRNZXNzYWdlU3VidGl0bGUsXG5cdGdldFZpc2libGVTZWN0aW9uc0Zyb21PYmplY3RQYWdlTGF5b3V0OiBnZXRWaXNpYmxlU2VjdGlvbnNGcm9tT2JqZWN0UGFnZUxheW91dCxcblx0Z2V0Q29udHJvbEZyb21NZXNzYWdlUmVsYXRpbmdUb1N1YlNlY3Rpb246IGdldENvbnRyb2xGcm9tTWVzc2FnZVJlbGF0aW5nVG9TdWJTZWN0aW9uLFxuXHRmbkZpbHRlclVwb25JZHM6IGZuRmlsdGVyVXBvbklkcyxcblx0Z2V0VGFibGVBbmRUYXJnZXRJbmZvOiBnZXRUYWJsZUFuZFRhcmdldEluZm8sXG5cdGNyZWF0ZVNlY3Rpb25Hcm91cE5hbWU6IGNyZWF0ZVNlY3Rpb25Hcm91cE5hbWUsXG5cdGJJc09ycGhhbkVsZW1lbnQ6IGJJc09ycGhhbkVsZW1lbnQsXG5cdGdldExhc3RBY3Rpb25UZXh0QW5kQWN0aW9uTmFtZTogZ2V0TGFzdEFjdGlvblRleHRBbmRBY3Rpb25OYW1lLFxuXHRnZXRUYWJsZUNvbHVtbkRhdGFBbmRTZXRTdWJ0aWxlOiBnZXRUYWJsZUNvbHVtbkRhdGFBbmRTZXRTdWJ0aWxlLFxuXHRnZXRUYWJsZUNvbEluZm86IGdldFRhYmxlQ29sSW5mbyxcblx0Z2V0VGFibGVDb2xQcm9wZXJ0eTogZ2V0VGFibGVDb2xQcm9wZXJ0eSxcblx0Z2V0TWVzc2FnZVN1YnRpdGxlOiBnZXRNZXNzYWdlU3VidGl0bGUsXG5cdGRldGVybWluZUNvbHVtbkluZm86IGRldGVybWluZUNvbHVtbkluZm8sXG5cdGZldGNoQ29sdW1uSW5mbzogZmV0Y2hDb2x1bW5JbmZvLFxuXHRnZXRUYWJsZUZpcnN0Q29sQmluZGluZ0NvbnRleHRGb3JUZXh0QW5ub3RhdGlvbjogZ2V0VGFibGVGaXJzdENvbEJpbmRpbmdDb250ZXh0Rm9yVGV4dEFubm90YXRpb24sXG5cdGdldE1lc3NhZ2VSYW5rOiBnZXRNZXNzYWdlUmFuayxcblx0Zm5DYWxsYmFja1NldEdyb3VwTmFtZTogZm5DYWxsYmFja1NldEdyb3VwTmFtZSxcblx0Z2V0VGFibGVGaXJzdENvbFZhbHVlOiBnZXRUYWJsZUZpcnN0Q29sVmFsdWUsXG5cdHNldEdyb3VwTmFtZU9QRGlzcGxheU1vZGU6IHNldEdyb3VwTmFtZU9QRGlzcGxheU1vZGUsXG5cdHVwZGF0ZU1lc3NhZ2VPYmplY3RHcm91cE5hbWU6IHVwZGF0ZU1lc3NhZ2VPYmplY3RHcm91cE5hbWUsXG5cdHNldEdyb3VwTmFtZUxSVGFibGU6IHNldEdyb3VwTmFtZUxSVGFibGUsXG5cdGlzQ29udHJvbEluVGFibGU6IGlzQ29udHJvbEluVGFibGUsXG5cdGlzQ29udHJvbFBhcnRPZkNyZWF0aW9uUm93OiBpc0NvbnRyb2xQYXJ0T2ZDcmVhdGlvblJvd1xufTtcblxuZXhwb3J0IGRlZmF1bHQgbWVzc2FnZUhhbmRsaW5nO1xuIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFBQTtBQUFBOzs7O0VBZ0NBLE1BQU1BLFdBQVcsR0FBR0MsT0FBTyxDQUFDRCxXQUFXO0VBQ3ZDLElBQUlF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