@sapui5/sap.fe.core 1.102.0 → 1.103.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 (311) hide show
  1. package/package.json +5 -5
  2. package/src/sap/fe/core/.library +1 -1
  3. package/src/sap/fe/core/AppComponent.js +62 -26
  4. package/src/sap/fe/core/AppComponent.ts +56 -40
  5. package/src/sap/fe/core/AppStateHandler.js +10 -10
  6. package/src/sap/fe/core/AppStateHandler.ts +9 -9
  7. package/src/sap/fe/core/BaseController.js +11 -9
  8. package/src/sap/fe/core/BaseController.ts +15 -13
  9. package/src/sap/fe/core/CommonUtils.js +236 -109
  10. package/src/sap/fe/core/CommonUtils.ts +252 -136
  11. package/src/sap/fe/core/ExtensionAPI.js +24 -27
  12. package/src/sap/fe/core/ExtensionAPI.ts +36 -38
  13. package/src/sap/fe/core/PageController.js +4 -4
  14. package/src/sap/fe/core/PageController.ts +4 -5
  15. package/src/sap/fe/core/TemplateComponent.js +1 -1
  16. package/src/sap/fe/core/TemplateComponent.ts +6 -6
  17. package/src/sap/fe/core/TemplateModel.js +1 -1
  18. package/src/sap/fe/core/TemplateModel.ts +1 -1
  19. package/src/sap/fe/core/buildingBlocks/AttributeModel.js +1 -1
  20. package/src/sap/fe/core/buildingBlocks/AttributeModel.ts +1 -1
  21. package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.js +8 -8
  22. package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.ts +11 -10
  23. package/src/sap/fe/core/buildingBlocks/TraceInfo.js +27 -27
  24. package/src/sap/fe/core/buildingBlocks/TraceInfo.ts +28 -26
  25. package/src/sap/fe/core/controllerextensions/EditFlow.js +129 -118
  26. package/src/sap/fe/core/controllerextensions/EditFlow.ts +154 -141
  27. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +9 -9
  28. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +10 -10
  29. package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +31 -26
  30. package/src/sap/fe/core/controllerextensions/InternalEditFlow.ts +34 -35
  31. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +70 -70
  32. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +77 -77
  33. package/src/sap/fe/core/controllerextensions/InternalRouting.js +84 -78
  34. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +105 -101
  35. package/src/sap/fe/core/controllerextensions/KPIManagement.js +66 -68
  36. package/src/sap/fe/core/controllerextensions/KPIManagement.ts +106 -123
  37. package/src/sap/fe/core/controllerextensions/MassEdit.js +8 -8
  38. package/src/sap/fe/core/controllerextensions/MassEdit.ts +19 -26
  39. package/src/sap/fe/core/controllerextensions/MessageHandler.js +20 -12
  40. package/src/sap/fe/core/controllerextensions/MessageHandler.ts +29 -14
  41. package/src/sap/fe/core/controllerextensions/PageReady.js +97 -25
  42. package/src/sap/fe/core/controllerextensions/PageReady.ts +94 -34
  43. package/src/sap/fe/core/controllerextensions/Paginator.js +21 -22
  44. package/src/sap/fe/core/controllerextensions/Paginator.ts +24 -25
  45. package/src/sap/fe/core/controllerextensions/Placeholder.js +4 -6
  46. package/src/sap/fe/core/controllerextensions/Placeholder.ts +12 -14
  47. package/src/sap/fe/core/controllerextensions/Routing.js +10 -11
  48. package/src/sap/fe/core/controllerextensions/Routing.ts +12 -13
  49. package/src/sap/fe/core/controllerextensions/Share.js +22 -22
  50. package/src/sap/fe/core/controllerextensions/Share.ts +30 -29
  51. package/src/sap/fe/core/controllerextensions/SideEffects.js +46 -50
  52. package/src/sap/fe/core/controllerextensions/SideEffects.ts +56 -60
  53. package/src/sap/fe/core/controllerextensions/ViewState.js +65 -62
  54. package/src/sap/fe/core/controllerextensions/ViewState.ts +68 -63
  55. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js +5 -5
  56. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.ts +8 -7
  57. package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.js +6 -6
  58. package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.ts +12 -17
  59. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +2 -2
  60. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.ts +4 -4
  61. package/src/sap/fe/core/controllerextensions/collaboration/Manage.js +7 -9
  62. package/src/sap/fe/core/controllerextensions/collaboration/Manage.ts +18 -19
  63. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +184 -137
  64. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +253 -206
  65. package/src/sap/fe/core/controllerextensions/editFlow/draft.js +113 -121
  66. package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +148 -158
  67. package/src/sap/fe/core/controllerextensions/editFlow/operations.js +198 -148
  68. package/src/sap/fe/core/controllerextensions/editFlow/operations.ts +223 -159
  69. package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +24 -26
  70. package/src/sap/fe/core/controllerextensions/editFlow/sticky.ts +35 -33
  71. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +78 -44
  72. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +90 -60
  73. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +52 -55
  74. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.ts +55 -58
  75. package/src/sap/fe/core/controls/Any.js +9 -5
  76. package/src/sap/fe/core/controls/Any.ts +10 -4
  77. package/src/sap/fe/core/controls/CommandExecution.js +11 -25
  78. package/src/sap/fe/core/controls/CommandExecution.ts +11 -25
  79. package/src/sap/fe/core/controls/ConditionalWrapper.js +2 -2
  80. package/src/sap/fe/core/controls/ConditionalWrapper.ts +3 -3
  81. package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.js +22 -22
  82. package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.ts +25 -24
  83. package/src/sap/fe/core/controls/CustomQuickViewPage.js +2 -2
  84. package/src/sap/fe/core/controls/CustomQuickViewPage.ts +2 -2
  85. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +3 -3
  86. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.ts +5 -5
  87. package/src/sap/fe/core/controls/FieldWrapper.js +2 -2
  88. package/src/sap/fe/core/controls/FieldWrapper.ts +3 -3
  89. package/src/sap/fe/core/controls/FileWrapper.js +2 -2
  90. package/src/sap/fe/core/controls/FileWrapper.ts +11 -11
  91. package/src/sap/fe/core/controls/FilterBar.js +6 -2
  92. package/src/sap/fe/core/controls/FilterBar.ts +13 -9
  93. package/src/sap/fe/core/controls/FormElementWrapper.js +1 -1
  94. package/src/sap/fe/core/controls/FormElementWrapper.ts +2 -2
  95. package/src/sap/fe/core/controls/MassEditSelect.js +1 -1
  96. package/src/sap/fe/core/controls/MassEditSelect.ts +0 -4
  97. package/src/sap/fe/core/controls/NonComputedVisibleKeyFieldsDialog.fragment.xml +3 -3
  98. package/src/sap/fe/core/controls/filterbar/VisualFilter.js +16 -12
  99. package/src/sap/fe/core/controls/filterbar/VisualFilter.ts +20 -22
  100. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +3 -3
  101. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.ts +8 -8
  102. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +47 -47
  103. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +52 -52
  104. package/src/sap/fe/core/controls/massEdit/MassEditDialog.fragment.xml +8 -2
  105. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +89 -88
  106. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.ts +107 -106
  107. package/src/sap/fe/core/converters/ConverterContext.js +26 -33
  108. package/src/sap/fe/core/converters/ConverterContext.ts +51 -60
  109. package/src/sap/fe/core/converters/ManifestSettings.js +1 -1
  110. package/src/sap/fe/core/converters/ManifestSettings.ts +14 -14
  111. package/src/sap/fe/core/converters/ManifestWrapper.js +59 -45
  112. package/src/sap/fe/core/converters/ManifestWrapper.ts +55 -45
  113. package/src/sap/fe/core/converters/MetaModelConverter.js +50 -32
  114. package/src/sap/fe/core/converters/MetaModelConverter.ts +145 -127
  115. package/src/sap/fe/core/converters/TemplateConverter.js +21 -20
  116. package/src/sap/fe/core/converters/TemplateConverter.ts +27 -24
  117. package/src/sap/fe/core/converters/annotations/DataField.js +54 -34
  118. package/src/sap/fe/core/converters/annotations/DataField.ts +97 -75
  119. package/src/sap/fe/core/converters/common/AnnotationConverter.js +1911 -1495
  120. package/src/sap/fe/core/converters/controls/Common/Action.js +50 -41
  121. package/src/sap/fe/core/converters/controls/Common/Action.ts +56 -46
  122. package/src/sap/fe/core/converters/controls/Common/Chart.js +14 -14
  123. package/src/sap/fe/core/converters/controls/Common/Chart.ts +23 -26
  124. package/src/sap/fe/core/converters/controls/Common/Criticality.js +3 -3
  125. package/src/sap/fe/core/converters/controls/Common/Criticality.ts +4 -4
  126. package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +28 -28
  127. package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +40 -36
  128. package/src/sap/fe/core/converters/controls/Common/Form.js +25 -27
  129. package/src/sap/fe/core/converters/controls/Common/Form.ts +37 -45
  130. package/src/sap/fe/core/converters/controls/Common/KPI.js +11 -11
  131. package/src/sap/fe/core/converters/controls/Common/KPI.ts +35 -39
  132. package/src/sap/fe/core/converters/controls/Common/Table.js +174 -183
  133. package/src/sap/fe/core/converters/controls/Common/Table.ts +237 -250
  134. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +119 -119
  135. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +144 -141
  136. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +45 -41
  137. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +64 -57
  138. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +28 -26
  139. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +46 -43
  140. package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.js +9 -9
  141. package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.ts +14 -13
  142. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +67 -64
  143. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.ts +69 -66
  144. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +73 -72
  145. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +98 -96
  146. package/src/sap/fe/core/converters/helpers/Aggregation.js +2 -4
  147. package/src/sap/fe/core/converters/helpers/Aggregation.ts +10 -13
  148. package/src/sap/fe/core/converters/helpers/BindingHelper.js +31 -31
  149. package/src/sap/fe/core/converters/helpers/BindingHelper.ts +30 -29
  150. package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +4 -4
  151. package/src/sap/fe/core/converters/helpers/ConfigurableObject.ts +9 -9
  152. package/src/sap/fe/core/converters/helpers/ID.js +46 -46
  153. package/src/sap/fe/core/converters/helpers/ID.ts +25 -25
  154. package/src/sap/fe/core/converters/helpers/Key.js +7 -7
  155. package/src/sap/fe/core/converters/helpers/Key.ts +7 -7
  156. package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.js +1 -1
  157. package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.ts +4 -4
  158. package/src/sap/fe/core/converters/objectPage/FormMenuActions.js +6 -6
  159. package/src/sap/fe/core/converters/objectPage/FormMenuActions.ts +10 -10
  160. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +46 -62
  161. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +54 -82
  162. package/src/sap/fe/core/converters/templates/ListReportConverter.js +30 -29
  163. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +40 -40
  164. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +39 -38
  165. package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +52 -61
  166. package/src/sap/fe/core/designtime/AppComponent.designtime.js +4 -4
  167. package/src/sap/fe/core/designtime/AppComponent.designtime.ts +4 -4
  168. package/src/sap/fe/core/formatters/CollaborationFormatter.js +2 -2
  169. package/src/sap/fe/core/formatters/CollaborationFormatter.ts +3 -3
  170. package/src/sap/fe/core/formatters/FPMFormatter.js +5 -5
  171. package/src/sap/fe/core/formatters/FPMFormatter.ts +10 -10
  172. package/src/sap/fe/core/formatters/KPIFormatter.js +7 -7
  173. package/src/sap/fe/core/formatters/KPIFormatter.ts +10 -10
  174. package/src/sap/fe/core/formatters/StandardFormatter.js +89 -0
  175. package/src/sap/fe/core/formatters/StandardFormatter.ts +64 -0
  176. package/src/sap/fe/core/formatters/TableFormatter.js +11 -11
  177. package/src/sap/fe/core/formatters/TableFormatter.ts +12 -12
  178. package/src/sap/fe/core/formatters/ValueFormatter.js +8 -8
  179. package/src/sap/fe/core/formatters/ValueFormatter.ts +9 -9
  180. package/src/sap/fe/core/helpers/AppStartupHelper.js +15 -15
  181. package/src/sap/fe/core/helpers/AppStartupHelper.ts +37 -40
  182. package/src/sap/fe/core/helpers/BindingToolkit.js +1809 -0
  183. package/src/sap/fe/core/helpers/{BindingExpression.ts → BindingToolkit.ts} +365 -264
  184. package/src/sap/fe/core/helpers/ClassSupport.js +20 -11
  185. package/src/sap/fe/core/helpers/ClassSupport.ts +14 -10
  186. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +2 -2
  187. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.ts +1 -1
  188. package/src/sap/fe/core/helpers/EditState.js +1 -6
  189. package/src/sap/fe/core/helpers/EditState.ts +5 -10
  190. package/src/sap/fe/core/helpers/ExcelFormatHelper.js +2 -2
  191. package/src/sap/fe/core/helpers/ExcelFormatHelper.ts +4 -4
  192. package/src/sap/fe/core/helpers/FPMHelper.js +1 -1
  193. package/src/sap/fe/core/helpers/FPMHelper.ts +2 -2
  194. package/src/sap/fe/core/helpers/KeepAliveHelper.js +31 -31
  195. package/src/sap/fe/core/helpers/KeepAliveHelper.ts +52 -56
  196. package/src/sap/fe/core/helpers/MassEditHelper.js +281 -254
  197. package/src/sap/fe/core/helpers/MassEditHelper.ts +337 -289
  198. package/src/sap/fe/core/helpers/ModelHelper.js +25 -25
  199. package/src/sap/fe/core/helpers/ModelHelper.ts +34 -32
  200. package/src/sap/fe/core/helpers/PasteHelper.js +3 -10
  201. package/src/sap/fe/core/helpers/PasteHelper.ts +20 -25
  202. package/src/sap/fe/core/helpers/SemanticDateOperators.js +1 -1
  203. package/src/sap/fe/core/helpers/SemanticDateOperators.ts +11 -11
  204. package/src/sap/fe/core/helpers/SemanticKeyHelper.js +3 -3
  205. package/src/sap/fe/core/helpers/SemanticKeyHelper.ts +8 -8
  206. package/src/sap/fe/core/helpers/StableIdHelper.js +12 -12
  207. package/src/sap/fe/core/helpers/StableIdHelper.ts +12 -12
  208. package/src/sap/fe/core/jsx-runtime/jsx.js +1 -1
  209. package/src/sap/fe/core/jsx-runtime/jsx.ts +8 -8
  210. package/src/sap/fe/core/library.js +42 -3
  211. package/src/sap/fe/core/library.ts +38 -0
  212. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +3 -3
  213. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +2 -2
  214. package/src/sap/fe/core/messagebundle.properties +49 -35
  215. package/src/sap/fe/core/messagebundle_ar.properties +13 -5
  216. package/src/sap/fe/core/messagebundle_bg.properties +13 -5
  217. package/src/sap/fe/core/messagebundle_ca.properties +13 -5
  218. package/src/sap/fe/core/messagebundle_cs.properties +13 -5
  219. package/src/sap/fe/core/messagebundle_cy.properties +14 -6
  220. package/src/sap/fe/core/messagebundle_da.properties +13 -5
  221. package/src/sap/fe/core/messagebundle_de.properties +15 -7
  222. package/src/sap/fe/core/messagebundle_el.properties +14 -6
  223. package/src/sap/fe/core/messagebundle_en.properties +9 -1
  224. package/src/sap/fe/core/messagebundle_en_GB.properties +11 -3
  225. package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +7 -1
  226. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +9 -1
  227. package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +44 -85
  228. package/src/sap/fe/core/messagebundle_es.properties +13 -5
  229. package/src/sap/fe/core/messagebundle_es_MX.properties +13 -5
  230. package/src/sap/fe/core/messagebundle_et.properties +13 -5
  231. package/src/sap/fe/core/messagebundle_fi.properties +14 -6
  232. package/src/sap/fe/core/messagebundle_fr.properties +14 -6
  233. package/src/sap/fe/core/messagebundle_fr_CA.properties +14 -6
  234. package/src/sap/fe/core/messagebundle_hi.properties +14 -6
  235. package/src/sap/fe/core/messagebundle_hr.properties +14 -6
  236. package/src/sap/fe/core/messagebundle_hu.properties +13 -5
  237. package/src/sap/fe/core/messagebundle_id.properties +13 -5
  238. package/src/sap/fe/core/messagebundle_it.properties +33 -25
  239. package/src/sap/fe/core/messagebundle_iw.properties +13 -5
  240. package/src/sap/fe/core/messagebundle_ja.properties +14 -6
  241. package/src/sap/fe/core/messagebundle_kk.properties +13 -5
  242. package/src/sap/fe/core/messagebundle_ko.properties +13 -5
  243. package/src/sap/fe/core/messagebundle_lt.properties +13 -5
  244. package/src/sap/fe/core/messagebundle_lv.properties +14 -6
  245. package/src/sap/fe/core/messagebundle_ms.properties +13 -5
  246. package/src/sap/fe/core/messagebundle_nl.properties +13 -5
  247. package/src/sap/fe/core/messagebundle_no.properties +13 -5
  248. package/src/sap/fe/core/messagebundle_pl.properties +13 -5
  249. package/src/sap/fe/core/messagebundle_pt.properties +13 -5
  250. package/src/sap/fe/core/messagebundle_pt_PT.properties +14 -6
  251. package/src/sap/fe/core/messagebundle_ro.properties +13 -5
  252. package/src/sap/fe/core/messagebundle_ru.properties +13 -5
  253. package/src/sap/fe/core/messagebundle_sh.properties +13 -5
  254. package/src/sap/fe/core/messagebundle_sk.properties +13 -5
  255. package/src/sap/fe/core/messagebundle_sl.properties +17 -9
  256. package/src/sap/fe/core/messagebundle_sv.properties +14 -6
  257. package/src/sap/fe/core/messagebundle_th.properties +13 -5
  258. package/src/sap/fe/core/messagebundle_tr.properties +13 -5
  259. package/src/sap/fe/core/messagebundle_uk.properties +13 -5
  260. package/src/sap/fe/core/messagebundle_vi.properties +13 -5
  261. package/src/sap/fe/core/messagebundle_zh_CN.properties +14 -6
  262. package/src/sap/fe/core/messagebundle_zh_TW.properties +13 -5
  263. package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +2 -2
  264. package/src/sap/fe/core/services/AsyncComponentServiceFactory.ts +5 -5
  265. package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +2 -2
  266. package/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +14 -14
  267. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +1 -1
  268. package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +3 -2
  269. package/src/sap/fe/core/services/NavigationServiceFactory.js +53 -44
  270. package/src/sap/fe/core/services/NavigationServiceFactory.ts +54 -46
  271. package/src/sap/fe/core/services/ResourceModelServiceFactory.js +2 -2
  272. package/src/sap/fe/core/services/ResourceModelServiceFactory.ts +4 -4
  273. package/src/sap/fe/core/services/RoutingServiceFactory.js +55 -55
  274. package/src/sap/fe/core/services/RoutingServiceFactory.ts +67 -65
  275. package/src/sap/fe/core/services/ShellServicesFactory.js +72 -76
  276. package/src/sap/fe/core/services/ShellServicesFactory.ts +76 -82
  277. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +61 -61
  278. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +102 -92
  279. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +20 -15
  280. package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +26 -21
  281. package/src/sap/fe/core/support/CommonHelper.js +3 -2
  282. package/src/sap/fe/core/support/CommonHelper.ts +9 -13
  283. package/src/sap/fe/core/support/Diagnostics.js +1 -1
  284. package/src/sap/fe/core/support/Diagnostics.ts +5 -5
  285. package/src/sap/fe/core/templating/CommonFormatters.js +84 -0
  286. package/src/sap/fe/core/templating/CommonFormatters.ts +86 -0
  287. package/src/sap/fe/core/templating/CriticalityFormatters.js +31 -31
  288. package/src/sap/fe/core/templating/CriticalityFormatters.ts +42 -40
  289. package/src/sap/fe/core/templating/DataFieldFormatters.js +8 -8
  290. package/src/sap/fe/core/templating/DataFieldFormatters.ts +13 -10
  291. package/src/sap/fe/core/templating/DataModelPathHelper.js +16 -15
  292. package/src/sap/fe/core/templating/DataModelPathHelper.ts +42 -32
  293. package/src/sap/fe/core/templating/DisplayModeFormatter.js +1 -1
  294. package/src/sap/fe/core/templating/DisplayModeFormatter.ts +2 -3
  295. package/src/sap/fe/core/templating/EntitySetHelper.js +7 -7
  296. package/src/sap/fe/core/templating/EntitySetHelper.ts +6 -8
  297. package/src/sap/fe/core/templating/FieldControlHelper.js +35 -34
  298. package/src/sap/fe/core/templating/FieldControlHelper.ts +29 -46
  299. package/src/sap/fe/core/templating/FilterHelper.js +10 -9
  300. package/src/sap/fe/core/templating/FilterHelper.ts +13 -13
  301. package/src/sap/fe/core/templating/FilterTemplating.js +1 -1
  302. package/src/sap/fe/core/templating/FilterTemplating.ts +3 -3
  303. package/src/sap/fe/core/templating/PropertyFormatters.js +7 -7
  304. package/src/sap/fe/core/templating/PropertyFormatters.ts +21 -19
  305. package/src/sap/fe/core/templating/PropertyHelper.js +25 -25
  306. package/src/sap/fe/core/templating/PropertyHelper.ts +25 -26
  307. package/src/sap/fe/core/templating/UIFormatters.js +148 -93
  308. package/src/sap/fe/core/templating/UIFormatters.ts +196 -124
  309. package/src/sap/fe/core/type/Email.js +2 -2
  310. package/src/sap/fe/core/type/Email.ts +2 -2
  311. package/src/sap/fe/core/helpers/BindingExpression.js +0 -1732
