@sapui5/sap.fe.core 1.99.0 → 1.100.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 (246) hide show
  1. package/package.json +4 -2
  2. package/src/sap/fe/core/.library +1 -1
  3. package/src/sap/fe/core/AnnotationHelper.js +1 -69
  4. package/src/sap/fe/core/AnnotationHelper.ts +0 -70
  5. package/src/sap/fe/core/AppComponent.js +388 -399
  6. package/src/sap/fe/core/AppComponent.ts +403 -0
  7. package/src/sap/fe/core/AppStateHandler.js +127 -158
  8. package/src/sap/fe/core/BaseController.js +82 -58
  9. package/src/sap/fe/core/BaseController.ts +68 -0
  10. package/src/sap/fe/core/CommonUtils.js +111 -20
  11. package/src/sap/fe/core/CommonUtils.ts +131 -32
  12. package/src/sap/fe/core/ExtensionAPI.js +278 -274
  13. package/src/sap/fe/core/ExtensionAPI.ts +250 -0
  14. package/src/sap/fe/core/PageController.js +157 -29
  15. package/src/sap/fe/core/PageController.ts +60 -32
  16. package/src/sap/fe/core/RouterProxy.js +694 -756
  17. package/src/sap/fe/core/RouterProxy.ts +11 -9
  18. package/src/sap/fe/core/Synchronization.js +21 -31
  19. package/src/sap/fe/core/TemplateComponent.js +1 -1
  20. package/src/sap/fe/core/TemplateComponent.ts +10 -3
  21. package/src/sap/fe/core/TemplateModel.js +20 -38
  22. package/src/sap/fe/core/TemplateModel.ts +1 -1
  23. package/src/sap/fe/core/TransactionHelper.js +1354 -1370
  24. package/src/sap/fe/core/TransactionHelper.ts +33 -22
  25. package/src/sap/fe/core/actions/collaboration/ActivitySync.js +392 -0
  26. package/src/sap/fe/core/actions/collaboration/ActivitySync.ts +355 -0
  27. package/src/sap/fe/core/actions/collaboration/CollaborationCommon.js +136 -0
  28. package/src/sap/fe/core/actions/collaboration/CollaborationCommon.ts +119 -0
  29. package/src/sap/fe/core/actions/collaboration/Manage.js +262 -0
  30. package/src/sap/fe/core/actions/collaboration/Manage.ts +244 -0
  31. package/src/sap/fe/core/actions/collaboration/ManageDialog.fragment.xml +103 -0
  32. package/src/sap/fe/core/actions/collaboration/UserDetails.fragment.xml +13 -0
  33. package/src/sap/fe/core/actions/draft.js +30 -68
  34. package/src/sap/fe/core/actions/draft.ts +44 -71
  35. package/src/sap/fe/core/actions/messageHandling.js +55 -36
  36. package/src/sap/fe/core/actions/messageHandling.ts +66 -46
  37. package/src/sap/fe/core/actions/operations.js +34 -15
  38. package/src/sap/fe/core/actions/operations.ts +48 -18
  39. package/src/sap/fe/core/actions/sticky.js +17 -4
  40. package/src/sap/fe/core/actions/sticky.ts +21 -4
  41. package/src/sap/fe/core/controllerextensions/ControllerExtensionMetadata.js +69 -66
  42. package/src/sap/fe/core/controllerextensions/ControllerExtensionMetadata.ts +65 -0
  43. package/src/sap/fe/core/controllerextensions/EditFlow.js +1593 -1669
  44. package/src/sap/fe/core/controllerextensions/EditFlow.ts +1672 -0
  45. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +79 -54
  46. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +61 -0
  47. package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +718 -779
  48. package/src/sap/fe/core/controllerextensions/InternalEditFlow.ts +783 -0
  49. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +796 -816
  50. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +803 -0
  51. package/src/sap/fe/core/controllerextensions/InternalRouting.js +1004 -1005
  52. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +978 -0
  53. package/src/sap/fe/core/controllerextensions/KPIManagement.js +487 -521
  54. package/src/sap/fe/core/controllerextensions/KPIManagement.ts +2 -2
  55. package/src/sap/fe/core/controllerextensions/MassEdit.js +141 -169
  56. package/src/sap/fe/core/controllerextensions/MassEdit.ts +156 -0
  57. package/src/sap/fe/core/controllerextensions/MessageHandler.js +233 -244
  58. package/src/sap/fe/core/controllerextensions/MessageHandler.ts +225 -0
  59. package/src/sap/fe/core/controllerextensions/PageReady.js +301 -336
  60. package/src/sap/fe/core/controllerextensions/PageReady.ts +12 -10
  61. package/src/sap/fe/core/controllerextensions/Paginator.js +188 -175
  62. package/src/sap/fe/core/controllerextensions/Paginator.ts +163 -0
  63. package/src/sap/fe/core/controllerextensions/Placeholder.js +157 -149
  64. package/src/sap/fe/core/controllerextensions/Placeholder.ts +151 -0
  65. package/src/sap/fe/core/controllerextensions/Routing.js +144 -125
  66. package/src/sap/fe/core/controllerextensions/Routing.ts +132 -0
  67. package/src/sap/fe/core/controllerextensions/RoutingListener.js +7 -6
  68. package/src/sap/fe/core/controllerextensions/RoutingListener.ts +3 -0
  69. package/src/sap/fe/core/controllerextensions/Share.js +230 -268
  70. package/src/sap/fe/core/controllerextensions/Share.ts +231 -0
  71. package/src/sap/fe/core/controllerextensions/SideEffects.js +592 -633
  72. package/src/sap/fe/core/controllerextensions/SideEffects.ts +8 -7
  73. package/src/sap/fe/core/controllerextensions/ViewState.js +788 -806
  74. package/src/sap/fe/core/controllerextensions/ViewState.ts +805 -0
  75. package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +2 -2
  76. package/src/sap/fe/core/controls/ActionPartial.fragment.xml +2 -2
  77. package/src/sap/fe/core/controls/CommandExecution.js +67 -66
  78. package/src/sap/fe/core/controls/CommandExecution.ts +72 -0
  79. package/src/sap/fe/core/controls/ConditionalWrapper.js +90 -75
  80. package/src/sap/fe/core/controls/ConditionalWrapper.ts +83 -0
  81. package/src/sap/fe/core/controls/CustomQuickViewPage.js +130 -125
  82. package/src/sap/fe/core/controls/CustomQuickViewPage.ts +126 -0
  83. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +103 -112
  84. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.ts +101 -0
  85. package/src/sap/fe/core/controls/FieldWrapper.js +122 -135
  86. package/src/sap/fe/core/controls/FieldWrapper.ts +115 -0
  87. package/src/sap/fe/core/controls/FilterBar.js +162 -159
  88. package/src/sap/fe/core/controls/FilterBar.ts +143 -0
  89. package/src/sap/fe/core/controls/FormElementWrapper.js +45 -39
  90. package/src/sap/fe/core/controls/FormElementWrapper.ts +40 -0
  91. package/src/sap/fe/core/controls/MultiValueParameterDelegate.js +37 -42
  92. package/src/sap/fe/core/controls/MultiValueParameterDelegate.ts +31 -0
  93. package/src/sap/fe/core/controls/filterbar/FilterContainer.js +126 -116
  94. package/src/sap/fe/core/controls/filterbar/FilterContainer.ts +98 -0
  95. package/src/sap/fe/core/controls/filterbar/VisualFilter.js +241 -255
  96. package/src/sap/fe/core/controls/filterbar/VisualFilter.ts +245 -0
  97. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +150 -141
  98. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.ts +125 -0
  99. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +335 -322
  100. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +337 -0
  101. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +74 -74
  102. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.ts +70 -0
  103. package/src/sap/fe/core/converters/ConverterContext.js +348 -379
  104. package/src/sap/fe/core/converters/ConverterContext.ts +19 -16
  105. package/src/sap/fe/core/converters/ManifestSettings.js +12 -1
  106. package/src/sap/fe/core/converters/ManifestSettings.ts +12 -1
  107. package/src/sap/fe/core/converters/ManifestWrapper.js +354 -378
  108. package/src/sap/fe/core/converters/ManifestWrapper.ts +10 -0
  109. package/src/sap/fe/core/converters/MetaModelConverter.js +6 -4
  110. package/src/sap/fe/core/converters/MetaModelConverter.ts +5 -2
  111. package/src/sap/fe/core/converters/TemplateConverter.js +1 -1
  112. package/src/sap/fe/core/converters/TemplateConverter.ts +2 -1
  113. package/src/sap/fe/core/converters/annotations/DataField.js +26 -12
  114. package/src/sap/fe/core/converters/annotations/DataField.ts +37 -13
  115. package/src/sap/fe/core/converters/controls/Common/Form.js +2 -2
  116. package/src/sap/fe/core/converters/controls/Common/Form.ts +4 -2
  117. package/src/sap/fe/core/converters/controls/Common/KPI.js +1 -1
  118. package/src/sap/fe/core/converters/controls/Common/KPI.ts +3 -2
  119. package/src/sap/fe/core/converters/controls/Common/Table.js +130 -23
  120. package/src/sap/fe/core/converters/controls/Common/Table.ts +134 -29
  121. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +118 -53
  122. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +156 -93
  123. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +161 -207
  124. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +148 -206
  125. package/src/sap/fe/core/converters/helpers/Aggregation.js +115 -133
  126. package/src/sap/fe/core/converters/helpers/BindingHelper.js +20 -6
  127. package/src/sap/fe/core/converters/helpers/BindingHelper.ts +16 -4
  128. package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +12 -1
  129. package/src/sap/fe/core/converters/helpers/ConfigurableObject.ts +11 -0
  130. package/src/sap/fe/core/converters/helpers/Key.js +42 -57
  131. package/src/sap/fe/core/converters/helpers/Key.ts +1 -1
  132. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +25 -4
  133. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +20 -3
  134. package/src/sap/fe/core/converters/templates/ListReportConverter.js +10 -4
  135. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +15 -4
  136. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +7 -5
  137. package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +5 -1
  138. package/src/sap/fe/core/designtime/AppComponent.designtime.js +92 -98
  139. package/src/sap/fe/core/designtime/AppComponent.designtime.ts +91 -0
  140. package/src/sap/fe/core/formatters/CollaborationFormatter.js +104 -0
  141. package/src/sap/fe/core/formatters/CollaborationFormatter.ts +60 -0
  142. package/src/sap/fe/core/formatters/TableFormatter.js +53 -2
  143. package/src/sap/fe/core/formatters/TableFormatter.ts +51 -0
  144. package/src/sap/fe/core/fpm/Component.js +50 -54
  145. package/src/sap/fe/core/fpm/Component.ts +48 -0
  146. package/src/sap/fe/core/helpers/AppStartupHelper.js +323 -309
  147. package/src/sap/fe/core/helpers/AppStartupHelper.ts +363 -337
  148. package/src/sap/fe/core/helpers/BindingExpression.js +7 -7
  149. package/src/sap/fe/core/helpers/BindingExpression.ts +7 -7
  150. package/src/sap/fe/core/helpers/ClassSupport.js +186 -62
  151. package/src/sap/fe/core/helpers/ClassSupport.ts +168 -52
  152. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +5 -4
  153. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.ts +1 -5
  154. package/src/sap/fe/core/helpers/FPMHelper.js +1 -1
  155. package/src/sap/fe/core/helpers/FPMHelper.ts +1 -1
  156. package/src/sap/fe/core/helpers/MassEditHelper.js +601 -684
  157. package/src/sap/fe/core/helpers/MassEditHelper.ts +699 -0
  158. package/src/sap/fe/core/helpers/ModelHelper.js +25 -1
  159. package/src/sap/fe/core/helpers/ModelHelper.ts +23 -0
  160. package/src/sap/fe/core/helpers/SemanticDateOperators.js +5 -1
  161. package/src/sap/fe/core/helpers/SemanticDateOperators.ts +4 -0
  162. package/src/sap/fe/core/library.js +426 -451
  163. package/src/sap/fe/core/library.support.js +22 -33
  164. package/src/sap/fe/core/library.support.ts +23 -0
  165. package/src/sap/fe/core/library.ts +420 -0
  166. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +5 -3
  167. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +4 -1
  168. package/src/sap/fe/core/messagebundle.properties +22 -5
  169. package/src/sap/fe/core/messagebundle_ar.properties +27 -7
  170. package/src/sap/fe/core/messagebundle_bg.properties +27 -7
  171. package/src/sap/fe/core/messagebundle_ca.properties +27 -7
  172. package/src/sap/fe/core/messagebundle_cs.properties +27 -7
  173. package/src/sap/fe/core/messagebundle_cy.properties +27 -7
  174. package/src/sap/fe/core/messagebundle_da.properties +27 -7
  175. package/src/sap/fe/core/messagebundle_de.properties +27 -7
  176. package/src/sap/fe/core/messagebundle_el.properties +27 -7
  177. package/src/sap/fe/core/messagebundle_en.properties +27 -7
  178. package/src/sap/fe/core/messagebundle_en_GB.properties +27 -7
  179. package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +27 -7
  180. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +27 -7
  181. package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +27 -7
  182. package/src/sap/fe/core/messagebundle_es.properties +27 -7
  183. package/src/sap/fe/core/messagebundle_es_MX.properties +27 -7
  184. package/src/sap/fe/core/messagebundle_et.properties +27 -7
  185. package/src/sap/fe/core/messagebundle_fi.properties +28 -8
  186. package/src/sap/fe/core/messagebundle_fr.properties +28 -8
  187. package/src/sap/fe/core/messagebundle_fr_CA.properties +29 -9
  188. package/src/sap/fe/core/messagebundle_hi.properties +27 -7
  189. package/src/sap/fe/core/messagebundle_hr.properties +27 -7
  190. package/src/sap/fe/core/messagebundle_hu.properties +27 -7
  191. package/src/sap/fe/core/messagebundle_id.properties +27 -7
  192. package/src/sap/fe/core/messagebundle_it.properties +27 -7
  193. package/src/sap/fe/core/messagebundle_iw.properties +27 -7
  194. package/src/sap/fe/core/messagebundle_ja.properties +26 -6
  195. package/src/sap/fe/core/messagebundle_kk.properties +27 -7
  196. package/src/sap/fe/core/messagebundle_ko.properties +27 -7
  197. package/src/sap/fe/core/messagebundle_lt.properties +27 -7
  198. package/src/sap/fe/core/messagebundle_lv.properties +28 -8
  199. package/src/sap/fe/core/messagebundle_ms.properties +27 -7
  200. package/src/sap/fe/core/messagebundle_nl.properties +27 -7
  201. package/src/sap/fe/core/messagebundle_no.properties +27 -7
  202. package/src/sap/fe/core/messagebundle_pl.properties +27 -7
  203. package/src/sap/fe/core/messagebundle_pt.properties +28 -8
  204. package/src/sap/fe/core/messagebundle_pt_PT.properties +27 -7
  205. package/src/sap/fe/core/messagebundle_ro.properties +27 -7
  206. package/src/sap/fe/core/messagebundle_ru.properties +27 -7
  207. package/src/sap/fe/core/messagebundle_sh.properties +27 -7
  208. package/src/sap/fe/core/messagebundle_sk.properties +27 -7
  209. package/src/sap/fe/core/messagebundle_sl.properties +27 -7
  210. package/src/sap/fe/core/messagebundle_sv.properties +27 -7
  211. package/src/sap/fe/core/messagebundle_th.properties +26 -6
  212. package/src/sap/fe/core/messagebundle_tr.properties +30 -10
  213. package/src/sap/fe/core/messagebundle_uk.properties +27 -7
  214. package/src/sap/fe/core/messagebundle_vi.properties +27 -7
  215. package/src/sap/fe/core/messagebundle_zh_CN.properties +27 -7
  216. package/src/sap/fe/core/messagebundle_zh_TW.properties +27 -7
  217. package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +45 -71
  218. package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +154 -192
  219. package/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +4 -4
  220. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +66 -92
  221. package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +1 -1
  222. package/src/sap/fe/core/services/NavigationServiceFactory.js +284 -339
  223. package/src/sap/fe/core/services/NavigationServiceFactory.ts +10 -13
  224. package/src/sap/fe/core/services/ResourceModelServiceFactory.js +67 -102
  225. package/src/sap/fe/core/services/ResourceModelServiceFactory.ts +5 -2
  226. package/src/sap/fe/core/services/RoutingServiceFactory.js +754 -814
  227. package/src/sap/fe/core/services/RoutingServiceFactory.ts +13 -13
  228. package/src/sap/fe/core/services/ShellServicesFactory.js +649 -736
  229. package/src/sap/fe/core/services/ShellServicesFactory.ts +7 -4
  230. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +567 -592
  231. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +22 -3
  232. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +354 -386
  233. package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +21 -14
  234. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +1 -1
  235. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.ts +1 -1
  236. package/src/sap/fe/core/support/CommonHelper.js +1 -1
  237. package/src/sap/fe/core/support/CommonHelper.ts +1 -1
  238. package/src/sap/fe/core/support/Diagnostics.js +36 -48
  239. package/src/sap/fe/core/templating/DataModelPathHelper.js +93 -85
  240. package/src/sap/fe/core/templating/DataModelPathHelper.ts +104 -95
  241. package/src/sap/fe/core/templating/FilterHelper.js +25 -32
  242. package/src/sap/fe/core/templating/FilterHelper.ts +36 -35
  243. package/src/sap/fe/core/templating/PropertyHelper.js +2 -2
  244. package/src/sap/fe/core/templating/PropertyHelper.ts +1 -1
  245. package/src/sap/fe/core/templating/UIFormatters.js +32 -26
  246. package/src/sap/fe/core/templating/UIFormatters.ts +37 -24
@@ -1,782 +1,721 @@
1
1
  /*!
2
2
  * SAP UI development toolkit for HTML5 (SAPUI5)
3
- (c) Copyright 2009-2021 SAP SE. All rights reserved
4
-
3
+ * (c) Copyright 2009-2021 SAP SE. All rights reserved
5
4
  */
