@sapui5/sap.fe.core 1.124.4 → 1.124.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -115,6 +115,26 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
115
115
  }
116
116
  }
117
117
 
118
+ /**
119
+ * Get the Hash we're navigating to.
120
+ *
121
+ * @param context Context instance
122
+ * @param navigationTargetName Name of the navigation target
123
+ * @returns The Hash we're navigating to
124
+ */;
125
+ _proto.getHashForNavigation = async function getHashForNavigation(context, navigationTargetName) {
126
+ var _this$_oPageComponent;
127
+ const navigationConfiguration = this === null || this === void 0 ? void 0 : (_this$_oPageComponent = this._oPageComponent) === null || _this$_oPageComponent === void 0 ? void 0 : _this$_oPageComponent.getNavigationConfiguration(navigationTargetName);
128
+ if (navigationConfiguration) {
129
+ const detailRoute = navigationConfiguration.detail;
130
+ const routeName = detailRoute.route;
131
+ const parameterMapping = detailRoute.parameters;
132
+ return this._oRoutingService.getHashFromRoute(context, routeName, parameterMapping);
133
+ } else {
134
+ return this._oRoutingService.getHashFromRoute(context, null);
135
+ }
136
+ }
137
+
118
138
  /**
119
139
  * Navigates to the specified navigation target route.
120
140
  *
@@ -388,7 +408,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
388
408
  * @param oEvent
389
409
  */;
