@sapui5/sap.fe.templates 1.108.26 → 1.108.28

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.
@@ -952,7 +952,7 @@ class ObjectPageController extends PageController {
952
952
  return undefined;
953
953
  }
954
954
 
955
- async _saveDocument(oContext: any) {
955
+ async _saveDocument(oContext: any, oParameters: any) {
956
956
  const oModel = this.getView().getModel("ui"),
957
957
  aWaitCreateDocuments: any[] = [];
958
958
  // indicates if we are creating a new row in the OP
@@ -986,7 +986,8 @@ class ObjectPageController extends PageController {
986
986
  const aBindings = await Promise.all(aWaitCreateDocuments);
987
987
  const mParameters = {
988
988
  bExecuteSideEffectsOnError: bExecuteSideEffectsOnError,
989
- bindings: aBindings
989
+ bindings: aBindings,
990
+ entitySetName: oParameters?.entitySetName
990
991
  };
991
992
  // We need to either reject or resolve a promise here and return it since this save
992
993
  // function is not only called when pressing the save button in the footer, but also
@@ -1434,7 +1435,7 @@ class ObjectPageController extends PageController {
1434
1435
  oController._editDocument(oContext);
1435
1436
  }
1436
1437
  } else if (iViewLevel === 1 && oObjectPage.getModel("ui").getProperty("/isEditable")) {
1437
- oController._saveDocument(oContext);
1438
+ oController._saveDocument(oContext, mParameters);
1438
1439
  } else if (oObjectPage.getModel("ui").getProperty("/isEditable")) {
1439
1440
  oController._applyDocument(oContext);
1440
1441
  }
@@ -664,6 +664,22 @@ sap.ui.define(["sap/fe/core/CommonUtils", "sap/fe/core/converters/helpers/Bindin
664
664
  return CommonHelper.generateFunction(".editFlow.deleteDocument", sDeletableContexts, CommonHelper.objectToString(oParams));
665
665
  };
666
666
 
667
+ /*
668
+ * Get Expression of press event of save button.
669
+ *
670
+ * @function
671
+ * @param {string} [sEntitySetName] Entity set name
672
+ * returns {string} binding expression / function string generated from commanhelper's function generateFunction
673
+ */
674
+ _exports.getPressExpressionForDelete = getPressExpressionForDelete;
675
+ var getPressExpressionForSave = function (sEntitySetName) {
676
+ var sSaveContext = "${$view>/getBindingContext}";
677
+ var oParams = {
678
+ entitySetName: CommonHelper.addSingleQuotes(sEntitySetName)
679
+ };
680
+ return CommonHelper.generateFunction("_saveDocument", sSaveContext, CommonHelper.objectToString(oParams));
681
+ };
682
+
667
683
  /*
668
684
  * Get Expression of press event of Edit button.
669
685
  *
@@ -673,7 +689,7 @@ sap.ui.define(["sap/fe/core/CommonUtils", "sap/fe/core/converters/helpers/Bindin
673
689
  * @param {object} [oHeaderAction] Header action object
674
690
  * returns {string} binding expression / function string generated from commanhelper's function generateFunction
675
691
  */
676
- _exports.getPressExpressionForDelete = getPressExpressionForDelete;
692
+ _exports.getPressExpressionForSave = getPressExpressionForSave;
677
693
  var getPressExpressionForEdit = function (oDataField, sEntitySetName, oHeaderAction) {
678
694
  var sEditableContexts = CommonHelper.addSingleQuotes(oDataField && oDataField.Action),
679
695
  sDataFieldEnumMember = oDataField && oDataField.InvocationGrouping && oDataField.InvocationGrouping["$EnumMember"],
@@ -798,4 +814,4 @@ sap.ui.define(["sap/fe/core/CommonUtils", "sap/fe/core/converters/helpers/Bindin
798
814
  _exports.getHeaderFormHboxRenderType = getHeaderFormHboxRenderType;
799
815
  return _exports;
800
816
  }, false);
801
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJCdXR0b25UeXBlIiwibUxpYnJhcnkiLCJnZXRFeHByZXNzaW9uRm9yVGl0bGUiLCJvSGVhZGVySW5mbyIsIm9WaWV3RGF0YSIsImZ1bGxDb250ZXh0UGF0aCIsIm9EcmFmdFJvb3QiLCJ0aXRsZU5vSGVhZGVySW5mbyIsIkNvbW1vblV0aWxzIiwiZ2V0VHJhbnNsYXRlZFRleHQiLCJyZXNvdXJjZUJ1bmRsZSIsInVuZGVmaW5lZCIsImVudGl0eVNldCIsInRpdGxlV2l0aEhlYWRlckluZm8iLCJvRW1wdHlIZWFkZXJJbmZvVGl0bGUiLCJUaXRsZSIsIlZhbHVlIiwidGl0bGVGb3JBY3RpdmVIZWFkZXJOb0hlYWRlckluZm8iLCJ0aXRsZVZhbHVlRXhwcmVzc2lvbiIsImNvbm5lY3RlZEZpZWxkc1BhdGgiLCJ0aXRsZUlzRW1wdHkiLCJjb25zdGFudCIsInRpdGxlQm9vbGVhbkV4cHJlc3Npb24iLCIkVHlwZSIsImdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbiIsIiR0YXJnZXQiLCJhbm5vdGF0aW9ucyIsIkNvbW1vbiIsIlRleHQiLCJVSSIsIlRleHRBcnJhbmdlbWVudCIsImFkZFRleHRBcnJhbmdlbWVudFRvQmluZGluZ0V4cHJlc3Npb24iLCJmb3JtYXRWYWx1ZVJlY3Vyc2l2ZWx5IiwiX3R5cGUiLCJ2YWx1ZSIsImlzRW1wdHkiLCJUYXJnZXQiLCJlbmhhbmNlRGF0YU1vZGVsUGF0aCIsImdldExhYmVsRm9yQ29ubmVjdGVkRmllbGRzIiwiY3JlYXRlTW9kZVRpdGxlIiwiVHlwZU5hbWUiLCJjb25jYXQiLCJyZXNvbHZlQmluZGluZ1N0cmluZyIsInRvU3RyaW5nIiwiYWN0aXZlRXhwcmVzc2lvbiIsIkVudGl0eSIsIklzQWN0aXZlIiwiY29tcGlsZUV4cHJlc3Npb24iLCJpZkVsc2UiLCJhbmQiLCJvciIsIklzQ3JlYXRlTW9kZVN0aWNreSIsIklzQ3JlYXRlTW9kZSIsImdldEV4cHJlc3Npb25Gb3JEZXNjcmlwdGlvbiIsInBhdGhJbk1vZGVsIiwiRGVzY3JpcHRpb24iLCJnZXRFeHByZXNzaW9uRm9yU2F2ZUJ1dHRvbiIsInNhdmVCdXR0b25UZXh0IiwiY3JlYXRlQnV0dG9uVGV4dCIsInNhdmVFeHByZXNzaW9uIiwic3RhcnRpbmdFbnRpdHlTZXQiLCJTZXNzaW9uIiwiU3RpY2t5U2Vzc2lvblN1cHBvcnRlZCIsIkRyYWZ0IiwiSXNOZXdPYmplY3QiLCJnZXRGb290ZXJWaXNpYmxlIiwiZm9vdGVyQWN0aW9ucyIsImRhdGFGaWVsZHMiLCJtYW5pZmVzdEFjdGlvbnMiLCJmaWx0ZXIiLCJhY3Rpb24iLCJpc01hbmlmZXN0QWN0aW9uIiwiY3VzdG9tQWN0aW9uVmlzaWJpbGl0eSIsImxlbmd0aCIsImN1c3RvbUFjdGlvbkluZGl2aWR1YWxWaXNpYmlsaXR5IiwibWFwIiwidmlzaWJsZSIsImFubm90YXRpb25BY3Rpb25WaXNpYmlsaXR5IiwiZ2V0RGF0YUZpZWxkQmFzZWRGb290ZXJWaXNpYmlsaXR5IiwiYURhdGFGaWVsZHMiLCJiQ29uc2lkZXJFZGl0YWJsZSIsInNIaWRkZW5FeHByZXNzaW9uIiwic1NlbWlIaWRkZW5FeHByZXNzaW9uIiwiYUhpZGRlbkFjdGlvblBhdGgiLCJpIiwib0RhdGFGaWVsZCIsIkRldGVybWluaW5nIiwiaGlkZGVuRXhwcmVzc2lvbiIsIiRQYXRoIiwiaW5kZXhPZiIsInB1c2giLCJpbmRleCIsIm9BY3Rpb24iLCJhQWN0aW9ucyIsInR5cGUiLCJidWlsZEVtcGhhc2l6ZWRCdXR0b25FeHByZXNzaW9uIiwiYUlkZW50aWZpY2F0aW9uIiwiRW1waGFzaXplZCIsInNGb3JtYXRFbXBoYXNpemVkRXhwcmVzc2lvbiIsImJJc0Fsd2F5c0RlZmF1bHQiLCJzSGlkZGVuU2ltcGxlUGF0aCIsImZvckVhY2giLCJvQ3JpdGljYWxpdHlQcm9wZXJ0eSIsIkNyaXRpY2FsaXR5Iiwib0RhdGFGaWVsZEhpZGRlbiIsIiRFbnVtTWVtYmVyIiwiRGVmYXVsdCIsInNDb21iaW5lZEhpZGRlbkV4cHJlc3Npb24iLCJnZXRFbGVtZW50QmluZGluZyIsInNQYXRoIiwic05hdmlnYXRpb25QYXRoIiwiT0RhdGFNb2RlbEFubm90YXRpb25IZWxwZXIiLCJnZXROYXZpZ2F0aW9uUGF0aCIsImNoZWNrRHJhZnRTdGF0ZSIsIm9Bbm5vdGF0aW9ucyIsImdldFN3aXRjaFRvQWN0aXZlVmlzaWJpbGl0eSIsImdldFN3aXRjaFRvRHJhZnRWaXNpYmlsaXR5IiwiZ2V0U3dpdGNoRHJhZnRBbmRBY3RpdmVWaXNpYmlsaXR5IiwiX2ZpbmRBY3Rpb24iLCJhQ29udmVydGVyQ29udGV4dEhlYWRlckFjdGlvbnMiLCJzQWN0aW9uVHlwZSIsImZpbmQiLCJvSGVhZGVyQWN0aW9uIiwiZ2V0RGVsZXRlQ29tbWFuZEV4ZWN1dGlvbkVuYWJsZWQiLCJvRGVsZXRlQWN0aW9uIiwiZW5hYmxlZCIsImdldERlbGV0ZUNvbW1hbmRFeGVjdXRpb25WaXNpYmxlIiwiZ2V0RWRpdENvbW1hbmRFeGVjdXRpb25WaXNpYmxlIiwib0VkaXRBY3Rpb24iLCJnZXRFZGl0Q29tbWFuZEV4ZWN1dGlvbkVuYWJsZWQiLCJnZXRFZGl0QWN0aW9uIiwib0VudGl0eVNldCIsImdldFBhdGgiLCJnZXRPYmplY3QiLCJiRHJhZnRSb290IiwiaGFzT3duUHJvcGVydHkiLCJiU3RpY2t5U2Vzc2lvbiIsInNBY3Rpb25OYW1lIiwiaXNSZWFkT25seUZyb21TdGF0aWNBbm5vdGF0aW9ucyIsIm9GaWVsZENvbnRyb2wiLCJiQ29tcHV0ZWQiLCJiSW1tdXRhYmxlIiwiYlJlYWRPbmx5IiwiQm9vbCIsInJlYWRPbmx5RXhwcmVzc2lvbkZyb21EeW5hbWljQW5ub3RhdGlvbnMiLCJzSXNGaWVsZENvbnRyb2xQYXRoUmVhZE9ubHkiLCJNYW5hZ2VkT2JqZWN0IiwiYmluZGluZ1BhcnNlciIsImdldEV4cHJlc3Npb25Gb3JNaWNyb0NoYXJ0VGl0bGVQcmVzcyIsIm9Db25maWd1cmF0aW9uIiwib01hbmlmZXN0T3V0Ym91bmQiLCJzQ29sbGVjdGlvbk5hbWUiLCJKU09OIiwic3RyaW5naWZ5IiwiZ2V0TWljcm9DaGFydFRpdGxlQXNMaW5rIiwib0NvbnRyb2xDb25maWd1cmF0aW9uIiwiZ2V0R3JvdXBJZEZyb21Db25maWciLCJvQ29uZmlndXJhdGlvbnMiLCJzQW5ub3RhdGlvblBhdGgiLCJzRGVmYXVsdEdyb3VwSWQiLCJhQXV0b1BhdHRlcm5zIiwic0dyb3VwSWQiLCJyZXF1ZXN0R3JvdXBJZCIsInNvbWUiLCJhdXRvUGF0dGVybiIsImdldEJpbmRpbmdXaXRoR3JvdXBJZEZyb21Db25maWciLCJzS2V5Iiwic0JpbmRpbmciLCJkb2VzRmllbGRHcm91cENvbnRhaW5Pbmx5T25lTXVsdGlMaW5lRGF0YUZpZWxkIiwiYUZvcm1FbGVtZW50cyIsImlzVmFsdWVNdWx0aWxpbmVUZXh0IiwiZ2V0VmlzaWJsZUV4cHJlc3Npb25Gb3JCcmVhZGNydW1icyIsInNob3dCcmVhZENydW1icyIsImZjbEVuYWJsZWQiLCJnZXRTaGFyZUJ1dHRvblZpc2liaWxpdHkiLCJ2aWV3RGF0YSIsInNTaGFyZUJ1dHRvblZpc2liaWxpdHlFeHAiLCJnZXRWaXNpYmxpdHlPZkhlYWRlckluZm8iLCJvVGl0bGVBbm5vdGF0aW9ucyIsIm9EZXNjcmlwdGlvbkFubm90YXRpb25zIiwib0ZpZWxkVGl0bGVGaWVsZENvbnRyb2wiLCJvRmllbGREZXNjcmlwdGlvbkZpZWxkQ29udHJvbCIsImJJc1RpdGxlUmVhZE9ubHkiLCJ0aXRsZUV4cHJlc3Npb24iLCJiSXNEZXNjcmlwdGlvblJlYWRPbmx5IiwiZGVzY3JpcHRpb25FeHByZXNzaW9uIiwiY29tYmluZVRpdGxlQW5kRGVzY3JpcHRpb25FeHByZXNzaW9uIiwib1RpdGxlRmllbGRDb250cm9sIiwib0Rlc2NyaXB0aW9uRmllbGRDb250cm9sIiwiZ2V0UHJlc3NFeHByZXNzaW9uRm9yRGVsZXRlIiwic0VudGl0eVNldE5hbWUiLCJzRGVsZXRhYmxlQ29udGV4dHMiLCJzVGl0bGUiLCJzRGVzY3JpcHRpb24iLCJvUGFyYW1zIiwidGl0bGUiLCJlbnRpdHlTZXROYW1lIiwiQ29tbW9uSGVscGVyIiwiYWRkU2luZ2xlUXVvdGVzIiwiZGVzY3JpcHRpb24iLCJnZW5lcmF0ZUZ1bmN0aW9uIiwib2JqZWN0VG9TdHJpbmciLCJnZXRQcmVzc0V4cHJlc3Npb25Gb3JFZGl0Iiwic0VkaXRhYmxlQ29udGV4dHMiLCJBY3Rpb24iLCJzRGF0YUZpZWxkRW51bU1lbWJlciIsIkludm9jYXRpb25Hcm91cGluZyIsInNJbnZvY2F0aW9uR3JvdXAiLCJjb250ZXh0cyIsImludm9jYXRpb25Hcm91cGluZyIsIm1vZGVsIiwibGFiZWwiLCJMYWJlbCIsImlzTmF2aWdhYmxlIiwiZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uIiwiZ2V0UHJlc3NFeHByZXNzaW9uRm9yRm9vdGVyQW5ub3RhdGlvbkFjdGlvbiIsInNBY3Rpb25Db250ZXh0cyIsImdldFByZXNzRXhwcmVzc2lvbkZvclByaW1hcnlBY3Rpb24iLCJwb3NpdGl2ZUFjdGlvblZpc2libGUiLCJwb3NpdGl2ZUFjdGlvbkVuYWJsZWQiLCJlZGl0QWN0aW9uVmlzaWJsZSIsImVkaXRBY3Rpb25FbmFibGVkIiwib0NvbmRpdGlvbnMiLCJnZXRTdGFzaGFibGVIQm94QmluZGluZyIsIm9IZWFkZXJGYWNldCIsIkZhY2V0IiwidGFyZ2V0QW5ub3RhdGlvblR5cGUiLCJ0YXJnZXRBbm5vdGF0aW9uVmFsdWUiLCJnZXRQcmVzc0V4cHJlc3Npb25Gb3JMaW5rIiwiZ2V0SGVhZGVyRm9ybUhib3hSZW5kZXJUeXBlIiwiZGF0YUZpZWxkIiwidGFyZ2V0T2JqZWN0Il0sInNvdXJjZVJvb3QiOiIuIiwic291cmNlcyI6WyJPYmplY3RQYWdlVGVtcGxhdGluZy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBGb3JtYXR0ZXJzIGZvciB0aGUgT2JqZWN0IFBhZ2VcbmltcG9ydCB7IEVudGl0eVNldCB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlc1wiO1xuaW1wb3J0IHR5cGUgeyBEYXRhRmllbGQsIERhdGFGaWVsZFR5cGVzLCBIZWFkZXJJbmZvVHlwZSB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvVUlcIjtcbmltcG9ydCB7IFVJQW5ub3RhdGlvblRlcm1zLCBVSUFubm90YXRpb25UeXBlcyB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvVUlcIjtcbmltcG9ydCB0eXBlIFJlc291cmNlQnVuZGxlIGZyb20gXCJzYXAvYmFzZS9pMThuL1Jlc291cmNlQnVuZGxlXCI7XG5pbXBvcnQgQ29tbW9uVXRpbHMgZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgdHlwZSB7IEJhc2VBY3Rpb24sIENvbnZlcnRlckFjdGlvbiB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2NvbnRyb2xzL0NvbW1vbi9BY3Rpb25cIjtcbmltcG9ydCB7IERyYWZ0LCBFbnRpdHksIFVJIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvaGVscGVycy9CaW5kaW5nSGVscGVyXCI7XG5pbXBvcnQgdHlwZSB7IE1hbmlmZXN0QWN0aW9uIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWFuaWZlc3RTZXR0aW5nc1wiO1xuaW1wb3J0IHtcblx0YW5kLFxuXHRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24sXG5cdENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uLFxuXHRjb21waWxlRXhwcmVzc2lvbixcblx0Y29uY2F0LFxuXHRjb25zdGFudCxcblx0Z2V0RXhwcmVzc2lvbkZyb21Bbm5vdGF0aW9uLFxuXHRpZkVsc2UsXG5cdGlzRW1wdHksXG5cdG9yLFxuXHRyZXNvbHZlQmluZGluZ1N0cmluZ1xufSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9CaW5kaW5nVG9vbGtpdFwiO1xuaW1wb3J0IHR5cGUgeyBEYXRhTW9kZWxPYmplY3RQYXRoIH0gZnJvbSBcInNhcC9mZS9jb3JlL3RlbXBsYXRpbmcvRGF0YU1vZGVsUGF0aEhlbHBlclwiO1xuaW1wb3J0IHsgZW5oYW5jZURhdGFNb2RlbFBhdGggfSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9EYXRhTW9kZWxQYXRoSGVscGVyXCI7XG5pbXBvcnQgQ29tbW9uSGVscGVyIGZyb20gXCJzYXAvZmUvbWFjcm9zL0NvbW1vbkhlbHBlclwiO1xuaW1wb3J0IHsgYWRkVGV4dEFycmFuZ2VtZW50VG9CaW5kaW5nRXhwcmVzc2lvbiwgZm9ybWF0VmFsdWVSZWN1cnNpdmVseSB9IGZyb20gXCJzYXAvZmUvbWFjcm9zL2ZpZWxkL0ZpZWxkVGVtcGxhdGluZ1wiO1xuaW1wb3J0IHsgZ2V0TGFiZWxGb3JDb25uZWN0ZWRGaWVsZHMgfSBmcm9tIFwic2FwL2ZlL21hY3Jvcy9pbnRlcm5hbC9mb3JtL0Zvcm1UZW1wbGF0aW5nXCI7XG5pbXBvcnQgbUxpYnJhcnkgZnJvbSBcInNhcC9tL2xpYnJhcnlcIjtcbmltcG9ydCBNYW5hZ2VkT2JqZWN0IGZyb20gXCJzYXAvdWkvYmFzZS9NYW5hZ2VkT2JqZWN0XCI7XG5pbXBvcnQgT0RhdGFNb2RlbEFubm90YXRpb25IZWxwZXIgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Bbm5vdGF0aW9uSGVscGVyXCI7XG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQ29udGV4dFwiO1xuXG5jb25zdCBCdXR0b25UeXBlID0gbUxpYnJhcnkuQnV0dG9uVHlwZTtcblxudHlwZSBWaWV3RGF0YSA9IHtcblx0cmVzb3VyY2VCdW5kbGU6IFJlc291cmNlQnVuZGxlO1xuXHRlbnRpdHlTZXQ6IHN0cmluZztcbn07XG5cbi8vYGBgbWVybWFpZFxuLy8gZ3JhcGggVERcbi8vIEFbT2JqZWN0IFBhZ2UgVGl0bGVdIC0tPnxHZXQgRGF0YUZpZWxkIFZhbHVlfCBDe0V2YWx1YXRlIENyZWF0ZSBNb2RlfVxuLy8gQyAtLT58SW4gQ3JlYXRlIE1vZGV8IER7SXMgRGF0YUZpZWxkIFZhbHVlIGVtcHR5fVxuLy8gRCAtLT58WWVzfCBGe0lzIHRoZXJlIGEgVHlwZU5hbWV9XG4vLyBGIC0tPnxZZXN8IEdbSXMgdGhlcmUgYW4gY3VzdG9tIHRpdGxlXVxuLy8gRyAtLT58WWVzfCBHMVtTaG93IHRoZSBjdXN0b20gdGl0bGUgKyAnVHlwZU5hbWUnXVxuLy8gRyAtLT58Tm98IEcyW0Rpc3BsYXkgdGhlIGRlZmF1bHQgdGl0bGUgJ05ldyArIFR5cGVOYW1lJ11cbi8vIEYgLS0+fE5vfCBIW0lzIHRoZXJlIGEgY3VzdG9tIHRpdGxlXVxuLy8gSCAtLT58WWVzfCBJW1Nob3cgdGhlIGN1c3RvbSB0aXRsZV1cbi8vIEggLS0+fE5vfCBKW1Nob3cgdGhlIGRlZmF1bHQgJ1VuYW1uZWQgT2JqZWN0J11cbi8vIEQgLS0+fE5vfCBFXG4vLyBDIC0tPnxOb3QgaW4gY3JlYXRlIG1vZGV8IEVbU2hvdyBEYXRhRmllbGQgVmFsdWVdXG4vLyBgYGBcbi8qKlxuICogQ29tcHV0ZSB0aGUgdGl0bGUgZm9yIHRoZSBvYmplY3QgcGFnZS5cbiAqXG4gKiBAcGFyYW0gb0hlYWRlckluZm8gVGhlIEBVSS5IZWFkZXJJbmZvIGFubm90YXRpb24gY29udGVudFxuICogQHBhcmFtIG9WaWV3RGF0YSBUaGUgdmlldyBkYXRhIG9iamVjdCB3ZSdyZSBjdXJyZW50bHkgb25cbiAqIEBwYXJhbSBmdWxsQ29udGV4dFBhdGggVGhlIGZ1bGwgY29udGV4dCBwYXRoIHVzZWQgdG8gcmVhY2ggdGhhdCBvYmplY3QgcGFnZVxuICogQHBhcmFtIG9EcmFmdFJvb3RcbiAqIEByZXR1cm5zIFRoZSBiaW5kaW5nIGV4cHJlc3Npb24gZm9yIHRoZSBvYmplY3QgcGFnZSB0aXRsZVxuICovXG5leHBvcnQgY29uc3QgZ2V0RXhwcmVzc2lvbkZvclRpdGxlID0gZnVuY3Rpb24gKFxuXHRvSGVhZGVySW5mbzogSGVhZGVySW5mb1R5cGUgfCB1bmRlZmluZWQsXG5cdG9WaWV3RGF0YTogVmlld0RhdGEsXG5cdGZ1bGxDb250ZXh0UGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aCxcblx0b0RyYWZ0Um9vdDogT2JqZWN0IHwgdW5kZWZpbmVkXG4pOiBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiB7XG5cdGNvbnN0IHRpdGxlTm9IZWFkZXJJbmZvID0gQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXCJUX05FV19PQkpFQ1RcIiwgb1ZpZXdEYXRhLnJlc291cmNlQnVuZGxlLCB1bmRlZmluZWQsIG9WaWV3RGF0YS5lbnRpdHlTZXQpO1xuXG5cdGNvbnN0IHRpdGxlV2l0aEhlYWRlckluZm8gPSBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcblx0XHRcIlRfQU5OT1RBVElPTl9IRUxQRVJfREVGQVVMVF9PQkpFQ1RfUEFHRV9IRUFERVJfVElUTEVcIixcblx0XHRvVmlld0RhdGEucmVzb3VyY2VCdW5kbGUsXG5cdFx0dW5kZWZpbmVkLFxuXHRcdG9WaWV3RGF0YS5lbnRpdHlTZXRcblx0KTtcblxuXHRjb25zdCBvRW1wdHlIZWFkZXJJbmZvVGl0bGUgPVxuXHRcdG9IZWFkZXJJbmZvPy5UaXRsZSA9PT0gdW5kZWZpbmVkIHx8IChvSGVhZGVySW5mbz8uVGl0bGUgYXMgYW55KSA9PT0gXCJcIiB8fCAob0hlYWRlckluZm8/LlRpdGxlIGFzIERhdGFGaWVsZFR5cGVzKT8uVmFsdWUgPT09IFwiXCI7XG5cblx0Y29uc3QgdGl0bGVGb3JBY3RpdmVIZWFkZXJOb0hlYWRlckluZm8gPSAhb0VtcHR5SGVhZGVySW5mb1RpdGxlXG5cdFx0PyBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcIlRfQU5OT1RBVElPTl9IRUxQRVJfREVGQVVMVF9PQkpFQ1RfUEFHRV9IRUFERVJfVElUTEVfTk9fSEVBREVSX0lORk9cIiwgb1ZpZXdEYXRhLnJlc291cmNlQnVuZGxlKVxuXHRcdDogXCJcIjtcblx0bGV0IHRpdGxlVmFsdWVFeHByZXNzaW9uLFxuXHRcdGNvbm5lY3RlZEZpZWxkc1BhdGgsXG5cdFx0dGl0bGVJc0VtcHR5OiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj4gPSBjb25zdGFudCh0cnVlKSxcblx0XHR0aXRsZUJvb2xlYW5FeHByZXNzaW9uOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj4gfCBib29sZWFuO1xuXHRpZiAob0hlYWRlckluZm8/LlRpdGxlPy4kVHlwZSA9PT0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5EYXRhRmllbGRcIikge1xuXHRcdHRpdGxlVmFsdWVFeHByZXNzaW9uID0gZ2V0RXhwcmVzc2lvbkZyb21Bbm5vdGF0aW9uKChvSGVhZGVySW5mbz8uVGl0bGUgYXMgRGF0YUZpZWxkVHlwZXMpPy5WYWx1ZSk7XG5cdFx0aWYgKChvSGVhZGVySW5mbz8uVGl0bGUgYXMgRGF0YUZpZWxkVHlwZXMpPy5WYWx1ZT8uJHRhcmdldD8uYW5ub3RhdGlvbnM/LkNvbW1vbj8uVGV4dD8uYW5ub3RhdGlvbnM/LlVJPy5UZXh0QXJyYW5nZW1lbnQpIHtcblx0XHRcdC8vIEluIGNhc2UgYW4gZXhwbGljaXQgdGV4dCBhcnJhbmdlbWVudCB3YXMgc2V0IHdlIG1ha2UgdXNlIG9mIGl0IGluIHRoZSBkZXNjcmlwdGlvbiBhcyB3ZWxsXG5cdFx0XHR0aXRsZVZhbHVlRXhwcmVzc2lvbiA9IGFkZFRleHRBcnJhbmdlbWVudFRvQmluZGluZ0V4cHJlc3Npb24odGl0bGVWYWx1ZUV4cHJlc3Npb24sIGZ1bGxDb250ZXh0UGF0aCk7XG5cdFx0fVxuXHRcdHRpdGxlVmFsdWVFeHByZXNzaW9uID0gZm9ybWF0VmFsdWVSZWN1cnNpdmVseSh0aXRsZVZhbHVlRXhwcmVzc2lvbiwgZnVsbENvbnRleHRQYXRoKTtcblx0XHR0aXRsZUlzRW1wdHkgPSB0aXRsZVZhbHVlRXhwcmVzc2lvbj8uX3R5cGUgPT09IFwiQ29uc3RhbnRcIiA/IGNvbnN0YW50KCF0aXRsZVZhbHVlRXhwcmVzc2lvbj8udmFsdWUpIDogaXNFbXB0eSh0aXRsZVZhbHVlRXhwcmVzc2lvbik7XG5cdH0gZWxzZSBpZiAoXG5cdFx0b0hlYWRlckluZm8/LlRpdGxlPy4kVHlwZSA9PT0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5EYXRhRmllbGRGb3JBbm5vdGF0aW9uXCIgJiZcblx0XHRvSGVhZGVySW5mbz8uVGl0bGU/LlRhcmdldC4kdGFyZ2V0LiRUeXBlID09PSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkNvbm5lY3RlZEZpZWxkc1R5cGVcIlxuXHQpIHtcblx0XHRjb25uZWN0ZWRGaWVsZHNQYXRoID0gZW5oYW5jZURhdGFNb2RlbFBhdGgoZnVsbENvbnRleHRQYXRoLCBcIiRUeXBlL0BVSS5IZWFkZXJJbmZvL1RpdGxlL1RhcmdldC8kQW5ub3RhdGlvblBhdGhcIik7XG5cdFx0dGl0bGVWYWx1ZUV4cHJlc3Npb24gPSBnZXRMYWJlbEZvckNvbm5lY3RlZEZpZWxkcyhjb25uZWN0ZWRGaWVsZHNQYXRoLCBmYWxzZSkgYXMgQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPHN0cmluZz47XG5cdFx0dGl0bGVCb29sZWFuRXhwcmVzc2lvbiA9IHRpdGxlVmFsdWVFeHByZXNzaW9uPy5fdHlwZSA9PT0gXCJDb25zdGFudFwiID8gY29uc3RhbnQoIXRpdGxlVmFsdWVFeHByZXNzaW9uPy52YWx1ZSkgOiBpc0VtcHR5KHRpdGxlVmFsdWVFeHByZXNzaW9uKTtcblx0XHR0aXRsZUlzRW1wdHkgPSB0aXRsZVZhbHVlRXhwcmVzc2lvbiA/IHRpdGxlQm9vbGVhbkV4cHJlc3Npb24gOiBjb25zdGFudCh0cnVlKTtcblx0fVxuXG5cdC8vIElmIHRoZXJlIGlzIGEgVHlwZU5hbWUgZGVmaW5lZCwgc2hvdyB0aGUgZGVmYXVsdCB0aXRsZSAnTmV3ICsgVHlwZU5hbWUnLCBvdGhlcndpc2Ugc2hvdyB0aGUgY3VzdG9tIHRpdGxlIG9yIHRoZSBkZWZhdWx0ICdOZXcgb2JqZWN0J1xuXHRjb25zdCBjcmVhdGVNb2RlVGl0bGUgPSBvSGVhZGVySW5mbz8uVHlwZU5hbWVcblx0XHQ/IGNvbmNhdCh0aXRsZVdpdGhIZWFkZXJJbmZvLCBcIjogXCIsIHJlc29sdmVCaW5kaW5nU3RyaW5nKG9IZWFkZXJJbmZvLlR5cGVOYW1lLnRvU3RyaW5nKCkpKVxuXHRcdDogdGl0bGVOb0hlYWRlckluZm87XG5cdGNvbnN0IGFjdGl2ZUV4cHJlc3Npb24gPSBvRHJhZnRSb290ID8gRW50aXR5LklzQWN0aXZlIDogdHJ1ZTtcblx0cmV0dXJuIGNvbXBpbGVFeHByZXNzaW9uKFxuXHRcdGlmRWxzZShcblx0XHRcdGFuZChvcihVSS5Jc0NyZWF0ZU1vZGVTdGlja3ksIFVJLklzQ3JlYXRlTW9kZSksIHRpdGxlSXNFbXB0eSksXG5cdFx0XHRjcmVhdGVNb2RlVGl0bGUsXG5cblx0XHRcdC8vIE90aGVyd2lzZSBzaG93IHRoZSBkZWZhdWx0IGV4cHJlc3Npb25cblx0XHRcdGlmRWxzZShhbmQoYWN0aXZlRXhwcmVzc2lvbiwgdGl0bGVJc0VtcHR5KSwgdGl0bGVGb3JBY3RpdmVIZWFkZXJOb0hlYWRlckluZm8sIHRpdGxlVmFsdWVFeHByZXNzaW9uKVxuXHRcdClcblx0KTtcbn07XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSBleHByZXNzaW9uIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgYW4gb2JqZWN0IHBhZ2UuXG4gKlxuICogQHBhcmFtIG9IZWFkZXJJbmZvIFRoZSBAVUkuSGVhZGVySW5mbyBhbm5vdGF0aW9uIGNvbnRlbnRcbiAqIEBwYXJhbSBmdWxsQ29udGV4dFBhdGggVGhlIGZ1bGwgY29udGV4dCBwYXRoIHVzZWQgdG8gcmVhY2ggdGhhdCBvYmplY3QgcGFnZVxuICogQHJldHVybnMgVGhlIGJpbmRpbmcgZXhwcmVzc2lvbiBmb3IgdGhlIG9iamVjdCBwYWdlIGRlc2NyaXB0aW9uXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRFeHByZXNzaW9uRm9yRGVzY3JpcHRpb24gPSBmdW5jdGlvbiAoXG5cdG9IZWFkZXJJbmZvOiBIZWFkZXJJbmZvVHlwZSB8IHVuZGVmaW5lZCxcblx0ZnVsbENvbnRleHRQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoXG4pOiBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiB7XG5cdGxldCBwYXRoSW5Nb2RlbCA9IGdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbigob0hlYWRlckluZm8/LkRlc2NyaXB0aW9uIGFzIERhdGFGaWVsZFR5cGVzKT8uVmFsdWUpO1xuXHRpZiAoKG9IZWFkZXJJbmZvPy5EZXNjcmlwdGlvbiBhcyBEYXRhRmllbGRUeXBlcyk/LlZhbHVlPy4kdGFyZ2V0Py5hbm5vdGF0aW9ucz8uQ29tbW9uPy5UZXh0Py5hbm5vdGF0aW9ucz8uVUk/LlRleHRBcnJhbmdlbWVudCkge1xuXHRcdC8vIEluIGNhc2UgYW4gZXhwbGljaXQgdGV4dCBhcnJhbmdlbWVudCB3YXMgc2V0IHdlIG1ha2UgdXNlIG9mIGl0IGluIHRoZSBkZXNjcmlwdGlvbiBhcyB3ZWxsXG5cdFx0cGF0aEluTW9kZWwgPSBhZGRUZXh0QXJyYW5nZW1lbnRUb0JpbmRpbmdFeHByZXNzaW9uKHBhdGhJbk1vZGVsLCBmdWxsQ29udGV4dFBhdGgpO1xuXHR9XG5cblx0cmV0dXJuIGNvbXBpbGVFeHByZXNzaW9uKGZvcm1hdFZhbHVlUmVjdXJzaXZlbHkocGF0aEluTW9kZWwsIGZ1bGxDb250ZXh0UGF0aCkpO1xufTtcblxuLyoqXG4gKiBSZXR1cm4gdGhlIGV4cHJlc3Npb24gZm9yIHRoZSBzYXZlIGJ1dHRvbi5cbiAqXG4gKiBAcGFyYW0gb1ZpZXdEYXRhIFRoZSBjdXJyZW50IHZpZXcgZGF0YVxuICogQHBhcmFtIGZ1bGxDb250ZXh0UGF0aCBUaGUgcGF0aCB1c2VkIHVwIHVudGlsIGhlcmVcbiAqIEByZXR1cm5zIFRoZSBiaW5kaW5nIGV4cHJlc3Npb24gdGhhdCBzaG93cyB0aGUgcmlnaHQgc2F2ZSBidXR0b24gdGV4dFxuICovXG5leHBvcnQgY29uc3QgZ2V0RXhwcmVzc2lvbkZvclNhdmVCdXR0b24gPSBmdW5jdGlvbiAoXG5cdG9WaWV3RGF0YTogVmlld0RhdGEsXG5cdGZ1bGxDb250ZXh0UGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aFxuKTogQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24ge1xuXHRjb25zdCBzYXZlQnV0dG9uVGV4dCA9IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFwiVF9PUF9PQkpFQ1RfUEFHRV9TQVZFXCIsIG9WaWV3RGF0YS5yZXNvdXJjZUJ1bmRsZSk7XG5cdGNvbnN0IGNyZWF0ZUJ1dHRvblRleHQgPSBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcIlRfT1BfT0JKRUNUX1BBR0VfQ1JFQVRFXCIsIG9WaWV3RGF0YS5yZXNvdXJjZUJ1bmRsZSk7XG5cdGxldCBzYXZlRXhwcmVzc2lvbjtcblxuXHRpZiAoKGZ1bGxDb250ZXh0UGF0aC5zdGFydGluZ0VudGl0eVNldCBhcyBFbnRpdHlTZXQpLmFubm90YXRpb25zLlNlc3Npb24/LlN0aWNreVNlc3Npb25TdXBwb3J0ZWQpIHtcblx0XHQvLyBJZiB3ZSdyZSBpbiBzdGlja3kgbW9kZSBBTkQgdGhlIHVpIGlzIGluIGNyZWF0ZSBtb2RlLCBzaG93IENyZWF0ZSwgZWxzZSBzaG93IFNhdmVcblx0XHRzYXZlRXhwcmVzc2lvbiA9IGlmRWxzZShVSS5Jc0NyZWF0ZU1vZGVTdGlja3ksIGNyZWF0ZUJ1dHRvblRleHQsIHNhdmVCdXR0b25UZXh0KTtcblx0fSBlbHNlIHtcblx0XHQvLyBJZiB3ZSdyZSBpbiBkcmFmdCBBTkQgdGhlIGRyYWZ0IGlzIGEgbmV3IG9iamVjdCAoIUlzQWN0aXZlRW50aXR5ICYmICFIYXNBY3RpdmVFbnRpdHkpLCBzaG93IGNyZWF0ZSwgZWxzZSBzaG93IHNhdmVcblx0XHRzYXZlRXhwcmVzc2lvbiA9IGlmRWxzZShEcmFmdC5Jc05ld09iamVjdCwgY3JlYXRlQnV0dG9uVGV4dCwgc2F2ZUJ1dHRvblRleHQpO1xuXHR9XG5cdHJldHVybiBjb21waWxlRXhwcmVzc2lvbihzYXZlRXhwcmVzc2lvbik7XG59O1xuXG4vKipcbiAqIE1ldGhvZCByZXR1cm5zIHdoZXRoZXIgZm9vdGVyIGlzIHZpc2libGUgb3Igbm90IG9uIG9iamVjdCAvIHN1Ym9iamVjdCBwYWdlLlxuICpcbiAqIEBmdW5jdGlvblxuICogQG5hbWUgZ2V0Rm9vdGVyVmlzaWJsZVxuICogQHBhcmFtIGZvb3RlckFjdGlvbnMgVGhlIGZvb3RlciBhY3Rpb24gb2JqZWN0IGNvbWluZyBmcm9tIHRoZSBjb252ZXJ0ZXJcbiAqIEBwYXJhbSBkYXRhRmllbGRzIERhdGEgZmllbGQgYXJyYXkgZm9yIG5vcm1hbCBmb290ZXIgdmlzaWJpbGl0eSBwcm9jZXNzaW5nXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgYW55IGFjdGlvbiBpcyB0cnVlLCBvdGhlcndpc2UgY29tcGlsZWQgQmluZGluZyBvciBgZmFsc2VgXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRGb290ZXJWaXNpYmxlID0gZnVuY3Rpb24gKFxuXHRmb290ZXJBY3Rpb25zOiBDb252ZXJ0ZXJBY3Rpb25bXSxcblx0ZGF0YUZpZWxkczogRGF0YUZpZWxkW11cbik6IGJvb2xlYW4gfCBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiB7XG5cdGNvbnN0IG1hbmlmZXN0QWN0aW9ucyA9IGZvb3RlckFjdGlvbnMuZmlsdGVyKChhY3Rpb24pID0+IGlzTWFuaWZlc3RBY3Rpb24oYWN0aW9uKSkgYXMgTWFuaWZlc3RBY3Rpb25bXTtcblx0bGV0IGN1c3RvbUFjdGlvblZpc2liaWxpdHk6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPjtcblx0aWYgKG1hbmlmZXN0QWN0aW9ucy5sZW5ndGgpIHtcblx0XHQvLyBJZiB3ZSBoYXZlIG1hbmlmZXN0IGFjdGlvbnNcblx0XHRjb25zdCBjdXN0b21BY3Rpb25JbmRpdmlkdWFsVmlzaWJpbGl0eSA9IG1hbmlmZXN0QWN0aW9ucy5tYXAoKGFjdGlvbikgPT4ge1xuXHRcdFx0cmV0dXJuIHJlc29sdmVCaW5kaW5nU3RyaW5nPGJvb2xlYW4+KGFjdGlvbi52aXNpYmxlIGFzIHN0cmluZyB8IGJvb2xlYW4sIFwiYm9vbGVhblwiKTtcblx0XHR9KTtcblx0XHQvLyBjb25zdHJ1Y3QgdGhlIGZvb3RlcidzIHZpc2liaWxpdHktYmluZGluZyBvdXQgb2YgYWxsIGFjdGlvbnMnIHZpc2liaWxpdHktYmluZGluZ3MsIGZpcnN0IHRoZSBiaW5kaW5nIG9mIGFsbCBjdXN0b20gYWN0aW9ucyAuLi5cblx0XHRjdXN0b21BY3Rpb25WaXNpYmlsaXR5ID0gb3IoLi4uY3VzdG9tQWN0aW9uSW5kaXZpZHVhbFZpc2liaWxpdHkpO1xuXHRcdC8vIGFuZCB0aGVuIHRoZSBiaW5kaW5nIG9mIGFsbCBhbm5vdGF0aW9uIGFjdGlvbnMgaW5zaWRlIHRoZSBmb290ZXIgLi4uXG5cdFx0Y29uc3QgYW5ub3RhdGlvbkFjdGlvblZpc2liaWxpdHkgPSBnZXREYXRhRmllbGRCYXNlZEZvb3RlclZpc2liaWxpdHkoZGF0YUZpZWxkcywgdHJ1ZSk7XG5cdFx0Ly8gZmluYWxseSwgcmV0dXJuIGV2ZXJ5dGhpbmcuXG5cdFx0cmV0dXJuIGNvbXBpbGVFeHByZXNzaW9uKG9yKGN1c3RvbUFjdGlvblZpc2liaWxpdHksIHJlc29sdmVCaW5kaW5nU3RyaW5nPGJvb2xlYW4+KGFubm90YXRpb25BY3Rpb25WaXNpYmlsaXR5LCBcImJvb2xlYW5cIikpKTtcblx0fVxuXHRyZXR1cm4gZ2V0RGF0YUZpZWxkQmFzZWRGb290ZXJWaXNpYmlsaXR5KGRhdGFGaWVsZHMsIHRydWUpO1xufTtcblxuLyoqXG4gKiBDaGVja3MgaWYgdGhlIGZvb3RlciBpcyB2aXNpYmxlIG9yIG5vdC5cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBzdGF0aWNcbiAqIEBuYW1lIHNhcC5mZS50ZW1wbGF0ZXMuT2JqZWN0UGFnZS5PYmplY3RQYWdlVGVtcGxhdGluZy5nZXREYXRhRmllbGRCYXNlZEZvb3RlclZpc2liaWxpdHlcbiAqIEBtZW1iZXJvZiBzYXAuZmUudGVtcGxhdGVzLk9iamVjdFBhZ2UuT2JqZWN0UGFnZVRlbXBsYXRpbmdcbiAqIEBwYXJhbSBhRGF0YUZpZWxkcyBBcnJheSBvZiBEYXRhRmllbGRzIGluIHRoZSBpZGVudGlmaWNhdGlvblxuICogQHBhcmFtIGJDb25zaWRlckVkaXRhYmxlIFdoZXRoZXIgdGhlIGVkaXQgbW9kZSBiaW5kaW5nIGlzIHJlcXVpcmVkIG9yIG5vdFxuICogQHJldHVybnMgQW4gZXhwcmVzc2lvbiBpZiBhbGwgdGhlIGFjdGlvbnMgYXJlIHVpLmhpZGRlbiwgdHJ1ZSBvdGhlcndpc2VcbiAqIEBwcml2YXRlXG4gKiBAdWk1LXJlc3RyaWN0ZWRcbiAqL1xuZXhwb3J0IGNvbnN0IGdldERhdGFGaWVsZEJhc2VkRm9vdGVyVmlzaWJpbGl0eSA9IGZ1bmN0aW9uIChhRGF0YUZpZWxkczogYW55W10sIGJDb25zaWRlckVkaXRhYmxlOiBib29sZWFuKSB7XG5cdGxldCBzSGlkZGVuRXhwcmVzc2lvbiA9IFwiXCI7XG5cdGxldCBzU2VtaUhpZGRlbkV4cHJlc3Npb247XG5cdGNvbnN0IGFIaWRkZW5BY3Rpb25QYXRoID0gW107XG5cblx0Zm9yIChjb25zdCBpIGluIGFEYXRhRmllbGRzKSB7XG5cdFx0Y29uc3Qgb0RhdGFGaWVsZCA9IGFEYXRhRmllbGRzW2ldO1xuXHRcdGlmIChvRGF0YUZpZWxkLiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBY3Rpb24gJiYgb0RhdGFGaWVsZC5EZXRlcm1pbmluZyA9PT0gdHJ1ZSkge1xuXHRcdFx0Y29uc3QgaGlkZGVuRXhwcmVzc2lvbiA9IG9EYXRhRmllbGRbYEAke1VJQW5ub3RhdGlvblRlcm1zLkhpZGRlbn1gXTtcblx0XHRcdGlmICghaGlkZGVuRXhwcmVzc2lvbikge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH0gZWxzZSBpZiAoaGlkZGVuRXhwcmVzc2lvbi4kUGF0aCkge1xuXHRcdFx0XHRpZiAoYUhpZGRlbkFjdGlvblBhdGguaW5kZXhPZihoaWRkZW5FeHByZXNzaW9uLiRQYXRoKSA9PT0gLTEpIHtcblx0XHRcdFx0XHRhSGlkZGVuQWN0aW9uUGF0aC5wdXNoKGhpZGRlbkV4cHJlc3Npb24uJFBhdGgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0aWYgKGFIaWRkZW5BY3Rpb25QYXRoLmxlbmd0aCkge1xuXHRcdGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBhSGlkZGVuQWN0aW9uUGF0aC5sZW5ndGg7IGluZGV4KyspIHtcblx0XHRcdGlmIChhSGlkZGVuQWN0aW9uUGF0aFtpbmRleF0pIHtcblx0XHRcdFx0c1NlbWlIaWRkZW5FeHByZXNzaW9uID0gXCIoJXtcIiArIGFIaWRkZW5BY3Rpb25QYXRoW2luZGV4XSArIFwifSA9PT0gdHJ1ZSA/IGZhbHNlIDogdHJ1ZSApXCI7XG5cdFx0XHR9XG5cdFx0XHRpZiAoaW5kZXggPT0gYUhpZGRlbkFjdGlvblBhdGgubGVuZ3RoIC0gMSkge1xuXHRcdFx0XHRzSGlkZGVuRXhwcmVzc2lvbiA9IHNIaWRkZW5FeHByZXNzaW9uICsgc1NlbWlIaWRkZW5FeHByZXNzaW9uO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0c0hpZGRlbkV4cHJlc3Npb24gPSBzSGlkZGVuRXhwcmVzc2lvbiArIHNTZW1pSGlkZGVuRXhwcmVzc2lvbiArIFwifHxcIjtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIChcblx0XHRcdFwiez0gXCIgK1xuXHRcdFx0KGJDb25zaWRlckVkaXRhYmxlID8gXCIoXCIgOiBcIlwiKSArXG5cdFx0XHRzSGlkZGVuRXhwcmVzc2lvbiArXG5cdFx0XHQoYkNvbnNpZGVyRWRpdGFibGUgPyBcIiB8fCAke3VpPi9pc0VkaXRhYmxlfSkgXCIgOiBcIiBcIikgK1xuXHRcdFx0XCImJiAke2ludGVybmFsPmlzQ3JlYXRlRGlhbG9nT3Blbn0gIT09IHRydWV9XCJcblx0XHQpO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBcIns9IFwiICsgKGJDb25zaWRlckVkaXRhYmxlID8gXCIke3VpPi9pc0VkaXRhYmxlfSAmJiBcIiA6IFwiXCIpICsgXCIke2ludGVybmFsPmlzQ3JlYXRlRGlhbG9nT3Blbn0gIT09IHRydWV9XCI7XG5cdH1cbn07XG5cbi8qKlxuICogTWV0aG9kIHJldHVybnMgV2hldGhlciB0aGUgYWN0aW9uIHR5cGUgaXMgbWFuaWZlc3Qgb3Igbm90LlxuICpcbiAqIEBmdW5jdGlvblxuICogQG5hbWUgaXNNYW5pZmVzdEFjdGlvblZpc2libGVcbiAqIEBwYXJhbSBvQWN0aW9uIFRoZSBhY3Rpb24gb2JqZWN0XG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgYWN0aW9uIGlzIGNvbWluZyBmcm9tIG1hbmlmZXN0LCBgZmFsc2VgIG90aGVyd2lzZVxuICovXG5leHBvcnQgY29uc3QgaXNNYW5pZmVzdEFjdGlvbiA9IGZ1bmN0aW9uIChvQWN0aW9uOiBhbnkpIHtcblx0Y29uc3QgYUFjdGlvbnMgPSBbXG5cdFx0XCJQcmltYXJ5XCIsXG5cdFx0XCJEZWZhdWx0QXBwbHlcIixcblx0XHRcIlNlY29uZGFyeVwiLFxuXHRcdFwiRm9yQWN0aW9uXCIsXG5cdFx0XCJGb3JOYXZpZ2F0aW9uXCIsXG5cdFx0XCJTd2l0Y2hUb0FjdGl2ZU9iamVjdFwiLFxuXHRcdFwiU3dpdGNoVG9EcmFmdE9iamVjdFwiLFxuXHRcdFwiRHJhZnRBY3Rpb25zXCJcblx0XTtcblx0cmV0dXJuIGFBY3Rpb25zLmluZGV4T2Yob0FjdGlvbi50eXBlKSA8IDA7XG59O1xuXG4vKipcbiAqIFJldHVybnMgYW4gZXhwcmVzc2lvbiB0byBkZXRlcm1pbmUgRW1waGFzaXplZCAgYnV0dG9uIHR5cGUgYmFzZWQgb24gQ3JpdGljYWxpdHkgYWNyb3NzIGFsbCBhY3Rpb25zXG4gKiBJZiBjcml0aWNhbCBhY3Rpb24gaXMgcmVuZGVyZWQsIGl0cyBjb25zaWRlcmVkIHRvIGJlIHRoZSBwcmltYXJ5IGFjdGlvbi4gSGVuY2UgdGVtcGxhdGUncyBkZWZhdWx0IHByaW1hcnkgYWN0aW9uIGlzIHNldCBiYWNrIHRvIERlZmF1bHQuXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAc3RhdGljXG4gKiBAbmFtZSBzYXAuZmUudGVtcGxhdGVzLk9iamVjdFBhZ2UuT2JqZWN0UGFnZVRlbXBsYXRpbmcuYnVpbGRFbXBoYXNpemVkQnV0dG9uRXhwcmVzc2lvblxuICogQG1lbWJlcm9mIHNhcC5mZS50ZW1wbGF0ZXMuT2JqZWN0UGFnZS5PYmplY3RQYWdlVGVtcGxhdGluZ1xuICogQHBhcmFtIGFJZGVudGlmaWNhdGlvbiBBcnJheSBvZiBhbGwgdGhlIERhdGFGaWVsZHMgaW4gSWRlbnRpZmljYXRpb25cbiAqIEByZXR1cm5zIEFuIGV4cHJlc3Npb24gdG8gZGVkdWNlIGlmIGJ1dHRvbiB0eXBlIGlzIERlZmF1bHQgb3IgRW1waGFzaXplZFxuICogQHByaXZhdGVcbiAqIEB1aTUtcmVzdHJpY3RlZFxuICovXG5leHBvcnQgY29uc3QgYnVpbGRFbXBoYXNpemVkQnV0dG9uRXhwcmVzc2lvbiA9IGZ1bmN0aW9uIChhSWRlbnRpZmljYXRpb24/OiBhbnlbXSkge1xuXHRpZiAoIWFJZGVudGlmaWNhdGlvbikge1xuXHRcdHJldHVybiBCdXR0b25UeXBlLkVtcGhhc2l6ZWQ7XG5cdH1cblx0bGV0IHNGb3JtYXRFbXBoYXNpemVkRXhwcmVzc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXHRsZXQgYklzQWx3YXlzRGVmYXVsdDogYm9vbGVhbixcblx0XHRzSGlkZGVuU2ltcGxlUGF0aCxcblx0XHRzSGlkZGVuRXhwcmVzc2lvbiA9IFwiXCI7XG5cdGFJZGVudGlmaWNhdGlvbi5mb3JFYWNoKGZ1bmN0aW9uIChvRGF0YUZpZWxkOiBhbnkpIHtcblx0XHRjb25zdCBvQ3JpdGljYWxpdHlQcm9wZXJ0eSA9IG9EYXRhRmllbGQuQ3JpdGljYWxpdHk7XG5cdFx0Y29uc3Qgb0RhdGFGaWVsZEhpZGRlbiA9IG9EYXRhRmllbGRbXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuSGlkZGVuXCJdO1xuXHRcdGlmIChvRGF0YUZpZWxkLiRUeXBlID09PSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkRhdGFGaWVsZEZvckFjdGlvblwiICYmICFiSXNBbHdheXNEZWZhdWx0ICYmIG9Dcml0aWNhbGl0eVByb3BlcnR5KSB7XG5cdFx0XHRpZiAoIXNGb3JtYXRFbXBoYXNpemVkRXhwcmVzc2lvbiAmJiBvRGF0YUZpZWxkSGlkZGVuID09PSB0cnVlKSB7XG5cdFx0XHRcdC8vIGlmIERhdGFGaWVsZCBpcyBzZXQgdG8gaGlkZGVuLCB3ZSBjYW4gc2tpcCBvdGhlciBjaGVja3MgYW5kIHJldHVybiBEZWZhdWx0IGJ1dHRvbiB0eXBlXG5cdFx0XHRcdHNGb3JtYXRFbXBoYXNpemVkRXhwcmVzc2lvbiA9IEJ1dHRvblR5cGUuRW1waGFzaXplZDtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0aWYgKG9EYXRhRmllbGRIaWRkZW4gJiYgb0RhdGFGaWVsZEhpZGRlbi4kUGF0aCkge1xuXHRcdFx0XHQvLyB3aGVuIHZpc2liaWxpdHkgb2YgY3JpdGljYWwgYnV0dG9uIGlzIGJhc2VkIG9uIHBhdGgsIGNvbGxlY3QgYWxsIHBhdGhzIGZvciBleHByZXNzaW9uXG5cdFx0XHRcdHNIaWRkZW5TaW1wbGVQYXRoID0gb0RhdGFGaWVsZEhpZGRlbi4kUGF0aDtcblx0XHRcdFx0aWYgKHNIaWRkZW5FeHByZXNzaW9uKSB7XG5cdFx0XHRcdFx0c0hpZGRlbkV4cHJlc3Npb24gPSBzSGlkZGVuRXhwcmVzc2lvbiArIFwiICYmIFwiO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHNIaWRkZW5FeHByZXNzaW9uID0gc0hpZGRlbkV4cHJlc3Npb24gKyBcIiV7XCIgKyBzSGlkZGVuU2ltcGxlUGF0aCArIFwifSA9PT0gdHJ1ZVwiO1xuXHRcdFx0XHRzRm9ybWF0RW1waGFzaXplZEV4cHJlc3Npb24gPSBcIns9IChcIiArIHNIaWRkZW5FeHByZXNzaW9uICsgXCIpID8gJ0VtcGhhc2l6ZWQnIDogJ0RlZmF1bHQnIH1cIjtcblx0XHRcdH1cblx0XHRcdHN3aXRjaCAob0NyaXRpY2FsaXR5UHJvcGVydHkuJEVudW1NZW1iZXIpIHtcblx0XHRcdFx0Ly8gc3VwcG9ydGVkIGNyaXRpY2FsaXR5IGFyZSBbUG9zaXRpdmUvMy8nMyddIGFuZCBbTmVnYXRpdmUvMS8nMSddXG5cdFx0XHRcdGNhc2UgXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5Dcml0aWNhbGl0eVR5cGUvTmVnYXRpdmVcIjpcblx0XHRcdFx0Y2FzZSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkNyaXRpY2FsaXR5VHlwZS9Qb3NpdGl2ZVwiOlxuXHRcdFx0XHRjYXNlIFwiMVwiOlxuXHRcdFx0XHRjYXNlIDE6XG5cdFx0XHRcdGNhc2UgXCIzXCI6XG5cdFx0XHRcdGNhc2UgMzpcblx0XHRcdFx0XHRpZiAoIW9EYXRhRmllbGRIaWRkZW4pIHtcblx0XHRcdFx0XHRcdHNGb3JtYXRFbXBoYXNpemVkRXhwcmVzc2lvbiA9IEJ1dHRvblR5cGUuRGVmYXVsdDtcblx0XHRcdFx0XHRcdGJJc0Fsd2F5c0RlZmF1bHQgPSB0cnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRzRm9ybWF0RW1waGFzaXplZEV4cHJlc3Npb24gPSBzRm9ybWF0RW1waGFzaXplZEV4cHJlc3Npb24gfHwgQnV0dG9uVHlwZS5EZWZhdWx0O1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdHNGb3JtYXRFbXBoYXNpemVkRXhwcmVzc2lvbiA9IEJ1dHRvblR5cGUuRW1waGFzaXplZDtcblx0XHRcdH1cblx0XHRcdGlmIChvQ3JpdGljYWxpdHlQcm9wZXJ0eS4kUGF0aCkge1xuXHRcdFx0XHQvLyB3aGVuIENyaXRpY2FsaXR5IGlzIHNldCB1c2luZyBhIHBhdGgsIHVzZSB0aGUgcGF0aCBmb3IgZGVkdWNpbmcgdGhlIEVtcGhzaXplZCB0eXBlIGZvciBkZWZhdWx0IFByaW1hcnkgQWN0aW9uXG5cdFx0XHRcdGNvbnN0IHNDb21iaW5lZEhpZGRlbkV4cHJlc3Npb24gPSBzSGlkZGVuRXhwcmVzc2lvbiA/IFwiIShcIiArIHNIaWRkZW5FeHByZXNzaW9uICsgXCIpICYmIFwiIDogXCJcIjtcblx0XHRcdFx0c0Zvcm1hdEVtcGhhc2l6ZWRFeHByZXNzaW9uID1cblx0XHRcdFx0XHRcIns9IFwiICtcblx0XHRcdFx0XHRzQ29tYmluZWRIaWRkZW5FeHByZXNzaW9uICtcblx0XHRcdFx0XHRcIigoJHtcIiArXG5cdFx0XHRcdFx0b0NyaXRpY2FsaXR5UHJvcGVydHkuJFBhdGggK1xuXHRcdFx0XHRcdFwifSA9PT0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkNyaXRpY2FsaXR5VHlwZS9OZWdhdGl2ZScpIHx8ICgke1wiICtcblx0XHRcdFx0XHRvQ3JpdGljYWxpdHlQcm9wZXJ0eS4kUGF0aCArXG5cdFx0XHRcdFx0XCJ9ID09PSAnMScpIHx8ICgke1wiICtcblx0XHRcdFx0XHRvQ3JpdGljYWxpdHlQcm9wZXJ0eS4kUGF0aCArXG5cdFx0XHRcdFx0XCJ9ID09PSAxKSBcIiArXG5cdFx0XHRcdFx0XCJ8fCAoJHtcIiArXG5cdFx0XHRcdFx0b0NyaXRpY2FsaXR5UHJvcGVydHkuJFBhdGggK1xuXHRcdFx0XHRcdFwifSA9PT0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkNyaXRpY2FsaXR5VHlwZS9Qb3NpdGl2ZScpIHx8ICgke1wiICtcblx0XHRcdFx0XHRvQ3JpdGljYWxpdHlQcm9wZXJ0eS4kUGF0aCArXG5cdFx0XHRcdFx0XCJ9ID09PSAnMycpIHx8ICgke1wiICtcblx0XHRcdFx0XHRvQ3JpdGljYWxpdHlQcm9wZXJ0eS4kUGF0aCArXG5cdFx0XHRcdFx0XCJ9ID09PSAzKSkgPyBcIiArXG5cdFx0XHRcdFx0XCInRGVmYXVsdCdcIiArXG5cdFx0XHRcdFx0XCIgOiBcIiArXG5cdFx0XHRcdFx0XCInRW1waGFzaXplZCdcIiArXG5cdFx0XHRcdFx0XCIgfVwiO1xuXHRcdFx0fVxuXHRcdH1cblx0fSk7XG5cdHJldHVybiBzRm9ybWF0RW1waGFzaXplZEV4cHJlc3Npb24gfHwgQnV0dG9uVHlwZS5FbXBoYXNpemVkO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEVsZW1lbnRCaW5kaW5nID0gZnVuY3Rpb24gKHNQYXRoOiBhbnkpIHtcblx0Y29uc3Qgc05hdmlnYXRpb25QYXRoID0gT0RhdGFNb2RlbEFubm90YXRpb25IZWxwZXIuZ2V0TmF2aWdhdGlvblBhdGgoc1BhdGgpO1xuXHRpZiAoc05hdmlnYXRpb25QYXRoKSB7XG5cdFx0cmV0dXJuIFwie3BhdGg6J1wiICsgc05hdmlnYXRpb25QYXRoICsgXCInfVwiO1xuXHR9IGVsc2Uge1xuXHRcdC8vbm8gbmF2aWdhdGlvbiBwcm9wZXJ0eSBuZWVkcyBlbXB0eSBvYmplY3Rcblx0XHRyZXR1cm4gXCJ7cGF0aDogJyd9XCI7XG5cdH1cbn07XG5cbi8qKlxuICogRnVuY3Rpb24gdG8gY2hlY2sgaWYgZHJhZnQgcGF0dGVybiBpcyBzdXBwb3J0ZWQuXG4gKlxuICogQHBhcmFtIG9Bbm5vdGF0aW9ucyBBbm5vdGF0aW9ucyBvZiB0aGUgY3VycmVudCBlbnRpdHkgc2V0LlxuICogQHJldHVybnMgUmV0dXJucyB0aGUgQm9vbGVhbiB2YWx1ZSBiYXNlZCBvbiBkcmFmdCBzdGF0ZVxuICovXG5leHBvcnQgY29uc3QgY2hlY2tEcmFmdFN0YXRlID0gZnVuY3Rpb24gKG9Bbm5vdGF0aW9uczogYW55KSB7XG5cdGlmIChcblx0XHRvQW5ub3RhdGlvbnNbXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRyYWZ0Um9vdFwiXSAmJlxuXHRcdG9Bbm5vdGF0aW9uc1tcIkBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnRSb290XCJdW1wiRWRpdEFjdGlvblwiXVxuXHQpIHtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cbn07XG5cbi8qKlxuICogRnVuY3Rpb24gdG8gZ2V0IHRoZSB2aXNpYmlsaXR5IGZvciB0aGUgU3dpdGNoVG9BY3RpdmUgYnV0dG9uIGluIHRoZSBvYmplY3QgcGFnZSBvciBzdWJvYmplY3QgcGFnZS5cbiAqXG4gKiBAcGFyYW0gb0Fubm90YXRpb25zIEFubm90YXRpb25zIG9mIHRoZSBjdXJyZW50IGVudGl0eSBzZXQuXG4gKiBAcmV0dXJucyBSZXR1cm5zIGV4cHJlc3Npb24gYmluZGluZyBvciBCb29sZWFuIHZhbHVlIGJhc2VkIG9uIHRoZSBkcmFmdCBzdGF0ZVxuICovXG5leHBvcnQgY29uc3QgZ2V0U3dpdGNoVG9BY3RpdmVWaXNpYmlsaXR5ID0gZnVuY3Rpb24gKG9Bbm5vdGF0aW9uczogYW55KTogYW55IHtcblx0aWYgKGNoZWNrRHJhZnRTdGF0ZShvQW5ub3RhdGlvbnMpKSB7XG5cdFx0cmV0dXJuIFwiez0gKCV7RHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEvRHJhZnRJc0NyZWF0ZWRCeU1lfSkgPyAoICR7dWk+L2lzRWRpdGFibGV9ICYmICEke3VpPmNyZWF0ZU1vZGV9ICYmICV7RHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEvRHJhZnRJc0NyZWF0ZWRCeU1lfSApIDogZmFsc2UgfVwiO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxufTtcblxuLyoqXG4gKiBGdW5jdGlvbiB0byBnZXQgdGhlIHZpc2liaWxpdHkgZm9yIHRoZSBTd2l0Y2hUb0RyYWZ0IGJ1dHRvbiBpbiB0aGUgb2JqZWN0IHBhZ2Ugb3Igc3Vib2JqZWN0IHBhZ2UuXG4gKlxuICogQHBhcmFtIG9Bbm5vdGF0aW9ucyBBbm5vdGF0aW9ucyBvZiB0aGUgY3VycmVudCBlbnRpdHkgc2V0LlxuICogQHJldHVybnMgUmV0dXJucyBleHByZXNzaW9uIGJpbmRpbmcgb3IgQm9vbGVhbiB2YWx1ZSBiYXNlZCBvbiB0aGUgZHJhZnQgc3RhdGVcbiAqL1xuZXhwb3J0IGNvbnN0IGdldFN3aXRjaFRvRHJhZnRWaXNpYmlsaXR5ID0gZnVuY3Rpb24gKG9Bbm5vdGF0aW9uczogYW55KTogYW55IHtcblx0aWYgKGNoZWNrRHJhZnRTdGF0ZShvQW5ub3RhdGlvbnMpKSB7XG5cdFx0cmV0dXJuIFwiez0gKCV7RHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEvRHJhZnRJc0NyZWF0ZWRCeU1lfSkgPyAoICEoJHt1aT4vaXNFZGl0YWJsZX0pICYmICEke3VpPmNyZWF0ZU1vZGV9ICYmICR7SGFzRHJhZnRFbnRpdHl9ICYmICV7RHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEvRHJhZnRJc0NyZWF0ZWRCeU1lfSApIDogZmFsc2UgfVwiO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxufTtcblxuLyoqXG4gKiBGdW5jdGlvbiB0byBnZXQgdGhlIHZpc2liaWxpdHkgZm9yIHRoZSBTd2l0Y2hEcmFmdEFuZEFjdGl2ZSBidXR0b24gaW4gdGhlIG9iamVjdCBwYWdlIG9yIHN1Ym9iamVjdCBwYWdlLlxuICpcbiAqIEBwYXJhbSBvQW5ub3RhdGlvbnMgQW5ub3RhdGlvbnMgb2YgdGhlIGN1cnJlbnQgZW50aXR5IHNldC5cbiAqIEByZXR1cm5zIFJldHVybnMgZXhwcmVzc2lvbiBiaW5kaW5nIG9yIEJvb2xlYW4gdmFsdWUgYmFzZWQgb24gdGhlIGRyYWZ0IHN0YXRlXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRTd2l0Y2hEcmFmdEFuZEFjdGl2ZVZpc2liaWxpdHkgPSBmdW5jdGlvbiAob0Fubm90YXRpb25zOiBhbnkpOiBhbnkge1xuXHRpZiAoY2hlY2tEcmFmdFN0YXRlKG9Bbm5vdGF0aW9ucykpIHtcblx0XHRyZXR1cm4gXCJ7PSAoJXtEcmFmdEFkbWluaXN0cmF0aXZlRGF0YS9EcmFmdElzQ3JlYXRlZEJ5TWV9KSA/ICggISR7dWk+Y3JlYXRlTW9kZX0gJiYgJXtEcmFmdEFkbWluaXN0cmF0aXZlRGF0YS9EcmFmdElzQ3JlYXRlZEJ5TWV9ICkgOiBmYWxzZSB9XCI7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG59O1xuXG4vKipcbiAqIEZ1bmN0aW9uIHRvIGZpbmQgYW4gYWN0aW9uIGZyb20gdGhlIGFycmF5IG9mIGhlYWRlciBhY3Rpb25zIGluIHRoZSBjb252ZXJ0ZXIgY29udGV4dC5cbiAqXG4gKiBAcGFyYW0gYUNvbnZlcnRlckNvbnRleHRIZWFkZXJBY3Rpb25zIEFycmF5IG9mICdoZWFkZXInIGFjdGlvbnMgb24gdGhlIG9iamVjdCBwYWdlLlxuICogQHBhcmFtIHNBY3Rpb25UeXBlIFRoZSBhY3Rpb24gdHlwZVxuICogQHJldHVybnMgVGhlIGFjdGlvbiB3aXRoIHRoZSBtYXRjaGluZyBhY3Rpb24gdHlwZVxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGNvbnN0IF9maW5kQWN0aW9uID0gZnVuY3Rpb24gKGFDb252ZXJ0ZXJDb250ZXh0SGVhZGVyQWN0aW9uczogYW55W10sIHNBY3Rpb25UeXBlOiBzdHJpbmcpIHtcblx0bGV0IG9BY3Rpb247XG5cdGlmIChhQ29udmVydGVyQ29udGV4dEhlYWRlckFjdGlvbnMgJiYgYUNvbnZlcnRlckNvbnRleHRIZWFkZXJBY3Rpb25zLmxlbmd0aCkge1xuXHRcdG9BY3Rpb24gPSBhQ29udmVydGVyQ29udGV4dEhlYWRlckFjdGlvbnMuZmluZChmdW5jdGlvbiAob0hlYWRlckFjdGlvbjogYW55KSB7XG5cdFx0XHRyZXR1cm4gb0hlYWRlckFjdGlvbi50eXBlID09PSBzQWN0aW9uVHlwZTtcblx0XHR9KTtcblx0fVxuXHRyZXR1cm4gb0FjdGlvbjtcbn07XG5cbi8qKlxuICogRnVuY3Rpb24gdG8gZm9ybWF0IHRoZSAnZW5hYmxlZCcgcHJvcGVydHkgZm9yIHRoZSBEZWxldGUgYnV0dG9uIG9uIHRoZSBvYmplY3QgcGFnZSBvciBzdWJvYmplY3QgcGFnZSBpbiBjYXNlIG9mIGEgQ29tbWFuZCBFeGVjdXRpb24uXG4gKlxuICogQHBhcmFtIGFDb252ZXJ0ZXJDb250ZXh0SGVhZGVyQWN0aW9ucyBBcnJheSBvZiBoZWFkZXIgYWN0aW9ucyBvbiB0aGUgb2JqZWN0IHBhZ2VcbiAqIEByZXR1cm5zIFJldHVybnMgZXhwcmVzc2lvbiBiaW5kaW5nIG9yIEJvb2xlYW4gdmFsdWUgZnJvbSB0aGUgY29udmVydGVyIG91dHB1dFxuICovXG5leHBvcnQgY29uc3QgZ2V0RGVsZXRlQ29tbWFuZEV4ZWN1dGlvbkVuYWJsZWQgPSBmdW5jdGlvbiAoYUNvbnZlcnRlckNvbnRleHRIZWFkZXJBY3Rpb25zOiBhbnlbXSkge1xuXHRjb25zdCBvRGVsZXRlQWN0aW9uID0gX2ZpbmRBY3Rpb24oYUNvbnZlcnRlckNvbnRleHRIZWFkZXJBY3Rpb25zLCBcIlNlY29uZGFyeVwiKTtcblx0cmV0dXJuIG9EZWxldGVBY3Rpb24gPyBvRGVsZXRlQWN0aW9uLmVuYWJsZWQgOiBcInRydWVcIjtcbn07XG5cbi8qKlxuICogRnVuY3Rpb24gdG8gZm9ybWF0IHRoZSAndmlzaWJsZScgcHJvcGVydHkgZm9yIHRoZSBEZWxldGUgYnV0dG9uIG9uIHRoZSBvYmplY3QgcGFnZSBvciBzdWJvYmplY3QgcGFnZSBpbiBjYXNlIG9mIGEgQ29tbWFuZCBFeGVjdXRpb24uXG4gKlxuICogQHBhcmFtIGFDb252ZXJ0ZXJDb250ZXh0SGVhZGVyQWN0aW9ucyBBcnJheSBvZiBoZWFkZXIgYWN0aW9ucyBvbiB0aGUgb2JqZWN0IHBhZ2VcbiAqIEByZXR1cm5zIFJldHVybnMgZXhwcmVzc2lvbiBiaW5kaW5nIG9yIEJvb2xlYW4gdmFsdWUgZnJvbSB0aGUgY29udmVydGVyIG91dHB1dFxuICovXG5leHBvcnQgY29uc3QgZ2V0RGVsZXRlQ29tbWFuZEV4ZWN1dGlvblZpc2libGUgPSBmdW5jdGlvbiAoYUNvbnZlcnRlckNvbnRleHRIZWFkZXJBY3Rpb25zOiBhbnlbXSkge1xuXHRjb25zdCBvRGVsZXRlQWN0aW9uID0gX2ZpbmRBY3Rpb24oYUNvbnZlcnRlckNvbnRleHRIZWFkZXJBY3Rpb25zLCBcIlNlY29uZGFyeVwiKTtcblx0cmV0dXJuIG9EZWxldGVBY3Rpb24gPyBvRGVsZXRlQWN0aW9uLnZpc2libGUgOiBcInRydWVcIjtcbn07XG5cbi8qKlxuICogRnVuY3Rpb24gdG8gZm9ybWF0IHRoZSAndmlzaWJsZScgcHJvcGVydHkgZm9yIHRoZSBFZGl0IGJ1dHRvbiBvbiB0aGUgb2JqZWN0IHBhZ2Ugb3Igc3Vib2JqZWN0IHBhZ2UgaW4gY2FzZSBvZiBhIENvbW1hbmQgRXhlY3V0aW9uLlxuICpcbiAqIEBwYXJhbSBhQ29udmVydGVyQ29udGV4dEhlYWRlckFjdGlvbnMgQXJyYXkgb2YgaGVhZGVyIGFjdGlvbnMgb24gdGhlIG9iamVjdCBwYWdlXG4gKiBAcmV0dXJucyBSZXR1cm5zIGV4cHJlc3Npb24gYmluZGluZyBvciBCb29sZWFuIHZhbHVlIGZyb20gdGhlIGNvbnZlcnRlciBvdXRwdXRcbiAqL1xuZXhwb3J0IGNvbnN0IGdldEVkaXRDb21tYW5kRXhlY3V0aW9uVmlzaWJsZSA9IGZ1bmN0aW9uIChhQ29udmVydGVyQ29udGV4dEhlYWRlckFjdGlvbnM6IGFueVtdKSB7XG5cdGNvbnN0IG9FZGl0QWN0aW9uID0gX2ZpbmRBY3Rpb24oYUNvbnZlcnRlckNvbnRleHRIZWFkZXJBY3Rpb25zLCBcIlByaW1hcnlcIik7XG5cdHJldHVybiBvRWRpdEFjdGlvbiA/IG9FZGl0QWN0aW9uLnZpc2libGUgOiBcInRydWVcIjtcbn07XG5cbi8qKlxuICogRnVuY3Rpb24gdG8gZm9ybWF0IHRoZSAnZW5hYmxlZCcgcHJvcGVydHkgZm9yIHRoZSBFZGl0IGJ1dHRvbiBvbiB0aGUgb2JqZWN0IHBhZ2Ugb3Igc3Vib2JqZWN0IHBhZ2UgaW4gY2FzZSBvZiBhIENvbW1hbmQgRXhlY3V0aW9uLlxuICpcbiAqIEBwYXJhbSBhQ29udmVydGVyQ29udGV4dEhlYWRlckFjdGlvbnMgQXJyYXkgb2YgaGVhZGVyIGFjdGlvbnMgb24gdGhlIG9iamVjdCBwYWdlXG4gKiBAcmV0dXJucyBSZXR1cm5zIGV4cHJlc3Npb24gYmluZGluZyBvciBCb29sZWFuIHZhbHVlIGZyb20gdGhlIGNvbnZlcnRlciBvdXRwdXRcbiAqL1xuZXhwb3J0IGNvbnN0IGdldEVkaXRDb21tYW5kRXhlY3V0aW9uRW5hYmxlZCA9IGZ1bmN0aW9uIChhQ29udmVydGVyQ29udGV4dEhlYWRlckFjdGlvbnM6IGFueVtdKSB7XG5cdGNvbnN0IG9FZGl0QWN0aW9uID0gX2ZpbmRBY3Rpb24oYUNvbnZlcnRlckNvbnRleHRIZWFkZXJBY3Rpb25zLCBcIlByaW1hcnlcIik7XG5cdHJldHVybiBvRWRpdEFjdGlvbiA/IG9FZGl0QWN0aW9uLmVuYWJsZWQgOiBcInRydWVcIjtcbn07XG5cbi8qKlxuICogRnVuY3Rpb24gdG8gZ2V0IHRoZSBFZGl0QWN0aW9uIGZyb20gdGhlIEVudGl0eXNldCBiYXNlZCBvbiBEcmFmdCBvciBzdGlja3kgYmFzZWQgYXBwbGljYXRpb24uXG4gKlxuICogQHBhcmFtIFtvRW50aXR5U2V0XSBUaGUgdmFsdWUgZnJvbSB0aGUgZXhwcmVzc2lvbi5cbiAqIEByZXR1cm5zIFJldHVybnMgZXhwcmVzc2lvbiBiaW5kaW5nIG9yIGJvb2xlYW4gdmFsdWUgYmFzZWQgb24gdlJhd1ZhbHVlICYgb0RyYWZ0Tm9kZVxuICovXG5leHBvcnQgY29uc3QgZ2V0RWRpdEFjdGlvbiA9IGZ1bmN0aW9uIChvRW50aXR5U2V0OiBDb250ZXh0KSB7XG5cdGNvbnN0IHNQYXRoID0gb0VudGl0eVNldC5nZXRQYXRoKCksXG5cdFx0b0Fubm90YXRpb25zID0gb0VudGl0eVNldC5nZXRPYmplY3QoYCR7c1BhdGh9QGApO1xuXHRjb25zdCBiRHJhZnRSb290ID0gb0Fubm90YXRpb25zLmhhc093blByb3BlcnR5KFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EcmFmdFJvb3RcIik7XG5cdGNvbnN0IGJTdGlja3lTZXNzaW9uID0gb0Fubm90YXRpb25zLmhhc093blByb3BlcnR5KFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlNlc3Npb24udjEuU3RpY2t5U2Vzc2lvblN1cHBvcnRlZFwiKTtcblx0bGV0IHNBY3Rpb25OYW1lO1xuXHRpZiAoYkRyYWZ0Um9vdCkge1xuXHRcdHNBY3Rpb25OYW1lID0gb0VudGl0eVNldC5nZXRPYmplY3QoYCR7c1BhdGh9QGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EcmFmdFJvb3QvRWRpdEFjdGlvbmApO1xuXHR9IGVsc2UgaWYgKGJTdGlja3lTZXNzaW9uKSB7XG5cdFx0c0FjdGlvbk5hbWUgPSBvRW50aXR5U2V0LmdldE9iamVjdChgJHtzUGF0aH1AY29tLnNhcC52b2NhYnVsYXJpZXMuU2Vzc2lvbi52MS5TdGlja3lTZXNzaW9uU3VwcG9ydGVkL0VkaXRBY3Rpb25gKTtcblx0fVxuXHRyZXR1cm4gIXNBY3Rpb25OYW1lID8gc0FjdGlvbk5hbWUgOiBgJHtzUGF0aH0vJHtzQWN0aW9uTmFtZX1gO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzUmVhZE9ubHlGcm9tU3RhdGljQW5ub3RhdGlvbnMgPSBmdW5jdGlvbiAob0Fubm90YXRpb25zOiBhbnksIG9GaWVsZENvbnRyb2w6IGFueSkge1xuXHRsZXQgYkNvbXB1dGVkLCBiSW1tdXRhYmxlLCBiUmVhZE9ubHk7XG5cdGlmIChvQW5ub3RhdGlvbnMgJiYgb0Fubm90YXRpb25zW1wiQE9yZy5PRGF0YS5Db3JlLlYxLkNvbXB1dGVkXCJdKSB7XG5cdFx0YkNvbXB1dGVkID0gb0Fubm90YXRpb25zW1wiQE9yZy5PRGF0YS5Db3JlLlYxLkNvbXB1dGVkXCJdLkJvb2wgPyBvQW5ub3RhdGlvbnNbXCJAT3JnLk9EYXRhLkNvcmUuVjEuQ29tcHV0ZWRcIl0uQm9vbCA9PSBcInRydWVcIiA6IHRydWU7XG5cdH1cblx0aWYgKG9Bbm5vdGF0aW9ucyAmJiBvQW5ub3RhdGlvbnNbXCJAT3JnLk9EYXRhLkNvcmUuVjEuSW1tdXRhYmxlXCJdKSB7XG5cdFx0YkltbXV0YWJsZSA9IG9Bbm5vdGF0aW9uc1tcIkBPcmcuT0RhdGEuQ29yZS5WMS5JbW11dGFibGVcIl0uQm9vbCA/IG9Bbm5vdGF0aW9uc1tcIkBPcmcuT0RhdGEuQ29yZS5WMS5JbW11dGFibGVcIl0uQm9vbCA9PSBcInRydWVcIiA6IHRydWU7XG5cdH1cblx0YlJlYWRPbmx5ID0gYkNvbXB1dGVkIHx8IGJJbW11dGFibGU7XG5cblx0aWYgKG9GaWVsZENvbnRyb2wpIHtcblx0XHRiUmVhZE9ubHkgPSBiUmVhZE9ubHkgfHwgb0ZpZWxkQ29udHJvbCA9PSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5GaWVsZENvbnRyb2xUeXBlL1JlYWRPbmx5XCI7XG5cdH1cblx0aWYgKGJSZWFkT25seSkge1xuXHRcdHJldHVybiB0cnVlO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxufTtcblxuZXhwb3J0IGNvbnN0IHJlYWRPbmx5RXhwcmVzc2lvbkZyb21EeW5hbWljQW5ub3RhdGlvbnMgPSBmdW5jdGlvbiAob0ZpZWxkQ29udHJvbDogYW55KSB7XG5cdGxldCBzSXNGaWVsZENvbnRyb2xQYXRoUmVhZE9ubHk7XG5cdGlmIChvRmllbGRDb250cm9sKSB7XG5cdFx0aWYgKChNYW5hZ2VkT2JqZWN0IGFzIGFueSkuYmluZGluZ1BhcnNlcihvRmllbGRDb250cm9sKSkge1xuXHRcdFx0c0lzRmllbGRDb250cm9sUGF0aFJlYWRPbmx5ID0gXCIlXCIgKyBvRmllbGRDb250cm9sICsgXCIgPT09IDEgXCI7XG5cdFx0fVxuXHR9XG5cdGlmIChzSXNGaWVsZENvbnRyb2xQYXRoUmVhZE9ubHkpIHtcblx0XHRyZXR1cm4gXCJ7PSBcIiArIHNJc0ZpZWxkQ29udHJvbFBhdGhSZWFkT25seSArIFwiPyBmYWxzZSA6IHRydWUgfVwiO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cbn07XG5cbi8qXG4gKiBGdW5jdGlvbiB0byBnZXQgdGhlIGV4cHJlc3Npb24gZm9yIGNoYXJ0IFRpdGxlIFByZXNzXG4gKlxuICogQGZ1bmN0aW9ud1xuICogQHBhcmFtIHtvQ29uZmlndXJhdGlvbn0gW29Db25maWd1cmF0aW9uc10gY29udHJvbCBjb25maWd1cmF0aW9uIGZyb20gbWFuaWZlc3RcbiAqICBAcGFyYW0ge29NYW5pZmVzdH0gW29NYW5pZmVzdF0gT3V0Ym91bmRzIGZyb20gbWFuaWZlc3RcbiAqIHJldHVybnMge1N0cmluZ30gW3NDb2xsZWN0aW9uTmFtZV0gQ29sbGVjdGlvbiBOYW1lIG9mIHRoZSBNaWNybyBDaGFydFxuICpcbiAqIHJldHVybnMge1N0cmluZ30gW0V4cHJlc3Npb25dIEhhbmRsZXIgRXhwcmVzc2lvbiBmb3IgdGhlIHRpdGxlIHByZXNzXG4gKlxuICovXG5leHBvcnQgY29uc3QgZ2V0RXhwcmVzc2lvbkZvck1pY3JvQ2hhcnRUaXRsZVByZXNzID0gZnVuY3Rpb24gKG9Db25maWd1cmF0aW9uOiBhbnksIG9NYW5pZmVzdE91dGJvdW5kOiBhbnksIHNDb2xsZWN0aW9uTmFtZTogYW55KSB7XG5cdGlmIChvQ29uZmlndXJhdGlvbikge1xuXHRcdGlmIChcblx0XHRcdChvQ29uZmlndXJhdGlvbltcInRhcmdldE91dGJvdW5kXCJdICYmIG9Db25maWd1cmF0aW9uW1widGFyZ2V0T3V0Ym91bmRcIl1bXCJvdXRib3VuZFwiXSkgfHxcblx0XHRcdChvQ29uZmlndXJhdGlvbltcInRhcmdldE91dGJvdW5kXCJdICYmIG9Db25maWd1cmF0aW9uW1widGFyZ2V0T3V0Ym91bmRcIl1bXCJvdXRib3VuZFwiXSAmJiBvQ29uZmlndXJhdGlvbltcInRhcmdldFNlY3Rpb25zXCJdKVxuXHRcdCkge1xuXHRcdFx0cmV0dXJuIChcblx0XHRcdFx0XCIuaGFuZGxlcnMub25EYXRhUG9pbnRUaXRsZVByZXNzZWQoJGNvbnRyb2xsZXIsICR7JHNvdXJjZT4vfSwnXCIgK1xuXHRcdFx0XHRKU09OLnN0cmluZ2lmeShvTWFuaWZlc3RPdXRib3VuZCkgK1xuXHRcdFx0XHRcIicsJ1wiICtcblx0XHRcdFx0b0NvbmZpZ3VyYXRpb25bXCJ0YXJnZXRPdXRib3VuZFwiXVtcIm91dGJvdW5kXCJdICtcblx0XHRcdFx0XCInLCdcIiArXG5cdFx0XHRcdHNDb2xsZWN0aW9uTmFtZSArXG5cdFx0XHRcdFwiJyApXCJcblx0XHRcdCk7XG5cdFx0fSBlbHNlIGlmIChvQ29uZmlndXJhdGlvbltcInRhcmdldFNlY3Rpb25zXCJdKSB7XG5cdFx0XHRyZXR1cm4gXCIuaGFuZGxlcnMubmF2aWdhdGVUb1N1YlNlY3Rpb24oJGNvbnRyb2xsZXIsICdcIiArIEpTT04uc3RyaW5naWZ5KG9Db25maWd1cmF0aW9uW1widGFyZ2V0U2VjdGlvbnNcIl0pICsgXCInKVwiO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblx0fVxufTtcblxuLypcbiAqIEZ1bmN0aW9uIHRvIHJlbmRlciBDaGFydCBUaXRsZSBhcyBMaW5rXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0ge29Db250cm9sQ29uZmlndXJhdGlvbn0gW29Db25maWd1cmF0aW9uc10gY29udHJvbCBjb25maWd1cmF0aW9uIGZyb20gbWFuaWZlc3RcbiAqIHJldHVybnMge1N0cmluZ30gW3NLZXldIEZvciB0aGUgVGFyZ2V0T3V0Ym91bmQgYW5kIFRhcmdldFNlY3Rpb25cbiAqXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRNaWNyb0NoYXJ0VGl0bGVBc0xpbmsgPSBmdW5jdGlvbiAob0NvbnRyb2xDb25maWd1cmF0aW9uOiBhbnkpIHtcblx0aWYgKFxuXHRcdG9Db250cm9sQ29uZmlndXJhdGlvbiAmJlxuXHRcdChvQ29udHJvbENvbmZpZ3VyYXRpb25bXCJ0YXJnZXRPdXRib3VuZFwiXSB8fCAob0NvbnRyb2xDb25maWd1cmF0aW9uW1widGFyZ2V0T3V0Ym91bmRcIl0gJiYgb0NvbnRyb2xDb25maWd1cmF0aW9uW1widGFyZ2V0U2VjdGlvbnNcIl0pKVxuXHQpIHtcblx0XHRyZXR1cm4gXCJFeHRlcm5hbFwiO1xuXHR9IGVsc2UgaWYgKG9Db250cm9sQ29uZmlndXJhdGlvbiAmJiBvQ29udHJvbENvbmZpZ3VyYXRpb25bXCJ0YXJnZXRTZWN0aW9uc1wiXSkge1xuXHRcdHJldHVybiBcIkluUGFnZVwiO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBcIk5vbmVcIjtcblx0fVxufTtcblxuLyogR2V0IGdyb3VwSWQgZnJvbSBjb250cm9sIGNvbmZpZ3VyYXRpb25cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb0NvbmZpZ3VyYXRpb25zXSBjb250cm9sIGNvbmZpZ3VyYXRpb24gZnJvbSBtYW5pZmVzdFxuICogQHBhcmFtIHtTdHJpbmd9IFtzQW5ub3RhdGlvblBhdGhdIEFubm90YXRpb24gUGF0aCBmb3IgdGhlIGNvbmZpZ3VyYXRpb25cbiAqIEBkZXNjcmlwdGlvbiBVc2VkIHRvIGdldCB0aGUgZ3JvdXBJZCBmb3IgRGF0YVBvaW50cyBhbmQgTWljcm9DaGFydHMgaW4gdGhlIEhlYWRlci5cbiAqXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRHcm91cElkRnJvbUNvbmZpZyA9IGZ1bmN0aW9uIChvQ29uZmlndXJhdGlvbnM6IGFueSwgc0Fubm90YXRpb25QYXRoOiBhbnksIHNEZWZhdWx0R3JvdXBJZD86IGFueSkge1xuXHRjb25zdCBvQ29uZmlndXJhdGlvbiA9IG9Db25maWd1cmF0aW9uc1tzQW5ub3RhdGlvblBhdGhdLFxuXHRcdGFBdXRvUGF0dGVybnMgPSBbXCJIZXJvZXNcIiwgXCJEZWNvcmF0aW9uXCIsIFwiV29ya2Vyc1wiLCBcIkxvbmdSdW5uZXJzXCJdO1xuXHRsZXQgc0dyb3VwSWQgPSBzRGVmYXVsdEdyb3VwSWQ7XG5cdGlmIChcblx0XHRvQ29uZmlndXJhdGlvbiAmJlxuXHRcdG9Db25maWd1cmF0aW9uLnJlcXVlc3RHcm91cElkICYmXG5cdFx0YUF1dG9QYXR0ZXJucy5zb21lKGZ1bmN0aW9uIChhdXRvUGF0dGVybjogc3RyaW5nKSB7XG5cdFx0XHRyZXR1cm4gYXV0b1BhdHRlcm4gPT09IG9Db25maWd1cmF0aW9uLnJlcXVlc3RHcm91cElkO1xuXHRcdH0pXG5cdCkge1xuXHRcdHNHcm91cElkID0gXCIkYXV0by5cIiArIG9Db25maWd1cmF0aW9uLnJlcXVlc3RHcm91cElkO1xuXHR9XG5cdHJldHVybiBzR3JvdXBJZDtcbn07XG5cbi8qXG4gKiBHZXQgQ29udGV4dCBCaW5kaW5nIHdpdGggZ3JvdXBJZCBmcm9tIGNvbnRyb2wgY29uZmlndXJhdGlvblxuICpcbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHtPYmplY3R9IFtvQ29uZmlndXJhdGlvbnNdIGNvbnRyb2wgY29uZmlndXJhdGlvbiBmcm9tIG1hbmlmZXN0XG4gKiBAcGFyYW0ge1N0cmluZ30gW3NLZXldIEFubm90YXRpb24gUGF0aCBmb3Igb2YgdGhlIGNvbmZpZ3VyYXRpb25cbiAqIEBkZXNjcmlwdGlvbiBVc2VkIHRvIGdldCB0aGUgYmluZGluZyBmb3IgRGF0YVBvaW50cyBpbiB0aGUgSGVhZGVyLlxuICpcbiAqL1xuZXhwb3J0IGNvbnN0IGdldEJpbmRpbmdXaXRoR3JvdXBJZEZyb21Db25maWcgPSBmdW5jdGlvbiAob0NvbmZpZ3VyYXRpb25zOiBhbnksIHNLZXk6IGFueSkge1xuXHRjb25zdCBzR3JvdXBJZCA9IGdldEdyb3VwSWRGcm9tQ29uZmlnKG9Db25maWd1cmF0aW9ucywgc0tleSk7XG5cdGxldCBzQmluZGluZztcblx0aWYgKHNHcm91cElkKSB7XG5cdFx0c0JpbmRpbmcgPSBcInsgcGF0aCA6ICcnLCBwYXJhbWV0ZXJzIDogeyAkJGdyb3VwSWQgOiAnXCIgKyBzR3JvdXBJZCArIFwiJyB9IH1cIjtcblx0fVxuXHRyZXR1cm4gc0JpbmRpbmc7XG59O1xuXG4vKipcbiAqIE1ldGhvZCB0byBjaGVjayB3aGV0aGVyIGEgRmllbGRHcm91cCBjb25zaXN0cyBvZiBvbmx5IDEgRGF0YUZpZWxkIHdpdGggTXVsdGlMaW5lIFRleHQgYW5ub3RhdGlvbi5cbiAqXG4gKiBAcGFyYW0gYUZvcm1FbGVtZW50cyBBIGNvbGxlY3Rpb24gb2YgZm9ybSBlbGVtZW50cyB1c2VkIGluIHRoZSBjdXJyZW50IGZpZWxkIGdyb3VwXG4gKiBAcmV0dXJucyBSZXR1cm5zIHRydWUgaWYgb25seSAxIGRhdGEgZmllbGQgd2l0aCBNdWx0aWxpbmUgVGV4dCBhbm5vdGF0aW9uIGV4aXN0cy5cbiAqL1xuZXhwb3J0IGNvbnN0IGRvZXNGaWVsZEdyb3VwQ29udGFpbk9ubHlPbmVNdWx0aUxpbmVEYXRhRmllbGQgPSBmdW5jdGlvbiAoYUZvcm1FbGVtZW50czogYW55W10pIHtcblx0cmV0dXJuIGFGb3JtRWxlbWVudHMgJiYgYUZvcm1FbGVtZW50cy5sZW5ndGggPT09IDEgJiYgISFhRm9ybUVsZW1lbnRzWzBdLmlzVmFsdWVNdWx0aWxpbmVUZXh0O1xufTtcblxuLypcbiAqIEdldCBWaXNpYmxpdHkgb2YgYnJlYWRjcnVtYnMuXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0ge09iamVjdH0gW29WaWV3RGF0YV0gVmlld0RhdGEgbW9kZWxcbiAqIHJldHVybnMgeyp9IEV4cHJlc3Npb24gb3IgYm9vbGVhblxuICovXG5leHBvcnQgY29uc3QgZ2V0VmlzaWJsZUV4cHJlc3Npb25Gb3JCcmVhZGNydW1icyA9IGZ1bmN0aW9uIChvVmlld0RhdGE6IGFueSkge1xuXHRyZXR1cm4gb1ZpZXdEYXRhLnNob3dCcmVhZENydW1icyAmJiBvVmlld0RhdGEuZmNsRW5hYmxlZCAhPT0gdW5kZWZpbmVkID8gXCJ7ZmNsaGVscGVyPi9icmVhZENydW1iSXNWaXNpYmxlfVwiIDogb1ZpZXdEYXRhLnNob3dCcmVhZENydW1icztcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRTaGFyZUJ1dHRvblZpc2liaWxpdHkgPSBmdW5jdGlvbiAodmlld0RhdGE6IGFueSkge1xuXHRsZXQgc1NoYXJlQnV0dG9uVmlzaWJpbGl0eUV4cCA9IFwiISR7dWk+Y3JlYXRlTW9kZX1cIjtcblx0aWYgKHZpZXdEYXRhLmZjbEVuYWJsZWQpIHtcblx0XHRzU2hhcmVCdXR0b25WaXNpYmlsaXR5RXhwID0gXCIke2ZjbGhlbHBlcj4vc2hvd1NoYXJlSWNvbn0gJiYgXCIgKyBzU2hhcmVCdXR0b25WaXNpYmlsaXR5RXhwO1xuXHR9XG5cdHJldHVybiBcIns9IFwiICsgc1NoYXJlQnV0dG9uVmlzaWJpbGl0eUV4cCArIFwiIH1cIjtcbn07XG5cbi8qXG4gKiBHZXRzIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSBoZWFkZXIgaW5mbyBpbiBlZGl0IG1vZGVcbiAqXG4gKiBJZiBlaXRoZXIgdGhlIHRpdGxlIG9yIGRlc2NyaXB0aW9uIGZpZWxkIGZyb20gdGhlIGhlYWRlciBhbm5vdGF0aW9ucyBhcmUgZWRpdGFibGUsIHRoZW4gdGhlXG4gKiBlZGl0YWJsZSBoZWFkZXIgaW5mbyBpcyB2aXNpYmxlLlxuICpcbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHtvYmplY3R9IFtvQW5ub3RhdGlvbnNdIEFubm90YXRpb25zIG9iamVjdCBmb3IgZ2l2ZW4gZW50aXR5IHNldFxuICogQHBhcmFtIHtvYmplY3R9IFtvRmllbGRDb250cm9sXSBmaWVsZCBjb250cm9sXG4gKiByZXR1cm5zIHsqfSAgYmluZGluZyBleHByZXNzaW9uIG9yIGJvb2xlYW4gdmFsdWUgcmVzb2x2ZWQgZm9ybSBmdW5jaXRvbnMgaXNSZWFkT25seUZyb21TdGF0aWNBbm5vdGF0aW9ucyBhbmQgaXNSZWFkT25seUZyb21EeW5hbWljQW5ub3RhdGlvbnNcbiAqL1xuZXhwb3J0IGNvbnN0IGdldFZpc2libGl0eU9mSGVhZGVySW5mbyA9IGZ1bmN0aW9uIChcblx0b1RpdGxlQW5ub3RhdGlvbnM6IGFueSxcblx0b0Rlc2NyaXB0aW9uQW5ub3RhdGlvbnM6IGFueSxcblx0b0ZpZWxkVGl0bGVGaWVsZENvbnRyb2w6IGFueSxcblx0b0ZpZWxkRGVzY3JpcHRpb25GaWVsZENvbnRyb2w6IGFueVxuKSB7XG5cdC8vIENoZWNrIEFubm90YXRpb25zIGZvciBUaXRsZSBGaWVsZFxuXHQvLyBTZXQgdG8gdHJ1ZSBhbmQgZG9uJ3QgdGFrZSBpbnRvIGFjY291bnQsIGlmIHRoZXJlIGFyZSBubyBhbm5vdGF0aW9ucywgaS5lLiBubyB0aXRsZSBleGlzdHNcblx0Y29uc3QgYklzVGl0bGVSZWFkT25seSA9IG9UaXRsZUFubm90YXRpb25zID8gaXNSZWFkT25seUZyb21TdGF0aWNBbm5vdGF0aW9ucyhvVGl0bGVBbm5vdGF0aW9ucywgb0ZpZWxkVGl0bGVGaWVsZENvbnRyb2wpIDogdHJ1ZTtcblx0Y29uc3QgdGl0bGVFeHByZXNzaW9uID0gcmVhZE9ubHlFeHByZXNzaW9uRnJvbUR5bmFtaWNBbm5vdGF0aW9ucyhvRmllbGRUaXRsZUZpZWxkQ29udHJvbCk7XG5cdC8vIFRoZXJlIGlzIG5vIGV4cHJlc3Npb24gYW5kIHRoZSB0aXRsZSBpcyBub3QgcmVhZHkgb25seSwgdGhpcyBpcyBzdWZmaWNpZW50IGZvciBhbiBlZGl0YWJsZSBoZWFkZXJcblx0aWYgKCFiSXNUaXRsZVJlYWRPbmx5ICYmICF0aXRsZUV4cHJlc3Npb24pIHtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdC8vIENoZWNrIEFubm90YXRpb25zIGZvciBEZXNjcmlwdGlvbiBGaWVsZFxuXHQvLyBTZXQgdG8gdHJ1ZSBhbmQgZG9uJ3QgdGFrZSBpbnRvIGFjY291bnQsIGlmIHRoZXJlIGFyZSBubyBhbm5vdGF0aW9ucywgaS5lLiBubyBkZXNjcmlwdGlvbiBleGlzdHNcblx0Y29uc3QgYklzRGVzY3JpcHRpb25SZWFkT25seSA9IG9EZXNjcmlwdGlvbkFubm90YXRpb25zXG5cdFx0PyBpc1JlYWRPbmx5RnJvbVN0YXRpY0Fubm90YXRpb25zKG9EZXNjcmlwdGlvbkFubm90YXRpb25zLCBvRmllbGREZXNjcmlwdGlvbkZpZWxkQ29udHJvbClcblx0XHQ6IHRydWU7XG5cdGNvbnN0IGRlc2NyaXB0aW9uRXhwcmVzc2lvbiA9IHJlYWRPbmx5RXhwcmVzc2lvbkZyb21EeW5hbWljQW5ub3RhdGlvbnMob0ZpZWxkRGVzY3JpcHRpb25GaWVsZENvbnRyb2wpO1xuXHQvLyBUaGVyZSBpcyBubyBleHByZXNzaW9uIGFuZCB0aGUgZGVzY3JpcHRpb24gaXMgbm90IHJlYWR5IG9ubHksIHRoaXMgaXMgc3VmZmljaWVudCBmb3IgYW4gZWRpdGFibGUgaGVhZGVyXG5cdGlmICghYklzRGVzY3JpcHRpb25SZWFkT25seSAmJiAhZGVzY3JpcHRpb25FeHByZXNzaW9uKSB7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHQvLyBCb3RoIHRpdGxlIGFuZCBkZXNjcmlwdGlvbiBhcmUgbm90IGVkaXRhYmxlIGFuZCB0aGVyZSBhcmUgbm8gZHluYW1pYyBhbm5vdGF0aW9uc1xuXHRpZiAoYklzVGl0bGVSZWFkT25seSAmJiBiSXNEZXNjcmlwdGlvblJlYWRPbmx5ICYmICF0aXRsZUV4cHJlc3Npb24gJiYgIWRlc2NyaXB0aW9uRXhwcmVzc2lvbikge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdC8vIE5vdyBjb21iaW5lIGV4cHJlc3Npb25zXG5cdGlmICh0aXRsZUV4cHJlc3Npb24gJiYgIWRlc2NyaXB0aW9uRXhwcmVzc2lvbikge1xuXHRcdHJldHVybiB0aXRsZUV4cHJlc3Npb247XG5cdH0gZWxzZSBpZiAoIXRpdGxlRXhwcmVzc2lvbiAmJiBkZXNjcmlwdGlvbkV4cHJlc3Npb24pIHtcblx0XHRyZXR1cm4gZGVzY3JpcHRpb25FeHByZXNzaW9uO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBjb21iaW5lVGl0bGVBbmREZXNjcmlwdGlvbkV4cHJlc3Npb24ob0ZpZWxkVGl0bGVGaWVsZENvbnRyb2wsIG9GaWVsZERlc2NyaXB0aW9uRmllbGRDb250cm9sKTtcblx0fVxufTtcblxuZXhwb3J0IGNvbnN0IGNvbWJpbmVUaXRsZUFuZERlc2NyaXB0aW9uRXhwcmVzc2lvbiA9IGZ1bmN0aW9uIChvVGl0bGVGaWVsZENvbnRyb2w6IGFueSwgb0Rlc2NyaXB0aW9uRmllbGRDb250cm9sOiBhbnkpIHtcblx0Ly8gSWYgYm90aCBoZWFkZXIgYW5kIHRpdGxlIGZpZWxkIGFyZSBiYXNlZCBvbiBkeW5tYWljIGZpZWxkIGNvbnRyb2wsIHRoZSBlZGl0YWJsZSBoZWFkZXJcblx0Ly8gaXMgdmlzaWJsZSBpZiBhdCBsZWFzdCBvbmUgb2YgdGhlc2UgaXMgbm90IHJlYWR5IG9ubHlcblx0cmV0dXJuIFwiez0gJVwiICsgb1RpdGxlRmllbGRDb250cm9sICsgXCIgPT09IDEgPyAoICVcIiArIG9EZXNjcmlwdGlvbkZpZWxkQ29udHJvbCArIFwiID09PSAxID8gZmFsc2UgOiB0cnVlICkgOiB0cnVlIH1cIjtcbn07XG5cbi8qXG4gKiBHZXQgRXhwcmVzc2lvbiBvZiBwcmVzcyBldmVudCBvZiBkZWxldGUgYnV0dG9uLlxuICpcbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHtzdHJpbmd9IFtzRW50aXR5U2V0TmFtZV0gRW50aXR5IHNldCBuYW1lXG4gKiByZXR1cm5zIHtzdHJpbmd9ICBiaW5kaW5nIGV4cHJlc3Npb24gLyBmdW5jdGlvbiBzdHJpbmcgZ2VuZXJhdGVkIGZyb20gY29tbWFuaGVscGVyJ3MgZnVuY3Rpb24gZ2VuZXJhdGVGdW5jdGlvblxuICovXG5leHBvcnQgY29uc3QgZ2V0UHJlc3NFeHByZXNzaW9uRm9yRGVsZXRlID0gZnVuY3Rpb24gKHNFbnRpdHlTZXROYW1lOiBhbnkpIHtcblx0Y29uc3Qgc0RlbGV0YWJsZUNvbnRleHRzID0gXCIkeyR2aWV3Pi9nZXRCaW5kaW5nQ29udGV4dH1cIixcblx0XHRzVGl0bGUgPSBcIiR7JHZpZXc+LyNmZTo6T2JqZWN0UGFnZS9nZXRIZWFkZXJUaXRsZS9nZXRFeHBhbmRlZEhlYWRpbmcvZ2V0SXRlbXMvMS9nZXRUZXh0fVwiLFxuXHRcdHNEZXNjcmlwdGlvbiA9IFwiJHskdmlldz4vI2ZlOjpPYmplY3RQYWdlL2dldEhlYWRlclRpdGxlL2dldEV4cGFuZGVkQ29udGVudC8wL2dldEl0ZW1zLzAvZ2V0VGV4dH1cIjtcblx0Y29uc3Qgb1BhcmFtcyA9IHtcblx0XHR0aXRsZTogc1RpdGxlLFxuXHRcdGVudGl0eVNldE5hbWU6IENvbW1vbkhlbHBlci5hZGRTaW5nbGVRdW90ZXMoc0VudGl0eVNldE5hbWUpLFxuXHRcdGRlc2NyaXB0aW9uOiBzRGVzY3JpcHRpb25cblx0fTtcblx0cmV0dXJuIENvbW1vbkhlbHBlci5nZW5lcmF0ZUZ1bmN0aW9uKFwiLmVkaXRGbG93LmRlbGV0ZURvY3VtZW50XCIsIHNEZWxldGFibGVDb250ZXh0cywgQ29tbW9uSGVscGVyLm9iamVjdFRvU3RyaW5nKG9QYXJhbXMpKTtcbn07XG5cbi8qXG4gKiBHZXQgRXhwcmVzc2lvbiBvZiBwcmVzcyBldmVudCBvZiBFZGl0IGJ1dHRvbi5cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7b2JqZWN0fSBbb0RhdGFGaWVsZF0gRGF0YSBmaWVsZCBvYmplY3RcbiAqIEBwYXJhbSB7c3RyaW5nfSBbc0VudGl0eVNldE5hbWVdIEVudGl0eSBzZXQgbmFtZVxuICogQHBhcmFtIHtvYmplY3R9IFtvSGVhZGVyQWN0aW9uXSBIZWFkZXIgYWN0aW9uIG9iamVjdFxuICogcmV0dXJucyB7c3RyaW5nfSAgYmluZGluZyBleHByZXNzaW9uIC8gZnVuY3Rpb24gc3RyaW5nIGdlbmVyYXRlZCBmcm9tIGNvbW1hbmhlbHBlcidzIGZ1bmN0aW9uIGdlbmVyYXRlRnVuY3Rpb25cbiAqL1xuZXhwb3J0IGNvbnN0IGdldFByZXNzRXhwcmVzc2lvbkZvckVkaXQgPSBmdW5jdGlvbiAob0RhdGFGaWVsZDogYW55LCBzRW50aXR5U2V0TmFtZTogYW55LCBvSGVhZGVyQWN0aW9uOiBhbnkpIHtcblx0Y29uc3Qgc0VkaXRhYmxlQ29udGV4dHMgPSBDb21tb25IZWxwZXIuYWRkU2luZ2xlUXVvdGVzKG9EYXRhRmllbGQgJiYgb0RhdGFGaWVsZC5BY3Rpb24pLFxuXHRcdHNEYXRhRmllbGRFbnVtTWVtYmVyID0gb0RhdGFGaWVsZCAmJiBvRGF0YUZpZWxkLkludm9jYXRpb25Hcm91cGluZyAmJiBvRGF0YUZpZWxkLkludm9jYXRpb25Hcm91cGluZ1tcIiRFbnVtTWVtYmVyXCJdLFxuXHRcdHNJbnZvY2F0aW9uR3JvdXAgPSBzRGF0YUZpZWxkRW51bU1lbWJlciA9PT0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5PcGVyYXRpb25Hcm91cGluZ1R5cGUvQ2hhbmdlU2V0XCIgPyBcIkNoYW5nZVNldFwiIDogXCJJc29sYXRlZFwiO1xuXHRjb25zdCBvUGFyYW1zID0ge1xuXHRcdGNvbnRleHRzOiBcIiR7JHZpZXc+L2dldEJpbmRpbmdDb250ZXh0fVwiLFxuXHRcdGVudGl0eVNldE5hbWU6IENvbW1vbkhlbHBlci5hZGRTaW5nbGVRdW90ZXMoc0VudGl0eVNldE5hbWUpLFxuXHRcdGludm9jYXRpb25Hcm91cGluZzogQ29tbW9uSGVscGVyLmFkZFNpbmdsZVF1b3RlcyhzSW52b2NhdGlvbkdyb3VwKSxcblx0XHRtb2RlbDogXCIkeyRzb3VyY2U+L30uZ2V0TW9kZWwoKVwiLFxuXHRcdGxhYmVsOiBDb21tb25IZWxwZXIuYWRkU2luZ2xlUXVvdGVzKG9EYXRhRmllbGQgJiYgb0RhdGFGaWVsZC5MYWJlbCwgdHJ1ZSksXG5cdFx0aXNOYXZpZ2FibGU6IG9IZWFkZXJBY3Rpb24gJiYgb0hlYWRlckFjdGlvbi5pc05hdmlnYWJsZSxcblx0XHRkZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb246XG5cdFx0XHRvSGVhZGVyQWN0aW9uICYmIG9IZWFkZXJBY3Rpb24uZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uID8gYCcke29IZWFkZXJBY3Rpb24uZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9ufSdgIDogdW5kZWZpbmVkXG5cdH07XG5cdHJldHVybiBDb21tb25IZWxwZXIuZ2VuZXJhdGVGdW5jdGlvbihcIi5oYW5kbGVycy5vbkNhbGxBY3Rpb25cIiwgXCIkeyR2aWV3Pi99XCIsIHNFZGl0YWJsZUNvbnRleHRzLCBDb21tb25IZWxwZXIub2JqZWN0VG9TdHJpbmcob1BhcmFtcykpO1xufTtcblxuLypcbiAqIE1ldGhvZCB0byBnZXQgdGhlIGV4cHJlc3Npb24gZm9yIHRoZSAncHJlc3MnIGV2ZW50IGZvciBmb290ZXIgYW5ub3RhdGlvbiBhY3Rpb25zXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0ge29iamVjdH0gW29EYXRhRmllbGRdIERhdGEgZmllbGQgb2JqZWN0XG4gKiBAcGFyYW0ge3N0cmluZ30gW3NFbnRpdHlTZXROYW1lXSBFbnRpdHkgc2V0IG5hbWVcbiAqIEBwYXJhbSB7b2JqZWN0fSBbb0hlYWRlckFjdGlvbl0gSGVhZGVyIGFjdGlvbiBvYmplY3RcbiAqIHJldHVybnMge3N0cmluZ30gIEJpbmRpbmcgZXhwcmVzc2lvbiBvciBmdW5jdGlvbiBzdHJpbmcgdGhhdCBpcyBnZW5lcmF0ZWQgZnJvbSB0aGUgQ29tbW9uaGVscGVyJ3MgZnVuY3Rpb24gZ2VuZXJhdGVGdW5jdGlvblxuICovXG5leHBvcnQgY29uc3QgZ2V0UHJlc3NFeHByZXNzaW9uRm9yRm9vdGVyQW5ub3RhdGlvbkFjdGlvbiA9IGZ1bmN0aW9uIChvRGF0YUZpZWxkOiBhbnksIHNFbnRpdHlTZXROYW1lOiBhbnksIG9IZWFkZXJBY3Rpb246IGFueSkge1xuXHRjb25zdCBzQWN0aW9uQ29udGV4dHMgPSBDb21tb25IZWxwZXIuYWRkU2luZ2xlUXVvdGVzKG9EYXRhRmllbGQgJiYgb0RhdGFGaWVsZC5BY3Rpb24pLFxuXHRcdHNEYXRhRmllbGRFbnVtTWVtYmVyID0gb0RhdGFGaWVsZCAmJiBvRGF0YUZpZWxkLkludm9jYXRpb25Hcm91cGluZyAmJiBvRGF0YUZpZWxkLkludm9jYXRpb25Hcm91cGluZ1tcIiRFbnVtTWVtYmVyXCJdLFxuXHRcdHNJbnZvY2F0aW9uR3JvdXAgPSBzRGF0YUZpZWxkRW51bU1lbWJlciA9PT0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5PcGVyYXRpb25Hcm91cGluZ1R5cGUvQ2hhbmdlU2V0XCIgPyBcIkNoYW5nZVNldFwiIDogXCJJc29sYXRlZFwiO1xuXHRjb25zdCBvUGFyYW1zID0ge1xuXHRcdGNvbnRleHRzOiBcIiR7JHZpZXc+LyNmZTo6T2JqZWN0UGFnZS99LmdldEJpbmRpbmdDb250ZXh0KClcIixcblx0XHRlbnRpdHlTZXROYW1lOiBDb21tb25IZWxwZXIuYWRkU2luZ2xlUXVvdGVzKHNFbnRpdHlTZXROYW1lKSxcblx0XHRpbnZvY2F0aW9uR3JvdXBpbmc6IENvbW1vbkhlbHBlci5hZGRTaW5nbGVRdW90ZXMoc0ludm9jYXRpb25Hcm91cCksXG5cdFx0bW9kZWw6IFwiJHskc291cmNlPi99LmdldE1vZGVsKClcIixcblx0XHRsYWJlbDogQ29tbW9uSGVscGVyLmFkZFNpbmdsZVF1b3RlcyhvRGF0YUZpZWxkICYmIG9EYXRhRmllbGQuTGFiZWwsIHRydWUpLFxuXHRcdGlzTmF2aWdhYmxlOiBvSGVhZGVyQWN0aW9uICYmIG9IZWFkZXJBY3Rpb24uaXNOYXZpZ2FibGUsXG5cdFx0ZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uOlxuXHRcdFx0b0hlYWRlckFjdGlvbiAmJiBvSGVhZGVyQWN0aW9uLmRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbiA/IGAnJHtvSGVhZGVyQWN0aW9uLmRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbn0nYCA6IHVuZGVmaW5lZFxuXHR9O1xuXHRyZXR1cm4gQ29tbW9uSGVscGVyLmdlbmVyYXRlRnVuY3Rpb24oXCIuaGFuZGxlcnMub25DYWxsQWN0aW9uXCIsIFwiJHskdmlldz4vfVwiLCBzQWN0aW9uQ29udGV4dHMsIENvbW1vbkhlbHBlci5vYmplY3RUb1N0cmluZyhvUGFyYW1zKSk7XG59O1xuXG4vKlxuICogR2V0IEV4cHJlc3Npb24gb2YgZXhlY3V0ZSBldmVudCBleHByZXNzaW9uIG9mIHByaW1hcnkgYWN0aW9uLlxuICpcbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHtvYmplY3R9IFtvRGF0YUZpZWxkXSBEYXRhIGZpZWxkIG9iamVjdFxuICogQHBhcmFtIHtzdHJpbmd9IFtzRW50aXR5U2V0TmFtZV0gRW50aXR5IHNldCBuYW1lXG4gKiBAcGFyYW0ge29iamVjdH0gW29IZWFkZXJBY3Rpb25dIEhlYWRlciBhY3Rpb24gb2JqZWN0XG4gKiBAcGFyYW0ge0NvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIHwgc3RyaW5nfSBUaGUgdmlzaWJpbGl0eSBvZiBzZW1hdGljIHBvc2l0aXZlIGFjdGlvblxuICogQHBhcmFtIHtDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiB8IHN0cmluZ30gVGhlIGVuYWJsZW1lbnQgb2Ygc2VtYW50aWMgcG9zaXRpdmUgYWN0aW9uXG4gKiBAcGFyYW0ge0NvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIHwgc3RyaW5nfSBUaGUgRWRpdCBidXR0b24gdmlzaWJpbGl0eVxuICogQHBhcmFtIHtDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiB8IHN0cmluZ30gVGhlIGVuYWJsZW1lbnQgb2YgRWRpdCBidXR0b25cbiAqIHJldHVybnMge3N0cmluZ30gIGJpbmRpbmcgZXhwcmVzc2lvbiAvIGZ1bmN0aW9uIHN0cmluZyBnZW5lcmF0ZWQgZnJvbSBjb21tYW5oZWxwZXIncyBmdW5jdGlvbiBnZW5lcmF0ZUZ1bmN0aW9uXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRQcmVzc0V4cHJlc3Npb25Gb3JQcmltYXJ5QWN0aW9uID0gZnVuY3Rpb24gKFxuXHRvRGF0YUZpZWxkOiBhbnksXG5cdHNFbnRpdHlTZXROYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQsXG5cdG9IZWFkZXJBY3Rpb246IEJhc2VBY3Rpb24gfCBudWxsLFxuXHRwb3NpdGl2ZUFjdGlvblZpc2libGU6IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIHwgc3RyaW5nLFxuXHRwb3NpdGl2ZUFjdGlvbkVuYWJsZWQ6IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIHwgc3RyaW5nLFxuXHRlZGl0QWN0aW9uVmlzaWJsZTogQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24gfCBzdHJpbmcsXG5cdGVkaXRBY3Rpb25FbmFibGVkOiBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiB8IHN0cmluZ1xuKSB7XG5cdGNvbnN0IHNBY3Rpb25Db250ZXh0cyA9IENvbW1vbkhlbHBlci5hZGRTaW5nbGVRdW90ZXMob0RhdGFGaWVsZCAmJiBvRGF0YUZpZWxkLkFjdGlvbiksXG5cdFx0c0RhdGFGaWVsZEVudW1NZW1iZXIgPSBvRGF0YUZpZWxkICYmIG9EYXRhRmllbGQuSW52b2NhdGlvbkdyb3VwaW5nICYmIG9EYXRhRmllbGQuSW52b2NhdGlvbkdyb3VwaW5nW1wiJEVudW1NZW1iZXJcIl0sXG5cdFx0c0ludm9jYXRpb25Hcm91cCA9IHNEYXRhRmllbGRFbnVtTWVtYmVyID09PSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLk9wZXJhdGlvbkdyb3VwaW5nVHlwZS9DaGFuZ2VTZXRcIiA/IFwiQ2hhbmdlU2V0XCIgOiBcIklzb2xhdGVkXCI7XG5cdGNvbnN0IG9QYXJhbXMgPSB7XG5cdFx0Y29udGV4dHM6IFwiJHskdmlldz4vI2ZlOjpPYmplY3RQYWdlL30uZ2V0QmluZGluZ0NvbnRleHQoKVwiLFxuXHRcdGVudGl0eVNldE5hbWU6IHNFbnRpdHlTZXROYW1lID8gQ29tbW9uSGVscGVyLmFkZFNpbmdsZVF1b3RlcyhzRW50aXR5U2V0TmFtZSkgOiBcIlwiLFxuXHRcdGludm9jYXRpb25Hcm91cGluZzogQ29tbW9uSGVscGVyLmFkZFNpbmdsZVF1b3RlcyhzSW52b2NhdGlvbkdyb3VwKSxcblx0XHRtb2RlbDogXCIkeyRzb3VyY2U+L30uZ2V0TW9kZWwoKVwiLFxuXHRcdGxhYmVsOiBDb21tb25IZWxwZXIuYWRkU2luZ2xlUXVvdGVzKG9EYXRhRmllbGQ/LkxhYmVsLCB0cnVlKSxcblx0XHRpc05hdmlnYWJsZTogb0hlYWRlckFjdGlvbj8uaXNOYXZpZ2FibGUsXG5cdFx0ZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uOiBvSGVhZGVyQWN0aW9uPy5kZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb25cblx0XHRcdD8gYCcke29IZWFkZXJBY3Rpb24uZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9ufSdgXG5cdFx0XHQ6IHVuZGVmaW5lZFxuXHR9O1xuXHRjb25zdCBvQ29uZGl0aW9ucyA9IHtcblx0XHRwb3NpdGl2ZUFjdGlvblZpc2libGUsXG5cdFx0cG9zaXRpdmVBY3Rpb25FbmFibGVkLFxuXHRcdGVkaXRBY3Rpb25WaXNpYmxlLFxuXHRcdGVkaXRBY3Rpb25FbmFibGVkXG5cdH07XG5cdHJldHVybiBDb21tb25IZWxwZXIuZ2VuZXJhdGVGdW5jdGlvbihcblx0XHRcIi5oYW5kbGVycy5vblByaW1hcnlBY3Rpb25cIixcblx0XHRcIiRjb250cm9sbGVyXCIsXG5cdFx0XCIkeyR2aWV3Pi99XCIsXG5cdFx0XCIkeyR2aWV3Pi9nZXRCaW5kaW5nQ29udGV4dH1cIixcblx0XHRzQWN0aW9uQ29udGV4dHMsXG5cdFx0Q29tbW9uSGVscGVyLm9iamVjdFRvU3RyaW5nKG9QYXJhbXMpLFxuXHRcdENvbW1vbkhlbHBlci5vYmplY3RUb1N0cmluZyhvQ29uZGl0aW9ucylcblx0KTtcbn07XG5cbi8qXG4gKiBHZXRzIHRoZSBiaW5kaW5nIG9mIHRoZSBjb250YWluZXIgSEJveCBmb3IgdGhlIGhlYWRlciBmYWNldC5cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7b2JqZWN0fSBbb0NvbnRyb2xDb25maWd1cmF0aW9uXSBUaGUgY29udHJvbCBjb25maWd1cmF0aW9uIGZvcm0gb2YgdGhlIHZpZXdEYXRhIG1vZGVsXG4gKiBAcGFyYW0ge29iamVjdH0gW29IZWFkZXJGYWNldF0gVGhlIG9iamVjdCBvZiB0aGUgaGVhZGVyIGZhY2V0XG4gKiByZXR1cm5zIHsqfSAgVGhlIGJpbmRpbmcgZXhwcmVzc2lvbiBmcm9tIGZ1bmN0aW9uIGdldEJpbmRpbmdXaXRoR3JvdXBJZEZyb21Db25maWcgb3IgdW5kZWZpbmVkLlxuICovXG5leHBvcnQgY29uc3QgZ2V0U3Rhc2hhYmxlSEJveEJpbmRpbmcgPSBmdW5jdGlvbiAob0NvbnRyb2xDb25maWd1cmF0aW9uOiBhbnksIG9IZWFkZXJGYWNldDogYW55KSB7XG5cdGlmIChvSGVhZGVyRmFjZXQgJiYgb0hlYWRlckZhY2V0LkZhY2V0ICYmIG9IZWFkZXJGYWNldC5GYWNldC50YXJnZXRBbm5vdGF0aW9uVHlwZSA9PT0gXCJEYXRhUG9pbnRcIikge1xuXHRcdHJldHVybiBnZXRCaW5kaW5nV2l0aEdyb3VwSWRGcm9tQ29uZmlnKG9Db250cm9sQ29uZmlndXJhdGlvbiwgb0hlYWRlckZhY2V0LkZhY2V0LnRhcmdldEFubm90YXRpb25WYWx1ZSk7XG5cdH1cbn07XG5cbi8qXG4gKiBHZXRzIHRoZSAnUHJlc3MnIGV2ZW50IGV4cHJlc3Npb24gZm9yIHRoZSBleHRlcm5hbCBhbmQgaW50ZXJuYWwgZGF0YSBwb2ludCBsaW5rLlxuICpcbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHtvYmplY3R9IFtvQ29uZmlndXJhdGlvbl0gQ29udHJvbCBjb25maWd1cmF0aW9uIGZyb20gbWFuaWZlc3RcbiAqIEBwYXJhbSB7b2JqZWN0fSBbb01hbmlmZXN0T3V0Ym91bmRdIE91dGJvdW5kcyBmcm9tIG1hbmlmZXN0XG4gKiByZXR1cm5zIHtzdHJpbmd9IFRoZSBydW50aW1lIGJpbmRpbmcgb2YgdGhlICdQcmVzcycgZXZlbnRcbiAqL1xuZXhwb3J0IGNvbnN0IGdldFByZXNzRXhwcmVzc2lvbkZvckxpbmsgPSBmdW5jdGlvbiAob0NvbmZpZ3VyYXRpb246IGFueSwgb01hbmlmZXN0T3V0Ym91bmQ6IGFueSkge1xuXHRpZiAob0NvbmZpZ3VyYXRpb24pIHtcblx0XHRpZiAob0NvbmZpZ3VyYXRpb25bXCJ0YXJnZXRPdXRib3VuZFwiXSAmJiBvQ29uZmlndXJhdGlvbltcInRhcmdldE91dGJvdW5kXCJdW1wib3V0Ym91bmRcIl0pIHtcblx0XHRcdHJldHVybiAoXG5cdFx0XHRcdFwiLmhhbmRsZXJzLm9uRGF0YVBvaW50VGl0bGVQcmVzc2VkKCRjb250cm9sbGVyLCAkeyRzb3VyY2U+fSwgXCIgK1xuXHRcdFx0XHRKU09OLnN0cmluZ2lmeShvTWFuaWZlc3RPdXRib3VuZCkgK1xuXHRcdFx0XHRcIixcIiArXG5cdFx0XHRcdEpTT04uc3RyaW5naWZ5KG9Db25maWd1cmF0aW9uW1widGFyZ2V0T3V0Ym91bmRcIl1bXCJvdXRib3VuZFwiXSkgK1xuXHRcdFx0XHRcIilcIlxuXHRcdFx0KTtcblx0XHR9IGVsc2UgaWYgKG9Db25maWd1cmF0aW9uW1widGFyZ2V0U2VjdGlvbnNcIl0pIHtcblx0XHRcdHJldHVybiBcIi5oYW5kbGVycy5uYXZpZ2F0ZVRvU3ViU2VjdGlvbigkY29udHJvbGxlciwgJ1wiICsgSlNPTi5zdHJpbmdpZnkob0NvbmZpZ3VyYXRpb25bXCJ0YXJnZXRTZWN0aW9uc1wiXSkgKyBcIicpXCI7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXHR9XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0SGVhZGVyRm9ybUhib3hSZW5kZXJUeXBlID0gZnVuY3Rpb24gKGRhdGFGaWVsZDogRGF0YU1vZGVsT2JqZWN0UGF0aCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdGlmIChkYXRhRmllbGQ/LnRhcmdldE9iamVjdD8uJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFubm90YXRpb24pIHtcblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cdHJldHVybiBcIkJhcmVcIjtcbn07XG4iXSwibWFwcGluZ3MiOiI7QUFBQTtBQUFBO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQWdDQSxJQUFNQSxVQUFVLEdBQUdDLFFBQVEsQ0FBQ0QsVUFBVTtFQU90QztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ08sSUFBTUUscUJBQXFCLEdBQUcsVUFDcENDLFdBQXVDLEVBQ3ZDQyxTQUFtQixFQUNuQkMsZUFBb0MsRUFDcENDLFVBQThCLEVBQ0s7SUFBQTtJQUNuQyxJQUFNQyxpQkFBaUIsR0FBR0MsV0FBVyxDQUFDQyxpQkFBaUIsQ0FBQyxjQUFjLEVBQUVMLFNBQVMsQ0FBQ00sY0FBYyxFQUFFQyxTQUFTLEVBQUVQLFNBQVMsQ0FBQ1EsU0FBUyxDQUFDO0lBRWpJLElBQU1DLG1CQUFtQixHQUFHTCxXQUFXLENBQUNDLGlCQUFpQixDQUN4RCxzREFBc0QsRUFDdERMLFNBQVMsQ0FBQ00sY0FBYyxFQUN4QkMsU0FBUyxFQUNUUCxTQUFTLENBQUNRLFNBQVMsQ0FDbkI7SUFFRCxJQUFNRSxxQkFBcUIsR0FDMUIsQ0FBQVgsV0FBVyxhQUFYQSxXQUFXLHVCQUFYQSxXQUFXLENBQUVZLEtBQUssTUFB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
817
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJCdXR0b25UeXBlIiwibUxpYnJhcnkiLCJnZXRFeHByZXNzaW9uRm9yVGl0bGUiLCJvSGVhZGVySW5mbyIsIm9WaWV3RGF0YSIsImZ1bGxDb250ZXh0UGF0aCIsIm9EcmFmdFJvb3QiLCJ0aXRsZU5vSGVhZGVySW5mbyIsIkNvbW1vblV0aWxzIiwiZ2V0VHJhbnNsYXRlZFRleHQiLCJyZXNvdXJjZUJ1bmRsZSIsInVuZGVmaW5lZCIsImVudGl0eVNldCIsInRpdGxlV2l0aEhlYWRlckluZm8iLCJvRW1wdHlIZWFkZXJJbmZvVGl0bGUiLCJUaXRsZSIsIlZhbHVlIiwidGl0bGVGb3JBY3RpdmVIZWFkZXJOb0hlYWRlckluZm8iLCJ0aXRsZVZhbHVlRXhwcmVzc2lvbiIsImNvbm5lY3RlZEZpZWxkc1BhdGgiLCJ0aXRsZUlzRW1wdHkiLCJjb25zdGFudCIsInRpdGxlQm9vbGVhbkV4cHJlc3Npb24iLCIkVHlwZSIsImdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbiIsIiR0YXJnZXQiLCJhbm5vdGF0aW9ucyIsIkNvbW1vbiIsIlRleHQiLCJVSSIsIlRleHRBcnJhbmdlbWVudCIsImFkZFRleHRBcnJhbmdlbWVudFRvQmluZGluZ0V4cHJlc3Npb24iLCJmb3JtYXRWYWx1ZVJlY3Vyc2l2ZWx5IiwiX3R5cGUiLCJ2YWx1ZSIsImlzRW1wdHkiLCJUYXJnZXQiLCJlbmhhbmNlRGF0YU1vZGVsUGF0aCIsImdldExhYmVsRm9yQ29ubmVjdGVkRmllbGRzIiwiY3JlYXRlTW9kZVRpdGxlIiwiVHlwZU5hbWUiLCJjb25jYXQiLCJyZXNvbHZlQmluZGluZ1N0cmluZyIsInRvU3RyaW5nIiwiYWN0aXZlRXhwcmVzc2lvbiIsIkVudGl0eSIsIklzQWN0aXZlIiwiY29tcGlsZUV4cHJlc3Npb24iLCJpZkVsc2UiLCJhbmQiLCJvciIsIklzQ3JlYXRlTW9kZVN0aWNreSIsIklzQ3JlYXRlTW9kZSIsImdldEV4cHJlc3Npb25Gb3JEZXNjcmlwdGlvbiIsInBhdGhJbk1vZGVsIiwiRGVzY3JpcHRpb24iLCJnZXRFeHByZXNzaW9uRm9yU2F2ZUJ1dHRvbiIsInNhdmVCdXR0b25UZXh0IiwiY3JlYXRlQnV0dG9uVGV4dCIsInNhdmVFeHByZXNzaW9uIiwic3RhcnRpbmdFbnRpdHlTZXQiLCJTZXNzaW9uIiwiU3RpY2t5U2Vzc2lvblN1cHBvcnRlZCIsIkRyYWZ0IiwiSXNOZXdPYmplY3QiLCJnZXRGb290ZXJWaXNpYmxlIiwiZm9vdGVyQWN0aW9ucyIsImRhdGFGaWVsZHMiLCJtYW5pZmVzdEFjdGlvbnMiLCJmaWx0ZXIiLCJhY3Rpb24iLCJpc01hbmlmZXN0QWN0aW9uIiwiY3VzdG9tQWN0aW9uVmlzaWJpbGl0eSIsImxlbmd0aCIsImN1c3RvbUFjdGlvbkluZGl2aWR1YWxWaXNpYmlsaXR5IiwibWFwIiwidmlzaWJsZSIsImFubm90YXRpb25BY3Rpb25WaXNpYmlsaXR5IiwiZ2V0RGF0YUZpZWxkQmFzZWRGb290ZXJWaXNpYmlsaXR5IiwiYURhdGFGaWVsZHMiLCJiQ29uc2lkZXJFZGl0YWJsZSIsInNIaWRkZW5FeHByZXNzaW9uIiwic1NlbWlIaWRkZW5FeHByZXNzaW9uIiwiYUhpZGRlbkFjdGlvblBhdGgiLCJpIiwib0RhdGFGaWVsZCIsIkRldGVybWluaW5nIiwiaGlkZGVuRXhwcmVzc2lvbiIsIiRQYXRoIiwiaW5kZXhPZiIsInB1c2giLCJpbmRleCIsIm9BY3Rpb24iLCJhQWN0aW9ucyIsInR5cGUiLCJidWlsZEVtcGhhc2l6ZWRCdXR0b25FeHByZXNzaW9uIiwiYUlkZW50aWZpY2F0aW9uIiwiRW1waGFzaXplZCIsInNGb3JtYXRFbXBoYXNpemVkRXhwcmVzc2lvbiIsImJJc0Fsd2F5c0RlZmF1bHQiLCJzSGlkZGVuU2ltcGxlUGF0aCIsImZvckVhY2giLCJvQ3JpdGljYWxpdHlQcm9wZXJ0eSIsIkNyaXRpY2FsaXR5Iiwib0RhdGFGaWVsZEhpZGRlbiIsIiRFbnVtTWVtYmVyIiwiRGVmYXVsdCIsInNDb21iaW5lZEhpZGRlbkV4cHJlc3Npb24iLCJnZXRFbGVtZW50QmluZGluZyIsInNQYXRoIiwic05hdmlnYXRpb25QYXRoIiwiT0RhdGFNb2RlbEFubm90YXRpb25IZWxwZXIiLCJnZXROYXZpZ2F0aW9uUGF0aCIsImNoZWNrRHJhZnRTdGF0ZSIsIm9Bbm5vdGF0aW9ucyIsImdldFN3aXRjaFRvQWN0aXZlVmlzaWJpbGl0eSIsImdldFN3aXRjaFRvRHJhZnRWaXNpYmlsaXR5IiwiZ2V0U3dpdGNoRHJhZnRBbmRBY3RpdmVWaXNpYmlsaXR5IiwiX2ZpbmRBY3Rpb24iLCJhQ29udmVydGVyQ29udGV4dEhlYWRlckFjdGlvbnMiLCJzQWN0aW9uVHlwZSIsImZpbmQiLCJvSGVhZGVyQWN0aW9uIiwiZ2V0RGVsZXRlQ29tbWFuZEV4ZWN1dGlvbkVuYWJsZWQiLCJvRGVsZXRlQWN0aW9uIiwiZW5hYmxlZCIsImdldERlbGV0ZUNvbW1hbmRFeGVjdXRpb25WaXNpYmxlIiwiZ2V0RWRpdENvbW1hbmRFeGVjdXRpb25WaXNpYmxlIiwib0VkaXRBY3Rpb24iLCJnZXRFZGl0Q29tbWFuZEV4ZWN1dGlvbkVuYWJsZWQiLCJnZXRFZGl0QWN0aW9uIiwib0VudGl0eVNldCIsImdldFBhdGgiLCJnZXRPYmplY3QiLCJiRHJhZnRSb290IiwiaGFzT3duUHJvcGVydHkiLCJiU3RpY2t5U2Vzc2lvbiIsInNBY3Rpb25OYW1lIiwiaXNSZWFkT25seUZyb21TdGF0aWNBbm5vdGF0aW9ucyIsIm9GaWVsZENvbnRyb2wiLCJiQ29tcHV0ZWQiLCJiSW1tdXRhYmxlIiwiYlJlYWRPbmx5IiwiQm9vbCIsInJlYWRPbmx5RXhwcmVzc2lvbkZyb21EeW5hbWljQW5ub3RhdGlvbnMiLCJzSXNGaWVsZENvbnRyb2xQYXRoUmVhZE9ubHkiLCJNYW5hZ2VkT2JqZWN0IiwiYmluZGluZ1BhcnNlciIsImdldEV4cHJlc3Npb25Gb3JNaWNyb0NoYXJ0VGl0bGVQcmVzcyIsIm9Db25maWd1cmF0aW9uIiwib01hbmlmZXN0T3V0Ym91bmQiLCJzQ29sbGVjdGlvbk5hbWUiLCJKU09OIiwic3RyaW5naWZ5IiwiZ2V0TWljcm9DaGFydFRpdGxlQXNMaW5rIiwib0NvbnRyb2xDb25maWd1cmF0aW9uIiwiZ2V0R3JvdXBJZEZyb21Db25maWciLCJvQ29uZmlndXJhdGlvbnMiLCJzQW5ub3RhdGlvblBhdGgiLCJzRGVmYXVsdEdyb3VwSWQiLCJhQXV0b1BhdHRlcm5zIiwic0dyb3VwSWQiLCJyZXF1ZXN0R3JvdXBJZCIsInNvbWUiLCJhdXRvUGF0dGVybiIsImdldEJpbmRpbmdXaXRoR3JvdXBJZEZyb21Db25maWciLCJzS2V5Iiwic0JpbmRpbmciLCJkb2VzRmllbGRHcm91cENvbnRhaW5Pbmx5T25lTXVsdGlMaW5lRGF0YUZpZWxkIiwiYUZvcm1FbGVtZW50cyIsImlzVmFsdWVNdWx0aWxpbmVUZXh0IiwiZ2V0VmlzaWJsZUV4cHJlc3Npb25Gb3JCcmVhZGNydW1icyIsInNob3dCcmVhZENydW1icyIsImZjbEVuYWJsZWQiLCJnZXRTaGFyZUJ1dHRvblZpc2liaWxpdHkiLCJ2aWV3RGF0YSIsInNTaGFyZUJ1dHRvblZpc2liaWxpdHlFeHAiLCJnZXRWaXNpYmxpdHlPZkhlYWRlckluZm8iLCJvVGl0bGVBbm5vdGF0aW9ucyIsIm9EZXNjcmlwdGlvbkFubm90YXRpb25zIiwib0ZpZWxkVGl0bGVGaWVsZENvbnRyb2wiLCJvRmllbGREZXNjcmlwdGlvbkZpZWxkQ29udHJvbCIsImJJc1RpdGxlUmVhZE9ubHkiLCJ0aXRsZUV4cHJlc3Npb24iLCJiSXNEZXNjcmlwdGlvblJlYWRPbmx5IiwiZGVzY3JpcHRpb25FeHByZXNzaW9uIiwiY29tYmluZVRpdGxlQW5kRGVzY3JpcHRpb25FeHByZXNzaW9uIiwib1RpdGxlRmllbGRDb250cm9sIiwib0Rlc2NyaXB0aW9uRmllbGRDb250cm9sIiwiZ2V0UHJlc3NFeHByZXNzaW9uRm9yRGVsZXRlIiwic0VudGl0eVNldE5hbWUiLCJzRGVsZXRhYmxlQ29udGV4dHMiLCJzVGl0bGUiLCJzRGVzY3JpcHRpb24iLCJvUGFyYW1zIiwidGl0bGUiLCJlbnRpdHlTZXROYW1lIiwiQ29tbW9uSGVscGVyIiwiYWRkU2luZ2xlUXVvdGVzIiwiZGVzY3JpcHRpb24iLCJnZW5lcmF0ZUZ1bmN0aW9uIiwib2JqZWN0VG9TdHJpbmciLCJnZXRQcmVzc0V4cHJlc3Npb25Gb3JTYXZlIiwic1NhdmVDb250ZXh0IiwiZ2V0UHJlc3NFeHByZXNzaW9uRm9yRWRpdCIsInNFZGl0YWJsZUNvbnRleHRzIiwiQWN0aW9uIiwic0RhdGFGaWVsZEVudW1NZW1iZXIiLCJJbnZvY2F0aW9uR3JvdXBpbmciLCJzSW52b2NhdGlvbkdyb3VwIiwiY29udGV4dHMiLCJpbnZvY2F0aW9uR3JvdXBpbmciLCJtb2RlbCIsImxhYmVsIiwiTGFiZWwiLCJpc05hdmlnYWJsZSIsImRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbiIsImdldFByZXNzRXhwcmVzc2lvbkZvckZvb3RlckFubm90YXRpb25BY3Rpb24iLCJzQWN0aW9uQ29udGV4dHMiLCJnZXRQcmVzc0V4cHJlc3Npb25Gb3JQcmltYXJ5QWN0aW9uIiwicG9zaXRpdmVBY3Rpb25WaXNpYmxlIiwicG9zaXRpdmVBY3Rpb25FbmFibGVkIiwiZWRpdEFjdGlvblZpc2libGUiLCJlZGl0QWN0aW9uRW5hYmxlZCIsIm9Db25kaXRpb25zIiwiZ2V0U3Rhc2hhYmxlSEJveEJpbmRpbmciLCJvSGVhZGVyRmFjZXQiLCJGYWNldCIsInRhcmdldEFubm90YXRpb25UeXBlIiwidGFyZ2V0QW5ub3RhdGlvblZhbHVlIiwiZ2V0UHJlc3NFeHByZXNzaW9uRm9yTGluayIsImdldEhlYWRlckZvcm1IYm94UmVuZGVyVHlwZSIsImRhdGFGaWVsZCIsInRhcmdldE9iamVjdCJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiT2JqZWN0UGFnZVRlbXBsYXRpbmcudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gRm9ybWF0dGVycyBmb3IgdGhlIE9iamVjdCBQYWdlXG5pbXBvcnQgeyBFbnRpdHlTZXQgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXNcIjtcbmltcG9ydCB0eXBlIHsgRGF0YUZpZWxkLCBEYXRhRmllbGRUeXBlcywgSGVhZGVySW5mb1R5cGUgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL1VJXCI7XG5pbXBvcnQgeyBVSUFubm90YXRpb25UZXJtcywgVUlBbm5vdGF0aW9uVHlwZXMgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL1VJXCI7XG5pbXBvcnQgdHlwZSBSZXNvdXJjZUJ1bmRsZSBmcm9tIFwic2FwL2Jhc2UvaTE4bi9SZXNvdXJjZUJ1bmRsZVwiO1xuaW1wb3J0IENvbW1vblV0aWxzIGZyb20gXCJzYXAvZmUvY29yZS9Db21tb25VdGlsc1wiO1xuaW1wb3J0IHR5cGUgeyBCYXNlQWN0aW9uLCBDb252ZXJ0ZXJBY3Rpb24gfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9jb250cm9scy9Db21tb24vQWN0aW9uXCI7XG5pbXBvcnQgeyBEcmFmdCwgRW50aXR5LCBVSSB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2hlbHBlcnMvQmluZGluZ0hlbHBlclwiO1xuaW1wb3J0IHR5cGUgeyBNYW5pZmVzdEFjdGlvbiB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01hbmlmZXN0U2V0dGluZ3NcIjtcbmltcG9ydCB7XG5cdGFuZCxcblx0QmluZGluZ1Rvb2xraXRFeHByZXNzaW9uLFxuXHRDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbixcblx0Y29tcGlsZUV4cHJlc3Npb24sXG5cdGNvbmNhdCxcblx0Y29uc3RhbnQsXG5cdGdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbixcblx0aWZFbHNlLFxuXHRpc0VtcHR5LFxuXHRvcixcblx0cmVzb2x2ZUJpbmRpbmdTdHJpbmdcbn0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvQmluZGluZ1Rvb2xraXRcIjtcbmltcG9ydCB0eXBlIHsgRGF0YU1vZGVsT2JqZWN0UGF0aCB9IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL0RhdGFNb2RlbFBhdGhIZWxwZXJcIjtcbmltcG9ydCB7IGVuaGFuY2VEYXRhTW9kZWxQYXRoIH0gZnJvbSBcInNhcC9mZS9jb3JlL3RlbXBsYXRpbmcvRGF0YU1vZGVsUGF0aEhlbHBlclwiO1xuaW1wb3J0IENvbW1vbkhlbHBlciBmcm9tIFwic2FwL2ZlL21hY3Jvcy9Db21tb25IZWxwZXJcIjtcbmltcG9ydCB7IGFkZFRleHRBcnJhbmdlbWVudFRvQmluZGluZ0V4cHJlc3Npb24sIGZvcm1hdFZhbHVlUmVjdXJzaXZlbHkgfSBmcm9tIFwic2FwL2ZlL21hY3Jvcy9maWVsZC9GaWVsZFRlbXBsYXRpbmdcIjtcbmltcG9ydCB7IGdldExhYmVsRm9yQ29ubmVjdGVkRmllbGRzIH0gZnJvbSBcInNhcC9mZS9tYWNyb3MvaW50ZXJuYWwvZm9ybS9Gb3JtVGVtcGxhdGluZ1wiO1xuaW1wb3J0IG1MaWJyYXJ5IGZyb20gXCJzYXAvbS9saWJyYXJ5XCI7XG5pbXBvcnQgTWFuYWdlZE9iamVjdCBmcm9tIFwic2FwL3VpL2Jhc2UvTWFuYWdlZE9iamVjdFwiO1xuaW1wb3J0IE9EYXRhTW9kZWxBbm5vdGF0aW9uSGVscGVyIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQW5ub3RhdGlvbkhlbHBlclwiO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L0NvbnRleHRcIjtcblxuY29uc3QgQnV0dG9uVHlwZSA9IG1MaWJyYXJ5LkJ1dHRvblR5cGU7XG5cbnR5cGUgVmlld0RhdGEgPSB7XG5cdHJlc291cmNlQnVuZGxlOiBSZXNvdXJjZUJ1bmRsZTtcblx0ZW50aXR5U2V0OiBzdHJpbmc7XG59O1xuXG4vL2BgYG1lcm1haWRcbi8vIGdyYXBoIFREXG4vLyBBW09iamVjdCBQYWdlIFRpdGxlXSAtLT58R2V0IERhdGFGaWVsZCBWYWx1ZXwgQ3tFdmFsdWF0ZSBDcmVhdGUgTW9kZX1cbi8vIEMgLS0+fEluIENyZWF0ZSBNb2RlfCBEe0lzIERhdGFGaWVsZCBWYWx1ZSBlbXB0eX1cbi8vIEQgLS0+fFllc3wgRntJcyB0aGVyZSBhIFR5cGVOYW1lfVxuLy8gRiAtLT58WWVzfCBHW0lzIHRoZXJlIGFuIGN1c3RvbSB0aXRsZV1cbi8vIEcgLS0+fFllc3wgRzFbU2hvdyB0aGUgY3VzdG9tIHRpdGxlICsgJ1R5cGVOYW1lJ11cbi8vIEcgLS0+fE5vfCBHMltEaXNwbGF5IHRoZSBkZWZhdWx0IHRpdGxlICdOZXcgKyBUeXBlTmFtZSddXG4vLyBGIC0tPnxOb3wgSFtJcyB0aGVyZSBhIGN1c3RvbSB0aXRsZV1cbi8vIEggLS0+fFllc3wgSVtTaG93IHRoZSBjdXN0b20gdGl0bGVdXG4vLyBIIC0tPnxOb3wgSltTaG93IHRoZSBkZWZhdWx0ICdVbmFtbmVkIE9iamVjdCddXG4vLyBEIC0tPnxOb3wgRVxuLy8gQyAtLT58Tm90IGluIGNyZWF0ZSBtb2RlfCBFW1Nob3cgRGF0YUZpZWxkIFZhbHVlXVxuLy8gYGBgXG4vKipcbiAqIENvbXB1dGUgdGhlIHRpdGxlIGZvciB0aGUgb2JqZWN0IHBhZ2UuXG4gKlxuICogQHBhcmFtIG9IZWFkZXJJbmZvIFRoZSBAVUkuSGVhZGVySW5mbyBhbm5vdGF0aW9uIGNvbnRlbnRcbiAqIEBwYXJhbSBvVmlld0RhdGEgVGhlIHZpZXcgZGF0YSBvYmplY3Qgd2UncmUgY3VycmVudGx5IG9uXG4gKiBAcGFyYW0gZnVsbENvbnRleHRQYXRoIFRoZSBmdWxsIGNvbnRleHQgcGF0aCB1c2VkIHRvIHJlYWNoIHRoYXQgb2JqZWN0IHBhZ2VcbiAqIEBwYXJhbSBvRHJhZnRSb290XG4gKiBAcmV0dXJucyBUaGUgYmluZGluZyBleHByZXNzaW9uIGZvciB0aGUgb2JqZWN0IHBhZ2UgdGl0bGVcbiAqL1xuZXhwb3J0IGNvbnN0IGdldEV4cHJlc3Npb25Gb3JUaXRsZSA9IGZ1bmN0aW9uIChcblx0b0hlYWRlckluZm86IEhlYWRlckluZm9UeXBlIHwgdW5kZWZpbmVkLFxuXHRvVmlld0RhdGE6IFZpZXdEYXRhLFxuXHRmdWxsQ29udGV4dFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGgsXG5cdG9EcmFmdFJvb3Q6IE9iamVjdCB8IHVuZGVmaW5lZFxuKTogQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24ge1xuXHRjb25zdCB0aXRsZU5vSGVhZGVySW5mbyA9IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFwiVF9ORVdfT0JKRUNUXCIsIG9WaWV3RGF0YS5yZXNvdXJjZUJ1bmRsZSwgdW5kZWZpbmVkLCBvVmlld0RhdGEuZW50aXR5U2V0KTtcblxuXHRjb25zdCB0aXRsZVdpdGhIZWFkZXJJbmZvID0gQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXG5cdFx0XCJUX0FOTk9UQVRJT05fSEVMUEVSX0RFRkFVTFRfT0JKRUNUX1BBR0VfSEVBREVSX1RJVExFXCIsXG5cdFx0b1ZpZXdEYXRhLnJlc291cmNlQnVuZGxlLFxuXHRcdHVuZGVmaW5lZCxcblx0XHRvVmlld0RhdGEuZW50aXR5U2V0XG5cdCk7XG5cblx0Y29uc3Qgb0VtcHR5SGVhZGVySW5mb1RpdGxlID1cblx0XHRvSGVhZGVySW5mbz8uVGl0bGUgPT09IHVuZGVmaW5lZCB8fCAob0hlYWRlckluZm8/LlRpdGxlIGFzIGFueSkgPT09IFwiXCIgfHwgKG9IZWFkZXJJbmZvPy5UaXRsZSBhcyBEYXRhRmllbGRUeXBlcyk/LlZhbHVlID09PSBcIlwiO1xuXG5cdGNvbnN0IHRpdGxlRm9yQWN0aXZlSGVhZGVyTm9IZWFkZXJJbmZvID0gIW9FbXB0eUhlYWRlckluZm9UaXRsZVxuXHRcdD8gQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXCJUX0FOTk9UQVRJT05fSEVMUEVSX0RFRkFVTFRfT0JKRUNUX1BBR0VfSEVBREVSX1RJVExFX05PX0hFQURFUl9JTkZPXCIsIG9WaWV3RGF0YS5yZXNvdXJjZUJ1bmRsZSlcblx0XHQ6IFwiXCI7XG5cdGxldCB0aXRsZVZhbHVlRXhwcmVzc2lvbixcblx0XHRjb25uZWN0ZWRGaWVsZHNQYXRoLFxuXHRcdHRpdGxlSXNFbXB0eTogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+ID0gY29uc3RhbnQodHJ1ZSksXG5cdFx0dGl0bGVCb29sZWFuRXhwcmVzc2lvbjogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+IHwgYm9vbGVhbjtcblx0aWYgKG9IZWFkZXJJbmZvPy5UaXRsZT8uJFR5cGUgPT09IFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuRGF0YUZpZWxkXCIpIHtcblx0XHR0aXRsZVZhbHVlRXhwcmVzc2lvbiA9IGdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbigob0hlYWRlckluZm8/LlRpdGxlIGFzIERhdGFGaWVsZFR5cGVzKT8uVmFsdWUpO1xuXHRcdGlmICgob0hlYWRlckluZm8/LlRpdGxlIGFzIERhdGFGaWVsZFR5cGVzKT8uVmFsdWU/LiR0YXJnZXQ/LmFubm90YXRpb25zPy5Db21tb24/LlRleHQ/LmFubm90YXRpb25zPy5VST8uVGV4dEFycmFuZ2VtZW50KSB7XG5cdFx0XHQvLyBJbiBjYXNlIGFuIGV4cGxpY2l0IHRleHQgYXJyYW5nZW1lbnQgd2FzIHNldCB3ZSBtYWtlIHVzZSBvZiBpdCBpbiB0aGUgZGVzY3JpcHRpb24gYXMgd2VsbFxuXHRcdFx0dGl0bGVWYWx1ZUV4cHJlc3Npb24gPSBhZGRUZXh0QXJyYW5nZW1lbnRUb0JpbmRpbmdFeHByZXNzaW9uKHRpdGxlVmFsdWVFeHByZXNzaW9uLCBmdWxsQ29udGV4dFBhdGgpO1xuXHRcdH1cblx0XHR0aXRsZVZhbHVlRXhwcmVzc2lvbiA9IGZvcm1hdFZhbHVlUmVjdXJzaXZlbHkodGl0bGVWYWx1ZUV4cHJlc3Npb24sIGZ1bGxDb250ZXh0UGF0aCk7XG5cdFx0dGl0bGVJc0VtcHR5ID0gdGl0bGVWYWx1ZUV4cHJlc3Npb24/Ll90eXBlID09PSBcIkNvbnN0YW50XCIgPyBjb25zdGFudCghdGl0bGVWYWx1ZUV4cHJlc3Npb24/LnZhbHVlKSA6IGlzRW1wdHkodGl0bGVWYWx1ZUV4cHJlc3Npb24pO1xuXHR9IGVsc2UgaWYgKFxuXHRcdG9IZWFkZXJJbmZvPy5UaXRsZT8uJFR5cGUgPT09IFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuRGF0YUZpZWxkRm9yQW5ub3RhdGlvblwiICYmXG5cdFx0b0hlYWRlckluZm8/LlRpdGxlPy5UYXJnZXQuJHRhcmdldC4kVHlwZSA9PT0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5Db25uZWN0ZWRGaWVsZHNUeXBlXCJcblx0KSB7XG5cdFx0Y29ubmVjdGVkRmllbGRzUGF0aCA9IGVuaGFuY2VEYXRhTW9kZWxQYXRoKGZ1bGxDb250ZXh0UGF0aCwgXCIkVHlwZS9AVUkuSGVhZGVySW5mby9UaXRsZS9UYXJnZXQvJEFubm90YXRpb25QYXRoXCIpO1xuXHRcdHRpdGxlVmFsdWVFeHByZXNzaW9uID0gZ2V0TGFiZWxGb3JDb25uZWN0ZWRGaWVsZHMoY29ubmVjdGVkRmllbGRzUGF0aCwgZmFsc2UpIGFzIEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxzdHJpbmc+O1xuXHRcdHRpdGxlQm9vbGVhbkV4cHJlc3Npb24gPVxuXHRcdFx0dGl0bGVWYWx1ZUV4cHJlc3Npb24/Ll90eXBlID09PSBcIkNvbnN0YW50XCIgPyBjb25zdGFudCghdGl0bGVWYWx1ZUV4cHJlc3Npb24/LnZhbHVlKSA6IGlzRW1wdHkodGl0bGVWYWx1ZUV4cHJlc3Npb24pO1xuXHRcdHRpdGxlSXNFbXB0eSA9IHRpdGxlVmFsdWVFeHByZXNzaW9uID8gdGl0bGVCb29sZWFuRXhwcmVzc2lvbiA6IGNvbnN0YW50KHRydWUpO1xuXHR9XG5cblx0Ly8gSWYgdGhlcmUgaXMgYSBUeXBlTmFtZSBkZWZpbmVkLCBzaG93IHRoZSBkZWZhdWx0IHRpdGxlICdOZXcgKyBUeXBlTmFtZScsIG90aGVyd2lzZSBzaG93IHRoZSBjdXN0b20gdGl0bGUgb3IgdGhlIGRlZmF1bHQgJ05ldyBvYmplY3QnXG5cdGNvbnN0IGNyZWF0ZU1vZGVUaXRsZSA9IG9IZWFkZXJJbmZvPy5UeXBlTmFtZVxuXHRcdD8gY29uY2F0KHRpdGxlV2l0aEhlYWRlckluZm8sIFwiOiBcIiwgcmVzb2x2ZUJpbmRpbmdTdHJpbmcob0hlYWRlckluZm8uVHlwZU5hbWUudG9TdHJpbmcoKSkpXG5cdFx0OiB0aXRsZU5vSGVhZGVySW5mbztcblx0Y29uc3QgYWN0aXZlRXhwcmVzc2lvbiA9IG9EcmFmdFJvb3QgPyBFbnRpdHkuSXNBY3RpdmUgOiB0cnVlO1xuXHRyZXR1cm4gY29tcGlsZUV4cHJlc3Npb24oXG5cdFx0aWZFbHNlKFxuXHRcdFx0YW5kKG9yKFVJLklzQ3JlYXRlTW9kZVN0aWNreSwgVUkuSXNDcmVhdGVNb2RlKSwgdGl0bGVJc0VtcHR5KSxcblx0XHRcdGNyZWF0ZU1vZGVUaXRsZSxcblxuXHRcdFx0Ly8gT3RoZXJ3aXNlIHNob3cgdGhlIGRlZmF1bHQgZXhwcmVzc2lvblxuXHRcdFx0aWZFbHNlKGFuZChhY3RpdmVFeHByZXNzaW9uLCB0aXRsZUlzRW1wdHkpLCB0aXRsZUZvckFjdGl2ZUhlYWRlck5vSGVhZGVySW5mbywgdGl0bGVWYWx1ZUV4cHJlc3Npb24pXG5cdFx0KVxuXHQpO1xufTtcblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIGV4cHJlc3Npb24gZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiBhbiBvYmplY3QgcGFnZS5cbiAqXG4gKiBAcGFyYW0gb0hlYWRlckluZm8gVGhlIEBVSS5IZWFkZXJJbmZvIGFubm90YXRpb24gY29udGVudFxuICogQHBhcmFtIGZ1bGxDb250ZXh0UGF0aCBUaGUgZnVsbCBjb250ZXh0IHBhdGggdXNlZCB0byByZWFjaCB0aGF0IG9iamVjdCBwYWdlXG4gKiBAcmV0dXJucyBUaGUgYmluZGluZyBleHByZXNzaW9uIGZvciB0aGUgb2JqZWN0IHBhZ2UgZGVzY3JpcHRpb25cbiAqL1xuZXhwb3J0IGNvbnN0IGdldEV4cHJlc3Npb25Gb3JEZXNjcmlwdGlvbiA9IGZ1bmN0aW9uIChcblx0b0hlYWRlckluZm86IEhlYWRlckluZm9UeXBlIHwgdW5kZWZpbmVkLFxuXHRmdWxsQ29udGV4dFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGhcbik6IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIHtcblx0bGV0IHBhdGhJbk1vZGVsID0gZ2V0RXhwcmVzc2lvbkZyb21Bbm5vdGF0aW9uKChvSGVhZGVySW5mbz8uRGVzY3JpcHRpb24gYXMgRGF0YUZpZWxkVHlwZXMpPy5WYWx1ZSk7XG5cdGlmICgob0hlYWRlckluZm8/LkRlc2NyaXB0aW9uIGFzIERhdGFGaWVsZFR5cGVzKT8uVmFsdWU/LiR0YXJnZXQ/LmFubm90YXRpb25zPy5Db21tb24/LlRleHQ/LmFubm90YXRpb25zPy5VST8uVGV4dEFycmFuZ2VtZW50KSB7XG5cdFx0Ly8gSW4gY2FzZSBhbiBleHBsaWNpdCB0ZXh0IGFycmFuZ2VtZW50IHdhcyBzZXQgd2UgbWFrZSB1c2Ugb2YgaXQgaW4gdGhlIGRlc2NyaXB0aW9uIGFzIHdlbGxcblx0XHRwYXRoSW5Nb2RlbCA9IGFkZFRleHRBcnJhbmdlbWVudFRvQmluZGluZ0V4cHJlc3Npb24ocGF0aEluTW9kZWwsIGZ1bGxDb250ZXh0UGF0aCk7XG5cdH1cblxuXHRyZXR1cm4gY29tcGlsZUV4cHJlc3Npb24oZm9ybWF0VmFsdWVSZWN1cnNpdmVseShwYXRoSW5Nb2RlbCwgZnVsbENvbnRleHRQYXRoKSk7XG59O1xuXG4vKipcbiAqIFJldHVybiB0aGUgZXhwcmVzc2lvbiBmb3IgdGhlIHNhdmUgYnV0dG9uLlxuICpcbiAqIEBwYXJhbSBvVmlld0RhdGEgVGhlIGN1cnJlbnQgdmlldyBkYXRhXG4gKiBAcGFyYW0gZnVsbENvbnRleHRQYXRoIFRoZSBwYXRoIHVzZWQgdXAgdW50aWwgaGVyZVxuICogQHJldHVybnMgVGhlIGJpbmRpbmcgZXhwcmVzc2lvbiB0aGF0IHNob3dzIHRoZSByaWdodCBzYXZlIGJ1dHRvbiB0ZXh0XG4gKi9cbmV4cG9ydCBjb25zdCBnZXRFeHByZXNzaW9uRm9yU2F2ZUJ1dHRvbiA9IGZ1bmN0aW9uIChcblx0b1ZpZXdEYXRhOiBWaWV3RGF0YSxcblx0ZnVsbENvbnRleHRQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoXG4pOiBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiB7XG5cdGNvbnN0IHNhdmVCdXR0b25UZXh0ID0gQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXCJUX09QX09CSkVDVF9QQUdFX1NBVkVcIiwgb1ZpZXdEYXRhLnJlc291cmNlQnVuZGxlKTtcblx0Y29uc3QgY3JlYXRlQnV0dG9uVGV4dCA9IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFwiVF9PUF9PQkpFQ1RfUEFHRV9DUkVBVEVcIiwgb1ZpZXdEYXRhLnJlc291cmNlQnVuZGxlKTtcblx0bGV0IHNhdmVFeHByZXNzaW9uO1xuXG5cdGlmICgoZnVsbENvbnRleHRQYXRoLnN0YXJ0aW5nRW50aXR5U2V0IGFzIEVudGl0eVNldCkuYW5ub3RhdGlvbnMuU2Vzc2lvbj8uU3RpY2t5U2Vzc2lvblN1cHBvcnRlZCkge1xuXHRcdC8vIElmIHdlJ3JlIGluIHN0aWNreSBtb2RlIEFORCB0aGUgdWkgaXMgaW4gY3JlYXRlIG1vZGUsIHNob3cgQ3JlYXRlLCBlbHNlIHNob3cgU2F2ZVxuXHRcdHNhdmVFeHByZXNzaW9uID0gaWZFbHNlKFVJLklzQ3JlYXRlTW9kZVN0aWNreSwgY3JlYXRlQnV0dG9uVGV4dCwgc2F2ZUJ1dHRvblRleHQpO1xuXHR9IGVsc2Uge1xuXHRcdC8vIElmIHdlJ3JlIGluIGRyYWZ0IEFORCB0aGUgZHJhZnQgaXMgYSBuZXcgb2JqZWN0ICghSXNBY3RpdmVFbnRpdHkgJiYgIUhhc0FjdGl2ZUVudGl0eSksIHNob3cgY3JlYXRlLCBlbHNlIHNob3cgc2F2ZVxuXHRcdHNhdmVFeHByZXNzaW9uID0gaWZFbHNlKERyYWZ0LklzTmV3T2JqZWN0LCBjcmVhdGVCdXR0b25UZXh0LCBzYXZlQnV0dG9uVGV4dCk7XG5cdH1cblx0cmV0dXJuIGNvbXBpbGVFeHByZXNzaW9uKHNhdmVFeHByZXNzaW9uKTtcbn07XG5cbi8qKlxuICogTWV0aG9kIHJldHVybnMgd2hldGhlciBmb290ZXIgaXMgdmlzaWJsZSBvciBub3Qgb24gb2JqZWN0IC8gc3Vib2JqZWN0IHBhZ2UuXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAbmFtZSBnZXRGb290ZXJWaXNpYmxlXG4gKiBAcGFyYW0gZm9vdGVyQWN0aW9ucyBUaGUgZm9vdGVyIGFjdGlvbiBvYmplY3QgY29taW5nIGZyb20gdGhlIGNvbnZlcnRlclxuICogQHBhcmFtIGRhdGFGaWVsZHMgRGF0YSBmaWVsZCBhcnJheSBmb3Igbm9ybWFsIGZvb3RlciB2aXNpYmlsaXR5IHByb2Nlc3NpbmdcbiAqIEByZXR1cm5zIGB0cnVlYCBpZiBhbnkgYWN0aW9uIGlzIHRydWUsIG90aGVyd2lzZSBjb21waWxlZCBCaW5kaW5nIG9yIGBmYWxzZWBcbiAqL1xuZXhwb3J0IGNvbnN0IGdldEZvb3RlclZpc2libGUgPSBmdW5jdGlvbiAoXG5cdGZvb3RlckFjdGlvbnM6IENvbnZlcnRlckFjdGlvbltdLFxuXHRkYXRhRmllbGRzOiBEYXRhRmllbGRbXVxuKTogYm9vbGVhbiB8IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIHtcblx0Y29uc3QgbWFuaWZlc3RBY3Rpb25zID0gZm9vdGVyQWN0aW9ucy5maWx0ZXIoKGFjdGlvbikgPT4gaXNNYW5pZmVzdEFjdGlvbihhY3Rpb24pKSBhcyBNYW5pZmVzdEFjdGlvbltdO1xuXHRsZXQgY3VzdG9tQWN0aW9uVmlzaWJpbGl0eTogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+O1xuXHRpZiAobWFuaWZlc3RBY3Rpb25zLmxlbmd0aCkge1xuXHRcdC8vIElmIHdlIGhhdmUgbWFuaWZlc3QgYWN0aW9uc1xuXHRcdGNvbnN0IGN1c3RvbUFjdGlvbkluZGl2aWR1YWxWaXNpYmlsaXR5ID0gbWFuaWZlc3RBY3Rpb25zLm1hcCgoYWN0aW9uKSA9PiB7XG5cdFx0XHRyZXR1cm4gcmVzb2x2ZUJpbmRpbmdTdHJpbmc8Ym9vbGVhbj4oYWN0aW9uLnZpc2libGUgYXMgc3RyaW5nIHwgYm9vbGVhbiwgXCJib29sZWFuXCIpO1xuXHRcdH0pO1xuXHRcdC8vIGNvbnN0cnVjdCB0aGUgZm9vdGVyJ3MgdmlzaWJpbGl0eS1iaW5kaW5nIG91dCBvZiBhbGwgYWN0aW9ucycgdmlzaWJpbGl0eS1iaW5kaW5ncywgZmlyc3QgdGhlIGJpbmRpbmcgb2YgYWxsIGN1c3RvbSBhY3Rpb25zIC4uLlxuXHRcdGN1c3RvbUFjdGlvblZpc2liaWxpdHkgPSBvciguLi5jdXN0b21BY3Rpb25JbmRpdmlkdWFsVmlzaWJpbGl0eSk7XG5cdFx0Ly8gYW5kIHRoZW4gdGhlIGJpbmRpbmcgb2YgYWxsIGFubm90YXRpb24gYWN0aW9ucyBpbnNpZGUgdGhlIGZvb3RlciAuLi5cblx0XHRjb25zdCBhbm5vdGF0aW9uQWN0aW9uVmlzaWJpbGl0eSA9IGdldERhdGFGaWVsZEJhc2VkRm9vdGVyVmlzaWJpbGl0eShkYXRhRmllbGRzLCB0cnVlKTtcblx0XHQvLyBmaW5hbGx5LCByZXR1cm4gZXZlcnl0aGluZy5cblx0XHRyZXR1cm4gY29tcGlsZUV4cHJlc3Npb24ob3IoY3VzdG9tQWN0aW9uVmlzaWJpbGl0eSwgcmVzb2x2ZUJpbmRpbmdTdHJpbmc8Ym9vbGVhbj4oYW5ub3RhdGlvbkFjdGlvblZpc2liaWxpdHksIFwiYm9vbGVhblwiKSkpO1xuXHR9XG5cdHJldHVybiBnZXREYXRhRmllbGRCYXNlZEZvb3RlclZpc2liaWxpdHkoZGF0YUZpZWxkcywgdHJ1ZSk7XG59O1xuXG4vKipcbiAqIENoZWNrcyBpZiB0aGUgZm9vdGVyIGlzIHZpc2libGUgb3Igbm90LlxuICpcbiAqIEBmdW5jdGlvblxuICogQHN0YXRpY1xuICogQG5hbWUgc2FwLmZlLnRlbXBsYXRlcy5PYmplY3RQYWdlLk9iamVjdFBhZ2VUZW1wbGF0aW5nLmdldERhdGFGaWVsZEJhc2VkRm9vdGVyVmlzaWJpbGl0eVxuICogQG1lbWJlcm9mIHNhcC5mZS50ZW1wbGF0ZXMuT2JqZWN0UGFnZS5PYmplY3RQYWdlVGVtcGxhdGluZ1xuICogQHBhcmFtIGFEYXRhRmllbGRzIEFycmF5IG9mIERhdGFGaWVsZHMgaW4gdGhlIGlkZW50aWZpY2F0aW9uXG4gKiBAcGFyYW0gYkNvbnNpZGVyRWRpdGFibGUgV2hldGhlciB0aGUgZWRpdCBtb2RlIGJpbmRpbmcgaXMgcmVxdWlyZWQgb3Igbm90XG4gKiBAcmV0dXJucyBBbiBleHByZXNzaW9uIGlmIGFsbCB0aGUgYWN0aW9ucyBhcmUgdWkuaGlkZGVuLCB0cnVlIG90aGVyd2lzZVxuICogQHByaXZhdGVcbiAqIEB1aTUtcmVzdHJpY3RlZFxuICovXG5leHBvcnQgY29uc3QgZ2V0RGF0YUZpZWxkQmFzZWRGb290ZXJWaXNpYmlsaXR5ID0gZnVuY3Rpb24gKGFEYXRhRmllbGRzOiBhbnlbXSwgYkNvbnNpZGVyRWRpdGFibGU6IGJvb2xlYW4pIHtcblx0bGV0IHNIaWRkZW5FeHByZXNzaW9uID0gXCJcIjtcblx0bGV0IHNTZW1pSGlkZGVuRXhwcmVzc2lvbjtcblx0Y29uc3QgYUhpZGRlbkFjdGlvblBhdGggPSBbXTtcblxuXHRmb3IgKGNvbnN0IGkgaW4gYURhdGFGaWVsZHMpIHtcblx0XHRjb25zdCBvRGF0YUZpZWxkID0gYURhdGFGaWVsZHNbaV07XG5cdFx0aWYgKG9EYXRhRmllbGQuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFjdGlvbiAmJiBvRGF0YUZpZWxkLkRldGVybWluaW5nID09PSB0cnVlKSB7XG5cdFx0XHRjb25zdCBoaWRkZW5FeHByZXNzaW9uID0gb0RhdGFGaWVsZFtgQCR7VUlBbm5vdGF0aW9uVGVybXMuSGlkZGVufWBdO1xuXHRcdFx0aWYgKCFoaWRkZW5FeHByZXNzaW9uKSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fSBlbHNlIGlmIChoaWRkZW5FeHByZXNzaW9uLiRQYXRoKSB7XG5cdFx0XHRcdGlmIChhSGlkZGVuQWN0aW9uUGF0aC5pbmRleE9mKGhpZGRlbkV4cHJlc3Npb24uJFBhdGgpID09PSAtMSkge1xuXHRcdFx0XHRcdGFIaWRkZW5BY3Rpb25QYXRoLnB1c2goaGlkZGVuRXhwcmVzc2lvbi4kUGF0aCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRpZiAoYUhpZGRlbkFjdGlvblBhdGgubGVuZ3RoKSB7XG5cdFx0Zm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGFIaWRkZW5BY3Rpb25QYXRoLmxlbmd0aDsgaW5kZXgrKykge1xuXHRcdFx0aWYgKGFIaWRkZW5BY3Rpb25QYXRoW2luZGV4XSkge1xuXHRcdFx0XHRzU2VtaUhpZGRlbkV4cHJlc3Npb24gPSBcIigle1wiICsgYUhpZGRlbkFjdGlvblBhdGhbaW5kZXhdICsgXCJ9ID09PSB0cnVlID8gZmFsc2UgOiB0cnVlIClcIjtcblx0XHRcdH1cblx0XHRcdGlmIChpbmRleCA9PSBhSGlkZGVuQWN0aW9uUGF0aC5sZW5ndGggLSAxKSB7XG5cdFx0XHRcdHNIaWRkZW5FeHByZXNzaW9uID0gc0hpZGRlbkV4cHJlc3Npb24gKyBzU2VtaUhpZGRlbkV4cHJlc3Npb247XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRzSGlkZGVuRXhwcmVzc2lvbiA9IHNIaWRkZW5FeHByZXNzaW9uICsgc1NlbWlIaWRkZW5FeHByZXNzaW9uICsgXCJ8fFwiO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gKFxuXHRcdFx0XCJ7PSBcIiArXG5cdFx0XHQoYkNvbnNpZGVyRWRpdGFibGUgPyBcIihcIiA6IFwiXCIpICtcblx0XHRcdHNIaWRkZW5FeHByZXNzaW9uICtcblx0XHRcdChiQ29uc2lkZXJFZGl0YWJsZSA/IFwiIHx8ICR7dWk+L2lzRWRpdGFibGV9KSBcIiA6IFwiIFwiKSArXG5cdFx0XHRcIiYmICR7aW50ZXJuYWw+aXNDcmVhdGVEaWFsb2dPcGVufSAhPT0gdHJ1ZX1cIlxuXHRcdCk7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIFwiez0gXCIgKyAoYkNvbnNpZGVyRWRpdGFibGUgPyBcIiR7dWk+L2lzRWRpdGFibGV9ICYmIFwiIDogXCJcIikgKyBcIiR7aW50ZXJuYWw+aXNDcmVhdGVEaWFsb2dPcGVufSAhPT0gdHJ1ZX1cIjtcblx0fVxufTtcblxuLyoqXG4gKiBNZXRob2QgcmV0dXJucyBXaGV0aGVyIHRoZSBhY3Rpb24gdHlwZSBpcyBtYW5pZmVzdCBvciBub3QuXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAbmFtZSBpc01hbmlmZXN0QWN0aW9uVmlzaWJsZVxuICogQHBhcmFtIG9BY3Rpb24gVGhlIGFjdGlvbiBvYmplY3RcbiAqIEByZXR1cm5zIGB0cnVlYCBpZiBhY3Rpb24gaXMgY29taW5nIGZyb20gbWFuaWZlc3QsIGBmYWxzZWAgb3RoZXJ3aXNlXG4gKi9cbmV4cG9ydCBjb25zdCBpc01hbmlmZXN0QWN0aW9uID0gZnVuY3Rpb24gKG9BY3Rpb246IGFueSkge1xuXHRjb25zdCBhQWN0aW9ucyA9IFtcblx0XHRcIlByaW1hcnlcIixcblx0XHRcIkRlZmF1bHRBcHBseVwiLFxuXHRcdFwiU2Vjb25kYXJ5XCIsXG5cdFx0XCJGb3JBY3Rpb25cIixcblx0XHRcIkZvck5hdmlnYXRpb25cIixcblx0XHRcIlN3aXRjaFRvQWN0aXZlT2JqZWN0XCIsXG5cdFx0XCJTd2l0Y2hUb0RyYWZ0T2JqZWN0XCIsXG5cdFx0XCJEcmFmdEFjdGlvbnNcIlxuXHRdO1xuXHRyZXR1cm4gYUFjdGlvbnMuaW5kZXhPZihvQWN0aW9uLnR5cGUpIDwgMDtcbn07XG5cbi8qKlxuICogUmV0dXJucyBhbiBleHByZXNzaW9uIHRvIGRldGVybWluZSBFbXBoYXNpemVkICBidXR0b24gdHlwZSBiYXNlZCBvbiBDcml0aWNhbGl0eSBhY3Jvc3MgYWxsIGFjdGlvbnNcbiAqIElmIGNyaXRpY2FsIGFjdGlvbiBpcyByZW5kZXJlZCwgaXRzIGNvbnNpZGVyZWQgdG8gYmUgdGhlIHByaW1hcnkgYWN0aW9uLiBIZW5jZSB0ZW1wbGF0ZSdzIGRlZmF1bHQgcHJpbWFyeSBhY3Rpb24gaXMgc2V0IGJhY2sgdG8gRGVmYXVsdC5cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBzdGF0aWNcbiAqIEBuYW1lIHNhcC5mZS50ZW1wbGF0ZXMuT2JqZWN0UGFnZS5PYmplY3RQYWdlVGVtcGxhdGluZy5idWlsZEVtcGhhc2l6ZWRCdXR0b25FeHByZXNzaW9uXG4gKiBAbWVtYmVyb2Ygc2FwLmZlLnRlbXBsYXRlcy5PYmplY3RQYWdlLk9iamVjdFBhZ2VUZW1wbGF0aW5nXG4gKiBAcGFyYW0gYUlkZW50aWZpY2F0aW9uIEFycmF5IG9mIGFsbCB0aGUgRGF0YUZpZWxkcyBpbiBJZGVudGlmaWNhdGlvblxuICogQHJldHVybnMgQW4gZXhwcmVzc2lvbiB0byBkZWR1Y2UgaWYgYnV0dG9uIHR5cGUgaXMgRGVmYXVsdCBvciBFbXBoYXNpemVkXG4gKiBAcHJpdmF0ZVxuICogQHVpNS1yZXN0cmljdGVkXG4gKi9cbmV4cG9ydCBjb25zdCBidWlsZEVtcGhhc2l6ZWRCdXR0b25FeHByZXNzaW9uID0gZnVuY3Rpb24gKGFJZGVudGlmaWNhdGlvbj86IGFueVtdKSB7XG5cdGlmICghYUlkZW50aWZpY2F0aW9uKSB7XG5cdFx0cmV0dXJuIEJ1dHRvblR5cGUuRW1waGFzaXplZDtcblx0fVxuXHRsZXQgc0Zvcm1hdEVtcGhhc2l6ZWRFeHByZXNzaW9uOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cdGxldCBiSXNBbHdheXNEZWZhdWx0OiBib29sZWFuLFxuXHRcdHNIaWRkZW5TaW1wbGVQYXRoLFxuXHRcdHNIaWRkZW5FeHByZXNzaW9uID0gXCJcIjtcblx0YUlkZW50aWZpY2F0aW9uLmZvckVhY2goZnVuY3Rpb24gKG9EYXRhRmllbGQ6IGFueSkge1xuXHRcdGNvbnN0IG9Dcml0aWNhbGl0eVByb3BlcnR5ID0gb0RhdGFGaWVsZC5Dcml0aWNhbGl0eTtcblx0XHRjb25zdCBvRGF0YUZpZWxkSGlkZGVuID0gb0RhdGFGaWVsZFtcIkBjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5IaWRkZW5cIl07XG5cdFx0aWYgKG9EYXRhRmllbGQuJFR5cGUgPT09IFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuRGF0YUZpZWxkRm9yQWN0aW9uXCIgJiYgIWJJc0Fsd2F5c0RlZmF1bHQgJiYgb0NyaXRpY2FsaXR5UHJvcGVydHkpIHtcblx0XHRcdGlmICghc0Zvcm1hdEVtcGhhc2l6ZWRFeHByZXNzaW9uICYmIG9EYXRhRmllbGRIaWRkZW4gPT09IHRydWUpIHtcblx0XHRcdFx0Ly8gaWYgRGF0YUZpZWxkIGlzIHNldCB0byBoaWRkZW4sIHdlIGNhbiBza2lwIG90aGVyIGNoZWNrcyBhbmQgcmV0dXJuIERlZmF1bHQgYnV0dG9uIHR5cGVcblx0XHRcdFx0c0Zvcm1hdEVtcGhhc2l6ZWRFeHByZXNzaW9uID0gQnV0dG9uVHlwZS5FbXBoYXNpemVkO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRpZiAob0RhdGFGaWVsZEhpZGRlbiAmJiBvRGF0YUZpZWxkSGlkZGVuLiRQYXRoKSB7XG5cdFx0XHRcdC8vIHdoZW4gdmlzaWJpbGl0eSBvZiBjcml0aWNhbCBidXR0b24gaXMgYmFzZWQgb24gcGF0aCwgY29sbGVjdCBhbGwgcGF0aHMgZm9yIGV4cHJlc3Npb25cblx0XHRcdFx0c0hpZGRlblNpbXBsZVBhdGggPSBvRGF0YUZpZWxkSGlkZGVuLiRQYXRoO1xuXHRcdFx0XHRpZiAoc0hpZGRlbkV4cHJlc3Npb24pIHtcblx0XHRcdFx0XHRzSGlkZGVuRXhwcmVzc2lvbiA9IHNIaWRkZW5FeHByZXNzaW9uICsgXCIgJiYgXCI7XG5cdFx0XHRcdH1cblx0XHRcdFx0c0hpZGRlbkV4cHJlc3Npb24gPSBzSGlkZGVuRXhwcmVzc2lvbiArIFwiJXtcIiArIHNIaWRkZW5TaW1wbGVQYXRoICsgXCJ9ID09PSB0cnVlXCI7XG5cdFx0XHRcdHNGb3JtYXRFbXBoYXNpemVkRXhwcmVzc2lvbiA9IFwiez0gKFwiICsgc0hpZGRlbkV4cHJlc3Npb24gKyBcIikgPyAnRW1waGFzaXplZCcgOiAnRGVmYXVsdCcgfVwiO1xuXHRcdFx0fVxuXHRcdFx0c3dpdGNoIChvQ3JpdGljYWxpdHlQcm9wZXJ0eS4kRW51bU1lbWJlcikge1xuXHRcdFx0XHQvLyBzdXBwb3J0ZWQgY3JpdGljYWxpdHkgYXJlIFtQb3NpdGl2ZS8zLyczJ10gYW5kIFtOZWdhdGl2ZS8xLycxJ11cblx0XHRcdFx0Y2FzZSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkNyaXRpY2FsaXR5VHlwZS9OZWdhdGl2ZVwiOlxuXHRcdFx0XHRjYXNlIFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuQ3JpdGljYWxpdHlUeXBlL1Bvc2l0aXZlXCI6XG5cdFx0XHRcdGNhc2UgXCIxXCI6XG5cdFx0XHRcdGNhc2UgMTpcblx0XHRcdFx0Y2FzZSBcIjNcIjpcblx0XHRcdFx0Y2FzZSAzOlxuXHRcdFx0XHRcdGlmICghb0RhdGFGaWVsZEhpZGRlbikge1xuXHRcdFx0XHRcdFx0c0Zvcm1hdEVtcGhhc2l6ZWRFeHByZXNzaW9uID0gQnV0dG9uVHlwZS5EZWZhdWx0O1xuXHRcdFx0XHRcdFx0YklzQWx3YXlzRGVmYXVsdCA9IHRydWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHNGb3JtYXRFbXBoYXNpemVkRXhwcmVzc2lvbiA9IHNGb3JtYXRFbXBoYXNpemVkRXhwcmVzc2lvbiB8fCBCdXR0b25UeXBlLkRlZmF1bHQ7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0c0Zvcm1hdEVtcGhhc2l6ZWRFeHByZXNzaW9uID0gQnV0dG9uVHlwZS5FbXBoYXNpemVkO1xuXHRcdFx0fVxuXHRcdFx0aWYgKG9Dcml0aWNhbGl0eVByb3BlcnR5LiRQYXRoKSB7XG5cdFx0XHRcdC8vIHdoZW4gQ3JpdGljYWxpdHkgaXMgc2V0IHVzaW5nIGEgcGF0aCwgdXNlIHRoZSBwYXRoIGZvciBkZWR1Y2luZyB0aGUgRW1waHNpemVkIHR5cGUgZm9yIGRlZmF1bHQgUHJpbWFyeSBBY3Rpb25cblx0XHRcdFx0Y29uc3Qgc0NvbWJpbmVkSGlkZGVuRXhwcmVzc2lvbiA9IHNIaWRkZW5FeHByZXNzaW9uID8gXCIhKFwiICsgc0hpZGRlbkV4cHJlc3Npb24gKyBcIikgJiYgXCIgOiBcIlwiO1xuXHRcdFx0XHRzRm9ybWF0RW1waGFzaXplZEV4cHJlc3Npb24gPVxuXHRcdFx0XHRcdFwiez0gXCIgK1xuXHRcdFx0XHRcdHNDb21iaW5lZEhpZGRlbkV4cHJlc3Npb24gK1xuXHRcdFx0XHRcdFwiKCgke1wiICtcblx0XHRcdFx0XHRvQ3JpdGljYWxpdHlQcm9wZXJ0eS4kUGF0aCArXG5cdFx0XHRcdFx0XCJ9ID09PSAnY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuQ3JpdGljYWxpdHlUeXBlL05lZ2F0aXZlJykgfHwgKCR7XCIgK1xuXHRcdFx0XHRcdG9Dcml0aWNhbGl0eVByb3BlcnR5LiRQYXRoICtcblx0XHRcdFx0XHRcIn0gPT09ICcxJykgfHwgKCR7XCIgK1xuXHRcdFx0XHRcdG9Dcml0aWNhbGl0eVByb3BlcnR5LiRQYXRoICtcblx0XHRcdFx0XHRcIn0gPT09IDEpIFwiICtcblx0XHRcdFx0XHRcInx8ICgke1wiICtcblx0XHRcdFx0XHRvQ3JpdGljYWxpdHlQcm9wZXJ0eS4kUGF0aCArXG5cdFx0XHRcdFx0XCJ9ID09PSAnY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuQ3JpdGljYWxpdHlUeXBlL1Bvc2l0aXZlJykgfHwgKCR7XCIgK1xuXHRcdFx0XHRcdG9Dcml0aWNhbGl0eVByb3BlcnR5LiRQYXRoICtcblx0XHRcdFx0XHRcIn0gPT09ICczJykgfHwgKCR7XCIgK1xuXHRcdFx0XHRcdG9Dcml0aWNhbGl0eVByb3BlcnR5LiRQYXRoICtcblx0XHRcdFx0XHRcIn0gPT09IDMpKSA/IFwiICtcblx0XHRcdFx0XHRcIidEZWZhdWx0J1wiICtcblx0XHRcdFx0XHRcIiA6IFwiICtcblx0XHRcdFx0XHRcIidFbXBoYXNpemVkJ1wiICtcblx0XHRcdFx0XHRcIiB9XCI7XG5cdFx0XHR9XG5cdFx0fVxuXHR9KTtcblx0cmV0dXJuIHNGb3JtYXRFbXBoYXNpemVkRXhwcmVzc2lvbiB8fCBCdXR0b25UeXBlLkVtcGhhc2l6ZWQ7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0RWxlbWVudEJpbmRpbmcgPSBmdW5jdGlvbiAoc1BhdGg6IGFueSkge1xuXHRjb25zdCBzTmF2aWdhdGlvblBhdGggPSBPRGF0YU1vZGVsQW5ub3RhdGlvbkhlbHBlci5nZXROYXZpZ2F0aW9uUGF0aChzUGF0aCk7XG5cdGlmIChzTmF2aWdhdGlvblBhdGgpIHtcblx0XHRyZXR1cm4gXCJ7cGF0aDonXCIgKyBzTmF2aWdhdGlvblBhdGggKyBcIid9XCI7XG5cdH0gZWxzZSB7XG5cdFx0Ly9ubyBuYXZpZ2F0aW9uIHByb3BlcnR5IG5lZWRzIGVtcHR5IG9iamVjdFxuXHRcdHJldHVybiBcIntwYXRoOiAnJ31cIjtcblx0fVxufTtcblxuLyoqXG4gKiBGdW5jdGlvbiB0byBjaGVjayBpZiBkcmFmdCBwYXR0ZXJuIGlzIHN1cHBvcnRlZC5cbiAqXG4gKiBAcGFyYW0gb0Fubm90YXRpb25zIEFubm90YXRpb25zIG9mIHRoZSBjdXJyZW50IGVudGl0eSBzZXQuXG4gKiBAcmV0dXJucyBSZXR1cm5zIHRoZSBCb29sZWFuIHZhbHVlIGJhc2VkIG9uIGRyYWZ0IHN0YXRlXG4gKi9cbmV4cG9ydCBjb25zdCBjaGVja0RyYWZ0U3RhdGUgPSBmdW5jdGlvbiAob0Fubm90YXRpb25zOiBhbnkpIHtcblx0aWYgKFxuXHRcdG9Bbm5vdGF0aW9uc1tcIkBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnRSb290XCJdICYmXG5cdFx0b0Fubm90YXRpb25zW1wiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EcmFmdFJvb3RcIl1bXCJFZGl0QWN0aW9uXCJdXG5cdCkge1xuXHRcdHJldHVybiB0cnVlO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxufTtcblxuLyoqXG4gKiBGdW5jdGlvbiB0byBnZXQgdGhlIHZpc2liaWxpdHkgZm9yIHRoZSBTd2l0Y2hUb0FjdGl2ZSBidXR0b24gaW4gdGhlIG9iamVjdCBwYWdlIG9yIHN1Ym9iamVjdCBwYWdlLlxuICpcbiAqIEBwYXJhbSBvQW5ub3RhdGlvbnMgQW5ub3RhdGlvbnMgb2YgdGhlIGN1cnJlbnQgZW50aXR5IHNldC5cbiAqIEByZXR1cm5zIFJldHVybnMgZXhwcmVzc2lvbiBiaW5kaW5nIG9yIEJvb2xlYW4gdmFsdWUgYmFzZWQgb24gdGhlIGRyYWZ0IHN0YXRlXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRTd2l0Y2hUb0FjdGl2ZVZpc2liaWxpdHkgPSBmdW5jdGlvbiAob0Fubm90YXRpb25zOiBhbnkpOiBhbnkge1xuXHRpZiAoY2hlY2tEcmFmdFN0YXRlKG9Bbm5vdGF0aW9ucykpIHtcblx0XHRyZXR1cm4gXCJ7PSAoJXtEcmFmdEFkbWluaXN0cmF0aXZlRGF0YS9EcmFmdElzQ3JlYXRlZEJ5TWV9KSA/ICggJHt1aT4vaXNFZGl0YWJsZX0gJiYgISR7dWk+Y3JlYXRlTW9kZX0gJiYgJXtEcmFmdEFkbWluaXN0cmF0aXZlRGF0YS9EcmFmdElzQ3JlYXRlZEJ5TWV9ICkgOiBmYWxzZSB9XCI7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG59O1xuXG4vKipcbiAqIEZ1bmN0aW9uIHRvIGdldCB0aGUgdmlzaWJpbGl0eSBmb3IgdGhlIFN3aXRjaFRvRHJhZnQgYnV0dG9uIGluIHRoZSBvYmplY3QgcGFnZSBvciBzdWJvYmplY3QgcGFnZS5cbiAqXG4gKiBAcGFyYW0gb0Fubm90YXRpb25zIEFubm90YXRpb25zIG9mIHRoZSBjdXJyZW50IGVudGl0eSBzZXQuXG4gKiBAcmV0dXJucyBSZXR1cm5zIGV4cHJlc3Npb24gYmluZGluZyBvciBCb29sZWFuIHZhbHVlIGJhc2VkIG9uIHRoZSBkcmFmdCBzdGF0ZVxuICovXG5leHBvcnQgY29uc3QgZ2V0U3dpdGNoVG9EcmFmdFZpc2liaWxpdHkgPSBmdW5jdGlvbiAob0Fubm90YXRpb25zOiBhbnkpOiBhbnkge1xuXHRpZiAoY2hlY2tEcmFmdFN0YXRlKG9Bbm5vdGF0aW9ucykpIHtcblx0XHRyZXR1cm4gXCJ7PSAoJXtEcmFmdEFkbWluaXN0cmF0aXZlRGF0YS9EcmFmdElzQ3JlYXRlZEJ5TWV9KSA/ICggISgke3VpPi9pc0VkaXRhYmxlfSkgJiYgISR7dWk+Y3JlYXRlTW9kZX0gJiYgJHtIYXNEcmFmdEVudGl0eX0gJiYgJXtEcmFmdEFkbWluaXN0cmF0aXZlRGF0YS9EcmFmdElzQ3JlYXRlZEJ5TWV9ICkgOiBmYWxzZSB9XCI7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG59O1xuXG4vKipcbiAqIEZ1bmN0aW9uIHRvIGdldCB0aGUgdmlzaWJpbGl0eSBmb3IgdGhlIFN3aXRjaERyYWZ0QW5kQWN0aXZlIGJ1dHRvbiBpbiB0aGUgb2JqZWN0IHBhZ2Ugb3Igc3Vib2JqZWN0IHBhZ2UuXG4gKlxuICogQHBhcmFtIG9Bbm5vdGF0aW9ucyBBbm5vdGF0aW9ucyBvZiB0aGUgY3VycmVudCBlbnRpdHkgc2V0LlxuICogQHJldHVybnMgUmV0dXJucyBleHByZXNzaW9uIGJpbmRpbmcgb3IgQm9vbGVhbiB2YWx1ZSBiYXNlZCBvbiB0aGUgZHJhZnQgc3RhdGVcbiAqL1xuZXhwb3J0IGNvbnN0IGdldFN3aXRjaERyYWZ0QW5kQWN0aXZlVmlzaWJpbGl0eSA9IGZ1bmN0aW9uIChvQW5ub3RhdGlvbnM6IGFueSk6IGFueSB7XG5cdGlmIChjaGVja0RyYWZ0U3RhdGUob0Fubm90YXRpb25zKSkge1xuXHRcdHJldHVybiBcIns9ICgle0RyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhL0RyYWZ0SXNDcmVhdGVkQnlNZX0pID8gKCAhJHt1aT5jcmVhdGVNb2RlfSAmJiAle0RyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhL0RyYWZ0SXNDcmVhdGVkQnlNZX0gKSA6IGZhbHNlIH1cIjtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cbn07XG5cbi8qKlxuICogRnVuY3Rpb24gdG8gZmluZCBhbiBhY3Rpb24gZnJvbSB0aGUgYXJyYXkgb2YgaGVhZGVyIGFjdGlvbnMgaW4gdGhlIGNvbnZlcnRlciBjb250ZXh0LlxuICpcbiAqIEBwYXJhbSBhQ29udmVydGVyQ29udGV4dEhlYWRlckFjdGlvbnMgQXJyYXkgb2YgJ2hlYWRlcicgYWN0aW9ucyBvbiB0aGUgb2JqZWN0IHBhZ2UuXG4gKiBAcGFyYW0gc0FjdGlvblR5cGUgVGhlIGFjdGlvbiB0eXBlXG4gKiBAcmV0dXJucyBUaGUgYWN0aW9uIHdpdGggdGhlIG1hdGNoaW5nIGFjdGlvbiB0eXBlXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgY29uc3QgX2ZpbmRBY3Rpb24gPSBmdW5jdGlvbiAoYUNvbnZlcnRlckNvbnRleHRIZWFkZXJBY3Rpb25zOiBhbnlbXSwgc0FjdGlvblR5cGU6IHN0cmluZykge1xuXHRsZXQgb0FjdGlvbjtcblx0aWYgKGFDb252ZXJ0ZXJDb250ZXh0SGVhZGVyQWN0aW9ucyAmJiBhQ29udmVydGVyQ29udGV4dEhlYWRlckFjdGlvbnMubGVuZ3RoKSB7XG5cdFx0b0FjdGlvbiA9IGFDb252ZXJ0ZXJDb250ZXh0SGVhZGVyQWN0aW9ucy5maW5kKGZ1bmN0aW9uIChvSGVhZGVyQWN0aW9uOiBhbnkpIHtcblx0XHRcdHJldHVybiBvSGVhZGVyQWN0aW9uLnR5cGUgPT09IHNBY3Rpb25UeXBlO1xuXHRcdH0pO1xuXHR9XG5cdHJldHVybiBvQWN0aW9uO1xufTtcblxuLyoqXG4gKiBGdW5jdGlvbiB0byBmb3JtYXQgdGhlICdlbmFibGVkJyBwcm9wZXJ0eSBmb3IgdGhlIERlbGV0ZSBidXR0b24gb24gdGhlIG9iamVjdCBwYWdlIG9yIHN1Ym9iamVjdCBwYWdlIGluIGNhc2Ugb2YgYSBDb21tYW5kIEV4ZWN1dGlvbi5cbiAqXG4gKiBAcGFyYW0gYUNvbnZlcnRlckNvbnRleHRIZWFkZXJBY3Rpb25zIEFycmF5IG9mIGhlYWRlciBhY3Rpb25zIG9uIHRoZSBvYmplY3QgcGFnZVxuICogQHJldHVybnMgUmV0dXJucyBleHByZXNzaW9uIGJpbmRpbmcgb3IgQm9vbGVhbiB2YWx1ZSBmcm9tIHRoZSBjb252ZXJ0ZXIgb3V0cHV0XG4gKi9cbmV4cG9ydCBjb25zdCBnZXREZWxldGVDb21tYW5kRXhlY3V0aW9uRW5hYmxlZCA9IGZ1bmN0aW9uIChhQ29udmVydGVyQ29udGV4dEhlYWRlckFjdGlvbnM6IGFueVtdKSB7XG5cdGNvbnN0IG9EZWxldGVBY3Rpb24gPSBfZmluZEFjdGlvbihhQ29udmVydGVyQ29udGV4dEhlYWRlckFjdGlvbnMsIFwiU2Vjb25kYXJ5XCIpO1xuXHRyZXR1cm4gb0RlbGV0ZUFjdGlvbiA/IG9EZWxldGVBY3Rpb24uZW5hYmxlZCA6IFwidHJ1ZVwiO1xufTtcblxuLyoqXG4gKiBGdW5jdGlvbiB0byBmb3JtYXQgdGhlICd2aXNpYmxlJyBwcm9wZXJ0eSBmb3IgdGhlIERlbGV0ZSBidXR0b24gb24gdGhlIG9iamVjdCBwYWdlIG9yIHN1Ym9iamVjdCBwYWdlIGluIGNhc2Ugb2YgYSBDb21tYW5kIEV4ZWN1dGlvbi5cbiAqXG4gKiBAcGFyYW0gYUNvbnZlcnRlckNvbnRleHRIZWFkZXJBY3Rpb25zIEFycmF5IG9mIGhlYWRlciBhY3Rpb25zIG9uIHRoZSBvYmplY3QgcGFnZVxuICogQHJldHVybnMgUmV0dXJucyBleHByZXNzaW9uIGJpbmRpbmcgb3IgQm9vbGVhbiB2YWx1ZSBmcm9tIHRoZSBjb252ZXJ0ZXIgb3V0cHV0XG4gKi9cbmV4cG9ydCBjb25zdCBnZXREZWxldGVDb21tYW5kRXhlY3V0aW9uVmlzaWJsZSA9IGZ1bmN0aW9uIChhQ29udmVydGVyQ29udGV4dEhlYWRlckFjdGlvbnM6IGFueVtdKSB7XG5cdGNvbnN0IG9EZWxldGVBY3Rpb24gPSBfZmluZEFjdGlvbihhQ29udmVydGVyQ29udGV4dEhlYWRlckFjdGlvbnMsIFwiU2Vjb25kYXJ5XCIpO1xuXHRyZXR1cm4gb0RlbGV0ZUFjdGlvbiA/IG9EZWxldGVBY3Rpb24udmlzaWJsZSA6IFwidHJ1ZVwiO1xufTtcblxuLyoqXG4gKiBGdW5jdGlvbiB0byBmb3JtYXQgdGhlICd2aXNpYmxlJyBwcm9wZXJ0eSBmb3IgdGhlIEVkaXQgYnV0dG9uIG9uIHRoZSBvYmplY3QgcGFnZSBvciBzdWJvYmplY3QgcGFnZSBpbiBjYXNlIG9mIGEgQ29tbWFuZCBFeGVjdXRpb24uXG4gKlxuICogQHBhcmFtIGFDb252ZXJ0ZXJDb250ZXh0SGVhZGVyQWN0aW9ucyBBcnJheSBvZiBoZWFkZXIgYWN0aW9ucyBvbiB0aGUgb2JqZWN0IHBhZ2VcbiAqIEByZXR1cm5zIFJldHVybnMgZXhwcmVzc2lvbiBiaW5kaW5nIG9yIEJvb2xlYW4gdmFsdWUgZnJvbSB0aGUgY29udmVydGVyIG91dHB1dFxuICovXG5leHBvcnQgY29uc3QgZ2V0RWRpdENvbW1hbmRFeGVjdXRpb25WaXNpYmxlID0gZnVuY3Rpb24gKGFDb252ZXJ0ZXJDb250ZXh0SGVhZGVyQWN0aW9uczogYW55W10pIHtcblx0Y29uc3Qgb0VkaXRBY3Rpb24gPSBfZmluZEFjdGlvbihhQ29udmVydGVyQ29udGV4dEhlYWRlckFjdGlvbnMsIFwiUHJpbWFyeVwiKTtcblx0cmV0dXJuIG9FZGl0QWN0aW9uID8gb0VkaXRBY3Rpb24udmlzaWJsZSA6IFwidHJ1ZVwiO1xufTtcblxuLyoqXG4gKiBGdW5jdGlvbiB0byBmb3JtYXQgdGhlICdlbmFibGVkJyBwcm9wZXJ0eSBmb3IgdGhlIEVkaXQgYnV0dG9uIG9uIHRoZSBvYmplY3QgcGFnZSBvciBzdWJvYmplY3QgcGFnZSBpbiBjYXNlIG9mIGEgQ29tbWFuZCBFeGVjdXRpb24uXG4gKlxuICogQHBhcmFtIGFDb252ZXJ0ZXJDb250ZXh0SGVhZGVyQWN0aW9ucyBBcnJheSBvZiBoZWFkZXIgYWN0aW9ucyBvbiB0aGUgb2JqZWN0IHBhZ2VcbiAqIEByZXR1cm5zIFJldHVybnMgZXhwcmVzc2lvbiBiaW5kaW5nIG9yIEJvb2xlYW4gdmFsdWUgZnJvbSB0aGUgY29udmVydGVyIG91dHB1dFxuICovXG5leHBvcnQgY29uc3QgZ2V0RWRpdENvbW1hbmRFeGVjdXRpb25FbmFibGVkID0gZnVuY3Rpb24gKGFDb252ZXJ0ZXJDb250ZXh0SGVhZGVyQWN0aW9uczogYW55W10pIHtcblx0Y29uc3Qgb0VkaXRBY3Rpb24gPSBfZmluZEFjdGlvbihhQ29udmVydGVyQ29udGV4dEhlYWRlckFjdGlvbnMsIFwiUHJpbWFyeVwiKTtcblx0cmV0dXJuIG9FZGl0QWN0aW9uID8gb0VkaXRBY3Rpb24uZW5hYmxlZCA6IFwidHJ1ZVwiO1xufTtcblxuLyoqXG4gKiBGdW5jdGlvbiB0byBnZXQgdGhlIEVkaXRBY3Rpb24gZnJvbSB0aGUgRW50aXR5c2V0IGJhc2VkIG9uIERyYWZ0IG9yIHN0aWNreSBiYXNlZCBhcHBsaWNhdGlvbi5cbiAqXG4gKiBAcGFyYW0gW29FbnRpdHlTZXRdIFRoZSB2YWx1ZSBmcm9tIHRoZSBleHByZXNzaW9uLlxuICogQHJldHVybnMgUmV0dXJucyBleHByZXNzaW9uIGJpbmRpbmcgb3IgYm9vbGVhbiB2YWx1ZSBiYXNlZCBvbiB2UmF3VmFsdWUgJiBvRHJhZnROb2RlXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRFZGl0QWN0aW9uID0gZnVuY3Rpb24gKG9FbnRpdHlTZXQ6IENvbnRleHQpIHtcblx0Y29uc3Qgc1BhdGggPSBvRW50aXR5U2V0LmdldFBhdGgoKSxcblx0XHRvQW5ub3RhdGlvbnMgPSBvRW50aXR5U2V0LmdldE9iamVjdChgJHtzUGF0aH1AYCk7XG5cdGNvbnN0IGJEcmFmdFJvb3QgPSBvQW5ub3RhdGlvbnMuaGFzT3duUHJvcGVydHkoXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRyYWZ0Um9vdFwiKTtcblx0Y29uc3QgYlN0aWNreVNlc3Npb24gPSBvQW5ub3RhdGlvbnMuaGFzT3duUHJvcGVydHkoXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuU2Vzc2lvbi52MS5TdGlja3lTZXNzaW9uU3VwcG9ydGVkXCIpO1xuXHRsZXQgc0FjdGlvbk5hbWU7XG5cdGlmIChiRHJhZnRSb290KSB7XG5cdFx0c0FjdGlvbk5hbWUgPSBvRW50aXR5U2V0LmdldE9iamVjdChgJHtzUGF0aH1AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRyYWZ0Um9vdC9FZGl0QWN0aW9uYCk7XG5cdH0gZWxzZSBpZiAoYlN0aWNreVNlc3Npb24pIHtcblx0XHRzQWN0aW9uTmFtZSA9IG9FbnRpdHlTZXQuZ2V0T2JqZWN0KGAke3NQYXRofUBjb20uc2FwLnZvY2FidWxhcmllcy5TZXNzaW9uLnYxLlN0aWNreVNlc3Npb25TdXBwb3J0ZWQvRWRpdEFjdGlvbmApO1xuXHR9XG5cdHJldHVybiAhc0FjdGlvbk5hbWUgPyBzQWN0aW9uTmFtZSA6IGAke3NQYXRofS8ke3NBY3Rpb25OYW1lfWA7XG59O1xuXG5leHBvcnQgY29uc3QgaXNSZWFkT25seUZyb21TdGF0aWNBbm5vdGF0aW9ucyA9IGZ1bmN0aW9uIChvQW5ub3RhdGlvbnM6IGFueSwgb0ZpZWxkQ29udHJvbDogYW55KSB7XG5cdGxldCBiQ29tcHV0ZWQsIGJJbW11dGFibGUsIGJSZWFkT25seTtcblx0aWYgKG9Bbm5vdGF0aW9ucyAmJiBvQW5ub3RhdGlvbnNbXCJAT3JnLk9EYXRhLkNvcmUuVjEuQ29tcHV0ZWRcIl0pIHtcblx0XHRiQ29tcHV0ZWQgPSBvQW5ub3RhdGlvbnNbXCJAT3JnLk9EYXRhLkNvcmUuVjEuQ29tcHV0ZWRcIl0uQm9vbCA/IG9Bbm5vdGF0aW9uc1tcIkBPcmcuT0RhdGEuQ29yZS5WMS5Db21wdXRlZFwiXS5Cb29sID09IFwidHJ1ZVwiIDogdHJ1ZTtcblx0fVxuXHRpZiAob0Fubm90YXRpb25zICYmIG9Bbm5vdGF0aW9uc1tcIkBPcmcuT0RhdGEuQ29yZS5WMS5JbW11dGFibGVcIl0pIHtcblx0XHRiSW1tdXRhYmxlID0gb0Fubm90YXRpb25zW1wiQE9yZy5PRGF0YS5Db3JlLlYxLkltbXV0YWJsZVwiXS5Cb29sID8gb0Fubm90YXRpb25zW1wiQE9yZy5PRGF0YS5Db3JlLlYxLkltbXV0YWJsZVwiXS5Cb29sID09IFwidHJ1ZVwiIDogdHJ1ZTtcblx0fVxuXHRiUmVhZE9ubHkgPSBiQ29tcHV0ZWQgfHwgYkltbXV0YWJsZTtcblxuXHRpZiAob0ZpZWxkQ29udHJvbCkge1xuXHRcdGJSZWFkT25seSA9IGJSZWFkT25seSB8fCBvRmllbGRDb250cm9sID09IFwiY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkZpZWxkQ29udHJvbFR5cGUvUmVhZE9ubHlcIjtcblx0fVxuXHRpZiAoYlJlYWRPbmx5KSB7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG59O1xuXG5leHBvcnQgY29uc3QgcmVhZE9ubHlFeHByZXNzaW9uRnJvbUR5bmFtaWNBbm5vdGF0aW9ucyA9IGZ1bmN0aW9uIChvRmllbGRDb250cm9sOiBhbnkpIHtcblx0bGV0IHNJc0ZpZWxkQ29udHJvbFBhdGhSZWFkT25seTtcblx0aWYgKG9GaWVsZENvbnRyb2wpIHtcblx0XHRpZiAoKE1hbmFnZWRPYmplY3QgYXMgYW55KS5iaW5kaW5nUGFyc2VyKG9GaWVsZENvbnRyb2wpKSB7XG5cdFx0XHRzSXNGaWVsZENvbnRyb2xQYXRoUmVhZE9ubHkgPSBcIiVcIiArIG9GaWVsZENvbnRyb2wgKyBcIiA9PT0gMSBcIjtcblx0XHR9XG5cdH1cblx0aWYgKHNJc0ZpZWxkQ29udHJvbFBhdGhSZWFkT25seSkge1xuXHRcdHJldHVybiBcIns9IFwiICsgc0lzRmllbGRDb250cm9sUGF0aFJlYWRPbmx5ICsgXCI/IGZhbHNlIDogdHJ1ZSB9XCI7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxufTtcblxuLypcbiAqIEZ1bmN0aW9uIHRvIGdldCB0aGUgZXhwcmVzc2lvbiBmb3IgY2hhcnQgVGl0bGUgUHJlc3NcbiAqXG4gKiBAZnVuY3Rpb253XG4gKiBAcGFyYW0ge29Db25maWd1cmF0aW9ufSBbb0NvbmZpZ3VyYXRpb25zXSBjb250cm9sIGNvbmZpZ3VyYXRpb24gZnJvbSBtYW5pZmVzdFxuICogIEBwYXJhbSB7b01hbmlmZXN0fSBbb01hbmlmZXN0XSBPdXRib3VuZHMgZnJvbSBtYW5pZmVzdFxuICogcmV0dXJucyB7U3RyaW5nfSBbc0NvbGxlY3Rpb25OYW1lXSBDb2xsZWN0aW9uIE5hbWUgb2YgdGhlIE1pY3JvIENoYXJ0XG4gKlxuICogcmV0dXJucyB7U3RyaW5nfSBbRXhwcmVzc2lvbl0gSGFuZGxlciBFeHByZXNzaW9uIGZvciB0aGUgdGl0bGUgcHJlc3NcbiAqXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRFeHByZXNzaW9uRm9yTWljcm9DaGFydFRpdGxlUHJlc3MgPSBmdW5jdGlvbiAob0NvbmZpZ3VyYXRpb246IGFueSwgb01hbmlmZXN0T3V0Ym91bmQ6IGFueSwgc0NvbGxlY3Rpb25OYW1lOiBhbnkpIHtcblx0aWYgKG9Db25maWd1cmF0aW9uKSB7XG5cdFx0aWYgKFxuXHRcdFx0KG9Db25maWd1cmF0aW9uW1widGFyZ2V0T3V0Ym91bmRcIl0gJiYgb0NvbmZpZ3VyYXRpb25bXCJ0YXJnZXRPdXRib3VuZFwiXVtcIm91dGJvdW5kXCJdKSB8fFxuXHRcdFx0KG9Db25maWd1cmF0aW9uW1widGFyZ2V0T3V0Ym91bmRcIl0gJiYgb0NvbmZpZ3VyYXRpb25bXCJ0YXJnZXRPdXRib3VuZFwiXVtcIm91dGJvdW5kXCJdICYmIG9Db25maWd1cmF0aW9uW1widGFyZ2V0U2VjdGlvbnNcIl0pXG5cdFx0KSB7XG5cdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHRcIi5oYW5kbGVycy5vbkRhdGFQb2ludFRpdGxlUHJlc3NlZCgkY29udHJvbGxlciwgJHskc291cmNlPi99LCdcIiArXG5cdFx0XHRcdEpTT04uc3RyaW5naWZ5KG9NYW5pZmVzdE91dGJvdW5kKSArXG5cdFx0XHRcdFwiJywnXCIgK1xuXHRcdFx0XHRvQ29uZmlndXJhdGlvbltcInRhcmdldE91dGJvdW5kXCJdW1wib3V0Ym91bmRcIl0gK1xuXHRcdFx0XHRcIicsJ1wiICtcblx0XHRcdFx0c0NvbGxlY3Rpb25OYW1lICtcblx0XHRcdFx0XCInIClcIlxuXHRcdFx0KTtcblx0XHR9IGVsc2UgaWYgKG9Db25maWd1cmF0aW9uW1widGFyZ2V0U2VjdGlvbnNcIl0pIHtcblx0XHRcdHJldHVybiBcIi5oYW5kbGVycy5uYXZpZ2F0ZVRvU3ViU2VjdGlvbigkY29udHJvbGxlciwgJ1wiICsgSlNPTi5zdHJpbmdpZnkob0NvbmZpZ3VyYXRpb25bXCJ0YXJnZXRTZWN0aW9uc1wiXSkgKyBcIicpXCI7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXHR9XG59O1xuXG4vKlxuICogRnVuY3Rpb24gdG8gcmVuZGVyIENoYXJ0IFRpdGxlIGFzIExpbmtcbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7b0NvbnRyb2xDb25maWd1cmF0aW9ufSBbb0NvbmZpZ3VyYXRpb25zXSBjb250cm9sIGNvbmZpZ3VyYXRpb24gZnJvbSBtYW5pZmVzdFxuICogcmV0dXJucyB7U3RyaW5nfSBbc0tleV0gRm9yIHRoZSBUYXJnZXRPdXRib3VuZCBhbmQgVGFyZ2V0U2VjdGlvblxuICpcbiAqL1xuZXhwb3J0IGNvbnN0IGdldE1pY3JvQ2hhcnRUaXRsZUFzTGluayA9IGZ1bmN0aW9uIChvQ29udHJvbENvbmZpZ3VyYXRpb246IGFueSkge1xuXHRpZiAoXG5cdFx0b0NvbnRyb2xDb25maWd1cmF0aW9uICYmXG5cdFx0KG9Db250cm9sQ29uZmlndXJhdGlvbltcInRhcmdldE91dGJvdW5kXCJdIHx8IChvQ29udHJvbENvbmZpZ3VyYXRpb25bXCJ0YXJnZXRPdXRib3VuZFwiXSAmJiBvQ29udHJvbENvbmZpZ3VyYXRpb25bXCJ0YXJnZXRTZWN0aW9uc1wiXSkpXG5cdCkge1xuXHRcdHJldHVybiBcIkV4dGVybmFsXCI7XG5cdH0gZWxzZSBpZiAob0NvbnRyb2xDb25maWd1cmF0aW9uICYmIG9Db250cm9sQ29uZmlndXJhdGlvbltcInRhcmdldFNlY3Rpb25zXCJdKSB7XG5cdFx0cmV0dXJuIFwiSW5QYWdlXCI7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIFwiTm9uZVwiO1xuXHR9XG59O1xuXG4vKiBHZXQgZ3JvdXBJZCBmcm9tIGNvbnRyb2wgY29uZmlndXJhdGlvblxuICpcbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHtPYmplY3R9IFtvQ29uZmlndXJhdGlvbnNdIGNvbnRyb2wgY29uZmlndXJhdGlvbiBmcm9tIG1hbmlmZXN0XG4gKiBAcGFyYW0ge1N0cmluZ30gW3NBbm5vdGF0aW9uUGF0aF0gQW5ub3RhdGlvbiBQYXRoIGZvciB0aGUgY29uZmlndXJhdGlvblxuICogQGRlc2NyaXB0aW9uIFVzZWQgdG8gZ2V0IHRoZSBncm91cElkIGZvciBEYXRhUG9pbnRzIGFuZCBNaWNyb0NoYXJ0cyBpbiB0aGUgSGVhZGVyLlxuICpcbiAqL1xuZXhwb3J0IGNvbnN0IGdldEdyb3VwSWRGcm9tQ29uZmlnID0gZnVuY3Rpb24gKG9Db25maWd1cmF0aW9uczogYW55LCBzQW5ub3RhdGlvblBhdGg6IGFueSwgc0RlZmF1bHRHcm91cElkPzogYW55KSB7XG5cdGNvbnN0IG9Db25maWd1cmF0aW9uID0gb0NvbmZpZ3VyYXRpb25zW3NBbm5vdGF0aW9uUGF0aF0sXG5cdFx0YUF1dG9QYXR0ZXJucyA9IFtcIkhlcm9lc1wiLCBcIkRlY29yYXRpb25cIiwgXCJXb3JrZXJzXCIsIFwiTG9uZ1J1bm5lcnNcIl07XG5cdGxldCBzR3JvdXBJZCA9IHNEZWZhdWx0R3JvdXBJZDtcblx0aWYgKFxuXHRcdG9Db25maWd1cmF0aW9uICYmXG5cdFx0b0NvbmZpZ3VyYXRpb24ucmVxdWVzdEdyb3VwSWQgJiZcblx0XHRhQXV0b1BhdHRlcm5zLnNvbWUoZnVuY3Rpb24gKGF1dG9QYXR0ZXJuOiBzdHJpbmcpIHtcblx0XHRcdHJldHVybiBhdXRvUGF0dGVybiA9PT0gb0NvbmZpZ3VyYXRpb24ucmVxdWVzdEdyb3VwSWQ7XG5cdFx0fSlcblx0KSB7XG5cdFx0c0dyb3VwSWQgPSBcIiRhdXRvLlwiICsgb0NvbmZpZ3VyYXRpb24ucmVxdWVzdEdyb3VwSWQ7XG5cdH1cblx0cmV0dXJuIHNHcm91cElkO1xufTtcblxuLypcbiAqIEdldCBDb250ZXh0IEJpbmRpbmcgd2l0aCBncm91cElkIGZyb20gY29udHJvbCBjb25maWd1cmF0aW9uXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0ge09iamVjdH0gW29Db25maWd1cmF0aW9uc10gY29udHJvbCBjb25maWd1cmF0aW9uIGZyb20gbWFuaWZlc3RcbiAqIEBwYXJhbSB7U3RyaW5nfSBbc0tleV0gQW5ub3RhdGlvbiBQYXRoIGZvciBvZiB0aGUgY29uZmlndXJhdGlvblxuICogQGRlc2NyaXB0aW9uIFVzZWQgdG8gZ2V0IHRoZSBiaW5kaW5nIGZvciBEYXRhUG9pbnRzIGluIHRoZSBIZWFkZXIuXG4gKlxuICovXG5leHBvcnQgY29uc3QgZ2V0QmluZGluZ1dpdGhHcm91cElkRnJvbUNvbmZpZyA9IGZ1bmN0aW9uIChvQ29uZmlndXJhdGlvbnM6IGFueSwgc0tleTogYW55KSB7XG5cdGNvbnN0IHNHcm91cElkID0gZ2V0R3JvdXBJZEZyb21Db25maWcob0NvbmZpZ3VyYXRpb25zLCBzS2V5KTtcblx0bGV0IHNCaW5kaW5nO1xuXHRpZiAoc0dyb3VwSWQpIHtcblx0XHRzQmluZGluZyA9IFwieyBwYXRoIDogJycsIHBhcmFtZXRlcnMgOiB7ICQkZ3JvdXBJZCA6ICdcIiArIHNHcm91cElkICsgXCInIH0gfVwiO1xuXHR9XG5cdHJldHVybiBzQmluZGluZztcbn07XG5cbi8qKlxuICogTWV0aG9kIHRvIGNoZWNrIHdoZXRoZXIgYSBGaWVsZEdyb3VwIGNvbnNpc3RzIG9mIG9ubHkgMSBEYXRhRmllbGQgd2l0aCBNdWx0aUxpbmUgVGV4dCBhbm5vdGF0aW9uLlxuICpcbiAqIEBwYXJhbSBhRm9ybUVsZW1lbnRzIEEgY29sbGVjdGlvbiBvZiBmb3JtIGVsZW1lbnRzIHVzZWQgaW4gdGhlIGN1cnJlbnQgZmllbGQgZ3JvdXBcbiAqIEByZXR1cm5zIFJldHVybnMgdHJ1ZSBpZiBvbmx5IDEgZGF0YSBmaWVsZCB3aXRoIE11bHRpbGluZSBUZXh0IGFubm90YXRpb24gZXhpc3RzLlxuICovXG5leHBvcnQgY29uc3QgZG9lc0ZpZWxkR3JvdXBDb250YWluT25seU9uZU11bHRpTGluZURhdGFGaWVsZCA9IGZ1bmN0aW9uIChhRm9ybUVsZW1lbnRzOiBhbnlbXSkge1xuXHRyZXR1cm4gYUZvcm1FbGVtZW50cyAmJiBhRm9ybUVsZW1lbnRzLmxlbmd0aCA9PT0gMSAmJiAhIWFGb3JtRWxlbWVudHNbMF0uaXNWYWx1ZU11bHRpbGluZVRleHQ7XG59O1xuXG4vKlxuICogR2V0IFZpc2libGl0eSBvZiBicmVhZGNydW1icy5cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb1ZpZXdEYXRhXSBWaWV3RGF0YSBtb2RlbFxuICogcmV0dXJucyB7Kn0gRXhwcmVzc2lvbiBvciBib29sZWFuXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRWaXNpYmxlRXhwcmVzc2lvbkZvckJyZWFkY3J1bWJzID0gZnVuY3Rpb24gKG9WaWV3RGF0YTogYW55KSB7XG5cdHJldHVybiBvVmlld0RhdGEuc2hvd0JyZWFkQ3J1bWJzICYmIG9WaWV3RGF0YS5mY2xFbmFibGVkICE9PSB1bmRlZmluZWQgPyBcIntmY2xoZWxwZXI+L2JyZWFkQ3J1bWJJc1Zpc2libGV9XCIgOiBvVmlld0RhdGEuc2hvd0JyZWFkQ3J1bWJzO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFNoYXJlQnV0dG9uVmlzaWJpbGl0eSA9IGZ1bmN0aW9uICh2aWV3RGF0YTogYW55KSB7XG5cdGxldCBzU2hhcmVCdXR0b25WaXNpYmlsaXR5RXhwID0gXCIhJHt1aT5jcmVhdGVNb2RlfVwiO1xuXHRpZiAodmlld0RhdGEuZmNsRW5hYmxlZCkge1xuXHRcdHNTaGFyZUJ1dHRvblZpc2liaWxpdHlFeHAgPSBcIiR7ZmNsaGVscGVyPi9zaG93U2hhcmVJY29ufSAmJiBcIiArIHNTaGFyZUJ1dHRvblZpc2liaWxpdHlFeHA7XG5cdH1cblx0cmV0dXJuIFwiez0gXCIgKyBzU2hhcmVCdXR0b25WaXNpYmlsaXR5RXhwICsgXCIgfVwiO1xufTtcblxuLypcbiAqIEdldHMgdGhlIHZpc2liaWxpdHkgb2YgdGhlIGhlYWRlciBpbmZvIGluIGVkaXQgbW9kZVxuICpcbiAqIElmIGVpdGhlciB0aGUgdGl0bGUgb3IgZGVzY3JpcHRpb24gZmllbGQgZnJvbSB0aGUgaGVhZGVyIGFubm90YXRpb25zIGFyZSBlZGl0YWJsZSwgdGhlbiB0aGVcbiAqIGVkaXRhYmxlIGhlYWRlciBpbmZvIGlzIHZpc2libGUuXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0ge29iamVjdH0gW29Bbm5vdGF0aW9uc10gQW5ub3RhdGlvbnMgb2JqZWN0IGZvciBnaXZlbiBlbnRpdHkgc2V0XG4gKiBAcGFyYW0ge29iamVjdH0gW29GaWVsZENvbnRyb2xdIGZpZWxkIGNvbnRyb2xcbiAqIHJldHVybnMgeyp9ICBiaW5kaW5nIGV4cHJlc3Npb24gb3IgYm9vbGVhbiB2YWx1ZSByZXNvbHZlZCBmb3JtIGZ1bmNpdG9ucyBpc1JlYWRPbmx5RnJvbVN0YXRpY0Fubm90YXRpb25zIGFuZCBpc1JlYWRPbmx5RnJvbUR5bmFtaWNBbm5vdGF0aW9uc1xuICovXG5leHBvcnQgY29uc3QgZ2V0VmlzaWJsaXR5T2ZIZWFkZXJJbmZvID0gZnVuY3Rpb24gKFxuXHRvVGl0bGVBbm5vdGF0aW9uczogYW55LFxuXHRvRGVzY3JpcHRpb25Bbm5vdGF0aW9uczogYW55LFxuXHRvRmllbGRUaXRsZUZpZWxkQ29udHJvbDogYW55LFxuXHRvRmllbGREZXNjcmlwdGlvbkZpZWxkQ29udHJvbDogYW55XG4pIHtcblx0Ly8gQ2hlY2sgQW5ub3RhdGlvbnMgZm9yIFRpdGxlIEZpZWxkXG5cdC8vIFNldCB0byB0cnVlIGFuZCBkb24ndCB0YWtlIGludG8gYWNjb3VudCwgaWYgdGhlcmUgYXJlIG5vIGFubm90YXRpb25zLCBpLmUuIG5vIHRpdGxlIGV4aXN0c1xuXHRjb25zdCBiSXNUaXRsZVJlYWRPbmx5ID0gb1RpdGxlQW5ub3RhdGlvbnMgPyBpc1JlYWRPbmx5RnJvbVN0YXRpY0Fubm90YXRpb25zKG9UaXRsZUFubm90YXRpb25zLCBvRmllbGRUaXRsZUZpZWxkQ29udHJvbCkgOiB0cnVlO1xuXHRjb25zdCB0aXRsZUV4cHJlc3Npb24gPSByZWFkT25seUV4cHJlc3Npb25Gcm9tRHluYW1pY0Fubm90YXRpb25zKG9GaWVsZFRpdGxlRmllbGRDb250cm9sKTtcblx0Ly8gVGhlcmUgaXMgbm8gZXhwcmVzc2lvbiBhbmQgdGhlIHRpdGxlIGlzIG5vdCByZWFkeSBvbmx5LCB0aGlzIGlzIHN1ZmZpY2llbnQgZm9yIGFuIGVkaXRhYmxlIGhlYWRlclxuXHRpZiAoIWJJc1RpdGxlUmVhZE9ubHkgJiYgIXRpdGxlRXhwcmVzc2lvbikge1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0Ly8gQ2hlY2sgQW5ub3RhdGlvbnMgZm9yIERlc2NyaXB0aW9uIEZpZWxkXG5cdC8vIFNldCB0byB0cnVlIGFuZCBkb24ndCB0YWtlIGludG8gYWNjb3VudCwgaWYgdGhlcmUgYXJlIG5vIGFubm90YXRpb25zLCBpLmUuIG5vIGRlc2NyaXB0aW9uIGV4aXN0c1xuXHRjb25zdCBiSXNEZXNjcmlwdGlvblJlYWRPbmx5ID0gb0Rlc2NyaXB0aW9uQW5ub3RhdGlvbnNcblx0XHQ/IGlzUmVhZE9ubHlGcm9tU3RhdGljQW5ub3RhdGlvbnMob0Rlc2NyaXB0aW9uQW5ub3RhdGlvbnMsIG9GaWVsZERlc2NyaXB0aW9uRmllbGRDb250cm9sKVxuXHRcdDogdHJ1ZTtcblx0Y29uc3QgZGVzY3JpcHRpb25FeHByZXNzaW9uID0gcmVhZE9ubHlFeHByZXNzaW9uRnJvbUR5bmFtaWNBbm5vdGF0aW9ucyhvRmllbGREZXNjcmlwdGlvbkZpZWxkQ29udHJvbCk7XG5cdC8vIFRoZXJlIGlzIG5vIGV4cHJlc3Npb24gYW5kIHRoZSBkZXNjcmlwdGlvbiBpcyBub3QgcmVhZHkgb25seSwgdGhpcyBpcyBzdWZmaWNpZW50IGZvciBhbiBlZGl0YWJsZSBoZWFkZXJcblx0aWYgKCFiSXNEZXNjcmlwdGlvblJlYWRPbmx5ICYmICFkZXNjcmlwdGlvbkV4cHJlc3Npb24pIHtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdC8vIEJvdGggdGl0bGUgYW5kIGRlc2NyaXB0aW9uIGFyZSBub3QgZWRpdGFibGUgYW5kIHRoZXJlIGFyZSBubyBkeW5hbWljIGFubm90YXRpb25zXG5cdGlmIChiSXNUaXRsZVJlYWRPbmx5ICYmIGJJc0Rlc2NyaXB0aW9uUmVhZE9ubHkgJiYgIXRpdGxlRXhwcmVzc2lvbiAmJiAhZGVzY3JpcHRpb25FeHByZXNzaW9uKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0Ly8gTm93IGNvbWJpbmUgZXhwcmVzc2lvbnNcblx0aWYgKHRpdGxlRXhwcmVzc2lvbiAmJiAhZGVzY3JpcHRpb25FeHByZXNzaW9uKSB7XG5cdFx0cmV0dXJuIHRpdGxlRXhwcmVzc2lvbjtcblx0fSBlbHNlIGlmICghdGl0bGVFeHByZXNzaW9uICYmIGRlc2NyaXB0aW9uRXhwcmVzc2lvbikge1xuXHRcdHJldHVybiBkZXNjcmlwdGlvbkV4cHJlc3Npb247XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIGNvbWJpbmVUaXRsZUFuZERlc2NyaXB0aW9uRXhwcmVzc2lvbihvRmllbGRUaXRsZUZpZWxkQ29udHJvbCwgb0ZpZWxkRGVzY3JpcHRpb25GaWVsZENvbnRyb2wpO1xuXHR9XG59O1xuXG5leHBvcnQgY29uc3QgY29tYmluZVRpdGxlQW5kRGVzY3JpcHRpb25FeHByZXNzaW9uID0gZnVuY3Rpb24gKG9UaXRsZUZpZWxkQ29udHJvbDogYW55LCBvRGVzY3JpcHRpb25GaWVsZENvbnRyb2w6IGFueSkge1xuXHQvLyBJZiBib3RoIGhlYWRlciBhbmQgdGl0bGUgZmllbGQgYXJlIGJhc2VkIG9uIGR5bm1haWMgZmllbGQgY29udHJvbCwgdGhlIGVkaXRhYmxlIGhlYWRlclxuXHQvLyBpcyB2aXNpYmxlIGlmIGF0IGxlYXN0IG9uZSBvZiB0aGVzZSBpcyBub3QgcmVhZHkgb25seVxuXHRyZXR1cm4gXCJ7PSAlXCIgKyBvVGl0bGVGaWVsZENvbnRyb2wgKyBcIiA9PT0gMSA/ICggJVwiICsgb0Rlc2NyaXB0aW9uRmllbGRDb250cm9sICsgXCIgPT09IDEgPyBmYWxzZSA6IHRydWUgKSA6IHRydWUgfVwiO1xufTtcblxuLypcbiAqIEdldCBFeHByZXNzaW9uIG9mIHByZXNzIGV2ZW50IG9mIGRlbGV0ZSBidXR0b24uXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0ge3N0cmluZ30gW3NFbnRpdHlTZXROYW1lXSBFbnRpdHkgc2V0IG5hbWVcbiAqIHJldHVybnMge3N0cmluZ30gIGJpbmRpbmcgZXhwcmVzc2lvbiAvIGZ1bmN0aW9uIHN0cmluZyBnZW5lcmF0ZWQgZnJvbSBjb21tYW5oZWxwZXIncyBmdW5jdGlvbiBnZW5lcmF0ZUZ1bmN0aW9uXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRQcmVzc0V4cHJlc3Npb25Gb3JEZWxldGUgPSBmdW5jdGlvbiAoc0VudGl0eVNldE5hbWU6IGFueSkge1xuXHRjb25zdCBzRGVsZXRhYmxlQ29udGV4dHMgPSBcIiR7JHZpZXc+L2dldEJpbmRpbmdDb250ZXh0fVwiLFxuXHRcdHNUaXRsZSA9IFwiJHskdmlldz4vI2ZlOjpPYmplY3RQYWdlL2dldEhlYWRlclRpdGxlL2dldEV4cGFuZGVkSGVhZGluZy9nZXRJdGVtcy8xL2dldFRleHR9XCIsXG5cdFx0c0Rlc2NyaXB0aW9uID0gXCIkeyR2aWV3Pi8jZmU6Ok9iamVjdFBhZ2UvZ2V0SGVhZGVyVGl0bGUvZ2V0RXhwYW5kZWRDb250ZW50LzAvZ2V0SXRlbXMvMC9nZXRUZXh0fVwiO1xuXHRjb25zdCBvUGFyYW1zID0ge1xuXHRcdHRpdGxlOiBzVGl0bGUsXG5cdFx0ZW50aXR5U2V0TmFtZTogQ29tbW9uSGVscGVyLmFkZFNpbmdsZVF1b3RlcyhzRW50aXR5U2V0TmFtZSksXG5cdFx0ZGVzY3JpcHRpb246IHNEZXNjcmlwdGlvblxuXHR9O1xuXHRyZXR1cm4gQ29tbW9uSGVscGVyLmdlbmVyYXRlRnVuY3Rpb24oXCIuZWRpdEZsb3cuZGVsZXRlRG9jdW1lbnRcIiwgc0RlbGV0YWJsZUNvbnRleHRzLCBDb21tb25IZWxwZXIub2JqZWN0VG9TdHJpbmcob1BhcmFtcykpO1xufTtcblxuLypcbiAqIEdldCBFeHByZXNzaW9uIG9mIHByZXNzIGV2ZW50IG9mIHNhdmUgYnV0dG9uLlxuICpcbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHtzdHJpbmd9IFtzRW50aXR5U2V0TmFtZV0gRW50aXR5IHNldCBuYW1lXG4gKiByZXR1cm5zIHtzdHJpbmd9ICBiaW5kaW5nIGV4cHJlc3Npb24gLyBmdW5jdGlvbiBzdHJpbmcgZ2VuZXJhdGVkIGZyb20gY29tbWFuaGVscGVyJ3MgZnVuY3Rpb24gZ2VuZXJhdGVGdW5jdGlvblxuICovXG5leHBvcnQgY29uc3QgZ2V0UHJlc3NFeHByZXNzaW9uRm9yU2F2ZSA9IGZ1bmN0aW9uIChzRW50aXR5U2V0TmFtZTogYW55KSB7XG5cdGNvbnN0IHNTYXZlQ29udGV4dCA9IFwiJHskdmlldz4vZ2V0QmluZGluZ0NvbnRleHR9XCI7XG5cdGNvbnN0IG9QYXJhbXMgPSB7XG5cdFx0ZW50aXR5U2V0TmFtZTogQ29tbW9uSGVscGVyLmFkZFNpbmdsZVF1b3RlcyhzRW50aXR5U2V0TmFtZSlcblx0fTtcblx0cmV0dXJuIENvbW1vbkhlbHBlci5nZW5lcmF0ZUZ1bmN0aW9uKFwiX3NhdmVEb2N1bWVudFwiLCBzU2F2ZUNvbnRleHQsIENvbW1vbkhlbHBlci5vYmplY3RUb1N0cmluZyhvUGFyYW1zKSk7XG59O1xuXG4vKlxuICogR2V0IEV4cHJlc3Npb24gb2YgcHJlc3MgZXZlbnQgb2YgRWRpdCBidXR0b24uXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0ge29iamVjdH0gW29EYXRhRmllbGRdIERhdGEgZmllbGQgb2JqZWN0XG4gKiBAcGFyYW0ge3N0cmluZ30gW3NFbnRpdHlTZXROYW1lXSBFbnRpdHkgc2V0IG5hbWVcbiAqIEBwYXJhbSB7b2JqZWN0fSBbb0hlYWRlckFjdGlvbl0gSGVhZGVyIGFjdGlvbiBvYmplY3RcbiAqIHJldHVybnMge3N0cmluZ30gIGJpbmRpbmcgZXhwcmVzc2lvbiAvIGZ1bmN0aW9uIHN0cmluZyBnZW5lcmF0ZWQgZnJvbSBjb21tYW5oZWxwZXIncyBmdW5jdGlvbiBnZW5lcmF0ZUZ1bmN0aW9uXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRQcmVzc0V4cHJlc3Npb25Gb3JFZGl0ID0gZnVuY3Rpb24gKG9EYXRhRmllbGQ6IGFueSwgc0VudGl0eVNldE5hbWU6IGFueSwgb0hlYWRlckFjdGlvbjogYW55KSB7XG5cdGNvbnN0IHNFZGl0YWJsZUNvbnRleHRzID0gQ29tbW9uSGVscGVyLmFkZFNpbmdsZVF1b3RlcyhvRGF0YUZpZWxkICYmIG9EYXRhRmllbGQuQWN0aW9uKSxcblx0XHRzRGF0YUZpZWxkRW51bU1lbWJlciA9IG9EYXRhRmllbGQgJiYgb0RhdGFGaWVsZC5JbnZvY2F0aW9uR3JvdXBpbmcgJiYgb0RhdGFGaWVsZC5JbnZvY2F0aW9uR3JvdXBpbmdbXCIkRW51bU1lbWJlclwiXSxcblx0XHRzSW52b2NhdGlvbkdyb3VwID0gc0RhdGFGaWVsZEVudW1NZW1iZXIgPT09IFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuT3BlcmF0aW9uR3JvdXBpbmdUeXBlL0NoYW5nZVNldFwiID8gXCJDaGFuZ2VTZXRcIiA6IFwiSXNvbGF0ZWRcIjtcblx0Y29uc3Qgb1BhcmFtcyA9IHtcblx0XHRjb250ZXh0czogXCIkeyR2aWV3Pi9nZXRCaW5kaW5nQ29udGV4dH1cIixcblx0XHRlbnRpdHlTZXROYW1lOiBDb21tb25IZWxwZXIuYWRkU2luZ2xlUXVvdGVzKHNFbnRpdHlTZXROYW1lKSxcblx0XHRpbnZvY2F0aW9uR3JvdXBpbmc6IENvbW1vbkhlbHBlci5hZGRTaW5nbGVRdW90ZXMoc0ludm9jYXRpb25Hcm91cCksXG5cdFx0bW9kZWw6IFwiJHskc291cmNlPi99LmdldE1vZGVsKClcIixcblx0XHRsYWJlbDogQ29tbW9uSGVscGVyLmFkZFNpbmdsZVF1b3RlcyhvRGF0YUZpZWxkICYmIG9EYXRhRmllbGQuTGFiZWwsIHRydWUpLFxuXHRcdGlzTmF2aWdhYmxlOiBvSGVhZGVyQWN0aW9uICYmIG9IZWFkZXJBY3Rpb24uaXNOYXZpZ2FibGUsXG5cdFx0ZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uOlxuXHRcdFx0b0hlYWRlckFjdGlvbiAmJiBvSGVhZGVyQWN0aW9uLmRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbiA/IGAnJHtvSGVhZGVyQWN0aW9uLmRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbn0nYCA6IHVuZGVmaW5lZFxuXHR9O1xuXHRyZXR1cm4gQ29tbW9uSGVscGVyLmdlbmVyYXRlRnVuY3Rpb24oXCIuaGFuZGxlcnMub25DYWxsQWN0aW9uXCIsIFwiJHskdmlldz4vfVwiLCBzRWRpdGFibGVDb250ZXh0cywgQ29tbW9uSGVscGVyLm9iamVjdFRvU3RyaW5nKG9QYXJhbXMpKTtcbn07XG5cbi8qXG4gKiBNZXRob2QgdG8gZ2V0IHRoZSBleHByZXNzaW9uIGZvciB0aGUgJ3ByZXNzJyBldmVudCBmb3IgZm9vdGVyIGFubm90YXRpb24gYWN0aW9uc1xuICpcbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHtvYmplY3R9IFtvRGF0YUZpZWxkXSBEYXRhIGZpZWxkIG9iamVjdFxuICogQHBhcmFtIHtzdHJpbmd9IFtzRW50aXR5U2V0TmFtZV0gRW50aXR5IHNldCBuYW1lXG4gKiBAcGFyYW0ge29iamVjdH0gW29IZWFkZXJBY3Rpb25dIEhlYWRlciBhY3Rpb24gb2JqZWN0XG4gKiByZXR1cm5zIHtzdHJpbmd9ICBCaW5kaW5nIGV4cHJlc3Npb24gb3IgZnVuY3Rpb24gc3RyaW5nIHRoYXQgaXMgZ2VuZXJhdGVkIGZyb20gdGhlIENvbW1vbmhlbHBlcidzIGZ1bmN0aW9uIGdlbmVyYXRlRnVuY3Rpb25cbiAqL1xuZXhwb3J0IGNvbnN0IGdldFByZXNzRXhwcmVzc2lvbkZvckZvb3RlckFubm90YXRpb25BY3Rpb24gPSBmdW5jdGlvbiAob0RhdGFGaWVsZDogYW55LCBzRW50aXR5U2V0TmFtZTogYW55LCBvSGVhZGVyQWN0aW9uOiBhbnkpIHtcblx0Y29uc3Qgc0FjdGlvbkNvbnRleHRzID0gQ29tbW9uSGVscGVyLmFkZFNpbmdsZVF1b3RlcyhvRGF0YUZpZWxkICYmIG9EYXRhRmllbGQuQWN0aW9uKSxcblx0XHRzRGF0YUZpZWxkRW51bU1lbWJlciA9IG9EYXRhRmllbGQgJiYgb0RhdGFGaWVsZC5JbnZvY2F0aW9uR3JvdXBpbmcgJiYgb0RhdGFGaWVsZC5JbnZvY2F0aW9uR3JvdXBpbmdbXCIkRW51bU1lbWJlclwiXSxcblx0XHRzSW52b2NhdGlvbkdyb3VwID0gc0RhdGFGaWVsZEVudW1NZW1iZXIgPT09IFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuT3BlcmF0aW9uR3JvdXBpbmdUeXBlL0NoYW5nZVNldFwiID8gXCJDaGFuZ2VTZXRcIiA6IFwiSXNvbGF0ZWRcIjtcblx0Y29uc3Qgb1BhcmFtcyA9IHtcblx0XHRjb250ZXh0czogXCIkeyR2aWV3Pi8jZmU6Ok9iamVjdFBhZ2UvfS5nZXRCaW5kaW5nQ29udGV4dCgpXCIsXG5cdFx0ZW50aXR5U2V0TmFtZTogQ29tbW9uSGVscGVyLmFkZFNpbmdsZVF1b3RlcyhzRW50aXR5U2V0TmFtZSksXG5cdFx0aW52b2NhdGlvbkdyb3VwaW5nOiBDb21tb25IZWxwZXIuYWRkU2luZ2xlUXVvdGVzKHNJbnZvY2F0aW9uR3JvdXApLFxuXHRcdG1vZGVsOiBcIiR7JHNvdXJjZT4vfS5nZXRNb2RlbCgpXCIsXG5cdFx0bGFiZWw6IENvbW1vbkhlbHBlci5hZGRTaW5nbGVRdW90ZXMob0RhdGFGaWVsZCAmJiBvRGF0YUZpZWxkLkxhYmVsLCB0cnVlKSxcblx0XHRpc05hdmlnYWJsZTogb0hlYWRlckFjdGlvbiAmJiBvSGVhZGVyQWN0aW9uLmlzTmF2aWdhYmxlLFxuXHRcdGRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbjpcblx0XHRcdG9IZWFkZXJBY3Rpb24gJiYgb0hlYWRlckFjdGlvbi5kZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb24gPyBgJyR7b0hlYWRlckFjdGlvbi5kZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb259J2AgOiB1bmRlZmluZWRcblx0fTtcblx0cmV0dXJuIENvbW1vbkhlbHBlci5nZW5lcmF0ZUZ1bmN0aW9uKFwiLmhhbmRsZXJzLm9uQ2FsbEFjdGlvblwiLCBcIiR7JHZpZXc+L31cIiwgc0FjdGlvbkNvbnRleHRzLCBDb21tb25IZWxwZXIub2JqZWN0VG9TdHJpbmcob1BhcmFtcykpO1xufTtcblxuLypcbiAqIEdldCBFeHByZXNzaW9uIG9mIGV4ZWN1dGUgZXZlbnQgZXhwcmVzc2lvbiBvZiBwcmltYXJ5IGFjdGlvbi5cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7b2JqZWN0fSBbb0RhdGFGaWVsZF0gRGF0YSBmaWVsZCBvYmplY3RcbiAqIEBwYXJhbSB7c3RyaW5nfSBbc0VudGl0eVNldE5hbWVdIEVudGl0eSBzZXQgbmFtZVxuICogQHBhcmFtIHtvYmplY3R9IFtvSGVhZGVyQWN0aW9uXSBIZWFkZXIgYWN0aW9uIG9iamVjdFxuICogQHBhcmFtIHtDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiB8IHN0cmluZ30gVGhlIHZpc2liaWxpdHkgb2Ygc2VtYXRpYyBwb3NpdGl2ZSBhY3Rpb25cbiAqIEBwYXJhbSB7Q29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24gfCBzdHJpbmd9IFRoZSBlbmFibGVtZW50IG9mIHNlbWFudGljIHBvc2l0aXZlIGFjdGlvblxuICogQHBhcmFtIHtDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiB8IHN0cmluZ30gVGhlIEVkaXQgYnV0dG9uIHZpc2liaWxpdHlcbiAqIEBwYXJhbSB7Q29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24gfCBzdHJpbmd9IFRoZSBlbmFibGVtZW50IG9mIEVkaXQgYnV0dG9uXG4gKiByZXR1cm5zIHtzdHJpbmd9ICBiaW5kaW5nIGV4cHJlc3Npb24gLyBmdW5jdGlvbiBzdHJpbmcgZ2VuZXJhdGVkIGZyb20gY29tbWFuaGVscGVyJ3MgZnVuY3Rpb24gZ2VuZXJhdGVGdW5jdGlvblxuICovXG5leHBvcnQgY29uc3QgZ2V0UHJlc3NFeHByZXNzaW9uRm9yUHJpbWFyeUFjdGlvbiA9IGZ1bmN0aW9uIChcblx0b0RhdGFGaWVsZDogYW55LFxuXHRzRW50aXR5U2V0TmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuXHRvSGVhZGVyQWN0aW9uOiBCYXNlQWN0aW9uIHwgbnVsbCxcblx0cG9zaXRpdmVBY3Rpb25WaXNpYmxlOiBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiB8IHN0cmluZyxcblx0cG9zaXRpdmVBY3Rpb25FbmFibGVkOiBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiB8IHN0cmluZyxcblx0ZWRpdEFjdGlvblZpc2libGU6IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIHwgc3RyaW5nLFxuXHRlZGl0QWN0aW9uRW5hYmxlZDogQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24gfCBzdHJpbmdcbikge1xuXHRjb25zdCBzQWN0aW9uQ29udGV4dHMgPSBDb21tb25IZWxwZXIuYWRkU2luZ2xlUXVvdGVzKG9EYXRhRmllbGQgJiYgb0RhdGFGaWVsZC5BY3Rpb24pLFxuXHRcdHNEYXRhRmllbGRFbnVtTWVtYmVyID0gb0RhdGFGaWVsZCAmJiBvRGF0YUZpZWxkLkludm9jYXRpb25Hcm91cGluZyAmJiBvRGF0YUZpZWxkLkludm9jYXRpb25Hcm91cGluZ1tcIiRFbnVtTWVtYmVyXCJdLFxuXHRcdHNJbnZvY2F0aW9uR3JvdXAgPSBzRGF0YUZpZWxkRW51bU1lbWJlciA9PT0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5PcGVyYXRpb25Hcm91cGluZ1R5cGUvQ2hhbmdlU2V0XCIgPyBcIkNoYW5nZVNldFwiIDogXCJJc29sYXRlZFwiO1xuXHRjb25zdCBvUGFyYW1zID0ge1xuXHRcdGNvbnRleHRzOiBcIiR7JHZpZXc+LyNmZTo6T2JqZWN0UGFnZS99LmdldEJpbmRpbmdDb250ZXh0KClcIixcblx0XHRlbnRpdHlTZXROYW1lOiBzRW50aXR5U2V0TmFtZSA/IENvbW1vbkhlbHBlci5hZGRTaW5nbGVRdW90ZXMoc0VudGl0eVNldE5hbWUpIDogXCJcIixcblx0XHRpbnZvY2F0aW9uR3JvdXBpbmc6IENvbW1vbkhlbHBlci5hZGRTaW5nbGVRdW90ZXMoc0ludm9jYXRpb25Hcm91cCksXG5cdFx0bW9kZWw6IFwiJHskc291cmNlPi99LmdldE1vZGVsKClcIixcblx0XHRsYWJlbDogQ29tbW9uSGVscGVyLmFkZFNpbmdsZVF1b3RlcyhvRGF0YUZpZWxkPy5MYWJlbCwgdHJ1ZSksXG5cdFx0aXNOYXZpZ2FibGU6IG9IZWFkZXJBY3Rpb24/LmlzTmF2aWdhYmxlLFxuXHRcdGRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbjogb0hlYWRlckFjdGlvbj8uZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uXG5cdFx0XHQ/IGAnJHtvSGVhZGVyQWN0aW9uLmRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbn0nYFxuXHRcdFx0OiB1bmRlZmluZWRcblx0fTtcblx0Y29uc3Qgb0NvbmRpdGlvbnMgPSB7XG5cdFx0cG9zaXRpdmVBY3Rpb25WaXNpYmxlLFxuXHRcdHBvc2l0aXZlQWN0aW9uRW5hYmxlZCxcblx0XHRlZGl0QWN0aW9uVmlzaWJsZSxcblx0XHRlZGl0QWN0aW9uRW5hYmxlZFxuXHR9O1xuXHRyZXR1cm4gQ29tbW9uSGVscGVyLmdlbmVyYXRlRnVuY3Rpb24oXG5cdFx0XCIuaGFuZGxlcnMub25QcmltYXJ5QWN0aW9uXCIsXG5cdFx0XCIkY29udHJvbGxlclwiLFxuXHRcdFwiJHskdmlldz4vfVwiLFxuXHRcdFwiJHskdmlldz4vZ2V0QmluZGluZ0NvbnRleHR9XCIsXG5cdFx0c0FjdGlvbkNvbnRleHRzLFxuXHRcdENvbW1vbkhlbHBlci5vYmplY3RUb1N0cmluZyhvUGFyYW1zKSxcblx0XHRDb21tb25IZWxwZXIub2JqZWN0VG9TdHJpbmcob0NvbmRpdGlvbnMpXG5cdCk7XG59O1xuXG4vKlxuICogR2V0cyB0aGUgYmluZGluZyBvZiB0aGUgY29udGFpbmVyIEhCb3ggZm9yIHRoZSBoZWFkZXIgZmFjZXQuXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0ge29iamVjdH0gW29Db250cm9sQ29uZmlndXJhdGlvbl0gVGhlIGNvbnRyb2wgY29uZmlndXJhdGlvbiBmb3JtIG9mIHRoZSB2aWV3RGF0YSBtb2RlbFxuICogQHBhcmFtIHtvYmplY3R9IFtvSGVhZGVyRmFjZXRdIFRoZSBvYmplY3Qgb2YgdGhlIGhlYWRlciBmYWNldFxuICogcmV0dXJucyB7Kn0gIFRoZSBiaW5kaW5nIGV4cHJlc3Npb24gZnJvbSBmdW5jdGlvbiBnZXRCaW5kaW5nV2l0aEdyb3VwSWRGcm9tQ29uZmlnIG9yIHVuZGVmaW5lZC5cbiAqL1xuZXhwb3J0IGNvbnN0IGdldFN0YXNoYWJsZUhCb3hCaW5kaW5nID0gZnVuY3Rpb24gKG9Db250cm9sQ29uZmlndXJhdGlvbjogYW55LCBvSGVhZGVyRmFjZXQ6IGFueSkge1xuXHRpZiAob0hlYWRlckZhY2V0ICYmIG9IZWFkZXJGYWNldC5GYWNldCAmJiBvSGVhZGVyRmFjZXQuRmFjZXQudGFyZ2V0QW5ub3RhdGlvblR5cGUgPT09IFwiRGF0YVBvaW50XCIpIHtcblx0XHRyZXR1cm4gZ2V0QmluZGluZ1dpdGhHcm91cElkRnJvbUNvbmZpZyhvQ29udHJvbENvbmZpZ3VyYXRpb24sIG9IZWFkZXJGYWNldC5GYWNldC50YXJnZXRBbm5vdGF0aW9uVmFsdWUpO1xuXHR9XG59O1xuXG4vKlxuICogR2V0cyB0aGUgJ1ByZXNzJyBldmVudCBleHByZXNzaW9uIGZvciB0aGUgZXh0ZXJuYWwgYW5kIGludGVybmFsIGRhdGEgcG9pbnQgbGluay5cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7b2JqZWN0fSBbb0NvbmZpZ3VyYXRpb25dIENvbnRyb2wgY29uZmlndXJhdGlvbiBmcm9tIG1hbmlmZXN0XG4gKiBAcGFyYW0ge29iamVjdH0gW29NYW5pZmVzdE91dGJvdW5kXSBPdXRib3VuZHMgZnJvbSBtYW5pZmVzdFxuICogcmV0dXJucyB7c3RyaW5nfSBUaGUgcnVudGltZSBiaW5kaW5nIG9mIHRoZSAnUHJlc3MnIGV2ZW50XG4gKi9cbmV4cG9ydCBjb25zdCBnZXRQcmVzc0V4cHJlc3Npb25Gb3JMaW5rID0gZnVuY3Rpb24gKG9Db25maWd1cmF0aW9uOiBhbnksIG9NYW5pZmVzdE91dGJvdW5kOiBhbnkpIHtcblx0aWYgKG9Db25maWd1cmF0aW9uKSB7XG5cdFx0aWYgKG9Db25maWd1cmF0aW9uW1widGFyZ2V0T3V0Ym91bmRcIl0gJiYgb0NvbmZpZ3VyYXRpb25bXCJ0YXJnZXRPdXRib3VuZFwiXVtcIm91dGJvdW5kXCJdKSB7XG5cdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHRcIi5oYW5kbGVycy5vbkRhdGFQb2ludFRpdGxlUHJlc3NlZCgkY29udHJvbGxlciwgJHskc291cmNlPn0sIFwiICtcblx0XHRcdFx0SlNPTi5zdHJpbmdpZnkob01hbmlmZXN0T3V0Ym91bmQpICtcblx0XHRcdFx0XCIsXCIgK1xuXHRcdFx0XHRKU09OLnN0cmluZ2lmeShvQ29uZmlndXJhdGlvbltcInRhcmdldE91dGJvdW5kXCJdW1wib3V0Ym91bmRcIl0pICtcblx0XHRcdFx0XCIpXCJcblx0XHRcdCk7XG5cdFx0fSBlbHNlIGlmIChvQ29uZmlndXJhdGlvbltcInRhcmdldFNlY3Rpb25zXCJdKSB7XG5cdFx0XHRyZXR1cm4gXCIuaGFuZGxlcnMubmF2aWdhdGVUb1N1YlNlY3Rpb24oJGNvbnRyb2xsZXIsICdcIiArIEpTT04uc3RyaW5naWZ5KG9Db25maWd1cmF0aW9uW1widGFyZ2V0U2VjdGlvbnNcIl0pICsgXCInKVwiO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblx0fVxufTtcblxuZXhwb3J0IGNvbnN0IGdldEhlYWRlckZvcm1IYm94UmVuZGVyVHlwZSA9IGZ1bmN0aW9uIChkYXRhRmllbGQ6IERhdGFNb2RlbE9iamVjdFBhdGgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRpZiAoZGF0YUZpZWxkPy50YXJnZXRPYmplY3Q/LiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBbm5vdGF0aW9uKSB7XG5cdFx0cmV0dXJuIHVuZGVm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
@@ -99,7 +99,8 @@ export const getExpressionForTitle = function (
99
99
  ) {
100
100
  connectedFieldsPath = enhanceDataModelPath(fullContextPath, "$Type/@UI.HeaderInfo/Title/Target/$AnnotationPath");
101
101
  titleValueExpression = getLabelForConnectedFields(connectedFieldsPath, false) as BindingToolkitExpression<string>;
102
- titleBooleanExpression = titleValueExpression?._type === "Constant" ? constant(!titleValueExpression?.value) : isEmpty(titleValueExpression);
102
+ titleBooleanExpression =
103
+ titleValueExpression?._type === "Constant" ? constant(!titleValueExpression?.value) : isEmpty(titleValueExpression);
103
104
  titleIsEmpty = titleValueExpression ? titleBooleanExpression : constant(true);
104
105
  }
105
106
 
@@ -745,6 +746,21 @@ export const getPressExpressionForDelete = function (sEntitySetName: any) {
745
746
  return CommonHelper.generateFunction(".editFlow.deleteDocument", sDeletableContexts, CommonHelper.objectToString(oParams));
746
747
  };
747
748
 
749
+ /*
750
+ * Get Expression of press event of save button.
751
+ *
752
+ * @function
753
+ * @param {string} [sEntitySetName] Entity set name
754
+ * returns {string} binding expression / function string generated from commanhelper's function generateFunction
755
+ */
756
+ export const getPressExpressionForSave = function (sEntitySetName: any) {
757
+ const sSaveContext = "${$view>/getBindingContext}";
758
+ const oParams = {
759
+ entitySetName: CommonHelper.addSingleQuotes(sEntitySetName)
760
+ };
761
+ return CommonHelper.generateFunction("_saveDocument", sSaveContext, CommonHelper.objectToString(oParams));
762
+ };
763
+
748
764
  /*
749
765
  * Get Expression of press event of Edit button.
750
766
  *
@@ -32,7 +32,7 @@ sap.ui.define(["sap/f/library", "sap/fe/common/library", "sap/fe/core/library",
32
32
  controls: [],
33
33
  elements: [],
34
34
  // eslint-disable-next-line no-template-curly-in-string
35
- version: "1.108.26",
35
+ version: "1.108.28",
36
36
  noLibraryCSS: true
37
37
  });
38
38
  if (!thisLib.ObjectPage) {