@sapui5/sap.fe.core 1.136.3 → 1.136.5

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 (64) hide show
  1. package/package.json +1 -1
  2. package/src/sap/fe/core/.library +1 -1
  3. package/src/sap/fe/core/controllerextensions/EditFlow.js +3 -3
  4. package/src/sap/fe/core/controllerextensions/EditFlow.ts +6 -2
  5. package/src/sap/fe/core/controllerextensions/MessageHandler.js +21 -5
  6. package/src/sap/fe/core/controllerextensions/MessageHandler.ts +19 -1
  7. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +4 -3
  8. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +10 -3
  9. package/src/sap/fe/core/controllerextensions/editFlow/draft.js +6 -5
  10. package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +8 -4
  11. package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +4 -3
  12. package/src/sap/fe/core/controllerextensions/editFlow/sticky.ts +6 -2
  13. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +4 -17
  14. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +6 -19
  15. package/src/sap/fe/core/fpm/manifest.json +1 -1
  16. package/src/sap/fe/core/library.js +1 -1
  17. package/src/sap/fe/core/messagebundle_ar.properties +2 -0
  18. package/src/sap/fe/core/messagebundle_bg.properties +2 -0
  19. package/src/sap/fe/core/messagebundle_ca.properties +2 -0
  20. package/src/sap/fe/core/messagebundle_cnr.properties +2 -0
  21. package/src/sap/fe/core/messagebundle_cs.properties +2 -0
  22. package/src/sap/fe/core/messagebundle_cy.properties +2 -0
  23. package/src/sap/fe/core/messagebundle_da.properties +2 -0
  24. package/src/sap/fe/core/messagebundle_de.properties +2 -0
  25. package/src/sap/fe/core/messagebundle_el.properties +2 -0
  26. package/src/sap/fe/core/messagebundle_en.properties +2 -0
  27. package/src/sap/fe/core/messagebundle_en_GB.properties +2 -0
  28. package/src/sap/fe/core/messagebundle_es.properties +3 -1
  29. package/src/sap/fe/core/messagebundle_es_MX.properties +2 -0
  30. package/src/sap/fe/core/messagebundle_et.properties +2 -0
  31. package/src/sap/fe/core/messagebundle_fi.properties +2 -0
  32. package/src/sap/fe/core/messagebundle_fr.properties +2 -0
  33. package/src/sap/fe/core/messagebundle_fr_CA.properties +2 -0
  34. package/src/sap/fe/core/messagebundle_hi.properties +2 -0
  35. package/src/sap/fe/core/messagebundle_hr.properties +2 -0
  36. package/src/sap/fe/core/messagebundle_hu.properties +2 -0
  37. package/src/sap/fe/core/messagebundle_id.properties +2 -0
  38. package/src/sap/fe/core/messagebundle_it.properties +2 -0
  39. package/src/sap/fe/core/messagebundle_iw.properties +2 -0
  40. package/src/sap/fe/core/messagebundle_ja.properties +2 -0
  41. package/src/sap/fe/core/messagebundle_kk.properties +2 -0
  42. package/src/sap/fe/core/messagebundle_ko.properties +2 -0
  43. package/src/sap/fe/core/messagebundle_lt.properties +2 -0
  44. package/src/sap/fe/core/messagebundle_lv.properties +2 -0
  45. package/src/sap/fe/core/messagebundle_mk.properties +2 -0
  46. package/src/sap/fe/core/messagebundle_ms.properties +2 -0
  47. package/src/sap/fe/core/messagebundle_nl.properties +2 -0
  48. package/src/sap/fe/core/messagebundle_no.properties +2 -0
  49. package/src/sap/fe/core/messagebundle_pl.properties +2 -0
  50. package/src/sap/fe/core/messagebundle_pt.properties +2 -0
  51. package/src/sap/fe/core/messagebundle_pt_PT.properties +2 -0
  52. package/src/sap/fe/core/messagebundle_ro.properties +2 -0
  53. package/src/sap/fe/core/messagebundle_ru.properties +2 -0
  54. package/src/sap/fe/core/messagebundle_sh.properties +2 -0
  55. package/src/sap/fe/core/messagebundle_sk.properties +2 -0
  56. package/src/sap/fe/core/messagebundle_sl.properties +2 -0
  57. package/src/sap/fe/core/messagebundle_sr.properties +2 -0
  58. package/src/sap/fe/core/messagebundle_sv.properties +2 -0
  59. package/src/sap/fe/core/messagebundle_th.properties +2 -0
  60. package/src/sap/fe/core/messagebundle_tr.properties +2 -0
  61. package/src/sap/fe/core/messagebundle_uk.properties +2 -0
  62. package/src/sap/fe/core/messagebundle_vi.properties +2 -0
  63. package/src/sap/fe/core/messagebundle_zh_CN.properties +2 -0
  64. package/src/sap/fe/core/messagebundle_zh_TW.properties +2 -0
