@sapui5/sap.fe.templates 1.100.0 → 1.101.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 (132) hide show
  1. package/package.json +4 -5
  2. package/src/sap/fe/templates/.library +1 -2
  3. package/src/sap/fe/templates/AnalyticalListPage/Component.js +24 -12
  4. package/src/sap/fe/templates/AnalyticalListPage/Component.ts +6 -0
  5. package/src/sap/fe/templates/AnalyticalListPage/chart/FEChartDelegate.js +30 -32
  6. package/src/sap/fe/templates/AnalyticalListPage/chart/FEChartDelegate.ts +25 -0
  7. package/src/sap/fe/templates/Feedback.js +80 -0
  8. package/src/sap/fe/templates/Feedback.ts +67 -0
  9. package/src/sap/fe/templates/ListComponent.js +156 -118
  10. package/src/sap/fe/templates/ListComponent.ts +105 -0
  11. package/src/sap/fe/templates/ListReport/Component.js +82 -53
  12. package/src/sap/fe/templates/ListReport/Component.ts +39 -0
  13. package/src/sap/fe/templates/ListReport/ExtensionAPI.js +123 -112
  14. package/src/sap/fe/templates/ListReport/ExtensionAPI.ts +100 -0
  15. package/src/sap/fe/templates/ListReport/ListReport.view.xml +2 -1
  16. package/src/sap/fe/templates/ListReport/ListReportController.controller.js +1111 -1081
  17. package/src/sap/fe/templates/ListReport/ListReportController.controller.ts +1009 -0
  18. package/src/sap/fe/templates/ListReport/overrides/IntentBasedNavigation.js +54 -53
  19. package/src/sap/fe/templates/ListReport/overrides/IntentBasedNavigation.ts +55 -0
  20. package/src/sap/fe/templates/ListReport/overrides/Share.js +134 -137
  21. package/src/sap/fe/templates/ListReport/overrides/Share.ts +134 -0
  22. package/src/sap/fe/templates/ListReport/overrides/ViewState.js +443 -428
  23. package/src/sap/fe/templates/ListReport/overrides/ViewState.ts +413 -0
  24. package/src/sap/fe/templates/ListReport/view/fragments/CollectionVisualization.fragment.xml +25 -25
  25. package/src/sap/fe/templates/ListReport/view/fragments/MultipleMode.fragment.js +72 -0
  26. package/src/sap/fe/templates/ListReport/view/fragments/MultipleMode.fragment.ts +62 -0
  27. package/src/sap/fe/templates/ListReport/view/fragments/{MultipleMode.fragment.xml → MultipleModeOld.fragment.xml} +24 -23
  28. package/src/sap/fe/templates/ObjectPage/AnnotationHelper.js +478 -514
  29. package/src/sap/fe/templates/ObjectPage/AnnotationHelper.ts +511 -0
  30. package/src/sap/fe/templates/ObjectPage/Component.js +169 -138
  31. package/src/sap/fe/templates/ObjectPage/Component.ts +131 -0
  32. package/src/sap/fe/templates/ObjectPage/ExtensionAPI.js +140 -142
  33. package/src/sap/fe/templates/ObjectPage/ExtensionAPI.ts +116 -0
  34. package/src/sap/fe/templates/ObjectPage/ObjectPage.view.xml +3 -9
  35. package/src/sap/fe/templates/ObjectPage/ObjectPageController.controller.js +1530 -1447
  36. package/src/sap/fe/templates/ObjectPage/ObjectPageController.controller.ts +1442 -0
  37. package/src/sap/fe/templates/ObjectPage/controls/StashableHBox.js +136 -101
  38. package/src/sap/fe/templates/ObjectPage/controls/StashableHBox.ts +84 -0
  39. package/src/sap/fe/templates/ObjectPage/controls/StashableVBox.js +24 -21
  40. package/src/sap/fe/templates/ObjectPage/controls/StashableVBox.ts +10 -0
  41. package/src/sap/fe/templates/ObjectPage/controls/SubSectionBlock.js +98 -53
  42. package/src/sap/fe/templates/ObjectPage/controls/SubSectionBlock.ts +50 -0
  43. package/src/sap/fe/templates/ObjectPage/designtime/FlexBox.designtime.js +20 -19
  44. package/src/sap/fe/templates/ObjectPage/designtime/FlexBox.designtime.ts +15 -0
  45. package/src/sap/fe/templates/ObjectPage/designtime/StashableHBox.designtime.js +50 -47
  46. package/src/sap/fe/templates/ObjectPage/designtime/StashableHBox.designtime.ts +47 -0
  47. package/src/sap/fe/templates/ObjectPage/designtime/StashableVBox.designtime.js +34 -34
  48. package/src/sap/fe/templates/ObjectPage/designtime/StashableVBox.designtime.ts +34 -0
  49. package/src/sap/fe/templates/ObjectPage/flexibility/StashableHBox.flexibility.js +15 -15
  50. package/src/sap/fe/templates/ObjectPage/flexibility/StashableHBox.flexibility.ts +13 -0
  51. package/src/sap/fe/templates/ObjectPage/flexibility/StashableVBox.flexibility.js +11 -11
  52. package/src/sap/fe/templates/ObjectPage/flexibility/StashableVBox.flexibility.ts +7 -0
  53. package/src/sap/fe/templates/ObjectPage/overrides/IntentBasedNavigation.js +55 -52
  54. package/src/sap/fe/templates/ObjectPage/overrides/IntentBasedNavigation.ts +57 -0
  55. package/src/sap/fe/templates/ObjectPage/overrides/InternalRouting.js +15 -17
  56. package/src/sap/fe/templates/ObjectPage/overrides/InternalRouting.ts +13 -0
  57. package/src/sap/fe/templates/ObjectPage/overrides/MessageHandler.js +13 -17
  58. package/src/sap/fe/templates/ObjectPage/overrides/MessageHandler.ts +14 -0
  59. package/src/sap/fe/templates/ObjectPage/overrides/Paginator.js +23 -21
  60. package/src/sap/fe/templates/ObjectPage/overrides/Paginator.ts +21 -0
  61. package/src/sap/fe/templates/ObjectPage/overrides/Share.js +310 -317
  62. package/src/sap/fe/templates/ObjectPage/overrides/Share.ts +316 -0
  63. package/src/sap/fe/templates/ObjectPage/overrides/ViewState.js +66 -57
  64. package/src/sap/fe/templates/ObjectPage/overrides/ViewState.ts +65 -0
  65. package/src/sap/fe/templates/ObjectPage/templating/ObjectPageTemplating.js +1 -1
  66. package/src/sap/fe/templates/ObjectPage/templating/ObjectPageTemplating.ts +1 -1
  67. package/src/sap/fe/templates/ObjectPage/view/fragments/Actions.fragment.xml +18 -24
  68. package/src/sap/fe/templates/ObjectPage/view/fragments/CollaborationDraft.fragment.xml +11 -9
  69. package/src/sap/fe/templates/ObjectPage/view/fragments/FooterContent.fragment.xml +4 -4
  70. package/src/sap/fe/templates/ObjectPage/view/fragments/SwitchDraftAndActiveObjectPopOver.fragment.xml +27 -0
  71. package/src/sap/fe/templates/RootContainer/controller/Fcl.controller.js +851 -817
  72. package/src/sap/fe/templates/RootContainer/controller/Fcl.controller.ts +795 -0
  73. package/src/sap/fe/templates/RootContainer/controller/NavContainer.controller.js +205 -189
  74. package/src/sap/fe/templates/RootContainer/controller/NavContainer.controller.ts +178 -0
  75. package/src/sap/fe/templates/RootContainer/controller/RootContainerBaseController.js +484 -459
  76. package/src/sap/fe/templates/RootContainer/controller/RootContainerBaseController.ts +438 -0
  77. package/src/sap/fe/templates/RootContainer/overrides/EditFlow.js +16 -14
  78. package/src/sap/fe/templates/RootContainer/overrides/EditFlow.ts +20 -0
  79. package/src/sap/fe/templates/TableScroller.js +45 -53
  80. package/src/sap/fe/templates/TableScroller.ts +48 -0
  81. package/src/sap/fe/templates/controls/Chart.fragment.xml +18 -17
  82. package/src/sap/fe/templates/controls/MacroChart.fragment.xml +22 -0
  83. package/src/sap/fe/templates/library.js +49 -63
  84. package/src/sap/fe/templates/library.ts +57 -0
  85. package/src/sap/fe/templates/messagebundle.properties +19 -7
  86. package/src/sap/fe/templates/messagebundle_ar.properties +6 -2
  87. package/src/sap/fe/templates/messagebundle_bg.properties +6 -2
  88. package/src/sap/fe/templates/messagebundle_ca.properties +6 -2
  89. package/src/sap/fe/templates/messagebundle_cs.properties +6 -2
  90. package/src/sap/fe/templates/messagebundle_cy.properties +6 -2
  91. package/src/sap/fe/templates/messagebundle_da.properties +6 -2
  92. package/src/sap/fe/templates/messagebundle_de.properties +6 -2
  93. package/src/sap/fe/templates/messagebundle_el.properties +6 -2
  94. package/src/sap/fe/templates/messagebundle_en.properties +6 -2
  95. package/src/sap/fe/templates/messagebundle_en_GB.properties +6 -2
  96. package/src/sap/fe/templates/messagebundle_en_US_saprigi.properties +6 -2
  97. package/src/sap/fe/templates/messagebundle_en_US_saptrc.properties +6 -2
  98. package/src/sap/fe/templates/messagebundle_es.properties +6 -2
  99. package/src/sap/fe/templates/messagebundle_es_MX.properties +6 -2
  100. package/src/sap/fe/templates/messagebundle_et.properties +6 -2
  101. package/src/sap/fe/templates/messagebundle_fi.properties +6 -2
  102. package/src/sap/fe/templates/messagebundle_fr.properties +6 -2
  103. package/src/sap/fe/templates/messagebundle_fr_CA.properties +6 -2
  104. package/src/sap/fe/templates/messagebundle_hi.properties +6 -2
  105. package/src/sap/fe/templates/messagebundle_hr.properties +6 -2
  106. package/src/sap/fe/templates/messagebundle_hu.properties +6 -2
  107. package/src/sap/fe/templates/messagebundle_id.properties +6 -2
  108. package/src/sap/fe/templates/messagebundle_it.properties +6 -2
  109. package/src/sap/fe/templates/messagebundle_iw.properties +6 -2
  110. package/src/sap/fe/templates/messagebundle_ja.properties +6 -2
  111. package/src/sap/fe/templates/messagebundle_kk.properties +6 -2
  112. package/src/sap/fe/templates/messagebundle_ko.properties +6 -2
  113. package/src/sap/fe/templates/messagebundle_lt.properties +6 -2
  114. package/src/sap/fe/templates/messagebundle_lv.properties +6 -2
  115. package/src/sap/fe/templates/messagebundle_ms.properties +6 -2
  116. package/src/sap/fe/templates/messagebundle_nl.properties +6 -2
  117. package/src/sap/fe/templates/messagebundle_no.properties +6 -2
  118. package/src/sap/fe/templates/messagebundle_pl.properties +6 -2
  119. package/src/sap/fe/templates/messagebundle_pt.properties +6 -2
  120. package/src/sap/fe/templates/messagebundle_pt_PT.properties +6 -2
  121. package/src/sap/fe/templates/messagebundle_ro.properties +6 -2
  122. package/src/sap/fe/templates/messagebundle_ru.properties +6 -2
  123. package/src/sap/fe/templates/messagebundle_sh.properties +6 -2
  124. package/src/sap/fe/templates/messagebundle_sk.properties +6 -2
  125. package/src/sap/fe/templates/messagebundle_sl.properties +6 -2
  126. package/src/sap/fe/templates/messagebundle_sv.properties +6 -2
  127. package/src/sap/fe/templates/messagebundle_th.properties +6 -2
  128. package/src/sap/fe/templates/messagebundle_tr.properties +6 -2
  129. package/src/sap/fe/templates/messagebundle_uk.properties +6 -2
  130. package/src/sap/fe/templates/messagebundle_vi.properties +6 -2
  131. package/src/sap/fe/templates/messagebundle_zh_CN.properties +6 -2
  132. package/src/sap/fe/templates/messagebundle_zh_TW.properties +6 -2
@@ -1,518 +1,482 @@
1
1
  /*!
2
2
  * SAP UI development toolkit for HTML5 (SAPUI5)
3
- (c) Copyright 2009-2021 SAP SE. All rights reserved
4
-
3
+ * (c) Copyright 2009-2021 SAP SE. All rights reserved
5
4
  */
