@sapui5/sap.fe.macros 1.142.0 → 1.142.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. package/package.json +1 -1
  2. package/src/sap/fe/macros/.library +1 -1
  3. package/src/sap/fe/macros/Field.js +5 -5
  4. package/src/sap/fe/macros/Field.ts +5 -3
  5. package/src/sap/fe/macros/FooterContent.js +3 -2
  6. package/src/sap/fe/macros/FooterContent.tsx +2 -10
  7. package/src/sap/fe/macros/MessageButton.js +3 -3
  8. package/src/sap/fe/macros/MessageButton.tsx +3 -2
  9. package/src/sap/fe/macros/Page.js +8 -4
  10. package/src/sap/fe/macros/Page.tsx +13 -4
  11. package/src/sap/fe/macros/RichTextEditor.js +12 -14
  12. package/src/sap/fe/macros/RichTextEditor.tsx +10 -13
  13. package/src/sap/fe/macros/ai/EasyFillDialog.js +2 -1
  14. package/src/sap/fe/macros/ai/EasyFillDialog.tsx +1 -0
  15. package/src/sap/fe/macros/ai/SummarizationButton.js +6 -4
  16. package/src/sap/fe/macros/ai/SummarizationButton.tsx +5 -3
  17. package/src/sap/fe/macros/chart/Action.js +19 -7
  18. package/src/sap/fe/macros/chart/Action.ts +8 -0
  19. package/src/sap/fe/macros/chart/ChartDelegate.js +13 -2
  20. package/src/sap/fe/macros/chart/ChartDelegate.ts +20 -1
  21. package/src/sap/fe/macros/chart/MdcChartTemplate.js +8 -6
  22. package/src/sap/fe/macros/chart/MdcChartTemplate.tsx +13 -22
  23. package/src/sap/fe/macros/controls/FilterBar.js +1 -1
  24. package/src/sap/fe/macros/controls/FilterBar.ts +8 -1
  25. package/src/sap/fe/macros/controls/TextLink.js +15 -1
  26. package/src/sap/fe/macros/controls/TextLink.tsx +19 -0
  27. package/src/sap/fe/macros/coreUI/OperationParameterDialog.js +23 -18
  28. package/src/sap/fe/macros/coreUI/OperationParameterDialog.tsx +27 -25
  29. package/src/sap/fe/macros/field/FieldRuntimeHelper.js +4 -2
  30. package/src/sap/fe/macros/field/FieldRuntimeHelper.ts +7 -7
  31. package/src/sap/fe/macros/field/FieldTemplating.js +8 -3
  32. package/src/sap/fe/macros/field/FieldTemplating.ts +7 -2
  33. package/src/sap/fe/macros/filterBar/FilterBar.block.js +10 -1
  34. package/src/sap/fe/macros/filterBar/FilterBar.block.tsx +10 -0
  35. package/src/sap/fe/macros/form/FormContainer.block.js +9 -8
  36. package/src/sap/fe/macros/form/FormContainer.block.ts +10 -7
  37. package/src/sap/fe/macros/internal/field/EditStyle.js +11 -6
  38. package/src/sap/fe/macros/internal/field/EditStyle.tsx +7 -3
  39. package/src/sap/fe/macros/internal/valuehelp/AdditionalValueFormatter.js +36 -7
  40. package/src/sap/fe/macros/internal/valuehelp/AdditionalValueFormatter.ts +35 -6
  41. package/src/sap/fe/macros/internal/valuehelp/AdditionalValueHelper.js +54 -1
  42. package/src/sap/fe/macros/internal/valuehelp/AdditionalValueHelper.ts +59 -0
  43. package/src/sap/fe/macros/library.js +5 -6
  44. package/src/sap/fe/macros/{library.ts → library.tsx} +1 -1
  45. package/src/sap/fe/macros/messagebundle.properties +6 -0
  46. package/src/sap/fe/macros/messages/MessageButton.js +21 -12
  47. package/src/sap/fe/macros/messages/MessageButton.ts +21 -11
  48. package/src/sap/fe/macros/multivaluefield/MultiValueFieldDelegate.js +4 -3
  49. package/src/sap/fe/macros/multivaluefield/MultiValueFieldDelegate.ts +5 -2
  50. package/src/sap/fe/macros/quickView/QuickView.js +5 -4
  51. package/src/sap/fe/macros/quickView/QuickView.tsx +10 -3
  52. package/src/sap/fe/macros/table/ActionsTemplating.js +6 -5
  53. package/src/sap/fe/macros/table/ActionsTemplating.tsx +4 -4
  54. package/src/sap/fe/macros/table/MdcTableTemplate.js +27 -10
  55. package/src/sap/fe/macros/table/MdcTableTemplate.tsx +31 -4
  56. package/src/sap/fe/macros/table/Table.block.js +3 -1
  57. package/src/sap/fe/macros/table/Table.block.tsx +7 -4
  58. package/src/sap/fe/macros/table/TableAPI.js +49 -28
  59. package/src/sap/fe/macros/table/TableAPI.ts +58 -32
  60. package/src/sap/fe/macros/table/TableEventHandlerProvider.js +6 -4
  61. package/src/sap/fe/macros/table/TableEventHandlerProvider.ts +6 -3
  62. package/src/sap/fe/macros/table/delegates/TableDelegate.js +3 -3
  63. package/src/sap/fe/macros/table/delegates/TableDelegate.ts +3 -4
  64. package/src/sap/fe/macros/table/massEdit/MassEditDialog.js +41 -15
  65. package/src/sap/fe/macros/table/massEdit/MassEditDialog.tsx +41 -22
  66. package/src/sap/fe/macros/table/mixin/TableHierarchy.js +6 -6
  67. package/src/sap/fe/macros/table/mixin/TableHierarchy.ts +5 -5
  68. package/src/sap/fe/macros/valuehelp/ValueHelpDelegate.js +5 -3
  69. package/src/sap/fe/macros/valuehelp/ValueHelpDelegate.ts +7 -4
@@ -68,7 +68,6 @@ import IllustratedMessageType from "sap/m/IllustratedMessageType";
68
68
  import type { BaseAggregationBindingInfo } from "sap/ui/base/ManagedObject";
69
69
  import UI5Element from "sap/ui/core/Element";
70
70
  import Fragment from "sap/ui/core/Fragment";
71
- import type View from "sap/ui/core/mvc/View";
72
71
  import XMLPreprocessor from "sap/ui/core/util/XMLPreprocessor";
73
72
  import type { JsControlTreeModifier } from "sap/ui/core/util/reflection";
74
73
  import type Control from "sap/ui/mdc/Control";
