@sapui5/sap.fe.core 1.92.0 → 1.93.3

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 (84) hide show
  1. package/package.json +2 -3
  2. package/src/sap/fe/core/.library +1 -1
  3. package/src/sap/fe/core/AnnotationHelper.js +2 -2
  4. package/src/sap/fe/core/AppComponent.js +21 -1
  5. package/src/sap/fe/core/CommonUtils.js +130 -48
  6. package/src/sap/fe/core/ExtensionAPI.js +238 -226
  7. package/src/sap/fe/core/PageController.js +5 -2
  8. package/src/sap/fe/core/TemplateComponent.js +1 -0
  9. package/src/sap/fe/core/TransactionHelper.js +35 -8
  10. package/src/sap/fe/core/actions/draft.js +1 -1
  11. package/src/sap/fe/core/actions/messageHandling.js +18 -6
  12. package/src/sap/fe/core/actions/operations.js +17 -41
  13. package/src/sap/fe/core/controllerextensions/EditFlow.js +127 -43
  14. package/src/sap/fe/core/controllerextensions/InternalRouting.js +11 -11
  15. package/src/sap/fe/core/controllerextensions/KPIManagement.js +417 -0
  16. package/src/sap/fe/core/controllerextensions/KPIManagement.ts +399 -0
  17. package/src/sap/fe/core/controllerextensions/PageReady.js +2 -3
  18. package/src/sap/fe/core/controllerextensions/PageReady.ts +1 -1
  19. package/src/sap/fe/core/controllerextensions/Share.js +102 -66
  20. package/src/sap/fe/core/controllerextensions/SideEffects.js +60 -14
  21. package/src/sap/fe/core/controllerextensions/SideEffects.ts +53 -12
  22. package/src/sap/fe/core/controllerextensions/ViewState.js +18 -18
  23. package/src/sap/fe/core/controls/filterbar/FilterContainer.js +13 -0
  24. package/src/sap/fe/core/controls/filterbar/VisualFilter.js +68 -2
  25. package/src/sap/fe/core/converters/ConverterContext.js +15 -1
  26. package/src/sap/fe/core/converters/ConverterContext.ts +11 -0
  27. package/src/sap/fe/core/converters/ManifestSettings.js +1 -1
  28. package/src/sap/fe/core/converters/ManifestSettings.ts +14 -2
  29. package/src/sap/fe/core/converters/ManifestWrapper.js +14 -14
  30. package/src/sap/fe/core/converters/ManifestWrapper.ts +13 -12
  31. package/src/sap/fe/core/converters/MetaModelConverter.js +32 -2
  32. package/src/sap/fe/core/converters/MetaModelConverter.ts +39 -2
  33. package/src/sap/fe/core/converters/annotations/DataField.js +10 -6
  34. package/src/sap/fe/core/converters/annotations/DataField.ts +9 -5
  35. package/src/sap/fe/core/converters/common/AnnotationConverter.js +14 -4
  36. package/src/sap/fe/core/converters/controls/Common/Action.js +25 -15
  37. package/src/sap/fe/core/converters/controls/Common/Action.ts +33 -19
  38. package/src/sap/fe/core/converters/controls/Common/Criticality.js +50 -0
  39. package/src/sap/fe/core/converters/controls/Common/Criticality.ts +33 -0
  40. package/src/sap/fe/core/converters/controls/Common/Form.js +2 -3
  41. package/src/sap/fe/core/converters/controls/Common/Form.ts +1 -2
  42. package/src/sap/fe/core/converters/controls/Common/KPI.js +181 -0
  43. package/src/sap/fe/core/converters/controls/Common/KPI.ts +220 -0
  44. package/src/sap/fe/core/converters/controls/Common/Table.js +121 -59
  45. package/src/sap/fe/core/converters/controls/Common/Table.ts +130 -62
  46. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +5 -4
  47. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.ts +9 -3
  48. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +62 -7
  49. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +58 -6
  50. package/src/sap/fe/core/converters/helpers/Aggregation.js +86 -11
  51. package/src/sap/fe/core/converters/helpers/Aggregation.ts +79 -8
  52. package/src/sap/fe/core/converters/helpers/BindingHelper.js +44 -2
  53. package/src/sap/fe/core/converters/helpers/BindingHelper.ts +43 -2
  54. package/src/sap/fe/core/converters/helpers/ID.js +3 -1
  55. package/src/sap/fe/core/converters/helpers/ID.ts +1 -0
  56. package/src/sap/fe/core/converters/helpers/IssueManager.js +8 -2
  57. package/src/sap/fe/core/converters/helpers/IssueManager.ts +7 -1
  58. package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.js +93 -0
  59. package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.ts +92 -0
  60. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +102 -23
  61. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +111 -17
  62. package/src/sap/fe/core/converters/templates/ListReportConverter.js +44 -5
  63. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +39 -2
  64. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +41 -30
  65. package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +47 -30
  66. package/src/sap/fe/core/designtime/AppComponent.designtime.js +4 -1
  67. package/src/sap/fe/core/formatters/CriticalityFormatter.js +77 -0
  68. package/src/sap/fe/core/formatters/CriticalityFormatter.ts +58 -0
  69. package/src/sap/fe/core/formatters/KPIFormatter.js +103 -0
  70. package/src/sap/fe/core/formatters/KPIFormatter.ts +88 -0
  71. package/src/sap/fe/core/fpm/manifest.json +1 -3
  72. package/src/sap/fe/core/helpers/BindingExpression.js +161 -97
  73. package/src/sap/fe/core/helpers/BindingExpression.ts +188 -117
  74. package/src/sap/fe/core/library.js +1 -1
  75. package/src/sap/fe/core/messagebundle.properties +45 -1
  76. package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +3 -1
  77. package/src/sap/fe/core/services/AsyncComponentServiceFactory.ts +3 -0
  78. package/src/sap/fe/core/services/RoutingServiceFactory.js +30 -8
  79. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +16 -4
  80. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +13 -3
  81. package/src/sap/fe/core/templating/DataModelPathHelper.js +7 -3
  82. package/src/sap/fe/core/templating/DataModelPathHelper.ts +7 -2
  83. package/src/sap/fe/core/templating/UIFormatters.js +1 -5
  84. package/src/sap/fe/core/templating/UIFormatters.ts +0 -3
