@sapui5/sap.fe.core 1.136.0 → 1.136.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 (87) hide show
  1. package/package.json +1 -1
  2. package/src/sap/fe/core/.library +1 -1
  3. package/src/sap/fe/core/AppComponent.js +4 -6
  4. package/src/sap/fe/core/AppComponent.ts +4 -4
  5. package/src/sap/fe/core/CommonUtils.js +41 -14
  6. package/src/sap/fe/core/CommonUtils.ts +47 -16
  7. package/src/sap/fe/core/IRowBindingInterface.js +1 -1
  8. package/src/sap/fe/core/IRowBindingInterface.ts +1 -1
  9. package/src/sap/fe/core/buildingBlocks/BuildingBlock.js +4 -1
  10. package/src/sap/fe/core/buildingBlocks/BuildingBlock.ts +3 -0
  11. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.js +12 -4
  12. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.ts +10 -3
  13. package/src/sap/fe/core/controllerextensions/CollaborativeDraft.js +139 -5
  14. package/src/sap/fe/core/controllerextensions/CollaborativeDraft.ts +169 -4
  15. package/src/sap/fe/core/controllerextensions/EditFlow.js +48 -43
  16. package/src/sap/fe/core/controllerextensions/EditFlow.ts +54 -51
  17. package/src/sap/fe/core/controllerextensions/InlineEditFlow.js +39 -5
  18. package/src/sap/fe/core/controllerextensions/InlineEditFlow.ts +38 -1
  19. package/src/sap/fe/core/controllerextensions/InternalRouting.js +12 -13
  20. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +10 -11
  21. package/src/sap/fe/core/controllerextensions/MessageHandler.js +32 -21
  22. package/src/sap/fe/core/controllerextensions/MessageHandler.ts +31 -20
  23. package/src/sap/fe/core/controllerextensions/PageReady.js +6 -3
  24. package/src/sap/fe/core/controllerextensions/PageReady.ts +6 -2
  25. package/src/sap/fe/core/controllerextensions/Recommendations.js +3 -2
  26. package/src/sap/fe/core/controllerextensions/Recommendations.ts +7 -5
  27. package/src/sap/fe/core/controllerextensions/Share.js +6 -6
  28. package/src/sap/fe/core/controllerextensions/Share.ts +3 -4
  29. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +9 -11
  30. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.ts +8 -13
  31. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +9 -9
  32. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +20 -10
  33. package/src/sap/fe/core/controllerextensions/editFlow/draft.js +31 -8
  34. package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +46 -9
  35. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.js +2 -2
  36. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.ts +1 -1
  37. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataOperation.js +20 -18
  38. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataOperation.ts +37 -23
  39. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataStrictHandling.js +4 -3
  40. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataStrictHandling.ts +6 -1
  41. package/src/sap/fe/core/controllerextensions/editFlow/operations/Operation.js +6 -3
  42. package/src/sap/fe/core/controllerextensions/editFlow/operations/Operation.ts +11 -3
  43. package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +5 -2
  44. package/src/sap/fe/core/controllerextensions/editFlow/sticky.ts +3 -2
  45. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +2 -2
  46. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +1 -1
  47. package/src/sap/fe/core/controls/CommandExecution.js +1 -1
  48. package/src/sap/fe/core/controls/CommandExecution.ts +1 -1
  49. package/src/sap/fe/core/controls/HideFormGroupAutomatically.js +3 -2
  50. package/src/sap/fe/core/controls/HideFormGroupAutomatically.ts +2 -0
  51. package/src/sap/fe/core/converters/controls/Common/Action.js +5 -2
  52. package/src/sap/fe/core/converters/controls/Common/Action.ts +4 -1
  53. package/src/sap/fe/core/converters/controls/Common/Chart.js +7 -2
  54. package/src/sap/fe/core/converters/controls/Common/Chart.ts +11 -1
  55. package/src/sap/fe/core/converters/controls/Common/table/Columns.js +41 -58
  56. package/src/sap/fe/core/converters/controls/Common/table/Columns.ts +43 -111
  57. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +14 -6
  58. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +23 -6
  59. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +6 -3
  60. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +5 -2
  61. package/src/sap/fe/core/formatters/ValueFormatter.js +21 -1
  62. package/src/sap/fe/core/formatters/ValueFormatter.ts +19 -0
  63. package/src/sap/fe/core/fpm/manifest.json +1 -1
  64. package/src/sap/fe/core/helpers/DeleteHelper.js +2 -2
  65. package/src/sap/fe/core/helpers/DeleteHelper.ts +1 -1
  66. package/src/sap/fe/core/helpers/ModelHelper.js +2 -2
  67. package/src/sap/fe/core/helpers/ModelHelper.ts +1 -1
  68. package/src/sap/fe/core/helpers/PasteHelper.js +2 -2
  69. package/src/sap/fe/core/helpers/PasteHelper.ts +1 -1
  70. package/src/sap/fe/core/helpers/StableIdHelper.js +2 -2
  71. package/src/sap/fe/core/helpers/StableIdHelper.ts +4 -1
  72. package/src/sap/fe/core/helpers/TitleHelper.js +13 -6
  73. package/src/sap/fe/core/helpers/TitleHelper.ts +19 -6
  74. package/src/sap/fe/core/library.js +1 -1
  75. package/src/sap/fe/core/messagebundle.properties +0 -1
  76. package/src/sap/fe/core/rootView/Fcl.controller.js +9 -15
  77. package/src/sap/fe/core/rootView/Fcl.controller.ts +9 -15
  78. package/src/sap/fe/core/services/collaborativeDraftServiceFactory.js +9 -6
  79. package/src/sap/fe/core/services/collaborativeDraftServiceFactory.ts +7 -6
  80. package/src/sap/fe/core/templating/DataModelPathHelper.js +2 -2
  81. package/src/sap/fe/core/templating/DataModelPathHelper.ts +1 -1
  82. package/src/sap/fe/core/templating/EntitySetHelper.js +60 -48
  83. package/src/sap/fe/core/templating/EntitySetHelper.ts +80 -58
  84. package/src/sap/fe/core/templating/SemanticObjectHelper.js +6 -4
  85. package/src/sap/fe/core/templating/SemanticObjectHelper.ts +5 -5
  86. package/src/sap/fe/core/templating/UIFormatters.js +7 -1
  87. package/src/sap/fe/core/templating/UIFormatters.ts +4 -0
@@ -34,7 +34,6 @@ import type ODataPropertyBinding from "sap/ui/model/odata/v4/ODataPropertyBindin
34
34
  import type { HiddenDraft } from "../converters/ManifestSettings";
35
35
  import { getInvolvedDataModelObjects } from "../converters/MetaModelConverter";
36
36
  import type { SideEffectsTargetType } from "../services/SideEffectsServiceFactory";
37
- import { addSelf } from "./collaboration/CollaborationCommon";
38
37
  import UiModelConstants from "./editFlow/editFlowConstants";
39
38
  import messageHandling from "./messageHandler/messageHandling";
40
39
 
