@sapui5/sap.fe.core 1.102.4 → 1.102.6

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.
@@ -0,0 +1,295 @@
1
+ import Log from "sap/base/Log";
2
+ import type Event from "sap/ui/base/Event";
3
+ import EventProvider from "sap/ui/base/EventProvider";
4
+ import Control from "sap/ui/core/Control";
5
+ import Chart from "sap/ui/mdc/Chart";
6
+ import FilterBar from "sap/ui/mdc/FilterBar";
7
+ import Table from "sap/ui/mdc/Table";
8
+ import Binding from "sap/ui/model/Binding";
9
+
10
+ class DataQueryWatcher {
11
+ protected _aBindingRegistrations: { binding: Binding; boundControl?: Control; requestedCount: number; receivedCount: number }[] = [];
12
+ protected _aOtherEventSources: EventProvider[] = [];
13
+ protected _isSearchPending = false;
14
+ protected _isDataReceived?: boolean;
15
+ protected _aMDCTables: Table[] = [];
16
+ protected _aMDCCharts: Chart[] = [];
17
+
18
+ public constructor(protected _oEventProvider: EventProvider, protected _fnOnFinished: () => void) {}
19
+
20
+ // Accessors
21
+ public isSearchPending() {
22
+ return this._isSearchPending;
23
+ }
24
+ public isDataReceived() {
25
+ return this._isDataReceived;
26
+ }
27
+ public resetDataReceived() {
28
+ this._isDataReceived = undefined;
29
+ }
30
+
31
+ /**
32
+ * Reset the state: unsubscribe to all data events and remove all registered objects.
33
+ */
34
+ public reset(): void {
35
+ // Remove all remaining callbacks
36
+ this._aBindingRegistrations.forEach((reg) => {
37
+ reg.binding.detachEvent("dataRequested", this.onDataRequested, this);
38
+ reg.binding.detachEvent("dataReceived", this.onDataReceived, this);
39
+ });
40
+ this._aOtherEventSources.forEach((oElement: any) => {
41
+ oElement.detachEvent("search", this.onSearch, this);
42
+ oElement.detachEvent("bindingUpdated", this.register, this);
43
+ });
44
+
45
+ this._aBindingRegistrations = [];
46
+ this._aOtherEventSources = [];
47
+ this._aMDCTables = [];
48
+ this._aMDCCharts = [];
49
+ this._isSearchPending = false;
50
+ this._isDataReceived = undefined;
51
+ }
52
+
53
+ // //////////////////////////////////////////////////
54
+ // Callback when data is received on a binding.
55
+ protected onDataReceived(oEvent: Event, params: { triggeredBySearch: boolean }): void {
56
+ // Look for the corresponding binding registration
57
+ const binding = oEvent.getSource() as Binding;
58
+ const bindingRegistration = this._aBindingRegistrations.find((reg) => {
59
+ return reg.binding === binding;
60
+ });
61
+ if (!bindingRegistration) {
62
+ Log.error("PageReady - data received on an unregistered binding");
63
+ return;
64
+ }
65
+
66
+ switch ((binding as any).getGroupId()) {
67
+ case "$auto.Workers":
68
+ this._oEventProvider.fireEvent("workersBatchReceived");
69
+ break;
70
+ case "$auto.Heroes":
71
+ this._oEventProvider.fireEvent("heroesBatchReceived");
72
+ break;
73
+ default:
74
+ }
75
+ bindingRegistration.receivedCount++;
76
+
77
+ if (bindingRegistration.receivedCount < bindingRegistration.requestedCount) {
78
+ // There are other request pending --> resubscribe to wait until they return
79
+ binding.attachEventOnce("dataReceived", { triggeredBySearch: params.triggeredBySearch }, this.onDataReceived, this);
80
+ return;
81
+ }
82
+
83
+ // Check if at least one binding has requested data, and all bindings that have requested data have received it
84
+ const bAllDone =
85
+ this._aBindingRegistrations.some((reg) => {
86
+ return reg.requestedCount !== 0;
87
+ }) &&
88
+ this._aBindingRegistrations.every((reg) => {
89
+ return reg.requestedCount === 0 || reg.receivedCount >= reg.requestedCount;
90
+ });
91
+
92
+ if (params.triggeredBySearch || bindingRegistration.receivedCount >= bindingRegistration.requestedCount) {
93
+ this._isSearchPending = false;
94
+ }
95
+
96
+ if (bAllDone) {
97
+ this._isDataReceived = true;
98
+ this._fnOnFinished();
99
+ }
100
+ }
101
+
102
+ // //////////////////////////////////////////////////
103
+ // Callback when data is requested on a binding.
104
+ protected onDataRequested(oEvent: Event, params: { triggeredBySearch: boolean }): void {
105
+ // Look for the corresponding binding registration
106
+ const binding = oEvent.getSource() as Binding;
107
+ const bindingRegistration = this._aBindingRegistrations.find((reg) => {
108
+ return reg.binding === binding;
109
+ });
110
+ if (!bindingRegistration) {
111
+ Log.error("PageReady - data requested on an unregistered binding");
112
+ return;
113
+ }
114
+
115
+ bindingRegistration.requestedCount++;
116
+ this._isDataReceived = false;
117
+
118
+ if (bindingRegistration.requestedCount - bindingRegistration.receivedCount === 1) {
119
+ // Listen to dataReceived only if there's no other request pending
120
+ // Otherwise the 'dataReceived' handler would be called several times when the first query returns
121
+ // and we wouldn't wait for all queries to be finished
122
+ // (we will resubscribe to the dataReceived event in onDataReceived if necessary)
123
+ binding.attachEventOnce("dataReceived", { triggeredBySearch: params.triggeredBySearch }, this.onDataReceived, this);
124
+ }
125
+ }
126
+
127
+ // //////////////////////////////////////////////////
128
+ // Callback when a search is triggered from a filterbar
129
+ protected onSearch(oEvent: Event): void {
130
+ const aMDCTableLinkedToFilterBar = this._aMDCTables.filter((oTable) => {
131
+ return (oEvent.getSource() as any).sId === oTable.getFilter() && oTable.getVisible();
132
+ });
133
+ const aMDCChartsLinkedToFilterBar = this._aMDCCharts.filter((oChart) => {
134
+ return (oEvent.getSource() as any).sId === oChart.getFilter() && oChart.getVisible();
135
+ });
136
+
137
+ if (aMDCTableLinkedToFilterBar.length > 0 || aMDCChartsLinkedToFilterBar.length > 0) {
138
+ this._isSearchPending = true;
139
+ }
140
+ aMDCTableLinkedToFilterBar.forEach((oTable) => {
141
+ this.registerTable(oTable, true);
142
+ });
143
+ aMDCChartsLinkedToFilterBar.forEach(async (oChart: any) => {
144
+ try {
145
+ if (oChart.innerChartBoundPromise) {
146
+ await oChart.innerChartBoundPromise;
147
+ }
148
+ this.registerChart(oChart, true);
149
+ } catch (oError: any) {
150
+ Log.error("Cannot find a inner bound chart", oError);
151
+ }
152
+ });
153
+ }
154
+
155
+ // //////////////////////////////////////////////////
156
+ // Register a binding (with an optional table/chart)
157
+ // and attach callbacks on dateRequested/dataReceived events
158
+ protected register(_event: Event | null, data: { binding?: Binding; table?: Table; chart?: Chart; triggeredBySearch: boolean }): void {
159
+ const binding: Binding | undefined =
160
+ data.binding ||
161
+ data.table?.getRowBinding() ||
162
+ (data.chart as any)?.getControlDelegate().getInnerChart(data.chart).getBinding("data");
163
+ const boundControl = (data.table || data.chart) as Control | undefined;
164
+
165
+ if (!binding) {
166
+ return;
167
+ }
168
+
169
+ // Check if the binding is already registered
170
+ let bindingRegistration = this._aBindingRegistrations.find((reg) => {
171
+ return reg.binding === binding;
172
+ });
173
+ if (bindingRegistration) {
174
+ if (boundControl) {
175
+ // The binding was already registerd without boundControl information --> update boundControl
176
+ bindingRegistration.boundControl = boundControl;
177
+ }
178
+
179
+ // This binding has already requested data, but we're registering it again (on search) --> attach to dataRequested again
180
+ if (bindingRegistration.requestedCount > 0) {
181
+ binding.attachEventOnce("dataRequested", { triggeredBySearch: data.triggeredBySearch }, this.onDataRequested, this);
182
+ }
183
+
184
+ return;
185
+ }
186
+
187
+ if (boundControl) {
188
+ // Check if there's a different binding registered for the bound control
189
+ bindingRegistration = this._aBindingRegistrations.find((reg) => {
190
+ return reg.boundControl === boundControl;
191
+ });
192
+ if (bindingRegistration && bindingRegistration.binding !== binding) {
193
+ // The control had a different binding. This can happen in case of MDC charts who recreated their binding after search
194
+ // The previous binding is destroyed, we can replace it with the new and reset counters
195
+ bindingRegistration.binding = binding;
196
+ bindingRegistration.requestedCount = 0;
197
+ bindingRegistration.receivedCount = 0;
198
+ }
199
+ }
200
+ if (!bindingRegistration) {
201
+ bindingRegistration = {
202
+ binding: binding,
203
+ boundControl: boundControl,
204
+ requestedCount: 0,
205
+ receivedCount: 0
206
+ };
207
+ this._aBindingRegistrations.push(bindingRegistration);
208
+ }
209
+
210
+ binding.attachEventOnce("dataRequested", { triggeredBySearch: data.triggeredBySearch }, this.onDataRequested, this);
211
+ }
212
+
213
+ /**
214
+ * Registers a binding for watching its data events (dataRequested and dataReceived).
215
+ *
216
+ * @param binding The binding
217
+ */
218
+ public registerBinding(binding: Binding) {
219
+ this.register(null, { binding, triggeredBySearch: false });
220
+ }
221
+
222
+ /**
223
+ * Registers an MDCTable for watching the data events on its row binding (dataRequested and dataReceived).
224
+ *
225
+ * @param table The table
226
+ * @param triggeredBySearch True if this registration is triggered by a filterBar search
227
+ */
228
+ protected registerTable(table: Table, triggeredBySearch = false) {
229
+ if (this._aMDCTables.indexOf(table) < 0) {
230
+ this._aMDCTables.push(table);
231
+ }
232
+ const oRowBinding = table.getRowBinding();
233
+ if (oRowBinding) {
234
+ this.register(null, { table, triggeredBySearch });
235
+ } else {
236
+ table.attachEventOnce("bindingUpdated", { table, triggeredBySearch }, this.register, this);
237
+ this._aOtherEventSources.push(table);
238
+ }
239
+ }
240
+
241
+ /**
242
+ * Registers an MDCChart for watching the data events on its inner data binding (dataRequested and dataReceived).
243
+ *
244
+ * @param chart The chart
245
+ * @param triggeredBySearch True if this registration is triggered by a filter bar search
246
+ */
247
+ protected registerChart(chart: Chart, triggeredBySearch = false) {
248
+ if (this._aMDCCharts.indexOf(chart) < 0) {
249
+ this._aMDCCharts.push(chart);
250
+ }
251
+
252
+ const oInnerChart = (chart as any).getControlDelegate().getInnerChart(chart);
253
+ const binding = oInnerChart?.getBinding("data");
254
+ if (binding) {
255
+ this.register(null, { chart, triggeredBySearch });
256
+ } else {
257
+ chart.attachEventOnce("bindingUpdated", { chart, triggeredBySearch }, this.register, this);
258
+ this._aOtherEventSources.push(chart);
259
+ }
260
+ }
261
+
262
+ /**
263
+ * Registers an MDCTable or MDCChart for watching the data events on its inner data binding (dataRequested and dataReceived).
264
+ *
265
+ * @param element The table or cchart
266
+ */
267
+ public async registerTableOrChart(element: Table | Chart): Promise<void> {
268
+ if (!element.isA("sap.ui.mdc.Table") && !element.isA("sap.ui.mdc.Chart")) {
269
+ return;
270
+ }
271
+
272
+ try {
273
+ await element.initialized(); // access binding only after table/chart is bound
274
+ if (element.isA("sap.ui.mdc.Table")) {
275
+ this.registerTable(element as Table);
276
+ } else {
277
+ this.registerChart(element as Chart);
278
+ }
279
+ } catch (oError: any) {
280
+ Log.error("PageReady - Cannot register a table or a chart", oError);
281
+ }
282
+ }
283
+
284
+ /**
285
+ * Registers an MDCFilterBar for watching its search event.
286
+ *
287
+ * @param filterBar The filter bar
288
+ */
289
+ public registerFilterBar(filterBar: FilterBar) {
290
+ filterBar.attachEvent("search", this.onSearch, this);
291
+ this._aOtherEventSources.push(filterBar);
292
+ }
293
+ }
294
+
295
+ export default DataQueryWatcher;
@@ -227,7 +227,7 @@ sap.ui.define(["sap/fe/core/templating/DisplayModeFormatter", "sap/fe/core/templ
227
227
  break;
228
228
  }
229
229
  } else {
230
- var _property$annotations5, _property$annotations6, _property$annotations7, _property$annotations8, _property$annotations9, _property$annotations10, _property$Target, _property$Target$$tar, _property$annotations11, _property$annotations12, _property$annotations13, _property$annotations14, _property$annotations15, _property$Target2, _property$Target2$$ta;
230
+ var _property$annotations5, _property$annotations6, _property$annotations7, _property$annotations8, _property$annotations9, _property$annotations10, _property$Target, _property$Target$$tar, _property$annotations11, _property$annotations12, _property$annotations13, _property$annotations14, _property$annotations15;
231
231
 
232
232
  // Check for field containing Currency Or Unit Properties or Timezone
233
233
  var currencyOrUoMProperty = getAssociatedCurrencyProperty(property) || getAssociatedUnitProperty(property);
@@ -272,11 +272,12 @@ sap.ui.define(["sap/fe/core/templating/DisplayModeFormatter", "sap/fe/core/templ
272
272
  targetValue = (dataPointDefaultProperty.Target.$target.TargetValue || dataPointDefaultProperty.Target.$target.TargetValue.MaximumValue).toString();
273
273
 
274
274
  _appendTemplate("{".concat(valueIndex, "}/").concat(targetValue));
275
- } else if (((_property$Target2 = property.Target) === null || _property$Target2 === void 0 ? void 0 : (_property$Target2$$ta = _property$Target2.$target) === null || _property$Target2$$ta === void 0 ? void 0 : _property$Target2$$ta.$Type) === "com.sap.vocabularies.Communication.v1.ContactType") {
276
- var _property$Target$$tar2;
275
+ } else if (property.$Type === "com.sap.vocabularies.Communication.v1.ContactType") {
276
+ var _property$fn, _property$fn2;
277
277
 
278
- relatedProperties.exportSettingsContactProperty = property.Target.value.substring(0, property.Target.value.indexOf("/") + 1) + ((_property$Target$$tar2 = property.Target.$target.fn) === null || _property$Target$$tar2 === void 0 ? void 0 : _property$Target$$tar2.path);
279
- valueIndex = _pushUnique(path, property.Target.$target.fn.$target);
278
+ var contactProperty = (_property$fn = property.fn) === null || _property$fn === void 0 ? void 0 : _property$fn.$target;
279
+ var contactPropertyPath = (_property$fn2 = property.fn) === null || _property$fn2 === void 0 ? void 0 : _property$fn2.path;
280
+ valueIndex = _pushUnique(navigationPathPrefix ? navigationPathPrefix + contactPropertyPath : contactPropertyPath, contactProperty);
280
281
 
281
282
  _appendTemplate("{".concat(valueIndex, "}"));
282
283
  } else if (!ignoreSelf) {
@@ -350,7 +351,8 @@ sap.ui.define(["sap/fe/core/templating/DisplayModeFormatter", "sap/fe/core/templ
350
351
  break;
351
352
 
352
353
  case "com.sap.vocabularies.Communication.v1.ContactType":
353
- relatedProperties = collectRelatedProperties(dataField.Target.value, dataField, converterContext, false, tableType, relatedProperties, isEmbedded);
354
+ var dataFieldContact = dataField.Target.$target;
355
+ relatedProperties = collectRelatedProperties(dataField.Target.value, dataFieldContact, converterContext, false, tableType, relatedProperties, isEmbedded);
354
356
  break;
355
357
  }
356
358
  }
@@ -411,4 +413,4 @@ sap.ui.define(["sap/fe/core/templating/DisplayModeFormatter", "sap/fe/core/templ
411
413
  _exports.getDataFieldDataType = getDataFieldDataType;
412
414
  return _exports;
413
415
  }, false);
414
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkRhdGFGaWVsZC50cyJdLCJuYW1lcyI6WyJpc0RhdGFGaWVsZEZvckFjdGlvbkFic3RyYWN0IiwiZGF0YUZpZWxkIiwiaGFzT3duUHJvcGVydHkiLCJpc0RhdGFGaWVsZFR5cGVzIiwiaXNEYXRhRmllbGRBbHdheXNIaWRkZW4iLCJhbm5vdGF0aW9ucyIsIlVJIiwiSGlkZGVuIiwidmFsdWVPZiIsIlZhbHVlIiwiJHRhcmdldCIsImdldFNlbWFudGljT2JqZWN0UGF0aCIsImNvbnZlcnRlckNvbnRleHQiLCJvYmplY3QiLCJwcm9wZXJ0eSIsIkNvbW1vbiIsIlNlbWFudGljT2JqZWN0IiwidW5kZWZpbmVkIiwiZ2V0RW50aXR5U2V0QmFzZWRBbm5vdGF0aW9uUGF0aCIsImZ1bGx5UXVhbGlmaWVkTmFtZSIsImlzUHJvcGVydHkiLCJfZ2V0TmF2aWdhdGlvblBhdGhQcmVmaXgiLCJwYXRoIiwiaW5kZXhPZiIsInN1YnN0cmluZyIsImxhc3RJbmRleE9mIiwiX2NvbGxlY3RBZGRpdGlvbmFsUHJvcGVydGllc0ZvckFuYWx5dGljYWxUYWJsZSIsInRhcmdldCIsIm5hdmlnYXRpb25QYXRoUHJlZml4IiwidGFibGVUeXBlIiwicmVsYXRlZFByb3BlcnRpZXMiLCJoaWRkZW5Bbm5vdGF0aW9uIiwiX3R5cGUiLCJoaWRkZW5Bbm5vdGF0aW9uUHJvcGVydHlQYXRoIiwiYWRkaXRpb25hbFByb3BlcnRpZXMiLCJjb2xsZWN0UmVsYXRlZFByb3BlcnRpZXMiLCJpZ25vcmVTZWxmIiwicHJvcGVydGllcyIsImFkZFVuaXRJblRlbXBsYXRlIiwiX3B1c2hVbmlxdWUiLCJrZXkiLCJ2YWx1ZSIsIk9iamVjdCIsImtleXMiLCJfYXBwZW5kVGVtcGxhdGUiLCJleHBvcnRTZXR0aW5nc1RlbXBsYXRlIiwidGV4dEFubm90YXRpb24iLCJUZXh0IiwidmFsdWVJbmRleCIsInRhcmdldFZhbHVlIiwiY3VycmVuY3lPclVvTUluZGV4IiwidGltZXpvbmVPclVvTUluZGV4IiwiZXhwb3J0U2V0dGluZ3NXcmFwcGluZyIsImRhdGFNb2RlbE9iamVjdFBhdGgiLCJnZXREYXRhTW9kZWxPYmplY3RQYXRoIiwidGV4dEFubm90YXRpb25Qcm9wZXJ0eVBhdGgiLCJkaXNwbGF5TW9kZSIsImdldERpc3BsYXlNb2RlIiwiZGVzY3JpcHRpb25JbmRleCIsInZpc3VhbFNldHRpbmdzVG9CZUV4Y2x1ZGVkIiwiY3VycmVuY3lPclVvTVByb3BlcnR5IiwiZ2V0QXNzb2NpYXRlZEN1cnJlbmN5UHJvcGVydHkiLCJnZXRBc3NvY2lhdGVkVW5pdFByb3BlcnR5IiwiY3VycmVuY3lPclVuaXRBbm5vdGF0aW9uIiwiTWVhc3VyZXMiLCJJU09DdXJyZW5jeSIsIlVuaXQiLCJ0aW1lem9uZVByb3BlcnR5IiwiZ2V0QXNzb2NpYXRlZFRpbWV6b25lUHJvcGVydHkiLCJ0aW1lem9uZUFubm90YXRpb24iLCJUaW1lem9uZSIsIm5hbWUiLCJleHBvcnRVbml0TmFtZSIsImV4cG9ydFRpbWV6b25lTmFtZSIsIlRhcmdldCIsIlZpc3VhbGl6YXRpb24iLCJkYXRhUG9pbnRQcm9wZXJ0eSIsIlRhcmdldFZhbHVlIiwiTWF4aW11bVZhbHVlIiwidG9TdHJpbmciLCJEYXRhRmllbGREZWZhdWx0IiwiJFR5cGUiLCJkYXRhUG9pbnREZWZhdWx0UHJvcGVydHkiLCJleHBvcnRTZXR0aW5nc0NvbnRhY3RQcm9wZXJ0eSIsImZuIiwiZXhwb3J0VW5pdFN0cmluZyIsImV4cG9ydFRpbWV6b25lU3RyaW5nIiwibGVuZ3RoIiwiY29sbGVjdFJlbGF0ZWRQcm9wZXJ0aWVzUmVjdXJzaXZlbHkiLCJpc0VtYmVkZGVkIiwiRGF0YSIsImZvckVhY2giLCJpbm5lckRhdGFGaWVsZCIsImdldERhdGFGaWVsZERhdGFUeXBlIiwib0RhdGFGaWVsZCIsInNEYXRhVHlwZSIsInR5cGUiLCJzRGF0YVR5cGVGb3JEYXRhRmllbGRGb3JBbm5vdGF0aW9uIiwiJFBhdGgiXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FB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LE9BQWpELHFEQUFDLGlCQUFxRTBFLEVBQXRFLEVBQWlGMUUsT0FBcEYsNkNBQUcsU0FBMEZzRixJQUF0RztBQUNBLFdBRkQsTUFFTyxJQUFJLGFBQUNGLFVBQUQsQ0FBdUNwQixNQUF2QyxzREFBK0NoRSxPQUEvQyxDQUF1RHVFLEtBQXZELGdEQUFKLEVBQXNHO0FBQUE7O0FBQzVHYyxZQUFBQSxTQUFTLEdBQ1IsYUFBRUQsVUFBRCxDQUF1Q3BCLE1BQXhDLGlFQUFDLFNBQStDaEUsT0FBaEQsK0ZBQXVFRCxLQUF2RSwwR0FBOEV5RixLQUE5RSxrRkFBcUZqQixLQUFyRixrQkFDRWEsVUFBRCxDQUF1Q3BCLE1BRHhDLGlFQUNDLFNBQStDaEUsT0FEaEQsOEVBQ0EsaUJBQXVFRCxLQUR2RSwwREFDQSxzQkFBOEVDLE9BQTlFLENBQXNGc0YsSUFEdEYsQ0FERDtBQUdBLFdBSk0sTUFJQTtBQUNOO0FBQ0FELFlBQUFBLFNBQVMsR0FBRzlFLFNBQVo7QUFDQTtBQUNELFNBWEQsTUFXTztBQUNOOEUsVUFBQUEsU0FBUyxHQUFHOUUsU0FBWjtBQUNBOztBQUNEO0FBL0JGOztBQWtDQSxXQUFPOEUsU0FBUDtBQUNBLEdBckNNIiwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQcm9wZXJ0eSB9IGZyb20gXCJAc2FwLXV4L2Fubm90YXRpb24tY29udmVydGVyXCI7XG5pbXBvcnQge1xuXHRDb21tdW5pY2F0aW9uQW5ub3RhdGlvblR5cGVzLFxuXHRDb250YWN0LFxuXHREYXRhRmllbGQsXG5cdERhdGFGaWVsZEFic3RyYWN0VHlwZXMsXG5cdERhdGFGaWVsZEZvckFjdGlvbkFic3RyYWN0VHlwZXMsXG5cdERhdGFGaWVsZEZvckFubm90YXRpb24sXG5cdERhdGFGaWVsZFR5cGVzLFxuXHREYXRhUG9pbnQsXG5cdFVJQW5ub3RhdGlvblR5cGVzXG59IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlc1wiO1xuaW1wb3J0ICogYXMgRWRtIGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy9kaXN0L0VkbVwiO1xuaW1wb3J0IHsgVGFibGVUeXBlIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvY29udHJvbHMvQ29tbW9uL1RhYmxlXCI7XG5pbXBvcnQgeyBnZXREaXNwbGF5TW9kZSwgUHJvcGVydHlPclBhdGggfSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9EaXNwbGF5TW9kZUZvcm1hdHRlclwiO1xuaW1wb3J0IHtcblx0Z2V0QXNzb2NpYXRlZEN1cnJlbmN5UHJvcGVydHksXG5cdGdldEFzc29jaWF0ZWRUaW1lem9uZVByb3BlcnR5LFxuXHRnZXRBc3NvY2lhdGVkVW5pdFByb3BlcnR5LFxuXHRpc1Byb3BlcnR5XG59IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL1Byb3BlcnR5SGVscGVyXCI7XG5pbXBvcnQgQ29udmVydGVyQ29udGV4dCBmcm9tIFwiLi4vQ29udmVydGVyQ29udGV4dFwiO1xuXG5leHBvcnQgdHlwZSBDb21wbGV4UHJvcGVydHlJbmZvID0ge1xuXHRwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBQcm9wZXJ0eT47XG5cdGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBQcm9wZXJ0eT47XG5cdGV4cG9ydFNldHRpbmdzVGVtcGxhdGU/OiBzdHJpbmc7XG5cdGV4cG9ydFNldHRpbmdzV3JhcHBpbmc/OiBib29sZWFuO1xuXHRleHBvcnRTZXR0aW5nc0NvbnRhY3RQcm9wZXJ0eT86IHN0cmluZztcblx0dmlzdWFsU2V0dGluZ3NUb0JlRXhjbHVkZWQ/OiBzdHJpbmc7XG5cdGV4cG9ydFVuaXROYW1lPzogc3RyaW5nO1xuXHRleHBvcnRVbml0U3RyaW5nPzogc3RyaW5nO1xuXHRleHBvcnRUaW1lem9uZU5hbWU/OiBzdHJpbmc7XG5cdGV4cG9ydFRpbWV6b25lU3RyaW5nPzogc3RyaW5nO1xufTtcblxuLyoqXG4gKiBJZGVudGlmaWVzIGlmIHRoZSBnaXZlbiBkYXRhRmllbGRBYnN0cmFjdCB0aGF0IGlzIHBhc3NlZCBpcyBhIFwiRGF0YUZpZWxkRm9yQWN0aW9uQWJzdHJhY3RcIi5cbiAqIERhdGFGaWVsZEZvckFjdGlvbkFic3RyYWN0IGhhcyBhbiBpbmxpbmUgYWN0aW9uIGRlZmluZWQuXG4gKlxuICogQHBhcmFtIHtEYXRhRmllbGRBYnN0cmFjdFR5cGVzfSBkYXRhRmllbGQgRGF0YUZpZWxkIHRvIGJlIGV2YWx1YXRlZFxuICogQHJldHVybnMge2Jvb2xlYW59IFZhbGlkYXRlcyB0aGF0IGRhdGFGaWVsZCBpcyBhIERhdGFGaWVsZEZvckFjdGlvbkFic3RyYWN0VHlwZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNEYXRhRmllbGRGb3JBY3Rpb25BYnN0cmFjdChkYXRhRmllbGQ6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMpOiBkYXRhRmllbGQgaXMgRGF0YUZpZWxkRm9yQWN0aW9uQWJzdHJhY3RUeXBlcyB7XG5cdHJldHVybiAoZGF0YUZpZWxkIGFzIERhdGFGaWVsZEZvckFjdGlvbkFic3RyYWN0VHlwZXMpLmhhc093blByb3BlcnR5KFwiQWN0aW9uXCIpO1xufVxuXG4vKipcbiAqIElkZW50aWZpZXMgaWYgdGhlIGdpdmVuIGRhdGFGaWVsZEFic3RyYWN0IHRoYXQgaXMgcGFzc2VkIGlzIGEgXCJEYXRhRmllbGRcIi5cbiAqIERhdGFGaWVsZCBoYXMgYSB2YWx1ZSBkZWZpbmVkLlxuICpcbiAqIEBwYXJhbSB7RGF0YUZpZWxkQWJzdHJhY3RUeXBlc30gZGF0YUZpZWxkIERhdGFGaWVsZCB0byBiZSBldmFsdWF0ZWRcbiAqIEByZXR1cm5zIHtib29sZWFufSBWYWxpZGF0ZSB0aGF0IGRhdGFGaWVsZCBpcyBhIERhdGFGaWVsZFR5cGVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0RhdGFGaWVsZFR5cGVzKGRhdGFGaWVsZDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyk6IGRhdGFGaWVsZCBpcyBEYXRhRmllbGRUeXBlcyB7XG5cdHJldHVybiAoZGF0YUZpZWxkIGFzIERhdGFGaWVsZFR5cGVzKS5oYXNPd25Qcm9wZXJ0eShcIlZhbHVlXCIpO1xufVxuXG4vKipcbiAqIFJldHVybnMgd2hldGhlciBnaXZlbiBEYXRhRmllbGQgaGFzIGEgc3RhdGljIGhpZGRlbiBhbm5vdGF0aW9uLlxuICpcbiAqIEBwYXJhbSB7RGF0YUZpZWxkQWJzdHJhY3RUeXBlc30gZGF0YUZpZWxkIFRoZSBkYXRhZmllbGQgdG8gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgaWYgZGF0YWZpZWxkIG9yIHJlZmVyZW5jZWQgcHJvcGVydHkgaGFzIGEgc3RhdGljIEhpZGRlbiBhbm5vdGF0aW9uLCBmYWxzZSBlbHNlXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNEYXRhRmllbGRBbHdheXNIaWRkZW4oZGF0YUZpZWxkOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzKTogYm9vbGVhbiB7XG5cdHJldHVybiAoXG5cdFx0ZGF0YUZpZWxkLmFubm90YXRpb25zPy5VST8uSGlkZGVuPy52YWx1ZU9mKCkgPT09IHRydWUgfHxcblx0XHQoaXNEYXRhRmllbGRUeXBlcyhkYXRhRmllbGQpICYmIGRhdGFGaWVsZC5WYWx1ZT8uJHRhcmdldD8uYW5ub3RhdGlvbnM/LlVJPy5IaWRkZW4gPT09IHRydWUpXG5cdCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTZW1hbnRpY09iamVjdFBhdGgoY29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCwgb2JqZWN0OiBhbnkpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRpZiAodHlwZW9mIG9iamVjdCA9PT0gXCJvYmplY3RcIikge1xuXHRcdGlmIChpc0RhdGFGaWVsZFR5cGVzKG9iamVjdCkgJiYgb2JqZWN0LlZhbHVlPy4kdGFyZ2V0KSB7XG5cdFx0XHRjb25zdCBwcm9wZXJ0eSA9IG9iamVjdC5WYWx1ZT8uJHRhcmdldDtcblx0XHRcdGlmIChwcm9wZXJ0eT8uYW5ub3RhdGlvbnM/LkNvbW1vbj8uU2VtYW50aWNPYmplY3QgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRyZXR1cm4gY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlTZXRCYXNlZEFubm90YXRpb25QYXRoKHByb3BlcnR5Py5mdWxseVF1YWxpZmllZE5hbWUpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAoaXNQcm9wZXJ0eShvYmplY3QpKSB7XG5cdFx0XHRpZiAob2JqZWN0Py5hbm5vdGF0aW9ucz8uQ29tbW9uPy5TZW1hbnRpY09iamVjdCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHJldHVybiBjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVNldEJhc2VkQW5ub3RhdGlvblBhdGgob2JqZWN0Py5mdWxseVF1YWxpZmllZE5hbWUpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHRyZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIG5hdmlnYXRpb24gcGF0aCBwcmVmaXggZm9yIGEgcHJvcGVydHkgcGF0aC5cbiAqXG4gKiBAcGFyYW0gcGF0aCBUaGUgcHJvcGVydHkgcGF0aCBGb3IgZS5nLiAvRW50aXR5VHlwZS9OYXZpZ2F0aW9uL1Byb3BlcnR5XG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgbmF2aWdhdGlvbiBwYXRoIHByZWZpeCBGb3IgZS5nLiAvRW50aXR5VHlwZS9OYXZpZ2F0aW9uL1xuICovXG5mdW5jdGlvbiBfZ2V0TmF2aWdhdGlvblBhdGhQcmVmaXgocGF0aDogc3RyaW5nKTogc3RyaW5nIHtcblx0cmV0dXJuIHBhdGguaW5kZXhPZihcIi9cIikgPiAtMSA/IHBhdGguc3Vic3RyaW5nKDAsIHBhdGgubGFzdEluZGV4T2YoXCIvXCIpICsgMSkgOiBcIlwiO1xufVxuXG4vKipcbiAqIENvbGxlY3QgYWRkaXRpb25hbCBwcm9wZXJ0aWVzIGZvciB0aGUgQUxQIHRhYmxlIHVzZS1jYXNlLlxuICpcbiAqIEZvciBlLmcuIElmIFVJLkhpZGRlbiBwb2ludHMgdG8gYSBwcm9wZXJ0eSwgaW5jbHVkZSB0aGlzIHByb3BlcnR5IGluIHRoZSBhZGRpdGlvbmFsUHJvcGVydGllcyBvZiBDb21wbGV4UHJvcGVydHlJbmZvIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0gdGFyZ2V0IFByb3BlcnR5IG9yIERhdGFGaWVsZCBiZWluZyBwcm9jZXNzZWRcbiAqIEBwYXJhbSBuYXZpZ2F0aW9uUGF0aFByZWZpeCBOYXZpZ2F0aW9uIHBhdGggcHJlZml4LCBhcHBsaWNhYmxlIGluIGNhc2Ugb2YgbmF2aWdhdGlvbiBwcm9wZXJ0aWVzLlxuICogQHBhcmFtIHRhYmxlVHlwZSBUYWJsZSB0eXBlLlxuICogQHBhcmFtIHJlbGF0ZWRQcm9wZXJ0aWVzIFRoZSByZWxhdGVkIHByb3BlcnRpZXMgaWRlbnRpZmllZCBzbyBmYXIuXG4gKiBAcmV0dXJucyB7Q29tcGxleFByb3BlcnR5SW5mb30gVGhlIHJlbGF0ZWQgcHJvcGVydGllcyBpZGVudGlmaWVkLlxuICovXG5mdW5jdGlvbiBfY29sbGVjdEFkZGl0aW9uYWxQcm9wZXJ0aWVzRm9yQW5hbHl0aWNhbFRhYmxlKFxuXHR0YXJnZXQ6IEVkbS5QcmltaXRpdmVUeXBlLFxuXHRuYXZpZ2F0aW9uUGF0aFByZWZpeDogc3RyaW5nLFxuXHR0YWJsZVR5cGU6IFRhYmxlVHlwZSxcblx0cmVsYXRlZFByb3BlcnRpZXM6IENvbXBsZXhQcm9wZXJ0eUluZm9cbik6IENvbXBsZXhQcm9wZXJ0eUluZm8ge1xuXHRpZiAodGFibGVUeXBlID09PSBcIkFuYWx5dGljYWxUYWJsZVwiKSB7XG5cdFx0Y29uc3QgaGlkZGVuQW5ub3RhdGlvbiA9IHRhcmdldC5hbm5vdGF0aW9ucz8uVUk/LkhpZGRlbjtcblx0XHRpZiAoaGlkZGVuQW5ub3RhdGlvbj8ucGF0aCAmJiBoaWRkZW5Bbm5vdGF0aW9uLiR0YXJnZXQ/Ll90eXBlID09PSBcIlByb3BlcnR5XCIpIHtcblx0XHRcdGNvbnN0IGhpZGRlbkFubm90YXRpb25Qcm9wZXJ0eVBhdGggPSBuYXZpZ2F0aW9uUGF0aFByZWZpeCArIGhpZGRlbkFubm90YXRpb24ucGF0aDtcblx0XHRcdC8vIFRoaXMgcHJvcGVydHkgc2hvdWxkIGJlIGFkZGVkIHRvIGFkZGl0aW9uYWxQcm9wZXJ0aWVzIG1hcCBmb3IgdGhlIEFMUCB0YWJsZSB1c2UtY2FzZS5cblx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzLmFkZGl0aW9uYWxQcm9wZXJ0aWVzW2hpZGRlbkFubm90YXRpb25Qcm9wZXJ0eVBhdGhdID0gaGlkZGVuQW5ub3RhdGlvbi4kdGFyZ2V0O1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gcmVsYXRlZFByb3BlcnRpZXM7XG59XG5cbi8qKlxuICogQ29sbGVjdCByZWxhdGVkIHByb3BlcnRpZXMgZnJvbSBhIHByb3BlcnR5J3MgYW5ub3RhdGlvbnMuXG4gKlxuICogQHBhcmFtIHBhdGggVGhlIHByb3BlcnR5IHBhdGhcbiAqIEBwYXJhbSBwcm9wZXJ0eSBUaGUgcHJvcGVydHkgdG8gYmUgY29uc2lkZXJlZFxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGNvbnZlcnRlciBjb250ZXh0XG4gKiBAcGFyYW0gaWdub3JlU2VsZiBXaGV0aGVyIHRvIGV4Y2x1ZGUgdGhlIHNhbWUgcHJvcGVydHkgZnJvbSByZWxhdGVkIHByb3BlcnRpZXMuXG4gKiBAcGFyYW0gdGFibGVUeXBlIFRoZSB0YWJsZSB0eXBlLlxuICogQHBhcmFtIHJlbGF0ZWRQcm9wZXJ0aWVzIFRoZSByZWxhdGVkIHByb3BlcnRpZXMgaWRlbnRpZmllZCBzbyBmYXIuXG4gKiBAcGFyYW0gYWRkVW5pdEluVGVtcGxhdGUgVHJ1ZSBpZiB0aGUgdW5pdC9jdXJyZW5jeSBwcm9wZXJ0eSBuZWVkcyB0byBiZSBhZGRlZCBpbiB0aGUgZXhwb3J0IHRlbXBsYXRlXG4gKiBAcmV0dXJucyB7Q29tcGxleFByb3BlcnR5SW5mb30gVGhlIHJlbGF0ZWQgcHJvcGVydGllcyBpZGVudGlmaWVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29sbGVjdFJlbGF0ZWRQcm9wZXJ0aWVzKFxuXHRwYXRoOiBzdHJpbmcsXG5cdHByb3BlcnR5OiBFZG0uUHJpbWl0aXZlVHlwZSxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCxcblx0aWdub3JlU2VsZjogYm9vbGVhbixcblx0dGFibGVUeXBlOiBUYWJsZVR5cGUsXG5cdHJlbGF0ZWRQcm9wZXJ0aWVzOiBDb21wbGV4UHJvcGVydHlJbmZvID0geyBwcm9wZXJ0aWVzOiB7fSwgYWRkaXRpb25hbFByb3BlcnRpZXM6IHt9IH0sXG5cdGFkZFVuaXRJblRlbXBsYXRlOiBib29sZWFuID0gZmFsc2Vcbik6IENvbXBsZXhQcm9wZXJ0eUluZm8ge1xuXHQvKipcblx0ICogSGVscGVyIHRvIHB1c2ggdW5pcXVlIHJlbGF0ZWQgcHJvcGVydGllcy5cblx0ICpcblx0ICogQHBhcmFtIGtleSBUaGUgcHJvcGVydHkgcGF0aFxuXHQgKiBAcGFyYW0gdmFsdWUgVGhlIHByb3BlcnRpZXMgb2JqZWN0IGNvbnRhaW5pbmcgdmFsdWUgcHJvcGVydHksIGRlc2NyaXB0aW9uIHByb3BlcnR5Li4uXG5cdCAqIEByZXR1cm5zIEluZGV4IGF0IHdoaWNoIHRoZSBwcm9wZXJ0eSBpcyBhdmFpbGFibGVcblx0ICovXG5cdGZ1bmN0aW9uIF9wdXNoVW5pcXVlKGtleTogc3RyaW5nLCB2YWx1ZTogUHJvcGVydHkpOiBudW1iZXIge1xuXHRcdGlmICghcmVsYXRlZFByb3BlcnRpZXMucHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG5cdFx0XHRyZWxhdGVkUHJvcGVydGllcy5wcm9wZXJ0aWVzW2tleV0gPSB2YWx1ZTtcblx0XHR9XG5cdFx0cmV0dXJuIE9iamVjdC5rZXlzKHJlbGF0ZWRQcm9wZXJ0aWVzLnByb3BlcnRpZXMpLmluZGV4T2Yoa2V5KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBIZWxwZXIgdG8gYXBwZW5kIHRoZSBleHBvcnQgc2V0dGluZ3MgdGVtcGxhdGUgd2l0aCBhIGZvcm1hdHRlZCB0ZXh0LlxuXHQgKlxuXHQgKiBAcGFyYW0gdmFsdWUgRm9ybWF0dGVkIHRleHRcblx0ICovXG5cdGZ1bmN0aW9uIF9hcHBlbmRUZW1wbGF0ZSh2YWx1ZTogc3RyaW5nKSB7XG5cdFx0cmVsYXRlZFByb3BlcnRpZXMuZXhwb3J0U2V0dGluZ3NUZW1wbGF0ZSA9IHJlbGF0ZWRQcm9wZXJ0aWVzLmV4cG9ydFNldHRpbmdzVGVtcGxhdGVcblx0XHRcdD8gYCR7cmVsYXRlZFByb3BlcnRpZXMuZXhwb3J0U2V0dGluZ3NUZW1wbGF0ZX0ke3ZhbHVlfWBcblx0XHRcdDogYCR7dmFsdWV9YDtcblx0fVxuXG5cdGlmIChwYXRoICYmIHByb3BlcnR5KSB7XG5cdFx0Y29uc3QgbmF2aWdhdGlvblBhdGhQcmVmaXggPSBfZ2V0TmF2aWdhdGlvblBhdGhQcmVmaXgocGF0aCk7XG5cblx0XHQvLyBDaGVjayBmb3IgVGV4dCBhbm5vdGF0aW9uLlxuXHRcdGNvbnN0IHRleHRBbm5vdGF0aW9uID0gcHJvcGVydHkuYW5ub3RhdGlvbnM/LkNvbW1vbj8uVGV4dDtcblx0XHRsZXQgdmFsdWVJbmRleDogbnVtYmVyO1xuXHRcdGxldCB0YXJnZXRWYWx1ZTogc3RyaW5nO1xuXHRcdGxldCBjdXJyZW5jeU9yVW9NSW5kZXg6IG51bWJlcjtcblx0XHRsZXQgdGltZXpvbmVPclVvTUluZGV4OiBudW1iZXI7XG5cblx0XHRpZiAocmVsYXRlZFByb3BlcnRpZXMuZXhwb3J0U2V0dGluZ3NUZW1wbGF0ZSkge1xuXHRcdFx0Ly8gRmllbGRHcm91cCB1c2UtY2FzZS4gTmVlZCB0byBhZGQgZWFjaCBGaWVsZCBpbiBuZXcgbGluZS5cblx0XHRcdF9hcHBlbmRUZW1wbGF0ZShcIlxcblwiKTtcblx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzLmV4cG9ydFNldHRpbmdzV3JhcHBpbmcgPSB0cnVlO1xuXHRcdH1cblxuXHRcdGlmICh0ZXh0QW5ub3RhdGlvbj8ucGF0aCAmJiB0ZXh0QW5ub3RhdGlvbj8uJHRhcmdldCkge1xuXHRcdFx0Ly8gQ2hlY2sgZm9yIFRleHQgQXJyYW5nZW1lbnQuXG5cdFx0XHRjb25zdCBkYXRhTW9kZWxPYmplY3RQYXRoID0gY29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCk7XG5cdFx0XHRjb25zdCB0ZXh0QW5ub3RhdGlvblByb3BlcnR5UGF0aCA9IG5hdmlnYXRpb25QYXRoUHJlZml4ICsgdGV4dEFubm90YXRpb24ucGF0aDtcblx0XHRcdGNvbnN0IGRpc3BsYXlNb2RlID0gZ2V0RGlzcGxheU1vZGUocHJvcGVydHkgYXMgUHJvcGVydHlPclBhdGg8UHJvcGVydHk+LCBkYXRhTW9kZWxPYmplY3RQYXRoKTtcblx0XHRcdGxldCBkZXNjcmlwdGlvbkluZGV4OiBudW1iZXI7XG5cdFx0XHRzd2l0Y2ggKGRpc3BsYXlNb2RlKSB7XG5cdFx0XHRcdGNhc2UgXCJWYWx1ZVwiOlxuXHRcdFx0XHRcdHZhbHVlSW5kZXggPSBfcHVzaFVuaXF1ZShwYXRoLCBwcm9wZXJ0eSk7XG5cdFx0XHRcdFx0X2FwcGVuZFRlbXBsYXRlKGB7JHt2YWx1ZUluZGV4fX1gKTtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlIFwiRGVzY3JpcHRpb25cIjpcblx0XHRcdFx0XHQvLyBLZWVwIHZhbHVlIHdoZW4gZXhwb3J0aW5nIChzcGxpdCBtb2RlKSBvbiB0ZXh0IEFycmFuZ2VtZW50IGRlZmluZWQgYXMgI1RleHRPbmx5IChPbmx5IHZhbHVlcyBhcmUgZXhwZWN0ZWQgb24gcGFzdGUgZnJvbSBFeGNlbCBmdW5jdGlvbmFsaXR5KVxuXHRcdFx0XHRcdF9wdXNoVW5pcXVlKHBhdGgsIHByb3BlcnR5KTtcblx0XHRcdFx0XHRkZXNjcmlwdGlvbkluZGV4ID0gX3B1c2hVbmlxdWUodGV4dEFubm90YXRpb25Qcm9wZXJ0eVBhdGgsIHRleHRBbm5vdGF0aW9uLiR0YXJnZXQpO1xuXHRcdFx0XHRcdF9hcHBlbmRUZW1wbGF0ZShgeyR7ZGVzY3JpcHRpb25JbmRleH19YCk7XG5cdFx0XHRcdFx0cmVsYXRlZFByb3BlcnRpZXMudmlzdWFsU2V0dGluZ3NUb0JlRXhjbHVkZWQgPSBwYXRoO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgXCJWYWx1ZURlc2NyaXB0aW9uXCI6XG5cdFx0XHRcdFx0dmFsdWVJbmRleCA9IF9wdXNoVW5pcXVlKHBhdGgsIHByb3BlcnR5KTtcblx0XHRcdFx0XHRkZXNjcmlwdGlvbkluZGV4ID0gX3B1c2hVbmlxdWUodGV4dEFubm90YXRpb25Qcm9wZXJ0eVBhdGgsIHRleHRBbm5vdGF0aW9uLiR0YXJnZXQpO1xuXHRcdFx0XHRcdF9hcHBlbmRUZW1wbGF0ZShgeyR7dmFsdWVJbmRleH19ICh7JHtkZXNjcmlwdGlvbkluZGV4fX0pYCk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSBcIkRlc2NyaXB0aW9uVmFsdWVcIjpcblx0XHRcdFx0XHR2YWx1ZUluZGV4ID0gX3B1c2hVbmlxdWUocGF0aCwgcHJvcGVydHkpO1xuXHRcdFx0XHRcdGRlc2NyaXB0aW9uSW5kZXggPSBfcHVzaFVuaXF1ZSh0ZXh0QW5ub3RhdGlvblByb3BlcnR5UGF0aCwgdGV4dEFubm90YXRpb24uJHRhcmdldCk7XG5cdFx0XHRcdFx0X2FwcGVuZFRlbXBsYXRlKGB7JHtkZXNjcmlwdGlvbkluZGV4fX0gKHske3ZhbHVlSW5kZXh9fSlgKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gQ2hlY2sgZm9yIGZpZWxkIGNvbnRhaW5pbmcgQ3VycmVuY3kgT3IgVW5pdCBQcm9wZXJ0aWVzIG9yIFRpbWV6b25lXG5cdFx0XHRjb25zdCBjdXJyZW5jeU9yVW9NUHJvcGVydHkgPSBnZXRBc3NvY2lhdGVkQ3VycmVuY3lQcm9wZXJ0eShwcm9wZXJ0eSkgfHwgZ2V0QXNzb2NpYXRlZFVuaXRQcm9wZXJ0eShwcm9wZXJ0eSk7XG5cdFx0XHRjb25zdCBjdXJyZW5jeU9yVW5pdEFubm90YXRpb24gPSBwcm9wZXJ0eT8uYW5ub3RhdGlvbnM/Lk1lYXN1cmVzPy5JU09DdXJyZW5jeSB8fCBwcm9wZXJ0eT8uYW5ub3RhdGlvbnM/Lk1lYXN1cmVzPy5Vbml0O1xuXHRcdFx0Y29uc3QgdGltZXpvbmVQcm9wZXJ0eSA9IGdldEFzc29jaWF0ZWRUaW1lem9uZVByb3BlcnR5KHByb3BlcnR5KTtcblx0XHRcdGNvbnN0IHRpbWV6b25lQW5ub3RhdGlvbiA9IHByb3BlcnR5Py5hbm5vdGF0aW9ucz8uQ29tbW9uPy5UaW1lem9uZTtcblxuXHRcdFx0aWYgKGN1cnJlbmN5T3JVb01Qcm9wZXJ0eSAmJiBjdXJyZW5jeU9yVW5pdEFubm90YXRpb24/LiR0YXJnZXQpIHtcblx0XHRcdFx0dmFsdWVJbmRleCA9IF9wdXNoVW5pcXVlKHBhdGgsIHByb3BlcnR5KTtcblx0XHRcdFx0Y3VycmVuY3lPclVvTUluZGV4ID0gX3B1c2hVbmlxdWUoY3VycmVuY3lPclVvTVByb3BlcnR5Lm5hbWUsIGN1cnJlbmN5T3JVbml0QW5ub3RhdGlvbi4kdGFyZ2V0KTtcblx0XHRcdFx0aWYgKGFkZFVuaXRJblRlbXBsYXRlKSB7XG5cdFx0XHRcdFx0X2FwcGVuZFRlbXBsYXRlKGB7JHt2YWx1ZUluZGV4fX0gIHske2N1cnJlbmN5T3JVb01JbmRleH19YCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cmVsYXRlZFByb3BlcnRpZXMuZXhwb3J0VW5pdE5hbWUgPSBjdXJyZW5jeU9yVW9NUHJvcGVydHkubmFtZTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmICh0aW1lem9uZVByb3BlcnR5ICYmIHRpbWV6b25lQW5ub3RhdGlvbj8uJHRhcmdldCkge1xuXHRcdFx0XHR2YWx1ZUluZGV4ID0gX3B1c2hVbmlxdWUocGF0aCwgcHJvcGVydHkpO1xuXHRcdFx0XHR0aW1lem9uZU9yVW9NSW5kZXggPSBfcHVzaFVuaXF1ZSh0aW1lem9uZVByb3BlcnR5Lm5hbWUsIHRpbWV6b25lQW5ub3RhdGlvbi4kdGFyZ2V0KTtcblx0XHRcdFx0aWYgKGFkZFVuaXRJblRlbXBsYXRlKSB7XG5cdFx0XHRcdFx0X2FwcGVuZFRlbXBsYXRlKGB7JHt2YWx1ZUluZGV4fX0gIHske3RpbWV6b25lT3JVb01JbmRleH19YCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cmVsYXRlZFByb3BlcnRpZXMuZXhwb3J0VGltZXpvbmVOYW1lID0gdGltZXpvbmVQcm9wZXJ0eS5uYW1lO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKHByb3BlcnR5LlRhcmdldD8uJHRhcmdldD8uVmlzdWFsaXphdGlvbikge1xuXHRcdFx0XHRjb25zdCBkYXRhUG9pbnRQcm9wZXJ0eTogRWRtLlByaW1pdGl2ZVR5cGUgPSBwcm9wZXJ0eS5UYXJnZXQuJHRhcmdldC5WYWx1ZS4kdGFyZ2V0O1xuXHRcdFx0XHR2YWx1ZUluZGV4ID0gX3B1c2hVbmlxdWUocGF0aCwgZGF0YVBvaW50UHJvcGVydHkpO1xuXHRcdFx0XHQvLyBOZXcgZmFrZSBwcm9wZXJ0eSBjcmVhdGVkIGZvciB0aGUgUmF0aW5nL1Byb2dyZXNzIFRhcmdldCBWYWx1ZS4gSXQnbGwgYmUgdXNlZCBmb3IgdGhlIGV4cG9ydCBvbiBzcGxpdCBtb2RlLlxuXHRcdFx0XHRfcHVzaFVuaXF1ZShwcm9wZXJ0eS5UYXJnZXQudmFsdWUsIHByb3BlcnR5LlRhcmdldC4kdGFyZ2V0KTtcblx0XHRcdFx0dGFyZ2V0VmFsdWUgPSAocHJvcGVydHkuVGFyZ2V0LiR0YXJnZXQuVGFyZ2V0VmFsdWUgfHwgcHJvcGVydHkuVGFyZ2V0LiR0YXJnZXQuTWF4aW11bVZhbHVlKS50b1N0cmluZygpO1xuXHRcdFx0XHRfYXBwZW5kVGVtcGxhdGUoYHske3ZhbHVlSW5kZXh9fS8ke3RhcmdldFZhbHVlfWApO1xuXHRcdFx0fSBlbHNlIGlmIChwcm9wZXJ0eS5hbm5vdGF0aW9ucz8uVUk/LkRhdGFGaWVsZERlZmF1bHQ/LlRhcmdldD8uJHRhcmdldD8uJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFQb2ludFR5cGUpIHtcblx0XHRcdFx0Ly8gRGF0YVBvaW50IHVzZS1jYXNlIHVzaW5nIERhdGFGaWVsZERlZmF1bHQuXG5cdFx0XHRcdGNvbnN0IGRhdGFQb2ludERlZmF1bHRQcm9wZXJ0eTogRWRtLlByaW1pdGl2ZVR5cGUgPSBwcm9wZXJ0eS5hbm5vdGF0aW9ucy5VSS5EYXRhRmllbGREZWZhdWx0O1xuXHRcdFx0XHR2YWx1ZUluZGV4ID0gX3B1c2hVbmlxdWUocGF0aCwgcHJvcGVydHkpO1xuXHRcdFx0XHQvLyBOZXcgZmFrZSBwcm9wZXJ0eSBjcmVhdGVkIGZvciB0aGUgUmF0aW5nL1Byb2dyZXNzIFRhcmdldCBWYWx1ZS4gSXQnbGwgYmUgdXNlZCBmb3IgdGhlIGV4cG9ydCBvbiBzcGxpdCBtb2RlLlxuXHRcdFx0XHRfcHVzaFVuaXF1ZShkYXRhUG9pbnREZWZhdWx0UHJvcGVydHkuVGFyZ2V0LnZhbHVlLCBwcm9wZXJ0eSk7XG5cdFx0XHRcdHRhcmdldFZhbHVlID0gKFxuXHRcdFx0XHRcdGRhdGFQb2ludERlZmF1bHRQcm9wZXJ0eS5UYXJnZXQuJHRhcmdldC5UYXJnZXRWYWx1ZSB8fCBkYXRhUG9pbnREZWZhdWx0UHJvcGVydHkuVGFyZ2V0LiR0YXJnZXQuVGFyZ2V0VmFsdWUuTWF4aW11bVZhbHVlXG5cdFx0XHRcdCkudG9TdHJpbmcoKTtcblx0XHRcdFx0X2FwcGVuZFRlbXBsYXRlKGB7JHt2YWx1ZUluZGV4fX0vJHt0YXJnZXRWYWx1ZX1gKTtcblx0XHRcdH0gZWxzZSBpZiAocHJvcGVydHkuVGFyZ2V0Py4kdGFyZ2V0Py4kVHlwZSA9PT0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tdW5pY2F0aW9uLnYxLkNvbnRhY3RUeXBlXCIpIHtcblx0XHRcdFx0cmVsYXRlZFByb3BlcnRpZXMuZXhwb3J0U2V0dGluZ3NDb250YWN0UHJvcGVydHkgPVxuXHRcdFx0XHRcdHByb3BlcnR5LlRhcmdldC52YWx1ZS5zdWJzdHJpbmcoMCwgcHJvcGVydHkuVGFyZ2V0LnZhbHVlLmluZGV4T2YoXCIvXCIpICsgMSkgKyBwcm9wZXJ0eS5UYXJnZXQuJHRhcmdldC5mbj8ucGF0aDtcblx0XHRcdFx0dmFsdWVJbmRleCA9IF9wdXNoVW5pcXVlKHBhdGgsIHByb3BlcnR5LlRhcmdldC4kdGFyZ2V0LmZuLiR0YXJnZXQpO1xuXHRcdFx0XHRfYXBwZW5kVGVtcGxhdGUoYHske3ZhbHVlSW5kZXh9fWApO1xuXHRcdFx0fSBlbHNlIGlmICghaWdub3JlU2VsZikge1xuXHRcdFx0XHQvLyBDb2xsZWN0IHVuZGVybHlpbmcgcHJvcGVydHlcblx0XHRcdFx0dmFsdWVJbmRleCA9IF9wdXNoVW5pcXVlKHBhdGgsIHByb3BlcnR5KTtcblx0XHRcdFx0X2FwcGVuZFRlbXBsYXRlKGB7JHt2YWx1ZUluZGV4fX1gKTtcblx0XHRcdFx0aWYgKGN1cnJlbmN5T3JVbml0QW5ub3RhdGlvbikge1xuXHRcdFx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzLmV4cG9ydFVuaXRTdHJpbmcgPSBgJHtjdXJyZW5jeU9yVW5pdEFubm90YXRpb259YDsgLy8gSGFyZC1jb2RlZCBjdXJyZW5jeS91bml0XG5cdFx0XHRcdH0gZWxzZSBpZiAodGltZXpvbmVBbm5vdGF0aW9uKSB7XG5cdFx0XHRcdFx0cmVsYXRlZFByb3BlcnRpZXMuZXhwb3J0VGltZXpvbmVTdHJpbmcgPSBgJHt0aW1lem9uZUFubm90YXRpb259YDsgLy8gSGFyZC1jb2RlZCB0aW1lem9uZVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmVsYXRlZFByb3BlcnRpZXMgPSBfY29sbGVjdEFkZGl0aW9uYWxQcm9wZXJ0aWVzRm9yQW5hbHl0aWNhbFRhYmxlKHByb3BlcnR5LCBuYXZpZ2F0aW9uUGF0aFByZWZpeCwgdGFibGVUeXBlLCByZWxhdGVkUHJvcGVydGllcyk7XG5cdFx0aWYgKE9iamVjdC5rZXlzKHJlbGF0ZWRQcm9wZXJ0aWVzLmFkZGl0aW9uYWxQcm9wZXJ0aWVzKS5sZW5ndGggPiAwICYmIE9iamVjdC5rZXlzKHJlbGF0ZWRQcm9wZXJ0aWVzLnByb3BlcnRpZXMpLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0Ly8gQ29sbGVjdCB1bmRlcmx5aW5nIHByb3BlcnR5IGlmIG5vdCBjb2xsZWN0ZWQgYWxyZWFkeS5cblx0XHRcdC8vIFRoaXMgaXMgdG8gZW5zdXJlIHRoYXQgYWRkaXRpb25hbFByb3BlcnRpZXMgYXJlIG1hZGUgYXZhaWxhYmxlIG9ubHkgdG8gY29tcGxleCBwcm9wZXJ0eSBpbmZvcy5cblx0XHRcdHZhbHVlSW5kZXggPSBfcHVzaFVuaXF1ZShwYXRoLCBwcm9wZXJ0eSk7XG5cdFx0XHRfYXBwZW5kVGVtcGxhdGUoYHske3ZhbHVlSW5kZXh9fWApO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiByZWxhdGVkUHJvcGVydGllcztcbn1cblxuLyoqXG4gKiBDb2xsZWN0IHByb3BlcnRpZXMgY29uc3VtZWQgYnkgYSBEYXRhRmllbGQuXG4gKiBUaGlzIGlzIGZvciBwb3B1bGF0aW5nIHRoZSBDb21wbGV4UHJvcGVydHlJbmZvcyBvZiB0aGUgdGFibGUgZGVsZWdhdGUuXG4gKlxuICogQHBhcmFtIHtEYXRhRmllbGRBYnN0cmFjdFR5cGVzfSBkYXRhRmllbGQgVGhlIERhdGFGaWVsZCBmb3Igd2hpY2ggdGhlIHByb3BlcnRpZXMgbmVlZCB0byBiZSBpZGVudGlmaWVkLlxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGNvbnZlcnRlciBjb250ZXh0LlxuICogQHBhcmFtIHtUYWJsZVR5cGV9IHRhYmxlVHlwZSBUaGUgdGFibGUgdHlwZS5cbiAqIEBwYXJhbSB7Q29tcGxleFByb3BlcnR5SW5mb30gcmVsYXRlZFByb3BlcnRpZXMgVGhlIHByb3BlcnRpZXMgaWRlbnRpZmllZCBzbyBmYXIuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGlzRW1iZWRkZWQgVHJ1ZSBpZiB0aGUgZGF0YWZpZWxkIGlzIGVtYmVkZGVkIGluIGFub3RoZXIgYW5ub3RhdGlvbiAoZS5nLiBGaWVsZEdyb3VwKS5cbiAqIEByZXR1cm5zIHtDb21wbGV4UHJvcGVydHlJbmZvfSBUaGUgcHJvcGVydGllcyByZWxhdGVkIHRvIHRoZSBEYXRhRmllbGQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb2xsZWN0UmVsYXRlZFByb3BlcnRpZXNSZWN1cnNpdmVseShcblx0ZGF0YUZpZWxkOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LFxuXHR0YWJsZVR5cGU6IFRhYmxlVHlwZSxcblx0cmVsYXRlZFByb3BlcnRpZXM6IENvbXBsZXhQcm9wZXJ0eUluZm8gPSB7IHByb3BlcnRpZXM6IHt9LCBhZGRpdGlvbmFsUHJvcGVydGllczoge30gfSxcblx0aXNFbWJlZGRlZDogYm9vbGVhbiA9IGZhbHNlXG4pOiBDb21wbGV4UHJvcGVydHlJbmZvIHtcblx0aWYgKChkYXRhRmllbGQuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZCB8fCBkYXRhRmllbGQuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhVcmwpICYmIGRhdGFGaWVsZC5WYWx1ZSkge1xuXHRcdGNvbnN0IHByb3BlcnR5ID0gZGF0YUZpZWxkLlZhbHVlO1xuXHRcdHJlbGF0ZWRQcm9wZXJ0aWVzID0gY29sbGVjdFJlbGF0ZWRQcm9wZXJ0aWVzKFxuXHRcdFx0cHJvcGVydHkucGF0aCxcblx0XHRcdHByb3BlcnR5LiR0YXJnZXQsXG5cdFx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdFx0ZmFsc2UsXG5cdFx0XHR0YWJsZVR5cGUsXG5cdFx0XHRyZWxhdGVkUHJvcGVydGllcyxcblx0XHRcdGlzRW1iZWRkZWRcblx0XHQpO1xuXHRcdGNvbnN0IG5hdmlnYXRpb25QYXRoUHJlZml4ID0gX2dldE5hdmlnYXRpb25QYXRoUHJlZml4KHByb3BlcnR5LnBhdGgpO1xuXHRcdHJlbGF0ZWRQcm9wZXJ0aWVzID0gX2NvbGxlY3RBZGRpdGlvbmFsUHJvcGVydGllc0ZvckFuYWx5dGljYWxUYWJsZShkYXRhRmllbGQsIG5hdmlnYXRpb25QYXRoUHJlZml4LCB0YWJsZVR5cGUsIHJlbGF0ZWRQcm9wZXJ0aWVzKTtcblx0fSBlbHNlIGlmIChkYXRhRmllbGQuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFubm90YXRpb24pIHtcblx0XHRzd2l0Y2ggKGRhdGFGaWVsZC5UYXJnZXQ/LiR0YXJnZXQ/LiRUeXBlKSB7XG5cdFx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkZpZWxkR3JvdXBUeXBlOlxuXHRcdFx0XHRkYXRhRmllbGQuVGFyZ2V0LiR0YXJnZXQuRGF0YT8uZm9yRWFjaCgoaW5uZXJEYXRhRmllbGQ6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMpID0+IHtcblx0XHRcdFx0XHRyZWxhdGVkUHJvcGVydGllcyA9IGNvbGxlY3RSZWxhdGVkUHJvcGVydGllc1JlY3Vyc2l2ZWx5KFxuXHRcdFx0XHRcdFx0aW5uZXJEYXRhRmllbGQsXG5cdFx0XHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdFx0XHRcdFx0dGFibGVUeXBlLFxuXHRcdFx0XHRcdFx0cmVsYXRlZFByb3BlcnRpZXMsXG5cdFx0XHRcdFx0XHR0cnVlXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFQb2ludFR5cGU6XG5cdFx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzID0gY29sbGVjdFJlbGF0ZWRQcm9wZXJ0aWVzKFxuXHRcdFx0XHRcdGRhdGFGaWVsZC5UYXJnZXQuJHRhcmdldC5WYWx1ZS5wYXRoLFxuXHRcdFx0XHRcdGRhdGFGaWVsZCxcblx0XHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdFx0XHRcdGZhbHNlLFxuXHRcdFx0XHRcdHRhYmxlVHlwZSxcblx0XHRcdFx0XHRyZWxhdGVkUHJvcGVydGllcyxcblx0XHRcdFx0XHRpc0VtYmVkZGVkXG5cdFx0XHRcdCk7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIFwiY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbXVuaWNhdGlvbi52MS5Db250YWN0VHlwZVwiOlxuXHRcdFx0XHRyZWxhdGVkUHJvcGVydGllcyA9IGNvbGxlY3RSZWxhdGVkUHJvcGVydGllcyhcblx0XHRcdFx0XHRkYXRhRmllbGQuVGFyZ2V0LnZhbHVlLFxuXHRcdFx0XHRcdGRhdGFGaWVsZCxcblx0XHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdFx0XHRcdGZhbHNlLFxuXHRcdFx0XHRcdHRhYmxlVHlwZSxcblx0XHRcdFx0XHRyZWxhdGVkUHJvcGVydGllcyxcblx0XHRcdFx0XHRpc0VtYmVkZGVkXG5cdFx0XHRcdCk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiByZWxhdGVkUHJvcGVydGllcztcbn1cblxuZXhwb3J0IGNvbnN0IGdldERhdGFGaWVsZERhdGFUeXBlID0gZnVuY3Rpb24gKG9EYXRhRmllbGQ6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMgfCBQcm9wZXJ0eSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdGxldCBzRGF0YVR5cGU6IHN0cmluZyB8IHVuZGVmaW5lZCA9IChvRGF0YUZpZWxkIGFzIERhdGFGaWVsZEFic3RyYWN0VHlwZXMpLiRUeXBlO1xuXHRzd2l0Y2ggKHNEYXRhVHlwZSkge1xuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQWN0aW9uOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uOlxuXHRcdFx0c0RhdGFUeXBlID0gdW5kZWZpbmVkO1xuXHRcdFx0YnJlYWs7XG5cblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZDpcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhOYXZpZ2F0aW9uUGF0aDpcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhVcmw6XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoSW50ZW50QmFzZWROYXZpZ2F0aW9uOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aEFjdGlvbjpcblx0XHRcdHNEYXRhVHlwZSA9IChvRGF0YUZpZWxkIGFzIERhdGFGaWVsZCk/LlZhbHVlPy4kdGFyZ2V0Py50eXBlO1xuXHRcdFx0YnJlYWs7XG5cblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFubm90YXRpb246XG5cdFx0ZGVmYXVsdDpcblx0XHRcdGNvbnN0IHNEYXRhVHlwZUZvckRhdGFGaWVsZEZvckFubm90YXRpb24gPSAob0RhdGFGaWVsZCBhcyBEYXRhRmllbGRGb3JBbm5vdGF0aW9uKS5UYXJnZXQ/LiR0YXJnZXQuJFR5cGU7XG5cdFx0XHRpZiAoc0RhdGFUeXBlRm9yRGF0YUZpZWxkRm9yQW5ub3RhdGlvbikge1xuXHRcdFx0XHRpZiAoKG9EYXRhRmllbGQgYXMgRGF0YUZpZWxkRm9yQW5ub3RhdGlvbikuVGFyZ2V0Py4kdGFyZ2V0LiRUeXBlID09PSBDb21tdW5pY2F0aW9uQW5ub3RhdGlvblR5cGVzLkNvbnRhY3RUeXBlKSB7XG5cdFx0XHRcdFx0c0RhdGFUeXBlID0gKCgob0RhdGFGaWVsZCBhcyBEYXRhRmllbGRGb3JBbm5vdGF0aW9uKS5UYXJnZXQ/LiR0YXJnZXQgYXMgQ29udGFjdCk/LmZuIGFzIGFueSkuJHRhcmdldD8udHlwZTtcblx0XHRcdFx0fSBlbHNlIGlmICgob0RhdGFGaWVsZCBhcyBEYXRhRmllbGRGb3JBbm5vdGF0aW9uKS5UYXJnZXQ/LiR0YXJnZXQuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFQb2ludFR5cGUpIHtcblx0XHRcdFx0XHRzRGF0YVR5cGUgPVxuXHRcdFx0XHRcdFx0KChvRGF0YUZpZWxkIGFzIERhdGFGaWVsZEZvckFubm90YXRpb24pLlRhcmdldD8uJHRhcmdldCBhcyBEYXRhUG9pbnQpPy5WYWx1ZT8uJFBhdGg/LiRUeXBlIHx8XG5cdFx0XHRcdFx0XHQoKG9EYXRhRmllbGQgYXMgRGF0YUZpZWxkRm9yQW5ub3RhdGlvbikuVGFyZ2V0Py4kdGFyZ2V0IGFzIERhdGFQb2ludCk/LlZhbHVlPy4kdGFyZ2V0LnR5cGU7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gZS5nLiBGaWVsZEdyb3VwIG9yIENoYXJ0XG5cdFx0XHRcdFx0c0RhdGFUeXBlID0gdW5kZWZpbmVkO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRzRGF0YVR5cGUgPSB1bmRlZmluZWQ7XG5cdFx0XHR9XG5cdFx0XHRicmVhaztcblx0fVxuXG5cdHJldHVybiBzRGF0YVR5cGU7XG59O1xuIl19
416
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkRhdGFGaWVsZC50cyJdLCJuYW1lcyI6WyJpc0RhdGFGaWVsZEZvckFjdGlvbkFic3RyYWN0IiwiZGF0YUZpZWxkIiwiaGFzT3duUHJvcGVydHkiLCJpc0RhdGFGaWVsZFR5cGVzIiwiaXNEYXRhRmllbGRBbHdheXNIaWRkZW4iLCJhbm5vdGF0aW9ucyIsIlVJIiwiSGlkZGVuIiwidmFsdWVPZiIsIlZhbHVlIiwiJHRhcmdldCIsImdldFNlbWFudGljT2JqZWN0UGF0aCIsImNvbnZlcnRlckNvbnRleHQiLCJvYmplY3QiLCJwcm9wZXJ0eSIsIkNvbW1vbiIsIlNlbWFudGljT2JqZWN0IiwidW5kZWZpbmVkIiwiZ2V0RW50aXR5U2V0QmFzZWRBbm5vdGF0aW9uUGF0aCIsImZ1bGx5UXVhbGlmaWVkTmFtZSIsImlzUHJvcGVydHkiLCJfZ2V0TmF2aWdhdGlvblBhdGhQcmVmaXgiLCJwYXRoIiwiaW5kZXhPZiIsInN1YnN0cmluZyIsImxhc3RJbmRleE9mIiwiX2NvbGxlY3RBZGRpdGlvbmFsUHJvcGVydGllc0ZvckFuYWx5dGljYWxUYWJsZSIsInRhcmdldCIsIm5hdmlnYXRpb25QYXRoUHJlZml4IiwidGFibGVUeXBlIiwicmVsYXRlZFByb3BlcnRpZXMiLCJoaWRkZW5Bbm5vdGF0aW9uIiwiX3R5cGUiLCJoaWRkZW5Bbm5vdGF0aW9uUHJvcGVydHlQYXRoIiwiYWRkaXRpb25hbFByb3BlcnRpZXMiLCJjb2xsZWN0UmVsYXRlZFByb3BlcnRpZXMiLCJpZ25vcmVTZWxmIiwicHJvcGVydGllcyIsImFkZFVuaXRJblRlbXBsYXRlIiwiX3B1c2hVbmlxdWUiLCJrZXkiLCJ2YWx1ZSIsIk9iamVjdCIsImtleXMiLCJfYXBwZW5kVGVtcGxhdGUiLCJleHBvcnRTZXR0aW5nc1RlbXBsYXRlIiwidGV4dEFubm90YXRpb24iLCJUZXh0IiwidmFsdWVJbmRleCIsInRhcmdldFZhbHVlIiwiY3VycmVuY3lPclVvTUluZGV4IiwidGltZXpvbmVPclVvTUluZGV4IiwiZXhwb3J0U2V0dGluZ3NXcmFwcGluZyIsImRhdGFNb2RlbE9iamVjdFBhdGgiLCJnZXREYXRhTW9kZWxPYmplY3RQYXRoIiwidGV4dEFubm90YXRpb25Qcm9wZXJ0eVBhdGgiLCJkaXNwbGF5TW9kZSIsImdldERpc3BsYXlNb2RlIiwiZGVzY3JpcHRpb25JbmRleCIsInZpc3VhbFNldHRpbmdzVG9CZUV4Y2x1ZGVkIiwiY3VycmVuY3lPclVvTVByb3BlcnR5IiwiZ2V0QXNzb2NpYXRlZEN1cnJlbmN5UHJvcGVydHkiLCJnZXRBc3NvY2lhdGVkVW5pdFByb3BlcnR5IiwiY3VycmVuY3lPclVuaXRBbm5vdGF0aW9uIiwiTWVhc3VyZXMiLCJJU09DdXJyZW5jeSIsIlVuaXQiLCJ0aW1lem9uZVByb3BlcnR5IiwiZ2V0QXNzb2NpYXRlZFRpbWV6b25lUHJvcGVydHkiLCJ0aW1lem9uZUFubm90YXRpb24iLCJUaW1lem9uZSIsIm5hbWUiLCJleHBvcnRVbml0TmFtZSIsImV4cG9ydFRpbWV6b25lTmFtZSIsIlRhcmdldCIsIlZpc3VhbGl6YXRpb24iLCJkYXRhUG9pbnRQcm9wZXJ0eSIsIlRhcmdldFZhbHVlIiwiTWF4aW11bVZhbHVlIiwidG9TdHJpbmciLCJEYXRhRmllbGREZWZhdWx0IiwiJFR5cGUiLCJkYXRhUG9pbnREZWZhdWx0UHJvcGVydHkiLCJjb250YWN0UHJvcGVydHkiLCJmbiIsImNvbnRhY3RQcm9wZXJ0eVBhdGgiLCJleHBvcnRVbml0U3RyaW5nIiwiZXhwb3J0VGltZXpvbmVTdHJpbmciLCJsZW5ndGgiLCJjb2xsZWN0UmVsYXRlZFByb3BlcnRpZXNSZWN1cnNpdmVseSIsImlzRW1iZWRkZWQiLCJEYXRhIiwiZm9yRWFjaCIsImlubmVyRGF0YUZpZWxkIiwiZGF0YUZpZWxkQ29udGFjdCIsImdldERhdGFGaWVsZERhdGFUeXBlIiwib0RhdGFGaWVsZCIsInNEYXRhVHlwZSIsInR5cGUiLCJzRGF0YVR5cGVGb3JEYXRhRmllbGRGb3JBbm5vdGF0aW9uIiwiJFBhdGgiXSwibWFwcGluZ3MiOiI7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c0RBQStDaEUsT0FBL0MsQ0FBdUR1RSxLQUF2RCxnREFBSixFQUFzRztBQUFBOztBQUM1R2dCLFlBQUFBLFNBQVMsR0FDUixhQUFFRCxVQUFELENBQXVDdEIsTUFBeEMsaUVBQUMsU0FBK0NoRSxPQUFoRCwrRkFBdUVELEtBQXZFLDBHQUE4RTJGLEtBQTlFLGtGQUFxRm5CLEtBQXJGLGtCQUNFZSxVQUFELENBQXVDdEIsTUFEeEMsaUVBQ0MsU0FBK0NoRSxPQURoRCw4RUFDQSxpQkFBdUVELEtBRHZFLDBEQUNBLHNCQUE4RUMsT0FBOUUsQ0FBc0Z3RixJQUR0RixDQUREO0FBR0EsV0FKTSxNQUlBO0FBQ047QUFDQUQsWUFBQUEsU0FBUyxHQUFHaEYsU0FBWjtBQUNBO0FBQ0QsU0FYRCxNQVdPO0FBQ05nRixVQUFBQSxTQUFTLEdBQUdoRixTQUFaO0FBQ0E7O0FBQ0Q7QUEvQkY7O0FBa0NBLFdBQU9nRixTQUFQO0FBQ0EsR0FyQ00iLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFByb3BlcnR5IH0gZnJvbSBcIkBzYXAtdXgvYW5ub3RhdGlvbi1jb252ZXJ0ZXJcIjtcbmltcG9ydCB7XG5cdENvbW11bmljYXRpb25Bbm5vdGF0aW9uVHlwZXMsXG5cdENvbnRhY3QsXG5cdERhdGFGaWVsZCxcblx0RGF0YUZpZWxkQWJzdHJhY3RUeXBlcyxcblx0RGF0YUZpZWxkRm9yQWN0aW9uQWJzdHJhY3RUeXBlcyxcblx0RGF0YUZpZWxkRm9yQW5ub3RhdGlvbixcblx0RGF0YUZpZWxkVHlwZXMsXG5cdERhdGFQb2ludCxcblx0VUlBbm5vdGF0aW9uVHlwZXNcbn0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG5pbXBvcnQgKiBhcyBFZG0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL2Rpc3QvRWRtXCI7XG5pbXBvcnQgeyBUYWJsZVR5cGUgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9jb250cm9scy9Db21tb24vVGFibGVcIjtcbmltcG9ydCB7IGdldERpc3BsYXlNb2RlLCBQcm9wZXJ0eU9yUGF0aCB9IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL0Rpc3BsYXlNb2RlRm9ybWF0dGVyXCI7XG5pbXBvcnQge1xuXHRnZXRBc3NvY2lhdGVkQ3VycmVuY3lQcm9wZXJ0eSxcblx0Z2V0QXNzb2NpYXRlZFRpbWV6b25lUHJvcGVydHksXG5cdGdldEFzc29jaWF0ZWRVbml0UHJvcGVydHksXG5cdGlzUHJvcGVydHlcbn0gZnJvbSBcInNhcC9mZS9jb3JlL3RlbXBsYXRpbmcvUHJvcGVydHlIZWxwZXJcIjtcbmltcG9ydCBDb252ZXJ0ZXJDb250ZXh0IGZyb20gXCIuLi9Db252ZXJ0ZXJDb250ZXh0XCI7XG5cbmV4cG9ydCB0eXBlIENvbXBsZXhQcm9wZXJ0eUluZm8gPSB7XG5cdHByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIFByb3BlcnR5Pjtcblx0YWRkaXRpb25hbFByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIFByb3BlcnR5Pjtcblx0ZXhwb3J0U2V0dGluZ3NUZW1wbGF0ZT86IHN0cmluZztcblx0ZXhwb3J0U2V0dGluZ3NXcmFwcGluZz86IGJvb2xlYW47XG5cdHZpc3VhbFNldHRpbmdzVG9CZUV4Y2x1ZGVkPzogc3RyaW5nO1xuXHRleHBvcnRVbml0TmFtZT86IHN0cmluZztcblx0ZXhwb3J0VW5pdFN0cmluZz86IHN0cmluZztcblx0ZXhwb3J0VGltZXpvbmVOYW1lPzogc3RyaW5nO1xuXHRleHBvcnRUaW1lem9uZVN0cmluZz86IHN0cmluZztcbn07XG5cbi8qKlxuICogSWRlbnRpZmllcyBpZiB0aGUgZ2l2ZW4gZGF0YUZpZWxkQWJzdHJhY3QgdGhhdCBpcyBwYXNzZWQgaXMgYSBcIkRhdGFGaWVsZEZvckFjdGlvbkFic3RyYWN0XCIuXG4gKiBEYXRhRmllbGRGb3JBY3Rpb25BYnN0cmFjdCBoYXMgYW4gaW5saW5lIGFjdGlvbiBkZWZpbmVkLlxuICpcbiAqIEBwYXJhbSB7RGF0YUZpZWxkQWJzdHJhY3RUeXBlc30gZGF0YUZpZWxkIERhdGFGaWVsZCB0byBiZSBldmFsdWF0ZWRcbiAqIEByZXR1cm5zIHtib29sZWFufSBWYWxpZGF0ZXMgdGhhdCBkYXRhRmllbGQgaXMgYSBEYXRhRmllbGRGb3JBY3Rpb25BYnN0cmFjdFR5cGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRGF0YUZpZWxkRm9yQWN0aW9uQWJzdHJhY3QoZGF0YUZpZWxkOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzKTogZGF0YUZpZWxkIGlzIERhdGFGaWVsZEZvckFjdGlvbkFic3RyYWN0VHlwZXMge1xuXHRyZXR1cm4gKGRhdGFGaWVsZCBhcyBEYXRhRmllbGRGb3JBY3Rpb25BYnN0cmFjdFR5cGVzKS5oYXNPd25Qcm9wZXJ0eShcIkFjdGlvblwiKTtcbn1cblxuLyoqXG4gKiBJZGVudGlmaWVzIGlmIHRoZSBnaXZlbiBkYXRhRmllbGRBYnN0cmFjdCB0aGF0IGlzIHBhc3NlZCBpcyBhIFwiRGF0YUZpZWxkXCIuXG4gKiBEYXRhRmllbGQgaGFzIGEgdmFsdWUgZGVmaW5lZC5cbiAqXG4gKiBAcGFyYW0ge0RhdGFGaWVsZEFic3RyYWN0VHlwZXN9IGRhdGFGaWVsZCBEYXRhRmllbGQgdG8gYmUgZXZhbHVhdGVkXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVmFsaWRhdGUgdGhhdCBkYXRhRmllbGQgaXMgYSBEYXRhRmllbGRUeXBlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNEYXRhRmllbGRUeXBlcyhkYXRhRmllbGQ6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMpOiBkYXRhRmllbGQgaXMgRGF0YUZpZWxkVHlwZXMge1xuXHRyZXR1cm4gKGRhdGFGaWVsZCBhcyBEYXRhRmllbGRUeXBlcykuaGFzT3duUHJvcGVydHkoXCJWYWx1ZVwiKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgZ2l2ZW4gRGF0YUZpZWxkIGhhcyBhIHN0YXRpYyBoaWRkZW4gYW5ub3RhdGlvbi5cbiAqXG4gKiBAcGFyYW0ge0RhdGFGaWVsZEFic3RyYWN0VHlwZXN9IGRhdGFGaWVsZCBUaGUgZGF0YWZpZWxkIHRvIGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIGRhdGFmaWVsZCBvciByZWZlcmVuY2VkIHByb3BlcnR5IGhhcyBhIHN0YXRpYyBIaWRkZW4gYW5ub3RhdGlvbiwgZmFsc2UgZWxzZVxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRGF0YUZpZWxkQWx3YXlzSGlkZGVuKGRhdGFGaWVsZDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyk6IGJvb2xlYW4ge1xuXHRyZXR1cm4gKFxuXHRcdGRhdGFGaWVsZC5hbm5vdGF0aW9ucz8uVUk/LkhpZGRlbj8udmFsdWVPZigpID09PSB0cnVlIHx8XG5cdFx0KGlzRGF0YUZpZWxkVHlwZXMoZGF0YUZpZWxkKSAmJiBkYXRhRmllbGQuVmFsdWU/LiR0YXJnZXQ/LmFubm90YXRpb25zPy5VST8uSGlkZGVuID09PSB0cnVlKVxuXHQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2VtYW50aWNPYmplY3RQYXRoKGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsIG9iamVjdDogYW55KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0aWYgKHR5cGVvZiBvYmplY3QgPT09IFwib2JqZWN0XCIpIHtcblx0XHRpZiAoaXNEYXRhRmllbGRUeXBlcyhvYmplY3QpICYmIG9iamVjdC5WYWx1ZT8uJHRhcmdldCkge1xuXHRcdFx0Y29uc3QgcHJvcGVydHkgPSBvYmplY3QuVmFsdWU/LiR0YXJnZXQ7XG5cdFx0XHRpZiAocHJvcGVydHk/LmFubm90YXRpb25zPy5Db21tb24/LlNlbWFudGljT2JqZWN0ICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0cmV0dXJuIGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0QmFzZWRBbm5vdGF0aW9uUGF0aChwcm9wZXJ0eT8uZnVsbHlRdWFsaWZpZWROYW1lKTtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKGlzUHJvcGVydHkob2JqZWN0KSkge1xuXHRcdFx0aWYgKG9iamVjdD8uYW5ub3RhdGlvbnM/LkNvbW1vbj8uU2VtYW50aWNPYmplY3QgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRyZXR1cm4gY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlTZXRCYXNlZEFubm90YXRpb25QYXRoKG9iamVjdD8uZnVsbHlRdWFsaWZpZWROYW1lKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0cmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBuYXZpZ2F0aW9uIHBhdGggcHJlZml4IGZvciBhIHByb3BlcnR5IHBhdGguXG4gKlxuICogQHBhcmFtIHBhdGggVGhlIHByb3BlcnR5IHBhdGggRm9yIGUuZy4gL0VudGl0eVR5cGUvTmF2aWdhdGlvbi9Qcm9wZXJ0eVxuICogQHJldHVybnMge3N0cmluZ30gVGhlIG5hdmlnYXRpb24gcGF0aCBwcmVmaXggRm9yIGUuZy4gL0VudGl0eVR5cGUvTmF2aWdhdGlvbi9cbiAqL1xuZnVuY3Rpb24gX2dldE5hdmlnYXRpb25QYXRoUHJlZml4KHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG5cdHJldHVybiBwYXRoLmluZGV4T2YoXCIvXCIpID4gLTEgPyBwYXRoLnN1YnN0cmluZygwLCBwYXRoLmxhc3RJbmRleE9mKFwiL1wiKSArIDEpIDogXCJcIjtcbn1cblxuLyoqXG4gKiBDb2xsZWN0IGFkZGl0aW9uYWwgcHJvcGVydGllcyBmb3IgdGhlIEFMUCB0YWJsZSB1c2UtY2FzZS5cbiAqXG4gKiBGb3IgZS5nLiBJZiBVSS5IaWRkZW4gcG9pbnRzIHRvIGEgcHJvcGVydHksIGluY2x1ZGUgdGhpcyBwcm9wZXJ0eSBpbiB0aGUgYWRkaXRpb25hbFByb3BlcnRpZXMgb2YgQ29tcGxleFByb3BlcnR5SW5mbyBvYmplY3QuXG4gKlxuICogQHBhcmFtIHRhcmdldCBQcm9wZXJ0eSBvciBEYXRhRmllbGQgYmVpbmcgcHJvY2Vzc2VkXG4gKiBAcGFyYW0gbmF2aWdhdGlvblBhdGhQcmVmaXggTmF2aWdhdGlvbiBwYXRoIHByZWZpeCwgYXBwbGljYWJsZSBpbiBjYXNlIG9mIG5hdmlnYXRpb24gcHJvcGVydGllcy5cbiAqIEBwYXJhbSB0YWJsZVR5cGUgVGFibGUgdHlwZS5cbiAqIEBwYXJhbSByZWxhdGVkUHJvcGVydGllcyBUaGUgcmVsYXRlZCBwcm9wZXJ0aWVzIGlkZW50aWZpZWQgc28gZmFyLlxuICogQHJldHVybnMge0NvbXBsZXhQcm9wZXJ0eUluZm99IFRoZSByZWxhdGVkIHByb3BlcnRpZXMgaWRlbnRpZmllZC5cbiAqL1xuZnVuY3Rpb24gX2NvbGxlY3RBZGRpdGlvbmFsUHJvcGVydGllc0ZvckFuYWx5dGljYWxUYWJsZShcblx0dGFyZ2V0OiBFZG0uUHJpbWl0aXZlVHlwZSxcblx0bmF2aWdhdGlvblBhdGhQcmVmaXg6IHN0cmluZyxcblx0dGFibGVUeXBlOiBUYWJsZVR5cGUsXG5cdHJlbGF0ZWRQcm9wZXJ0aWVzOiBDb21wbGV4UHJvcGVydHlJbmZvXG4pOiBDb21wbGV4UHJvcGVydHlJbmZvIHtcblx0aWYgKHRhYmxlVHlwZSA9PT0gXCJBbmFseXRpY2FsVGFibGVcIikge1xuXHRcdGNvbnN0IGhpZGRlbkFubm90YXRpb24gPSB0YXJnZXQuYW5ub3RhdGlvbnM/LlVJPy5IaWRkZW47XG5cdFx0aWYgKGhpZGRlbkFubm90YXRpb24/LnBhdGggJiYgaGlkZGVuQW5ub3RhdGlvbi4kdGFyZ2V0Py5fdHlwZSA9PT0gXCJQcm9wZXJ0eVwiKSB7XG5cdFx0XHRjb25zdCBoaWRkZW5Bbm5vdGF0aW9uUHJvcGVydHlQYXRoID0gbmF2aWdhdGlvblBhdGhQcmVmaXggKyBoaWRkZW5Bbm5vdGF0aW9uLnBhdGg7XG5cdFx0XHQvLyBUaGlzIHByb3BlcnR5IHNob3VsZCBiZSBhZGRlZCB0byBhZGRpdGlvbmFsUHJvcGVydGllcyBtYXAgZm9yIHRoZSBBTFAgdGFibGUgdXNlLWNhc2UuXG5cdFx0XHRyZWxhdGVkUHJvcGVydGllcy5hZGRpdGlvbmFsUHJvcGVydGllc1toaWRkZW5Bbm5vdGF0aW9uUHJvcGVydHlQYXRoXSA9IGhpZGRlbkFubm90YXRpb24uJHRhcmdldDtcblx0XHR9XG5cdH1cblx0cmV0dXJuIHJlbGF0ZWRQcm9wZXJ0aWVzO1xufVxuXG4vKipcbiAqIENvbGxlY3QgcmVsYXRlZCBwcm9wZXJ0aWVzIGZyb20gYSBwcm9wZXJ0eSdzIGFubm90YXRpb25zLlxuICpcbiAqIEBwYXJhbSBwYXRoIFRoZSBwcm9wZXJ0eSBwYXRoXG4gKiBAcGFyYW0gcHJvcGVydHkgVGhlIHByb3BlcnR5IHRvIGJlIGNvbnNpZGVyZWRcbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHBhcmFtIGlnbm9yZVNlbGYgV2hldGhlciB0byBleGNsdWRlIHRoZSBzYW1lIHByb3BlcnR5IGZyb20gcmVsYXRlZCBwcm9wZXJ0aWVzLlxuICogQHBhcmFtIHRhYmxlVHlwZSBUaGUgdGFibGUgdHlwZS5cbiAqIEBwYXJhbSByZWxhdGVkUHJvcGVydGllcyBUaGUgcmVsYXRlZCBwcm9wZXJ0aWVzIGlkZW50aWZpZWQgc28gZmFyLlxuICogQHBhcmFtIGFkZFVuaXRJblRlbXBsYXRlIFRydWUgaWYgdGhlIHVuaXQvY3VycmVuY3kgcHJvcGVydHkgbmVlZHMgdG8gYmUgYWRkZWQgaW4gdGhlIGV4cG9ydCB0ZW1wbGF0ZVxuICogQHJldHVybnMge0NvbXBsZXhQcm9wZXJ0eUluZm99IFRoZSByZWxhdGVkIHByb3BlcnRpZXMgaWRlbnRpZmllZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbGxlY3RSZWxhdGVkUHJvcGVydGllcyhcblx0cGF0aDogc3RyaW5nLFxuXHRwcm9wZXJ0eTogRWRtLlByaW1pdGl2ZVR5cGUsXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdGlnbm9yZVNlbGY6IGJvb2xlYW4sXG5cdHRhYmxlVHlwZTogVGFibGVUeXBlLFxuXHRyZWxhdGVkUHJvcGVydGllczogQ29tcGxleFByb3BlcnR5SW5mbyA9IHsgcHJvcGVydGllczoge30sIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiB7fSB9LFxuXHRhZGRVbml0SW5UZW1wbGF0ZTogYm9vbGVhbiA9IGZhbHNlXG4pOiBDb21wbGV4UHJvcGVydHlJbmZvIHtcblx0LyoqXG5cdCAqIEhlbHBlciB0byBwdXNoIHVuaXF1ZSByZWxhdGVkIHByb3BlcnRpZXMuXG5cdCAqXG5cdCAqIEBwYXJhbSBrZXkgVGhlIHByb3BlcnR5IHBhdGhcblx0ICogQHBhcmFtIHZhbHVlIFRoZSBwcm9wZXJ0aWVzIG9iamVjdCBjb250YWluaW5nIHZhbHVlIHByb3BlcnR5LCBkZXNjcmlwdGlvbiBwcm9wZXJ0eS4uLlxuXHQgKiBAcmV0dXJucyBJbmRleCBhdCB3aGljaCB0aGUgcHJvcGVydHkgaXMgYXZhaWxhYmxlXG5cdCAqL1xuXHRmdW5jdGlvbiBfcHVzaFVuaXF1ZShrZXk6IHN0cmluZywgdmFsdWU6IFByb3BlcnR5KTogbnVtYmVyIHtcblx0XHRpZiAoIXJlbGF0ZWRQcm9wZXJ0aWVzLnByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuXHRcdFx0cmVsYXRlZFByb3BlcnRpZXMucHJvcGVydGllc1trZXldID0gdmFsdWU7XG5cdFx0fVxuXHRcdHJldHVybiBPYmplY3Qua2V5cyhyZWxhdGVkUHJvcGVydGllcy5wcm9wZXJ0aWVzKS5pbmRleE9mKGtleSk7XG5cdH1cblxuXHQvKipcblx0ICogSGVscGVyIHRvIGFwcGVuZCB0aGUgZXhwb3J0IHNldHRpbmdzIHRlbXBsYXRlIHdpdGggYSBmb3JtYXR0ZWQgdGV4dC5cblx0ICpcblx0ICogQHBhcmFtIHZhbHVlIEZvcm1hdHRlZCB0ZXh0XG5cdCAqL1xuXHRmdW5jdGlvbiBfYXBwZW5kVGVtcGxhdGUodmFsdWU6IHN0cmluZykge1xuXHRcdHJlbGF0ZWRQcm9wZXJ0aWVzLmV4cG9ydFNldHRpbmdzVGVtcGxhdGUgPSByZWxhdGVkUHJvcGVydGllcy5leHBvcnRTZXR0aW5nc1RlbXBsYXRlXG5cdFx0XHQ/IGAke3JlbGF0ZWRQcm9wZXJ0aWVzLmV4cG9ydFNldHRpbmdzVGVtcGxhdGV9JHt2YWx1ZX1gXG5cdFx0XHQ6IGAke3ZhbHVlfWA7XG5cdH1cblxuXHRpZiAocGF0aCAmJiBwcm9wZXJ0eSkge1xuXHRcdGNvbnN0IG5hdmlnYXRpb25QYXRoUHJlZml4ID0gX2dldE5hdmlnYXRpb25QYXRoUHJlZml4KHBhdGgpO1xuXG5cdFx0Ly8gQ2hlY2sgZm9yIFRleHQgYW5ub3RhdGlvbi5cblx0XHRjb25zdCB0ZXh0QW5ub3RhdGlvbiA9IHByb3BlcnR5LmFubm90YXRpb25zPy5Db21tb24/LlRleHQ7XG5cdFx0bGV0IHZhbHVlSW5kZXg6IG51bWJlcjtcblx0XHRsZXQgdGFyZ2V0VmFsdWU6IHN0cmluZztcblx0XHRsZXQgY3VycmVuY3lPclVvTUluZGV4OiBudW1iZXI7XG5cdFx0bGV0IHRpbWV6b25lT3JVb01JbmRleDogbnVtYmVyO1xuXG5cdFx0aWYgKHJlbGF0ZWRQcm9wZXJ0aWVzLmV4cG9ydFNldHRpbmdzVGVtcGxhdGUpIHtcblx0XHRcdC8vIEZpZWxkR3JvdXAgdXNlLWNhc2UuIE5lZWQgdG8gYWRkIGVhY2ggRmllbGQgaW4gbmV3IGxpbmUuXG5cdFx0XHRfYXBwZW5kVGVtcGxhdGUoXCJcXG5cIik7XG5cdFx0XHRyZWxhdGVkUHJvcGVydGllcy5leHBvcnRTZXR0aW5nc1dyYXBwaW5nID0gdHJ1ZTtcblx0XHR9XG5cblx0XHRpZiAodGV4dEFubm90YXRpb24/LnBhdGggJiYgdGV4dEFubm90YXRpb24/LiR0YXJnZXQpIHtcblx0XHRcdC8vIENoZWNrIGZvciBUZXh0IEFycmFuZ2VtZW50LlxuXHRcdFx0Y29uc3QgZGF0YU1vZGVsT2JqZWN0UGF0aCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpO1xuXHRcdFx0Y29uc3QgdGV4dEFubm90YXRpb25Qcm9wZXJ0eVBhdGggPSBuYXZpZ2F0aW9uUGF0aFByZWZpeCArIHRleHRBbm5vdGF0aW9uLnBhdGg7XG5cdFx0XHRjb25zdCBkaXNwbGF5TW9kZSA9IGdldERpc3BsYXlNb2RlKHByb3BlcnR5IGFzIFByb3BlcnR5T3JQYXRoPFByb3BlcnR5PiwgZGF0YU1vZGVsT2JqZWN0UGF0aCk7XG5cdFx0XHRsZXQgZGVzY3JpcHRpb25JbmRleDogbnVtYmVyO1xuXHRcdFx0c3dpdGNoIChkaXNwbGF5TW9kZSkge1xuXHRcdFx0XHRjYXNlIFwiVmFsdWVcIjpcblx0XHRcdFx0XHR2YWx1ZUluZGV4ID0gX3B1c2hVbmlxdWUocGF0aCwgcHJvcGVydHkpO1xuXHRcdFx0XHRcdF9hcHBlbmRUZW1wbGF0ZShgeyR7dmFsdWVJbmRleH19YCk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSBcIkRlc2NyaXB0aW9uXCI6XG5cdFx0XHRcdFx0Ly8gS2VlcCB2YWx1ZSB3aGVuIGV4cG9ydGluZyAoc3BsaXQgbW9kZSkgb24gdGV4dCBBcnJhbmdlbWVudCBkZWZpbmVkIGFzICNUZXh0T25seSAoT25seSB2YWx1ZXMgYXJlIGV4cGVjdGVkIG9uIHBhc3RlIGZyb20gRXhjZWwgZnVuY3Rpb25hbGl0eSlcblx0XHRcdFx0XHRfcHVzaFVuaXF1ZShwYXRoLCBwcm9wZXJ0eSk7XG5cdFx0XHRcdFx0ZGVzY3JpcHRpb25JbmRleCA9IF9wdXNoVW5pcXVlKHRleHRBbm5vdGF0aW9uUHJvcGVydHlQYXRoLCB0ZXh0QW5ub3RhdGlvbi4kdGFyZ2V0KTtcblx0XHRcdFx0XHRfYXBwZW5kVGVtcGxhdGUoYHske2Rlc2NyaXB0aW9uSW5kZXh9fWApO1xuXHRcdFx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzLnZpc3VhbFNldHRpbmdzVG9CZUV4Y2x1ZGVkID0gcGF0aDtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlIFwiVmFsdWVEZXNjcmlwdGlvblwiOlxuXHRcdFx0XHRcdHZhbHVlSW5kZXggPSBfcHVzaFVuaXF1ZShwYXRoLCBwcm9wZXJ0eSk7XG5cdFx0XHRcdFx0ZGVzY3JpcHRpb25JbmRleCA9IF9wdXNoVW5pcXVlKHRleHRBbm5vdGF0aW9uUHJvcGVydHlQYXRoLCB0ZXh0QW5ub3RhdGlvbi4kdGFyZ2V0KTtcblx0XHRcdFx0XHRfYXBwZW5kVGVtcGxhdGUoYHske3ZhbHVlSW5kZXh9fSAoeyR7ZGVzY3JpcHRpb25JbmRleH19KWApO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgXCJEZXNjcmlwdGlvblZhbHVlXCI6XG5cdFx0XHRcdFx0dmFsdWVJbmRleCA9IF9wdXNoVW5pcXVlKHBhdGgsIHByb3BlcnR5KTtcblx0XHRcdFx0XHRkZXNjcmlwdGlvbkluZGV4ID0gX3B1c2hVbmlxdWUodGV4dEFubm90YXRpb25Qcm9wZXJ0eVBhdGgsIHRleHRBbm5vdGF0aW9uLiR0YXJnZXQpO1xuXHRcdFx0XHRcdF9hcHBlbmRUZW1wbGF0ZShgeyR7ZGVzY3JpcHRpb25JbmRleH19ICh7JHt2YWx1ZUluZGV4fX0pYCk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIENoZWNrIGZvciBmaWVsZCBjb250YWluaW5nIEN1cnJlbmN5IE9yIFVuaXQgUHJvcGVydGllcyBvciBUaW1lem9uZVxuXHRcdFx0Y29uc3QgY3VycmVuY3lPclVvTVByb3BlcnR5ID0gZ2V0QXNzb2NpYXRlZEN1cnJlbmN5UHJvcGVydHkocHJvcGVydHkpIHx8IGdldEFzc29jaWF0ZWRVbml0UHJvcGVydHkocHJvcGVydHkpO1xuXHRcdFx0Y29uc3QgY3VycmVuY3lPclVuaXRBbm5vdGF0aW9uID0gcHJvcGVydHk/LmFubm90YXRpb25zPy5NZWFzdXJlcz8uSVNPQ3VycmVuY3kgfHwgcHJvcGVydHk/LmFubm90YXRpb25zPy5NZWFzdXJlcz8uVW5pdDtcblx0XHRcdGNvbnN0IHRpbWV6b25lUHJvcGVydHkgPSBnZXRBc3NvY2lhdGVkVGltZXpvbmVQcm9wZXJ0eShwcm9wZXJ0eSk7XG5cdFx0XHRjb25zdCB0aW1lem9uZUFubm90YXRpb24gPSBwcm9wZXJ0eT8uYW5ub3RhdGlvbnM/LkNvbW1vbj8uVGltZXpvbmU7XG5cblx0XHRcdGlmIChjdXJyZW5jeU9yVW9NUHJvcGVydHkgJiYgY3VycmVuY3lPclVuaXRBbm5vdGF0aW9uPy4kdGFyZ2V0KSB7XG5cdFx0XHRcdHZhbHVlSW5kZXggPSBfcHVzaFVuaXF1ZShwYXRoLCBwcm9wZXJ0eSk7XG5cdFx0XHRcdGN1cnJlbmN5T3JVb01JbmRleCA9IF9wdXNoVW5pcXVlKGN1cnJlbmN5T3JVb01Qcm9wZXJ0eS5uYW1lLCBjdXJyZW5jeU9yVW5pdEFubm90YXRpb24uJHRhcmdldCk7XG5cdFx0XHRcdGlmIChhZGRVbml0SW5UZW1wbGF0ZSkge1xuXHRcdFx0XHRcdF9hcHBlbmRUZW1wbGF0ZShgeyR7dmFsdWVJbmRleH19ICB7JHtjdXJyZW5jeU9yVW9NSW5kZXh9fWApO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzLmV4cG9ydFVuaXROYW1lID0gY3VycmVuY3lPclVvTVByb3BlcnR5Lm5hbWU7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAodGltZXpvbmVQcm9wZXJ0eSAmJiB0aW1lem9uZUFubm90YXRpb24/LiR0YXJnZXQpIHtcblx0XHRcdFx0dmFsdWVJbmRleCA9IF9wdXNoVW5pcXVlKHBhdGgsIHByb3BlcnR5KTtcblx0XHRcdFx0dGltZXpvbmVPclVvTUluZGV4ID0gX3B1c2hVbmlxdWUodGltZXpvbmVQcm9wZXJ0eS5uYW1lLCB0aW1lem9uZUFubm90YXRpb24uJHRhcmdldCk7XG5cdFx0XHRcdGlmIChhZGRVbml0SW5UZW1wbGF0ZSkge1xuXHRcdFx0XHRcdF9hcHBlbmRUZW1wbGF0ZShgeyR7dmFsdWVJbmRleH19ICB7JHt0aW1lem9uZU9yVW9NSW5kZXh9fWApO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzLmV4cG9ydFRpbWV6b25lTmFtZSA9IHRpbWV6b25lUHJvcGVydHkubmFtZTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmIChwcm9wZXJ0eS5UYXJnZXQ/LiR0YXJnZXQ/LlZpc3VhbGl6YXRpb24pIHtcblx0XHRcdFx0Y29uc3QgZGF0YVBvaW50UHJvcGVydHk6IEVkbS5QcmltaXRpdmVUeXBlID0gcHJvcGVydHkuVGFyZ2V0LiR0YXJnZXQuVmFsdWUuJHRhcmdldDtcblx0XHRcdFx0dmFsdWVJbmRleCA9IF9wdXNoVW5pcXVlKHBhdGgsIGRhdGFQb2ludFByb3BlcnR5KTtcblx0XHRcdFx0Ly8gTmV3IGZha2UgcHJvcGVydHkgY3JlYXRlZCBmb3IgdGhlIFJhdGluZy9Qcm9ncmVzcyBUYXJnZXQgVmFsdWUuIEl0J2xsIGJlIHVzZWQgZm9yIHRoZSBleHBvcnQgb24gc3BsaXQgbW9kZS5cblx0XHRcdFx0X3B1c2hVbmlxdWUocHJvcGVydHkuVGFyZ2V0LnZhbHVlLCBwcm9wZXJ0eS5UYXJnZXQuJHRhcmdldCk7XG5cdFx0XHRcdHRhcmdldFZhbHVlID0gKHByb3BlcnR5LlRhcmdldC4kdGFyZ2V0LlRhcmdldFZhbHVlIHx8IHByb3BlcnR5LlRhcmdldC4kdGFyZ2V0Lk1heGltdW1WYWx1ZSkudG9TdHJpbmcoKTtcblx0XHRcdFx0X2FwcGVuZFRlbXBsYXRlKGB7JHt2YWx1ZUluZGV4fX0vJHt0YXJnZXRWYWx1ZX1gKTtcblx0XHRcdH0gZWxzZSBpZiAocHJvcGVydHkuYW5ub3RhdGlvbnM/LlVJPy5EYXRhRmllbGREZWZhdWx0Py5UYXJnZXQ/LiR0YXJnZXQ/LiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhUG9pbnRUeXBlKSB7XG5cdFx0XHRcdC8vIERhdGFQb2ludCB1c2UtY2FzZSB1c2luZyBEYXRhRmllbGREZWZhdWx0LlxuXHRcdFx0XHRjb25zdCBkYXRhUG9pbnREZWZhdWx0UHJvcGVydHk6IEVkbS5QcmltaXRpdmVUeXBlID0gcHJvcGVydHkuYW5ub3RhdGlvbnMuVUkuRGF0YUZpZWxkRGVmYXVsdDtcblx0XHRcdFx0dmFsdWVJbmRleCA9IF9wdXNoVW5pcXVlKHBhdGgsIHByb3BlcnR5KTtcblx0XHRcdFx0Ly8gTmV3IGZha2UgcHJvcGVydHkgY3JlYXRlZCBmb3IgdGhlIFJhdGluZy9Qcm9ncmVzcyBUYXJnZXQgVmFsdWUuIEl0J2xsIGJlIHVzZWQgZm9yIHRoZSBleHBvcnQgb24gc3BsaXQgbW9kZS5cblx0XHRcdFx0X3B1c2hVbmlxdWUoZGF0YVBvaW50RGVmYXVsdFByb3BlcnR5LlRhcmdldC52YWx1ZSwgcHJvcGVydHkpO1xuXHRcdFx0XHR0YXJnZXRWYWx1ZSA9IChcblx0XHRcdFx0XHRkYXRhUG9pbnREZWZhdWx0UHJvcGVydHkuVGFyZ2V0LiR0YXJnZXQuVGFyZ2V0VmFsdWUgfHwgZGF0YVBvaW50RGVmYXVsdFByb3BlcnR5LlRhcmdldC4kdGFyZ2V0LlRhcmdldFZhbHVlLk1heGltdW1WYWx1ZVxuXHRcdFx0XHQpLnRvU3RyaW5nKCk7XG5cdFx0XHRcdF9hcHBlbmRUZW1wbGF0ZShgeyR7dmFsdWVJbmRleH19LyR7dGFyZ2V0VmFsdWV9YCk7XG5cdFx0XHR9IGVsc2UgaWYgKHByb3BlcnR5LiRUeXBlID09PSBDb21tdW5pY2F0aW9uQW5ub3RhdGlvblR5cGVzLkNvbnRhY3RUeXBlKSB7XG5cdFx0XHRcdGNvbnN0IGNvbnRhY3RQcm9wZXJ0eSA9IHByb3BlcnR5LmZuPy4kdGFyZ2V0O1xuXHRcdFx0XHRjb25zdCBjb250YWN0UHJvcGVydHlQYXRoID0gcHJvcGVydHkuZm4/LnBhdGg7XG5cdFx0XHRcdHZhbHVlSW5kZXggPSBfcHVzaFVuaXF1ZShcblx0XHRcdFx0XHRuYXZpZ2F0aW9uUGF0aFByZWZpeCA/IG5hdmlnYXRpb25QYXRoUHJlZml4ICsgY29udGFjdFByb3BlcnR5UGF0aCA6IGNvbnRhY3RQcm9wZXJ0eVBhdGgsXG5cdFx0XHRcdFx0Y29udGFjdFByb3BlcnR5XG5cdFx0XHRcdCk7XG5cdFx0XHRcdF9hcHBlbmRUZW1wbGF0ZShgeyR7dmFsdWVJbmRleH19YCk7XG5cdFx0XHR9IGVsc2UgaWYgKCFpZ25vcmVTZWxmKSB7XG5cdFx0XHRcdC8vIENvbGxlY3QgdW5kZXJseWluZyBwcm9wZXJ0eVxuXHRcdFx0XHR2YWx1ZUluZGV4ID0gX3B1c2hVbmlxdWUocGF0aCwgcHJvcGVydHkpO1xuXHRcdFx0XHRfYXBwZW5kVGVtcGxhdGUoYHske3ZhbHVlSW5kZXh9fWApO1xuXHRcdFx0XHRpZiAoY3VycmVuY3lPclVuaXRBbm5vdGF0aW9uKSB7XG5cdFx0XHRcdFx0cmVsYXRlZFByb3BlcnRpZXMuZXhwb3J0VW5pdFN0cmluZyA9IGAke2N1cnJlbmN5T3JVbml0QW5ub3RhdGlvbn1gOyAvLyBIYXJkLWNvZGVkIGN1cnJlbmN5L3VuaXRcblx0XHRcdFx0fSBlbHNlIGlmICh0aW1lem9uZUFubm90YXRpb24pIHtcblx0XHRcdFx0XHRyZWxhdGVkUHJvcGVydGllcy5leHBvcnRUaW1lem9uZVN0cmluZyA9IGAke3RpbWV6b25lQW5ub3RhdGlvbn1gOyAvLyBIYXJkLWNvZGVkIHRpbWV6b25lXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZWxhdGVkUHJvcGVydGllcyA9IF9jb2xsZWN0QWRkaXRpb25hbFByb3BlcnRpZXNGb3JBbmFseXRpY2FsVGFibGUocHJvcGVydHksIG5hdmlnYXRpb25QYXRoUHJlZml4LCB0YWJsZVR5cGUsIHJlbGF0ZWRQcm9wZXJ0aWVzKTtcblx0XHRpZiAoT2JqZWN0LmtleXMocmVsYXRlZFByb3BlcnRpZXMuYWRkaXRpb25hbFByb3BlcnRpZXMpLmxlbmd0aCA+IDAgJiYgT2JqZWN0LmtleXMocmVsYXRlZFByb3BlcnRpZXMucHJvcGVydGllcykubGVuZ3RoID09PSAwKSB7XG5cdFx0XHQvLyBDb2xsZWN0IHVuZGVybHlpbmcgcHJvcGVydHkgaWYgbm90IGNvbGxlY3RlZCBhbHJlYWR5LlxuXHRcdFx0Ly8gVGhpcyBpcyB0byBlbnN1cmUgdGhhdCBhZGRpdGlvbmFsUHJvcGVydGllcyBhcmUgbWFkZSBhdmFpbGFibGUgb25seSB0byBjb21wbGV4IHByb3BlcnR5IGluZm9zLlxuXHRcdFx0dmFsdWVJbmRleCA9IF9wdXNoVW5pcXVlKHBhdGgsIHByb3BlcnR5KTtcblx0XHRcdF9hcHBlbmRUZW1wbGF0ZShgeyR7dmFsdWVJbmRleH19YCk7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIHJlbGF0ZWRQcm9wZXJ0aWVzO1xufVxuXG4vKipcbiAqIENvbGxlY3QgcHJvcGVydGllcyBjb25zdW1lZCBieSBhIERhdGFGaWVsZC5cbiAqIFRoaXMgaXMgZm9yIHBvcHVsYXRpbmcgdGhlIENvbXBsZXhQcm9wZXJ0eUluZm9zIG9mIHRoZSB0YWJsZSBkZWxlZ2F0ZS5cbiAqXG4gKiBAcGFyYW0ge0RhdGFGaWVsZEFic3RyYWN0VHlwZXN9IGRhdGFGaWVsZCBUaGUgRGF0YUZpZWxkIGZvciB3aGljaCB0aGUgcHJvcGVydGllcyBuZWVkIHRvIGJlIGlkZW50aWZpZWQuXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCBUaGUgY29udmVydGVyIGNvbnRleHQuXG4gKiBAcGFyYW0ge1RhYmxlVHlwZX0gdGFibGVUeXBlIFRoZSB0YWJsZSB0eXBlLlxuICogQHBhcmFtIHtDb21wbGV4UHJvcGVydHlJbmZvfSByZWxhdGVkUHJvcGVydGllcyBUaGUgcHJvcGVydGllcyBpZGVudGlmaWVkIHNvIGZhci5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNFbWJlZGRlZCBUcnVlIGlmIHRoZSBkYXRhZmllbGQgaXMgZW1iZWRkZWQgaW4gYW5vdGhlciBhbm5vdGF0aW9uIChlLmcuIEZpZWxkR3JvdXApLlxuICogQHJldHVybnMge0NvbXBsZXhQcm9wZXJ0eUluZm99IFRoZSBwcm9wZXJ0aWVzIHJlbGF0ZWQgdG8gdGhlIERhdGFGaWVsZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbGxlY3RSZWxhdGVkUHJvcGVydGllc1JlY3Vyc2l2ZWx5KFxuXHRkYXRhRmllbGQ6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMsXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdHRhYmxlVHlwZTogVGFibGVUeXBlLFxuXHRyZWxhdGVkUHJvcGVydGllczogQ29tcGxleFByb3BlcnR5SW5mbyA9IHsgcHJvcGVydGllczoge30sIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiB7fSB9LFxuXHRpc0VtYmVkZGVkOiBib29sZWFuID0gZmFsc2Vcbik6IENvbXBsZXhQcm9wZXJ0eUluZm8ge1xuXHRpZiAoKGRhdGFGaWVsZC4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkIHx8IGRhdGFGaWVsZC4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aFVybCkgJiYgZGF0YUZpZWxkLlZhbHVlKSB7XG5cdFx0Y29uc3QgcHJvcGVydHkgPSBkYXRhRmllbGQuVmFsdWU7XG5cdFx0cmVsYXRlZFByb3BlcnRpZXMgPSBjb2xsZWN0UmVsYXRlZFByb3BlcnRpZXMoXG5cdFx0XHRwcm9wZXJ0eS5wYXRoLFxuXHRcdFx0cHJvcGVydHkuJHRhcmdldCxcblx0XHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0XHRmYWxzZSxcblx0XHRcdHRhYmxlVHlwZSxcblx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzLFxuXHRcdFx0aXNFbWJlZGRlZFxuXHRcdCk7XG5cdFx0Y29uc3QgbmF2aWdhdGlvblBhdGhQcmVmaXggPSBfZ2V0TmF2aWdhdGlvblBhdGhQcmVmaXgocHJvcGVydHkucGF0aCk7XG5cdFx0cmVsYXRlZFByb3BlcnRpZXMgPSBfY29sbGVjdEFkZGl0aW9uYWxQcm9wZXJ0aWVzRm9yQW5hbHl0aWNhbFRhYmxlKGRhdGFGaWVsZCwgbmF2aWdhdGlvblBhdGhQcmVmaXgsIHRhYmxlVHlwZSwgcmVsYXRlZFByb3BlcnRpZXMpO1xuXHR9IGVsc2UgaWYgKGRhdGFGaWVsZC4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQW5ub3RhdGlvbikge1xuXHRcdHN3aXRjaCAoZGF0YUZpZWxkLlRhcmdldD8uJHRhcmdldD8uJFR5cGUpIHtcblx0XHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRmllbGRHcm91cFR5cGU6XG5cdFx0XHRcdGRhdGFGaWVsZC5UYXJnZXQuJHRhcmdldC5EYXRhPy5mb3JFYWNoKChpbm5lckRhdGFGaWVsZDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcykgPT4ge1xuXHRcdFx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzID0gY29sbGVjdFJlbGF0ZWRQcm9wZXJ0aWVzUmVjdXJzaXZlbHkoXG5cdFx0XHRcdFx0XHRpbm5lckRhdGFGaWVsZCxcblx0XHRcdFx0XHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0XHRcdFx0XHR0YWJsZVR5cGUsXG5cdFx0XHRcdFx0XHRyZWxhdGVkUHJvcGVydGllcyxcblx0XHRcdFx0XHRcdHRydWVcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9KTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YVBvaW50VHlwZTpcblx0XHRcdFx0cmVsYXRlZFByb3BlcnRpZXMgPSBjb2xsZWN0UmVsYXRlZFByb3BlcnRpZXMoXG5cdFx0XHRcdFx0ZGF0YUZpZWxkLlRhcmdldC4kdGFyZ2V0LlZhbHVlLnBhdGgsXG5cdFx0XHRcdFx0ZGF0YUZpZWxkLFxuXHRcdFx0XHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0XHRcdFx0ZmFsc2UsXG5cdFx0XHRcdFx0dGFibGVUeXBlLFxuXHRcdFx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzLFxuXHRcdFx0XHRcdGlzRW1iZWRkZWRcblx0XHRcdFx0KTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgQ29tbXVuaWNhdGlvbkFubm90YXRpb25UeXBlcy5Db250YWN0VHlwZTpcblx0XHRcdFx0Y29uc3QgZGF0YUZpZWxkQ29udGFjdCA9IGRhdGFGaWVsZC5UYXJnZXQuJHRhcmdldCBhcyBDb250YWN0O1xuXHRcdFx0XHRyZWxhdGVkUHJvcGVydGllcyA9IGNvbGxlY3RSZWxhdGVkUHJvcGVydGllcyhcblx0XHRcdFx0XHRkYXRhRmllbGQuVGFyZ2V0LnZhbHVlLFxuXHRcdFx0XHRcdGRhdGFGaWVsZENvbnRhY3QsXG5cdFx0XHRcdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0XHR0YWJsZVR5cGUsXG5cdFx0XHRcdFx0cmVsYXRlZFByb3BlcnRpZXMsXG5cdFx0XHRcdFx0aXNFbWJlZGRlZFxuXHRcdFx0XHQpO1xuXHRcdFx0XHRicmVhaztcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gcmVsYXRlZFByb3BlcnRpZXM7XG59XG5cbmV4cG9ydCBjb25zdCBnZXREYXRhRmllbGREYXRhVHlwZSA9IGZ1bmN0aW9uIChvRGF0YUZpZWxkOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzIHwgUHJvcGVydHkpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRsZXQgc0RhdGFUeXBlOiBzdHJpbmcgfCB1bmRlZmluZWQgPSAob0RhdGFGaWVsZCBhcyBEYXRhRmllbGRBYnN0cmFjdFR5cGVzKS4kVHlwZTtcblx0c3dpdGNoIChzRGF0YVR5cGUpIHtcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFjdGlvbjpcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbjpcblx0XHRcdHNEYXRhVHlwZSA9IHVuZGVmaW5lZDtcblx0XHRcdGJyZWFrO1xuXG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGQ6XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoTmF2aWdhdGlvblBhdGg6XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoVXJsOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aEludGVudEJhc2VkTmF2aWdhdGlvbjpcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhBY3Rpb246XG5cdFx0XHRzRGF0YVR5cGUgPSAob0RhdGFGaWVsZCBhcyBEYXRhRmllbGQpPy5WYWx1ZT8uJHRhcmdldD8udHlwZTtcblx0XHRcdGJyZWFrO1xuXG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBbm5vdGF0aW9uOlxuXHRcdGRlZmF1bHQ6XG5cdFx0XHRjb25zdCBzRGF0YVR5cGVGb3JEYXRhRmllbGRGb3JBbm5vdGF0aW9uID0gKG9EYXRhRmllbGQgYXMgRGF0YUZpZWxkRm9yQW5ub3RhdGlvbikuVGFyZ2V0Py4kdGFyZ2V0LiRUeXBlO1xuXHRcdFx0aWYgKHNEYXRhVHlwZUZvckRhdGFGaWVsZEZvckFubm90YXRpb24pIHtcblx0XHRcdFx0aWYgKChvRGF0YUZpZWxkIGFzIERhdGFGaWVsZEZvckFubm90YXRpb24pLlRhcmdldD8uJHRhcmdldC4kVHlwZSA9PT0gQ29tbXVuaWNhdGlvbkFubm90YXRpb25UeXBlcy5Db250YWN0VHlwZSkge1xuXHRcdFx0XHRcdHNEYXRhVHlwZSA9ICgoKG9EYXRhRmllbGQgYXMgRGF0YUZpZWxkRm9yQW5ub3RhdGlvbikuVGFyZ2V0Py4kdGFyZ2V0IGFzIENvbnRhY3QpPy5mbiBhcyBhbnkpLiR0YXJnZXQ/LnR5cGU7XG5cdFx0XHRcdH0gZWxzZSBpZiAoKG9EYXRhRmllbGQgYXMgRGF0YUZpZWxkRm9yQW5ub3RhdGlvbikuVGFyZ2V0Py4kdGFyZ2V0LiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhUG9pbnRUeXBlKSB7XG5cdFx0XHRcdFx0c0RhdGFUeXBlID1cblx0XHRcdFx0XHRcdCgob0RhdGFGaWVsZCBhcyBEYXRhRmllbGRGb3JBbm5vdGF0aW9uKS5UYXJnZXQ/LiR0YXJnZXQgYXMgRGF0YVBvaW50KT8uVmFsdWU/LiRQYXRoPy4kVHlwZSB8fFxuXHRcdFx0XHRcdFx0KChvRGF0YUZpZWxkIGFzIERhdGFGaWVsZEZvckFubm90YXRpb24pLlRhcmdldD8uJHRhcmdldCBhcyBEYXRhUG9pbnQpPy5WYWx1ZT8uJHRhcmdldC50eXBlO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIGUuZy4gRmllbGRHcm91cCBvciBDaGFydFxuXHRcdFx0XHRcdHNEYXRhVHlwZSA9IHVuZGVmaW5lZDtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0c0RhdGFUeXBlID0gdW5kZWZpbmVkO1xuXHRcdFx0fVxuXHRcdFx0YnJlYWs7XG5cdH1cblxuXHRyZXR1cm4gc0RhdGFUeXBlO1xufTtcbiJdfQ==
@@ -26,7 +26,6 @@ export type ComplexPropertyInfo = {
26
26
  additionalProperties: Record<string, Property>;
27
27
  exportSettingsTemplate?: string;
28
28
  exportSettingsWrapping?: boolean;
29
- exportSettingsContactProperty?: string;
30
29
  visualSettingsToBeExcluded?: string;
31
30
  exportUnitName?: string;
32
31
  exportUnitString?: string;
@@ -258,10 +257,13 @@ export function collectRelatedProperties(
258
257
  dataPointDefaultProperty.Target.$target.TargetValue || dataPointDefaultProperty.Target.$target.TargetValue.MaximumValue
259
258
  ).toString();
260
259
  _appendTemplate(`{${valueIndex}}/${targetValue}`);
261
- } else if (property.Target?.$target?.$Type === "com.sap.vocabularies.Communication.v1.ContactType") {
262
- relatedProperties.exportSettingsContactProperty =
263
- property.Target.value.substring(0, property.Target.value.indexOf("/") + 1) + property.Target.$target.fn?.path;
264
- valueIndex = _pushUnique(path, property.Target.$target.fn.$target);
260
+ } else if (property.$Type === CommunicationAnnotationTypes.ContactType) {
261
+ const contactProperty = property.fn?.$target;
262
+ const contactPropertyPath = property.fn?.path;
263
+ valueIndex = _pushUnique(
264
+ navigationPathPrefix ? navigationPathPrefix + contactPropertyPath : contactPropertyPath,
265
+ contactProperty
266
+ );
265
267
  _appendTemplate(`{${valueIndex}}`);
266
268
  } else if (!ignoreSelf) {
267
269
  // Collect underlying property
@@ -344,10 +346,11 @@ export function collectRelatedPropertiesRecursively(
344
346
  );
345
347
  break;
346
348
 
347
- case "com.sap.vocabularies.Communication.v1.ContactType":
349
+ case CommunicationAnnotationTypes.ContactType:
350
+ const dataFieldContact = dataField.Target.$target as Contact;
348
351
  relatedProperties = collectRelatedProperties(
349
352
  dataField.Target.value,
350
- dataField,
353
+ dataFieldContact,
351
354
  converterContext,
352
355
  false,
353
356
  tableType,