@sapui5/sap.fe.core 1.96.4 → 1.99.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (253) hide show
  1. package/package.json +6 -5
  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 +5 -3
  6. package/src/sap/fe/core/AppStateHandler.js +229 -195
  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 -2606
  12. package/src/sap/fe/core/CommonUtils.ts +2078 -0
  13. package/src/sap/fe/core/ExtensionAPI.js +16 -7
  14. package/src/sap/fe/core/PageController.js +84 -119
  15. package/src/sap/fe/core/PageController.ts +101 -0
  16. package/src/sap/fe/core/RouterProxy.js +986 -809
  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 -155
  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 +63 -0
  24. package/src/sap/fe/core/TransactionHelper.js +1576 -1627
  25. package/src/sap/fe/core/TransactionHelper.ts +1706 -0
  26. package/src/sap/fe/core/actions/draft.js +559 -581
  27. package/src/sap/fe/core/actions/draft.ts +593 -0
  28. package/src/sap/fe/core/actions/messageHandling.js +545 -435
  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 -1192
  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 +235 -264
  38. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +3 -2
  39. package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +288 -13
  40. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +35 -25
  41. package/src/sap/fe/core/controllerextensions/InternalRouting.js +79 -46
  42. package/src/sap/fe/core/controllerextensions/KPIManagement.js +86 -10
  43. package/src/sap/fe/core/controllerextensions/KPIManagement.ts +109 -31
  44. package/src/sap/fe/core/controllerextensions/MassEdit.js +172 -0
  45. package/src/sap/fe/core/controllerextensions/MessageHandler.js +237 -104
  46. package/src/sap/fe/core/controllerextensions/PageReady.js +3 -3
  47. package/src/sap/fe/core/controllerextensions/PageReady.ts +12 -8
  48. package/src/sap/fe/core/controllerextensions/Paginator.js +37 -9
  49. package/src/sap/fe/core/controllerextensions/Placeholder.js +8 -4
  50. package/src/sap/fe/core/controllerextensions/Routing.js +25 -5
  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 +9 -9
  54. package/src/sap/fe/core/controllerextensions/SideEffects.ts +22 -21
  55. package/src/sap/fe/core/controllerextensions/ViewState.js +36 -8
  56. package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +2 -1
  57. package/src/sap/fe/core/controls/CommandExecution.js +3 -2
  58. package/src/sap/fe/core/controls/ConditionalWrapper.js +3 -2
  59. package/src/sap/fe/core/controls/CustomQuickViewPage.js +112 -113
  60. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +9 -5
  61. package/src/sap/fe/core/controls/FieldWrapper.js +18 -23
  62. package/src/sap/fe/core/controls/FilterBar.js +3 -2
  63. package/src/sap/fe/core/controls/FormElementWrapper.js +3 -7
  64. package/src/sap/fe/core/controls/MultiValueParameterDelegate.js +3 -2
  65. package/src/sap/fe/core/controls/NonComputedVisibleKeyFieldsDialog.fragment.xml +2 -1
  66. package/src/sap/fe/core/controls/filterbar/FilterContainer.js +3 -2
  67. package/src/sap/fe/core/controls/filterbar/VisualFilter.js +5 -4
  68. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +3 -2
  69. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +3 -2
  70. package/src/sap/fe/core/controls/massEdit/MassEditDialog.fragment.xml +106 -0
  71. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +79 -0
  72. package/src/sap/fe/core/converters/ConverterContext.js +14 -2
  73. package/src/sap/fe/core/converters/ConverterContext.ts +14 -3
  74. package/src/sap/fe/core/converters/ManifestSettings.js +2 -1
  75. package/src/sap/fe/core/converters/ManifestSettings.ts +8 -1
  76. package/src/sap/fe/core/converters/ManifestWrapper.js +56 -32
  77. package/src/sap/fe/core/converters/ManifestWrapper.ts +24 -6
  78. package/src/sap/fe/core/converters/MetaModelConverter.js +76 -6
  79. package/src/sap/fe/core/converters/MetaModelConverter.ts +79 -15
  80. package/src/sap/fe/core/converters/TemplateConverter.js +1 -1
  81. package/src/sap/fe/core/converters/TemplateConverter.ts +2 -2
  82. package/src/sap/fe/core/converters/annotations/DataField.js +3 -3
  83. package/src/sap/fe/core/converters/annotations/DataField.ts +1 -1
  84. package/src/sap/fe/core/converters/common/AnnotationConverter.js +85 -46
  85. package/src/sap/fe/core/converters/controls/Common/Action.js +16 -4
  86. package/src/sap/fe/core/converters/controls/Common/Action.ts +14 -5
  87. package/src/sap/fe/core/converters/controls/Common/Chart.js +5 -3
  88. package/src/sap/fe/core/converters/controls/Common/Chart.ts +11 -3
  89. package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +3 -3
  90. package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +2 -2
  91. package/src/sap/fe/core/converters/controls/Common/Form.js +60 -19
  92. package/src/sap/fe/core/converters/controls/Common/Form.ts +66 -14
  93. package/src/sap/fe/core/converters/controls/Common/KPI.js +69 -4
  94. package/src/sap/fe/core/converters/controls/Common/KPI.ts +72 -0
  95. package/src/sap/fe/core/converters/controls/Common/Table.js +503 -399
  96. package/src/sap/fe/core/converters/controls/Common/Table.ts +615 -480
  97. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +527 -0
  98. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +655 -0
  99. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +489 -37
  100. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +506 -58
  101. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +2 -2
  102. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +1 -1
  103. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +6 -6
  104. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +9 -15
  105. package/src/sap/fe/core/converters/helpers/Aggregation.js +18 -3
  106. package/src/sap/fe/core/converters/helpers/Aggregation.ts +28 -5
  107. package/src/sap/fe/core/converters/helpers/ID.js +9 -1
  108. package/src/sap/fe/core/converters/helpers/ID.ts +4 -0
  109. package/src/sap/fe/core/converters/helpers/IssueManager.js +7 -1
  110. package/src/sap/fe/core/converters/helpers/IssueManager.ts +6 -0
  111. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +4 -4
  112. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +3 -3
  113. package/src/sap/fe/core/converters/templates/ListReportConverter.js +29 -11
  114. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +36 -20
  115. package/src/sap/fe/core/designtime/AppComponent.designtime.js +13 -3
  116. package/src/sap/fe/core/formatters/CriticalityFormatter.js +1 -1
  117. package/src/sap/fe/core/formatters/CriticalityFormatter.ts +1 -1
  118. package/src/sap/fe/core/formatters/FPMFormatter.js +1 -1
  119. package/src/sap/fe/core/formatters/FPMFormatter.ts +4 -10
  120. package/src/sap/fe/core/formatters/KPIFormatter.js +1 -1
  121. package/src/sap/fe/core/formatters/KPIFormatter.ts +3 -1
  122. package/src/sap/fe/core/formatters/TableFormatter.js +65 -31
  123. package/src/sap/fe/core/formatters/TableFormatter.ts +62 -30
  124. package/src/sap/fe/core/formatters/ValueFormatter.js +30 -5
  125. package/src/sap/fe/core/formatters/ValueFormatter.ts +30 -7
  126. package/src/sap/fe/core/fpm/Component.js +3 -2
  127. package/src/sap/fe/core/helpers/AppStartupHelper.js +359 -0
  128. package/src/sap/fe/core/helpers/AppStartupHelper.ts +391 -0
  129. package/src/sap/fe/core/helpers/BindingExpression.js +479 -464
  130. package/src/sap/fe/core/helpers/BindingExpression.ts +477 -483
  131. package/src/sap/fe/core/helpers/ClassSupport.js +27 -15
  132. package/src/sap/fe/core/helpers/ClassSupport.ts +31 -20
  133. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +63 -59
  134. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.ts +56 -0
  135. package/src/sap/fe/core/helpers/EditState.js +81 -84
  136. package/src/sap/fe/core/helpers/EditState.ts +81 -0
  137. package/src/sap/fe/core/helpers/ExcelFormatHelper.js +62 -48
  138. package/src/sap/fe/core/helpers/ExcelFormatHelper.ts +49 -0
  139. package/src/sap/fe/core/helpers/FPMHelper.js +52 -56
  140. package/src/sap/fe/core/helpers/FPMHelper.ts +62 -0
  141. package/src/sap/fe/core/helpers/KeepAliveHelper.js +210 -0
  142. package/src/sap/fe/core/helpers/KeepAliveHelper.ts +202 -0
  143. package/src/sap/fe/core/helpers/KeepAliveRefreshTypes.js +32 -0
  144. package/src/sap/fe/core/helpers/KeepAliveRefreshTypes.ts +36 -0
  145. package/src/sap/fe/core/helpers/MassEditHelper.js +687 -0
  146. package/src/sap/fe/core/helpers/ModelHelper.js +229 -174
  147. package/src/sap/fe/core/helpers/ModelHelper.ts +227 -0
  148. package/src/sap/fe/core/helpers/PasteHelper.js +210 -132
  149. package/src/sap/fe/core/helpers/PasteHelper.ts +196 -0
  150. package/src/sap/fe/core/helpers/SemanticDateOperators.js +332 -313
  151. package/src/sap/fe/core/helpers/SemanticDateOperators.ts +330 -0
  152. package/src/sap/fe/core/helpers/SemanticKeyHelper.js +66 -67
  153. package/src/sap/fe/core/helpers/SemanticKeyHelper.ts +73 -0
  154. package/src/sap/fe/core/helpers/StableIdHelper.js +4 -7
  155. package/src/sap/fe/core/helpers/StableIdHelper.ts +2 -6
  156. package/src/sap/fe/core/jsx-runtime/jsx.js +1 -1
  157. package/src/sap/fe/core/jsx-runtime/jsx.ts +1 -1
  158. package/src/sap/fe/core/library.js +30 -3
  159. package/src/sap/fe/core/library.support.js +12 -5
  160. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +62 -0
  161. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +66 -0
  162. package/src/sap/fe/core/messagebundle.properties +72 -10
  163. package/src/sap/fe/core/messagebundle_ar.properties +41 -0
  164. package/src/sap/fe/core/messagebundle_bg.properties +41 -0
  165. package/src/sap/fe/core/messagebundle_ca.properties +41 -0
  166. package/src/sap/fe/core/messagebundle_cs.properties +42 -1
  167. package/src/sap/fe/core/messagebundle_cy.properties +41 -0
  168. package/src/sap/fe/core/messagebundle_da.properties +41 -0
  169. package/src/sap/fe/core/messagebundle_de.properties +41 -0
  170. package/src/sap/fe/core/messagebundle_el.properties +41 -0
  171. package/src/sap/fe/core/messagebundle_en.properties +41 -0
  172. package/src/sap/fe/core/messagebundle_en_GB.properties +41 -0
  173. package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +41 -0
  174. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +35 -0
  175. package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +41 -0
  176. package/src/sap/fe/core/messagebundle_es.properties +41 -0
  177. package/src/sap/fe/core/messagebundle_es_MX.properties +41 -0
  178. package/src/sap/fe/core/messagebundle_et.properties +41 -0
  179. package/src/sap/fe/core/messagebundle_fi.properties +41 -0
  180. package/src/sap/fe/core/messagebundle_fr.properties +46 -5
  181. package/src/sap/fe/core/messagebundle_fr_CA.properties +41 -0
  182. package/src/sap/fe/core/messagebundle_hi.properties +41 -0
  183. package/src/sap/fe/core/messagebundle_hr.properties +41 -0
  184. package/src/sap/fe/core/messagebundle_hu.properties +42 -1
  185. package/src/sap/fe/core/messagebundle_id.properties +45 -4
  186. package/src/sap/fe/core/messagebundle_it.properties +41 -0
  187. package/src/sap/fe/core/messagebundle_iw.properties +41 -0
  188. package/src/sap/fe/core/messagebundle_ja.properties +50 -9
  189. package/src/sap/fe/core/messagebundle_kk.properties +41 -0
  190. package/src/sap/fe/core/messagebundle_ko.properties +41 -0
  191. package/src/sap/fe/core/messagebundle_lt.properties +41 -0
  192. package/src/sap/fe/core/messagebundle_lv.properties +41 -0
  193. package/src/sap/fe/core/messagebundle_ms.properties +41 -0
  194. package/src/sap/fe/core/messagebundle_nl.properties +41 -0
  195. package/src/sap/fe/core/messagebundle_no.properties +41 -0
  196. package/src/sap/fe/core/messagebundle_pl.properties +41 -0
  197. package/src/sap/fe/core/messagebundle_pt.properties +43 -2
  198. package/src/sap/fe/core/messagebundle_pt_PT.properties +41 -0
  199. package/src/sap/fe/core/messagebundle_ro.properties +41 -0
  200. package/src/sap/fe/core/messagebundle_ru.properties +41 -0
  201. package/src/sap/fe/core/messagebundle_sh.properties +41 -0
  202. package/src/sap/fe/core/messagebundle_sk.properties +41 -0
  203. package/src/sap/fe/core/messagebundle_sl.properties +41 -0
  204. package/src/sap/fe/core/messagebundle_sv.properties +42 -1
  205. package/src/sap/fe/core/messagebundle_th.properties +41 -0
  206. package/src/sap/fe/core/messagebundle_tr.properties +41 -0
  207. package/src/sap/fe/core/messagebundle_uk.properties +41 -0
  208. package/src/sap/fe/core/messagebundle_vi.properties +41 -0
  209. package/src/sap/fe/core/messagebundle_zh_CN.properties +41 -0
  210. package/src/sap/fe/core/messagebundle_zh_TW.properties +41 -0
  211. package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +2 -2
  212. package/src/sap/fe/core/services/AsyncComponentServiceFactory.ts +3 -1
  213. package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +269 -202
  214. package/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +212 -0
  215. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +4 -3
  216. package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +9 -5
  217. package/src/sap/fe/core/services/NavigationServiceFactory.js +406 -300
  218. package/src/sap/fe/core/services/NavigationServiceFactory.ts +316 -0
  219. package/src/sap/fe/core/services/ResourceModelServiceFactory.js +149 -81
  220. package/src/sap/fe/core/services/ResourceModelServiceFactory.ts +80 -0
  221. package/src/sap/fe/core/services/RoutingServiceFactory.js +987 -1166
  222. package/src/sap/fe/core/services/RoutingServiceFactory.ts +898 -0
  223. package/src/sap/fe/core/services/ShellServicesFactory.js +31 -2
  224. package/src/sap/fe/core/services/ShellServicesFactory.ts +45 -11
  225. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +41 -84
  226. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +56 -99
  227. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +461 -478
  228. package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +453 -0
  229. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +10 -8
  230. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.ts +8 -0
  231. package/src/sap/fe/core/support/AnnotationIssue.support.js +15 -3
  232. package/src/sap/fe/core/support/AnnotationIssue.support.ts +16 -2
  233. package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.js +2 -2
  234. package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.ts +1 -1
  235. package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.js +38 -0
  236. package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.ts +18 -0
  237. package/src/sap/fe/core/templating/DataModelPathHelper.js +6 -24
  238. package/src/sap/fe/core/templating/DataModelPathHelper.ts +10 -23
  239. package/src/sap/fe/core/templating/DisplayModeFormatter.js +114 -0
  240. package/src/sap/fe/core/templating/DisplayModeFormatter.ts +86 -0
  241. package/src/sap/fe/core/templating/EntitySetHelper.js +80 -7
  242. package/src/sap/fe/core/templating/EntitySetHelper.ts +42 -2
  243. package/src/sap/fe/core/templating/FieldControlHelper.js +8 -8
  244. package/src/sap/fe/core/templating/FieldControlHelper.ts +25 -7
  245. package/src/sap/fe/core/templating/FilterHelper.js +139 -70
  246. package/src/sap/fe/core/templating/FilterHelper.ts +140 -70
  247. package/src/sap/fe/core/templating/PropertyHelper.js +2 -2
  248. package/src/sap/fe/core/templating/PropertyHelper.ts +1 -1
  249. package/src/sap/fe/core/templating/UIFormatters.js +45 -113
  250. package/src/sap/fe/core/templating/UIFormatters.ts +39 -76
  251. package/src/sap/fe/core/type/Email.js +1 -1
  252. package/src/sap/fe/core/type/Email.ts +4 -6
  253. package/ui5.yaml +0 -3