@@ -0,0 +1,417 @@
1
+ /*!
2
+ * SAP UI development toolkit for HTML5 (SAPUI5)
3
+ * (c) Copyright 2009-2021 SAP SE. All rights reserved
4
+ */
5
+ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/fe/core/controllerextensions/ControllerExtensionMetadata", "../helpers/ClassSupport", "sap/ui/model/json/JSONModel", "sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/formatters/TableFormatterTypes", "sap/ui/core/format/NumberFormat", "sap/ui/core/Locale", "sap/ui/model/Filter"], function (ControllerExtension, ControllerExtensionMetadata, ClassSupport, JSONModel, Log, CommonUtils, TableFormatterTypes, NumberFormat, Locale, Filter) {
6
+ "use strict";
7
+
8
+ var _dec, _dec2, _dec3, _class, _class2;
9
+
10
+ var _exports = {};
11
+ var MessageType = TableFormatterTypes.MessageType;
12
+ var Override = ClassSupport.Override;
13
+ var UI5Class = ClassSupport.UI5Class;
14
+
15
+ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
16
+
17
+ function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
18
+
19
+ function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
20
+
21
+ function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }
22
+
23
+ function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
24
+
25
+ function _createSuper(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
26
+
27
+ function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); }
28
+
29
+ function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
30
+
31
+ function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }
32
+
33
+ function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
34
+
35
+ function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) { var desc = {}; Object.keys(descriptor).forEach(function (key) { desc[key] = descriptor[key]; }); desc.enumerable = !!desc.enumerable; desc.configurable = !!desc.configurable; if ('value' in desc || desc.initializer) { desc.writable = true; } desc = decorators.slice().reverse().reduce(function (desc, decorator) { return decorator(target, property, desc) || desc; }, desc); if (context && desc.initializer !== void 0) { desc.value = desc.initializer ? desc.initializer.call(context) : void 0; desc.initializer = undefined; } if (desc.initializer === void 0) { Object.defineProperty(target, property, desc); desc = null; } return desc; }
36
+
37
+ /**
38
+ * Function to calculate a message state from a criticality value.
39
+ *
40
+ * @param {number|string} criticalityValue The criticality values.
41
+ * @returns {MessageType} Returns the corresponding MessageType
42
+ */
43
+ function messageTypeFromCriticality(criticalityValue) {
44
+ var criticalityProperty;
45
+
46
+ switch (criticalityValue) {
47
+ case 1:
48
+ criticalityProperty = MessageType.Error;
49
+ break;
50
+
51
+ case 2:
52
+ criticalityProperty = MessageType.Warning;
53
+ break;
54
+
55
+ case 3:
56
+ criticalityProperty = MessageType.Success;
57
+ break;
58
+
59
+ case 5:
60
+ criticalityProperty = MessageType.Information;
61
+ break;
62
+
63
+ default:
64
+ criticalityProperty = MessageType.None;
65
+ }
66
+
67
+ return criticalityProperty;
68
+ }
69
+ /**
70
+ * Function to calculate the message state for a criticality calculation of type 'Target'.
71
+ *
72
+ * @param {number} kpiValue The value of the KPI to be tested against.
73
+ * @param {number[]} aThresholds Thresholds to be used [DeviationRangeLowValue,ToleranceRangeLowValue,AcceptanceRangeLowValue,AcceptanceRangeHighValue,ToleranceRangeHighValue,DeviationRangeHighValue].
74
+ * @returns {MessageType} Returns the corresponding MessageType
75
+ */
76
+
77
+
78
+ function messageTypeFromTargetCalculation(kpiValue, aThresholds) {
79
+ var criticalityProperty;
80
+
81
+ if (aThresholds[0] !== undefined && aThresholds[0] !== null && kpiValue < aThresholds[0]) {
82
+ criticalityProperty = MessageType.Error;
83
+ } else if (aThresholds[1] !== undefined && aThresholds[1] !== null && kpiValue < aThresholds[1]) {
84
+ criticalityProperty = MessageType.Warning;
85
+ } else if (aThresholds[2] !== undefined && aThresholds[2] !== null && kpiValue < aThresholds[2]) {
86
+ criticalityProperty = MessageType.None;
87
+ } else if (aThresholds[5] !== undefined && aThresholds[5] !== null && kpiValue > aThresholds[5]) {
88
+ criticalityProperty = MessageType.Error;
89
+ } else if (aThresholds[4] !== undefined && aThresholds[4] !== null && kpiValue > aThresholds[4]) {
90
+ criticalityProperty = MessageType.Warning;
91
+ } else if (aThresholds[3] !== undefined && aThresholds[3] !== null && kpiValue > aThresholds[3]) {
92
+ criticalityProperty = MessageType.None;
93
+ } else {
94
+ criticalityProperty = MessageType.Success;
95
+ }
96
+
97
+ return criticalityProperty;
98
+ }
99
+ /**
100
+ * Function to calculate the message state for a criticality calculation of type 'Minimize'.
101
+ *
102
+ * @param {number} kpiValue The value of the KPI to be tested against.
103
+ * @param {number[]} aThresholds Thresholds to be used [AcceptanceRangeHighValue,ToleranceRangeHighValue,DeviationRangeHighValue].
104
+ * @returns {MessageType} Returns the corresponding MessageType
105
+ */
106
+
107
+
108
+ function messageTypeFromMinimizeCalculation(kpiValue, aThresholds) {
109
+ var criticalityProperty;
110
+
111
+ if (aThresholds[2] !== undefined && aThresholds[2] !== null && kpiValue > aThresholds[2]) {
112
+ criticalityProperty = MessageType.Error;
113
+ } else if (aThresholds[1] !== undefined && aThresholds[1] !== null && kpiValue > aThresholds[1]) {
114
+ criticalityProperty = MessageType.Warning;
115
+ } else if (aThresholds[0] !== undefined && aThresholds[0] !== null && kpiValue > aThresholds[0]) {
116
+ criticalityProperty = MessageType.None;
117
+ } else {
118
+ criticalityProperty = MessageType.Success;
119
+ }
120
+
121
+ return criticalityProperty;
122
+ }
123
+ /**
124
+ * Function to calculate the message state for a criticality calculation of type 'Maximize'.
125
+ *
126
+ * @param {number} kpiValue The value of the KPI to be tested against.
127
+ * @param {number[]} aThresholds Thresholds to be used [DeviationRangeLowValue,ToleranceRangeLowValue,AcceptanceRangeLowValue].
128
+ * @returns {MessageType} Returns the corresponding MessageType
129
+ */
130
+
131
+
132
+ function messageTypeFromMaximizeCalculation(kpiValue, aThresholds) {
133
+ var criticalityProperty;
134
+
135
+ if (aThresholds[0] !== undefined && aThresholds[0] !== null && kpiValue < aThresholds[0]) {
136
+ criticalityProperty = MessageType.Error;
137
+ } else if (aThresholds[1] !== undefined && aThresholds[1] !== null && kpiValue < aThresholds[1]) {
138
+ criticalityProperty = MessageType.Warning;
139
+ } else if (aThresholds[2] !== undefined && aThresholds[2] !== null && kpiValue < aThresholds[2]) {
140
+ criticalityProperty = MessageType.None;
141
+ } else {
142
+ criticalityProperty = MessageType.Success;
143
+ }
144
+
145
+ return criticalityProperty;
146
+ }
147
+ /**
148
+ * Creates a sap.ui.model.Filter from a filter definition.
149
+ *
150
+ * @param filterDefinition The filter definition
151
+ * @returns Returns a sap.ui.model.Filter from the definition, or undefined if the definition is empty (no ranges)
152
+ */
153
+
154
+
155
+ function createFilterFromDefinition(filterDefinition) {
156
+ if (filterDefinition.ranges.length === 0) {
157
+ return undefined;
158
+ } else if (filterDefinition.ranges.length === 1) {
159
+ return new Filter(filterDefinition.propertyPath, filterDefinition.ranges[0].operator, filterDefinition.ranges[0].rangeLow, filterDefinition.ranges[0].rangeHigh);
160
+ } else {
161
+ var aRangeFilters = filterDefinition.ranges.map(function (range) {
162
+ return new Filter(filterDefinition.propertyPath, range.operator, range.rangeLow, range.rangeHigh);
163
+ });
164
+ return new Filter({
165
+ filters: aRangeFilters,
166
+ and: false
167
+ });
168
+ }
169
+ }
170
+ /**
171
+ * @class A controller extension for managing KPI in an AnalyticalListPage
172
+ *
173
+ * @name sap.fe.core.controllerextensions.KPIManagement
174
+ * @hideconstructor
175
+ *
176
+ * @private
177
+ * @since 1.93.0
178
+ */
179
+
180
+
181
+ _exports.createFilterFromDefinition = createFilterFromDefinition;
182
+ var KPIManagementControllerExtension = (_dec = UI5Class("sap.fe.core.controllerextensions.KPIManagement", ControllerExtensionMetadata), _dec2 = Override(), _dec3 = Override(), _dec(_class = (_class2 = /*#__PURE__*/function (_ControllerExtension) {
183
+ _inherits(KPIManagementControllerExtension, _ControllerExtension);
184
+
185
+ var _super = _createSuper(KPIManagementControllerExtension);
186
+
187
+ function KPIManagementControllerExtension() {
188
+ _classCallCheck(this, KPIManagementControllerExtension);
189
+
190
+ return _super.apply(this, arguments);
191
+ }
192
+
193
+ _createClass(KPIManagementControllerExtension, [{
194
+ key: "onInit",
195
+ value: function onInit() {
196
+ var _this = this;
197
+
198
+ this.aKPIDefinitions = this.getKPIData();
199
+
200
+ if (this.aKPIDefinitions && this.aKPIDefinitions.length) {
201
+ var oView = this.getView();
202
+ this.oAppComponent = CommonUtils.getAppComponent(oView); // Create a JSON model to store KPI data
203
+
204
+ var oKPIModel = new JSONModel();
205
+ oView.setModel(oKPIModel, "kpiModel");
206
+ this.aKPIDefinitions.forEach(function (kpiDefinition) {
207
+ // Create the manifest for the KPI card and store it in the KPI model
208
+ var oCardManifest = {
209
+ "sap.app": {
210
+ id: "sap.fe",
211
+ type: "card"
212
+ },
213
+ "sap.ui": {
214
+ technology: "UI5"
215
+ },
216
+ "sap.card": {
217
+ type: "Analytical",
218
+ data: {
219
+ json: {}
220
+ },
221
+ header: {
222
+ type: "Numeric",
223
+ mainIndicator: {
224
+ number: "{mainValue}",
225
+ unit: "{mainUnit}"
226
+ },
227
+ title: "{cardTitle}"
228
+ },
229
+ content: {
230
+ plotArea: {
231
+ "dataLabel": {
232
+ "visible": false
233
+ },
234
+ "categoryAxisText": {
235
+ "visible": false
236
+ },
237
+ "valueAxisText": {
238
+ "visible": false
239
+ }
240
+ },
241
+ title: {
242
+ text: "{chartTitle}",
243
+ visible: true,
244
+ alignment: "Left"
245
+ },
246
+ measureAxis: "valueAxis",
247
+ dimensionAxis: "categoryAxis",
248
+ data: {
249
+ path: "/chartData"
250
+ }
251
+ }
252
+ }
253
+ };
254
+ oKPIModel.setProperty("/" + kpiDefinition.id, {
255
+ manifest: oCardManifest
256
+ }); // Load tag data for the KPI
257
+
258
+ _this.loadKPITagData(kpiDefinition).catch(function (err) {
259
+ Log.error(err);
260
+ });
261
+ });
262
+ }
263
+ }
264
+ }, {
265
+ key: "onExit",
266
+ value: function onExit() {
267
+ var oKPIModel = this.getView().getModel("kpiModel");
268
+
269
+ if (oKPIModel) {
270
+ oKPIModel.destroy();
271
+ }
272
+ }
273
+ }, {
274
+ key: "getKPIData",
275
+ value: function getKPIData() {
276
+ var oView = this.getView(),
277
+ sCustomData = oView.getContent()[0].data("KPIData");
278
+
279
+ if (sCustomData) {
280
+ var vData = typeof sCustomData === "string" ? JSON.parse(sCustomData) : sCustomData;
281
+
282
+ if ("customData" in vData) {
283
+ return vData["customData"];
284
+ } else {
285
+ return vData;
286
+ }
287
+ } else {
288
+ return undefined;
289
+ }
290
+ }
291
+ /**
292
+ * Loads tag data for a KPI.
293
+ *
294
+ * @param {KPIDefinition} kpiDefinition The definition of the KPI.
295
+ * @returns {Promise} Returns the Promise that is resolved when data is loaded.
296
+ */
297
+
298
+ }, {
299
+ key: "loadKPITagData",
300
+ value: function loadKPITagData(kpiDefinition) {
301
+ var _kpiDefinition$datapo, _kpiDefinition$select;
302
+
303
+ var oModel = this.oAppComponent.getModel();
304
+ var oKPIModel = this.getView().getModel("kpiModel");
305
+ var oListBinding = oModel.bindList("/" + kpiDefinition.entitySet);
306
+ var oAggregate = {}; // Main value + currency/unit
307
+
308
+ if ((_kpiDefinition$datapo = kpiDefinition.datapoint.unit) === null || _kpiDefinition$datapo === void 0 ? void 0 : _kpiDefinition$datapo.isPath) {
309
+ oAggregate[kpiDefinition.datapoint.propertyPath] = {
310
+ unit: kpiDefinition.datapoint.unit.value
311
+ };
312
+ } else {
313
+ oAggregate[kpiDefinition.datapoint.propertyPath] = {};
314
+ } // Property for criticality
315
+
316
+
317
+ if (kpiDefinition.datapoint.criticalityPath) {
318
+ oAggregate[kpiDefinition.datapoint.criticalityPath] = {};
319
+ }
320
+
321
+ oListBinding.setAggregation({
322
+ aggregate: oAggregate
323
+ }); // Manage SelectionVariant filters
324
+
325
+ if ((_kpiDefinition$select = kpiDefinition.selectionVariantFilterDefinitions) === null || _kpiDefinition$select === void 0 ? void 0 : _kpiDefinition$select.length) {
326
+ var aFilters = kpiDefinition.selectionVariantFilterDefinitions.map(createFilterFromDefinition);
327
+ oListBinding.filter(aFilters);
328
+ }
329
+
330
+ return oListBinding.requestContexts(0, 1).then(function (aContexts) {
331
+ if (aContexts.length) {
332
+ var _kpiDefinition$datapo2, _kpiDefinition$datapo3;
333
+
334
+ var currentLocale = new Locale(sap.ui.getCore().getConfiguration().getLanguage());
335
+ var rawUnit = ((_kpiDefinition$datapo2 = kpiDefinition.datapoint.unit) === null || _kpiDefinition$datapo2 === void 0 ? void 0 : _kpiDefinition$datapo2.isPath) ? aContexts[0].getProperty(kpiDefinition.datapoint.unit.value) : (_kpiDefinition$datapo3 = kpiDefinition.datapoint.unit) === null || _kpiDefinition$datapo3 === void 0 ? void 0 : _kpiDefinition$datapo3.value;
336
+
337
+ if (kpiDefinition.datapoint.unit && !rawUnit) {
338
+ // A unit/currency is defined, but its value is undefined --> multi-unit situation
339
+ oKPIModel.setProperty("/" + kpiDefinition.id + "/manifest/sap.card/data/json/mainValue", "*");
340
+ oKPIModel.setProperty("/" + kpiDefinition.id + "/manifest/sap.card/data/json/mainValueUnscaled", "*");
341
+ oKPIModel.setProperty("/" + kpiDefinition.id + "/manifest/sap.card/data/json/mainUnit", undefined);
342
+ oKPIModel.setProperty("/" + kpiDefinition.id + "/manifest/sap.card/data/json/mainCriticality", MessageType.None);
343
+ } else {
344
+ var _kpiDefinition$datapo4;
345
+
346
+ var isPercentage = ((_kpiDefinition$datapo4 = kpiDefinition.datapoint.unit) === null || _kpiDefinition$datapo4 === void 0 ? void 0 : _kpiDefinition$datapo4.isCurrency) === false && rawUnit === "%"; // Main KPI value
347
+
348
+ var rawValue = Number.parseFloat(aContexts[0].getProperty(kpiDefinition.datapoint.propertyPath));
349
+ var kpiValue = NumberFormat.getFloatInstance({
350
+ style: isPercentage ? undefined : "short",
351
+ minFractionDigits: 0,
352
+ maxFractionDigits: 1,
353
+ showScale: !isPercentage
354
+ }, currentLocale).format(rawValue);
355
+ oKPIModel.setProperty("/" + kpiDefinition.id + "/manifest/sap.card/data/json/mainValue", kpiValue);
356
+ var kpiValueUnscaled = NumberFormat.getFloatInstance({
357
+ maxFractionDigits: 2,
358
+ showScale: false,
359
+ groupingEnabled: true
360
+ }, currentLocale).format(rawValue);
361
+ oKPIModel.setProperty("/" + kpiDefinition.id + "/manifest/sap.card/data/json/mainValueUnscaled", kpiValueUnscaled); // Unit or currency
362
+
363
+ if (kpiDefinition.datapoint.unit && rawUnit) {
364
+ if (kpiDefinition.datapoint.unit.isCurrency) {
365
+ oKPIModel.setProperty("/" + kpiDefinition.id + "/manifest/sap.card/data/json/mainUnit", rawUnit);
366
+ } else {
367
+ // In case of unit of measure, we have to format it properly
368
+ var kpiUnit = NumberFormat.getUnitInstance({
369
+ showNumber: false
370
+ }, currentLocale).format(rawValue, rawUnit);
371
+ oKPIModel.setProperty("/" + kpiDefinition.id + "/manifest/sap.card/data/json/mainUnit", kpiUnit);
372
+ }
373
+ } // Criticality
374
+
375
+
376
+ if (kpiDefinition.datapoint.criticalityValue) {
377
+ // Criticality is a fixed value
378
+ oKPIModel.setProperty("/" + kpiDefinition.id + "/manifest/sap.card/data/json/mainCriticality", kpiDefinition.datapoint.criticalityValue);
379
+ } else if (kpiDefinition.datapoint.criticalityPath) {
380
+ // Criticality comes from another property (via a path)
381
+ var criticalityValue = messageTypeFromCriticality(aContexts[0].getProperty(kpiDefinition.datapoint.criticalityPath));
382
+ oKPIModel.setProperty("/" + kpiDefinition.id + "/manifest/sap.card/data/json/mainCriticality", criticalityValue);
383
+ } else if (kpiDefinition.datapoint.criticalityCalculationThresholds && kpiDefinition.datapoint.criticalityCalculationMode) {
384
+ // Criticality calculation
385
+ var calculatedCriticality;
386
+
387
+ switch (kpiDefinition.datapoint.criticalityCalculationMode) {
388
+ case "UI.ImprovementDirectionType/Target":
389
+ calculatedCriticality = messageTypeFromTargetCalculation(rawValue, kpiDefinition.datapoint.criticalityCalculationThresholds);
390
+ break;
391
+
392
+ case "UI.ImprovementDirectionType/Minimize":
393
+ calculatedCriticality = messageTypeFromMinimizeCalculation(rawValue, kpiDefinition.datapoint.criticalityCalculationThresholds);
394
+ break;
395
+
396
+ case "UI.ImprovementDirectionType/Maximize":
397
+ default:
398
+ calculatedCriticality = messageTypeFromMaximizeCalculation(rawValue, kpiDefinition.datapoint.criticalityCalculationThresholds);
399
+ break;
400
+ }
401
+
402
+ oKPIModel.setProperty("/" + kpiDefinition.id + "/manifest/sap.card/data/json/mainCriticality", calculatedCriticality);
403
+ } else {
404
+ // No criticality
405
+ oKPIModel.setProperty("/" + kpiDefinition.id + "/manifest/sap.card/data/json/mainCriticality", MessageType.None);
406
+ }
407
+ }
408
+ }
409
+ });
410
+ }
411
+ }]);
412
+
413
+ return KPIManagementControllerExtension;
414
+ }(ControllerExtension), (_applyDecoratedDescriptor(_class2.prototype, "onInit", [_dec2], Object.getOwnPropertyDescriptor(_class2.prototype, "onInit"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onExit", [_dec3], Object.getOwnPropertyDescriptor(_class2.prototype, "onExit"), _class2.prototype)), _class2)) || _class);
415
+ return KPIManagementControllerExtension;
416
+ }, false);
417
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIktQSU1hbmFnZW1lbnQudHMiXSwibmFtZXMiOlsibWVzc2FnZVR5cGVGcm9tQ3JpdGljYWxpdHkiLCJjcml0aWNhbGl0eVZhbHVlIiwiY3JpdGljYWxpdHlQcm9wZXJ0eSIsIk1lc3NhZ2VUeXBlIiwiRXJyb3IiLCJXYXJuaW5nIiwiU3VjY2VzcyIsIkluZm9ybWF0aW9uIiwiTm9uZSIsIm1lc3NhZ2VUeXBlRnJvbVRhcmdldENhbGN1bGF0aW9uIiwia3BpVmFsdWUiLCJhVGhyZXNob2xkcyIsInVuZGVmaW5lZCIsIm1lc3NhZ2VUeXBlRnJvbU1pbmltaXplQ2FsY3VsYXRpb24iLCJtZXNzYWdlVHlwZUZyb21NYXhpbWl6ZUNhbGN1bGF0aW9uIiwiY3JlYXRlRmlsdGVyRnJvbURlZmluaXRpb24iLCJmaWx0ZXJEZWZpbml0aW9uIiwicmFuZ2VzIiwibGVuZ3RoIiwiRmlsdGVyIiwicHJvcGVydHlQYXRoIiwib3BlcmF0b3IiLCJyYW5nZUxvdyIsInJhbmdlSGlnaCIsImFSYW5nZUZpbHRlcnMiLCJtYXAiLCJyYW5nZSIsImZpbHRlcnMiLCJhbmQiLCJLUElNYW5hZ2VtZW50Q29udHJvbGxlckV4dGVuc2lvbiIsIlVJNUNsYXNzIiwiQ29udHJvbGxlckV4dGVuc2lvbk1ldGFkYXRhIiwiT3ZlcnJpZGUiLCJhS1BJRGVmaW5pdGlvbnMiLCJnZXRLUElEYXRhIiwib1ZpZXciLCJnZXRWaWV3Iiwib0FwcENvbXBvbmVudCIsIkNvbW1vblV0aWxzIiwiZ2V0QXBwQ29tcG9uZW50Iiwib0tQSU1vZGVsIiwiSlNPTk1vZGVsIiwic2V0TW9kZWwiLCJmb3JFYWNoIiwia3BpRGVmaW5pdGlvbiIsIm9DYXJkTWFuaWZlc3QiLCJpZCIsInR5cGUiLCJ0ZWNobm9sb2d5IiwiZGF0YSIsImpzb24iLCJoZWFkZXIiLCJtYWluSW5kaWNhdG9yIiwibnVtYmVyIiwidW5pdCIsInRpdGxlIiwiY29udGVudCIsInBsb3RBcmVhIiwidGV4dCIsInZpc2libGUiLCJhbGlnbm1lbnQiLCJtZWFzdXJlQXhpcyIsImRpbWVuc2lvbkF4aXMiLCJwYXRoIiwic2V0UHJvcGVydHkiLCJtYW5pZmVzdCIsImxvYWRLUElUYWdEYXRhIiwiY2F0Y2giLCJlcnIiLCJMb2ciLCJlcnJvciIsImdldE1vZGVsIiwiZGVzdHJveSIsInNDdXN0b21EYXRhIiwiZ2V0Q29udGVudCIsInZEYXRhIiwiSlNPTiIsInBhcnNlIiwib01vZGVsIiwib0xpc3RCaW5kaW5nIiwiYmluZExpc3QiLCJlbnRpdHlTZXQiLCJvQWdncmVnYXRlIiwiZGF0YXBvaW50IiwiaXNQYXRoIiwidmFsdWUiLCJjcml0aWNhbGl0eVBhdGgiLCJzZXRBZ2dyZWdhdGlvbiIsImFnZ3JlZ2F0ZSIsInNlbGVjdGlvblZhcmlhbnRGaWx0ZXJEZWZpbml0aW9ucyIsImFGaWx0ZXJzIiwiZmlsdGVyIiwicmVxdWVzdENvbnRleHRzIiwidGhlbiIsImFDb250ZXh0cyIsImN1cnJlbnRMb2NhbGUiLCJMb2NhbGUiLCJzYXAiLCJ1aSIsImdldENvcmUiLCJnZXRDb25maWd1cmF0aW9uIiwiZ2V0TGFuZ3VhZ2UiLCJyYXdVbml0IiwiZ2V0UHJvcGVydHkiLCJpc1BlcmNlbnRhZ2UiLCJpc0N1cnJlbmN5IiwicmF3VmFsdWUiLCJOdW1iZXIiLCJwYXJzZUZsb2F0IiwiTnVtYmVyRm9ybWF0IiwiZ2V0RmxvYXRJbnN0YW5jZSIsInN0eWxlIiwibWluRnJhY3Rpb25EaWdpdHMiLCJtYXhGcmFjdGlvbkRpZ2l0cyIsInNob3dTY2FsZSIsImZvcm1hdCIsImtwaVZhbHVlVW5zY2FsZWQiLCJncm91cGluZ0VuYWJsZWQiLCJrcGlVbml0IiwiZ2V0VW5pdEluc3RhbmNlIiwic2hvd051bWJlciIsImNyaXRpY2FsaXR5Q2FsY3VsYXRpb25UaHJlc2hvbGRzIiwiY3JpdGljYWxpdHlDYWxjdWxhdGlvbk1vZGUiLCJjYWxjdWxhdGVkQ3JpdGljYWxpdHkiLCJDb250cm9sbGVyRXh0ZW5zaW9uIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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R0FBRzlHLGtDQUFrQyxDQUN6RDZGLFFBRHlELEVBRXpEOUQsYUFBYSxDQUFDdUMsU0FBZCxDQUF3QnNDLGdDQUZpQyxDQUExRDtBQUlBOztBQUVELHVCQUFLLHNDQUFMO0FBQ0E7QUFDQ0Usb0JBQUFBLHFCQUFxQixHQUFHN0csa0NBQWtDLENBQ3pENEYsUUFEeUQsRUFFekQ5RCxhQUFhLENBQUN1QyxTQUFkLENBQXdCc0MsZ0NBRmlDLENBQTFEO0FBSUE7QUFyQkY7O0FBdUJBakYsZ0JBQUFBLFNBQVMsQ0FBQ3dCLFdBQVYsQ0FDQyxNQUFNcEIsYUFBYSxDQUFDRSxFQUFwQixHQUF5Qiw4Q0FEMUIsRUFFQzZFLHFCQUZEO0FBSUEsZUFqQ00sTUFpQ0E7QUFDTjtBQUNBbkYsZ0JBQUFBLFNBQVMsQ0FBQ3dCLFdBQVYsQ0FBc0IsTUFBTXBCLGFBQWEsQ0FBQ0UsRUFBcEIsR0FBeUIsOENBQS9DLEVBQStGM0MsV0FBVyxDQUFDSyxJQUEzRztBQUNBO0FBQ0Q7QUFDRDtBQUNELFNBMUdNLENBQVA7QUEyR0E7Ozs7SUFoUDZDb0gsbUI7U0FtUGhDL0YsZ0MiLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbnRyb2xsZXJFeHRlbnNpb24gfSBmcm9tIFwic2FwL3VpL2NvcmUvbXZjXCI7XG5pbXBvcnQgeyBDb250cm9sbGVyRXh0ZW5zaW9uTWV0YWRhdGEgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnNcIjtcbmltcG9ydCB7IFVJNUNsYXNzLCBPdmVycmlkZSB9IGZyb20gXCIuLi9oZWxwZXJzL0NsYXNzU3VwcG9ydFwiO1xuaW1wb3J0IHsgSlNPTk1vZGVsIH0gZnJvbSBcInNhcC91aS9tb2RlbC9qc29uXCI7XG5pbXBvcnQgeyBMb2cgfSBmcm9tIFwic2FwL2Jhc2VcIjtcbmltcG9ydCB7IEtQSURlZmluaXRpb24gfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9jb250cm9scy9Db21tb24vS1BJXCI7XG5pbXBvcnQgeyBDb21tb25VdGlscyB9IGZyb20gXCJzYXAvZmUvY29yZVwiO1xuaW1wb3J0IHsgQ29udGV4dCB9IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjRcIjtcbmltcG9ydCB7IE1lc3NhZ2VUeXBlIH0gZnJvbSBcInNhcC9mZS9jb3JlL2Zvcm1hdHRlcnMvVGFibGVGb3JtYXR0ZXJUeXBlc1wiO1xuaW1wb3J0IHsgRmlsdGVyRGVmaW5pdGlvbiB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2hlbHBlcnMvU2VsZWN0aW9uVmFyaWFudEhlbHBlclwiO1xuaW1wb3J0IHsgTnVtYmVyRm9ybWF0IH0gZnJvbSBcInNhcC91aS9jb3JlL2Zvcm1hdFwiO1xuaW1wb3J0IHsgTG9jYWxlIH0gZnJvbSBcInNhcC91aS9jb3JlXCI7XG5pbXBvcnQgeyBGaWx0ZXIsIEZpbHRlck9wZXJhdG9yIH0gZnJvbSBcInNhcC91aS9tb2RlbFwiO1xuXG4vKipcbiAqIEZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSBhIG1lc3NhZ2Ugc3RhdGUgZnJvbSBhIGNyaXRpY2FsaXR5IHZhbHVlLlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfHN0cmluZ30gY3JpdGljYWxpdHlWYWx1ZSBUaGUgY3JpdGljYWxpdHkgdmFsdWVzLlxuICogQHJldHVybnMge01lc3NhZ2VUeXBlfSBSZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIE1lc3NhZ2VUeXBlXG4gKi9cbmZ1bmN0aW9uIG1lc3NhZ2VUeXBlRnJvbUNyaXRpY2FsaXR5KGNyaXRpY2FsaXR5VmFsdWU6IG51bWJlciB8IHN0cmluZyk6IE1lc3NhZ2VUeXBlIHtcblx0bGV0IGNyaXRpY2FsaXR5UHJvcGVydHk6IE1lc3NhZ2VUeXBlO1xuXG5cdHN3aXRjaCAoY3JpdGljYWxpdHlWYWx1ZSkge1xuXHRcdGNhc2UgMTpcblx0XHRcdGNyaXRpY2FsaXR5UHJvcGVydHkgPSBNZXNzYWdlVHlwZS5FcnJvcjtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgMjpcblx0XHRcdGNyaXRpY2FsaXR5UHJvcGVydHkgPSBNZXNzYWdlVHlwZS5XYXJuaW5nO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSAzOlxuXHRcdFx0Y3JpdGljYWxpdHlQcm9wZXJ0eSA9IE1lc3NhZ2VUeXBlLlN1Y2Nlc3M7XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIDU6XG5cdFx0XHRjcml0aWNhbGl0eVByb3BlcnR5ID0gTWVzc2FnZVR5cGUuSW5mb3JtYXRpb247XG5cdFx0XHRicmVhaztcblx0XHRkZWZhdWx0OlxuXHRcdFx0Y3JpdGljYWxpdHlQcm9wZXJ0eSA9IE1lc3NhZ2VUeXBlLk5vbmU7XG5cdH1cblxuXHRyZXR1cm4gY3JpdGljYWxpdHlQcm9wZXJ0eTtcbn1cblxuLyoqXG4gKiBGdW5jdGlvbiB0byBjYWxjdWxhdGUgdGhlIG1lc3NhZ2Ugc3RhdGUgZm9yIGEgY3JpdGljYWxpdHkgY2FsY3VsYXRpb24gb2YgdHlwZSAnVGFyZ2V0Jy5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0ga3BpVmFsdWUgVGhlIHZhbHVlIG9mIHRoZSBLUEkgdG8gYmUgdGVzdGVkIGFnYWluc3QuXG4gKiBAcGFyYW0ge251bWJlcltdfSBhVGhyZXNob2xkcyBUaHJlc2hvbGRzIHRvIGJlIHVzZWQgW0RldmlhdGlvblJhbmdlTG93VmFsdWUsVG9sZXJhbmNlUmFuZ2VMb3dWYWx1ZSxBY2NlcHRhbmNlUmFuZ2VMb3dWYWx1ZSxBY2NlcHRhbmNlUmFuZ2VIaWdoVmFsdWUsVG9sZXJhbmNlUmFuZ2VIaWdoVmFsdWUsRGV2aWF0aW9uUmFuZ2VIaWdoVmFsdWVdLlxuICogQHJldHVybnMge01lc3NhZ2VUeXBlfSBSZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIE1lc3NhZ2VUeXBlXG4gKi9cbmZ1bmN0aW9uIG1lc3NhZ2VUeXBlRnJvbVRhcmdldENhbGN1bGF0aW9uKGtwaVZhbHVlOiBudW1iZXIsIGFUaHJlc2hvbGRzOiAobnVtYmVyIHwgdW5kZWZpbmVkIHwgbnVsbClbXSk6IE1lc3NhZ2VUeXBlIHtcblx0bGV0IGNyaXRpY2FsaXR5UHJvcGVydHk6IE1lc3NhZ2VUeXBlO1xuXG5cdGlmIChhVGhyZXNob2xkc1swXSAhPT0gdW5kZWZpbmVkICYmIGFUaHJlc2hvbGRzWzBdICE9PSBudWxsICYmIGtwaVZhbHVlIDwgYVRocmVzaG9sZHNbMF0pIHtcblx0XHRjcml0aWNhbGl0eVByb3BlcnR5ID0gTWVzc2FnZVR5cGUuRXJyb3I7XG5cdH0gZWxzZSBpZiAoYVRocmVzaG9sZHNbMV0gIT09IHVuZGVmaW5lZCAmJiBhVGhyZXNob2xkc1sxXSAhPT0gbnVsbCAmJiBrcGlWYWx1ZSA8IGFUaHJlc2hvbGRzWzFdKSB7XG5cdFx0Y3JpdGljYWxpdHlQcm9wZXJ0eSA9IE1lc3NhZ2VUeXBlLldhcm5pbmc7XG5cdH0gZWxzZSBpZiAoYVRocmVzaG9sZHNbMl0gIT09IHVuZGVmaW5lZCAmJiBhVGhyZXNob2xkc1syXSAhPT0gbnVsbCAmJiBrcGlWYWx1ZSA8IGFUaHJlc2hvbGRzWzJdKSB7XG5cdFx0Y3JpdGljYWxpdHlQcm9wZXJ0eSA9IE1lc3NhZ2VUeXBlLk5vbmU7XG5cdH0gZWxzZSBpZiAoYVRocmVzaG9sZHNbNV0gIT09IHVuZGVmaW5lZCAmJiBhVGhyZXNob2xkc1s1XSAhPT0gbnVsbCAmJiBrcGlWYWx1ZSA+IGFUaHJlc2hvbGRzWzVdKSB7XG5cdFx0Y3JpdGljYWxpdHlQcm9wZXJ0eSA9IE1lc3NhZ2VUeXBlLkVycm9yO1xuXHR9IGVsc2UgaWYgKGFUaHJlc2hvbGRzWzRdICE9PSB1bmRlZmluZWQgJiYgYVRocmVzaG9sZHNbNF0gIT09IG51bGwgJiYga3BpVmFsdWUgPiBhVGhyZXNob2xkc1s0XSkge1xuXHRcdGNyaXRpY2FsaXR5UHJvcGVydHkgPSBNZXNzYWdlVHlwZS5XYXJuaW5nO1xuXHR9IGVsc2UgaWYgKGFUaHJlc2hvbGRzWzNdICE9PSB1bmRlZmluZWQgJiYgYVRocmVzaG9sZHNbM10gIT09IG51bGwgJiYga3BpVmFsdWUgPiBhVGhyZXNob2xkc1szXSkge1xuXHRcdGNyaXRpY2FsaXR5UHJvcGVydHkgPSBNZXNzYWdlVHlwZS5Ob25lO1xuXHR9IGVsc2Uge1xuXHRcdGNyaXRpY2FsaXR5UHJvcGVydHkgPSBNZXNzYWdlVHlwZS5TdWNjZXNzO1xuXHR9XG5cblx0cmV0dXJuIGNyaXRpY2FsaXR5UHJvcGVydHk7XG59XG5cbi8qKlxuICogRnVuY3Rpb24gdG8gY2FsY3VsYXRlIHRoZSBtZXNzYWdlIHN0YXRlIGZvciBhIGNyaXRpY2FsaXR5IGNhbGN1bGF0aW9uIG9mIHR5cGUgJ01pbmltaXplJy5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0ga3BpVmFsdWUgVGhlIHZhbHVlIG9mIHRoZSBLUEkgdG8gYmUgdGVzdGVkIGFnYWluc3QuXG4gKiBAcGFyYW0ge251bWJlcltdfSBhVGhyZXNob2xkcyBUaHJlc2hvbGRzIHRvIGJlIHVzZWQgW0FjY2VwdGFuY2VSYW5nZUhpZ2hWYWx1ZSxUb2xlcmFuY2VSYW5nZUhpZ2hWYWx1ZSxEZXZpYXRpb25SYW5nZUhpZ2hWYWx1ZV0uXG4gKiBAcmV0dXJucyB7TWVzc2FnZVR5cGV9IFJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgTWVzc2FnZVR5cGVcbiAqL1xuZnVuY3Rpb24gbWVzc2FnZVR5cGVGcm9tTWluaW1pemVDYWxjdWxhdGlvbihrcGlWYWx1ZTogbnVtYmVyLCBhVGhyZXNob2xkczogKG51bWJlciB8IHVuZGVmaW5lZCB8IG51bGwpW10pOiBNZXNzYWdlVHlwZSB7XG5cdGxldCBjcml0aWNhbGl0eVByb3BlcnR5OiBNZXNzYWdlVHlwZTtcblxuXHRpZiAoYVRocmVzaG9sZHNbMl0gIT09IHVuZGVmaW5lZCAmJiBhVGhyZXNob2xkc1syXSAhPT0gbnVsbCAmJiBrcGlWYWx1ZSA+IGFUaHJlc2hvbGRzWzJdKSB7XG5cdFx0Y3JpdGljYWxpdHlQcm9wZXJ0eSA9IE1lc3NhZ2VUeXBlLkVycm9yO1xuXHR9IGVsc2UgaWYgKGFUaHJlc2hvbGRzWzFdICE9PSB1bmRlZmluZWQgJiYgYVRocmVzaG9sZHNbMV0gIT09IG51bGwgJiYga3BpVmFsdWUgPiBhVGhyZXNob2xkc1sxXSkge1xuXHRcdGNyaXRpY2FsaXR5UHJvcGVydHkgPSBNZXNzYWdlVHlwZS5XYXJuaW5nO1xuXHR9IGVsc2UgaWYgKGFUaHJlc2hvbGRzWzBdICE9PSB1bmRlZmluZWQgJiYgYVRocmVzaG9sZHNbMF0gIT09IG51bGwgJiYga3BpVmFsdWUgPiBhVGhyZXNob2xkc1swXSkge1xuXHRcdGNyaXRpY2FsaXR5UHJvcGVydHkgPSBNZXNzYWdlVHlwZS5Ob25lO1xuXHR9IGVsc2Uge1xuXHRcdGNyaXRpY2FsaXR5UHJvcGVydHkgPSBNZXNzYWdlVHlwZS5TdWNjZXNzO1xuXHR9XG5cblx0cmV0dXJuIGNyaXRpY2FsaXR5UHJvcGVydHk7XG59XG5cbi8qKlxuICogRnVuY3Rpb24gdG8gY2FsY3VsYXRlIHRoZSBtZXNzYWdlIHN0YXRlIGZvciBhIGNyaXRpY2FsaXR5IGNhbGN1bGF0aW9uIG9mIHR5cGUgJ01heGltaXplJy5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0ga3BpVmFsdWUgVGhlIHZhbHVlIG9mIHRoZSBLUEkgdG8gYmUgdGVzdGVkIGFnYWluc3QuXG4gKiBAcGFyYW0ge251bWJlcltdfSBhVGhyZXNob2xkcyBUaHJlc2hvbGRzIHRvIGJlIHVzZWQgW0RldmlhdGlvblJhbmdlTG93VmFsdWUsVG9sZXJhbmNlUmFuZ2VMb3dWYWx1ZSxBY2NlcHRhbmNlUmFuZ2VMb3dWYWx1ZV0uXG4gKiBAcmV0dXJucyB7TWVzc2FnZVR5cGV9IFJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgTWVzc2FnZVR5cGVcbiAqL1xuZnVuY3Rpb24gbWVzc2FnZVR5cGVGcm9tTWF4aW1pemVDYWxjdWxhdGlvbihrcGlWYWx1ZTogbnVtYmVyLCBhVGhyZXNob2xkczogKG51bWJlciB8IHVuZGVmaW5lZCB8IG51bGwpW10pOiBNZXNzYWdlVHlwZSB7XG5cdGxldCBjcml0aWNhbGl0eVByb3BlcnR5OiBNZXNzYWdlVHlwZTtcblxuXHRpZiAoYVRocmVzaG9sZHNbMF0gIT09IHVuZGVmaW5lZCAmJiBhVGhyZXNob2xkc1swXSAhPT0gbnVsbCAmJiBrcGlWYWx1ZSA8IGFUaHJlc2hvbGRzWzBdKSB7XG5cdFx0Y3JpdGljYWxpdHlQcm9wZXJ0eSA9IE1lc3NhZ2VUeXBlLkVycm9yO1xuXHR9IGVsc2UgaWYgKGFUaHJlc2hvbGRzWzFdICE9PSB1bmRlZmluZWQgJiYgYVRocmVzaG9sZHNbMV0gIT09IG51bGwgJiYga3BpVmFsdWUgPCBhVGhyZXNob2xkc1sxXSkge1xuXHRcdGNyaXRpY2FsaXR5UHJvcGVydHkgPSBNZXNzYWdlVHlwZS5XYXJuaW5nO1xuXHR9IGVsc2UgaWYgKGFUaHJlc2hvbGRzWzJdICE9PSB1bmRlZmluZWQgJiYgYVRocmVzaG9sZHNbMl0gIT09IG51bGwgJiYga3BpVmFsdWUgPCBhVGhyZXNob2xkc1syXSkge1xuXHRcdGNyaXRpY2FsaXR5UHJvcGVydHkgPSBNZXNzYWdlVHlwZS5Ob25lO1xuXHR9IGVsc2Uge1xuXHRcdGNyaXRpY2FsaXR5UHJvcGVydHkgPSBNZXNzYWdlVHlwZS5TdWNjZXNzO1xuXHR9XG5cblx0cmV0dXJuIGNyaXRpY2FsaXR5UHJvcGVydHk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHNhcC51aS5tb2RlbC5GaWx0ZXIgZnJvbSBhIGZpbHRlciBkZWZpbml0aW9uLlxuICpcbiAqIEBwYXJhbSBmaWx0ZXJEZWZpbml0aW9uIFRoZSBmaWx0ZXIgZGVmaW5pdGlvblxuICogQHJldHVybnMgUmV0dXJucyBhIHNhcC51aS5tb2RlbC5GaWx0ZXIgZnJvbSB0aGUgZGVmaW5pdGlvbiwgb3IgdW5kZWZpbmVkIGlmIHRoZSBkZWZpbml0aW9uIGlzIGVtcHR5IChubyByYW5nZXMpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVGaWx0ZXJGcm9tRGVmaW5pdGlvbihmaWx0ZXJEZWZpbml0aW9uOiBGaWx0ZXJEZWZpbml0aW9uKTogRmlsdGVyIHwgdW5kZWZpbmVkIHtcblx0aWYgKGZpbHRlckRlZmluaXRpb24ucmFuZ2VzLmxlbmd0aCA9PT0gMCkge1xuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH0gZWxzZSBpZiAoZmlsdGVyRGVmaW5pdGlvbi5yYW5nZXMubGVuZ3RoID09PSAxKSB7XG5cdFx0cmV0dXJuIG5ldyBGaWx0ZXIoXG5cdFx0XHRmaWx0ZXJEZWZpbml0aW9uLnByb3BlcnR5UGF0aCxcblx0XHRcdGZpbHRlckRlZmluaXRpb24ucmFuZ2VzWzBdLm9wZXJhdG9yIGFzIEZpbHRlck9wZXJhdG9yLFxuXHRcdFx0ZmlsdGVyRGVmaW5pdGlvbi5yYW5nZXNbMF0ucmFuZ2VMb3csXG5cdFx0XHRmaWx0ZXJEZWZpbml0aW9uLnJhbmdlc1swXS5yYW5nZUhpZ2hcblx0XHQpO1xuXHR9IGVsc2Uge1xuXHRcdGNvbnN0IGFSYW5nZUZpbHRlcnMgPSBmaWx0ZXJEZWZpbml0aW9uLnJhbmdlcy5tYXAocmFuZ2UgPT4ge1xuXHRcdFx0cmV0dXJuIG5ldyBGaWx0ZXIoZmlsdGVyRGVmaW5pdGlvbi5wcm9wZXJ0eVBhdGgsIHJhbmdlLm9wZXJhdG9yIGFzIEZpbHRlck9wZXJhdG9yLCByYW5nZS5yYW5nZUxvdywgcmFuZ2UucmFuZ2VIaWdoKTtcblx0XHR9KTtcblx0XHRyZXR1cm4gbmV3IEZpbHRlcih7XG5cdFx0XHRmaWx0ZXJzOiBhUmFuZ2VGaWx0ZXJzLFxuXHRcdFx0YW5kOiBmYWxzZVxuXHRcdH0pO1xuXHR9XG59XG5cbi8qKlxuICogQGNsYXNzIEEgY29udHJvbGxlciBleHRlbnNpb24gZm9yIG1hbmFnaW5nIEtQSSBpbiBhbiBBbmFseXRpY2FsTGlzdFBhZ2VcbiAqXG4gKiBAbmFtZSBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5LUElNYW5hZ2VtZW50XG4gKiBAaGlkZWNvbnN0cnVjdG9yXG4gKlxuICogQHByaXZhdGVcbiAqIEBzaW5jZSAxLjkzLjBcbiAqL1xuQFVJNUNsYXNzKFwic2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuS1BJTWFuYWdlbWVudFwiLCBDb250cm9sbGVyRXh0ZW5zaW9uTWV0YWRhdGEpXG5jbGFzcyBLUElNYW5hZ2VtZW50Q29udHJvbGxlckV4dGVuc2lvbiBleHRlbmRzIENvbnRyb2xsZXJFeHRlbnNpb24ge1xuXHRwcm90ZWN0ZWQgYUtQSURlZmluaXRpb25zPzogS1BJRGVmaW5pdGlvbltdO1xuXHRwcm90ZWN0ZWQgb0FwcENvbXBvbmVudCE6IGFueTtcblxuXHRAT3ZlcnJpZGUoKVxuXHRwdWJsaWMgb25Jbml0KCk6IHZvaWQge1xuXHRcdHRoaXMuYUtQSURlZmluaXRpb25zID0gdGhpcy5nZXRLUElEYXRhKCk7XG5cblx0XHRpZiAodGhpcy5hS1BJRGVmaW5pdGlvbnMgJiYgdGhpcy5hS1BJRGVmaW5pdGlvbnMubGVuZ3RoKSB7XG5cdFx0XHRjb25zdCBvVmlldyA9IHRoaXMuZ2V0VmlldygpO1xuXHRcdFx0dGhpcy5vQXBwQ29tcG9uZW50ID0gQ29tbW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50KG9WaWV3KTtcblxuXHRcdFx0Ly8gQ3JlYXRlIGEgSlNPTiBtb2RlbCB0byBzdG9yZSBLUEkgZGF0YVxuXHRcdFx0Y29uc3Qgb0tQSU1vZGVsID0gbmV3IEpTT05Nb2RlbCgpO1xuXHRcdFx0b1ZpZXcuc2V0TW9kZWwob0tQSU1vZGVsLCBcImtwaU1vZGVsXCIpO1xuXG5cdFx0XHR0aGlzLmFLUElEZWZpbml0aW9ucy5mb3JFYWNoKGtwaURlZmluaXRpb24gPT4ge1xuXHRcdFx0XHQvLyBDcmVhdGUgdGhlIG1hbmlmZXN0IGZvciB0aGUgS1BJIGNhcmQgYW5kIHN0b3JlIGl0IGluIHRoZSBLUEkgbW9kZWxcblx0XHRcdFx0Y29uc3Qgb0NhcmRNYW5pZmVzdCA9IHtcblx0XHRcdFx0XHRcInNhcC5hcHBcIjoge1xuXHRcdFx0XHRcdFx0aWQ6IFwic2FwLmZlXCIsXG5cdFx0XHRcdFx0XHR0eXBlOiBcImNhcmRcIlxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XCJzYXAudWlcIjoge1xuXHRcdFx0XHRcdFx0dGVjaG5vbG9neTogXCJVSTVcIlxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XCJzYXAuY2FyZFwiOiB7XG5cdFx0XHRcdFx0XHR0eXBlOiBcIkFuYWx5dGljYWxcIixcblx0XHRcdFx0XHRcdGRhdGE6IHtcblx0XHRcdFx0XHRcdFx0anNvbjoge31cblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRoZWFkZXI6IHtcblx0XHRcdFx0XHRcdFx0dHlwZTogXCJOdW1lcmljXCIsXG5cdFx0XHRcdFx0XHRcdG1haW5JbmRpY2F0b3I6IHtcblx0XHRcdFx0XHRcdFx0XHRudW1iZXI6IFwie21haW5WYWx1ZX1cIixcblx0XHRcdFx0XHRcdFx0XHR1bml0OiBcInttYWluVW5pdH1cIlxuXHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHR0aXRsZTogXCJ7Y2FyZFRpdGxlfVwiXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0Y29udGVudDoge1xuXHRcdFx0XHRcdFx0XHRwbG90QXJlYToge1xuXHRcdFx0XHRcdFx0XHRcdFwiZGF0YUxhYmVsXCI6IHtcblx0XHRcdFx0XHRcdFx0XHRcdFwidmlzaWJsZVwiOiBmYWxzZVxuXHRcdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdFx0XCJjYXRlZ29yeUF4aXNUZXh0XCI6IHtcblx0XHRcdFx0XHRcdFx0XHRcdFwidmlzaWJsZVwiOiBmYWxzZVxuXHRcdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdFx0XCJ2YWx1ZUF4aXNUZXh0XCI6IHtcblx0XHRcdFx0XHRcdFx0XHRcdFwidmlzaWJsZVwiOiBmYWxzZVxuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0dGl0bGU6IHtcblx0XHRcdFx0XHRcdFx0XHR0ZXh0OiBcIntjaGFydFRpdGxlfVwiLFxuXHRcdFx0XHRcdFx0XHRcdHZpc2libGU6IHRydWUsXG5cdFx0XHRcdFx0XHRcdFx0YWxpZ25tZW50OiBcIkxlZnRcIlxuXHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHRtZWFzdXJlQXhpczogXCJ2YWx1ZUF4aXNcIixcblx0XHRcdFx0XHRcdFx0ZGltZW5zaW9uQXhpczogXCJjYXRlZ29yeUF4aXNcIixcblx0XHRcdFx0XHRcdFx0ZGF0YToge1xuXHRcdFx0XHRcdFx0XHRcdHBhdGg6IFwiL2NoYXJ0RGF0YVwiXG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH07XG5cblx0XHRcdFx0b0tQSU1vZGVsLnNldFByb3BlcnR5KFwiL1wiICsga3BpRGVmaW5pdGlvbi5pZCwge1xuXHRcdFx0XHRcdG1hbmlmZXN0OiBvQ2FyZE1hbmlmZXN0XG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdC8vIExvYWQgdGFnIGRhdGEgZm9yIHRoZSBLUElcblx0XHRcdFx0dGhpcy5sb2FkS1BJVGFnRGF0YShrcGlEZWZpbml0aW9uKS5jYXRjaChmdW5jdGlvbihlcnI6IGFueSkge1xuXHRcdFx0XHRcdExvZy5lcnJvcihlcnIpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXHRcdH1cblx0fVxuXG5cdEBPdmVycmlkZSgpXG5cdHB1YmxpYyBvbkV4aXQoKTogdm9pZCB7XG5cdFx0Y29uc3Qgb0tQSU1vZGVsID0gdGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJrcGlNb2RlbFwiKSBhcyBKU09OTW9kZWw7XG5cblx0XHRpZiAob0tQSU1vZGVsKSB7XG5cdFx0XHRvS1BJTW9kZWwuZGVzdHJveSgpO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgZ2V0S1BJRGF0YSgpOiBLUElEZWZpbml0aW9uW10gfCB1bmRlZmluZWQge1xuXHRcdGNvbnN0IG9WaWV3ID0gdGhpcy5nZXRWaWV3KCksXG5cdFx0XHRzQ3VzdG9tRGF0YSA9IG9WaWV3LmdldENvbnRlbnQoKVswXS5kYXRhKFwiS1BJRGF0YVwiKTtcblxuXHRcdGlmIChzQ3VzdG9tRGF0YSkge1xuXHRcdFx0Y29uc3QgdkRhdGEgPSB0eXBlb2Ygc0N1c3RvbURhdGEgPT09IFwic3RyaW5nXCIgPyBKU09OLnBhcnNlKHNDdXN0b21EYXRhKSA6IHNDdXN0b21EYXRhO1xuXHRcdFx0aWYgKFwiY3VzdG9tRGF0YVwiIGluIHZEYXRhKSB7XG5cdFx0XHRcdHJldHVybiB2RGF0YVtcImN1c3RvbURhdGFcIl07XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXR1cm4gdkRhdGE7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIExvYWRzIHRhZyBkYXRhIGZvciBhIEtQSS5cblx0ICpcblx0ICogQHBhcmFtIHtLUElEZWZpbml0aW9ufSBrcGlEZWZpbml0aW9uIFRoZSBkZWZpbml0aW9uIG9mIHRoZSBLUEkuXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBSZXR1cm5zIHRoZSBQcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2hlbiBkYXRhIGlzIGxvYWRlZC5cblx0ICovXG5cdHByb3RlY3RlZCBsb2FkS1BJVGFnRGF0YShrcGlEZWZpbml0aW9uOiBLUElEZWZpbml0aW9uKTogYW55IHtcblx0XHRjb25zdCBvTW9kZWwgPSB0aGlzLm9BcHBDb21wb25lbnQuZ2V0TW9kZWwoKTtcblx0XHRjb25zdCBvS1BJTW9kZWwgPSB0aGlzLmdldFZpZXcoKS5nZXRNb2RlbChcImtwaU1vZGVsXCIpIGFzIEpTT05Nb2RlbDtcblx0XHRjb25zdCBvTGlzdEJpbmRpbmcgPSBvTW9kZWwuYmluZExpc3QoXCIvXCIgKyBrcGlEZWZpbml0aW9uLmVudGl0eVNldCk7XG5cdFx0Y29uc3Qgb0FnZ3JlZ2F0ZTogUmVjb3JkPHN0cmluZywgeyB1bml0Pzogc3RyaW5nIH0+ID0ge307XG5cblx0XHQvLyBNYWluIHZhbHVlICsgY3VycmVuY3kvdW5pdFxuXHRcdGlmIChrcGlEZWZpbml0aW9uLmRhdGFwb2ludC51bml0Py5pc1BhdGgpIHtcblx0XHRcdG9BZ2dyZWdhdGVba3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQucHJvcGVydHlQYXRoXSA9IHsgdW5pdDoga3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudW5pdC52YWx1ZSB9O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRvQWdncmVnYXRlW2twaURlZmluaXRpb24uZGF0YXBvaW50LnByb3BlcnR5UGF0aF0gPSB7fTtcblx0XHR9XG5cblx0XHQvLyBQcm9wZXJ0eSBmb3IgY3JpdGljYWxpdHlcblx0XHRpZiAoa3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQuY3JpdGljYWxpdHlQYXRoKSB7XG5cdFx0XHRvQWdncmVnYXRlW2twaURlZmluaXRpb24uZGF0YXBvaW50LmNyaXRpY2FsaXR5UGF0aF0gPSB7fTtcblx0XHR9XG5cdFx0b0xpc3RCaW5kaW5nLnNldEFnZ3JlZ2F0aW9uKHsgYWdncmVnYXRlOiBvQWdncmVnYXRlIH0pO1xuXG5cdFx0Ly8gTWFuYWdlIFNlbGVjdGlvblZhcmlhbnQgZmlsdGVyc1xuXHRcdGlmIChrcGlEZWZpbml0aW9uLnNlbGVjdGlvblZhcmlhbnRGaWx0ZXJEZWZpbml0aW9ucz8ubGVuZ3RoKSB7XG5cdFx0XHRjb25zdCBhRmlsdGVycyA9IGtwaURlZmluaXRpb24uc2VsZWN0aW9uVmFyaWFudEZpbHRlckRlZmluaXRpb25zLm1hcChjcmVhdGVGaWx0ZXJGcm9tRGVmaW5pdGlvbik7XG5cdFx0XHRvTGlzdEJpbmRpbmcuZmlsdGVyKGFGaWx0ZXJzKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gb0xpc3RCaW5kaW5nLnJlcXVlc3RDb250ZXh0cygwLCAxKS50aGVuKChhQ29udGV4dHM6IENvbnRleHRbXSkgPT4ge1xuXHRcdFx0aWYgKGFDb250ZXh0cy5sZW5ndGgpIHtcblx0XHRcdFx0Y29uc3QgY3VycmVudExvY2FsZSA9IG5ldyBMb2NhbGUoXG5cdFx0XHRcdFx0c2FwLnVpXG5cdFx0XHRcdFx0XHQuZ2V0Q29yZSgpXG5cdFx0XHRcdFx0XHQuZ2V0Q29uZmlndXJhdGlvbigpXG5cdFx0XHRcdFx0XHQuZ2V0TGFuZ3VhZ2UoKVxuXHRcdFx0XHQpO1xuXHRcdFx0XHRjb25zdCByYXdVbml0ID0ga3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudW5pdD8uaXNQYXRoXG5cdFx0XHRcdFx0PyBhQ29udGV4dHNbMF0uZ2V0UHJvcGVydHkoa3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudW5pdC52YWx1ZSlcblx0XHRcdFx0XHQ6IGtwaURlZmluaXRpb24uZGF0YXBvaW50LnVuaXQ/LnZhbHVlO1xuXG5cdFx0XHRcdGlmIChrcGlEZWZpbml0aW9uLmRhdGFwb2ludC51bml0ICYmICFyYXdVbml0KSB7XG5cdFx0XHRcdFx0Ly8gQSB1bml0L2N1cnJlbmN5IGlzIGRlZmluZWQsIGJ1dCBpdHMgdmFsdWUgaXMgdW5kZWZpbmVkIC0tPiBtdWx0aS11bml0IHNpdHVhdGlvblxuXHRcdFx0XHRcdG9LUElNb2RlbC5zZXRQcm9wZXJ0eShcIi9cIiArIGtwaURlZmluaXRpb24uaWQgKyBcIi9tYW5pZmVzdC9zYXAuY2FyZC9kYXRhL2pzb24vbWFpblZhbHVlXCIsIFwiKlwiKTtcblx0XHRcdFx0XHRvS1BJTW9kZWwuc2V0UHJvcGVydHkoXCIvXCIgKyBrcGlEZWZpbml0aW9uLmlkICsgXCIvbWFuaWZlc3Qvc2FwLmNhcmQvZGF0YS9qc29uL21haW5WYWx1ZVVuc2NhbGVkXCIsIFwiKlwiKTtcblx0XHRcdFx0XHRvS1BJTW9kZWwuc2V0UHJvcGVydHkoXCIvXCIgKyBrcGlEZWZpbml0aW9uLmlkICsgXCIvbWFuaWZlc3Qvc2FwLmNhcmQvZGF0YS9qc29uL21haW5Vbml0XCIsIHVuZGVmaW5lZCk7XG5cdFx0XHRcdFx0b0tQSU1vZGVsLnNldFByb3BlcnR5KFwiL1wiICsga3BpRGVmaW5pdGlvbi5pZCArIFwiL21hbmlmZXN0L3NhcC5jYXJkL2RhdGEvanNvbi9tYWluQ3JpdGljYWxpdHlcIiwgTWVzc2FnZVR5cGUuTm9uZSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Y29uc3QgaXNQZXJjZW50YWdlID0ga3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudW5pdD8uaXNDdXJyZW5jeSA9PT0gZmFsc2UgJiYgcmF3VW5pdCA9PT0gXCIlXCI7XG5cblx0XHRcdFx0XHQvLyBNYWluIEtQSSB2YWx1ZVxuXHRcdFx0XHRcdGNvbnN0IHJhd1ZhbHVlID0gTnVtYmVyLnBhcnNlRmxvYXQoYUNvbnRleHRzWzBdLmdldFByb3BlcnR5KGtwaURlZmluaXRpb24uZGF0YXBvaW50LnByb3BlcnR5UGF0aCkpO1xuXHRcdFx0XHRcdGNvbnN0IGtwaVZhbHVlID0gTnVtYmVyRm9ybWF0LmdldEZsb2F0SW5zdGFuY2UoXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdHN0eWxlOiBpc1BlcmNlbnRhZ2UgPyB1bmRlZmluZWQgOiBcInNob3J0XCIsXG5cdFx0XHRcdFx0XHRcdG1pbkZyYWN0aW9uRGlnaXRzOiAwLFxuXHRcdFx0XHRcdFx0XHRtYXhGcmFjdGlvbkRpZ2l0czogMSxcblx0XHRcdFx0XHRcdFx0c2hvd1NjYWxlOiAhaXNQZXJjZW50YWdlXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0Y3VycmVudExvY2FsZVxuXHRcdFx0XHRcdCkuZm9ybWF0KHJhd1ZhbHVlKTtcblx0XHRcdFx0XHRvS1BJTW9kZWwuc2V0UHJvcGVydHkoXCIvXCIgKyBrcGlEZWZpbml0aW9uLmlkICsgXCIvbWFuaWZlc3Qvc2FwLmNhcmQvZGF0YS9qc29uL21haW5WYWx1ZVwiLCBrcGlWYWx1ZSk7XG5cdFx0XHRcdFx0Y29uc3Qga3BpVmFsdWVVbnNjYWxlZCA9IE51bWJlckZvcm1hdC5nZXRGbG9hdEluc3RhbmNlKFxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRtYXhGcmFjdGlvbkRpZ2l0czogMixcblx0XHRcdFx0XHRcdFx0c2hvd1NjYWxlOiBmYWxzZSxcblx0XHRcdFx0XHRcdFx0Z3JvdXBpbmdFbmFibGVkOiB0cnVlXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0Y3VycmVudExvY2FsZVxuXHRcdFx0XHRcdCkuZm9ybWF0KHJhd1ZhbHVlKTtcblx0XHRcdFx0XHRvS1BJTW9kZWwuc2V0UHJvcGVydHkoXCIvXCIgKyBrcGlEZWZpbml0aW9uLmlkICsgXCIvbWFuaWZlc3Qvc2FwLmNhcmQvZGF0YS9qc29uL21haW5WYWx1ZVVuc2NhbGVkXCIsIGtwaVZhbHVlVW5zY2FsZWQpO1xuXG5cdFx0XHRcdFx0Ly8gVW5pdCBvciBjdXJyZW5jeVxuXHRcdFx0XHRcdGlmIChrcGlEZWZpbml0aW9uLmRhdGFwb2ludC51bml0ICYmIHJhd1VuaXQpIHtcblx0XHRcdFx0XHRcdGlmIChrcGlEZWZpbml0aW9uLmRhdGFwb2ludC51bml0LmlzQ3VycmVuY3kpIHtcblx0XHRcdFx0XHRcdFx0b0tQSU1vZGVsLnNldFByb3BlcnR5KFwiL1wiICsga3BpRGVmaW5pdGlvbi5pZCArIFwiL21hbmlmZXN0L3NhcC5jYXJkL2RhdGEvanNvbi9tYWluVW5pdFwiLCByYXdVbml0KTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdC8vIEluIGNhc2Ugb2YgdW5pdCBvZiBtZWFzdXJlLCB3ZSBoYXZlIHRvIGZvcm1hdCBpdCBwcm9wZXJseVxuXHRcdFx0XHRcdFx0XHRjb25zdCBrcGlVbml0ID0gTnVtYmVyRm9ybWF0LmdldFVuaXRJbnN0YW5jZSh7IHNob3dOdW1iZXI6IGZhbHNlIH0sIGN1cnJlbnRMb2NhbGUpLmZvcm1hdChyYXdWYWx1ZSwgcmF3VW5pdCk7XG5cdFx0XHRcdFx0XHRcdG9LUElNb2RlbC5zZXRQcm9wZXJ0eShcIi9cIiArIGtwaURlZmluaXRpb24uaWQgKyBcIi9tYW5pZmVzdC9zYXAuY2FyZC9kYXRhL2pzb24vbWFpblVuaXRcIiwga3BpVW5pdCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gQ3JpdGljYWxpdHlcblx0XHRcdFx0XHRpZiAoa3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQuY3JpdGljYWxpdHlWYWx1ZSkge1xuXHRcdFx0XHRcdFx0Ly8gQ3JpdGljYWxpdHkgaXMgYSBmaXhlZCB2YWx1ZVxuXHRcdFx0XHRcdFx0b0tQSU1vZGVsLnNldFByb3BlcnR5KFxuXHRcdFx0XHRcdFx0XHRcIi9cIiArIGtwaURlZmluaXRpb24uaWQgKyBcIi9tYW5pZmVzdC9zYXAuY2FyZC9kYXRhL2pzb24vbWFpbkNyaXRpY2FsaXR5XCIsXG5cdFx0XHRcdFx0XHRcdGtwaURlZmluaXRpb24uZGF0YXBvaW50LmNyaXRpY2FsaXR5VmFsdWVcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fSBlbHNlIGlmIChrcGlEZWZpbml0aW9uLmRhdGFwb2ludC5jcml0aWNhbGl0eVBhdGgpIHtcblx0XHRcdFx0XHRcdC8vIENyaXRpY2FsaXR5IGNvbWVzIGZyb20gYW5vdGhlciBwcm9wZXJ0eSAodmlhIGEgcGF0aClcblx0XHRcdFx0XHRcdGNvbnN0IGNyaXRpY2FsaXR5VmFsdWUgPSBtZXNzYWdlVHlwZUZyb21Dcml0aWNhbGl0eShcblx0XHRcdFx0XHRcdFx0YUNvbnRleHRzWzBdLmdldFByb3BlcnR5KGtwaURlZmluaXRpb24uZGF0YXBvaW50LmNyaXRpY2FsaXR5UGF0aClcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRvS1BJTW9kZWwuc2V0UHJvcGVydHkoXCIvXCIgKyBrcGlEZWZpbml0aW9uLmlkICsgXCIvbWFuaWZlc3Qvc2FwLmNhcmQvZGF0YS9qc29uL21haW5Dcml0aWNhbGl0eVwiLCBjcml0aWNhbGl0eVZhbHVlKTtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0XHRcdFx0a3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQuY3JpdGljYWxpdHlDYWxjdWxhdGlvblRocmVzaG9sZHMgJiZcblx0XHRcdFx0XHRcdGtwaURlZmluaXRpb24uZGF0YXBvaW50LmNyaXRpY2FsaXR5Q2FsY3VsYXRpb25Nb2RlXG5cdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHQvLyBDcml0aWNhbGl0eSBjYWxjdWxhdGlvblxuXHRcdFx0XHRcdFx0bGV0IGNhbGN1bGF0ZWRDcml0aWNhbGl0eTogTWVzc2FnZVR5cGU7XG5cdFx0XHRcdFx0XHRzd2l0Y2ggKGtwaURlZmluaXRpb24uZGF0YXBvaW50LmNyaXRpY2FsaXR5Q2FsY3VsYXRpb25Nb2RlKSB7XG5cdFx0XHRcdFx0XHRcdGNhc2UgXCJVSS5JbXByb3ZlbWVudERpcmVjdGlvblR5cGUvVGFyZ2V0XCI6XG5cdFx0XHRcdFx0XHRcdFx0Y2FsY3VsYXRlZENyaXRpY2FsaXR5ID0gbWVzc2FnZVR5cGVGcm9tVGFyZ2V0Q2FsY3VsYXRpb24oXG5cdFx0XHRcdFx0XHRcdFx0XHRyYXdWYWx1ZSxcblx0XHRcdFx0XHRcdFx0XHRcdGtwaURlZmluaXRpb24uZGF0YXBvaW50LmNyaXRpY2FsaXR5Q2FsY3VsYXRpb25UaHJlc2hvbGRzXG5cdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdFx0XHRjYXNlIFwiVUkuSW1wcm92ZW1lbnREaXJlY3Rpb25UeXBlL01pbmltaXplXCI6XG5cdFx0XHRcdFx0XHRcdFx0Y2FsY3VsYXRlZENyaXRpY2FsaXR5ID0gbWVzc2FnZVR5cGVGcm9tTWluaW1pemVDYWxjdWxhdGlvbihcblx0XHRcdFx0XHRcdFx0XHRcdHJhd1ZhbHVlLFxuXHRcdFx0XHRcdFx0XHRcdFx0a3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQuY3JpdGljYWxpdHlDYWxjdWxhdGlvblRocmVzaG9sZHNcblx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0XHRcdGNhc2UgXCJVSS5JbXByb3ZlbWVudERpcmVjdGlvblR5cGUvTWF4aW1pemVcIjpcblx0XHRcdFx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRcdFx0XHRjYWxjdWxhdGVkQ3JpdGljYWxpdHkgPSBtZXNzYWdlVHlwZUZyb21NYXhpbWl6ZUNhbGN1bGF0aW9uKFxuXHRcdFx0XHRcdFx0XHRcdFx0cmF3VmFsdWUsXG5cdFx0XHRcdFx0XHRcdFx0XHRrcGlEZWZpbml0aW9uLmRhdGFwb2ludC5jcml0aWNhbGl0eUNhbGN1bGF0aW9uVGhyZXNob2xkc1xuXHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRvS1BJTW9kZWwuc2V0UHJvcGVydHkoXG5cdFx0XHRcdFx0XHRcdFwiL1wiICsga3BpRGVmaW5pdGlvbi5pZCArIFwiL21hbmlmZXN0L3NhcC5jYXJkL2RhdGEvanNvbi9tYWluQ3JpdGljYWxpdHlcIixcblx0XHRcdFx0XHRcdFx0Y2FsY3VsYXRlZENyaXRpY2FsaXR5XG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHQvLyBObyBjcml0aWNhbGl0eVxuXHRcdFx0XHRcdFx0b0tQSU1vZGVsLnNldFByb3BlcnR5KFwiL1wiICsga3BpRGVmaW5pdGlvbi5pZCArIFwiL21hbmlmZXN0L3NhcC5jYXJkL2RhdGEvanNvbi9tYWluQ3JpdGljYWxpdHlcIiwgTWVzc2FnZVR5cGUuTm9uZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgS1BJTWFuYWdlbWVudENvbnRyb2xsZXJFeHRlbnNpb247XG4iXX0=