5
+ sap.ui.define(["sap/fe/macros/CommonHelper", "sap/ui/base/ManagedObject", "sap/ui/model/odata/v4/AnnotationHelper"], function (CommonHelper, ManagedObject, ODataModelAnnotationHelper) {
6
+ "use strict";
6
7
 
7
- sap.ui.define(
8
- ["sap/ui/model/odata/v4/AnnotationHelper", "sap/ui/base/ManagedObject", "sap/fe/macros/CommonHelper"],
9
- function(ODataModelAnnotationHelper, ManagedObject, CommonHelper) {
10
- "use strict";
11
-
12
- /*
13
- This class contains annotation helpers that might be used from several templates or controls
14
- */
15
-
16
- var AnnotationHelper = {
17
- getElementBinding: function(sPath) {
18
- var sNavigationPath = ODataModelAnnotationHelper.getNavigationPath(sPath);
19
- if (sNavigationPath) {
20
- return "{path:'" + sNavigationPath + "'}";
21
- } else {
22
- //no navigation property needs empty object
23
- return "{path: ''}";
24
- }
25
- },
26
-
27
- /**
28
- * Function to check if draft pattern is supported.
29
- *
30
- * @param {object} oAnnotations Annotations of the current entity set.
31
- * @returns {string} Returns the Boolean value based on draft state
32
- */
33
- checkDraftState: function(oAnnotations) {
34
- if (
35
- oAnnotations["@com.sap.vocabularies.Common.v1.DraftRoot"] &&
36
- oAnnotations["@com.sap.vocabularies.Common.v1.DraftRoot"]["EditAction"]
37
- ) {
38
- return true;
39
- } else {
40
- return false;
41
- }
42
- },
43
-
44
- /**
45
- * Function to get the visibility for the SwitchToActive button in the object page or subobject page.
46
- *
47
- * @param {object} oAnnotations Annotations of the current entity set.
48
- * @returns {string} Returns expression binding or Boolean value based on the draft state
49
- */
50
- getSwitchToActiveVisibility: function(oAnnotations) {
51
- if (this.checkDraftState(oAnnotations)) {
52
- return "{= (%{DraftAdministrativeData/DraftIsCreatedByMe}) ? ( (${ui>/editMode} === 'Editable') && !${ui>createMode} && %{DraftAdministrativeData/DraftIsCreatedByMe} ) : false }";
53
- } else {
54
- return false;
55
- }
56
- },
57
-
58
- /**
59
- * Function to get the visibility for the SwitchToDraft button in the object page or subobject page.
60
- *
61
- * @param {object} oAnnotations Annotations of the current entity set.
62
- * @returns {string} Returns expression binding or Boolean value based on the draft state
63
- */
64
- getSwitchToDraftVisibility: function(oAnnotations) {
65
- if (this.checkDraftState(oAnnotations)) {
66
- return "{= (%{DraftAdministrativeData/DraftIsCreatedByMe}) ? ( !(${ui>/editMode} === 'Editable') && !${ui>createMode} && ${HasDraftEntity} && %{DraftAdministrativeData/DraftIsCreatedByMe} ) : false }";
67
- } else {
68
- return false;
69
- }
70
- },
71
-
72
- /**
73
- * Function to find an action from the array of header actions in the converter context.
74
- *
75
- * @param {object[]} aConverterContextHeaderActions Array of 'header' actions on the object page.
76
- * @param {string} sActionType The action type
77
- * @returns {object | undefined} The action with the matching action type
78
- * @private
79
- */
80
- _findAction: function(aConverterContextHeaderActions, sActionType) {
81
- var oAction;
82
- if (aConverterContextHeaderActions && aConverterContextHeaderActions.length) {
83
- oAction = aConverterContextHeaderActions.find(function(oHeaderAction) {
84
- return oHeaderAction.type === sActionType;
85
- });
86
- }
87
- return oAction;
88
- },
89
-
90
- /**
91
- * Function to format the 'enabled' property for the Delete button on the object page or subobject page in case of a Command Execution.
92
- *
93
- * @param {Array} aConverterContextHeaderActions Array of header actions on the object page
94
- * @returns {string} Returns expression binding or Boolean value from the converter output
95
- */
96
- getDeleteCommandExecutionEnabled: function(aConverterContextHeaderActions) {
97
- var oDeleteAction = AnnotationHelper._findAction(aConverterContextHeaderActions, "Secondary");
98
- return oDeleteAction ? oDeleteAction.enabled : "true";
99
- },
100
- /**
101
- * Function to format the 'visible' property for the Delete button on the object page or subobject page in case of a Command Execution.
102
- *
103
- * @param {Array} aConverterContextHeaderActions Array of header actions on the object page
104
- * @returns {string} Returns expression binding or Boolean value from the converter output
105
- */
106
- getDeleteCommandExecutionVisible: function(aConverterContextHeaderActions) {
107
- var oDeleteAction = AnnotationHelper._findAction(aConverterContextHeaderActions, "Secondary");
108
- return oDeleteAction ? oDeleteAction.visible : "true";
109
- },
110
- /**
111
- * Function to format the 'visible' property for the Edit button on the object page or subobject page in case of a Command Execution.
112
- *
113
- * @param {Array} aConverterContextHeaderActions Array of header actions on the object page
114
- * @returns {string} Returns expression binding or Boolean value from the converter output
115
- */
116
- getEditCommandExecutionVisible: function(aConverterContextHeaderActions) {
117
- var oEditAction = AnnotationHelper._findAction(aConverterContextHeaderActions, "Primary");
118
- return oEditAction ? oEditAction.visible : "true";
119
- },
120
- /**
121
- * Function to format the 'enabled' property for the Edit button on the object page or subobject page in case of a Command Execution.
122
- *
123
- * @param {Array} aConverterContextHeaderActions Array of header actions on the object page
124
- * @returns {string} Returns expression binding or Boolean value from the converter output
125
- */
126
- getEditCommandExecutionEnabled: function(aConverterContextHeaderActions) {
127
- var oEditAction = AnnotationHelper._findAction(aConverterContextHeaderActions, "Primary");
128
- return oEditAction ? oEditAction.enabled : "true";
129
- },
130
- /**
131
- * Function to get the EditAction from the Entityset based on Draft or sticky based application.
132
- *
133
- * @param {object} [oEntitySet] The value from the expression.
134
- * @returns {string} Returns expression binding or boolean value based on vRawValue & oDraftNode
135
- */
136
- getEditAction: function(oEntitySet) {
137
- var sPath = oEntitySet.getPath(),
138
- oAnnotations = oEntitySet.getObject(sPath + "@");
139
- var bDraftRoot = oAnnotations.hasOwnProperty("@com.sap.vocabularies.Common.v1.DraftRoot");
140
- var bStickySession = oAnnotations.hasOwnProperty("@com.sap.vocabularies.Session.v1.StickySessionSupported");
141
- var sActionName;
142
- if (bDraftRoot) {
143
- sActionName = oEntitySet.getObject(sPath + "@com.sap.vocabularies.Common.v1.DraftRoot/EditAction");
144
- } else if (bStickySession) {
145
- sActionName = oEntitySet.getObject(sPath + "@com.sap.vocabularies.Session.v1.StickySessionSupported/EditAction");
146
- }
147
- return !sActionName ? sActionName : sPath + "/" + sActionName;
148
- },
149
- isReadOnlyFromStaticAnnotations: function(oAnnotations, oFieldControl) {
150
- var bComputed, bImmutable, bReadOnly;
151
- if (oAnnotations["@Org.OData.Core.V1.Computed"]) {
152
- bComputed = oAnnotations["@Org.OData.Core.V1.Computed"].Bool
153
- ? oAnnotations["@Org.OData.Core.V1.Computed"].Bool == "true"
154
- : true;
155
- }
156
- if (oAnnotations["@Org.OData.Core.V1.Immutable"]) {
157
- bImmutable = oAnnotations["@Org.OData.Core.V1.Immutable"].Bool
158
- ? oAnnotations["@Org.OData.Core.V1.Immutable"].Bool == "true"
159
- : true;
160
- }
161
- bReadOnly = bComputed || bImmutable;
162
-
163
- if (oFieldControl) {
164
- bReadOnly = bReadOnly || oFieldControl == "com.sap.vocabularies.Common.v1.FieldControlType/ReadOnly";
165
- }
166
- if (bReadOnly) {
167
- return true;
168
- } else {
169
- return false;
170
- }
171
- },
172
- readOnlyExpressionFromDynamicAnnotations: function(oFieldControl) {
173
- var sIsFieldControlPathReadOnly;
174
- if (oFieldControl) {
175
- if (ManagedObject.bindingParser(oFieldControl)) {
176
- sIsFieldControlPathReadOnly = "%" + oFieldControl + " === 1 ";
177
- }
178
- }
179
- if (sIsFieldControlPathReadOnly) {
180
- return "{= " + sIsFieldControlPathReadOnly + "? false : true }";
181
- } else {
182
- return;
183
- }
184
- },
185
- /*
186
- * Function to get the expression for chart Title Press
187
- *
188
- * @function
189
- * @param {oConfiguration} [oConfigurations] control configuration from manifest
190
- * @param {oManifest} [oManifest] Outbounds from manifest
191
- * returns {String} [sCollectionName] Collection Name of the Micro Chart
192
- *
193
- * returns {String} [Expression] Handler Expression for the title press
194
- *
195
- */
196
- getExpressionForMicroChartTitlePress: function(oConfiguration, oManifestOutbound, sCollectionName) {
197
- if (oConfiguration) {
198
- if (
199
- (oConfiguration["targetOutbound"] && oConfiguration["targetOutbound"]["outbound"]) ||
200
- (oConfiguration["targetOutbound"] &&
201
- oConfiguration["targetOutbound"]["outbound"] &&
202
- oConfiguration["targetSections"])
203
- ) {
204
- return (
205
- ".handlers.onDataPointTitlePressed($controller, ${$source>/},'" +
206
- JSON.stringify(oManifestOutbound) +
207
- "','" +
208
- oConfiguration["targetOutbound"]["outbound"] +
209
- "','" +
210
- sCollectionName +
211
- "' )"
212
- );
213
- } else if (oConfiguration["targetSections"]) {
214
- return ".handlers.navigateToSubSection($controller, '" + JSON.stringify(oConfiguration["targetSections"]) + "')";
215
- } else {
216
- return undefined;
217
- }
218
- }
219
- },
220
- /*
221
- * Function to render Chart Title as Link
222
- *
223
- * @function
224
- * @param {oControlConfiguration} [oConfigurations] control configuration from manifest
225
- * returns {String} [sKey] For the TargetOutbound and TargetSection
226
- *
227
- */
228
- getMicroChartTitleAsLink: function(oControlConfiguration) {
229
- if (
230
- oControlConfiguration &&
231
- (oControlConfiguration["targetOutbound"] ||
232
- (oControlConfiguration["targetOutbound"] && oControlConfiguration["targetSections"]))
233
- ) {
234
- return "External";
235
- } else if (oControlConfiguration && oControlConfiguration["targetSections"]) {
236
- return "InPage";
237
- } else {
238
- return "None";
239
- }
240
- },
241
-
242
- /* Get groupId from control configuration
243
- *
244
- * @function
245
- * @param {Object} [oConfigurations] control configuration from manifest
246
- * @param {String} [sAnnotationPath] Annotation Path for the configuration
247
- * @description Used to get the groupId for DataPoints and MicroCharts in the Header.
248
- *
249
- */
250
- getGroupIdFromConfig: function(oConfigurations, sAnnotationPath, sDefaultGroupId) {
251
- var oConfiguration = oConfigurations[sAnnotationPath],
252
- aAutoPatterns = ["Heroes", "Decoration", "Workers", "LongRunners"],
253
- sGroupId = sDefaultGroupId;
254
- if (
255
- oConfiguration &&
256
- oConfiguration.requestGroupId &&
257
- aAutoPatterns.some(function(autoPattern) {
258
- return autoPattern === oConfiguration.requestGroupId;
259
- })
260
- ) {
261
- sGroupId = "$auto." + oConfiguration.requestGroupId;
262
- }
263
- return sGroupId;
264
- },
265
-
266
- /*
267
- * Get Context Binding with groupId from control configuration
268
- *
269
- * @function
270
- * @param {Object} [oConfigurations] control configuration from manifest
271
- * @param {String} [sKey] Annotation Path for of the configuration
272
- * @description Used to get the binding for DataPoints in the Header.
273
- *
274
- */
275
- getBindingWithGroupIdFromConfig: function(oConfigurations, sKey) {
276
- var sGroupId = AnnotationHelper.getGroupIdFromConfig(oConfigurations, sKey),
277
- sBinding;
278
- if (sGroupId) {
279
- sBinding = "{ path : '', parameters : { $$groupId : '" + sGroupId + "' } }";
280
- }
281
- return sBinding;
282
- },
283
- /**
284
- * Method to check whether a FieldGroup consists of only 1 DataField with MultiLine Text annotation.
285
- *
286
- * @param {DataFieldAbstractTypes[]} aFormElements A collection of form elements used in the current field group
287
- * @returns {boolean} Returns true if only 1 data field with Multiline Text annotation exists.
288
- */
289
- doesFieldGroupContainOnlyOneMultiLineDataField: function(aFormElements) {
290
- return aFormElements && aFormElements.length === 1 && !!aFormElements[0].isValueMultilineText;
291
- },
292
- /*
293
- * Get Visiblity of breadcrumbs.
294
- *
295
- * @function
296
- * @param {Object} [oViewData] ViewData model
297
- * returns {*} Expression or boolean
298
- */
299
- getVisibleExpressionForBreadcrumbs: function(oViewData) {
300
- return oViewData.showBreadCrumbs && oViewData.fclEnabled !== undefined
301
- ? "{fclhelper>/breadCrumbIsVisible}"
302
- : oViewData.showBreadCrumbs;
303
- },
304
- getShareButtonVisibility: function(viewData) {
305
- var sShareButtonVisibilityExp = "!${ui>createMode}";
306
- if (viewData.fclEnabled) {
307
- sShareButtonVisibilityExp = "${fclhelper>/showShareIcon} && " + sShareButtonVisibilityExp;
308
- }
309
- return "{= " + sShareButtonVisibilityExp + " }";
310
- },
311
-
312
- /*
313
- * Get visiblity for editable header facet.
314
- *
315
- * If either the title or description field from the header annotations are editable, then the
316
- * editable header facet is visible.
317
- *
318
- * @function
319
- * @param {object} [oAnnotations] Annotations object for given entity set
320
- * @param {object} [oFieldControl] field control
321
- * returns {*} binding expression or boolean value resolved form funcitons isReadOnlyFromStaticAnnotations and isReadOnlyFromDynamicAnnotations
322
- */
323
- getVisiblityOfHeaderFacet: function(
324
- oTitleAnnotations,
325
- oDescriptionAnnotations,
326
- oFieldTitleFieldControl,
327
- oFieldDescriptionFieldControl
328
- ) {
329
- // Check Annotations for Title Field
330
- var bIsTitleReadOnly = AnnotationHelper.isReadOnlyFromStaticAnnotations(oTitleAnnotations, oFieldTitleFieldControl);
331
- var titleExpression = AnnotationHelper.readOnlyExpressionFromDynamicAnnotations(oFieldTitleFieldControl);
332
- // There is no expression and the title is not ready only, this is sufficient for an editable header
333
- if (!bIsTitleReadOnly && !titleExpression) {
334
- return true;
335
- }
336
-
337
- // Check Annotations for Description Field
338
- var bIsDescriptionReadOnly = AnnotationHelper.isReadOnlyFromStaticAnnotations(
339
- oDescriptionAnnotations,
340
- oFieldDescriptionFieldControl
341
- );
342
- var descriptionExpression = AnnotationHelper.readOnlyExpressionFromDynamicAnnotations(oFieldDescriptionFieldControl);
343
- // There is no expression and the description is not ready only, this is sufficient for an editable header
344
- if (!bIsDescriptionReadOnly && !descriptionExpression) {
345
- return true;
346
- }
347
-
348
- // Both title and description are not editable and there are no dynamic annotations
349
- if (bIsTitleReadOnly && bIsDescriptionReadOnly && !titleExpression && !descriptionExpression) {
350
- return false;
351
- }
352
-
353
- // Now combine expressions
354
- if (titleExpression && !descriptionExpression) {
355
- return titleExpression;
356
- } else if (!titleExpression && descriptionExpression) {
357
- return descriptionExpression;
358
- } else {
359
- return AnnotationHelper.combineTitleAndDescriptionExpression(oFieldTitleFieldControl, oFieldDescriptionFieldControl);
360
- }
361
- },
362
- combineTitleAndDescriptionExpression: function(oTitleFieldControl, oDescriptionFieldControl) {
363
- // If both header and title field are based on dynmaic field control, the editable header
364
- // is visible if at least one of these is not ready only
365
- return "{= %" + oTitleFieldControl + " === 1 ? ( %" + oDescriptionFieldControl + " === 1 ? false : true ) : true }";
366
- },
367
- /*
368
- * Get Expression of press event of delete button.
369
- *
370
- * @function
371
- * @param {string} [sEntitySetName] Entity set name
372
- * returns {string} binding expression / function string generated from commanhelper's function generateFunction
373
- */
374
- getPressExpressionForDelete: function(sEntitySetName) {
375
- var sDeletableContexts = "${$view>/getBindingContext}",
376
- sTitle = "${$view>/#fe::ObjectPage/getHeaderTitle/getExpandedHeading/getItems/1/getText}",
377
- sDescription = "${$view>/#fe::ObjectPage/getHeaderTitle/getExpandedContent/0/getItems/0/getText}";
378
- var oParams = {
379
- title: sTitle,
380
- entitySetName: CommonHelper.addSingleQuotes(sEntitySetName),
381
- description: sDescription
382
- };
383
- return CommonHelper.generateFunction(".editFlow.deleteDocument", sDeletableContexts, CommonHelper.objectToString(oParams));
384
- },
385
- /*
386
- * Get Expression of press event of Edit button.
387
- *
388
- * @function
389
- * @param {object} [oDataField] Data field object
390
- * @param {string} [sEntitySetName] Entity set name
391
- * @param {object} [oHeaderAction] Header action object
392
- * returns {string} binding expression / function string generated from commanhelper's function generateFunction
393
- */
394
- getPressExpressionForEdit: function(oDataField, sEntitySetName, oHeaderAction) {
395
- var sEditableContexts = CommonHelper.addSingleQuotes(oDataField && oDataField.Action),
396
- sDataFieldEnumMember = oDataField && oDataField.InvocationGrouping && oDataField.InvocationGrouping["$EnumMember"],
397
- sInvocationGroup =
398
- sDataFieldEnumMember === "com.sap.vocabularies.UI.v1.OperationGroupingType/ChangeSet" ? "ChangeSet" : "Isolated";
399
- var oParams = {
400
- contexts: "${$view>/getBindingContext}",
401
- entitySetName: CommonHelper.addSingleQuotes(sEntitySetName),
402
- invocationGrouping: CommonHelper.addSingleQuotes(sInvocationGroup),
403
- model: "${$source>/}.getModel()",
404
- label: CommonHelper.addSingleQuotes(oDataField && oDataField.Label, true),
405
- isNavigable: oHeaderAction && oHeaderAction.isNavigable,
406
- defaultValuesExtensionFunction:
407
- oHeaderAction && oHeaderAction.defaultValuesExtensionFunction
408
- ? "'" + oHeaderAction.defaultValuesExtensionFunction + "'"
409
- : undefined
410
- };
411
- return CommonHelper.generateFunction(
412
- ".handlers.onCallAction",
413
- "${$view>/}",
414
- sEditableContexts,
415
- CommonHelper.objectToString(oParams)
416
- );
417
- },
418
- /*
419
- * Method to get the expression for the 'press' event for footer annotation actions
420
- *
421
- * @function
422
- * @param {object} [oDataField] Data field object
423
- * @param {string} [sEntitySetName] Entity set name
424
- * @param {object} [oHeaderAction] Header action object
425
- * returns {string} Binding expression or function string that is generated from the Commonhelper's function generateFunction
426
- */
427
- getPressExpressionForFooterAnnotationAction: function(oDataField, sEntitySetName, oHeaderAction) {
428
- var sActionContexts = CommonHelper.addSingleQuotes(oDataField && oDataField.Action),
429
- sDataFieldEnumMember = oDataField && oDataField.InvocationGrouping && oDataField.InvocationGrouping["$EnumMember"],
430
- sInvocationGroup =
431
- sDataFieldEnumMember === "com.sap.vocabularies.UI.v1.OperationGroupingType/ChangeSet" ? "ChangeSet" : "Isolated";
432
- var oParams = {
433
- contexts: "${$view>/#fe::ObjectPage/}.getBindingContext()",
434
- entitySetName: CommonHelper.addSingleQuotes(sEntitySetName),
435
- invocationGrouping: CommonHelper.addSingleQuotes(sInvocationGroup),
436
- model: "${$source>/}.getModel()",
437
- label: CommonHelper.addSingleQuotes(oDataField && oDataField.Label, true),
438
- isNavigable: oHeaderAction && oHeaderAction.isNavigable,
439
- defaultValuesExtensionFunction:
440
- oHeaderAction && oHeaderAction.defaultValuesExtensionFunction
441
- ? "'" + oHeaderAction.defaultValuesExtensionFunction + "'"
442
- : undefined
443
- };
444
- return CommonHelper.generateFunction(
445
- ".handlers.onCallAction",
446
- "${$view>/}",
447
- sActionContexts,
448
- CommonHelper.objectToString(oParams)
449
- );
450
- },
451
- /*
452
- * Gets the binding of the container HBox for the header facet.
453
- *
454
- * @function
455
- * @param {object} [oControlConfiguration] The control configuration form of the viewData model
456
- * @param {object} [oHeaderFacet] The object of the header facet
457
- * returns {*} The binding expression from function getBindingWithGroupIdFromConfig or undefined.
458
- */
459
- getStashableHBoxBinding: function(oControlConfiguration, oHeaderFacet) {
460
- if (oHeaderFacet && oHeaderFacet.Facet && oHeaderFacet.Facet.targetAnnotationType === "DataPoint") {
461
- return AnnotationHelper.getBindingWithGroupIdFromConfig(
462
- oControlConfiguration,
463
- oHeaderFacet.Facet.targetAnnotationValue
464
- );
465
- }
466
- },
467
-
468
- /*
469
- * Gets the 'Press' event expression for the external and internal data point link.
470
- *
471
- * @function
472
- * @param {object} [oConfiguration] Control configuration from manifest
473
- * @param {object} [oManifestOutbound] Outbounds from manifest
474
- * returns {string} The runtime binding of the 'Press' event
475
- */
476
- getPressExpressionForLink: function(oConfiguration, oManifestOutbound) {
477
- if (oConfiguration) {
478
- if (oConfiguration["targetOutbound"] && oConfiguration["targetOutbound"]["outbound"]) {
479
- return (
480
- ".handlers.onDataPointTitlePressed($controller, ${$source>}, " +
481
- JSON.stringify(oManifestOutbound) +
482
- "," +
483
- JSON.stringify(oConfiguration["targetOutbound"]["outbound"]) +
484
- ")"
485
- );
486
- } else if (oConfiguration["targetSections"]) {
487
- return ".handlers.navigateToSubSection($controller, '" + JSON.stringify(oConfiguration["targetSections"]) + "')";
488
- } else {
489
- return undefined;
490
- }
491
- }
492
- },
493
- isSubSectionTitleVisible: function(sSubSectionvisible, sSubSectiontitle, sSubSectionshowTitle) {
494
- if (sSubSectionvisible.indexOf("{=") === 0) {
495
- // Dynamic expression
496
- var sExpressionResult = sSubSectionvisible.substring(
497
- sSubSectionvisible.indexOf("{=") + 2,
498
- sSubSectionvisible.lastIndexOf("}")
499
- );
500
- return (
501
- "{= (" +
502
- sExpressionResult +
503
- ") && ('" +
504
- sSubSectiontitle +
505
- "' !=='undefined') && (" +
506
- sSubSectionshowTitle +
507
- " ? true : false) }"
508
- );
509
- } else {
510
- return sSubSectionvisible && sSubSectiontitle !== "undefined" && (sSubSectionshowTitle ? "true" : "false");
511
- }
512
- }
513
- };
514
-
515
- return AnnotationHelper;
516
- },
517
- true
518
- );
8
+ /*
9
+ This class contains annotation helpers that might be used from several templates or controls
10
+ */
11
+ var AnnotationHelper = {
12
+ getElementBinding: function (sPath) {
13
+ var sNavigationPath = ODataModelAnnotationHelper.getNavigationPath(sPath);
14
+
15
+ if (sNavigationPath) {
16
+ return "{path:'" + sNavigationPath + "'}";
17
+ } else {
18
+ //no navigation property needs empty object
19
+ return "{path: ''}";
20
+ }
21
+ },
22
+
23
+ /**
24
+ * Function to check if draft pattern is supported.
25
+ *
26
+ * @param {object} oAnnotations Annotations of the current entity set.
27
+ * @returns {string} Returns the Boolean value based on draft state
28
+ */
29
+ checkDraftState: function (oAnnotations) {
30
+ if (oAnnotations["@com.sap.vocabularies.Common.v1.DraftRoot"] && oAnnotations["@com.sap.vocabularies.Common.v1.DraftRoot"]["EditAction"]) {
31
+ return true;
32
+ } else {
33
+ return false;
34
+ }
35
+ },
36
+
37
+ /**
38
+ * Function to get the visibility for the SwitchToActive button in the object page or subobject page.
39
+ *
40
+ * @param {object} oAnnotations Annotations of the current entity set.
41
+ * @returns {string} Returns expression binding or Boolean value based on the draft state
42
+ */
43
+ getSwitchToActiveVisibility: function (oAnnotations) {
44
+ if (this.checkDraftState(oAnnotations)) {
45
+ return "{= (%{DraftAdministrativeData/DraftIsCreatedByMe}) ? ( ${ui>/isEditable} && !${ui>createMode} && %{DraftAdministrativeData/DraftIsCreatedByMe} ) : false }";
46
+ } else {
47
+ return false;
48
+ }
49
+ },
50
+
51
+ /**
52
+ * Function to get the visibility for the SwitchToDraft button in the object page or subobject page.
53
+ *
54
+ * @param {object} oAnnotations Annotations of the current entity set.
55
+ * @returns {string} Returns expression binding or Boolean value based on the draft state
56
+ */
57
+ getSwitchToDraftVisibility: function (oAnnotations) {
58
+ if (this.checkDraftState(oAnnotations)) {
59
+ return "{= (%{DraftAdministrativeData/DraftIsCreatedByMe}) ? ( !(${ui>/isEditable}) && !${ui>createMode} && ${HasDraftEntity} && %{DraftAdministrativeData/DraftIsCreatedByMe} ) : false }";
60
+ } else {
61
+ return false;
62
+ }
63
+ },
64
+
65
+ /**
66
+ * Function to get the visibility for the SwitchDraftAndActive button in the object page or subobject page.
67
+ *
68
+ * @param {object} oAnnotations Annotations of the current entity set.
69
+ * @returns {string} Returns expression binding or Boolean value based on the draft state
70
+ */
71
+ getSwitchDraftAndActiveVisibility: function (oAnnotations) {
72
+ if (this.checkDraftState(oAnnotations)) {
73
+ return "{= (%{DraftAdministrativeData/DraftIsCreatedByMe}) ? ( !${ui>createMode} && %{DraftAdministrativeData/DraftIsCreatedByMe} ) : false }";
74
+ } else {
75
+ return false;
76
+ }
77
+ },
78
+
79
+ /**
80
+ * Function to find an action from the array of header actions in the converter context.
81
+ *
82
+ * @param {object[]} aConverterContextHeaderActions Array of 'header' actions on the object page.
83
+ * @param {string} sActionType The action type
84
+ * @returns {object | undefined} The action with the matching action type
85
+ * @private
86
+ */
87
+ _findAction: function (aConverterContextHeaderActions, sActionType) {
88
+ var oAction;
89
+
90
+ if (aConverterContextHeaderActions && aConverterContextHeaderActions.length) {
91
+ oAction = aConverterContextHeaderActions.find(function (oHeaderAction) {
92
+ return oHeaderAction.type === sActionType;
93
+ });
94
+ }
95
+
96
+ return oAction;
97
+ },
98
+
99
+ /**
100
+ * Function to format the 'enabled' property for the Delete button on the object page or subobject page in case of a Command Execution.
101
+ *
102
+ * @param {Array} aConverterContextHeaderActions Array of header actions on the object page
103
+ * @returns {string} Returns expression binding or Boolean value from the converter output
104
+ */
105
+ getDeleteCommandExecutionEnabled: function (aConverterContextHeaderActions) {
106
+ var oDeleteAction = AnnotationHelper._findAction(aConverterContextHeaderActions, "Secondary");
107
+
108
+ return oDeleteAction ? oDeleteAction.enabled : "true";
109
+ },
110
+
111
+ /**
112
+ * Function to format the 'visible' property for the Delete button on the object page or subobject page in case of a Command Execution.
113
+ *
114
+ * @param {Array} aConverterContextHeaderActions Array of header actions on the object page
115
+ * @returns {string} Returns expression binding or Boolean value from the converter output
116
+ */
117
+ getDeleteCommandExecutionVisible: function (aConverterContextHeaderActions) {
118
+ var oDeleteAction = AnnotationHelper._findAction(aConverterContextHeaderActions, "Secondary");
119
+
120
+ return oDeleteAction ? oDeleteAction.visible : "true";
121
+ },
122
+
123
+ /**
124
+ * Function to format the 'visible' property for the Edit button on the object page or subobject page in case of a Command Execution.
125
+ *
126
+ * @param {Array} aConverterContextHeaderActions Array of header actions on the object page
127
+ * @returns {string} Returns expression binding or Boolean value from the converter output
128
+ */
129
+ getEditCommandExecutionVisible: function (aConverterContextHeaderActions) {
130
+ var oEditAction = AnnotationHelper._findAction(aConverterContextHeaderActions, "Primary");
131
+
132
+ return oEditAction ? oEditAction.visible : "true";
133
+ },
134
+
135
+ /**
136
+ * Function to format the 'enabled' property for the Edit button on the object page or subobject page in case of a Command Execution.
137
+ *
138
+ * @param {Array} aConverterContextHeaderActions Array of header actions on the object page
139
+ * @returns {string} Returns expression binding or Boolean value from the converter output
140
+ */
141
+ getEditCommandExecutionEnabled: function (aConverterContextHeaderActions) {
142
+ var oEditAction = AnnotationHelper._findAction(aConverterContextHeaderActions, "Primary");
143
+
144
+ return oEditAction ? oEditAction.enabled : "true";
145
+ },
146
+
147
+ /**
148
+ * Function to get the EditAction from the Entityset based on Draft or sticky based application.
149
+ *
150
+ * @param {object} [oEntitySet] The value from the expression.
151
+ * @returns {string} Returns expression binding or boolean value based on vRawValue & oDraftNode
152
+ */
153
+ getEditAction: function (oEntitySet) {
154
+ var sPath = oEntitySet.getPath(),
155
+ oAnnotations = oEntitySet.getObject(sPath + "@");
156
+ var bDraftRoot = oAnnotations.hasOwnProperty("@com.sap.vocabularies.Common.v1.DraftRoot");
157
+ var bStickySession = oAnnotations.hasOwnProperty("@com.sap.vocabularies.Session.v1.StickySessionSupported");
158
+ var sActionName;
159
+
160
+ if (bDraftRoot) {
161
+ sActionName = oEntitySet.getObject(sPath + "@com.sap.vocabularies.Common.v1.DraftRoot/EditAction");
162
+ } else if (bStickySession) {
163
+ sActionName = oEntitySet.getObject(sPath + "@com.sap.vocabularies.Session.v1.StickySessionSupported/EditAction");
164
+ }
165
+
166
+ return !sActionName ? sActionName : sPath + "/" + sActionName;
167
+ },
168
+ isReadOnlyFromStaticAnnotations: function (oAnnotations, oFieldControl) {
169
+ var bComputed, bImmutable, bReadOnly;
170
+
171
+ if (oAnnotations["@Org.OData.Core.V1.Computed"]) {
172
+ bComputed = oAnnotations["@Org.OData.Core.V1.Computed"].Bool ? oAnnotations["@Org.OData.Core.V1.Computed"].Bool == "true" : true;
173
+ }
174
+
175
+ if (oAnnotations["@Org.OData.Core.V1.Immutable"]) {
176
+ bImmutable = oAnnotations["@Org.OData.Core.V1.Immutable"].Bool ? oAnnotations["@Org.OData.Core.V1.Immutable"].Bool == "true" : true;
177
+ }
178
+
179
+ bReadOnly = bComputed || bImmutable;
180
+
181
+ if (oFieldControl) {
182
+ bReadOnly = bReadOnly || oFieldControl == "com.sap.vocabularies.Common.v1.FieldControlType/ReadOnly";
183
+ }
184
+
185
+ if (bReadOnly) {
186
+ return true;
187
+ } else {
188
+ return false;
189
+ }
190
+ },
191
+ readOnlyExpressionFromDynamicAnnotations: function (oFieldControl) {
192
+ var sIsFieldControlPathReadOnly;
193
+
194
+ if (oFieldControl) {
195
+ if (ManagedObject.bindingParser(oFieldControl)) {
196
+ sIsFieldControlPathReadOnly = "%" + oFieldControl + " === 1 ";
197
+ }
198
+ }
199
+
200
+ if (sIsFieldControlPathReadOnly) {
201
+ return "{= " + sIsFieldControlPathReadOnly + "? false : true }";
202
+ } else {
203
+ return;
204
+ }
205
+ },
206
+
207
+ /*
208
+ * Function to get the expression for chart Title Press
209
+ *
210
+ * @function
211
+ * @param {oConfiguration} [oConfigurations] control configuration from manifest
212
+ * @param {oManifest} [oManifest] Outbounds from manifest
213
+ * returns {String} [sCollectionName] Collection Name of the Micro Chart
214
+ *
215
+ * returns {String} [Expression] Handler Expression for the title press
216
+ *
217
+ */
218
+ getExpressionForMicroChartTitlePress: function (oConfiguration, oManifestOutbound, sCollectionName) {
219
+ if (oConfiguration) {
220
+ if (oConfiguration["targetOutbound"] && oConfiguration["targetOutbound"]["outbound"] || oConfiguration["targetOutbound"] && oConfiguration["targetOutbound"]["outbound"] && oConfiguration["targetSections"]) {
221
+ return ".handlers.onDataPointTitlePressed($controller, ${$source>/},'" + JSON.stringify(oManifestOutbound) + "','" + oConfiguration["targetOutbound"]["outbound"] + "','" + sCollectionName + "' )";
222
+ } else if (oConfiguration["targetSections"]) {
223
+ return ".handlers.navigateToSubSection($controller, '" + JSON.stringify(oConfiguration["targetSections"]) + "')";
224
+ } else {
225
+ return undefined;
226
+ }
227
+ }
228
+ },
229
+
230
+ /*
231
+ * Function to render Chart Title as Link
232
+ *
233
+ * @function
234
+ * @param {oControlConfiguration} [oConfigurations] control configuration from manifest
235
+ * returns {String} [sKey] For the TargetOutbound and TargetSection
236
+ *
237
+ */
238
+ getMicroChartTitleAsLink: function (oControlConfiguration) {
239
+ if (oControlConfiguration && (oControlConfiguration["targetOutbound"] || oControlConfiguration["targetOutbound"] && oControlConfiguration["targetSections"])) {
240
+ return "External";
241
+ } else if (oControlConfiguration && oControlConfiguration["targetSections"]) {
242
+ return "InPage";
243
+ } else {
244
+ return "None";
245
+ }
246
+ },
247
+
248
+ /* Get groupId from control configuration
249
+ *
250
+ * @function
251
+ * @param {Object} [oConfigurations] control configuration from manifest
252
+ * @param {String} [sAnnotationPath] Annotation Path for the configuration
253
+ * @description Used to get the groupId for DataPoints and MicroCharts in the Header.
254
+ *
255
+ */
256
+ getGroupIdFromConfig: function (oConfigurations, sAnnotationPath, sDefaultGroupId) {
257
+ var oConfiguration = oConfigurations[sAnnotationPath],
258
+ aAutoPatterns = ["Heroes", "Decoration", "Workers", "LongRunners"];
259
+ var sGroupId = sDefaultGroupId;
260
+
261
+ if (oConfiguration && oConfiguration.requestGroupId && aAutoPatterns.some(function (autoPattern) {
262
+ return autoPattern === oConfiguration.requestGroupId;
263
+ })) {
264
+ sGroupId = "$auto." + oConfiguration.requestGroupId;
265
+ }
266
+
267
+ return sGroupId;
268
+ },
269
+
270
+ /*
271
+ * Get Context Binding with groupId from control configuration
272
+ *
273
+ * @function
274
+ * @param {Object} [oConfigurations] control configuration from manifest
275
+ * @param {String} [sKey] Annotation Path for of the configuration
276
+ * @description Used to get the binding for DataPoints in the Header.
277
+ *
278
+ */
279
+ getBindingWithGroupIdFromConfig: function (oConfigurations, sKey) {
280
+ var sGroupId = AnnotationHelper.getGroupIdFromConfig(oConfigurations, sKey);
281
+ var sBinding;
282
+
283
+ if (sGroupId) {
284
+ sBinding = "{ path : '', parameters : { $$groupId : '" + sGroupId + "' } }";
285
+ }
286
+
287
+ return sBinding;
288
+ },
289
+
290
+ /**
291
+ * Method to check whether a FieldGroup consists of only 1 DataField with MultiLine Text annotation.
292
+ *
293
+ * @param {DataFieldAbstractTypes[]} aFormElements A collection of form elements used in the current field group
294
+ * @returns {boolean} Returns true if only 1 data field with Multiline Text annotation exists.
295
+ */
296
+ doesFieldGroupContainOnlyOneMultiLineDataField: function (aFormElements) {
297
+ return aFormElements && aFormElements.length === 1 && !!aFormElements[0].isValueMultilineText;
298
+ },
299
+
300
+ /*
301
+ * Get Visiblity of breadcrumbs.
302
+ *
303
+ * @function
304
+ * @param {Object} [oViewData] ViewData model
305
+ * returns {*} Expression or boolean
306
+ */
307
+ getVisibleExpressionForBreadcrumbs: function (oViewData) {
308
+ return oViewData.showBreadCrumbs && oViewData.fclEnabled !== undefined ? "{fclhelper>/breadCrumbIsVisible}" : oViewData.showBreadCrumbs;
309
+ },
310
+ getShareButtonVisibility: function (viewData) {
311
+ var sShareButtonVisibilityExp = "!${ui>createMode}";
312
+
313
+ if (viewData.fclEnabled) {
314
+ sShareButtonVisibilityExp = "${fclhelper>/showShareIcon} && " + sShareButtonVisibilityExp;
315
+ }
316
+
317
+ return "{= " + sShareButtonVisibilityExp + " }";
318
+ },
319
+
320
+ /*
321
+ * Get visiblity for editable header facet.
322
+ *
323
+ * If either the title or description field from the header annotations are editable, then the
324
+ * editable header facet is visible.
325
+ *
326
+ * @function
327
+ * @param {object} [oAnnotations] Annotations object for given entity set
328
+ * @param {object} [oFieldControl] field control
329
+ * returns {*} binding expression or boolean value resolved form funcitons isReadOnlyFromStaticAnnotations and isReadOnlyFromDynamicAnnotations
330
+ */
331
+ getVisiblityOfHeaderFacet: function (oTitleAnnotations, oDescriptionAnnotations, oFieldTitleFieldControl, oFieldDescriptionFieldControl) {
332
+ // Check Annotations for Title Field
333
+ var bIsTitleReadOnly = AnnotationHelper.isReadOnlyFromStaticAnnotations(oTitleAnnotations, oFieldTitleFieldControl);
334
+ var titleExpression = AnnotationHelper.readOnlyExpressionFromDynamicAnnotations(oFieldTitleFieldControl); // There is no expression and the title is not ready only, this is sufficient for an editable header
335
+
336
+ if (!bIsTitleReadOnly && !titleExpression) {
337
+ return true;
338
+ } // Check Annotations for Description Field
339
+
340
+
341
+ var bIsDescriptionReadOnly = AnnotationHelper.isReadOnlyFromStaticAnnotations(oDescriptionAnnotations, oFieldDescriptionFieldControl);
342
+ var descriptionExpression = AnnotationHelper.readOnlyExpressionFromDynamicAnnotations(oFieldDescriptionFieldControl); // There is no expression and the description is not ready only, this is sufficient for an editable header
343
+
344
+ if (!bIsDescriptionReadOnly && !descriptionExpression) {
345
+ return true;
346
+ } // Both title and description are not editable and there are no dynamic annotations
347
+
348
+
349
+ if (bIsTitleReadOnly && bIsDescriptionReadOnly && !titleExpression && !descriptionExpression) {
350
+ return false;
351
+ } // Now combine expressions
352
+
353
+
354
+ if (titleExpression && !descriptionExpression) {
355
+ return titleExpression;
356
+ } else if (!titleExpression && descriptionExpression) {
357
+ return descriptionExpression;
358
+ } else {
359
+ return AnnotationHelper.combineTitleAndDescriptionExpression(oFieldTitleFieldControl, oFieldDescriptionFieldControl);
360
+ }
361
+ },
362
+ combineTitleAndDescriptionExpression: function (oTitleFieldControl, oDescriptionFieldControl) {
363
+ // If both header and title field are based on dynmaic field control, the editable header
364
+ // is visible if at least one of these is not ready only
365
+ return "{= %" + oTitleFieldControl + " === 1 ? ( %" + oDescriptionFieldControl + " === 1 ? false : true ) : true }";
366
+ },
367
+
368
+ /*
369
+ * Get Expression of press event of delete button.
370
+ *
371
+ * @function
372
+ * @param {string} [sEntitySetName] Entity set name
373
+ * returns {string} binding expression / function string generated from commanhelper's function generateFunction
374
+ */
375
+ getPressExpressionForDelete: function (sEntitySetName) {
376
+ var sDeletableContexts = "${$view>/getBindingContext}",
377
+ sTitle = "${$view>/#fe::ObjectPage/getHeaderTitle/getExpandedHeading/getItems/1/getText}",
378
+ sDescription = "${$view>/#fe::ObjectPage/getHeaderTitle/getExpandedContent/0/getItems/0/getText}";
379
+ var oParams = {
380
+ title: sTitle,
381
+ entitySetName: CommonHelper.addSingleQuotes(sEntitySetName),
382
+ description: sDescription
383
+ };
384
+ return CommonHelper.generateFunction(".editFlow.deleteDocument", sDeletableContexts, CommonHelper.objectToString(oParams));
385
+ },
386
+
387
+ /*
388
+ * Get Expression of press event of Edit button.
389
+ *
390
+ * @function
391
+ * @param {object} [oDataField] Data field object
392
+ * @param {string} [sEntitySetName] Entity set name
393
+ * @param {object} [oHeaderAction] Header action object
394
+ * returns {string} binding expression / function string generated from commanhelper's function generateFunction
395
+ */
396
+ getPressExpressionForEdit: function (oDataField, sEntitySetName, oHeaderAction) {
397
+ var sEditableContexts = CommonHelper.addSingleQuotes(oDataField && oDataField.Action),
398
+ sDataFieldEnumMember = oDataField && oDataField.InvocationGrouping && oDataField.InvocationGrouping["$EnumMember"],
399
+ sInvocationGroup = sDataFieldEnumMember === "com.sap.vocabularies.UI.v1.OperationGroupingType/ChangeSet" ? "ChangeSet" : "Isolated";
400
+ var oParams = {
401
+ contexts: "${$view>/getBindingContext}",
402
+ entitySetName: CommonHelper.addSingleQuotes(sEntitySetName),
403
+ invocationGrouping: CommonHelper.addSingleQuotes(sInvocationGroup),
404
+ model: "${$source>/}.getModel()",
405
+ label: CommonHelper.addSingleQuotes(oDataField && oDataField.Label, true),
406
+ isNavigable: oHeaderAction && oHeaderAction.isNavigable,
407
+ defaultValuesExtensionFunction: oHeaderAction && oHeaderAction.defaultValuesExtensionFunction ? "'" + oHeaderAction.defaultValuesExtensionFunction + "'" : undefined
408
+ };
409
+ return CommonHelper.generateFunction(".handlers.onCallAction", "${$view>/}", sEditableContexts, CommonHelper.objectToString(oParams));
410
+ },
411
+
412
+ /*
413
+ * Method to get the expression for the 'press' event for footer annotation actions
414
+ *
415
+ * @function
416
+ * @param {object} [oDataField] Data field object
417
+ * @param {string} [sEntitySetName] Entity set name
418
+ * @param {object} [oHeaderAction] Header action object
419
+ * returns {string} Binding expression or function string that is generated from the Commonhelper's function generateFunction
420
+ */
421
+ getPressExpressionForFooterAnnotationAction: function (oDataField, sEntitySetName, oHeaderAction) {
422
+ var sActionContexts = CommonHelper.addSingleQuotes(oDataField && oDataField.Action),
423
+ sDataFieldEnumMember = oDataField && oDataField.InvocationGrouping && oDataField.InvocationGrouping["$EnumMember"],
424
+ sInvocationGroup = sDataFieldEnumMember === "com.sap.vocabularies.UI.v1.OperationGroupingType/ChangeSet" ? "ChangeSet" : "Isolated";
425
+ var oParams = {
426
+ contexts: "${$view>/#fe::ObjectPage/}.getBindingContext()",
427
+ entitySetName: CommonHelper.addSingleQuotes(sEntitySetName),
428
+ invocationGrouping: CommonHelper.addSingleQuotes(sInvocationGroup),
429
+ model: "${$source>/}.getModel()",
430
+ label: CommonHelper.addSingleQuotes(oDataField && oDataField.Label, true),
431
+ isNavigable: oHeaderAction && oHeaderAction.isNavigable,
432
+ defaultValuesExtensionFunction: oHeaderAction && oHeaderAction.defaultValuesExtensionFunction ? "'" + oHeaderAction.defaultValuesExtensionFunction + "'" : undefined
433
+ };
434
+ return CommonHelper.generateFunction(".handlers.onCallAction", "${$view>/}", sActionContexts, CommonHelper.objectToString(oParams));
435
+ },
436
+
437
+ /*
438
+ * Gets the binding of the container HBox for the header facet.
439
+ *
440
+ * @function
441
+ * @param {object} [oControlConfiguration] The control configuration form of the viewData model
442
+ * @param {object} [oHeaderFacet] The object of the header facet
443
+ * returns {*} The binding expression from function getBindingWithGroupIdFromConfig or undefined.
444
+ */
445
+ getStashableHBoxBinding: function (oControlConfiguration, oHeaderFacet) {
446
+ if (oHeaderFacet && oHeaderFacet.Facet && oHeaderFacet.Facet.targetAnnotationType === "DataPoint") {
447
+ return AnnotationHelper.getBindingWithGroupIdFromConfig(oControlConfiguration, oHeaderFacet.Facet.targetAnnotationValue);
448
+ }
449
+ },
450
+
451
+ /*
452
+ * Gets the 'Press' event expression for the external and internal data point link.
453
+ *
454
+ * @function
455
+ * @param {object} [oConfiguration] Control configuration from manifest
456
+ * @param {object} [oManifestOutbound] Outbounds from manifest
457
+ * returns {string} The runtime binding of the 'Press' event
458
+ */
459
+ getPressExpressionForLink: function (oConfiguration, oManifestOutbound) {
460
+ if (oConfiguration) {
461
+ if (oConfiguration["targetOutbound"] && oConfiguration["targetOutbound"]["outbound"]) {
462
+ return ".handlers.onDataPointTitlePressed($controller, ${$source>}, " + JSON.stringify(oManifestOutbound) + "," + JSON.stringify(oConfiguration["targetOutbound"]["outbound"]) + ")";
463
+ } else if (oConfiguration["targetSections"]) {
464
+ return ".handlers.navigateToSubSection($controller, '" + JSON.stringify(oConfiguration["targetSections"]) + "')";
465
+ } else {
466
+ return undefined;
467
+ }
468
+ }
469
+ },
470
+ isSubSectionTitleVisible: function (sSubSectionvisible, sSubSectiontitle, sSubSectionshowTitle) {
471
+ if (sSubSectionvisible.indexOf("{=") === 0) {
472
+ // Dynamic expression
473
+ var sExpressionResult = sSubSectionvisible.substring(sSubSectionvisible.indexOf("{=") + 2, sSubSectionvisible.lastIndexOf("}"));
474
+ return "{= (" + sExpressionResult + ") && ('" + sSubSectiontitle + "' !=='undefined') && (" + sSubSectionshowTitle + " ? true : false) }";
475
+ } else {
476
+ return sSubSectionvisible && sSubSectiontitle !== "undefined" && (sSubSectionshowTitle ? "true" : "false");
477
+ }
478
+ }
479
+ };
480
+ return AnnotationHelper;
481
+ }, false);
482
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkFubm90YXRpb25IZWxwZXIudHMiXSwibmFtZXMiOlsiQW5ub3RhdGlvbkhlbHBlciIsImdldEVsZW1lbnRCaW5kaW5nIiwic1BhdGgiLCJzTmF2aWdhdGlvblBhdGgiLCJPRGF0YU1vZGVsQW5ub3RhdGlvbkhlbHBlciIsImdldE5hdmlnYXRpb25QYXRoIiwiY2hlY2tEcmFmdFN0YXRlIiwib0Fubm90YXRpb25zIiwiZ2V0U3dpdGNoVG9BY3RpdmVWaXNpYmlsaXR5IiwiZ2V0U3dpdGNoVG9EcmFmdFZpc2liaWxpdHkiLCJnZXRTd2l0Y2hEcmFmdEFuZEFjdGl2ZVZpc2liaWxpdHkiLCJfZmluZEFjdGlvbiIsImFDb252ZXJ0ZXJDb250ZXh0SGVhZGVyQWN0aW9ucyIsInNBY3Rpb25UeXBlIiwib0FjdGlvbiIsImxlbmd0aCIsImZpbmQiLCJvSGVhZGVyQWN0aW9uIiwidHlwZSIsImdldERlbGV0ZUNvbW1hbmRFeGVjdXRpb25FbmFibGVkIiwib0RlbGV0ZUFjdGlvbiIsImVuYWJsZWQiLCJnZXREZWxldGVDb21tYW5kRXhlY3V0aW9uVmlzaWJsZSIsInZpc2libGUiLCJnZXRFZGl0Q29tbWFuZEV4ZWN1dGlvblZpc2libGUiLCJvRWRpdEFjdGlvbiIsImdldEVkaXRDb21tYW5kRXhlY3V0aW9uRW5hYmxlZCIsImdldEVkaXRBY3Rpb24iLCJvRW50aXR5U2V0IiwiZ2V0UGF0aCIsImdldE9iamVjdCIsImJEcmFmdFJvb3QiLCJoYXNPd25Qcm9wZXJ0eSIsImJTdGlja3lTZXNzaW9uIiwic0FjdGlvbk5hbWUiLCJpc1JlYWRPbmx5RnJvbVN0YXRpY0Fubm90YXRpb25zIiwib0ZpZWxkQ29udHJvbCIsImJDb21wdXRlZCIsImJJbW11dGFibGUiLCJiUmVhZE9ubHkiLCJCb29sIiwicmVhZE9ubHlFeHByZXNzaW9uRnJvbUR5bmFtaWNBbm5vdGF0aW9ucyIsInNJc0ZpZWxkQ29udHJvbFBhdGhSZWFkT25seSIsIk1hbmFnZWRPYmplY3QiLCJiaW5kaW5nUGFyc2VyIiwiZ2V0RXhwcmVzc2lvbkZvck1pY3JvQ2hhcnRUaXRsZVByZXNzIiwib0NvbmZpZ3VyYXRpb24iLCJvTWFuaWZlc3RPdXRib3VuZCIsInNDb2xsZWN0aW9uTmFtZSIsIkpTT04iLCJzdHJpbmdpZnkiLCJ1bmRlZmluZWQiLCJnZXRNaWNyb0NoYXJ0VGl0bGVBc0xpbmsiLCJvQ29udHJvbENvbmZpZ3VyYXRpb24iLCJnZXRHcm91cElkRnJvbUNvbmZpZyIsIm9Db25maWd1cmF0aW9ucyIsInNBbm5vdGF0aW9uUGF0aCIsInNEZWZhdWx0R3JvdXBJZCIsImFBdXRvUGF0dGVybnMiLCJzR3JvdXBJZCIsInJlcXVlc3RHcm91cElkIiwic29tZSIsImF1dG9QYXR0ZXJuIiwiZ2V0QmluZGluZ1dpdGhHcm91cElkRnJvbUNvbmZpZyIsInNLZXkiLCJzQmluZGluZyIsImRvZXNGaWVsZEdyb3VwQ29udGFpbk9ubHlPbmVNdWx0aUxpbmVEYXRhRmllbGQiLCJhRm9ybUVsZW1lbnRzIiwiaXNWYWx1ZU11bHRpbGluZVRleHQiLCJnZXRWaXNpYmxlRXhwcmVzc2lvbkZvckJyZWFkY3J1bWJzIiwib1ZpZXdEYXRhIiwic2hvd0JyZWFkQ3J1bWJzIiwiZmNsRW5hYmxlZCIsImdldFNoYXJlQnV0dG9uVmlzaWJpbGl0eSIsInZpZXdEYXRhIiwic1NoYXJlQnV0dG9uVmlzaWJpbGl0eUV4cCIsImdldFZpc2libGl0eU9mSGVhZGVyRmFjZXQiLCJvVGl0bGVBbm5vdGF0aW9ucyIsIm9EZXNjcmlwdGlvbkFubm90YXRpb25zIiwib0ZpZWxkVGl0bGVGaWVsZENvbnRyb2wiLCJvRmllbGREZXNjcmlwdGlvbkZpZWxkQ29udHJvbCIsImJJc1RpdGxlUmVhZE9ubHkiLCJ0aXRsZUV4cHJlc3Npb24iLCJiSXNEZXNjcmlwdGlvblJlYWRPbmx5IiwiZGVzY3JpcHRpb25FeHByZXNzaW9uIiwiY29tYmluZVRpdGxlQW5kRGVzY3JpcHRpb25FeHByZXNzaW9uIiwib1RpdGxlRmllbGRDb250cm9sIiwib0Rlc2NyaXB0aW9uRmllbGRDb250cm9sIiwiZ2V0UHJlc3NFeHByZXNzaW9uRm9yRGVsZXRlIiwic0VudGl0eVNldE5hbWUiLCJzRGVsZXRhYmxlQ29udGV4dHMiLCJzVGl0bGUiLCJzRGVzY3JpcHRpb24iLCJvUGFyYW1zIiwidGl0bGUiLCJlbnRpdHlTZXROYW1lIiwiQ29tbW9uSGVscGVyIiwiYWRkU2luZ2xlUXVvdGVzIiwiZGVzY3JpcHRpb24iLCJnZW5lcmF0ZUZ1bmN0aW9uIiwib2JqZWN0VG9TdHJpbmciLCJnZXRQcmVzc0V4cHJlc3Npb25Gb3JFZGl0Iiwib0RhdGFGaWVsZCIsInNFZGl0YWJsZUNvbnRleHRzIiwiQWN0aW9uIiwic0RhdGFGaWVsZEVudW1NZW1iZXIiLCJJbnZvY2F0aW9uR3JvdXBpbmciLCJzSW52b2NhdGlvbkdyb3VwIiwiY29udGV4dHMiLCJpbnZvY2F0aW9uR3JvdXBpbmciLCJtb2RlbCIsImxhYmVsIiwiTGFiZWwiLCJpc05hdmlnYWJsZSIsImRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbiIsImdldFByZXNzRXhwcmVzc2lvbkZvckZvb3RlckFubm90YXRpb25BY3Rpb24iLCJzQWN0aW9uQ29udGV4dHMiLCJnZXRTdGFzaGFibGVIQm94QmluZGluZyIsIm9IZWFkZXJGYWNldCIsIkZhY2V0IiwidGFyZ2V0QW5ub3RhdGlvblR5cGUiLCJ0YXJnZXRBbm5vdGF0aW9uVmFsdWUiLCJnZXRQcmVzc0V4cHJlc3Npb25Gb3JMaW5rIiwiaXNTdWJTZWN0aW9uVGl0bGVWaXNpYmxlIiwic1N1YlNlY3Rpb252aXNpYmxlIiwic1N1YlNlY3Rpb250aXRsZSIsInNTdWJTZWN0aW9uc2hvd1RpdGxlIiwiaW5kZXhPZiIsInNFeHByZXNzaW9uUmVzdWx0Iiwic3Vic3RyaW5nIiwibGFzdEluZGV4T2YiXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7Ozs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNQSxnQkFBZ0IsR0FBRztBQUN4QkMsSUFBQUEsaUJBQWlCLEVBQUUsVUFBVUMsS0FBVixF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bW1vbkhlbHBlciBmcm9tIFwic2FwL2ZlL21hY3Jvcy9Db21tb25IZWxwZXJcIjtcbmltcG9ydCBNYW5hZ2VkT2JqZWN0IGZyb20gXCJzYXAvdWkvYmFzZS9NYW5hZ2VkT2JqZWN0XCI7XG5pbXBvcnQgT0RhdGFNb2RlbEFubm90YXRpb25IZWxwZXIgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Bbm5vdGF0aW9uSGVscGVyXCI7XG5pbXBvcnQgQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L0NvbnRleHRcIjtcbi8qXG5cdCBUaGlzIGNsYXNzIGNvbnRhaW5zIGFubm90YXRpb24gaGVscGVycyB0aGF0IG1pZ2h0IGJlIHVzZWQgZnJvbSBzZXZlcmFsIHRlbXBsYXRlcyBvciBjb250cm9sc1xuXHQgKi9cbmNvbnN0IEFubm90YXRpb25IZWxwZXIgPSB7XG5cdGdldEVsZW1lbnRCaW5kaW5nOiBmdW5jdGlvbiAoc1BhdGg6IGFueSkge1xuXHRcdGNvbnN0IHNOYXZpZ2F0aW9uUGF0aCA9IE9EYXRhTW9kZWxBbm5vdGF0aW9uSGVscGVyLmdldE5hdmlnYXRpb25QYXRoKHNQYXRoKTtcblx0XHRpZiAoc05hdmlnYXRpb25QYXRoKSB7XG5cdFx0XHRyZXR1cm4gXCJ7cGF0aDonXCIgKyBzTmF2aWdhdGlvblBhdGggKyBcIid9XCI7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vbm8gbmF2aWdhdGlvbiBwcm9wZXJ0eSBuZWVkcyBlbXB0eSBvYmplY3Rcblx0XHRcdHJldHVybiBcIntwYXRoOiAnJ31cIjtcblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIEZ1bmN0aW9uIHRvIGNoZWNrIGlmIGRyYWZ0IHBhdHRlcm4gaXMgc3VwcG9ydGVkLlxuXHQgKlxuXHQgKiBAcGFyYW0ge29iamVjdH0gb0Fubm90YXRpb25zIEFubm90YXRpb25zIG9mIHRoZSBjdXJyZW50IGVudGl0eSBzZXQuXG5cdCAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIEJvb2xlYW4gdmFsdWUgYmFzZWQgb24gZHJhZnQgc3RhdGVcblx0ICovXG5cdGNoZWNrRHJhZnRTdGF0ZTogZnVuY3Rpb24gKG9Bbm5vdGF0aW9uczogYW55KSB7XG5cdFx0aWYgKFxuXHRcdFx0b0Fubm90YXRpb25zW1wiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EcmFmdFJvb3RcIl0gJiZcblx0XHRcdG9Bbm5vdGF0aW9uc1tcIkBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnRSb290XCJdW1wiRWRpdEFjdGlvblwiXVxuXHRcdCkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIEZ1bmN0aW9uIHRvIGdldCB0aGUgdmlzaWJpbGl0eSBmb3IgdGhlIFN3aXRjaFRvQWN0aXZlIGJ1dHRvbiBpbiB0aGUgb2JqZWN0IHBhZ2Ugb3Igc3Vib2JqZWN0IHBhZ2UuXG5cdCAqXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvQW5ub3RhdGlvbnMgQW5ub3RhdGlvbnMgb2YgdGhlIGN1cnJlbnQgZW50aXR5IHNldC5cblx0ICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyBleHByZXNzaW9uIGJpbmRpbmcgb3IgQm9vbGVhbiB2YWx1ZSBiYXNlZCBvbiB0aGUgZHJhZnQgc3RhdGVcblx0ICovXG5cdGdldFN3aXRjaFRvQWN0aXZlVmlzaWJpbGl0eTogZnVuY3Rpb24gKG9Bbm5vdGF0aW9uczogYW55KTogYW55IHtcblx0XHRpZiAodGhpcy5jaGVja0RyYWZ0U3RhdGUob0Fubm90YXRpb25zKSkge1xuXHRcdFx0cmV0dXJuIFwiez0gKCV7RHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEvRHJhZnRJc0NyZWF0ZWRCeU1lfSkgPyAoICR7dWk+L2lzRWRpdGFibGV9ICYmICEke3VpPmNyZWF0ZU1vZGV9ICYmICV7RHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEvRHJhZnRJc0NyZWF0ZWRCeU1lfSApIDogZmFsc2UgfVwiO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBGdW5jdGlvbiB0byBnZXQgdGhlIHZpc2liaWxpdHkgZm9yIHRoZSBTd2l0Y2hUb0RyYWZ0IGJ1dHRvbiBpbiB0aGUgb2JqZWN0IHBhZ2Ugb3Igc3Vib2JqZWN0IHBhZ2UuXG5cdCAqXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvQW5ub3RhdGlvbnMgQW5ub3RhdGlvbnMgb2YgdGhlIGN1cnJlbnQgZW50aXR5IHNldC5cblx0ICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyBleHByZXNzaW9uIGJpbmRpbmcgb3IgQm9vbGVhbiB2YWx1ZSBiYXNlZCBvbiB0aGUgZHJhZnQgc3RhdGVcblx0ICovXG5cdGdldFN3aXRjaFRvRHJhZnRWaXNpYmlsaXR5OiBmdW5jdGlvbiAob0Fubm90YXRpb25zOiBhbnkpOiBhbnkge1xuXHRcdGlmICh0aGlzLmNoZWNrRHJhZnRTdGF0ZShvQW5ub3RhdGlvbnMpKSB7XG5cdFx0XHRyZXR1cm4gXCJ7PSAoJXtEcmFmdEFkbWluaXN0cmF0aXZlRGF0YS9EcmFmdElzQ3JlYXRlZEJ5TWV9KSA/ICggISgke3VpPi9pc0VkaXRhYmxlfSkgJiYgISR7dWk+Y3JlYXRlTW9kZX0gJiYgJHtIYXNEcmFmdEVudGl0eX0gJiYgJXtEcmFmdEFkbWluaXN0cmF0aXZlRGF0YS9EcmFmdElzQ3JlYXRlZEJ5TWV9ICkgOiBmYWxzZSB9XCI7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIEZ1bmN0aW9uIHRvIGdldCB0aGUgdmlzaWJpbGl0eSBmb3IgdGhlIFN3aXRjaERyYWZ0QW5kQWN0aXZlIGJ1dHRvbiBpbiB0aGUgb2JqZWN0IHBhZ2Ugb3Igc3Vib2JqZWN0IHBhZ2UuXG5cdCAqXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvQW5ub3RhdGlvbnMgQW5ub3RhdGlvbnMgb2YgdGhlIGN1cnJlbnQgZW50aXR5IHNldC5cblx0ICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyBleHByZXNzaW9uIGJpbmRpbmcgb3IgQm9vbGVhbiB2YWx1ZSBiYXNlZCBvbiB0aGUgZHJhZnQgc3RhdGVcblx0ICovXG5cdGdldFN3aXRjaERyYWZ0QW5kQWN0aXZlVmlzaWJpbGl0eTogZnVuY3Rpb24gKG9Bbm5vdGF0aW9uczogYW55KTogYW55IHtcblx0XHRpZiAodGhpcy5jaGVja0RyYWZ0U3RhdGUob0Fubm90YXRpb25zKSkge1xuXHRcdFx0cmV0dXJuIFwiez0gKCV7RHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEvRHJhZnRJc0NyZWF0ZWRCeU1lfSkgPyAoICEke3VpPmNyZWF0ZU1vZGV9ICYmICV7RHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEvRHJhZnRJc0NyZWF0ZWRCeU1lfSApIDogZmFsc2UgfVwiO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBGdW5jdGlvbiB0byBmaW5kIGFuIGFjdGlvbiBmcm9tIHRoZSBhcnJheSBvZiBoZWFkZXIgYWN0aW9ucyBpbiB0aGUgY29udmVydGVyIGNvbnRleHQuXG5cdCAqXG5cdCAqIEBwYXJhbSB7b2JqZWN0W119IGFDb252ZXJ0ZXJDb250ZXh0SGVhZGVyQWN0aW9ucyBBcnJheSBvZiAnaGVhZGVyJyBhY3Rpb25zIG9uIHRoZSBvYmplY3QgcGFnZS5cblx0ICogQHBhcmFtIHtzdHJpbmd9IHNBY3Rpb25UeXBlIFRoZSBhY3Rpb24gdHlwZVxuXHQgKiBAcmV0dXJucyB7b2JqZWN0IHwgdW5kZWZpbmVkfSBUaGUgYWN0aW9uIHdpdGggdGhlIG1hdGNoaW5nIGFjdGlvbiB0eXBlXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRfZmluZEFjdGlvbjogZnVuY3Rpb24gKGFDb252ZXJ0ZXJDb250ZXh0SGVhZGVyQWN0aW9uczogYW55W10sIHNBY3Rpb25UeXBlOiBzdHJpbmcpIHtcblx0XHRsZXQgb0FjdGlvbjtcblx0XHRpZiAoYUNvbnZlcnRlckNvbnRleHRIZWFkZXJBY3Rpb25zICYmIGFDb252ZXJ0ZXJDb250ZXh0SGVhZGVyQWN0aW9ucy5sZW5ndGgpIHtcblx0XHRcdG9BY3Rpb24gPSBhQ29udmVydGVyQ29udGV4dEhlYWRlckFjdGlvbnMuZmluZChmdW5jdGlvbiAob0hlYWRlckFjdGlvbjogYW55KSB7XG5cdFx0XHRcdHJldHVybiBvSGVhZGVyQWN0aW9uLnR5cGUgPT09IHNBY3Rpb25UeXBlO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdHJldHVybiBvQWN0aW9uO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBGdW5jdGlvbiB0byBmb3JtYXQgdGhlICdlbmFibGVkJyBwcm9wZXJ0eSBmb3IgdGhlIERlbGV0ZSBidXR0b24gb24gdGhlIG9iamVjdCBwYWdlIG9yIHN1Ym9iamVjdCBwYWdlIGluIGNhc2Ugb2YgYSBDb21tYW5kIEV4ZWN1dGlvbi5cblx0ICpcblx0ICogQHBhcmFtIHtBcnJheX0gYUNvbnZlcnRlckNvbnRleHRIZWFkZXJBY3Rpb25zIEFycmF5IG9mIGhlYWRlciBhY3Rpb25zIG9uIHRoZSBvYmplY3QgcGFnZVxuXHQgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIGV4cHJlc3Npb24gYmluZGluZyBvciBCb29sZWFuIHZhbHVlIGZyb20gdGhlIGNvbnZlcnRlciBvdXRwdXRcblx0ICovXG5cdGdldERlbGV0ZUNvbW1hbmRFeGVjdXRpb25FbmFibGVkOiBmdW5jdGlvbiAoYUNvbnZlcnRlckNvbnRleHRIZWFkZXJBY3Rpb25zOiBhbnlbXSkge1xuXHRcdGNvbnN0IG9EZWxldGVBY3Rpb24gPSBBbm5vdGF0aW9uSGVscGVyLl9maW5kQWN0aW9uKGFDb252ZXJ0ZXJDb250ZXh0SGVhZGVyQWN0aW9ucywgXCJTZWNvbmRhcnlcIik7XG5cdFx0cmV0dXJuIG9EZWxldGVBY3Rpb24gPyBvRGVsZXRlQWN0aW9uLmVuYWJsZWQgOiBcInRydWVcIjtcblx0fSxcblx0LyoqXG5cdCAqIEZ1bmN0aW9uIHRvIGZvcm1hdCB0aGUgJ3Zpc2libGUnIHByb3BlcnR5IGZvciB0aGUgRGVsZXRlIGJ1dHRvbiBvbiB0aGUgb2JqZWN0IHBhZ2Ugb3Igc3Vib2JqZWN0IHBhZ2UgaW4gY2FzZSBvZiBhIENvbW1hbmQgRXhlY3V0aW9uLlxuXHQgKlxuXHQgKiBAcGFyYW0ge0FycmF5fSBhQ29udmVydGVyQ29udGV4dEhlYWRlckFjdGlvbnMgQXJyYXkgb2YgaGVhZGVyIGFjdGlvbnMgb24gdGhlIG9iamVjdCBwYWdlXG5cdCAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgZXhwcmVzc2lvbiBiaW5kaW5nIG9yIEJvb2xlYW4gdmFsdWUgZnJvbSB0aGUgY29udmVydGVyIG91dHB1dFxuXHQgKi9cblx0Z2V0RGVsZXRlQ29tbWFuZEV4ZWN1dGlvblZpc2libGU6IGZ1bmN0aW9uIChhQ29udmVydGVyQ29udGV4dEhlYWRlckFjdGlvbnM6IGFueVtdKSB7XG5cdFx0Y29uc3Qgb0RlbGV0ZUFjdGlvbiA9IEFubm90YXRpb25IZWxwZXIuX2ZpbmRBY3Rpb24oYUNvbnZlcnRlckNvbnRleHRIZWFkZXJBY3Rpb25zLCBcIlNlY29uZGFyeVwiKTtcblx0XHRyZXR1cm4gb0RlbGV0ZUFjdGlvbiA/IG9EZWxldGVBY3Rpb24udmlzaWJsZSA6IFwidHJ1ZVwiO1xuXHR9LFxuXHQvKipcblx0ICogRnVuY3Rpb24gdG8gZm9ybWF0IHRoZSAndmlzaWJsZScgcHJvcGVydHkgZm9yIHRoZSBFZGl0IGJ1dHRvbiBvbiB0aGUgb2JqZWN0IHBhZ2Ugb3Igc3Vib2JqZWN0IHBhZ2UgaW4gY2FzZSBvZiBhIENvbW1hbmQgRXhlY3V0aW9uLlxuXHQgKlxuXHQgKiBAcGFyYW0ge0FycmF5fSBhQ29udmVydGVyQ29udGV4dEhlYWRlckFjdGlvbnMgQXJyYXkgb2YgaGVhZGVyIGFjdGlvbnMgb24gdGhlIG9iamVjdCBwYWdlXG5cdCAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgZXhwcmVzc2lvbiBiaW5kaW5nIG9yIEJvb2xlYW4gdmFsdWUgZnJvbSB0aGUgY29udmVydGVyIG91dHB1dFxuXHQgKi9cblx0Z2V0RWRpdENvbW1hbmRFeGVjdXRpb25WaXNpYmxlOiBmdW5jdGlvbiAoYUNvbnZlcnRlckNvbnRleHRIZWFkZXJBY3Rpb25zOiBhbnlbXSkge1xuXHRcdGNvbnN0IG9FZGl0QWN0aW9uID0gQW5ub3RhdGlvbkhlbHBlci5fZmluZEFjdGlvbihhQ29udmVydGVyQ29udGV4dEhlYWRlckFjdGlvbnMsIFwiUHJpbWFyeVwiKTtcblx0XHRyZXR1cm4gb0VkaXRBY3Rpb24gPyBvRWRpdEFjdGlvbi52aXNpYmxlIDogXCJ0cnVlXCI7XG5cdH0sXG5cdC8qKlxuXHQgKiBGdW5jdGlvbiB0byBmb3JtYXQgdGhlICdlbmFibGVkJyBwcm9wZXJ0eSBmb3IgdGhlIEVkaXQgYnV0dG9uIG9uIHRoZSBvYmplY3QgcGFnZSBvciBzdWJvYmplY3QgcGFnZSBpbiBjYXNlIG9mIGEgQ29tbWFuZCBFeGVjdXRpb24uXG5cdCAqXG5cdCAqIEBwYXJhbSB7QXJyYXl9IGFDb252ZXJ0ZXJDb250ZXh0SGVhZGVyQWN0aW9ucyBBcnJheSBvZiBoZWFkZXIgYWN0aW9ucyBvbiB0aGUgb2JqZWN0IHBhZ2Vcblx0ICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyBleHByZXNzaW9uIGJpbmRpbmcgb3IgQm9vbGVhbiB2YWx1ZSBmcm9tIHRoZSBjb252ZXJ0ZXIgb3V0cHV0XG5cdCAqL1xuXHRnZXRFZGl0Q29tbWFuZEV4ZWN1dGlvbkVuYWJsZWQ6IGZ1bmN0aW9uIChhQ29udmVydGVyQ29udGV4dEhlYWRlckFjdGlvbnM6IGFueVtdKSB7XG5cdFx0Y29uc3Qgb0VkaXRBY3Rpb24gPSBBbm5vdGF0aW9uSGVscGVyLl9maW5kQWN0aW9uKGFDb252ZXJ0ZXJDb250ZXh0SGVhZGVyQWN0aW9ucywgXCJQcmltYXJ5XCIpO1xuXHRcdHJldHVybiBvRWRpdEFjdGlvbiA/IG9FZGl0QWN0aW9uLmVuYWJsZWQgOiBcInRydWVcIjtcblx0fSxcblx0LyoqXG5cdCAqIEZ1bmN0aW9uIHRvIGdldCB0aGUgRWRpdEFjdGlvbiBmcm9tIHRoZSBFbnRpdHlzZXQgYmFzZWQgb24gRHJhZnQgb3Igc3RpY2t5IGJhc2VkIGFwcGxpY2F0aW9uLlxuXHQgKlxuXHQgKiBAcGFyYW0ge29iamVjdH0gW29FbnRpdHlTZXRdIFRoZSB2YWx1ZSBmcm9tIHRoZSBleHByZXNzaW9uLlxuXHQgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIGV4cHJlc3Npb24gYmluZGluZyBvciBib29sZWFuIHZhbHVlIGJhc2VkIG9uIHZSYXdWYWx1ZSAmIG9EcmFmdE5vZGVcblx0ICovXG5cdGdldEVkaXRBY3Rpb246IGZ1bmN0aW9uIChvRW50aXR5U2V0OiBDb250ZXh0KSB7XG5cdFx0Y29uc3Qgc1BhdGggPSBvRW50aXR5U2V0LmdldFBhdGgoKSxcblx0XHRcdG9Bbm5vdGF0aW9ucyA9IG9FbnRpdHlTZXQuZ2V0T2JqZWN0KHNQYXRoICsgXCJAXCIpO1xuXHRcdGNvbnN0IGJEcmFmdFJvb3QgPSBvQW5ub3RhdGlvbnMuaGFzT3duUHJvcGVydHkoXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRyYWZ0Um9vdFwiKTtcblx0XHRjb25zdCBiU3RpY2t5U2Vzc2lvbiA9IG9Bbm5vdGF0aW9ucy5oYXNPd25Qcm9wZXJ0eShcIkBjb20uc2FwLnZvY2FidWxhcmllcy5TZXNzaW9uLnYxLlN0aWNreVNlc3Npb25TdXBwb3J0ZWRcIik7XG5cdFx0bGV0IHNBY3Rpb25OYW1lO1xuXHRcdGlmIChiRHJhZnRSb290KSB7XG5cdFx0XHRzQWN0aW9uTmFtZSA9IG9FbnRpdHlTZXQuZ2V0T2JqZWN0KHNQYXRoICsgXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRyYWZ0Um9vdC9FZGl0QWN0aW9uXCIpO1xuXHRcdH0gZWxzZSBpZiAoYlN0aWNreVNlc3Npb24pIHtcblx0XHRcdHNBY3Rpb25OYW1lID0gb0VudGl0eVNldC5nZXRPYmplY3Qoc1BhdGggKyBcIkBjb20uc2FwLnZvY2FidWxhcmllcy5TZXNzaW9uLnYxLlN0aWNreVNlc3Npb25TdXBwb3J0ZWQvRWRpdEFjdGlvblwiKTtcblx0XHR9XG5cdFx0cmV0dXJuICFzQWN0aW9uTmFtZSA/IHNBY3Rpb25OYW1lIDogc1BhdGggKyBcIi9cIiArIHNBY3Rpb25OYW1lO1xuXHR9LFxuXHRpc1JlYWRPbmx5RnJvbVN0YXRpY0Fubm90YXRpb25zOiBmdW5jdGlvbiAob0Fubm90YXRpb25zOiBhbnksIG9GaWVsZENvbnRyb2w6IGFueSkge1xuXHRcdGxldCBiQ29tcHV0ZWQsIGJJbW11dGFibGUsIGJSZWFkT25seTtcblx0XHRpZiAob0Fubm90YXRpb25zW1wiQE9yZy5PRGF0YS5Db3JlLlYxLkNvbXB1dGVkXCJdKSB7XG5cdFx0XHRiQ29tcHV0ZWQgPSBvQW5ub3RhdGlvbnNbXCJAT3JnLk9EYXRhLkNvcmUuVjEuQ29tcHV0ZWRcIl0uQm9vbFxuXHRcdFx0XHQ/IG9Bbm5vdGF0aW9uc1tcIkBPcmcuT0RhdGEuQ29yZS5WMS5Db21wdXRlZFwiXS5Cb29sID09IFwidHJ1ZVwiXG5cdFx0XHRcdDogdHJ1ZTtcblx0XHR9XG5cdFx0aWYgKG9Bbm5vdGF0aW9uc1tcIkBPcmcuT0RhdGEuQ29yZS5WMS5JbW11dGFibGVcIl0pIHtcblx0XHRcdGJJbW11dGFibGUgPSBvQW5ub3RhdGlvbnNbXCJAT3JnLk9EYXRhLkNvcmUuVjEuSW1tdXRhYmxlXCJdLkJvb2xcblx0XHRcdFx0PyBvQW5ub3RhdGlvbnNbXCJAT3JnLk9EYXRhLkNvcmUuVjEuSW1tdXRhYmxlXCJdLkJvb2wgPT0gXCJ0cnVlXCJcblx0XHRcdFx0OiB0cnVlO1xuXHRcdH1cblx0XHRiUmVhZE9ubHkgPSBiQ29tcHV0ZWQgfHwgYkltbXV0YWJsZTtcblxuXHRcdGlmIChvRmllbGRDb250cm9sKSB7XG5cdFx0XHRiUmVhZE9ubHkgPSBiUmVhZE9ubHkgfHwgb0ZpZWxkQ29udHJvbCA9PSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5GaWVsZENvbnRyb2xUeXBlL1JlYWRPbmx5XCI7XG5cdFx0fVxuXHRcdGlmIChiUmVhZE9ubHkpIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHR9LFxuXHRyZWFkT25seUV4cHJlc3Npb25Gcm9tRHluYW1pY0Fubm90YXRpb25zOiBmdW5jdGlvbiAob0ZpZWxkQ29udHJvbDogYW55KSB7XG5cdFx0bGV0IHNJc0ZpZWxkQ29udHJvbFBhdGhSZWFkT25seTtcblx0XHRpZiAob0ZpZWxkQ29udHJvbCkge1xuXHRcdFx0aWYgKChNYW5hZ2VkT2JqZWN0IGFzIGFueSkuYmluZGluZ1BhcnNlcihvRmllbGRDb250cm9sKSkge1xuXHRcdFx0XHRzSXNGaWVsZENvbnRyb2xQYXRoUmVhZE9ubHkgPSBcIiVcIiArIG9GaWVsZENvbnRyb2wgKyBcIiA9PT0gMSBcIjtcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKHNJc0ZpZWxkQ29udHJvbFBhdGhSZWFkT25seSkge1xuXHRcdFx0cmV0dXJuIFwiez0gXCIgKyBzSXNGaWVsZENvbnRyb2xQYXRoUmVhZE9ubHkgKyBcIj8gZmFsc2UgOiB0cnVlIH1cIjtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0fSxcblx0Lypcblx0ICogRnVuY3Rpb24gdG8gZ2V0IHRoZSBleHByZXNzaW9uIGZvciBjaGFydCBUaXRsZSBQcmVzc1xuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQHBhcmFtIHtvQ29uZmlndXJhdGlvbn0gW29Db25maWd1cmF0aW9uc10gY29udHJvbCBjb25maWd1cmF0aW9uIGZyb20gbWFuaWZlc3Rcblx0ICogIEBwYXJhbSB7b01hbmlmZXN0fSBbb01hbmlmZXN0XSBPdXRib3VuZHMgZnJvbSBtYW5pZmVzdFxuXHQgKiByZXR1cm5zIHtTdHJpbmd9IFtzQ29sbGVjdGlvbk5hbWVdIENvbGxlY3Rpb24gTmFtZSBvZiB0aGUgTWljcm8gQ2hhcnRcblx0ICpcblx0ICogcmV0dXJucyB7U3RyaW5nfSBbRXhwcmVzc2lvbl0gSGFuZGxlciBFeHByZXNzaW9uIGZvciB0aGUgdGl0bGUgcHJlc3Ncblx0ICpcblx0ICovXG5cdGdldEV4cHJlc3Npb25Gb3JNaWNyb0NoYXJ0VGl0bGVQcmVzczogZnVuY3Rpb24gKG9Db25maWd1cmF0aW9uOiBhbnksIG9NYW5pZmVzdE91dGJvdW5kOiBhbnksIHNDb2xsZWN0aW9uTmFtZTogYW55KSB7XG5cdFx0aWYgKG9Db25maWd1cmF0aW9uKSB7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdChvQ29uZmlndXJhdGlvbltcInRhcmdldE91dGJvdW5kXCJdICYmIG9Db25maWd1cmF0aW9uW1widGFyZ2V0T3V0Ym91bmRcIl1bXCJvdXRib3VuZFwiXSkgfHxcblx0XHRcdFx0KG9Db25maWd1cmF0aW9uW1widGFyZ2V0T3V0Ym91bmRcIl0gJiYgb0NvbmZpZ3VyYXRpb25bXCJ0YXJnZXRPdXRib3VuZFwiXVtcIm91dGJvdW5kXCJdICYmIG9Db25maWd1cmF0aW9uW1widGFyZ2V0U2VjdGlvbnNcIl0pXG5cdFx0XHQpIHtcblx0XHRcdFx0cmV0dXJuIChcblx0XHRcdFx0XHRcIi5oYW5kbGVycy5vbkRhdGFQb2ludFRpdGxlUHJlc3NlZCgkY29udHJvbGxlciwgJHskc291cmNlPi99LCdcIiArXG5cdFx0XHRcdFx0SlNPTi5zdHJpbmdpZnkob01hbmlmZXN0T3V0Ym91bmQpICtcblx0XHRcdFx0XHRcIicsJ1wiICtcblx0XHRcdFx0XHRvQ29uZmlndXJhdGlvbltcInRhcmdldE91dGJvdW5kXCJdW1wib3V0Ym91bmRcIl0gK1xuXHRcdFx0XHRcdFwiJywnXCIgK1xuXHRcdFx0XHRcdHNDb2xsZWN0aW9uTmFtZSArXG5cdFx0XHRcdFx0XCInIClcIlxuXHRcdFx0XHQpO1xuXHRcdFx0fSBlbHNlIGlmIChvQ29uZmlndXJhdGlvbltcInRhcmdldFNlY3Rpb25zXCJdKSB7XG5cdFx0XHRcdHJldHVybiBcIi5oYW5kbGVycy5uYXZpZ2F0ZVRvU3ViU2VjdGlvbigkY29udHJvbGxlciwgJ1wiICsgSlNPTi5zdHJpbmdpZnkob0NvbmZpZ3VyYXRpb25bXCJ0YXJnZXRTZWN0aW9uc1wiXSkgKyBcIicpXCI7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdFx0fVxuXHRcdH1cblx0fSxcblx0Lypcblx0ICogRnVuY3Rpb24gdG8gcmVuZGVyIENoYXJ0IFRpdGxlIGFzIExpbmtcblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSB7b0NvbnRyb2xDb25maWd1cmF0aW9ufSBbb0NvbmZpZ3VyYXRpb25zXSBjb250cm9sIGNvbmZpZ3VyYXRpb24gZnJvbSBtYW5pZmVzdFxuXHQgKiByZXR1cm5zIHtTdHJpbmd9IFtzS2V5XSBGb3IgdGhlIFRhcmdldE91dGJvdW5kIGFuZCBUYXJnZXRTZWN0aW9uXG5cdCAqXG5cdCAqL1xuXHRnZXRNaWNyb0NoYXJ0VGl0bGVBc0xpbms6IGZ1bmN0aW9uIChvQ29udHJvbENvbmZpZ3VyYXRpb246IGFueSkge1xuXHRcdGlmIChcblx0XHRcdG9Db250cm9sQ29uZmlndXJhdGlvbiAmJlxuXHRcdFx0KG9Db250cm9sQ29uZmlndXJhdGlvbltcInRhcmdldE91dGJvdW5kXCJdIHx8XG5cdFx0XHRcdChvQ29udHJvbENvbmZpZ3VyYXRpb25bXCJ0YXJnZXRPdXRib3VuZFwiXSAmJiBvQ29udHJvbENvbmZpZ3VyYXRpb25bXCJ0YXJnZXRTZWN0aW9uc1wiXSkpXG5cdFx0KSB7XG5cdFx0XHRyZXR1cm4gXCJFeHRlcm5hbFwiO1xuXHRcdH0gZWxzZSBpZiAob0NvbnRyb2xDb25maWd1cmF0aW9uICYmIG9Db250cm9sQ29uZmlndXJhdGlvbltcInRhcmdldFNlY3Rpb25zXCJdKSB7XG5cdFx0XHRyZXR1cm4gXCJJblBhZ2VcIjtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIFwiTm9uZVwiO1xuXHRcdH1cblx0fSxcblxuXHQvKiBHZXQgZ3JvdXBJZCBmcm9tIGNvbnRyb2wgY29uZmlndXJhdGlvblxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQHBhcmFtIHtPYmplY3R9IFtvQ29uZmlndXJhdGlvbnNdIGNvbnRyb2wgY29uZmlndXJhdGlvbiBmcm9tIG1hbmlmZXN0XG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBbc0Fubm90YXRpb25QYXRoXSBBbm5vdGF0aW9uIFBhdGggZm9yIHRoZSBjb25maWd1cmF0aW9uXG5cdCAqIEBkZXNjcmlwdGlvbiBVc2VkIHRvIGdldCB0aGUgZ3JvdXBJZCBmb3IgRGF0YVBvaW50cyBhbmQgTWljcm9DaGFydHMgaW4gdGhlIEhlYWRlci5cblx0ICpcblx0ICovXG5cdGdldEdyb3VwSWRGcm9tQ29uZmlnOiBmdW5jdGlvbiAob0NvbmZpZ3VyYXRpb25zOiBhbnksIHNBbm5vdGF0aW9uUGF0aDogYW55LCBzRGVmYXVsdEdyb3VwSWQ/OiBhbnkpIHtcblx0XHRjb25zdCBvQ29uZmlndXJhdGlvbiA9IG9Db25maWd1cmF0aW9uc1tzQW5ub3RhdGlvblBhdGhdLFxuXHRcdFx0YUF1dG9QYXR0ZXJucyA9IFtcIkhlcm9lc1wiLCBcIkRlY29yYXRpb25cIiwgXCJXb3JrZXJzXCIsIFwiTG9uZ1J1bm5lcnNcIl07XG5cdFx0bGV0IHNHcm91cElkID0gc0RlZmF1bHRHcm91cElkO1xuXHRcdGlmIChcblx0XHRcdG9Db25maWd1cmF0aW9uICYmXG5cdFx0XHRvQ29uZmlndXJhdGlvbi5yZXF1ZXN0R3JvdXBJZCAmJlxuXHRcdFx0YUF1dG9QYXR0ZXJucy5zb21lKGZ1bmN0aW9uIChhdXRvUGF0dGVybjogc3RyaW5nKSB7XG5cdFx0XHRcdHJldHVybiBhdXRvUGF0dGVybiA9PT0gb0NvbmZpZ3VyYXRpb24ucmVxdWVzdEdyb3VwSWQ7XG5cdFx0XHR9KVxuXHRcdCkge1xuXHRcdFx0c0dyb3VwSWQgPSBcIiRhdXRvLlwiICsgb0NvbmZpZ3VyYXRpb24ucmVxdWVzdEdyb3VwSWQ7XG5cdFx0fVxuXHRcdHJldHVybiBzR3JvdXBJZDtcblx0fSxcblxuXHQvKlxuXHQgKiBHZXQgQ29udGV4dCBCaW5kaW5nIHdpdGggZ3JvdXBJZCBmcm9tIGNvbnRyb2wgY29uZmlndXJhdGlvblxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQHBhcmFtIHtPYmplY3R9IFtvQ29uZmlndXJhdGlvbnNdIGNvbnRyb2wgY29uZmlndXJhdGlvbiBmcm9tIG1hbmlmZXN0XG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBbc0tleV0gQW5ub3RhdGlvbiBQYXRoIGZvciBvZiB0aGUgY29uZmlndXJhdGlvblxuXHQgKiBAZGVzY3JpcHRpb24gVXNlZCB0byBnZXQgdGhlIGJpbmRpbmcgZm9yIERhdGFQb2ludHMgaW4gdGhlIEhlYWRlci5cblx0ICpcblx0ICovXG5cdGdldEJpbmRpbmdXaXRoR3JvdXBJZEZyb21Db25maWc6IGZ1bmN0aW9uIChvQ29uZmlndXJhdGlvbnM6IGFueSwgc0tleTogYW55KSB7XG5cdFx0Y29uc3Qgc0dyb3VwSWQgPSBBbm5vdGF0aW9uSGVscGVyLmdldEdyb3VwSWRGcm9tQ29uZmlnKG9Db25maWd1cmF0aW9ucywgc0tleSk7XG5cdFx0bGV0IHNCaW5kaW5nO1xuXHRcdGlmIChzR3JvdXBJZCkge1xuXHRcdFx0c0JpbmRpbmcgPSBcInsgcGF0aCA6ICcnLCBwYXJhbWV0ZXJzIDogeyAkJGdyb3VwSWQgOiAnXCIgKyBzR3JvdXBJZCArIFwiJyB9IH1cIjtcblx0XHR9XG5cdFx0cmV0dXJuIHNCaW5kaW5nO1xuXHR9LFxuXHQvKipcblx0ICogTWV0aG9kIHRvIGNoZWNrIHdoZXRoZXIgYSBGaWVsZEdyb3VwIGNvbnNpc3RzIG9mIG9ubHkgMSBEYXRhRmllbGQgd2l0aCBNdWx0aUxpbmUgVGV4dCBhbm5vdGF0aW9uLlxuXHQgKlxuXHQgKiBAcGFyYW0ge0RhdGFGaWVsZEFic3RyYWN0VHlwZXNbXX0gYUZvcm1FbGVtZW50cyBBIGNvbGxlY3Rpb24gb2YgZm9ybSBlbGVtZW50cyB1c2VkIGluIHRoZSBjdXJyZW50IGZpZWxkIGdyb3VwXG5cdCAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIHRydWUgaWYgb25seSAxIGRhdGEgZmllbGQgd2l0aCBNdWx0aWxpbmUgVGV4dCBhbm5vdGF0aW9uIGV4aXN0cy5cblx0ICovXG5cdGRvZXNGaWVsZEdyb3VwQ29udGFpbk9ubHlPbmVNdWx0aUxpbmVEYXRhRmllbGQ6IGZ1bmN0aW9uIChhRm9ybUVsZW1lbnRzOiBhbnlbXSkge1xuXHRcdHJldHVybiBhRm9ybUVsZW1lbnRzICYmIGFGb3JtRWxlbWVudHMubGVuZ3RoID09PSAxICYmICEhYUZvcm1FbGVtZW50c1swXS5pc1ZhbHVlTXVsdGlsaW5lVGV4dDtcblx0fSxcblx0Lypcblx0ICogR2V0IFZpc2libGl0eSBvZiBicmVhZGNydW1icy5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBbb1ZpZXdEYXRhXSBWaWV3RGF0YSBtb2RlbFxuXHQgKiByZXR1cm5zIHsqfSBFeHByZXNzaW9uIG9yIGJvb2xlYW5cblx0ICovXG5cdGdldFZpc2libGVFeHByZXNzaW9uRm9yQnJlYWRjcnVtYnM6IGZ1bmN0aW9uIChvVmlld0RhdGE6IGFueSkge1xuXHRcdHJldHVybiBvVmlld0RhdGEuc2hvd0JyZWFkQ3J1bWJzICYmIG9WaWV3RGF0YS5mY2xFbmFibGVkICE9PSB1bmRlZmluZWRcblx0XHRcdD8gXCJ7ZmNsaGVscGVyPi9icmVhZENydW1iSXNWaXNpYmxlfVwiXG5cdFx0XHQ6IG9WaWV3RGF0YS5zaG93QnJlYWRDcnVtYnM7XG5cdH0sXG5cdGdldFNoYXJlQnV0dG9uVmlzaWJpbGl0eTogZnVuY3Rpb24gKHZpZXdEYXRhOiBhbnkpIHtcblx0XHRsZXQgc1NoYXJlQnV0dG9uVmlzaWJpbGl0eUV4cCA9IFwiISR7dWk+Y3JlYXRlTW9kZX1cIjtcblx0XHRpZiAodmlld0RhdGEuZmNsRW5hYmxlZCkge1xuXHRcdFx0c1NoYXJlQnV0dG9uVmlzaWJpbGl0eUV4cCA9IFwiJHtmY2xoZWxwZXI+L3Nob3dTaGFyZUljb259ICYmIFwiICsgc1NoYXJlQnV0dG9uVmlzaWJpbGl0eUV4cDtcblx0XHR9XG5cdFx0cmV0dXJuIFwiez0gXCIgKyBzU2hhcmVCdXR0b25WaXNpYmlsaXR5RXhwICsgXCIgfVwiO1xuXHR9LFxuXG5cdC8qXG5cdCAqIEdldCB2aXNpYmxpdHkgZm9yIGVkaXRhYmxlIGhlYWRlciBmYWNldC5cblx0ICpcblx0ICogSWYgZWl0aGVyIHRoZSB0aXRsZSBvciBkZXNjcmlwdGlvbiBmaWVsZCBmcm9tIHRoZSBoZWFkZXIgYW5ub3RhdGlvbnMgYXJlIGVkaXRhYmxlLCB0aGVuIHRoZVxuXHQgKiBlZGl0YWJsZSBoZWFkZXIgZmFjZXQgaXMgdmlzaWJsZS5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBbb0Fubm90YXRpb25zXSBBbm5vdGF0aW9ucyBvYmplY3QgZm9yIGdpdmVuIGVudGl0eSBzZXRcblx0ICogQHBhcmFtIHtvYmplY3R9IFtvRmllbGRDb250cm9sXSBmaWVsZCBjb250cm9sXG5cdCAqIHJldHVybnMgeyp9ICBiaW5kaW5nIGV4cHJlc3Npb24gb3IgYm9vbGVhbiB2YWx1ZSByZXNvbHZlZCBmb3JtIGZ1bmNpdG9ucyBpc1JlYWRPbmx5RnJvbVN0YXRpY0Fubm90YXRpb25zIGFuZCBpc1JlYWRPbmx5RnJvbUR5bmFtaWNBbm5vdGF0aW9uc1xuXHQgKi9cblx0Z2V0VmlzaWJsaXR5T2ZIZWFkZXJGYWNldDogZnVuY3Rpb24gKFxuXHRcdG9UaXRsZUFubm90YXRpb25zOiBhbnksXG5cdFx0b0Rlc2NyaXB0aW9uQW5ub3RhdGlvbnM6IGFueSxcblx0XHRvRmllbGRUaXRsZUZpZWxkQ29udHJvbDogYW55LFxuXHRcdG9GaWVsZERlc2NyaXB0aW9uRmllbGRDb250cm9sOiBhbnlcblx0KSB7XG5cdFx0Ly8gQ2hlY2sgQW5ub3RhdGlvbnMgZm9yIFRpdGxlIEZpZWxkXG5cdFx0Y29uc3QgYklzVGl0bGVSZWFkT25seSA9IEFubm90YXRpb25IZWxwZXIuaXNSZWFkT25seUZyb21TdGF0aWNBbm5vdGF0aW9ucyhvVGl0bGVBbm5vdGF0aW9ucywgb0ZpZWxkVGl0bGVGaWVsZENvbnRyb2wpO1xuXHRcdGNvbnN0IHRpdGxlRXhwcmVzc2lvbiA9IEFubm90YXRpb25IZWxwZXIucmVhZE9ubHlFeHByZXNzaW9uRnJvbUR5bmFtaWNBbm5vdGF0aW9ucyhvRmllbGRUaXRsZUZpZWxkQ29udHJvbCk7XG5cdFx0Ly8gVGhlcmUgaXMgbm8gZXhwcmVzc2lvbiBhbmQgdGhlIHRpdGxlIGlzIG5vdCByZWFkeSBvbmx5LCB0aGlzIGlzIHN1ZmZpY2llbnQgZm9yIGFuIGVkaXRhYmxlIGhlYWRlclxuXHRcdGlmICghYklzVGl0bGVSZWFkT25seSAmJiAhdGl0bGVFeHByZXNzaW9uKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cblx0XHQvLyBDaGVjayBBbm5vdGF0aW9ucyBmb3IgRGVzY3JpcHRpb24gRmllbGRcblx0XHRjb25zdCBiSXNEZXNjcmlwdGlvblJlYWRPbmx5ID0gQW5ub3RhdGlvbkhlbHBlci5pc1JlYWRPbmx5RnJvbVN0YXRpY0Fubm90YXRpb25zKFxuXHRcdFx0b0Rlc2NyaXB0aW9uQW5ub3RhdGlvbnMsXG5cdFx0XHRvRmllbGREZXNjcmlwdGlvbkZpZWxkQ29udHJvbFxuXHRcdCk7XG5cdFx0Y29uc3QgZGVzY3JpcHRpb25FeHByZXNzaW9uID0gQW5ub3RhdGlvbkhlbHBlci5yZWFkT25seUV4cHJlc3Npb25Gcm9tRHluYW1pY0Fubm90YXRpb25zKG9GaWVsZERlc2NyaXB0aW9uRmllbGRDb250cm9sKTtcblx0XHQvLyBUaGVyZSBpcyBubyBleHByZXNzaW9uIGFuZCB0aGUgZGVzY3JpcHRpb24gaXMgbm90IHJlYWR5IG9ubHksIHRoaXMgaXMgc3VmZmljaWVudCBmb3IgYW4gZWRpdGFibGUgaGVhZGVyXG5cdFx0aWYgKCFiSXNEZXNjcmlwdGlvblJlYWRPbmx5ICYmICFkZXNjcmlwdGlvbkV4cHJlc3Npb24pIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblxuXHRcdC8vIEJvdGggdGl0bGUgYW5kIGRlc2NyaXB0aW9uIGFyZSBub3QgZWRpdGFibGUgYW5kIHRoZXJlIGFyZSBubyBkeW5hbWljIGFubm90YXRpb25zXG5cdFx0aWYgKGJJc1RpdGxlUmVhZE9ubHkgJiYgYklzRGVzY3JpcHRpb25SZWFkT25seSAmJiAhdGl0bGVFeHByZXNzaW9uICYmICFkZXNjcmlwdGlvbkV4cHJlc3Npb24pIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyBOb3cgY29tYmluZSBleHByZXNzaW9uc1xuXHRcdGlmICh0aXRsZUV4cHJlc3Npb24gJiYgIWRlc2NyaXB0aW9uRXhwcmVzc2lvbikge1xuXHRcdFx0cmV0dXJuIHRpdGxlRXhwcmVzc2lvbjtcblx0XHR9IGVsc2UgaWYgKCF0aXRsZUV4cHJlc3Npb24gJiYgZGVzY3JpcHRpb25FeHByZXNzaW9uKSB7XG5cdFx0XHRyZXR1cm4gZGVzY3JpcHRpb25FeHByZXNzaW9uO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gQW5ub3RhdGlvbkhlbHBlci5jb21iaW5lVGl0bGVBbmREZXNjcmlwdGlvbkV4cHJlc3Npb24ob0ZpZWxkVGl0bGVGaWVsZENvbnRyb2wsIG9GaWVsZERlc2NyaXB0aW9uRmllbGRDb250cm9sKTtcblx0XHR9XG5cdH0sXG5cdGNvbWJpbmVUaXRsZUFuZERlc2NyaXB0aW9uRXhwcmVzc2lvbjogZnVuY3Rpb24gKG9UaXRsZUZpZWxkQ29udHJvbDogYW55LCBvRGVzY3JpcHRpb25GaWVsZENvbnRyb2w6IGFueSkge1xuXHRcdC8vIElmIGJvdGggaGVhZGVyIGFuZCB0aXRsZSBmaWVsZCBhcmUgYmFzZWQgb24gZHlubWFpYyBmaWVsZCBjb250cm9sLCB0aGUgZWRpdGFibGUgaGVhZGVyXG5cdFx0Ly8gaXMgdmlzaWJsZSBpZiBhdCBsZWFzdCBvbmUgb2YgdGhlc2UgaXMgbm90IHJlYWR5IG9ubHlcblx0XHRyZXR1cm4gXCJ7PSAlXCIgKyBvVGl0bGVGaWVsZENvbnRyb2wgKyBcIiA9PT0gMSA/ICggJVwiICsgb0Rlc2NyaXB0aW9uRmllbGRDb250cm9sICsgXCIgPT09IDEgPyBmYWxzZSA6IHRydWUgKSA6IHRydWUgfVwiO1xuXHR9LFxuXHQvKlxuXHQgKiBHZXQgRXhwcmVzc2lvbiBvZiBwcmVzcyBldmVudCBvZiBkZWxldGUgYnV0dG9uLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQHBhcmFtIHtzdHJpbmd9IFtzRW50aXR5U2V0TmFtZV0gRW50aXR5IHNldCBuYW1lXG5cdCAqIHJldHVybnMge3N0cmluZ30gIGJpbmRpbmcgZXhwcmVzc2lvbiAvIGZ1bmN0aW9uIHN0cmluZyBnZW5lcmF0ZWQgZnJvbSBjb21tYW5oZWxwZXIncyBmdW5jdGlvbiBnZW5lcmF0ZUZ1bmN0aW9uXG5cdCAqL1xuXHRnZXRQcmVzc0V4cHJlc3Npb25Gb3JEZWxldGU6IGZ1bmN0aW9uIChzRW50aXR5U2V0TmFtZTogYW55KSB7XG5cdFx0Y29uc3Qgc0RlbGV0YWJsZUNvbnRleHRzID0gXCIkeyR2aWV3Pi9nZXRCaW5kaW5nQ29udGV4dH1cIixcblx0XHRcdHNUaXRsZSA9IFwiJHskdmlldz4vI2ZlOjpPYmplY3RQYWdlL2dldEhlYWRlclRpdGxlL2dldEV4cGFuZGVkSGVhZGluZy9nZXRJdGVtcy8xL2dldFRleHR9XCIsXG5cdFx0XHRzRGVzY3JpcHRpb24gPSBcIiR7JHZpZXc+LyNmZTo6T2JqZWN0UGFnZS9nZXRIZWFkZXJUaXRsZS9nZXRFeHBhbmRlZENvbnRlbnQvMC9nZXRJdGVtcy8wL2dldFRleHR9XCI7XG5cdFx0Y29uc3Qgb1BhcmFtcyA9IHtcblx0XHRcdHRpdGxlOiBzVGl0bGUsXG5cdFx0XHRlbnRpdHlTZXROYW1lOiBDb21tb25IZWxwZXIuYWRkU2luZ2xlUXVvdGVzKHNFbnRpdHlTZXROYW1lKSxcblx0XHRcdGRlc2NyaXB0aW9uOiBzRGVzY3JpcHRpb25cblx0XHR9O1xuXHRcdHJldHVybiBDb21tb25IZWxwZXIuZ2VuZXJhdGVGdW5jdGlvbihcIi5lZGl0Rmxvdy5kZWxldGVEb2N1bWVudFwiLCBzRGVsZXRhYmxlQ29udGV4dHMsIENvbW1vbkhlbHBlci5vYmplY3RUb1N0cmluZyhvUGFyYW1zKSk7XG5cdH0sXG5cdC8qXG5cdCAqIEdldCBFeHByZXNzaW9uIG9mIHByZXNzIGV2ZW50IG9mIEVkaXQgYnV0dG9uLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQHBhcmFtIHtvYmplY3R9IFtvRGF0YUZpZWxkXSBEYXRhIGZpZWxkIG9iamVjdFxuXHQgKiBAcGFyYW0ge3N0cmluZ30gW3NFbnRpdHlTZXROYW1lXSBFbnRpdHkgc2V0IG5hbWVcblx0ICogQHBhcmFtIHtvYmplY3R9IFtvSGVhZGVyQWN0aW9uXSBIZWFkZXIgYWN0aW9uIG9iamVjdFxuXHQgKiByZXR1cm5zIHtzdHJpbmd9ICBiaW5kaW5nIGV4cHJlc3Npb24gLyBmdW5jdGlvbiBzdHJpbmcgZ2VuZXJhdGVkIGZyb20gY29tbWFuaGVscGVyJ3MgZnVuY3Rpb24gZ2VuZXJhdGVGdW5jdGlvblxuXHQgKi9cblx0Z2V0UHJlc3NFeHByZXNzaW9uRm9yRWRpdDogZnVuY3Rpb24gKG9EYXRhRmllbGQ6IGFueSwgc0VudGl0eVNldE5hbWU6IGFueSwgb0hlYWRlckFjdGlvbjogYW55KSB7XG5cdFx0Y29uc3Qgc0VkaXRhYmxlQ29udGV4dHMgPSBDb21tb25IZWxwZXIuYWRkU2luZ2xlUXVvdGVzKG9EYXRhRmllbGQgJiYgb0RhdGFGaWVsZC5BY3Rpb24pLFxuXHRcdFx0c0RhdGFGaWVsZEVudW1NZW1iZXIgPSBvRGF0YUZpZWxkICYmIG9EYXRhRmllbGQuSW52b2NhdGlvbkdyb3VwaW5nICYmIG9EYXRhRmllbGQuSW52b2NhdGlvbkdyb3VwaW5nW1wiJEVudW1NZW1iZXJcIl0sXG5cdFx0XHRzSW52b2NhdGlvbkdyb3VwID1cblx0XHRcdFx0c0RhdGFGaWVsZEVudW1NZW1iZXIgPT09IFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuT3BlcmF0aW9uR3JvdXBpbmdUeXBlL0NoYW5nZVNldFwiID8gXCJDaGFuZ2VTZXRcIiA6IFwiSXNvbGF0ZWRcIjtcblx0XHRjb25zdCBvUGFyYW1zID0ge1xuXHRcdFx0Y29udGV4dHM6IFwiJHskdmlldz4vZ2V0QmluZGluZ0NvbnRleHR9XCIsXG5cdFx0XHRlbnRpdHlTZXROYW1lOiBDb21tb25IZWxwZXIuYWRkU2luZ2xlUXVvdGVzKHNFbnRpdHlTZXROYW1lKSxcblx0XHRcdGludm9jYXRpb25Hcm91cGluZzogQ29tbW9uSGVscGVyLmFkZFNpbmdsZVF1b3RlcyhzSW52b2NhdGlvbkdyb3VwKSxcblx0XHRcdG1vZGVsOiBcIiR7JHNvdXJjZT4vfS5nZXRNb2RlbCgpXCIsXG5cdFx0XHRsYWJlbDogQ29tbW9uSGVscGVyLmFkZFNpbmdsZVF1b3RlcyhvRGF0YUZpZWxkICYmIG9EYXRhRmllbGQuTGFiZWwsIHRydWUpLFxuXHRcdFx0aXNOYXZpZ2FibGU6IG9IZWFkZXJBY3Rpb24gJiYgb0hlYWRlckFjdGlvbi5pc05hdmlnYWJsZSxcblx0XHRcdGRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbjpcblx0XHRcdFx0b0hlYWRlckFjdGlvbiAmJiBvSGVhZGVyQWN0aW9uLmRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvblxuXHRcdFx0XHRcdD8gXCInXCIgKyBvSGVhZGVyQWN0aW9uLmRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbiArIFwiJ1wiXG5cdFx0XHRcdFx0OiB1bmRlZmluZWRcblx0XHR9O1xuXHRcdHJldHVybiBDb21tb25IZWxwZXIuZ2VuZXJhdGVGdW5jdGlvbihcblx0XHRcdFwiLmhhbmRsZXJzLm9uQ2FsbEFjdGlvblwiLFxuXHRcdFx0XCIkeyR2aWV3Pi99XCIsXG5cdFx0XHRzRWRpdGFibGVDb250ZXh0cyxcblx0XHRcdENvbW1vbkhlbHBlci5vYmplY3RUb1N0cmluZyhvUGFyYW1zKVxuXHRcdCk7XG5cdH0sXG5cdC8qXG5cdCAqIE1ldGhvZCB0byBnZXQgdGhlIGV4cHJlc3Npb24gZm9yIHRoZSAncHJlc3MnIGV2ZW50IGZvciBmb290ZXIgYW5ub3RhdGlvbiBhY3Rpb25zXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAcGFyYW0ge29iamVjdH0gW29EYXRhRmllbGRdIERhdGEgZmllbGQgb2JqZWN0XG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBbc0VudGl0eVNldE5hbWVdIEVudGl0eSBzZXQgbmFtZVxuXHQgKiBAcGFyYW0ge29iamVjdH0gW29IZWFkZXJBY3Rpb25dIEhlYWRlciBhY3Rpb24gb2JqZWN0XG5cdCAqIHJldHVybnMge3N0cmluZ30gIEJpbmRpbmcgZXhwcmVzc2lvbiBvciBmdW5jdGlvbiBzdHJpbmcgdGhhdCBpcyBnZW5lcmF0ZWQgZnJvbSB0aGUgQ29tbW9uaGVscGVyJ3MgZnVuY3Rpb24gZ2VuZXJhdGVGdW5jdGlvblxuXHQgKi9cblx0Z2V0UHJlc3NFeHByZXNzaW9uRm9yRm9vdGVyQW5ub3RhdGlvbkFjdGlvbjogZnVuY3Rpb24gKG9EYXRhRmllbGQ6IGFueSwgc0VudGl0eVNldE5hbWU6IGFueSwgb0hlYWRlckFjdGlvbjogYW55KSB7XG5cdFx0Y29uc3Qgc0FjdGlvbkNvbnRleHRzID0gQ29tbW9uSGVscGVyLmFkZFNpbmdsZVF1b3RlcyhvRGF0YUZpZWxkICYmIG9EYXRhRmllbGQuQWN0aW9uKSxcblx0XHRcdHNEYXRhRmllbGRFbnVtTWVtYmVyID0gb0RhdGFGaWVsZCAmJiBvRGF0YUZpZWxkLkludm9jYXRpb25Hcm91cGluZyAmJiBvRGF0YUZpZWxkLkludm9jYXRpb25Hcm91cGluZ1tcIiRFbnVtTWVtYmVyXCJdLFxuXHRcdFx0c0ludm9jYXRpb25Hcm91cCA9XG5cdFx0XHRcdHNEYXRhRmllbGRFbnVtTWVtYmVyID09PSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLk9wZXJhdGlvbkdyb3VwaW5nVHlwZS9DaGFuZ2VTZXRcIiA/IFwiQ2hhbmdlU2V0XCIgOiBcIklzb2xhdGVkXCI7XG5cdFx0Y29uc3Qgb1BhcmFtcyA9IHtcblx0XHRcdGNvbnRleHRzOiBcIiR7JHZpZXc+LyNmZTo6T2JqZWN0UGFnZS99LmdldEJpbmRpbmdDb250ZXh0KClcIixcblx0XHRcdGVudGl0eVNldE5hbWU6IENvbW1vbkhlbHBlci5hZGRTaW5nbGVRdW90ZXMoc0VudGl0eVNldE5hbWUpLFxuXHRcdFx0aW52b2NhdGlvbkdyb3VwaW5nOiBDb21tb25IZWxwZXIuYWRkU2luZ2xlUXVvdGVzKHNJbnZvY2F0aW9uR3JvdXApLFxuXHRcdFx0bW9kZWw6IFwiJHskc291cmNlPi99LmdldE1vZGVsKClcIixcblx0XHRcdGxhYmVsOiBDb21tb25IZWxwZXIuYWRkU2luZ2xlUXVvdGVzKG9EYXRhRmllbGQgJiYgb0RhdGFGaWVsZC5MYWJlbCwgdHJ1ZSksXG5cdFx0XHRpc05hdmlnYWJsZTogb0hlYWRlckFjdGlvbiAmJiBvSGVhZGVyQWN0aW9uLmlzTmF2aWdhYmxlLFxuXHRcdFx0ZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uOlxuXHRcdFx0XHRvSGVhZGVyQWN0aW9uICYmIG9IZWFkZXJBY3Rpb24uZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uXG5cdFx0XHRcdFx0PyBcIidcIiArIG9IZWFkZXJBY3Rpb24uZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uICsgXCInXCJcblx0XHRcdFx0XHQ6IHVuZGVmaW5lZFxuXHRcdH07XG5cdFx0cmV0dXJuIENvbW1vbkhlbHBlci5nZW5lcmF0ZUZ1bmN0aW9uKFwiLmhhbmRsZXJzLm9uQ2FsbEFjdGlvblwiLCBcIiR7JHZpZXc+L31cIiwgc0FjdGlvbkNvbnRleHRzLCBDb21tb25IZWxwZXIub2JqZWN0VG9TdHJpbmcob1BhcmFtcykpO1xuXHR9LFxuXHQvKlxuXHQgKiBHZXRzIHRoZSBiaW5kaW5nIG9mIHRoZSBjb250YWluZXIgSEJveCBmb3IgdGhlIGhlYWRlciBmYWNldC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBbb0NvbnRyb2xDb25maWd1cmF0aW9uXSBUaGUgY29udHJvbCBjb25maWd1cmF0aW9uIGZvcm0gb2YgdGhlIHZpZXdEYXRhIG1vZGVsXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBbb0hlYWRlckZhY2V0XSBUaGUgb2JqZWN0IG9mIHRoZSBoZWFkZXIgZmFjZXRcblx0ICogcmV0dXJucyB7Kn0gIFRoZSBiaW5kaW5nIGV4cHJlc3Npb24gZnJvbSBmdW5jdGlvbiBnZXRCaW5kaW5nV2l0aEdyb3VwSWRGcm9tQ29uZmlnIG9yIHVuZGVmaW5lZC5cblx0ICovXG5cdGdldFN0YXNoYWJsZUhCb3hCaW5kaW5nOiBmdW5jdGlvbiAob0NvbnRyb2xDb25maWd1cmF0aW9uOiBhbnksIG9IZWFkZXJGYWNldDogYW55KSB7XG5cdFx0aWYgKG9IZWFkZXJGYWNldCAmJiBvSGVhZGVyRmFjZXQuRmFjZXQgJiYgb0hlYWRlckZhY2V0LkZhY2V0LnRhcmdldEFubm90YXRpb25UeXBlID09PSBcIkRhdGFQb2ludFwiKSB7XG5cdFx0XHRyZXR1cm4gQW5ub3RhdGlvbkhlbHBlci5nZXRCaW5kaW5nV2l0aEdyb3VwSWRGcm9tQ29uZmlnKG9Db250cm9sQ29uZmlndXJhdGlvbiwgb0hlYWRlckZhY2V0LkZhY2V0LnRhcmdldEFubm90YXRpb25WYWx1ZSk7XG5cdFx0fVxuXHR9LFxuXG5cdC8qXG5cdCAqIEdldHMgdGhlICdQcmVzcycgZXZlbnQgZXhwcmVzc2lvbiBmb3IgdGhlIGV4dGVybmFsIGFuZCBpbnRlcm5hbCBkYXRhIHBvaW50IGxpbmsuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAcGFyYW0ge29iamVjdH0gW29Db25maWd1cmF0aW9uXSBDb250cm9sIGNvbmZpZ3VyYXRpb24gZnJvbSBtYW5pZmVzdFxuXHQgKiBAcGFyYW0ge29iamVjdH0gW29NYW5pZmVzdE91dGJvdW5kXSBPdXRib3VuZHMgZnJvbSBtYW5pZmVzdFxuXHQgKiByZXR1cm5zIHtzdHJpbmd9IFRoZSBydW50aW1lIGJpbmRpbmcgb2YgdGhlICdQcmVzcycgZXZlbnRcblx0ICovXG5cdGdldFByZXNzRXhwcmVzc2lvbkZvckxpbms6IGZ1bmN0aW9uIChvQ29uZmlndXJhdGlvbjogYW55LCBvTWFuaWZlc3RPdXRib3VuZDogYW55KSB7XG5cdFx0aWYgKG9Db25maWd1cmF0aW9uKSB7XG5cdFx0XHRpZiAob0NvbmZpZ3VyYXRpb25bXCJ0YXJnZXRPdXRib3VuZFwiXSAmJiBvQ29uZmlndXJhdGlvbltcInRhcmdldE91dGJvdW5kXCJdW1wib3V0Ym91bmRcIl0pIHtcblx0XHRcdFx0cmV0dXJuIChcblx0XHRcdFx0XHRcIi5oYW5kbGVycy5vbkRhdGFQb2ludFRpdGxlUHJlc3NlZCgkY29udHJvbGxlciwgJHskc291cmNlPn0sIFwiICtcblx0XHRcdFx0XHRKU09OLnN0cmluZ2lmeShvTWFuaWZlc3RPdXRib3VuZCkgK1xuXHRcdFx0XHRcdFwiLFwiICtcblx0XHRcdFx0XHRKU09OLnN0cmluZ2lmeShvQ29uZmlndXJhdGlvbltcInRhcmdldE91dGJvdW5kXCJdW1wib3V0Ym91bmRcIl0pICtcblx0XHRcdFx0XHRcIilcIlxuXHRcdFx0XHQpO1xuXHRcdFx0fSBlbHNlIGlmIChvQ29uZmlndXJhdGlvbltcInRhcmdldFNlY3Rpb25zXCJdKSB7XG5cdFx0XHRcdHJldHVybiBcIi5oYW5kbGVycy5uYXZpZ2F0ZVRvU3ViU2VjdGlvbigkY29udHJvbGxlciwgJ1wiICsgSlNPTi5zdHJpbmdpZnkob0NvbmZpZ3VyYXRpb25bXCJ0YXJnZXRTZWN0aW9uc1wiXSkgKyBcIicpXCI7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdFx0fVxuXHRcdH1cblx0fSxcblx0aXNTdWJTZWN0aW9uVGl0bGVWaXNpYmxlOiBmdW5jdGlvbiAoc1N1YlNlY3Rpb252aXNpYmxlOiBhbnksIHNTdWJTZWN0aW9udGl0bGU6IGFueSwgc1N1YlNlY3Rpb25zaG93VGl0bGU6IGFueSkge1xuXHRcdGlmIChzU3ViU2VjdGlvbnZpc2libGUuaW5kZXhPZihcIns9XCIpID09PSAwKSB7XG5cdFx0XHQvLyBEeW5hbWljIGV4cHJlc3Npb25cblx0XHRcdGNvbnN0IHNFeHByZXNzaW9uUmVzdWx0ID0gc1N1YlNlY3Rpb252aXNpYmxlLnN1YnN0cmluZyhcblx0XHRcdFx0c1N1YlNlY3Rpb252aXNpYmxlLmluZGV4T2YoXCJ7PVwiKSArIDIsXG5cdFx0XHRcdHNTdWJTZWN0aW9udmlzaWJsZS5sYXN0SW5kZXhPZihcIn1cIilcblx0XHRcdCk7XG5cdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHRcIns9IChcIiArXG5cdFx0XHRcdHNFeHByZXNzaW9uUmVzdWx0ICtcblx0XHRcdFx0XCIpICYmICgnXCIgK1xuXHRcdFx0XHRzU3ViU2VjdGlvbnRpdGxlICtcblx0XHRcdFx0XCInICE9PSd1bmRlZmluZWQnKSAmJiAoXCIgK1xuXHRcdFx0XHRzU3ViU2VjdGlvbnNob3dUaXRsZSArXG5cdFx0XHRcdFwiID8gdHJ1ZSA6IGZhbHNlKSB9XCJcblx0XHRcdCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBzU3ViU2VjdGlvbnZpc2libGUgJiYgc1N1YlNlY3Rpb250aXRsZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiAoc1N1YlNlY3Rpb25zaG93VGl0bGUgPyBcInRydWVcIiA6IFwiZmFsc2VcIik7XG5cdFx0fVxuXHR9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBBbm5vdGF0aW9uSGVscGVyO1xuIl19