@sapui5/sap.fe.core 1.98.0 → 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 (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 +63 -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 +559 -608
  27. package/src/sap/fe/core/actions/draft.ts +593 -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 +54 -211
  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 +47 -45
  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,517 +1,548 @@
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
+ sap.ui.define(["sap/m/MessageToast", "sap/m/MessageItem", "sap/m/MessageView", "sap/m/Button", "sap/m/Dialog", "sap/m/Text", "sap/ui/core/library", "sap/ui/model/Filter", "sap/ui/model/FilterOperator", "sap/ui/core/message/Message", "sap/ui/core/IconPool", "sap/ui/model/json/JSONModel", "sap/ui/core/format/DateFormat", "sap/m/Bar", "sap/m/MessageBox", "sap/m/FormattedText"], function (MessageToast, MessageItem, MessageView, Button, Dialog, Text, CoreLib, Filter, FilterOperator, Message, IconPool, JSONModel, DateFormat, Bar, MessageBox, FormattedText) {
6
+ "use strict";
5
7
 
6
- // Static functions for Fiori Message Handling
7
- sap.ui.define(
8
- [
9
- "sap/m/MessageToast",
10
- "sap/m/MessageItem",
11
- "sap/m/MessageView",
12
- "sap/m/Button",
13
- "sap/m/Dialog",
14
- "sap/ui/core/library",
15
- "sap/ui/model/Filter",
16
- "sap/ui/model/FilterOperator",
17
- "sap/ui/core/message/Message",
18
- "sap/ui/core/IconPool",
19
- "sap/ui/model/json/JSONModel",
20
- "sap/ui/core/format/DateFormat"
21
- ],
22
- function(
23
- MessageToast,
24
- MessageItem,
25
- MessageView,
26
- Button,
27
- Dialog,
28
- CoreLib,
29
- Filter,
30
- FilterOperator,
31
- Message,
32
- IconPool,
33
- JSONModel,
34
- DateFormat
35
- ) {
36
- "use strict";
37
- var MessageType = CoreLib.MessageType;
38
- var that = this;
39
-
40
- function fnFormatTechnicalDetails() {
41
- var sPreviousGroupName;
42
- // Insert technical detail if it exists
43
- function insertDetail(oProperty) {
44
- return oProperty.property
45
- ? "( ${" +
46
- oProperty.property +
47
- '} ? ("<p>' +
48
- oProperty.property.substr(
49
- Math.max(oProperty.property.lastIndexOf("/"), oProperty.property.lastIndexOf(".")) + 1
50
- ) +
51
- ' : " + ' +
52
- "${" +
53
- oProperty.property +
54
- '} + "</p>") : "" )'
55
- : "";
56
- }
57
- // Insert groupname if it exists
58
- function insertGroupName(oProperty) {
59
- var sHTML = "";
60
- if (oProperty.groupName && oProperty.property && oProperty.groupName !== sPreviousGroupName) {
61
- sHTML += "( ${" + oProperty.property + '} ? "<br><h3>' + oProperty.groupName + '</h3>" : "" ) + ';
62
- sPreviousGroupName = oProperty.groupName;
63
- }
64
- return sHTML;
65
- }
66
-
67
- // List of technical details to be shown
68
- function getPaths() {
69
- var sTD = "technicalDetails"; // name of property in message model data for technical details
70
- return [
71
- { "groupName": "", "property": sTD + "/status" },
72
- { "groupName": "", "property": sTD + "/statusText" },
73
- { "groupName": "Application", "property": sTD + "/error/@SAP__common.Application/ComponentId" },
74
- { "groupName": "Application", "property": sTD + "/error/@SAP__common.Application/ServiceId" },
75
- { "groupName": "Application", "property": sTD + "/error/@SAP__common.Application/ServiceRepository" },
76
- { "groupName": "Application", "property": sTD + "/error/@SAP__common.Application/ServiceVersion" },
77
- { "groupName": "ErrorResolution", "property": sTD + "/error/@SAP__common.ErrorResolution/Analysis" },
78
- { "groupName": "ErrorResolution", "property": sTD + "/error/@SAP__common.ErrorResolution/Note" },
79
- { "groupName": "ErrorResolution", "property": sTD + "/error/@SAP__common.ErrorResolution/DetailedNote" },
80
- { "groupName": "ErrorResolution", "property": sTD + "/error/@SAP__common.ExceptionCategory" },
81
- { "groupName": "ErrorResolution", "property": sTD + "/error/@SAP__common.TimeStamp" },
82
- { "groupName": "ErrorResolution", "property": sTD + "/error/@SAP__common.TransactionId" },
83
- { "groupName": "Messages", "property": sTD + "/error/code" },
84
- { "groupName": "Messages", "property": sTD + "/error/message" }
85
- ];
86
- }
87
- var sHTML = "Object.keys(" + "${technicalDetails}" + ').length > 0 ? "<h2>Technical Details</h2>" : "" ';
88
- getPaths().forEach(function(oProperty) {
89
- sHTML = sHTML + insertGroupName(oProperty) + "" + insertDetail(oProperty) + " + ";
90
- });
91
- return sHTML;
92
- }
93
- function fnFormatDescription() {
94
- var sHTML = "(${" + 'description} ? ("<h2>Description</h2>" + ${' + 'description}) : "")';
95
- return sHTML;
96
- }
97
- /**
98
- * Calculates the highest priority message type(Error/Warning/Success/Information) from the available messages.
99
-
100
- * @function
101
- * @name sap.fe.core.actions.messageHandling.fnGetHighestMessagePriority
102
- * @memberof sap.fe.core.actions.messageHandling
103
- * @param {Array} [aMessages] Messages list
104
- * @returns {string} Highest priority message from the available messages
105
- * @private
106
- * @ui5-restricted
107
- */
108
- function fnGetHighestMessagePriority(aMessages) {
109
- var sMessagePriority = MessageType.None,
110
- iLength = aMessages.length,
111
- oMessageCount = { Error: 0, Warning: 0, Success: 0, Information: 0 };
112
-
113
- for (var i = 0; i < iLength; i++) {
114
- ++oMessageCount[aMessages[i].getType()];
115
- }
116
- if (oMessageCount[MessageType.Error] > 0) {
117
- sMessagePriority = MessageType.Error;
118
- } else if (oMessageCount[MessageType.Warning] > 0) {
119
- sMessagePriority = MessageType.Warning;
120
- } else if (oMessageCount[MessageType.Success] > 0) {
121
- sMessagePriority = MessageType.Success;
122
- } else if (oMessageCount[MessageType.Information] > 0) {
123
- sMessagePriority = MessageType.Information;
124
- }
125
- return sMessagePriority;
126
- }
127
- // function which modify e-Tag messages only.
128
- // returns : true, if any e-Tag message is modified, otherwise false.
129
- function fnModifyETagMessagesOnly(oMessageManager, oResourceBundle) {
130
- var aMessages = oMessageManager.getMessageModel().getObject("/");
131
- var bMessagesModified = false;
132
- var sEtagMessage = "";
133
- aMessages.forEach(function(oMessage, i) {
134
- var oTechnicalDetails = oMessage.getTechnicalDetails();
135
- if (oTechnicalDetails && oTechnicalDetails.httpStatus === 412) {
136
- sEtagMessage = sEtagMessage || oResourceBundle.getText("C_APP_COMPONENT_SAPFE_ETAG_TECHNICAL_ISSUES");
137
- oMessageManager.removeMessages(aMessages[i]);
138
- oMessage.setMessage(sEtagMessage);
139
- oMessage.target = "";
140
- oMessageManager.addMessages(oMessage);
141
- bMessagesModified = true;
142
- }
143
- });
144
- return bMessagesModified;
145
- }
146
-
147
- // Dialog close Handling
148
- function dialogCloseHandler() {
149
- that.oDialog.close();
150
- that.oBackButton.setVisible(false);
151
- removeUnboundTransitionMessages();
152
- }
153
-
154
- function getRetryAfterMessage(oMessage, bMessageDialog) {
155
- var dNow = new Date();
156
- var oTechnicalDetails = oMessage.getTechnicalDetails(),
157
- oResourceBundle = sap.ui.getCore().getLibraryResourceBundle("sap.fe.core"),
158
- sRetryAfterMessage;
159
- if (oTechnicalDetails && oTechnicalDetails.httpStatus === 503 && oTechnicalDetails.retryAfter) {
160
- var dRetryAfter = oTechnicalDetails.retryAfter;
161
- var sRetryAfterMessage;
162
- var oDateFormat;
163
- if (dNow.getFullYear() !== dRetryAfter.getFullYear()) {
164
- //different years
165
- oDateFormat = DateFormat.getDateTimeInstance({
166
- pattern: "MMMM dd, yyyy 'at' hh:mm a"
167
- });
168
- sRetryAfterMessage = oResourceBundle.getText("C_MESSAGE_HANDLING_SAPFE_503_ERROR", oDateFormat.format(dRetryAfter));
169
- } else if (dNow.getFullYear() == dRetryAfter.getFullYear()) {
170
- //same year
171
- if (bMessageDialog) {
172
- //less than 2 min
173
- sRetryAfterMessage =
174
- oResourceBundle.getText("C_MESSAGE_HANDLING_SAPFE_503_TITLE") +
175
- " " +
176
- oResourceBundle.getText("C_MESSAGE_HANDLING_SAPFE_503_DESC");
177
- } else if (dNow.getMonth() !== dRetryAfter.getMonth() || dNow.getDate() !== dRetryAfter.getDate()) {
178
- oDateFormat = sap.ui.core.format.DateFormat.getDateTimeInstance({
179
- pattern: "MMMM dd 'at' hh:mm a"
180
- }); //different months or different days of same month
181
- sRetryAfterMessage = oResourceBundle.getText("C_MESSAGE_HANDLING_SAPFE_503_ERROR", oDateFormat.format(dRetryAfter));
182
- } else {
183
- //same day
184
- oDateFormat = sap.ui.core.format.DateFormat.getDateTimeInstance({
185
- pattern: "hh:mm a"
186
- });
187
- sRetryAfterMessage = oResourceBundle.getText(
188
- "C_MESSAGE_HANDLING_SAPFE_503_ERROR_DAY",
189
- oDateFormat.format(dRetryAfter)
190
- );
191
- }
192
- }
193
- }
194
-
195
- if (oTechnicalDetails && oTechnicalDetails.httpStatus === 503 && !oTechnicalDetails.retryAfter) {
196
- sRetryAfterMessage = oResourceBundle.getText("C_MESSAGE_HANDLING_SAPFE_503_ERROR_NO_RETRY_AFTER");
197
- }
198
- return sRetryAfterMessage;
199
- }
200
- /**
201
- * Shows all unbound (including technical) messages and removes the ones which are transient.
202
- *
203
- * @function
204
- * @static
205
- * @name sap.fe.core.actions.messageHandling.showUnboundMessages
206
- * @memberof sap.fe.core.actions.messageHandling
207
- * @param {Array} aCustomMessages Array of custom messages given by the user to be displayed along with the other unbound messages.
208
- * @param {sap.ui.model.odata.v4.Context} oContext Context of the document to be refreshed or updated
209
- * @param {boolean} bHasEtagMessage The value of the variable is set to 'true' if any ETag message is present.
210
- * @param {boolean} bShowBoundTransition Also show the bound transition messages
211
- * @returns {Promise} Promise resolves when the message toast disappears or when the user closes the popup
212
- * @private
213
- * @ui5-restricted
214
- */
215
- function showUnboundMessages(aCustomMessages, oContext, bHasEtagMessage, bShowBoundTransition) {
216
- var aUnboundMessages = getMessages(),
217
- oMessageManager = sap.ui.getCore().getMessageManager(),
218
- sHighestPriority,
219
- sHighestPriorityText,
220
- aFilters = [
221
- new Filter({ path: "code", operator: FilterOperator.NE, value1: null }),
222
- new Filter({ path: "persistent", operator: FilterOperator.NE, value1: false })
223
- ],
224
- showMessageDialog = false;
225
-
226
- if (bShowBoundTransition) {
227
- aUnboundMessages.push.apply(aUnboundMessages, getMessages(true, true));
228
- // we only want to show bound transition messages not bound state messages hence add a filter for the same
229
- aFilters.push(new Filter({ path: "persistent", operator: FilterOperator.EQ, value1: true }));
230
- var fnCheckControlIdInDialog = function(aControlIds) {
231
- var index = Infinity,
232
- oControl = sap.ui.getCore().byId(aControlIds[0]),
233
- errorFieldControl = sap.ui.getCore().byId(aControlIds[0]);
234
- while (oControl) {
235
- var fieldRankinDialog =
236
- oControl instanceof Dialog
237
- ? errorFieldControl
238
- .getParent()
239
- .findElements(true)
240
- .indexOf(errorFieldControl)
241
- : Infinity;
242
- if (oControl instanceof Dialog) {
243
- if (index > fieldRankinDialog) {
244
- index = fieldRankinDialog;
245
- // Set the focus to the dialog's control
246
- errorFieldControl.focus();
247
- }
248
- // messages with target inside sap.m.Dialog should not bring up the message dialog
249
- return false;
250
- }
251
- oControl = oControl.getParent();
252
- }
253
- return true;
254
- };
255
- aFilters.push(
256
- new Filter({
257
- path: "controlIds",
258
- test: fnCheckControlIdInDialog,
259
- caseSensitive: true
260
- })
261
- );
262
- } else {
263
- // only unbound messages have to be shown so add filter accordingly
264
- aFilters.push(new Filter({ path: "target", operator: FilterOperator.EQ, value1: "" }));
265
- }
266
- if (aCustomMessages && aCustomMessages.length) {
267
- aCustomMessages.forEach(function(oMessage) {
268
- var messageCode = oMessage.code ? oMessage.code : "";
269
- oMessageManager.addMessages(
270
- new Message({
271
- message: oMessage.text,
272
- type: oMessage.type,
273
- target: "",
274
- persistent: true,
275
- code: messageCode
276
- })
277
- );
278
- //The target and persistent properties of the message are hardcoded as "" and true because the function deals with only unbound messages.
279
- });
280
- }
281
- var oListBinding = oMessageManager.getMessageModel().bindList("/", undefined, undefined, aFilters),
282
- aCurrentContexts = oListBinding.getCurrentContexts(),
283
- oMessageDialogModel = new JSONModel();
284
- if (aCurrentContexts && aCurrentContexts.length > 0) {
285
- // Don't show dialog incase there are no errors to show
286
- showMessageDialog = true;
287
- // As fitering has already happened here hence
288
- // using the message model again for the message dialog view and then filtering on that binding again is unnecessary.
289
- // So we create new json model to use for the message dialog view.
290
- var aMessages = [];
291
- aCurrentContexts.forEach(function(oContext) {
292
- var oMessage = oContext.getObject(),
293
- sRetryAfterMessage = getRetryAfterMessage(oMessage, true);
294
- if (sRetryAfterMessage) {
295
- oMessage.setMessage(sRetryAfterMessage + " " + oMessage.getMessage());
296
- }
297
- aMessages.push(oMessage);
298
- });
299
- oMessageDialogModel.setData(aMessages);
300
- }
301
- if (aUnboundMessages.length === 0 && !aCustomMessages && !bHasEtagMessage) {
302
- // Don't show the popup if there are no transient messages
303
- return Promise.resolve(true);
304
- } else if (aUnboundMessages.length === 1 && aUnboundMessages[0].getType() === MessageType.Success && !aCustomMessages) {
305
- return new Promise(function(resolve, reject) {
306
- MessageToast.show(aUnboundMessages[0].message);
307
- oMessageManager.removeMessages(aUnboundMessages);
308
- resolve();
309
- });
310
- } else if (showMessageDialog) {
311
- that.aResolveFunctions = that.aResolveFunctions || [];
312
- return new Promise(function(resolve, reject) {
313
- that.aResolveFunctions.push(resolve);
314
- sap.ui
315
- .getCore()
316
- .getLibraryResourceBundle("sap.fe.core", true)
317
- .then(function(oResourceBundle) {
318
- that.oMessageTemplate =
319
- that.oMessageTemplate ||
320
- new MessageItem({
321
- counter: "{counter}",
322
- title: "{message}",
323
- subtitle: "{additionalText}",
324
- longtextUrl: "{descriptionUrl}",
325
- type: "{type}",
326
- description:
327
- "{= ${" +
328
- "description} || ${technicalDetails} ? " +
329
- '"<html><body>" + ' +
330
- fnFormatDescription() +
331
- " + " +
332
- fnFormatTechnicalDetails() +
333
- '"</body></html>"' +
334
- ' : "" }',
335
- markupDescription: true
336
- });
337
- that.oMessageView =
338
- that.oMessageView ||
339
- new MessageView({
340
- showDetailsPageHeader: false,
341
- itemSelect: function() {
342
- that.oBackButton.setVisible(true);
343
- },
344
- items: {
345
- path: "/",
346
- template: that.oMessageTemplate
347
- }
348
- });
349
- that.oBackButton =
350
- that.oBackButton ||
351
- new Button({
352
- icon: IconPool.getIconURI("nav-back"),
353
- visible: false,
354
- press: function() {
355
- that.oMessageView.navigateBack();
356
- this.setVisible(false);
357
- }
358
- });
359
- // Update proper ETag Mismatch error
360
- var bHasEtagMessage = fnModifyETagMessagesOnly(oMessageManager, oResourceBundle);
361
- that.oMessageView.setModel(oMessageDialogModel);
362
- that.oDialog =
363
- that.oDialog ||
364
- new Dialog({
365
- resizable: true,
366
- content: that.oMessageView,
367
- endButton: new Button({
368
- press: function() {
369
- dialogCloseHandler();
370
- // also remove bound transition messages if we were showing them
371
- if (bShowBoundTransition) {
372
- removeBoundTransitionMessages();
373
- }
374
- },
375
- text: oResourceBundle.getText("C_COMMON_SAPFE_CLOSE")
376
- }),
377
- customHeader: new sap.m.Bar({
378
- contentMiddle: [
379
- new sap.m.Text({
380
- text: oResourceBundle.getText("C_MESSAGE_HANDLING_SAPFE_ERROR_MESSAGES_PAGE_TITLE")
381
- })
382
- ],
383
- contentLeft: [that.oBackButton]
384
- }),
385
- contentWidth: "37.5em",
386
- contentHeight: "21.5em",
387
- verticalScrolling: false,
388
- afterClose: function(oEvent) {
389
- for (var i = 0; i < that.aResolveFunctions.length; i++) {
390
- that.aResolveFunctions[i].call();
391
- }
392
- that.aResolveFunctions = [];
393
- }
394
- });
395
-
396
- if (bHasEtagMessage) {
397
- sap.ui.require(["sap/m/ButtonType"], function(ButtonType) {
398
- that.oDialog.setBeginButton(
399
- new Button({
400
- press: function() {
401
- dialogCloseHandler();
402
- if (oContext.hasPendingChanges()) {
403
- oContext.getBinding().resetChanges();
404
- }
405
- oContext.refresh();
406
- },
407
- text: oResourceBundle.getText("C_COMMON_SAPFE_REFRESH"),
408
- type: ButtonType.Emphasized
409
- })
410
- );
411
- });
412
- } else {
413
- that.oDialog.destroyBeginButton();
414
- }
415
- sHighestPriority = fnGetHighestMessagePriority(that.oMessageView.getItems());
416
- sHighestPriorityText = getTranslatedTextForMessageDialog(sHighestPriority);
417
- that.oDialog.setState(sHighestPriority);
418
- that.oDialog
419
- .getCustomHeader()
420
- .getContentMiddle()[0]
421
- .setText(sHighestPriorityText);
422
- that.oMessageView.navigateBack();
423
- that.oDialog.open();
424
- })
425
- .catch(reject);
426
- });
427
- } else {
428
- return Promise.resolve(true);
429
- }
430
- }
431
-
432
- function getTranslatedTextForMessageDialog(sHighestPriority) {
433
- var oResourceBundle = sap.ui.getCore().getLibraryResourceBundle("sap.fe.core");
434
- switch (sHighestPriority) {
435
- case "Error":
436
- return oResourceBundle.getText("C_COMMON_SAPFE_ERROR_MESSAGES_PAGE_TITLE_ERROR");
437
- case "Information":
438
- return oResourceBundle.getText("C_MESSAGE_HANDLING_SAPFE_ERROR_MESSAGES_PAGE_TITLE_INFO");
439
- case "Success":
440
- return oResourceBundle.getText("C_MESSAGE_HANDLING_SAPFE_ERROR_MESSAGES_PAGE_TITLE_SUCCESS");
441
- case "Warning":
442
- return oResourceBundle.getText("C_MESSAGE_HANDLING_SAPFE_ERROR_MESSAGES_PAGE_TITLE_WARNING");
443
- default:
444
- return oResourceBundle.getText("C_MESSAGE_HANDLING_SAPFE_ERROR_MESSAGES_PAGE_TITLE");
445
- }
446
- }
447
-
448
- function removeUnboundTransitionMessages() {
449
- removeTransitionMessages(false);
450
- }
451
-
452
- function removeBoundTransitionMessages() {
453
- removeTransitionMessages(true);
454
- }
455
-
456
- function getMessages(bBoundMessages, bTransitionOnly) {
457
- var oMessageManager = sap.ui.getCore().getMessageManager(),
458
- oMessageModel = oMessageManager.getMessageModel(),
459
- aMessages = oMessageModel.getObject("/"),
460
- oResourceBundle = sap.ui.getCore().getLibraryResourceBundle("sap.fe.core"),
461
- aTransitionMessages = [];
462
-
463
- for (var i = 0; i < aMessages.length; i++) {
464
- if (
465
- (!bTransitionOnly || aMessages[i].persistent) &&
466
- ((bBoundMessages && aMessages[i].target !== "") ||
467
- (!bBoundMessages && (!aMessages[i].target || aMessages[i].target === ""))) &&
468
- aMessages[i].code
469
- ) {
470
- aTransitionMessages.push(aMessages[i]);
471
- }
472
- }
473
-
474
- for (var i = 0; i < aTransitionMessages.length; i++) {
475
- if (
476
- aTransitionMessages[i].code === "503" &&
477
- aTransitionMessages[i].message !== "" &&
478
- aTransitionMessages[i].message.indexOf(oResourceBundle.getText("C_MESSAGE_HANDLING_SAPFE_503_BACKEND_PREFIX")) === -1
479
- ) {
480
- aTransitionMessages[i].message =
481
- "\n" + oResourceBundle.getText("C_MESSAGE_HANDLING_SAPFE_503_BACKEND_PREFIX") + aTransitionMessages[i].message;
482
- }
483
- }
484
- return aTransitionMessages;
485
- }
486
-
487
- function removeTransitionMessages(bBoundMessages) {
488
- var aMessagesToBeDeleted = getMessages(bBoundMessages, true);
489
-
490
- if (aMessagesToBeDeleted.length > 0) {
491
- sap.ui
492
- .getCore()
493
- .getMessageManager()
494
- .removeMessages(aMessagesToBeDeleted);
495
- }
496
- }
497
-
498
- /**
499
- * Static functions for Fiori Message Handling
500
- *
501
- * @namespace
502
- * @alias sap.fe.core.actions.messageHandling
503
- * @private
504
- * @experimental This module is only for experimental use! <br/><b>This is only a POC and maybe deleted</b>
505
- * @since 1.56.0
506
- */
507
- var messageHandling = {
508
- getMessages: getMessages,
509
- showUnboundMessages: showUnboundMessages,
510
- removeUnboundTransitionMessages: removeUnboundTransitionMessages,
511
- removeBoundTransitionMessages: removeBoundTransitionMessages,
512
- modifyETagMessagesOnly: fnModifyETagMessagesOnly,
513
- getRetryAfterMessage: getRetryAfterMessage
514
- };
515
- return messageHandling;
516
- }
517
- );
8
+ var MessageType = CoreLib.MessageType;
9
+ var aMessageList = [];
10
+ var aMessageDataList = [];
11
+ var aResolveFunctions = [];
12
+ var oDialog;
13
+ var oBackButton;
14
+ var oMessageTemplate;
15
+ var oMessageView;
16
+
17
+ function fnFormatTechnicalDetails() {
18
+ var sPreviousGroupName; // Insert technical detail if it exists
19
+
20
+ function insertDetail(oProperty) {
21
+ return oProperty.property ? "( ${" + oProperty.property + '} ? ("<p>' + oProperty.property.substr(Math.max(oProperty.property.lastIndexOf("/"), oProperty.property.lastIndexOf(".")) + 1) + ' : " + ' + "${" + oProperty.property + '} + "</p>") : "" )' : "";
22
+ } // Insert groupname if it exists
23
+
24
+
25
+ function insertGroupName(oProperty) {
26
+ var sHTML = "";
27
+
28
+ if (oProperty.groupName && oProperty.property && oProperty.groupName !== sPreviousGroupName) {
29
+ sHTML += "( ${" + oProperty.property + '} ? "<br><h3>' + oProperty.groupName + '</h3>" : "" ) + ';
30
+ sPreviousGroupName = oProperty.groupName;
31
+ }
32
+
33
+ return sHTML;
34
+ } // List of technical details to be shown
35
+
36
+
37
+ function getPaths() {
38
+ var sTD = "technicalDetails"; // name of property in message model data for technical details
39
+
40
+ return [{
41
+ "groupName": "",
42
+ "property": sTD + "/status"
43
+ }, {
44
+ "groupName": "",
45
+ "property": sTD + "/statusText"
46
+ }, {
47
+ "groupName": "Application",
48
+ "property": sTD + "/error/@SAP__common.Application/ComponentId"
49
+ }, {
50
+ "groupName": "Application",
51
+ "property": sTD + "/error/@SAP__common.Application/ServiceId"
52
+ }, {
53
+ "groupName": "Application",
54
+ "property": sTD + "/error/@SAP__common.Application/ServiceRepository"
55
+ }, {
56
+ "groupName": "Application",
57
+ "property": sTD + "/error/@SAP__common.Application/ServiceVersion"
58
+ }, {
59
+ "groupName": "ErrorResolution",
60
+ "property": sTD + "/error/@SAP__common.ErrorResolution/Analysis"
61
+ }, {
62
+ "groupName": "ErrorResolution",
63
+ "property": sTD + "/error/@SAP__common.ErrorResolution/Note"
64
+ }, {
65
+ "groupName": "ErrorResolution",
66
+ "property": sTD + "/error/@SAP__common.ErrorResolution/DetailedNote"
67
+ }, {
68
+ "groupName": "ErrorResolution",
69
+ "property": sTD + "/error/@SAP__common.ExceptionCategory"
70
+ }, {
71
+ "groupName": "ErrorResolution",
72
+ "property": sTD + "/error/@SAP__common.TimeStamp"
73
+ }, {
74
+ "groupName": "ErrorResolution",
75
+ "property": sTD + "/error/@SAP__common.TransactionId"
76
+ }, {
77
+ "groupName": "Messages",
78
+ "property": sTD + "/error/code"
79
+ }, {
80
+ "groupName": "Messages",
81
+ "property": sTD + "/error/message"
82
+ }];
83
+ }
84
+
85
+ var sHTML = "Object.keys(" + "${technicalDetails}" + ').length > 0 ? "<h2>Technical Details</h2>" : "" ';
86
+ getPaths().forEach(function (oProperty) {
87
+ sHTML = sHTML + insertGroupName(oProperty) + "" + insertDetail(oProperty) + " + ";
88
+ });
89
+ return sHTML;
90
+ }
91
+
92
+ function fnFormatDescription() {
93
+ var sHTML = "(${" + 'description} ? ("<h2>Description</h2>" + ${' + 'description}) : "")';
94
+ return sHTML;
95
+ }
96
+ /**
97
+ * Calculates the highest priority message type(Error/Warning/Success/Information) from the available messages.
98
+
99
+ * @function
100
+ * @name sap.fe.core.actions.messageHandling.fnGetHighestMessagePriority
101
+ * @memberof sap.fe.core.actions.messageHandling
102
+ * @param {Array} [aMessages] Messages list
103
+ * @returns {string} Highest priority message from the available messages
104
+ * @private
105
+ * @ui5-restricted
106
+ */
107
+
108
+
109
+ function fnGetHighestMessagePriority(aMessages) {
110
+ var sMessagePriority = MessageType.None;
111
+ var iLength = aMessages.length;
112
+ var oMessageCount = {
113
+ Error: 0,
114
+ Warning: 0,
115
+ Success: 0,
116
+ Information: 0
117
+ };
118
+
119
+ for (var i = 0; i < iLength; i++) {
120
+ ++oMessageCount[aMessages[i].getType()];
121
+ }
122
+
123
+ if (oMessageCount[MessageType.Error] > 0) {
124
+ sMessagePriority = MessageType.Error;
125
+ } else if (oMessageCount[MessageType.Warning] > 0) {
126
+ sMessagePriority = MessageType.Warning;
127
+ } else if (oMessageCount[MessageType.Success] > 0) {
128
+ sMessagePriority = MessageType.Success;
129
+ } else if (oMessageCount[MessageType.Information] > 0) {
130
+ sMessagePriority = MessageType.Information;
131
+ }
132
+
133
+ return sMessagePriority;
134
+ } // function which modify e-Tag messages only.
135
+ // returns : true, if any e-Tag message is modified, otherwise false.
136
+
137
+
138
+ function fnModifyETagMessagesOnly(oMessageManager, oResourceBundle) {
139
+ var aMessages = oMessageManager.getMessageModel().getObject("/");
140
+ var bMessagesModified = false;
141
+ var sEtagMessage = "";
142
+ aMessages.forEach(function (oMessage, i) {
143
+ var oTechnicalDetails = oMessage.getTechnicalDetails();
144
+
145
+ if (oTechnicalDetails && oTechnicalDetails.httpStatus === 412) {
146
+ sEtagMessage = sEtagMessage || oResourceBundle.getText("C_APP_COMPONENT_SAPFE_ETAG_TECHNICAL_ISSUES");
147
+ oMessageManager.removeMessages(aMessages[i]);
148
+ oMessage.setMessage(sEtagMessage);
149
+ oMessage.target = "";
150
+ oMessageManager.addMessages(oMessage);
151
+ bMessagesModified = true;
152
+ }
153
+ });
154
+ return bMessagesModified;
155
+ } // Dialog close Handling
156
+
157
+
158
+ function dialogCloseHandler() {
159
+ oDialog.close();
160
+ oBackButton.setVisible(false);
161
+ aMessageList = [];
162
+ removeUnboundTransitionMessages();
163
+ }
164
+
165
+ function getRetryAfterMessage(oMessage, bMessageDialog) {
166
+ var dNow = new Date();
167
+ var oTechnicalDetails = oMessage.getTechnicalDetails();
168
+ var oResourceBundle = sap.ui.getCore().getLibraryResourceBundle("sap.fe.core");
169
+ var sRetryAfterMessage;
170
+
171
+ if (oTechnicalDetails && oTechnicalDetails.httpStatus === 503 && oTechnicalDetails.retryAfter) {
172
+ var dRetryAfter = oTechnicalDetails.retryAfter;
173
+ var oDateFormat;
174
+
175
+ if (dNow.getFullYear() !== dRetryAfter.getFullYear()) {
176
+ //different years
177
+ oDateFormat = DateFormat.getDateTimeInstance({
178
+ pattern: "MMMM dd, yyyy 'at' hh:mm a"
179
+ });
180
+ sRetryAfterMessage = oResourceBundle.getText("C_MESSAGE_HANDLING_SAPFE_503_ERROR", [oDateFormat.format(dRetryAfter)]);
181
+ } else if (dNow.getFullYear() == dRetryAfter.getFullYear()) {
182
+ //same year
183
+ if (bMessageDialog) {
184
+ //less than 2 min
185
+ sRetryAfterMessage = oResourceBundle.getText("C_MESSAGE_HANDLING_SAPFE_503_TITLE") + " " + oResourceBundle.getText("C_MESSAGE_HANDLING_SAPFE_503_DESC");
186
+ } else if (dNow.getMonth() !== dRetryAfter.getMonth() || dNow.getDate() !== dRetryAfter.getDate()) {
187
+ oDateFormat = DateFormat.getDateTimeInstance({
188
+ pattern: "MMMM dd 'at' hh:mm a"
189
+ }); //different months or different days of same month
190
+
191
+ sRetryAfterMessage = oResourceBundle.getText("C_MESSAGE_HANDLING_SAPFE_503_ERROR", [oDateFormat.format(dRetryAfter)]);
192
+ } else {
193
+ //same day
194
+ oDateFormat = DateFormat.getDateTimeInstance({
195
+ pattern: "hh:mm a"
196
+ });
197
+ sRetryAfterMessage = oResourceBundle.getText("C_MESSAGE_HANDLING_SAPFE_503_ERROR_DAY", [oDateFormat.format(dRetryAfter)]);
198
+ }
199
+ }
200
+ }
201
+
202
+ if (oTechnicalDetails && oTechnicalDetails.httpStatus === 503 && !oTechnicalDetails.retryAfter) {
203
+ sRetryAfterMessage = oResourceBundle.getText("C_MESSAGE_HANDLING_SAPFE_503_ERROR_NO_RETRY_AFTER");
204
+ }
205
+
206
+ return sRetryAfterMessage;
207
+ }
208
+
209
+ function showUnboundMessages(aCustomMessages, oContext, bHasEtagMessage, bShowBoundTransition) {
210
+ var aUnboundMessages = this.getMessages();
211
+ var oMessageManager = sap.ui.getCore().getMessageManager();
212
+ var sHighestPriority;
213
+ var sHighestPriorityText;
214
+ var aFilters = [new Filter({
215
+ path: "code",
216
+ operator: FilterOperator.NE,
217
+ value1: null
218
+ }), new Filter({
219
+ path: "persistent",
220
+ operator: FilterOperator.NE,
221
+ value1: false
222
+ })];
223
+ var showMessageDialog = false,
224
+ showMessageBox = false;
225
+
226
+ if (bShowBoundTransition) {
227
+ aUnboundMessages = aUnboundMessages.concat(getMessages(true, true)); // we only want to show bound transition messages not bound state messages hence add a filter for the same
228
+
229
+ aFilters.push(new Filter({
230
+ path: "persistent",
231
+ operator: FilterOperator.EQ,
232
+ value1: true
233
+ }));
234
+
235
+ var fnCheckControlIdInDialog = function (aControlIds) {
236
+ var index = Infinity,
237
+ oControl = sap.ui.getCore().byId(aControlIds[0]);
238
+ var errorFieldControl = sap.ui.getCore().byId(aControlIds[0]);
239
+
240
+ while (oControl) {
241
+ var fieldRankinDialog = oControl instanceof Dialog ? errorFieldControl.getParent().findElements(true).indexOf(errorFieldControl) : Infinity;
242
+
243
+ if (oControl instanceof Dialog) {
244
+ if (index > fieldRankinDialog) {
245
+ index = fieldRankinDialog; // Set the focus to the dialog's control
246
+
247
+ errorFieldControl.focus();
248
+ } // messages with target inside sap.m.Dialog should not bring up the message dialog
249
+
250
+
251
+ return false;
252
+ }
253
+
254
+ oControl = oControl.getParent();
255
+ }
256
+
257
+ return true;
258
+ };
259
+
260
+ aFilters.push(new Filter({
261
+ path: "controlIds",
262
+ test: fnCheckControlIdInDialog,
263
+ caseSensitive: true
264
+ }));
265
+ } else {
266
+ // only unbound messages have to be shown so add filter accordingly
267
+ aFilters.push(new Filter({
268
+ path: "target",
269
+ operator: FilterOperator.EQ,
270
+ value1: ""
271
+ }));
272
+ }
273
+
274
+ if (aCustomMessages && aCustomMessages.length) {
275
+ aCustomMessages.forEach(function (oMessage) {
276
+ var messageCode = oMessage.code ? oMessage.code : "";
277
+ oMessageManager.addMessages(new Message({
278
+ message: oMessage.text,
279
+ type: oMessage.type,
280
+ target: "",
281
+ persistent: true,
282
+ code: messageCode
283
+ })); //The target and persistent properties of the message are hardcoded as "" and true because the function deals with only unbound messages.
284
+ });
285
+ }
286
+
287
+ var oMessageDialogModel = new JSONModel();
288
+
289
+ if (aUnboundMessages.length === 1 && aUnboundMessages[0].getCode() === "503") {
290
+ showMessageBox = true;
291
+ } else {
292
+ var oListBinding = oMessageManager.getMessageModel().bindList("/", undefined, undefined, aFilters),
293
+ aCurrentContexts = oListBinding.getCurrentContexts();
294
+
295
+ if (aCurrentContexts && aCurrentContexts.length > 0) {
296
+ // Don't show dialog incase there are no errors to show
297
+ showMessageDialog = true; // As fitering has already happened here hence
298
+ // using the message model again for the message dialog view and then filtering on that binding again is unnecessary.
299
+ // So we create new json model to use for the message dialog view.
300
+
301
+ var aMessages = [];
302
+ aCurrentContexts.forEach(function (oContext) {
303
+ var oMessage;
304
+
305
+ if (oContext.getObject().technicalDetails && aMessageList.indexOf(oContext.getObject().technicalDetails.originalMessage.message) === -1) {
306
+ aMessageList.push(oContext.getObject().technicalDetails.originalMessage.message);
307
+ oMessage = oContext.getObject();
308
+ aMessages.push(oMessage);
309
+ aMessageDataList = aMessages;
310
+ } else if (!oContext.getObject().technicalDetails) {
311
+ oMessage = oContext.getObject();
312
+ aMessages.push(oMessage);
313
+ aMessageDataList = aMessages;
314
+ }
315
+ }); // if(aMessages.length === 0 && aMessageList.length) {
316
+ // oMessageDialogModel.setData(aMessages);
317
+ // }
318
+
319
+ oMessageDialogModel.setData(aMessageDataList);
320
+ }
321
+ }
322
+
323
+ if (aUnboundMessages.length === 0 && !aCustomMessages && !bHasEtagMessage) {
324
+ // Don't show the popup if there are no transient messages
325
+ return Promise.resolve(true);
326
+ } else if (aUnboundMessages.length === 1 && aUnboundMessages[0].getType() === MessageType.Success && !aCustomMessages) {
327
+ return new Promise(function (resolve) {
328
+ MessageToast.show(aUnboundMessages[0].message);
329
+ oMessageManager.removeMessages(aUnboundMessages);
330
+ resolve();
331
+ });
332
+ } else if (showMessageDialog) {
333
+ aResolveFunctions = aResolveFunctions || [];
334
+ return new Promise(function (resolve, reject) {
335
+ aResolveFunctions.push(resolve);
336
+ sap.ui.getCore().getLibraryResourceBundle("sap.fe.core", true).then(function (oResourceBundle) {
337
+ oMessageTemplate = oMessageTemplate || new MessageItem(undefined, {
338
+ counter: {
339
+ path: "counter"
340
+ },
341
+ title: "{message}",
342
+ subtitle: "{additionalText}",
343
+ longtextUrl: "{descriptionUrl}",
344
+ type: {
345
+ path: "type"
346
+ },
347
+ description: "{= ${" + "description} || ${technicalDetails} ? " + '"<html><body>" + ' + fnFormatDescription() + " + " + fnFormatTechnicalDetails() + '"</body></html>"' + ' : "" }',
348
+ markupDescription: true
349
+ });
350
+ oMessageView = oMessageView || new MessageView({
351
+ showDetailsPageHeader: false,
352
+ itemSelect: function () {
353
+ oBackButton.setVisible(true);
354
+ },
355
+ items: {
356
+ path: "/",
357
+ template: oMessageTemplate
358
+ }
359
+ });
360
+ oBackButton = oBackButton || new Button({
361
+ icon: IconPool.getIconURI("nav-back"),
362
+ visible: false,
363
+ press: function () {
364
+ oMessageView.navigateBack();
365
+ this.setVisible(false);
366
+ }
367
+ }); // Update proper ETag Mismatch error
368
+
369
+ var bHasEtagMessage = fnModifyETagMessagesOnly(oMessageManager, oResourceBundle);
370
+ oMessageView.setModel(oMessageDialogModel);
371
+ oDialog = oDialog || new Dialog({
372
+ resizable: true,
373
+ content: oMessageView,
374
+ endButton: new Button({
375
+ press: function () {
376
+ dialogCloseHandler(); // also remove bound transition messages if we were showing them
377
+
378
+ if (bShowBoundTransition) {
379
+ removeBoundTransitionMessages();
380
+ }
381
+ },
382
+ text: oResourceBundle.getText("C_COMMON_SAPFE_CLOSE")
383
+ }),
384
+ customHeader: new Bar({
385
+ contentMiddle: [new Text({
386
+ text: oResourceBundle.getText("C_MESSAGE_HANDLING_SAPFE_ERROR_MESSAGES_PAGE_TITLE")
387
+ })],
388
+ contentLeft: [oBackButton]
389
+ }),
390
+ contentWidth: "37.5em",
391
+ contentHeight: "21.5em",
392
+ verticalScrolling: false,
393
+ afterClose: function () {
394
+ for (var i = 0; i < aResolveFunctions.length; i++) {
395
+ aResolveFunctions[i].call();
396
+ }
397
+
398
+ aResolveFunctions = [];
399
+ }
400
+ });
401
+
402
+ if (bHasEtagMessage) {
403
+ sap.ui.require(["sap/m/ButtonType"], function (ButtonType) {
404
+ oDialog.setBeginButton(new Button({
405
+ press: function () {
406
+ dialogCloseHandler();
407
+
408
+ if (oContext.hasPendingChanges()) {
409
+ oContext.getBinding().resetChanges();
410
+ }
411
+
412
+ oContext.refresh();
413
+ },
414
+ text: oResourceBundle.getText("C_COMMON_SAPFE_REFRESH"),
415
+ type: ButtonType.Emphasized
416
+ }));
417
+ });
418
+ } else {
419
+ oDialog.destroyBeginButton();
420
+ }
421
+
422
+ sHighestPriority = fnGetHighestMessagePriority(oMessageView.getItems());
423
+ sHighestPriorityText = getTranslatedTextForMessageDialog(sHighestPriority);
424
+ oDialog.setState(sHighestPriority);
425
+ oDialog.getCustomHeader().getContentMiddle()[0].setText(sHighestPriorityText);
426
+ oMessageView.navigateBack();
427
+ oDialog.open();
428
+ }).catch(reject);
429
+ });
430
+ } else if (showMessageBox) {
431
+ return new Promise(function (resolve) {
432
+ var oMessage = aUnboundMessages[0];
433
+
434
+ if (oMessage.technicalDetails && aMessageList.indexOf(oMessage.technicalDetails.originalMessage.message) === -1) {
435
+ aMessageList.push(oMessage.technicalDetails.originalMessage.message);
436
+ var formattedTextString = "<html><body>";
437
+ var retryAfterMessage = getRetryAfterMessage(oMessage, true);
438
+
439
+ if (retryAfterMessage) {
440
+ formattedTextString = "<h6>" + retryAfterMessage + "</h6><br>";
441
+ }
442
+
443
+ formattedTextString = formattedTextString + oMessage.getMessage() + "</html></body>";
444
+ var formattedText = new FormattedText({
445
+ htmlText: formattedTextString
446
+ });
447
+ MessageBox.error(formattedText, {
448
+ onClose: function () {
449
+ aMessageList = [];
450
+
451
+ if (bShowBoundTransition) {
452
+ removeBoundTransitionMessages();
453
+ }
454
+
455
+ removeUnboundTransitionMessages();
456
+ resolve(true);
457
+ }
458
+ });
459
+ }
460
+ });
461
+ } else {
462
+ return Promise.resolve(true);
463
+ }
464
+ }
465
+
466
+ function getTranslatedTextForMessageDialog(sHighestPriority) {
467
+ var oResourceBundle = sap.ui.getCore().getLibraryResourceBundle("sap.fe.core");
468
+
469
+ switch (sHighestPriority) {
470
+ case "Error":
471
+ return oResourceBundle.getText("C_COMMON_SAPFE_ERROR_MESSAGES_PAGE_TITLE_ERROR");
472
+
473
+ case "Information":
474
+ return oResourceBundle.getText("C_MESSAGE_HANDLING_SAPFE_ERROR_MESSAGES_PAGE_TITLE_INFO");
475
+
476
+ case "Success":
477
+ return oResourceBundle.getText("C_MESSAGE_HANDLING_SAPFE_ERROR_MESSAGES_PAGE_TITLE_SUCCESS");
478
+
479
+ case "Warning":
480
+ return oResourceBundle.getText("C_MESSAGE_HANDLING_SAPFE_ERROR_MESSAGES_PAGE_TITLE_WARNING");
481
+
482
+ default:
483
+ return oResourceBundle.getText("C_MESSAGE_HANDLING_SAPFE_ERROR_MESSAGES_PAGE_TITLE");
484
+ }
485
+ }
486
+
487
+ function removeUnboundTransitionMessages() {
488
+ removeTransitionMessages(false);
489
+ }
490
+
491
+ function removeBoundTransitionMessages() {
492
+ removeTransitionMessages(true);
493
+ }
494
+
495
+ function getMessages() {
496
+ var bBoundMessages = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
497
+ var bTransitionOnly = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
498
+ var i;
499
+ var oMessageManager = sap.ui.getCore().getMessageManager(),
500
+ oMessageModel = oMessageManager.getMessageModel(),
501
+ aMessages = oMessageModel.getObject("/"),
502
+ oResourceBundle = sap.ui.getCore().getLibraryResourceBundle("sap.fe.core"),
503
+ aTransitionMessages = [];
504
+
505
+ for (i = 0; i < aMessages.length; i++) {
506
+ if ((!bTransitionOnly || aMessages[i].persistent) && (bBoundMessages && aMessages[i].target !== "" || !bBoundMessages && (!aMessages[i].target || aMessages[i].target === "")) && aMessages[i].code) {
507
+ aTransitionMessages.push(aMessages[i]);
508
+ }
509
+ }
510
+
511
+ for (i = 0; i < aTransitionMessages.length; i++) {
512
+ if (aTransitionMessages[i].code === "503" && aTransitionMessages[i].message !== "" && aTransitionMessages[i].message.indexOf(oResourceBundle.getText("C_MESSAGE_HANDLING_SAPFE_503_BACKEND_PREFIX")) === -1) {
513
+ aTransitionMessages[i].message = "\n" + oResourceBundle.getText("C_MESSAGE_HANDLING_SAPFE_503_BACKEND_PREFIX") + aTransitionMessages[i].message;
514
+ }
515
+ }
516
+
517
+ return aTransitionMessages;
518
+ }
519
+
520
+ function removeTransitionMessages(bBoundMessages) {
521
+ var aMessagesToBeDeleted = getMessages(bBoundMessages, true);
522
+
523
+ if (aMessagesToBeDeleted.length > 0) {
524
+ sap.ui.getCore().getMessageManager().removeMessages(aMessagesToBeDeleted);
525
+ }
526
+ }
527
+ /**
528
+ * Static functions for Fiori Message Handling
529
+ *
530
+ * @namespace
531
+ * @alias sap.fe.core.actions.messageHandling
532
+ * @private
533
+ * @experimental This module is only for experimental use! <br/><b>This is only a POC and maybe deleted</b>
534
+ * @since 1.56.0
535
+ */
536
+
537
+
538
+ var messageHandling = {
539
+ getMessages: getMessages,
540
+ showUnboundMessages: showUnboundMessages,
541
+ removeUnboundTransitionMessages: removeUnboundTransitionMessages,
542
+ removeBoundTransitionMessages: removeBoundTransitionMessages,
543
+ modifyETagMessagesOnly: fnModifyETagMessagesOnly,
544
+ getRetryAfterMessage: getRetryAfterMessage
545
+ };
546
+ return messageHandling;
547
+ }, false);
548
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm1lc3NhZ2VIYW5kbGluZy50cyJdLCJuYW1lcyI6WyJNZXNzYWdlVHlwZSIsIkNvcmVMaWIiLCJhTWVzc2FnZUxpc3QiLCJhTWVzc2FnZURhdGFMaXN0IiwiYVJlc29sdmVGdW5jdGlvbnMiLCJvRGlhbG9nIiwib0JhY2tCdXR0b24iLCJvTWVzc2FnZVRlbXBsYXRlIiwib01lc3NhZ2VWaWV3IiwiZm5Gb3JtYXRUZWNobmljYWxEZXRhaWxzIiwic1ByZXZpb3VzR3JvdXBOYW1lIiwiaW5zZXJ0RGV0YWlsIiwib1Byb3BlcnR5IiwicHJvcGVydHkiLCJzdWJzdHIiLCJNYXRoIiwibWF4IiwibGFzdEluZGV4T2YiLCJpbnNlcnRHcm91cE5hbWUiLCJzSFRNTCIsImdyb3VwTmFtZSIsImdldFBhdGhzIiwic1REIiwiZm9yRWFjaCIsImZuRm9ybWF0RGVzY3JpcHRpb24iLCJmbkdldEhpZ2hlc3RNZXNzYWdlUHJpb3JpdHkiLCJhTWVzc2FnZXMiLCJzTWVzc2FnZVByaW9yaXR5IiwiTm9uZSIsImlMZW5ndGgiLCJsZW5ndGgiLCJvTWVzc2FnZUNvdW50IiwiRXJyb3IiLCJXYXJuaW5nIiwiU3VjY2VzcyIsIkluZm9ybWF0aW9uIiwiaSIsImdldFR5cGUiLCJmbk1vZGlmeUVUYWdNZXNzYWdlc09ubHkiLCJvTWVzc2FnZU1hbmFnZXIiLCJvUmVzb3VyY2VCdW5kbGUiLCJnZXRNZXNzYWdlTW9kZWwiLCJnZXRPYmplY3QiLCJiTWVzc2FnZXNNb2RpZmllZCIsInNFdGFnTWVzc2FnZSIsIm9NZXNzYWdlIiwib1RlY2huaWNhbERldGFpbHMiLCJnZXRUZWNobmljYWxEZXRhaWxzIiwiaHR0cFN0YXR1cyIsImdldFRleHQiLCJyZW1vdmVNZXNzYWdlcyIsInNldE1lc3NhZ2UiLCJ0YXJnZXQiLCJhZGRNZXNzYWdlcyIsImRpYWxvZ0Nsb3NlSGFuZGxlciIsImNsb3NlIiwic2V0VmlzaWJsZSIsInJlbW92ZVVuYm91bmRUcmFuc2l0aW9uTWVzc2FnZXMiLCJnZXRSZXRyeUFmdGVyTWVzc2FnZSIsImJNZXNzYWdlRGlhbG9nIiwiZE5vdyIsIkRhdGUiLCJzYXAiLCJ1aSIsImdldENvcmUiLCJnZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUiLCJzUmV0cnlBZnRlck1lc3NhZ2UiLCJyZXRyeUFmdGVyIiwiZFJldHJ5QWZ0ZXIiLCJvRGF0ZUZvcm1hdCIsImdldEZ1bGxZZWFyIiwiRGF0ZUZvcm1hdCIsImdldERhdGVUaW1lSW5zdGFuY2UiLCJwYXR0ZXJuIiwiZm9ybWF0IiwiZ2V0TW9udGgiLCJnZXREYXRlIiwic2hvd1VuYm91bmRNZXNzYWdlcyIsImFDdXN0b21NZXNzYWdlcyIsIm9Db250ZXh0IiwiYkhhc0V0YWdNZXNzYWdlIiwiYlNob3dCb3VuZFRyYW5zaXRpb24iLCJhVW5ib3VuZE1lc3NhZ2VzIiwiZ2V0TWVzc2FnZXMiLCJnZXRNZXNzYWdlTWFuYWdlciIsInNIaWdoZXN0UHJpb3JpdHkiLCJzSGlnaGVzdFByaW9yaXR5VGV4dCIsImFGaWx0ZXJzIiwiRmlsdGVyIiwicGF0aCIsIm9wZXJhdG9yIiwiRmlsdGVyT3BlcmF0b3IiLCJORSIsInZhbHVlMSIsInNob3dNZXNzYWdlRGlhbG9nIiwic2hvd01lc3NhZ2VCb3giLCJjb25jYXQiLCJwdXNoIiwiRVEiLCJmbkNoZWNrQ29udHJvbElkSW5EaWFsb2ciLCJhQ29udHJvbElkcyIsImluZGV4IiwiSW5maW5pdHkiLCJvQ29udHJvbCIsImJ5SWQiLCJlcnJvckZpZWxkQ29udHJvbCIsImZpZWxkUmFua2luRGlhbG9nIiwiRGlhbG9nIiwiZ2V0UGFyZW50IiwiZmluZEVsZW1lbnRzIiwiaW5kZXhPZiIsImZvY3VzIiwidGVzdCIsImNhc2VTZW5zaXRpdmUiLCJtZXNzYWdlQ29kZSIsImNvZGUiLCJNZXNzYWdlIiwibWVzc2FnZSIsInRleHQiLCJ0eXBlIiwicGVyc2lzdGVudCIsIm9NZXNzYWdlRGlhbG9nTW9kZWwiLCJKU09OTW9kZWwiLCJnZXRDb2RlIiwib0xpc3RCaW5kaW5nIiwiYmluZExpc3QiLCJ1bmRlZmluZWQiLCJhQ3VycmVudENvbnRleHRzIiwiZ2V0Q3VycmVudENvbnRleHRzIiwidGVjaG5pY2FsRGV0YWlscyIsIm9yaWdpbmFsTWVzc2FnZSIsInNldERhdGEiLCJQcm9taXNlIiwicmVzb2x2ZSIsIk1lc3NhZ2VUb2FzdCIsInNob3ciLCJyZWplY3QiLCJ0aGVuIiwiTWVzc2FnZUl0ZW0iLCJjb3VudGVyIiwidGl0bGUiLCJzdWJ0aXRsZSIsImxvbmd0ZXh0VXJsIiwiZGVzY3JpcHRpb24iLCJtYXJrdXBEZXNjcmlwdGlvbiIsIk1lc3NhZ2VWaWV3Iiwic2hvd0RldGFpbHNQYWdlSGVhZGVyIiwiaXRlbVNlbGVjdCIsIml0ZW1zIiwidGVtcGxhdGUiLCJCdXR0b24iLCJpY29uIiwiSWNvblBvb2wiLCJnZXRJY29uVVJJIiwidmlzaWJsZSIsInByZXNzIiwibmF2aWdhdGVCYWNrIiwic2V0TW9kZWwiLCJyZXNpemFibGUiLCJjb250ZW50IiwiZW5kQnV0dG9uIiwicmVtb3ZlQm91bmRUcmFuc2l0aW9uTWVzc2FnZXMiLCJjdXN0b21IZWFkZXIiLCJCYXIiLCJjb250ZW50TWlkZGxlIiwiVGV4dCIsImNvbnRlbnRMZWZ0IiwiY29udGVudFdpZHRoIiwiY29udGVudEhlaWdodCIsInZlcnRpY2FsU2Nyb2xsaW5nIiwiYWZ0ZXJDbG9zZSIsImNhbGwiLCJyZXF1aXJlIiwiQnV0dG9uVHlwZSIsInNldEJlZ2luQnV0dG9uIiwiaGFzUGVuZGluZ0NoYW5nZXMiLCJnZXRCaW5kaW5nIiwicmVzZXRDaGFuZ2VzIiwicmVmcmVzaCIsIkVtcGhhc2l6ZWQiLCJkZXN0cm95QmVnaW5CdXR0b24iLCJnZXRJdGVtcyIsImdldFRyYW5zbGF0ZWRUZXh0Rm9yTWVzc2FnZURpYWxvZyIsInNldFN0YXRlIiwiZ2V0Q3VzdG9tSGVhZGVyIiwiZ2V0Q29udGVudE1pZGRsZSIsInNldFRleHQiLCJvcGVuIiwiY2F0Y2giLCJmb3JtYXR0ZWRUZXh0U3RyaW5nIiwicmV0cnlBZnRlck1lc3NhZ2UiLCJnZXRNZXNzYWdlIiwiZm9ybWF0dGVkVGV4dCIsIkZvcm1hdHRlZFRleHQiLCJodG1sVGV4dCIsIk1lc3NhZ2VCb3giLCJlcnJvciIsIm9uQ2xvc2UiLCJyZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMiLCJiQm91bmRNZXNzYWdlcyIsImJUcmFuc2l0aW9uT25seSIsIm9NZXNzYWdlTW9kZWwiLCJhVHJhbnNpdGlvbk1lc3NhZ2VzIiwiYU1lc3NhZ2VzVG9CZURlbGV0ZWQiLCJtZXNzYWdlSGFuZGxpbmciLCJtb2RpZnlFVGFnTWVzc2FnZXNPbmx5Il0sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBOzs7O0FBa0JBLE1BQU1BLFdBQVcsR0FBR0MsT0FBTyxDQUFDRCxXQUE1QjtBQUNBLE1BQUlFLFlBQW1CLEdBQUcsRUFBMUI7QUFDQSxNQUFJQyxnQkFBdUIsR0FBRyxFQUE5QjtBQUNBLE1BQUlDLGlCQUF3QixHQUFHLEVBQS9CO0FBQ0EsTUFBSUMsT0FBSjtBQUNBLE1BQUlDLFdBQUo7QUFDQSxNQUFJQyxnQkFBSjtBQUNBLE1BQUlDLFlBQUo7O0FBZ0JBLFdBQVNDLHdCQUFULEdBQW9DO0FBQ25DLFFBQUlDLGtCQUFKLENBRG1DLENBR25DOztBQUNBLGFBQVNDLFlBQVQsQ0FBc0JDLFNBQXRCLEVBQXNDO0FBQ3JDLGFBQU9BLFNBQVMsQ0FBQ0MsUUFBVixHQUNKLFNBQ0FELFNBQVMsQ0FBQ0MsUUFEVixHQUVBLFdBRkEsR0FHQUQsU0FBUyxDQUFDQyxRQUFWLENBQW1CQyxNQUFuQixDQUEwQkMsSUFBSSxDQUFDQyxHQUFMLENBQVNKLFNBQVMsQ0FBQ0MsUUFBVixDQUFtQkksV0FBbkIsQ0FBK0IsR0FBL0IsQ0FBVCxFQUE4Q0wsU0FBUyxDQUFDQyxRQUFWLENBQW1CSSxXQUFuQixDQUErQixHQUEvQixDQUE5QyxJQUFxRixDQUEvRyxDQUhBLEdBSUEsU0FKQSxHQUtBLElBTEEsR0FNQUwsU0FBUyxDQUFDQyxRQU5WLEdBT0Esb0JBUkksR0FTSixFQVRIO0FBVUEsS0Fma0MsQ0FnQm5DOzs7QUFDQSxhQUFTSyxlQUFULENBQXlC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Q0E7QUFDRDtBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ0EsTUFBTUMsZUFBb0MsR0FBRztBQUM1Q3pILElBQUFBLFdBQVcsRUFBRUEsV0FEK0I7QUFFNUNOLElBQUFBLG1CQUFtQixFQUFFQSxtQkFGdUI7QUFHNUNwQixJQUFBQSwrQkFBK0IsRUFBRUEsK0JBSFc7QUFJNUN3RyxJQUFBQSw2QkFBNkIsRUFBRUEsNkJBSmE7QUFLNUM0QyxJQUFBQSxzQkFBc0IsRUFBRXZLLHdCQUxvQjtBQU01Q29CLElBQUFBLG9CQUFvQixFQUFFQTtBQU5zQixHQUE3QztTQVNla0osZSIsInNvdXJjZVJvb3QiOiIuIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IE1lc3NhZ2VUb2FzdCBmcm9tIFwic2FwL20vTWVzc2FnZVRvYXN0XCI7XG5pbXBvcnQgTWVzc2FnZUl0ZW0gZnJvbSBcInNhcC9tL01lc3NhZ2VJdGVtXCI7XG5pbXBvcnQgTWVzc2FnZVZpZXcgZnJvbSBcInNhcC9tL01lc3NhZ2VWaWV3XCI7XG5pbXBvcnQgQnV0dG9uIGZyb20gXCJzYXAvbS9CdXR0b25cIjtcbmltcG9ydCBEaWFsb2cgZnJvbSBcInNhcC9tL0RpYWxvZ1wiO1xuaW1wb3J0IFRleHQgZnJvbSBcInNhcC9tL1RleHRcIjtcbmltcG9ydCBDb3JlTGliIGZyb20gXCJzYXAvdWkvY29yZS9saWJyYXJ5XCI7XG5pbXBvcnQgRmlsdGVyIGZyb20gXCJzYXAvdWkvbW9kZWwvRmlsdGVyXCI7XG5pbXBvcnQgRmlsdGVyT3BlcmF0b3IgZnJvbSBcInNhcC91aS9tb2RlbC9GaWx0ZXJPcGVyYXRvclwiO1xuaW1wb3J0IE1lc3NhZ2UgZnJvbSBcInNhcC91aS9jb3JlL21lc3NhZ2UvTWVzc2FnZVwiO1xuaW1wb3J0IEljb25Qb29sIGZyb20gXCJzYXAvdWkvY29yZS9JY29uUG9vbFwiO1xuaW1wb3J0IEpTT05Nb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL2pzb24vSlNPTk1vZGVsXCI7XG5pbXBvcnQgRGF0ZUZvcm1hdCBmcm9tIFwic2FwL3VpL2NvcmUvZm9ybWF0L0RhdGVGb3JtYXRcIjtcbmltcG9ydCBSZXNvdXJjZUJ1bmRsZSBmcm9tIFwic2FwL2Jhc2UvaTE4bi9SZXNvdXJjZUJ1bmRsZVwiO1xuaW1wb3J0IENvbnRyb2wgZnJvbSBcInNhcC91aS9tZGMvQ29udHJvbFwiO1xuaW1wb3J0IE1hbmFnZWRPYmplY3QgZnJvbSBcInNhcC91aS9iYXNlL01hbmFnZWRPYmplY3RcIjtcbmltcG9ydCBCYXIgZnJvbSBcInNhcC9tL0JhclwiO1xuaW1wb3J0IE1lc3NhZ2VCb3ggZnJvbSBcInNhcC9tL01lc3NhZ2VCb3hcIjtcbmltcG9ydCBGb3JtYXR0ZWRUZXh0IGZyb20gXCJzYXAvbS9Gb3JtYXR0ZWRUZXh0XCI7XG5cbmNvbnN0IE1lc3NhZ2VUeXBlID0gQ29yZUxpYi5NZXNzYWdlVHlwZTtcbmxldCBhTWVzc2FnZUxpc3Q6IGFueVtdID0gW107XG5sZXQgYU1lc3NhZ2VEYXRhTGlzdDogYW55W10gPSBbXTtcbmxldCBhUmVzb2x2ZUZ1bmN0aW9uczogYW55W10gPSBbXTtcbmxldCBvRGlhbG9nOiBEaWFsb2c7XG5sZXQgb0JhY2tCdXR0b246IEJ1dHRvbjtcbmxldCBvTWVzc2FnZVRlbXBsYXRlOiBNZXNzYWdlSXRlbTtcbmxldCBvTWVzc2FnZVZpZXc6IE1lc3NhZ2VWaWV3O1xuXG5leHBvcnQgdHlwZSBtZXNzYWdlSGFuZGxpbmdUeXBlID0ge1xuXHRnZXRNZXNzYWdlczogKGJCb3VuZE1lc3NhZ2VzPzogYW55LCBiVHJhbnNpdGlvbk9ubHk/OiBhbnkpID0+IGFueVtdO1xuXHRzaG93VW5ib3VuZE1lc3NhZ2VzOiAoXG5cdFx0YUN1c3RvbU1lc3NhZ2VzPzogYW55W10sXG5cdFx0b0NvbnRleHQ/OiBhbnksXG5cdFx0Ykhhc0V0YWdNZXNzYWdlPzogYm9vbGVhbixcblx0XHRiU2hvd0JvdW5kVHJhbnNpdGlvbj86IGJvb2xlYW5cblx0KSA9PiBQcm9taXNlPGFueT47XG5cdHJlbW92ZVVuYm91bmRUcmFuc2l0aW9uTWVzc2FnZXM6ICgpID0+IHZvaWQ7XG5cdHJlbW92ZUJvdW5kVHJhbnNpdGlvbk1lc3NhZ2VzOiAoKSA9PiB2b2lkO1xuXHRtb2RpZnlFVGFnTWVzc2FnZXNPbmx5OiAob01lc3NhZ2VNYW5hZ2VyOiBhbnksIG9SZXNvdXJjZUJ1bmRsZTogYW55KSA9PiBib29sZWFuO1xuXHRnZXRSZXRyeUFmdGVyTWVzc2FnZTogKG9NZXNzYWdlOiBhbnksIGJNZXNzYWdlRGlhbG9nPzogYW55KSA9PiBhbnk7XG59O1xuXG5mdW5jdGlvbiBmbkZvcm1hdFRlY2huaWNhbERldGFpbHMoKSB7XG5cdGxldCBzUHJldmlvdXNHcm91cE5hbWU6IHN0cmluZztcblxuXHQvLyBJbnNlcnQgdGVjaG5pY2FsIGRldGFpbCBpZiBpdCBleGlzdHNcblx0ZnVuY3Rpb24gaW5zZXJ0RGV0YWlsKG9Qcm9wZXJ0eTogYW55KSB7XG5cdFx0cmV0dXJuIG9Qcm9wZXJ0eS5wcm9wZXJ0eVxuXHRcdFx0PyBcIiggJHtcIiArXG5cdFx0XHRcdFx0b1Byb3BlcnR5LnByb3BlcnR5ICtcblx0XHRcdFx0XHQnfSA/IChcIjxwPicgK1xuXHRcdFx0XHRcdG9Qcm9wZXJ0eS5wcm9wZXJ0eS5zdWJzdHIoTWF0aC5tYXgob1Byb3BlcnR5LnByb3BlcnR5Lmxhc3RJbmRleE9mKFwiL1wiKSwgb1Byb3BlcnR5LnByb3BlcnR5Lmxhc3RJbmRleE9mKFwiLlwiKSkgKyAxKSArXG5cdFx0XHRcdFx0JyA6IFwiICsgJyArXG5cdFx0XHRcdFx0XCIke1wiICtcblx0XHRcdFx0XHRvUHJvcGVydHkucHJvcGVydHkgK1xuXHRcdFx0XHRcdCd9ICsgXCI8L3A+XCIpIDogXCJcIiApJ1xuXHRcdFx0OiBcIlwiO1xuXHR9XG5cdC8vIEluc2VydCBncm91cG5hbWUgaWYgaXQgZXhpc3RzXG5cdGZ1bmN0aW9uIGluc2VydEdyb3VwTmFtZShvUHJvcGVydHk6IGFueSkge1xuXHRcdGxldCBzSFRNTCA9IFwiXCI7XG5cdFx0aWYgKG9Qcm9wZXJ0eS5ncm91cE5hbWUgJiYgb1Byb3BlcnR5LnByb3BlcnR5ICYmIG9Qcm9wZXJ0eS5ncm91cE5hbWUgIT09IHNQcmV2aW91c0dyb3VwTmFtZSkge1xuXHRcdFx0c0hUTUwgKz0gXCIoICR7XCIgKyBvUHJvcGVydHkucHJvcGVydHkgKyAnfSA/IFwiPGJyPjxoMz4nICsgb1Byb3BlcnR5Lmdyb3VwTmFtZSArICc8L2gzPlwiIDogXCJcIiApICsgJztcblx0XHRcdHNQcmV2aW91c0dyb3VwTmFtZSA9IG9Qcm9wZXJ0eS5ncm91cE5hbWU7XG5cdFx0fVxuXHRcdHJldHVybiBzSFRNTDtcblx0fVxuXG5cdC8vIExpc3Qgb2YgdGVjaG5pY2FsIGRldGFpbHMgdG8gYmUgc2hvd25cblx0ZnVuY3Rpb24gZ2V0UGF0aHMoKSB7XG5cdFx0Y29uc3Qgc1REID0gXCJ0ZWNobmljYWxEZXRhaWxzXCI7IC8vIG5hbWUgb2YgcHJvcGVydHkgaW4gbWVzc2FnZSBtb2RlbCBkYXRhIGZvciB0ZWNobmljYWwgZGV0YWlsc1xuXHRcdHJldHVybiBbXG5cdFx0XHR7IFwiZ3JvdXBOYW1lXCI6IFwiXCIsIFwicHJvcGVydHlcIjogc1REICsgXCIvc3RhdHVzXCIgfSxcblx0XHRcdHsgXCJncm91cE5hbWVcIjogXCJcIiwgXCJwcm9wZXJ0eVwiOiBzVEQgKyBcIi9zdGF0dXNUZXh0XCIgfSxcblx0XHRcdHsgXCJncm91cE5hbWVcIjogXCJBcHBsaWNhdGlvblwiLCBcInByb3BlcnR5XCI6IHNURCArIFwiL2Vycm9yL0BTQVBfX2NvbW1vbi5BcHBsaWNhdGlvbi9Db21wb25lbnRJZFwiIH0sXG5cdFx0XHR7IFwiZ3JvdXBOYW1lXCI6IFwiQXBwbGljYXRpb25cIiwgXCJwcm9wZXJ0eVwiOiBzVEQgKyBcIi9lcnJvci9AU0FQX19jb21tb24uQXBwbGljYXRpb24vU2VydmljZUlkXCIgfSxcblx0XHRcdHsgXCJncm91cE5hbWVcIjogXCJBcHBsaWNhdGlvblwiLCBcInByb3BlcnR5XCI6IHNURCArIFwiL2Vycm9yL0BTQVBfX2NvbW1vbi5BcHBsaWNhdGlvbi9TZXJ2aWNlUmVwb3NpdG9yeVwiIH0sXG5cdFx0XHR7IFwiZ3JvdXBOYW1lXCI6IFwiQXBwbGljYXRpb25cIiwgXCJwcm9wZXJ0eVwiOiBzVEQgKyBcIi9lcnJvci9AU0FQX19jb21tb24uQXBwbGljYXRpb24vU2VydmljZVZlcnNpb25cIiB9LFxuXHRcdFx0eyBcImdyb3VwTmFtZVwiOiBcIkVycm9yUmVzb2x1dGlvblwiLCBcInByb3BlcnR5XCI6IHNURCArIFwiL2Vycm9yL0BTQVBfX2NvbW1vbi5FcnJvclJlc29sdXRpb24vQW5hbHlzaXNcIiB9LFxuXHRcdFx0eyBcImdyb3VwTmFtZVwiOiBcIkVycm9yUmVzb2x1dGlvblwiLCBcInByb3BlcnR5XCI6IHNURCArIFwiL2Vycm9yL0BTQVBfX2NvbW1vbi5FcnJvclJlc29sdXRpb24vTm90ZVwiIH0sXG5cdFx0XHR7IFwiZ3JvdXBOYW1lXCI6IFwiRXJyb3JSZXNvbHV0aW9uXCIsIFwicHJvcGVydHlcIjogc1REICsgXCIvZXJyb3IvQFNBUF9fY29tbW9uLkVycm9yUmVzb2x1dGlvbi9EZXRhaWxlZE5vdGVcIiB9LFxuXHRcdFx0eyBcImdyb3VwTmFtZVwiOiBcIkVycm9yUmVzb2x1dGlvblwiLCBcInByb3BlcnR5XCI6IHNURCArIFwiL2Vycm9yL0BTQVBfX2NvbW1vbi5FeGNlcHRpb25DYXRlZ29yeVwiIH0sXG5cdFx0XHR7IFwiZ3JvdXBOYW1lXCI6IFwiRXJyb3JSZXNvbHV0aW9uXCIsIFwicHJvcGVydHlcIjogc1REICsgXCIvZXJyb3IvQFNBUF9fY29tbW9uLlRpbWVTdGFtcFwiIH0sXG5cdFx0XHR7IFwiZ3JvdXBOYW1lXCI6IFwiRXJyb3JSZXNvbHV0aW9uXCIsIFwicHJvcGVydHlcIjogc1REICsgXCIvZXJyb3IvQFNBUF9fY29tbW9uLlRyYW5zYWN0aW9uSWRcIiB9LFxuXHRcdFx0eyBcImdyb3VwTmFtZVwiOiBcIk1lc3NhZ2VzXCIsIFwicHJvcGVydHlcIjogc1REICsgXCIvZXJyb3IvY29kZVwiIH0sXG5cdFx0XHR7IFwiZ3JvdXBOYW1lXCI6IFwiTWVzc2FnZXNcIiwgXCJwcm9wZXJ0eVwiOiBzVEQgKyBcIi9lcnJvci9tZXNzYWdlXCIgfVxuXHRcdF07XG5cdH1cblxuXHRsZXQgc0hUTUwgPSBcIk9iamVjdC5rZXlzKFwiICsgXCIke3RlY2huaWNhbERldGFpbHN9XCIgKyAnKS5sZW5ndGggPiAwID8gXCI8aDI+VGVjaG5pY2FsIERldGFpbHM8L2gyPlwiIDogXCJcIiAnO1xuXHRnZXRQYXRocygpLmZvckVhY2goZnVuY3Rpb24ob1Byb3BlcnR5OiB7IGdyb3VwTmFtZTogc3RyaW5nOyBwcm9wZXJ0eTogc3RyaW5nIH0pIHtcblx0XHRzSFRNTCA9IHNIVE1MICsgaW5zZXJ0R3JvdXBOYW1lKG9Qcm9wZXJ0eSkgKyBcIlwiICsgaW5zZXJ0RGV0YWlsKG9Qcm9wZXJ0eSkgKyBcIiArIFwiO1xuXHR9KTtcblx0cmV0dXJuIHNIVE1MO1xufVxuZnVuY3Rpb24gZm5Gb3JtYXREZXNjcmlwdGlvbigpIHtcblx0Y29uc3Qgc0hUTUwgPSBcIigke1wiICsgJ2Rlc2NyaXB0aW9ufSA/IChcIjxoMj5EZXNjcmlwdGlvbjwvaDI+XCIgKyAkeycgKyAnZGVzY3JpcHRpb259KSA6IFwiXCIpJztcblx0cmV0dXJuIHNIVE1MO1xufVxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBoaWdoZXN0IHByaW9yaXR5IG1lc3NhZ2UgdHlwZShFcnJvci9XYXJuaW5nL1N1Y2Nlc3MvSW5mb3JtYXRpb24pIGZyb20gdGhlIGF2YWlsYWJsZSBtZXNzYWdlcy5cblxuICogQGZ1bmN0aW9uXG4gKiBAbmFtZSBzYXAuZmUuY29yZS5hY3Rpb25zLm1lc3NhZ2VIYW5kbGluZy5mbkdldEhpZ2hlc3RNZXNzYWdlUHJpb3JpdHlcbiAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5hY3Rpb25zLm1lc3NhZ2VIYW5kbGluZ1xuICogQHBhcmFtIHtBcnJheX0gW2FNZXNzYWdlc10gTWVzc2FnZXMgbGlzdFxuICogQHJldHVybnMge3N0cmluZ30gSGlnaGVzdCBwcmlvcml0eSBtZXNzYWdlIGZyb20gdGhlIGF2YWlsYWJsZSBtZXNzYWdlc1xuICogQHByaXZhdGVcbiAqIEB1aTUtcmVzdHJpY3RlZFxuICovXG5mdW5jdGlvbiBmbkdldEhpZ2hlc3RNZXNzYWdlUHJpb3JpdHkoYU1lc3NhZ2VzOiBhbnlbXSkge1xuXHRsZXQgc01lc3NhZ2VQcmlvcml0eSA9IE1lc3NhZ2VUeXBlLk5vbmU7XG5cdGNvbnN0IGlMZW5ndGggPSBhTWVzc2FnZXMubGVuZ3RoO1xuXHRjb25zdCBvTWVzc2FnZUNvdW50OiBhbnkgPSB7IEVycm9yOiAwLCBXYXJuaW5nOiAwLCBTdWNjZXNzOiAwLCBJbmZvcm1hdGlvbjogMCB9O1xuXG5cdGZvciAobGV0IGkgPSAwOyBpIDwgaUxlbmd0aDsgaSsrKSB7XG5cdFx0KytvTWVzc2FnZUNvdW50W2FNZXNzYWdlc1tpXS5nZXRUeXBlKCldO1xuXHR9XG5cdGlmIChvTWVzc2FnZUNvdW50W01lc3NhZ2VUeXBlLkVycm9yXSA+IDApIHtcblx0XHRzTWVzc2FnZVByaW9yaXR5ID0gTWVzc2FnZVR5cGUuRXJyb3I7XG5cdH0gZWxzZSBpZiAob01lc3NhZ2VDb3VudFtNZXNzYWdlVHlwZS5XYXJuaW5nXSA+IDApIHtcblx0XHRzTWVzc2FnZVByaW9yaXR5ID0gTWVzc2FnZVR5cGUuV2FybmluZztcblx0fSBlbHNlIGlmIChvTWVzc2FnZUNvdW50W01lc3NhZ2VUeXBlLlN1Y2Nlc3NdID4gMCkge1xuXHRcdHNNZXNzYWdlUHJpb3JpdHkgPSBNZXNzYWdlVHlwZS5TdWNjZXNzO1xuXHR9IGVsc2UgaWYgKG9NZXNzYWdlQ291bnRbTWVzc2FnZVR5cGUuSW5mb3JtYXRpb25dID4gMCkge1xuXHRcdHNNZXNzYWdlUHJpb3JpdHkgPSBNZXNzYWdlVHlwZS5JbmZvcm1hdGlvbjtcblx0fVxuXHRyZXR1cm4gc01lc3NhZ2VQcmlvcml0eTtcbn1cbi8vIGZ1bmN0aW9uIHdoaWNoIG1vZGlmeSBlLVRhZyBtZXNzYWdlcyBvbmx5LlxuLy8gcmV0dXJucyA6IHRydWUsIGlmIGFueSBlLVRhZyBtZXNzYWdlIGlzIG1vZGlmaWVkLCBvdGhlcndpc2UgZmFsc2UuXG5mdW5jdGlvbiBmbk1vZGlmeUVUYWdNZXNzYWdlc09ubHkob01lc3NhZ2VNYW5hZ2VyOiBhbnksIG9SZXNvdXJjZUJ1bmRsZTogYW55KSB7XG5cdGNvbnN0IGFNZXNzYWdlcyA9IG9NZXNzYWdlTWFuYWdlci5nZXRNZXNzYWdlTW9kZWwoKS5nZXRPYmplY3QoXCIvXCIpO1xuXHRsZXQgYk1lc3NhZ2VzTW9kaWZpZWQgPSBmYWxzZTtcblx0bGV0IHNFdGFnTWVzc2FnZSA9IFwiXCI7XG5cdGFNZXNzYWdlcy5mb3JFYWNoKGZ1bmN0aW9uKG9NZXNzYWdlOiBhbnksIGk6IGFueSkge1xuXHRcdGNvbnN0IG9UZWNobmljYWxEZXRhaWxzID0gb01lc3NhZ2UuZ2V0VGVjaG5pY2FsRGV0YWlscygpO1xuXHRcdGlmIChvVGVjaG5pY2FsRGV0YWlscyAmJiBvVGVjaG5pY2FsRGV0YWlscy5odHRwU3RhdHVzID09PSA0MTIpIHtcblx0XHRcdHNFdGFnTWVzc2FnZSA9IHNFdGFnTWVzc2FnZSB8fCBvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfQVBQX0NPTVBPTkVOVF9TQVBGRV9FVEFHX1RFQ0hOSUNBTF9JU1NVRVNcIik7XG5cdFx0XHRvTWVzc2FnZU1hbmFnZXIucmVtb3ZlTWVzc2FnZXMoYU1lc3NhZ2VzW2ldKTtcblx0XHRcdG9NZXNzYWdlLnNldE1lc3NhZ2Uoc0V0YWdNZXNzYWdlKTtcblx0XHRcdG9NZXNzYWdlLnRhcmdldCA9IFwiXCI7XG5cdFx0XHRvTWVzc2FnZU1hbmFnZXIuYWRkTWVzc2FnZXMob01lc3NhZ2UpO1xuXHRcdFx0Yk1lc3NhZ2VzTW9kaWZpZWQgPSB0cnVlO1xuXHRcdH1cblx0fSk7XG5cdHJldHVybiBiTWVzc2FnZXNNb2RpZmllZDtcbn1cbi8vIERpYWxvZyBjbG9zZSBIYW5kbGluZ1xuZnVuY3Rpb24gZGlhbG9nQ2xvc2VIYW5kbGVyKCkge1xuXHRvRGlhbG9nLmNsb3NlKCk7XG5cdG9CYWNrQnV0dG9uLnNldFZpc2libGUoZmFsc2UpO1xuXHRhTWVzc2FnZUxpc3QgPSBbXTtcblx0cmVtb3ZlVW5ib3VuZFRyYW5zaXRpb25NZXNzYWdlcygpO1xufVxuZnVuY3Rpb24gZ2V0UmV0cnlBZnRlck1lc3NhZ2Uob01lc3NhZ2U6IGFueSwgYk1lc3NhZ2VEaWFsb2c6IGFueSkge1xuXHRjb25zdCBkTm93ID0gbmV3IERhdGUoKTtcblx0Y29uc3Qgb1RlY2huaWNhbERldGFpbHMgPSBvTWVzc2FnZS5nZXRUZWNobmljYWxEZXRhaWxzKCk7XG5cdGNvbnN0IG9SZXNvdXJjZUJ1bmRsZSA9IHNhcC51aS5nZXRDb3JlKCkuZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlKFwic2FwLmZlLmNvcmVcIikgYXMgUmVzb3VyY2VCdW5kbGU7XG5cdGxldCBzUmV0cnlBZnRlck1lc3NhZ2U7XG5cdGlmIChvVGVjaG5pY2FsRGV0YWlscyAmJiBvVGVjaG5pY2FsRGV0YWlscy5odHRwU3RhdHVzID09PSA1MDMgJiYgb1RlY2huaWNhbERldGFpbHMucmV0cnlBZnRlcikge1xuXHRcdGNvbnN0IGRSZXRyeUFmdGVyID0gb1RlY2huaWNhbERldGFpbHMucmV0cnlBZnRlcjtcblx0XHRsZXQgb0RhdGVGb3JtYXQ7XG5cdFx0aWYgKGROb3cuZ2V0RnVsbFllYXIoKSAhPT0gZFJldHJ5QWZ0ZXIuZ2V0RnVsbFllYXIoKSkge1xuXHRcdFx0Ly9kaWZmZXJlbnQgeWVhcnNcblx0XHRcdG9EYXRlRm9ybWF0ID0gRGF0ZUZvcm1hdC5nZXREYXRlVGltZUluc3RhbmNlKHtcblx0XHRcdFx0cGF0dGVybjogXCJNTU1NIGRkLCB5eXl5ICdhdCcgaGg6bW0gYVwiXG5cdFx0XHR9KTtcblx0XHRcdHNSZXRyeUFmdGVyTWVzc2FnZSA9IG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19NRVNTQUdFX0hBTkRMSU5HX1NBUEZFXzUwM19FUlJPUlwiLCBbb0RhdGVGb3JtYXQuZm9ybWF0KGRSZXRyeUFmdGVyKV0pO1xuXHRcdH0gZWxzZSBpZiAoZE5vdy5nZXRGdWxsWWVhcigpID09IGRSZXRyeUFmdGVyLmdldEZ1bGxZZWFyKCkpIHtcblx0XHRcdC8vc2FtZSB5ZWFyXG5cdFx0XHRpZiAoYk1lc3NhZ2VEaWFsb2cpIHtcblx0XHRcdFx0Ly9sZXNzIHRoYW4gMiBtaW5cblx0XHRcdFx0c1JldHJ5QWZ0ZXJNZXNzYWdlID1cblx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfTUVTU0FHRV9IQU5ETElOR19TQVBGRV81MDNfVElUTEVcIikgK1xuXHRcdFx0XHRcdFwiIFwiICtcblx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfTUVTU0FHRV9IQU5ETElOR19TQVBGRV81MDNfREVTQ1wiKTtcblx0XHRcdH0gZWxzZSBpZiAoZE5vdy5nZXRNb250aCgpICE9PSBkUmV0cnlBZnRlci5nZXRNb250aCgpIHx8IGROb3cuZ2V0RGF0ZSgpICE9PSBkUmV0cnlBZnRlci5nZXREYXRlKCkpIHtcblx0XHRcdFx0b0RhdGVGb3JtYXQgPSBEYXRlRm9ybWF0LmdldERhdGVUaW1lSW5zdGFuY2Uoe1xuXHRcdFx0XHRcdHBhdHRlcm46IFwiTU1NTSBkZCAnYXQnIGhoOm1tIGFcIlxuXHRcdFx0XHR9KTsgLy9kaWZmZXJlbnQgbW9udGhzIG9yIGRpZmZlcmVudCBkYXlzIG9mIHNhbWUgbW9udGhcblx0XHRcdFx0c1JldHJ5QWZ0ZXJNZXNzYWdlID0gb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX01FU1NBR0VfSEFORExJTkdfU0FQRkVfNTAzX0VSUk9SXCIsIFtvRGF0ZUZvcm1hdC5mb3JtYXQoZFJldHJ5QWZ0ZXIpXSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvL3NhbWUgZGF5XG5cdFx0XHRcdG9EYXRlRm9ybWF0ID0gRGF0ZUZvcm1hdC5nZXREYXRlVGltZUluc3RhbmNlKHtcblx0XHRcdFx0XHRwYXR0ZXJuOiBcImhoOm1tIGFcIlxuXHRcdFx0XHR9KTtcblx0XHRcdFx0c1JldHJ5QWZ0ZXJNZXNzYWdlID0gb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX01FU1NBR0VfSEFORExJTkdfU0FQRkVfNTAzX0VSUk9SX0RBWVwiLCBbb0RhdGVGb3JtYXQuZm9ybWF0KGRSZXRyeUFmdGVyKV0pO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdGlmIChvVGVjaG5pY2FsRGV0YWlscyAmJiBvVGVjaG5pY2FsRGV0YWlscy5odHRwU3RhdHVzID09PSA1MDMgJiYgIW9UZWNobmljYWxEZXRhaWxzLnJldHJ5QWZ0ZXIpIHtcblx0XHRzUmV0cnlBZnRlck1lc3NhZ2UgPSBvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfTUVTU0FHRV9IQU5ETElOR19TQVBGRV81MDNfRVJST1JfTk9fUkVUUllfQUZURVJcIik7XG5cdH1cblx0cmV0dXJuIHNSZXRyeUFmdGVyTWVzc2FnZTtcbn1cbmZ1bmN0aW9uIHNob3dVbmJvdW5kTWVzc2FnZXMoXG5cdHRoaXM6IG1lc3NhZ2VIYW5kbGluZ1R5cGUsXG5cdGFDdXN0b21NZXNzYWdlcz86IGFueVtdLFxuXHRvQ29udGV4dD86IGFueSxcblx0Ykhhc0V0YWdNZXNzYWdlPzogYm9vbGVhbixcblx0YlNob3dCb3VuZFRyYW5zaXRpb24/OiBib29sZWFuXG4pIHtcblx0bGV0IGFVbmJvdW5kTWVzc2FnZXMgPSB0aGlzLmdldE1lc3NhZ2VzKCk7XG5cdGNvbnN0IG9NZXNzYWdlTWFuYWdlciA9IChzYXAudWkuZ2V0Q29yZSgpIGFzIGFueSkuZ2V0TWVzc2FnZU1hbmFnZXIoKTtcblx0bGV0IHNIaWdoZXN0UHJpb3JpdHk7XG5cdGxldCBzSGlnaGVzdFByaW9yaXR5VGV4dDtcblx0Y29uc3QgYUZpbHRlcnMgPSBbXG5cdFx0bmV3IEZpbHRlcih7IHBhdGg6IFwiY29kZVwiLCBvcGVyYXRvcjogRmlsdGVyT3BlcmF0b3IuTkUsIHZhbHVlMTogbnVsbCB9KSxcblx0XHRuZXcgRmlsdGVyKHsgcGF0aDogXCJwZXJzaXN0ZW50XCIsIG9wZXJhdG9yOiBGaWx0ZXJPcGVyYXRvci5ORSwgdmFsdWUxOiBmYWxzZSB9KVxuXHRdO1xuXHRsZXQgc2hvd01lc3NhZ2VEaWFsb2cgPSBmYWxzZSxcblx0XHRzaG93TWVzc2FnZUJveCA9IGZhbHNlO1xuXG5cdGlmIChiU2hvd0JvdW5kVHJhbnNpdGlvbikge1xuXHRcdGFVbmJvdW5kTWVzc2FnZXMgPSBhVW5ib3VuZE1lc3NhZ2VzLmNvbmNhdChnZXRNZXNzYWdlcyh0cnVlLCB0cnVlKSk7XG5cdFx0Ly8gd2Ugb25seSB3YW50IHRvIHNob3cgYm91bmQgdHJhbnNpdGlvbiBtZXNzYWdlcyBub3QgYm91bmQgc3RhdGUgbWVzc2FnZXMgaGVuY2UgYWRkIGEgZmlsdGVyIGZvciB0aGUgc2FtZVxuXHRcdGFGaWx0ZXJzLnB1c2gobmV3IEZpbHRlcih7IHBhdGg6IFwicGVyc2lzdGVudFwiLCBvcGVyYXRvcjogRmlsdGVyT3BlcmF0b3IuRVEsIHZhbHVlMTogdHJ1ZSB9KSk7XG5cdFx0Y29uc3QgZm5DaGVja0NvbnRyb2xJZEluRGlhbG9nID0gZnVuY3Rpb24oYUNvbnRyb2xJZHM6IGFueSkge1xuXHRcdFx0bGV0IGluZGV4ID0gSW5maW5pdHksXG5cdFx0XHRcdG9Db250cm9sID0gc2FwLnVpLmdldENvcmUoKS5ieUlkKGFDb250cm9sSWRzWzBdKSBhcyBNYW5hZ2VkT2JqZWN0O1xuXHRcdFx0Y29uc3QgZXJyb3JGaWVsZENvbnRyb2wgPSBzYXAudWkuZ2V0Q29yZSgpLmJ5SWQoYUNvbnRyb2xJZHNbMF0pIGFzIENvbnRyb2w7XG5cdFx0XHR3aGlsZSAob0NvbnRyb2wpIHtcblx0XHRcdFx0Y29uc3QgZmllbGRSYW5raW5EaWFsb2cgPVxuXHRcdFx0XHRcdG9Db250cm9sIGluc3RhbmNlb2YgRGlhbG9nXG5cdFx0XHRcdFx0XHQ/IChlcnJvckZpZWxkQ29udHJvbC5nZXRQYXJlbnQoKSBhcyBhbnkpLmZpbmRFbGVtZW50cyh0cnVlKS5pbmRleE9mKGVycm9yRmllbGRDb250cm9sKVxuXHRcdFx0XHRcdFx0OiBJbmZpbml0eTtcblx0XHRcdFx0aWYgKG9Db250cm9sIGluc3RhbmNlb2YgRGlhbG9nKSB7XG5cdFx0XHRcdFx0aWYgKGluZGV4ID4gZmllbGRSYW5raW5EaWFsb2cpIHtcblx0XHRcdFx0XHRcdGluZGV4ID0gZmllbGRSYW5raW5EaWFsb2c7XG5cdFx0XHRcdFx0XHQvLyBTZXQgdGhlIGZvY3VzIHRvIHRoZSBkaWFsb2cncyBjb250cm9sXG5cdFx0XHRcdFx0XHRlcnJvckZpZWxkQ29udHJvbC5mb2N1cygpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQvLyBtZXNzYWdlcyB3aXRoIHRhcmdldCBpbnNpZGUgc2FwLm0uRGlhbG9nIHNob3VsZCBub3QgYnJpbmcgdXAgdGhlIG1lc3NhZ2UgZGlhbG9nXG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdG9Db250cm9sID0gb0NvbnRyb2wuZ2V0UGFyZW50KCk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9O1xuXHRcdGFGaWx0ZXJzLnB1c2goXG5cdFx0XHRuZXcgRmlsdGVyKHtcblx0XHRcdFx0cGF0aDogXCJjb250cm9sSWRzXCIsXG5cdFx0XHRcdHRlc3Q6IGZuQ2hlY2tDb250cm9sSWRJbkRpYWxvZyxcblx0XHRcdFx0Y2FzZVNlbnNpdGl2ZTogdHJ1ZVxuXHRcdFx0fSlcblx0XHQpO1xuXHR9IGVsc2Uge1xuXHRcdC8vIG9ubHkgdW5ib3VuZCBtZXNzYWdlcyBoYXZlIHRvIGJlIHNob3duIHNvIGFkZCBmaWx0ZXIgYWNjb3JkaW5nbHlcblx0XHRhRmlsdGVycy5wdXNoKG5ldyBGaWx0ZXIoeyBwYXRoOiBcInRhcmdldFwiLCBvcGVyYXRvcjogRmlsdGVyT3BlcmF0b3IuRVEsIHZhbHVlMTogXCJcIiB9KSk7XG5cdH1cblx0aWYgKGFDdXN0b21NZXNzYWdlcyAmJiBhQ3VzdG9tTWVzc2FnZXMubGVuZ3RoKSB7XG5cdFx0YUN1c3RvbU1lc3NhZ2VzLmZvckVhY2goZnVuY3Rpb24ob01lc3NhZ2U6IGFueSkge1xuXHRcdFx0Y29uc3QgbWVzc2FnZUNvZGUgPSBvTWVzc2FnZS5jb2RlID8gb01lc3NhZ2UuY29kZSA6IFwiXCI7XG5cdFx0XHRvTWVzc2FnZU1hbmFnZXIuYWRkTWVzc2FnZXMoXG5cdFx0XHRcdG5ldyBNZXNzYWdlKHtcblx0XHRcdFx0XHRtZXNzYWdlOiBvTWVzc2FnZS50ZXh0LFxuXHRcdFx0XHRcdHR5cGU6IG9NZXNzYWdlLnR5cGUsXG5cdFx0XHRcdFx0dGFyZ2V0OiBcIlwiLFxuXHRcdFx0XHRcdHBlcnNpc3RlbnQ6IHRydWUsXG5cdFx0XHRcdFx0Y29kZTogbWVzc2FnZUNvZGVcblx0XHRcdFx0fSlcblx0XHRcdCk7XG5cdFx0XHQvL1RoZSB0YXJnZXQgYW5kIHBlcnNpc3RlbnQgcHJvcGVydGllcyBvZiB0aGUgbWVzc2FnZSBhcmUgaGFyZGNvZGVkIGFzIFwiXCIgYW5kIHRydWUgYmVjYXVzZSB0aGUgZnVuY3Rpb24gZGVhbHMgd2l0aCBvbmx5IHVuYm91bmQgbWVzc2FnZXMuXG5cdFx0fSk7XG5cdH1cblx0Y29uc3Qgb01lc3NhZ2VEaWFsb2dNb2RlbCA9IG5ldyBKU09OTW9kZWwoKTtcblx0aWYgKGFVbmJvdW5kTWVzc2FnZXMubGVuZ3RoID09PSAxICYmIGFVbmJvdW5kTWVzc2FnZXNbMF0uZ2V0Q29kZSgpID09PSBcIjUwM1wiKSB7XG5cdFx0c2hvd01lc3NhZ2VCb3ggPSB0cnVlO1xuXHR9IGVsc2Uge1xuXHRcdGNvbnN0IG9MaXN0QmluZGluZyA9IG9NZXNzYWdlTWFuYWdlci5nZXRNZXNzYWdlTW9kZWwoKS5iaW5kTGlzdChcIi9cIiwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGFGaWx0ZXJzKSxcblx0XHRcdGFDdXJyZW50Q29udGV4dHMgPSBvTGlzdEJpbmRpbmcuZ2V0Q3VycmVudENvbnRleHRzKCk7XG5cdFx0aWYgKGFDdXJyZW50Q29udGV4dHMgJiYgYUN1cnJlbnRDb250ZXh0cy5sZW5ndGggPiAwKSB7XG5cdFx0XHQvLyBEb24ndCBzaG93IGRpYWxvZyBpbmNhc2UgdGhlcmUgYXJlIG5vIGVycm9ycyB0byBzaG93XG5cdFx0XHRzaG93TWVzc2FnZURpYWxvZyA9IHRydWU7XG5cdFx0XHQvLyBBcyBmaXRlcmluZyBoYXMgYWxyZWFkeSBoYXBwZW5lZCBoZXJlIGhlbmNlXG5cdFx0XHQvLyB1c2luZyB0aGUgbWVzc2FnZSBtb2RlbCBhZ2FpbiBmb3IgdGhlIG1lc3NhZ2UgZGlhbG9nIHZpZXcgYW5kIHRoZW4gZmlsdGVyaW5nIG9uIHRoYXQgYmluZGluZyBhZ2FpbiBpcyB1bm5lY2Vzc2FyeS5cblx0XHRcdC8vIFNvIHdlIGNyZWF0ZSBuZXcganNvbiBtb2RlbCB0byB1c2UgZm9yIHRoZSBtZXNzYWdlIGRpYWxvZyB2aWV3LlxuXHRcdFx0Y29uc3QgYU1lc3NhZ2VzOiBhbnlbXSA9IFtdO1xuXHRcdFx0YUN1cnJlbnRDb250ZXh0cy5mb3JFYWNoKGZ1bmN0aW9uKG9Db250ZXh0OiBhbnkpIHtcblx0XHRcdFx0bGV0IG9NZXNzYWdlO1xuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0b0NvbnRleHQuZ2V0T2JqZWN0KCkudGVjaG5pY2FsRGV0YWlscyAmJlxuXHRcdFx0XHRcdGFNZXNzYWdlTGlzdC5pbmRleE9mKG9Db250ZXh0LmdldE9iamVjdCgpLnRlY2huaWNhbERldGFpbHMub3JpZ2luYWxNZXNzYWdlLm1lc3NhZ2UpID09PSAtMVxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRhTWVzc2FnZUxpc3QucHVzaChvQ29udGV4dC5nZXRPYmplY3QoKS50ZWNobmljYWxEZXRhaWxzLm9yaWdpbmFsTWVzc2FnZS5tZXNzYWdlKTtcblx0XHRcdFx0XHRvTWVzc2FnZSA9IG9Db250ZXh0LmdldE9iamVjdCgpO1xuXHRcdFx0XHRcdGFNZXNzYWdlcy5wdXNoKG9NZXNzYWdlKTtcblx0XHRcdFx0XHRhTWVzc2FnZURhdGFMaXN0ID0gYU1lc3NhZ2VzO1xuXHRcdFx0XHR9IGVsc2UgaWYgKCFvQ29udGV4dC5nZXRPYmplY3QoKS50ZWNobmljYWxEZXRhaWxzKSB7XG5cdFx0XHRcdFx0b01lc3NhZ2UgPSBvQ29udGV4dC5nZXRPYmplY3QoKTtcblx0XHRcdFx0XHRhTWVzc2FnZXMucHVzaChvTWVzc2FnZSk7XG5cdFx0XHRcdFx0YU1lc3NhZ2VEYXRhTGlzdCA9IGFNZXNzYWdlcztcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0XHQvLyBpZihhTWVzc2FnZXMubGVuZ3RoID09PSAwICYmIGFNZXNzYWdlTGlzdC5sZW5ndGgpIHtcblx0XHRcdC8vIFx0b01lc3NhZ2VEaWFsb2dNb2RlbC5zZXREYXRhKGFNZXNzYWdlcyk7XG5cdFx0XHQvLyB9XG5cdFx0XHRvTWVzc2FnZURpYWxvZ01vZGVsLnNldERhdGEoYU1lc3NhZ2VEYXRhTGlzdCk7XG5cdFx0fVxuXHR9XG5cdGlmIChhVW5ib3VuZE1lc3NhZ2VzLmxlbmd0aCA9PT0gMCAmJiAhYUN1c3RvbU1lc3NhZ2VzICYmICFiSGFzRXRhZ01lc3NhZ2UpIHtcblx0XHQvLyBEb24ndCBzaG93IHRoZSBwb3B1cCBpZiB0aGVyZSBhcmUgbm8gdHJhbnNpZW50IG1lc3NhZ2VzXG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSh0cnVlKTtcblx0fSBlbHNlIGlmIChhVW5ib3VuZE1lc3NhZ2VzLmxlbmd0aCA9PT0gMSAmJiBhVW5ib3VuZE1lc3NhZ2VzWzBdLmdldFR5cGUoKSA9PT0gTWVzc2FnZVR5cGUuU3VjY2VzcyAmJiAhYUN1c3RvbU1lc3NhZ2VzKSB7XG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KHJlc29sdmUgPT4ge1xuXHRcdFx0TWVzc2FnZVRvYXN0LnNob3coYVVuYm91bmRNZXNzYWdlc1swXS5tZXNzYWdlKTtcblx0XHRcdG9NZXNzYWdlTWFuYWdlci5yZW1vdmVNZXNzYWdlcyhhVW5ib3VuZE1lc3NhZ2VzKTtcblx0XHRcdHJlc29sdmUoKTtcblx0XHR9KTtcblx0fSBlbHNlIGlmIChzaG93TWVzc2FnZURpYWxvZykge1xuXHRcdGFSZXNvbHZlRnVuY3Rpb25zID0gYVJlc29sdmVGdW5jdGlvbnMgfHwgW107XG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmU6ICh2YWx1ZTogYW55KSA9PiB2b2lkLCByZWplY3Q6IChyZWFzb24/OiBhbnkpID0+IHZvaWQpIHtcblx0XHRcdGFSZXNvbHZlRnVuY3Rpb25zLnB1c2gocmVzb2x2ZSk7XG5cdFx0XHQoc2FwLnVpLmdldENvcmUoKS5nZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUoXCJzYXAuZmUuY29yZVwiLCB0cnVlKSBhcyBQcm9taXNlPFJlc291cmNlQnVuZGxlPilcblx0XHRcdFx0LnRoZW4oZnVuY3Rpb24ob1Jlc291cmNlQnVuZGxlOiBhbnkpIHtcblx0XHRcdFx0XHRvTWVzc2FnZVRlbXBsYXRlID1cblx0XHRcdFx0XHRcdG9NZXNzYWdlVGVtcGxhdGUgfHxcblx0XHRcdFx0XHRcdG5ldyBNZXNzYWdlSXRlbSh1bmRlZmluZWQsIHtcblx0XHRcdFx0XHRcdFx0Y291bnRlcjogeyBwYXRoOiBcImNvdW50ZXJcIiB9LFxuXHRcdFx0XHRcdFx0XHR0aXRsZTogXCJ7bWVzc2FnZX1cIixcblx0XHRcdFx0XHRcdFx0c3VidGl0bGU6IFwie2FkZGl0aW9uYWxUZXh0fVwiLFxuXHRcdFx0XHRcdFx0XHRsb25ndGV4dFVybDogXCJ7ZGVzY3JpcHRpb25Vcmx9XCIsXG5cdFx0XHRcdFx0XHRcdHR5cGU6IHsgcGF0aDogXCJ0eXBlXCIgfSxcblx0XHRcdFx0XHRcdFx0ZGVzY3JpcHRpb246XG5cdFx0XHRcdFx0XHRcdFx0XCJ7PSAke1wiICtcblx0XHRcdFx0XHRcdFx0XHRcImRlc2NyaXB0aW9ufSB8fCAke3RlY2huaWNhbERldGFpbHN9ID8gXCIgK1xuXHRcdFx0XHRcdFx0XHRcdCdcIjxodG1sPjxib2R5PlwiICsgJyArXG5cdFx0XHRcdFx0XHRcdFx0Zm5Gb3JtYXREZXNjcmlwdGlvbigpICtcblx0XHRcdFx0XHRcdFx0XHRcIiArIFwiICtcblx0XHRcdFx0XHRcdFx0XHRmbkZvcm1hdFRlY2huaWNhbERldGFpbHMoKSArXG5cdFx0XHRcdFx0XHRcdFx0J1wiPC9ib2R5PjwvaHRtbD5cIicgK1xuXHRcdFx0XHRcdFx0XHRcdCcgOiBcIlwiIH0nLFxuXHRcdFx0XHRcdFx0XHRtYXJrdXBEZXNjcmlwdGlvbjogdHJ1ZVxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0b01lc3NhZ2VWaWV3ID1cblx0XHRcdFx0XHRcdG9NZXNzYWdlVmlldyB8fFxuXHRcdFx0XHRcdFx0bmV3IE1lc3NhZ2VWaWV3KHtcblx0XHRcdFx0XHRcdFx0c2hvd0RldGFpbHNQYWdlSGVhZGVyOiBmYWxzZSxcblx0XHRcdFx0XHRcdFx0aXRlbVNlbGVjdDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdFx0b0JhY2tCdXR0b24uc2V0VmlzaWJsZSh0cnVlKTtcblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0aXRlbXM6IHtcblx0XHRcdFx0XHRcdFx0XHRwYXRoOiBcIi9cIixcblx0XHRcdFx0XHRcdFx0XHR0ZW1wbGF0ZTogb01lc3NhZ2VUZW1wbGF0ZVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRvQmFja0J1dHRvbiA9XG5cdFx0XHRcdFx0XHRvQmFja0J1dHRvbiB8fFxuXHRcdFx0XHRcdFx0bmV3IEJ1dHRvbih7XG5cdFx0XHRcdFx0XHRcdGljb246IEljb25Qb29sLmdldEljb25VUkkoXCJuYXYtYmFja1wiKSxcblx0XHRcdFx0XHRcdFx0dmlzaWJsZTogZmFsc2UsXG5cdFx0XHRcdFx0XHRcdHByZXNzOiBmdW5jdGlvbih0aGlzOiBCdXR0b24pIHtcblx0XHRcdFx0XHRcdFx0XHRvTWVzc2FnZVZpZXcubmF2aWdhdGVCYWNrKCk7XG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5zZXRWaXNpYmxlKGZhbHNlKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0Ly8gVXBkYXRlIHByb3BlciBFVGFnIE1pc21hdGNoIGVycm9yXG5cdFx0XHRcdFx0Y29uc3QgYkhhc0V0YWdNZXNzYWdlID0gZm5Nb2RpZnlFVGFnTWVzc2FnZXNPbmx5KG9NZXNzYWdlTWFuYWdlciwgb1Jlc291cmNlQnVuZGxlKTtcblx0XHRcdFx0XHRvTWVzc2FnZVZpZXcuc2V0TW9kZWwob01lc3NhZ2VEaWFsb2dNb2RlbCk7XG5cdFx0XHRcdFx0b0RpYWxvZyA9XG5cdFx0XHRcdFx0XHRvRGlhbG9nIHx8XG5cdFx0XHRcdFx0XHRuZXcgRGlhbG9nKHtcblx0XHRcdFx0XHRcdFx0cmVzaXphYmxlOiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRjb250ZW50OiBvTWVzc2FnZVZpZXcsXG5cdFx0XHRcdFx0XHRcdGVuZEJ1dHRvbjogbmV3IEJ1dHRvbih7XG5cdFx0XHRcdFx0XHRcdFx0cHJlc3M6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0ZGlhbG9nQ2xvc2VIYW5kbGVyKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBhbHNvIHJlbW92ZSBib3VuZCB0cmFuc2l0aW9uIG1lc3NhZ2VzIGlmIHdlIHdlcmUgc2hvd2luZyB0aGVtXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoYlNob3dCb3VuZFRyYW5zaXRpb24pIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmVtb3ZlQm91bmRUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHRcdHRleHQ6IG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19DT01NT05fU0FQRkVfQ0xPU0VcIilcblx0XHRcdFx0XHRcdFx0fSksXG5cdFx0XHRcdFx0XHRcdGN1c3RvbUhlYWRlcjogbmV3IEJhcih7XG5cdFx0XHRcdFx0XHRcdFx0Y29udGVudE1pZGRsZTogW1xuXHRcdFx0XHRcdFx0XHRcdFx0bmV3IFRleHQoe1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR0ZXh0OiBvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfTUVTU0FHRV9IQU5ETElOR19TQVBGRV9FUlJPUl9NRVNTQUdFU19QQUdFX1RJVExFXCIpXG5cdFx0XHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHRcdF0sXG5cdFx0XHRcdFx0XHRcdFx0Y29udGVudExlZnQ6IFtvQmFja0J1dHRvbl1cblx0XHRcdFx0XHRcdFx0fSksXG5cdFx0XHRcdFx0XHRcdGNvbnRlbnRXaWR0aDogXCIzNy41ZW1cIixcblx0XHRcdFx0XHRcdFx0Y29udGVudEhlaWdodDogXCIyMS41ZW1cIixcblx0XHRcdFx0XHRcdFx0dmVydGljYWxTY3JvbGxpbmc6IGZhbHNlLFxuXHRcdFx0XHRcdFx0XHRhZnRlckNsb3NlOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGFSZXNvbHZlRnVuY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRhUmVzb2x2ZUZ1bmN0aW9uc1tpXS5jYWxsKCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdGFSZXNvbHZlRnVuY3Rpb25zID0gW107XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdFx0aWYgKGJIYXNFdGFnTWVzc2FnZSkge1xuXHRcdFx0XHRcdFx0c2FwLnVpLnJlcXVpcmUoW1wic2FwL20vQnV0dG9uVHlwZVwiXSwgZnVuY3Rpb24oQnV0dG9uVHlwZTogYW55KSB7XG5cdFx0XHRcdFx0XHRcdG9EaWFsb2cuc2V0QmVnaW5CdXR0b24oXG5cdFx0XHRcdFx0XHRcdFx0bmV3IEJ1dHRvbih7XG5cdFx0XHRcdFx0XHRcdFx0XHRwcmVzczogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGRpYWxvZ0Nsb3NlSGFuZGxlcigpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAob0NvbnRleHQuaGFzUGVuZGluZ0NoYW5nZXMoKSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9Db250ZXh0LmdldEJpbmRpbmcoKS5yZXNldENoYW5nZXMoKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRvQ29udGV4dC5yZWZyZXNoKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHRcdFx0dGV4dDogb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0NPTU1PTl9TQVBGRV9SRUZSRVNIXCIpLFxuXHRcdFx0XHRcdFx0XHRcdFx0dHlwZTogQnV0dG9uVHlwZS5FbXBoYXNpemVkXG5cdFx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRvRGlhbG9nLmRlc3Ryb3lCZWdpbkJ1dHRvbigpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRzSGlnaGVzdFByaW9yaXR5ID0gZm5HZXRIaWdoZXN0TWVzc2FnZVByaW9yaXR5KG9NZXNzYWdlVmlldy5nZXRJdGVtcygpKTtcblx0XHRcdFx0XHRzSGlnaGVzdFByaW9yaXR5VGV4dCA9IGdldFRyYW5zbGF0ZWRUZXh0Rm9yTWVzc2FnZURpYWxvZyhzSGlnaGVzdFByaW9yaXR5KTtcblx0XHRcdFx0XHRvRGlhbG9nLnNldFN0YXRlKHNIaWdoZXN0UHJpb3JpdHkpO1xuXHRcdFx0XHRcdChvRGlhbG9nLmdldEN1c3RvbUhlYWRlcigpIGFzIGFueSkuZ2V0Q29udGVudE1pZGRsZSgpWzBdLnNldFRleHQoc0hpZ2hlc3RQcmlvcml0eVRleHQpO1xuXHRcdFx0XHRcdG9NZXNzYWdlVmlldy5uYXZpZ2F0ZUJhY2soKTtcblx0XHRcdFx0XHRvRGlhbG9nLm9wZW4oKTtcblx0XHRcdFx0fSlcblx0XHRcdFx0LmNhdGNoKHJlamVjdCk7XG5cdFx0fSk7XG5cdH0gZWxzZSBpZiAoc2hvd01lc3NhZ2VCb3gpIHtcblx0XHRyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSkge1xuXHRcdFx0Y29uc3Qgb01lc3NhZ2UgPSBhVW5ib3VuZE1lc3NhZ2VzWzBdO1xuXHRcdFx0aWYgKG9NZXNzYWdlLnRlY2huaWNhbERldGFpbHMgJiYgYU1lc3NhZ2VMaXN0LmluZGV4T2Yob01lc3NhZ2UudGVjaG5pY2FsRGV0YWlscy5vcmlnaW5hbE1lc3NhZ2UubWVzc2FnZSkgPT09IC0xKSB7XG5cdFx0XHRcdGFNZXNzYWdlTGlzdC5wdXNoKG9NZXNzYWdlLnRlY2huaWNhbERldGFpbHMub3JpZ2luYWxNZXNzYWdlLm1lc3NhZ2UpO1xuXHRcdFx0XHRsZXQgZm9ybWF0dGVkVGV4dFN0cmluZyA9IFwiPGh0bWw+PGJvZHk+XCI7XG5cdFx0XHRcdGNvbnN0IHJldHJ5QWZ0ZXJNZXNzYWdlID0gZ2V0UmV0cnlBZnRlck1lc3NhZ2Uob01lc3NhZ2UsIHRydWUpO1xuXHRcdFx0XHRpZiAocmV0cnlBZnRlck1lc3NhZ2UpIHtcblx0XHRcdFx0XHRmb3JtYXR0ZWRUZXh0U3RyaW5nID0gXCI8aDY+XCIgKyByZXRyeUFmdGVyTWVzc2FnZSArIFwiPC9oNj48YnI+XCI7XG5cdFx0XHRcdH1cblx0XHRcdFx0Zm9ybWF0dGVkVGV4dFN0cmluZyA9IGZvcm1hdHRlZFRleHRTdHJpbmcgKyBvTWVzc2FnZS5nZXRNZXNzYWdlKCkgKyBcIjwvaHRtbD48L2JvZHk+XCI7XG5cdFx0XHRcdGNvbnN0IGZvcm1hdHRlZFRleHQ6IGFueSA9IG5ldyBGb3JtYXR0ZWRUZXh0KHtcblx0XHRcdFx0XHRodG1sVGV4dDogZm9ybWF0dGVkVGV4dFN0cmluZ1xuXHRcdFx0XHR9KTtcblx0XHRcdFx0TWVzc2FnZUJveC5lcnJvcihmb3JtYXR0ZWRUZXh0LCB7XG5cdFx0XHRcdFx0b25DbG9zZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRhTWVzc2FnZUxpc3QgPSBbXTtcblx0XHRcdFx0XHRcdGlmIChiU2hvd0JvdW5kVHJhbnNpdGlvbikge1xuXHRcdFx0XHRcdFx0XHRyZW1vdmVCb3VuZFRyYW5zaXRpb25NZXNzYWdlcygpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0cmVtb3ZlVW5ib3VuZFRyYW5zaXRpb25NZXNzYWdlcygpO1xuXHRcdFx0XHRcdFx0cmVzb2x2ZSh0cnVlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUodHJ1ZSk7XG5cdH1cbn1cbmZ1bmN0aW9uIGdldFRyYW5zbGF0ZWRUZXh0Rm9yTWVzc2FnZURpYWxvZyhzSGlnaGVzdFByaW9yaXR5OiBhbnkpIHtcblx0Y29uc3Qgb1Jlc291cmNlQnVuZGxlID0gc2FwLnVpLmdldENvcmUoKS5nZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUoXCJzYXAuZmUuY29yZVwiKSBhcyBSZXNvdXJjZUJ1bmRsZTtcblx0c3dpdGNoIChzSGlnaGVzdFByaW9yaXR5KSB7XG5cdFx0Y2FzZSBcIkVycm9yXCI6XG5cdFx0XHRyZXR1cm4gb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0NPTU1PTl9TQVBGRV9FUlJPUl9NRVNTQUdFU19QQUdFX1RJVExFX0VSUk9SXCIpO1xuXHRcdGNhc2UgXCJJbmZvcm1hdGlvblwiOlxuXHRcdFx0cmV0dXJuIG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19NRVNTQUdFX0hBTkRMSU5HX1NBUEZFX0VSUk9SX01FU1NBR0VTX1BBR0VfVElUTEVfSU5GT1wiKTtcblx0XHRjYXNlIFwiU3VjY2Vzc1wiOlxuXHRcdFx0cmV0dXJuIG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19NRVNTQUdFX0hBTkRMSU5HX1NBUEZFX0VSUk9SX01FU1NBR0VTX1BBR0VfVElUTEVfU1VDQ0VTU1wiKTtcblx0XHRjYXNlIFwiV2FybmluZ1wiOlxuXHRcdFx0cmV0dXJuIG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19NRVNTQUdFX0hBTkRMSU5HX1NBUEZFX0VSUk9SX01FU1NBR0VTX1BBR0VfVElUTEVfV0FSTklOR1wiKTtcblx0XHRkZWZhdWx0OlxuXHRcdFx0cmV0dXJuIG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19NRVNTQUdFX0hBTkRMSU5HX1NBUEZFX0VSUk9SX01FU1NBR0VTX1BBR0VfVElUTEVcIik7XG5cdH1cbn1cbmZ1bmN0aW9uIHJlbW92ZVVuYm91bmRUcmFuc2l0aW9uTWVzc2FnZXMoKSB7XG5cdHJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcyhmYWxzZSk7XG59XG5mdW5jdGlvbiByZW1vdmVCb3VuZFRyYW5zaXRpb25NZXNzYWdlcygpIHtcblx0cmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzKHRydWUpO1xufVxuZnVuY3Rpb24gZ2V0TWVzc2FnZXMoYkJvdW5kTWVzc2FnZXM6IGJvb2xlYW4gPSBmYWxzZSwgYlRyYW5zaXRpb25Pbmx5OiBib29sZWFuID0gZmFsc2UpIHtcblx0bGV0IGk7XG5cdGNvbnN0IG9NZXNzYWdlTWFuYWdlciA9IChzYXAudWkuZ2V0Q29yZSgpIGFzIGFueSkuZ2V0TWVzc2FnZU1hbmFnZXIoKSxcblx0XHRvTWVzc2FnZU1vZGVsID0gb01lc3NhZ2VNYW5hZ2VyLmdldE1lc3NhZ2VNb2RlbCgpLFxuXHRcdGFNZXNzYWdlcyA9IG9NZXNzYWdlTW9kZWwuZ2V0T2JqZWN0KFwiL1wiKSxcblx0XHRvUmVzb3VyY2VCdW5kbGUgPSBzYXAudWkuZ2V0Q29yZSgpLmdldExpYnJhcnlSZXNvdXJjZUJ1bmRsZShcInNhcC5mZS5jb3JlXCIpIGFzIFJlc291cmNlQnVuZGxlLFxuXHRcdGFUcmFuc2l0aW9uTWVzc2FnZXMgPSBbXTtcblxuXHRmb3IgKGkgPSAwOyBpIDwgYU1lc3NhZ2VzLmxlbmd0aDsgaSsrKSB7XG5cdFx0aWYgKFxuXHRcdFx0KCFiVHJhbnNpdGlvbk9ubHkgfHwgYU1lc3NhZ2VzW2ldLnBlcnNpc3RlbnQpICYmXG5cdFx0XHQoKGJCb3VuZE1lc3NhZ2VzICYmIGFNZXNzYWdlc1tpXS50YXJnZXQgIT09IFwiXCIpIHx8ICghYkJvdW5kTWVzc2FnZXMgJiYgKCFhTWVzc2FnZXNbaV0udGFyZ2V0IHx8IGFNZXNzYWdlc1tpXS50YXJnZXQgPT09IFwiXCIpKSkgJiZcblx0XHRcdGFNZXNzYWdlc1tpXS5jb2RlXG5cdFx0KSB7XG5cdFx0XHRhVHJhbnNpdGlvbk1lc3NhZ2VzLnB1c2goYU1lc3NhZ2VzW2ldKTtcblx0XHR9XG5cdH1cblxuXHRmb3IgKGkgPSAwOyBpIDwgYVRyYW5zaXRpb25NZXNzYWdlcy5sZW5ndGg7IGkrKykge1xuXHRcdGlmIChcblx0XHRcdGFUcmFuc2l0aW9uTWVzc2FnZXNbaV0uY29kZSA9PT0gXCI1MDNcIiAmJlxuXHRcdFx0YVRyYW5zaXRpb25NZXNzYWdlc1tpXS5tZXNzYWdlICE9PSBcIlwiICYmXG5cdFx0XHRhVHJhbnNpdGlvbk1lc3NhZ2VzW2ldLm1lc3NhZ2UuaW5kZXhPZihvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfTUVTU0FHRV9IQU5ETElOR19TQVBGRV81MDNfQkFDS0VORF9QUkVGSVhcIikpID09PSAtMVxuXHRcdCkge1xuXHRcdFx0YVRyYW5zaXRpb25NZXNzYWdlc1tpXS5tZXNzYWdlID1cblx0XHRcdFx0XCJcXG5cIiArIG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19NRVNTQUdFX0hBTkRMSU5HX1NBUEZFXzUwM19CQUNLRU5EX1BSRUZJWFwiKSArIGFUcmFuc2l0aW9uTWVzc2FnZXNbaV0ubWVzc2FnZTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIGFUcmFuc2l0aW9uTWVzc2FnZXM7XG59XG5mdW5jdGlvbiByZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMoYkJvdW5kTWVzc2FnZXM6IGFueSkge1xuXHRjb25zdCBhTWVzc2FnZXNUb0JlRGVsZXRlZCA9IGdldE1lc3NhZ2VzKGJCb3VuZE1lc3NhZ2VzLCB0cnVlKTtcblxuXHRpZiAoYU1lc3NhZ2VzVG9CZURlbGV0ZWQubGVuZ3RoID4gMCkge1xuXHRcdChzYXAudWkuZ2V0Q29yZSgpIGFzIGFueSkuZ2V0TWVzc2FnZU1hbmFnZXIoKS5yZW1vdmVNZXNzYWdlcyhhTWVzc2FnZXNUb0JlRGVsZXRlZCk7XG5cdH1cbn1cblxuLyoqXG4gKiBTdGF0aWMgZnVuY3Rpb25zIGZvciBGaW9yaSBNZXNzYWdlIEhhbmRsaW5nXG4gKlxuICogQG5hbWVzcGFjZVxuICogQGFsaWFzIHNhcC5mZS5jb3JlLmFjdGlvbnMubWVzc2FnZUhhbmRsaW5nXG4gKiBAcHJpdmF0ZVxuICogQGV4cGVyaW1lbnRhbCBUaGlzIG1vZHVsZSBpcyBvbmx5IGZvciBleHBlcmltZW50YWwgdXNlISA8YnIvPjxiPlRoaXMgaXMgb25seSBhIFBPQyBhbmQgbWF5YmUgZGVsZXRlZDwvYj5cbiAqIEBzaW5jZSAxLjU2LjBcbiAqL1xuY29uc3QgbWVzc2FnZUhhbmRsaW5nOiBtZXNzYWdlSGFuZGxpbmdUeXBlID0ge1xuXHRnZXRNZXNzYWdlczogZ2V0TWVzc2FnZXMsXG5cdHNob3dVbmJvdW5kTWVzc2FnZXM6IHNob3dVbmJvdW5kTWVzc2FnZXMsXG5cdHJlbW92ZVVuYm91bmRUcmFuc2l0aW9uTWVzc2FnZXM6IHJlbW92ZVVuYm91bmRUcmFuc2l0aW9uTWVzc2FnZXMsXG5cdHJlbW92ZUJvdW5kVHJhbnNpdGlvbk1lc3NhZ2VzOiByZW1vdmVCb3VuZFRyYW5zaXRpb25NZXNzYWdlcyxcblx0bW9kaWZ5RVRhZ01lc3NhZ2VzT25seTogZm5Nb2RpZnlFVGFnTWVzc2FnZXNPbmx5LFxuXHRnZXRSZXRyeUFmdGVyTWVzc2FnZTogZ2V0UmV0cnlBZnRlck1lc3NhZ2Vcbn07XG5cbmV4cG9ydCBkZWZhdWx0IG1lc3NhZ2VIYW5kbGluZztcbiJdfQ==