@sapui5/sap.fe.core 1.98.0 → 1.99.2

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 (231) hide show
  1. package/package.json +3 -2
  2. package/src/sap/fe/core/.library +1 -1
  3. package/src/sap/fe/core/AnnotationHelper.js +377 -405
  4. package/src/sap/fe/core/AnnotationHelper.ts +385 -0
  5. package/src/sap/fe/core/AppComponent.js +3 -2
  6. package/src/sap/fe/core/AppStateHandler.js +229 -181
  7. package/src/sap/fe/core/AppStateHandler.ts +171 -0
  8. package/src/sap/fe/core/BaseController.js +3 -2
  9. package/src/sap/fe/core/BusyLocker.js +105 -121
  10. package/src/sap/fe/core/BusyLocker.ts +98 -0
  11. package/src/sap/fe/core/CommonUtils.js +2073 -2399
  12. package/src/sap/fe/core/CommonUtils.ts +2078 -0
  13. package/src/sap/fe/core/ExtensionAPI.js +3 -2
  14. package/src/sap/fe/core/PageController.js +84 -125
  15. package/src/sap/fe/core/PageController.ts +101 -0
  16. package/src/sap/fe/core/RouterProxy.js +986 -823
  17. package/src/sap/fe/core/RouterProxy.ts +838 -0
  18. package/src/sap/fe/core/Synchronization.js +51 -35
  19. package/src/sap/fe/core/Synchronization.ts +29 -0
  20. package/src/sap/fe/core/TemplateComponent.js +173 -164
  21. package/src/sap/fe/core/TemplateComponent.ts +166 -0
  22. package/src/sap/fe/core/TemplateModel.js +97 -54
  23. package/src/sap/fe/core/TemplateModel.ts +64 -0
  24. package/src/sap/fe/core/TransactionHelper.js +1576 -1664
  25. package/src/sap/fe/core/TransactionHelper.ts +1706 -0
  26. package/src/sap/fe/core/actions/draft.js +561 -608
  27. package/src/sap/fe/core/actions/draft.ts +595 -0
  28. package/src/sap/fe/core/actions/messageHandling.js +545 -514
  29. package/src/sap/fe/core/actions/messageHandling.ts +532 -0
  30. package/src/sap/fe/core/actions/nonDraft.js +17 -19
  31. package/src/sap/fe/core/actions/nonDraft.ts +12 -0
  32. package/src/sap/fe/core/actions/operations.js +1074 -1215
  33. package/src/sap/fe/core/actions/operations.ts +1162 -0
  34. package/src/sap/fe/core/actions/sticky.js +102 -105
  35. package/src/sap/fe/core/actions/sticky.ts +102 -0
  36. package/src/sap/fe/core/controllerextensions/ControllerExtensionMetadata.js +3 -2
  37. package/src/sap/fe/core/controllerextensions/EditFlow.js +170 -392
  38. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +3 -2
  39. package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +279 -11
  40. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +8 -6
  41. package/src/sap/fe/core/controllerextensions/InternalRouting.js +52 -47
  42. package/src/sap/fe/core/controllerextensions/KPIManagement.js +2 -3
  43. package/src/sap/fe/core/controllerextensions/KPIManagement.ts +29 -26
  44. package/src/sap/fe/core/controllerextensions/MassEdit.js +101 -8
  45. package/src/sap/fe/core/controllerextensions/MessageHandler.js +17 -8
  46. package/src/sap/fe/core/controllerextensions/PageReady.js +2 -2
  47. package/src/sap/fe/core/controllerextensions/PageReady.ts +12 -8
  48. package/src/sap/fe/core/controllerextensions/Paginator.js +3 -2
  49. package/src/sap/fe/core/controllerextensions/Placeholder.js +3 -2
  50. package/src/sap/fe/core/controllerextensions/Routing.js +9 -4
  51. package/src/sap/fe/core/controllerextensions/RoutingListener.js +3 -2
  52. package/src/sap/fe/core/controllerextensions/Share.js +3 -2
  53. package/src/sap/fe/core/controllerextensions/SideEffects.js +3 -3
  54. package/src/sap/fe/core/controllerextensions/SideEffects.ts +18 -18
  55. package/src/sap/fe/core/controllerextensions/ViewState.js +3 -2
  56. package/src/sap/fe/core/controls/CommandExecution.js +3 -2
  57. package/src/sap/fe/core/controls/ConditionalWrapper.js +3 -2
  58. package/src/sap/fe/core/controls/CustomQuickViewPage.js +3 -2
  59. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +3 -2
  60. package/src/sap/fe/core/controls/FieldWrapper.js +11 -22
  61. package/src/sap/fe/core/controls/FilterBar.js +3 -2
  62. package/src/sap/fe/core/controls/FormElementWrapper.js +3 -2
  63. package/src/sap/fe/core/controls/MultiValueParameterDelegate.js +3 -2
  64. package/src/sap/fe/core/controls/NonComputedVisibleKeyFieldsDialog.fragment.xml +1 -0
  65. package/src/sap/fe/core/controls/filterbar/FilterContainer.js +3 -2
  66. package/src/sap/fe/core/controls/filterbar/VisualFilter.js +5 -4
  67. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +3 -2
  68. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +3 -2
  69. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +3 -2
  70. package/src/sap/fe/core/converters/ConverterContext.js +2 -2
  71. package/src/sap/fe/core/converters/ConverterContext.ts +4 -3
  72. package/src/sap/fe/core/converters/ManifestSettings.js +1 -1
  73. package/src/sap/fe/core/converters/ManifestSettings.ts +1 -0
  74. package/src/sap/fe/core/converters/ManifestWrapper.js +39 -26
  75. package/src/sap/fe/core/converters/ManifestWrapper.ts +9 -0
  76. package/src/sap/fe/core/converters/MetaModelConverter.js +11 -8
  77. package/src/sap/fe/core/converters/MetaModelConverter.ts +16 -16
  78. package/src/sap/fe/core/converters/TemplateConverter.js +1 -1
  79. package/src/sap/fe/core/converters/TemplateConverter.ts +2 -2
  80. package/src/sap/fe/core/converters/common/AnnotationConverter.js +17 -13
  81. package/src/sap/fe/core/converters/controls/Common/Action.js +2 -2
  82. package/src/sap/fe/core/converters/controls/Common/Action.ts +2 -2
  83. package/src/sap/fe/core/converters/controls/Common/Chart.js +5 -3
  84. package/src/sap/fe/core/converters/controls/Common/Chart.ts +11 -3
  85. package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +3 -3
  86. package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +2 -2
  87. package/src/sap/fe/core/converters/controls/Common/Form.js +4 -2
  88. package/src/sap/fe/core/converters/controls/Common/Form.ts +16 -2
  89. package/src/sap/fe/core/converters/controls/Common/Table.js +250 -146
  90. package/src/sap/fe/core/converters/controls/Common/Table.ts +300 -167
  91. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +115 -56
  92. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +120 -74
  93. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +467 -32
  94. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +483 -54
  95. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +6 -6
  96. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +9 -15
  97. package/src/sap/fe/core/converters/helpers/Aggregation.js +13 -5
  98. package/src/sap/fe/core/converters/helpers/Aggregation.ts +20 -5
  99. package/src/sap/fe/core/converters/helpers/IssueManager.js +4 -1
  100. package/src/sap/fe/core/converters/helpers/IssueManager.ts +3 -0
  101. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +4 -4
  102. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +3 -3
  103. package/src/sap/fe/core/converters/templates/ListReportConverter.js +13 -6
  104. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +26 -15
  105. package/src/sap/fe/core/designtime/AppComponent.designtime.js +3 -2
  106. package/src/sap/fe/core/formatters/CriticalityFormatter.js +1 -1
  107. package/src/sap/fe/core/formatters/CriticalityFormatter.ts +1 -1
  108. package/src/sap/fe/core/formatters/FPMFormatter.js +1 -1
  109. package/src/sap/fe/core/formatters/FPMFormatter.ts +4 -10
  110. package/src/sap/fe/core/formatters/KPIFormatter.js +1 -1
  111. package/src/sap/fe/core/formatters/KPIFormatter.ts +3 -1
  112. package/src/sap/fe/core/formatters/TableFormatter.js +39 -28
  113. package/src/sap/fe/core/formatters/TableFormatter.ts +43 -28
  114. package/src/sap/fe/core/formatters/ValueFormatter.js +1 -1
  115. package/src/sap/fe/core/formatters/ValueFormatter.ts +7 -6
  116. package/src/sap/fe/core/fpm/Component.js +3 -2
  117. package/src/sap/fe/core/helpers/AppStartupHelper.js +2 -2
  118. package/src/sap/fe/core/helpers/AppStartupHelper.ts +7 -4
  119. package/src/sap/fe/core/helpers/BindingExpression.js +314 -355
  120. package/src/sap/fe/core/helpers/BindingExpression.ts +317 -391
  121. package/src/sap/fe/core/helpers/ClassSupport.js +27 -15
  122. package/src/sap/fe/core/helpers/ClassSupport.ts +31 -20
  123. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +63 -59
  124. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.ts +56 -0
  125. package/src/sap/fe/core/helpers/EditState.js +81 -84
  126. package/src/sap/fe/core/helpers/EditState.ts +81 -0
  127. package/src/sap/fe/core/helpers/ExcelFormatHelper.js +62 -48
  128. package/src/sap/fe/core/helpers/ExcelFormatHelper.ts +49 -0
  129. package/src/sap/fe/core/helpers/FPMHelper.js +52 -56
  130. package/src/sap/fe/core/helpers/FPMHelper.ts +62 -0
  131. package/src/sap/fe/core/helpers/KeepAliveHelper.js +3 -4
  132. package/src/sap/fe/core/helpers/KeepAliveHelper.ts +9 -9
  133. package/src/sap/fe/core/helpers/MassEditHelper.js +27 -18
  134. package/src/sap/fe/core/helpers/ModelHelper.js +229 -225
  135. package/src/sap/fe/core/helpers/ModelHelper.ts +227 -0
  136. package/src/sap/fe/core/helpers/PasteHelper.js +210 -132
  137. package/src/sap/fe/core/helpers/PasteHelper.ts +196 -0
  138. package/src/sap/fe/core/helpers/SemanticDateOperators.js +332 -313
  139. package/src/sap/fe/core/helpers/SemanticDateOperators.ts +330 -0
  140. package/src/sap/fe/core/helpers/SemanticKeyHelper.js +66 -67
  141. package/src/sap/fe/core/helpers/SemanticKeyHelper.ts +73 -0
  142. package/src/sap/fe/core/helpers/StableIdHelper.js +4 -7
  143. package/src/sap/fe/core/helpers/StableIdHelper.ts +2 -6
  144. package/src/sap/fe/core/jsx-runtime/jsx.js +1 -1
  145. package/src/sap/fe/core/jsx-runtime/jsx.ts +1 -1
  146. package/src/sap/fe/core/library.js +4 -3
  147. package/src/sap/fe/core/library.support.js +3 -2
  148. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +1 -1
  149. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +1 -1
  150. package/src/sap/fe/core/messagebundle.properties +23 -10
  151. package/src/sap/fe/core/messagebundle_ar.properties +9 -0
  152. package/src/sap/fe/core/messagebundle_bg.properties +9 -0
  153. package/src/sap/fe/core/messagebundle_ca.properties +9 -0
  154. package/src/sap/fe/core/messagebundle_cs.properties +10 -1
  155. package/src/sap/fe/core/messagebundle_cy.properties +9 -0
  156. package/src/sap/fe/core/messagebundle_da.properties +9 -0
  157. package/src/sap/fe/core/messagebundle_de.properties +9 -0
  158. package/src/sap/fe/core/messagebundle_el.properties +9 -0
  159. package/src/sap/fe/core/messagebundle_en.properties +9 -0
  160. package/src/sap/fe/core/messagebundle_en_GB.properties +9 -0
  161. package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +9 -0
  162. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +9 -0
  163. package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +9 -0
  164. package/src/sap/fe/core/messagebundle_es.properties +9 -0
  165. package/src/sap/fe/core/messagebundle_es_MX.properties +9 -0
  166. package/src/sap/fe/core/messagebundle_et.properties +9 -0
  167. package/src/sap/fe/core/messagebundle_fi.properties +9 -0
  168. package/src/sap/fe/core/messagebundle_fr.properties +13 -4
  169. package/src/sap/fe/core/messagebundle_fr_CA.properties +15 -6
  170. package/src/sap/fe/core/messagebundle_hi.properties +15 -6
  171. package/src/sap/fe/core/messagebundle_hr.properties +15 -6
  172. package/src/sap/fe/core/messagebundle_hu.properties +9 -0
  173. package/src/sap/fe/core/messagebundle_id.properties +10 -1
  174. package/src/sap/fe/core/messagebundle_it.properties +9 -0
  175. package/src/sap/fe/core/messagebundle_iw.properties +9 -0
  176. package/src/sap/fe/core/messagebundle_ja.properties +9 -0
  177. package/src/sap/fe/core/messagebundle_kk.properties +15 -6
  178. package/src/sap/fe/core/messagebundle_ko.properties +9 -0
  179. package/src/sap/fe/core/messagebundle_lt.properties +9 -0
  180. package/src/sap/fe/core/messagebundle_lv.properties +15 -6
  181. package/src/sap/fe/core/messagebundle_ms.properties +14 -5
  182. package/src/sap/fe/core/messagebundle_nl.properties +9 -0
  183. package/src/sap/fe/core/messagebundle_no.properties +9 -0
  184. package/src/sap/fe/core/messagebundle_pl.properties +9 -0
  185. package/src/sap/fe/core/messagebundle_pt.properties +9 -0
  186. package/src/sap/fe/core/messagebundle_pt_PT.properties +9 -0
  187. package/src/sap/fe/core/messagebundle_ro.properties +9 -0
  188. package/src/sap/fe/core/messagebundle_ru.properties +9 -0
  189. package/src/sap/fe/core/messagebundle_sh.properties +11 -2
  190. package/src/sap/fe/core/messagebundle_sk.properties +9 -0
  191. package/src/sap/fe/core/messagebundle_sl.properties +15 -6
  192. package/src/sap/fe/core/messagebundle_sv.properties +9 -0
  193. package/src/sap/fe/core/messagebundle_th.properties +9 -0
  194. package/src/sap/fe/core/messagebundle_tr.properties +9 -0
  195. package/src/sap/fe/core/messagebundle_uk.properties +9 -0
  196. package/src/sap/fe/core/messagebundle_vi.properties +9 -0
  197. package/src/sap/fe/core/messagebundle_zh_CN.properties +9 -0
  198. package/src/sap/fe/core/messagebundle_zh_TW.properties +15 -6
  199. package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +1 -1
  200. package/src/sap/fe/core/services/AsyncComponentServiceFactory.ts +3 -1
  201. package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +269 -202
  202. package/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +212 -0
  203. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +1 -1
  204. package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +7 -6
  205. package/src/sap/fe/core/services/NavigationServiceFactory.js +406 -300
  206. package/src/sap/fe/core/services/NavigationServiceFactory.ts +316 -0
  207. package/src/sap/fe/core/services/ResourceModelServiceFactory.js +149 -81
  208. package/src/sap/fe/core/services/ResourceModelServiceFactory.ts +80 -0
  209. package/src/sap/fe/core/services/RoutingServiceFactory.js +987 -899
  210. package/src/sap/fe/core/services/RoutingServiceFactory.ts +898 -0
  211. package/src/sap/fe/core/services/ShellServicesFactory.js +1 -1
  212. package/src/sap/fe/core/services/ShellServicesFactory.ts +15 -10
  213. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +35 -81
  214. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +46 -94
  215. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +461 -487
  216. package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +453 -0
  217. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +10 -8
  218. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.ts +8 -0
  219. package/src/sap/fe/core/support/AnnotationIssue.support.js +15 -3
  220. package/src/sap/fe/core/support/AnnotationIssue.support.ts +16 -2
  221. package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.js +2 -2
  222. package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.ts +1 -1
  223. package/src/sap/fe/core/templating/FieldControlHelper.js +8 -8
  224. package/src/sap/fe/core/templating/FieldControlHelper.ts +25 -7
  225. package/src/sap/fe/core/templating/FilterHelper.js +138 -72
  226. package/src/sap/fe/core/templating/FilterHelper.ts +139 -71
  227. package/src/sap/fe/core/templating/UIFormatters.js +31 -1
  228. package/src/sap/fe/core/templating/UIFormatters.ts +33 -2
  229. package/src/sap/fe/core/type/Email.js +1 -1
  230. package/src/sap/fe/core/type/Email.ts +4 -6
  231. package/ui5.yaml +0 -3
@@ -1,610 +1,563 @@
1
1
  /*!
2
- * SAPUI5
3
- * (c) Copyright 2009-2022 SAP SE. All rights reserved.
2
+ * SAP UI development toolkit for HTML5 (SAPUI5)
3
+ * (c) Copyright 2009-2021 SAP SE. All rights reserved
4
4
  */