@@ -0,0 +1,527 @@
1
+ /*!
2
+ * SAP UI development toolkit for HTML5 (SAPUI5)
3
+ * (c) Copyright 2009-2021 SAP SE. All rights reserved
4
+ */
5
+ sap.ui.define(["sap/fe/core/helpers/BindingExpression", "../../../ManifestSettings", "../../../helpers/BindingHelper", "sap/fe/core/templating/DataModelPathHelper"], function (BindingExpression, ManifestSettings, BindingHelper, DataModelPathHelper) {
6
+ "use strict";
7
+
8
+ var _exports = {};
9
+ var isPathUpdatable = DataModelPathHelper.isPathUpdatable;
10
+ var isPathInsertable = DataModelPathHelper.isPathInsertable;
11
+ var isPathDeletable = DataModelPathHelper.isPathDeletable;
12
+ var getTargetObjectPath = DataModelPathHelper.getTargetObjectPath;
13
+ var UI = BindingHelper.UI;
14
+ var singletonPathVisitor = BindingHelper.singletonPathVisitor;
15
+ var TemplateType = ManifestSettings.TemplateType;
16
+ var CreationMode = ManifestSettings.CreationMode;
17
+ var greaterThan = BindingExpression.greaterThan;
18
+ var or = BindingExpression.or;
19
+ var notEqual = BindingExpression.notEqual;
20
+ var not = BindingExpression.not;
21
+ var isConstant = BindingExpression.isConstant;
22
+ var isBinding = BindingExpression.isBinding;
23
+ var ifElse = BindingExpression.ifElse;
24
+ var greaterOrEqual = BindingExpression.greaterOrEqual;
25
+ var length = BindingExpression.length;
26
+ var equal = BindingExpression.equal;
27
+ var constant = BindingExpression.constant;
28
+ var compileBinding = BindingExpression.compileBinding;
29
+ var bindingExpression = BindingExpression.bindingExpression;
30
+ var annotationExpression = BindingExpression.annotationExpression;
31
+ var and = BindingExpression.and;
32
+
33
+ /**
34
+ * Generates the context for the standard actions.
35
+ *
36
+ * @param {ConverterContext} converterContext
37
+ * @param {NavigationSettingsConfiguration} navigationSettings
38
+ * @param {TableControlConfiguration} tableManifestConfiguration
39
+ * @param {ViewPathConfiguration} viewConfiguration
40
+ * @returns The context for table actions
41
+ */
42
+ function generateStandardActionsContext(converterContext, navigationSettings, tableManifestConfiguration, viewConfiguration) {
43
+ return {
44
+ collectionPath: getTargetObjectPath(converterContext.getDataModelObjectPath()),
45
+ hiddenAnnotation: {
46
+ create: isActionAnnotatedHidden(converterContext, "CreateHidden"),
47
+ "delete": isActionAnnotatedHidden(converterContext, "DeleteHidden"),
48
+ update: isActionAnnotatedHidden(converterContext, "UpdateHidden")
49
+ },
50
+ isExternalCreateConfigured: isExternalCreateConfigured(navigationSettings),
51
+ isDraftOrStickySupported: isDraftOrStickySupported(converterContext),
52
+ isViewWithMultipleVisualizations: viewConfiguration ? converterContext.getManifestWrapper().hasMultipleVisualizations(viewConfiguration) : false,
53
+ newAction: getNewAction(converterContext),
54
+ tableManifestConfiguration: tableManifestConfiguration,
55
+ restrictions: getRestrictions(converterContext)
56
+ };
57
+ }
58
+ /**
59
+ * Checks if an external created is configured for the navigation.
60
+ *
61
+ * @param {NavigationSettingsConfiguration} navigationSettings
62
+ * @returns {boolean}
63
+ */
64
+
65
+
66
+ _exports.generateStandardActionsContext = generateStandardActionsContext;
67
+
68
+ function isExternalCreateConfigured(navigationSettings) {
69
+ var navigation = navigationSettings === null || navigationSettings === void 0 ? void 0 : navigationSettings.create;
70
+ return (navigation && navigation.outbound && navigation.outboundDetail) !== undefined;
71
+ }
72
+ /**
73
+ * Checks if draft is supported.
74
+ *
75
+ * @param {ConverterContext} converterContext
76
+ * @returns {boolean}
77
+ */
78
+
79
+
80
+ _exports.isExternalCreateConfigured = isExternalCreateConfigured;
81
+
82
+ function isDraftSupported(converterContext) {
83
+ var _currentEntitySet$ann, _currentEntitySet$ann2, _currentEntitySet$ann3, _currentEntitySet$ann4, _converterContext$get, _converterContext$get2, _converterContext$get3, _converterContext$get4, _converterContext$get5, _converterContext$get6, _converterContext$get7;
84
+
85
+ var currentEntitySet = converterContext.getEntitySet();
86
+ var bIsDraftRoot = currentEntitySet && (_currentEntitySet$ann = currentEntitySet.annotations) !== null && _currentEntitySet$ann !== void 0 && (_currentEntitySet$ann2 = _currentEntitySet$ann.Common) !== null && _currentEntitySet$ann2 !== void 0 && _currentEntitySet$ann2.DraftRoot ? true : false;
87
+ var bIsDraftNode = currentEntitySet && (_currentEntitySet$ann3 = currentEntitySet.annotations) !== null && _currentEntitySet$ann3 !== void 0 && (_currentEntitySet$ann4 = _currentEntitySet$ann3.Common) !== null && _currentEntitySet$ann4 !== void 0 && _currentEntitySet$ann4.DraftNode ? true : false;
88
+ var bIsDraftParentEntityForContainment = (_converterContext$get = converterContext.getDataModelObjectPath().targetObject) !== null && _converterContext$get !== void 0 && _converterContext$get.containsTarget && ((_converterContext$get2 = converterContext.getDataModelObjectPath().startingEntitySet) !== null && _converterContext$get2 !== void 0 && (_converterContext$get3 = _converterContext$get2.annotations) !== null && _converterContext$get3 !== void 0 && (_converterContext$get4 = _converterContext$get3.Common) !== null && _converterContext$get4 !== void 0 && _converterContext$get4.DraftRoot || (_converterContext$get5 = converterContext.getDataModelObjectPath().startingEntitySet) !== null && _converterContext$get5 !== void 0 && (_converterContext$get6 = _converterContext$get5.annotations) !== null && _converterContext$get6 !== void 0 && (_converterContext$get7 = _converterContext$get6.Common) !== null && _converterContext$get7 !== void 0 && _converterContext$get7.DraftNode) ? true : false;
89
+ return bIsDraftRoot || bIsDraftNode || !converterContext.getEntitySet() && bIsDraftParentEntityForContainment;
90
+ }
91
+ /**
92
+ * Checks if sticky or draft is supported.
93
+ *
94
+ * @param {ConverterContext} converterContext
95
+ * @returns {boolean}
96
+ */
97
+
98
+
99
+ _exports.isDraftSupported = isDraftSupported;
100
+
101
+ function isDraftOrStickySupported(converterContext) {
102
+ var _converterContext$get8, _converterContext$get9, _converterContext$get10;
103
+
104
+ var bIsDraftSupported = isDraftSupported(converterContext);
105
+ var bIsStickySessionSupported = (_converterContext$get8 = converterContext.getDataModelObjectPath().startingEntitySet) !== null && _converterContext$get8 !== void 0 && (_converterContext$get9 = _converterContext$get8.annotations) !== null && _converterContext$get9 !== void 0 && (_converterContext$get10 = _converterContext$get9.Session) !== null && _converterContext$get10 !== void 0 && _converterContext$get10.StickySessionSupported ? true : false;
106
+ return bIsDraftSupported || bIsStickySessionSupported;
107
+ }
108
+ /**
109
+ * Gets the configured newAction into annotation.
110
+ *
111
+ * @param {ConverterContext} converterContext
112
+ * @returns {any}
113
+ */
114
+
115
+
116
+ _exports.isDraftOrStickySupported = isDraftOrStickySupported;
117
+
118
+ function getNewAction(converterContext) {
119
+ var _ref, _currentEntitySet$ann5, _currentEntitySet$ann6, _currentEntitySet$ann7, _currentEntitySet$ann8, _currentEntitySet$ann9, _currentEntitySet$ann10;
120
+
121
+ var currentEntitySet = converterContext.getEntitySet();
122
+ var newActionName = (_ref = (currentEntitySet === null || currentEntitySet === void 0 ? void 0 : (_currentEntitySet$ann5 = currentEntitySet.annotations) === null || _currentEntitySet$ann5 === void 0 ? void 0 : (_currentEntitySet$ann6 = _currentEntitySet$ann5.Common) === null || _currentEntitySet$ann6 === void 0 ? void 0 : (_currentEntitySet$ann7 = _currentEntitySet$ann6.DraftRoot) === null || _currentEntitySet$ann7 === void 0 ? void 0 : _currentEntitySet$ann7.NewAction) || (currentEntitySet === null || currentEntitySet === void 0 ? void 0 : (_currentEntitySet$ann8 = currentEntitySet.annotations) === null || _currentEntitySet$ann8 === void 0 ? void 0 : (_currentEntitySet$ann9 = _currentEntitySet$ann8.Session) === null || _currentEntitySet$ann9 === void 0 ? void 0 : (_currentEntitySet$ann10 = _currentEntitySet$ann9.StickySessionSupported) === null || _currentEntitySet$ann10 === void 0 ? void 0 : _currentEntitySet$ann10.NewAction)) === null || _ref === void 0 ? void 0 : _ref.toString();
123
+
124
+ if (newActionName) {
125
+ var _converterContext$get11, _converterContext$get12, _converterContext$get13;
126
+
127
+ var availableProperty = converterContext === null || converterContext === void 0 ? void 0 : (_converterContext$get11 = converterContext.getEntityType().actions[newActionName]) === null || _converterContext$get11 === void 0 ? void 0 : (_converterContext$get12 = _converterContext$get11.annotations) === null || _converterContext$get12 === void 0 ? void 0 : (_converterContext$get13 = _converterContext$get12.Core) === null || _converterContext$get13 === void 0 ? void 0 : _converterContext$get13.OperationAvailable;
128
+ availableProperty = availableProperty !== undefined ? availableProperty : true;
129
+ return {
130
+ name: newActionName,
131
+ available: annotationExpression(availableProperty)
132
+ };
133
+ }
134
+
135
+ return undefined;
136
+ }
137
+ /**
138
+ * Gets the binding expression for the action visibility configured into annotation.
139
+ *
140
+ * @param {ConverterContext} converterContext
141
+ * @param {string} sAnnotationTerm
142
+ * @returns {Expression<boolean>}
143
+ */
144
+
145
+
146
+ _exports.getNewAction = getNewAction;
147
+
148
+ function isActionAnnotatedHidden(converterContext, sAnnotationTerm) {
149
+ var _currentEntitySet$ann11;
150
+
151
+ var currentEntitySet = converterContext.getEntitySet();
152
+ var dataModelObjectPath = converterContext.getDataModelObjectPath(); // Consider only the last level of navigation. The others are already considered in the element binding of the page.
153
+
154
+ var visitedNavigationPaths = dataModelObjectPath.navigationProperties.length > 0 ? [dataModelObjectPath.navigationProperties[dataModelObjectPath.navigationProperties.length - 1].name] : [];
155
+ return currentEntitySet ? annotationExpression((currentEntitySet === null || currentEntitySet === void 0 ? void 0 : (_currentEntitySet$ann11 = currentEntitySet.annotations.UI) === null || _currentEntitySet$ann11 === void 0 ? void 0 : _currentEntitySet$ann11[sAnnotationTerm]) || false, visitedNavigationPaths, undefined, function (path) {
156
+ return singletonPathVisitor(path, converterContext, visitedNavigationPaths);
157
+ }) : constant(false);
158
+ }
159
+ /**
160
+ * Gets the annotated restrictions for the actions.
161
+ *
162
+ * @param {ConverterContext} converterContext
163
+ * @returns {StandardActionsRestrictionsType}
164
+ */
165
+
166
+
167
+ _exports.isActionAnnotatedHidden = isActionAnnotatedHidden;
168
+
169
+ function getRestrictions(converterContext) {
170
+ var dataModelObjectPath = converterContext.getDataModelObjectPath();
171
+ var restrictionsDef = [{
172
+ key: "isInsertable",
173
+ "function": isPathInsertable
174
+ }, {
175
+ key: "isUpdatable",
176
+ "function": isPathUpdatable
177
+ }, {
178
+ key: "isDeletable",
179
+ "function": isPathDeletable
180
+ }];
181
+ var result = {};
182
+ restrictionsDef.forEach(function (def) {
183
+ var _defFunction$apply;
184
+
185
+ var defFunction = def["function"];
186
+ result[def.key] = {
187
+ expression: defFunction.apply(null, [dataModelObjectPath]),
188
+ isOnlyCurrentEntityExpression: !!((_defFunction$apply = defFunction.apply(null, [dataModelObjectPath, undefined, true])) !== null && _defFunction$apply !== void 0 && _defFunction$apply.currentEntityRestriction)
189
+ };
190
+ });
191
+ return result;
192
+ }
193
+ /**
194
+ * Checks if templating for insert/update actions is mandatory.
195
+ *
196
+ * @param {StandardActionsContext} standardActionsContext
197
+ * @param {boolean} isDraftOrSticky
198
+ * @param {boolean} isCreateAlwaysHidden
199
+ * @returns {boolean}
200
+ */
201
+
202
+
203
+ _exports.getRestrictions = getRestrictions;
204
+
205
+ function getInsertUpdateActionsTemplating(standardActionsContext, isDraftOrSticky, isCreateAlwaysHidden) {
206
+ return (isDraftOrSticky || standardActionsContext.isExternalCreateConfigured) && !isCreateAlwaysHidden;
207
+ }
208
+ /**
209
+ * Gets the binding expressions for the properties of the action Create.
210
+ *
211
+ * @param {ConverterContext} converterContext
212
+ * @param {StandardActionsContext} standardActionsContext
213
+ * @returns {StandardActionConfigType}
214
+ */
215
+
216
+
217
+ _exports.getInsertUpdateActionsTemplating = getInsertUpdateActionsTemplating;
218
+
219
+ function getStandardActionCreate(converterContext, standardActionsContext) {
220
+ var createVisibility = getCreateVisibility(converterContext, standardActionsContext);
221
+ return {
222
+ isTemplated: compileBinding(getCreateTemplating(standardActionsContext, createVisibility)),
223
+ visible: compileBinding(createVisibility),
224
+ enabled: compileBinding(getCreateEnablement(converterContext, standardActionsContext, createVisibility))
225
+ };
226
+ }
227
+ /**
228
+ * Gets the binding expressions for the properties of the action Delete.
229
+ *
230
+ * @param {ConverterContext} converterContext
231
+ * @param {StandardActionsContext} standardActionsContext
232
+ * @returns {StandardActionConfigType}
233
+ */
234
+
235
+
236
+ _exports.getStandardActionCreate = getStandardActionCreate;
237
+
238
+ function getStandardActionDelete(converterContext, standardActionsContext) {
239
+ var deleteVisibility = getDeleteVisibility(converterContext, standardActionsContext);
240
+ return {
241
+ isTemplated: compileBinding(getDefaultTemplating(deleteVisibility)),
242
+ visible: compileBinding(deleteVisibility),
243
+ enabled: compileBinding(getDeleteEnablement(converterContext, standardActionsContext, deleteVisibility))
244
+ };
245
+ }
246
+ /**
247
+ * Gets the binding expressions for the properties of the action Paste.
248
+ *
249
+ * @param {ConverterContext} converterContext
250
+ * @param {StandardActionsContext} standardActionsContext
251
+ * @param {boolean} isInsertUpdateActionsTemplated
252
+ * @returns {StandardActionConfigType}
253
+ */
254
+
255
+
256
+ _exports.getStandardActionDelete = getStandardActionDelete;
257
+
258
+ function getStandardActionPaste(converterContext, standardActionsContext, isInsertUpdateActionsTemplated) {
259
+ var createVisibility = getCreateVisibility(converterContext, standardActionsContext);
260
+ var createEnablement = getCreateEnablement(converterContext, standardActionsContext, createVisibility);
261
+ var pasteVisibility = getPasteVisibility(converterContext, standardActionsContext, createVisibility, isInsertUpdateActionsTemplated);
262
+ return {
263
+ visible: compileBinding(pasteVisibility),
264
+ enabled: compileBinding(getPasteEnablement(pasteVisibility, createEnablement))
265
+ };
266
+ }
267
+ /**
268
+ * Gets the binding expressions for the properties of the action MassEdit.
269
+ *
270
+ * @param {ConverterContext} converterContext
271
+ * @param {StandardActionsContext} standardActionsContext
272
+ * @returns {StandardActionConfigType}
273
+ */
274
+
275
+
276
+ _exports.getStandardActionPaste = getStandardActionPaste;
277
+
278
+ function getStandardActionMassEdit(converterContext, standardActionsContext) {
279
+ var massEditVisibility = getMassEditVisibility(converterContext, standardActionsContext);
280
+ return {
281
+ isTemplated: compileBinding(getDefaultTemplating(massEditVisibility)),
282
+ visible: compileBinding(massEditVisibility),
283
+ enabled: compileBinding(getMassEditEnablement(converterContext, standardActionsContext, massEditVisibility))
284
+ };
285
+ }
286
+ /**
287
+ * Gets the binding expression for the templating of the action Create.
288
+ *
289
+ * @param {StandardActionsContext} standardActionsContext
290
+ * @param {Expression<boolean>} createVisibility
291
+ * @returns {Expression<boolean> }
292
+ */
293
+
294
+
295
+ _exports.getStandardActionMassEdit = getStandardActionMassEdit;
296
+
297
+ function getCreateTemplating(standardActionsContext, createVisibility) {
298
+ var isCreationRow = standardActionsContext.tableManifestConfiguration.creationMode === CreationMode.CreationRow;
299
+ var newAction = standardActionsContext.newAction;
300
+ var isInsertable = standardActionsContext.restrictions.isInsertable.expression; //Templating of Create Button is not done:
301
+ // - If Button is never visible or CreationMode is on CreationRow
302
+ // - Otherwise If new action is configured and never available
303
+ // - Otherwise If delete restrictions coming from NavigationRestrictions are constantly false
304
+ // - Otherwise If there is no external create action
305
+ // - Otherwise if there is delete restrictions on the current entitySet set to false
306
+
307
+ return ifElse(or(and(isConstant(createVisibility), equal(createVisibility, false)), isCreationRow), false, ifElse(and(isConstant(newAction === null || newAction === void 0 ? void 0 : newAction.available), equal(newAction === null || newAction === void 0 ? void 0 : newAction.available, false)), false, ifElse(and(not(standardActionsContext.restrictions.isInsertable.isOnlyCurrentEntityExpression), isConstant(isInsertable)), isInsertable, ifElse(standardActionsContext.isExternalCreateConfigured, true, not(and(isConstant(isInsertable), equal(isInsertable, constant(false))))))));
308
+ }
309
+ /**
310
+ * Gets the binding expression for the templating of the non-Create actions.
311
+ *
312
+ * @param {Expression<boolean>} actionVisibility
313
+ * @returns {Expression<boolean> }
314
+ */
315
+
316
+
317
+ _exports.getCreateTemplating = getCreateTemplating;
318
+
319
+ function getDefaultTemplating(actionVisibility) {
320
+ return not(and(isConstant(actionVisibility), equal(actionVisibility, false)));
321
+ }
322
+ /**
323
+ * Gets the binding expression for the property visible of the action Create.
324
+ *
325
+ * @param {ConverterContext} converterContext
326
+ * @param {StandardActionsContext} standardActionsContext
327
+ * @returns {Expression<boolean> }
328
+ */
329
+
330
+
331
+ _exports.getDefaultTemplating = getDefaultTemplating;
332
+
333
+ function getCreateVisibility(converterContext, standardActionsContext) {
334
+ var isInsertable = standardActionsContext.restrictions.isInsertable.expression;
335
+ var isCreateHidden = standardActionsContext.hiddenAnnotation.create;
336
+ var newAction = standardActionsContext.newAction; //Create Button is visible:
337
+ // - If the creation mode is external
338
+ // - If we're on the list report and create is not hidden
339
+ // - Otherwise this depends on the value of the the UI.IsEditable
340
+ // - Otherwise
341
+ // - If we're on the list report ->
342
+ // - If UI.CreateHidden points to a property path -> provide a negated binding to this path
343
+ // - Otherwise, create is visible
344
+ // - Otherwise
345
+ // - This depends on the value of the the UI.IsEditable
346
+
347
+ return ifElse(standardActionsContext.isExternalCreateConfigured, ifElse(converterContext.getTemplateType() === TemplateType.ListReport, not(isCreateHidden), and(not(isCreateHidden), UI.IsEditable)), ifElse(or(and(isConstant(newAction === null || newAction === void 0 ? void 0 : newAction.available), equal(newAction === null || newAction === void 0 ? void 0 : newAction.available, false)), and(isConstant(isInsertable), equal(isInsertable, false), !newAction), and(isConstant(isCreateHidden), equal(isCreateHidden, true)), standardActionsContext.isViewWithMultipleVisualizations, converterContext.getTemplateType() === TemplateType.AnalyticalListPage), false, ifElse(converterContext.getTemplateType() === TemplateType.ListReport, ifElse(isBinding(isCreateHidden), not(isCreateHidden), true), and(not(isCreateHidden), UI.IsEditable))));
348
+ }
349
+ /**
350
+ * Gets the binding expression for the property visible of the action Delete.
351
+ *
352
+ * @param {ConverterContext} converterContext
353
+ * @param {StandardActionsContext} standardActionsContext
354
+ * @returns {Expression<boolean> }
355
+ */
356
+
357
+
358
+ _exports.getCreateVisibility = getCreateVisibility;
359
+
360
+ function getDeleteVisibility(converterContext, standardActionsContext) {
361
+ var isDeleteHidden = standardActionsContext.hiddenAnnotation.delete;
362
+ var pathDeletableExpression = standardActionsContext.restrictions.isDeletable.expression; //Delete Button is visible:
363
+ // Prerequisites:
364
+ // - If we're not on multiple visualizations configuration or ALP
365
+ //
366
+ // - If restrictions on deletable set to false -> not visible
367
+ // - Otherwise
368
+ // - If UI.DeleteHidden is true -> not visible
369
+ // - Otherwise
370
+ // - If we're on OP -> depending of the editMode and restrictions on deletable
371
+ // - Otherwise
372
+ // - If UI.DeleteHidden points to a property path -> provide a negated binding to this path
373
+ // - Otherwise, delete is visible
374
+
375
+ return ifElse(or(standardActionsContext.isViewWithMultipleVisualizations, converterContext.getTemplateType() === TemplateType.AnalyticalListPage), false, ifElse(and(isConstant(pathDeletableExpression), equal(pathDeletableExpression, false)), false, ifElse(and(isConstant(isDeleteHidden), equal(isDeleteHidden, constant(true))), false, ifElse(converterContext.getTemplateType() !== TemplateType.ListReport, and(not(isDeleteHidden), equal(bindingExpression("/editMode", "ui"), "Editable")), ifElse(isBinding(isDeleteHidden), not(isDeleteHidden), true)))));
376
+ }
377
+ /**
378
+ * Gets the binding expression for the property visible of the action Paste.
379
+ *
380
+ * @param {ConverterContext} converterContext
381
+ * @param {StandardActionsContext} standardActionsContext
382
+ * @param {Expression<boolean>} createVisibility
383
+ * @param {boolean} isInsertUpdateActionsTemplated
384
+ * @returns {Expression<boolean> }
385
+ */
386
+
387
+
388
+ _exports.getDeleteVisibility = getDeleteVisibility;
389
+
390
+ function getPasteVisibility(converterContext, standardActionsContext, createVisibility, isInsertUpdateActionsTemplated) {
391
+ // If Create is visible, enablePaste is not disabled into manifest and we are on OP/blocks outside Fiori elements templates
392
+ // Then button will be visible according to insertable restrictions and create visibility
393
+ // Otherwise it's not visible
394
+ return ifElse(and(notEqual(standardActionsContext.tableManifestConfiguration.enablePaste, false), createVisibility, isInsertUpdateActionsTemplated), [TemplateType.ListReport, TemplateType.AnalyticalListPage].indexOf(converterContext.getTemplateType()) === -1 && standardActionsContext.restrictions.isInsertable.expression, false);
395
+ }
396
+ /**
397
+ * Gets the binding expression for the property visible of the action MassEdit.
398
+ *
399
+ * @param {ConverterContext} converterContext
400
+ * @param {StandardActionsContext} standardActionsContext
401
+ * @returns {Expression<boolean> }
402
+ */
403
+
404
+
405
+ _exports.getPasteVisibility = getPasteVisibility;
406
+
407
+ function getMassEditVisibility(converterContext, standardActionsContext) {
408
+ var _standardActionsConte;
409
+
410
+ var isUpdateHidden = standardActionsContext.hiddenAnnotation.update,
411
+ pathUpdatableExpression = standardActionsContext.restrictions.isUpdatable.expression,
412
+ bMassEditEnabledInManifest = ((_standardActionsConte = standardActionsContext.tableManifestConfiguration) === null || _standardActionsConte === void 0 ? void 0 : _standardActionsConte.enableMassEdit) || false;
413
+ var templateBindingExpression = converterContext.getTemplateType() === TemplateType.ObjectPage ? equal(UI.IsEditable, true) : converterContext.getTemplateType() === TemplateType.ListReport; //MassEdit is visible
414
+ // If
415
+ // - there is no static restrictions set to false
416
+ // - and enableMassEdit is not set to false into the manifest
417
+ // - and the selectionMode is relevant
418
+ // Then MassEdit is always visible in LR or dynamically visible in OP according to ui>Editable and hiddenAnnotation
419
+ // Button is hidden for all other cases
420
+
421
+ return ifElse(and(not(and(isConstant(pathUpdatableExpression), equal(pathUpdatableExpression, false))), bMassEditEnabledInManifest), and(templateBindingExpression, not(isUpdateHidden)), false);
422
+ }
423
+ /**
424
+ * Gets the binding expression for the property enabled of the action Create.
425
+ *
426
+ * @param {ConverterContext} converterContext
427
+ * @param {StandardActionsContext} standardActionsContext
428
+ * @param {Expression<boolean>} createVisibility
429
+ * @returns {Expression<boolean> }
430
+ */
431
+
432
+
433
+ _exports.getMassEditVisibility = getMassEditVisibility;
434
+
435
+ function getCreateEnablement(converterContext, standardActionsContext, createVisibility) {
436
+ var _converterContext$res;
437
+
438
+ var isInsertable = standardActionsContext.restrictions.isInsertable.expression;
439
+ var CollectionType = (_converterContext$res = converterContext.resolveAbsolutePath(standardActionsContext.collectionPath).target) === null || _converterContext$res === void 0 ? void 0 : _converterContext$res._type;
440
+ return and(createVisibility, ifElse(CollectionType === "EntitySet", true, ifElse(converterContext.getTemplateType() !== TemplateType.ObjectPage, isInsertable, and(isInsertable, equal(bindingExpression("/editMode", "ui"), "Editable")))));
441
+ }
442
+ /**
443
+ * Gets the binding expression for the property enabled of the action Delete.
444
+ *
445
+ * @param {ConverterContext} converterContext
446
+ * @param {StandardActionsContext} standardActionsContext
447
+ * @param {Expression<boolean>} deleteVisibility
448
+ * @returns {Expression<boolean> }
449
+ */
450
+
451
+
452
+ _exports.getCreateEnablement = getCreateEnablement;
453
+
454
+ function getDeleteEnablement(converterContext, standardActionsContext, deleteVisibility) {
455
+ var isDeletable = standardActionsContext.restrictions.isDeletable.expression;
456
+ var isOnlyDynamicOnCurrentEntity = standardActionsContext.restrictions.isDeletable.isOnlyCurrentEntityExpression && !isConstant(isDeletable);
457
+ var numberOfSelectedContexts = bindingExpression("numberOfSelectedContexts", "internal");
458
+ var numberOfDeletableContexts = bindingExpression("deletableContexts", "internal");
459
+ var numberOfUnSavedContexts = bindingExpression("unSavedContexts", "internal");
460
+ return and(deleteVisibility, ifElse(or(converterContext.getTemplateType() !== TemplateType.ObjectPage, isOnlyDynamicOnCurrentEntity), ifElse(or(and(notEqual(numberOfDeletableContexts, undefined), greaterThan(length(numberOfDeletableContexts), 0)), and(notEqual(numberOfUnSavedContexts, undefined), greaterThan(length(numberOfUnSavedContexts), 0))), bindingExpression("deleteEnabled", "internal"), false), and(notEqual(numberOfSelectedContexts, 0), isDeletable)));
461
+ }
462
+ /**
463
+ * Gets the binding expression for the property enabled of the action Paste.
464
+ *
465
+ * @param {Expression<boolean>} pasteVisibility
466
+ * @param {Expression<boolean>} createEnablement
467
+ * @returns {Expression<boolean> }
468
+ */
469
+
470
+
471
+ _exports.getDeleteEnablement = getDeleteEnablement;
472
+
473
+ function getPasteEnablement(pasteVisibility, createEnablement) {
474
+ return and(pasteVisibility, createEnablement);
475
+ }
476
+ /**
477
+ * Gets the binding expression for the property enabled of the action MassEdit.
478
+ *
479
+ * @param {ConverterContext} converterContext
480
+ * @param {StandardActionsContext} standardActionsContext
481
+ * @param {Expression<boolean>} massEditVisibility
482
+ * @returns {Expression<boolean> }
483
+ */
484
+
485
+
486
+ _exports.getPasteEnablement = getPasteEnablement;
487
+
488
+ function getMassEditEnablement(converterContext, standardActionsContext, massEditVisibility) {
489
+ var pathUpdatableExpression = standardActionsContext.restrictions.isUpdatable.expression;
490
+ var isOnlyDynamicOnCurrentEntity = standardActionsContext.restrictions.isUpdatable.isOnlyCurrentEntityExpression && !isConstant(pathUpdatableExpression);
491
+ var numberOfSelectedContexts = greaterOrEqual(bindingExpression("numberOfSelectedContexts", "internal"), 1);
492
+ var numberOfUpdatableContexts = greaterOrEqual(length(bindingExpression("updatableContexts", "internal")), 1);
493
+ var bIsDraftSupported = isDraftSupported(converterContext);
494
+ var bDisplayMode = isInDisplayMode(converterContext); // numberOfUpdatableContexts needs to be added to the binding in case
495
+ // 1. Update is dependent on current entity property (isOnlyDynamicOnCurrentEntity is true).
496
+ // 2. The table is read only and draft enabled(like LR), in this case only active contexts can be mass edited.
497
+ // So, update depends on 'IsActiveEntity' value which needs to be checked runtime.
498
+
499
+ var runtimeBinding = ifElse(or(and(bDisplayMode, bIsDraftSupported), isOnlyDynamicOnCurrentEntity), and(numberOfSelectedContexts, numberOfUpdatableContexts), and(numberOfSelectedContexts));
500
+ return and(massEditVisibility, ifElse(isOnlyDynamicOnCurrentEntity, runtimeBinding, and(runtimeBinding, pathUpdatableExpression)));
501
+ }
502
+ /**
503
+ * Tells if the table in template is in display mode.
504
+ *
505
+ * @param {ConverterContext} converterContext
506
+ * @param {ViewPathConfiguration} viewConfiguration
507
+ * @returns {boolean}
508
+ */
509
+
510
+
511
+ _exports.getMassEditEnablement = getMassEditEnablement;
512
+
513
+ function isInDisplayMode(converterContext, viewConfiguration) {
514
+ var templateType = converterContext.getTemplateType();
515
+
516
+ if (templateType === TemplateType.ListReport || templateType === TemplateType.AnalyticalListPage || viewConfiguration && converterContext.getManifestWrapper().hasMultipleVisualizations(viewConfiguration)) {
517
+ return true;
518
+ } // updatable will be handled at the property level
519
+
520
+
521
+ return false;
522
+ }
523
+
524
+ _exports.isInDisplayMode = isInDisplayMode;
525
+ return _exports;
526
+ }, false);
527
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlN0YW5kYXJkQWN0aW9ucy50cyJdLCJuYW1lcyI6WyJnZW5lcmF0ZVN0YW5kYXJkQWN0aW9uc0NvbnRleHQiLCJjb252ZXJ0ZXJDb250ZXh0IiwibmF2aWdhdGlvblNldHRpbmdzIiwidGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24iLCJ2aWV3Q29uZmlndXJhdGlvbiIsImNvbGxlY3Rpb25QYXRoIiwiZ2V0VGFyZ2V0T2JqZWN0UGF0aCIsImdldERhdGFNb2RlbE9iamVjdFBhdGgiLCJoaWRkZW5Bbm5vdGF0aW9uIiwiY3JlYXRlIiwiaXNBY3Rpb25Bbm5vdGF0ZWRIaWRkZW4iLCJ1cGRhdGUiLCJpc0V4dGVybmFsQ3JlYXRlQ29uZmlndXJlZCIsImlzRHJhZnRPclN0aWNreVN1cHBvcnRlZCIsImlzVmlld1dpdGhNdWx0aXBsZVZpc3VhbGl6YXRpb25zIiwiZ2V0TWFuaWZlc3RXcmFwcGVyIiwiaGFzTXVsdGlwbGVWaXN1YWxpemF0aW9ucyIsIm5ld0FjdGlvbiIsImdldE5ld0FjdGlvbiIsInJlc3RyaWN0aW9ucyIsImdldFJlc3RyaWN0aW9ucyIsIm5hdmlnYXRpb24iLCJvdXRib3VuZCIsIm91dGJvdW5kRGV0YWlsIiwidW5kZWZpbmVkIiwiaXNEcmFmdFN1cHBvcnRlZCIsImN1cnJlbnRFbnRpdHlTZXQiLCJnZXRFbnRpdHlTZXQiLCJiSXNEcmFmdFJvb3QiLCJhbm5vdGF0aW9ucyIsIkNvbW1vbiIsIkRyYWZ0Um9vdCIsImJJc0RyYWZ0Tm9kZSIsIkRyYWZ0Tm9kZSIsImJJc0RyYWZ0UGFyZW50RW50aXR5Rm9yQ29udGFpbm1lbnQiLCJ0YXJnZXRPYmplY3QiLCJjb250YWluc1RhcmdldCIsInN0YXJ0aW5nRW50aXR5U2V0IiwiYklzRHJhZnRTdXBwb3J0ZWQiLCJiSXNTdGlja3lTZXNzaW9uU3VwcG9ydGVkIiwiU2Vzc2lvbiIsIlN0aWNreVNlc3Npb25TdXBwb3J0ZWQiLCJuZXdBY3Rpb25OYW1lIiwiTmV3QWN0aW9uIiwidG9TdHJpbmciLCJhdmFpbGFibGVQcm9wZXJ0eSIsImdldEVudGl0eVR5cGUiLCJhY3Rpb25zIiwiQ29yZSIsIk9wZXJhdGlvbkF2YWlsYWJsZSIsIm5hbWUiLCJhdmFpbGFibGUiLCJhbm5vdGF0aW9uRXhwcmVzc2lvbiIsInNBbm5vdGF0aW9uVGVybSIsImRhdGFNb2RlbE9iamVjdFBhdGgiLCJ2aXNpdGVkTmF2aWdhdGlvblBhdGhzIiwibmF2aWdhdGlvblByb3BlcnRpZXMiLCJsZW5ndGgiLCJVSSIsInBhdGgiLCJzaW5nbGV0b25QYXRoVmlzaXRvciIsImNvbnN0YW50IiwicmVzdHJpY3Rpb25zRGVmIiwia2V5IiwiaXNQYXRoSW5zZXJ0YWJsZSIsImlzUGF0aFVwZGF0YWJsZSIsImlzUGF0aERlbGV0YWJsZSIsInJlc3VsdCIsImZvckVhY2giLCJkZWYiLCJkZWZGdW5jdGlvbiIsImV4cHJlc3Npb24iLCJhcHBseSIsImlzT25seUN1cnJlbnRFbnRpdHlFeHByZXNzaW9uIiwiY3VycmVudEVudGl0eVJlc3RyaWN0aW9uIiwiZ2V0SW5zZXJ0VXBkYXRlQWN0aW9uc1RlbXBsYXRpbmciLCJzdGFuZGFyZEFjdGlvbnNDb250ZXh0IiwiaXNEcmFmdE9yU3RpY2t5IiwiaXNDcmVhdGVBbHdheXNIaWRkZW4iLCJnZXRTdGFuZGFyZEFjdGlvbkNyZWF0ZSIsImNyZWF0ZVZpc2liaWxpdHkiLCJnZXRDcmVhdGVWaXNpYmlsaXR5IiwiaXNUZW1wbGF0ZWQiLCJjb21waWxlQmluZGluZyIsImdldENyZWF0ZVRlbXBsYXRpbmciLCJ2aXNpYmxlIiwiZW5hYmxlZCIsImdldENyZWF0ZUVuYWJsZW1lbnQiLCJnZXRTdGFuZGFyZEFjdGlvbkRlbGV0ZSIsImRlbGV0ZVZpc2liaWxpdHkiLCJnZXREZWxldGVWaXNpYmlsaXR5IiwiZ2V0RGVmYXVsdFRlbXBsYXRpbmciLCJnZXREZWxldGVFbmFibGVtZW50IiwiZ2V0U3RhbmRhcmRBY3Rpb25QYXN0ZSIsImlzSW5zZXJ0VXBkYXRlQWN0aW9uc1RlbXBsYXRlZCIsImNyZWF0ZUVuYWJsZW1lbnQiLCJwYXN0ZVZpc2liaWxpdHkiLCJnZXRQYXN0ZVZpc2liaWxpdHkiLCJnZXRQYXN0ZUVuYWJsZW1lbnQiLCJnZXRTdGFuZGFyZEFjdGlvbk1hc3NFZGl0IiwibWFzc0VkaXRWaXNpYmlsaXR5IiwiZ2V0TWFzc0VkaXRWaXNpYmlsaXR5IiwiZ2V0TWFzc0VkaXRFbmFibGVtZW50IiwiaXNDcmVhdGlvblJvdyIsImNyZWF0aW9uTW9kZSIsIkNyZWF0aW9uTW9kZSIsIkNyZWF0aW9uUm93IiwiaXNJbnNlcnRhYmxlIiwiaWZFbHNlIiwib3IiLCJhbmQiLCJpc0NvbnN0YW50IiwiZXF1YWwiLCJub3QiLCJhY3Rpb25WaXNpYmlsaXR5IiwiaXNDcmVhdGVIaWRkZW4iLCJnZXRUZW1wbGF0ZVR5cGUiLCJUZW1wbGF0ZVR5cGUiLCJMaXN0UmVwb3J0IiwiSXNFZGl0YWJsZSIsIkFuYWx5dGljYWxMaXN0UGFnZSIsImlzQmluZGluZyIsImlzRGVsZXRlSGlkZGVuIiwiZGVsZXRlIiwicGF0aERlbGV0YWJsZUV4cHJlc3Npb24iLCJpc0RlbGV0YWJsZSIsImJpbmRpbmdFeHByZXNzaW9uIiwibm90RXF1YWwiLCJlbmFibGVQYXN0ZSIsImluZGV4T2YiLCJpc1VwZGF0ZUhpZGRlbiIsInBhdGhVcGRhdGFibGVFeHByZXNzaW9uIiwiaXNVcGRhdGFibGUiLCJiTWFzc0VkaXRFbmFibGVkSW5NYW5pZmVzdCIsImVuYWJsZU1hc3NFZGl0IiwidGVtcGxhdGVCaW5kaW5nRXhwcmVzc2lvbiIsIk9iamVjdFBhZ2UiLCJDb2xsZWN0aW9uVHlwZSIsInJlc29sdmVBYnNvbHV0ZVBhdGgiLCJ0YXJnZXQiLCJfdHlwZSIsImlzT25seUR5bmFtaWNPbkN1cnJlbnRFbnRpdHkiLCJudW1iZXJPZlNlbGVjdGVkQ29udGV4dHMiLCJudW1iZXJPZkRlbGV0YWJsZUNvbnRleHRzIiwibnVtYmVyT2ZVblNhdmVkQ29udGV4dHMiLCJncmVhdGVyVGhhbiIsImdyZWF0ZXJPckVxdWFsIiwibnVtYmVyT2ZVcGRhdGFibGVDb250ZXh0cyIsImJEaXNwbGF5TW9kZSIsImlzSW5EaXNwbGF5TW9kZSIsInJ1bnRpbWVCaW5kaW5nIiwidGVtcGxhdGVUeXBlIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXNEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFTyxXQUFTQSw4QkFBVCxDQUNOQyxnQkFETSxFQUVOQyxrQkFGTSxFQUdOQywwQkFITSxFQUlOQyxpQkFKTSxFQUttQjtBQUN6QixXQUFPO0FBQ05DLE1BQUFBLGNBQWMsRUFBRUMsbUJBQW1CLENBQUNMLGdCQUFnQixDQUFDTSxzQkFBakIsRUFBRCxDQUQ3QjtBQUVOQyxNQUFBQSxnQkFBZ0IsRUFBRTtBQUNqQkMsUUFBQUEsTUFBTSxFQUFFQyx1QkFBdUIsQ0FBQ1QsZ0JBQUQsRUFBbUIsY0FBbkIsQ0FEZDtBQUVqQixrQkFBVVMsdUJBQXVCLENBQUNULGdCQUFELEVBQW1CLGNBQW5CLENBRmhCO0FBR2pCVSxRQUFBQSxNQUFNLEVBQUVELHVCQUF1QixDQUFDVCxnQkFBRCxFQUFtQixjQUFuQjtBQUhkLE9BRlo7QUFPTlcsTUFBQUEsMEJBQTBCLEVBQUVBLDBCQUEwQixDQUFDVixrQkFBRCxDQVBoRDtBQVFOVyxNQUFBQSx3QkFBd0IsRUFBRUEsd0JBQXdCLENBQUNaLGdCQUFELENBUjVDO0FBU05hLE1BQUFBLGdDQUFnQyxFQUFFVixpQkFBaUIsR0FDaERILGdCQUFnQixDQUFDYyxrQkFBakIsR0FBc0NDLHlCQUF0QyxDQUFnRVosaUJBQWhFLENBRGdELEdBRWhELEtBWEc7QUFZTmEsTUFBQUEsU0FBUyxFQUFFQyxZQUFZLENBQUNqQixnQkFBRCxDQVpqQjtBQWFORSxNQUFBQSwwQkFBMEIsRUFBRUEsMEJBYnRCO0FBY05nQixNQUFBQSxZQUFZLEVBQUVDLGVBQWUsQ0FBQ25CLGdCQUFEO0FBZHZCLEtBQVA7QUFnQkE7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FB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QVksR0FBR3RKLGdCQUFnQixDQUFDbUgsZUFBakIsRUFBckI7O0FBQ0EsUUFDQ21DLFlBQVksS0FBS2xDLFlBQVksQ0FBQ0MsVUFBOUIsSUFDQWlDLFlBQVksS0FBS2xDLFlBQVksQ0FBQ0csa0JBRDlCLElBRUNwSCxpQkFBaUIsSUFBSUgsZ0JBQWdCLENBQUNjLGtCQUFqQixHQUFzQ0MseUJBQXRDLENBQWdFWixpQkFBaEUsQ0FIdkIsRUFJRTtBQUNELGFBQU8sSUFBUDtBQUNBLEtBUnNILENBU3ZIOzs7QUFDQSxXQUFPLEtBQVA7QUFDQSIsInNvdXJjZVJvb3QiOiIuIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IENvbnZlcnRlckNvbnRleHQgZnJvbSBcIi4uLy4uLy4uL0NvbnZlcnRlckNvbnRleHRcIjtcbmltcG9ydCB7XG5cdGFuZCxcblx0YW5ub3RhdGlvbkV4cHJlc3Npb24sXG5cdGJpbmRpbmdFeHByZXNzaW9uLFxuXHRCaW5kaW5nRXhwcmVzc2lvbixcblx0Y29tcGlsZUJpbmRpbmcsXG5cdGNvbnN0YW50LFxuXHRlcXVhbCxcblx0bGVuZ3RoLFxuXHRFeHByZXNzaW9uLFxuXHRncmVhdGVyT3JFcXVhbCxcblx0aWZFbHNlLFxuXHRpc0JpbmRpbmcsXG5cdGlzQ29uc3RhbnQsXG5cdG5vdCxcblx0bm90RXF1YWwsXG5cdG9yLFxuXHRncmVhdGVyVGhhblxufSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9CaW5kaW5nRXhwcmVzc2lvblwiO1xuaW1wb3J0IHsgQ3JlYXRpb25Nb2RlLCBOYXZpZ2F0aW9uU2V0dGluZ3NDb25maWd1cmF0aW9uLCBUZW1wbGF0ZVR5cGUsIFZpZXdQYXRoQ29uZmlndXJhdGlvbiB9IGZyb20gXCIuLi8uLi8uLi9NYW5pZmVzdFNldHRpbmdzXCI7XG5pbXBvcnQgeyBzaW5nbGV0b25QYXRoVmlzaXRvciwgVUkgfSBmcm9tIFwiLi4vLi4vLi4vaGVscGVycy9CaW5kaW5nSGVscGVyXCI7XG5pbXBvcnQgeyBQcm9wZXJ0eUFubm90YXRpb25WYWx1ZSB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlc1wiO1xuaW1wb3J0IHsgZ2V0VGFyZ2V0T2JqZWN0UGF0aCwgaXNQYXRoRGVsZXRhYmxlLCBpc1BhdGhJbnNlcnRhYmxlLCBpc1BhdGhVcGRhdGFibGUgfSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9EYXRhTW9kZWxQYXRoSGVscGVyXCI7XG5pbXBvcnQgeyBUYWJsZUNvbnRyb2xDb25maWd1cmF0aW9uIH0gZnJvbSBcIi4uL1RhYmxlXCI7XG5cbmV4cG9ydCB0eXBlIFN0YW5kYXJkQWN0aW9uQ29uZmlnVHlwZSA9IHtcblx0aXNUZW1wbGF0ZWQ/OiBCaW5kaW5nRXhwcmVzc2lvbjxib29sZWFuPjtcblx0dmlzaWJsZTogQmluZGluZ0V4cHJlc3Npb248Ym9vbGVhbj47XG5cdGVuYWJsZWQ6IEJpbmRpbmdFeHByZXNzaW9uPGJvb2xlYW4+O1xufTtcblxudHlwZSBFeHByZXNzaW9uUmVzdHJpY3Rpb25zVHlwZSA9IHtcblx0ZXhwcmVzc2lvbjogRXhwcmVzc2lvbjxib29sZWFuPjtcblx0aXNPbmx5Q3VycmVudEVudGl0eUV4cHJlc3Npb246IGJvb2xlYW47XG59O1xudHlwZSBTdGFuZGFyZEFjdGlvbnNSZXN0cmljdGlvbnNUeXBlID0gUmVjb3JkPHN0cmluZywgRXhwcmVzc2lvblJlc3RyaWN0aW9uc1R5cGU+O1xuXG5leHBvcnQgdHlwZSBTdGFuZGFyZEFjdGlvbnNDb250ZXh0ID0ge1xuXHRjb2xsZWN0aW9uUGF0aDogc3RyaW5nO1xuXHRoaWRkZW5Bbm5vdGF0aW9uOiB7XG5cdFx0Y3JlYXRlOiBFeHByZXNzaW9uPGJvb2xlYW4+O1xuXHRcdFwiZGVsZXRlXCI6IEV4cHJlc3Npb248Ym9vbGVhbj47XG5cdFx0dXBkYXRlOiBFeHByZXNzaW9uPGJvb2xlYW4+O1xuXHR9O1xuXHRpc0V4dGVybmFsQ3JlYXRlQ29uZmlndXJlZDogYm9vbGVhbjtcblx0aXNEcmFmdE9yU3RpY2t5U3VwcG9ydGVkOiBib29sZWFuO1xuXHRpc1ZpZXdXaXRoTXVsdGlwbGVWaXN1YWxpemF0aW9uczogYm9vbGVhbjtcblx0bmV3QWN0aW9uPzoge1xuXHRcdG5hbWU/OiBzdHJpbmc7XG5cdFx0YXZhaWxhYmxlPzogRXhwcmVzc2lvbjxib29sZWFuPjtcblx0fTtcblx0dGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb246IFRhYmxlQ29udHJvbENvbmZpZ3VyYXRpb247XG5cdHJlc3RyaWN0aW9uczogU3RhbmRhcmRBY3Rpb25zUmVzdHJpY3Rpb25zVHlwZTtcbn07XG5cbi8qKlxuICogR2VuZXJhdGVzIHRoZSBjb250ZXh0IGZvciB0aGUgc3RhbmRhcmQgYWN0aW9ucy5cbiAqXG4gKiBAcGFyYW0ge0NvbnZlcnRlckNvbnRleHR9IGNvbnZlcnRlckNvbnRleHRcbiAqIEBwYXJhbSB7TmF2aWdhdGlvblNldHRpbmdzQ29uZmlndXJhdGlvbn0gbmF2aWdhdGlvblNldHRpbmdzXG4gKiBAcGFyYW0ge1RhYmxlQ29udHJvbENvbmZpZ3VyYXRpb259IHRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uXG4gKiBAcGFyYW0ge1ZpZXdQYXRoQ29uZmlndXJhdGlvbn0gdmlld0NvbmZpZ3VyYXRpb25cbiAqIEByZXR1cm5zICBUaGUgY29udGV4dCBmb3IgdGFibGUgYWN0aW9uc1xuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZVN0YW5kYXJkQWN0aW9uc0NvbnRleHQoXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdG5hdmlnYXRpb25TZXR0aW5nczogTmF2aWdhdGlvblNldHRpbmdzQ29uZmlndXJhdGlvbixcblx0dGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb246IFRhYmxlQ29udHJvbENvbmZpZ3VyYXRpb24sXG5cdHZpZXdDb25maWd1cmF0aW9uPzogVmlld1BhdGhDb25maWd1cmF0aW9uXG4pOiBTdGFuZGFyZEFjdGlvbnNDb250ZXh0IHtcblx0cmV0dXJuIHtcblx0XHRjb2xsZWN0aW9uUGF0aDogZ2V0VGFyZ2V0T2JqZWN0UGF0aChjb252ZXJ0ZXJDb250ZXh0LmdldERhdGFNb2RlbE9iamVjdFBhdGgoKSksXG5cdFx0aGlkZGVuQW5ub3RhdGlvbjoge1xuXHRcdFx0Y3JlYXRlOiBpc0FjdGlvbkFubm90YXRlZEhpZGRlbihjb252ZXJ0ZXJDb250ZXh0LCBcIkNyZWF0ZUhpZGRlblwiKSxcblx0XHRcdFwiZGVsZXRlXCI6IGlzQWN0aW9uQW5ub3RhdGVkSGlkZGVuKGNvbnZlcnRlckNvbnRleHQsIFwiRGVsZXRlSGlkZGVuXCIpLFxuXHRcdFx0dXBkYXRlOiBpc0FjdGlvbkFubm90YXRlZEhpZGRlbihjb252ZXJ0ZXJDb250ZXh0LCBcIlVwZGF0ZUhpZGRlblwiKVxuXHRcdH0sXG5cdFx0aXNFeHRlcm5hbENyZWF0ZUNvbmZpZ3VyZWQ6IGlzRXh0ZXJuYWxDcmVhdGVDb25maWd1cmVkKG5hdmlnYXRpb25TZXR0aW5ncyksXG5cdFx0aXNEcmFmdE9yU3RpY2t5U3VwcG9ydGVkOiBpc0RyYWZ0T3JTdGlja3lTdXBwb3J0ZWQoY29udmVydGVyQ29udGV4dCksXG5cdFx0aXNWaWV3V2l0aE11bHRpcGxlVmlzdWFsaXphdGlvbnM6IHZpZXdDb25maWd1cmF0aW9uXG5cdFx0XHQ/IGNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RXcmFwcGVyKCkuaGFzTXVsdGlwbGVWaXN1YWxpemF0aW9ucyh2aWV3Q29uZmlndXJhdGlvbilcblx0XHRcdDogZmFsc2UsXG5cdFx0bmV3QWN0aW9uOiBnZXROZXdBY3Rpb24oY29udmVydGVyQ29udGV4dCksXG5cdFx0dGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb246IHRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uLFxuXHRcdHJlc3RyaWN0aW9uczogZ2V0UmVzdHJpY3Rpb25zKGNvbnZlcnRlckNvbnRleHQpXG5cdH07XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGFuIGV4dGVybmFsIGNyZWF0ZWQgaXMgY29uZmlndXJlZCBmb3IgdGhlIG5hdmlnYXRpb24uXG4gKlxuICogQHBhcmFtIHtOYXZpZ2F0aW9uU2V0dGluZ3NDb25maWd1cmF0aW9ufSBuYXZpZ2F0aW9uU2V0dGluZ3NcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNFeHRlcm5hbENyZWF0ZUNvbmZpZ3VyZWQobmF2aWdhdGlvblNldHRpbmdzOiBOYXZpZ2F0aW9uU2V0dGluZ3NDb25maWd1cmF0aW9uKTogYm9vbGVhbiB7XG5cdGNvbnN0IG5hdmlnYXRpb24gPSBuYXZpZ2F0aW9uU2V0dGluZ3M/LmNyZWF0ZTtcblx0cmV0dXJuIChuYXZpZ2F0aW9uICYmIG5hdmlnYXRpb24ub3V0Ym91bmQgJiYgbmF2aWdhdGlvbi5vdXRib3VuZERldGFpbCkgIT09IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgZHJhZnQgaXMgc3VwcG9ydGVkLlxuICpcbiAqIEBwYXJhbSB7Q29udmVydGVyQ29udGV4dH0gY29udmVydGVyQ29udGV4dFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0RyYWZ0U3VwcG9ydGVkKGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQpOiBib29sZWFuIHtcblx0Y29uc3QgY3VycmVudEVudGl0eVNldCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0KCk7XG5cdGNvbnN0IGJJc0RyYWZ0Um9vdCA9IGN1cnJlbnRFbnRpdHlTZXQgJiYgY3VycmVudEVudGl0eVNldC5hbm5vdGF0aW9ucz8uQ29tbW9uPy5EcmFmdFJvb3QgPyB0cnVlIDogZmFsc2U7XG5cdGNvbnN0IGJJc0RyYWZ0Tm9kZSA9IGN1cnJlbnRFbnRpdHlTZXQgJiYgY3VycmVudEVudGl0eVNldC5hbm5vdGF0aW9ucz8uQ29tbW9uPy5EcmFmdE5vZGUgPyB0cnVlIDogZmFsc2U7XG5cdGNvbnN0IGJJc0RyYWZ0UGFyZW50RW50aXR5Rm9yQ29udGFpbm1lbnQgPVxuXHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpLnRhcmdldE9iamVjdD8uY29udGFpbnNUYXJnZXQgJiZcblx0XHQoY29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCkuc3RhcnRpbmdFbnRpdHlTZXQ/LmFubm90YXRpb25zPy5Db21tb24/LkRyYWZ0Um9vdCB8fFxuXHRcdFx0Y29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCkuc3RhcnRpbmdFbnRpdHlTZXQ/LmFubm90YXRpb25zPy5Db21tb24/LkRyYWZ0Tm9kZSlcblx0XHRcdD8gdHJ1ZVxuXHRcdFx0OiBmYWxzZTtcblxuXHRyZXR1cm4gYklzRHJhZnRSb290IHx8IGJJc0RyYWZ0Tm9kZSB8fCAoIWNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0KCkgJiYgYklzRHJhZnRQYXJlbnRFbnRpdHlGb3JDb250YWlubWVudCk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHN0aWNreSBvciBkcmFmdCBpcyBzdXBwb3J0ZWQuXG4gKlxuICogQHBhcmFtIHtDb252ZXJ0ZXJDb250ZXh0fSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRHJhZnRPclN0aWNreVN1cHBvcnRlZChjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0KTogYm9vbGVhbiB7XG5cdGNvbnN0IGJJc0RyYWZ0U3VwcG9ydGVkID0gaXNEcmFmdFN1cHBvcnRlZChjb252ZXJ0ZXJDb250ZXh0KTtcblx0Y29uc3QgYklzU3RpY2t5U2Vzc2lvblN1cHBvcnRlZCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpLnN0YXJ0aW5nRW50aXR5U2V0Py5hbm5vdGF0aW9ucz8uU2Vzc2lvblxuXHRcdD8uU3RpY2t5U2Vzc2lvblN1cHBvcnRlZFxuXHRcdD8gdHJ1ZVxuXHRcdDogZmFsc2U7XG5cblx0cmV0dXJuIGJJc0RyYWZ0U3VwcG9ydGVkIHx8IGJJc1N0aWNreVNlc3Npb25TdXBwb3J0ZWQ7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgY29uZmlndXJlZCBuZXdBY3Rpb24gaW50byBhbm5vdGF0aW9uLlxuICpcbiAqIEBwYXJhbSB7Q29udmVydGVyQ29udGV4dH0gY29udmVydGVyQ29udGV4dFxuICogQHJldHVybnMge2FueX1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE5ld0FjdGlvbihjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0KTogYW55IHtcblx0Y29uc3QgY3VycmVudEVudGl0eVNldCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0KCk7XG5cdGNvbnN0IG5ld0FjdGlvbk5hbWU6IEJpbmRpbmdFeHByZXNzaW9uPHN0cmluZz4gPSAoXG5cdFx0Y3VycmVudEVudGl0eVNldD8uYW5ub3RhdGlvbnM/LkNvbW1vbj8uRHJhZnRSb290Py5OZXdBY3Rpb24gfHxcblx0XHRjdXJyZW50RW50aXR5U2V0Py5hbm5vdGF0aW9ucz8uU2Vzc2lvbj8uU3RpY2t5U2Vzc2lvblN1cHBvcnRlZD8uTmV3QWN0aW9uXG5cdCk/LnRvU3RyaW5nKCk7XG5cdGlmIChuZXdBY3Rpb25OYW1lKSB7XG5cdFx0bGV0IGF2YWlsYWJsZVByb3BlcnR5OiBhbnkgPSBjb252ZXJ0ZXJDb250ZXh0Py5nZXRFbnRpdHlUeXBlKCkuYWN0aW9uc1tuZXdBY3Rpb25OYW1lXT8uYW5ub3RhdGlvbnM/LkNvcmU/Lk9wZXJhdGlvbkF2YWlsYWJsZTtcblx0XHRhdmFpbGFibGVQcm9wZXJ0eSA9IGF2YWlsYWJsZVByb3BlcnR5ICE9PSB1bmRlZmluZWQgPyBhdmFpbGFibGVQcm9wZXJ0eSA6IHRydWU7XG5cdFx0cmV0dXJuIHtcblx0XHRcdG5hbWU6IG5ld0FjdGlvbk5hbWUsXG5cdFx0XHRhdmFpbGFibGU6IGFubm90YXRpb25FeHByZXNzaW9uKGF2YWlsYWJsZVByb3BlcnR5KVxuXHRcdH07XG5cdH1cblx0cmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBiaW5kaW5nIGV4cHJlc3Npb24gZm9yIHRoZSBhY3Rpb24gdmlzaWJpbGl0eSBjb25maWd1cmVkIGludG8gYW5ub3RhdGlvbi5cbiAqXG4gKiBAcGFyYW0ge0NvbnZlcnRlckNvbnRleHR9IGNvbnZlcnRlckNvbnRleHRcbiAqIEBwYXJhbSB7c3RyaW5nfSBzQW5ub3RhdGlvblRlcm1cbiAqIEByZXR1cm5zIHtFeHByZXNzaW9uPGJvb2xlYW4+fVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNBY3Rpb25Bbm5vdGF0ZWRIaWRkZW4oY29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCwgc0Fubm90YXRpb25UZXJtOiBzdHJpbmcpOiBFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0Y29uc3QgY3VycmVudEVudGl0eVNldCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0KCk7XG5cdGNvbnN0IGRhdGFNb2RlbE9iamVjdFBhdGggPSBjb252ZXJ0ZXJDb250ZXh0LmdldERhdGFNb2RlbE9iamVjdFBhdGgoKTtcblx0Ly8gQ29uc2lkZXIgb25seSB0aGUgbGFzdCBsZXZlbCBvZiBuYXZpZ2F0aW9uLiBUaGUgb3RoZXJzIGFyZSBhbHJlYWR5IGNvbnNpZGVyZWQgaW4gdGhlIGVsZW1lbnQgYmluZGluZyBvZiB0aGUgcGFnZS5cblx0Y29uc3QgdmlzaXRlZE5hdmlnYXRpb25QYXRocyA9XG5cdFx0ZGF0YU1vZGVsT2JqZWN0UGF0aC5uYXZpZ2F0aW9uUHJvcGVydGllcy5sZW5ndGggPiAwXG5cdFx0XHQ/IFtkYXRhTW9kZWxPYmplY3RQYXRoLm5hdmlnYXRpb25Qcm9wZXJ0aWVzW2RhdGFNb2RlbE9iamVjdFBhdGgubmF2aWdhdGlvblByb3BlcnRpZXMubGVuZ3RoIC0gMV0ubmFtZV1cblx0XHRcdDogW107XG5cdHJldHVybiBjdXJyZW50RW50aXR5U2V0XG5cdFx0PyBhbm5vdGF0aW9uRXhwcmVzc2lvbihcblx0XHRcdFx0KChjdXJyZW50RW50aXR5U2V0Py5hbm5vdGF0aW9ucy5VSSBhcyBhbnkpPy5bc0Fubm90YXRpb25UZXJtXSBhcyBQcm9wZXJ0eUFubm90YXRpb25WYWx1ZTxib29sZWFuPikgfHwgZmFsc2UsXG5cdFx0XHRcdHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMsXG5cdFx0XHRcdHVuZGVmaW5lZCxcblx0XHRcdFx0KHBhdGg6IHN0cmluZykgPT4gc2luZ2xldG9uUGF0aFZpc2l0b3IocGF0aCwgY29udmVydGVyQ29udGV4dCwgdmlzaXRlZE5hdmlnYXRpb25QYXRocylcblx0XHQgIClcblx0XHQ6IGNvbnN0YW50KGZhbHNlKTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBhbm5vdGF0ZWQgcmVzdHJpY3Rpb25zIGZvciB0aGUgYWN0aW9ucy5cbiAqXG4gKiBAcGFyYW0ge0NvbnZlcnRlckNvbnRleHR9IGNvbnZlcnRlckNvbnRleHRcbiAqIEByZXR1cm5zIHtTdGFuZGFyZEFjdGlvbnNSZXN0cmljdGlvbnNUeXBlfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmVzdHJpY3Rpb25zKGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQpOiBTdGFuZGFyZEFjdGlvbnNSZXN0cmljdGlvbnNUeXBlIHtcblx0Y29uc3QgZGF0YU1vZGVsT2JqZWN0UGF0aCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpO1xuXHRjb25zdCByZXN0cmljdGlvbnNEZWYgPSBbXG5cdFx0e1xuXHRcdFx0a2V5OiBcImlzSW5zZXJ0YWJsZVwiLFxuXHRcdFx0XCJmdW5jdGlvblwiOiBpc1BhdGhJbnNlcnRhYmxlXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRrZXk6IFwiaXNVcGRhdGFibGVcIixcblx0XHRcdFwiZnVuY3Rpb25cIjogaXNQYXRoVXBkYXRhYmxlXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRrZXk6IFwiaXNEZWxldGFibGVcIixcblx0XHRcdFwiZnVuY3Rpb25cIjogaXNQYXRoRGVsZXRhYmxlXG5cdFx0fVxuXHRdO1xuXHRjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIEV4cHJlc3Npb25SZXN0cmljdGlvbnNUeXBlPiA9IHt9O1xuXHRyZXN0cmljdGlvbnNEZWYuZm9yRWFjaChmdW5jdGlvbihkZWYpIHtcblx0XHRjb25zdCBkZWZGdW5jdGlvbiA9IGRlZltcImZ1bmN0aW9uXCJdO1xuXHRcdHJlc3VsdFtkZWYua2V5XSA9IHtcblx0XHRcdGV4cHJlc3Npb246IGRlZkZ1bmN0aW9uLmFwcGx5KG51bGwsIFtkYXRhTW9kZWxPYmplY3RQYXRoXSksXG5cdFx0XHRpc09ubHlDdXJyZW50RW50aXR5RXhwcmVzc2lvbjogISEoZGVmRnVuY3Rpb24uYXBwbHkobnVsbCwgW2RhdGFNb2RlbE9iamVjdFBhdGgsIHVuZGVmaW5lZCwgdHJ1ZV0pIGFzIGFueSlcblx0XHRcdFx0Py5jdXJyZW50RW50aXR5UmVzdHJpY3Rpb25cblx0XHR9O1xuXHR9KTtcblx0cmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgdGVtcGxhdGluZyBmb3IgaW5zZXJ0L3VwZGF0ZSBhY3Rpb25zIGlzIG1hbmRhdG9yeS5cbiAqXG4gKiBAcGFyYW0ge1N0YW5kYXJkQWN0aW9uc0NvbnRleHR9IHN0YW5kYXJkQWN0aW9uc0NvbnRleHRcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNEcmFmdE9yU3RpY2t5XG4gKiBAcGFyYW0ge2Jvb2xlYW59IGlzQ3JlYXRlQWx3YXlzSGlkZGVuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEluc2VydFVwZGF0ZUFjdGlvbnNUZW1wbGF0aW5nKFxuXHRzdGFuZGFyZEFjdGlvbnNDb250ZXh0OiBTdGFuZGFyZEFjdGlvbnNDb250ZXh0LFxuXHRpc0RyYWZ0T3JTdGlja3k6IGJvb2xlYW4sXG5cdGlzQ3JlYXRlQWx3YXlzSGlkZGVuOiBib29sZWFuXG4pOiBib29sZWFuIHtcblx0cmV0dXJuIChpc0RyYWZ0T3JTdGlja3kgfHwgc3RhbmRhcmRBY3Rpb25zQ29udGV4dC5pc0V4dGVybmFsQ3JlYXRlQ29uZmlndXJlZCkgJiYgIWlzQ3JlYXRlQWx3YXlzSGlkZGVuO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIGJpbmRpbmcgZXhwcmVzc2lvbnMgZm9yIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBhY3Rpb24gQ3JlYXRlLlxuICpcbiAqIEBwYXJhbSB7Q29udmVydGVyQ29udGV4dH0gY29udmVydGVyQ29udGV4dFxuICogQHBhcmFtIHtTdGFuZGFyZEFjdGlvbnNDb250ZXh0fSBzdGFuZGFyZEFjdGlvbnNDb250ZXh0XG4gKiBAcmV0dXJucyB7U3RhbmRhcmRBY3Rpb25Db25maWdUeXBlfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3RhbmRhcmRBY3Rpb25DcmVhdGUoXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdHN0YW5kYXJkQWN0aW9uc0NvbnRleHQ6IFN0YW5kYXJkQWN0aW9uc0NvbnRleHRcbik6IFN0YW5kYXJkQWN0aW9uQ29uZmlnVHlwZSB7XG5cdGNvbnN0IGNyZWF0ZVZpc2liaWxpdHkgPSBnZXRDcmVhdGVWaXNpYmlsaXR5KGNvbnZlcnRlckNvbnRleHQsIHN0YW5kYXJkQWN0aW9uc0NvbnRleHQpO1xuXHRyZXR1cm4ge1xuXHRcdGlzVGVtcGxhdGVkOiBjb21waWxlQmluZGluZyhnZXRDcmVhdGVUZW1wbGF0aW5nKHN0YW5kYXJkQWN0aW9uc0NvbnRleHQsIGNyZWF0ZVZpc2liaWxpdHkpKSxcblx0XHR2aXNpYmxlOiBjb21waWxlQmluZGluZyhjcmVhdGVWaXNpYmlsaXR5KSxcblx0XHRlbmFibGVkOiBjb21waWxlQmluZGluZyhnZXRDcmVhdGVFbmFibGVtZW50KGNvbnZlcnRlckNvbnRleHQsIHN0YW5kYXJkQWN0aW9uc0NvbnRleHQsIGNyZWF0ZVZpc2liaWxpdHkpKVxuXHR9O1xufVxuXG4vKipcbiAqIEdldHMgdGhlIGJpbmRpbmcgZXhwcmVzc2lvbnMgZm9yIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBhY3Rpb24gRGVsZXRlLlxuICpcbiAqIEBwYXJhbSB7Q29udmVydGVyQ29udGV4dH0gY29udmVydGVyQ29udGV4dFxuICogQHBhcmFtIHtTdGFuZGFyZEFjdGlvbnNDb250ZXh0fSBzdGFuZGFyZEFjdGlvbnNDb250ZXh0XG4gKiBAcmV0dXJucyB7U3RhbmRhcmRBY3Rpb25Db25maWdUeXBlfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3RhbmRhcmRBY3Rpb25EZWxldGUoXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdHN0YW5kYXJkQWN0aW9uc0NvbnRleHQ6IFN0YW5kYXJkQWN0aW9uc0NvbnRleHRcbik6IFN0YW5kYXJkQWN0aW9uQ29uZmlnVHlwZSB7XG5cdGNvbnN0IGRlbGV0ZVZpc2liaWxpdHkgPSBnZXREZWxldGVWaXNpYmlsaXR5KGNvbnZlcnRlckNvbnRleHQsIHN0YW5kYXJkQWN0aW9uc0NvbnRleHQpO1xuXG5cdHJldHVybiB7XG5cdFx0aXNUZW1wbGF0ZWQ6IGNvbXBpbGVCaW5kaW5nKGdldERlZmF1bHRUZW1wbGF0aW5nKGRlbGV0ZVZpc2liaWxpdHkpKSxcblx0XHR2aXNpYmxlOiBjb21waWxlQmluZGluZyhkZWxldGVWaXNpYmlsaXR5KSxcblx0XHRlbmFibGVkOiBjb21waWxlQmluZGluZyhnZXREZWxldGVFbmFibGVtZW50KGNvbnZlcnRlckNvbnRleHQsIHN0YW5kYXJkQWN0aW9uc0NvbnRleHQsIGRlbGV0ZVZpc2liaWxpdHkpKVxuXHR9O1xufVxuXG4vKipcbiAqIEdldHMgdGhlIGJpbmRpbmcgZXhwcmVzc2lvbnMgZm9yIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBhY3Rpb24gUGFzdGUuXG4gKlxuICogQHBhcmFtIHtDb252ZXJ0ZXJDb250ZXh0fSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcGFyYW0ge1N0YW5kYXJkQWN0aW9uc0NvbnRleHR9IHN0YW5kYXJkQWN0aW9uc0NvbnRleHRcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNJbnNlcnRVcGRhdGVBY3Rpb25zVGVtcGxhdGVkXG4gKiBAcmV0dXJucyB7U3RhbmRhcmRBY3Rpb25Db25maWdUeXBlfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3RhbmRhcmRBY3Rpb25QYXN0ZShcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCxcblx0c3RhbmRhcmRBY3Rpb25zQ29udGV4dDogU3RhbmRhcmRBY3Rpb25zQ29udGV4dCxcblx0aXNJbnNlcnRVcGRhdGVBY3Rpb25zVGVtcGxhdGVkOiBib29sZWFuXG4pOiBTdGFuZGFyZEFjdGlvbkNvbmZpZ1R5cGUge1xuXHRjb25zdCBjcmVhdGVWaXNpYmlsaXR5ID0gZ2V0Q3JlYXRlVmlzaWJpbGl0eShjb252ZXJ0ZXJDb250ZXh0LCBzdGFuZGFyZEFjdGlvbnNDb250ZXh0KTtcblx0Y29uc3QgY3JlYXRlRW5hYmxlbWVudCA9IGdldENyZWF0ZUVuYWJsZW1lbnQoY29udmVydGVyQ29udGV4dCwgc3RhbmRhcmRBY3Rpb25zQ29udGV4dCwgY3JlYXRlVmlzaWJpbGl0eSk7XG5cdGNvbnN0IHBhc3RlVmlzaWJpbGl0eSA9IGdldFBhc3RlVmlzaWJpbGl0eShjb252ZXJ0ZXJDb250ZXh0LCBzdGFuZGFyZEFjdGlvbnNDb250ZXh0LCBjcmVhdGVWaXNpYmlsaXR5LCBpc0luc2VydFVwZGF0ZUFjdGlvbnNUZW1wbGF0ZWQpO1xuXHRyZXR1cm4ge1xuXHRcdHZpc2libGU6IGNvbXBpbGVCaW5kaW5nKHBhc3RlVmlzaWJpbGl0eSksXG5cdFx0ZW5hYmxlZDogY29tcGlsZUJpbmRpbmcoZ2V0UGFzdGVFbmFibGVtZW50KHBhc3RlVmlzaWJpbGl0eSwgY3JlYXRlRW5hYmxlbWVudCkpXG5cdH07XG59XG5cbi8qKlxuICogR2V0cyB0aGUgYmluZGluZyBleHByZXNzaW9ucyBmb3IgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGFjdGlvbiBNYXNzRWRpdC5cbiAqXG4gKiBAcGFyYW0ge0NvbnZlcnRlckNvbnRleHR9IGNvbnZlcnRlckNvbnRleHRcbiAqIEBwYXJhbSB7U3RhbmRhcmRBY3Rpb25zQ29udGV4dH0gc3RhbmRhcmRBY3Rpb25zQ29udGV4dFxuICogQHJldHVybnMge1N0YW5kYXJkQWN0aW9uQ29uZmlnVHlwZX1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFN0YW5kYXJkQWN0aW9uTWFzc0VkaXQoXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdHN0YW5kYXJkQWN0aW9uc0NvbnRleHQ6IFN0YW5kYXJkQWN0aW9uc0NvbnRleHRcbik6IFN0YW5kYXJkQWN0aW9uQ29uZmlnVHlwZSB7XG5cdGNvbnN0IG1hc3NFZGl0VmlzaWJpbGl0eSA9IGdldE1hc3NFZGl0VmlzaWJpbGl0eShjb252ZXJ0ZXJDb250ZXh0LCBzdGFuZGFyZEFjdGlvbnNDb250ZXh0KTtcblxuXHRyZXR1cm4ge1xuXHRcdGlzVGVtcGxhdGVkOiBjb21waWxlQmluZGluZyhnZXREZWZhdWx0VGVtcGxhdGluZyhtYXNzRWRpdFZpc2liaWxpdHkpKSxcblx0XHR2aXNpYmxlOiBjb21waWxlQmluZGluZyhtYXNzRWRpdFZpc2liaWxpdHkpLFxuXHRcdGVuYWJsZWQ6IGNvbXBpbGVCaW5kaW5nKGdldE1hc3NFZGl0RW5hYmxlbWVudChjb252ZXJ0ZXJDb250ZXh0LCBzdGFuZGFyZEFjdGlvbnNDb250ZXh0LCBtYXNzRWRpdFZpc2liaWxpdHkpKVxuXHR9O1xufVxuXG4vKipcbiAqIEdldHMgdGhlIGJpbmRpbmcgZXhwcmVzc2lvbiBmb3IgdGhlIHRlbXBsYXRpbmcgb2YgdGhlIGFjdGlvbiBDcmVhdGUuXG4gKlxuICogQHBhcmFtIHtTdGFuZGFyZEFjdGlvbnNDb250ZXh0fSBzdGFuZGFyZEFjdGlvbnNDb250ZXh0XG4gKiBAcGFyYW0ge0V4cHJlc3Npb248Ym9vbGVhbj59IGNyZWF0ZVZpc2liaWxpdHlcbiAqIEByZXR1cm5zIHtFeHByZXNzaW9uPGJvb2xlYW4+IH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENyZWF0ZVRlbXBsYXRpbmcoXG5cdHN0YW5kYXJkQWN0aW9uc0NvbnRleHQ6IFN0YW5kYXJkQWN0aW9uc0NvbnRleHQsXG5cdGNyZWF0ZVZpc2liaWxpdHk6IEV4cHJlc3Npb248Ym9vbGVhbj5cbik6IEV4cHJlc3Npb248Ym9vbGVhbj4ge1xuXHRjb25zdCBpc0NyZWF0aW9uUm93ID0gc3RhbmRhcmRBY3Rpb25zQ29udGV4dC50YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbi5jcmVhdGlvbk1vZGUgPT09IENyZWF0aW9uTW9kZS5DcmVhdGlvblJvdztcblx0Y29uc3QgbmV3QWN0aW9uID0gc3RhbmRhcmRBY3Rpb25zQ29udGV4dC5uZXdBY3Rpb247XG5cdGNvbnN0IGlzSW5zZXJ0YWJsZSA9IHN0YW5kYXJkQWN0aW9uc0NvbnRleHQucmVzdHJpY3Rpb25zLmlzSW5zZXJ0YWJsZS5leHByZXNzaW9uO1xuXG5cdC8vVGVtcGxhdGluZyBvZiBDcmVhdGUgQnV0dG9uIGlzIG5vdCBkb25lOlxuXHQvLyBcdCAtIElmIEJ1dHRvbiBpcyBuZXZlciB2aXNpYmxlIG9yIENyZWF0aW9uTW9kZSBpcyBvbiBDcmVhdGlvblJvd1xuXHQvLyAgIC0gT3RoZXJ3aXNlIElmIG5ldyBhY3Rpb24gaXMgY29uZmlndXJlZCBhbmQgbmV2ZXIgYXZhaWxhYmxlXG5cdC8vXHQgLSBPdGhlcndpc2UgSWYgZGVsZXRlIHJlc3RyaWN0aW9ucyBjb21pbmcgZnJvbSBOYXZpZ2F0aW9uUmVzdHJpY3Rpb25zIGFyZSBjb25zdGFudGx5IGZhbHNlXG5cdC8vICAgLSBPdGhlcndpc2UgSWYgdGhlcmUgaXMgbm8gZXh0ZXJuYWwgY3JlYXRlIGFjdGlvblxuXHQvL1x0IC0gT3RoZXJ3aXNlIGlmIHRoZXJlIGlzIGRlbGV0ZSByZXN0cmljdGlvbnMgb24gdGhlIGN1cnJlbnQgZW50aXR5U2V0IHNldCB0byBmYWxzZVxuXG5cdHJldHVybiBpZkVsc2UoXG5cdFx0b3IoYW5kKGlzQ29uc3RhbnQoY3JlYXRlVmlzaWJpbGl0eSksIGVxdWFsKGNyZWF0ZVZpc2liaWxpdHksIGZhbHNlKSksIGlzQ3JlYXRpb25Sb3cpLFxuXHRcdGZhbHNlLFxuXHRcdGlmRWxzZShcblx0XHRcdGFuZChpc0NvbnN0YW50KG5ld0FjdGlvbj8uYXZhaWxhYmxlKSwgZXF1YWwobmV3QWN0aW9uPy5hdmFpbGFibGUsIGZhbHNlKSksXG5cdFx0XHRmYWxzZSxcblx0XHRcdGlmRWxzZShcblx0XHRcdFx0YW5kKG5vdChzdGFuZGFyZEFjdGlvbnNDb250ZXh0LnJlc3RyaWN0aW9ucy5pc0luc2VydGFibGUuaXNPbmx5Q3VycmVudEVudGl0eUV4cHJlc3Npb24pLCBpc0NvbnN0YW50KGlzSW5zZXJ0YWJsZSkpLFxuXHRcdFx0XHRpc0luc2VydGFibGUsXG5cdFx0XHRcdGlmRWxzZShcblx0XHRcdFx0XHRzdGFuZGFyZEFjdGlvbnNDb250ZXh0LmlzRXh0ZXJuYWxDcmVhdGVDb25maWd1cmVkLFxuXHRcdFx0XHRcdHRydWUsXG5cdFx0XHRcdFx0bm90KGFuZChpc0NvbnN0YW50KGlzSW5zZXJ0YWJsZSksIGVxdWFsKGlzSW5zZXJ0YWJsZSwgY29uc3RhbnQoZmFsc2UpKSkpXG5cdFx0XHRcdClcblx0XHRcdClcblx0XHQpXG5cdCk7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgYmluZGluZyBleHByZXNzaW9uIGZvciB0aGUgdGVtcGxhdGluZyBvZiB0aGUgbm9uLUNyZWF0ZSBhY3Rpb25zLlxuICpcbiAqIEBwYXJhbSB7RXhwcmVzc2lvbjxib29sZWFuPn0gYWN0aW9uVmlzaWJpbGl0eVxuICogQHJldHVybnMge0V4cHJlc3Npb248Ym9vbGVhbj4gfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVmYXVsdFRlbXBsYXRpbmcoYWN0aW9uVmlzaWJpbGl0eTogRXhwcmVzc2lvbjxib29sZWFuPik6IEV4cHJlc3Npb248Ym9vbGVhbj4ge1xuXHRyZXR1cm4gbm90KGFuZChpc0NvbnN0YW50KGFjdGlvblZpc2liaWxpdHkpLCBlcXVhbChhY3Rpb25WaXNpYmlsaXR5LCBmYWxzZSkpKTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBiaW5kaW5nIGV4cHJlc3Npb24gZm9yIHRoZSBwcm9wZXJ0eSB2aXNpYmxlIG9mIHRoZSBhY3Rpb24gQ3JlYXRlLlxuICpcbiAqIEBwYXJhbSB7Q29udmVydGVyQ29udGV4dH0gY29udmVydGVyQ29udGV4dFxuICogQHBhcmFtIHtTdGFuZGFyZEFjdGlvbnNDb250ZXh0fSBzdGFuZGFyZEFjdGlvbnNDb250ZXh0XG4gKiBAcmV0dXJucyB7RXhwcmVzc2lvbjxib29sZWFuPiB9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDcmVhdGVWaXNpYmlsaXR5KFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LFxuXHRzdGFuZGFyZEFjdGlvbnNDb250ZXh0OiBTdGFuZGFyZEFjdGlvbnNDb250ZXh0XG4pOiBFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0Y29uc3QgaXNJbnNlcnRhYmxlID0gc3RhbmRhcmRBY3Rpb25zQ29udGV4dC5yZXN0cmljdGlvbnMuaXNJbnNlcnRhYmxlLmV4cHJlc3Npb247XG5cdGNvbnN0IGlzQ3JlYXRlSGlkZGVuID0gc3RhbmRhcmRBY3Rpb25zQ29udGV4dC5oaWRkZW5Bbm5vdGF0aW9uLmNyZWF0ZTtcblx0Y29uc3QgbmV3QWN0aW9uID0gc3RhbmRhcmRBY3Rpb25zQ29udGV4dC5uZXdBY3Rpb247XG5cblx0Ly9DcmVhdGUgQnV0dG9uIGlzIHZpc2libGU6XG5cdC8vIFx0IC0gSWYgdGhlIGNyZWF0aW9uIG1vZGUgaXMgZXh0ZXJuYWxcblx0Ly8gICAgICAtIElmIHdlJ3JlIG9uIHRoZSBsaXN0IHJlcG9ydCBhbmQgY3JlYXRlIGlzIG5vdCBoaWRkZW5cblx0Ly9cdFx0LSBPdGhlcndpc2UgdGhpcyBkZXBlbmRzIG9uIHRoZSB2YWx1ZSBvZiB0aGUgdGhlIFVJLklzRWRpdGFibGVcblx0Ly8gICAtIE90aGVyd2lzZVxuXHQvLyBcdCBcdC0gSWYgd2UncmUgb24gdGhlIGxpc3QgcmVwb3J0IC0+XG5cdC8vIFx0IFx0XHQtIElmIFVJLkNyZWF0ZUhpZGRlbiBwb2ludHMgdG8gYSBwcm9wZXJ0eSBwYXRoIC0+IHByb3ZpZGUgYSBuZWdhdGVkIGJpbmRpbmcgdG8gdGhpcyBwYXRoXG5cdC8vIFx0IFx0XHQtIE90aGVyd2lzZSwgY3JlYXRlIGlzIHZpc2libGVcblx0Ly8gXHQgXHQtIE90aGVyd2lzZVxuXHQvLyBcdCAgXHQgLSBUaGlzIGRlcGVuZHMgb24gdGhlIHZhbHVlIG9mIHRoZSB0aGUgVUkuSXNFZGl0YWJsZVxuXHRyZXR1cm4gaWZFbHNlKFxuXHRcdHN0YW5kYXJkQWN0aW9uc0NvbnRleHQuaXNFeHRlcm5hbENyZWF0ZUNvbmZpZ3VyZWQsXG5cdFx0aWZFbHNlKFxuXHRcdFx0Y29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSA9PT0gVGVtcGxhdGVUeXBlLkxpc3RSZXBvcnQsXG5cdFx0XHRub3QoaXNDcmVhdGVIaWRkZW4pLFxuXHRcdFx0YW5kKG5vdChpc0NyZWF0ZUhpZGRlbiksIFVJLklzRWRpdGFibGUpXG5cdFx0KSxcblx0XHRpZkVsc2UoXG5cdFx0XHRvcihcblx0XHRcdFx0YW5kKGlzQ29uc3RhbnQobmV3QWN0aW9uPy5hdmFpbGFibGUpLCBlcXVhbChuZXdBY3Rpb24/LmF2YWlsYWJsZSwgZmFsc2UpKSxcblx0XHRcdFx0YW5kKGlzQ29uc3RhbnQoaXNJbnNlcnRhYmxlKSwgZXF1YWwoaXNJbnNlcnRhYmxlLCBmYWxzZSksICFuZXdBY3Rpb24pLFxuXHRcdFx0XHRhbmQoaXNDb25zdGFudChpc0NyZWF0ZUhpZGRlbiksIGVxdWFsKGlzQ3JlYXRlSGlkZGVuLCB0cnVlKSksXG5cdFx0XHRcdHN0YW5kYXJkQWN0aW9uc0NvbnRleHQuaXNWaWV3V2l0aE11bHRpcGxlVmlzdWFsaXphdGlvbnMsXG5cdFx0XHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0VGVtcGxhdGVUeXBlKCkgPT09IFRlbXBsYXRlVHlwZS5BbmFseXRpY2FsTGlzdFBhZ2Vcblx0XHRcdCksXG5cdFx0XHRmYWxzZSxcblx0XHRcdGlmRWxzZShcblx0XHRcdFx0Y29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSA9PT0gVGVtcGxhdGVUeXBlLkxpc3RSZXBvcnQsXG5cdFx0XHRcdGlmRWxzZShpc0JpbmRpbmcoaXNDcmVhdGVIaWRkZW4pLCBub3QoaXNDcmVhdGVIaWRkZW4pLCB0cnVlKSxcblx0XHRcdFx0YW5kKG5vdChpc0NyZWF0ZUhpZGRlbiksIFVJLklzRWRpdGFibGUpXG5cdFx0XHQpXG5cdFx0KVxuXHQpO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIGJpbmRpbmcgZXhwcmVzc2lvbiBmb3IgdGhlIHByb3BlcnR5IHZpc2libGUgb2YgdGhlIGFjdGlvbiBEZWxldGUuXG4gKlxuICogQHBhcmFtIHtDb252ZXJ0ZXJDb250ZXh0fSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcGFyYW0ge1N0YW5kYXJkQWN0aW9uc0NvbnRleHR9IHN0YW5kYXJkQWN0aW9uc0NvbnRleHRcbiAqIEByZXR1cm5zIHtFeHByZXNzaW9uPGJvb2xlYW4+IH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldERlbGV0ZVZpc2liaWxpdHkoXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdHN0YW5kYXJkQWN0aW9uc0NvbnRleHQ6IFN0YW5kYXJkQWN0aW9uc0NvbnRleHRcbik6IEV4cHJlc3Npb248Ym9vbGVhbj4ge1xuXHRjb25zdCBpc0RlbGV0ZUhpZGRlbiA9IHN0YW5kYXJkQWN0aW9uc0NvbnRleHQuaGlkZGVuQW5ub3RhdGlvbi5kZWxldGU7XG5cdGNvbnN0IHBhdGhEZWxldGFibGVFeHByZXNzaW9uID0gc3RhbmRhcmRBY3Rpb25zQ29udGV4dC5yZXN0cmljdGlvbnMuaXNEZWxldGFibGUuZXhwcmVzc2lvbjtcblxuXHQvL0RlbGV0ZSBCdXR0b24gaXMgdmlzaWJsZTpcblx0Ly8gXHQgUHJlcmVxdWlzaXRlczpcblx0Ly9cdCAtIElmIHdlJ3JlIG5vdCBvbiBtdWx0aXBsZSB2aXN1YWxpemF0aW9ucyBjb25maWd1cmF0aW9uIG9yIEFMUFxuXHQvL1xuXHQvLyAgIC0gSWYgcmVzdHJpY3Rpb25zIG9uIGRlbGV0YWJsZSBzZXQgdG8gZmFsc2UgLT4gbm90IHZpc2libGVcblx0Ly8gICAtIE90aGVyd2lzZVxuXHQvL1x0XHRcdC0gSWYgVUkuRGVsZXRlSGlkZGVuIGlzIHRydWUgLT4gbm90IHZpc2libGVcblx0Ly9cdFx0XHQtIE90aGVyd2lzZVxuXHQvLyBcdCBcdFx0XHQtIElmIHdlJ3JlIG9uIE9QIC0+IGRlcGVuZGluZyBvZiB0aGUgZWRpdE1vZGUgYW5kIHJlc3RyaWN0aW9ucyBvbiBkZWxldGFibGVcblx0Ly9cdFx0XHRcdC0gT3RoZXJ3aXNlXG5cdC8vXHRcdFx0XHQgXHQtIElmIFVJLkRlbGV0ZUhpZGRlbiBwb2ludHMgdG8gYSBwcm9wZXJ0eSBwYXRoIC0+IHByb3ZpZGUgYSBuZWdhdGVkIGJpbmRpbmcgdG8gdGhpcyBwYXRoXG5cdC8vXHQgXHQgXHRcdCBcdC0gT3RoZXJ3aXNlLCBkZWxldGUgaXMgdmlzaWJsZVxuXG5cdHJldHVybiBpZkVsc2UoXG5cdFx0b3Ioc3RhbmRhcmRBY3Rpb25zQ29udGV4dC5pc1ZpZXdXaXRoTXVsdGlwbGVWaXN1YWxpemF0aW9ucywgY29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSA9PT0gVGVtcGxhdGVUeXBlLkFuYWx5dGljYWxMaXN0UGFnZSksXG5cdFx0ZmFsc2UsXG5cdFx0aWZFbHNlKFxuXHRcdFx0YW5kKGlzQ29uc3RhbnQocGF0aERlbGV0YWJsZUV4cHJlc3Npb24pLCBlcXVhbChwYXRoRGVsZXRhYmxlRXhwcmVzc2lvbiwgZmFsc2UpKSxcblx0XHRcdGZhbHNlLFxuXHRcdFx0aWZFbHNlKFxuXHRcdFx0XHRhbmQoaXNDb25zdGFudChpc0RlbGV0ZUhpZGRlbiksIGVxdWFsKGlzRGVsZXRlSGlkZGVuLCBjb25zdGFudCh0cnVlKSkpLFxuXHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0aWZFbHNlKFxuXHRcdFx0XHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0VGVtcGxhdGVUeXBlKCkgIT09IFRlbXBsYXRlVHlwZS5MaXN0UmVwb3J0LFxuXHRcdFx0XHRcdGFuZChub3QoaXNEZWxldGVIaWRkZW4pLCBlcXVhbChiaW5kaW5nRXhwcmVzc2lvbihcIi9lZGl0TW9kZVwiLCBcInVpXCIpLCBcIkVkaXRhYmxlXCIpKSxcblx0XHRcdFx0XHRpZkVsc2UoaXNCaW5kaW5nKGlzRGVsZXRlSGlkZGVuKSwgbm90KGlzRGVsZXRlSGlkZGVuKSwgdHJ1ZSlcblx0XHRcdFx0KVxuXHRcdFx0KVxuXHRcdClcblx0KTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBiaW5kaW5nIGV4cHJlc3Npb24gZm9yIHRoZSBwcm9wZXJ0eSB2aXNpYmxlIG9mIHRoZSBhY3Rpb24gUGFzdGUuXG4gKlxuICogQHBhcmFtIHtDb252ZXJ0ZXJDb250ZXh0fSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcGFyYW0ge1N0YW5kYXJkQWN0aW9uc0NvbnRleHR9IHN0YW5kYXJkQWN0aW9uc0NvbnRleHRcbiAqIEBwYXJhbSB7RXhwcmVzc2lvbjxib29sZWFuPn0gY3JlYXRlVmlzaWJpbGl0eVxuICogQHBhcmFtIHtib29sZWFufSBpc0luc2VydFVwZGF0ZUFjdGlvbnNUZW1wbGF0ZWRcbiAqIEByZXR1cm5zIHtFeHByZXNzaW9uPGJvb2xlYW4+IH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFBhc3RlVmlzaWJpbGl0eShcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCxcblx0c3RhbmRhcmRBY3Rpb25zQ29udGV4dDogU3RhbmRhcmRBY3Rpb25zQ29udGV4dCxcblx0Y3JlYXRlVmlzaWJpbGl0eTogRXhwcmVzc2lvbjxib29sZWFuPixcblx0aXNJbnNlcnRVcGRhdGVBY3Rpb25zVGVtcGxhdGVkOiBib29sZWFuXG4pOiBFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0Ly8gSWYgQ3JlYXRlIGlzIHZpc2libGUsIGVuYWJsZVBhc3RlIGlzIG5vdCBkaXNhYmxlZCBpbnRvIG1hbmlmZXN0IGFuZCB3ZSBhcmUgb24gT1AvYmxvY2tzIG91dHNpZGUgRmlvcmkgZWxlbWVudHMgdGVtcGxhdGVzXG5cdC8vIFRoZW4gYnV0dG9uIHdpbGwgYmUgdmlzaWJsZSBhY2NvcmRpbmcgdG8gaW5zZXJ0YWJsZSByZXN0cmljdGlvbnMgYW5kIGNyZWF0ZSB2aXNpYmlsaXR5XG5cdC8vIE90aGVyd2lzZSBpdCdzIG5vdCB2aXNpYmxlXG5cdHJldHVybiBpZkVsc2UoXG5cdFx0YW5kKFxuXHRcdFx0bm90RXF1YWwoc3RhbmRhcmRBY3Rpb25zQ29udGV4dC50YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbi5lbmFibGVQYXN0ZSwgZmFsc2UpLFxuXHRcdFx0Y3JlYXRlVmlzaWJpbGl0eSxcblx0XHRcdGlzSW5zZXJ0VXBkYXRlQWN0aW9uc1RlbXBsYXRlZFxuXHRcdCksXG5cdFx0W1RlbXBsYXRlVHlwZS5MaXN0UmVwb3J0LCBUZW1wbGF0ZVR5cGUuQW5hbHl0aWNhbExpc3RQYWdlXS5pbmRleE9mKGNvbnZlcnRlckNvbnRleHQuZ2V0VGVtcGxhdGVUeXBlKCkpID09PSAtMSAmJlxuXHRcdFx0c3RhbmRhcmRBY3Rpb25zQ29udGV4dC5yZXN0cmljdGlvbnMuaXNJbnNlcnRhYmxlLmV4cHJlc3Npb24sXG5cdFx0ZmFsc2Vcblx0KTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBiaW5kaW5nIGV4cHJlc3Npb24gZm9yIHRoZSBwcm9wZXJ0eSB2aXNpYmxlIG9mIHRoZSBhY3Rpb24gTWFzc0VkaXQuXG4gKlxuICogQHBhcmFtIHtDb252ZXJ0ZXJDb250ZXh0fSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcGFyYW0ge1N0YW5kYXJkQWN0aW9uc0NvbnRleHR9IHN0YW5kYXJkQWN0aW9uc0NvbnRleHRcbiAqIEByZXR1cm5zIHtFeHByZXNzaW9uPGJvb2xlYW4+IH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE1hc3NFZGl0VmlzaWJpbGl0eShcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCxcblx0c3RhbmRhcmRBY3Rpb25zQ29udGV4dDogU3RhbmRhcmRBY3Rpb25zQ29udGV4dFxuKTogRXhwcmVzc2lvbjxib29sZWFuPiB7XG5cdGNvbnN0IGlzVXBkYXRlSGlkZGVuID0gc3RhbmRhcmRBY3Rpb25zQ29udGV4dC5oaWRkZW5Bbm5vdGF0aW9uLnVwZGF0ZSxcblx0XHRwYXRoVXBkYXRhYmxlRXhwcmVzc2lvbiA9IHN0YW5kYXJkQWN0aW9uc0NvbnRleHQucmVzdHJpY3Rpb25zLmlzVXBkYXRhYmxlLmV4cHJlc3Npb24sXG5cdFx0Yk1hc3NFZGl0RW5hYmxlZEluTWFuaWZlc3Q6IGJvb2xlYW4gPSBzdGFuZGFyZEFjdGlvbnNDb250ZXh0LnRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uPy5lbmFibGVNYXNzRWRpdCB8fCBmYWxzZTtcblx0Y29uc3QgdGVtcGxhdGVCaW5kaW5nRXhwcmVzc2lvbiA9XG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSA9PT0gVGVtcGxhdGVUeXBlLk9iamVjdFBhZ2Vcblx0XHRcdD8gZXF1YWwoVUkuSXNFZGl0YWJsZSwgdHJ1ZSlcblx0XHRcdDogY29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSA9PT0gVGVtcGxhdGVUeXBlLkxpc3RSZXBvcnQ7XG5cdC8vTWFzc0VkaXQgaXMgdmlzaWJsZVxuXHQvLyBJZlxuXHQvL1x0XHQtIHRoZXJlIGlzIG5vIHN0YXRpYyByZXN0cmljdGlvbnMgc2V0IHRvIGZhbHNlXG5cdC8vXHRcdC0gYW5kIGVuYWJsZU1hc3NFZGl0IGlzIG5vdCBzZXQgdG8gZmFsc2UgaW50byB0aGUgbWFuaWZlc3Rcblx0Ly9cdFx0LSBhbmQgdGhlIHNlbGVjdGlvbk1vZGUgaXMgcmVsZXZhbnRcblx0Ly9cdFRoZW4gTWFzc0VkaXQgaXMgYWx3YXlzIHZpc2libGUgaW4gTFIgb3IgZHluYW1pY2FsbHkgdmlzaWJsZSBpbiBPUCBhY2NvcmRpbmcgdG8gdWk+RWRpdGFibGUgYW5kIGhpZGRlbkFubm90YXRpb25cblx0Ly8gIEJ1dHRvbiBpcyBoaWRkZW4gZm9yIGFsbCBvdGhlciBjYXNlc1xuXHRyZXR1cm4gaWZFbHNlKFxuXHRcdGFuZChub3QoYW5kKGlzQ29uc3RhbnQocGF0aFVwZGF0YWJsZUV4cHJlc3Npb24pLCBlcXVhbChwYXRoVXBkYXRhYmxlRXhwcmVzc2lvbiwgZmFsc2UpKSksIGJNYXNzRWRpdEVuYWJsZWRJbk1hbmlmZXN0KSxcblx0XHRhbmQodGVtcGxhdGVCaW5kaW5nRXhwcmVzc2lvbiwgbm90KGlzVXBkYXRlSGlkZGVuKSksXG5cdFx0ZmFsc2Vcblx0KTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBiaW5kaW5nIGV4cHJlc3Npb24gZm9yIHRoZSBwcm9wZXJ0eSBlbmFibGVkIG9mIHRoZSBhY3Rpb24gQ3JlYXRlLlxuICpcbiAqIEBwYXJhbSB7Q29udmVydGVyQ29udGV4dH0gY29udmVydGVyQ29udGV4dFxuICogQHBhcmFtIHtTdGFuZGFyZEFjdGlvbnNDb250ZXh0fSBzdGFuZGFyZEFjdGlvbnNDb250ZXh0XG4gKiBAcGFyYW0ge0V4cHJlc3Npb248Ym9vbGVhbj59IGNyZWF0ZVZpc2liaWxpdHlcbiAqIEByZXR1cm5zIHtFeHByZXNzaW9uPGJvb2xlYW4+IH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENyZWF0ZUVuYWJsZW1lbnQoXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdHN0YW5kYXJkQWN0aW9uc0NvbnRleHQ6IFN0YW5kYXJkQWN0aW9uc0NvbnRleHQsXG5cdGNyZWF0ZVZpc2liaWxpdHk6IEV4cHJlc3Npb248Ym9vbGVhbj5cbik6IEV4cHJlc3Npb248Ym9vbGVhbj4ge1xuXHRjb25zdCBpc0luc2VydGFibGUgPSBzdGFuZGFyZEFjdGlvbnNDb250ZXh0LnJlc3RyaWN0aW9ucy5pc0luc2VydGFibGUuZXhwcmVzc2lvbjtcblx0Y29uc3QgQ29sbGVjdGlvblR5cGUgPSBjb252ZXJ0ZXJDb250ZXh0LnJlc29sdmVBYnNvbHV0ZVBhdGg8YW55PihzdGFuZGFyZEFjdGlvbnNDb250ZXh0LmNvbGxlY3Rpb25QYXRoKS50YXJnZXQ/Ll90eXBlO1xuXHRyZXR1cm4gYW5kKFxuXHRcdGNyZWF0ZVZpc2liaWxpdHksXG5cdFx0aWZFbHNlKFxuXHRcdFx0Q29sbGVjdGlvblR5cGUgPT09IFwiRW50aXR5U2V0XCIsXG5cdFx0XHR0cnVlLFxuXHRcdFx0aWZFbHNlKFxuXHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldFRlbXBsYXRlVHlwZSgpICE9PSBUZW1wbGF0ZVR5cGUuT2JqZWN0UGFnZSxcblx0XHRcdFx0aXNJbnNlcnRhYmxlLFxuXHRcdFx0XHRhbmQoaXNJbnNlcnRhYmxlLCBlcXVhbChiaW5kaW5nRXhwcmVzc2lvbihcIi9lZGl0TW9kZVwiLCBcInVpXCIpLCBcIkVkaXRhYmxlXCIpKVxuXHRcdFx0KVxuXHRcdClcblx0KTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBiaW5kaW5nIGV4cHJlc3Npb24gZm9yIHRoZSBwcm9wZXJ0eSBlbmFibGVkIG9mIHRoZSBhY3Rpb24gRGVsZXRlLlxuICpcbiAqIEBwYXJhbSB7Q29udmVydGVyQ29udGV4dH0gY29udmVydGVyQ29udGV4dFxuICogQHBhcmFtIHtTdGFuZGFyZEFjdGlvbnNDb250ZXh0fSBzdGFuZGFyZEFjdGlvbnNDb250ZXh0XG4gKiBAcGFyYW0ge0V4cHJlc3Npb248Ym9vbGVhbj59IGRlbGV0ZVZpc2liaWxpdHlcbiAqIEByZXR1cm5zIHtFeHByZXNzaW9uPGJvb2xlYW4+IH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldERlbGV0ZUVuYWJsZW1lbnQoXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdHN0YW5kYXJkQWN0aW9uc0NvbnRleHQ6IFN0YW5kYXJkQWN0aW9uc0NvbnRleHQsXG5cdGRlbGV0ZVZpc2liaWxpdHk6IEV4cHJlc3Npb248Ym9vbGVhbj5cbik6IEV4cHJlc3Npb248Ym9vbGVhbj4ge1xuXHRjb25zdCBpc0RlbGV0YWJsZSA9IHN0YW5kYXJkQWN0aW9uc0NvbnRleHQucmVzdHJpY3Rpb25zLmlzRGVsZXRhYmxlLmV4cHJlc3Npb247XG5cdGNvbnN0IGlzT25seUR5bmFtaWNPbkN1cnJlbnRFbnRpdHkgPVxuXHRcdHN0YW5kYXJkQWN0aW9uc0NvbnRleHQucmVzdHJpY3Rpb25zLmlzRGVsZXRhYmxlLmlzT25seUN1cnJlbnRFbnRpdHlFeHByZXNzaW9uICYmICFpc0NvbnN0YW50KGlzRGVsZXRhYmxlKTtcblx0Y29uc3QgbnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzID0gYmluZGluZ0V4cHJlc3Npb24oXCJudW1iZXJPZlNlbGVjdGVkQ29udGV4dHNcIiwgXCJpbnRlcm5hbFwiKTtcblx0Y29uc3QgbnVtYmVyT2ZEZWxldGFibGVDb250ZXh0cyA9IGJpbmRpbmdFeHByZXNzaW9uKFwiZGVsZXRhYmxlQ29udGV4dHNcIiwgXCJpbnRlcm5hbFwiKTtcblx0Y29uc3QgbnVtYmVyT2ZVblNhdmVkQ29udGV4dHMgPSBiaW5kaW5nRXhwcmVzc2lvbihcInVuU2F2ZWRDb250ZXh0c1wiLCBcImludGVybmFsXCIpO1xuXG5cdHJldHVybiBhbmQoXG5cdFx0ZGVsZXRlVmlzaWJpbGl0eSxcblx0XHRpZkVsc2UoXG5cdFx0XHRvcihjb252ZXJ0ZXJDb250ZXh0LmdldFRlbXBsYXRlVHlwZSgpICE9PSBUZW1wbGF0ZVR5cGUuT2JqZWN0UGFnZSwgaXNPbmx5RHluYW1pY09uQ3VycmVudEVudGl0eSksXG5cdFx0XHRpZkVsc2UoXG5cdFx0XHRcdG9yKFxuXHRcdFx0XHRcdGFuZChub3RFcXVhbChudW1iZXJPZkRlbGV0YWJsZUNvbnRleHRzLCB1bmRlZmluZWQpLCBncmVhdGVyVGhhbihsZW5ndGgobnVtYmVyT2ZEZWxldGFibGVDb250ZXh0cyksIDApKSxcblx0XHRcdFx0XHRhbmQobm90RXF1YWwobnVtYmVyT2ZVblNhdmVkQ29udGV4dHMsIHVuZGVmaW5lZCksIGdyZWF0ZXJUaGFuKGxlbmd0aChudW1iZXJPZlVuU2F2ZWRDb250ZXh0cyksIDApKVxuXHRcdFx0XHQpLFxuXHRcdFx0XHRiaW5kaW5nRXhwcmVzc2lvbihcImRlbGV0ZUVuYWJsZWRcIiwgXCJpbnRlcm5hbFwiKSxcblx0XHRcdFx0ZmFsc2Vcblx0XHRcdCksXG5cdFx0XHRhbmQobm90RXF1YWwobnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzLCAwKSwgaXNEZWxldGFibGUpXG5cdFx0KVxuXHQpO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIGJpbmRpbmcgZXhwcmVzc2lvbiBmb3IgdGhlIHByb3BlcnR5IGVuYWJsZWQgb2YgdGhlIGFjdGlvbiBQYXN0ZS5cbiAqXG4gKiBAcGFyYW0ge0V4cHJlc3Npb248Ym9vbGVhbj59IHBhc3RlVmlzaWJpbGl0eVxuICogQHBhcmFtIHtFeHByZXNzaW9uPGJvb2xlYW4+fSBjcmVhdGVFbmFibGVtZW50XG4gKiBAcmV0dXJucyB7RXhwcmVzc2lvbjxib29sZWFuPiB9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRQYXN0ZUVuYWJsZW1lbnQocGFzdGVWaXNpYmlsaXR5OiBFeHByZXNzaW9uPGJvb2xlYW4+LCBjcmVhdGVFbmFibGVtZW50OiBFeHByZXNzaW9uPGJvb2xlYW4+KTogRXhwcmVzc2lvbjxib29sZWFuPiB7XG5cdHJldHVybiBhbmQocGFzdGVWaXNpYmlsaXR5LCBjcmVhdGVFbmFibGVtZW50KTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBiaW5kaW5nIGV4cHJlc3Npb24gZm9yIHRoZSBwcm9wZXJ0eSBlbmFibGVkIG9mIHRoZSBhY3Rpb24gTWFzc0VkaXQuXG4gKlxuICogQHBhcmFtIHtDb252ZXJ0ZXJDb250ZXh0fSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcGFyYW0ge1N0YW5kYXJkQWN0aW9uc0NvbnRleHR9IHN0YW5kYXJkQWN0aW9uc0NvbnRleHRcbiAqIEBwYXJhbSB7RXhwcmVzc2lvbjxib29sZWFuPn0gbWFzc0VkaXRWaXNpYmlsaXR5XG4gKiBAcmV0dXJucyB7RXhwcmVzc2lvbjxib29sZWFuPiB9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRNYXNzRWRpdEVuYWJsZW1lbnQoXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdHN0YW5kYXJkQWN0aW9uc0NvbnRleHQ6IFN0YW5kYXJkQWN0aW9uc0NvbnRleHQsXG5cdG1hc3NFZGl0VmlzaWJpbGl0eTogRXhwcmVzc2lvbjxib29sZWFuPlxuKTogRXhwcmVzc2lvbjxib29sZWFuPiB7XG5cdGNvbnN0IHBhdGhVcGRhdGFibGVFeHByZXNzaW9uID0gc3RhbmRhcmRBY3Rpb25zQ29udGV4dC5yZXN0cmljdGlvbnMuaXNVcGRhdGFibGUuZXhwcmVzc2lvbjtcblx0Y29uc3QgaXNPbmx5RHluYW1pY09uQ3VycmVudEVudGl0eTogYW55ID1cblx0XHRzdGFuZGFyZEFjdGlvbnNDb250ZXh0LnJlc3RyaWN0aW9ucy5pc1VwZGF0YWJsZS5pc09ubHlDdXJyZW50RW50aXR5RXhwcmVzc2lvbiAmJiAhaXNDb25zdGFudChwYXRoVXBkYXRhYmxlRXhwcmVzc2lvbik7XG5cdGNvbnN0IG51bWJlck9mU2VsZWN0ZWRDb250ZXh0cyA9IGdyZWF0ZXJPckVxdWFsKGJpbmRpbmdFeHByZXNzaW9uKFwibnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzXCIsIFwiaW50ZXJuYWxcIiksIDEpO1xuXHRjb25zdCBudW1iZXJPZlVwZGF0YWJsZUNvbnRleHRzID0gZ3JlYXRlck9yRXF1YWwobGVuZ3RoKGJpbmRpbmdFeHByZXNzaW9uKFwidXBkYXRhYmxlQ29udGV4dHNcIiwgXCJpbnRlcm5hbFwiKSksIDEpO1xuXHRjb25zdCBiSXNEcmFmdFN1cHBvcnRlZCA9IGlzRHJhZnRTdXBwb3J0ZWQoY29udmVydGVyQ29udGV4dCk7XG5cdGNvbnN0IGJEaXNwbGF5TW9kZSA9IGlzSW5EaXNwbGF5TW9kZShjb252ZXJ0ZXJDb250ZXh0KTtcblxuXHQvLyBudW1iZXJPZlVwZGF0YWJsZUNvbnRleHRzIG5lZWRzIHRvIGJlIGFkZGVkIHRvIHRoZSBiaW5kaW5nIGluIGNhc2Vcblx0Ly8gMS4gVXBkYXRlIGlzIGRlcGVuZGVudCBvbiBjdXJyZW50IGVudGl0eSBwcm9wZXJ0eSAoaXNPbmx5RHluYW1pY09uQ3VycmVudEVudGl0eSBpcyB0cnVlKS5cblx0Ly8gMi4gVGhlIHRhYmxlIGlzIHJlYWQgb25seSBhbmQgZHJhZnQgZW5hYmxlZChsaWtlIExSKSwgaW4gdGhpcyBjYXNlIG9ubHkgYWN0aXZlIGNvbnRleHRzIGNhbiBiZSBtYXNzIGVkaXRlZC5cblx0Ly8gICAgU28sIHVwZGF0ZSBkZXBlbmRzIG9uICdJc0FjdGl2ZUVudGl0eScgdmFsdWUgd2hpY2ggbmVlZHMgdG8gYmUgY2hlY2tlZCBydW50aW1lLlxuXHRjb25zdCBydW50aW1lQmluZGluZyA9IGlmRWxzZShcblx0XHRvcihhbmQoYkRpc3BsYXlNb2RlLCBiSXNEcmFmdFN1cHBvcnRlZCksIGlzT25seUR5bmFtaWNPbkN1cnJlbnRFbnRpdHkpLFxuXHRcdGFuZChudW1iZXJPZlNlbGVjdGVkQ29udGV4dHMsIG51bWJlck9mVXBkYXRhYmxlQ29udGV4dHMpLFxuXHRcdGFuZChudW1iZXJPZlNlbGVjdGVkQ29udGV4dHMpXG5cdCk7XG5cblx0cmV0dXJuIGFuZChtYXNzRWRpdFZpc2liaWxpdHksIGlmRWxzZShpc09ubHlEeW5hbWljT25DdXJyZW50RW50aXR5LCBydW50aW1lQmluZGluZywgYW5kKHJ1bnRpbWVCaW5kaW5nLCBwYXRoVXBkYXRhYmxlRXhwcmVzc2lvbikpKTtcbn1cblxuLyoqXG4gKiBUZWxscyBpZiB0aGUgdGFibGUgaW4gdGVtcGxhdGUgaXMgaW4gZGlzcGxheSBtb2RlLlxuICpcbiAqIEBwYXJhbSB7Q29udmVydGVyQ29udGV4dH0gY29udmVydGVyQ29udGV4dFxuICogQHBhcmFtIHtWaWV3UGF0aENvbmZpZ3VyYXRpb259IHZpZXdDb25maWd1cmF0aW9uXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzSW5EaXNwbGF5TW9kZShjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LCB2aWV3Q29uZmlndXJhdGlvbj86IFZpZXdQYXRoQ29uZmlndXJhdGlvbik6IGJvb2xlYW4ge1xuXHRjb25zdCB0ZW1wbGF0ZVR5cGUgPSBjb252ZXJ0ZXJDb250ZXh0LmdldFRlbXBsYXRlVHlwZSgpO1xuXHRpZiAoXG5cdFx0dGVtcGxhdGVUeXBlID09PSBUZW1wbGF0ZVR5cGUuTGlzdFJlcG9ydCB8fFxuXHRcdHRlbXBsYXRlVHlwZSA9PT0gVGVtcGxhdGVUeXBlLkFuYWx5dGljYWxMaXN0UGFnZSB8fFxuXHRcdCh2aWV3Q29uZmlndXJhdGlvbiAmJiBjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0V3JhcHBlcigpLmhhc011bHRpcGxlVmlzdWFsaXphdGlvbnModmlld0NvbmZpZ3VyYXRpb24pKVxuXHQpIHtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXHQvLyB1cGRhdGFibGUgd2lsbCBiZSBoYW5kbGVkIGF0IHRoZSBwcm9wZXJ0eSBsZXZlbFxuXHRyZXR1cm4gZmFsc2U7XG59XG4iXX0=