@@ -1,22 +1,26 @@
1
- import { EntityType, NavigationProperty, Property } from "@sap-ux/annotation-converter";
2
- import { AnnotationTerm, DataFieldAbstractTypes, DataFieldTypes, ReferenceFacetTypes, UIAnnotationTerms } from "@sap-ux/vocabularies-types";
3
- import { PropertyPath } from "@sap-ux/vocabularies-types/dist/Edm";
4
- import { FieldGroup, FieldGroupType, SelectOptionType } from "@sap-ux/vocabularies-types/dist/generated/UI";
5
- import { ChartVisualization } from "sap/fe/core/converters/controls/Common/Chart";
6
- import {
7
- getSelectionVariantConfiguration,
8
- getTypeConfig,
9
- isFilteringCaseSensitive,
10
- SelectionVariantConfiguration,
11
- TableVisualization
12
- } from "sap/fe/core/converters/controls/Common/Table";
13
- import { getVisualFilters, VisualFilters } from "sap/fe/core/converters/controls/ListReport/VisualFilters";
14
- import ConverterContext from "sap/fe/core/converters/ConverterContext";
15
- import { ConfigurableObject, CustomElement, insertCustomElements, Placement } from "sap/fe/core/converters/helpers/ConfigurableObject";
1
+ import type { AnnotationTerm, EntityType, NavigationProperty, Property, PropertyPath } from "@sap-ux/vocabularies-types";
2
+ import type {
3
+ DataFieldAbstractTypes,
4
+ DataFieldTypes,
5
+ FieldGroup,
6
+ FieldGroupType,
7
+ ReferenceFacetTypes,
8
+ SelectOptionType
9
+ } from "@sap-ux/vocabularies-types/vocabularies/UI";
10
+ import { UIAnnotationTerms } from "@sap-ux/vocabularies-types/vocabularies/UI";
11
+ import type { ChartVisualization } from "sap/fe/core/converters/controls/Common/Chart";
12
+ import type { SelectionVariantConfiguration, TableVisualization } from "sap/fe/core/converters/controls/Common/Table";
13
+ import { getSelectionVariantConfiguration, getTypeConfig, isFilteringCaseSensitive } from "sap/fe/core/converters/controls/Common/Table";
14
+ import type { VisualFilters } from "sap/fe/core/converters/controls/ListReport/VisualFilters";
15
+ import { getVisualFilters } from "sap/fe/core/converters/controls/ListReport/VisualFilters";
16
+ import type ConverterContext from "sap/fe/core/converters/ConverterContext";
17
+ import type { ConfigurableObject, CustomElement } from "sap/fe/core/converters/helpers/ConfigurableObject";
18
+ import { insertCustomElements, Placement } from "sap/fe/core/converters/helpers/ConfigurableObject";
16
19
  import { IssueCategory, IssueSeverity, IssueType } from "sap/fe/core/converters/helpers/IssueManager";
17
20
  import { KeyHelper } from "sap/fe/core/converters/helpers/Key";
18
- import { annotationExpression, compileBinding } from "sap/fe/core/helpers/BindingExpression";
19
- import { AvailabilityType, FilterFieldManifestConfiguration, FilterManifestConfiguration, FilterSettings } from "../../ManifestSettings";
21
+ import { compileExpression, getExpressionFromAnnotation } from "sap/fe/core/helpers/BindingToolkit";
22
+ import type { FilterFieldManifestConfiguration, FilterManifestConfiguration, FilterSettings } from "../../ManifestSettings";
23
+ import { AvailabilityType } from "../../ManifestSettings";
20
24
  import { getSelectionVariant } from "../Common/DataVisualization";
21
25
  //import { hasValueHelp } from "sap/fe/core/templating/PropertyHelper";
22
26
 
@@ -53,8 +57,8 @@ export type CustomElementFilterField = CustomElement<FilterField>;
53
57
  /**
54
58
  * Enter all DataFields of a given FieldGroup into the filterFacetMap.
55
59
  *
56
- * @param {AnnotationTerm<FieldGroupType>} fieldGroup
57
- * @returns {Record<string, FilterGroup>} The map of facets for the given FieldGroup
60
+ * @param fieldGroup
61
+ * @returns The map of facets for the given FieldGroup
58
62
  */
