@sapui5/sap.fe.core 1.136.0 → 1.136.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (87) hide show
  1. package/package.json +1 -1
  2. package/src/sap/fe/core/.library +1 -1
  3. package/src/sap/fe/core/AppComponent.js +4 -6
  4. package/src/sap/fe/core/AppComponent.ts +4 -4
  5. package/src/sap/fe/core/CommonUtils.js +41 -14
  6. package/src/sap/fe/core/CommonUtils.ts +47 -16
  7. package/src/sap/fe/core/IRowBindingInterface.js +1 -1
  8. package/src/sap/fe/core/IRowBindingInterface.ts +1 -1
  9. package/src/sap/fe/core/buildingBlocks/BuildingBlock.js +4 -1
  10. package/src/sap/fe/core/buildingBlocks/BuildingBlock.ts +3 -0
  11. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.js +12 -4
  12. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.ts +10 -3
  13. package/src/sap/fe/core/controllerextensions/CollaborativeDraft.js +139 -5
  14. package/src/sap/fe/core/controllerextensions/CollaborativeDraft.ts +169 -4
  15. package/src/sap/fe/core/controllerextensions/EditFlow.js +48 -43
  16. package/src/sap/fe/core/controllerextensions/EditFlow.ts +54 -51
  17. package/src/sap/fe/core/controllerextensions/InlineEditFlow.js +39 -5
  18. package/src/sap/fe/core/controllerextensions/InlineEditFlow.ts +38 -1
  19. package/src/sap/fe/core/controllerextensions/InternalRouting.js +12 -13
  20. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +10 -11
  21. package/src/sap/fe/core/controllerextensions/MessageHandler.js +32 -21
  22. package/src/sap/fe/core/controllerextensions/MessageHandler.ts +31 -20
  23. package/src/sap/fe/core/controllerextensions/PageReady.js +6 -3
  24. package/src/sap/fe/core/controllerextensions/PageReady.ts +6 -2
  25. package/src/sap/fe/core/controllerextensions/Recommendations.js +3 -2
  26. package/src/sap/fe/core/controllerextensions/Recommendations.ts +7 -5
  27. package/src/sap/fe/core/controllerextensions/Share.js +6 -6
  28. package/src/sap/fe/core/controllerextensions/Share.ts +3 -4
  29. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +9 -11
  30. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.ts +8 -13
  31. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +9 -9
  32. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +20 -10
  33. package/src/sap/fe/core/controllerextensions/editFlow/draft.js +31 -8
  34. package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +46 -9
  35. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.js +2 -2
  36. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.ts +1 -1
  37. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataOperation.js +20 -18
  38. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataOperation.ts +37 -23
  39. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataStrictHandling.js +4 -3
  40. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataStrictHandling.ts +6 -1
  41. package/src/sap/fe/core/controllerextensions/editFlow/operations/Operation.js +6 -3
  42. package/src/sap/fe/core/controllerextensions/editFlow/operations/Operation.ts +11 -3
  43. package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +5 -2
  44. package/src/sap/fe/core/controllerextensions/editFlow/sticky.ts +3 -2
  45. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +2 -2
  46. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +1 -1
  47. package/src/sap/fe/core/controls/CommandExecution.js +1 -1
  48. package/src/sap/fe/core/controls/CommandExecution.ts +1 -1
  49. package/src/sap/fe/core/controls/HideFormGroupAutomatically.js +3 -2
  50. package/src/sap/fe/core/controls/HideFormGroupAutomatically.ts +2 -0
  51. package/src/sap/fe/core/converters/controls/Common/Action.js +5 -2
  52. package/src/sap/fe/core/converters/controls/Common/Action.ts +4 -1
  53. package/src/sap/fe/core/converters/controls/Common/Chart.js +7 -2
  54. package/src/sap/fe/core/converters/controls/Common/Chart.ts +11 -1
  55. package/src/sap/fe/core/converters/controls/Common/table/Columns.js +41 -58
  56. package/src/sap/fe/core/converters/controls/Common/table/Columns.ts +43 -111
  57. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +14 -6
  58. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +23 -6
  59. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +6 -3
  60. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +5 -2
  61. package/src/sap/fe/core/formatters/ValueFormatter.js +21 -1
  62. package/src/sap/fe/core/formatters/ValueFormatter.ts +19 -0
  63. package/src/sap/fe/core/fpm/manifest.json +1 -1
  64. package/src/sap/fe/core/helpers/DeleteHelper.js +2 -2
  65. package/src/sap/fe/core/helpers/DeleteHelper.ts +1 -1
  66. package/src/sap/fe/core/helpers/ModelHelper.js +2 -2
  67. package/src/sap/fe/core/helpers/ModelHelper.ts +1 -1
  68. package/src/sap/fe/core/helpers/PasteHelper.js +2 -2
  69. package/src/sap/fe/core/helpers/PasteHelper.ts +1 -1
  70. package/src/sap/fe/core/helpers/StableIdHelper.js +2 -2
  71. package/src/sap/fe/core/helpers/StableIdHelper.ts +4 -1
  72. package/src/sap/fe/core/helpers/TitleHelper.js +13 -6
  73. package/src/sap/fe/core/helpers/TitleHelper.ts +19 -6
  74. package/src/sap/fe/core/library.js +1 -1
  75. package/src/sap/fe/core/messagebundle.properties +0 -1
  76. package/src/sap/fe/core/rootView/Fcl.controller.js +9 -15
  77. package/src/sap/fe/core/rootView/Fcl.controller.ts +9 -15
  78. package/src/sap/fe/core/services/collaborativeDraftServiceFactory.js +9 -6
  79. package/src/sap/fe/core/services/collaborativeDraftServiceFactory.ts +7 -6
  80. package/src/sap/fe/core/templating/DataModelPathHelper.js +2 -2
  81. package/src/sap/fe/core/templating/DataModelPathHelper.ts +1 -1
  82. package/src/sap/fe/core/templating/EntitySetHelper.js +60 -48
  83. package/src/sap/fe/core/templating/EntitySetHelper.ts +80 -58
  84. package/src/sap/fe/core/templating/SemanticObjectHelper.js +6 -4
  85. package/src/sap/fe/core/templating/SemanticObjectHelper.ts +5 -5
  86. package/src/sap/fe/core/templating/UIFormatters.js +7 -1
  87. package/src/sap/fe/core/templating/UIFormatters.ts +4 -0
@@ -633,10 +633,11 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/UIProvide
633
633
  * @param appComponent The appComponent
634
634
  * @param messageHandler The message handler extension
635
635
  * @param groupId The batch groupId for post call of edit action
636
+ * @param transactionDetails Optional object to return additional details about how the transaction was executed
636
637
  * @returns Promise resolves with the new draft context in case of draft programming model
637
638
  * @final
638
639
  */;
639
- _proto.editDocument = async function editDocument(oContext, oView, appComponent, messageHandler, groupId) {
640
+ _proto.editDocument = async function editDocument(oContext, oView, appComponent, messageHandler, groupId, transactionDetails) {
640
641
  const sProgrammingModel = this.getProgrammingModel(oContext);
641
642
  if (!oContext) {
642
643
  throw new Error("Binding context to active document is required");
@@ -652,7 +653,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/UIProvide
652
653
  const oNewContext = sProgrammingModel === ProgrammingModel.Draft ? await draft.createDraftFromActiveDocument(oContext, appComponent, {
653
654
  bPreserveChanges: true,
654
655
  oView: oView
655
- }, groupId, messageHandler) : await sticky.editDocumentInStickySession(oContext, appComponent, messageHandler);
656
+ }, groupId, messageHandler, transactionDetails) : await sticky.editDocumentInStickySession(oContext, appComponent, messageHandler);
656
657
  await messageHandler.showMessageDialog({
657
658
  unHoldKey: messageHandlingKey
658
659
  });
@@ -696,9 +697,11 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/UIProvide
696
697
  this.busyLock(appComponent);
697
698
  try {
698
699
  let returnedValue;
700
+ let siblingContextCanonicalPath, draftAdminData;
701
+ const siblingContext = oModel.bindContext(`${oContext.getPath()}/SiblingEntity`).getBoundContext();
699
702
  if (sProgrammingModel === ProgrammingModel.Draft && !isObjectModified) {
700
703
  const draftDataContext = oModel.bindContext(`${oContext.getPath()}/DraftAdministrativeData`).getBoundContext();
701
- const draftAdminData = await draftDataContext.requestObject();
704
+ [siblingContextCanonicalPath, draftAdminData] = await Promise.all([isNewObject ? undefined : siblingContext.requestCanonicalPath(), draftDataContext.requestObject()]);
702
705
  if (draftAdminData) {
703
706
  isObjectModified = draftAdminData.CreationDateTime !== draftAdminData.LastChangeDateTime;
704
707
  }
@@ -723,13 +726,11 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/UIProvide
723
726
  }
724
727
  await draft.deleteDraft(oContext, messageHandler, appComponent);
725
728
  } else {
726
- const oSiblingContext = oModel.bindContext(`${oContext.getPath()}/SiblingEntity`).getBoundContext();
727
729
  try {
728
- const sCanonicalPath = await oSiblingContext.requestCanonicalPath();
729
730
  if (oContext.hasPendingChanges()) {
730
731
  oContext.getBinding().resetChanges();
731
732
  }
732
- returnedValue = oModel.bindContext(sCanonicalPath).getBoundContext();
733
+ returnedValue = oModel.bindContext(siblingContextCanonicalPath ? siblingContextCanonicalPath : await siblingContext.requestCanonicalPath()).getBoundContext();
733
734
  } finally {
734
735
  await draft.deleteDraft(oContext, messageHandler, appComponent);
735
736
  }
@@ -826,7 +827,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/UIProvide
826
827
  * @param mParameters.groupId
827
828
  * @param mParameters.defaultValuesExtensionFunction
828
829
  * @param mParameters.ignoreETag If specified, the action is called without ETag handling
829
- * @param mParameters.feFrameworkCall
830
830
  * @param appComponent The appComponent
831
831
  * @param messageHandler The message handler extension
832
832
  * @returns Promise resolves with an array of response objects (TODO: to be changed)
@@ -879,7 +879,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/UIProvide
879
879
  entitySetName: mParameters.entitySetName,
880
880
  oDataProperties: {
881
881
  ghostContextBindingProtection: true,
882
- enhance$select: mParameters.feFrameworkCall === true,
882
+ enhance$select: true,
883
883
  groupId: mParameters.groupId,
884
884
  ignoreETag: mParameters.ignoreETag
885
885
  },
@@ -1275,4 +1275,4 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/UIProvide
1275
1275
  const singleton = new TransactionHelper();
1276
1276
  return singleton;
1277
1277
  }, false);
1278
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDcmVhdGlvbk1vZGUiLCJGRUxpYnJhcnkiLCJQcm9ncmFtbWluZ01vZGVsIiwiRGVsZXRlT3B0aW9uVHlwZXMiLCJkZWxldGVIZWxwZXIiLCJEZWxldGVEaWFsb2dDb250ZW50Q29udHJvbCIsImdldFBhcmFtZXRlcnMiLCJtUGFyYW1ldGVycyIsImdldE1ldGFkYXRhIiwiZ2V0TmFtZSIsIlRyYW5zYWN0aW9uSGVscGVyIiwiX3Byb3RvIiwicHJvdG90eXBlIiwiYnVzeUxvY2siLCJhcHBDb21wb25lbnQiLCJidXN5UGF0aCIsIkJ1c3lMb2NrZXIiLCJsb2NrIiwiZ2V0TW9kZWwiLCJidXN5VW5sb2NrIiwidW5sb2NrIiwiZ2V0UHJvZ3JhbW1pbmdNb2RlbCIsInNvdXJjZSIsInBhdGgiLCJpc0EiLCJnZXRQYXRoIiwiaXNSZWxhdGl2ZSIsImdldFJlc29sdmVkUGF0aCIsIm1ldGFNb2RlbCIsImdldE1ldGFNb2RlbCIsIk1vZGVsSGVscGVyIiwiaXNEcmFmdFN1cHBvcnRlZCIsIkRyYWZ0IiwiaXNTdGlja3lTZXNzaW9uU3VwcG9ydGVkIiwiU3RpY2t5IiwiTm9uRHJhZnQiLCJ2YWxpZGF0ZURvY3VtZW50Iiwib0NvbnRleHQiLCJvVmlldyIsInNDdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24iLCJjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24iLCJzTW9kdWxlIiwic3Vic3RyaW5nIiwibGFzdEluZGV4T2YiLCJyZXBsYWNlIiwic0Z1bmN0aW9uTmFtZSIsImxlbmd0aCIsIm1EYXRhIiwiZGF0YSIsIkZQTUhlbHBlciIsInZhbGlkYXRpb25XcmFwcGVyIiwiUHJvbWlzZSIsInJlc29sdmUiLCJnZXREYXRhRnJvbURlZmF1bHRWYWx1ZUZ1bmN0aW9uIiwibGlzdEJpbmRpbmciLCJtb2RlbCIsIm1ldGFDb250ZXh0IiwiZ2V0TWV0YUNvbnRleHQiLCJsaXN0QmluZGluZ09iamVjdFBhdGgiLCJNZXRhTW9kZWxDb252ZXJ0ZXIiLCJnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMiLCJkZWZhdWx0RnVuY09uVGFyZ2V0T2JqZWN0IiwidGFyZ2V0T2JqZWN0IiwiYW5ub3RhdGlvbnMiLCJDb21tb24iLCJEZWZhdWx0VmFsdWVzRnVuY3Rpb24iLCJkZWZhdWx0RnVuY09uVGFyZ2V0RW50aXR5U2V0IiwidGFyZ2V0RW50aXR5U2V0IiwiZGVmYXVsdEZ1bmN0aW9uTmFtZSIsInVuZGVmaW5lZCIsImZ1bmN0aW9uT25OYXZQcm9wIiwiaXNOYXZpZ2F0aW9uUHJvcGVydHkiLCJkZWZhdWx0RnVuY3Rpb25Db250ZXh0IiwiZ2V0Q29udGV4dCIsImdldEhlYWRlckNvbnRleHQiLCJkZWZhdWx0RnVuY3Rpb25QYXRoIiwiZ2V0TWV0YVBhdGgiLCJkZWZhdWx0RnVuY3Rpb25PYmplY3RQYXRoIiwiZGVmYXVsdEZ1bmN0aW9uUmVzdWx0IiwiaXNCb3VuZCIsIm9wZXJhdGlvbnMiLCJjYWxsQm91bmRGdW5jdGlvbiIsInRvU3RyaW5nIiwiY2FsbEZ1bmN0aW9uSW1wb3J0IiwiZ2V0T2JqZWN0IiwiaXNMaXN0QmluZGluZ0hpZXJhcmNoaWNhbCIsImdldEFnZ3JlZ2F0aW9uIiwiaGllcmFyY2h5UXVhbGlmaWVyIiwiaXNMaXN0QmluZGluZ0FuYWx5dGljYWwiLCJhZ2dyZWdhdGlvbiIsImNyZWF0ZUNvbnRleHQiLCJpbml0aWFsRGF0YSIsIm9wdGlvbnMiLCJkYXRhRm9yQ3JlYXRpb24iLCJsaXN0QmluZGluZ0ZvckNyZWF0aW9uIiwicGFyZW50Q29udGV4dCIsImlzRXhwYW5kZWQiLCJleHBhbmQiLCJPYmplY3QiLCJhc3NpZ24iLCJiaW5kTGlzdCIsIiQkZ3JvdXBJZCIsImdldEdyb3VwSWQiLCIkJHVwZGF0ZUdyb3VwSWQiLCJnZXRVcGRhdGVHcm91cElkIiwib2JqZWN0UGF0aCIsInBhcmVudE5hdmlnYXRpb24iLCJ0YXJnZXRFbnRpdHlUeXBlIiwiQWdncmVnYXRpb24iLCJQYXJlbnROYXZpZ2F0aW9uUHJvcGVydHkiLCJ2YWx1ZSIsIkVycm9yIiwicGFyZW50QmluZGluZ0RhdGEiLCJjcmVhdGUiLCJjcmVhdGVBdEVuZCIsImNyZWF0ZUluYWN0aXZlIiwiZ2V0Q3JlYXRpb25QYXJhbWV0ZXJzIiwiY3JlYXRlRGF0YSIsIm1ldGFQYXRoIiwibm9uQ29tcHV0ZWRWaXNpYmxlRmllbGRzIiwiZ2V0Q3JlYXRlUG9wdXBGaWVsZHMiLCJmaWx0ZXIiLCJmaWVsZE5hbWUiLCJjcmVhdGVEb2N1bWVudCIsIm1haW5MaXN0QmluZGluZyIsImluUGFyYW1ldGVycyIsInJlc291cmNlTW9kZWwiLCJtZXNzYWdlSGFuZGxlciIsImZyb21Db3B5UGFzdGUiLCJuZXdEb2N1bWVudENvbnRleHQiLCJwYXJhbWV0ZXJzIiwicHJvZ3JhbW1pbmdNb2RlbCIsImdldEJ1c3lQYXRoIiwiYmVmb3JlQ3JlYXRlQ2FsbEJhY2siLCJpbmFjdGl2ZSIsIm1lc3NhZ2VIYW5kbGluZ0tleSIsInJlZ2lzdGVyVG9Ib2xkTWVzc2FnZXMiLCJwZXJmb3JtQ3JlYXRpb24iLCJzaG93TWVzc2FnZURpYWxvZyIsImNvbnRyb2wiLCJwYXJlbnRDb250cm9sIiwidW5Ib2xkS2V5IiwiZXJyb3IiLCJDb25zdGFudHMiLCJBY3Rpb25FeGVjdXRpb25GYWlsZWQiLCJDYW5jZWxBY3Rpb25EaWFsb2ciLCJpc1RyYW5zaWVudCIsImRlbGV0ZSIsImJ1c3lNb2RlIiwiYnVzeUlkIiwiY3JlYXRlRG9jdW1lbnRDb250ZXh0IiwiY3JlYXRlUGFyYW1ldGVycyIsImVudHJpZXMiLCJtYXAiLCJfcmVmIiwia2V5IiwidG9FUzZQcm9taXNlIiwiY29udGV4dFBhdGgiLCJMb2ciLCJPbkJlZm9yZUNyZWF0ZUZhaWxlZCIsInJlZHVjZSIsInJlc3VsdCIsImN1cnJlbnRPYmplY3QiLCJjcmVhdGVQcm9taXNlIiwiQ29tbW9uVXRpbHMiLCJJTkxJTkVFRElUX1VQREFURUdST1VQSUQiLCJzdWJtaXRCYXRjaCIsImNyZWF0ZUhhc2giLCJnZXRSb3V0ZXJQcm94eSIsImdldEhhc2giLCJjb21wb25lbnREYXRhIiwiZ2V0Q29tcG9uZW50RGF0YSIsInN0YXJ0dXBQYXJhbWV0ZXJzIiwibmV3QWN0aW9uIiwiX2dldE5ld0FjdGlvbiIsInBlcmZvcm1DcmVhdGlvbldpdGhBY3Rpb24iLCJzdGF0dXMiLCJyZWFzb24iLCJyZXR1cm5lZENvbnRleHQiLCJwZXJmb3JtQ3JlYXRpb25XaXRoUE9TVCIsImFjdGlvbk5hbWUiLCJoZWFkZXJDb250ZXh0UGF0aCIsIm1lc3NhZ2VzUGF0aCIsImdldE1lc3NhZ2VzUGF0aCIsImJpbmRpbmdQYXJhbWV0ZXJzIiwiJCRwYXRjaFdpdGhvdXRTaWRlRWZmZWN0cyIsInNlbGVjdGVkUHJvcGVydGllcyIsInB1c2giLCJqb2luIiwiY2FsbEFjdGlvbiIsImNvbnRleHRzIiwic2hvd0FjdGlvblBhcmFtZXRlckRpYWxvZyIsImxhYmVsIiwiX2dldFNwZWNpZmljQ3JlYXRlQWN0aW9uRGlhbG9nTGFiZWwiLCJ2aWV3IiwiaXNDcmVhdGVBY3Rpb24iLCJza2lwUGFyYW1ldGVyRGlhbG9nIiwiZGVmYXVsdFZhbHVlRnVuY3Rpb25EYXRhIiwiY2FuSGF2ZURpYWxvZyIsImNyZWF0aW9uTW9kZSIsIkNyZWF0aW9uUm93IiwiSW5saW5lIiwiY3JlYXRpb25EaWFsb2dGaWVsZHMiLCJDcmVhdGlvbkRpYWxvZyIsImZvckVhY2giLCJpbmNsdWRlcyIsImNyZWF0ZVdpdGhEaWFsb2ciLCJ3YWl0Rm9yQ3JlYXRlQ29tcGxldGlvbiIsImtlZXBUcmFuc2llbnRDb250ZXh0T25GYWlsZWQiLCJtc2ciLCJtZXNzYWdlIiwiX2lzRHJhZnRFbmFibGVkIiwidkNvbnRleHRzIiwiY29udGV4dEZvckRyYWZ0TW9kZWwiLCJzUHJvZ3JhbW1pbmdNb2RlbCIsImRlbGV0ZURvY3VtZW50IiwiY29udGV4dHNUb0RlbGV0ZSIsIkFycmF5IiwiaXNBcnJheSIsImZpcnN0Q29udGV4dCIsInNlbGVjdGVkQ29udGV4dHMiLCJyZWplY3QiLCJkcmFmdEVuYWJsZWQiLCJpdGVtcyIsInVuU2F2ZWRDb250ZXh0IiwiZW50aXR5U2V0TmFtZSIsImdldENvbGxlY3Rpb25OYW1lRnJvbUNvbnRleHQiLCJudW1iZXJPZlNlbGVjdGVkQ29udGV4dHMiLCJsb2NrZWRDb250ZXh0IiwiZmluZCIsImNvbnRleHQiLCJjb250ZXh0RGF0YSIsIklzQWN0aXZlRW50aXR5IiwiSGFzRHJhZnRFbnRpdHkiLCJEcmFmdEFkbWluaXN0cmF0aXZlRGF0YSIsIkluUHJvY2Vzc0J5VXNlciIsIkRyYWZ0SXNDcmVhdGVkQnlNZSIsImxvY2tpbmdVc2VyTmFtZSIsIk1lc3NhZ2VCb3giLCJzaG93IiwiZ2V0VGV4dCIsInRpdGxlIiwib25DbG9zZSIsIm5vblRhYmxlVHh0IiwidW5TYXZlZENvbnRleHRVc2VyIiwiZGVzY3JpcHRpb24iLCJ0eXBlIiwiZGVsZXRhYmxlQ29udGV4dHMiLCJ0ZXh0Iiwic2VsZWN0ZWQiLCJURVhUIiwidG90YWxEZWxldGFibGUiLCJkcmFmdHNXaXRoTm9uRGVsZXRhYmxlQWN0aXZlIiwiZHJhZnRzV2l0aERlbGV0YWJsZUFjdGl2ZSIsInVuU2F2ZWRDb250ZXh0cyIsInVwZGF0ZURyYWZ0T3B0aW9uc0ZvckRlbGV0YWJsZVRleHRzIiwibm9uRGVsZXRhYmxlVGV4dCIsImdldE5vbkRlbGV0YWJsZVRleHQiLCJvcHRpb25zRGVsZXRhYmxlVGV4dHMiLCJnZXRPcHRpb25zRm9yRGVsZXRhYmxlVGV4dHMiLCJjb21tb25CaW5kaW5nIiwiZ2V0QmluZGluZyIsImJpbmRpbmdUeXBlIiwidXBkYXRlQ29udGVudEZvckRlbGV0ZURpYWxvZyIsImZuQ29uZmlybSIsIm1lc3NhZ2VIYW5kbGluZyIsInJlbW92ZUJvdW5kVHJhbnNpdGlvbk1lc3NhZ2VzIiwiZGVsZXRlQ29uZmlybUhhbmRsZXIiLCJvRXJyb3IiLCJkaWFsb2ciLCJjcmVhdGVEZWxldGVEaWFsb2ciLCJub0RpYWxvZyIsInNpbGVudE1vZGUiLCJhZGRTdHlsZUNsYXNzIiwib3BlbiIsImZuUmVqZWN0IiwiZGlhbG9nQ29uZmlybWVkIiwidkJveCIsIlZCb3giLCJyZXNvdXJjZUJ1bmRsZUNvcmUiLCJMaWJyYXJ5IiwiZ2V0UmVzb3VyY2VCdW5kbGVGb3IiLCJEaWFsb2ciLCJzdGF0ZSIsImNvbnRlbnQiLCJhcmlhTGFiZWxsZWRCeSIsImJlZ2luQnV0dG9uIiwiQnV0dG9uIiwicHJlc3MiLCJjbG9zZSIsImVuZEJ1dHRvbiIsImFmdGVyQ2xvc2UiLCJkZXN0cm95IiwiZWRpdERvY3VtZW50IiwiZ3JvdXBJZCIsInJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcyIsIm9OZXdDb250ZXh0IiwiZHJhZnQiLCJjcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudCIsImJQcmVzZXJ2ZUNoYW5nZXMiLCJzdGlja3kiLCJlZGl0RG9jdW1lbnRJblN0aWNreVNlc3Npb24iLCJlcnIiLCJzaG93TWVzc2FnZXMiLCJjb25jdXJyZW50RWRpdEZsYWciLCJjYW5jZWxEb2N1bWVudCIsIm1JblBhcmFtZXRlcnMiLCJpc05ld09iamVjdCIsImlzT2JqZWN0TW9kaWZpZWQiLCJvTW9kZWwiLCJyZXR1cm5lZFZhbHVlIiwiZHJhZnREYXRhQ29udGV4dCIsImJpbmRDb250ZXh0IiwiZ2V0Qm91bmRDb250ZXh0IiwiZHJhZnRBZG1pbkRhdGEiLCJyZXF1ZXN0T2JqZWN0IiwiQ3JlYXRpb25EYXRlVGltZSIsIkxhc3RDaGFuZ2VEYXRlVGltZSIsInNraXBEaXNjYXJkUG9wb3ZlciIsIl9jb25maXJtRGlzY2FyZCIsImNhbmNlbEJ1dHRvbiIsImlzS2VlcEFsaXZlIiwic2V0S2VlcEFsaXZlIiwiYmVmb3JlQ2FuY2VsQ2FsbEJhY2siLCJoYXNQZW5kaW5nQ2hhbmdlcyIsInJlc2V0Q2hhbmdlcyIsImRlbGV0ZURyYWZ0Iiwib1NpYmxpbmdDb250ZXh0Iiwic0Nhbm9uaWNhbFBhdGgiLCJyZXF1ZXN0Q2Fub25pY2FsUGF0aCIsImRpc2NhcmRlZENvbnRleHQiLCJkaXNjYXJkRG9jdW1lbnQiLCJyZWZyZXNoIiwic2F2ZURvY3VtZW50IiwiZXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvciIsImJpbmRpbmdzRm9yU2lkZUVmZmVjdHMiLCJza2lwQ29uZmlybWF0aW9uTXNnIiwiYXJndW1lbnRzIiwib0FjdGl2ZURvY3VtZW50IiwiYWN0aXZhdGVEb2N1bWVudCIsIm1lc3NhZ2VzUmVjZWl2ZWQiLCJnZXRNZXNzYWdlcyIsImNvbmNhdCIsImdldFR5cGUiLCJNZXNzYWdlVHlwZSIsIlN1Y2Nlc3MiLCJNZXNzYWdlVG9hc3QiLCJoYXNUcmFuc2llbnRDb250ZXh0IiwiZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlIiwicmVxdWVzdFNpZGVFZmZlY3RzRm9yTmF2aWdhdGlvblByb3BlcnR5Iiwic0FjdGlvbk5hbWUiLCJjb250ZXh0VG9Qcm9jZXNzIiwic05hbWUiLCJzcGxpdCIsImNvbnRyb2xJZCIsImJ5SWQiLCJvUmVzdWx0IiwiYWN0aW9uUGF0aCIsImJvdW5kQWN0aW9uIiwiY3JlYXRlQmluZGluZ0NvbnRleHQiLCJjb252ZXJ0ZWRUeXBlcyIsImNvbnZlcnRUeXBlcyIsImNvbnZlcnRlZEFjdGlvbiIsInJlc29sdmVQYXRoIiwidGFyZ2V0IiwiT3BlcmF0aW9uIiwicGFyYW1ldGVyVmFsdWVzIiwiaW52b2NhdGlvbkdyb3VwaW5nIiwib0RhdGFQcm9wZXJ0aWVzIiwiZ2hvc3RDb250ZXh0QmluZGluZ1Byb3RlY3Rpb24iLCJlbmhhbmNlJHNlbGVjdCIsImZlRnJhbWV3b3JrQ2FsbCIsImlnbm9yZUVUYWciLCJvRGF0YUV2ZW50cyIsIm9uT0RhdGFTdWJtaXQiLCJvbk9EYXRhUmVzcG9uc2UiLCJvblJlcXVlc3RTaWRlRWZmZWN0cyIsImhhbmRsZUFjdGlvbkVuYWJsZW1lbnRPbk9wZXJhdGlvbiIsImludGVybmFsTW9kZWxDb250ZXh0Iiwib3BlcmF0aW9uQXZhaWxhYmxlTWFwIiwiZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uIiwiZXhlY3V0ZSIsImNhbGxBY3Rpb25JbXBvcnQiLCJfaGFuZGxlQWN0aW9uUmVzcG9uc2UiLCJuYW1lIiwiYWN0aW9uSGVscGVyIiwiaXNTdGF0aWNBY3Rpb24iLCJnZXRQcm9wZXJ0eSIsIkFjdGlvblJ1bnRpbWUiLCJzZXRBY3Rpb25FbmFibGVtZW50IiwiSlNPTiIsInBhcnNlIiwiZ2V0U2VsZWN0ZWRDb250ZXh0cyIsInVwZGF0ZURlbGV0ZUluZm9Gb3JTZWxlY3RlZENvbnRleHRzIiwiYVRyYW5zaWVudE1lc3NhZ2VzIiwic2V0UHJvcGVydHkiLCJoYW5kbGVWYWxpZGF0aW9uRXJyb3IiLCJlcnJvclRvUmVtb3ZlIiwiTWVzc2FnaW5nIiwiZ2V0TWVzc2FnZU1vZGVsIiwiZ2V0RGF0YSIsInZhbGlkYXRpb24iLCJyZW1vdmVNZXNzYWdlcyIsIl9jcmVhdGVQb3BvdmVyIiwic2V0dGluZ3MiLCJQb3BvdmVyIiwiaXNNb2RpZmllZCIsInNldEVuYWJsZWQiLCJjb25maXJtYXRpb25Qb3BvdmVyIiwic2hvd0hlYWRlciIsInBsYWNlbWVudCIsIlRleHQiLCJjb25maXJtQnV0dG9uIiwid2lkdGgiLCJhZGRDb250ZW50IiwiYXR0YWNoQmVmb3JlT3BlbiIsInNldEluaXRpYWxGb2N1cyIsImF0dGFjaEFmdGVyQ2xvc2UiLCJvcGVuQnkiLCJyZWZyZXNoTGlzdEJpbmRpbmciLCJpc1Jvb3QiLCJyZXF1ZXN0U2lkZUVmZmVjdHMiLCIkTmF2aWdhdGlvblByb3BlcnR5UGF0aCIsInJlcXVlc3RSZWZyZXNoIiwiZmllbGROYW1lcyIsImxpc3RNZXRhUGF0aCIsInRyYW5zaWVudExpc3RCaW5kaW5nIiwicmVmcmVzaEludGVybmFsIiwidHJhbnNpZW50Q29udGV4dCIsImZpZWxkTWV0YUNvbnRleHRzIiwiY3JlYXRlRGlhbG9nIiwiZ2V0Q29yZVVJRmFjdG9yeSIsIm5ld0NyZWF0ZURpYWxvZyIsInNldFVzZXJEZWZhdWx0cyIsImNyZWF0ZUFjdGlvbiIsIm9wZW5EaWFsb2ciLCJlIiwicmVzdWx0UHJvbWlzZUtlZXBlciIsIlByb21pc2VLZWVwZXIiLCJvbkV4aXREaWFsb2ciLCJldmVudCIsImdldFBhcmFtZXRlciIsImNsb3NlRGlhbG9nIiwic2V0QnVzeSIsImJJc0NyZWF0ZURpYWxvZyIsInRyYW5zaWVudERhdGEiLCJrZXlzIiwicHJvcGVydHlQYXRoIiwib1Byb3BlcnR5IiwiJGtpbmQiLCJzdGFydHNXaXRoIiwiY3JlYXRlRGF0YUFzQXJyYXkiLCJfcmVmMiIsIlVpTW9kZWxDb25zdGFudHMiLCJEb2N1bWVudE1vZGlmaWVkIiwibmV3Q29udGV4dCIsImNyZWF0aW9uU3VjY2VzcyIsImFmdGVyQ3JlYXRlQ2FsbEJhY2siLCJkaXNwbGF5RXJyb3JNZXNzYWdlcyIsInNob3dCb3VuZFN0YXRlTWVzc2FnZXMiLCJDcmVhdGlvbkZhaWxlZCIsImlzT3BlcmF0aW9uRGlhbG9nT3BlbiIsImlzT3BlbiIsImF0dGFjaEV4aXREaWFsb2ciLCJwcm9taXNlIiwicHJvbWlzZUtlZXBlciIsInBhcmVudExpc3RCaW5kaW5nIiwib25DcmVhdGVDb21wbGV0ZWQiLCJjcmVhdGVkQ29udGV4dCIsInN1Y2Nlc3MiLCJkZXRhY2hDcmVhdGVDb21wbGV0ZWQiLCJhdHRhY2hDcmVhdGVDb21wbGV0ZWQiLCJjcmVhdGlvblN1Y2Nlc3NmdWwiLCJjcmVhdGVkIiwiY2F0Y2giLCJjb250ZXh0RXJyb3IiLCJ0cmFjZSIsIm9TdGFydHVwUGFyYW1ldGVycyIsInNDcmVhdGVIYXNoIiwib01ldGFNb2RlbCIsInNNZXRhUGF0aCIsInNOZXdBY3Rpb24iLCJwcmVmZXJyZWRNb2RlIiwidG9VcHBlckNhc2UiLCJzUHJlZmVycmVkTW9kZSIsImxpbmVJdGVtcyIsImxpbmVJdGVtIiwiaXNEYXRhRmllbGRGb3JBY3Rpb24iLCJBY3Rpb24iLCJMYWJlbCIsInNpbmdsZXRvbiJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiVHJhbnNhY3Rpb25IZWxwZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBBY3Rpb24sIEFjdGlvbiBhcyBFZG1BY3Rpb24sIEVudGl0eVNldCwgTmF2aWdhdGlvblByb3BlcnR5IH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IExpbmVJdGVtIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3ZvY2FidWxhcmllcy9VSVwiO1xuaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgdHlwZSBBcHBDb21wb25lbnQgZnJvbSBcInNhcC9mZS9jb3JlL0FwcENvbXBvbmVudFwiO1xuaW1wb3J0IHR5cGUgeyBGRVZpZXcgfSBmcm9tIFwic2FwL2ZlL2NvcmUvQmFzZUNvbnRyb2xsZXJcIjtcbmltcG9ydCBDb21tb25VdGlscyBmcm9tIFwic2FwL2ZlL2NvcmUvQ29tbW9uVXRpbHNcIjtcbmltcG9ydCB0eXBlIFJlc291cmNlTW9kZWwgZnJvbSBcInNhcC9mZS9jb3JlL1Jlc291cmNlTW9kZWxcIjtcbmltcG9ydCB0eXBlIHsgRXhpdERpYWxvZ0V2ZW50IH0gZnJvbSBcInNhcC9mZS9jb3JlL1VJUHJvdmlkZXJcIjtcbmltcG9ydCB7IGdldENvcmVVSUZhY3RvcnkgfSBmcm9tIFwic2FwL2ZlL2NvcmUvVUlQcm92aWRlclwiO1xuaW1wb3J0IEJ1c3lMb2NrZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL0J1c3lMb2NrZXJcIjtcbmltcG9ydCB0eXBlIE1lc3NhZ2VIYW5kbGVyIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9NZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHR5cGUgeyBCaW5kQ29udGV4dFBhcmFtZXRlcnMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvZWRpdEZsb3cvZHJhZnRcIjtcbmltcG9ydCBkcmFmdCBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvZWRpdEZsb3cvZHJhZnRcIjtcbmltcG9ydCBVaU1vZGVsQ29uc3RhbnRzIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9lZGl0Rmxvdy9lZGl0Rmxvd0NvbnN0YW50c1wiO1xuaW1wb3J0IG9wZXJhdGlvbnMgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2VkaXRGbG93L29wZXJhdGlvbnNcIjtcbmltcG9ydCBzdGlja3kgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2VkaXRGbG93L3N0aWNreVwiO1xuaW1wb3J0IG1lc3NhZ2VIYW5kbGluZyBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvbWVzc2FnZUhhbmRsZXIvbWVzc2FnZUhhbmRsaW5nXCI7XG5pbXBvcnQgKiBhcyBNZXRhTW9kZWxDb252ZXJ0ZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWV0YU1vZGVsQ29udmVydGVyXCI7XG5pbXBvcnQgeyBjb252ZXJ0VHlwZXMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9NZXRhTW9kZWxDb252ZXJ0ZXJcIjtcbmltcG9ydCB7IGlzRGF0YUZpZWxkRm9yQWN0aW9uIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvYW5ub3RhdGlvbnMvRGF0YUZpZWxkXCI7XG5pbXBvcnQgdHlwZSB7IERlbGV0ZU9wdGlvbiwgRGVsZXRlUGFyYW1ldGVycyB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0RlbGV0ZUhlbHBlclwiO1xuaW1wb3J0IGRlbGV0ZUhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9EZWxldGVIZWxwZXJcIjtcbmltcG9ydCBGUE1IZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvRlBNSGVscGVyXCI7XG5pbXBvcnQgeyBnZXRDcmVhdGVQb3B1cEZpZWxkcyB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01ldGFNb2RlbEZ1bmN0aW9uXCI7XG5pbXBvcnQgdHlwZSB7IEludGVybmFsTW9kZWxDb250ZXh0IH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTW9kZWxIZWxwZXJcIjtcbmltcG9ydCBNb2RlbEhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0IFByb21pc2VLZWVwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvUHJvbWlzZUtlZXBlclwiO1xuaW1wb3J0IHRvRVM2UHJvbWlzZSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Ub0VTNlByb21pc2VcIjtcbmltcG9ydCB7IGlzTmF2aWdhdGlvblByb3BlcnR5IH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvVHlwZUd1YXJkc1wiO1xuaW1wb3J0IEZFTGlicmFyeSBmcm9tIFwic2FwL2ZlL2NvcmUvbGlicmFyeVwiO1xuaW1wb3J0IEJ1dHRvbiBmcm9tIFwic2FwL20vQnV0dG9uXCI7XG5pbXBvcnQgRGlhbG9nIGZyb20gXCJzYXAvbS9EaWFsb2dcIjtcbmltcG9ydCBNZXNzYWdlQm94IGZyb20gXCJzYXAvbS9NZXNzYWdlQm94XCI7XG5pbXBvcnQgTWVzc2FnZVRvYXN0IGZyb20gXCJzYXAvbS9NZXNzYWdlVG9hc3RcIjtcbmltcG9ydCB0eXBlIHsgJFBvcG92ZXJTZXR0aW5ncyB9IGZyb20gXCJzYXAvbS9Qb3BvdmVyXCI7XG5pbXBvcnQgUG9wb3ZlciBmcm9tIFwic2FwL20vUG9wb3ZlclwiO1xuaW1wb3J0IFRleHQgZnJvbSBcInNhcC9tL1RleHRcIjtcbmltcG9ydCBWQm94IGZyb20gXCJzYXAvbS9WQm94XCI7XG5pbXBvcnQgdHlwZSBFdmVudCBmcm9tIFwic2FwL3VpL2Jhc2UvRXZlbnRcIjtcbmltcG9ydCB0eXBlIENvbnRyb2wgZnJvbSBcInNhcC91aS9jb3JlL0NvbnRyb2xcIjtcbmltcG9ydCBMaWJyYXJ5IGZyb20gXCJzYXAvdWkvY29yZS9MaWJcIjtcbmltcG9ydCBNZXNzYWdpbmcgZnJvbSBcInNhcC91aS9jb3JlL01lc3NhZ2luZ1wiO1xuaW1wb3J0IHR5cGUgTWVzc2FnZSBmcm9tIFwic2FwL3VpL2NvcmUvbWVzc2FnZS9NZXNzYWdlXCI7XG5pbXBvcnQgTWVzc2FnZVR5cGUgZnJvbSBcInNhcC91aS9jb3JlL21lc3NhZ2UvTWVzc2FnZVR5cGVcIjtcbmltcG9ydCB0eXBlIFZpZXcgZnJvbSBcInNhcC91aS9jb3JlL212Yy9WaWV3XCI7XG5pbXBvcnQgdHlwZSBUYWJsZSBmcm9tIFwic2FwL3VpL21kYy9UYWJsZVwiO1xuaW1wb3J0IHR5cGUgTXVsdGlWYWx1ZUZpZWxkSXRlbSBmcm9tIFwic2FwL3VpL21kYy9maWVsZC9NdWx0aVZhbHVlRmllbGRJdGVtXCI7XG5pbXBvcnQgdHlwZSBCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvQmluZGluZ1wiO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL0NvbnRleHRcIjtcbmltcG9ydCB0eXBlIE9EYXRhVjRDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQ29udGV4dFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFMaXN0QmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTGlzdEJpbmRpbmdcIjtcbmltcG9ydCB0eXBlIHsgT0RhdGFMaXN0QmluZGluZyRDcmVhdGVDb21wbGV0ZWRFdmVudCB9IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFMaXN0QmluZGluZ1wiO1xuaW1wb3J0IHR5cGUgT0RhdGFNZXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1ldGFNb2RlbFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTW9kZWxcIjtcbmltcG9ydCBBY3Rpb25SdW50aW1lIGZyb20gXCIuLi8uLi9BY3Rpb25SdW50aW1lXCI7XG5pbXBvcnQgdHlwZSB7IE9wZXJhdGlvblJlc3VsdCB9IGZyb20gXCIuL29wZXJhdGlvbnMvT0RhdGFPcGVyYXRpb25cIjtcbmltcG9ydCBPcGVyYXRpb24gZnJvbSBcIi4vb3BlcmF0aW9ucy9PcGVyYXRpb25cIjtcbmltcG9ydCBhY3Rpb25IZWxwZXIgZnJvbSBcIi4vb3BlcmF0aW9ucy9hY3Rpb25IZWxwZXJcIjtcblxuY29uc3QgQ3JlYXRpb25Nb2RlID0gRkVMaWJyYXJ5LkNyZWF0aW9uTW9kZTtcbmNvbnN0IFByb2dyYW1taW5nTW9kZWwgPSBGRUxpYnJhcnkuUHJvZ3JhbW1pbmdNb2RlbDtcblxuLy9FbnVtcyBmb3IgZGVsZXRlIHRleHQgY2FsY3VsYXRpb25zIGZvciBkZWxldGUgY29uZmlybSBkaWFsb2cuXG5jb25zdCBEZWxldGVPcHRpb25UeXBlcyA9IGRlbGV0ZUhlbHBlci5EZWxldGVPcHRpb25UeXBlcztcbmNvbnN0IERlbGV0ZURpYWxvZ0NvbnRlbnRDb250cm9sID0gZGVsZXRlSGVscGVyLkRlbGV0ZURpYWxvZ0NvbnRlbnRDb250cm9sO1xuXG4vKiBNYWtlIHN1cmUgdGhhdCB0aGUgbVBhcmFtZXRlcnMgaXMgbm90IHRoZSBvRXZlbnQgKi9cbmZ1bmN0aW9uIGdldFBhcmFtZXRlcnM8VD4obVBhcmFtZXRlcnM/OiBFdmVudCB8IFQpOiBUIHtcblx0aWYgKG1QYXJhbWV0ZXJzICYmIChtUGFyYW1ldGVycyBhcyBFdmVudCkuZ2V0TWV0YWRhdGEgJiYgKG1QYXJhbWV0ZXJzIGFzIEV2ZW50KS5nZXRNZXRhZGF0YSgpLmdldE5hbWUoKSA9PT0gXCJzYXAudWkuYmFzZS5FdmVudFwiKSB7XG5cdFx0bVBhcmFtZXRlcnMgPSB7fSBhcyBUO1xuXHR9XG5cdHJldHVybiAobVBhcmFtZXRlcnMgYXMgVCkgfHwgKHt9IGFzIFQpO1xufVxuXG5leHBvcnQgdHlwZSBDcmVhdGVQYXJhbWV0ZXJzID0ge1xuXHRkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cdGJ1c3lNb2RlPzogc3RyaW5nO1xuXHRidXN5SWQ/OiBzdHJpbmc7XG5cdGtlZXBUcmFuc2llbnRDb250ZXh0T25GYWlsZWQ/OiBib29sZWFuO1xuXHRwYXJlbnRDb250cm9sOiBWaWV3O1xuXHRpbmFjdGl2ZT86IGJvb2xlYW47XG5cdGJlZm9yZUNyZWF0ZUNhbGxCYWNrPzogRnVuY3Rpb247XG5cdGFmdGVyQ3JlYXRlQ2FsbEJhY2s/OiAoY29udGV4dDogT0RhdGFWNENvbnRleHQpID0+IFByb21pc2U8dm9pZD47XG5cdHNraXBQYXJhbWV0ZXJEaWFsb2c/OiBib29sZWFuO1xuXHRjcmVhdGlvbk1vZGU/OiBzdHJpbmc7XG5cdGNyZWF0ZUF0RW5kPzogYm9vbGVhbjtcblx0cGFyZW50Q29udGV4dD86IE9EYXRhVjRDb250ZXh0O1xuXHRjcmVhdGlvbkRpYWxvZ0ZpZWxkcz86IHN0cmluZ1tdO1xufTtcblxuZXhwb3J0IHR5cGUgQ2FuY2VsUGFyYW1ldGVycyA9IHsgY2FuY2VsQnV0dG9uOiBCdXR0b247IHNraXBEaXNjYXJkUG9wb3ZlcjogYm9vbGVhbjsgYmVmb3JlQ2FuY2VsQ2FsbEJhY2s/OiBGdW5jdGlvbiB9O1xuZXhwb3J0IHR5cGUgVHJhbnNhY3Rpb25EZWxldGVQYXJhbWV0ZXJzID0gRGVsZXRlUGFyYW1ldGVycyAmIHtcblx0c2VsZWN0ZWRDb250ZXh0cz86IE9EYXRhVjRDb250ZXh0W107XG5cdHRpdGxlPzogc3RyaW5nO1xuXHRub0RpYWxvZz86IGJvb2xlYW47XG59O1xuXG5jbGFzcyBUcmFuc2FjdGlvbkhlbHBlciB7XG5cdGJ1c3lMb2NrKGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LCBidXN5UGF0aD86IHN0cmluZyk6IHZvaWQge1xuXHRcdEJ1c3lMb2NrZXIubG9jayhhcHBDb21wb25lbnQuZ2V0TW9kZWwoXCJ1aVwiKSwgYnVzeVBhdGgpO1xuXHR9XG5cblx0YnVzeVVubG9jayhhcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCwgYnVzeVBhdGg/OiBzdHJpbmcpOiB2b2lkIHtcblx0XHRCdXN5TG9ja2VyLnVubG9jayhhcHBDb21wb25lbnQuZ2V0TW9kZWwoXCJ1aVwiKSwgYnVzeVBhdGgpO1xuXHR9XG5cblx0Z2V0UHJvZ3JhbW1pbmdNb2RlbChzb3VyY2U6IE9EYXRhVjRDb250ZXh0IHwgQmluZGluZyk6IHR5cGVvZiBQcm9ncmFtbWluZ01vZGVsIHtcblx0XHRsZXQgcGF0aDogc3RyaW5nO1xuXHRcdGlmIChzb3VyY2UuaXNBPE9EYXRhVjRDb250ZXh0PihcInNhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0XCIpKSB7XG5cdFx0XHRwYXRoID0gc291cmNlLmdldFBhdGgoKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cGF0aCA9IChzb3VyY2UuaXNSZWxhdGl2ZSgpID8gc291cmNlLmdldFJlc29sdmVkUGF0aCgpIDogc291cmNlLmdldFBhdGgoKSkgPz8gXCJcIjtcblx0XHR9XG5cblx0XHRjb25zdCBtZXRhTW9kZWwgPSBzb3VyY2UuZ2V0TW9kZWwoKT8uZ2V0TWV0YU1vZGVsKCkgYXMgT0RhdGFNZXRhTW9kZWwgfCB1bmRlZmluZWQ7XG5cdFx0aWYgKG1ldGFNb2RlbCAmJiBNb2RlbEhlbHBlci5pc0RyYWZ0U3VwcG9ydGVkKG1ldGFNb2RlbCwgcGF0aCkpIHtcblx0XHRcdHJldHVybiBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0O1xuXHRcdH0gZWxzZSBpZiAobWV0YU1vZGVsICYmIE1vZGVsSGVscGVyLmlzU3RpY2t5U2Vzc2lvblN1cHBvcnRlZChtZXRhTW9kZWwpKSB7XG5cdFx0XHRyZXR1cm4gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3k7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBQcm9ncmFtbWluZ01vZGVsLk5vbkRyYWZ0O1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBWYWxpZGF0ZXMgYSBkb2N1bWVudC5cblx0ICogQHBhcmFtIG9Db250ZXh0IENvbnRleHQgb2YgdGhlIGRvY3VtZW50IHRvIGJlIHZhbGlkYXRlZFxuXHQgKiBAcGFyYW0gW21QYXJhbWV0ZXJzXSBDYW4gY29udGFpbiB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG5cdCAqIEBwYXJhbSBbbVBhcmFtZXRlcnMuZGF0YV0gQSBtYXAgb2YgZGF0YSB0aGF0IHNob3VsZCBiZSB2YWxpZGF0ZWRcblx0ICogQHBhcmFtIFttUGFyYW1ldGVycy5jdXN0b21WYWxpZGF0aW9uRnVuY3Rpb25dIEEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgcGF0aCB0byB0aGUgdmFsaWRhdGlvbiBmdW5jdGlvblxuXHQgKiBAcGFyYW0gb1ZpZXcgQ29udGFpbnMgdGhlIG9iamVjdCBvZiB0aGUgY3VycmVudCB2aWV3XG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgd2l0aCByZXN1bHQgb2YgdGhlIGN1c3RvbSB2YWxpZGF0aW9uIGZ1bmN0aW9uXG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0YXN5bmMgdmFsaWRhdGVEb2N1bWVudChcblx0XHRvQ29udGV4dDogT0RhdGFWNENvbnRleHQsXG5cdFx0bVBhcmFtZXRlcnM6IHsgY3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uPzogc3RyaW5nOyBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9LFxuXHRcdG9WaWV3OiBWaWV3XG5cdCk6IFByb21pc2U8eyBtZXNzYWdlVGFyZ2V0Pzogc3RyaW5nOyBtZXNzYWdlVGV4dDogc3RyaW5nIH1bXT4ge1xuXHRcdGNvbnN0IHNDdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24gPSBtUGFyYW1ldGVycyAmJiBtUGFyYW1ldGVycy5jdXN0b21WYWxpZGF0aW9uRnVuY3Rpb247XG5cdFx0aWYgKHNDdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24pIHtcblx0XHRcdGNvbnN0IHNNb2R1bGUgPSBzQ3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uLnN1YnN0cmluZygwLCBzQ3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uLmxhc3RJbmRleE9mKFwiLlwiKSB8fCAtMSkucmVwbGFjZSgvXFwuL2dpLCBcIi9cIiksXG5cdFx0XHRcdHNGdW5jdGlvbk5hbWUgPSBzQ3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uLnN1YnN0cmluZyhcblx0XHRcdFx0XHRzQ3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uLmxhc3RJbmRleE9mKFwiLlwiKSArIDEsXG5cdFx0XHRcdFx0c0N1c3RvbVZhbGlkYXRpb25GdW5jdGlvbi5sZW5ndGhcblx0XHRcdFx0KSxcblx0XHRcdFx0bURhdGEgPSBtUGFyYW1ldGVycy5kYXRhO1xuXHRcdFx0ZGVsZXRlIG1EYXRhW1wiQCR1aTUuY29udGV4dC5pc1RyYW5zaWVudFwiXTtcblx0XHRcdHJldHVybiBGUE1IZWxwZXIudmFsaWRhdGlvbldyYXBwZXIoc01vZHVsZSwgc0Z1bmN0aW9uTmFtZSwgbURhdGEsIG9WaWV3LCBvQ29udGV4dCk7XG5cdFx0fVxuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoW10pO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlcyBkZWZhdHVsIHZhbHVlcyBmcm9tIHRoZSBEZWZhdWx0VmFsdWUgZnVuY3Rpb24uXG5cdCAqIEBwYXJhbSBsaXN0QmluZGluZyBUaGUgbGlzdCBiaW5kaW5nIHRvIGJlIHVzZWQgZm9yIGNyZWF0aW9uXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSB3aXRoIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSBkZWZhdWx0IHZhbHVlcyAob3IgdW5kZWZpbmVkIGlmIHRoZXJlJ3Mgbm8gZGVmYXVsdCB2YWx1ZSBmdW5jdGlvbilcblx0ICovXG5cdHByaXZhdGUgYXN5bmMgZ2V0RGF0YUZyb21EZWZhdWx0VmFsdWVGdW5jdGlvbihsaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZyk6IFByb21pc2U8b2JqZWN0IHwgdW5kZWZpbmVkPiB7XG5cdFx0Y29uc3QgbW9kZWwgPSBsaXN0QmluZGluZy5nZXRNb2RlbCgpO1xuXHRcdGNvbnN0IG1ldGFNb2RlbCA9IG1vZGVsLmdldE1ldGFNb2RlbCgpO1xuXHRcdGNvbnN0IG1ldGFDb250ZXh0ID0gbWV0YU1vZGVsLmdldE1ldGFDb250ZXh0KGxpc3RCaW5kaW5nLmdldFJlc29sdmVkUGF0aCgpIGFzIHN0cmluZyk7XG5cdFx0Y29uc3QgbGlzdEJpbmRpbmdPYmplY3RQYXRoID0gTWV0YU1vZGVsQ29udmVydGVyLmdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyhtZXRhQ29udGV4dCk7XG5cblx0XHRjb25zdCBkZWZhdWx0RnVuY09uVGFyZ2V0T2JqZWN0ID0gKGxpc3RCaW5kaW5nT2JqZWN0UGF0aC50YXJnZXRPYmplY3QgYXMgTmF2aWdhdGlvblByb3BlcnR5IHwgRW50aXR5U2V0KS5hbm5vdGF0aW9ucy5Db21tb25cblx0XHRcdD8uRGVmYXVsdFZhbHVlc0Z1bmN0aW9uO1xuXHRcdGNvbnN0IGRlZmF1bHRGdW5jT25UYXJnZXRFbnRpdHlTZXQgPSAobGlzdEJpbmRpbmdPYmplY3RQYXRoLnRhcmdldEVudGl0eVNldCBhcyBFbnRpdHlTZXQgfCB1bmRlZmluZWQpPy5hbm5vdGF0aW9ucy5Db21tb25cblx0XHRcdD8uRGVmYXVsdFZhbHVlc0Z1bmN0aW9uO1xuXHRcdGNvbnN0IGRlZmF1bHRGdW5jdGlvbk5hbWUgPSBkZWZhdWx0RnVuY09uVGFyZ2V0T2JqZWN0ID8/IGRlZmF1bHRGdW5jT25UYXJnZXRFbnRpdHlTZXQ7XG5cblx0XHRpZiAoIWRlZmF1bHRGdW5jdGlvbk5hbWUpIHtcblx0XHRcdC8vIE5vIGRlZmF1bHQgdmFsdWUgZnVuY3Rpb25cblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXG5cdFx0Y29uc3QgZnVuY3Rpb25Pbk5hdlByb3AgPSBpc05hdmlnYXRpb25Qcm9wZXJ0eShsaXN0QmluZGluZ09iamVjdFBhdGgudGFyZ2V0T2JqZWN0KSAmJiBkZWZhdWx0RnVuY09uVGFyZ2V0T2JqZWN0ICE9PSB1bmRlZmluZWQ7XG5cdFx0Y29uc3QgZGVmYXVsdEZ1bmN0aW9uQ29udGV4dCA9IGZ1bmN0aW9uT25OYXZQcm9wID8gbGlzdEJpbmRpbmcuZ2V0Q29udGV4dCgpIDogbGlzdEJpbmRpbmcuZ2V0SGVhZGVyQ29udGV4dCgpO1xuXHRcdGlmICghZGVmYXVsdEZ1bmN0aW9uQ29udGV4dCkge1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0Y29uc3QgZGVmYXVsdEZ1bmN0aW9uUGF0aCA9IGAke21ldGFNb2RlbC5nZXRNZXRhUGF0aChkZWZhdWx0RnVuY3Rpb25Db250ZXh0LmdldFBhdGgoKSl9LyR7ZGVmYXVsdEZ1bmN0aW9uTmFtZX1gO1xuXG5cdFx0Y29uc3QgZGVmYXVsdEZ1bmN0aW9uT2JqZWN0UGF0aCA9IE1ldGFNb2RlbENvbnZlcnRlci5nZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMobWV0YU1vZGVsLmdldE1ldGFDb250ZXh0KGRlZmF1bHRGdW5jdGlvblBhdGgpKTtcblx0XHRjb25zdCBkZWZhdWx0RnVuY3Rpb25SZXN1bHQgPSAoZGVmYXVsdEZ1bmN0aW9uT2JqZWN0UGF0aC50YXJnZXRPYmplY3QgYXMgQWN0aW9uKT8uaXNCb3VuZFxuXHRcdFx0PyBhd2FpdCBvcGVyYXRpb25zLmNhbGxCb3VuZEZ1bmN0aW9uKGRlZmF1bHRGdW5jdGlvbk5hbWUudG9TdHJpbmcoKSwgZGVmYXVsdEZ1bmN0aW9uQ29udGV4dCwgbW9kZWwpXG5cdFx0XHQ6ICgoYXdhaXQgb3BlcmF0aW9ucy5jYWxsRnVuY3Rpb25JbXBvcnQoZGVmYXVsdEZ1bmN0aW9uTmFtZS50b1N0cmluZygpLCBtb2RlbCkpIGFzIE9EYXRhVjRDb250ZXh0KTtcblxuXHRcdHJldHVybiBkZWZhdWx0RnVuY3Rpb25SZXN1bHQuZ2V0T2JqZWN0KCk7XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2tzIGlmIGEgbGlzdCBiaW5kaW5nIGNvcnJlc3BvbmRzIHRvIGEgaGllcmFyY2h5LlxuXHQgKiBAcGFyYW0gbGlzdEJpbmRpbmdcblx0ICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgbGlzdCBiaW5kaW5nIGlzIGhpZXJhcmNoaWNhbC5cblx0ICovXG5cdGlzTGlzdEJpbmRpbmdIaWVyYXJjaGljYWwobGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gKGxpc3RCaW5kaW5nLmdldEFnZ3JlZ2F0aW9uKCkgYXMgeyBoaWVyYXJjaHlRdWFsaWZpZXI/OiBzdHJpbmcgfSB8IHVuZGVmaW5lZCk/LmhpZXJhcmNoeVF1YWxpZmllciA/IHRydWUgOiBmYWxzZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgdGhlIGdpdmVuIGxpc3QgYmluZGluZyBpcyBhbmFseXRpY2FsLlxuXHQgKiBAcGFyYW0gbGlzdEJpbmRpbmcgVGhlIGxpc3QgYmluZGluZyB0byBjaGVja1xuXHQgKiBAcmV0dXJucyBUUlVFIGlmIHRoZSBsaXN0IGJpbmRpbmcgaXMgYW5hbHl0aWNhbCwgYGZhbHNlYCBvdGhlcndpc2UuXG5cdCAqL1xuXHRpc0xpc3RCaW5kaW5nQW5hbHl0aWNhbChsaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZyk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IGFnZ3JlZ2F0aW9uID0gbGlzdEJpbmRpbmcuZ2V0QWdncmVnYXRpb24oKSBhcyB7IGhpZXJhcmNoeVF1YWxpZmllcj86IHN0cmluZyB9IHwgdW5kZWZpbmVkO1xuXHRcdHJldHVybiBhZ2dyZWdhdGlvbiAhPT0gdW5kZWZpbmVkICYmICFhZ2dyZWdhdGlvbi5oaWVyYXJjaHlRdWFsaWZpZXI7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIG5ldyBjb250ZXh0IGluIGEgbGlzdCBiaW5kaW5nLiBIYW5kbGVzIGJvdGggZmxhdCBhbmQgaGllcmFyY2hpY2FsIGNhc2VzLlxuXHQgKiBAcGFyYW0gbGlzdEJpbmRpbmdcblx0ICogQHBhcmFtIGluaXRpYWxEYXRhIEluaXRpYWwgZGF0YSB0byBjcmVhdGUgdGhlIGNvbnRleHQuXG5cdCAqIEBwYXJhbSBvcHRpb25zIENyZWF0aW9uIG9wdGlvbnMuXG5cdCAqIEBwYXJhbSBvcHRpb25zLmNyZWF0ZUF0RW5kIENyZWF0ZSB0aGUgY29udGV4dCBhdCB0aGUgZW5kIG9mIHRoZSBsaXN0IChpZ25vcmVkIGluIGNhc2Ugb2YgYSBoaWVyYXJjaHkpLlxuXHQgKiBAcGFyYW0gb3B0aW9ucy5jcmVhdGVJbmFjdGl2ZSBDcmVhdGUgdGhlIGNvbnRleHQgYXMgaW5hY3RpdmUgKGlnbm9yZWQgaW4gY2FzZSBvZiBhIGhpZXJhcmNoeSkuXG5cdCAqIEBwYXJhbSBvcHRpb25zLnBhcmVudENvbnRleHQgQ3JlYXRlIHRoZSBjb250ZXh0IGFzIGFcdCBjaGlsZCBvZiB0aGlzIGNvbnRleHQgKG9ueSB1c2VkIGluIGNhc2Ugb2YgYSBoaWVyYXJjaHkpLlxuXHQgKiBAcmV0dXJucyBUaGUgY3JlYXRlZCBjb250ZXh0LlxuXHQgKi9cblx0cHJpdmF0ZSBhc3luYyBjcmVhdGVDb250ZXh0KFxuXHRcdGxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nLFxuXHRcdGluaXRpYWxEYXRhOiBvYmplY3QgfCB1bmRlZmluZWQsXG5cdFx0b3B0aW9uczogeyBjcmVhdGVBdEVuZD86IGJvb2xlYW47IGNyZWF0ZUluYWN0aXZlPzogYm9vbGVhbjsgcGFyZW50Q29udGV4dD86IE9EYXRhVjRDb250ZXh0IH1cblx0KTogUHJvbWlzZTxPRGF0YVY0Q29udGV4dD4ge1xuXHRcdGNvbnN0IGRhdGFGb3JDcmVhdGlvbiA9IGluaXRpYWxEYXRhID8/IHt9O1xuXG5cdFx0aWYgKHRoaXMuaXNMaXN0QmluZGluZ0hpZXJhcmNoaWNhbChsaXN0QmluZGluZykpIHtcblx0XHRcdGxldCBsaXN0QmluZGluZ0ZvckNyZWF0aW9uOiBPRGF0YUxpc3RCaW5kaW5nO1xuXHRcdFx0aWYgKG9wdGlvbnMucGFyZW50Q29udGV4dD8uaXNFeHBhbmRlZCgpID09PSBmYWxzZSkge1xuXHRcdFx0XHQvLyBJZiB0aGUgcGFyZW50IGNvbnRleHQgYWxyZWFkeSBoYXMgY2hpbGRyZW4gYW5kIGlzIGNvbGxhcHNlZCwgd2UgZXhwYW5kIGl0IGZpcnN0XG5cdFx0XHRcdGF3YWl0IGxpc3RCaW5kaW5nLmV4cGFuZChvcHRpb25zLnBhcmVudENvbnRleHQpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAobGlzdEJpbmRpbmcuaXNSZWxhdGl2ZSgpKSB7XG5cdFx0XHRcdE9iamVjdC5hc3NpZ24oZGF0YUZvckNyZWF0aW9uLCB7IFwiQCR1aTUubm9kZS5wYXJlbnRcIjogb3B0aW9ucy5wYXJlbnRDb250ZXh0IH0pO1xuXHRcdFx0XHRsaXN0QmluZGluZ0ZvckNyZWF0aW9uID0gbGlzdEJpbmRpbmc7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyBBYnNvbHV0ZSBiaW5kaW5nOiBjcmVhdGlvbiBmcm9tIHRoZSBMaXN0UmVwb3J0XG5cdFx0XHRcdC8vIFdlIHVzZSBhIHRlbXBvcmFyeSBmbGF0IGxpc3RCaW5kaW5nIGZvciB0aGUgY3JlYXRpb24sIHRvIGF2b2lkIGFkZGluZyB0aGUgbmV3IGNvbnRleHQgaW4gdGhlIHRhYmxlICh3ZSBkb24ndCB3YW50IHRvIGRpc3BsYXkgaXQgdW50aWwgaXQncyBzYXZlZClcblx0XHRcdFx0Y29uc3QgbW9kZWwgPSBsaXN0QmluZGluZy5nZXRNb2RlbCgpO1xuXHRcdFx0XHRjb25zdCBtZXRhTW9kZWwgPSBtb2RlbC5nZXRNZXRhTW9kZWwoKTtcblx0XHRcdFx0bGlzdEJpbmRpbmdGb3JDcmVhdGlvbiA9IG1vZGVsLmJpbmRMaXN0KGxpc3RCaW5kaW5nLmdldFBhdGgoKSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwge1xuXHRcdFx0XHRcdCQkZ3JvdXBJZDogbGlzdEJpbmRpbmcuZ2V0R3JvdXBJZCgpLFxuXHRcdFx0XHRcdCQkdXBkYXRlR3JvdXBJZDogbGlzdEJpbmRpbmcuZ2V0VXBkYXRlR3JvdXBJZCgpXG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdC8vIEFkZCB0aGUgcGFyZW50IHBhdGggaW4gdGhlIGluaXRpYWwgZGF0YSBpZiBhIHBhcmVudCBpcyBwcm92aWRlZFxuXHRcdFx0XHRpZiAob3B0aW9ucy5wYXJlbnRDb250ZXh0KSB7XG5cdFx0XHRcdFx0Y29uc3Qgb2JqZWN0UGF0aCA9IE1ldGFNb2RlbENvbnZlcnRlci5nZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMobWV0YU1vZGVsLmdldE1ldGFDb250ZXh0KGxpc3RCaW5kaW5nLmdldFBhdGgoKSkpO1xuXHRcdFx0XHRcdGNvbnN0IGhpZXJhcmNoeVF1YWxpZmllciA9IChsaXN0QmluZGluZy5nZXRBZ2dyZWdhdGlvbigpIGFzIHsgaGllcmFyY2h5UXVhbGlmaWVyOiBzdHJpbmcgfSkuaGllcmFyY2h5UXVhbGlmaWVyO1xuXHRcdFx0XHRcdGNvbnN0IHBhcmVudE5hdmlnYXRpb24gPVxuXHRcdFx0XHRcdFx0b2JqZWN0UGF0aC50YXJnZXRFbnRpdHlUeXBlLmFubm90YXRpb25zLkFnZ3JlZ2F0aW9uPy5bYFJlY3Vyc2l2ZUhpZXJhcmNoeSMke2hpZXJhcmNoeVF1YWxpZmllcn1gXVxuXHRcdFx0XHRcdFx0XHQ/LlBhcmVudE5hdmlnYXRpb25Qcm9wZXJ0eS52YWx1ZTtcblx0XHRcdFx0XHRpZiAoIXBhcmVudE5hdmlnYXRpb24pIHtcblx0XHRcdFx0XHRcdHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGZpbmQgcGFyZW50IG5hdmlnYXRpb24gcHJvcGVydHkgZm9yICR7bGlzdEJpbmRpbmcuZ2V0UGF0aCgpfWApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRjb25zdCBwYXJlbnRCaW5kaW5nRGF0YTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuXHRcdFx0XHRcdHBhcmVudEJpbmRpbmdEYXRhW2Ake3BhcmVudE5hdmlnYXRpb259QG9kYXRhLmJpbmRgXSA9IG9wdGlvbnMucGFyZW50Q29udGV4dC5nZXRQYXRoKCkucmVwbGFjZSgvXlxcLy8sIFwiXCIpOyAvLyBSZW1vdmUgbGVhZGluZyBcIi9cIiBmcm9tIHRoZSBwYXRoXG5cdFx0XHRcdFx0T2JqZWN0LmFzc2lnbihkYXRhRm9yQ3JlYXRpb24sIHBhcmVudEJpbmRpbmdEYXRhKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gbGlzdEJpbmRpbmdGb3JDcmVhdGlvbi5jcmVhdGUoZGF0YUZvckNyZWF0aW9uLCB0cnVlKTtcblx0XHR9IGVsc2UgaWYgKHRoaXMuaXNMaXN0QmluZGluZ0FuYWx5dGljYWwobGlzdEJpbmRpbmcpKSB7XG5cdFx0XHRpZiAobGlzdEJpbmRpbmcuaXNSZWxhdGl2ZSgpKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcIkNyZWF0aW5nIGEgbmV3IGRvY3VtZW50IGluIGEgYW5hbHl0aWNhbCB0YWJsZSBpcyBzdXBwb3J0ZWQgb25seSBpbiBhIExpc3RSZXBvcnRcIik7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyBXZSB1c2UgYSB0ZW1wb3JhcnkgZmxhdCBsaXN0QmluZGluZyBmb3IgdGhlIGNyZWF0aW9uLCB0byBhdm9pZCBhZGRpbmcgdGhlIG5ldyBjb250ZXh0IGluIHRoZSB0YWJsZSAod2UgZG9uJ3Qgd2FudCB0byBkaXNwbGF5IGl0IHVudGlsIGl0J3Mgc2F2ZWQpXG5cdFx0XHRcdGNvbnN0IG1vZGVsID0gbGlzdEJpbmRpbmcuZ2V0TW9kZWwoKTtcblx0XHRcdFx0Y29uc3QgbGlzdEJpbmRpbmdGb3JDcmVhdGlvbiA9IG1vZGVsLmJpbmRMaXN0KGxpc3RCaW5kaW5nLmdldFBhdGgoKSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwge1xuXHRcdFx0XHRcdCQkZ3JvdXBJZDogbGlzdEJpbmRpbmcuZ2V0R3JvdXBJZCgpLFxuXHRcdFx0XHRcdCQkdXBkYXRlR3JvdXBJZDogbGlzdEJpbmRpbmcuZ2V0VXBkYXRlR3JvdXBJZCgpXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRyZXR1cm4gbGlzdEJpbmRpbmdGb3JDcmVhdGlvbi5jcmVhdGUoZGF0YUZvckNyZWF0aW9uLCB0cnVlKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIGxpc3RCaW5kaW5nLmNyZWF0ZShkYXRhRm9yQ3JlYXRpb24sIHRydWUsIG9wdGlvbnMuY3JlYXRlQXRFbmQsIG9wdGlvbnMuY3JlYXRlSW5hY3RpdmUpO1xuXHRcdH1cblx0fVxuXG5cdGdldENyZWF0aW9uUGFyYW1ldGVycyhsaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZywgY3JlYXRlRGF0YTogb2JqZWN0IHwgdW5kZWZpbmVkLCBhcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCk6IHN0cmluZ1tdIHtcblx0XHRjb25zdCBtZXRhTW9kZWwgPSBsaXN0QmluZGluZy5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdGNvbnN0IG1ldGFQYXRoID0gbWV0YU1vZGVsLmdldE1ldGFQYXRoKGxpc3RCaW5kaW5nLmdldEhlYWRlckNvbnRleHQoKSEuZ2V0UGF0aCgpKTtcblxuXHRcdGNvbnN0IG5vbkNvbXB1dGVkVmlzaWJsZUZpZWxkcyA9IGdldENyZWF0ZVBvcHVwRmllbGRzKG1ldGFNb2RlbCwgbWV0YVBhdGgsIGFwcENvbXBvbmVudCk7XG5cdFx0Ly8gRG8gbm90IGNvbnNpZGVyIGZpZWxkcyBmb3Igd2hpY2ggd2UgcHJvdmlkZSBzb21lIGluaXRpYWwgZGF0YVxuXHRcdHJldHVybiBub25Db21wdXRlZFZpc2libGVGaWVsZHMuZmlsdGVyKChmaWVsZE5hbWU6IHN0cmluZykgPT4ge1xuXHRcdFx0cmV0dXJuICEoZmllbGROYW1lIGluIChjcmVhdGVEYXRhID8/IHt9KSk7XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIG5ldyBkb2N1bWVudC5cblx0ICogQHBhcmFtIG1haW5MaXN0QmluZGluZyBPRGF0YSBWNCBMaXN0QmluZGluZyBvYmplY3Rcblx0ICogQHBhcmFtIFtpblBhcmFtZXRlcnNdIE9wdGlvbmFsLCBjYW4gY29udGFpbiB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG5cdCAqIEBwYXJhbSBbaW5QYXJhbWV0ZXJzLmRhdGFdIEEgbWFwIG9mIGRhdGEgdGhhdCBzaG91bGQgYmUgc2VudCB3aXRoaW4gdGhlIFBPU1Rcblx0ICogQHBhcmFtIFtpblBhcmFtZXRlcnMuYnVzeU1vZGVdIEdsb2JhbCAoZGVmYXVsdCksIExvY2FsLCBOb25lIFRPRE86IHRvIGJlIHJlZmFjdG9yZWRcblx0ICogQHBhcmFtIFtpblBhcmFtZXRlcnMuYnVzeUlkXSBJRCBvZiB0aGUgbG9jYWwgYnVzeSBpbmRpY2F0b3Jcblx0ICogQHBhcmFtIFtpblBhcmFtZXRlcnMua2VlcFRyYW5zaWVudENvbnRleHRPbkZhaWxlZF0gSWYgc2V0LCB0aGUgY29udGV4dCBzdGF5cyBpbiB0aGUgbGlzdCBpZiB0aGUgUE9TVCBmYWlsZWQgYW5kIFBPU1Qgd2lsbCBiZSByZXBlYXRlZCB3aXRoIHRoZSBuZXh0IGNoYW5nZVxuXHQgKiBAcGFyYW0gW2luUGFyYW1ldGVycy5pbmFjdGl2ZV0gSWYgc2V0LCB0aGUgY29udGV4dCBpcyBzZXQgYXMgaW5hY3RpdmUgZm9yIGVtcHR5IHJvd3Ncblx0ICogQHBhcmFtIFtpblBhcmFtZXRlcnMuc2tpcFBhcmFtZXRlckRpYWxvZ10gU2tpcHMgdGhlIGFjdGlvbiBwYXJhbWV0ZXIgZGlhbG9nXG5cdCAqIEBwYXJhbSBhcHBDb21wb25lbnQgVGhlIGFwcCBjb21wb25lbnRcblx0ICogQHBhcmFtIHJlc291cmNlTW9kZWwgVGhlIHJlc291cmNlIG1vZGVsXG5cdCAqIEBwYXJhbSBtZXNzYWdlSGFuZGxlciBUaGUgbWVzc2FnZSBoYW5kbGVyIGV4dGVuc2lvblxuXHQgKiBAcGFyYW0gZnJvbUNvcHlQYXN0ZSBUcnVlIGlmIHRoZSBjcmVhdGlvbiBoYXMgYmVlbiB0cmlnZ2VyZWQgYnkgYSBwYXN0ZSBhY3Rpb25cblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyB3aXRoIG5ldyBiaW5kaW5nIGNvbnRleHRcblx0ICogQGZpbmFsXG5cdCAqL1xuXHRhc3luYyBjcmVhdGVEb2N1bWVudChcblx0XHRtYWluTGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcsXG5cdFx0aW5QYXJhbWV0ZXJzOiBDcmVhdGVQYXJhbWV0ZXJzIHwgdW5kZWZpbmVkLFxuXHRcdGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LFxuXHRcdHJlc291cmNlTW9kZWw6IFJlc291cmNlTW9kZWwsXG5cdFx0bWVzc2FnZUhhbmRsZXI6IE1lc3NhZ2VIYW5kbGVyLFxuXHRcdGZyb21Db3B5UGFzdGU6IGJvb2xlYW5cblx0KTogUHJvbWlzZTxPRGF0YVY0Q29udGV4dD4ge1xuXHRcdGxldCBuZXdEb2N1bWVudENvbnRleHQ6IE9EYXRhVjRDb250ZXh0IHwgdW5kZWZpbmVkO1xuXHRcdGNvbnN0IHBhcmFtZXRlcnMgPSBnZXRQYXJhbWV0ZXJzKGluUGFyYW1ldGVycyk7XG5cdFx0aWYgKCFtYWluTGlzdEJpbmRpbmcpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIkJpbmRpbmcgcmVxdWlyZWQgZm9yIG5ldyBkb2N1bWVudCBjcmVhdGlvblwiKTtcblx0XHR9XG5cdFx0Y29uc3QgcHJvZ3JhbW1pbmdNb2RlbCA9IHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChtYWluTGlzdEJpbmRpbmcpO1xuXHRcdGlmIChwcm9ncmFtbWluZ01vZGVsICE9PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0ICYmIHByb2dyYW1taW5nTW9kZWwgIT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5KSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJDcmVhdGUgZG9jdW1lbnQgb25seSBhbGxvd2VkIGZvciBkcmFmdCBvciBzdGlja3kgc2Vzc2lvbiBzdXBwb3J0ZWQgc2VydmljZXNcIik7XG5cdFx0fVxuXHRcdGNvbnN0IGJ1c3lQYXRoID0gdGhpcy5nZXRCdXN5UGF0aChwYXJhbWV0ZXJzKTtcblx0XHRwYXJhbWV0ZXJzLmJlZm9yZUNyZWF0ZUNhbGxCYWNrID0gZnJvbUNvcHlQYXN0ZSA/IHVuZGVmaW5lZCA6IHBhcmFtZXRlcnMuYmVmb3JlQ3JlYXRlQ2FsbEJhY2s7XG5cdFx0aWYgKCFpblBhcmFtZXRlcnM/LmluYWN0aXZlKSB7XG5cdFx0XHR0aGlzLmJ1c3lMb2NrKGFwcENvbXBvbmVudCwgYnVzeVBhdGgpO1xuXHRcdH1cblx0XHRjb25zdCBtZXNzYWdlSGFuZGxpbmdLZXkgPSBtZXNzYWdlSGFuZGxlci5yZWdpc3RlclRvSG9sZE1lc3NhZ2VzKCk7XG5cdFx0dHJ5IHtcblx0XHRcdG5ld0RvY3VtZW50Q29udGV4dCA9IGF3YWl0IHRoaXMucGVyZm9ybUNyZWF0aW9uKFxuXHRcdFx0XHRtYWluTGlzdEJpbmRpbmcsXG5cdFx0XHRcdHBhcmFtZXRlcnMsXG5cdFx0XHRcdGFwcENvbXBvbmVudCxcblx0XHRcdFx0bWVzc2FnZUhhbmRsZXIsXG5cdFx0XHRcdHJlc291cmNlTW9kZWwsXG5cdFx0XHRcdGZyb21Db3B5UGFzdGVcblx0XHRcdCk7XG5cdFx0XHRhd2FpdCBtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZURpYWxvZyh7IGNvbnRyb2w6IHBhcmFtZXRlcnMucGFyZW50Q29udHJvbCwgdW5Ib2xkS2V5OiBtZXNzYWdlSGFuZGxpbmdLZXkgfSk7XG5cdFx0XHRyZXR1cm4gbmV3RG9jdW1lbnRDb250ZXh0ITtcblx0XHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdFx0Ly8gVE9ETzogY3VycmVudGx5LCB0aGUgb25seSBlcnJvcnMgaGFuZGxlZCBoZXJlIGFyZSByYWlzZWQgYXMgc3RyaW5nIC0gc2hvdWxkIGJlIGNoYW5nZWQgdG8gRXJyb3Igb2JqZWN0c1xuXHRcdFx0YXdhaXQgbWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VEaWFsb2coeyBjb250cm9sOiBwYXJhbWV0ZXJzLnBhcmVudENvbnRyb2wsIHVuSG9sZEtleTogbWVzc2FnZUhhbmRsaW5nS2V5IH0pO1xuXHRcdFx0aWYgKFxuXHRcdFx0XHQoZXJyb3IgPT09IEZFTGlicmFyeS5Db25zdGFudHMuQWN0aW9uRXhlY3V0aW9uRmFpbGVkIHx8IGVycm9yID09PSBGRUxpYnJhcnkuQ29uc3RhbnRzLkNhbmNlbEFjdGlvbkRpYWxvZykgJiZcblx0XHRcdFx0bmV3RG9jdW1lbnRDb250ZXh0Py5pc1RyYW5zaWVudCgpXG5cdFx0XHQpIHtcblx0XHRcdFx0Ly8gVGhpcyBpcyBhIHdvcmthcm91bmQgc3VnZ2VzdGVkIGJ5IG1vZGVsIGFzIENvbnRleHQuZGVsZXRlIHJlc3VsdHMgaW4gYW4gZXJyb3Jcblx0XHRcdFx0Ly8gVE9ETzogcmVtb3ZlIHRoZSAkZGlyZWN0IG9uY2UgbW9kZWwgcmVzb2x2ZXMgdGhpcyBpc3N1ZVxuXHRcdFx0XHQvLyB0aGlzIGxpbmUgc2hvd3MgdGhlIGV4cGVjdGVkIGNvbnNvbGUgZXJyb3IgVW5jYXVnaHQgKGluIHByb21pc2UpIEVycm9yOiBSZXF1ZXN0IGNhbmNlbGVkOiBQT1NUIFRyYXZlbDsgZ3JvdXA6IHN1Ym1pdExhdGVyXG5cdFx0XHRcdG5ld0RvY3VtZW50Q29udGV4dC5kZWxldGUoXCIkZGlyZWN0XCIpO1xuXHRcdFx0fVxuXHRcdFx0dGhyb3cgZXJyb3I7XG5cdFx0fSBmaW5hbGx5IHtcblx0XHRcdGlmICghaW5QYXJhbWV0ZXJzPy5pbmFjdGl2ZSkge1xuXHRcdFx0XHR0aGlzLmJ1c3lVbmxvY2soYXBwQ29tcG9uZW50LCBidXN5UGF0aCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBnZXRCdXN5UGF0aChtUGFyYW1ldGVyczogQ3JlYXRlUGFyYW1ldGVycyk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIG1QYXJhbWV0ZXJzLmJ1c3lNb2RlID09PSBcIkxvY2FsXCIgPyBgL2J1c3lMb2NhbC8ke21QYXJhbWV0ZXJzLmJ1c3lJZH1gIDogXCIvYnVzeVwiO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBuZXcgZG9jdW1lbnQuXG5cdCAqIEBwYXJhbSBtYWluTGlzdEJpbmRpbmcgT0RhdGEgVjQgTGlzdEJpbmRpbmcgb2JqZWN0LlxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycyBDb250YWlucyB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXNcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuZGF0YSBBIG1hcCBvZiBkYXRhIHRoYXQgc2hvdWxkIGJlIHNlbnQgd2l0aGluIHRoZSBQT1NUXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmJ1c3lNb2RlIEdsb2JhbCAoZGVmYXVsdCksIExvY2FsLCBOb25lXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmJ1c3lJZCBJRCBvZiB0aGUgbG9jYWwgYnVzeSBpbmRpY2F0b3Jcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMua2VlcFRyYW5zaWVudENvbnRleHRPbkZhaWxlZCBJZiBzZXQsIHRoZSBjb250ZXh0IHN0YXlzIGluIHRoZSBsaXN0IGlmIHRoZSBQT1NUIGZhaWxlZCBhbmQgUE9TVCB3aWxsIGJlIHJlcGVhdGVkIHdpdGggdGhlIG5leHQgY2hhbmdlXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLnBhcmVudENvbnRyb2xcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuaW5hY3RpdmUgSWYgc2V0LCB0aGUgY29udGV4dCBpcyBzZXQgYXMgaW5hY3RpdmUgZm9yIGVtcHR5IHJvd3Ncblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuYmVmb3JlQ3JlYXRlQ2FsbEJhY2sgQ2FsbGJhY2sgdG8gYmUgY2FsbGVkIGJlZm9yZSB0aGUgY3JlYXRpb25cblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuc2tpcFBhcmFtZXRlckRpYWxvZyBTa2lwcyB0aGUgYWN0aW9uIHBhcmFtZXRlciBkaWFsb2dcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuY3JlYXRlQXRFbmQgQ3JlYXRlIHRoZSBjb250ZXh0IGF0IHRoZSBlbmQgb2YgdGhlIGxpc3QgKGlnbm9yZWQgaW4gY2FzZSBvZiBhIGhpZXJhcmNoeSkuXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmNyZWF0ZUluYWN0aXZlIENyZWF0ZSB0aGUgY29udGV4dCBhcyBpbmFjdGl2ZSAoaWdub3JlZCBpbiBjYXNlIG9mIGEgaGllcmFyY2h5KS5cblx0ICogQHBhcmFtIHBhcmFtZXRlcnMucGFyZW50Q29udGV4dCBDcmVhdGUgdGhlIGNvbnRleHQgYXMgYSBjaGlsZCBvZiB0aGlzIGNvbnRleHQgKG9ubHkgdXNlZCBpbiBjYXNlIG9mIGEgaGllcmFyY2h5KS5cblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyB3aXRoIG5ldyBiaW5kaW5nIGNvbnRleHRcblx0ICovXG5cdHByaXZhdGUgYXN5bmMgY3JlYXRlRG9jdW1lbnRDb250ZXh0KG1haW5MaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZywgcGFyYW1ldGVyczogQ3JlYXRlUGFyYW1ldGVycyk6IFByb21pc2U8T0RhdGFWNENvbnRleHQ+IHtcblx0XHRpZiAocGFyYW1ldGVycy5iZWZvcmVDcmVhdGVDYWxsQmFjaykge1xuXHRcdFx0Ly9iZWZvcmVDcmVhdGVDYWxsQmFjayBleHBlY3RzIGNyZWF0ZVBhcmFtZXRlcnMgb2YgdHlwZSBhbnlbXVxuXHRcdFx0Y29uc3QgY3JlYXRlUGFyYW1ldGVycyA9IHBhcmFtZXRlcnMuZGF0YSA/IE9iamVjdC5lbnRyaWVzKHBhcmFtZXRlcnMuZGF0YSkubWFwKChba2V5LCB2YWx1ZV0pID0+ICh7IFtrZXldOiB2YWx1ZSB9KSkgOiBbXTtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGF3YWl0IHRvRVM2UHJvbWlzZShcblx0XHRcdFx0XHRwYXJhbWV0ZXJzLmJlZm9yZUNyZWF0ZUNhbGxCYWNrKHtcblx0XHRcdFx0XHRcdGNvbnRleHRQYXRoOiBtYWluTGlzdEJpbmRpbmcgJiYgbWFpbkxpc3RCaW5kaW5nLmdldFBhdGgoKSxcblx0XHRcdFx0XHRcdGNyZWF0ZVBhcmFtZXRlcnM6IGNyZWF0ZVBhcmFtZXRlcnNcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHQpO1xuXHRcdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdFx0TG9nLmVycm9yKGVycm9yIGFzIHN0cmluZyk7XG5cdFx0XHRcdHRocm93IEZFTGlicmFyeS5Db25zdGFudHMuT25CZWZvcmVDcmVhdGVGYWlsZWQ7XG5cdFx0XHR9XG5cdFx0XHRwYXJhbWV0ZXJzLmRhdGEgPSBjcmVhdGVQYXJhbWV0ZXJzLnJlZHVjZSgocmVzdWx0LCBjdXJyZW50T2JqZWN0KSA9PiB7XG5cdFx0XHRcdHJldHVybiB7IC4uLnJlc3VsdCwgLi4uY3VycmVudE9iamVjdCB9O1xuXHRcdFx0fSwge30pO1xuXHRcdH1cblx0XHRjb25zdCBjcmVhdGVQcm9taXNlID0gdGhpcy5jcmVhdGVDb250ZXh0KG1haW5MaXN0QmluZGluZywgcGFyYW1ldGVycy5kYXRhLCB7XG5cdFx0XHRjcmVhdGVBdEVuZDogISFwYXJhbWV0ZXJzLmNyZWF0ZUF0RW5kLFxuXHRcdFx0Y3JlYXRlSW5hY3RpdmU6ICEhcGFyYW1ldGVycy5pbmFjdGl2ZSxcblx0XHRcdHBhcmVudENvbnRleHQ6IHBhcmFtZXRlcnMucGFyZW50Q29udGV4dFxuXHRcdH0pO1xuXHRcdGlmIChtYWluTGlzdEJpbmRpbmcuZ2V0VXBkYXRlR3JvdXBJZCgpID09PSBDb21tb25VdGlscy5JTkxJTkVFRElUX1VQREFURUdST1VQSUQpIHtcblx0XHRcdG1haW5MaXN0QmluZGluZy5nZXRNb2RlbCgpLnN1Ym1pdEJhdGNoKENvbW1vblV0aWxzLklOTElORUVESVRfVVBEQVRFR1JPVVBJRCk7XG5cdFx0fVxuXHRcdHJldHVybiBjcmVhdGVQcm9taXNlO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBuZXcgZG9jdW1lbnQgZWl0aGVyIHZpYSBuZXcgQWN0aW9uIG9yIHN0YW5kYXJkIFBPU1QgY3JlYXRlLlxuXHQgKiBAcGFyYW0gbWFpbkxpc3RCaW5kaW5nIE9EYXRhIFY0IExpc3RCaW5kaW5nIG9iamVjdFxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycyBDb250YWlucyB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXNcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuZGF0YSBBIG1hcCBvZiBkYXRhIHRoYXQgc2hvdWxkIGJlIHNlbnQgd2l0aGluIHRoZSBQT1NUXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmJ1c3lNb2RlIEdsb2JhbCAoZGVmYXVsdCksIExvY2FsLCBOb25lXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmJ1c3lJZCBJRCBvZiB0aGUgbG9jYWwgYnVzeSBpbmRpY2F0b3Jcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMua2VlcFRyYW5zaWVudENvbnRleHRPbkZhaWxlZCBJZiBzZXQsIHRoZSBjb250ZXh0IHN0YXlzIGluIHRoZSBsaXN0IGlmIHRoZSBQT1NUIGZhaWxlZCBhbmQgUE9TVCB3aWxsIGJlIHJlcGVhdGVkIHdpdGggdGhlIG5leHQgY2hhbmdlXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLnBhcmVudENvbnRyb2xcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuaW5hY3RpdmUgSWYgc2V0LCB0aGUgY29udGV4dCBpcyBzZXQgYXMgaW5hY3RpdmUgZm9yIGVtcHR5IHJvd3Ncblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuYmVmb3JlQ3JlYXRlQ2FsbEJhY2sgQ2FsbGJhY2sgdG8gYmUgY2FsbGVkIGJlZm9yZSB0aGUgY3JlYXRpb25cblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuc2tpcFBhcmFtZXRlckRpYWxvZyBTa2lwcyB0aGUgYWN0aW9uIHBhcmFtZXRlciBkaWFsb2dcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuY3JlYXRlQXRFbmQgQ3JlYXRlIHRoZSBjb250ZXh0IGF0IHRoZSBlbmQgb2YgdGhlIGxpc3QgKGlnbm9yZWQgaW4gY2FzZSBvZiBhIGhpZXJhcmNoeSkuXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmNyZWF0ZUluYWN0aXZlIENyZWF0ZSB0aGUgY29udGV4dCBhcyBpbmFjdGl2ZSAoaWdub3JlZCBpbiBjYXNlIG9mIGEgaGllcmFyY2h5KS5cblx0ICogQHBhcmFtIHBhcmFtZXRlcnMucGFyZW50Q29udGV4dCBDcmVhdGUgdGhlIGNvbnRleHQgYXMgYSBjaGlsZCBvZiB0aGlzIGNvbnRleHQgKG9ubHkgdXNlZCBpbiBjYXNlIG9mIGEgaGllcmFyY2h5KS5cblx0ICogQHBhcmFtIGFwcENvbXBvbmVudCBUaGUgYXBwIGNvbXBvbmVudFxuXHQgKiBAcGFyYW0gbWVzc2FnZUhhbmRsZXIgVGhlIG1lc3NhZ2UgaGFuZGxlciBleHRlbnNpb25cblx0ICogQHBhcmFtIHJlc291cmNlTW9kZWxcblx0ICogQHBhcmFtIGZyb21Db3B5UGFzdGUgVHJ1ZSBpZiB0aGUgY3JlYXRpb24gaGFzIGJlZW4gdHJpZ2dlcmVkIGJ5IGEgcGFzdGUgYWN0aW9uXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgd2l0aCBuZXcgYmluZGluZyBjb250ZXh0XG5cdCAqL1xuXHRwcml2YXRlIGFzeW5jIHBlcmZvcm1DcmVhdGlvbihcblx0XHRtYWluTGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcsXG5cdFx0cGFyYW1ldGVyczogQ3JlYXRlUGFyYW1ldGVycyxcblx0XHRhcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCxcblx0XHRtZXNzYWdlSGFuZGxlcjogTWVzc2FnZUhhbmRsZXIsXG5cdFx0cmVzb3VyY2VNb2RlbDogUmVzb3VyY2VNb2RlbCxcblx0XHRmcm9tQ29weVBhc3RlOiBib29sZWFuXG5cdCk6IFByb21pc2U8T0RhdGFWNENvbnRleHQgfCB1bmRlZmluZWQ+IHtcblx0XHRjb25zdCBtZXRhTW9kZWwgPSBtYWluTGlzdEJpbmRpbmcuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKTtcblx0XHRjb25zdCBtZXRhUGF0aCA9IG1ldGFNb2RlbC5nZXRNZXRhUGF0aChtYWluTGlzdEJpbmRpbmcuZ2V0SGVhZGVyQ29udGV4dCgpIS5nZXRQYXRoKCkpO1xuXHRcdGNvbnN0IGNyZWF0ZUhhc2ggPSBhcHBDb21wb25lbnQuZ2V0Um91dGVyUHJveHkoKS5nZXRIYXNoKCk7XG5cdFx0Y29uc3QgY29tcG9uZW50RGF0YSA9IGFwcENvbXBvbmVudC5nZXRDb21wb25lbnREYXRhKCk7XG5cdFx0Y29uc3Qgc3RhcnR1cFBhcmFtZXRlcnMgPSBjb21wb25lbnREYXRhPy5zdGFydHVwUGFyYW1ldGVycyA/PyB7fTtcblx0XHRjb25zdCBuZXdBY3Rpb24gPSAhbWFpbkxpc3RCaW5kaW5nLmlzUmVsYXRpdmUoKVxuXHRcdFx0PyB0aGlzLl9nZXROZXdBY3Rpb24oc3RhcnR1cFBhcmFtZXRlcnMsIGNyZWF0ZUhhc2gsIG1ldGFNb2RlbCwgbWV0YVBhdGgpXG5cdFx0XHQ6IHVuZGVmaW5lZDtcblxuXHRcdGlmIChuZXdBY3Rpb24pIHtcblx0XHRcdGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucGVyZm9ybUNyZWF0aW9uV2l0aEFjdGlvbihcblx0XHRcdFx0bmV3QWN0aW9uLFxuXHRcdFx0XHRtYWluTGlzdEJpbmRpbmcsXG5cdFx0XHRcdHBhcmFtZXRlcnMsXG5cdFx0XHRcdGFwcENvbXBvbmVudCxcblx0XHRcdFx0cmVzb3VyY2VNb2RlbCxcblx0XHRcdFx0bWVzc2FnZUhhbmRsZXJcblx0XHRcdCk7XG5cdFx0XHRpZiAocmVzdWx0LnN0YXR1cyA9PT0gXCJyZWplY3RlZFwiKSB7XG5cdFx0XHRcdHRocm93IHJlc3VsdC5yZWFzb247XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gcmVzdWx0LnZhbHVlLnJldHVybmVkQ29udGV4dDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIHRoaXMucGVyZm9ybUNyZWF0aW9uV2l0aFBPU1QobWFpbkxpc3RCaW5kaW5nLCBwYXJhbWV0ZXJzLCBhcHBDb21wb25lbnQsIHJlc291cmNlTW9kZWwsIG1lc3NhZ2VIYW5kbGVyLCBmcm9tQ29weVBhc3RlKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIGRvY3VtZW50IHdpdGggYW4gYWN0aW9uLlxuXHQgKiBAcGFyYW0gYWN0aW9uTmFtZVxuXHQgKiBAcGFyYW0gbWFpbkxpc3RCaW5kaW5nXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzXG5cdCAqIEBwYXJhbSBhcHBDb21wb25lbnRcblx0ICogQHBhcmFtIHJlc291cmNlTW9kZWxcblx0ICogQHBhcmFtIG1lc3NhZ2VIYW5kbGVyXG5cdCAqIEByZXR1cm5zIFRoZSBjcmVhdGVkIGNvbnRleHQuXG5cdCAqL1xuXHRwcml2YXRlIGFzeW5jIHBlcmZvcm1DcmVhdGlvbldpdGhBY3Rpb24oXG5cdFx0YWN0aW9uTmFtZTogc3RyaW5nLFxuXHRcdG1haW5MaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZyxcblx0XHRwYXJhbWV0ZXJzOiBDcmVhdGVQYXJhbWV0ZXJzLFxuXHRcdGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LFxuXHRcdHJlc291cmNlTW9kZWw6IFJlc291cmNlTW9kZWwsXG5cdFx0bWVzc2FnZUhhbmRsZXI6IE1lc3NhZ2VIYW5kbGVyXG5cdCk6IFByb21pc2U8UHJvbWlzZVNldHRsZWRSZXN1bHQ8T3BlcmF0aW9uUmVzdWx0Pj4ge1xuXHRcdGNvbnN0IGhlYWRlckNvbnRleHRQYXRoID0gbWFpbkxpc3RCaW5kaW5nLmdldEhlYWRlckNvbnRleHQoKSEuZ2V0UGF0aCgpO1xuXHRcdGNvbnN0IG1ldGFNb2RlbCA9IG1haW5MaXN0QmluZGluZy5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdGNvbnN0IG1ldGFQYXRoID0gbWV0YU1vZGVsLmdldE1ldGFQYXRoKGhlYWRlckNvbnRleHRQYXRoKTtcblx0XHRjb25zdCBtZXNzYWdlc1BhdGggPSBNb2RlbEhlbHBlci5nZXRNZXNzYWdlc1BhdGgobWV0YU1vZGVsLCBtZXRhUGF0aCk7XG5cdFx0Y29uc3QgYmluZGluZ1BhcmFtZXRlcnM6IEJpbmRDb250ZXh0UGFyYW1ldGVycyA9IHsgJCRwYXRjaFdpdGhvdXRTaWRlRWZmZWN0czogdHJ1ZSwgJCR1cGRhdGVHcm91cElkOiBcIiRhdXRvXCIgfTtcblxuXHRcdGNvbnN0IHNlbGVjdGVkUHJvcGVydGllczogc3RyaW5nW10gPSBbXTtcblx0XHRpZiAobWVzc2FnZXNQYXRoKSB7XG5cdFx0XHRzZWxlY3RlZFByb3BlcnRpZXMucHVzaChtZXNzYWdlc1BhdGgpO1xuXHRcdH1cblx0XHRpZiAodGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKG1haW5MaXN0QmluZGluZykgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQpIHtcblx0XHRcdHNlbGVjdGVkUHJvcGVydGllcy5wdXNoKFwiSXNBY3RpdmVFbnRpdHlcIiwgXCJIYXNEcmFmdEVudGl0eVwiLCBcIkhhc0FjdGl2ZUVudGl0eVwiKTsgLy8gTmVlZGVkIGZvciBvdXIgaW50ZXJuYWwgbG9naWMgKGUuZy4gbmF2aWdhdGlvbilcblx0XHR9XG5cdFx0aWYgKHNlbGVjdGVkUHJvcGVydGllcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRiaW5kaW5nUGFyYW1ldGVyc1tcIiRzZWxlY3RcIl0gPSBzZWxlY3RlZFByb3BlcnRpZXMuam9pbihcIixcIik7XG5cdFx0fVxuXHRcdGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuY2FsbEFjdGlvbihcblx0XHRcdGFjdGlvbk5hbWUsXG5cdFx0XHR7XG5cdFx0XHRcdGNvbnRleHRzOiBtYWluTGlzdEJpbmRpbmcuZ2V0SGVhZGVyQ29udGV4dCgpLFxuXHRcdFx0XHRzaG93QWN0aW9uUGFyYW1ldGVyRGlhbG9nOiB0cnVlLFxuXHRcdFx0XHRsYWJlbDogdGhpcy5fZ2V0U3BlY2lmaWNDcmVhdGVBY3Rpb25EaWFsb2dMYWJlbChtZXRhTW9kZWwsIG1ldGFQYXRoLCBhY3Rpb25OYW1lLCByZXNvdXJjZU1vZGVsKSxcblx0XHRcdFx0YmluZGluZ1BhcmFtZXRlcnM6IGJpbmRpbmdQYXJhbWV0ZXJzLFxuXHRcdFx0XHR2aWV3OiBwYXJhbWV0ZXJzLnBhcmVudENvbnRyb2wsXG5cdFx0XHRcdGlzQ3JlYXRlQWN0aW9uOiB0cnVlLFxuXHRcdFx0XHRza2lwUGFyYW1ldGVyRGlhbG9nOiBwYXJhbWV0ZXJzLnNraXBQYXJhbWV0ZXJEaWFsb2dcblx0XHRcdH0sXG5cdFx0XHRhcHBDb21wb25lbnQsXG5cdFx0XHRtZXNzYWdlSGFuZGxlclxuXHRcdCk7XG5cdFx0cmV0dXJuIHJlc3VsdFswXTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgZG9jdWVtbnQgd2l0aCBhIHN0YW5kYXJkIFBPU1QgcmVxdWVzdC5cblx0ICogQHBhcmFtIG1haW5MaXN0QmluZGluZ1xuXHQgKiBAcGFyYW0gcGFyYW1ldGVyc1xuXHQgKiBAcGFyYW0gYXBwQ29tcG9uZW50XG5cdCAqIEBwYXJhbSByZXNvdXJjZU1vZGVsXG5cdCAqIEBwYXJhbSBtZXNzYWdlSGFuZGxlclxuXHQgKiBAcGFyYW0gZnJvbUNvcHlQYXN0ZVxuXHQgKiBAcmV0dXJucyBUaGUgY3JlYXRlZCBjb250ZXh0LlxuXHQgKi9cblx0cHJpdmF0ZSBhc3luYyBwZXJmb3JtQ3JlYXRpb25XaXRoUE9TVChcblx0XHRtYWluTGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcsXG5cdFx0cGFyYW1ldGVyczogQ3JlYXRlUGFyYW1ldGVycyxcblx0XHRhcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCxcblx0XHRyZXNvdXJjZU1vZGVsOiBSZXNvdXJjZU1vZGVsLFxuXHRcdG1lc3NhZ2VIYW5kbGVyOiBNZXNzYWdlSGFuZGxlcixcblx0XHRmcm9tQ29weVBhc3RlOiBib29sZWFuXG5cdCk6IFByb21pc2U8T0RhdGFWNENvbnRleHQgfCB1bmRlZmluZWQ+IHtcblx0XHR0cnkge1xuXHRcdFx0bGV0IG5ld0RvY3VtZW50Q29udGV4dDogT0RhdGFWNENvbnRleHQgfCB1bmRlZmluZWQ7XG5cdFx0XHRjb25zdCBpbml0aWFsRGF0YSA9IHBhcmFtZXRlcnMuZGF0YTtcblx0XHRcdGlmICghZnJvbUNvcHlQYXN0ZSkge1xuXHRcdFx0XHRjb25zdCBkZWZhdWx0VmFsdWVGdW5jdGlvbkRhdGEgPSBhd2FpdCB0aGlzLmdldERhdGFGcm9tRGVmYXVsdFZhbHVlRnVuY3Rpb24obWFpbkxpc3RCaW5kaW5nKTtcblx0XHRcdFx0cGFyYW1ldGVycy5kYXRhID0gT2JqZWN0LmFzc2lnbih7fSwgZGVmYXVsdFZhbHVlRnVuY3Rpb25EYXRhLCBwYXJhbWV0ZXJzLmRhdGEpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHBhcmFtZXRlcnMuZGF0YSkge1xuXHRcdFx0XHRkZWxldGUgcGFyYW1ldGVycy5kYXRhW1wiQG9kYXRhLmNvbnRleHRcIl07XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IGNhbkhhdmVEaWFsb2cgPSBwYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSAhPT0gQ3JlYXRpb25Nb2RlLkNyZWF0aW9uUm93ICYmIHBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlICE9PSBDcmVhdGlvbk1vZGUuSW5saW5lO1xuXHRcdFx0Y29uc3QgY3JlYXRpb25EaWFsb2dGaWVsZHMgPSBjYW5IYXZlRGlhbG9nID8gdGhpcy5nZXRDcmVhdGlvblBhcmFtZXRlcnMobWFpbkxpc3RCaW5kaW5nLCBpbml0aWFsRGF0YSwgYXBwQ29tcG9uZW50KSA6IFtdO1xuXHRcdFx0aWYgKHBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlID09PSBDcmVhdGlvbk1vZGUuQ3JlYXRpb25EaWFsb2cpIHtcblx0XHRcdFx0cGFyYW1ldGVycy5jcmVhdGlvbkRpYWxvZ0ZpZWxkcz8uZm9yRWFjaCgoZmllbGROYW1lKSA9PiB7XG5cdFx0XHRcdFx0aWYgKCFjcmVhdGlvbkRpYWxvZ0ZpZWxkcy5pbmNsdWRlcyhmaWVsZE5hbWUpKSB7XG5cdFx0XHRcdFx0XHRjcmVhdGlvbkRpYWxvZ0ZpZWxkcy5wdXNoKGZpZWxkTmFtZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHRpZiAoY3JlYXRpb25EaWFsb2dGaWVsZHMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRcdFx0Ly8gSW4gQ3JlYXRpb25EaWFsb2cgbW9kZSwgdGhlIGRpYWxvZyBpcyBtYW5kYXRvcnlcblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJObyBmaWVsZHMgYXZhaWxhYmxlIGZvciB0aGUgY3JlYXRpb24gZGlhbG9nXCIpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGlmIChjcmVhdGlvbkRpYWxvZ0ZpZWxkcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdG5ld0RvY3VtZW50Q29udGV4dCA9IGF3YWl0IHRoaXMuY3JlYXRlV2l0aERpYWxvZyhcblx0XHRcdFx0XHRtYWluTGlzdEJpbmRpbmcsXG5cdFx0XHRcdFx0Y3JlYXRpb25EaWFsb2dGaWVsZHMsXG5cdFx0XHRcdFx0cGFyYW1ldGVycyxcblx0XHRcdFx0XHRhcHBDb21wb25lbnQsXG5cdFx0XHRcdFx0cmVzb3VyY2VNb2RlbCxcblx0XHRcdFx0XHRtZXNzYWdlSGFuZGxlclxuXHRcdFx0XHQpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0bmV3RG9jdW1lbnRDb250ZXh0ID0gYXdhaXQgdGhpcy5jcmVhdGVEb2N1bWVudENvbnRleHQobWFpbkxpc3RCaW5kaW5nLCBwYXJhbWV0ZXJzKTtcblx0XHRcdFx0aWYgKCFwYXJhbWV0ZXJzLmluYWN0aXZlKSB7XG5cdFx0XHRcdFx0YXdhaXQgdGhpcy53YWl0Rm9yQ3JlYXRlQ29tcGxldGlvbihuZXdEb2N1bWVudENvbnRleHQsIHBhcmFtZXRlcnMua2VlcFRyYW5zaWVudENvbnRleHRPbkZhaWxlZCA9PT0gdHJ1ZSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiBuZXdEb2N1bWVudENvbnRleHQ7XG5cdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdGNvbnN0IG1zZyA9IChlcnJvciBhcyBFcnJvcikubWVzc2FnZSA/PyBlcnJvcjtcblx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGNyZWF0aW5nIHRoZSBuZXcgZG9jdW1lbnRcIiwgbXNnKTtcblx0XHRcdHRocm93IG1zZztcblx0XHR9XG5cdH1cblxuXHRfaXNEcmFmdEVuYWJsZWQodkNvbnRleHRzOiBPRGF0YVY0Q29udGV4dFtdKTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgY29udGV4dEZvckRyYWZ0TW9kZWwgPSB2Q29udGV4dHNbMF07XG5cdFx0Y29uc3Qgc1Byb2dyYW1taW5nTW9kZWwgPSB0aGlzLmdldFByb2dyYW1taW5nTW9kZWwoY29udGV4dEZvckRyYWZ0TW9kZWwpO1xuXHRcdHJldHVybiBzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdDtcblx0fVxuXG5cdC8qKlxuXHQgKiBEZWxldGUgb25lIG9yIG11bHRpcGxlIGRvY3VtZW50KHMpLlxuXHQgKiBAcGFyYW0gY29udGV4dHMgQ29udGV4dHMgRWl0aGVyIG9uZSBjb250ZXh0IG9yIGFuIGFycmF5IHdpdGggY29udGV4dHMgdG8gYmUgZGVsZXRlZFxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMgT3B0aW9uYWwsIGNhbiBjb250YWluIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLnRpdGxlIFRpdGxlIG9mIHRoZSBvYmplY3QgdG8gYmUgZGVsZXRlZFxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMuZGVzY3JpcHRpb24gRGVzY3JpcHRpb24gb2YgdGhlIG9iamVjdCB0byBiZSBkZWxldGVkXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5udW1iZXJPZlNlbGVjdGVkQ29udGV4dHMgTnVtYmVyIG9mIG9iamVjdHMgc2VsZWN0ZWRcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLm5vRGlhbG9nIFRvIGRpc2FibGUgdGhlIGNvbmZpcm1hdGlvbiBkaWFsb2dcblx0ICogQHBhcmFtIGFwcENvbXBvbmVudCBUaGUgYXBwQ29tcG9uZW50XG5cdCAqIEBwYXJhbSByZXNvdXJjZU1vZGVsIFRoZSByZXNvdXJjZSBtb2RlbCB0byBsb2FkIHRleHQgcmVzb3VyY2VzXG5cdCAqIEBwYXJhbSBtZXNzYWdlSGFuZGxlciBUaGUgbWVzc2FnZSBoYW5kbGVyIGV4dGVuc2lvblxuXHQgKiBAcmV0dXJucyBBIFByb21pc2UgcmVzb2x2ZWQgb25jZSB0aGUgZG9jdW1lbnRzIGFyZSBkZWxldGVkXG5cdCAqL1xuXHRhc3luYyBkZWxldGVEb2N1bWVudChcblx0XHRjb250ZXh0czogT0RhdGFWNENvbnRleHQgfCBPRGF0YVY0Q29udGV4dFtdLFxuXHRcdG1QYXJhbWV0ZXJzOiBUcmFuc2FjdGlvbkRlbGV0ZVBhcmFtZXRlcnMsXG5cdFx0YXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsXG5cdFx0cmVzb3VyY2VNb2RlbDogUmVzb3VyY2VNb2RlbCxcblx0XHRtZXNzYWdlSGFuZGxlcjogTWVzc2FnZUhhbmRsZXJcblx0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Ly8gZGVsZXRlIGRvY3VtZW50IGxvY2tcblx0XHR0aGlzLmJ1c3lMb2NrKGFwcENvbXBvbmVudCk7XG5cblx0XHRjb25zdCBjb250ZXh0c1RvRGVsZXRlID0gQXJyYXkuaXNBcnJheShjb250ZXh0cykgPyBbLi4uY29udGV4dHNdIDogW2NvbnRleHRzXTtcblx0XHRjb25zdCBmaXJzdENvbnRleHQgPSAobVBhcmFtZXRlcnMuc2VsZWN0ZWRDb250ZXh0cyA/PyBjb250ZXh0c1RvRGVsZXRlKVswXTtcblxuXHRcdHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRjb25zdCBkcmFmdEVuYWJsZWQgPSB0aGlzLl9pc0RyYWZ0RW5hYmxlZChtUGFyYW1ldGVycy5zZWxlY3RlZENvbnRleHRzIHx8IGNvbnRleHRzVG9EZWxldGUpO1xuXHRcdFx0XHRjb25zdCBpdGVtczogQ29udHJvbFtdID0gW107XG5cdFx0XHRcdGxldCBvcHRpb25zOiBEZWxldGVPcHRpb25bXSA9IFtdO1xuXHRcdFx0XHRsZXQgdW5TYXZlZENvbnRleHQ6IENvbnRleHQgfCB1bmRlZmluZWQ7XG5cdFx0XHRcdC8vIGl0ZW1zKHRleHRzKSBhbmQgb3B0aW9ucyhjaGVja0JveGVzIGFuZCBzaW5nbGUgZGVmYXVsdCBvcHRpb24pIGZvciBjb25maXJtIGRpYWxvZy5cblx0XHRcdFx0aWYgKG1QYXJhbWV0ZXJzKSB7XG5cdFx0XHRcdFx0bVBhcmFtZXRlcnMgPSBnZXRQYXJhbWV0ZXJzKG1QYXJhbWV0ZXJzKTtcblx0XHRcdFx0XHRtUGFyYW1ldGVycy5lbnRpdHlTZXROYW1lID0gdGhpcy5nZXRDb2xsZWN0aW9uTmFtZUZyb21Db250ZXh0KGZpcnN0Q29udGV4dCk7XG5cdFx0XHRcdFx0aWYgKCFtUGFyYW1ldGVycy5udW1iZXJPZlNlbGVjdGVkQ29udGV4dHMpIHtcblx0XHRcdFx0XHRcdC8vIG5vbi1UYWJsZVxuXHRcdFx0XHRcdFx0aWYgKGRyYWZ0RW5hYmxlZCkge1xuXHRcdFx0XHRcdFx0XHQvLyBDaGVjayBpZiAxIG9mIHRoZSBkcmFmdHMgaXMgbG9ja2VkIGJ5IGFub3RoZXIgdXNlclxuXHRcdFx0XHRcdFx0XHRjb25zdCBsb2NrZWRDb250ZXh0ID0gY29udGV4dHNUb0RlbGV0ZS5maW5kKChjb250ZXh0KSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgY29udGV4dERhdGEgPSBjb250ZXh0LmdldE9iamVjdCgpO1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiAoXG5cdFx0XHRcdFx0XHRcdFx0XHRjb250ZXh0RGF0YS5Jc0FjdGl2ZUVudGl0eSA9PT0gdHJ1ZSAmJlxuXHRcdFx0XHRcdFx0XHRcdFx0Y29udGV4dERhdGEuSGFzRHJhZnRFbnRpdHkgPT09IHRydWUgJiZcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnRleHREYXRhLkRyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhICYmXG5cdFx0XHRcdFx0XHRcdFx0XHRjb250ZXh0RGF0YS5EcmFmdEFkbWluaXN0cmF0aXZlRGF0YS5JblByb2Nlc3NCeVVzZXIgJiZcblx0XHRcdFx0XHRcdFx0XHRcdCFjb250ZXh0RGF0YS5EcmFmdEFkbWluaXN0cmF0aXZlRGF0YS5EcmFmdElzQ3JlYXRlZEJ5TWVcblx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0aWYgKGxvY2tlZENvbnRleHQpIHtcblx0XHRcdFx0XHRcdFx0XHQvLyBTaG93IG1lc3NhZ2UgYm94IHdpdGggdGhlIG5hbWUgb2YgdGhlIGxvY2tpbmcgdXNlciBhbmQgcmV0dXJuXG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgbG9ja2luZ1VzZXJOYW1lID0gbG9ja2VkQ29udGV4dC5nZXRPYmplY3QoKS5EcmFmdEFkbWluaXN0cmF0aXZlRGF0YS5JblByb2Nlc3NCeVVzZXI7XG5cdFx0XHRcdFx0XHRcdFx0TWVzc2FnZUJveC5zaG93KFxuXHRcdFx0XHRcdFx0XHRcdFx0cmVzb3VyY2VNb2RlbC5nZXRUZXh0KFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfQ09ORklSTV9ERUxFVEVfV0lUSF9TSU5HTEVfT0JKRUNUX0xPQ0tFRFwiLCBbXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGxvY2tpbmdVc2VyTmFtZVxuXHRcdFx0XHRcdFx0XHRcdFx0XSksXG5cdFx0XHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHRpdGxlOiByZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX0NPTU1PTl9ERUxFVEVcIiksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdG9uQ2xvc2U6IHJlamVjdFxuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdHVuU2F2ZWRDb250ZXh0ID0gY29udGV4dHNUb0RlbGV0ZS5maW5kKChjb250ZXh0KSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRjb25zdCB7IElzQWN0aXZlRW50aXR5LCBIYXNEcmFmdEVudGl0eSwgRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEgfSA9IGNvbnRleHQuZ2V0T2JqZWN0KCkgfHwge307XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gSXNBY3RpdmVFbnRpdHkgPT09IHRydWUgJiYgSGFzRHJhZnRFbnRpdHkgPT09IHRydWUgJiYgISFEcmFmdEFkbWluaXN0cmF0aXZlRGF0YT8uSW5Qcm9jZXNzQnlVc2VyO1xuXHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRsZXQgbm9uVGFibGVUeHQgPSBcIlwiO1xuXHRcdFx0XHRcdFx0aWYgKHVuU2F2ZWRDb250ZXh0KSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IHVuU2F2ZWRDb250ZXh0VXNlciA9IHVuU2F2ZWRDb250ZXh0LmdldE9iamVjdCgpLkRyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhLkluUHJvY2Vzc0J5VXNlcjtcblx0XHRcdFx0XHRcdFx0bm9uVGFibGVUeHQgPSByZXNvdXJjZU1vZGVsLmdldFRleHQoXG5cdFx0XHRcdFx0XHRcdFx0XCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9DT05GSVJNX0RFTEVURV9XSVRIX1VOU0FWRURfQ0hBTkdFU1wiLFxuXHRcdFx0XHRcdFx0XHRcdFt1blNhdmVkQ29udGV4dFVzZXJdLFxuXHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmVudGl0eVNldE5hbWVcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAobVBhcmFtZXRlcnMudGl0bGUpIHtcblx0XHRcdFx0XHRcdFx0aWYgKG1QYXJhbWV0ZXJzLmRlc2NyaXB0aW9uKSB7XG5cdFx0XHRcdFx0XHRcdFx0bm9uVGFibGVUeHQgPSByZXNvdXJjZU1vZGVsLmdldFRleHQoXG5cdFx0XHRcdFx0XHRcdFx0XHRcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0NPTkZJUk1fREVMRVRFX1dJVEhfT0JKRUNUSU5GT1wiLFxuXHRcdFx0XHRcdFx0XHRcdFx0W21QYXJhbWV0ZXJzLnRpdGxlLCBtUGFyYW1ldGVycy5kZXNjcmlwdGlvbl0sXG5cdFx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5lbnRpdHlTZXROYW1lXG5cdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRub25UYWJsZVR4dCA9IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcblx0XHRcdFx0XHRcdFx0XHRcdFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfQ09ORklSTV9ERUxFVEVfV0lUSF9PQkpFQ1RUSVRMRV9PTkxZXCIsXG5cdFx0XHRcdFx0XHRcdFx0XHRbbVBhcmFtZXRlcnMudGl0bGVdLFxuXHRcdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMuZW50aXR5U2V0TmFtZVxuXHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdG5vblRhYmxlVHh0ID0gcmVzb3VyY2VNb2RlbC5nZXRUZXh0KFxuXHRcdFx0XHRcdFx0XHRcdFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfQ09ORklSTV9ERUxFVEVfV0lUSF9PQkpFQ1RUSVRMRV9TSU5HVUxBUlwiLFxuXHRcdFx0XHRcdFx0XHRcdHVuZGVmaW5lZCxcblx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5lbnRpdHlTZXROYW1lXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRvcHRpb25zLnB1c2goe1xuXHRcdFx0XHRcdFx0XHR0eXBlOiBEZWxldGVPcHRpb25UeXBlcy5kZWxldGFibGVDb250ZXh0cyxcblx0XHRcdFx0XHRcdFx0Y29udGV4dHM6IGNvbnRleHRzVG9EZWxldGUsXG5cdFx0XHRcdFx0XHRcdHRleHQ6IG5vblRhYmxlVHh0LFxuXHRcdFx0XHRcdFx0XHRzZWxlY3RlZDogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0Y29udHJvbDogRGVsZXRlRGlhbG9nQ29udGVudENvbnRyb2wuVEVYVFxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdC8vIFRhYmxlXG5cdFx0XHRcdFx0XHRsZXQgdG90YWxEZWxldGFibGUgPSBjb250ZXh0c1RvRGVsZXRlLmxlbmd0aDtcblxuXHRcdFx0XHRcdFx0aWYgKGRyYWZ0RW5hYmxlZCkge1xuXHRcdFx0XHRcdFx0XHR0b3RhbERlbGV0YWJsZSArPVxuXHRcdFx0XHRcdFx0XHRcdChtUGFyYW1ldGVycy5kcmFmdHNXaXRoTm9uRGVsZXRhYmxlQWN0aXZlPy5sZW5ndGggPz8gMCkgK1xuXHRcdFx0XHRcdFx0XHRcdChtUGFyYW1ldGVycy5kcmFmdHNXaXRoRGVsZXRhYmxlQWN0aXZlPy5sZW5ndGggPz8gMCkgK1xuXHRcdFx0XHRcdFx0XHRcdChtUGFyYW1ldGVycy51blNhdmVkQ29udGV4dHM/Lmxlbmd0aCA/PyAwKTtcblx0XHRcdFx0XHRcdFx0ZGVsZXRlSGVscGVyLnVwZGF0ZURyYWZ0T3B0aW9uc0ZvckRlbGV0YWJsZVRleHRzKFxuXHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLFxuXHRcdFx0XHRcdFx0XHRcdGNvbnRleHRzVG9EZWxldGUsXG5cdFx0XHRcdFx0XHRcdFx0dG90YWxEZWxldGFibGUsXG5cdFx0XHRcdFx0XHRcdFx0cmVzb3VyY2VNb2RlbCxcblx0XHRcdFx0XHRcdFx0XHRpdGVtcyxcblx0XHRcdFx0XHRcdFx0XHRvcHRpb25zXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBub25EZWxldGFibGVUZXh0ID0gZGVsZXRlSGVscGVyLmdldE5vbkRlbGV0YWJsZVRleHQobVBhcmFtZXRlcnMsIHRvdGFsRGVsZXRhYmxlLCByZXNvdXJjZU1vZGVsKTtcblx0XHRcdFx0XHRcdFx0aWYgKG5vbkRlbGV0YWJsZVRleHQpIHtcblx0XHRcdFx0XHRcdFx0XHRpdGVtcy5wdXNoKG5vbkRlbGV0YWJsZVRleHQpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGNvbnN0IG9wdGlvbnNEZWxldGFibGVUZXh0cyA9IGRlbGV0ZUhlbHBlci5nZXRPcHRpb25zRm9yRGVsZXRhYmxlVGV4dHMoXG5cdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLFxuXHRcdFx0XHRcdFx0XHRjb250ZXh0c1RvRGVsZXRlLFxuXHRcdFx0XHRcdFx0XHRyZXNvdXJjZU1vZGVsXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0b3B0aW9ucyA9IFsuLi5vcHRpb25zLCAuLi5vcHRpb25zRGVsZXRhYmxlVGV4dHNdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNvbnN0IGNvbW1vbkJpbmRpbmcgPSBmaXJzdENvbnRleHQuZ2V0QmluZGluZygpIGFzIEJpbmRpbmc7XG5cdFx0XHRcdGxldCBiaW5kaW5nVHlwZTogXCJUcmVlXCIgfCBcIkFuYWx5dGljYWxcIiB8IHVuZGVmaW5lZDtcblx0XHRcdFx0aWYgKGNvbW1vbkJpbmRpbmcuaXNBPE9EYXRhTGlzdEJpbmRpbmc+KFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIikpIHtcblx0XHRcdFx0XHRpZiAodGhpcy5pc0xpc3RCaW5kaW5nSGllcmFyY2hpY2FsKGNvbW1vbkJpbmRpbmcpKSB7XG5cdFx0XHRcdFx0XHRiaW5kaW5nVHlwZSA9IFwiVHJlZVwiO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAodGhpcy5pc0xpc3RCaW5kaW5nQW5hbHl0aWNhbChjb21tb25CaW5kaW5nKSkge1xuXHRcdFx0XHRcdFx0YmluZGluZ1R5cGUgPSBcIkFuYWx5dGljYWxcIjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBDb250ZW50IG9mIERlbGV0ZSBEaWFsb2dcblx0XHRcdFx0ZGVsZXRlSGVscGVyLnVwZGF0ZUNvbnRlbnRGb3JEZWxldGVEaWFsb2cob3B0aW9ucywgaXRlbXMpO1xuXHRcdFx0XHRjb25zdCBmbkNvbmZpcm0gPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG5cdFx0XHRcdFx0bWVzc2FnZUhhbmRsaW5nLnJlbW92ZUJvdW5kVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cdFx0XHRcdFx0dGhpcy5idXN5TG9jayhhcHBDb21wb25lbnQpO1xuXG5cdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdGF3YWl0IGRlbGV0ZUhlbHBlci5kZWxldGVDb25maXJtSGFuZGxlcihcblx0XHRcdFx0XHRcdFx0b3B0aW9ucyxcblx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMsXG5cdFx0XHRcdFx0XHRcdG1lc3NhZ2VIYW5kbGVyLFxuXHRcdFx0XHRcdFx0XHRyZXNvdXJjZU1vZGVsLFxuXHRcdFx0XHRcdFx0XHRhcHBDb21wb25lbnQsXG5cdFx0XHRcdFx0XHRcdGRyYWZ0RW5hYmxlZCxcblx0XHRcdFx0XHRcdFx0YmluZGluZ1R5cGVcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRyZXNvbHZlKCk7XG5cdFx0XHRcdFx0fSBjYXRjaCAob0Vycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdFx0XHRyZWplY3QoKTtcblx0XHRcdFx0XHR9IGZpbmFsbHkge1xuXHRcdFx0XHRcdFx0dGhpcy5idXN5VW5sb2NrKGFwcENvbXBvbmVudCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9O1xuXG5cdFx0XHRcdGNvbnN0IGRpYWxvZyA9IHRoaXMuY3JlYXRlRGVsZXRlRGlhbG9nKGl0ZW1zLCBtUGFyYW1ldGVycywgcmVzb3VyY2VNb2RlbCwgZm5Db25maXJtLCByZWplY3QpO1xuXG5cdFx0XHRcdGlmIChtUGFyYW1ldGVycy5ub0RpYWxvZyA9PT0gdHJ1ZSB8fCBtUGFyYW1ldGVycy5zaWxlbnRNb2RlID09PSB0cnVlKSB7XG5cdFx0XHRcdFx0Zm5Db25maXJtKCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0ZGlhbG9nLmFkZFN0eWxlQ2xhc3MoXCJzYXBVaUNvbnRlbnRQYWRkaW5nXCIpO1xuXHRcdFx0XHRcdGRpYWxvZy5vcGVuKCk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZmluYWxseSB7XG5cdFx0XHRcdC8vIGRlbGV0ZSBkb2N1bWVudCB1bmxvY2tcblx0XHRcdFx0dGhpcy5idXN5VW5sb2NrKGFwcENvbXBvbmVudCk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlIHRoZSBjb25maXJtYXRpb24gZGlhbG9nIGZvIHRoZSBkZWxldGlvbi5cblx0ICogQHBhcmFtIGl0ZW1zIEFuIGFycmF5IG9mIGNvbnRyb2xzIHVzZWQgZm9yIHRoZSBkaWFsb2cgY29udGVudFxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycyBDb250YWlucyB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLnBhcmVudENvbnRyb2wgUGFyZW50IGNvbnRyb2wgb2YgdGhlIGRlbGV0ZSBidXR0b24gaWYgYW55XG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmVudGl0eVNldE5hbWUgTmFtZSBvZiB0aGUgY3VycmVudCBlbnRpdHlTZXRcblx0ICogQHBhcmFtIHJlc291cmNlTW9kZWwgVGhlIHJlc291cmNlIG1vZGVsIHRvIGxvYWQgdGV4dCByZXNvdXJjZXNcblx0ICogQHBhcmFtIGZuQ29uZmlybSBGdW5jdGlvbiBleGVjdXRlZCB1cG9uIHRoZSB2YWxpZGF0aW9uIG9mIHRoZSBkZWxldGlvblxuXHQgKiBAcGFyYW0gZm5SZWplY3QgRnVuY3Rpb24gZXhlY3V0ZWQgaWYgdGhlIGRpYWxvZyBpcyBjbG9zZWQgdmlhIENhbmNlbCBvciBFc2NhcGUgYnV0dG9uXG5cdCAqIEByZXR1cm5zIFRoZSBjcmVhdGVkIGRlbGV0ZSBjb25maXJtYXRpb24gZGlhbG9nXG5cdCAqL1xuXHRjcmVhdGVEZWxldGVEaWFsb2coXG5cdFx0aXRlbXM6IENvbnRyb2xbXSxcblx0XHRwYXJhbWV0ZXJzOiBQYXJ0aWFsPHsgcGFyZW50Q29udHJvbDogQ29udHJvbCB8IHVuZGVmaW5lZDsgZW50aXR5U2V0TmFtZTogc3RyaW5nIH0+LFxuXHRcdHJlc291cmNlTW9kZWw6IFJlc291cmNlTW9kZWwsXG5cdFx0Zm5Db25maXJtOiBGdW5jdGlvbixcblx0XHRmblJlamVjdDogRnVuY3Rpb25cblx0KTogRGlhbG9nIHtcblx0XHRsZXQgZGlhbG9nQ29uZmlybWVkID0gZmFsc2U7XG5cdFx0Y29uc3QgdkJveCA9IG5ldyBWQm94KHsgaXRlbXM6IGl0ZW1zIH0pO1xuXHRcdGNvbnN0IHJlc291cmNlQnVuZGxlQ29yZSA9IExpYnJhcnkuZ2V0UmVzb3VyY2VCdW5kbGVGb3IoXCJzYXAuZmUuY29yZVwiKSE7XG5cdFx0bGV0IHRpdGxlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cdFx0aWYgKHBhcmFtZXRlcnMucGFyZW50Q29udHJvbD8uaXNBKFwic2FwLnVpLm1kYy5UYWJsZVwiKSkge1xuXHRcdFx0dGl0bGUgPSByZXNvdXJjZU1vZGVsLmdldFRleHQoXCJNX0NPTU1PTl9UQUJMRV9ERUxFVEVcIiwgdW5kZWZpbmVkLCBwYXJhbWV0ZXJzLmVudGl0eVNldE5hbWUpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aXRsZSA9IHJlc291cmNlQnVuZGxlQ29yZS5nZXRUZXh0KFwiQ19DT01NT05fREVMRVRFXCIpO1xuXHRcdH1cblx0XHRjb25zdCBkaWFsb2cgPSBuZXcgRGlhbG9nKHtcblx0XHRcdHRpdGxlOiB0aXRsZSxcblx0XHRcdHN0YXRlOiBcIldhcm5pbmdcIixcblx0XHRcdGNvbnRlbnQ6IFt2Qm94XSxcblx0XHRcdGFyaWFMYWJlbGxlZEJ5OiBpdGVtcyxcblx0XHRcdGJlZ2luQnV0dG9uOiBuZXcgQnV0dG9uKHtcblx0XHRcdFx0dGV4dDogdGl0bGUsXG5cdFx0XHRcdHR5cGU6IFwiRW1waGFzaXplZFwiLFxuXHRcdFx0XHRwcmVzczogZnVuY3Rpb24gKCk6IHZvaWQge1xuXHRcdFx0XHRcdGRpYWxvZ0NvbmZpcm1lZCA9IHRydWU7XG5cdFx0XHRcdFx0ZGlhbG9nLmNsb3NlKCk7XG5cdFx0XHRcdFx0Zm5Db25maXJtKCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pLFxuXHRcdFx0ZW5kQnV0dG9uOiBuZXcgQnV0dG9uKHtcblx0XHRcdFx0dGV4dDogcmVzb3VyY2VNb2RlbC5nZXRUZXh0KFwiQ19DT01NT05fRElBTE9HX0NBTkNFTFwiKSxcblx0XHRcdFx0cHJlc3M6IGZ1bmN0aW9uICgpOiB2b2lkIHtcblx0XHRcdFx0XHRkaWFsb2cuY2xvc2UoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSksXG5cdFx0XHRhZnRlckNsb3NlOiBmdW5jdGlvbiAoKTogdm9pZCB7XG5cdFx0XHRcdGRpYWxvZy5kZXN0cm95KCk7XG5cdFx0XHRcdC8vIGlmIGRpYWxvZyBpcyBjbG9zZWQgdW5jb25maXJtZWQgKGUuZy4gdmlhIFwiQ2FuY2VsXCIgb3IgRXNjYXBlIGJ1dHRvbiksIGVuc3VyZSB0byByZWplY3QgcHJvbWlzZVxuXHRcdFx0XHRpZiAoIWRpYWxvZ0NvbmZpcm1lZCkge1xuXHRcdFx0XHRcdGZuUmVqZWN0KCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblx0XHRyZXR1cm4gZGlhbG9nO1xuXHR9XG5cblx0LyoqXG5cdCAqIEVkaXRzIGEgZG9jdW1lbnQuXG5cdCAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IG9mIHRoZSBhY3RpdmUgZG9jdW1lbnRcblx0ICogQHBhcmFtIG9WaWV3IEN1cnJlbnQgdmlld1xuXHQgKiBAcGFyYW0gYXBwQ29tcG9uZW50IFRoZSBhcHBDb21wb25lbnRcblx0ICogQHBhcmFtIG1lc3NhZ2VIYW5kbGVyIFRoZSBtZXNzYWdlIGhhbmRsZXIgZXh0ZW5zaW9uXG5cdCAqIEBwYXJhbSBncm91cElkIFRoZSBiYXRjaCBncm91cElkIGZvciBwb3N0IGNhbGwgb2YgZWRpdCBhY3Rpb25cblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyB3aXRoIHRoZSBuZXcgZHJhZnQgY29udGV4dCBpbiBjYXNlIG9mIGRyYWZ0IHByb2dyYW1taW5nIG1vZGVsXG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0YXN5bmMgZWRpdERvY3VtZW50KFxuXHRcdG9Db250ZXh0OiBPRGF0YVY0Q29udGV4dCxcblx0XHRvVmlldzogRkVWaWV3LFxuXHRcdGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LFxuXHRcdG1lc3NhZ2VIYW5kbGVyOiBNZXNzYWdlSGFuZGxlcixcblx0XHRncm91cElkOiBzdHJpbmdcblx0KTogUHJvbWlzZTxPRGF0YVY0Q29udGV4dCB8IHVuZGVmaW5lZD4ge1xuXHRcdGNvbnN0IHNQcm9ncmFtbWluZ01vZGVsID0gdGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKG9Db250ZXh0KTtcblx0XHRpZiAoIW9Db250ZXh0KSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJCaW5kaW5nIGNvbnRleHQgdG8gYWN0aXZlIGRvY3VtZW50IGlzIHJlcXVpcmVkXCIpO1xuXHRcdH1cblx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgIT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQgJiYgc1Byb2dyYW1taW5nTW9kZWwgIT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5KSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJFZGl0IGlzIG9ubHkgYWxsb3dlZCBmb3IgZHJhZnQgb3Igc3RpY2t5IHNlc3Npb24gc3VwcG9ydGVkIHNlcnZpY2VzXCIpO1xuXHRcdH1cblx0XHR0aGlzLmJ1c3lMb2NrKGFwcENvbXBvbmVudCk7XG5cdFx0Ly8gYmVmb3JlIHRyaWdnZXJpbmcgdGhlIGVkaXQgYWN0aW9uIHdlJ2xsIGhhdmUgdG8gcmVtb3ZlIGFsbCBib3VuZCB0cmFuc2l0aW9uIG1lc3NhZ2VzXG5cdFx0bWVzc2FnZUhhbmRsZXIucmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cdFx0Y29uc3QgbWVzc2FnZUhhbmRsaW5nS2V5ID0gbWVzc2FnZUhhbmRsZXIucmVnaXN0ZXJUb0hvbGRNZXNzYWdlcygpO1xuXG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IG9OZXdDb250ZXh0ID1cblx0XHRcdFx0c1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnRcblx0XHRcdFx0XHQ/IGF3YWl0IGRyYWZ0LmNyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50KFxuXHRcdFx0XHRcdFx0XHRvQ29udGV4dCxcblx0XHRcdFx0XHRcdFx0YXBwQ29tcG9uZW50LFxuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0YlByZXNlcnZlQ2hhbmdlczogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0XHRvVmlldzogb1ZpZXdcblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0Z3JvdXBJZCxcblx0XHRcdFx0XHRcdFx0bWVzc2FnZUhhbmRsZXJcblx0XHRcdFx0XHQgIClcblx0XHRcdFx0XHQ6IGF3YWl0IHN0aWNreS5lZGl0RG9jdW1lbnRJblN0aWNreVNlc3Npb24ob0NvbnRleHQsIGFwcENvbXBvbmVudCwgbWVzc2FnZUhhbmRsZXIpO1xuXG5cdFx0XHRhd2FpdCBtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZURpYWxvZyh7IHVuSG9sZEtleTogbWVzc2FnZUhhbmRsaW5nS2V5IH0pO1xuXHRcdFx0cmV0dXJuIG9OZXdDb250ZXh0O1xuXHRcdH0gY2F0Y2ggKGVycjogdW5rbm93bikge1xuXHRcdFx0YXdhaXQgbWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VzKHsgY29uY3VycmVudEVkaXRGbGFnOiB0cnVlLCB1bkhvbGRLZXk6IG1lc3NhZ2VIYW5kbGluZ0tleSB9KTtcblx0XHRcdHRocm93IGVycjtcblx0XHR9IGZpbmFsbHkge1xuXHRcdFx0dGhpcy5idXN5VW5sb2NrKGFwcENvbXBvbmVudCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIENhbmNlbCAnZWRpdCcgbW9kZSBvZiBhIGRvY3VtZW50LlxuXHQgKiBAcGFyYW0gb0NvbnRleHQgQ29udGV4dCBvZiB0aGUgZG9jdW1lbnQgdG8gYmUgY2FuY2VsZWQgb3IgZGVsZXRlZFxuXHQgKiBAcGFyYW0gW21JblBhcmFtZXRlcnNdIE9wdGlvbmFsLCBjYW4gY29udGFpbiB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmNhbmNlbEJ1dHRvbiBDYW5jZWwgQnV0dG9uIG9mIHRoZSBkaXNjYXJkIHBvcG92ZXIgKG1hbmRhdG9yeSBmb3Igbm93KVxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5za2lwRGlzY2FyZFBvcG92ZXIgT3B0aW9uYWwsIHN1cHJlc3NlcyB0aGUgZGlzY2FyZCBwb3BvdmVyIGluY2FzZSBvZiBkcmFmdCBhcHBsaWNhdGlvbnMgd2hpbGUgbmF2aWdhdGluZyBvdXQgb2YgT1Bcblx0ICogQHBhcmFtIGFwcENvbXBvbmVudCBUaGUgYXBwQ29tcG9uZW50XG5cdCAqIEBwYXJhbSByZXNvdXJjZU1vZGVsIFRoZSBtb2RlbCB0byBsb2FkIHRleHQgcmVzb3VyY2VzXG5cdCAqIEBwYXJhbSBtZXNzYWdlSGFuZGxlciBUaGUgbWVzc2FnZSBoYW5kbGVyIGV4dGVuc2lvblxuXHQgKiBAcGFyYW0gaXNOZXdPYmplY3QgVHJ1ZSBpZiB3ZSdyZSB0cnlpbmcgdG8gY2FuY2VsIGEgbmV3bHkgY3JlYXRlZCBvYmplY3Rcblx0ICogQHBhcmFtIGlzT2JqZWN0TW9kaWZpZWQgVHJ1ZSBpZiB0aGUgb2JqZWN0IGhhcyBiZWVuIG1vZGlmaWVkIGJ5IHRoZSB1c2VyXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgd2l0aCA/Pz9cblx0ICogQGZpbmFsXG5cdCAqL1xuXHRhc3luYyBjYW5jZWxEb2N1bWVudChcblx0XHRvQ29udGV4dDogT0RhdGFWNENvbnRleHQsXG5cdFx0bUluUGFyYW1ldGVyczogQ2FuY2VsUGFyYW1ldGVycyB8IHVuZGVmaW5lZCxcblx0XHRhcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCxcblx0XHRyZXNvdXJjZU1vZGVsOiBSZXNvdXJjZU1vZGVsLFxuXHRcdG1lc3NhZ2VIYW5kbGVyOiBNZXNzYWdlSGFuZGxlcixcblx0XHRpc05ld09iamVjdDogYm9vbGVhbixcblx0XHRpc09iamVjdE1vZGlmaWVkOiBib29sZWFuXG5cdCk6IFByb21pc2U8T0RhdGFWNENvbnRleHQgfCB1bmRlZmluZWQ+IHtcblx0XHQvL2NvbnRleHQgbXVzdCBhbHdheXMgYmUgcGFzc2VkIC0gbWFuZGF0b3J5IHBhcmFtZXRlclxuXHRcdGlmICghb0NvbnRleHQpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIk5vIGNvbnRleHQgZXhpc3RzLiBQYXNzIGEgbWVhbmluZ2Z1bCBjb250ZXh0XCIpO1xuXHRcdH1cblx0XHRjb25zdCBtUGFyYW1ldGVycyA9IGdldFBhcmFtZXRlcnMobUluUGFyYW1ldGVycyk7XG5cdFx0Y29uc3Qgb01vZGVsID0gb0NvbnRleHQuZ2V0TW9kZWwoKTtcblx0XHRjb25zdCBzUHJvZ3JhbW1pbmdNb2RlbCA9IHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChvQ29udGV4dCk7XG5cblx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgIT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQgJiYgc1Byb2dyYW1taW5nTW9kZWwgIT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5KSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJDYW5jZWwgZG9jdW1lbnQgb25seSBhbGxvd2VkIGZvciBkcmFmdCBvciBzdGlja3kgc2Vzc2lvbiBzdXBwb3J0ZWQgc2VydmljZXNcIik7XG5cdFx0fVxuXHRcdHRoaXMuYnVzeUxvY2soYXBwQ29tcG9uZW50KTtcblx0XHR0cnkge1xuXHRcdFx0bGV0IHJldHVybmVkVmFsdWU6IE9EYXRhVjRDb250ZXh0IHwgdW5kZWZpbmVkO1xuXG5cdFx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQgJiYgIWlzT2JqZWN0TW9kaWZpZWQpIHtcblx0XHRcdFx0Y29uc3QgZHJhZnREYXRhQ29udGV4dCA9IG9Nb2RlbC5iaW5kQ29udGV4dChgJHtvQ29udGV4dC5nZXRQYXRoKCl9L0RyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhYCkuZ2V0Qm91bmRDb250ZXh0KCk7XG5cdFx0XHRcdGNvbnN0IGRyYWZ0QWRtaW5EYXRhID0gYXdhaXQgZHJhZnREYXRhQ29udGV4dC5yZXF1ZXN0T2JqZWN0KCk7XG5cdFx0XHRcdGlmIChkcmFmdEFkbWluRGF0YSkge1xuXHRcdFx0XHRcdGlzT2JqZWN0TW9kaWZpZWQgPSBkcmFmdEFkbWluRGF0YS5DcmVhdGlvbkRhdGVUaW1lICE9PSBkcmFmdEFkbWluRGF0YS5MYXN0Q2hhbmdlRGF0ZVRpbWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmICghbVBhcmFtZXRlcnMuc2tpcERpc2NhcmRQb3BvdmVyKSB7XG5cdFx0XHRcdGF3YWl0IHRoaXMuX2NvbmZpcm1EaXNjYXJkKG1QYXJhbWV0ZXJzLmNhbmNlbEJ1dHRvbiwgaXNPYmplY3RNb2RpZmllZCwgcmVzb3VyY2VNb2RlbCk7XG5cdFx0XHR9XG5cdFx0XHRpZiAob0NvbnRleHQuaXNLZWVwQWxpdmUoKSkge1xuXHRcdFx0XHQvLyBpZiB0aGUgY29udGV4dCBpcyBrZXB0IGFsaXZlIHdlIHNldCBpdCBhZ2FpbiB0byBkZXRhY2ggdGhlIG9uQmVmb3JlRGVzdHJveSBjYWxsYmFjayBhbmQgaGFuZGxlIG5hdmlnYXRpb24gaGVyZVxuXHRcdFx0XHQvLyB0aGUgY29udGV4dCBuZWVkcyB0byBzdGlsbCBiZSBrZXB0IGFsaXZlIHRvIGJlIGFibGUgdG8gcmVzZXQgY2hhbmdlcyBwcm9wZXJseVxuXHRcdFx0XHRvQ29udGV4dC5zZXRLZWVwQWxpdmUodHJ1ZSwgdW5kZWZpbmVkKTtcblx0XHRcdH1cblx0XHRcdGlmIChtUGFyYW1ldGVycy5iZWZvcmVDYW5jZWxDYWxsQmFjaykge1xuXHRcdFx0XHRhd2FpdCBtUGFyYW1ldGVycy5iZWZvcmVDYW5jZWxDYWxsQmFjayh7IGNvbnRleHQ6IG9Db250ZXh0IH0pO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0KSB7XG5cdFx0XHRcdGlmIChpc05ld09iamVjdCkge1xuXHRcdFx0XHRcdGlmIChvQ29udGV4dC5oYXNQZW5kaW5nQ2hhbmdlcygpKSB7XG5cdFx0XHRcdFx0XHRvQ29udGV4dC5nZXRCaW5kaW5nKCkucmVzZXRDaGFuZ2VzKCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGF3YWl0IGRyYWZ0LmRlbGV0ZURyYWZ0KG9Db250ZXh0LCBtZXNzYWdlSGFuZGxlciwgYXBwQ29tcG9uZW50KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRjb25zdCBvU2libGluZ0NvbnRleHQgPSBvTW9kZWwuYmluZENvbnRleHQoYCR7b0NvbnRleHQuZ2V0UGF0aCgpfS9TaWJsaW5nRW50aXR5YCkuZ2V0Qm91bmRDb250ZXh0KCk7XG5cdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdGNvbnN0IHNDYW5vbmljYWxQYXRoID0gYXdhaXQgb1NpYmxpbmdDb250ZXh0LnJlcXVlc3RDYW5vbmljYWxQYXRoKCk7XG5cdFx0XHRcdFx0XHRpZiAob0NvbnRleHQuaGFzUGVuZGluZ0NoYW5nZXMoKSkge1xuXHRcdFx0XHRcdFx0XHRvQ29udGV4dC5nZXRCaW5kaW5nKCkucmVzZXRDaGFuZ2VzKCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRyZXR1cm5lZFZhbHVlID0gb01vZGVsLmJpbmRDb250ZXh0KHNDYW5vbmljYWxQYXRoKS5nZXRCb3VuZENvbnRleHQoKTtcblx0XHRcdFx0XHR9IGZpbmFsbHkge1xuXHRcdFx0XHRcdFx0YXdhaXQgZHJhZnQuZGVsZXRlRHJhZnQob0NvbnRleHQsIG1lc3NhZ2VIYW5kbGVyLCBhcHBDb21wb25lbnQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3QgZGlzY2FyZGVkQ29udGV4dCA9IGF3YWl0IHN0aWNreS5kaXNjYXJkRG9jdW1lbnQob0NvbnRleHQpO1xuXHRcdFx0XHRpZiAoZGlzY2FyZGVkQ29udGV4dCkge1xuXHRcdFx0XHRcdGlmIChkaXNjYXJkZWRDb250ZXh0Lmhhc1BlbmRpbmdDaGFuZ2VzKCkpIHtcblx0XHRcdFx0XHRcdGRpc2NhcmRlZENvbnRleHQuZ2V0QmluZGluZygpLnJlc2V0Q2hhbmdlcygpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoIWlzTmV3T2JqZWN0KSB7XG5cdFx0XHRcdFx0XHRkaXNjYXJkZWRDb250ZXh0LnJlZnJlc2goKTtcblx0XHRcdFx0XHRcdHJldHVybmVkVmFsdWUgPSBkaXNjYXJkZWRDb250ZXh0O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyByZW1vdmUgZXhpc3RpbmcgYm91bmQgdHJhbnNpdGlvbiBtZXNzYWdlc1xuXHRcdFx0bWVzc2FnZUhhbmRsZXIucmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cdFx0XHQvLyBzaG93IHVuYm91bmQgbWVzc2FnZXNcblx0XHRcdGF3YWl0IG1lc3NhZ2VIYW5kbGVyLnNob3dNZXNzYWdlcygpO1xuXHRcdFx0cmV0dXJuIHJldHVybmVkVmFsdWU7XG5cdFx0fSBjYXRjaCAoZXJyOiB1bmtub3duKSB7XG5cdFx0XHRhd2FpdCBtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZXMoKTtcblx0XHRcdHRocm93IGVycjtcblx0XHR9IGZpbmFsbHkge1xuXHRcdFx0dGhpcy5idXN5VW5sb2NrKGFwcENvbXBvbmVudCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFNhdmVzIHRoZSBkb2N1bWVudC5cblx0ICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCBvZiB0aGUgZG9jdW1lbnQgdG8gYmUgc2F2ZWRcblx0ICogQHBhcmFtIGFwcENvbXBvbmVudCBUaGUgYXBwQ29tcG9uZW50XG5cdCAqIEBwYXJhbSByZXNvdXJjZU1vZGVsIFRoZSBtb2RlbCB0byBsb2FkIHRleHQgcmVzb3VyY2VzXG5cdCAqIEBwYXJhbSBleGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yIFRydWUgaWYgd2Ugc2hvdWxkIGV4ZWN1dGUgc2lkZSBlZmZlY3RzIGluIGNhc2Ugb2YgYW4gZXJyb3Jcblx0ICogQHBhcmFtIGJpbmRpbmdzRm9yU2lkZUVmZmVjdHMgVGhlIGxpc3RCaW5kaW5ncyB0byBiZSB1c2VkIGZvciBleGVjdXRpbmcgc2lkZSBlZmZlY3RzIG9uIGVycm9yXG5cdCAqIEBwYXJhbSBtZXNzYWdlSGFuZGxlciBUaGUgbWVzc2FnZSBoYW5kbGVyIGV4dGVuc2lvblxuXHQgKiBAcGFyYW0gaXNOZXdPYmplY3QgVHJ1ZSBpZiB3ZSdyZSB0cnlpbmcgdG8gY2FuY2VsIGEgbmV3bHkgY3JlYXRlZCBvYmplY3Rcblx0ICogQHBhcmFtIHNraXBDb25maXJtYXRpb25Nc2dcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyB3aXRoID8/P1xuXHQgKiBAZmluYWxcblx0ICovXG5cdGFzeW5jIHNhdmVEb2N1bWVudChcblx0XHRjb250ZXh0OiBPRGF0YVY0Q29udGV4dCxcblx0XHRhcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCxcblx0XHRyZXNvdXJjZU1vZGVsOiBSZXNvdXJjZU1vZGVsLFxuXHRcdGV4ZWN1dGVTaWRlRWZmZWN0c09uRXJyb3I6IGJvb2xlYW4sXG5cdFx0YmluZGluZ3NGb3JTaWRlRWZmZWN0czogT0RhdGFMaXN0QmluZGluZ1tdLFxuXHRcdG1lc3NhZ2VIYW5kbGVyOiBNZXNzYWdlSGFuZGxlcixcblx0XHRpc05ld09iamVjdDogYm9vbGVhbixcblx0XHRza2lwQ29uZmlybWF0aW9uTXNnID0gZmFsc2Vcblx0KTogUHJvbWlzZTxPRGF0YVY0Q29udGV4dD4ge1xuXHRcdGNvbnN0IHNQcm9ncmFtbWluZ01vZGVsID0gdGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKGNvbnRleHQpO1xuXHRcdGlmIChzUHJvZ3JhbW1pbmdNb2RlbCAhPT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kgJiYgc1Byb2dyYW1taW5nTW9kZWwgIT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIlNhdmUgaXMgb25seSBhbGxvd2VkIGZvciBkcmFmdCBvciBzdGlja3kgc2Vzc2lvbiBzdXBwb3J0ZWQgc2VydmljZXNcIik7XG5cdFx0fVxuXG5cdFx0dHJ5IHtcblx0XHRcdHRoaXMuYnVzeUxvY2soYXBwQ29tcG9uZW50KTtcblx0XHRcdGNvbnN0IGVudGl0eVNldE5hbWUgPSB0aGlzLmdldENvbGxlY3Rpb25OYW1lRnJvbUNvbnRleHQoY29udGV4dCk7XG5cdFx0XHRjb25zdCBvQWN0aXZlRG9jdW1lbnQgPVxuXHRcdFx0XHRzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdFxuXHRcdFx0XHRcdD8gYXdhaXQgZHJhZnQuYWN0aXZhdGVEb2N1bWVudChjb250ZXh0LCBhcHBDb21wb25lbnQsIHt9LCBtZXNzYWdlSGFuZGxlcilcblx0XHRcdFx0XHQ6IGF3YWl0IHN0aWNreS5hY3RpdmF0ZURvY3VtZW50KGNvbnRleHQsIGFwcENvbXBvbmVudCwgbWVzc2FnZUhhbmRsZXIpO1xuXG5cdFx0XHRjb25zdCBtZXNzYWdlc1JlY2VpdmVkID0gbWVzc2FnZUhhbmRsaW5nLmdldE1lc3NhZ2VzKCkuY29uY2F0KG1lc3NhZ2VIYW5kbGluZy5nZXRNZXNzYWdlcyh0cnVlLCB0cnVlKSk7IC8vIGdldCB1bmJvdW5kIGFuZCBib3VuZCBtZXNzYWdlcyBwcmVzZW50IGluIHRoZSBtb2RlbFxuXHRcdFx0aWYgKCFza2lwQ29uZmlybWF0aW9uTXNnICYmICEobWVzc2FnZXNSZWNlaXZlZC5sZW5ndGggPT09IDEgJiYgbWVzc2FnZXNSZWNlaXZlZFswXS5nZXRUeXBlKCkgPT09IE1lc3NhZ2VUeXBlLlN1Y2Nlc3MpKSB7XG5cdFx0XHRcdC8vIHNob3cgb3VyIG9iamVjdCBjcmVhdGlvbiB0b2FzdCBvbmx5IGlmIGl0IGlzIG5vdCBjb21pbmcgZnJvbSBiYWNrZW5kXG5cdFx0XHRcdE1lc3NhZ2VUb2FzdC5zaG93KFxuXHRcdFx0XHRcdGlzTmV3T2JqZWN0XG5cdFx0XHRcdFx0XHQ/IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX09CSkVDVF9DUkVBVEVEXCIsIHVuZGVmaW5lZCwgZW50aXR5U2V0TmFtZSlcblx0XHRcdFx0XHRcdDogcmVzb3VyY2VNb2RlbC5nZXRUZXh0KFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfT0JKRUNUX1NBVkVEXCIsIHVuZGVmaW5lZCwgZW50aXR5U2V0TmFtZSlcblx0XHRcdFx0KTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIG9BY3RpdmVEb2N1bWVudDtcblx0XHR9IGNhdGNoIChlcnI6IHVua25vd24pIHtcblx0XHRcdGlmIChleGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yICYmIGJpbmRpbmdzRm9yU2lkZUVmZmVjdHM/Lmxlbmd0aCA+IDApIHtcblx0XHRcdFx0LyogVGhlIHNpZGVFZmZlY3RzIGFyZSBleGVjdXRlZCBvbmx5IGZvciB0YWJsZSBpdGVtcyBpbiB0cmFuc2llbnQgc3RhdGUgKi9cblx0XHRcdFx0YmluZGluZ3NGb3JTaWRlRWZmZWN0cy5mb3JFYWNoKChsaXN0QmluZGluZykgPT4ge1xuXHRcdFx0XHRcdGlmICghQ29tbW9uVXRpbHMuaGFzVHJhbnNpZW50Q29udGV4dChsaXN0QmluZGluZykpIHtcblx0XHRcdFx0XHRcdGFwcENvbXBvbmVudC5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKS5yZXF1ZXN0U2lkZUVmZmVjdHNGb3JOYXZpZ2F0aW9uUHJvcGVydHkobGlzdEJpbmRpbmcuZ2V0UGF0aCgpLCBjb250ZXh0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdFx0YXdhaXQgbWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VzKCk7XG5cdFx0XHR0aHJvdyBlcnI7XG5cdFx0fSBmaW5hbGx5IHtcblx0XHRcdHRoaXMuYnVzeVVubG9jayhhcHBDb21wb25lbnQpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBDYWxscyBhIGJvdW5kIG9yIHVuYm91bmQgYWN0aW9uLlxuXHQgKiBAcGFyYW0gc0FjdGlvbk5hbWUgVGhlIG5hbWUgb2YgdGhlIGFjdGlvbiB0byBiZSBjYWxsZWRcblx0ICogQHBhcmFtIFttUGFyYW1ldGVyc10gQ29udGFpbnMgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuXHQgKiBAcGFyYW0gW21QYXJhbWV0ZXJzLnBhcmFtZXRlclZhbHVlc10gQSBtYXAgb2YgYWN0aW9uIHBhcmFtZXRlciBuYW1lcyBhbmQgcHJvdmlkZWQgdmFsdWVzXG5cdCAqIEBwYXJhbSBbbVBhcmFtZXRlcnMuc2tpcFBhcmFtZXRlckRpYWxvZ10gU2tpcHMgdGhlIHBhcmFtZXRlciBkaWFsb2cgaWYgdmFsdWVzIGFyZSBwcm92aWRlZCBmb3IgYWxsIG9mIHRoZW1cblx0ICogQHBhcmFtIFttUGFyYW1ldGVycy5jb250ZXh0c10gTWFuZGF0b3J5IGZvciBhIGJvdW5kIGFjdGlvbjogRWl0aGVyIG9uZSBjb250ZXh0IG9yIGFuIGFycmF5IHdpdGggY29udGV4dHMgZm9yIHdoaWNoIHRoZSBhY3Rpb24gaXMgdG8gYmUgY2FsbGVkXG5cdCAqIEBwYXJhbSBbbVBhcmFtZXRlcnMubW9kZWxdIE1hbmRhdG9yeSBmb3IgYW4gdW5ib3VuZCBhY3Rpb246IEFuIGluc3RhbmNlIG9mIGFuIE9EYXRhIFY0IG1vZGVsXG5cdCAqIEBwYXJhbSBbbVBhcmFtZXRlcnMuaW52b2NhdGlvbkdyb3VwaW5nXSBNb2RlIGhvdyBhY3Rpb25zIGFyZSB0byBiZSBjYWxsZWQ6ICdDaGFuZ2VTZXQnIHRvIHB1dCBhbGwgYWN0aW9uIGNhbGxzIGludG8gb25lIGNoYW5nZXNldCwgJ0lzb2xhdGVkJyB0byBwdXQgdGhlbSBpbnRvIHNlcGFyYXRlIGNoYW5nZXNldHNcblx0ICogQHBhcmFtIFttUGFyYW1ldGVycy5sYWJlbF0gQSBodW1hbi1yZWFkYWJsZSBsYWJlbCBmb3IgdGhlIGFjdGlvblxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMuYmluZGluZ1BhcmFtZXRlcnNcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLnNob3dBY3Rpb25QYXJhbWV0ZXJEaWFsb2dcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLmVudGl0eVNldE5hbWVcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLnZpZXdcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLmNvbnRyb2xJZFxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMuaXNDcmVhdGVBY3Rpb25cblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLm9wZXJhdGlvbkF2YWlsYWJsZU1hcFxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMuaW50ZXJuYWxNb2RlbENvbnRleHRcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLmdyb3VwSWRcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLmRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvblxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMuaWdub3JlRVRhZyBJZiBzcGVjaWZpZWQsIHRoZSBhY3Rpb24gaXMgY2FsbGVkIHdpdGhvdXQgRVRhZyBoYW5kbGluZ1xuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMuZmVGcmFtZXdvcmtDYWxsXG5cdCAqIEBwYXJhbSBhcHBDb21wb25lbnQgVGhlIGFwcENvbXBvbmVudFxuXHQgKiBAcGFyYW0gbWVzc2FnZUhhbmRsZXIgVGhlIG1lc3NhZ2UgaGFuZGxlciBleHRlbnNpb25cblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyB3aXRoIGFuIGFycmF5IG9mIHJlc3BvbnNlIG9iamVjdHMgKFRPRE86IHRvIGJlIGNoYW5nZWQpXG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0YXN5bmMgY2FsbEFjdGlvbihcblx0XHRzQWN0aW9uTmFtZTogc3RyaW5nLFxuXHRcdG1QYXJhbWV0ZXJzOiB7XG5cdFx0XHRiaW5kaW5nUGFyYW1ldGVycz86IEJpbmRDb250ZXh0UGFyYW1ldGVycztcblx0XHRcdHBhcmFtZXRlclZhbHVlcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+W107XG5cdFx0XHRza2lwUGFyYW1ldGVyRGlhbG9nPzogYm9vbGVhbjtcblx0XHRcdHNob3dBY3Rpb25QYXJhbWV0ZXJEaWFsb2c/OiBib29sZWFuO1xuXHRcdFx0bGFiZWw/OiBzdHJpbmc7XG5cdFx0XHRpbnZvY2F0aW9uR3JvdXBpbmc/OiBzdHJpbmc7XG5cdFx0XHRlbnRpdHlTZXROYW1lPzogc3RyaW5nO1xuXHRcdFx0Y29udGV4dHM/OiBPRGF0YVY0Q29udGV4dCB8IE9EYXRhVjRDb250ZXh0W10gfCBudWxsO1xuXHRcdFx0bW9kZWw/OiBPRGF0YU1vZGVsO1xuXHRcdFx0dmlldzogVmlldztcblx0XHRcdGNvbnRyb2xJZD86IHN0cmluZztcblx0XHRcdGlzQ3JlYXRlQWN0aW9uPzogYm9vbGVhbjtcblx0XHRcdG9wZXJhdGlvbkF2YWlsYWJsZU1hcD86IHN0cmluZztcblx0XHRcdGludGVybmFsTW9kZWxDb250ZXh0PzogSW50ZXJuYWxNb2RlbENvbnRleHQgfCBudWxsO1xuXHRcdFx0Z3JvdXBJZD86IHN0cmluZztcblx0XHRcdGRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbj86IHN0cmluZztcblx0XHRcdGlnbm9yZUVUYWc/OiBib29sZWFuO1xuXHRcdFx0ZmVGcmFtZXdvcmtDYWxsPzogYm9vbGVhbjtcblx0XHR9LFxuXHRcdGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LFxuXHRcdG1lc3NhZ2VIYW5kbGVyOiBNZXNzYWdlSGFuZGxlclxuXHQpOiBQcm9taXNlPFByb21pc2VTZXR0bGVkUmVzdWx0PE9wZXJhdGlvblJlc3VsdD5bXT4ge1xuXHRcdG1QYXJhbWV0ZXJzID0gZ2V0UGFyYW1ldGVycyhtUGFyYW1ldGVycyk7XG5cdFx0bGV0IGNvbnRleHRUb1Byb2Nlc3M7XG5cdFx0bGV0IG9Nb2RlbDogT0RhdGFNb2RlbCB8IHVuZGVmaW5lZDtcblx0XHRpZiAoIXNBY3Rpb25OYW1lKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJQcm92aWRlIG5hbWUgb2YgYWN0aW9uIHRvIGJlIGV4ZWN1dGVkXCIpO1xuXHRcdH1cblx0XHQvLyBhY3Rpb24gaW1wb3J0cyBhcmUgbm90IGRpcmVjdGx5IG9idGFpbmVkIGZyb20gdGhlIG1ldGFNb2RlbCBieSBpdCBpcyBwcmVzZW50IGluc2lkZSB0aGUgZW50aXR5Q29udGFpbmVyXG5cdFx0Ly8gYW5kIHRoZSBhY2lvbnMgaXQgcmVmZXJzIHRvIHByZXNlbnQgb3V0c2lkZSB0aGUgZW50aXR5Y29udGFpbmVyLCBoZW5jZSB0byBvYnRhaW4ga2luZCBvZiB0aGUgYWN0aW9uXG5cdFx0Ly8gc3BsaXQoKSBvbiBpdHMgbmFtZSB3YXMgcmVxdWlyZWRcblx0XHRjb25zdCBzTmFtZSA9IHNBY3Rpb25OYW1lLnNwbGl0KFwiL1wiKVsxXTtcblxuXHRcdGNvbnRleHRUb1Byb2Nlc3MgPSBzTmFtZSA/IHVuZGVmaW5lZCA6IG1QYXJhbWV0ZXJzLmNvbnRleHRzO1xuXHRcdC8vY2hlY2tpbmcgd2hldGhlciB0aGUgY29udGV4dCBpcyBhbiBhcnJheSB3aXRoIG1vcmUgdGhhbiAwIGxlbmd0aCBvciBub3QgYW4gYXJyYXkoY3JlYXRlIGFjdGlvbilcblx0XHRpZiAoY29udGV4dFRvUHJvY2VzcyAmJiAoKEFycmF5LmlzQXJyYXkoY29udGV4dFRvUHJvY2VzcykgJiYgY29udGV4dFRvUHJvY2Vzcy5sZW5ndGgpIHx8ICFBcnJheS5pc0FycmF5KGNvbnRleHRUb1Byb2Nlc3MpKSkge1xuXHRcdFx0Y29udGV4dFRvUHJvY2VzcyA9IEFycmF5LmlzQXJyYXkoY29udGV4dFRvUHJvY2VzcykgPyBjb250ZXh0VG9Qcm9jZXNzWzBdIDogY29udGV4dFRvUHJvY2Vzcztcblx0XHRcdG9Nb2RlbCA9IGNvbnRleHRUb1Byb2Nlc3MuZ2V0TW9kZWwoKTtcblx0XHR9XG5cdFx0aWYgKG1QYXJhbWV0ZXJzLm1vZGVsKSB7XG5cdFx0XHRvTW9kZWwgPSBtUGFyYW1ldGVycy5tb2RlbDtcblx0XHR9XG5cdFx0aWYgKCFvTW9kZWwpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIlBhc3MgYSBjb250ZXh0IGZvciBhIGJvdW5kIGFjdGlvbiBvciBwYXNzIHRoZSBtb2RlbCBmb3IgYW4gdW5ib3VuZCBhY3Rpb25cIik7XG5cdFx0fVxuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCBjb250cm9sID0gKG1QYXJhbWV0ZXJzLmNvbnRyb2xJZCA/IG1QYXJhbWV0ZXJzLnZpZXcuYnlJZChtUGFyYW1ldGVycy5jb250cm9sSWQpIDogbVBhcmFtZXRlcnMudmlldykgYXNcblx0XHRcdFx0fCBDb250cm9sXG5cdFx0XHRcdHwgdW5kZWZpbmVkO1xuXHRcdFx0bGV0IG9SZXN1bHQ6IFByb21pc2VTZXR0bGVkUmVzdWx0PE9wZXJhdGlvblJlc3VsdD5bXTtcblx0XHRcdGlmIChjb250ZXh0VG9Qcm9jZXNzICYmIG1QYXJhbWV0ZXJzLmNvbnRleHRzKSB7XG5cdFx0XHRcdGNvbnN0IGNvbnRleHRzID0gQXJyYXkuaXNBcnJheShtUGFyYW1ldGVycy5jb250ZXh0cykgPyBtUGFyYW1ldGVycy5jb250ZXh0cyA6IFttUGFyYW1ldGVycy5jb250ZXh0c107IC8vIEVuc3VyZSB0aGF0IGNvbnRleHRzIGlzIGFuIGFycmF5IChmb3Igc3RhdGljIGFjdGlvbnMgaXQncyBub3QgYW4gd2UgbmVlZCB0byBmaXggaXQpXG5cblx0XHRcdFx0Y29uc3QgbWV0YU1vZGVsID0gb01vZGVsLmdldE1ldGFNb2RlbCgpLFxuXHRcdFx0XHRcdGFjdGlvblBhdGggPSBgJHttZXRhTW9kZWwuZ2V0TWV0YVBhdGgoY29udGV4dHNbMF0uZ2V0UGF0aCgpKX0vJHtzQWN0aW9uTmFtZX1gLFxuXHRcdFx0XHRcdGJvdW5kQWN0aW9uID0gbWV0YU1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KGAke2FjdGlvblBhdGh9L0AkdWk1Lm92ZXJsb2FkLzBgKSE7XG5cblx0XHRcdFx0Y29uc3QgY29udmVydGVkVHlwZXMgPSBjb252ZXJ0VHlwZXMob01vZGVsLmdldE1ldGFNb2RlbCgpKTtcblx0XHRcdFx0Y29uc3QgY29udmVydGVkQWN0aW9uID0gY29udmVydGVkVHlwZXMucmVzb2x2ZVBhdGg8RWRtQWN0aW9uIHwgdW5kZWZpbmVkPihib3VuZEFjdGlvbi5nZXRQYXRoKCkpLnRhcmdldDtcblx0XHRcdFx0aWYgKCFjb252ZXJ0ZWRBY3Rpb24pIHtcblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIGJvdW5kIGFjdGlvblwiKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRvUmVzdWx0ID0gYXdhaXQgbmV3IE9wZXJhdGlvbihhcHBDb21wb25lbnQsIG9Nb2RlbCwgY29udmVydGVkQWN0aW9uLCB7XG5cdFx0XHRcdFx0cGFyYW1ldGVyVmFsdWVzOiBtUGFyYW1ldGVycy5wYXJhbWV0ZXJWYWx1ZXMgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgYm9vbGVhbiB8IG51bWJlciB8IE11bHRpVmFsdWVGaWVsZEl0ZW1bXT5bXSxcblx0XHRcdFx0XHRjb250ZXh0cyxcblx0XHRcdFx0XHRpbnZvY2F0aW9uR3JvdXBpbmc6IG1QYXJhbWV0ZXJzLmludm9jYXRpb25Hcm91cGluZyxcblx0XHRcdFx0XHRsYWJlbDogbVBhcmFtZXRlcnMubGFiZWwsXG5cdFx0XHRcdFx0c2tpcFBhcmFtZXRlckRpYWxvZzogbVBhcmFtZXRlcnMuc2tpcFBhcmFtZXRlckRpYWxvZyxcblx0XHRcdFx0XHRiaW5kaW5nUGFyYW1ldGVyczogbVBhcmFtZXRlcnMuYmluZGluZ1BhcmFtZXRlcnMsXG5cdFx0XHRcdFx0ZW50aXR5U2V0TmFtZTogbVBhcmFtZXRlcnMuZW50aXR5U2V0TmFtZSxcblx0XHRcdFx0XHRvRGF0YVByb3BlcnRpZXM6IHtcblx0XHRcdFx0XHRcdGdob3N0Q29udGV4dEJpbmRpbmdQcm90ZWN0aW9uOiB0cnVlLFxuXHRcdFx0XHRcdFx0ZW5oYW5jZSRzZWxlY3Q6IG1QYXJhbWV0ZXJzLmZlRnJhbWV3b3JrQ2FsbCA9PT0gdHJ1ZSxcblx0XHRcdFx0XHRcdGdyb3VwSWQ6IG1QYXJhbWV0ZXJzLmdyb3VwSWQsXG5cdFx0XHRcdFx0XHRpZ25vcmVFVGFnOiBtUGFyYW1ldGVycy5pZ25vcmVFVGFnXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRvRGF0YUV2ZW50czoge1xuXHRcdFx0XHRcdFx0b25PRGF0YVN1Ym1pdDogKCk6IHZvaWQgPT4ge1xuXHRcdFx0XHRcdFx0XHRtZXNzYWdlSGFuZGxlcj8ucmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cdFx0XHRcdFx0XHRcdHRoaXMuYnVzeUxvY2soYXBwQ29tcG9uZW50KTtcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRvbk9EYXRhUmVzcG9uc2U6ICgpOiB2b2lkID0+IHtcblx0XHRcdFx0XHRcdFx0dGhpcy5idXN5VW5sb2NrKGFwcENvbXBvbmVudCk7XG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0b25SZXF1ZXN0U2lkZUVmZmVjdHM6ICgpOiB2b2lkID0+IHtcblx0XHRcdFx0XHRcdFx0dGhpcy5oYW5kbGVBY3Rpb25FbmFibGVtZW50T25PcGVyYXRpb24oe1xuXHRcdFx0XHRcdFx0XHRcdGludGVybmFsTW9kZWxDb250ZXh0OiBtUGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dCxcblx0XHRcdFx0XHRcdFx0XHRvcGVyYXRpb25BdmFpbGFibGVNYXA6IG1QYXJhbWV0ZXJzLm9wZXJhdGlvbkF2YWlsYWJsZU1hcCxcblx0XHRcdFx0XHRcdFx0XHRjb250cm9sOiBjb250cm9sLFxuXHRcdFx0XHRcdFx0XHRcdGNvbnRleHRzLFxuXHRcdFx0XHRcdFx0XHRcdGNvbnZlcnRlZEFjdGlvblxuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHZpZXc6IG1QYXJhbWV0ZXJzLnZpZXcgYXMgRkVWaWV3LFxuXHRcdFx0XHRcdGlzQ3JlYXRlQWN0aW9uOiBtUGFyYW1ldGVycy5pc0NyZWF0ZUFjdGlvbixcblx0XHRcdFx0XHRtZXNzYWdlSGFuZGxlcjogbWVzc2FnZUhhbmRsZXIsXG5cdFx0XHRcdFx0ZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uOiBtUGFyYW1ldGVycy5kZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb25cblx0XHRcdFx0fSkuZXhlY3V0ZSgpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0b1Jlc3VsdCA9IGF3YWl0IG9wZXJhdGlvbnMuY2FsbEFjdGlvbkltcG9ydChzQWN0aW9uTmFtZSwgb01vZGVsLCBhcHBDb21wb25lbnQsIHtcblx0XHRcdFx0XHRwYXJhbWV0ZXJWYWx1ZXM6IG1QYXJhbWV0ZXJzLnBhcmFtZXRlclZhbHVlcyBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBib29sZWFuIHwgbnVtYmVyIHwgTXVsdGlWYWx1ZUZpZWxkSXRlbVtdPltdLFxuXHRcdFx0XHRcdGxhYmVsOiBtUGFyYW1ldGVycy5sYWJlbCxcblx0XHRcdFx0XHRza2lwUGFyYW1ldGVyRGlhbG9nOiBtUGFyYW1ldGVycy5za2lwUGFyYW1ldGVyRGlhbG9nLFxuXHRcdFx0XHRcdGJpbmRpbmdQYXJhbWV0ZXJzOiBtUGFyYW1ldGVycy5iaW5kaW5nUGFyYW1ldGVycyxcblx0XHRcdFx0XHRlbnRpdHlTZXROYW1lOiBtUGFyYW1ldGVycy5lbnRpdHlTZXROYW1lLFxuXHRcdFx0XHRcdG9EYXRhRXZlbnRzOiB7XG5cdFx0XHRcdFx0XHRvbk9EYXRhU3VibWl0OiAoKSA9PiB7XG5cdFx0XHRcdFx0XHRcdHRoaXMuYnVzeUxvY2soYXBwQ29tcG9uZW50KTtcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRvbk9EYXRhUmVzcG9uc2U6ICgpID0+IHtcblx0XHRcdFx0XHRcdFx0dGhpcy5idXN5VW5sb2NrKGFwcENvbXBvbmVudCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRvRGF0YVByb3BlcnRpZXM6IHtcblx0XHRcdFx0XHRcdGlnbm9yZUVUYWc6IG1QYXJhbWV0ZXJzLmlnbm9yZUVUYWdcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdG1lc3NhZ2VIYW5kbGVyOiBtZXNzYWdlSGFuZGxlcixcblx0XHRcdFx0XHR2aWV3OiBtUGFyYW1ldGVycy52aWV3IGFzIEZFVmlld1xuXHRcdFx0XHR9KTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKG1lc3NhZ2VIYW5kbGVyKSB7XG5cdFx0XHRcdHRoaXMuX2hhbmRsZUFjdGlvblJlc3BvbnNlKG1QYXJhbWV0ZXJzLCBzQWN0aW9uTmFtZSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gb1Jlc3VsdDtcblx0XHR9IGNhdGNoIChlcnI6IHVua25vd24pIHtcblx0XHRcdGlmIChtZXNzYWdlSGFuZGxlcikge1xuXHRcdFx0XHR0aGlzLl9oYW5kbGVBY3Rpb25SZXNwb25zZShtUGFyYW1ldGVycywgc0FjdGlvbk5hbWUpO1xuXHRcdFx0fVxuXHRcdFx0dGhyb3cgZXJyO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBjb2xsZWN0aW9uIG5hbWUgZnJvbSB0aGUgY29udGV4dC5cblx0ICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHRcblx0ICogQHJldHVybnMgVGhlIGNvbGxlY3Rpb24gbmFtZVxuXHQgKi9cblx0Z2V0Q29sbGVjdGlvbk5hbWVGcm9tQ29udGV4dChjb250ZXh0OiBPRGF0YVY0Q29udGV4dCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdFx0Y29uc3QgbWV0YUNvbnRleHQgPSBjb250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCkuZ2V0TWV0YUNvbnRleHQoY29udGV4dC5nZXRQYXRoKCkpO1xuXHRcdHJldHVybiAoTWV0YU1vZGVsQ29udmVydGVyLmdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyhtZXRhQ29udGV4dCkudGFyZ2V0T2JqZWN0IGFzIEVudGl0eVNldCB8IE5hdmlnYXRpb25Qcm9wZXJ0eSB8IHVuZGVmaW5lZClcblx0XHRcdD8ubmFtZTtcblx0fVxuXG5cdGhhbmRsZUFjdGlvbkVuYWJsZW1lbnRPbk9wZXJhdGlvbihwYXJhbWV0ZXJzOiB7XG5cdFx0aW50ZXJuYWxNb2RlbENvbnRleHQ/OiBJbnRlcm5hbE1vZGVsQ29udGV4dCB8IG51bGw7XG5cdFx0b3BlcmF0aW9uQXZhaWxhYmxlTWFwPzogc3RyaW5nO1xuXHRcdGNvbnRyb2w/OiBDb250cm9sO1xuXHRcdGNvbnRleHRzPzogT0RhdGFWNENvbnRleHRbXTtcblx0XHRjb252ZXJ0ZWRBY3Rpb246IEVkbUFjdGlvbjtcblx0fSk6IHZvaWQge1xuXHRcdGlmIChwYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0ICYmIHBhcmFtZXRlcnMub3BlcmF0aW9uQXZhaWxhYmxlTWFwKSB7XG5cdFx0XHRsZXQgc2VsZWN0ZWRDb250ZXh0czogT0RhdGFWNENvbnRleHRbXSA9IFtdO1xuXHRcdFx0Ly9jaGVjayBmb3Igc2tpcHBpbmcgc3RhdGljIGFjdGlvbnNcblx0XHRcdGlmICghYWN0aW9uSGVscGVyLmlzU3RhdGljQWN0aW9uKHBhcmFtZXRlcnMuY29udmVydGVkQWN0aW9uKSkge1xuXHRcdFx0XHRzZWxlY3RlZENvbnRleHRzID0gcGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dC5nZXRQcm9wZXJ0eShcInNlbGVjdGVkQ29udGV4dHNcIikgfHwgW107XG5cdFx0XHRcdEFjdGlvblJ1bnRpbWUuc2V0QWN0aW9uRW5hYmxlbWVudChcblx0XHRcdFx0XHRwYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0LFxuXHRcdFx0XHRcdEpTT04ucGFyc2UocGFyYW1ldGVycy5vcGVyYXRpb25BdmFpbGFibGVNYXApLFxuXHRcdFx0XHRcdHNlbGVjdGVkQ29udGV4dHMsXG5cdFx0XHRcdFx0XCJ0YWJsZVwiXG5cdFx0XHRcdCk7XG5cdFx0XHR9IGVsc2UgaWYgKHBhcmFtZXRlcnMuY29udHJvbCkge1xuXHRcdFx0XHRpZiAocGFyYW1ldGVycy5jb250cm9sLmlzQTxUYWJsZT4oXCJzYXAudWkubWRjLlRhYmxlXCIpKSB7XG5cdFx0XHRcdFx0c2VsZWN0ZWRDb250ZXh0cyA9IHBhcmFtZXRlcnMuY29udHJvbC5nZXRTZWxlY3RlZENvbnRleHRzKCkgYXMgT0RhdGFWNENvbnRleHRbXTtcblx0XHRcdFx0XHRBY3Rpb25SdW50aW1lLnNldEFjdGlvbkVuYWJsZW1lbnQoXG5cdFx0XHRcdFx0XHRwYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0LFxuXHRcdFx0XHRcdFx0SlNPTi5wYXJzZShwYXJhbWV0ZXJzLm9wZXJhdGlvbkF2YWlsYWJsZU1hcCksXG5cdFx0XHRcdFx0XHRzZWxlY3RlZENvbnRleHRzLFxuXHRcdFx0XHRcdFx0XCJ0YWJsZVwiXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0Ly91cGRhdGUgZGVsZXRlIGJ1dHRvblxuXHRcdFx0ZGVsZXRlSGVscGVyLnVwZGF0ZURlbGV0ZUluZm9Gb3JTZWxlY3RlZENvbnRleHRzKHBhcmFtZXRlcnMuaW50ZXJuYWxNb2RlbENvbnRleHQsIHNlbGVjdGVkQ29udGV4dHMpO1xuXHRcdH1cblx0fVxuXG5cdF9oYW5kbGVBY3Rpb25SZXNwb25zZShcblx0XHRtUGFyYW1ldGVyczoge1xuXHRcdFx0bGFiZWw/OiBzdHJpbmc7XG5cdFx0XHRpbnRlcm5hbE1vZGVsQ29udGV4dD86IEludGVybmFsTW9kZWxDb250ZXh0IHwgbnVsbDtcblx0XHR9LFxuXHRcdHNBY3Rpb25OYW1lOiBzdHJpbmdcblx0KTogdm9pZCB7XG5cdFx0Y29uc3QgYVRyYW5zaWVudE1lc3NhZ2VzID0gbWVzc2FnZUhhbmRsaW5nLmdldE1lc3NhZ2VzKHRydWUsIHRydWUpO1xuXHRcdGlmIChhVHJhbnNpZW50TWVzc2FnZXMubGVuZ3RoID4gMCAmJiBtUGFyYW1ldGVycyAmJiBtUGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dCkge1xuXHRcdFx0bVBhcmFtZXRlcnMuaW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJzQWN0aW9uTmFtZVwiLCBtUGFyYW1ldGVycy5sYWJlbCA/IG1QYXJhbWV0ZXJzLmxhYmVsIDogc0FjdGlvbk5hbWUpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBIYW5kbGVzIHZhbGlkYXRpb24gZXJyb3JzIGZvciB0aGUgJ0Rpc2NhcmQnIGFjdGlvbi5cblx0ICogQGZpbmFsXG5cdCAqL1xuXHRoYW5kbGVWYWxpZGF0aW9uRXJyb3IoKTogdm9pZCB7XG5cdFx0Y29uc3QgZXJyb3JUb1JlbW92ZSA9IE1lc3NhZ2luZy5nZXRNZXNzYWdlTW9kZWwoKVxuXHRcdFx0LmdldERhdGEoKVxuXHRcdFx0LmZpbHRlcigoZXJyb3I6IE1lc3NhZ2UpID0+IGVycm9yLnZhbGlkYXRpb24pOyAvLyBvbmx5IG5lZWRzIHRvIGhhbmRsZSB2YWxpZGF0aW9uIG1lc3NhZ2VzLCB0ZWNobmljYWwgYW5kIHBlcnNpc3RlbnQgZXJyb3JzIG5lZWRzIG5vdCB0byBiZSBjaGVja2VkIGhlcmUuXG5cdFx0TWVzc2FnaW5nLnJlbW92ZU1lc3NhZ2VzKGVycm9yVG9SZW1vdmUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBuZXcgUG9wb3Zlci4gRmFjdG9yeSBtZXRob2QgdG8gbWFrZSB1bml0IHRlc3RzIGVhc2llci5cblx0ICogQHBhcmFtIHNldHRpbmdzIEluaXRpYWwgcGFyYW1ldGVycyBmb3IgdGhlIHBvcG92ZXJcblx0ICogQHJldHVybnMgQSBuZXcgUG9wb3ZlclxuXHQgKi9cblx0X2NyZWF0ZVBvcG92ZXIoc2V0dGluZ3M/OiAkUG9wb3ZlclNldHRpbmdzKTogUG9wb3ZlciB7XG5cdFx0cmV0dXJuIG5ldyBQb3BvdmVyKHNldHRpbmdzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTaG93cyBhIHBvcG92ZXIgdG8gY29uZmlybSBkaXNjYXJkIGlmIG5lZWRlZC5cblx0ICogQHBhcmFtIGNhbmNlbEJ1dHRvbiBUaGUgY29udHJvbCB3aGljaCB3aWxsIG9wZW4gdGhlIHBvcG92ZXJcblx0ICogQHBhcmFtIGlzTW9kaWZpZWQgVHJ1ZSBpZiB0aGUgb2JqZWN0IGhhcyBiZWVuIG1vZGlmaWVkIGFuZCBhIGNvbmZpcm1hdGlvbiBwb3BvdmVyIG11c3QgYmUgc2hvd25cblx0ICogQHBhcmFtIHJlc291cmNlTW9kZWwgVGhlIG1vZGVsIHRvIGxvYWQgdGV4dCByZXNvdXJjZXNcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyBpZiB1c2VyIGNvbmZpcm1zIGRpc2NhcmQsIHJlamVjdHMgaWYgb3RoZXJ3aXNlLCByZWplY3RzIGlmIG5vIGNvbnRyb2wgcGFzc2VkIHRvIG9wZW4gcG9wb3ZlclxuXHQgKiBAZmluYWxcblx0ICovXG5cdGFzeW5jIF9jb25maXJtRGlzY2FyZChjYW5jZWxCdXR0b246IEJ1dHRvbiwgaXNNb2RpZmllZDogYm9vbGVhbiwgcmVzb3VyY2VNb2RlbDogUmVzb3VyY2VNb2RlbCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vIElmIHRoZSBkYXRhIGlzbid0IG1vZGlmaWVkLCBkbyBub3Qgc2hvdyBhbnkgY29uZmlybWF0aW9uIHBvcG92ZXJcblx0XHRpZiAoIWlzTW9kaWZpZWQpIHtcblx0XHRcdHRoaXMuaGFuZGxlVmFsaWRhdGlvbkVycm9yKCk7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0fVxuXG5cdFx0Y2FuY2VsQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpO1xuXHRcdHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0XHRjb25zdCBjb25maXJtYXRpb25Qb3BvdmVyID0gdGhpcy5fY3JlYXRlUG9wb3Zlcih7XG5cdFx0XHRcdHNob3dIZWFkZXI6IGZhbHNlLFxuXHRcdFx0XHRwbGFjZW1lbnQ6IFwiVG9wXCJcblx0XHRcdH0pO1xuXHRcdFx0Y29uZmlybWF0aW9uUG9wb3Zlci5hZGRTdHlsZUNsYXNzKFwic2FwVWlDb250ZW50UGFkZGluZ1wiKTtcblxuXHRcdFx0Ly8gQ3JlYXRlIHRoZSBjb250ZW50IG9mIHRoZSBwb3BvdmVyXG5cdFx0XHRjb25zdCB0aXRsZSA9IG5ldyBUZXh0KHtcblx0XHRcdFx0dGV4dDogcmVzb3VyY2VNb2RlbC5nZXRUZXh0KFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfRFJBRlRfRElTQ0FSRF9NRVNTQUdFXCIpXG5cdFx0XHR9KTtcblx0XHRcdGNvbnN0IGNvbmZpcm1CdXR0b24gPSBuZXcgQnV0dG9uKHtcblx0XHRcdFx0dGV4dDogcmVzb3VyY2VNb2RlbC5nZXRUZXh0KFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfRFJBRlRfRElTQ0FSRF9CVVRUT05cIiksXG5cdFx0XHRcdHdpZHRoOiBcIjEwMCVcIixcblx0XHRcdFx0cHJlc3M6ICgpOiB2b2lkID0+IHtcblx0XHRcdFx0XHR0aGlzLmhhbmRsZVZhbGlkYXRpb25FcnJvcigpO1xuXHRcdFx0XHRcdGNvbmZpcm1hdGlvblBvcG92ZXIuZGF0YShcImNvbnRpbnVlRGlzY2FyZFwiLCB0cnVlKTtcblx0XHRcdFx0XHRjb25maXJtYXRpb25Qb3BvdmVyLmNsb3NlKCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdFx0Y29uZmlybWF0aW9uUG9wb3Zlci5hZGRDb250ZW50KG5ldyBWQm94KHsgaXRlbXM6IFt0aXRsZSwgY29uZmlybUJ1dHRvbl0gfSkpO1xuXG5cdFx0XHQvLyBBdHRhY2ggaGFuZGxlclxuXHRcdFx0Y29uZmlybWF0aW9uUG9wb3Zlci5hdHRhY2hCZWZvcmVPcGVuKCgpID0+IHtcblx0XHRcdFx0Y29uZmlybWF0aW9uUG9wb3Zlci5zZXRJbml0aWFsRm9jdXMoY29uZmlybUJ1dHRvbik7XG5cdFx0XHR9KTtcblx0XHRcdGNvbmZpcm1hdGlvblBvcG92ZXIuYXR0YWNoQWZ0ZXJDbG9zZSgoKSA9PiB7XG5cdFx0XHRcdGNhbmNlbEJ1dHRvbi5zZXRFbmFibGVkKHRydWUpO1xuXHRcdFx0XHRpZiAoY29uZmlybWF0aW9uUG9wb3Zlci5kYXRhKFwiY29udGludWVEaXNjYXJkXCIpKSB7XG5cdFx0XHRcdFx0cmVzb2x2ZSgpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHJlamVjdCgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblxuXHRcdFx0Y29uZmlybWF0aW9uUG9wb3Zlci5vcGVuQnkoY2FuY2VsQnV0dG9uLCBmYWxzZSk7XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogUmVsb2FkcyBkYXRhIGZvciBhbiBPRGF0YUxpc3RCaW5kaW5nLlxuXHQgKiBAcGFyYW0gbGlzdEJpbmRpbmcgVGhlIGxpc3RiaW5kaW5nIHRvIHJlZnJlc2hcblx0ICogQHBhcmFtIGFwcENvbXBvbmVudFxuXHQgKiBAcmV0dXJucyBUaGUgY29ycmVzcG9uZGluZyBwcm9taXNlXG5cdCAqL1xuXHRhc3luYyByZWZyZXNoTGlzdEJpbmRpbmcobGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcsIGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0dHJ5IHtcblx0XHRcdGlmIChsaXN0QmluZGluZy5pc1Jvb3QoKSkge1xuXHRcdFx0XHRpZiAodGhpcy5pc0xpc3RCaW5kaW5nSGllcmFyY2hpY2FsKGxpc3RCaW5kaW5nKSkge1xuXHRcdFx0XHRcdC8vIFdlIHVzZSBhIHNpZGUtZWZmZWN0IHJlZnJlc2ggZm9yIGEgVHJlZVRhYmxlLCB0byBwcmVzZXJ2ZSBleHBhbnNpb24gc3RhdGVzXG5cdFx0XHRcdFx0YXdhaXQgYXBwQ29tcG9uZW50XG5cdFx0XHRcdFx0XHQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKClcblx0XHRcdFx0XHRcdC5yZXF1ZXN0U2lkZUVmZmVjdHMoW3sgJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGg6IFwiXCIgfV0sIGxpc3RCaW5kaW5nLmdldEhlYWRlckNvbnRleHQoKSEpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGF3YWl0IGxpc3RCaW5kaW5nLnJlcXVlc3RSZWZyZXNoKCk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGF3YWl0IGFwcENvbXBvbmVudFxuXHRcdFx0XHRcdC5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKVxuXHRcdFx0XHRcdC5yZXF1ZXN0U2lkZUVmZmVjdHMoW3sgJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGg6IGxpc3RCaW5kaW5nLmdldFBhdGgoKSB9XSwgbGlzdEJpbmRpbmcuZ2V0Q29udGV4dCgpKTtcblx0XHRcdH1cblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0TG9nLmVycm9yKGBFcnJvciB3aGlsZSByZWZyZXNoaW5nIGxpc3QgYmluZGluZyAke2xpc3RCaW5kaW5nLmdldFBhdGgoKX1gLCBlcnJvciBhcyBzdHJpbmcpO1xuXHRcdH1cblx0fVxuXG5cdGFzeW5jIGNyZWF0ZVdpdGhEaWFsb2coXG5cdFx0bGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcsXG5cdFx0ZmllbGROYW1lczogc3RyaW5nW10sXG5cdFx0cGFyYW1ldGVyczoge1xuXHRcdFx0cGFyZW50Q29udHJvbD86IENvbnRyb2w7XG5cdFx0XHRkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cdFx0XHRiSXNDcmVhdGVEaWFsb2c/OiBib29sZWFuO1xuXHRcdFx0YmVmb3JlQ3JlYXRlQ2FsbEJhY2s/OiBGdW5jdGlvbjtcblx0XHRcdGFmdGVyQ3JlYXRlQ2FsbEJhY2s/OiAobmV3RG9jdW1lbnRDb250ZXh0OiBPRGF0YVY0Q29udGV4dCkgPT4gUHJvbWlzZTx2b2lkPjtcblx0XHRcdGNyZWF0ZUF0RW5kPzogYm9vbGVhbjtcblx0XHRcdGluYWN0aXZlPzogYm9vbGVhbjtcblx0XHRcdHBhcmVudENvbnRleHQ/OiBPRGF0YVY0Q29udGV4dDtcblx0XHRcdGtlZXBUcmFuc2llbnRDb250ZXh0T25GYWlsZWQ/OiBib29sZWFuO1xuXHRcdFx0Y3JlYXRlQWN0aW9uPzogYm9vbGVhbjtcblx0XHRcdGNyZWF0aW9uTW9kZT86IHN0cmluZztcblx0XHR9LFxuXHRcdGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LFxuXHRcdHJlc291cmNlTW9kZWw6IFJlc291cmNlTW9kZWwsXG5cdFx0bWVzc2FnZUhhbmRsZXI6IE1lc3NhZ2VIYW5kbGVyXG5cdCk6IFByb21pc2U8T0RhdGFWNENvbnRleHQ+IHtcblx0XHRjb25zdCBtb2RlbCA9IGxpc3RCaW5kaW5nLmdldE1vZGVsKCkgYXMgT0RhdGFNb2RlbDtcblx0XHRjb25zdCBtZXRhTW9kZWwgPSBtb2RlbC5nZXRNZXRhTW9kZWwoKTtcblx0XHRjb25zdCBsaXN0TWV0YVBhdGggPSBtZXRhTW9kZWwuZ2V0TWV0YVBhdGgobGlzdEJpbmRpbmcuZ2V0UmVzb2x2ZWRQYXRoKCkhKTtcblxuXHRcdC8vIENyZWF0ZSBhIGZha2UgKHRyYW5zaWVudCkgbGlzdEJpbmRpbmcgYW5kIGNvbnRleHQsIGp1c3QgZm9yIHRoZSBiaW5kaW5nIGNvbnRleHQgb2YgdGhlIGRpYWxvZ1xuXHRcdGNvbnN0IHRyYW5zaWVudExpc3RCaW5kaW5nID0gbW9kZWwuYmluZExpc3QobGlzdEJpbmRpbmcuZ2V0UGF0aCgpLCBsaXN0QmluZGluZy5nZXRDb250ZXh0KCksIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB7XG5cdFx0XHQkJHVwZGF0ZUdyb3VwSWQ6IFwic3VibWl0TGF0ZXJcIlxuXHRcdH0pO1xuXHRcdHRyYW5zaWVudExpc3RCaW5kaW5nLnJlZnJlc2hJbnRlcm5hbCA9IGZ1bmN0aW9uICgpOiB2b2lkIHtcblx0XHRcdC8qICovXG5cdFx0fTtcblx0XHRjb25zdCB0cmFuc2llbnRDb250ZXh0ID0gdHJhbnNpZW50TGlzdEJpbmRpbmcuY3JlYXRlKHBhcmFtZXRlcnMuZGF0YSwgdHJ1ZSk7XG5cdFx0Y29uc3QgZmllbGRNZXRhQ29udGV4dHMgPSBmaWVsZE5hbWVzLm1hcCgobmFtZSkgPT4ge1xuXHRcdFx0cmV0dXJuIG1ldGFNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChgJHtsaXN0TWV0YVBhdGh9LyR7bmFtZX1gKSBhcyBDb250ZXh0O1xuXHRcdH0pO1xuXG5cdFx0Y29uc3QgY3JlYXRlRGlhbG9nID0gZ2V0Q29yZVVJRmFjdG9yeSgpLm5ld0NyZWF0ZURpYWxvZyhcblx0XHRcdHRyYW5zaWVudENvbnRleHQsXG5cdFx0XHRmaWVsZE5hbWVzLFxuXHRcdFx0YXBwQ29tcG9uZW50LFxuXHRcdFx0cGFyYW1ldGVycy5jcmVhdGlvbk1vZGUgPT09IENyZWF0aW9uTW9kZS5DcmVhdGlvbkRpYWxvZyA/IFwiU3RhbmRhbG9uZVwiIDogXCJXaXRoTmF2aWdhdGlvblwiLFxuXHRcdFx0cGFyYW1ldGVycy5wYXJlbnRDb250cm9sXG5cdFx0KTtcblxuXHRcdHRyeSB7XG5cdFx0XHRhd2FpdCBDb21tb25VdGlscy5zZXRVc2VyRGVmYXVsdHMoXG5cdFx0XHRcdGFwcENvbXBvbmVudCxcblx0XHRcdFx0ZmllbGRNZXRhQ29udGV4dHMsXG5cdFx0XHRcdHRyYW5zaWVudENvbnRleHQsXG5cdFx0XHRcdGZhbHNlLFxuXHRcdFx0XHRwYXJhbWV0ZXJzLmNyZWF0ZUFjdGlvbixcblx0XHRcdFx0cGFyYW1ldGVycy5kYXRhXG5cdFx0XHQpO1xuXHRcdFx0Y3JlYXRlRGlhbG9nLm9wZW5EaWFsb2coKTtcblx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRhd2FpdCBtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZXMoKTtcblx0XHRcdHRocm93IGU7XG5cdFx0fVxuXG5cdFx0Y29uc3QgcmVzdWx0UHJvbWlzZUtlZXBlciA9IG5ldyBQcm9taXNlS2VlcGVyPE9EYXRhVjRDb250ZXh0PigpO1xuXG5cdFx0Y29uc3Qgb25FeGl0RGlhbG9nID0gYXN5bmMgKGV2ZW50OiBFeGl0RGlhbG9nRXZlbnQpOiBQcm9taXNlPHZvaWQ+ID0+IHtcblx0XHRcdGlmICghZXZlbnQuZ2V0UGFyYW1ldGVyKFwiYWNjZXB0XCIpKSB7XG5cdFx0XHRcdC8vIFVzZXIgaGFzIGNhbmNlbGxlZCBjcmVhdGlvbjogZGVzdHJveSB0aGUgdHJhbnNpZW50IGxpc3QgYmluZGluZyBhbmQgY2xvc2UgdGhlIGRpYWxvZ1xuXHRcdFx0XHR0cmFuc2llbnRMaXN0QmluZGluZy5kZXN0cm95KCk7XG5cdFx0XHRcdGNyZWF0ZURpYWxvZy5jbG9zZURpYWxvZygpO1xuXHRcdFx0XHRyZXN1bHRQcm9taXNlS2VlcGVyLnJlamVjdChGRUxpYnJhcnkuQ29uc3RhbnRzLkNhbmNlbEFjdGlvbkRpYWxvZyk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0Y3JlYXRlRGlhbG9nLnNldEJ1c3kodHJ1ZSk7XG5cdFx0XHRwYXJhbWV0ZXJzLmJJc0NyZWF0ZURpYWxvZyA9IHRydWU7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRjb25zdCB0cmFuc2llbnREYXRhID0gdHJhbnNpZW50Q29udGV4dC5nZXRPYmplY3QoKTtcblx0XHRcdFx0bGV0IGNyZWF0ZURhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG5cdFx0XHRcdE9iamVjdC5rZXlzKHRyYW5zaWVudERhdGEpLmZvckVhY2goKHByb3BlcnR5UGF0aCkgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IG9Qcm9wZXJ0eSA9IG1ldGFNb2RlbC5nZXRPYmplY3QoYCR7bGlzdE1ldGFQYXRofS8ke3Byb3BlcnR5UGF0aH1gKTtcblx0XHRcdFx0XHQvLyBFbnN1cmUgbmF2aWdhdGlvbiBwcm9wZXJ0aWVzIGFyZSBub3QgcGFydCBvZiB0aGUgcGF5bG9hZCwgYXMgZGVlcCBjcmVhdGUgbm90IHN1cHBvcnRlZFxuXHRcdFx0XHRcdC8vIEFuZCByZW1vdmUgYW55IHByb3BlcnR5IHN0YXJ0aW5nIGJ5IEAkdWk1IGFzIHRoZXkgYXJlIG5vdCBwcm9wZXJ0eSBjcmVhdGVkIGJ5IGZpbGxpbmcgdGhlIGZvcm1cblx0XHRcdFx0XHRpZiAob1Byb3BlcnR5ICYmIG9Qcm9wZXJ0eS4ka2luZCAhPT0gXCJOYXZpZ2F0aW9uUHJvcGVydHlcIiAmJiAhcHJvcGVydHlQYXRoPy5zdGFydHNXaXRoKFwiQCR1aTVcIikpIHtcblx0XHRcdFx0XHRcdGNyZWF0ZURhdGFbcHJvcGVydHlQYXRoXSA9IHRyYW5zaWVudERhdGFbcHJvcGVydHlQYXRoXTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdGlmIChwYXJhbWV0ZXJzLmJlZm9yZUNyZWF0ZUNhbGxCYWNrKSB7XG5cdFx0XHRcdFx0Ly9iZWZvcmVDcmVhdGVDYWxsQmFjayBleHBlY3RzIGNyZWF0ZVBhcmFtZXRlcnMgb2YgdHlwZSBhbnlbXVxuXHRcdFx0XHRcdGNvbnN0IGNyZWF0ZURhdGFBc0FycmF5ID0gT2JqZWN0LmVudHJpZXMoY3JlYXRlRGF0YSkubWFwKChba2V5LCB2YWx1ZV0pID0+ICh7IFtrZXldOiB2YWx1ZSB9KSk7XG5cdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdGF3YWl0IHRvRVM2UHJvbWlzZShcblx0XHRcdFx0XHRcdFx0cGFyYW1ldGVycy5iZWZvcmVDcmVhdGVDYWxsQmFjayh7XG5cdFx0XHRcdFx0XHRcdFx0Y29udGV4dFBhdGg6IGxpc3RCaW5kaW5nLmdldFBhdGgoKSxcblx0XHRcdFx0XHRcdFx0XHRjcmVhdGVQYXJhbWV0ZXJzOiBjcmVhdGVEYXRhQXNBcnJheVxuXHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgY3JlYXRpbmcgdGhlIG5ldyBkb2N1bWVudFwiLCBlcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0XHRcdFx0dGhyb3cgRkVMaWJyYXJ5LkNvbnN0YW50cy5PbkJlZm9yZUNyZWF0ZUZhaWxlZDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Y3JlYXRlRGF0YSA9IGNyZWF0ZURhdGFBc0FycmF5LnJlZHVjZSgocmVzdWx0LCBjdXJyZW50T2JqZWN0KSA9PiB7XG5cdFx0XHRcdFx0XHRyZXR1cm4geyAuLi5yZXN1bHQsIC4uLmN1cnJlbnRPYmplY3QgfTtcblx0XHRcdFx0XHR9LCB7fSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKE9iamVjdC5rZXlzKGNyZWF0ZURhdGEpLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRhcHBDb21wb25lbnQuZ2V0TW9kZWwoXCJ1aVwiKS5zZXRQcm9wZXJ0eShVaU1vZGVsQ29uc3RhbnRzLkRvY3VtZW50TW9kaWZpZWQsIHRydWUpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNvbnN0IG5ld0NvbnRleHQgPSBhd2FpdCB0aGlzLmNyZWF0ZUNvbnRleHQobGlzdEJpbmRpbmcsIGNyZWF0ZURhdGEsIHtcblx0XHRcdFx0XHRjcmVhdGVBdEVuZDogcGFyYW1ldGVycy5jcmVhdGVBdEVuZCxcblx0XHRcdFx0XHRjcmVhdGVJbmFjdGl2ZTogcGFyYW1ldGVycy5pbmFjdGl2ZSxcblx0XHRcdFx0XHRwYXJlbnRDb250ZXh0OiBwYXJhbWV0ZXJzLnBhcmVudENvbnRleHRcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0Y29uc3QgY3JlYXRpb25TdWNjZXNzID0gYXdhaXQgdGhpcy53YWl0Rm9yQ3JlYXRlQ29tcGxldGlvbihuZXdDb250ZXh0LCBwYXJhbWV0ZXJzLmtlZXBUcmFuc2llbnRDb250ZXh0T25GYWlsZWQgPT09IHRydWUpO1xuXHRcdFx0XHRpZiAoY3JlYXRpb25TdWNjZXNzKSB7XG5cdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdGF3YWl0IHBhcmFtZXRlcnMuYWZ0ZXJDcmVhdGVDYWxsQmFjaz8uKG5ld0NvbnRleHQpO1xuXHRcdFx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRcdFx0XHRjcmVhdGVEaWFsb2cuZGlzcGxheUVycm9yTWVzc2FnZXMoTWVzc2FnaW5nLmdldE1lc3NhZ2VNb2RlbCgpLmdldERhdGEoKSk7XG5cdFx0XHRcdFx0XHRhd2FpdCBtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZURpYWxvZyh7IHNob3dCb3VuZFN0YXRlTWVzc2FnZXM6IHRydWUgfSk7XG5cblx0XHRcdFx0XHRcdC8vIERlbGV0ZSB0aGUgY3JlYXRlZCBkb2N1bWVudCBhbmQgcmVmcmVzaCBpdHMgbGlzdCBiaW5kaW5nIChvdGhlcndpc2UgdGhlIGNyZWF0ZWQgZG9jdW1lbnQgaXMgc3RpbGwgdmlzaWJsZSBpbiB0aGUgbGlzdClcblx0XHRcdFx0XHRcdGF3YWl0IHRoaXMuZGVsZXRlRG9jdW1lbnQobmV3Q29udGV4dCwgeyBzaWxlbnRNb2RlOiB0cnVlIH0sIGFwcENvbXBvbmVudCwgcmVzb3VyY2VNb2RlbCwgbWVzc2FnZUhhbmRsZXIpO1xuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5yZWZyZXNoTGlzdEJpbmRpbmcobGlzdEJpbmRpbmcsIGFwcENvbXBvbmVudCk7XG5cblx0XHRcdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGNyZWF0aW5nL3NhdmluZyB0aGUgbmV3IGRvY3VtZW50XCIsIGVycm9yIGFzIHN0cmluZyk7XG5cdFx0XHRcdFx0XHR0aHJvdyBGRUxpYnJhcnkuQ29uc3RhbnRzLkNyZWF0aW9uRmFpbGVkO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHRyYW5zaWVudExpc3RCaW5kaW5nLmRlc3Ryb3koKTtcblx0XHRcdFx0XHRjcmVhdGVEaWFsb2cuY2xvc2VEaWFsb2coKTtcblx0XHRcdFx0XHRyZXN1bHRQcm9taXNlS2VlcGVyLnJlc29sdmUobmV3Q29udGV4dCk7XG5cdFx0XHRcdH1cblx0XHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdC8vIGluIGNhc2Ugb2YgY3JlYXRpb24gZmFpbGVkLCBkaWFsb2cgc2hvdWxkIHN0YXkgb3BlbiAtIHRvIGFjaGlldmUgdGhlIHNhbWUsIG5vdGhpbmcgaGFzIHRvIGJlIGRvbmUgKGxpa2UgaW4gY2FzZSBvZiBzdWNjZXNzIHdpdGggYktlZXBEaWFsb2dPcGVuKVxuXHRcdFx0XHRpZiAoIVtGRUxpYnJhcnkuQ29uc3RhbnRzLk9uQmVmb3JlQ3JlYXRlRmFpbGVkLCBGRUxpYnJhcnkuQ29uc3RhbnRzLkNyZWF0aW9uRmFpbGVkXS5pbmNsdWRlcyhlcnJvcikpIHtcblx0XHRcdFx0XHQvLyBvdGhlciBlcnJvcnMgYXJlIG5vdCBleHBlY3RlZFxuXHRcdFx0XHRcdHRyYW5zaWVudExpc3RCaW5kaW5nLmRlc3Ryb3koKTtcblx0XHRcdFx0XHRjcmVhdGVEaWFsb2cuY2xvc2VEaWFsb2coKTtcblx0XHRcdFx0XHRyZXN1bHRQcm9taXNlS2VlcGVyLnJlamVjdChlcnJvciBhcyBzdHJpbmcgfCBFcnJvcik7XG5cdFx0XHRcdH1cblx0XHRcdH0gZmluYWxseSB7XG5cdFx0XHRcdGNyZWF0ZURpYWxvZy5zZXRCdXN5KGZhbHNlKTtcblx0XHRcdFx0bWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VzKHsgaXNPcGVyYXRpb25EaWFsb2dPcGVuOiBjcmVhdGVEaWFsb2cuaXNPcGVuKCkgfSk7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdGNyZWF0ZURpYWxvZy5hdHRhY2hFeGl0RGlhbG9nKHt9LCBvbkV4aXREaWFsb2cpO1xuXG5cdFx0cmV0dXJuIHJlc3VsdFByb21pc2VLZWVwZXIucHJvbWlzZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBXYWl0cyBmb3IgdGhlIGNyZWF0aW9uIG9mIGEgY29udGV4dCB0byBiZSBmaW5pc2hlZC5cblx0ICogQHBhcmFtIG5ld0NvbnRleHQgVGhlIGNvbnRleHQgYmVpbmcgY3JlYXRlZFxuXHQgKiBAcGFyYW0ga2VlcFRyYW5zaWVudENvbnRleHRPbkZhaWxlZFxuXHQgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBjcmVhdGlvbiB3YXMgc3VjY2Vzc2Z1bFxuXHQgKi9cblx0YXN5bmMgd2FpdEZvckNyZWF0ZUNvbXBsZXRpb24obmV3Q29udGV4dDogT0RhdGFWNENvbnRleHQsIGtlZXBUcmFuc2llbnRDb250ZXh0T25GYWlsZWQ6IGJvb2xlYW4pOiBQcm9taXNlPGJvb2xlYW4+IHtcblx0XHRjb25zdCBwcm9taXNlS2VlcGVyID0gbmV3IFByb21pc2VLZWVwZXI8Ym9vbGVhbj4oKTtcblx0XHRjb25zdCBwYXJlbnRMaXN0QmluZGluZyA9IG5ld0NvbnRleHQuZ2V0QmluZGluZygpIGFzIE9EYXRhTGlzdEJpbmRpbmc7XG5cblx0XHRjb25zdCBvbkNyZWF0ZUNvbXBsZXRlZCA9IChldmVudDogT0RhdGFMaXN0QmluZGluZyRDcmVhdGVDb21wbGV0ZWRFdmVudCk6IHZvaWQgPT4ge1xuXHRcdFx0Y29uc3QgY3JlYXRlZENvbnRleHQgPSBldmVudC5nZXRQYXJhbWV0ZXIoXCJjb250ZXh0XCIpO1xuXHRcdFx0Y29uc3Qgc3VjY2VzcyA9IGV2ZW50LmdldFBhcmFtZXRlcihcInN1Y2Nlc3NcIik7XG5cdFx0XHRpZiAoY3JlYXRlZENvbnRleHQgPT09IG5ld0NvbnRleHQpIHtcblx0XHRcdFx0cGFyZW50TGlzdEJpbmRpbmcuZGV0YWNoQ3JlYXRlQ29tcGxldGVkKG9uQ3JlYXRlQ29tcGxldGVkKTtcblx0XHRcdFx0cHJvbWlzZUtlZXBlci5yZXNvbHZlKHN1Y2Nlc3MgPT09IHRydWUpO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHRwYXJlbnRMaXN0QmluZGluZy5hdHRhY2hDcmVhdGVDb21wbGV0ZWQob25DcmVhdGVDb21wbGV0ZWQpO1xuXG5cdFx0Y29uc3QgY3JlYXRpb25TdWNjZXNzZnVsID0gYXdhaXQgcHJvbWlzZUtlZXBlci5wcm9taXNlO1xuXHRcdGlmICghY3JlYXRpb25TdWNjZXNzZnVsKSB7XG5cdFx0XHRpZiAoIWtlZXBUcmFuc2llbnRDb250ZXh0T25GYWlsZWQpIHtcblx0XHRcdFx0Ly8gQ2FuY2VsIHRoZSBwZW5kaW5nIFBPU1QgYW5kIGRlbGV0ZSB0aGUgY29udGV4dCBpbiB0aGUgbGlzdEJpbmRpbmdcblx0XHRcdFx0KG5ld0NvbnRleHQuY3JlYXRlZCgpID8/IFByb21pc2UucmVzb2x2ZSgpKS5jYXRjaChmdW5jdGlvbiAoY29udGV4dEVycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdFx0TG9nLnRyYWNlKFwidHJhbnNpZW50IGNyZWF0aW9uIGNvbnRleHQgZGVsZXRpb24gZXJyb3JcIiwgY29udGV4dEVycm9yIGFzIHN0cmluZyk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRwYXJlbnRMaXN0QmluZGluZy5yZXNldENoYW5nZXMoKTtcblx0XHRcdFx0cGFyZW50TGlzdEJpbmRpbmcuZ2V0TW9kZWwoKS5yZXNldENoYW5nZXMocGFyZW50TGlzdEJpbmRpbmcuZ2V0VXBkYXRlR3JvdXBJZCgpKTtcblx0XHRcdFx0dGhyb3cgRkVMaWJyYXJ5LkNvbnN0YW50cy5DcmVhdGlvbkZhaWxlZDtcblx0XHRcdH1cblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0YXdhaXQgbmV3Q29udGV4dC5jcmVhdGVkKCk7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmVzIHRoZSBuYW1lIG9mIHRoZSBOZXdBY3Rpb24gdG8gYmUgZXhlY3V0ZWQuXG5cdCAqIEBwYXJhbSBvU3RhcnR1cFBhcmFtZXRlcnMgU3RhcnR1cCBwYXJhbWV0ZXJzIG9mIHRoZSBhcHBsaWNhdGlvblxuXHQgKiBAcGFyYW0gW29TdGFydHVwUGFyYW1ldGVycy5wcmVmZXJyZWRNb2RlXVxuXHQgKiBAcGFyYW0gc0NyZWF0ZUhhc2ggSGFzaCB0byBiZSBjaGVja2VkIGZvciBhY3Rpb24gdHlwZVxuXHQgKiBAcGFyYW0gb01ldGFNb2RlbCBUaGUgTWV0YU1vZGVsIHVzZWQgdG8gY2hlY2sgZm9yIE5ld0FjdGlvbiBwYXJhbWV0ZXJcblx0ICogQHBhcmFtIHNNZXRhUGF0aCBUaGUgTWV0YVBhdGhcblx0ICogQHJldHVybnMgVGhlIG5hbWUgb2YgdGhlIGFjdGlvblxuXHQgKiBAZmluYWxcblx0ICovXG5cdF9nZXROZXdBY3Rpb24oXG5cdFx0b1N0YXJ0dXBQYXJhbWV0ZXJzOiB7XG5cdFx0XHRwcmVmZXJyZWRNb2RlPzogc3RyaW5nW107XG5cdFx0fSxcblx0XHRzQ3JlYXRlSGFzaDogc3RyaW5nLFxuXHRcdG9NZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsLFxuXHRcdHNNZXRhUGF0aDogc3RyaW5nXG5cdCk6IHN0cmluZyB7XG5cdFx0bGV0IHNOZXdBY3Rpb247XG5cblx0XHRpZiAob1N0YXJ0dXBQYXJhbWV0ZXJzICYmIG9TdGFydHVwUGFyYW1ldGVycy5wcmVmZXJyZWRNb2RlICYmIHNDcmVhdGVIYXNoLnRvVXBwZXJDYXNlKCkuaW5jbHVkZXMoXCJJLUFDVElPTj1DUkVBVEVXSVRIXCIpKSB7XG5cdFx0XHRjb25zdCBzUHJlZmVycmVkTW9kZSA9IG9TdGFydHVwUGFyYW1ldGVycy5wcmVmZXJyZWRNb2RlWzBdO1xuXHRcdFx0c05ld0FjdGlvbiA9IHNQcmVmZXJyZWRNb2RlLnRvVXBwZXJDYXNlKCkuaW5jbHVkZXMoXCJDUkVBVEVXSVRIOlwiKVxuXHRcdFx0XHQ/IHNQcmVmZXJyZWRNb2RlLnN1YnN0cmluZyhzUHJlZmVycmVkTW9kZS5sYXN0SW5kZXhPZihcIjpcIikgKyAxKVxuXHRcdFx0XHQ6IHVuZGVmaW5lZDtcblx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0b1N0YXJ0dXBQYXJhbWV0ZXJzICYmXG5cdFx0XHRvU3RhcnR1cFBhcmFtZXRlcnMucHJlZmVycmVkTW9kZSAmJlxuXHRcdFx0c0NyZWF0ZUhhc2gudG9VcHBlckNhc2UoKS5pbmNsdWRlcyhcIkktQUNUSU9OPUFVVE9DUkVBVEVXSVRIXCIpXG5cdFx0KSB7XG5cdFx0XHRjb25zdCBzUHJlZmVycmVkTW9kZSA9IG9TdGFydHVwUGFyYW1ldGVycy5wcmVmZXJyZWRNb2RlWzBdO1xuXHRcdFx0c05ld0FjdGlvbiA9IHNQcmVmZXJyZWRNb2RlLnRvVXBwZXJDYXNlKCkuaW5jbHVkZXMoXCJBVVRPQ1JFQVRFV0lUSDpcIilcblx0XHRcdFx0PyBzUHJlZmVycmVkTW9kZS5zdWJzdHJpbmcoc1ByZWZlcnJlZE1vZGUubGFzdEluZGV4T2YoXCI6XCIpICsgMSlcblx0XHRcdFx0OiB1bmRlZmluZWQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHNOZXdBY3Rpb24gPVxuXHRcdFx0XHRvTWV0YU1vZGVsICYmIG9NZXRhTW9kZWwuZ2V0T2JqZWN0ICE9PSB1bmRlZmluZWRcblx0XHRcdFx0XHQ/IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NNZXRhUGF0aH1AY29tLnNhcC52b2NhYnVsYXJpZXMuU2Vzc2lvbi52MS5TdGlja3lTZXNzaW9uU3VwcG9ydGVkL05ld0FjdGlvbmApIHx8XG5cdFx0XHRcdFx0ICBvTWV0YU1vZGVsLmdldE9iamVjdChgJHtzTWV0YVBhdGh9QGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EcmFmdFJvb3QvTmV3QWN0aW9uYClcblx0XHRcdFx0XHQ6IHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0cmV0dXJuIHNOZXdBY3Rpb247XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmVzIHRoZSBsYWJlbCBmb3IgdGhlIHRpdGxlIG9mIGEgc3BlY2lmaWMgY3JlYXRlIGFjdGlvbiBkaWFsb2csIGUuZy4gQ3JlYXRlIFNhbGVzIE9yZGVyIGZyb20gUXVvdGF0aW9uLlxuXHQgKlxuXHQgKiBUaGUgZm9sbG93aW5nIHByaW9yaXR5IGlzIGFwcGxpZWQ6XG5cdCAqIDEuIGxhYmVsIG9mIGxpbmUtaXRlbSBhbm5vdGF0aW9uLlxuXHQgKiAyLiBsYWJlbCBhbm5vdGF0ZWQgaW4gdGhlIGFjdGlvbi5cblx0ICogMy4gXCJDcmVhdGVcIiBhcyBhIGNvbnN0YW50IGZyb20gaTE4bi5cblx0ICogQHBhcmFtIG9NZXRhTW9kZWwgVGhlIE1ldGFNb2RlbCB1c2VkIHRvIGNoZWNrIGZvciB0aGUgTmV3QWN0aW9uIHBhcmFtZXRlclxuXHQgKiBAcGFyYW0gc01ldGFQYXRoIFRoZSBNZXRhUGF0aFxuXHQgKiBAcGFyYW0gc05ld0FjdGlvbiBDb250YWlucyB0aGUgbmFtZSBvZiB0aGUgYWN0aW9uIHRvIGJlIGV4ZWN1dGVkXG5cdCAqIEBwYXJhbSByZXNvdXJjZU1vZGVsIFJlc291cmNlQnVuZGxlIHRvIGFjY2VzcyB0aGUgZGVmYXVsdCBDcmVhdGUgbGFiZWxcblx0ICogQHJldHVybnMgVGhlIGxhYmVsIGZvciB0aGUgQ3JlYXRlIEFjdGlvbiBEaWFsb2dcblx0ICogQGZpbmFsXG5cdCAqL1xuXHRfZ2V0U3BlY2lmaWNDcmVhdGVBY3Rpb25EaWFsb2dMYWJlbChcblx0XHRvTWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbCB8IHVuZGVmaW5lZCxcblx0XHRzTWV0YVBhdGg6IHN0cmluZyxcblx0XHRzTmV3QWN0aW9uOiBzdHJpbmcsXG5cdFx0cmVzb3VyY2VNb2RlbDogUmVzb3VyY2VNb2RlbCB8IHVuZGVmaW5lZFxuXHQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRcdGNvbnN0IGxpbmVJdGVtcyA9IG9NZXRhTW9kZWw/LmdldE9iamVjdChgJHtzTWV0YVBhdGh9L0Bjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5MaW5lSXRlbWApIGFzIExpbmVJdGVtIHwgdW5kZWZpbmVkO1xuXG5cdFx0Y29uc3QgbGFiZWwgPSBsaW5lSXRlbXM/LmZpbmQoKGxpbmVJdGVtKSA9PiBpc0RhdGFGaWVsZEZvckFjdGlvbihsaW5lSXRlbSkgJiYgbGluZUl0ZW0uQWN0aW9uLnNwbGl0KFwiKFwiLCAxKVswXSA9PT0gc05ld0FjdGlvbilcblx0XHRcdD8uTGFiZWw7XG5cblx0XHRyZXR1cm4gKFxuXHRcdFx0bGFiZWwgfHxcblx0XHRcdG9NZXRhTW9kZWw/LmdldE9iamVjdChgJHtzTWV0YVBhdGh9LyR7c05ld0FjdGlvbn1AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkxhYmVsYCkgfHxcblx0XHRcdHJlc291cmNlTW9kZWw/LmdldFRleHQoXCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9TQVBGRV9BQ1RJT05fQ1JFQVRFXCIpXG5cdFx0KTtcblx0fVxufVxuXG5jb25zdCBzaW5nbGV0b24gPSBuZXcgVHJhbnNhY3Rpb25IZWxwZXIoKTtcbmV4cG9ydCBkZWZhdWx0IHNpbmdsZXRvbjtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0VBMkRBLE1BQU1BLFlBQVksR0FBR0MsU0FBUyxD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
1278
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDcmVhdGlvbk1vZGUiLCJGRUxpYnJhcnkiLCJQcm9ncmFtbWluZ01vZGVsIiwiRGVsZXRlT3B0aW9uVHlwZXMiLCJkZWxldGVIZWxwZXIiLCJEZWxldGVEaWFsb2dDb250ZW50Q29udHJvbCIsImdldFBhcmFtZXRlcnMiLCJtUGFyYW1ldGVycyIsImdldE1ldGFkYXRhIiwiZ2V0TmFtZSIsIlRyYW5zYWN0aW9uSGVscGVyIiwiX3Byb3RvIiwicHJvdG90eXBlIiwiYnVzeUxvY2siLCJhcHBDb21wb25lbnQiLCJidXN5UGF0aCIsIkJ1c3lMb2NrZXIiLCJsb2NrIiwiZ2V0TW9kZWwiLCJidXN5VW5sb2NrIiwidW5sb2NrIiwiZ2V0UHJvZ3JhbW1pbmdNb2RlbCIsInNvdXJjZSIsInBhdGgiLCJpc0EiLCJnZXRQYXRoIiwiaXNSZWxhdGl2ZSIsImdldFJlc29sdmVkUGF0aCIsIm1ldGFNb2RlbCIsImdldE1ldGFNb2RlbCIsIk1vZGVsSGVscGVyIiwiaXNEcmFmdFN1cHBvcnRlZCIsIkRyYWZ0IiwiaXNTdGlja3lTZXNzaW9uU3VwcG9ydGVkIiwiU3RpY2t5IiwiTm9uRHJhZnQiLCJ2YWxpZGF0ZURvY3VtZW50Iiwib0NvbnRleHQiLCJvVmlldyIsInNDdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24iLCJjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24iLCJzTW9kdWxlIiwic3Vic3RyaW5nIiwibGFzdEluZGV4T2YiLCJyZXBsYWNlIiwic0Z1bmN0aW9uTmFtZSIsImxlbmd0aCIsIm1EYXRhIiwiZGF0YSIsIkZQTUhlbHBlciIsInZhbGlkYXRpb25XcmFwcGVyIiwiUHJvbWlzZSIsInJlc29sdmUiLCJnZXREYXRhRnJvbURlZmF1bHRWYWx1ZUZ1bmN0aW9uIiwibGlzdEJpbmRpbmciLCJtb2RlbCIsIm1ldGFDb250ZXh0IiwiZ2V0TWV0YUNvbnRleHQiLCJsaXN0QmluZGluZ09iamVjdFBhdGgiLCJNZXRhTW9kZWxDb252ZXJ0ZXIiLCJnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMiLCJkZWZhdWx0RnVuY09uVGFyZ2V0T2JqZWN0IiwidGFyZ2V0T2JqZWN0IiwiYW5ub3RhdGlvbnMiLCJDb21tb24iLCJEZWZhdWx0VmFsdWVzRnVuY3Rpb24iLCJkZWZhdWx0RnVuY09uVGFyZ2V0RW50aXR5U2V0IiwidGFyZ2V0RW50aXR5U2V0IiwiZGVmYXVsdEZ1bmN0aW9uTmFtZSIsInVuZGVmaW5lZCIsImZ1bmN0aW9uT25OYXZQcm9wIiwiaXNOYXZpZ2F0aW9uUHJvcGVydHkiLCJkZWZhdWx0RnVuY3Rpb25Db250ZXh0IiwiZ2V0Q29udGV4dCIsImdldEhlYWRlckNvbnRleHQiLCJkZWZhdWx0RnVuY3Rpb25QYXRoIiwiZ2V0TWV0YVBhdGgiLCJkZWZhdWx0RnVuY3Rpb25PYmplY3RQYXRoIiwiZGVmYXVsdEZ1bmN0aW9uUmVzdWx0IiwiaXNCb3VuZCIsIm9wZXJhdGlvbnMiLCJjYWxsQm91bmRGdW5jdGlvbiIsInRvU3RyaW5nIiwiY2FsbEZ1bmN0aW9uSW1wb3J0IiwiZ2V0T2JqZWN0IiwiaXNMaXN0QmluZGluZ0hpZXJhcmNoaWNhbCIsImdldEFnZ3JlZ2F0aW9uIiwiaGllcmFyY2h5UXVhbGlmaWVyIiwiaXNMaXN0QmluZGluZ0FuYWx5dGljYWwiLCJhZ2dyZWdhdGlvbiIsImNyZWF0ZUNvbnRleHQiLCJpbml0aWFsRGF0YSIsIm9wdGlvbnMiLCJkYXRhRm9yQ3JlYXRpb24iLCJsaXN0QmluZGluZ0ZvckNyZWF0aW9uIiwicGFyZW50Q29udGV4dCIsImlzRXhwYW5kZWQiLCJleHBhbmQiLCJPYmplY3QiLCJhc3NpZ24iLCJiaW5kTGlzdCIsIiQkZ3JvdXBJZCIsImdldEdyb3VwSWQiLCIkJHVwZGF0ZUdyb3VwSWQiLCJnZXRVcGRhdGVHcm91cElkIiwib2JqZWN0UGF0aCIsInBhcmVudE5hdmlnYXRpb24iLCJ0YXJnZXRFbnRpdHlUeXBlIiwiQWdncmVnYXRpb24iLCJQYXJlbnROYXZpZ2F0aW9uUHJvcGVydHkiLCJ2YWx1ZSIsIkVycm9yIiwicGFyZW50QmluZGluZ0RhdGEiLCJjcmVhdGUiLCJjcmVhdGVBdEVuZCIsImNyZWF0ZUluYWN0aXZlIiwiZ2V0Q3JlYXRpb25QYXJhbWV0ZXJzIiwiY3JlYXRlRGF0YSIsIm1ldGFQYXRoIiwibm9uQ29tcHV0ZWRWaXNpYmxlRmllbGRzIiwiZ2V0Q3JlYXRlUG9wdXBGaWVsZHMiLCJmaWx0ZXIiLCJmaWVsZE5hbWUiLCJjcmVhdGVEb2N1bWVudCIsIm1haW5MaXN0QmluZGluZyIsImluUGFyYW1ldGVycyIsInJlc291cmNlTW9kZWwiLCJtZXNzYWdlSGFuZGxlciIsImZyb21Db3B5UGFzdGUiLCJuZXdEb2N1bWVudENvbnRleHQiLCJwYXJhbWV0ZXJzIiwicHJvZ3JhbW1pbmdNb2RlbCIsImdldEJ1c3lQYXRoIiwiYmVmb3JlQ3JlYXRlQ2FsbEJhY2siLCJpbmFjdGl2ZSIsIm1lc3NhZ2VIYW5kbGluZ0tleSIsInJlZ2lzdGVyVG9Ib2xkTWVzc2FnZXMiLCJwZXJmb3JtQ3JlYXRpb24iLCJzaG93TWVzc2FnZURpYWxvZyIsImNvbnRyb2wiLCJwYXJlbnRDb250cm9sIiwidW5Ib2xkS2V5IiwiZXJyb3IiLCJDb25zdGFudHMiLCJBY3Rpb25FeGVjdXRpb25GYWlsZWQiLCJDYW5jZWxBY3Rpb25EaWFsb2ciLCJpc1RyYW5zaWVudCIsImRlbGV0ZSIsImJ1c3lNb2RlIiwiYnVzeUlkIiwiY3JlYXRlRG9jdW1lbnRDb250ZXh0IiwiY3JlYXRlUGFyYW1ldGVycyIsImVudHJpZXMiLCJtYXAiLCJfcmVmIiwia2V5IiwidG9FUzZQcm9taXNlIiwiY29udGV4dFBhdGgiLCJMb2ciLCJPbkJlZm9yZUNyZWF0ZUZhaWxlZCIsInJlZHVjZSIsInJlc3VsdCIsImN1cnJlbnRPYmplY3QiLCJjcmVhdGVQcm9taXNlIiwiQ29tbW9uVXRpbHMiLCJJTkxJTkVFRElUX1VQREFURUdST1VQSUQiLCJzdWJtaXRCYXRjaCIsImNyZWF0ZUhhc2giLCJnZXRSb3V0ZXJQcm94eSIsImdldEhhc2giLCJjb21wb25lbnREYXRhIiwiZ2V0Q29tcG9uZW50RGF0YSIsInN0YXJ0dXBQYXJhbWV0ZXJzIiwibmV3QWN0aW9uIiwiX2dldE5ld0FjdGlvbiIsInBlcmZvcm1DcmVhdGlvbldpdGhBY3Rpb24iLCJzdGF0dXMiLCJyZWFzb24iLCJyZXR1cm5lZENvbnRleHQiLCJwZXJmb3JtQ3JlYXRpb25XaXRoUE9TVCIsImFjdGlvbk5hbWUiLCJoZWFkZXJDb250ZXh0UGF0aCIsIm1lc3NhZ2VzUGF0aCIsImdldE1lc3NhZ2VzUGF0aCIsImJpbmRpbmdQYXJhbWV0ZXJzIiwiJCRwYXRjaFdpdGhvdXRTaWRlRWZmZWN0cyIsInNlbGVjdGVkUHJvcGVydGllcyIsInB1c2giLCJqb2luIiwiY2FsbEFjdGlvbiIsImNvbnRleHRzIiwic2hvd0FjdGlvblBhcmFtZXRlckRpYWxvZyIsImxhYmVsIiwiX2dldFNwZWNpZmljQ3JlYXRlQWN0aW9uRGlhbG9nTGFiZWwiLCJ2aWV3IiwiaXNDcmVhdGVBY3Rpb24iLCJza2lwUGFyYW1ldGVyRGlhbG9nIiwiZGVmYXVsdFZhbHVlRnVuY3Rpb25EYXRhIiwiY2FuSGF2ZURpYWxvZyIsImNyZWF0aW9uTW9kZSIsIkNyZWF0aW9uUm93IiwiSW5saW5lIiwiY3JlYXRpb25EaWFsb2dGaWVsZHMiLCJDcmVhdGlvbkRpYWxvZyIsImZvckVhY2giLCJpbmNsdWRlcyIsImNyZWF0ZVdpdGhEaWFsb2ciLCJ3YWl0Rm9yQ3JlYXRlQ29tcGxldGlvbiIsImtlZXBUcmFuc2llbnRDb250ZXh0T25GYWlsZWQiLCJtc2ciLCJtZXNzYWdlIiwiX2lzRHJhZnRFbmFibGVkIiwidkNvbnRleHRzIiwiY29udGV4dEZvckRyYWZ0TW9kZWwiLCJzUHJvZ3JhbW1pbmdNb2RlbCIsImRlbGV0ZURvY3VtZW50IiwiY29udGV4dHNUb0RlbGV0ZSIsIkFycmF5IiwiaXNBcnJheSIsImZpcnN0Q29udGV4dCIsInNlbGVjdGVkQ29udGV4dHMiLCJyZWplY3QiLCJkcmFmdEVuYWJsZWQiLCJpdGVtcyIsInVuU2F2ZWRDb250ZXh0IiwiZW50aXR5U2V0TmFtZSIsImdldENvbGxlY3Rpb25OYW1lRnJvbUNvbnRleHQiLCJudW1iZXJPZlNlbGVjdGVkQ29udGV4dHMiLCJsb2NrZWRDb250ZXh0IiwiZmluZCIsImNvbnRleHQiLCJjb250ZXh0RGF0YSIsIklzQWN0aXZlRW50aXR5IiwiSGFzRHJhZnRFbnRpdHkiLCJEcmFmdEFkbWluaXN0cmF0aXZlRGF0YSIsIkluUHJvY2Vzc0J5VXNlciIsIkRyYWZ0SXNDcmVhdGVkQnlNZSIsImxvY2tpbmdVc2VyTmFtZSIsIk1lc3NhZ2VCb3giLCJzaG93IiwiZ2V0VGV4dCIsInRpdGxlIiwib25DbG9zZSIsIm5vblRhYmxlVHh0IiwidW5TYXZlZENvbnRleHRVc2VyIiwiZGVzY3JpcHRpb24iLCJ0eXBlIiwiZGVsZXRhYmxlQ29udGV4dHMiLCJ0ZXh0Iiwic2VsZWN0ZWQiLCJURVhUIiwidG90YWxEZWxldGFibGUiLCJkcmFmdHNXaXRoTm9uRGVsZXRhYmxlQWN0aXZlIiwiZHJhZnRzV2l0aERlbGV0YWJsZUFjdGl2ZSIsInVuU2F2ZWRDb250ZXh0cyIsInVwZGF0ZURyYWZ0T3B0aW9uc0ZvckRlbGV0YWJsZVRleHRzIiwibm9uRGVsZXRhYmxlVGV4dCIsImdldE5vbkRlbGV0YWJsZVRleHQiLCJvcHRpb25zRGVsZXRhYmxlVGV4dHMiLCJnZXRPcHRpb25zRm9yRGVsZXRhYmxlVGV4dHMiLCJjb21tb25CaW5kaW5nIiwiZ2V0QmluZGluZyIsImJpbmRpbmdUeXBlIiwidXBkYXRlQ29udGVudEZvckRlbGV0ZURpYWxvZyIsImZuQ29uZmlybSIsIm1lc3NhZ2VIYW5kbGluZyIsInJlbW92ZUJvdW5kVHJhbnNpdGlvbk1lc3NhZ2VzIiwiZGVsZXRlQ29uZmlybUhhbmRsZXIiLCJvRXJyb3IiLCJkaWFsb2ciLCJjcmVhdGVEZWxldGVEaWFsb2ciLCJub0RpYWxvZyIsInNpbGVudE1vZGUiLCJhZGRTdHlsZUNsYXNzIiwib3BlbiIsImZuUmVqZWN0IiwiZGlhbG9nQ29uZmlybWVkIiwidkJveCIsIlZCb3giLCJyZXNvdXJjZUJ1bmRsZUNvcmUiLCJMaWJyYXJ5IiwiZ2V0UmVzb3VyY2VCdW5kbGVGb3IiLCJEaWFsb2ciLCJzdGF0ZSIsImNvbnRlbnQiLCJhcmlhTGFiZWxsZWRCeSIsImJlZ2luQnV0dG9uIiwiQnV0dG9uIiwicHJlc3MiLCJjbG9zZSIsImVuZEJ1dHRvbiIsImFmdGVyQ2xvc2UiLCJkZXN0cm95IiwiZWRpdERvY3VtZW50IiwiZ3JvdXBJZCIsInRyYW5zYWN0aW9uRGV0YWlscyIsInJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcyIsIm9OZXdDb250ZXh0IiwiZHJhZnQiLCJjcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudCIsImJQcmVzZXJ2ZUNoYW5nZXMiLCJzdGlja3kiLCJlZGl0RG9jdW1lbnRJblN0aWNreVNlc3Npb24iLCJlcnIiLCJzaG93TWVzc2FnZXMiLCJjb25jdXJyZW50RWRpdEZsYWciLCJjYW5jZWxEb2N1bWVudCIsIm1JblBhcmFtZXRlcnMiLCJpc05ld09iamVjdCIsImlzT2JqZWN0TW9kaWZpZWQiLCJvTW9kZWwiLCJyZXR1cm5lZFZhbHVlIiwic2libGluZ0NvbnRleHRDYW5vbmljYWxQYXRoIiwiZHJhZnRBZG1pbkRhdGEiLCJzaWJsaW5nQ29udGV4dCIsImJpbmRDb250ZXh0IiwiZ2V0Qm91bmRDb250ZXh0IiwiZHJhZnREYXRhQ29udGV4dCIsImFsbCIsInJlcXVlc3RDYW5vbmljYWxQYXRoIiwicmVxdWVzdE9iamVjdCIsIkNyZWF0aW9uRGF0ZVRpbWUiLCJMYXN0Q2hhbmdlRGF0ZVRpbWUiLCJza2lwRGlzY2FyZFBvcG92ZXIiLCJfY29uZmlybURpc2NhcmQiLCJjYW5jZWxCdXR0b24iLCJpc0tlZXBBbGl2ZSIsInNldEtlZXBBbGl2ZSIsImJlZm9yZUNhbmNlbENhbGxCYWNrIiwiaGFzUGVuZGluZ0NoYW5nZXMiLCJyZXNldENoYW5nZXMiLCJkZWxldGVEcmFmdCIsImRpc2NhcmRlZENvbnRleHQiLCJkaXNjYXJkRG9jdW1lbnQiLCJyZWZyZXNoIiwic2F2ZURvY3VtZW50IiwiZXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvciIsImJpbmRpbmdzRm9yU2lkZUVmZmVjdHMiLCJza2lwQ29uZmlybWF0aW9uTXNnIiwiYXJndW1lbnRzIiwib0FjdGl2ZURvY3VtZW50IiwiYWN0aXZhdGVEb2N1bWVudCIsIm1lc3NhZ2VzUmVjZWl2ZWQiLCJnZXRNZXNzYWdlcyIsImNvbmNhdCIsImdldFR5cGUiLCJNZXNzYWdlVHlwZSIsIlN1Y2Nlc3MiLCJNZXNzYWdlVG9hc3QiLCJoYXNUcmFuc2llbnRDb250ZXh0IiwiZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlIiwicmVxdWVzdFNpZGVFZmZlY3RzRm9yTmF2aWdhdGlvblByb3BlcnR5Iiwic0FjdGlvbk5hbWUiLCJjb250ZXh0VG9Qcm9jZXNzIiwic05hbWUiLCJzcGxpdCIsImNvbnRyb2xJZCIsImJ5SWQiLCJvUmVzdWx0IiwiYWN0aW9uUGF0aCIsImJvdW5kQWN0aW9uIiwiY3JlYXRlQmluZGluZ0NvbnRleHQiLCJjb252ZXJ0ZWRUeXBlcyIsImNvbnZlcnRUeXBlcyIsImNvbnZlcnRlZEFjdGlvbiIsInJlc29sdmVQYXRoIiwidGFyZ2V0IiwiT3BlcmF0aW9uIiwicGFyYW1ldGVyVmFsdWVzIiwiaW52b2NhdGlvbkdyb3VwaW5nIiwib0RhdGFQcm9wZXJ0aWVzIiwiZ2hvc3RDb250ZXh0QmluZGluZ1Byb3RlY3Rpb24iLCJlbmhhbmNlJHNlbGVjdCIsImlnbm9yZUVUYWciLCJvRGF0YUV2ZW50cyIsIm9uT0RhdGFTdWJtaXQiLCJvbk9EYXRhUmVzcG9uc2UiLCJvblJlcXVlc3RTaWRlRWZmZWN0cyIsImhhbmRsZUFjdGlvbkVuYWJsZW1lbnRPbk9wZXJhdGlvbiIsImludGVybmFsTW9kZWxDb250ZXh0Iiwib3BlcmF0aW9uQXZhaWxhYmxlTWFwIiwiZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uIiwiZXhlY3V0ZSIsImNhbGxBY3Rpb25JbXBvcnQiLCJfaGFuZGxlQWN0aW9uUmVzcG9uc2UiLCJuYW1lIiwiYWN0aW9uSGVscGVyIiwiaXNTdGF0aWNBY3Rpb24iLCJnZXRQcm9wZXJ0eSIsIkFjdGlvblJ1bnRpbWUiLCJzZXRBY3Rpb25FbmFibGVtZW50IiwiSlNPTiIsInBhcnNlIiwiZ2V0U2VsZWN0ZWRDb250ZXh0cyIsInVwZGF0ZURlbGV0ZUluZm9Gb3JTZWxlY3RlZENvbnRleHRzIiwiYVRyYW5zaWVudE1lc3NhZ2VzIiwic2V0UHJvcGVydHkiLCJoYW5kbGVWYWxpZGF0aW9uRXJyb3IiLCJlcnJvclRvUmVtb3ZlIiwiTWVzc2FnaW5nIiwiZ2V0TWVzc2FnZU1vZGVsIiwiZ2V0RGF0YSIsInZhbGlkYXRpb24iLCJyZW1vdmVNZXNzYWdlcyIsIl9jcmVhdGVQb3BvdmVyIiwic2V0dGluZ3MiLCJQb3BvdmVyIiwiaXNNb2RpZmllZCIsInNldEVuYWJsZWQiLCJjb25maXJtYXRpb25Qb3BvdmVyIiwic2hvd0hlYWRlciIsInBsYWNlbWVudCIsIlRleHQiLCJjb25maXJtQnV0dG9uIiwid2lkdGgiLCJhZGRDb250ZW50IiwiYXR0YWNoQmVmb3JlT3BlbiIsInNldEluaXRpYWxGb2N1cyIsImF0dGFjaEFmdGVyQ2xvc2UiLCJvcGVuQnkiLCJyZWZyZXNoTGlzdEJpbmRpbmciLCJpc1Jvb3QiLCJyZXF1ZXN0U2lkZUVmZmVjdHMiLCIkTmF2aWdhdGlvblByb3BlcnR5UGF0aCIsInJlcXVlc3RSZWZyZXNoIiwiZmllbGROYW1lcyIsImxpc3RNZXRhUGF0aCIsInRyYW5zaWVudExpc3RCaW5kaW5nIiwicmVmcmVzaEludGVybmFsIiwidHJhbnNpZW50Q29udGV4dCIsImZpZWxkTWV0YUNvbnRleHRzIiwiY3JlYXRlRGlhbG9nIiwiZ2V0Q29yZVVJRmFjdG9yeSIsIm5ld0NyZWF0ZURpYWxvZyIsInNldFVzZXJEZWZhdWx0cyIsImNyZWF0ZUFjdGlvbiIsIm9wZW5EaWFsb2ciLCJlIiwicmVzdWx0UHJvbWlzZUtlZXBlciIsIlByb21pc2VLZWVwZXIiLCJvbkV4aXREaWFsb2ciLCJldmVudCIsImdldFBhcmFtZXRlciIsImNsb3NlRGlhbG9nIiwic2V0QnVzeSIsImJJc0NyZWF0ZURpYWxvZyIsInRyYW5zaWVudERhdGEiLCJrZXlzIiwicHJvcGVydHlQYXRoIiwib1Byb3BlcnR5IiwiJGtpbmQiLCJzdGFydHNXaXRoIiwiY3JlYXRlRGF0YUFzQXJyYXkiLCJfcmVmMiIsIlVpTW9kZWxDb25zdGFudHMiLCJEb2N1bWVudE1vZGlmaWVkIiwibmV3Q29udGV4dCIsImNyZWF0aW9uU3VjY2VzcyIsImFmdGVyQ3JlYXRlQ2FsbEJhY2siLCJkaXNwbGF5RXJyb3JNZXNzYWdlcyIsInNob3dCb3VuZFN0YXRlTWVzc2FnZXMiLCJDcmVhdGlvbkZhaWxlZCIsImlzT3BlcmF0aW9uRGlhbG9nT3BlbiIsImlzT3BlbiIsImF0dGFjaEV4aXREaWFsb2ciLCJwcm9taXNlIiwicHJvbWlzZUtlZXBlciIsInBhcmVudExpc3RCaW5kaW5nIiwib25DcmVhdGVDb21wbGV0ZWQiLCJjcmVhdGVkQ29udGV4dCIsInN1Y2Nlc3MiLCJkZXRhY2hDcmVhdGVDb21wbGV0ZWQiLCJhdHRhY2hDcmVhdGVDb21wbGV0ZWQiLCJjcmVhdGlvblN1Y2Nlc3NmdWwiLCJjcmVhdGVkIiwiY2F0Y2giLCJjb250ZXh0RXJyb3IiLCJ0cmFjZSIsIm9TdGFydHVwUGFyYW1ldGVycyIsInNDcmVhdGVIYXNoIiwib01ldGFNb2RlbCIsInNNZXRhUGF0aCIsInNOZXdBY3Rpb24iLCJwcmVmZXJyZWRNb2RlIiwidG9VcHBlckNhc2UiLCJzUHJlZmVycmVkTW9kZSIsImxpbmVJdGVtcyIsImxpbmVJdGVtIiwiaXNEYXRhRmllbGRGb3JBY3Rpb24iLCJBY3Rpb24iLCJMYWJlbCIsInNpbmdsZXRvbiJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiVHJhbnNhY3Rpb25IZWxwZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBBY3Rpb24sIEFjdGlvbiBhcyBFZG1BY3Rpb24sIEVudGl0eVNldCwgTmF2aWdhdGlvblByb3BlcnR5IH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IExpbmVJdGVtIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3ZvY2FidWxhcmllcy9VSVwiO1xuaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgdHlwZSBBcHBDb21wb25lbnQgZnJvbSBcInNhcC9mZS9jb3JlL0FwcENvbXBvbmVudFwiO1xuaW1wb3J0IHR5cGUgeyBGRVZpZXcgfSBmcm9tIFwic2FwL2ZlL2NvcmUvQmFzZUNvbnRyb2xsZXJcIjtcbmltcG9ydCBDb21tb25VdGlscyBmcm9tIFwic2FwL2ZlL2NvcmUvQ29tbW9uVXRpbHNcIjtcbmltcG9ydCB0eXBlIFJlc291cmNlTW9kZWwgZnJvbSBcInNhcC9mZS9jb3JlL1Jlc291cmNlTW9kZWxcIjtcbmltcG9ydCB0eXBlIHsgRXhpdERpYWxvZ0V2ZW50IH0gZnJvbSBcInNhcC9mZS9jb3JlL1VJUHJvdmlkZXJcIjtcbmltcG9ydCB7IGdldENvcmVVSUZhY3RvcnkgfSBmcm9tIFwic2FwL2ZlL2NvcmUvVUlQcm92aWRlclwiO1xuaW1wb3J0IEJ1c3lMb2NrZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL0J1c3lMb2NrZXJcIjtcbmltcG9ydCB0eXBlIE1lc3NhZ2VIYW5kbGVyIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9NZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHR5cGUgeyBCaW5kQ29udGV4dFBhcmFtZXRlcnMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvZWRpdEZsb3cvZHJhZnRcIjtcbmltcG9ydCBkcmFmdCBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvZWRpdEZsb3cvZHJhZnRcIjtcbmltcG9ydCBVaU1vZGVsQ29uc3RhbnRzIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9lZGl0Rmxvdy9lZGl0Rmxvd0NvbnN0YW50c1wiO1xuaW1wb3J0IG9wZXJhdGlvbnMgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2VkaXRGbG93L29wZXJhdGlvbnNcIjtcbmltcG9ydCBzdGlja3kgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2VkaXRGbG93L3N0aWNreVwiO1xuaW1wb3J0IG1lc3NhZ2VIYW5kbGluZyBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvbWVzc2FnZUhhbmRsZXIvbWVzc2FnZUhhbmRsaW5nXCI7XG5pbXBvcnQgKiBhcyBNZXRhTW9kZWxDb252ZXJ0ZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWV0YU1vZGVsQ29udmVydGVyXCI7XG5pbXBvcnQgeyBjb252ZXJ0VHlwZXMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9NZXRhTW9kZWxDb252ZXJ0ZXJcIjtcbmltcG9ydCB7IGlzRGF0YUZpZWxkRm9yQWN0aW9uIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvYW5ub3RhdGlvbnMvRGF0YUZpZWxkXCI7XG5pbXBvcnQgdHlwZSB7IERlbGV0ZU9wdGlvbiwgRGVsZXRlUGFyYW1ldGVycyB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0RlbGV0ZUhlbHBlclwiO1xuaW1wb3J0IGRlbGV0ZUhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9EZWxldGVIZWxwZXJcIjtcbmltcG9ydCBGUE1IZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvRlBNSGVscGVyXCI7XG5pbXBvcnQgeyBnZXRDcmVhdGVQb3B1cEZpZWxkcyB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01ldGFNb2RlbEZ1bmN0aW9uXCI7XG5pbXBvcnQgdHlwZSB7IEludGVybmFsTW9kZWxDb250ZXh0IH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTW9kZWxIZWxwZXJcIjtcbmltcG9ydCBNb2RlbEhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0IFByb21pc2VLZWVwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvUHJvbWlzZUtlZXBlclwiO1xuaW1wb3J0IHRvRVM2UHJvbWlzZSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Ub0VTNlByb21pc2VcIjtcbmltcG9ydCB7IGlzTmF2aWdhdGlvblByb3BlcnR5IH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvVHlwZUd1YXJkc1wiO1xuaW1wb3J0IEZFTGlicmFyeSBmcm9tIFwic2FwL2ZlL2NvcmUvbGlicmFyeVwiO1xuaW1wb3J0IEJ1dHRvbiBmcm9tIFwic2FwL20vQnV0dG9uXCI7XG5pbXBvcnQgRGlhbG9nIGZyb20gXCJzYXAvbS9EaWFsb2dcIjtcbmltcG9ydCBNZXNzYWdlQm94IGZyb20gXCJzYXAvbS9NZXNzYWdlQm94XCI7XG5pbXBvcnQgTWVzc2FnZVRvYXN0IGZyb20gXCJzYXAvbS9NZXNzYWdlVG9hc3RcIjtcbmltcG9ydCB0eXBlIHsgJFBvcG92ZXJTZXR0aW5ncyB9IGZyb20gXCJzYXAvbS9Qb3BvdmVyXCI7XG5pbXBvcnQgUG9wb3ZlciBmcm9tIFwic2FwL20vUG9wb3ZlclwiO1xuaW1wb3J0IFRleHQgZnJvbSBcInNhcC9tL1RleHRcIjtcbmltcG9ydCBWQm94IGZyb20gXCJzYXAvbS9WQm94XCI7XG5pbXBvcnQgdHlwZSBFdmVudCBmcm9tIFwic2FwL3VpL2Jhc2UvRXZlbnRcIjtcbmltcG9ydCB0eXBlIENvbnRyb2wgZnJvbSBcInNhcC91aS9jb3JlL0NvbnRyb2xcIjtcbmltcG9ydCBMaWJyYXJ5IGZyb20gXCJzYXAvdWkvY29yZS9MaWJcIjtcbmltcG9ydCBNZXNzYWdpbmcgZnJvbSBcInNhcC91aS9jb3JlL01lc3NhZ2luZ1wiO1xuaW1wb3J0IHR5cGUgTWVzc2FnZSBmcm9tIFwic2FwL3VpL2NvcmUvbWVzc2FnZS9NZXNzYWdlXCI7XG5pbXBvcnQgTWVzc2FnZVR5cGUgZnJvbSBcInNhcC91aS9jb3JlL21lc3NhZ2UvTWVzc2FnZVR5cGVcIjtcbmltcG9ydCB0eXBlIFZpZXcgZnJvbSBcInNhcC91aS9jb3JlL212Yy9WaWV3XCI7XG5pbXBvcnQgdHlwZSBUYWJsZSBmcm9tIFwic2FwL3VpL21kYy9UYWJsZVwiO1xuaW1wb3J0IHR5cGUgTXVsdGlWYWx1ZUZpZWxkSXRlbSBmcm9tIFwic2FwL3VpL21kYy9maWVsZC9NdWx0aVZhbHVlRmllbGRJdGVtXCI7XG5pbXBvcnQgdHlwZSBCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvQmluZGluZ1wiO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL0NvbnRleHRcIjtcbmltcG9ydCB0eXBlIE9EYXRhVjRDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQ29udGV4dFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFMaXN0QmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTGlzdEJpbmRpbmdcIjtcbmltcG9ydCB0eXBlIHsgT0RhdGFMaXN0QmluZGluZyRDcmVhdGVDb21wbGV0ZWRFdmVudCB9IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFMaXN0QmluZGluZ1wiO1xuaW1wb3J0IHR5cGUgT0RhdGFNZXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1ldGFNb2RlbFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTW9kZWxcIjtcbmltcG9ydCBBY3Rpb25SdW50aW1lIGZyb20gXCIuLi8uLi9BY3Rpb25SdW50aW1lXCI7XG5pbXBvcnQgdHlwZSB7IE9wZXJhdGlvblJlc3VsdCB9IGZyb20gXCIuL29wZXJhdGlvbnMvT0RhdGFPcGVyYXRpb25cIjtcbmltcG9ydCBPcGVyYXRpb24gZnJvbSBcIi4vb3BlcmF0aW9ucy9PcGVyYXRpb25cIjtcbmltcG9ydCBhY3Rpb25IZWxwZXIgZnJvbSBcIi4vb3BlcmF0aW9ucy9hY3Rpb25IZWxwZXJcIjtcblxuY29uc3QgQ3JlYXRpb25Nb2RlID0gRkVMaWJyYXJ5LkNyZWF0aW9uTW9kZTtcbmNvbnN0IFByb2dyYW1taW5nTW9kZWwgPSBGRUxpYnJhcnkuUHJvZ3JhbW1pbmdNb2RlbDtcblxuLy9FbnVtcyBmb3IgZGVsZXRlIHRleHQgY2FsY3VsYXRpb25zIGZvciBkZWxldGUgY29uZmlybSBkaWFsb2cuXG5jb25zdCBEZWxldGVPcHRpb25UeXBlcyA9IGRlbGV0ZUhlbHBlci5EZWxldGVPcHRpb25UeXBlcztcbmNvbnN0IERlbGV0ZURpYWxvZ0NvbnRlbnRDb250cm9sID0gZGVsZXRlSGVscGVyLkRlbGV0ZURpYWxvZ0NvbnRlbnRDb250cm9sO1xuXG4vKiBNYWtlIHN1cmUgdGhhdCB0aGUgbVBhcmFtZXRlcnMgaXMgbm90IHRoZSBvRXZlbnQgKi9cbmZ1bmN0aW9uIGdldFBhcmFtZXRlcnM8VD4obVBhcmFtZXRlcnM/OiBFdmVudCB8IFQpOiBUIHtcblx0aWYgKG1QYXJhbWV0ZXJzICYmIChtUGFyYW1ldGVycyBhcyBFdmVudCkuZ2V0TWV0YWRhdGEgJiYgKG1QYXJhbWV0ZXJzIGFzIEV2ZW50KS5nZXRNZXRhZGF0YSgpLmdldE5hbWUoKSA9PT0gXCJzYXAudWkuYmFzZS5FdmVudFwiKSB7XG5cdFx0bVBhcmFtZXRlcnMgPSB7fSBhcyBUO1xuXHR9XG5cdHJldHVybiAobVBhcmFtZXRlcnMgYXMgVCkgfHwgKHt9IGFzIFQpO1xufVxuXG5leHBvcnQgdHlwZSBDcmVhdGVQYXJhbWV0ZXJzID0ge1xuXHRkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cdGJ1c3lNb2RlPzogc3RyaW5nO1xuXHRidXN5SWQ/OiBzdHJpbmc7XG5cdGtlZXBUcmFuc2llbnRDb250ZXh0T25GYWlsZWQ/OiBib29sZWFuO1xuXHRwYXJlbnRDb250cm9sOiBWaWV3O1xuXHRpbmFjdGl2ZT86IGJvb2xlYW47XG5cdGJlZm9yZUNyZWF0ZUNhbGxCYWNrPzogRnVuY3Rpb247XG5cdGFmdGVyQ3JlYXRlQ2FsbEJhY2s/OiAoY29udGV4dDogT0RhdGFWNENvbnRleHQpID0+IFByb21pc2U8dm9pZD47XG5cdHNraXBQYXJhbWV0ZXJEaWFsb2c/OiBib29sZWFuO1xuXHRjcmVhdGlvbk1vZGU/OiBzdHJpbmc7XG5cdGNyZWF0ZUF0RW5kPzogYm9vbGVhbjtcblx0cGFyZW50Q29udGV4dD86IE9EYXRhVjRDb250ZXh0O1xuXHRjcmVhdGlvbkRpYWxvZ0ZpZWxkcz86IHN0cmluZ1tdO1xufTtcblxuZXhwb3J0IHR5cGUgQ2FuY2VsUGFyYW1ldGVycyA9IHsgY2FuY2VsQnV0dG9uOiBCdXR0b247IHNraXBEaXNjYXJkUG9wb3ZlcjogYm9vbGVhbjsgYmVmb3JlQ2FuY2VsQ2FsbEJhY2s/OiBGdW5jdGlvbiB9O1xuZXhwb3J0IHR5cGUgVHJhbnNhY3Rpb25EZWxldGVQYXJhbWV0ZXJzID0gRGVsZXRlUGFyYW1ldGVycyAmIHtcblx0c2VsZWN0ZWRDb250ZXh0cz86IE9EYXRhVjRDb250ZXh0W107XG5cdHRpdGxlPzogc3RyaW5nO1xuXHRub0RpYWxvZz86IGJvb2xlYW47XG59O1xuZXhwb3J0IHR5cGUgRWRpdFRyYW5zYWN0aW9uRXhlY3V0aW9uRGV0YWlscyA9IHtcblx0ZXhpc3RpbmdEcmFmdFJldXNlZD86IGJvb2xlYW47IC8vIHRydWUgaWYgYW4gZXhpc3RpbmcgZHJhZnQgd2FzIHJldHVybmVkLCBpbnN0ZWFkIG9mIHJldHVybmluZyBhIG5ldyBvbmVcbn07XG5cbmNsYXNzIFRyYW5zYWN0aW9uSGVscGVyIHtcblx0YnVzeUxvY2soYXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsIGJ1c3lQYXRoPzogc3RyaW5nKTogdm9pZCB7XG5cdFx0QnVzeUxvY2tlci5sb2NrKGFwcENvbXBvbmVudC5nZXRNb2RlbChcInVpXCIpLCBidXN5UGF0aCk7XG5cdH1cblxuXHRidXN5VW5sb2NrKGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LCBidXN5UGF0aD86IHN0cmluZyk6IHZvaWQge1xuXHRcdEJ1c3lMb2NrZXIudW5sb2NrKGFwcENvbXBvbmVudC5nZXRNb2RlbChcInVpXCIpLCBidXN5UGF0aCk7XG5cdH1cblxuXHRnZXRQcm9ncmFtbWluZ01vZGVsKHNvdXJjZTogT0RhdGFWNENvbnRleHQgfCBCaW5kaW5nKTogdHlwZW9mIFByb2dyYW1taW5nTW9kZWwge1xuXHRcdGxldCBwYXRoOiBzdHJpbmc7XG5cdFx0aWYgKHNvdXJjZS5pc0E8T0RhdGFWNENvbnRleHQ+KFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHRcIikpIHtcblx0XHRcdHBhdGggPSBzb3VyY2UuZ2V0UGF0aCgpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRwYXRoID0gKHNvdXJjZS5pc1JlbGF0aXZlKCkgPyBzb3VyY2UuZ2V0UmVzb2x2ZWRQYXRoKCkgOiBzb3VyY2UuZ2V0UGF0aCgpKSA/PyBcIlwiO1xuXHRcdH1cblxuXHRcdGNvbnN0IG1ldGFNb2RlbCA9IHNvdXJjZS5nZXRNb2RlbCgpPy5nZXRNZXRhTW9kZWwoKSBhcyBPRGF0YU1ldGFNb2RlbCB8IHVuZGVmaW5lZDtcblx0XHRpZiAobWV0YU1vZGVsICYmIE1vZGVsSGVscGVyLmlzRHJhZnRTdXBwb3J0ZWQobWV0YU1vZGVsLCBwYXRoKSkge1xuXHRcdFx0cmV0dXJuIFByb2dyYW1taW5nTW9kZWwuRHJhZnQ7XG5cdFx0fSBlbHNlIGlmIChtZXRhTW9kZWwgJiYgTW9kZWxIZWxwZXIuaXNTdGlja3lTZXNzaW9uU3VwcG9ydGVkKG1ldGFNb2RlbCkpIHtcblx0XHRcdHJldHVybiBQcm9ncmFtbWluZ01vZGVsLlN0aWNreTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIFByb2dyYW1taW5nTW9kZWwuTm9uRHJhZnQ7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFZhbGlkYXRlcyBhIGRvY3VtZW50LlxuXHQgKiBAcGFyYW0gb0NvbnRleHQgQ29udGV4dCBvZiB0aGUgZG9jdW1lbnQgdG8gYmUgdmFsaWRhdGVkXG5cdCAqIEBwYXJhbSBbbVBhcmFtZXRlcnNdIENhbiBjb250YWluIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0ICogQHBhcmFtIFttUGFyYW1ldGVycy5kYXRhXSBBIG1hcCBvZiBkYXRhIHRoYXQgc2hvdWxkIGJlIHZhbGlkYXRlZFxuXHQgKiBAcGFyYW0gW21QYXJhbWV0ZXJzLmN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbl0gQSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBwYXRoIHRvIHRoZSB2YWxpZGF0aW9uIGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSBvVmlldyBDb250YWlucyB0aGUgb2JqZWN0IG9mIHRoZSBjdXJyZW50IHZpZXdcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyB3aXRoIHJlc3VsdCBvZiB0aGUgY3VzdG9tIHZhbGlkYXRpb24gZnVuY3Rpb25cblx0ICogQGZpbmFsXG5cdCAqL1xuXHRhc3luYyB2YWxpZGF0ZURvY3VtZW50KFxuXHRcdG9Db250ZXh0OiBPRGF0YVY0Q29udGV4dCxcblx0XHRtUGFyYW1ldGVyczogeyBjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24/OiBzdHJpbmc7IGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH0sXG5cdFx0b1ZpZXc6IFZpZXdcblx0KTogUHJvbWlzZTx7IG1lc3NhZ2VUYXJnZXQ/OiBzdHJpbmc7IG1lc3NhZ2VUZXh0OiBzdHJpbmcgfVtdPiB7XG5cdFx0Y29uc3Qgc0N1c3RvbVZhbGlkYXRpb25GdW5jdGlvbiA9IG1QYXJhbWV0ZXJzICYmIG1QYXJhbWV0ZXJzLmN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbjtcblx0XHRpZiAoc0N1c3RvbVZhbGlkYXRpb25GdW5jdGlvbikge1xuXHRcdFx0Y29uc3Qgc01vZHVsZSA9IHNDdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24uc3Vic3RyaW5nKDAsIHNDdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24ubGFzdEluZGV4T2YoXCIuXCIpIHx8IC0xKS5yZXBsYWNlKC9cXC4vZ2ksIFwiL1wiKSxcblx0XHRcdFx0c0Z1bmN0aW9uTmFtZSA9IHNDdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24uc3Vic3RyaW5nKFxuXHRcdFx0XHRcdHNDdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24ubGFzdEluZGV4T2YoXCIuXCIpICsgMSxcblx0XHRcdFx0XHRzQ3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uLmxlbmd0aFxuXHRcdFx0XHQpLFxuXHRcdFx0XHRtRGF0YSA9IG1QYXJhbWV0ZXJzLmRhdGE7XG5cdFx0XHRkZWxldGUgbURhdGFbXCJAJHVpNS5jb250ZXh0LmlzVHJhbnNpZW50XCJdO1xuXHRcdFx0cmV0dXJuIEZQTUhlbHBlci52YWxpZGF0aW9uV3JhcHBlcihzTW9kdWxlLCBzRnVuY3Rpb25OYW1lLCBtRGF0YSwgb1ZpZXcsIG9Db250ZXh0KTtcblx0XHR9XG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZShbXSk7XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmVzIGRlZmF0dWwgdmFsdWVzIGZyb20gdGhlIERlZmF1bHRWYWx1ZSBmdW5jdGlvbi5cblx0ICogQHBhcmFtIGxpc3RCaW5kaW5nIFRoZSBsaXN0IGJpbmRpbmcgdG8gYmUgdXNlZCBmb3IgY3JlYXRpb25cblx0ICogQHJldHVybnMgQSBwcm9taXNlIHdpdGggYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGRlZmF1bHQgdmFsdWVzIChvciB1bmRlZmluZWQgaWYgdGhlcmUncyBubyBkZWZhdWx0IHZhbHVlIGZ1bmN0aW9uKVxuXHQgKi9cblx0cHJpdmF0ZSBhc3luYyBnZXREYXRhRnJvbURlZmF1bHRWYWx1ZUZ1bmN0aW9uKGxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nKTogUHJvbWlzZTxvYmplY3QgfCB1bmRlZmluZWQ+IHtcblx0XHRjb25zdCBtb2RlbCA9IGxpc3RCaW5kaW5nLmdldE1vZGVsKCk7XG5cdFx0Y29uc3QgbWV0YU1vZGVsID0gbW9kZWwuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0Y29uc3QgbWV0YUNvbnRleHQgPSBtZXRhTW9kZWwuZ2V0TWV0YUNvbnRleHQobGlzdEJpbmRpbmcuZ2V0UmVzb2x2ZWRQYXRoKCkgYXMgc3RyaW5nKTtcblx0XHRjb25zdCBsaXN0QmluZGluZ09iamVjdFBhdGggPSBNZXRhTW9kZWxDb252ZXJ0ZXIuZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzKG1ldGFDb250ZXh0KTtcblxuXHRcdGNvbnN0IGRlZmF1bHRGdW5jT25UYXJnZXRPYmplY3QgPSAobGlzdEJpbmRpbmdPYmplY3RQYXRoLnRhcmdldE9iamVjdCBhcyBOYXZpZ2F0aW9uUHJvcGVydHkgfCBFbnRpdHlTZXQpLmFubm90YXRpb25zLkNvbW1vblxuXHRcdFx0Py5EZWZhdWx0VmFsdWVzRnVuY3Rpb247XG5cdFx0Y29uc3QgZGVmYXVsdEZ1bmNPblRhcmdldEVudGl0eVNldCA9IChsaXN0QmluZGluZ09iamVjdFBhdGgudGFyZ2V0RW50aXR5U2V0IGFzIEVudGl0eVNldCB8IHVuZGVmaW5lZCk/LmFubm90YXRpb25zLkNvbW1vblxuXHRcdFx0Py5EZWZhdWx0VmFsdWVzRnVuY3Rpb247XG5cdFx0Y29uc3QgZGVmYXVsdEZ1bmN0aW9uTmFtZSA9IGRlZmF1bHRGdW5jT25UYXJnZXRPYmplY3QgPz8gZGVmYXVsdEZ1bmNPblRhcmdldEVudGl0eVNldDtcblxuXHRcdGlmICghZGVmYXVsdEZ1bmN0aW9uTmFtZSkge1xuXHRcdFx0Ly8gTm8gZGVmYXVsdCB2YWx1ZSBmdW5jdGlvblxuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHRjb25zdCBmdW5jdGlvbk9uTmF2UHJvcCA9IGlzTmF2aWdhdGlvblByb3BlcnR5KGxpc3RCaW5kaW5nT2JqZWN0UGF0aC50YXJnZXRPYmplY3QpICYmIGRlZmF1bHRGdW5jT25UYXJnZXRPYmplY3QgIT09IHVuZGVmaW5lZDtcblx0XHRjb25zdCBkZWZhdWx0RnVuY3Rpb25Db250ZXh0ID0gZnVuY3Rpb25Pbk5hdlByb3AgPyBsaXN0QmluZGluZy5nZXRDb250ZXh0KCkgOiBsaXN0QmluZGluZy5nZXRIZWFkZXJDb250ZXh0KCk7XG5cdFx0aWYgKCFkZWZhdWx0RnVuY3Rpb25Db250ZXh0KSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblx0XHRjb25zdCBkZWZhdWx0RnVuY3Rpb25QYXRoID0gYCR7bWV0YU1vZGVsLmdldE1ldGFQYXRoKGRlZmF1bHRGdW5jdGlvbkNvbnRleHQuZ2V0UGF0aCgpKX0vJHtkZWZhdWx0RnVuY3Rpb25OYW1lfWA7XG5cblx0XHRjb25zdCBkZWZhdWx0RnVuY3Rpb25PYmplY3RQYXRoID0gTWV0YU1vZGVsQ29udmVydGVyLmdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyhtZXRhTW9kZWwuZ2V0TWV0YUNvbnRleHQoZGVmYXVsdEZ1bmN0aW9uUGF0aCkpO1xuXHRcdGNvbnN0IGRlZmF1bHRGdW5jdGlvblJlc3VsdCA9IChkZWZhdWx0RnVuY3Rpb25PYmplY3RQYXRoLnRhcmdldE9iamVjdCBhcyBBY3Rpb24pPy5pc0JvdW5kXG5cdFx0XHQ/IGF3YWl0IG9wZXJhdGlvbnMuY2FsbEJvdW5kRnVuY3Rpb24oZGVmYXVsdEZ1bmN0aW9uTmFtZS50b1N0cmluZygpLCBkZWZhdWx0RnVuY3Rpb25Db250ZXh0LCBtb2RlbClcblx0XHRcdDogKChhd2FpdCBvcGVyYXRpb25zLmNhbGxGdW5jdGlvbkltcG9ydChkZWZhdWx0RnVuY3Rpb25OYW1lLnRvU3RyaW5nKCksIG1vZGVsKSkgYXMgT0RhdGFWNENvbnRleHQpO1xuXG5cdFx0cmV0dXJuIGRlZmF1bHRGdW5jdGlvblJlc3VsdC5nZXRPYmplY3QoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgYSBsaXN0IGJpbmRpbmcgY29ycmVzcG9uZHMgdG8gYSBoaWVyYXJjaHkuXG5cdCAqIEBwYXJhbSBsaXN0QmluZGluZ1xuXHQgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBsaXN0IGJpbmRpbmcgaXMgaGllcmFyY2hpY2FsLlxuXHQgKi9cblx0aXNMaXN0QmluZGluZ0hpZXJhcmNoaWNhbChsaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZyk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiAobGlzdEJpbmRpbmcuZ2V0QWdncmVnYXRpb24oKSBhcyB7IGhpZXJhcmNoeVF1YWxpZmllcj86IHN0cmluZyB9IHwgdW5kZWZpbmVkKT8uaGllcmFyY2h5UXVhbGlmaWVyID8gdHJ1ZSA6IGZhbHNlO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gbGlzdCBiaW5kaW5nIGlzIGFuYWx5dGljYWwuXG5cdCAqIEBwYXJhbSBsaXN0QmluZGluZyBUaGUgbGlzdCBiaW5kaW5nIHRvIGNoZWNrXG5cdCAqIEByZXR1cm5zIFRSVUUgaWYgdGhlIGxpc3QgYmluZGluZyBpcyBhbmFseXRpY2FsLCBgZmFsc2VgIG90aGVyd2lzZS5cblx0ICovXG5cdGlzTGlzdEJpbmRpbmdBbmFseXRpY2FsKGxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nKTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgYWdncmVnYXRpb24gPSBsaXN0QmluZGluZy5nZXRBZ2dyZWdhdGlvbigpIGFzIHsgaGllcmFyY2h5UXVhbGlmaWVyPzogc3RyaW5nIH0gfCB1bmRlZmluZWQ7XG5cdFx0cmV0dXJuIGFnZ3JlZ2F0aW9uICE9PSB1bmRlZmluZWQgJiYgIWFnZ3JlZ2F0aW9uLmhpZXJhcmNoeVF1YWxpZmllcjtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmV3IGNvbnRleHQgaW4gYSBsaXN0IGJpbmRpbmcuIEhhbmRsZXMgYm90aCBmbGF0IGFuZCBoaWVyYXJjaGljYWwgY2FzZXMuXG5cdCAqIEBwYXJhbSBsaXN0QmluZGluZ1xuXHQgKiBAcGFyYW0gaW5pdGlhbERhdGEgSW5pdGlhbCBkYXRhIHRvIGNyZWF0ZSB0aGUgY29udGV4dC5cblx0ICogQHBhcmFtIG9wdGlvbnMgQ3JlYXRpb24gb3B0aW9ucy5cblx0ICogQHBhcmFtIG9wdGlvbnMuY3JlYXRlQXRFbmQgQ3JlYXRlIHRoZSBjb250ZXh0IGF0IHRoZSBlbmQgb2YgdGhlIGxpc3QgKGlnbm9yZWQgaW4gY2FzZSBvZiBhIGhpZXJhcmNoeSkuXG5cdCAqIEBwYXJhbSBvcHRpb25zLmNyZWF0ZUluYWN0aXZlIENyZWF0ZSB0aGUgY29udGV4dCBhcyBpbmFjdGl2ZSAoaWdub3JlZCBpbiBjYXNlIG9mIGEgaGllcmFyY2h5KS5cblx0ICogQHBhcmFtIG9wdGlvbnMucGFyZW50Q29udGV4dCBDcmVhdGUgdGhlIGNvbnRleHQgYXMgYVx0IGNoaWxkIG9mIHRoaXMgY29udGV4dCAob255IHVzZWQgaW4gY2FzZSBvZiBhIGhpZXJhcmNoeSkuXG5cdCAqIEByZXR1cm5zIFRoZSBjcmVhdGVkIGNvbnRleHQuXG5cdCAqL1xuXHRwcml2YXRlIGFzeW5jIGNyZWF0ZUNvbnRleHQoXG5cdFx0bGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcsXG5cdFx0aW5pdGlhbERhdGE6IG9iamVjdCB8IHVuZGVmaW5lZCxcblx0XHRvcHRpb25zOiB7IGNyZWF0ZUF0RW5kPzogYm9vbGVhbjsgY3JlYXRlSW5hY3RpdmU/OiBib29sZWFuOyBwYXJlbnRDb250ZXh0PzogT0RhdGFWNENvbnRleHQgfVxuXHQpOiBQcm9taXNlPE9EYXRhVjRDb250ZXh0PiB7XG5cdFx0Y29uc3QgZGF0YUZvckNyZWF0aW9uID0gaW5pdGlhbERhdGEgPz8ge307XG5cblx0XHRpZiAodGhpcy5pc0xpc3RCaW5kaW5nSGllcmFyY2hpY2FsKGxpc3RCaW5kaW5nKSkge1xuXHRcdFx0bGV0IGxpc3RCaW5kaW5nRm9yQ3JlYXRpb246IE9EYXRhTGlzdEJpbmRpbmc7XG5cdFx0XHRpZiAob3B0aW9ucy5wYXJlbnRDb250ZXh0Py5pc0V4cGFuZGVkKCkgPT09IGZhbHNlKSB7XG5cdFx0XHRcdC8vIElmIHRoZSBwYXJlbnQgY29udGV4dCBhbHJlYWR5IGhhcyBjaGlsZHJlbiBhbmQgaXMgY29sbGFwc2VkLCB3ZSBleHBhbmQgaXQgZmlyc3Rcblx0XHRcdFx0YXdhaXQgbGlzdEJpbmRpbmcuZXhwYW5kKG9wdGlvbnMucGFyZW50Q29udGV4dCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChsaXN0QmluZGluZy5pc1JlbGF0aXZlKCkpIHtcblx0XHRcdFx0T2JqZWN0LmFzc2lnbihkYXRhRm9yQ3JlYXRpb24sIHsgXCJAJHVpNS5ub2RlLnBhcmVudFwiOiBvcHRpb25zLnBhcmVudENvbnRleHQgfSk7XG5cdFx0XHRcdGxpc3RCaW5kaW5nRm9yQ3JlYXRpb24gPSBsaXN0QmluZGluZztcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIEFic29sdXRlIGJpbmRpbmc6IGNyZWF0aW9uIGZyb20gdGhlIExpc3RSZXBvcnRcblx0XHRcdFx0Ly8gV2UgdXNlIGEgdGVtcG9yYXJ5IGZsYXQgbGlzdEJpbmRpbmcgZm9yIHRoZSBjcmVhdGlvbiwgdG8gYXZvaWQgYWRkaW5nIHRoZSBuZXcgY29udGV4dCBpbiB0aGUgdGFibGUgKHdlIGRvbid0IHdhbnQgdG8gZGlzcGxheSBpdCB1bnRpbCBpdCdzIHNhdmVkKVxuXHRcdFx0XHRjb25zdCBtb2RlbCA9IGxpc3RCaW5kaW5nLmdldE1vZGVsKCk7XG5cdFx0XHRcdGNvbnN0IG1ldGFNb2RlbCA9IG1vZGVsLmdldE1ldGFNb2RlbCgpO1xuXHRcdFx0XHRsaXN0QmluZGluZ0ZvckNyZWF0aW9uID0gbW9kZWwuYmluZExpc3QobGlzdEJpbmRpbmcuZ2V0UGF0aCgpLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB7XG5cdFx0XHRcdFx0JCRncm91cElkOiBsaXN0QmluZGluZy5nZXRHcm91cElkKCksXG5cdFx0XHRcdFx0JCR1cGRhdGVHcm91cElkOiBsaXN0QmluZGluZy5nZXRVcGRhdGVHcm91cElkKClcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0Ly8gQWRkIHRoZSBwYXJlbnQgcGF0aCBpbiB0aGUgaW5pdGlhbCBkYXRhIGlmIGEgcGFyZW50IGlzIHByb3ZpZGVkXG5cdFx0XHRcdGlmIChvcHRpb25zLnBhcmVudENvbnRleHQpIHtcblx0XHRcdFx0XHRjb25zdCBvYmplY3RQYXRoID0gTWV0YU1vZGVsQ29udmVydGVyLmdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyhtZXRhTW9kZWwuZ2V0TWV0YUNvbnRleHQobGlzdEJpbmRpbmcuZ2V0UGF0aCgpKSk7XG5cdFx0XHRcdFx0Y29uc3QgaGllcmFyY2h5UXVhbGlmaWVyID0gKGxpc3RCaW5kaW5nLmdldEFnZ3JlZ2F0aW9uKCkgYXMgeyBoaWVyYXJjaHlRdWFsaWZpZXI6IHN0cmluZyB9KS5oaWVyYXJjaHlRdWFsaWZpZXI7XG5cdFx0XHRcdFx0Y29uc3QgcGFyZW50TmF2aWdhdGlvbiA9XG5cdFx0XHRcdFx0XHRvYmplY3RQYXRoLnRhcmdldEVudGl0eVR5cGUuYW5ub3RhdGlvbnMuQWdncmVnYXRpb24/LltgUmVjdXJzaXZlSGllcmFyY2h5IyR7aGllcmFyY2h5UXVhbGlmaWVyfWBdXG5cdFx0XHRcdFx0XHRcdD8uUGFyZW50TmF2aWdhdGlvblByb3BlcnR5LnZhbHVlO1xuXHRcdFx0XHRcdGlmICghcGFyZW50TmF2aWdhdGlvbikge1xuXHRcdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgZmluZCBwYXJlbnQgbmF2aWdhdGlvbiBwcm9wZXJ0eSBmb3IgJHtsaXN0QmluZGluZy5nZXRQYXRoKCl9YCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGNvbnN0IHBhcmVudEJpbmRpbmdEYXRhOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG5cdFx0XHRcdFx0cGFyZW50QmluZGluZ0RhdGFbYCR7cGFyZW50TmF2aWdhdGlvbn1Ab2RhdGEuYmluZGBdID0gb3B0aW9ucy5wYXJlbnRDb250ZXh0LmdldFBhdGgoKS5yZXBsYWNlKC9eXFwvLywgXCJcIik7IC8vIFJlbW92ZSBsZWFkaW5nIFwiL1wiIGZyb20gdGhlIHBhdGhcblx0XHRcdFx0XHRPYmplY3QuYXNzaWduKGRhdGFGb3JDcmVhdGlvbiwgcGFyZW50QmluZGluZ0RhdGEpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBsaXN0QmluZGluZ0ZvckNyZWF0aW9uLmNyZWF0ZShkYXRhRm9yQ3JlYXRpb24sIHRydWUpO1xuXHRcdH0gZWxzZSBpZiAodGhpcy5pc0xpc3RCaW5kaW5nQW5hbHl0aWNhbChsaXN0QmluZGluZykpIHtcblx0XHRcdGlmIChsaXN0QmluZGluZy5pc1JlbGF0aXZlKCkpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiQ3JlYXRpbmcgYSBuZXcgZG9jdW1lbnQgaW4gYSBhbmFseXRpY2FsIHRhYmxlIGlzIHN1cHBvcnRlZCBvbmx5IGluIGEgTGlzdFJlcG9ydFwiKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIFdlIHVzZSBhIHRlbXBvcmFyeSBmbGF0IGxpc3RCaW5kaW5nIGZvciB0aGUgY3JlYXRpb24sIHRvIGF2b2lkIGFkZGluZyB0aGUgbmV3IGNvbnRleHQgaW4gdGhlIHRhYmxlICh3ZSBkb24ndCB3YW50IHRvIGRpc3BsYXkgaXQgdW50aWwgaXQncyBzYXZlZClcblx0XHRcdFx0Y29uc3QgbW9kZWwgPSBsaXN0QmluZGluZy5nZXRNb2RlbCgpO1xuXHRcdFx0XHRjb25zdCBsaXN0QmluZGluZ0ZvckNyZWF0aW9uID0gbW9kZWwuYmluZExpc3QobGlzdEJpbmRpbmcuZ2V0UGF0aCgpLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB7XG5cdFx0XHRcdFx0JCRncm91cElkOiBsaXN0QmluZGluZy5nZXRHcm91cElkKCksXG5cdFx0XHRcdFx0JCR1cGRhdGVHcm91cElkOiBsaXN0QmluZGluZy5nZXRVcGRhdGVHcm91cElkKClcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHJldHVybiBsaXN0QmluZGluZ0ZvckNyZWF0aW9uLmNyZWF0ZShkYXRhRm9yQ3JlYXRpb24sIHRydWUpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gbGlzdEJpbmRpbmcuY3JlYXRlKGRhdGFGb3JDcmVhdGlvbiwgdHJ1ZSwgb3B0aW9ucy5jcmVhdGVBdEVuZCwgb3B0aW9ucy5jcmVhdGVJbmFjdGl2ZSk7XG5cdFx0fVxuXHR9XG5cblx0Z2V0Q3JlYXRpb25QYXJhbWV0ZXJzKGxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nLCBjcmVhdGVEYXRhOiBvYmplY3QgfCB1bmRlZmluZWQsIGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50KTogc3RyaW5nW10ge1xuXHRcdGNvbnN0IG1ldGFNb2RlbCA9IGxpc3RCaW5kaW5nLmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0Y29uc3QgbWV0YVBhdGggPSBtZXRhTW9kZWwuZ2V0TWV0YVBhdGgobGlzdEJpbmRpbmcuZ2V0SGVhZGVyQ29udGV4dCgpIS5nZXRQYXRoKCkpO1xuXG5cdFx0Y29uc3Qgbm9uQ29tcHV0ZWRWaXNpYmxlRmllbGRzID0gZ2V0Q3JlYXRlUG9wdXBGaWVsZHMobWV0YU1vZGVsLCBtZXRhUGF0aCwgYXBwQ29tcG9uZW50KTtcblx0XHQvLyBEbyBub3QgY29uc2lkZXIgZmllbGRzIGZvciB3aGljaCB3ZSBwcm92aWRlIHNvbWUgaW5pdGlhbCBkYXRhXG5cdFx0cmV0dXJuIG5vbkNvbXB1dGVkVmlzaWJsZUZpZWxkcy5maWx0ZXIoKGZpZWxkTmFtZTogc3RyaW5nKSA9PiB7XG5cdFx0XHRyZXR1cm4gIShmaWVsZE5hbWUgaW4gKGNyZWF0ZURhdGEgPz8ge30pKTtcblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmV3IGRvY3VtZW50LlxuXHQgKiBAcGFyYW0gbWFpbkxpc3RCaW5kaW5nIE9EYXRhIFY0IExpc3RCaW5kaW5nIG9iamVjdFxuXHQgKiBAcGFyYW0gW2luUGFyYW1ldGVyc10gT3B0aW9uYWwsIGNhbiBjb250YWluIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0ICogQHBhcmFtIFtpblBhcmFtZXRlcnMuZGF0YV0gQSBtYXAgb2YgZGF0YSB0aGF0IHNob3VsZCBiZSBzZW50IHdpdGhpbiB0aGUgUE9TVFxuXHQgKiBAcGFyYW0gW2luUGFyYW1ldGVycy5idXN5TW9kZV0gR2xvYmFsIChkZWZhdWx0KSwgTG9jYWwsIE5vbmUgVE9ETzogdG8gYmUgcmVmYWN0b3JlZFxuXHQgKiBAcGFyYW0gW2luUGFyYW1ldGVycy5idXN5SWRdIElEIG9mIHRoZSBsb2NhbCBidXN5IGluZGljYXRvclxuXHQgKiBAcGFyYW0gW2luUGFyYW1ldGVycy5rZWVwVHJhbnNpZW50Q29udGV4dE9uRmFpbGVkXSBJZiBzZXQsIHRoZSBjb250ZXh0IHN0YXlzIGluIHRoZSBsaXN0IGlmIHRoZSBQT1NUIGZhaWxlZCBhbmQgUE9TVCB3aWxsIGJlIHJlcGVhdGVkIHdpdGggdGhlIG5leHQgY2hhbmdlXG5cdCAqIEBwYXJhbSBbaW5QYXJhbWV0ZXJzLmluYWN0aXZlXSBJZiBzZXQsIHRoZSBjb250ZXh0IGlzIHNldCBhcyBpbmFjdGl2ZSBmb3IgZW1wdHkgcm93c1xuXHQgKiBAcGFyYW0gW2luUGFyYW1ldGVycy5za2lwUGFyYW1ldGVyRGlhbG9nXSBTa2lwcyB0aGUgYWN0aW9uIHBhcmFtZXRlciBkaWFsb2dcblx0ICogQHBhcmFtIGFwcENvbXBvbmVudCBUaGUgYXBwIGNvbXBvbmVudFxuXHQgKiBAcGFyYW0gcmVzb3VyY2VNb2RlbCBUaGUgcmVzb3VyY2UgbW9kZWxcblx0ICogQHBhcmFtIG1lc3NhZ2VIYW5kbGVyIFRoZSBtZXNzYWdlIGhhbmRsZXIgZXh0ZW5zaW9uXG5cdCAqIEBwYXJhbSBmcm9tQ29weVBhc3RlIFRydWUgaWYgdGhlIGNyZWF0aW9uIGhhcyBiZWVuIHRyaWdnZXJlZCBieSBhIHBhc3RlIGFjdGlvblxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIHdpdGggbmV3IGJpbmRpbmcgY29udGV4dFxuXHQgKiBAZmluYWxcblx0ICovXG5cdGFzeW5jIGNyZWF0ZURvY3VtZW50KFxuXHRcdG1haW5MaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZyxcblx0XHRpblBhcmFtZXRlcnM6IENyZWF0ZVBhcmFtZXRlcnMgfCB1bmRlZmluZWQsXG5cdFx0YXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsXG5cdFx0cmVzb3VyY2VNb2RlbDogUmVzb3VyY2VNb2RlbCxcblx0XHRtZXNzYWdlSGFuZGxlcjogTWVzc2FnZUhhbmRsZXIsXG5cdFx0ZnJvbUNvcHlQYXN0ZTogYm9vbGVhblxuXHQpOiBQcm9taXNlPE9EYXRhVjRDb250ZXh0PiB7XG5cdFx0bGV0IG5ld0RvY3VtZW50Q29udGV4dDogT0RhdGFWNENvbnRleHQgfCB1bmRlZmluZWQ7XG5cdFx0Y29uc3QgcGFyYW1ldGVycyA9IGdldFBhcmFtZXRlcnMoaW5QYXJhbWV0ZXJzKTtcblx0XHRpZiAoIW1haW5MaXN0QmluZGluZykge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiQmluZGluZyByZXF1aXJlZCBmb3IgbmV3IGRvY3VtZW50IGNyZWF0aW9uXCIpO1xuXHRcdH1cblx0XHRjb25zdCBwcm9ncmFtbWluZ01vZGVsID0gdGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKG1haW5MaXN0QmluZGluZyk7XG5cdFx0aWYgKHByb2dyYW1taW5nTW9kZWwgIT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQgJiYgcHJvZ3JhbW1pbmdNb2RlbCAhPT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIkNyZWF0ZSBkb2N1bWVudCBvbmx5IGFsbG93ZWQgZm9yIGRyYWZ0IG9yIHN0aWNreSBzZXNzaW9uIHN1cHBvcnRlZCBzZXJ2aWNlc1wiKTtcblx0XHR9XG5cdFx0Y29uc3QgYnVzeVBhdGggPSB0aGlzLmdldEJ1c3lQYXRoKHBhcmFtZXRlcnMpO1xuXHRcdHBhcmFtZXRlcnMuYmVmb3JlQ3JlYXRlQ2FsbEJhY2sgPSBmcm9tQ29weVBhc3RlID8gdW5kZWZpbmVkIDogcGFyYW1ldGVycy5iZWZvcmVDcmVhdGVDYWxsQmFjaztcblx0XHRpZiAoIWluUGFyYW1ldGVycz8uaW5hY3RpdmUpIHtcblx0XHRcdHRoaXMuYnVzeUxvY2soYXBwQ29tcG9uZW50LCBidXN5UGF0aCk7XG5cdFx0fVxuXHRcdGNvbnN0IG1lc3NhZ2VIYW5kbGluZ0tleSA9IG1lc3NhZ2VIYW5kbGVyLnJlZ2lzdGVyVG9Ib2xkTWVzc2FnZXMoKTtcblx0XHR0cnkge1xuXHRcdFx0bmV3RG9jdW1lbnRDb250ZXh0ID0gYXdhaXQgdGhpcy5wZXJmb3JtQ3JlYXRpb24oXG5cdFx0XHRcdG1haW5MaXN0QmluZGluZyxcblx0XHRcdFx0cGFyYW1ldGVycyxcblx0XHRcdFx0YXBwQ29tcG9uZW50LFxuXHRcdFx0XHRtZXNzYWdlSGFuZGxlcixcblx0XHRcdFx0cmVzb3VyY2VNb2RlbCxcblx0XHRcdFx0ZnJvbUNvcHlQYXN0ZVxuXHRcdFx0KTtcblx0XHRcdGF3YWl0IG1lc3NhZ2VIYW5kbGVyLnNob3dNZXNzYWdlRGlhbG9nKHsgY29udHJvbDogcGFyYW1ldGVycy5wYXJlbnRDb250cm9sLCB1bkhvbGRLZXk6IG1lc3NhZ2VIYW5kbGluZ0tleSB9KTtcblx0XHRcdHJldHVybiBuZXdEb2N1bWVudENvbnRleHQhO1xuXHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHQvLyBUT0RPOiBjdXJyZW50bHksIHRoZSBvbmx5IGVycm9ycyBoYW5kbGVkIGhlcmUgYXJlIHJhaXNlZCBhcyBzdHJpbmcgLSBzaG91bGQgYmUgY2hhbmdlZCB0byBFcnJvciBvYmplY3RzXG5cdFx0XHRhd2FpdCBtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZURpYWxvZyh7IGNvbnRyb2w6IHBhcmFtZXRlcnMucGFyZW50Q29udHJvbCwgdW5Ib2xkS2V5OiBtZXNzYWdlSGFuZGxpbmdLZXkgfSk7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdChlcnJvciA9PT0gRkVMaWJyYXJ5LkNvbnN0YW50cy5BY3Rpb25FeGVjdXRpb25GYWlsZWQgfHwgZXJyb3IgPT09IEZFTGlicmFyeS5Db25zdGFudHMuQ2FuY2VsQWN0aW9uRGlhbG9nKSAmJlxuXHRcdFx0XHRuZXdEb2N1bWVudENvbnRleHQ/LmlzVHJhbnNpZW50KClcblx0XHRcdCkge1xuXHRcdFx0XHQvLyBUaGlzIGlzIGEgd29ya2Fyb3VuZCBzdWdnZXN0ZWQgYnkgbW9kZWwgYXMgQ29udGV4dC5kZWxldGUgcmVzdWx0cyBpbiBhbiBlcnJvclxuXHRcdFx0XHQvLyBUT0RPOiByZW1vdmUgdGhlICRkaXJlY3Qgb25jZSBtb2RlbCByZXNvbHZlcyB0aGlzIGlzc3VlXG5cdFx0XHRcdC8vIHRoaXMgbGluZSBzaG93cyB0aGUgZXhwZWN0ZWQgY29uc29sZSBlcnJvciBVbmNhdWdodCAoaW4gcHJvbWlzZSkgRXJyb3I6IFJlcXVlc3QgY2FuY2VsZWQ6IFBPU1QgVHJhdmVsOyBncm91cDogc3VibWl0TGF0ZXJcblx0XHRcdFx0bmV3RG9jdW1lbnRDb250ZXh0LmRlbGV0ZShcIiRkaXJlY3RcIik7XG5cdFx0XHR9XG5cdFx0XHR0aHJvdyBlcnJvcjtcblx0XHR9IGZpbmFsbHkge1xuXHRcdFx0aWYgKCFpblBhcmFtZXRlcnM/LmluYWN0aXZlKSB7XG5cdFx0XHRcdHRoaXMuYnVzeVVubG9jayhhcHBDb21wb25lbnQsIGJ1c3lQYXRoKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGdldEJ1c3lQYXRoKG1QYXJhbWV0ZXJzOiBDcmVhdGVQYXJhbWV0ZXJzKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gbVBhcmFtZXRlcnMuYnVzeU1vZGUgPT09IFwiTG9jYWxcIiA/IGAvYnVzeUxvY2FsLyR7bVBhcmFtZXRlcnMuYnVzeUlkfWAgOiBcIi9idXN5XCI7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIG5ldyBkb2N1bWVudC5cblx0ICogQHBhcmFtIG1haW5MaXN0QmluZGluZyBPRGF0YSBWNCBMaXN0QmluZGluZyBvYmplY3QuXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzIENvbnRhaW5zIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlc1xuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5kYXRhIEEgbWFwIG9mIGRhdGEgdGhhdCBzaG91bGQgYmUgc2VudCB3aXRoaW4gdGhlIFBPU1Rcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuYnVzeU1vZGUgR2xvYmFsIChkZWZhdWx0KSwgTG9jYWwsIE5vbmVcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuYnVzeUlkIElEIG9mIHRoZSBsb2NhbCBidXN5IGluZGljYXRvclxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5rZWVwVHJhbnNpZW50Q29udGV4dE9uRmFpbGVkIElmIHNldCwgdGhlIGNvbnRleHQgc3RheXMgaW4gdGhlIGxpc3QgaWYgdGhlIFBPU1QgZmFpbGVkIGFuZCBQT1NUIHdpbGwgYmUgcmVwZWF0ZWQgd2l0aCB0aGUgbmV4dCBjaGFuZ2Vcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMucGFyZW50Q29udHJvbFxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5pbmFjdGl2ZSBJZiBzZXQsIHRoZSBjb250ZXh0IGlzIHNldCBhcyBpbmFjdGl2ZSBmb3IgZW1wdHkgcm93c1xuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5iZWZvcmVDcmVhdGVDYWxsQmFjayBDYWxsYmFjayB0byBiZSBjYWxsZWQgYmVmb3JlIHRoZSBjcmVhdGlvblxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5za2lwUGFyYW1ldGVyRGlhbG9nIFNraXBzIHRoZSBhY3Rpb24gcGFyYW1ldGVyIGRpYWxvZ1xuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5jcmVhdGVBdEVuZCBDcmVhdGUgdGhlIGNvbnRleHQgYXQgdGhlIGVuZCBvZiB0aGUgbGlzdCAoaWdub3JlZCBpbiBjYXNlIG9mIGEgaGllcmFyY2h5KS5cblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuY3JlYXRlSW5hY3RpdmUgQ3JlYXRlIHRoZSBjb250ZXh0IGFzIGluYWN0aXZlIChpZ25vcmVkIGluIGNhc2Ugb2YgYSBoaWVyYXJjaHkpLlxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5wYXJlbnRDb250ZXh0IENyZWF0ZSB0aGUgY29udGV4dCBhcyBhIGNoaWxkIG9mIHRoaXMgY29udGV4dCAob25seSB1c2VkIGluIGNhc2Ugb2YgYSBoaWVyYXJjaHkpLlxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIHdpdGggbmV3IGJpbmRpbmcgY29udGV4dFxuXHQgKi9cblx0cHJpdmF0ZSBhc3luYyBjcmVhdGVEb2N1bWVudENvbnRleHQobWFpbkxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nLCBwYXJhbWV0ZXJzOiBDcmVhdGVQYXJhbWV0ZXJzKTogUHJvbWlzZTxPRGF0YVY0Q29udGV4dD4ge1xuXHRcdGlmIChwYXJhbWV0ZXJzLmJlZm9yZUNyZWF0ZUNhbGxCYWNrKSB7XG5cdFx0XHQvL2JlZm9yZUNyZWF0ZUNhbGxCYWNrIGV4cGVjdHMgY3JlYXRlUGFyYW1ldGVycyBvZiB0eXBlIGFueVtdXG5cdFx0XHRjb25zdCBjcmVhdGVQYXJhbWV0ZXJzID0gcGFyYW1ldGVycy5kYXRhID8gT2JqZWN0LmVudHJpZXMocGFyYW1ldGVycy5kYXRhKS5tYXAoKFtrZXksIHZhbHVlXSkgPT4gKHsgW2tleV06IHZhbHVlIH0pKSA6IFtdO1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0YXdhaXQgdG9FUzZQcm9taXNlKFxuXHRcdFx0XHRcdHBhcmFtZXRlcnMuYmVmb3JlQ3JlYXRlQ2FsbEJhY2soe1xuXHRcdFx0XHRcdFx0Y29udGV4dFBhdGg6IG1haW5MaXN0QmluZGluZyAmJiBtYWluTGlzdEJpbmRpbmcuZ2V0UGF0aCgpLFxuXHRcdFx0XHRcdFx0Y3JlYXRlUGFyYW1ldGVyczogY3JlYXRlUGFyYW1ldGVyc1xuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdCk7XG5cdFx0XHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdFx0XHRMb2cuZXJyb3IoZXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdFx0dGhyb3cgRkVMaWJyYXJ5LkNvbnN0YW50cy5PbkJlZm9yZUNyZWF0ZUZhaWxlZDtcblx0XHRcdH1cblx0XHRcdHBhcmFtZXRlcnMuZGF0YSA9IGNyZWF0ZVBhcmFtZXRlcnMucmVkdWNlKChyZXN1bHQsIGN1cnJlbnRPYmplY3QpID0+IHtcblx0XHRcdFx0cmV0dXJuIHsgLi4ucmVzdWx0LCAuLi5jdXJyZW50T2JqZWN0IH07XG5cdFx0XHR9LCB7fSk7XG5cdFx0fVxuXHRcdGNvbnN0IGNyZWF0ZVByb21pc2UgPSB0aGlzLmNyZWF0ZUNvbnRleHQobWFpbkxpc3RCaW5kaW5nLCBwYXJhbWV0ZXJzLmRhdGEsIHtcblx0XHRcdGNyZWF0ZUF0RW5kOiAhIXBhcmFtZXRlcnMuY3JlYXRlQXRFbmQsXG5cdFx0XHRjcmVhdGVJbmFjdGl2ZTogISFwYXJhbWV0ZXJzLmluYWN0aXZlLFxuXHRcdFx0cGFyZW50Q29udGV4dDogcGFyYW1ldGVycy5wYXJlbnRDb250ZXh0XG5cdFx0fSk7XG5cdFx0aWYgKG1haW5MaXN0QmluZGluZy5nZXRVcGRhdGVHcm91cElkKCkgPT09IENvbW1vblV0aWxzLklOTElORUVESVRfVVBEQVRFR1JPVVBJRCkge1xuXHRcdFx0bWFpbkxpc3RCaW5kaW5nLmdldE1vZGVsKCkuc3VibWl0QmF0Y2goQ29tbW9uVXRpbHMuSU5MSU5FRURJVF9VUERBVEVHUk9VUElEKTtcblx0XHR9XG5cdFx0cmV0dXJuIGNyZWF0ZVByb21pc2U7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIG5ldyBkb2N1bWVudCBlaXRoZXIgdmlhIG5ldyBBY3Rpb24gb3Igc3RhbmRhcmQgUE9TVCBjcmVhdGUuXG5cdCAqIEBwYXJhbSBtYWluTGlzdEJpbmRpbmcgT0RhdGEgVjQgTGlzdEJpbmRpbmcgb2JqZWN0XG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzIENvbnRhaW5zIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlc1xuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5kYXRhIEEgbWFwIG9mIGRhdGEgdGhhdCBzaG91bGQgYmUgc2VudCB3aXRoaW4gdGhlIFBPU1Rcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuYnVzeU1vZGUgR2xvYmFsIChkZWZhdWx0KSwgTG9jYWwsIE5vbmVcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuYnVzeUlkIElEIG9mIHRoZSBsb2NhbCBidXN5IGluZGljYXRvclxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5rZWVwVHJhbnNpZW50Q29udGV4dE9uRmFpbGVkIElmIHNldCwgdGhlIGNvbnRleHQgc3RheXMgaW4gdGhlIGxpc3QgaWYgdGhlIFBPU1QgZmFpbGVkIGFuZCBQT1NUIHdpbGwgYmUgcmVwZWF0ZWQgd2l0aCB0aGUgbmV4dCBjaGFuZ2Vcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMucGFyZW50Q29udHJvbFxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5pbmFjdGl2ZSBJZiBzZXQsIHRoZSBjb250ZXh0IGlzIHNldCBhcyBpbmFjdGl2ZSBmb3IgZW1wdHkgcm93c1xuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5iZWZvcmVDcmVhdGVDYWxsQmFjayBDYWxsYmFjayB0byBiZSBjYWxsZWQgYmVmb3JlIHRoZSBjcmVhdGlvblxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5za2lwUGFyYW1ldGVyRGlhbG9nIFNraXBzIHRoZSBhY3Rpb24gcGFyYW1ldGVyIGRpYWxvZ1xuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5jcmVhdGVBdEVuZCBDcmVhdGUgdGhlIGNvbnRleHQgYXQgdGhlIGVuZCBvZiB0aGUgbGlzdCAoaWdub3JlZCBpbiBjYXNlIG9mIGEgaGllcmFyY2h5KS5cblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuY3JlYXRlSW5hY3RpdmUgQ3JlYXRlIHRoZSBjb250ZXh0IGFzIGluYWN0aXZlIChpZ25vcmVkIGluIGNhc2Ugb2YgYSBoaWVyYXJjaHkpLlxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5wYXJlbnRDb250ZXh0IENyZWF0ZSB0aGUgY29udGV4dCBhcyBhIGNoaWxkIG9mIHRoaXMgY29udGV4dCAob25seSB1c2VkIGluIGNhc2Ugb2YgYSBoaWVyYXJjaHkpLlxuXHQgKiBAcGFyYW0gYXBwQ29tcG9uZW50IFRoZSBhcHAgY29tcG9uZW50XG5cdCAqIEBwYXJhbSBtZXNzYWdlSGFuZGxlciBUaGUgbWVzc2FnZSBoYW5kbGVyIGV4dGVuc2lvblxuXHQgKiBAcGFyYW0gcmVzb3VyY2VNb2RlbFxuXHQgKiBAcGFyYW0gZnJvbUNvcHlQYXN0ZSBUcnVlIGlmIHRoZSBjcmVhdGlvbiBoYXMgYmVlbiB0cmlnZ2VyZWQgYnkgYSBwYXN0ZSBhY3Rpb25cblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyB3aXRoIG5ldyBiaW5kaW5nIGNvbnRleHRcblx0ICovXG5cdHByaXZhdGUgYXN5bmMgcGVyZm9ybUNyZWF0aW9uKFxuXHRcdG1haW5MaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZyxcblx0XHRwYXJhbWV0ZXJzOiBDcmVhdGVQYXJhbWV0ZXJzLFxuXHRcdGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LFxuXHRcdG1lc3NhZ2VIYW5kbGVyOiBNZXNzYWdlSGFuZGxlcixcblx0XHRyZXNvdXJjZU1vZGVsOiBSZXNvdXJjZU1vZGVsLFxuXHRcdGZyb21Db3B5UGFzdGU6IGJvb2xlYW5cblx0KTogUHJvbWlzZTxPRGF0YVY0Q29udGV4dCB8IHVuZGVmaW5lZD4ge1xuXHRcdGNvbnN0IG1ldGFNb2RlbCA9IG1haW5MaXN0QmluZGluZy5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdGNvbnN0IG1ldGFQYXRoID0gbWV0YU1vZGVsLmdldE1ldGFQYXRoKG1haW5MaXN0QmluZGluZy5nZXRIZWFkZXJDb250ZXh0KCkhLmdldFBhdGgoKSk7XG5cdFx0Y29uc3QgY3JlYXRlSGFzaCA9IGFwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSgpLmdldEhhc2goKTtcblx0XHRjb25zdCBjb21wb25lbnREYXRhID0gYXBwQ29tcG9uZW50LmdldENvbXBvbmVudERhdGEoKTtcblx0XHRjb25zdCBzdGFydHVwUGFyYW1ldGVycyA9IGNvbXBvbmVudERhdGE/LnN0YXJ0dXBQYXJhbWV0ZXJzID8/IHt9O1xuXHRcdGNvbnN0IG5ld0FjdGlvbiA9ICFtYWluTGlzdEJpbmRpbmcuaXNSZWxhdGl2ZSgpXG5cdFx0XHQ/IHRoaXMuX2dldE5ld0FjdGlvbihzdGFydHVwUGFyYW1ldGVycywgY3JlYXRlSGFzaCwgbWV0YU1vZGVsLCBtZXRhUGF0aClcblx0XHRcdDogdW5kZWZpbmVkO1xuXG5cdFx0aWYgKG5ld0FjdGlvbikge1xuXHRcdFx0Y29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5wZXJmb3JtQ3JlYXRpb25XaXRoQWN0aW9uKFxuXHRcdFx0XHRuZXdBY3Rpb24sXG5cdFx0XHRcdG1haW5MaXN0QmluZGluZyxcblx0XHRcdFx0cGFyYW1ldGVycyxcblx0XHRcdFx0YXBwQ29tcG9uZW50LFxuXHRcdFx0XHRyZXNvdXJjZU1vZGVsLFxuXHRcdFx0XHRtZXNzYWdlSGFuZGxlclxuXHRcdFx0KTtcblx0XHRcdGlmIChyZXN1bHQuc3RhdHVzID09PSBcInJlamVjdGVkXCIpIHtcblx0XHRcdFx0dGhyb3cgcmVzdWx0LnJlYXNvbjtcblx0XHRcdH1cblx0XHRcdHJldHVybiByZXN1bHQudmFsdWUucmV0dXJuZWRDb250ZXh0O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5wZXJmb3JtQ3JlYXRpb25XaXRoUE9TVChtYWluTGlzdEJpbmRpbmcsIHBhcmFtZXRlcnMsIGFwcENvbXBvbmVudCwgcmVzb3VyY2VNb2RlbCwgbWVzc2FnZUhhbmRsZXIsIGZyb21Db3B5UGFzdGUpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgZG9jdW1lbnQgd2l0aCBhbiBhY3Rpb24uXG5cdCAqIEBwYXJhbSBhY3Rpb25OYW1lXG5cdCAqIEBwYXJhbSBtYWluTGlzdEJpbmRpbmdcblx0ICogQHBhcmFtIHBhcmFtZXRlcnNcblx0ICogQHBhcmFtIGFwcENvbXBvbmVudFxuXHQgKiBAcGFyYW0gcmVzb3VyY2VNb2RlbFxuXHQgKiBAcGFyYW0gbWVzc2FnZUhhbmRsZXJcblx0ICogQHJldHVybnMgVGhlIGNyZWF0ZWQgY29udGV4dC5cblx0ICovXG5cdHByaXZhdGUgYXN5bmMgcGVyZm9ybUNyZWF0aW9uV2l0aEFjdGlvbihcblx0XHRhY3Rpb25OYW1lOiBzdHJpbmcsXG5cdFx0bWFpbkxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nLFxuXHRcdHBhcmFtZXRlcnM6IENyZWF0ZVBhcmFtZXRlcnMsXG5cdFx0YXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsXG5cdFx0cmVzb3VyY2VNb2RlbDogUmVzb3VyY2VNb2RlbCxcblx0XHRtZXNzYWdlSGFuZGxlcjogTWVzc2FnZUhhbmRsZXJcblx0KTogUHJvbWlzZTxQcm9taXNlU2V0dGxlZFJlc3VsdDxPcGVyYXRpb25SZXN1bHQ+PiB7XG5cdFx0Y29uc3QgaGVhZGVyQ29udGV4dFBhdGggPSBtYWluTGlzdEJpbmRpbmcuZ2V0SGVhZGVyQ29udGV4dCgpIS5nZXRQYXRoKCk7XG5cdFx0Y29uc3QgbWV0YU1vZGVsID0gbWFpbkxpc3RCaW5kaW5nLmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0Y29uc3QgbWV0YVBhdGggPSBtZXRhTW9kZWwuZ2V0TWV0YVBhdGgoaGVhZGVyQ29udGV4dFBhdGgpO1xuXHRcdGNvbnN0IG1lc3NhZ2VzUGF0aCA9IE1vZGVsSGVscGVyLmdldE1lc3NhZ2VzUGF0aChtZXRhTW9kZWwsIG1ldGFQYXRoKTtcblx0XHRjb25zdCBiaW5kaW5nUGFyYW1ldGVyczogQmluZENvbnRleHRQYXJhbWV0ZXJzID0geyAkJHBhdGNoV2l0aG91dFNpZGVFZmZlY3RzOiB0cnVlLCAkJHVwZGF0ZUdyb3VwSWQ6IFwiJGF1dG9cIiB9O1xuXG5cdFx0Y29uc3Qgc2VsZWN0ZWRQcm9wZXJ0aWVzOiBzdHJpbmdbXSA9IFtdO1xuXHRcdGlmIChtZXNzYWdlc1BhdGgpIHtcblx0XHRcdHNlbGVjdGVkUHJvcGVydGllcy5wdXNoKG1lc3NhZ2VzUGF0aCk7XG5cdFx0fVxuXHRcdGlmICh0aGlzLmdldFByb2dyYW1taW5nTW9kZWwobWFpbkxpc3RCaW5kaW5nKSA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCkge1xuXHRcdFx0c2VsZWN0ZWRQcm9wZXJ0aWVzLnB1c2goXCJJc0FjdGl2ZUVudGl0eVwiLCBcIkhhc0RyYWZ0RW50aXR5XCIsIFwiSGFzQWN0aXZlRW50aXR5XCIpOyAvLyBOZWVkZWQgZm9yIG91ciBpbnRlcm5hbCBsb2dpYyAoZS5nLiBuYXZpZ2F0aW9uKVxuXHRcdH1cblx0XHRpZiAoc2VsZWN0ZWRQcm9wZXJ0aWVzLmxlbmd0aCA+IDApIHtcblx0XHRcdGJpbmRpbmdQYXJhbWV0ZXJzW1wiJHNlbGVjdFwiXSA9IHNlbGVjdGVkUHJvcGVydGllcy5qb2luKFwiLFwiKTtcblx0XHR9XG5cdFx0Y29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5jYWxsQWN0aW9uKFxuXHRcdFx0YWN0aW9uTmFtZSxcblx0XHRcdHtcblx0XHRcdFx0Y29udGV4dHM6IG1haW5MaXN0QmluZGluZy5nZXRIZWFkZXJDb250ZXh0KCksXG5cdFx0XHRcdHNob3dBY3Rpb25QYXJhbWV0ZXJEaWFsb2c6IHRydWUsXG5cdFx0XHRcdGxhYmVsOiB0aGlzLl9nZXRTcGVjaWZpY0NyZWF0ZUFjdGlvbkRpYWxvZ0xhYmVsKG1ldGFNb2RlbCwgbWV0YVBhdGgsIGFjdGlvbk5hbWUsIHJlc291cmNlTW9kZWwpLFxuXHRcdFx0XHRiaW5kaW5nUGFyYW1ldGVyczogYmluZGluZ1BhcmFtZXRlcnMsXG5cdFx0XHRcdHZpZXc6IHBhcmFtZXRlcnMucGFyZW50Q29udHJvbCxcblx0XHRcdFx0aXNDcmVhdGVBY3Rpb246IHRydWUsXG5cdFx0XHRcdHNraXBQYXJhbWV0ZXJEaWFsb2c6IHBhcmFtZXRlcnMuc2tpcFBhcmFtZXRlckRpYWxvZ1xuXHRcdFx0fSxcblx0XHRcdGFwcENvbXBvbmVudCxcblx0XHRcdG1lc3NhZ2VIYW5kbGVyXG5cdFx0KTtcblx0XHRyZXR1cm4gcmVzdWx0WzBdO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBkb2N1ZW1udCB3aXRoIGEgc3RhbmRhcmQgUE9TVCByZXF1ZXN0LlxuXHQgKiBAcGFyYW0gbWFpbkxpc3RCaW5kaW5nXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzXG5cdCAqIEBwYXJhbSBhcHBDb21wb25lbnRcblx0ICogQHBhcmFtIHJlc291cmNlTW9kZWxcblx0ICogQHBhcmFtIG1lc3NhZ2VIYW5kbGVyXG5cdCAqIEBwYXJhbSBmcm9tQ29weVBhc3RlXG5cdCAqIEByZXR1cm5zIFRoZSBjcmVhdGVkIGNvbnRleHQuXG5cdCAqL1xuXHRwcml2YXRlIGFzeW5jIHBlcmZvcm1DcmVhdGlvbldpdGhQT1NUKFxuXHRcdG1haW5MaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZyxcblx0XHRwYXJhbWV0ZXJzOiBDcmVhdGVQYXJhbWV0ZXJzLFxuXHRcdGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LFxuXHRcdHJlc291cmNlTW9kZWw6IFJlc291cmNlTW9kZWwsXG5cdFx0bWVzc2FnZUhhbmRsZXI6IE1lc3NhZ2VIYW5kbGVyLFxuXHRcdGZyb21Db3B5UGFzdGU6IGJvb2xlYW5cblx0KTogUHJvbWlzZTxPRGF0YVY0Q29udGV4dCB8IHVuZGVmaW5lZD4ge1xuXHRcdHRyeSB7XG5cdFx0XHRsZXQgbmV3RG9jdW1lbnRDb250ZXh0OiBPRGF0YVY0Q29udGV4dCB8IHVuZGVmaW5lZDtcblx0XHRcdGNvbnN0IGluaXRpYWxEYXRhID0gcGFyYW1ldGVycy5kYXRhO1xuXHRcdFx0aWYgKCFmcm9tQ29weVBhc3RlKSB7XG5cdFx0XHRcdGNvbnN0IGRlZmF1bHRWYWx1ZUZ1bmN0aW9uRGF0YSA9IGF3YWl0IHRoaXMuZ2V0RGF0YUZyb21EZWZhdWx0VmFsdWVGdW5jdGlvbihtYWluTGlzdEJpbmRpbmcpO1xuXHRcdFx0XHRwYXJhbWV0ZXJzLmRhdGEgPSBPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0VmFsdWVGdW5jdGlvbkRhdGEsIHBhcmFtZXRlcnMuZGF0YSk7XG5cdFx0XHR9XG5cdFx0XHRpZiAocGFyYW1ldGVycy5kYXRhKSB7XG5cdFx0XHRcdGRlbGV0ZSBwYXJhbWV0ZXJzLmRhdGFbXCJAb2RhdGEuY29udGV4dFwiXTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgY2FuSGF2ZURpYWxvZyA9IHBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlICE9PSBDcmVhdGlvbk1vZGUuQ3JlYXRpb25Sb3cgJiYgcGFyYW1ldGVycy5jcmVhdGlvbk1vZGUgIT09IENyZWF0aW9uTW9kZS5JbmxpbmU7XG5cdFx0XHRjb25zdCBjcmVhdGlvbkRpYWxvZ0ZpZWxkcyA9IGNhbkhhdmVEaWFsb2cgPyB0aGlzLmdldENyZWF0aW9uUGFyYW1ldGVycyhtYWluTGlzdEJpbmRpbmcsIGluaXRpYWxEYXRhLCBhcHBDb21wb25lbnQpIDogW107XG5cdFx0XHRpZiAocGFyYW1ldGVycy5jcmVhdGlvbk1vZGUgPT09IENyZWF0aW9uTW9kZS5DcmVhdGlvbkRpYWxvZykge1xuXHRcdFx0XHRwYXJhbWV0ZXJzLmNyZWF0aW9uRGlhbG9nRmllbGRzPy5mb3JFYWNoKChmaWVsZE5hbWUpID0+IHtcblx0XHRcdFx0XHRpZiAoIWNyZWF0aW9uRGlhbG9nRmllbGRzLmluY2x1ZGVzKGZpZWxkTmFtZSkpIHtcblx0XHRcdFx0XHRcdGNyZWF0aW9uRGlhbG9nRmllbGRzLnB1c2goZmllbGROYW1lKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdGlmIChjcmVhdGlvbkRpYWxvZ0ZpZWxkcy5sZW5ndGggPT09IDApIHtcblx0XHRcdFx0XHQvLyBJbiBDcmVhdGlvbkRpYWxvZyBtb2RlLCB0aGUgZGlhbG9nIGlzIG1hbmRhdG9yeVxuXHRcdFx0XHRcdHRocm93IG5ldyBFcnJvcihcIk5vIGZpZWxkcyBhdmFpbGFibGUgZm9yIHRoZSBjcmVhdGlvbiBkaWFsb2dcIik7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0aWYgKGNyZWF0aW9uRGlhbG9nRmllbGRzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0bmV3RG9jdW1lbnRDb250ZXh0ID0gYXdhaXQgdGhpcy5jcmVhdGVXaXRoRGlhbG9nKFxuXHRcdFx0XHRcdG1haW5MaXN0QmluZGluZyxcblx0XHRcdFx0XHRjcmVhdGlvbkRpYWxvZ0ZpZWxkcyxcblx0XHRcdFx0XHRwYXJhbWV0ZXJzLFxuXHRcdFx0XHRcdGFwcENvbXBvbmVudCxcblx0XHRcdFx0XHRyZXNvdXJjZU1vZGVsLFxuXHRcdFx0XHRcdG1lc3NhZ2VIYW5kbGVyXG5cdFx0XHRcdCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRuZXdEb2N1bWVudENvbnRleHQgPSBhd2FpdCB0aGlzLmNyZWF0ZURvY3VtZW50Q29udGV4dChtYWluTGlzdEJpbmRpbmcsIHBhcmFtZXRlcnMpO1xuXHRcdFx0XHRpZiAoIXBhcmFtZXRlcnMuaW5hY3RpdmUpIHtcblx0XHRcdFx0XHRhd2FpdCB0aGlzLndhaXRGb3JDcmVhdGVDb21wbGV0aW9uKG5ld0RvY3VtZW50Q29udGV4dCwgcGFyYW1ldGVycy5rZWVwVHJhbnNpZW50Q29udGV4dE9uRmFpbGVkID09PSB0cnVlKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG5ld0RvY3VtZW50Q29udGV4dDtcblx0XHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdFx0Y29uc3QgbXNnID0gKGVycm9yIGFzIEVycm9yKS5tZXNzYWdlID8/IGVycm9yO1xuXHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgY3JlYXRpbmcgdGhlIG5ldyBkb2N1bWVudFwiLCBtc2cpO1xuXHRcdFx0dGhyb3cgbXNnO1xuXHRcdH1cblx0fVxuXG5cdF9pc0RyYWZ0RW5hYmxlZCh2Q29udGV4dHM6IE9EYXRhVjRDb250ZXh0W10pOiBib29sZWFuIHtcblx0XHRjb25zdCBjb250ZXh0Rm9yRHJhZnRNb2RlbCA9IHZDb250ZXh0c1swXTtcblx0XHRjb25zdCBzUHJvZ3JhbW1pbmdNb2RlbCA9IHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChjb250ZXh0Rm9yRHJhZnRNb2RlbCk7XG5cdFx0cmV0dXJuIHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0O1xuXHR9XG5cblx0LyoqXG5cdCAqIERlbGV0ZSBvbmUgb3IgbXVsdGlwbGUgZG9jdW1lbnQocykuXG5cdCAqIEBwYXJhbSBjb250ZXh0cyBDb250ZXh0cyBFaXRoZXIgb25lIGNvbnRleHQgb3IgYW4gYXJyYXkgd2l0aCBjb250ZXh0cyB0byBiZSBkZWxldGVkXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycyBPcHRpb25hbCwgY2FuIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMudGl0bGUgVGl0bGUgb2YgdGhlIG9iamVjdCB0byBiZSBkZWxldGVkXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5kZXNjcmlwdGlvbiBEZXNjcmlwdGlvbiBvZiB0aGUgb2JqZWN0IHRvIGJlIGRlbGV0ZWRcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLm51bWJlck9mU2VsZWN0ZWRDb250ZXh0cyBOdW1iZXIgb2Ygb2JqZWN0cyBzZWxlY3RlZFxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMubm9EaWFsb2cgVG8gZGlzYWJsZSB0aGUgY29uZmlybWF0aW9uIGRpYWxvZ1xuXHQgKiBAcGFyYW0gYXBwQ29tcG9uZW50IFRoZSBhcHBDb21wb25lbnRcblx0ICogQHBhcmFtIHJlc291cmNlTW9kZWwgVGhlIHJlc291cmNlIG1vZGVsIHRvIGxvYWQgdGV4dCByZXNvdXJjZXNcblx0ICogQHBhcmFtIG1lc3NhZ2VIYW5kbGVyIFRoZSBtZXNzYWdlIGhhbmRsZXIgZXh0ZW5zaW9uXG5cdCAqIEByZXR1cm5zIEEgUHJvbWlzZSByZXNvbHZlZCBvbmNlIHRoZSBkb2N1bWVudHMgYXJlIGRlbGV0ZWRcblx0ICovXG5cdGFzeW5jIGRlbGV0ZURvY3VtZW50KFxuXHRcdGNvbnRleHRzOiBPRGF0YVY0Q29udGV4dCB8IE9EYXRhVjRDb250ZXh0W10sXG5cdFx0bVBhcmFtZXRlcnM6IFRyYW5zYWN0aW9uRGVsZXRlUGFyYW1ldGVycyxcblx0XHRhcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCxcblx0XHRyZXNvdXJjZU1vZGVsOiBSZXNvdXJjZU1vZGVsLFxuXHRcdG1lc3NhZ2VIYW5kbGVyOiBNZXNzYWdlSGFuZGxlclxuXHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvLyBkZWxldGUgZG9jdW1lbnQgbG9ja1xuXHRcdHRoaXMuYnVzeUxvY2soYXBwQ29tcG9uZW50KTtcblxuXHRcdGNvbnN0IGNvbnRleHRzVG9EZWxldGUgPSBBcnJheS5pc0FycmF5KGNvbnRleHRzKSA/IFsuLi5jb250ZXh0c10gOiBbY29udGV4dHNdO1xuXHRcdGNvbnN0IGZpcnN0Q29udGV4dCA9IChtUGFyYW1ldGVycy5zZWxlY3RlZENvbnRleHRzID8/IGNvbnRleHRzVG9EZWxldGUpWzBdO1xuXG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGNvbnN0IGRyYWZ0RW5hYmxlZCA9IHRoaXMuX2lzRHJhZnRFbmFibGVkKG1QYXJhbWV0ZXJzLnNlbGVjdGVkQ29udGV4dHMgfHwgY29udGV4dHNUb0RlbGV0ZSk7XG5cdFx0XHRcdGNvbnN0IGl0ZW1zOiBDb250cm9sW10gPSBbXTtcblx0XHRcdFx0bGV0IG9wdGlvbnM6IERlbGV0ZU9wdGlvbltdID0gW107XG5cdFx0XHRcdGxldCB1blNhdmVkQ29udGV4dDogQ29udGV4dCB8IHVuZGVmaW5lZDtcblx0XHRcdFx0Ly8gaXRlbXModGV4dHMpIGFuZCBvcHRpb25zKGNoZWNrQm94ZXMgYW5kIHNpbmdsZSBkZWZhdWx0IG9wdGlvbikgZm9yIGNvbmZpcm0gZGlhbG9nLlxuXHRcdFx0XHRpZiAobVBhcmFtZXRlcnMpIHtcblx0XHRcdFx0XHRtUGFyYW1ldGVycyA9IGdldFBhcmFtZXRlcnMobVBhcmFtZXRlcnMpO1xuXHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmVudGl0eVNldE5hbWUgPSB0aGlzLmdldENvbGxlY3Rpb25OYW1lRnJvbUNvbnRleHQoZmlyc3RDb250ZXh0KTtcblx0XHRcdFx0XHRpZiAoIW1QYXJhbWV0ZXJzLm51bWJlck9mU2VsZWN0ZWRDb250ZXh0cykge1xuXHRcdFx0XHRcdFx0Ly8gbm9uLVRhYmxlXG5cdFx0XHRcdFx0XHRpZiAoZHJhZnRFbmFibGVkKSB7XG5cdFx0XHRcdFx0XHRcdC8vIENoZWNrIGlmIDEgb2YgdGhlIGRyYWZ0cyBpcyBsb2NrZWQgYnkgYW5vdGhlciB1c2VyXG5cdFx0XHRcdFx0XHRcdGNvbnN0IGxvY2tlZENvbnRleHQgPSBjb250ZXh0c1RvRGVsZXRlLmZpbmQoKGNvbnRleHQpID0+IHtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBjb250ZXh0RGF0YSA9IGNvbnRleHQuZ2V0T2JqZWN0KCk7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIChcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnRleHREYXRhLklzQWN0aXZlRW50aXR5ID09PSB0cnVlICYmXG5cdFx0XHRcdFx0XHRcdFx0XHRjb250ZXh0RGF0YS5IYXNEcmFmdEVudGl0eSA9PT0gdHJ1ZSAmJlxuXHRcdFx0XHRcdFx0XHRcdFx0Y29udGV4dERhdGEuRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEgJiZcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnRleHREYXRhLkRyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhLkluUHJvY2Vzc0J5VXNlciAmJlxuXHRcdFx0XHRcdFx0XHRcdFx0IWNvbnRleHREYXRhLkRyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhLkRyYWZ0SXNDcmVhdGVkQnlNZVxuXHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRpZiAobG9ja2VkQ29udGV4dCkge1xuXHRcdFx0XHRcdFx0XHRcdC8vIFNob3cgbWVzc2FnZSBib3ggd2l0aCB0aGUgbmFtZSBvZiB0aGUgbG9ja2luZyB1c2VyIGFuZCByZXR1cm5cblx0XHRcdFx0XHRcdFx0XHRjb25zdCBsb2NraW5nVXNlck5hbWUgPSBsb2NrZWRDb250ZXh0LmdldE9iamVjdCgpLkRyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhLkluUHJvY2Vzc0J5VXNlcjtcblx0XHRcdFx0XHRcdFx0XHRNZXNzYWdlQm94LnNob3coXG5cdFx0XHRcdFx0XHRcdFx0XHRyZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9DT05GSVJNX0RFTEVURV9XSVRIX1NJTkdMRV9PQkpFQ1RfTE9DS0VEXCIsIFtcblx0XHRcdFx0XHRcdFx0XHRcdFx0bG9ja2luZ1VzZXJOYW1lXG5cdFx0XHRcdFx0XHRcdFx0XHRdKSxcblx0XHRcdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0dGl0bGU6IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfQ09NTU9OX0RFTEVURVwiKSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0b25DbG9zZTogcmVqZWN0XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0dW5TYXZlZENvbnRleHQgPSBjb250ZXh0c1RvRGVsZXRlLmZpbmQoKGNvbnRleHQpID0+IHtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IHsgSXNBY3RpdmVFbnRpdHksIEhhc0RyYWZ0RW50aXR5LCBEcmFmdEFkbWluaXN0cmF0aXZlRGF0YSB9ID0gY29udGV4dC5nZXRPYmplY3QoKSB8fCB7fTtcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBJc0FjdGl2ZUVudGl0eSA9PT0gdHJ1ZSAmJiBIYXNEcmFmdEVudGl0eSA9PT0gdHJ1ZSAmJiAhIURyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhPy5JblByb2Nlc3NCeVVzZXI7XG5cdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGxldCBub25UYWJsZVR4dCA9IFwiXCI7XG5cdFx0XHRcdFx0XHRpZiAodW5TYXZlZENvbnRleHQpIHtcblx0XHRcdFx0XHRcdFx0Y29uc3QgdW5TYXZlZENvbnRleHRVc2VyID0gdW5TYXZlZENvbnRleHQuZ2V0T2JqZWN0KCkuRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEuSW5Qcm9jZXNzQnlVc2VyO1xuXHRcdFx0XHRcdFx0XHRub25UYWJsZVR4dCA9IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcblx0XHRcdFx0XHRcdFx0XHRcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0NPTkZJUk1fREVMRVRFX1dJVEhfVU5TQVZFRF9DSEFOR0VTXCIsXG5cdFx0XHRcdFx0XHRcdFx0W3VuU2F2ZWRDb250ZXh0VXNlcl0sXG5cdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMuZW50aXR5U2V0TmFtZVxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIGlmIChtUGFyYW1ldGVycy50aXRsZSkge1xuXHRcdFx0XHRcdFx0XHRpZiAobVBhcmFtZXRlcnMuZGVzY3JpcHRpb24pIHtcblx0XHRcdFx0XHRcdFx0XHRub25UYWJsZVR4dCA9IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcblx0XHRcdFx0XHRcdFx0XHRcdFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfQ09ORklSTV9ERUxFVEVfV0lUSF9PQkpFQ1RJTkZPXCIsXG5cdFx0XHRcdFx0XHRcdFx0XHRbbVBhcmFtZXRlcnMudGl0bGUsIG1QYXJhbWV0ZXJzLmRlc2NyaXB0aW9uXSxcblx0XHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmVudGl0eVNldE5hbWVcblx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdG5vblRhYmxlVHh0ID0gcmVzb3VyY2VNb2RlbC5nZXRUZXh0KFxuXHRcdFx0XHRcdFx0XHRcdFx0XCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9DT05GSVJNX0RFTEVURV9XSVRIX09CSkVDVFRJVExFX09OTFlcIixcblx0XHRcdFx0XHRcdFx0XHRcdFttUGFyYW1ldGVycy50aXRsZV0sXG5cdFx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5lbnRpdHlTZXROYW1lXG5cdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0bm9uVGFibGVUeHQgPSByZXNvdXJjZU1vZGVsLmdldFRleHQoXG5cdFx0XHRcdFx0XHRcdFx0XCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9DT05GSVJNX0RFTEVURV9XSVRIX09CSkVDVFRJVExFX1NJTkdVTEFSXCIsXG5cdFx0XHRcdFx0XHRcdFx0dW5kZWZpbmVkLFxuXHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmVudGl0eVNldE5hbWVcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdG9wdGlvbnMucHVzaCh7XG5cdFx0XHRcdFx0XHRcdHR5cGU6IERlbGV0ZU9wdGlvblR5cGVzLmRlbGV0YWJsZUNvbnRleHRzLFxuXHRcdFx0XHRcdFx0XHRjb250ZXh0czogY29udGV4dHNUb0RlbGV0ZSxcblx0XHRcdFx0XHRcdFx0dGV4dDogbm9uVGFibGVUeHQsXG5cdFx0XHRcdFx0XHRcdHNlbGVjdGVkOiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRjb250cm9sOiBEZWxldGVEaWFsb2dDb250ZW50Q29udHJvbC5URVhUXG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0Ly8gVGFibGVcblx0XHRcdFx0XHRcdGxldCB0b3RhbERlbGV0YWJsZSA9IGNvbnRleHRzVG9EZWxldGUubGVuZ3RoO1xuXG5cdFx0XHRcdFx0XHRpZiAoZHJhZnRFbmFibGVkKSB7XG5cdFx0XHRcdFx0XHRcdHRvdGFsRGVsZXRhYmxlICs9XG5cdFx0XHRcdFx0XHRcdFx0KG1QYXJhbWV0ZXJzLmRyYWZ0c1dpdGhOb25EZWxldGFibGVBY3RpdmU/Lmxlbmd0aCA/PyAwKSArXG5cdFx0XHRcdFx0XHRcdFx0KG1QYXJhbWV0ZXJzLmRyYWZ0c1dpdGhEZWxldGFibGVBY3RpdmU/Lmxlbmd0aCA/PyAwKSArXG5cdFx0XHRcdFx0XHRcdFx0KG1QYXJhbWV0ZXJzLnVuU2F2ZWRDb250ZXh0cz8ubGVuZ3RoID8/IDApO1xuXHRcdFx0XHRcdFx0XHRkZWxldGVIZWxwZXIudXBkYXRlRHJhZnRPcHRpb25zRm9yRGVsZXRhYmxlVGV4dHMoXG5cdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMsXG5cdFx0XHRcdFx0XHRcdFx0Y29udGV4dHNUb0RlbGV0ZSxcblx0XHRcdFx0XHRcdFx0XHR0b3RhbERlbGV0YWJsZSxcblx0XHRcdFx0XHRcdFx0XHRyZXNvdXJjZU1vZGVsLFxuXHRcdFx0XHRcdFx0XHRcdGl0ZW1zLFxuXHRcdFx0XHRcdFx0XHRcdG9wdGlvbnNcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IG5vbkRlbGV0YWJsZVRleHQgPSBkZWxldGVIZWxwZXIuZ2V0Tm9uRGVsZXRhYmxlVGV4dChtUGFyYW1ldGVycywgdG90YWxEZWxldGFibGUsIHJlc291cmNlTW9kZWwpO1xuXHRcdFx0XHRcdFx0XHRpZiAobm9uRGVsZXRhYmxlVGV4dCkge1xuXHRcdFx0XHRcdFx0XHRcdGl0ZW1zLnB1c2gobm9uRGVsZXRhYmxlVGV4dCk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Y29uc3Qgb3B0aW9uc0RlbGV0YWJsZVRleHRzID0gZGVsZXRlSGVscGVyLmdldE9wdGlvbnNGb3JEZWxldGFibGVUZXh0cyhcblx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMsXG5cdFx0XHRcdFx0XHRcdGNvbnRleHRzVG9EZWxldGUsXG5cdFx0XHRcdFx0XHRcdHJlc291cmNlTW9kZWxcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRvcHRpb25zID0gWy4uLm9wdGlvbnMsIC4uLm9wdGlvbnNEZWxldGFibGVUZXh0c107XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Y29uc3QgY29tbW9uQmluZGluZyA9IGZpcnN0Q29udGV4dC5nZXRCaW5kaW5nKCkgYXMgQmluZGluZztcblx0XHRcdFx0bGV0IGJpbmRpbmdUeXBlOiBcIlRyZWVcIiB8IFwiQW5hbHl0aWNhbFwiIHwgdW5kZWZpbmVkO1xuXHRcdFx0XHRpZiAoY29tbW9uQmluZGluZy5pc0E8T0RhdGFMaXN0QmluZGluZz4oXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ1wiKSkge1xuXHRcdFx0XHRcdGlmICh0aGlzLmlzTGlzdEJpbmRpbmdIaWVyYXJjaGljYWwoY29tbW9uQmluZGluZykpIHtcblx0XHRcdFx0XHRcdGJpbmRpbmdUeXBlID0gXCJUcmVlXCI7XG5cdFx0XHRcdFx0fSBlbHNlIGlmICh0aGlzLmlzTGlzdEJpbmRpbmdBbmFseXRpY2FsKGNvbW1vbkJpbmRpbmcpKSB7XG5cdFx0XHRcdFx0XHRiaW5kaW5nVHlwZSA9IFwiQW5hbHl0aWNhbFwiO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIENvbnRlbnQgb2YgRGVsZXRlIERpYWxvZ1xuXHRcdFx0XHRkZWxldGVIZWxwZXIudXBkYXRlQ29udGVudEZvckRlbGV0ZURpYWxvZyhvcHRpb25zLCBpdGVtcyk7XG5cdFx0XHRcdGNvbnN0IGZuQ29uZmlybSA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcblx0XHRcdFx0XHRtZXNzYWdlSGFuZGxpbmcucmVtb3ZlQm91bmRUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblx0XHRcdFx0XHR0aGlzLmJ1c3lMb2NrKGFwcENvbXBvbmVudCk7XG5cblx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0YXdhaXQgZGVsZXRlSGVscGVyLmRlbGV0ZUNvbmZpcm1IYW5kbGVyKFxuXHRcdFx0XHRcdFx0XHRvcHRpb25zLFxuXHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycyxcblx0XHRcdFx0XHRcdFx0bWVzc2FnZUhhbmRsZXIsXG5cdFx0XHRcdFx0XHRcdHJlc291cmNlTW9kZWwsXG5cdFx0XHRcdFx0XHRcdGFwcENvbXBvbmVudCxcblx0XHRcdFx0XHRcdFx0ZHJhZnRFbmFibGVkLFxuXHRcdFx0XHRcdFx0XHRiaW5kaW5nVHlwZVxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdHJlc29sdmUoKTtcblx0XHRcdFx0XHR9IGNhdGNoIChvRXJyb3I6IHVua25vd24pIHtcblx0XHRcdFx0XHRcdHJlamVjdCgpO1xuXHRcdFx0XHRcdH0gZmluYWxseSB7XG5cdFx0XHRcdFx0XHR0aGlzLmJ1c3lVbmxvY2soYXBwQ29tcG9uZW50KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH07XG5cblx0XHRcdFx0Y29uc3QgZGlhbG9nID0gdGhpcy5jcmVhdGVEZWxldGVEaWFsb2coaXRlbXMsIG1QYXJhbWV0ZXJzLCByZXNvdXJjZU1vZGVsLCBmbkNvbmZpcm0sIHJlamVjdCk7XG5cblx0XHRcdFx0aWYgKG1QYXJhbWV0ZXJzLm5vRGlhbG9nID09PSB0cnVlIHx8IG1QYXJhbWV0ZXJzLnNpbGVudE1vZGUgPT09IHRydWUpIHtcblx0XHRcdFx0XHRmbkNvbmZpcm0oKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRkaWFsb2cuYWRkU3R5bGVDbGFzcyhcInNhcFVpQ29udGVudFBhZGRpbmdcIik7XG5cdFx0XHRcdFx0ZGlhbG9nLm9wZW4oKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBmaW5hbGx5IHtcblx0XHRcdFx0Ly8gZGVsZXRlIGRvY3VtZW50IHVubG9ja1xuXHRcdFx0XHR0aGlzLmJ1c3lVbmxvY2soYXBwQ29tcG9uZW50KTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGUgdGhlIGNvbmZpcm1hdGlvbiBkaWFsb2cgZm8gdGhlIGRlbGV0aW9uLlxuXHQgKiBAcGFyYW0gaXRlbXMgQW4gYXJyYXkgb2YgY29udHJvbHMgdXNlZCBmb3IgdGhlIGRpYWxvZyBjb250ZW50XG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzIENvbnRhaW5zIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMucGFyZW50Q29udHJvbCBQYXJlbnQgY29udHJvbCBvZiB0aGUgZGVsZXRlIGJ1dHRvbiBpZiBhbnlcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuZW50aXR5U2V0TmFtZSBOYW1lIG9mIHRoZSBjdXJyZW50IGVudGl0eVNldFxuXHQgKiBAcGFyYW0gcmVzb3VyY2VNb2RlbCBUaGUgcmVzb3VyY2UgbW9kZWwgdG8gbG9hZCB0ZXh0IHJlc291cmNlc1xuXHQgKiBAcGFyYW0gZm5Db25maXJtIEZ1bmN0aW9uIGV4ZWN1dGVkIHVwb24gdGhlIHZhbGlkYXRpb24gb2YgdGhlIGRlbGV0aW9uXG5cdCAqIEBwYXJhbSBmblJlamVjdCBGdW5jdGlvbiBleGVjdXRlZCBpZiB0aGUgZGlhbG9nIGlzIGNsb3NlZCB2aWEgQ2FuY2VsIG9yIEVzY2FwZSBidXR0b25cblx0ICogQHJldHVybnMgVGhlIGNyZWF0ZWQgZGVsZXRlIGNvbmZpcm1hdGlvbiBkaWFsb2dcblx0ICovXG5cdGNyZWF0ZURlbGV0ZURpYWxvZyhcblx0XHRpdGVtczogQ29udHJvbFtdLFxuXHRcdHBhcmFtZXRlcnM6IFBhcnRpYWw8eyBwYXJlbnRDb250cm9sOiBDb250cm9sIHwgdW5kZWZpbmVkOyBlbnRpdHlTZXROYW1lOiBzdHJpbmcgfT4sXG5cdFx0cmVzb3VyY2VNb2RlbDogUmVzb3VyY2VNb2RlbCxcblx0XHRmbkNvbmZpcm06IEZ1bmN0aW9uLFxuXHRcdGZuUmVqZWN0OiBGdW5jdGlvblxuXHQpOiBEaWFsb2cge1xuXHRcdGxldCBkaWFsb2dDb25maXJtZWQgPSBmYWxzZTtcblx0XHRjb25zdCB2Qm94ID0gbmV3IFZCb3goeyBpdGVtczogaXRlbXMgfSk7XG5cdFx0Y29uc3QgcmVzb3VyY2VCdW5kbGVDb3JlID0gTGlicmFyeS5nZXRSZXNvdXJjZUJ1bmRsZUZvcihcInNhcC5mZS5jb3JlXCIpITtcblx0XHRsZXQgdGl0bGU6IHN0cmluZyB8IHVuZGVmaW5lZDtcblx0XHRpZiAocGFyYW1ldGVycy5wYXJlbnRDb250cm9sPy5pc0EoXCJzYXAudWkubWRjLlRhYmxlXCIpKSB7XG5cdFx0XHR0aXRsZSA9IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIk1fQ09NTU9OX1RBQkxFX0RFTEVURVwiLCB1bmRlZmluZWQsIHBhcmFtZXRlcnMuZW50aXR5U2V0TmFtZSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRpdGxlID0gcmVzb3VyY2VCdW5kbGVDb3JlLmdldFRleHQoXCJDX0NPTU1PTl9ERUxFVEVcIik7XG5cdFx0fVxuXHRcdGNvbnN0IGRpYWxvZyA9IG5ldyBEaWFsb2coe1xuXHRcdFx0dGl0bGU6IHRpdGxlLFxuXHRcdFx0c3RhdGU6IFwiV2FybmluZ1wiLFxuXHRcdFx0Y29udGVudDogW3ZCb3hdLFxuXHRcdFx0YXJpYUxhYmVsbGVkQnk6IGl0ZW1zLFxuXHRcdFx0YmVnaW5CdXR0b246IG5ldyBCdXR0b24oe1xuXHRcdFx0XHR0ZXh0OiB0aXRsZSxcblx0XHRcdFx0dHlwZTogXCJFbXBoYXNpemVkXCIsXG5cdFx0XHRcdHByZXNzOiBmdW5jdGlvbiAoKTogdm9pZCB7XG5cdFx0XHRcdFx0ZGlhbG9nQ29uZmlybWVkID0gdHJ1ZTtcblx0XHRcdFx0XHRkaWFsb2cuY2xvc2UoKTtcblx0XHRcdFx0XHRmbkNvbmZpcm0oKTtcblx0XHRcdFx0fVxuXHRcdFx0fSksXG5cdFx0XHRlbmRCdXR0b246IG5ldyBCdXR0b24oe1xuXHRcdFx0XHR0ZXh0OiByZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX0NPTU1PTl9ESUFMT0dfQ0FOQ0VMXCIpLFxuXHRcdFx0XHRwcmVzczogZnVuY3Rpb24gKCk6IHZvaWQge1xuXHRcdFx0XHRcdGRpYWxvZy5jbG9zZSgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KSxcblx0XHRcdGFmdGVyQ2xvc2U6IGZ1bmN0aW9uICgpOiB2b2lkIHtcblx0XHRcdFx0ZGlhbG9nLmRlc3Ryb3koKTtcblx0XHRcdFx0Ly8gaWYgZGlhbG9nIGlzIGNsb3NlZCB1bmNvbmZpcm1lZCAoZS5nLiB2aWEgXCJDYW5jZWxcIiBvciBFc2NhcGUgYnV0dG9uKSwgZW5zdXJlIHRvIHJlamVjdCBwcm9taXNlXG5cdFx0XHRcdGlmICghZGlhbG9nQ29uZmlybWVkKSB7XG5cdFx0XHRcdFx0Zm5SZWplY3QoKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdHJldHVybiBkaWFsb2c7XG5cdH1cblxuXHQvKipcblx0ICogRWRpdHMgYSBkb2N1bWVudC5cblx0ICogQHBhcmFtIG9Db250ZXh0IENvbnRleHQgb2YgdGhlIGFjdGl2ZSBkb2N1bWVudFxuXHQgKiBAcGFyYW0gb1ZpZXcgQ3VycmVudCB2aWV3XG5cdCAqIEBwYXJhbSBhcHBDb21wb25lbnQgVGhlIGFwcENvbXBvbmVudFxuXHQgKiBAcGFyYW0gbWVzc2FnZUhhbmRsZXIgVGhlIG1lc3NhZ2UgaGFuZGxlciBleHRlbnNpb25cblx0ICogQHBhcmFtIGdyb3VwSWQgVGhlIGJhdGNoIGdyb3VwSWQgZm9yIHBvc3QgY2FsbCBvZiBlZGl0IGFjdGlvblxuXHQgKiBAcGFyYW0gdHJhbnNhY3Rpb25EZXRhaWxzIE9wdGlvbmFsIG9iamVjdCB0byByZXR1cm4gYWRkaXRpb25hbCBkZXRhaWxzIGFib3V0IGhvdyB0aGUgdHJhbnNhY3Rpb24gd2FzIGV4ZWN1dGVkXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgd2l0aCB0aGUgbmV3IGRyYWZ0IGNvbnRleHQgaW4gY2FzZSBvZiBkcmFmdCBwcm9ncmFtbWluZyBtb2RlbFxuXHQgKiBAZmluYWxcblx0ICovXG5cdGFzeW5jIGVkaXREb2N1bWVudChcblx0XHRvQ29udGV4dDogT0RhdGFWNENvbnRleHQsXG5cdFx0b1ZpZXc6IEZFVmlldyxcblx0XHRhcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCxcblx0XHRtZXNzYWdlSGFuZGxlcjogTWVzc2FnZUhhbmRsZXIsXG5cdFx0Z3JvdXBJZDogc3RyaW5nLFxuXHRcdHRyYW5zYWN0aW9uRGV0YWlscz86IEVkaXRUcmFuc2FjdGlvbkV4ZWN1dGlvbkRldGFpbHNcblx0KTogUHJvbWlzZTxPRGF0YVY0Q29udGV4dCB8IHVuZGVmaW5lZD4ge1xuXHRcdGNvbnN0IHNQcm9ncmFtbWluZ01vZGVsID0gdGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKG9Db250ZXh0KTtcblx0XHRpZiAoIW9Db250ZXh0KSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJCaW5kaW5nIGNvbnRleHQgdG8gYWN0aXZlIGRvY3VtZW50IGlzIHJlcXVpcmVkXCIpO1xuXHRcdH1cblx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgIT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQgJiYgc1Byb2dyYW1taW5nTW9kZWwgIT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5KSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJFZGl0IGlzIG9ubHkgYWxsb3dlZCBmb3IgZHJhZnQgb3Igc3RpY2t5IHNlc3Npb24gc3VwcG9ydGVkIHNlcnZpY2VzXCIpO1xuXHRcdH1cblx0XHR0aGlzLmJ1c3lMb2NrKGFwcENvbXBvbmVudCk7XG5cdFx0Ly8gYmVmb3JlIHRyaWdnZXJpbmcgdGhlIGVkaXQgYWN0aW9uIHdlJ2xsIGhhdmUgdG8gcmVtb3ZlIGFsbCBib3VuZCB0cmFuc2l0aW9uIG1lc3NhZ2VzXG5cdFx0bWVzc2FnZUhhbmRsZXIucmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cdFx0Y29uc3QgbWVzc2FnZUhhbmRsaW5nS2V5ID0gbWVzc2FnZUhhbmRsZXIucmVnaXN0ZXJUb0hvbGRNZXNzYWdlcygpO1xuXG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IG9OZXdDb250ZXh0ID1cblx0XHRcdFx0c1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnRcblx0XHRcdFx0XHQ/IGF3YWl0IGRyYWZ0LmNyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50KFxuXHRcdFx0XHRcdFx0XHRvQ29udGV4dCxcblx0XHRcdFx0XHRcdFx0YXBwQ29tcG9uZW50LFxuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0YlByZXNlcnZlQ2hhbmdlczogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0XHRvVmlldzogb1ZpZXdcblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0Z3JvdXBJZCxcblx0XHRcdFx0XHRcdFx0bWVzc2FnZUhhbmRsZXIsXG5cdFx0XHRcdFx0XHRcdHRyYW5zYWN0aW9uRGV0YWlsc1xuXHRcdFx0XHRcdCAgKVxuXHRcdFx0XHRcdDogYXdhaXQgc3RpY2t5LmVkaXREb2N1bWVudEluU3RpY2t5U2Vzc2lvbihvQ29udGV4dCwgYXBwQ29tcG9uZW50LCBtZXNzYWdlSGFuZGxlcik7XG5cblx0XHRcdGF3YWl0IG1lc3NhZ2VIYW5kbGVyLnNob3dNZXNzYWdlRGlhbG9nKHsgdW5Ib2xkS2V5OiBtZXNzYWdlSGFuZGxpbmdLZXkgfSk7XG5cdFx0XHRyZXR1cm4gb05ld0NvbnRleHQ7XG5cdFx0fSBjYXRjaCAoZXJyOiB1bmtub3duKSB7XG5cdFx0XHRhd2FpdCBtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZXMoeyBjb25jdXJyZW50RWRpdEZsYWc6IHRydWUsIHVuSG9sZEtleTogbWVzc2FnZUhhbmRsaW5nS2V5IH0pO1xuXHRcdFx0dGhyb3cgZXJyO1xuXHRcdH0gZmluYWxseSB7XG5cdFx0XHR0aGlzLmJ1c3lVbmxvY2soYXBwQ29tcG9uZW50KTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQ2FuY2VsICdlZGl0JyBtb2RlIG9mIGEgZG9jdW1lbnQuXG5cdCAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IG9mIHRoZSBkb2N1bWVudCB0byBiZSBjYW5jZWxlZCBvciBkZWxldGVkXG5cdCAqIEBwYXJhbSBbbUluUGFyYW1ldGVyc10gT3B0aW9uYWwsIGNhbiBjb250YWluIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuY2FuY2VsQnV0dG9uIENhbmNlbCBCdXR0b24gb2YgdGhlIGRpc2NhcmQgcG9wb3ZlciAobWFuZGF0b3J5IGZvciBub3cpXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLnNraXBEaXNjYXJkUG9wb3ZlciBPcHRpb25hbCwgc3VwcmVzc2VzIHRoZSBkaXNjYXJkIHBvcG92ZXIgaW5jYXNlIG9mIGRyYWZ0IGFwcGxpY2F0aW9ucyB3aGlsZSBuYXZpZ2F0aW5nIG91dCBvZiBPUFxuXHQgKiBAcGFyYW0gYXBwQ29tcG9uZW50IFRoZSBhcHBDb21wb25lbnRcblx0ICogQHBhcmFtIHJlc291cmNlTW9kZWwgVGhlIG1vZGVsIHRvIGxvYWQgdGV4dCByZXNvdXJjZXNcblx0ICogQHBhcmFtIG1lc3NhZ2VIYW5kbGVyIFRoZSBtZXNzYWdlIGhhbmRsZXIgZXh0ZW5zaW9uXG5cdCAqIEBwYXJhbSBpc05ld09iamVjdCBUcnVlIGlmIHdlJ3JlIHRyeWluZyB0byBjYW5jZWwgYSBuZXdseSBjcmVhdGVkIG9iamVjdFxuXHQgKiBAcGFyYW0gaXNPYmplY3RNb2RpZmllZCBUcnVlIGlmIHRoZSBvYmplY3QgaGFzIGJlZW4gbW9kaWZpZWQgYnkgdGhlIHVzZXJcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyB3aXRoID8/P1xuXHQgKiBAZmluYWxcblx0ICovXG5cdGFzeW5jIGNhbmNlbERvY3VtZW50KFxuXHRcdG9Db250ZXh0OiBPRGF0YVY0Q29udGV4dCxcblx0XHRtSW5QYXJhbWV0ZXJzOiBDYW5jZWxQYXJhbWV0ZXJzIHwgdW5kZWZpbmVkLFxuXHRcdGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LFxuXHRcdHJlc291cmNlTW9kZWw6IFJlc291cmNlTW9kZWwsXG5cdFx0bWVzc2FnZUhhbmRsZXI6IE1lc3NhZ2VIYW5kbGVyLFxuXHRcdGlzTmV3T2JqZWN0OiBib29sZWFuLFxuXHRcdGlzT2JqZWN0TW9kaWZpZWQ6IGJvb2xlYW5cblx0KTogUHJvbWlzZTxPRGF0YVY0Q29udGV4dCB8IHVuZGVmaW5lZD4ge1xuXHRcdC8vY29udGV4dCBtdXN0IGFsd2F5cyBiZSBwYXNzZWQgLSBtYW5kYXRvcnkgcGFyYW1ldGVyXG5cdFx0aWYgKCFvQ29udGV4dCkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiTm8gY29udGV4dCBleGlzdHMuIFBhc3MgYSBtZWFuaW5nZnVsIGNvbnRleHRcIik7XG5cdFx0fVxuXHRcdGNvbnN0IG1QYXJhbWV0ZXJzID0gZ2V0UGFyYW1ldGVycyhtSW5QYXJhbWV0ZXJzKTtcblx0XHRjb25zdCBvTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpO1xuXHRcdGNvbnN0IHNQcm9ncmFtbWluZ01vZGVsID0gdGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKG9Db250ZXh0KTtcblxuXHRcdGlmIChzUHJvZ3JhbW1pbmdNb2RlbCAhPT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCAmJiBzUHJvZ3JhbW1pbmdNb2RlbCAhPT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIkNhbmNlbCBkb2N1bWVudCBvbmx5IGFsbG93ZWQgZm9yIGRyYWZ0IG9yIHN0aWNreSBzZXNzaW9uIHN1cHBvcnRlZCBzZXJ2aWNlc1wiKTtcblx0XHR9XG5cdFx0dGhpcy5idXN5TG9jayhhcHBDb21wb25lbnQpO1xuXHRcdHRyeSB7XG5cdFx0XHRsZXQgcmV0dXJuZWRWYWx1ZTogT0RhdGFWNENvbnRleHQgfCB1bmRlZmluZWQ7XG5cdFx0XHRsZXQgc2libGluZ0NvbnRleHRDYW5vbmljYWxQYXRoLCBkcmFmdEFkbWluRGF0YTtcblx0XHRcdGNvbnN0IHNpYmxpbmdDb250ZXh0ID0gb01vZGVsLmJpbmRDb250ZXh0KGAke29Db250ZXh0LmdldFBhdGgoKX0vU2libGluZ0VudGl0eWApLmdldEJvdW5kQ29udGV4dCgpO1xuXHRcdFx0aWYgKHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0ICYmICFpc09iamVjdE1vZGlmaWVkKSB7XG5cdFx0XHRcdGNvbnN0IGRyYWZ0RGF0YUNvbnRleHQgPSBvTW9kZWwuYmluZENvbnRleHQoYCR7b0NvbnRleHQuZ2V0UGF0aCgpfS9EcmFmdEFkbWluaXN0cmF0aXZlRGF0YWApLmdldEJvdW5kQ29udGV4dCgpO1xuXHRcdFx0XHRbc2libGluZ0NvbnRleHRDYW5vbmljYWxQYXRoLCBkcmFmdEFkbWluRGF0YV0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG5cdFx0XHRcdFx0aXNOZXdPYmplY3QgPyB1bmRlZmluZWQgOiBzaWJsaW5nQ29udGV4dC5yZXF1ZXN0Q2Fub25pY2FsUGF0aCgpLFxuXHRcdFx0XHRcdGRyYWZ0RGF0YUNvbnRleHQucmVxdWVzdE9iamVjdCgpXG5cdFx0XHRcdF0pO1xuXHRcdFx0XHRpZiAoZHJhZnRBZG1pbkRhdGEpIHtcblx0XHRcdFx0XHRpc09iamVjdE1vZGlmaWVkID0gZHJhZnRBZG1pbkRhdGEuQ3JlYXRpb25EYXRlVGltZSAhPT0gZHJhZnRBZG1pbkRhdGEuTGFzdENoYW5nZURhdGVUaW1lO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRpZiAoIW1QYXJhbWV0ZXJzLnNraXBEaXNjYXJkUG9wb3Zlcikge1xuXHRcdFx0XHRhd2FpdCB0aGlzLl9jb25maXJtRGlzY2FyZChtUGFyYW1ldGVycy5jYW5jZWxCdXR0b24sIGlzT2JqZWN0TW9kaWZpZWQsIHJlc291cmNlTW9kZWwpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKG9Db250ZXh0LmlzS2VlcEFsaXZlKCkpIHtcblx0XHRcdFx0Ly8gaWYgdGhlIGNvbnRleHQgaXMga2VwdCBhbGl2ZSB3ZSBzZXQgaXQgYWdhaW4gdG8gZGV0YWNoIHRoZSBvbkJlZm9yZURlc3Ryb3kgY2FsbGJhY2sgYW5kIGhhbmRsZSBuYXZpZ2F0aW9uIGhlcmVcblx0XHRcdFx0Ly8gdGhlIGNvbnRleHQgbmVlZHMgdG8gc3RpbGwgYmUga2VwdCBhbGl2ZSB0byBiZSBhYmxlIHRvIHJlc2V0IGNoYW5nZXMgcHJvcGVybHlcblx0XHRcdFx0b0NvbnRleHQuc2V0S2VlcEFsaXZlKHRydWUsIHVuZGVmaW5lZCk7XG5cdFx0XHR9XG5cdFx0XHRpZiAobVBhcmFtZXRlcnMuYmVmb3JlQ2FuY2VsQ2FsbEJhY2spIHtcblx0XHRcdFx0YXdhaXQgbVBhcmFtZXRlcnMuYmVmb3JlQ2FuY2VsQ2FsbEJhY2soeyBjb250ZXh0OiBvQ29udGV4dCB9KTtcblx0XHRcdH1cblx0XHRcdGlmIChzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCkge1xuXHRcdFx0XHRpZiAoaXNOZXdPYmplY3QpIHtcblx0XHRcdFx0XHRpZiAob0NvbnRleHQuaGFzUGVuZGluZ0NoYW5nZXMoKSkge1xuXHRcdFx0XHRcdFx0b0NvbnRleHQuZ2V0QmluZGluZygpLnJlc2V0Q2hhbmdlcygpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRhd2FpdCBkcmFmdC5kZWxldGVEcmFmdChvQ29udGV4dCwgbWVzc2FnZUhhbmRsZXIsIGFwcENvbXBvbmVudCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdGlmIChvQ29udGV4dC5oYXNQZW5kaW5nQ2hhbmdlcygpKSB7XG5cdFx0XHRcdFx0XHRcdG9Db250ZXh0LmdldEJpbmRpbmcoKS5yZXNldENoYW5nZXMoKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHJldHVybmVkVmFsdWUgPSBvTW9kZWxcblx0XHRcdFx0XHRcdFx0LmJpbmRDb250ZXh0KFxuXHRcdFx0XHRcdFx0XHRcdHNpYmxpbmdDb250ZXh0Q2Fub25pY2FsUGF0aCA/IHNpYmxpbmdDb250ZXh0Q2Fub25pY2FsUGF0aCA6IGF3YWl0IHNpYmxpbmdDb250ZXh0LnJlcXVlc3RDYW5vbmljYWxQYXRoKClcblx0XHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0XHQuZ2V0Qm91bmRDb250ZXh0KCk7XG5cdFx0XHRcdFx0fSBmaW5hbGx5IHtcblx0XHRcdFx0XHRcdGF3YWl0IGRyYWZ0LmRlbGV0ZURyYWZ0KG9Db250ZXh0LCBtZXNzYWdlSGFuZGxlciwgYXBwQ29tcG9uZW50KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IGRpc2NhcmRlZENvbnRleHQgPSBhd2FpdCBzdGlja3kuZGlzY2FyZERvY3VtZW50KG9Db250ZXh0KTtcblx0XHRcdFx0aWYgKGRpc2NhcmRlZENvbnRleHQpIHtcblx0XHRcdFx0XHRpZiAoZGlzY2FyZGVkQ29udGV4dC5oYXNQZW5kaW5nQ2hhbmdlcygpKSB7XG5cdFx0XHRcdFx0XHRkaXNjYXJkZWRDb250ZXh0LmdldEJpbmRpbmcoKS5yZXNldENoYW5nZXMoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKCFpc05ld09iamVjdCkge1xuXHRcdFx0XHRcdFx0ZGlzY2FyZGVkQ29udGV4dC5yZWZyZXNoKCk7XG5cdFx0XHRcdFx0XHRyZXR1cm5lZFZhbHVlID0gZGlzY2FyZGVkQ29udGV4dDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gcmVtb3ZlIGV4aXN0aW5nIGJvdW5kIHRyYW5zaXRpb24gbWVzc2FnZXNcblx0XHRcdG1lc3NhZ2VIYW5kbGVyLnJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcygpO1xuXHRcdFx0Ly8gc2hvdyB1bmJvdW5kIG1lc3NhZ2VzXG5cdFx0XHRhd2FpdCBtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZXMoKTtcblx0XHRcdHJldHVybiByZXR1cm5lZFZhbHVlO1xuXHRcdH0gY2F0Y2ggKGVycjogdW5rbm93bikge1xuXHRcdFx0YXdhaXQgbWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VzKCk7XG5cdFx0XHR0aHJvdyBlcnI7XG5cdFx0fSBmaW5hbGx5IHtcblx0XHRcdHRoaXMuYnVzeVVubG9jayhhcHBDb21wb25lbnQpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBTYXZlcyB0aGUgZG9jdW1lbnQuXG5cdCAqIEBwYXJhbSBjb250ZXh0IENvbnRleHQgb2YgdGhlIGRvY3VtZW50IHRvIGJlIHNhdmVkXG5cdCAqIEBwYXJhbSBhcHBDb21wb25lbnQgVGhlIGFwcENvbXBvbmVudFxuXHQgKiBAcGFyYW0gcmVzb3VyY2VNb2RlbCBUaGUgbW9kZWwgdG8gbG9hZCB0ZXh0IHJlc291cmNlc1xuXHQgKiBAcGFyYW0gZXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvciBUcnVlIGlmIHdlIHNob3VsZCBleGVjdXRlIHNpZGUgZWZmZWN0cyBpbiBjYXNlIG9mIGFuIGVycm9yXG5cdCAqIEBwYXJhbSBiaW5kaW5nc0ZvclNpZGVFZmZlY3RzIFRoZSBsaXN0QmluZGluZ3MgdG8gYmUgdXNlZCBmb3IgZXhlY3V0aW5nIHNpZGUgZWZmZWN0cyBvbiBlcnJvclxuXHQgKiBAcGFyYW0gbWVzc2FnZUhhbmRsZXIgVGhlIG1lc3NhZ2UgaGFuZGxlciBleHRlbnNpb25cblx0ICogQHBhcmFtIGlzTmV3T2JqZWN0IFRydWUgaWYgd2UncmUgdHJ5aW5nIHRvIGNhbmNlbCBhIG5ld2x5IGNyZWF0ZWQgb2JqZWN0XG5cdCAqIEBwYXJhbSBza2lwQ29uZmlybWF0aW9uTXNnXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgd2l0aCA/Pz9cblx0ICogQGZpbmFsXG5cdCAqL1xuXHRhc3luYyBzYXZlRG9jdW1lbnQoXG5cdFx0Y29udGV4dDogT0RhdGFWNENvbnRleHQsXG5cdFx0YXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsXG5cdFx0cmVzb3VyY2VNb2RlbDogUmVzb3VyY2VNb2RlbCxcblx0XHRleGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yOiBib29sZWFuLFxuXHRcdGJpbmRpbmdzRm9yU2lkZUVmZmVjdHM6IE9EYXRhTGlzdEJpbmRpbmdbXSxcblx0XHRtZXNzYWdlSGFuZGxlcjogTWVzc2FnZUhhbmRsZXIsXG5cdFx0aXNOZXdPYmplY3Q6IGJvb2xlYW4sXG5cdFx0c2tpcENvbmZpcm1hdGlvbk1zZyA9IGZhbHNlXG5cdCk6IFByb21pc2U8T0RhdGFWNENvbnRleHQ+IHtcblx0XHRjb25zdCBzUHJvZ3JhbW1pbmdNb2RlbCA9IHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChjb250ZXh0KTtcblx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgIT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5ICYmIHNQcm9ncmFtbWluZ01vZGVsICE9PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0KSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJTYXZlIGlzIG9ubHkgYWxsb3dlZCBmb3IgZHJhZnQgb3Igc3RpY2t5IHNlc3Npb24gc3VwcG9ydGVkIHNlcnZpY2VzXCIpO1xuXHRcdH1cblxuXHRcdHRyeSB7XG5cdFx0XHR0aGlzLmJ1c3lMb2NrKGFwcENvbXBvbmVudCk7XG5cdFx0XHRjb25zdCBlbnRpdHlTZXROYW1lID0gdGhpcy5nZXRDb2xsZWN0aW9uTmFtZUZyb21Db250ZXh0KGNvbnRleHQpO1xuXHRcdFx0Y29uc3Qgb0FjdGl2ZURvY3VtZW50ID1cblx0XHRcdFx0c1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnRcblx0XHRcdFx0XHQ/IGF3YWl0IGRyYWZ0LmFjdGl2YXRlRG9jdW1lbnQoY29udGV4dCwgYXBwQ29tcG9uZW50LCB7fSwgbWVzc2FnZUhhbmRsZXIpXG5cdFx0XHRcdFx0OiBhd2FpdCBzdGlja3kuYWN0aXZhdGVEb2N1bWVudChjb250ZXh0LCBhcHBDb21wb25lbnQsIG1lc3NhZ2VIYW5kbGVyKTtcblxuXHRcdFx0Y29uc3QgbWVzc2FnZXNSZWNlaXZlZCA9IG1lc3NhZ2VIYW5kbGluZy5nZXRNZXNzYWdlcygpLmNvbmNhdChtZXNzYWdlSGFuZGxpbmcuZ2V0TWVzc2FnZXModHJ1ZSwgdHJ1ZSkpOyAvLyBnZXQgdW5ib3VuZCBhbmQgYm91bmQgbWVzc2FnZXMgcHJlc2VudCBpbiB0aGUgbW9kZWxcblx0XHRcdGlmICghc2tpcENvbmZpcm1hdGlvbk1zZyAmJiAhKG1lc3NhZ2VzUmVjZWl2ZWQubGVuZ3RoID09PSAxICYmIG1lc3NhZ2VzUmVjZWl2ZWRbMF0uZ2V0VHlwZSgpID09PSBNZXNzYWdlVHlwZS5TdWNjZXNzKSkge1xuXHRcdFx0XHQvLyBzaG93IG91ciBvYmplY3QgY3JlYXRpb24gdG9hc3Qgb25seSBpZiBpdCBpcyBub3QgY29taW5nIGZyb20gYmFja2VuZFxuXHRcdFx0XHRNZXNzYWdlVG9hc3Quc2hvdyhcblx0XHRcdFx0XHRpc05ld09iamVjdFxuXHRcdFx0XHRcdFx0PyByZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9PQkpFQ1RfQ1JFQVRFRFwiLCB1bmRlZmluZWQsIGVudGl0eVNldE5hbWUpXG5cdFx0XHRcdFx0XHQ6IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX09CSkVDVF9TQVZFRFwiLCB1bmRlZmluZWQsIGVudGl0eVNldE5hbWUpXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBvQWN0aXZlRG9jdW1lbnQ7XG5cdFx0fSBjYXRjaCAoZXJyOiB1bmtub3duKSB7XG5cdFx0XHRpZiAoZXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvciAmJiBiaW5kaW5nc0ZvclNpZGVFZmZlY3RzPy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdC8qIFRoZSBzaWRlRWZmZWN0cyBhcmUgZXhlY3V0ZWQgb25seSBmb3IgdGFibGUgaXRlbXMgaW4gdHJhbnNpZW50IHN0YXRlICovXG5cdFx0XHRcdGJpbmRpbmdzRm9yU2lkZUVmZmVjdHMuZm9yRWFjaCgobGlzdEJpbmRpbmcpID0+IHtcblx0XHRcdFx0XHRpZiAoIUNvbW1vblV0aWxzLmhhc1RyYW5zaWVudENvbnRleHQobGlzdEJpbmRpbmcpKSB7XG5cdFx0XHRcdFx0XHRhcHBDb21wb25lbnQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKCkucmVxdWVzdFNpZGVFZmZlY3RzRm9yTmF2aWdhdGlvblByb3BlcnR5KGxpc3RCaW5kaW5nLmdldFBhdGgoKSwgY29udGV4dCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHRcdGF3YWl0IG1lc3NhZ2VIYW5kbGVyLnNob3dNZXNzYWdlcygpO1xuXHRcdFx0dGhyb3cgZXJyO1xuXHRcdH0gZmluYWxseSB7XG5cdFx0XHR0aGlzLmJ1c3lVbmxvY2soYXBwQ29tcG9uZW50KTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQ2FsbHMgYSBib3VuZCBvciB1bmJvdW5kIGFjdGlvbi5cblx0ICogQHBhcmFtIHNBY3Rpb25OYW1lIFRoZSBuYW1lIG9mIHRoZSBhY3Rpb24gdG8gYmUgY2FsbGVkXG5cdCAqIEBwYXJhbSBbbVBhcmFtZXRlcnNdIENvbnRhaW5zIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0ICogQHBhcmFtIFttUGFyYW1ldGVycy5wYXJhbWV0ZXJWYWx1ZXNdIEEgbWFwIG9mIGFjdGlvbiBwYXJhbWV0ZXIgbmFtZXMgYW5kIHByb3ZpZGVkIHZhbHVlc1xuXHQgKiBAcGFyYW0gW21QYXJhbWV0ZXJzLnNraXBQYXJhbWV0ZXJEaWFsb2ddIFNraXBzIHRoZSBwYXJhbWV0ZXIgZGlhbG9nIGlmIHZhbHVlcyBhcmUgcHJvdmlkZWQgZm9yIGFsbCBvZiB0aGVtXG5cdCAqIEBwYXJhbSBbbVBhcmFtZXRlcnMuY29udGV4dHNdIE1hbmRhdG9yeSBmb3IgYSBib3VuZCBhY3Rpb246IEVpdGhlciBvbmUgY29udGV4dCBvciBhbiBhcnJheSB3aXRoIGNvbnRleHRzIGZvciB3aGljaCB0aGUgYWN0aW9uIGlzIHRvIGJlIGNhbGxlZFxuXHQgKiBAcGFyYW0gW21QYXJhbWV0ZXJzLm1vZGVsXSBNYW5kYXRvcnkgZm9yIGFuIHVuYm91bmQgYWN0aW9uOiBBbiBpbnN0YW5jZSBvZiBhbiBPRGF0YSBWNCBtb2RlbFxuXHQgKiBAcGFyYW0gW21QYXJhbWV0ZXJzLmludm9jYXRpb25Hcm91cGluZ10gTW9kZSBob3cgYWN0aW9ucyBhcmUgdG8gYmUgY2FsbGVkOiAnQ2hhbmdlU2V0JyB0byBwdXQgYWxsIGFjdGlvbiBjYWxscyBpbnRvIG9uZSBjaGFuZ2VzZXQsICdJc29sYXRlZCcgdG8gcHV0IHRoZW0gaW50byBzZXBhcmF0ZSBjaGFuZ2VzZXRzXG5cdCAqIEBwYXJhbSBbbVBhcmFtZXRlcnMubGFiZWxdIEEgaHVtYW4tcmVhZGFibGUgbGFiZWwgZm9yIHRoZSBhY3Rpb25cblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLmJpbmRpbmdQYXJhbWV0ZXJzXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5zaG93QWN0aW9uUGFyYW1ldGVyRGlhbG9nXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5lbnRpdHlTZXROYW1lXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy52aWV3XG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5jb250cm9sSWRcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLmlzQ3JlYXRlQWN0aW9uXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5vcGVyYXRpb25BdmFpbGFibGVNYXBcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0XG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5ncm91cElkXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5kZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb25cblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLmlnbm9yZUVUYWcgSWYgc3BlY2lmaWVkLCB0aGUgYWN0aW9uIGlzIGNhbGxlZCB3aXRob3V0IEVUYWcgaGFuZGxpbmdcblx0ICogQHBhcmFtIGFwcENvbXBvbmVudCBUaGUgYXBwQ29tcG9uZW50XG5cdCAqIEBwYXJhbSBtZXNzYWdlSGFuZGxlciBUaGUgbWVzc2FnZSBoYW5kbGVyIGV4dGVuc2lvblxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIHdpdGggYW4gYXJyYXkgb2YgcmVzcG9uc2Ugb2JqZWN0cyAoVE9ETzogdG8gYmUgY2hhbmdlZClcblx0ICogQGZpbmFsXG5cdCAqL1xuXHRhc3luYyBjYWxsQWN0aW9uKFxuXHRcdHNBY3Rpb25OYW1lOiBzdHJpbmcsXG5cdFx0bVBhcmFtZXRlcnM6IHtcblx0XHRcdGJpbmRpbmdQYXJhbWV0ZXJzPzogQmluZENvbnRleHRQYXJhbWV0ZXJzO1xuXHRcdFx0cGFyYW1ldGVyVmFsdWVzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXTtcblx0XHRcdHNraXBQYXJhbWV0ZXJEaWFsb2c/OiBib29sZWFuO1xuXHRcdFx0c2hvd0FjdGlvblBhcmFtZXRlckRpYWxvZz86IGJvb2xlYW47XG5cdFx0XHRsYWJlbD86IHN0cmluZztcblx0XHRcdGludm9jYXRpb25Hcm91cGluZz86IHN0cmluZztcblx0XHRcdGVudGl0eVNldE5hbWU/OiBzdHJpbmc7XG5cdFx0XHRjb250ZXh0cz86IE9EYXRhVjRDb250ZXh0IHwgT0RhdGFWNENvbnRleHRbXSB8IG51bGw7XG5cdFx0XHRtb2RlbD86IE9EYXRhTW9kZWw7XG5cdFx0XHR2aWV3OiBWaWV3O1xuXHRcdFx0Y29udHJvbElkPzogc3RyaW5nO1xuXHRcdFx0aXNDcmVhdGVBY3Rpb24/OiBib29sZWFuO1xuXHRcdFx0b3BlcmF0aW9uQXZhaWxhYmxlTWFwPzogc3RyaW5nO1xuXHRcdFx0aW50ZXJuYWxNb2RlbENvbnRleHQ/OiBJbnRlcm5hbE1vZGVsQ29udGV4dCB8IG51bGw7XG5cdFx0XHRncm91cElkPzogc3RyaW5nO1xuXHRcdFx0ZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uPzogc3RyaW5nO1xuXHRcdFx0aWdub3JlRVRhZz86IGJvb2xlYW47XG5cdFx0fSxcblx0XHRhcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCxcblx0XHRtZXNzYWdlSGFuZGxlcjogTWVzc2FnZUhhbmRsZXJcblx0KTogUHJvbWlzZTxQcm9taXNlU2V0dGxlZFJlc3VsdDxPcGVyYXRpb25SZXN1bHQ+W10+IHtcblx0XHRtUGFyYW1ldGVycyA9IGdldFBhcmFtZXRlcnMobVBhcmFtZXRlcnMpO1xuXHRcdGxldCBjb250ZXh0VG9Qcm9jZXNzO1xuXHRcdGxldCBvTW9kZWw6IE9EYXRhTW9kZWwgfCB1bmRlZmluZWQ7XG5cdFx0aWYgKCFzQWN0aW9uTmFtZSkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiUHJvdmlkZSBuYW1lIG9mIGFjdGlvbiB0byBiZSBleGVjdXRlZFwiKTtcblx0XHR9XG5cdFx0Ly8gYWN0aW9uIGltcG9ydHMgYXJlIG5vdCBkaXJlY3RseSBvYnRhaW5lZCBmcm9tIHRoZSBtZXRhTW9kZWwgYnkgaXQgaXMgcHJlc2VudCBpbnNpZGUgdGhlIGVudGl0eUNvbnRhaW5lclxuXHRcdC8vIGFuZCB0aGUgYWNpb25zIGl0IHJlZmVycyB0byBwcmVzZW50IG91dHNpZGUgdGhlIGVudGl0eWNvbnRhaW5lciwgaGVuY2UgdG8gb2J0YWluIGtpbmQgb2YgdGhlIGFjdGlvblxuXHRcdC8vIHNwbGl0KCkgb24gaXRzIG5hbWUgd2FzIHJlcXVpcmVkXG5cdFx0Y29uc3Qgc05hbWUgPSBzQWN0aW9uTmFtZS5zcGxpdChcIi9cIilbMV07XG5cblx0XHRjb250ZXh0VG9Qcm9jZXNzID0gc05hbWUgPyB1bmRlZmluZWQgOiBtUGFyYW1ldGVycy5jb250ZXh0cztcblx0XHQvL2NoZWNraW5nIHdoZXRoZXIgdGhlIGNvbnRleHQgaXMgYW4gYXJyYXkgd2l0aCBtb3JlIHRoYW4gMCBsZW5ndGggb3Igbm90IGFuIGFycmF5KGNyZWF0ZSBhY3Rpb24pXG5cdFx0aWYgKGNvbnRleHRUb1Byb2Nlc3MgJiYgKChBcnJheS5pc0FycmF5KGNvbnRleHRUb1Byb2Nlc3MpICYmIGNvbnRleHRUb1Byb2Nlc3MubGVuZ3RoKSB8fCAhQXJyYXkuaXNBcnJheShjb250ZXh0VG9Qcm9jZXNzKSkpIHtcblx0XHRcdGNvbnRleHRUb1Byb2Nlc3MgPSBBcnJheS5pc0FycmF5KGNvbnRleHRUb1Byb2Nlc3MpID8gY29udGV4dFRvUHJvY2Vzc1swXSA6IGNvbnRleHRUb1Byb2Nlc3M7XG5cdFx0XHRvTW9kZWwgPSBjb250ZXh0VG9Qcm9jZXNzLmdldE1vZGVsKCk7XG5cdFx0fVxuXHRcdGlmIChtUGFyYW1ldGVycy5tb2RlbCkge1xuXHRcdFx0b01vZGVsID0gbVBhcmFtZXRlcnMubW9kZWw7XG5cdFx0fVxuXHRcdGlmICghb01vZGVsKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJQYXNzIGEgY29udGV4dCBmb3IgYSBib3VuZCBhY3Rpb24gb3IgcGFzcyB0aGUgbW9kZWwgZm9yIGFuIHVuYm91bmQgYWN0aW9uXCIpO1xuXHRcdH1cblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgY29udHJvbCA9IChtUGFyYW1ldGVycy5jb250cm9sSWQgPyBtUGFyYW1ldGVycy52aWV3LmJ5SWQobVBhcmFtZXRlcnMuY29udHJvbElkKSA6IG1QYXJhbWV0ZXJzLnZpZXcpIGFzXG5cdFx0XHRcdHwgQ29udHJvbFxuXHRcdFx0XHR8IHVuZGVmaW5lZDtcblx0XHRcdGxldCBvUmVzdWx0OiBQcm9taXNlU2V0dGxlZFJlc3VsdDxPcGVyYXRpb25SZXN1bHQ+W107XG5cdFx0XHRpZiAoY29udGV4dFRvUHJvY2VzcyAmJiBtUGFyYW1ldGVycy5jb250ZXh0cykge1xuXHRcdFx0XHRjb25zdCBjb250ZXh0cyA9IEFycmF5LmlzQXJyYXkobVBhcmFtZXRlcnMuY29udGV4dHMpID8gbVBhcmFtZXRlcnMuY29udGV4dHMgOiBbbVBhcmFtZXRlcnMuY29udGV4dHNdOyAvLyBFbnN1cmUgdGhhdCBjb250ZXh0cyBpcyBhbiBhcnJheSAoZm9yIHN0YXRpYyBhY3Rpb25zIGl0J3Mgbm90IGFuIHdlIG5lZWQgdG8gZml4IGl0KVxuXG5cdFx0XHRcdGNvbnN0IG1ldGFNb2RlbCA9IG9Nb2RlbC5nZXRNZXRhTW9kZWwoKSxcblx0XHRcdFx0XHRhY3Rpb25QYXRoID0gYCR7bWV0YU1vZGVsLmdldE1ldGFQYXRoKGNvbnRleHRzWzBdLmdldFBhdGgoKSl9LyR7c0FjdGlvbk5hbWV9YCxcblx0XHRcdFx0XHRib3VuZEFjdGlvbiA9IG1ldGFNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChgJHthY3Rpb25QYXRofS9AJHVpNS5vdmVybG9hZC8wYCkhO1xuXG5cdFx0XHRcdGNvbnN0IGNvbnZlcnRlZFR5cGVzID0gY29udmVydFR5cGVzKG9Nb2RlbC5nZXRNZXRhTW9kZWwoKSk7XG5cdFx0XHRcdGNvbnN0IGNvbnZlcnRlZEFjdGlvbiA9IGNvbnZlcnRlZFR5cGVzLnJlc29sdmVQYXRoPEVkbUFjdGlvbiB8IHVuZGVmaW5lZD4oYm91bmRBY3Rpb24uZ2V0UGF0aCgpKS50YXJnZXQ7XG5cdFx0XHRcdGlmICghY29udmVydGVkQWN0aW9uKSB7XG5cdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biBib3VuZCBhY3Rpb25cIik7XG5cdFx0XHRcdH1cblx0XHRcdFx0b1Jlc3VsdCA9IGF3YWl0IG5ldyBPcGVyYXRpb24oYXBwQ29tcG9uZW50LCBvTW9kZWwsIGNvbnZlcnRlZEFjdGlvbiwge1xuXHRcdFx0XHRcdHBhcmFtZXRlclZhbHVlczogbVBhcmFtZXRlcnMucGFyYW1ldGVyVmFsdWVzIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IGJvb2xlYW4gfCBudW1iZXIgfCBNdWx0aVZhbHVlRmllbGRJdGVtW10+W10sXG5cdFx0XHRcdFx0Y29udGV4dHMsXG5cdFx0XHRcdFx0aW52b2NhdGlvbkdyb3VwaW5nOiBtUGFyYW1ldGVycy5pbnZvY2F0aW9uR3JvdXBpbmcsXG5cdFx0XHRcdFx0bGFiZWw6IG1QYXJhbWV0ZXJzLmxhYmVsLFxuXHRcdFx0XHRcdHNraXBQYXJhbWV0ZXJEaWFsb2c6IG1QYXJhbWV0ZXJzLnNraXBQYXJhbWV0ZXJEaWFsb2csXG5cdFx0XHRcdFx0YmluZGluZ1BhcmFtZXRlcnM6IG1QYXJhbWV0ZXJzLmJpbmRpbmdQYXJhbWV0ZXJzLFxuXHRcdFx0XHRcdGVudGl0eVNldE5hbWU6IG1QYXJhbWV0ZXJzLmVudGl0eVNldE5hbWUsXG5cdFx0XHRcdFx0b0RhdGFQcm9wZXJ0aWVzOiB7XG5cdFx0XHRcdFx0XHRnaG9zdENvbnRleHRCaW5kaW5nUHJvdGVjdGlvbjogdHJ1ZSxcblx0XHRcdFx0XHRcdGVuaGFuY2Ukc2VsZWN0OiB0cnVlLFxuXHRcdFx0XHRcdFx0Z3JvdXBJZDogbVBhcmFtZXRlcnMuZ3JvdXBJZCxcblx0XHRcdFx0XHRcdGlnbm9yZUVUYWc6IG1QYXJhbWV0ZXJzLmlnbm9yZUVUYWdcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdG9EYXRhRXZlbnRzOiB7XG5cdFx0XHRcdFx0XHRvbk9EYXRhU3VibWl0OiAoKTogdm9pZCA9PiB7XG5cdFx0XHRcdFx0XHRcdG1lc3NhZ2VIYW5kbGVyPy5yZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblx0XHRcdFx0XHRcdFx0dGhpcy5idXN5TG9jayhhcHBDb21wb25lbnQpO1xuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdG9uT0RhdGFSZXNwb25zZTogKCk6IHZvaWQgPT4ge1xuXHRcdFx0XHRcdFx0XHR0aGlzLmJ1c3lVbmxvY2soYXBwQ29tcG9uZW50KTtcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRvblJlcXVlc3RTaWRlRWZmZWN0czogKCk6IHZvaWQgPT4ge1xuXHRcdFx0XHRcdFx0XHR0aGlzLmhhbmRsZUFjdGlvbkVuYWJsZW1lbnRPbk9wZXJhdGlvbih7XG5cdFx0XHRcdFx0XHRcdFx0aW50ZXJuYWxNb2RlbENvbnRleHQ6IG1QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0LFxuXHRcdFx0XHRcdFx0XHRcdG9wZXJhdGlvbkF2YWlsYWJsZU1hcDogbVBhcmFtZXRlcnMub3BlcmF0aW9uQXZhaWxhYmxlTWFwLFxuXHRcdFx0XHRcdFx0XHRcdGNvbnRyb2w6IGNvbnRyb2wsXG5cdFx0XHRcdFx0XHRcdFx0Y29udGV4dHMsXG5cdFx0XHRcdFx0XHRcdFx0Y29udmVydGVkQWN0aW9uXG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0dmlldzogbVBhcmFtZXRlcnMudmlldyBhcyBGRVZpZXcsXG5cdFx0XHRcdFx0aXNDcmVhdGVBY3Rpb246IG1QYXJhbWV0ZXJzLmlzQ3JlYXRlQWN0aW9uLFxuXHRcdFx0XHRcdG1lc3NhZ2VIYW5kbGVyOiBtZXNzYWdlSGFuZGxlcixcblx0XHRcdFx0XHRkZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb246IG1QYXJhbWV0ZXJzLmRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvblxuXHRcdFx0XHR9KS5leGVjdXRlKCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRvUmVzdWx0ID0gYXdhaXQgb3BlcmF0aW9ucy5jYWxsQWN0aW9uSW1wb3J0KHNBY3Rpb25OYW1lLCBvTW9kZWwsIGFwcENvbXBvbmVudCwge1xuXHRcdFx0XHRcdHBhcmFtZXRlclZhbHVlczogbVBhcmFtZXRlcnMucGFyYW1ldGVyVmFsdWVzIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IGJvb2xlYW4gfCBudW1iZXIgfCBNdWx0aVZhbHVlRmllbGRJdGVtW10+W10sXG5cdFx0XHRcdFx0bGFiZWw6IG1QYXJhbWV0ZXJzLmxhYmVsLFxuXHRcdFx0XHRcdHNraXBQYXJhbWV0ZXJEaWFsb2c6IG1QYXJhbWV0ZXJzLnNraXBQYXJhbWV0ZXJEaWFsb2csXG5cdFx0XHRcdFx0YmluZGluZ1BhcmFtZXRlcnM6IG1QYXJhbWV0ZXJzLmJpbmRpbmdQYXJhbWV0ZXJzLFxuXHRcdFx0XHRcdGVudGl0eVNldE5hbWU6IG1QYXJhbWV0ZXJzLmVudGl0eVNldE5hbWUsXG5cdFx0XHRcdFx0b0RhdGFFdmVudHM6IHtcblx0XHRcdFx0XHRcdG9uT0RhdGFTdWJtaXQ6ICgpID0+IHtcblx0XHRcdFx0XHRcdFx0dGhpcy5idXN5TG9jayhhcHBDb21wb25lbnQpO1xuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdG9uT0RhdGFSZXNwb25zZTogKCkgPT4ge1xuXHRcdFx0XHRcdFx0XHR0aGlzLmJ1c3lVbmxvY2soYXBwQ29tcG9uZW50KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdG9EYXRhUHJvcGVydGllczoge1xuXHRcdFx0XHRcdFx0aWdub3JlRVRhZzogbVBhcmFtZXRlcnMuaWdub3JlRVRhZ1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0bWVzc2FnZUhhbmRsZXI6IG1lc3NhZ2VIYW5kbGVyLFxuXHRcdFx0XHRcdHZpZXc6IG1QYXJhbWV0ZXJzLnZpZXcgYXMgRkVWaWV3XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAobWVzc2FnZUhhbmRsZXIpIHtcblx0XHRcdFx0dGhpcy5faGFuZGxlQWN0aW9uUmVzcG9uc2UobVBhcmFtZXRlcnMsIHNBY3Rpb25OYW1lKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBvUmVzdWx0O1xuXHRcdH0gY2F0Y2ggKGVycjogdW5rbm93bikge1xuXHRcdFx0aWYgKG1lc3NhZ2VIYW5kbGVyKSB7XG5cdFx0XHRcdHRoaXMuX2hhbmRsZUFjdGlvblJlc3BvbnNlKG1QYXJhbWV0ZXJzLCBzQWN0aW9uTmFtZSk7XG5cdFx0XHR9XG5cdFx0XHR0aHJvdyBlcnI7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIGNvbGxlY3Rpb24gbmFtZSBmcm9tIHRoZSBjb250ZXh0LlxuXHQgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dFxuXHQgKiBAcmV0dXJucyBUaGUgY29sbGVjdGlvbiBuYW1lXG5cdCAqL1xuXHRnZXRDb2xsZWN0aW9uTmFtZUZyb21Db250ZXh0KGNvbnRleHQ6IE9EYXRhVjRDb250ZXh0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBtZXRhQ29udGV4dCA9IGNvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKS5nZXRNZXRhQ29udGV4dChjb250ZXh0LmdldFBhdGgoKSk7XG5cdFx0cmV0dXJuIChNZXRhTW9kZWxDb252ZXJ0ZXIuZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzKG1ldGFDb250ZXh0KS50YXJnZXRPYmplY3QgYXMgRW50aXR5U2V0IHwgTmF2aWdhdGlvblByb3BlcnR5IHwgdW5kZWZpbmVkKVxuXHRcdFx0Py5uYW1lO1xuXHR9XG5cblx0aGFuZGxlQWN0aW9uRW5hYmxlbWVudE9uT3BlcmF0aW9uKHBhcmFtZXRlcnM6IHtcblx0XHRpbnRlcm5hbE1vZGVsQ29udGV4dD86IEludGVybmFsTW9kZWxDb250ZXh0IHwgbnVsbDtcblx0XHRvcGVyYXRpb25BdmFpbGFibGVNYXA/OiBzdHJpbmc7XG5cdFx0Y29udHJvbD86IENvbnRyb2w7XG5cdFx0Y29udGV4dHM/OiBPRGF0YVY0Q29udGV4dFtdO1xuXHRcdGNvbnZlcnRlZEFjdGlvbjogRWRtQWN0aW9uO1xuXHR9KTogdm9pZCB7XG5cdFx0aWYgKHBhcmFtZXRlcnMuaW50ZXJuYWxNb2RlbENvbnRleHQgJiYgcGFyYW1ldGVycy5vcGVyYXRpb25BdmFpbGFibGVNYXApIHtcblx0XHRcdGxldCBzZWxlY3RlZENvbnRleHRzOiBPRGF0YVY0Q29udGV4dFtdID0gW107XG5cdFx0XHQvL2NoZWNrIGZvciBza2lwcGluZyBzdGF0aWMgYWN0aW9uc1xuXHRcdFx0aWYgKCFhY3Rpb25IZWxwZXIuaXNTdGF0aWNBY3Rpb24ocGFyYW1ldGVycy5jb252ZXJ0ZWRBY3Rpb24pKSB7XG5cdFx0XHRcdHNlbGVjdGVkQ29udGV4dHMgPSBwYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0LmdldFByb3BlcnR5KFwic2VsZWN0ZWRDb250ZXh0c1wiKSB8fCBbXTtcblx0XHRcdFx0QWN0aW9uUnVudGltZS5zZXRBY3Rpb25FbmFibGVtZW50KFxuXHRcdFx0XHRcdHBhcmFtZXRlcnMuaW50ZXJuYWxNb2RlbENvbnRleHQsXG5cdFx0XHRcdFx0SlNPTi5wYXJzZShwYXJhbWV0ZXJzLm9wZXJhdGlvbkF2YWlsYWJsZU1hcCksXG5cdFx0XHRcdFx0c2VsZWN0ZWRDb250ZXh0cyxcblx0XHRcdFx0XHRcInRhYmxlXCJcblx0XHRcdFx0KTtcblx0XHRcdH0gZWxzZSBpZiAocGFyYW1ldGVycy5jb250cm9sKSB7XG5cdFx0XHRcdGlmIChwYXJhbWV0ZXJzLmNvbnRyb2wuaXNBPFRhYmxlPihcInNhcC51aS5tZGMuVGFibGVcIikpIHtcblx0XHRcdFx0XHRzZWxlY3RlZENvbnRleHRzID0gcGFyYW1ldGVycy5jb250cm9sLmdldFNlbGVjdGVkQ29udGV4dHMoKSBhcyBPRGF0YVY0Q29udGV4dFtdO1xuXHRcdFx0XHRcdEFjdGlvblJ1bnRpbWUuc2V0QWN0aW9uRW5hYmxlbWVudChcblx0XHRcdFx0XHRcdHBhcmFtZXRlcnMuaW50ZXJuYWxNb2RlbENvbnRleHQsXG5cdFx0XHRcdFx0XHRKU09OLnBhcnNlKHBhcmFtZXRlcnMub3BlcmF0aW9uQXZhaWxhYmxlTWFwKSxcblx0XHRcdFx0XHRcdHNlbGVjdGVkQ29udGV4dHMsXG5cdFx0XHRcdFx0XHRcInRhYmxlXCJcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHQvL3VwZGF0ZSBkZWxldGUgYnV0dG9uXG5cdFx0XHRkZWxldGVIZWxwZXIudXBkYXRlRGVsZXRlSW5mb0ZvclNlbGVjdGVkQ29udGV4dHMocGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dCwgc2VsZWN0ZWRDb250ZXh0cyk7XG5cdFx0fVxuXHR9XG5cblx0X2hhbmRsZUFjdGlvblJlc3BvbnNlKFxuXHRcdG1QYXJhbWV0ZXJzOiB7XG5cdFx0XHRsYWJlbD86IHN0cmluZztcblx0XHRcdGludGVybmFsTW9kZWxDb250ZXh0PzogSW50ZXJuYWxNb2RlbENvbnRleHQgfCBudWxsO1xuXHRcdH0sXG5cdFx0c0FjdGlvbk5hbWU6IHN0cmluZ1xuXHQpOiB2b2lkIHtcblx0XHRjb25zdCBhVHJhbnNpZW50TWVzc2FnZXMgPSBtZXNzYWdlSGFuZGxpbmcuZ2V0TWVzc2FnZXModHJ1ZSwgdHJ1ZSk7XG5cdFx0aWYgKGFUcmFuc2llbnRNZXNzYWdlcy5sZW5ndGggPiAwICYmIG1QYXJhbWV0ZXJzICYmIG1QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0KSB7XG5cdFx0XHRtUGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcInNBY3Rpb25OYW1lXCIsIG1QYXJhbWV0ZXJzLmxhYmVsID8gbVBhcmFtZXRlcnMubGFiZWwgOiBzQWN0aW9uTmFtZSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEhhbmRsZXMgdmFsaWRhdGlvbiBlcnJvcnMgZm9yIHRoZSAnRGlzY2FyZCcgYWN0aW9uLlxuXHQgKiBAZmluYWxcblx0ICovXG5cdGhhbmRsZVZhbGlkYXRpb25FcnJvcigpOiB2b2lkIHtcblx0XHRjb25zdCBlcnJvclRvUmVtb3ZlID0gTWVzc2FnaW5nLmdldE1lc3NhZ2VNb2RlbCgpXG5cdFx0XHQuZ2V0RGF0YSgpXG5cdFx0XHQuZmlsdGVyKChlcnJvcjogTWVzc2FnZSkgPT4gZXJyb3IudmFsaWRhdGlvbik7IC8vIG9ubHkgbmVlZHMgdG8gaGFuZGxlIHZhbGlkYXRpb24gbWVzc2FnZXMsIHRlY2huaWNhbCBhbmQgcGVyc2lzdGVudCBlcnJvcnMgbmVlZHMgbm90IHRvIGJlIGNoZWNrZWQgaGVyZS5cblx0XHRNZXNzYWdpbmcucmVtb3ZlTWVzc2FnZXMoZXJyb3JUb1JlbW92ZSk7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIG5ldyBQb3BvdmVyLiBGYWN0b3J5IG1ldGhvZCB0byBtYWtlIHVuaXQgdGVzdHMgZWFzaWVyLlxuXHQgKiBAcGFyYW0gc2V0dGluZ3MgSW5pdGlhbCBwYXJhbWV0ZXJzIGZvciB0aGUgcG9wb3ZlclxuXHQgKiBAcmV0dXJucyBBIG5ldyBQb3BvdmVyXG5cdCAqL1xuXHRfY3JlYXRlUG9wb3ZlcihzZXR0aW5ncz86ICRQb3BvdmVyU2V0dGluZ3MpOiBQb3BvdmVyIHtcblx0XHRyZXR1cm4gbmV3IFBvcG92ZXIoc2V0dGluZ3MpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNob3dzIGEgcG9wb3ZlciB0byBjb25maXJtIGRpc2NhcmQgaWYgbmVlZGVkLlxuXHQgKiBAcGFyYW0gY2FuY2VsQnV0dG9uIFRoZSBjb250cm9sIHdoaWNoIHdpbGwgb3BlbiB0aGUgcG9wb3ZlclxuXHQgKiBAcGFyYW0gaXNNb2RpZmllZCBUcnVlIGlmIHRoZSBvYmplY3QgaGFzIGJlZW4gbW9kaWZpZWQgYW5kIGEgY29uZmlybWF0aW9uIHBvcG92ZXIgbXVzdCBiZSBzaG93blxuXHQgKiBAcGFyYW0gcmVzb3VyY2VNb2RlbCBUaGUgbW9kZWwgdG8gbG9hZCB0ZXh0IHJlc291cmNlc1xuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIGlmIHVzZXIgY29uZmlybXMgZGlzY2FyZCwgcmVqZWN0cyBpZiBvdGhlcndpc2UsIHJlamVjdHMgaWYgbm8gY29udHJvbCBwYXNzZWQgdG8gb3BlbiBwb3BvdmVyXG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0YXN5bmMgX2NvbmZpcm1EaXNjYXJkKGNhbmNlbEJ1dHRvbjogQnV0dG9uLCBpc01vZGlmaWVkOiBib29sZWFuLCByZXNvdXJjZU1vZGVsOiBSZXNvdXJjZU1vZGVsKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Ly8gSWYgdGhlIGRhdGEgaXNuJ3QgbW9kaWZpZWQsIGRvIG5vdCBzaG93IGFueSBjb25maXJtYXRpb24gcG9wb3ZlclxuXHRcdGlmICghaXNNb2RpZmllZCkge1xuXHRcdFx0dGhpcy5oYW5kbGVWYWxpZGF0aW9uRXJyb3IoKTtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0XHR9XG5cblx0XHRjYW5jZWxCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7XG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRcdGNvbnN0IGNvbmZpcm1hdGlvblBvcG92ZXIgPSB0aGlzLl9jcmVhdGVQb3BvdmVyKHtcblx0XHRcdFx0c2hvd0hlYWRlcjogZmFsc2UsXG5cdFx0XHRcdHBsYWNlbWVudDogXCJUb3BcIlxuXHRcdFx0fSk7XG5cdFx0XHRjb25maXJtYXRpb25Qb3BvdmVyLmFkZFN0eWxlQ2xhc3MoXCJzYXBVaUNvbnRlbnRQYWRkaW5nXCIpO1xuXG5cdFx0XHQvLyBDcmVhdGUgdGhlIGNvbnRlbnQgb2YgdGhlIHBvcG92ZXJcblx0XHRcdGNvbnN0IHRpdGxlID0gbmV3IFRleHQoe1xuXHRcdFx0XHR0ZXh0OiByZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9EUkFGVF9ESVNDQVJEX01FU1NBR0VcIilcblx0XHRcdH0pO1xuXHRcdFx0Y29uc3QgY29uZmlybUJ1dHRvbiA9IG5ldyBCdXR0b24oe1xuXHRcdFx0XHR0ZXh0OiByZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9EUkFGVF9ESVNDQVJEX0JVVFRPTlwiKSxcblx0XHRcdFx0d2lkdGg6IFwiMTAwJVwiLFxuXHRcdFx0XHRwcmVzczogKCk6IHZvaWQgPT4ge1xuXHRcdFx0XHRcdHRoaXMuaGFuZGxlVmFsaWRhdGlvbkVycm9yKCk7XG5cdFx0XHRcdFx0Y29uZmlybWF0aW9uUG9wb3Zlci5kYXRhKFwiY29udGludWVEaXNjYXJkXCIsIHRydWUpO1xuXHRcdFx0XHRcdGNvbmZpcm1hdGlvblBvcG92ZXIuY2xvc2UoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0XHRjb25maXJtYXRpb25Qb3BvdmVyLmFkZENvbnRlbnQobmV3IFZCb3goeyBpdGVtczogW3RpdGxlLCBjb25maXJtQnV0dG9uXSB9KSk7XG5cblx0XHRcdC8vIEF0dGFjaCBoYW5kbGVyXG5cdFx0XHRjb25maXJtYXRpb25Qb3BvdmVyLmF0dGFjaEJlZm9yZU9wZW4oKCkgPT4ge1xuXHRcdFx0XHRjb25maXJtYXRpb25Qb3BvdmVyLnNldEluaXRpYWxGb2N1cyhjb25maXJtQnV0dG9uKTtcblx0XHRcdH0pO1xuXHRcdFx0Y29uZmlybWF0aW9uUG9wb3Zlci5hdHRhY2hBZnRlckNsb3NlKCgpID0+IHtcblx0XHRcdFx0Y2FuY2VsQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7XG5cdFx0XHRcdGlmIChjb25maXJtYXRpb25Qb3BvdmVyLmRhdGEoXCJjb250aW51ZURpc2NhcmRcIikpIHtcblx0XHRcdFx0XHRyZXNvbHZlKCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cmVqZWN0KCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXG5cdFx0XHRjb25maXJtYXRpb25Qb3BvdmVyLm9wZW5CeShjYW5jZWxCdXR0b24sIGZhbHNlKTtcblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZWxvYWRzIGRhdGEgZm9yIGFuIE9EYXRhTGlzdEJpbmRpbmcuXG5cdCAqIEBwYXJhbSBsaXN0QmluZGluZyBUaGUgbGlzdGJpbmRpbmcgdG8gcmVmcmVzaFxuXHQgKiBAcGFyYW0gYXBwQ29tcG9uZW50XG5cdCAqIEByZXR1cm5zIFRoZSBjb3JyZXNwb25kaW5nIHByb21pc2Vcblx0ICovXG5cdGFzeW5jIHJlZnJlc2hMaXN0QmluZGluZyhsaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZywgYXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHR0cnkge1xuXHRcdFx0aWYgKGxpc3RCaW5kaW5nLmlzUm9vdCgpKSB7XG5cdFx0XHRcdGlmICh0aGlzLmlzTGlzdEJpbmRpbmdIaWVyYXJjaGljYWwobGlzdEJpbmRpbmcpKSB7XG5cdFx0XHRcdFx0Ly8gV2UgdXNlIGEgc2lkZS1lZmZlY3QgcmVmcmVzaCBmb3IgYSBUcmVlVGFibGUsIHRvIHByZXNlcnZlIGV4cGFuc2lvbiBzdGF0ZXNcblx0XHRcdFx0XHRhd2FpdCBhcHBDb21wb25lbnRcblx0XHRcdFx0XHRcdC5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKVxuXHRcdFx0XHRcdFx0LnJlcXVlc3RTaWRlRWZmZWN0cyhbeyAkTmF2aWdhdGlvblByb3BlcnR5UGF0aDogXCJcIiB9XSwgbGlzdEJpbmRpbmcuZ2V0SGVhZGVyQ29udGV4dCgpISk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0YXdhaXQgbGlzdEJpbmRpbmcucmVxdWVzdFJlZnJlc2goKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0YXdhaXQgYXBwQ29tcG9uZW50XG5cdFx0XHRcdFx0LmdldFNpZGVFZmZlY3RzU2VydmljZSgpXG5cdFx0XHRcdFx0LnJlcXVlc3RTaWRlRWZmZWN0cyhbeyAkTmF2aWdhdGlvblByb3BlcnR5UGF0aDogbGlzdEJpbmRpbmcuZ2V0UGF0aCgpIH1dLCBsaXN0QmluZGluZy5nZXRDb250ZXh0KCkpO1xuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRMb2cuZXJyb3IoYEVycm9yIHdoaWxlIHJlZnJlc2hpbmcgbGlzdCBiaW5kaW5nICR7bGlzdEJpbmRpbmcuZ2V0UGF0aCgpfWAsIGVycm9yIGFzIHN0cmluZyk7XG5cdFx0fVxuXHR9XG5cblx0YXN5bmMgY3JlYXRlV2l0aERpYWxvZyhcblx0XHRsaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZyxcblx0XHRmaWVsZE5hbWVzOiBzdHJpbmdbXSxcblx0XHRwYXJhbWV0ZXJzOiB7XG5cdFx0XHRwYXJlbnRDb250cm9sPzogQ29udHJvbDtcblx0XHRcdGRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblx0XHRcdGJJc0NyZWF0ZURpYWxvZz86IGJvb2xlYW47XG5cdFx0XHRiZWZvcmVDcmVhdGVDYWxsQmFjaz86IEZ1bmN0aW9uO1xuXHRcdFx0YWZ0ZXJDcmVhdGVDYWxsQmFjaz86IChuZXdEb2N1bWVudENvbnRleHQ6IE9EYXRhVjRDb250ZXh0KSA9PiBQcm9taXNlPHZvaWQ+O1xuXHRcdFx0Y3JlYXRlQXRFbmQ/OiBib29sZWFuO1xuXHRcdFx0aW5hY3RpdmU/OiBib29sZWFuO1xuXHRcdFx0cGFyZW50Q29udGV4dD86IE9EYXRhVjRDb250ZXh0O1xuXHRcdFx0a2VlcFRyYW5zaWVudENvbnRleHRPbkZhaWxlZD86IGJvb2xlYW47XG5cdFx0XHRjcmVhdGVBY3Rpb24/OiBib29sZWFuO1xuXHRcdFx0Y3JlYXRpb25Nb2RlPzogc3RyaW5nO1xuXHRcdH0sXG5cdFx0YXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsXG5cdFx0cmVzb3VyY2VNb2RlbDogUmVzb3VyY2VNb2RlbCxcblx0XHRtZXNzYWdlSGFuZGxlcjogTWVzc2FnZUhhbmRsZXJcblx0KTogUHJvbWlzZTxPRGF0YVY0Q29udGV4dD4ge1xuXHRcdGNvbnN0IG1vZGVsID0gbGlzdEJpbmRpbmcuZ2V0TW9kZWwoKSBhcyBPRGF0YU1vZGVsO1xuXHRcdGNvbnN0IG1ldGFNb2RlbCA9IG1vZGVsLmdldE1ldGFNb2RlbCgpO1xuXHRcdGNvbnN0IGxpc3RNZXRhUGF0aCA9IG1ldGFNb2RlbC5nZXRNZXRhUGF0aChsaXN0QmluZGluZy5nZXRSZXNvbHZlZFBhdGgoKSEpO1xuXG5cdFx0Ly8gQ3JlYXRlIGEgZmFrZSAodHJhbnNpZW50KSBsaXN0QmluZGluZyBhbmQgY29udGV4dCwganVzdCBmb3IgdGhlIGJpbmRpbmcgY29udGV4dCBvZiB0aGUgZGlhbG9nXG5cdFx0Y29uc3QgdHJhbnNpZW50TGlzdEJpbmRpbmcgPSBtb2RlbC5iaW5kTGlzdChsaXN0QmluZGluZy5nZXRQYXRoKCksIGxpc3RCaW5kaW5nLmdldENvbnRleHQoKSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHtcblx0XHRcdCQkdXBkYXRlR3JvdXBJZDogXCJzdWJtaXRMYXRlclwiXG5cdFx0fSk7XG5cdFx0dHJhbnNpZW50TGlzdEJpbmRpbmcucmVmcmVzaEludGVybmFsID0gZnVuY3Rpb24gKCk6IHZvaWQge1xuXHRcdFx0LyogKi9cblx0XHR9O1xuXHRcdGNvbnN0IHRyYW5zaWVudENvbnRleHQgPSB0cmFuc2llbnRMaXN0QmluZGluZy5jcmVhdGUocGFyYW1ldGVycy5kYXRhLCB0cnVlKTtcblx0XHRjb25zdCBmaWVsZE1ldGFDb250ZXh0cyA9IGZpZWxkTmFtZXMubWFwKChuYW1lKSA9PiB7XG5cdFx0XHRyZXR1cm4gbWV0YU1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KGAke2xpc3RNZXRhUGF0aH0vJHtuYW1lfWApIGFzIENvbnRleHQ7XG5cdFx0fSk7XG5cblx0XHRjb25zdCBjcmVhdGVEaWFsb2cgPSBnZXRDb3JlVUlGYWN0b3J5KCkubmV3Q3JlYXRlRGlhbG9nKFxuXHRcdFx0dHJhbnNpZW50Q29udGV4dCxcblx0XHRcdGZpZWxkTmFtZXMsXG5cdFx0XHRhcHBDb21wb25lbnQsXG5cdFx0XHRwYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSA9PT0gQ3JlYXRpb25Nb2RlLkNyZWF0aW9uRGlhbG9nID8gXCJTdGFuZGFsb25lXCIgOiBcIldpdGhOYXZpZ2F0aW9uXCIsXG5cdFx0XHRwYXJhbWV0ZXJzLnBhcmVudENvbnRyb2xcblx0XHQpO1xuXG5cdFx0dHJ5IHtcblx0XHRcdGF3YWl0IENvbW1vblV0aWxzLnNldFVzZXJEZWZhdWx0cyhcblx0XHRcdFx0YXBwQ29tcG9uZW50LFxuXHRcdFx0XHRmaWVsZE1ldGFDb250ZXh0cyxcblx0XHRcdFx0dHJhbnNpZW50Q29udGV4dCxcblx0XHRcdFx0ZmFsc2UsXG5cdFx0XHRcdHBhcmFtZXRlcnMuY3JlYXRlQWN0aW9uLFxuXHRcdFx0XHRwYXJhbWV0ZXJzLmRhdGFcblx0XHRcdCk7XG5cdFx0XHRjcmVhdGVEaWFsb2cub3BlbkRpYWxvZygpO1xuXHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdGF3YWl0IG1lc3NhZ2VIYW5kbGVyLnNob3dNZXNzYWdlcygpO1xuXHRcdFx0dGhyb3cgZTtcblx0XHR9XG5cblx0XHRjb25zdCByZXN1bHRQcm9taXNlS2VlcGVyID0gbmV3IFByb21pc2VLZWVwZXI8T0RhdGFWNENvbnRleHQ+KCk7XG5cblx0XHRjb25zdCBvbkV4aXREaWFsb2cgPSBhc3luYyAoZXZlbnQ6IEV4aXREaWFsb2dFdmVudCk6IFByb21pc2U8dm9pZD4gPT4ge1xuXHRcdFx0aWYgKCFldmVudC5nZXRQYXJhbWV0ZXIoXCJhY2NlcHRcIikpIHtcblx0XHRcdFx0Ly8gVXNlciBoYXMgY2FuY2VsbGVkIGNyZWF0aW9uOiBkZXN0cm95IHRoZSB0cmFuc2llbnQgbGlzdCBiaW5kaW5nIGFuZCBjbG9zZSB0aGUgZGlhbG9nXG5cdFx0XHRcdHRyYW5zaWVudExpc3RCaW5kaW5nLmRlc3Ryb3koKTtcblx0XHRcdFx0Y3JlYXRlRGlhbG9nLmNsb3NlRGlhbG9nKCk7XG5cdFx0XHRcdHJlc3VsdFByb21pc2VLZWVwZXIucmVqZWN0KEZFTGlicmFyeS5Db25zdGFudHMuQ2FuY2VsQWN0aW9uRGlhbG9nKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRjcmVhdGVEaWFsb2cuc2V0QnVzeSh0cnVlKTtcblx0XHRcdHBhcmFtZXRlcnMuYklzQ3JlYXRlRGlhbG9nID0gdHJ1ZTtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGNvbnN0IHRyYW5zaWVudERhdGEgPSB0cmFuc2llbnRDb250ZXh0LmdldE9iamVjdCgpO1xuXHRcdFx0XHRsZXQgY3JlYXRlRGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblx0XHRcdFx0T2JqZWN0LmtleXModHJhbnNpZW50RGF0YSkuZm9yRWFjaCgocHJvcGVydHlQYXRoKSA9PiB7XG5cdFx0XHRcdFx0Y29uc3Qgb1Byb3BlcnR5ID0gbWV0YU1vZGVsLmdldE9iamVjdChgJHtsaXN0TWV0YVBhdGh9LyR7cHJvcGVydHlQYXRofWApO1xuXHRcdFx0XHRcdC8vIEVuc3VyZSBuYXZpZ2F0aW9uIHByb3BlcnRpZXMgYXJlIG5vdCBwYXJ0IG9mIHRoZSBwYXlsb2FkLCBhcyBkZWVwIGNyZWF0ZSBub3Qgc3VwcG9ydGVkXG5cdFx0XHRcdFx0Ly8gQW5kIHJlbW92ZSBhbnkgcHJvcGVydHkgc3RhcnRpbmcgYnkgQCR1aTUgYXMgdGhleSBhcmUgbm90IHByb3BlcnR5IGNyZWF0ZWQgYnkgZmlsbGluZyB0aGUgZm9ybVxuXHRcdFx0XHRcdGlmIChvUHJvcGVydHkgJiYgb1Byb3BlcnR5LiRraW5kICE9PSBcIk5hdmlnYXRpb25Qcm9wZXJ0eVwiICYmICFwcm9wZXJ0eVBhdGg/LnN0YXJ0c1dpdGgoXCJAJHVpNVwiKSkge1xuXHRcdFx0XHRcdFx0Y3JlYXRlRGF0YVtwcm9wZXJ0eVBhdGhdID0gdHJhbnNpZW50RGF0YVtwcm9wZXJ0eVBhdGhdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0aWYgKHBhcmFtZXRlcnMuYmVmb3JlQ3JlYXRlQ2FsbEJhY2spIHtcblx0XHRcdFx0XHQvL2JlZm9yZUNyZWF0ZUNhbGxCYWNrIGV4cGVjdHMgY3JlYXRlUGFyYW1ldGVycyBvZiB0eXBlIGFueVtdXG5cdFx0XHRcdFx0Y29uc3QgY3JlYXRlRGF0YUFzQXJyYXkgPSBPYmplY3QuZW50cmllcyhjcmVhdGVEYXRhKS5tYXAoKFtrZXksIHZhbHVlXSkgPT4gKHsgW2tleV06IHZhbHVlIH0pKTtcblx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0YXdhaXQgdG9FUzZQcm9taXNlKFxuXHRcdFx0XHRcdFx0XHRwYXJhbWV0ZXJzLmJlZm9yZUNyZWF0ZUNhbGxCYWNrKHtcblx0XHRcdFx0XHRcdFx0XHRjb250ZXh0UGF0aDogbGlzdEJpbmRpbmcuZ2V0UGF0aCgpLFxuXHRcdFx0XHRcdFx0XHRcdGNyZWF0ZVBhcmFtZXRlcnM6IGNyZWF0ZURhdGFBc0FycmF5XG5cdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBjcmVhdGluZyB0aGUgbmV3IGRvY3VtZW50XCIsIGVycm9yIGFzIHN0cmluZyk7XG5cdFx0XHRcdFx0XHR0aHJvdyBGRUxpYnJhcnkuQ29uc3RhbnRzLk9uQmVmb3JlQ3JlYXRlRmFpbGVkO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRjcmVhdGVEYXRhID0gY3JlYXRlRGF0YUFzQXJyYXkucmVkdWNlKChyZXN1bHQsIGN1cnJlbnRPYmplY3QpID0+IHtcblx0XHRcdFx0XHRcdHJldHVybiB7IC4uLnJlc3VsdCwgLi4uY3VycmVudE9iamVjdCB9O1xuXHRcdFx0XHRcdH0sIHt9KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoT2JqZWN0LmtleXMoY3JlYXRlRGF0YSkubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdGFwcENvbXBvbmVudC5nZXRNb2RlbChcInVpXCIpLnNldFByb3BlcnR5KFVpTW9kZWxDb25zdGFudHMuRG9jdW1lbnRNb2RpZmllZCwgdHJ1ZSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29uc3QgbmV3Q29udGV4dCA9IGF3YWl0IHRoaXMuY3JlYXRlQ29udGV4dChsaXN0QmluZGluZywgY3JlYXRlRGF0YSwge1xuXHRcdFx0XHRcdGNyZWF0ZUF0RW5kOiBwYXJhbWV0ZXJzLmNyZWF0ZUF0RW5kLFxuXHRcdFx0XHRcdGNyZWF0ZUluYWN0aXZlOiBwYXJhbWV0ZXJzLmluYWN0aXZlLFxuXHRcdFx0XHRcdHBhcmVudENvbnRleHQ6IHBhcmFtZXRlcnMucGFyZW50Q29udGV4dFxuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHRjb25zdCBjcmVhdGlvblN1Y2Nlc3MgPSBhd2FpdCB0aGlzLndhaXRGb3JDcmVhdGVDb21wbGV0aW9uKG5ld0NvbnRleHQsIHBhcmFtZXRlcnMua2VlcFRyYW5zaWVudENvbnRleHRPbkZhaWxlZCA9PT0gdHJ1ZSk7XG5cdFx0XHRcdGlmIChjcmVhdGlvblN1Y2Nlc3MpIHtcblx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0YXdhaXQgcGFyYW1ldGVycy5hZnRlckNyZWF0ZUNhbGxCYWNrPy4obmV3Q29udGV4dCk7XG5cdFx0XHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0XHRcdGNyZWF0ZURpYWxvZy5kaXNwbGF5RXJyb3JNZXNzYWdlcyhNZXNzYWdpbmcuZ2V0TWVzc2FnZU1vZGVsKCkuZ2V0RGF0YSgpKTtcblx0XHRcdFx0XHRcdGF3YWl0IG1lc3NhZ2VIYW5kbGVyLnNob3dNZXNzYWdlRGlhbG9nKHsgc2hvd0JvdW5kU3RhdGVNZXNzYWdlczogdHJ1ZSB9KTtcblxuXHRcdFx0XHRcdFx0Ly8gRGVsZXRlIHRoZSBjcmVhdGVkIGRvY3VtZW50IGFuZCByZWZyZXNoIGl0cyBsaXN0IGJpbmRpbmcgKG90aGVyd2lzZSB0aGUgY3JlYXRlZCBkb2N1bWVudCBpcyBzdGlsbCB2aXNpYmxlIGluIHRoZSBsaXN0KVxuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5kZWxldGVEb2N1bWVudChuZXdDb250ZXh0LCB7IHNpbGVudE1vZGU6IHRydWUgfSwgYXBwQ29tcG9uZW50LCByZXNvdXJjZU1vZGVsLCBtZXNzYWdlSGFuZGxlcik7XG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnJlZnJlc2hMaXN0QmluZGluZyhsaXN0QmluZGluZywgYXBwQ29tcG9uZW50KTtcblxuXHRcdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgY3JlYXRpbmcvc2F2aW5nIHRoZSBuZXcgZG9jdW1lbnRcIiwgZXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdFx0XHRcdHRocm93IEZFTGlicmFyeS5Db25zdGFudHMuQ3JlYXRpb25GYWlsZWQ7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0dHJhbnNpZW50TGlzdEJpbmRpbmcuZGVzdHJveSgpO1xuXHRcdFx0XHRcdGNyZWF0ZURpYWxvZy5jbG9zZURpYWxvZygpO1xuXHRcdFx0XHRcdHJlc3VsdFByb21pc2VLZWVwZXIucmVzb2x2ZShuZXdDb250ZXh0KTtcblx0XHRcdFx0fVxuXHRcdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdFx0Ly8gaW4gY2FzZSBvZiBjcmVhdGlvbiBmYWlsZWQsIGRpYWxvZyBzaG91bGQgc3RheSBvcGVuIC0gdG8gYWNoaWV2ZSB0aGUgc2FtZSwgbm90aGluZyBoYXMgdG8gYmUgZG9uZSAobGlrZSBpbiBjYXNlIG9mIHN1Y2Nlc3Mgd2l0aCBiS2VlcERpYWxvZ09wZW4pXG5cdFx0XHRcdGlmICghW0ZFTGlicmFyeS5Db25zdGFudHMuT25CZWZvcmVDcmVhdGVGYWlsZWQsIEZFTGlicmFyeS5Db25zdGFudHMuQ3JlYXRpb25GYWlsZWRdLmluY2x1ZGVzKGVycm9yKSkge1xuXHRcdFx0XHRcdC8vIG90aGVyIGVycm9ycyBhcmUgbm90IGV4cGVjdGVkXG5cdFx0XHRcdFx0dHJhbnNpZW50TGlzdEJpbmRpbmcuZGVzdHJveSgpO1xuXHRcdFx0XHRcdGNyZWF0ZURpYWxvZy5jbG9zZURpYWxvZygpO1xuXHRcdFx0XHRcdHJlc3VsdFByb21pc2VLZWVwZXIucmVqZWN0KGVycm9yIGFzIHN0cmluZyB8IEVycm9yKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBmaW5hbGx5IHtcblx0XHRcdFx0Y3JlYXRlRGlhbG9nLnNldEJ1c3koZmFsc2UpO1xuXHRcdFx0XHRtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZXMoeyBpc09wZXJhdGlvbkRpYWxvZ09wZW46IGNyZWF0ZURpYWxvZy5pc09wZW4oKSB9KTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0Y3JlYXRlRGlhbG9nLmF0dGFjaEV4aXREaWFsb2coe30sIG9uRXhpdERpYWxvZyk7XG5cblx0XHRyZXR1cm4gcmVzdWx0UHJvbWlzZUtlZXBlci5wcm9taXNlO1xuXHR9XG5cblx0LyoqXG5cdCAqIFdhaXRzIGZvciB0aGUgY3JlYXRpb24gb2YgYSBjb250ZXh0IHRvIGJlIGZpbmlzaGVkLlxuXHQgKiBAcGFyYW0gbmV3Q29udGV4dCBUaGUgY29udGV4dCBiZWluZyBjcmVhdGVkXG5cdCAqIEBwYXJhbSBrZWVwVHJhbnNpZW50Q29udGV4dE9uRmFpbGVkXG5cdCAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGNyZWF0aW9uIHdhcyBzdWNjZXNzZnVsXG5cdCAqL1xuXHRhc3luYyB3YWl0Rm9yQ3JlYXRlQ29tcGxldGlvbihuZXdDb250ZXh0OiBPRGF0YVY0Q29udGV4dCwga2VlcFRyYW5zaWVudENvbnRleHRPbkZhaWxlZDogYm9vbGVhbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRcdGNvbnN0IHByb21pc2VLZWVwZXIgPSBuZXcgUHJvbWlzZUtlZXBlcjxib29sZWFuPigpO1xuXHRcdGNvbnN0IHBhcmVudExpc3RCaW5kaW5nID0gbmV3Q29udGV4dC5nZXRCaW5kaW5nKCkgYXMgT0RhdGFMaXN0QmluZGluZztcblxuXHRcdGNvbnN0IG9uQ3JlYXRlQ29tcGxldGVkID0gKGV2ZW50OiBPRGF0YUxpc3RCaW5kaW5nJENyZWF0ZUNvbXBsZXRlZEV2ZW50KTogdm9pZCA9PiB7XG5cdFx0XHRjb25zdCBjcmVhdGVkQ29udGV4dCA9IGV2ZW50LmdldFBhcmFtZXRlcihcImNvbnRleHRcIik7XG5cdFx0XHRjb25zdCBzdWNjZXNzID0gZXZlbnQuZ2V0UGFyYW1ldGVyKFwic3VjY2Vzc1wiKTtcblx0XHRcdGlmIChjcmVhdGVkQ29udGV4dCA9PT0gbmV3Q29udGV4dCkge1xuXHRcdFx0XHRwYXJlbnRMaXN0QmluZGluZy5kZXRhY2hDcmVhdGVDb21wbGV0ZWQob25DcmVhdGVDb21wbGV0ZWQpO1xuXHRcdFx0XHRwcm9taXNlS2VlcGVyLnJlc29sdmUoc3VjY2VzcyA9PT0gdHJ1ZSk7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdHBhcmVudExpc3RCaW5kaW5nLmF0dGFjaENyZWF0ZUNvbXBsZXRlZChvbkNyZWF0ZUNvbXBsZXRlZCk7XG5cblx0XHRjb25zdCBjcmVhdGlvblN1Y2Nlc3NmdWwgPSBhd2FpdCBwcm9taXNlS2VlcGVyLnByb21pc2U7XG5cdFx0aWYgKCFjcmVhdGlvblN1Y2Nlc3NmdWwpIHtcblx0XHRcdGlmICgha2VlcFRyYW5zaWVudENvbnRleHRPbkZhaWxlZCkge1xuXHRcdFx0XHQvLyBDYW5jZWwgdGhlIHBlbmRpbmcgUE9TVCBhbmQgZGVsZXRlIHRoZSBjb250ZXh0IGluIHRoZSBsaXN0QmluZGluZ1xuXHRcdFx0XHQobmV3Q29udGV4dC5jcmVhdGVkKCkgPz8gUHJvbWlzZS5yZXNvbHZlKCkpLmNhdGNoKGZ1bmN0aW9uIChjb250ZXh0RXJyb3I6IHVua25vd24pIHtcblx0XHRcdFx0XHRMb2cudHJhY2UoXCJ0cmFuc2llbnQgY3JlYXRpb24gY29udGV4dCBkZWxldGlvbiBlcnJvclwiLCBjb250ZXh0RXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHBhcmVudExpc3RCaW5kaW5nLnJlc2V0Q2hhbmdlcygpO1xuXHRcdFx0XHRwYXJlbnRMaXN0QmluZGluZy5nZXRNb2RlbCgpLnJlc2V0Q2hhbmdlcyhwYXJlbnRMaXN0QmluZGluZy5nZXRVcGRhdGVHcm91cElkKCkpO1xuXHRcdFx0XHR0aHJvdyBGRUxpYnJhcnkuQ29uc3RhbnRzLkNyZWF0aW9uRmFpbGVkO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRhd2FpdCBuZXdDb250ZXh0LmNyZWF0ZWQoKTtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBSZXRyaWV2ZXMgdGhlIG5hbWUgb2YgdGhlIE5ld0FjdGlvbiB0byBiZSBleGVjdXRlZC5cblx0ICogQHBhcmFtIG9TdGFydHVwUGFyYW1ldGVycyBTdGFydHVwIHBhcmFtZXRlcnMgb2YgdGhlIGFwcGxpY2F0aW9uXG5cdCAqIEBwYXJhbSBbb1N0YXJ0dXBQYXJhbWV0ZXJzLnByZWZlcnJlZE1vZGVdXG5cdCAqIEBwYXJhbSBzQ3JlYXRlSGFzaCBIYXNoIHRvIGJlIGNoZWNrZWQgZm9yIGFjdGlvbiB0eXBlXG5cdCAqIEBwYXJhbSBvTWV0YU1vZGVsIFRoZSBNZXRhTW9kZWwgdXNlZCB0byBjaGVjayBmb3IgTmV3QWN0aW9uIHBhcmFtZXRlclxuXHQgKiBAcGFyYW0gc01ldGFQYXRoIFRoZSBNZXRhUGF0aFxuXHQgKiBAcmV0dXJucyBUaGUgbmFtZSBvZiB0aGUgYWN0aW9uXG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0X2dldE5ld0FjdGlvbihcblx0XHRvU3RhcnR1cFBhcmFtZXRlcnM6IHtcblx0XHRcdHByZWZlcnJlZE1vZGU/OiBzdHJpbmdbXTtcblx0XHR9LFxuXHRcdHNDcmVhdGVIYXNoOiBzdHJpbmcsXG5cdFx0b01ldGFNb2RlbDogT0RhdGFNZXRhTW9kZWwsXG5cdFx0c01ldGFQYXRoOiBzdHJpbmdcblx0KTogc3RyaW5nIHtcblx0XHRsZXQgc05ld0FjdGlvbjtcblxuXHRcdGlmIChvU3RhcnR1cFBhcmFtZXRlcnMgJiYgb1N0YXJ0dXBQYXJhbWV0ZXJzLnByZWZlcnJlZE1vZGUgJiYgc0NyZWF0ZUhhc2gudG9VcHBlckNhc2UoKS5pbmNsdWRlcyhcIkktQUNUSU9OPUNSRUFURVdJVEhcIikpIHtcblx0XHRcdGNvbnN0IHNQcmVmZXJyZWRNb2RlID0gb1N0YXJ0dXBQYXJhbWV0ZXJzLnByZWZlcnJlZE1vZGVbMF07XG5cdFx0XHRzTmV3QWN0aW9uID0gc1ByZWZlcnJlZE1vZGUudG9VcHBlckNhc2UoKS5pbmNsdWRlcyhcIkNSRUFURVdJVEg6XCIpXG5cdFx0XHRcdD8gc1ByZWZlcnJlZE1vZGUuc3Vic3RyaW5nKHNQcmVmZXJyZWRNb2RlLmxhc3RJbmRleE9mKFwiOlwiKSArIDEpXG5cdFx0XHRcdDogdW5kZWZpbmVkO1xuXHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRvU3RhcnR1cFBhcmFtZXRlcnMgJiZcblx0XHRcdG9TdGFydHVwUGFyYW1ldGVycy5wcmVmZXJyZWRNb2RlICYmXG5cdFx0XHRzQ3JlYXRlSGFzaC50b1VwcGVyQ2FzZSgpLmluY2x1ZGVzKFwiSS1BQ1RJT049QVVUT0NSRUFURVdJVEhcIilcblx0XHQpIHtcblx0XHRcdGNvbnN0IHNQcmVmZXJyZWRNb2RlID0gb1N0YXJ0dXBQYXJhbWV0ZXJzLnByZWZlcnJlZE1vZGVbMF07XG5cdFx0XHRzTmV3QWN0aW9uID0gc1ByZWZlcnJlZE1vZGUudG9VcHBlckNhc2UoKS5pbmNsdWRlcyhcIkFVVE9DUkVBVEVXSVRIOlwiKVxuXHRcdFx0XHQ/IHNQcmVmZXJyZWRNb2RlLnN1YnN0cmluZyhzUHJlZmVycmVkTW9kZS5sYXN0SW5kZXhPZihcIjpcIikgKyAxKVxuXHRcdFx0XHQ6IHVuZGVmaW5lZDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0c05ld0FjdGlvbiA9XG5cdFx0XHRcdG9NZXRhTW9kZWwgJiYgb01ldGFNb2RlbC5nZXRPYmplY3QgIT09IHVuZGVmaW5lZFxuXHRcdFx0XHRcdD8gb01ldGFNb2RlbC5nZXRPYmplY3QoYCR7c01ldGFQYXRofUBjb20uc2FwLnZvY2FidWxhcmllcy5TZXNzaW9uLnYxLlN0aWNreVNlc3Npb25TdXBwb3J0ZWQvTmV3QWN0aW9uYCkgfHxcblx0XHRcdFx0XHQgIG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NNZXRhUGF0aH1AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRyYWZ0Um9vdC9OZXdBY3Rpb25gKVxuXHRcdFx0XHRcdDogdW5kZWZpbmVkO1xuXHRcdH1cblx0XHRyZXR1cm4gc05ld0FjdGlvbjtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXRyaWV2ZXMgdGhlIGxhYmVsIGZvciB0aGUgdGl0bGUgb2YgYSBzcGVjaWZpYyBjcmVhdGUgYWN0aW9uIGRpYWxvZywgZS5nLiBDcmVhdGUgU2FsZXMgT3JkZXIgZnJvbSBRdW90YXRpb24uXG5cdCAqXG5cdCAqIFRoZSBmb2xsb3dpbmcgcHJpb3JpdHkgaXMgYXBwbGllZDpcblx0ICogMS4gbGFiZWwgb2YgbGluZS1pdGVtIGFubm90YXRpb24uXG5cdCAqIDIuIGxhYmVsIGFubm90YXRlZCBpbiB0aGUgYWN0aW9uLlxuXHQgKiAzLiBcIkNyZWF0ZVwiIGFzIGEgY29uc3RhbnQgZnJvbSBpMThuLlxuXHQgKiBAcGFyYW0gb01ldGFNb2RlbCBUaGUgTWV0YU1vZGVsIHVzZWQgdG8gY2hlY2sgZm9yIHRoZSBOZXdBY3Rpb24gcGFyYW1ldGVyXG5cdCAqIEBwYXJhbSBzTWV0YVBhdGggVGhlIE1ldGFQYXRoXG5cdCAqIEBwYXJhbSBzTmV3QWN0aW9uIENvbnRhaW5zIHRoZSBuYW1lIG9mIHRoZSBhY3Rpb24gdG8gYmUgZXhlY3V0ZWRcblx0ICogQHBhcmFtIHJlc291cmNlTW9kZWwgUmVzb3VyY2VCdW5kbGUgdG8gYWNjZXNzIHRoZSBkZWZhdWx0IENyZWF0ZSBsYWJlbFxuXHQgKiBAcmV0dXJucyBUaGUgbGFiZWwgZm9yIHRoZSBDcmVhdGUgQWN0aW9uIERpYWxvZ1xuXHQgKiBAZmluYWxcblx0ICovXG5cdF9nZXRTcGVjaWZpY0NyZWF0ZUFjdGlvbkRpYWxvZ0xhYmVsKFxuXHRcdG9NZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsIHwgdW5kZWZpbmVkLFxuXHRcdHNNZXRhUGF0aDogc3RyaW5nLFxuXHRcdHNOZXdBY3Rpb246IHN0cmluZyxcblx0XHRyZXNvdXJjZU1vZGVsOiBSZXNvdXJjZU1vZGVsIHwgdW5kZWZpbmVkXG5cdCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdFx0Y29uc3QgbGluZUl0ZW1zID0gb01ldGFNb2RlbD8uZ2V0T2JqZWN0KGAke3NNZXRhUGF0aH0vQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkxpbmVJdGVtYCkgYXMgTGluZUl0ZW0gfCB1bmRlZmluZWQ7XG5cblx0XHRjb25zdCBsYWJlbCA9IGxpbmVJdGVtcz8uZmluZCgobGluZUl0ZW0pID0+IGlzRGF0YUZpZWxkRm9yQWN0aW9uKGxpbmVJdGVtKSAmJiBsaW5lSXRlbS5BY3Rpb24uc3BsaXQoXCIoXCIsIDEpWzBdID09PSBzTmV3QWN0aW9uKVxuXHRcdFx0Py5MYWJlbDtcblxuXHRcdHJldHVybiAoXG5cdFx0XHRsYWJlbCB8fFxuXHRcdFx0b01ldGFNb2RlbD8uZ2V0T2JqZWN0KGAke3NNZXRhUGF0aH0vJHtzTmV3QWN0aW9ufUBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuTGFiZWxgKSB8fFxuXHRcdFx0cmVzb3VyY2VNb2RlbD8uZ2V0VGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX1NBUEZFX0FDVElPTl9DUkVBVEVcIilcblx0XHQpO1xuXHR9XG59XG5cbmNvbnN0IHNpbmdsZXRvbiA9IG5ldyBUcmFuc2FjdGlvbkhlbHBlcigpO1xuZXhwb3J0IGRlZmF1bHQgc2luZ2xldG9uO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7RUEyREEsTUFBTUEsWUFBWSxHQUFHQyxTQUFTLENBQUNELFlBQVk7RUFDM0MsTUFBTUUsZ0JBQWdCLEdBQUdELFNBQVMsQ0FBQ0MsZ0JBQWdCOztFQUVuRDtFQUNBLE1BQU1DLGlCQUFpQixHQUFHQyxZQUFZLENBQUNELGlCQUFpQjtFQUN4RCxNQUFNRSwwQkFBMEIsR0FBR0QsWUFBWSxDQUFDQywwQkFBMEI7O0VBRTFFO0VBQ0EsU0FBU0MsYUFBYUEsQ0FBSUMsV0FBdUIsRUFBSztJQUNyRCxJQUFJQSxXQUFXLElBQUtBLFdBQVcsQ0FBV0MsV0FBVyxJQUFLRCxXQUFXLENBQVdDLFdBQVcsQ0FBQyxDQUFDLENBQUNDLE9BQU8sQ0FBQyxDQUFDLEtBQUssbUJBQW1CLEVBQUU7TUFDaElGLFdBQVcsR0FBRyxDQUFDLENBQU07SUFDdEI7SUFDQSxPQUFRQSxXQUFXLElBQVcsQ0FBQyxD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