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