390
410
  _proto._onRouteMatched = function _onRouteMatched(oEvent) {
391
- var _this$_oPageComponent, _this$_oPageComponent2;
411
+ var _this$_oPageComponent2, _this$_oPageComponent3;
392
412
  // Check if the target for this view is part of the event targets (i.e. is a target for the current route).
393
413
  // If not, we don't need to bind it --> return
394
414
  if (!this._isViewPartOfRoute(oEvent.getParameter("routeInformation"))) {
@@ -418,7 +438,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
418
438
  const oModel = this._oView.getModel();
419
439
  if (deferred) {
420
440
  bindPromise = this._bindDeferred(path, oNavigationParameters);
421
- } else if (oNavigationParameters.reason !== NavigationReason.EditFlowAction && (this._oRouterProxy.getHash().includes("i-action=edit") || (((_this$_oPageComponent = this._oPageComponent) === null || _this$_oPageComponent === void 0 ? void 0 : (_this$_oPageComponent2 = _this$_oPageComponent.isOpenInEditMode) === null || _this$_oPageComponent2 === void 0 ? void 0 : _this$_oPageComponent2.call(_this$_oPageComponent)) ?? false))) {
441
+ } else if (oNavigationParameters.reason !== NavigationReason.EditFlowAction && (this._oRouterProxy.getHash().includes("i-action=edit") || (((_this$_oPageComponent2 = this._oPageComponent) === null || _this$_oPageComponent2 === void 0 ? void 0 : (_this$_oPageComponent3 = _this$_oPageComponent2.isOpenInEditMode) === null || _this$_oPageComponent3 === void 0 ? void 0 : _this$_oPageComponent3.call(_this$_oPageComponent2)) ?? false))) {
422
442
  bindPromise = this._bindPageForEdit(path, oModel, oNavigationParameters);
423
443
  } else {
424
444
  bindPromise = this._bindPage(path, oModel, oNavigationParameters);
@@ -952,4 +972,4 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
952
972
  }(ControllerExtension), (_applyDecoratedDescriptor(_class2.prototype, "onExit", [_dec2], Object.getOwnPropertyDescriptor(_class2.prototype, "onExit"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onInit", [_dec3], Object.getOwnPropertyDescriptor(_class2.prototype, "onInit"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onRouteMatched", [_dec4, _dec5], Object.getOwnPropertyDescriptor(_class2.prototype, "onRouteMatched"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onRouteMatchedFinished", [_dec6, _dec7], Object.getOwnPropertyDescriptor(_class2.prototype, "onRouteMatchedFinished"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeBinding", [_dec8, _dec9], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeBinding"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onAfterBinding", [_dec10, _dec11], Object.getOwnPropertyDescriptor(_class2.prototype, "onAfterBinding"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "navigateToTarget", [_dec12], Object.getOwnPropertyDescriptor(_class2.prototype, "navigateToTarget"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "navigateToRoute", [_dec13], Object.getOwnPropertyDescriptor(_class2.prototype, "navigateToRoute"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "navigateBackFromTransientState", [_dec14, _dec15], Object.getOwnPropertyDescriptor(_class2.prototype, "navigateBackFromTransientState"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "isCurrentStateImpactedBy", [_dec16, _dec17], Object.getOwnPropertyDescriptor(_class2.prototype, "isCurrentStateImpactedBy"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onDataReceived", [_dec18], Object.getOwnPropertyDescriptor(_class2.prototype, "onDataReceived"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "switchFullScreen", [_dec19, _dec20], Object.getOwnPropertyDescriptor(_class2.prototype, "switchFullScreen"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "closeColumn", [_dec21, _dec22], Object.getOwnPropertyDescriptor(_class2.prototype, "closeColumn"), _class2.prototype)), _class2)) || _class);
953
973
  return InternalRouting;
954
974
  }, false);
955
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJJbnRlcm5hbFJvdXRpbmciLCJkZWZpbmVVSTVDbGFzcyIsIm1ldGhvZE92ZXJyaWRlIiwicHVibGljRXh0ZW5zaW9uIiwiZXh0ZW5zaWJsZSIsIk92ZXJyaWRlRXhlY3V0aW9uIiwiQWZ0ZXIiLCJmaW5hbEV4dGVuc2lvbiIsIkJlZm9yZSIsIm9uRXhpdCIsIl9vUm91dGluZ1NlcnZpY2UiLCJkZXRhY2hSb3V0ZU1hdGNoZWQiLCJfZm5Sb3V0ZU1hdGNoZWRCb3VuZCIsIm9uSW5pdCIsIl9vVmlldyIsImJhc2UiLCJnZXRWaWV3IiwiX29BcHBDb21wb25lbnQiLCJDb21tb25VdGlscyIsImdldEFwcENvbXBvbmVudCIsIl9vUGFnZUNvbXBvbmVudCIsIkNvbXBvbmVudCIsImdldE93bmVyQ29tcG9uZW50Rm9yIiwiX29Sb3V0ZXIiLCJnZXRSb3V0ZXIiLCJfb1JvdXRlclByb3h5IiwiZ2V0Um91dGVyUHJveHkiLCJFcnJvciIsImdldFNlcnZpY2UiLCJ0aGVuIiwib1JvdXRpbmdTZXJ2aWNlIiwiX29uUm91dGVNYXRjaGVkIiwiYmluZCIsImF0dGFjaFJvdXRlTWF0Y2hlZCIsIl9vVGFyZ2V0SW5mb3JtYXRpb24iLCJnZXRUYXJnZXRJbmZvcm1hdGlvbkZvciIsImNhdGNoIiwib25Sb3V0ZU1hdGNoZWQiLCJvblJvdXRlTWF0Y2hlZEZpbmlzaGVkIiwib25CZWZvcmVCaW5kaW5nIiwiX2JpbmRpbmdDb250ZXh0IiwiX21QYXJhbWV0ZXJzIiwiYmVmb3JlU2V0QmluZGluZ0NvbnRleHQiLCJiaW5kaW5nQ29udGV4dCIsIm9Sb3V0aW5nIiwiZ2V0Q29udHJvbGxlciIsInJvdXRpbmciLCJvbkFmdGVyQmluZGluZyIsImdldFJvb3RWaWV3Q29udHJvbGxlciIsIm9uQ29udGV4dEJvdW5kVG9WaWV3IiwiYWZ0ZXJTZXRCaW5kaW5nQ29udGV4dCIsIm5hdmlnYXRlVG9UYXJnZXQiLCJvQ29udGV4dCIsInNOYXZpZ2F0aW9uVGFyZ2V0TmFtZSIsImJQcmVzZXJ2ZUhpc3RvcnkiLCJkZWxheWVkVXNhZ2UiLCJvTmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24iLCJnZXROYXZpZ2F0aW9uQ29uZmlndXJhdGlvbiIsIm9EZXRhaWxSb3V0ZSIsImRldGFpbCIsInNSb3V0ZU5hbWUiLCJyb3V0ZSIsIm1QYXJhbWV0ZXJNYXBwaW5nIiwicGFyYW1ldGVycyIsIm5hdmlnYXRlVG8iLCJuYXZpZ2F0ZVRvUm91dGUiLCJzVGFyZ2V0Um91dGVOYW1lIiwib1BhcmFtZXRlcnMiLCJuYXZpZ2F0ZVRvQ29udGV4dCIsImNvbnRleHQiLCJpc0EiLCJjcmVhdGVPbk5hdmlnYXRlUGFyYW1ldGVycyIsIm1vZGUiLCJhY3RpdmF0ZVJvdXRlTWF0Y2hTeW5jaHJvbml6YXRpb24iLCJjcmVhdGVDb250ZXh0UHJvbWlzZSIsImNyZWF0ZWRDb250ZXh0IiwiY2hlY2tOb0hhc2hDaGFuZ2UiLCJlZGl0YWJsZSIsInBlcnNpc3RPUFNjcm9sbCIsInVwZGF0ZUZDTExldmVsIiwiZm9yY2VGb2N1cyIsIm9FcnJvciIsIkxvZyIsImVycm9yIiwiY2FsbEV4dGVuc2lvbiIsImludGVybmFsTW9kZWwiLCJnZXRNb2RlbCIsInNldFByb3BlcnR5Iiwib3ZlcnJpZGVOYXYiLCJvbkJlZm9yZU5hdmlnYXRpb24iLCJQcm9taXNlIiwicmVzb2x2ZSIsIkZDTExldmVsIiwiX2dldEZDTExldmVsIiwicmVhc29uIiwiTmF2aWdhdGlvblJlYXNvbiIsIlJvd1ByZXNzIiwibW9kZWwiLCJtZXRhTW9kZWwiLCJnZXRNZXRhTW9kZWwiLCJpc1BhdGhPbkRyYWZ0Um9vdCIsImdldFBhdGgiLCJjb250ZXh0Rm9yTmF2aWdhdGlvbiIsImdldENvbnRleHRGb3JOYXZpZ2F0aW9uV2l0aENvbGxhYm9yYXRpb24iLCJnZXRDb250ZXh0Rm9yTmF2aWdhdGlvbkZyb21UcmVlVGFibGUiLCJnZXRWaWV3RGF0YSIsIm9yaWdpbmFsQ29udGV4dCIsIk1vZGVsSGVscGVyIiwiaXNDb2xsYWJvcmF0aW9uRHJhZnRTdXBwb3J0ZWQiLCJnZXRQcm9wZXJ0eSIsImRyYWZ0T3JBY3RpdmVDb250ZXh0IiwiZ2V0RHJhZnRPckFjdGl2ZUNvbnRleHQiLCJvYmplY3RQYXRoIiwiZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzIiwiZ2V0TWV0YUNvbnRleHQiLCJyZWRpcmVjdGVkVG9Ob25EcmFmdCIsInRhcmdldEVudGl0eVR5cGUiLCJhbm5vdGF0aW9ucyIsIlVJIiwiSGVhZGVySW5mbyIsIlR5cGVOYW1lIiwibmFtZSIsImlzRmNsRW5hYmxlZCIsImNvbnRleHRUb1JlcGxhY2VXaXRoIiwiZ2V0S2VlcEFsaXZlQ29udGV4dCIsInJlcGxhY2VXaXRoIiwiRWRpdFN0YXRlIiwic2V0RWRpdFN0YXRlRGlydHkiLCJwYXJlbnRCaW5kaW5nIiwiZ2V0QmluZGluZyIsImFnZ3JlZ2F0aW9uIiwiZ2V0QWdncmVnYXRpb24iLCJoaWVyYXJjaHlRdWFsaWZpZXIiLCJuYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dCIsIm5hdmlnYXRlRm9yd2FyZFRvQ29udGV4dCIsImdldEJpbmRpbmdDb250ZXh0IiwibmF2aWdhdGVCYWNrRnJvbVRyYW5zaWVudFN0YXRlIiwic0hhc2giLCJnZXRIYXNoIiwiaW5jbHVkZXMiLCJuYXZCYWNrIiwibmF2aWdhdGVUb01lc3NhZ2VQYWdlIiwic0Vycm9yTWVzc2FnZSIsIm1QYXJhbWV0ZXJzIiwibmF2VG9IYXNoIiwiZ2V0RGVmYXVsdENyZWF0ZUhhc2giLCJkaXNwbGF5RXJyb3JQYWdlIiwiaXNDdXJyZW50U3RhdGVJbXBhY3RlZEJ5IiwiX2lzVmlld1BhcnRPZlJvdXRlIiwicm91dGVJbmZvcm1hdGlvbiIsImFUYXJnZXRzIiwidGFyZ2V0cyIsInRhcmdldE5hbWUiLCJ2aWV3TGV2ZWwiLCJyb3V0ZUxldmVsIiwic2V0VGltZW91dCIsImNvbGxhYm9yYXRpdmVEcmFmdCIsImlzQ29ubmVjdGVkIiwiZGlzY29ubmVjdCIsIl9zZXRCaW5kaW5nQ29udGV4dCIsIl9idWlsZEJpbmRpbmdQYXRoIiwicm91dGVBcmd1bWVudHMiLCJiaW5kaW5nUGF0dGVybiIsIm5hdmlnYXRpb25QYXJhbWV0ZXJzIiwicGF0aCIsInJlcGxhY2UiLCJkZWZlcnJlZCIsInNLZXkiLCJzVmFsdWUiLCJiVGFyZ2V0RWRpdGFibGUiLCJiQWN0aW9uQ3JlYXRlIiwib0V2ZW50IiwiZ2V0UGFyYW1ldGVyIiwiZ2V0QmluZGluZ0NvbnRleHRQYXR0ZXJuIiwiY29udGV4dFBhdHRlcm4iLCJ1bmRlZmluZWQiLCJtQXJndW1lbnRzIiwiZ2V0UGFyYW1ldGVycyIsImFyZ3VtZW50cyIsIm9OYXZpZ2F0aW9uUGFyYW1ldGVycyIsImJpbmRQcm9taXNlIiwib01vZGVsIiwiX2JpbmREZWZlcnJlZCIsIkVkaXRGbG93QWN0aW9uIiwiaXNPcGVuSW5FZGl0TW9kZSIsIl9iaW5kUGFnZUZvckVkaXQiLCJfYmluZFBhZ2UiLCJmaW5hbGx5IiwidG9TdHJpbmciLCJ1cGRhdGVVSVN0YXRlRm9yVmlldyIsInRhcmdldFBhdGgiLCJjcmVhdGVEZWZlcnJlZENvbnRleHQiLCJsaXN0QmluZGluZyIsInBhcmVudENvbnRleHQiLCJkYXRhIiwiY3VycmVudEJpbmRpbmdDb250ZXh0IiwiX2dldEJpbmRpbmdDb250ZXh0IiwiaGFzUGVuZGluZ0NoYW5nZXMiLCJyZXNldENoYW5nZXMiLCJfYmluZFBhZ2VUb0NvbnRleHQiLCJ0ZWNobmljYWxQYXRoIiwicmVzb2x2ZVBhdGgiLCJpc1N0aWNreUVkaXRNb2RlIiwiaXNTdGlja3kiLCJpc1N0aWNreVNlc3Npb25TdXBwb3J0ZWQiLCJhY3RpdmVDb250ZXh0IiwiX2NyZWF0ZUNvbnRleHQiLCJtZXRhUGF0aCIsImdldE1ldGFQYXRoIiwia2V5UHJvcGVydHkiLCJnZXRPYmplY3QiLCJyZXF1ZXN0UHJvcGVydHkiLCJlZGl0RmxvdyIsImVkaXREb2N1bWVudCIsIl9iaW5kUGFnZVRvUGF0aCIsInJlc291cmNlQnVuZGxlIiwiTGlicmFyeSIsImdldFJlc291cmNlQnVuZGxlRm9yIiwiZ2V0VGV4dCIsInRpdGxlIiwiZGVzY3JpcHRpb24iLCJtZXNzYWdlIiwic1RhcmdldFBhdGgiLCJvQ3VycmVudENvbnRleHQiLCJzQ3VycmVudFBhdGgiLCJvVXNlQ29udGV4dCIsInVzZUNvbnRleHQiLCJvUm9vdFZpZXdDb250cm9sbGVyIiwic2hvdWxkUmVmcmVzaENvbnRleHQiLCJpc0RyYWZ0U3VwcG9ydGVkIiwiZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlIiwicmVxdWVzdFNpZGVFZmZlY3RzIiwiZ2V0R3JvdXBJZCIsImVyciIsImJQZXJzaXN0T1BTY3JvbGwiLCJzaG93UGxhY2Vob2xkZXIiLCJiU2hvd1BsYWNlaG9sZGVyIiwiQXBwU3RhdGVDaGFuZ2VkIiwiUmVzdG9yZUhpc3RvcnkiLCJpc0VkaXRTdGF0ZURpcnR5IiwiX3JlZnJlc2hCaW5kaW5nQ29udGV4dCIsIm9QYXJlbnRMaXN0QmluZGluZyIsIl9zZXRLZWVwQWxpdmUiLCJpc0V4aXRpbmciLCJpc0NvbnRleHRVc2VkSW5QYWdlcyIsInNQYXRoIiwib1BhZ2VDb21wb25lbnQiLCJzRW50aXR5U2V0IiwiZ2V0RW50aXR5U2V0Iiwic0NvbnRleHRQYXRoIiwiZ2V0Q29udGV4dFBhdGgiLCJvTWV0YU1vZGVsIiwiJCRncm91cElkIiwiJCR1cGRhdGVHcm91cElkIiwiJCRwYXRjaFdpdGhvdXRTaWRlRWZmZWN0cyIsIm9EcmFmdFJvb3QiLCJvRHJhZnROb2RlIiwiX2dldEtlZXBBbGl2ZUNvbnRleHQiLCJyZXF1ZXN0T2JqZWN0Iiwic01lc3NhZ2VzUGF0aCIsImdldE1lc3NhZ2VzUGF0aCIsIiRzZWxlY3QiLCJvUHJldmlvdXNCaW5kaW5nIiwiZ2V0VXBkYXRlR3JvdXBJZCIsImRlc3Ryb3kiLCJvSGlkZGVuQmluZGluZyIsImJpbmRDb250ZXh0IiwiYXR0YWNoRXZlbnRPbmNlIiwiQnVzeUxvY2tlciIsImxvY2siLCJvbkRhdGFSZWNlaXZlZCIsImdldEJvdW5kQ29udGV4dCIsInNFcnJvckRlc2NyaXB0aW9uIiwiaXNMb2NrZWQiLCJ1bmxvY2siLCJvUmVzb3VyY2VCdW5kbGUiLCJtZXNzYWdlSGFuZGxlciIsIm1QYXJhbXMiLCJzdGF0dXMiLCJpc0luaXRpYWxMb2FkNTAzRXJyb3IiLCJzaGVsbEJhY2siLCJpc0RhdGFSZWNlaXZlZEVycm9yIiwic2hvd01lc3NhZ2VzIiwib0JpbmRpbmdDb250ZXh0Iiwib1NpZGVFZmZlY3RzU2VydmljZSIsInNSb290Q29udGV4dFBhdGgiLCJhTmF2aWdhdGlvblByb3BlcnR5UGF0aHMiLCJhUHJvcGVydHlQYXRocyIsIm9TaWRlRWZmZWN0cyIsInRhcmdldFByb3BlcnRpZXMiLCJ0YXJnZXRFbnRpdGllcyIsImdldEJpbmRpbmdQYXRocyIsIm9CaW5kaW5nIiwiYURlcGVuZGVudEJpbmRpbmdzIiwic1JlbGF0aXZlUGF0aCIsImdldENvbnRleHQiLCJzbGljZSIsImdldERlcGVuZGVudEJpbmRpbmdzIiwiaXRlbSIsInB1c2giLCJpIiwibGVuZ3RoIiwiJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgiLCJyZWR1Y2UiLCJ0YXJnZXRQcm9wZXJ0eSIsImluZGV4IiwiaW5kZXhPZiIsIm9QcmV2aW91c0NvbnRleHQiLCJvVGFyZ2V0Q29udHJvbCIsInNldEJpbmRpbmdDb250ZXh0IiwiaXNLZWVwQWxpdmUiLCJiS2VlcEFsaXZlIiwiZm5CZWZvcmVEZXN0cm95IiwiYlJlcXVlc3RNZXNzYWdlcyIsImVuZHNXaXRoIiwic01ldGFQYXRoIiwic2V0S2VlcEFsaXZlIiwia2VwdEFsaXZlU2VnbWVudHMiLCJzcGxpdCIsImFkZGl0aW9ubmFsU2VnbWVudHMiLCJwb3AiLCJrZXB0QWxpdmVQYXRoIiwiam9pbiIsIm9LZWVwQWxpdmVDb250ZXh0IiwicmV2ZXJzZSIsImFkZGl0aW9ubmFsUGF0aCIsInN3aXRjaEZ1bGxTY3JlZW4iLCJvU291cmNlIiwib0ZDTEhlbHBlck1vZGVsIiwiYklzRnVsbFNjcmVlbiIsInNOZXh0TGF5b3V0IiwiZ2V0UmlnaHRtb3N0Q29udGV4dCIsIl9yb3V0aW5nIiwibGF5b3V0Iiwid2FybmluZyIsImNsb3NlQ29sdW1uIiwib1ZpZXdEYXRhIiwibm9QcmVzZXJ2YXRpb25DYWNoZSIsInNMYXlvdXQiLCJkcmFmdCIsInByb2Nlc3NEYXRhTG9zc09yRHJhZnREaXNjYXJkQ29uZmlybWF0aW9uIiwiRnVuY3Rpb24iLCJwcm90b3R5cGUiLCJOYXZpZ2F0aW9uVHlwZSIsIkJhY2tOYXZpZ2F0aW9uIiwiQ29udHJvbGxlckV4dGVuc2lvbiJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiSW50ZXJuYWxSb3V0aW5nLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IHR5cGUgQXBwQ29tcG9uZW50IGZyb20gXCJzYXAvZmUvY29yZS9BcHBDb21wb25lbnRcIjtcbmltcG9ydCB0eXBlIHsgRkVWaWV3IH0gZnJvbSBcInNhcC9mZS9jb3JlL0Jhc2VDb250cm9sbGVyXCI7XG5pbXBvcnQgQ29tbW9uVXRpbHMgZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgdHlwZSBQYWdlQ29udHJvbGxlciBmcm9tIFwic2FwL2ZlL2NvcmUvUGFnZUNvbnRyb2xsZXJcIjtcbmltcG9ydCB0eXBlIFRlbXBsYXRlQ29tcG9uZW50IGZyb20gXCJzYXAvZmUvY29yZS9UZW1wbGF0ZUNvbXBvbmVudFwiO1xuaW1wb3J0IEJ1c3lMb2NrZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL0J1c3lMb2NrZXJcIjtcbmltcG9ydCB7IHR5cGUgTmF2aWdhdGlvblRvRXJyb3JQYWdlUmVzdWx0IH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL01lc3NhZ2VIYW5kbGVyXCI7XG5pbXBvcnQgdHlwZSB7IEJpbmRDb250ZXh0UGFyYW1ldGVycyB9IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9lZGl0Rmxvdy9kcmFmdFwiO1xuaW1wb3J0IGRyYWZ0IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9lZGl0Rmxvdy9kcmFmdFwiO1xuaW1wb3J0IHsgZ2V0RHJhZnRPckFjdGl2ZUNvbnRleHQsIGlzUGF0aE9uRHJhZnRSb290LCByZXNvbHZlUGF0aCB9IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9yb3V0aW5nL0NvbnRleHRQYXRoSGVscGVyXCI7XG5pbXBvcnQgTmF2aWdhdGlvblJlYXNvbiBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvcm91dGluZy9OYXZpZ2F0aW9uUmVhc29uXCI7XG5pbXBvcnQgdHlwZSBSb3V0ZXJQcm94eSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvcm91dGluZy9Sb3V0ZXJQcm94eVwiO1xuaW1wb3J0IHR5cGUgeyBFbmhhbmNlV2l0aFVJNSB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0NsYXNzU3VwcG9ydFwiO1xuaW1wb3J0IHsgZGVmaW5lVUk1Q2xhc3MsIGV4dGVuc2libGUsIGZpbmFsRXh0ZW5zaW9uLCBtZXRob2RPdmVycmlkZSwgcHVibGljRXh0ZW5zaW9uIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvQ2xhc3NTdXBwb3J0XCI7XG5pbXBvcnQgRWRpdFN0YXRlIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0VkaXRTdGF0ZVwiO1xuaW1wb3J0IE1vZGVsSGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01vZGVsSGVscGVyXCI7XG5pbXBvcnQgdHlwZSBGY2xDb250cm9sbGVyIGZyb20gXCJzYXAvZmUvY29yZS9yb290Vmlldy9GY2wuY29udHJvbGxlclwiO1xuaW1wb3J0IHR5cGUgeyBSb3V0aW5nTmF2aWdhdGlvbkluZm8sIFJvdXRpbmdOYXZpZ2F0aW9uUGFyYW1ldGVycywgUm91dGluZ1NlcnZpY2UgfSBmcm9tIFwic2FwL2ZlL2NvcmUvc2VydmljZXMvUm91dGluZ1NlcnZpY2VGYWN0b3J5XCI7XG5pbXBvcnQgdHlwZSBFdmVudCBmcm9tIFwic2FwL3VpL2Jhc2UvRXZlbnRcIjtcbmltcG9ydCBDb21wb25lbnQgZnJvbSBcInNhcC91aS9jb3JlL0NvbXBvbmVudFwiO1xuaW1wb3J0IExpYnJhcnkgZnJvbSBcInNhcC91aS9jb3JlL0xpYlwiO1xuaW1wb3J0IHR5cGUgeyBSb3V0aW5nVGFyZ2V0IH0gZnJvbSBcInNhcC91aS9jb3JlL01hbmlmZXN0XCI7XG5pbXBvcnQgQ29udHJvbGxlckV4dGVuc2lvbiBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL0NvbnRyb2xsZXJFeHRlbnNpb25cIjtcbmltcG9ydCBPdmVycmlkZUV4ZWN1dGlvbiBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL092ZXJyaWRlRXhlY3V0aW9uXCI7XG5pbXBvcnQgdHlwZSBSb3V0ZXIgZnJvbSBcInNhcC91aS9jb3JlL3JvdXRpbmcvUm91dGVyXCI7XG5pbXBvcnQgdHlwZSBCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvQmluZGluZ1wiO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L0NvbnRleHRcIjtcbmltcG9ydCB0eXBlIE9EYXRhQ29udGV4dEJpbmRpbmcgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YUNvbnRleHRCaW5kaW5nXCI7XG5pbXBvcnQgdHlwZSBPRGF0YUxpc3RCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFMaXN0QmluZGluZ1wiO1xuaW1wb3J0IHR5cGUgT0RhdGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTW9kZWxcIjtcbmltcG9ydCB0eXBlIE9EYXRhUHJvcGVydHlCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFQcm9wZXJ0eUJpbmRpbmdcIjtcbmltcG9ydCB7IGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyB9IGZyb20gXCIuLi9jb252ZXJ0ZXJzL01ldGFNb2RlbENvbnZlcnRlclwiO1xuaW1wb3J0IHR5cGUgeyBTaWRlRWZmZWN0c1RhcmdldFR5cGUgfSBmcm9tIFwiLi4vc2VydmljZXMvU2lkZUVmZmVjdHNTZXJ2aWNlRmFjdG9yeVwiO1xuXG50eXBlIFJvdXRlSW5mb3JtYXRpb24gPSB7XG5cdHRhcmdldHM/OiB1bmtub3duW107XG5cdHJvdXRlTGV2ZWw6IG51bWJlcjtcbn07XG4vKipcbiAqIHtAbGluayBzYXAudWkuY29yZS5tdmMuQ29udHJvbGxlckV4dGVuc2lvbiBDb250cm9sbGVyIGV4dGVuc2lvbn1cbiAqXG4gKiBAc2luY2UgMS43NC4wXG4gKi9cbkBkZWZpbmVVSTVDbGFzcyhcInNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkludGVybmFsUm91dGluZ1wiKVxuY2xhc3MgSW50ZXJuYWxSb3V0aW5nIGV4dGVuZHMgQ29udHJvbGxlckV4dGVuc2lvbiB7XG5cdHByaXZhdGUgYmFzZSE6IFBhZ2VDb250cm9sbGVyO1xuXG5cdHByaXZhdGUgX29WaWV3ITogRkVWaWV3O1xuXG5cdHByaXZhdGUgX29BcHBDb21wb25lbnQhOiBBcHBDb21wb25lbnQ7XG5cblx0cHJpdmF0ZSBfb1BhZ2VDb21wb25lbnQhOiBFbmhhbmNlV2l0aFVJNTxUZW1wbGF0ZUNvbXBvbmVudD4gfCBudWxsO1xuXG5cdHByaXZhdGUgX29Sb3V0ZXIhOiBSb3V0ZXI7XG5cblx0cHJpdmF0ZSBfb1JvdXRpbmdTZXJ2aWNlITogUm91dGluZ1NlcnZpY2U7XG5cblx0cHJpdmF0ZSBfb1JvdXRlclByb3h5ITogUm91dGVyUHJveHk7XG5cblx0cHJpdmF0ZSBfZm5Sb3V0ZU1hdGNoZWRCb3VuZCE6IEZ1bmN0aW9uO1xuXG5cdHByb3RlY3RlZCBfb1RhcmdldEluZm9ybWF0aW9uITogUm91dGluZ1RhcmdldDtcblxuXHRAbWV0aG9kT3ZlcnJpZGUoKVxuXHRvbkV4aXQoKTogdm9pZCB7XG5cdFx0aWYgKHRoaXMuX29Sb3V0aW5nU2VydmljZSkge1xuXHRcdFx0dGhpcy5fb1JvdXRpbmdTZXJ2aWNlLmRldGFjaFJvdXRlTWF0Y2hlZCh0aGlzLl9mblJvdXRlTWF0Y2hlZEJvdW5kKTtcblx0XHR9XG5cdH1cblxuXHRAbWV0aG9kT3ZlcnJpZGUoKVxuXHRvbkluaXQoKTogdm9pZCB7XG5cdFx0dGhpcy5fb1ZpZXcgPSB0aGlzLmJhc2UuZ2V0VmlldygpO1xuXHRcdHRoaXMuX29BcHBDb21wb25lbnQgPSBDb21tb25VdGlscy5nZXRBcHBDb21wb25lbnQodGhpcy5fb1ZpZXcpO1xuXHRcdHRoaXMuX29QYWdlQ29tcG9uZW50ID0gQ29tcG9uZW50LmdldE93bmVyQ29tcG9uZW50Rm9yKHRoaXMuX29WaWV3KSBhcyBFbmhhbmNlV2l0aFVJNTxUZW1wbGF0ZUNvbXBvbmVudD47XG5cdFx0dGhpcy5fb1JvdXRlciA9IHRoaXMuX29BcHBDb21wb25lbnQuZ2V0Um91dGVyKCk7XG5cdFx0dGhpcy5fb1JvdXRlclByb3h5ID0gdGhpcy5fb0FwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSgpO1xuXG5cdFx0aWYgKCF0aGlzLl9vQXBwQ29tcG9uZW50IHx8ICF0aGlzLl9vUGFnZUNvbXBvbmVudCkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiRmFpbGVkIHRvIGluaXRpYWxpemUgY29udHJvbGVyIGV4dGVuc2lvbiAnc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVzaW9ucy5JbnRlcm5hbFJvdXRpbmdcIik7XG5cdFx0fVxuXG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudFxuXHRcdC8vIEB0cy1pZ25vcmVcblx0XHRpZiAodGhpcy5fb0FwcENvbXBvbmVudCA9PT0gdGhpcy5fb1BhZ2VDb21wb25lbnQpIHtcblx0XHRcdC8vIFRoZSB2aWV3IGlzbid0IGhvc3RlZCBpbiBhIGRlZGljYXRlZCBVSUNvbXBvbmVudCwgYnV0IGRpcmVjdGx5IGluIHRoZSBhcHBcblx0XHRcdC8vIC0tPiBqdXN0IGtlZXAgdGhlIHZpZXdcblx0XHRcdHRoaXMuX29QYWdlQ29tcG9uZW50ID0gbnVsbDtcblx0XHR9XG5cblx0XHR0aGlzLl9vQXBwQ29tcG9uZW50XG5cdFx0XHQuZ2V0U2VydmljZShcInJvdXRpbmdTZXJ2aWNlXCIpXG5cdFx0XHQudGhlbigob1JvdXRpbmdTZXJ2aWNlOiBSb3V0aW5nU2VydmljZSkgPT4ge1xuXHRcdFx0XHR0aGlzLl9vUm91dGluZ1NlcnZpY2UgPSBvUm91dGluZ1NlcnZpY2U7XG5cdFx0XHRcdHRoaXMuX2ZuUm91dGVNYXRjaGVkQm91bmQgPSB0aGlzLl9vblJvdXRlTWF0Y2hlZC5iaW5kKHRoaXMpO1xuXHRcdFx0XHR0aGlzLl9vUm91dGluZ1NlcnZpY2UuYXR0YWNoUm91dGVNYXRjaGVkKHt9LCB0aGlzLl9mblJvdXRlTWF0Y2hlZEJvdW5kKTtcblx0XHRcdFx0dGhpcy5fb1RhcmdldEluZm9ybWF0aW9uID0gb1JvdXRpbmdTZXJ2aWNlLmdldFRhcmdldEluZm9ybWF0aW9uRm9yKHRoaXMuX29QYWdlQ29tcG9uZW50IHx8IHRoaXMuX29WaWV3KSE7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24gKCkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJUaGlzIGNvbnRyb2xsZXIgZXh0ZW5zaW9uIGNhbm5vdCB3b3JrIHdpdGhvdXQgYSAncm91dGluZ1NlcnZpY2UnIG9uIHRoZSBtYWluIEFwcENvbXBvbmVudFwiKTtcblx0XHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRyaWdnZXJlZCBldmVyeSB0aW1lIHRoaXMgY29udHJvbGxlciBpcyBhIG5hdmlnYXRpb24gdGFyZ2V0LlxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRvblJvdXRlTWF0Y2hlZCgpOiB2b2lkIHtcblx0XHQvKiovXG5cdH1cblxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdG9uUm91dGVNYXRjaGVkRmluaXNoZWQoKTogdm9pZCB7XG5cdFx0LyoqL1xuXHR9XG5cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRvbkJlZm9yZUJpbmRpbmcoX2JpbmRpbmdDb250ZXh0OiBDb250ZXh0IHwgbnVsbCwgX21QYXJhbWV0ZXJzPzogdW5rbm93bik6IHZvaWQge31cblxuXHRiZWZvcmVTZXRCaW5kaW5nQ29udGV4dChiaW5kaW5nQ29udGV4dDogQ29udGV4dCB8IG51bGwsIF9tUGFyYW1ldGVycz86IHVua25vd24pOiB2b2lkIHtcblx0XHR0aGlzLm9uQmVmb3JlQmluZGluZyhiaW5kaW5nQ29udGV4dCwgX21QYXJhbWV0ZXJzKTtcblx0XHRjb25zdCBvUm91dGluZyA9IHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpLnJvdXRpbmc7XG5cdFx0aWYgKG9Sb3V0aW5nICYmIG9Sb3V0aW5nLm9uQmVmb3JlQmluZGluZykge1xuXHRcdFx0b1JvdXRpbmcub25CZWZvcmVCaW5kaW5nKGJpbmRpbmdDb250ZXh0KTtcblx0XHR9XG5cdH1cblxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdG9uQWZ0ZXJCaW5kaW5nKGJpbmRpbmdDb250ZXh0OiBDb250ZXh0IHwgbnVsbCwgX21QYXJhbWV0ZXJzPzogdW5rbm93bik6IHZvaWQge1xuXHRcdHRoaXMuX29BcHBDb21wb25lbnQuZ2V0Um9vdFZpZXdDb250cm9sbGVyKCkub25Db250ZXh0Qm91bmRUb1ZpZXcoYmluZGluZ0NvbnRleHQpO1xuXHR9XG5cblx0YWZ0ZXJTZXRCaW5kaW5nQ29udGV4dChiaW5kaW5nQ29udGV4dDogQ29udGV4dCB8IG51bGwsIF9tUGFyYW1ldGVycz86IHVua25vd24pOiB2b2lkIHtcblx0XHR0aGlzLm9uQWZ0ZXJCaW5kaW5nKGJpbmRpbmdDb250ZXh0LCBfbVBhcmFtZXRlcnMpO1xuXHRcdGNvbnN0IG9Sb3V0aW5nID0gdGhpcy5iYXNlLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkucm91dGluZztcblx0XHRpZiAob1JvdXRpbmcgJiYgb1JvdXRpbmcub25BZnRlckJpbmRpbmcpIHtcblx0XHRcdG9Sb3V0aW5nLm9uQWZ0ZXJCaW5kaW5nKGJpbmRpbmdDb250ZXh0KTtcblx0XHR9XG5cdH1cblxuXHQvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXHQvLyBNZXRob2RzIHRyaWdnZXJpbmcgYSBuYXZpZ2F0aW9uIGFmdGVyIGEgdXNlciBhY3Rpb25cblx0Ly8gKGUuZy4gY2xpY2sgb24gYSB0YWJsZSByb3csIGJ1dHRvbiwgZXRjLi4uKVxuXHQvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG5cdC8qKlxuXHQgKiBOYXZpZ2F0ZXMgdG8gdGhlIHNwZWNpZmllZCBuYXZpZ2F0aW9uIHRhcmdldC5cblx0ICpcblx0ICogQHBhcmFtIG9Db250ZXh0IENvbnRleHQgaW5zdGFuY2Vcblx0ICogQHBhcmFtIHNOYXZpZ2F0aW9uVGFyZ2V0TmFtZSBOYW1lIG9mIHRoZSBuYXZpZ2F0aW9uIHRhcmdldFxuXHQgKiBAcGFyYW0gYlByZXNlcnZlSGlzdG9yeSBUcnVlIHRvIGZvcmNlIHRoZSBuZXcgVVJMIHRvIGJlIGFkZGVkIGF0IHRoZSBlbmQgb2YgdGhlIGJyb3dzZXIgaGlzdG9yeSAobm8gcmVwbGFjZSlcblx0ICogQHBhcmFtIGRlbGF5ZWRVc2FnZSBUcnVlIHRvIHJldHVybiBhIGZ1bmN0aW9uIGZvciBleGVjdXRpbmcgdGhlIG5hdmlnYXRpb24sIEZhbHNlIHRvIGV4ZWN1dGUgdGhlIG5hdmlnYXRpb24gaW1tZWRpYXRlbHlcblx0ICovXG5cdGFzeW5jIG5hdmlnYXRlVG9UYXJnZXQoXG5cdFx0b0NvbnRleHQ6IENvbnRleHQsXG5cdFx0c05hdmlnYXRpb25UYXJnZXROYW1lOiBzdHJpbmcsXG5cdFx0YlByZXNlcnZlSGlzdG9yeT86IGJvb2xlYW4sXG5cdFx0ZGVsYXllZFVzYWdlPzogdHJ1ZVxuXHQpOiBQcm9taXNlPCgpID0+IHZvaWQ+O1xuXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRhc3luYyBuYXZpZ2F0ZVRvVGFyZ2V0KFxuXHRcdG9Db250ZXh0OiBDb250ZXh0LFxuXHRcdHNOYXZpZ2F0aW9uVGFyZ2V0TmFtZTogc3RyaW5nLFxuXHRcdGJQcmVzZXJ2ZUhpc3Rvcnk/OiBib29sZWFuLFxuXHRcdGRlbGF5ZWRVc2FnZT86IGJvb2xlYW5cblx0KTogUHJvbWlzZTwoKCkgPT4gdm9pZCkgfCB2b2lkPiB7XG5cdFx0Y29uc3Qgb05hdmlnYXRpb25Db25maWd1cmF0aW9uID1cblx0XHRcdHRoaXMuX29QYWdlQ29tcG9uZW50ICYmXG5cdFx0XHR0aGlzLl9vUGFnZUNvbXBvbmVudC5nZXROYXZpZ2F0aW9uQ29uZmlndXJhdGlvbiAmJlxuXHRcdFx0dGhpcy5fb1BhZ2VDb21wb25lbnQuZ2V0TmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24oc05hdmlnYXRpb25UYXJnZXROYW1lKTtcblx0XHRpZiAob05hdmlnYXRpb25Db25maWd1cmF0aW9uKSB7XG5cdFx0XHRjb25zdCBvRGV0YWlsUm91dGUgPSBvTmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24uZGV0YWlsO1xuXHRcdFx0Y29uc3Qgc1JvdXRlTmFtZSA9IG9EZXRhaWxSb3V0ZS5yb3V0ZTtcblx0XHRcdGNvbnN0IG1QYXJhbWV0ZXJNYXBwaW5nID0gb0RldGFpbFJvdXRlLnBhcmFtZXRlcnM7XG5cdFx0XHRyZXR1cm4gdGhpcy5fb1JvdXRpbmdTZXJ2aWNlLm5hdmlnYXRlVG8ob0NvbnRleHQsIHNSb3V0ZU5hbWUsIG1QYXJhbWV0ZXJNYXBwaW5nLCBiUHJlc2VydmVIaXN0b3J5LCBkZWxheWVkVXNhZ2UpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fb1JvdXRpbmdTZXJ2aWNlLm5hdmlnYXRlVG8ob0NvbnRleHQsIG51bGwsIG51bGwsIGJQcmVzZXJ2ZUhpc3RvcnksIGRlbGF5ZWRVc2FnZSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIE5hdmlnYXRlcyB0byB0aGUgc3BlY2lmaWVkIG5hdmlnYXRpb24gdGFyZ2V0IHJvdXRlLlxuXHQgKlxuXHQgKiBAcGFyYW0gc1RhcmdldFJvdXRlTmFtZSBOYW1lIG9mIHRoZSB0YXJnZXQgcm91dGVcblx0ICogQHBhcmFtIFtvUGFyYW1ldGVyc10gUGFyYW1ldGVycyB0byBiZSB1c2VkIHdpdGggcm91dGUgdG8gY3JlYXRlIHRoZSB0YXJnZXQgaGFzaFxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2hlbiB0aGUgbmF2aWdhdGlvbiBpcyBmaW5hbGl6ZWRcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRhc3luYyBuYXZpZ2F0ZVRvUm91dGUoc1RhcmdldFJvdXRlTmFtZTogc3RyaW5nLCBvUGFyYW1ldGVycz86IG9iamVjdCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRcdHJldHVybiB0aGlzLl9vUm91dGluZ1NlcnZpY2UubmF2aWdhdGVUb1JvdXRlKHNUYXJnZXRSb3V0ZU5hbWUsIG9QYXJhbWV0ZXJzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBOYXZpZ2F0ZXMgdG8gYSBzcGVjaWZpYyBjb250ZXh0LlxuXHQgKlxuXHQgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB0byBiZSBuYXZpZ2F0ZWQgdG9cblx0ICogQHBhcmFtIHBhcmFtZXRlcnMgT3B0aW9uYWwgbmF2aWdhdGlvbiBwYXJhbWV0ZXJzXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZWQgdG8gJ3RydWUnIHdoZW4gdGhlIG5hdmlnYXRpb24gaGFzIGJlZW4gdHJpZ2dlcmVkLCAnZmFsc2UnIGlmIHRoZSBuYXZpZ2F0aW9uIGRpZCBub3QgaGFwcGVuXG5cdCAqL1xuXHRhc3luYyBuYXZpZ2F0ZVRvQ29udGV4dChjb250ZXh0OiBDb250ZXh0IHwgT0RhdGFMaXN0QmluZGluZywgcGFyYW1ldGVyczogUm91dGluZ05hdmlnYXRpb25QYXJhbWV0ZXJzID0ge30pOiBQcm9taXNlPGJvb2xlYW4+IHtcblx0XHRpZiAoY29udGV4dC5pc0E8T0RhdGFMaXN0QmluZGluZz4oXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ1wiKSkge1xuXHRcdFx0aWYgKHBhcmFtZXRlcnMuY3JlYXRlT25OYXZpZ2F0ZVBhcmFtZXRlcnM/Lm1vZGUgPT09IFwiQXN5bmNcIikge1xuXHRcdFx0XHQvLyB0aGUgY29udGV4dCBpcyBlaXRoZXIgY3JlYXRlZCBhc3luYyAoUHJvbWlzZSlcblx0XHRcdFx0Ly8gV2UgbmVlZCB0byBhY3RpdmF0ZSB0aGUgcm91dGVNYXRjaFN5bmNocm8gb24gdGhlIFJvdXRlclByb3h5IHRvIGF2b2lkIHRoYXRcblx0XHRcdFx0Ly8gdGhlIHN1YnNlcXVlbnQgY2FsbCB0byBuYXZpZ2F0ZVRvQ29udGV4dCBjb25mbGljdHMgd2l0aCB0aGUgY3VycmVudCBvbmVcblx0XHRcdFx0dGhpcy5fb1JvdXRlclByb3h5LmFjdGl2YXRlUm91dGVNYXRjaFN5bmNocm9uaXphdGlvbigpO1xuXG5cdFx0XHRcdHBhcmFtZXRlcnMuY3JlYXRlT25OYXZpZ2F0ZVBhcmFtZXRlcnMuY3JlYXRlQ29udGV4dFByb21pc2Vcblx0XHRcdFx0XHQudGhlbihhc3luYyAoY3JlYXRlZENvbnRleHQpID0+IHtcblx0XHRcdFx0XHRcdC8vIG9uY2UgdGhlIGNvbnRleHQgaXMgcmV0dXJuZWQgd2UgbmF2aWdhdGUgaW50byBpdFxuXHRcdFx0XHRcdFx0cmV0dXJuIHRoaXMubmF2aWdhdGVUb0NvbnRleHQoY3JlYXRlZENvbnRleHQsIHtcblx0XHRcdFx0XHRcdFx0Y2hlY2tOb0hhc2hDaGFuZ2U6IHBhcmFtZXRlcnMuY2hlY2tOb0hhc2hDaGFuZ2UsXG5cdFx0XHRcdFx0XHRcdGVkaXRhYmxlOiBwYXJhbWV0ZXJzLmVkaXRhYmxlLFxuXHRcdFx0XHRcdFx0XHRwZXJzaXN0T1BTY3JvbGw6IHBhcmFtZXRlcnMucGVyc2lzdE9QU2Nyb2xsLFxuXHRcdFx0XHRcdFx0XHR1cGRhdGVGQ0xMZXZlbDogcGFyYW1ldGVycy51cGRhdGVGQ0xMZXZlbCxcblx0XHRcdFx0XHRcdFx0Zm9yY2VGb2N1czogcGFyYW1ldGVycy5mb3JjZUZvY3VzXG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aXRoIHRoZSBhc3luYyBjb250ZXh0XCIsIG9FcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fSBlbHNlIGlmIChwYXJhbWV0ZXJzLmNyZWF0ZU9uTmF2aWdhdGVQYXJhbWV0ZXJzPy5tb2RlICE9PSBcIkRlZmVycmVkXCIpIHtcblx0XHRcdFx0Ly8gTmF2aWdhdGUgdG8gYSBsaXN0IGJpbmRpbmcgbm90IHlldCBzdXBwb3J0ZWRcblx0XHRcdFx0dGhyb3cgXCJuYXZpZ2F0aW9uIHRvIGEgbGlzdCBiaW5kaW5nIGlzIG5vdCB5ZXQgc3VwcG9ydGVkXCI7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChwYXJhbWV0ZXJzLmNhbGxFeHRlbnNpb24pIHtcblx0XHRcdGNvbnN0IGludGVybmFsTW9kZWwgPSB0aGlzLl9vVmlldy5nZXRNb2RlbChcImludGVybmFsXCIpO1xuXHRcdFx0aW50ZXJuYWxNb2RlbC5zZXRQcm9wZXJ0eShcIi9wYWdpbmF0b3JDdXJyZW50Q29udGV4dFwiLCBudWxsKTtcblxuXHRcdFx0Ly8gU3RvcmluZyB0aGUgc2VsZWN0ZWQgY29udGV4dCB0byB1c2UgaXQgaW4gaW50ZXJuYWwgcm91dGUgbmF2aWdhdGlvbiBpZiBuZWNjZXNzYXJ5LlxuXHRcdFx0Y29uc3Qgb3ZlcnJpZGVOYXYgPSB0aGlzLmJhc2UuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKS5yb3V0aW5nLm9uQmVmb3JlTmF2aWdhdGlvbih7IGJpbmRpbmdDb250ZXh0OiBjb250ZXh0IH0pO1xuXHRcdFx0aWYgKG92ZXJyaWRlTmF2KSB7XG5cdFx0XHRcdGludGVybmFsTW9kZWwuc2V0UHJvcGVydHkoXCIvcGFnaW5hdG9yQ3VycmVudENvbnRleHRcIiwgY29udGV4dCk7XG5cdFx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUodHJ1ZSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cGFyYW1ldGVycy5GQ0xMZXZlbCA9IHRoaXMuX2dldEZDTExldmVsKCk7XG5cblx0XHQvLyBJbiBjYXNlIHdlJ3JlIG5hdmlnYXRpbmcgZnJvbSBhIHRhYmxlIGluIGEgTGlzdFJlcG9ydCB3aXRoIGRyYWZ0LCB0aGVyZSdzIHNwZWNpYWwgaGFuZGxpbmcgZm9yIGNvbGxhYm9yYXRpb24gYW5kIHRyZWUgdGFibGUuXG5cdFx0Ly8gV2UgbWF5IG5vdCBuYXZpZ2F0ZSB0byB0aGUgY29udGV4dCB0aGUgdXNlciBjbGlja2VkIG9uLlxuXHRcdGlmIChwYXJhbWV0ZXJzLnJlYXNvbiA9PT0gTmF2aWdhdGlvblJlYXNvbi5Sb3dQcmVzcyAmJiBjb250ZXh0LmlzQTxDb250ZXh0PihcInNhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0XCIpKSB7XG5cdFx0XHRjb25zdCBtb2RlbCA9IGNvbnRleHQuZ2V0TW9kZWwoKTtcblx0XHRcdGNvbnN0IG1ldGFNb2RlbCA9IG1vZGVsLmdldE1ldGFNb2RlbCgpO1xuXG5cdFx0XHRpZiAoaXNQYXRoT25EcmFmdFJvb3QoY29udGV4dC5nZXRQYXRoKCksIG1ldGFNb2RlbCkpIHtcblx0XHRcdFx0Y29uc3QgY29udGV4dEZvck5hdmlnYXRpb24gPVxuXHRcdFx0XHRcdChhd2FpdCB0aGlzLmdldENvbnRleHRGb3JOYXZpZ2F0aW9uV2l0aENvbGxhYm9yYXRpb24oY29udGV4dCwgcGFyYW1ldGVycykpID8/XG5cdFx0XHRcdFx0KGF3YWl0IHRoaXMuZ2V0Q29udGV4dEZvck5hdmlnYXRpb25Gcm9tVHJlZVRhYmxlKGNvbnRleHQpKTtcblxuXHRcdFx0XHQvLyBVc2UgYW5vdGhlciBpbnN0YW5jZSBmb3IgbmF2aWdhdGlvblxuXHRcdFx0XHRpZiAoY29udGV4dEZvck5hdmlnYXRpb24pIHtcblx0XHRcdFx0XHRjb250ZXh0ID0gY29udGV4dEZvck5hdmlnYXRpb247XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5fb1JvdXRpbmdTZXJ2aWNlLm5hdmlnYXRlVG9Db250ZXh0KGNvbnRleHQsIHBhcmFtZXRlcnMsIHRoaXMuX29WaWV3LmdldFZpZXdEYXRhKCksIHRoaXMuX29UYXJnZXRJbmZvcm1hdGlvbik7XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmVzIHRoZSBjb250ZXh0IHRvIHVzZSBmb3IgbmF2aWdhdGlvbiBpbiBjYXNlIHdlJ3JlIG5hdmlnYXRpbmcgdG8gYSBkcmFmdCBpbnN0YW5jZSBmcm9tIHRoZSBMUiBhbmQgd2UncmUgaW4gYSBjb2xsYWJvcmF0aW9uIGFwcGxpY2F0aW9uLlxuXHQgKlxuXHQgKiBAcGFyYW0gb3JpZ2luYWxDb250ZXh0XG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzXG5cdCAqIEByZXR1cm5zIFRoZSBjb250ZXh0IHRvIHVzZSBmb3IgbmF2aWdhdGlvbiBpZiBpdCdzIGRpZmZlcmVudCBmcm9tIHRoZSBvcmlnaW5hbCBjb250ZXh0LCBudWxsIG90aGVyd2lzZVxuXHQgKi9cblx0cHJpdmF0ZSBhc3luYyBnZXRDb250ZXh0Rm9yTmF2aWdhdGlvbldpdGhDb2xsYWJvcmF0aW9uKFxuXHRcdG9yaWdpbmFsQ29udGV4dDogQ29udGV4dCxcblx0XHRwYXJhbWV0ZXJzOiBSb3V0aW5nTmF2aWdhdGlvblBhcmFtZXRlcnNcblx0KTogUHJvbWlzZTxDb250ZXh0IHwgbnVsbD4ge1xuXHRcdGNvbnN0IG1vZGVsID0gb3JpZ2luYWxDb250ZXh0LmdldE1vZGVsKCk7XG5cdFx0Y29uc3QgbWV0YU1vZGVsID0gbW9kZWwuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0aWYgKE1vZGVsSGVscGVyLmlzQ29sbGFib3JhdGlvbkRyYWZ0U3VwcG9ydGVkKG1ldGFNb2RlbCkgJiYgb3JpZ2luYWxDb250ZXh0LmdldFByb3BlcnR5KFwiSXNBY3RpdmVFbnRpdHlcIikgPT09IGZhbHNlKSB7XG5cdFx0XHQvLyBJZiB3ZSdyZSBpbiBhIGNvbGxhYm9yYXRpb24gYXBwbGljYXRpb24sIGFuZCB3ZSdyZSBuYXZpZ2F0aW5nIHRvIGEgZHJhZnQgaW5zdGFuY2UgZnJvbSB0aGUgTFIsXG5cdFx0XHQvLyBXZSB3YW50IHRvIGNoZWNrIGlmIHRoZSBkcmFmdCBpbnN0YW5jZSBleGlzdHMgZmlyc3QuIE90aGVyd2lzZSB3ZSBuYXZpZ2F0ZSB0byB0aGUgb3JpZ2luYWwgKGRyYWZ0KSB2ZXJzaW9uLlxuXHRcdFx0Y29uc3QgZHJhZnRPckFjdGl2ZUNvbnRleHQgPSBhd2FpdCBnZXREcmFmdE9yQWN0aXZlQ29udGV4dChvcmlnaW5hbENvbnRleHQpO1xuXG5cdFx0XHRpZiAoZHJhZnRPckFjdGl2ZUNvbnRleHQgIT09IG51bGwgJiYgb3JpZ2luYWxDb250ZXh0LmdldFBhdGgoKSAhPT0gZHJhZnRPckFjdGl2ZUNvbnRleHQuZ2V0UGF0aCgpKSB7XG5cdFx0XHRcdC8vIE5vdGlmeSB0aGUgdXNlciB0aGF0IHdlIGhhdmUgbmF2aWdhdGVkIHRvIHRoZSBzYXZlZCBpbnN0YW5jZVxuXHRcdFx0XHRjb25zdCBvYmplY3RQYXRoID0gZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzKG1ldGFNb2RlbC5nZXRNZXRhQ29udGV4dChvcmlnaW5hbENvbnRleHQuZ2V0UGF0aCgpKSk7XG5cdFx0XHRcdHBhcmFtZXRlcnMucmVkaXJlY3RlZFRvTm9uRHJhZnQgPVxuXHRcdFx0XHRcdChvYmplY3RQYXRoLnRhcmdldEVudGl0eVR5cGUuYW5ub3RhdGlvbnMuVUk/LkhlYWRlckluZm8/LlR5cGVOYW1lIGFzIHVua25vd24gYXMgc3RyaW5nKSA/P1xuXHRcdFx0XHRcdG9iamVjdFBhdGgudGFyZ2V0RW50aXR5VHlwZS5uYW1lO1xuXG5cdFx0XHRcdGlmICh0aGlzLl9vQXBwQ29tcG9uZW50LmdldFJvb3RWaWV3Q29udHJvbGxlcigpLmlzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdFx0Ly8gRkNMOiByZXBsYWNlIHRoZSBjb250ZXh0IGluIHRoZSBsaXN0IGJpbmRpbmdcblx0XHRcdFx0XHRjb25zdCBjb250ZXh0VG9SZXBsYWNlV2l0aCA9IG1vZGVsLmdldEtlZXBBbGl2ZUNvbnRleHQoZHJhZnRPckFjdGl2ZUNvbnRleHQuZ2V0UGF0aCgpKTtcblx0XHRcdFx0XHRvcmlnaW5hbENvbnRleHQucmVwbGFjZVdpdGgoY29udGV4dFRvUmVwbGFjZVdpdGgpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIEZ1bGxzY3JlZW46IHRyaWdnZXIgYSByZWZyZXNoIG9mIHRoZSBsaXN0IGJpbmRpbmdcblx0XHRcdFx0XHRFZGl0U3RhdGUuc2V0RWRpdFN0YXRlRGlydHkoKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFVzZSB0aGUgc2F2ZWQgaW5zdGFuY2UgZm9yIG5hdmlnYXRpb25cblx0XHRcdFx0cmV0dXJuIGRyYWZ0T3JBY3RpdmVDb250ZXh0O1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIFVzZSB0aGUgb3JpZ2luYWwgY29udGV4dFxuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlcyB0aGUgY29udGV4dCB0byB1c2UgZm9yIG5hdmlnYXRpb24gaW4gY2FzZSB3ZSdyZSBuYXZpZ2F0aW5nIHRvIGFuIGFjdGl2ZSBpbnN0YW5jZSBmcm9tIHRoZSBMUiBhbmQgd2UncmUgaW4gYSBUcmVlIHRhYmxlLlxuXHQgKlxuXHQgKiBAcGFyYW0gb3JpZ2luYWxDb250ZXh0XG5cdCAqIEByZXR1cm5zIFRoZSBjb250ZXh0IHRvIHVzZSBmb3IgbmF2aWdhdGlvbiBpZiBpdCdzIGRpZmZlcmVudCBmcm9tIHRoZSBvcmlnaW5hbCBjb250ZXh0LCBudWxsIG90aGVyd2lzZVxuXHQgKi9cblx0cHJpdmF0ZSBhc3luYyBnZXRDb250ZXh0Rm9yTmF2aWdhdGlvbkZyb21UcmVlVGFibGUob3JpZ2luYWxDb250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTxDb250ZXh0IHwgbnVsbD4ge1xuXHRcdGNvbnN0IHBhcmVudEJpbmRpbmcgPSBvcmlnaW5hbENvbnRleHQuZ2V0QmluZGluZygpO1xuXHRcdGlmICghcGFyZW50QmluZGluZy5pc0E8T0RhdGFMaXN0QmluZGluZz4oXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ1wiKSkge1xuXHRcdFx0Ly8gVGhlIGNvbnRleHQgZG9lc24ndCBiZWxvbmcgdG8gYSBsaXN0IGJpbmRpbmdcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblx0XHRjb25zdCBhZ2dyZWdhdGlvbiA9IHBhcmVudEJpbmRpbmcuZ2V0QWdncmVnYXRpb24oKSBhcyB7IGhpZXJhcmNoeVF1YWxpZmllcj86IHN0cmluZyB9IHwgdW5kZWZpbmVkO1xuXHRcdGlmICghYWdncmVnYXRpb24/LmhpZXJhcmNoeVF1YWxpZmllcikge1xuXHRcdFx0Ly8gVGhlIGNvbnRleHQgZG9lc24ndCBiZWxvbmcgdG8gYSBoaWVyYXJjaGljYWwgbGlzdCBiaW5kaW5nXG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cblx0XHRpZiAob3JpZ2luYWxDb250ZXh0LmdldFByb3BlcnR5KFwiSXNBY3RpdmVFbnRpdHlcIikgPT09IHRydWUgJiYgb3JpZ2luYWxDb250ZXh0LmdldFByb3BlcnR5KFwiSGFzRHJhZnRFbnRpdHlcIikgPT09IHRydWUpIHtcblx0XHRcdC8vIElmIHdlJ3JlIGluIGEgVHJlZVRhYmxlLCBhbmQgd2UncmUgbmF2aWdhdGluZyB0byBhbiBhY3RpdmUgaW5zdGFuY2UgaW5zdGFuY2UgdGhhdCBoYXMgYSBkcmFmdCxcblx0XHRcdC8vIC0tPiBXZSB0cnkgdG8gbmF2aWdhdGUgdG8gdGhlIGRyYWZ0IGluc3RhbmNlIChpZiBpdCBzdGlsbCBleGlzdHMpXG5cdFx0XHRjb25zdCBkcmFmdE9yQWN0aXZlQ29udGV4dCA9IGF3YWl0IGdldERyYWZ0T3JBY3RpdmVDb250ZXh0KG9yaWdpbmFsQ29udGV4dCk7XG5cblx0XHRcdGlmIChkcmFmdE9yQWN0aXZlQ29udGV4dCAhPT0gbnVsbCAmJiBvcmlnaW5hbENvbnRleHQuZ2V0UGF0aCgpICE9PSBkcmFmdE9yQWN0aXZlQ29udGV4dC5nZXRQYXRoKCkpIHtcblx0XHRcdFx0Ly8gVXNlIHRoZSBkcmFmdCBpbnN0YW5jZSBmb3IgbmF2aWdhdGlvblxuXHRcdFx0XHRyZXR1cm4gZHJhZnRPckFjdGl2ZUNvbnRleHQ7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gVXNlIHRoZSBvcmlnaW5hbCBjb250ZXh0XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblxuXHQvKipcblx0ICogTmF2aWdhdGVzIGJhY2t3YXJkcyBmcm9tIGEgY29udGV4dC5cblx0ICpcblx0ICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCB0byBiZSBuYXZpZ2F0ZWQgZnJvbVxuXHQgKiBAcGFyYW0gW3BhcmFtZXRlcnNdIE9wdGlvbmFsIG5hdmlnYXRpb24gcGFyYW1ldGVyc1xuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVkIHdoZW4gdGhlIG5hdmlnYXRpb24gaGFzIGJlZW4gdHJpZ2dlcmVkXG5cdCAqL1xuXHRhc3luYyBuYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dChjb250ZXh0OiBDb250ZXh0LCBwYXJhbWV0ZXJzOiBSb3V0aW5nTmF2aWdhdGlvblBhcmFtZXRlcnMgPSB7fSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRcdHBhcmFtZXRlcnMudXBkYXRlRkNMTGV2ZWwgPSAtMTtcblxuXHRcdHJldHVybiB0aGlzLm5hdmlnYXRlVG9Db250ZXh0KGNvbnRleHQsIHBhcmFtZXRlcnMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIE5hdmlnYXRlcyBmb3J3YXJkcyB0byBhIGNvbnRleHQuXG5cdCAqXG5cdCAqIEBwYXJhbSBjb250ZXh0IENvbnRleHQgdG8gYmUgbmF2aWdhdGVkIHRvXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzIE9wdGlvbmFsIG5hdmlnYXRpb24gcGFyYW1ldGVyc1xuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVkIHdoZW4gdGhlIG5hdmlnYXRpb24gaGFzIGJlZW4gdHJpZ2dlcmVkXG5cdCAqL1xuXHRhc3luYyBuYXZpZ2F0ZUZvcndhcmRUb0NvbnRleHQoY29udGV4dDogQ29udGV4dCB8IE9EYXRhTGlzdEJpbmRpbmcsIHBhcmFtZXRlcnM6IFJvdXRpbmdOYXZpZ2F0aW9uUGFyYW1ldGVycyA9IHt9KTogUHJvbWlzZTxib29sZWFuPiB7XG5cdFx0aWYgKHRoaXMuX29WaWV3LmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIik/LmdldFByb3BlcnR5KFwibWVzc2FnZUZvb3RlckNvbnRhaW5zRXJyb3JzXCIpID09PSB0cnVlKSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRydWUpO1xuXHRcdH1cblxuXHRcdHBhcmFtZXRlcnMudXBkYXRlRkNMTGV2ZWwgPSAxO1xuXG5cdFx0cmV0dXJuIHRoaXMubmF2aWdhdGVUb0NvbnRleHQoY29udGV4dCwgcGFyYW1ldGVycyk7XG5cdH1cblxuXHQvKipcblx0ICogTmF2aWdhdGVzIGJhY2sgaW4gaGlzdG9yeSBpZiB0aGUgY3VycmVudCBoYXNoIGNvcnJlc3BvbmRzIHRvIGEgdHJhbnNpZW50IHN0YXRlLlxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdG5hdmlnYXRlQmFja0Zyb21UcmFuc2llbnRTdGF0ZSgpOiB2b2lkIHtcblx0XHRjb25zdCBzSGFzaCA9IHRoaXMuX29Sb3V0ZXJQcm94eS5nZXRIYXNoKCk7XG5cblx0XHQvLyBpZiB0cmlnZ2VyZWQgd2hpbGUgbmF2aWdhdGluZyB0byAoLi4uKSwgd2UgbmVlZCB0byBuYXZpZ2F0ZSBiYWNrXG5cdFx0aWYgKHNIYXNoLmluY2x1ZGVzKFwiKC4uLilcIikpIHtcblx0XHRcdHRoaXMuX29Sb3V0ZXJQcm94eS5uYXZCYWNrKCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIERpc3BsYXlzIGFuIGVycm9yIChpbGx1c3RyYXRlZCBtZXNzYWdlKSBpbiB0aGUgcGFnZS5cblx0ICpcblx0ICogQHBhcmFtIHNFcnJvck1lc3NhZ2Vcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZVxuXHQgKi9cblx0YXN5bmMgbmF2aWdhdGVUb01lc3NhZ2VQYWdlKHNFcnJvck1lc3NhZ2U6IHN0cmluZywgbVBhcmFtZXRlcnM6IE5hdmlnYXRpb25Ub0Vycm9yUGFnZVJlc3VsdCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRcdG1QYXJhbWV0ZXJzID0gbVBhcmFtZXRlcnMgfHwge307XG5cdFx0aWYgKHRoaXMuX29Sb3V0ZXJQcm94eS5nZXRIYXNoKCkuaW5jbHVkZXMoXCJpLWFjdGlvbj1jcmVhdGVcIikgfHwgdGhpcy5fb1JvdXRlclByb3h5LmdldEhhc2goKS5pbmNsdWRlcyhcImktYWN0aW9uPWF1dG9DcmVhdGVcIikpIHtcblx0XHRcdHJldHVybiB0aGlzLl9vUm91dGVyUHJveHkubmF2VG9IYXNoKHRoaXMuX29Sb3V0aW5nU2VydmljZS5nZXREZWZhdWx0Q3JlYXRlSGFzaCgpKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIHRoaXMuX29BcHBDb21wb25lbnQuZ2V0Um9vdFZpZXdDb250cm9sbGVyKCkuZGlzcGxheUVycm9yUGFnZShzRXJyb3JNZXNzYWdlLCBtUGFyYW1ldGVycywgdGhpcy5fZ2V0RkNMTGV2ZWwoKSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiBvbmUgb2YgdGhlIGN1cnJlbnQgdmlld3Mgb24gdGhlIHNjcmVlbiBpcyBib3VuZCB0byBhIGdpdmVuIGNvbnRleHQuXG5cdCAqXG5cdCAqIEBwYXJhbSBvQ29udGV4dFxuXHQgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHN0YXRlIGlzIGltcGFjdGVkIGJ5IHRoZSBjb250ZXh0XG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0aXNDdXJyZW50U3RhdGVJbXBhY3RlZEJ5KG9Db250ZXh0OiBDb250ZXh0KTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuX29Sb3V0aW5nU2VydmljZS5pc0N1cnJlbnRTdGF0ZUltcGFjdGVkQnkob0NvbnRleHQpO1xuXHR9XG5cblx0X2lzVmlld1BhcnRPZlJvdXRlKHJvdXRlSW5mb3JtYXRpb24/OiBSb3V0ZUluZm9ybWF0aW9uKTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgYVRhcmdldHMgPSByb3V0ZUluZm9ybWF0aW9uPy50YXJnZXRzO1xuXHRcdGlmICghYVRhcmdldHMgfHwgIWFUYXJnZXRzLmluY2x1ZGVzKHRoaXMuX29UYXJnZXRJbmZvcm1hdGlvbi50YXJnZXROYW1lKSkge1xuXHRcdFx0Ly8gSWYgdGhlIHRhcmdldCBmb3IgdGhpcyB2aWV3IGhhcyBhIHZpZXcgbGV2ZWwgZ3JlYXRlciB0aGFuIHRoZSByb3V0ZSBsZXZlbCwgaXQgbWVhbnMgdGhpcyB2aWV3IGNvbWVzIFwiYWZ0ZXJcIiB0aGUgcm91dGVcblx0XHRcdC8vIGluIHRlcm1zIG9mIG5hdmlnYXRpb24uXG5cdFx0XHQvLyBJbiBzdWNoIGNhc2UsIHdlIHJlbW92ZSBpdHMgYmluZGluZyBjb250ZXh0LCB0byBhdm9pZCB0aGlzIHZpZXcgdG8gaGF2ZSBkYXRhIGlmIHdlIG5hdmlnYXRlIHRvIGl0IGxhdGVyIG9uXG5cdFx0XHQvLyBUaGlzIGlzIGRvbmUgaW4gYSB0aW1lb3V0IHRvIGFsbG93IGZvciBmb2N1c291dCBldmVudHMgdG8gYmUgcHJvY2Vzc2VkIGJlZm9yZSBwcm9wZXJseSBpbiBjb2xsYWJvcmF0aXZlIGRyYWZ0XG5cdFx0XHRpZiAoKHRoaXMuX29UYXJnZXRJbmZvcm1hdGlvbi52aWV3TGV2ZWwgPz8gMCkgPj0gKHJvdXRlSW5mb3JtYXRpb24/LnJvdXRlTGV2ZWwgPz8gMCkpIHtcblx0XHRcdFx0c2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRcdFx0aWYgKHJvdXRlSW5mb3JtYXRpb24/LnJvdXRlTGV2ZWwgPT09IDAgJiYgdGhpcy5iYXNlLmNvbGxhYm9yYXRpdmVEcmFmdC5pc0Nvbm5lY3RlZCgpKSB7XG5cdFx0XHRcdFx0XHQvLyBUaGUgcm91dGUgaGFzIGxldmVsIDAgLS0+IHdlIG5lZWQgdG8gbGVhdmUgdGhlIGNvbGxhYm9yYXRpb24gc2Vzc2lvbiBhcyBubyBPUCBpcyBkaXNwbGF5ZWRcblx0XHRcdFx0XHRcdHRoaXMuYmFzZS5jb2xsYWJvcmF0aXZlRHJhZnQuZGlzY29ubmVjdCgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHR0aGlzLl9zZXRCaW5kaW5nQ29udGV4dChudWxsKTsgLy8gVGhpcyBhbHNvIGNhbGwgc2V0S2VlcEFsaXZlKGZhbHNlKSBvbiB0aGUgY3VycmVudCBjb250ZXh0XG5cdFx0XHRcdH0sIDApO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0X2J1aWxkQmluZGluZ1BhdGgoXG5cdFx0cm91dGVBcmd1bWVudHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG9iamVjdD4sXG5cdFx0YmluZGluZ1BhdHRlcm46IHN0cmluZyxcblx0XHRuYXZpZ2F0aW9uUGFyYW1ldGVyczogUm91dGluZ05hdmlnYXRpb25JbmZvXG5cdCk6IHsgcGF0aDogc3RyaW5nOyBkZWZlcnJlZDogYm9vbGVhbiB9IHtcblx0XHRsZXQgcGF0aCA9IGJpbmRpbmdQYXR0ZXJuLnJlcGxhY2UoXCI6P3F1ZXJ5OlwiLCBcIlwiKTtcblx0XHRsZXQgZGVmZXJyZWQgPSBmYWxzZTtcblxuXHRcdGZvciAoY29uc3Qgc0tleSBpbiByb3V0ZUFyZ3VtZW50cykge1xuXHRcdFx0Y29uc3Qgc1ZhbHVlID0gcm91dGVBcmd1bWVudHNbc0tleV07XG5cblx0XHRcdGlmICh0eXBlb2Ygc1ZhbHVlICE9PSBcInN0cmluZ1wiKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoc1ZhbHVlID09PSBcIi4uLlwiICYmIGJpbmRpbmdQYXR0ZXJuLmluY2x1ZGVzKGB7JHtzS2V5fX1gKSkge1xuXHRcdFx0XHRkZWZlcnJlZCA9IHRydWU7XG5cdFx0XHRcdC8vIFNvbWV0aW1lcyBpbiBwcmVmZXJyZWRNb2RlID0gY3JlYXRlLCB0aGUgZWRpdCBidXR0b24gaXMgc2hvd24gaW4gYmFja2dyb3VuZCB3aGVuIHRoZVxuXHRcdFx0XHQvLyBhY3Rpb24gcGFyYW1ldGVyIGRpYWxvZyBzaG93cyB1cCwgc2V0dGluZyBiVGFyZ2V0RWRpdGFibGUgcGFzc2VzIGVkaXRhYmxlIGFzIHRydWVcblx0XHRcdFx0Ly8gdG8gb25CZWZvcmVCaW5kaW5nIGluIF9iaW5kVGFyZ2V0UGFnZSBmdW5jdGlvblxuXHRcdFx0XHRuYXZpZ2F0aW9uUGFyYW1ldGVycy5iVGFyZ2V0RWRpdGFibGUgPSB0cnVlO1xuXHRcdFx0fVxuXHRcdFx0cGF0aCA9IHBhdGgucmVwbGFjZShgeyR7c0tleX19YCwgc1ZhbHVlKTtcblx0XHR9XG5cdFx0aWYgKChyb3V0ZUFyZ3VtZW50c1tcIj9xdWVyeVwiXSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KT8uW1wiaS1hY3Rpb25cIl0/LmluY2x1ZGVzKFwiY3JlYXRlXCIpKSB7XG5cdFx0XHRuYXZpZ2F0aW9uUGFyYW1ldGVycy5iQWN0aW9uQ3JlYXRlID0gdHJ1ZTtcblx0XHR9XG5cblx0XHQvLyB0aGUgYmluZGluZyBwYXRoIGlzIGFsd2F5cyBhYnNvbHV0ZVxuXHRcdGlmIChwYXRoICYmIHBhdGhbMF0gIT09IFwiL1wiKSB7XG5cdFx0XHRwYXRoID0gYC8ke3BhdGh9YDtcblx0XHR9XG5cblx0XHRyZXR1cm4geyBwYXRoLCBkZWZlcnJlZCB9O1xuXHR9XG5cblx0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblx0Ly8gTWV0aG9kcyB0byBiaW5kIHRoZSBwYWdlIHdoZW4gYSByb3V0ZSBpcyBtYXRjaGVkXG5cdC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cblx0LyoqXG5cdCAqIENhbGxlZCB3aGVuIGEgcm91dGUgaXMgbWF0Y2hlZC5cblx0ICogQnVpbGRzIHRoZSBiaW5kaW5nIGNvbnRleHQgZnJvbSB0aGUgbmF2aWdhdGlvbiBwYXJhbWV0ZXJzLCBhbmQgYmluZCB0aGUgcGFnZSBhY2NvcmRpbmdseS5cblx0ICpcblx0ICogQHBhcmFtIG9FdmVudFxuXHQgKi9cblx0X29uUm91dGVNYXRjaGVkKFxuXHRcdG9FdmVudDogRXZlbnQ8e1xuXHRcdFx0cm91dGVJbmZvcm1hdGlvbj86IFJvdXRlSW5mb3JtYXRpb247XG5cdFx0XHRyb3V0ZVBhdHRlcm46IHN0cmluZztcblx0XHRcdG5hdmlnYXRpb25JbmZvOiBSb3V0aW5nTmF2aWdhdGlvbkluZm87XG5cdFx0XHRhcmd1bWVudHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG9iamVjdD47XG5cdFx0fT5cblx0KTogdm9pZCB7XG5cdFx0Ly8gQ2hlY2sgaWYgdGhlIHRhcmdldCBmb3IgdGhpcyB2aWV3IGlzIHBhcnQgb2YgdGhlIGV2ZW50IHRhcmdldHMgKGkuZS4gaXMgYSB0YXJnZXQgZm9yIHRoZSBjdXJyZW50IHJvdXRlKS5cblx0XHQvLyBJZiBub3QsIHdlIGRvbid0IG5lZWQgdG8gYmluZCBpdCAtLT4gcmV0dXJuXG5cdFx0aWYgKCF0aGlzLl9pc1ZpZXdQYXJ0T2ZSb3V0ZShvRXZlbnQuZ2V0UGFyYW1ldGVyKFwicm91dGVJbmZvcm1hdGlvblwiKSkpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBSZXRyaWV2ZSB0aGUgYmluZGluZyBjb250ZXh0IHBhdHRlcm5cblx0XHRsZXQgYmluZGluZ1BhdHRlcm47XG5cdFx0aWYgKHRoaXMuX29QYWdlQ29tcG9uZW50ICYmIHRoaXMuX29QYWdlQ29tcG9uZW50LmdldEJpbmRpbmdDb250ZXh0UGF0dGVybikge1xuXHRcdFx0YmluZGluZ1BhdHRlcm4gPSB0aGlzLl9vUGFnZUNvbXBvbmVudC5nZXRCaW5kaW5nQ29udGV4dFBhdHRlcm4oKTtcblx0XHR9XG5cdFx0YmluZGluZ1BhdHRlcm4gPSBiaW5kaW5nUGF0dGVybiB8fCB0aGlzLl9vVGFyZ2V0SW5mb3JtYXRpb24uY29udGV4dFBhdHRlcm47XG5cblx0XHRpZiAoYmluZGluZ1BhdHRlcm4gPT09IG51bGwgfHwgYmluZGluZ1BhdHRlcm4gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Ly8gRG9uJ3QgZG8gdGhpcyBpZiB3ZSBhbHJlYWR5IGdvdCBzVGFyZ2V0ID09ICcnLCB3aGljaCBpcyBhIHZhbGlkIHRhcmdldCBwYXR0ZXJuXG5cdFx0XHRiaW5kaW5nUGF0dGVybiA9IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJyb3V0ZVBhdHRlcm5cIik7XG5cdFx0fVxuXG5cdFx0Ly8gUmVwbGFjZSB0aGUgcGFyYW1ldGVycyBieSB0aGVpciB2YWx1ZXMgaW4gdGhlIGJpbmRpbmcgY29udGV4dCBwYXR0ZXJuXG5cdFx0Y29uc3QgbUFyZ3VtZW50cyA9IG9FdmVudC5nZXRQYXJhbWV0ZXJzKCkuYXJndW1lbnRzO1xuXHRcdGNvbnN0IG9OYXZpZ2F0aW9uUGFyYW1ldGVycyA9IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJuYXZpZ2F0aW9uSW5mb1wiKTtcblx0XHRjb25zdCB7IHBhdGgsIGRlZmVycmVkIH0gPSB0aGlzLl9idWlsZEJpbmRpbmdQYXRoKG1Bcmd1bWVudHMsIGJpbmRpbmdQYXR0ZXJuLCBvTmF2aWdhdGlvblBhcmFtZXRlcnMpO1xuXG5cdFx0dGhpcy5vblJvdXRlTWF0Y2hlZCgpO1xuXG5cdFx0bGV0IGJpbmRQcm9taXNlO1xuXHRcdGNvbnN0IG9Nb2RlbCA9IHRoaXMuX29WaWV3LmdldE1vZGVsKCk7XG5cdFx0aWYgKGRlZmVycmVkKSB7XG5cdFx0XHRiaW5kUHJvbWlzZSA9IHRoaXMuX2JpbmREZWZlcnJlZChwYXRoLCBvTmF2aWdhdGlvblBhcmFtZXRlcnMpO1xuXHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRvTmF2aWdhdGlvblBhcmFtZXRlcnMucmVhc29uICE9PSBOYXZpZ2F0aW9uUmVhc29uLkVkaXRGbG93QWN0aW9uICYmXG5cdFx0XHQodGhpcy5fb1JvdXRlclByb3h5LmdldEhhc2goKS5pbmNsdWRlcyhcImktYWN0aW9uPWVkaXRcIikgfHwgKHRoaXMuX29QYWdlQ29tcG9uZW50Py5pc09wZW5JbkVkaXRNb2RlPy4oKSA/PyBmYWxzZSkpXG5cdFx0KSB7XG5cdFx0XHRiaW5kUHJvbWlzZSA9IHRoaXMuX2JpbmRQYWdlRm9yRWRpdChwYXRoLCBvTW9kZWwsIG9OYXZpZ2F0aW9uUGFyYW1ldGVycyk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGJpbmRQcm9taXNlID0gdGhpcy5fYmluZFBhZ2UocGF0aCwgb01vZGVsLCBvTmF2aWdhdGlvblBhcmFtZXRlcnMpO1xuXHRcdH1cblxuXHRcdGJpbmRQcm9taXNlXG5cdFx0XHQuZmluYWxseSgoKSA9PiB7XG5cdFx0XHRcdHRoaXMub25Sb3V0ZU1hdGNoZWRGaW5pc2hlZCgpO1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaCgoZXJyb3IpID0+IHtcblx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3IgZHVyaW5nIHBhZ2UgYmluZGluZyBcIiArIGVycm9yLnRvU3RyaW5nKCkpO1xuXHRcdFx0fSk7XG5cblx0XHR0aGlzLl9vQXBwQ29tcG9uZW50LmdldFJvb3RWaWV3Q29udHJvbGxlcigpLnVwZGF0ZVVJU3RhdGVGb3JWaWV3KHRoaXMuX29WaWV3LCB0aGlzLl9nZXRGQ0xMZXZlbCgpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBEZWZlcnJlZCBiaW5kaW5nIChkdXJpbmcgb2JqZWN0IGNyZWF0aW9uKS5cblx0ICpcblx0ICogQHBhcmFtIHRhcmdldFBhdGggVGhlIHBhdGggdG8gdGhlIGRlZmZlcmVkIGNvbnRleHRcblx0ICogQHBhcmFtIG5hdmlnYXRpb25QYXJhbWV0ZXJzIE5hdmlnYXRpb24gcGFyYW1ldGVyc1xuXHQgKiBAcmV0dXJucyBBIHByb21pc2Vcblx0ICovXG5cdGFzeW5jIF9iaW5kRGVmZXJyZWQodGFyZ2V0UGF0aDogc3RyaW5nLCBuYXZpZ2F0aW9uUGFyYW1ldGVyczogUm91dGluZ05hdmlnYXRpb25JbmZvKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0dGhpcy5iZWZvcmVTZXRCaW5kaW5nQ29udGV4dChudWxsLCB7IGVkaXRhYmxlOiBuYXZpZ2F0aW9uUGFyYW1ldGVycy5iVGFyZ2V0RWRpdGFibGUgfSk7XG5cblx0XHRpZiAoIW5hdmlnYXRpb25QYXJhbWV0ZXJzLmNyZWF0ZU9uTmF2aWdhdGVQYXJhbWV0ZXJzIHx8IG5hdmlnYXRpb25QYXJhbWV0ZXJzLmNyZWF0ZU9uTmF2aWdhdGVQYXJhbWV0ZXJzLm1vZGUgPT09IFwiRGVmZXJyZWRcIikge1xuXHRcdFx0Ly8gZWl0aGVyIHRoZSBjb250ZXh0IHNoYWxsIGJlIGNyZWF0ZWQgaW4gdGhlIHRhcmdldCBwYWdlIChkZWZlcnJlZCBDb250ZXh0KSBvciBpdCBzaGFsbFxuXHRcdFx0Ly8gYmUgY3JlYXRlZCBhc3luYyBidXQgdGhlIHVzZXIgcmVmcmVzaGVkIHRoZSBwYWdlIC8gYm9va21hcmtlZCB0aGlzIFVSTFxuXHRcdFx0Ly8gVE9ETzogY3VycmVudGx5IHRoZSB0YXJnZXQgY29tcG9uZW50IGNyZWF0ZXMgdGhpcyBkb2N1bWVudCBidXQgd2Ugc2hhbGwgbW92ZSB0aGlzIHRvXG5cdFx0XHQvLyBhIGNlbnRyYWwgcGxhY2Vcblx0XHRcdGlmICh0aGlzLl9vUGFnZUNvbXBvbmVudCAmJiB0aGlzLl9vUGFnZUNvbXBvbmVudC5jcmVhdGVEZWZlcnJlZENvbnRleHQpIHtcblx0XHRcdFx0dGhpcy5fb1BhZ2VDb21wb25lbnQuY3JlYXRlRGVmZXJyZWRDb250ZXh0KFxuXHRcdFx0XHRcdHRhcmdldFBhdGgsXG5cdFx0XHRcdFx0bmF2aWdhdGlvblBhcmFtZXRlcnMuY3JlYXRlT25OYXZpZ2F0ZVBhcmFtZXRlcnM/Lmxpc3RCaW5kaW5nLFxuXHRcdFx0XHRcdG5hdmlnYXRpb25QYXJhbWV0ZXJzLmNyZWF0ZU9uTmF2aWdhdGVQYXJhbWV0ZXJzPy5wYXJlbnRDb250ZXh0LFxuXHRcdFx0XHRcdG5hdmlnYXRpb25QYXJhbWV0ZXJzLmNyZWF0ZU9uTmF2aWdhdGVQYXJhbWV0ZXJzPy5kYXRhLFxuXHRcdFx0XHRcdCEhbmF2aWdhdGlvblBhcmFtZXRlcnMuYkFjdGlvbkNyZWF0ZVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGNvbnN0IGN1cnJlbnRCaW5kaW5nQ29udGV4dCA9IHRoaXMuX2dldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0aWYgKGN1cnJlbnRCaW5kaW5nQ29udGV4dD8uaGFzUGVuZGluZ0NoYW5nZXMoKSkge1xuXHRcdFx0Ly8gRm9yIG5vdyByZW1vdmUgdGhlIHBlbmRpbmcgY2hhbmdlcyB0byBhdm9pZCB0aGUgbW9kZWwgcmFpc2VzIGVycm9ycyBhbmQgdGhlIG9iamVjdCBwYWdlIGlzIGF0IGxlYXN0IGJvdW5kXG5cdFx0XHQvLyBJZGVhbGx5IHRoZSB1c2VyIHNob3VsZCBiZSBhc2tlZCBmb3Jcblx0XHRcdGN1cnJlbnRCaW5kaW5nQ29udGV4dC5nZXRCaW5kaW5nKCkucmVzZXRDaGFuZ2VzKCk7XG5cdFx0fVxuXG5cdFx0Ly8gcmVtb3ZlIHRoZSBjb250ZXh0IHRvIGF2b2lkIHNob3dpbmcgb2xkIGRhdGFcblx0XHR0aGlzLl9zZXRCaW5kaW5nQ29udGV4dChudWxsKTtcblxuXHRcdHRoaXMuYWZ0ZXJTZXRCaW5kaW5nQ29udGV4dChudWxsKTtcblxuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBiaW5kaW5nIGNvbnRleHQgZm9yIHRoZSBwYWdlIGZyb20gYSBwYXRoLCBpZiB0aGUgYXBwIGlzIHN0YXJ0ZWQgd2l0aCB0aGUgcHJlZmVycmVkIG1vZGUgZWRpdC5cblx0ICpcblx0ICogSWYgdGhlIGNvbnRleHQgcG9pbnRzIHRvIGFuIGFjdGl2ZSBlbnRpdHksIGl0IGlzIGRpcmVjdGx5IGNvbnZlcnRlZCB0byBkcmFmdCB1c2luZyB0aGUgRWRpdEZsb3cgY29udHJvbGxlciBleHRlbnNpb24uXG5cdCAqXG5cdCAqIEBwYXJhbSB0YXJnZXRQYXRoXG5cdCAqIEBwYXJhbSBtb2RlbFxuXHQgKiBAcGFyYW0gbmF2aWdhdGlvblBhcmFtZXRlcnNcblx0ICogQHJldHVybnMgQSBQcm9taXNlIHJlc29sdmVkIG9uY2UgdGhlIGJpbmRpbmcgaGFzIGJlZW4gc2V0IG9uIHRoZSBwYWdlXG5cdCAqL1xuXHRhc3luYyBfYmluZFBhZ2VGb3JFZGl0KHRhcmdldFBhdGg6IHN0cmluZywgbW9kZWw6IE9EYXRhTW9kZWwsIG5hdmlnYXRpb25QYXJhbWV0ZXJzOiBSb3V0aW5nTmF2aWdhdGlvbkluZm8pOiBQcm9taXNlPHZvaWQgfCBDb250ZXh0PiB7XG5cdFx0aWYgKHRhcmdldFBhdGggPT09IFwiXCIpIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5fYmluZFBhZ2VUb0NvbnRleHQobnVsbCwgbW9kZWwsIG5hdmlnYXRpb25QYXJhbWV0ZXJzKSk7XG5cdFx0fVxuXG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IHRlY2huaWNhbFBhdGg6IHN0cmluZyA9IGF3YWl0IHJlc29sdmVQYXRoKHRhcmdldFBhdGgsIG1vZGVsLCB0aGlzLl9vUm91dGluZ1NlcnZpY2UsIHRoaXMuX29Sb3V0ZXIpO1xuXHRcdFx0Y29uc3QgbWV0YU1vZGVsID0gbW9kZWwuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0XHQvLyBjaGVjayBmb3Igc3RpY2t5ICYgc3RpY2t5IGVkaXQgc2Vzc2lvblxuXHRcdFx0Y29uc3QgaXNTdGlja3lFZGl0TW9kZSA9IENvbW1vblV0aWxzLmlzU3RpY2t5RWRpdE1vZGUodGhpcy5iYXNlLmdldFZpZXcoKSk7XG5cdFx0XHRjb25zdCBpc1N0aWNreSA9IE1vZGVsSGVscGVyLmlzU3RpY2t5U2Vzc2lvblN1cHBvcnRlZChtZXRhTW9kZWwpO1xuXHRcdFx0aWYgKHRlY2huaWNhbFBhdGguaW5jbHVkZXMoXCJJc0FjdGl2ZUVudGl0eT10cnVlXCIpIHx8IChpc1N0aWNreSAmJiAhaXNTdGlja3lFZGl0TW9kZSkpIHtcblx0XHRcdFx0Ly8gY3JlYXRlIGNvbnRleHRcblx0XHRcdFx0Y29uc3QgYWN0aXZlQ29udGV4dCA9IHRoaXMuX2NyZWF0ZUNvbnRleHQodGVjaG5pY2FsUGF0aCwgbW9kZWwpO1xuXHRcdFx0XHR0aGlzLl9iaW5kUGFnZVRvQ29udGV4dChhY3RpdmVDb250ZXh0LCBtb2RlbCwgbmF2aWdhdGlvblBhcmFtZXRlcnMpO1xuXHRcdFx0XHRpZiAoaXNTdGlja3kpIHtcblx0XHRcdFx0XHQvLyBLZXkgbmVlZHMgdG8gYmUgYXZhaWxhYmxlIGZvciB0aGUgZWRpdGluZyB0byB3b3JrIGluIHRoZSBzdGlja3kgdXNlIGNhc2Vcblx0XHRcdFx0XHRjb25zdCBtZXRhUGF0aCA9IG1ldGFNb2RlbC5nZXRNZXRhUGF0aCh0ZWNobmljYWxQYXRoKTtcblx0XHRcdFx0XHRjb25zdCBrZXlQcm9wZXJ0eSA9IG1ldGFNb2RlbC5nZXRPYmplY3QoYCR7bWV0YVBhdGh9LyRUeXBlLyRLZXlgKTtcblx0XHRcdFx0XHRhd2FpdCBhY3RpdmVDb250ZXh0LnJlcXVlc3RQcm9wZXJ0eShrZXlQcm9wZXJ0eSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gSXNBY3RpdmVFbnRpdHkgbmVlZHMgdG8gYmUgYXZhaWxhYmxlIGZvciB0aGUgZWRpdGluZyB0byB3b3JrIGluIHRoZSBkcmFmdCB1c2UgY2FzZVxuXHRcdFx0XHRcdGF3YWl0IGFjdGl2ZUNvbnRleHQucmVxdWVzdFByb3BlcnR5KFwiSXNBY3RpdmVFbnRpdHlcIik7XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly8gZWRpdCBkb2N1bWVudFxuXHRcdFx0XHRyZXR1cm4gYXdhaXQgdGhpcy5iYXNlLmVkaXRGbG93LmVkaXREb2N1bWVudChhY3RpdmVDb250ZXh0KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLl9iaW5kUGFnZVRvUGF0aCh0ZWNobmljYWxQYXRoLCBtb2RlbCwgbmF2aWdhdGlvblBhcmFtZXRlcnMpO1xuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRjb25zdCByZXNvdXJjZUJ1bmRsZSA9IExpYnJhcnkuZ2V0UmVzb3VyY2VCdW5kbGVGb3IoXCJzYXAuZmUuY29yZVwiKSE7XG5cblx0XHRcdHRoaXMubmF2aWdhdGVUb01lc3NhZ2VQYWdlKHJlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0NPTU1PTl9TQVBGRV9EQVRBX1JFQ0VJVkVEX0VSUk9SXCIpLCB7XG5cdFx0XHRcdHRpdGxlOiByZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19DT01NT05fU0FQRkVfRVJST1JcIiksXG5cdFx0XHRcdGRlc2NyaXB0aW9uOiAoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2Vcblx0XHRcdH0pO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBiaW5kaW5nIGNvbnRleHQgb2YgdGhlIHBhZ2UgZnJvbSBhIHBhdGguXG5cdCAqXG5cdCAqIEBwYXJhbSB0YXJnZXRQYXRoIFRoZSBwYXRoIHRvIHRoZSBjb250ZXh0XG5cdCAqIEBwYXJhbSBtb2RlbCBUaGUgT0RhdGEgbW9kZWxcblx0ICogQHBhcmFtIG5hdmlnYXRpb25QYXJhbWV0ZXJzIE5hdmlnYXRpb24gcGFyYW1ldGVyc1xuXHQgKiBAcmV0dXJucyBBIFByb21pc2UgcmVzb2x2ZWQgb25jZSB0aGUgYmluZGluZyBvbiB0aGUgcGFnZSBpcyBzZXRcblx0ICovXG5cdGFzeW5jIF9iaW5kUGFnZSh0YXJnZXRQYXRoOiBzdHJpbmcsIG1vZGVsOiBPRGF0YU1vZGVsLCBuYXZpZ2F0aW9uUGFyYW1ldGVyczogUm91dGluZ05hdmlnYXRpb25JbmZvKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0aWYgKHRhcmdldFBhdGggPT09IFwiXCIpIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5fYmluZFBhZ2VUb0NvbnRleHQobnVsbCwgbW9kZWwsIG5hdmlnYXRpb25QYXJhbWV0ZXJzKSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc29sdmVQYXRoKHRhcmdldFBhdGgsIG1vZGVsLCB0aGlzLl9vUm91dGluZ1NlcnZpY2UsIHRoaXMuX29Sb3V0ZXIpXG5cdFx0XHQudGhlbigodGVjaG5pY2FsUGF0aDogc3RyaW5nKTogdm9pZCA9PiB7XG5cdFx0XHRcdHJldHVybiB0aGlzLl9iaW5kUGFnZVRvUGF0aCh0ZWNobmljYWxQYXRoLCBtb2RlbCwgbmF2aWdhdGlvblBhcmFtZXRlcnMpO1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaCgoZXJyb3I6IHVua25vd24pID0+IHtcblx0XHRcdFx0Ly8gRXJyb3IgaGFuZGxpbmcgZm9yIGVycm9uZW91cyBtZXRhZGF0YSByZXF1ZXN0XG5cdFx0XHRcdGNvbnN0IHJlc291cmNlQnVuZGxlID0gTGlicmFyeS5nZXRSZXNvdXJjZUJ1bmRsZUZvcihcInNhcC5mZS5jb3JlXCIpITtcblxuXHRcdFx0XHR0aGlzLm5hdmlnYXRlVG9NZXNzYWdlUGFnZShyZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19DT01NT05fU0FQRkVfREFUQV9SRUNFSVZFRF9FUlJPUlwiKSwge1xuXHRcdFx0XHRcdHRpdGxlOiByZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19DT01NT05fU0FQRkVfRVJST1JcIiksXG5cdFx0XHRcdFx0ZGVzY3JpcHRpb246IChlcnJvciBhcyBFcnJvcikubWVzc2FnZVxuXHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgdGhlIGJpbmRpbmcgY29udGV4dCBmb3IgdGhlIHBhZ2UgZnJvbSBhIHBhdGguXG5cdCAqXG5cdCAqIEBwYXJhbSBzVGFyZ2V0UGF0aCBUaGUgcGF0aCB0byBidWlsZCB0aGUgY29udGV4dCAodGhpcyBpcyBhIHBhdGggaW4gdGhlIG1vZGVsLCBzbyBvbmx5IHRlY2huaWNhbCBrZXlzIGFyZSBhbGxvd2VkKS5cblx0ICogQHBhcmFtIG9Nb2RlbCBUaGUgT0RhdGEgbW9kZWxcblx0ICogQHBhcmFtIG9OYXZpZ2F0aW9uUGFyYW1ldGVycyBOYXZpZ2F0aW9uIHBhcmFtZXRlcnNcblx0ICovXG5cdF9iaW5kUGFnZVRvUGF0aChzVGFyZ2V0UGF0aDogc3RyaW5nLCBvTW9kZWw6IE9EYXRhTW9kZWwsIG9OYXZpZ2F0aW9uUGFyYW1ldGVyczogUm91dGluZ05hdmlnYXRpb25JbmZvKTogdm9pZCB7XG5cdFx0Y29uc3Qgb0N1cnJlbnRDb250ZXh0ID0gdGhpcy5fZ2V0QmluZGluZ0NvbnRleHQoKSxcblx0XHRcdHNDdXJyZW50UGF0aCA9IG9DdXJyZW50Q29udGV4dCAmJiBvQ3VycmVudENvbnRleHQuZ2V0UGF0aCgpLFxuXHRcdFx0b1VzZUNvbnRleHQgPSBvTmF2aWdhdGlvblBhcmFtZXRlcnMudXNlQ29udGV4dCBhcyBDb250ZXh0IHwgdW5kZWZpbmVkIHwgbnVsbDtcblxuXHRcdGNvbnN0IG9Sb290Vmlld0NvbnRyb2xsZXIgPSB0aGlzLl9vQXBwQ29tcG9uZW50LmdldFJvb3RWaWV3Q29udHJvbGxlcigpO1xuXG5cdFx0Ly8gV2Ugc2V0IHRoZSBiaW5kaW5nIGNvbnRleHQgb25seSBpZiBpdCdzIGRpZmZlcmVudCBmcm9tIHRoZSBjdXJyZW50IG9uZVxuXHRcdC8vIG9yIGlmIHdlIGhhdmUgYSBjb250ZXh0IGFscmVhZHkgc2VsZWN0ZWRcblx0XHRpZiAob1VzZUNvbnRleHQgJiYgb1VzZUNvbnRleHQuZ2V0UGF0aCgpID09PSBzVGFyZ2V0UGF0aCkge1xuXHRcdFx0aWYgKG9Vc2VDb250ZXh0ICE9PSBvQ3VycmVudENvbnRleHQpIHtcblx0XHRcdFx0bGV0IHNob3VsZFJlZnJlc2hDb250ZXh0ID0gZmFsc2U7XG5cdFx0XHRcdC8vIFdlIGFscmVhZHkgaGF2ZSB0aGUgY29udGV4dCB0byBiZSB1c2VkLCBhbmQgaXQncyBub3QgdGhlIGN1cnJlbnQgb25lXG5cblx0XHRcdFx0Ly8gSW4gY2FzZSBvZiBGQ0wsIGlmIHdlJ3JlIHJldXNpbmcgYSBjb250ZXh0IGZyb20gYSB0YWJsZSAodGhyb3VnaCBuYXZpZ2F0aW9uKSwgd2UgcmVmcmVzaCBpdCB0byBhdm9pZCBvdXRkYXRlZCBkYXRhXG5cdFx0XHRcdC8vIFdlIGRvbid0IHdhaXQgZm9yIHRoZSByZWZyZXNoIHRvIGJlIGNvbXBsZXRlZCAocmVxdWVzdFJlZnJlc2gpLCBzbyB0aGF0IHRoZSBjb3JyZXNwb25kaW5nIHF1ZXJ5IGdvZXMgaW50byB0aGUgc2FtZVxuXHRcdFx0XHQvLyBiYXRjaCBhcyB0aGUgb25lcyBmcm9tIGNvbnRyb2xzIGluIHRoZSBwYWdlLlxuXHRcdFx0XHRpZiAob1Jvb3RWaWV3Q29udHJvbGxlci5pc0ZjbEVuYWJsZWQoKSAmJiBvTmF2aWdhdGlvblBhcmFtZXRlcnMucmVhc29uID09PSBOYXZpZ2F0aW9uUmVhc29uLlJvd1ByZXNzKSB7XG5cdFx0XHRcdFx0Y29uc3QgbWV0YU1vZGVsID0gb1VzZUNvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKTtcblx0XHRcdFx0XHRpZiAoIW9Vc2VDb250ZXh0LmdldEJpbmRpbmcoKS5oYXNQZW5kaW5nQ2hhbmdlcygpKSB7XG5cdFx0XHRcdFx0XHRzaG91bGRSZWZyZXNoQ29udGV4dCA9IHRydWU7XG5cdFx0XHRcdFx0fSBlbHNlIGlmIChcblx0XHRcdFx0XHRcdHRoaXMuYmFzZS5jb2xsYWJvcmF0aXZlRHJhZnQuaXNDb25uZWN0ZWQoKSB8fFxuXHRcdFx0XHRcdFx0KE1vZGVsSGVscGVyLmlzRHJhZnRTdXBwb3J0ZWQobWV0YU1vZGVsLCBvVXNlQ29udGV4dC5nZXRQYXRoKCkpICYmXG5cdFx0XHRcdFx0XHRcdE1vZGVsSGVscGVyLmlzQ29sbGFib3JhdGlvbkRyYWZ0U3VwcG9ydGVkKG1ldGFNb2RlbCkpXG5cdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHQvLyBJZiB0aGVyZSBhcmUgcGVuZGluZyBjaGFuZ2VzIGJ1dCB3ZSdyZSBpbiBjb2xsYWJvcmF0aW9uIGRyYWZ0LCB3ZSBmb3JjZSB0aGUgcmVmcmVzaCAoZGlzY2FyZGluZyBwZW5kaW5nIGNoYW5nZXMpIGFzIHdlIG5lZWQgdG8gaGF2ZSB0aGUgbGF0ZXN0IHZlcnNpb24uXG5cdFx0XHRcdFx0XHQvLyBXaGVuIG5hdmlnYXRpbmcgZnJvbSBMUiB0byBPUCwgdGhlIHZpZXcgaXMgbm90IGNvbm5lY3RlZCB5ZXQgLS0+IGNoZWNrIGlmIHdlJ3JlIGluIGRyYWZ0IHdpdGggY29sbGFib3JhdGlvbiBmcm9tIHRoZSBtZXRhbW9kZWxcblx0XHRcdFx0XHRcdG9Vc2VDb250ZXh0LmdldEJpbmRpbmcoKS5yZXNldENoYW5nZXMoKTtcblx0XHRcdFx0XHRcdHNob3VsZFJlZnJlc2hDb250ZXh0ID0gdHJ1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhpcy5fYmluZFBhZ2VUb0NvbnRleHQob1VzZUNvbnRleHQsIG9Nb2RlbCwgb05hdmlnYXRpb25QYXJhbWV0ZXJzKTtcblx0XHRcdFx0aWYgKHNob3VsZFJlZnJlc2hDb250ZXh0KSB7XG5cdFx0XHRcdFx0dGhpcy5fb0FwcENvbXBvbmVudFxuXHRcdFx0XHRcdFx0LmdldFNpZGVFZmZlY3RzU2VydmljZSgpXG5cdFx0XHRcdFx0XHQucmVxdWVzdFNpZGVFZmZlY3RzKFtcIipcIl0sIG9Vc2VDb250ZXh0LCBvVXNlQ29udGV4dC5nZXRCaW5kaW5nKCkuZ2V0R3JvdXBJZCgpKVxuXHRcdFx0XHRcdFx0LmNhdGNoKChlcnIpID0+IHtcblx0XHRcdFx0XHRcdFx0TG9nLmVycm9yKGBDYW5ub3QgcmVmcmVzaCBjb250ZXh0OiAke2Vycn1gKTtcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5yZWFzb24gPT09IE5hdmlnYXRpb25SZWFzb24uRWRpdEZsb3dBY3Rpb24pIHtcblx0XHRcdFx0Ly8gV2UgaGF2ZSB0aGUgc2FtZSBjb250ZXh0IGJ1dCBhbiBlZGl0ZmxvdyBhY3Rpb24gaGFwcGVuZWQgKGUuZy4gQ2FuY2VsRG9jdW1lbnQgaW4gc3RpY2t5IG1vZGUpXG5cdFx0XHRcdC8vIC0tPiBXZSBuZWVkIHRvIGNhbGwgb25CZWZvcmUvQWZ0ZXJCaW5kaW5nIHRvIHJlZnJlc2ggdGhlIG9iamVjdCBwYWdlIHByb3Blcmx5XG5cdFx0XHRcdHRoaXMuYmVmb3JlU2V0QmluZGluZ0NvbnRleHQob1VzZUNvbnRleHQsIHtcblx0XHRcdFx0XHRlZGl0YWJsZTogb05hdmlnYXRpb25QYXJhbWV0ZXJzLmJUYXJnZXRFZGl0YWJsZSxcblx0XHRcdFx0XHRsaXN0QmluZGluZzogb1VzZUNvbnRleHQuZ2V0QmluZGluZygpLFxuXHRcdFx0XHRcdGJQZXJzaXN0T1BTY3JvbGw6IG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5iUGVyc2lzdE9QU2Nyb2xsLFxuXHRcdFx0XHRcdHJlYXNvbjogb05hdmlnYXRpb25QYXJhbWV0ZXJzLnJlYXNvbixcblx0XHRcdFx0XHRzaG93UGxhY2Vob2xkZXI6IG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5iU2hvd1BsYWNlaG9sZGVyXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHR0aGlzLmFmdGVyU2V0QmluZGluZ0NvbnRleHQob1VzZUNvbnRleHQsIHsgcmVkaXJlY3RlZFRvTm9uRHJhZnQ6IG9OYXZpZ2F0aW9uUGFyYW1ldGVycz8ucmVkaXJlY3RlZFRvTm9uRHJhZnQgfSk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChzQ3VycmVudFBhdGggIT09IHNUYXJnZXRQYXRoIHx8IG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5yZWFzb24gPT09IE5hdmlnYXRpb25SZWFzb24uRWRpdEZsb3dBY3Rpb24pIHtcblx0XHRcdC8vIFdlIG5lZWQgdG8gY3JlYXRlIGEgbmV3IGNvbnRleHQgZm9yIGl0cyBwYXRoXG5cdFx0XHR0aGlzLl9iaW5kUGFnZVRvQ29udGV4dCh0aGlzLl9jcmVhdGVDb250ZXh0KHNUYXJnZXRQYXRoLCBvTW9kZWwpLCBvTW9kZWwsIG9OYXZpZ2F0aW9uUGFyYW1ldGVycyk7XG5cdFx0fSBlbHNlIGlmIChcblx0XHRcdG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5yZWFzb24gIT09IE5hdmlnYXRpb25SZWFzb24uQXBwU3RhdGVDaGFuZ2VkICYmXG5cdFx0XHRvTmF2aWdhdGlvblBhcmFtZXRlcnMucmVhc29uICE9PSBOYXZpZ2F0aW9uUmVhc29uLlJlc3RvcmVIaXN0b3J5ICYmXG5cdFx0XHRFZGl0U3RhdGUuaXNFZGl0U3RhdGVEaXJ0eSgpICYmXG5cdFx0XHQhb1Jvb3RWaWV3Q29udHJvbGxlci5pc0ZjbEVuYWJsZWQoKSAmJlxuXHRcdFx0b0N1cnJlbnRDb250ZXh0XG5cdFx0KSB7XG5cdFx0XHR0aGlzLl9yZWZyZXNoQmluZGluZ0NvbnRleHQob0N1cnJlbnRDb250ZXh0KTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQmluZHMgdGhlIHBhZ2UgdG8gYSBjb250ZXh0LlxuXHQgKlxuXHQgKiBAcGFyYW0gb0NvbnRleHQgQ29udGV4dCB0byBiZSBib3VuZFxuXHQgKiBAcGFyYW0gb01vZGVsIFRoZSBPRGF0YSBtb2RlbFxuXHQgKiBAcGFyYW0gb05hdmlnYXRpb25QYXJhbWV0ZXJzIE5hdmlnYXRpb24gcGFyYW1ldGVyc1xuXHQgKi9cblx0X2JpbmRQYWdlVG9Db250ZXh0KG9Db250ZXh0OiBDb250ZXh0IHwgbnVsbCwgb01vZGVsOiBPRGF0YU1vZGVsLCBvTmF2aWdhdGlvblBhcmFtZXRlcnM6IFJvdXRpbmdOYXZpZ2F0aW9uSW5mbyk6IHZvaWQge1xuXHRcdGlmICghb0NvbnRleHQpIHtcblx0XHRcdHRoaXMuYmVmb3JlU2V0QmluZGluZ0NvbnRleHQobnVsbCk7XG5cdFx0XHR0aGlzLmFmdGVyU2V0QmluZGluZ0NvbnRleHQobnVsbCk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y29uc3Qgb1BhcmVudExpc3RCaW5kaW5nID0gb0NvbnRleHQuZ2V0QmluZGluZygpO1xuXHRcdGNvbnN0IG9Sb290Vmlld0NvbnRyb2xsZXIgPSB0aGlzLl9vQXBwQ29tcG9uZW50LmdldFJvb3RWaWV3Q29udHJvbGxlcigpO1xuXHRcdGlmIChvUm9vdFZpZXdDb250cm9sbGVyLmlzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRpZiAoIW9QYXJlbnRMaXN0QmluZGluZyB8fCAhb1BhcmVudExpc3RCaW5kaW5nLmlzQShcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nXCIpKSB7XG5cdFx0XHRcdC8vIGlmIHRoZSBwYXJlbnRCaW5kaW5nIGlzIG5vdCBhIGxpc3RCaW5kaW5nLCB3ZSBjcmVhdGUgYSBuZXcgY29udGV4dFxuXHRcdFx0XHRvQ29udGV4dCA9IHRoaXMuX2NyZWF0ZUNvbnRleHQob0NvbnRleHQuZ2V0UGF0aCgpLCBvTW9kZWwpO1xuXHRcdFx0fVxuXG5cdFx0XHR0cnkge1xuXHRcdFx0XHR0aGlzLl9zZXRLZWVwQWxpdmUoXG5cdFx0XHRcdFx0b0NvbnRleHQsXG5cdFx0XHRcdFx0dHJ1ZSxcblx0XHRcdFx0XHQoKSA9PiB7XG5cdFx0XHRcdFx0XHRpZiAob0NvbnRleHQgJiYgIXRoaXMuX29BcHBDb21wb25lbnQuaXNFeGl0aW5nICYmIG9Sb290Vmlld0NvbnRyb2xsZXIuaXNDb250ZXh0VXNlZEluUGFnZXMob0NvbnRleHQpKSB7XG5cdFx0XHRcdFx0XHRcdHRoaXMubmF2aWdhdGVCYWNrRnJvbUNvbnRleHQob0NvbnRleHQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0dHJ1ZSAvLyBMb2FkIG1lc3NhZ2VzLCBvdGhlcndpc2UgdGhleSBkb24ndCBnZXQgcmVmcmVzaGVkIGxhdGVyLCBlLmcuIGZvciBzaWRlIGVmZmVjdHNcblx0XHRcdFx0KTtcblx0XHRcdH0gY2F0Y2ggKG9FcnJvcikge1xuXHRcdFx0XHQvLyBzZXRLZWVwQWxpdmUgdGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiB0aGUgcGFyZW50IGxpc3RiaW5kaW5nIGRvZXNuJ3QgaGF2ZSAkJG93blJlcXVlc3Q9dHJ1ZVxuXHRcdFx0XHQvLyBUaGlzIGNhc2UgZm9yIGN1c3RvbSBmcmFnbWVudHMgaXMgc3VwcG9ydGVkLCBidXQgYW4gZXJyb3IgaXMgbG9nZ2VkIHRvIG1ha2UgdGhlIGxhY2sgb2Ygc3luY2hyb25pemF0aW9uIGFwcGFyZW50XG5cdFx0XHRcdExvZy5lcnJvcihcblx0XHRcdFx0XHRgVmlldyBmb3IgJHtvQ29udGV4dC5nZXRQYXRoKCl9IHdvbid0IGJlIHN5bmNocm9uaXplZC4gUGFyZW50IGxpc3RCaW5kaW5nIG11c3QgaGF2ZSBiaW5kaW5nIHBhcmFtZXRlciAkJG93blJlcXVlc3Q9dHJ1ZWBcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKCFvUGFyZW50TGlzdEJpbmRpbmcgfHwgb1BhcmVudExpc3RCaW5kaW5nLmlzQShcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nXCIpKSB7XG5cdFx0XHQvLyBXZSBuZWVkIHRvIHJlY3JlYXRlIHRoZSBjb250ZXh0IG90aGVyd2lzZSB3ZSBnZXQgZXJyb3JzXG5cdFx0XHRvQ29udGV4dCA9IHRoaXMuX2NyZWF0ZUNvbnRleHQob0NvbnRleHQuZ2V0UGF0aCgpLCBvTW9kZWwpO1xuXHRcdH1cblxuXHRcdC8vIFNldCB0aGUgYmluZGluZyBjb250ZXh0IHdpdGggdGhlIHByb3BlciBiZWZvcmUvYWZ0ZXIgY2FsbGJhY2tzXG5cdFx0dGhpcy5iZWZvcmVTZXRCaW5kaW5nQ29udGV4dChvQ29udGV4dCwge1xuXHRcdFx0ZWRpdGFibGU6IG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5iVGFyZ2V0RWRpdGFibGUsXG5cdFx0XHRsaXN0QmluZGluZzogb1BhcmVudExpc3RCaW5kaW5nLFxuXHRcdFx0YlBlcnNpc3RPUFNjcm9sbDogb05hdmlnYXRpb25QYXJhbWV0ZXJzLmJQZXJzaXN0T1BTY3JvbGwsXG5cdFx0XHRyZWFzb246IG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5yZWFzb24sXG5cdFx0XHRzaG93UGxhY2Vob2xkZXI6IG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5iU2hvd1BsYWNlaG9sZGVyXG5cdFx0fSk7XG5cblx0XHR0aGlzLl9zZXRCaW5kaW5nQ29udGV4dChvQ29udGV4dCk7XG5cdFx0dGhpcy5hZnRlclNldEJpbmRpbmdDb250ZXh0KG9Db250ZXh0LCB7IHJlZGlyZWN0ZWRUb05vbkRyYWZ0OiBvTmF2aWdhdGlvblBhcmFtZXRlcnM/LnJlZGlyZWN0ZWRUb05vbkRyYWZ0IH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBjb250ZXh0IGZyb20gYSBwYXRoLlxuXHQgKlxuXHQgKiBAcGFyYW0gc1BhdGggVGhlIHBhdGhcblx0ICogQHBhcmFtIG9Nb2RlbCBUaGUgT0RhdGEgbW9kZWxcblx0ICogQHJldHVybnMgVGhlIGNyZWF0ZWQgY29udGV4dFxuXHQgKi9cblx0X2NyZWF0ZUNvbnRleHQoc1BhdGg6IHN0cmluZywgb01vZGVsOiBPRGF0YU1vZGVsKTogQ29udGV4dCB7XG5cdFx0Y29uc3Qgb1BhZ2VDb21wb25lbnQgPSB0aGlzLl9vUGFnZUNvbXBvbmVudCxcblx0XHRcdHNFbnRpdHlTZXQgPSBvUGFnZUNvbXBvbmVudCAmJiBvUGFnZUNvbXBvbmVudC5nZXRFbnRpdHlTZXQgJiYgb1BhZ2VDb21wb25lbnQuZ2V0RW50aXR5U2V0KCksXG5cdFx0XHRzQ29udGV4dFBhdGggPVxuXHRcdFx0XHQob1BhZ2VDb21wb25lbnQgJiYgb1BhZ2VDb21wb25lbnQuZ2V0Q29udGV4dFBhdGggJiYgb1BhZ2VDb21wb25lbnQuZ2V0Q29udGV4dFBhdGgoKSkgfHwgKHNFbnRpdHlTZXQgJiYgYC8ke3NFbnRpdHlTZXR9YCksXG5cdFx0XHRvTWV0YU1vZGVsID0gb01vZGVsLmdldE1ldGFNb2RlbCgpLFxuXHRcdFx0bVBhcmFtZXRlcnM6IEJpbmRDb250ZXh0UGFyYW1ldGVycyA9IHtcblx0XHRcdFx0JCRncm91cElkOiBcIiRhdXRvLkhlcm9lc1wiLFxuXHRcdFx0XHQkJHVwZGF0ZUdyb3VwSWQ6IFwiJGF1dG9cIixcblx0XHRcdFx0JCRwYXRjaFdpdGhvdXRTaWRlRWZmZWN0czogdHJ1ZVxuXHRcdFx0fTtcblx0XHQvLyBJbiBjYXNlIG9mIGRyYWZ0OiAkc2VsZWN0IHRoZSBzdGF0ZSBmbGFncyAoSGFzQWN0aXZlRW50aXR5LCBIYXNEcmFmdEVudGl0eSwgYW5kIElzQWN0aXZlRW50aXR5KVxuXHRcdGNvbnN0IG9EcmFmdFJvb3QgPSBvTWV0YU1vZGVsLmdldE9iamVjdChgJHtzQ29udGV4dFBhdGh9QGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EcmFmdFJvb3RgKTtcblx0XHRjb25zdCBvRHJhZnROb2RlID0gb01ldGFNb2RlbC5nZXRPYmplY3QoYCR7c0NvbnRleHRQYXRofUBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnROb2RlYCk7XG5cdFx0Y29uc3Qgb1Jvb3RWaWV3Q29udHJvbGxlciA9IHRoaXMuX29BcHBDb21wb25lbnQuZ2V0Um9vdFZpZXdDb250cm9sbGVyKCk7XG5cdFx0aWYgKG9Sb290Vmlld0NvbnRyb2xsZXIuaXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdGNvbnN0IG9Db250ZXh0ID0gdGhpcy5fZ2V0S2VlcEFsaXZlQ29udGV4dChvTW9kZWwsIHNQYXRoLCBmYWxzZSwgbVBhcmFtZXRlcnMpO1xuXHRcdFx0aWYgKCFvQ29udGV4dCkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBjcmVhdGUga2VlcEFsaXZlIGNvbnRleHQgJHtzUGF0aH1gKTtcblx0XHRcdH0gZWxzZSBpZiAob0RyYWZ0Um9vdCB8fCBvRHJhZnROb2RlKSB7XG5cdFx0XHRcdGlmIChvQ29udGV4dC5nZXRQcm9wZXJ0eShcIklzQWN0aXZlRW50aXR5XCIpID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRvQ29udGV4dC5yZXF1ZXN0UHJvcGVydHkoW1wiSGFzQWN0aXZlRW50aXR5XCIsIFwiSGFzRHJhZnRFbnRpdHlcIiwgXCJJc0FjdGl2ZUVudGl0eVwiXSk7XG5cdFx0XHRcdFx0aWYgKG9EcmFmdFJvb3QpIHtcblx0XHRcdFx0XHRcdG9Db250ZXh0LnJlcXVlc3RPYmplY3QoXCJEcmFmdEFkbWluaXN0cmF0aXZlRGF0YVwiKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gd2hlbiBzd2l0Y2hpbmcgYmV0d2VlbiBkcmFmdCBhbmQgZWRpdCB3ZSBuZWVkIHRvIGVuc3VyZSB0aG9zZSBwcm9wZXJ0aWVzIGFyZSByZXF1ZXN0ZWQgYWdhaW4gZXZlbiBpZiB0aGV5IGFyZSBpbiB0aGUgYmluZGluZydzIGNhY2hlXG5cdFx0XHRcdFx0Ly8gb3RoZXJ3aXNlIHdoZW4geW91IGVkaXQgYW5kIGdvIHRvIHRoZSBzYXZlZCB2ZXJzaW9uIHlvdSBoYXZlIG5vIHdheSBvZiBzd2l0Y2hpbmcgYmFjayB0byB0aGUgZWRpdCB2ZXJzaW9uXG5cdFx0XHRcdFx0b0NvbnRleHQucmVxdWVzdFNpZGVFZmZlY3RzKFxuXHRcdFx0XHRcdFx0b0RyYWZ0Um9vdFxuXHRcdFx0XHRcdFx0XHQ/IFtcIkhhc0FjdGl2ZUVudGl0eVwiLCBcIkhhc0RyYWZ0RW50aXR5XCIsIFwiSXNBY3RpdmVFbnRpdHlcIiwgXCJEcmFmdEFkbWluaXN0cmF0aXZlRGF0YVwiXVxuXHRcdFx0XHRcdFx0XHQ6IFtcIkhhc0FjdGl2ZUVudGl0eVwiLCBcIkhhc0RyYWZ0RW50aXR5XCIsIFwiSXNBY3RpdmVFbnRpdHlcIl1cblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBvQ29udGV4dDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0aWYgKHNDb250ZXh0UGF0aCkge1xuXHRcdFx0XHRjb25zdCBzTWVzc2FnZXNQYXRoID0gTW9kZWxIZWxwZXIuZ2V0TWVzc2FnZXNQYXRoKG9NZXRhTW9kZWwsIHNDb250ZXh0UGF0aCk7XG5cdFx0XHRcdGlmIChzTWVzc2FnZXNQYXRoKSB7XG5cdFx0XHRcdFx0bVBhcmFtZXRlcnMuJHNlbGVjdCA9IHNNZXNzYWdlc1BhdGg7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gSW4gY2FzZSBvZiBkcmFmdDogJHNlbGVjdCB0aGUgc3RhdGUgZmxhZ3MgKEhhc0FjdGl2ZUVudGl0eSwgSGFzRHJhZnRFbnRpdHksIGFuZCBJc0FjdGl2ZUVudGl0eSlcblx0XHRcdGlmIChvRHJhZnRSb290IHx8IG9EcmFmdE5vZGUpIHtcblx0XHRcdFx0aWYgKG1QYXJhbWV0ZXJzLiRzZWxlY3QgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdG1QYXJhbWV0ZXJzLiRzZWxlY3QgPSBcIkhhc0FjdGl2ZUVudGl0eSxIYXNEcmFmdEVudGl0eSxJc0FjdGl2ZUVudGl0eVwiO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdG1QYXJhbWV0ZXJzLiRzZWxlY3QgKz0gXCIsSGFzQWN0aXZlRW50aXR5LEhhc0RyYWZ0RW50aXR5LElzQWN0aXZlRW50aXR5XCI7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmICh0aGlzLl9vVmlldy5nZXRCaW5kaW5nQ29udGV4dCgpKSB7XG5cdFx0XHRcdGNvbnN0IG9QcmV2aW91c0JpbmRpbmcgPSB0aGlzLl9vVmlldy5nZXRCaW5kaW5nQ29udGV4dCgpPy5nZXRCaW5kaW5nKCk7XG5cdFx0XHRcdGlmIChvUHJldmlvdXNCaW5kaW5nKSB7XG5cdFx0XHRcdFx0b01vZGVsLnJlc2V0Q2hhbmdlcyhvUHJldmlvdXNCaW5kaW5nLmdldFVwZGF0ZUdyb3VwSWQoKSk7XG5cdFx0XHRcdFx0b1ByZXZpb3VzQmluZGluZy5kZXN0cm95KCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Y29uc3Qgb0hpZGRlbkJpbmRpbmcgPSBvTW9kZWwuYmluZENvbnRleHQoc1BhdGgsIHVuZGVmaW5lZCwgbVBhcmFtZXRlcnMpO1xuXG5cdFx0XHRvSGlkZGVuQmluZGluZy5hdHRhY2hFdmVudE9uY2UoXCJkYXRhUmVxdWVzdGVkXCIsICgpID0+IHtcblx0XHRcdFx0QnVzeUxvY2tlci5sb2NrKHRoaXMuX29WaWV3KTtcblx0XHRcdH0pO1xuXHRcdFx0b0hpZGRlbkJpbmRpbmcuYXR0YWNoRXZlbnRPbmNlKFwiZGF0YVJlY2VpdmVkXCIsIHRoaXMub25EYXRhUmVjZWl2ZWQuYmluZCh0aGlzKSk7XG5cdFx0XHRyZXR1cm4gb0hpZGRlbkJpbmRpbmcuZ2V0Qm91bmRDb250ZXh0KCk7XG5cdFx0fVxuXHR9XG5cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdGFzeW5jIG9uRGF0YVJlY2VpdmVkKG9FdmVudDogRXZlbnQ8eyBlcnJvcjogeyBzdGF0dXM6IG51bWJlciB9IH0+KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3Qgc0Vycm9yRGVzY3JpcHRpb24gPSBvRXZlbnQgJiYgb0V2ZW50LmdldFBhcmFtZXRlcihcImVycm9yXCIpO1xuXHRcdGlmIChCdXN5TG9ja2VyLmlzTG9ja2VkKHRoaXMuX29WaWV3KSkge1xuXHRcdFx0QnVzeUxvY2tlci51bmxvY2sodGhpcy5fb1ZpZXcpO1xuXHRcdH1cblxuXHRcdGlmIChzRXJyb3JEZXNjcmlwdGlvbikge1xuXHRcdFx0Ly8gVE9ETzogaW4gY2FzZSBvZiA0MDQgdGhlIHRleHQgc2hhbGwgYmUgZGlmZmVyZW50XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRjb25zdCBvUmVzb3VyY2VCdW5kbGUgPSBMaWJyYXJ5LmdldFJlc291cmNlQnVuZGxlRm9yKFwic2FwLmZlLmNvcmVcIikhO1xuXHRcdFx0XHRjb25zdCBtZXNzYWdlSGFuZGxlciA9IHRoaXMuYmFzZS5tZXNzYWdlSGFuZGxlcjtcblx0XHRcdFx0bGV0IG1QYXJhbXMgPSB7fTtcblx0XHRcdFx0aWYgKHNFcnJvckRlc2NyaXB0aW9uLnN0YXR1cyA9PT0gNTAzKSB7XG5cdFx0XHRcdFx0bVBhcmFtcyA9IHtcblx0XHRcdFx0XHRcdGlzSW5pdGlhbExvYWQ1MDNFcnJvcjogdHJ1ZSxcblx0XHRcdFx0XHRcdHNoZWxsQmFjazogdHJ1ZVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH0gZWxzZSBpZiAoc0Vycm9yRGVzY3JpcHRpb24uc3RhdHVzID09PSA0MDApIHtcblx0XHRcdFx0XHRtUGFyYW1zID0ge1xuXHRcdFx0XHRcdFx0dGl0bGU6IG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19DT01NT05fU0FQRkVfRVJST1JcIiksXG5cdFx0XHRcdFx0XHRkZXNjcmlwdGlvbjogb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0NPTU1PTl9TQVBGRV9EQVRBX1JFQ0VJVkVEX0VSUk9SX0RFU0NSSVBUSU9OXCIpLFxuXHRcdFx0XHRcdFx0aXNEYXRhUmVjZWl2ZWRFcnJvcjogdHJ1ZSxcblx0XHRcdFx0XHRcdHNoZWxsQmFjazogdHJ1ZVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0bVBhcmFtcyA9IHtcblx0XHRcdFx0XHRcdHRpdGxlOiBvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfQ09NTU9OX1NBUEZFX0VSUk9SXCIpLFxuXHRcdFx0XHRcdFx0ZGVzY3JpcHRpb246IHNFcnJvckRlc2NyaXB0aW9uLFxuXHRcdFx0XHRcdFx0aXNEYXRhUmVjZWl2ZWRFcnJvcjogdHJ1ZSxcblx0XHRcdFx0XHRcdHNoZWxsQmFjazogdHJ1ZVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH1cblx0XHRcdFx0YXdhaXQgbWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VzKG1QYXJhbXMpO1xuXHRcdFx0fSBjYXRjaCAob0Vycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGdldHRpbmcgdGhlIGNvcmUgcmVzb3VyY2UgYnVuZGxlXCIsIG9FcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBSZXF1ZXN0cyBzaWRlIGVmZmVjdHMgb24gYSBiaW5kaW5nIGNvbnRleHQgdG8gXCJyZWZyZXNoXCIgaXQuXG5cdCAqIFRPRE86IGdldCByaWQgb2YgdGhpcyBvbmNlIHByb3ZpZGVkIGJ5IHRoZSBtb2RlbFxuXHQgKiBhIHJlZnJlc2ggb24gdGhlIGJpbmRpbmcgY29udGV4dCBkb2VzIG5vdCB3b3JrIGluIGNhc2UgYSBjcmVhdGlvbiByb3cgd2l0aCBhIHRyYW5zaWVudCBjb250ZXh0IGlzXG5cdCAqIHVzZWQuIGFsc28gYSByZXF1ZXN0U2lkZUVmZmVjdHMgd2l0aCBhbiBlbXB0eSBwYXRoIHdvdWxkIGZhaWwgZHVlIHRvIHRoZSB0cmFuc2llbnQgY29udGV4dFxuXHQgKiB0aGVyZWZvcmUgd2UgZ2V0IGFsbCBkZXBlbmRlbnQgYmluZGluZ3MgKHZpYSBwcml2YXRlIG1vZGVsIG1ldGhvZCkgdG8gZGV0ZXJtaW5lIGFsbCBwYXRocyBhbmQgdGhlblxuXHQgKiByZXF1ZXN0IHRoZW0uXG5cdCAqXG5cdCAqIEBwYXJhbSBvQmluZGluZ0NvbnRleHQgQ29udGV4dCB0byBiZSByZWZyZXNoZWRcblx0ICovXG5cdF9yZWZyZXNoQmluZGluZ0NvbnRleHQob0JpbmRpbmdDb250ZXh0OiBDb250ZXh0KTogdm9pZCB7XG5cdFx0Y29uc3Qgb1BhZ2VDb21wb25lbnQgPSB0aGlzLl9vUGFnZUNvbXBvbmVudDtcblx0XHRjb25zdCBvU2lkZUVmZmVjdHNTZXJ2aWNlID0gdGhpcy5fb0FwcENvbXBvbmVudC5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKTtcblx0XHRjb25zdCBzUm9vdENvbnRleHRQYXRoID0gb0JpbmRpbmdDb250ZXh0LmdldFBhdGgoKTtcblx0XHRjb25zdCBzRW50aXR5U2V0ID0gb1BhZ2VDb21wb25lbnQgJiYgb1BhZ2VDb21wb25lbnQuZ2V0RW50aXR5U2V0ICYmIG9QYWdlQ29tcG9uZW50LmdldEVudGl0eVNldCgpO1xuXHRcdGNvbnN0IHNDb250ZXh0UGF0aCA9XG5cdFx0XHQob1BhZ2VDb21wb25lbnQgJiYgb1BhZ2VDb21wb25lbnQuZ2V0Q29udGV4dFBhdGggJiYgb1BhZ2VDb21wb25lbnQuZ2V0Q29udGV4dFBhdGgoKSkgfHwgKHNFbnRpdHlTZXQgJiYgYC8ke3NFbnRpdHlTZXR9YCk7XG5cdFx0Y29uc3Qgb01ldGFNb2RlbCA9IHRoaXMuX29WaWV3LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0bGV0IHNNZXNzYWdlc1BhdGg7XG5cdFx0Y29uc3QgYU5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuXHRcdGNvbnN0IGFQcm9wZXJ0eVBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuXHRcdGNvbnN0IG9TaWRlRWZmZWN0czogU2lkZUVmZmVjdHNUYXJnZXRUeXBlID0ge1xuXHRcdFx0dGFyZ2V0UHJvcGVydGllczogW10sXG5cdFx0XHR0YXJnZXRFbnRpdGllczogW11cblx0XHR9O1xuXG5cdFx0ZnVuY3Rpb24gZ2V0QmluZGluZ1BhdGhzKG9CaW5kaW5nOiBCaW5kaW5nKTogdm9pZCB7XG5cdFx0XHRsZXQgYURlcGVuZGVudEJpbmRpbmdzO1xuXHRcdFx0Y29uc3Qgc1JlbGF0aXZlUGF0aCA9IChvQmluZGluZy5nZXRDb250ZXh0KCk/LmdldFBhdGgoKSA/PyBcIlwiKS5yZXBsYWNlKHNSb290Q29udGV4dFBhdGgsIFwiXCIpOyAvLyBJZiBubyBjb250ZXh0LCB0aGlzIGlzIGFuIGFic29sdXRlIGJpbmRpbmcgc28gbm8gcmVsYXRpdmUgcGF0aFxuXHRcdFx0Y29uc3Qgc1BhdGggPSAoc1JlbGF0aXZlUGF0aCA/IGAke3NSZWxhdGl2ZVBhdGguc2xpY2UoMSl9L2AgOiBzUmVsYXRpdmVQYXRoKSArIG9CaW5kaW5nLmdldFBhdGgoKTtcblxuXHRcdFx0aWYgKG9CaW5kaW5nLmlzQTxPRGF0YUNvbnRleHRCaW5kaW5nPihcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUNvbnRleHRCaW5kaW5nXCIpKSB7XG5cdFx0XHRcdC8vIGlmIChzUGF0aCA9PT0gXCJcIikge1xuXHRcdFx0XHQvLyBub3cgZ2V0IHRoZSBkZXBlbmRlbnQgYmluZGluZ3Ncblx0XHRcdFx0YURlcGVuZGVudEJpbmRpbmdzID0gb0JpbmRpbmcuZ2V0RGVwZW5kZW50QmluZGluZ3MoKTtcblx0XHRcdFx0aWYgKGFEZXBlbmRlbnRCaW5kaW5ncykge1xuXHRcdFx0XHRcdC8vIGFzayB0aGUgZGVwZW5kZW50IGJpbmRpbmdzIChhbmQgb25seSB0aG9zZSB3aXRoIHRoZSBzcGVjaWZpZWQgZ3JvdXBJZFxuXHRcdFx0XHRcdC8vaWYgKGFEZXBlbmRlbnRCaW5kaW5ncy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0Zm9yIChjb25zdCBpdGVtIG9mIGFEZXBlbmRlbnRCaW5kaW5ncykge1xuXHRcdFx0XHRcdFx0Z2V0QmluZGluZ1BhdGhzKGl0ZW0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIGlmICghYU5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhzLmluY2x1ZGVzKHNQYXRoKSkge1xuXHRcdFx0XHRcdGFOYXZpZ2F0aW9uUHJvcGVydHlQYXRocy5wdXNoKHNQYXRoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmIChvQmluZGluZy5pc0E8T0RhdGFMaXN0QmluZGluZz4oXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ1wiKSkge1xuXHRcdFx0XHRpZiAoIWFOYXZpZ2F0aW9uUHJvcGVydHlQYXRocy5pbmNsdWRlcyhzUGF0aCkpIHtcblx0XHRcdFx0XHRhTmF2aWdhdGlvblByb3BlcnR5UGF0aHMucHVzaChzUGF0aCk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAob0JpbmRpbmcuaXNBPE9EYXRhUHJvcGVydHlCaW5kaW5nPihcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YVByb3BlcnR5QmluZGluZ1wiKSkge1xuXHRcdFx0XHRpZiAoIWFQcm9wZXJ0eVBhdGhzLmluY2x1ZGVzKHNQYXRoKSkge1xuXHRcdFx0XHRcdGFQcm9wZXJ0eVBhdGhzLnB1c2goc1BhdGgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKHNDb250ZXh0UGF0aCkge1xuXHRcdFx0c01lc3NhZ2VzUGF0aCA9IE1vZGVsSGVscGVyLmdldE1lc3NhZ2VzUGF0aChvTWV0YU1vZGVsLCBzQ29udGV4dFBhdGgpO1xuXHRcdH1cblxuXHRcdC8vIGJpbmRpbmcgb2YgdGhlIGNvbnRleHQgbXVzdCBoYXZlICQkUGF0Y2hXaXRob3V0U2lkZUVmZmVjdHMgdHJ1ZSwgdGhpcyBib3VuZCBjb250ZXh0IG1heSBiZSBuZWVkZWQgdG8gYmUgZmV0Y2hlZCBmcm9tIHRoZSBkZXBlbmRlbnQgYmluZGluZ1xuXHRcdGdldEJpbmRpbmdQYXRocyhvQmluZGluZ0NvbnRleHQuZ2V0QmluZGluZygpKTtcblxuXHRcdGxldCBpO1xuXHRcdGZvciAoaSA9IDA7IGkgPCBhTmF2aWdhdGlvblByb3BlcnR5UGF0aHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdG9TaWRlRWZmZWN0cy50YXJnZXRFbnRpdGllcy5wdXNoKHtcblx0XHRcdFx0JE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGg6IGFOYXZpZ2F0aW9uUHJvcGVydHlQYXRoc1tpXVxuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdG9TaWRlRWZmZWN0cy50YXJnZXRQcm9wZXJ0aWVzID0gYVByb3BlcnR5UGF0aHM7XG5cdFx0aWYgKHNNZXNzYWdlc1BhdGgpIHtcblx0XHRcdG9TaWRlRWZmZWN0cy50YXJnZXRQcm9wZXJ0aWVzLnB1c2goc01lc3NhZ2VzUGF0aCk7XG5cdFx0fVxuXHRcdC8vYWxsIHRoaXMgbG9naWMgdG8gYmUgcmVwbGFjZWQgd2l0aCBhIFNpZGVFZmZlY3RzIHJlcXVlc3QgZm9yIGFuIGVtcHR5IHBhdGggKHJlZnJlc2ggZXZlcnl0aGluZyksIGFmdGVyIHRlc3RpbmcgdHJhbnNpZW50IGNvbnRleHRzXG5cdFx0b1NpZGVFZmZlY3RzLnRhcmdldFByb3BlcnRpZXMgPSBvU2lkZUVmZmVjdHMudGFyZ2V0UHJvcGVydGllcy5yZWR1Y2UoKHRhcmdldHM6IHN0cmluZ1tdLCB0YXJnZXRQcm9wZXJ0eSkgPT4ge1xuXHRcdFx0aWYgKHRhcmdldFByb3BlcnR5KSB7XG5cdFx0XHRcdGNvbnN0IGluZGV4ID0gdGFyZ2V0UHJvcGVydHkuaW5kZXhPZihcIi9cIik7XG5cdFx0XHRcdHRhcmdldHMucHVzaChpbmRleCA+IDAgPyB0YXJnZXRQcm9wZXJ0eS5zbGljZSgwLCBpbmRleCkgOiB0YXJnZXRQcm9wZXJ0eSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdGFyZ2V0cztcblx0XHR9LCBbXSk7XG5cdFx0Ly8gT0RhdGEgbW9kZWwgd2lsbCB0YWtlIGNhcmUgb2YgZHVwbGljYXRlc1xuXHRcdG9TaWRlRWZmZWN0c1NlcnZpY2UucmVxdWVzdFNpZGVFZmZlY3RzKFsuLi5vU2lkZUVmZmVjdHMudGFyZ2V0RW50aXRpZXMsIC4uLm9TaWRlRWZmZWN0cy50YXJnZXRQcm9wZXJ0aWVzXSwgb0JpbmRpbmdDb250ZXh0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBiaW5kaW5nIGNvbnRleHQgb2YgdGhlIHBhZ2Ugb3IgdGhlIGNvbXBvbmVudC5cblx0ICpcblx0ICogQHJldHVybnMgVGhlIGJpbmRpbmcgY29udGV4dFxuXHQgKi9cblx0X2dldEJpbmRpbmdDb250ZXh0KCk6IENvbnRleHQgfCBudWxsIHwgdW5kZWZpbmVkIHtcblx0XHRpZiAodGhpcy5fb1BhZ2VDb21wb25lbnQpIHtcblx0XHRcdHJldHVybiB0aGlzLl9vUGFnZUNvbXBvbmVudC5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIENvbnRleHQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiB0aGlzLl9vVmlldy5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBiaW5kaW5nIGNvbnRleHQgb2YgdGhlIHBhZ2Ugb3IgdGhlIGNvbXBvbmVudC5cblx0ICpcblx0ICogQHBhcmFtIG9Db250ZXh0IFRoZSBiaW5kaW5nIGNvbnRleHRcblx0ICovXG5cdF9zZXRCaW5kaW5nQ29udGV4dChvQ29udGV4dDogQ29udGV4dCB8IG51bGwpOiB2b2lkIHtcblx0XHRsZXQgb1ByZXZpb3VzQ29udGV4dCwgb1RhcmdldENvbnRyb2w7XG5cdFx0aWYgKHRoaXMuX29QYWdlQ29tcG9uZW50KSB7XG5cdFx0XHRvUHJldmlvdXNDb250ZXh0ID0gdGhpcy5fb1BhZ2VDb21wb25lbnQuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBDb250ZXh0O1xuXHRcdFx0b1RhcmdldENvbnRyb2wgPSB0aGlzLl9vUGFnZUNvbXBvbmVudDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0b1ByZXZpb3VzQ29udGV4dCA9IHRoaXMuX29WaWV3LmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0XHRvVGFyZ2V0Q29udHJvbCA9IHRoaXMuX29WaWV3O1xuXHRcdH1cblxuXHRcdG9UYXJnZXRDb250cm9sLnNldEJpbmRpbmdDb250ZXh0KG9Db250ZXh0KTtcblxuXHRcdGlmIChvUHJldmlvdXNDb250ZXh0Py5pc0tlZXBBbGl2ZSgpICYmIG9QcmV2aW91c0NvbnRleHQgIT09IG9Db250ZXh0KSB7XG5cdFx0XHR0aGlzLl9zZXRLZWVwQWxpdmUob1ByZXZpb3VzQ29udGV4dCwgZmFsc2UpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBmbGV4aWJsZSBjb2x1bW4gbGF5b3V0IChGQ0wpIGxldmVsIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHZpZXcgKC0xIGlmIHRoZSBhcHAgaXMgbm90IEZDTCkuXG5cdCAqXG5cdCAqIEByZXR1cm5zIFRoZSBsZXZlbFxuXHQgKi9cblx0X2dldEZDTExldmVsKCk6IG51bWJlciB7XG5cdFx0cmV0dXJuIHRoaXMuX29UYXJnZXRJbmZvcm1hdGlvbi5GQ0xMZXZlbDtcblx0fVxuXG5cdF9zZXRLZWVwQWxpdmUoXG5cdFx0b0NvbnRleHQ6IENvbnRleHQsXG5cdFx0YktlZXBBbGl2ZTogYm9vbGVhbixcblx0XHRmbkJlZm9yZURlc3Ryb3k/OiBQYXJhbWV0ZXJzPENvbnRleHRbXCJzZXRLZWVwQWxpdmVcIl0+WzFdLFxuXHRcdGJSZXF1ZXN0TWVzc2FnZXM/OiBib29sZWFuXG5cdCk6IHZvaWQge1xuXHRcdGlmIChvQ29udGV4dC5nZXRQYXRoKCkuZW5kc1dpdGgoXCIpXCIpKSB7XG5cdFx0XHQvLyBXZSBrZWVwIHRoZSBjb250ZXh0IGFsaXZlIG9ubHkgaWYgdGhleSdyZSBwYXJ0IG9mIGEgY29sbGVjdGlvbiwgaS5lLiBpZiB0aGUgcGF0aCBlbmRzIHdpdGggYSAnKSdcblx0XHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdFx0Y29uc3Qgc01ldGFQYXRoID0gb01ldGFNb2RlbC5nZXRNZXRhUGF0aChvQ29udGV4dC5nZXRQYXRoKCkpO1xuXHRcdFx0Y29uc3Qgc01lc3NhZ2VzUGF0aCA9IE1vZGVsSGVscGVyLmdldE1lc3NhZ2VzUGF0aChvTWV0YU1vZGVsLCBzTWV0YVBhdGgpO1xuXHRcdFx0b0NvbnRleHQuc2V0S2VlcEFsaXZlKGJLZWVwQWxpdmUsIGZuQmVmb3JlRGVzdHJveSwgISFzTWVzc2FnZXNQYXRoICYmIGJSZXF1ZXN0TWVzc2FnZXMpO1xuXHRcdH1cblx0fVxuXG5cdF9nZXRLZWVwQWxpdmVDb250ZXh0KFxuXHRcdG9Nb2RlbDogT0RhdGFNb2RlbCxcblx0XHRwYXRoOiBzdHJpbmcsXG5cdFx0YlJlcXVlc3RNZXNzYWdlcz86IGJvb2xlYW4sXG5cdFx0cGFyYW1ldGVycz86IEJpbmRDb250ZXh0UGFyYW1ldGVyc1xuXHQpOiBDb250ZXh0IHwgdW5kZWZpbmVkIHtcblx0XHQvLyBHZXQgdGhlIHBhdGggZm9yIHRoZSBjb250ZXh0IHRoYXQgaXMgcmVhbGx5IGtlcHQgYWxpdmUgKHBhcnQgb2YgYSBjb2xsZWN0aW9uKVxuXHRcdC8vIGkuZS4gcmVtb3ZlIGFsbCBzZWdtZW50cyBub3QgZW5kaW5nIHdpdGggYSAnKSdcblx0XHRjb25zdCBrZXB0QWxpdmVTZWdtZW50cyA9IHBhdGguc3BsaXQoXCIvXCIpO1xuXHRcdGNvbnN0IGFkZGl0aW9ubmFsU2VnbWVudHM6IHN0cmluZ1tdID0gW107XG5cdFx0d2hpbGUgKGtlcHRBbGl2ZVNlZ21lbnRzLmxlbmd0aCAmJiAha2VwdEFsaXZlU2VnbWVudHNba2VwdEFsaXZlU2VnbWVudHMubGVuZ3RoIC0gMV0uZW5kc1dpdGgoXCIpXCIpKSB7XG5cdFx0XHRhZGRpdGlvbm5hbFNlZ21lbnRzLnB1c2goa2VwdEFsaXZlU2VnbWVudHMucG9wKCkhKTtcblx0XHR9XG5cblx0XHRpZiAoa2VwdEFsaXZlU2VnbWVudHMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdGNvbnN0IGtlcHRBbGl2ZVBhdGggPSBrZXB0QWxpdmVTZWdtZW50cy5qb2luKFwiL1wiKTtcblx0XHRjb25zdCBvS2VlcEFsaXZlQ29udGV4dCA9IG9Nb2RlbC5nZXRLZWVwQWxpdmVDb250ZXh0KGtlcHRBbGl2ZVBhdGgsIGJSZXF1ZXN0TWVzc2FnZXMsIHBhcmFtZXRlcnMpO1xuXG5cdFx0aWYgKGFkZGl0aW9ubmFsU2VnbWVudHMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm4gb0tlZXBBbGl2ZUNvbnRleHQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGFkZGl0aW9ubmFsU2VnbWVudHMucmV2ZXJzZSgpO1xuXHRcdFx0Y29uc3QgYWRkaXRpb25uYWxQYXRoID0gYWRkaXRpb25uYWxTZWdtZW50cy5qb2luKFwiL1wiKTtcblx0XHRcdHJldHVybiBvTW9kZWwuYmluZENvbnRleHQoYWRkaXRpb25uYWxQYXRoLCBvS2VlcEFsaXZlQ29udGV4dCkuZ2V0Qm91bmRDb250ZXh0KCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFN3aXRjaGVzIGJldHdlZW4gY29sdW1uIGFuZCBmdWxsLXNjcmVlbiBtb2RlIHdoZW4gRkNMIGlzIHVzZWQuXG5cdCAqXG5cdCAqL1xuXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRzd2l0Y2hGdWxsU2NyZWVuKCk6IHZvaWQge1xuXHRcdGNvbnN0IG9Tb3VyY2UgPSB0aGlzLmJhc2UuZ2V0VmlldygpO1xuXHRcdGNvbnN0IG9GQ0xIZWxwZXJNb2RlbCA9IG9Tb3VyY2UuZ2V0TW9kZWwoXCJmY2xoZWxwZXJcIiksXG5cdFx0XHRiSXNGdWxsU2NyZWVuID0gb0ZDTEhlbHBlck1vZGVsLmdldFByb3BlcnR5KFwiL2FjdGlvbkJ1dHRvbnNJbmZvL2lzRnVsbFNjcmVlblwiKSxcblx0XHRcdHNOZXh0TGF5b3V0ID0gb0ZDTEhlbHBlck1vZGVsLmdldFByb3BlcnR5KFxuXHRcdFx0XHRiSXNGdWxsU2NyZWVuID8gXCIvYWN0aW9uQnV0dG9uc0luZm8vZXhpdEZ1bGxTY3JlZW5cIiA6IFwiL2FjdGlvbkJ1dHRvbnNJbmZvL2Z1bGxTY3JlZW5cIlxuXHRcdFx0KSxcblx0XHRcdG9Sb290Vmlld0NvbnRyb2xsZXIgPSB0aGlzLl9vQXBwQ29tcG9uZW50LmdldFJvb3RWaWV3Q29udHJvbGxlcigpO1xuXG5cdFx0Y29uc3Qgb0NvbnRleHQgPSAob1Jvb3RWaWV3Q29udHJvbGxlciBhcyBGY2xDb250cm9sbGVyKS5nZXRSaWdodG1vc3RDb250ZXh0XG5cdFx0XHQ/IChvUm9vdFZpZXdDb250cm9sbGVyIGFzIEZjbENvbnRyb2xsZXIpLmdldFJpZ2h0bW9zdENvbnRleHQoKSFcblx0XHRcdDogb1NvdXJjZS5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXG5cdFx0dGhpcy5iYXNlLl9yb3V0aW5nLm5hdmlnYXRlVG9Db250ZXh0KG9Db250ZXh0LCB7IGxheW91dDogc05leHRMYXlvdXQgfSkuY2F0Y2goZnVuY3Rpb24gKCkge1xuXHRcdFx0TG9nLndhcm5pbmcoXCJjYW5ub3Qgc3dpdGNoIGJldHdlZW4gY29sdW1uIGFuZCBmdWxsc2NyZWVuXCIpO1xuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIENsb3NlcyB0aGUgY29sdW1uIGZvciB0aGUgY3VycmVudCB2aWV3IGluIGEgRkNMLlxuXHQgKlxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkJlZm9yZSlcblx0Y2xvc2VDb2x1bW4oKTogdm9pZCB7XG5cdFx0Y29uc3Qgb1ZpZXdEYXRhID0gdGhpcy5fb1ZpZXcuZ2V0Vmlld0RhdGEoKTtcblx0XHRjb25zdCBvQ29udGV4dCA9IHRoaXMuX29WaWV3LmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0Y29uc3QgbmF2aWdhdGlvblBhcmFtZXRlcnMgPSB7XG5cdFx0XHRub1ByZXNlcnZhdGlvbkNhY2hlOiB0cnVlLFxuXHRcdFx0c0xheW91dDogdGhpcy5fb1ZpZXcuZ2V0TW9kZWwoXCJmY2xoZWxwZXJcIikuZ2V0UHJvcGVydHkoXCIvYWN0aW9uQnV0dG9uc0luZm8vY2xvc2VDb2x1bW5cIilcblx0XHR9O1xuXG5cdFx0aWYgKG9WaWV3RGF0YT8udmlld0xldmVsID09PSAxICYmIE1vZGVsSGVscGVyLmlzRHJhZnRTdXBwb3J0ZWQob01ldGFNb2RlbCwgb0NvbnRleHQuZ2V0UGF0aCgpKSkge1xuXHRcdFx0ZHJhZnQucHJvY2Vzc0RhdGFMb3NzT3JEcmFmdERpc2NhcmRDb25maXJtYXRpb24oXG5cdFx0XHRcdCgpID0+IHtcblx0XHRcdFx0XHR0aGlzLm5hdmlnYXRlQmFja0Zyb21Db250ZXh0KG9Db250ZXh0LCBuYXZpZ2F0aW9uUGFyYW1ldGVycyk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdEZ1bmN0aW9uLnByb3RvdHlwZSxcblx0XHRcdFx0b0NvbnRleHQsXG5cdFx0XHRcdHRoaXMuX29WaWV3LmdldENvbnRyb2xsZXIoKSxcblx0XHRcdFx0ZmFsc2UsXG5cdFx0XHRcdGRyYWZ0Lk5hdmlnYXRpb25UeXBlLkJhY2tOYXZpZ2F0aW9uXG5cdFx0XHQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLm5hdmlnYXRlQmFja0Zyb21Db250ZXh0KG9Db250ZXh0LCBuYXZpZ2F0aW9uUGFyYW1ldGVycyk7XG5cdFx0fVxuXHR9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEludGVybmFsUm91dGluZztcbiJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQUE7QUFBQTs7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
975
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJJbnRlcm5hbFJvdXRpbmciLCJkZWZpbmVVSTVDbGFzcyIsIm1ldGhvZE92ZXJyaWRlIiwicHVibGljRXh0ZW5zaW9uIiwiZXh0ZW5zaWJsZSIsIk92ZXJyaWRlRXhlY3V0aW9uIiwiQWZ0ZXIiLCJmaW5hbEV4dGVuc2lvbiIsIkJlZm9yZSIsIm9uRXhpdCIsIl9vUm91dGluZ1NlcnZpY2UiLCJkZXRhY2hSb3V0ZU1hdGNoZWQiLCJfZm5Sb3V0ZU1hdGNoZWRCb3VuZCIsIm9uSW5pdCIsIl9vVmlldyIsImJhc2UiLCJnZXRWaWV3IiwiX29BcHBDb21wb25lbnQiLCJDb21tb25VdGlscyIsImdldEFwcENvbXBvbmVudCIsIl9vUGFnZUNvbXBvbmVudCIsIkNvbXBvbmVudCIsImdldE93bmVyQ29tcG9uZW50Rm9yIiwiX29Sb3V0ZXIiLCJnZXRSb3V0ZXIiLCJfb1JvdXRlclByb3h5IiwiZ2V0Um91dGVyUHJveHkiLCJFcnJvciIsImdldFNlcnZpY2UiLCJ0aGVuIiwib1JvdXRpbmdTZXJ2aWNlIiwiX29uUm91dGVNYXRjaGVkIiwiYmluZCIsImF0dGFjaFJvdXRlTWF0Y2hlZCIsIl9vVGFyZ2V0SW5mb3JtYXRpb24iLCJnZXRUYXJnZXRJbmZvcm1hdGlvbkZvciIsImNhdGNoIiwib25Sb3V0ZU1hdGNoZWQiLCJvblJvdXRlTWF0Y2hlZEZpbmlzaGVkIiwib25CZWZvcmVCaW5kaW5nIiwiX2JpbmRpbmdDb250ZXh0IiwiX21QYXJhbWV0ZXJzIiwiYmVmb3JlU2V0QmluZGluZ0NvbnRleHQiLCJiaW5kaW5nQ29udGV4dCIsIm9Sb3V0aW5nIiwiZ2V0Q29udHJvbGxlciIsInJvdXRpbmciLCJvbkFmdGVyQmluZGluZyIsImdldFJvb3RWaWV3Q29udHJvbGxlciIsIm9uQ29udGV4dEJvdW5kVG9WaWV3IiwiYWZ0ZXJTZXRCaW5kaW5nQ29udGV4dCIsIm5hdmlnYXRlVG9UYXJnZXQiLCJvQ29udGV4dCIsInNOYXZpZ2F0aW9uVGFyZ2V0TmFtZSIsImJQcmVzZXJ2ZUhpc3RvcnkiLCJkZWxheWVkVXNhZ2UiLCJvTmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24iLCJnZXROYXZpZ2F0aW9uQ29uZmlndXJhdGlvbiIsIm9EZXRhaWxSb3V0ZSIsImRldGFpbCIsInNSb3V0ZU5hbWUiLCJyb3V0ZSIsIm1QYXJhbWV0ZXJNYXBwaW5nIiwicGFyYW1ldGVycyIsIm5hdmlnYXRlVG8iLCJnZXRIYXNoRm9yTmF2aWdhdGlvbiIsImNvbnRleHQiLCJuYXZpZ2F0aW9uVGFyZ2V0TmFtZSIsIm5hdmlnYXRpb25Db25maWd1cmF0aW9uIiwiZGV0YWlsUm91dGUiLCJyb3V0ZU5hbWUiLCJwYXJhbWV0ZXJNYXBwaW5nIiwiZ2V0SGFzaEZyb21Sb3V0ZSIsIm5hdmlnYXRlVG9Sb3V0ZSIsInNUYXJnZXRSb3V0ZU5hbWUiLCJvUGFyYW1ldGVycyIsIm5hdmlnYXRlVG9Db250ZXh0IiwiaXNBIiwiY3JlYXRlT25OYXZpZ2F0ZVBhcmFtZXRlcnMiLCJtb2RlIiwiYWN0aXZhdGVSb3V0ZU1hdGNoU3luY2hyb25pemF0aW9uIiwiY3JlYXRlQ29udGV4dFByb21pc2UiLCJjcmVhdGVkQ29udGV4dCIsImNoZWNrTm9IYXNoQ2hhbmdlIiwiZWRpdGFibGUiLCJwZXJzaXN0T1BTY3JvbGwiLCJ1cGRhdGVGQ0xMZXZlbCIsImZvcmNlRm9jdXMiLCJvRXJyb3IiLCJMb2ciLCJlcnJvciIsImNhbGxFeHRlbnNpb24iLCJpbnRlcm5hbE1vZGVsIiwiZ2V0TW9kZWwiLCJzZXRQcm9wZXJ0eSIsIm92ZXJyaWRlTmF2Iiwib25CZWZvcmVOYXZpZ2F0aW9uIiwiUHJvbWlzZSIsInJlc29sdmUiLCJGQ0xMZXZlbCIsIl9nZXRGQ0xMZXZlbCIsInJlYXNvbiIsIk5hdmlnYXRpb25SZWFzb24iLCJSb3dQcmVzcyIsIm1vZGVsIiwibWV0YU1vZGVsIiwiZ2V0TWV0YU1vZGVsIiwiaXNQYXRoT25EcmFmdFJvb3QiLCJnZXRQYXRoIiwiY29udGV4dEZvck5hdmlnYXRpb24iLCJnZXRDb250ZXh0Rm9yTmF2aWdhdGlvbldpdGhDb2xsYWJvcmF0aW9uIiwiZ2V0Q29udGV4dEZvck5hdmlnYXRpb25Gcm9tVHJlZVRhYmxlIiwiZ2V0Vmlld0RhdGEiLCJvcmlnaW5hbENvbnRleHQiLCJNb2RlbEhlbHBlciIsImlzQ29sbGFib3JhdGlvbkRyYWZ0U3VwcG9ydGVkIiwiZ2V0UHJvcGVydHkiLCJkcmFmdE9yQWN0aXZlQ29udGV4dCIsImdldERyYWZ0T3JBY3RpdmVDb250ZXh0Iiwib2JqZWN0UGF0aCIsImdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyIsImdldE1ldGFDb250ZXh0IiwicmVkaXJlY3RlZFRvTm9uRHJhZnQiLCJ0YXJnZXRFbnRpdHlUeXBlIiwiYW5ub3RhdGlvbnMiLCJVSSIsIkhlYWRlckluZm8iLCJUeXBlTmFtZSIsIm5hbWUiLCJpc0ZjbEVuYWJsZWQiLCJjb250ZXh0VG9SZXBsYWNlV2l0aCIsImdldEtlZXBBbGl2ZUNvbnRleHQiLCJyZXBsYWNlV2l0aCIsIkVkaXRTdGF0ZSIsInNldEVkaXRTdGF0ZURpcnR5IiwicGFyZW50QmluZGluZyIsImdldEJpbmRpbmciLCJhZ2dyZWdhdGlvbiIsImdldEFnZ3JlZ2F0aW9uIiwiaGllcmFyY2h5UXVhbGlmaWVyIiwibmF2aWdhdGVCYWNrRnJvbUNvbnRleHQiLCJuYXZpZ2F0ZUZvcndhcmRUb0NvbnRleHQiLCJnZXRCaW5kaW5nQ29udGV4dCIsIm5hdmlnYXRlQmFja0Zyb21UcmFuc2llbnRTdGF0ZSIsInNIYXNoIiwiZ2V0SGFzaCIsImluY2x1ZGVzIiwibmF2QmFjayIsIm5hdmlnYXRlVG9NZXNzYWdlUGFnZSIsInNFcnJvck1lc3NhZ2UiLCJtUGFyYW1ldGVycyIsIm5hdlRvSGFzaCIsImdldERlZmF1bHRDcmVhdGVIYXNoIiwiZGlzcGxheUVycm9yUGFnZSIsImlzQ3VycmVudFN0YXRlSW1wYWN0ZWRCeSIsIl9pc1ZpZXdQYXJ0T2ZSb3V0ZSIsInJvdXRlSW5mb3JtYXRpb24iLCJhVGFyZ2V0cyIsInRhcmdldHMiLCJ0YXJnZXROYW1lIiwidmlld0xldmVsIiwicm91dGVMZXZlbCIsInNldFRpbWVvdXQiLCJjb2xsYWJvcmF0aXZlRHJhZnQiLCJpc0Nvbm5lY3RlZCIsImRpc2Nvbm5lY3QiLCJfc2V0QmluZGluZ0NvbnRleHQiLCJfYnVpbGRCaW5kaW5nUGF0aCIsInJvdXRlQXJndW1lbnRzIiwiYmluZGluZ1BhdHRlcm4iLCJuYXZpZ2F0aW9uUGFyYW1ldGVycyIsInBhdGgiLCJyZXBsYWNlIiwiZGVmZXJyZWQiLCJzS2V5Iiwic1ZhbHVlIiwiYlRhcmdldEVkaXRhYmxlIiwiYkFjdGlvbkNyZWF0ZSIsIm9FdmVudCIsImdldFBhcmFtZXRlciIsImdldEJpbmRpbmdDb250ZXh0UGF0dGVybiIsImNvbnRleHRQYXR0ZXJuIiwidW5kZWZpbmVkIiwibUFyZ3VtZW50cyIsImdldFBhcmFtZXRlcnMiLCJhcmd1bWVudHMiLCJvTmF2aWdhdGlvblBhcmFtZXRlcnMiLCJiaW5kUHJvbWlzZSIsIm9Nb2RlbCIsIl9iaW5kRGVmZXJyZWQiLCJFZGl0Rmxvd0FjdGlvbiIsImlzT3BlbkluRWRpdE1vZGUiLCJfYmluZFBhZ2VGb3JFZGl0IiwiX2JpbmRQYWdlIiwiZmluYWxseSIsInRvU3RyaW5nIiwidXBkYXRlVUlTdGF0ZUZvclZpZXciLCJ0YXJnZXRQYXRoIiwiY3JlYXRlRGVmZXJyZWRDb250ZXh0IiwibGlzdEJpbmRpbmciLCJwYXJlbnRDb250ZXh0IiwiZGF0YSIsImN1cnJlbnRCaW5kaW5nQ29udGV4dCIsIl9nZXRCaW5kaW5nQ29udGV4dCIsImhhc1BlbmRpbmdDaGFuZ2VzIiwicmVzZXRDaGFuZ2VzIiwiX2JpbmRQYWdlVG9Db250ZXh0IiwidGVjaG5pY2FsUGF0aCIsInJlc29sdmVQYXRoIiwiaXNTdGlja3lFZGl0TW9kZSIsImlzU3RpY2t5IiwiaXNTdGlja3lTZXNzaW9uU3VwcG9ydGVkIiwiYWN0aXZlQ29udGV4dCIsIl9jcmVhdGVDb250ZXh0IiwibWV0YVBhdGgiLCJnZXRNZXRhUGF0aCIsImtleVByb3BlcnR5IiwiZ2V0T2JqZWN0IiwicmVxdWVzdFByb3BlcnR5IiwiZWRpdEZsb3ciLCJlZGl0RG9jdW1lbnQiLCJfYmluZFBhZ2VUb1BhdGgiLCJyZXNvdXJjZUJ1bmRsZSIsIkxpYnJhcnkiLCJnZXRSZXNvdXJjZUJ1bmRsZUZvciIsImdldFRleHQiLCJ0aXRsZSIsImRlc2NyaXB0aW9uIiwibWVzc2FnZSIsInNUYXJnZXRQYXRoIiwib0N1cnJlbnRDb250ZXh0Iiwic0N1cnJlbnRQYXRoIiwib1VzZUNvbnRleHQiLCJ1c2VDb250ZXh0Iiwib1Jvb3RWaWV3Q29udHJvbGxlciIsInNob3VsZFJlZnJlc2hDb250ZXh0IiwiaXNEcmFmdFN1cHBvcnRlZCIsImdldFNpZGVFZmZlY3RzU2VydmljZSIsInJlcXVlc3RTaWRlRWZmZWN0cyIsImdldEdyb3VwSWQiLCJlcnIiLCJiUGVyc2lzdE9QU2Nyb2xsIiwic2hvd1BsYWNlaG9sZGVyIiwiYlNob3dQbGFjZWhvbGRlciIsIkFwcFN0YXRlQ2hhbmdlZCIsIlJlc3RvcmVIaXN0b3J5IiwiaXNFZGl0U3RhdGVEaXJ0eSIsIl9yZWZyZXNoQmluZGluZ0NvbnRleHQiLCJvUGFyZW50TGlzdEJpbmRpbmciLCJfc2V0S2VlcEFsaXZlIiwiaXNFeGl0aW5nIiwiaXNDb250ZXh0VXNlZEluUGFnZXMiLCJzUGF0aCIsIm9QYWdlQ29tcG9uZW50Iiwic0VudGl0eVNldCIsImdldEVudGl0eVNldCIsInNDb250ZXh0UGF0aCIsImdldENvbnRleHRQYXRoIiwib01ldGFNb2RlbCIsIiQkZ3JvdXBJZCIsIiQkdXBkYXRlR3JvdXBJZCIsIiQkcGF0Y2hXaXRob3V0U2lkZUVmZmVjdHMiLCJvRHJhZnRSb290Iiwib0RyYWZ0Tm9kZSIsIl9nZXRLZWVwQWxpdmVDb250ZXh0IiwicmVxdWVzdE9iamVjdCIsInNNZXNzYWdlc1BhdGgiLCJnZXRNZXNzYWdlc1BhdGgiLCIkc2VsZWN0Iiwib1ByZXZpb3VzQmluZGluZyIsImdldFVwZGF0ZUdyb3VwSWQiLCJkZXN0cm95Iiwib0hpZGRlbkJpbmRpbmciLCJiaW5kQ29udGV4dCIsImF0dGFjaEV2ZW50T25jZSIsIkJ1c3lMb2NrZXIiLCJsb2NrIiwib25EYXRhUmVjZWl2ZWQiLCJnZXRCb3VuZENvbnRleHQiLCJzRXJyb3JEZXNjcmlwdGlvbiIsImlzTG9ja2VkIiwidW5sb2NrIiwib1Jlc291cmNlQnVuZGxlIiwibWVzc2FnZUhhbmRsZXIiLCJtUGFyYW1zIiwic3RhdHVzIiwiaXNJbml0aWFsTG9hZDUwM0Vycm9yIiwic2hlbGxCYWNrIiwiaXNEYXRhUmVjZWl2ZWRFcnJvciIsInNob3dNZXNzYWdlcyIsIm9CaW5kaW5nQ29udGV4dCIsIm9TaWRlRWZmZWN0c1NlcnZpY2UiLCJzUm9vdENvbnRleHRQYXRoIiwiYU5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhzIiwiYVByb3BlcnR5UGF0aHMiLCJvU2lkZUVmZmVjdHMiLCJ0YXJnZXRQcm9wZXJ0aWVzIiwidGFyZ2V0RW50aXRpZXMiLCJnZXRCaW5kaW5nUGF0aHMiLCJvQmluZGluZyIsImFEZXBlbmRlbnRCaW5kaW5ncyIsInNSZWxhdGl2ZVBhdGgiLCJnZXRDb250ZXh0Iiwic2xpY2UiLCJnZXREZXBlbmRlbnRCaW5kaW5ncyIsIml0ZW0iLCJwdXNoIiwiaSIsImxlbmd0aCIsIiROYXZpZ2F0aW9uUHJvcGVydHlQYXRoIiwicmVkdWNlIiwidGFyZ2V0UHJvcGVydHkiLCJpbmRleCIsImluZGV4T2YiLCJvUHJldmlvdXNDb250ZXh0Iiwib1RhcmdldENvbnRyb2wiLCJzZXRCaW5kaW5nQ29udGV4dCIsImlzS2VlcEFsaXZlIiwiYktlZXBBbGl2ZSIsImZuQmVmb3JlRGVzdHJveSIsImJSZXF1ZXN0TWVzc2FnZXMiLCJlbmRzV2l0aCIsInNNZXRhUGF0aCIsInNldEtlZXBBbGl2ZSIsImtlcHRBbGl2ZVNlZ21lbnRzIiwic3BsaXQiLCJhZGRpdGlvbm5hbFNlZ21lbnRzIiwicG9wIiwia2VwdEFsaXZlUGF0aCIsImpvaW4iLCJvS2VlcEFsaXZlQ29udGV4dCIsInJldmVyc2UiLCJhZGRpdGlvbm5hbFBhdGgiLCJzd2l0Y2hGdWxsU2NyZWVuIiwib1NvdXJjZSIsIm9GQ0xIZWxwZXJNb2RlbCIsImJJc0Z1bGxTY3JlZW4iLCJzTmV4dExheW91dCIsImdldFJpZ2h0bW9zdENvbnRleHQiLCJfcm91dGluZyIsImxheW91dCIsIndhcm5pbmciLCJjbG9zZUNvbHVtbiIsIm9WaWV3RGF0YSIsIm5vUHJlc2VydmF0aW9uQ2FjaGUiLCJzTGF5b3V0IiwiZHJhZnQiLCJwcm9jZXNzRGF0YUxvc3NPckRyYWZ0RGlzY2FyZENvbmZpcm1hdGlvbiIsIkZ1bmN0aW9uIiwicHJvdG90eXBlIiwiTmF2aWdhdGlvblR5cGUiLCJCYWNrTmF2aWdhdGlvbiIsIkNvbnRyb2xsZXJFeHRlbnNpb24iXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIkludGVybmFsUm91dGluZy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCB0eXBlIEFwcENvbXBvbmVudCBmcm9tIFwic2FwL2ZlL2NvcmUvQXBwQ29tcG9uZW50XCI7XG5pbXBvcnQgdHlwZSB7IEZFVmlldyB9IGZyb20gXCJzYXAvZmUvY29yZS9CYXNlQ29udHJvbGxlclwiO1xuaW1wb3J0IENvbW1vblV0aWxzIGZyb20gXCJzYXAvZmUvY29yZS9Db21tb25VdGlsc1wiO1xuaW1wb3J0IHR5cGUgUGFnZUNvbnRyb2xsZXIgZnJvbSBcInNhcC9mZS9jb3JlL1BhZ2VDb250cm9sbGVyXCI7XG5pbXBvcnQgdHlwZSBUZW1wbGF0ZUNvbXBvbmVudCBmcm9tIFwic2FwL2ZlL2NvcmUvVGVtcGxhdGVDb21wb25lbnRcIjtcbmltcG9ydCBCdXN5TG9ja2VyIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9CdXN5TG9ja2VyXCI7XG5pbXBvcnQgeyB0eXBlIE5hdmlnYXRpb25Ub0Vycm9yUGFnZVJlc3VsdCB9IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9NZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHR5cGUgeyBCaW5kQ29udGV4dFBhcmFtZXRlcnMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvZWRpdEZsb3cvZHJhZnRcIjtcbmltcG9ydCBkcmFmdCBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvZWRpdEZsb3cvZHJhZnRcIjtcbmltcG9ydCB7IGdldERyYWZ0T3JBY3RpdmVDb250ZXh0LCBpc1BhdGhPbkRyYWZ0Um9vdCwgcmVzb2x2ZVBhdGggfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvcm91dGluZy9Db250ZXh0UGF0aEhlbHBlclwiO1xuaW1wb3J0IE5hdmlnYXRpb25SZWFzb24gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL3JvdXRpbmcvTmF2aWdhdGlvblJlYXNvblwiO1xuaW1wb3J0IHR5cGUgUm91dGVyUHJveHkgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL3JvdXRpbmcvUm91dGVyUHJveHlcIjtcbmltcG9ydCB0eXBlIHsgRW5oYW5jZVdpdGhVSTUgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9DbGFzc1N1cHBvcnRcIjtcbmltcG9ydCB7IGRlZmluZVVJNUNsYXNzLCBleHRlbnNpYmxlLCBmaW5hbEV4dGVuc2lvbiwgbWV0aG9kT3ZlcnJpZGUsIHB1YmxpY0V4dGVuc2lvbiB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0NsYXNzU3VwcG9ydFwiO1xuaW1wb3J0IEVkaXRTdGF0ZSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9FZGl0U3RhdGVcIjtcbmltcG9ydCBNb2RlbEhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0IHR5cGUgRmNsQ29udHJvbGxlciBmcm9tIFwic2FwL2ZlL2NvcmUvcm9vdFZpZXcvRmNsLmNvbnRyb2xsZXJcIjtcbmltcG9ydCB0eXBlIHsgUm91dGluZ05hdmlnYXRpb25JbmZvLCBSb3V0aW5nTmF2aWdhdGlvblBhcmFtZXRlcnMsIFJvdXRpbmdTZXJ2aWNlIH0gZnJvbSBcInNhcC9mZS9jb3JlL3NlcnZpY2VzL1JvdXRpbmdTZXJ2aWNlRmFjdG9yeVwiO1xuaW1wb3J0IHR5cGUgRXZlbnQgZnJvbSBcInNhcC91aS9iYXNlL0V2ZW50XCI7XG5pbXBvcnQgQ29tcG9uZW50IGZyb20gXCJzYXAvdWkvY29yZS9Db21wb25lbnRcIjtcbmltcG9ydCBMaWJyYXJ5IGZyb20gXCJzYXAvdWkvY29yZS9MaWJcIjtcbmltcG9ydCB0eXBlIHsgUm91dGluZ1RhcmdldCB9IGZyb20gXCJzYXAvdWkvY29yZS9NYW5pZmVzdFwiO1xuaW1wb3J0IENvbnRyb2xsZXJFeHRlbnNpb24gZnJvbSBcInNhcC91aS9jb3JlL212Yy9Db250cm9sbGVyRXh0ZW5zaW9uXCI7XG5pbXBvcnQgT3ZlcnJpZGVFeGVjdXRpb24gZnJvbSBcInNhcC91aS9jb3JlL212Yy9PdmVycmlkZUV4ZWN1dGlvblwiO1xuaW1wb3J0IHR5cGUgUm91dGVyIGZyb20gXCJzYXAvdWkvY29yZS9yb3V0aW5nL1JvdXRlclwiO1xuaW1wb3J0IHR5cGUgQmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL0JpbmRpbmdcIjtcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgdHlwZSBPRGF0YUNvbnRleHRCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFDb250ZXh0QmluZGluZ1wiO1xuaW1wb3J0IHR5cGUgT0RhdGFMaXN0QmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTGlzdEJpbmRpbmdcIjtcbmltcG9ydCB0eXBlIE9EYXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1vZGVsXCI7XG5pbXBvcnQgdHlwZSBPRGF0YVByb3BlcnR5QmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhUHJvcGVydHlCaW5kaW5nXCI7XG5pbXBvcnQgeyBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMgfSBmcm9tIFwiLi4vY29udmVydGVycy9NZXRhTW9kZWxDb252ZXJ0ZXJcIjtcbmltcG9ydCB0eXBlIHsgU2lkZUVmZmVjdHNUYXJnZXRUeXBlIH0gZnJvbSBcIi4uL3NlcnZpY2VzL1NpZGVFZmZlY3RzU2VydmljZUZhY3RvcnlcIjtcblxudHlwZSBSb3V0ZUluZm9ybWF0aW9uID0ge1xuXHR0YXJnZXRzPzogdW5rbm93bltdO1xuXHRyb3V0ZUxldmVsOiBudW1iZXI7XG59O1xuLyoqXG4gKiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLkNvbnRyb2xsZXJFeHRlbnNpb24gQ29udHJvbGxlciBleHRlbnNpb259XG4gKlxuICogQHNpbmNlIDEuNzQuMFxuICovXG5AZGVmaW5lVUk1Q2xhc3MoXCJzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5JbnRlcm5hbFJvdXRpbmdcIilcbmNsYXNzIEludGVybmFsUm91dGluZyBleHRlbmRzIENvbnRyb2xsZXJFeHRlbnNpb24ge1xuXHRwcml2YXRlIGJhc2UhOiBQYWdlQ29udHJvbGxlcjtcblxuXHRwcml2YXRlIF9vVmlldyE6IEZFVmlldztcblxuXHRwcml2YXRlIF9vQXBwQ29tcG9uZW50ITogQXBwQ29tcG9uZW50O1xuXG5cdHByaXZhdGUgX29QYWdlQ29tcG9uZW50ITogRW5oYW5jZVdpdGhVSTU8VGVtcGxhdGVDb21wb25lbnQ+IHwgbnVsbDtcblxuXHRwcml2YXRlIF9vUm91dGVyITogUm91dGVyO1xuXG5cdHByaXZhdGUgX29Sb3V0aW5nU2VydmljZSE6IFJvdXRpbmdTZXJ2aWNlO1xuXG5cdHByaXZhdGUgX29Sb3V0ZXJQcm94eSE6IFJvdXRlclByb3h5O1xuXG5cdHByaXZhdGUgX2ZuUm91dGVNYXRjaGVkQm91bmQhOiBGdW5jdGlvbjtcblxuXHRwcm90ZWN0ZWQgX29UYXJnZXRJbmZvcm1hdGlvbiE6IFJvdXRpbmdUYXJnZXQ7XG5cblx0QG1ldGhvZE92ZXJyaWRlKClcblx0b25FeGl0KCk6IHZvaWQge1xuXHRcdGlmICh0aGlzLl9vUm91dGluZ1NlcnZpY2UpIHtcblx0XHRcdHRoaXMuX29Sb3V0aW5nU2VydmljZS5kZXRhY2hSb3V0ZU1hdGNoZWQodGhpcy5fZm5Sb3V0ZU1hdGNoZWRCb3VuZCk7XG5cdFx0fVxuXHR9XG5cblx0QG1ldGhvZE92ZXJyaWRlKClcblx0b25Jbml0KCk6IHZvaWQge1xuXHRcdHRoaXMuX29WaWV3ID0gdGhpcy5iYXNlLmdldFZpZXcoKTtcblx0XHR0aGlzLl9vQXBwQ29tcG9uZW50ID0gQ29tbW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50KHRoaXMuX29WaWV3KTtcblx0XHR0aGlzLl9vUGFnZUNvbXBvbmVudCA9IENvbXBvbmVudC5nZXRPd25lckNvbXBvbmVudEZvcih0aGlzLl9vVmlldykgYXMgRW5oYW5jZVdpdGhVSTU8VGVtcGxhdGVDb21wb25lbnQ+O1xuXHRcdHRoaXMuX29Sb3V0ZXIgPSB0aGlzLl9vQXBwQ29tcG9uZW50LmdldFJvdXRlcigpO1xuXHRcdHRoaXMuX29Sb3V0ZXJQcm94eSA9IHRoaXMuX29BcHBDb21wb25lbnQuZ2V0Um91dGVyUHJveHkoKTtcblxuXHRcdGlmICghdGhpcy5fb0FwcENvbXBvbmVudCB8fCAhdGhpcy5fb1BhZ2VDb21wb25lbnQpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIkZhaWxlZCB0byBpbml0aWFsaXplIGNvbnRyb2xlciBleHRlbnNpb24gJ3NhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlc2lvbnMuSW50ZXJuYWxSb3V0aW5nXCIpO1xuXHRcdH1cblxuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnRcblx0XHQvLyBAdHMtaWdub3JlXG5cdFx0aWYgKHRoaXMuX29BcHBDb21wb25lbnQgPT09IHRoaXMuX29QYWdlQ29tcG9uZW50KSB7XG5cdFx0XHQvLyBUaGUgdmlldyBpc24ndCBob3N0ZWQgaW4gYSBkZWRpY2F0ZWQgVUlDb21wb25lbnQsIGJ1dCBkaXJlY3RseSBpbiB0aGUgYXBwXG5cdFx0XHQvLyAtLT4ganVzdCBrZWVwIHRoZSB2aWV3XG5cdFx0XHR0aGlzLl9vUGFnZUNvbXBvbmVudCA9IG51bGw7XG5cdFx0fVxuXG5cdFx0dGhpcy5fb0FwcENvbXBvbmVudFxuXHRcdFx0LmdldFNlcnZpY2UoXCJyb3V0aW5nU2VydmljZVwiKVxuXHRcdFx0LnRoZW4oKG9Sb3V0aW5nU2VydmljZTogUm91dGluZ1NlcnZpY2UpID0+IHtcblx0XHRcdFx0dGhpcy5fb1JvdXRpbmdTZXJ2aWNlID0gb1JvdXRpbmdTZXJ2aWNlO1xuXHRcdFx0XHR0aGlzLl9mblJvdXRlTWF0Y2hlZEJvdW5kID0gdGhpcy5fb25Sb3V0ZU1hdGNoZWQuYmluZCh0aGlzKTtcblx0XHRcdFx0dGhpcy5fb1JvdXRpbmdTZXJ2aWNlLmF0dGFjaFJvdXRlTWF0Y2hlZCh7fSwgdGhpcy5fZm5Sb3V0ZU1hdGNoZWRCb3VuZCk7XG5cdFx0XHRcdHRoaXMuX29UYXJnZXRJbmZvcm1hdGlvbiA9IG9Sb3V0aW5nU2VydmljZS5nZXRUYXJnZXRJbmZvcm1hdGlvbkZvcih0aGlzLl9vUGFnZUNvbXBvbmVudCB8fCB0aGlzLl9vVmlldykhO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiVGhpcyBjb250cm9sbGVyIGV4dGVuc2lvbiBjYW5ub3Qgd29yayB3aXRob3V0IGEgJ3JvdXRpbmdTZXJ2aWNlJyBvbiB0aGUgbWFpbiBBcHBDb21wb25lbnRcIik7XG5cdFx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUcmlnZ2VyZWQgZXZlcnkgdGltZSB0aGlzIGNvbnRyb2xsZXIgaXMgYSBuYXZpZ2F0aW9uIHRhcmdldC5cblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0b25Sb3V0ZU1hdGNoZWQoKTogdm9pZCB7XG5cdFx0LyoqL1xuXHR9XG5cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRvblJvdXRlTWF0Y2hlZEZpbmlzaGVkKCk6IHZvaWQge1xuXHRcdC8qKi9cblx0fVxuXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0b25CZWZvcmVCaW5kaW5nKF9iaW5kaW5nQ29udGV4dDogQ29udGV4dCB8IG51bGwsIF9tUGFyYW1ldGVycz86IHVua25vd24pOiB2b2lkIHt9XG5cblx0YmVmb3JlU2V0QmluZGluZ0NvbnRleHQoYmluZGluZ0NvbnRleHQ6IENvbnRleHQgfCBudWxsLCBfbVBhcmFtZXRlcnM/OiB1bmtub3duKTogdm9pZCB7XG5cdFx0dGhpcy5vbkJlZm9yZUJpbmRpbmcoYmluZGluZ0NvbnRleHQsIF9tUGFyYW1ldGVycyk7XG5cdFx0Y29uc3Qgb1JvdXRpbmcgPSB0aGlzLmJhc2UuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKS5yb3V0aW5nO1xuXHRcdGlmIChvUm91dGluZyAmJiBvUm91dGluZy5vbkJlZm9yZUJpbmRpbmcpIHtcblx0XHRcdG9Sb3V0aW5nLm9uQmVmb3JlQmluZGluZyhiaW5kaW5nQ29udGV4dCk7XG5cdFx0fVxuXHR9XG5cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRvbkFmdGVyQmluZGluZyhiaW5kaW5nQ29udGV4dDogQ29udGV4dCB8IG51bGwsIF9tUGFyYW1ldGVycz86IHVua25vd24pOiB2b2lkIHtcblx0XHR0aGlzLl9vQXBwQ29tcG9uZW50LmdldFJvb3RWaWV3Q29udHJvbGxlcigpLm9uQ29udGV4dEJvdW5kVG9WaWV3KGJpbmRpbmdDb250ZXh0KTtcblx0fVxuXG5cdGFmdGVyU2V0QmluZGluZ0NvbnRleHQoYmluZGluZ0NvbnRleHQ6IENvbnRleHQgfCBudWxsLCBfbVBhcmFtZXRlcnM/OiB1bmtub3duKTogdm9pZCB7XG5cdFx0dGhpcy5vbkFmdGVyQmluZGluZyhiaW5kaW5nQ29udGV4dCwgX21QYXJhbWV0ZXJzKTtcblx0XHRjb25zdCBvUm91dGluZyA9IHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpLnJvdXRpbmc7XG5cdFx0aWYgKG9Sb3V0aW5nICYmIG9Sb3V0aW5nLm9uQWZ0ZXJCaW5kaW5nKSB7XG5cdFx0XHRvUm91dGluZy5vbkFmdGVyQmluZGluZyhiaW5kaW5nQ29udGV4dCk7XG5cdFx0fVxuXHR9XG5cblx0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblx0Ly8gTWV0aG9kcyB0cmlnZ2VyaW5nIGEgbmF2aWdhdGlvbiBhZnRlciBhIHVzZXIgYWN0aW9uXG5cdC8vIChlLmcuIGNsaWNrIG9uIGEgdGFibGUgcm93LCBidXR0b24sIGV0Yy4uLilcblx0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuXHQvKipcblx0ICogTmF2aWdhdGVzIHRvIHRoZSBzcGVjaWZpZWQgbmF2aWdhdGlvbiB0YXJnZXQuXG5cdCAqXG5cdCAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IGluc3RhbmNlXG5cdCAqIEBwYXJhbSBzTmF2aWdhdGlvblRhcmdldE5hbWUgTmFtZSBvZiB0aGUgbmF2aWdhdGlvbiB0YXJnZXRcblx0ICogQHBhcmFtIGJQcmVzZXJ2ZUhpc3RvcnkgVHJ1ZSB0byBmb3JjZSB0aGUgbmV3IFVSTCB0byBiZSBhZGRlZCBhdCB0aGUgZW5kIG9mIHRoZSBicm93c2VyIGhpc3RvcnkgKG5vIHJlcGxhY2UpXG5cdCAqIEBwYXJhbSBkZWxheWVkVXNhZ2UgVHJ1ZSB0byByZXR1cm4gYSBmdW5jdGlvbiBmb3IgZXhlY3V0aW5nIHRoZSBuYXZpZ2F0aW9uLCBGYWxzZSB0byBleGVjdXRlIHRoZSBuYXZpZ2F0aW9uIGltbWVkaWF0ZWx5XG5cdCAqL1xuXHRhc3luYyBuYXZpZ2F0ZVRvVGFyZ2V0KFxuXHRcdG9Db250ZXh0OiBDb250ZXh0LFxuXHRcdHNOYXZpZ2F0aW9uVGFyZ2V0TmFtZTogc3RyaW5nLFxuXHRcdGJQcmVzZXJ2ZUhpc3Rvcnk/OiBib29sZWFuLFxuXHRcdGRlbGF5ZWRVc2FnZT86IHRydWVcblx0KTogUHJvbWlzZTwoKSA9PiB2b2lkPjtcblxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0YXN5bmMgbmF2aWdhdGVUb1RhcmdldChcblx0XHRvQ29udGV4dDogQ29udGV4dCxcblx0XHRzTmF2aWdhdGlvblRhcmdldE5hbWU6IHN0cmluZyxcblx0XHRiUHJlc2VydmVIaXN0b3J5PzogYm9vbGVhbixcblx0XHRkZWxheWVkVXNhZ2U/OiBib29sZWFuXG5cdCk6IFByb21pc2U8KCgpID0+IHZvaWQpIHwgdm9pZD4ge1xuXHRcdGNvbnN0IG9OYXZpZ2F0aW9uQ29uZmlndXJhdGlvbiA9XG5cdFx0XHR0aGlzLl9vUGFnZUNvbXBvbmVudCAmJlxuXHRcdFx0dGhpcy5fb1BhZ2VDb21wb25lbnQuZ2V0TmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24gJiZcblx0XHRcdHRoaXMuX29QYWdlQ29tcG9uZW50LmdldE5hdmlnYXRpb25Db25maWd1cmF0aW9uKHNOYXZpZ2F0aW9uVGFyZ2V0TmFtZSk7XG5cdFx0aWYgKG9OYXZpZ2F0aW9uQ29uZmlndXJhdGlvbikge1xuXHRcdFx0Y29uc3Qgb0RldGFpbFJvdXRlID0gb05hdmlnYXRpb25Db25maWd1cmF0aW9uLmRldGFpbDtcblx0XHRcdGNvbnN0IHNSb3V0ZU5hbWUgPSBvRGV0YWlsUm91dGUucm91dGU7XG5cdFx0XHRjb25zdCBtUGFyYW1ldGVyTWFwcGluZyA9IG9EZXRhaWxSb3V0ZS5wYXJhbWV0ZXJzO1xuXHRcdFx0cmV0dXJuIHRoaXMuX29Sb3V0aW5nU2VydmljZS5uYXZpZ2F0ZVRvKG9Db250ZXh0LCBzUm91dGVOYW1lLCBtUGFyYW1ldGVyTWFwcGluZywgYlByZXNlcnZlSGlzdG9yeSwgZGVsYXllZFVzYWdlKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIHRoaXMuX29Sb3V0aW5nU2VydmljZS5uYXZpZ2F0ZVRvKG9Db250ZXh0LCBudWxsLCBudWxsLCBiUHJlc2VydmVIaXN0b3J5LCBkZWxheWVkVXNhZ2UpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgdGhlIEhhc2ggd2UncmUgbmF2aWdhdGluZyB0by5cblx0ICpcblx0ICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCBpbnN0YW5jZVxuXHQgKiBAcGFyYW0gbmF2aWdhdGlvblRhcmdldE5hbWUgTmFtZSBvZiB0aGUgbmF2aWdhdGlvbiB0YXJnZXRcblx0ICogQHJldHVybnMgVGhlIEhhc2ggd2UncmUgbmF2aWdhdGluZyB0b1xuXHQgKi9cblx0YXN5bmMgZ2V0SGFzaEZvck5hdmlnYXRpb24oY29udGV4dDogQ29udGV4dCwgbmF2aWdhdGlvblRhcmdldE5hbWU6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG5cdFx0Y29uc3QgbmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24gPSB0aGlzPy5fb1BhZ2VDb21wb25lbnQ/LmdldE5hdmlnYXRpb25Db25maWd1cmF0aW9uKG5hdmlnYXRpb25UYXJnZXROYW1lKTtcblx0XHRpZiAobmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24pIHtcblx0XHRcdGNvbnN0IGRldGFpbFJvdXRlID0gbmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24uZGV0YWlsO1xuXHRcdFx0Y29uc3Qgcm91dGVOYW1lID0gZGV0YWlsUm91dGUucm91dGU7XG5cdFx0XHRjb25zdCBwYXJhbWV0ZXJNYXBwaW5nID0gZGV0YWlsUm91dGUucGFyYW1ldGVycztcblx0XHRcdHJldHVybiB0aGlzLl9vUm91dGluZ1NlcnZpY2UuZ2V0SGFzaEZyb21Sb3V0ZShjb250ZXh0LCByb3V0ZU5hbWUsIHBhcmFtZXRlck1hcHBpbmcpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fb1JvdXRpbmdTZXJ2aWNlLmdldEhhc2hGcm9tUm91dGUoY29udGV4dCwgbnVsbCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIE5hdmlnYXRlcyB0byB0aGUgc3BlY2lmaWVkIG5hdmlnYXRpb24gdGFyZ2V0IHJvdXRlLlxuXHQgKlxuXHQgKiBAcGFyYW0gc1RhcmdldFJvdXRlTmFtZSBOYW1lIG9mIHRoZSB0YXJnZXQgcm91dGVcblx0ICogQHBhcmFtIFtvUGFyYW1ldGVyc10gUGFyYW1ldGVycyB0byBiZSB1c2VkIHdpdGggcm91dGUgdG8gY3JlYXRlIHRoZSB0YXJnZXQgaGFzaFxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2hlbiB0aGUgbmF2aWdhdGlvbiBpcyBmaW5hbGl6ZWRcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRhc3luYyBuYXZpZ2F0ZVRvUm91dGUoc1RhcmdldFJvdXRlTmFtZTogc3RyaW5nLCBvUGFyYW1ldGVycz86IG9iamVjdCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRcdHJldHVybiB0aGlzLl9vUm91dGluZ1NlcnZpY2UubmF2aWdhdGVUb1JvdXRlKHNUYXJnZXRSb3V0ZU5hbWUsIG9QYXJhbWV0ZXJzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBOYXZpZ2F0ZXMgdG8gYSBzcGVjaWZpYyBjb250ZXh0LlxuXHQgKlxuXHQgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB0byBiZSBuYXZpZ2F0ZWQgdG9cblx0ICogQHBhcmFtIHBhcmFtZXRlcnMgT3B0aW9uYWwgbmF2aWdhdGlvbiBwYXJhbWV0ZXJzXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZWQgdG8gJ3RydWUnIHdoZW4gdGhlIG5hdmlnYXRpb24gaGFzIGJlZW4gdHJpZ2dlcmVkLCAnZmFsc2UnIGlmIHRoZSBuYXZpZ2F0aW9uIGRpZCBub3QgaGFwcGVuXG5cdCAqL1xuXHRhc3luYyBuYXZpZ2F0ZVRvQ29udGV4dChjb250ZXh0OiBDb250ZXh0IHwgT0RhdGFMaXN0QmluZGluZywgcGFyYW1ldGVyczogUm91dGluZ05hdmlnYXRpb25QYXJhbWV0ZXJzID0ge30pOiBQcm9taXNlPGJvb2xlYW4+IHtcblx0XHRpZiAoY29udGV4dC5pc0E8T0RhdGFMaXN0QmluZGluZz4oXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ1wiKSkge1xuXHRcdFx0aWYgKHBhcmFtZXRlcnMuY3JlYXRlT25OYXZpZ2F0ZVBhcmFtZXRlcnM/Lm1vZGUgPT09IFwiQXN5bmNcIikge1xuXHRcdFx0XHQvLyB0aGUgY29udGV4dCBpcyBlaXRoZXIgY3JlYXRlZCBhc3luYyAoUHJvbWlzZSlcblx0XHRcdFx0Ly8gV2UgbmVlZCB0byBhY3RpdmF0ZSB0aGUgcm91dGVNYXRjaFN5bmNocm8gb24gdGhlIFJvdXRlclByb3h5IHRvIGF2b2lkIHRoYXRcblx0XHRcdFx0Ly8gdGhlIHN1YnNlcXVlbnQgY2FsbCB0byBuYXZpZ2F0ZVRvQ29udGV4dCBjb25mbGljdHMgd2l0aCB0aGUgY3VycmVudCBvbmVcblx0XHRcdFx0dGhpcy5fb1JvdXRlclByb3h5LmFjdGl2YXRlUm91dGVNYXRjaFN5bmNocm9uaXphdGlvbigpO1xuXG5cdFx0XHRcdHBhcmFtZXRlcnMuY3JlYXRlT25OYXZpZ2F0ZVBhcmFtZXRlcnMuY3JlYXRlQ29udGV4dFByb21pc2Vcblx0XHRcdFx0XHQudGhlbihhc3luYyAoY3JlYXRlZENvbnRleHQpID0+IHtcblx0XHRcdFx0XHRcdC8vIG9uY2UgdGhlIGNvbnRleHQgaXMgcmV0dXJuZWQgd2UgbmF2aWdhdGUgaW50byBpdFxuXHRcdFx0XHRcdFx0cmV0dXJuIHRoaXMubmF2aWdhdGVUb0NvbnRleHQoY3JlYXRlZENvbnRleHQsIHtcblx0XHRcdFx0XHRcdFx0Y2hlY2tOb0hhc2hDaGFuZ2U6IHBhcmFtZXRlcnMuY2hlY2tOb0hhc2hDaGFuZ2UsXG5cdFx0XHRcdFx0XHRcdGVkaXRhYmxlOiBwYXJhbWV0ZXJzLmVkaXRhYmxlLFxuXHRcdFx0XHRcdFx0XHRwZXJzaXN0T1BTY3JvbGw6IHBhcmFtZXRlcnMucGVyc2lzdE9QU2Nyb2xsLFxuXHRcdFx0XHRcdFx0XHR1cGRhdGVGQ0xMZXZlbDogcGFyYW1ldGVycy51cGRhdGVGQ0xMZXZlbCxcblx0XHRcdFx0XHRcdFx0Zm9yY2VGb2N1czogcGFyYW1ldGVycy5mb3JjZUZvY3VzXG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aXRoIHRoZSBhc3luYyBjb250ZXh0XCIsIG9FcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fSBlbHNlIGlmIChwYXJhbWV0ZXJzLmNyZWF0ZU9uTmF2aWdhdGVQYXJhbWV0ZXJzPy5tb2RlICE9PSBcIkRlZmVycmVkXCIpIHtcblx0XHRcdFx0Ly8gTmF2aWdhdGUgdG8gYSBsaXN0IGJpbmRpbmcgbm90IHlldCBzdXBwb3J0ZWRcblx0XHRcdFx0dGhyb3cgXCJuYXZpZ2F0aW9uIHRvIGEgbGlzdCBiaW5kaW5nIGlzIG5vdCB5ZXQgc3VwcG9ydGVkXCI7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChwYXJhbWV0ZXJzLmNhbGxFeHRlbnNpb24pIHtcblx0XHRcdGNvbnN0IGludGVybmFsTW9kZWwgPSB0aGlzLl9vVmlldy5nZXRNb2RlbChcImludGVybmFsXCIpO1xuXHRcdFx0aW50ZXJuYWxNb2RlbC5zZXRQcm9wZXJ0eShcIi9wYWdpbmF0b3JDdXJyZW50Q29udGV4dFwiLCBudWxsKTtcblxuXHRcdFx0Ly8gU3RvcmluZyB0aGUgc2VsZWN0ZWQgY29udGV4dCB0byB1c2UgaXQgaW4gaW50ZXJuYWwgcm91dGUgbmF2aWdhdGlvbiBpZiBuZWNjZXNzYXJ5LlxuXHRcdFx0Y29uc3Qgb3ZlcnJpZGVOYXYgPSB0aGlzLmJhc2UuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKS5yb3V0aW5nLm9uQmVmb3JlTmF2aWdhdGlvbih7IGJpbmRpbmdDb250ZXh0OiBjb250ZXh0IH0pO1xuXHRcdFx0aWYgKG92ZXJyaWRlTmF2KSB7XG5cdFx0XHRcdGludGVybmFsTW9kZWwuc2V0UHJvcGVydHkoXCIvcGFnaW5hdG9yQ3VycmVudENvbnRleHRcIiwgY29udGV4dCk7XG5cdFx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUodHJ1ZSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cGFyYW1ldGVycy5GQ0xMZXZlbCA9IHRoaXMuX2dldEZDTExldmVsKCk7XG5cblx0XHQvLyBJbiBjYXNlIHdlJ3JlIG5hdmlnYXRpbmcgZnJvbSBhIHRhYmxlIGluIGEgTGlzdFJlcG9ydCB3aXRoIGRyYWZ0LCB0aGVyZSdzIHNwZWNpYWwgaGFuZGxpbmcgZm9yIGNvbGxhYm9yYXRpb24gYW5kIHRyZWUgdGFibGUuXG5cdFx0Ly8gV2UgbWF5IG5vdCBuYXZpZ2F0ZSB0byB0aGUgY29udGV4dCB0aGUgdXNlciBjbGlja2VkIG9uLlxuXHRcdGlmIChwYXJhbWV0ZXJzLnJlYXNvbiA9PT0gTmF2aWdhdGlvblJlYXNvbi5Sb3dQcmVzcyAmJiBjb250ZXh0LmlzQTxDb250ZXh0PihcInNhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0XCIpKSB7XG5cdFx0XHRjb25zdCBtb2RlbCA9IGNvbnRleHQuZ2V0TW9kZWwoKTtcblx0XHRcdGNvbnN0IG1ldGFNb2RlbCA9IG1vZGVsLmdldE1ldGFNb2RlbCgpO1xuXG5cdFx0XHRpZiAoaXNQYXRoT25EcmFmdFJvb3QoY29udGV4dC5nZXRQYXRoKCksIG1ldGFNb2RlbCkpIHtcblx0XHRcdFx0Y29uc3QgY29udGV4dEZvck5hdmlnYXRpb24gPVxuXHRcdFx0XHRcdChhd2FpdCB0aGlzLmdldENvbnRleHRGb3JOYXZpZ2F0aW9uV2l0aENvbGxhYm9yYXRpb24oY29udGV4dCwgcGFyYW1ldGVycykpID8/XG5cdFx0XHRcdFx0KGF3YWl0IHRoaXMuZ2V0Q29udGV4dEZvck5hdmlnYXRpb25Gcm9tVHJlZVRhYmxlKGNvbnRleHQpKTtcblxuXHRcdFx0XHQvLyBVc2UgYW5vdGhlciBpbnN0YW5jZSBmb3IgbmF2aWdhdGlvblxuXHRcdFx0XHRpZiAoY29udGV4dEZvck5hdmlnYXRpb24pIHtcblx0XHRcdFx0XHRjb250ZXh0ID0gY29udGV4dEZvck5hdmlnYXRpb247XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5fb1JvdXRpbmdTZXJ2aWNlLm5hdmlnYXRlVG9Db250ZXh0KGNvbnRleHQsIHBhcmFtZXRlcnMsIHRoaXMuX29WaWV3LmdldFZpZXdEYXRhKCksIHRoaXMuX29UYXJnZXRJbmZvcm1hdGlvbik7XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmVzIHRoZSBjb250ZXh0IHRvIHVzZSBmb3IgbmF2aWdhdGlvbiBpbiBjYXNlIHdlJ3JlIG5hdmlnYXRpbmcgdG8gYSBkcmFmdCBpbnN0YW5jZSBmcm9tIHRoZSBMUiBhbmQgd2UncmUgaW4gYSBjb2xsYWJvcmF0aW9uIGFwcGxpY2F0aW9uLlxuXHQgKlxuXHQgKiBAcGFyYW0gb3JpZ2luYWxDb250ZXh0XG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzXG5cdCAqIEByZXR1cm5zIFRoZSBjb250ZXh0IHRvIHVzZSBmb3IgbmF2aWdhdGlvbiBpZiBpdCdzIGRpZmZlcmVudCBmcm9tIHRoZSBvcmlnaW5hbCBjb250ZXh0LCBudWxsIG90aGVyd2lzZVxuXHQgKi9cblx0cHJpdmF0ZSBhc3luYyBnZXRDb250ZXh0Rm9yTmF2aWdhdGlvbldpdGhDb2xsYWJvcmF0aW9uKFxuXHRcdG9yaWdpbmFsQ29udGV4dDogQ29udGV4dCxcblx0XHRwYXJhbWV0ZXJzOiBSb3V0aW5nTmF2aWdhdGlvblBhcmFtZXRlcnNcblx0KTogUHJvbWlzZTxDb250ZXh0IHwgbnVsbD4ge1xuXHRcdGNvbnN0IG1vZGVsID0gb3JpZ2luYWxDb250ZXh0LmdldE1vZGVsKCk7XG5cdFx0Y29uc3QgbWV0YU1vZGVsID0gbW9kZWwuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0aWYgKE1vZGVsSGVscGVyLmlzQ29sbGFib3JhdGlvbkRyYWZ0U3VwcG9ydGVkKG1ldGFNb2RlbCkgJiYgb3JpZ2luYWxDb250ZXh0LmdldFByb3BlcnR5KFwiSXNBY3RpdmVFbnRpdHlcIikgPT09IGZhbHNlKSB7XG5cdFx0XHQvLyBJZiB3ZSdyZSBpbiBhIGNvbGxhYm9yYXRpb24gYXBwbGljYXRpb24sIGFuZCB3ZSdyZSBuYXZpZ2F0aW5nIHRvIGEgZHJhZnQgaW5zdGFuY2UgZnJvbSB0aGUgTFIsXG5cdFx0XHQvLyBXZSB3YW50IHRvIGNoZWNrIGlmIHRoZSBkcmFmdCBpbnN0YW5jZSBleGlzdHMgZmlyc3QuIE90aGVyd2lzZSB3ZSBuYXZpZ2F0ZSB0byB0aGUgb3JpZ2luYWwgKGRyYWZ0KSB2ZXJzaW9uLlxuXHRcdFx0Y29uc3QgZHJhZnRPckFjdGl2ZUNvbnRleHQgPSBhd2FpdCBnZXREcmFmdE9yQWN0aXZlQ29udGV4dChvcmlnaW5hbENvbnRleHQpO1xuXG5cdFx0XHRpZiAoZHJhZnRPckFjdGl2ZUNvbnRleHQgIT09IG51bGwgJiYgb3JpZ2luYWxDb250ZXh0LmdldFBhdGgoKSAhPT0gZHJhZnRPckFjdGl2ZUNvbnRleHQuZ2V0UGF0aCgpKSB7XG5cdFx0XHRcdC8vIE5vdGlmeSB0aGUgdXNlciB0aGF0IHdlIGhhdmUgbmF2aWdhdGVkIHRvIHRoZSBzYXZlZCBpbnN0YW5jZVxuXHRcdFx0XHRjb25zdCBvYmplY3RQYXRoID0gZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzKG1ldGFNb2RlbC5nZXRNZXRhQ29udGV4dChvcmlnaW5hbENvbnRleHQuZ2V0UGF0aCgpKSk7XG5cdFx0XHRcdHBhcmFtZXRlcnMucmVkaXJlY3RlZFRvTm9uRHJhZnQgPVxuXHRcdFx0XHRcdChvYmplY3RQYXRoLnRhcmdldEVudGl0eVR5cGUuYW5ub3RhdGlvbnMuVUk/LkhlYWRlckluZm8/LlR5cGVOYW1lIGFzIHVua25vd24gYXMgc3RyaW5nKSA/P1xuXHRcdFx0XHRcdG9iamVjdFBhdGgudGFyZ2V0RW50aXR5VHlwZS5uYW1lO1xuXG5cdFx0XHRcdGlmICh0aGlzLl9vQXBwQ29tcG9uZW50LmdldFJvb3RWaWV3Q29udHJvbGxlcigpLmlzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdFx0Ly8gRkNMOiByZXBsYWNlIHRoZSBjb250ZXh0IGluIHRoZSBsaXN0IGJpbmRpbmdcblx0XHRcdFx0XHRjb25zdCBjb250ZXh0VG9SZXBsYWNlV2l0aCA9IG1vZGVsLmdldEtlZXBBbGl2ZUNvbnRleHQoZHJhZnRPckFjdGl2ZUNvbnRleHQuZ2V0UGF0aCgpKTtcblx0XHRcdFx0XHRvcmlnaW5hbENvbnRleHQucmVwbGFjZVdpdGgoY29udGV4dFRvUmVwbGFjZVdpdGgpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIEZ1bGxzY3JlZW46IHRyaWdnZXIgYSByZWZyZXNoIG9mIHRoZSBsaXN0IGJpbmRpbmdcblx0XHRcdFx0XHRFZGl0U3RhdGUuc2V0RWRpdFN0YXRlRGlydHkoKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFVzZSB0aGUgc2F2ZWQgaW5zdGFuY2UgZm9yIG5hdmlnYXRpb25cblx0XHRcdFx0cmV0dXJuIGRyYWZ0T3JBY3RpdmVDb250ZXh0O1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIFVzZSB0aGUgb3JpZ2luYWwgY29udGV4dFxuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlcyB0aGUgY29udGV4dCB0byB1c2UgZm9yIG5hdmlnYXRpb24gaW4gY2FzZSB3ZSdyZSBuYXZpZ2F0aW5nIHRvIGFuIGFjdGl2ZSBpbnN0YW5jZSBmcm9tIHRoZSBMUiBhbmQgd2UncmUgaW4gYSBUcmVlIHRhYmxlLlxuXHQgKlxuXHQgKiBAcGFyYW0gb3JpZ2luYWxDb250ZXh0XG5cdCAqIEByZXR1cm5zIFRoZSBjb250ZXh0IHRvIHVzZSBmb3IgbmF2aWdhdGlvbiBpZiBpdCdzIGRpZmZlcmVudCBmcm9tIHRoZSBvcmlnaW5hbCBjb250ZXh0LCBudWxsIG90aGVyd2lzZVxuXHQgKi9cblx0cHJpdmF0ZSBhc3luYyBnZXRDb250ZXh0Rm9yTmF2aWdhdGlvbkZyb21UcmVlVGFibGUob3JpZ2luYWxDb250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTxDb250ZXh0IHwgbnVsbD4ge1xuXHRcdGNvbnN0IHBhcmVudEJpbmRpbmcgPSBvcmlnaW5hbENvbnRleHQuZ2V0QmluZGluZygpO1xuXHRcdGlmICghcGFyZW50QmluZGluZy5pc0E8T0RhdGFMaXN0QmluZGluZz4oXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ1wiKSkge1xuXHRcdFx0Ly8gVGhlIGNvbnRleHQgZG9lc24ndCBiZWxvbmcgdG8gYSBsaXN0IGJpbmRpbmdcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblx0XHRjb25zdCBhZ2dyZWdhdGlvbiA9IHBhcmVudEJpbmRpbmcuZ2V0QWdncmVnYXRpb24oKSBhcyB7IGhpZXJhcmNoeVF1YWxpZmllcj86IHN0cmluZyB9IHwgdW5kZWZpbmVkO1xuXHRcdGlmICghYWdncmVnYXRpb24/LmhpZXJhcmNoeVF1YWxpZmllcikge1xuXHRcdFx0Ly8gVGhlIGNvbnRleHQgZG9lc24ndCBiZWxvbmcgdG8gYSBoaWVyYXJjaGljYWwgbGlzdCBiaW5kaW5nXG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cblx0XHRpZiAob3JpZ2luYWxDb250ZXh0LmdldFByb3BlcnR5KFwiSXNBY3RpdmVFbnRpdHlcIikgPT09IHRydWUgJiYgb3JpZ2luYWxDb250ZXh0LmdldFByb3BlcnR5KFwiSGFzRHJhZnRFbnRpdHlcIikgPT09IHRydWUpIHtcblx0XHRcdC8vIElmIHdlJ3JlIGluIGEgVHJlZVRhYmxlLCBhbmQgd2UncmUgbmF2aWdhdGluZyB0byBhbiBhY3RpdmUgaW5zdGFuY2UgaW5zdGFuY2UgdGhhdCBoYXMgYSBkcmFmdCxcblx0XHRcdC8vIC0tPiBXZSB0cnkgdG8gbmF2aWdhdGUgdG8gdGhlIGRyYWZ0IGluc3RhbmNlIChpZiBpdCBzdGlsbCBleGlzdHMpXG5cdFx0XHRjb25zdCBkcmFmdE9yQWN0aXZlQ29udGV4dCA9IGF3YWl0IGdldERyYWZ0T3JBY3RpdmVDb250ZXh0KG9yaWdpbmFsQ29udGV4dCk7XG5cblx0XHRcdGlmIChkcmFmdE9yQWN0aXZlQ29udGV4dCAhPT0gbnVsbCAmJiBvcmlnaW5hbENvbnRleHQuZ2V0UGF0aCgpICE9PSBkcmFmdE9yQWN0aXZlQ29udGV4dC5nZXRQYXRoKCkpIHtcblx0XHRcdFx0Ly8gVXNlIHRoZSBkcmFmdCBpbnN0YW5jZSBmb3IgbmF2aWdhdGlvblxuXHRcdFx0XHRyZXR1cm4gZHJhZnRPckFjdGl2ZUNvbnRleHQ7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gVXNlIHRoZSBvcmlnaW5hbCBjb250ZXh0XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblxuXHQvKipcblx0ICogTmF2aWdhdGVzIGJhY2t3YXJkcyBmcm9tIGEgY29udGV4dC5cblx0ICpcblx0ICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCB0byBiZSBuYXZpZ2F0ZWQgZnJvbVxuXHQgKiBAcGFyYW0gW3BhcmFtZXRlcnNdIE9wdGlvbmFsIG5hdmlnYXRpb24gcGFyYW1ldGVyc1xuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVkIHdoZW4gdGhlIG5hdmlnYXRpb24gaGFzIGJlZW4gdHJpZ2dlcmVkXG5cdCAqL1xuXHRhc3luYyBuYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dChjb250ZXh0OiBDb250ZXh0LCBwYXJhbWV0ZXJzOiBSb3V0aW5nTmF2aWdhdGlvblBhcmFtZXRlcnMgPSB7fSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRcdHBhcmFtZXRlcnMudXBkYXRlRkNMTGV2ZWwgPSAtMTtcblxuXHRcdHJldHVybiB0aGlzLm5hdmlnYXRlVG9Db250ZXh0KGNvbnRleHQsIHBhcmFtZXRlcnMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIE5hdmlnYXRlcyBmb3J3YXJkcyB0byBhIGNvbnRleHQuXG5cdCAqXG5cdCAqIEBwYXJhbSBjb250ZXh0IENvbnRleHQgdG8gYmUgbmF2aWdhdGVkIHRvXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzIE9wdGlvbmFsIG5hdmlnYXRpb24gcGFyYW1ldGVyc1xuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVkIHdoZW4gdGhlIG5hdmlnYXRpb24gaGFzIGJlZW4gdHJpZ2dlcmVkXG5cdCAqL1xuXHRhc3luYyBuYXZpZ2F0ZUZvcndhcmRUb0NvbnRleHQoY29udGV4dDogQ29udGV4dCB8IE9EYXRhTGlzdEJpbmRpbmcsIHBhcmFtZXRlcnM6IFJvdXRpbmdOYXZpZ2F0aW9uUGFyYW1ldGVycyA9IHt9KTogUHJvbWlzZTxib29sZWFuPiB7XG5cdFx0aWYgKHRoaXMuX29WaWV3LmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIik/LmdldFByb3BlcnR5KFwibWVzc2FnZUZvb3RlckNvbnRhaW5zRXJyb3JzXCIpID09PSB0cnVlKSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRydWUpO1xuXHRcdH1cblxuXHRcdHBhcmFtZXRlcnMudXBkYXRlRkNMTGV2ZWwgPSAxO1xuXG5cdFx0cmV0dXJuIHRoaXMubmF2aWdhdGVUb0NvbnRleHQoY29udGV4dCwgcGFyYW1ldGVycyk7XG5cdH1cblxuXHQvKipcblx0ICogTmF2aWdhdGVzIGJhY2sgaW4gaGlzdG9yeSBpZiB0aGUgY3VycmVudCBoYXNoIGNvcnJlc3BvbmRzIHRvIGEgdHJhbnNpZW50IHN0YXRlLlxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdG5hdmlnYXRlQmFja0Zyb21UcmFuc2llbnRTdGF0ZSgpOiB2b2lkIHtcblx0XHRjb25zdCBzSGFzaCA9IHRoaXMuX29Sb3V0ZXJQcm94eS5nZXRIYXNoKCk7XG5cblx0XHQvLyBpZiB0cmlnZ2VyZWQgd2hpbGUgbmF2aWdhdGluZyB0byAoLi4uKSwgd2UgbmVlZCB0byBuYXZpZ2F0ZSBiYWNrXG5cdFx0aWYgKHNIYXNoLmluY2x1ZGVzKFwiKC4uLilcIikpIHtcblx0XHRcdHRoaXMuX29Sb3V0ZXJQcm94eS5uYXZCYWNrKCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIERpc3BsYXlzIGFuIGVycm9yIChpbGx1c3RyYXRlZCBtZXNzYWdlKSBpbiB0aGUgcGFnZS5cblx0ICpcblx0ICogQHBhcmFtIHNFcnJvck1lc3NhZ2Vcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZVxuXHQgKi9cblx0YXN5bmMgbmF2aWdhdGVUb01lc3NhZ2VQYWdlKHNFcnJvck1lc3NhZ2U6IHN0cmluZywgbVBhcmFtZXRlcnM6IE5hdmlnYXRpb25Ub0Vycm9yUGFnZVJlc3VsdCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRcdG1QYXJhbWV0ZXJzID0gbVBhcmFtZXRlcnMgfHwge307XG5cdFx0aWYgKHRoaXMuX29Sb3V0ZXJQcm94eS5nZXRIYXNoKCkuaW5jbHVkZXMoXCJpLWFjdGlvbj1jcmVhdGVcIikgfHwgdGhpcy5fb1JvdXRlclByb3h5LmdldEhhc2goKS5pbmNsdWRlcyhcImktYWN0aW9uPWF1dG9DcmVhdGVcIikpIHtcblx0XHRcdHJldHVybiB0aGlzLl9vUm91dGVyUHJveHkubmF2VG9IYXNoKHRoaXMuX29Sb3V0aW5nU2VydmljZS5nZXREZWZhdWx0Q3JlYXRlSGFzaCgpKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIHRoaXMuX29BcHBDb21wb25lbnQuZ2V0Um9vdFZpZXdDb250cm9sbGVyKCkuZGlzcGxheUVycm9yUGFnZShzRXJyb3JNZXNzYWdlLCBtUGFyYW1ldGVycywgdGhpcy5fZ2V0RkNMTGV2ZWwoKSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiBvbmUgb2YgdGhlIGN1cnJlbnQgdmlld3Mgb24gdGhlIHNjcmVlbiBpcyBib3VuZCB0byBhIGdpdmVuIGNvbnRleHQuXG5cdCAqXG5cdCAqIEBwYXJhbSBvQ29udGV4dFxuXHQgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHN0YXRlIGlzIGltcGFjdGVkIGJ5IHRoZSBjb250ZXh0XG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0aXNDdXJyZW50U3RhdGVJbXBhY3RlZEJ5KG9Db250ZXh0OiBDb250ZXh0KTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuX29Sb3V0aW5nU2VydmljZS5pc0N1cnJlbnRTdGF0ZUltcGFjdGVkQnkob0NvbnRleHQpO1xuXHR9XG5cblx0X2lzVmlld1BhcnRPZlJvdXRlKHJvdXRlSW5mb3JtYXRpb24/OiBSb3V0ZUluZm9ybWF0aW9uKTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgYVRhcmdldHMgPSByb3V0ZUluZm9ybWF0aW9uPy50YXJnZXRzO1xuXHRcdGlmICghYVRhcmdldHMgfHwgIWFUYXJnZXRzLmluY2x1ZGVzKHRoaXMuX29UYXJnZXRJbmZvcm1hdGlvbi50YXJnZXROYW1lKSkge1xuXHRcdFx0Ly8gSWYgdGhlIHRhcmdldCBmb3IgdGhpcyB2aWV3IGhhcyBhIHZpZXcgbGV2ZWwgZ3JlYXRlciB0aGFuIHRoZSByb3V0ZSBsZXZlbCwgaXQgbWVhbnMgdGhpcyB2aWV3IGNvbWVzIFwiYWZ0ZXJcIiB0aGUgcm91dGVcblx0XHRcdC8vIGluIHRlcm1zIG9mIG5hdmlnYXRpb24uXG5cdFx0XHQvLyBJbiBzdWNoIGNhc2UsIHdlIHJlbW92ZSBpdHMgYmluZGluZyBjb250ZXh0LCB0byBhdm9pZCB0aGlzIHZpZXcgdG8gaGF2ZSBkYXRhIGlmIHdlIG5hdmlnYXRlIHRvIGl0IGxhdGVyIG9uXG5cdFx0XHQvLyBUaGlzIGlzIGRvbmUgaW4gYSB0aW1lb3V0IHRvIGFsbG93IGZvciBmb2N1c291dCBldmVudHMgdG8gYmUgcHJvY2Vzc2VkIGJlZm9yZSBwcm9wZXJseSBpbiBjb2xsYWJvcmF0aXZlIGRyYWZ0XG5cdFx0XHRpZiAoKHRoaXMuX29UYXJnZXRJbmZvcm1hdGlvbi52aWV3TGV2ZWwgPz8gMCkgPj0gKHJvdXRlSW5mb3JtYXRpb24/LnJvdXRlTGV2ZWwgPz8gMCkpIHtcblx0XHRcdFx0c2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRcdFx0aWYgKHJvdXRlSW5mb3JtYXRpb24/LnJvdXRlTGV2ZWwgPT09IDAgJiYgdGhpcy5iYXNlLmNvbGxhYm9yYXRpdmVEcmFmdC5pc0Nvbm5lY3RlZCgpKSB7XG5cdFx0XHRcdFx0XHQvLyBUaGUgcm91dGUgaGFzIGxldmVsIDAgLS0+IHdlIG5lZWQgdG8gbGVhdmUgdGhlIGNvbGxhYm9yYXRpb24gc2Vzc2lvbiBhcyBubyBPUCBpcyBkaXNwbGF5ZWRcblx0XHRcdFx0XHRcdHRoaXMuYmFzZS5jb2xsYWJvcmF0aXZlRHJhZnQuZGlzY29ubmVjdCgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHR0aGlzLl9zZXRCaW5kaW5nQ29udGV4dChudWxsKTsgLy8gVGhpcyBhbHNvIGNhbGwgc2V0S2VlcEFsaXZlKGZhbHNlKSBvbiB0aGUgY3VycmVudCBjb250ZXh0XG5cdFx0XHRcdH0sIDApO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0X2J1aWxkQmluZGluZ1BhdGgoXG5cdFx0cm91dGVBcmd1bWVudHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG9iamVjdD4sXG5cdFx0YmluZGluZ1BhdHRlcm46IHN0cmluZyxcblx0XHRuYXZpZ2F0aW9uUGFyYW1ldGVyczogUm91dGluZ05hdmlnYXRpb25JbmZvXG5cdCk6IHsgcGF0aDogc3RyaW5nOyBkZWZlcnJlZDogYm9vbGVhbiB9IHtcblx0XHRsZXQgcGF0aCA9IGJpbmRpbmdQYXR0ZXJuLnJlcGxhY2UoXCI6P3F1ZXJ5OlwiLCBcIlwiKTtcblx0XHRsZXQgZGVmZXJyZWQgPSBmYWxzZTtcblxuXHRcdGZvciAoY29uc3Qgc0tleSBpbiByb3V0ZUFyZ3VtZW50cykge1xuXHRcdFx0Y29uc3Qgc1ZhbHVlID0gcm91dGVBcmd1bWVudHNbc0tleV07XG5cblx0XHRcdGlmICh0eXBlb2Ygc1ZhbHVlICE9PSBcInN0cmluZ1wiKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoc1ZhbHVlID09PSBcIi4uLlwiICYmIGJpbmRpbmdQYXR0ZXJuLmluY2x1ZGVzKGB7JHtzS2V5fX1gKSkge1xuXHRcdFx0XHRkZWZlcnJlZCA9IHRydWU7XG5cdFx0XHRcdC8vIFNvbWV0aW1lcyBpbiBwcmVmZXJyZWRNb2RlID0gY3JlYXRlLCB0aGUgZWRpdCBidXR0b24gaXMgc2hvd24gaW4gYmFja2dyb3VuZCB3aGVuIHRoZVxuXHRcdFx0XHQvLyBhY3Rpb24gcGFyYW1ldGVyIGRpYWxvZyBzaG93cyB1cCwgc2V0dGluZyBiVGFyZ2V0RWRpdGFibGUgcGFzc2VzIGVkaXRhYmxlIGFzIHRydWVcblx0XHRcdFx0Ly8gdG8gb25CZWZvcmVCaW5kaW5nIGluIF9iaW5kVGFyZ2V0UGFnZSBmdW5jdGlvblxuXHRcdFx0XHRuYXZpZ2F0aW9uUGFyYW1ldGVycy5iVGFyZ2V0RWRpdGFibGUgPSB0cnVlO1xuXHRcdFx0fVxuXHRcdFx0cGF0aCA9IHBhdGgucmVwbGFjZShgeyR7c0tleX19YCwgc1ZhbHVlKTtcblx0XHR9XG5cdFx0aWYgKChyb3V0ZUFyZ3VtZW50c1tcIj9xdWVyeVwiXSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KT8uW1wiaS1hY3Rpb25cIl0/LmluY2x1ZGVzKFwiY3JlYXRlXCIpKSB7XG5cdFx0XHRuYXZpZ2F0aW9uUGFyYW1ldGVycy5iQWN0aW9uQ3JlYXRlID0gdHJ1ZTtcblx0XHR9XG5cblx0XHQvLyB0aGUgYmluZGluZyBwYXRoIGlzIGFsd2F5cyBhYnNvbHV0ZVxuXHRcdGlmIChwYXRoICYmIHBhdGhbMF0gIT09IFwiL1wiKSB7XG5cdFx0XHRwYXRoID0gYC8ke3BhdGh9YDtcblx0XHR9XG5cblx0XHRyZXR1cm4geyBwYXRoLCBkZWZlcnJlZCB9O1xuXHR9XG5cblx0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblx0Ly8gTWV0aG9kcyB0byBiaW5kIHRoZSBwYWdlIHdoZW4gYSByb3V0ZSBpcyBtYXRjaGVkXG5cdC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cblx0LyoqXG5cdCAqIENhbGxlZCB3aGVuIGEgcm91dGUgaXMgbWF0Y2hlZC5cblx0ICogQnVpbGRzIHRoZSBiaW5kaW5nIGNvbnRleHQgZnJvbSB0aGUgbmF2aWdhdGlvbiBwYXJhbWV0ZXJzLCBhbmQgYmluZCB0aGUgcGFnZSBhY2NvcmRpbmdseS5cblx0ICpcblx0ICogQHBhcmFtIG9FdmVudFxuXHQgKi9cblx0X29uUm91dGVNYXRjaGVkKFxuXHRcdG9FdmVudDogRXZlbnQ8e1xuXHRcdFx0cm91dGVJbmZvcm1hdGlvbj86IFJvdXRlSW5mb3JtYXRpb247XG5cdFx0XHRyb3V0ZVBhdHRlcm46IHN0cmluZztcblx0XHRcdG5hdmlnYXRpb25JbmZvOiBSb3V0aW5nTmF2aWdhdGlvbkluZm87XG5cdFx0XHRhcmd1bWVudHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG9iamVjdD47XG5cdFx0fT5cblx0KTogdm9pZCB7XG5cdFx0Ly8gQ2hlY2sgaWYgdGhlIHRhcmdldCBmb3IgdGhpcyB2aWV3IGlzIHBhcnQgb2YgdGhlIGV2ZW50IHRhcmdldHMgKGkuZS4gaXMgYSB0YXJnZXQgZm9yIHRoZSBjdXJyZW50IHJvdXRlKS5cblx0XHQvLyBJZiBub3QsIHdlIGRvbid0IG5lZWQgdG8gYmluZCBpdCAtLT4gcmV0dXJuXG5cdFx0aWYgKCF0aGlzLl9pc1ZpZXdQYXJ0T2ZSb3V0ZShvRXZlbnQuZ2V0UGFyYW1ldGVyKFwicm91dGVJbmZvcm1hdGlvblwiKSkpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBSZXRyaWV2ZSB0aGUgYmluZGluZyBjb250ZXh0IHBhdHRlcm5cblx0XHRsZXQgYmluZGluZ1BhdHRlcm47XG5cdFx0aWYgKHRoaXMuX29QYWdlQ29tcG9uZW50ICYmIHRoaXMuX29QYWdlQ29tcG9uZW50LmdldEJpbmRpbmdDb250ZXh0UGF0dGVybikge1xuXHRcdFx0YmluZGluZ1BhdHRlcm4gPSB0aGlzLl9vUGFnZUNvbXBvbmVudC5nZXRCaW5kaW5nQ29udGV4dFBhdHRlcm4oKTtcblx0XHR9XG5cdFx0YmluZGluZ1BhdHRlcm4gPSBiaW5kaW5nUGF0dGVybiB8fCB0aGlzLl9vVGFyZ2V0SW5mb3JtYXRpb24uY29udGV4dFBhdHRlcm47XG5cblx0XHRpZiAoYmluZGluZ1BhdHRlcm4gPT09IG51bGwgfHwgYmluZGluZ1BhdHRlcm4gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Ly8gRG9uJ3QgZG8gdGhpcyBpZiB3ZSBhbHJlYWR5IGdvdCBzVGFyZ2V0ID09ICcnLCB3aGljaCBpcyBhIHZhbGlkIHRhcmdldCBwYXR0ZXJuXG5cdFx0XHRiaW5kaW5nUGF0dGVybiA9IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJyb3V0ZVBhdHRlcm5cIik7XG5cdFx0fVxuXG5cdFx0Ly8gUmVwbGFjZSB0aGUgcGFyYW1ldGVycyBieSB0aGVpciB2YWx1ZXMgaW4gdGhlIGJpbmRpbmcgY29udGV4dCBwYXR0ZXJuXG5cdFx0Y29uc3QgbUFyZ3VtZW50cyA9IG9FdmVudC5nZXRQYXJhbWV0ZXJzKCkuYXJndW1lbnRzO1xuXHRcdGNvbnN0IG9OYXZpZ2F0aW9uUGFyYW1ldGVycyA9IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJuYXZpZ2F0aW9uSW5mb1wiKTtcblx0XHRjb25zdCB7IHBhdGgsIGRlZmVycmVkIH0gPSB0aGlzLl9idWlsZEJpbmRpbmdQYXRoKG1Bcmd1bWVudHMsIGJpbmRpbmdQYXR0ZXJuLCBvTmF2aWdhdGlvblBhcmFtZXRlcnMpO1xuXG5cdFx0dGhpcy5vblJvdXRlTWF0Y2hlZCgpO1xuXG5cdFx0bGV0IGJpbmRQcm9taXNlO1xuXHRcdGNvbnN0IG9Nb2RlbCA9IHRoaXMuX29WaWV3LmdldE1vZGVsKCk7XG5cdFx0aWYgKGRlZmVycmVkKSB7XG5cdFx0XHRiaW5kUHJvbWlzZSA9IHRoaXMuX2JpbmREZWZlcnJlZChwYXRoLCBvTmF2aWdhdGlvblBhcmFtZXRlcnMpO1xuXHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRvTmF2aWdhdGlvblBhcmFtZXRlcnMucmVhc29uICE9PSBOYXZpZ2F0aW9uUmVhc29uLkVkaXRGbG93QWN0aW9uICYmXG5cdFx0XHQodGhpcy5fb1JvdXRlclByb3h5LmdldEhhc2goKS5pbmNsdWRlcyhcImktYWN0aW9uPWVkaXRcIikgfHwgKHRoaXMuX29QYWdlQ29tcG9uZW50Py5pc09wZW5JbkVkaXRNb2RlPy4oKSA/PyBmYWxzZSkpXG5cdFx0KSB7XG5cdFx0XHRiaW5kUHJvbWlzZSA9IHRoaXMuX2JpbmRQYWdlRm9yRWRpdChwYXRoLCBvTW9kZWwsIG9OYXZpZ2F0aW9uUGFyYW1ldGVycyk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGJpbmRQcm9taXNlID0gdGhpcy5fYmluZFBhZ2UocGF0aCwgb01vZGVsLCBvTmF2aWdhdGlvblBhcmFtZXRlcnMpO1xuXHRcdH1cblxuXHRcdGJpbmRQcm9taXNlXG5cdFx0XHQuZmluYWxseSgoKSA9PiB7XG5cdFx0XHRcdHRoaXMub25Sb3V0ZU1hdGNoZWRGaW5pc2hlZCgpO1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaCgoZXJyb3IpID0+IHtcblx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3IgZHVyaW5nIHBhZ2UgYmluZGluZyBcIiArIGVycm9yLnRvU3RyaW5nKCkpO1xuXHRcdFx0fSk7XG5cblx0XHR0aGlzLl9vQXBwQ29tcG9uZW50LmdldFJvb3RWaWV3Q29udHJvbGxlcigpLnVwZGF0ZVVJU3RhdGVGb3JWaWV3KHRoaXMuX29WaWV3LCB0aGlzLl9nZXRGQ0xMZXZlbCgpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBEZWZlcnJlZCBiaW5kaW5nIChkdXJpbmcgb2JqZWN0IGNyZWF0aW9uKS5cblx0ICpcblx0ICogQHBhcmFtIHRhcmdldFBhdGggVGhlIHBhdGggdG8gdGhlIGRlZmZlcmVkIGNvbnRleHRcblx0ICogQHBhcmFtIG5hdmlnYXRpb25QYXJhbWV0ZXJzIE5hdmlnYXRpb24gcGFyYW1ldGVyc1xuXHQgKiBAcmV0dXJucyBBIHByb21pc2Vcblx0ICovXG5cdGFzeW5jIF9iaW5kRGVmZXJyZWQodGFyZ2V0UGF0aDogc3RyaW5nLCBuYXZpZ2F0aW9uUGFyYW1ldGVyczogUm91dGluZ05hdmlnYXRpb25JbmZvKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0dGhpcy5iZWZvcmVTZXRCaW5kaW5nQ29udGV4dChudWxsLCB7IGVkaXRhYmxlOiBuYXZpZ2F0aW9uUGFyYW1ldGVycy5iVGFyZ2V0RWRpdGFibGUgfSk7XG5cblx0XHRpZiAoIW5hdmlnYXRpb25QYXJhbWV0ZXJzLmNyZWF0ZU9uTmF2aWdhdGVQYXJhbWV0ZXJzIHx8IG5hdmlnYXRpb25QYXJhbWV0ZXJzLmNyZWF0ZU9uTmF2aWdhdGVQYXJhbWV0ZXJzLm1vZGUgPT09IFwiRGVmZXJyZWRcIikge1xuXHRcdFx0Ly8gZWl0aGVyIHRoZSBjb250ZXh0IHNoYWxsIGJlIGNyZWF0ZWQgaW4gdGhlIHRhcmdldCBwYWdlIChkZWZlcnJlZCBDb250ZXh0KSBvciBpdCBzaGFsbFxuXHRcdFx0Ly8gYmUgY3JlYXRlZCBhc3luYyBidXQgdGhlIHVzZXIgcmVmcmVzaGVkIHRoZSBwYWdlIC8gYm9va21hcmtlZCB0aGlzIFVSTFxuXHRcdFx0Ly8gVE9ETzogY3VycmVudGx5IHRoZSB0YXJnZXQgY29tcG9uZW50IGNyZWF0ZXMgdGhpcyBkb2N1bWVudCBidXQgd2Ugc2hhbGwgbW92ZSB0aGlzIHRvXG5cdFx0XHQvLyBhIGNlbnRyYWwgcGxhY2Vcblx0XHRcdGlmICh0aGlzLl9vUGFnZUNvbXBvbmVudCAmJiB0aGlzLl9vUGFnZUNvbXBvbmVudC5jcmVhdGVEZWZlcnJlZENvbnRleHQpIHtcblx0XHRcdFx0dGhpcy5fb1BhZ2VDb21wb25lbnQuY3JlYXRlRGVmZXJyZWRDb250ZXh0KFxuXHRcdFx0XHRcdHRhcmdldFBhdGgsXG5cdFx0XHRcdFx0bmF2aWdhdGlvblBhcmFtZXRlcnMuY3JlYXRlT25OYXZpZ2F0ZVBhcmFtZXRlcnM/Lmxpc3RCaW5kaW5nLFxuXHRcdFx0XHRcdG5hdmlnYXRpb25QYXJhbWV0ZXJzLmNyZWF0ZU9uTmF2aWdhdGVQYXJhbWV0ZXJzPy5wYXJlbnRDb250ZXh0LFxuXHRcdFx0XHRcdG5hdmlnYXRpb25QYXJhbWV0ZXJzLmNyZWF0ZU9uTmF2aWdhdGVQYXJhbWV0ZXJzPy5kYXRhLFxuXHRcdFx0XHRcdCEhbmF2aWdhdGlvblBhcmFtZXRlcnMuYkFjdGlvbkNyZWF0ZVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGNvbnN0IGN1cnJlbnRCaW5kaW5nQ29udGV4dCA9IHRoaXMuX2dldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0aWYgKGN1cnJlbnRCaW5kaW5nQ29udGV4dD8uaGFzUGVuZGluZ0NoYW5nZXMoKSkge1xuXHRcdFx0Ly8gRm9yIG5vdyByZW1vdmUgdGhlIHBlbmRpbmcgY2hhbmdlcyB0byBhdm9pZCB0aGUgbW9kZWwgcmFpc2VzIGVycm9ycyBhbmQgdGhlIG9iamVjdCBwYWdlIGlzIGF0IGxlYXN0IGJvdW5kXG5cdFx0XHQvLyBJZGVhbGx5IHRoZSB1c2VyIHNob3VsZCBiZSBhc2tlZCBmb3Jcblx0XHRcdGN1cnJlbnRCaW5kaW5nQ29udGV4dC5nZXRCaW5kaW5nKCkucmVzZXRDaGFuZ2VzKCk7XG5cdFx0fVxuXG5cdFx0Ly8gcmVtb3ZlIHRoZSBjb250ZXh0IHRvIGF2b2lkIHNob3dpbmcgb2xkIGRhdGFcblx0XHR0aGlzLl9zZXRCaW5kaW5nQ29udGV4dChudWxsKTtcblxuXHRcdHRoaXMuYWZ0ZXJTZXRCaW5kaW5nQ29udGV4dChudWxsKTtcblxuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBiaW5kaW5nIGNvbnRleHQgZm9yIHRoZSBwYWdlIGZyb20gYSBwYXRoLCBpZiB0aGUgYXBwIGlzIHN0YXJ0ZWQgd2l0aCB0aGUgcHJlZmVycmVkIG1vZGUgZWRpdC5cblx0ICpcblx0ICogSWYgdGhlIGNvbnRleHQgcG9pbnRzIHRvIGFuIGFjdGl2ZSBlbnRpdHksIGl0IGlzIGRpcmVjdGx5IGNvbnZlcnRlZCB0byBkcmFmdCB1c2luZyB0aGUgRWRpdEZsb3cgY29udHJvbGxlciBleHRlbnNpb24uXG5cdCAqXG5cdCAqIEBwYXJhbSB0YXJnZXRQYXRoXG5cdCAqIEBwYXJhbSBtb2RlbFxuXHQgKiBAcGFyYW0gbmF2aWdhdGlvblBhcmFtZXRlcnNcblx0ICogQHJldHVybnMgQSBQcm9taXNlIHJlc29sdmVkIG9uY2UgdGhlIGJpbmRpbmcgaGFzIGJlZW4gc2V0IG9uIHRoZSBwYWdlXG5cdCAqL1xuXHRhc3luYyBfYmluZFBhZ2VGb3JFZGl0KHRhcmdldFBhdGg6IHN0cmluZywgbW9kZWw6IE9EYXRhTW9kZWwsIG5hdmlnYXRpb25QYXJhbWV0ZXJzOiBSb3V0aW5nTmF2aWdhdGlvbkluZm8pOiBQcm9taXNlPHZvaWQgfCBDb250ZXh0PiB7XG5cdFx0aWYgKHRhcmdldFBhdGggPT09IFwiXCIpIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5fYmluZFBhZ2VUb0NvbnRleHQobnVsbCwgbW9kZWwsIG5hdmlnYXRpb25QYXJhbWV0ZXJzKSk7XG5cdFx0fVxuXG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IHRlY2huaWNhbFBhdGg6IHN0cmluZyA9IGF3YWl0IHJlc29sdmVQYXRoKHRhcmdldFBhdGgsIG1vZGVsLCB0aGlzLl9vUm91dGluZ1NlcnZpY2UsIHRoaXMuX29Sb3V0ZXIpO1xuXHRcdFx0Y29uc3QgbWV0YU1vZGVsID0gbW9kZWwuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0XHQvLyBjaGVjayBmb3Igc3RpY2t5ICYgc3RpY2t5IGVkaXQgc2Vzc2lvblxuXHRcdFx0Y29uc3QgaXNTdGlja3lFZGl0TW9kZSA9IENvbW1vblV0aWxzLmlzU3RpY2t5RWRpdE1vZGUodGhpcy5iYXNlLmdldFZpZXcoKSk7XG5cdFx0XHRjb25zdCBpc1N0aWNreSA9IE1vZGVsSGVscGVyLmlzU3RpY2t5U2Vzc2lvblN1cHBvcnRlZChtZXRhTW9kZWwpO1xuXHRcdFx0aWYgKHRlY2huaWNhbFBhdGguaW5jbHVkZXMoXCJJc0FjdGl2ZUVudGl0eT10cnVlXCIpIHx8IChpc1N0aWNreSAmJiAhaXNTdGlja3lFZGl0TW9kZSkpIHtcblx0XHRcdFx0Ly8gY3JlYXRlIGNvbnRleHRcblx0XHRcdFx0Y29uc3QgYWN0aXZlQ29udGV4dCA9IHRoaXMuX2NyZWF0ZUNvbnRleHQodGVjaG5pY2FsUGF0aCwgbW9kZWwpO1xuXHRcdFx0XHR0aGlzLl9iaW5kUGFnZVRvQ29udGV4dChhY3RpdmVDb250ZXh0LCBtb2RlbCwgbmF2aWdhdGlvblBhcmFtZXRlcnMpO1xuXHRcdFx0XHRpZiAoaXNTdGlja3kpIHtcblx0XHRcdFx0XHQvLyBLZXkgbmVlZHMgdG8gYmUgYXZhaWxhYmxlIGZvciB0aGUgZWRpdGluZyB0byB3b3JrIGluIHRoZSBzdGlja3kgdXNlIGNhc2Vcblx0XHRcdFx0XHRjb25zdCBtZXRhUGF0aCA9IG1ldGFNb2RlbC5nZXRNZXRhUGF0aCh0ZWNobmljYWxQYXRoKTtcblx0XHRcdFx0XHRjb25zdCBrZXlQcm9wZXJ0eSA9IG1ldGFNb2RlbC5nZXRPYmplY3QoYCR7bWV0YVBhdGh9LyRUeXBlLyRLZXlgKTtcblx0XHRcdFx0XHRhd2FpdCBhY3RpdmVDb250ZXh0LnJlcXVlc3RQcm9wZXJ0eShrZXlQcm9wZXJ0eSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gSXNBY3RpdmVFbnRpdHkgbmVlZHMgdG8gYmUgYXZhaWxhYmxlIGZvciB0aGUgZWRpdGluZyB0byB3b3JrIGluIHRoZSBkcmFmdCB1c2UgY2FzZVxuXHRcdFx0XHRcdGF3YWl0IGFjdGl2ZUNvbnRleHQucmVxdWVzdFByb3BlcnR5KFwiSXNBY3RpdmVFbnRpdHlcIik7XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly8gZWRpdCBkb2N1bWVudFxuXHRcdFx0XHRyZXR1cm4gYXdhaXQgdGhpcy5iYXNlLmVkaXRGbG93LmVkaXREb2N1bWVudChhY3RpdmVDb250ZXh0KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLl9iaW5kUGFnZVRvUGF0aCh0ZWNobmljYWxQYXRoLCBtb2RlbCwgbmF2aWdhdGlvblBhcmFtZXRlcnMpO1xuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRjb25zdCByZXNvdXJjZUJ1bmRsZSA9IExpYnJhcnkuZ2V0UmVzb3VyY2VCdW5kbGVGb3IoXCJzYXAuZmUuY29yZVwiKSE7XG5cblx0XHRcdHRoaXMubmF2aWdhdGVUb01lc3NhZ2VQYWdlKHJlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0NPTU1PTl9TQVBGRV9EQVRBX1JFQ0VJVkVEX0VSUk9SXCIpLCB7XG5cdFx0XHRcdHRpdGxlOiByZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19DT01NT05fU0FQRkVfRVJST1JcIiksXG5cdFx0XHRcdGRlc2NyaXB0aW9uOiAoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2Vcblx0XHRcdH0pO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBiaW5kaW5nIGNvbnRleHQgb2YgdGhlIHBhZ2UgZnJvbSBhIHBhdGguXG5cdCAqXG5cdCAqIEBwYXJhbSB0YXJnZXRQYXRoIFRoZSBwYXRoIHRvIHRoZSBjb250ZXh0XG5cdCAqIEBwYXJhbSBtb2RlbCBUaGUgT0RhdGEgbW9kZWxcblx0ICogQHBhcmFtIG5hdmlnYXRpb25QYXJhbWV0ZXJzIE5hdmlnYXRpb24gcGFyYW1ldGVyc1xuXHQgKiBAcmV0dXJucyBBIFByb21pc2UgcmVzb2x2ZWQgb25jZSB0aGUgYmluZGluZyBvbiB0aGUgcGFnZSBpcyBzZXRcblx0ICovXG5cdGFzeW5jIF9iaW5kUGFnZSh0YXJnZXRQYXRoOiBzdHJpbmcsIG1vZGVsOiBPRGF0YU1vZGVsLCBuYXZpZ2F0aW9uUGFyYW1ldGVyczogUm91dGluZ05hdmlnYXRpb25JbmZvKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0aWYgKHRhcmdldFBhdGggPT09IFwiXCIpIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5fYmluZFBhZ2VUb0NvbnRleHQobnVsbCwgbW9kZWwsIG5hdmlnYXRpb25QYXJhbWV0ZXJzKSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc29sdmVQYXRoKHRhcmdldFBhdGgsIG1vZGVsLCB0aGlzLl9vUm91dGluZ1NlcnZpY2UsIHRoaXMuX29Sb3V0ZXIpXG5cdFx0XHQudGhlbigodGVjaG5pY2FsUGF0aDogc3RyaW5nKTogdm9pZCA9PiB7XG5cdFx0XHRcdHJldHVybiB0aGlzLl9iaW5kUGFnZVRvUGF0aCh0ZWNobmljYWxQYXRoLCBtb2RlbCwgbmF2aWdhdGlvblBhcmFtZXRlcnMpO1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaCgoZXJyb3I6IHVua25vd24pID0+IHtcblx0XHRcdFx0Ly8gRXJyb3IgaGFuZGxpbmcgZm9yIGVycm9uZW91cyBtZXRhZGF0YSByZXF1ZXN0XG5cdFx0XHRcdGNvbnN0IHJlc291cmNlQnVuZGxlID0gTGlicmFyeS5nZXRSZXNvdXJjZUJ1bmRsZUZvcihcInNhcC5mZS5jb3JlXCIpITtcblxuXHRcdFx0XHR0aGlzLm5hdmlnYXRlVG9NZXNzYWdlUGFnZShyZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19DT01NT05fU0FQRkVfREFUQV9SRUNFSVZFRF9FUlJPUlwiKSwge1xuXHRcdFx0XHRcdHRpdGxlOiByZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19DT01NT05fU0FQRkVfRVJST1JcIiksXG5cdFx0XHRcdFx0ZGVzY3JpcHRpb246IChlcnJvciBhcyBFcnJvcikubWVzc2FnZVxuXHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgdGhlIGJpbmRpbmcgY29udGV4dCBmb3IgdGhlIHBhZ2UgZnJvbSBhIHBhdGguXG5cdCAqXG5cdCAqIEBwYXJhbSBzVGFyZ2V0UGF0aCBUaGUgcGF0aCB0byBidWlsZCB0aGUgY29udGV4dCAodGhpcyBpcyBhIHBhdGggaW4gdGhlIG1vZGVsLCBzbyBvbmx5IHRlY2huaWNhbCBrZXlzIGFyZSBhbGxvd2VkKS5cblx0ICogQHBhcmFtIG9Nb2RlbCBUaGUgT0RhdGEgbW9kZWxcblx0ICogQHBhcmFtIG9OYXZpZ2F0aW9uUGFyYW1ldGVycyBOYXZpZ2F0aW9uIHBhcmFtZXRlcnNcblx0ICovXG5cdF9iaW5kUGFnZVRvUGF0aChzVGFyZ2V0UGF0aDogc3RyaW5nLCBvTW9kZWw6IE9EYXRhTW9kZWwsIG9OYXZpZ2F0aW9uUGFyYW1ldGVyczogUm91dGluZ05hdmlnYXRpb25JbmZvKTogdm9pZCB7XG5cdFx0Y29uc3Qgb0N1cnJlbnRDb250ZXh0ID0gdGhpcy5fZ2V0QmluZGluZ0NvbnRleHQoKSxcblx0XHRcdHNDdXJyZW50UGF0aCA9IG9DdXJyZW50Q29udGV4dCAmJiBvQ3VycmVudENvbnRleHQuZ2V0UGF0aCgpLFxuXHRcdFx0b1VzZUNvbnRleHQgPSBvTmF2aWdhdGlvblBhcmFtZXRlcnMudXNlQ29udGV4dCBhcyBDb250ZXh0IHwgdW5kZWZpbmVkIHwgbnVsbDtcblxuXHRcdGNvbnN0IG9Sb290Vmlld0NvbnRyb2xsZXIgPSB0aGlzLl9vQXBwQ29tcG9uZW50LmdldFJvb3RWaWV3Q29udHJvbGxlcigpO1xuXG5cdFx0Ly8gV2Ugc2V0IHRoZSBiaW5kaW5nIGNvbnRleHQgb25seSBpZiBpdCdzIGRpZmZlcmVudCBmcm9tIHRoZSBjdXJyZW50IG9uZVxuXHRcdC8vIG9yIGlmIHdlIGhhdmUgYSBjb250ZXh0IGFscmVhZHkgc2VsZWN0ZWRcblx0XHRpZiAob1VzZUNvbnRleHQgJiYgb1VzZUNvbnRleHQuZ2V0UGF0aCgpID09PSBzVGFyZ2V0UGF0aCkge1xuXHRcdFx0aWYgKG9Vc2VDb250ZXh0ICE9PSBvQ3VycmVudENvbnRleHQpIHtcblx0XHRcdFx0bGV0IHNob3VsZFJlZnJlc2hDb250ZXh0ID0gZmFsc2U7XG5cdFx0XHRcdC8vIFdlIGFscmVhZHkgaGF2ZSB0aGUgY29udGV4dCB0byBiZSB1c2VkLCBhbmQgaXQncyBub3QgdGhlIGN1cnJlbnQgb25lXG5cblx0XHRcdFx0Ly8gSW4gY2FzZSBvZiBGQ0wsIGlmIHdlJ3JlIHJldXNpbmcgYSBjb250ZXh0IGZyb20gYSB0YWJsZSAodGhyb3VnaCBuYXZpZ2F0aW9uKSwgd2UgcmVmcmVzaCBpdCB0byBhdm9pZCBvdXRkYXRlZCBkYXRhXG5cdFx0XHRcdC8vIFdlIGRvbid0IHdhaXQgZm9yIHRoZSByZWZyZXNoIHRvIGJlIGNvbXBsZXRlZCAocmVxdWVzdFJlZnJlc2gpLCBzbyB0aGF0IHRoZSBjb3JyZXNwb25kaW5nIHF1ZXJ5IGdvZXMgaW50byB0aGUgc2FtZVxuXHRcdFx0XHQvLyBiYXRjaCBhcyB0aGUgb25lcyBmcm9tIGNvbnRyb2xzIGluIHRoZSBwYWdlLlxuXHRcdFx0XHRpZiAob1Jvb3RWaWV3Q29udHJvbGxlci5pc0ZjbEVuYWJsZWQoKSAmJiBvTmF2aWdhdGlvblBhcmFtZXRlcnMucmVhc29uID09PSBOYXZpZ2F0aW9uUmVhc29uLlJvd1ByZXNzKSB7XG5cdFx0XHRcdFx0Y29uc3QgbWV0YU1vZGVsID0gb1VzZUNvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKTtcblx0XHRcdFx0XHRpZiAoIW9Vc2VDb250ZXh0LmdldEJpbmRpbmcoKS5oYXNQZW5kaW5nQ2hhbmdlcygpKSB7XG5cdFx0XHRcdFx0XHRzaG91bGRSZWZyZXNoQ29udGV4dCA9IHRydWU7XG5cdFx0XHRcdFx0fSBlbHNlIGlmIChcblx0XHRcdFx0XHRcdHRoaXMuYmFzZS5jb2xsYWJvcmF0aXZlRHJhZnQuaXNDb25uZWN0ZWQoKSB8fFxuXHRcdFx0XHRcdFx0KE1vZGVsSGVscGVyLmlzRHJhZnRTdXBwb3J0ZWQobWV0YU1vZGVsLCBvVXNlQ29udGV4dC5nZXRQYXRoKCkpICYmXG5cdFx0XHRcdFx0XHRcdE1vZGVsSGVscGVyLmlzQ29sbGFib3JhdGlvbkRyYWZ0U3VwcG9ydGVkKG1ldGFNb2RlbCkpXG5cdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHQvLyBJZiB0aGVyZSBhcmUgcGVuZGluZyBjaGFuZ2VzIGJ1dCB3ZSdyZSBpbiBjb2xsYWJvcmF0aW9uIGRyYWZ0LCB3ZSBmb3JjZSB0aGUgcmVmcmVzaCAoZGlzY2FyZGluZyBwZW5kaW5nIGNoYW5nZXMpIGFzIHdlIG5lZWQgdG8gaGF2ZSB0aGUgbGF0ZXN0IHZlcnNpb24uXG5cdFx0XHRcdFx0XHQvLyBXaGVuIG5hdmlnYXRpbmcgZnJvbSBMUiB0byBPUCwgdGhlIHZpZXcgaXMgbm90IGNvbm5lY3RlZCB5ZXQgLS0+IGNoZWNrIGlmIHdlJ3JlIGluIGRyYWZ0IHdpdGggY29sbGFib3JhdGlvbiBmcm9tIHRoZSBtZXRhbW9kZWxcblx0XHRcdFx0XHRcdG9Vc2VDb250ZXh0LmdldEJpbmRpbmcoKS5yZXNldENoYW5nZXMoKTtcblx0XHRcdFx0XHRcdHNob3VsZFJlZnJlc2hDb250ZXh0ID0gdHJ1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhpcy5fYmluZFBhZ2VUb0NvbnRleHQob1VzZUNvbnRleHQsIG9Nb2RlbCwgb05hdmlnYXRpb25QYXJhbWV0ZXJzKTtcblx0XHRcdFx0aWYgKHNob3VsZFJlZnJlc2hDb250ZXh0KSB7XG5cdFx0XHRcdFx0dGhpcy5fb0FwcENvbXBvbmVudFxuXHRcdFx0XHRcdFx0LmdldFNpZGVFZmZlY3RzU2VydmljZSgpXG5cdFx0XHRcdFx0XHQucmVxdWVzdFNpZGVFZmZlY3RzKFtcIipcIl0sIG9Vc2VDb250ZXh0LCBvVXNlQ29udGV4dC5nZXRCaW5kaW5nKCkuZ2V0R3JvdXBJZCgpKVxuXHRcdFx0XHRcdFx0LmNhdGNoKChlcnIpID0+IHtcblx0XHRcdFx0XHRcdFx0TG9nLmVycm9yKGBDYW5ub3QgcmVmcmVzaCBjb250ZXh0OiAke2Vycn1gKTtcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5yZWFzb24gPT09IE5hdmlnYXRpb25SZWFzb24uRWRpdEZsb3dBY3Rpb24pIHtcblx0XHRcdFx0Ly8gV2UgaGF2ZSB0aGUgc2FtZSBjb250ZXh0IGJ1dCBhbiBlZGl0ZmxvdyBhY3Rpb24gaGFwcGVuZWQgKGUuZy4gQ2FuY2VsRG9jdW1lbnQgaW4gc3RpY2t5IG1vZGUpXG5cdFx0XHRcdC8vIC0tPiBXZSBuZWVkIHRvIGNhbGwgb25CZWZvcmUvQWZ0ZXJCaW5kaW5nIHRvIHJlZnJlc2ggdGhlIG9iamVjdCBwYWdlIHByb3Blcmx5XG5cdFx0XHRcdHRoaXMuYmVmb3JlU2V0QmluZGluZ0NvbnRleHQob1VzZUNvbnRleHQsIHtcblx0XHRcdFx0XHRlZGl0YWJsZTogb05hdmlnYXRpb25QYXJhbWV0ZXJzLmJUYXJnZXRFZGl0YWJsZSxcblx0XHRcdFx0XHRsaXN0QmluZGluZzogb1VzZUNvbnRleHQuZ2V0QmluZGluZygpLFxuXHRcdFx0XHRcdGJQZXJzaXN0T1BTY3JvbGw6IG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5iUGVyc2lzdE9QU2Nyb2xsLFxuXHRcdFx0XHRcdHJlYXNvbjogb05hdmlnYXRpb25QYXJhbWV0ZXJzLnJlYXNvbixcblx0XHRcdFx0XHRzaG93UGxhY2Vob2xkZXI6IG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5iU2hvd1BsYWNlaG9sZGVyXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHR0aGlzLmFmdGVyU2V0QmluZGluZ0NvbnRleHQob1VzZUNvbnRleHQsIHsgcmVkaXJlY3RlZFRvTm9uRHJhZnQ6IG9OYXZpZ2F0aW9uUGFyYW1ldGVycz8ucmVkaXJlY3RlZFRvTm9uRHJhZnQgfSk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChzQ3VycmVudFBhdGggIT09IHNUYXJnZXRQYXRoIHx8IG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5yZWFzb24gPT09IE5hdmlnYXRpb25SZWFzb24uRWRpdEZsb3dBY3Rpb24pIHtcblx0XHRcdC8vIFdlIG5lZWQgdG8gY3JlYXRlIGEgbmV3IGNvbnRleHQgZm9yIGl0cyBwYXRoXG5cdFx0XHR0aGlzLl9iaW5kUGFnZVRvQ29udGV4dCh0aGlzLl9jcmVhdGVDb250ZXh0KHNUYXJnZXRQYXRoLCBvTW9kZWwpLCBvTW9kZWwsIG9OYXZpZ2F0aW9uUGFyYW1ldGVycyk7XG5cdFx0fSBlbHNlIGlmIChcblx0XHRcdG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5yZWFzb24gIT09IE5hdmlnYXRpb25SZWFzb24uQXBwU3RhdGVDaGFuZ2VkICYmXG5cdFx0XHRvTmF2aWdhdGlvblBhcmFtZXRlcnMucmVhc29uICE9PSBOYXZpZ2F0aW9uUmVhc29uLlJlc3RvcmVIaXN0b3J5ICYmXG5cdFx0XHRFZGl0U3RhdGUuaXNFZGl0U3RhdGVEaXJ0eSgpICYmXG5cdFx0XHQhb1Jvb3RWaWV3Q29udHJvbGxlci5pc0ZjbEVuYWJsZWQoKSAmJlxuXHRcdFx0b0N1cnJlbnRDb250ZXh0XG5cdFx0KSB7XG5cdFx0XHR0aGlzLl9yZWZyZXNoQmluZGluZ0NvbnRleHQob0N1cnJlbnRDb250ZXh0KTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQmluZHMgdGhlIHBhZ2UgdG8gYSBjb250ZXh0LlxuXHQgKlxuXHQgKiBAcGFyYW0gb0NvbnRleHQgQ29udGV4dCB0byBiZSBib3VuZFxuXHQgKiBAcGFyYW0gb01vZGVsIFRoZSBPRGF0YSBtb2RlbFxuXHQgKiBAcGFyYW0gb05hdmlnYXRpb25QYXJhbWV0ZXJzIE5hdmlnYXRpb24gcGFyYW1ldGVyc1xuXHQgKi9cblx0X2JpbmRQYWdlVG9Db250ZXh0KG9Db250ZXh0OiBDb250ZXh0IHwgbnVsbCwgb01vZGVsOiBPRGF0YU1vZGVsLCBvTmF2aWdhdGlvblBhcmFtZXRlcnM6IFJvdXRpbmdOYXZpZ2F0aW9uSW5mbyk6IHZvaWQge1xuXHRcdGlmICghb0NvbnRleHQpIHtcblx0XHRcdHRoaXMuYmVmb3JlU2V0QmluZGluZ0NvbnRleHQobnVsbCk7XG5cdFx0XHR0aGlzLmFmdGVyU2V0QmluZGluZ0NvbnRleHQobnVsbCk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y29uc3Qgb1BhcmVudExpc3RCaW5kaW5nID0gb0NvbnRleHQuZ2V0QmluZGluZygpO1xuXHRcdGNvbnN0IG9Sb290Vmlld0NvbnRyb2xsZXIgPSB0aGlzLl9vQXBwQ29tcG9uZW50LmdldFJvb3RWaWV3Q29udHJvbGxlcigpO1xuXHRcdGlmIChvUm9vdFZpZXdDb250cm9sbGVyLmlzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRpZiAoIW9QYXJlbnRMaXN0QmluZGluZyB8fCAhb1BhcmVudExpc3RCaW5kaW5nLmlzQShcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nXCIpKSB7XG5cdFx0XHRcdC8vIGlmIHRoZSBwYXJlbnRCaW5kaW5nIGlzIG5vdCBhIGxpc3RCaW5kaW5nLCB3ZSBjcmVhdGUgYSBuZXcgY29udGV4dFxuXHRcdFx0XHRvQ29udGV4dCA9IHRoaXMuX2NyZWF0ZUNvbnRleHQob0NvbnRleHQuZ2V0UGF0aCgpLCBvTW9kZWwpO1xuXHRcdFx0fVxuXG5cdFx0XHR0cnkge1xuXHRcdFx0XHR0aGlzLl9zZXRLZWVwQWxpdmUoXG5cdFx0XHRcdFx0b0NvbnRleHQsXG5cdFx0XHRcdFx0dHJ1ZSxcblx0XHRcdFx0XHQoKSA9PiB7XG5cdFx0XHRcdFx0XHRpZiAob0NvbnRleHQgJiYgIXRoaXMuX29BcHBDb21wb25lbnQuaXNFeGl0aW5nICYmIG9Sb290Vmlld0NvbnRyb2xsZXIuaXNDb250ZXh0VXNlZEluUGFnZXMob0NvbnRleHQpKSB7XG5cdFx0XHRcdFx0XHRcdHRoaXMubmF2aWdhdGVCYWNrRnJvbUNvbnRleHQob0NvbnRleHQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0dHJ1ZSAvLyBMb2FkIG1lc3NhZ2VzLCBvdGhlcndpc2UgdGhleSBkb24ndCBnZXQgcmVmcmVzaGVkIGxhdGVyLCBlLmcuIGZvciBzaWRlIGVmZmVjdHNcblx0XHRcdFx0KTtcblx0XHRcdH0gY2F0Y2ggKG9FcnJvcikge1xuXHRcdFx0XHQvLyBzZXRLZWVwQWxpdmUgdGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiB0aGUgcGFyZW50IGxpc3RiaW5kaW5nIGRvZXNuJ3QgaGF2ZSAkJG93blJlcXVlc3Q9dHJ1ZVxuXHRcdFx0XHQvLyBUaGlzIGNhc2UgZm9yIGN1c3RvbSBmcmFnbWVudHMgaXMgc3VwcG9ydGVkLCBidXQgYW4gZXJyb3IgaXMgbG9nZ2VkIHRvIG1ha2UgdGhlIGxhY2sgb2Ygc3luY2hyb25pemF0aW9uIGFwcGFyZW50XG5cdFx0XHRcdExvZy5lcnJvcihcblx0XHRcdFx0XHRgVmlldyBmb3IgJHtvQ29udGV4dC5nZXRQYXRoKCl9IHdvbid0IGJlIHN5bmNocm9uaXplZC4gUGFyZW50IGxpc3RCaW5kaW5nIG11c3QgaGF2ZSBiaW5kaW5nIHBhcmFtZXRlciAkJG93blJlcXVlc3Q9dHJ1ZWBcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKCFvUGFyZW50TGlzdEJpbmRpbmcgfHwgb1BhcmVudExpc3RCaW5kaW5nLmlzQShcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nXCIpKSB7XG5cdFx0XHQvLyBXZSBuZWVkIHRvIHJlY3JlYXRlIHRoZSBjb250ZXh0IG90aGVyd2lzZSB3ZSBnZXQgZXJyb3JzXG5cdFx0XHRvQ29udGV4dCA9IHRoaXMuX2NyZWF0ZUNvbnRleHQob0NvbnRleHQuZ2V0UGF0aCgpLCBvTW9kZWwpO1xuXHRcdH1cblxuXHRcdC8vIFNldCB0aGUgYmluZGluZyBjb250ZXh0IHdpdGggdGhlIHByb3BlciBiZWZvcmUvYWZ0ZXIgY2FsbGJhY2tzXG5cdFx0dGhpcy5iZWZvcmVTZXRCaW5kaW5nQ29udGV4dChvQ29udGV4dCwge1xuXHRcdFx0ZWRpdGFibGU6IG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5iVGFyZ2V0RWRpdGFibGUsXG5cdFx0XHRsaXN0QmluZGluZzogb1BhcmVudExpc3RCaW5kaW5nLFxuXHRcdFx0YlBlcnNpc3RPUFNjcm9sbDogb05hdmlnYXRpb25QYXJhbWV0ZXJzLmJQZXJzaXN0T1BTY3JvbGwsXG5cdFx0XHRyZWFzb246IG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5yZWFzb24sXG5cdFx0XHRzaG93UGxhY2Vob2xkZXI6IG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5iU2hvd1BsYWNlaG9sZGVyXG5cdFx0fSk7XG5cblx0XHR0aGlzLl9zZXRCaW5kaW5nQ29udGV4dChvQ29udGV4dCk7XG5cdFx0dGhpcy5hZnRlclNldEJpbmRpbmdDb250ZXh0KG9Db250ZXh0LCB7IHJlZGlyZWN0ZWRUb05vbkRyYWZ0OiBvTmF2aWdhdGlvblBhcmFtZXRlcnM/LnJlZGlyZWN0ZWRUb05vbkRyYWZ0IH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBjb250ZXh0IGZyb20gYSBwYXRoLlxuXHQgKlxuXHQgKiBAcGFyYW0gc1BhdGggVGhlIHBhdGhcblx0ICogQHBhcmFtIG9Nb2RlbCBUaGUgT0RhdGEgbW9kZWxcblx0ICogQHJldHVybnMgVGhlIGNyZWF0ZWQgY29udGV4dFxuXHQgKi9cblx0X2NyZWF0ZUNvbnRleHQoc1BhdGg6IHN0cmluZywgb01vZGVsOiBPRGF0YU1vZGVsKTogQ29udGV4dCB7XG5cdFx0Y29uc3Qgb1BhZ2VDb21wb25lbnQgPSB0aGlzLl9vUGFnZUNvbXBvbmVudCxcblx0XHRcdHNFbnRpdHlTZXQgPSBvUGFnZUNvbXBvbmVudCAmJiBvUGFnZUNvbXBvbmVudC5nZXRFbnRpdHlTZXQgJiYgb1BhZ2VDb21wb25lbnQuZ2V0RW50aXR5U2V0KCksXG5cdFx0XHRzQ29udGV4dFBhdGggPVxuXHRcdFx0XHQob1BhZ2VDb21wb25lbnQgJiYgb1BhZ2VDb21wb25lbnQuZ2V0Q29udGV4dFBhdGggJiYgb1BhZ2VDb21wb25lbnQuZ2V0Q29udGV4dFBhdGgoKSkgfHwgKHNFbnRpdHlTZXQgJiYgYC8ke3NFbnRpdHlTZXR9YCksXG5cdFx0XHRvTWV0YU1vZGVsID0gb01vZGVsLmdldE1ldGFNb2RlbCgpLFxuXHRcdFx0bVBhcmFtZXRlcnM6IEJpbmRDb250ZXh0UGFyYW1ldGVycyA9IHtcblx0XHRcdFx0JCRncm91cElkOiBcIiRhdXRvLkhlcm9lc1wiLFxuXHRcdFx0XHQkJHVwZGF0ZUdyb3VwSWQ6IFwiJGF1dG9cIixcblx0XHRcdFx0JCRwYXRjaFdpdGhvdXRTaWRlRWZmZWN0czogdHJ1ZVxuXHRcdFx0fTtcblx0XHQvLyBJbiBjYXNlIG9mIGRyYWZ0OiAkc2VsZWN0IHRoZSBzdGF0ZSBmbGFncyAoSGFzQWN0aXZlRW50aXR5LCBIYXNEcmFmdEVudGl0eSwgYW5kIElzQWN0aXZlRW50aXR5KVxuXHRcdGNvbnN0IG9EcmFmdFJvb3QgPSBvTWV0YU1vZGVsLmdldE9iamVjdChgJHtzQ29udGV4dFBhdGh9QGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EcmFmdFJvb3RgKTtcblx0XHRjb25zdCBvRHJhZnROb2RlID0gb01ldGFNb2RlbC5nZXRPYmplY3QoYCR7c0NvbnRleHRQYXRofUBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnROb2RlYCk7XG5cdFx0Y29uc3Qgb1Jvb3RWaWV3Q29udHJvbGxlciA9IHRoaXMuX29BcHBDb21wb25lbnQuZ2V0Um9vdFZpZXdDb250cm9sbGVyKCk7XG5cdFx0aWYgKG9Sb290Vmlld0NvbnRyb2xsZXIuaXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdGNvbnN0IG9Db250ZXh0ID0gdGhpcy5fZ2V0S2VlcEFsaXZlQ29udGV4dChvTW9kZWwsIHNQYXRoLCBmYWxzZSwgbVBhcmFtZXRlcnMpO1xuXHRcdFx0aWYgKCFvQ29udGV4dCkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBjcmVhdGUga2VlcEFsaXZlIGNvbnRleHQgJHtzUGF0aH1gKTtcblx0XHRcdH0gZWxzZSBpZiAob0RyYWZ0Um9vdCB8fCBvRHJhZnROb2RlKSB7XG5cdFx0XHRcdGlmIChvQ29udGV4dC5nZXRQcm9wZXJ0eShcIklzQWN0aXZlRW50aXR5XCIpID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRvQ29udGV4dC5yZXF1ZXN0UHJvcGVydHkoW1wiSGFzQWN0aXZlRW50aXR5XCIsIFwiSGFzRHJhZnRFbnRpdHlcIiwgXCJJc0FjdGl2ZUVudGl0eVwiXSk7XG5cdFx0XHRcdFx0aWYgKG9EcmFmdFJvb3QpIHtcblx0XHRcdFx0XHRcdG9Db250ZXh0LnJlcXVlc3RPYmplY3QoXCJEcmFmdEFkbWluaXN0cmF0aXZlRGF0YVwiKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gd2hlbiBzd2l0Y2hpbmcgYmV0d2VlbiBkcmFmdCBhbmQgZWRpdCB3ZSBuZWVkIHRvIGVuc3VyZSB0aG9zZSBwcm9wZXJ0aWVzIGFyZSByZXF1ZXN0ZWQgYWdhaW4gZXZlbiBpZiB0aGV5IGFyZSBpbiB0aGUgYmluZGluZydzIGNhY2hlXG5cdFx0XHRcdFx0Ly8gb3RoZXJ3aXNlIHdoZW4geW91IGVkaXQgYW5kIGdvIHRvIHRoZSBzYXZlZCB2ZXJzaW9uIHlvdSBoYXZlIG5vIHdheSBvZiBzd2l0Y2hpbmcgYmFjayB0byB0aGUgZWRpdCB2ZXJzaW9uXG5cdFx0XHRcdFx0b0NvbnRleHQucmVxdWVzdFNpZGVFZmZlY3RzKFxuXHRcdFx0XHRcdFx0b0RyYWZ0Um9vdFxuXHRcdFx0XHRcdFx0XHQ/IFtcIkhhc0FjdGl2ZUVudGl0eVwiLCBcIkhhc0RyYWZ0RW50aXR5XCIsIFwiSXNBY3RpdmVFbnRpdHlcIiwgXCJEcmFmdEFkbWluaXN0cmF0aXZlRGF0YVwiXVxuXHRcdFx0XHRcdFx0XHQ6IFtcIkhhc0FjdGl2ZUVudGl0eVwiLCBcIkhhc0RyYWZ0RW50aXR5XCIsIFwiSXNBY3RpdmVFbnRpdHlcIl1cblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBvQ29udGV4dDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0aWYgKHNDb250ZXh0UGF0aCkge1xuXHRcdFx0XHRjb25zdCBzTWVzc2FnZXNQYXRoID0gTW9kZWxIZWxwZXIuZ2V0TWVzc2FnZXNQYXRoKG9NZXRhTW9kZWwsIHNDb250ZXh0UGF0aCk7XG5cdFx0XHRcdGlmIChzTWVzc2FnZXNQYXRoKSB7XG5cdFx0XHRcdFx0bVBhcmFtZXRlcnMuJHNlbGVjdCA9IHNNZXNzYWdlc1BhdGg7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gSW4gY2FzZSBvZiBkcmFmdDogJHNlbGVjdCB0aGUgc3RhdGUgZmxhZ3MgKEhhc0FjdGl2ZUVudGl0eSwgSGFzRHJhZnRFbnRpdHksIGFuZCBJc0FjdGl2ZUVudGl0eSlcblx0XHRcdGlmIChvRHJhZnRSb290IHx8IG9EcmFmdE5vZGUpIHtcblx0XHRcdFx0aWYgKG1QYXJhbWV0ZXJzLiRzZWxlY3QgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdG1QYXJhbWV0ZXJzLiRzZWxlY3QgPSBcIkhhc0FjdGl2ZUVudGl0eSxIYXNEcmFmdEVudGl0eSxJc0FjdGl2ZUVudGl0eVwiO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdG1QYXJhbWV0ZXJzLiRzZWxlY3QgKz0gXCIsSGFzQWN0aXZlRW50aXR5LEhhc0RyYWZ0RW50aXR5LElzQWN0aXZlRW50aXR5XCI7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmICh0aGlzLl9vVmlldy5nZXRCaW5kaW5nQ29udGV4dCgpKSB7XG5cdFx0XHRcdGNvbnN0IG9QcmV2aW91c0JpbmRpbmcgPSB0aGlzLl9vVmlldy5nZXRCaW5kaW5nQ29udGV4dCgpPy5nZXRCaW5kaW5nKCk7XG5cdFx0XHRcdGlmIChvUHJldmlvdXNCaW5kaW5nKSB7XG5cdFx0XHRcdFx0b01vZGVsLnJlc2V0Q2hhbmdlcyhvUHJldmlvdXNCaW5kaW5nLmdldFVwZGF0ZUdyb3VwSWQoKSk7XG5cdFx0XHRcdFx0b1ByZXZpb3VzQmluZGluZy5kZXN0cm95KCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Y29uc3Qgb0hpZGRlbkJpbmRpbmcgPSBvTW9kZWwuYmluZENvbnRleHQoc1BhdGgsIHVuZGVmaW5lZCwgbVBhcmFtZXRlcnMpO1xuXG5cdFx0XHRvSGlkZGVuQmluZGluZy5hdHRhY2hFdmVudE9uY2UoXCJkYXRhUmVxdWVzdGVkXCIsICgpID0+IHtcblx0XHRcdFx0QnVzeUxvY2tlci5sb2NrKHRoaXMuX29WaWV3KTtcblx0XHRcdH0pO1xuXHRcdFx0b0hpZGRlbkJpbmRpbmcuYXR0YWNoRXZlbnRPbmNlKFwiZGF0YVJlY2VpdmVkXCIsIHRoaXMub25EYXRhUmVjZWl2ZWQuYmluZCh0aGlzKSk7XG5cdFx0XHRyZXR1cm4gb0hpZGRlbkJpbmRpbmcuZ2V0Qm91bmRDb250ZXh0KCk7XG5cdFx0fVxuXHR9XG5cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdGFzeW5jIG9uRGF0YVJlY2VpdmVkKG9FdmVudDogRXZlbnQ8eyBlcnJvcjogeyBzdGF0dXM6IG51bWJlciB9IH0+KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3Qgc0Vycm9yRGVzY3JpcHRpb24gPSBvRXZlbnQgJiYgb0V2ZW50LmdldFBhcmFtZXRlcihcImVycm9yXCIpO1xuXHRcdGlmIChCdXN5TG9ja2VyLmlzTG9ja2VkKHRoaXMuX29WaWV3KSkge1xuXHRcdFx0QnVzeUxvY2tlci51bmxvY2sodGhpcy5fb1ZpZXcpO1xuXHRcdH1cblxuXHRcdGlmIChzRXJyb3JEZXNjcmlwdGlvbikge1xuXHRcdFx0Ly8gVE9ETzogaW4gY2FzZSBvZiA0MDQgdGhlIHRleHQgc2hhbGwgYmUgZGlmZmVyZW50XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRjb25zdCBvUmVzb3VyY2VCdW5kbGUgPSBMaWJyYXJ5LmdldFJlc291cmNlQnVuZGxlRm9yKFwic2FwLmZlLmNvcmVcIikhO1xuXHRcdFx0XHRjb25zdCBtZXNzYWdlSGFuZGxlciA9IHRoaXMuYmFzZS5tZXNzYWdlSGFuZGxlcjtcblx0XHRcdFx0bGV0IG1QYXJhbXMgPSB7fTtcblx0XHRcdFx0aWYgKHNFcnJvckRlc2NyaXB0aW9uLnN0YXR1cyA9PT0gNTAzKSB7XG5cdFx0XHRcdFx0bVBhcmFtcyA9IHtcblx0XHRcdFx0XHRcdGlzSW5pdGlhbExvYWQ1MDNFcnJvcjogdHJ1ZSxcblx0XHRcdFx0XHRcdHNoZWxsQmFjazogdHJ1ZVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH0gZWxzZSBpZiAoc0Vycm9yRGVzY3JpcHRpb24uc3RhdHVzID09PSA0MDApIHtcblx0XHRcdFx0XHRtUGFyYW1zID0ge1xuXHRcdFx0XHRcdFx0dGl0bGU6IG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19DT01NT05fU0FQRkVfRVJST1JcIiksXG5cdFx0XHRcdFx0XHRkZXNjcmlwdGlvbjogb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0NPTU1PTl9TQVBGRV9EQVRBX1JFQ0VJVkVEX0VSUk9SX0RFU0NSSVBUSU9OXCIpLFxuXHRcdFx0XHRcdFx0aXNEYXRhUmVjZWl2ZWRFcnJvcjogdHJ1ZSxcblx0XHRcdFx0XHRcdHNoZWxsQmFjazogdHJ1ZVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0bVBhcmFtcyA9IHtcblx0XHRcdFx0XHRcdHRpdGxlOiBvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfQ09NTU9OX1NBUEZFX0VSUk9SXCIpLFxuXHRcdFx0XHRcdFx0ZGVzY3JpcHRpb246IHNFcnJvckRlc2NyaXB0aW9uLFxuXHRcdFx0XHRcdFx0aXNEYXRhUmVjZWl2ZWRFcnJvcjogdHJ1ZSxcblx0XHRcdFx0XHRcdHNoZWxsQmFjazogdHJ1ZVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH1cblx0XHRcdFx0YXdhaXQgbWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VzKG1QYXJhbXMpO1xuXHRcdFx0fSBjYXRjaCAob0Vycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGdldHRpbmcgdGhlIGNvcmUgcmVzb3VyY2UgYnVuZGxlXCIsIG9FcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBSZXF1ZXN0cyBzaWRlIGVmZmVjdHMgb24gYSBiaW5kaW5nIGNvbnRleHQgdG8gXCJyZWZyZXNoXCIgaXQuXG5cdCAqIFRPRE86IGdldCByaWQgb2YgdGhpcyBvbmNlIHByb3ZpZGVkIGJ5IHRoZSBtb2RlbFxuXHQgKiBhIHJlZnJlc2ggb24gdGhlIGJpbmRpbmcgY29udGV4dCBkb2VzIG5vdCB3b3JrIGluIGNhc2UgYSBjcmVhdGlvbiByb3cgd2l0aCBhIHRyYW5zaWVudCBjb250ZXh0IGlzXG5cdCAqIHVzZWQuIGFsc28gYSByZXF1ZXN0U2lkZUVmZmVjdHMgd2l0aCBhbiBlbXB0eSBwYXRoIHdvdWxkIGZhaWwgZHVlIHRvIHRoZSB0cmFuc2llbnQgY29udGV4dFxuXHQgKiB0aGVyZWZvcmUgd2UgZ2V0IGFsbCBkZXBlbmRlbnQgYmluZGluZ3MgKHZpYSBwcml2YXRlIG1vZGVsIG1ldGhvZCkgdG8gZGV0ZXJtaW5lIGFsbCBwYXRocyBhbmQgdGhlblxuXHQgKiByZXF1ZXN0IHRoZW0uXG5cdCAqXG5cdCAqIEBwYXJhbSBvQmluZGluZ0NvbnRleHQgQ29udGV4dCB0byBiZSByZWZyZXNoZWRcblx0ICovXG5cdF9yZWZyZXNoQmluZGluZ0NvbnRleHQob0JpbmRpbmdDb250ZXh0OiBDb250ZXh0KTogdm9pZCB7XG5cdFx0Y29uc3Qgb1BhZ2VDb21wb25lbnQgPSB0aGlzLl9vUGFnZUNvbXBvbmVudDtcblx0XHRjb25zdCBvU2lkZUVmZmVjdHNTZXJ2aWNlID0gdGhpcy5fb0FwcENvbXBvbmVudC5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKTtcblx0XHRjb25zdCBzUm9vdENvbnRleHRQYXRoID0gb0JpbmRpbmdDb250ZXh0LmdldFBhdGgoKTtcblx0XHRjb25zdCBzRW50aXR5U2V0ID0gb1BhZ2VDb21wb25lbnQgJiYgb1BhZ2VDb21wb25lbnQuZ2V0RW50aXR5U2V0ICYmIG9QYWdlQ29tcG9uZW50LmdldEVudGl0eVNldCgpO1xuXHRcdGNvbnN0IHNDb250ZXh0UGF0aCA9XG5cdFx0XHQob1BhZ2VDb21wb25lbnQgJiYgb1BhZ2VDb21wb25lbnQuZ2V0Q29udGV4dFBhdGggJiYgb1BhZ2VDb21wb25lbnQuZ2V0Q29udGV4dFBhdGgoKSkgfHwgKHNFbnRpdHlTZXQgJiYgYC8ke3NFbnRpdHlTZXR9YCk7XG5cdFx0Y29uc3Qgb01ldGFNb2RlbCA9IHRoaXMuX29WaWV3LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0bGV0IHNNZXNzYWdlc1BhdGg7XG5cdFx0Y29uc3QgYU5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuXHRcdGNvbnN0IGFQcm9wZXJ0eVBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuXHRcdGNvbnN0IG9TaWRlRWZmZWN0czogU2lkZUVmZmVjdHNUYXJnZXRUeXBlID0ge1xuXHRcdFx0dGFyZ2V0UHJvcGVydGllczogW10sXG5cdFx0XHR0YXJnZXRFbnRpdGllczogW11cblx0XHR9O1xuXG5cdFx0ZnVuY3Rpb24gZ2V0QmluZGluZ1BhdGhzKG9CaW5kaW5nOiBCaW5kaW5nKTogdm9pZCB7XG5cdFx0XHRsZXQgYURlcGVuZGVudEJpbmRpbmdzO1xuXHRcdFx0Y29uc3Qgc1JlbGF0aXZlUGF0aCA9IChvQmluZGluZy5nZXRDb250ZXh0KCk/LmdldFBhdGgoKSA/PyBcIlwiKS5yZXBsYWNlKHNSb290Q29udGV4dFBhdGgsIFwiXCIpOyAvLyBJZiBubyBjb250ZXh0LCB0aGlzIGlzIGFuIGFic29sdXRlIGJpbmRpbmcgc28gbm8gcmVsYXRpdmUgcGF0aFxuXHRcdFx0Y29uc3Qgc1BhdGggPSAoc1JlbGF0aXZlUGF0aCA/IGAke3NSZWxhdGl2ZVBhdGguc2xpY2UoMSl9L2AgOiBzUmVsYXRpdmVQYXRoKSArIG9CaW5kaW5nLmdldFBhdGgoKTtcblxuXHRcdFx0aWYgKG9CaW5kaW5nLmlzQTxPRGF0YUNvbnRleHRCaW5kaW5nPihcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUNvbnRleHRCaW5kaW5nXCIpKSB7XG5cdFx0XHRcdC8vIGlmIChzUGF0aCA9PT0gXCJcIikge1xuXHRcdFx0XHQvLyBub3cgZ2V0IHRoZSBkZXBlbmRlbnQgYmluZGluZ3Ncblx0XHRcdFx0YURlcGVuZGVudEJpbmRpbmdzID0gb0JpbmRpbmcuZ2V0RGVwZW5kZW50QmluZGluZ3MoKTtcblx0XHRcdFx0aWYgKGFEZXBlbmRlbnRCaW5kaW5ncykge1xuXHRcdFx0XHRcdC8vIGFzayB0aGUgZGVwZW5kZW50IGJpbmRpbmdzIChhbmQgb25seSB0aG9zZSB3aXRoIHRoZSBzcGVjaWZpZWQgZ3JvdXBJZFxuXHRcdFx0XHRcdC8vaWYgKGFEZXBlbmRlbnRCaW5kaW5ncy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0Zm9yIChjb25zdCBpdGVtIG9mIGFEZXBlbmRlbnRCaW5kaW5ncykge1xuXHRcdFx0XHRcdFx0Z2V0QmluZGluZ1BhdGhzKGl0ZW0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIGlmICghYU5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhzLmluY2x1ZGVzKHNQYXRoKSkge1xuXHRcdFx0XHRcdGFOYXZpZ2F0aW9uUHJvcGVydHlQYXRocy5wdXNoKHNQYXRoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmIChvQmluZGluZy5pc0E8T0RhdGFMaXN0QmluZGluZz4oXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ1wiKSkge1xuXHRcdFx0XHRpZiAoIWFOYXZpZ2F0aW9uUHJvcGVydHlQYXRocy5pbmNsdWRlcyhzUGF0aCkpIHtcblx0XHRcdFx0XHRhTmF2aWdhdGlvblByb3BlcnR5UGF0aHMucHVzaChzUGF0aCk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAob0JpbmRpbmcuaXNBPE9EYXRhUHJvcGVydHlCaW5kaW5nPihcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YVByb3BlcnR5QmluZGluZ1wiKSkge1xuXHRcdFx0XHRpZiAoIWFQcm9wZXJ0eVBhdGhzLmluY2x1ZGVzKHNQYXRoKSkge1xuXHRcdFx0XHRcdGFQcm9wZXJ0eVBhdGhzLnB1c2goc1BhdGgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKHNDb250ZXh0UGF0aCkge1xuXHRcdFx0c01lc3NhZ2VzUGF0aCA9IE1vZGVsSGVscGVyLmdldE1lc3NhZ2VzUGF0aChvTWV0YU1vZGVsLCBzQ29udGV4dFBhdGgpO1xuXHRcdH1cblxuXHRcdC8vIGJpbmRpbmcgb2YgdGhlIGNvbnRleHQgbXVzdCBoYXZlICQkUGF0Y2hXaXRob3V0U2lkZUVmZmVjdHMgdHJ1ZSwgdGhpcyBib3VuZCBjb250ZXh0IG1heSBiZSBuZWVkZWQgdG8gYmUgZmV0Y2hlZCBmcm9tIHRoZSBkZXBlbmRlbnQgYmluZGluZ1xuXHRcdGdldEJpbmRpbmdQYXRocyhvQmluZGluZ0NvbnRleHQuZ2V0QmluZGluZygpKTtcblxuXHRcdGxldCBpO1xuXHRcdGZvciAoaSA9IDA7IGkgPCBhTmF2aWdhdGlvblByb3BlcnR5UGF0aHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdG9TaWRlRWZmZWN0cy50YXJnZXRFbnRpdGllcy5wdXNoKHtcblx0XHRcdFx0JE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGg6IGFOYXZpZ2F0aW9uUHJvcGVydHlQYXRoc1tpXVxuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdG9TaWRlRWZmZWN0cy50YXJnZXRQcm9wZXJ0aWVzID0gYVByb3BlcnR5UGF0aHM7XG5cdFx0aWYgKHNNZXNzYWdlc1BhdGgpIHtcblx0XHRcdG9TaWRlRWZmZWN0cy50YXJnZXRQcm9wZXJ0aWVzLnB1c2goc01lc3NhZ2VzUGF0aCk7XG5cdFx0fVxuXHRcdC8vYWxsIHRoaXMgbG9naWMgdG8gYmUgcmVwbGFjZWQgd2l0aCBhIFNpZGVFZmZlY3RzIHJlcXVlc3QgZm9yIGFuIGVtcHR5IHBhdGggKHJlZnJlc2ggZXZlcnl0aGluZyksIGFmdGVyIHRlc3RpbmcgdHJhbnNpZW50IGNvbnRleHRzXG5cdFx0b1NpZGVFZmZlY3RzLnRhcmdldFByb3BlcnRpZXMgPSBvU2lkZUVmZmVjdHMudGFyZ2V0UHJvcGVydGllcy5yZWR1Y2UoKHRhcmdldHM6IHN0cmluZ1tdLCB0YXJnZXRQcm9wZXJ0eSkgPT4ge1xuXHRcdFx0aWYgKHRhcmdldFByb3BlcnR5KSB7XG5cdFx0XHRcdGNvbnN0IGluZGV4ID0gdGFyZ2V0UHJvcGVydHkuaW5kZXhPZihcIi9cIik7XG5cdFx0XHRcdHRhcmdldHMucHVzaChpbmRleCA+IDAgPyB0YXJnZXRQcm9wZXJ0eS5zbGljZSgwLCBpbmRleCkgOiB0YXJnZXRQcm9wZXJ0eSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdGFyZ2V0cztcblx0XHR9LCBbXSk7XG5cdFx0Ly8gT0RhdGEgbW9kZWwgd2lsbCB0YWtlIGNhcmUgb2YgZHVwbGljYXRlc1xuXHRcdG9TaWRlRWZmZWN0c1NlcnZpY2UucmVxdWVzdFNpZGVFZmZlY3RzKFsuLi5vU2lkZUVmZmVjdHMudGFyZ2V0RW50aXRpZXMsIC4uLm9TaWRlRWZmZWN0cy50YXJnZXRQcm9wZXJ0aWVzXSwgb0JpbmRpbmdDb250ZXh0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBiaW5kaW5nIGNvbnRleHQgb2YgdGhlIHBhZ2Ugb3IgdGhlIGNvbXBvbmVudC5cblx0ICpcblx0ICogQHJldHVybnMgVGhlIGJpbmRpbmcgY29udGV4dFxuXHQgKi9cblx0X2dldEJpbmRpbmdDb250ZXh0KCk6IENvbnRleHQgfCBudWxsIHwgdW5kZWZpbmVkIHtcblx0XHRpZiAodGhpcy5fb1BhZ2VDb21wb25lbnQpIHtcblx0XHRcdHJldHVybiB0aGlzLl9vUGFnZUNvbXBvbmVudC5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIENvbnRleHQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiB0aGlzLl9vVmlldy5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBiaW5kaW5nIGNvbnRleHQgb2YgdGhlIHBhZ2Ugb3IgdGhlIGNvbXBvbmVudC5cblx0ICpcblx0ICogQHBhcmFtIG9Db250ZXh0IFRoZSBiaW5kaW5nIGNvbnRleHRcblx0ICovXG5cdF9zZXRCaW5kaW5nQ29udGV4dChvQ29udGV4dDogQ29udGV4dCB8IG51bGwpOiB2b2lkIHtcblx0XHRsZXQgb1ByZXZpb3VzQ29udGV4dCwgb1RhcmdldENvbnRyb2w7XG5cdFx0aWYgKHRoaXMuX29QYWdlQ29tcG9uZW50KSB7XG5cdFx0XHRvUHJldmlvdXNDb250ZXh0ID0gdGhpcy5fb1BhZ2VDb21wb25lbnQuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBDb250ZXh0O1xuXHRcdFx0b1RhcmdldENvbnRyb2wgPSB0aGlzLl9vUGFnZUNvbXBvbmVudDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0b1ByZXZpb3VzQ29udGV4dCA9IHRoaXMuX29WaWV3LmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0XHRvVGFyZ2V0Q29udHJvbCA9IHRoaXMuX29WaWV3O1xuXHRcdH1cblxuXHRcdG9UYXJnZXRDb250cm9sLnNldEJpbmRpbmdDb250ZXh0KG9Db250ZXh0KTtcblxuXHRcdGlmIChvUHJldmlvdXNDb250ZXh0Py5pc0tlZXBBbGl2ZSgpICYmIG9QcmV2aW91c0NvbnRleHQgIT09IG9Db250ZXh0KSB7XG5cdFx0XHR0aGlzLl9zZXRLZWVwQWxpdmUob1ByZXZpb3VzQ29udGV4dCwgZmFsc2UpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBmbGV4aWJsZSBjb2x1bW4gbGF5b3V0IChGQ0wpIGxldmVsIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHZpZXcgKC0xIGlmIHRoZSBhcHAgaXMgbm90IEZDTCkuXG5cdCAqXG5cdCAqIEByZXR1cm5zIFRoZSBsZXZlbFxuXHQgKi9cblx0X2dldEZDTExldmVsKCk6IG51bWJlciB7XG5cdFx0cmV0dXJuIHRoaXMuX29UYXJnZXRJbmZvcm1hdGlvbi5GQ0xMZXZlbDtcblx0fVxuXG5cdF9zZXRLZWVwQWxpdmUoXG5cdFx0b0NvbnRleHQ6IENvbnRleHQsXG5cdFx0YktlZXBBbGl2ZTogYm9vbGVhbixcblx0XHRmbkJlZm9yZURlc3Ryb3k/OiBQYXJhbWV0ZXJzPENvbnRleHRbXCJzZXRLZWVwQWxpdmVcIl0+WzFdLFxuXHRcdGJSZXF1ZXN0TWVzc2FnZXM/OiBib29sZWFuXG5cdCk6IHZvaWQge1xuXHRcdGlmIChvQ29udGV4dC5nZXRQYXRoKCkuZW5kc1dpdGgoXCIpXCIpKSB7XG5cdFx0XHQvLyBXZSBrZWVwIHRoZSBjb250ZXh0IGFsaXZlIG9ubHkgaWYgdGhleSdyZSBwYXJ0IG9mIGEgY29sbGVjdGlvbiwgaS5lLiBpZiB0aGUgcGF0aCBlbmRzIHdpdGggYSAnKSdcblx0XHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdFx0Y29uc3Qgc01ldGFQYXRoID0gb01ldGFNb2RlbC5nZXRNZXRhUGF0aChvQ29udGV4dC5nZXRQYXRoKCkpO1xuXHRcdFx0Y29uc3Qgc01lc3NhZ2VzUGF0aCA9IE1vZGVsSGVscGVyLmdldE1lc3NhZ2VzUGF0aChvTWV0YU1vZGVsLCBzTWV0YVBhdGgpO1xuXHRcdFx0b0NvbnRleHQuc2V0S2VlcEFsaXZlKGJLZWVwQWxpdmUsIGZuQmVmb3JlRGVzdHJveSwgISFzTWVzc2FnZXNQYXRoICYmIGJSZXF1ZXN0TWVzc2FnZXMpO1xuXHRcdH1cblx0fVxuXG5cdF9nZXRLZWVwQWxpdmVDb250ZXh0KFxuXHRcdG9Nb2RlbDogT0RhdGFNb2RlbCxcblx0XHRwYXRoOiBzdHJpbmcsXG5cdFx0YlJlcXVlc3RNZXNzYWdlcz86IGJvb2xlYW4sXG5cdFx0cGFyYW1ldGVycz86IEJpbmRDb250ZXh0UGFyYW1ldGVyc1xuXHQpOiBDb250ZXh0IHwgdW5kZWZpbmVkIHtcblx0XHQvLyBHZXQgdGhlIHBhdGggZm9yIHRoZSBjb250ZXh0IHRoYXQgaXMgcmVhbGx5IGtlcHQgYWxpdmUgKHBhcnQgb2YgYSBjb2xsZWN0aW9uKVxuXHRcdC8vIGkuZS4gcmVtb3ZlIGFsbCBzZWdtZW50cyBub3QgZW5kaW5nIHdpdGggYSAnKSdcblx0XHRjb25zdCBrZXB0QWxpdmVTZWdtZW50cyA9IHBhdGguc3BsaXQoXCIvXCIpO1xuXHRcdGNvbnN0IGFkZGl0aW9ubmFsU2VnbWVudHM6IHN0cmluZ1tdID0gW107XG5cdFx0d2hpbGUgKGtlcHRBbGl2ZVNlZ21lbnRzLmxlbmd0aCAmJiAha2VwdEFsaXZlU2VnbWVudHNba2VwdEFsaXZlU2VnbWVudHMubGVuZ3RoIC0gMV0uZW5kc1dpdGgoXCIpXCIpKSB7XG5cdFx0XHRhZGRpdGlvbm5hbFNlZ21lbnRzLnB1c2goa2VwdEFsaXZlU2VnbWVudHMucG9wKCkhKTtcblx0XHR9XG5cblx0XHRpZiAoa2VwdEFsaXZlU2VnbWVudHMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdGNvbnN0IGtlcHRBbGl2ZVBhdGggPSBrZXB0QWxpdmVTZWdtZW50cy5qb2luKFwiL1wiKTtcblx0XHRjb25zdCBvS2VlcEFsaXZlQ29udGV4dCA9IG9Nb2RlbC5nZXRLZWVwQWxpdmVDb250ZXh0KGtlcHRBbGl2ZVBhdGgsIGJSZXF1ZXN0TWVzc2FnZXMsIHBhcmFtZXRlcnMpO1xuXG5cdFx0aWYgKGFkZGl0aW9ubmFsU2VnbWVudHMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm4gb0tlZXBBbGl2ZUNvbnRleHQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGFkZGl0aW9ubmFsU2VnbWVudHMucmV2ZXJzZSgpO1xuXHRcdFx0Y29uc3QgYWRkaXRpb25uYWxQYXRoID0gYWRkaXRpb25uYWxTZWdtZW50cy5qb2luKFwiL1wiKTtcblx0XHRcdHJldHVybiBvTW9kZWwuYmluZENvbnRleHQoYWRkaXRpb25uYWxQYXRoLCBvS2VlcEFsaXZlQ29udGV4dCkuZ2V0Qm91bmRDb250ZXh0KCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFN3aXRjaGVzIGJldHdlZW4gY29sdW1uIGFuZCBmdWxsLXNjcmVlbiBtb2RlIHdoZW4gRkNMIGlzIHVzZWQuXG5cdCAqXG5cdCAqL1xuXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRzd2l0Y2hGdWxsU2NyZWVuKCk6IHZvaWQge1xuXHRcdGNvbnN0IG9Tb3VyY2UgPSB0aGlzLmJhc2UuZ2V0VmlldygpO1xuXHRcdGNvbnN0IG9GQ0xIZWxwZXJNb2RlbCA9IG9Tb3VyY2UuZ2V0TW9kZWwoXCJmY2xoZWxwZXJcIiksXG5cdFx0XHRiSXNGdWxsU2NyZWVuID0gb0ZDTEhlbHBlck1vZGVsLmdldFByb3BlcnR5KFwiL2FjdGlvbkJ1dHRvbnNJbmZvL2lzRnVsbFNjcmVlblwiKSxcblx0XHRcdHNOZXh0TGF5b3V0ID0gb0ZDTEhlbHBlck1vZGVsLmdldFByb3BlcnR5KFxuXHRcdFx0XHRiSXNGdWxsU2NyZWVuID8gXCIvYWN0aW9uQnV0dG9uc0luZm8vZXhpdEZ1bGxTY3JlZW5cIiA6IFwiL2FjdGlvbkJ1dHRvbnNJbmZvL2Z1bGxTY3JlZW5cIlxuXHRcdFx0KSxcblx0XHRcdG9Sb290Vmlld0NvbnRyb2xsZXIgPSB0aGlzLl9vQXBwQ29tcG9uZW50LmdldFJvb3RWaWV3Q29udHJvbGxlcigpO1xuXG5cdFx0Y29uc3Qgb0NvbnRleHQgPSAob1Jvb3RWaWV3Q29udHJvbGxlciBhcyBGY2xDb250cm9sbGVyKS5nZXRSaWdodG1vc3RDb250ZXh0XG5cdFx0XHQ/IChvUm9vdFZpZXdDb250cm9sbGVyIGFzIEZjbENvbnRyb2xsZXIpLmdldFJpZ2h0bW9zdENvbnRleHQoKSFcblx0XHRcdDogb1NvdXJjZS5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXG5cdFx0dGhpcy5iYXNlLl9yb3V0aW5nLm5hdmlnYXRlVG9Db250ZXh0KG9Db250ZXh0LCB7IGxheW91dDogc05leHRMYXlvdXQgfSkuY2F0Y2goZnVuY3Rpb24gKCkge1xuXHRcdFx0TG9nLndhcm5pbmcoXCJjYW5ub3Qgc3dpdGNoIGJldHdlZW4gY29sdW1uIGFuZCBmdWxsc2NyZWVuXCIpO1xuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIENsb3NlcyB0aGUgY29sdW1uIGZvciB0aGUgY3VycmVudCB2aWV3IGluIGEgRkNMLlxuXHQgKlxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkJlZm9yZSlcblx0Y2xvc2VDb2x1bW4oKTogdm9pZCB7XG5cdFx0Y29uc3Qgb1ZpZXdEYXRhID0gdGhpcy5fb1ZpZXcuZ2V0Vmlld0RhdGEoKTtcblx0XHRjb25zdCBvQ29udGV4dCA9IHRoaXMuX29WaWV3LmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0Y29uc3QgbmF2aWdhdGlvblBhcmFtZXRlcnMgPSB7XG5cdFx0XHRub1ByZXNlcnZhdGlvbkNhY2hlOiB0cnVlLFxuXHRcdFx0c0xheW91dDogdGhpcy5fb1ZpZXcuZ2V0TW9kZWwoXCJmY2xoZWxwZXJcIikuZ2V0UHJvcGVydHkoXCIvYWN0aW9uQnV0dG9uc0luZm8vY2xvc2VDb2x1bW5cIilcblx0XHR9O1xuXG5cdFx0aWYgKG9WaWV3RGF0YT8udmlld0xldmVsID09PSAxICYmIE1vZGVsSGVscGVyLmlzRHJhZnRTdXBwb3J0ZWQob01ldGFNb2RlbCwgb0NvbnRleHQuZ2V0UGF0aCgpKSkge1xuXHRcdFx0ZHJhZnQucHJvY2Vzc0RhdGFMb3NzT3JEcmFmdERpc2NhcmRDb25maXJtYXRpb24oXG5cdFx0XHRcdCgpID0+IHtcblx0XHRcdFx0XHR0aGlzLm5hdmlnYXRlQmFja0Zyb21Db250ZXh0KG9Db250ZXh0LCBuYXZpZ2F0aW9uUGFyYW1ldGVycyk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdEZ1bmN0aW9uLnByb3RvdHlwZSxcblx0XHRcdFx0b0NvbnRleHQsXG5cdFx0XHRcdHRoaXMuX29WaWV3LmdldENvbnRyb2xsZXIoKSxcblx0XHRcdFx0ZmFsc2UsXG5cdFx0XHRcdGRyYWZ0Lk5hdmlnYXRpb25UeXBlLkJhY2tOYXZpZ2F0aW9uXG5cdFx0XHQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLm5hdmlnYXRlQmFja0Zyb21Db250ZXh0KG9Db250ZXh0LCBuYXZpZ2F0aW9uUGFyYW1ldGVycyk7XG5cdFx0fVxuXHR9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEludGVybmFsUm91dGluZztc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
@@ -185,6 +185,25 @@ class InternalRouting extends ControllerExtension {
185
185
  }
186
186
  }
187
187
 
188
+ /**
189
+ * Get the Hash we're navigating to.
190
+ *
191
+ * @param context Context instance
192
+ * @param navigationTargetName Name of the navigation target
193
+ * @returns The Hash we're navigating to
194
+ */
195
+ async getHashForNavigation(context: Context, navigationTargetName: string): Promise<string> {
196
+ const navigationConfiguration = this?._oPageComponent?.getNavigationConfiguration(navigationTargetName);
197
+ if (navigationConfiguration) {
198
+ const detailRoute = navigationConfiguration.detail;
199
+ const routeName = detailRoute.route;
200
+ const parameterMapping = detailRoute.parameters;
201
+ return this._oRoutingService.getHashFromRoute(context, routeName, parameterMapping);
202
+ } else {
203
+ return this._oRoutingService.getHashFromRoute(context, null);
204
+ }
205
+ }
206
+
188
207
  /**
189
208
  * Navigates to the specified navigation target route.
190
209
  *