@@ -1047,7 +1047,8 @@ class TransactionHelper {
1047
1047
  bindingsForSideEffects: ODataListBinding[],
1048
1048
  messageHandler: MessageHandler,
1049
1049
  isNewObject: boolean,
1050
- skipConfirmationMsg = false
1050
+ skipConfirmationMsg = false,
1051
+ isStandardSave?: boolean
1051
1052
  ): Promise<ODataV4Context> {
1052
1053
  const sProgrammingModel = this.getProgrammingModel(context);
1053
1054
  if (sProgrammingModel !== ProgrammingModel.Sticky && sProgrammingModel !== ProgrammingModel.Draft) {
@@ -1059,8 +1060,14 @@ class TransactionHelper {
1059
1060
  const entitySetName = this.getCollectionNameFromContext(context);
1060
1061
  const oActiveDocument =
1061
1062
  sProgrammingModel === ProgrammingModel.Draft
1062
- ? await draft.activateDocument(context, appComponent, messageHandler, { resourceModel: resourceModel })
1063
- : await sticky.activateDocument(context, appComponent, messageHandler, { resourceModel: resourceModel });
1063
+ ? await draft.activateDocument(context, appComponent, messageHandler, { resourceModel: resourceModel }, isStandardSave)
1064
+ : await sticky.activateDocument(
1065
+ context,
1066
+ appComponent,
1067
+ messageHandler,
1068
+ { resourceModel: resourceModel },
1069
+ isStandardSave
1070
+ );
1064
1071
 
1065
1072
  const messagesReceived = messageHandling.getMessages().concat(messageHandling.getMessages(true, true)); // get unbound and bound messages present in the model
1066
1073
  if (!skipConfirmationMsg && !(messagesReceived.length === 1 && messagesReceived[0].getType() === MessageType.Success)) {
@@ -174,7 +174,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/isEmptyObject", "sap/fe/core/Commo
174
174
  * @param [resourceModel] The resource model to load text resources
175
175
  * @returns Resolve function returns the context of the operation
176
176
  */
177
- async function executeDraftActivationAction(oContext, oAppComponent, messageHandler, sGroupId, oPreparePromise, resourceModel) {
177
+ async function executeDraftActivationAction(oContext, oAppComponent, messageHandler, sGroupId, oPreparePromise, resourceModel, isStandardSave) {
178
178
  const bHasPrepareAction = draft.hasPrepareAction(oContext);
179
179
  // According to the draft spec if the service contains a prepare action and we trigger both prepare and
180
180
  // activate in one $batch the activate action is called with iF-Match=*
@@ -182,12 +182,13 @@ sap.ui.define(["sap/base/Log", "sap/base/util/isEmptyObject", "sap/fe/core/Commo
182
182
  let operation;
183
183
  if (!oContext.getProperty("IsActiveEntity")) {
184
184
  const convertedAction = getConvertedAction(oContext, draftOperations.ACTIVATION);
185
+ const label = isStandardSave ? resourceModel?.getText("T_OP_OBJECT_PAGE_SAVE") : resourceModel?.getText("C_OP_OBJECT_PAGE_SAVE");
185
186
  if (convertedAction) {
186
187
  try {
187
188
  operation = new Operation(oAppComponent, oContext.getModel(), convertedAction, {
188
189
  messageHandler: messageHandler,
189
190
  contexts: [oContext],
190
- label: resourceModel?.getText("T_OP_OBJECT_PAGE_SAVE"),
191
+ label: label,
191
192
  bindingParameters: {
192
193
  $$inheritExpandSelect: true
193
194
  },
@@ -588,7 +589,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/isEmptyObject", "sap/fe/core/Commo
588
589
  * @param [mParameters.resourceModel] Resource Model
589
590
  * @returns Promise resolves with the {@link sap.ui.model.odata.v4.Context context} of the new draft document
590
591
  */
591
- async function activateDocument(oContext, oAppComponent, messageHandler, mParameters) {
592
+ async function activateDocument(oContext, oAppComponent, messageHandler, mParameters, isStandardSave) {
592
593
  const mParam = mParameters || {};
593
594
  if (!oContext) {
594
595
  throw new Error("Binding context to draft document is required");
@@ -609,7 +610,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/isEmptyObject", "sap/fe/core/Commo
609
610
  // we use the same batchGroup to force prepare and activate in a same batch but with different changeset
610
611
  const oPreparePromise = draft.executeDraftPreparationAction(oContext, sBatchGroup, undefined, ignoreEtag);
611
612
  oContext.getModel().submitBatch(sBatchGroup);
612
- const oActivatePromise = draft.executeDraftActivationAction(oContext, oAppComponent, messageHandler, sBatchGroup, oPreparePromise, mParameters.resourceModel);
613
+ const oActivatePromise = draft.executeDraftActivationAction(oContext, oAppComponent, messageHandler, sBatchGroup, oPreparePromise, mParameters.resourceModel, isStandardSave);
613
614
  const values = await Promise.all([oPreparePromise, oActivatePromise]);
614
615
  oActiveDocumentContext = values[1];
615
616
  }
@@ -714,4 +715,4 @@ sap.ui.define(["sap/base/Log", "sap/base/util/isEmptyObject", "sap/fe/core/Commo
714
715
  };
715
716
  return draft;
716
717
  }, false);
717
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJkcmFmdE9wZXJhdGlvbnMiLCJFRElUIiwiQUNUSVZBVElPTiIsIkRJU0NBUkQiLCJQUkVQQVJFIiwiZ2V0QWN0aW9uTmFtZSIsIm9Db250ZXh0Iiwic09wZXJhdGlvbiIsIm9Nb2RlbCIsImdldE1vZGVsIiwib01ldGFNb2RlbCIsImdldE1ldGFNb2RlbCIsInNFbnRpdHlTZXRQYXRoIiwiZ2V0TWV0YVBhdGgiLCJnZXRQYXRoIiwiZ2V0T2JqZWN0IiwiY3JlYXRlT3BlcmF0aW9uIiwib09wdGlvbnMiLCJzT3BlcmF0aW9uTmFtZSIsImJpbmRDb250ZXh0IiwiZ2V0Q29udmVydGVkQWN0aW9uIiwiY29udGV4dCIsIm9wZXJhdGlvbiIsIm9wZXJhdGlvbk5hbWUiLCJtZXRhTW9kZWwiLCJhY3Rpb25QYXRoIiwiYm91bmRBY3Rpb24iLCJjcmVhdGVCaW5kaW5nQ29udGV4dCIsImNvbnZlcnRUeXBlcyIsInJlc29sdmVQYXRoIiwidGFyZ2V0IiwiZ2V0UmV0dXJuVHlwZSIsImhhc1ByZXBhcmVBY3Rpb24iLCJleGVjdXRlRHJhZnRFZGl0QWN0aW9uIiwiYlByZXNlcnZlQ2hhbmdlcyIsIm9WaWV3IiwiZ3JvdXBJZCIsIm1lc3NhZ2VIYW5kbGVyIiwib3ZlcndyaXRlQ2hhbmdlIiwiY29udmVydGVkQWN0aW9uIiwiT3BlcmF0aW9uIiwiQ29tbW9uVXRpbHMiLCJnZXRBcHBDb21wb25lbnQiLCJjb250ZXh0cyIsImxhYmVsIiwiZ2V0UmVzb3VyY2VNb2RlbCIsImdldFRleHQiLCJiaW5kaW5nUGFyYW1ldGVycyIsIiQkaW5oZXJpdEV4cGFuZFNlbGVjdCIsIiQkdXBkYXRlR3JvdXBJZCIsInNraXBNZXNzYWdlcyIsIm9EYXRhUHJvcGVydGllcyIsImRpc2FibGVTaWRlRWZmZWN0cyIsImlnbm9yZUVUYWciLCJpc0VtcHR5T2JqZWN0IiwicmVwbGFjZVdpdGhSVkMiLCJnZXRCaW5kaW5nIiwiaXNBIiwiZGVmZXJyZWRTdWJtaXQiLCJzZXREZWZhdWx0UGFyYW1ldGVyc1ZhbHVlcyIsIlByZXNlcnZlQ2hhbmdlcyIsInJlc3VsdCIsImV4ZWN1dGUiLCJzdGF0dXMiLCJtb2RpZmllZEVycm9yIiwiRXJyb3IiLCJyZWFzb24iLCJ2YWx1ZSIsInJldHVybmVkQ29udGV4dCIsImV4ZWN1dGVEcmFmdFZhbGlkYXRpb24iLCJhcHBDb21wb25lbnQiLCJNb2RlbEhlbHBlciIsImdldE1lc3NhZ2VzUGF0aCIsImRyYWZ0IiwiaXNLZWVwQWxpdmUiLCJyZXF1ZXN0T2JqZWN0IiwiZXhlY3V0ZURyYWZ0UHJlcGFyYXRpb25BY3Rpb24iLCJnZXRVcGRhdGVHcm91cElkIiwicmVxdWVzdE1lc3NhZ2VzIiwiZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlIiwiZXJyb3IiLCJMb2ciLCJ1bmRlZmluZWQiLCJleGVjdXRlRHJhZnRBY3RpdmF0aW9uQWN0aW9uIiwib0FwcENvbXBvbmVudCIsInNHcm91cElkIiwib1ByZXBhcmVQcm9taXNlIiwicmVzb3VyY2VNb2RlbCIsImJIYXNQcmVwYXJlQWN0aW9uIiwiYklnbm9yZUV0YWciLCJnZXRQcm9wZXJ0eSIsImUiLCJwcmVwYXJlT3BlcmF0aW9uIiwiZGVzdHJveSIsImNsZWFyIiwiYWN0aW9uTmFtZSIsIm9TaWRlRWZmZWN0c1NlcnZpY2UiLCJvQmluZGluZ1BhcmFtZXRlcnMiLCJnZXRPRGF0YUFjdGlvblNpZGVFZmZlY3RzIiwiYVRhcmdldFBhdGhzIiwicGF0aEV4cHJlc3Npb25zIiwibGVuZ3RoIiwicmVxdWVzdFNpZGVFZmZlY3RzIiwib0Vycm9yIiwiZ2V0TWVzc2FnZVBhdGhGb3JQcmVwYXJlIiwiZ2V0TWVzc2FnZVBhdGhGb3JDb250ZXh0IiwibWV0YUNvbnRleHQiLCJnZXRNZXRhQ29udGV4dCIsImNvbnZlcnRlZENvbnRleHQiLCJnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMiLCJtZXNzYWdlcyIsInRhcmdldEVudGl0eVR5cGUiLCJhbm5vdGF0aW9ucyIsIkNvbW1vbiIsIk1lc3NhZ2VzIiwiaXNQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb24iLCJwYXRoIiwiYk1lc3NhZ2VzIiwic01lc3NhZ2VzUGF0aCIsIm9PcGVyYXRpb24iLCIkc2VsZWN0Iiwic2V0UGFyYW1ldGVyIiwiZ2V0R3JvdXBJZCIsImludm9rZSIsInRoZW4iLCJjYXRjaCIsInJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcyIsImFyZ3VtZW50cyIsImRhdGEiLCJtZXNzYWdlSGFuZGxpbmciLCJyZW1vdmVVbmJvdW5kVHJhbnNpdGlvbk1lc3NhZ2VzIiwicmVtb3ZlQm91bmRUcmFuc2l0aW9uTWVzc2FnZXMiLCJleGVjdXRlRHJhZnREaXNjYXJkQWN0aW9uIiwiYkVuYWJsZVN0cmljdEhhbmRsaW5nIiwiZGlzYWJsZVN0cmljdEhhbmRsaW5nIiwiY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbiIsInJvb3RDdXJyZW50Q29udGV4dCIsInJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0Iiwicm9vdENvbnRleHRJbmZvIiwiY3JlYXRlS2VlcEFsaXZlQ29udGV4dCIsInN0YXJ0c1dpdGgiLCJtb2RlbCIsImFkZGl0aW9uYWxQYXRoIiwicmVwbGFjZSIsInNlZ21lbnRzIiwic3Vic3RyaW5nIiwic3BsaXQiLCJ1bnNoaWZ0Iiwib2xkUGF0aHMiLCJuZXdQYXRocyIsImN1cnJlbnRQYXRoIiwicGF0aHMiLCJyb290U2libGluZ1BhdGhQcm9taXNlIiwic2hpZnQiLCJjYW5vbmljYWxQYXRoUHJvbWlzZXMiLCJtYXAiLCJzZWdtZW50IiwiZW5kc1dpdGgiLCJzaWJsaW5nQ29udGV4dCIsIiQkZ3JvdXBJZCIsImdldEJvdW5kQ29udGV4dCIsInJlcXVlc3RDYW5vbmljYWxQYXRoIiwiUHJvbWlzZSIsInJlc29sdmUiLCJjYW5vbmljYWxQYXRocyIsImFsbCIsInNvbWUiLCJyb290U2libGluZ1BhdGgiLCJwdXNoIiwic2libGluZ1BhdGgiLCJmb3JFYWNoIiwiY2Fub25pY2FsUGF0aCIsImluZGV4IiwibmF2aWdhdGlvbiIsImtleXMiLCJwYXJhbWV0ZXJzIiwibWVzc2FnZVBhdGgiLCJ0YXJnZXRDb250ZXh0IiwiZ2V0S2VlcEFsaXZlQ29udGV4dCIsInBhdGhNYXBwaW5nIiwib2xkUGF0aCIsIm5ld1BhdGgiLCJjcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudCIsIm1QYXJhbWV0ZXJzIiwidHJhbnNhY3Rpb25EZXRhaWxzIiwibVBhcmFtIiwiYlJ1blByZXNlcnZlQ2hhbmdlc0Zsb3ciLCJyZXNwb25zZSIsImRyYWZ0RGF0YUNvbnRleHQiLCJkcmFmdEFkbWluRGF0YSIsInNJbmZvIiwiSW5Qcm9jZXNzQnlVc2VyRGVzY3JpcHRpb24iLCJJblByb2Nlc3NCeVVzZXIiLCJzRW50aXR5U2V0IiwiZ2V0Vmlld0RhdGEiLCJlbnRpdHlTZXQiLCJzTG9ja2VkQnlVc2VyTXNnIiwiTWVzc2FnZUJveCIsIkNyZWF0ZWRCeVVzZXJEZXNjcmlwdGlvbiIsIkNyZWF0ZWRCeVVzZXIiLCJzVW5zYXZlZENoYW5nZXNNc2ciLCJzaG93RWRpdENvbmZpcm1hdGlvbk1lc3NhZ2VCb3giLCJtZXNzYWdlIiwib0RyYWZ0Q29udGV4dCIsIm9SZXNwb25zZSIsImlzQ29sbGFib3JhdGlvbkRyYWZ0U3VwcG9ydGVkIiwic2libGluZ0luZm8iLCJfaXNGY2xFbmFibGVkIiwid2FpdEZvckNvbnRleHRSZXF1ZXN0ZWQiLCJleGlzdGluZ0RyYWZ0UmV1c2VkIiwiY2FuY2VsZWQiLCJzRWRpdEFjdGlvbk5hbWUiLCJvU2lkZUVmZmVjdHMiLCJ0cmlnZ2VyQWN0aW9ucyIsInJlcXVlc3RTaWRlRWZmZWN0c0Zvck9EYXRhQWN0aW9uIiwiYWN0aXZhdGVEb2N1bWVudCIsImJFeGVjdXRlIiwiZm5CZWZvcmVBY3RpdmF0ZURvY3VtZW50Iiwib0FjdGl2ZURvY3VtZW50Q29udGV4dCIsInNCYXRjaEdyb3VwIiwiaWdub3JlRXRhZyIsImhhc1BlbmRpbmdDaGFuZ2VzIiwic3VibWl0QmF0Y2giLCJvQWN0aXZhdGVQcm9taXNlIiwidmFsdWVzIiwiZm5BZnRlckFjdGl2YXRlRG9jdW1lbnQiLCJsb2NhbEkxOG5SZWYiLCJMaWJyYXJ5IiwiZ2V0UmVzb3VyY2VCdW5kbGVGb3IiLCJyZWplY3QiLCJvRGlhbG9nIiwiRGlhbG9nIiwidGl0bGUiLCJzdGF0ZSIsImNvbnRlbnQiLCJUZXh0IiwidGV4dCIsImJlZ2luQnV0dG9uIiwiQnV0dG9uIiwidHlwZSIsInByZXNzIiwiY2xvc2UiLCJlbmRCdXR0b24iLCJhZnRlckNsb3NlIiwiYWRkU3R5bGVDbGFzcyIsIm9wZW4iLCJkZWxldGVEcmFmdCIsImlzVHJhbnNpZW50IiwiZGVsZXRlIiwic0Rpc2NhcmRBY3Rpb24iLCJiSXNBY3RpdmVFbnRpdHkiLCJJc0FjdGl2ZUVudGl0eSIsImlzSW5hY3RpdmUiLCJyZXNldENoYW5nZXMiLCJpc0RyYWZ0Um9vdCIsInRhcmdldEVudGl0eVNldCIsInByb2Nlc3NEYXRhTG9zc09yRHJhZnREaXNjYXJkQ29uZmlybWF0aW9uIiwiZHJhZnREYXRhTG9zc1BvcHVwIiwic2lsZW50bHlLZWVwRHJhZnRPbkZvcndhcmROYXZpZ2F0aW9uIiwiTmF2aWdhdGlvblR5cGUiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbImRyYWZ0LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQWN0aW9uIGFzIEVkbUFjdGlvbiB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlc1wiO1xuaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgaXNFbXB0eU9iamVjdCBmcm9tIFwic2FwL2Jhc2UvdXRpbC9pc0VtcHR5T2JqZWN0XCI7XG5pbXBvcnQgdHlwZSBBcHBDb21wb25lbnQgZnJvbSBcInNhcC9mZS9jb3JlL0FwcENvbXBvbmVudFwiO1xuaW1wb3J0IENvbW1vblV0aWxzIGZyb20gXCJzYXAvZmUvY29yZS9Db21tb25VdGlsc1wiO1xuaW1wb3J0IHR5cGUgUmVzb3VyY2VNb2RlbCBmcm9tIFwic2FwL2ZlL2NvcmUvUmVzb3VyY2VNb2RlbFwiO1xuaW1wb3J0IGRyYWZ0RGF0YUxvc3NQb3B1cCBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvZWRpdEZsb3cvZHJhZnREYXRhTG9zc1BvcHVwXCI7XG5pbXBvcnQgbWVzc2FnZUhhbmRsaW5nIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9tZXNzYWdlSGFuZGxlci9tZXNzYWdlSGFuZGxpbmdcIjtcbmltcG9ydCB7IGNvbnZlcnRUeXBlcywgZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWV0YU1vZGVsQ29udmVydGVyXCI7XG5pbXBvcnQgeyBnZXRSZXNvdXJjZU1vZGVsIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvUmVzb3VyY2VNb2RlbEhlbHBlclwiO1xuaW1wb3J0IHsgaXNQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb24gfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9UeXBlR3VhcmRzXCI7XG5pbXBvcnQgdHlwZSB7IFNpZGVFZmZlY3RzU2VydmljZSB9IGZyb20gXCJzYXAvZmUvY29yZS9zZXJ2aWNlcy9TaWRlRWZmZWN0c1NlcnZpY2VGYWN0b3J5XCI7XG5pbXBvcnQgQnV0dG9uIGZyb20gXCJzYXAvbS9CdXR0b25cIjtcbmltcG9ydCBEaWFsb2cgZnJvbSBcInNhcC9tL0RpYWxvZ1wiO1xuaW1wb3J0IE1lc3NhZ2VCb3ggZnJvbSBcInNhcC9tL01lc3NhZ2VCb3hcIjtcbmltcG9ydCBUZXh0IGZyb20gXCJzYXAvbS9UZXh0XCI7XG5pbXBvcnQgTGlicmFyeSBmcm9tIFwic2FwL3VpL2NvcmUvTGliXCI7XG5pbXBvcnQgdHlwZSBWaWV3IGZyb20gXCJzYXAvdWkvY29yZS9tdmMvVmlld1wiO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L0NvbnRleHRcIjtcbmltcG9ydCB0eXBlIHsgQ29udGV4dEVycm9yVHlwZSB9IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQ29udGV4dFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFDb250ZXh0QmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhQ29udGV4dEJpbmRpbmdcIjtcbmltcG9ydCB0eXBlIHsgRkVWaWV3IH0gZnJvbSBcIi4uLy4uL0Jhc2VDb250cm9sbGVyXCI7XG5pbXBvcnQgTW9kZWxIZWxwZXIgZnJvbSBcIi4uLy4uL2hlbHBlcnMvTW9kZWxIZWxwZXJcIjtcbmltcG9ydCB0eXBlIE1lc3NhZ2VIYW5kbGVyIGZyb20gXCIuLi9NZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IE9wZXJhdGlvbiBmcm9tIFwiLi9vcGVyYXRpb25zL09wZXJhdGlvblwiO1xuXG5leHBvcnQgdHlwZSBTaWJsaW5nSW5mb3JtYXRpb24gPSB7XG5cdHRhcmdldENvbnRleHQ6IENvbnRleHQ7XG5cdHBhdGhNYXBwaW5nOiB7IG9sZFBhdGg6IHN0cmluZzsgbmV3UGF0aDogc3RyaW5nIH1bXTtcbn07XG5cbmV4cG9ydCB0eXBlIFJvb3RDb250ZXh0SW5mbyA9IHtcblx0cm9vdFNpYmxpbmdQYXRoUHJvbWlzZTogUHJvbWlzZTxDb250ZXh0IHwgdW5kZWZpbmVkPjtcbn07XG5cbmV4cG9ydCB0eXBlIEJpbmRDb250ZXh0UGFyYW1ldGVycyA9IHtcblx0LyoqXG5cdCAqIFRoZSB2YWx1ZSBmb3IgdGhlIFwiNS4xLjIgU3lzdGVtIFF1ZXJ5IE9wdGlvbiAkZXhwYW5kXCIgb3IgYW4gb2JqZWN0IHdoaWNoIGRldGVybWluZXMgdGhhdCB2YWx1ZS4gVGhlIG9iamVjdFxuXHQgKiBpcyBhIG1hcCBmcm9tIGV4cGFuZCBwYXRoIHRvIGV4cGFuZCBvcHRpb25zLCB3aGVyZSB0aGUgb3B0aW9ucyBhcmUgYWdhaW4gbWFwcyBvZiBzeXN0ZW0gcXVlcnkgb3B0aW9ucyxcblx0ICogdHlwaWNhbGx5IHdpdGggc3RyaW5nIHZhbHVlcy4gJGNvdW50IGNhbiBhbHNvIGJlIGdpdmVuIGFzIGEgYGJvb2xlYW5gIHZhbHVlLCAkZXhwYW5kIGNhbiByZWN1cnNpdmVseVxuXHQgKiBiZSBnaXZlbiBhcyBhIG1hcCwgJGxldmVscyBjYW4gYWxzbyBiZSBnaXZlbiBhcyBhIGBudW1iZXJgIHZhbHVlLCBhbmQgJHNlbGVjdCBjYW4gYWxzbyBiZSBnaXZlbiBhcyBhblxuXHQgKiBhcnJheSAoYnV0IHdpdGhvdXQgbmF2aWdhdGlvbiBwYXRocykuIEFuIGVtcHR5IG1hcCBjYW4gYWxzbyBiZSBnaXZlbiBhcyBgbnVsbGAgb3IgYHRydWVgLiBTZWUgYWxzbyB7QGxpbmsgaHR0cHM6Ly91aTUuc2FwLmNvbS8jL3RvcGljLzFhYjRmNjJkZTZhYjQ2NzA5NmEyYTk4YjM2M2ExMzczIFBhcmFtZXRlcnN9LlxuXHQgKi9cblx0JGV4cGFuZD86IHN0cmluZyB8IG9iamVjdDtcblx0LyoqXG5cdCAqIEEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb3IgYW4gYXJyYXkgb2YgaXRlbXMgd2hpY2ggZGV0ZXJtaW5lIHRoZSB2YWx1ZSBmb3IgdGhlIFwiNS4xLjMgU3lzdGVtIFF1ZXJ5IE9wdGlvblxuXHQgKiAkc2VsZWN0XCIuIFNpbmNlIDEuNzUuMCwgd2hlbiB1c2luZyB0aGUgXCJhdXRvRXhwYW5kU2VsZWN0XCIgbW9kZWwgcGFyYW1ldGVyIChzZWUge0BsaW5rIHNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YU1vZGVsI2NvbnN0cnVjdG9yfSksXG5cdCAqIHBhdGhzIHdpdGggbmF2aWdhdGlvbiBwcm9wZXJ0aWVzIGNhbiBiZSBpbmNsdWRlZCBhbmQgd2lsbCBjb250cmlidXRlIHRvIHRoZSBcIjUuMS4yIFN5c3RlbSBRdWVyeSBPcHRpb25cblx0ICogJGV4cGFuZFwiLlxuXHQgKi9cblx0JHNlbGVjdD86IHN0cmluZztcblx0LyoqXG5cdCAqIFdoZXRoZXIgYSBiaW5kaW5nIHJlbGF0aXZlIHRvIGFuIHtAbGluayBzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dH0gdXNlcyB0aGUgY2Fub25pY2FsIHBhdGggY29tcHV0ZWRcblx0ICogZnJvbSBpdHMgY29udGV4dCdzIHBhdGggZm9yIGRhdGEgc2VydmljZSByZXF1ZXN0czsgb25seSB0aGUgdmFsdWUgYHRydWVgIGlzIGFsbG93ZWQuXG5cdCAqL1xuXHQkJGNhbm9uaWNhbFBhdGg/OiBib29sZWFuO1xuXHQvKipcblx0ICogVGhlIGdyb3VwIElEIHRvIGJlIHVzZWQgZm9yICoqcmVhZCoqIHJlcXVlc3RzIHRyaWdnZXJlZCBieSB0aGlzIGJpbmRpbmc7IGlmIG5vdCBzcGVjaWZpZWQsIGVpdGhlciB0aGVcblx0ICogcGFyZW50IGJpbmRpbmcncyBncm91cCBJRCAoaWYgdGhlIGJpbmRpbmcgaXMgcmVsYXRpdmUpIG9yIHRoZSBtb2RlbCdzIGdyb3VwIElEIGlzIHVzZWQsIHNlZSB7QGxpbmsgc2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTW9kZWwjY29uc3RydWN0b3J9LlxuXHQgKiBWYWxpZCB2YWx1ZXMgYXJlIGB1bmRlZmluZWRgLCAnJGF1dG8nLCAnJGF1dG8uKicsICckZGlyZWN0JyBvciBhcHBsaWNhdGlvbiBncm91cCBJRHMgYXMgc3BlY2lmaWVkIGluXG5cdCAqIHtAbGluayBzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFNb2RlbH0uXG5cdCAqL1xuXHQkJGdyb3VwSWQ/OiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBGb3Igb3BlcmF0aW9uIGJpbmRpbmdzIG9ubHk6IFdoZXRoZXIgJGV4cGFuZCBhbmQgJHNlbGVjdCBmcm9tIHRoZSBwYXJlbnQgYmluZGluZyBhcmUgdXNlZCBpbiB0aGUgcmVxdWVzdFxuXHQgKiBzZW50IG9uIHtAbGluayAjZXhlY3V0ZX0uIElmIHNldCB0byBgdHJ1ZWAsIHRoZSBiaW5kaW5nIG11c3Qgbm90IHNldCB0aGUgJGV4cGFuZCBpdHNlbGYsIHRoZSBvcGVyYXRpb25cblx0ICogbXVzdCBiZSBib3VuZCwgYW5kIHRoZSByZXR1cm4gdmFsdWUgYW5kIHRoZSBiaW5kaW5nIHBhcmFtZXRlciBtdXN0IGJlbG9uZyB0byB0aGUgc2FtZSBlbnRpdHkgc2V0LlxuXHQgKi9cblx0JCRpbmhlcml0RXhwYW5kU2VsZWN0PzogYm9vbGVhbjtcblx0LyoqXG5cdCAqIFdoZXRoZXIgdGhlIGJpbmRpbmcgYWx3YXlzIHVzZXMgYW4gb3duIHNlcnZpY2UgcmVxdWVzdCB0byByZWFkIGl0cyBkYXRhOyBvbmx5IHRoZSB2YWx1ZSBgdHJ1ZWAgaXMgYWxsb3dlZC5cblx0ICovXG5cdCQkb3duUmVxdWVzdD86IGJvb2xlYW47XG5cdC8qKlxuXHQgKiBXaGV0aGVyIGltcGxpY2l0IGxvYWRpbmcgb2Ygc2lkZSBlZmZlY3RzIHZpYSBQQVRDSCByZXF1ZXN0cyBpcyBzd2l0Y2hlZCBvZmY7IG9ubHkgdGhlIHZhbHVlIGB0cnVlYCBpc1xuXHQgKiBhbGxvd2VkLiBUaGlzIHNldHMgdGhlIHByZWZlcmVuY2UgXCJyZXR1cm49bWluaW1hbFwiIGFuZCByZXF1aXJlcyB0aGUgc2VydmljZSB0byByZXR1cm4gYW4gRVRhZyBoZWFkZXJcblx0ICogZm9yIFwiMjA0IE5vIENvbnRlbnRcIiByZXNwb25zZXMuIElmIG5vdCBzcGVjaWZpZWQsIHRoZSB2YWx1ZSBvZiB0aGUgcGFyZW50IGJpbmRpbmcgaXMgdXNlZC5cblx0ICovXG5cdCQkcGF0Y2hXaXRob3V0U2lkZUVmZmVjdHM/OiBib29sZWFuO1xuXHQvKipcblx0ICogVGhlIGdyb3VwIElEIHRvIGJlIHVzZWQgZm9yICoqdXBkYXRlKiogcmVxdWVzdHMgdHJpZ2dlcmVkIGJ5IHRoaXMgYmluZGluZzsgaWYgbm90IHNwZWNpZmllZCwgZWl0aGVyIHRoZVxuXHQgKiBwYXJlbnQgYmluZGluZydzIHVwZGF0ZSBncm91cCBJRCAoaWYgdGhlIGJpbmRpbmcgaXMgcmVsYXRpdmUpIG9yIHRoZSBtb2RlbCdzIHVwZGF0ZSBncm91cCBJRCBpcyB1c2VkLFxuXHQgKiBzZWUge0BsaW5rIHNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YU1vZGVsI2NvbnN0cnVjdG9yfS4gRm9yIHZhbGlkIHZhbHVlcywgc2VlIHBhcmFtZXRlciBcIiQkZ3JvdXBJZFwiLlxuXHQgKi9cblx0JCR1cGRhdGVHcm91cElkPzogc3RyaW5nO1xufTtcblxuLyogQ29uc3RhbnRzIGZvciBkcmFmdCBvcGVyYXRpb25zICovXG5jb25zdCBkcmFmdE9wZXJhdGlvbnMgPSB7XG5cdEVESVQ6IFwiRWRpdEFjdGlvblwiLFxuXHRBQ1RJVkFUSU9OOiBcIkFjdGl2YXRpb25BY3Rpb25cIixcblx0RElTQ0FSRDogXCJEaXNjYXJkQWN0aW9uXCIsXG5cdFBSRVBBUkU6IFwiUHJlcGFyYXRpb25BY3Rpb25cIlxufTtcblxuLyoqXG4gKiBTdGF0aWMgZnVuY3Rpb25zIGZvciB0aGUgZHJhZnQgcHJvZ3JhbW1pbmcgbW9kZWxcbiAqIEBuYW1lc3BhY2VcbiAqIEBleHBlcmltZW50YWwgVGhpcyBtb2R1bGUgaXMgb25seSBmb3IgZXhwZXJpbWVudGFsIHVzZSEgPGJyLz48Yj5UaGlzIGlzIG9ubHkgYSBQT0MgYW5kIG1heWJlIGRlbGV0ZWQ8L2I+XG4gKiBAc2luY2UgMS41NC4wXG4gKi9cblxuLyoqXG4gKiBEZXRlcm1pbmVzIHRoZSBhY3Rpb24gbmFtZSBmb3IgYSBkcmFmdCBvcGVyYXRpb24uXG4gKiBAcGFyYW0gb0NvbnRleHQgVGhlIGNvbnRleHQgdGhhdCBzaG91bGQgYmUgYm91bmQgdG8gdGhlIG9wZXJhdGlvblxuICogQHBhcmFtIHNPcGVyYXRpb24gVGhlIG9wZXJhdGlvbiBuYW1lXG4gKiBAcmV0dXJucyBUaGUgbmFtZSBvZiB0aGUgZHJhZnQgb3BlcmF0aW9uXG4gKi9cbmZ1bmN0aW9uIGdldEFjdGlvbk5hbWUob0NvbnRleHQ6IENvbnRleHQsIHNPcGVyYXRpb246IHN0cmluZyk6IHN0cmluZyB7XG5cdGNvbnN0IG9Nb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCksXG5cdFx0b01ldGFNb2RlbCA9IG9Nb2RlbC5nZXRNZXRhTW9kZWwoKSxcblx0XHRzRW50aXR5U2V0UGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgob0NvbnRleHQuZ2V0UGF0aCgpKTtcblxuXHRyZXR1cm4gb01ldGFNb2RlbC5nZXRPYmplY3QoYCR7c0VudGl0eVNldFBhdGh9QGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EcmFmdFJvb3QvJHtzT3BlcmF0aW9ufWApO1xufVxuLyoqXG4gKiBDcmVhdGVzIGFuIG9wZXJhdGlvbiBjb250ZXh0IGJpbmRpbmcgZm9yIHRoZSBnaXZlbiBjb250ZXh0IGFuZCBvcGVyYXRpb24uXG4gKiBAcGFyYW0gb0NvbnRleHQgVGhlIGNvbnRleHQgdGhhdCBzaG91bGQgYmUgYm91bmQgdG8gdGhlIG9wZXJhdGlvblxuICogQHBhcmFtIHNPcGVyYXRpb24gVGhlIG9wZXJhdGlvbiAoYWN0aW9uIG9yIGZ1bmN0aW9uIGltcG9ydClcbiAqIEBwYXJhbSBvT3B0aW9ucyBPcHRpb25zIHRvIGNyZWF0ZSB0aGUgb3BlcmF0aW9uIGNvbnRleHRcbiAqIEByZXR1cm5zIFRoZSBjb250ZXh0IGJpbmRpbmcgb2YgdGhlIGJvdW5kIG9wZXJhdGlvblxuICovXG5mdW5jdGlvbiBjcmVhdGVPcGVyYXRpb24ob0NvbnRleHQ6IENvbnRleHQsIHNPcGVyYXRpb246IHN0cmluZywgb09wdGlvbnM/OiBCaW5kQ29udGV4dFBhcmFtZXRlcnMpOiBPRGF0YUNvbnRleHRCaW5kaW5nIHtcblx0Y29uc3Qgc09wZXJhdGlvbk5hbWUgPSBnZXRBY3Rpb25OYW1lKG9Db250ZXh0LCBzT3BlcmF0aW9uKTtcblxuXHRyZXR1cm4gb0NvbnRleHQuZ2V0TW9kZWwoKS5iaW5kQ29udGV4dChgJHtzT3BlcmF0aW9uTmFtZX0oLi4uKWAsIG9Db250ZXh0LCBvT3B0aW9ucyk7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgY29udmVydGVkIGFjdGlvbiBmb3IgYSBnaXZlbiBjb250ZXh0IGFuZCBvcGVyYXRpb24uXG4gKiBAcGFyYW0gY29udGV4dCAgVGhlIGNvbnRleHQgdGhhdCBzaG91bGQgYmUgYm91bmQgdG8gdGhlIG9wZXJhdGlvblxuICogQHBhcmFtIG9wZXJhdGlvbiBUaGUgb3BlcmF0aW9uIG5hbWVcbiAqIEByZXR1cm5zIFRoZSBjb252ZXJ0ZWQgYWN0aW9uXG4gKi9cbmZ1bmN0aW9uIGdldENvbnZlcnRlZEFjdGlvbihjb250ZXh0OiBDb250ZXh0LCBvcGVyYXRpb246IHN0cmluZyk6IEVkbUFjdGlvbiB8IHVuZGVmaW5lZCB7XG5cdGNvbnN0IG9wZXJhdGlvbk5hbWUgPSBnZXRBY3Rpb25OYW1lKGNvbnRleHQsIG9wZXJhdGlvbik7XG5cdGNvbnN0IG1ldGFNb2RlbCA9IGNvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKSxcblx0XHRhY3Rpb25QYXRoID0gYCR7bWV0YU1vZGVsLmdldE1ldGFQYXRoKGNvbnRleHQuZ2V0UGF0aCgpKX0vJHtvcGVyYXRpb25OYW1lfWAsXG5cdFx0Ym91bmRBY3Rpb24gPSBtZXRhTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoYWN0aW9uUGF0aCkhO1xuXHRyZXR1cm4gY29udmVydFR5cGVzKG1ldGFNb2RlbCkucmVzb2x2ZVBhdGg8RWRtQWN0aW9uIHwgdW5kZWZpbmVkPihib3VuZEFjdGlvbi5nZXRQYXRoKCkpLnRhcmdldDtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmVzIHRoZSByZXR1cm4gdHlwZSBmb3IgYSBkcmFmdCBvcGVyYXRpb24uXG4gKiBAcGFyYW0gb0NvbnRleHQgVGhlIGNvbnRleHQgdGhhdCBzaG91bGQgYmUgYm91bmQgdG8gdGhlIG9wZXJhdGlvblxuICogQHBhcmFtIHNPcGVyYXRpb24gVGhlIG9wZXJhdGlvbiBuYW1lXG4gKiBAcmV0dXJucyBUaGUgcmV0dXJuIHR5cGUgb2YgdGhlIGRyYWZ0IG9wZXJhdGlvblxuICovXG5mdW5jdGlvbiBnZXRSZXR1cm5UeXBlKG9Db250ZXh0OiBDb250ZXh0LCBzT3BlcmF0aW9uOiBzdHJpbmcpOiB1bmtub3duIHtcblx0Y29uc3Qgb01vZGVsID0gb0NvbnRleHQuZ2V0TW9kZWwoKSxcblx0XHRvTWV0YU1vZGVsID0gb01vZGVsLmdldE1ldGFNb2RlbCgpLFxuXHRcdHNFbnRpdHlTZXRQYXRoID0gb01ldGFNb2RlbC5nZXRNZXRhUGF0aChvQ29udGV4dC5nZXRQYXRoKCkpO1xuXG5cdHJldHVybiBvTWV0YU1vZGVsLmdldE9iamVjdChgJHtzRW50aXR5U2V0UGF0aH1AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRyYWZ0Um9vdC8ke3NPcGVyYXRpb259LyRSZXR1cm5UeXBlYCk7XG59XG4vKipcbiAqIENoZWNrIGlmIG9wdGlvbmFsIGRyYWZ0IHByZXBhcmUgYWN0aW9uIGV4aXN0cy5cbiAqIEBwYXJhbSBvQ29udGV4dCBUaGUgY29udGV4dCB0aGF0IHNob3VsZCBiZSBib3VuZCB0byB0aGUgb3BlcmF0aW9uXG4gKiBAcmV0dXJucyBUcnVlIGlmIGEgYSBwcmVwYXJlIGFjdGlvbiBleGlzdHNcbiAqL1xuZnVuY3Rpb24gaGFzUHJlcGFyZUFjdGlvbihvQ29udGV4dDogQ29udGV4dCk6IGJvb2xlYW4ge1xuXHRyZXR1cm4gISFnZXRBY3Rpb25OYW1lKG9Db250ZXh0LCBkcmFmdE9wZXJhdGlvbnMuUFJFUEFSRSk7XG59XG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgZHJhZnQgZnJvbSBhbiBhY3RpdmUgZG9jdW1lbnQuXG4gKiBAcGFyYW0gb0NvbnRleHQgQ29udGV4dCBmb3Igd2hpY2ggdGhlIGFjdGlvbiBzaG91bGQgYmUgcGVyZm9ybWVkXG4gKiBAcGFyYW0gYlByZXNlcnZlQ2hhbmdlcyBJZiB0cnVlIC0gZXhpc3RpbmcgY2hhbmdlcyBmcm9tIGFub3RoZXIgdXNlciB0aGF0IGFyZSBub3QgbG9ja2VkIGFyZSBwcmVzZXJ2ZWQgYW5kIGFuIGVycm9yIGlzIHNlbnQgZnJvbSB0aGUgYmFja2VuZCwgb3RoZXJ3aXNlIGZhbHNlIC0gZXhpc3RpbmcgY2hhbmdlcyBmcm9tIGFub3RoZXIgdXNlciB0aGF0IGFyZSBub3QgbG9ja2VkIGFyZSBvdmVyd3JpdHRlbjwvbGk+XG4gKiBAcGFyYW0gb1ZpZXcgSWYgdHJ1ZSAtIGV4aXN0aW5nIGNoYW5nZXMgZnJvbSBhbm90aGVyXG4gKiBAcGFyYW0gZ3JvdXBJZCBUaGUgYmF0Y2ggZ3JvdXBJZCBmb3IgcG9zdCBjYWxsIG9mIGVkaXQgYWN0aW9uXG4gKiBAcGFyYW0gbWVzc2FnZUhhbmRsZXIgIFRoZSBtZXNzYWdlIGhhbmRsZXIgY29udHJvbGxlciBleHRlbnNpb25cbiAqIEBwYXJhbSBvdmVyd3JpdGVDaGFuZ2VcbiAqIEByZXR1cm5zIFJlc29sdmUgZnVuY3Rpb24gcmV0dXJucyB0aGUgY29udGV4dCBvZiB0aGUgb3BlcmF0aW9uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGV4ZWN1dGVEcmFmdEVkaXRBY3Rpb24oXG5cdG9Db250ZXh0OiBDb250ZXh0LFxuXHRiUHJlc2VydmVDaGFuZ2VzOiBib29sZWFuLFxuXHRvVmlldzogVmlldyxcblx0Z3JvdXBJZDogc3RyaW5nLFxuXHRtZXNzYWdlSGFuZGxlcjogTWVzc2FnZUhhbmRsZXIsXG5cdG92ZXJ3cml0ZUNoYW5nZT86IGJvb2xlYW5cbik6IFByb21pc2U8Q29udGV4dCB8IHVuZGVmaW5lZD4ge1xuXHQvLyBJZiB0aGUgY29udGV4dCBpcyBub3QgbG9hZGVkIChpLmUuIG9Db250ZXh0LmdldE9iamVjdCgpID09IHVuZGVmaW5lZCksIHdlIGFzc3VtZSBpdCBjb3JyZXNwb25kcyB0byBhbiBhY3RpdmUgY29udGV4dFxuXHQvLyBUaGlzIHNpdHVhdGlvbiBoYXBwZW5zIHdoZW4gb3BlbmluZyBhbiBPUCBkaXJlY3RseSBpbiBlZGl0IG1vZGUgKEludGVybmFsUm91dGluZy5fYmluZFBhZ2VGb3JFZGl0KVxuXHRjb25zdCBjb252ZXJ0ZWRBY3Rpb24gPSBnZXRDb252ZXJ0ZWRBY3Rpb24ob0NvbnRleHQsIGRyYWZ0T3BlcmF0aW9ucy5FRElUKTtcblx0aWYgKGNvbnZlcnRlZEFjdGlvbikge1xuXHRcdGNvbnN0IG9wZXJhdGlvbiA9IG5ldyBPcGVyYXRpb24oQ29tbW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50KG9WaWV3KSwgb0NvbnRleHQuZ2V0TW9kZWwoKSwgY29udmVydGVkQWN0aW9uLCB7XG5cdFx0XHRtZXNzYWdlSGFuZGxlcjogbWVzc2FnZUhhbmRsZXIsXG5cdFx0XHRjb250ZXh0czogW29Db250ZXh0XSxcblx0XHRcdGxhYmVsOiBnZXRSZXNvdXJjZU1vZGVsKG9WaWV3KS5nZXRUZXh0KFwiQ19DT01NT05fT0JKRUNUX1BBR0VfRURJVFwiKSxcblx0XHRcdGJpbmRpbmdQYXJhbWV0ZXJzOiB7ICQkaW5oZXJpdEV4cGFuZFNlbGVjdDogdHJ1ZSwgJCR1cGRhdGVHcm91cElkOiBcIiRhdXRvXCIgfSxcblx0XHRcdHNraXBNZXNzYWdlczogdHJ1ZSxcblx0XHRcdG9EYXRhUHJvcGVydGllczoge1xuXHRcdFx0XHRkaXNhYmxlU2lkZUVmZmVjdHM6IHRydWUsXG5cdFx0XHRcdGlnbm9yZUVUYWc6IGlzRW1wdHlPYmplY3Qob0NvbnRleHQuZ2V0T2JqZWN0KCkpLCAvLyBJZiB0aGUgY29udGV4dCBoYXMgbm90IGJlZW4gbG9hZGVkIHlldCwgd2UgY2FuIGlnbm9yZSB0aGUgRVRhZyAoYXMgbm8gcHJldmlvdXMgRVRhZyBpcyBhdmFpbGFibGUpXG5cdFx0XHRcdGdyb3VwSWQ6IGdyb3VwSWQsXG5cdFx0XHRcdHJlcGxhY2VXaXRoUlZDOiBvQ29udGV4dC5nZXRCaW5kaW5nKCkuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIiksXG5cdFx0XHRcdGRlZmVycmVkU3VibWl0OiBvdmVyd3JpdGVDaGFuZ2UgIT09IHRydWUgLy9cdElmIHRoZSBjb250ZXh0IGlzIGNvbWluZyBmcm9tIGEgbGlzdCBiaW5kaW5nIHdlIHBhc3MgdGhlIGZsYWcgdHJ1ZSB0byByZXBsYWNlIHRoZSBjb250ZXh0IGJ5IHRoZSBhY3RpdmUgb25lXG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0b3BlcmF0aW9uLnNldERlZmF1bHRQYXJhbWV0ZXJzVmFsdWVzKHsgUHJlc2VydmVDaGFuZ2VzOiBiUHJlc2VydmVDaGFuZ2VzIH0pO1xuXHRcdGNvbnN0IHJlc3VsdCA9IGF3YWl0IG9wZXJhdGlvbi5leGVjdXRlKCk7XG5cdFx0aWYgKHJlc3VsdFswXS5zdGF0dXMgPT09IFwicmVqZWN0ZWRcIikge1xuXHRcdFx0Y29uc3QgbW9kaWZpZWRFcnJvciA9IG5ldyBFcnJvcihyZXN1bHRbMF0ucmVhc29uKSBhcyBFcnJvciAmIHsgc3RhdHVzPzogbnVtYmVyIH07XG5cdFx0XHQvLyB3ZSBuZWVkIHRvIHBlcnNpc3QgdGhlIHN0YXR1cyBpbiB0aGUgZXJyb3IgdG8gYmUgYWJsZSB0byBzaG93IHRoZSBsb2NrZWQgYnkgYW5vdGhlciB1c2VyIGRpYWxvZ1xuXHRcdFx0bW9kaWZpZWRFcnJvci5zdGF0dXMgPSByZXN1bHRbMF0ucmVhc29uLnN0YXR1cztcblx0XHRcdHRocm93IG1vZGlmaWVkRXJyb3I7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiByZXN1bHRbMF0udmFsdWUucmV0dXJuZWRDb250ZXh0O1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJUaGUgZWRpdCBhY3Rpb24gbm90IGZvdW5kXCIpO1xuXHR9XG59XG5cbi8qKlxuICogRXhlY3V0ZXMgdGhlIHZhbGlkYXRpb24gb2YgdGhlIGRyYWZ0LiBUaGUgUHJlcGFyZUFjdGlvbiBpcyB0cmlnZ2VyZWQgaWYgdGhlIG1lc3NhZ2VzIGFyZSBhbm5vdGF0ZWQgYW5kIGVudGl0eVNldCBnZXRzIGEgUHJlcGFyYXRpb25BY3Rpb24gYW5ub3RhdGVkLlxuICogSWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcyBhbmQgb3BlcmF0aW9uIGRvZXNuJ3QgZ2V0IGEgcmV0dXJuIHR5cGUgKFJBUCBzeXN0ZW0pIHRoZSBtZXNzYWdlcyBhcmUgcmVxdWVzdGVkLlxuICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCBmb3Igd2hpY2ggdGhlIFByZXBhcmVBY3Rpb24gc2hvdWxkIGJlIHBlcmZvcm1lZFxuICogQHBhcmFtIGFwcENvbXBvbmVudCBUaGUgQXBwQ29tcG9uZW50XG4gKiBAcGFyYW0gaWdub3JlRVRhZyBJZiBzZXQgdG8gdHJ1ZSwgRVRhZ3MgYXJlIGlnbm9yZWQgd2hlbiBleGVjdXRpbmcgdGhlIGFjdGlvblxuICogQHJldHVybnMgUmVzb2x2ZSBmdW5jdGlvbiByZXR1cm5zXG4gKiAgLSB0aGUgY29udGV4dCBvZiB0aGUgb3BlcmF0aW9uIGlmIHRoZSBhY3Rpb24gaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGV4ZWN1dGVkXG4gKiAgLSB2b2lkIGlmIHRoZSBhY3Rpb24gaGFzIGZhaWxlZFxuICogIC0gdW5kZWZpbmVkIGlmIHRoZSBhY3Rpb24gaGFzIG5vdCBiZWVuIHRyaWdnZXJlZCBzaW5jZSB0aGUgcHJlcmVxdWlzaXRlcyBhcmUgbm90IG1ldFxuICovXG5hc3luYyBmdW5jdGlvbiBleGVjdXRlRHJhZnRWYWxpZGF0aW9uKFxuXHRjb250ZXh0OiBDb250ZXh0LFxuXHRhcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCxcblx0aWdub3JlRVRhZzogYm9vbGVhblxuKTogUHJvbWlzZTxPRGF0YUNvbnRleHRCaW5kaW5nIHwgdm9pZCB8IHVuZGVmaW5lZD4ge1xuXHRpZiAoTW9kZWxIZWxwZXIuZ2V0TWVzc2FnZXNQYXRoKGNvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKSwgY29udGV4dC5nZXRQYXRoKCkpICYmIGRyYWZ0Lmhhc1ByZXBhcmVBY3Rpb24oY29udGV4dCkpIHtcblx0XHR0cnkge1xuXHRcdFx0aWYgKCFpZ25vcmVFVGFnICYmICFjb250ZXh0LmlzS2VlcEFsaXZlKCkpIHtcblx0XHRcdFx0Ly8gV2UgbmVlZCB0byB3YWl0IGZvciB0aGUgZW50aXR5IHJlbGF0ZWQgdG8gdGhlIGNvbnRleHQgdG8gcG9zdCB0aGUgYWN0aW9uIHdpdGggdGhlIElmLU1hdGNoIGhlYWRlclxuXHRcdFx0XHQvLyBTb21lIHRyaWdnZXJzIChlbnRlciBvbiB0YWJsZSkgY2FuIGdlbmVyYXRlIGEgcHJvbWlzZSBpbiB0aGUgY2FjaGUgc28gaWYgd2UgZG9uJ3Qgd2FpdCBmb3IgdGhlIGVudGl0eVxuXHRcdFx0XHQvLyB0aGUgUE9TVCB3aWxsIGJlIHNlbnQgd2l0aG91dCBJZi1NYXRjaCBhbmQgd2lsbCBnZW5lcmF0ZSBhbiBlcnJvciBvbiBiYWNrZW5kIHNpZGUuXG5cdFx0XHRcdGF3YWl0IChjb250ZXh0LmdldEJpbmRpbmcoKSBhcyBPRGF0YUNvbnRleHRCaW5kaW5nKS5yZXF1ZXN0T2JqZWN0KFwiXCIpO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3Qgb3BlcmF0aW9uID0gZHJhZnQuZXhlY3V0ZURyYWZ0UHJlcGFyYXRpb25BY3Rpb24oY29udGV4dCwgY29udGV4dC5nZXRVcGRhdGVHcm91cElkKCksIHRydWUsIGlnbm9yZUVUYWcpO1xuXHRcdFx0aWYgKCFnZXRSZXR1cm5UeXBlKGNvbnRleHQsIGRyYWZ0T3BlcmF0aW9ucy5QUkVQQVJFKSkge1xuXHRcdFx0XHRyZXF1ZXN0TWVzc2FnZXMoY29udGV4dCwgYXBwQ29tcG9uZW50LmdldFNpZGVFZmZlY3RzU2VydmljZSgpKTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGF3YWl0IG9wZXJhdGlvbjtcblx0XHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgcmVxdWVzdGluZyBtZXNzYWdlc1wiLCBlcnJvciBhcyBzdHJpbmcpO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogQWN0aXZhdGVzIGEgZHJhZnQgZG9jdW1lbnQuIFRoZSBkcmFmdCB3aWxsIHJlcGxhY2UgdGhlIHNpYmxpbmcgZW50aXR5IGFuZCB3aWxsIGJlIGRlbGV0ZWQgYnkgdGhlIGJhY2sgZW5kLlxuICogQHBhcmFtIG9Db250ZXh0IENvbnRleHQgZm9yIHdoaWNoIHRoZSBhY3Rpb24gc2hvdWxkIGJlIHBlcmZvcm1lZFxuICogQHBhcmFtIG9BcHBDb21wb25lbnQgVGhlIEFwcENvbXBvbmVudFxuICogQHBhcmFtIG1lc3NhZ2VIYW5kbGVyXG4gKiBAcGFyYW0gW3NHcm91cElkXSBUaGUgb3B0aW9uYWwgYmF0Y2ggZ3JvdXAgaW4gd2hpY2ggdGhlIG9wZXJhdGlvbiBpcyB0byBiZSBleGVjdXRlZFxuICogQHBhcmFtIFtvUHJlcGFyZVByb21pc2VdIFRoZSBwcm9taXNlIG9mIHRoZSBwcmVwYXJlIGFjdGlvblxuICogQHBhcmFtIFtyZXNvdXJjZU1vZGVsXSBUaGUgcmVzb3VyY2UgbW9kZWwgdG8gbG9hZCB0ZXh0IHJlc291cmNlc1xuICogQHJldHVybnMgUmVzb2x2ZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBjb250ZXh0IG9mIHRoZSBvcGVyYXRpb25cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZURyYWZ0QWN0aXZhdGlvbkFjdGlvbihcblx0b0NvbnRleHQ6IENvbnRleHQsXG5cdG9BcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCxcblx0bWVzc2FnZUhhbmRsZXI6IE1lc3NhZ2VIYW5kbGVyLFxuXHRzR3JvdXBJZD86IHN0cmluZyxcblx0b1ByZXBhcmVQcm9taXNlPzogUHJvbWlzZTx2b2lkIHwgT0RhdGFDb250ZXh0QmluZGluZz4sXG5cdHJlc291cmNlTW9kZWw/OiBSZXNvdXJjZU1vZGVsXG4pOiBQcm9taXNlPENvbnRleHQ+IHtcblx0Y29uc3QgYkhhc1ByZXBhcmVBY3Rpb24gPSBkcmFmdC5oYXNQcmVwYXJlQWN0aW9uKG9Db250ZXh0KTtcblx0Ly8gQWNjb3JkaW5nIHRvIHRoZSBkcmFmdCBzcGVjIGlmIHRoZSBzZXJ2aWNlIGNvbnRhaW5zIGEgcHJlcGFyZSBhY3Rpb24gYW5kIHdlIHRyaWdnZXIgYm90aCBwcmVwYXJlIGFuZFxuXHQvLyBhY3RpdmF0ZSBpbiBvbmUgJGJhdGNoIHRoZSBhY3RpdmF0ZSBhY3Rpb24gaXMgY2FsbGVkIHdpdGggaUYtTWF0Y2g9KlxuXHRjb25zdCBiSWdub3JlRXRhZyA9IGJIYXNQcmVwYXJlQWN0aW9uO1xuXHRsZXQgb3BlcmF0aW9uOiBPcGVyYXRpb24gfCB1bmRlZmluZWQ7XG5cdGlmICghb0NvbnRleHQuZ2V0UHJvcGVydHkoXCJJc0FjdGl2ZUVudGl0eVwiKSkge1xuXHRcdGNvbnN0IGNvbnZlcnRlZEFjdGlvbiA9IGdldENvbnZlcnRlZEFjdGlvbihvQ29udGV4dCwgZHJhZnRPcGVyYXRpb25zLkFDVElWQVRJT04pO1xuXHRcdGlmIChjb252ZXJ0ZWRBY3Rpb24pIHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdG9wZXJhdGlvbiA9IG5ldyBPcGVyYXRpb24ob0FwcENvbXBvbmVudCwgb0NvbnRleHQuZ2V0TW9kZWwoKSwgY29udmVydGVkQWN0aW9uLCB7XG5cdFx0XHRcdFx0bWVzc2FnZUhhbmRsZXI6IG1lc3NhZ2VIYW5kbGVyLFxuXHRcdFx0XHRcdGNvbnRleHRzOiBbb0NvbnRleHRdLFxuXHRcdFx0XHRcdGxhYmVsOiByZXNvdXJjZU1vZGVsPy5nZXRUZXh0KFwiVF9PUF9PQkpFQ1RfUEFHRV9TQVZFXCIpLFxuXHRcdFx0XHRcdGJpbmRpbmdQYXJhbWV0ZXJzOiB7ICQkaW5oZXJpdEV4cGFuZFNlbGVjdDogdHJ1ZSB9LFxuXHRcdFx0XHRcdHNraXBNZXNzYWdlczogdHJ1ZSxcblx0XHRcdFx0XHRvRGF0YVByb3BlcnRpZXM6IHtcblx0XHRcdFx0XHRcdGRpc2FibGVTaWRlRWZmZWN0czogdHJ1ZSxcblx0XHRcdFx0XHRcdGdyb3VwSWQ6IHNHcm91cElkLFxuXHRcdFx0XHRcdFx0aWdub3JlRVRhZzogYklnbm9yZUV0YWcsXG5cdFx0XHRcdFx0XHRyZXBsYWNlV2l0aFJWQzogb0NvbnRleHQuZ2V0QmluZGluZygpLmlzQShcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nXCIpXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdFx0Y29uc3QgcmVzdWx0ID0gYXdhaXQgb3BlcmF0aW9uLmV4ZWN1dGUoKTtcblx0XHRcdFx0aWYgKHJlc3VsdFswXS5zdGF0dXMgPT09IFwicmVqZWN0ZWRcIikge1xuXHRcdFx0XHRcdHRocm93IG5ldyBFcnJvcihyZXN1bHRbMF0ucmVhc29uKTtcblx0XHRcdFx0fSBlbHNlIGlmIChyZXN1bHRbMF0udmFsdWUucmV0dXJuZWRDb250ZXh0ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJObyBjb250ZXh0IHJldHVybmVkIGJ5IHRoZSBhY3Rpb25cIik7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHJlc3VsdFswXS52YWx1ZS5yZXR1cm5lZENvbnRleHQ7XG5cdFx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRcdGlmIChiSGFzUHJlcGFyZUFjdGlvbikge1xuXHRcdFx0XHRcdC8vIGRlc3Ryb3kgdGhlIG9wZXJhdGlvbiBiaW5kaW5ncyB0byBhdm9pZCBhZGRpdGlvbmFsIG1lc3NhZ2UgcmVxdWVzdHMgc2VudCBieSB0aGUgbW9kZWxcblx0XHRcdFx0XHRjb25zdCBwcmVwYXJlT3BlcmF0aW9uID0gYXdhaXQgb1ByZXBhcmVQcm9taXNlO1xuXHRcdFx0XHRcdHByZXBhcmVPcGVyYXRpb24/LmRlc3Ryb3koKTtcblx0XHRcdFx0XHRvcGVyYXRpb24/LmNsZWFyKCk7XG5cblx0XHRcdFx0XHRjb25zdCBhY3Rpb25OYW1lID0gZ2V0QWN0aW9uTmFtZShvQ29udGV4dCwgZHJhZnRPcGVyYXRpb25zLlBSRVBBUkUpLFxuXHRcdFx0XHRcdFx0b1NpZGVFZmZlY3RzU2VydmljZSA9IG9BcHBDb21wb25lbnQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKCksXG5cdFx0XHRcdFx0XHRvQmluZGluZ1BhcmFtZXRlcnMgPSBvU2lkZUVmZmVjdHNTZXJ2aWNlLmdldE9EYXRhQWN0aW9uU2lkZUVmZmVjdHMoYWN0aW9uTmFtZSwgb0NvbnRleHQpLFxuXHRcdFx0XHRcdFx0YVRhcmdldFBhdGhzID0gb0JpbmRpbmdQYXJhbWV0ZXJzICYmIG9CaW5kaW5nUGFyYW1ldGVycy5wYXRoRXhwcmVzc2lvbnM7XG5cdFx0XHRcdFx0aWYgKGFUYXJnZXRQYXRocyAmJiBhVGFyZ2V0UGF0aHMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdFx0YXdhaXQgb1NpZGVFZmZlY3RzU2VydmljZS5yZXF1ZXN0U2lkZUVmZmVjdHMoYVRhcmdldFBhdGhzLCBvQ29udGV4dCk7XG5cdFx0XHRcdFx0XHR9IGNhdGNoIChvRXJyb3I6IHVua25vd24pIHtcblx0XHRcdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgcmVxdWVzdGluZyBzaWRlIGVmZmVjdHNcIiwgb0Vycm9yIGFzIHN0cmluZyk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRcdGF3YWl0IHJlcXVlc3RNZXNzYWdlcyhvQ29udGV4dCwgb1NpZGVFZmZlY3RzU2VydmljZSwgdHJ1ZSk7XG5cdFx0XHRcdFx0XHR9IGNhdGNoIChvRXJyb3I6IHVua25vd24pIHtcblx0XHRcdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgcmVxdWVzdGluZyBtZXNzYWdlc1wiLCBvRXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhyb3cgZTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiVGhlIGFjdGl2YXRpb24gYWN0aW9uIG5vdCBmb3VuZFwiKTtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKFwiVGhlIGFjdGl2YXRpb24gYWN0aW9uIGNhbm5vdCBiZSBleGVjdXRlZCBvbiBhbiBhY3RpdmUgZG9jdW1lbnRcIik7XG5cdH1cbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBzdXBwb3J0ZWQgbWVzc2FnZSBwcm9wZXJ0eSBwYXRoIG9uIHRoZSBQcmVwYXJlQWN0aW9uIGZvciBhIGNvbnRleHQuXG4gKiBAcGFyYW0gY29udGV4dCBDb250ZXh0IHRvIGJlIGNoZWNrZWRcbiAqIEByZXR1cm5zIFBhdGggdG8gdGhlIG1lc3NhZ2VcbiAqL1xuZnVuY3Rpb24gZ2V0TWVzc2FnZVBhdGhGb3JQcmVwYXJlKGNvbnRleHQ6IENvbnRleHQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHQvLyBJZiB0aGVyZSBpcyBubyByZXR1cm4gcGFyYW1ldGVyLCBpdCBpcyBub3QgcG9zc2libGUgdG8gcmVxdWVzdCBNZXNzYWdlcy5cblx0Ly8gUkFQIGRyYWZ0IHByZXBhcmUgaGFzIG5vIHJldHVybiBwYXJhbWV0ZXJcblx0cmV0dXJuIGdldFJldHVyblR5cGUoY29udGV4dCwgZHJhZnRPcGVyYXRpb25zLlBSRVBBUkUpID8gZ2V0TWVzc2FnZVBhdGhGb3JDb250ZXh0KGNvbnRleHQpIDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIHN1cHBvcnRlZCBtZXNzYWdlIHByb3BlcnR5IHBhdGggZm9yIGEgY29udGV4dC5cbiAqIEBwYXJhbSBjb250ZXh0IENvbnRleHQgdG8gYmUgY2hlY2tlZFxuICogQHJldHVybnMgUGF0aCB0byB0aGUgbWVzc2FnZVxuICovXG5mdW5jdGlvbiBnZXRNZXNzYWdlUGF0aEZvckNvbnRleHQoY29udGV4dDogQ29udGV4dCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdGNvbnN0IG1ldGFDb250ZXh0ID0gY29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpLmdldE1ldGFDb250ZXh0KGNvbnRleHQuZ2V0UGF0aCgpKTtcblx0Y29uc3QgY29udmVydGVkQ29udGV4dCA9IGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyhtZXRhQ29udGV4dCk7XG5cdGNvbnN0IG1lc3NhZ2VzID0gY29udmVydGVkQ29udGV4dC50YXJnZXRFbnRpdHlUeXBlLmFubm90YXRpb25zLkNvbW1vbj8uTWVzc2FnZXM7XG5cdHJldHVybiBpc1BhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbihtZXNzYWdlcykgPyBtZXNzYWdlcy5wYXRoIDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEV4ZWN1dGUgYSBwcmVwYXJhdGlvbiBhY3Rpb24uXG4gKiBAcGFyYW0gb0NvbnRleHQgQ29udGV4dCBmb3Igd2hpY2ggdGhlIGFjdGlvbiBzaG91bGQgYmUgcGVyZm9ybWVkXG4gKiBAcGFyYW0gZ3JvdXBJZCBUaGUgb3B0aW9uYWwgYmF0Y2ggZ3JvdXAgaW4gd2hpY2ggd2Ugd2FudCB0byBleGVjdXRlIHRoZSBvcGVyYXRpb25cbiAqIEBwYXJhbSBiTWVzc2FnZXMgSWYgc2V0IHRvIHRydWUsIHRoZSBQUkVQQVJFIGFjdGlvbiByZXRyaWV2ZXMgU0FQX01lc3NhZ2VzXG4gKiBAcGFyYW0gaWdub3JlRVRhZyBJZiBzZXQgdG8gdHJ1ZSwgRVRhZyBpbmZvcm1hdGlvbiBpcyBpZ25vcmVkIHdoZW4gdGhlIGFjdGlvbiBpcyBleGVjdXRlZFxuICogQHJldHVybnMgUmVzb2x2ZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBjb250ZXh0IG9mIHRoZSBvcGVyYXRpb25cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZURyYWZ0UHJlcGFyYXRpb25BY3Rpb24oXG5cdG9Db250ZXh0OiBDb250ZXh0LFxuXHRncm91cElkPzogc3RyaW5nLFxuXHRiTWVzc2FnZXM/OiBib29sZWFuLFxuXHRpZ25vcmVFVGFnPzogYm9vbGVhblxuKTogUHJvbWlzZTx2b2lkIHwgT0RhdGFDb250ZXh0QmluZGluZz4ge1xuXHRpZiAoIW9Db250ZXh0LmdldFByb3BlcnR5KFwiSXNBY3RpdmVFbnRpdHlcIikpIHtcblx0XHRjb25zdCBzTWVzc2FnZXNQYXRoID0gYk1lc3NhZ2VzID8gZ2V0TWVzc2FnZVBhdGhGb3JQcmVwYXJlKG9Db250ZXh0KSA6IHVuZGVmaW5lZDtcblx0XHRjb25zdCBvT3BlcmF0aW9uID0gY3JlYXRlT3BlcmF0aW9uKG9Db250ZXh0LCBkcmFmdE9wZXJhdGlvbnMuUFJFUEFSRSwgc01lc3NhZ2VzUGF0aCA/IHsgJHNlbGVjdDogc01lc3NhZ2VzUGF0aCB9IDogdW5kZWZpbmVkKTtcblxuXHRcdC8vIFRPRE86IHNpZGUgZWZmZWN0cyBxdWFsaWZpZXIgc2hhbGwgYmUgZXZlbiBkZXByZWNhdGVkIHRvIGJlIGNoZWNrZWRcblx0XHRvT3BlcmF0aW9uLnNldFBhcmFtZXRlcihcIlNpZGVFZmZlY3RzUXVhbGlmaWVyXCIsIFwiXCIpO1xuXG5cdFx0Y29uc3Qgc0dyb3VwSWQgPSBncm91cElkIHx8IG9PcGVyYXRpb24uZ2V0R3JvdXBJZCgpO1xuXHRcdHJldHVybiBvT3BlcmF0aW9uXG5cdFx0XHQuaW52b2tlKHNHcm91cElkLCBpZ25vcmVFVGFnKVxuXHRcdFx0LnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRyZXR1cm4gb09wZXJhdGlvbjtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogdW5rbm93bikge1xuXHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBleGVjdXRpbmcgdGhlIG9wZXJhdGlvblwiLCBvRXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdFx0cmV0dXJuIG9PcGVyYXRpb247XG5cdFx0XHR9KTtcblx0fSBlbHNlIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcHJlcGFyYXRpb24gYWN0aW9uIGNhbm5vdCBiZSBleGVjdXRlZCBvbiBhbiBhY3RpdmUgZG9jdW1lbnRcIik7XG5cdH1cbn1cblxuLyoqXG4gKiBSZXF1ZXN0cyB0aGUgbWVzc2FnZXMgaWYgYW5ub3RhdGVkIGZvciBhIGdpdmVuIGNvbnRleHQuXG4gKiBAcGFyYW0gb0NvbnRleHQgQ29udGV4dCBmb3Igd2hpY2ggdGhlIG1lc3NhZ2VzIHNoYWxsIGJlIHJlcXVlc3RlZFxuICogQHBhcmFtIG9TaWRlRWZmZWN0c1NlcnZpY2UgU2VydmljZSBmb3IgdGhlIFNpZGVFZmZlY3RzIG9uIFNBUCBGaW9yaSBlbGVtZW50c1xuICogQHBhcmFtIHJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcyBJZiBzZXQgdG8gdHJ1ZSwgdHJhbnNpdGlvbiBtZXNzYWdlcyBhcmUgcmVtb3ZlZCBpZiBzdGF0ZSBtZXNzYWdlcyBleGlzdFxuICogQHJldHVybnMgUHJvbWlzZSB3aGljaCBpcyByZXNvbHZlZCBvbmNlIG1lc3NhZ2VzIHdlcmUgcmVxdWVzdGVkXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlcXVlc3RNZXNzYWdlcyhcblx0b0NvbnRleHQ6IENvbnRleHQsXG5cdG9TaWRlRWZmZWN0c1NlcnZpY2U6IFNpZGVFZmZlY3RzU2VydmljZSxcblx0cmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzID0gZmFsc2Vcbik6IFByb21pc2U8dm9pZD4ge1xuXHRjb25zdCBzTWVzc2FnZXNQYXRoID0gTW9kZWxIZWxwZXIuZ2V0TWVzc2FnZXNQYXRoKG9Db250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCksIG9Db250ZXh0LmdldFBhdGgoKSk7XG5cdGlmIChzTWVzc2FnZXNQYXRoKSB7XG5cdFx0YXdhaXQgb1NpZGVFZmZlY3RzU2VydmljZS5yZXF1ZXN0U2lkZUVmZmVjdHMoW3NNZXNzYWdlc1BhdGhdLCBvQ29udGV4dCk7XG5cdFx0aWYgKHJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcykge1xuXHRcdFx0Y29uc3QgZGF0YSA9IGF3YWl0IG9Db250ZXh0LnJlcXVlc3RPYmplY3QoKTtcblx0XHRcdGlmIChkYXRhW3NNZXNzYWdlc1BhdGhdLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0Ly9pZiBzdGF0ZSBtZXNzYWdlcyBhcmUgYXZhaWxhYmxlIGZyb20gdGhlIFBSRVBBUkFUSU9OIGFjdGlvbiwgdGhlbiBwcmV2aW91cyB0cmFuc2l0aW9uIG1lc3NhZ2VzIGFyZSByZW1vdmVkXG5cdFx0XHRcdG1lc3NhZ2VIYW5kbGluZy5yZW1vdmVVbmJvdW5kVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cdFx0XHRcdG1lc3NhZ2VIYW5kbGluZy5yZW1vdmVCb3VuZFRyYW5zaXRpb25NZXNzYWdlcygpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHRyZXR1cm47XG59XG4vKipcbiAqIEV4ZWN1dGVzIGRpc2NhcmQgb2YgYSBkcmFmdCBmdW5jdGlvbiB1c2luZyBIVFRQIFBvc3QuXG4gKiBAcGFyYW0gb0NvbnRleHQgQ29udGV4dCBmb3Igd2hpY2ggdGhlIGFjdGlvbiBzaG91bGQgYmUgcGVyZm9ybWVkXG4gKiBAcGFyYW0gbWVzc2FnZUhhbmRsZXIgVGhlIG1lc3NhZ2UgaGFuZGxlciBjb250cm9sbGVyIGV4dGVuc2lvblxuICogQHBhcmFtIG9BcHBDb21wb25lbnQgQXBwIENvbXBvbmVudFxuICogQHBhcmFtIGJFbmFibGVTdHJpY3RIYW5kbGluZ1xuICogQHJldHVybnMgUmVzb2x2ZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBjb250ZXh0IG9mIHRoZSBvcGVyYXRpb25cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZURyYWZ0RGlzY2FyZEFjdGlvbihcblx0b0NvbnRleHQ6IENvbnRleHQsXG5cdG1lc3NhZ2VIYW5kbGVyOiBNZXNzYWdlSGFuZGxlcixcblx0b0FwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LFxuXHRiRW5hYmxlU3RyaWN0SGFuZGxpbmc/OiBib29sZWFuXG4pOiBQcm9taXNlPHZvaWQ+IHtcblx0aWYgKCFvQ29udGV4dC5nZXRQcm9wZXJ0eShcIklzQWN0aXZlRW50aXR5XCIpKSB7XG5cdFx0Y29uc3QgY29udmVydGVkQWN0aW9uID0gZ2V0Q29udmVydGVkQWN0aW9uKG9Db250ZXh0LCBkcmFmdE9wZXJhdGlvbnMuRElTQ0FSRCk7XG5cdFx0aWYgKGNvbnZlcnRlZEFjdGlvbikge1xuXHRcdFx0Y29uc3QgcmVzdWx0ID0gYXdhaXQgbmV3IE9wZXJhdGlvbihvQXBwQ29tcG9uZW50LCBvQ29udGV4dC5nZXRNb2RlbCgpLCBjb252ZXJ0ZWRBY3Rpb24sIHtcblx0XHRcdFx0bWVzc2FnZUhhbmRsZXI6IG1lc3NhZ2VIYW5kbGVyLFxuXHRcdFx0XHRsYWJlbDogZ2V0UmVzb3VyY2VNb2RlbChvQXBwQ29tcG9uZW50KT8uZ2V0VGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0RSQUZUX0RJU0NBUkRfQlVUVE9OXCIpIHx8IFwiXCIsXG5cdFx0XHRcdGNvbnRleHRzOiBbb0NvbnRleHRdLFxuXHRcdFx0XHRza2lwTWVzc2FnZXM6IHRydWUsXG5cdFx0XHRcdG9EYXRhUHJvcGVydGllczoge1xuXHRcdFx0XHRcdGRpc2FibGVTaWRlRWZmZWN0czogdHJ1ZSxcblx0XHRcdFx0XHRkaXNhYmxlU3RyaWN0SGFuZGxpbmc6ICFiRW5hYmxlU3RyaWN0SGFuZGxpbmcsXG5cdFx0XHRcdFx0aWdub3JlRVRhZzogaXNFbXB0eU9iamVjdChvQ29udGV4dC5nZXRPYmplY3QoKSksIC8vIElmIHRoZSBjb250ZXh0IGhhcyBub3QgYmVlbiBsb2FkZWQgeWV0LCB3ZSBjYW4gaWdub3JlIHRoZSBFVGFnIChhcyBubyBwcmV2aW91cyBFVGFnIGlzIGF2YWlsYWJsZSlcblx0XHRcdFx0XHRncm91cElkOiBcImRpcmVjdFwiLFxuXHRcdFx0XHRcdHJlcGxhY2VXaXRoUlZDOiB1bmRlZmluZWQsXG5cdFx0XHRcdFx0ZGVmZXJyZWRTdWJtaXQ6IGZhbHNlXG5cdFx0XHRcdH1cblx0XHRcdH0pLmV4ZWN1dGUoKTtcblx0XHRcdGlmIChyZXN1bHRbMF0uc3RhdHVzID09PSBcInJlamVjdGVkXCIpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKHJlc3VsdFswXS5yZWFzb24pO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJUaGUgZGlzY2FyZCBhY3Rpb24gbm90IGZvdW5kXCIpO1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJUaGUgZGlzY2FyZCBhY3Rpb24gY2Fubm90IGJlIGV4ZWN1dGVkIG9uIGFuIGFjdGl2ZSBkb2N1bWVudFwiKTtcblx0fVxufVxuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGNyZWF0ZXMgYSBzaWJsaW5nIGNvbnRleHQgZm9yIGEgc3Vib2JqZWN0IHBhZ2UgYW5kIGNhbGN1bGF0ZXMgYSBzaWJsaW5nIHBhdGggZm9yIGFsbCBpbnRlcm1lZGlhdGUgcGF0aHNcbiAqIGJldHdlZW4gdGhlIG9iamVjdCBwYWdlIGFuZCB0aGUgc3Vib2JqZWN0IHBhZ2UuXG4gKiBAcGFyYW0gcm9vdEN1cnJlbnRDb250ZXh0IFRoZSBjb250ZXh0IGZvciB0aGUgcm9vdCBvZiB0aGUgZHJhZnRcbiAqIEBwYXJhbSByaWdodG1vc3RDdXJyZW50Q29udGV4dCBUaGUgY29udGV4dCBvZiB0aGUgc3Vib2JqZWN0IHBhZ2VcbiAqIEBwYXJhbSByb290Q29udGV4dEluZm8gVGhlIGNvbnRleHQgaW5mbyBvZiByb290IG9mIHRoZSBkcmFmdFxuICogQHBhcmFtIGdyb3VwSWRcbiAqIEBwYXJhbSBiaW5kaW5nUGFyYW1ldGVycyBPcHRpb25hbCBiaW5kaW5nIHBhcmFtZXRlcnMgd2hlbiBjcmVhdGluZyB0aGUgY29udGV4dFxuICogQHBhcmFtIGNyZWF0ZUtlZXBBbGl2ZUNvbnRleHQgSWYgc2V0IHRvIHRydWUsIHRoZSBjb250ZXh0IHdpbGwgYmUgY3JlYXRlZCBhcyBhIGtlZXAtYWxpdmUgY29udGV4dFxuICogQHJldHVybnMgVGhlIHNpYmxpbmdJbmZvcm1hdGlvbiBvYmplY3RcbiAqL1xuYXN5bmMgZnVuY3Rpb24gY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbihcblx0cm9vdEN1cnJlbnRDb250ZXh0OiBDb250ZXh0LFxuXHRyaWdodG1vc3RDdXJyZW50Q29udGV4dDogQ29udGV4dCxcblx0cm9vdENvbnRleHRJbmZvPzogUm9vdENvbnRleHRJbmZvLFxuXHRncm91cElkPzogc3RyaW5nLFxuXHRiaW5kaW5nUGFyYW1ldGVycz86IG9iamVjdCxcblx0Y3JlYXRlS2VlcEFsaXZlQ29udGV4dCA9IGZhbHNlXG4pOiBQcm9taXNlPFNpYmxpbmdJbmZvcm1hdGlvbiB8IHVuZGVmaW5lZD4ge1xuXHRpZiAoIXJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0LmdldFBhdGgoKS5zdGFydHNXaXRoKHJvb3RDdXJyZW50Q29udGV4dC5nZXRQYXRoKCkpKSB7XG5cdFx0Ly8gV3JvbmcgdXNhZ2UgISFcblx0XHRMb2cuZXJyb3IoXCJDYW5ub3QgY29tcHV0ZSByaWdodG1vc3Qgc2libGluZyBjb250ZXh0XCIpO1xuXHRcdHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBjb21wdXRlIHJpZ2h0bW9zdCBzaWJsaW5nIGNvbnRleHRcIik7XG5cdH1cblxuXHRpZiAoXG5cdFx0cmlnaHRtb3N0Q3VycmVudENvbnRleHQuZ2V0UHJvcGVydHkoXCJJc0FjdGl2ZUVudGl0eVwiKSA9PT0gZmFsc2UgJiZcblx0XHRyaWdodG1vc3RDdXJyZW50Q29udGV4dC5nZXRQcm9wZXJ0eShcIkhhc0FjdGl2ZUVudGl0eVwiKSA9PT0gZmFsc2Vcblx0KSB7XG5cdFx0Ly8gV2UgYWxyZWFkeSBrbm93IHRoZSBzaWJsaW5nIGZvciByaWdodG1vc3RDdXJyZW50Q29udGV4dCBkb2Vzbid0IGV4aXN0XG5cdFx0Ly8gLS0+IE5vIG5lZWQgdG8gY2hlY2sgY2Fub25pY2FsIHBhdGhzIGV0Yy4uLlxuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblxuXHRjb25zdCBtb2RlbCA9IHJvb3RDdXJyZW50Q29udGV4dC5nZXRNb2RlbCgpO1xuXHR0cnkge1xuXHRcdC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXHRcdC8vIDEuIEZpbmQgYWxsIHNlZ21lbnRzIGJldHdlZW4gdGhlIHJvb3Qgb2JqZWN0IGFuZCB0aGUgc3ViLW9iamVjdFxuXHRcdC8vIEV4YW1wbGU6IGZvciByb290ID0gL1BhcmFtKGFhKS9FbnRpdHkoYmIpIGFuZCByaWdodE1vc3QgPSAvUGFyYW0oYWEpL0VudGl0eShiYikvX05hdihjYykvX1N1Yk5hdihkZClcblx0XHQvLyAtLS0+IFtcIlBhcmFtKGFhKS9FbnRpdHkoYmIpXCIsIFwiX05hdihjYylcIiwgXCJfU3ViTmF2KGRkKVwiXVxuXG5cdFx0Ly8gRmluZCBhbGwgc2VnbWVudHMgaW4gdGhlIHJpZ2h0bW9zdCBwYXRoXG5cdFx0Y29uc3QgYWRkaXRpb25hbFBhdGggPSByaWdodG1vc3RDdXJyZW50Q29udGV4dC5nZXRQYXRoKCkucmVwbGFjZShyb290Q3VycmVudENvbnRleHQuZ2V0UGF0aCgpLCBcIlwiKTtcblx0XHRjb25zdCBzZWdtZW50cyA9IGFkZGl0aW9uYWxQYXRoID8gYWRkaXRpb25hbFBhdGguc3Vic3RyaW5nKDEpLnNwbGl0KFwiL1wiKSA6IFtdO1xuXHRcdC8vIEZpcnN0IHNlZ21lbnQgaXMgYWx3YXlzIHRoZSBmdWxsIHBhdGggb2YgdGhlIHJvb3Qgb2JqZWN0LCB3aGljaCBjYW4gY29udGFpbiAnLycgaW4gY2FzZSBvZiBhIHBhcmFtZXRyaXplZCBlbnRpdHlcblx0XHRzZWdtZW50cy51bnNoaWZ0KHJvb3RDdXJyZW50Q29udGV4dC5nZXRQYXRoKCkuc3Vic3RyaW5nKDEpKTtcblxuXHRcdC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXHRcdC8vIDIuIFJlcXVlc3QgY2Fub25pY2FsIHBhdGhzIG9mIHRoZSBzaWJsaW5nIGVudGl0eSBmb3IgZWFjaCBzZWdtZW50XG5cdFx0Ly8gRXhhbXBsZTogZm9yIFtcIlBhcmFtKGFhKS9FbnRpdHkoYmIpXCIsIFwiX05hdihjYylcIiwgXCJfU3ViTmF2KGRkKVwiXVxuXHRcdC8vIC0tPiByZXF1ZXN0IGNhbm9uaWNhbCBwYXRocyBmb3IgXCJQYXJhbShhYSkvRW50aXR5KGJiKS9TaWJsaW5nRW50aXR5XCIsIFwiUGFyYW0oYWEpL0VudGl0eShiYikvX05hdihjYykvU2libGluZ0VudGl0eVwiLCBcIlBhcmFtKGFhKS9FbnRpdHkoYmIpL19OYXYoY2MpL19TdWJOYXYoZGQpL1NpYmxpbmdFbnRpdHlcIlxuXHRcdGNvbnN0IG9sZFBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuXHRcdGNvbnN0IG5ld1BhdGhzOiBzdHJpbmdbXSA9IFtdO1xuXHRcdGxldCBjdXJyZW50UGF0aCA9IFwiXCI7XG5cblx0XHQvLyBDb21wdXRpbmcgc2libGluZyBlbnRpdHkgb2Ygcm9vdCBvZiB0aGUgZHJhZnQgY29udGV4dCBpcyBub3QgcmVxdWlyZWQgaWYgdGhlIGNvbnRleHQgaXMgYWxyZWFkeSBpbiB0aGUgc3ViLU9QXG5cdFx0Ly8gRXhhbXBsZTogRWRpdCBpbiBTdWItT1Agd2hlcmUgbmV3IGNvbnRleHQgaXMgYWxyZWFkeSBhdmFpbGFibGVcblx0XHRjb25zdCBwYXRocyA9IFsuLi5zZWdtZW50c107XG5cdFx0aWYgKHJvb3RDb250ZXh0SW5mbz8ucm9vdFNpYmxpbmdQYXRoUHJvbWlzZSkge1xuXHRcdFx0cGF0aHMuc2hpZnQoKTtcblx0XHRcdGN1cnJlbnRQYXRoID0gXCIvXCIgKyByb290Q3VycmVudENvbnRleHQ/LmdldFBhdGgoKT8uc3Vic3RyaW5nKDEpO1xuXHRcdH1cblx0XHRjb25zdCBjYW5vbmljYWxQYXRoUHJvbWlzZXMgPSBwYXRocy5tYXAoYXN5bmMgKHNlZ21lbnQpID0+IHtcblx0XHRcdGN1cnJlbnRQYXRoICs9IGAvJHtzZWdtZW50fWA7XG5cdFx0XHRvbGRQYXRocy51bnNoaWZ0KGN1cnJlbnRQYXRoKTtcblx0XHRcdGlmIChjdXJyZW50UGF0aC5lbmRzV2l0aChcIilcIikpIHtcblx0XHRcdFx0Y29uc3Qgc2libGluZ0NvbnRleHQgPSBtb2RlbFxuXHRcdFx0XHRcdC5iaW5kQ29udGV4dChgJHtjdXJyZW50UGF0aH0vU2libGluZ0VudGl0eWAsIHVuZGVmaW5lZCwgZ3JvdXBJZCA/IHsgJCRncm91cElkOiBncm91cElkIH0gOiB1bmRlZmluZWQpXG5cdFx0XHRcdFx0LmdldEJvdW5kQ29udGV4dCgpO1xuXHRcdFx0XHRyZXR1cm4gc2libGluZ0NvbnRleHQucmVxdWVzdENhbm9uaWNhbFBhdGgoKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUodW5kZWZpbmVkKTsgLy8gMS0xIHJlbGF0aW9uXG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHQvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblx0XHQvLyAzLiBSZWNvbnN0cnVjdCB0aGUgZnVsbCBwYXRocyBmcm9tIGNhbm9uaWNhbCBwYXRocyAoZm9yIHBhdGggbWFwcGluZylcblx0XHQvLyBFeGFtcGxlOiBmb3IgY2Fub25pY2FsIHBhdGhzIFwiL1BhcmFtKGFhKS9FbnRpdHkoYmItc2libGluZylcIiwgXCIvRW50aXR5MihjYy1zaWJsaW5nKVwiLCBcIi9FbnRpdHkzKGRkLXNpYmxpbmcpXCJcblx0XHQvLyAtLT4gW1wiUGFyYW0oYWEpL0VudGl0eShiYi1zaWJsaW5nKVwiLCBcIlBhcmFtKGFhKS9FbnRpdHkoYmItc2libGluZykvX05hdihjYy1zaWJsaW5nKVwiLCBcIlBhcmFtKGFhKS9FbnRpdHkoYmItc2libGluZykvX05hdihjYy1zaWJsaW5nKS9fU3ViTmF2KGRkLXNpYmxpbmcpXCJdXG5cdFx0Y29uc3QgY2Fub25pY2FsUGF0aHMgPSAoYXdhaXQgUHJvbWlzZS5hbGwoY2Fub25pY2FsUGF0aFByb21pc2VzKSkgYXMgc3RyaW5nW107XG5cblx0XHQvLyBXb3JrYXJvdW5kICh0ZW1wb3JhcnkgPyk6IHdoZW4gdGhlIHNpYmxpbmcgZG9lc24ndCBleGlzdCwgcmVxdWVzdENhbm9uaWNhbFBhdGggcmV0dXJucyB0aGUgc2FtZSBwYXRoXG5cdFx0aWYgKFxuXHRcdFx0Y2Fub25pY2FsUGF0aHMuc29tZSgocGF0aCkgPT4ge1xuXHRcdFx0XHRyZXR1cm4gcGF0aCAmJiBwYXRoLmVuZHNXaXRoKFwiL1NpYmxpbmdFbnRpdHlcIik7XG5cdFx0XHR9KVxuXHRcdCkge1xuXHRcdFx0Ly8gQXQgbGVhc3Qgb25lIHNpYmxpbmcgZW50aXR5IGRvZXNuJ3QgZXhpc3Rcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXG5cdFx0aWYgKHJvb3RDb250ZXh0SW5mbz8ucm9vdFNpYmxpbmdQYXRoUHJvbWlzZSkge1xuXHRcdFx0Y29uc3Qgcm9vdFNpYmxpbmdQYXRoID0gKGF3YWl0IHJvb3RDb250ZXh0SW5mby5yb290U2libGluZ1BhdGhQcm9taXNlKT8uZ2V0UGF0aCgpIGFzIHN0cmluZztcblx0XHRcdGNhbm9uaWNhbFBhdGhzLnVuc2hpZnQocm9vdFNpYmxpbmdQYXRoKTtcblx0XHRcdG9sZFBhdGhzLnB1c2gocm9vdEN1cnJlbnRDb250ZXh0LmdldFBhdGgoKSk7XG5cdFx0fVxuXHRcdGxldCBzaWJsaW5nUGF0aCA9IFwiXCI7XG5cdFx0Y2Fub25pY2FsUGF0aHMuZm9yRWFjaCgoY2Fub25pY2FsUGF0aCwgaW5kZXgpID0+IHtcblx0XHRcdGlmIChpbmRleCAhPT0gMCkge1xuXHRcdFx0XHRpZiAoc2VnbWVudHNbaW5kZXhdLmVuZHNXaXRoKFwiKVwiKSkge1xuXHRcdFx0XHRcdGNvbnN0IG5hdmlnYXRpb24gPSBzZWdtZW50c1tpbmRleF0ucmVwbGFjZSgvXFwoLiokLywgXCJcIik7IC8vIEtlZXAgb25seSBuYXZpZ2F0aW9uIG5hbWUgZnJvbSB0aGUgc2VnbWVudCwgaS5lLiBhYWEoeHh4KSAtLT4gYWFhXG5cdFx0XHRcdFx0Y29uc3Qga2V5cyA9IGNhbm9uaWNhbFBhdGgucmVwbGFjZSgvLipcXCgvLCBcIihcIik7IC8vIEtlZXAgb25seSB0aGUga2V5cyBmcm9tIHRoZSBjYW5vbmljYWwgcGF0aCwgaS5lLiBhYWEoeHh4KSAtLT4gKHh4eClcblx0XHRcdFx0XHRzaWJsaW5nUGF0aCArPSBgLyR7bmF2aWdhdGlvbn0ke2tleXN9YDtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRzaWJsaW5nUGF0aCArPSBgLyR7c2VnbWVudHNbaW5kZXhdfWA7IC8vIDEtMSByZWxhdGlvblxuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRzaWJsaW5nUGF0aCA9IGNhbm9uaWNhbFBhdGg7IC8vIFRvIG1hbmFnZSBwYXJhbWV0cml6ZWQgZW50aXRpZXNcblx0XHRcdH1cblx0XHRcdG5ld1BhdGhzLnVuc2hpZnQoc2libGluZ1BhdGgpO1xuXHRcdH0pO1xuXG5cdFx0bGV0IHBhcmFtZXRlcnM6IHsgJHNlbGVjdD86IHN0cmluZzsgJCRncm91cElkPzogc3RyaW5nIH07XG5cdFx0Y29uc3QgbWVzc2FnZVBhdGggPSBnZXRNZXNzYWdlUGF0aEZvckNvbnRleHQocmlnaHRtb3N0Q3VycmVudENvbnRleHQpO1xuXHRcdGlmIChjcmVhdGVLZWVwQWxpdmVDb250ZXh0KSB7XG5cdFx0XHRwYXJhbWV0ZXJzID0geyAkJGdyb3VwSWQ6IFwiJGF1dG8uV29ya2Vyc1wiIH07IC8vIFdlIG5lZWQgdG8gdXNlIHRoZSBzYW1lIGdyb3VwIElEIGFzIGZvciB0aGUgcGFyZW50IGxpc3QgYmluZGluZ1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRwYXJhbWV0ZXJzID0gYmluZGluZ1BhcmFtZXRlcnMgPz8ge307XG5cdFx0XHRpZiAobWVzc2FnZVBhdGgpIHtcblx0XHRcdFx0aWYgKHBhcmFtZXRlcnMuJHNlbGVjdCkge1xuXHRcdFx0XHRcdHBhcmFtZXRlcnMuJHNlbGVjdCArPSBgLCR7bWVzc2FnZVBhdGh9YDtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRwYXJhbWV0ZXJzLiRzZWxlY3QgPSBtZXNzYWdlUGF0aDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cGFyYW1ldGVycy4kJGdyb3VwSWQgPSBcIiRhdXRvLkhlcm9lc1wiO1xuXHRcdH1cblxuXHRcdHJldHVybiB7XG5cdFx0XHR0YXJnZXRDb250ZXh0OiBjcmVhdGVLZWVwQWxpdmVDb250ZXh0XG5cdFx0XHRcdD8gbW9kZWwuZ2V0S2VlcEFsaXZlQ29udGV4dChzaWJsaW5nUGF0aCwgISFtZXNzYWdlUGF0aCwgcGFyYW1ldGVycylcblx0XHRcdFx0OiBtb2RlbC5iaW5kQ29udGV4dChzaWJsaW5nUGF0aCwgdW5kZWZpbmVkLCBwYXJhbWV0ZXJzKS5nZXRCb3VuZENvbnRleHQoKSwgLy8gQ3JlYXRlIHRoZSByaWdodG1vc3Qgc2libGluZyBjb250ZXh0IGZyb20gaXRzIHBhdGhcblx0XHRcdHBhdGhNYXBwaW5nOiBvbGRQYXRocy5tYXAoKG9sZFBhdGgsIGluZGV4KSA9PiB7XG5cdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0b2xkUGF0aCxcblx0XHRcdFx0XHRuZXdQYXRoOiBuZXdQYXRoc1tpbmRleF1cblx0XHRcdFx0fTtcblx0XHRcdH0pXG5cdFx0fTtcblx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHQvLyBBIGNhbm9uaWNhbCBwYXRoIGNvdWxkbid0IGJlIHJlc29sdmVkIChiZWNhdXNlIGEgc2libGluZyBkb2Vzbid0IGV4aXN0KVxuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgZHJhZnQgZG9jdW1lbnQgZnJvbSBhbiBleGlzdGluZyBkb2N1bWVudC5cbiAqXG4gKiBUaGUgZnVuY3Rpb24gc3VwcG9ydHMgc2V2ZXJhbCBob29rcyBhcyB0aGVyZSBpcyBhIGNlcnRhaW4gY29yZW9ncmFwaHkgZGVmaW5lZC5cbiAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IG9mIHRoZSBhY3RpdmUgZG9jdW1lbnQgZm9yIHRoZSBuZXcgZHJhZnRcbiAqIEBwYXJhbSBvQXBwQ29tcG9uZW50IFRoZSBBcHBDb21wb25lbnRcbiAqIEBwYXJhbSBtUGFyYW1ldGVycyBUaGUgcGFyYW1ldGVyc1xuICogQHBhcmFtIFttUGFyYW1ldGVycy5vVmlld10gVGhlIHZpZXdcbiAqIEBwYXJhbSBbbVBhcmFtZXRlcnMuYlByZXNlcnZlQ2hhbmdlc10gUHJlc2VydmUgY2hhbmdlcyBvZiBhbiBleGlzdGluZyBkcmFmdCBvZiBhbm90aGVyIHVzZXJcbiAqIEBwYXJhbSBncm91cElkIFRoZSBiYXRjaCBncm91cElkIGZvciBwb3N0IGNhbGwgb2YgZWRpdCBhY3Rpb25cbiAqIEBwYXJhbSBtZXNzYWdlSGFuZGxlciBUaGUgbWVzc2FnZSBoYW5kbGVyIGNvbnRyb2xsZXIgZXh0ZW5zaW9uXG4gKiBAcGFyYW0gdHJhbnNhY3Rpb25EZXRhaWxzIE9wdGlvbmFsIG9iamVjdCB0byByZXR1cm4gYWRkaXRpb25hbCBkZXRhaWxzIGFib3V0IGhvdyB0aGUgdHJhbnNhY3Rpb24gd2FzIGV4ZWN1dGVkXG4gKiBAcGFyYW0gdHJhbnNhY3Rpb25EZXRhaWxzLmV4aXN0aW5nRHJhZnRSZXVzZWQgQW4gZXhpc3RpbmcgZHJhZnQgd2FzIHJldHVybmVkLCBpbnN0ZWFkIG9mIHJldHVybmluZyBhIG5ldyBvbmVcbiAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgd2l0aCB0aGUge0BsaW5rIHNhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0IGNvbnRleHR9IG9mIHRoZSBuZXcgZHJhZnQgZG9jdW1lbnRcbiAqL1xuYXN5bmMgZnVuY3Rpb24gY3JlYXRlRHJhZnRGcm9tQWN0aXZlRG9jdW1lbnQoXG5cdG9Db250ZXh0OiBDb250ZXh0LFxuXHRvQXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsXG5cdG1QYXJhbWV0ZXJzOiB7XG5cdFx0b1ZpZXc6IEZFVmlldztcblx0XHRiUHJlc2VydmVDaGFuZ2VzPzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcblx0fSxcblx0Z3JvdXBJZDogc3RyaW5nLFxuXHRtZXNzYWdlSGFuZGxlcjogTWVzc2FnZUhhbmRsZXIsXG5cdHRyYW5zYWN0aW9uRGV0YWlscz86IHtcblx0XHRleGlzdGluZ0RyYWZ0UmV1c2VkPzogYm9vbGVhbjtcblx0fVxuKTogUHJvbWlzZTxDb250ZXh0IHwgdW5kZWZpbmVkPiB7XG5cdGNvbnN0IG1QYXJhbSA9IG1QYXJhbWV0ZXJzIHx8IHt9LFxuXHRcdGJSdW5QcmVzZXJ2ZUNoYW5nZXNGbG93ID1cblx0XHRcdHR5cGVvZiBtUGFyYW0uYlByZXNlcnZlQ2hhbmdlcyA9PT0gXCJ1bmRlZmluZWRcIiB8fCAodHlwZW9mIG1QYXJhbS5iUHJlc2VydmVDaGFuZ2VzID09PSBcImJvb2xlYW5cIiAmJiBtUGFyYW0uYlByZXNlcnZlQ2hhbmdlcyk7IC8vZGVmYXVsdCB0cnVlXG5cblx0LyoqXG5cdCAqIE92ZXJ3cml0ZSB0aGUgZXhpc3RpbmcgY2hhbmdlLlxuXHQgKiBAcGFyYW0gcmVzcG9uc2UgQ29udGV4dCBvZiB0aGUgYWN0aXZlIGRvY3VtZW50IGZvciB0aGUgbmV3IGRyYWZ0IG9yIHRoZSBlcnJvciByZXRyaWV2ZWRcblx0ICogQHJldHVybnMgUmVzb2x2ZXMgd2l0aCByZXN1bHQgb2Yge0BsaW5rIHNhcC5mZS5jb3JlLmFjdGlvbnMjZXhlY3V0ZURyYWZ0RWRpdEFjdGlvbn1cblx0ICovXG5cdGFzeW5jIGZ1bmN0aW9uIG92ZXJ3cml0ZUNoYW5nZShyZXNwb25zZTogQ29udGV4dCB8IENvbnRleHRFcnJvclR5cGUpOiBQcm9taXNlPENvbnRleHQgfCBDb250ZXh0RXJyb3JUeXBlIHwgdW5kZWZpbmVkPiB7XG5cdFx0Ly9PdmVyd3JpdGUgZXhpc3RpbmcgY2hhbmdlc1xuXHRcdGNvbnN0IG9Nb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCk7XG5cdFx0Y29uc3QgZHJhZnREYXRhQ29udGV4dCA9IG9Nb2RlbC5iaW5kQ29udGV4dChgJHtvQ29udGV4dC5nZXRQYXRoKCl9L0RyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhYCkuZ2V0Qm91bmRDb250ZXh0KCk7XG5cdFx0Y29uc3QgcmVzb3VyY2VNb2RlbCA9IGdldFJlc291cmNlTW9kZWwobVBhcmFtZXRlcnMub1ZpZXcpO1xuXHRcdGNvbnN0IGRyYWZ0QWRtaW5EYXRhID0gYXdhaXQgZHJhZnREYXRhQ29udGV4dC5yZXF1ZXN0T2JqZWN0KCk7XG5cdFx0aWYgKGRyYWZ0QWRtaW5EYXRhKSB7XG5cdFx0XHQvLyByZW1vdmUgYWxsIHVuYm91bmQgdHJhbnNpdGlvbiBtZXNzYWdlcyBhcyB3ZSBzaG93IGEgc3BlY2lhbCBkaWFsb2dcblx0XHRcdG1lc3NhZ2VIYW5kbGluZy5yZW1vdmVVbmJvdW5kVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cdFx0XHRsZXQgc0luZm8gPSBkcmFmdEFkbWluRGF0YS5JblByb2Nlc3NCeVVzZXJEZXNjcmlwdGlvbiB8fCBkcmFmdEFkbWluRGF0YS5JblByb2Nlc3NCeVVzZXI7XG5cdFx0XHRjb25zdCBzRW50aXR5U2V0ID0gbVBhcmFtZXRlcnMub1ZpZXcuZ2V0Vmlld0RhdGEoKS5lbnRpdHlTZXQ7XG5cdFx0XHRpZiAoc0luZm8pIHtcblx0XHRcdFx0Y29uc3Qgc0xvY2tlZEJ5VXNlck1zZyA9IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfRFJBRlRfT0JKRUNUX1BBR0VfRFJBRlRfTE9DS0VEX0JZX1VTRVJcIiwgc0luZm8sIHNFbnRpdHlTZXQpO1xuXHRcdFx0XHRNZXNzYWdlQm94LmVycm9yKHNMb2NrZWRCeVVzZXJNc2cpO1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3Ioc0xvY2tlZEJ5VXNlck1zZyk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRzSW5mbyA9IGRyYWZ0QWRtaW5EYXRhLkNyZWF0ZWRCeVVzZXJEZXNjcmlwdGlvbiB8fCBkcmFmdEFkbWluRGF0YS5DcmVhdGVkQnlVc2VyO1xuXHRcdFx0XHRjb25zdCBzVW5zYXZlZENoYW5nZXNNc2cgPSByZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX0RSQUZUX09CSkVDVF9QQUdFX0RSQUZUX1VOU0FWRURfQ0hBTkdFU1wiLCBzSW5mbywgc0VudGl0eVNldCk7XG5cdFx0XHRcdGF3YWl0IGRyYWZ0LnNob3dFZGl0Q29uZmlybWF0aW9uTWVzc2FnZUJveChzVW5zYXZlZENoYW5nZXNNc2csIG9Db250ZXh0KTtcblx0XHRcdFx0cmV0dXJuIGRyYWZ0LmV4ZWN1dGVEcmFmdEVkaXRBY3Rpb24ob0NvbnRleHQsIGZhbHNlLCBtUGFyYW1ldGVycy5vVmlldywgZ3JvdXBJZCwgbWVzc2FnZUhhbmRsZXIsIHRydWUpOyAvLyB0cnVlIGJlY2F1c2Ugd2Ugb3ZlcndyaXRlIGNoYW5nZXNcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKChyZXNwb25zZSBhcyBDb250ZXh0RXJyb3JUeXBlKT8ubWVzc2FnZSkge1xuXHRcdFx0TWVzc2FnZUJveC5lcnJvcigocmVzcG9uc2UgYXMgQ29udGV4dEVycm9yVHlwZSkubWVzc2FnZSk7XG5cdFx0fVxuXHRcdHRocm93IG5ldyBFcnJvcihgRHJhZnQgY3JlYXRpb24gYWJvcnRlZCBmb3IgZG9jdW1lbnQ6ICR7b0NvbnRleHQuZ2V0UGF0aCgpfWApO1xuXHR9XG5cblx0aWYgKCFvQ29udGV4dCkge1xuXHRcdHRocm93IG5ldyBFcnJvcihcIkJpbmRpbmcgY29udGV4dCB0byBhY3RpdmUgZG9jdW1lbnQgaXMgcmVxdWlyZWRcIik7XG5cdH1cblx0bGV0IG9EcmFmdENvbnRleHQ6IENvbnRleHQgfCBDb250ZXh0RXJyb3JUeXBlIHwgdW5kZWZpbmVkO1xuXHR0cnkge1xuXHRcdG9EcmFmdENvbnRleHQgPSBhd2FpdCBkcmFmdC5leGVjdXRlRHJhZnRFZGl0QWN0aW9uKG9Db250ZXh0LCBiUnVuUHJlc2VydmVDaGFuZ2VzRmxvdywgbVBhcmFtZXRlcnMub1ZpZXcsIGdyb3VwSWQsIG1lc3NhZ2VIYW5kbGVyKTtcblx0fSBjYXRjaCAob1Jlc3BvbnNlKSB7XG5cdFx0aWYgKChvUmVzcG9uc2UgYXMgQ29udGV4dEVycm9yVHlwZSkuc3RhdHVzID09PSA0MDkgfHwgKG9SZXNwb25zZSBhcyBDb250ZXh0RXJyb3JUeXBlKS5zdGF0dXMgPT09IDQyMykge1xuXHRcdFx0bWVzc2FnZUhhbmRsaW5nLnJlbW92ZUJvdW5kVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cdFx0XHRtZXNzYWdlSGFuZGxpbmcucmVtb3ZlVW5ib3VuZFRyYW5zaXRpb25NZXNzYWdlcygpO1xuXHRcdFx0Y29uc3QgYmluZGluZ1BhcmFtZXRlcnMgPSBNb2RlbEhlbHBlci5pc0NvbGxhYm9yYXRpb25EcmFmdFN1cHBvcnRlZChvQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpKVxuXHRcdFx0XHQ/IHsgJHNlbGVjdDogXCJEcmFmdEFkbWluaXN0cmF0aXZlRGF0YS9EcmFmdEFkbWluaXN0cmF0aXZlVXNlclwiIH1cblx0XHRcdFx0OiB1bmRlZmluZWQ7XG5cdFx0XHRjb25zdCBzaWJsaW5nSW5mbyA9IGF3YWl0IGRyYWZ0LmNvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24oXG5cdFx0XHRcdG9Db250ZXh0LFxuXHRcdFx0XHRvQ29udGV4dCxcblx0XHRcdFx0dW5kZWZpbmVkLFxuXHRcdFx0XHR1bmRlZmluZWQsXG5cdFx0XHRcdGJpbmRpbmdQYXJhbWV0ZXJzLFxuXHRcdFx0XHRvQXBwQ29tcG9uZW50Ll9pc0ZjbEVuYWJsZWQoKVxuXHRcdFx0KTtcblx0XHRcdGlmIChzaWJsaW5nSW5mbz8udGFyZ2V0Q29udGV4dCkge1xuXHRcdFx0XHQvL3RoZXJlIGlzIGEgY29udGV4dCBhdXRob3JpemVkIHRvIGJlIGVkaXRlZCBieSB0aGUgY3VycmVudCB1c2VyXG5cdFx0XHRcdGF3YWl0IENvbW1vblV0aWxzLndhaXRGb3JDb250ZXh0UmVxdWVzdGVkKHNpYmxpbmdJbmZvLnRhcmdldENvbnRleHQpO1xuXHRcdFx0XHRpZiAodHJhbnNhY3Rpb25EZXRhaWxzKSB7XG5cdFx0XHRcdFx0dHJhbnNhY3Rpb25EZXRhaWxzLmV4aXN0aW5nRHJhZnRSZXVzZWQgPSB0cnVlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIHNpYmxpbmdJbmZvLnRhcmdldENvbnRleHQ7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvL3RoZXJlIGlzIG5vIGRyYWZ0IG93bmVkIGJ5IHRoZSBjdXJyZW50IHVzZXJcblx0XHRcdFx0b0RyYWZ0Q29udGV4dCA9IGF3YWl0IG92ZXJ3cml0ZUNoYW5nZShvUmVzcG9uc2UgYXMgQ29udGV4dEVycm9yVHlwZSk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmICghKG9SZXNwb25zZSAmJiAob1Jlc3BvbnNlIGFzIENvbnRleHRFcnJvclR5cGUpLmNhbmNlbGVkKSkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKG9SZXNwb25zZSBhcyBzdHJpbmcpO1xuXHRcdH1cblx0fVxuXG5cdGlmIChvRHJhZnRDb250ZXh0KSB7XG5cdFx0Y29uc3Qgc0VkaXRBY3Rpb25OYW1lID0gZHJhZnQuZ2V0QWN0aW9uTmFtZShvRHJhZnRDb250ZXh0IGFzIENvbnRleHQsIGRyYWZ0T3BlcmF0aW9ucy5FRElUKTtcblx0XHRjb25zdCBvU2lkZUVmZmVjdHMgPSBvQXBwQ29tcG9uZW50LmdldFNpZGVFZmZlY3RzU2VydmljZSgpLmdldE9EYXRhQWN0aW9uU2lkZUVmZmVjdHMoc0VkaXRBY3Rpb25OYW1lLCBvRHJhZnRDb250ZXh0IGFzIENvbnRleHQpO1xuXHRcdGlmIChvU2lkZUVmZmVjdHM/LnRyaWdnZXJBY3Rpb25zPy5sZW5ndGgpIHtcblx0XHRcdGF3YWl0IG9BcHBDb21wb25lbnQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKCkucmVxdWVzdFNpZGVFZmZlY3RzRm9yT0RhdGFBY3Rpb24ob1NpZGVFZmZlY3RzLCBvRHJhZnRDb250ZXh0IGFzIENvbnRleHQpO1xuXHRcdFx0cmV0dXJuIG9EcmFmdENvbnRleHQgYXMgQ29udGV4dDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIG9EcmFmdENvbnRleHQgYXMgQ29udGV4dDtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxufVxuLyoqXG4gKiBDcmVhdGVzIGFuIGFjdGl2ZSBkb2N1bWVudCBmcm9tIGEgZHJhZnQgZG9jdW1lbnQuXG4gKlxuICogVGhlIGZ1bmN0aW9uIHN1cHBvcnRzIHNldmVyYWwgaG9va3MgYXMgdGhlcmUgaXMgYSBjZXJ0YWluIGNob3Jlb2dyYXBoeSBkZWZpbmVkLlxuICogQHBhcmFtIG9Db250ZXh0IENvbnRleHQgb2YgdGhlIGFjdGl2ZSBkb2N1bWVudCBmb3IgdGhlIG5ldyBkcmFmdFxuICogQHBhcmFtIG9BcHBDb21wb25lbnQgVGhlIEFwcENvbXBvbmVudFxuICogQHBhcmFtIG1lc3NhZ2VIYW5kbGVyIFRoZSBtZXNzYWdlIGhhbmRsZXIgY29udHJvbGxlciBleHRlbnNpb25cbiAqIEBwYXJhbSBtUGFyYW1ldGVycyBUaGUgcGFyYW1ldGVyc1xuICogQHBhcmFtIFttUGFyYW1ldGVycy5mbkJlZm9yZUFjdGl2YXRlRG9jdW1lbnRdIENhbGxiYWNrIHRoYXQgYWxsb3dzIGEgdmV0byBiZWZvcmUgdGhlICdDcmVhdGUnIHJlcXVlc3QgaXMgZXhlY3V0ZWRcbiAqIEBwYXJhbSBbbVBhcmFtZXRlcnMuZm5BZnRlckFjdGl2YXRlRG9jdW1lbnRdIENhbGxiYWNrIGZvciBwb3N0cHJvY2Vzc2luZyBhZnRlciBkb2N1bWVudCB3YXMgYWN0aXZhdGVkLlxuICogQHBhcmFtIFttUGFyYW1ldGVycy5yZXNvdXJjZU1vZGVsXSBSZXNvdXJjZSBNb2RlbFxuICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyB3aXRoIHRoZSB7QGxpbmsgc2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHQgY29udGV4dH0gb2YgdGhlIG5ldyBkcmFmdCBkb2N1bWVudFxuICovXG5hc3luYyBmdW5jdGlvbiBhY3RpdmF0ZURvY3VtZW50KFxuXHRvQ29udGV4dDogQ29udGV4dCxcblx0b0FwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LFxuXHRtZXNzYWdlSGFuZGxlcjogTWVzc2FnZUhhbmRsZXIsXG5cdG1QYXJhbWV0ZXJzOiB7IGZuQmVmb3JlQWN0aXZhdGVEb2N1bWVudD86IEZ1bmN0aW9uOyBmbkFmdGVyQWN0aXZhdGVEb2N1bWVudD86IEZ1bmN0aW9uOyByZXNvdXJjZU1vZGVsPzogUmVzb3VyY2VNb2RlbCB9XG4pOiBQcm9taXNlPENvbnRleHQ+IHtcblx0Y29uc3QgbVBhcmFtID0gbVBhcmFtZXRlcnMgfHwge307XG5cdGlmICghb0NvbnRleHQpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJCaW5kaW5nIGNvbnRleHQgdG8gZHJhZnQgZG9jdW1lbnQgaXMgcmVxdWlyZWRcIik7XG5cdH1cblxuXHRjb25zdCBiRXhlY3V0ZSA9IG1QYXJhbS5mbkJlZm9yZUFjdGl2YXRlRG9jdW1lbnQgPyBhd2FpdCBtUGFyYW0uZm5CZWZvcmVBY3RpdmF0ZURvY3VtZW50KG9Db250ZXh0KSA6IHRydWU7XG5cdGlmICghYkV4ZWN1dGUpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoYEFjdGl2YXRpb24gb2YgdGhlIGRvY3VtZW50IHdhcyBhYm9ydGVkIGJ5IGV4dGVuc2lvbiBmb3IgZG9jdW1lbnQ6ICR7b0NvbnRleHQuZ2V0UGF0aCgpfWApO1xuXHR9XG5cblx0bGV0IG9BY3RpdmVEb2N1bWVudENvbnRleHQ6IENvbnRleHQ7XG5cdGlmICghZHJhZnQuaGFzUHJlcGFyZUFjdGlvbihvQ29udGV4dCkpIHtcblx0XHRvQWN0aXZlRG9jdW1lbnRDb250ZXh0ID0gYXdhaXQgZXhlY3V0ZURyYWZ0QWN0aXZhdGlvbkFjdGlvbihcblx0XHRcdG9Db250ZXh0LFxuXHRcdFx0b0FwcENvbXBvbmVudCxcblx0XHRcdG1lc3NhZ2VIYW5kbGVyLFxuXHRcdFx0dW5kZWZpbmVkLFxuXHRcdFx0dW5kZWZpbmVkLFxuXHRcdFx0bVBhcmFtZXRlcnMucmVzb3VyY2VNb2RlbFxuXHRcdCk7XG5cdH0gZWxzZSB7XG5cdFx0LyogYWN0aXZhdGlvbiByZXF1aXJlcyBwcmVwYXJhdGlvbiAqL1xuXHRcdGNvbnN0IHNCYXRjaEdyb3VwID0gXCIkYXV0b1wiO1xuXHRcdC8vd2hlbiB0aGVyZSBhcmUgcGVuZGluZyBjaGFuZ2VzIHRoZXJlIHdpbGwgYmUgYSBwYXRjaCByZXF1ZXN0IG1lcmdlZCB0b2dldGhlciB3aXRoIHRoZSBkcmFmdFByZXBhcmUgYW5kIGRyYWZ0QWNpdmF0ZS5cblx0XHQvL1RoZSBwYXRjaCBjaGFuZ2VzIHRoZSBFdGFnLCB0aGVyZm9yZSB0aGUgcHJlcGFyZSBuZWVkcyB0byBpZ25vcmUgRXRhZ3Ncblx0XHRjb25zdCBpZ25vcmVFdGFnOiBib29sZWFuID0gb0NvbnRleHQuZ2V0TW9kZWwoKS5oYXNQZW5kaW5nQ2hhbmdlcyhcIiRhdXRvXCIpID8gdHJ1ZSA6IGZhbHNlO1xuXHRcdC8vIHdlIHVzZSB0aGUgc2FtZSBiYXRjaEdyb3VwIHRvIGZvcmNlIHByZXBhcmUgYW5kIGFjdGl2YXRlIGluIGEgc2FtZSBiYXRjaCBidXQgd2l0aCBkaWZmZXJlbnQgY2hhbmdlc2V0XG5cdFx0Y29uc3Qgb1ByZXBhcmVQcm9taXNlID0gZHJhZnQuZXhlY3V0ZURyYWZ0UHJlcGFyYXRpb25BY3Rpb24ob0NvbnRleHQsIHNCYXRjaEdyb3VwLCB1bmRlZmluZWQsIGlnbm9yZUV0YWcpO1xuXHRcdG9Db250ZXh0LmdldE1vZGVsKCkuc3VibWl0QmF0Y2goc0JhdGNoR3JvdXApO1xuXHRcdGNvbnN0IG9BY3RpdmF0ZVByb21pc2UgPSBkcmFmdC5leGVjdXRlRHJhZnRBY3RpdmF0aW9uQWN0aW9uKFxuXHRcdFx0b0NvbnRleHQsXG5cdFx0XHRvQXBwQ29tcG9uZW50LFxuXHRcdFx0bWVzc2FnZUhhbmRsZXIsXG5cdFx0XHRzQmF0Y2hHcm91cCxcblx0XHRcdG9QcmVwYXJlUHJvbWlzZSxcblx0XHRcdG1QYXJhbWV0ZXJzLnJlc291cmNlTW9kZWxcblx0XHQpO1xuXG5cdFx0Y29uc3QgdmFsdWVzID0gYXdhaXQgUHJvbWlzZS5hbGwoW29QcmVwYXJlUHJvbWlzZSwgb0FjdGl2YXRlUHJvbWlzZV0pO1xuXHRcdG9BY3RpdmVEb2N1bWVudENvbnRleHQgPSB2YWx1ZXNbMV07XG5cdH1cblx0cmV0dXJuIG1QYXJhbS5mbkFmdGVyQWN0aXZhdGVEb2N1bWVudCA/IG1QYXJhbS5mbkFmdGVyQWN0aXZhdGVEb2N1bWVudChvQ29udGV4dCwgb0FjdGl2ZURvY3VtZW50Q29udGV4dCkgOiBvQWN0aXZlRG9jdW1lbnRDb250ZXh0O1xufVxuXG4vKipcbiAqIERpc3BsYXkgdGhlIGNvbmZpcm1hdGlvbiBkaWFsb2cgYm94IGFmdGVyIHByZXNzaW5nIHRoZSBlZGl0IGJ1dHRvbiBvZiBhbiBvYmplY3QgcGFnZSB3aXRoIHVuc2F2ZWQgY2hhbmdlcy5cbiAqIEBwYXJhbSBzVW5zYXZlZENoYW5nZXNNc2cgRGlhbG9nIGJveCBtZXNzYWdlIGluZm9ybWluZyB0aGUgdXNlciB0aGF0IGlmIGhlIHN0YXJ0cyBlZGl0aW5nLCB0aGUgcHJldmlvdXMgdW5zYXZlZCBjaGFuZ2VzIHdpbGwgYmUgbG9zdFxuICogQHBhcmFtIG9Db250ZXh0IENvbnRleHQgb2YgdGhlIGFjdGl2ZSBkb2N1bWVudCBmb3IgdGhlIG5ldyBkcmFmdFxuICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlc1xuICovXG5hc3luYyBmdW5jdGlvbiBzaG93RWRpdENvbmZpcm1hdGlvbk1lc3NhZ2VCb3goc1Vuc2F2ZWRDaGFuZ2VzTXNnOiBzdHJpbmcsIG9Db250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTxib29sZWFuPiB7XG5cdGNvbnN0IGxvY2FsSTE4blJlZiA9IExpYnJhcnkuZ2V0UmVzb3VyY2VCdW5kbGVGb3IoXCJzYXAuZmUuY29yZVwiKSE7XG5cdHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZTogKHZhbHVlOiBib29sZWFuKSA9PiB2b2lkLCByZWplY3Q6IChyZWFzb24/OiB1bmtub3duKSA9PiB2b2lkKSB7XG5cdFx0Y29uc3Qgb0RpYWxvZyA9IG5ldyBEaWFsb2coe1xuXHRcdFx0dGl0bGU6IGxvY2FsSTE4blJlZi5nZXRUZXh0KFwiQ19NRVNTQUdFX0hBTkRMSU5HX1NBUEZFX0VSUk9SX01FU1NBR0VTX1BBR0VfVElUTEVfV0FSTklOR1wiKSxcblx0XHRcdHN0YXRlOiBcIldhcm5pbmdcIixcblx0XHRcdGNvbnRlbnQ6IG5ldyBUZXh0KHtcblx0XHRcdFx0dGV4dDogc1Vuc2F2ZWRDaGFuZ2VzTXNnXG5cdFx0XHR9KSxcblx0XHRcdGJlZ2luQnV0dG9uOiBuZXcgQnV0dG9uKHtcblx0XHRcdFx0dGV4dDogbG9jYWxJMThuUmVmLmdldFRleHQoXCJDX0NPTU1PTl9PQkpFQ1RfUEFHRV9FRElUXCIpLFxuXHRcdFx0XHR0eXBlOiBcIkVtcGhhc2l6ZWRcIixcblx0XHRcdFx0cHJlc3M6IGZ1bmN0aW9uICgpOiB2b2lkIHtcblx0XHRcdFx0XHRvRGlhbG9nLmNsb3NlKCk7XG5cdFx0XHRcdFx0cmVzb2x2ZSh0cnVlKTtcblx0XHRcdFx0fVxuXHRcdFx0fSksXG5cdFx0XHRlbmRCdXR0b246IG5ldyBCdXR0b24oe1xuXHRcdFx0XHR0ZXh0OiBsb2NhbEkxOG5SZWYuZ2V0VGV4dChcIkNfQ09NTU9OX09CSkVDVF9QQUdFX0NBTkNFTFwiKSxcblx0XHRcdFx0cHJlc3M6IGZ1bmN0aW9uICgpOiB2b2lkIHtcblx0XHRcdFx0XHRvRGlhbG9nLmNsb3NlKCk7XG5cdFx0XHRcdFx0cmVqZWN0KGBEcmFmdCBjcmVhdGlvbiBhYm9ydGVkIGZvciBkb2N1bWVudDogJHtvQ29udGV4dC5nZXRQYXRoKCl9YCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pLFxuXHRcdFx0YWZ0ZXJDbG9zZTogZnVuY3Rpb24gKCk6IHZvaWQge1xuXHRcdFx0XHRvRGlhbG9nLmRlc3Ryb3koKTtcblx0XHRcdH1cblx0XHR9KTtcblx0XHRvRGlhbG9nLmFkZFN0eWxlQ2xhc3MoXCJzYXBVaUNvbnRlbnRQYWRkaW5nXCIpO1xuXHRcdG9EaWFsb2cub3BlbigpO1xuXHR9KTtcbn1cblxuLyoqXG4gKiBIVFRQIFBPU1QgY2FsbCB3aGVuIERyYWZ0QWN0aW9uIGlzIHByZXNlbnQgZm9yIERyYWZ0IERlbGV0ZTsgSFRUUCBERUxFVEUgY2FsbCB3aGVuIHRoZXJlIGlzIG5vIERyYWZ0QWN0aW9uXG4gKiBhbmQgQWN0aXZlIEluc3RhbmNlIGFsd2F5cyB1c2VzIERFTEVURS5cbiAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IG9mIHRoZSBkb2N1bWVudCB0byBiZSBkaXNjYXJkZWRcbiAqIEBwYXJhbSBtZXNzYWdlSGFuZGxlciBUaGUgbWVzc2FnZSBoYW5kbGVyIGNvbnRyb2xsZXIgZXh0ZW5zaW9uXG4gKiBAcGFyYW0gb0FwcENvbXBvbmVudCBDb250ZXh0IG9mIHRoZSBkb2N1bWVudCB0byBiZSBkaXNjYXJkZWRcbiAqIEBwYXJhbSBiRW5hYmxlU3RyaWN0SGFuZGxpbmdcbiAqIEByZXR1cm5zIEEgUHJvbWlzZSByZXNvbHZlZCB3aGVuIHRoZSBjb250ZXh0IGlzIGRlbGV0ZWRcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZGVsZXRlRHJhZnQoXG5cdG9Db250ZXh0OiBDb250ZXh0LFxuXHRtZXNzYWdlSGFuZGxlcjogTWVzc2FnZUhhbmRsZXIsXG5cdG9BcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCxcblx0YkVuYWJsZVN0cmljdEhhbmRsaW5nPzogYm9vbGVhblxuKTogUHJvbWlzZTx2b2lkPiB7XG5cdGlmIChvQ29udGV4dC5pc1RyYW5zaWVudCgpKSB7XG5cdFx0Ly8gVHJhbnNpZW50IGNvbnRleHRzIChlLmcuIHdoZW4gdHJ5aW5nIHRvIGRlbGV0ZSBhIGNvbnRleHQgd2hpY2ggY291bGRuJ3QgYmUgY3JlYXRlZCBiZWNhdXNlIG9mIGFuIGVycm9yKSBjYW4gYmUgZGVsZXRlZCBpbW1lZGlhdGVseVxuXHRcdHJldHVybiBvQ29udGV4dC5kZWxldGUoKTtcblx0fVxuXHRjb25zdCBzRGlzY2FyZEFjdGlvbiA9IGdldEFjdGlvbk5hbWUob0NvbnRleHQsIGRyYWZ0T3BlcmF0aW9ucy5ESVNDQVJEKTtcblx0Y29uc3QgYklzQWN0aXZlRW50aXR5ID0gb0NvbnRleHQuZ2V0T2JqZWN0KCkuSXNBY3RpdmVFbnRpdHk7XG5cblx0aWYgKGJJc0FjdGl2ZUVudGl0eSB8fCAoIWJJc0FjdGl2ZUVudGl0eSAmJiAhc0Rpc2NhcmRBY3Rpb24pKSB7XG5cdFx0Ly9Vc2UgRGVsZXRlIGluIGNhc2Ugb2YgYWN0aXZlIGVudGl0eSBhbmQgbm8gZGlzY2FyZCBhY3Rpb24gYXZhaWxhYmxlIGZvciBkcmFmdFxuXHRcdGlmIChvQ29udGV4dC5oYXNQZW5kaW5nQ2hhbmdlcygpICYmICFvQ29udGV4dC5pc0luYWN0aXZlKCkpIHtcblx0XHRcdGF3YWl0IG9Db250ZXh0LmdldEJpbmRpbmcoKS5yZXNldENoYW5nZXMoKTtcblx0XHRcdHJldHVybiBvQ29udGV4dC5kZWxldGUoKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gV2hlbiBjYW5jZWxsaW5nIGFuIGVkaXQgZHJhZnQgcm9vdCBub2RlLCB1c2UgbW9kZWwuZGVsZXRlIGluc3RlYWQgb2YgY29udGV4dC5kZWxldGUsIHRvIG9ubHkgc2VuZCBkZWxldGlvbiB0byBiYWNrZW5kLFxuXHRcdFx0Ly8gYnV0IGtlZXAgY29udGV4dCBhbGl2ZSAoaW5jbHVkaW5nIGJpbmRpbmdzKS4gVGh1cywgd2UgY2FuIGVuc3VyZSBzZWFtbGVzcyB0cmFuc2lzdGlvbiBmcm9tIGRyYWZ0IHRvIGFjdGl2ZSBpbnN0YW5jZVxuXHRcdFx0Ly8gKHdpdGhvdXQgaW50ZXJtZWRpYXRlIHVuZGVmaW5lZCBiaW5kaW5ncyBlLmcuIGxlYWRpbmcgdG8gZmxpY2tlcmluZykuIFRoaXMgZG9lc24ndCB3b3JrIGluIGNhc2Ugb2YgRkNMIGFwcHMsIGFzXG5cdFx0XHQvLyBtb2RlbC5kZWxldGUgZG9lc24ndCBjbGVhbiB1cCB0aGUgcGFyZW50IGxpc3RCaW5kaW5nIHByb3Blcmx5LCBsZWFkaW5nIHRvIGluY29ycmVjdCBPRGF0YSByZXF1ZXN0cy5cblx0XHRcdC8vIEluIG90aGVyIGNhc2VzIChkZWxldGluZyBhY3RpdmUsIGRpc2NhcmRpbmcgY3JlYXRlIGRyYWZ0IG9yIGRpc2NhcmRpbmcgZHJhZnQgbm9kZSksIHN0YXkgd2l0aCBjb250ZXh0LmRlbGV0ZS5cblx0XHRcdC8vIFdoZW4gY2FuY2VsbGluZyBhIGNyZWF0ZSBkcmFmdCwgcGFnZSBpcyBjbG9zZWQsIHRodXMgdGhlIHByb2JsZW0gb2YgZmxpY2tlcmluZyBjYW5ub3Qgb2NjdXIuXG5cdFx0XHQvLyBJbiBjYXNlIG9mIGRpc2NhcmRpbmcgYSBkcmFmdCBub2RlLCB0aGVvcmV0aWNhbGx5IHRoZSBzYW1lIHByb2JsZW0gY291bGRcblx0XHRcdC8vIG9jY3VyLCBidXQgbmVlZHMgcXVpdGUgc3BlY2lmaWMgbW9kZWxsaW5nIChidXR0b24gdmlzaWJpbGl0eSBvbiBpdGVtIGxldmVsIGJvdW5kIGFnYWluc3Qgc2VydmljZSBwcm9wZXJ0eSBpbiBhbiBGQ0wgYXBwKVxuXHRcdFx0Ly8gYW5kIGFjdGluZyAobG9va2luZyBhdCBidXR0b24gb24gdGhpcmQgY29sdW1uIHdoaWxlIGRpc2NhcmRpbmcgb24gMm5kIGNvbHVtbikuIEN1cnJlbnRseSwgbW9kZWwgc2VlbXMgbm90IHRvIGJlIHByZXBhcmVkXG5cdFx0XHQvLyBmb3IgdGhhdCBjYXNlLCB0aHVzIGR1ZSB0byB0aGUgbWluaW1hbCBpbXBhY3QgKG9ubHkgaW50ZXJtZWRpYXRlIHZpc3VhbCBzdGF0ZSksIGFjY2VwdGluZyB0aGlzIGZvciB0aGUgdGltZSBiZWluZy5cblx0XHRcdHJldHVybiAhb0FwcENvbXBvbmVudC5faXNGY2xFbmFibGVkKCkgJiZcblx0XHRcdFx0IW9Db250ZXh0LmdldFByb3BlcnR5KFwiSXNBY3RpdmVFbnRpdHlcIikgJiZcblx0XHRcdFx0TW9kZWxIZWxwZXIuaXNEcmFmdFJvb3QoXG5cdFx0XHRcdFx0Z2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzKG9Db250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCkuZ2V0TWV0YUNvbnRleHQob0NvbnRleHQuZ2V0UGF0aCgpKSk/LnRhcmdldEVudGl0eVNldFxuXHRcdFx0XHQpICYmXG5cdFx0XHRcdG9Db250ZXh0LmdldFByb3BlcnR5KFwiSGFzQWN0aXZlRW50aXR5XCIpXG5cdFx0XHRcdD8gb0NvbnRleHQuZ2V0TW9kZWwoKS5kZWxldGUob0NvbnRleHQpXG5cdFx0XHRcdDogb0NvbnRleHQuZGVsZXRlKCk7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdC8vVXNlIERpc2NhcmQgUG9zdCBBY3Rpb24gaWYgaXQgaXMgYSBkcmFmdCBlbnRpdHkgYW5kIGRpc2NhcmQgYWN0aW9uIGV4aXN0c1xuXHRcdGF3YWl0IGV4ZWN1dGVEcmFmdERpc2NhcmRBY3Rpb24ob0NvbnRleHQsIG1lc3NhZ2VIYW5kbGVyLCBvQXBwQ29tcG9uZW50LCBiRW5hYmxlU3RyaWN0SGFuZGxpbmcpO1xuXHR9XG59XG5cbmNvbnN0IGRyYWZ0ID0ge1xuXHRjcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudDogY3JlYXRlRHJhZnRGcm9tQWN0aXZlRG9jdW1lbnQsXG5cdGFjdGl2YXRlRG9jdW1lbnQ6IGFjdGl2YXRlRG9jdW1lbnQsXG5cdGRlbGV0ZURyYWZ0OiBkZWxldGVEcmFmdCxcblx0ZXhlY3V0ZURyYWZ0RWRpdEFjdGlvbjogZXhlY3V0ZURyYWZ0RWRpdEFjdGlvbixcblx0ZXhlY3V0ZURyYWZ0VmFsaWRhdGlvbjogZXhlY3V0ZURyYWZ0VmFsaWRhdGlvbixcblx0ZXhlY3V0ZURyYWZ0UHJlcGFyYXRpb25BY3Rpb246IGV4ZWN1dGVEcmFmdFByZXBhcmF0aW9uQWN0aW9uLFxuXHRleGVjdXRlRHJhZnRBY3RpdmF0aW9uQWN0aW9uOiBleGVjdXRlRHJhZnRBY3RpdmF0aW9uQWN0aW9uLFxuXHRoYXNQcmVwYXJlQWN0aW9uOiBoYXNQcmVwYXJlQWN0aW9uLFxuXHRjb21wdXRlU2libGluZ0luZm9ybWF0aW9uOiBjb21wdXRlU2libGluZ0luZm9ybWF0aW9uLFxuXHRwcm9jZXNzRGF0YUxvc3NPckRyYWZ0RGlzY2FyZENvbmZpcm1hdGlvbjogZHJhZnREYXRhTG9zc1BvcHVwLnByb2Nlc3NEYXRhTG9zc09yRHJhZnREaXNjYXJkQ29uZmlybWF0aW9uLFxuXHRzaWxlbnRseUtlZXBEcmFmdE9uRm9yd2FyZE5hdmlnYXRpb246IGRyYWZ0RGF0YUxvc3NQb3B1cC5zaWxlbnRseUtlZXBEcmFmdE9uRm9yd2FyZE5hdmlnYXRpb24sXG5cdGNyZWF0ZU9wZXJhdGlvbjogY3JlYXRlT3BlcmF0aW9uLFxuXHRleGVjdXRlRHJhZnREaXNjYXJkQWN0aW9uOiBleGVjdXRlRHJhZnREaXNjYXJkQWN0aW9uLFxuXHROYXZpZ2F0aW9uVHlwZTogZHJhZnREYXRhTG9zc1BvcHVwLk5hdmlnYXRpb25UeXBlLFxuXHRnZXRBY3Rpb25OYW1lOiBnZXRBY3Rpb25OYW1lLFxuXHRzaG93RWRpdENvbmZpcm1hdGlvbk1lc3NhZ2VCb3g6IHNob3dFZGl0Q29uZmlybWF0aW9uTWVzc2FnZUJveFxufTtcblxuZXhwb3J0IGRlZmF1bHQgZHJhZnQ7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0VBdUZBO0VBQ0EsTUFBTUEsZUFBZSxHQUFHO0lBQ3ZCQyxJQUFJLEVBQUUsWUFBWTtJQUNsQkMsVUFBVSxFQUFFLGtCQUFrQjtJQUM5QkMsT0FBTyxFQUFFLGVBQWU7SUFDeEJDLE9BQU8sRUFBRTtFQUNWLENBQUM7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
718
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJkcmFmdE9wZXJhdGlvbnMiLCJFRElUIiwiQUNUSVZBVElPTiIsIkRJU0NBUkQiLCJQUkVQQVJFIiwiZ2V0QWN0aW9uTmFtZSIsIm9Db250ZXh0Iiwic09wZXJhdGlvbiIsIm9Nb2RlbCIsImdldE1vZGVsIiwib01ldGFNb2RlbCIsImdldE1ldGFNb2RlbCIsInNFbnRpdHlTZXRQYXRoIiwiZ2V0TWV0YVBhdGgiLCJnZXRQYXRoIiwiZ2V0T2JqZWN0IiwiY3JlYXRlT3BlcmF0aW9uIiwib09wdGlvbnMiLCJzT3BlcmF0aW9uTmFtZSIsImJpbmRDb250ZXh0IiwiZ2V0Q29udmVydGVkQWN0aW9uIiwiY29udGV4dCIsIm9wZXJhdGlvbiIsIm9wZXJhdGlvbk5hbWUiLCJtZXRhTW9kZWwiLCJhY3Rpb25QYXRoIiwiYm91bmRBY3Rpb24iLCJjcmVhdGVCaW5kaW5nQ29udGV4dCIsImNvbnZlcnRUeXBlcyIsInJlc29sdmVQYXRoIiwidGFyZ2V0IiwiZ2V0UmV0dXJuVHlwZSIsImhhc1ByZXBhcmVBY3Rpb24iLCJleGVjdXRlRHJhZnRFZGl0QWN0aW9uIiwiYlByZXNlcnZlQ2hhbmdlcyIsIm9WaWV3IiwiZ3JvdXBJZCIsIm1lc3NhZ2VIYW5kbGVyIiwib3ZlcndyaXRlQ2hhbmdlIiwiY29udmVydGVkQWN0aW9uIiwiT3BlcmF0aW9uIiwiQ29tbW9uVXRpbHMiLCJnZXRBcHBDb21wb25lbnQiLCJjb250ZXh0cyIsImxhYmVsIiwiZ2V0UmVzb3VyY2VNb2RlbCIsImdldFRleHQiLCJiaW5kaW5nUGFyYW1ldGVycyIsIiQkaW5oZXJpdEV4cGFuZFNlbGVjdCIsIiQkdXBkYXRlR3JvdXBJZCIsInNraXBNZXNzYWdlcyIsIm9EYXRhUHJvcGVydGllcyIsImRpc2FibGVTaWRlRWZmZWN0cyIsImlnbm9yZUVUYWciLCJpc0VtcHR5T2JqZWN0IiwicmVwbGFjZVdpdGhSVkMiLCJnZXRCaW5kaW5nIiwiaXNBIiwiZGVmZXJyZWRTdWJtaXQiLCJzZXREZWZhdWx0UGFyYW1ldGVyc1ZhbHVlcyIsIlByZXNlcnZlQ2hhbmdlcyIsInJlc3VsdCIsImV4ZWN1dGUiLCJzdGF0dXMiLCJtb2RpZmllZEVycm9yIiwiRXJyb3IiLCJyZWFzb24iLCJ2YWx1ZSIsInJldHVybmVkQ29udGV4dCIsImV4ZWN1dGVEcmFmdFZhbGlkYXRpb24iLCJhcHBDb21wb25lbnQiLCJNb2RlbEhlbHBlciIsImdldE1lc3NhZ2VzUGF0aCIsImRyYWZ0IiwiaXNLZWVwQWxpdmUiLCJyZXF1ZXN0T2JqZWN0IiwiZXhlY3V0ZURyYWZ0UHJlcGFyYXRpb25BY3Rpb24iLCJnZXRVcGRhdGVHcm91cElkIiwicmVxdWVzdE1lc3NhZ2VzIiwiZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlIiwiZXJyb3IiLCJMb2ciLCJ1bmRlZmluZWQiLCJleGVjdXRlRHJhZnRBY3RpdmF0aW9uQWN0aW9uIiwib0FwcENvbXBvbmVudCIsInNHcm91cElkIiwib1ByZXBhcmVQcm9taXNlIiwicmVzb3VyY2VNb2RlbCIsImlzU3RhbmRhcmRTYXZlIiwiYkhhc1ByZXBhcmVBY3Rpb24iLCJiSWdub3JlRXRhZyIsImdldFByb3BlcnR5IiwiZSIsInByZXBhcmVPcGVyYXRpb24iLCJkZXN0cm95IiwiY2xlYXIiLCJhY3Rpb25OYW1lIiwib1NpZGVFZmZlY3RzU2VydmljZSIsIm9CaW5kaW5nUGFyYW1ldGVycyIsImdldE9EYXRhQWN0aW9uU2lkZUVmZmVjdHMiLCJhVGFyZ2V0UGF0aHMiLCJwYXRoRXhwcmVzc2lvbnMiLCJsZW5ndGgiLCJyZXF1ZXN0U2lkZUVmZmVjdHMiLCJvRXJyb3IiLCJnZXRNZXNzYWdlUGF0aEZvclByZXBhcmUiLCJnZXRNZXNzYWdlUGF0aEZvckNvbnRleHQiLCJtZXRhQ29udGV4dCIsImdldE1ldGFDb250ZXh0IiwiY29udmVydGVkQ29udGV4dCIsImdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyIsIm1lc3NhZ2VzIiwidGFyZ2V0RW50aXR5VHlwZSIsImFubm90YXRpb25zIiwiQ29tbW9uIiwiTWVzc2FnZXMiLCJpc1BhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbiIsInBhdGgiLCJiTWVzc2FnZXMiLCJzTWVzc2FnZXNQYXRoIiwib09wZXJhdGlvbiIsIiRzZWxlY3QiLCJzZXRQYXJhbWV0ZXIiLCJnZXRHcm91cElkIiwiaW52b2tlIiwidGhlbiIsImNhdGNoIiwicmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzIiwiYXJndW1lbnRzIiwiZGF0YSIsIm1lc3NhZ2VIYW5kbGluZyIsInJlbW92ZVVuYm91bmRUcmFuc2l0aW9uTWVzc2FnZXMiLCJyZW1vdmVCb3VuZFRyYW5zaXRpb25NZXNzYWdlcyIsImV4ZWN1dGVEcmFmdERpc2NhcmRBY3Rpb24iLCJiRW5hYmxlU3RyaWN0SGFuZGxpbmciLCJkaXNhYmxlU3RyaWN0SGFuZGxpbmciLCJjb21wdXRlU2libGluZ0luZm9ybWF0aW9uIiwicm9vdEN1cnJlbnRDb250ZXh0IiwicmlnaHRtb3N0Q3VycmVudENvbnRleHQiLCJyb290Q29udGV4dEluZm8iLCJjcmVhdGVLZWVwQWxpdmVDb250ZXh0Iiwic3RhcnRzV2l0aCIsIm1vZGVsIiwiYWRkaXRpb25hbFBhdGgiLCJyZXBsYWNlIiwic2VnbWVudHMiLCJzdWJzdHJpbmciLCJzcGxpdCIsInVuc2hpZnQiLCJvbGRQYXRocyIsIm5ld1BhdGhzIiwiY3VycmVudFBhdGgiLCJwYXRocyIsInJvb3RTaWJsaW5nUGF0aFByb21pc2UiLCJzaGlmdCIsImNhbm9uaWNhbFBhdGhQcm9taXNlcyIsIm1hcCIsInNlZ21lbnQiLCJlbmRzV2l0aCIsInNpYmxpbmdDb250ZXh0IiwiJCRncm91cElkIiwiZ2V0Qm91bmRDb250ZXh0IiwicmVxdWVzdENhbm9uaWNhbFBhdGgiLCJQcm9taXNlIiwicmVzb2x2ZSIsImNhbm9uaWNhbFBhdGhzIiwiYWxsIiwic29tZSIsInJvb3RTaWJsaW5nUGF0aCIsInB1c2giLCJzaWJsaW5nUGF0aCIsImZvckVhY2giLCJjYW5vbmljYWxQYXRoIiwiaW5kZXgiLCJuYXZpZ2F0aW9uIiwia2V5cyIsInBhcmFtZXRlcnMiLCJtZXNzYWdlUGF0aCIsInRhcmdldENvbnRleHQiLCJnZXRLZWVwQWxpdmVDb250ZXh0IiwicGF0aE1hcHBpbmciLCJvbGRQYXRoIiwibmV3UGF0aCIsImNyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50IiwibVBhcmFtZXRlcnMiLCJ0cmFuc2FjdGlvbkRldGFpbHMiLCJtUGFyYW0iLCJiUnVuUHJlc2VydmVDaGFuZ2VzRmxvdyIsInJlc3BvbnNlIiwiZHJhZnREYXRhQ29udGV4dCIsImRyYWZ0QWRtaW5EYXRhIiwic0luZm8iLCJJblByb2Nlc3NCeVVzZXJEZXNjcmlwdGlvbiIsIkluUHJvY2Vzc0J5VXNlciIsInNFbnRpdHlTZXQiLCJnZXRWaWV3RGF0YSIsImVudGl0eVNldCIsInNMb2NrZWRCeVVzZXJNc2ciLCJNZXNzYWdlQm94IiwiQ3JlYXRlZEJ5VXNlckRlc2NyaXB0aW9uIiwiQ3JlYXRlZEJ5VXNlciIsInNVbnNhdmVkQ2hhbmdlc01zZyIsInNob3dFZGl0Q29uZmlybWF0aW9uTWVzc2FnZUJveCIsIm1lc3NhZ2UiLCJvRHJhZnRDb250ZXh0Iiwib1Jlc3BvbnNlIiwiaXNDb2xsYWJvcmF0aW9uRHJhZnRTdXBwb3J0ZWQiLCJzaWJsaW5nSW5mbyIsIl9pc0ZjbEVuYWJsZWQiLCJ3YWl0Rm9yQ29udGV4dFJlcXVlc3RlZCIsImV4aXN0aW5nRHJhZnRSZXVzZWQiLCJjYW5jZWxlZCIsInNFZGl0QWN0aW9uTmFtZSIsIm9TaWRlRWZmZWN0cyIsInRyaWdnZXJBY3Rpb25zIiwicmVxdWVzdFNpZGVFZmZlY3RzRm9yT0RhdGFBY3Rpb24iLCJhY3RpdmF0ZURvY3VtZW50IiwiYkV4ZWN1dGUiLCJmbkJlZm9yZUFjdGl2YXRlRG9jdW1lbnQiLCJvQWN0aXZlRG9jdW1lbnRDb250ZXh0Iiwic0JhdGNoR3JvdXAiLCJpZ25vcmVFdGFnIiwiaGFzUGVuZGluZ0NoYW5nZXMiLCJzdWJtaXRCYXRjaCIsIm9BY3RpdmF0ZVByb21pc2UiLCJ2YWx1ZXMiLCJmbkFmdGVyQWN0aXZhdGVEb2N1bWVudCIsImxvY2FsSTE4blJlZiIsIkxpYnJhcnkiLCJnZXRSZXNvdXJjZUJ1bmRsZUZvciIsInJlamVjdCIsIm9EaWFsb2ciLCJEaWFsb2ciLCJ0aXRsZSIsInN0YXRlIiwiY29udGVudCIsIlRleHQiLCJ0ZXh0IiwiYmVnaW5CdXR0b24iLCJCdXR0b24iLCJ0eXBlIiwicHJlc3MiLCJjbG9zZSIsImVuZEJ1dHRvbiIsImFmdGVyQ2xvc2UiLCJhZGRTdHlsZUNsYXNzIiwib3BlbiIsImRlbGV0ZURyYWZ0IiwiaXNUcmFuc2llbnQiLCJkZWxldGUiLCJzRGlzY2FyZEFjdGlvbiIsImJJc0FjdGl2ZUVudGl0eSIsIklzQWN0aXZlRW50aXR5IiwiaXNJbmFjdGl2ZSIsInJlc2V0Q2hhbmdlcyIsImlzRHJhZnRSb290IiwidGFyZ2V0RW50aXR5U2V0IiwicHJvY2Vzc0RhdGFMb3NzT3JEcmFmdERpc2NhcmRDb25maXJtYXRpb24iLCJkcmFmdERhdGFMb3NzUG9wdXAiLCJzaWxlbnRseUtlZXBEcmFmdE9uRm9yd2FyZE5hdmlnYXRpb24iLCJOYXZpZ2F0aW9uVHlwZSJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiZHJhZnQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBBY3Rpb24gYXMgRWRtQWN0aW9uIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG5pbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCBpc0VtcHR5T2JqZWN0IGZyb20gXCJzYXAvYmFzZS91dGlsL2lzRW1wdHlPYmplY3RcIjtcbmltcG9ydCB0eXBlIEFwcENvbXBvbmVudCBmcm9tIFwic2FwL2ZlL2NvcmUvQXBwQ29tcG9uZW50XCI7XG5pbXBvcnQgQ29tbW9uVXRpbHMgZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgdHlwZSBSZXNvdXJjZU1vZGVsIGZyb20gXCJzYXAvZmUvY29yZS9SZXNvdXJjZU1vZGVsXCI7XG5pbXBvcnQgZHJhZnREYXRhTG9zc1BvcHVwIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9lZGl0Rmxvdy9kcmFmdERhdGFMb3NzUG9wdXBcIjtcbmltcG9ydCBtZXNzYWdlSGFuZGxpbmcgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL21lc3NhZ2VIYW5kbGVyL21lc3NhZ2VIYW5kbGluZ1wiO1xuaW1wb3J0IHsgY29udmVydFR5cGVzLCBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9NZXRhTW9kZWxDb252ZXJ0ZXJcIjtcbmltcG9ydCB7IGdldFJlc291cmNlTW9kZWwgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9SZXNvdXJjZU1vZGVsSGVscGVyXCI7XG5pbXBvcnQgeyBpc1BhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbiB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1R5cGVHdWFyZHNcIjtcbmltcG9ydCB0eXBlIHsgU2lkZUVmZmVjdHNTZXJ2aWNlIH0gZnJvbSBcInNhcC9mZS9jb3JlL3NlcnZpY2VzL1NpZGVFZmZlY3RzU2VydmljZUZhY3RvcnlcIjtcbmltcG9ydCBCdXR0b24gZnJvbSBcInNhcC9tL0J1dHRvblwiO1xuaW1wb3J0IERpYWxvZyBmcm9tIFwic2FwL20vRGlhbG9nXCI7XG5pbXBvcnQgTWVzc2FnZUJveCBmcm9tIFwic2FwL20vTWVzc2FnZUJveFwiO1xuaW1wb3J0IFRleHQgZnJvbSBcInNhcC9tL1RleHRcIjtcbmltcG9ydCBMaWJyYXJ5IGZyb20gXCJzYXAvdWkvY29yZS9MaWJcIjtcbmltcG9ydCB0eXBlIFZpZXcgZnJvbSBcInNhcC91aS9jb3JlL212Yy9WaWV3XCI7XG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQ29udGV4dFwiO1xuaW1wb3J0IHR5cGUgeyBDb250ZXh0RXJyb3JUeXBlIH0gZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgdHlwZSBPRGF0YUNvbnRleHRCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFDb250ZXh0QmluZGluZ1wiO1xuaW1wb3J0IHR5cGUgeyBGRVZpZXcgfSBmcm9tIFwiLi4vLi4vQmFzZUNvbnRyb2xsZXJcIjtcbmltcG9ydCBNb2RlbEhlbHBlciBmcm9tIFwiLi4vLi4vaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0IHR5cGUgTWVzc2FnZUhhbmRsZXIgZnJvbSBcIi4uL01lc3NhZ2VIYW5kbGVyXCI7XG5pbXBvcnQgT3BlcmF0aW9uIGZyb20gXCIuL29wZXJhdGlvbnMvT3BlcmF0aW9uXCI7XG5cbmV4cG9ydCB0eXBlIFNpYmxpbmdJbmZvcm1hdGlvbiA9IHtcblx0dGFyZ2V0Q29udGV4dDogQ29udGV4dDtcblx0cGF0aE1hcHBpbmc6IHsgb2xkUGF0aDogc3RyaW5nOyBuZXdQYXRoOiBzdHJpbmcgfVtdO1xufTtcblxuZXhwb3J0IHR5cGUgUm9vdENvbnRleHRJbmZvID0ge1xuXHRyb290U2libGluZ1BhdGhQcm9taXNlOiBQcm9taXNlPENvbnRleHQgfCB1bmRlZmluZWQ+O1xufTtcblxuZXhwb3J0IHR5cGUgQmluZENvbnRleHRQYXJhbWV0ZXJzID0ge1xuXHQvKipcblx0ICogVGhlIHZhbHVlIGZvciB0aGUgXCI1LjEuMiBTeXN0ZW0gUXVlcnkgT3B0aW9uICRleHBhbmRcIiBvciBhbiBvYmplY3Qgd2hpY2ggZGV0ZXJtaW5lcyB0aGF0IHZhbHVlLiBUaGUgb2JqZWN0XG5cdCAqIGlzIGEgbWFwIGZyb20gZXhwYW5kIHBhdGggdG8gZXhwYW5kIG9wdGlvbnMsIHdoZXJlIHRoZSBvcHRpb25zIGFyZSBhZ2FpbiBtYXBzIG9mIHN5c3RlbSBxdWVyeSBvcHRpb25zLFxuXHQgKiB0eXBpY2FsbHkgd2l0aCBzdHJpbmcgdmFsdWVzLiAkY291bnQgY2FuIGFsc28gYmUgZ2l2ZW4gYXMgYSBgYm9vbGVhbmAgdmFsdWUsICRleHBhbmQgY2FuIHJlY3Vyc2l2ZWx5XG5cdCAqIGJlIGdpdmVuIGFzIGEgbWFwLCAkbGV2ZWxzIGNhbiBhbHNvIGJlIGdpdmVuIGFzIGEgYG51bWJlcmAgdmFsdWUsIGFuZCAkc2VsZWN0IGNhbiBhbHNvIGJlIGdpdmVuIGFzIGFuXG5cdCAqIGFycmF5IChidXQgd2l0aG91dCBuYXZpZ2F0aW9uIHBhdGhzKS4gQW4gZW1wdHkgbWFwIGNhbiBhbHNvIGJlIGdpdmVuIGFzIGBudWxsYCBvciBgdHJ1ZWAuIFNlZSBhbHNvIHtAbGluayBodHRwczovL3VpNS5zYXAuY29tLyMvdG9waWMvMWFiNGY2MmRlNmFiNDY3MDk2YTJhOThiMzYzYTEzNzMgUGFyYW1ldGVyc30uXG5cdCAqL1xuXHQkZXhwYW5kPzogc3RyaW5nIHwgb2JqZWN0O1xuXHQvKipcblx0ICogQSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvciBhbiBhcnJheSBvZiBpdGVtcyB3aGljaCBkZXRlcm1pbmUgdGhlIHZhbHVlIGZvciB0aGUgXCI1LjEuMyBTeXN0ZW0gUXVlcnkgT3B0aW9uXG5cdCAqICRzZWxlY3RcIi4gU2luY2UgMS43NS4wLCB3aGVuIHVzaW5nIHRoZSBcImF1dG9FeHBhbmRTZWxlY3RcIiBtb2RlbCBwYXJhbWV0ZXIgKHNlZSB7QGxpbmsgc2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTW9kZWwjY29uc3RydWN0b3J9KSxcblx0ICogcGF0aHMgd2l0aCBuYXZpZ2F0aW9uIHByb3BlcnRpZXMgY2FuIGJlIGluY2x1ZGVkIGFuZCB3aWxsIGNvbnRyaWJ1dGUgdG8gdGhlIFwiNS4xLjIgU3lzdGVtIFF1ZXJ5IE9wdGlvblxuXHQgKiAkZXhwYW5kXCIuXG5cdCAqL1xuXHQkc2VsZWN0Pzogc3RyaW5nO1xuXHQvKipcblx0ICogV2hldGhlciBhIGJpbmRpbmcgcmVsYXRpdmUgdG8gYW4ge0BsaW5rIHNhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSB1c2VzIHRoZSBjYW5vbmljYWwgcGF0aCBjb21wdXRlZFxuXHQgKiBmcm9tIGl0cyBjb250ZXh0J3MgcGF0aCBmb3IgZGF0YSBzZXJ2aWNlIHJlcXVlc3RzOyBvbmx5IHRoZSB2YWx1ZSBgdHJ1ZWAgaXMgYWxsb3dlZC5cblx0ICovXG5cdCQkY2Fub25pY2FsUGF0aD86IGJvb2xlYW47XG5cdC8qKlxuXHQgKiBUaGUgZ3JvdXAgSUQgdG8gYmUgdXNlZCBmb3IgKipyZWFkKiogcmVxdWVzdHMgdHJpZ2dlcmVkIGJ5IHRoaXMgYmluZGluZzsgaWYgbm90IHNwZWNpZmllZCwgZWl0aGVyIHRoZVxuXHQgKiBwYXJlbnQgYmluZGluZydzIGdyb3VwIElEIChpZiB0aGUgYmluZGluZyBpcyByZWxhdGl2ZSkgb3IgdGhlIG1vZGVsJ3MgZ3JvdXAgSUQgaXMgdXNlZCwgc2VlIHtAbGluayBzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFNb2RlbCNjb25zdHJ1Y3Rvcn0uXG5cdCAqIFZhbGlkIHZhbHVlcyBhcmUgYHVuZGVmaW5lZGAsICckYXV0bycsICckYXV0by4qJywgJyRkaXJlY3QnIG9yIGFwcGxpY2F0aW9uIGdyb3VwIElEcyBhcyBzcGVjaWZpZWQgaW5cblx0ICoge0BsaW5rIHNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YU1vZGVsfS5cblx0ICovXG5cdCQkZ3JvdXBJZD86IHN0cmluZztcblx0LyoqXG5cdCAqIEZvciBvcGVyYXRpb24gYmluZGluZ3Mgb25seTogV2hldGhlciAkZXhwYW5kIGFuZCAkc2VsZWN0IGZyb20gdGhlIHBhcmVudCBiaW5kaW5nIGFyZSB1c2VkIGluIHRoZSByZXF1ZXN0XG5cdCAqIHNlbnQgb24ge0BsaW5rICNleGVjdXRlfS4gSWYgc2V0IHRvIGB0cnVlYCwgdGhlIGJpbmRpbmcgbXVzdCBub3Qgc2V0IHRoZSAkZXhwYW5kIGl0c2VsZiwgdGhlIG9wZXJhdGlvblxuXHQgKiBtdXN0IGJlIGJvdW5kLCBhbmQgdGhlIHJldHVybiB2YWx1ZSBhbmQgdGhlIGJpbmRpbmcgcGFyYW1ldGVyIG11c3QgYmVsb25nIHRvIHRoZSBzYW1lIGVudGl0eSBzZXQuXG5cdCAqL1xuXHQkJGluaGVyaXRFeHBhbmRTZWxlY3Q/OiBib29sZWFuO1xuXHQvKipcblx0ICogV2hldGhlciB0aGUgYmluZGluZyBhbHdheXMgdXNlcyBhbiBvd24gc2VydmljZSByZXF1ZXN0IHRvIHJlYWQgaXRzIGRhdGE7IG9ubHkgdGhlIHZhbHVlIGB0cnVlYCBpcyBhbGxvd2VkLlxuXHQgKi9cblx0JCRvd25SZXF1ZXN0PzogYm9vbGVhbjtcblx0LyoqXG5cdCAqIFdoZXRoZXIgaW1wbGljaXQgbG9hZGluZyBvZiBzaWRlIGVmZmVjdHMgdmlhIFBBVENIIHJlcXVlc3RzIGlzIHN3aXRjaGVkIG9mZjsgb25seSB0aGUgdmFsdWUgYHRydWVgIGlzXG5cdCAqIGFsbG93ZWQuIFRoaXMgc2V0cyB0aGUgcHJlZmVyZW5jZSBcInJldHVybj1taW5pbWFsXCIgYW5kIHJlcXVpcmVzIHRoZSBzZXJ2aWNlIHRvIHJldHVybiBhbiBFVGFnIGhlYWRlclxuXHQgKiBmb3IgXCIyMDQgTm8gQ29udGVudFwiIHJlc3BvbnNlcy4gSWYgbm90IHNwZWNpZmllZCwgdGhlIHZhbHVlIG9mIHRoZSBwYXJlbnQgYmluZGluZyBpcyB1c2VkLlxuXHQgKi9cblx0JCRwYXRjaFdpdGhvdXRTaWRlRWZmZWN0cz86IGJvb2xlYW47XG5cdC8qKlxuXHQgKiBUaGUgZ3JvdXAgSUQgdG8gYmUgdXNlZCBmb3IgKip1cGRhdGUqKiByZXF1ZXN0cyB0cmlnZ2VyZWQgYnkgdGhpcyBiaW5kaW5nOyBpZiBub3Qgc3BlY2lmaWVkLCBlaXRoZXIgdGhlXG5cdCAqIHBhcmVudCBiaW5kaW5nJ3MgdXBkYXRlIGdyb3VwIElEIChpZiB0aGUgYmluZGluZyBpcyByZWxhdGl2ZSkgb3IgdGhlIG1vZGVsJ3MgdXBkYXRlIGdyb3VwIElEIGlzIHVzZWQsXG5cdCAqIHNlZSB7QGxpbmsgc2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTW9kZWwjY29uc3RydWN0b3J9LiBGb3IgdmFsaWQgdmFsdWVzLCBzZWUgcGFyYW1ldGVyIFwiJCRncm91cElkXCIuXG5cdCAqL1xuXHQkJHVwZGF0ZUdyb3VwSWQ/OiBzdHJpbmc7XG59O1xuXG4vKiBDb25zdGFudHMgZm9yIGRyYWZ0IG9wZXJhdGlvbnMgKi9cbmNvbnN0IGRyYWZ0T3BlcmF0aW9ucyA9IHtcblx0RURJVDogXCJFZGl0QWN0aW9uXCIsXG5cdEFDVElWQVRJT046IFwiQWN0aXZhdGlvbkFjdGlvblwiLFxuXHRESVNDQVJEOiBcIkRpc2NhcmRBY3Rpb25cIixcblx0UFJFUEFSRTogXCJQcmVwYXJhdGlvbkFjdGlvblwiXG59O1xuXG4vKipcbiAqIFN0YXRpYyBmdW5jdGlvbnMgZm9yIHRoZSBkcmFmdCBwcm9ncmFtbWluZyBtb2RlbFxuICogQG5hbWVzcGFjZVxuICogQGV4cGVyaW1lbnRhbCBUaGlzIG1vZHVsZSBpcyBvbmx5IGZvciBleHBlcmltZW50YWwgdXNlISA8YnIvPjxiPlRoaXMgaXMgb25seSBhIFBPQyBhbmQgbWF5YmUgZGVsZXRlZDwvYj5cbiAqIEBzaW5jZSAxLjU0LjBcbiAqL1xuXG4vKipcbiAqIERldGVybWluZXMgdGhlIGFjdGlvbiBuYW1lIGZvciBhIGRyYWZ0IG9wZXJhdGlvbi5cbiAqIEBwYXJhbSBvQ29udGV4dCBUaGUgY29udGV4dCB0aGF0IHNob3VsZCBiZSBib3VuZCB0byB0aGUgb3BlcmF0aW9uXG4gKiBAcGFyYW0gc09wZXJhdGlvbiBUaGUgb3BlcmF0aW9uIG5hbWVcbiAqIEByZXR1cm5zIFRoZSBuYW1lIG9mIHRoZSBkcmFmdCBvcGVyYXRpb25cbiAqL1xuZnVuY3Rpb24gZ2V0QWN0aW9uTmFtZShvQ29udGV4dDogQ29udGV4dCwgc09wZXJhdGlvbjogc3RyaW5nKTogc3RyaW5nIHtcblx0Y29uc3Qgb01vZGVsID0gb0NvbnRleHQuZ2V0TW9kZWwoKSxcblx0XHRvTWV0YU1vZGVsID0gb01vZGVsLmdldE1ldGFNb2RlbCgpLFxuXHRcdHNFbnRpdHlTZXRQYXRoID0gb01ldGFNb2RlbC5nZXRNZXRhUGF0aChvQ29udGV4dC5nZXRQYXRoKCkpO1xuXG5cdHJldHVybiBvTWV0YU1vZGVsLmdldE9iamVjdChgJHtzRW50aXR5U2V0UGF0aH1AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRyYWZ0Um9vdC8ke3NPcGVyYXRpb259YCk7XG59XG4vKipcbiAqIENyZWF0ZXMgYW4gb3BlcmF0aW9uIGNvbnRleHQgYmluZGluZyBmb3IgdGhlIGdpdmVuIGNvbnRleHQgYW5kIG9wZXJhdGlvbi5cbiAqIEBwYXJhbSBvQ29udGV4dCBUaGUgY29udGV4dCB0aGF0IHNob3VsZCBiZSBib3VuZCB0byB0aGUgb3BlcmF0aW9uXG4gKiBAcGFyYW0gc09wZXJhdGlvbiBUaGUgb3BlcmF0aW9uIChhY3Rpb24gb3IgZnVuY3Rpb24gaW1wb3J0KVxuICogQHBhcmFtIG9PcHRpb25zIE9wdGlvbnMgdG8gY3JlYXRlIHRoZSBvcGVyYXRpb24gY29udGV4dFxuICogQHJldHVybnMgVGhlIGNvbnRleHQgYmluZGluZyBvZiB0aGUgYm91bmQgb3BlcmF0aW9uXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZU9wZXJhdGlvbihvQ29udGV4dDogQ29udGV4dCwgc09wZXJhdGlvbjogc3RyaW5nLCBvT3B0aW9ucz86IEJpbmRDb250ZXh0UGFyYW1ldGVycyk6IE9EYXRhQ29udGV4dEJpbmRpbmcge1xuXHRjb25zdCBzT3BlcmF0aW9uTmFtZSA9IGdldEFjdGlvbk5hbWUob0NvbnRleHQsIHNPcGVyYXRpb24pO1xuXG5cdHJldHVybiBvQ29udGV4dC5nZXRNb2RlbCgpLmJpbmRDb250ZXh0KGAke3NPcGVyYXRpb25OYW1lfSguLi4pYCwgb0NvbnRleHQsIG9PcHRpb25zKTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBjb252ZXJ0ZWQgYWN0aW9uIGZvciBhIGdpdmVuIGNvbnRleHQgYW5kIG9wZXJhdGlvbi5cbiAqIEBwYXJhbSBjb250ZXh0ICBUaGUgY29udGV4dCB0aGF0IHNob3VsZCBiZSBib3VuZCB0byB0aGUgb3BlcmF0aW9uXG4gKiBAcGFyYW0gb3BlcmF0aW9uIFRoZSBvcGVyYXRpb24gbmFtZVxuICogQHJldHVybnMgVGhlIGNvbnZlcnRlZCBhY3Rpb25cbiAqL1xuZnVuY3Rpb24gZ2V0Q29udmVydGVkQWN0aW9uKGNvbnRleHQ6IENvbnRleHQsIG9wZXJhdGlvbjogc3RyaW5nKTogRWRtQWN0aW9uIHwgdW5kZWZpbmVkIHtcblx0Y29uc3Qgb3BlcmF0aW9uTmFtZSA9IGdldEFjdGlvbk5hbWUoY29udGV4dCwgb3BlcmF0aW9uKTtcblx0Y29uc3QgbWV0YU1vZGVsID0gY29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpLFxuXHRcdGFjdGlvblBhdGggPSBgJHttZXRhTW9kZWwuZ2V0TWV0YVBhdGgoY29udGV4dC5nZXRQYXRoKCkpfS8ke29wZXJhdGlvbk5hbWV9YCxcblx0XHRib3VuZEFjdGlvbiA9IG1ldGFNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChhY3Rpb25QYXRoKSE7XG5cdHJldHVybiBjb252ZXJ0VHlwZXMobWV0YU1vZGVsKS5yZXNvbHZlUGF0aDxFZG1BY3Rpb24gfCB1bmRlZmluZWQ+KGJvdW5kQWN0aW9uLmdldFBhdGgoKSkudGFyZ2V0O1xufVxuXG4vKipcbiAqIERldGVybWluZXMgdGhlIHJldHVybiB0eXBlIGZvciBhIGRyYWZ0IG9wZXJhdGlvbi5cbiAqIEBwYXJhbSBvQ29udGV4dCBUaGUgY29udGV4dCB0aGF0IHNob3VsZCBiZSBib3VuZCB0byB0aGUgb3BlcmF0aW9uXG4gKiBAcGFyYW0gc09wZXJhdGlvbiBUaGUgb3BlcmF0aW9uIG5hbWVcbiAqIEByZXR1cm5zIFRoZSByZXR1cm4gdHlwZSBvZiB0aGUgZHJhZnQgb3BlcmF0aW9uXG4gKi9cbmZ1bmN0aW9uIGdldFJldHVyblR5cGUob0NvbnRleHQ6IENvbnRleHQsIHNPcGVyYXRpb246IHN0cmluZyk6IHVua25vd24ge1xuXHRjb25zdCBvTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpLFxuXHRcdG9NZXRhTW9kZWwgPSBvTW9kZWwuZ2V0TWV0YU1vZGVsKCksXG5cdFx0c0VudGl0eVNldFBhdGggPSBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKG9Db250ZXh0LmdldFBhdGgoKSk7XG5cblx0cmV0dXJuIG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NFbnRpdHlTZXRQYXRofUBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnRSb290LyR7c09wZXJhdGlvbn0vJFJldHVyblR5cGVgKTtcbn1cbi8qKlxuICogQ2hlY2sgaWYgb3B0aW9uYWwgZHJhZnQgcHJlcGFyZSBhY3Rpb24gZXhpc3RzLlxuICogQHBhcmFtIG9Db250ZXh0IFRoZSBjb250ZXh0IHRoYXQgc2hvdWxkIGJlIGJvdW5kIHRvIHRoZSBvcGVyYXRpb25cbiAqIEByZXR1cm5zIFRydWUgaWYgYSBhIHByZXBhcmUgYWN0aW9uIGV4aXN0c1xuICovXG5mdW5jdGlvbiBoYXNQcmVwYXJlQWN0aW9uKG9Db250ZXh0OiBDb250ZXh0KTogYm9vbGVhbiB7XG5cdHJldHVybiAhIWdldEFjdGlvbk5hbWUob0NvbnRleHQsIGRyYWZ0T3BlcmF0aW9ucy5QUkVQQVJFKTtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBkcmFmdCBmcm9tIGFuIGFjdGl2ZSBkb2N1bWVudC5cbiAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IGZvciB3aGljaCB0aGUgYWN0aW9uIHNob3VsZCBiZSBwZXJmb3JtZWRcbiAqIEBwYXJhbSBiUHJlc2VydmVDaGFuZ2VzIElmIHRydWUgLSBleGlzdGluZyBjaGFuZ2VzIGZyb20gYW5vdGhlciB1c2VyIHRoYXQgYXJlIG5vdCBsb2NrZWQgYXJlIHByZXNlcnZlZCBhbmQgYW4gZXJyb3IgaXMgc2VudCBmcm9tIHRoZSBiYWNrZW5kLCBvdGhlcndpc2UgZmFsc2UgLSBleGlzdGluZyBjaGFuZ2VzIGZyb20gYW5vdGhlciB1c2VyIHRoYXQgYXJlIG5vdCBsb2NrZWQgYXJlIG92ZXJ3cml0dGVuPC9saT5cbiAqIEBwYXJhbSBvVmlldyBJZiB0cnVlIC0gZXhpc3RpbmcgY2hhbmdlcyBmcm9tIGFub3RoZXJcbiAqIEBwYXJhbSBncm91cElkIFRoZSBiYXRjaCBncm91cElkIGZvciBwb3N0IGNhbGwgb2YgZWRpdCBhY3Rpb25cbiAqIEBwYXJhbSBtZXNzYWdlSGFuZGxlciAgVGhlIG1lc3NhZ2UgaGFuZGxlciBjb250cm9sbGVyIGV4dGVuc2lvblxuICogQHBhcmFtIG92ZXJ3cml0ZUNoYW5nZVxuICogQHJldHVybnMgUmVzb2x2ZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBjb250ZXh0IG9mIHRoZSBvcGVyYXRpb25cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZURyYWZ0RWRpdEFjdGlvbihcblx0b0NvbnRleHQ6IENvbnRleHQsXG5cdGJQcmVzZXJ2ZUNoYW5nZXM6IGJvb2xlYW4sXG5cdG9WaWV3OiBWaWV3LFxuXHRncm91cElkOiBzdHJpbmcsXG5cdG1lc3NhZ2VIYW5kbGVyOiBNZXNzYWdlSGFuZGxlcixcblx0b3ZlcndyaXRlQ2hhbmdlPzogYm9vbGVhblxuKTogUHJvbWlzZTxDb250ZXh0IHwgdW5kZWZpbmVkPiB7XG5cdC8vIElmIHRoZSBjb250ZXh0IGlzIG5vdCBsb2FkZWQgKGkuZS4gb0NvbnRleHQuZ2V0T2JqZWN0KCkgPT0gdW5kZWZpbmVkKSwgd2UgYXNzdW1lIGl0IGNvcnJlc3BvbmRzIHRvIGFuIGFjdGl2ZSBjb250ZXh0XG5cdC8vIFRoaXMgc2l0dWF0aW9uIGhhcHBlbnMgd2hlbiBvcGVuaW5nIGFuIE9QIGRpcmVjdGx5IGluIGVkaXQgbW9kZSAoSW50ZXJuYWxSb3V0aW5nLl9iaW5kUGFnZUZvckVkaXQpXG5cdGNvbnN0IGNvbnZlcnRlZEFjdGlvbiA9IGdldENvbnZlcnRlZEFjdGlvbihvQ29udGV4dCwgZHJhZnRPcGVyYXRpb25zLkVESVQpO1xuXHRpZiAoY29udmVydGVkQWN0aW9uKSB7XG5cdFx0Y29uc3Qgb3BlcmF0aW9uID0gbmV3IE9wZXJhdGlvbihDb21tb25VdGlscy5nZXRBcHBDb21wb25lbnQob1ZpZXcpLCBvQ29udGV4dC5nZXRNb2RlbCgpLCBjb252ZXJ0ZWRBY3Rpb24sIHtcblx0XHRcdG1lc3NhZ2VIYW5kbGVyOiBtZXNzYWdlSGFuZGxlcixcblx0XHRcdGNvbnRleHRzOiBbb0NvbnRleHRdLFxuXHRcdFx0bGFiZWw6IGdldFJlc291cmNlTW9kZWwob1ZpZXcpLmdldFRleHQoXCJDX0NPTU1PTl9PQkpFQ1RfUEFHRV9FRElUXCIpLFxuXHRcdFx0YmluZGluZ1BhcmFtZXRlcnM6IHsgJCRpbmhlcml0RXhwYW5kU2VsZWN0OiB0cnVlLCAkJHVwZGF0ZUdyb3VwSWQ6IFwiJGF1dG9cIiB9LFxuXHRcdFx0c2tpcE1lc3NhZ2VzOiB0cnVlLFxuXHRcdFx0b0RhdGFQcm9wZXJ0aWVzOiB7XG5cdFx0XHRcdGRpc2FibGVTaWRlRWZmZWN0czogdHJ1ZSxcblx0XHRcdFx0aWdub3JlRVRhZzogaXNFbXB0eU9iamVjdChvQ29udGV4dC5nZXRPYmplY3QoKSksIC8vIElmIHRoZSBjb250ZXh0IGhhcyBub3QgYmVlbiBsb2FkZWQgeWV0LCB3ZSBjYW4gaWdub3JlIHRoZSBFVGFnIChhcyBubyBwcmV2aW91cyBFVGFnIGlzIGF2YWlsYWJsZSlcblx0XHRcdFx0Z3JvdXBJZDogZ3JvdXBJZCxcblx0XHRcdFx0cmVwbGFjZVdpdGhSVkM6IG9Db250ZXh0LmdldEJpbmRpbmcoKS5pc0EoXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ1wiKSxcblx0XHRcdFx0ZGVmZXJyZWRTdWJtaXQ6IG92ZXJ3cml0ZUNoYW5nZSAhPT0gdHJ1ZSAvL1x0SWYgdGhlIGNvbnRleHQgaXMgY29taW5nIGZyb20gYSBsaXN0IGJpbmRpbmcgd2UgcGFzcyB0aGUgZmxhZyB0cnVlIHRvIHJlcGxhY2UgdGhlIGNvbnRleHQgYnkgdGhlIGFjdGl2ZSBvbmVcblx0XHRcdH1cblx0XHR9KTtcblx0XHRvcGVyYXRpb24uc2V0RGVmYXVsdFBhcmFtZXRlcnNWYWx1ZXMoeyBQcmVzZXJ2ZUNoYW5nZXM6IGJQcmVzZXJ2ZUNoYW5nZXMgfSk7XG5cdFx0Y29uc3QgcmVzdWx0ID0gYXdhaXQgb3BlcmF0aW9uLmV4ZWN1dGUoKTtcblx0XHRpZiAocmVzdWx0WzBdLnN0YXR1cyA9PT0gXCJyZWplY3RlZFwiKSB7XG5cdFx0XHRjb25zdCBtb2RpZmllZEVycm9yID0gbmV3IEVycm9yKHJlc3VsdFswXS5yZWFzb24pIGFzIEVycm9yICYgeyBzdGF0dXM/OiBudW1iZXIgfTtcblx0XHRcdC8vIHdlIG5lZWQgdG8gcGVyc2lzdCB0aGUgc3RhdHVzIGluIHRoZSBlcnJvciB0byBiZSBhYmxlIHRvIHNob3cgdGhlIGxvY2tlZCBieSBhbm90aGVyIHVzZXIgZGlhbG9nXG5cdFx0XHRtb2RpZmllZEVycm9yLnN0YXR1cyA9IHJlc3VsdFswXS5yZWFzb24uc3RhdHVzO1xuXHRcdFx0dGhyb3cgbW9kaWZpZWRFcnJvcjtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIHJlc3VsdFswXS52YWx1ZS5yZXR1cm5lZENvbnRleHQ7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdHRocm93IG5ldyBFcnJvcihcIlRoZSBlZGl0IGFjdGlvbiBub3QgZm91bmRcIik7XG5cdH1cbn1cblxuLyoqXG4gKiBFeGVjdXRlcyB0aGUgdmFsaWRhdGlvbiBvZiB0aGUgZHJhZnQuIFRoZSBQcmVwYXJlQWN0aW9uIGlzIHRyaWdnZXJlZCBpZiB0aGUgbWVzc2FnZXMgYXJlIGFubm90YXRlZCBhbmQgZW50aXR5U2V0IGdldHMgYSBQcmVwYXJhdGlvbkFjdGlvbiBhbm5vdGF0ZWQuXG4gKiBJZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzIGFuZCBvcGVyYXRpb24gZG9lc24ndCBnZXQgYSByZXR1cm4gdHlwZSAoUkFQIHN5c3RlbSkgdGhlIG1lc3NhZ2VzIGFyZSByZXF1ZXN0ZWQuXG4gKiBAcGFyYW0gY29udGV4dCBDb250ZXh0IGZvciB3aGljaCB0aGUgUHJlcGFyZUFjdGlvbiBzaG91bGQgYmUgcGVyZm9ybWVkXG4gKiBAcGFyYW0gYXBwQ29tcG9uZW50IFRoZSBBcHBDb21wb25lbnRcbiAqIEBwYXJhbSBpZ25vcmVFVGFnIElmIHNldCB0byB0cnVlLCBFVGFncyBhcmUgaWdub3JlZCB3aGVuIGV4ZWN1dGluZyB0aGUgYWN0aW9uXG4gKiBAcmV0dXJucyBSZXNvbHZlIGZ1bmN0aW9uIHJldHVybnNcbiAqICAtIHRoZSBjb250ZXh0IG9mIHRoZSBvcGVyYXRpb24gaWYgdGhlIGFjdGlvbiBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgZXhlY3V0ZWRcbiAqICAtIHZvaWQgaWYgdGhlIGFjdGlvbiBoYXMgZmFpbGVkXG4gKiAgLSB1bmRlZmluZWQgaWYgdGhlIGFjdGlvbiBoYXMgbm90IGJlZW4gdHJpZ2dlcmVkIHNpbmNlIHRoZSBwcmVyZXF1aXNpdGVzIGFyZSBub3QgbWV0XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGV4ZWN1dGVEcmFmdFZhbGlkYXRpb24oXG5cdGNvbnRleHQ6IENvbnRleHQsXG5cdGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LFxuXHRpZ25vcmVFVGFnOiBib29sZWFuXG4pOiBQcm9taXNlPE9EYXRhQ29udGV4dEJpbmRpbmcgfCB2b2lkIHwgdW5kZWZpbmVkPiB7XG5cdGlmIChNb2RlbEhlbHBlci5nZXRNZXNzYWdlc1BhdGgoY29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpLCBjb250ZXh0LmdldFBhdGgoKSkgJiYgZHJhZnQuaGFzUHJlcGFyZUFjdGlvbihjb250ZXh0KSkge1xuXHRcdHRyeSB7XG5cdFx0XHRpZiAoIWlnbm9yZUVUYWcgJiYgIWNvbnRleHQuaXNLZWVwQWxpdmUoKSkge1xuXHRcdFx0XHQvLyBXZSBuZWVkIHRvIHdhaXQgZm9yIHRoZSBlbnRpdHkgcmVsYXRlZCB0byB0aGUgY29udGV4dCB0byBwb3N0IHRoZSBhY3Rpb24gd2l0aCB0aGUgSWYtTWF0Y2ggaGVhZGVyXG5cdFx0XHRcdC8vIFNvbWUgdHJpZ2dlcnMgKGVudGVyIG9uIHRhYmxlKSBjYW4gZ2VuZXJhdGUgYSBwcm9taXNlIGluIHRoZSBjYWNoZSBzbyBpZiB3ZSBkb24ndCB3YWl0IGZvciB0aGUgZW50aXR5XG5cdFx0XHRcdC8vIHRoZSBQT1NUIHdpbGwgYmUgc2VudCB3aXRob3V0IElmLU1hdGNoIGFuZCB3aWxsIGdlbmVyYXRlIGFuIGVycm9yIG9uIGJhY2tlbmQgc2lkZS5cblx0XHRcdFx0YXdhaXQgKGNvbnRleHQuZ2V0QmluZGluZygpIGFzIE9EYXRhQ29udGV4dEJpbmRpbmcpLnJlcXVlc3RPYmplY3QoXCJcIik7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBvcGVyYXRpb24gPSBkcmFmdC5leGVjdXRlRHJhZnRQcmVwYXJhdGlvbkFjdGlvbihjb250ZXh0LCBjb250ZXh0LmdldFVwZGF0ZUdyb3VwSWQoKSwgdHJ1ZSwgaWdub3JlRVRhZyk7XG5cdFx0XHRpZiAoIWdldFJldHVyblR5cGUoY29udGV4dCwgZHJhZnRPcGVyYXRpb25zLlBSRVBBUkUpKSB7XG5cdFx0XHRcdHJlcXVlc3RNZXNzYWdlcyhjb250ZXh0LCBhcHBDb21wb25lbnQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKCkpO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gYXdhaXQgb3BlcmF0aW9uO1xuXHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSByZXF1ZXN0aW5nIG1lc3NhZ2VzXCIsIGVycm9yIGFzIHN0cmluZyk7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBBY3RpdmF0ZXMgYSBkcmFmdCBkb2N1bWVudC4gVGhlIGRyYWZ0IHdpbGwgcmVwbGFjZSB0aGUgc2libGluZyBlbnRpdHkgYW5kIHdpbGwgYmUgZGVsZXRlZCBieSB0aGUgYmFjayBlbmQuXG4gKiBAcGFyYW0gb0NvbnRleHQgQ29udGV4dCBmb3Igd2hpY2ggdGhlIGFjdGlvbiBzaG91bGQgYmUgcGVyZm9ybWVkXG4gKiBAcGFyYW0gb0FwcENvbXBvbmVudCBUaGUgQXBwQ29tcG9uZW50XG4gKiBAcGFyYW0gbWVzc2FnZUhhbmRsZXJcbiAqIEBwYXJhbSBbc0dyb3VwSWRdIFRoZSBvcHRpb25hbCBiYXRjaCBncm91cCBpbiB3aGljaCB0aGUgb3BlcmF0aW9uIGlzIHRvIGJlIGV4ZWN1dGVkXG4gKiBAcGFyYW0gW29QcmVwYXJlUHJvbWlzZV0gVGhlIHByb21pc2Ugb2YgdGhlIHByZXBhcmUgYWN0aW9uXG4gKiBAcGFyYW0gW3Jlc291cmNlTW9kZWxdIFRoZSByZXNvdXJjZSBtb2RlbCB0byBsb2FkIHRleHQgcmVzb3VyY2VzXG4gKiBAcmV0dXJucyBSZXNvbHZlIGZ1bmN0aW9uIHJldHVybnMgdGhlIGNvbnRleHQgb2YgdGhlIG9wZXJhdGlvblxuICovXG5hc3luYyBmdW5jdGlvbiBleGVjdXRlRHJhZnRBY3RpdmF0aW9uQWN0aW9uKFxuXHRvQ29udGV4dDogQ29udGV4dCxcblx0b0FwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LFxuXHRtZXNzYWdlSGFuZGxlcjogTWVzc2FnZUhhbmRsZXIsXG5cdHNHcm91cElkPzogc3RyaW5nLFxuXHRvUHJlcGFyZVByb21pc2U/OiBQcm9taXNlPHZvaWQgfCBPRGF0YUNvbnRleHRCaW5kaW5nPixcblx0cmVzb3VyY2VNb2RlbD86IFJlc291cmNlTW9kZWwsXG5cdGlzU3RhbmRhcmRTYXZlPzogYm9vbGVhbiB8IHVuZGVmaW5lZFxuKTogUHJvbWlzZTxDb250ZXh0PiB7XG5cdGNvbnN0IGJIYXNQcmVwYXJlQWN0aW9uID0gZHJhZnQuaGFzUHJlcGFyZUFjdGlvbihvQ29udGV4dCk7XG5cdC8vIEFjY29yZGluZyB0byB0aGUgZHJhZnQgc3BlYyBpZiB0aGUgc2VydmljZSBjb250YWlucyBhIHByZXBhcmUgYWN0aW9uIGFuZCB3ZSB0cmlnZ2VyIGJvdGggcHJlcGFyZSBhbmRcblx0Ly8gYWN0aXZhdGUgaW4gb25lICRiYXRjaCB0aGUgYWN0aXZhdGUgYWN0aW9uIGlzIGNhbGxlZCB3aXRoIGlGLU1hdGNoPSpcblx0Y29uc3QgYklnbm9yZUV0YWcgPSBiSGFzUHJlcGFyZUFjdGlvbjtcblx0bGV0IG9wZXJhdGlvbjogT3BlcmF0aW9uIHwgdW5kZWZpbmVkO1xuXHRpZiAoIW9Db250ZXh0LmdldFByb3BlcnR5KFwiSXNBY3RpdmVFbnRpdHlcIikpIHtcblx0XHRjb25zdCBjb252ZXJ0ZWRBY3Rpb24gPSBnZXRDb252ZXJ0ZWRBY3Rpb24ob0NvbnRleHQsIGRyYWZ0T3BlcmF0aW9ucy5BQ1RJVkFUSU9OKTtcblx0XHRjb25zdCBsYWJlbCA9IGlzU3RhbmRhcmRTYXZlID8gcmVzb3VyY2VNb2RlbD8uZ2V0VGV4dChcIlRfT1BfT0JKRUNUX1BBR0VfU0FWRVwiKSA6IHJlc291cmNlTW9kZWw/LmdldFRleHQoXCJDX09QX09CSkVDVF9QQUdFX1NBVkVcIik7XG5cdFx0aWYgKGNvbnZlcnRlZEFjdGlvbikge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0b3BlcmF0aW9uID0gbmV3IE9wZXJhdGlvbihvQXBwQ29tcG9uZW50LCBvQ29udGV4dC5nZXRNb2RlbCgpLCBjb252ZXJ0ZWRBY3Rpb24sIHtcblx0XHRcdFx0XHRtZXNzYWdlSGFuZGxlcjogbWVzc2FnZUhhbmRsZXIsXG5cdFx0XHRcdFx0Y29udGV4dHM6IFtvQ29udGV4dF0sXG5cdFx0XHRcdFx0bGFiZWw6IGxhYmVsLFxuXHRcdFx0XHRcdGJpbmRpbmdQYXJhbWV0ZXJzOiB7ICQkaW5oZXJpdEV4cGFuZFNlbGVjdDogdHJ1ZSB9LFxuXHRcdFx0XHRcdHNraXBNZXNzYWdlczogdHJ1ZSxcblx0XHRcdFx0XHRvRGF0YVByb3BlcnRpZXM6IHtcblx0XHRcdFx0XHRcdGRpc2FibGVTaWRlRWZmZWN0czogdHJ1ZSxcblx0XHRcdFx0XHRcdGdyb3VwSWQ6IHNHcm91cElkLFxuXHRcdFx0XHRcdFx0aWdub3JlRVRhZzogYklnbm9yZUV0YWcsXG5cdFx0XHRcdFx0XHRyZXBsYWNlV2l0aFJWQzogb0NvbnRleHQuZ2V0QmluZGluZygpLmlzQShcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nXCIpXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdFx0Y29uc3QgcmVzdWx0ID0gYXdhaXQgb3BlcmF0aW9uLmV4ZWN1dGUoKTtcblx0XHRcdFx0aWYgKHJlc3VsdFswXS5zdGF0dXMgPT09IFwicmVqZWN0ZWRcIikge1xuXHRcdFx0XHRcdHRocm93IG5ldyBFcnJvcihyZXN1bHRbMF0ucmVhc29uKTtcblx0XHRcdFx0fSBlbHNlIGlmIChyZXN1bHRbMF0udmFsdWUucmV0dXJuZWRDb250ZXh0ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJObyBjb250ZXh0IHJldHVybmVkIGJ5IHRoZSBhY3Rpb25cIik7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHJlc3VsdFswXS52YWx1ZS5yZXR1cm5lZENvbnRleHQ7XG5cdFx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRcdGlmIChiSGFzUHJlcGFyZUFjdGlvbikge1xuXHRcdFx0XHRcdC8vIGRlc3Ryb3kgdGhlIG9wZXJhdGlvbiBiaW5kaW5ncyB0byBhdm9pZCBhZGRpdGlvbmFsIG1lc3NhZ2UgcmVxdWVzdHMgc2VudCBieSB0aGUgbW9kZWxcblx0XHRcdFx0XHRjb25zdCBwcmVwYXJlT3BlcmF0aW9uID0gYXdhaXQgb1ByZXBhcmVQcm9taXNlO1xuXHRcdFx0XHRcdHByZXBhcmVPcGVyYXRpb24/LmRlc3Ryb3koKTtcblx0XHRcdFx0XHRvcGVyYXRpb24/LmNsZWFyKCk7XG5cblx0XHRcdFx0XHRjb25zdCBhY3Rpb25OYW1lID0gZ2V0QWN0aW9uTmFtZShvQ29udGV4dCwgZHJhZnRPcGVyYXRpb25zLlBSRVBBUkUpLFxuXHRcdFx0XHRcdFx0b1NpZGVFZmZlY3RzU2VydmljZSA9IG9BcHBDb21wb25lbnQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKCksXG5cdFx0XHRcdFx0XHRvQmluZGluZ1BhcmFtZXRlcnMgPSBvU2lkZUVmZmVjdHNTZXJ2aWNlLmdldE9EYXRhQWN0aW9uU2lkZUVmZmVjdHMoYWN0aW9uTmFtZSwgb0NvbnRleHQpLFxuXHRcdFx0XHRcdFx0YVRhcmdldFBhdGhzID0gb0JpbmRpbmdQYXJhbWV0ZXJzICYmIG9CaW5kaW5nUGFyYW1ldGVycy5wYXRoRXhwcmVzc2lvbnM7XG5cdFx0XHRcdFx0aWYgKGFUYXJnZXRQYXRocyAmJiBhVGFyZ2V0UGF0aHMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdFx0YXdhaXQgb1NpZGVFZmZlY3RzU2VydmljZS5yZXF1ZXN0U2lkZUVmZmVjdHMoYVRhcmdldFBhdGhzLCBvQ29udGV4dCk7XG5cdFx0XHRcdFx0XHR9IGNhdGNoIChvRXJyb3I6IHVua25vd24pIHtcblx0XHRcdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgcmVxdWVzdGluZyBzaWRlIGVmZmVjdHNcIiwgb0Vycm9yIGFzIHN0cmluZyk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRcdGF3YWl0IHJlcXVlc3RNZXNzYWdlcyhvQ29udGV4dCwgb1NpZGVFZmZlY3RzU2VydmljZSwgdHJ1ZSk7XG5cdFx0XHRcdFx0XHR9IGNhdGNoIChvRXJyb3I6IHVua25vd24pIHtcblx0XHRcdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgcmVxdWVzdGluZyBtZXNzYWdlc1wiLCBvRXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhyb3cgZTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiVGhlIGFjdGl2YXRpb24gYWN0aW9uIG5vdCBmb3VuZFwiKTtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKFwiVGhlIGFjdGl2YXRpb24gYWN0aW9uIGNhbm5vdCBiZSBleGVjdXRlZCBvbiBhbiBhY3RpdmUgZG9jdW1lbnRcIik7XG5cdH1cbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBzdXBwb3J0ZWQgbWVzc2FnZSBwcm9wZXJ0eSBwYXRoIG9uIHRoZSBQcmVwYXJlQWN0aW9uIGZvciBhIGNvbnRleHQuXG4gKiBAcGFyYW0gY29udGV4dCBDb250ZXh0IHRvIGJlIGNoZWNrZWRcbiAqIEByZXR1cm5zIFBhdGggdG8gdGhlIG1lc3NhZ2VcbiAqL1xuZnVuY3Rpb24gZ2V0TWVzc2FnZVBhdGhGb3JQcmVwYXJlKGNvbnRleHQ6IENvbnRleHQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHQvLyBJZiB0aGVyZSBpcyBubyByZXR1cm4gcGFyYW1ldGVyLCBpdCBpcyBub3QgcG9zc2libGUgdG8gcmVxdWVzdCBNZXNzYWdlcy5cblx0Ly8gUkFQIGRyYWZ0IHByZXBhcmUgaGFzIG5vIHJldHVybiBwYXJhbWV0ZXJcblx0cmV0dXJuIGdldFJldHVyblR5cGUoY29udGV4dCwgZHJhZnRPcGVyYXRpb25zLlBSRVBBUkUpID8gZ2V0TWVzc2FnZVBhdGhGb3JDb250ZXh0KGNvbnRleHQpIDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIHN1cHBvcnRlZCBtZXNzYWdlIHByb3BlcnR5IHBhdGggZm9yIGEgY29udGV4dC5cbiAqIEBwYXJhbSBjb250ZXh0IENvbnRleHQgdG8gYmUgY2hlY2tlZFxuICogQHJldHVybnMgUGF0aCB0byB0aGUgbWVzc2FnZVxuICovXG5mdW5jdGlvbiBnZXRNZXNzYWdlUGF0aEZvckNvbnRleHQoY29udGV4dDogQ29udGV4dCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdGNvbnN0IG1ldGFDb250ZXh0ID0gY29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpLmdldE1ldGFDb250ZXh0KGNvbnRleHQuZ2V0UGF0aCgpKTtcblx0Y29uc3QgY29udmVydGVkQ29udGV4dCA9IGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyhtZXRhQ29udGV4dCk7XG5cdGNvbnN0IG1lc3NhZ2VzID0gY29udmVydGVkQ29udGV4dC50YXJnZXRFbnRpdHlUeXBlLmFubm90YXRpb25zLkNvbW1vbj8uTWVzc2FnZXM7XG5cdHJldHVybiBpc1BhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbihtZXNzYWdlcykgPyBtZXNzYWdlcy5wYXRoIDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEV4ZWN1dGUgYSBwcmVwYXJhdGlvbiBhY3Rpb24uXG4gKiBAcGFyYW0gb0NvbnRleHQgQ29udGV4dCBmb3Igd2hpY2ggdGhlIGFjdGlvbiBzaG91bGQgYmUgcGVyZm9ybWVkXG4gKiBAcGFyYW0gZ3JvdXBJZCBUaGUgb3B0aW9uYWwgYmF0Y2ggZ3JvdXAgaW4gd2hpY2ggd2Ugd2FudCB0byBleGVjdXRlIHRoZSBvcGVyYXRpb25cbiAqIEBwYXJhbSBiTWVzc2FnZXMgSWYgc2V0IHRvIHRydWUsIHRoZSBQUkVQQVJFIGFjdGlvbiByZXRyaWV2ZXMgU0FQX01lc3NhZ2VzXG4gKiBAcGFyYW0gaWdub3JlRVRhZyBJZiBzZXQgdG8gdHJ1ZSwgRVRhZyBpbmZvcm1hdGlvbiBpcyBpZ25vcmVkIHdoZW4gdGhlIGFjdGlvbiBpcyBleGVjdXRlZFxuICogQHJldHVybnMgUmVzb2x2ZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBjb250ZXh0IG9mIHRoZSBvcGVyYXRpb25cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZURyYWZ0UHJlcGFyYXRpb25BY3Rpb24oXG5cdG9Db250ZXh0OiBDb250ZXh0LFxuXHRncm91cElkPzogc3RyaW5nLFxuXHRiTWVzc2FnZXM/OiBib29sZWFuLFxuXHRpZ25vcmVFVGFnPzogYm9vbGVhblxuKTogUHJvbWlzZTx2b2lkIHwgT0RhdGFDb250ZXh0QmluZGluZz4ge1xuXHRpZiAoIW9Db250ZXh0LmdldFByb3BlcnR5KFwiSXNBY3RpdmVFbnRpdHlcIikpIHtcblx0XHRjb25zdCBzTWVzc2FnZXNQYXRoID0gYk1lc3NhZ2VzID8gZ2V0TWVzc2FnZVBhdGhGb3JQcmVwYXJlKG9Db250ZXh0KSA6IHVuZGVmaW5lZDtcblx0XHRjb25zdCBvT3BlcmF0aW9uID0gY3JlYXRlT3BlcmF0aW9uKG9Db250ZXh0LCBkcmFmdE9wZXJhdGlvbnMuUFJFUEFSRSwgc01lc3NhZ2VzUGF0aCA/IHsgJHNlbGVjdDogc01lc3NhZ2VzUGF0aCB9IDogdW5kZWZpbmVkKTtcblxuXHRcdC8vIFRPRE86IHNpZGUgZWZmZWN0cyBxdWFsaWZpZXIgc2hhbGwgYmUgZXZlbiBkZXByZWNhdGVkIHRvIGJlIGNoZWNrZWRcblx0XHRvT3BlcmF0aW9uLnNldFBhcmFtZXRlcihcIlNpZGVFZmZlY3RzUXVhbGlmaWVyXCIsIFwiXCIpO1xuXG5cdFx0Y29uc3Qgc0dyb3VwSWQgPSBncm91cElkIHx8IG9PcGVyYXRpb24uZ2V0R3JvdXBJZCgpO1xuXHRcdHJldHVybiBvT3BlcmF0aW9uXG5cdFx0XHQuaW52b2tlKHNHcm91cElkLCBpZ25vcmVFVGFnKVxuXHRcdFx0LnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRyZXR1cm4gb09wZXJhdGlvbjtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogdW5rbm93bikge1xuXHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBleGVjdXRpbmcgdGhlIG9wZXJhdGlvblwiLCBvRXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdFx0cmV0dXJuIG9PcGVyYXRpb247XG5cdFx0XHR9KTtcblx0fSBlbHNlIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcHJlcGFyYXRpb24gYWN0aW9uIGNhbm5vdCBiZSBleGVjdXRlZCBvbiBhbiBhY3RpdmUgZG9jdW1lbnRcIik7XG5cdH1cbn1cblxuLyoqXG4gKiBSZXF1ZXN0cyB0aGUgbWVzc2FnZXMgaWYgYW5ub3RhdGVkIGZvciBhIGdpdmVuIGNvbnRleHQuXG4gKiBAcGFyYW0gb0NvbnRleHQgQ29udGV4dCBmb3Igd2hpY2ggdGhlIG1lc3NhZ2VzIHNoYWxsIGJlIHJlcXVlc3RlZFxuICogQHBhcmFtIG9TaWRlRWZmZWN0c1NlcnZpY2UgU2VydmljZSBmb3IgdGhlIFNpZGVFZmZlY3RzIG9uIFNBUCBGaW9yaSBlbGVtZW50c1xuICogQHBhcmFtIHJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcyBJZiBzZXQgdG8gdHJ1ZSwgdHJhbnNpdGlvbiBtZXNzYWdlcyBhcmUgcmVtb3ZlZCBpZiBzdGF0ZSBtZXNzYWdlcyBleGlzdFxuICogQHJldHVybnMgUHJvbWlzZSB3aGljaCBpcyByZXNvbHZlZCBvbmNlIG1lc3NhZ2VzIHdlcmUgcmVxdWVzdGVkXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlcXVlc3RNZXNzYWdlcyhcblx0b0NvbnRleHQ6IENvbnRleHQsXG5cdG9TaWRlRWZmZWN0c1NlcnZpY2U6IFNpZGVFZmZlY3RzU2VydmljZSxcblx0cmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzID0gZmFsc2Vcbik6IFByb21pc2U8dm9pZD4ge1xuXHRjb25zdCBzTWVzc2FnZXNQYXRoID0gTW9kZWxIZWxwZXIuZ2V0TWVzc2FnZXNQYXRoKG9Db250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCksIG9Db250ZXh0LmdldFBhdGgoKSk7XG5cdGlmIChzTWVzc2FnZXNQYXRoKSB7XG5cdFx0YXdhaXQgb1NpZGVFZmZlY3RzU2VydmljZS5yZXF1ZXN0U2lkZUVmZmVjdHMoW3NNZXNzYWdlc1BhdGhdLCBvQ29udGV4dCk7XG5cdFx0aWYgKHJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcykge1xuXHRcdFx0Y29uc3QgZGF0YSA9IGF3YWl0IG9Db250ZXh0LnJlcXVlc3RPYmplY3QoKTtcblx0XHRcdGlmIChkYXRhW3NNZXNzYWdlc1BhdGhdLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0Ly9pZiBzdGF0ZSBtZXNzYWdlcyBhcmUgYXZhaWxhYmxlIGZyb20gdGhlIFBSRVBBUkFUSU9OIGFjdGlvbiwgdGhlbiBwcmV2aW91cyB0cmFuc2l0aW9uIG1lc3NhZ2VzIGFyZSByZW1vdmVkXG5cdFx0XHRcdG1lc3NhZ2VIYW5kbGluZy5yZW1vdmVVbmJvdW5kVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cdFx0XHRcdG1lc3NhZ2VIYW5kbGluZy5yZW1vdmVCb3VuZFRyYW5zaXRpb25NZXNzYWdlcygpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHRyZXR1cm47XG59XG4vKipcbiAqIEV4ZWN1dGVzIGRpc2NhcmQgb2YgYSBkcmFmdCBmdW5jdGlvbiB1c2luZyBIVFRQIFBvc3QuXG4gKiBAcGFyYW0gb0NvbnRleHQgQ29udGV4dCBmb3Igd2hpY2ggdGhlIGFjdGlvbiBzaG91bGQgYmUgcGVyZm9ybWVkXG4gKiBAcGFyYW0gbWVzc2FnZUhhbmRsZXIgVGhlIG1lc3NhZ2UgaGFuZGxlciBjb250cm9sbGVyIGV4dGVuc2lvblxuICogQHBhcmFtIG9BcHBDb21wb25lbnQgQXBwIENvbXBvbmVudFxuICogQHBhcmFtIGJFbmFibGVTdHJpY3RIYW5kbGluZ1xuICogQHJldHVybnMgUmVzb2x2ZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBjb250ZXh0IG9mIHRoZSBvcGVyYXRpb25cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZURyYWZ0RGlzY2FyZEFjdGlvbihcblx0b0NvbnRleHQ6IENvbnRleHQsXG5cdG1lc3NhZ2VIYW5kbGVyOiBNZXNzYWdlSGFuZGxlcixcblx0b0FwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LFxuXHRiRW5hYmxlU3RyaWN0SGFuZGxpbmc/OiBib29sZWFuXG4pOiBQcm9taXNlPHZvaWQ+IHtcblx0aWYgKCFvQ29udGV4dC5nZXRQcm9wZXJ0eShcIklzQWN0aXZlRW50aXR5XCIpKSB7XG5cdFx0Y29uc3QgY29udmVydGVkQWN0aW9uID0gZ2V0Q29udmVydGVkQWN0aW9uKG9Db250ZXh0LCBkcmFmdE9wZXJhdGlvbnMuRElTQ0FSRCk7XG5cdFx0aWYgKGNvbnZlcnRlZEFjdGlvbikge1xuXHRcdFx0Y29uc3QgcmVzdWx0ID0gYXdhaXQgbmV3IE9wZXJhdGlvbihvQXBwQ29tcG9uZW50LCBvQ29udGV4dC5nZXRNb2RlbCgpLCBjb252ZXJ0ZWRBY3Rpb24sIHtcblx0XHRcdFx0bWVzc2FnZUhhbmRsZXI6IG1lc3NhZ2VIYW5kbGVyLFxuXHRcdFx0XHRsYWJlbDogZ2V0UmVzb3VyY2VNb2RlbChvQXBwQ29tcG9uZW50KT8uZ2V0VGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0RSQUZUX0RJU0NBUkRfQlVUVE9OXCIpIHx8IFwiXCIsXG5cdFx0XHRcdGNvbnRleHRzOiBbb0NvbnRleHRdLFxuXHRcdFx0XHRza2lwTWVzc2FnZXM6IHRydWUsXG5cdFx0XHRcdG9EYXRhUHJvcGVydGllczoge1xuXHRcdFx0XHRcdGRpc2FibGVTaWRlRWZmZWN0czogdHJ1ZSxcblx0XHRcdFx0XHRkaXNhYmxlU3RyaWN0SGFuZGxpbmc6ICFiRW5hYmxlU3RyaWN0SGFuZGxpbmcsXG5cdFx0XHRcdFx0aWdub3JlRVRhZzogaXNFbXB0eU9iamVjdChvQ29udGV4dC5nZXRPYmplY3QoKSksIC8vIElmIHRoZSBjb250ZXh0IGhhcyBub3QgYmVlbiBsb2FkZWQgeWV0LCB3ZSBjYW4gaWdub3JlIHRoZSBFVGFnIChhcyBubyBwcmV2aW91cyBFVGFnIGlzIGF2YWlsYWJsZSlcblx0XHRcdFx0XHRncm91cElkOiBcImRpcmVjdFwiLFxuXHRcdFx0XHRcdHJlcGxhY2VXaXRoUlZDOiB1bmRlZmluZWQsXG5cdFx0XHRcdFx0ZGVmZXJyZWRTdWJtaXQ6IGZhbHNlXG5cdFx0XHRcdH1cblx0XHRcdH0pLmV4ZWN1dGUoKTtcblx0XHRcdGlmIChyZXN1bHRbMF0uc3RhdHVzID09PSBcInJlamVjdGVkXCIpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKHJlc3VsdFswXS5yZWFzb24pO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJUaGUgZGlzY2FyZCBhY3Rpb24gbm90IGZvdW5kXCIpO1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJUaGUgZGlzY2FyZCBhY3Rpb24gY2Fubm90IGJlIGV4ZWN1dGVkIG9uIGFuIGFjdGl2ZSBkb2N1bWVudFwiKTtcblx0fVxufVxuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGNyZWF0ZXMgYSBzaWJsaW5nIGNvbnRleHQgZm9yIGEgc3Vib2JqZWN0IHBhZ2UgYW5kIGNhbGN1bGF0ZXMgYSBzaWJsaW5nIHBhdGggZm9yIGFsbCBpbnRlcm1lZGlhdGUgcGF0aHNcbiAqIGJldHdlZW4gdGhlIG9iamVjdCBwYWdlIGFuZCB0aGUgc3Vib2JqZWN0IHBhZ2UuXG4gKiBAcGFyYW0gcm9vdEN1cnJlbnRDb250ZXh0IFRoZSBjb250ZXh0IGZvciB0aGUgcm9vdCBvZiB0aGUgZHJhZnRcbiAqIEBwYXJhbSByaWdodG1vc3RDdXJyZW50Q29udGV4dCBUaGUgY29udGV4dCBvZiB0aGUgc3Vib2JqZWN0IHBhZ2VcbiAqIEBwYXJhbSByb290Q29udGV4dEluZm8gVGhlIGNvbnRleHQgaW5mbyBvZiByb290IG9mIHRoZSBkcmFmdFxuICogQHBhcmFtIGdyb3VwSWRcbiAqIEBwYXJhbSBiaW5kaW5nUGFyYW1ldGVycyBPcHRpb25hbCBiaW5kaW5nIHBhcmFtZXRlcnMgd2hlbiBjcmVhdGluZyB0aGUgY29udGV4dFxuICogQHBhcmFtIGNyZWF0ZUtlZXBBbGl2ZUNvbnRleHQgSWYgc2V0IHRvIHRydWUsIHRoZSBjb250ZXh0IHdpbGwgYmUgY3JlYXRlZCBhcyBhIGtlZXAtYWxpdmUgY29udGV4dFxuICogQHJldHVybnMgVGhlIHNpYmxpbmdJbmZvcm1hdGlvbiBvYmplY3RcbiAqL1xuYXN5bmMgZnVuY3Rpb24gY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbihcblx0cm9vdEN1cnJlbnRDb250ZXh0OiBDb250ZXh0LFxuXHRyaWdodG1vc3RDdXJyZW50Q29udGV4dDogQ29udGV4dCxcblx0cm9vdENvbnRleHRJbmZvPzogUm9vdENvbnRleHRJbmZvLFxuXHRncm91cElkPzogc3RyaW5nLFxuXHRiaW5kaW5nUGFyYW1ldGVycz86IG9iamVjdCxcblx0Y3JlYXRlS2VlcEFsaXZlQ29udGV4dCA9IGZhbHNlXG4pOiBQcm9taXNlPFNpYmxpbmdJbmZvcm1hdGlvbiB8IHVuZGVmaW5lZD4ge1xuXHRpZiAoIXJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0LmdldFBhdGgoKS5zdGFydHNXaXRoKHJvb3RDdXJyZW50Q29udGV4dC5nZXRQYXRoKCkpKSB7XG5cdFx0Ly8gV3JvbmcgdXNhZ2UgISFcblx0XHRMb2cuZXJyb3IoXCJDYW5ub3QgY29tcHV0ZSByaWdodG1vc3Qgc2libGluZyBjb250ZXh0XCIpO1xuXHRcdHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBjb21wdXRlIHJpZ2h0bW9zdCBzaWJsaW5nIGNvbnRleHRcIik7XG5cdH1cblxuXHRpZiAoXG5cdFx0cmlnaHRtb3N0Q3VycmVudENvbnRleHQuZ2V0UHJvcGVydHkoXCJJc0FjdGl2ZUVudGl0eVwiKSA9PT0gZmFsc2UgJiZcblx0XHRyaWdodG1vc3RDdXJyZW50Q29udGV4dC5nZXRQcm9wZXJ0eShcIkhhc0FjdGl2ZUVudGl0eVwiKSA9PT0gZmFsc2Vcblx0KSB7XG5cdFx0Ly8gV2UgYWxyZWFkeSBrbm93IHRoZSBzaWJsaW5nIGZvciByaWdodG1vc3RDdXJyZW50Q29udGV4dCBkb2Vzbid0IGV4aXN0XG5cdFx0Ly8gLS0+IE5vIG5lZWQgdG8gY2hlY2sgY2Fub25pY2FsIHBhdGhzIGV0Yy4uLlxuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblxuXHRjb25zdCBtb2RlbCA9IHJvb3RDdXJyZW50Q29udGV4dC5nZXRNb2RlbCgpO1xuXHR0cnkge1xuXHRcdC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXHRcdC8vIDEuIEZpbmQgYWxsIHNlZ21lbnRzIGJldHdlZW4gdGhlIHJvb3Qgb2JqZWN0IGFuZCB0aGUgc3ViLW9iamVjdFxuXHRcdC8vIEV4YW1wbGU6IGZvciByb290ID0gL1BhcmFtKGFhKS9FbnRpdHkoYmIpIGFuZCByaWdodE1vc3QgPSAvUGFyYW0oYWEpL0VudGl0eShiYikvX05hdihjYykvX1N1Yk5hdihkZClcblx0XHQvLyAtLS0+IFtcIlBhcmFtKGFhKS9FbnRpdHkoYmIpXCIsIFwiX05hdihjYylcIiwgXCJfU3ViTmF2KGRkKVwiXVxuXG5cdFx0Ly8gRmluZCBhbGwgc2VnbWVudHMgaW4gdGhlIHJpZ2h0bW9zdCBwYXRoXG5cdFx0Y29uc3QgYWRkaXRpb25hbFBhdGggPSByaWdodG1vc3RDdXJyZW50Q29udGV4dC5nZXRQYXRoKCkucmVwbGFjZShyb290Q3VycmVudENvbnRleHQuZ2V0UGF0aCgpLCBcIlwiKTtcblx0XHRjb25zdCBzZWdtZW50cyA9IGFkZGl0aW9uYWxQYXRoID8gYWRkaXRpb25hbFBhdGguc3Vic3RyaW5nKDEpLnNwbGl0KFwiL1wiKSA6IFtdO1xuXHRcdC8vIEZpcnN0IHNlZ21lbnQgaXMgYWx3YXlzIHRoZSBmdWxsIHBhdGggb2YgdGhlIHJvb3Qgb2JqZWN0LCB3aGljaCBjYW4gY29udGFpbiAnLycgaW4gY2FzZSBvZiBhIHBhcmFtZXRyaXplZCBlbnRpdHlcblx0XHRzZWdtZW50cy51bnNoaWZ0KHJvb3RDdXJyZW50Q29udGV4dC5nZXRQYXRoKCkuc3Vic3RyaW5nKDEpKTtcblxuXHRcdC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXHRcdC8vIDIuIFJlcXVlc3QgY2Fub25pY2FsIHBhdGhzIG9mIHRoZSBzaWJsaW5nIGVudGl0eSBmb3IgZWFjaCBzZWdtZW50XG5cdFx0Ly8gRXhhbXBsZTogZm9yIFtcIlBhcmFtKGFhKS9FbnRpdHkoYmIpXCIsIFwiX05hdihjYylcIiwgXCJfU3ViTmF2KGRkKVwiXVxuXHRcdC8vIC0tPiByZXF1ZXN0IGNhbm9uaWNhbCBwYXRocyBmb3IgXCJQYXJhbShhYSkvRW50aXR5KGJiKS9TaWJsaW5nRW50aXR5XCIsIFwiUGFyYW0oYWEpL0VudGl0eShiYikvX05hdihjYykvU2libGluZ0VudGl0eVwiLCBcIlBhcmFtKGFhKS9FbnRpdHkoYmIpL19OYXYoY2MpL19TdWJOYXYoZGQpL1NpYmxpbmdFbnRpdHlcIlxuXHRcdGNvbnN0IG9sZFBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuXHRcdGNvbnN0IG5ld1BhdGhzOiBzdHJpbmdbXSA9IFtdO1xuXHRcdGxldCBjdXJyZW50UGF0aCA9IFwiXCI7XG5cblx0XHQvLyBDb21wdXRpbmcgc2libGluZyBlbnRpdHkgb2Ygcm9vdCBvZiB0aGUgZHJhZnQgY29udGV4dCBpcyBub3QgcmVxdWlyZWQgaWYgdGhlIGNvbnRleHQgaXMgYWxyZWFkeSBpbiB0aGUgc3ViLU9QXG5cdFx0Ly8gRXhhbXBsZTogRWRpdCBpbiBTdWItT1Agd2hlcmUgbmV3IGNvbnRleHQgaXMgYWxyZWFkeSBhdmFpbGFibGVcblx0XHRjb25zdCBwYXRocyA9IFsuLi5zZWdtZW50c107XG5cdFx0aWYgKHJvb3RDb250ZXh0SW5mbz8ucm9vdFNpYmxpbmdQYXRoUHJvbWlzZSkge1xuXHRcdFx0cGF0aHMuc2hpZnQoKTtcblx0XHRcdGN1cnJlbnRQYXRoID0gXCIvXCIgKyByb290Q3VycmVudENvbnRleHQ/LmdldFBhdGgoKT8uc3Vic3RyaW5nKDEpO1xuXHRcdH1cblx0XHRjb25zdCBjYW5vbmljYWxQYXRoUHJvbWlzZXMgPSBwYXRocy5tYXAoYXN5bmMgKHNlZ21lbnQpID0+IHtcblx0XHRcdGN1cnJlbnRQYXRoICs9IGAvJHtzZWdtZW50fWA7XG5cdFx0XHRvbGRQYXRocy51bnNoaWZ0KGN1cnJlbnRQYXRoKTtcblx0XHRcdGlmIChjdXJyZW50UGF0aC5lbmRzV2l0aChcIilcIikpIHtcblx0XHRcdFx0Y29uc3Qgc2libGluZ0NvbnRleHQgPSBtb2RlbFxuXHRcdFx0XHRcdC5iaW5kQ29udGV4dChgJHtjdXJyZW50UGF0aH0vU2libGluZ0VudGl0eWAsIHVuZGVmaW5lZCwgZ3JvdXBJZCA/IHsgJCRncm91cElkOiBncm91cElkIH0gOiB1bmRlZmluZWQpXG5cdFx0XHRcdFx0LmdldEJvdW5kQ29udGV4dCgpO1xuXHRcdFx0XHRyZXR1cm4gc2libGluZ0NvbnRleHQucmVxdWVzdENhbm9uaWNhbFBhdGgoKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUodW5kZWZpbmVkKTsgLy8gMS0xIHJlbGF0aW9uXG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHQvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblx0XHQvLyAzLiBSZWNvbnN0cnVjdCB0aGUgZnVsbCBwYXRocyBmcm9tIGNhbm9uaWNhbCBwYXRocyAoZm9yIHBhdGggbWFwcGluZylcblx0XHQvLyBFeGFtcGxlOiBmb3IgY2Fub25pY2FsIHBhdGhzIFwiL1BhcmFtKGFhKS9FbnRpdHkoYmItc2libGluZylcIiwgXCIvRW50aXR5MihjYy1zaWJsaW5nKVwiLCBcIi9FbnRpdHkzKGRkLXNpYmxpbmcpXCJcblx0XHQvLyAtLT4gW1wiUGFyYW0oYWEpL0VudGl0eShiYi1zaWJsaW5nKVwiLCBcIlBhcmFtKGFhKS9FbnRpdHkoYmItc2libGluZykvX05hdihjYy1zaWJsaW5nKVwiLCBcIlBhcmFtKGFhKS9FbnRpdHkoYmItc2libGluZykvX05hdihjYy1zaWJsaW5nKS9fU3ViTmF2KGRkLXNpYmxpbmcpXCJdXG5cdFx0Y29uc3QgY2Fub25pY2FsUGF0aHMgPSAoYXdhaXQgUHJvbWlzZS5hbGwoY2Fub25pY2FsUGF0aFByb21pc2VzKSkgYXMgc3RyaW5nW107XG5cblx0XHQvLyBXb3JrYXJvdW5kICh0ZW1wb3JhcnkgPyk6IHdoZW4gdGhlIHNpYmxpbmcgZG9lc24ndCBleGlzdCwgcmVxdWVzdENhbm9uaWNhbFBhdGggcmV0dXJucyB0aGUgc2FtZSBwYXRoXG5cdFx0aWYgKFxuXHRcdFx0Y2Fub25pY2FsUGF0aHMuc29tZSgocGF0aCkgPT4ge1xuXHRcdFx0XHRyZXR1cm4gcGF0aCAmJiBwYXRoLmVuZHNXaXRoKFwiL1NpYmxpbmdFbnRpdHlcIik7XG5cdFx0XHR9KVxuXHRcdCkge1xuXHRcdFx0Ly8gQXQgbGVhc3Qgb25lIHNpYmxpbmcgZW50aXR5IGRvZXNuJ3QgZXhpc3Rcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXG5cdFx0aWYgKHJvb3RDb250ZXh0SW5mbz8ucm9vdFNpYmxpbmdQYXRoUHJvbWlzZSkge1xuXHRcdFx0Y29uc3Qgcm9vdFNpYmxpbmdQYXRoID0gKGF3YWl0IHJvb3RDb250ZXh0SW5mby5yb290U2libGluZ1BhdGhQcm9taXNlKT8uZ2V0UGF0aCgpIGFzIHN0cmluZztcblx0XHRcdGNhbm9uaWNhbFBhdGhzLnVuc2hpZnQocm9vdFNpYmxpbmdQYXRoKTtcblx0XHRcdG9sZFBhdGhzLnB1c2gocm9vdEN1cnJlbnRDb250ZXh0LmdldFBhdGgoKSk7XG5cdFx0fVxuXHRcdGxldCBzaWJsaW5nUGF0aCA9IFwiXCI7XG5cdFx0Y2Fub25pY2FsUGF0aHMuZm9yRWFjaCgoY2Fub25pY2FsUGF0aCwgaW5kZXgpID0+IHtcblx0XHRcdGlmIChpbmRleCAhPT0gMCkge1xuXHRcdFx0XHRpZiAoc2VnbWVudHNbaW5kZXhdLmVuZHNXaXRoKFwiKVwiKSkge1xuXHRcdFx0XHRcdGNvbnN0IG5hdmlnYXRpb24gPSBzZWdtZW50c1tpbmRleF0ucmVwbGFjZSgvXFwoLiokLywgXCJcIik7IC8vIEtlZXAgb25seSBuYXZpZ2F0aW9uIG5hbWUgZnJvbSB0aGUgc2VnbWVudCwgaS5lLiBhYWEoeHh4KSAtLT4gYWFhXG5cdFx0XHRcdFx0Y29uc3Qga2V5cyA9IGNhbm9uaWNhbFBhdGgucmVwbGFjZSgvLipcXCgvLCBcIihcIik7IC8vIEtlZXAgb25seSB0aGUga2V5cyBmcm9tIHRoZSBjYW5vbmljYWwgcGF0aCwgaS5lLiBhYWEoeHh4KSAtLT4gKHh4eClcblx0XHRcdFx0XHRzaWJsaW5nUGF0aCArPSBgLyR7bmF2aWdhdGlvbn0ke2tleXN9YDtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRzaWJsaW5nUGF0aCArPSBgLyR7c2VnbWVudHNbaW5kZXhdfWA7IC8vIDEtMSByZWxhdGlvblxuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRzaWJsaW5nUGF0aCA9IGNhbm9uaWNhbFBhdGg7IC8vIFRvIG1hbmFnZSBwYXJhbWV0cml6ZWQgZW50aXRpZXNcblx0XHRcdH1cblx0XHRcdG5ld1BhdGhzLnVuc2hpZnQoc2libGluZ1BhdGgpO1xuXHRcdH0pO1xuXG5cdFx0bGV0IHBhcmFtZXRlcnM6IHsgJHNlbGVjdD86IHN0cmluZzsgJCRncm91cElkPzogc3RyaW5nIH07XG5cdFx0Y29uc3QgbWVzc2FnZVBhdGggPSBnZXRNZXNzYWdlUGF0aEZvckNvbnRleHQocmlnaHRtb3N0Q3VycmVudENvbnRleHQpO1xuXHRcdGlmIChjcmVhdGVLZWVwQWxpdmVDb250ZXh0KSB7XG5cdFx0XHRwYXJhbWV0ZXJzID0geyAkJGdyb3VwSWQ6IFwiJGF1dG8uV29ya2Vyc1wiIH07IC8vIFdlIG5lZWQgdG8gdXNlIHRoZSBzYW1lIGdyb3VwIElEIGFzIGZvciB0aGUgcGFyZW50IGxpc3QgYmluZGluZ1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRwYXJhbWV0ZXJzID0gYmluZGluZ1BhcmFtZXRlcnMgPz8ge307XG5cdFx0XHRpZiAobWVzc2FnZVBhdGgpIHtcblx0XHRcdFx0aWYgKHBhcmFtZXRlcnMuJHNlbGVjdCkge1xuXHRcdFx0XHRcdHBhcmFtZXRlcnMuJHNlbGVjdCArPSBgLCR7bWVzc2FnZVBhdGh9YDtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRwYXJhbWV0ZXJzLiRzZWxlY3QgPSBtZXNzYWdlUGF0aDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cGFyYW1ldGVycy4kJGdyb3VwSWQgPSBcIiRhdXRvLkhlcm9lc1wiO1xuXHRcdH1cblxuXHRcdHJldHVybiB7XG5cdFx0XHR0YXJnZXRDb250ZXh0OiBjcmVhdGVLZWVwQWxpdmVDb250ZXh0XG5cdFx0XHRcdD8gbW9kZWwuZ2V0S2VlcEFsaXZlQ29udGV4dChzaWJsaW5nUGF0aCwgISFtZXNzYWdlUGF0aCwgcGFyYW1ldGVycylcblx0XHRcdFx0OiBtb2RlbC5iaW5kQ29udGV4dChzaWJsaW5nUGF0aCwgdW5kZWZpbmVkLCBwYXJhbWV0ZXJzKS5nZXRCb3VuZENvbnRleHQoKSwgLy8gQ3JlYXRlIHRoZSByaWdodG1vc3Qgc2libGluZyBjb250ZXh0IGZyb20gaXRzIHBhdGhcblx0XHRcdHBhdGhNYXBwaW5nOiBvbGRQYXRocy5tYXAoKG9sZFBhdGgsIGluZGV4KSA9PiB7XG5cdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0b2xkUGF0aCxcblx0XHRcdFx0XHRuZXdQYXRoOiBuZXdQYXRoc1tpbmRleF1cblx0XHRcdFx0fTtcblx0XHRcdH0pXG5cdFx0fTtcblx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHQvLyBBIGNhbm9uaWNhbCBwYXRoIGNvdWxkbid0IGJlIHJlc29sdmVkIChiZWNhdXNlIGEgc2libGluZyBkb2Vzbid0IGV4aXN0KVxuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgZHJhZnQgZG9jdW1lbnQgZnJvbSBhbiBleGlzdGluZyBkb2N1bWVudC5cbiAqXG4gKiBUaGUgZnVuY3Rpb24gc3VwcG9ydHMgc2V2ZXJhbCBob29rcyBhcyB0aGVyZSBpcyBhIGNlcnRhaW4gY29yZW9ncmFwaHkgZGVmaW5lZC5cbiAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IG9mIHRoZSBhY3RpdmUgZG9jdW1lbnQgZm9yIHRoZSBuZXcgZHJhZnRcbiAqIEBwYXJhbSBvQXBwQ29tcG9uZW50IFRoZSBBcHBDb21wb25lbnRcbiAqIEBwYXJhbSBtUGFyYW1ldGVycyBUaGUgcGFyYW1ldGVyc1xuICogQHBhcmFtIFttUGFyYW1ldGVycy5vVmlld10gVGhlIHZpZXdcbiAqIEBwYXJhbSBbbVBhcmFtZXRlcnMuYlByZXNlcnZlQ2hhbmdlc10gUHJlc2VydmUgY2hhbmdlcyBvZiBhbiBleGlzdGluZyBkcmFmdCBvZiBhbm90aGVyIHVzZXJcbiAqIEBwYXJhbSBncm91cElkIFRoZSBiYXRjaCBncm91cElkIGZvciBwb3N0IGNhbGwgb2YgZWRpdCBhY3Rpb25cbiAqIEBwYXJhbSBtZXNzYWdlSGFuZGxlciBUaGUgbWVzc2FnZSBoYW5kbGVyIGNvbnRyb2xsZXIgZXh0ZW5zaW9uXG4gKiBAcGFyYW0gdHJhbnNhY3Rpb25EZXRhaWxzIE9wdGlvbmFsIG9iamVjdCB0byByZXR1cm4gYWRkaXRpb25hbCBkZXRhaWxzIGFib3V0IGhvdyB0aGUgdHJhbnNhY3Rpb24gd2FzIGV4ZWN1dGVkXG4gKiBAcGFyYW0gdHJhbnNhY3Rpb25EZXRhaWxzLmV4aXN0aW5nRHJhZnRSZXVzZWQgQW4gZXhpc3RpbmcgZHJhZnQgd2FzIHJldHVybmVkLCBpbnN0ZWFkIG9mIHJldHVybmluZyBhIG5ldyBvbmVcbiAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgd2l0aCB0aGUge0BsaW5rIHNhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0IGNvbnRleHR9IG9mIHRoZSBuZXcgZHJhZnQgZG9jdW1lbnRcbiAqL1xuYXN5bmMgZnVuY3Rpb24gY3JlYXRlRHJhZnRGcm9tQWN0aXZlRG9jdW1lbnQoXG5cdG9Db250ZXh0OiBDb250ZXh0LFxuXHRvQXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsXG5cdG1QYXJhbWV0ZXJzOiB7XG5cdFx0b1ZpZXc6IEZFVmlldztcblx0XHRiUHJlc2VydmVDaGFuZ2VzPzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcblx0fSxcblx0Z3JvdXBJZDogc3RyaW5nLFxuXHRtZXNzYWdlSGFuZGxlcjogTWVzc2FnZUhhbmRsZXIsXG5cdHRyYW5zYWN0aW9uRGV0YWlscz86IHtcblx0XHRleGlzdGluZ0RyYWZ0UmV1c2VkPzogYm9vbGVhbjtcblx0fVxuKTogUHJvbWlzZTxDb250ZXh0IHwgdW5kZWZpbmVkPiB7XG5cdGNvbnN0IG1QYXJhbSA9IG1QYXJhbWV0ZXJzIHx8IHt9LFxuXHRcdGJSdW5QcmVzZXJ2ZUNoYW5nZXNGbG93ID1cblx0XHRcdHR5cGVvZiBtUGFyYW0uYlByZXNlcnZlQ2hhbmdlcyA9PT0gXCJ1bmRlZmluZWRcIiB8fCAodHlwZW9mIG1QYXJhbS5iUHJlc2VydmVDaGFuZ2VzID09PSBcImJvb2xlYW5cIiAmJiBtUGFyYW0uYlByZXNlcnZlQ2hhbmdlcyk7IC8vZGVmYXVsdCB0cnVlXG5cblx0LyoqXG5cdCAqIE92ZXJ3cml0ZSB0aGUgZXhpc3RpbmcgY2hhbmdlLlxuXHQgKiBAcGFyYW0gcmVzcG9uc2UgQ29udGV4dCBvZiB0aGUgYWN0aXZlIGRvY3VtZW50IGZvciB0aGUgbmV3IGRyYWZ0IG9yIHRoZSBlcnJvciByZXRyaWV2ZWRcblx0ICogQHJldHVybnMgUmVzb2x2ZXMgd2l0aCByZXN1bHQgb2Yge0BsaW5rIHNhcC5mZS5jb3JlLmFjdGlvbnMjZXhlY3V0ZURyYWZ0RWRpdEFjdGlvbn1cblx0ICovXG5cdGFzeW5jIGZ1bmN0aW9uIG92ZXJ3cml0ZUNoYW5nZShyZXNwb25zZTogQ29udGV4dCB8IENvbnRleHRFcnJvclR5cGUpOiBQcm9taXNlPENvbnRleHQgfCBDb250ZXh0RXJyb3JUeXBlIHwgdW5kZWZpbmVkPiB7XG5cdFx0Ly9PdmVyd3JpdGUgZXhpc3RpbmcgY2hhbmdlc1xuXHRcdGNvbnN0IG9Nb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCk7XG5cdFx0Y29uc3QgZHJhZnREYXRhQ29udGV4dCA9IG9Nb2RlbC5iaW5kQ29udGV4dChgJHtvQ29udGV4dC5nZXRQYXRoKCl9L0RyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhYCkuZ2V0Qm91bmRDb250ZXh0KCk7XG5cdFx0Y29uc3QgcmVzb3VyY2VNb2RlbCA9IGdldFJlc291cmNlTW9kZWwobVBhcmFtZXRlcnMub1ZpZXcpO1xuXHRcdGNvbnN0IGRyYWZ0QWRtaW5EYXRhID0gYXdhaXQgZHJhZnREYXRhQ29udGV4dC5yZXF1ZXN0T2JqZWN0KCk7XG5cdFx0aWYgKGRyYWZ0QWRtaW5EYXRhKSB7XG5cdFx0XHQvLyByZW1vdmUgYWxsIHVuYm91bmQgdHJhbnNpdGlvbiBtZXNzYWdlcyBhcyB3ZSBzaG93IGEgc3BlY2lhbCBkaWFsb2dcblx0XHRcdG1lc3NhZ2VIYW5kbGluZy5yZW1vdmVVbmJvdW5kVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cdFx0XHRsZXQgc0luZm8gPSBkcmFmdEFkbWluRGF0YS5JblByb2Nlc3NCeVVzZXJEZXNjcmlwdGlvbiB8fCBkcmFmdEFkbWluRGF0YS5JblByb2Nlc3NCeVVzZXI7XG5cdFx0XHRjb25zdCBzRW50aXR5U2V0ID0gbVBhcmFtZXRlcnMub1ZpZXcuZ2V0Vmlld0RhdGEoKS5lbnRpdHlTZXQ7XG5cdFx0XHRpZiAoc0luZm8pIHtcblx0XHRcdFx0Y29uc3Qgc0xvY2tlZEJ5VXNlck1zZyA9IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfRFJBRlRfT0JKRUNUX1BBR0VfRFJBRlRfTE9DS0VEX0JZX1VTRVJcIiwgc0luZm8sIHNFbnRpdHlTZXQpO1xuXHRcdFx0XHRNZXNzYWdlQm94LmVycm9yKHNMb2NrZWRCeVVzZXJNc2cpO1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3Ioc0xvY2tlZEJ5VXNlck1zZyk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRzSW5mbyA9IGRyYWZ0QWRtaW5EYXRhLkNyZWF0ZWRCeVVzZXJEZXNjcmlwdGlvbiB8fCBkcmFmdEFkbWluRGF0YS5DcmVhdGVkQnlVc2VyO1xuXHRcdFx0XHRjb25zdCBzVW5zYXZlZENoYW5nZXNNc2cgPSByZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX0RSQUZUX09CSkVDVF9QQUdFX0RSQUZUX1VOU0FWRURfQ0hBTkdFU1wiLCBzSW5mbywgc0VudGl0eVNldCk7XG5cdFx0XHRcdGF3YWl0IGRyYWZ0LnNob3dFZGl0Q29uZmlybWF0aW9uTWVzc2FnZUJveChzVW5zYXZlZENoYW5nZXNNc2csIG9Db250ZXh0KTtcblx0XHRcdFx0cmV0dXJuIGRyYWZ0LmV4ZWN1dGVEcmFmdEVkaXRBY3Rpb24ob0NvbnRleHQsIGZhbHNlLCBtUGFyYW1ldGVycy5vVmlldywgZ3JvdXBJZCwgbWVzc2FnZUhhbmRsZXIsIHRydWUpOyAvLyB0cnVlIGJlY2F1c2Ugd2Ugb3ZlcndyaXRlIGNoYW5nZXNcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKChyZXNwb25zZSBhcyBDb250ZXh0RXJyb3JUeXBlKT8ubWVzc2FnZSkge1xuXHRcdFx0TWVzc2FnZUJveC5lcnJvcigocmVzcG9uc2UgYXMgQ29udGV4dEVycm9yVHlwZSkubWVzc2FnZSk7XG5cdFx0fVxuXHRcdHRocm93IG5ldyBFcnJvcihgRHJhZnQgY3JlYXRpb24gYWJvcnRlZCBmb3IgZG9jdW1lbnQ6ICR7b0NvbnRleHQuZ2V0UGF0aCgpfWApO1xuXHR9XG5cblx0aWYgKCFvQ29udGV4dCkge1xuXHRcdHRocm93IG5ldyBFcnJvcihcIkJpbmRpbmcgY29udGV4dCB0byBhY3RpdmUgZG9jdW1lbnQgaXMgcmVxdWlyZWRcIik7XG5cdH1cblx0bGV0IG9EcmFmdENvbnRleHQ6IENvbnRleHQgfCBDb250ZXh0RXJyb3JUeXBlIHwgdW5kZWZpbmVkO1xuXHR0cnkge1xuXHRcdG9EcmFmdENvbnRleHQgPSBhd2FpdCBkcmFmdC5leGVjdXRlRHJhZnRFZGl0QWN0aW9uKG9Db250ZXh0LCBiUnVuUHJlc2VydmVDaGFuZ2VzRmxvdywgbVBhcmFtZXRlcnMub1ZpZXcsIGdyb3VwSWQsIG1lc3NhZ2VIYW5kbGVyKTtcblx0fSBjYXRjaCAob1Jlc3BvbnNlKSB7XG5cdFx0aWYgKChvUmVzcG9uc2UgYXMgQ29udGV4dEVycm9yVHlwZSkuc3RhdHVzID09PSA0MDkgfHwgKG9SZXNwb25zZSBhcyBDb250ZXh0RXJyb3JUeXBlKS5zdGF0dXMgPT09IDQyMykge1xuXHRcdFx0bWVzc2FnZUhhbmRsaW5nLnJlbW92ZUJvdW5kVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cdFx0XHRtZXNzYWdlSGFuZGxpbmcucmVtb3ZlVW5ib3VuZFRyYW5zaXRpb25NZXNzYWdlcygpO1xuXHRcdFx0Y29uc3QgYmluZGluZ1BhcmFtZXRlcnMgPSBNb2RlbEhlbHBlci5pc0NvbGxhYm9yYXRpb25EcmFmdFN1cHBvcnRlZChvQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpKVxuXHRcdFx0XHQ/IHsgJHNlbGVjdDogXCJEcmFmdEFkbWluaXN0cmF0aXZlRGF0YS9EcmFmdEFkbWluaXN0cmF0aXZlVXNlclwiIH1cblx0XHRcdFx0OiB1bmRlZmluZWQ7XG5cdFx0XHRjb25zdCBzaWJsaW5nSW5mbyA9IGF3YWl0IGRyYWZ0LmNvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24oXG5cdFx0XHRcdG9Db250ZXh0LFxuXHRcdFx0XHRvQ29udGV4dCxcblx0XHRcdFx0dW5kZWZpbmVkLFxuXHRcdFx0XHR1bmRlZmluZWQsXG5cdFx0XHRcdGJpbmRpbmdQYXJhbWV0ZXJzLFxuXHRcdFx0XHRvQXBwQ29tcG9uZW50Ll9pc0ZjbEVuYWJsZWQoKVxuXHRcdFx0KTtcblx0XHRcdGlmIChzaWJsaW5nSW5mbz8udGFyZ2V0Q29udGV4dCkge1xuXHRcdFx0XHQvL3RoZXJlIGlzIGEgY29udGV4dCBhdXRob3JpemVkIHRvIGJlIGVkaXRlZCBieSB0aGUgY3VycmVudCB1c2VyXG5cdFx0XHRcdGF3YWl0IENvbW1vblV0aWxzLndhaXRGb3JDb250ZXh0UmVxdWVzdGVkKHNpYmxpbmdJbmZvLnRhcmdldENvbnRleHQpO1xuXHRcdFx0XHRpZiAodHJhbnNhY3Rpb25EZXRhaWxzKSB7XG5cdFx0XHRcdFx0dHJhbnNhY3Rpb25EZXRhaWxzLmV4aXN0aW5nRHJhZnRSZXVzZWQgPSB0cnVlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIHNpYmxpbmdJbmZvLnRhcmdldENvbnRleHQ7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvL3RoZXJlIGlzIG5vIGRyYWZ0IG93bmVkIGJ5IHRoZSBjdXJyZW50IHVzZXJcblx0XHRcdFx0b0RyYWZ0Q29udGV4dCA9IGF3YWl0IG92ZXJ3cml0ZUNoYW5nZShvUmVzcG9uc2UgYXMgQ29udGV4dEVycm9yVHlwZSk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmICghKG9SZXNwb25zZSAmJiAob1Jlc3BvbnNlIGFzIENvbnRleHRFcnJvclR5cGUpLmNhbmNlbGVkKSkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKG9SZXNwb25zZSBhcyBzdHJpbmcpO1xuXHRcdH1cblx0fVxuXG5cdGlmIChvRHJhZnRDb250ZXh0KSB7XG5cdFx0Y29uc3Qgc0VkaXRBY3Rpb25OYW1lID0gZHJhZnQuZ2V0QWN0aW9uTmFtZShvRHJhZnRDb250ZXh0IGFzIENvbnRleHQsIGRyYWZ0T3BlcmF0aW9ucy5FRElUKTtcblx0XHRjb25zdCBvU2lkZUVmZmVjdHMgPSBvQXBwQ29tcG9uZW50LmdldFNpZGVFZmZlY3RzU2VydmljZSgpLmdldE9EYXRhQWN0aW9uU2lkZUVmZmVjdHMoc0VkaXRBY3Rpb25OYW1lLCBvRHJhZnRDb250ZXh0IGFzIENvbnRleHQpO1xuXHRcdGlmIChvU2lkZUVmZmVjdHM/LnRyaWdnZXJBY3Rpb25zPy5sZW5ndGgpIHtcblx0XHRcdGF3YWl0IG9BcHBDb21wb25lbnQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKCkucmVxdWVzdFNpZGVFZmZlY3RzRm9yT0RhdGFBY3Rpb24ob1NpZGVFZmZlY3RzLCBvRHJhZnRDb250ZXh0IGFzIENvbnRleHQpO1xuXHRcdFx0cmV0dXJuIG9EcmFmdENvbnRleHQgYXMgQ29udGV4dDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIG9EcmFmdENvbnRleHQgYXMgQ29udGV4dDtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxufVxuLyoqXG4gKiBDcmVhdGVzIGFuIGFjdGl2ZSBkb2N1bWVudCBmcm9tIGEgZHJhZnQgZG9jdW1lbnQuXG4gKlxuICogVGhlIGZ1bmN0aW9uIHN1cHBvcnRzIHNldmVyYWwgaG9va3MgYXMgdGhlcmUgaXMgYSBjZXJ0YWluIGNob3Jlb2dyYXBoeSBkZWZpbmVkLlxuICogQHBhcmFtIG9Db250ZXh0IENvbnRleHQgb2YgdGhlIGFjdGl2ZSBkb2N1bWVudCBmb3IgdGhlIG5ldyBkcmFmdFxuICogQHBhcmFtIG9BcHBDb21wb25lbnQgVGhlIEFwcENvbXBvbmVudFxuICogQHBhcmFtIG1lc3NhZ2VIYW5kbGVyIFRoZSBtZXNzYWdlIGhhbmRsZXIgY29udHJvbGxlciBleHRlbnNpb25cbiAqIEBwYXJhbSBtUGFyYW1ldGVycyBUaGUgcGFyYW1ldGVyc1xuICogQHBhcmFtIFttUGFyYW1ldGVycy5mbkJlZm9yZUFjdGl2YXRlRG9jdW1lbnRdIENhbGxiYWNrIHRoYXQgYWxsb3dzIGEgdmV0byBiZWZvcmUgdGhlICdDcmVhdGUnIHJlcXVlc3QgaXMgZXhlY3V0ZWRcbiAqIEBwYXJhbSBbbVBhcmFtZXRlcnMuZm5BZnRlckFjdGl2YXRlRG9jdW1lbnRdIENhbGxiYWNrIGZvciBwb3N0cHJvY2Vzc2luZyBhZnRlciBkb2N1bWVudCB3YXMgYWN0aXZhdGVkLlxuICogQHBhcmFtIFttUGFyYW1ldGVycy5yZXNvdXJjZU1vZGVsXSBSZXNvdXJjZSBNb2RlbFxuICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyB3aXRoIHRoZSB7QGxpbmsgc2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHQgY29udGV4dH0gb2YgdGhlIG5ldyBkcmFmdCBkb2N1bWVudFxuICovXG5hc3luYyBmdW5jdGlvbiBhY3RpdmF0ZURvY3VtZW50KFxuXHRvQ29udGV4dDogQ29udGV4dCxcblx0b0FwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LFxuXHRtZXNzYWdlSGFuZGxlcjogTWVzc2FnZUhhbmRsZXIsXG5cdG1QYXJhbWV0ZXJzOiB7IGZuQmVmb3JlQWN0aXZhdGVEb2N1bWVudD86IEZ1bmN0aW9uOyBmbkFmdGVyQWN0aXZhdGVEb2N1bWVudD86IEZ1bmN0aW9uOyByZXNvdXJjZU1vZGVsPzogUmVzb3VyY2VNb2RlbCB9LFxuXHRpc1N0YW5kYXJkU2F2ZT86IGJvb2xlYW4gfCB1bmRlZmluZWRcbik6IFByb21pc2U8Q29udGV4dD4ge1xuXHRjb25zdCBtUGFyYW0gPSBtUGFyYW1ldGVycyB8fCB7fTtcblx0aWYgKCFvQ29udGV4dCkge1xuXHRcdHRocm93IG5ldyBFcnJvcihcIkJpbmRpbmcgY29udGV4dCB0byBkcmFmdCBkb2N1bWVudCBpcyByZXF1aXJlZFwiKTtcblx0fVxuXG5cdGNvbnN0IGJFeGVjdXRlID0gbVBhcmFtLmZuQmVmb3JlQWN0aXZhdGVEb2N1bWVudCA/IGF3YWl0IG1QYXJhbS5mbkJlZm9yZUFjdGl2YXRlRG9jdW1lbnQob0NvbnRleHQpIDogdHJ1ZTtcblx0aWYgKCFiRXhlY3V0ZSkge1xuXHRcdHRocm93IG5ldyBFcnJvcihgQWN0aXZhdGlvbiBvZiB0aGUgZG9jdW1lbnQgd2FzIGFib3J0ZWQgYnkgZXh0ZW5zaW9uIGZvciBkb2N1bWVudDogJHtvQ29udGV4dC5nZXRQYXRoKCl9YCk7XG5cdH1cblxuXHRsZXQgb0FjdGl2ZURvY3VtZW50Q29udGV4dDogQ29udGV4dDtcblx0aWYgKCFkcmFmdC5oYXNQcmVwYXJlQWN0aW9uKG9Db250ZXh0KSkge1xuXHRcdG9BY3RpdmVEb2N1bWVudENvbnRleHQgPSBhd2FpdCBleGVjdXRlRHJhZnRBY3RpdmF0aW9uQWN0aW9uKFxuXHRcdFx0b0NvbnRleHQsXG5cdFx0XHRvQXBwQ29tcG9uZW50LFxuXHRcdFx0bWVzc2FnZUhhbmRsZXIsXG5cdFx0XHR1bmRlZmluZWQsXG5cdFx0XHR1bmRlZmluZWQsXG5cdFx0XHRtUGFyYW1ldGVycy5yZXNvdXJjZU1vZGVsXG5cdFx0KTtcblx0fSBlbHNlIHtcblx0XHQvKiBhY3RpdmF0aW9uIHJlcXVpcmVzIHByZXBhcmF0aW9uICovXG5cdFx0Y29uc3Qgc0JhdGNoR3JvdXAgPSBcIiRhdXRvXCI7XG5cdFx0Ly93aGVuIHRoZXJlIGFyZSBwZW5kaW5nIGNoYW5nZXMgdGhlcmUgd2lsbCBiZSBhIHBhdGNoIHJlcXVlc3QgbWVyZ2VkIHRvZ2V0aGVyIHdpdGggdGhlIGRyYWZ0UHJlcGFyZSBhbmQgZHJhZnRBY2l2YXRlLlxuXHRcdC8vVGhlIHBhdGNoIGNoYW5nZXMgdGhlIEV0YWcsIHRoZXJmb3JlIHRoZSBwcmVwYXJlIG5lZWRzIHRvIGlnbm9yZSBFdGFnc1xuXHRcdGNvbnN0IGlnbm9yZUV0YWc6IGJvb2xlYW4gPSBvQ29udGV4dC5nZXRNb2RlbCgpLmhhc1BlbmRpbmdDaGFuZ2VzKFwiJGF1dG9cIikgPyB0cnVlIDogZmFsc2U7XG5cdFx0Ly8gd2UgdXNlIHRoZSBzYW1lIGJhdGNoR3JvdXAgdG8gZm9yY2UgcHJlcGFyZSBhbmQgYWN0aXZhdGUgaW4gYSBzYW1lIGJhdGNoIGJ1dCB3aXRoIGRpZmZlcmVudCBjaGFuZ2VzZXRcblx0XHRjb25zdCBvUHJlcGFyZVByb21pc2UgPSBkcmFmdC5leGVjdXRlRHJhZnRQcmVwYXJhdGlvbkFjdGlvbihvQ29udGV4dCwgc0JhdGNoR3JvdXAsIHVuZGVmaW5lZCwgaWdub3JlRXRhZyk7XG5cdFx0b0NvbnRleHQuZ2V0TW9kZWwoKS5zdWJtaXRCYXRjaChzQmF0Y2hHcm91cCk7XG5cdFx0Y29uc3Qgb0FjdGl2YXRlUHJvbWlzZSA9IGRyYWZ0LmV4ZWN1dGVEcmFmdEFjdGl2YXRpb25BY3Rpb24oXG5cdFx0XHRvQ29udGV4dCxcblx0XHRcdG9BcHBDb21wb25lbnQsXG5cdFx0XHRtZXNzYWdlSGFuZGxlcixcblx0XHRcdHNCYXRjaEdyb3VwLFxuXHRcdFx0b1ByZXBhcmVQcm9taXNlLFxuXHRcdFx0bVBhcmFtZXRlcnMucmVzb3VyY2VNb2RlbCxcblx0XHRcdGlzU3RhbmRhcmRTYXZlXG5cdFx0KTtcblxuXHRcdGNvbnN0IHZhbHVlcyA9IGF3YWl0IFByb21pc2UuYWxsKFtvUHJlcGFyZVByb21pc2UsIG9BY3RpdmF0ZVByb21pc2VdKTtcblx0XHRvQWN0aXZlRG9jdW1lbnRDb250ZXh0ID0gdmFsdWVzWzFdO1xuXHR9XG5cdHJldHVybiBtUGFyYW0uZm5BZnRlckFjdGl2YXRlRG9jdW1lbnQgPyBtUGFyYW0uZm5BZnRlckFjdGl2YXRlRG9jdW1lbnQob0NvbnRleHQsIG9BY3RpdmVEb2N1bWVudENvbnRleHQpIDogb0FjdGl2ZURvY3VtZW50Q29udGV4dDtcbn1cblxuLyoqXG4gKiBEaXNwbGF5IHRoZSBjb25maXJtYXRpb24gZGlhbG9nIGJveCBhZnRlciBwcmVzc2luZyB0aGUgZWRpdCBidXR0b24gb2YgYW4gb2JqZWN0IHBhZ2Ugd2l0aCB1bnNhdmVkIGNoYW5nZXMuXG4gKiBAcGFyYW0gc1Vuc2F2ZWRDaGFuZ2VzTXNnIERpYWxvZyBib3ggbWVzc2FnZSBpbmZvcm1pbmcgdGhlIHVzZXIgdGhhdCBpZiBoZSBzdGFydHMgZWRpdGluZywgdGhlIHByZXZpb3VzIHVuc2F2ZWQgY2hhbmdlcyB3aWxsIGJlIGxvc3RcbiAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IG9mIHRoZSBhY3RpdmUgZG9jdW1lbnQgZm9yIHRoZSBuZXcgZHJhZnRcbiAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXNcbiAqL1xuYXN5bmMgZnVuY3Rpb24gc2hvd0VkaXRDb25maXJtYXRpb25NZXNzYWdlQm94KHNVbnNhdmVkQ2hhbmdlc01zZzogc3RyaW5nLCBvQ29udGV4dDogQ29udGV4dCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRjb25zdCBsb2NhbEkxOG5SZWYgPSBMaWJyYXJ5LmdldFJlc291cmNlQnVuZGxlRm9yKFwic2FwLmZlLmNvcmVcIikhO1xuXHRyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmU6ICh2YWx1ZTogYm9vbGVhbikgPT4gdm9pZCwgcmVqZWN0OiAocmVhc29uPzogdW5rbm93bikgPT4gdm9pZCkge1xuXHRcdGNvbnN0IG9EaWFsb2cgPSBuZXcgRGlhbG9nKHtcblx0XHRcdHRpdGxlOiBsb2NhbEkxOG5SZWYuZ2V0VGV4dChcIkNfTUVTU0FHRV9IQU5ETElOR19TQVBGRV9FUlJPUl9NRVNTQUdFU19QQUdFX1RJVExFX1dBUk5JTkdcIiksXG5cdFx0XHRzdGF0ZTogXCJXYXJuaW5nXCIsXG5cdFx0XHRjb250ZW50OiBuZXcgVGV4dCh7XG5cdFx0XHRcdHRleHQ6IHNVbnNhdmVkQ2hhbmdlc01zZ1xuXHRcdFx0fSksXG5cdFx0XHRiZWdpbkJ1dHRvbjogbmV3IEJ1dHRvbih7XG5cdFx0XHRcdHRleHQ6IGxvY2FsSTE4blJlZi5nZXRUZXh0KFwiQ19DT01NT05fT0JKRUNUX1BBR0VfRURJVFwiKSxcblx0XHRcdFx0dHlwZTogXCJFbXBoYXNpemVkXCIsXG5cdFx0XHRcdHByZXNzOiBmdW5jdGlvbiAoKTogdm9pZCB7XG5cdFx0XHRcdFx0b0RpYWxvZy5jbG9zZSgpO1xuXHRcdFx0XHRcdHJlc29sdmUodHJ1ZSk7XG5cdFx0XHRcdH1cblx0XHRcdH0pLFxuXHRcdFx0ZW5kQnV0dG9uOiBuZXcgQnV0dG9uKHtcblx0XHRcdFx0dGV4dDogbG9jYWxJMThuUmVmLmdldFRleHQoXCJDX0NPTU1PTl9PQkpFQ1RfUEFHRV9DQU5DRUxcIiksXG5cdFx0XHRcdHByZXNzOiBmdW5jdGlvbiAoKTogdm9pZCB7XG5cdFx0XHRcdFx0b0RpYWxvZy5jbG9zZSgpO1xuXHRcdFx0XHRcdHJlamVjdChgRHJhZnQgY3JlYXRpb24gYWJvcnRlZCBmb3IgZG9jdW1lbnQ6ICR7b0NvbnRleHQuZ2V0UGF0aCgpfWApO1xuXHRcdFx0XHR9XG5cdFx0XHR9KSxcblx0XHRcdGFmdGVyQ2xvc2U6IGZ1bmN0aW9uICgpOiB2b2lkIHtcblx0XHRcdFx0b0RpYWxvZy5kZXN0cm95KCk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0b0RpYWxvZy5hZGRTdHlsZUNsYXNzKFwic2FwVWlDb250ZW50UGFkZGluZ1wiKTtcblx0XHRvRGlhbG9nLm9wZW4oKTtcblx0fSk7XG59XG5cbi8qKlxuICogSFRUUCBQT1NUIGNhbGwgd2hlbiBEcmFmdEFjdGlvbiBpcyBwcmVzZW50IGZvciBEcmFmdCBEZWxldGU7IEhUVFAgREVMRVRFIGNhbGwgd2hlbiB0aGVyZSBpcyBubyBEcmFmdEFjdGlvblxuICogYW5kIEFjdGl2ZSBJbnN0YW5jZSBhbHdheXMgdXNlcyBERUxFVEUuXG4gKiBAcGFyYW0gb0NvbnRleHQgQ29udGV4dCBvZiB0aGUgZG9jdW1lbnQgdG8gYmUgZGlzY2FyZGVkXG4gKiBAcGFyYW0gbWVzc2FnZUhhbmRsZXIgVGhlIG1lc3NhZ2UgaGFuZGxlciBjb250cm9sbGVyIGV4dGVuc2lvblxuICogQHBhcmFtIG9BcHBDb21wb25lbnQgQ29udGV4dCBvZiB0aGUgZG9jdW1lbnQgdG8gYmUgZGlzY2FyZGVkXG4gKiBAcGFyYW0gYkVuYWJsZVN0cmljdEhhbmRsaW5nXG4gKiBAcmV0dXJucyBBIFByb21pc2UgcmVzb2x2ZWQgd2hlbiB0aGUgY29udGV4dCBpcyBkZWxldGVkXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZURyYWZ0KFxuXHRvQ29udGV4dDogQ29udGV4dCxcblx0bWVzc2FnZUhhbmRsZXI6IE1lc3NhZ2VIYW5kbGVyLFxuXHRvQXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsXG5cdGJFbmFibGVTdHJpY3RIYW5kbGluZz86IGJvb2xlYW5cbik6IFByb21pc2U8dm9pZD4ge1xuXHRpZiAob0NvbnRleHQuaXNUcmFuc2llbnQoKSkge1xuXHRcdC8vIFRyYW5zaWVudCBjb250ZXh0cyAoZS5nLiB3aGVuIHRyeWluZyB0byBkZWxldGUgYSBjb250ZXh0IHdoaWNoIGNvdWxkbid0IGJlIGNyZWF0ZWQgYmVjYXVzZSBvZiBhbiBlcnJvcikgY2FuIGJlIGRlbGV0ZWQgaW1tZWRpYXRlbHlcblx0XHRyZXR1cm4gb0NvbnRleHQuZGVsZXRlKCk7XG5cdH1cblx0Y29uc3Qgc0Rpc2NhcmRBY3Rpb24gPSBnZXRBY3Rpb25OYW1lKG9Db250ZXh0LCBkcmFmdE9wZXJhdGlvbnMuRElTQ0FSRCk7XG5cdGNvbnN0IGJJc0FjdGl2ZUVudGl0eSA9IG9Db250ZXh0LmdldE9iamVjdCgpLklzQWN0aXZlRW50aXR5O1xuXG5cdGlmIChiSXNBY3RpdmVFbnRpdHkgfHwgKCFiSXNBY3RpdmVFbnRpdHkgJiYgIXNEaXNjYXJkQWN0aW9uKSkge1xuXHRcdC8vVXNlIERlbGV0ZSBpbiBjYXNlIG9mIGFjdGl2ZSBlbnRpdHkgYW5kIG5vIGRpc2NhcmQgYWN0aW9uIGF2YWlsYWJsZSBmb3IgZHJhZnRcblx0XHRpZiAob0NvbnRleHQuaGFzUGVuZGluZ0NoYW5nZXMoKSAmJiAhb0NvbnRleHQuaXNJbmFjdGl2ZSgpKSB7XG5cdFx0XHRhd2FpdCBvQ29udGV4dC5nZXRCaW5kaW5nKCkucmVzZXRDaGFuZ2VzKCk7XG5cdFx0XHRyZXR1cm4gb0NvbnRleHQuZGVsZXRlKCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIFdoZW4gY2FuY2VsbGluZyBhbiBlZGl0IGRyYWZ0IHJvb3Qgbm9kZSwgdXNlIG1vZGVsLmRlbGV0ZSBpbnN0ZWFkIG9mIGNvbnRleHQuZGVsZXRlLCB0byBvbmx5IHNlbmQgZGVsZXRpb24gdG8gYmFja2VuZCxcblx0XHRcdC8vIGJ1dCBrZWVwIGNvbnRleHQgYWxpdmUgKGluY2x1ZGluZyBiaW5kaW5ncykuIFRodXMsIHdlIGNhbiBlbnN1cmUgc2VhbWxlc3MgdHJhbnNpc3Rpb24gZnJvbSBkcmFmdCB0byBhY3RpdmUgaW5zdGFuY2Vcblx0XHRcdC8vICh3aXRob3V0IGludGVybWVkaWF0ZSB1bmRlZmluZWQgYmluZGluZ3MgZS5nLiBsZWFkaW5nIHRvIGZsaWNrZXJpbmcpLiBUaGlzIGRvZXNuJ3Qgd29yayBpbiBjYXNlIG9mIEZDTCBhcHBzLCBhc1xuXHRcdFx0Ly8gbW9kZWwuZGVsZXRlIGRvZXNuJ3QgY2xlYW4gdXAgdGhlIHBhcmVudCBsaXN0QmluZGluZyBwcm9wZXJseSwgbGVhZGluZyB0byBpbmNvcnJlY3QgT0RhdGEgcmVxdWVzdHMuXG5cdFx0XHQvLyBJbiBvdGhlciBjYXNlcyAoZGVsZXRpbmcgYWN0aXZlLCBkaXNjYXJkaW5nIGNyZWF0ZSBkcmFmdCBvciBkaXNjYXJkaW5nIGRyYWZ0IG5vZGUpLCBzdGF5IHdpdGggY29udGV4dC5kZWxldGUuXG5cdFx0XHQvLyBXaGVuIGNhbmNlbGxpbmcgYSBjcmVhdGUgZHJhZnQsIHBhZ2UgaXMgY2xvc2VkLCB0aHVzIHRoZSBwcm9ibGVtIG9mIGZsaWNrZXJpbmcgY2Fubm90IG9jY3VyLlxuXHRcdFx0Ly8gSW4gY2FzZSBvZiBkaXNjYXJkaW5nIGEgZHJhZnQgbm9kZSwgdGhlb3JldGljYWxseSB0aGUgc2FtZSBwcm9ibGVtIGNvdWxkXG5cdFx0XHQvLyBvY2N1ciwgYnV0IG5lZWRzIHF1aXRlIHNwZWNpZmljIG1vZGVsbGluZyAoYnV0dG9uIHZpc2liaWxpdHkgb24gaXRlbSBsZXZlbCBib3VuZCBhZ2FpbnN0IHNlcnZpY2UgcHJvcGVydHkgaW4gYW4gRkNMIGFwcClcblx0XHRcdC8vIGFuZCBhY3RpbmcgKGxvb2tpbmcgYXQgYnV0dG9uIG9uIHRoaXJkIGNvbHVtbiB3aGlsZSBkaXNjYXJkaW5nIG9uIDJuZCBjb2x1bW4pLiBDdXJyZW50bHksIG1vZGVsIHNlZW1zIG5vdCB0byBiZSBwcmVwYXJlZFxuXHRcdFx0Ly8gZm9yIHRoYXQgY2FzZSwgdGh1cyBkdWUgdG8gdGhlIG1pbmltYWwgaW1wYWN0IChvbmx5IGludGVybWVkaWF0ZSB2aXN1YWwgc3RhdGUpLCBhY2NlcHRpbmcgdGhpcyBmb3IgdGhlIHRpbWUgYmVpbmcuXG5cdFx0XHRyZXR1cm4gIW9BcHBDb21wb25lbnQuX2lzRmNsRW5hYmxlZCgpICYmXG5cdFx0XHRcdCFvQ29udGV4dC5nZXRQcm9wZXJ0eShcIklzQWN0aXZlRW50aXR5XCIpICYmXG5cdFx0XHRcdE1vZGVsSGVscGVyLmlzRHJhZnRSb290KFxuXHRcdFx0XHRcdGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyhvQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpLmdldE1ldGFDb250ZXh0KG9Db250ZXh0LmdldFBhdGgoKSkpPy50YXJnZXRFbnRpdHlTZXRcblx0XHRcdFx0KSAmJlxuXHRcdFx0XHRvQ29udGV4dC5nZXRQcm9wZXJ0eShcIkhhc0FjdGl2ZUVudGl0eVwiKVxuXHRcdFx0XHQ/IG9Db250ZXh0LmdldE1vZGVsKCkuZGVsZXRlKG9Db250ZXh0KVxuXHRcdFx0XHQ6IG9Db250ZXh0LmRlbGV0ZSgpO1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHQvL1VzZSBEaXNjYXJkIFBvc3QgQWN0aW9uIGlmIGl0IGlzIGEgZHJhZnQgZW50aXR5IGFuZCBkaXNjYXJkIGFjdGlvbiBleGlzdHNcblx0XHRhd2FpdCBleGVjdXRlRHJhZnREaXNjYXJkQWN0aW9uKG9Db250ZXh0LCBtZXNzYWdlSGFuZGxlciwgb0FwcENvbXBvbmVudCwgYkVuYWJsZVN0cmljdEhhbmRsaW5nKTtcblx0fVxufVxuXG5jb25zdCBkcmFmdCA9IHtcblx0Y3JlYXRlRHJhZnRGcm9tQWN0aXZlRG9jdW1lbnQ6IGNyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50LFxuXHRhY3RpdmF0ZURvY3VtZW50OiBhY3RpdmF0ZURvY3VtZW50LFxuXHRkZWxldGVEcmFmdDogZGVsZXRlRHJhZnQsXG5cdGV4ZWN1dGVEcmFmdEVkaXRBY3Rpb246IGV4ZWN1dGVEcmFmdEVkaXRBY3Rpb24sXG5cdGV4ZWN1dGVEcmFmdFZhbGlkYXRpb246IGV4ZWN1dGVEcmFmdFZhbGlkYXRpb24sXG5cdGV4ZWN1dGVEcmFmdFByZXBhcmF0aW9uQWN0aW9uOiBleGVjdXRlRHJhZnRQcmVwYXJhdGlvbkFjdGlvbixcblx0ZXhlY3V0ZURyYWZ0QWN0aXZhdGlvbkFjdGlvbjogZXhlY3V0ZURyYWZ0QWN0aXZhdGlvbkFjdGlvbixcblx0aGFzUHJlcGFyZUFjdGlvbjogaGFzUHJlcGFyZUFjdGlvbixcblx0Y29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbjogY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbixcblx0cHJvY2Vzc0RhdGFMb3NzT3JEcmFmdERpc2NhcmRDb25maXJtYXRpb246IGRyYWZ0RGF0YUxvc3NQb3B1cC5wcm9jZXNzRGF0YUxvc3NPckRyYWZ0RGlzY2FyZENvbmZpcm1hdGlvbixcblx0c2lsZW50bHlLZWVwRHJhZnRPbkZvcndhcmROYXZpZ2F0aW9uOiBkcmFmdERhdGFMb3NzUG9wdXAuc2lsZW50bHlLZWVwRHJhZnRPbkZvcndhcmROYXZpZ2F0aW9uLFxuXHRjcmVhdGVPcGVyYXRpb246IGNyZWF0ZU9wZXJhdGlvbixcblx0ZXhlY3V0ZURyYWZ0RGlzY2FyZEFjdGlvbjogZXhlY3V0ZURyYWZ0RGlzY2FyZEFjdGlvbixcblx0TmF2aWdhdGlvblR5cGU6IGRyYWZ0RGF0YUxvc3NQb3B1cC5OYXZpZ2F0aW9uVHlwZSxcblx0Z2V0QWN0aW9uTmFtZTogZ2V0QWN0aW9uTmFtZSxcblx0c2hvd0VkaXRDb25maXJtYXRpb25NZXNzYWdlQm94OiBzaG93RWRpdENvbmZpcm1hdGlvbk1lc3NhZ2VCb3hcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGRyYWZ0O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztFQXVGQTtFQUNBLE1BQU1BLGVBQWUsR0FBRztJQUN2QkMsSUFBSSxFQUFFLFlBQVk7SUFDbEJDLFVBQVUsRUFBRSxrQkFBa0I7SUFDOUJDLE9BQU8sRUFBRSxlQUFlO0lBQ3hCQyxPQUFPLEVBQUU7RUFDVixDQUFDOztFQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7RUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDQSxTQUFTQyxhQUFhQSxDQUFDQyxRQUFpQixFQUFFQyxVQUFrQixFQUFVO0lBQ3JFLE1BQU1DLE1BQU0sR0FBR0YsUUFBUSxDQUFDRyxRQUFRLENBQUMsQ0FBQztNQUNqQ0MsVUFBVSxHQUFHRixNQUFNLENBQUNHLFlBQVksQ0FBQyxDQUFDO01BQ2xDQyxjQUFjLEdBQUdGLFVBQVUsQ0FBQ0csV0FBVyxDQUFDUCxRQUFRLENBQUNRLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFFNUQsT0FBT0osVUFBVSxDQUFDSyxTQUFTLENBQUMsR0FBR0gsY0FBYyw2Q0FBNkNMLFVBQVUsRUFBRSxDQUFDO0VBQ3hHO0VBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDQSxTQUFTUyxlQUFlQSxDQUFDVixRQUFpQixFQUFFQyxVQUFrQixFQUFFVSxRQUFnQyxFQUF1QjtJQUN0SCxNQUFNQyxjQUFjLEdBQUdiLGFBQWEsQ0FBQ0MsUUFBUSxFQUFFQyxVQUFVLENBQUM7SUFFMUQsT0FBT0QsUUFBUSxDQUFDRyxRQUFRLENBQUMsQ0FBQyxDQUFDVSxXQUFXLENBQUMsR0FBR0QsY0FBYyxPQUFPLEVBQUVaLFFBQVEsRUFBRVcsUUFBUSxDQUFDO0VBQ3JGOztFQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNBLFNBQVNHLGtCQUFrQkEsQ0FBQ0MsT0FBZ0IsRUFBRUMsU0FBaUIsRUFBeUI7SUFDdkYs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
@@ -266,7 +266,8 @@ async function executeDraftActivationAction(
266
266
  messageHandler: MessageHandler,
267
267
  sGroupId?: string,
268
268
  oPreparePromise?: Promise<void | ODataContextBinding>,
269
- resourceModel?: ResourceModel
269
+ resourceModel?: ResourceModel,
270
+ isStandardSave?: boolean | undefined
270
271
  ): Promise<Context> {
271
272
  const bHasPrepareAction = draft.hasPrepareAction(oContext);
272
273
  // According to the draft spec if the service contains a prepare action and we trigger both prepare and
@@ -275,12 +276,13 @@ async function executeDraftActivationAction(
275
276
  let operation: Operation | undefined;
276
277
  if (!oContext.getProperty("IsActiveEntity")) {
277
278
  const convertedAction = getConvertedAction(oContext, draftOperations.ACTIVATION);
279
+ const label = isStandardSave ? resourceModel?.getText("T_OP_OBJECT_PAGE_SAVE") : resourceModel?.getText("C_OP_OBJECT_PAGE_SAVE");
278
280
  if (convertedAction) {
279
281
  try {
280
282
  operation = new Operation(oAppComponent, oContext.getModel(), convertedAction, {
281
283
  messageHandler: messageHandler,
282
284
  contexts: [oContext],
283
- label: resourceModel?.getText("T_OP_OBJECT_PAGE_SAVE"),
285
+ label: label,
284
286
  bindingParameters: { $$inheritExpandSelect: true },
285
287
  skipMessages: true,
286
288
  oDataProperties: {
@@ -736,7 +738,8 @@ async function activateDocument(
736
738
  oContext: Context,
737
739
  oAppComponent: AppComponent,
738
740
  messageHandler: MessageHandler,
739
- mParameters: { fnBeforeActivateDocument?: Function; fnAfterActivateDocument?: Function; resourceModel?: ResourceModel }
741
+ mParameters: { fnBeforeActivateDocument?: Function; fnAfterActivateDocument?: Function; resourceModel?: ResourceModel },
742
+ isStandardSave?: boolean | undefined
740
743
  ): Promise<Context> {
741
744
  const mParam = mParameters || {};
742
745
  if (!oContext) {
@@ -773,7 +776,8 @@ async function activateDocument(
773
776
  messageHandler,
774
777
  sBatchGroup,
775
778
  oPreparePromise,
776
- mParameters.resourceModel
779
+ mParameters.resourceModel,
780
+ isStandardSave
777
781
  );
778
782
 
779
783
  const values = await Promise.all([oPreparePromise, oActivatePromise]);