@@ -452,7 +451,7 @@ class InternalRouting extends ControllerExtension {
452
451
  this._oAppComponent.getRoutingService().addBindingCleanupPromise(
453
452
  new Promise<void>((resolve) => {
454
453
  setTimeout(() => {
455
- if (routeInformation?.routeLevel === 0 && this.base.collaborativeDraft.isConnected()) {
454
+ if (routeInformation?.routeLevel === 0) {
456
455
  // The route has level 0 --> we need to leave the collaboration session as no OP is displayed
457
456
  this.base.collaborativeDraft.disconnect();
458
457
  }
@@ -786,6 +785,12 @@ class InternalRouting extends ControllerExtension {
786
785
  oContext = this._createContext(oContext.getPath(), oModel);
787
786
  }
788
787
 
788
+ // If the binding context is part of a collaborative draft, we call addSelf before binding the page so that the Share action
789
+ // is part of the same batch as the page load, and we can get the list of participating users later
790
+ if (ModelHelper.isCollaborationDraftSupported(oModel.getMetaModel()) && oContext.getPath().includes("IsActiveEntity=false")) {
791
+ this.base.collaborativeDraft.executeShareAction(oContext);
792
+ }
793
+
789
794
  // Set the binding context with the proper before/after callbacks
790
795
  this.beforeSetBindingContext(oContext, {
791
796
  editable: oNavigationParameters.bTargetEditable,
@@ -893,11 +898,7 @@ class InternalRouting extends ControllerExtension {
893
898
  this.base.messageHandler.holdMessagesForControl(this._oView);
894
899
  });
895
900
  oHiddenBinding.attachEventOnce("dataReceived", this.onDataReceived.bind(this));
896
- const boundContext = oHiddenBinding.getBoundContext();
897
- if (isCollaborationDraftSupported && sPath.includes("IsActiveEntity=false")) {
898
- addSelf(oMetaModel, sContextPath!, oModel, boundContext);
899
- }
900
- return boundContext;
901
+ return oHiddenBinding.getBoundContext();
901
902
  }
902
903
  }
903
904
 
@@ -1152,7 +1153,8 @@ class InternalRouting extends ControllerExtension {
1152
1153
  const oMetaModel = oContext.getModel().getMetaModel();
1153
1154
  const navigationParameters: RoutingNavigationParameters = {
1154
1155
  noPreservationCache: true,
1155
- layout: this._oView.getModel("fclhelper").getProperty("/actionButtonsInfo/closeColumn")
1156
+ layout: this._oView.getModel("fclhelper").getProperty("/actionButtonsInfo/closeColumn"),
1157
+ callExtension: true
1156
1158
  };
1157
1159
 
1158
1160
  const isDocumentModified =
@@ -1170,8 +1172,6 @@ class InternalRouting extends ControllerExtension {
1170
1172
  } else if (oViewData?.viewLevel === 1 && ModelHelper.isDraftSupported(oMetaModel, oContext.getPath())) {
1171
1173
  draft.processDataLossOrDraftDiscardConfirmation(
1172
1174
  () => {
1173
- // We don't have callExtension=true in this case, as there's a user validation with the dataloss dialog
1174
- // and it wouldn't make sense to cancel the navigation after this confirmation
1175
1175
  this.navigateBackFromContext(oContext, navigationParameters);
1176
1176
  },
1177
1177
  Function.prototype,
@@ -1181,7 +1181,6 @@ class InternalRouting extends ControllerExtension {
1181
1181
  draft.NavigationType.BackNavigation
1182
1182
  );
1183
1183
  } else {
1184
- navigationParameters.callExtension = true;
1185
1184
  this.navigateBackFromContext(oContext, navigationParameters);
1186
1185
  }
1187
1186
  // Removes transition message for the specified context
@@ -5,9 +5,10 @@
5
5
  sap.ui.define(["sap/base/Log", "sap/base/util/deepEqual", "sap/base/util/uid", "sap/fe/base/ClassSupport", "sap/fe/core/CommonUtils", "sap/fe/core/controllerextensions/messageHandler/messageHandling", "sap/ui/core/Lib", "sap/ui/core/Messaging", "sap/ui/core/message/MessageType", "sap/ui/core/mvc/ControllerExtension", "sap/ui/core/mvc/OverrideExecution"], function (Log, deepEqual, uid, ClassSupport, CommonUtils, messageHandling, Library, Messaging, MessageType, ControllerExtension, OverrideExecution) {
6
6
  "use strict";
7
7
 
8
- var _dec, _dec2, _dec3, _dec4, _dec5, _dec6, _dec7, _dec8, _dec9, _dec10, _class, _class2;
8
+ var _dec, _dec2, _dec3, _dec4, _dec5, _dec6, _dec7, _dec8, _dec9, _dec10, _dec11, _class, _class2;
9
9
  var publicExtension = ClassSupport.publicExtension;
10
10
  var privateExtension = ClassSupport.privateExtension;
11
+ var methodOverride = ClassSupport.methodOverride;
11
12
  var finalExtension = ClassSupport.finalExtension;
12
13
  var extensible = ClassSupport.extensible;
13
14
  var defineUI5Class = ClassSupport.defineUI5Class;
@@ -26,24 +27,27 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepEqual", "sap/base/util/uid", "
26
27
  * @experimental As of version 1.90.0
27
28
  * @since 1.90.0
28
29
  */
29
- let MessageHandler = (_dec = defineUI5Class("sap.fe.core.controllerextensions.MessageHandler"), _dec2 = privateExtension(), _dec3 = extensible(OverrideExecution.Instead), _dec4 = publicExtension(), _dec5 = extensible("AfterAsync"), _dec6 = publicExtension(), _dec7 = finalExtension(), _dec8 = publicExtension(), _dec9 = publicExtension(), _dec10 = finalExtension(), _dec(_class = (_class2 = /*#__PURE__*/function (_ControllerExtension) {
30
+ let MessageHandler = (_dec = defineUI5Class("sap.fe.core.controllerextensions.MessageHandler"), _dec2 = methodOverride(), _dec3 = privateExtension(), _dec4 = extensible(OverrideExecution.Instead), _dec5 = publicExtension(), _dec6 = extensible("AfterAsync"), _dec7 = publicExtension(), _dec8 = finalExtension(), _dec9 = publicExtension(), _dec10 = publicExtension(), _dec11 = finalExtension(), _dec(_class = (_class2 = /*#__PURE__*/function (_ControllerExtension) {
30
31
  function MessageHandler() {
31
32
  var _this;
32
33
  _this = _ControllerExtension.call(this) || this;
33
34
  _this.strictWarningMessages = [];
34
35
  _this.holdKeys = [];
35
36
  _this.holdMsgsToShow = false;
36
- // We await showMessageDialog until the UI element is available.
37
- _this.uiElementIsAvailable = Promise.resolve();
38
37
  return _this;
39
38
  }
39
+ _inheritsLoose(MessageHandler, _ControllerExtension);
40
+ var _proto = MessageHandler.prototype;
41
+ _proto.onInit = function onInit() {
42
+ const internalModel = this.base.getAppComponent().getModel("internal");
43
+ internalModel.setProperty("/messageUIDecision", undefined);
44
+ internalModel.setProperty("/messageUIElementIsAvailable", Promise.resolve());
45
+ }
40
46
 
41
47
  /**
42
48
  * Adds warning messages to the message handler.
43
49
  * @param aMessages The strict warning messages to be added
44
- */
45
- _inheritsLoose(MessageHandler, _ControllerExtension);
46
- var _proto = MessageHandler.prototype;
50
+ */;
47
51
  _proto.addWarningMessagesToMessageHandler = function addWarningMessagesToMessageHandler(aMessages) {
48
52
  this.strictWarningMessages = this.strictWarningMessages.concat(aMessages);
49
53
  }
@@ -148,8 +152,9 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepEqual", "sap/base/util/uid", "
148
152
  * @since 1.90.0
149
153
  */;
150
154
  _proto.showMessageDialog = async function showMessageDialog(mParameters) {
155
+ const internalModel = this.base.getAppComponent().getModel("internal");
151
156
  // remove strict warning messages from the message model before showing the message dialog
152
- await this.uiElementIsAvailable;
157
+ await internalModel.getProperty("/messageUIElementIsAvailable");
153
158
  const messagesInModel = Messaging.getMessageModel().getData();
154
159
  const duplicateWarningMessage = messagesInModel.filter(message => {
155
160
  return this.isStrictWarningMessage(message);
@@ -208,7 +213,10 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepEqual", "sap/base/util/uid", "
208
213
  const newUIDecisions = messageHandling.getUIDecisions(customMessages, bindingContext, showBoundTransitionMessages, concurrentEditFlag, control, sActionName, onBeforeShowMessage, viewType, showBoundStateMessages, parameters);
209
214
  this.updateUIDecisions(newUIDecisions, overrideUIDecision);
210
215
  this.removeHoldKey(unHoldKey ?? control?.getId());
211
- this.showMessagesWithCondtions(forceShowUIElement, success, failure);
216
+ const uiElementIsAvailable = this.base.getAppComponent().getModel("internal")?.getProperty("/messageUIElementIsAvailable");
217
+ this.base.getAppComponent().getModel("internal")?.setProperty("/messageUIElementIsAvailable", uiElementIsAvailable.then(async function () {
218
+ return this.showMessagesWithCondtions(forceShowUIElement, success, failure);
219
+ }.bind(this)));
212
220
  }
213
221
 
214
222
  /**
@@ -222,18 +230,18 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepEqual", "sap/base/util/uid", "
222
230
  let success = arguments.length > 1 ? arguments[1] : undefined;
223
231
  let failure = arguments.length > 2 ? arguments[2] : undefined;
224
232
  const showUIElement = forceShowUIElement || this.checkToShowUIElement();
225
- if (showUIElement && this.uiDecisions) {
233
+ const internalModel = this.base.getAppComponent().getModel("internal");
234
+ if (showUIElement && internalModel.getProperty("/messageUIDecision")) {
226
235
  // Show UI element for the present decision and clear the decision.
227
236
  try {
228
- this.uiElementIsAvailable = messageHandling.showMessagesInUI(this.uiDecisions);
229
- const ret = await this.uiElementIsAvailable;
237
+ const ret = await messageHandling.showMessagesInUI(internalModel.getProperty("/messageUIDecision"));
230
238
  success?.(ret);
231
239
  } catch (err) {
232
240
  Log.error(`FE : V4 : MessageHandler : Error on trying to show UI element: ${err}`);
233
- this.uiElementIsAvailable = Promise.resolve();
234
241
  failure?.(err);
242
+ internalModel.setProperty("/messageUIElementIsAvailable", Promise.resolve());
235
243
  }
236
- this.uiDecisions = undefined;
244
+ internalModel.setProperty("/messageUIDecision", undefined);
237
245
  this.clearStrictWarningMessages();
238
246
  this.holdMsgsToShow = false;
239
247
  } else {
@@ -329,7 +337,9 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepEqual", "sap/base/util/uid", "
329
337
  */;
330
338
  _proto.updateUIDecisions = function updateUIDecisions(newUIDecisions) {
331
339
  let overrideUIDecision = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
332
- const oldUIDecisions = this.uiDecisions;
340
+ const internalModel = this.base.getAppComponent().getModel("internal");
341
+ const oldUIDecisions = internalModel.getProperty("/messageUIDecision");
342
+ ;
333
343
  let allMessagesToShow = [];
334
344
  let mergedUIDecision;
335
345
  if (oldUIDecisions && overrideUIDecision === false) {
@@ -359,7 +369,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepEqual", "sap/base/util/uid", "
359
369
  } else {
360
370
  mergedUIDecision = newUIDecisions;
361
371
  }
362
- this.uiDecisions = mergedUIDecision;
372
+ internalModel.setProperty("/messageUIDecision", mergedUIDecision);
363
373
  }
364
374
 
365
375
  /**
@@ -396,10 +406,11 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepEqual", "sap/base/util/uid", "
396
406
  _proto.releaseHoldByControl = async function releaseHoldByControl(control) {
397
407
  const identifier = control?.getId();
398
408
  this.removeHoldKey(identifier);
399
- this.uiElementIsAvailable = this.uiElementIsAvailable.then(async function () {
409
+ const uiElementIsAvailable = this.base.getAppComponent().getModel("internal")?.getProperty("/messageUIElementIsAvailable");
410
+ this.base.getAppComponent().getModel("internal")?.setProperty("/messageUIElementIsAvailable", uiElementIsAvailable?.then(async function () {
400
411
  return this.showMessagesWithCondtions();
401
- }.bind(this));
402
- await this.uiElementIsAvailable;
412
+ }.bind(this)));
413
+ await this.base.getAppComponent().getModel("internal")?.getProperty("/messageUIElementIsAvailable");
403
414
  }
404
415
 
405
416
  /**
@@ -435,7 +446,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepEqual", "sap/base/util/uid", "
435
446
  }
436
447
  };
437
448
  return MessageHandler;
438
- }(ControllerExtension), _applyDecoratedDescriptor(_class2.prototype, "getShowBoundMessagesInMessageDialog", [_dec2, _dec3], Object.getOwnPropertyDescriptor(_class2.prototype, "getShowBoundMessagesInMessageDialog"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "beforeShowMessageButton", [_dec4, _dec5], Object.getOwnPropertyDescriptor(_class2.prototype, "beforeShowMessageButton"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "showMessageDialog", [_dec6, _dec7], Object.getOwnPropertyDescriptor(_class2.prototype, "showMessageDialog"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "removeTransitionMessages", [_dec8], Object.getOwnPropertyDescriptor(_class2.prototype, "removeTransitionMessages"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "showMessages", [_dec9, _dec10], Object.getOwnPropertyDescriptor(_class2.prototype, "showMessages"), _class2.prototype), _class2)) || _class);
449
+ }(ControllerExtension), _applyDecoratedDescriptor(_class2.prototype, "onInit", [_dec2], Object.getOwnPropertyDescriptor(_class2.prototype, "onInit"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "getShowBoundMessagesInMessageDialog", [_dec3, _dec4], Object.getOwnPropertyDescriptor(_class2.prototype, "getShowBoundMessagesInMessageDialog"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "beforeShowMessageButton", [_dec5, _dec6], Object.getOwnPropertyDescriptor(_class2.prototype, "beforeShowMessageButton"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "showMessageDialog", [_dec7, _dec8], Object.getOwnPropertyDescriptor(_class2.prototype, "showMessageDialog"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "removeTransitionMessages", [_dec9], Object.getOwnPropertyDescriptor(_class2.prototype, "removeTransitionMessages"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "showMessages", [_dec10, _dec11], Object.getOwnPropertyDescriptor(_class2.prototype, "showMessages"), _class2.prototype), _class2)) || _class);
439
450
  return MessageHandler;
440
451
  }, false);
441
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJNZXNzYWdlSGFuZGxlciIsIl9kZWMiLCJkZWZpbmVVSTVDbGFzcyIsIl9kZWMyIiwicHJpdmF0ZUV4dGVuc2lvbiIsIl9kZWMzIiwiZXh0ZW5zaWJsZSIsIk92ZXJyaWRlRXhlY3V0aW9uIiwiSW5zdGVhZCIsIl9kZWM0IiwicHVibGljRXh0ZW5zaW9uIiwiX2RlYzUiLCJfZGVjNiIsIl9kZWM3IiwiZmluYWxFeHRlbnNpb24iLCJfZGVjOCIsIl9kZWM5IiwiX2RlYzEwIiwiX2NsYXNzIiwiX2NsYXNzMiIsIl9Db250cm9sbGVyRXh0ZW5zaW9uIiwiX3RoaXMiLCJjYWxsIiwic3RyaWN0V2FybmluZ01lc3NhZ2VzIiwiaG9sZEtleXMiLCJob2xkTXNnc1RvU2hvdyIsInVpRWxlbWVudElzQXZhaWxhYmxlIiwiUHJvbWlzZSIsInJlc29sdmUiLCJfaW5oZXJpdHNMb29zZSIsIl9wcm90byIsInByb3RvdHlwZSIsImFkZFdhcm5pbmdNZXNzYWdlc1RvTWVzc2FnZUhhbmRsZXIiLCJhTWVzc2FnZXMiLCJjb25jYXQiLCJpc1N0cmljdFdhcm5pbmdNZXNzYWdlIiwib01lc3NhZ2UiLCJmaW5kIiwibWVzc2FnZSIsImdldENvZGUiLCJnZXRNZXNzYWdlIiwiZ2V0VHlwZSIsImdldERlc2NyaXB0aW9uVXJsIiwiZGVlcEVxdWFsIiwiZ2V0VGFyZ2V0cyIsImdldFBlcnNpc3RlbnQiLCJ1bmRlZmluZWQiLCJjbGVhclN0cmljdFdhcm5pbmdNZXNzYWdlcyIsImZpbHRlckVycm9yTWVzc2FnZXMiLCJtZXNzYWdlcyIsImZpbHRlciIsIk1lc3NhZ2VUeXBlIiwiRXJyb3IiLCJnZXRTaG93Qm91bmRNZXNzYWdlc0luTWVzc2FnZURpYWxvZyIsImJlZm9yZVNob3dNZXNzYWdlQnV0dG9uIiwiX21lc3NhZ2VEZXRhaWxzIiwicmVnaXN0ZXJUb0hvbGRNZXNzYWdlcyIsImtleSIsInVuaXF1ZUtleSIsInVpZCIsImluY2x1ZGVzIiwicHVzaCIsInJlc2V0SG9sZEtleXMiLCJzaG93TWVzc2FnZURpYWxvZyIsIm1QYXJhbWV0ZXJzIiwibWVzc2FnZXNJbk1vZGVsIiwiTWVzc2FnaW5nIiwiZ2V0TWVzc2FnZU1vZGVsIiwiZ2V0RGF0YSIsImR1cGxpY2F0ZVdhcm5pbmdNZXNzYWdlIiwicmVtb3ZlTWVzc2FnZXMiLCJjdXN0b21NZXNzYWdlcyIsIm9PUEludGVybmFsQmluZGluZ0NvbnRleHQiLCJiYXNlIiwiZ2V0VmlldyIsImdldEJpbmRpbmdDb250ZXh0Iiwidmlld1R5cGUiLCJnZXRWaWV3RGF0YSIsImNvbnZlcnRlclR5cGUiLCJpc09wZXJhdGlvbkRpYWxvZ09wZW4iLCJzZXRQcm9wZXJ0eSIsImJTaG93Qm91bmRNZXNzYWdlcyIsIm9CaW5kaW5nQ29udGV4dCIsImNvbnRleHQiLCJyZWplY3QiLCJzZXRUaW1lb3V0IiwicHJvY2Vzc0FuZFNob3dNZXNzYWdlcyIsImJpbmQiLCJwYXJhbWV0ZXJzIiwiYmluZGluZ0NvbnRleHQiLCJzaG93Qm91bmRUcmFuc2l0aW9uTWVzc2FnZXMiLCJzdWNjZXNzIiwiZmFpbHVyZSIsImNvbmN1cnJlbnRFZGl0RmxhZyIsImNvbnRyb2wiLCJzQWN0aW9uTmFtZSIsIm9uQmVmb3JlU2hvd01lc3NhZ2UiLCJ1bkhvbGRLZXkiLCJmb3JjZVNob3dVSUVsZW1lbnQiLCJvdmVycmlkZVVJRGVjaXNpb24iLCJzaG93Qm91bmRTdGF0ZU1lc3NhZ2VzIiwibmV3VUlEZWNpc2lvbnMiLCJtZXNzYWdlSGFuZGxpbmciLCJnZXRVSURlY2lzaW9ucyIsInVwZGF0ZVVJRGVjaXNpb25zIiwicmVtb3ZlSG9sZEtleSIsImdldElkIiwic2hvd01lc3NhZ2VzV2l0aENvbmR0aW9ucyIsImFyZ3VtZW50cyIsImxlbmd0aCIsInNob3dVSUVsZW1lbnQiLCJjaGVja1RvU2hvd1VJRWxlbWVudCIsInVpRGVjaXNpb25zIiwic2hvd01lc3NhZ2VzSW5VSSIsInJldCIsImVyciIsIkxvZyIsImVycm9yIiwiaW5mbyIsInJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcyIsImtlZXBCb3VuZE1lc3NhZ2UiLCJrZWVwVW5ib3VuZE1lc3NhZ2UiLCJzUGF0aFRvQmVSZW1vdmVkIiwicmVtb3ZlQm91bmRUcmFuc2l0aW9uTWVzc2FnZXMiLCJyZW1vdmVVbmJvdW5kVHJhbnNpdGlvbk1lc3NhZ2VzIiwiX2NoZWNrTmF2aWdhdGlvblRvRXJyb3JQYWdlIiwiYVVuYm91bmRNZXNzYWdlcyIsImdldE1lc3NhZ2VzIiwiYlNob3dCb3VuZFRyYW5zaXRpb25NZXNzYWdlcyIsImFCb3VuZFRyYW5zaXRpb25NZXNzYWdlcyIsImFDdXN0b21NZXNzYWdlcyIsImJJc1N0aWNreUVkaXRNb2RlIiwiQ29tbW9uVXRpbHMiLCJpc1N0aWNreUVkaXRNb2RlIiwibU1lc3NhZ2VQYWdlUGFyYW1ldGVycyIsImlzRGF0YVJlY2VpdmVkRXJyb3IiLCJ0aXRsZSIsImRlc2NyaXB0aW9uIiwibmF2aWdhdGVCYWNrVG9PcmlnaW4iLCJlcnJvclR5cGUiLCJpc0luaXRpYWxMb2FkNTAzRXJyb3IiLCJvVGVjaG5pY2FsRGV0YWlscyIsImdldFRlY2huaWNhbERldGFpbHMiLCJodHRwU3RhdHVzIiwiX2dldEhUVFA1MDNNZXNzYWdlUGFyYW1ldGVycyIsInRlY2huaWNhbERldGFpbHMiLCJtZXNzYWdlUGFnZVBhcmFtZXRlcnMiLCJzZWNvbmRzQmVmb3JlUmV0cnkiLCJyZXRyeUFmdGVyIiwiX2dldFNlY29uZHNCZWZvcmVSZXRyeUFmdGVyIiwicmV0cnlBZnRlck1lc3NhZ2UiLCJnZXRSZXRyeUFmdGVyTWVzc2FnZSIsImRSZXRyeUFmdGVyIiwiZEN1cnJlbnREYXRlVGltZSIsIkRhdGUiLCJpQ3VycmVudERhdGVUaW1lSW5NaWxsaVNlY29uZHMiLCJnZXRUaW1lIiwiaVJldHJ5QWZ0ZXJEYXRlVGltZUluTWlsbGlTZWNvbmRzIiwiaVNlY29uZHNCZWZvcmVSZXRyeSIsIm9sZFVJRGVjaXNpb25zIiwiYWxsTWVzc2FnZXNUb1Nob3ciLCJtZXJnZWRVSURlY2lzaW9uIiwibWVzc2FnZXNUb1Nob3ciLCJBcnJheSIsImZyb20iLCJTZXQiLCJlbGVtZW50cyIsInVpRWxlbWVudFRvVXNlIiwiY29udGV4dE5lZWRzRXRhZ1JlZnJlc2giLCJjb250YWluc0JvdW5kVHJhbnNpdGlvbiIsImluS2V5Iiwic3BsaWNlIiwiaW5kZXhPZiIsImhvbGRNZXNzYWdlc0ZvckNvbnRyb2wiLCJpZGVudGlmaWVyIiwicmVsZWFzZUhvbGRCeUNvbnRyb2wiLCJ0aGVuIiwic2hvd01lc3NhZ2VzIiwibWVzc2FnZVBhZ2VOYXZpZ2F0aW9uQ2FsbGJhY2siLCJoYW5kbGVTaGVsbEJhY2siLCJzaGVsbEJhY2siLCJvUmVzb3VyY2VCdW5kbGUiLCJMaWJyYXJ5IiwiZ2V0UmVzb3VyY2VCdW5kbGVGb3IiLCJfcm91dGluZyIsIm5hdmlnYXRlVG9NZXNzYWdlUGFnZSIsImdldFRleHQiLCJjYXRjaCIsIkNvbnRyb2xsZXJFeHRlbnNpb24iLCJfYXBwbHlEZWNvcmF0ZWREZXNjcmlwdG9yIiwiT2JqZWN0IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIl0sInNvdXJjZVJvb3QiOiIuIiwic291cmNlcyI6WyJNZXNzYWdlSGFuZGxlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCBkZWVwRXF1YWwgZnJvbSBcInNhcC9iYXNlL3V0aWwvZGVlcEVxdWFsXCI7XG5pbXBvcnQgdWlkIGZyb20gXCJzYXAvYmFzZS91dGlsL3VpZFwiO1xuaW1wb3J0IHsgZGVmaW5lVUk1Q2xhc3MsIGV4dGVuc2libGUsIGZpbmFsRXh0ZW5zaW9uLCBwcml2YXRlRXh0ZW5zaW9uLCBwdWJsaWNFeHRlbnNpb24gfSBmcm9tIFwic2FwL2ZlL2Jhc2UvQ2xhc3NTdXBwb3J0XCI7XG5pbXBvcnQgQ29tbW9uVXRpbHMgZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgdHlwZSBQYWdlQ29udHJvbGxlciBmcm9tIFwic2FwL2ZlL2NvcmUvUGFnZUNvbnRyb2xsZXJcIjtcbmltcG9ydCB0eXBlIHtcblx0TWVzc2FnZVRlY2huaWNhbERldGFpbHMsXG5cdE1lc3NhZ2VVSURlY2lzaW9ucyxcblx0U2hvd01lc3NhZ2VQYXJhbWV0ZXJzLFxuXHRTdXBwb3J0ZWRVSUVsZW1lbnRcbn0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL21lc3NhZ2VIYW5kbGVyL21lc3NhZ2VIYW5kbGluZ1wiO1xuaW1wb3J0IG1lc3NhZ2VIYW5kbGluZyBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvbWVzc2FnZUhhbmRsZXIvbWVzc2FnZUhhbmRsaW5nXCI7XG5pbXBvcnQgdHlwZSB7IEludGVybmFsTW9kZWxDb250ZXh0IH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTW9kZWxIZWxwZXJcIjtcbmltcG9ydCB0eXBlIERpYWxvZyBmcm9tIFwic2FwL20vRGlhbG9nXCI7XG5pbXBvcnQgdHlwZSBDb250cm9sIGZyb20gXCJzYXAvdWkvY29yZS9Db250cm9sXCI7XG5pbXBvcnQgTGlicmFyeSBmcm9tIFwic2FwL3VpL2NvcmUvTGliXCI7XG5pbXBvcnQgTWVzc2FnaW5nIGZyb20gXCJzYXAvdWkvY29yZS9NZXNzYWdpbmdcIjtcbmltcG9ydCB0eXBlIE1lc3NhZ2UgZnJvbSBcInNhcC91aS9jb3JlL21lc3NhZ2UvTWVzc2FnZVwiO1xuaW1wb3J0IE1lc3NhZ2VUeXBlIGZyb20gXCJzYXAvdWkvY29yZS9tZXNzYWdlL01lc3NhZ2VUeXBlXCI7XG5pbXBvcnQgQ29udHJvbGxlckV4dGVuc2lvbiBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL0NvbnRyb2xsZXJFeHRlbnNpb25cIjtcbmltcG9ydCBPdmVycmlkZUV4ZWN1dGlvbiBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL092ZXJyaWRlRXhlY3V0aW9uXCI7XG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvQ29udGV4dFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFWNENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5cbnR5cGUgT2JqZWN0V2l0aENvbnZlcnRlclR5cGUgPSBvYmplY3QgJiB7XG5cdGNvbnZlcnRlclR5cGU6IHN0cmluZztcbn07XG50eXBlIE5hdmlnYXRpb25Ub0Vycm9yUGFnZVBhcmFtZXRlciA9IHtcblx0Y3VzdG9tTWVzc2FnZXM/OiBDdXN0b21NZXNzYWdlW107XG5cdGNvbmN1cnJlbnRFZGl0RmxhZz86IGJvb2xlYW47XG5cdGlzRGF0YVJlY2VpdmVkRXJyb3I/OiBib29sZWFuO1xuXHR0aXRsZT86IHN0cmluZztcblx0ZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cdGlzSW5pdGlhbExvYWQ1MDNFcnJvcj86IGJvb2xlYW47XG59O1xuZXhwb3J0IHR5cGUgTmF2aWdhdGlvblRvRXJyb3JQYWdlUmVzdWx0ID0ge1xuXHR0aXRsZT86IHN0cmluZztcblx0ZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cdGVycm9yVHlwZT86IHN0cmluZztcblx0bmF2aWdhdGVCYWNrVG9PcmlnaW4/OiBib29sZWFuO1xuXHRoYW5kbGVTaGVsbEJhY2s/OiBib29sZWFuO1xufTtcbmV4cG9ydCB0eXBlIEN1c3RvbU1lc3NhZ2UgPSB7XG5cdGNvZGU6IHN0cmluZztcblx0dGV4dDogc3RyaW5nO1xuXHRwZXJzaXN0ZW50OiBib29sZWFuO1xuXHR0eXBlOiBNZXNzYWdlVHlwZTtcbn07XG5leHBvcnQgdHlwZSBTaG93TWVzc2FnZURpYWxvZ1BhcmFtZXRlciA9IHtcblx0Y3VzdG9tTWVzc2FnZXM/OiBDdXN0b21NZXNzYWdlW107XG5cdGlzT3BlcmF0aW9uRGlhbG9nT3Blbj86IGJvb2xlYW47XG5cdGNvbnRleHQ/OiBDb250ZXh0O1xuXHRjb25jdXJyZW50RWRpdEZsYWc/OiBib29sZWFuO1xuXHRjb250cm9sPzogQ29udHJvbDtcblx0c0FjdGlvbk5hbWU/OiBzdHJpbmc7XG5cdGFTZWxlY3RlZENvbnRleHRzPzogQ29udGV4dCB8IENvbnRleHRbXSB8IG51bGw7XG5cdG9uQmVmb3JlU2hvd01lc3NhZ2U/OiAobWVzc2FnZXM6IE1lc3NhZ2VbXSwgc2hvd01lc3NhZ2VQYXJhbWV0ZXJzOiBTaG93TWVzc2FnZVBhcmFtZXRlcnMpID0+IFNob3dNZXNzYWdlUGFyYW1ldGVycztcblx0dW5Ib2xkS2V5Pzogc3RyaW5nO1xuXHRvdmVycmlkZVVJRGVjaXNpb24/OiBib29sZWFuO1xuXHRzaG93Qm91bmRTdGF0ZU1lc3NhZ2VzPzogYm9vbGVhbjtcblx0Ym91bmRBY3Rpb25OYW1lPzogc3RyaW5nO1xuXHRlbnRpdHlTZXQ/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBTaG93TWVzc2FnZXNQYXJhbWV0ZXJzID0gU2hvd01lc3NhZ2VEaWFsb2dQYXJhbWV0ZXIgJiB7XG5cdG1lc3NhZ2VQYWdlTmF2aWdhdGlvbkNhbGxiYWNrPzogRnVuY3Rpb247XG5cdHNoZWxsQmFjaz86IEZ1bmN0aW9uIHwgYm9vbGVhbjtcblx0aXNEYXRhUmVjZWl2ZWRFcnJvcj86IGJvb2xlYW47XG5cdGlzSW5pdGlhbExvYWQ1MDNFcnJvcj86IGJvb2xlYW47XG5cdHRpdGxlPzogc3RyaW5nO1xuXHRkZXNjcmlwdGlvbj86IHN0cmluZztcbn07XG4vKipcbiAqXG4gKiBEZWZpbmVzIHRoZSBtZXNzYWdlIGRldGFpbCByZWxldmFudCBmb3IgdGhlIE1lc3NhZ2VCdXR0b24gYnVpbGRpbmcgYmxvY2sgdG8gZGlzcGxheSBhIHBvcG92ZXIuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCB0eXBlIE1lc3NhZ2VEZXRhaWwgPSB7XG5cdG1lc3NhZ2U6IE1lc3NhZ2U7XG5cdGdyb3VwTmFtZT86IHN0cmluZztcblx0YWN0aXZlVGl0bGVIYW5kbGVyPzogRnVuY3Rpb247XG59O1xuXG4vKipcbiAqIEEgY29udHJvbGxlciBleHRlbnNpb24gb2ZmZXJpbmcgbWVzc2FnZSBoYW5kbGluZy5cbiAqIEBoaWRlY29uc3RydWN0b3JcbiAqIEBwdWJsaWNcbiAqIEBleHBlcmltZW50YWwgQXMgb2YgdmVyc2lvbiAxLjkwLjBcbiAqIEBzaW5jZSAxLjkwLjBcbiAqL1xuQGRlZmluZVVJNUNsYXNzKFwic2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuTWVzc2FnZUhhbmRsZXJcIilcbmNsYXNzIE1lc3NhZ2VIYW5kbGVyIGV4dGVuZHMgQ29udHJvbGxlckV4dGVuc2lvbiB7XG5cdHByaXZhdGUgc3RyaWN0V2FybmluZ01lc3NhZ2VzOiBNZXNzYWdlW10gPSBbXTtcblxuXHRwcm90ZWN0ZWQgYmFzZSE6IFBhZ2VDb250cm9sbGVyO1xuXG5cdHByb3RlY3RlZCBob2xkS2V5czogc3RyaW5nW10gPSBbXTtcblxuXHRwcm90ZWN0ZWQgdWlEZWNpc2lvbnM6IE1lc3NhZ2VVSURlY2lzaW9ucyB8IHVuZGVmaW5lZDtcblxuXHRwcml2YXRlIGhvbGRNc2dzVG9TaG93ID0gZmFsc2U7XG5cblx0Ly8gV2UgYXdhaXQgc2hvd01lc3NhZ2VEaWFsb2cgdW50aWwgdGhlIFVJIGVsZW1lbnQgaXMgYXZhaWxhYmxlLlxuXHRwcml2YXRlIHVpRWxlbWVudElzQXZhaWxhYmxlID0gUHJvbWlzZS5yZXNvbHZlKCk7XG5cblx0Y29uc3RydWN0b3IoKSB7XG5cdFx0c3VwZXIoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBBZGRzIHdhcm5pbmcgbWVzc2FnZXMgdG8gdGhlIG1lc3NhZ2UgaGFuZGxlci5cblx0ICogQHBhcmFtIGFNZXNzYWdlcyBUaGUgc3RyaWN0IHdhcm5pbmcgbWVzc2FnZXMgdG8gYmUgYWRkZWRcblx0ICovXG5cdGFkZFdhcm5pbmdNZXNzYWdlc1RvTWVzc2FnZUhhbmRsZXIoYU1lc3NhZ2VzOiBNZXNzYWdlW10pOiB2b2lkIHtcblx0XHR0aGlzLnN0cmljdFdhcm5pbmdNZXNzYWdlcyA9IHRoaXMuc3RyaWN0V2FybmluZ01lc3NhZ2VzLmNvbmNhdChhTWVzc2FnZXMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIERldGVybWluZXMgd2hldGhlciBvciBub3QgYSBtZXNzYWdlIGlzIGEgc3RyaWN0IHdhcm5pbmcgbWVzc2FnZSB0aGF0IHdhcyByZWNlaXZlZCBwcmV2aW91c2x5LlxuXHQgKiBAcGFyYW0gb01lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gYmUgY2hlY2tlZFxuXHQgKiBAcmV0dXJucyBXaGV0aGVyIG9yIG5vdCB0aGUgbWVzc2FnZSBpcyBhIHN0cmljdCB3YXJuaW5nIG1lc3NhZ2Vcblx0ICovXG5cdGlzU3RyaWN0V2FybmluZ01lc3NhZ2Uob01lc3NhZ2U6IE1lc3NhZ2UpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gKFxuXHRcdFx0dGhpcy5zdHJpY3RXYXJuaW5nTWVzc2FnZXMuZmluZCgobWVzc2FnZSkgPT4ge1xuXHRcdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHRcdG1lc3NhZ2UuZ2V0Q29kZSgpID09PSBvTWVzc2FnZS5nZXRDb2RlKCkgJiZcblx0XHRcdFx0XHRtZXNzYWdlLmdldE1lc3NhZ2UoKSA9PT0gb01lc3NhZ2UuZ2V0TWVzc2FnZSgpICYmXG5cdFx0XHRcdFx0bWVzc2FnZS5nZXRUeXBlKCkgPT09IG9NZXNzYWdlLmdldFR5cGUoKSAmJlxuXHRcdFx0XHRcdG1lc3NhZ2UuZ2V0RGVzY3JpcHRpb25VcmwoKSA9PT0gb01lc3NhZ2UuZ2V0RGVzY3JpcHRpb25VcmwoKSAmJlxuXHRcdFx0XHRcdGRlZXBFcXVhbChtZXNzYWdlLmdldFRhcmdldHMoKSwgb01lc3NhZ2UuZ2V0VGFyZ2V0cygpKSAmJlxuXHRcdFx0XHRcdG1lc3NhZ2UuZ2V0UGVyc2lzdGVudCgpID09PSBvTWVzc2FnZS5nZXRQZXJzaXN0ZW50KClcblx0XHRcdFx0KTtcblx0XHRcdH0pICE9PSB1bmRlZmluZWRcblx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENsZWFycyBhbGwgc3RyaWN0IHdhcm5pbmcgbWVzc2FnZXMgZnJvbSB0aGUgbWVzc2FnZSBoYW5kbGVyLlxuXHQgKi9cblx0Y2xlYXJTdHJpY3RXYXJuaW5nTWVzc2FnZXMoKTogdm9pZCB7XG5cdFx0dGhpcy5zdHJpY3RXYXJuaW5nTWVzc2FnZXMgPSBbXTtcblx0fVxuXG5cdGZpbHRlckVycm9yTWVzc2FnZXMobWVzc2FnZXM6IE1lc3NhZ2VbXSk6IE1lc3NhZ2VbXSB7XG5cdFx0cmV0dXJuIG1lc3NhZ2VzLmZpbHRlcigobWVzc2FnZSkgPT4gbWVzc2FnZS5nZXRUeXBlKCkgPT09IE1lc3NhZ2VUeXBlLkVycm9yKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBEZXRlcm1pbmVzIHdoZXRoZXIgb3Igbm90IGJvdW5kIG1lc3NhZ2VzIGFyZSBzaG93biBpbiB0aGUgbWVzc2FnZSBkaWFsb2cuXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4gYnkgY29uc3VtaW5nIGNvbnRyb2xsZXJzLCBidXQgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogVGhlIG92ZXJyaWRlIGV4ZWN1dGlvbiBpczoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5PdmVycmlkZUV4ZWN1dGlvbi5JbnN0ZWFkfS5cblx0ICpcblx0ICogSWYgdGhlIGJvdW5kIG1lc3NhZ2VzIGFyZSBzaG93biB0byB0aGUgdXNlciB3aXRoIGEgZGlmZmVyZW50IGNvbnRyb2wgbGlrZSB0aGUgKFRPRE86TGluaykgTWVzc2FnZUJ1dHRvblxuXHQgKiB0aGlzIG1ldGhvZCBoYXMgdG8gYmUgb3ZlcnJpZGRlbi5cblx0ICogQHJldHVybnMgRGV0ZXJtaW5lcyB3aGV0aGVyIG9yIG5vdCBib3VuZCBtZXNzYWdlcyBhcmUgc2hvd24gaW4gdGhlIG1lc3NhZ2UgZGlhbG9nLlxuXHQgKi9cblx0QHByaXZhdGVFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5JbnN0ZWFkKVxuXHRnZXRTaG93Qm91bmRNZXNzYWdlc0luTWVzc2FnZURpYWxvZygpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBBbGxvd3MgY29uc3VtZXIgb2YgYSBtZXNzYWdlIGJ1dHRvbiBCQiB0byBkZWNpZGUgd2hpY2ggYm91bmQgbWVzc2FnZXMgc2hvdWxkIGJlIHNob3duIGFuZCBob3cuXG5cdCAqXG5cdCAqIFRoaXMgaG9vayBpcyBjYWxsZWQgd2hlbiB0aGUgbWVzc2FnZSBidXR0b24gQkIgZGV0ZWN0cyBhIGNoYW5nZSBpbiB0aGUgbWVzc2FnZSBtb2RlbC5cblx0ICogVGhlIGhvb2tzIGFsbG93cyB0byBkZWZpbmUgYmVoYXZpb3VyIGZvciBtZXNzYWdlcyBpbiB0aGUgbWVzc2FnZSBidXR0b24gQkIuXG5cdCAqXG5cdCAqIENvbnN1bWVycyB3aWxsIGJlIGFibGUgdG8gZG8gdGhlIGZvbGxvd2luZyB3aXRoIHRoaXMgaG9vay5cblx0ICpcblx0ICogMS4gRmlsdGVyIG91dCBtZXNzYWdlcyBzbyB0aGF0IHRoZXkgYXJlIG5vdCBzaG93biBvbiB0aGUgbWVzc2FnZSBidXR0b24uXG5cdCAqIDIuIGdyb3VwIHRoZSBtZXNzYWdlcyBiYXNlZCBvbiB0aGVpciBVSS5cblx0ICogMy4gcHJvdmlkZSBhIHByZXNzZXIgaGFuZGxlciBpbmNhc2UgdGhlIG1lc3NhZ2Ugc2hvdWxkIHNob3cgYXMgYSBsaW5rLlxuXHQgKiBAcGFyYW0gX21lc3NhZ2VEZXRhaWxzIE9iamVjdCBjb250YWluaW5nIHRoZSBkZXRhaWxzIHJlbGF0ZWQgdG8gdGhlIG1lc3NhZ2UuXG5cdCAqIEBwYXJhbSBfbWVzc2FnZURldGFpbHMubWVzc2FnZSBUaGUgbWVzc2FnZSBmcm9tIHRoZSBtZXNzYWdlIG1vZGVsLklkZWFsbHksIGl0IG11c3Qgbm90IGJlIG1vZGlmaWVkIGRpcmVjdGx5LlxuXHQgKiBAcGFyYW0gX21lc3NhZ2VEZXRhaWxzLmdyb3VwTmFtZSBUaGUgZ3JvdXAgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQgbWVzc2FnZS5cblx0ICogQHBhcmFtIF9tZXNzYWdlRGV0YWlscy5hY3RpdmVUaXRsZUhhbmRsZXIgRnVuY3Rpb24gdG8gaGFuZGxlIHRoZSBjbGljayBldmVudCBvbiBhIG1lc3NhZ2UgaW4gdGhlIE1lc3NhZ2VCdXR0b24gYnVpbGRpbmcgYmxvY2suXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IG11c3QgYmUgcmV0dXJuZWQgYnkgdGhlIG92ZXJyaWRkZW4gbWV0aG9kLlxuXHQgKiBAcHVibGljXG5cdCAqIEBleHBlcmltZW50YWxcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShcIkFmdGVyQXN5bmNcIilcblx0YXN5bmMgYmVmb3JlU2hvd01lc3NhZ2VCdXR0b24oX21lc3NhZ2VEZXRhaWxzOiBNZXNzYWdlRGV0YWlsW10pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblxuXHQvKipcblx0ICogUmVnaXN0ZXIgdG8gaG9sZCBtZXNzYWdlcyB1bml0bCBhIHByb2Nlc3MgaXMgY29tcGxldGUuXG5cdCAqXG5cdCAqIFRoZSBjYWxsZXIgY2FuIHJlZ2lzdGVyIHRvIGhvbGQgdGhlIG1lc3NhZ2UgaGFuZGxlciBmcm9tIHNob3dpbmcgbWVzc2FnZXMgdW50aWwgdGhlIGNhbGxlcidzIHByb2Nlc3NlcyBhcmUgY29tcGxldGVkLlxuXHQgKiBPbiByZWdpc3RlcmluZyB0aGUgY2FsbGVyIGlzIHJldHVybmVkIGEgdW5pcXVlIGtleS5cblx0ICogVGhlIG1lc3NhZ2VzIHdpbGwgbm90IGJlIHNob3duIGluIHRoZSBVSSB3aXRoIHN1YnNlcXVlbnQgJ3Nob3dNZXNzYWdlRGlhbG9nKCknIGNhbGxzLlxuXHQgKiBUaGUgY2FsbGVyIG5lZWRzIHRvIHVzZSAnc2hvd01lc3NhZ2VEaWFsb2coPGtleT4pJyBhdCB0aGUgZW5kIG9mIGFsbCBoaXMgcHJvY2Vzc2VzIHRvIHNob3cgdGhlIG1lc3NhZ2VzIGluIHRoZSBVSS5cblx0ICpcblx0ICogSWYgbXVsdGlwbGUgb3duZXJzIHJlZ2lzdGVyIHNpbXVsdGFuZW91c2x5LCB0aGVuIG1lc3NhZ2VzIGFyZSBzaG93biBpbiB0aGUgVUkgb25seSBhZnRlciAnc2hvd01lc3NhZ2VEaWFsb2coPHJlc3BlY3RpdmVfa2V5PiknIGlzIGNhbGxlZCBieSBhbGwgdGhlIHByb2Nlc3Nlcycgb3duZXJzLlxuXHQgKiBAcGFyYW0ga2V5IFVuaXF1ZSBpZGVudGlmaWVyIHRvIHVzZSwgSWYgbm90IHByb3ZpZGVkLCBhIFVJRCB3b3VsZCBiZSBjcmVhdGVkIGFuZCB1c2VkIHRvIHJlZ2lzdGVyLlxuXHQgKiBAcmV0dXJucyBVbmlxdWUgS2V5IHRvIGJlIHVzZWQgYnkgdGhlIGNhbGxlciB0byBzaG93IG1lc3NhZ2VzIGF0IGEgbGF0ZXIgcG9pbnQgb2YgdGltZS5cblx0ICovXG5cdHJlZ2lzdGVyVG9Ib2xkTWVzc2FnZXMoa2V5Pzogc3RyaW5nKTogc3RyaW5nIHtcblx0XHRjb25zdCB1bmlxdWVLZXkgPSBrZXkgPz8gdWlkKCk7XG5cdFx0aWYgKCF0aGlzLmhvbGRLZXlzLmluY2x1ZGVzKHVuaXF1ZUtleSkpIHtcblx0XHRcdHRoaXMuaG9sZEtleXMucHVzaCh1bmlxdWVLZXkpO1xuXHRcdH1cblx0XHRyZXR1cm4gdW5pcXVlS2V5O1xuXHR9XG5cblx0LyoqXG5cdCAqIENsZWFyIGFsbCBleGlzdGluZyBoZWxkIGtleXMuXG5cdCAqL1xuXHRyZXNldEhvbGRLZXlzKCk6IHZvaWQge1xuXHRcdHRoaXMuaG9sZEtleXMgPSBbXTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTaG93cyBhIG1lc3NhZ2UgZGlhbG9nIHdpdGggdHJhbnNpdGlvbiBtZXNzYWdlcyBpZiB0aGVyZSBhcmUgYW55LlxuXHQgKiBUaGUgbWVzc2FnZSBkaWFsb2cgaXMgc2hvd24gYXMgYSBtb2RhbCBkaWFsb2cuIE9uY2UgdGhlIHVzZXIgY29uZmlybXMgdGhlIGRpYWxvZywgYWxsIHRyYW5zaXRpb24gbWVzc2FnZXNcblx0ICogYXJlIHJlbW92ZWQgZnJvbSB0aGUgbWVzc2FnZSBtb2RlbC4gSWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBtZXNzYWdlLCBhIGxpc3Qgb2YgbWVzc2FnZXMgaXMgc2hvd24uIFRoZSB1c2VyXG5cdCAqIGNhbiBmaWx0ZXIgb24gbWVzc2FnZSB0eXBlcyBhbmQgY2FuIGRpc3BsYXkgZGV0YWlscyBhcyB3ZWxsIGFzIHRoZSBsb25nIHRleHQuIElmIHRoZXJlIGlzIG9uZSBtZXNzYWdlLFxuXHQgKiB0aGUgZGlhbG9nIGltbWVkaWF0ZWx5IHNob3dzIHRoZSBkZXRhaWxzIG9mIHRoZSBtZXNzYWdlLiBJZiB0aGVyZSBpcyBqdXN0IG9uZSBzdWNjZXNzIG1lc3NhZ2UsIGEgbWVzc2FnZVxuXHQgKiB0b2FzdCBpcyBzaG93biBpbnN0ZWFkLlxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMgUFJJVkFURVxuXHQgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCBpcyByZXNvbHZlZCBvbmNlIHRoZSB1c2VyIGNsb3NlcyB0aGUgZGlhbG9nLiBJZiB0aGVyZSBhcmUgbm8gbWVzc2FnZXNcblx0ICogdG8gYmUgc2hvd24sIHRoZSBwcm9taXNlIGlzIHJlc29sdmVkIGltbWVkaWF0ZWx5XG5cdCAqIEBwdWJsaWNcblx0ICogQGV4cGVyaW1lbnRhbCBBcyBvZiB2ZXJzaW9uIDEuOTAuMFxuXHQgKiBAc2luY2UgMS45MC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0YXN5bmMgc2hvd01lc3NhZ2VEaWFsb2cobVBhcmFtZXRlcnM/OiBTaG93TWVzc2FnZURpYWxvZ1BhcmFtZXRlcik6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vIHJlbW92ZSBzdHJpY3Qgd2FybmluZyBtZXNzYWdlcyBmcm9tIHRoZSBtZXNzYWdlIG1vZGVsIGJlZm9yZSBzaG93aW5nIHRoZSBtZXNzYWdlIGRpYWxvZ1xuXHRcdGF3YWl0IHRoaXMudWlFbGVtZW50SXNBdmFpbGFibGU7XG5cblx0XHRjb25zdCBtZXNzYWdlc0luTW9kZWwgPSBNZXNzYWdpbmcuZ2V0TWVzc2FnZU1vZGVsKCkuZ2V0RGF0YSgpO1xuXHRcdGNvbnN0IGR1cGxpY2F0ZVdhcm5pbmdNZXNzYWdlID0gbWVzc2FnZXNJbk1vZGVsLmZpbHRlcigobWVzc2FnZTogTWVzc2FnZSkgPT4ge1xuXHRcdFx0cmV0dXJuIHRoaXMuaXNTdHJpY3RXYXJuaW5nTWVzc2FnZShtZXNzYWdlKTtcblx0XHR9KTtcblx0XHRNZXNzYWdpbmcucmVtb3ZlTWVzc2FnZXMoZHVwbGljYXRlV2FybmluZ01lc3NhZ2UpO1xuXG5cdFx0Y29uc3QgY3VzdG9tTWVzc2FnZXMgPSBtUGFyYW1ldGVycyAmJiBtUGFyYW1ldGVycy5jdXN0b21NZXNzYWdlcyA/IG1QYXJhbWV0ZXJzLmN1c3RvbU1lc3NhZ2VzIDogdW5kZWZpbmVkLFxuXHRcdFx0b09QSW50ZXJuYWxCaW5kaW5nQ29udGV4dCA9IHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKSBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dDtcblx0XHRjb25zdCB2aWV3VHlwZSA9ICh0aGlzLmJhc2UuZ2V0VmlldygpLmdldFZpZXdEYXRhKCkgYXMgT2JqZWN0V2l0aENvbnZlcnRlclR5cGUpLmNvbnZlcnRlclR5cGU7XG5cdFx0Ly8gc2V0IGlzQWN0aW9uUGFyYW1ldGVyRGlhbG9nIG9wZW4gc28gdGhhdCBpdCBjYW4gYmUgdXNlZCBpbiB0aGUgY29udHJvbGxlciBleHRlbnNpb24gdG8gZGVjaWRlIHdoZXRoZXIgbWVzc2FnZSBkaWFsb2cgc2hvdWxkIG9wZW4gb3Igbm90XG5cdFx0aWYgKG1QYXJhbWV0ZXJzICYmIG1QYXJhbWV0ZXJzLmlzT3BlcmF0aW9uRGlhbG9nT3BlbiAmJiBvT1BJbnRlcm5hbEJpbmRpbmdDb250ZXh0KSB7XG5cdFx0XHRvT1BJbnRlcm5hbEJpbmRpbmdDb250ZXh0LnNldFByb3BlcnR5KFwiaXNPcGVyYXRpb25EaWFsb2dPcGVuXCIsIHRydWUpO1xuXHRcdH1cblx0XHRjb25zdCBiU2hvd0JvdW5kTWVzc2FnZXMgPSB0aGlzLmdldFNob3dCb3VuZE1lc3NhZ2VzSW5NZXNzYWdlRGlhbG9nKCk7XG5cdFx0Y29uc3Qgb0JpbmRpbmdDb250ZXh0ID0gKFxuXHRcdFx0bVBhcmFtZXRlcnMgJiYgbVBhcmFtZXRlcnMuY29udGV4dCA/IG1QYXJhbWV0ZXJzLmNvbnRleHQgOiB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dCgpXG5cdFx0KSBhcyBPRGF0YVY0Q29udGV4dDtcblx0XHQvL2NvbnN0IGJFdGFnTWVzc2FnZSA9IG1QYXJhbWV0ZXJzICYmIG1QYXJhbWV0ZXJzLmJIYXNFdGFnTWVzc2FnZTtcblx0XHQvLyByZXNldCAgaXNPcGVyYXRpb25EaWFsb2dPcGVuXG5cdFx0Ly8gY2Fubm90IGRvIHRoaXMgb3BlcmF0aW9ucy5qcyBzaW5jZSBpdCBpcyBub3QgYXdhcmUgb2YgdGhlIHZpZXdcblx0XHRpZiAob09QSW50ZXJuYWxCaW5kaW5nQ29udGV4dCkge1xuXHRcdFx0b09QSW50ZXJuYWxCaW5kaW5nQ29udGV4dC5zZXRQcm9wZXJ0eShcImlzT3BlcmF0aW9uRGlhbG9nT3BlblwiLCBmYWxzZSk7XG5cdFx0fVxuXHRcdHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPihcblx0XHRcdGZ1bmN0aW9uICh0aGlzOiBNZXNzYWdlSGFuZGxlciwgcmVzb2x2ZTogKCkgPT4gdm9pZCwgcmVqZWN0OiAoKSA9PiB2b2lkKTogdm9pZCB7XG5cdFx0XHRcdC8vIHdlIGhhdmUgdG8gc2V0IGEgdGltZW91dCB0byBiZSBhYmxlIHRvIGFjY2VzcyB0aGUgbW9zdCByZWNlbnQgbWVzc2FnZXNcblx0XHRcdFx0c2V0VGltZW91dChcblx0XHRcdFx0XHRmdW5jdGlvbiAodGhpczogTWVzc2FnZUhhbmRsZXIpOiB2b2lkIHtcblx0XHRcdFx0XHRcdC8vIFRPRE86IGdyZWF0IEFQSSAtIHdpbGwgYmUgY2hhbmdlZCBsYXRlclxuXHRcdFx0XHRcdFx0dGhpcy5wcm9jZXNzQW5kU2hvd01lc3NhZ2VzKFxuXHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycyA/PyB7fSxcblx0XHRcdFx0XHRcdFx0b0JpbmRpbmdDb250ZXh0LFxuXHRcdFx0XHRcdFx0XHRiU2hvd0JvdW5kTWVzc2FnZXMsXG5cdFx0XHRcdFx0XHRcdGN1c3RvbU1lc3NhZ2VzID8/IFtdLFxuXHRcdFx0XHRcdFx0XHRyZXNvbHZlLFxuXHRcdFx0XHRcdFx0XHRyZWplY3QsXG5cdFx0XHRcdFx0XHRcdHZpZXdUeXBlXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH0uYmluZCh0aGlzKSxcblx0XHRcdFx0XHQwXG5cdFx0XHRcdCk7XG5cdFx0XHR9LmJpbmQodGhpcylcblx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFByb2Nlc3MgdGhlIG1lc3NhZ2VzIGFuZCBzaG93IHRoZW0gd2hlbiBleHBlY3RlZC5cblx0ICpcblx0ICogV2UgZmlsdGVyIHRoZSBtZXNzYWdlcyB0byBzaG93IGFuZCBob2xkIHRoZW0gdW50aWwgYWxsIHJlZ2lzdGVyZWQgcHJvY2Vzc2VzIGNhbGwgc2hvd01lc3NhZ2VEaWFsb2cgd2l0aCB0aGVpciByZXNwZWN0aXZlIGhlbGQga2V5cy5cblx0ICogQHBhcmFtIHBhcmFtZXRlcnMgUGFyYW1ldGVycyB0byBzaG93IG1lc3NhZ2UgZGlhbG9nLlxuXHQgKiBAcGFyYW0gYmluZGluZ0NvbnRleHQgQmluZCBjb250ZXh0IG9mIHRoZSBwYWdlLlxuXHQgKiBAcGFyYW0gc2hvd0JvdW5kVHJhbnNpdGlvbk1lc3NhZ2VzIFNob3VsZCBib3VuZCBtZXNzYWdlcyBiZSBzaG93bi5cblx0ICogQHBhcmFtIGN1c3RvbU1lc3NhZ2VzIEN1c3RvbSBtZXNzYWdlcyB0byBhZGQuXG5cdCAqIEBwYXJhbSBzdWNjZXNzIFN1Y2Nlc3MgY2FsbGJhY2suXG5cdCAqIEBwYXJhbSBmYWlsdXJlIEZhaWx1cmUgY2FsbGJhY2suXG5cdCAqIEBwYXJhbSB2aWV3VHlwZSBWaWV3IHR5cGUsIGxpc3QgcmVwb3J0IG9yIG9iamVjdCBwYWdlLlxuXHQgKi9cblx0cHJvY2Vzc0FuZFNob3dNZXNzYWdlcyhcblx0XHRwYXJhbWV0ZXJzOiBTaG93TWVzc2FnZURpYWxvZ1BhcmFtZXRlcixcblx0XHRiaW5kaW5nQ29udGV4dDogT0RhdGFWNENvbnRleHQsXG5cdFx0c2hvd0JvdW5kVHJhbnNpdGlvbk1lc3NhZ2VzOiBib29sZWFuLFxuXHRcdGN1c3RvbU1lc3NhZ2VzOiBDdXN0b21NZXNzYWdlW10sXG5cdFx0c3VjY2VzczogKCkgPT4gdm9pZCxcblx0XHRmYWlsdXJlOiAoKSA9PiB2b2lkLFxuXHRcdHZpZXdUeXBlPzogc3RyaW5nXG5cdCk6IHZvaWQge1xuXHRcdGNvbnN0IHtcblx0XHRcdGNvbmN1cnJlbnRFZGl0RmxhZyxcblx0XHRcdGNvbnRyb2wsXG5cdFx0XHRzQWN0aW9uTmFtZSxcblx0XHRcdG9uQmVmb3JlU2hvd01lc3NhZ2UsXG5cdFx0XHR1bkhvbGRLZXksXG5cdFx0XHRpc09wZXJhdGlvbkRpYWxvZ09wZW46IGZvcmNlU2hvd1VJRWxlbWVudCA9IGZhbHNlLFxuXHRcdFx0b3ZlcnJpZGVVSURlY2lzaW9uLFxuXHRcdFx0c2hvd0JvdW5kU3RhdGVNZXNzYWdlc1xuXHRcdH0gPSBwYXJhbWV0ZXJzO1xuXHRcdHRoaXMuaG9sZE1zZ3NUb1Nob3cgPSB0cnVlO1xuXG5cdFx0Ly8gQ3JlYXRlIGEgVUkgZGVjaXNpb24uXG5cdFx0Y29uc3QgbmV3VUlEZWNpc2lvbnMgPSBtZXNzYWdlSGFuZGxpbmcuZ2V0VUlEZWNpc2lvbnMoXG5cdFx0XHRjdXN0b21NZXNzYWdlcyxcblx0XHRcdGJpbmRpbmdDb250ZXh0LFxuXHRcdFx0c2hvd0JvdW5kVHJhbnNpdGlvbk1lc3NhZ2VzLFxuXHRcdFx0Y29uY3VycmVudEVkaXRGbGFnLFxuXHRcdFx0Y29udHJvbCxcblx0XHRcdHNBY3Rpb25OYW1lLFxuXHRcdFx0b25CZWZvcmVTaG93TWVzc2FnZSxcblx0XHRcdHZpZXdUeXBlLFxuXHRcdFx0c2hvd0JvdW5kU3RhdGVNZXNzYWdlcyxcblx0XHRcdHBhcmFtZXRlcnNcblx0XHQpO1xuXHRcdHRoaXMudXBkYXRlVUlEZWNpc2lvbnMobmV3VUlEZWNpc2lvbnMsIG92ZXJyaWRlVUlEZWNpc2lvbik7XG5cdFx0dGhpcy5yZW1vdmVIb2xkS2V5KHVuSG9sZEtleSA/PyBjb250cm9sPy5nZXRJZCgpKTtcblx0XHR0aGlzLnNob3dNZXNzYWdlc1dpdGhDb25kdGlvbnMoZm9yY2VTaG93VUlFbGVtZW50LCBzdWNjZXNzLCBmYWlsdXJlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTaG93IE1lc3NhZ2VzIGluIHRoZSBVSSBiYXNlZCBvbiBjb25kaXRpb25zLlxuXHQgKiBAcGFyYW0gZm9yY2VTaG93VUlFbGVtZW50XG5cdCAqIEBwYXJhbSBzdWNjZXNzXG5cdCAqIEBwYXJhbSBmYWlsdXJlXG5cdCAqL1xuXHRhc3luYyBzaG93TWVzc2FnZXNXaXRoQ29uZHRpb25zKFxuXHRcdGZvcmNlU2hvd1VJRWxlbWVudCA9IGZhbHNlLFxuXHRcdHN1Y2Nlc3M/OiAocmV0PzogdW5rbm93bikgPT4gdm9pZCxcblx0XHRmYWlsdXJlPzogKGVycj86IHVua25vd24pID0+IHZvaWRcblx0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3Qgc2hvd1VJRWxlbWVudCA9IGZvcmNlU2hvd1VJRWxlbWVudCB8fCB0aGlzLmNoZWNrVG9TaG93VUlFbGVtZW50KCk7XG5cdFx0aWYgKHNob3dVSUVsZW1lbnQgJiYgdGhpcy51aURlY2lzaW9ucykge1xuXHRcdFx0Ly8gU2hvdyBVSSBlbGVtZW50IGZvciB0aGUgcHJlc2VudCBkZWNpc2lvbiBhbmQgY2xlYXIgdGhlIGRlY2lzaW9uLlxuXHRcdFx0dHJ5IHtcblx0XHRcdFx0dGhpcy51aUVsZW1lbnRJc0F2YWlsYWJsZSA9IG1lc3NhZ2VIYW5kbGluZy5zaG93TWVzc2FnZXNJblVJKHRoaXMudWlEZWNpc2lvbnMpO1xuXHRcdFx0XHRjb25zdCByZXQgPSBhd2FpdCB0aGlzLnVpRWxlbWVudElzQXZhaWxhYmxlO1xuXHRcdFx0XHRzdWNjZXNzPy4ocmV0KTtcblx0XHRcdH0gY2F0Y2ggKGVycjogdW5rbm93bikge1xuXHRcdFx0XHRMb2cuZXJyb3IoYEZFIDogVjQgOiBNZXNzYWdlSGFuZGxlciA6IEVycm9yIG9uIHRyeWluZyB0byBzaG93IFVJIGVsZW1lbnQ6ICR7ZXJyfWApO1xuXHRcdFx0XHR0aGlzLnVpRWxlbWVudElzQXZhaWxhYmxlID0gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0XHRcdGZhaWx1cmU/LihlcnIpO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy51aURlY2lzaW9ucyA9IHVuZGVmaW5lZDtcblx0XHRcdHRoaXMuY2xlYXJTdHJpY3RXYXJuaW5nTWVzc2FnZXMoKTtcblx0XHRcdHRoaXMuaG9sZE1zZ3NUb1Nob3cgPSBmYWxzZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0TG9nLmluZm8oXCJGRSA6IFY0IDogTWVzc2FnZUhhbmRsZXIgOiBIb2xkaW5nIG1lc3NhZ2VzIHVudGlsIGEgcmVnaXN0ZXJlZCBwcm9jZXNzIFwiKTtcblx0XHRcdHN1Y2Nlc3M/LigpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBZb3UgY2FuIHJlbW92ZSB0aGUgZXhpc3RpbmcgdHJhbnNpdGlvbiBtZXNzYWdlIGZyb20gdGhlIG1lc3NhZ2UgbW9kZWwgd2l0aCB0aGlzIG1ldGhvZC5cblx0ICogV2l0aCBldmVyeSB1c2VyIGludGVyYWN0aW9uIHRoYXQgY2F1c2VzIHNlcnZlciBjb21tdW5pY2F0aW9uIChsaWtlIGNsaWNraW5nIG9uIGFuIGFjdGlvbiwgY2hhbmdpbmcgZGF0YSksXG5cdCAqIHRoaXMgbWV0aG9kIHJlbW92ZXMgdGhlIGV4aXN0aW5nIHRyYW5zaXRpb24gbWVzc2FnZXMgZnJvbSB0aGUgbWVzc2FnZSBtb2RlbC5cblx0ICogQHBhcmFtIFtrZWVwQm91bmRNZXNzYWdlXSBDaGVja3MgaWYgdGhlIGJvdW5kIHRyYW5zaXRpb24gbWVzc2FnZXMgYXJlIG5vdCB0byBiZSByZW1vdmVkXG5cdCAqIEBwYXJhbSBrZWVwVW5ib3VuZE1lc3NhZ2Vcblx0ICogQHBhcmFtIHNQYXRoVG9CZVJlbW92ZWRcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRyZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMoa2VlcEJvdW5kTWVzc2FnZT86IGJvb2xlYW4sIGtlZXBVbmJvdW5kTWVzc2FnZT86IGJvb2xlYW4sIHNQYXRoVG9CZVJlbW92ZWQ/OiBzdHJpbmcpOiB2b2lkIHtcblx0XHRpZiAoIWtlZXBCb3VuZE1lc3NhZ2UpIHtcblx0XHRcdG1lc3NhZ2VIYW5kbGluZy5yZW1vdmVCb3VuZFRyYW5zaXRpb25NZXNzYWdlcyhzUGF0aFRvQmVSZW1vdmVkKTtcblx0XHR9XG5cdFx0aWYgKCFrZWVwVW5ib3VuZE1lc3NhZ2UpIHtcblx0XHRcdG1lc3NhZ2VIYW5kbGluZy5yZW1vdmVVbmJvdW5kVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIE1ldGhvZCB0aGF0IHJldHVybnMgYWxsIHRoZSBwYXJhbWV0ZXJzIG5lZWRlZCB0byBoYW5kbGUgdGhlIG5hdmlnYXRpb24gdG8gdGhlIGVycm9yIHBhZ2UuXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVyc1xuXHQgKiBAcmV0dXJucyBUaGUgcGFyYW1ldGVycyBuZWNlc3NhcnkgZm9yIHRoZSBuYXZpZ2F0aW9uIHRvIHRoZSBlcnJvciBwYWdlXG5cdCAqL1xuXHRfY2hlY2tOYXZpZ2F0aW9uVG9FcnJvclBhZ2UobVBhcmFtZXRlcnM/OiBOYXZpZ2F0aW9uVG9FcnJvclBhZ2VQYXJhbWV0ZXIpOiBOYXZpZ2F0aW9uVG9FcnJvclBhZ2VSZXN1bHQgfCB1bmRlZmluZWQge1xuXHRcdGNvbnN0IGFVbmJvdW5kTWVzc2FnZXMgPSBtZXNzYWdlSGFuZGxpbmcuZ2V0TWVzc2FnZXMoKTtcblx0XHRjb25zdCBiU2hvd0JvdW5kVHJhbnNpdGlvbk1lc3NhZ2VzID0gdGhpcy5nZXRTaG93Qm91bmRNZXNzYWdlc0luTWVzc2FnZURpYWxvZygpO1xuXHRcdGNvbnN0IGFCb3VuZFRyYW5zaXRpb25NZXNzYWdlcyA9IGJTaG93Qm91bmRUcmFuc2l0aW9uTWVzc2FnZXMgPyBtZXNzYWdlSGFuZGxpbmcuZ2V0TWVzc2FnZXModHJ1ZSwgdHJ1ZSkgOiBbXTtcblx0XHRjb25zdCBhQ3VzdG9tTWVzc2FnZXMgPSBtUGFyYW1ldGVycyAmJiBtUGFyYW1ldGVycy5jdXN0b21NZXNzYWdlcyA/IG1QYXJhbWV0ZXJzLmN1c3RvbU1lc3NhZ2VzIDogW107XG5cdFx0Y29uc3QgYklzU3RpY2t5RWRpdE1vZGUgPSBDb21tb25VdGlscy5pc1N0aWNreUVkaXRNb2RlKHRoaXMuYmFzZS5nZXRWaWV3KCkpO1xuXHRcdGxldCBtTWVzc2FnZVBhZ2VQYXJhbWV0ZXJzOiBOYXZpZ2F0aW9uVG9FcnJvclBhZ2VSZXN1bHQgfCB1bmRlZmluZWQ7XG5cblx0XHQvLyBUT0RPOiBTdGljayBtb2RlIGNoZWNrIGlzIG9rYXkgYXMgbG9uZyBhcyB0aGUgY29udHJvbGxlciBleHRlbnNpb24gaXMgdXNlZCB3aXRoIHNhcC5mZS5jb3JlIGFuZCBzYXAuZmUuY29yZS5BcHBDb21wb25lbnQuXG5cdFx0Ly8gSXQgbWlnaHQgYmUgYmV0dGVyIHRvIHByb3ZpZGUgYW4gZXh0ZW5zaW9uIHRvIHRoZSBjb25zdW1lciBvZiB0aGUgY29udHJvbGxlciBleHRlbnNpb24gdG8gcHJvdmlkZSB0aGlzIHZhbHVlLlxuXG5cdFx0Ly8gVGhlIG1lc3NhZ2UgcGFnZSBjYW4gb25seSBzaG93IDEgbWVzc2FnZSB0b2RheSwgc28gd2UgbmF2aWdhdGUgdG8gaXQgd2hlbiA6XG5cdFx0Ly8gMS4gVGhlcmUgYXJlIG5vIGJvdW5kIHRyYW5zaXRpb24gbWVzc2FnZXMgdG8gc2hvdyxcblx0XHQvLyAyLiBUaGVyZSBhcmUgbm8gY3VzdG9tIG1lc3NhZ2VzIHRvIHNob3csICZcblx0XHQvLyAzLiBUaGVyZSBpcyBleGFjdGx5IDEgdW5ib3VuZCBtZXNzYWdlIGluIHRoZSBtZXNzYWdlIG1vZGVsIHdpdGggc3RhdHVzQ29kZT01MDMgYW5kIHJldHJ5LUFmdGVyIGF2YWlsYWJsZVxuXHRcdC8vIDQuIHJldHJ5QWZ0ZXIgaXMgZ3JlYXRlciB0aGFuIDEyMCBzZWNvbmRzXG5cdFx0Ly9cblx0XHQvLyBJbiBBZGRpdGlvbiwgbmF2aWdhdGluZyBhd2F5IGZyb20gYSBzdGlja3kgc2Vzc2lvbiB3aWxsIGRlc3Ryb3kgdGhlIHNlc3Npb24gc28gd2UgZG8gbm90IG5hdmlnYXRlIHRvIG1lc3NhZ2UgcGFnZSBmb3Igbm93LlxuXHRcdC8vIFRPRE86IGNoZWNrIGlmIG5hdmlnYXRpb24gc2hvdWxkIGJlIGRvbmUgaW4gc3RpY2t5IGVkaXQgbW9kZS5cblx0XHRpZiAobVBhcmFtZXRlcnM/LmlzRGF0YVJlY2VpdmVkRXJyb3IgPT09IHRydWUpIHtcblx0XHRcdG1NZXNzYWdlUGFnZVBhcmFtZXRlcnMgPSB7XG5cdFx0XHRcdHRpdGxlOiBtUGFyYW1ldGVycy50aXRsZSxcblx0XHRcdFx0ZGVzY3JpcHRpb246IG1QYXJhbWV0ZXJzLmRlc2NyaXB0aW9uLFxuXHRcdFx0XHRuYXZpZ2F0ZUJhY2tUb09yaWdpbjogdHJ1ZSxcblx0XHRcdFx0ZXJyb3JUeXBlOiBcIlBhZ2VOb3RGb3VuZFwiXG5cdFx0XHR9O1xuXHRcdH0gZWxzZSBpZiAoXG5cdFx0XHQhYklzU3RpY2t5RWRpdE1vZGUgJiZcblx0XHRcdCFhQm91bmRUcmFuc2l0aW9uTWVzc2FnZXMubGVuZ3RoICYmXG5cdFx0XHQhYUN1c3RvbU1lc3NhZ2VzLmxlbmd0aCAmJlxuXHRcdFx0KGFVbmJvdW5kTWVzc2FnZXMubGVuZ3RoID09PSAxIHx8IG1QYXJhbWV0ZXJzPy5pc0luaXRpYWxMb2FkNTAzRXJyb3IgPT09IHRydWUpXG5cdFx0KSB7XG5cdFx0XHRjb25zdCBvTWVzc2FnZSA9IGFVbmJvdW5kTWVzc2FnZXNbMF07XG5cdFx0XHRjb25zdCBvVGVjaG5pY2FsRGV0YWlscyA9IG9NZXNzYWdlLmdldFRlY2huaWNhbERldGFpbHMoKSBhcyBNZXNzYWdlVGVjaG5pY2FsRGV0YWlscyB8IHVuZGVmaW5lZDtcblx0XHRcdGlmIChvVGVjaG5pY2FsRGV0YWlscz8uaHR0cFN0YXR1cyA9PT0gNTAzKSB7XG5cdFx0XHRcdG1NZXNzYWdlUGFnZVBhcmFtZXRlcnMgPSB0aGlzLl9nZXRIVFRQNTAzTWVzc2FnZVBhcmFtZXRlcnMob01lc3NhZ2UsIG9UZWNobmljYWxEZXRhaWxzKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIG1NZXNzYWdlUGFnZVBhcmFtZXRlcnM7XG5cdH1cblxuXHRfZ2V0SFRUUDUwM01lc3NhZ2VQYXJhbWV0ZXJzKG1lc3NhZ2U6IE1lc3NhZ2UsIHRlY2huaWNhbERldGFpbHM6IE1lc3NhZ2VUZWNobmljYWxEZXRhaWxzKTogTmF2aWdhdGlvblRvRXJyb3JQYWdlUmVzdWx0IHwgdW5kZWZpbmVkIHtcblx0XHRsZXQgbWVzc2FnZVBhZ2VQYXJhbWV0ZXJzOiBOYXZpZ2F0aW9uVG9FcnJvclBhZ2VSZXN1bHQgfCB1bmRlZmluZWQ7XG5cblx0XHRjb25zdCBzZWNvbmRzQmVmb3JlUmV0cnkgPVxuXHRcdFx0dGVjaG5pY2FsRGV0YWlscy5yZXRyeUFmdGVyICE9PSB1bmRlZmluZWQgPyB0aGlzLl9nZXRTZWNvbmRzQmVmb3JlUmV0cnlBZnRlcih0ZWNobmljYWxEZXRhaWxzLnJldHJ5QWZ0ZXIpIDogdW5kZWZpbmVkO1xuXG5cdFx0aWYgKHNlY29uZHNCZWZvcmVSZXRyeSA9PT0gdW5kZWZpbmVkIHx8IHNlY29uZHNCZWZvcmVSZXRyeSA+IDEyMCkge1xuXHRcdFx0Y29uc3QgcmV0cnlBZnRlck1lc3NhZ2UgPSBtZXNzYWdlSGFuZGxpbmcuZ2V0UmV0cnlBZnRlck1lc3NhZ2UobWVzc2FnZSk7XG5cdFx0XHRtZXNzYWdlUGFnZVBhcmFtZXRlcnMgPSB7XG5cdFx0XHRcdGRlc2NyaXB0aW9uOiByZXRyeUFmdGVyTWVzc2FnZSA/IGAke3JldHJ5QWZ0ZXJNZXNzYWdlfSAke21lc3NhZ2UuZ2V0TWVzc2FnZSgpfWAgOiBtZXNzYWdlLmdldE1lc3NhZ2UoKSxcblx0XHRcdFx0bmF2aWdhdGVCYWNrVG9PcmlnaW46IHRydWUsXG5cdFx0XHRcdGVycm9yVHlwZTogXCJVbmFibGVUb0xvYWRcIlxuXHRcdFx0fTtcblx0XHR9XG5cblx0XHRyZXR1cm4gbWVzc2FnZVBhZ2VQYXJhbWV0ZXJzO1xuXHR9XG5cblx0X2dldFNlY29uZHNCZWZvcmVSZXRyeUFmdGVyKGRSZXRyeUFmdGVyOiBEYXRlKTogbnVtYmVyIHtcblx0XHRjb25zdCBkQ3VycmVudERhdGVUaW1lID0gbmV3IERhdGUoKSxcblx0XHRcdGlDdXJyZW50RGF0ZVRpbWVJbk1pbGxpU2Vjb25kcyA9IGRDdXJyZW50RGF0ZVRpbWUuZ2V0VGltZSgpLFxuXHRcdFx0aVJldHJ5QWZ0ZXJEYXRlVGltZUluTWlsbGlTZWNvbmRzID0gZFJldHJ5QWZ0ZXIuZ2V0VGltZSgpLFxuXHRcdFx0aVNlY29uZHNCZWZvcmVSZXRyeSA9IChpUmV0cnlBZnRlckRhdGVUaW1lSW5NaWxsaVNlY29uZHMgLSBpQ3VycmVudERhdGVUaW1lSW5NaWxsaVNlY29uZHMpIC8gMTAwMDtcblx0XHRyZXR1cm4gaVNlY29uZHNCZWZvcmVSZXRyeTtcblx0fVxuXG5cdC8qKlxuXHQgKiBVcGRhdGUgdGhlIGV4aXN0aW5nIFVJIGRlY2lzaW9ucyB3aXRoIHRoZSBuZXcgb25lcy5cblx0ICogQHBhcmFtIG5ld1VJRGVjaXNpb25zIEluIGNvbW1pbmcgVUkgZGVjaXNpb25zLlxuXHQgKiBAcGFyYW0gb3ZlcnJpZGVVSURlY2lzaW9uIE92ZXJyaWRlIHRoZSBleGlzdGluZyBVSSBkZWNpc2lvbiB0byBzaG93IG1lc3NhZ2VzIHdpdGggdGhlIG5ldyBvbmUuXG5cdCAqXG5cdCAqICdvdmVycmlkZVVJRGVjaXNpb24nLCBUaGlzIHdvdWxkIGJlIG5lZWRlZCB3aGVuIHRoZXJlIGlzIGEgY2hhbmdlIGluIHBhZ2UgY29udGV4dCBhbmQgdGhlIHBhcmFtdGVycyB0byBjcmVhdGUgdGhlIG5ldyBVSSBkZWNpc2lvbiBhcmUgZGlmZmVyZW50LlxuXHQgKi9cblx0dXBkYXRlVUlEZWNpc2lvbnMobmV3VUlEZWNpc2lvbnM6IE1lc3NhZ2VVSURlY2lzaW9ucywgb3ZlcnJpZGVVSURlY2lzaW9uID0gZmFsc2UpOiB2b2lkIHtcblx0XHRjb25zdCBvbGRVSURlY2lzaW9ucyA9IHRoaXMudWlEZWNpc2lvbnM7XG5cdFx0bGV0IGFsbE1lc3NhZ2VzVG9TaG93OiBNZXNzYWdlW10gPSBbXTtcblx0XHRsZXQgbWVyZ2VkVUlEZWNpc2lvbjtcblx0XHRpZiAob2xkVUlEZWNpc2lvbnMgJiYgb3ZlcnJpZGVVSURlY2lzaW9uID09PSBmYWxzZSkge1xuXHRcdFx0aWYgKFxuXHRcdFx0XHRvbGRVSURlY2lzaW9ucy5tZXNzYWdlc1RvU2hvdy5sZW5ndGggPT09IDEgJiZcblx0XHRcdFx0bmV3VUlEZWNpc2lvbnMubWVzc2FnZXNUb1Nob3cubGVuZ3RoID09PSAxICYmXG5cdFx0XHRcdG9sZFVJRGVjaXNpb25zLm1lc3NhZ2VzVG9TaG93WzBdLmdldENvZGUoKSA9PT0gXCJDX0NPTU1PTl9TVUNDRVNTX01FU1NBR0VcIiAmJlxuXHRcdFx0XHRuZXdVSURlY2lzaW9ucy5tZXNzYWdlc1RvU2hvd1swXS5nZXRDb2RlKCkgPT09IFwiQ19DT01NT05fU1VDQ0VTU19NRVNTQUdFXCJcblx0XHRcdCkge1xuXHRcdFx0XHQvLyBDaGVjayBpZiBib3RoIGFyZSBnZW5lcmljIHN1Y2Nlc3MgbWVzc2FnZXMsIHRoZW4gd2Ugc2hvdyBvbmx5IG9uZSBtZXNzYWdlLlxuXHRcdFx0XHRhbGxNZXNzYWdlc1RvU2hvdyA9IG9sZFVJRGVjaXNpb25zLm1lc3NhZ2VzVG9TaG93O1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0YWxsTWVzc2FnZXNUb1Nob3cgPSBBcnJheS5mcm9tKG5ldyBTZXQoWy4uLm9sZFVJRGVjaXNpb25zLm1lc3NhZ2VzVG9TaG93LCAuLi5uZXdVSURlY2lzaW9ucy5tZXNzYWdlc1RvU2hvd10pKTtcblx0XHRcdH1cblx0XHRcdGNvbnN0IGVsZW1lbnRzID0gW29sZFVJRGVjaXNpb25zLnVpRWxlbWVudFRvVXNlLCBuZXdVSURlY2lzaW9ucy51aUVsZW1lbnRUb1VzZV07XG5cdFx0XHQvLyBEZWZhdWx0IHdlIHNob3cgZGlhbG9nXG5cdFx0XHRsZXQgdWlFbGVtZW50VG9Vc2U6IFN1cHBvcnRlZFVJRWxlbWVudCA9IGFsbE1lc3NhZ2VzVG9TaG93Lmxlbmd0aCA+IDAgPyBcIkRpYWxvZ1wiIDogXCJOb25lXCI7XG5cblx0XHRcdGlmIChhbGxNZXNzYWdlc1RvU2hvdy5sZW5ndGggPT09IDEpIHtcblx0XHRcdFx0Ly8gU2luZ2xlIG1lc3NhZ2UsIHdlIGNoZWNrIGZvciBzcGVjaWZpYyBVSSBFbGVtZW50IHRvIHVzZS5cblx0XHRcdFx0aWYgKGVsZW1lbnRzLmluY2x1ZGVzKFwiVG9hc3RcIikpIHtcblx0XHRcdFx0XHR1aUVsZW1lbnRUb1VzZSA9IFwiVG9hc3RcIjtcblx0XHRcdFx0fSBlbHNlIGlmIChlbGVtZW50cy5pbmNsdWRlcyhcIkJveFwiKSkge1xuXHRcdFx0XHRcdHVpRWxlbWVudFRvVXNlID0gXCJCb3hcIjtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRtZXJnZWRVSURlY2lzaW9uID0ge1xuXHRcdFx0XHRtZXNzYWdlc1RvU2hvdzogYWxsTWVzc2FnZXNUb1Nob3csXG5cdFx0XHRcdHVpRWxlbWVudFRvVXNlLFxuXHRcdFx0XHRjb250ZXh0TmVlZHNFdGFnUmVmcmVzaDogb2xkVUlEZWNpc2lvbnMuY29udGV4dE5lZWRzRXRhZ1JlZnJlc2ggfHwgbmV3VUlEZWNpc2lvbnMuY29udGV4dE5lZWRzRXRhZ1JlZnJlc2gsXG5cdFx0XHRcdGNvbnRhaW5zQm91bmRUcmFuc2l0aW9uOiBvbGRVSURlY2lzaW9ucy5jb250YWluc0JvdW5kVHJhbnNpdGlvbiB8fCBuZXdVSURlY2lzaW9ucy5jb250YWluc0JvdW5kVHJhbnNpdGlvblxuXHRcdFx0fTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bWVyZ2VkVUlEZWNpc2lvbiA9IG5ld1VJRGVjaXNpb25zO1xuXHRcdH1cblxuXHRcdHRoaXMudWlEZWNpc2lvbnMgPSBtZXJnZWRVSURlY2lzaW9uO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlbW92ZSBoZWxkIGtleS5cblx0ICogQHBhcmFtIGluS2V5IEtleSB0byByZW1vdmUuXG5cdCAqL1xuXHRyZW1vdmVIb2xkS2V5KGluS2V5Pzogc3RyaW5nKTogdm9pZCB7XG5cdFx0aWYgKGluS2V5ICYmIHRoaXMuaG9sZEtleXMuaW5jbHVkZXMoaW5LZXkpKSB7XG5cdFx0XHR0aGlzLmhvbGRLZXlzLnNwbGljZSh0aGlzLmhvbGRLZXlzLmluZGV4T2YoaW5LZXkpLCAxKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2sgaWYgVUkgRWxlbWVudCB3aXRoIG1lc3NhZ2VzIHNob3VsZCBiZSBzaG93bi5cblx0ICogQHJldHVybnMgQm9vbGVhblxuXHQgKi9cblx0Y2hlY2tUb1Nob3dVSUVsZW1lbnQoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuaG9sZE1zZ3NUb1Nob3cgJiYgKHRoaXMuaG9sZEtleXMubGVuZ3RoID4gMCA/IGZhbHNlIDogdHJ1ZSk7XG5cdH1cblxuXHQvKipcblx0ICogSG9sZCBtZXNzYWdlcyBmb3IgdGhlIGNvbnRyb2wuXG5cdCAqIEBwYXJhbSBjb250cm9sXG5cdCAqL1xuXHRob2xkTWVzc2FnZXNGb3JDb250cm9sKGNvbnRyb2w6IENvbnRyb2wpOiB2b2lkIHtcblx0XHRjb25zdCBpZGVudGlmaWVyID0gY29udHJvbC5nZXRJZCgpO1xuXHRcdHRoaXMucmVnaXN0ZXJUb0hvbGRNZXNzYWdlcyhpZGVudGlmaWVyKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZWxlYXNlIG1lc3NhZ2UgaG9sZCBieSBhIGNvbnRyb2wuXG5cdCAqIEBwYXJhbSBjb250cm9sXG5cdCAqL1xuXHRhc3luYyByZWxlYXNlSG9sZEJ5Q29udHJvbChjb250cm9sPzogQ29udHJvbCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IGlkZW50aWZpZXIgPSBjb250cm9sPy5nZXRJZCgpO1xuXHRcdHRoaXMucmVtb3ZlSG9sZEtleShpZGVudGlmaWVyKTtcblx0XHR0aGlzLnVpRWxlbWVudElzQXZhaWxhYmxlID0gdGhpcy51aUVsZW1lbnRJc0F2YWlsYWJsZS50aGVuKFxuXHRcdFx0YXN5bmMgZnVuY3Rpb24gKHRoaXM6IE1lc3NhZ2VIYW5kbGVyKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0XHRcdHJldHVybiB0aGlzLnNob3dNZXNzYWdlc1dpdGhDb25kdGlvbnMoKTtcblx0XHRcdH0uYmluZCh0aGlzKVxuXHRcdCk7XG5cdFx0YXdhaXQgdGhpcy51aUVsZW1lbnRJc0F2YWlsYWJsZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTaG93cyBhIG1lc3NhZ2UgcGFnZSBvciBhIG1lc3NhZ2UgZGlhbG9nIGJhc2VkIG9uIHRoZSBtZXNzYWdlcyBpbiB0aGUgbWVzc2FnZSBkaWFsb2cuXG5cdCAqIEBwYXJhbSBbcGFyYW1ldGVyc11cblx0ICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgb25jZSB0aGUgdXNlciBjbG9zZXMgdGhlIG1lc3NhZ2UgZGlhbG9nIG9yIHdoZW4gbmF2aWdhdGlvbiB0byB0aGUgbWVzc2FnZSBwYWdlIGlzIGNvbXBsZXRlLiBJZiB0aGVyZSBhcmUgbm8gbWVzc2FnZXNcblx0ICogdG8gYmUgc2hvd24sIHRoZSBwcm9taXNlIGlzIHJlc29sdmVkIGltbWVkaWF0ZWx5XG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0YXN5bmMgc2hvd01lc3NhZ2VzKHBhcmFtZXRlcnM/OiBTaG93TWVzc2FnZXNQYXJhbWV0ZXJzKTogUHJvbWlzZTx2b2lkIHwgYm9vbGVhbiB8IERpYWxvZz4ge1xuXHRcdGNvbnN0IG1lc3NhZ2VQYWdlUGFyYW1ldGVycyA9IHRoaXMuX2NoZWNrTmF2aWdhdGlvblRvRXJyb3JQYWdlKHBhcmFtZXRlcnMpO1xuXG5cdFx0aWYgKG1lc3NhZ2VQYWdlUGFyYW1ldGVycykge1xuXHRcdFx0Ly8gbmF2aWdhdGUgdG8gbWVzc2FnZSBwYWdlLlxuXHRcdFx0Ly8gaGFuZGxlciBiZWZvcmUgcGFnZSBuYXZpZ2F0aW9uIGlzIHRyaWdnZXJlZCwgZm9yIGV4YW1wbGUgdG8gY2xvc2UgdGhlIGFjdGlvbiBwYXJhbWV0ZXIgZGlhbG9nXG5cdFx0XHRpZiAocGFyYW1ldGVycz8ubWVzc2FnZVBhZ2VOYXZpZ2F0aW9uQ2FsbGJhY2spIHtcblx0XHRcdFx0cGFyYW1ldGVycy5tZXNzYWdlUGFnZU5hdmlnYXRpb25DYWxsYmFjaygpO1xuXHRcdFx0fVxuXG5cdFx0XHRtZXNzYWdlUGFnZVBhcmFtZXRlcnMuaGFuZGxlU2hlbGxCYWNrID0gIXBhcmFtZXRlcnM/LnNoZWxsQmFjaztcblx0XHRcdHRoaXMucmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cdFx0XHRjb25zdCBvUmVzb3VyY2VCdW5kbGUgPSBMaWJyYXJ5LmdldFJlc291cmNlQnVuZGxlRm9yKFwic2FwLmZlLmNvcmVcIikhO1xuXG5cdFx0XHRyZXR1cm4gbmV3IFByb21pc2U8Ym9vbGVhbj4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdFx0XHQvLyB3ZSBoYXZlIHRvIHNldCBhIHRpbWVvdXQgdG8gYmUgYWJsZSB0byBhY2Nlc3MgdGhlIG1vc3QgcmVjZW50IG1lc3NhZ2VzXG5cdFx0XHRcdHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0XHRcdC8vIGNsZWFyIGFsbCBob2xkIGtleXMgYXMgd2UgbmF2aWdhdGUgdG8gbWVzc2FnZSBwYWdlLlxuXHRcdFx0XHRcdHRoaXMucmVzZXRIb2xkS2V5cygpO1xuXG5cdFx0XHRcdFx0Ly8gVE9ETzogZ3JlYXQgQVBJIC0gd2lsbCBiZSBjaGFuZ2VkIGxhdGVyXG5cdFx0XHRcdFx0dGhpcy5iYXNlLl9yb3V0aW5nXG5cdFx0XHRcdFx0XHQubmF2aWdhdGVUb01lc3NhZ2VQYWdlKFxuXHRcdFx0XHRcdFx0XHRwYXJhbWV0ZXJzPy5pc0RhdGFSZWNlaXZlZEVycm9yID09PSB0cnVlXG5cdFx0XHRcdFx0XHRcdFx0PyBvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfQ09NTU9OX1NBUEZFX0RBVEFfUkVDRUlWRURfRVJST1JcIilcblx0XHRcdFx0XHRcdFx0XHQ6IG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19NRVNTQUdFX0hBTkRMSU5HX1NBUEZFXzUwM19USVRMRVwiKSxcblx0XHRcdFx0XHRcdFx0bWVzc2FnZVBhZ2VQYXJhbWV0ZXJzXG5cdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0XHQudGhlbihyZXNvbHZlKVxuXHRcdFx0XHRcdFx0LmNhdGNoKHJlamVjdCk7XG5cdFx0XHRcdH0sIDApO1xuXHRcdFx0fSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIG5hdmlnYXRlIHRvIG1lc3NhZ2UgZGlhbG9nXG5cdFx0XHRyZXR1cm4gdGhpcy5zaG93TWVzc2FnZURpYWxvZyhwYXJhbWV0ZXJzKTtcblx0XHR9XG5cdH1cbn1cbmV4cG9ydCBkZWZhdWx0IE1lc3NhZ2VIYW5kbGVyO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0VBeUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQU5BLElBUU1BLGNBQWMsSUFBQUMsSUFBQSxHQURuQkMsY0FBYyxDQUFDLGlEQUFpRCxDQUFDLEVBQUFDLEtBQUEsR0FvRWhFQyxnQkFBZ0IsQ0FBQyxDQUFDLEVBQUFDLEtBQUEsR0FDbEJDLFVBQVUsQ0FBQ0MsaUJBQWlCLENBQUNDLE9BQU8sQ0FBQyxFQUFBQyxLQUFBLEdBd0JyQ0MsZUFBZSxDQUFDLENBQUMsRUFBQUMsS0FBQSxHQUNqQkwsVUFBVSxDQUFDLFlBQVksQ0FBQyxFQUFBTSxLQUFBLEdBOEN4QkYsZUFBZSxDQUFDLENBQUMsRUFBQUcsS0FBQSxHQUNqQkMsY0FBYyxDQUFDLENBQUMsRUFBQUMsS0FBQSxHQTZJaEJMLGVBQWUsQ0FBQyxDQUFDLEVBQUFNLEtBQUEsR0FtTGpCTixlQUFlLENBQUMsQ0FBQyxFQUFBTyxNQUFBLEdBQ2pCSCxjQUFjLENBQUMsQ0FBQyxFQUFBYixJQUFBLENBQUFpQixNQUFBLElBQUFDLE9BQUEsMEJBQUFDLG9CQUFBO0lBL2JqQixTQUFBcEIsZUFBQSxFQUFjO01BQUEsSUFBQXFCLEtBQUE7TUFDYkEsS0FBQSxHQUFBRCxvQkFB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
452
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJNZXNzYWdlSGFuZGxlciIsIl9kZWMiLCJkZWZpbmVVSTVDbGFzcyIsIl9kZWMyIiwibWV0aG9kT3ZlcnJpZGUiLCJfZGVjMyIsInByaXZhdGVFeHRlbnNpb24iLCJfZGVjNCIsImV4dGVuc2libGUiLCJPdmVycmlkZUV4ZWN1dGlvbiIsIkluc3RlYWQiLCJfZGVjNSIsInB1YmxpY0V4dGVuc2lvbiIsIl9kZWM2IiwiX2RlYzciLCJfZGVjOCIsImZpbmFsRXh0ZW5zaW9uIiwiX2RlYzkiLCJfZGVjMTAiLCJfZGVjMTEiLCJfY2xhc3MiLCJfY2xhc3MyIiwiX0NvbnRyb2xsZXJFeHRlbnNpb24iLCJfdGhpcyIsImNhbGwiLCJzdHJpY3RXYXJuaW5nTWVzc2FnZXMiLCJob2xkS2V5cyIsImhvbGRNc2dzVG9TaG93IiwiX2luaGVyaXRzTG9vc2UiLCJfcHJvdG8iLCJwcm90b3R5cGUiLCJvbkluaXQiLCJpbnRlcm5hbE1vZGVsIiwiYmFzZSIsImdldEFwcENvbXBvbmVudCIsImdldE1vZGVsIiwic2V0UHJvcGVydHkiLCJ1bmRlZmluZWQiLCJQcm9taXNlIiwicmVzb2x2ZSIsImFkZFdhcm5pbmdNZXNzYWdlc1RvTWVzc2FnZUhhbmRsZXIiLCJhTWVzc2FnZXMiLCJjb25jYXQiLCJpc1N0cmljdFdhcm5pbmdNZXNzYWdlIiwib01lc3NhZ2UiLCJmaW5kIiwibWVzc2FnZSIsImdldENvZGUiLCJnZXRNZXNzYWdlIiwiZ2V0VHlwZSIsImdldERlc2NyaXB0aW9uVXJsIiwiZGVlcEVxdWFsIiwiZ2V0VGFyZ2V0cyIsImdldFBlcnNpc3RlbnQiLCJjbGVhclN0cmljdFdhcm5pbmdNZXNzYWdlcyIsImZpbHRlckVycm9yTWVzc2FnZXMiLCJtZXNzYWdlcyIsImZpbHRlciIsIk1lc3NhZ2VUeXBlIiwiRXJyb3IiLCJnZXRTaG93Qm91bmRNZXNzYWdlc0luTWVzc2FnZURpYWxvZyIsImJlZm9yZVNob3dNZXNzYWdlQnV0dG9uIiwiX21lc3NhZ2VEZXRhaWxzIiwicmVnaXN0ZXJUb0hvbGRNZXNzYWdlcyIsImtleSIsInVuaXF1ZUtleSIsInVpZCIsImluY2x1ZGVzIiwicHVzaCIsInJlc2V0SG9sZEtleXMiLCJzaG93TWVzc2FnZURpYWxvZyIsIm1QYXJhbWV0ZXJzIiwiZ2V0UHJvcGVydHkiLCJtZXNzYWdlc0luTW9kZWwiLCJNZXNzYWdpbmciLCJnZXRNZXNzYWdlTW9kZWwiLCJnZXREYXRhIiwiZHVwbGljYXRlV2FybmluZ01lc3NhZ2UiLCJyZW1vdmVNZXNzYWdlcyIsImN1c3RvbU1lc3NhZ2VzIiwib09QSW50ZXJuYWxCaW5kaW5nQ29udGV4dCIsImdldFZpZXciLCJnZXRCaW5kaW5nQ29udGV4dCIsInZpZXdUeXBlIiwiZ2V0Vmlld0RhdGEiLCJjb252ZXJ0ZXJUeXBlIiwiaXNPcGVyYXRpb25EaWFsb2dPcGVuIiwiYlNob3dCb3VuZE1lc3NhZ2VzIiwib0JpbmRpbmdDb250ZXh0IiwiY29udGV4dCIsInJlamVjdCIsInNldFRpbWVvdXQiLCJwcm9jZXNzQW5kU2hvd01lc3NhZ2VzIiwiYmluZCIsInBhcmFtZXRlcnMiLCJiaW5kaW5nQ29udGV4dCIsInNob3dCb3VuZFRyYW5zaXRpb25NZXNzYWdlcyIsInN1Y2Nlc3MiLCJmYWlsdXJlIiwiY29uY3VycmVudEVkaXRGbGFnIiwiY29udHJvbCIsInNBY3Rpb25OYW1lIiwib25CZWZvcmVTaG93TWVzc2FnZSIsInVuSG9sZEtleSIsImZvcmNlU2hvd1VJRWxlbWVudCIsIm92ZXJyaWRlVUlEZWNpc2lvbiIsInNob3dCb3VuZFN0YXRlTWVzc2FnZXMiLCJuZXdVSURlY2lzaW9ucyIsIm1lc3NhZ2VIYW5kbGluZyIsImdldFVJRGVjaXNpb25zIiwidXBkYXRlVUlEZWNpc2lvbnMiLCJyZW1vdmVIb2xkS2V5IiwiZ2V0SWQiLCJ1aUVsZW1lbnRJc0F2YWlsYWJsZSIsInRoZW4iLCJzaG93TWVzc2FnZXNXaXRoQ29uZHRpb25zIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwic2hvd1VJRWxlbWVudCIsImNoZWNrVG9TaG93VUlFbGVtZW50IiwicmV0Iiwic2hvd01lc3NhZ2VzSW5VSSIsImVyciIsIkxvZyIsImVycm9yIiwiaW5mbyIsInJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcyIsImtlZXBCb3VuZE1lc3NhZ2UiLCJrZWVwVW5ib3VuZE1lc3NhZ2UiLCJzUGF0aFRvQmVSZW1vdmVkIiwicmVtb3ZlQm91bmRUcmFuc2l0aW9uTWVzc2FnZXMiLCJyZW1vdmVVbmJvdW5kVHJhbnNpdGlvbk1lc3NhZ2VzIiwiX2NoZWNrTmF2aWdhdGlvblRvRXJyb3JQYWdlIiwiYVVuYm91bmRNZXNzYWdlcyIsImdldE1lc3NhZ2VzIiwiYlNob3dCb3VuZFRyYW5zaXRpb25NZXNzYWdlcyIsImFCb3VuZFRyYW5zaXRpb25NZXNzYWdlcyIsImFDdXN0b21NZXNzYWdlcyIsImJJc1N0aWNreUVkaXRNb2RlIiwiQ29tbW9uVXRpbHMiLCJpc1N0aWNreUVkaXRNb2RlIiwibU1lc3NhZ2VQYWdlUGFyYW1ldGVycyIsImlzRGF0YVJlY2VpdmVkRXJyb3IiLCJ0aXRsZSIsImRlc2NyaXB0aW9uIiwibmF2aWdhdGVCYWNrVG9PcmlnaW4iLCJlcnJvclR5cGUiLCJpc0luaXRpYWxMb2FkNTAzRXJyb3IiLCJvVGVjaG5pY2FsRGV0YWlscyIsImdldFRlY2huaWNhbERldGFpbHMiLCJodHRwU3RhdHVzIiwiX2dldEhUVFA1MDNNZXNzYWdlUGFyYW1ldGVycyIsInRlY2huaWNhbERldGFpbHMiLCJtZXNzYWdlUGFnZVBhcmFtZXRlcnMiLCJzZWNvbmRzQmVmb3JlUmV0cnkiLCJyZXRyeUFmdGVyIiwiX2dldFNlY29uZHNCZWZvcmVSZXRyeUFmdGVyIiwicmV0cnlBZnRlck1lc3NhZ2UiLCJnZXRSZXRyeUFmdGVyTWVzc2FnZSIsImRSZXRyeUFmdGVyIiwiZEN1cnJlbnREYXRlVGltZSIsIkRhdGUiLCJpQ3VycmVudERhdGVUaW1lSW5NaWxsaVNlY29uZHMiLCJnZXRUaW1lIiwiaVJldHJ5QWZ0ZXJEYXRlVGltZUluTWlsbGlTZWNvbmRzIiwiaVNlY29uZHNCZWZvcmVSZXRyeSIsIm9sZFVJRGVjaXNpb25zIiwiYWxsTWVzc2FnZXNUb1Nob3ciLCJtZXJnZWRVSURlY2lzaW9uIiwibWVzc2FnZXNUb1Nob3ciLCJBcnJheSIsImZyb20iLCJTZXQiLCJlbGVtZW50cyIsInVpRWxlbWVudFRvVXNlIiwiY29udGV4dE5lZWRzRXRhZ1JlZnJlc2giLCJjb250YWluc0JvdW5kVHJhbnNpdGlvbiIsImluS2V5Iiwic3BsaWNlIiwiaW5kZXhPZiIsImhvbGRNZXNzYWdlc0ZvckNvbnRyb2wiLCJpZGVudGlmaWVyIiwicmVsZWFzZUhvbGRCeUNvbnRyb2wiLCJzaG93TWVzc2FnZXMiLCJtZXNzYWdlUGFnZU5hdmlnYXRpb25DYWxsYmFjayIsImhhbmRsZVNoZWxsQmFjayIsInNoZWxsQmFjayIsIm9SZXNvdXJjZUJ1bmRsZSIsIkxpYnJhcnkiLCJnZXRSZXNvdXJjZUJ1bmRsZUZvciIsIl9yb3V0aW5nIiwibmF2aWdhdGVUb01lc3NhZ2VQYWdlIiwiZ2V0VGV4dCIsImNhdGNoIiwiQ29udHJvbGxlckV4dGVuc2lvbiIsIl9hcHBseURlY29yYXRlZERlc2NyaXB0b3IiLCJPYmplY3QiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIk1lc3NhZ2VIYW5kbGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IGRlZXBFcXVhbCBmcm9tIFwic2FwL2Jhc2UvdXRpbC9kZWVwRXF1YWxcIjtcbmltcG9ydCB1aWQgZnJvbSBcInNhcC9iYXNlL3V0aWwvdWlkXCI7XG5pbXBvcnQgeyBkZWZpbmVVSTVDbGFzcywgZXh0ZW5zaWJsZSwgZmluYWxFeHRlbnNpb24sIG1ldGhvZE92ZXJyaWRlLCBwcml2YXRlRXh0ZW5zaW9uLCBwdWJsaWNFeHRlbnNpb24gfSBmcm9tIFwic2FwL2ZlL2Jhc2UvQ2xhc3NTdXBwb3J0XCI7XG5pbXBvcnQgQ29tbW9uVXRpbHMgZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgdHlwZSBQYWdlQ29udHJvbGxlciBmcm9tIFwic2FwL2ZlL2NvcmUvUGFnZUNvbnRyb2xsZXJcIjtcbmltcG9ydCB0eXBlIHtcblx0TWVzc2FnZVRlY2huaWNhbERldGFpbHMsXG5cdE1lc3NhZ2VVSURlY2lzaW9ucyxcblx0U2hvd01lc3NhZ2VQYXJhbWV0ZXJzLFxuXHRTdXBwb3J0ZWRVSUVsZW1lbnRcbn0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL21lc3NhZ2VIYW5kbGVyL21lc3NhZ2VIYW5kbGluZ1wiO1xuaW1wb3J0IG1lc3NhZ2VIYW5kbGluZyBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvbWVzc2FnZUhhbmRsZXIvbWVzc2FnZUhhbmRsaW5nXCI7XG5pbXBvcnQgdHlwZSB7IEludGVybmFsTW9kZWxDb250ZXh0IH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTW9kZWxIZWxwZXJcIjtcbmltcG9ydCB0eXBlIERpYWxvZyBmcm9tIFwic2FwL20vRGlhbG9nXCI7XG5pbXBvcnQgdHlwZSBDb250cm9sIGZyb20gXCJzYXAvdWkvY29yZS9Db250cm9sXCI7XG5pbXBvcnQgTGlicmFyeSBmcm9tIFwic2FwL3VpL2NvcmUvTGliXCI7XG5pbXBvcnQgTWVzc2FnaW5nIGZyb20gXCJzYXAvdWkvY29yZS9NZXNzYWdpbmdcIjtcbmltcG9ydCB0eXBlIE1lc3NhZ2UgZnJvbSBcInNhcC91aS9jb3JlL21lc3NhZ2UvTWVzc2FnZVwiO1xuaW1wb3J0IE1lc3NhZ2VUeXBlIGZyb20gXCJzYXAvdWkvY29yZS9tZXNzYWdlL01lc3NhZ2VUeXBlXCI7XG5pbXBvcnQgQ29udHJvbGxlckV4dGVuc2lvbiBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL0NvbnRyb2xsZXJFeHRlbnNpb25cIjtcbmltcG9ydCBPdmVycmlkZUV4ZWN1dGlvbiBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL092ZXJyaWRlRXhlY3V0aW9uXCI7XG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvQ29udGV4dFwiO1xuaW1wb3J0IHR5cGUgSlNPTk1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvanNvbi9KU09OTW9kZWxcIjtcbmltcG9ydCB0eXBlIE9EYXRhVjRDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQ29udGV4dFwiO1xuXG50eXBlIE9iamVjdFdpdGhDb252ZXJ0ZXJUeXBlID0gb2JqZWN0ICYge1xuXHRjb252ZXJ0ZXJUeXBlOiBzdHJpbmc7XG59O1xudHlwZSBOYXZpZ2F0aW9uVG9FcnJvclBhZ2VQYXJhbWV0ZXIgPSB7XG5cdGN1c3RvbU1lc3NhZ2VzPzogQ3VzdG9tTWVzc2FnZVtdO1xuXHRjb25jdXJyZW50RWRpdEZsYWc/OiBib29sZWFuO1xuXHRpc0RhdGFSZWNlaXZlZEVycm9yPzogYm9vbGVhbjtcblx0dGl0bGU/OiBzdHJpbmc7XG5cdGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuXHRpc0luaXRpYWxMb2FkNTAzRXJyb3I/OiBib29sZWFuO1xufTtcbmV4cG9ydCB0eXBlIE5hdmlnYXRpb25Ub0Vycm9yUGFnZVJlc3VsdCA9IHtcblx0dGl0bGU/OiBzdHJpbmc7XG5cdGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuXHRlcnJvclR5cGU/OiBzdHJpbmc7XG5cdG5hdmlnYXRlQmFja1RvT3JpZ2luPzogYm9vbGVhbjtcblx0aGFuZGxlU2hlbGxCYWNrPzogYm9vbGVhbjtcbn07XG5leHBvcnQgdHlwZSBDdXN0b21NZXNzYWdlID0ge1xuXHRjb2RlOiBzdHJpbmc7XG5cdHRleHQ6IHN0cmluZztcblx0cGVyc2lzdGVudDogYm9vbGVhbjtcblx0dHlwZTogTWVzc2FnZVR5cGU7XG59O1xuZXhwb3J0IHR5cGUgU2hvd01lc3NhZ2VEaWFsb2dQYXJhbWV0ZXIgPSB7XG5cdGN1c3RvbU1lc3NhZ2VzPzogQ3VzdG9tTWVzc2FnZVtdO1xuXHRpc09wZXJhdGlvbkRpYWxvZ09wZW4/OiBib29sZWFuO1xuXHRjb250ZXh0PzogQ29udGV4dDtcblx0Y29uY3VycmVudEVkaXRGbGFnPzogYm9vbGVhbjtcblx0Y29udHJvbD86IENvbnRyb2w7XG5cdHNBY3Rpb25OYW1lPzogc3RyaW5nO1xuXHRhU2VsZWN0ZWRDb250ZXh0cz86IENvbnRleHQgfCBDb250ZXh0W10gfCBudWxsO1xuXHRvbkJlZm9yZVNob3dNZXNzYWdlPzogKG1lc3NhZ2VzOiBNZXNzYWdlW10sIHNob3dNZXNzYWdlUGFyYW1ldGVyczogU2hvd01lc3NhZ2VQYXJhbWV0ZXJzKSA9PiBTaG93TWVzc2FnZVBhcmFtZXRlcnM7XG5cdHVuSG9sZEtleT86IHN0cmluZztcblx0b3ZlcnJpZGVVSURlY2lzaW9uPzogYm9vbGVhbjtcblx0c2hvd0JvdW5kU3RhdGVNZXNzYWdlcz86IGJvb2xlYW47XG5cdGJvdW5kQWN0aW9uTmFtZT86IHN0cmluZztcblx0ZW50aXR5U2V0Pzogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgU2hvd01lc3NhZ2VzUGFyYW1ldGVycyA9IFNob3dNZXNzYWdlRGlhbG9nUGFyYW1ldGVyICYge1xuXHRtZXNzYWdlUGFnZU5hdmlnYXRpb25DYWxsYmFjaz86IEZ1bmN0aW9uO1xuXHRzaGVsbEJhY2s/OiBGdW5jdGlvbiB8IGJvb2xlYW47XG5cdGlzRGF0YVJlY2VpdmVkRXJyb3I/OiBib29sZWFuO1xuXHRpc0luaXRpYWxMb2FkNTAzRXJyb3I/OiBib29sZWFuO1xuXHR0aXRsZT86IHN0cmluZztcblx0ZGVzY3JpcHRpb24/OiBzdHJpbmc7XG59O1xuLyoqXG4gKlxuICogRGVmaW5lcyB0aGUgbWVzc2FnZSBkZXRhaWwgcmVsZXZhbnQgZm9yIHRoZSBNZXNzYWdlQnV0dG9uIGJ1aWxkaW5nIGJsb2NrIHRvIGRpc3BsYXkgYSBwb3BvdmVyLlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgdHlwZSBNZXNzYWdlRGV0YWlsID0ge1xuXHRtZXNzYWdlOiBNZXNzYWdlO1xuXHRncm91cE5hbWU/OiBzdHJpbmc7XG5cdGFjdGl2ZVRpdGxlSGFuZGxlcj86IEZ1bmN0aW9uO1xufTtcblxuLyoqXG4gKiBBIGNvbnRyb2xsZXIgZXh0ZW5zaW9uIG9mZmVyaW5nIG1lc3NhZ2UgaGFuZGxpbmcuXG4gKiBAaGlkZWNvbnN0cnVjdG9yXG4gKiBAcHVibGljXG4gKiBAZXhwZXJpbWVudGFsIEFzIG9mIHZlcnNpb24gMS45MC4wXG4gKiBAc2luY2UgMS45MC4wXG4gKi9cbkBkZWZpbmVVSTVDbGFzcyhcInNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLk1lc3NhZ2VIYW5kbGVyXCIpXG5jbGFzcyBNZXNzYWdlSGFuZGxlciBleHRlbmRzIENvbnRyb2xsZXJFeHRlbnNpb24ge1xuXHRwcml2YXRlIHN0cmljdFdhcm5pbmdNZXNzYWdlczogTWVzc2FnZVtdID0gW107XG5cblx0cHJvdGVjdGVkIGJhc2UhOiBQYWdlQ29udHJvbGxlcjtcblxuXHRwcm90ZWN0ZWQgaG9sZEtleXM6IHN0cmluZ1tdID0gW107XG5cblxuXHRwcml2YXRlIGhvbGRNc2dzVG9TaG93ID0gZmFsc2U7XG5cblx0Y29uc3RydWN0b3IoKSB7XG5cdFx0c3VwZXIoKTtcblx0fVxuXG5cdEBtZXRob2RPdmVycmlkZSgpXG5cdG9uSW5pdCgpIDogdm9pZCB7XG5cdFx0Y29uc3QgaW50ZXJuYWxNb2RlbCA9IHRoaXMuYmFzZS5nZXRBcHBDb21wb25lbnQoKS5nZXRNb2RlbChcImludGVybmFsXCIpIGFzIEpTT05Nb2RlbDtcblx0XHRpbnRlcm5hbE1vZGVsLnNldFByb3BlcnR5KFwiL21lc3NhZ2VVSURlY2lzaW9uXCIsIHVuZGVmaW5lZCk7XG5cdFx0aW50ZXJuYWxNb2RlbC5zZXRQcm9wZXJ0eShcIi9tZXNzYWdlVUlFbGVtZW50SXNBdmFpbGFibGVcIiwgUHJvbWlzZS5yZXNvbHZlKCkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFkZHMgd2FybmluZyBtZXNzYWdlcyB0byB0aGUgbWVzc2FnZSBoYW5kbGVyLlxuXHQgKiBAcGFyYW0gYU1lc3NhZ2VzIFRoZSBzdHJpY3Qgd2FybmluZyBtZXNzYWdlcyB0byBiZSBhZGRlZFxuXHQgKi9cblx0YWRkV2FybmluZ01lc3NhZ2VzVG9NZXNzYWdlSGFuZGxlcihhTWVzc2FnZXM6IE1lc3NhZ2VbXSk6IHZvaWQge1xuXHRcdHRoaXMuc3RyaWN0V2FybmluZ01lc3NhZ2VzID0gdGhpcy5zdHJpY3RXYXJuaW5nTWVzc2FnZXMuY29uY2F0KGFNZXNzYWdlcyk7XG5cdH1cblxuXHQvKipcblx0ICogRGV0ZXJtaW5lcyB3aGV0aGVyIG9yIG5vdCBhIG1lc3NhZ2UgaXMgYSBzdHJpY3Qgd2FybmluZyBtZXNzYWdlIHRoYXQgd2FzIHJlY2VpdmVkIHByZXZpb3VzbHkuXG5cdCAqIEBwYXJhbSBvTWVzc2FnZSBUaGUgbWVzc2FnZSB0byBiZSBjaGVja2VkXG5cdCAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IHRoZSBtZXNzYWdlIGlzIGEgc3RyaWN0IHdhcm5pbmcgbWVzc2FnZVxuXHQgKi9cblx0aXNTdHJpY3RXYXJuaW5nTWVzc2FnZShvTWVzc2FnZTogTWVzc2FnZSk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiAoXG5cdFx0XHR0aGlzLnN0cmljdFdhcm5pbmdNZXNzYWdlcy5maW5kKChtZXNzYWdlKSA9PiB7XG5cdFx0XHRcdHJldHVybiAoXG5cdFx0XHRcdFx0bWVzc2FnZS5nZXRDb2RlKCkgPT09IG9NZXNzYWdlLmdldENvZGUoKSAmJlxuXHRcdFx0XHRcdG1lc3NhZ2UuZ2V0TWVzc2FnZSgpID09PSBvTWVzc2FnZS5nZXRNZXNzYWdlKCkgJiZcblx0XHRcdFx0XHRtZXNzYWdlLmdldFR5cGUoKSA9PT0gb01lc3NhZ2UuZ2V0VHlwZSgpICYmXG5cdFx0XHRcdFx0bWVzc2FnZS5nZXREZXNjcmlwdGlvblVybCgpID09PSBvTWVzc2FnZS5nZXREZXNjcmlwdGlvblVybCgpICYmXG5cdFx0XHRcdFx0ZGVlcEVxdWFsKG1lc3NhZ2UuZ2V0VGFyZ2V0cygpLCBvTWVzc2FnZS5nZXRUYXJnZXRzKCkpICYmXG5cdFx0XHRcdFx0bWVzc2FnZS5nZXRQZXJzaXN0ZW50KCkgPT09IG9NZXNzYWdlLmdldFBlcnNpc3RlbnQoKVxuXHRcdFx0XHQpO1xuXHRcdFx0fSkgIT09IHVuZGVmaW5lZFxuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogQ2xlYXJzIGFsbCBzdHJpY3Qgd2FybmluZyBtZXNzYWdlcyBmcm9tIHRoZSBtZXNzYWdlIGhhbmRsZXIuXG5cdCAqL1xuXHRjbGVhclN0cmljdFdhcm5pbmdNZXNzYWdlcygpOiB2b2lkIHtcblx0XHR0aGlzLnN0cmljdFdhcm5pbmdNZXNzYWdlcyA9IFtdO1xuXHR9XG5cblx0ZmlsdGVyRXJyb3JNZXNzYWdlcyhtZXNzYWdlczogTWVzc2FnZVtdKTogTWVzc2FnZVtdIHtcblx0XHRyZXR1cm4gbWVzc2FnZXMuZmlsdGVyKChtZXNzYWdlKSA9PiBtZXNzYWdlLmdldFR5cGUoKSA9PT0gTWVzc2FnZVR5cGUuRXJyb3IpO1xuXHR9XG5cblx0LyoqXG5cdCAqIERldGVybWluZXMgd2hldGhlciBvciBub3QgYm91bmQgbWVzc2FnZXMgYXJlIHNob3duIGluIHRoZSBtZXNzYWdlIGRpYWxvZy5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkluc3RlYWR9LlxuXHQgKlxuXHQgKiBJZiB0aGUgYm91bmQgbWVzc2FnZXMgYXJlIHNob3duIHRvIHRoZSB1c2VyIHdpdGggYSBkaWZmZXJlbnQgY29udHJvbCBsaWtlIHRoZSAoVE9ETzpMaW5rKSBNZXNzYWdlQnV0dG9uXG5cdCAqIHRoaXMgbWV0aG9kIGhhcyB0byBiZSBvdmVycmlkZGVuLlxuXHQgKiBAcmV0dXJucyBEZXRlcm1pbmVzIHdoZXRoZXIgb3Igbm90IGJvdW5kIG1lc3NhZ2VzIGFyZSBzaG93biBpbiB0aGUgbWVzc2FnZSBkaWFsb2cuXG5cdCAqL1xuXHRAcHJpdmF0ZUV4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkluc3RlYWQpXG5cdGdldFNob3dCb3VuZE1lc3NhZ2VzSW5NZXNzYWdlRGlhbG9nKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFsbG93cyBjb25zdW1lciBvZiBhIG1lc3NhZ2UgYnV0dG9uIEJCIHRvIGRlY2lkZSB3aGljaCBib3VuZCBtZXNzYWdlcyBzaG91bGQgYmUgc2hvd24gYW5kIGhvdy5cblx0ICpcblx0ICogVGhpcyBob29rIGlzIGNhbGxlZCB3aGVuIHRoZSBtZXNzYWdlIGJ1dHRvbiBCQiBkZXRlY3RzIGEgY2hhbmdlIGluIHRoZSBtZXNzYWdlIG1vZGVsLlxuXHQgKiBUaGUgaG9va3MgYWxsb3dzIHRvIGRlZmluZSBiZWhhdmlvdXIgZm9yIG1lc3NhZ2VzIGluIHRoZSBtZXNzYWdlIGJ1dHRvbiBCQi5cblx0ICpcblx0ICogQ29uc3VtZXJzIHdpbGwgYmUgYWJsZSB0byBkbyB0aGUgZm9sbG93aW5nIHdpdGggdGhpcyBob29rLlxuXHQgKlxuXHQgKiAxLiBGaWx0ZXIgb3V0IG1lc3NhZ2VzIHNvIHRoYXQgdGhleSBhcmUgbm90IHNob3duIG9uIHRoZSBtZXNzYWdlIGJ1dHRvbi5cblx0ICogMi4gZ3JvdXAgdGhlIG1lc3NhZ2VzIGJhc2VkIG9uIHRoZWlyIFVJLlxuXHQgKiAzLiBwcm92aWRlIGEgcHJlc3NlciBoYW5kbGVyIGluY2FzZSB0aGUgbWVzc2FnZSBzaG91bGQgc2hvdyBhcyBhIGxpbmsuXG5cdCAqIEBwYXJhbSBfbWVzc2FnZURldGFpbHMgT2JqZWN0IGNvbnRhaW5pbmcgdGhlIGRldGFpbHMgcmVsYXRlZCB0byB0aGUgbWVzc2FnZS5cblx0ICogQHBhcmFtIF9tZXNzYWdlRGV0YWlscy5tZXNzYWdlIFRoZSBtZXNzYWdlIGZyb20gdGhlIG1lc3NhZ2UgbW9kZWwuSWRlYWxseSwgaXQgbXVzdCBub3QgYmUgbW9kaWZpZWQgZGlyZWN0bHkuXG5cdCAqIEBwYXJhbSBfbWVzc2FnZURldGFpbHMuZ3JvdXBOYW1lIFRoZSBncm91cCBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCBtZXNzYWdlLlxuXHQgKiBAcGFyYW0gX21lc3NhZ2VEZXRhaWxzLmFjdGl2ZVRpdGxlSGFuZGxlciBGdW5jdGlvbiB0byBoYW5kbGUgdGhlIGNsaWNrIGV2ZW50IG9uIGEgbWVzc2FnZSBpbiB0aGUgTWVzc2FnZUJ1dHRvbiBidWlsZGluZyBibG9jay5cblx0ICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgbXVzdCBiZSByZXR1cm5lZCBieSB0aGUgb3ZlcnJpZGRlbiBtZXRob2QuXG5cdCAqIEBwdWJsaWNcblx0ICogQGV4cGVyaW1lbnRhbFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKFwiQWZ0ZXJBc3luY1wiKVxuXHRhc3luYyBiZWZvcmVTaG93TWVzc2FnZUJ1dHRvbihfbWVzc2FnZURldGFpbHM6IE1lc3NhZ2VEZXRhaWxbXSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZWdpc3RlciB0byBob2xkIG1lc3NhZ2VzIHVuaXRsIGEgcHJvY2VzcyBpcyBjb21wbGV0ZS5cblx0ICpcblx0ICogVGhlIGNhbGxlciBjYW4gcmVnaXN0ZXIgdG8gaG9sZCB0aGUgbWVzc2FnZSBoYW5kbGVyIGZyb20gc2hvd2luZyBtZXNzYWdlcyB1bnRpbCB0aGUgY2FsbGVyJ3MgcHJvY2Vzc2VzIGFyZSBjb21wbGV0ZWQuXG5cdCAqIE9uIHJlZ2lzdGVyaW5nIHRoZSBjYWxsZXIgaXMgcmV0dXJuZWQgYSB1bmlxdWUga2V5LlxuXHQgKiBUaGUgbWVzc2FnZXMgd2lsbCBub3QgYmUgc2hvd24gaW4gdGhlIFVJIHdpdGggc3Vic2VxdWVudCAnc2hvd01lc3NhZ2VEaWFsb2coKScgY2FsbHMuXG5cdCAqIFRoZSBjYWxsZXIgbmVlZHMgdG8gdXNlICdzaG93TWVzc2FnZURpYWxvZyg8a2V5PiknIGF0IHRoZSBlbmQgb2YgYWxsIGhpcyBwcm9jZXNzZXMgdG8gc2hvdyB0aGUgbWVzc2FnZXMgaW4gdGhlIFVJLlxuXHQgKlxuXHQgKiBJZiBtdWx0aXBsZSBvd25lcnMgcmVnaXN0ZXIgc2ltdWx0YW5lb3VzbHksIHRoZW4gbWVzc2FnZXMgYXJlIHNob3duIGluIHRoZSBVSSBvbmx5IGFmdGVyICdzaG93TWVzc2FnZURpYWxvZyg8cmVzcGVjdGl2ZV9rZXk+KScgaXMgY2FsbGVkIGJ5IGFsbCB0aGUgcHJvY2Vzc2VzJyBvd25lcnMuXG5cdCAqIEBwYXJhbSBrZXkgVW5pcXVlIGlkZW50aWZpZXIgdG8gdXNlLCBJZiBub3QgcHJvdmlkZWQsIGEgVUlEIHdvdWxkIGJlIGNyZWF0ZWQgYW5kIHVzZWQgdG8gcmVnaXN0ZXIuXG5cdCAqIEByZXR1cm5zIFVuaXF1ZSBLZXkgdG8gYmUgdXNlZCBieSB0aGUgY2FsbGVyIHRvIHNob3cgbWVzc2FnZXMgYXQgYSBsYXRlciBwb2ludCBvZiB0aW1lLlxuXHQgKi9cblx0cmVnaXN0ZXJUb0hvbGRNZXNzYWdlcyhrZXk/OiBzdHJpbmcpOiBzdHJpbmcge1xuXHRcdGNvbnN0IHVuaXF1ZUtleSA9IGtleSA/PyB1aWQoKTtcblx0XHRpZiAoIXRoaXMuaG9sZEtleXMuaW5jbHVkZXModW5pcXVlS2V5KSkge1xuXHRcdFx0dGhpcy5ob2xkS2V5cy5wdXNoKHVuaXF1ZUtleSk7XG5cdFx0fVxuXHRcdHJldHVybiB1bmlxdWVLZXk7XG5cdH1cblxuXHQvKipcblx0ICogQ2xlYXIgYWxsIGV4aXN0aW5nIGhlbGQga2V5cy5cblx0ICovXG5cdHJlc2V0SG9sZEtleXMoKTogdm9pZCB7XG5cdFx0dGhpcy5ob2xkS2V5cyA9IFtdO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNob3dzIGEgbWVzc2FnZSBkaWFsb2cgd2l0aCB0cmFuc2l0aW9uIG1lc3NhZ2VzIGlmIHRoZXJlIGFyZSBhbnkuXG5cdCAqIFRoZSBtZXNzYWdlIGRpYWxvZyBpcyBzaG93biBhcyBhIG1vZGFsIGRpYWxvZy4gT25jZSB0aGUgdXNlciBjb25maXJtcyB0aGUgZGlhbG9nLCBhbGwgdHJhbnNpdGlvbiBtZXNzYWdlc1xuXHQgKiBhcmUgcmVtb3ZlZCBmcm9tIHRoZSBtZXNzYWdlIG1vZGVsLiBJZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIG1lc3NhZ2UsIGEgbGlzdCBvZiBtZXNzYWdlcyBpcyBzaG93bi4gVGhlIHVzZXJcblx0ICogY2FuIGZpbHRlciBvbiBtZXNzYWdlIHR5cGVzIGFuZCBjYW4gZGlzcGxheSBkZXRhaWxzIGFzIHdlbGwgYXMgdGhlIGxvbmcgdGV4dC4gSWYgdGhlcmUgaXMgb25lIG1lc3NhZ2UsXG5cdCAqIHRoZSBkaWFsb2cgaW1tZWRpYXRlbHkgc2hvd3MgdGhlIGRldGFpbHMgb2YgdGhlIG1lc3NhZ2UuIElmIHRoZXJlIGlzIGp1c3Qgb25lIHN1Y2Nlc3MgbWVzc2FnZSwgYSBtZXNzYWdlXG5cdCAqIHRvYXN0IGlzIHNob3duIGluc3RlYWQuXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycyBQUklWQVRFXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIG9uY2UgdGhlIHVzZXIgY2xvc2VzIHRoZSBkaWFsb2cuIElmIHRoZXJlIGFyZSBubyBtZXNzYWdlc1xuXHQgKiB0byBiZSBzaG93biwgdGhlIHByb21pc2UgaXMgcmVzb2x2ZWQgaW1tZWRpYXRlbHlcblx0ICogQHB1YmxpY1xuXHQgKiBAZXhwZXJpbWVudGFsIEFzIG9mIHZlcnNpb24gMS45MC4wXG5cdCAqIEBzaW5jZSAxLjkwLjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRhc3luYyBzaG93TWVzc2FnZURpYWxvZyhtUGFyYW1ldGVycz86IFNob3dNZXNzYWdlRGlhbG9nUGFyYW1ldGVyKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgaW50ZXJuYWxNb2RlbCA9IHRoaXMuYmFzZS5nZXRBcHBDb21wb25lbnQoKS5nZXRNb2RlbChcImludGVybmFsXCIpIGFzIEpTT05Nb2RlbDtcblx0XHQvLyByZW1vdmUgc3RyaWN0IHdhcm5pbmcgbWVzc2FnZXMgZnJvbSB0aGUgbWVzc2FnZSBtb2RlbCBiZWZvcmUgc2hvd2luZyB0aGUgbWVzc2FnZSBkaWFsb2dcblx0XHRhd2FpdCBpbnRlcm5hbE1vZGVsLmdldFByb3BlcnR5KFwiL21lc3NhZ2VVSUVsZW1lbnRJc0F2YWlsYWJsZVwiKTtcblxuXG5cdFx0Y29uc3QgbWVzc2FnZXNJbk1vZGVsID0gTWVzc2FnaW5nLmdldE1lc3NhZ2VNb2RlbCgpLmdldERhdGEoKTtcblx0XHRjb25zdCBkdXBsaWNhdGVXYXJuaW5nTWVzc2FnZSA9IG1lc3NhZ2VzSW5Nb2RlbC5maWx0ZXIoKG1lc3NhZ2U6IE1lc3NhZ2UpID0+IHtcblx0XHRcdHJldHVybiB0aGlzLmlzU3RyaWN0V2FybmluZ01lc3NhZ2UobWVzc2FnZSk7XG5cdFx0fSk7XG5cdFx0TWVzc2FnaW5nLnJlbW92ZU1lc3NhZ2VzKGR1cGxpY2F0ZVdhcm5pbmdNZXNzYWdlKTtcblxuXHRcdGNvbnN0IGN1c3RvbU1lc3NhZ2VzID0gbVBhcmFtZXRlcnMgJiYgbVBhcmFtZXRlcnMuY3VzdG9tTWVzc2FnZXMgPyBtUGFyYW1ldGVycy5jdXN0b21NZXNzYWdlcyA6IHVuZGVmaW5lZCxcblx0XHRcdG9PUEludGVybmFsQmluZGluZ0NvbnRleHQgPSB0aGlzLmJhc2UuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQ7XG5cdFx0Y29uc3Qgdmlld1R5cGUgPSAodGhpcy5iYXNlLmdldFZpZXcoKS5nZXRWaWV3RGF0YSgpIGFzIE9iamVjdFdpdGhDb252ZXJ0ZXJUeXBlKS5jb252ZXJ0ZXJUeXBlO1xuXHRcdC8vIHNldCBpc0FjdGlvblBhcmFtZXRlckRpYWxvZyBvcGVuIHNvIHRoYXQgaXQgY2FuIGJlIHVzZWQgaW4gdGhlIGNvbnRyb2xsZXIgZXh0ZW5zaW9uIHRvIGRlY2lkZSB3aGV0aGVyIG1lc3NhZ2UgZGlhbG9nIHNob3VsZCBvcGVuIG9yIG5vdFxuXHRcdGlmIChtUGFyYW1ldGVycyAmJiBtUGFyYW1ldGVycy5pc09wZXJhdGlvbkRpYWxvZ09wZW4gJiYgb09QSW50ZXJuYWxCaW5kaW5nQ29udGV4dCkge1xuXHRcdFx0b09QSW50ZXJuYWxCaW5kaW5nQ29udGV4dC5zZXRQcm9wZXJ0eShcImlzT3BlcmF0aW9uRGlhbG9nT3BlblwiLCB0cnVlKTtcblx0XHR9XG5cdFx0Y29uc3QgYlNob3dCb3VuZE1lc3NhZ2VzID0gdGhpcy5nZXRTaG93Qm91bmRNZXNzYWdlc0luTWVzc2FnZURpYWxvZygpO1xuXHRcdGNvbnN0IG9CaW5kaW5nQ29udGV4dCA9IChcblx0XHRcdG1QYXJhbWV0ZXJzICYmIG1QYXJhbWV0ZXJzLmNvbnRleHQgPyBtUGFyYW1ldGVycy5jb250ZXh0IDogdGhpcy5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoKVxuXHRcdCkgYXMgT0RhdGFWNENvbnRleHQ7XG5cdFx0Ly9jb25zdCBiRXRhZ01lc3NhZ2UgPSBtUGFyYW1ldGVycyAmJiBtUGFyYW1ldGVycy5iSGFzRXRhZ01lc3NhZ2U7XG5cdFx0Ly8gcmVzZXQgIGlzT3BlcmF0aW9uRGlhbG9nT3BlblxuXHRcdC8vIGNhbm5vdCBkbyB0aGlzIG9wZXJhdGlvbnMuanMgc2luY2UgaXQgaXMgbm90IGF3YXJlIG9mIHRoZSB2aWV3XG5cdFx0aWYgKG9PUEludGVybmFsQmluZGluZ0NvbnRleHQpIHtcblx0XHRcdG9PUEludGVybmFsQmluZGluZ0NvbnRleHQuc2V0UHJvcGVydHkoXCJpc09wZXJhdGlvbkRpYWxvZ09wZW5cIiwgZmFsc2UpO1xuXHRcdH1cblx0XHRyZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oXG5cdFx0XHRmdW5jdGlvbiAodGhpczogTWVzc2FnZUhhbmRsZXIsIHJlc29sdmU6ICgpID0+IHZvaWQsIHJlamVjdDogKCkgPT4gdm9pZCk6IHZvaWQge1xuXHRcdFx0XHQvLyB3ZSBoYXZlIHRvIHNldCBhIHRpbWVvdXQgdG8gYmUgYWJsZSB0byBhY2Nlc3MgdGhlIG1vc3QgcmVjZW50IG1lc3NhZ2VzXG5cdFx0XHRcdHNldFRpbWVvdXQoXG5cdFx0XHRcdFx0ZnVuY3Rpb24gKHRoaXM6IE1lc3NhZ2VIYW5kbGVyKTogdm9pZCB7XG5cdFx0XHRcdFx0XHQvLyBUT0RPOiBncmVhdCBBUEkgLSB3aWxsIGJlIGNoYW5nZWQgbGF0ZXJcblx0XHRcdFx0XHRcdHRoaXMucHJvY2Vzc0FuZFNob3dNZXNzYWdlcyhcblx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMgPz8ge30sXG5cdFx0XHRcdFx0XHRcdG9CaW5kaW5nQ29udGV4dCxcblx0XHRcdFx0XHRcdFx0YlNob3dCb3VuZE1lc3NhZ2VzLFxuXHRcdFx0XHRcdFx0XHRjdXN0b21NZXNzYWdlcyA/PyBbXSxcblx0XHRcdFx0XHRcdFx0cmVzb2x2ZSxcblx0XHRcdFx0XHRcdFx0cmVqZWN0LFxuXHRcdFx0XHRcdFx0XHR2aWV3VHlwZVxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9LmJpbmQodGhpcyksXG5cdFx0XHRcdFx0MFxuXHRcdFx0XHQpO1xuXHRcdFx0fS5iaW5kKHRoaXMpXG5cdFx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBQcm9jZXNzIHRoZSBtZXNzYWdlcyBhbmQgc2hvdyB0aGVtIHdoZW4gZXhwZWN0ZWQuXG5cdCAqXG5cdCAqIFdlIGZpbHRlciB0aGUgbWVzc2FnZXMgdG8gc2hvdyBhbmQgaG9sZCB0aGVtIHVudGlsIGFsbCByZWdpc3RlcmVkIHByb2Nlc3NlcyBjYWxsIHNob3dNZXNzYWdlRGlhbG9nIHdpdGggdGhlaXIgcmVzcGVjdGl2ZSBoZWxkIGtleXMuXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzIFBhcmFtZXRlcnMgdG8gc2hvdyBtZXNzYWdlIGRpYWxvZy5cblx0ICogQHBhcmFtIGJpbmRpbmdDb250ZXh0IEJpbmQgY29udGV4dCBvZiB0aGUgcGFnZS5cblx0ICogQHBhcmFtIHNob3dCb3VuZFRyYW5zaXRpb25NZXNzYWdlcyBTaG91bGQgYm91bmQgbWVzc2FnZXMgYmUgc2hvd24uXG5cdCAqIEBwYXJhbSBjdXN0b21NZXNzYWdlcyBDdXN0b20gbWVzc2FnZXMgdG8gYWRkLlxuXHQgKiBAcGFyYW0gc3VjY2VzcyBTdWNjZXNzIGNhbGxiYWNrLlxuXHQgKiBAcGFyYW0gZmFpbHVyZSBGYWlsdXJlIGNhbGxiYWNrLlxuXHQgKiBAcGFyYW0gdmlld1R5cGUgVmlldyB0eXBlLCBsaXN0IHJlcG9ydCBvciBvYmplY3QgcGFnZS5cblx0ICovXG5cdHByb2Nlc3NBbmRTaG93TWVzc2FnZXMoXG5cdFx0cGFyYW1ldGVyczogU2hvd01lc3NhZ2VEaWFsb2dQYXJhbWV0ZXIsXG5cdFx0YmluZGluZ0NvbnRleHQ6IE9EYXRhVjRDb250ZXh0LFxuXHRcdHNob3dCb3VuZFRyYW5zaXRpb25NZXNzYWdlczogYm9vbGVhbixcblx0XHRjdXN0b21NZXNzYWdlczogQ3VzdG9tTWVzc2FnZVtdLFxuXHRcdHN1Y2Nlc3M6ICgpID0+IHZvaWQsXG5cdFx0ZmFpbHVyZTogKCkgPT4gdm9pZCxcblx0XHR2aWV3VHlwZT86IHN0cmluZ1xuXHQpOiB2b2lkIHtcblx0XHRjb25zdCB7XG5cdFx0XHRjb25jdXJyZW50RWRpdEZsYWcsXG5cdFx0XHRjb250cm9sLFxuXHRcdFx0c0FjdGlvbk5hbWUsXG5cdFx0XHRvbkJlZm9yZVNob3dNZXNzYWdlLFxuXHRcdFx0dW5Ib2xkS2V5LFxuXHRcdFx0aXNPcGVyYXRpb25EaWFsb2dPcGVuOiBmb3JjZVNob3dVSUVsZW1lbnQgPSBmYWxzZSxcblx0XHRcdG92ZXJyaWRlVUlEZWNpc2lvbixcblx0XHRcdHNob3dCb3VuZFN0YXRlTWVzc2FnZXNcblx0XHR9ID0gcGFyYW1ldGVycztcblx0XHR0aGlzLmhvbGRNc2dzVG9TaG93ID0gdHJ1ZTtcblxuXHRcdC8vIENyZWF0ZSBhIFVJIGRlY2lzaW9uLlxuXHRcdGNvbnN0IG5ld1VJRGVjaXNpb25zID0gbWVzc2FnZUhhbmRsaW5nLmdldFVJRGVjaXNpb25zKFxuXHRcdFx0Y3VzdG9tTWVzc2FnZXMsXG5cdFx0XHRiaW5kaW5nQ29udGV4dCxcblx0XHRcdHNob3dCb3VuZFRyYW5zaXRpb25NZXNzYWdlcyxcblx0XHRcdGNvbmN1cnJlbnRFZGl0RmxhZyxcblx0XHRcdGNvbnRyb2wsXG5cdFx0XHRzQWN0aW9uTmFtZSxcblx0XHRcdG9uQmVmb3JlU2hvd01lc3NhZ2UsXG5cdFx0XHR2aWV3VHlwZSxcblx0XHRcdHNob3dCb3VuZFN0YXRlTWVzc2FnZXMsXG5cdFx0XHRwYXJhbWV0ZXJzXG5cdFx0KTtcblx0XHR0aGlzLnVwZGF0ZVVJRGVjaXNpb25zKG5ld1VJRGVjaXNpb25zLCBvdmVycmlkZVVJRGVjaXNpb24pO1xuXHRcdHRoaXMucmVtb3ZlSG9sZEtleSh1bkhvbGRLZXkgPz8gY29udHJvbD8uZ2V0SWQoKSk7XG5cdFx0Y29uc3QgdWlFbGVtZW50SXNBdmFpbGFibGUgPSB0aGlzLmJhc2UuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0TW9kZWwoXCJpbnRlcm5hbFwiKT8uZ2V0UHJvcGVydHkoXCIvbWVzc2FnZVVJRWxlbWVudElzQXZhaWxhYmxlXCIpO1xuXHRcdCh0aGlzLmJhc2UuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0TW9kZWwoXCJpbnRlcm5hbFwiKSBhcyBKU09OTW9kZWwpPy5zZXRQcm9wZXJ0eShcIi9tZXNzYWdlVUlFbGVtZW50SXNBdmFpbGFibGVcIiwgdWlFbGVtZW50SXNBdmFpbGFibGUudGhlbihcblx0XHRcdGFzeW5jIGZ1bmN0aW9uICh0aGlzOiBNZXNzYWdlSGFuZGxlcik6IFByb21pc2U8dm9pZD4ge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5zaG93TWVzc2FnZXNXaXRoQ29uZHRpb25zKGZvcmNlU2hvd1VJRWxlbWVudCwgc3VjY2VzcywgZmFpbHVyZSk7XG5cdFx0XHR9LmJpbmQodGhpcykpKTtcblx0XHR9XG5cblx0LyoqXG5cdCAqIFNob3cgTWVzc2FnZXMgaW4gdGhlIFVJIGJhc2VkIG9uIGNvbmRpdGlvbnMuXG5cdCAqIEBwYXJhbSBmb3JjZVNob3dVSUVsZW1lbnRcblx0ICogQHBhcmFtIHN1Y2Nlc3Ncblx0ICogQHBhcmFtIGZhaWx1cmVcblx0ICovXG5cdGFzeW5jIHNob3dNZXNzYWdlc1dpdGhDb25kdGlvbnMoXG5cdFx0Zm9yY2VTaG93VUlFbGVtZW50ID0gZmFsc2UsXG5cdFx0c3VjY2Vzcz86IChyZXQ/OiB1bmtub3duKSA9PiB2b2lkLFxuXHRcdGZhaWx1cmU/OiAoZXJyPzogdW5rbm93bikgPT4gdm9pZFxuXHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBzaG93VUlFbGVtZW50ID0gZm9yY2VTaG93VUlFbGVtZW50IHx8IHRoaXMuY2hlY2tUb1Nob3dVSUVsZW1lbnQoKTtcblx0XHRjb25zdCBpbnRlcm5hbE1vZGVsID0gdGhpcy5iYXNlLmdldEFwcENvbXBvbmVudCgpLmdldE1vZGVsKFwiaW50ZXJuYWxcIikgYXMgSlNPTk1vZGVsO1xuXHRcdGlmIChzaG93VUlFbGVtZW50ICYmIGludGVybmFsTW9kZWwuZ2V0UHJvcGVydHkoXCIvbWVzc2FnZVVJRGVjaXNpb25cIikpIHtcblx0XHRcdC8vIFNob3cgVUkgZWxlbWVudCBmb3IgdGhlIHByZXNlbnQgZGVjaXNpb24gYW5kIGNsZWFyIHRoZSBkZWNpc2lvbi5cblx0XHRcdHRyeSB7XG5cdFx0XHRcdGNvbnN0IHJldCA9IGF3YWl0IG1lc3NhZ2VIYW5kbGluZy5zaG93TWVzc2FnZXNJblVJKGludGVybmFsTW9kZWwuZ2V0UHJvcGVydHkoXCIvbWVzc2FnZVVJRGVjaXNpb25cIikpO1xuXHRcdFx0XHRzdWNjZXNzPy4ocmV0KTtcblx0XHRcdH0gY2F0Y2ggKGVycjogdW5rbm93bikge1xuXHRcdFx0XHRMb2cuZXJyb3IoYEZFIDogVjQgOiBNZXNzYWdlSGFuZGxlciA6IEVycm9yIG9uIHRyeWluZyB0byBzaG93IFVJIGVsZW1lbnQ6ICR7ZXJyfWApO1xuXHRcdFx0XHRmYWlsdXJlPy4oZXJyKTtcblx0XHRcdFx0aW50ZXJuYWxNb2RlbC5zZXRQcm9wZXJ0eShcIi9tZXNzYWdlVUlFbGVtZW50SXNBdmFpbGFibGVcIiwgUHJvbWlzZS5yZXNvbHZlKCkpO1xuXHRcdFx0fVxuXHRcdFx0aW50ZXJuYWxNb2RlbC5zZXRQcm9wZXJ0eShcIi9tZXNzYWdlVUlEZWNpc2lvblwiLCB1bmRlZmluZWQpO1xuXHRcdFx0dGhpcy5jbGVhclN0cmljdFdhcm5pbmdNZXNzYWdlcygpO1xuXHRcdFx0dGhpcy5ob2xkTXNnc1RvU2hvdyA9IGZhbHNlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRMb2cuaW5mbyhcIkZFIDogVjQgOiBNZXNzYWdlSGFuZGxlciA6IEhvbGRpbmcgbWVzc2FnZXMgdW50aWwgYSByZWdpc3RlcmVkIHByb2Nlc3MgXCIpO1xuXHRcdFx0c3VjY2Vzcz8uKCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFlvdSBjYW4gcmVtb3ZlIHRoZSBleGlzdGluZyB0cmFuc2l0aW9uIG1lc3NhZ2UgZnJvbSB0aGUgbWVzc2FnZSBtb2RlbCB3aXRoIHRoaXMgbWV0aG9kLlxuXHQgKiBXaXRoIGV2ZXJ5IHVzZXIgaW50ZXJhY3Rpb24gdGhhdCBjYXVzZXMgc2VydmVyIGNvbW11bmljYXRpb24gKGxpa2UgY2xpY2tpbmcgb24gYW4gYWN0aW9uLCBjaGFuZ2luZyBkYXRhKSxcblx0ICogdGhpcyBtZXRob2QgcmVtb3ZlcyB0aGUgZXhpc3RpbmcgdHJhbnNpdGlvbiBtZXNzYWdlcyBmcm9tIHRoZSBtZXNzYWdlIG1vZGVsLlxuXHQgKiBAcGFyYW0gW2tlZXBCb3VuZE1lc3NhZ2VdIENoZWNrcyBpZiB0aGUgYm91bmQgdHJhbnNpdGlvbiBtZXNzYWdlcyBhcmUgbm90IHRvIGJlIHJlbW92ZWRcblx0ICogQHBhcmFtIGtlZXBVbmJvdW5kTWVzc2FnZVxuXHQgKiBAcGFyYW0gc1BhdGhUb0JlUmVtb3ZlZFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdHJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcyhrZWVwQm91bmRNZXNzYWdlPzogYm9vbGVhbiwga2VlcFVuYm91bmRNZXNzYWdlPzogYm9vbGVhbiwgc1BhdGhUb0JlUmVtb3ZlZD86IHN0cmluZyk6IHZvaWQge1xuXHRcdGlmICgha2VlcEJvdW5kTWVzc2FnZSkge1xuXHRcdFx0bWVzc2FnZUhhbmRsaW5nLnJlbW92ZUJvdW5kVHJhbnNpdGlvbk1lc3NhZ2VzKHNQYXRoVG9CZVJlbW92ZWQpO1xuXHRcdH1cblx0XHRpZiAoIWtlZXBVbmJvdW5kTWVzc2FnZSkge1xuXHRcdFx0bWVzc2FnZUhhbmRsaW5nLnJlbW92ZVVuYm91bmRUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogTWV0aG9kIHRoYXQgcmV0dXJucyBhbGwgdGhlIHBhcmFtZXRlcnMgbmVlZGVkIHRvIGhhbmRsZSB0aGUgbmF2aWdhdGlvbiB0byB0aGUgZXJyb3IgcGFnZS5cblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzXG5cdCAqIEByZXR1cm5zIFRoZSBwYXJhbWV0ZXJzIG5lY2Vzc2FyeSBmb3IgdGhlIG5hdmlnYXRpb24gdG8gdGhlIGVycm9yIHBhZ2Vcblx0ICovXG5cdF9jaGVja05hdmlnYXRpb25Ub0Vycm9yUGFnZShtUGFyYW1ldGVycz86IE5hdmlnYXRpb25Ub0Vycm9yUGFnZVBhcmFtZXRlcik6IE5hdmlnYXRpb25Ub0Vycm9yUGFnZVJlc3VsdCB8IHVuZGVmaW5lZCB7XG5cdFx0Y29uc3QgYVVuYm91bmRNZXNzYWdlcyA9IG1lc3NhZ2VIYW5kbGluZy5nZXRNZXNzYWdlcygpO1xuXHRcdGNvbnN0IGJTaG93Qm91bmRUcmFuc2l0aW9uTWVzc2FnZXMgPSB0aGlzLmdldFNob3dCb3VuZE1lc3NhZ2VzSW5NZXNzYWdlRGlhbG9nKCk7XG5cdFx0Y29uc3QgYUJvdW5kVHJhbnNpdGlvbk1lc3NhZ2VzID0gYlNob3dCb3VuZFRyYW5zaXRpb25NZXNzYWdlcyA/IG1lc3NhZ2VIYW5kbGluZy5nZXRNZXNzYWdlcyh0cnVlLCB0cnVlKSA6IFtdO1xuXHRcdGNvbnN0IGFDdXN0b21NZXNzYWdlcyA9IG1QYXJhbWV0ZXJzICYmIG1QYXJhbWV0ZXJzLmN1c3RvbU1lc3NhZ2VzID8gbVBhcmFtZXRlcnMuY3VzdG9tTWVzc2FnZXMgOiBbXTtcblx0XHRjb25zdCBiSXNTdGlja3lFZGl0TW9kZSA9IENvbW1vblV0aWxzLmlzU3RpY2t5RWRpdE1vZGUodGhpcy5iYXNlLmdldFZpZXcoKSk7XG5cdFx0bGV0IG1NZXNzYWdlUGFnZVBhcmFtZXRlcnM6IE5hdmlnYXRpb25Ub0Vycm9yUGFnZVJlc3VsdCB8IHVuZGVmaW5lZDtcblxuXHRcdC8vIFRPRE86IFN0aWNrIG1vZGUgY2hlY2sgaXMgb2theSBhcyBsb25nIGFzIHRoZSBjb250cm9sbGVyIGV4dGVuc2lvbiBpcyB1c2VkIHdpdGggc2FwLmZlLmNvcmUgYW5kIHNhcC5mZS5jb3JlLkFwcENvbXBvbmVudC5cblx0XHQvLyBJdCBtaWdodCBiZSBiZXR0ZXIgdG8gcHJvdmlkZSBhbiBleHRlbnNpb24gdG8gdGhlIGNvbnN1bWVyIG9mIHRoZSBjb250cm9sbGVyIGV4dGVuc2lvbiB0byBwcm92aWRlIHRoaXMgdmFsdWUuXG5cblx0XHQvLyBUaGUgbWVzc2FnZSBwYWdlIGNhbiBvbmx5IHNob3cgMSBtZXNzYWdlIHRvZGF5LCBzbyB3ZSBuYXZpZ2F0ZSB0byBpdCB3aGVuIDpcblx0XHQvLyAxLiBUaGVyZSBhcmUgbm8gYm91bmQgdHJhbnNpdGlvbiBtZXNzYWdlcyB0byBzaG93LFxuXHRcdC8vIDIuIFRoZXJlIGFyZSBubyBjdXN0b20gbWVzc2FnZXMgdG8gc2hvdywgJlxuXHRcdC8vIDMuIFRoZXJlIGlzIGV4YWN0bHkgMSB1bmJvdW5kIG1lc3NhZ2UgaW4gdGhlIG1lc3NhZ2UgbW9kZWwgd2l0aCBzdGF0dXNDb2RlPTUwMyBhbmQgcmV0cnktQWZ0ZXIgYXZhaWxhYmxlXG5cdFx0Ly8gNC4gcmV0cnlBZnRlciBpcyBncmVhdGVyIHRoYW4gMTIwIHNlY29uZHNcblx0XHQvL1xuXHRcdC8vIEluIEFkZGl0aW9uLCBuYXZpZ2F0aW5nIGF3YXkgZnJvbSBhIHN0aWNreSBzZXNzaW9uIHdpbGwgZGVzdHJveSB0aGUgc2Vzc2lvbiBzbyB3ZSBkbyBub3QgbmF2aWdhdGUgdG8gbWVzc2FnZSBwYWdlIGZvciBub3cuXG5cdFx0Ly8gVE9ETzogY2hlY2sgaWYgbmF2aWdhdGlvbiBzaG91bGQgYmUgZG9uZSBpbiBzdGlja3kgZWRpdCBtb2RlLlxuXHRcdGlmIChtUGFyYW1ldGVycz8uaXNEYXRhUmVjZWl2ZWRFcnJvciA9PT0gdHJ1ZSkge1xuXHRcdFx0bU1lc3NhZ2VQYWdlUGFyYW1ldGVycyA9IHtcblx0XHRcdFx0dGl0bGU6IG1QYXJhbWV0ZXJzLnRpdGxlLFxuXHRcdFx0XHRkZXNjcmlwdGlvbjogbVBhcmFtZXRlcnMuZGVzY3JpcHRpb24sXG5cdFx0XHRcdG5hdmlnYXRlQmFja1RvT3JpZ2luOiB0cnVlLFxuXHRcdFx0XHRlcnJvclR5cGU6IFwiUGFnZU5vdEZvdW5kXCJcblx0XHRcdH07XG5cdFx0fSBlbHNlIGlmIChcblx0XHRcdCFiSXNTdGlja3lFZGl0TW9kZSAmJlxuXHRcdFx0IWFCb3VuZFRyYW5zaXRpb25NZXNzYWdlcy5sZW5ndGggJiZcblx0XHRcdCFhQ3VzdG9tTWVzc2FnZXMubGVuZ3RoICYmXG5cdFx0XHQoYVVuYm91bmRNZXNzYWdlcy5sZW5ndGggPT09IDEgfHwgbVBhcmFtZXRlcnM/LmlzSW5pdGlhbExvYWQ1MDNFcnJvciA9PT0gdHJ1ZSlcblx0XHQpIHtcblx0XHRcdGNvbnN0IG9NZXNzYWdlID0gYVVuYm91bmRNZXNzYWdlc1swXTtcblx0XHRcdGNvbnN0IG9UZWNobmljYWxEZXRhaWxzID0gb01lc3NhZ2UuZ2V0VGVjaG5pY2FsRGV0YWlscygpIGFzIE1lc3NhZ2VUZWNobmljYWxEZXRhaWxzIHwgdW5kZWZpbmVkO1xuXHRcdFx0aWYgKG9UZWNobmljYWxEZXRhaWxzPy5odHRwU3RhdHVzID09PSA1MDMpIHtcblx0XHRcdFx0bU1lc3NhZ2VQYWdlUGFyYW1ldGVycyA9IHRoaXMuX2dldEhUVFA1MDNNZXNzYWdlUGFyYW1ldGVycyhvTWVzc2FnZSwgb1RlY2huaWNhbERldGFpbHMpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gbU1lc3NhZ2VQYWdlUGFyYW1ldGVycztcblx0fVxuXG5cdF9nZXRIVFRQNTAzTWVzc2FnZVBhcmFtZXRlcnMobWVzc2FnZTogTWVzc2FnZSwgdGVjaG5pY2FsRGV0YWlsczogTWVzc2FnZVRlY2huaWNhbERldGFpbHMpOiBOYXZpZ2F0aW9uVG9FcnJvclBhZ2VSZXN1bHQgfCB1bmRlZmluZWQge1xuXHRcdGxldCBtZXNzYWdlUGFnZVBhcmFtZXRlcnM6IE5hdmlnYXRpb25Ub0Vycm9yUGFnZVJlc3VsdCB8IHVuZGVmaW5lZDtcblxuXHRcdGNvbnN0IHNlY29uZHNCZWZvcmVSZXRyeSA9XG5cdFx0XHR0ZWNobmljYWxEZXRhaWxzLnJldHJ5QWZ0ZXIgIT09IHVuZGVmaW5lZCA/IHRoaXMuX2dldFNlY29uZHNCZWZvcmVSZXRyeUFmdGVyKHRlY2huaWNhbERldGFpbHMucmV0cnlBZnRlcikgOiB1bmRlZmluZWQ7XG5cblx0XHRpZiAoc2Vjb25kc0JlZm9yZVJldHJ5ID09PSB1bmRlZmluZWQgfHwgc2Vjb25kc0JlZm9yZVJldHJ5ID4gMTIwKSB7XG5cdFx0XHRjb25zdCByZXRyeUFmdGVyTWVzc2FnZSA9IG1lc3NhZ2VIYW5kbGluZy5nZXRSZXRyeUFmdGVyTWVzc2FnZShtZXNzYWdlKTtcblx0XHRcdG1lc3NhZ2VQYWdlUGFyYW1ldGVycyA9IHtcblx0XHRcdFx0ZGVzY3JpcHRpb246IHJldHJ5QWZ0ZXJNZXNzYWdlID8gYCR7cmV0cnlBZnRlck1lc3NhZ2V9ICR7bWVzc2FnZS5nZXRNZXNzYWdlKCl9YCA6IG1lc3NhZ2UuZ2V0TWVzc2FnZSgpLFxuXHRcdFx0XHRuYXZpZ2F0ZUJhY2tUb09yaWdpbjogdHJ1ZSxcblx0XHRcdFx0ZXJyb3JUeXBlOiBcIlVuYWJsZVRvTG9hZFwiXG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdHJldHVybiBtZXNzYWdlUGFnZVBhcmFtZXRlcnM7XG5cdH1cblxuXHRfZ2V0U2Vjb25kc0JlZm9yZVJldHJ5QWZ0ZXIoZFJldHJ5QWZ0ZXI6IERhdGUpOiBudW1iZXIge1xuXHRcdGNvbnN0IGRDdXJyZW50RGF0ZVRpbWUgPSBuZXcgRGF0ZSgpLFxuXHRcdFx0aUN1cnJlbnREYXRlVGltZUluTWlsbGlTZWNvbmRzID0gZEN1cnJlbnREYXRlVGltZS5nZXRUaW1lKCksXG5cdFx0XHRpUmV0cnlBZnRlckRhdGVUaW1lSW5NaWxsaVNlY29uZHMgPSBkUmV0cnlBZnRlci5nZXRUaW1lKCksXG5cdFx0XHRpU2Vjb25kc0JlZm9yZVJldHJ5ID0gKGlSZXRyeUFmdGVyRGF0ZVRpbWVJbk1pbGxpU2Vjb25kcyAtIGlDdXJyZW50RGF0ZVRpbWVJbk1pbGxpU2Vjb25kcykgLyAxMDAwO1xuXHRcdHJldHVybiBpU2Vjb25kc0JlZm9yZVJldHJ5O1xuXHR9XG5cblx0LyoqXG5cdCAqIFVwZGF0ZSB0aGUgZXhpc3RpbmcgVUkgZGVjaXNpb25zIHdpdGggdGhlIG5ldyBvbmVzLlxuXHQgKiBAcGFyYW0gbmV3VUlEZWNpc2lvbnMgSW4gY29tbWluZyBVSSBkZWNpc2lvbnMuXG5cdCAqIEBwYXJhbSBvdmVycmlkZVVJRGVjaXNpb24gT3ZlcnJpZGUgdGhlIGV4aXN0aW5nIFVJIGRlY2lzaW9uIHRvIHNob3cgbWVzc2FnZXMgd2l0aCB0aGUgbmV3IG9uZS5cblx0ICpcblx0ICogJ292ZXJyaWRlVUlEZWNpc2lvbicsIFRoaXMgd291bGQgYmUgbmVlZGVkIHdoZW4gdGhlcmUgaXMgYSBjaGFuZ2UgaW4gcGFnZSBjb250ZXh0IGFuZCB0aGUgcGFyYW10ZXJzIHRvIGNyZWF0ZSB0aGUgbmV3IFVJIGRlY2lzaW9uIGFyZSBkaWZmZXJlbnQuXG5cdCAqL1xuXHR1cGRhdGVVSURlY2lzaW9ucyhuZXdVSURlY2lzaW9uczogTWVzc2FnZVVJRGVjaXNpb25zLCBvdmVycmlkZVVJRGVjaXNpb24gPSBmYWxzZSk6IHZvaWQge1xuXHRcdGNvbnN0IGludGVybmFsTW9kZWwgPSB0aGlzLmJhc2UuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0TW9kZWwoXCJpbnRlcm5hbFwiKSBhcyBKU09OTW9kZWw7XG5cdFx0Y29uc3Qgb2xkVUlEZWNpc2lvbnMgPSBcdGludGVybmFsTW9kZWwuZ2V0UHJvcGVydHkoXCIvbWVzc2FnZVVJRGVjaXNpb25cIikgYXMgTWVzc2FnZVVJRGVjaXNpb25zO1xuXHRcdDtcblx0XHRsZXQgYWxsTWVzc2FnZXNUb1Nob3c6IE1lc3NhZ2VbXSA9IFtdO1xuXHRcdGxldCBtZXJnZWRVSURlY2lzaW9uO1xuXHRcdGlmIChvbGRVSURlY2lzaW9ucyAmJiBvdmVycmlkZVVJRGVjaXNpb24gPT09IGZhbHNlKSB7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdG9sZFVJRGVjaXNpb25zLm1lc3NhZ2VzVG9TaG93Lmxlbmd0aCA9PT0gMSAmJlxuXHRcdFx0XHRuZXdVSURlY2lzaW9ucy5tZXNzYWdlc1RvU2hvdy5sZW5ndGggPT09IDEgJiZcblx0XHRcdFx0b2xkVUlEZWNpc2lvbnMubWVzc2FnZXNUb1Nob3dbMF0uZ2V0Q29kZSgpID09PSBcIkNfQ09NTU9OX1NVQ0NFU1NfTUVTU0FHRVwiICYmXG5cdFx0XHRcdG5ld1VJRGVjaXNpb25zLm1lc3NhZ2VzVG9TaG93WzBdLmdldENvZGUoKSA9PT0gXCJDX0NPTU1PTl9TVUNDRVNTX01FU1NBR0VcIlxuXHRcdFx0KSB7XG5cdFx0XHRcdC8vIENoZWNrIGlmIGJvdGggYXJlIGdlbmVyaWMgc3VjY2VzcyBtZXNzYWdlcywgdGhlbiB3ZSBzaG93IG9ubHkgb25lIG1lc3NhZ2UuXG5cdFx0XHRcdGFsbE1lc3NhZ2VzVG9TaG93ID0gb2xkVUlEZWNpc2lvbnMubWVzc2FnZXNUb1Nob3c7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRhbGxNZXNzYWdlc1RvU2hvdyA9IEFycmF5LmZyb20obmV3IFNldChbLi4ub2xkVUlEZWNpc2lvbnMubWVzc2FnZXNUb1Nob3csIC4uLm5ld1VJRGVjaXNpb25zLm1lc3NhZ2VzVG9TaG93XSkpO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgZWxlbWVudHMgPSBbb2xkVUlEZWNpc2lvbnMudWlFbGVtZW50VG9Vc2UsIG5ld1VJRGVjaXNpb25zLnVpRWxlbWVudFRvVXNlXTtcblx0XHRcdC8vIERlZmF1bHQgd2Ugc2hvdyBkaWFsb2dcblx0XHRcdGxldCB1aUVsZW1lbnRUb1VzZTogU3VwcG9ydGVkVUlFbGVtZW50ID0gYWxsTWVzc2FnZXNUb1Nob3cubGVuZ3RoID4gMCA/IFwiRGlhbG9nXCIgOiBcIk5vbmVcIjtcblxuXHRcdFx0aWYgKGFsbE1lc3NhZ2VzVG9TaG93Lmxlbmd0aCA9PT0gMSkge1xuXHRcdFx0XHQvLyBTaW5nbGUgbWVzc2FnZSwgd2UgY2hlY2sgZm9yIHNwZWNpZmljIFVJIEVsZW1lbnQgdG8gdXNlLlxuXHRcdFx0XHRpZiAoZWxlbWVudHMuaW5jbHVkZXMoXCJUb2FzdFwiKSkge1xuXHRcdFx0XHRcdHVpRWxlbWVudFRvVXNlID0gXCJUb2FzdFwiO1xuXHRcdFx0XHR9IGVsc2UgaWYgKGVsZW1lbnRzLmluY2x1ZGVzKFwiQm94XCIpKSB7XG5cdFx0XHRcdFx0dWlFbGVtZW50VG9Vc2UgPSBcIkJveFwiO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdG1lcmdlZFVJRGVjaXNpb24gPSB7XG5cdFx0XHRcdG1lc3NhZ2VzVG9TaG93OiBhbGxNZXNzYWdlc1RvU2hvdyxcblx0XHRcdFx0dWlFbGVtZW50VG9Vc2UsXG5cdFx0XHRcdGNvbnRleHROZWVkc0V0YWdSZWZyZXNoOiBvbGRVSURlY2lzaW9ucy5jb250ZXh0TmVlZHNFdGFnUmVmcmVzaCB8fCBuZXdVSURlY2lzaW9ucy5jb250ZXh0TmVlZHNFdGFnUmVmcmVzaCxcblx0XHRcdFx0Y29udGFpbnNCb3VuZFRyYW5zaXRpb246IG9sZFVJRGVjaXNpb25zLmNvbnRhaW5zQm91bmRUcmFuc2l0aW9uIHx8IG5ld1VJRGVjaXNpb25zLmNvbnRhaW5zQm91bmRUcmFuc2l0aW9uXG5cdFx0XHR9O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRtZXJnZWRVSURlY2lzaW9uID0gbmV3VUlEZWNpc2lvbnM7XG5cdFx0fVxuXHRcdGludGVybmFsTW9kZWwuc2V0UHJvcGVydHkoXCIvbWVzc2FnZVVJRGVjaXNpb25cIiwgbWVyZ2VkVUlEZWNpc2lvbik7XG5cdH1cblxuXHQvKipcblx0ICogUmVtb3ZlIGhlbGQga2V5LlxuXHQgKiBAcGFyYW0gaW5LZXkgS2V5IHRvIHJlbW92ZS5cblx0ICovXG5cdHJlbW92ZUhvbGRLZXkoaW5LZXk/OiBzdHJpbmcpOiB2b2lkIHtcblx0XHRpZiAoaW5LZXkgJiYgdGhpcy5ob2xkS2V5cy5pbmNsdWRlcyhpbktleSkpIHtcblx0XHRcdHRoaXMuaG9sZEtleXMuc3BsaWNlKHRoaXMuaG9sZEtleXMuaW5kZXhPZihpbktleSksIDEpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVjayBpZiBVSSBFbGVtZW50IHdpdGggbWVzc2FnZXMgc2hvdWxkIGJlIHNob3duLlxuXHQgKiBAcmV0dXJucyBCb29sZWFuXG5cdCAqL1xuXHRjaGVja1RvU2hvd1VJRWxlbWVudCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5ob2xkTXNnc1RvU2hvdyAmJiAodGhpcy5ob2xkS2V5cy5sZW5ndGggPiAwID8gZmFsc2UgOiB0cnVlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBIb2xkIG1lc3NhZ2VzIGZvciB0aGUgY29udHJvbC5cblx0ICogQHBhcmFtIGNvbnRyb2xcblx0ICovXG5cdGhvbGRNZXNzYWdlc0ZvckNvbnRyb2woY29udHJvbDogQ29udHJvbCk6IHZvaWQge1xuXHRcdGNvbnN0IGlkZW50aWZpZXIgPSBjb250cm9sLmdldElkKCk7XG5cdFx0dGhpcy5yZWdpc3RlclRvSG9sZE1lc3NhZ2VzKGlkZW50aWZpZXIpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlbGVhc2UgbWVzc2FnZSBob2xkIGJ5IGEgY29udHJvbC5cblx0ICogQHBhcmFtIGNvbnRyb2xcblx0ICovXG5cdGFzeW5jIHJlbGVhc2VIb2xkQnlDb250cm9sKGNvbnRyb2w/OiBDb250cm9sKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgaWRlbnRpZmllciA9IGNvbnRyb2w/LmdldElkKCk7XG5cdFx0dGhpcy5yZW1vdmVIb2xkS2V5KGlkZW50aWZpZXIpO1xuXHRcdGNvbnN0IHVpRWxlbWVudElzQXZhaWxhYmxlID0gdGhpcy5iYXNlLmdldEFwcENvbXBvbmVudCgpLmdldE1vZGVsKFwiaW50ZXJuYWxcIik/LmdldFByb3BlcnR5KFwiL21lc3NhZ2VVSUVsZW1lbnRJc0F2YWlsYWJsZVwiKTtcblx0XHQodGhpcy5iYXNlLmdldEFwcENvbXBvbmVudCgpLmdldE1vZGVsKFwiaW50ZXJuYWxcIikgYXMgSlNPTk1vZGVsKT8uc2V0UHJvcGVydHkoXCIvbWVzc2FnZVVJRWxlbWVudElzQXZhaWxhYmxlXCIsIHVpRWxlbWVudElzQXZhaWxhYmxlPy50aGVuKFxuXHRcdFx0YXN5bmMgZnVuY3Rpb24gKHRoaXM6IE1lc3NhZ2VIYW5kbGVyKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0XHRcdHJldHVybiB0aGlzLnNob3dNZXNzYWdlc1dpdGhDb25kdGlvbnMoKTtcblx0XHRcdH0uYmluZCh0aGlzKSkpO1xuXHRcdGF3YWl0IHRoaXMuYmFzZS5nZXRBcHBDb21wb25lbnQoKS5nZXRNb2RlbChcImludGVybmFsXCIpPy5nZXRQcm9wZXJ0eShcIi9tZXNzYWdlVUlFbGVtZW50SXNBdmFpbGFibGVcIik7XG5cdH1cblxuXHQvKipcblx0ICogU2hvd3MgYSBtZXNzYWdlIHBhZ2Ugb3IgYSBtZXNzYWdlIGRpYWxvZyBiYXNlZCBvbiB0aGUgbWVzc2FnZXMgaW4gdGhlIG1lc3NhZ2UgZGlhbG9nLlxuXHQgKiBAcGFyYW0gW3BhcmFtZXRlcnNdXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIG9uY2UgdGhlIHVzZXIgY2xvc2VzIHRoZSBtZXNzYWdlIGRpYWxvZyBvciB3aGVuIG5hdmlnYXRpb24gdG8gdGhlIG1lc3NhZ2UgcGFnZSBpcyBjb21wbGV0ZS4gSWYgdGhlcmUgYXJlIG5vIG1lc3NhZ2VzXG5cdCAqIHRvIGJlIHNob3duLCB0aGUgcHJvbWlzZSBpcyByZXNvbHZlZCBpbW1lZGlhdGVseVxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGFzeW5jIHNob3dNZXNzYWdlcyhwYXJhbWV0ZXJzPzogU2hvd01lc3NhZ2VzUGFyYW1ldGVycyk6IFByb21pc2U8dm9pZCB8IGJvb2xlYW4gfCBEaWFsb2c+IHtcblx0XHRjb25zdCBtZXNzYWdlUGFnZVBhcmFtZXRlcnMgPSB0aGlzLl9jaGVja05hdmlnYXRpb25Ub0Vycm9yUGFnZShwYXJhbWV0ZXJzKTtcblxuXHRcdGlmIChtZXNzYWdlUGFnZVBhcmFtZXRlcnMpIHtcblx0XHRcdC8vIG5hdmlnYXRlIHRvIG1lc3NhZ2UgcGFnZS5cblx0XHRcdC8vIGhhbmRsZXIgYmVmb3JlIHBhZ2UgbmF2aWdhdGlvbiBpcyB0cmlnZ2VyZWQsIGZvciBleGFtcGxlIHRvIGNsb3NlIHRoZSBhY3Rpb24gcGFyYW1ldGVyIGRpYWxvZ1xuXHRcdFx0aWYgKHBhcmFtZXRlcnM/Lm1lc3NhZ2VQYWdlTmF2aWdhdGlvbkNhbGxiYWNrKSB7XG5cdFx0XHRcdHBhcmFtZXRlcnMubWVzc2FnZVBhZ2VOYXZpZ2F0aW9uQ2FsbGJhY2soKTtcblx0XHRcdH1cblxuXHRcdFx0bWVzc2FnZVBhZ2VQYXJhbWV0ZXJzLmhhbmRsZVNoZWxsQmFjayA9ICFwYXJhbWV0ZXJzPy5zaGVsbEJhY2s7XG5cdFx0XHR0aGlzLnJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcygpO1xuXHRcdFx0Y29uc3Qgb1Jlc291cmNlQnVuZGxlID0gTGlicmFyeS5nZXRSZXNvdXJjZUJ1bmRsZUZvcihcInNhcC5mZS5jb3JlXCIpITtcblxuXHRcdFx0cmV0dXJuIG5ldyBQcm9taXNlPGJvb2xlYW4+KChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRcdFx0Ly8gd2UgaGF2ZSB0byBzZXQgYSB0aW1lb3V0IHRvIGJlIGFibGUgdG8gYWNjZXNzIHRoZSBtb3N0IHJlY2VudCBtZXNzYWdlc1xuXHRcdFx0XHRzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdFx0XHQvLyBjbGVhciBhbGwgaG9sZCBrZXlzIGFzIHdlIG5hdmlnYXRlIHRvIG1lc3NhZ2UgcGFnZS5cblx0XHRcdFx0XHR0aGlzLnJlc2V0SG9sZEtleXMoKTtcblxuXHRcdFx0XHRcdC8vIFRPRE86IGdyZWF0IEFQSSAtIHdpbGwgYmUgY2hhbmdlZCBsYXRlclxuXHRcdFx0XHRcdHRoaXMuYmFzZS5fcm91dGluZ1xuXHRcdFx0XHRcdFx0Lm5hdmlnYXRlVG9NZXNzYWdlUGFnZShcblx0XHRcdFx0XHRcdFx0cGFyYW1ldGVycz8uaXNEYXRhUmVjZWl2ZWRFcnJvciA9PT0gdHJ1ZVxuXHRcdFx0XHRcdFx0XHRcdD8gb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0NPTU1PTl9TQVBGRV9EQVRBX1JFQ0VJVkVEX0VSUk9SXCIpXG5cdFx0XHRcdFx0XHRcdFx0OiBvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfTUVTU0FHRV9IQU5ETElOR19TQVBGRV81MDNfVElUTEVcIiksXG5cdFx0XHRcdFx0XHRcdG1lc3NhZ2VQYWdlUGFyYW1ldGVyc1xuXHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0LnRoZW4ocmVzb2x2ZSlcblx0XHRcdFx0XHRcdC5jYXRjaChyZWplY3QpO1xuXHRcdFx0XHR9LCAwKTtcblx0XHRcdH0pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBuYXZpZ2F0ZSB0byBtZXNzYWdlIGRpYWxvZ1xuXHRcdFx0cmV0dXJuIHRoaXMuc2hvd01lc3NhZ2VEaWFsb2cocGFyYW1ldGVycyk7XG5cdFx0fVxuXHR9XG59XG5leHBvcnQgZGVmYXVsdCBNZXNzYWdlSGFuZGxlcjtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7RUEwRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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
@@ -1,7 +1,7 @@
1
1
  import Log from "sap/base/Log";
2
2
  import deepEqual from "sap/base/util/deepEqual";
3
3
  import uid from "sap/base/util/uid";
4
- import { defineUI5Class, extensible, finalExtension, privateExtension, publicExtension } from "sap/fe/base/ClassSupport";
4
+ import { defineUI5Class, extensible, finalExtension, methodOverride, privateExtension, publicExtension } from "sap/fe/base/ClassSupport";
5
5
  import CommonUtils from "sap/fe/core/CommonUtils";
6
6
  import type PageController from "sap/fe/core/PageController";
7
7
  import type {
@@ -21,6 +21,7 @@ import MessageType from "sap/ui/core/message/MessageType";
21
21
  import ControllerExtension from "sap/ui/core/mvc/ControllerExtension";
22
22
  import OverrideExecution from "sap/ui/core/mvc/OverrideExecution";
23
23
  import type Context from "sap/ui/model/Context";
24
+ import type JSONModel from "sap/ui/model/json/JSONModel";
24
25
  import type ODataV4Context from "sap/ui/model/odata/v4/Context";
25
26
 
26
27
  type ObjectWithConverterType = object & {
@@ -97,17 +98,20 @@ class MessageHandler extends ControllerExtension {
97
98
 
98
99
  protected holdKeys: string[] = [];
99
100
 
100
- protected uiDecisions: MessageUIDecisions | undefined;
101
101
 
102
102
  private holdMsgsToShow = false;
103
103
 
104
- // We await showMessageDialog until the UI element is available.
105
- private uiElementIsAvailable = Promise.resolve();
106
-
107
104
  constructor() {
108
105
  super();
109
106
  }
110
107
 
108
+ @methodOverride()
109
+ onInit() : void {
110
+ const internalModel = this.base.getAppComponent().getModel("internal") as JSONModel;
111
+ internalModel.setProperty("/messageUIDecision", undefined);
112
+ internalModel.setProperty("/messageUIElementIsAvailable", Promise.resolve());
113
+ }
114
+
111
115
  /**
112
116
  * Adds warning messages to the message handler.
113
117
  * @param aMessages The strict warning messages to be added
@@ -232,8 +236,10 @@ class MessageHandler extends ControllerExtension {
232
236
  @publicExtension()
233
237
  @finalExtension()
234
238
  async showMessageDialog(mParameters?: ShowMessageDialogParameter): Promise<void> {
239
+ const internalModel = this.base.getAppComponent().getModel("internal") as JSONModel;
235
240
  // remove strict warning messages from the message model before showing the message dialog
236
- await this.uiElementIsAvailable;
241
+ await internalModel.getProperty("/messageUIElementIsAvailable");
242
+
237
243
 
238
244
  const messagesInModel = Messaging.getMessageModel().getData();
239
245
  const duplicateWarningMessage = messagesInModel.filter((message: Message) => {
@@ -328,8 +334,12 @@ class MessageHandler extends ControllerExtension {
328
334
  );
329
335
  this.updateUIDecisions(newUIDecisions, overrideUIDecision);
330
336
  this.removeHoldKey(unHoldKey ?? control?.getId());
331
- this.showMessagesWithCondtions(forceShowUIElement, success, failure);
332
- }
337
+ const uiElementIsAvailable = this.base.getAppComponent().getModel("internal")?.getProperty("/messageUIElementIsAvailable");
338
+ (this.base.getAppComponent().getModel("internal") as JSONModel)?.setProperty("/messageUIElementIsAvailable", uiElementIsAvailable.then(
339
+ async function (this: MessageHandler): Promise<void> {
340
+ return this.showMessagesWithCondtions(forceShowUIElement, success, failure);
341
+ }.bind(this)));
342
+ }
333
343
 
334
344
  /**
335
345
  * Show Messages in the UI based on conditions.
@@ -343,18 +353,18 @@ class MessageHandler extends ControllerExtension {
343
353
  failure?: (err?: unknown) => void
344
354
  ): Promise<void> {
345
355
  const showUIElement = forceShowUIElement || this.checkToShowUIElement();
346
- if (showUIElement && this.uiDecisions) {
356
+ const internalModel = this.base.getAppComponent().getModel("internal") as JSONModel;
357
+ if (showUIElement && internalModel.getProperty("/messageUIDecision")) {
347
358
  // Show UI element for the present decision and clear the decision.
348
359
  try {
349
- this.uiElementIsAvailable = messageHandling.showMessagesInUI(this.uiDecisions);
350
- const ret = await this.uiElementIsAvailable;
360
+ const ret = await messageHandling.showMessagesInUI(internalModel.getProperty("/messageUIDecision"));
351
361
  success?.(ret);
352
362
  } catch (err: unknown) {
353
363
  Log.error(`FE : V4 : MessageHandler : Error on trying to show UI element: ${err}`);
354
- this.uiElementIsAvailable = Promise.resolve();
355
364
  failure?.(err);
365
+ internalModel.setProperty("/messageUIElementIsAvailable", Promise.resolve());
356
366
  }
357
- this.uiDecisions = undefined;
367
+ internalModel.setProperty("/messageUIDecision", undefined);
358
368
  this.clearStrictWarningMessages();
359
369
  this.holdMsgsToShow = false;
360
370
  } else {
@@ -461,7 +471,9 @@ class MessageHandler extends ControllerExtension {
461
471
  * 'overrideUIDecision', This would be needed when there is a change in page context and the paramters to create the new UI decision are different.
462
472
  */
463
473
  updateUIDecisions(newUIDecisions: MessageUIDecisions, overrideUIDecision = false): void {
464
- const oldUIDecisions = this.uiDecisions;
474
+ const internalModel = this.base.getAppComponent().getModel("internal") as JSONModel;
475
+ const oldUIDecisions = internalModel.getProperty("/messageUIDecision") as MessageUIDecisions;
476
+ ;
465
477
  let allMessagesToShow: Message[] = [];
466
478
  let mergedUIDecision;
467
479
  if (oldUIDecisions && overrideUIDecision === false) {
@@ -498,8 +510,7 @@ class MessageHandler extends ControllerExtension {
498
510
  } else {
499
511
  mergedUIDecision = newUIDecisions;
500
512
  }
501
-
502
- this.uiDecisions = mergedUIDecision;
513
+ internalModel.setProperty("/messageUIDecision", mergedUIDecision);
503
514
  }
504
515
 
505
516
  /**
@@ -536,12 +547,12 @@ class MessageHandler extends ControllerExtension {
536
547
  async releaseHoldByControl(control?: Control): Promise<void> {
537
548
  const identifier = control?.getId();
538
549
  this.removeHoldKey(identifier);
539
- this.uiElementIsAvailable = this.uiElementIsAvailable.then(
550
+ const uiElementIsAvailable = this.base.getAppComponent().getModel("internal")?.getProperty("/messageUIElementIsAvailable");
551
+ (this.base.getAppComponent().getModel("internal") as JSONModel)?.setProperty("/messageUIElementIsAvailable", uiElementIsAvailable?.then(
540
552
  async function (this: MessageHandler): Promise<void> {
541
553
  return this.showMessagesWithCondtions();
542
- }.bind(this)
543
- );
544
- await this.uiElementIsAvailable;
554
+ }.bind(this)));
555
+ await this.base.getAppComponent().getModel("internal")?.getProperty("/messageUIElementIsAvailable");
545
556
  }
546
557
 
547
558
  /**