5
-
6
- // Provides static functions for the draft programming model
7
- sap.ui.define(
8
- [
9
- "sap/m/Dialog",
10
- "sap/m/Button",
11
- "sap/m/Text",
12
- "sap/m/MessageBox",
13
- "sap/fe/core/actions/messageHandling",
14
- "sap/fe/core/CommonUtils",
15
- "sap/base/Log"
16
- ],
17
- function(Dialog, Button, Text, MessageBox, messageHandling, CommonUtils, Log) {
18
- "use strict";
19
-
20
- /**
21
- * Interface for callbacks used in the functions
22
- *
23
- *
24
- * @author SAP SE
25
- * @since 1.54.0
26
- * @interface
27
- * @name sap.fe.core.actions.draft.ICallback
28
- * @private
29
- */
30
-
31
- /**
32
- * Callback to approve or reject the creation of a draft
33
- * @name sap.fe.core.actions.draft.ICallback.beforeCreateDraftFromActiveDocument
34
- * @function
35
- * @static
36
- * @abstract
37
- * @param {sap.ui.model.odata.v4.Context} oContext Context of the active document for the new draft
38
- * @returns {(boolean|Promise)} Approval of draft creation [true|false] or Promise that resolves with the boolean value
39
- *
40
- * @private
41
- */
42
-
43
- /**
44
- * Callback after a draft was successully created
45
- * @name sap.fe.core.actions.draft.ICallback.afterCreateDraftFromActiveDocument
46
- * @function
47
- * @static
48
- * @abstract
49
- * @param {sap.ui.model.odata.v4.Context} oContext Context of the new draft
50
- * @param {sap.ui.model.odata.v4.Context} oActiveDocumentContext Context of the active document for the new draft
51
- * @returns {sap.ui.model.odata.v4.Context} oActiveDocumentContext
52
- *
53
- * @private
54
- */
55
-
56
- /**
57
- * Callback to approve or reject overwriting an unsaved draft of another user
58
- * @name sap.fe.core.actions.draft.ICallback.whenDecisionToOverwriteDocumentIsRequired
59
- * @function
60
- * @public
61
- * @static
62
- * @abstract
63
- *
64
- * @param {sap.ui.model.odata.v4.Context} oContext Context of the active document for the new draft
65
- * @returns {(boolean|Promise)} Approval to overwrite unsaved draft [true|false] or Promise that resolves with the boolean value
66
- *
67
- * @ui5-restricted
68
- */
69
-
70
- /* Constants for draft operations */
71
- var draftOperations = {
72
- EDIT: "EditAction",
73
- ACTIVATION: "ActivationAction",
74
- DISCARD: "DiscardAction",
75
- PREPARE: "PreparationAction"
76
- };
77
-
78
- /**
79
- * Static functions for the draft programming model
80
- *
81
- * @namespace
82
- * @alias sap.fe.core.actions.draft
83
- * @private
84
- * @experimental This module is only for experimental use! <br/><b>This is only a POC and maybe deleted</b>
85
- * @since 1.54.0
86
- */
87
- var draft = {
88
- createDraftFromActiveDocument: createDraftFromActiveDocument,
89
- activateDocument: activateDocument,
90
- deleteDraft: deleteDraft
91
- };
92
-
93
- /**
94
- * Determines action name for a draft operation.
95
- *
96
- * @param {sap.ui.model.odata.v4.Context} oContext The context that should be bound to the operation
97
- * @param {string} sOperation The operation name
98
- * @returns {string} The name of the draft operation
99
- */
100
- function getActionName(oContext, sOperation) {
101
- var oModel = oContext.getModel(),
102
- oMetaModel = oModel.getMetaModel(),
103
- sEntitySetPath = oMetaModel.getMetaPath(oContext.getPath());
104
-
105
- return oMetaModel.getObject(sEntitySetPath + "@com.sap.vocabularies.Common.v1.DraftRoot/" + sOperation);
106
- }
107
-
108
- /**
109
- * Creates an operation context binding for the given context and operation.
110
- *
111
- * @param {sap.ui.model.odata.v4.Context} oContext The context that should be bound to the operation
112
- * @param {string} sOperation The operation (action or function import)
113
- * @param oOptions Options to create the operation context
114
- * @returns {sap.ui.model.odata.v4.ODataContextBinding} The context binding of the bound operation
115
- */
116
- function createOperation(oContext, sOperation, oOptions) {
117
- var sOperationName = getActionName(oContext, sOperation);
118
-
119
- return oContext.getModel().bindContext(sOperationName + "(...)", oContext, oOptions);
120
- }
121
-
122
- /**
123
- * Check if optional draft prepare action exists.
124
- *
125
- * @param {sap.ui.model.odata.v4.Context} oContext The context that should be bound to the operation
126
- * @returns {boolean} True if a a prepare action exists
127
- */
128
- function hasPrepareAction(oContext) {
129
- return !!getActionName(oContext, draftOperations.PREPARE);
130
- }
131
-
132
- /**
133
- * Creates a new draft from an active document.
134
- *
135
- * @function
136
- * @param {sap.ui.model.odata.v4.Context} oContext context for which the action should be performed
137
- * @param {boolean} bPreserveChanges
138
- * <ul>
139
- * <li>true - existing changes from another user that are not locked are preserved and an error message (http status 409) is send from the backend</li>
140
- * <li>false - existing changes from another user that are not locked are overwritten</li>
141
- * </ul>
142
- * @returns {Promise.<sap.ui.model.odata.v4.Context>} Resolve function returns the context of the operation
143
- * @private
144
- * @ui5-restricted
145
- */
146
-
147
- function executeDraftEditAction(oContext, bPreserveChanges) {
148
- if (oContext.getProperty("IsActiveEntity")) {
149
- var oOptions = { $$inheritExpandSelect: true };
150
- var oOperation = createOperation(oContext, draftOperations.EDIT, oOptions);
151
- oOperation.setParameter("PreserveChanges", bPreserveChanges);
152
- var sGroupId = "direct";
153
- var oEditPromise = oOperation
154
- .execute(sGroupId, undefined, fnOnStrictHandlingFailed.bind(draft, oContext, sGroupId))
155
- .then(function(oDraftDocumentContext) {
156
- return oDraftDocumentContext;
157
- });
158
- oOperation.getModel().submitBatch(sGroupId);
159
- return oEditPromise;
160
- } else {
161
- throw new Error("You cannot edit this draft document");
162
- }
163
- }
164
-
165
- function fnOnStrictHandlingFailed(oContext, sGroupId, aMessages) {
166
- if (aMessages.length === 1) {
167
- var sMessage = aMessages[0].message,
168
- dialogPromise = new Promise(function(resolve) {
169
- sap.ui.require(["sap/m/MessageBox"], function(MessageBox) {
170
- MessageBox.warning(sMessage, {
171
- title: "Warning",
172
- actions: [MessageBox.Action.OK, MessageBox.Action.CANCEL],
173
- onClose: function(sAction) {
174
- if (sAction === MessageBox.Action.OK) {
175
- resolve(true);
176
- oContext.getModel().submitBatch(sGroupId);
177
- } else {
178
- resolve(false);
179
- }
180
- }
181
- });
182
- });
183
- });
184
- return dialogPromise;
185
- }
186
- }
187
-
188
- /**
189
- * Activates a draft document. The draft will replace the sibling entity and will be deleted by the back end.
190
- *
191
- * @function
192
- * @param {sap.ui.model.odata.v4.Context} oContext context for which the action should be performed
193
- * @param {object} oAppComponent The AppComponent
194
- * @param {string} [sGroupId] The optional batch group in which the operation is to be executed
195
- * @returns {Promise.<sap.ui.model.odata.v4.Context>} Resolve function returns the context of the operation
196
- * @private
197
- * @ui5-restricted
198
- */
199
-
200
- function executeDraftActivationAction(oContext, oAppComponent, sGroupId) {
201
- var bHasPrepareAction = hasPrepareAction(oContext);
202
-
203
- // According to the draft spec if the service contains a prepare action and we trigger both prepare and
204
- // activate in one $batch the activate action is called with iF-Match=*
205
- var bIgnoreEtag = bHasPrepareAction;
206
-
207
- if (!oContext.getProperty("IsActiveEntity")) {
208
- var oOperation = createOperation(oContext, draftOperations.ACTIVATION, { $$inheritExpandSelect: true });
209
- return oOperation
210
- .execute(sGroupId, bIgnoreEtag, fnOnStrictHandlingFailed.bind(draft, oContext, sGroupId)) //3rd parameter<------
211
- .then(function(oActiveDocumentContext) {
212
- return oActiveDocumentContext;
213
- })
214
- .catch(
215
- //if ACTIVATE action fails then we request either the sideEffects against PREPARE action (if annotated) or the messages as fallback:
216
- function() {
217
- if (bHasPrepareAction) {
218
- var sActionName = getActionName(oContext, draftOperations.PREPARE),
219
- oSideEffectsService = oAppComponent.getSideEffectsService(),
220
- oBindingParameters = oSideEffectsService.getODataActionSideEffects(sActionName, oContext),
221
- aTargetPaths = oBindingParameters && oBindingParameters.pathExpressions;
222
- if (aTargetPaths && aTargetPaths.length > 0) {
223
- oSideEffectsService.requestSideEffects(aTargetPaths, oContext).catch(function(oError) {
224
- Log.error("Error while requesting side effects", oError);
225
- });
226
- } else {
227
- requestMessages(oContext, oSideEffectsService).catch(function(oError) {
228
- Log.error("Error while requesting messages", oError);
229
- });
230
- }
231
- }
232
- return Promise.reject();
233
- }
234
- );
235
- } else {
236
- throw new Error("The activation action cannot be executed on an active document");
237
- }
238
- }
239
-
240
- /**
241
- * Execute a preparation action.
242
- *
243
- * @function
244
- * @param {sap.ui.model.odata.v4.Context} oContext Context for which the action should be performed
245
- * @param {object} oAppComponent The AppComponent
246
- * @param {object} mParameters The parameters
247
- * @param {boolean} [mParameters.groupId] The optional batch group where we want to execute the operation in
248
- * @param {boolean} [mParameters.bPrepareForEdit] Shall the messages be requested if supported by service
249
- * @returns {Promise.<sap.ui.model.odata.v4.Context>} Resolve function returns the context of the operation
250
- * @private
251
- * @ui5-restricted
252
- */
253
- function executeDraftPreparationAction(oContext, oAppComponent, mParameters) {
254
- var mParams = mParameters || {};
255
- if (!oContext.getProperty("IsActiveEntity")) {
256
- var oOperation = createOperation(oContext, draftOperations.PREPARE);
257
-
258
- // TODO: side effects qualifier shall be even deprecated to be checked
259
- oOperation.setParameter("SideEffectsQualifier", "");
260
-
261
- var sGroupId = mParams.groupId || oOperation.getGroupId();
262
- var oPreparationPromise = oOperation
263
- .execute(sGroupId)
264
- .then(function() {
265
- if (mParams.bPrepareForEdit) {
266
- // if PREPARE action is triggered after Edit then either the sideEffects (if annotated against PREPARE) are executed or the messages are requested as fallback if no sideEffects:
267
- var sActionName = getActionName(oContext, draftOperations.PREPARE),
268
- oSideEffectsService = oAppComponent.getSideEffectsService(),
269
- oBindingParameters = oSideEffectsService.getODataActionSideEffects(sActionName, oContext),
270
- aTargetPaths = oBindingParameters && oBindingParameters.pathExpressions;
271
- if (aTargetPaths && aTargetPaths.length > 0) {
272
- oSideEffectsService.requestSideEffects(aTargetPaths, oContext, sGroupId).catch(function(oError) {
273
- Log.error("Error while requesting side effects", oError);
274
- });
275
- } else {
276
- requestMessages(oContext, oSideEffectsService);
277
- }
278
- }
279
- return oOperation;
280
- })
281
- .catch(function(oError) {
282
- Log.error("Error while executing the operation", oError);
283
- });
284
-
285
- return oPreparationPromise;
286
- } else {
287
- throw new Error("The preparation action cannot be executed on an active document");
288
- }
289
- }
290
-
291
- /**
292
- * Determines the message path for a context.
293
- *
294
- * @function
295
- * @param {sap.ui.model.odata.v4.Context} oContext Context for which the path shall be determined
296
- * @returns {string} Message path, empty if not annotated
297
- * @private
298
- * @ui5-restricted
299
- */
300
- function getMessagesPath(oContext) {
301
- var oModel = oContext.getModel(),
302
- oMetaModel = oModel.getMetaModel(),
303
- sEntitySetPath = oMetaModel.getMetaPath(oContext.getPath());
304
- return oMetaModel.getObject(sEntitySetPath + "/@com.sap.vocabularies.Common.v1.Messages/$Path");
305
- }
306
-
307
- /**
308
- * Requests the messages if annotated for a given context.
309
- *
310
- * @function
311
- * @param {sap.ui.model.odata.v4.Context} oContext Context for which the messages shall be requested
312
- * @param {object} oSideEffectsService Service for the SideEffects on SAP Fiori elements
313
- * @returns {Promise} Promise which is resolved once messages were requested
314
- * @private
315
- * @ui5-restricted
316
- */
317
- function requestMessages(oContext, oSideEffectsService) {
318
- var sMessagesPath = getMessagesPath(oContext);
319
- if (sMessagesPath) {
320
- return oSideEffectsService.requestSideEffects([{ $PropertyPath: sMessagesPath }], oContext);
321
- }
322
- }
323
-
324
- /**
325
- * Executes discard of a draft function using HTTP Post.
326
- *
327
- * @function
328
- * @param {sap.ui.model.odata.v4.Context} oContext context for which the action should be performed
329
- * @returns {Promise.<sap.ui.model.odata.v4.Context>} Resolve function returns the context of the operation
330
- * @private
331
- * @ui5-restricted
332
- */
333
-
334
- function executeDraftDiscardAction(oContext) {
335
- if (!oContext.getProperty("IsActiveEntity")) {
336
- var oDiscardOperation = createOperation(oContext, draftOperations.DISCARD);
337
- var oDiscardPromise = oDiscardOperation.execute("direct");
338
- oContext.getModel().submitBatch("direct");
339
- return oDiscardPromise;
340
- } else {
341
- throw new Error("The discard action cannot be executed on an active document");
342
- }
343
- }
344
-
345
- /**
346
- * Creates a draft document from an existing document.
347
- *
348
- * The function supports several hooks as there is a certain coreography defined.
349
- *
350
- * @function
351
- * @name sap.fe.core.actions.draft#createDraftFromActiveDocument
352
- * @memberof sap.fe.core.actions.draft
353
- * @static
354
- * @param {sap.ui.model.odata.v4.Context} oContext Context of the active document for the new draft
355
- * @param {object} oAppComponent The AppComponent
356
- * @param {object} mParameters The parameters
357
- * @param {boolean} [mParameters.bPreserveChanges] Preserve changes of an existing draft of another user
358
- * @param {boolean} [mParameters.bPrepareOnEdit] Also call prepare when calling draft creation
359
- * @param {sap.fe.core.actions.draft.ICallback.beforeCreateDraftFromActiveDocument} [mParameters.fnBeforeCreateDraftFromActiveDocument] Callback that allows veto before create request is executed
360
- * @param {sap.fe.core.actions.draft.ICallback.afterCreateDraftFromActiveDocument} [mParameters.fnAfterCreateDraftFromActiveDocument] Callback for postprocessiong after draft document was created
361
- * @param {sap.fe.core.actions.draft.ICallback.whenDecisionToOverwriteDocumentIsRequired} [mParameters.fnWhenDecisionToOverwriteDocumentIsRequired] Callback for deciding on overwriting an unsaved change by another user
362
- * @returns {Promise} Promise resolves with the {@link sap.ui.model.odata.v4.Context context} of the new draft document
363
- * @private
364
- * @ui5-restricted
365
- */
366
- function createDraftFromActiveDocument(oContext, oAppComponent, mParameters) {
367
- var mParam = mParameters || {},
368
- localI18nRef = sap.ui.getCore().getLibraryResourceBundle("sap.fe.core"),
369
- bRunPreserveChangesFlow =
370
- typeof mParam.bPreserveChanges === "undefined" ||
371
- (typeof mParam.bPreserveChanges === "boolean" && mParam.bPreserveChanges); //default true
372
-
373
- /**
374
- * Overwrite or reject based on fnWhenDecisionToOverwriteDocumentIsRequired.
375
- *
376
- * @param {*} bOverwrite Overwrite the change or not
377
- * @returns {Promise} Resolves with result of {@link sap.fe.core.actions#executeDraftEditAction}
378
- */
379
- function overwriteOnDemand(bOverwrite) {
380
- if (bOverwrite) {
381
- //Overwrite existing changes
382
- var oModel = oContext.getModel(),
383
- oResourceBundle,
384
- draftDataContext = oModel.bindContext(oContext.getPath() + "/DraftAdministrativeData").getBoundContext();
385
- return mParameters.oView
386
- .getModel("sap.fe.i18n")
387
- .getResourceBundle()
388
- .then(function(_oResourceBundle) {
389
- oResourceBundle = _oResourceBundle;
390
- return draftDataContext.requestObject();
391
- })
392
- .then(function(draftAdminData) {
393
- if (draftAdminData) {
394
- // remove all unbound transition messages as we show a special dialog
395
- messageHandling.removeUnboundTransitionMessages();
396
- var sInfo = draftAdminData.InProcessByUserDescription || draftAdminData.InProcessByUser;
397
- var sEntitySet = mParameters.oView.getViewData().entitySet;
398
- if (sInfo) {
399
- var sLockedByUserMsg = CommonUtils.getTranslatedText(
400
- "C_DRAFT_OBJECT_PAGE_DRAFT_LOCKED_BY_USER",
401
- oResourceBundle,
402
- sInfo,
403
- sEntitySet
404
- );
405
- MessageBox.error(sLockedByUserMsg);
406
- throw new Error(sLockedByUserMsg);
407
- } else {
408
- sInfo = draftAdminData.CreatedByUserDescription || draftAdminData.CreatedByUser;
409
- var sUnsavedChangesMsg = CommonUtils.getTranslatedText(
410
- "C_DRAFT_OBJECT_PAGE_DRAFT_UNSAVED_CHANGES",
411
- oResourceBundle,
412
- sInfo,
413
- sEntitySet
414
- );
415
- return showMessageBox(sUnsavedChangesMsg).then(function() {
416
- return executeDraftEditAction(oContext, false);
417
- });
418
- }
419
- }
420
- });
421
- }
422
- return Promise.reject(new Error("Draft creation aborted for document: " + oContext.getPath()));
423
- }
424
-
425
- function showMessageBox(sUnsavedChangesMsg) {
426
- return new Promise(function(resolve, reject) {
427
- var oDialog = new Dialog({
428
- title: localI18nRef.getText("C_DRAFT_OBJECT_PAGE_WARNING"),
429
- state: "Warning",
430
- content: new Text({
431
- text: sUnsavedChangesMsg
432
- }),
433
- beginButton: new Button({
434
- text: localI18nRef.getText("C_COMMON_OBJECT_PAGE_EDIT"),
435
- type: "Emphasized",
436
- press: function() {
437
- oDialog.close();
438
- resolve(true);
439
- }
440
- }),
441
- endButton: new Button({
442
- text: localI18nRef.getText("C_COMMON_OBJECT_PAGE_CANCEL"),
443
- press: function() {
444
- oDialog.close();
445
- reject("Draft creation aborted for document: " + oContext.getPath());
446
- }
447
- }),
448
- afterClose: function() {
449
- oDialog.destroy();
450
- }
451
- });
452
- oDialog.addStyleClass("sapUiContentPadding");
453
- oDialog.open();
454
- });
455
- }
456
-
457
- if (!oContext) {
458
- return Promise.reject(new Error("Binding context to active document is required"));
459
- }
460
-
461
- return Promise.resolve(
462
- mParam.fnBeforeCreateDraftFromActiveDocument
463
- ? mParam.fnBeforeCreateDraftFromActiveDocument(oContext, bRunPreserveChangesFlow)
464
- : true
465
- )
466
- .then(function(bExecute) {
467
- if (!bExecute) {
468
- throw new Error("Draft creation was aborted by extension for document: " + oContext.getPath());
469
- }
470
- return executeDraftEditAction(oContext, bRunPreserveChangesFlow).catch(function(oResponse) {
471
- //Only call back if error 409
472
- if (bRunPreserveChangesFlow && oResponse.status === 409) {
473
- return Promise.resolve(
474
- mParam.fnWhenDecisionToOverwriteDocumentIsRequired
475
- ? mParam.fnWhenDecisionToOverwriteDocumentIsRequired()
476
- : true
477
- ).then(overwriteOnDemand);
478
- } else {
479
- throw new Error(oResponse);
480
- }
481
- });
482
- })
483
- .then(function(oDraftContext) {
484
- return Promise.resolve(
485
- mParam.fnAfterCreateDraftFromActiveDocument
486
- ? mParam.fnAfterCreateDraftFromActiveDocument(oContext, oDraftContext)
487
- : oDraftContext
488
- );
489
- })
490
- .then(function(oDraftContext) {
491
- if (mParam.bPrepareOnEdit && hasPrepareAction(oDraftContext)) {
492
- return executeDraftPreparationAction(oDraftContext, oAppComponent, { bPrepareForEdit: true }).then(function() {
493
- return oDraftContext;
494
- });
495
- }
496
- return oDraftContext;
497
- })
498
- .catch(function(exc) {
499
- return Promise.reject(exc);
500
- });
501
- }
502
-
503
- /**
504
- * Creates an active document from a draft document.
505
- *
506
- * The function supports several hooks as there is a certain choreography defined.
507
- *
508
- * @function
509
- * @name sap.fe.core.actions.draft#activateDocument
510
- * @memberof sap.fe.core.actions.draft
511
- * @static
512
- * @param {sap.ui.model.odata.v4.Context} oContext Context of the active document for the new draft
513
- * @param {object} oAppComponent The AppComponent
514
- * @param {object} mParameters The parameters
515
- * @param {sap.fe.core.actions.draft.ICallback.fnBeforeActivateDocument} [mParameters.fnBeforeActivateDocument] Callback that allows veto before create request is executed
516
- * @param {sap.fe.core.actions.draft.ICallback.fnAfterActivateDocument} [mParameters.fnAfterActivateDocument] Callback for postprocessiong after document was activated.
517
- * @returns {Promise} Promise resolves with the {@link sap.ui.model.odata.v4.Context context} of the new draft document
518
- * @private
519
- * @ui5-restricted
520
- */
521
- function activateDocument(oContext, oAppComponent, mParameters) {
522
- var mParam = mParameters || {};
523
-
524
- if (!oContext) {
525
- return Promise.reject(new Error("Binding context to draft document is required"));
526
- }
527
- return Promise.resolve(mParam.fnBeforeActivateDocument ? mParam.fnBeforeActivateDocument(oContext) : true)
528
- .then(function(bExecute) {
529
- if (!bExecute) {
530
- return Promise.reject(
531
- new Error("Activation of the document was aborted by extension for document: " + oContext.getPath())
532
- );
533
- }
534
-
535
- if (!hasPrepareAction(oContext)) {
536
- return executeDraftActivationAction(oContext, oAppComponent);
537
- }
538
-
539
- /* activation requires preparation */
540
- var sBatchGroup = "draft";
541
- // we use the same batchGroup to force prepare and activate in a same batch but with different changeset
542
- var oPreparePromise = executeDraftPreparationAction(oContext, oAppComponent, {
543
- groupId: sBatchGroup,
544
- bPrepareForEdit: false
545
- });
546
- oContext.getModel().submitBatch(sBatchGroup);
547
-
548
- var oActivatePromise = executeDraftActivationAction(oContext, oAppComponent, sBatchGroup);
549
-
550
- return Promise.all([oPreparePromise, oActivatePromise])
551
- .then(function(values) {
552
- return values[1];
553
- })
554
- .catch(function(exc) {
555
- return Promise.reject(exc);
556
- });
557
- })
558
- .then(function(oActiveDocumentContext) {
559
- return Promise.resolve(
560
- mParam.fnAfterActivateDocument
561
- ? mParam.fnAfterActivateDocument(oContext, oActiveDocumentContext)
562
- : oActiveDocumentContext
563
- );
564
- })
565
- .catch(function(exc) {
566
- return Promise.reject(exc);
567
- });
568
- }
569
-
570
- /**
571
- * HTTP POST call when DraftAction is present for Draft Delete; HTTP DELETE for Draft(when no DraftAction)
572
- * and Active Instance uses DELETE always.
573
- *
574
- * @function
575
- * @name sap.fe.core.actions.draft#deleteDraft
576
- * @memberof sap.fe.core.actions.draft
577
- * @static
578
- * @param {sap.ui.model.odata.v4.Context} oContext Context of the document to be discarded
579
- * @private
580
- * @returns {Promise}
581
- * @ui5-restricted
582
- */
583
- function deleteDraft(oContext) {
584
- var sDiscardAction = getActionName(oContext, draftOperations.DISCARD),
585
- bIsActiveEntity = oContext.getObject().IsActiveEntity;
586
-
587
- if (bIsActiveEntity || (!bIsActiveEntity && !sDiscardAction)) {
588
- //Use Delete in case of active entity and no discard action available for draft
589
- if (oContext.hasPendingChanges()) {
590
- oContext
591
- .getBinding()
592
- .resetChanges()
593
- .then(function() {
594
- return oContext.delete();
595
- })
596
- .catch(function(error) {
597
- return Promise.reject(error);
598
- });
599
- } else {
600
- return oContext.delete();
601
- }
602
- } else {
603
- //Use Discard Post Action if it is a draft entity and discard action exists
604
- return executeDraftDiscardAction(oContext);
605
- }
606
- }
607
-
608
- return draft;
609
- }
610
- );
5
+ sap.ui.define(["sap/base/Log", "sap/fe/core/actions/messageHandling", "sap/fe/core/CommonUtils", "sap/m/Button", "sap/m/Dialog", "sap/m/MessageBox", "sap/m/Text"], function (Log, messageHandling, CommonUtils, Button, Dialog, MessageBox, Text) {
6
+ "use strict";
7
+
8
+ /**
9
+ * Interface for callbacks used in the functions
10
+ *
11
+ *
12
+ * @author SAP SE
13
+ * @since 1.54.0
14
+ * @interface
15
+ * @name sap.fe.core.actions.draft.ICallback
16
+ * @private
17
+ */
18
+
19
+ /**
20
+ * Callback to approve or reject the creation of a draft
21
+ * @name sap.fe.core.actions.draft.ICallback.beforeCreateDraftFromActiveDocument
22
+ * @function
23
+ * @static
24
+ * @abstract
25
+ * @param {sap.ui.model.odata.v4.Context} oContext Context of the active document for the new draft
26
+ * @returns {(boolean|Promise)} Approval of draft creation [true|false] or Promise that resolves with the boolean value
27
+ *
28
+ * @private
29
+ */
30
+
31
+ /**
32
+ * Callback after a draft was successully created
33
+ * @name sap.fe.core.actions.draft.ICallback.afterCreateDraftFromActiveDocument
34
+ * @function
35
+ * @static
36
+ * @abstract
37
+ * @param {sap.ui.model.odata.v4.Context} oContext Context of the new draft
38
+ * @param {sap.ui.model.odata.v4.Context} oActiveDocumentContext Context of the active document for the new draft
39
+ * @returns {sap.ui.model.odata.v4.Context} oActiveDocumentContext
40
+ *
41
+ * @private
42
+ */
43
+
44
+ /**
45
+ * Callback to approve or reject overwriting an unsaved draft of another user
46
+ * @name sap.fe.core.actions.draft.ICallback.whenDecisionToOverwriteDocumentIsRequired
47
+ * @function
48
+ * @public
49
+ * @static
50
+ * @abstract
51
+ *
52
+ * @param {sap.ui.model.odata.v4.Context} oContext Context of the active document for the new draft
53
+ * @returns {(boolean|Promise)} Approval to overwrite unsaved draft [true|false] or Promise that resolves with the boolean value
54
+ *
55
+ * @ui5-restricted
56
+ */
57
+
58
+ /* Constants for draft operations */
59
+ var draftOperations = {
60
+ EDIT: "EditAction",
61
+ ACTIVATION: "ActivationAction",
62
+ DISCARD: "DiscardAction",
63
+ PREPARE: "PreparationAction"
64
+ };
65
+ /**
66
+ * Static functions for the draft programming model
67
+ *
68
+ * @namespace
69
+ * @alias sap.fe.core.actions.draft
70
+ * @private
71
+ * @experimental This module is only for experimental use! <br/><b>This is only a POC and maybe deleted</b>
72
+ * @since 1.54.0
73
+ */
74
+
75
+ var draft = {
76
+ createDraftFromActiveDocument: createDraftFromActiveDocument,
77
+ activateDocument: activateDocument,
78
+ deleteDraft: deleteDraft
79
+ };
80
+ /**
81
+ * Determines action name for a draft operation.
82
+ *
83
+ * @param {sap.ui.model.odata.v4.Context} oContext The context that should be bound to the operation
84
+ * @param {string} sOperation The operation name
85
+ * @returns {string} The name of the draft operation
86
+ */
87
+
88
+ function getActionName(oContext, sOperation) {
89
+ var oModel = oContext.getModel(),
90
+ oMetaModel = oModel.getMetaModel(),
91
+ sEntitySetPath = oMetaModel.getMetaPath(oContext.getPath());
92
+ return oMetaModel.getObject(sEntitySetPath + "@com.sap.vocabularies.Common.v1.DraftRoot/" + sOperation);
93
+ }
94
+ /**
95
+ * Creates an operation context binding for the given context and operation.
96
+ *
97
+ * @param {sap.ui.model.odata.v4.Context} oContext The context that should be bound to the operation
98
+ * @param {string} sOperation The operation (action or function import)
99
+ * @param oOptions Options to create the operation context
100
+ * @returns {sap.ui.model.odata.v4.ODataContextBinding} The context binding of the bound operation
101
+ */
102
+
103
+
104
+ function createOperation(oContext, sOperation, oOptions) {
105
+ var sOperationName = getActionName(oContext, sOperation);
106
+ return oContext.getModel().bindContext(sOperationName + "(...)", oContext, oOptions);
107
+ }
108
+ /**
109
+ * Check if optional draft prepare action exists.
110
+ *
111
+ * @param {sap.ui.model.odata.v4.Context} oContext The context that should be bound to the operation
112
+ * @returns {boolean} True if a a prepare action exists
113
+ */
114
+
115
+
116
+ function hasPrepareAction(oContext) {
117
+ return !!getActionName(oContext, draftOperations.PREPARE);
118
+ }
119
+ /**
120
+ * Creates a new draft from an active document.
121
+ *
122
+ * @function
123
+ * @param {sap.ui.model.odata.v4.Context} oContext Context for which the action should be performed
124
+ * @param {boolean} bPreserveChanges If true - existing changes from another user that are not locked are preserved and an error message (http status 409) is send from the backend, otherwise false - existing changes from another user that are not locked are overwritten</li>
125
+ * @returns {Promise.<sap.ui.model.odata.v4.Context>} Resolve function returns the context of the operation
126
+ * @private
127
+ * @ui5-restricted
128
+ */
129
+
130
+
131
+ function executeDraftEditAction(oContext, bPreserveChanges) {
132
+ if (oContext.getProperty("IsActiveEntity")) {
133
+ var oOptions = {
134
+ $$inheritExpandSelect: true
135
+ };
136
+ var oOperation = createOperation(oContext, draftOperations.EDIT, oOptions);
137
+ oOperation.setParameter("PreserveChanges", bPreserveChanges);
138
+ var sGroupId = "direct";
139
+ var oEditPromise = oOperation.execute(sGroupId).then(function (oDraftDocumentContext) {
140
+ return oDraftDocumentContext;
141
+ });
142
+ oOperation.getModel().submitBatch(sGroupId);
143
+ return oEditPromise;
144
+ } else {
145
+ throw new Error("You cannot edit this draft document");
146
+ }
147
+ }
148
+ /*function fnOnStrictHandlingFailed(oContext: any, sGroupId: any, aMessages: any) { //Will uncomment this function in the commit : 5513510
149
+ if (aMessages.length === 1) {
150
+ const sMessage = aMessages[0].message,
151
+ dialogPromise = new Promise(function(resolve: (value: any) => void) {
152
+ sap.ui.require(["sap/m/MessageBox"], function(MessageBox: any) {
153
+ MessageBox.warning(sMessage, {
154
+ title: "Warning",
155
+ actions: [MessageBox.Action.OK, MessageBox.Action.CANCEL],
156
+ onClose: function(sAction: any) {
157
+ if (sAction === MessageBox.Action.OK) {
158
+ resolve(true);
159
+ oContext.getModel().submitBatch(sGroupId);
160
+ } else {
161
+ resolve(false);
162
+ }
163
+ }
164
+ });
165
+ });
166
+ });
167
+ return dialogPromise;
168
+ }
169
+ }*/
170
+
171
+ /**
172
+ * Activates a draft document. The draft will replace the sibling entity and will be deleted by the back end.
173
+ *
174
+ * @function
175
+ * @param {sap.ui.model.odata.v4.Context} oContext Context for which the action should be performed
176
+ * @param {object} oAppComponent The AppComponent
177
+ * @param {string} [sGroupId] The optional batch group in which the operation is to be executed
178
+ * @returns {Promise.<sap.ui.model.odata.v4.Context>} Resolve function returns the context of the operation
179
+ * @private
180
+ * @ui5-restricted
181
+ */
182
+
183
+
184
+ function executeDraftActivationAction(oContext, oAppComponent, sGroupId) {
185
+ var bHasPrepareAction = hasPrepareAction(oContext); // According to the draft spec if the service contains a prepare action and we trigger both prepare and
186
+ // activate in one $batch the activate action is called with iF-Match=*
187
+
188
+ var bIgnoreEtag = bHasPrepareAction;
189
+
190
+ if (!oContext.getProperty("IsActiveEntity")) {
191
+ var oOperation = createOperation(oContext, draftOperations.ACTIVATION, {
192
+ $$inheritExpandSelect: true
193
+ });
194
+ return oOperation.execute(sGroupId, bIgnoreEtag).then(function (oActiveDocumentContext) {
195
+ return oActiveDocumentContext;
196
+ }).catch( //if ACTIVATE action fails then we request either the sideEffects against PREPARE action (if annotated) or the messages as fallback:
197
+ function () {
198
+ if (bHasPrepareAction) {
199
+ var sActionName = getActionName(oContext, draftOperations.PREPARE),
200
+ oSideEffectsService = oAppComponent.getSideEffectsService(),
201
+ oBindingParameters = oSideEffectsService.getODataActionSideEffects(sActionName, oContext),
202
+ aTargetPaths = oBindingParameters && oBindingParameters.pathExpressions;
203
+
204
+ if (aTargetPaths && aTargetPaths.length > 0) {
205
+ oSideEffectsService.requestSideEffects(aTargetPaths, oContext).catch(function (oError) {
206
+ Log.error("Error while requesting side effects", oError);
207
+ });
208
+ } else {
209
+ requestMessages(oContext, oSideEffectsService).catch(function (oError) {
210
+ Log.error("Error while requesting messages", oError);
211
+ });
212
+ }
213
+ }
214
+
215
+ return Promise.reject();
216
+ });
217
+ } else {
218
+ throw new Error("The activation action cannot be executed on an active document");
219
+ }
220
+ }
221
+ /**
222
+ * Execute a preparation action.
223
+ *
224
+ * @function
225
+ * @param {sap.ui.model.odata.v4.Context} oContext Context for which the action should be performed
226
+ * @param {object} oAppComponent The AppComponent
227
+ * @param {object} mParameters The parameters
228
+ * @param {boolean} [mParameters.groupId] The optional batch group where we want to execute the operation in
229
+ * @param {boolean} [mParameters.bPrepareForEdit] Shall the messages be requested if supported by service
230
+ * @returns {Promise.<sap.ui.model.odata.v4.Context>} Resolve function returns the context of the operation
231
+ * @private
232
+ * @ui5-restricted
233
+ */
234
+
235
+
236
+ function executeDraftPreparationAction(oContext, oAppComponent, mParameters) {
237
+ var mParams = mParameters || {};
238
+
239
+ if (!oContext.getProperty("IsActiveEntity")) {
240
+ var oOperation = createOperation(oContext, draftOperations.PREPARE); // TODO: side effects qualifier shall be even deprecated to be checked
241
+
242
+ oOperation.setParameter("SideEffectsQualifier", "");
243
+ var sGroupId = mParams.groupId || oOperation.getGroupId();
244
+ var oPreparationPromise = oOperation.execute(sGroupId).then(function () {
245
+ if (mParams.bPrepareForEdit) {
246
+ // if PREPARE action is triggered after Edit then either the sideEffects (if annotated against PREPARE) are executed or the messages are requested as fallback if no sideEffects:
247
+ var sActionName = getActionName(oContext, draftOperations.PREPARE),
248
+ oSideEffectsService = oAppComponent.getSideEffectsService(),
249
+ oBindingParameters = oSideEffectsService.getODataActionSideEffects(sActionName, oContext),
250
+ aTargetPaths = oBindingParameters && oBindingParameters.pathExpressions;
251
+
252
+ if (aTargetPaths && aTargetPaths.length > 0) {
253
+ oSideEffectsService.requestSideEffects(aTargetPaths, oContext, sGroupId).catch(function (oError) {
254
+ Log.error("Error while requesting side effects", oError);
255
+ });
256
+ } else {
257
+ requestMessages(oContext, oSideEffectsService);
258
+ }
259
+ }
260
+
261
+ return oOperation;
262
+ }).catch(function (oError) {
263
+ Log.error("Error while executing the operation", oError);
264
+ });
265
+ return oPreparationPromise;
266
+ } else {
267
+ throw new Error("The preparation action cannot be executed on an active document");
268
+ }
269
+ }
270
+ /**
271
+ * Determines the message path for a context.
272
+ *
273
+ * @function
274
+ * @param {sap.ui.model.odata.v4.Context} oContext Context for which the path shall be determined
275
+ * @returns {string} Message path, empty if not annotated
276
+ * @private
277
+ * @ui5-restricted
278
+ */
279
+
280
+
281
+ function getMessagesPath(oContext) {
282
+ var oModel = oContext.getModel(),
283
+ oMetaModel = oModel.getMetaModel(),
284
+ sEntitySetPath = oMetaModel.getMetaPath(oContext.getPath());
285
+ return oMetaModel.getObject(sEntitySetPath + "/@com.sap.vocabularies.Common.v1.Messages/$Path");
286
+ }
287
+ /**
288
+ * Requests the messages if annotated for a given context.
289
+ *
290
+ * @function
291
+ * @param {sap.ui.model.odata.v4.Context} oContext Context for which the messages shall be requested
292
+ * @param {object} oSideEffectsService Service for the SideEffects on SAP Fiori elements
293
+ * @returns {Promise} Promise which is resolved once messages were requested
294
+ * @private
295
+ * @ui5-restricted
296
+ */
297
+
298
+
299
+ function requestMessages(oContext, oSideEffectsService) {
300
+ var sMessagesPath = getMessagesPath(oContext);
301
+
302
+ if (sMessagesPath) {
303
+ return oSideEffectsService.requestSideEffects([{
304
+ $PropertyPath: sMessagesPath
305
+ }], oContext);
306
+ }
307
+
308
+ return Promise.resolve();
309
+ }
310
+ /**
311
+ * Executes discard of a draft function using HTTP Post.
312
+ *
313
+ * @function
314
+ * @param {sap.ui.model.odata.v4.Context} oContext Context for which the action should be performed
315
+ * @returns {Promise.<sap.ui.model.odata.v4.Context>} Resolve function returns the context of the operation
316
+ * @private
317
+ * @ui5-restricted
318
+ */
319
+
320
+
321
+ function executeDraftDiscardAction(oContext) {
322
+ if (!oContext.getProperty("IsActiveEntity")) {
323
+ var oDiscardOperation = createOperation(oContext, draftOperations.DISCARD);
324
+ var oDiscardPromise = oDiscardOperation.execute("direct");
325
+ oContext.getModel().submitBatch("direct");
326
+ return oDiscardPromise;
327
+ } else {
328
+ throw new Error("The discard action cannot be executed on an active document");
329
+ }
330
+ }
331
+ /**
332
+ * Creates a draft document from an existing document.
333
+ *
334
+ * The function supports several hooks as there is a certain coreography defined.
335
+ *
336
+ * @function
337
+ * @name sap.fe.core.actions.draft#createDraftFromActiveDocument
338
+ * @memberof sap.fe.core.actions.draft
339
+ * @static
340
+ * @param {sap.ui.model.odata.v4.Context} oContext Context of the active document for the new draft
341
+ * @param {object} oAppComponent The AppComponent
342
+ * @param {object} mParameters The parameters
343
+ * @param {boolean} [mParameters.oView] The view
344
+ * @param {boolean} [mParameters.bPreserveChanges] Preserve changes of an existing draft of another user
345
+ * @param {boolean} [mParameters.bPrepareOnEdit] Also call prepare when calling draft creation
346
+ * @param {sap.fe.core.actions.draft.ICallback.beforeCreateDraftFromActiveDocument} [mParameters.fnBeforeCreateDraftFromActiveDocument] Callback that allows veto before create request is executed
347
+ * @param {sap.fe.core.actions.draft.ICallback.afterCreateDraftFromActiveDocument} [mParameters.fnAfterCreateDraftFromActiveDocument] Callback for postprocessiong after draft document was created
348
+ * @param {sap.fe.core.actions.draft.ICallback.whenDecisionToOverwriteDocumentIsRequired} [mParameters.fnWhenDecisionToOverwriteDocumentIsRequired] Callback for deciding on overwriting an unsaved change by another user
349
+ * @returns {Promise} Promise resolves with the {@link sap.ui.model.odata.v4.Context context} of the new draft document
350
+ * @private
351
+ * @ui5-restricted
352
+ */
353
+
354
+
355
+ function createDraftFromActiveDocument(oContext, oAppComponent, mParameters) {
356
+ var mParam = mParameters || {},
357
+ localI18nRef = sap.ui.getCore().getLibraryResourceBundle("sap.fe.core"),
358
+ bRunPreserveChangesFlow = typeof mParam.bPreserveChanges === "undefined" || typeof mParam.bPreserveChanges === "boolean" && mParam.bPreserveChanges; //default true
359
+
360
+ /**
361
+ * Overwrite or reject based on fnWhenDecisionToOverwriteDocumentIsRequired.
362
+ *
363
+ * @param {*} bOverwrite Overwrite the change or not
364
+ * @returns {Promise} Resolves with result of {@link sap.fe.core.actions#executeDraftEditAction}
365
+ */
366
+
367
+ function overwriteOnDemand(bOverwrite) {
368
+ if (bOverwrite) {
369
+ //Overwrite existing changes
370
+ var oModel = oContext.getModel();
371
+ var draftDataContext = oModel.bindContext(oContext.getPath() + "/DraftAdministrativeData").getBoundContext();
372
+ var oResourceBundle;
373
+ return mParameters.oView.getModel("sap.fe.i18n").getResourceBundle().then(function (_oResourceBundle) {
374
+ oResourceBundle = _oResourceBundle;
375
+ return draftDataContext.requestObject();
376
+ }).then(function (draftAdminData) {
377
+ if (draftAdminData) {
378
+ // remove all unbound transition messages as we show a special dialog
379
+ messageHandling.removeUnboundTransitionMessages();
380
+ var sInfo = draftAdminData.InProcessByUserDescription || draftAdminData.InProcessByUser;
381
+ var sEntitySet = mParameters.oView.getViewData().entitySet;
382
+
383
+ if (sInfo) {
384
+ var sLockedByUserMsg = CommonUtils.getTranslatedText("C_DRAFT_OBJECT_PAGE_DRAFT_LOCKED_BY_USER", oResourceBundle, sInfo, sEntitySet);
385
+ MessageBox.error(sLockedByUserMsg);
386
+ throw new Error(sLockedByUserMsg);
387
+ } else {
388
+ sInfo = draftAdminData.CreatedByUserDescription || draftAdminData.CreatedByUser;
389
+ var sUnsavedChangesMsg = CommonUtils.getTranslatedText("C_DRAFT_OBJECT_PAGE_DRAFT_UNSAVED_CHANGES", oResourceBundle, sInfo, sEntitySet);
390
+ return showMessageBox(sUnsavedChangesMsg).then(function () {
391
+ return executeDraftEditAction(oContext, false);
392
+ });
393
+ }
394
+ }
395
+ });
396
+ }
397
+
398
+ return Promise.reject(new Error("Draft creation aborted for document: " + oContext.getPath()));
399
+ }
400
+
401
+ function showMessageBox(sUnsavedChangesMsg) {
402
+ return new Promise(function (resolve, reject) {
403
+ var oDialog = new Dialog({
404
+ title: localI18nRef.getText("C_DRAFT_OBJECT_PAGE_WARNING"),
405
+ state: "Warning",
406
+ content: new Text({
407
+ text: sUnsavedChangesMsg
408
+ }),
409
+ beginButton: new Button({
410
+ text: localI18nRef.getText("C_COMMON_OBJECT_PAGE_EDIT"),
411
+ type: "Emphasized",
412
+ press: function () {
413
+ oDialog.close();
414
+ resolve(true);
415
+ }
416
+ }),
417
+ endButton: new Button({
418
+ text: localI18nRef.getText("C_COMMON_OBJECT_PAGE_CANCEL"),
419
+ press: function () {
420
+ oDialog.close();
421
+ reject("Draft creation aborted for document: " + oContext.getPath());
422
+ }
423
+ }),
424
+ afterClose: function () {
425
+ oDialog.destroy();
426
+ }
427
+ });
428
+ oDialog.addStyleClass("sapUiContentPadding");
429
+ oDialog.open();
430
+ });
431
+ }
432
+
433
+ if (!oContext) {
434
+ return Promise.reject(new Error("Binding context to active document is required"));
435
+ }
436
+
437
+ return Promise.resolve(mParam.fnBeforeCreateDraftFromActiveDocument ? mParam.fnBeforeCreateDraftFromActiveDocument(oContext, bRunPreserveChangesFlow) : true).then(function (bExecute) {
438
+ if (!bExecute) {
439
+ throw new Error("Draft creation was aborted by extension for document: " + oContext.getPath());
440
+ }
441
+
442
+ return executeDraftEditAction(oContext, bRunPreserveChangesFlow).catch(function (oResponse) {
443
+ //Only call back if error 409
444
+ if (bRunPreserveChangesFlow && oResponse.status === 409) {
445
+ messageHandling.removeBoundTransitionMessages();
446
+ messageHandling.removeUnboundTransitionMessages();
447
+ return Promise.resolve(mParam.fnWhenDecisionToOverwriteDocumentIsRequired ? mParam.fnWhenDecisionToOverwriteDocumentIsRequired() : true).then(overwriteOnDemand);
448
+ } else {
449
+ throw new Error(oResponse);
450
+ }
451
+ });
452
+ }).then(function (oDraftContext) {
453
+ return Promise.resolve(mParam.fnAfterCreateDraftFromActiveDocument ? mParam.fnAfterCreateDraftFromActiveDocument(oContext, oDraftContext) : oDraftContext);
454
+ }).then(function (oDraftContext) {
455
+ if (mParam.bPrepareOnEdit && hasPrepareAction(oDraftContext)) {
456
+ return executeDraftPreparationAction(oDraftContext, oAppComponent, {
457
+ bPrepareForEdit: true
458
+ }).then(function () {
459
+ return oDraftContext;
460
+ });
461
+ }
462
+
463
+ return oDraftContext;
464
+ }).catch(function (exc) {
465
+ return Promise.reject(exc);
466
+ });
467
+ }
468
+ /**
469
+ * Creates an active document from a draft document.
470
+ *
471
+ * The function supports several hooks as there is a certain choreography defined.
472
+ *
473
+ * @function
474
+ * @name sap.fe.core.actions.draft#activateDocument
475
+ * @memberof sap.fe.core.actions.draft
476
+ * @static
477
+ * @param {sap.ui.model.odata.v4.Context} oContext Context of the active document for the new draft
478
+ * @param {object} oAppComponent The AppComponent
479
+ * @param {object} mParameters The parameters
480
+ * @param {sap.fe.core.actions.draft.ICallback.fnBeforeActivateDocument} [mParameters.fnBeforeActivateDocument] Callback that allows veto before create request is executed
481
+ * @param {sap.fe.core.actions.draft.ICallback.fnAfterActivateDocument} [mParameters.fnAfterActivateDocument] Callback for postprocessiong after document was activated.
482
+ * @returns {Promise} Promise resolves with the {@link sap.ui.model.odata.v4.Context context} of the new draft document
483
+ * @private
484
+ * @ui5-restricted
485
+ */
486
+
487
+
488
+ function activateDocument(oContext, oAppComponent, mParameters) {
489
+ var mParam = mParameters || {};
490
+
491
+ if (!oContext) {
492
+ return Promise.reject(new Error("Binding context to draft document is required"));
493
+ }
494
+
495
+ return Promise.resolve(mParam.fnBeforeActivateDocument ? mParam.fnBeforeActivateDocument(oContext) : true).then(function (bExecute) {
496
+ if (!bExecute) {
497
+ return Promise.reject(new Error("Activation of the document was aborted by extension for document: " + oContext.getPath()));
498
+ }
499
+
500
+ if (!hasPrepareAction(oContext)) {
501
+ return executeDraftActivationAction(oContext, oAppComponent);
502
+ }
503
+ /* activation requires preparation */
504
+
505
+
506
+ var sBatchGroup = "draft"; // we use the same batchGroup to force prepare and activate in a same batch but with different changeset
507
+
508
+ var oPreparePromise = executeDraftPreparationAction(oContext, oAppComponent, {
509
+ groupId: sBatchGroup,
510
+ bPrepareForEdit: false
511
+ });
512
+ oContext.getModel().submitBatch(sBatchGroup);
513
+ var oActivatePromise = executeDraftActivationAction(oContext, oAppComponent, sBatchGroup);
514
+ return Promise.all([oPreparePromise, oActivatePromise]).then(function (values) {
515
+ return values[1];
516
+ }).catch(function (exc) {
517
+ return Promise.reject(exc);
518
+ });
519
+ }).then(function (oActiveDocumentContext) {
520
+ return Promise.resolve(mParam.fnAfterActivateDocument ? mParam.fnAfterActivateDocument(oContext, oActiveDocumentContext) : oActiveDocumentContext);
521
+ }).catch(function (exc) {
522
+ return Promise.reject(exc);
523
+ });
524
+ }
525
+ /**
526
+ * HTTP POST call when DraftAction is present for Draft Delete; HTTP DELETE for Draft(when no DraftAction)
527
+ * and Active Instance uses DELETE always.
528
+ *
529
+ * @function
530
+ * @name sap.fe.core.actions.draft#deleteDraft
531
+ * @memberof sap.fe.core.actions.draft
532
+ * @static
533
+ * @param {sap.ui.model.odata.v4.Context} oContext Context of the document to be discarded
534
+ * @private
535
+ * @returns {Promise}
536
+ * @ui5-restricted
537
+ */
538
+
539
+
540
+ function deleteDraft(oContext) {
541
+ var sDiscardAction = getActionName(oContext, draftOperations.DISCARD),
542
+ bIsActiveEntity = oContext.getObject().IsActiveEntity;
543
+
544
+ if (bIsActiveEntity || !bIsActiveEntity && !sDiscardAction) {
545
+ //Use Delete in case of active entity and no discard action available for draft
546
+ if (oContext.hasPendingChanges()) {
547
+ return oContext.getBinding().resetChanges().then(function () {
548
+ return oContext.delete();
549
+ }).catch(function (error) {
550
+ return Promise.reject(error);
551
+ });
552
+ } else {
553
+ return oContext.delete();
554
+ }
555
+ } else {
556
+ //Use Discard Post Action if it is a draft entity and discard action exists
557
+ return executeDraftDiscardAction(oContext);
558
+ }
559
+ }
560
+
561
+ return draft;
562
+ }, false);
563
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImRyYWZ0LnRzIl0sIm5hbWVzIjpbImRyYWZ0T3BlcmF0aW9ucyIsIkVESVQiLCJBQ1RJVkFUSU9OIiwiRElTQ0FSRCIsIlBSRVBBUkUiLCJkcmFmdCIsImNyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50IiwiYWN0aXZhdGVEb2N1bWVudCIsImRlbGV0ZURyYWZ0IiwiZ2V0QWN0aW9uTmFtZSIsIm9Db250ZXh0Iiwic09wZXJhdGlvbiIsIm9Nb2RlbCIsImdldE1vZGVsIiwib01ldGFNb2RlbCIsImdldE1ldGFNb2RlbCIsInNFbnRpdHlTZXRQYXRoIiwiZ2V0TWV0YVBhdGgiLCJnZXRQYXRoIiwiZ2V0T2JqZWN0IiwiY3JlYXRlT3BlcmF0aW9uIiwib09wdGlvbnMiLCJzT3BlcmF0aW9uTmFtZSIsImJpbmRDb250ZXh0IiwiaGFzUHJlcGFyZUFjdGlvbiIsImV4ZWN1dGVEcmFmdEVkaXRBY3Rpb24iLCJiUHJlc2VydmVDaGFuZ2VzIiwiZ2V0UHJvcGVydHkiLCIkJGluaGVyaXRFeHBhbmRTZWxlY3QiLCJvT3BlcmF0aW9uIiwic2V0UGFyYW1ldGVyIiwic0dyb3VwSWQiLCJvRWRpdFByb21pc2UiLCJleGVjdXRlIiwidGhlbiIsIm9EcmFmdERvY3VtZW50Q29udGV4dCIsInN1Ym1pdEJhdGNoIiwiRXJyb3IiLCJleGVjdXRlRHJhZnRBY3RpdmF0aW9uQWN0aW9uIiwib0FwcENvbXBvbmVudCIsImJIYXNQcmVwYXJlQWN0aW9uIiwiYklnbm9yZUV0YWciLCJvQWN0aXZlRG9jdW1lbnRDb250ZXh0IiwiY2F0Y2giLCJzQWN0aW9uTmFtZSIsIm9TaWRlRWZmZWN0c1NlcnZpY2UiLCJnZXRTaWRlRWZmZWN0c1NlcnZpY2UiLCJvQmluZGluZ1BhcmFtZXRlcnMiLCJnZXRPRGF0YUFjdGlvblNpZGVFZmZlY3RzIiwiYVRhcmdldFBhdGhzIiwicGF0aEV4cHJlc3Npb25zIiwibGVuZ3RoIiwicmVxdWVzdFNpZGVFZmZlY3RzIiwib0Vycm9yIiwiTG9nIiwiZXJyb3IiLCJyZXF1ZXN0TWVzc2FnZXMiLCJQcm9taXNlIiwicmVqZWN0IiwiZXhlY3V0ZURyYWZ0UHJlcGFyYXRpb25BY3Rpb24iLCJtUGFyYW1ldGVycyIsIm1QYXJhbXMiLCJncm91cElkIiwiZ2V0R3JvdXBJZCIsIm9QcmVwYXJhdGlvblByb21pc2UiLCJiUHJlcGFyZUZvckVkaXQiLCJnZXRNZXNzYWdlc1BhdGgiLCJzTWVzc2FnZXNQYXRoIiwiJFByb3BlcnR5UGF0aCIsInJlc29sdmUiLCJleGVjdXRlRHJhZnREaXNjYXJkQWN0aW9uIiwib0Rpc2NhcmRPcGVyYXRpb24iLCJvRGlzY2FyZFByb21pc2UiLCJtUGFyYW0iLCJsb2NhbEkxOG5SZWYiLCJzYXAiLCJ1aSIsImdldENvcmUiLCJnZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUiLCJiUnVuUHJlc2VydmVDaGFuZ2VzRmxvdyIsIm92ZXJ3cml0ZU9uRGVtYW5kIiwiYk92ZXJ3cml0ZSIsImRyYWZ0RGF0YUNvbnRleHQiLCJnZXRCb3VuZENvbnRleHQiLCJvUmVzb3VyY2VCdW5kbGUiLCJvVmlldyIsImdldFJlc291cmNlQnVuZGxlIiwiX29SZXNvdXJjZUJ1bmRsZSIsInJlcXVlc3RPYmplY3QiLCJkcmFmdEFkbWluRGF0YSIsIm1lc3NhZ2VIYW5kbGluZyIsInJlbW92ZVVuYm91bmRUcmFuc2l0aW9uTWVzc2FnZXMiLCJzSW5mbyIsIkluUHJvY2Vzc0J5VXNlckRlc2NyaXB0aW9uIiwiSW5Qcm9jZXNzQnlVc2VyIiwic0VudGl0eVNldCIsImdldFZpZXdEYXRhIiwiZW50aXR5U2V0Iiwic0xvY2tlZEJ5VXNlck1zZyIsIkNvbW1vblV0aWxzIiwiZ2V0VHJhbnNsYXRlZFRleHQiLCJNZXNzYWdlQm94IiwiQ3JlYXRlZEJ5VXNlckRlc2NyaXB0aW9uIiwiQ3JlYXRlZEJ5VXNlciIsInNVbnNhdmVkQ2hhbmdlc01zZyIsInNob3dNZXNzYWdlQm94Iiwib0RpYWxvZyIsIkRpYWxvZyIsInRpdGxlIiwiZ2V0VGV4dCIsInN0YXRlIiwiY29udGVudCIsIlRleHQiLCJ0ZXh0IiwiYmVnaW5CdXR0b24iLCJCdXR0b24iLCJ0eXBlIiwicHJlc3MiLCJjbG9zZSIsImVuZEJ1dHRvbiIsImFmdGVyQ2xvc2UiLCJkZXN0cm95IiwiYWRkU3R5bGVDbGFzcyIsIm9wZW4iLCJmbkJlZm9yZUNyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50IiwiYkV4ZWN1dGUiLCJvUmVzcG9uc2UiLCJzdGF0dXMiLCJyZW1vdmVCb3VuZFRyYW5zaXRpb25NZXNzYWdlcyIsImZuV2hlbkRlY2lzaW9uVG9PdmVyd3JpdGVEb2N1bWVudElzUmVxdWlyZWQiLCJvRHJhZnRDb250ZXh0IiwiZm5BZnRlckNyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50IiwiYlByZXBhcmVPbkVkaXQiLCJleGMiLCJmbkJlZm9yZUFjdGl2YXRlRG9jdW1lbnQiLCJzQmF0Y2hHcm91cCIsIm9QcmVwYXJlUHJvbWlzZSIsIm9BY3RpdmF0ZVByb21pc2UiLCJhbGwiLCJ2YWx1ZXMiLCJmbkFmdGVyQWN0aXZhdGVEb2N1bWVudCIsInNEaXNjYXJkQWN0aW9uIiwiYklzQWN0aXZlRW50aXR5IiwiSXNBY3RpdmVFbnRpdHkiLCJoYXNQZW5kaW5nQ2hhbmdlcyIsImdldEJpbmRpbmciLCJyZXNldENoYW5nZXMiLCJkZWxldGUiXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7Ozs7QUFhQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFDQTtBQUNBLE1BQU1BLGVBQWUsR0FBRztBQUN2QkMsSUFBQUEsSUFBSSxFQUFFLFlBRGlCO0FBRXZC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ekMsQ0FBakMsR0FBb0dBLHNCQUQ5RixDQUFQO0FBR0EsS0FqQ0ssRUFrQ0xDLEtBbENLLENBa0NDLFVBQVUwRixHQUFWLEVBQW9CO0FBQzFCLGFBQU81RSxPQUFPLENBQUNDLE1BQVIsQ0FBZTJFLEdBQWYsQ0FBUDtBQUNBLEtBcENLLENBQVA7QUFxQ0E7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ0EsV0FBUzdILFdBQVQsQ0FBcUJFLFFBQXJCLEVBQXNEO0FBQ3JELFFBQU1tSSxjQUFjLEdBQUdwSSxhQUFhLENBQUNDLFFBQUQsRUFBV1YsZUFBZSxDQUFDRyxPQUEzQixDQUFwQztBQUFBLFFBQ0MySSxlQUFlLEdBQUdwSSxRQUFRLENBQUNTLFNBQVQsR0FBcUI0SCxjQUR4Qzs7QUFHQSxRQUFJRCxlQUFlLElBQUssQ0FBQ0EsZUFBRCxJQUFvQixDQUFDRCxjQUE3QyxFQUE4RDtBQUM3RDtBQUNBLFVBQUluSSxRQUFRLENBQUNzSSxpQkFBVCxFQUFKLEVBQWtDO0FBQ2pDLGVBQU90SSxRQUFRLENBQ2J1SSxVQURLLEdBRUxDLFlBRkssR0FHTGhILElBSEssQ0FHQSxZQUFZO0FBQ2pCLGlCQUFPeEIsUUFBUSxDQUFDeUksTUFBVCxFQUFQO0FBQ0EsU0FMSyxFQU1MeEcsS0FOSyxDQU1DLFVBQVVZLEtBQVYsRUFBc0I7QUFDNUIsaUJBQU9FLE9BQU8sQ0FBQ0MsTUFBUixDQUFlSCxLQUFmLENBQVA7QUFDQSxTQVJLLENBQVA7QUFTQSxPQVZELE1BVU87QUFDTixlQUFPN0MsUUFBUSxDQUFDeUksTUFBVCxFQUFQO0FBQ0E7QUFDRCxLQWZELE1BZU87QUFDTjtBQUNBLGFBQU83RSx5QkFBeUIsQ0FBQzVELFFBQUQsQ0FBaEM7QUFDQTtBQUNEOztTQUVjTCxLIiwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVzb3VyY2VCdW5kbGUgZnJvbSBcInNhcC9iYXNlL2kxOG4vUmVzb3VyY2VCdW5kbGVcIjtcbmltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IHsgQXBwQ29tcG9uZW50IH0gZnJvbSBcInNhcC9mZS9jb3JlXCI7XG5pbXBvcnQgbWVzc2FnZUhhbmRsaW5nIGZyb20gXCJzYXAvZmUvY29yZS9hY3Rpb25zL21lc3NhZ2VIYW5kbGluZ1wiO1xuaW1wb3J0IENvbW1vblV0aWxzIGZyb20gXCJzYXAvZmUvY29yZS9Db21tb25VdGlsc1wiO1xuaW1wb3J0IHsgU2lkZUVmZmVjdHNTZXJ2aWNlIH0gZnJvbSBcInNhcC9mZS9jb3JlL3NlcnZpY2VzL1NpZGVFZmZlY3RzU2VydmljZUZhY3RvcnlcIjtcbmltcG9ydCBCdXR0b24gZnJvbSBcInNhcC9tL0J1dHRvblwiO1xuaW1wb3J0IERpYWxvZyBmcm9tIFwic2FwL20vRGlhbG9nXCI7XG5pbXBvcnQgTWVzc2FnZUJveCBmcm9tIFwic2FwL20vTWVzc2FnZUJveFwiO1xuaW1wb3J0IFRleHQgZnJvbSBcInNhcC9tL1RleHRcIjtcbmltcG9ydCBWaWV3IGZyb20gXCJzYXAvdWkvY29yZS9tdmMvVmlld1wiO1xuaW1wb3J0IENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgT0RhdGFNZXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1ldGFNb2RlbFwiO1xuaW1wb3J0IFJlc291cmNlTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9yZXNvdXJjZS9SZXNvdXJjZU1vZGVsXCI7XG5cbi8qKlxuICogSW50ZXJmYWNlIGZvciBjYWxsYmFja3MgdXNlZCBpbiB0aGUgZnVuY3Rpb25zXG4gKlxuICpcbiAqIEBhdXRob3IgU0FQIFNFXG4gKiBAc2luY2UgMS41NC4wXG4gKiBAaW50ZXJmYWNlXG4gKiBAbmFtZSBzYXAuZmUuY29yZS5hY3Rpb25zLmRyYWZ0LklDYWxsYmFja1xuICogQHByaXZhdGVcbiAqL1xuXG4vKipcbiAqIENhbGxiYWNrIHRvIGFwcHJvdmUgb3IgcmVqZWN0IHRoZSBjcmVhdGlvbiBvZiBhIGRyYWZ0XG4gKiBAbmFtZSBzYXAuZmUuY29yZS5hY3Rpb25zLmRyYWZ0LklDYWxsYmFjay5iZWZvcmVDcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudFxuICogQGZ1bmN0aW9uXG4gKiBAc3RhdGljXG4gKiBAYWJzdHJhY3RcbiAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9Db250ZXh0IENvbnRleHQgb2YgdGhlIGFjdGl2ZSBkb2N1bWVudCBmb3IgdGhlIG5ldyBkcmFmdFxuICogQHJldHVybnMgeyhib29sZWFufFByb21pc2UpfSBBcHByb3ZhbCBvZiBkcmFmdCBjcmVhdGlvbiBbdHJ1ZXxmYWxzZV0gb3IgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIGJvb2xlYW4gdmFsdWVcbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5cbi8qKlxuICogQ2FsbGJhY2sgYWZ0ZXIgYSBkcmFmdCB3YXMgc3VjY2Vzc3VsbHkgY3JlYXRlZFxuICogQG5hbWUgc2FwLmZlLmNvcmUuYWN0aW9ucy5kcmFmdC5JQ2FsbGJhY2suYWZ0ZXJDcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudFxuICogQGZ1bmN0aW9uXG4gKiBAc3RhdGljXG4gKiBAYWJzdHJhY3RcbiAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9Db250ZXh0IENvbnRleHQgb2YgdGhlIG5ldyBkcmFmdFxuICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dH0gb0FjdGl2ZURvY3VtZW50Q29udGV4dCBDb250ZXh0IG9mIHRoZSBhY3RpdmUgZG9jdW1lbnQgZm9yIHRoZSBuZXcgZHJhZnRcbiAqIEByZXR1cm5zIHtzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dH0gb0FjdGl2ZURvY3VtZW50Q29udGV4dFxuICpcbiAqIEBwcml2YXRlXG4gKi9cblxuLyoqXG4gKiBDYWxsYmFjayB0byBhcHByb3ZlIG9yIHJlamVjdCBvdmVyd3JpdGluZyBhbiB1bnNhdmVkIGRyYWZ0IG9mIGFub3RoZXIgdXNlclxuICogQG5hbWUgc2FwLmZlLmNvcmUuYWN0aW9ucy5kcmFmdC5JQ2FsbGJhY2sud2hlbkRlY2lzaW9uVG9PdmVyd3JpdGVEb2N1bWVudElzUmVxdWlyZWRcbiAqIEBmdW5jdGlvblxuICogQHB1YmxpY1xuICogQHN0YXRpY1xuICogQGFic3RyYWN0XG4gKlxuICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dH0gb0NvbnRleHQgQ29udGV4dCBvZiB0aGUgYWN0aXZlIGRvY3VtZW50IGZvciB0aGUgbmV3IGRyYWZ0XG4gKiBAcmV0dXJucyB7KGJvb2xlYW58UHJvbWlzZSl9IEFwcHJvdmFsIHRvIG92ZXJ3cml0ZSB1bnNhdmVkIGRyYWZ0IFt0cnVlfGZhbHNlXSBvciBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgYm9vbGVhbiB2YWx1ZVxuICpcbiAqIEB1aTUtcmVzdHJpY3RlZFxuICovXG4vKiBDb25zdGFudHMgZm9yIGRyYWZ0IG9wZXJhdGlvbnMgKi9cbmNvbnN0IGRyYWZ0T3BlcmF0aW9ucyA9IHtcblx0RURJVDogXCJFZGl0QWN0aW9uXCIsXG5cdEFDVElWQVRJT046IFwiQWN0aXZhdGlvbkFjdGlvblwiLFxuXHRESVNDQVJEOiBcIkRpc2NhcmRBY3Rpb25cIixcblx0UFJFUEFSRTogXCJQcmVwYXJhdGlvbkFjdGlvblwiXG59O1xuLyoqXG4gKiBTdGF0aWMgZnVuY3Rpb25zIGZvciB0aGUgZHJhZnQgcHJvZ3JhbW1pbmcgbW9kZWxcbiAqXG4gKiBAbmFtZXNwYWNlXG4gKiBAYWxpYXMgc2FwLmZlLmNvcmUuYWN0aW9ucy5kcmFmdFxuICogQHByaXZhdGVcbiAqIEBleHBlcmltZW50YWwgVGhpcyBtb2R1bGUgaXMgb25seSBmb3IgZXhwZXJpbWVudGFsIHVzZSEgPGJyLz48Yj5UaGlzIGlzIG9ubHkgYSBQT0MgYW5kIG1heWJlIGRlbGV0ZWQ8L2I+XG4gKiBAc2luY2UgMS41NC4wXG4gKi9cbmNvbnN0IGRyYWZ0ID0ge1xuXHRjcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudDogY3JlYXRlRHJhZnRGcm9tQWN0aXZlRG9jdW1lbnQsXG5cdGFjdGl2YXRlRG9jdW1lbnQ6IGFjdGl2YXRlRG9jdW1lbnQsXG5cdGRlbGV0ZURyYWZ0OiBkZWxldGVEcmFmdFxufTtcbi8qKlxuICogRGV0ZXJtaW5lcyBhY3Rpb24gbmFtZSBmb3IgYSBkcmFmdCBvcGVyYXRpb24uXG4gKlxuICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dH0gb0NvbnRleHQgVGhlIGNvbnRleHQgdGhhdCBzaG91bGQgYmUgYm91bmQgdG8gdGhlIG9wZXJhdGlvblxuICogQHBhcmFtIHtzdHJpbmd9IHNPcGVyYXRpb24gVGhlIG9wZXJhdGlvbiBuYW1lXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgbmFtZSBvZiB0aGUgZHJhZnQgb3BlcmF0aW9uXG4gKi9cbmZ1bmN0aW9uIGdldEFjdGlvbk5hbWUob0NvbnRleHQ6IGFueSwgc09wZXJhdGlvbjogc3RyaW5nKSB7XG5cdGNvbnN0IG9Nb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCksXG5cdFx0b01ldGFNb2RlbCA9IG9Nb2RlbC5nZXRNZXRhTW9kZWwoKSxcblx0XHRzRW50aXR5U2V0UGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgob0NvbnRleHQuZ2V0UGF0aCgpKTtcblxuXHRyZXR1cm4gb01ldGFNb2RlbC5nZXRPYmplY3Qoc0VudGl0eVNldFBhdGggKyBcIkBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnRSb290L1wiICsgc09wZXJhdGlvbik7XG59XG4vKipcbiAqIENyZWF0ZXMgYW4gb3BlcmF0aW9uIGNvbnRleHQgYmluZGluZyBmb3IgdGhlIGdpdmVuIGNvbnRleHQgYW5kIG9wZXJhdGlvbi5cbiAqXG4gKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSBvQ29udGV4dCBUaGUgY29udGV4dCB0aGF0IHNob3VsZCBiZSBib3VuZCB0byB0aGUgb3BlcmF0aW9uXG4gKiBAcGFyYW0ge3N0cmluZ30gc09wZXJhdGlvbiBUaGUgb3BlcmF0aW9uIChhY3Rpb24gb3IgZnVuY3Rpb24gaW1wb3J0KVxuICogQHBhcmFtIG9PcHRpb25zIE9wdGlvbnMgdG8gY3JlYXRlIHRoZSBvcGVyYXRpb24gY29udGV4dFxuICogQHJldHVybnMge3NhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUNvbnRleHRCaW5kaW5nfSBUaGUgY29udGV4dCBiaW5kaW5nIG9mIHRoZSBib3VuZCBvcGVyYXRpb25cbiAqL1xuZnVuY3Rpb24gY3JlYXRlT3BlcmF0aW9uKG9Db250ZXh0OiBhbnksIHNPcGVyYXRpb246IHN0cmluZywgb09wdGlvbnM/OiBhbnkpIHtcblx0Y29uc3Qgc09wZXJhdGlvbk5hbWUgPSBnZXRBY3Rpb25OYW1lKG9Db250ZXh0LCBzT3BlcmF0aW9uKTtcblxuXHRyZXR1cm4gb0NvbnRleHQuZ2V0TW9kZWwoKS5iaW5kQ29udGV4dChzT3BlcmF0aW9uTmFtZSArIFwiKC4uLilcIiwgb0NvbnRleHQsIG9PcHRpb25zKTtcbn1cbi8qKlxuICogQ2hlY2sgaWYgb3B0aW9uYWwgZHJhZnQgcHJlcGFyZSBhY3Rpb24gZXhpc3RzLlxuICpcbiAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9Db250ZXh0IFRoZSBjb250ZXh0IHRoYXQgc2hvdWxkIGJlIGJvdW5kIHRvIHRoZSBvcGVyYXRpb25cbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIGEgYSBwcmVwYXJlIGFjdGlvbiBleGlzdHNcbiAqL1xuZnVuY3Rpb24gaGFzUHJlcGFyZUFjdGlvbihvQ29udGV4dDogYW55KSB7XG5cdHJldHVybiAhIWdldEFjdGlvbk5hbWUob0NvbnRleHQsIGRyYWZ0T3BlcmF0aW9ucy5QUkVQQVJFKTtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBkcmFmdCBmcm9tIGFuIGFjdGl2ZSBkb2N1bWVudC5cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9Db250ZXh0IENvbnRleHQgZm9yIHdoaWNoIHRoZSBhY3Rpb24gc2hvdWxkIGJlIHBlcmZvcm1lZFxuICogQHBhcmFtIHtib29sZWFufSBiUHJlc2VydmVDaGFuZ2VzIElmIHRydWUgLSBleGlzdGluZyBjaGFuZ2VzIGZyb20gYW5vdGhlciB1c2VyIHRoYXQgYXJlIG5vdCBsb2NrZWQgYXJlIHByZXNlcnZlZCBhbmQgYW4gZXJyb3IgbWVzc2FnZSAoaHR0cCBzdGF0dXMgNDA5KSBpcyBzZW5kIGZyb20gdGhlIGJhY2tlbmQsIG90aGVyd2lzZSBmYWxzZSAtIGV4aXN0aW5nIGNoYW5nZXMgZnJvbSBhbm90aGVyIHVzZXIgdGhhdCBhcmUgbm90IGxvY2tlZCBhcmUgb3ZlcndyaXR0ZW48L2xpPlxuICogQHJldHVybnMge1Byb21pc2UuPHNhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0Pn0gUmVzb2x2ZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBjb250ZXh0IG9mIHRoZSBvcGVyYXRpb25cbiAqIEBwcml2YXRlXG4gKiBAdWk1LXJlc3RyaWN0ZWRcbiAqL1xuZnVuY3Rpb24gZXhlY3V0ZURyYWZ0RWRpdEFjdGlvbihvQ29udGV4dDogYW55LCBiUHJlc2VydmVDaGFuZ2VzOiBib29sZWFuKSB7XG5cdGlmIChvQ29udGV4dC5nZXRQcm9wZXJ0eShcIklzQWN0aXZlRW50aXR5XCIpKSB7XG5cdFx0Y29uc3Qgb09wdGlvbnMgPSB7ICQkaW5oZXJpdEV4cGFuZFNlbGVjdDogdHJ1ZSB9O1xuXHRcdGNvbnN0IG9PcGVyYXRpb24gPSBjcmVhdGVPcGVyYXRpb24ob0NvbnRleHQsIGRyYWZ0T3BlcmF0aW9ucy5FRElULCBvT3B0aW9ucyk7XG5cdFx0b09wZXJhdGlvbi5zZXRQYXJhbWV0ZXIoXCJQcmVzZXJ2ZUNoYW5nZXNcIiwgYlByZXNlcnZlQ2hhbmdlcyk7XG5cdFx0Y29uc3Qgc0dyb3VwSWQgPSBcImRpcmVjdFwiO1xuXHRcdGNvbnN0IG9FZGl0UHJvbWlzZSA9IG9PcGVyYXRpb24uZXhlY3V0ZShzR3JvdXBJZCkudGhlbihmdW5jdGlvbiAob0RyYWZ0RG9jdW1lbnRDb250ZXh0OiBhbnkpIHtcblx0XHRcdHJldHVybiBvRHJhZnREb2N1bWVudENvbnRleHQ7XG5cdFx0fSk7XG5cdFx0b09wZXJhdGlvbi5nZXRNb2RlbCgpLnN1Ym1pdEJhdGNoKHNHcm91cElkKTtcblx0XHRyZXR1cm4gb0VkaXRQcm9taXNlO1xuXHR9IGVsc2Uge1xuXHRcdHRocm93IG5ldyBFcnJvcihcIllvdSBjYW5ub3QgZWRpdCB0aGlzIGRyYWZ0IGRvY3VtZW50XCIpO1xuXHR9XG59XG4vKmZ1bmN0aW9uIGZuT25TdHJpY3RIYW5kbGluZ0ZhaWxlZChvQ29udGV4dDogYW55LCBzR3JvdXBJZDogYW55LCBhTWVzc2FnZXM6IGFueSkgeyAvL1dpbGwgdW5jb21tZW50IHRoaXMgZnVuY3Rpb24gaW4gdGhlIGNvbW1pdCA6IDU1MTM1MTBcblx0aWYgKGFNZXNzYWdlcy5sZW5ndGggPT09IDEpIHtcblx0XHRjb25zdCBzTWVzc2FnZSA9IGFNZXNzYWdlc1swXS5tZXNzYWdlLFxuXHRcdFx0ZGlhbG9nUHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmU6ICh2YWx1ZTogYW55KSA9PiB2b2lkKSB7XG5cdFx0XHRcdHNhcC51aS5yZXF1aXJlKFtcInNhcC9tL01lc3NhZ2VCb3hcIl0sIGZ1bmN0aW9uKE1lc3NhZ2VCb3g6IGFueSkge1xuXHRcdFx0XHRcdE1lc3NhZ2VCb3gud2FybmluZyhzTWVzc2FnZSwge1xuXHRcdFx0XHRcdFx0dGl0bGU6IFwiV2FybmluZ1wiLFxuXHRcdFx0XHRcdFx0YWN0aW9uczogW01lc3NhZ2VCb3guQWN0aW9uLk9LLCBNZXNzYWdlQm94LkFjdGlvbi5DQU5DRUxdLFxuXHRcdFx0XHRcdFx0b25DbG9zZTogZnVuY3Rpb24oc0FjdGlvbjogYW55KSB7XG5cdFx0XHRcdFx0XHRcdGlmIChzQWN0aW9uID09PSBNZXNzYWdlQm94LkFjdGlvbi5PSykge1xuXHRcdFx0XHRcdFx0XHRcdHJlc29sdmUodHJ1ZSk7XG5cdFx0XHRcdFx0XHRcdFx0b0NvbnRleHQuZ2V0TW9kZWwoKS5zdWJtaXRCYXRjaChzR3JvdXBJZCk7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0cmVzb2x2ZShmYWxzZSk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblx0XHRyZXR1cm4gZGlhbG9nUHJvbWlzZTtcblx0fVxufSovXG4vKipcbiAqIEFjdGl2YXRlcyBhIGRyYWZ0IGRvY3VtZW50LiBUaGUgZHJhZnQgd2lsbCByZXBsYWNlIHRoZSBzaWJsaW5nIGVudGl0eSBhbmQgd2lsbCBiZSBkZWxldGVkIGJ5IHRoZSBiYWNrIGVuZC5cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9Db250ZXh0IENvbnRleHQgZm9yIHdoaWNoIHRoZSBhY3Rpb24gc2hvdWxkIGJlIHBlcmZvcm1lZFxuICogQHBhcmFtIHtvYmplY3R9IG9BcHBDb21wb25lbnQgVGhlIEFwcENvbXBvbmVudFxuICogQHBhcmFtIHtzdHJpbmd9IFtzR3JvdXBJZF0gVGhlIG9wdGlvbmFsIGJhdGNoIGdyb3VwIGluIHdoaWNoIHRoZSBvcGVyYXRpb24gaXMgdG8gYmUgZXhlY3V0ZWRcbiAqIEByZXR1cm5zIHtQcm9taXNlLjxzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dD59IFJlc29sdmUgZnVuY3Rpb24gcmV0dXJucyB0aGUgY29udGV4dCBvZiB0aGUgb3BlcmF0aW9uXG4gKiBAcHJpdmF0ZVxuICogQHVpNS1yZXN0cmljdGVkXG4gKi9cbmZ1bmN0aW9uIGV4ZWN1dGVEcmFmdEFjdGl2YXRpb25BY3Rpb24ob0NvbnRleHQ6IGFueSwgb0FwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LCBzR3JvdXBJZD86IHN0cmluZykge1xuXHRjb25zdCBiSGFzUHJlcGFyZUFjdGlvbiA9IGhhc1ByZXBhcmVBY3Rpb24ob0NvbnRleHQpO1xuXG5cdC8vIEFjY29yZGluZyB0byB0aGUgZHJhZnQgc3BlYyBpZiB0aGUgc2VydmljZSBjb250YWlucyBhIHByZXBhcmUgYWN0aW9uIGFuZCB3ZSB0cmlnZ2VyIGJvdGggcHJlcGFyZSBhbmRcblx0Ly8gYWN0aXZhdGUgaW4gb25lICRiYXRjaCB0aGUgYWN0aXZhdGUgYWN0aW9uIGlzIGNhbGxlZCB3aXRoIGlGLU1hdGNoPSpcblx0Y29uc3QgYklnbm9yZUV0YWcgPSBiSGFzUHJlcGFyZUFjdGlvbjtcblxuXHRpZiAoIW9Db250ZXh0LmdldFByb3BlcnR5KFwiSXNBY3RpdmVFbnRpdHlcIikpIHtcblx0XHRjb25zdCBvT3BlcmF0aW9uID0gY3JlYXRlT3BlcmF0aW9uKG9Db250ZXh0LCBkcmFmdE9wZXJhdGlvbnMuQUNUSVZBVElPTiwgeyAkJGluaGVyaXRFeHBhbmRTZWxlY3Q6IHRydWUgfSk7XG5cdFx0cmV0dXJuIG9PcGVyYXRpb25cblx0XHRcdC5leGVjdXRlKHNHcm91cElkLCBiSWdub3JlRXRhZylcblx0XHRcdC50aGVuKGZ1bmN0aW9uIChvQWN0aXZlRG9jdW1lbnRDb250ZXh0OiBhbnkpIHtcblx0XHRcdFx0cmV0dXJuIG9BY3RpdmVEb2N1bWVudENvbnRleHQ7XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKFxuXHRcdFx0XHQvL2lmIEFDVElWQVRFIGFjdGlvbiBmYWlscyB0aGVuIHdlIHJlcXVlc3QgZWl0aGVyIHRoZSBzaWRlRWZmZWN0cyBhZ2FpbnN0IFBSRVBBUkUgYWN0aW9uIChpZiBhbm5vdGF0ZWQpIG9yIHRoZSBtZXNzYWdlcyBhcyBmYWxsYmFjazpcblx0XHRcdFx0ZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdGlmIChiSGFzUHJlcGFyZUFjdGlvbikge1xuXHRcdFx0XHRcdFx0Y29uc3Qgc0FjdGlvbk5hbWUgPSBnZXRBY3Rpb25OYW1lKG9Db250ZXh0LCBkcmFmdE9wZXJhdGlvbnMuUFJFUEFSRSksXG5cdFx0XHRcdFx0XHRcdG9TaWRlRWZmZWN0c1NlcnZpY2UgPSBvQXBwQ29tcG9uZW50LmdldFNpZGVFZmZlY3RzU2VydmljZSgpLFxuXHRcdFx0XHRcdFx0XHRvQmluZGluZ1BhcmFtZXRlcnMgPSBvU2lkZUVmZmVjdHNTZXJ2aWNlLmdldE9EYXRhQWN0aW9uU2lkZUVmZmVjdHMoc0FjdGlvbk5hbWUsIG9Db250ZXh0KSxcblx0XHRcdFx0XHRcdFx0YVRhcmdldFBhdGhzID0gb0JpbmRpbmdQYXJhbWV0ZXJzICYmIG9CaW5kaW5nUGFyYW1ldGVycy5wYXRoRXhwcmVzc2lvbnM7XG5cdFx0XHRcdFx0XHRpZiAoYVRhcmdldFBhdGhzICYmIGFUYXJnZXRQYXRocy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0XHRcdG9TaWRlRWZmZWN0c1NlcnZpY2UucmVxdWVzdFNpZGVFZmZlY3RzKGFUYXJnZXRQYXRocywgb0NvbnRleHQpLmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHJlcXVlc3Rpbmcgc2lkZSBlZmZlY3RzXCIsIG9FcnJvcik7XG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0cmVxdWVzdE1lc3NhZ2VzKG9Db250ZXh0LCBvU2lkZUVmZmVjdHNTZXJ2aWNlKS5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSByZXF1ZXN0aW5nIG1lc3NhZ2VzXCIsIG9FcnJvcik7XG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoKTtcblx0XHRcdFx0fVxuXHRcdFx0KTtcblx0fSBlbHNlIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJUaGUgYWN0aXZhdGlvbiBhY3Rpb24gY2Fubm90IGJlIGV4ZWN1dGVkIG9uIGFuIGFjdGl2ZSBkb2N1bWVudFwiKTtcblx0fVxufVxuLyoqXG4gKiBFeGVjdXRlIGEgcHJlcGFyYXRpb24gYWN0aW9uLlxuICpcbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dH0gb0NvbnRleHQgQ29udGV4dCBmb3Igd2hpY2ggdGhlIGFjdGlvbiBzaG91bGQgYmUgcGVyZm9ybWVkXG4gKiBAcGFyYW0ge29iamVjdH0gb0FwcENvbXBvbmVudCBUaGUgQXBwQ29tcG9uZW50XG4gKiBAcGFyYW0ge29iamVjdH0gbVBhcmFtZXRlcnMgVGhlIHBhcmFtZXRlcnNcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW21QYXJhbWV0ZXJzLmdyb3VwSWRdIFRoZSBvcHRpb25hbCBiYXRjaCBncm91cCB3aGVyZSB3ZSB3YW50IHRvIGV4ZWN1dGUgdGhlIG9wZXJhdGlvbiBpblxuICogQHBhcmFtIHtib29sZWFufSBbbVBhcmFtZXRlcnMuYlByZXBhcmVGb3JFZGl0XSBTaGFsbCB0aGUgbWVzc2FnZXMgYmUgcmVxdWVzdGVkIGlmIHN1cHBvcnRlZCBieSBzZXJ2aWNlXG4gKiBAcmV0dXJucyB7UHJvbWlzZS48c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHQ+fSBSZXNvbHZlIGZ1bmN0aW9uIHJldHVybnMgdGhlIGNvbnRleHQgb2YgdGhlIG9wZXJhdGlvblxuICogQHByaXZhdGVcbiAqIEB1aTUtcmVzdHJpY3RlZFxuICovXG5mdW5jdGlvbiBleGVjdXRlRHJhZnRQcmVwYXJhdGlvbkFjdGlvbihcblx0b0NvbnRleHQ6IGFueSxcblx0b0FwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LFxuXHRtUGFyYW1ldGVyczogeyBncm91cElkPzogc3RyaW5nOyBiUHJlcGFyZUZvckVkaXQ/OiBib29sZWFuIH1cbikge1xuXHRjb25zdCBtUGFyYW1zID0gbVBhcmFtZXRlcnMgfHwge307XG5cdGlmICghb0NvbnRleHQuZ2V0UHJvcGVydHkoXCJJc0FjdGl2ZUVudGl0eVwiKSkge1xuXHRcdGNvbnN0IG9PcGVyYXRpb24gPSBjcmVhdGVPcGVyYXRpb24ob0NvbnRleHQsIGRyYWZ0T3BlcmF0aW9ucy5QUkVQQVJFKTtcblxuXHRcdC8vIFRPRE86IHNpZGUgZWZmZWN0cyBxdWFsaWZpZXIgc2hhbGwgYmUgZXZlbiBkZXByZWNhdGVkIHRvIGJlIGNoZWNrZWRcblx0XHRvT3BlcmF0aW9uLnNldFBhcmFtZXRlcihcIlNpZGVFZmZlY3RzUXVhbGlmaWVyXCIsIFwiXCIpO1xuXG5cdFx0Y29uc3Qgc0dyb3VwSWQgPSBtUGFyYW1zLmdyb3VwSWQgfHwgb09wZXJhdGlvbi5nZXRHcm91cElkKCk7XG5cdFx0Y29uc3Qgb1ByZXBhcmF0aW9uUHJvbWlzZSA9IG9PcGVyYXRpb25cblx0XHRcdC5leGVjdXRlKHNHcm91cElkKVxuXHRcdFx0LnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRpZiAobVBhcmFtcy5iUHJlcGFyZUZvckVkaXQpIHtcblx0XHRcdFx0XHQvLyBpZiBQUkVQQVJFIGFjdGlvbiBpcyB0cmlnZ2VyZWQgYWZ0ZXIgRWRpdCB0aGVuIGVpdGhlciB0aGUgc2lkZUVmZmVjdHMgKGlmIGFubm90YXRlZCBhZ2FpbnN0IFBSRVBBUkUpIGFyZSBleGVjdXRlZCBvciB0aGUgbWVzc2FnZXMgYXJlIHJlcXVlc3RlZCBhcyBmYWxsYmFjayBpZiBubyBzaWRlRWZmZWN0czpcblx0XHRcdFx0XHRjb25zdCBzQWN0aW9uTmFtZSA9IGdldEFjdGlvbk5hbWUob0NvbnRleHQsIGRyYWZ0T3BlcmF0aW9ucy5QUkVQQVJFKSxcblx0XHRcdFx0XHRcdG9TaWRlRWZmZWN0c1NlcnZpY2UgPSBvQXBwQ29tcG9uZW50LmdldFNpZGVFZmZlY3RzU2VydmljZSgpLFxuXHRcdFx0XHRcdFx0b0JpbmRpbmdQYXJhbWV0ZXJzID0gb1NpZGVFZmZlY3RzU2VydmljZS5nZXRPRGF0YUFjdGlvblNpZGVFZmZlY3RzKHNBY3Rpb25OYW1lLCBvQ29udGV4dCksXG5cdFx0XHRcdFx0XHRhVGFyZ2V0UGF0aHMgPSBvQmluZGluZ1BhcmFtZXRlcnMgJiYgb0JpbmRpbmdQYXJhbWV0ZXJzLnBhdGhFeHByZXNzaW9ucztcblx0XHRcdFx0XHRpZiAoYVRhcmdldFBhdGhzICYmIGFUYXJnZXRQYXRocy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0XHRvU2lkZUVmZmVjdHNTZXJ2aWNlLnJlcXVlc3RTaWRlRWZmZWN0cyhhVGFyZ2V0UGF0aHMsIG9Db250ZXh0LCBzR3JvdXBJZCkuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHJlcXVlc3Rpbmcgc2lkZSBlZmZlY3RzXCIsIG9FcnJvcik7XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0cmVxdWVzdE1lc3NhZ2VzKG9Db250ZXh0LCBvU2lkZUVmZmVjdHNTZXJ2aWNlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIG9PcGVyYXRpb247XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBleGVjdXRpbmcgdGhlIG9wZXJhdGlvblwiLCBvRXJyb3IpO1xuXHRcdFx0fSk7XG5cblx0XHRyZXR1cm4gb1ByZXBhcmF0aW9uUHJvbWlzZTtcblx0fSBlbHNlIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcHJlcGFyYXRpb24gYWN0aW9uIGNhbm5vdCBiZSBleGVjdXRlZCBvbiBhbiBhY3RpdmUgZG9jdW1lbnRcIik7XG5cdH1cbn1cbi8qKlxuICogRGV0ZXJtaW5lcyB0aGUgbWVzc2FnZSBwYXRoIGZvciBhIGNvbnRleHQuXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSBvQ29udGV4dCBDb250ZXh0IGZvciB3aGljaCB0aGUgcGF0aCBzaGFsbCBiZSBkZXRlcm1pbmVkXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBNZXNzYWdlIHBhdGgsIGVtcHR5IGlmIG5vdCBhbm5vdGF0ZWRcbiAqIEBwcml2YXRlXG4gKiBAdWk1LXJlc3RyaWN0ZWRcbiAqL1xuZnVuY3Rpb24gZ2V0TWVzc2FnZXNQYXRoKG9Db250ZXh0OiBDb250ZXh0KTogc3RyaW5nIHtcblx0Y29uc3Qgb01vZGVsID0gb0NvbnRleHQuZ2V0TW9kZWwoKSxcblx0XHRvTWV0YU1vZGVsID0gb01vZGVsLmdldE1ldGFNb2RlbCgpIGFzIE9EYXRhTWV0YU1vZGVsLFxuXHRcdHNFbnRpdHlTZXRQYXRoID0gb01ldGFNb2RlbC5nZXRNZXRhUGF0aChvQ29udGV4dC5nZXRQYXRoKCkpO1xuXHRyZXR1cm4gb01ldGFNb2RlbC5nZXRPYmplY3Qoc0VudGl0eVNldFBhdGggKyBcIi9AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLk1lc3NhZ2VzLyRQYXRoXCIpO1xufVxuLyoqXG4gKiBSZXF1ZXN0cyB0aGUgbWVzc2FnZXMgaWYgYW5ub3RhdGVkIGZvciBhIGdpdmVuIGNvbnRleHQuXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSBvQ29udGV4dCBDb250ZXh0IGZvciB3aGljaCB0aGUgbWVzc2FnZXMgc2hhbGwgYmUgcmVxdWVzdGVkXG4gKiBAcGFyYW0ge29iamVjdH0gb1NpZGVFZmZlY3RzU2VydmljZSBTZXJ2aWNlIGZvciB0aGUgU2lkZUVmZmVjdHMgb24gU0FQIEZpb3JpIGVsZW1lbnRzXG4gKiBAcmV0dXJucyB7UHJvbWlzZX0gUHJvbWlzZSB3aGljaCBpcyByZXNvbHZlZCBvbmNlIG1lc3NhZ2VzIHdlcmUgcmVxdWVzdGVkXG4gKiBAcHJpdmF0ZVxuICogQHVpNS1yZXN0cmljdGVkXG4gKi9cbmZ1bmN0aW9uIHJlcXVlc3RNZXNzYWdlcyhvQ29udGV4dDogYW55LCBvU2lkZUVmZmVjdHNTZXJ2aWNlOiBTaWRlRWZmZWN0c1NlcnZpY2UpIHtcblx0Y29uc3Qgc01lc3NhZ2VzUGF0aCA9IGdldE1lc3NhZ2VzUGF0aChvQ29udGV4dCk7XG5cdGlmIChzTWVzc2FnZXNQYXRoKSB7XG5cdFx0cmV0dXJuIG9TaWRlRWZmZWN0c1NlcnZpY2UucmVxdWVzdFNpZGVFZmZlY3RzKFt7ICRQcm9wZXJ0eVBhdGg6IHNNZXNzYWdlc1BhdGggfV0gYXMgYW55LCBvQ29udGV4dCk7XG5cdH1cblx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xufVxuLyoqXG4gKiBFeGVjdXRlcyBkaXNjYXJkIG9mIGEgZHJhZnQgZnVuY3Rpb24gdXNpbmcgSFRUUCBQb3N0LlxuICpcbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dH0gb0NvbnRleHQgQ29udGV4dCBmb3Igd2hpY2ggdGhlIGFjdGlvbiBzaG91bGQgYmUgcGVyZm9ybWVkXG4gKiBAcmV0dXJucyB7UHJvbWlzZS48c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHQ+fSBSZXNvbHZlIGZ1bmN0aW9uIHJldHVybnMgdGhlIGNvbnRleHQgb2YgdGhlIG9wZXJhdGlvblxuICogQHByaXZhdGVcbiAqIEB1aTUtcmVzdHJpY3RlZFxuICovXG5mdW5jdGlvbiBleGVjdXRlRHJhZnREaXNjYXJkQWN0aW9uKG9Db250ZXh0OiBhbnkpOiBQcm9taXNlPGJvb2xlYW4+IHtcblx0aWYgKCFvQ29udGV4dC5nZXRQcm9wZXJ0eShcIklzQWN0aXZlRW50aXR5XCIpKSB7XG5cdFx0Y29uc3Qgb0Rpc2NhcmRPcGVyYXRpb24gPSBjcmVhdGVPcGVyYXRpb24ob0NvbnRleHQsIGRyYWZ0T3BlcmF0aW9ucy5ESVNDQVJEKTtcblx0XHRjb25zdCBvRGlzY2FyZFByb21pc2UgPSBvRGlzY2FyZE9wZXJhdGlvbi5leGVjdXRlKFwiZGlyZWN0XCIpO1xuXHRcdG9Db250ZXh0LmdldE1vZGVsKCkuc3VibWl0QmF0Y2goXCJkaXJlY3RcIik7XG5cdFx0cmV0dXJuIG9EaXNjYXJkUHJvbWlzZTtcblx0fSBlbHNlIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJUaGUgZGlzY2FyZCBhY3Rpb24gY2Fubm90IGJlIGV4ZWN1dGVkIG9uIGFuIGFjdGl2ZSBkb2N1bWVudFwiKTtcblx0fVxufVxuLyoqXG4gKiBDcmVhdGVzIGEgZHJhZnQgZG9jdW1lbnQgZnJvbSBhbiBleGlzdGluZyBkb2N1bWVudC5cbiAqXG4gKiBUaGUgZnVuY3Rpb24gc3VwcG9ydHMgc2V2ZXJhbCBob29rcyBhcyB0aGVyZSBpcyBhIGNlcnRhaW4gY29yZW9ncmFwaHkgZGVmaW5lZC5cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBuYW1lIHNhcC5mZS5jb3JlLmFjdGlvbnMuZHJhZnQjY3JlYXRlRHJhZnRGcm9tQWN0aXZlRG9jdW1lbnRcbiAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5hY3Rpb25zLmRyYWZ0XG4gKiBAc3RhdGljXG4gKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSBvQ29udGV4dCBDb250ZXh0IG9mIHRoZSBhY3RpdmUgZG9jdW1lbnQgZm9yIHRoZSBuZXcgZHJhZnRcbiAqIEBwYXJhbSB7b2JqZWN0fSBvQXBwQ29tcG9uZW50IFRoZSBBcHBDb21wb25lbnRcbiAqIEBwYXJhbSB7b2JqZWN0fSBtUGFyYW1ldGVycyBUaGUgcGFyYW1ldGVyc1xuICogQHBhcmFtIHtib29sZWFufSBbbVBhcmFtZXRlcnMub1ZpZXddIFRoZSB2aWV3XG4gKiBAcGFyYW0ge2Jvb2xlYW59IFttUGFyYW1ldGVycy5iUHJlc2VydmVDaGFuZ2VzXSBQcmVzZXJ2ZSBjaGFuZ2VzIG9mIGFuIGV4aXN0aW5nIGRyYWZ0IG9mIGFub3RoZXIgdXNlclxuICogQHBhcmFtIHtib29sZWFufSBbbVBhcmFtZXRlcnMuYlByZXBhcmVPbkVkaXRdIEFsc28gY2FsbCBwcmVwYXJlIHdoZW4gY2FsbGluZyBkcmFmdCBjcmVhdGlvblxuICogQHBhcmFtIHtzYXAuZmUuY29yZS5hY3Rpb25zLmRyYWZ0LklDYWxsYmFjay5iZWZvcmVDcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudH0gW21QYXJhbWV0ZXJzLmZuQmVmb3JlQ3JlYXRlRHJhZnRGcm9tQWN0aXZlRG9jdW1lbnRdIENhbGxiYWNrIHRoYXQgYWxsb3dzIHZldG8gYmVmb3JlIGNyZWF0ZSByZXF1ZXN0IGlzIGV4ZWN1dGVkXG4gKiBAcGFyYW0ge3NhcC5mZS5jb3JlLmFjdGlvbnMuZHJhZnQuSUNhbGxiYWNrLmFmdGVyQ3JlYXRlRHJhZnRGcm9tQWN0aXZlRG9jdW1lbnR9IFttUGFyYW1ldGVycy5mbkFmdGVyQ3JlYXRlRHJhZnRGcm9tQWN0aXZlRG9jdW1lbnRdIENhbGxiYWNrIGZvciBwb3N0cHJvY2Vzc2lvbmcgYWZ0ZXIgZHJhZnQgZG9jdW1lbnQgd2FzIGNyZWF0ZWRcbiAqIEBwYXJhbSB7c2FwLmZlLmNvcmUuYWN0aW9ucy5kcmFmdC5JQ2FsbGJhY2sud2hlbkRlY2lzaW9uVG9PdmVyd3JpdGVEb2N1bWVudElzUmVxdWlyZWR9IFttUGFyYW1ldGVycy5mbldoZW5EZWNpc2lvblRvT3ZlcndyaXRlRG9jdW1lbnRJc1JlcXVpcmVkXSBDYWxsYmFjayBmb3IgZGVjaWRpbmcgb24gb3ZlcndyaXRpbmcgYW4gdW5zYXZlZCBjaGFuZ2UgYnkgYW5vdGhlciB1c2VyXG4gKiBAcmV0dXJucyB7UHJvbWlzZX0gUHJvbWlzZSByZXNvbHZlcyB3aXRoIHRoZSB7QGxpbmsgc2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHQgY29udGV4dH0gb2YgdGhlIG5ldyBkcmFmdCBkb2N1bWVudFxuICogQHByaXZhdGVcbiAqIEB1aTUtcmVzdHJpY3RlZFxuICovXG5mdW5jdGlvbiBjcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudChcblx0b0NvbnRleHQ6IGFueSxcblx0b0FwcENvbXBvbmVudDogb2JqZWN0LFxuXHRtUGFyYW1ldGVyczoge1xuXHRcdG9WaWV3OiBWaWV3O1xuXHRcdGJQcmVzZXJ2ZUNoYW5nZXM/OiBib29sZWFuIHwgdW5kZWZpbmVkO1xuXHRcdGJQcmVwYXJlT25FZGl0PzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcblx0XHRmbkJlZm9yZUNyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50PzogYW55O1xuXHRcdGZuQWZ0ZXJDcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudD86IGFueTtcblx0XHRmbldoZW5EZWNpc2lvblRvT3ZlcndyaXRlRG9jdW1lbnRJc1JlcXVpcmVkPzogYW55O1xuXHR9XG4pIHtcblx0Y29uc3QgbVBhcmFtID0gbVBhcmFtZXRlcnMgfHwge30sXG5cdFx0bG9jYWxJMThuUmVmID0gc2FwLnVpLmdldENvcmUoKS5nZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUoXCJzYXAuZmUuY29yZVwiKSBhcyBSZXNvdXJjZUJ1bmRsZSxcblx0XHRiUnVuUHJlc2VydmVDaGFuZ2VzRmxvdyA9XG5cdFx0XHR0eXBlb2YgbVBhcmFtLmJQcmVzZXJ2ZUNoYW5nZXMgPT09IFwidW5kZWZpbmVkXCIgfHwgKHR5cGVvZiBtUGFyYW0uYlByZXNlcnZlQ2hhbmdlcyA9PT0gXCJib29sZWFuXCIgJiYgbVBhcmFtLmJQcmVzZXJ2ZUNoYW5nZXMpOyAvL2RlZmF1bHQgdHJ1ZVxuXG5cdC8qKlxuXHQgKiBPdmVyd3JpdGUgb3IgcmVqZWN0IGJhc2VkIG9uIGZuV2hlbkRlY2lzaW9uVG9PdmVyd3JpdGVEb2N1bWVudElzUmVxdWlyZWQuXG5cdCAqXG5cdCAqIEBwYXJhbSB7Kn0gYk92ZXJ3cml0ZSBPdmVyd3JpdGUgdGhlIGNoYW5nZSBvciBub3Rcblx0ICogQHJldHVybnMge1Byb21pc2V9IFJlc29sdmVzIHdpdGggcmVzdWx0IG9mIHtAbGluayBzYXAuZmUuY29yZS5hY3Rpb25zI2V4ZWN1dGVEcmFmdEVkaXRBY3Rpb259XG5cdCAqL1xuXHRmdW5jdGlvbiBvdmVyd3JpdGVPbkRlbWFuZChiT3ZlcndyaXRlOiBhbnkpIHtcblx0XHRpZiAoYk92ZXJ3cml0ZSkge1xuXHRcdFx0Ly9PdmVyd3JpdGUgZXhpc3RpbmcgY2hhbmdlc1xuXHRcdFx0Y29uc3Qgb01vZGVsID0gb0NvbnRleHQuZ2V0TW9kZWwoKTtcblx0XHRcdGNvbnN0IGRyYWZ0RGF0YUNvbnRleHQgPSBvTW9kZWwuYmluZENvbnRleHQob0NvbnRleHQuZ2V0UGF0aCgpICsgXCIvRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGFcIikuZ2V0Qm91bmRDb250ZXh0KCk7XG5cdFx0XHRsZXQgb1Jlc291cmNlQnVuZGxlOiBSZXNvdXJjZUJ1bmRsZTtcblxuXHRcdFx0cmV0dXJuICgobVBhcmFtZXRlcnMub1ZpZXcuZ2V0TW9kZWwoXCJzYXAuZmUuaTE4blwiKSBhcyBSZXNvdXJjZU1vZGVsKS5nZXRSZXNvdXJjZUJ1bmRsZSgpIGFzIFByb21pc2U8UmVzb3VyY2VCdW5kbGU+KVxuXHRcdFx0XHQudGhlbihmdW5jdGlvbiAoX29SZXNvdXJjZUJ1bmRsZTogYW55KSB7XG5cdFx0XHRcdFx0b1Jlc291cmNlQnVuZGxlID0gX29SZXNvdXJjZUJ1bmRsZTtcblx0XHRcdFx0XHRyZXR1cm4gZHJhZnREYXRhQ29udGV4dC5yZXF1ZXN0T2JqZWN0KCk7XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC50aGVuKGZ1bmN0aW9uIChkcmFmdEFkbWluRGF0YTogYW55KSB7XG5cdFx0XHRcdFx0aWYgKGRyYWZ0QWRtaW5EYXRhKSB7XG5cdFx0XHRcdFx0XHQvLyByZW1vdmUgYWxsIHVuYm91bmQgdHJhbnNpdGlvbiBtZXNzYWdlcyBhcyB3ZSBzaG93IGEgc3BlY2lhbCBkaWFsb2dcblx0XHRcdFx0XHRcdG1lc3NhZ2VIYW5kbGluZy5yZW1vdmVVbmJvdW5kVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cdFx0XHRcdFx0XHRsZXQgc0luZm8gPSBkcmFmdEFkbWluRGF0YS5JblByb2Nlc3NCeVVzZXJEZXNjcmlwdGlvbiB8fCBkcmFmdEFkbWluRGF0YS5JblByb2Nlc3NCeVVzZXI7XG5cdFx0XHRcdFx0XHRjb25zdCBzRW50aXR5U2V0ID0gKG1QYXJhbWV0ZXJzLm9WaWV3LmdldFZpZXdEYXRhKCkgYXMgYW55KS5lbnRpdHlTZXQ7XG5cdFx0XHRcdFx0XHRpZiAoc0luZm8pIHtcblx0XHRcdFx0XHRcdFx0Y29uc3Qgc0xvY2tlZEJ5VXNlck1zZyA9IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFxuXHRcdFx0XHRcdFx0XHRcdFwiQ19EUkFGVF9PQkpFQ1RfUEFHRV9EUkFGVF9MT0NLRURfQllfVVNFUlwiLFxuXHRcdFx0XHRcdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZSxcblx0XHRcdFx0XHRcdFx0XHRzSW5mbyxcblx0XHRcdFx0XHRcdFx0XHRzRW50aXR5U2V0XG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdE1lc3NhZ2VCb3guZXJyb3Ioc0xvY2tlZEJ5VXNlck1zZyk7XG5cdFx0XHRcdFx0XHRcdHRocm93IG5ldyBFcnJvcihzTG9ja2VkQnlVc2VyTXNnKTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdHNJbmZvID0gZHJhZnRBZG1pbkRhdGEuQ3JlYXRlZEJ5VXNlckRlc2NyaXB0aW9uIHx8IGRyYWZ0QWRtaW5EYXRhLkNyZWF0ZWRCeVVzZXI7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IHNVbnNhdmVkQ2hhbmdlc01zZyA9IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFxuXHRcdFx0XHRcdFx0XHRcdFwiQ19EUkFGVF9PQkpFQ1RfUEFHRV9EUkFGVF9VTlNBVkVEX0NIQU5HRVNcIixcblx0XHRcdFx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGUsXG5cdFx0XHRcdFx0XHRcdFx0c0luZm8sXG5cdFx0XHRcdFx0XHRcdFx0c0VudGl0eVNldFxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gc2hvd01lc3NhZ2VCb3goc1Vuc2F2ZWRDaGFuZ2VzTXNnKS50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gZXhlY3V0ZURyYWZ0RWRpdEFjdGlvbihvQ29udGV4dCwgZmFsc2UpO1xuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdH1cblx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiRHJhZnQgY3JlYXRpb24gYWJvcnRlZCBmb3IgZG9jdW1lbnQ6IFwiICsgb0NvbnRleHQuZ2V0UGF0aCgpKSk7XG5cdH1cblxuXHRmdW5jdGlvbiBzaG93TWVzc2FnZUJveChzVW5zYXZlZENoYW5nZXNNc2c6IGFueSkge1xuXHRcdHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZTogKHZhbHVlOiBhbnkpID0+IHZvaWQsIHJlamVjdDogKHJlYXNvbj86IGFueSkgPT4gdm9pZCkge1xuXHRcdFx0Y29uc3Qgb0RpYWxvZyA9IG5ldyBEaWFsb2coe1xuXHRcdFx0XHR0aXRsZTogbG9jYWxJMThuUmVmLmdldFRleHQoXCJDX0RSQUZUX09CSkVDVF9QQUdFX1dBUk5JTkdcIiksXG5cdFx0XHRcdHN0YXRlOiBcIldhcm5pbmdcIixcblx0XHRcdFx0Y29udGVudDogbmV3IFRleHQoe1xuXHRcdFx0XHRcdHRleHQ6IHNVbnNhdmVkQ2hhbmdlc01zZ1xuXHRcdFx0XHR9KSxcblx0XHRcdFx0YmVnaW5CdXR0b246IG5ldyBCdXR0b24oe1xuXHRcdFx0XHRcdHRleHQ6IGxvY2FsSTE4blJlZi5nZXRUZXh0KFwiQ19DT01NT05fT0JKRUNUX1BBR0VfRURJVFwiKSxcblx0XHRcdFx0XHR0eXBlOiBcIkVtcGhhc2l6ZWRcIixcblx0XHRcdFx0XHRwcmVzczogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0b0RpYWxvZy5jbG9zZSgpO1xuXHRcdFx0XHRcdFx0cmVzb2x2ZSh0cnVlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pLFxuXHRcdFx0XHRlbmRCdXR0b246IG5ldyBCdXR0b24oe1xuXHRcdFx0XHRcdHRleHQ6IGxvY2FsSTE4blJlZi5nZXRUZXh0KFwiQ19DT01NT05fT0JKRUNUX1BBR0VfQ0FOQ0VMXCIpLFxuXHRcdFx0XHRcdHByZXNzOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRvRGlhbG9nLmNsb3NlKCk7XG5cdFx0XHRcdFx0XHRyZWplY3QoXCJEcmFmdCBjcmVhdGlvbiBhYm9ydGVkIGZvciBkb2N1bWVudDogXCIgKyBvQ29udGV4dC5nZXRQYXRoKCkpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSksXG5cdFx0XHRcdGFmdGVyQ2xvc2U6IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRvRGlhbG9nLmRlc3Ryb3koKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0XHRvRGlhbG9nLmFkZFN0eWxlQ2xhc3MoXCJzYXBVaUNvbnRlbnRQYWRkaW5nXCIpO1xuXHRcdFx0b0RpYWxvZy5vcGVuKCk7XG5cdFx0fSk7XG5cdH1cblxuXHRpZiAoIW9Db250ZXh0KSB7XG5cdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkJpbmRpbmcgY29udGV4dCB0byBhY3RpdmUgZG9jdW1lbnQgaXMgcmVxdWlyZWRcIikpO1xuXHR9XG5cblx0cmV0dXJuIFByb21pc2UucmVzb2x2ZShcblx0XHRtUGFyYW0uZm5CZWZvcmVDcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudFxuXHRcdFx0PyBtUGFyYW0uZm5CZWZvcmVDcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudChvQ29udGV4dCwgYlJ1blByZXNlcnZlQ2hhbmdlc0Zsb3cpXG5cdFx0XHQ6IHRydWVcblx0KVxuXHRcdC50aGVuKGZ1bmN0aW9uIChiRXhlY3V0ZTogYW55KSB7XG5cdFx0XHRpZiAoIWJFeGVjdXRlKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcIkRyYWZ0IGNyZWF0aW9uIHdhcyBhYm9ydGVkIGJ5IGV4dGVuc2lvbiBmb3IgZG9jdW1lbnQ6IFwiICsgb0NvbnRleHQuZ2V0UGF0aCgpKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBleGVjdXRlRHJhZnRFZGl0QWN0aW9uKG9Db250ZXh0LCBiUnVuUHJlc2VydmVDaGFuZ2VzRmxvdykuY2F0Y2goZnVuY3Rpb24gKG9SZXNwb25zZTogYW55KSB7XG5cdFx0XHRcdC8vT25seSBjYWxsIGJhY2sgaWYgZXJyb3IgNDA5XG5cdFx0XHRcdGlmIChiUnVuUHJlc2VydmVDaGFuZ2VzRmxvdyAmJiBvUmVzcG9uc2Uuc3RhdHVzID09PSA0MDkpIHtcblx0XHRcdFx0XHRtZXNzYWdlSGFuZGxpbmcucmVtb3ZlQm91bmRUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblx0XHRcdFx0XHRtZXNzYWdlSGFuZGxpbmcucmVtb3ZlVW5ib3VuZFRyYW5zaXRpb25NZXNzYWdlcygpO1xuXHRcdFx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoXG5cdFx0XHRcdFx0XHRtUGFyYW0uZm5XaGVuRGVjaXNpb25Ub092ZXJ3cml0ZURvY3VtZW50SXNSZXF1aXJlZCA/IG1QYXJhbS5mbldoZW5EZWNpc2lvblRvT3ZlcndyaXRlRG9jdW1lbnRJc1JlcXVpcmVkKCkgOiB0cnVlXG5cdFx0XHRcdFx0KS50aGVuKG92ZXJ3cml0ZU9uRGVtYW5kKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3Iob1Jlc3BvbnNlKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fSlcblx0XHQudGhlbihmdW5jdGlvbiAob0RyYWZ0Q29udGV4dDogYW55KSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFxuXHRcdFx0XHRtUGFyYW0uZm5BZnRlckNyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50XG5cdFx0XHRcdFx0PyBtUGFyYW0uZm5BZnRlckNyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50KG9Db250ZXh0LCBvRHJhZnRDb250ZXh0KVxuXHRcdFx0XHRcdDogb0RyYWZ0Q29udGV4dFxuXHRcdFx0KTtcblx0XHR9KVxuXHRcdC50aGVuKGZ1bmN0aW9uIChvRHJhZnRDb250ZXh0OiBhbnkpIHtcblx0XHRcdGlmIChtUGFyYW0uYlByZXBhcmVPbkVkaXQgJiYgaGFzUHJlcGFyZUFjdGlvbihvRHJhZnRDb250ZXh0KSkge1xuXHRcdFx0XHRyZXR1cm4gZXhlY3V0ZURyYWZ0UHJlcGFyYXRpb25BY3Rpb24ob0RyYWZ0Q29udGV4dCwgb0FwcENvbXBvbmVudCwgeyBiUHJlcGFyZUZvckVkaXQ6IHRydWUgfSkudGhlbihmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG9EcmFmdENvbnRleHQ7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG9EcmFmdENvbnRleHQ7XG5cdFx0fSlcblx0XHQuY2F0Y2goZnVuY3Rpb24gKGV4YzogYW55KSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoZXhjKTtcblx0XHR9KTtcbn1cbi8qKlxuICogQ3JlYXRlcyBhbiBhY3RpdmUgZG9jdW1lbnQgZnJvbSBhIGRyYWZ0IGRvY3VtZW50LlxuICpcbiAqIFRoZSBmdW5jdGlvbiBzdXBwb3J0cyBzZXZlcmFsIGhvb2tzIGFzIHRoZXJlIGlzIGEgY2VydGFpbiBjaG9yZW9ncmFwaHkgZGVmaW5lZC5cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBuYW1lIHNhcC5mZS5jb3JlLmFjdGlvbnMuZHJhZnQjYWN0aXZhdGVEb2N1bWVudFxuICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmFjdGlvbnMuZHJhZnRcbiAqIEBzdGF0aWNcbiAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9Db250ZXh0IENvbnRleHQgb2YgdGhlIGFjdGl2ZSBkb2N1bWVudCBmb3IgdGhlIG5ldyBkcmFmdFxuICogQHBhcmFtIHtvYmplY3R9IG9BcHBDb21wb25lbnQgVGhlIEFwcENvbXBvbmVudFxuICogQHBhcmFtIHtvYmplY3R9IG1QYXJhbWV0ZXJzIFRoZSBwYXJhbWV0ZXJzXG4gKiBAcGFyYW0ge3NhcC5mZS5jb3JlLmFjdGlvbnMuZHJhZnQuSUNhbGxiYWNrLmZuQmVmb3JlQWN0aXZhdGVEb2N1bWVudH0gW21QYXJhbWV0ZXJzLmZuQmVmb3JlQWN0aXZhdGVEb2N1bWVudF0gQ2FsbGJhY2sgdGhhdCBhbGxvd3MgdmV0byBiZWZvcmUgY3JlYXRlIHJlcXVlc3QgaXMgZXhlY3V0ZWRcbiAqIEBwYXJhbSB7c2FwLmZlLmNvcmUuYWN0aW9ucy5kcmFmdC5JQ2FsbGJhY2suZm5BZnRlckFjdGl2YXRlRG9jdW1lbnR9IFttUGFyYW1ldGVycy5mbkFmdGVyQWN0aXZhdGVEb2N1bWVudF0gQ2FsbGJhY2sgZm9yIHBvc3Rwcm9jZXNzaW9uZyBhZnRlciBkb2N1bWVudCB3YXMgYWN0aXZhdGVkLlxuICogQHJldHVybnMge1Byb21pc2V9IFByb21pc2UgcmVzb2x2ZXMgd2l0aCB0aGUge0BsaW5rIHNhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0IGNvbnRleHR9IG9mIHRoZSBuZXcgZHJhZnQgZG9jdW1lbnRcbiAqIEBwcml2YXRlXG4gKiBAdWk1LXJlc3RyaWN0ZWRcbiAqL1xuZnVuY3Rpb24gYWN0aXZhdGVEb2N1bWVudChcblx0b0NvbnRleHQ6IGFueSxcblx0b0FwcENvbXBvbmVudDogb2JqZWN0LFxuXHRtUGFyYW1ldGVyczogeyBmbkJlZm9yZUFjdGl2YXRlRG9jdW1lbnQ/OiBhbnk7IGZuQWZ0ZXJBY3RpdmF0ZURvY3VtZW50PzogYW55IH1cbikge1xuXHRjb25zdCBtUGFyYW0gPSBtUGFyYW1ldGVycyB8fCB7fTtcblxuXHRpZiAoIW9Db250ZXh0KSB7XG5cdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkJpbmRpbmcgY29udGV4dCB0byBkcmFmdCBkb2N1bWVudCBpcyByZXF1aXJlZFwiKSk7XG5cdH1cblx0cmV0dXJuIFByb21pc2UucmVzb2x2ZShtUGFyYW0uZm5CZWZvcmVBY3RpdmF0ZURvY3VtZW50ID8gbVBhcmFtLmZuQmVmb3JlQWN0aXZhdGVEb2N1bWVudChvQ29udGV4dCkgOiB0cnVlKVxuXHRcdC50aGVuKGZ1bmN0aW9uIChiRXhlY3V0ZTogYW55KSB7XG5cdFx0XHRpZiAoIWJFeGVjdXRlKSB7XG5cdFx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJBY3RpdmF0aW9uIG9mIHRoZSBkb2N1bWVudCB3YXMgYWJvcnRlZCBieSBleHRlbnNpb24gZm9yIGRvY3VtZW50OiBcIiArIG9Db250ZXh0LmdldFBhdGgoKSkpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIWhhc1ByZXBhcmVBY3Rpb24ob0NvbnRleHQpKSB7XG5cdFx0XHRcdHJldHVybiBleGVjdXRlRHJhZnRBY3RpdmF0aW9uQWN0aW9uKG9Db250ZXh0LCBvQXBwQ29tcG9uZW50KTtcblx0XHRcdH1cblxuXHRcdFx0LyogYWN0aXZhdGlvbiByZXF1aXJlcyBwcmVwYXJhdGlvbiAqL1xuXHRcdFx0Y29uc3Qgc0JhdGNoR3JvdXAgPSBcImRyYWZ0XCI7XG5cdFx0XHQvLyB3ZSB1c2UgdGhlIHNhbWUgYmF0Y2hHcm91cCB0byBmb3JjZSBwcmVwYXJlIGFuZCBhY3RpdmF0ZSBpbiBhIHNhbWUgYmF0Y2ggYnV0IHdpdGggZGlmZmVyZW50IGNoYW5nZXNldFxuXHRcdFx0Y29uc3Qgb1ByZXBhcmVQcm9taXNlID0gZXhlY3V0ZURyYWZ0UHJlcGFyYXRpb25BY3Rpb24ob0NvbnRleHQsIG9BcHBDb21wb25lbnQsIHtcblx0XHRcdFx0Z3JvdXBJZDogc0JhdGNoR3JvdXAsXG5cdFx0XHRcdGJQcmVwYXJlRm9yRWRpdDogZmFsc2Vcblx0XHRcdH0pO1xuXHRcdFx0b0NvbnRleHQuZ2V0TW9kZWwoKS5zdWJtaXRCYXRjaChzQmF0Y2hHcm91cCk7XG5cblx0XHRcdGNvbnN0IG9BY3RpdmF0ZVByb21pc2UgPSBleGVjdXRlRHJhZnRBY3RpdmF0aW9uQWN0aW9uKG9Db250ZXh0LCBvQXBwQ29tcG9uZW50LCBzQmF0Y2hHcm91cCk7XG5cblx0XHRcdHJldHVybiBQcm9taXNlLmFsbChbb1ByZXBhcmVQcm9taXNlLCBvQWN0aXZhdGVQcm9taXNlXSlcblx0XHRcdFx0LnRoZW4oZnVuY3Rpb24gKHZhbHVlczogW2FueSwgYW55XSkge1xuXHRcdFx0XHRcdHJldHVybiB2YWx1ZXNbMV07XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAoZXhjOiBhbnkpIHtcblx0XHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoZXhjKTtcblx0XHRcdFx0fSk7XG5cdFx0fSlcblx0XHQudGhlbihmdW5jdGlvbiAob0FjdGl2ZURvY3VtZW50Q29udGV4dDogYW55KSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFxuXHRcdFx0XHRtUGFyYW0uZm5BZnRlckFjdGl2YXRlRG9jdW1lbnQgPyBtUGFyYW0uZm5BZnRlckFjdGl2YXRlRG9jdW1lbnQob0NvbnRleHQsIG9BY3RpdmVEb2N1bWVudENvbnRleHQpIDogb0FjdGl2ZURvY3VtZW50Q29udGV4dFxuXHRcdFx0KTtcblx0XHR9KVxuXHRcdC5jYXRjaChmdW5jdGlvbiAoZXhjOiBhbnkpIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChleGMpO1xuXHRcdH0pO1xufVxuLyoqXG4gKiBIVFRQIFBPU1QgY2FsbCB3aGVuIERyYWZ0QWN0aW9uIGlzIHByZXNlbnQgZm9yIERyYWZ0IERlbGV0ZTsgSFRUUCBERUxFVEUgZm9yIERyYWZ0KHdoZW4gbm8gRHJhZnRBY3Rpb24pXG4gKiBhbmQgQWN0aXZlIEluc3RhbmNlIHVzZXMgREVMRVRFIGFsd2F5cy5cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBuYW1lIHNhcC5mZS5jb3JlLmFjdGlvbnMuZHJhZnQjZGVsZXRlRHJhZnRcbiAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5hY3Rpb25zLmRyYWZ0XG4gKiBAc3RhdGljXG4gKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSBvQ29udGV4dCBDb250ZXh0IG9mIHRoZSBkb2N1bWVudCB0byBiZSBkaXNjYXJkZWRcbiAqIEBwcml2YXRlXG4gKiBAcmV0dXJucyB7UHJvbWlzZX1cbiAqIEB1aTUtcmVzdHJpY3RlZFxuICovXG5mdW5jdGlvbiBkZWxldGVEcmFmdChvQ29udGV4dDogYW55KTogUHJvbWlzZTxib29sZWFuPiB7XG5cdGNvbnN0IHNEaXNjYXJkQWN0aW9uID0gZ2V0QWN0aW9uTmFtZShvQ29udGV4dCwgZHJhZnRPcGVyYXRpb25zLkRJU0NBUkQpLFxuXHRcdGJJc0FjdGl2ZUVudGl0eSA9IG9Db250ZXh0LmdldE9iamVjdCgpLklzQWN0aXZlRW50aXR5O1xuXG5cdGlmIChiSXNBY3RpdmVFbnRpdHkgfHwgKCFiSXNBY3RpdmVFbnRpdHkgJiYgIXNEaXNjYXJkQWN0aW9uKSkge1xuXHRcdC8vVXNlIERlbGV0ZSBpbiBjYXNlIG9mIGFjdGl2ZSBlbnRpdHkgYW5kIG5vIGRpc2NhcmQgYWN0aW9uIGF2YWlsYWJsZSBmb3IgZHJhZnRcblx0XHRpZiAob0NvbnRleHQuaGFzUGVuZGluZ0NoYW5nZXMoKSkge1xuXHRcdFx0cmV0dXJuIG9Db250ZXh0XG5cdFx0XHRcdC5nZXRCaW5kaW5nKClcblx0XHRcdFx0LnJlc2V0Q2hhbmdlcygpXG5cdFx0XHRcdC50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRyZXR1cm4gb0NvbnRleHQuZGVsZXRlKCk7XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAoZXJyb3I6IGFueSkge1xuXHRcdFx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvcik7XG5cdFx0XHRcdH0pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gb0NvbnRleHQuZGVsZXRlKCk7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdC8vVXNlIERpc2NhcmQgUG9zdCBBY3Rpb24gaWYgaXQgaXMgYSBkcmFmdCBlbnRpdHkgYW5kIGRpc2NhcmQgYWN0aW9uIGV4aXN0c1xuXHRcdHJldHVybiBleGVjdXRlRHJhZnREaXNjYXJkQWN0aW9uKG9Db250ZXh0KTtcblx0fVxufVxuXG5leHBvcnQgZGVmYXVsdCBkcmFmdDtcbiJdfQ==