59
63
  function getFieldGroupFilterGroups(fieldGroup: AnnotationTerm<FieldGroupType>): Record<string, FilterGroup> {
60
64
  const filterFacetMap: Record<string, FilterGroup> = {};
@@ -63,8 +67,8 @@ function getFieldGroupFilterGroups(fieldGroup: AnnotationTerm<FieldGroupType>):
63
67
  filterFacetMap[dataField.Value.path] = {
64
68
  group: fieldGroup.fullyQualifiedName,
65
69
  groupLabel:
66
- compileBinding(
67
- annotationExpression(fieldGroup.Label || fieldGroup.annotations?.Common?.Label || fieldGroup.qualifier)
70
+ compileExpression(
71
+ getExpressionFromAnnotation(fieldGroup.Label || fieldGroup.annotations?.Common?.Label || fieldGroup.qualifier)
68
72
  ) || fieldGroup.qualifier
69
73
  };
70
74
  }
@@ -83,9 +87,10 @@ function getExcludedFilterProperties(selectionVariants: SelectionVariantConfigur
83
87
 
84
88
  /**
85
89
  * Check that all the tables for a dedicated entity set are configured as analytical table.
86
- * @param {TableVisualization[]} listReportTables List report tables
87
- * @param {string} contextPath
88
- * @returns {boolean} Is FilterBar search field hidden or not
90
+ *
91
+ * @param listReportTables List report tables
92
+ * @param contextPath
93
+ * @returns Is FilterBar search field hidden or not
89
94
  */
90
95
  function checkAllTableForEntitySetAreAnalytical(listReportTables: TableVisualization[], contextPath: string | undefined) {
91
96
  if (contextPath && listReportTables.length > 0) {
@@ -130,7 +135,7 @@ function getSelectionVariants(
130
135
  *
131
136
  * @param entityType The root EntityType
132
137
  * @param propertyPath The full path to the target property
133
- * @returns {string} The formatted condition path
138
+ * @returns The formatted condition path
134
139
  */
135
140
  const _getConditionPath = function (entityType: EntityType, propertyPath: string): string {
136
141
  const parts = propertyPath.split("/");
@@ -138,12 +143,12 @@ const _getConditionPath = function (entityType: EntityType, propertyPath: string
138
143
  let key = "";
139
144
  while (parts.length) {
140
145
  let part = parts.shift() as string;
141
- partialPath = partialPath ? partialPath + "/" + part : part;
146
+ partialPath = partialPath ? `${partialPath}/${part}` : part;
142
147
  const property: Property | NavigationProperty = entityType.resolvePath(partialPath);
143
148
  if (property._type === "NavigationProperty" && property.isCollection) {
144
149
  part += "*";
145
150
  }
146
- key = key ? key + "/" + part : part;
151
+ key = key ? `${key}/${part}` : part;
147
152
  }
148
153
  return key;
149
154
  };
@@ -168,10 +173,10 @@ const _createFilterSelectionField = function (
168
173
  conditionPath: _getConditionPath(entityType, fullPropertyPath),
169
174
  availability:
170
175
  property.annotations?.UI?.HiddenFilter?.valueOf() === true ? AvailabilityType.Hidden : AvailabilityType.Adaptation,
171
- label: compileBinding(annotationExpression(property.annotations.Common?.Label?.valueOf() || property.name)),
176
+ label: compileExpression(getExpressionFromAnnotation(property.annotations.Common?.Label?.valueOf() || property.name)),
172
177
  group: targetEntityType.name,
173
- groupLabel: compileBinding(
174
- annotationExpression(targetEntityType?.annotations?.Common?.Label?.valueOf() || targetEntityType.name)
178
+ groupLabel: compileExpression(
179
+ getExpressionFromAnnotation(targetEntityType?.annotations?.Common?.Label?.valueOf() || targetEntityType.name)
175
180
  )
176
181
  };
177
182
  }
@@ -253,7 +258,7 @@ const _getSelectionFields = function (
253
258
  if (properties) {
254
259
  properties.forEach((property: Property) => {
255
260
  const propertyPath: string = property.name;
256
- const fullPath: string = (navigationPath ? navigationPath + "/" : "") + propertyPath;
261
+ const fullPath: string = (navigationPath ? `${navigationPath}/` : "") + propertyPath;
257
262
  const selectionField = _createFilterSelectionField(entityType, property, fullPath, includeHidden, converterContext);
258
263
  if (selectionField) {
259
264
  selectionFieldMap[fullPath] = selectionField;
@@ -352,12 +357,12 @@ const _getDefaultFilterFields = function (
352
357
  aSelectOptions?.forEach((selectOption: SelectOptionType) => {
353
358
  const propertyName: any = selectOption.PropertyName;
354
359
  const sPropertyPath: string = propertyName.value;
355
- const UISelectionFields: any = {};
360
+ const currentSelectionFields: any = {};
356
361
  annotatedSelectionFields?.forEach((SelectionField) => {
357
- UISelectionFields[SelectionField.value] = true;
362
+ currentSelectionFields[SelectionField.value] = true;
358
363
  });
359
364
  if (!(sPropertyPath in excludedFilterProperties)) {
360
- if (!(sPropertyPath in UISelectionFields)) {
365
+ if (!(sPropertyPath in currentSelectionFields)) {
361
366
  const FilterField: FilterField | undefined = getFilterField(sPropertyPath, converterContext, entityType);
362
367
  if (FilterField) {
363
368
  selectionFields.push(FilterField);
@@ -368,10 +373,10 @@ const _getDefaultFilterFields = function (
368
373
  } else if (properties) {
369
374
  properties.forEach((property: Property) => {
370
375
  const defaultFilterValue = property.annotations?.Common?.FilterDefaultValue;
371
- const PropertyPath = property.name;
372
- if (!(PropertyPath in excludedFilterProperties)) {
373
- if (defaultFilterValue && !(PropertyPath in UISelectionFields)) {
374
- const FilterField: FilterField | undefined = getFilterField(PropertyPath, converterContext, entityType);
376
+ const propertyPath = property.name;
377
+ if (!(propertyPath in excludedFilterProperties)) {
378
+ if (defaultFilterValue && !(propertyPath in UISelectionFields)) {
379
+ const FilterField: FilterField | undefined = getFilterField(propertyPath, converterContext, entityType);
375
380
  if (FilterField) {
376
381
  selectionFields.push(FilterField);
377
382
  }
@@ -384,17 +389,18 @@ const _getDefaultFilterFields = function (
384
389
 
385
390
  /**
386
391
  * Get all parameter filter fields in case of a parameterized service.
387
- * @param {ConverterContext} converterContext
388
- * @returns {FilterField[]} An array of parameter filterfields
392
+ *
393
+ * @param converterContext
394
+ * @returns An array of parameter filterfields
389
395
  */
390
396
  function _getParameterFields(converterContext: ConverterContext): FilterField[] {
391
397
  const dataModelObjectPath = converterContext.getDataModelObjectPath();
392
398
  const parameterEntityType = dataModelObjectPath.startingEntitySet.entityType;
393
399
  const isParameterized = !!parameterEntityType.annotations?.Common?.ResultContext && !dataModelObjectPath.targetEntitySet;
394
400
  const parameterConverterContext =
395
- isParameterized && converterContext.getConverterContextFor("/" + dataModelObjectPath.startingEntitySet.name);
401
+ isParameterized && converterContext.getConverterContextFor(`/${dataModelObjectPath.startingEntitySet.name}`);
396
402
 
397
- const parameterFields = (
403
+ return (
398
404
  parameterConverterContext
399
405
  ? parameterEntityType.entityProperties.map(function (property) {
400
406
  return _getFilterField(
@@ -406,17 +412,15 @@ function _getParameterFields(converterContext: ConverterContext): FilterField[]
406
412
  })
407
413
  : []
408
414
  ) as FilterField[];
409
-
410
- return parameterFields;
411
415
  }
412
416
 
413
417
  /**
414
418
  * Determines if the FilterBar search field is hidden or not.
415
419
  *
416
- * @param {TableVisualization[]} listReportTables The list report tables
417
- * @param {ChartVisualization[]} charts The ALP charts
418
- * @param {ConverterContext} converterContext The converter context
419
- * @returns {boolean} The information if the FilterBar search field is hidden or not
420
+ * @param listReportTables The list report tables
421
+ * @param charts The ALP charts
422
+ * @param converterContext The converter context
423
+ * @returns The information if the FilterBar search field is hidden or not
420
424
  */
421
425
  export const getFilterBarhideBasicSearch = function (
422
426
  listReportTables: TableVisualization[],
@@ -443,7 +447,7 @@ export const getFilterBarhideBasicSearch = function (
443
447
  *
444
448
  * @param entityType The current entityType
445
449
  * @param converterContext The converter context
446
- * @returns {Record<string, CustomElementFilterField>} The filter fields defined in the manifest
450
+ * @returns The filter fields defined in the manifest
447
451
  */
448
452
  export const getManifestFilterFields = function (
449
453
  entityType: EntityType,
@@ -833,10 +837,12 @@ export const insertCustomManifestElements = function (
833
837
  /**
834
838
  * Retrieve the configuration for the selection fields that will be used within the filter bar
835
839
  * This configuration takes into account annotation and the selection variants.
836
- * @param {ConverterContext} converterContext
837
- * @param {TableVisualization[]} lrTables
838
- * @param {string} annotationPath
839
- * @returns {FilterSelectionField[]} An array of selection fields
840
+ *
841
+ * @param converterContext
842
+ * @param lrTables
843
+ * @param annotationPath
844
+ * @param [includeHidden]
845
+ * @returns An array of selection fields
840
846
  */
841
847
  export const getSelectionFields = function (
842
848
  converterContext: ConverterContext,
@@ -949,10 +955,11 @@ export const getSelectionFields = function (
949
955
  * (1) a filter property is mandatory,
950
956
  * (2) no search field exists (entity isn't search enabled),
951
957
  * (3) when the data isn't loaded by default (annotation FetchValues = 2).
952
- * @param {ConverterContext} converterContext The converter context
953
- * @param {any} filterRestrictionsAnnotation The FilterRestriction annotation
954
- * @param {any} valueListAnnotation The ValueList annotation
955
- * @returns {boolean} The value for expandFilterFields
958
+ *
959
+ * @param converterContext The converter context
960
+ * @param filterRestrictionsAnnotation The FilterRestriction annotation
961
+ * @param valueListAnnotation The ValueList annotation
962
+ * @returns The value for expandFilterFields
956
963
  */
957
964
  export const getExpandFilterFields = function (
958
965
  converterContext: ConverterContext,
@@ -2,18 +2,18 @@
2
2
  * SAP UI development toolkit for HTML5 (SAPUI5)
3
3
  * (c) Copyright 2009-2021 SAP SE. All rights reserved
4
4
  */
5
- sap.ui.define(["sap/fe/core/templating/FilterTemplating", "sap/fe/core/helpers/BindingExpression", "sap/fe/core/templating/DataModelPathHelper", "sap/fe/core/converters/helpers/Aggregation", "sap/fe/core/converters/helpers/IssueManager"], function (FilterTemplating, BindingExpression, DataModelPathHelper, Aggregation, IssueManager) {
5
+ sap.ui.define(["sap/fe/core/converters/helpers/Aggregation", "sap/fe/core/converters/helpers/IssueManager", "sap/fe/core/helpers/BindingToolkit", "sap/fe/core/templating/DataModelPathHelper", "sap/fe/core/templating/FilterTemplating"], function (Aggregation, IssueManager, BindingToolkit, DataModelPathHelper, FilterTemplating) {
6
6
  "use strict";
7
7
 
8
8
  var _exports = {};
9
- var IssueCategory = IssueManager.IssueCategory;
10
- var IssueSeverity = IssueManager.IssueSeverity;
9
+ var isPropertyFilterable = FilterTemplating.isPropertyFilterable;
10
+ var getIsRequired = FilterTemplating.getIsRequired;
11
+ var checkFilterExpressionRestrictions = DataModelPathHelper.checkFilterExpressionRestrictions;
12
+ var compileExpression = BindingToolkit.compileExpression;
11
13
  var IssueType = IssueManager.IssueType;
14
+ var IssueSeverity = IssueManager.IssueSeverity;
15
+ var IssueCategory = IssueManager.IssueCategory;
12
16
  var AggregationHelper = Aggregation.AggregationHelper;
13
- var checkFilterExpressionRestrictions = DataModelPathHelper.checkFilterExpressionRestrictions;
14
- var compileBinding = BindingExpression.compileBinding;
15
- var getIsRequired = FilterTemplating.getIsRequired;
16
- var isPropertyFilterable = FilterTemplating.isPropertyFilterable;
17
17
 
18
18
  function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function () {}; return { s: F, n: function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function (e) { throw e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function () { it = it.call(o); }, n: function () { var step = it.next(); normalCompletion = step.done; return step; }, e: function (e) { didErr = true; err = e; }, f: function () { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
19
19
 
@@ -23,10 +23,11 @@ sap.ui.define(["sap/fe/core/templating/FilterTemplating", "sap/fe/core/helpers/B
23
23
 
24
24
  /**
25
25
  * Checks that measures and dimensions of the visual filter chart can be aggregated and grouped.
26
+ *
26
27
  * @param converterContext The converter context
27
28
  * @param chartAnnotation The chart annotation
28
29
  * @param aggregationHelper The aggregation helper
29
- * @returns {boolean | undefined }
30
+ * @returns `true` if the measure can be grouped and aggregated
30
31
  */
31
32
  var _checkVFAggregation = function (converterContext, chartAnnotation, aggregationHelper) {
32
33
  var _chartAnnotation$$tar, _chartAnnotation$$tar2, _chartAnnotation$$tar3, _chartAnnotation$$tar4;
@@ -97,11 +98,12 @@ sap.ui.define(["sap/fe/core/templating/FilterTemplating", "sap/fe/core/helpers/B
97
98
  };
98
99
  /**
99
100
  * Method to get the visual filters object for a property.
101
+ *
100
102
  * @param entityType The converter context
101
103
  * @param converterContext The chart annotation
102
104
  * @param sPropertyPath The aggregation helper
103
105
  * @param FilterFields The aggregation helper
104
- * @returns {VisualFilters | undefined }
106
+ * @returns The visual filters
105
107
  */
106
108
 
107
109
 
@@ -116,7 +118,7 @@ sap.ui.define(["sap/fe/core/templating/FilterTemplating", "sap/fe/core/helpers/B
116
118
 
117
119
  var oVFPath = oVisualFilter === null || oVisualFilter === void 0 ? void 0 : (_oVisualFilter$visual2 = oVisualFilter.visualFilter) === null || _oVisualFilter$visual2 === void 0 ? void 0 : _oVisualFilter$visual2.valueList;
118
120
  var annotationQualifierSplit = oVFPath.split("#");
119
- var qualifierVL = annotationQualifierSplit.length > 1 ? "ValueList#" + annotationQualifierSplit[1] : annotationQualifierSplit[0];
121
+ var qualifierVL = annotationQualifierSplit.length > 1 ? "ValueList#".concat(annotationQualifierSplit[1]) : annotationQualifierSplit[0];
120
122
  var property = entityType.resolvePath(sPropertyPath);
121
123
  var valueList = property === null || property === void 0 ? void 0 : (_property$annotations = property.annotations) === null || _property$annotations === void 0 ? void 0 : _property$annotations.Common[qualifierVL];
122
124
 
@@ -124,7 +126,7 @@ sap.ui.define(["sap/fe/core/templating/FilterTemplating", "sap/fe/core/helpers/B
124
126
  var _converterContext$get, _collectionPathConver, _collectionPathConver2;
125
127
 
126
128
  var collectionPath = valueList === null || valueList === void 0 ? void 0 : valueList.CollectionPath;
127
- var collectionPathConverterContext = converterContext.getConverterContextFor("/" + (collectionPath || ((_converterContext$get = converterContext.getEntitySet()) === null || _converterContext$get === void 0 ? void 0 : _converterContext$get.name)));
129
+ var collectionPathConverterContext = converterContext.getConverterContextFor("/".concat(collectionPath || ((_converterContext$get = converterContext.getEntitySet()) === null || _converterContext$get === void 0 ? void 0 : _converterContext$get.name)));
128
130
  var valueListParams = valueList === null || valueList === void 0 ? void 0 : valueList.Parameters;
129
131
  var outParameter;
130
132
  var inParameters = [];
@@ -155,10 +157,10 @@ sap.ui.define(["sap/fe/core/templating/FilterTemplating", "sap/fe/core/helpers/B
155
157
 
156
158
  try {
157
159
  for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
158
- var _LocalDataProperty;
160
+ var _valueListParam$Local;
159
161
 
160
162
  var valueListParam = _step3.value;
161
- var localDataProperty = (_LocalDataProperty = valueListParam.LocalDataProperty) === null || _LocalDataProperty === void 0 ? void 0 : _LocalDataProperty.value;
163
+ var localDataProperty = (_valueListParam$Local = valueListParam.LocalDataProperty) === null || _valueListParam$Local === void 0 ? void 0 : _valueListParam$Local.value;
162
164
  var valueListProperty = valueListParam.ValueListProperty;
163
165
 
164
166
  if (((valueListParam === null || valueListParam === void 0 ? void 0 : valueListParam.$Type) === "com.sap.vocabularies.Common.v1.ValueListParameterInOut" || (valueListParam === null || valueListParam === void 0 ? void 0 : valueListParam.$Type) === "com.sap.vocabularies.Common.v1.ValueListParameterOut") && sPropertyPath === localDataProperty) {
@@ -185,18 +187,18 @@ sap.ui.define(["sap/fe/core/templating/FilterTemplating", "sap/fe/core/helpers/B
185
187
 
186
188
  if (inParameters && inParameters.length) {
187
189
  inParameters.forEach(function (oInParameter) {
188
- var mainEntitySetInMappingAllowedExpression = compileBinding(checkFilterExpressionRestrictions(converterContext.getConverterContextFor(converterContext.getAbsoluteAnnotationPath(oInParameter === null || oInParameter === void 0 ? void 0 : oInParameter.localDataProperty)).getDataModelObjectPath(), ["SingleValue"]));
189
- var valueListEntitySetInMappingAllowedExpression = compileBinding(checkFilterExpressionRestrictions(collectionPathConverterContext.getConverterContextFor(collectionPathConverterContext.getAbsoluteAnnotationPath(oInParameter === null || oInParameter === void 0 ? void 0 : oInParameter.valueListProperty)).getDataModelObjectPath(), ["SingleValue"]));
190
+ var mainEntitySetInMappingAllowedExpression = compileExpression(checkFilterExpressionRestrictions(converterContext.getConverterContextFor(converterContext.getAbsoluteAnnotationPath(oInParameter === null || oInParameter === void 0 ? void 0 : oInParameter.localDataProperty)).getDataModelObjectPath(), ["SingleValue"]));
191
+ var valueListEntitySetInMappingAllowedExpression = compileExpression(checkFilterExpressionRestrictions(collectionPathConverterContext.getConverterContextFor(collectionPathConverterContext.getAbsoluteAnnotationPath(oInParameter === null || oInParameter === void 0 ? void 0 : oInParameter.valueListProperty)).getDataModelObjectPath(), ["SingleValue"]));
190
192
 
191
193
  if (valueListEntitySetInMappingAllowedExpression === "true" && mainEntitySetInMappingAllowedExpression === "false") {
192
- throw new Error("FilterRestrictions of " + sPropertyPath + " in MainEntitySet and ValueListEntitySet are different");
194
+ throw new Error("FilterRestrictions of ".concat(sPropertyPath, " in MainEntitySet and ValueListEntitySet are different"));
193
195
  }
194
196
  });
195
197
  }
196
198
 
197
199
  var pvQualifier = valueList === null || valueList === void 0 ? void 0 : valueList.PresentationVariantQualifier;
198
200
  var svQualifier = valueList === null || valueList === void 0 ? void 0 : valueList.SelectionVariantQualifier;
199
- var pvAnnotation = (_collectionPathConver = collectionPathConverterContext) === null || _collectionPathConver === void 0 ? void 0 : (_collectionPathConver2 = _collectionPathConver.getEntityTypeAnnotation("@UI.PresentationVariant#" + pvQualifier)) === null || _collectionPathConver2 === void 0 ? void 0 : _collectionPathConver2.annotation;
201
+ var pvAnnotation = (_collectionPathConver = collectionPathConverterContext) === null || _collectionPathConver === void 0 ? void 0 : (_collectionPathConver2 = _collectionPathConver.getEntityTypeAnnotation("@UI.PresentationVariant#".concat(pvQualifier))) === null || _collectionPathConver2 === void 0 ? void 0 : _collectionPathConver2.annotation;
200
202
  var aggregationHelper = new AggregationHelper(collectionPathConverterContext.getEntityType(), collectionPathConverterContext);
201
203
 
202
204
  if (!aggregationHelper.isAnalyticsSupported()) {
@@ -207,7 +209,7 @@ sap.ui.define(["sap/fe/core/templating/FilterTemplating", "sap/fe/core/helpers/B
207
209
  var _collectionPathConver3, _collectionPathConver4;
208
210
 
209
211
  var aVisualizations = pvAnnotation === null || pvAnnotation === void 0 ? void 0 : pvAnnotation.Visualizations;
210
- var contextPath = "/" + (valueList === null || valueList === void 0 ? void 0 : valueList.CollectionPath) || "/" + ((_collectionPathConver3 = collectionPathConverterContext) === null || _collectionPathConver3 === void 0 ? void 0 : (_collectionPathConver4 = _collectionPathConver3.getEntitySet()) === null || _collectionPathConver4 === void 0 ? void 0 : _collectionPathConver4.name);
212
+ var contextPath = "/".concat(valueList === null || valueList === void 0 ? void 0 : valueList.CollectionPath) || "/".concat((_collectionPathConver3 = collectionPathConverterContext) === null || _collectionPathConver3 === void 0 ? void 0 : (_collectionPathConver4 = _collectionPathConver3.getEntitySet()) === null || _collectionPathConver4 === void 0 ? void 0 : _collectionPathConver4.name);
211
213
  visualFilter.contextPath = contextPath;
212
214
  var chartAnnotation;
213
215
 
@@ -248,26 +250,26 @@ sap.ui.define(["sap/fe/core/templating/FilterTemplating", "sap/fe/core/helpers/B
248
250
  } else if (aVisualizations && aVisualizations.length) {
249
251
  var _collectionPathConver5, _collectionPathConver6, _outParameter, _outParameter$LocalDa, _requiredProperties, _visualFilter$require, _chartAnnotation3, _chartAnnotation3$$ta, _chartAnnotation3$$ta2, _chartAnnotation3$$ta3;
250
252
 
251
- visualFilter.chartAnnotation = chartAnnotation ? (_collectionPathConver5 = collectionPathConverterContext) === null || _collectionPathConver5 === void 0 ? void 0 : _collectionPathConver5.getAbsoluteAnnotationPath(chartAnnotation.fullyQualifiedName + "/$AnnotationPath/") : undefined;
252
- visualFilter.presentationAnnotation = pvAnnotation ? (_collectionPathConver6 = collectionPathConverterContext) === null || _collectionPathConver6 === void 0 ? void 0 : _collectionPathConver6.getAbsoluteAnnotationPath(pvAnnotation.fullyQualifiedName + "/") : undefined;
253
+ visualFilter.chartAnnotation = chartAnnotation ? (_collectionPathConver5 = collectionPathConverterContext) === null || _collectionPathConver5 === void 0 ? void 0 : _collectionPathConver5.getAbsoluteAnnotationPath("".concat(chartAnnotation.fullyQualifiedName, "/$AnnotationPath/")) : undefined;
254
+ visualFilter.presentationAnnotation = pvAnnotation ? (_collectionPathConver6 = collectionPathConverterContext) === null || _collectionPathConver6 === void 0 ? void 0 : _collectionPathConver6.getAbsoluteAnnotationPath("".concat(pvAnnotation.fullyQualifiedName, "/")) : undefined;
253
255
  visualFilter.outParameter = (_outParameter = outParameter) === null || _outParameter === void 0 ? void 0 : (_outParameter$LocalDa = _outParameter.LocalDataProperty) === null || _outParameter$LocalDa === void 0 ? void 0 : _outParameter$LocalDa.value;
254
256
  visualFilter.inParameters = inParameters;
255
257
  var bIsRange = checkFilterExpressionRestrictions(converterContext.getConverterContextFor(converterContext.getAbsoluteAnnotationPath(sPropertyPath)).getDataModelObjectPath(), ["SingleRange", "MultiRange"]);
256
258
 
257
- if (compileBinding(bIsRange) === "true") {
259
+ if (compileExpression(bIsRange) === "true") {
258
260
  throw new Error("Range AllowedExpression is not supported for visual filters");
259
261
  }
260
262
 
261
263
  var bIsMainEntitySetSingleSelection = checkFilterExpressionRestrictions(converterContext.getConverterContextFor(converterContext.getAbsoluteAnnotationPath(sPropertyPath)).getDataModelObjectPath(), ["SingleValue"]);
262
- visualFilter.multipleSelectionAllowed = compileBinding(!bIsMainEntitySetSingleSelection.value);
264
+ visualFilter.multipleSelectionAllowed = compileExpression(!bIsMainEntitySetSingleSelection.value);
263
265
  visualFilter.required = getIsRequired(converterContext, sPropertyPath);
264
266
  var svAnnotation;
265
267
 
266
268
  if (svQualifier) {
267
269
  var _collectionPathConver7, _collectionPathConver8, _collectionPathConver9;
268
270
 
269
- svAnnotation = (_collectionPathConver7 = collectionPathConverterContext) === null || _collectionPathConver7 === void 0 ? void 0 : (_collectionPathConver8 = _collectionPathConver7.getEntityTypeAnnotation("@UI.SelectionVariant#" + svQualifier)) === null || _collectionPathConver8 === void 0 ? void 0 : _collectionPathConver8.annotation;
270
- visualFilter.selectionVariantAnnotation = svAnnotation ? (_collectionPathConver9 = collectionPathConverterContext) === null || _collectionPathConver9 === void 0 ? void 0 : _collectionPathConver9.getAbsoluteAnnotationPath(svAnnotation.fullyQualifiedName + "/") : undefined;
271
+ svAnnotation = (_collectionPathConver7 = collectionPathConverterContext) === null || _collectionPathConver7 === void 0 ? void 0 : (_collectionPathConver8 = _collectionPathConver7.getEntityTypeAnnotation("@UI.SelectionVariant#".concat(svQualifier))) === null || _collectionPathConver8 === void 0 ? void 0 : _collectionPathConver8.annotation;
272
+ visualFilter.selectionVariantAnnotation = svAnnotation ? (_collectionPathConver9 = collectionPathConverterContext) === null || _collectionPathConver9 === void 0 ? void 0 : _collectionPathConver9.getAbsoluteAnnotationPath("".concat(svAnnotation.fullyQualifiedName, "/")) : undefined;
271
273
  }
272
274
 
273
275
  var requiredProperties = [];
@@ -277,7 +279,7 @@ sap.ui.define(["sap/fe/core/templating/FilterTemplating", "sap/fe/core/helpers/B
277
279
 
278
280
  var sEntitySet = collectionPath.split("/")[0];
279
281
  var sNavigationProperty = collectionPath.split("/")[1];
280
- var oEntitySetConverterContext = converterContext.getConverterContextFor("/" + sEntitySet);
282
+ var oEntitySetConverterContext = converterContext.getConverterContextFor("/".concat(sEntitySet));
281
283
  var aRestrictedProperties = oEntitySetConverterContext === null || oEntitySetConverterContext === void 0 ? void 0 : (_oEntitySetConverterC = oEntitySetConverterContext.getDataModelObjectPath().startingEntitySet) === null || _oEntitySetConverterC === void 0 ? void 0 : (_oEntitySetConverterC2 = _oEntitySetConverterC.annotations) === null || _oEntitySetConverterC2 === void 0 ? void 0 : (_oEntitySetConverterC3 = _oEntitySetConverterC2.Capabilities) === null || _oEntitySetConverterC3 === void 0 ? void 0 : (_oEntitySetConverterC4 = _oEntitySetConverterC3.NavigationRestrictions) === null || _oEntitySetConverterC4 === void 0 ? void 0 : _oEntitySetConverterC4.RestrictedProperties;
282
284
  var oRestrictedProperty = aRestrictedProperties === null || aRestrictedProperties === void 0 ? void 0 : aRestrictedProperties.find(function (restrictedNavProp) {
283
285
  var _restrictedNavProp$Na;
@@ -361,4 +363,4 @@ sap.ui.define(["sap/fe/core/templating/FilterTemplating", "sap/fe/core/helpers/B
361
363
  _exports.getVisualFilters = getVisualFilters;
362
364
  return _exports;
363
365
  }, false);
364
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlZpc3VhbEZpbHRlcnMudHMiXSwibmFtZXMiOlsiX2NoZWNrVkZBZ2dyZWdhdGlvbiIsImNvbnZlcnRlckNvbnRleHQiLCJjaGFydEFubm90YXRpb24iLCJhZ2dyZWdhdGlvbkhlbHBlciIsInNNZWFzdXJlUGF0aCIsImJHcm91cGFibGUiLCJiQWdncmVnYXRhYmxlIiwic01lYXN1cmUiLCIkdGFyZ2V0IiwiTWVhc3VyZXMiLCJ2YWx1ZSIsInNEaW1lbnNpb24iLCJEaW1lbnNpb25zIiwiY3VzdG9tQWdncmVnYXRlcyIsImdldEN1c3RvbUFnZ3JlZ2F0ZURlZmluaXRpb25zIiwiYVRyYW5zQWdncmVnYXRpb25zIiwiZ2V0VHJhbnNBZ2dyZWdhdGlvbnMiLCJzb21lIiwiY3VzdEFnZyIsInF1YWxpZmllciIsImFBZ2dyZWdhdGlvbnMiLCJvQWdncmVnYXRlIiwiTmFtZSIsIkFnZ3JlZ2F0YWJsZVByb3BlcnR5IiwiYUFnZ3JlZ2F0YWJsZVByb3BzRnJvbUNvbnRhaW5lciIsImdldEFnZ3JlZ2F0YWJsZVByb3BlcnRpZXMiLCJhR3JvdXBhYmxlUHJvcHNGcm9tQ29udGFpbmVyIiwiZ2V0R3JvdXBhYmxlUHJvcGVydGllcyIsImxlbmd0aCIsImFnZ3JlZ2F0YWJsZVByb3AiLCJQcm9wZXJ0eSIsImdyb3VwYWJsZVByb3AiLCJnZXRWaXN1YWxGaWx0ZXJzIiwiZW50aXR5VHlwZSIsInNQcm9wZXJ0eVBhdGgiLCJGaWx0ZXJGaWVsZHMiLCJ2aXN1YWxGaWx0ZXIiLCJvVmlzdWFsRmlsdGVyIiwidmFsdWVMaXN0Iiwib1ZGUGF0aCIsImFubm90YXRpb25RdWFsaWZpZXJTcGxpdCIsInNwbGl0IiwicXVhbGlmaWVyVkwiLCJwcm9wZXJ0eSIsInJlc29sdmVQYXRoIiwiYW5ub3RhdGlvbnMiLCJDb21tb24iLCJjb2xsZWN0aW9uUGF0aCIsIkNvbGxlY3Rpb25QYXRoIiwiY29sbGVjdGlvblBhdGhDb252ZXJ0ZXJDb250ZXh0IiwiZ2V0Q29udmVydGVyQ29udGV4dEZvciIsImdldEVudGl0eVNldCIsIm5hbWUiLCJ2YWx1ZUxpc3RQYXJhbXMiLCJQYXJhbWV0ZXJzIiwib3V0UGFyYW1ldGVyIiwiaW5QYXJhbWV0ZXJzIiwiYVBhcmFtZXRlcnMiLCJnZXREYXRhTW9kZWxPYmplY3RQYXRoIiwidGFyZ2V0RW50aXR5U2V0IiwicmVzb2x2ZWRUYXJnZXQiLCJnZXRFbnRpdHlUeXBlQW5ub3RhdGlvbiIsInBhcmFtZXRlckVudGl0eVR5cGUiLCJnZXRQYXJhbWV0ZXJFbnRpdHlUeXBlIiwia2V5cyIsIm1hcCIsImtleSIsImdldENvbnRleHRQYXRoIiwiZm9yRWFjaCIsInBhcmFtZXRlciIsInB1c2giLCJsb2NhbERhdGFQcm9wZXJ0eSIsInZhbHVlTGlzdFByb3BlcnR5IiwidmFsdWVMaXN0UGFyYW0iLCJMb2NhbERhdGFQcm9wZXJ0eSIsIlZhbHVlTGlzdFByb3BlcnR5IiwiJFR5cGUiLCJiTm90RmlsdGVyYWJsZSIsImlzUHJvcGVydHlGaWx0ZXJhYmxlIiwib0luUGFyYW1ldGVyIiwibWFpbkVudGl0eVNldEluTWFwcGluZ0FsbG93ZWRFeHByZXNzaW9uIiwiY29tcGlsZUJpbmRpbmciLCJjaGVja0ZpbHRlckV4cHJlc3Npb25SZXN0cmljdGlvbnMiLCJnZXRBYnNvbHV0ZUFubm90YXRpb25QYXRoIiwidmFsdWVMaXN0RW50aXR5U2V0SW5NYXBwaW5nQWxsb3dlZEV4cHJlc3Npb24iLCJFcnJvciIsInB2UXVhbGlmaWVyIiwiUHJlc2VudGF0aW9uVmFyaWFudFF1YWxpZmllciIsInN2UXVhbGlmaWVyIiwiU2VsZWN0aW9uVmFyaWFudFF1YWxpZmllciIsInB2QW5ub3RhdGlvbiIsImFubm90YXRpb24iLCJBZ2dyZWdhdGlvbkhlbHBlciIsImdldEVudGl0eVR5cGUiLCJpc0FuYWx5dGljc1N1cHBvcnRlZCIsImFWaXN1YWxpemF0aW9ucyIsIlZpc3VhbGl6YXRpb25zIiwiY29udGV4dFBhdGgiLCJ2aXN1YWxpemF0aW9uIiwidGVybSIsIl9iZ2V0VkZBZ2dyZWdhdGlvbiIsImJEaW1lbnNpb25IaWRkZW4iLCJVSSIsIkhpZGRlbiIsInZhbHVlT2YiLCJiRGltZW5zaW9uSGlkZGVuRmlsdGVyIiwiSGlkZGVuRmlsdGVyIiwiZnVsbHlRdWFsaWZpZWROYW1lIiwidW5kZWZpbmVkIiwicHJlc2VudGF0aW9uQW5ub3RhdGlvbiIsImJJc1JhbmdlIiwiYklzTWFpbkVudGl0eVNldFNpbmdsZVNlbGVjdGlvbiIsIm11bHRpcGxlU2VsZWN0aW9uQWxsb3dlZCIsInJlcXVpcmVkIiwiZ2V0SXNSZXF1aXJlZCIsInN2QW5ub3RhdGlvbiIsInNlbGVjdGlvblZhcmlhbnRBbm5vdGF0aW9uIiwicmVxdWlyZWRQcm9wZXJ0aWVzIiwic0VudGl0eVNldCIsInNOYXZpZ2F0aW9uUHJvcGVydHkiLCJvRW50aXR5U2V0Q29udmVydGVyQ29udGV4dCIsImFSZXN0cmljdGVkUHJvcGVydGllcyIsInN0YXJ0aW5nRW50aXR5U2V0IiwiQ2FwYWJpbGl0aWVzIiwiTmF2aWdhdGlvblJlc3RyaWN0aW9ucyIsIlJlc3RyaWN0ZWRQcm9wZXJ0aWVzIiwib1Jlc3RyaWN0ZWRQcm9wZXJ0eSIsImZpbmQiLCJyZXN0cmljdGVkTmF2UHJvcCIsIk5hdmlnYXRpb25Qcm9wZXJ0eSIsInR5cGUiLCJGaWx0ZXJSZXN0cmljdGlvbnMiLCJSZXF1aXJlZFByb3BlcnRpZXMiLCJlbnRpdHlTZXRBbm5vdGF0aW9ucyIsInJlcXVpcmVkUHJvcGVydHlQYXRocyIsIm9SZXF1aXJlUHJvcGVydHkiLCJjb25jYXQiLCJzaG93T3ZlcmxheUluaXRpYWxseSIsInNlbGVjdE9wdGlvbnMiLCJTZWxlY3RPcHRpb25zIiwib1NlbGVjdE9wdGlvbiIsIlByb3BlcnR5TmFtZSIsInBhcmFtZXRlck9wdGlvbnMiLCJvUGFyYW1ldGVyT3B0aW9uIiwic29ydCIsInNQYXRoIiwiaW5kZXhPZiIsInNEaW1lbnNpb25UeXBlIiwiQ2hhcnRUeXBlIiwicmVuZGVyTGluZUNoYXJ0IiwiZ2V0RGlhZ25vc3RpY3MiLCJhZGRJc3N1ZSIsIklzc3VlQ2F0ZWdvcnkiLCJBbm5vdGF0aW9uIiwiSXNzdWVTZXZlcml0eSIsIkhpZ2giLCJJc3N1ZVR5cGUiLCJNQUxGT1JNRURfVklTVUFMRklMVEVSUyIsIkNIQVJUIiwiUFJFU0VOVEFUSU9OVkFSSUFOVCIsIlZBTFVFTElTVCIsIk1hbmlmZXN0IiwiT2JqZWN0Il0sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQTRCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU1BLG1CQUFtQixHQUFHLFVBQzNCQyxnQkFEMkIsRUFFM0JDLGVBRjJCLEVBRzNCQyxpQkFIMkIsRUFJTDtBQUFBOztBQUN0QixRQUFJQyxZQUFKLEVBQWtCQyxVQUFsQixFQUE4QkMsYUFBOUI7QUFDQSxRQUFNQyxRQUFnQixHQUFHTCxlQUFILGFBQUdBLGVBQUgsZ0RBQUdBLGVBQWUsQ0FBRU0sT0FBcEIsb0ZBQUcsc0JBQTBCQyxRQUExQixDQUFtQyxDQUFuQyxDQUFILDJEQUFHLHVCQUF1Q0MsS0FBaEU7QUFDQSxRQUFNQyxVQUFrQixHQUFHVCxlQUFILGFBQUdBLGVBQUgsaURBQUdBLGVBQWUsQ0FBRU0sT0FBcEIscUZBQUcsdUJBQTBCSSxVQUExQixDQUFxQyxDQUFyQyxDQUFILDJEQUFHLHVCQUF5Q0YsS0FBcEU7QUFDQSxRQUFNRyxnQkFBZ0IsR0FBR1YsaUJBQWlCLENBQUNXLDZCQUFsQixFQUF6QjtBQUNBLFFBQU1DLGtCQUFrQixHQUFHWixpQkFBaUIsQ0FBQ2Esb0JBQWxCLEVBQTNCOztBQUVBLFFBQ0NILGdCQUFnQixDQUFDSSxJQUFqQixDQUFzQixVQUFTQyxPQUFULEVBQW1EO0FBQ3hFLGFBQU9BLE9BQU8sQ0FBQ0MsU0FBUixLQUFzQlosUUFBN0I7QUFDQSxLQUZELENBREQsRUFJRTtBQUNESCxNQUFBQSxZQUFZLEdBQUdHLFFBQWY7QUFDQSxLQU5ELE1BTU8sSUFBSVEsa0JBQWtCLElBQUlBLGtCQUFrQixDQUFDLENBQUQsQ0FBNUMsRUFBaUQ7QUFD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SixVQUFBQSxnQkFBZ0IsQ0FDZHFKLGNBREYsR0FFRUMsUUFGRixDQUVXQyxhQUFhLENBQUNDLFVBRnpCLEVBRXFDQyxhQUFhLENBQUNDLElBRm5ELEVBRXlEQyxTQUFTLENBQUNDLHVCQUFWLENBQWtDRSxtQkFGM0Y7QUFHQTtBQUNELE9BL05ELE1BK05PO0FBQ045SixRQUFBQSxnQkFBZ0IsQ0FDZHFKLGNBREYsR0FFRUMsUUFGRixDQUVXQyxhQUFhLENBQUNDLFVBRnpCLEVBRXFDQyxhQUFhLENBQUNDLElBRm5ELEVBRXlEQyxTQUFTLENBQUNDLHVCQUFWLENBQWtDRyxTQUYzRjtBQUdBO0FBQ0QsS0ExT0QsTUEwT087QUFDTi9KLE1BQUFBLGdCQUFnQixDQUFDcUosY0FBakIsR0FBa0NDLFFBQWxDLENBQTJDQyxhQUFhLENBQUNTLFFBQXpELEVBQW1FUCxhQUFhLENBQUNDLElBQWpGLEVBQXVGQyxTQUFTLENBQUNDLHVCQUFWLENBQWtDRyxTQUF6SDtBQUNBOztBQUNELFFBQUlFLE1BQU0sQ0FBQ2xHLElBQVAsQ0FBWTVCLFlBQVosRUFBMEJSLE1BQTFCLEdBQW1DLENBQXZDLEVBQTBDO0FBQ3pDLGFBQU9RLFlBQVA7QUFDQTtBQUNEIiwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFbnRpdHlUeXBlIH0gZnJvbSBcIkBzYXAtdXgvYW5ub3RhdGlvbi1jb252ZXJ0ZXJcIjtcbmltcG9ydCBDb252ZXJ0ZXJDb250ZXh0IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL0NvbnZlcnRlckNvbnRleHRcIjtcbmltcG9ydCB7IEZpbHRlckZpZWxkTWFuaWZlc3RDb25maWd1cmF0aW9uIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWFuaWZlc3RTZXR0aW5nc1wiO1xuaW1wb3J0IHsgaXNQcm9wZXJ0eUZpbHRlcmFibGUsIGdldElzUmVxdWlyZWQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9GaWx0ZXJUZW1wbGF0aW5nXCI7XG5pbXBvcnQgeyBjb21waWxlQmluZGluZyB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0JpbmRpbmdFeHByZXNzaW9uXCI7XG5pbXBvcnQgeyBjaGVja0ZpbHRlckV4cHJlc3Npb25SZXN0cmljdGlvbnMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9EYXRhTW9kZWxQYXRoSGVscGVyXCI7XG5pbXBvcnQgeyBBZ2dyZWdhdGlvbkhlbHBlciB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2hlbHBlcnMvQWdncmVnYXRpb25cIjtcbmltcG9ydCB7IElzc3VlVHlwZSwgSXNzdWVTZXZlcml0eSwgSXNzdWVDYXRlZ29yeSB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2hlbHBlcnMvSXNzdWVNYW5hZ2VyXCI7XG5pbXBvcnQgeyBOYXZpZ2F0aW9uUHJvcGVydHlSZXN0cmljdGlvblR5cGVzIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL2Rpc3QvZ2VuZXJhdGVkL0NhcGFiaWxpdGllc1wiO1xuaW1wb3J0IHsgQW5ub3RhdGlvblRlcm0gfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXNcIjtcbmltcG9ydCB7IEN1c3RvbUFnZ3JlZ2F0ZSB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy9kaXN0L2dlbmVyYXRlZC9BZ2dyZWdhdGlvblwiO1xuXG5leHBvcnQgdHlwZSBWaXN1YWxGaWx0ZXJzID0ge1xuXHRkaW1lbnNpb25QYXRoPzogc3RyaW5nO1xuXHRtZWFzdXJlUGF0aD86IHN0cmluZztcblx0bGFiZWw/OiBzdHJpbmc7XG5cdGNoYXJ0QW5ub3RhdGlvbj86IHN0cmluZztcblx0cHJlc2VudGF0aW9uQW5ub3RhdGlvbj86IHN0cmluZztcblx0dmlzaWJsZT86IGJvb2xlYW47XG5cdG91dFBhcmFtZXRlcj86IHN0cmluZztcblx0aW5QYXJhbWV0ZXJzPzogb2JqZWN0W107XG5cdGNvbnRleHRQYXRoPzogc3RyaW5nO1xuXHRzZWxlY3Rpb25WYXJpYW50QW5ub3RhdGlvbj86IHN0cmluZztcblx0bXVsdGlwbGVTZWxlY3Rpb25BbGxvd2VkPzogYm9vbGVhbjtcblx0cmVxdWlyZWQ/OiBib29sZWFuO1xuXHRzaG93T3ZlcmxheUluaXRpYWxseT86IGJvb2xlYW47XG5cdHJlbmRlckxpbmVDaGFydD86IGJvb2xlYW47XG5cdHJlcXVpcmVkUHJvcGVydGllcz86IG9iamVjdFtdO1xufTtcblxuLyoqXG4gKiBDaGVja3MgdGhhdCBtZWFzdXJlcyBhbmQgZGltZW5zaW9ucyBvZiB0aGUgdmlzdWFsIGZpbHRlciBjaGFydCBjYW4gYmUgYWdncmVnYXRlZCBhbmQgZ3JvdXBlZC5cbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHBhcmFtIGNoYXJ0QW5ub3RhdGlvbiBUaGUgY2hhcnQgYW5ub3RhdGlvblxuICogQHBhcmFtIGFnZ3JlZ2F0aW9uSGVscGVyIFRoZSBhZ2dyZWdhdGlvbiBoZWxwZXJcbiAqIEByZXR1cm5zIHtib29sZWFuIHwgdW5kZWZpbmVkIH1cbiAqL1xuY29uc3QgX2NoZWNrVkZBZ2dyZWdhdGlvbiA9IGZ1bmN0aW9uKFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LFxuXHRjaGFydEFubm90YXRpb246IGFueSxcblx0YWdncmVnYXRpb25IZWxwZXI6IGFueVxuKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG5cdGxldCBzTWVhc3VyZVBhdGgsIGJHcm91cGFibGUsIGJBZ2dyZWdhdGFibGU7XG5cdGNvbnN0IHNNZWFzdXJlOiBzdHJpbmcgPSBjaGFydEFubm90YXRpb24/LiR0YXJnZXQ/Lk1lYXN1cmVzWzBdPy52YWx1ZTtcblx0Y29uc3Qgc0RpbWVuc2lvbjogc3RyaW5nID0gY2hhcnRBbm5vdGF0aW9uPy4kdGFyZ2V0Py5EaW1lbnNpb25zWzBdPy52YWx1ZTtcblx0Y29uc3QgY3VzdG9tQWdncmVnYXRlcyA9IGFnZ3JlZ2F0aW9uSGVscGVyLmdldEN1c3RvbUFnZ3JlZ2F0ZURlZmluaXRpb25zKCk7XG5cdGNvbnN0IGFUcmFuc0FnZ3JlZ2F0aW9ucyA9IGFnZ3JlZ2F0aW9uSGVscGVyLmdldFRyYW5zQWdncmVnYXRpb25zKCk7XG5cblx0aWYgKFxuXHRcdGN1c3RvbUFnZ3JlZ2F0ZXMuc29tZShmdW5jdGlvbihjdXN0QWdnOiBBbm5vdGF0aW9uVGVybTxDdXN0b21BZ2dyZWdhdGU+KSB7XG5cdFx0XHRyZXR1cm4gY3VzdEFnZy5xdWFsaWZpZXIgPT09IHNNZWFzdXJlO1xuXHRcdH0pXG5cdCkge1xuXHRcdHNNZWFzdXJlUGF0aCA9IHNNZWFzdXJlO1xuXHR9IGVsc2UgaWYgKGFUcmFuc0FnZ3JlZ2F0aW9ucyAmJiBhVHJhbnNBZ2dyZWdhdGlvbnNbMF0pIHtcblx0XHRjb25zdCBhQWdncmVnYXRpb25zID0gYVRyYW5zQWdncmVnYXRpb25zWzBdO1xuXHRcdGFBZ2dyZWdhdGlvbnMuc29tZShmdW5jdGlvbihvQWdncmVnYXRlOiBhbnkpIHtcblx0XHRcdGlmIChvQWdncmVnYXRlLk5hbWUgPT09IHNNZWFzdXJlKSB7XG5cdFx0XHRcdHNNZWFzdXJlUGF0aCA9IG9BZ2dyZWdhdGU/LkFnZ3JlZ2F0YWJsZVByb3BlcnR5LnZhbHVlO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cdGNvbnN0IGFBZ2dyZWdhdGFibGVQcm9wc0Zyb21Db250YWluZXIgPSBhZ2dyZWdhdGlvbkhlbHBlci5nZXRBZ2dyZWdhdGFibGVQcm9wZXJ0aWVzKCk7XG5cdGNvbnN0IGFHcm91cGFibGVQcm9wc0Zyb21Db250YWluZXIgPSBhZ2dyZWdhdGlvbkhlbHBlci5nZXRHcm91cGFibGVQcm9wZXJ0aWVzKCk7XG5cdGlmIChhQWdncmVnYXRhYmxlUHJvcHNGcm9tQ29udGFpbmVyICYmIGFBZ2dyZWdhdGFibGVQcm9wc0Zyb21Db250YWluZXIubGVuZ3RoKSB7XG5cdFx0Zm9yIChjb25zdCBhZ2dyZWdhdGFibGVQcm9wIG9mIGFBZ2dyZWdhdGFibGVQcm9wc0Zyb21Db250YWluZXIpIHtcblx0XHRcdGlmIChhZ2dyZWdhdGFibGVQcm9wPy5Qcm9wZXJ0eT8udmFsdWUgPT09IHNNZWFzdXJlUGF0aCkge1xuXHRcdFx0XHRiQWdncmVnYXRhYmxlID0gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0aWYgKGFHcm91cGFibGVQcm9wc0Zyb21Db250YWluZXIgJiYgYUdyb3VwYWJsZVByb3BzRnJvbUNvbnRhaW5lci5sZW5ndGgpIHtcblx0XHRmb3IgKGNvbnN0IGdyb3VwYWJsZVByb3Agb2YgYUdyb3VwYWJsZVByb3BzRnJvbUNvbnRhaW5lcikge1xuXHRcdFx0aWYgKGdyb3VwYWJsZVByb3A/LnZhbHVlID09PSBzRGltZW5zaW9uKSB7XG5cdFx0XHRcdGJHcm91cGFibGUgPSB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHRyZXR1cm4gYkFnZ3JlZ2F0YWJsZSAmJiBiR3JvdXBhYmxlO1xufTtcblxuLyoqXG4gKiBNZXRob2QgdG8gZ2V0IHRoZSB2aXN1YWwgZmlsdGVycyBvYmplY3QgZm9yIGEgcHJvcGVydHkuXG4gKiBAcGFyYW0gZW50aXR5VHlwZSBUaGUgY29udmVydGVyIGNvbnRleHRcbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjaGFydCBhbm5vdGF0aW9uXG4gKiBAcGFyYW0gc1Byb3BlcnR5UGF0aCBUaGUgYWdncmVnYXRpb24gaGVscGVyXG4gKiBAcGFyYW0gRmlsdGVyRmllbGRzIFRoZSBhZ2dyZWdhdGlvbiBoZWxwZXJcbiAqIEByZXR1cm5zIHtWaXN1YWxGaWx0ZXJzIHwgdW5kZWZpbmVkIH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFZpc3VhbEZpbHRlcnMoXG5cdGVudGl0eVR5cGU6IEVudGl0eVR5cGUsXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdHNQcm9wZXJ0eVBhdGg6IHN0cmluZyxcblx0RmlsdGVyRmllbGRzOiBSZWNvcmQ8c3RyaW5nLCBGaWx0ZXJGaWVsZE1hbmlmZXN0Q29uZmlndXJhdGlvbj5cbik6IFZpc3VhbEZpbHRlcnMgfCB1bmRlZmluZWQge1xuXHRjb25zdCB2aXN1YWxGaWx0ZXI6IFZpc3VhbEZpbHRlcnMgPSB7fTtcblx0Y29uc3Qgb1Zpc3VhbEZpbHRlcjogRmlsdGVyRmllbGRNYW5pZmVzdENvbmZpZ3VyYXRpb24gPSBGaWx0ZXJGaWVsZHNbc1Byb3BlcnR5UGF0aF07XG5cdGlmIChvVmlzdWFsRmlsdGVyPy52aXN1YWxGaWx0ZXI/LnZhbHVlTGlzdCkge1xuXHRcdGNvbnN0IG9WRlBhdGggPSBvVmlzdWFsRmlsdGVyPy52aXN1YWxGaWx0ZXI/LnZhbHVlTGlzdDtcblx0XHRjb25zdCBhbm5vdGF0aW9uUXVhbGlmaWVyU3BsaXQgPSBvVkZQYXRoLnNwbGl0KFwiI1wiKTtcblx0XHRjb25zdCBxdWFsaWZpZXJWTCA9IGFubm90YXRpb25RdWFsaWZpZXJTcGxpdC5sZW5ndGggPiAxID8gXCJWYWx1ZUxpc3QjXCIgKyBhbm5vdGF0aW9uUXVhbGlmaWVyU3BsaXRbMV0gOiBhbm5vdGF0aW9uUXVhbGlmaWVyU3BsaXRbMF07XG5cdFx0Y29uc3QgcHJvcGVydHkgPSBlbnRpdHlUeXBlLnJlc29sdmVQYXRoKHNQcm9wZXJ0eVBhdGgpO1xuXHRcdGNvbnN0IHZhbHVlTGlzdDogYW55ID0gcHJvcGVydHk/LmFubm90YXRpb25zPy5Db21tb25bcXVhbGlmaWVyVkxdO1xuXHRcdGlmICh2YWx1ZUxpc3QpIHtcblx0XHRcdGNvbnN0IGNvbGxlY3Rpb25QYXRoID0gdmFsdWVMaXN0Py5Db2xsZWN0aW9uUGF0aDtcblx0XHRcdGxldCBjb2xsZWN0aW9uUGF0aENvbnZlcnRlckNvbnRleHQgPSBjb252ZXJ0ZXJDb250ZXh0LmdldENvbnZlcnRlckNvbnRleHRGb3IoXG5cdFx0XHRcdFwiL1wiICsgKGNvbGxlY3Rpb25QYXRoIHx8IGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0KCk/Lm5hbWUpXG5cdFx0XHQpO1xuXHRcdFx0Y29uc3QgdmFsdWVMaXN0UGFyYW1zID0gdmFsdWVMaXN0Py5QYXJhbWV0ZXJzO1xuXHRcdFx0bGV0IG91dFBhcmFtZXRlcjogYW55O1xuXHRcdFx0Y29uc3QgaW5QYXJhbWV0ZXJzOiBBcnJheTxvYmplY3Q+ID0gW107XG5cdFx0XHRsZXQgYVBhcmFtZXRlcnM6IEFycmF5PHN0cmluZz4gPSBbXTtcblx0XHRcdGlmICghY29sbGVjdGlvblBhdGhDb252ZXJ0ZXJDb250ZXh0LmdldERhdGFNb2RlbE9iamVjdFBhdGgoKS50YXJnZXRFbnRpdHlTZXQpIHtcblx0XHRcdFx0Y29uc3QgcmVzb2x2ZWRUYXJnZXQgPSBjb2xsZWN0aW9uUGF0aENvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5VHlwZUFubm90YXRpb24oXCJcIik7XG5cdFx0XHRcdGNvbGxlY3Rpb25QYXRoQ29udmVydGVyQ29udGV4dCA9IHJlc29sdmVkVGFyZ2V0LmNvbnZlcnRlckNvbnRleHQ7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBwYXJhbWV0ZXJFbnRpdHlUeXBlID0gY29sbGVjdGlvblBhdGhDb252ZXJ0ZXJDb250ZXh0LmdldFBhcmFtZXRlckVudGl0eVR5cGUoKTtcblx0XHRcdGFQYXJhbWV0ZXJzID0gcGFyYW1ldGVyRW50aXR5VHlwZVxuXHRcdFx0XHQ/IHBhcmFtZXRlckVudGl0eVR5cGUua2V5cy5tYXAoZnVuY3Rpb24oa2V5KSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4ga2V5Lm5hbWU7XG5cdFx0XHRcdCAgfSlcblx0XHRcdFx0OiBbXTtcblx0XHRcdGlmIChjb252ZXJ0ZXJDb250ZXh0LmdldENvbnRleHRQYXRoKCkgPT09IGNvbGxlY3Rpb25QYXRoQ29udmVydGVyQ29udGV4dC5nZXRDb250ZXh0UGF0aCgpKSB7XG5cdFx0XHRcdGFQYXJhbWV0ZXJzLmZvckVhY2goZnVuY3Rpb24ocGFyYW1ldGVyOiBhbnkpIHtcblx0XHRcdFx0XHRpblBhcmFtZXRlcnMucHVzaCh7XG5cdFx0XHRcdFx0XHRsb2NhbERhdGFQcm9wZXJ0eTogcGFyYW1ldGVyLFxuXHRcdFx0XHRcdFx0dmFsdWVMaXN0UHJvcGVydHk6IHBhcmFtZXRlclxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHRcdGlmICh2YWx1ZUxpc3RQYXJhbXMpIHtcblx0XHRcdFx0Zm9yIChjb25zdCB2YWx1ZUxpc3RQYXJhbSBvZiB2YWx1ZUxpc3RQYXJhbXMpIHtcblx0XHRcdFx0XHRjb25zdCBsb2NhbERhdGFQcm9wZXJ0eSA9ICh2YWx1ZUxpc3RQYXJhbSBhcyBhbnkpLkxvY2FsRGF0YVByb3BlcnR5Py52YWx1ZTtcblx0XHRcdFx0XHRjb25zdCB2YWx1ZUxpc3RQcm9wZXJ0eSA9ICh2YWx1ZUxpc3RQYXJhbSBhcyBhbnkpLlZhbHVlTGlzdFByb3BlcnR5O1xuXHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdCh2YWx1ZUxpc3RQYXJhbT8uJFR5cGUgPT09IFwiY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLlZhbHVlTGlzdFBhcmFtZXRlckluT3V0XCIgfHxcblx0XHRcdFx0XHRcdFx0dmFsdWVMaXN0UGFyYW0/LiRUeXBlID09PSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5WYWx1ZUxpc3RQYXJhbWV0ZXJPdXRcIikgJiZcblx0XHRcdFx0XHRcdHNQcm9wZXJ0eVBhdGggPT09IGxvY2FsRGF0YVByb3BlcnR5XG5cdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRvdXRQYXJhbWV0ZXIgPSB2YWx1ZUxpc3RQYXJhbTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0KHZhbHVlTGlzdFBhcmFtPy4kVHlwZSA9PT0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuVmFsdWVMaXN0UGFyYW1ldGVySW5PdXRcIiB8fFxuXHRcdFx0XHRcdFx0XHR2YWx1ZUxpc3RQYXJhbT8uJFR5cGUgPT09IFwiY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLlZhbHVlTGlzdFBhcmFtZXRlckluXCIpICYmXG5cdFx0XHRcdFx0XHRzUHJvcGVydHlQYXRoICE9PSBsb2NhbERhdGFQcm9wZXJ0eVxuXHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0Y29uc3QgYk5vdEZpbHRlcmFibGUgPSBpc1Byb3BlcnR5RmlsdGVyYWJsZShjb2xsZWN0aW9uUGF0aENvbnZlcnRlckNvbnRleHQsIHZhbHVlTGlzdFByb3BlcnR5KTtcblx0XHRcdFx0XHRcdGlmICghYk5vdEZpbHRlcmFibGUpIHtcblx0XHRcdFx0XHRcdFx0aW5QYXJhbWV0ZXJzLnB1c2goe1xuXHRcdFx0XHRcdFx0XHRcdGxvY2FsRGF0YVByb3BlcnR5OiBsb2NhbERhdGFQcm9wZXJ0eSxcblx0XHRcdFx0XHRcdFx0XHR2YWx1ZUxpc3RQcm9wZXJ0eTogdmFsdWVMaXN0UHJvcGVydHlcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRpZiAoaW5QYXJhbWV0ZXJzICYmIGluUGFyYW1ldGVycy5sZW5ndGgpIHtcblx0XHRcdFx0aW5QYXJhbWV0ZXJzLmZvckVhY2goZnVuY3Rpb24ob0luUGFyYW1ldGVyOiBhbnkpIHtcblx0XHRcdFx0XHRjb25zdCBtYWluRW50aXR5U2V0SW5NYXBwaW5nQWxsb3dlZEV4cHJlc3Npb24gPSBjb21waWxlQmluZGluZyhcblx0XHRcdFx0XHRcdGNoZWNrRmlsdGVyRXhwcmVzc2lvblJlc3RyaWN0aW9ucyhcblx0XHRcdFx0XHRcdFx0Y29udmVydGVyQ29udGV4dFxuXHRcdFx0XHRcdFx0XHRcdC5nZXRDb252ZXJ0ZXJDb250ZXh0Rm9yKGNvbnZlcnRlckNvbnRleHQuZ2V0QWJzb2x1dGVBbm5vdGF0aW9uUGF0aChvSW5QYXJhbWV0ZXI/LmxvY2FsRGF0YVByb3BlcnR5KSlcblx0XHRcdFx0XHRcdFx0XHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpLFxuXHRcdFx0XHRcdFx0XHRbXCJTaW5nbGVWYWx1ZVwiXVxuXHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0Y29uc3QgdmFsdWVMaXN0RW50aXR5U2V0SW5NYXBwaW5nQWxsb3dlZEV4cHJlc3Npb24gPSBjb21waWxlQmluZGluZyhcblx0XHRcdFx0XHRcdGNoZWNrRmlsdGVyRXhwcmVzc2lvblJlc3RyaWN0aW9ucyhcblx0XHRcdFx0XHRcdFx0Y29sbGVjdGlvblBhdGhDb252ZXJ0ZXJDb250ZXh0XG5cdFx0XHRcdFx0XHRcdFx0LmdldENvbnZlcnRlckNvbnRleHRGb3IoXG5cdFx0XHRcdFx0XHRcdFx0XHRjb2xsZWN0aW9uUGF0aENvbnZlcnRlckNvbnRleHQuZ2V0QWJzb2x1dGVBbm5vdGF0aW9uUGF0aChvSW5QYXJhbWV0ZXI/LnZhbHVlTGlzdFByb3BlcnR5KVxuXHRcdFx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHRcdFx0XHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpLFxuXHRcdFx0XHRcdFx0XHRbXCJTaW5nbGVWYWx1ZVwiXVxuXHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0aWYgKHZhbHVlTGlzdEVudGl0eVNldEluTWFwcGluZ0FsbG93ZWRFeHByZXNzaW9uID09PSBcInRydWVcIiAmJiBtYWluRW50aXR5U2V0SW5NYXBwaW5nQWxsb3dlZEV4cHJlc3Npb24gPT09IFwiZmFsc2VcIikge1xuXHRcdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFxuXHRcdFx0XHRcdFx0XHRcIkZpbHRlclJlc3RyaWN0aW9ucyBvZiBcIiArIHNQcm9wZXJ0eVBhdGggKyBcIiBpbiBNYWluRW50aXR5U2V0IGFuZCBWYWx1ZUxpc3RFbnRpdHlTZXQgYXJlIGRpZmZlcmVudFwiXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBwdlF1YWxpZmllciA9IHZhbHVlTGlzdD8uUHJlc2VudGF0aW9uVmFyaWFudFF1YWxpZmllcjtcblx0XHRcdGNvbnN0IHN2UXVhbGlmaWVyID0gdmFsdWVMaXN0Py5TZWxlY3Rpb25WYXJpYW50UXVhbGlmaWVyO1xuXHRcdFx0Y29uc3QgcHZBbm5vdGF0aW9uOiBhbnkgPSBjb2xsZWN0aW9uUGF0aENvbnZlcnRlckNvbnRleHQ/LmdldEVudGl0eVR5cGVBbm5vdGF0aW9uKFwiQFVJLlByZXNlbnRhdGlvblZhcmlhbnQjXCIgKyBwdlF1YWxpZmllcilcblx0XHRcdFx0Py5hbm5vdGF0aW9uO1xuXHRcdFx0Y29uc3QgYWdncmVnYXRpb25IZWxwZXIgPSBuZXcgQWdncmVnYXRpb25IZWxwZXIoY29sbGVjdGlvblBhdGhDb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVR5cGUoKSwgY29sbGVjdGlvblBhdGhDb252ZXJ0ZXJDb250ZXh0KTtcblx0XHRcdGlmICghYWdncmVnYXRpb25IZWxwZXIuaXNBbmFseXRpY3NTdXBwb3J0ZWQoKSkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRpZiAocHZBbm5vdGF0aW9uKSB7XG5cdFx0XHRcdGNvbnN0IGFWaXN1YWxpemF0aW9ucyA9IHB2QW5ub3RhdGlvbj8uVmlzdWFsaXphdGlvbnM7XG5cdFx0XHRcdGNvbnN0IGNvbnRleHRQYXRoID0gXCIvXCIgKyB2YWx1ZUxpc3Q/LkNvbGxlY3Rpb25QYXRoIHx8IFwiL1wiICsgY29sbGVjdGlvblBhdGhDb252ZXJ0ZXJDb250ZXh0Py5nZXRFbnRpdHlTZXQoKT8ubmFtZTtcblx0XHRcdFx0dmlzdWFsRmlsdGVyLmNvbnRleHRQYXRoID0gY29udGV4dFBhdGg7XG5cdFx0XHRcdGxldCBjaGFydEFubm90YXRpb247XG5cdFx0XHRcdGZvciAoY29uc3QgdmlzdWFsaXphdGlvbiBvZiBhVmlzdWFsaXphdGlvbnMpIHtcblx0XHRcdFx0XHRpZiAodmlzdWFsaXphdGlvbi4kdGFyZ2V0Py50ZXJtID09PSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkNoYXJ0XCIpIHtcblx0XHRcdFx0XHRcdGNoYXJ0QW5ub3RhdGlvbiA9IHZpc3VhbGl6YXRpb247XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKGNoYXJ0QW5ub3RhdGlvbikge1xuXHRcdFx0XHRcdGNvbnN0IF9iZ2V0VkZBZ2dyZWdhdGlvbjogYm9vbGVhbiB8IHVuZGVmaW5lZCA9IF9jaGVja1ZGQWdncmVnYXRpb24oXG5cdFx0XHRcdFx0XHRjb2xsZWN0aW9uUGF0aENvbnZlcnRlckNvbnRleHQsXG5cdFx0XHRcdFx0XHRjaGFydEFubm90YXRpb24sXG5cdFx0XHRcdFx0XHRhZ2dyZWdhdGlvbkhlbHBlclxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0aWYgKCFfYmdldFZGQWdncmVnYXRpb24pIHtcblx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Y29uc3QgYkRpbWVuc2lvbkhpZGRlbjogYm9vbGVhbiA9IGNoYXJ0QW5ub3RhdGlvbj8uJHRhcmdldD8uRGltZW5zaW9uc1swXT8uJHRhcmdldD8uYW5ub3RhdGlvbnM/LlVJPy5IaWRkZW4/LnZhbHVlT2YoKTtcblx0XHRcdFx0XHRjb25zdCBiRGltZW5zaW9uSGlkZGVuRmlsdGVyOiBib29sZWFuID0gY2hhcnRBbm5vdGF0aW9uPy4kdGFyZ2V0Py5EaW1lbnNpb25zWzBdPy4kdGFyZ2V0Py5hbm5vdGF0aW9ucz8uVUk/LkhpZGRlbkZpbHRlcj8udmFsdWVPZigpO1xuXHRcdFx0XHRcdGlmIChiRGltZW5zaW9uSGlkZGVuID09PSB0cnVlIHx8IGJEaW1lbnNpb25IaWRkZW5GaWx0ZXIgPT09IHRydWUpIHtcblx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKGFWaXN1YWxpemF0aW9ucyAmJiBhVmlzdWFsaXphdGlvbnMubGVuZ3RoKSB7XG5cdFx0XHRcdFx0XHR2aXN1YWxGaWx0ZXIuY2hhcnRBbm5vdGF0aW9uID0gY2hhcnRBbm5vdGF0aW9uXG5cdFx0XHRcdFx0XHRcdD8gY29sbGVjdGlvblBhdGhDb252ZXJ0ZXJDb250ZXh0Py5nZXRBYnNvbHV0ZUFubm90YXRpb25QYXRoKFxuXHRcdFx0XHRcdFx0XHRcdFx0Y2hhcnRBbm5vdGF0aW9uLmZ1bGx5UXVhbGlmaWVkTmFtZSArIFwiLyRBbm5vdGF0aW9uUGF0aC9cIlxuXHRcdFx0XHRcdFx0XHQgIClcblx0XHRcdFx0XHRcdFx0OiB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0XHR2aXN1YWxGaWx0ZXIucHJlc2VudGF0aW9uQW5ub3RhdGlvbiA9IHB2QW5ub3RhdGlvblxuXHRcdFx0XHRcdFx0XHQ/IGNvbGxlY3Rpb25QYXRoQ29udmVydGVyQ29udGV4dD8uZ2V0QWJzb2x1dGVBbm5vdGF0aW9uUGF0aChwdkFubm90YXRpb24uZnVsbHlRdWFsaWZpZWROYW1lICsgXCIvXCIpXG5cdFx0XHRcdFx0XHRcdDogdW5kZWZpbmVkO1xuXHRcdFx0XHRcdFx0dmlzdWFsRmlsdGVyLm91dFBhcmFtZXRlciA9IG91dFBhcmFtZXRlcj8uTG9jYWxEYXRhUHJvcGVydHk/LnZhbHVlO1xuXHRcdFx0XHRcdFx0dmlzdWFsRmlsdGVyLmluUGFyYW1ldGVycyA9IGluUGFyYW1ldGVycztcblx0XHRcdFx0XHRcdGNvbnN0IGJJc1JhbmdlID0gY2hlY2tGaWx0ZXJFeHByZXNzaW9uUmVzdHJpY3Rpb25zKFxuXHRcdFx0XHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0XG5cdFx0XHRcdFx0XHRcdFx0LmdldENvbnZlcnRlckNvbnRleHRGb3IoY29udmVydGVyQ29udGV4dC5nZXRBYnNvbHV0ZUFubm90YXRpb25QYXRoKHNQcm9wZXJ0eVBhdGgpKVxuXHRcdFx0XHRcdFx0XHRcdC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCksXG5cdFx0XHRcdFx0XHRcdFtcIlNpbmdsZVJhbmdlXCIsIFwiTXVsdGlSYW5nZVwiXVxuXHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0aWYgKGNvbXBpbGVCaW5kaW5nKGJJc1JhbmdlKSA9PT0gXCJ0cnVlXCIpIHtcblx0XHRcdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiUmFuZ2UgQWxsb3dlZEV4cHJlc3Npb24gaXMgbm90IHN1cHBvcnRlZCBmb3IgdmlzdWFsIGZpbHRlcnNcIik7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGNvbnN0IGJJc01haW5FbnRpdHlTZXRTaW5nbGVTZWxlY3Rpb246IGFueSA9IGNoZWNrRmlsdGVyRXhwcmVzc2lvblJlc3RyaWN0aW9ucyhcblx0XHRcdFx0XHRcdFx0Y29udmVydGVyQ29udGV4dFxuXHRcdFx0XHRcdFx0XHRcdC5nZXRDb252ZXJ0ZXJDb250ZXh0Rm9yKGNvbnZlcnRlckNvbnRleHQuZ2V0QWJzb2x1dGVBbm5vdGF0aW9uUGF0aChzUHJvcGVydHlQYXRoKSlcblx0XHRcdFx0XHRcdFx0XHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpLFxuXHRcdFx0XHRcdFx0XHRbXCJTaW5nbGVWYWx1ZVwiXVxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdHZpc3VhbEZpbHRlci5tdWx0aXBsZVNlbGVjdGlvbkFsbG93ZWQgPSBjb21waWxlQmluZGluZyghYklzTWFpbkVudGl0eVNldFNpbmdsZVNlbGVjdGlvbi52YWx1ZSkgYXMgYW55O1xuXHRcdFx0XHRcdFx0dmlzdWFsRmlsdGVyLnJlcXVpcmVkID0gZ2V0SXNSZXF1aXJlZChjb252ZXJ0ZXJDb250ZXh0LCBzUHJvcGVydHlQYXRoKTtcblx0XHRcdFx0XHRcdGxldCBzdkFubm90YXRpb246IGFueTtcblx0XHRcdFx0XHRcdGlmIChzdlF1YWxpZmllcikge1xuXHRcdFx0XHRcdFx0XHRzdkFubm90YXRpb24gPSBjb2xsZWN0aW9uUGF0aENvbnZlcnRlckNvbnRleHQ/LmdldEVudGl0eVR5cGVBbm5vdGF0aW9uKFwiQFVJLlNlbGVjdGlvblZhcmlhbnQjXCIgKyBzdlF1YWxpZmllcilcblx0XHRcdFx0XHRcdFx0XHQ/LmFubm90YXRpb247XG5cdFx0XHRcdFx0XHRcdHZpc3VhbEZpbHRlci5zZWxlY3Rpb25WYXJpYW50QW5ub3RhdGlvbiA9IHN2QW5ub3RhdGlvblxuXHRcdFx0XHRcdFx0XHRcdD8gY29sbGVjdGlvblBhdGhDb252ZXJ0ZXJDb250ZXh0Py5nZXRBYnNvbHV0ZUFubm90YXRpb25QYXRoKHN2QW5ub3RhdGlvbi5mdWxseVF1YWxpZmllZE5hbWUgKyBcIi9cIilcblx0XHRcdFx0XHRcdFx0XHQ6IHVuZGVmaW5lZDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGxldCByZXF1aXJlZFByb3BlcnRpZXMgPSBbXTtcblx0XHRcdFx0XHRcdGlmIChwYXJhbWV0ZXJFbnRpdHlUeXBlKSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IHNFbnRpdHlTZXQgPSBjb2xsZWN0aW9uUGF0aC5zcGxpdChcIi9cIilbMF07XG5cdFx0XHRcdFx0XHRcdGNvbnN0IHNOYXZpZ2F0aW9uUHJvcGVydHkgPSBjb2xsZWN0aW9uUGF0aC5zcGxpdChcIi9cIilbMV07XG5cdFx0XHRcdFx0XHRcdGNvbnN0IG9FbnRpdHlTZXRDb252ZXJ0ZXJDb250ZXh0ID0gY29udmVydGVyQ29udGV4dC5nZXRDb252ZXJ0ZXJDb250ZXh0Rm9yKFwiL1wiICsgc0VudGl0eVNldCk7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IGFSZXN0cmljdGVkUHJvcGVydGllcyA9IG9FbnRpdHlTZXRDb252ZXJ0ZXJDb250ZXh0Py5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCkuc3RhcnRpbmdFbnRpdHlTZXRcblx0XHRcdFx0XHRcdFx0XHQ/LmFubm90YXRpb25zPy5DYXBhYmlsaXRpZXM/Lk5hdmlnYXRpb25SZXN0cmljdGlvbnM/LlJlc3RyaWN0ZWRQcm9wZXJ0aWVzO1xuXHRcdFx0XHRcdFx0XHRjb25zdCBvUmVzdHJpY3RlZFByb3BlcnR5ID0gYVJlc3RyaWN0ZWRQcm9wZXJ0aWVzPy5maW5kKFxuXHRcdFx0XHRcdFx0XHRcdChyZXN0cmljdGVkTmF2UHJvcDogTmF2aWdhdGlvblByb3BlcnR5UmVzdHJpY3Rpb25UeXBlcykgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKHJlc3RyaWN0ZWROYXZQcm9wLk5hdmlnYXRpb25Qcm9wZXJ0eT8udHlwZSA9PT0gXCJOYXZpZ2F0aW9uUHJvcGVydHlQYXRoXCIpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHJlc3RyaWN0ZWROYXZQcm9wLk5hdmlnYXRpb25Qcm9wZXJ0eS52YWx1ZSA9PT0gc05hdmlnYXRpb25Qcm9wZXJ0eTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdHJlcXVpcmVkUHJvcGVydGllcyA9IG9SZXN0cmljdGVkUHJvcGVydHk/LkZpbHRlclJlc3RyaWN0aW9ucz8uUmVxdWlyZWRQcm9wZXJ0aWVzIGFzIGFueVtdO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0Y29uc3QgZW50aXR5U2V0QW5ub3RhdGlvbnMgPSBjb2xsZWN0aW9uUGF0aENvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0KCk/LmFubm90YXRpb25zO1xuXHRcdFx0XHRcdFx0XHRyZXF1aXJlZFByb3BlcnRpZXMgPSBlbnRpdHlTZXRBbm5vdGF0aW9ucz8uQ2FwYWJpbGl0aWVzPy5GaWx0ZXJSZXN0cmljdGlvbnM/LlJlcXVpcmVkUHJvcGVydGllcyBhcyBhbnlbXTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGxldCByZXF1aXJlZFByb3BlcnR5UGF0aHM6IEFycmF5PG9iamVjdD4gPSBbXTtcblx0XHRcdFx0XHRcdGlmIChyZXF1aXJlZFByb3BlcnRpZXM/Lmxlbmd0aCkge1xuXHRcdFx0XHRcdFx0XHRyZXF1aXJlZFByb3BlcnRpZXMuZm9yRWFjaChmdW5jdGlvbihvUmVxdWlyZVByb3BlcnR5OiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRyZXF1aXJlZFByb3BlcnR5UGF0aHMucHVzaChvUmVxdWlyZVByb3BlcnR5LnZhbHVlKTtcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRyZXF1aXJlZFByb3BlcnR5UGF0aHMgPSByZXF1aXJlZFByb3BlcnR5UGF0aHMuY29uY2F0KGFQYXJhbWV0ZXJzKTtcblx0XHRcdFx0XHRcdHZpc3VhbEZpbHRlci5yZXF1aXJlZFByb3BlcnRpZXMgPSByZXF1aXJlZFByb3BlcnR5UGF0aHM7XG5cdFx0XHRcdFx0XHRpZiAodmlzdWFsRmlsdGVyLnJlcXVpcmVkUHJvcGVydGllcz8ubGVuZ3RoKSB7XG5cdFx0XHRcdFx0XHRcdGlmICghdmlzdWFsRmlsdGVyLmluUGFyYW1ldGVycyB8fCAhdmlzdWFsRmlsdGVyLmluUGFyYW1ldGVycy5sZW5ndGgpIHtcblx0XHRcdFx0XHRcdFx0XHRpZiAoIXZpc3VhbEZpbHRlci5zZWxlY3Rpb25WYXJpYW50QW5ub3RhdGlvbikge1xuXHRcdFx0XHRcdFx0XHRcdFx0dmlzdWFsRmlsdGVyLnNob3dPdmVybGF5SW5pdGlhbGx5ID0gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0bGV0IHNlbGVjdE9wdGlvbnMgPVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRzdkFubm90YXRpb24/LlNlbGVjdE9wdGlvbnM/Lm1hcCgob1NlbGVjdE9wdGlvbjogYW55KSA9PiBvU2VsZWN0T3B0aW9uLlByb3BlcnR5TmFtZS52YWx1ZSkgfHwgW107XG5cdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBwYXJhbWV0ZXJPcHRpb25zID1cblx0XHRcdFx0XHRcdFx0XHRcdFx0c3ZBbm5vdGF0aW9uPy5QYXJhbWV0ZXJzPy5tYXAoKG9QYXJhbWV0ZXJPcHRpb246IGFueSkgPT4gb1BhcmFtZXRlck9wdGlvbi5Qcm9wZXJ0eU5hbWUudmFsdWUpIHx8IFtdO1xuXHRcdFx0XHRcdFx0XHRcdFx0c2VsZWN0T3B0aW9ucyA9IHNlbGVjdE9wdGlvbnMuY29uY2F0KHBhcmFtZXRlck9wdGlvbnMpO1xuXHRcdFx0XHRcdFx0XHRcdFx0cmVxdWlyZWRQcm9wZXJ0eVBhdGhzID0gcmVxdWlyZWRQcm9wZXJ0eVBhdGhzLnNvcnQoKTtcblx0XHRcdFx0XHRcdFx0XHRcdHNlbGVjdE9wdGlvbnMgPSBzZWxlY3RPcHRpb25zLnNvcnQoKTtcblx0XHRcdFx0XHRcdFx0XHRcdHZpc3VhbEZpbHRlci5zaG93T3ZlcmxheUluaXRpYWxseSA9IHJlcXVpcmVkUHJvcGVydHlQYXRocy5zb21lKGZ1bmN0aW9uKHNQYXRoKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBzZWxlY3RPcHRpb25zLmluZGV4T2Yoc1BhdGgpID09PSAtMTtcblx0XHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHR2aXN1YWxGaWx0ZXIuc2hvd092ZXJsYXlJbml0aWFsbHkgPSBmYWxzZTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0dmlzdWFsRmlsdGVyLnNob3dPdmVybGF5SW5pdGlhbGx5ID0gZmFsc2U7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRjb25zdCBzRGltZW5zaW9uVHlwZSA9IGNoYXJ0QW5ub3RhdGlvbj8uJHRhcmdldD8uRGltZW5zaW9uc1swXT8uJHRhcmdldD8udHlwZTtcblx0XHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdFx0IShcblx0XHRcdFx0XHRcdFx0XHRzRGltZW5zaW9uVHlwZSA9PT0gXCJFZG0uRGF0ZVRpbWVPZmZzZXRcIiB8fFxuXHRcdFx0XHRcdFx0XHRcdHNEaW1lbnNpb25UeXBlID09PSBcIkVkbS5EYXRlXCIgfHxcblx0XHRcdFx0XHRcdFx0XHRzRGltZW5zaW9uVHlwZSA9PT0gXCJFZG0uVGltZU9mRGF5XCJcblx0XHRcdFx0XHRcdFx0KSAmJlxuXHRcdFx0XHRcdFx0XHRjaGFydEFubm90YXRpb24uJHRhcmdldC5DaGFydFR5cGUgPT09IFwiVUkuQ2hhcnRUeXBlL0xpbmVcIlxuXHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdHZpc3VhbEZpbHRlci5yZW5kZXJMaW5lQ2hhcnQgPSBmYWxzZTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdHZpc3VhbEZpbHRlci5yZW5kZXJMaW5lQ2hhcnQgPSB0cnVlO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0XG5cdFx0XHRcdFx0XHQuZ2V0RGlhZ25vc3RpY3MoKVxuXHRcdFx0XHRcdFx0LmFkZElzc3VlKElzc3VlQ2F0ZWdvcnkuQW5ub3RhdGlvbiwgSXNzdWVTZXZlcml0eS5IaWdoLCBJc3N1ZVR5cGUuTUFMRk9STUVEX1ZJU1VBTEZJTFRFUlMuQ0hBUlQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0XG5cdFx0XHRcdFx0LmdldERpYWdub3N0aWNzKClcblx0XHRcdFx0XHQuYWRkSXNzdWUoSXNzdWVDYXRlZ29yeS5Bbm5vdGF0aW9uLCBJc3N1ZVNldmVyaXR5LkhpZ2gsIElzc3VlVHlwZS5NQUxGT1JNRURfVklTVUFMRklMVEVSUy5QUkVTRU5UQVRJT05WQVJJQU5UKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29udmVydGVyQ29udGV4dFxuXHRcdFx0XHQuZ2V0RGlhZ25vc3RpY3MoKVxuXHRcdFx0XHQuYWRkSXNzdWUoSXNzdWVDYXRlZ29yeS5Bbm5vdGF0aW9uLCBJc3N1ZVNldmVyaXR5LkhpZ2gsIElzc3VlVHlwZS5NQUxGT1JNRURfVklTVUFMRklMVEVSUy5WQUxVRUxJU1QpO1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldERpYWdub3N0aWNzKCkuYWRkSXNzdWUoSXNzdWVDYXRlZ29yeS5NYW5pZmVzdCwgSXNzdWVTZXZlcml0eS5IaWdoLCBJc3N1ZVR5cGUuTUFMRk9STUVEX1ZJU1VBTEZJTFRFUlMuVkFMVUVMSVNUKTtcblx0fVxuXHRpZiAoT2JqZWN0LmtleXModmlzdWFsRmlsdGVyKS5sZW5ndGggPiAxKSB7XG5cdFx0cmV0dXJuIHZpc3VhbEZpbHRlcjtcblx0fVxufVxuIl19
366
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlZpc3VhbEZpbHRlcnMudHMiXSwibmFtZXMiOlsiX2NoZWNrVkZBZ2dyZWdhdGlvbiIsImNvbnZlcnRlckNvbnRleHQiLCJjaGFydEFubm90YXRpb24iLCJhZ2dyZWdhdGlvbkhlbHBlciIsInNNZWFzdXJlUGF0aCIsImJHcm91cGFibGUiLCJiQWdncmVnYXRhYmxlIiwic01lYXN1cmUiLCIkdGFyZ2V0IiwiTWVhc3VyZXMiLCJ2YWx1ZSIsInNEaW1lbnNpb24iLCJEaW1lbnNpb25zIiwiY3VzdG9tQWdncmVnYXRlcyIsImdldEN1c3RvbUFnZ3JlZ2F0ZURlZmluaXRpb25zIiwiYVRyYW5zQWdncmVnYXRpb25zIiwiZ2V0VHJhbnNBZ2dyZWdhdGlvbnMiLCJzb21lIiwiY3VzdEFnZyIsInF1YWxpZmllciIsImFBZ2dyZWdhdGlvbnMiLCJvQWdncmVnYXRlIiwiTmFtZSIsIkFnZ3JlZ2F0YWJsZVByb3BlcnR5IiwiYUFnZ3JlZ2F0YWJsZVByb3BzRnJvbUNvbnRhaW5lciIsImdldEFnZ3JlZ2F0YWJsZVByb3BlcnRpZXMiLCJhR3JvdXBhYmxlUHJvcHNGcm9tQ29udGFpbmVyIiwiZ2V0R3JvdXBhYmxlUHJvcGVydGllcyIsImxlbmd0aCIsImFnZ3JlZ2F0YWJsZVByb3AiLCJQcm9wZXJ0eSIsImdyb3VwYWJsZVByb3AiLCJnZXRWaXN1YWxGaWx0ZXJzIiwiZW50aXR5VHlwZSIsInNQcm9wZXJ0eVBhdGgiLCJGaWx0ZXJGaWVsZHMiLCJ2aXN1YWxGaWx0ZXIiLCJvVmlzdWFsRmlsdGVyIiwidmFsdWVMaXN0Iiwib1ZGUGF0aCIsImFubm90YXRpb25RdWFsaWZpZXJTcGxpdCIsInNwbGl0IiwicXVhbGlmaWVyVkwiLCJwcm9wZXJ0eSIsInJlc29sdmVQYXRoIiwiYW5ub3RhdGlvbnMiLCJDb21tb24iLCJjb2xsZWN0aW9uUGF0aCIsIkNvbGxlY3Rpb25QYXRoIiwiY29sbGVjdGlvblBhdGhDb252ZXJ0ZXJDb250ZXh0IiwiZ2V0Q29udmVydGVyQ29udGV4dEZvciIsImdldEVudGl0eVNldCIsIm5hbWUiLCJ2YWx1ZUxpc3RQYXJhbXMiLCJQYXJhbWV0ZXJzIiwib3V0UGFyYW1ldGVyIiwiaW5QYXJhbWV0ZXJzIiwiYVBhcmFtZXRlcnMiLCJnZXREYXRhTW9kZWxPYmplY3RQYXRoIiwidGFyZ2V0RW50aXR5U2V0IiwicmVzb2x2ZWRUYXJnZXQiLCJnZXRFbnRpdHlUeXBlQW5ub3RhdGlvbiIsInBhcmFtZXRlckVudGl0eVR5cGUiLCJnZXRQYXJhbWV0ZXJFbnRpdHlUeXBlIiwia2V5cyIsIm1hcCIsImtleSIsImdldENvbnRleHRQYXRoIiwiZm9yRWFjaCIsInBhcmFtZXRlciIsInB1c2giLCJsb2NhbERhdGFQcm9wZXJ0eSIsInZhbHVlTGlzdFByb3BlcnR5IiwidmFsdWVMaXN0UGFyYW0iLCJMb2NhbERhdGFQcm9wZXJ0eSIsIlZhbHVlTGlzdFByb3BlcnR5IiwiJFR5cGUiLCJiTm90RmlsdGVyYWJsZSIsImlzUHJvcGVydHlGaWx0ZXJhYmxlIiwib0luUGFyYW1ldGVyIiwibWFpbkVudGl0eVNldEluTWFwcGluZ0FsbG93ZWRFeHByZXNzaW9uIiwiY29tcGlsZUV4cHJlc3Npb24iLCJjaGVja0ZpbHRlckV4cHJlc3Npb25SZXN0cmljdGlvbnMiLCJnZXRBYnNvbHV0ZUFubm90YXRpb25QYXRoIiwidmFsdWVMaXN0RW50aXR5U2V0SW5NYXBwaW5nQWxsb3dlZEV4cHJlc3Npb24iLCJFcnJvciIsInB2UXVhbGlmaWVyIiwiUHJlc2VudGF0aW9uVmFyaWFudFF1YWxpZmllciIsInN2UXVhbGlmaWVyIiwiU2VsZWN0aW9uVmFyaWFudFF1YWxpZmllciIsInB2QW5ub3RhdGlvbiIsImFubm90YXRpb24iLCJBZ2dyZWdhdGlvbkhlbHBlciIsImdldEVudGl0eVR5cGUiLCJpc0FuYWx5dGljc1N1cHBvcnRlZCIsImFWaXN1YWxpemF0aW9ucyIsIlZpc3VhbGl6YXRpb25zIiwiY29udGV4dFBhdGgiLCJ2aXN1YWxpemF0aW9uIiwidGVybSIsIl9iZ2V0VkZBZ2dyZWdhdGlvbiIsImJEaW1lbnNpb25IaWRkZW4iLCJVSSIsIkhpZGRlbiIsInZhbHVlT2YiLCJiRGltZW5zaW9uSGlkZGVuRmlsdGVyIiwiSGlkZGVuRmlsdGVyIiwiZnVsbHlRdWFsaWZpZWROYW1lIiwidW5kZWZpbmVkIiwicHJlc2VudGF0aW9uQW5ub3RhdGlvbiIsImJJc1JhbmdlIiwiYklzTWFpbkVudGl0eVNldFNpbmdsZVNlbGVjdGlvbiIsIm11bHRpcGxlU2VsZWN0aW9uQWxsb3dlZCIsInJlcXVpcmVkIiwiZ2V0SXNSZXF1aXJlZCIsInN2QW5ub3RhdGlvbiIsInNlbGVjdGlvblZhcmlhbnRBbm5vdGF0aW9uIiwicmVxdWlyZWRQcm9wZXJ0aWVzIiwic0VudGl0eVNldCIsInNOYXZpZ2F0aW9uUHJvcGVydHkiLCJvRW50aXR5U2V0Q29udmVydGVyQ29udGV4dCIsImFSZXN0cmljdGVkUHJvcGVydGllcyIsInN0YXJ0aW5nRW50aXR5U2V0IiwiQ2FwYWJpbGl0aWVzIiwiTmF2aWdhdGlvblJlc3RyaWN0aW9ucyIsIlJlc3RyaWN0ZWRQcm9wZXJ0aWVzIiwib1Jlc3RyaWN0ZWRQcm9wZXJ0eSIsImZpbmQiLCJyZXN0cmljdGVkTmF2UHJvcCIsIk5hdmlnYXRpb25Qcm9wZXJ0eSIsInR5cGUiLCJGaWx0ZXJSZXN0cmljdGlvbnMiLCJSZXF1aXJlZFByb3BlcnRpZXMiLCJlbnRpdHlTZXRBbm5vdGF0aW9ucyIsInJlcXVpcmVkUHJvcGVydHlQYXRocyIsIm9SZXF1aXJlUHJvcGVydHkiLCJjb25jYXQiLCJzaG93T3ZlcmxheUluaXRpYWxseSIsInNlbGVjdE9wdGlvbnMiLCJTZWxlY3RPcHRpb25zIiwib1NlbGVjdE9wdGlvbiIsIlByb3BlcnR5TmFtZSIsInBhcmFtZXRlck9wdGlvbnMiLCJvUGFyYW1ldGVyT3B0aW9uIiwic29ydCIsInNQYXRoIiwiaW5kZXhPZiIsInNEaW1lbnNpb25UeXBlIiwiQ2hhcnRUeXBlIiwicmVuZGVyTGluZUNoYXJ0IiwiZ2V0RGlhZ25vc3RpY3MiLCJhZGRJc3N1ZSIsIklzc3VlQ2F0ZWdvcnkiLCJBbm5vdGF0aW9uIiwiSXNzdWVTZXZlcml0eSIsIkhpZ2giLCJJc3N1ZVR5cGUiLCJNQUxGT1JNRURfVklTVUFMRklMVEVSUyIsIkNIQVJUIiwiUFJFU0VOVEFUSU9OVkFSSUFOVCIsIlZBTFVFTElTVCIsIk1hbmlmZXN0IiwiT2JqZWN0Il0sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQTJCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTUEsbUJBQW1CLEdBQUcsVUFDM0JDLGdCQUQyQixFQUUzQkMsZUFGMkIsRUFHM0JDLGlCQUgyQixFQUlMO0FBQUE7O0FBQ3RCLFFBQUlDLFlBQUosRUFBa0JDLFVBQWxCLEVBQThCQyxhQUE5QjtBQUNBLFFBQU1DLFFBQWdCLEdBQUdMLGVBQUgsYUFBR0EsZUFBSCxnREFBR0EsZUFBZSxDQUFFTSxPQUFwQixvRkFBRyxzQkFBMEJDLFFBQTFCLENBQW1DLENBQW5DLENBQUgsMkRBQUcsdUJBQXVDQyxLQUFoRTtBQUNBLFFBQU1DLFVBQWtCLEdBQUdULGVBQUgsYUFBR0EsZUFBSCxpREFBR0EsZUFBZSxDQUFFTSxPQUFwQixxRkFBRyx1QkFBMEJJLFVBQTFCLENBQXFDLENBQXJDLENBQUgsMkRBQUcsdUJBQXlDRixLQUFwRTtBQUNBLFFBQU1HLGdCQUFnQixHQUFHVixpQkFBaUIsQ0FBQ1csNkJBQWxCLEVBQXpCO0FBQ0EsUUFBTUMsa0JBQWtCLEdBQUdaLGlCQUFpQixDQUFDYSxvQkFBbEIsRUFBM0I7O0FBRUEsUUFDQ0gsZ0JBQWdCLENBQUNJLElBQWpCLENBQXNCLFVBQVVDLE9BQVYsRUFBb0Q7QUFDekUsYUFBT0EsT0FBTyxDQUFDQyxTQUFSLEtBQXNCWixRQUE3QjtBQUNBLEtBRkQsQ0FERCxFQUlFO0FBQ0RILE1BQUFBLFlBQVksR0FBR0csUUFBZjtBQUNBLEtBTkQsTUFNTyxJQUFJUSxrQkFBa0IsSUFBSUEsa0JBQWtCLENBQUMsQ0FBRCxDQUE1QyxF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QUFDQyxVQUZ6QixFQUVxQ0MsYUFBYSxDQUFDQyxJQUZuRCxFQUV5REMsU0FBUyxDQUFDQyx1QkFBVixDQUFrQ0UsbUJBRjNGO0FBR0E7QUFDRCxPQWpPRCxNQWlPTztBQUNOOUosUUFBQUEsZ0JBQWdCLENBQ2RxSixjQURGLEdBRUVDLFFBRkYsQ0FFV0MsYUFBYSxDQUFDQyxVQUZ6QixFQUVxQ0MsYUFBYSxDQUFDQyxJQUZuRCxFQUV5REMsU0FBUyxDQUFDQyx1QkFBVixDQUFrQ0csU0FGM0Y7QUFHQTtBQUNELEtBNU9ELE1BNE9PO0FBQ04vSixNQUFBQSxnQkFBZ0IsQ0FBQ3FKLGNBQWpCLEdBQWtDQyxRQUFsQyxDQUEyQ0MsYUFBYSxDQUFDUyxRQUF6RCxFQUFtRVAsYUFBYSxDQUFDQyxJQUFqRixFQUF1RkMsU0FBUyxDQUFDQyx1QkFBVixDQUFrQ0csU0FBekg7QUFDQTs7QUFDRCxRQUFJRSxNQUFNLENBQUNsRyxJQUFQLENBQVk1QixZQUFaLEVBQTBCUixNQUExQixHQUFtQyxDQUF2QyxFQUEwQztBQUN6QyxhQUFPUSxZQUFQO0FBQ0E7QUFDRCIsInNvdXJjZVJvb3QiOiIuIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBBbm5vdGF0aW9uVGVybSwgRW50aXR5VHlwZSB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlc1wiO1xuaW1wb3J0IHR5cGUgeyBDdXN0b21BZ2dyZWdhdGUgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL0FnZ3JlZ2F0aW9uXCI7XG5pbXBvcnQgdHlwZSB7IE5hdmlnYXRpb25Qcm9wZXJ0eVJlc3RyaWN0aW9uVHlwZXMgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL0NhcGFiaWxpdGllc1wiO1xuaW1wb3J0IHR5cGUgQ29udmVydGVyQ29udGV4dCBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9Db252ZXJ0ZXJDb250ZXh0XCI7XG5pbXBvcnQgeyBBZ2dyZWdhdGlvbkhlbHBlciB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2hlbHBlcnMvQWdncmVnYXRpb25cIjtcbmltcG9ydCB7IElzc3VlQ2F0ZWdvcnksIElzc3VlU2V2ZXJpdHksIElzc3VlVHlwZSB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2hlbHBlcnMvSXNzdWVNYW5hZ2VyXCI7XG5pbXBvcnQgdHlwZSB7IEZpbHRlckZpZWxkTWFuaWZlc3RDb25maWd1cmF0aW9uIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWFuaWZlc3RTZXR0aW5nc1wiO1xuaW1wb3J0IHsgY29tcGlsZUV4cHJlc3Npb24gfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9CaW5kaW5nVG9vbGtpdFwiO1xuaW1wb3J0IHsgY2hlY2tGaWx0ZXJFeHByZXNzaW9uUmVzdHJpY3Rpb25zIH0gZnJvbSBcInNhcC9mZS9jb3JlL3RlbXBsYXRpbmcvRGF0YU1vZGVsUGF0aEhlbHBlclwiO1xuaW1wb3J0IHsgZ2V0SXNSZXF1aXJlZCwgaXNQcm9wZXJ0eUZpbHRlcmFibGUgfSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9GaWx0ZXJUZW1wbGF0aW5nXCI7XG5cbmV4cG9ydCB0eXBlIFZpc3VhbEZpbHRlcnMgPSB7XG5cdGRpbWVuc2lvblBhdGg/OiBzdHJpbmc7XG5cdG1lYXN1cmVQYXRoPzogc3RyaW5nO1xuXHRsYWJlbD86IHN0cmluZztcblx0Y2hhcnRBbm5vdGF0aW9uPzogc3RyaW5nO1xuXHRwcmVzZW50YXRpb25Bbm5vdGF0aW9uPzogc3RyaW5nO1xuXHR2aXNpYmxlPzogYm9vbGVhbjtcblx0b3V0UGFyYW1ldGVyPzogc3RyaW5nO1xuXHRpblBhcmFtZXRlcnM/OiBvYmplY3RbXTtcblx0Y29udGV4dFBhdGg/OiBzdHJpbmc7XG5cdHNlbGVjdGlvblZhcmlhbnRBbm5vdGF0aW9uPzogc3RyaW5nO1xuXHRtdWx0aXBsZVNlbGVjdGlvbkFsbG93ZWQ/OiBib29sZWFuO1xuXHRyZXF1aXJlZD86IGJvb2xlYW47XG5cdHNob3dPdmVybGF5SW5pdGlhbGx5PzogYm9vbGVhbjtcblx0cmVuZGVyTGluZUNoYXJ0PzogYm9vbGVhbjtcblx0cmVxdWlyZWRQcm9wZXJ0aWVzPzogb2JqZWN0W107XG59O1xuXG4vKipcbiAqIENoZWNrcyB0aGF0IG1lYXN1cmVzIGFuZCBkaW1lbnNpb25zIG9mIHRoZSB2aXN1YWwgZmlsdGVyIGNoYXJ0IGNhbiBiZSBhZ2dyZWdhdGVkIGFuZCBncm91cGVkLlxuICpcbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHBhcmFtIGNoYXJ0QW5ub3RhdGlvbiBUaGUgY2hhcnQgYW5ub3RhdGlvblxuICogQHBhcmFtIGFnZ3JlZ2F0aW9uSGVscGVyIFRoZSBhZ2dyZWdhdGlvbiBoZWxwZXJcbiAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgbWVhc3VyZSBjYW4gYmUgZ3JvdXBlZCBhbmQgYWdncmVnYXRlZFxuICovXG5jb25zdCBfY2hlY2tWRkFnZ3JlZ2F0aW9uID0gZnVuY3Rpb24gKFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LFxuXHRjaGFydEFubm90YXRpb246IGFueSxcblx0YWdncmVnYXRpb25IZWxwZXI6IGFueVxuKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG5cdGxldCBzTWVhc3VyZVBhdGgsIGJHcm91cGFibGUsIGJBZ2dyZWdhdGFibGU7XG5cdGNvbnN0IHNNZWFzdXJlOiBzdHJpbmcgPSBjaGFydEFubm90YXRpb24/LiR0YXJnZXQ/Lk1lYXN1cmVzWzBdPy52YWx1ZTtcblx0Y29uc3Qgc0RpbWVuc2lvbjogc3RyaW5nID0gY2hhcnRBbm5vdGF0aW9uPy4kdGFyZ2V0Py5EaW1lbnNpb25zWzBdPy52YWx1ZTtcblx0Y29uc3QgY3VzdG9tQWdncmVnYXRlcyA9IGFnZ3JlZ2F0aW9uSGVscGVyLmdldEN1c3RvbUFnZ3JlZ2F0ZURlZmluaXRpb25zKCk7XG5cdGNvbnN0IGFUcmFuc0FnZ3JlZ2F0aW9ucyA9IGFnZ3JlZ2F0aW9uSGVscGVyLmdldFRyYW5zQWdncmVnYXRpb25zKCk7XG5cblx0aWYgKFxuXHRcdGN1c3RvbUFnZ3JlZ2F0ZXMuc29tZShmdW5jdGlvbiAoY3VzdEFnZzogQW5ub3RhdGlvblRlcm08Q3VzdG9tQWdncmVnYXRlPikge1xuXHRcdFx0cmV0dXJuIGN1c3RBZ2cucXVhbGlmaWVyID09PSBzTWVhc3VyZTtcblx0XHR9KVxuXHQpIHtcblx0XHRzTWVhc3VyZVBhdGggPSBzTWVhc3VyZTtcblx0fSBlbHNlIGlmIChhVHJhbnNBZ2dyZWdhdGlvbnMgJiYgYVRyYW5zQWdncmVnYXRpb25zWzBdKSB7XG5cdFx0Y29uc3QgYUFnZ3JlZ2F0aW9ucyA9IGFUcmFuc0FnZ3JlZ2F0aW9uc1swXTtcblx0XHRhQWdncmVnYXRpb25zLnNvbWUoZnVuY3Rpb24gKG9BZ2dyZWdhdGU6IGFueSkge1xuXHRcdFx0aWYgKG9BZ2dyZWdhdGUuTmFtZSA9PT0gc01lYXN1cmUpIHtcblx0XHRcdFx0c01lYXN1cmVQYXRoID0gb0FnZ3JlZ2F0ZT8uQWdncmVnYXRhYmxlUHJvcGVydHkudmFsdWU7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblx0Y29uc3QgYUFnZ3JlZ2F0YWJsZVByb3BzRnJvbUNvbnRhaW5lciA9IGFnZ3JlZ2F0aW9uSGVscGVyLmdldEFnZ3JlZ2F0YWJsZVByb3BlcnRpZXMoKTtcblx0Y29uc3QgYUdyb3VwYWJsZVByb3BzRnJvbUNvbnRhaW5lciA9IGFnZ3JlZ2F0aW9uSGVscGVyLmdldEdyb3VwYWJsZVByb3BlcnRpZXMoKTtcblx0aWYgKGFBZ2dyZWdhdGFibGVQcm9wc0Zyb21Db250YWluZXIgJiYgYUFnZ3JlZ2F0YWJsZVByb3BzRnJvbUNvbnRhaW5lci5sZW5ndGgpIHtcblx0XHRmb3IgKGNvbnN0IGFnZ3JlZ2F0YWJsZVByb3Agb2YgYUFnZ3JlZ2F0YWJsZVByb3BzRnJvbUNvbnRhaW5lcikge1xuXHRcdFx0aWYgKGFnZ3JlZ2F0YWJsZVByb3A/LlByb3BlcnR5Py52YWx1ZSA9PT0gc01lYXN1cmVQYXRoKSB7XG5cdFx0XHRcdGJBZ2dyZWdhdGFibGUgPSB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHRpZiAoYUdyb3VwYWJsZVByb3BzRnJvbUNvbnRhaW5lciAmJiBhR3JvdXBhYmxlUHJvcHNGcm9tQ29udGFpbmVyLmxlbmd0aCkge1xuXHRcdGZvciAoY29uc3QgZ3JvdXBhYmxlUHJvcCBvZiBhR3JvdXBhYmxlUHJvcHNGcm9tQ29udGFpbmVyKSB7XG5cdFx0XHRpZiAoZ3JvdXBhYmxlUHJvcD8udmFsdWUgPT09IHNEaW1lbnNpb24pIHtcblx0XHRcdFx0Ykdyb3VwYWJsZSA9IHRydWU7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdHJldHVybiBiQWdncmVnYXRhYmxlICYmIGJHcm91cGFibGU7XG59O1xuXG4vKipcbiAqIE1ldGhvZCB0byBnZXQgdGhlIHZpc3VhbCBmaWx0ZXJzIG9iamVjdCBmb3IgYSBwcm9wZXJ0eS5cbiAqXG4gKiBAcGFyYW0gZW50aXR5VHlwZSBUaGUgY29udmVydGVyIGNvbnRleHRcbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjaGFydCBhbm5vdGF0aW9uXG4gKiBAcGFyYW0gc1Byb3BlcnR5UGF0aCBUaGUgYWdncmVnYXRpb24gaGVscGVyXG4gKiBAcGFyYW0gRmlsdGVyRmllbGRzIFRoZSBhZ2dyZWdhdGlvbiBoZWxwZXJcbiAqIEByZXR1cm5zIFRoZSB2aXN1YWwgZmlsdGVyc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VmlzdWFsRmlsdGVycyhcblx0ZW50aXR5VHlwZTogRW50aXR5VHlwZSxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCxcblx0c1Byb3BlcnR5UGF0aDogc3RyaW5nLFxuXHRGaWx0ZXJGaWVsZHM6IFJlY29yZDxzdHJpbmcsIEZpbHRlckZpZWxkTWFuaWZlc3RDb25maWd1cmF0aW9uPlxuKTogVmlzdWFsRmlsdGVycyB8IHVuZGVmaW5lZCB7XG5cdGNvbnN0IHZpc3VhbEZpbHRlcjogVmlzdWFsRmlsdGVycyA9IHt9O1xuXHRjb25zdCBvVmlzdWFsRmlsdGVyOiBGaWx0ZXJGaWVsZE1hbmlmZXN0Q29uZmlndXJhdGlvbiA9IEZpbHRlckZpZWxkc1tzUHJvcGVydHlQYXRoXTtcblx0aWYgKG9WaXN1YWxGaWx0ZXI/LnZpc3VhbEZpbHRlcj8udmFsdWVMaXN0KSB7XG5cdFx0Y29uc3Qgb1ZGUGF0aCA9IG9WaXN1YWxGaWx0ZXI/LnZpc3VhbEZpbHRlcj8udmFsdWVMaXN0O1xuXHRcdGNvbnN0IGFubm90YXRpb25RdWFsaWZpZXJTcGxpdCA9IG9WRlBhdGguc3BsaXQoXCIjXCIpO1xuXHRcdGNvbnN0IHF1YWxpZmllclZMID0gYW5ub3RhdGlvblF1YWxpZmllclNwbGl0Lmxlbmd0aCA+IDEgPyBgVmFsdWVMaXN0IyR7YW5ub3RhdGlvblF1YWxpZmllclNwbGl0WzFdfWAgOiBhbm5vdGF0aW9uUXVhbGlmaWVyU3BsaXRbMF07XG5cdFx0Y29uc3QgcHJvcGVydHkgPSBlbnRpdHlUeXBlLnJlc29sdmVQYXRoKHNQcm9wZXJ0eVBhdGgpO1xuXHRcdGNvbnN0IHZhbHVlTGlzdDogYW55ID0gcHJvcGVydHk/LmFubm90YXRpb25zPy5Db21tb25bcXVhbGlmaWVyVkxdO1xuXHRcdGlmICh2YWx1ZUxpc3QpIHtcblx0XHRcdGNvbnN0IGNvbGxlY3Rpb25QYXRoID0gdmFsdWVMaXN0Py5Db2xsZWN0aW9uUGF0aDtcblx0XHRcdGxldCBjb2xsZWN0aW9uUGF0aENvbnZlcnRlckNvbnRleHQgPSBjb252ZXJ0ZXJDb250ZXh0LmdldENvbnZlcnRlckNvbnRleHRGb3IoXG5cdFx0XHRcdGAvJHtjb2xsZWN0aW9uUGF0aCB8fCBjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVNldCgpPy5uYW1lfWBcblx0XHRcdCk7XG5cdFx0XHRjb25zdCB2YWx1ZUxpc3RQYXJhbXMgPSB2YWx1ZUxpc3Q/LlBhcmFtZXRlcnM7XG5cdFx0XHRsZXQgb3V0UGFyYW1ldGVyOiBhbnk7XG5cdFx0XHRjb25zdCBpblBhcmFtZXRlcnM6IEFycmF5PG9iamVjdD4gPSBbXTtcblx0XHRcdGxldCBhUGFyYW1ldGVyczogQXJyYXk8c3RyaW5nPiA9IFtdO1xuXHRcdFx0aWYgKCFjb2xsZWN0aW9uUGF0aENvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpLnRhcmdldEVudGl0eVNldCkge1xuXHRcdFx0XHRjb25zdCByZXNvbHZlZFRhcmdldCA9IGNvbGxlY3Rpb25QYXRoQ29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlUeXBlQW5ub3RhdGlvbihcIlwiKTtcblx0XHRcdFx0Y29sbGVjdGlvblBhdGhDb252ZXJ0ZXJDb250ZXh0ID0gcmVzb2x2ZWRUYXJnZXQuY29udmVydGVyQ29udGV4dDtcblx0XHRcdH1cblx0XHRcdGNvbnN0IHBhcmFtZXRlckVudGl0eVR5cGUgPSBjb2xsZWN0aW9uUGF0aENvbnZlcnRlckNvbnRleHQuZ2V0UGFyYW1ldGVyRW50aXR5VHlwZSgpO1xuXHRcdFx0YVBhcmFtZXRlcnMgPSBwYXJhbWV0ZXJFbnRpdHlUeXBlXG5cdFx0XHRcdD8gcGFyYW1ldGVyRW50aXR5VHlwZS5rZXlzLm1hcChmdW5jdGlvbiAoa2V5KSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4ga2V5Lm5hbWU7XG5cdFx0XHRcdCAgfSlcblx0XHRcdFx0OiBbXTtcblx0XHRcdGlmIChjb252ZXJ0ZXJDb250ZXh0LmdldENvbnRleHRQYXRoKCkgPT09IGNvbGxlY3Rpb25QYXRoQ29udmVydGVyQ29udGV4dC5nZXRDb250ZXh0UGF0aCgpKSB7XG5cdFx0XHRcdGFQYXJhbWV0ZXJzLmZvckVhY2goZnVuY3Rpb24gKHBhcmFtZXRlcjogYW55KSB7XG5cdFx0XHRcdFx0aW5QYXJhbWV0ZXJzLnB1c2goe1xuXHRcdFx0XHRcdFx0bG9jYWxEYXRhUHJvcGVydHk6IHBhcmFtZXRlcixcblx0XHRcdFx0XHRcdHZhbHVlTGlzdFByb3BlcnR5OiBwYXJhbWV0ZXJcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0XHRpZiAodmFsdWVMaXN0UGFyYW1zKSB7XG5cdFx0XHRcdGZvciAoY29uc3QgdmFsdWVMaXN0UGFyYW0gb2YgdmFsdWVMaXN0UGFyYW1zKSB7XG5cdFx0XHRcdFx0Y29uc3QgbG9jYWxEYXRhUHJvcGVydHkgPSB2YWx1ZUxpc3RQYXJhbS5Mb2NhbERhdGFQcm9wZXJ0eT8udmFsdWU7XG5cdFx0XHRcdFx0Y29uc3QgdmFsdWVMaXN0UHJvcGVydHkgPSB2YWx1ZUxpc3RQYXJhbS5WYWx1ZUxpc3RQcm9wZXJ0eTtcblx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHQodmFsdWVMaXN0UGFyYW0/LiRUeXBlID09PSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5WYWx1ZUxpc3RQYXJhbWV0ZXJJbk91dFwiIHx8XG5cdFx0XHRcdFx0XHRcdHZhbHVlTGlzdFBhcmFtPy4kVHlwZSA9PT0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuVmFsdWVMaXN0UGFyYW1ldGVyT3V0XCIpICYmXG5cdFx0XHRcdFx0XHRzUHJvcGVydHlQYXRoID09PSBsb2NhbERhdGFQcm9wZXJ0eVxuXHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0b3V0UGFyYW1ldGVyID0gdmFsdWVMaXN0UGFyYW07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdCh2YWx1ZUxpc3RQYXJhbT8uJFR5cGUgPT09IFwiY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLlZhbHVlTGlzdFBhcmFtZXRlckluT3V0XCIgfHxcblx0XHRcdFx0XHRcdFx0dmFsdWVMaXN0UGFyYW0/LiRUeXBlID09PSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5WYWx1ZUxpc3RQYXJhbWV0ZXJJblwiKSAmJlxuXHRcdFx0XHRcdFx0c1Byb3BlcnR5UGF0aCAhPT0gbG9jYWxEYXRhUHJvcGVydHlcblx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdGNvbnN0IGJOb3RGaWx0ZXJhYmxlID0gaXNQcm9wZXJ0eUZpbHRlcmFibGUoY29sbGVjdGlvblBhdGhDb252ZXJ0ZXJDb250ZXh0LCB2YWx1ZUxpc3RQcm9wZXJ0eSk7XG5cdFx0XHRcdFx0XHRpZiAoIWJOb3RGaWx0ZXJhYmxlKSB7XG5cdFx0XHRcdFx0XHRcdGluUGFyYW1ldGVycy5wdXNoKHtcblx0XHRcdFx0XHRcdFx0XHRsb2NhbERhdGFQcm9wZXJ0eTogbG9jYWxEYXRhUHJvcGVydHksXG5cdFx0XHRcdFx0XHRcdFx0dmFsdWVMaXN0UHJvcGVydHk6IHZhbHVlTGlzdFByb3BlcnR5XG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKGluUGFyYW1ldGVycyAmJiBpblBhcmFtZXRlcnMubGVuZ3RoKSB7XG5cdFx0XHRcdGluUGFyYW1ldGVycy5mb3JFYWNoKGZ1bmN0aW9uIChvSW5QYXJhbWV0ZXI6IGFueSkge1xuXHRcdFx0XHRcdGNvbnN0IG1haW5FbnRpdHlTZXRJbk1hcHBpbmdBbGxvd2VkRXhwcmVzc2lvbiA9IGNvbXBpbGVFeHByZXNzaW9uKFxuXHRcdFx0XHRcdFx0Y2hlY2tGaWx0ZXJFeHByZXNzaW9uUmVzdHJpY3Rpb25zKFxuXHRcdFx0XHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0XG5cdFx0XHRcdFx0XHRcdFx0LmdldENvbnZlcnRlckNvbnRleHRGb3IoY29udmVydGVyQ29udGV4dC5nZXRBYnNvbHV0ZUFubm90YXRpb25QYXRoKG9JblBhcmFtZXRlcj8ubG9jYWxEYXRhUHJvcGVydHkpKVxuXHRcdFx0XHRcdFx0XHRcdC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCksXG5cdFx0XHRcdFx0XHRcdFtcIlNpbmdsZVZhbHVlXCJdXG5cdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRjb25zdCB2YWx1ZUxpc3RFbnRpdHlTZXRJbk1hcHBpbmdBbGxvd2VkRXhwcmVzc2lvbiA9IGNvbXBpbGVFeHByZXNzaW9uKFxuXHRcdFx0XHRcdFx0Y2hlY2tGaWx0ZXJFeHByZXNzaW9uUmVzdHJpY3Rpb25zKFxuXHRcdFx0XHRcdFx0XHRjb2xsZWN0aW9uUGF0aENvbnZlcnRlckNvbnRleHRcblx0XHRcdFx0XHRcdFx0XHQuZ2V0Q29udmVydGVyQ29udGV4dEZvcihcblx0XHRcdFx0XHRcdFx0XHRcdGNvbGxlY3Rpb25QYXRoQ29udmVydGVyQ29udGV4dC5nZXRBYnNvbHV0ZUFubm90YXRpb25QYXRoKG9JblBhcmFtZXRlcj8udmFsdWVMaXN0UHJvcGVydHkpXG5cdFx0XHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0XHRcdC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCksXG5cdFx0XHRcdFx0XHRcdFtcIlNpbmdsZVZhbHVlXCJdXG5cdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRpZiAodmFsdWVMaXN0RW50aXR5U2V0SW5NYXBwaW5nQWxsb3dlZEV4cHJlc3Npb24gPT09IFwidHJ1ZVwiICYmIG1haW5FbnRpdHlTZXRJbk1hcHBpbmdBbGxvd2VkRXhwcmVzc2lvbiA9PT0gXCJmYWxzZVwiKSB7XG5cdFx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYEZpbHRlclJlc3RyaWN0aW9ucyBvZiAke3NQcm9wZXJ0eVBhdGh9IGluIE1haW5FbnRpdHlTZXQgYW5kIFZhbHVlTGlzdEVudGl0eVNldCBhcmUgZGlmZmVyZW50YCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHRcdGNvbnN0IHB2UXVhbGlmaWVyID0gdmFsdWVMaXN0Py5QcmVzZW50YXRpb25WYXJpYW50UXVhbGlmaWVyO1xuXHRcdFx0Y29uc3Qgc3ZRdWFsaWZpZXIgPSB2YWx1ZUxpc3Q/LlNlbGVjdGlvblZhcmlhbnRRdWFsaWZpZXI7XG5cdFx0XHRjb25zdCBwdkFubm90YXRpb246IGFueSA9IGNvbGxlY3Rpb25QYXRoQ29udmVydGVyQ29udGV4dD8uZ2V0RW50aXR5VHlwZUFubm90YXRpb24oXG5cdFx0XHRcdGBAVUkuUHJlc2VudGF0aW9uVmFyaWFudCMke3B2UXVhbGlmaWVyfWBcblx0XHRcdCk/LmFubm90YXRpb247XG5cdFx0XHRjb25zdCBhZ2dyZWdhdGlvbkhlbHBlciA9IG5ldyBBZ2dyZWdhdGlvbkhlbHBlcihjb2xsZWN0aW9uUGF0aENvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5VHlwZSgpLCBjb2xsZWN0aW9uUGF0aENvbnZlcnRlckNvbnRleHQpO1xuXHRcdFx0aWYgKCFhZ2dyZWdhdGlvbkhlbHBlci5pc0FuYWx5dGljc1N1cHBvcnRlZCgpKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGlmIChwdkFubm90YXRpb24pIHtcblx0XHRcdFx0Y29uc3QgYVZpc3VhbGl6YXRpb25zID0gcHZBbm5vdGF0aW9uPy5WaXN1YWxpemF0aW9ucztcblx0XHRcdFx0Y29uc3QgY29udGV4dFBhdGggPSBgLyR7dmFsdWVMaXN0Py5Db2xsZWN0aW9uUGF0aH1gIHx8IGAvJHtjb2xsZWN0aW9uUGF0aENvbnZlcnRlckNvbnRleHQ/LmdldEVudGl0eVNldCgpPy5uYW1lfWA7XG5cdFx0XHRcdHZpc3VhbEZpbHRlci5jb250ZXh0UGF0aCA9IGNvbnRleHRQYXRoO1xuXHRcdFx0XHRsZXQgY2hhcnRBbm5vdGF0aW9uO1xuXHRcdFx0XHRmb3IgKGNvbnN0IHZpc3VhbGl6YXRpb24gb2YgYVZpc3VhbGl6YXRpb25zKSB7XG5cdFx0XHRcdFx0aWYgKHZpc3VhbGl6YXRpb24uJHRhcmdldD8udGVybSA9PT0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5DaGFydFwiKSB7XG5cdFx0XHRcdFx0XHRjaGFydEFubm90YXRpb24gPSB2aXN1YWxpemF0aW9uO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChjaGFydEFubm90YXRpb24pIHtcblx0XHRcdFx0XHRjb25zdCBfYmdldFZGQWdncmVnYXRpb246IGJvb2xlYW4gfCB1bmRlZmluZWQgPSBfY2hlY2tWRkFnZ3JlZ2F0aW9uKFxuXHRcdFx0XHRcdFx0Y29sbGVjdGlvblBhdGhDb252ZXJ0ZXJDb250ZXh0LFxuXHRcdFx0XHRcdFx0Y2hhcnRBbm5vdGF0aW9uLFxuXHRcdFx0XHRcdFx0YWdncmVnYXRpb25IZWxwZXJcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdGlmICghX2JnZXRWRkFnZ3JlZ2F0aW9uKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGNvbnN0IGJEaW1lbnNpb25IaWRkZW46IGJvb2xlYW4gPSBjaGFydEFubm90YXRpb24/LiR0YXJnZXQ/LkRpbWVuc2lvbnNbMF0/LiR0YXJnZXQ/LmFubm90YXRpb25zPy5VST8uSGlkZGVuPy52YWx1ZU9mKCk7XG5cdFx0XHRcdFx0Y29uc3QgYkRpbWVuc2lvbkhpZGRlbkZpbHRlcjogYm9vbGVhbiA9XG5cdFx0XHRcdFx0XHRjaGFydEFubm90YXRpb24/LiR0YXJnZXQ/LkRpbWVuc2lvbnNbMF0/LiR0YXJnZXQ/LmFubm90YXRpb25zPy5VST8uSGlkZGVuRmlsdGVyPy52YWx1ZU9mKCk7XG5cdFx0XHRcdFx0aWYgKGJEaW1lbnNpb25IaWRkZW4gPT09IHRydWUgfHwgYkRpbWVuc2lvbkhpZGRlbkZpbHRlciA9PT0gdHJ1ZSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAoYVZpc3VhbGl6YXRpb25zICYmIGFWaXN1YWxpemF0aW9ucy5sZW5ndGgpIHtcblx0XHRcdFx0XHRcdHZpc3VhbEZpbHRlci5jaGFydEFubm90YXRpb24gPSBjaGFydEFubm90YXRpb25cblx0XHRcdFx0XHRcdFx0PyBjb2xsZWN0aW9uUGF0aENvbnZlcnRlckNvbnRleHQ/LmdldEFic29sdXRlQW5ub3RhdGlvblBhdGgoXG5cdFx0XHRcdFx0XHRcdFx0XHRgJHtjaGFydEFubm90YXRpb24uZnVsbHlRdWFsaWZpZWROYW1lfS8kQW5ub3RhdGlvblBhdGgvYFxuXHRcdFx0XHRcdFx0XHQgIClcblx0XHRcdFx0XHRcdFx0OiB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0XHR2aXN1YWxGaWx0ZXIucHJlc2VudGF0aW9uQW5ub3RhdGlvbiA9IHB2QW5ub3RhdGlvblxuXHRcdFx0XHRcdFx0XHQ/IGNvbGxlY3Rpb25QYXRoQ29udmVydGVyQ29udGV4dD8uZ2V0QWJzb2x1dGVBbm5vdGF0aW9uUGF0aChgJHtwdkFubm90YXRpb24uZnVsbHlRdWFsaWZpZWROYW1lfS9gKVxuXHRcdFx0XHRcdFx0XHQ6IHVuZGVmaW5lZDtcblx0XHRcdFx0XHRcdHZpc3VhbEZpbHRlci5vdXRQYXJhbWV0ZXIgPSBvdXRQYXJhbWV0ZXI/LkxvY2FsRGF0YVByb3BlcnR5Py52YWx1ZTtcblx0XHRcdFx0XHRcdHZpc3VhbEZpbHRlci5pblBhcmFtZXRlcnMgPSBpblBhcmFtZXRlcnM7XG5cdFx0XHRcdFx0XHRjb25zdCBiSXNSYW5nZSA9IGNoZWNrRmlsdGVyRXhwcmVzc2lvblJlc3RyaWN0aW9ucyhcblx0XHRcdFx0XHRcdFx0Y29udmVydGVyQ29udGV4dFxuXHRcdFx0XHRcdFx0XHRcdC5nZXRDb252ZXJ0ZXJDb250ZXh0Rm9yKGNvbnZlcnRlckNvbnRleHQuZ2V0QWJzb2x1dGVBbm5vdGF0aW9uUGF0aChzUHJvcGVydHlQYXRoKSlcblx0XHRcdFx0XHRcdFx0XHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpLFxuXHRcdFx0XHRcdFx0XHRbXCJTaW5nbGVSYW5nZVwiLCBcIk11bHRpUmFuZ2VcIl1cblx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdGlmIChjb21waWxlRXhwcmVzc2lvbihiSXNSYW5nZSkgPT09IFwidHJ1ZVwiKSB7XG5cdFx0XHRcdFx0XHRcdHRocm93IG5ldyBFcnJvcihcIlJhbmdlIEFsbG93ZWRFeHByZXNzaW9uIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIHZpc3VhbCBmaWx0ZXJzXCIpO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRjb25zdCBiSXNNYWluRW50aXR5U2V0U2luZ2xlU2VsZWN0aW9uOiBhbnkgPSBjaGVja0ZpbHRlckV4cHJlc3Npb25SZXN0cmljdGlvbnMoXG5cdFx0XHRcdFx0XHRcdGNvbnZlcnRlckNvbnRleHRcblx0XHRcdFx0XHRcdFx0XHQuZ2V0Q29udmVydGVyQ29udGV4dEZvcihjb252ZXJ0ZXJDb250ZXh0LmdldEFic29sdXRlQW5ub3RhdGlvblBhdGgoc1Byb3BlcnR5UGF0aCkpXG5cdFx0XHRcdFx0XHRcdFx0LmdldERhdGFNb2RlbE9iamVjdFBhdGgoKSxcblx0XHRcdFx0XHRcdFx0W1wiU2luZ2xlVmFsdWVcIl1cblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR2aXN1YWxGaWx0ZXIubXVsdGlwbGVTZWxlY3Rpb25BbGxvd2VkID0gY29tcGlsZUV4cHJlc3Npb24oIWJJc01haW5FbnRpdHlTZXRTaW5nbGVTZWxlY3Rpb24udmFsdWUpIGFzIGFueTtcblx0XHRcdFx0XHRcdHZpc3VhbEZpbHRlci5yZXF1aXJlZCA9IGdldElzUmVxdWlyZWQoY29udmVydGVyQ29udGV4dCwgc1Byb3BlcnR5UGF0aCk7XG5cdFx0XHRcdFx0XHRsZXQgc3ZBbm5vdGF0aW9uOiBhbnk7XG5cdFx0XHRcdFx0XHRpZiAoc3ZRdWFsaWZpZXIpIHtcblx0XHRcdFx0XHRcdFx0c3ZBbm5vdGF0aW9uID0gY29sbGVjdGlvblBhdGhDb252ZXJ0ZXJDb250ZXh0Py5nZXRFbnRpdHlUeXBlQW5ub3RhdGlvbihcblx0XHRcdFx0XHRcdFx0XHRgQFVJLlNlbGVjdGlvblZhcmlhbnQjJHtzdlF1YWxpZmllcn1gXG5cdFx0XHRcdFx0XHRcdCk/LmFubm90YXRpb247XG5cdFx0XHRcdFx0XHRcdHZpc3VhbEZpbHRlci5zZWxlY3Rpb25WYXJpYW50QW5ub3RhdGlvbiA9IHN2QW5ub3RhdGlvblxuXHRcdFx0XHRcdFx0XHRcdD8gY29sbGVjdGlvblBhdGhDb252ZXJ0ZXJDb250ZXh0Py5nZXRBYnNvbHV0ZUFubm90YXRpb25QYXRoKGAke3N2QW5ub3RhdGlvbi5mdWxseVF1YWxpZmllZE5hbWV9L2ApXG5cdFx0XHRcdFx0XHRcdFx0OiB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRsZXQgcmVxdWlyZWRQcm9wZXJ0aWVzID0gW107XG5cdFx0XHRcdFx0XHRpZiAocGFyYW1ldGVyRW50aXR5VHlwZSkge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBzRW50aXR5U2V0ID0gY29sbGVjdGlvblBhdGguc3BsaXQoXCIvXCIpWzBdO1xuXHRcdFx0XHRcdFx0XHRjb25zdCBzTmF2aWdhdGlvblByb3BlcnR5ID0gY29sbGVjdGlvblBhdGguc3BsaXQoXCIvXCIpWzFdO1xuXHRcdFx0XHRcdFx0XHRjb25zdCBvRW50aXR5U2V0Q29udmVydGVyQ29udGV4dCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0Q29udmVydGVyQ29udGV4dEZvcihgLyR7c0VudGl0eVNldH1gKTtcblx0XHRcdFx0XHRcdFx0Y29uc3QgYVJlc3RyaWN0ZWRQcm9wZXJ0aWVzID1cblx0XHRcdFx0XHRcdFx0XHRvRW50aXR5U2V0Q29udmVydGVyQ29udGV4dD8uZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpLnN0YXJ0aW5nRW50aXR5U2V0Py5hbm5vdGF0aW9ucz8uQ2FwYWJpbGl0aWVzXG5cdFx0XHRcdFx0XHRcdFx0XHQ/Lk5hdmlnYXRpb25SZXN0cmljdGlvbnM/LlJlc3RyaWN0ZWRQcm9wZXJ0aWVzO1xuXHRcdFx0XHRcdFx0XHRjb25zdCBvUmVzdHJpY3RlZFByb3BlcnR5ID0gYVJlc3RyaWN0ZWRQcm9wZXJ0aWVzPy5maW5kKFxuXHRcdFx0XHRcdFx0XHRcdChyZXN0cmljdGVkTmF2UHJvcDogTmF2aWdhdGlvblByb3BlcnR5UmVzdHJpY3Rpb25UeXBlcykgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKHJlc3RyaWN0ZWROYXZQcm9wLk5hdmlnYXRpb25Qcm9wZXJ0eT8udHlwZSA9PT0gXCJOYXZpZ2F0aW9uUHJvcGVydHlQYXRoXCIpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHJlc3RyaWN0ZWROYXZQcm9wLk5hdmlnYXRpb25Qcm9wZXJ0eS52YWx1ZSA9PT0gc05hdmlnYXRpb25Qcm9wZXJ0eTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdHJlcXVpcmVkUHJvcGVydGllcyA9IG9SZXN0cmljdGVkUHJvcGVydHk/LkZpbHRlclJlc3RyaWN0aW9ucz8uUmVxdWlyZWRQcm9wZXJ0aWVzIGFzIGFueVtdO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0Y29uc3QgZW50aXR5U2V0QW5ub3RhdGlvbnMgPSBjb2xsZWN0aW9uUGF0aENvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0KCk/LmFubm90YXRpb25zO1xuXHRcdFx0XHRcdFx0XHRyZXF1aXJlZFByb3BlcnRpZXMgPSBlbnRpdHlTZXRBbm5vdGF0aW9ucz8uQ2FwYWJpbGl0aWVzPy5GaWx0ZXJSZXN0cmljdGlvbnM/LlJlcXVpcmVkUHJvcGVydGllcyBhcyBhbnlbXTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGxldCByZXF1aXJlZFByb3BlcnR5UGF0aHM6IEFycmF5PG9iamVjdD4gPSBbXTtcblx0XHRcdFx0XHRcdGlmIChyZXF1aXJlZFByb3BlcnRpZXM/Lmxlbmd0aCkge1xuXHRcdFx0XHRcdFx0XHRyZXF1aXJlZFByb3BlcnRpZXMuZm9yRWFjaChmdW5jdGlvbiAob1JlcXVpcmVQcm9wZXJ0eTogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0cmVxdWlyZWRQcm9wZXJ0eVBhdGhzLnB1c2gob1JlcXVpcmVQcm9wZXJ0eS52YWx1ZSk7XG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0cmVxdWlyZWRQcm9wZXJ0eVBhdGhzID0gcmVxdWlyZWRQcm9wZXJ0eVBhdGhzLmNvbmNhdChhUGFyYW1ldGVycyk7XG5cdFx0XHRcdFx0XHR2aXN1YWxGaWx0ZXIucmVxdWlyZWRQcm9wZXJ0aWVzID0gcmVxdWlyZWRQcm9wZXJ0eVBhdGhzO1xuXHRcdFx0XHRcdFx0aWYgKHZpc3VhbEZpbHRlci5yZXF1aXJlZFByb3BlcnRpZXM/Lmxlbmd0aCkge1xuXHRcdFx0XHRcdFx0XHRpZiAoIXZpc3VhbEZpbHRlci5pblBhcmFtZXRlcnMgfHwgIXZpc3VhbEZpbHRlci5pblBhcmFtZXRlcnMubGVuZ3RoKSB7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKCF2aXN1YWxGaWx0ZXIuc2VsZWN0aW9uVmFyaWFudEFubm90YXRpb24pIHtcblx0XHRcdFx0XHRcdFx0XHRcdHZpc3VhbEZpbHRlci5zaG93T3ZlcmxheUluaXRpYWxseSA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdGxldCBzZWxlY3RPcHRpb25zID1cblx0XHRcdFx0XHRcdFx0XHRcdFx0c3ZBbm5vdGF0aW9uPy5TZWxlY3RPcHRpb25zPy5tYXAoKG9TZWxlY3RPcHRpb246IGFueSkgPT4gb1NlbGVjdE9wdGlvbi5Qcm9wZXJ0eU5hbWUudmFsdWUpIHx8IFtdO1xuXHRcdFx0XHRcdFx0XHRcdFx0Y29uc3QgcGFyYW1ldGVyT3B0aW9ucyA9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHN2QW5ub3RhdGlvbj8uUGFyYW1ldGVycz8ubWFwKChvUGFyYW1ldGVyT3B0aW9uOiBhbnkpID0+IG9QYXJhbWV0ZXJPcHRpb24uUHJvcGVydHlOYW1lLnZhbHVlKSB8fCBbXTtcblx0XHRcdFx0XHRcdFx0XHRcdHNlbGVjdE9wdGlvbnMgPSBzZWxlY3RPcHRpb25zLmNvbmNhdChwYXJhbWV0ZXJPcHRpb25zKTtcblx0XHRcdFx0XHRcdFx0XHRcdHJlcXVpcmVkUHJvcGVydHlQYXRocyA9IHJlcXVpcmVkUHJvcGVydHlQYXRocy5zb3J0KCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRzZWxlY3RPcHRpb25zID0gc2VsZWN0T3B0aW9ucy5zb3J0KCk7XG5cdFx0XHRcdFx0XHRcdFx0XHR2aXN1YWxGaWx0ZXIuc2hvd092ZXJsYXlJbml0aWFsbHkgPSByZXF1aXJlZFByb3BlcnR5UGF0aHMuc29tZShmdW5jdGlvbiAoc1BhdGgpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHNlbGVjdE9wdGlvbnMuaW5kZXhPZihzUGF0aCkgPT09IC0xO1xuXHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdHZpc3VhbEZpbHRlci5zaG93T3ZlcmxheUluaXRpYWxseSA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHR2aXN1YWxGaWx0ZXIuc2hvd092ZXJsYXlJbml0aWFsbHkgPSBmYWxzZTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGNvbnN0IHNEaW1lbnNpb25UeXBlID0gY2hhcnRBbm5vdGF0aW9uPy4kdGFyZ2V0Py5EaW1lbnNpb25zWzBdPy4kdGFyZ2V0Py50eXBlO1xuXHRcdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0XHQhKFxuXHRcdFx0XHRcdFx0XHRcdHNEaW1lbnNpb25UeXBlID09PSBcIkVkbS5EYXRlVGltZU9mZnNldFwiIHx8XG5cdFx0XHRcdFx0XHRcdFx0c0RpbWVuc2lvblR5cGUgPT09IFwiRWRtLkRhdGVcIiB8fFxuXHRcdFx0XHRcdFx0XHRcdHNEaW1lbnNpb25UeXBlID09PSBcIkVkbS5UaW1lT2ZEYXlcIlxuXHRcdFx0XHRcdFx0XHQpICYmXG5cdFx0XHRcdFx0XHRcdGNoYXJ0QW5ub3RhdGlvbi4kdGFyZ2V0LkNoYXJ0VHlwZSA9PT0gXCJVSS5DaGFydFR5cGUvTGluZVwiXG5cdFx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdFx0dmlzdWFsRmlsdGVyLnJlbmRlckxpbmVDaGFydCA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0dmlzdWFsRmlsdGVyLnJlbmRlckxpbmVDaGFydCA9IHRydWU7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGNvbnZlcnRlckNvbnRleHRcblx0XHRcdFx0XHRcdC5nZXREaWFnbm9zdGljcygpXG5cdFx0XHRcdFx0XHQuYWRkSXNzdWUoSXNzdWVDYXRlZ29yeS5Bbm5vdGF0aW9uLCBJc3N1ZVNldmVyaXR5LkhpZ2gsIElzc3VlVHlwZS5NQUxGT1JNRURfVklTVUFMRklMVEVSUy5DSEFSVCk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnZlcnRlckNvbnRleHRcblx0XHRcdFx0XHQuZ2V0RGlhZ25vc3RpY3MoKVxuXHRcdFx0XHRcdC5hZGRJc3N1ZShJc3N1ZUNhdGVnb3J5LkFubm90YXRpb24sIElzc3VlU2V2ZXJpdHkuSGlnaCwgSXNzdWVUeXBlLk1BTEZPUk1FRF9WSVNVQUxGSUxURVJTLlBSRVNFTlRBVElPTlZBUklBTlQpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb252ZXJ0ZXJDb250ZXh0XG5cdFx0XHRcdC5nZXREaWFnbm9zdGljcygpXG5cdFx0XHRcdC5hZGRJc3N1ZShJc3N1ZUNhdGVnb3J5LkFubm90YXRpb24sIElzc3VlU2V2ZXJpdHkuSGlnaCwgSXNzdWVUeXBlLk1BTEZPUk1FRF9WSVNVQUxGSUxURVJTLlZBTFVFTElTVCk7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0RGlhZ25vc3RpY3MoKS5hZGRJc3N1ZShJc3N1ZUNhdGVnb3J5Lk1hbmlmZXN0LCBJc3N1ZVNldmVyaXR5LkhpZ2gsIElzc3VlVHlwZS5NQUxGT1JNRURfVklTVUFMRklMVEVSUy5WQUxVRUxJU1QpO1xuXHR9XG5cdGlmIChPYmplY3Qua2V5cyh2aXN1YWxGaWx0ZXIpLmxlbmd0aCA+IDEpIHtcblx0XHRyZXR1cm4gdmlzdWFsRmlsdGVyO1xuXHR9XG59XG4iXX0=