@@ -794,7 +793,7 @@ export default Object.assign({}, TableDelegateBase, {
794
793
  setTimeout(() => {
795
794
  oInternalModelContext.setProperty("dataRequestedTimeoutSet", false);
796
795
  const oTableAPI = oTable ? (oTable.getParent() as TableAPI) : null;
797
- if (oTableAPI) {
796
+ if (oTableAPI && CommonUtils.getIsEditable(oTable)) {
798
797
  oTableAPI.tableDefaultsPromise = (oTableAPI.getTableDefaults(oTable) ?? Promise.resolve({})) as Promise<object>;
799
798
  }
800
799
  }, 0);
@@ -1306,7 +1305,7 @@ export default Object.assign({}, TableDelegateBase, {
1306
1305
  */
1307
1306
  _templateSlotColumnFragment: async function (
1308
1307
  columnInfo: CustomElement<CustomBasedTableColumn>,
1309
- view: View,
1308
+ view: FEView,
1310
1309
  modifier: BaseTreeModifier | JsControlTreeModifier,
1311
1310
  tableId: string
1312
1311
  ): Promise<null | Control | Control[] | Element> {
@@ -1344,7 +1343,7 @@ export default Object.assign({}, TableDelegateBase, {
1344
1343
  return Fragment.load({
1345
1344
  type: "XML",
1346
1345
  definition: resultXML,
1347
- controller: view.getController()
1346
+ controller: view.getController().getExtensionAPI()
1348
1347
  }) as Promise<Control | Control[]>;
1349
1348
  },
1350
1349
  _getExportFormat: function (dataType?: string) {
@@ -2,7 +2,7 @@
2
2
  * SAP UI development toolkit for HTML5 (SAPUI5)
3
3
  * (c) Copyright 2009-2025 SAP SE. All rights reserved
4
4
  */
5
- sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controllerextensions/messageHandler/messageHandling", "sap/fe/core/converters/ManifestSettings", "sap/fe/core/helpers/PromiseKeeper", "sap/fe/core/helpers/ResourceModelHelper", "sap/fe/core/helpers/StableIdHelper", "sap/fe/core/library", "sap/m/Button", "sap/m/Dialog", "sap/m/Label", "sap/m/MessageBox", "sap/m/MessageStrip", "sap/m/MessageToast", "sap/ui/core/Fragment", "sap/ui/core/Lib", "sap/ui/core/util/XMLPreprocessor", "sap/ui/layout/form/Form", "sap/ui/layout/form/FormContainer", "sap/ui/layout/form/FormElement", "sap/ui/layout/form/ResponsiveGridLayout", "sap/ui/model/json/JSONModel", "./MassEditField", "./MassEditSideEffects", "sap/fe/base/jsx-runtime/jsx", "sap/fe/base/jsx-runtime/Fragment", "sap/fe/base/jsx-runtime/jsxs"], function (Log, CommonUtils, messageHandling, ManifestSettings, PromiseKeeper, ResourceModelHelper, ID, FELibrary, Button, Dialog, Label, MessageBox, MessageStrip, MessageToast, Fragment, Library, XMLPreprocessor, Form, FormContainer, FormElement, ResponsiveGridLayout, JSONModel, MassEditField, MassEditSideEffects, _jsx, _Fragment, _jsxs) {
5
+ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controllerextensions/BusyLocker", "sap/fe/core/controllerextensions/messageHandler/messageHandling", "sap/fe/core/converters/ManifestSettings", "sap/fe/core/helpers/PromiseKeeper", "sap/fe/core/helpers/ResourceModelHelper", "sap/fe/core/helpers/StableIdHelper", "sap/fe/core/library", "sap/m/Button", "sap/m/Dialog", "sap/m/Label", "sap/m/MessageBox", "sap/m/MessageStrip", "sap/m/MessageToast", "sap/ui/core/Fragment", "sap/ui/core/Lib", "sap/ui/core/util/XMLPreprocessor", "sap/ui/layout/form/Form", "sap/ui/layout/form/FormContainer", "sap/ui/layout/form/FormElement", "sap/ui/layout/form/ResponsiveGridLayout", "sap/ui/model/json/JSONModel", "./MassEditField", "./MassEditSideEffects", "sap/fe/base/jsx-runtime/jsx", "sap/fe/base/jsx-runtime/Fragment", "sap/fe/base/jsx-runtime/jsxs"], function (Log, CommonUtils, BusyLocker, messageHandling, ManifestSettings, PromiseKeeper, ResourceModelHelper, ID, FELibrary, Button, Dialog, Label, MessageBox, MessageStrip, MessageToast, Fragment, Library, XMLPreprocessor, Form, FormContainer, FormElement, ResponsiveGridLayout, JSONModel, MassEditField, MassEditSideEffects, _jsx, _Fragment, _jsxs) {
6
6
  "use strict";
7
7
 
8
8
  var _exports = {};
@@ -17,7 +17,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
17
17
  */
18
18
  function MassEditDialog(props) {
19
19
  this.requiredDataPromise = new PromiseKeeper();
20
+ this.contextsOnError = new Set();
20
21
  this.updatedProperties = new Set();
22
+ this.updatedContexts = new Set();
21
23
  this.dialog = undefined;
22
24
  this.table = props.table;
23
25
  this.contexts = props.contexts;
@@ -27,7 +29,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
27
29
  this.transientListBinding = this.generateListBinding();
28
30
  this.bindingContext = this.transientListBinding.create({}, true);
29
31
  this.resourceModel = ResourceModelHelper.getResourceModel(this.table);
30
- this.contextsOnError = [];
31
32
  this.fieldControls = [];
32
33
  }
33
34
 
@@ -111,7 +112,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
111
112
  _proto.onClose = function onClose() {
112
113
  this.transientListBinding.destroy();
113
114
  if (this.dialog) {
114
- this.dialog.close();
115
+ if (this.dialog.isOpen()) {
116
+ this.dialog.close();
117
+ }
115
118
  this.dialog.destroy();
116
119
  }
117
120
  }
@@ -131,6 +134,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
131
134
  * Manages the messages according to the contexts on error.
132
135
  */;
133
136
  _proto.manageMessage = async function manageMessage() {
137
+ const isErrorAndSuccess = this.contextsOnError.size > 0 && this.updatedContexts.size > 0;
134
138
  const coreResourceBundle = Library.getResourceBundleFor("sap.fe.core");
135
139
  const controller = this.view.getController();
136
140
  const DraftStatus = FELibrary.DraftStatus;
@@ -139,8 +143,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
139
143
  await controller.messageHandler.showMessages({
140
144
  onBeforeShowMessage: (messages, showMessageParameters) => {
141
145
  showMessageParameters.fnGetMessageSubtitle = messageHandling.setMessageSubtitle.bind({}, this.table, this.contexts);
142
- if (!this.contextsOnError.length) {
143
- if (this.updatedProperties.size > 0) {
146
+ if (!this.contextsOnError.size) {
147
+ // only successes
148
+ if (this.updatedContexts.size) {
144
149
  //There is at least one new value set
145
150
  controller.editFlow.setDraftStatus(DraftStatus.Saved);
146
151
  if (this.view.getViewData().converterType === "ListReport") {
@@ -151,10 +156,11 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
151
156
  } else {
152
157
  MessageToast.show(this.resourceModel.getText("C_MASS_EDIT_NO_CHANGE"));
153
158
  }
154
- } else if (this.contextsOnError.length < this.contexts.length) {
159
+ } else if (isErrorAndSuccess) {
160
+ // errors and successes
155
161
  controller.editFlow.setDraftStatus(DraftStatus.Saved);
156
- } else if (this.contextsOnError.length === this.contexts.length) {
157
- controller.editFlow.setDraftStatus(DraftStatus.Clear);
162
+ } else {
163
+ controller.editFlow.setDraftStatus(DraftStatus.Clear); //only errors
158
164
  }
159
165
  if (CommonUtils.getIsEditable(controller) && !messages.some(message => !message.getTargets())) {
160
166
  showMessageParameters.showMessageBox = false;
@@ -163,9 +169,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
163
169
  return showMessageParameters;
164
170
  }
165
171
  });
166
- if (!!this.contextsOnError.length && this.contextsOnError.length < this.contexts.length) {
172
+ if (isErrorAndSuccess) {
167
173
  const confirmButtonTxt = coreResourceBundle.getText("C_COMMON_DIALOG_OK");
168
- MessageBox.success(this.resourceModel.getText("C_MASS_EDIT_CHANGES_WITH_ERROR", [this.contexts.length - this.contextsOnError.length, this.contexts.length]), {
174
+ MessageBox.success(this.resourceModel.getText("C_MASS_EDIT_CHANGES_WITH_ERROR", [this.updatedContexts.size, this.contexts.length]), {
169
175
  actions: [confirmButtonTxt],
170
176
  emphasizedAction: confirmButtonTxt
171
177
  });
@@ -201,10 +207,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
201
207
  for (const propertyPath in values) {
202
208
  if (selectedContext.getProperty(propertyPath) !== values[propertyPath]) {
203
209
  valueHasChanged = true;
204
- fieldPromises.push(selectedContext.setProperty(propertyPath, values[propertyPath], groupId).then(() => this.updatedProperties.add(propertyPath)).catch(error => {
205
- this.contextsOnError.push(selectedContext);
206
- Log.error("Mass Edit: Something went wrong in updating entries.", error);
207
- }));
210
+ fieldPromises.push(this.updateProperty(selectedContext, propertyPath, values[propertyPath], groupId));
208
211
  immediateSideEffects.push({
209
212
  propertyPath,
210
213
  groupId
@@ -232,6 +235,25 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
232
235
  }
233
236
  }
234
237
 
238
+ /**
239
+ * Updates a property in the selected context.
240
+ * @param selectedContext The context to update.
241
+ * @param propertyPath The path of the property to update.
242
+ * @param value The new value for the property.
243
+ * @param groupId The ID of the group for the update.
244
+ */;
245
+ _proto.updateProperty = async function updateProperty(selectedContext, propertyPath, value, groupId) {
246
+ const contextPath = selectedContext.getPath();
247
+ try {
248
+ await selectedContext.setProperty(propertyPath, value, groupId);
249
+ this.updatedContexts.add(contextPath);
250
+ this.updatedProperties.add(propertyPath);
251
+ } catch (error) {
252
+ this.contextsOnError.add(contextPath);
253
+ Log.error("Mass Edit: Something went wrong in updating entries.", error);
254
+ }
255
+ }
256
+
235
257
  /**
236
258
  * Gets the information of the values for all mass edit fields.
237
259
  * @returns The information.
@@ -289,12 +311,16 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
289
311
  return;
290
312
  }
291
313
  if (!this.isAdaptation) {
314
+ const globalUIModel = this.view.getModel("ui");
315
+ this.dialog?.close();
316
+ BusyLocker.lock(globalUIModel);
292
317
  messageHandling.removeBoundTransitionMessages();
293
318
  messageHandling.removeUnboundTransitionMessages();
294
319
  const isCustomSave = await this.applyChanges();
295
320
  if (!isCustomSave) {
296
321
  this.manageMessage();
297
322
  }
323
+ BusyLocker.unlock(globalUIModel);
298
324
  }
299
325
  this.onClose();
300
326
  }
@@ -413,4 +439,4 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
413
439
  _exports = MassEditDialog;
414
440
  return _exports;
415
441
  }, false);
416
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJNYXNzRWRpdERpYWxvZyIsInByb3BzIiwicmVxdWlyZWREYXRhUHJvbWlzZSIsIlByb21pc2VLZWVwZXIiLCJ1cGRhdGVkUHJvcGVydGllcyIsIlNldCIsImRpYWxvZyIsInVuZGVmaW5lZCIsInRhYmxlIiwiY29udGV4dHMiLCJpc0FkYXB0YXRpb24iLCJDb21tb25VdGlscyIsImdldEFwcENvbXBvbmVudCIsImlzQWRhcHRhdGlvbk1vZGUiLCJmaWVsZFByb3BlcnRpZXMiLCJ2aWV3IiwiZ2V0VGFyZ2V0VmlldyIsInRyYW5zaWVudExpc3RCaW5kaW5nIiwiZ2VuZXJhdGVMaXN0QmluZGluZyIsImJpbmRpbmdDb250ZXh0IiwiY3JlYXRlIiwicmVzb3VyY2VNb2RlbCIsIlJlc291cmNlTW9kZWxIZWxwZXIiLCJnZXRSZXNvdXJjZU1vZGVsIiwiY29udGV4dHNPbkVycm9yIiwiZmllbGRDb250cm9scyIsIl9leHBvcnRzIiwiX3Byb3RvIiwicHJvdG90eXBlIiwibGlzdEJpbmRpbmciLCJnZXRSb3dCaW5kaW5nIiwiZ2V0TW9kZWwiLCJiaW5kTGlzdCIsImdldFBhdGgiLCJnZXRDb250ZXh0IiwiJCR1cGRhdGVHcm91cElkIiwicmVmcmVzaEludGVybmFsIiwiY29yZVJlc291cmNlQnVuZGxlIiwiTGlicmFyeSIsImdldFJlc291cmNlQnVuZGxlRm9yIiwiYXBwbHlCdXR0b25UZXh0IiwiZ2V0Vmlld0RhdGEiLCJjb252ZXJ0ZXJUeXBlIiwiZ2V0VGV4dCIsImRpYWxvZ0NvbnRlbnQiLCJjcmVhdGVDb250ZW50IiwiX2pzeCIsIkRpYWxvZyIsImlkIiwiSUQiLCJnZW5lcmF0ZSIsImdldElkIiwiY29udGVudFdpZHRoIiwiY2xhc3MiLCJob3Jpem9udGFsU2Nyb2xsaW5nIiwidGl0bGUiLCJsZW5ndGgiLCJ0b1N0cmluZyIsImNvbnRlbnQiLCJlc2NhcGVIYW5kbGVyIiwib25DbG9zZSIsImJpbmQiLCJiZWZvcmVPcGVuIiwiYmVnaW5CdXR0b24iLCJCdXR0b24iLCJ0ZXh0IiwidHlwZSIsInByZXNzIiwib25BcHBseSIsImVuZEJ1dHRvbiIsInNldE1vZGVsIiwiSlNPTk1vZGVsIiwiaXNFZGl0YWJsZSIsImJpbmRFbGVtZW50IiwicGF0aCIsIm1vZGVsIiwiZXZlbnQiLCJnZXRTb3VyY2UiLCJzZXRCaW5kaW5nQ29udGV4dCIsImFkZERlcGVuZGVudCIsImRlc3Ryb3kiLCJjbG9zZSIsImdldFJlcXVpcmVkRGF0YVByb21pc2UiLCJtYW5hZ2VNZXNzYWdlIiwiY29udHJvbGxlciIsImdldENvbnRyb2xsZXIiLCJEcmFmdFN0YXR1cyIsIkZFTGlicmFyeSIsImludGVybmFsTW9kZWxDb250ZXh0IiwiZ2V0QmluZGluZ0NvbnRleHQiLCJzZXRQcm9wZXJ0eSIsIm1lc3NhZ2VIYW5kbGVyIiwic2hvd01lc3NhZ2VzIiwib25CZWZvcmVTaG93TWVzc2FnZSIsIm1lc3NhZ2VzIiwic2hvd01lc3NhZ2VQYXJhbWV0ZXJzIiwiZm5HZXRNZXNzYWdlU3VidGl0bGUiLCJtZXNzYWdlSGFuZGxpbmciLCJzZXRNZXNzYWdlU3VidGl0bGUiLCJzaXplIiwiZWRpdEZsb3ciLCJzZXREcmFmdFN0YXR1cyIsIlNhdmVkIiwiTWVzc2FnZVRvYXN0Iiwic2hvdyIsIkNsZWFyIiwiZ2V0SXNFZGl0YWJsZSIsInNvbWUiLCJtZXNzYWdlIiwiZ2V0VGFyZ2V0cyIsInNob3dNZXNzYWdlQm94Iiwic2hvd01lc3NhZ2VEaWFsb2ciLCJjb25maXJtQnV0dG9uVHh0IiwiTWVzc2FnZUJveCIsInN1Y2Nlc3MiLCJhY3Rpb25zIiwiZW1waGFzaXplZEFjdGlvbiIsInNhdmVDaGFuZ2VzIiwiZmllbGRWYWx1ZXNJbmZvIiwibWFuaWZlc3RTZXR0aW5ncyIsImdldFBhcmVudCIsImdldFRhYmxlRGVmaW5pdGlvbiIsImNvbnRyb2wiLCJtYXNzRWRpdCIsImlzSXNvbGF0ZWQiLCJvcGVyYXRpb25Hcm91cGluZ01vZGUiLCJPcGVyYXRpb25Hcm91cGluZ01vZGUiLCJJc29sYXRlZCIsImlzb2xhdGVkR3JvdXBJZCIsIm1hc3NFZGl0U2lkZUVmZmVjdHMiLCJNYXNzRWRpdFNpZGVFZmZlY3RzIiwiZmllbGRQcm9taXNlcyIsInNldENvbnRpbnVlT25FcnJvciIsImZvckVhY2giLCJzZWxlY3RlZENvbnRleHQiLCJpbW1lZGlhdGVTaWRlRWZmZWN0cyIsInJlZnJlc2hEZXNjcmlwdGlvbnMiLCJ2YWx1ZXMiLCJmaWVsZENvbnRyb2xSZWZlcmVuY2UiLCJ2YWx1ZUhhc0NoYW5nZWQiLCJpc1JlYWRPbmx5T25Db250ZXh0IiwiZ3JvdXBJZCIsInByb3BlcnR5UGF0aCIsImdldFByb3BlcnR5IiwicHVzaCIsInRoZW4iLCJhZGQiLCJjYXRjaCIsImVycm9yIiwiTG9nIiwibWFwIiwiaW1tZWRpYXRlU2lkZUVmZmVjdCIsImV4ZWN1dGVJbW1lZGlhdGVTaWRlRWZmZWN0cyIsInJlZnJlc2hEZXNjcmlwdGlvbiIsInN1Ym1pdEJhdGNoIiwiUHJvbWlzZSIsImFsbFNldHRsZWQiLCJleGVjdXRlRGVmZXJyZWRTaWRlRWZmZWN0cyIsIkFycmF5IiwiZnJvbSIsImdldEZpZWxkVmFsdWVzSW5mb3MiLCJyZXN1bHQiLCJmaWVsZENvbnRyb2wiLCJmaWVsZFZhbHVlcyIsImdldEZpZWxkVmFsdWVzIiwiYXBwbHlDaGFuZ2VzIiwicHJvbWlzZSIsImZpZWxkc1ZhbHVlc0luZm8iLCJjdXN0b21TYXZlIiwiY3VzdG9tTWFzc0VkaXRTYXZlIiwiYUNvbnRleHRzIiwib1VwZGF0ZURhdGEiLCJpc0ZpZWxkVmFsaWQiLCJyZW1vdmVCb3VuZFRyYW5zaXRpb25NZXNzYWdlcyIsInJlbW92ZVVuYm91bmRUcmFuc2l0aW9uTWVzc2FnZXMiLCJpc0N1c3RvbVNhdmUiLCJjdXN0b21Gb3JtQ29udGFpbmVyIiwiY3JlYXRlQ3VzdG9tQ29udGFpbmVyIiwiX2pzeHMiLCJfRnJhZ21lbnQiLCJjaGlsZHJlbiIsImdldEFkYXB0YXRpb25NZXNzYWdlIiwiRm9ybSIsImxheW91dCIsIlJlc3BvbnNpdmVHcmlkTGF5b3V0IiwibGFiZWxTcGFuTSIsImxhYmVsU3BhbkwiLCJsYWJlbFNwYW5YTCIsImZvcm1Db250YWluZXJzIiwiRm9ybUNvbnRhaW5lciIsImZvcm1FbGVtZW50cyIsImNyZWF0ZUZvcm1FbGVtZW50cyIsIk1lc3NhZ2VTdHJpcCIsImN1c3RvbUZyYWdtZW50IiwiZnJvbUlubGluZSIsInJlc3VsdFhNTCIsIlhNTFByZXByb2Nlc3NvciIsInByb2Nlc3MiLCJET01QYXJzZXIiLCJwYXJzZUZyb21TdHJpbmciLCJmaXJzdEVsZW1lbnRDaGlsZCIsIm1vZGVscyIsImdldE93bmVyQ29tcG9uZW50IiwiZ2V0UHJlcHJvY2Vzc29yQ29udGV4dCIsIkZyYWdtZW50IiwibG9hZCIsImRlZmluaXRpb24iLCJjbG9uZSIsImdldEV4dGVuc2lvbkFQSSIsImxvYWRGcmFnbWVudCIsIm5hbWUiLCJjb250ZXh0UGF0aCIsImdldE1ldGFNb2RlbCIsImdldE1ldGFQYXRoIiwiZ2V0UmVzb2x2ZWRQYXRoIiwiY3JlYXRlRm9ybUVsZW1lbnQiLCJmaWVsZEluZm8iLCJGb3JtRWxlbWVudCIsInZpc2libGUiLCJsYWJlbCIsIkxhYmVsIiwicHJvcGVydHlJbmZvIiwia2V5IiwiZmllbGRzIiwiY3JlYXRlRmllbGRzIiwibWV0YU1vZGVsIiwiY29udGV4dCIsImNyZWF0ZUJpbmRpbmdDb250ZXh0IiwibWFzc0VkaXRGaWVsZCIsIk1hc3NFZGl0RmllbGQiLCJnZXRDb250cm9scyJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiTWFzc0VkaXREaWFsb2cudHN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgUHJpbWl0aXZlVHlwZSB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlc1wiO1xuaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgdHlwZSBSZXNvdXJjZUJ1bmRsZSBmcm9tIFwic2FwL2Jhc2UvaTE4bi9SZXNvdXJjZUJ1bmRsZVwiO1xuaW1wb3J0IHR5cGUgeyBFbmhhbmNlV2l0aFVJNSB9IGZyb20gXCJzYXAvZmUvYmFzZS9DbGFzc1N1cHBvcnRcIjtcbmltcG9ydCB0eXBlIHsgRkVWaWV3IH0gZnJvbSBcInNhcC9mZS9jb3JlL0Jhc2VDb250cm9sbGVyXCI7XG5pbXBvcnQgQ29tbW9uVXRpbHMgZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgdHlwZSBSZXNvdXJjZU1vZGVsIGZyb20gXCJzYXAvZmUvY29yZS9SZXNvdXJjZU1vZGVsXCI7XG5pbXBvcnQgdHlwZSBUZW1wbGF0ZUNvbXBvbmVudCBmcm9tIFwic2FwL2ZlL2NvcmUvVGVtcGxhdGVDb21wb25lbnRcIjtcbmltcG9ydCBtZXNzYWdlSGFuZGxpbmcgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL21lc3NhZ2VIYW5kbGVyL21lc3NhZ2VIYW5kbGluZ1wiO1xuaW1wb3J0IHsgT3BlcmF0aW9uR3JvdXBpbmdNb2RlIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWFuaWZlc3RTZXR0aW5nc1wiO1xuaW1wb3J0IFByb21pc2VLZWVwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvUHJvbWlzZUtlZXBlclwiO1xuaW1wb3J0IFJlc291cmNlTW9kZWxIZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvUmVzb3VyY2VNb2RlbEhlbHBlclwiO1xuaW1wb3J0ICogYXMgSUQgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvU3RhYmxlSWRIZWxwZXJcIjtcbmltcG9ydCBGRUxpYnJhcnkgZnJvbSBcInNhcC9mZS9jb3JlL2xpYnJhcnlcIjtcbmltcG9ydCB0eXBlIHsgU2lkZUVmZmVjdHNFbnRpdHlUeXBlLCBTaWRlRWZmZWN0c1RhcmdldCwgU2lkZUVmZmVjdHNUeXBlIH0gZnJvbSBcInNhcC9mZS9jb3JlL3NlcnZpY2VzL1NpZGVFZmZlY3RzU2VydmljZUZhY3RvcnlcIjtcbmltcG9ydCB0eXBlIFRhYmxlQVBJIGZyb20gXCJzYXAvZmUvbWFjcm9zL3RhYmxlL1RhYmxlQVBJXCI7XG5pbXBvcnQgQnV0dG9uIGZyb20gXCJzYXAvbS9CdXR0b25cIjtcbmltcG9ydCBEaWFsb2cgZnJvbSBcInNhcC9tL0RpYWxvZ1wiO1xuaW1wb3J0IExhYmVsIGZyb20gXCJzYXAvbS9MYWJlbFwiO1xuaW1wb3J0IE1lc3NhZ2VCb3ggZnJvbSBcInNhcC9tL01lc3NhZ2VCb3hcIjtcbmltcG9ydCBNZXNzYWdlU3RyaXAgZnJvbSBcInNhcC9tL01lc3NhZ2VTdHJpcFwiO1xuaW1wb3J0IE1lc3NhZ2VUb2FzdCBmcm9tIFwic2FwL20vTWVzc2FnZVRvYXN0XCI7XG5pbXBvcnQgdHlwZSBVSTVFdmVudCBmcm9tIFwic2FwL3VpL2Jhc2UvRXZlbnRcIjtcbmltcG9ydCB0eXBlIENvbnRyb2wgZnJvbSBcInNhcC91aS9jb3JlL0NvbnRyb2xcIjtcbmltcG9ydCBGcmFnbWVudCBmcm9tIFwic2FwL3VpL2NvcmUvRnJhZ21lbnRcIjtcbmltcG9ydCBMaWJyYXJ5IGZyb20gXCJzYXAvdWkvY29yZS9MaWJcIjtcbmltcG9ydCB0eXBlIE1lc3NhZ2UgZnJvbSBcInNhcC91aS9jb3JlL21lc3NhZ2UvTWVzc2FnZVwiO1xuaW1wb3J0IFhNTFByZXByb2Nlc3NvciBmcm9tIFwic2FwL3VpL2NvcmUvdXRpbC9YTUxQcmVwcm9jZXNzb3JcIjtcbmltcG9ydCBGb3JtIGZyb20gXCJzYXAvdWkvbGF5b3V0L2Zvcm0vRm9ybVwiO1xuaW1wb3J0IEZvcm1Db250YWluZXIgZnJvbSBcInNhcC91aS9sYXlvdXQvZm9ybS9Gb3JtQ29udGFpbmVyXCI7XG5pbXBvcnQgRm9ybUVsZW1lbnQgZnJvbSBcInNhcC91aS9sYXlvdXQvZm9ybS9Gb3JtRWxlbWVudFwiO1xuaW1wb3J0IFJlc3BvbnNpdmVHcmlkTGF5b3V0IGZyb20gXCJzYXAvdWkvbGF5b3V0L2Zvcm0vUmVzcG9uc2l2ZUdyaWRMYXlvdXRcIjtcbmltcG9ydCB0eXBlIFRhYmxlIGZyb20gXCJzYXAvdWkvbWRjL1RhYmxlXCI7XG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvQ29udGV4dFwiO1xuaW1wb3J0IEpTT05Nb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL2pzb24vSlNPTk1vZGVsXCI7XG5pbXBvcnQgdHlwZSBPRGF0YVY0Q29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L0NvbnRleHRcIjtcbmltcG9ydCB0eXBlIE9EYXRhTGlzdEJpbmRpbmcgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YUxpc3RCaW5kaW5nXCI7XG5pbXBvcnQgdHlwZSBPRGF0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNb2RlbFwiO1xuaW1wb3J0IE1hc3NFZGl0RmllbGQgZnJvbSBcIi4vTWFzc0VkaXRGaWVsZFwiO1xuaW1wb3J0IE1hc3NFZGl0U2lkZUVmZmVjdHMgZnJvbSBcIi4vTWFzc0VkaXRTaWRlRWZmZWN0c1wiO1xuaW1wb3J0IHR5cGUgeyBNYXNzRmllbGRQcm9wZXJ0aWVzIH0gZnJvbSBcIi4vbGlicmFyeVwiO1xuXG50eXBlIE1hc3NFZGl0U2lkZUVmZmVjdHNQcm9wZXJ0aWVzID0ge1xuXHRzaWRlRWZmZWN0czogU2lkZUVmZmVjdHNUeXBlO1xuXHR0YWJsZVJlZnJlc2g6IHtcblx0XHRpc1JlcXVlc3RlZDogYm9vbGVhbjtcblx0XHR0YXJnZXRFbnRpdHk/OiBTaWRlRWZmZWN0c0VudGl0eVR5cGU7XG5cdH07XG5cdGltbWVkaWF0ZTogeyB0YXJnZXRzOiBTaWRlRWZmZWN0c1RhcmdldFtdOyB0cmlnZ2VyQWN0aW9uOiBzdHJpbmcgfCB1bmRlZmluZWQgfTtcblx0ZGVmZXJyZWQ6IHsgdGFyZ2V0czogU2lkZUVmZmVjdHNUYXJnZXRbXTsgdHJpZ2dlckFjdGlvbjogc3RyaW5nIHwgdW5kZWZpbmVkIH07XG59O1xuXG50eXBlIEZpZWxkVmFsdWVzSW5mbyA9IHtcblx0dmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCBQcmltaXRpdmVUeXBlPjtcblx0ZmllbGRDb250cm9sUmVmZXJlbmNlOiB7IGNvbnRyb2w6IE1hc3NFZGl0RmllbGQ7IHZhbHVlczogUmVjb3JkPHN0cmluZywgUHJpbWl0aXZlVHlwZT4gfVtdO1xufTtcblxuZXhwb3J0IHR5cGUgTWFzc0VkaXRTaWRlRWZmZWN0c0V4ZWN1dGlvblByb3BlcnRpZXMgPSBNYXNzRWRpdFNpZGVFZmZlY3RzUHJvcGVydGllcyAmIHsgb25Sb3dDb250ZXh0OiBib29sZWFuIH07XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1hc3NFZGl0RGlhbG9nIHtcblx0cHJpdmF0ZSByZWFkb25seSByZXF1aXJlZERhdGFQcm9taXNlID0gbmV3IFByb21pc2VLZWVwZXI8dm9pZD4oKTtcblxuXHRwcml2YXRlIGRpYWxvZzogRGlhbG9nIHwgdW5kZWZpbmVkO1xuXG5cdHB1YmxpYyByZWFkb25seSB0YWJsZTogVGFibGU7XG5cblx0cHVibGljIHJlYWRvbmx5IGZpZWxkUHJvcGVydGllczogTWFzc0ZpZWxkUHJvcGVydGllc1tdO1xuXG5cdHByaXZhdGUgcmVhZG9ubHkgdmlldzogRkVWaWV3O1xuXG5cdHB1YmxpYyByZWFkb25seSBjb250ZXh0czogT0RhdGFWNENvbnRleHRbXTtcblxuXHRwcml2YXRlIHJlYWRvbmx5IGNvbnRleHRzT25FcnJvcjogT0RhdGFWNENvbnRleHRbXTtcblxuXHRwcml2YXRlIHJlYWRvbmx5IHVwZGF0ZWRQcm9wZXJ0aWVzOiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoKTtcblxuXHRwcml2YXRlIHJlYWRvbmx5IHJlc291cmNlTW9kZWw6IFJlc291cmNlTW9kZWw7XG5cblx0cHVibGljIHJlYWRvbmx5IGJpbmRpbmdDb250ZXh0OiBPRGF0YVY0Q29udGV4dDtcblxuXHRwdWJsaWMgcmVhZG9ubHkgdHJhbnNpZW50TGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmc7XG5cblx0cHJpdmF0ZSByZWFkb25seSBmaWVsZENvbnRyb2xzOiBNYXNzRWRpdEZpZWxkW107XG5cblx0cHJpdmF0ZSByZWFkb25seSBpc0FkYXB0YXRpb246IGJvb2xlYW47XG5cblx0LyoqXG5cdCAqIENvbnN0cnVjdG9yIG9mIHRoZSBNYXNzRWRpdCBkaWFsb2cuXG5cdCAqIEBwYXJhbSBwcm9wcyBDb250YWlucyB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXNcblx0ICogQHBhcmFtIHByb3BzLnRhYmxlIFRoZSB0YWJsZSB3aGVyZSB0aGUgY2hhbmdlcyBuZWVkIHRvIGJlIGFwcGxpZWRcblx0ICogQHBhcmFtIHByb3BzLmNvbnRleHRzIFRoZSByb3cgY29udGV4dHMgd2hlcmUgdGhlIGNoYW5nZXMgbmVlZCB0byBiZSBhcHBsaWVkXG5cdCAqIEBwYXJhbSBwcm9wcy5maWVsZFByb3BlcnRpZXMgVGhlIHByb3BlcnRpZXMgb3QgdGhlIGZpZWxkc1xuXHQgKi9cblx0Y29uc3RydWN0b3IocHJvcHM6IHsgdGFibGU6IFRhYmxlOyBjb250ZXh0czogT0RhdGFWNENvbnRleHRbXTsgZmllbGRQcm9wZXJ0aWVzOiBNYXNzRmllbGRQcm9wZXJ0aWVzW10gfSkge1xuXHRcdHRoaXMuZGlhbG9nID0gdW5kZWZpbmVkO1xuXHRcdHRoaXMudGFibGUgPSBwcm9wcy50YWJsZTtcblx0XHR0aGlzLmNvbnRleHRzID0gcHJvcHMuY29udGV4dHM7XG5cdFx0dGhpcy5pc0FkYXB0YXRpb24gPSBDb21tb25VdGlscy5nZXRBcHBDb21wb25lbnQodGhpcy50YWJsZSkuaXNBZGFwdGF0aW9uTW9kZSgpO1xuXHRcdHRoaXMuZmllbGRQcm9wZXJ0aWVzID0gcHJvcHMuZmllbGRQcm9wZXJ0aWVzO1xuXHRcdHRoaXMudmlldyA9IENvbW1vblV0aWxzLmdldFRhcmdldFZpZXcodGhpcy50YWJsZSk7XG5cdFx0dGhpcy50cmFuc2llbnRMaXN0QmluZGluZyA9IHRoaXMuZ2VuZXJhdGVMaXN0QmluZGluZygpO1xuXHRcdHRoaXMuYmluZGluZ0NvbnRleHQgPSB0aGlzLnRyYW5zaWVudExpc3RCaW5kaW5nLmNyZWF0ZSh7fSwgdHJ1ZSk7XG5cblx0XHR0aGlzLnJlc291cmNlTW9kZWwgPSBSZXNvdXJjZU1vZGVsSGVscGVyLmdldFJlc291cmNlTW9kZWwodGhpcy50YWJsZSk7XG5cdFx0dGhpcy5jb250ZXh0c09uRXJyb3IgPSBbXTtcblx0XHR0aGlzLmZpZWxkQ29udHJvbHMgPSBbXTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIHRoZSBjb250ZXh0IGZvciB0aGUgZGlhbG9nLlxuXHQgKiBAcmV0dXJucyBUaGUgY29udGV4dC5cblx0ICovXG5cdHByaXZhdGUgZ2VuZXJhdGVMaXN0QmluZGluZygpOiBPRGF0YUxpc3RCaW5kaW5nIHtcblx0XHRjb25zdCBsaXN0QmluZGluZyA9IHRoaXMudGFibGUuZ2V0Um93QmluZGluZygpO1xuXHRcdGNvbnN0IHRyYW5zaWVudExpc3RCaW5kaW5nID0gKHRoaXMudGFibGUuZ2V0TW9kZWwoKSBhcyBPRGF0YU1vZGVsKS5iaW5kTGlzdChcblx0XHRcdGxpc3RCaW5kaW5nLmdldFBhdGgoKSxcblx0XHRcdGxpc3RCaW5kaW5nLmdldENvbnRleHQoKSxcblx0XHRcdFtdLFxuXHRcdFx0W10sXG5cdFx0XHR7XG5cdFx0XHRcdCQkdXBkYXRlR3JvdXBJZDogXCJzdWJtaXRMYXRlclwiXG5cdFx0XHR9XG5cdFx0KTtcblx0XHR0cmFuc2llbnRMaXN0QmluZGluZy5yZWZyZXNoSW50ZXJuYWwgPSAoKTogdm9pZCA9PiB7XG5cdFx0XHQvKiAqL1xuXHRcdH07XG5cdFx0cmV0dXJuIHRyYW5zaWVudExpc3RCaW5kaW5nO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgdGhlIGRpYWxvZy5cblx0ICogQHJldHVybnMgVGhlIGluc3RhbmNlIG9mIGRpYWxvZy5cblx0ICovXG5cdGFzeW5jIGNyZWF0ZSgpOiBQcm9taXNlPERpYWxvZz4ge1xuXHRcdGlmICghdGhpcy5kaWFsb2cpIHtcblx0XHRcdGNvbnN0IGNvcmVSZXNvdXJjZUJ1bmRsZSA9IExpYnJhcnkuZ2V0UmVzb3VyY2VCdW5kbGVGb3IoXCJzYXAuZmUuY29yZVwiKSBhcyBSZXNvdXJjZUJ1bmRsZTtcblx0XHRcdGNvbnN0IGFwcGx5QnV0dG9uVGV4dCA9XG5cdFx0XHRcdHRoaXMudmlldy5nZXRWaWV3RGF0YSgpLmNvbnZlcnRlclR5cGUgPT09IFwiTGlzdFJlcG9ydFwiXG5cdFx0XHRcdFx0PyB0aGlzLnJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfTUFTU19FRElUX1NBVkVfQlVUVE9OX1RFWFRcIilcblx0XHRcdFx0XHQ6IGNvcmVSZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19DT01NT05fRElBTE9HX09LXCIpO1xuXHRcdFx0Y29uc3QgZGlhbG9nQ29udGVudCA9IGF3YWl0IHRoaXMuY3JlYXRlQ29udGVudCgpO1xuXHRcdFx0Y29uc3QgZGlhbG9nID0gKFxuXHRcdFx0XHQ8RGlhbG9nXG5cdFx0XHRcdFx0ZHQ6ZGVzaWdudGltZT1cInNhcC9mZS9tYWNyb3MvdGFibGUvbWFzc0VkaXQvZGVzaWdudGltZS9NYXNzRWRpdC5kZXNpZ250aW1lXCJcblx0XHRcdFx0XHRpZD17SUQuZ2VuZXJhdGUoW3RoaXMudGFibGUuZ2V0SWQoKSwgXCJNRURfXCIsIFwiRGlhbG9nXCJdKX1cblx0XHRcdFx0XHRjb250ZW50V2lkdGg9XCIyN3JlbVwiXG5cdFx0XHRcdFx0Y2xhc3M9XCJzYXBVaUNvbnRlbnRQYWRkaW5nXCJcblx0XHRcdFx0XHRob3Jpem9udGFsU2Nyb2xsaW5nPVwiZmFsc2VcIlxuXHRcdFx0XHRcdHRpdGxlPXt0aGlzLnJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfTUFTU19FRElUX0RJQUxPR19USVRMRVwiLCBbdGhpcy5jb250ZXh0cy5sZW5ndGgudG9TdHJpbmcoKV0pfVxuXHRcdFx0XHRcdGNvbnRlbnQ9e2RpYWxvZ0NvbnRlbnR9XG5cdFx0XHRcdFx0ZXNjYXBlSGFuZGxlcj17dGhpcy5vbkNsb3NlLmJpbmQodGhpcyl9XG5cdFx0XHRcdFx0YmVmb3JlT3Blbj17dGhpcy5iZWZvcmVPcGVuLmJpbmQodGhpcyl9XG5cdFx0XHRcdFx0YmVnaW5CdXR0b249ezxCdXR0b24gdGV4dD17YXBwbHlCdXR0b25UZXh0fSB0eXBlPVwiRW1waGFzaXplZFwiIHByZXNzPXt0aGlzLm9uQXBwbHkuYmluZCh0aGlzKX0gLz59XG5cdFx0XHRcdFx0ZW5kQnV0dG9uPXs8QnV0dG9uIHRleHQ9e2NvcmVSZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19DT01NT05fT0JKRUNUX1BBR0VfQ0FOQ0VMXCIpfSBwcmVzcz17dGhpcy5vbkNsb3NlLmJpbmQodGhpcyl9IC8+fVxuXHRcdFx0XHQvPlxuXHRcdFx0KTtcblx0XHRcdHRoaXMuZGlhbG9nID0gZGlhbG9nO1xuXHRcdFx0Ly8gV2UgZG9uJ3Qgd2FudCB0byBpbmhlcml0IGZyb20gdGhlIFBhZ2VDb21wb25lbnQgZm9yIHRoZSB1aSBtb2RlbCAtPiBpbnRvIHRoaXMgZGlhbG9nLCBmaWVsZHMgYXJlIGVkaXRhYmxlXG5cdFx0XHRkaWFsb2cuc2V0TW9kZWwobmV3IEpTT05Nb2RlbCh7IGlzRWRpdGFibGU6IHRydWUgfSksIFwidWlcIik7XG5cdFx0XHRkaWFsb2cuYmluZEVsZW1lbnQoe1xuXHRcdFx0XHRwYXRoOiBcIi9cIixcblx0XHRcdFx0bW9kZWw6IFwidWlcIlxuXHRcdFx0fSk7XG5cdFx0XHRyZXR1cm4gZGlhbG9nO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy5kaWFsb2c7XG5cdH1cblxuXHQvKipcblx0ICogU2V0cyB0aGUgbGFzdCBjb25maWd1cmF0aW9uIGJlZm9yZSBvcGVuaW5nIHRoZSBkaWFsb2c6XG5cdCAqICAtIHNldCB0aGUgcnVudGltZSBtb2RlbFxuXHQgKiAgLSBzZXQgdGhlIE9kYXRhTW9kZWxcblx0ICogIC0gYWRkIHRoZSBkaWFsb2cgYXMgZGVwZW5kZW50IG9mIHRoZSB0YWJsZS5cblx0ICogQHBhcmFtIGV2ZW50IFRoZSB1aTUgZXZlbnRcblx0ICovXG5cdHByaXZhdGUgYmVmb3JlT3BlbihldmVudDogVUk1RXZlbnQ8e30sIERpYWxvZz4pOiB2b2lkIHtcblx0XHRjb25zdCBkaWFsb2cgPSBldmVudC5nZXRTb3VyY2UoKTtcblx0XHRkaWFsb2cuc2V0TW9kZWwodGhpcy50YWJsZS5nZXRNb2RlbCgpKTtcblx0XHRkaWFsb2cuc2V0QmluZGluZ0NvbnRleHQodGhpcy5iaW5kaW5nQ29udGV4dCk7XG5cdFx0dGhpcy50YWJsZS5hZGREZXBlbmRlbnQoZGlhbG9nKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDbG9zZXMgYW5kIGRlc3Ryb3lzIHRoZSBkaWFsb2cuXG5cdCAqL1xuXHRwcml2YXRlIG9uQ2xvc2UoKTogdm9pZCB7XG5cdFx0dGhpcy50cmFuc2llbnRMaXN0QmluZGluZy5kZXN0cm95KCk7XG5cdFx0aWYgKHRoaXMuZGlhbG9nKSB7XG5cdFx0XHR0aGlzLmRpYWxvZy5jbG9zZSgpO1xuXHRcdFx0dGhpcy5kaWFsb2cuZGVzdHJveSgpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBwcm9taXNlIG9mIHRoZSByZXF1aXJlZCBkYXRhLlxuXHQgKiBUaGlzIHByb21pc2UgaXMgcmVzb2x2ZWQgd2hlbiB0aGUgcmVxdWlyZWQgZGF0YSBpcyBsb2FkZWQuXG5cdCAqIFRoaXMgZGF0YSBhcmUgdXNlZCBvbiB0aGUgc2F2ZSB3b3JrZmxvdyB0byBkZXRlcm1pbmUgaWYgdGhlIG5ldyBkYXRhIGhhcyB0byBiZSBzYXZlZCBvciBub3QuXG5cdCAqIFRoZSBzYXZlIHdvcmtmbG93IGlzIGV4ZWN1dGVkIG9ubHkgaWYgdGhpcyBwcm9taXNlIGlzIHJlc29sdmVkLlxuXHQgKiBAcmV0dXJucyBUaGUgcHJvbWlzZSBvZiB0aGUgcmVxdWlyZWQgZGF0YS5cblx0ICovXG5cdGdldFJlcXVpcmVkRGF0YVByb21pc2UoKTogUHJvbWlzZUtlZXBlcjx2b2lkPiB7XG5cdFx0cmV0dXJuIHRoaXMucmVxdWlyZWREYXRhUHJvbWlzZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBNYW5hZ2VzIHRoZSBtZXNzYWdlcyBhY2NvcmRpbmcgdG8gdGhlIGNvbnRleHRzIG9uIGVycm9yLlxuXHQgKi9cblx0YXN5bmMgbWFuYWdlTWVzc2FnZSgpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBjb3JlUmVzb3VyY2VCdW5kbGUgPSBMaWJyYXJ5LmdldFJlc291cmNlQnVuZGxlRm9yKFwic2FwLmZlLmNvcmVcIikgYXMgUmVzb3VyY2VCdW5kbGU7XG5cdFx0Y29uc3QgY29udHJvbGxlciA9IHRoaXMudmlldy5nZXRDb250cm9sbGVyKCk7XG5cdFx0Y29uc3QgRHJhZnRTdGF0dXMgPSBGRUxpYnJhcnkuRHJhZnRTdGF0dXM7XG5cdFx0Y29uc3QgaW50ZXJuYWxNb2RlbENvbnRleHQgPSB0aGlzLnZpZXcuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKTtcblx0XHRpbnRlcm5hbE1vZGVsQ29udGV4dD8uc2V0UHJvcGVydHkoXCJnZXRCb3VuZE1lc3NhZ2VzRm9yTWFzc0VkaXRcIiwgdHJ1ZSk7XG5cdFx0YXdhaXQgY29udHJvbGxlci5tZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZXMoe1xuXHRcdFx0b25CZWZvcmVTaG93TWVzc2FnZTogKFxuXHRcdFx0XHRtZXNzYWdlczogTWVzc2FnZVtdLFxuXHRcdFx0XHRzaG93TWVzc2FnZVBhcmFtZXRlcnM6IHtcblx0XHRcdFx0XHRmbkdldE1lc3NhZ2VTdWJ0aXRsZT86IEZ1bmN0aW9uO1xuXHRcdFx0XHRcdHNob3dNZXNzYWdlQm94PzogYm9vbGVhbjtcblx0XHRcdFx0XHRzaG93TWVzc2FnZURpYWxvZz86IGJvb2xlYW47XG5cdFx0XHRcdFx0ZmlsdGVyZWRNZXNzYWdlcz86IE1lc3NhZ2VbXTtcblx0XHRcdFx0XHRzaG93Q2hhbmdlU2V0RXJyb3JEaWFsb2c/OiBib29sZWFuO1xuXHRcdFx0XHR9XG5cdFx0XHQpID0+IHtcblx0XHRcdFx0c2hvd01lc3NhZ2VQYXJhbWV0ZXJzLmZuR2V0TWVzc2FnZVN1YnRpdGxlID0gbWVzc2FnZUhhbmRsaW5nLnNldE1lc3NhZ2VTdWJ0aXRsZS5iaW5kKHt9LCB0aGlzLnRhYmxlLCB0aGlzLmNvbnRleHRzKTtcblxuXHRcdFx0XHRpZiAoIXRoaXMuY29udGV4dHNPbkVycm9yLmxlbmd0aCkge1xuXHRcdFx0XHRcdGlmICh0aGlzLnVwZGF0ZWRQcm9wZXJ0aWVzLnNpemUgPiAwKSB7XG5cdFx0XHRcdFx0XHQvL1RoZXJlIGlzIGF0IGxlYXN0IG9uZSBuZXcgdmFsdWUgc2V0XG5cdFx0XHRcdFx0XHRjb250cm9sbGVyLmVkaXRGbG93LnNldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLlNhdmVkKTtcblx0XHRcdFx0XHRcdGlmICh0aGlzLnZpZXcuZ2V0Vmlld0RhdGEoKS5jb252ZXJ0ZXJUeXBlID09PSBcIkxpc3RSZXBvcnRcIikge1xuXHRcdFx0XHRcdFx0XHRNZXNzYWdlVG9hc3Quc2hvdyh0aGlzLnJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfTUFTU19FRElUX1NVQ0NFU1NfVE9BU1RcIikpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0TWVzc2FnZVRvYXN0LnNob3codGhpcy5yZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX09CSkVDVF9QQUdFX01BU1NfRURJVF9TVUNDRVNTX1RPQVNUXCIpKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0TWVzc2FnZVRvYXN0LnNob3codGhpcy5yZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX01BU1NfRURJVF9OT19DSEFOR0VcIikpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIGlmICh0aGlzLmNvbnRleHRzT25FcnJvci5sZW5ndGggPCB0aGlzLmNvbnRleHRzLmxlbmd0aCkge1xuXHRcdFx0XHRcdGNvbnRyb2xsZXIuZWRpdEZsb3cuc2V0RHJhZnRTdGF0dXMoRHJhZnRTdGF0dXMuU2F2ZWQpO1xuXHRcdFx0XHR9IGVsc2UgaWYgKHRoaXMuY29udGV4dHNPbkVycm9yLmxlbmd0aCA9PT0gdGhpcy5jb250ZXh0cy5sZW5ndGgpIHtcblx0XHRcdFx0XHRjb250cm9sbGVyLmVkaXRGbG93LnNldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLkNsZWFyKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChDb21tb25VdGlscy5nZXRJc0VkaXRhYmxlKGNvbnRyb2xsZXIpICYmICFtZXNzYWdlcy5zb21lKChtZXNzYWdlKSA9PiAhbWVzc2FnZS5nZXRUYXJnZXRzKCkpKSB7XG5cdFx0XHRcdFx0c2hvd01lc3NhZ2VQYXJhbWV0ZXJzLnNob3dNZXNzYWdlQm94ID0gZmFsc2U7XG5cdFx0XHRcdFx0c2hvd01lc3NhZ2VQYXJhbWV0ZXJzLnNob3dNZXNzYWdlRGlhbG9nID0gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHNob3dNZXNzYWdlUGFyYW1ldGVycztcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdGlmICghIXRoaXMuY29udGV4dHNPbkVycm9yLmxlbmd0aCAmJiB0aGlzLmNvbnRleHRzT25FcnJvci5sZW5ndGggPCB0aGlzLmNvbnRleHRzLmxlbmd0aCkge1xuXHRcdFx0Y29uc3QgY29uZmlybUJ1dHRvblR4dCA9IGNvcmVSZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19DT01NT05fRElBTE9HX09LXCIpO1xuXHRcdFx0TWVzc2FnZUJveC5zdWNjZXNzKFxuXHRcdFx0XHR0aGlzLnJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfTUFTU19FRElUX0NIQU5HRVNfV0lUSF9FUlJPUlwiLCBbXG5cdFx0XHRcdFx0dGhpcy5jb250ZXh0cy5sZW5ndGggLSB0aGlzLmNvbnRleHRzT25FcnJvci5sZW5ndGgsXG5cdFx0XHRcdFx0dGhpcy5jb250ZXh0cy5sZW5ndGhcblx0XHRcdFx0XSksXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRhY3Rpb25zOiBbY29uZmlybUJ1dHRvblR4dF0sXG5cdFx0XHRcdFx0ZW1waGFzaXplZEFjdGlvbjogY29uZmlybUJ1dHRvblR4dFxuXHRcdFx0XHR9XG5cdFx0XHQpO1xuXHRcdH1cblx0XHRpbnRlcm5hbE1vZGVsQ29udGV4dD8uc2V0UHJvcGVydHkoXCJnZXRCb3VuZE1lc3NhZ2VzRm9yTWFzc0VkaXRcIiwgZmFsc2UpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNhdmVzIHRoZSByZWxldmFudCBjb250ZXh0cyBhbmQgcmVmcmVzaGVzIHRoZSBhc3NvY2lhdGVkIHByb3BlcnRpZXMuXG5cdCAqIEBwYXJhbSBmaWVsZFZhbHVlc0luZm8gVGhlIGluZm9ybWF0aW9uIG9mIHRoZSB2YWx1ZXMgZm9yIGFsbCBtYXNzIGVkaXQgZmllbGRzLlxuXHQgKiBAcmV0dXJucyBBIFByb21pc2UuXG5cdCAqL1xuXHRwcml2YXRlIGFzeW5jIHNhdmVDaGFuZ2VzKGZpZWxkVmFsdWVzSW5mbzogRmllbGRWYWx1ZXNJbmZvKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgbWFuaWZlc3RTZXR0aW5ncyA9ICh0aGlzLnRhYmxlLmdldFBhcmVudCgpIGFzIFRhYmxlQVBJKS5nZXRUYWJsZURlZmluaXRpb24oKS5jb250cm9sLm1hc3NFZGl0O1xuXHRcdGNvbnN0IGlzSXNvbGF0ZWQgPSBtYW5pZmVzdFNldHRpbmdzLm9wZXJhdGlvbkdyb3VwaW5nTW9kZSA9PT0gT3BlcmF0aW9uR3JvdXBpbmdNb2RlLklzb2xhdGVkO1xuXHRcdGNvbnN0IGlzb2xhdGVkR3JvdXBJZCA9IFwiJGF1dG8uSXNvbGF0ZWRcIjtcblx0XHRjb25zdCBtYXNzRWRpdFNpZGVFZmZlY3RzID0gbmV3IE1hc3NFZGl0U2lkZUVmZmVjdHModGhpcyk7IC8vIFVzZSB0aGUgZmlyc3QgbGluZSBhcyByZWZlcmVuY2UgY29udGV4dCB0byBjYWxjdWxhdGUgdGhlIG1hcCBvZiBzaWRlIGVmZmVjdHNcblx0XHRjb25zdCBmaWVsZFByb21pc2VzOiBQcm9taXNlPHVua25vd24+W10gPSBbXTtcblx0XHRjb25zdCBtb2RlbCA9IHRoaXMudGFibGUuZ2V0TW9kZWwoKSBhcyBPRGF0YU1vZGVsO1xuXG5cdFx0aWYgKGlzSXNvbGF0ZWQpIHtcblx0XHRcdG1vZGVsLnNldENvbnRpbnVlT25FcnJvcihpc29sYXRlZEdyb3VwSWQpO1xuXHRcdH1cblx0XHR0aGlzLmNvbnRleHRzLmZvckVhY2goKHNlbGVjdGVkQ29udGV4dDogT0RhdGFWNENvbnRleHQpID0+IHtcblx0XHRcdGNvbnN0IGltbWVkaWF0ZVNpZGVFZmZlY3RzOiB7IHByb3BlcnR5UGF0aDogc3RyaW5nOyBncm91cElkOiBzdHJpbmcgfVtdID0gW107XG5cdFx0XHRjb25zdCByZWZyZXNoRGVzY3JpcHRpb25zOiB7IGNvbnRyb2w6IE1hc3NFZGl0RmllbGQ7IGdyb3VwSWQ6IHN0cmluZyB9W10gPSBbXTtcblx0XHRcdGZvciAoY29uc3QgeyBjb250cm9sLCB2YWx1ZXMgfSBvZiBmaWVsZFZhbHVlc0luZm8uZmllbGRDb250cm9sUmVmZXJlbmNlKSB7XG5cdFx0XHRcdGxldCB2YWx1ZUhhc0NoYW5nZWQgPSBmYWxzZTtcblx0XHRcdFx0aWYgKCFjb250cm9sLmlzUmVhZE9ubHlPbkNvbnRleHQoc2VsZWN0ZWRDb250ZXh0KSkge1xuXHRcdFx0XHRcdGNvbnN0IGdyb3VwSWQgPSBpc0lzb2xhdGVkID8gaXNvbGF0ZWRHcm91cElkIDogXCIkYXV0b1wiO1xuXHRcdFx0XHRcdGZvciAoY29uc3QgcHJvcGVydHlQYXRoIGluIHZhbHVlcykge1xuXHRcdFx0XHRcdFx0aWYgKHNlbGVjdGVkQ29udGV4dC5nZXRQcm9wZXJ0eShwcm9wZXJ0eVBhdGgpICE9PSB2YWx1ZXNbcHJvcGVydHlQYXRoXSkge1xuXHRcdFx0XHRcdFx0XHR2YWx1ZUhhc0NoYW5nZWQgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHRmaWVsZFByb21pc2VzLnB1c2goXG5cdFx0XHRcdFx0XHRcdFx0c2VsZWN0ZWRDb250ZXh0XG5cdFx0XHRcdFx0XHRcdFx0XHQuc2V0UHJvcGVydHkocHJvcGVydHlQYXRoLCB2YWx1ZXNbcHJvcGVydHlQYXRoXSwgZ3JvdXBJZClcblx0XHRcdFx0XHRcdFx0XHRcdC50aGVuKCgpID0+IHRoaXMudXBkYXRlZFByb3BlcnRpZXMuYWRkKHByb3BlcnR5UGF0aCkpXG5cdFx0XHRcdFx0XHRcdFx0XHQuY2F0Y2goKGVycm9yOiB1bmtub3duKSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHRoaXMuY29udGV4dHNPbkVycm9yLnB1c2goc2VsZWN0ZWRDb250ZXh0KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0TG9nLmVycm9yKFwiTWFzcyBFZGl0OiBTb21ldGhpbmcgd2VudCB3cm9uZyBpbiB1cGRhdGluZyBlbnRyaWVzLlwiLCBlcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0aW1tZWRpYXRlU2lkZUVmZmVjdHMucHVzaCh7XG5cdFx0XHRcdFx0XHRcdFx0cHJvcGVydHlQYXRoLFxuXHRcdFx0XHRcdFx0XHRcdGdyb3VwSWRcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmICh2YWx1ZUhhc0NoYW5nZWQpIHtcblx0XHRcdFx0XHRcdHJlZnJlc2hEZXNjcmlwdGlvbnMucHVzaCh7IGNvbnRyb2wsIGdyb3VwSWQgfSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRmaWVsZFByb21pc2VzLnB1c2goXG5cdFx0XHRcdC4uLmltbWVkaWF0ZVNpZGVFZmZlY3RzLm1hcChhc3luYyAoaW1tZWRpYXRlU2lkZUVmZmVjdCkgPT5cblx0XHRcdFx0XHRtYXNzRWRpdFNpZGVFZmZlY3RzLmV4ZWN1dGVJbW1lZGlhdGVTaWRlRWZmZWN0cyhcblx0XHRcdFx0XHRcdHNlbGVjdGVkQ29udGV4dCxcblx0XHRcdFx0XHRcdGltbWVkaWF0ZVNpZGVFZmZlY3QucHJvcGVydHlQYXRoLFxuXHRcdFx0XHRcdFx0aW1tZWRpYXRlU2lkZUVmZmVjdC5ncm91cElkXG5cdFx0XHRcdFx0KVxuXHRcdFx0XHQpXG5cdFx0XHQpO1xuXHRcdFx0ZmllbGRQcm9taXNlcy5wdXNoKFxuXHRcdFx0XHQuLi5yZWZyZXNoRGVzY3JpcHRpb25zLm1hcChhc3luYyAocmVmcmVzaERlc2NyaXB0aW9uKSA9PlxuXHRcdFx0XHRcdG1hc3NFZGl0U2lkZUVmZmVjdHMucmVmcmVzaERlc2NyaXB0aW9uKHJlZnJlc2hEZXNjcmlwdGlvbi5jb250cm9sLCBzZWxlY3RlZENvbnRleHQsIHJlZnJlc2hEZXNjcmlwdGlvbi5ncm91cElkKVxuXHRcdFx0XHQpXG5cdFx0XHQpO1xuXHRcdFx0aWYgKGlzSXNvbGF0ZWQpIHtcblx0XHRcdFx0Ly9DcmVhdGUgYSBuZXcgQ2hhbmdlU2V0IGZvciB0aGUgbmV4dCByZXF1ZXN0c1xuXHRcdFx0XHRtb2RlbC5zdWJtaXRCYXRjaChpc29sYXRlZEdyb3VwSWQpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0YXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKGZpZWxkUHJvbWlzZXMpO1xuXHRcdGlmICh0aGlzLnVwZGF0ZWRQcm9wZXJ0aWVzLnNpemUpIHtcblx0XHRcdG1hc3NFZGl0U2lkZUVmZmVjdHMuZXhlY3V0ZURlZmVycmVkU2lkZUVmZmVjdHMobmV3IFNldChbXCJnZW5lcmljRmllbGRcIiwgLi4uQXJyYXkuZnJvbSh0aGlzLnVwZGF0ZWRQcm9wZXJ0aWVzKV0pKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgaW5mb3JtYXRpb24gb2YgdGhlIHZhbHVlcyBmb3IgYWxsIG1hc3MgZWRpdCBmaWVsZHMuXG5cdCAqIEByZXR1cm5zIFRoZSBpbmZvcm1hdGlvbi5cblx0ICovXG5cdHByaXZhdGUgZ2V0RmllbGRWYWx1ZXNJbmZvcygpOiBGaWVsZFZhbHVlc0luZm8ge1xuXHRcdGNvbnN0IHJlc3VsdCA9IHtcblx0XHRcdHZhbHVlczoge30sXG5cdFx0XHRmaWVsZENvbnRyb2xSZWZlcmVuY2U6IFtdXG5cdFx0fSBhcyBGaWVsZFZhbHVlc0luZm87XG5cdFx0Zm9yIChjb25zdCBmaWVsZENvbnRyb2wgb2YgdGhpcy5maWVsZENvbnRyb2xzKSB7XG5cdFx0XHRjb25zdCBmaWVsZFZhbHVlcyA9IGZpZWxkQ29udHJvbC5nZXRGaWVsZFZhbHVlcygpO1xuXHRcdFx0cmVzdWx0LnZhbHVlcyA9IHsgLi4ucmVzdWx0LnZhbHVlcywgLi4uZmllbGRWYWx1ZXMgfTtcblx0XHRcdHJlc3VsdC5maWVsZENvbnRyb2xSZWZlcmVuY2UucHVzaCh7IGNvbnRyb2w6IGZpZWxkQ29udHJvbCwgdmFsdWVzOiBmaWVsZFZhbHVlcyB9KTtcblx0XHR9XG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdC8qKlxuXHQgKiBVcGRhdGVzIHRoZSB0YWJsZSBmaWVsZHMgYWNjb3JkaW5nIHRvIHRoZSBkaWFsb2cgZW50cmllcy5cblx0ICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBjdXN0b20gc2F2ZSBpcyBleGVjdXRlZCwgYGZhbHNlYCBvdGhlcndpc2UuXG5cdCAqL1xuXHRhc3luYyBhcHBseUNoYW5nZXMoKTogUHJvbWlzZTxib29sZWFuPiB7XG5cdFx0YXdhaXQgdGhpcy5yZXF1aXJlZERhdGFQcm9taXNlLnByb21pc2U7IC8vIFdlIG5lZWQgdG8gd2FpdCBmb3IgdGhlIHJlcXVpcmVkIGRhdGEgdG8gYmUgbG9hZGVkIGJlZm9yZSBzYXZpbmcuXG5cdFx0Ly9XZSB3YW50IHRvIHNraXAgdGhlIHBhdGNoIGhhbmRsZXIoc3BlY2lmaWMgd29ya2Zsb3cgZG9uZSBpbnRvIHRoZSBFZGl0Rmxvdykgc2luY2UgdGhlIHBhdGNoIGlzIG1hbmFnZWQgaGVyZVxuXHRcdHRoaXMudmlldy5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpPy5zZXRQcm9wZXJ0eShcInNraXBQYXRjaEhhbmRsZXJzXCIsIHRydWUpO1xuXG5cdFx0Y29uc3QgZmllbGRzVmFsdWVzSW5mbyA9IHRoaXMuZ2V0RmllbGRWYWx1ZXNJbmZvcygpO1xuXHRcdGxldCBjdXN0b21TYXZlID0gZmFsc2U7XG5cdFx0dHJ5IHtcblx0XHRcdGN1c3RvbVNhdmUgPSBhd2FpdCB0aGlzLnZpZXdcblx0XHRcdFx0LmdldENvbnRyb2xsZXIoKVxuXHRcdFx0XHQuZWRpdEZsb3cuY3VzdG9tTWFzc0VkaXRTYXZlKHsgYUNvbnRleHRzOiB0aGlzLmNvbnRleHRzLCBvVXBkYXRlRGF0YTogZmllbGRzVmFsdWVzSW5mby52YWx1ZXMgfSk7XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdExvZy5lcnJvcihcIk1hc3MgRWRpdDogU29tZXRoaW5nIHdlbnQgd3JvbmcgaW4gdXBkYXRpbmcgZW50cmllcy5cIiwgZXJyb3IgYXMgc3RyaW5nKTtcblx0XHR9XG5cdFx0aWYgKCFjdXN0b21TYXZlKSB7XG5cdFx0XHRhd2FpdCB0aGlzLnNhdmVDaGFuZ2VzKGZpZWxkc1ZhbHVlc0luZm8pO1xuXHRcdH1cblx0XHR0aGlzLnZpZXcuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKT8uc2V0UHJvcGVydHkoXCJza2lwUGF0Y2hIYW5kbGVyc1wiLCBmYWxzZSk7XG5cdFx0cmV0dXJuIGN1c3RvbVNhdmU7XG5cdH1cblxuXHQvKipcblx0ICogTWFuYWdlcyB0aGUgcHJlc3Mgb24gdGhlIEFwcGx5IEJ1dHRvbi5cblx0ICogQHJldHVybnMgQSBwcm9taXNlLlxuXHQgKi9cblx0cHJpdmF0ZSBhc3luYyBvbkFwcGx5KCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGlmICh0aGlzLmZpZWxkQ29udHJvbHMuc29tZSgoZmllbGRDb250cm9sKSA9PiAhZmllbGRDb250cm9sLmlzRmllbGRWYWxpZCgpKSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRpZiAoIXRoaXMuaXNBZGFwdGF0aW9uKSB7XG5cdFx0XHRtZXNzYWdlSGFuZGxpbmcucmVtb3ZlQm91bmRUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblx0XHRcdG1lc3NhZ2VIYW5kbGluZy5yZW1vdmVVbmJvdW5kVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cdFx0XHRjb25zdCBpc0N1c3RvbVNhdmUgPSBhd2FpdCB0aGlzLmFwcGx5Q2hhbmdlcygpO1xuXHRcdFx0aWYgKCFpc0N1c3RvbVNhdmUpIHtcblx0XHRcdFx0dGhpcy5tYW5hZ2VNZXNzYWdlKCk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHRoaXMub25DbG9zZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgdGhlIGRpYWxvZyBjb250ZW50LlxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJldHVybmluZyBpbnN0YW5jZSBvZiBmcmFnbWVudC5cblx0ICovXG5cblx0cHJpdmF0ZSBhc3luYyBjcmVhdGVDb250ZW50KCk6IFByb21pc2U8Rm9ybT4ge1xuXHRcdGNvbnN0IGN1c3RvbUZvcm1Db250YWluZXIgPSBhd2FpdCB0aGlzLmNyZWF0ZUN1c3RvbUNvbnRhaW5lcigpO1xuXHRcdHJldHVybiAoXG5cdFx0XHQ8PlxuXHRcdFx0XHR7dGhpcy5nZXRBZGFwdGF0aW9uTWVzc2FnZSgpfVxuXHRcdFx0XHQ8Rm9ybT5cblx0XHRcdFx0XHR7e1xuXHRcdFx0XHRcdFx0bGF5b3V0OiA8UmVzcG9uc2l2ZUdyaWRMYXlvdXQgbGFiZWxTcGFuTT1cIjEyXCIgbGFiZWxTcGFuTD1cIjEyXCIgbGFiZWxTcGFuWEw9XCIxMlwiIC8+LFxuXHRcdFx0XHRcdFx0Zm9ybUNvbnRhaW5lcnM6IChcblx0XHRcdFx0XHRcdFx0PD5cblx0XHRcdFx0XHRcdFx0XHR7Y3VzdG9tRm9ybUNvbnRhaW5lcn1cblx0XHRcdFx0XHRcdFx0XHQ8Rm9ybUNvbnRhaW5lcj5cblx0XHRcdFx0XHRcdFx0XHRcdHt7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGZvcm1FbGVtZW50czogdGhpcy5jcmVhdGVGb3JtRWxlbWVudHMoKVxuXHRcdFx0XHRcdFx0XHRcdFx0fX1cblx0XHRcdFx0XHRcdFx0XHQ8L0Zvcm1Db250YWluZXI+XG5cdFx0XHRcdFx0XHRcdDwvPlxuXHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdH19XG5cdFx0XHRcdDwvRm9ybT5cblx0XHRcdDwvPlxuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgYWRhcHRhdGlvbiBtZXNzYWdlLlxuXHQgKiBAcmV0dXJucyBUaGUgbWVzc2FnZSBzdHJpcCBpZiB0aGUgZGlhbG9nIGlzIGRpc3BsYXllZCBpbiBhZGFwdGF0aW9uIG1vZGUuXG5cdCAqL1xuXHRwcml2YXRlIGdldEFkYXB0YXRpb25NZXNzYWdlKCk6IE1lc3NhZ2VTdHJpcCB8IHVuZGVmaW5lZCB7XG5cdFx0aWYgKHRoaXMuaXNBZGFwdGF0aW9uKSB7XG5cdFx0XHRyZXR1cm4gPE1lc3NhZ2VTdHJpcCB0ZXh0PXt0aGlzLnJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfTUFTU19FRElUX0FEQVBUQVRJT05fTU9ERVwiKX0gLz47XG5cdFx0fVxuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyB0aGUgY3VzdG9tIGZvcm0gY29udGFpbmVyIGFjY29yZGluZyB0byB0aGUgbWFuaWZlc3Qgc2V0dGluZ3MuXG5cdCAqIEByZXR1cm5zIFRoZSBjdXN0b20gZm9ybSBjb250YWluZXIuXG5cdCAqL1xuXHRwcml2YXRlIGFzeW5jIGNyZWF0ZUN1c3RvbUNvbnRhaW5lcigpOiBQcm9taXNlPEZvcm1Db250YWluZXIgfCB1bmRlZmluZWQ+IHtcblx0XHRjb25zdCBtYW5pZmVzdFNldHRpbmdzID0gKHRoaXMudGFibGUuZ2V0UGFyZW50KCkgYXMgVGFibGVBUEkpLmdldFRhYmxlRGVmaW5pdGlvbigpLmNvbnRyb2wubWFzc0VkaXQ7XG5cdFx0aWYgKG1hbmlmZXN0U2V0dGluZ3MuY3VzdG9tRnJhZ21lbnQpIHtcblx0XHRcdGlmIChtYW5pZmVzdFNldHRpbmdzLmZyb21JbmxpbmUgPT09IHRydWUpIHtcblx0XHRcdFx0Ly8gSW5saW5lIGNvbmZpZ3VyYXRpb24gZnJvbSBhIFYyIGJsb2NrOiB0aGUgZnJhZ21lbnQgaXMgYSBzdHJpbmdcblx0XHRcdFx0aWYgKHR5cGVvZiBtYW5pZmVzdFNldHRpbmdzLmN1c3RvbUZyYWdtZW50ID09PSBcInN0cmluZ1wiKSB7XG5cdFx0XHRcdFx0Y29uc3QgcmVzdWx0WE1MID0gYXdhaXQgWE1MUHJlcHJvY2Vzc29yLnByb2Nlc3MoXG5cdFx0XHRcdFx0XHRuZXcgRE9NUGFyc2VyKCkucGFyc2VGcm9tU3RyaW5nKG1hbmlmZXN0U2V0dGluZ3MuY3VzdG9tRnJhZ21lbnQsIFwidGV4dC94bWxcIikuZmlyc3RFbGVtZW50Q2hpbGQsXG5cdFx0XHRcdFx0XHR7IG1vZGVsczoge30gfSxcblx0XHRcdFx0XHRcdCh0aGlzLnZpZXcuZ2V0Q29udHJvbGxlcigpLmdldE93bmVyQ29tcG9uZW50KCkgYXMgRW5oYW5jZVdpdGhVSTU8VGVtcGxhdGVDb21wb25lbnQ+KS5nZXRQcmVwcm9jZXNzb3JDb250ZXh0KClcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdHJldHVybiAoYXdhaXQgRnJhZ21lbnQubG9hZCh7XG5cdFx0XHRcdFx0XHR0eXBlOiBcIlhNTFwiLFxuXHRcdFx0XHRcdFx0ZGVmaW5pdGlvbjogcmVzdWx0WE1MLFxuXHRcdFx0XHRcdFx0Y29udHJvbGxlcjogdGhpcy52aWV3LmdldENvbnRyb2xsZXIoKVxuXHRcdFx0XHRcdH0pKSBhcyB1bmtub3duIGFzIEZvcm1Db250YWluZXI7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gSW5saW5lIGNvbmZpZ3VyYXRpb24gZnJvbSBhIFY0IGJsb2NrOiB0aGUgZnJhZ21lbnQgaXMgYWxyZWFkeSBhIEZvcm1Db250YWluZXJcblx0XHRcdFx0XHRyZXR1cm4gbWFuaWZlc3RTZXR0aW5ncy5jdXN0b21GcmFnbWVudC5jbG9uZSgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gKGF3YWl0IHRoaXMudmlld1xuXHRcdFx0XHQuZ2V0Q29udHJvbGxlcigpXG5cdFx0XHRcdC5nZXRFeHRlbnNpb25BUEkoKVxuXHRcdFx0XHQubG9hZEZyYWdtZW50KHtcblx0XHRcdFx0XHRpZDogXCJjdXN0b21NYXNzRWRpdFwiLFxuXHRcdFx0XHRcdG5hbWU6IG1hbmlmZXN0U2V0dGluZ3MuY3VzdG9tRnJhZ21lbnQgYXMgc3RyaW5nLFxuXHRcdFx0XHRcdGNvbnRleHRQYXRoOiB0aGlzLnRyYW5zaWVudExpc3RCaW5kaW5nXG5cdFx0XHRcdFx0XHQuZ2V0TW9kZWwoKVxuXHRcdFx0XHRcdFx0LmdldE1ldGFNb2RlbCgpXG5cdFx0XHRcdFx0XHQuZ2V0TWV0YVBhdGgodGhpcy50cmFuc2llbnRMaXN0QmluZGluZy5nZXRSZXNvbHZlZFBhdGgoKSlcblx0XHRcdFx0fSkpIGFzIEZvcm1Db250YWluZXI7XG5cdFx0fVxuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyB0aGUgZm9ybSBlbGVtZW50cyBvZiB0aGUgZGlhbG9nLlxuXHQgKiBAcmV0dXJucyBUaGUgZm9ybSBlbGVtZW50cy5cblx0ICovXG5cdHByaXZhdGUgY3JlYXRlRm9ybUVsZW1lbnRzKCk6IEZvcm1FbGVtZW50W10ge1xuXHRcdHJldHVybiB0aGlzLmZpZWxkUHJvcGVydGllcy5tYXAodGhpcy5jcmVhdGVGb3JtRWxlbWVudC5iaW5kKHRoaXMpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIHRoZSBmb3JtIGVsZW1lbnRzIG9mIGEgRmllbGQuXG5cdCAqIEBwYXJhbSBmaWVsZEluZm8gVGhlIGZpZWxkIHByb3BlcnRpZXNcblx0ICogQHJldHVybnMgVGhlIGZvcm0gZWxlbWVudC5cblx0ICovXG5cdHByaXZhdGUgY3JlYXRlRm9ybUVsZW1lbnQoZmllbGRJbmZvOiBNYXNzRmllbGRQcm9wZXJ0aWVzKTogRm9ybUVsZW1lbnQge1xuXHRcdHJldHVybiAoXG5cdFx0XHQ8Rm9ybUVsZW1lbnQgdmlzaWJsZT17ZmllbGRJbmZvLnZpc2libGV9PlxuXHRcdFx0XHR7e1xuXHRcdFx0XHRcdGxhYmVsOiA8TGFiZWwgdGV4dD17ZmllbGRJbmZvLmxhYmVsfSBpZD17SUQuZ2VuZXJhdGUoW1wiTUVEX1wiLCBmaWVsZEluZm8ucHJvcGVydHlJbmZvLmtleSwgXCJMYWJlbFwiXSl9IC8+LFxuXHRcdFx0XHRcdGZpZWxkczogdGhpcy5jcmVhdGVGaWVsZHMoZmllbGRJbmZvKVxuXHRcdFx0XHR9fVxuXHRcdFx0PC9Gb3JtRWxlbWVudD5cblx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgdGhlIGZpZWxkcyBvZiB0aGUgZGlhbG9nLlxuXHQgKiBAcGFyYW0gZmllbGRJbmZvIFRoZSBmaWVsZCBwcm9wZXJ0aWVzXG5cdCAqIEByZXR1cm5zIFRoZSBmaWVsZHMuXG5cdCAqL1xuXHRwcml2YXRlIGNyZWF0ZUZpZWxkcyhmaWVsZEluZm86IE1hc3NGaWVsZFByb3BlcnRpZXMpOiBDb250cm9sW10ge1xuXHRcdGNvbnN0IG1ldGFNb2RlbCA9ICh0aGlzLnRhYmxlLmdldE1vZGVsKCkgYXMgT0RhdGFNb2RlbCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0Y29uc3QgY29udGV4dCA9IG1ldGFNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChtZXRhTW9kZWwuZ2V0TWV0YVBhdGgodGhpcy5iaW5kaW5nQ29udGV4dC5nZXRQYXRoKCkpKSBhcyBDb250ZXh0O1xuXHRcdGNvbnN0IG1hc3NFZGl0RmllbGQgPSBuZXcgTWFzc0VkaXRGaWVsZChmaWVsZEluZm8sIGNvbnRleHQpO1xuXHRcdHRoaXMuZmllbGRDb250cm9scy5wdXNoKG1hc3NFZGl0RmllbGQpO1xuXHRcdHJldHVybiBtYXNzRWRpdEZpZWxkLmdldENvbnRyb2xzKCk7XG5cdH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O01BMkRxQkEsY0FBYztJQTJCbEM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7SUFDQyxTQUFBQSxlQUFZQyxLQUEyRixFQUFFO01BQUEsS0FqQ3hGQyxtQkFBbUIsR0FBRyxJQUFJQyxhQUFhLENBQU8sQ0FBQztNQUFBLEtBYy9DQyxpQkFBaUIsR0FBZ0IsSUFBSUMsR0FBRyxDQUFDLENBQUM7TUFvQjFELElBQUksQ0FBQ0MsTUFBTSxHQUFHQyxTQUFTO01BQ3ZCLElBQUksQ0FBQ0MsS0FBSyxHQUFHUCxLQUFLLENBQUNPLEtBQUs7TUFDeEIsSUFBSSxDQUFDQyxRQUFRLEdBQUdSLEtBQUssQ0FBQ1EsUUFBUTtNQUM5QixJQUFJ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
442
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJNYXNzRWRpdERpYWxvZyIsInByb3BzIiwicmVxdWlyZWREYXRhUHJvbWlzZSIsIlByb21pc2VLZWVwZXIiLCJjb250ZXh0c09uRXJyb3IiLCJTZXQiLCJ1cGRhdGVkUHJvcGVydGllcyIsInVwZGF0ZWRDb250ZXh0cyIsImRpYWxvZyIsInVuZGVmaW5lZCIsInRhYmxlIiwiY29udGV4dHMiLCJpc0FkYXB0YXRpb24iLCJDb21tb25VdGlscyIsImdldEFwcENvbXBvbmVudCIsImlzQWRhcHRhdGlvbk1vZGUiLCJmaWVsZFByb3BlcnRpZXMiLCJ2aWV3IiwiZ2V0VGFyZ2V0VmlldyIsInRyYW5zaWVudExpc3RCaW5kaW5nIiwiZ2VuZXJhdGVMaXN0QmluZGluZyIsImJpbmRpbmdDb250ZXh0IiwiY3JlYXRlIiwicmVzb3VyY2VNb2RlbCIsIlJlc291cmNlTW9kZWxIZWxwZXIiLCJnZXRSZXNvdXJjZU1vZGVsIiwiZmllbGRDb250cm9scyIsIl9leHBvcnRzIiwiX3Byb3RvIiwicHJvdG90eXBlIiwibGlzdEJpbmRpbmciLCJnZXRSb3dCaW5kaW5nIiwiZ2V0TW9kZWwiLCJiaW5kTGlzdCIsImdldFBhdGgiLCJnZXRDb250ZXh0IiwiJCR1cGRhdGVHcm91cElkIiwicmVmcmVzaEludGVybmFsIiwiY29yZVJlc291cmNlQnVuZGxlIiwiTGlicmFyeSIsImdldFJlc291cmNlQnVuZGxlRm9yIiwiYXBwbHlCdXR0b25UZXh0IiwiZ2V0Vmlld0RhdGEiLCJjb252ZXJ0ZXJUeXBlIiwiZ2V0VGV4dCIsImRpYWxvZ0NvbnRlbnQiLCJjcmVhdGVDb250ZW50IiwiX2pzeCIsIkRpYWxvZyIsImlkIiwiSUQiLCJnZW5lcmF0ZSIsImdldElkIiwiY29udGVudFdpZHRoIiwiY2xhc3MiLCJob3Jpem9udGFsU2Nyb2xsaW5nIiwidGl0bGUiLCJsZW5ndGgiLCJ0b1N0cmluZyIsImNvbnRlbnQiLCJlc2NhcGVIYW5kbGVyIiwib25DbG9zZSIsImJpbmQiLCJiZWZvcmVPcGVuIiwiYmVnaW5CdXR0b24iLCJCdXR0b24iLCJ0ZXh0IiwidHlwZSIsInByZXNzIiwib25BcHBseSIsImVuZEJ1dHRvbiIsInNldE1vZGVsIiwiSlNPTk1vZGVsIiwiaXNFZGl0YWJsZSIsImJpbmRFbGVtZW50IiwicGF0aCIsIm1vZGVsIiwiZXZlbnQiLCJnZXRTb3VyY2UiLCJzZXRCaW5kaW5nQ29udGV4dCIsImFkZERlcGVuZGVudCIsImRlc3Ryb3kiLCJpc09wZW4iLCJjbG9zZSIsImdldFJlcXVpcmVkRGF0YVByb21pc2UiLCJtYW5hZ2VNZXNzYWdlIiwiaXNFcnJvckFuZFN1Y2Nlc3MiLCJzaXplIiwiY29udHJvbGxlciIsImdldENvbnRyb2xsZXIiLCJEcmFmdFN0YXR1cyIsIkZFTGlicmFyeSIsImludGVybmFsTW9kZWxDb250ZXh0IiwiZ2V0QmluZGluZ0NvbnRleHQiLCJzZXRQcm9wZXJ0eSIsIm1lc3NhZ2VIYW5kbGVyIiwic2hvd01lc3NhZ2VzIiwib25CZWZvcmVTaG93TWVzc2FnZSIsIm1lc3NhZ2VzIiwic2hvd01lc3NhZ2VQYXJhbWV0ZXJzIiwiZm5HZXRNZXNzYWdlU3VidGl0bGUiLCJtZXNzYWdlSGFuZGxpbmciLCJzZXRNZXNzYWdlU3VidGl0bGUiLCJlZGl0RmxvdyIsInNldERyYWZ0U3RhdHVzIiwiU2F2ZWQiLCJNZXNzYWdlVG9hc3QiLCJzaG93IiwiQ2xlYXIiLCJnZXRJc0VkaXRhYmxlIiwic29tZSIsIm1lc3NhZ2UiLCJnZXRUYXJnZXRzIiwic2hvd01lc3NhZ2VCb3giLCJzaG93TWVzc2FnZURpYWxvZyIsImNvbmZpcm1CdXR0b25UeHQiLCJNZXNzYWdlQm94Iiwic3VjY2VzcyIsImFjdGlvbnMiLCJlbXBoYXNpemVkQWN0aW9uIiwic2F2ZUNoYW5nZXMiLCJmaWVsZFZhbHVlc0luZm8iLCJtYW5pZmVzdFNldHRpbmdzIiwiZ2V0UGFyZW50IiwiZ2V0VGFibGVEZWZpbml0aW9uIiwiY29udHJvbCIsIm1hc3NFZGl0IiwiaXNJc29sYXRlZCIsIm9wZXJhdGlvbkdyb3VwaW5nTW9kZSIsIk9wZXJhdGlvbkdyb3VwaW5nTW9kZSIsIklzb2xhdGVkIiwiaXNvbGF0ZWRHcm91cElkIiwibWFzc0VkaXRTaWRlRWZmZWN0cyIsIk1hc3NFZGl0U2lkZUVmZmVjdHMiLCJmaWVsZFByb21pc2VzIiwic2V0Q29udGludWVPbkVycm9yIiwiZm9yRWFjaCIsInNlbGVjdGVkQ29udGV4dCIsImltbWVkaWF0ZVNpZGVFZmZlY3RzIiwicmVmcmVzaERlc2NyaXB0aW9ucyIsInZhbHVlcyIsImZpZWxkQ29udHJvbFJlZmVyZW5jZSIsInZhbHVlSGFzQ2hhbmdlZCIsImlzUmVhZE9ubHlPbkNvbnRleHQiLCJncm91cElkIiwicHJvcGVydHlQYXRoIiwiZ2V0UHJvcGVydHkiLCJwdXNoIiwidXBkYXRlUHJvcGVydHkiLCJtYXAiLCJpbW1lZGlhdGVTaWRlRWZmZWN0IiwiZXhlY3V0ZUltbWVkaWF0ZVNpZGVFZmZlY3RzIiwicmVmcmVzaERlc2NyaXB0aW9uIiwic3VibWl0QmF0Y2giLCJQcm9taXNlIiwiYWxsU2V0dGxlZCIsImV4ZWN1dGVEZWZlcnJlZFNpZGVFZmZlY3RzIiwiQXJyYXkiLCJmcm9tIiwidmFsdWUiLCJjb250ZXh0UGF0aCIsImFkZCIsImVycm9yIiwiTG9nIiwiZ2V0RmllbGRWYWx1ZXNJbmZvcyIsInJlc3VsdCIsImZpZWxkQ29udHJvbCIsImZpZWxkVmFsdWVzIiwiZ2V0RmllbGRWYWx1ZXMiLCJhcHBseUNoYW5nZXMiLCJwcm9taXNlIiwiZmllbGRzVmFsdWVzSW5mbyIsImN1c3RvbVNhdmUiLCJjdXN0b21NYXNzRWRpdFNhdmUiLCJhQ29udGV4dHMiLCJvVXBkYXRlRGF0YSIsImlzRmllbGRWYWxpZCIsImdsb2JhbFVJTW9kZWwiLCJCdXN5TG9ja2VyIiwibG9jayIsInJlbW92ZUJvdW5kVHJhbnNpdGlvbk1lc3NhZ2VzIiwicmVtb3ZlVW5ib3VuZFRyYW5zaXRpb25NZXNzYWdlcyIsImlzQ3VzdG9tU2F2ZSIsInVubG9jayIsImN1c3RvbUZvcm1Db250YWluZXIiLCJjcmVhdGVDdXN0b21Db250YWluZXIiLCJfanN4cyIsIl9GcmFnbWVudCIsImNoaWxkcmVuIiwiZ2V0QWRhcHRhdGlvbk1lc3NhZ2UiLCJGb3JtIiwibGF5b3V0IiwiUmVzcG9uc2l2ZUdyaWRMYXlvdXQiLCJsYWJlbFNwYW5NIiwibGFiZWxTcGFuTCIsImxhYmVsU3BhblhMIiwiZm9ybUNvbnRhaW5lcnMiLCJGb3JtQ29udGFpbmVyIiwiZm9ybUVsZW1lbnRzIiwiY3JlYXRlRm9ybUVsZW1lbnRzIiwiTWVzc2FnZVN0cmlwIiwiY3VzdG9tRnJhZ21lbnQiLCJmcm9tSW5saW5lIiwicmVzdWx0WE1MIiwiWE1MUHJlcHJvY2Vzc29yIiwicHJvY2VzcyIsIkRPTVBhcnNlciIsInBhcnNlRnJvbVN0cmluZyIsImZpcnN0RWxlbWVudENoaWxkIiwibW9kZWxzIiwiZ2V0T3duZXJDb21wb25lbnQiLCJnZXRQcmVwcm9jZXNzb3JDb250ZXh0IiwiRnJhZ21lbnQiLCJsb2FkIiwiZGVmaW5pdGlvbiIsImNsb25lIiwiZ2V0RXh0ZW5zaW9uQVBJIiwibG9hZEZyYWdtZW50IiwibmFtZSIsImdldE1ldGFNb2RlbCIsImdldE1ldGFQYXRoIiwiZ2V0UmVzb2x2ZWRQYXRoIiwiY3JlYXRlRm9ybUVsZW1lbnQiLCJmaWVsZEluZm8iLCJGb3JtRWxlbWVudCIsInZpc2libGUiLCJsYWJlbCIsIkxhYmVsIiwicHJvcGVydHlJbmZvIiwia2V5IiwiZmllbGRzIiwiY3JlYXRlRmllbGRzIiwibWV0YU1vZGVsIiwiY29udGV4dCIsImNyZWF0ZUJpbmRpbmdDb250ZXh0IiwibWFzc0VkaXRGaWVsZCIsIk1hc3NFZGl0RmllbGQiLCJnZXRDb250cm9scyJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiTWFzc0VkaXREaWFsb2cudHN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgUHJpbWl0aXZlVHlwZSB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlc1wiO1xuaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgdHlwZSBSZXNvdXJjZUJ1bmRsZSBmcm9tIFwic2FwL2Jhc2UvaTE4bi9SZXNvdXJjZUJ1bmRsZVwiO1xuaW1wb3J0IHR5cGUgeyBFbmhhbmNlV2l0aFVJNSB9IGZyb20gXCJzYXAvZmUvYmFzZS9DbGFzc1N1cHBvcnRcIjtcbmltcG9ydCB0eXBlIHsgRkVWaWV3IH0gZnJvbSBcInNhcC9mZS9jb3JlL0Jhc2VDb250cm9sbGVyXCI7XG5pbXBvcnQgQ29tbW9uVXRpbHMgZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgdHlwZSBSZXNvdXJjZU1vZGVsIGZyb20gXCJzYXAvZmUvY29yZS9SZXNvdXJjZU1vZGVsXCI7XG5pbXBvcnQgdHlwZSBUZW1wbGF0ZUNvbXBvbmVudCBmcm9tIFwic2FwL2ZlL2NvcmUvVGVtcGxhdGVDb21wb25lbnRcIjtcbmltcG9ydCBCdXN5TG9ja2VyIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9CdXN5TG9ja2VyXCI7XG5pbXBvcnQgbWVzc2FnZUhhbmRsaW5nIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9tZXNzYWdlSGFuZGxlci9tZXNzYWdlSGFuZGxpbmdcIjtcbmltcG9ydCB7IE9wZXJhdGlvbkdyb3VwaW5nTW9kZSB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01hbmlmZXN0U2V0dGluZ3NcIjtcbmltcG9ydCBQcm9taXNlS2VlcGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1Byb21pc2VLZWVwZXJcIjtcbmltcG9ydCBSZXNvdXJjZU1vZGVsSGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1Jlc291cmNlTW9kZWxIZWxwZXJcIjtcbmltcG9ydCAqIGFzIElEIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1N0YWJsZUlkSGVscGVyXCI7XG5pbXBvcnQgRkVMaWJyYXJ5IGZyb20gXCJzYXAvZmUvY29yZS9saWJyYXJ5XCI7XG5pbXBvcnQgdHlwZSB7IFNpZGVFZmZlY3RzRW50aXR5VHlwZSwgU2lkZUVmZmVjdHNUYXJnZXQsIFNpZGVFZmZlY3RzVHlwZSB9IGZyb20gXCJzYXAvZmUvY29yZS9zZXJ2aWNlcy9TaWRlRWZmZWN0c1NlcnZpY2VGYWN0b3J5XCI7XG5pbXBvcnQgdHlwZSBUYWJsZUFQSSBmcm9tIFwic2FwL2ZlL21hY3Jvcy90YWJsZS9UYWJsZUFQSVwiO1xuaW1wb3J0IEJ1dHRvbiBmcm9tIFwic2FwL20vQnV0dG9uXCI7XG5pbXBvcnQgRGlhbG9nIGZyb20gXCJzYXAvbS9EaWFsb2dcIjtcbmltcG9ydCBMYWJlbCBmcm9tIFwic2FwL20vTGFiZWxcIjtcbmltcG9ydCBNZXNzYWdlQm94IGZyb20gXCJzYXAvbS9NZXNzYWdlQm94XCI7XG5pbXBvcnQgTWVzc2FnZVN0cmlwIGZyb20gXCJzYXAvbS9NZXNzYWdlU3RyaXBcIjtcbmltcG9ydCBNZXNzYWdlVG9hc3QgZnJvbSBcInNhcC9tL01lc3NhZ2VUb2FzdFwiO1xuaW1wb3J0IHR5cGUgVUk1RXZlbnQgZnJvbSBcInNhcC91aS9iYXNlL0V2ZW50XCI7XG5pbXBvcnQgdHlwZSBDb250cm9sIGZyb20gXCJzYXAvdWkvY29yZS9Db250cm9sXCI7XG5pbXBvcnQgRnJhZ21lbnQgZnJvbSBcInNhcC91aS9jb3JlL0ZyYWdtZW50XCI7XG5pbXBvcnQgTGlicmFyeSBmcm9tIFwic2FwL3VpL2NvcmUvTGliXCI7XG5pbXBvcnQgdHlwZSBNZXNzYWdlIGZyb20gXCJzYXAvdWkvY29yZS9tZXNzYWdlL01lc3NhZ2VcIjtcbmltcG9ydCBYTUxQcmVwcm9jZXNzb3IgZnJvbSBcInNhcC91aS9jb3JlL3V0aWwvWE1MUHJlcHJvY2Vzc29yXCI7XG5pbXBvcnQgRm9ybSBmcm9tIFwic2FwL3VpL2xheW91dC9mb3JtL0Zvcm1cIjtcbmltcG9ydCBGb3JtQ29udGFpbmVyIGZyb20gXCJzYXAvdWkvbGF5b3V0L2Zvcm0vRm9ybUNvbnRhaW5lclwiO1xuaW1wb3J0IEZvcm1FbGVtZW50IGZyb20gXCJzYXAvdWkvbGF5b3V0L2Zvcm0vRm9ybUVsZW1lbnRcIjtcbmltcG9ydCBSZXNwb25zaXZlR3JpZExheW91dCBmcm9tIFwic2FwL3VpL2xheW91dC9mb3JtL1Jlc3BvbnNpdmVHcmlkTGF5b3V0XCI7XG5pbXBvcnQgdHlwZSBUYWJsZSBmcm9tIFwic2FwL3VpL21kYy9UYWJsZVwiO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL0NvbnRleHRcIjtcbmltcG9ydCBKU09OTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9qc29uL0pTT05Nb2RlbFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFWNENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgdHlwZSBPRGF0YUxpc3RCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFMaXN0QmluZGluZ1wiO1xuaW1wb3J0IHR5cGUgT0RhdGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTW9kZWxcIjtcbmltcG9ydCBNYXNzRWRpdEZpZWxkIGZyb20gXCIuL01hc3NFZGl0RmllbGRcIjtcbmltcG9ydCBNYXNzRWRpdFNpZGVFZmZlY3RzIGZyb20gXCIuL01hc3NFZGl0U2lkZUVmZmVjdHNcIjtcbmltcG9ydCB0eXBlIHsgTWFzc0ZpZWxkUHJvcGVydGllcyB9IGZyb20gXCIuL2xpYnJhcnlcIjtcblxudHlwZSBNYXNzRWRpdFNpZGVFZmZlY3RzUHJvcGVydGllcyA9IHtcblx0c2lkZUVmZmVjdHM6IFNpZGVFZmZlY3RzVHlwZTtcblx0dGFibGVSZWZyZXNoOiB7XG5cdFx0aXNSZXF1ZXN0ZWQ6IGJvb2xlYW47XG5cdFx0dGFyZ2V0RW50aXR5PzogU2lkZUVmZmVjdHNFbnRpdHlUeXBlO1xuXHR9O1xuXHRpbW1lZGlhdGU6IHsgdGFyZ2V0czogU2lkZUVmZmVjdHNUYXJnZXRbXTsgdHJpZ2dlckFjdGlvbjogc3RyaW5nIHwgdW5kZWZpbmVkIH07XG5cdGRlZmVycmVkOiB7IHRhcmdldHM6IFNpZGVFZmZlY3RzVGFyZ2V0W107IHRyaWdnZXJBY3Rpb246IHN0cmluZyB8IHVuZGVmaW5lZCB9O1xufTtcblxudHlwZSBGaWVsZFZhbHVlc0luZm8gPSB7XG5cdHZhbHVlczogUmVjb3JkPHN0cmluZywgUHJpbWl0aXZlVHlwZT47XG5cdGZpZWxkQ29udHJvbFJlZmVyZW5jZTogeyBjb250cm9sOiBNYXNzRWRpdEZpZWxkOyB2YWx1ZXM6IFJlY29yZDxzdHJpbmcsIFByaW1pdGl2ZVR5cGU+IH1bXTtcbn07XG5cbmV4cG9ydCB0eXBlIE1hc3NFZGl0U2lkZUVmZmVjdHNFeGVjdXRpb25Qcm9wZXJ0aWVzID0gTWFzc0VkaXRTaWRlRWZmZWN0c1Byb3BlcnRpZXMgJiB7IG9uUm93Q29udGV4dDogYm9vbGVhbiB9O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBNYXNzRWRpdERpYWxvZyB7XG5cdHByaXZhdGUgcmVhZG9ubHkgcmVxdWlyZWREYXRhUHJvbWlzZSA9IG5ldyBQcm9taXNlS2VlcGVyPHZvaWQ+KCk7XG5cblx0cHJpdmF0ZSBkaWFsb2c6IERpYWxvZyB8IHVuZGVmaW5lZDtcblxuXHRwdWJsaWMgcmVhZG9ubHkgdGFibGU6IFRhYmxlO1xuXG5cdHB1YmxpYyByZWFkb25seSBmaWVsZFByb3BlcnRpZXM6IE1hc3NGaWVsZFByb3BlcnRpZXNbXTtcblxuXHRwcml2YXRlIHJlYWRvbmx5IHZpZXc6IEZFVmlldztcblxuXHRwdWJsaWMgcmVhZG9ubHkgY29udGV4dHM6IE9EYXRhVjRDb250ZXh0W107XG5cblx0cHJpdmF0ZSByZWFkb25seSBjb250ZXh0c09uRXJyb3I6IFNldDxzdHJpbmc+ID0gbmV3IFNldCgpO1xuXG5cdHByaXZhdGUgcmVhZG9ubHkgdXBkYXRlZFByb3BlcnRpZXM6IFNldDxzdHJpbmc+ID0gbmV3IFNldCgpO1xuXG5cdHByaXZhdGUgcmVhZG9ubHkgdXBkYXRlZENvbnRleHRzOiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoKTtcblxuXHRwcml2YXRlIHJlYWRvbmx5IHJlc291cmNlTW9kZWw6IFJlc291cmNlTW9kZWw7XG5cblx0cHVibGljIHJlYWRvbmx5IGJpbmRpbmdDb250ZXh0OiBPRGF0YVY0Q29udGV4dDtcblxuXHRwdWJsaWMgcmVhZG9ubHkgdHJhbnNpZW50TGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmc7XG5cblx0cHJpdmF0ZSByZWFkb25seSBmaWVsZENvbnRyb2xzOiBNYXNzRWRpdEZpZWxkW107XG5cblx0cHJpdmF0ZSByZWFkb25seSBpc0FkYXB0YXRpb246IGJvb2xlYW47XG5cblx0LyoqXG5cdCAqIENvbnN0cnVjdG9yIG9mIHRoZSBNYXNzRWRpdCBkaWFsb2cuXG5cdCAqIEBwYXJhbSBwcm9wcyBDb250YWlucyB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXNcblx0ICogQHBhcmFtIHByb3BzLnRhYmxlIFRoZSB0YWJsZSB3aGVyZSB0aGUgY2hhbmdlcyBuZWVkIHRvIGJlIGFwcGxpZWRcblx0ICogQHBhcmFtIHByb3BzLmNvbnRleHRzIFRoZSByb3cgY29udGV4dHMgd2hlcmUgdGhlIGNoYW5nZXMgbmVlZCB0byBiZSBhcHBsaWVkXG5cdCAqIEBwYXJhbSBwcm9wcy5maWVsZFByb3BlcnRpZXMgVGhlIHByb3BlcnRpZXMgb3QgdGhlIGZpZWxkc1xuXHQgKi9cblx0Y29uc3RydWN0b3IocHJvcHM6IHsgdGFibGU6IFRhYmxlOyBjb250ZXh0czogT0RhdGFWNENvbnRleHRbXTsgZmllbGRQcm9wZXJ0aWVzOiBNYXNzRmllbGRQcm9wZXJ0aWVzW10gfSkge1xuXHRcdHRoaXMuZGlhbG9nID0gdW5kZWZpbmVkO1xuXHRcdHRoaXMudGFibGUgPSBwcm9wcy50YWJsZTtcblx0XHR0aGlzLmNvbnRleHRzID0gcHJvcHMuY29udGV4dHM7XG5cdFx0dGhpcy5pc0FkYXB0YXRpb24gPSBDb21tb25VdGlscy5nZXRBcHBDb21wb25lbnQodGhpcy50YWJsZSkuaXNBZGFwdGF0aW9uTW9kZSgpO1xuXHRcdHRoaXMuZmllbGRQcm9wZXJ0aWVzID0gcHJvcHMuZmllbGRQcm9wZXJ0aWVzO1xuXHRcdHRoaXMudmlldyA9IENvbW1vblV0aWxzLmdldFRhcmdldFZpZXcodGhpcy50YWJsZSk7XG5cdFx0dGhpcy50cmFuc2llbnRMaXN0QmluZGluZyA9IHRoaXMuZ2VuZXJhdGVMaXN0QmluZGluZygpO1xuXHRcdHRoaXMuYmluZGluZ0NvbnRleHQgPSB0aGlzLnRyYW5zaWVudExpc3RCaW5kaW5nLmNyZWF0ZSh7fSwgdHJ1ZSk7XG5cblx0XHR0aGlzLnJlc291cmNlTW9kZWwgPSBSZXNvdXJjZU1vZGVsSGVscGVyLmdldFJlc291cmNlTW9kZWwodGhpcy50YWJsZSk7XG5cdFx0dGhpcy5maWVsZENvbnRyb2xzID0gW107XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyB0aGUgY29udGV4dCBmb3IgdGhlIGRpYWxvZy5cblx0ICogQHJldHVybnMgVGhlIGNvbnRleHQuXG5cdCAqL1xuXHRwcml2YXRlIGdlbmVyYXRlTGlzdEJpbmRpbmcoKTogT0RhdGFMaXN0QmluZGluZyB7XG5cdFx0Y29uc3QgbGlzdEJpbmRpbmcgPSB0aGlzLnRhYmxlLmdldFJvd0JpbmRpbmcoKTtcblx0XHRjb25zdCB0cmFuc2llbnRMaXN0QmluZGluZyA9ICh0aGlzLnRhYmxlLmdldE1vZGVsKCkgYXMgT0RhdGFNb2RlbCkuYmluZExpc3QoXG5cdFx0XHRsaXN0QmluZGluZy5nZXRQYXRoKCksXG5cdFx0XHRsaXN0QmluZGluZy5nZXRDb250ZXh0KCksXG5cdFx0XHRbXSxcblx0XHRcdFtdLFxuXHRcdFx0e1xuXHRcdFx0XHQkJHVwZGF0ZUdyb3VwSWQ6IFwic3VibWl0TGF0ZXJcIlxuXHRcdFx0fVxuXHRcdCk7XG5cdFx0dHJhbnNpZW50TGlzdEJpbmRpbmcucmVmcmVzaEludGVybmFsID0gKCk6IHZvaWQgPT4ge1xuXHRcdFx0LyogKi9cblx0XHR9O1xuXHRcdHJldHVybiB0cmFuc2llbnRMaXN0QmluZGluZztcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIHRoZSBkaWFsb2cuXG5cdCAqIEByZXR1cm5zIFRoZSBpbnN0YW5jZSBvZiBkaWFsb2cuXG5cdCAqL1xuXHRhc3luYyBjcmVhdGUoKTogUHJvbWlzZTxEaWFsb2c+IHtcblx0XHRpZiAoIXRoaXMuZGlhbG9nKSB7XG5cdFx0XHRjb25zdCBjb3JlUmVzb3VyY2VCdW5kbGUgPSBMaWJyYXJ5LmdldFJlc291cmNlQnVuZGxlRm9yKFwic2FwLmZlLmNvcmVcIikgYXMgUmVzb3VyY2VCdW5kbGU7XG5cdFx0XHRjb25zdCBhcHBseUJ1dHRvblRleHQgPVxuXHRcdFx0XHR0aGlzLnZpZXcuZ2V0Vmlld0RhdGEoKS5jb252ZXJ0ZXJUeXBlID09PSBcIkxpc3RSZXBvcnRcIlxuXHRcdFx0XHRcdD8gdGhpcy5yZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX01BU1NfRURJVF9TQVZFX0JVVFRPTl9URVhUXCIpXG5cdFx0XHRcdFx0OiBjb3JlUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfQ09NTU9OX0RJQUxPR19PS1wiKTtcblx0XHRcdGNvbnN0IGRpYWxvZ0NvbnRlbnQgPSBhd2FpdCB0aGlzLmNyZWF0ZUNvbnRlbnQoKTtcblx0XHRcdGNvbnN0IGRpYWxvZyA9IChcblx0XHRcdFx0PERpYWxvZ1xuXHRcdFx0XHRcdGR0OmRlc2lnbnRpbWU9XCJzYXAvZmUvbWFjcm9zL3RhYmxlL21hc3NFZGl0L2Rlc2lnbnRpbWUvTWFzc0VkaXQuZGVzaWdudGltZVwiXG5cdFx0XHRcdFx0aWQ9e0lELmdlbmVyYXRlKFt0aGlzLnRhYmxlLmdldElkKCksIFwiTUVEX1wiLCBcIkRpYWxvZ1wiXSl9XG5cdFx0XHRcdFx0Y29udGVudFdpZHRoPVwiMjdyZW1cIlxuXHRcdFx0XHRcdGNsYXNzPVwic2FwVWlDb250ZW50UGFkZGluZ1wiXG5cdFx0XHRcdFx0aG9yaXpvbnRhbFNjcm9sbGluZz1cImZhbHNlXCJcblx0XHRcdFx0XHR0aXRsZT17dGhpcy5yZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX01BU1NfRURJVF9ESUFMT0dfVElUTEVcIiwgW3RoaXMuY29udGV4dHMubGVuZ3RoLnRvU3RyaW5nKCldKX1cblx0XHRcdFx0XHRjb250ZW50PXtkaWFsb2dDb250ZW50fVxuXHRcdFx0XHRcdGVzY2FwZUhhbmRsZXI9e3RoaXMub25DbG9zZS5iaW5kKHRoaXMpfVxuXHRcdFx0XHRcdGJlZm9yZU9wZW49e3RoaXMuYmVmb3JlT3Blbi5iaW5kKHRoaXMpfVxuXHRcdFx0XHRcdGJlZ2luQnV0dG9uPXs8QnV0dG9uIHRleHQ9e2FwcGx5QnV0dG9uVGV4dH0gdHlwZT1cIkVtcGhhc2l6ZWRcIiBwcmVzcz17dGhpcy5vbkFwcGx5LmJpbmQodGhpcyl9IC8+fVxuXHRcdFx0XHRcdGVuZEJ1dHRvbj17PEJ1dHRvbiB0ZXh0PXtjb3JlUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfQ09NTU9OX09CSkVDVF9QQUdFX0NBTkNFTFwiKX0gcHJlc3M9e3RoaXMub25DbG9zZS5iaW5kKHRoaXMpfSAvPn1cblx0XHRcdFx0Lz5cblx0XHRcdCk7XG5cdFx0XHR0aGlzLmRpYWxvZyA9IGRpYWxvZztcblx0XHRcdC8vIFdlIGRvbid0IHdhbnQgdG8gaW5oZXJpdCBmcm9tIHRoZSBQYWdlQ29tcG9uZW50IGZvciB0aGUgdWkgbW9kZWwgLT4gaW50byB0aGlzIGRpYWxvZywgZmllbGRzIGFyZSBlZGl0YWJsZVxuXHRcdFx0ZGlhbG9nLnNldE1vZGVsKG5ldyBKU09OTW9kZWwoeyBpc0VkaXRhYmxlOiB0cnVlIH0pLCBcInVpXCIpO1xuXHRcdFx0ZGlhbG9nLmJpbmRFbGVtZW50KHtcblx0XHRcdFx0cGF0aDogXCIvXCIsXG5cdFx0XHRcdG1vZGVsOiBcInVpXCJcblx0XHRcdH0pO1xuXHRcdFx0cmV0dXJuIGRpYWxvZztcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMuZGlhbG9nO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgdGhlIGxhc3QgY29uZmlndXJhdGlvbiBiZWZvcmUgb3BlbmluZyB0aGUgZGlhbG9nOlxuXHQgKiAgLSBzZXQgdGhlIHJ1bnRpbWUgbW9kZWxcblx0ICogIC0gc2V0IHRoZSBPZGF0YU1vZGVsXG5cdCAqICAtIGFkZCB0aGUgZGlhbG9nIGFzIGRlcGVuZGVudCBvZiB0aGUgdGFibGUuXG5cdCAqIEBwYXJhbSBldmVudCBUaGUgdWk1IGV2ZW50XG5cdCAqL1xuXHRwcml2YXRlIGJlZm9yZU9wZW4oZXZlbnQ6IFVJNUV2ZW50PHt9LCBEaWFsb2c+KTogdm9pZCB7XG5cdFx0Y29uc3QgZGlhbG9nID0gZXZlbnQuZ2V0U291cmNlKCk7XG5cdFx0ZGlhbG9nLnNldE1vZGVsKHRoaXMudGFibGUuZ2V0TW9kZWwoKSk7XG5cdFx0ZGlhbG9nLnNldEJpbmRpbmdDb250ZXh0KHRoaXMuYmluZGluZ0NvbnRleHQpO1xuXHRcdHRoaXMudGFibGUuYWRkRGVwZW5kZW50KGRpYWxvZyk7XG5cdH1cblxuXHQvKipcblx0ICogQ2xvc2VzIGFuZCBkZXN0cm95cyB0aGUgZGlhbG9nLlxuXHQgKi9cblx0cHJpdmF0ZSBvbkNsb3NlKCk6IHZvaWQge1xuXHRcdHRoaXMudHJhbnNpZW50TGlzdEJpbmRpbmcuZGVzdHJveSgpO1xuXHRcdGlmICh0aGlzLmRpYWxvZykge1xuXHRcdFx0aWYgKHRoaXMuZGlhbG9nLmlzT3BlbigpKSB7XG5cdFx0XHRcdHRoaXMuZGlhbG9nLmNsb3NlKCk7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLmRpYWxvZy5kZXN0cm95KCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIHByb21pc2Ugb2YgdGhlIHJlcXVpcmVkIGRhdGEuXG5cdCAqIFRoaXMgcHJvbWlzZSBpcyByZXNvbHZlZCB3aGVuIHRoZSByZXF1aXJlZCBkYXRhIGlzIGxvYWRlZC5cblx0ICogVGhpcyBkYXRhIGFyZSB1c2VkIG9uIHRoZSBzYXZlIHdvcmtmbG93IHRvIGRldGVybWluZSBpZiB0aGUgbmV3IGRhdGEgaGFzIHRvIGJlIHNhdmVkIG9yIG5vdC5cblx0ICogVGhlIHNhdmUgd29ya2Zsb3cgaXMgZXhlY3V0ZWQgb25seSBpZiB0aGlzIHByb21pc2UgaXMgcmVzb2x2ZWQuXG5cdCAqIEByZXR1cm5zIFRoZSBwcm9taXNlIG9mIHRoZSByZXF1aXJlZCBkYXRhLlxuXHQgKi9cblx0Z2V0UmVxdWlyZWREYXRhUHJvbWlzZSgpOiBQcm9taXNlS2VlcGVyPHZvaWQ+IHtcblx0XHRyZXR1cm4gdGhpcy5yZXF1aXJlZERhdGFQcm9taXNlO1xuXHR9XG5cblx0LyoqXG5cdCAqIE1hbmFnZXMgdGhlIG1lc3NhZ2VzIGFjY29yZGluZyB0byB0aGUgY29udGV4dHMgb24gZXJyb3IuXG5cdCAqL1xuXHRhc3luYyBtYW5hZ2VNZXNzYWdlKCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IGlzRXJyb3JBbmRTdWNjZXNzID0gdGhpcy5jb250ZXh0c09uRXJyb3Iuc2l6ZSA+IDAgJiYgdGhpcy51cGRhdGVkQ29udGV4dHMuc2l6ZSA+IDA7XG5cdFx0Y29uc3QgY29yZVJlc291cmNlQnVuZGxlID0gTGlicmFyeS5nZXRSZXNvdXJjZUJ1bmRsZUZvcihcInNhcC5mZS5jb3JlXCIpIGFzIFJlc291cmNlQnVuZGxlO1xuXHRcdGNvbnN0IGNvbnRyb2xsZXIgPSB0aGlzLnZpZXcuZ2V0Q29udHJvbGxlcigpO1xuXHRcdGNvbnN0IERyYWZ0U3RhdHVzID0gRkVMaWJyYXJ5LkRyYWZ0U3RhdHVzO1xuXHRcdGNvbnN0IGludGVybmFsTW9kZWxDb250ZXh0ID0gdGhpcy52aWV3LmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIik7XG5cdFx0aW50ZXJuYWxNb2RlbENvbnRleHQ/LnNldFByb3BlcnR5KFwiZ2V0Qm91bmRNZXNzYWdlc0Zvck1hc3NFZGl0XCIsIHRydWUpO1xuXHRcdGF3YWl0IGNvbnRyb2xsZXIubWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VzKHtcblx0XHRcdG9uQmVmb3JlU2hvd01lc3NhZ2U6IChcblx0XHRcdFx0bWVzc2FnZXM6IE1lc3NhZ2VbXSxcblx0XHRcdFx0c2hvd01lc3NhZ2VQYXJhbWV0ZXJzOiB7XG5cdFx0XHRcdFx0Zm5HZXRNZXNzYWdlU3VidGl0bGU/OiBGdW5jdGlvbjtcblx0XHRcdFx0XHRzaG93TWVzc2FnZUJveD86IGJvb2xlYW47XG5cdFx0XHRcdFx0c2hvd01lc3NhZ2VEaWFsb2c/OiBib29sZWFuO1xuXHRcdFx0XHRcdGZpbHRlcmVkTWVzc2FnZXM/OiBNZXNzYWdlW107XG5cdFx0XHRcdFx0c2hvd0NoYW5nZVNldEVycm9yRGlhbG9nPzogYm9vbGVhbjtcblx0XHRcdFx0fVxuXHRcdFx0KSA9PiB7XG5cdFx0XHRcdHNob3dNZXNzYWdlUGFyYW1ldGVycy5mbkdldE1lc3NhZ2VTdWJ0aXRsZSA9IG1lc3NhZ2VIYW5kbGluZy5zZXRNZXNzYWdlU3VidGl0bGUuYmluZCh7fSwgdGhpcy50YWJsZSwgdGhpcy5jb250ZXh0cyk7XG5cblx0XHRcdFx0aWYgKCF0aGlzLmNvbnRleHRzT25FcnJvci5zaXplKSB7XG5cdFx0XHRcdFx0Ly8gb25seSBzdWNjZXNzZXNcblx0XHRcdFx0XHRpZiAodGhpcy51cGRhdGVkQ29udGV4dHMuc2l6ZSkge1xuXHRcdFx0XHRcdFx0Ly9UaGVyZSBpcyBhdCBsZWFzdCBvbmUgbmV3IHZhbHVlIHNldFxuXHRcdFx0XHRcdFx0Y29udHJvbGxlci5lZGl0Rmxvdy5zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5TYXZlZCk7XG5cdFx0XHRcdFx0XHRpZiAodGhpcy52aWV3LmdldFZpZXdEYXRhKCkuY29udmVydGVyVHlwZSA9PT0gXCJMaXN0UmVwb3J0XCIpIHtcblx0XHRcdFx0XHRcdFx0TWVzc2FnZVRvYXN0LnNob3codGhpcy5yZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX01BU1NfRURJVF9TVUNDRVNTX1RPQVNUXCIpKTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdE1lc3NhZ2VUb2FzdC5zaG93KHRoaXMucmVzb3VyY2VNb2RlbC5nZXRUZXh0KFwiQ19PQkpFQ1RfUEFHRV9NQVNTX0VESVRfU1VDQ0VTU19UT0FTVFwiKSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdE1lc3NhZ2VUb2FzdC5zaG93KHRoaXMucmVzb3VyY2VNb2RlbC5nZXRUZXh0KFwiQ19NQVNTX0VESVRfTk9fQ0hBTkdFXCIpKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSBpZiAoaXNFcnJvckFuZFN1Y2Nlc3MpIHtcblx0XHRcdFx0XHQvLyBlcnJvcnMgYW5kIHN1Y2Nlc3Nlc1xuXHRcdFx0XHRcdGNvbnRyb2xsZXIuZWRpdEZsb3cuc2V0RHJhZnRTdGF0dXMoRHJhZnRTdGF0dXMuU2F2ZWQpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGNvbnRyb2xsZXIuZWRpdEZsb3cuc2V0RHJhZnRTdGF0dXMoRHJhZnRTdGF0dXMuQ2xlYXIpOyAvL29ubHkgZXJyb3JzXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoQ29tbW9uVXRpbHMuZ2V0SXNFZGl0YWJsZShjb250cm9sbGVyKSAmJiAhbWVzc2FnZXMuc29tZSgobWVzc2FnZSkgPT4gIW1lc3NhZ2UuZ2V0VGFyZ2V0cygpKSkge1xuXHRcdFx0XHRcdHNob3dNZXNzYWdlUGFyYW1ldGVycy5zaG93TWVzc2FnZUJveCA9IGZhbHNlO1xuXHRcdFx0XHRcdHNob3dNZXNzYWdlUGFyYW1ldGVycy5zaG93TWVzc2FnZURpYWxvZyA9IGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBzaG93TWVzc2FnZVBhcmFtZXRlcnM7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHRpZiAoaXNFcnJvckFuZFN1Y2Nlc3MpIHtcblx0XHRcdGNvbnN0IGNvbmZpcm1CdXR0b25UeHQgPSBjb3JlUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfQ09NTU9OX0RJQUxPR19PS1wiKTtcblx0XHRcdE1lc3NhZ2VCb3guc3VjY2Vzcyhcblx0XHRcdFx0dGhpcy5yZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX01BU1NfRURJVF9DSEFOR0VTX1dJVEhfRVJST1JcIiwgW3RoaXMudXBkYXRlZENvbnRleHRzLnNpemUsIHRoaXMuY29udGV4dHMubGVuZ3RoXSksXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRhY3Rpb25zOiBbY29uZmlybUJ1dHRvblR4dF0sXG5cdFx0XHRcdFx0ZW1waGFzaXplZEFjdGlvbjogY29uZmlybUJ1dHRvblR4dFxuXHRcdFx0XHR9XG5cdFx0XHQpO1xuXHRcdH1cblx0XHRpbnRlcm5hbE1vZGVsQ29udGV4dD8uc2V0UHJvcGVydHkoXCJnZXRCb3VuZE1lc3NhZ2VzRm9yTWFzc0VkaXRcIiwgZmFsc2UpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNhdmVzIHRoZSByZWxldmFudCBjb250ZXh0cyBhbmQgcmVmcmVzaGVzIHRoZSBhc3NvY2lhdGVkIHByb3BlcnRpZXMuXG5cdCAqIEBwYXJhbSBmaWVsZFZhbHVlc0luZm8gVGhlIGluZm9ybWF0aW9uIG9mIHRoZSB2YWx1ZXMgZm9yIGFsbCBtYXNzIGVkaXQgZmllbGRzLlxuXHQgKiBAcmV0dXJucyBBIFByb21pc2UuXG5cdCAqL1xuXHRwcml2YXRlIGFzeW5jIHNhdmVDaGFuZ2VzKGZpZWxkVmFsdWVzSW5mbzogRmllbGRWYWx1ZXNJbmZvKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgbWFuaWZlc3RTZXR0aW5ncyA9ICh0aGlzLnRhYmxlLmdldFBhcmVudCgpIGFzIFRhYmxlQVBJKS5nZXRUYWJsZURlZmluaXRpb24oKS5jb250cm9sLm1hc3NFZGl0O1xuXHRcdGNvbnN0IGlzSXNvbGF0ZWQgPSBtYW5pZmVzdFNldHRpbmdzLm9wZXJhdGlvbkdyb3VwaW5nTW9kZSA9PT0gT3BlcmF0aW9uR3JvdXBpbmdNb2RlLklzb2xhdGVkO1xuXHRcdGNvbnN0IGlzb2xhdGVkR3JvdXBJZCA9IFwiJGF1dG8uSXNvbGF0ZWRcIjtcblx0XHRjb25zdCBtYXNzRWRpdFNpZGVFZmZlY3RzID0gbmV3IE1hc3NFZGl0U2lkZUVmZmVjdHModGhpcyk7IC8vIFVzZSB0aGUgZmlyc3QgbGluZSBhcyByZWZlcmVuY2UgY29udGV4dCB0byBjYWxjdWxhdGUgdGhlIG1hcCBvZiBzaWRlIGVmZmVjdHNcblx0XHRjb25zdCBmaWVsZFByb21pc2VzOiBQcm9taXNlPHVua25vd24+W10gPSBbXTtcblx0XHRjb25zdCBtb2RlbCA9IHRoaXMudGFibGUuZ2V0TW9kZWwoKSBhcyBPRGF0YU1vZGVsO1xuXG5cdFx0aWYgKGlzSXNvbGF0ZWQpIHtcblx0XHRcdG1vZGVsLnNldENvbnRpbnVlT25FcnJvcihpc29sYXRlZEdyb3VwSWQpO1xuXHRcdH1cblx0XHR0aGlzLmNvbnRleHRzLmZvckVhY2goKHNlbGVjdGVkQ29udGV4dDogT0RhdGFWNENvbnRleHQpID0+IHtcblx0XHRcdGNvbnN0IGltbWVkaWF0ZVNpZGVFZmZlY3RzOiB7IHByb3BlcnR5UGF0aDogc3RyaW5nOyBncm91cElkOiBzdHJpbmcgfVtdID0gW107XG5cdFx0XHRjb25zdCByZWZyZXNoRGVzY3JpcHRpb25zOiB7IGNvbnRyb2w6IE1hc3NFZGl0RmllbGQ7IGdyb3VwSWQ6IHN0cmluZyB9W10gPSBbXTtcblx0XHRcdGZvciAoY29uc3QgeyBjb250cm9sLCB2YWx1ZXMgfSBvZiBmaWVsZFZhbHVlc0luZm8uZmllbGRDb250cm9sUmVmZXJlbmNlKSB7XG5cdFx0XHRcdGxldCB2YWx1ZUhhc0NoYW5nZWQgPSBmYWxzZTtcblx0XHRcdFx0aWYgKCFjb250cm9sLmlzUmVhZE9ubHlPbkNvbnRleHQoc2VsZWN0ZWRDb250ZXh0KSkge1xuXHRcdFx0XHRcdGNvbnN0IGdyb3VwSWQgPSBpc0lzb2xhdGVkID8gaXNvbGF0ZWRHcm91cElkIDogXCIkYXV0b1wiO1xuXHRcdFx0XHRcdGZvciAoY29uc3QgcHJvcGVydHlQYXRoIGluIHZhbHVlcykge1xuXHRcdFx0XHRcdFx0aWYgKHNlbGVjdGVkQ29udGV4dC5nZXRQcm9wZXJ0eShwcm9wZXJ0eVBhdGgpICE9PSB2YWx1ZXNbcHJvcGVydHlQYXRoXSkge1xuXHRcdFx0XHRcdFx0XHR2YWx1ZUhhc0NoYW5nZWQgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHRmaWVsZFByb21pc2VzLnB1c2godGhpcy51cGRhdGVQcm9wZXJ0eShzZWxlY3RlZENvbnRleHQsIHByb3BlcnR5UGF0aCwgdmFsdWVzW3Byb3BlcnR5UGF0aF0sIGdyb3VwSWQpKTtcblx0XHRcdFx0XHRcdFx0aW1tZWRpYXRlU2lkZUVmZmVjdHMucHVzaCh7XG5cdFx0XHRcdFx0XHRcdFx0cHJvcGVydHlQYXRoLFxuXHRcdFx0XHRcdFx0XHRcdGdyb3VwSWRcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmICh2YWx1ZUhhc0NoYW5nZWQpIHtcblx0XHRcdFx0XHRcdHJlZnJlc2hEZXNjcmlwdGlvbnMucHVzaCh7IGNvbnRyb2wsIGdyb3VwSWQgfSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRmaWVsZFByb21pc2VzLnB1c2goXG5cdFx0XHRcdC4uLmltbWVkaWF0ZVNpZGVFZmZlY3RzLm1hcChhc3luYyAoaW1tZWRpYXRlU2lkZUVmZmVjdCkgPT5cblx0XHRcdFx0XHRtYXNzRWRpdFNpZGVFZmZlY3RzLmV4ZWN1dGVJbW1lZGlhdGVTaWRlRWZmZWN0cyhcblx0XHRcdFx0XHRcdHNlbGVjdGVkQ29udGV4dCxcblx0XHRcdFx0XHRcdGltbWVkaWF0ZVNpZGVFZmZlY3QucHJvcGVydHlQYXRoLFxuXHRcdFx0XHRcdFx0aW1tZWRpYXRlU2lkZUVmZmVjdC5ncm91cElkXG5cdFx0XHRcdFx0KVxuXHRcdFx0XHQpXG5cdFx0XHQpO1xuXHRcdFx0ZmllbGRQcm9taXNlcy5wdXNoKFxuXHRcdFx0XHQuLi5yZWZyZXNoRGVzY3JpcHRpb25zLm1hcChhc3luYyAocmVmcmVzaERlc2NyaXB0aW9uKSA9PlxuXHRcdFx0XHRcdG1hc3NFZGl0U2lkZUVmZmVjdHMucmVmcmVzaERlc2NyaXB0aW9uKHJlZnJlc2hEZXNjcmlwdGlvbi5jb250cm9sLCBzZWxlY3RlZENvbnRleHQsIHJlZnJlc2hEZXNjcmlwdGlvbi5ncm91cElkKVxuXHRcdFx0XHQpXG5cdFx0XHQpO1xuXHRcdFx0aWYgKGlzSXNvbGF0ZWQpIHtcblx0XHRcdFx0Ly9DcmVhdGUgYSBuZXcgQ2hhbmdlU2V0IGZvciB0aGUgbmV4dCByZXF1ZXN0c1xuXHRcdFx0XHRtb2RlbC5zdWJtaXRCYXRjaChpc29sYXRlZEdyb3VwSWQpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0YXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKGZpZWxkUHJvbWlzZXMpO1xuXHRcdGlmICh0aGlzLnVwZGF0ZWRQcm9wZXJ0aWVzLnNpemUpIHtcblx0XHRcdG1hc3NFZGl0U2lkZUVmZmVjdHMuZXhlY3V0ZURlZmVycmVkU2lkZUVmZmVjdHMobmV3IFNldChbXCJnZW5lcmljRmllbGRcIiwgLi4uQXJyYXkuZnJvbSh0aGlzLnVwZGF0ZWRQcm9wZXJ0aWVzKV0pKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogVXBkYXRlcyBhIHByb3BlcnR5IGluIHRoZSBzZWxlY3RlZCBjb250ZXh0LlxuXHQgKiBAcGFyYW0gc2VsZWN0ZWRDb250ZXh0IFRoZSBjb250ZXh0IHRvIHVwZGF0ZS5cblx0ICogQHBhcmFtIHByb3BlcnR5UGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gdXBkYXRlLlxuXHQgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBmb3IgdGhlIHByb3BlcnR5LlxuXHQgKiBAcGFyYW0gZ3JvdXBJZCBUaGUgSUQgb2YgdGhlIGdyb3VwIGZvciB0aGUgdXBkYXRlLlxuXHQgKi9cblx0YXN5bmMgdXBkYXRlUHJvcGVydHkoc2VsZWN0ZWRDb250ZXh0OiBPRGF0YVY0Q29udGV4dCwgcHJvcGVydHlQYXRoOiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBncm91cElkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBjb250ZXh0UGF0aCA9IHNlbGVjdGVkQ29udGV4dC5nZXRQYXRoKCk7XG5cdFx0dHJ5IHtcblx0XHRcdGF3YWl0IHNlbGVjdGVkQ29udGV4dC5zZXRQcm9wZXJ0eShwcm9wZXJ0eVBhdGgsIHZhbHVlLCBncm91cElkKTtcblx0XHRcdHRoaXMudXBkYXRlZENvbnRleHRzLmFkZChjb250ZXh0UGF0aCk7XG5cdFx0XHR0aGlzLnVwZGF0ZWRQcm9wZXJ0aWVzLmFkZChwcm9wZXJ0eVBhdGgpO1xuXHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHR0aGlzLmNvbnRleHRzT25FcnJvci5hZGQoY29udGV4dFBhdGgpO1xuXHRcdFx0TG9nLmVycm9yKFwiTWFzcyBFZGl0OiBTb21ldGhpbmcgd2VudCB3cm9uZyBpbiB1cGRhdGluZyBlbnRyaWVzLlwiLCBlcnJvciBhcyBzdHJpbmcpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBpbmZvcm1hdGlvbiBvZiB0aGUgdmFsdWVzIGZvciBhbGwgbWFzcyBlZGl0IGZpZWxkcy5cblx0ICogQHJldHVybnMgVGhlIGluZm9ybWF0aW9uLlxuXHQgKi9cblx0cHJpdmF0ZSBnZXRGaWVsZFZhbHVlc0luZm9zKCk6IEZpZWxkVmFsdWVzSW5mbyB7XG5cdFx0Y29uc3QgcmVzdWx0ID0ge1xuXHRcdFx0dmFsdWVzOiB7fSxcblx0XHRcdGZpZWxkQ29udHJvbFJlZmVyZW5jZTogW11cblx0XHR9IGFzIEZpZWxkVmFsdWVzSW5mbztcblx0XHRmb3IgKGNvbnN0IGZpZWxkQ29udHJvbCBvZiB0aGlzLmZpZWxkQ29udHJvbHMpIHtcblx0XHRcdGNvbnN0IGZpZWxkVmFsdWVzID0gZmllbGRDb250cm9sLmdldEZpZWxkVmFsdWVzKCk7XG5cdFx0XHRyZXN1bHQudmFsdWVzID0geyAuLi5yZXN1bHQudmFsdWVzLCAuLi5maWVsZFZhbHVlcyB9O1xuXHRcdFx0cmVzdWx0LmZpZWxkQ29udHJvbFJlZmVyZW5jZS5wdXNoKHsgY29udHJvbDogZmllbGRDb250cm9sLCB2YWx1ZXM6IGZpZWxkVmFsdWVzIH0pO1xuXHRcdH1cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0LyoqXG5cdCAqIFVwZGF0ZXMgdGhlIHRhYmxlIGZpZWxkcyBhY2NvcmRpbmcgdG8gdGhlIGRpYWxvZyBlbnRyaWVzLlxuXHQgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGN1c3RvbSBzYXZlIGlzIGV4ZWN1dGVkLCBgZmFsc2VgIG90aGVyd2lzZS5cblx0ICovXG5cdGFzeW5jIGFwcGx5Q2hhbmdlcygpOiBQcm9taXNlPGJvb2xlYW4+IHtcblx0XHRhd2FpdCB0aGlzLnJlcXVpcmVkRGF0YVByb21pc2UucHJvbWlzZTsgLy8gV2UgbmVlZCB0byB3YWl0IGZvciB0aGUgcmVxdWlyZWQgZGF0YSB0byBiZSBsb2FkZWQgYmVmb3JlIHNhdmluZy5cblx0XHQvL1dlIHdhbnQgdG8gc2tpcCB0aGUgcGF0Y2ggaGFuZGxlcihzcGVjaWZpYyB3b3JrZmxvdyBkb25lIGludG8gdGhlIEVkaXRGbG93KSBzaW5jZSB0aGUgcGF0Y2ggaXMgbWFuYWdlZCBoZXJlXG5cdFx0dGhpcy52aWV3LmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIik/LnNldFByb3BlcnR5KFwic2tpcFBhdGNoSGFuZGxlcnNcIiwgdHJ1ZSk7XG5cblx0XHRjb25zdCBmaWVsZHNWYWx1ZXNJbmZvID0gdGhpcy5nZXRGaWVsZFZhbHVlc0luZm9zKCk7XG5cdFx0bGV0IGN1c3RvbVNhdmUgPSBmYWxzZTtcblx0XHR0cnkge1xuXHRcdFx0Y3VzdG9tU2F2ZSA9IGF3YWl0IHRoaXMudmlld1xuXHRcdFx0XHQuZ2V0Q29udHJvbGxlcigpXG5cdFx0XHRcdC5lZGl0Rmxvdy5jdXN0b21NYXNzRWRpdFNhdmUoeyBhQ29udGV4dHM6IHRoaXMuY29udGV4dHMsIG9VcGRhdGVEYXRhOiBmaWVsZHNWYWx1ZXNJbmZvLnZhbHVlcyB9KTtcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0TG9nLmVycm9yKFwiTWFzcyBFZGl0OiBTb21ldGhpbmcgd2VudCB3cm9uZyBpbiB1cGRhdGluZyBlbnRyaWVzLlwiLCBlcnJvciBhcyBzdHJpbmcpO1xuXHRcdH1cblx0XHRpZiAoIWN1c3RvbVNhdmUpIHtcblx0XHRcdGF3YWl0IHRoaXMuc2F2ZUNoYW5nZXMoZmllbGRzVmFsdWVzSW5mbyk7XG5cdFx0fVxuXHRcdHRoaXMudmlldy5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpPy5zZXRQcm9wZXJ0eShcInNraXBQYXRjaEhhbmRsZXJzXCIsIGZhbHNlKTtcblx0XHRyZXR1cm4gY3VzdG9tU2F2ZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBNYW5hZ2VzIHRoZSBwcmVzcyBvbiB0aGUgQXBwbHkgQnV0dG9uLlxuXHQgKiBAcmV0dXJucyBBIHByb21pc2UuXG5cdCAqL1xuXHRwcml2YXRlIGFzeW5jIG9uQXBwbHkoKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0aWYgKHRoaXMuZmllbGRDb250cm9scy5zb21lKChmaWVsZENvbnRyb2wpID0+ICFmaWVsZENvbnRyb2wuaXNGaWVsZFZhbGlkKCkpKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGlmICghdGhpcy5pc0FkYXB0YXRpb24pIHtcblx0XHRcdGNvbnN0IGdsb2JhbFVJTW9kZWwgPSB0aGlzLnZpZXcuZ2V0TW9kZWwoXCJ1aVwiKTtcblx0XHRcdHRoaXMuZGlhbG9nPy5jbG9zZSgpO1xuXHRcdFx0QnVzeUxvY2tlci5sb2NrKGdsb2JhbFVJTW9kZWwpO1xuXHRcdFx0bWVzc2FnZUhhbmRsaW5nLnJlbW92ZUJvdW5kVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cdFx0XHRtZXNzYWdlSGFuZGxpbmcucmVtb3ZlVW5ib3VuZFRyYW5zaXRpb25NZXNzYWdlcygpO1xuXHRcdFx0Y29uc3QgaXNDdXN0b21TYXZlID0gYXdhaXQgdGhpcy5hcHBseUNoYW5nZXMoKTtcblx0XHRcdGlmICghaXNDdXN0b21TYXZlKSB7XG5cdFx0XHRcdHRoaXMubWFuYWdlTWVzc2FnZSgpO1xuXHRcdFx0fVxuXHRcdFx0QnVzeUxvY2tlci51bmxvY2soZ2xvYmFsVUlNb2RlbCk7XG5cdFx0fVxuXHRcdHRoaXMub25DbG9zZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgdGhlIGRpYWxvZyBjb250ZW50LlxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJldHVybmluZyBpbnN0YW5jZSBvZiBmcmFnbWVudC5cblx0ICovXG5cblx0cHJpdmF0ZSBhc3luYyBjcmVhdGVDb250ZW50KCk6IFByb21pc2U8Rm9ybT4ge1xuXHRcdGNvbnN0IGN1c3RvbUZvcm1Db250YWluZXIgPSBhd2FpdCB0aGlzLmNyZWF0ZUN1c3RvbUNvbnRhaW5lcigpO1xuXHRcdHJldHVybiAoXG5cdFx0XHQ8PlxuXHRcdFx0XHR7dGhpcy5nZXRBZGFwdGF0aW9uTWVzc2FnZSgpfVxuXHRcdFx0XHQ8Rm9ybT5cblx0XHRcdFx0XHR7e1xuXHRcdFx0XHRcdFx0bGF5b3V0OiA8UmVzcG9uc2l2ZUdyaWRMYXlvdXQgbGFiZWxTcGFuTT1cIjEyXCIgbGFiZWxTcGFuTD1cIjEyXCIgbGFiZWxTcGFuWEw9XCIxMlwiIC8+LFxuXHRcdFx0XHRcdFx0Zm9ybUNvbnRhaW5lcnM6IChcblx0XHRcdFx0XHRcdFx0PD5cblx0XHRcdFx0XHRcdFx0XHR7Y3VzdG9tRm9ybUNvbnRhaW5lcn1cblx0XHRcdFx0XHRcdFx0XHQ8Rm9ybUNvbnRhaW5lcj5cblx0XHRcdFx0XHRcdFx0XHRcdHt7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGZvcm1FbGVtZW50czogdGhpcy5jcmVhdGVGb3JtRWxlbWVudHMoKVxuXHRcdFx0XHRcdFx0XHRcdFx0fX1cblx0XHRcdFx0XHRcdFx0XHQ8L0Zvcm1Db250YWluZXI+XG5cdFx0XHRcdFx0XHRcdDwvPlxuXHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdH19XG5cdFx0XHRcdDwvRm9ybT5cblx0XHRcdDwvPlxuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgYWRhcHRhdGlvbiBtZXNzYWdlLlxuXHQgKiBAcmV0dXJucyBUaGUgbWVzc2FnZSBzdHJpcCBpZiB0aGUgZGlhbG9nIGlzIGRpc3BsYXllZCBpbiBhZGFwdGF0aW9uIG1vZGUuXG5cdCAqL1xuXHRwcml2YXRlIGdldEFkYXB0YXRpb25NZXNzYWdlKCk6IE1lc3NhZ2VTdHJpcCB8IHVuZGVmaW5lZCB7XG5cdFx0aWYgKHRoaXMuaXNBZGFwdGF0aW9uKSB7XG5cdFx0XHRyZXR1cm4gPE1lc3NhZ2VTdHJpcCB0ZXh0PXt0aGlzLnJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfTUFTU19FRElUX0FEQVBUQVRJT05fTU9ERVwiKX0gLz47XG5cdFx0fVxuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyB0aGUgY3VzdG9tIGZvcm0gY29udGFpbmVyIGFjY29yZGluZyB0byB0aGUgbWFuaWZlc3Qgc2V0dGluZ3MuXG5cdCAqIEByZXR1cm5zIFRoZSBjdXN0b20gZm9ybSBjb250YWluZXIuXG5cdCAqL1xuXHRwcml2YXRlIGFzeW5jIGNyZWF0ZUN1c3RvbUNvbnRhaW5lcigpOiBQcm9taXNlPEZvcm1Db250YWluZXIgfCB1bmRlZmluZWQ+IHtcblx0XHRjb25zdCBtYW5pZmVzdFNldHRpbmdzID0gKHRoaXMudGFibGUuZ2V0UGFyZW50KCkgYXMgVGFibGVBUEkpLmdldFRhYmxlRGVmaW5pdGlvbigpLmNvbnRyb2wubWFzc0VkaXQ7XG5cdFx0aWYgKG1hbmlmZXN0U2V0dGluZ3MuY3VzdG9tRnJhZ21lbnQpIHtcblx0XHRcdGlmIChtYW5pZmVzdFNldHRpbmdzLmZyb21JbmxpbmUgPT09IHRydWUpIHtcblx0XHRcdFx0Ly8gSW5saW5lIGNvbmZpZ3VyYXRpb24gZnJvbSBhIFYyIGJsb2NrOiB0aGUgZnJhZ21lbnQgaXMgYSBzdHJpbmdcblx0XHRcdFx0aWYgKHR5cGVvZiBtYW5pZmVzdFNldHRpbmdzLmN1c3RvbUZyYWdtZW50ID09PSBcInN0cmluZ1wiKSB7XG5cdFx0XHRcdFx0Y29uc3QgcmVzdWx0WE1MID0gYXdhaXQgWE1MUHJlcHJvY2Vzc29yLnByb2Nlc3MoXG5cdFx0XHRcdFx0XHRuZXcgRE9NUGFyc2VyKCkucGFyc2VGcm9tU3RyaW5nKG1hbmlmZXN0U2V0dGluZ3MuY3VzdG9tRnJhZ21lbnQsIFwidGV4dC94bWxcIikuZmlyc3RFbGVtZW50Q2hpbGQsXG5cdFx0XHRcdFx0XHR7IG1vZGVsczoge30gfSxcblx0XHRcdFx0XHRcdCh0aGlzLnZpZXcuZ2V0Q29udHJvbGxlcigpLmdldE93bmVyQ29tcG9uZW50KCkgYXMgRW5oYW5jZVdpdGhVSTU8VGVtcGxhdGVDb21wb25lbnQ+KS5nZXRQcmVwcm9jZXNzb3JDb250ZXh0KClcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdHJldHVybiAoYXdhaXQgRnJhZ21lbnQubG9hZCh7XG5cdFx0XHRcdFx0XHR0eXBlOiBcIlhNTFwiLFxuXHRcdFx0XHRcdFx0ZGVmaW5pdGlvbjogcmVzdWx0WE1MLFxuXHRcdFx0XHRcdFx0Y29udHJvbGxlcjogdGhpcy52aWV3LmdldENvbnRyb2xsZXIoKVxuXHRcdFx0XHRcdH0pKSBhcyB1bmtub3duIGFzIEZvcm1Db250YWluZXI7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gSW5saW5lIGNvbmZpZ3VyYXRpb24gZnJvbSBhIFY0IGJsb2NrOiB0aGUgZnJhZ21lbnQgaXMgYWxyZWFkeSBhIEZvcm1Db250YWluZXJcblx0XHRcdFx0XHRyZXR1cm4gbWFuaWZlc3RTZXR0aW5ncy5jdXN0b21GcmFnbWVudC5jbG9uZSgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gKGF3YWl0IHRoaXMudmlld1xuXHRcdFx0XHQuZ2V0Q29udHJvbGxlcigpXG5cdFx0XHRcdC5nZXRFeHRlbnNpb25BUEkoKVxuXHRcdFx0XHQubG9hZEZyYWdtZW50KHtcblx0XHRcdFx0XHRpZDogXCJjdXN0b21NYXNzRWRpdFwiLFxuXHRcdFx0XHRcdG5hbWU6IG1hbmlmZXN0U2V0dGluZ3MuY3VzdG9tRnJhZ21lbnQgYXMgc3RyaW5nLFxuXHRcdFx0XHRcdGNvbnRleHRQYXRoOiB0aGlzLnRyYW5zaWVudExpc3RCaW5kaW5nXG5cdFx0XHRcdFx0XHQuZ2V0TW9kZWwoKVxuXHRcdFx0XHRcdFx0LmdldE1ldGFNb2RlbCgpXG5cdFx0XHRcdFx0XHQuZ2V0TWV0YVBhdGgodGhpcy50cmFuc2llbnRMaXN0QmluZGluZy5nZXRSZXNvbHZlZFBhdGgoKSlcblx0XHRcdFx0fSkpIGFzIEZvcm1Db250YWluZXI7XG5cdFx0fVxuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyB0aGUgZm9ybSBlbGVtZW50cyBvZiB0aGUgZGlhbG9nLlxuXHQgKiBAcmV0dXJucyBUaGUgZm9ybSBlbGVtZW50cy5cblx0ICovXG5cdHByaXZhdGUgY3JlYXRlRm9ybUVsZW1lbnRzKCk6IEZvcm1FbGVtZW50W10ge1xuXHRcdHJldHVybiB0aGlzLmZpZWxkUHJvcGVydGllcy5tYXAodGhpcy5jcmVhdGVGb3JtRWxlbWVudC5iaW5kKHRoaXMpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIHRoZSBmb3JtIGVsZW1lbnRzIG9mIGEgRmllbGQuXG5cdCAqIEBwYXJhbSBmaWVsZEluZm8gVGhlIGZpZWxkIHByb3BlcnRpZXNcblx0ICogQHJldHVybnMgVGhlIGZvcm0gZWxlbWVudC5cblx0ICovXG5cdHByaXZhdGUgY3JlYXRlRm9ybUVsZW1lbnQoZmllbGRJbmZvOiBNYXNzRmllbGRQcm9wZXJ0aWVzKTogRm9ybUVsZW1lbnQge1xuXHRcdHJldHVybiAoXG5cdFx0XHQ8Rm9ybUVsZW1lbnQgdmlzaWJsZT17ZmllbGRJbmZvLnZpc2libGV9PlxuXHRcdFx0XHR7e1xuXHRcdFx0XHRcdGxhYmVsOiA8TGFiZWwgdGV4dD17ZmllbGRJbmZvLmxhYmVsfSBpZD17SUQuZ2VuZXJhdGUoW1wiTUVEX1wiLCBmaWVsZEluZm8ucHJvcGVydHlJbmZvLmtleSwgXCJMYWJlbFwiXSl9IC8+LFxuXHRcdFx0XHRcdGZpZWxkczogdGhpcy5jcmVhdGVGaWVsZHMoZmllbGRJbmZvKVxuXHRcdFx0XHR9fVxuXHRcdFx0PC9Gb3JtRWxlbWVudD5cblx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgdGhlIGZpZWxkcyBvZiB0aGUgZGlhbG9nLlxuXHQgKiBAcGFyYW0gZmllbGRJbmZvIFRoZSBmaWVsZCBwcm9wZXJ0aWVzXG5cdCAqIEByZXR1cm5zIFRoZSBmaWVsZHMuXG5cdCAqL1xuXHRwcml2YXRlIGNyZWF0ZUZpZWxkcyhmaWVsZEluZm86IE1hc3NGaWVsZFByb3BlcnRpZXMpOiBDb250cm9sW10ge1xuXHRcdGNvbnN0IG1ldGFNb2RlbCA9ICh0aGlzLnRhYmxlLmdldE1vZGVsKCkgYXMgT0RhdGFNb2RlbCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0Y29uc3QgY29udGV4dCA9IG1ldGFNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChtZXRhTW9kZWwuZ2V0TWV0YVBhdGgodGhpcy5iaW5kaW5nQ29udGV4dC5nZXRQYXRoKCkpKSBhcyBDb250ZXh0O1xuXHRcdGNvbnN0IG1hc3NFZGl0RmllbGQgPSBuZXcgTWFzc0VkaXRGaWVsZChmaWVsZEluZm8sIGNvbnRleHQpO1xuXHRcdHRoaXMuZmllbGRDb250cm9scy5wdXNoKG1hc3NFZGl0RmllbGQpO1xuXHRcdHJldHVybiBtYXNzRWRpdEZpZWxkLmdldENvbnRyb2xzKCk7XG5cdH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O01BNERxQkEsY0FBYztJQTZCbEM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7SUFDQyxTQUFBQSxlQUFZQyxLQUEyRixFQUFFO01BQUEsS0FuQ3hGQyxtQkFBbUIsR0FBRyxJQUFJQyxhQUFhLENBQU8sQ0FBQztNQUFBLEtBWS9DQyxlQUFlLEdBQWdCLElBQUlDLEdBQUcsQ0FBQyxDQUFDO01BQUEsS0FFeENDLGlCQUFpQixHQUFnQixJQUFJRCxHQUFHLENBQUMsQ0FBQztNQUFBLEtBRTFDRSxlQUFlLEdBQWdCLElBQUlGLEdBQUcsQ0FBQyxDQUFDO01Bb0J4RCxJQUFJLENBQUNHLE1BQU0sR0FBR0MsU0FBUztNQUN2QixJQUFJLENBQUNDLEtBQUssR0FBR1QsS0FBSyxDQUFDUyxLQUFLO01BQ3hCLElBQUksQ0FBQ0MsUUFB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QWtCO01BQzNDLE9BQU8sSUFBSSxDQUFDdkwsZUFBZSxDQUFDcUksR0FBRyxDQUFDLElBQUksQ0FBQ3lFLGlCQUFpQixDQUFDaEssSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ25FOztJQUVBO0FBQ0Q7QUFDQTtBQUNBO0FBQ0EsT0FKQztJQUFBbEMsTUFBQSxDQUtRa00saUJBQWlCLEdBQXpCLFNBQVFBLGlCQUFpQkEsQ0FBQ0MsU0FBOEIsRUFBZTtNQUN0RSxPQUNDaEwsSUFBQSxDQUFDaUwsV0FBVztRQUFDQyxPQUFPLEVBQUVGLFNBQVMsQ0FBQ0UsT0FBUTtRQUFBckMsUUFBQSxFQUN0QztVQUNBc0MsS0FBSyxFQUFFbkwsSUFBQSxDQUFDb0wsS0FBSztZQUFDakssSUFBSSxFQUFFNkosU0FBUyxDQUFDRyxLQUFNO1lBQUNqTCxFQUFFLEVBQUVDLEVBQUUsQ0FBQ0MsUUFBUSxDQUFDLENBQUMsTUFBTSxFQUFFNEssU0FBUyxDQUFDSyxZQUFZLENBQUNDLEdBQUcsRUFBRSxPQUFPLENBQUM7VUFBRSxDQUFFLENBQUM7VUFDdkdDLE1BQU0sRUFBRSxJQUFJLENBQUNDLFlBQVksQ0FBQ1IsU0FBUztRQUNwQztNQUFDLENBQ1csQ0FBQztJQUVoQjs7SUFFQTtBQUNEO0FBQ0E7QUFDQTtBQUNBLE9BSkM7SUFBQW5NLE1BQUEsQ0FLUTJNLFlBQVksR0FBcEIsU0FBUUEsWUFBWUEsQ0FBQ1IsU0FBOEIsRUFBYTtNQUMvRCxNQUFNUyxTQUFTLEdBQUksSUFBSSxDQUFDOU4sS0FBSyxDQUFDc0IsUUFBUSxDQUFDLENBQUMsQ0FBZ0IyTCxZQUFZLENBQUMsQ0FBQztNQUN0RSxNQUFNYyxPQUFPLEdBQUdELFNBQVMsQ0FBQ0Usb0JBQW9CLENBQUNGLFNBQVMsQ0FBQ1osV0FBVyxDQUFDLElBQUksQ0FBQ3ZNLGNBQWMsQ0FBQ2EsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFZO01BQy9HLE1BQU15TSxhQUFhLEdBQUcsSUFBSUMsYUFBYSxDQUFDYixTQUFTLEVBQUVVLE9BQU8sQ0FBQztNQUMzRCxJQUFJLENBQUMvTSxhQUFhLENBQUN5SCxJQUFJLENBQUN3RixhQUFhLENBQUM7TUFDdEMsT0FBT0EsYUFBYSxDQUFDRSxXQUFXLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBQUEsT0FBQTdPLGNBQUE7RUFBQTtFQUFBMkIsUUFBQSxHQUFBM0IsY0FBQTtFQUFBLE9BQUEyQixRQUFBO0FBQUEiLCJpZ25vcmVMaXN0IjpbXX0=
@@ -6,6 +6,7 @@ import type { FEView } from "sap/fe/core/BaseController";
6
6
  import CommonUtils from "sap/fe/core/CommonUtils";
7
7
  import type ResourceModel from "sap/fe/core/ResourceModel";
8
8
  import type TemplateComponent from "sap/fe/core/TemplateComponent";
9
+ import BusyLocker from "sap/fe/core/controllerextensions/BusyLocker";
9
10
  import messageHandling from "sap/fe/core/controllerextensions/messageHandler/messageHandling";
10
11
  import { OperationGroupingMode } from "sap/fe/core/converters/ManifestSettings";
11
12
  import PromiseKeeper from "sap/fe/core/helpers/PromiseKeeper";
@@ -70,10 +71,12 @@ export default class MassEditDialog {
70
71
 
71
72
  public readonly contexts: ODataV4Context[];
72
73
 
73
- private readonly contextsOnError: ODataV4Context[];
74
+ private readonly contextsOnError: Set<string> = new Set();
74
75
 
75
76
  private readonly updatedProperties: Set<string> = new Set();
76
77
 
78
+ private readonly updatedContexts: Set<string> = new Set();
79
+
77
80
  private readonly resourceModel: ResourceModel;
78
81
 
79
82
  public readonly bindingContext: ODataV4Context;
@@ -102,7 +105,6 @@ export default class MassEditDialog {
102
105
  this.bindingContext = this.transientListBinding.create({}, true);
103
106
 
104
107
  this.resourceModel = ResourceModelHelper.getResourceModel(this.table);
105
- this.contextsOnError = [];
106
108
  this.fieldControls = [];
107
109
  }
108
110
 
@@ -186,7 +188,9 @@ export default class MassEditDialog {
186
188
  private onClose(): void {
187
189
  this.transientListBinding.destroy();
188
190
  if (this.dialog) {
189
- this.dialog.close();
191
+ if (this.dialog.isOpen()) {
192
+ this.dialog.close();
193
+ }
190
194
  this.dialog.destroy();
191
195
  }
192
196
  }
@@ -206,6 +210,7 @@ export default class MassEditDialog {
206
210
  * Manages the messages according to the contexts on error.
207
211
  */
208
212
  async manageMessage(): Promise<void> {
213
+ const isErrorAndSuccess = this.contextsOnError.size > 0 && this.updatedContexts.size > 0;
209
214
  const coreResourceBundle = Library.getResourceBundleFor("sap.fe.core") as ResourceBundle;
210
215
  const controller = this.view.getController();
211
216
  const DraftStatus = FELibrary.DraftStatus;
@@ -224,8 +229,9 @@ export default class MassEditDialog {
224
229
  ) => {
225
230
  showMessageParameters.fnGetMessageSubtitle = messageHandling.setMessageSubtitle.bind({}, this.table, this.contexts);
226
231
 
227
- if (!this.contextsOnError.length) {
228
- if (this.updatedProperties.size > 0) {
232
+ if (!this.contextsOnError.size) {
233
+ // only successes
234
+ if (this.updatedContexts.size) {
229
235
  //There is at least one new value set
230
236
  controller.editFlow.setDraftStatus(DraftStatus.Saved);
231
237
  if (this.view.getViewData().converterType === "ListReport") {
@@ -236,10 +242,11 @@ export default class MassEditDialog {
236
242
  } else {
237
243
  MessageToast.show(this.resourceModel.getText("C_MASS_EDIT_NO_CHANGE"));
238
244
  }
239
- } else if (this.contextsOnError.length < this.contexts.length) {
245
+ } else if (isErrorAndSuccess) {
246
+ // errors and successes
240
247
  controller.editFlow.setDraftStatus(DraftStatus.Saved);
241
- } else if (this.contextsOnError.length === this.contexts.length) {
242
- controller.editFlow.setDraftStatus(DraftStatus.Clear);
248
+ } else {
249
+ controller.editFlow.setDraftStatus(DraftStatus.Clear); //only errors
243
250
  }
244
251
 
245
252
  if (CommonUtils.getIsEditable(controller) && !messages.some((message) => !message.getTargets())) {
@@ -250,13 +257,10 @@ export default class MassEditDialog {
250
257
  }
251
258
  });
252
259
 
253
- if (!!this.contextsOnError.length && this.contextsOnError.length < this.contexts.length) {
260
+ if (isErrorAndSuccess) {
254
261
  const confirmButtonTxt = coreResourceBundle.getText("C_COMMON_DIALOG_OK");
255
262
  MessageBox.success(
256
- this.resourceModel.getText("C_MASS_EDIT_CHANGES_WITH_ERROR", [
257
- this.contexts.length - this.contextsOnError.length,
258
- this.contexts.length
259
- ]),
263
+ this.resourceModel.getText("C_MASS_EDIT_CHANGES_WITH_ERROR", [this.updatedContexts.size, this.contexts.length]),
260
264
  {
261
265
  actions: [confirmButtonTxt],
262
266
  emphasizedAction: confirmButtonTxt
@@ -292,15 +296,7 @@ export default class MassEditDialog {
292
296
  for (const propertyPath in values) {
293
297
  if (selectedContext.getProperty(propertyPath) !== values[propertyPath]) {
294
298
  valueHasChanged = true;
295
- fieldPromises.push(
296
- selectedContext
297
- .setProperty(propertyPath, values[propertyPath], groupId)
298
- .then(() => this.updatedProperties.add(propertyPath))
299
- .catch((error: unknown) => {
300
- this.contextsOnError.push(selectedContext);
301
- Log.error("Mass Edit: Something went wrong in updating entries.", error as string);
302
- })
303
- );
299
+ fieldPromises.push(this.updateProperty(selectedContext, propertyPath, values[propertyPath], groupId));
304
300
  immediateSideEffects.push({
305
301
  propertyPath,
306
302
  groupId
@@ -338,6 +334,25 @@ export default class MassEditDialog {
338
334
  }
339
335
  }
340
336
 
337
+ /**
338
+ * Updates a property in the selected context.
339
+ * @param selectedContext The context to update.
340
+ * @param propertyPath The path of the property to update.
341
+ * @param value The new value for the property.
342
+ * @param groupId The ID of the group for the update.
343
+ */
344
+ async updateProperty(selectedContext: ODataV4Context, propertyPath: string, value: unknown, groupId: string): Promise<void> {
345
+ const contextPath = selectedContext.getPath();
346
+ try {
347
+ await selectedContext.setProperty(propertyPath, value, groupId);
348
+ this.updatedContexts.add(contextPath);
349
+ this.updatedProperties.add(propertyPath);
350
+ } catch (error: unknown) {
351
+ this.contextsOnError.add(contextPath);
352
+ Log.error("Mass Edit: Something went wrong in updating entries.", error as string);
353
+ }
354
+ }
355
+
341
356
  /**
342
357
  * Gets the information of the values for all mass edit fields.
343
358
  * @returns The information.
@@ -389,12 +404,16 @@ export default class MassEditDialog {
389
404
  return;
390
405
  }
391
406
  if (!this.isAdaptation) {
407
+ const globalUIModel = this.view.getModel("ui");
408
+ this.dialog?.close();
409
+ BusyLocker.lock(globalUIModel);
392
410
  messageHandling.removeBoundTransitionMessages();
393
411
  messageHandling.removeUnboundTransitionMessages();
394
412
  const isCustomSave = await this.applyChanges();
395
413
  if (!isCustomSave) {
396
414
  this.manageMessage();
397
415
  }
416
+ BusyLocker.unlock(globalUIModel);
398
417
  }
399
418
  this.onClose();
400
419
  }