6
- sap.ui.define(
7
- [
8
- "sap/ui/core/mvc/ControllerExtension",
9
- "sap/ui/core/mvc/OverrideExecution",
10
- "sap/fe/core/actions/messageHandling",
11
- "sap/fe/core/TransactionHelper",
12
- "sap/base/Log",
13
- "sap/fe/core/CommonUtils",
14
- "sap/fe/core/BusyLocker",
15
- "sap/fe/core/library",
16
- "sap/fe/core/helpers/EditState",
17
- "sap/m/Button",
18
- "sap/m/Dialog",
19
- "sap/fe/core/actions/sticky"
20
- ],
21
- function(
22
- ControllerExtension,
23
- OverrideExecution,
24
- messageHandling,
25
- TransactionHelper,
26
- Log,
27
- CommonUtils,
28
- BusyLocker,
29
- FELibrary,
30
- EditState,
31
- Button,
32
- Dialog,
33
- sticky
34
- ) {
35
- "use strict";
36
-
37
- var ProgrammingModel = FELibrary.ProgrammingModel,
38
- DraftStatus = FELibrary.DraftStatus,
39
- EditMode = FELibrary.EditMode,
40
- CreationMode = FELibrary.CreationMode;
41
-
42
- function _registerDirtyStateProvider(oContext, oAppComponent, oInternalModel, sHashTracker) {
43
- function fnDirtyStateProvider(oNavigationContext) {
44
- var sTargetHash = oNavigationContext.innerAppRoute,
45
- oRouterProxy = oAppComponent.getRouterProxy(),
46
- bDirty,
47
- bSessionON = oInternalModel.getProperty("/sessionOn");
48
-
49
- if (!bSessionON) {
50
- // If the sticky session was terminated before hand.
51
- // Eexample in case of navigating away from application using IBN.
52
- return undefined;
53
- }
54
-
55
- if (!oRouterProxy.isNavigationFinalized()) {
56
- // If navigation is currently happening in RouterProxy, it's a transient state
57
- // (not dirty)
58
- bDirty = false;
59
- sHashTracker = sTargetHash;
60
- } else if (sHashTracker === sTargetHash) {
61
- // the hash didn't change so either the user attempts to refresh or to leave the app
62
- bDirty = true;
63
- } else if (oRouterProxy.checkHashWithGuard(sTargetHash) || oRouterProxy.isGuardCrossAllowedByUser()) {
64
- // the user attempts to navigate within the root object
65
- // or crossing the guard has already been allowed by the RouterProxy
66
- sHashTracker = sTargetHash;
67
- bDirty = false;
68
- } else {
69
- // the user attempts to navigate within the app, for example back to the list report
70
- bDirty = true;
71
- }
72
-
73
- if (bDirty) {
74
- // the FLP doesn't call the dirty state provider anymore once it's dirty, as they can't
75
- // change this due to compatibility reasons we set it back to not-dirty
76
- setTimeout(function() {
77
- oAppComponent.getShellServices().setDirtyFlag(false);
78
- }, 0);
79
- }
80
-
81
- return bDirty;
82
- }
83
-
84
- oContext.fnDirtyStateProvider = fnDirtyStateProvider;
85
- oAppComponent.getShellServices().registerDirtyStateProvider(oContext.fnDirtyStateProvider);
86
- }
87
-
88
- function _attachSessionTimeout(oContext, i18nModel) {
89
- var that = oContext;
90
-
91
- function fnHandleSessionTimeout() {
92
- // remove transient messages since we will showing our own message
93
- that.getMessageHandler().removeTransitionMessages();
94
-
95
- var oDialog = new Dialog({
96
- title: "{sap.fe.i18n>C_EDITFLOW_OBJECT_PAGE_SESSION_EXPIRED_DIALOG_TITLE}",
97
- state: "Warning",
98
- content: new Text({ text: "{sap.fe.i18n>C_EDITFLOW_OBJECT_PAGE_SESSION_EXPIRED_DIALOG_MESSAGE}" }),
99
- beginButton: new Button({
100
- text: "{sap.fe.i18n>C_COMMON_DIALOG_OK}",
101
- type: "Emphasized",
102
- press: function() {
103
- // remove sticky handling after navigation since session has already been terminated
104
- that.handleStickyOff();
105
- that.getRoutingListener().navigateBackFromContext(oContext);
106
- }
107
- }),
108
- afterClose: function() {
109
- oDialog.destroy();
110
- }
111
- });
112
- oDialog.addStyleClass("sapUiContentPadding");
113
- oDialog.setModel(i18nModel, "sap.fe.i18n");
114
- that.getView().addDependent(oDialog);
115
- oDialog.open();
116
- }
117
-
118
- // handle session timeout
119
- that.fnHandleSessionTimeout = fnHandleSessionTimeout;
120
- that.getView()
121
- .getModel()
122
- .attachSessionTimeout(that.fnHandleSessionTimeout);
123
- }
124
-
125
- function _attachRouteMatched(oFnContext, oContext, oAppComponent) {
126
- var that = oFnContext;
127
-
128
- function fnStickyDiscardAfterNavigation() {
129
- var sCurrentHash = oAppComponent.getRouterProxy().getHash();
130
- // either current hash is empty so the user left the app or he navigated away from the object
131
- if (!sCurrentHash || !oAppComponent.getRouterProxy().checkHashWithGuard(sCurrentHash)) {
132
- that.discardStickySession(oContext);
133
- }
134
- }
135
-
136
- that.fnStickyDiscardAfterNavigation = fnStickyDiscardAfterNavigation;
137
- oAppComponent.getRoutingService().attachRouteMatched(that.fnStickyDiscardAfterNavigation);
138
- }
139
-
140
- return ControllerExtension.extend("sap.fe.core.controllerextensions.InternalEditFlow", {
141
- metadata: {
142
- methods: {
143
- createMultipleDocuments: { "public": true, "final": true },
144
- deleteMultipleDocuments: { "public": true, "final": true },
145
- computeEditMode: { "public": true, "final": true },
146
- setEditMode: { "public": true, "final": true },
147
- setDraftStatus: { "public": true, "final": true },
148
- getRoutingListener: { "public": true, "final": true },
149
- getGlobalUIModel: { "public": true, "final": true },
150
- syncTask: { "public": true, "final": true },
151
- getProgrammingModel: { "public": true, "final": true },
152
- deleteDocumentTransaction: { "public": true, "final": true },
153
- handleCreateEvents: { "public": true, "final": true },
154
- getTransactionHelper: { "public": true, "final": true },
155
- getInternalModel: { "public": true, "final": true },
156
- createActionPromise: { "public": true, "final": true },
157
- getCurrentActionPromise: { "public": true, "final": true },
158
- deleteCurrentActionPromise: { "public": true, "final": true },
159
- getActionResponseDataAndKeys: { "public": true, "final": true },
160
- setCreationMode: { "public": false, "final": false, "overrideExecution": OverrideExecution.After },
161
- getMessageHandler: { "public": true, "final": true },
162
- handleStickyOn: { "public": true, "final": true },
163
- handleStickyOff: { "public": true, "final": true }
164
- }
165
- },
166
-
167
- /**
168
- * Override to set the creation mode.
169
- *
170
- * @memberof sap.fe.core.controllerextensions.InternalEditFlow
171
- * @alias sap.fe.core.controllerextensions.InternalEditFlow#setCreationMode
172
- * @since 1.90.0
173
- */
174
- setCreationMode: function() {
175
- // to be overridden
176
- },
177
-
178
- createMultipleDocuments: function(oListBinding, aData, bCreateAtEnd, bFromCopyPaste, beforeCreateCallBack) {
179
- var that = this,
180
- transactionHelper = this.getTransactionHelper(),
181
- oLockObject = this.getGlobalUIModel(),
182
- oResourceBundle = that.getView().getController().oResourceBundle;
183
-
184
- BusyLocker.lock(oLockObject);
185
- return this.syncTask()
186
- .then(function() {
187
- var onBeforeCreatePromise = beforeCreateCallBack
188
- ? beforeCreateCallBack({ contextPath: oListBinding && oListBinding.getPath() })
189
- : Promise.resolve();
190
- return onBeforeCreatePromise;
191
- })
192
- .then(function() {
193
- var oModel = oListBinding.getModel(),
194
- oMetaModel = oModel.getMetaModel(),
195
- sMetaPath;
196
-
197
- if (oListBinding.getContext()) {
198
- sMetaPath = oMetaModel.getMetaPath(oListBinding.getContext().getPath() + "/" + oListBinding.getPath());
199
- } else {
200
- sMetaPath = oMetaModel.getMetaPath(oListBinding.getPath());
201
- }
202
-
203
- that.handleCreateEvents(oListBinding);
204
-
205
- // Iterate on all items and store the corresponding creation promise
206
- var aCreationPromises = aData.map(function(mPropertyValues) {
207
- var mParameters = { data: {} };
208
-
209
- mParameters.keepTransientContextOnFailed = false; // currently not fully supported
210
- mParameters.busyMode = "None";
211
- mParameters.creationMode = CreationMode.CreationRow;
212
- mParameters.parentControl = that.getView();
213
- mParameters.createAtEnd = bCreateAtEnd;
214
-
215
- // Remove navigation properties as we don't support deep create
216
- for (var sPropertyPath in mPropertyValues) {
217
- var oProperty = oMetaModel.getObject(sMetaPath + "/" + sPropertyPath);
218
- if (oProperty && oProperty.$kind !== "NavigationProperty" && mPropertyValues[sPropertyPath]) {
219
- mParameters.data[sPropertyPath] = mPropertyValues[sPropertyPath];
220
- }
221
- }
222
-
223
- return transactionHelper.createDocument(
224
- oListBinding,
225
- mParameters,
226
- oResourceBundle,
227
- that.getMessageHandler(),
228
- bFromCopyPaste,
229
- that.getView()
230
- );
231
- });
232
-
233
- return Promise.all(aCreationPromises);
234
- })
235
- .then(function(aContexts) {
236
- // transient contexts are reliably removed once oNewContext.created() is resolved
237
- return Promise.all(
238
- aContexts.map(function(oNewContext) {
239
- return oNewContext.created();
240
- })
241
- );
242
- })
243
- .then(function() {
244
- var oBindingContext = that.getView().getBindingContext();
245
-
246
- // if there are transient contexts, we must avoid requesting side effects
247
- // this is avoid a potential list refresh, there could be a side effect that refreshes the list binding
248
- // if list binding is refreshed, transient contexts might be lost
249
- if (!CommonUtils.hasTransientContext(oListBinding)) {
250
- that._oAppComponent
251
- .getSideEffectsService()
252
- .requestSideEffectsForNavigationProperty(oListBinding.getPath(), oBindingContext);
253
- }
254
- })
255
- .catch(function(err) {
256
- Log.error("Error while creating multiple documents.");
257
- return Promise.reject(err);
258
- })
259
- .finally(function() {
260
- BusyLocker.unlock(oLockObject);
261
- });
262
- },
263
-
264
- deleteMultipleDocuments: function(aContexts, mParameters) {
265
- var that = this,
266
- oRoutingListener = this.getRoutingListener(),
267
- oLockObject = this.getGlobalUIModel();
268
- var oTable = that.getView().byId(mParameters.controlId);
269
- if (!oTable || !oTable.isA("sap.ui.mdc.Table")) {
270
- throw new Error("parameter controlId missing or incorrect");
271
- }
272
- var oListBinding = oTable.getRowBinding();
273
- mParameters.bFindActiveContexts = true;
274
- BusyLocker.lock(oLockObject);
275
- return this.deleteDocumentTransaction(aContexts, mParameters)
276
- .then(function() {
277
- var oResult;
278
-
279
- // Multiple object deletion is triggered from a list
280
- // First clear the selection in the table as it's not valid any more
281
- oTable.clearSelection();
282
-
283
- // Then refresh the list-binding (LR), or require side-effects (OP)
284
- var oBindingContext = that.getView().getBindingContext();
285
- if (oListBinding.isRoot()) {
286
- // keep promise chain pending until refresh of listbinding is completed
287
- oResult = new Promise(function(resolve) {
288
- oListBinding.attachEventOnce("dataReceived", function() {
289
- resolve();
290
- });
291
- });
292
- oListBinding.refresh();
293
- } else if (oBindingContext) {
294
- // if there are transient contexts, we must avoid requesting side effects
295
- // this is avoid a potential list refresh, there could be a side effect that refreshes the list binding
296
- // if list binding is refreshed, transient contexts might be lost
297
- if (!CommonUtils.hasTransientContext(oListBinding)) {
298
- that._oAppComponent
299
- .getSideEffectsService()
300
- .requestSideEffectsForNavigationProperty(oListBinding.getPath(), oBindingContext);
301
- }
302
- }
303
-
304
- // deleting at least one object should also set the UI to dirty
305
- EditState.setEditStateDirty();
306
-
307
- // Finally, check if the current state can be impacted by the deletion, i.e. if there's
308
- // an OP displaying a deleted object. If yes navigate back to dismiss the OP
309
- for (var index = 0; index < aContexts.length; index++) {
310
- if (oRoutingListener.isCurrentStateImpactedBy(aContexts[index])) {
311
- oRoutingListener.navigateBackFromContext(aContexts[index]);
312
- break;
313
- }
314
- }
315
-
316
- return oResult;
317
- })
318
- .catch(function(oError) {
319
- Log.error("Error while deleting the document(s)", oError);
320
- })
321
- .finally(function() {
322
- BusyLocker.unlock(oLockObject);
323
- });
324
- },
325
-
326
- /**
327
- * Decides if a document is to be shown in display or edit mode.
328
- *
329
- * @function
330
- * @name _computeEditMode
331
- * @memberof sap.fe.core.controllerextensions.InternalEditFlow
332
- * @param {sap.ui.model.odata.v4.Context} oContext The context to be displayed or edited
333
- * @returns {Promise} Promise resolves once the edit mode is computed
334
- */
335
-
336
- computeEditMode: function(oContext) {
337
- var that = this,
338
- sCustomAction = that.getInternalModel().getProperty("/sCustomAction");
339
-
340
- return Promise.resolve(
341
- (function() {
342
- var sProgrammingModel = that.getProgrammingModel(oContext);
343
-
344
- if (sProgrammingModel === ProgrammingModel.Draft) {
345
- that.setDraftStatus(DraftStatus.Clear);
346
-
347
- return oContext
348
- .requestObject("IsActiveEntity")
349
- .then(function(bIsActiveEntity) {
350
- if (bIsActiveEntity === false) {
351
- // in case the document is draft set it in edit mode
352
- that.setEditMode(EditMode.Editable);
353
- return oContext.requestObject("HasActiveEntity").then(function(bHasActiveEntity) {
354
- that.setEditMode(undefined, !bHasActiveEntity);
355
- });
356
- } else {
357
- // active document, stay on display mode
358
- that.setEditMode(EditMode.Display, false);
359
- }
360
- })
361
- .catch(function(oError) {
362
- Log.error("Error while determining the editMode for draft", oError);
363
- throw oError;
364
- });
365
- } else if (sProgrammingModel === ProgrammingModel.Sticky) {
366
- if (
367
- sCustomAction &&
368
- sCustomAction !== "" &&
369
- that._hasNewActionForSticky(oContext, that.getView(), sCustomAction)
370
- ) {
371
- that.getTransactionHelper()._bCreateMode = true;
372
- that.getTransactionHelper().handleDocumentModifications();
373
- that.setEditMode(EditMode.Editable, true);
374
- EditState.setEditStateDirty();
375
- that.handleStickyOn(oContext);
376
- that.getInternalModel().setProperty("/sCustomAction", "");
377
- }
378
- }
379
- })()
380
- );
381
- },
382
-
383
- /**
384
- * Sets the edit mode.
385
- *
386
- * @param {string} sEditMode
387
- * @param {boolean} bCreationMode CreateMode flag to identify the creation mode
388
- */
389
- setEditMode: function(sEditMode, bCreationMode) {
390
- // at this point of time it's not meant to release the edit flow for freestyle usage therefore we can
391
- // rely on the global UI model to exist
392
- var oGlobalModel = this.getGlobalUIModel();
393
-
394
- if (sEditMode) {
395
- oGlobalModel.setProperty("/editMode", sEditMode, undefined, true);
396
- oGlobalModel.setProperty("/isEditable", sEditMode === "Editable", undefined, true);
397
- }
398
-
399
- if (bCreationMode !== undefined) {
400
- // Since setCreationMode is public in EditFlow and can be overriden, make sure to call it via the controller
401
- // to ensure any overrides are taken into account
402
- this.setCreationMode(bCreationMode);
403
- }
404
- },
405
-
406
- setDraftStatus: function(sDraftState) {
407
- // at this point of time it's not meant to release the edit flow for freestyle usage therefore we can
408
- // rely on the global UI model to exist
409
- this.base
410
- .getView()
411
- .getModel("ui")
412
- .setProperty("/draftStatus", sDraftState, undefined, true);
413
- },
414
-
415
- getRoutingListener: function() {
416
- // at this point of time it's not meant to release the edit flow for FPM custom pages and the routing
417
- // listener is not yet public therefore keep the logic here for now
418
-
419
- if (this.base._routing) {
420
- return this.base._routing;
421
- } else {
422
- throw new Error("Edit Flow works only with a given routing listener");
423
- }
424
- },
425
-
426
- getGlobalUIModel: function() {
427
- // at this point of time it's not meant to release the edit flow for freestyle usage therefore we can
428
- // rely on the global UI model to exist
429
- return this.base.getView().getModel("ui");
430
- },
431
-
432
- /**
433
- * Performs a task in sync with other tasks created via this function.
434
- * Returns the promise chain of the task.
435
- *
436
- * @function
437
- * @name sap.fe.core.controllerextensions.EditFlow#syncTask
438
- * @memberof sap.fe.core.controllerextensions.EditFlow
439
- * @static
440
- * @param {Promise|Function} [vTask] Optional, a promise or function to be executed synchronously
441
- * @returns {Promise} Promise resolves once the task is completed
442
- *
443
- * @ui5-restricted
444
- * @final
445
- */
446
- syncTask: function(vTask) {
447
- var fnNewTask;
448
- if (vTask instanceof Promise) {
449
- fnNewTask = function() {
450
- return vTask;
451
- };
452
- } else if (typeof vTask === "function") {
453
- fnNewTask = vTask;
454
- }
455
-
456
- this._pTasks = this._pTasks || Promise.resolve();
457
- if (!!fnNewTask) {
458
- this._pTasks = this._pTasks.then(fnNewTask).catch(function() {
459
- return Promise.resolve();
460
- });
461
- }
462
-
463
- return this._pTasks;
464
- },
465
-
466
- getProgrammingModel: function(oContext) {
467
- return this.getTransactionHelper().getProgrammingModel(oContext);
468
- },
469
-
470
- deleteDocumentTransaction: function(oContext, mParameters) {
471
- var that = this,
472
- oResourceBundle = this.getView().getController().oResourceBundle,
473
- transactionHelper = this.getTransactionHelper();
474
-
475
- mParameters = mParameters || {};
476
-
477
- // TODO: this setting and removing of contexts shouldn't be in the transaction helper at all
478
- // for the time being I kept it and provide the internal model context to not break something
479
- mParameters.internalModelContext = mParameters.controlId
480
- ? sap.ui
481
- .getCore()
482
- .byId(mParameters.controlId)
483
- .getBindingContext("internal")
484
- : null;
485
-
486
- return this.syncTask()
487
- .then(
488
- transactionHelper.deleteDocument.bind(
489
- transactionHelper,
490
- oContext,
491
- mParameters,
492
- oResourceBundle,
493
- that.getMessageHandler()
494
- )
495
- )
496
- .then(function() {
497
- that.getInternalModel().setProperty("/sessionOn", false);
498
- })
499
- .catch(function(oError) {
500
- return Promise.reject(oError);
501
- });
502
- },
503
-
504
- /**
505
- * Handles the create event: shows messages and in case of a draft, updates the draft indicator.
506
- *
507
- * @memberof sap.fe.core.controllerextensions.EditFlow
508
- * @param {object} oBinding OData list binding object
509
- */
510
- handleCreateEvents: function(oBinding) {
511
- var that = this,
512
- sProgrammingModel,
513
- transactionHelper = that.getTransactionHelper();
514
-
515
- that.setDraftStatus(DraftStatus.Clear);
516
-
517
- oBinding = (oBinding.getBinding && oBinding.getBinding()) || oBinding;
518
- sProgrammingModel = that.getProgrammingModel(oBinding);
519
-
520
- oBinding.attachEvent("createSent", function() {
521
- transactionHelper.handleDocumentModifications();
522
- if (sProgrammingModel === ProgrammingModel.Draft) {
523
- that.setDraftStatus(DraftStatus.Saving);
524
- }
525
- });
526
- oBinding.attachEvent("createCompleted", function(oEvent) {
527
- var bSuccess = oEvent.getParameter("success");
528
- if (sProgrammingModel === ProgrammingModel.Draft) {
529
- that.setDraftStatus(bSuccess ? DraftStatus.Saved : DraftStatus.Clear);
530
- }
531
- that.getMessageHandler().showMessageDialog();
532
- });
533
- },
534
-
535
- getTransactionHelper: function() {
536
- if (!this._oTransactionHelper) {
537
- // currently also the transaction helper is locking therefore passing lock object
538
- this._oTransactionHelper = new TransactionHelper(this._oAppComponent, this.getGlobalUIModel());
539
- }
540
-
541
- return this._oTransactionHelper;
542
- },
543
-
544
- getInternalModel: function() {
545
- return this.base.getView().getModel("internal");
546
- },
547
-
548
- /**
549
- * Creates a new promise to wait for an action to be executed
550
- * @function
551
- * @name _createActionPromise
552
- * @memberof sap.fe.core.controllerextensions.EditFlow
553
- *
554
- * @returns {Function} The resolver function which can be used to externally resolve the promise
555
- */
556
-
557
- createActionPromise: function(sActionName, sControlId) {
558
- var that = this,
559
- fResolver,
560
- fRejector;
561
- this.oActionPromise = new Promise(function(resolve, reject) {
562
- fResolver = resolve;
563
- fRejector = reject;
564
- }).then(function(oResponse) {
565
- return Object.assign({ controlId: sControlId }, that.getActionResponseDataAndKeys(sActionName, oResponse));
566
- });
567
- return { fResolver: fResolver, fRejector: fRejector };
568
- },
569
-
570
- /**
571
- * Gets the getCurrentActionPromise object.
572
- *
573
- * @function
574
- * @name _getCurrentActionPromise
575
- * @memberof sap.fe.core.controllerextensions.EditFlow
576
- *
577
- * @returns {Promise} Returns the promise
578
- */
579
- getCurrentActionPromise: function() {
580
- return this.oActionPromise;
581
- },
582
-
583
- deleteCurrentActionPromise: function() {
584
- this.oActionPromise = null;
585
- },
586
-
587
- /**
588
- * @function
589
- * @name getActionResponseDataAndKeys
590
- * @memberof sap.fe.core.controllerextensions.EditFlow
591
- * @param {string} sActionName The name of the action that is executed
592
- * @param {object} oResponse The bound action's response data or response context
593
- * @returns {object} Object with data and names of the key fields of the response
594
- */
595
- getActionResponseDataAndKeys: function(sActionName, oResponse) {
596
- if (Array.isArray(oResponse)) {
597
- if (oResponse.length === 1) {
598
- oResponse = oResponse[0];
599
- } else {
600
- return null;
601
- }
602
- }
603
- if (!oResponse) {
604
- return null;
605
- }
606
- var oView = this.getView(),
607
- oMetaModel = oView
608
- .getModel()
609
- .getMetaModel()
610
- .getData(),
611
- sActionReturnType =
612
- oMetaModel && oMetaModel[sActionName] && oMetaModel[sActionName][0] && oMetaModel[sActionName][0].$ReturnType
613
- ? oMetaModel[sActionName][0].$ReturnType.$Type
614
- : null,
615
- aKey = sActionReturnType && oMetaModel[sActionReturnType] ? oMetaModel[sActionReturnType].$Key : null;
616
-
617
- return {
618
- oData: oResponse.getObject(),
619
- keys: aKey
620
- };
621
- },
622
-
623
- getMessageHandler: function() {
624
- // at this point of time it's not meant to release the edit flow for FPM custom pages therefore keep
625
- // the logic here for now
626
-
627
- if (this.base.messageHandler) {
628
- return this.base.messageHandler;
629
- } else {
630
- throw new Error("Edit Flow works only with a given message handler");
631
- }
632
- },
633
- override: {
634
- onInit: function() {
635
- this._oAppComponent = this.base.getAppComponent();
636
- }
637
- },
638
-
639
- handleStickyOn: function(oContext) {
640
- var that = this,
641
- oAppComponent = CommonUtils.getAppComponent(this.getView());
642
-
643
- try {
644
- if (oAppComponent === undefined || oContext === undefined) {
645
- throw new Error("undefined AppComponent or Context for function handleStickyOn");
646
- }
647
-
648
- if (!oAppComponent.getRouterProxy().hasNavigationGuard()) {
649
- var sHashTracker = oAppComponent.getRouterProxy().getHash(),
650
- oInternalModel = this.getInternalModel();
651
-
652
- // Set a guard in the RouterProxy
653
- // A timeout is necessary, as with deferred creation the hashChanger is not updated yet with
654
- // the new hash, and the guard cannot be found in the managed history of the router proxy
655
- setTimeout(function() {
656
- oAppComponent.getRouterProxy().setNavigationGuard();
657
- }, 0);
658
-
659
- // Setting back navigation on shell service, to get the dicard message box in case of sticky
660
- oAppComponent.getShellServices().setBackNavigation(that.onBackNavigationInSession.bind(that));
661
-
662
- _registerDirtyStateProvider(that, oAppComponent, oInternalModel, sHashTracker);
663
-
664
- var i18nModel = this.getView().getModel("sap.fe.i18n");
665
- _attachSessionTimeout(that, i18nModel);
666
-
667
- _attachRouteMatched(that, oContext, oAppComponent);
668
- }
669
- } catch (error) {
670
- Log.info(error);
671
- return undefined;
672
- }
673
- return true;
674
- },
675
-
676
- handleStickyOff: function() {
677
- var oAppComponent = CommonUtils.getAppComponent(this.getView());
678
- try {
679
- if (oAppComponent === undefined) {
680
- throw new Error("undefined AppComponent for function handleStickyOff");
681
- }
682
-
683
- if (oAppComponent && oAppComponent.getRouterProxy) {
684
- // If we have exited from the app, CommonUtils.getAppComponent doesn't return a
685
- // sap.fe.core.AppComponent, hence the 'if' above
686
- oAppComponent.getRouterProxy().discardNavigationGuard();
687
- }
688
-
689
- if (this.fnDirtyStateProvider) {
690
- oAppComponent.getShellServices().deregisterDirtyStateProvider(this.fnDirtyStateProvider);
691
- this.fnDirtyStateProvider = null;
692
- }
693
-
694
- if (this.getView().getModel() && this.fnHandleSessionTimeout) {
695
- this.getView()
696
- .getModel()
697
- .detachSessionTimeout(this.fnHandleSessionTimeout);
698
- }
699
-
700
- oAppComponent.getRoutingService().detachRouteMatched(this.fnStickyDiscardAfterNavigation);
701
- this.fnStickyDiscardAfterNavigation = null;
702
-
703
- this.getTransactionHelper()._bCreateMode = false;
704
- this.setEditMode(EditMode.Display, false);
705
-
706
- if (oAppComponent) {
707
- // If we have exited from the app, CommonUtils.getAppComponent doesn't return a
708
- // sap.fe.core.AppComponent, hence the 'if' above
709
- oAppComponent.getShellServices().setBackNavigation();
710
- }
711
- } catch (error) {
712
- Log.info(error);
713
- return undefined;
714
- }
715
- return true;
716
- },
717
-
718
- /**
719
- * @description Method to display a 'discard' popover when exiting a sticky session.
720
- *
721
- * @function
722
- * @name onBackNavigationInSession
723
- * @memberof sap.fe.core.controllerextensions.InternalEditFlow
724
- */
725
- onBackNavigationInSession: function() {
726
- var that = this,
727
- oView = that.getView(),
728
- oAppComponent = CommonUtils.getAppComponent(oView),
729
- oRouterProxy = oAppComponent.getRouterProxy();
730
-
731
- if (oRouterProxy.checkIfBackIsOutOfGuard()) {
732
- var oBindingContext = oView && oView.getBindingContext();
733
-
734
- CommonUtils.processDataLossConfirmation(
735
- function() {
736
- that.discardStickySession(oBindingContext);
737
- history.back();
738
- },
739
- oView,
740
- that.getProgrammingModel(oBindingContext)
741
- );
742
-
743
- return;
744
- }
745
- history.back();
746
- },
747
-
748
- discardStickySession: function(oContext) {
749
- sticky.discardDocument(oContext);
750
- this.handleStickyOff();
751
- },
752
-
753
- _hasNewActionForSticky: function(oContext, oView, sCustomAction) {
754
- try {
755
- if (oContext === undefined || oView === undefined) {
756
- throw new Error("Invalid input parameters for function _hasNewActionForSticky");
757
- }
758
-
759
- var oMetaModel = oView.getModel().getMetaModel(),
760
- sMetaPath = oContext.getPath().substring(0, oContext.getPath().indexOf("(")),
761
- oStickySession = oMetaModel.getObject(sMetaPath + "@com.sap.vocabularies.Session.v1.StickySessionSupported");
762
-
763
- if (oStickySession && oStickySession.NewAction && oStickySession.NewAction === sCustomAction) {
764
- return true;
765
- } else if (oStickySession && oStickySession.AdditionalNewActions) {
766
- return sCustomAction ===
767
- oStickySession.AdditionalNewActions.find(function(sAdditionalAction) {
768
- return sAdditionalAction === sCustomAction;
769
- })
770
- ? true
771
- : false;
772
- } else {
773
- return false;
774
- }
775
- } catch (error) {
776
- Log.info(error);
777
- return undefined;
778
- }
779
- }
780
- });
781
- }
782
- );
5
+ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/ui/core/mvc/OverrideExecution", "sap/fe/core/TransactionHelper", "sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/BusyLocker", "sap/fe/core/library", "sap/fe/core/helpers/EditState", "sap/fe/core/helpers/ClassSupport", "sap/fe/core/controllerextensions/ControllerExtensionMetadata", "sap/m/Dialog", "sap/m/Button", "sap/m/Text", "sap/fe/core/actions/sticky", "sap/fe/core/actions/collaboration/ActivitySync", "sap/fe/core/actions/collaboration/CollaborationCommon"], function (ControllerExtension, OverrideExecution, TransactionHelper, Log, CommonUtils, BusyLocker, FELibrary, EditState, ClassSupport, ControllerExtensionMetadata, Dialog, Button, Text, sticky, ActivitySync, CollaborationCommon) {
6
+ "use strict";
7
+
8
+ var _dec, _dec2, _dec3, _class, _class2;
9
+
10
+ var Activity = CollaborationCommon.Activity;
11
+ var send = ActivitySync.send;
12
+ var UI5Class = ClassSupport.UI5Class;
13
+ var Public = ClassSupport.Public;
14
+ var Private = ClassSupport.Private;
15
+ var Override = ClassSupport.Override;
16
+ var Final = ClassSupport.Final;
17
+ var Extensible = ClassSupport.Extensible;
18
+
19
+ function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }
20
+
21
+ function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
22
+
23
+ function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) { var desc = {}; Object.keys(descriptor).forEach(function (key) { desc[key] = descriptor[key]; }); desc.enumerable = !!desc.enumerable; desc.configurable = !!desc.configurable; if ('value' in desc || desc.initializer) { desc.writable = true; } desc = decorators.slice().reverse().reduce(function (desc, decorator) { return decorator(target, property, desc) || desc; }, desc); if (context && desc.initializer !== void 0) { desc.value = desc.initializer ? desc.initializer.call(context) : void 0; desc.initializer = undefined; } if (desc.initializer === void 0) { Object.defineProperty(target, property, desc); desc = null; } return desc; }
24
+
25
+ var ProgrammingModel = FELibrary.ProgrammingModel,
26
+ DraftStatus = FELibrary.DraftStatus,
27
+ EditMode = FELibrary.EditMode,
28
+ CreationMode = FELibrary.CreationMode;
29
+ var InternalEditFlow = (_dec = UI5Class("sap.fe.core.controllerextensions.InternalEditFlow", ControllerExtensionMetadata), _dec2 = Override(), _dec3 = Extensible(OverrideExecution.After), _dec(_class = (_class2 = /*#__PURE__*/function (_ControllerExtension) {
30
+ _inherits(InternalEditFlow, _ControllerExtension);
31
+
32
+ function InternalEditFlow() {
33
+ return _ControllerExtension.apply(this, arguments) || this;
34
+ }
35
+
36
+ var _proto = InternalEditFlow.prototype;
37
+
38
+ _proto.onInit = function onInit() {
39
+ this._oAppComponent = this.base.getAppComponent();
40
+ }
41
+ /**
42
+ * Override to set the creation mode.
43
+ *
44
+ * @param bCreationMode
45
+ * @memberof sap.fe.core.controllerextensions.InternalEditFlow
46
+ * @alias sap.fe.core.controllerextensions.InternalEditFlow#setCreationMode
47
+ * @since 1.90.0
48
+ */
49
+ ;
50
+
51
+ _proto. // eslint-disable-next-line @typescript-eslint/no-unused-vars
52
+ setCreationMode = function setCreationMode(bCreationMode) {// to be overridden
53
+ };
54
+
55
+ _proto.createMultipleDocuments = function createMultipleDocuments(oListBinding, aData, bCreateAtEnd, bFromCopyPaste, beforeCreateCallBack) {
56
+ var _this = this;
57
+
58
+ var transactionHelper = this.getTransactionHelper(),
59
+ oLockObject = this.getGlobalUIModel(),
60
+ oResourceBundle = this.getView().getController().oResourceBundle;
61
+ BusyLocker.lock(oLockObject);
62
+ return this.syncTask().then(function () {
63
+ var onBeforeCreatePromise = beforeCreateCallBack ? beforeCreateCallBack({
64
+ contextPath: oListBinding && oListBinding.getPath()
65
+ }) : Promise.resolve();
66
+ return onBeforeCreatePromise;
67
+ }).then(function () {
68
+ var oModel = oListBinding.getModel(),
69
+ oMetaModel = oModel.getMetaModel();
70
+ var sMetaPath;
71
+
72
+ if (oListBinding.getContext()) {
73
+ sMetaPath = oMetaModel.getMetaPath(oListBinding.getContext().getPath() + "/" + oListBinding.getPath());
74
+ } else {
75
+ sMetaPath = oMetaModel.getMetaPath(oListBinding.getPath());
76
+ }
77
+
78
+ _this.handleCreateEvents(oListBinding); // Iterate on all items and store the corresponding creation promise
79
+
80
+
81
+ var aCreationPromises = aData.map(function (mPropertyValues) {
82
+ var mParameters = {
83
+ data: {}
84
+ };
85
+ mParameters.keepTransientContextOnFailed = false; // currently not fully supported
86
+
87
+ mParameters.busyMode = "None";
88
+ mParameters.creationMode = CreationMode.CreationRow;
89
+ mParameters.parentControl = _this.getView();
90
+ mParameters.createAtEnd = bCreateAtEnd; // Remove navigation properties as we don't support deep create
91
+
92
+ for (var sPropertyPath in mPropertyValues) {
93
+ var oProperty = oMetaModel.getObject(sMetaPath + "/" + sPropertyPath);
94
+
95
+ if (oProperty && oProperty.$kind !== "NavigationProperty" && mPropertyValues[sPropertyPath]) {
96
+ mParameters.data[sPropertyPath] = mPropertyValues[sPropertyPath];
97
+ }
98
+ }
99
+
100
+ return transactionHelper.createDocument(oListBinding, mParameters, oResourceBundle, _this.getMessageHandler(), bFromCopyPaste, _this.getView());
101
+ });
102
+ return Promise.all(aCreationPromises);
103
+ }).then(function (aContexts) {
104
+ // transient contexts are reliably removed once oNewContext.created() is resolved
105
+ return Promise.all(aContexts.map(function (oNewContext) {
106
+ return oNewContext.created();
107
+ }));
108
+ }).then(function () {
109
+ var oBindingContext = _this.getView().getBindingContext(); // if there are transient contexts, we must avoid requesting side effects
110
+ // this is avoid a potential list refresh, there could be a side effect that refreshes the list binding
111
+ // if list binding is refreshed, transient contexts might be lost
112
+
113
+
114
+ if (!CommonUtils.hasTransientContext(oListBinding)) {
115
+ _this._oAppComponent.getSideEffectsService().requestSideEffectsForNavigationProperty(oListBinding.getPath(), oBindingContext);
116
+ }
117
+ }).catch(function (err) {
118
+ Log.error("Error while creating multiple documents.");
119
+ return Promise.reject(err);
120
+ }).finally(function () {
121
+ BusyLocker.unlock(oLockObject);
122
+ });
123
+ };
124
+
125
+ _proto.deleteMultipleDocuments = function deleteMultipleDocuments(aContexts, mParameters) {
126
+ var _this2 = this;
127
+
128
+ var oRoutingListener = this.getRoutingListener(),
129
+ oLockObject = this.getGlobalUIModel();
130
+ var oTable = this.getView().byId(mParameters.controlId);
131
+
132
+ if (!oTable || !oTable.isA("sap.ui.mdc.Table")) {
133
+ throw new Error("parameter controlId missing or incorrect");
134
+ }
135
+
136
+ var oListBinding = oTable.getRowBinding();
137
+ mParameters.bFindActiveContexts = true;
138
+ BusyLocker.lock(oLockObject);
139
+ return this.deleteDocumentTransaction(aContexts, mParameters).then(function () {
140
+ var oResult; // Multiple object deletion is triggered from a list
141
+ // First clear the selection in the table as it's not valid any more
142
+
143
+ oTable.clearSelection(); // Then refresh the list-binding (LR), or require side-effects (OP)
144
+
145
+ var oBindingContext = _this2.getView().getBindingContext();
146
+
147
+ if (oListBinding.isRoot()) {
148
+ // keep promise chain pending until refresh of listbinding is completed
149
+ oResult = new Promise(function (resolve) {
150
+ oListBinding.attachEventOnce("dataReceived", function () {
151
+ resolve();
152
+ });
153
+ });
154
+ oListBinding.refresh();
155
+ } else if (oBindingContext) {
156
+ // if there are transient contexts, we must avoid requesting side effects
157
+ // this is avoid a potential list refresh, there could be a side effect that refreshes the list binding
158
+ // if list binding is refreshed, transient contexts might be lost
159
+ if (!CommonUtils.hasTransientContext(oListBinding)) {
160
+ _this2._oAppComponent.getSideEffectsService().requestSideEffectsForNavigationProperty(oListBinding.getPath(), oBindingContext);
161
+ }
162
+ } // deleting at least one object should also set the UI to dirty
163
+
164
+
165
+ EditState.setEditStateDirty();
166
+ send(_this2.getView(), Activity.Delete, aContexts); // Finally, check if the current state can be impacted by the deletion, i.e. if there's
167
+ // an OP displaying a deleted object. If yes navigate back to dismiss the OP
168
+
169
+ for (var index = 0; index < aContexts.length; index++) {
170
+ if (oRoutingListener.isCurrentStateImpactedBy(aContexts[index])) {
171
+ oRoutingListener.navigateBackFromContext(aContexts[index]);
172
+ break;
173
+ }
174
+ }
175
+
176
+ return oResult;
177
+ }).catch(function (oError) {
178
+ Log.error("Error while deleting the document(s)", oError);
179
+ }).finally(function () {
180
+ BusyLocker.unlock(oLockObject);
181
+ });
182
+ }
183
+ /**
184
+ * Decides if a document is to be shown in display or edit mode.
185
+ *
186
+ * @function
187
+ * @name _computeEditMode
188
+ * @memberof sap.fe.core.controllerextensions.InternalEditFlow
189
+ * @param {sap.ui.model.odata.v4.Context} oContext The context to be displayed or edited
190
+ * @returns {Promise} Promise resolves once the edit mode is computed
191
+ */
192
+ ;
193
+
194
+ _proto.computeEditMode = function computeEditMode(oContext) {
195
+ var _this3 = this;
196
+
197
+ var sCustomAction = this.getInternalModel().getProperty("/sCustomAction");
198
+ return Promise.resolve(function () {
199
+ var sProgrammingModel = _this3.getProgrammingModel(oContext);
200
+
201
+ if (sProgrammingModel === ProgrammingModel.Draft) {
202
+ _this3.setDraftStatus(DraftStatus.Clear);
203
+
204
+ return oContext.requestObject("IsActiveEntity").then(function (bIsActiveEntity) {
205
+ if (bIsActiveEntity === false) {
206
+ // in case the document is draft set it in edit mode
207
+ _this3.setEditMode(EditMode.Editable);
208
+
209
+ return oContext.requestObject("HasActiveEntity").then(function (bHasActiveEntity) {
210
+ _this3.setEditMode(undefined, !bHasActiveEntity);
211
+ });
212
+ } else {
213
+ // active document, stay on display mode
214
+ _this3.setEditMode(EditMode.Display, false);
215
+ }
216
+ }).catch(function (oError) {
217
+ Log.error("Error while determining the editMode for draft", oError);
218
+ throw oError;
219
+ });
220
+ } else if (sProgrammingModel === ProgrammingModel.Sticky) {
221
+ if (sCustomAction && sCustomAction !== "" && _this3._hasNewActionForSticky(oContext, _this3.getView(), sCustomAction)) {
222
+ _this3.getTransactionHelper()._bCreateMode = true;
223
+
224
+ _this3.getTransactionHelper().handleDocumentModifications();
225
+
226
+ _this3.setEditMode(EditMode.Editable, true);
227
+
228
+ EditState.setEditStateDirty();
229
+
230
+ _this3.handleStickyOn(oContext);
231
+
232
+ _this3.getInternalModel().setProperty("/sCustomAction", "");
233
+ }
234
+ }
235
+ }());
236
+ }
237
+ /**
238
+ * Sets the edit mode.
239
+ *
240
+ * @param {string} sEditMode
241
+ * @param {boolean} bCreationMode CreateMode flag to identify the creation mode
242
+ */
243
+ ;
244
+
245
+ _proto.setEditMode = function setEditMode(sEditMode) {
246
+ var bCreationMode = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
247
+ // at this point of time it's not meant to release the edit flow for freestyle usage therefore we can
248
+ // rely on the global UI model to exist
249
+ var oGlobalModel = this.getGlobalUIModel();
250
+
251
+ if (sEditMode) {
252
+ oGlobalModel.setProperty("/editMode", sEditMode, undefined, true);
253
+ oGlobalModel.setProperty("/isEditable", sEditMode === "Editable", undefined, true);
254
+ }
255
+
256
+ if (bCreationMode !== undefined) {
257
+ // Since setCreationMode is public in EditFlow and can be overriden, make sure to call it via the controller
258
+ // to ensure any overrides are taken into account
259
+ this.setCreationMode(bCreationMode);
260
+ }
261
+ };
262
+
263
+ _proto.setDraftStatus = function setDraftStatus(sDraftState) {
264
+ // at this point of time it's not meant to release the edit flow for freestyle usage therefore we can
265
+ // rely on the global UI model to exist
266
+ this.base.getView().getModel("ui").setProperty("/draftStatus", sDraftState, undefined, true);
267
+ };
268
+
269
+ _proto.getRoutingListener = function getRoutingListener() {
270
+ // at this point of time it's not meant to release the edit flow for FPM custom pages and the routing
271
+ // listener is not yet public therefore keep the logic here for now
272
+ if (this.base._routing) {
273
+ return this.base._routing;
274
+ } else {
275
+ throw new Error("Edit Flow works only with a given routing listener");
276
+ }
277
+ };
278
+
279
+ _proto.getGlobalUIModel = function getGlobalUIModel() {
280
+ // at this point of time it's not meant to release the edit flow for freestyle usage therefore we can
281
+ // rely on the global UI model to exist
282
+ return this.base.getView().getModel("ui");
283
+ }
284
+ /**
285
+ * Performs a task in sync with other tasks created via this function.
286
+ * Returns the promise chain of the task.
287
+ *
288
+ * @function
289
+ * @name sap.fe.core.controllerextensions.EditFlow#syncTask
290
+ * @memberof sap.fe.core.controllerextensions.EditFlow
291
+ * @static
292
+ * @param {Promise|Function} [vTask] Optional, a promise or function to be executed synchronously
293
+ * @returns {Promise} Promise resolves once the task is completed
294
+ *
295
+ * @ui5-restricted
296
+ * @final
297
+ */
298
+ ;
299
+
300
+ _proto.syncTask = function syncTask(vTask) {
301
+ var fnNewTask;
302
+
303
+ if (vTask instanceof Promise) {
304
+ fnNewTask = function () {
305
+ return vTask;
306
+ };
307
+ } else if (typeof vTask === "function") {
308
+ fnNewTask = vTask;
309
+ }
310
+
311
+ this._pTasks = this._pTasks || Promise.resolve();
312
+
313
+ if (!!fnNewTask) {
314
+ this._pTasks = this._pTasks.then(fnNewTask).catch(function () {
315
+ return Promise.resolve();
316
+ });
317
+ }
318
+
319
+ return this._pTasks;
320
+ };
321
+
322
+ _proto.getProgrammingModel = function getProgrammingModel(oContext) {
323
+ return this.getTransactionHelper().getProgrammingModel(oContext);
324
+ };
325
+
326
+ _proto.deleteDocumentTransaction = function deleteDocumentTransaction(oContext, mParameters) {
327
+ var _sap$ui$getCore$byId,
328
+ _this4 = this;
329
+
330
+ var oResourceBundle = this.getView().getController().oResourceBundle,
331
+ transactionHelper = this.getTransactionHelper();
332
+ mParameters = mParameters || {}; // TODO: this setting and removing of contexts shouldn't be in the transaction helper at all
333
+ // for the time being I kept it and provide the internal model context to not break something
334
+
335
+ mParameters.internalModelContext = mParameters.controlId ? (_sap$ui$getCore$byId = sap.ui.getCore().byId(mParameters.controlId)) === null || _sap$ui$getCore$byId === void 0 ? void 0 : _sap$ui$getCore$byId.getBindingContext("internal") : null;
336
+ return this.syncTask().then(transactionHelper.deleteDocument.bind(transactionHelper, oContext, mParameters, oResourceBundle, this.getMessageHandler())).then(function () {
337
+ _this4.getInternalModel().setProperty("/sessionOn", false);
338
+ }).catch(function (oError) {
339
+ return Promise.reject(oError);
340
+ });
341
+ }
342
+ /**
343
+ * Handles the create event: shows messages and in case of a draft, updates the draft indicator.
344
+ *
345
+ * @memberof sap.fe.core.controllerextensions.EditFlow
346
+ * @param {object} oBinding OData list binding object
347
+ */
348
+ ;
349
+
350
+ _proto.handleCreateEvents = function handleCreateEvents(oBinding) {
351
+ var _this5 = this;
352
+
353
+ var transactionHelper = this.getTransactionHelper();
354
+ this.setDraftStatus(DraftStatus.Clear);
355
+ oBinding = oBinding.getBinding && oBinding.getBinding() || oBinding;
356
+ var sProgrammingModel = this.getProgrammingModel(oBinding);
357
+ oBinding.attachEvent("createSent", function () {
358
+ transactionHelper.handleDocumentModifications();
359
+
360
+ if (sProgrammingModel === ProgrammingModel.Draft) {
361
+ _this5.setDraftStatus(DraftStatus.Saving);
362
+ }
363
+ });
364
+ oBinding.attachEvent("createCompleted", function (oEvent) {
365
+ var bSuccess = oEvent.getParameter("success");
366
+
367
+ if (sProgrammingModel === ProgrammingModel.Draft) {
368
+ _this5.setDraftStatus(bSuccess ? DraftStatus.Saved : DraftStatus.Clear);
369
+ }
370
+
371
+ _this5.getMessageHandler().showMessageDialog();
372
+ });
373
+ };
374
+
375
+ _proto.getTransactionHelper = function getTransactionHelper() {
376
+ if (!this._oTransactionHelper) {
377
+ // currently also the transaction helper is locking therefore passing lock object
378
+ this._oTransactionHelper = new TransactionHelper(this._oAppComponent, this.getGlobalUIModel());
379
+ }
380
+
381
+ return this._oTransactionHelper;
382
+ };
383
+
384
+ _proto.getInternalModel = function getInternalModel() {
385
+ return this.base.getView().getModel("internal");
386
+ }
387
+ /**
388
+ * Creates a new promise to wait for an action to be executed
389
+ * @function
390
+ * @name _createActionPromise
391
+ * @memberof sap.fe.core.controllerextensions.EditFlow
392
+ *
393
+ * @returns {Function} The resolver function which can be used to externally resolve the promise
394
+ */
395
+ ;
396
+
397
+ _proto.createActionPromise = function createActionPromise(sActionName, sControlId) {
398
+ var _this6 = this;
399
+
400
+ var fResolver, fRejector;
401
+ this.oActionPromise = new Promise(function (resolve, reject) {
402
+ fResolver = resolve;
403
+ fRejector = reject;
404
+ }).then(function (oResponse) {
405
+ return Object.assign({
406
+ controlId: sControlId
407
+ }, _this6.getActionResponseDataAndKeys(sActionName, oResponse));
408
+ });
409
+ return {
410
+ fResolver: fResolver,
411
+ fRejector: fRejector
412
+ };
413
+ }
414
+ /**
415
+ * Gets the getCurrentActionPromise object.
416
+ *
417
+ * @function
418
+ * @name _getCurrentActionPromise
419
+ * @memberof sap.fe.core.controllerextensions.EditFlow
420
+ *
421
+ * @returns {Promise} Returns the promise
422
+ */
423
+ ;
424
+
425
+ _proto.getCurrentActionPromise = function getCurrentActionPromise() {
426
+ return this.oActionPromise;
427
+ };
428
+
429
+ _proto.deleteCurrentActionPromise = function deleteCurrentActionPromise() {
430
+ this.oActionPromise = undefined;
431
+ }
432
+ /**
433
+ * @function
434
+ * @name getActionResponseDataAndKeys
435
+ * @memberof sap.fe.core.controllerextensions.EditFlow
436
+ * @param {string} sActionName The name of the action that is executed
437
+ * @param {object} oResponse The bound action's response data or response context
438
+ * @returns {object} Object with data and names of the key fields of the response
439
+ */
440
+ ;
441
+
442
+ _proto.getActionResponseDataAndKeys = function getActionResponseDataAndKeys(sActionName, oResponse) {
443
+ if (Array.isArray(oResponse)) {
444
+ if (oResponse.length === 1) {
445
+ oResponse = oResponse[0];
446
+ } else {
447
+ return null;
448
+ }
449
+ }
450
+
451
+ if (!oResponse) {
452
+ return null;
453
+ }
454
+
455
+ var oView = this.getView(),
456
+ oMetaModel = oView.getModel().getMetaModel().getData(),
457
+ sActionReturnType = oMetaModel && oMetaModel[sActionName] && oMetaModel[sActionName][0] && oMetaModel[sActionName][0].$ReturnType ? oMetaModel[sActionName][0].$ReturnType.$Type : null,
458
+ aKey = sActionReturnType && oMetaModel[sActionReturnType] ? oMetaModel[sActionReturnType].$Key : null;
459
+ return {
460
+ oData: oResponse.getObject(),
461
+ keys: aKey
462
+ };
463
+ };
464
+
465
+ _proto.getMessageHandler = function getMessageHandler() {
466
+ // at this point of time it's not meant to release the edit flow for FPM custom pages therefore keep
467
+ // the logic here for now
468
+ if (this.base.messageHandler) {
469
+ return this.base.messageHandler;
470
+ } else {
471
+ throw new Error("Edit Flow works only with a given message handler");
472
+ }
473
+ };
474
+
475
+ _proto.handleStickyOn = function handleStickyOn(oContext) {
476
+ var oAppComponent = CommonUtils.getAppComponent(this.getView());
477
+
478
+ try {
479
+ if (oAppComponent === undefined || oContext === undefined) {
480
+ throw new Error("undefined AppComponent or Context for function handleStickyOn");
481
+ }
482
+
483
+ if (!oAppComponent.getRouterProxy().hasNavigationGuard()) {
484
+ var sHashTracker = oAppComponent.getRouterProxy().getHash(),
485
+ oInternalModel = this.getInternalModel(); // Set a guard in the RouterProxy
486
+ // A timeout is necessary, as with deferred creation the hashChanger is not updated yet with
487
+ // the new hash, and the guard cannot be found in the managed history of the router proxy
488
+
489
+ setTimeout(function () {
490
+ oAppComponent.getRouterProxy().setNavigationGuard();
491
+ }, 0); // Setting back navigation on shell service, to get the dicard message box in case of sticky
492
+
493
+ oAppComponent.getShellServices().setBackNavigation(this.onBackNavigationInSession.bind(this));
494
+ this.fnDirtyStateProvider = this._registerDirtyStateProvider(oAppComponent, oInternalModel, sHashTracker);
495
+ oAppComponent.getShellServices().registerDirtyStateProvider(this.fnDirtyStateProvider); // handle session timeout
496
+
497
+ var i18nModel = this.getView().getModel("sap.fe.i18n");
498
+ this.fnHandleSessionTimeout = this._attachSessionTimeout(this, i18nModel);
499
+ this.getView().getModel().attachSessionTimeout(this.fnHandleSessionTimeout);
500
+ this.fnStickyDiscardAfterNavigation = this._attachRouteMatched(this, oContext, oAppComponent);
501
+ oAppComponent.getRoutingService().attachRouteMatched(this.fnStickyDiscardAfterNavigation);
502
+ }
503
+ } catch (error) {
504
+ Log.info(error);
505
+ return undefined;
506
+ }
507
+
508
+ return true;
509
+ };
510
+
511
+ _proto.handleStickyOff = function handleStickyOff() {
512
+ var oAppComponent = CommonUtils.getAppComponent(this.getView());
513
+
514
+ try {
515
+ if (oAppComponent === undefined) {
516
+ throw new Error("undefined AppComponent for function handleStickyOff");
517
+ }
518
+
519
+ if (oAppComponent && oAppComponent.getRouterProxy) {
520
+ // If we have exited from the app, CommonUtils.getAppComponent doesn't return a
521
+ // sap.fe.core.AppComponent, hence the 'if' above
522
+ oAppComponent.getRouterProxy().discardNavigationGuard();
523
+ }
524
+
525
+ if (this.fnDirtyStateProvider) {
526
+ oAppComponent.getShellServices().deregisterDirtyStateProvider(this.fnDirtyStateProvider);
527
+ this.fnDirtyStateProvider = undefined;
528
+ }
529
+
530
+ if (this.getView().getModel() && this.fnHandleSessionTimeout) {
531
+ this.getView().getModel().detachSessionTimeout(this.fnHandleSessionTimeout);
532
+ }
533
+
534
+ oAppComponent.getRoutingService().detachRouteMatched(this.fnStickyDiscardAfterNavigation);
535
+ this.fnStickyDiscardAfterNavigation = undefined;
536
+ this.getTransactionHelper()._bCreateMode = false;
537
+ this.setEditMode(EditMode.Display, false);
538
+
539
+ if (oAppComponent) {
540
+ // If we have exited from the app, CommonUtils.getAppComponent doesn't return a
541
+ // sap.fe.core.AppComponent, hence the 'if' above
542
+ oAppComponent.getShellServices().setBackNavigation();
543
+ }
544
+ } catch (error) {
545
+ Log.info(error);
546
+ return undefined;
547
+ }
548
+
549
+ return true;
550
+ }
551
+ /**
552
+ * @description Method to display a 'discard' popover when exiting a sticky session.
553
+ *
554
+ * @function
555
+ * @name onBackNavigationInSession
556
+ * @memberof sap.fe.core.controllerextensions.InternalEditFlow
557
+ */
558
+ ;
559
+
560
+ _proto.onBackNavigationInSession = function onBackNavigationInSession() {
561
+ var _this7 = this;
562
+
563
+ var oView = this.getView(),
564
+ oAppComponent = CommonUtils.getAppComponent(oView),
565
+ oRouterProxy = oAppComponent.getRouterProxy();
566
+
567
+ if (oRouterProxy.checkIfBackIsOutOfGuard()) {
568
+ var oBindingContext = oView && oView.getBindingContext();
569
+ CommonUtils.processDataLossConfirmation(function () {
570
+ _this7.discardStickySession(oBindingContext);
571
+
572
+ history.back();
573
+ }, oView, this.getProgrammingModel(oBindingContext));
574
+ return;
575
+ }
576
+
577
+ history.back();
578
+ };
579
+
580
+ _proto.discardStickySession = function discardStickySession(oContext) {
581
+ sticky.discardDocument(oContext);
582
+ this.handleStickyOff();
583
+ };
584
+
585
+ _proto._hasNewActionForSticky = function _hasNewActionForSticky(oContext, oView, sCustomAction) {
586
+ try {
587
+ if (oContext === undefined || oView === undefined) {
588
+ throw new Error("Invalid input parameters for function _hasNewActionForSticky");
589
+ }
590
+
591
+ var oMetaModel = oView.getModel().getMetaModel(),
592
+ sMetaPath = oContext.getPath().substring(0, oContext.getPath().indexOf("(")),
593
+ oStickySession = oMetaModel.getObject(sMetaPath + "@com.sap.vocabularies.Session.v1.StickySessionSupported");
594
+
595
+ if (oStickySession && oStickySession.NewAction && oStickySession.NewAction === sCustomAction) {
596
+ return true;
597
+ } else if (oStickySession && oStickySession.AdditionalNewActions) {
598
+ return sCustomAction === oStickySession.AdditionalNewActions.find(function (sAdditionalAction) {
599
+ return sAdditionalAction === sCustomAction;
600
+ }) ? true : false;
601
+ } else {
602
+ return false;
603
+ }
604
+ } catch (error) {
605
+ Log.info(error);
606
+ return undefined;
607
+ }
608
+ };
609
+
610
+ _proto._registerDirtyStateProvider = function _registerDirtyStateProvider(oAppComponent, oInternalModel, sHashTracker) {
611
+ return function fnDirtyStateProvider(oNavigationContext) {
612
+ try {
613
+ if (oNavigationContext === undefined) {
614
+ throw new Error("Invalid input parameters for function fnDirtyStateProvider");
615
+ }
616
+
617
+ var sTargetHash = oNavigationContext.innerAppRoute,
618
+ oRouterProxy = oAppComponent.getRouterProxy();
619
+ var sLclHashTracker = "";
620
+ var bDirty;
621
+ var bSessionON = oInternalModel.getProperty("/sessionOn");
622
+
623
+ if (!bSessionON) {
624
+ // If the sticky session was terminated before hand.
625
+ // Eexample in case of navigating away from application using IBN.
626
+ return undefined;
627
+ }
628
+
629
+ if (!oRouterProxy.isNavigationFinalized()) {
630
+ // If navigation is currently happening in RouterProxy, it's a transient state
631
+ // (not dirty)
632
+ bDirty = false;
633
+ sLclHashTracker = sTargetHash;
634
+ } else if (sHashTracker === sTargetHash) {
635
+ // the hash didn't change so either the user attempts to refresh or to leave the app
636
+ bDirty = true;
637
+ } else if (oRouterProxy.checkHashWithGuard(sTargetHash) || oRouterProxy.isGuardCrossAllowedByUser()) {
638
+ // the user attempts to navigate within the root object
639
+ // or crossing the guard has already been allowed by the RouterProxy
640
+ sLclHashTracker = sTargetHash;
641
+ bDirty = false;
642
+ } else {
643
+ // the user attempts to navigate within the app, for example back to the list report
644
+ bDirty = true;
645
+ }
646
+
647
+ if (bDirty) {
648
+ // the FLP doesn't call the dirty state provider anymore once it's dirty, as they can't
649
+ // change this due to compatibility reasons we set it back to not-dirty
650
+ setTimeout(function () {
651
+ oAppComponent.getShellServices().setDirtyFlag(false);
652
+ }, 0);
653
+ } else {
654
+ sHashTracker = sLclHashTracker;
655
+ }
656
+
657
+ return bDirty;
658
+ } catch (error) {
659
+ Log.info(error);
660
+ return undefined;
661
+ }
662
+ };
663
+ };
664
+
665
+ _proto._attachSessionTimeout = function _attachSessionTimeout(oContext, i18nModel) {
666
+ var that = oContext;
667
+ return function fnHandleSessionTimeout() {
668
+ try {
669
+ if (oContext === undefined) {
670
+ throw new Error("Context missing for function fnHandleSessionTimeout");
671
+ } // remove transient messages since we will showing our own message
672
+
673
+
674
+ that.getMessageHandler().removeTransitionMessages();
675
+ var oDialog = new Dialog({
676
+ title: "{sap.fe.i18n>C_EDITFLOW_OBJECT_PAGE_SESSION_EXPIRED_DIALOG_TITLE}",
677
+ state: "Warning",
678
+ content: new Text({
679
+ text: "{sap.fe.i18n>C_EDITFLOW_OBJECT_PAGE_SESSION_EXPIRED_DIALOG_MESSAGE}"
680
+ }),
681
+ beginButton: new Button({
682
+ text: "{sap.fe.i18n>C_COMMON_DIALOG_OK}",
683
+ type: "Emphasized",
684
+ press: function () {
685
+ // remove sticky handling after navigation since session has already been terminated
686
+ that.handleStickyOff();
687
+ that.getRoutingListener().navigateBackFromContext(oContext);
688
+ }
689
+ }),
690
+ afterClose: function () {
691
+ oDialog.destroy();
692
+ }
693
+ });
694
+ oDialog.addStyleClass("sapUiContentPadding");
695
+ oDialog.setModel(i18nModel, "sap.fe.i18n");
696
+ that.getView().addDependent(oDialog);
697
+ oDialog.open();
698
+ } catch (error) {
699
+ Log.info(error);
700
+ return undefined;
701
+ }
702
+
703
+ return true;
704
+ };
705
+ };
706
+
707
+ _proto._attachRouteMatched = function _attachRouteMatched(oFnContext, oContext, oAppComponent) {
708
+ return function fnStickyDiscardAfterNavigation() {
709
+ var sCurrentHash = oAppComponent.getRouterProxy().getHash(); // either current hash is empty so the user left the app or he navigated away from the object
710
+
711
+ if (!sCurrentHash || !oAppComponent.getRouterProxy().checkHashWithGuard(sCurrentHash)) {
712
+ oFnContext.discardStickySession(oContext);
713
+ }
714
+ };
715
+ };
716
+
717
+ return InternalEditFlow;
718
+ }(ControllerExtension), (_applyDecoratedDescriptor(_class2.prototype, "onInit", [_dec2], Object.getOwnPropertyDescriptor(_class2.prototype, "onInit"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "setCreationMode", [Private, _dec3], Object.getOwnPropertyDescriptor(_class2.prototype, "setCreationMode"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "createMultipleDocuments", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "createMultipleDocuments"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "deleteMultipleDocuments", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "deleteMultipleDocuments"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "computeEditMode", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "computeEditMode"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "setEditMode", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "setEditMode"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "setDraftStatus", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "setDraftStatus"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "getRoutingListener", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "getRoutingListener"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "getGlobalUIModel", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "getGlobalUIModel"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "syncTask", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "syncTask"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "getProgrammingModel", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "getProgrammingModel"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "deleteDocumentTransaction", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "deleteDocumentTransaction"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "handleCreateEvents", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "handleCreateEvents"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "getTransactionHelper", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "getTransactionHelper"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "getInternalModel", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "getInternalModel"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "createActionPromise", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "createActionPromise"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "getCurrentActionPromise", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "getCurrentActionPromise"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "deleteCurrentActionPromise", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "deleteCurrentActionPromise"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "getActionResponseDataAndKeys", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "getActionResponseDataAndKeys"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "getMessageHandler", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "getMessageHandler"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "handleStickyOn", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "handleStickyOn"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "handleStickyOff", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "handleStickyOff"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBackNavigationInSession", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "onBackNavigationInSession"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "discardStickySession", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "discardStickySession"), _class2.prototype)), _class2)) || _class);
719
+ return InternalEditFlow;
720
+ }, false);
721
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkludGVybmFsRWRpdEZsb3cudHMiXSwibmFtZXMiOlsiUHJvZ3JhbW1pbmdNb2RlbCIsIkZFTGlicmFyeSIsIkRyYWZ0U3RhdHVzIiwiRWRpdE1vZGUiLCJDcmVhdGlvbk1vZGUiLCJJbnRlcm5hbEVkaXRGbG93IiwiVUk1Q2xhc3MiLCJDb250cm9sbGVyRXh0ZW5zaW9uTWV0YWRhdGEiLCJPdmVycmlkZSIsIkV4dGVuc2libGUiLCJPdmVycmlkZUV4ZWN1dGlvbiIsIkFmdGVyIiwib25Jbml0IiwiX29BcHBDb21wb25lbnQiLCJiYXNlIiwiZ2V0QXBwQ29tcG9uZW50Iiwic2V0Q3JlYXRpb25Nb2RlIiwiYkNyZWF0aW9uTW9kZSIsImNyZWF0ZU11bHRpcGxlRG9jdW1lbnRzIiwib0xpc3RCaW5kaW5nIiwiYURhdGEiLCJiQ3JlYXRlQXRFbmQiLCJiRnJvbUNvcHlQYXN0ZSIsImJlZm9yZUNyZWF0ZUNhbGxCYWNrIiwidHJhbnNhY3Rpb25IZWxwZXIiLCJnZXRUcmFuc2FjdGlvbkhlbHBlciIsIm9Mb2NrT2JqZWN0IiwiZ2V0R2xvYmFsVUlNb2RlbCIsIm9SZXNvdXJjZUJ1bmRsZSIsImdldFZpZXciLCJnZXRDb250cm9sbGVyIiwiQnVzeUxvY2tlciIsImxvY2siLCJzeW5jVGFzayIsInRoZW4iLCJvbkJlZm9yZUNyZWF0ZVByb21pc2UiLCJjb250ZXh0UGF0aCIsImdldFBhdGgiLCJQcm9taXNlIiwicmVzb2x2ZSIsIm9Nb2RlbCIsImdldE1vZGVsIiwib01ldGFNb2RlbCIsImdldE1ldGFNb2RlbCIsInNNZXRhUGF0aCIsImdldENvbnRleHQiLCJnZXRNZXRhUGF0aCIsImhhbmRsZUNyZWF0ZUV2ZW50cyIsImFDcmVhdGlvblByb21pc2VzIiwibWFwIiwibVByb3BlcnR5VmFsdWVzIiwibVBhcmFtZXRlcnMiLCJkYXRhIiwia2VlcFRyYW5zaWVudENvbnRleHRPbkZhaWxlZCIsImJ1c3lNb2RlIiwiY3JlYXRpb25Nb2RlIiwiQ3JlYXRpb25Sb3ciLCJwYXJlbnRDb250cm9sIiwiY3JlYXRlQXRFbmQiLCJzUHJvcGVydHlQYXRoIiwib1Byb3BlcnR5IiwiZ2V0T2JqZWN0IiwiJGtpbmQiLCJjcmVhdGVEb2N1bWVudCIsImdldE1lc3NhZ2VIYW5kbGVyIiwiYWxsIiwiYUNvbnRleHRzIiwib05ld0NvbnRleHQiLCJjcmVhdGVkIiwib0JpbmRpbmdDb250ZXh0IiwiZ2V0QmluZGluZ0NvbnRleHQiLCJDb21tb25VdGlscyIsImhhc1RyYW5zaWVudENvbnRleHQiLCJnZXRTaWRlRWZmZWN0c1NlcnZpY2UiLCJyZXF1ZXN0U2lkZUVmZmVjdHNGb3JOYXZpZ2F0aW9uUHJvcGVydHkiLCJjYXRjaCIsImVyciIsIkxvZyIsImVycm9yIiwicmVqZWN0IiwiZmluYWxseSIsInVubG9jayIsImRlbGV0ZU11bHRpcGxlRG9jdW1lbnRzIiwib1JvdXRpbmdMaXN0ZW5lciIsImdldFJvdXRpbmdMaXN0ZW5lciIsIm9UYWJsZSIsImJ5SWQiLCJjb250cm9sSWQiLCJpc0EiLCJFcnJvciIsImdldFJvd0JpbmRpbmciLCJiRmluZEFjdGl2ZUNvbnRleHRzIiwiZGVsZXRlRG9jdW1lbnRUcmFuc2FjdGlvbiIsIm9SZXN1bHQiLCJjbGVhclNlbGVjdGlvbiIsImlzUm9vdCIsImF0dGFjaEV2ZW50T25jZSIsInJlZnJlc2giLCJFZGl0U3RhdGUiLCJzZXRFZGl0U3RhdGVEaXJ0eSIsInNlbmQiLCJBY3Rpdml0eSIsIkRlbGV0ZSIsImluZGV4IiwibGVuZ3RoIiwiaXNDdXJyZW50U3RhdGVJbXBhY3RlZEJ5IiwibmF2aWdhdGVCYWNrRnJvbUNvbnRleHQiLCJvRXJyb3IiLCJjb21wdXRlRWRpdE1vZGUiLCJvQ29udGV4dCIsInNDdXN0b21BY3Rpb24iLCJnZXRJbnRlcm5hbE1vZGVsIiwiZ2V0UHJvcGVydHkiLCJzUHJvZ3JhbW1pbmdNb2RlbCIsImdldFByb2dyYW1taW5nTW9kZWwiLCJEcmFmdCIsInNldERyYWZ0U3RhdHVzIiwiQ2xlYXIiLCJyZXF1ZXN0T2JqZWN0IiwiYklzQWN0aXZlRW50aXR5Iiwic2V0RWRpdE1vZGUiLCJFZGl0YWJsZSIsImJIYXNBY3RpdmVFbnRpdHkiLCJ1bmRlZmluZWQiLCJEaXNwbGF5IiwiU3RpY2t5IiwiX2hhc05ld0FjdGlvbkZvclN0aWNreSIsIl9iQ3JlYXRlTW9kZSIsImhhbmRsZURvY3VtZW50TW9kaWZpY2F0aW9ucyIsImhhbmRsZVN0aWNreU9uIiwic2V0UHJvcGVydHkiLCJzRWRpdE1vZGUiLCJvR2xvYmFsTW9kZWwiLCJzRHJhZnRTdGF0ZSIsIl9yb3V0aW5nIiwidlRhc2siLCJmbk5ld1Rhc2siLCJfcFRhc2tzIiwiaW50ZXJuYWxNb2RlbENvbnRleHQiLCJzYXAiLCJ1aSIsImdldENvcmUiLCJkZWxldGVEb2N1bWVudCIsImJpbmQiLCJvQmluZGluZyIsImdldEJpbmRpbmciLCJhdHRhY2hFdmVudCIsIlNhdmluZyIsIm9FdmVudCIsImJTdWNjZXNzIiwiZ2V0UGFyYW1ldGVyIiwiU2F2ZWQiLCJzaG93TWVzc2FnZURpYWxvZyIsIl9vVHJhbnNhY3Rpb25IZWxwZXIiLCJUcmFuc2FjdGlvbkhlbHBlciIsImNyZWF0ZUFjdGlvblByb21pc2UiLCJzQWN0aW9uTmFtZSIsInNDb250cm9sSWQiLCJmUmVzb2x2ZXIiLCJmUmVqZWN0b3IiLCJvQWN0aW9uUHJvbWlzZSIsIm9SZXNwb25zZSIsIk9iamVjdCIsImFzc2lnbiIsImdldEFjdGlvblJlc3BvbnNlRGF0YUFuZEtleXMiLCJnZXRDdXJyZW50QWN0aW9uUHJvbWlzZSIsImRlbGV0ZUN1cnJlbnRBY3Rpb25Qcm9taXNlIiwiQXJyYXkiLCJpc0FycmF5Iiwib1ZpZXciLCJnZXREYXRhIiwic0FjdGlvblJldHVyblR5cGUiLCIkUmV0dXJuVHlwZSIsIiRUeXBlIiwiYUtleSIsIiRLZXkiLCJvRGF0YSIsImtleXMiLCJtZXNzYWdlSGFuZGxlciIsIm9BcHBDb21wb25lbnQiLCJnZXRSb3V0ZXJQcm94eSIsImhhc05hdmlnYXRpb25HdWFyZCIsInNIYXNoVHJhY2tlciIsImdldEhhc2giLCJvSW50ZXJuYWxNb2RlbCIsInNldFRpbWVvdXQiLCJzZXROYXZpZ2F0aW9uR3VhcmQiLCJnZXRTaGVsbFNlcnZpY2VzIiwic2V0QmFja05hdmlnYXRpb24iLCJvbkJhY2tOYXZpZ2F0aW9uSW5TZXNzaW9uIiwiZm5EaXJ0eVN0YXRlUHJvdmlkZXIiLCJfcmVnaXN0ZXJEaXJ0eVN0YXRlUHJvdmlkZXIiLCJyZWdpc3RlckRpcnR5U3RhdGVQcm92aWRlciIsImkxOG5Nb2RlbCIsImZuSGFuZGxlU2Vzc2lvblRpbWVvdXQiLCJfYXR0YWNoU2Vzc2lvblRpbWVvdXQiLCJhdHRhY2hTZXNzaW9uVGltZW91dCIsImZuU3RpY2t5RGlzY2FyZEFmdGVyTmF2aWdhdGlvbiIsIl9hdHRhY2hSb3V0ZU1hdGNoZWQiLCJnZXRSb3V0aW5nU2VydmljZSIsImF0dGFjaFJvdXRlTWF0Y2hlZCIsImluZm8iLCJoYW5kbGVTdGlja3lPZmYiLCJkaXNjYXJkTmF2aWdhdGlvbkd1YXJkIiwiZGVyZWdpc3RlckRpcnR5U3RhdGVQcm92aWRlciIsImRldGFjaFNlc3Npb25UaW1lb3V0IiwiZGV0YWNoUm91dGVNYXRjaGVkIiwib1JvdXRlclByb3h5IiwiY2hlY2tJZkJhY2tJc091dE9mR3VhcmQiLCJwcm9jZXNzRGF0YUxvc3NDb25maXJtYXRpb24iLCJkaXNjYXJkU3RpY2t5U2Vzc2lvbiIsImhpc3RvcnkiLCJiYWNrIiwic3RpY2t5IiwiZGlzY2FyZERvY3VtZW50Iiwic3Vic3RyaW5nIiwiaW5kZXhPZiIsIm9TdGlja3lTZXNzaW9uIiwiTmV3QWN0aW9uIiwiQWRkaXRpb25hbE5ld0FjdGlvbnMiLCJmaW5kIiwic0FkZGl0aW9uYWxBY3Rpb24iLCJvTmF2aWdhdGlvbkNvbnRleHQiLCJzVGFyZ2V0SGFzaCIsImlubmVyQXBwUm91dGUiLCJzTGNsSGFzaFRyYWNrZXIiLCJiRGlydHkiLCJiU2Vzc2lvbk9OIiwiaXNOYXZpZ2F0aW9uRmluYWxpemVkIiwiY2hlY2tIYXNoV2l0aEd1YXJkIiwiaXNHdWFyZENyb3NzQWxsb3dlZEJ5VXNlciIsInNldERpcnR5RmxhZyIsInRoYXQiLCJyZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMiLCJvRGlhbG9nIiwiRGlhbG9nIiwidGl0bGUiLCJzdGF0ZSIsImNvbnRlbnQiLCJUZXh0IiwidGV4dCIsImJlZ2luQnV0dG9uIiwiQnV0dG9uIiwidHlwZSIsInByZXNzIiwiYWZ0ZXJDbG9zZSIsImRlc3Ryb3kiLCJhZGRTdHlsZUNsYXNzIiwic2V0TW9kZWwiLCJhZGREZXBlbmRlbnQiLCJvcGVuIiwib0ZuQ29udGV4dCIsInNDdXJyZW50SGFzaCIsIkNvbnRyb2xsZXJFeHRlbnNpb24iLCJQcml2YXRlIiwiUHVibGljIiwiRmluYWwiXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXNCQSxNQUFNQSxnQkFBZ0IsR0FBR0MsU0FBUyxDQUFDRCxnQkFBbkM7QUFBQSxNQUNDRSxXQUFXLEdBQUdELFNBQVMsQ0FBQ0MsV0FEekI7QUFBQSxNQUVDQyxRQUFRLEdBQUdGLFNBQVMsQ0FBQ0UsUUFGdEI7QUFBQSxNQUdDQyxZQUFZLEdBQUdILFNBQVMsQ0FBQ0csWUFIMUI7TUFNTUMsZ0IsV0FETEMsUUFBUSxDQUFDLG1EQUFELEVBQXNEQywyQkFBdEQsQyxVQVVQQyxRQUFRLEUsVUFjUkMsVUFBVSxDQUFDQyxpQkFBaUIsQ0FBQ0MsS0FBbkIsQzs7Ozs7Ozs7O1dBYlhDLE0sR0FEQSxrQkFDUztBQUNSLFdBQUtDLGNBQUwsR0FBc0IsS0FBS0MsSUFBTCxDQUFVQyxlQUFWLEVBQXRCO0FBQ0E7QUFFRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7WUFHQztBQUNBQyxJQUFBQSxlLEdBSEEseUJBR2dCQyxhQUhoQixFQUd3QyxDQUN2QztBQUNBLEs7O1dBR0RDLHVCLEdBRkEsaUNBRXdCQyxZQUZ4QixFQUUyQ0MsS0FGM0MsRUFFdURDLFlBRnZELEVBRTBFQyxjQUYxRSxFQUUrRkMsb0JBRi9GLEVBRTBIO0FBQUE7O0FBQ3pILFVBQU1DLGlC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TSxFQUNBQyxLLDBKQWtCQUQsTSxFQUNBQyxLLGlLQU9BRCxNLEVBQ0FDLEssbUtBWUFELE0sRUFDQUMsSyx5SkFxQkFELE0sRUFDQUMsSyw0SkFxQkFELE0sRUFDQUMsSyw2S0FLQUQsTSxFQUNBQyxLLDRLQWtDQUQsTSxFQUNBQyxLLHVLQXdCQUQsTSxFQUNBQyxLLHFLQVVBRCxNLEVBQ0FDLEssb0tBY0FELE0sRUFDQUMsSywyS0FxQkFELE0sRUFDQUMsSyxrTEFLQUQsTSxFQUNBQyxLLHVMQWFBRCxNLEVBQ0FDLEssOEtBMEJBRCxNLEVBQ0FDLEssZ0tBWUFELE0sRUFDQUMsSyw4SkF5Q0FELE0sRUFDQUMsSyx5S0FnREFELE0sRUFDQUMsSyw4S0F1QkFELE0sRUFDQUMsSztTQTRJYTNQLGdCIiwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgQ29udHJvbGxlckV4dGVuc2lvbiBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL0NvbnRyb2xsZXJFeHRlbnNpb25cIjtcbmltcG9ydCBPdmVycmlkZUV4ZWN1dGlvbiBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL092ZXJyaWRlRXhlY3V0aW9uXCI7XG5pbXBvcnQgVHJhbnNhY3Rpb25IZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL1RyYW5zYWN0aW9uSGVscGVyXCI7XG5pbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCBDb21tb25VdGlscyBmcm9tIFwic2FwL2ZlL2NvcmUvQ29tbW9uVXRpbHNcIjtcbmltcG9ydCBCdXN5TG9ja2VyIGZyb20gXCJzYXAvZmUvY29yZS9CdXN5TG9ja2VyXCI7XG5pbXBvcnQgRkVMaWJyYXJ5IGZyb20gXCJzYXAvZmUvY29yZS9saWJyYXJ5XCI7XG5pbXBvcnQgRWRpdFN0YXRlIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0VkaXRTdGF0ZVwiO1xuaW1wb3J0IHsgRXh0ZW5zaWJsZSwgRmluYWwsIE92ZXJyaWRlLCBQcml2YXRlLCBQdWJsaWMsIFVJNUNsYXNzIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvQ2xhc3NTdXBwb3J0XCI7XG5pbXBvcnQgQ29udHJvbGxlckV4dGVuc2lvbk1ldGFkYXRhIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9Db250cm9sbGVyRXh0ZW5zaW9uTWV0YWRhdGFcIjtcbmltcG9ydCBBcHBDb21wb25lbnQgZnJvbSBcInNhcC9mZS9jb3JlL0FwcENvbXBvbmVudFwiO1xuaW1wb3J0IFBhZ2VDb250cm9sbGVyIGZyb20gXCJzYXAvZmUvY29yZS9QYWdlQ29udHJvbGxlclwiO1xuaW1wb3J0IEpTT05Nb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL2pzb24vSlNPTk1vZGVsXCI7XG5pbXBvcnQgVGFibGUgZnJvbSBcInNhcC91aS9tZGMvVGFibGVcIjtcbmltcG9ydCBEaWFsb2cgZnJvbSBcInNhcC9tL0RpYWxvZ1wiO1xuaW1wb3J0IEJ1dHRvbiBmcm9tIFwic2FwL20vQnV0dG9uXCI7XG5pbXBvcnQgVGV4dCBmcm9tIFwic2FwL20vVGV4dFwiO1xuaW1wb3J0IE1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvTW9kZWxcIjtcbmltcG9ydCBzdGlja3kgZnJvbSBcInNhcC9mZS9jb3JlL2FjdGlvbnMvc3RpY2t5XCI7XG5pbXBvcnQgVmlldyBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL1ZpZXdcIjtcbmltcG9ydCB7IHNlbmQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvYWN0aW9ucy9jb2xsYWJvcmF0aW9uL0FjdGl2aXR5U3luY1wiO1xuaW1wb3J0IHsgQWN0aXZpdHkgfSBmcm9tIFwic2FwL2ZlL2NvcmUvYWN0aW9ucy9jb2xsYWJvcmF0aW9uL0NvbGxhYm9yYXRpb25Db21tb25cIjtcbmltcG9ydCBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQ29udGV4dFwiO1xuXG5jb25zdCBQcm9ncmFtbWluZ01vZGVsID0gRkVMaWJyYXJ5LlByb2dyYW1taW5nTW9kZWwsXG5cdERyYWZ0U3RhdHVzID0gRkVMaWJyYXJ5LkRyYWZ0U3RhdHVzLFxuXHRFZGl0TW9kZSA9IEZFTGlicmFyeS5FZGl0TW9kZSxcblx0Q3JlYXRpb25Nb2RlID0gRkVMaWJyYXJ5LkNyZWF0aW9uTW9kZTtcblxuQFVJNUNsYXNzKFwic2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuSW50ZXJuYWxFZGl0Rmxvd1wiLCBDb250cm9sbGVyRXh0ZW5zaW9uTWV0YWRhdGEpXG5jbGFzcyBJbnRlcm5hbEVkaXRGbG93IGV4dGVuZHMgQ29udHJvbGxlckV4dGVuc2lvbiB7XG5cdHByaXZhdGUgYmFzZSE6IFBhZ2VDb250cm9sbGVyO1xuXHRwcml2YXRlIF9vQXBwQ29tcG9uZW50ITogQXBwQ29tcG9uZW50O1xuXHRwcml2YXRlIF9wVGFza3M6IGFueTtcblx0cHJpdmF0ZSBvQWN0aW9uUHJvbWlzZT86IFByb21pc2U8YW55Pjtcblx0cHJpdmF0ZSBfb1RyYW5zYWN0aW9uSGVscGVyPzogVHJhbnNhY3Rpb25IZWxwZXI7XG5cdHByaXZhdGUgZm5EaXJ0eVN0YXRlUHJvdmlkZXI/OiBGdW5jdGlvbjtcblx0cHJpdmF0ZSBmbkhhbmRsZVNlc3Npb25UaW1lb3V0PzogRnVuY3Rpb247XG5cdHByaXZhdGUgZm5TdGlja3lEaXNjYXJkQWZ0ZXJOYXZpZ2F0aW9uPzogRnVuY3Rpb247XG5cdEBPdmVycmlkZSgpXG5cdG9uSW5pdCgpIHtcblx0XHR0aGlzLl9vQXBwQ29tcG9uZW50ID0gdGhpcy5iYXNlLmdldEFwcENvbXBvbmVudCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIE92ZXJyaWRlIHRvIHNldCB0aGUgY3JlYXRpb24gbW9kZS5cblx0ICpcblx0ICogQHBhcmFtIGJDcmVhdGlvbk1vZGVcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkludGVybmFsRWRpdEZsb3dcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkludGVybmFsRWRpdEZsb3cjc2V0Q3JlYXRpb25Nb2RlXG5cdCAqIEBzaW5jZSAxLjkwLjBcblx0ICovXG5cdEBQcml2YXRlXG5cdEBFeHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5cdHNldENyZWF0aW9uTW9kZShiQ3JlYXRpb25Nb2RlOiBib29sZWFuKSB7XG5cdFx0Ly8gdG8gYmUgb3ZlcnJpZGRlblxuXHR9XG5cdEBQdWJsaWNcblx0QEZpbmFsXG5cdGNyZWF0ZU11bHRpcGxlRG9jdW1lbnRzKG9MaXN0QmluZGluZzogYW55LCBhRGF0YTogYW55LCBiQ3JlYXRlQXRFbmQ6IGFueSwgYkZyb21Db3B5UGFzdGU6IGFueSwgYmVmb3JlQ3JlYXRlQ2FsbEJhY2s6IGFueSkge1xuXHRcdGNvbnN0IHRyYW5zYWN0aW9uSGVscGVyID0gdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpLFxuXHRcdFx0b0xvY2tPYmplY3QgPSB0aGlzLmdldEdsb2JhbFVJTW9kZWwoKSxcblx0XHRcdG9SZXNvdXJjZUJ1bmRsZSA9ICh0aGlzLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgYW55KS5vUmVzb3VyY2VCdW5kbGU7XG5cblx0XHRCdXN5TG9ja2VyLmxvY2sob0xvY2tPYmplY3QpO1xuXHRcdHJldHVybiB0aGlzLnN5bmNUYXNrKClcblx0XHRcdC50aGVuKGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRjb25zdCBvbkJlZm9yZUNyZWF0ZVByb21pc2UgPSBiZWZvcmVDcmVhdGVDYWxsQmFja1xuXHRcdFx0XHRcdD8gYmVmb3JlQ3JlYXRlQ2FsbEJhY2soeyBjb250ZXh0UGF0aDogb0xpc3RCaW5kaW5nICYmIG9MaXN0QmluZGluZy5nZXRQYXRoKCkgfSlcblx0XHRcdFx0XHQ6IFByb21pc2UucmVzb2x2ZSgpO1xuXHRcdFx0XHRyZXR1cm4gb25CZWZvcmVDcmVhdGVQcm9taXNlO1xuXHRcdFx0fSlcblx0XHRcdC50aGVuKCgpID0+IHtcblx0XHRcdFx0Y29uc3Qgb01vZGVsID0gb0xpc3RCaW5kaW5nLmdldE1vZGVsKCksXG5cdFx0XHRcdFx0b01ldGFNb2RlbCA9IG9Nb2RlbC5nZXRNZXRhTW9kZWwoKTtcblx0XHRcdFx0bGV0IHNNZXRhUGF0aDogc3RyaW5nO1xuXG5cdFx0XHRcdGlmIChvTGlzdEJpbmRpbmcuZ2V0Q29udGV4dCgpKSB7XG5cdFx0XHRcdFx0c01ldGFQYXRoID0gb01ldGFNb2RlbC5nZXRNZXRhUGF0aChvTGlzdEJpbmRpbmcuZ2V0Q29udGV4dCgpLmdldFBhdGgoKSArIFwiL1wiICsgb0xpc3RCaW5kaW5nLmdldFBhdGgoKSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0c01ldGFQYXRoID0gb01ldGFNb2RlbC5nZXRNZXRhUGF0aChvTGlzdEJpbmRpbmcuZ2V0UGF0aCgpKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRoaXMuaGFuZGxlQ3JlYXRlRXZlbnRzKG9MaXN0QmluZGluZyk7XG5cblx0XHRcdFx0Ly8gSXRlcmF0ZSBvbiBhbGwgaXRlbXMgYW5kIHN0b3JlIHRoZSBjb3JyZXNwb25kaW5nIGNyZWF0aW9uIHByb21pc2Vcblx0XHRcdFx0Y29uc3QgYUNyZWF0aW9uUHJvbWlzZXMgPSBhRGF0YS5tYXAoKG1Qcm9wZXJ0eVZhbHVlczogYW55KSA9PiB7XG5cdFx0XHRcdFx0Y29uc3QgbVBhcmFtZXRlcnM6IGFueSA9IHsgZGF0YToge30gfTtcblxuXHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmtlZXBUcmFuc2llbnRDb250ZXh0T25GYWlsZWQgPSBmYWxzZTsgLy8gY3VycmVudGx5IG5vdCBmdWxseSBzdXBwb3J0ZWRcblx0XHRcdFx0XHRtUGFyYW1ldGVycy5idXN5TW9kZSA9IFwiTm9uZVwiO1xuXHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSA9IENyZWF0aW9uTW9kZS5DcmVhdGlvblJvdztcblx0XHRcdFx0XHRtUGFyYW1ldGVycy5wYXJlbnRDb250cm9sID0gdGhpcy5nZXRWaWV3KCk7XG5cdFx0XHRcdFx0bVBhcmFtZXRlcnMuY3JlYXRlQXRFbmQgPSBiQ3JlYXRlQXRFbmQ7XG5cblx0XHRcdFx0XHQvLyBSZW1vdmUgbmF2aWdhdGlvbiBwcm9wZXJ0aWVzIGFzIHdlIGRvbid0IHN1cHBvcnQgZGVlcCBjcmVhdGVcblx0XHRcdFx0XHRmb3IgKGNvbnN0IHNQcm9wZXJ0eVBhdGggaW4gbVByb3BlcnR5VmFsdWVzKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBvUHJvcGVydHkgPSBvTWV0YU1vZGVsLmdldE9iamVjdChzTWV0YVBhdGggKyBcIi9cIiArIHNQcm9wZXJ0eVBhdGgpO1xuXHRcdFx0XHRcdFx0aWYgKG9Qcm9wZXJ0eSAmJiBvUHJvcGVydHkuJGtpbmQgIT09IFwiTmF2aWdhdGlvblByb3BlcnR5XCIgJiYgbVByb3BlcnR5VmFsdWVzW3NQcm9wZXJ0eVBhdGhdKSB7XG5cdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmRhdGFbc1Byb3BlcnR5UGF0aF0gPSBtUHJvcGVydHlWYWx1ZXNbc1Byb3BlcnR5UGF0aF07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0cmV0dXJuIHRyYW5zYWN0aW9uSGVscGVyLmNyZWF0ZURvY3VtZW50KFxuXHRcdFx0XHRcdFx0b0xpc3RCaW5kaW5nLFxuXHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMsXG5cdFx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGUsXG5cdFx0XHRcdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCksXG5cdFx0XHRcdFx0XHRiRnJvbUNvcHlQYXN0ZSxcblx0XHRcdFx0XHRcdHRoaXMuZ2V0VmlldygpXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0cmV0dXJuIFByb21pc2UuYWxsKGFDcmVhdGlvblByb21pc2VzKTtcblx0XHRcdH0pXG5cdFx0XHQudGhlbihmdW5jdGlvbihhQ29udGV4dHM6IGFueSkge1xuXHRcdFx0XHQvLyB0cmFuc2llbnQgY29udGV4dHMgYXJlIHJlbGlhYmx5IHJlbW92ZWQgb25jZSBvTmV3Q29udGV4dC5jcmVhdGVkKCkgaXMgcmVzb2x2ZWRcblx0XHRcdFx0cmV0dXJuIFByb21pc2UuYWxsKFxuXHRcdFx0XHRcdGFDb250ZXh0cy5tYXAoZnVuY3Rpb24ob05ld0NvbnRleHQ6IGFueSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIG9OZXdDb250ZXh0LmNyZWF0ZWQoKTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHQpO1xuXHRcdFx0fSlcblx0XHRcdC50aGVuKCgpID0+IHtcblx0XHRcdFx0Y29uc3Qgb0JpbmRpbmdDb250ZXh0ID0gdGhpcy5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoKTtcblxuXHRcdFx0XHQvLyBpZiB0aGVyZSBhcmUgdHJhbnNpZW50IGNvbnRleHRzLCB3ZSBtdXN0IGF2b2lkIHJlcXVlc3Rpbmcgc2lkZSBlZmZlY3RzXG5cdFx0XHRcdC8vIHRoaXMgaXMgYXZvaWQgYSBwb3RlbnRpYWwgbGlzdCByZWZyZXNoLCB0aGVyZSBjb3VsZCBiZSBhIHNpZGUgZWZmZWN0IHRoYXQgcmVmcmVzaGVzIHRoZSBsaXN0IGJpbmRpbmdcblx0XHRcdFx0Ly8gaWYgbGlzdCBiaW5kaW5nIGlzIHJlZnJlc2hlZCwgdHJhbnNpZW50IGNvbnRleHRzIG1pZ2h0IGJlIGxvc3Rcblx0XHRcdFx0aWYgKCFDb21tb25VdGlscy5oYXNUcmFuc2llbnRDb250ZXh0KG9MaXN0QmluZGluZykpIHtcblx0XHRcdFx0XHR0aGlzLl9vQXBwQ29tcG9uZW50XG5cdFx0XHRcdFx0XHQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKClcblx0XHRcdFx0XHRcdC5yZXF1ZXN0U2lkZUVmZmVjdHNGb3JOYXZpZ2F0aW9uUHJvcGVydHkob0xpc3RCaW5kaW5nLmdldFBhdGgoKSwgb0JpbmRpbmdDb250ZXh0IGFzIENvbnRleHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uKGVycjogYW55KSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGNyZWF0aW5nIG11bHRpcGxlIGRvY3VtZW50cy5cIik7XG5cdFx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChlcnIpO1xuXHRcdFx0fSlcblx0XHRcdC5maW5hbGx5KGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRCdXN5TG9ja2VyLnVubG9jayhvTG9ja09iamVjdCk7XG5cdFx0XHR9KTtcblx0fVxuXHRAUHVibGljXG5cdEBGaW5hbFxuXHRkZWxldGVNdWx0aXBsZURvY3VtZW50cyhhQ29udGV4dHM6IGFueSwgbVBhcmFtZXRlcnM6IGFueSkge1xuXHRcdGNvbnN0IG9Sb3V0aW5nTGlzdGVuZXIgPSB0aGlzLmdldFJvdXRpbmdMaXN0ZW5lcigpLFxuXHRcdFx0b0xvY2tPYmplY3QgPSB0aGlzLmdldEdsb2JhbFVJTW9kZWwoKTtcblx0XHRjb25zdCBvVGFibGUgPSB0aGlzLmdldFZpZXcoKS5ieUlkKG1QYXJhbWV0ZXJzLmNvbnRyb2xJZCkgYXMgVGFibGU7XG5cdFx0aWYgKCFvVGFibGUgfHwgIW9UYWJsZS5pc0EoXCJzYXAudWkubWRjLlRhYmxlXCIpKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJwYXJhbWV0ZXIgY29udHJvbElkIG1pc3Npbmcgb3IgaW5jb3JyZWN0XCIpO1xuXHRcdH1cblx0XHRjb25zdCBvTGlzdEJpbmRpbmcgPSBvVGFibGUuZ2V0Um93QmluZGluZygpIGFzIGFueTtcblx0XHRtUGFyYW1ldGVycy5iRmluZEFjdGl2ZUNvbnRleHRzID0gdHJ1ZTtcblx0XHRCdXN5TG9ja2VyLmxvY2sob0xvY2tPYmplY3QpO1xuXHRcdHJldHVybiB0aGlzLmRlbGV0ZURvY3VtZW50VHJhbnNhY3Rpb24oYUNvbnRleHRzLCBtUGFyYW1ldGVycylcblx0XHRcdC50aGVuKCgpID0+IHtcblx0XHRcdFx0bGV0IG9SZXN1bHQ7XG5cblx0XHRcdFx0Ly8gTXVsdGlwbGUgb2JqZWN0IGRlbGV0aW9uIGlzIHRyaWdnZXJlZCBmcm9tIGEgbGlzdFxuXHRcdFx0XHQvLyBGaXJzdCBjbGVhciB0aGUgc2VsZWN0aW9uIGluIHRoZSB0YWJsZSBhcyBpdCdzIG5vdCB2YWxpZCBhbnkgbW9yZVxuXHRcdFx0XHQob1RhYmxlIGFzIGFueSkuY2xlYXJTZWxlY3Rpb24oKTtcblxuXHRcdFx0XHQvLyBUaGVuIHJlZnJlc2ggdGhlIGxpc3QtYmluZGluZyAoTFIpLCBvciByZXF1aXJlIHNpZGUtZWZmZWN0cyAoT1ApXG5cdFx0XHRcdGNvbnN0IG9CaW5kaW5nQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0XHRcdGlmIChvTGlzdEJpbmRpbmcuaXNSb290KCkpIHtcblx0XHRcdFx0XHQvLyBrZWVwIHByb21pc2UgY2hhaW4gcGVuZGluZyB1bnRpbCByZWZyZXNoIG9mIGxpc3RiaW5kaW5nIGlzIGNvbXBsZXRlZFxuXHRcdFx0XHRcdG9SZXN1bHQgPSBuZXcgUHJvbWlzZTx2b2lkPihyZXNvbHZlID0+IHtcblx0XHRcdFx0XHRcdG9MaXN0QmluZGluZy5hdHRhY2hFdmVudE9uY2UoXCJkYXRhUmVjZWl2ZWRcIiwgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdHJlc29sdmUoKTtcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdG9MaXN0QmluZGluZy5yZWZyZXNoKCk7XG5cdFx0XHRcdH0gZWxzZSBpZiAob0JpbmRpbmdDb250ZXh0KSB7XG5cdFx0XHRcdFx0Ly8gaWYgdGhlcmUgYXJlIHRyYW5zaWVudCBjb250ZXh0cywgd2UgbXVzdCBhdm9pZCByZXF1ZXN0aW5nIHNpZGUgZWZmZWN0c1xuXHRcdFx0XHRcdC8vIHRoaXMgaXMgYXZvaWQgYSBwb3RlbnRpYWwgbGlzdCByZWZyZXNoLCB0aGVyZSBjb3VsZCBiZSBhIHNpZGUgZWZmZWN0IHRoYXQgcmVmcmVzaGVzIHRoZSBsaXN0IGJpbmRpbmdcblx0XHRcdFx0XHQvLyBpZiBsaXN0IGJpbmRpbmcgaXMgcmVmcmVzaGVkLCB0cmFuc2llbnQgY29udGV4dHMgbWlnaHQgYmUgbG9zdFxuXHRcdFx0XHRcdGlmICghQ29tbW9uVXRpbHMuaGFzVHJhbnNpZW50Q29udGV4dChvTGlzdEJpbmRpbmcpKSB7XG5cdFx0XHRcdFx0XHR0aGlzLl9vQXBwQ29tcG9uZW50XG5cdFx0XHRcdFx0XHRcdC5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKVxuXHRcdFx0XHRcdFx0XHQucmVxdWVzdFNpZGVFZmZlY3RzRm9yTmF2aWdhdGlvblByb3BlcnR5KG9MaXN0QmluZGluZy5nZXRQYXRoKCksIG9CaW5kaW5nQ29udGV4dCBhcyBDb250ZXh0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBkZWxldGluZyBhdCBsZWFzdCBvbmUgb2JqZWN0IHNob3VsZCBhbHNvIHNldCB0aGUgVUkgdG8gZGlydHlcblx0XHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cblx0XHRcdFx0c2VuZCh0aGlzLmdldFZpZXcoKSwgQWN0aXZpdHkuRGVsZXRlLCBhQ29udGV4dHMpO1xuXG5cdFx0XHRcdC8vIEZpbmFsbHksIGNoZWNrIGlmIHRoZSBjdXJyZW50IHN0YXRlIGNhbiBiZSBpbXBhY3RlZCBieSB0aGUgZGVsZXRpb24sIGkuZS4gaWYgdGhlcmUnc1xuXHRcdFx0XHQvLyBhbiBPUCBkaXNwbGF5aW5nIGEgZGVsZXRlZCBvYmplY3QuIElmIHllcyBuYXZpZ2F0ZSBiYWNrIHRvIGRpc21pc3MgdGhlIE9QXG5cdFx0XHRcdGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBhQ29udGV4dHMubGVuZ3RoOyBpbmRleCsrKSB7XG5cdFx0XHRcdFx0aWYgKG9Sb3V0aW5nTGlzdGVuZXIuaXNDdXJyZW50U3RhdGVJbXBhY3RlZEJ5KGFDb250ZXh0c1tpbmRleF0pKSB7XG5cdFx0XHRcdFx0XHRvUm91dGluZ0xpc3RlbmVyLm5hdmlnYXRlQmFja0Zyb21Db250ZXh0KGFDb250ZXh0c1tpbmRleF0pO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIG9SZXN1bHQ7XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGRlbGV0aW5nIHRoZSBkb2N1bWVudChzKVwiLCBvRXJyb3IpO1xuXHRcdFx0fSlcblx0XHRcdC5maW5hbGx5KGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRCdXN5TG9ja2VyLnVubG9jayhvTG9ja09iamVjdCk7XG5cdFx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBEZWNpZGVzIGlmIGEgZG9jdW1lbnQgaXMgdG8gYmUgc2hvd24gaW4gZGlzcGxheSBvciBlZGl0IG1vZGUuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBfY29tcHV0ZUVkaXRNb2RlXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5JbnRlcm5hbEVkaXRGbG93XG5cdCAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9Db250ZXh0IFRoZSBjb250ZXh0IHRvIGJlIGRpc3BsYXllZCBvciBlZGl0ZWRcblx0ICogQHJldHVybnMge1Byb21pc2V9IFByb21pc2UgcmVzb2x2ZXMgb25jZSB0aGUgZWRpdCBtb2RlIGlzIGNvbXB1dGVkXG5cdCAqL1xuXG5cdEBQdWJsaWNcblx0QEZpbmFsXG5cdGNvbXB1dGVFZGl0TW9kZShvQ29udGV4dDogYW55KSB7XG5cdFx0Y29uc3Qgc0N1c3RvbUFjdGlvbiA9IHRoaXMuZ2V0SW50ZXJuYWxNb2RlbCgpLmdldFByb3BlcnR5KFwiL3NDdXN0b21BY3Rpb25cIik7XG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZShcblx0XHRcdCgoKSA9PiB7XG5cdFx0XHRcdGNvbnN0IHNQcm9ncmFtbWluZ01vZGVsID0gdGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKG9Db250ZXh0KTtcblxuXHRcdFx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQpIHtcblx0XHRcdFx0XHR0aGlzLnNldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLkNsZWFyKTtcblxuXHRcdFx0XHRcdHJldHVybiBvQ29udGV4dFxuXHRcdFx0XHRcdFx0LnJlcXVlc3RPYmplY3QoXCJJc0FjdGl2ZUVudGl0eVwiKVxuXHRcdFx0XHRcdFx0LnRoZW4oKGJJc0FjdGl2ZUVudGl0eTogYW55KSA9PiB7XG5cdFx0XHRcdFx0XHRcdGlmIChiSXNBY3RpdmVFbnRpdHkgPT09IGZhbHNlKSB7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gaW4gY2FzZSB0aGUgZG9jdW1lbnQgaXMgZHJhZnQgc2V0IGl0IGluIGVkaXQgbW9kZVxuXHRcdFx0XHRcdFx0XHRcdHRoaXMuc2V0RWRpdE1vZGUoRWRpdE1vZGUuRWRpdGFibGUpO1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBvQ29udGV4dC5yZXF1ZXN0T2JqZWN0KFwiSGFzQWN0aXZlRW50aXR5XCIpLnRoZW4oKGJIYXNBY3RpdmVFbnRpdHk6IGFueSkgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdFx0dGhpcy5zZXRFZGl0TW9kZSh1bmRlZmluZWQsICFiSGFzQWN0aXZlRW50aXR5KTtcblx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHQvLyBhY3RpdmUgZG9jdW1lbnQsIHN0YXkgb24gZGlzcGxheSBtb2RlXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5zZXRFZGl0TW9kZShFZGl0TW9kZS5EaXNwbGF5LCBmYWxzZSk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24ob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgZGV0ZXJtaW5pbmcgdGhlIGVkaXRNb2RlIGZvciBkcmFmdFwiLCBvRXJyb3IpO1xuXHRcdFx0XHRcdFx0XHR0aHJvdyBvRXJyb3I7XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSBlbHNlIGlmIChzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kpIHtcblx0XHRcdFx0XHRpZiAoc0N1c3RvbUFjdGlvbiAmJiBzQ3VzdG9tQWN0aW9uICE9PSBcIlwiICYmIHRoaXMuX2hhc05ld0FjdGlvbkZvclN0aWNreShvQ29udGV4dCwgdGhpcy5nZXRWaWV3KCksIHNDdXN0b21BY3Rpb24pKSB7XG5cdFx0XHRcdFx0XHR0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCkuX2JDcmVhdGVNb2RlID0gdHJ1ZTtcblx0XHRcdFx0XHRcdHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKS5oYW5kbGVEb2N1bWVudE1vZGlmaWNhdGlvbnMoKTtcblx0XHRcdFx0XHRcdHRoaXMuc2V0RWRpdE1vZGUoRWRpdE1vZGUuRWRpdGFibGUsIHRydWUpO1xuXHRcdFx0XHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cdFx0XHRcdFx0XHR0aGlzLmhhbmRsZVN0aWNreU9uKG9Db250ZXh0KTtcblx0XHRcdFx0XHRcdHRoaXMuZ2V0SW50ZXJuYWxNb2RlbCgpLnNldFByb3BlcnR5KFwiL3NDdXN0b21BY3Rpb25cIiwgXCJcIik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9KSgpXG5cdFx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBlZGl0IG1vZGUuXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzRWRpdE1vZGVcblx0ICogQHBhcmFtIHtib29sZWFufSBiQ3JlYXRpb25Nb2RlIENyZWF0ZU1vZGUgZmxhZyB0byBpZGVudGlmeSB0aGUgY3JlYXRpb24gbW9kZVxuXHQgKi9cblx0QFB1YmxpY1xuXHRARmluYWxcblx0c2V0RWRpdE1vZGUoc0VkaXRNb2RlPzogc3RyaW5nLCBiQ3JlYXRpb25Nb2RlOiBib29sZWFuID0gZmFsc2UpIHtcblx0XHQvLyBhdCB0aGlzIHBvaW50IG9mIHRpbWUgaXQncyBub3QgbWVhbnQgdG8gcmVsZWFzZSB0aGUgZWRpdCBmbG93IGZvciBmcmVlc3R5bGUgdXNhZ2UgdGhlcmVmb3JlIHdlIGNhblxuXHRcdC8vIHJlbHkgb24gdGhlIGdsb2JhbCBVSSBtb2RlbCB0byBleGlzdFxuXHRcdGNvbnN0IG9HbG9iYWxNb2RlbCA9IHRoaXMuZ2V0R2xvYmFsVUlNb2RlbCgpO1xuXG5cdFx0aWYgKHNFZGl0TW9kZSkge1xuXHRcdFx0b0dsb2JhbE1vZGVsLnNldFByb3BlcnR5KFwiL2VkaXRNb2RlXCIsIHNFZGl0TW9kZSwgdW5kZWZpbmVkLCB0cnVlKTtcblx0XHRcdG9HbG9iYWxNb2RlbC5zZXRQcm9wZXJ0eShcIi9pc0VkaXRhYmxlXCIsIHNFZGl0TW9kZSA9PT0gXCJFZGl0YWJsZVwiLCB1bmRlZmluZWQsIHRydWUpO1xuXHRcdH1cblxuXHRcdGlmIChiQ3JlYXRpb25Nb2RlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdC8vIFNpbmNlIHNldENyZWF0aW9uTW9kZSBpcyBwdWJsaWMgaW4gRWRpdEZsb3cgYW5kIGNhbiBiZSBvdmVycmlkZW4sIG1ha2Ugc3VyZSB0byBjYWxsIGl0IHZpYSB0aGUgY29udHJvbGxlclxuXHRcdFx0Ly8gdG8gZW5zdXJlIGFueSBvdmVycmlkZXMgYXJlIHRha2VuIGludG8gYWNjb3VudFxuXHRcdFx0dGhpcy5zZXRDcmVhdGlvbk1vZGUoYkNyZWF0aW9uTW9kZSk7XG5cdFx0fVxuXHR9XG5cblx0QFB1YmxpY1xuXHRARmluYWxcblx0c2V0RHJhZnRTdGF0dXMoc0RyYWZ0U3RhdGU6IGFueSkge1xuXHRcdC8vIGF0IHRoaXMgcG9pbnQgb2YgdGltZSBpdCdzIG5vdCBtZWFudCB0byByZWxlYXNlIHRoZSBlZGl0IGZsb3cgZm9yIGZyZWVzdHlsZSB1c2FnZSB0aGVyZWZvcmUgd2UgY2FuXG5cdFx0Ly8gcmVseSBvbiB0aGUgZ2xvYmFsIFVJIG1vZGVsIHRvIGV4aXN0XG5cdFx0KHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJ1aVwiKSBhcyBKU09OTW9kZWwpLnNldFByb3BlcnR5KFwiL2RyYWZ0U3RhdHVzXCIsIHNEcmFmdFN0YXRlLCB1bmRlZmluZWQsIHRydWUpO1xuXHR9XG5cblx0QFB1YmxpY1xuXHRARmluYWxcblx0Z2V0Um91dGluZ0xpc3RlbmVyKCkge1xuXHRcdC8vIGF0IHRoaXMgcG9pbnQgb2YgdGltZSBpdCdzIG5vdCBtZWFudCB0byByZWxlYXNlIHRoZSBlZGl0IGZsb3cgZm9yIEZQTSBjdXN0b20gcGFnZXMgYW5kIHRoZSByb3V0aW5nXG5cdFx0Ly8gbGlzdGVuZXIgaXMgbm90IHlldCBwdWJsaWMgdGhlcmVmb3JlIGtlZXAgdGhlIGxvZ2ljIGhlcmUgZm9yIG5vd1xuXG5cdFx0aWYgKHRoaXMuYmFzZS5fcm91dGluZykge1xuXHRcdFx0cmV0dXJuIHRoaXMuYmFzZS5fcm91dGluZztcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiRWRpdCBGbG93IHdvcmtzIG9ubHkgd2l0aCBhIGdpdmVuIHJvdXRpbmcgbGlzdGVuZXJcIik7XG5cdFx0fVxuXHR9XG5cblx0QFB1YmxpY1xuXHRARmluYWxcblx0Z2V0R2xvYmFsVUlNb2RlbCgpOiBKU09OTW9kZWwge1xuXHRcdC8vIGF0IHRoaXMgcG9pbnQgb2YgdGltZSBpdCdzIG5vdCBtZWFudCB0byByZWxlYXNlIHRoZSBlZGl0IGZsb3cgZm9yIGZyZWVzdHlsZSB1c2FnZSB0aGVyZWZvcmUgd2UgY2FuXG5cdFx0Ly8gcmVseSBvbiB0aGUgZ2xvYmFsIFVJIG1vZGVsIHRvIGV4aXN0XG5cdFx0cmV0dXJuIHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJ1aVwiKSBhcyBKU09OTW9kZWw7XG5cdH1cblxuXHQvKipcblx0ICogUGVyZm9ybXMgYSB0YXNrIGluIHN5bmMgd2l0aCBvdGhlciB0YXNrcyBjcmVhdGVkIHZpYSB0aGlzIGZ1bmN0aW9uLlxuXHQgKiBSZXR1cm5zIHRoZSBwcm9taXNlIGNoYWluIG9mIHRoZSB0YXNrLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3cjc3luY1Rhc2tcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XG5cdCAqIEBzdGF0aWNcblx0ICogQHBhcmFtIHtQcm9taXNlfEZ1bmN0aW9ufSBbdlRhc2tdIE9wdGlvbmFsLCBhIHByb21pc2Ugb3IgZnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQgc3luY2hyb25vdXNseVxuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX0gUHJvbWlzZSByZXNvbHZlcyBvbmNlIHRoZSB0YXNrIGlzIGNvbXBsZXRlZFxuXHQgKlxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQGZpbmFsXG5cdCAqL1xuXHRAUHVibGljXG5cdEBGaW5hbFxuXHRzeW5jVGFzayh2VGFzaz86IEZ1bmN0aW9uIHwgUHJvbWlzZTxhbnk+KSB7XG5cdFx0bGV0IGZuTmV3VGFzaztcblx0XHRpZiAodlRhc2sgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG5cdFx0XHRmbk5ld1Rhc2sgPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuIHZUYXNrO1xuXHRcdFx0fTtcblx0XHR9IGVsc2UgaWYgKHR5cGVvZiB2VGFzayA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdFx0XHRmbk5ld1Rhc2sgPSB2VGFzaztcblx0XHR9XG5cblx0XHR0aGlzLl9wVGFza3MgPSB0aGlzLl9wVGFza3MgfHwgUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0aWYgKCEhZm5OZXdUYXNrKSB7XG5cdFx0XHR0aGlzLl9wVGFza3MgPSB0aGlzLl9wVGFza3MudGhlbihmbk5ld1Rhc2spLmNhdGNoKGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5fcFRhc2tzO1xuXHR9XG5cblx0QFB1YmxpY1xuXHRARmluYWxcblx0Z2V0UHJvZ3JhbW1pbmdNb2RlbChvQ29udGV4dDogYW55KTogdHlwZW9mIFByb2dyYW1taW5nTW9kZWwge1xuXHRcdHJldHVybiB0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCkuZ2V0UHJvZ3JhbW1pbmdNb2RlbChvQ29udGV4dCk7XG5cdH1cblxuXHRAUHVibGljXG5cdEBGaW5hbFxuXHRkZWxldGVEb2N1bWVudFRyYW5zYWN0aW9uKG9Db250ZXh0OiBhbnksIG1QYXJhbWV0ZXJzOiBhbnkpIHtcblx0XHRjb25zdCBvUmVzb3VyY2VCdW5kbGUgPSAodGhpcy5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIGFueSkub1Jlc291cmNlQnVuZGxlLFxuXHRcdFx0dHJhbnNhY3Rpb25IZWxwZXIgPSB0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCk7XG5cblx0XHRtUGFyYW1ldGVycyA9IG1QYXJhbWV0ZXJzIHx8IHt9O1xuXG5cdFx0Ly8gVE9ETzogdGhpcyBzZXR0aW5nIGFuZCByZW1vdmluZyBvZiBjb250ZXh0cyBzaG91bGRuJ3QgYmUgaW4gdGhlIHRyYW5zYWN0aW9uIGhlbHBlciBhdCBhbGxcblx0XHQvLyBmb3IgdGhlIHRpbWUgYmVpbmcgSSBrZXB0IGl0IGFuZCBwcm92aWRlIHRoZSBpbnRlcm5hbCBtb2RlbCBjb250ZXh0IHRvIG5vdCBicmVhayBzb21ldGhpbmdcblx0XHRtUGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dCA9IG1QYXJhbWV0ZXJzLmNvbnRyb2xJZFxuXHRcdFx0PyBzYXAudWlcblx0XHRcdFx0XHQuZ2V0Q29yZSgpXG5cdFx0XHRcdFx0LmJ5SWQobVBhcmFtZXRlcnMuY29udHJvbElkKVxuXHRcdFx0XHRcdD8uZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKVxuXHRcdFx0OiBudWxsO1xuXG5cdFx0cmV0dXJuIHRoaXMuc3luY1Rhc2soKVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdHRyYW5zYWN0aW9uSGVscGVyLmRlbGV0ZURvY3VtZW50LmJpbmQodHJhbnNhY3Rpb25IZWxwZXIsIG9Db250ZXh0LCBtUGFyYW1ldGVycywgb1Jlc291cmNlQnVuZGxlLCB0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkpXG5cdFx0XHQpXG5cdFx0XHQudGhlbigoKSA9PiB7XG5cdFx0XHRcdHRoaXMuZ2V0SW50ZXJuYWxNb2RlbCgpLnNldFByb3BlcnR5KFwiL3Nlc3Npb25PblwiLCBmYWxzZSk7XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChvRXJyb3IpO1xuXHRcdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogSGFuZGxlcyB0aGUgY3JlYXRlIGV2ZW50OiBzaG93cyBtZXNzYWdlcyBhbmQgaW4gY2FzZSBvZiBhIGRyYWZ0LCB1cGRhdGVzIHRoZSBkcmFmdCBpbmRpY2F0b3IuXG5cdCAqXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0Rmxvd1xuXHQgKiBAcGFyYW0ge29iamVjdH0gb0JpbmRpbmcgT0RhdGEgbGlzdCBiaW5kaW5nIG9iamVjdFxuXHQgKi9cblx0QFB1YmxpY1xuXHRARmluYWxcblx0aGFuZGxlQ3JlYXRlRXZlbnRzKG9CaW5kaW5nOiBhbnkpIHtcblx0XHRjb25zdCB0cmFuc2FjdGlvbkhlbHBlciA9IHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKTtcblxuXHRcdHRoaXMuc2V0RHJhZnRTdGF0dXMoRHJhZnRTdGF0dXMuQ2xlYXIpO1xuXG5cdFx0b0JpbmRpbmcgPSAob0JpbmRpbmcuZ2V0QmluZGluZyAmJiBvQmluZGluZy5nZXRCaW5kaW5nKCkpIHx8IG9CaW5kaW5nO1xuXHRcdGNvbnN0IHNQcm9ncmFtbWluZ01vZGVsID0gdGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKG9CaW5kaW5nKTtcblxuXHRcdG9CaW5kaW5nLmF0dGFjaEV2ZW50KFwiY3JlYXRlU2VudFwiLCAoKSA9PiB7XG5cdFx0XHR0cmFuc2FjdGlvbkhlbHBlci5oYW5kbGVEb2N1bWVudE1vZGlmaWNhdGlvbnMoKTtcblx0XHRcdGlmIChzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCkge1xuXHRcdFx0XHR0aGlzLnNldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLlNhdmluZyk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0b0JpbmRpbmcuYXR0YWNoRXZlbnQoXCJjcmVhdGVDb21wbGV0ZWRcIiwgKG9FdmVudDogYW55KSA9PiB7XG5cdFx0XHRjb25zdCBiU3VjY2VzcyA9IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJzdWNjZXNzXCIpO1xuXHRcdFx0aWYgKHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0KSB7XG5cdFx0XHRcdHRoaXMuc2V0RHJhZnRTdGF0dXMoYlN1Y2Nlc3MgPyBEcmFmdFN0YXR1cy5TYXZlZCA6IERyYWZ0U3RhdHVzLkNsZWFyKTtcblx0XHRcdH1cblx0XHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKS5zaG93TWVzc2FnZURpYWxvZygpO1xuXHRcdH0pO1xuXHR9XG5cblx0QFB1YmxpY1xuXHRARmluYWxcblx0Z2V0VHJhbnNhY3Rpb25IZWxwZXIoKSB7XG5cdFx0aWYgKCF0aGlzLl9vVHJhbnNhY3Rpb25IZWxwZXIpIHtcblx0XHRcdC8vIGN1cnJlbnRseSBhbHNvIHRoZSB0cmFuc2FjdGlvbiBoZWxwZXIgaXMgbG9ja2luZyB0aGVyZWZvcmUgcGFzc2luZyBsb2NrIG9iamVjdFxuXHRcdFx0dGhpcy5fb1RyYW5zYWN0aW9uSGVscGVyID0gbmV3IFRyYW5zYWN0aW9uSGVscGVyKHRoaXMuX29BcHBDb21wb25lbnQsIHRoaXMuZ2V0R2xvYmFsVUlNb2RlbCgpKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5fb1RyYW5zYWN0aW9uSGVscGVyO1xuXHR9XG5cblx0QFB1YmxpY1xuXHRARmluYWxcblx0Z2V0SW50ZXJuYWxNb2RlbCgpOiBKU09OTW9kZWwge1xuXHRcdHJldHVybiB0aGlzLmJhc2UuZ2V0VmlldygpLmdldE1vZGVsKFwiaW50ZXJuYWxcIikgYXMgSlNPTk1vZGVsO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBuZXcgcHJvbWlzZSB0byB3YWl0IGZvciBhbiBhY3Rpb24gdG8gYmUgZXhlY3V0ZWRcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIF9jcmVhdGVBY3Rpb25Qcm9taXNlXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0Rmxvd1xuXHQgKlxuXHQgKiBAcmV0dXJucyB7RnVuY3Rpb259IFRoZSByZXNvbHZlciBmdW5jdGlvbiB3aGljaCBjYW4gYmUgdXNlZCB0byBleHRlcm5hbGx5IHJlc29sdmUgdGhlIHByb21pc2Vcblx0ICovXG5cblx0QFB1YmxpY1xuXHRARmluYWxcblx0Y3JlYXRlQWN0aW9uUHJvbWlzZShzQWN0aW9uTmFtZTogYW55LCBzQ29udHJvbElkOiBhbnkpIHtcblx0XHRsZXQgZlJlc29sdmVyLCBmUmVqZWN0b3I7XG5cdFx0dGhpcy5vQWN0aW9uUHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRcdGZSZXNvbHZlciA9IHJlc29sdmU7XG5cdFx0XHRmUmVqZWN0b3IgPSByZWplY3Q7XG5cdFx0fSkudGhlbigob1Jlc3BvbnNlOiBhbnkpID0+IHtcblx0XHRcdHJldHVybiBPYmplY3QuYXNzaWduKHsgY29udHJvbElkOiBzQ29udHJvbElkIH0sIHRoaXMuZ2V0QWN0aW9uUmVzcG9uc2VEYXRhQW5kS2V5cyhzQWN0aW9uTmFtZSwgb1Jlc3BvbnNlKSk7XG5cdFx0fSk7XG5cdFx0cmV0dXJuIHsgZlJlc29sdmVyOiBmUmVzb2x2ZXIsIGZSZWplY3RvcjogZlJlamVjdG9yIH07XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgZ2V0Q3VycmVudEFjdGlvblByb21pc2Ugb2JqZWN0LlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgX2dldEN1cnJlbnRBY3Rpb25Qcm9taXNlXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0Rmxvd1xuXHQgKlxuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX0gUmV0dXJucyB0aGUgcHJvbWlzZVxuXHQgKi9cblx0QFB1YmxpY1xuXHRARmluYWxcblx0Z2V0Q3VycmVudEFjdGlvblByb21pc2UoKSB7XG5cdFx0cmV0dXJuIHRoaXMub0FjdGlvblByb21pc2U7XG5cdH1cblxuXHRAUHVibGljXG5cdEBGaW5hbFxuXHRkZWxldGVDdXJyZW50QWN0aW9uUHJvbWlzZSgpIHtcblx0XHR0aGlzLm9BY3Rpb25Qcm9taXNlID0gdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBnZXRBY3Rpb25SZXNwb25zZURhdGFBbmRLZXlzXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0Rmxvd1xuXHQgKiBAcGFyYW0ge3N0cmluZ30gc0FjdGlvbk5hbWUgVGhlIG5hbWUgb2YgdGhlIGFjdGlvbiB0aGF0IGlzIGV4ZWN1dGVkXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvUmVzcG9uc2UgVGhlIGJvdW5kIGFjdGlvbidzIHJlc3BvbnNlIGRhdGEgb3IgcmVzcG9uc2UgY29udGV4dFxuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSBPYmplY3Qgd2l0aCBkYXRhIGFuZCBuYW1lcyBvZiB0aGUga2V5IGZpZWxkcyBvZiB0aGUgcmVzcG9uc2Vcblx0ICovXG5cdEBQdWJsaWNcblx0QEZpbmFsXG5cdGdldEFjdGlvblJlc3BvbnNlRGF0YUFuZEtleXMoc0FjdGlvbk5hbWU6IHN0cmluZywgb1Jlc3BvbnNlOiBhbnkpIHtcblx0XHRpZiAoQXJyYXkuaXNBcnJheShvUmVzcG9uc2UpKSB7XG5cdFx0XHRpZiAob1Jlc3BvbnNlLmxlbmd0aCA9PT0gMSkge1xuXHRcdFx0XHRvUmVzcG9uc2UgPSBvUmVzcG9uc2VbMF07XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXR1cm4gbnVsbDtcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKCFvUmVzcG9uc2UpIHtcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblx0XHRjb25zdCBvVmlldyA9IHRoaXMuZ2V0VmlldygpLFxuXHRcdFx0b01ldGFNb2RlbCA9IChvVmlldy5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpIGFzIGFueSkuZ2V0RGF0YSgpLFxuXHRcdFx0c0FjdGlvblJldHVyblR5cGUgPVxuXHRcdFx0XHRvTWV0YU1vZGVsICYmIG9NZXRhTW9kZWxbc0FjdGlvbk5hbWVdICYmIG9NZXRhTW9kZWxbc0FjdGlvbk5hbWVdWzBdICYmIG9NZXRhTW9kZWxbc0FjdGlvbk5hbWVdWzBdLiRSZXR1cm5UeXBlXG5cdFx0XHRcdFx0PyBvTWV0YU1vZGVsW3NBY3Rpb25OYW1lXVswXS4kUmV0dXJuVHlwZS4kVHlwZVxuXHRcdFx0XHRcdDogbnVsbCxcblx0XHRcdGFLZXkgPSBzQWN0aW9uUmV0dXJuVHlwZSAmJiBvTWV0YU1vZGVsW3NBY3Rpb25SZXR1cm5UeXBlXSA/IG9NZXRhTW9kZWxbc0FjdGlvblJldHVyblR5cGVdLiRLZXkgOiBudWxsO1xuXG5cdFx0cmV0dXJuIHtcblx0XHRcdG9EYXRhOiBvUmVzcG9uc2UuZ2V0T2JqZWN0KCksXG5cdFx0XHRrZXlzOiBhS2V5XG5cdFx0fTtcblx0fVxuXG5cdEBQdWJsaWNcblx0QEZpbmFsXG5cdGdldE1lc3NhZ2VIYW5kbGVyKCkge1xuXHRcdC8vIGF0IHRoaXMgcG9pbnQgb2YgdGltZSBpdCdzIG5vdCBtZWFudCB0byByZWxlYXNlIHRoZSBlZGl0IGZsb3cgZm9yIEZQTSBjdXN0b20gcGFnZXMgdGhlcmVmb3JlIGtlZXBcblx0XHQvLyB0aGUgbG9naWMgaGVyZSBmb3Igbm93XG5cblx0XHRpZiAodGhpcy5iYXNlLm1lc3NhZ2VIYW5kbGVyKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5iYXNlLm1lc3NhZ2VIYW5kbGVyO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJFZGl0IEZsb3cgd29ya3Mgb25seSB3aXRoIGEgZ2l2ZW4gbWVzc2FnZSBoYW5kbGVyXCIpO1xuXHRcdH1cblx0fVxuXG5cdEBQdWJsaWNcblx0QEZpbmFsXG5cdGhhbmRsZVN0aWNreU9uKG9Db250ZXh0OiBhbnkpIHtcblx0XHRjb25zdCBvQXBwQ29tcG9uZW50ID0gQ29tbW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50KHRoaXMuZ2V0VmlldygpKTtcblxuXHRcdHRyeSB7XG5cdFx0XHRpZiAob0FwcENvbXBvbmVudCA9PT0gdW5kZWZpbmVkIHx8IG9Db250ZXh0ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwidW5kZWZpbmVkIEFwcENvbXBvbmVudCBvciBDb250ZXh0IGZvciBmdW5jdGlvbiBoYW5kbGVTdGlja3lPblwiKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCFvQXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCkuaGFzTmF2aWdhdGlvbkd1YXJkKCkpIHtcblx0XHRcdFx0Y29uc3Qgc0hhc2hUcmFja2VyID0gb0FwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSgpLmdldEhhc2goKSxcblx0XHRcdFx0XHRvSW50ZXJuYWxNb2RlbCA9IHRoaXMuZ2V0SW50ZXJuYWxNb2RlbCgpO1xuXG5cdFx0XHRcdC8vIFNldCBhIGd1YXJkIGluIHRoZSBSb3V0ZXJQcm94eVxuXHRcdFx0XHQvLyBBIHRpbWVvdXQgaXMgbmVjZXNzYXJ5LCBhcyB3aXRoIGRlZmVycmVkIGNyZWF0aW9uIHRoZSBoYXNoQ2hhbmdlciBpcyBub3QgdXBkYXRlZCB5ZXQgd2l0aFxuXHRcdFx0XHQvLyB0aGUgbmV3IGhhc2gsIGFuZCB0aGUgZ3VhcmQgY2Fubm90IGJlIGZvdW5kIGluIHRoZSBtYW5hZ2VkIGhpc3Rvcnkgb2YgdGhlIHJvdXRlciBwcm94eVxuXHRcdFx0XHRzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdG9BcHBDb21wb25lbnQuZ2V0Um91dGVyUHJveHkoKS5zZXROYXZpZ2F0aW9uR3VhcmQoKTtcblx0XHRcdFx0fSwgMCk7XG5cblx0XHRcdFx0Ly8gU2V0dGluZyBiYWNrIG5hdmlnYXRpb24gb24gc2hlbGwgc2VydmljZSwgdG8gZ2V0IHRoZSBkaWNhcmQgbWVzc2FnZSBib3ggaW4gY2FzZSBvZiBzdGlja3lcblx0XHRcdFx0b0FwcENvbXBvbmVudC5nZXRTaGVsbFNlcnZpY2VzKCkuc2V0QmFja05hdmlnYXRpb24odGhpcy5vbkJhY2tOYXZpZ2F0aW9uSW5TZXNzaW9uLmJpbmQodGhpcykpO1xuXG5cdFx0XHRcdHRoaXMuZm5EaXJ0eVN0YXRlUHJvdmlkZXIgPSB0aGlzLl9yZWdpc3RlckRpcnR5U3RhdGVQcm92aWRlcihvQXBwQ29tcG9uZW50LCBvSW50ZXJuYWxNb2RlbCwgc0hhc2hUcmFja2VyKTtcblx0XHRcdFx0b0FwcENvbXBvbmVudC5nZXRTaGVsbFNlcnZpY2VzKCkucmVnaXN0ZXJEaXJ0eVN0YXRlUHJvdmlkZXIodGhpcy5mbkRpcnR5U3RhdGVQcm92aWRlcik7XG5cblx0XHRcdFx0Ly8gaGFuZGxlIHNlc3Npb24gdGltZW91dFxuXHRcdFx0XHRjb25zdCBpMThuTW9kZWwgPSB0aGlzLmdldFZpZXcoKS5nZXRNb2RlbChcInNhcC5mZS5pMThuXCIpO1xuXHRcdFx0XHR0aGlzLmZuSGFuZGxlU2Vzc2lvblRpbWVvdXQgPSB0aGlzLl9hdHRhY2hTZXNzaW9uVGltZW91dCh0aGlzLCBpMThuTW9kZWwpO1xuXHRcdFx0XHQodGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoKSBhcyBhbnkpLmF0dGFjaFNlc3Npb25UaW1lb3V0KHRoaXMuZm5IYW5kbGVTZXNzaW9uVGltZW91dCk7XG5cblx0XHRcdFx0dGhpcy5mblN0aWNreURpc2NhcmRBZnRlck5hdmlnYXRpb24gPSB0aGlzLl9hdHRhY2hSb3V0ZU1hdGNoZWQodGhpcywgb0NvbnRleHQsIG9BcHBDb21wb25lbnQpO1xuXHRcdFx0XHRvQXBwQ29tcG9uZW50LmdldFJvdXRpbmdTZXJ2aWNlKCkuYXR0YWNoUm91dGVNYXRjaGVkKHRoaXMuZm5TdGlja3lEaXNjYXJkQWZ0ZXJOYXZpZ2F0aW9uKTtcblx0XHRcdH1cblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0TG9nLmluZm8oZXJyb3IpO1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHRAUHVibGljXG5cdEBGaW5hbFxuXHRoYW5kbGVTdGlja3lPZmYoKSB7XG5cdFx0Y29uc3Qgb0FwcENvbXBvbmVudCA9IENvbW1vblV0aWxzLmdldEFwcENvbXBvbmVudCh0aGlzLmdldFZpZXcoKSk7XG5cdFx0dHJ5IHtcblx0XHRcdGlmIChvQXBwQ29tcG9uZW50ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwidW5kZWZpbmVkIEFwcENvbXBvbmVudCBmb3IgZnVuY3Rpb24gaGFuZGxlU3RpY2t5T2ZmXCIpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAob0FwcENvbXBvbmVudCAmJiBvQXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KSB7XG5cdFx0XHRcdC8vIElmIHdlIGhhdmUgZXhpdGVkIGZyb20gdGhlIGFwcCwgQ29tbW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50IGRvZXNuJ3QgcmV0dXJuIGFcblx0XHRcdFx0Ly8gc2FwLmZlLmNvcmUuQXBwQ29tcG9uZW50LCBoZW5jZSB0aGUgJ2lmJyBhYm92ZVxuXHRcdFx0XHRvQXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCkuZGlzY2FyZE5hdmlnYXRpb25HdWFyZCgpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAodGhpcy5mbkRpcnR5U3RhdGVQcm92aWRlcikge1xuXHRcdFx0XHRvQXBwQ29tcG9uZW50LmdldFNoZWxsU2VydmljZXMoKS5kZXJlZ2lzdGVyRGlydHlTdGF0ZVByb3ZpZGVyKHRoaXMuZm5EaXJ0eVN0YXRlUHJvdmlkZXIpO1xuXHRcdFx0XHR0aGlzLmZuRGlydHlTdGF0ZVByb3ZpZGVyID0gdW5kZWZpbmVkO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAodGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoKSAmJiB0aGlzLmZuSGFuZGxlU2Vzc2lvblRpbWVvdXQpIHtcblx0XHRcdFx0KHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKCkgYXMgYW55KS5kZXRhY2hTZXNzaW9uVGltZW91dCh0aGlzLmZuSGFuZGxlU2Vzc2lvblRpbWVvdXQpO1xuXHRcdFx0fVxuXG5cdFx0XHRvQXBwQ29tcG9uZW50LmdldFJvdXRpbmdTZXJ2aWNlKCkuZGV0YWNoUm91dGVNYXRjaGVkKHRoaXMuZm5TdGlja3lEaXNjYXJkQWZ0ZXJOYXZpZ2F0aW9uKTtcblx0XHRcdHRoaXMuZm5TdGlja3lEaXNjYXJkQWZ0ZXJOYXZpZ2F0aW9uID0gdW5kZWZpbmVkO1xuXG5cdFx0XHR0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCkuX2JDcmVhdGVNb2RlID0gZmFsc2U7XG5cdFx0XHR0aGlzLnNldEVkaXRNb2RlKEVkaXRNb2RlLkRpc3BsYXksIGZhbHNlKTtcblxuXHRcdFx0aWYgKG9BcHBDb21wb25lbnQpIHtcblx0XHRcdFx0Ly8gSWYgd2UgaGF2ZSBleGl0ZWQgZnJvbSB0aGUgYXBwLCBDb21tb25VdGlscy5nZXRBcHBDb21wb25lbnQgZG9lc24ndCByZXR1cm4gYVxuXHRcdFx0XHQvLyBzYXAuZmUuY29yZS5BcHBDb21wb25lbnQsIGhlbmNlIHRoZSAnaWYnIGFib3ZlXG5cdFx0XHRcdG9BcHBDb21wb25lbnQuZ2V0U2hlbGxTZXJ2aWNlcygpLnNldEJhY2tOYXZpZ2F0aW9uKCk7XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdExvZy5pbmZvKGVycm9yKTtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvbiBNZXRob2QgdG8gZGlzcGxheSBhICdkaXNjYXJkJyBwb3BvdmVyIHdoZW4gZXhpdGluZyBhIHN0aWNreSBzZXNzaW9uLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgb25CYWNrTmF2aWdhdGlvbkluU2Vzc2lvblxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuSW50ZXJuYWxFZGl0Rmxvd1xuXHQgKi9cblx0QFB1YmxpY1xuXHRARmluYWxcblx0b25CYWNrTmF2aWdhdGlvbkluU2Vzc2lvbigpIHtcblx0XHRjb25zdCBvVmlldyA9IHRoaXMuZ2V0VmlldygpLFxuXHRcdFx0b0FwcENvbXBvbmVudCA9IENvbW1vblV0aWxzLmdldEFwcENvbXBvbmVudChvVmlldyksXG5cdFx0XHRvUm91dGVyUHJveHkgPSBvQXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCk7XG5cblx0XHRpZiAob1JvdXRlclByb3h5LmNoZWNrSWZCYWNrSXNPdXRPZkd1YXJkKCkpIHtcblx0XHRcdGNvbnN0IG9CaW5kaW5nQ29udGV4dCA9IG9WaWV3ICYmIG9WaWV3LmdldEJpbmRpbmdDb250ZXh0KCk7XG5cblx0XHRcdENvbW1vblV0aWxzLnByb2Nlc3NEYXRhTG9zc0NvbmZpcm1hdGlvbihcblx0XHRcdFx0KCkgPT4ge1xuXHRcdFx0XHRcdHRoaXMuZGlzY2FyZFN0aWNreVNlc3Npb24ob0JpbmRpbmdDb250ZXh0KTtcblx0XHRcdFx0XHRoaXN0b3J5LmJhY2soKTtcblx0XHRcdFx0fSxcblx0XHRcdFx0b1ZpZXcsXG5cdFx0XHRcdHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChvQmluZGluZ0NvbnRleHQpXG5cdFx0XHQpO1xuXG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGhpc3RvcnkuYmFjaygpO1xuXHR9XG5cblx0QFB1YmxpY1xuXHRARmluYWxcblx0ZGlzY2FyZFN0aWNreVNlc3Npb24ob0NvbnRleHQ6IGFueSkge1xuXHRcdHN0aWNreS5kaXNjYXJkRG9jdW1lbnQob0NvbnRleHQpO1xuXHRcdHRoaXMuaGFuZGxlU3RpY2t5T2ZmKCk7XG5cdH1cblxuXHRfaGFzTmV3QWN0aW9uRm9yU3RpY2t5KG9Db250ZXh0OiBhbnksIG9WaWV3OiBWaWV3LCBzQ3VzdG9tQWN0aW9uOiBzdHJpbmcpIHtcblx0XHR0cnkge1xuXHRcdFx0aWYgKG9Db250ZXh0ID09PSB1bmRlZmluZWQgfHwgb1ZpZXcgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGlucHV0IHBhcmFtZXRlcnMgZm9yIGZ1bmN0aW9uIF9oYXNOZXdBY3Rpb25Gb3JTdGlja3lcIik7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvVmlldy5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpLFxuXHRcdFx0XHRzTWV0YVBhdGggPSBvQ29udGV4dC5nZXRQYXRoKCkuc3Vic3RyaW5nKDAsIG9Db250ZXh0LmdldFBhdGgoKS5pbmRleE9mKFwiKFwiKSksXG5cdFx0XHRcdG9TdGlja3lTZXNzaW9uID0gb01ldGFNb2RlbC5nZXRPYmplY3Qoc01ldGFQYXRoICsgXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuU2Vzc2lvbi52MS5TdGlja3lTZXNzaW9uU3VwcG9ydGVkXCIpO1xuXG5cdFx0XHRpZiAob1N0aWNreVNlc3Npb24gJiYgb1N0aWNreVNlc3Npb24uTmV3QWN0aW9uICYmIG9TdGlja3lTZXNzaW9uLk5ld0FjdGlvbiA9PT0gc0N1c3RvbUFjdGlvbikge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH0gZWxzZSBpZiAob1N0aWNreVNlc3Npb24gJiYgb1N0aWNreVNlc3Npb24uQWRkaXRpb25hbE5ld0FjdGlvbnMpIHtcblx0XHRcdFx0cmV0dXJuIHNDdXN0b21BY3Rpb24gPT09XG5cdFx0XHRcdFx0b1N0aWNreVNlc3Npb24uQWRkaXRpb25hbE5ld0FjdGlvbnMuZmluZChmdW5jdGlvbihzQWRkaXRpb25hbEFjdGlvbjogc3RyaW5nKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gc0FkZGl0aW9uYWxBY3Rpb24gPT09IHNDdXN0b21BY3Rpb247XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQ/IHRydWVcblx0XHRcdFx0XHQ6IGZhbHNlO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRMb2cuaW5mbyhlcnJvcik7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblx0fVxuXG5cdF9yZWdpc3RlckRpcnR5U3RhdGVQcm92aWRlcihvQXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsIG9JbnRlcm5hbE1vZGVsOiBKU09OTW9kZWwsIHNIYXNoVHJhY2tlcjogc3RyaW5nKSB7XG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGZuRGlydHlTdGF0ZVByb3ZpZGVyKG9OYXZpZ2F0aW9uQ29udGV4dDogYW55KSB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRpZiAob05hdmlnYXRpb25Db250ZXh0ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGlucHV0IHBhcmFtZXRlcnMgZm9yIGZ1bmN0aW9uIGZuRGlydHlTdGF0ZVByb3ZpZGVyXCIpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Y29uc3Qgc1RhcmdldEhhc2ggPSBvTmF2aWdhdGlvbkNvbnRleHQuaW5uZXJBcHBSb3V0ZSxcblx0XHRcdFx0XHRvUm91dGVyUHJveHkgPSBvQXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCk7XG5cdFx0XHRcdGxldCBzTGNsSGFzaFRyYWNrZXIgPSBcIlwiO1xuXHRcdFx0XHRsZXQgYkRpcnR5OiBib29sZWFuO1xuXHRcdFx0XHRjb25zdCBiU2Vzc2lvbk9OID0gb0ludGVybmFsTW9kZWwuZ2V0UHJvcGVydHkoXCIvc2Vzc2lvbk9uXCIpO1xuXG5cdFx0XHRcdGlmICghYlNlc3Npb25PTikge1xuXHRcdFx0XHRcdC8vIElmIHRoZSBzdGlja3kgc2Vzc2lvbiB3YXMgdGVybWluYXRlZCBiZWZvcmUgaGFuZC5cblx0XHRcdFx0XHQvLyBFZXhhbXBsZSBpbiBjYXNlIG9mIG5hdmlnYXRpbmcgYXdheSBmcm9tIGFwcGxpY2F0aW9uIHVzaW5nIElCTi5cblx0XHRcdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCFvUm91dGVyUHJveHkuaXNOYXZpZ2F0aW9uRmluYWxpemVkKCkpIHtcblx0XHRcdFx0XHQvLyBJZiBuYXZpZ2F0aW9uIGlzIGN1cnJlbnRseSBoYXBwZW5pbmcgaW4gUm91dGVyUHJveHksIGl0J3MgYSB0cmFuc2llbnQgc3RhdGVcblx0XHRcdFx0XHQvLyAobm90IGRpcnR5KVxuXHRcdFx0XHRcdGJEaXJ0eSA9IGZhbHNlO1xuXHRcdFx0XHRcdHNMY2xIYXNoVHJhY2tlciA9IHNUYXJnZXRIYXNoO1xuXHRcdFx0XHR9IGVsc2UgaWYgKHNIYXNoVHJhY2tlciA9PT0gc1RhcmdldEhhc2gpIHtcblx0XHRcdFx0XHQvLyB0aGUgaGFzaCBkaWRuJ3QgY2hhbmdlIHNvIGVpdGhlciB0aGUgdXNlciBhdHRlbXB0cyB0byByZWZyZXNoIG9yIHRvIGxlYXZlIHRoZSBhcHBcblx0XHRcdFx0XHRiRGlydHkgPSB0cnVlO1xuXHRcdFx0XHR9IGVsc2UgaWYgKG9Sb3V0ZXJQcm94eS5jaGVja0hhc2hXaXRoR3VhcmQoc1RhcmdldEhhc2gpIHx8IG9Sb3V0ZXJQcm94eS5pc0d1YXJkQ3Jvc3NBbGxvd2VkQnlVc2VyKCkpIHtcblx0XHRcdFx0XHQvLyB0aGUgdXNlciBhdHRlbXB0cyB0byBuYXZpZ2F0ZSB3aXRoaW4gdGhlIHJvb3Qgb2JqZWN0XG5cdFx0XHRcdFx0Ly8gb3IgY3Jvc3NpbmcgdGhlIGd1YXJkIGhhcyBhbHJlYWR5IGJlZW4gYWxsb3dlZCBieSB0aGUgUm91dGVyUHJveHlcblx0XHRcdFx0XHRzTGNsSGFzaFRyYWNrZXIgPSBzVGFyZ2V0SGFzaDtcblx0XHRcdFx0XHRiRGlydHkgPSBmYWxzZTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyB0aGUgdXNlciBhdHRlbXB0cyB0byBuYXZpZ2F0ZSB3aXRoaW4gdGhlIGFwcCwgZm9yIGV4YW1wbGUgYmFjayB0byB0aGUgbGlzdCByZXBvcnRcblx0XHRcdFx0XHRiRGlydHkgPSB0cnVlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKGJEaXJ0eSkge1xuXHRcdFx0XHRcdC8vIHRoZSBGTFAgZG9lc24ndCBjYWxsIHRoZSBkaXJ0eSBzdGF0ZSBwcm92aWRlciBhbnltb3JlIG9uY2UgaXQncyBkaXJ0eSwgYXMgdGhleSBjYW4ndFxuXHRcdFx0XHRcdC8vIGNoYW5nZSB0aGlzIGR1ZSB0byBjb21wYXRpYmlsaXR5IHJlYXNvbnMgd2Ugc2V0IGl0IGJhY2sgdG8gbm90LWRpcnR5XG5cdFx0XHRcdFx0c2V0VGltZW91dChmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdG9BcHBDb21wb25lbnQuZ2V0U2hlbGxTZXJ2aWNlcygpLnNldERpcnR5RmxhZyhmYWxzZSk7XG5cdFx0XHRcdFx0fSwgMCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0c0hhc2hUcmFja2VyID0gc0xjbEhhc2hUcmFja2VyO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIGJEaXJ0eTtcblx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRcdExvZy5pbmZvKGVycm9yKTtcblx0XHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHRcdH1cblx0XHR9O1xuXHR9XG5cblx0X2F0dGFjaFNlc3Npb25UaW1lb3V0KG9Db250ZXh0OiBhbnksIGkxOG5Nb2RlbDogTW9kZWwpIHtcblx0XHRjb25zdCB0aGF0ID0gb0NvbnRleHQ7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gZm5IYW5kbGVTZXNzaW9uVGltZW91dCgpIHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGlmIChvQ29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiQ29udGV4dCBtaXNzaW5nIGZvciBmdW5jdGlvbiBmbkhhbmRsZVNlc3Npb25UaW1lb3V0XCIpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdC8vIHJlbW92ZSB0cmFuc2llbnQgbWVzc2FnZXMgc2luY2Ugd2Ugd2lsbCBzaG93aW5nIG91ciBvd24gbWVzc2FnZVxuXHRcdFx0XHR0aGF0LmdldE1lc3NhZ2VIYW5kbGVyKCkucmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cblx0XHRcdFx0Y29uc3Qgb0RpYWxvZyA9IG5ldyBEaWFsb2coe1xuXHRcdFx0XHRcdHRpdGxlOiBcIntzYXAuZmUuaTE4bj5DX0VESVRGTE9XX09CSkVDVF9QQUdFX1NFU1NJT05fRVhQSVJFRF9ESUFMT0dfVElUTEV9XCIsXG5cdFx0XHRcdFx0c3RhdGU6IFwiV2FybmluZ1wiLFxuXHRcdFx0XHRcdGNvbnRlbnQ6IG5ldyBUZXh0KHsgdGV4dDogXCJ7c2FwLmZlLmkxOG4+Q19FRElURkxPV19PQkpFQ1RfUEFHRV9TRVNTSU9OX0VYUElSRURfRElBTE9HX01FU1NBR0V9XCIgfSksXG5cdFx0XHRcdFx0YmVnaW5CdXR0b246IG5ldyBCdXR0b24oe1xuXHRcdFx0XHRcdFx0dGV4dDogXCJ7c2FwLmZlLmkxOG4+Q19DT01NT05fRElBTE9HX09LfVwiLFxuXHRcdFx0XHRcdFx0dHlwZTogXCJFbXBoYXNpemVkXCIsXG5cdFx0XHRcdFx0XHRwcmVzczogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdC8vIHJlbW92ZSBzdGlja3kgaGFuZGxpbmcgYWZ0ZXIgbmF2aWdhdGlvbiBzaW5jZSBzZXNzaW9uIGhhcyBhbHJlYWR5IGJlZW4gdGVybWluYXRlZFxuXHRcdFx0XHRcdFx0XHR0aGF0LmhhbmRsZVN0aWNreU9mZigpO1xuXHRcdFx0XHRcdFx0XHR0aGF0LmdldFJvdXRpbmdMaXN0ZW5lcigpLm5hdmlnYXRlQmFja0Zyb21Db250ZXh0KG9Db250ZXh0KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KSxcblx0XHRcdFx0XHRhZnRlckNsb3NlOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdG9EaWFsb2cuZGVzdHJveSgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHRcdG9EaWFsb2cuYWRkU3R5bGVDbGFzcyhcInNhcFVpQ29udGVudFBhZGRpbmdcIik7XG5cdFx0XHRcdG9EaWFsb2cuc2V0TW9kZWwoaTE4bk1vZGVsLCBcInNhcC5mZS5pMThuXCIpO1xuXHRcdFx0XHR0aGF0LmdldFZpZXcoKS5hZGREZXBlbmRlbnQob0RpYWxvZyk7XG5cdFx0XHRcdG9EaWFsb2cub3BlbigpO1xuXHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0TG9nLmluZm8oZXJyb3IpO1xuXHRcdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fTtcblx0fVxuXG5cdF9hdHRhY2hSb3V0ZU1hdGNoZWQob0ZuQ29udGV4dDogYW55LCBvQ29udGV4dDogYW55LCBvQXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQpIHtcblx0XHRyZXR1cm4gZnVuY3Rpb24gZm5TdGlja3lEaXNjYXJkQWZ0ZXJOYXZpZ2F0aW9uKCkge1xuXHRcdFx0Y29uc3Qgc0N1cnJlbnRIYXNoID0gb0FwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSgpLmdldEhhc2goKTtcblx0XHRcdC8vIGVpdGhlciBjdXJyZW50IGhhc2ggaXMgZW1wdHkgc28gdGhlIHVzZXIgbGVmdCB0aGUgYXBwIG9yIGhlIG5hdmlnYXRlZCBhd2F5IGZyb20gdGhlIG9iamVjdFxuXHRcdFx0aWYgKCFzQ3VycmVudEhhc2ggfHwgIW9BcHBDb21wb25lbnQuZ2V0Um91dGVyUHJveHkoKS5jaGVja0hhc2hXaXRoR3VhcmQoc0N1cnJlbnRIYXNoKSkge1xuXHRcdFx0XHRvRm5Db250ZXh0LmRpc2NhcmRTdGlja3lTZXNzaW9uKG9Db250ZXh0KTtcblx0XHRcdH1cblx0XHR9O1xuXHR9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEludGVybmFsRWRpdEZsb3c7XG4iXX0=