@sapui5/sap.fe.core 1.141.2 → 1.142.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (207) hide show
  1. package/package.json +1 -1
  2. package/src/sap/fe/core/.library +4 -1
  3. package/src/sap/fe/core/ActionRuntime.js +48 -23
  4. package/src/sap/fe/core/ActionRuntime.ts +61 -35
  5. package/src/sap/fe/core/AppComponent.js +76 -6
  6. package/src/sap/fe/core/AppComponent.ts +94 -8
  7. package/src/sap/fe/core/AppStateHandler.js +9 -8
  8. package/src/sap/fe/core/AppStateHandler.ts +13 -9
  9. package/src/sap/fe/core/BaseController.js +8 -5
  10. package/src/sap/fe/core/BaseController.ts +6 -1
  11. package/src/sap/fe/core/CommonUtils.js +4 -123
  12. package/src/sap/fe/core/CommonUtils.ts +3 -172
  13. package/src/sap/fe/core/ExtensionAPI.js +3 -10
  14. package/src/sap/fe/core/ExtensionAPI.ts +2 -14
  15. package/src/sap/fe/core/PageController.js +64 -43
  16. package/src/sap/fe/core/PageController.ts +62 -47
  17. package/src/sap/fe/core/TemplateComponent.js +20 -1
  18. package/src/sap/fe/core/TemplateComponent.ts +24 -2
  19. package/src/sap/fe/core/buildingBlocks/BuildingBlock.js +37 -24
  20. package/src/sap/fe/core/buildingBlocks/BuildingBlock.ts +47 -31
  21. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockSupport.js +1 -1
  22. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockSupport.ts +4 -0
  23. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.js +4 -1
  24. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.ts +3 -0
  25. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplatingBase.js +4 -1
  26. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplatingBase.ts +4 -0
  27. package/src/sap/fe/core/controllerextensions/BaseControllerExtension.js +7 -5
  28. package/src/sap/fe/core/controllerextensions/BaseControllerExtension.ts +22 -2
  29. package/src/sap/fe/core/controllerextensions/CollaborativeDraft.js +82 -39
  30. package/src/sap/fe/core/controllerextensions/CollaborativeDraft.ts +91 -54
  31. package/src/sap/fe/core/controllerextensions/EditFlow.js +25 -3
  32. package/src/sap/fe/core/controllerextensions/EditFlow.ts +27 -3
  33. package/src/sap/fe/core/controllerextensions/InlineEditFlow.js +9 -7
  34. package/src/sap/fe/core/controllerextensions/InlineEditFlow.ts +17 -5
  35. package/src/sap/fe/core/controllerextensions/InternalRouting.js +37 -18
  36. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +49 -17
  37. package/src/sap/fe/core/controllerextensions/KPIManagement.js +30 -15
  38. package/src/sap/fe/core/controllerextensions/KPIManagement.ts +32 -14
  39. package/src/sap/fe/core/controllerextensions/MessageHandler.js +9 -10
  40. package/src/sap/fe/core/controllerextensions/MessageHandler.ts +8 -9
  41. package/src/sap/fe/core/controllerextensions/Paginator.js +2 -2
  42. package/src/sap/fe/core/controllerextensions/Paginator.ts +1 -1
  43. package/src/sap/fe/core/controllerextensions/Placeholder.js +10 -2
  44. package/src/sap/fe/core/controllerextensions/Placeholder.ts +5 -1
  45. package/src/sap/fe/core/controllerextensions/Recommendations.js +3 -3
  46. package/src/sap/fe/core/controllerextensions/Recommendations.ts +2 -2
  47. package/src/sap/fe/core/controllerextensions/Routing.js +9 -5
  48. package/src/sap/fe/core/controllerextensions/Routing.ts +7 -7
  49. package/src/sap/fe/core/controllerextensions/Share.js +5 -5
  50. package/src/sap/fe/core/controllerextensions/Share.ts +4 -4
  51. package/src/sap/fe/core/controllerextensions/SideEffects.js +1 -1
  52. package/src/sap/fe/core/controllerextensions/SideEffects.ts +17 -2
  53. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js +2 -2
  54. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.ts +1 -1
  55. package/src/sap/fe/core/controllerextensions/editFlow/NotApplicableContextDialog.js +3 -3
  56. package/src/sap/fe/core/controllerextensions/editFlow/NotApplicableContextDialog.tsx +3 -2
  57. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +33 -11
  58. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +45 -14
  59. package/src/sap/fe/core/controllerextensions/editFlow/draft.js +37 -3
  60. package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +41 -8
  61. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.js +10 -4
  62. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.ts +6 -1
  63. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataOperation.js +7 -7
  64. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataOperation.ts +6 -5
  65. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataStrictHandling.js +2 -2
  66. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataStrictHandling.ts +1 -1
  67. package/src/sap/fe/core/controllerextensions/editFlow/operations/OperationParameters.js +2 -1
  68. package/src/sap/fe/core/controllerextensions/editFlow/operations/OperationParameters.ts +1 -0
  69. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +10 -6
  70. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +6 -5
  71. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +11 -9
  72. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.ts +22 -9
  73. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.js +9 -4
  74. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.tsx +10 -4
  75. package/src/sap/fe/core/controls/Recommendations/ConfirmRecommendationDialog.js +31 -2
  76. package/src/sap/fe/core/controls/Recommendations/ConfirmRecommendationDialog.tsx +34 -1
  77. package/src/sap/fe/core/converters/ManifestSettings.js +7 -1
  78. package/src/sap/fe/core/converters/ManifestSettings.ts +37 -0
  79. package/src/sap/fe/core/converters/ManifestWrapper.js +29 -9
  80. package/src/sap/fe/core/converters/ManifestWrapper.ts +29 -11
  81. package/src/sap/fe/core/converters/annotations/DataField.js +46 -19
  82. package/src/sap/fe/core/converters/annotations/DataField.ts +93 -19
  83. package/src/sap/fe/core/converters/common/AnnotationConverter.js +88 -35
  84. package/src/sap/fe/core/converters/controls/Common/Action.js +57 -20
  85. package/src/sap/fe/core/converters/controls/Common/Action.ts +71 -21
  86. package/src/sap/fe/core/converters/controls/Common/Chart.js +13 -3
  87. package/src/sap/fe/core/converters/controls/Common/Chart.ts +20 -4
  88. package/src/sap/fe/core/converters/controls/Common/Form.js +18 -3
  89. package/src/sap/fe/core/converters/controls/Common/Form.ts +23 -1
  90. package/src/sap/fe/core/converters/controls/Common/Table.js +89 -57
  91. package/src/sap/fe/core/converters/controls/Common/Table.ts +110 -56
  92. package/src/sap/fe/core/converters/controls/Common/filter/FilterRestrictions.js +243 -0
  93. package/src/sap/fe/core/converters/controls/Common/filter/FilterRestrictions.ts +309 -0
  94. package/src/sap/fe/core/converters/controls/Common/table/Columns.js +142 -58
  95. package/src/sap/fe/core/converters/controls/Common/table/Columns.ts +172 -78
  96. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +12 -18
  97. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +13 -27
  98. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +7 -16
  99. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +6 -17
  100. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +16 -5
  101. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +16 -5
  102. package/src/sap/fe/core/converters/helpers/Aggregation.js +12 -2
  103. package/src/sap/fe/core/converters/helpers/Aggregation.ts +11 -1
  104. package/src/sap/fe/core/converters/helpers/DataFieldHelper.js +27 -3
  105. package/src/sap/fe/core/converters/helpers/DataFieldHelper.ts +28 -1
  106. package/src/sap/fe/core/converters/helpers/ID.js +3 -1
  107. package/src/sap/fe/core/converters/helpers/ID.ts +1 -0
  108. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +5 -2
  109. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +7 -1
  110. package/src/sap/fe/core/converters/templates/ListReportConverter.js +11 -3
  111. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +12 -4
  112. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +19 -8
  113. package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +18 -7
  114. package/src/sap/fe/core/designtime/AnnotationBasedChanges.js +8 -3
  115. package/src/sap/fe/core/designtime/AnnotationBasedChanges.ts +7 -2
  116. package/src/sap/fe/core/formatters/FPMFormatter.js +2 -2
  117. package/src/sap/fe/core/formatters/FPMFormatter.ts +1 -1
  118. package/src/sap/fe/core/fpm/Component.js +8 -1
  119. package/src/sap/fe/core/fpm/Component.ts +8 -0
  120. package/src/sap/fe/core/fpm/manifest.json +1 -1
  121. package/src/sap/fe/core/helpers/AppStartupHelper.js +79 -25
  122. package/src/sap/fe/core/helpers/AppStartupHelper.ts +91 -32
  123. package/src/sap/fe/core/helpers/ManifestHelper.js +6 -3
  124. package/src/sap/fe/core/helpers/ManifestHelper.ts +3 -0
  125. package/src/sap/fe/core/helpers/MetaModelFunction.js +12 -3
  126. package/src/sap/fe/core/helpers/MetaModelFunction.ts +11 -3
  127. package/src/sap/fe/core/helpers/ModelHelper.js +48 -9
  128. package/src/sap/fe/core/helpers/ModelHelper.ts +55 -10
  129. package/src/sap/fe/core/helpers/TypeGuards.js +12 -2
  130. package/src/sap/fe/core/helpers/TypeGuards.ts +10 -1
  131. package/src/sap/fe/core/helpers/WebSocket.js +6 -7
  132. package/src/sap/fe/core/helpers/WebSocket.ts +10 -6
  133. package/src/sap/fe/core/library.js +30 -3
  134. package/src/sap/fe/core/library.ts +28 -1
  135. package/src/sap/fe/core/messagebundle.properties +8 -1
  136. package/src/sap/fe/core/messagebundle_ar.properties +7 -0
  137. package/src/sap/fe/core/messagebundle_bg.properties +10 -3
  138. package/src/sap/fe/core/messagebundle_ca.properties +7 -0
  139. package/src/sap/fe/core/messagebundle_cnr.properties +7 -0
  140. package/src/sap/fe/core/messagebundle_cs.properties +7 -0
  141. package/src/sap/fe/core/messagebundle_cy.properties +8 -1
  142. package/src/sap/fe/core/messagebundle_da.properties +7 -0
  143. package/src/sap/fe/core/messagebundle_de.properties +7 -0
  144. package/src/sap/fe/core/messagebundle_el.properties +7 -0
  145. package/src/sap/fe/core/messagebundle_en.properties +8 -1
  146. package/src/sap/fe/core/messagebundle_en_GB.properties +7 -0
  147. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +5 -0
  148. package/src/sap/fe/core/messagebundle_es.properties +8 -1
  149. package/src/sap/fe/core/messagebundle_es_MX.properties +7 -0
  150. package/src/sap/fe/core/messagebundle_et.properties +7 -0
  151. package/src/sap/fe/core/messagebundle_fi.properties +7 -0
  152. package/src/sap/fe/core/messagebundle_fr.properties +16 -9
  153. package/src/sap/fe/core/messagebundle_fr_CA.properties +7 -0
  154. package/src/sap/fe/core/messagebundle_hi.properties +8 -1
  155. package/src/sap/fe/core/messagebundle_hr.properties +7 -0
  156. package/src/sap/fe/core/messagebundle_hu.properties +7 -0
  157. package/src/sap/fe/core/messagebundle_id.properties +7 -0
  158. package/src/sap/fe/core/messagebundle_it.properties +7 -0
  159. package/src/sap/fe/core/messagebundle_iw.properties +7 -0
  160. package/src/sap/fe/core/messagebundle_ja.properties +8 -1
  161. package/src/sap/fe/core/messagebundle_kk.properties +7 -0
  162. package/src/sap/fe/core/messagebundle_ko.properties +7 -0
  163. package/src/sap/fe/core/messagebundle_lt.properties +7 -0
  164. package/src/sap/fe/core/messagebundle_lv.properties +7 -0
  165. package/src/sap/fe/core/messagebundle_mk.properties +7 -0
  166. package/src/sap/fe/core/messagebundle_ms.properties +7 -0
  167. package/src/sap/fe/core/messagebundle_nl.properties +7 -0
  168. package/src/sap/fe/core/messagebundle_no.properties +7 -0
  169. package/src/sap/fe/core/messagebundle_pl.properties +7 -0
  170. package/src/sap/fe/core/messagebundle_pt.properties +7 -0
  171. package/src/sap/fe/core/messagebundle_pt_PT.properties +7 -0
  172. package/src/sap/fe/core/messagebundle_ro.properties +7 -0
  173. package/src/sap/fe/core/messagebundle_ru.properties +7 -0
  174. package/src/sap/fe/core/messagebundle_sh.properties +7 -0
  175. package/src/sap/fe/core/messagebundle_sk.properties +7 -0
  176. package/src/sap/fe/core/messagebundle_sl.properties +7 -0
  177. package/src/sap/fe/core/messagebundle_sr.properties +7 -0
  178. package/src/sap/fe/core/messagebundle_sv.properties +7 -0
  179. package/src/sap/fe/core/messagebundle_th.properties +7 -0
  180. package/src/sap/fe/core/messagebundle_tr.properties +7 -0
  181. package/src/sap/fe/core/messagebundle_uk.properties +7 -0
  182. package/src/sap/fe/core/messagebundle_vi.properties +7 -0
  183. package/src/sap/fe/core/messagebundle_zh_CN.properties +8 -1
  184. package/src/sap/fe/core/messagebundle_zh_TW.properties +7 -0
  185. package/src/sap/fe/core/rootView/Fcl.controller.js +21 -7
  186. package/src/sap/fe/core/rootView/Fcl.controller.ts +28 -6
  187. package/src/sap/fe/core/rootView/RootViewBaseController.js +96 -88
  188. package/src/sap/fe/core/rootView/RootViewBaseController.ts +106 -96
  189. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +14 -10
  190. package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +15 -10
  191. package/src/sap/fe/core/services/RoutingServiceFactory.js +16 -7
  192. package/src/sap/fe/core/services/RoutingServiceFactory.ts +23 -10
  193. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +9 -7
  194. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +13 -8
  195. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +62 -6
  196. package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +74 -11
  197. package/src/sap/fe/core/services/collaborativeDraftServiceFactory.js +33 -15
  198. package/src/sap/fe/core/services/collaborativeDraftServiceFactory.ts +31 -11
  199. package/src/sap/fe/core/templating/DisplayModeFormatter.js +4 -5
  200. package/src/sap/fe/core/templating/DisplayModeFormatter.ts +4 -6
  201. package/src/sap/fe/core/templating/UIFormatters.js +17 -2
  202. package/src/sap/fe/core/templating/UIFormatters.ts +25 -1
  203. package/src/sap/fe/core/types/sap.fe.core-auto-ext.d.js +10 -0
  204. package/src/sap/fe/core/types/sap.fe.core-auto-ext.d.ts +369 -0
  205. package/src/sap/fe/core/types/sap.fe.core-manual-ext.d.js +9 -0
  206. package/src/sap/fe/core/types/sap.fe.core-manual-ext.d.ts +49 -0
  207. package/ui5.yaml +2 -0
@@ -1025,21 +1025,22 @@ function closeMessageBox(messageShown: MessageWithHeader, callBack: (value: void
1025
1025
  }
1026
1026
 
1027
1027
  function showMessageBoxPerType(formattedText: string, close: { onClose: Function }, message: Message): void {
1028
+ const parameters = { ...close, closeOnNavigation: false };
1028
1029
  switch (message.getType()) {
1029
1030
  case MessageType.Error:
1030
- MessageBox.error(formattedText, close);
1031
+ MessageBox.error(formattedText, parameters);
1031
1032
  break;
1032
1033
  case MessageType.Warning:
1033
- MessageBox.warning(formattedText, close);
1034
+ MessageBox.warning(formattedText, parameters);
1034
1035
  break;
1035
1036
  case MessageType.Success:
1036
- MessageBox.success(formattedText, close);
1037
+ MessageBox.success(formattedText, parameters);
1037
1038
  break;
1038
1039
  case MessageType.Information:
1039
- MessageBox.information(formattedText, close);
1040
+ MessageBox.information(formattedText, parameters);
1040
1041
  break;
1041
1042
  default:
1042
- MessageBox.show(formattedText, close);
1043
+ MessageBox.show(formattedText, parameters);
1043
1044
  }
1044
1045
  }
1045
1046
 
@@ -198,33 +198,34 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/helpers/
198
198
  * @param bPreserveHistory If set to true, non-ancestor entries in history will be retained
199
199
  * @param bDisablePreservationCache If set to true, cache preservation mechanism is disabled for the current navigation
200
200
  * @param bForceFocus If set to true, the logic to set the focus once the navigation is finalized will be triggered (onPageReady)
201
- * @param bPreserveShellBackNavigationHandler If not set to false, the back navigation is set to undefined
201
+ * @param preserveShellBackNavigationHandler If set to true, the back navigation callback is preserved. If undefined or false, the back navigation callback is reset.
202
+ * @param skipHashGuardCheck
202
203
  * @returns Promise (resolved when the navigation is finalized) that returns 'true' if a navigation took place, 'false' if the navigation didn't happen
203
204
  */;
204
- _proto.navToHash = async function navToHash(sHash, bPreserveHistory, bDisablePreservationCache, bForceFocus, bPreserveShellBackNavigationHandler) {
205
+ _proto.navToHash = async function navToHash(sHash, bPreserveHistory, bDisablePreservationCache, bForceFocus, preserveShellBackNavigationHandler, skipHashGuardCheck) {
205
206
  sHash = sHash.startsWith("/") ? sHash.substring(1) : sHash;
206
- if (bPreserveShellBackNavigationHandler !== false) {
207
+ if (!preserveShellBackNavigationHandler) {
207
208
  await this._oShellServices.setBackNavigation();
208
209
  }
209
210
  sHash = this.removeRestoreHistoryFlagFromHash(sHash);
210
211
  if (this._oRouteMatchSynchronization) {
211
212
  return this._oRouteMatchSynchronization.waitFor().then(async () => {
212
213
  this._oRouteMatchSynchronization = undefined;
213
- return this._internalNavToHash(sHash, bPreserveHistory, bDisablePreservationCache, bForceFocus);
214
+ return this._internalNavToHash(sHash, bPreserveHistory, bDisablePreservationCache, bForceFocus, skipHashGuardCheck);
214
215
  });
215
216
  } else {
216
217
  if (this._bActivateRouteMatchSynchro) {
217
218
  this.waitForRouteMatchBeforeNavigation();
218
219
  }
219
- return this._internalNavToHash(sHash, bPreserveHistory, bDisablePreservationCache, bForceFocus);
220
+ return this._internalNavToHash(sHash, bPreserveHistory, bDisablePreservationCache, bForceFocus, skipHashGuardCheck);
220
221
  }
221
222
  };
222
- _proto._internalNavToHash = async function _internalNavToHash(sHash, bPreserveHistory, bDisablePreservationCache, bForceFocus) {
223
+ _proto._internalNavToHash = async function _internalNavToHash(sHash, bPreserveHistory, bDisablePreservationCache, bForceFocus, skipHashGuardCheck) {
223
224
  // Add the app state in the hash if needed
224
225
  if (this.fclEnabled && this.sIAppStateKey && !this.findAppStateInHash(sHash)) {
225
226
  sHash = this.setAppStateInHash(sHash, this.sIAppStateKey);
226
227
  }
227
- if (!this.checkHashWithGuard(sHash)) {
228
+ if (!this.checkHashWithGuard(sHash) && !(skipHashGuardCheck ?? false)) {
228
229
  if (!this.oResourceBundle) {
229
230
  this.oResourceBundle = Library.getResourceBundleFor("sap.fe.core");
230
231
  }
@@ -320,11 +321,12 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/helpers/
320
321
  * @param oParameters Parameters for the navigation
321
322
  * @param oParameters.noPreservationCache
322
323
  * @param oParameters.bIsStickyMode
324
+ * @param oParameters.isHiddenDraftEnabled
323
325
  * @returns Promise that is resolved when the navigation is finalized
324
326
  */;
325
327
  _proto.navTo = async function navTo(sRouteName, oParameters) {
326
328
  const sHash = this._oRouter.getURL(sRouteName, oParameters);
327
- return this.navToHash(sHash, false, oParameters?.noPreservationCache, false, !oParameters?.bIsStickyMode);
329
+ return this.navToHash(sHash, false, oParameters?.noPreservationCache, false, (oParameters?.bIsStickyMode ?? false) || (oParameters?.isHiddenDraftEnabled ?? false));
328
330
  }
329
331
 
330
332
  /**
@@ -934,4 +936,4 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/helpers/
934
936
  }(BaseObject)) || _class);
935
937
  return RouterProxy;
936
938
  }, false);
937
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJlbnVtU3RhdGUiLCJFUVVBTCIsIkNPTVBBVElCTEUiLCJBTkNFU1RPUiIsIkRJRkZFUkVOVCIsImVudW1VUkxQYXJhbXMiLCJMQVlPVVRQQVJBTSIsIklBUFBTVEFURVBBUkFNIiwiY3JlYXRlR3VhcmRGcm9tSGFzaCIsInNHdWFyZEhhc2giLCJoYXNoVHJha2VyIiwiX2d1YXJkSGFzaCIsInJlcGxhY2UiLCJoYXNoVHJhY2tlciIsInVuZGVmaW5lZCIsImNoZWNrIiwic0hhc2giLCJpbmRleE9mIiwicmVtb3ZlQXBwU3RhdGVJbkhhc2giLCJSZWdFeHAiLCJSb3V0ZXJQcm94eSIsIl9kZWMiLCJkZWZpbmVVSTVDbGFzcyIsIl9jbGFzcyIsIl9CYXNlT2JqZWN0IiwiX3RoaXMiLCJfbGVuIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiYXJncyIsIkFycmF5IiwiX2tleSIsImNhbGwiLCJiSXNSZWJ1aWxkSGlzdG9yeVJ1bm5pbmciLCJiSXNDb21wdXRpbmdUaXRsZUhpZXJhY2h5IiwiYklzR3VhcmRDcm9zc0FsbG93ZWQiLCJzSUFwcFN0YXRlS2V5IiwiX2JBY3RpdmF0ZVJvdXRlTWF0Y2hTeW5jaHJvIiwiX2JBcHBseVJlc3RvcmUiLCJfcGF0aE1hcHBpbmdzIiwicmVzdG9yZUhpc3RvcnlUcmlnZ2VyZWQiLCJhcHBTdGF0ZVVwZGF0aW5nIiwiX2luaGVyaXRzTG9vc2UiLCJfcHJvdG8iLCJwcm90b3R5cGUiLCJpbml0Iiwib0FwcENvbXBvbmVudCIsImlzZmNsRW5hYmxlZCIsImdldFNlcnZpY2UiLCJ0aGVuIiwiYXN5bmNJbml0IiwiY2F0Y2giLCJvRXJyb3IiLCJMb2ciLCJlcnJvciIsIl9mbkhhc2hHdWFyZCIsImhhc2hHdWFyZCIsImJpbmQiLCJ3aW5kb3ciLCJhZGRFdmVudExpc3RlbmVyIiwiX2JEaXNhYmxlT25IYXNoQ2hhbmdlIiwiX2JJZ25vcmVSZXN0b3JlIiwiX2JGb3JjZUZvY3VzIiwiX29TaGVsbFNlcnZpY2VzIiwiZ2V0U2hlbGxTZXJ2aWNlcyIsImluaXRSYXciLCJnZXRSb3V0ZXIiLCJyb3V0aW5nSGludHMiLCJnZXRSb3V0aW5nU2VydmljZSIsImdldFJvdXRpbmdIaW50cyIsIndhaXRGb3JSb3V0ZU1hdGNoQmVmb3JlTmF2aWdhdGlvbiIsImhpc3RvcnkiLCJyZXBsYWNlU3RhdGUiLCJPYmplY3QiLCJhc3NpZ24iLCJmZUxldmVsIiwic3RhdGUiLCJsb2NhdGlvbiIsImZjbEVuYWJsZWQiLCJfZm5CbG9ja2luZ05hdkZpbHRlciIsIl9ibG9ja2luZ05hdmlnYXRpb25GaWx0ZXIiLCJyZWdpc3Rlck5hdmlnYXRpb25GaWx0ZXIiLCJkZXN0cm95IiwidW5yZWdpc3Rlck5hdmlnYXRpb25GaWx0ZXIiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwic2V0QXBwU3RhdGVJbkhhc2giLCJzQXBwU3RhdGVLZXkiLCJzTmV3SGFzaCIsImluY2x1ZGVzIiwiZmluZEFwcFN0YXRlSW5IYXNoIiwiYUFwcFN0YXRlIiwibWF0Y2giLCJnZXREZWNvZGVkV2luZG93SGFzaCIsImRlY29kZVVSSSIsImhhc2giLCJvUm91dGVyIiwiX29Sb3V0ZXIiLCJfb01hbmFnZWRIaXN0b3J5IiwiX29OYXZpZ2F0aW9uR3VhcmQiLCJzQ3VycmVudEFwcEhhc2giLCJnZXRIYXNoIiwicHVzaCIsIl9leHRyYWN0U3RhdGVGcm9tSGFzaCIsImFwcE5hbWUiLCJnZXRBcHBOYW1lRnJvbUhhc2giLCJnZXRGdWxsSGFzaCIsInNwbGl0SGFzaCIsImFwcFNwZWNpZmljUm91dGUiLCJnZXRIYXNoQ2hhbmdlciIsInNoZWxsUGFydCIsImlzRm9jdXNGb3JjZWQiLCJzZXRGb2N1c0ZvcmNlZCIsImJGb3JjZWQiLCJyZW1vdmVJQXBwU3RhdGVLZXkiLCJzZXRBcHBTdGF0ZVVwZGF0aW5nIiwidXBkYXRpbmdBcHBTdGF0ZSIsImlzQXBwU3RhdGVVcGRhdGluZyIsInJlbW92ZVJlc3RvcmVIaXN0b3J5RmxhZ0Zyb21IYXNoIiwibmF2VG9IYXNoIiwiYlByZXNlcnZlSGlzdG9yeSIsImJEaXNhYmxlUHJlc2VydmF0aW9uQ2FjaGUiLCJiRm9yY2VGb2N1cyIsImJQcmVzZXJ2ZVNoZWxsQmFja05hdmlnYXRpb25IYW5kbGVyIiwic3RhcnRzV2l0aCIsInN1YnN0cmluZyIsInNldEJhY2tOYXZpZ2F0aW9uIiwiX29Sb3V0ZU1hdGNoU3luY2hyb25pemF0aW9uIiwid2FpdEZvciIsIl9pbnRlcm5hbE5hdlRvSGFzaCIsImNoZWNrSGFzaFdpdGhHdWFyZCIsIm9SZXNvdXJjZUJ1bmRsZSIsIkxpYnJhcnkiLCJnZXRSZXNvdXJjZUJ1bmRsZUZvciIsImNvbmZpcm0iLCJnZXRUZXh0IiwiUHJvbWlzZSIsInJlc29sdmUiLCJvTmV3U3RhdGUiLCJhQ3VycmVudEhhc2hLZXlzIiwiZXh0cmFjdEVudGl0eVNldHNGcm9tSGFzaCIsImtleXMiLCJldmVyeSIsImtleSIsImluZGV4Iiwib0hpc3RvcnlBY3Rpb24iLCJfcHVzaE5ld1N0YXRlIiwic3RvcmVGb2N1c0luZm9Gb3JDdXJyZW50SGFzaCIsIl9yZWJ1aWxkQnJvd3Nlckhpc3RvcnkiLCJyZXN0b3JlSGlzdG9yeSIsInNUYXJnZXRIYXNoIiwiY2hlY2tSZXN0b3JlSGlzdG9yeVdhc1RyaWdnZXJlZCIsInJlc2V0UmVzdG9yZUhpc3RvcnlGbGFnIiwibmF2QmFjayIsInNDdXJyZW50SGFzaCIsInNQcmV2aW91c0hhc2giLCJpIiwiYmFjayIsIm5hdlRvIiwic1JvdXRlTmFtZSIsIm9QYXJhbWV0ZXJzIiwiZ2V0VVJMIiwibm9QcmVzZXJ2YXRpb25DYWNoZSIsImJJc1N0aWNreU1vZGUiLCJleGl0RnJvbUFwcCIsImJhY2tUb1ByZXZpb3VzQXBwIiwiaXNDdXJyZW50U3RhdGVJbXBhY3RlZEJ5Iiwib0xvY2FsR3VhcmQiLCJpc05hdmlnYXRpb25GaW5hbGl6ZWQiLCJzZXROYXZpZ2F0aW9uR3VhcmQiLCJkaXNjYXJkTmF2aWdhdGlvbkd1YXJkIiwiaGFzTmF2aWdhdGlvbkd1YXJkIiwiaXNHdWFyZENyb3NzQWxsb3dlZEJ5VXNlciIsImFjdGl2YXRlUm91dGVNYXRjaFN5bmNocm9uaXphdGlvbiIsInJlc29sdmVSb3V0ZU1hdGNoIiwiU3luY2hyb25pemF0aW9uIiwic0hhc2hOb1BhcmFtcyIsInNwbGl0IiwiYVRva2VucyIsIm5hbWVzIiwiZm9yRWFjaCIsInNUb2tlbiIsIm9TdGF0ZSIsInNjcmVlbk1vZGUiLCJhTGF5b3V0Iiwic0xheW91dCIsImJSZWJ1aWxkT25seSIsImJEaXNhYmxlSGlzdG9yeVByZXNlcnZhdGlvbiIsImxhc3RJbmRleCIsImlQb3BDb3VudCIsInBvcCIsInByZXNlcnZlZCIsIm9MYXN0UmVtb3ZlZEl0ZW0iLCJvVG9wU3RhdGUiLCJfY29tcGFyZUNhY2hlU3RhdGVzIiwic1ByZXZpb3VzSUFwcFN0YXRlS2V5Iiwib0NvbXBhcmlzb25TdGF0ZVJlc3VsdCIsImJIYXNTYW1lSGFzaCIsImZvY3VzQ29udHJvbElkIiwic2Vjb25kYXJ5Rm9jdXNDb250cm9sSWQiLCJmb2N1c0luZm8iLCJzZWNvbmRhcnlGb2N1c0luZm8iLCJ0eXBlIiwic3RlcHMiLCJfZGlzYWJsZUV2ZW50T25IYXNoQ2hhbmdlIiwic3RvcCIsIl9lbmFibGVFdmVudE9uSGFzaENoYW5nZSIsImJJZ25vcmVDdXJyZW50SGFzaCIsImluaXRpYWxpemUiLCJ0aGF0Iiwib1RhcmdldFN0YXRlIiwibmV3TGV2ZWwiLCJyZXBsYWNlQXN5bmMiLCJyZXBsYWNlSGFzaCIsInNldFRpbWVvdXQiLCJiYWNrUmVwbGFjZUFzeW5jIiwiYmFja0FzeW5jIiwic2V0SGFzaCIsImdvIiwiZ2V0TGFzdEhpc3RvcnlFbnRyeSIsInNldFBhdGhNYXBwaW5nIiwibWFwcGluZ3MiLCJmaWx0ZXIiLCJtYXBwaW5nIiwib2xkUGF0aCIsIm5ld1BhdGgiLCJjdXJyZW50QXBwTmFtZSIsImlzSW5pdGlhbGl6ZWQiLCJmaW5kIiwibSIsImVuY29kZVVSSSIsImFIYXNoU3BsaXQiLCJzQXBwSGFzaCIsIm9TdGF0ZTEiLCJvU3RhdGUyIiwiZXF1YWwiLCJwYXJlbnRPZiIsInNwbGl0QXBwU3BlY2lmaWNSb3V0ZSIsInJvdXRlU3BsaXQiLCJzaGlmdCIsImNoZWNrSWZCYWNrSXNPdXRPZkd1YXJkIiwic2VnbWVudHMiLCJwcmV2aW91c0hhc2giLCJjaGVja0lmQmFja0V4aXRzQXBwIiwiY2hlY2tJZkJhY2tIYXNTYW1lQ29udGV4dCIsIm9DdXJyZW50U3RhdGUiLCJvUHJldmlvdXNTdGF0ZSIsInJlc3RvcmVGb2N1c0ZvckN1cnJlbnRIYXNoIiwiY3VycmVudEhhc2giLCJzdGF0ZUZvckhhc2giLCJmb2N1c0FwcGxpZWQiLCJmb2N1c0NvbnRyb2wiLCJFbGVtZW50IiwiZ2V0RWxlbWVudEJ5SWQiLCJ1c2VTZWNvbmRhcnkiLCJnZXRGb2N1c0RvbVJlZiIsImdldFBhcmVudCIsImlzQSIsImdldEJ1c3kiLCJmb2N1cyIsImdldEFjdGl2ZUVsZW1lbnQiLCJnZXRJZCIsInBhcmVudFRhYmxlIiwicHJldmVudFNjcm9sbCIsImdldEZvY3VzSW5mbyIsImZpbmRMYXlvdXRGb3JIYXNoIiwiaGFzaE5vUGFyYW0iLCJ0YXJnZXRTdGF0ZSIsIkJhc2VPYmplY3QiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIlJvdXRlclByb3h5LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IHR5cGUgUmVzb3VyY2VCdW5kbGUgZnJvbSBcInNhcC9iYXNlL2kxOG4vUmVzb3VyY2VCdW5kbGVcIjtcbmltcG9ydCB7IGRlZmluZVVJNUNsYXNzIH0gZnJvbSBcInNhcC9mZS9iYXNlL0NsYXNzU3VwcG9ydFwiO1xuaW1wb3J0IHR5cGUgQXBwQ29tcG9uZW50IGZyb20gXCJzYXAvZmUvY29yZS9BcHBDb21wb25lbnRcIjtcbmltcG9ydCBTeW5jaHJvbml6YXRpb24gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvU3luY2hyb25pemF0aW9uXCI7XG5pbXBvcnQgdHlwZSB7IElTaGVsbFNlcnZpY2VzIH0gZnJvbSBcInNhcC9mZS9jb3JlL3NlcnZpY2VzL1NoZWxsU2VydmljZXNGYWN0b3J5XCI7XG5pbXBvcnQgdHlwZSBNVGFibGUgZnJvbSBcInNhcC9tL1RhYmxlXCI7XG5pbXBvcnQgQmFzZU9iamVjdCBmcm9tIFwic2FwL3VpL2Jhc2UvT2JqZWN0XCI7XG5pbXBvcnQgRWxlbWVudCBmcm9tIFwic2FwL3VpL2NvcmUvRWxlbWVudFwiO1xuaW1wb3J0IExpYnJhcnkgZnJvbSBcInNhcC91aS9jb3JlL0xpYlwiO1xuaW1wb3J0IHR5cGUgUm91dGVyIGZyb20gXCJzYXAvdWkvY29yZS9yb3V0aW5nL1JvdXRlclwiO1xuaW1wb3J0IHR5cGUgVGFibGUgZnJvbSBcInNhcC91aS9tZGMvVGFibGVcIjtcbmltcG9ydCB0eXBlIFVJVGFibGUgZnJvbSBcInNhcC91aS90YWJsZS9UYWJsZVwiO1xuXG5jb25zdCBlbnVtU3RhdGUgPSB7XG5cdEVRVUFMOiAwLFxuXHRDT01QQVRJQkxFOiAxLFxuXHRBTkNFU1RPUjogMixcblx0RElGRkVSRU5UOiAzXG59O1xuY29uc3QgZW51bVVSTFBhcmFtcyA9IHtcblx0TEFZT1VUUEFSQU06IFwibGF5b3V0XCIsXG5cdElBUFBTVEFURVBBUkFNOiBcInNhcC1pYXBwLXN0YXRlXCJcbn07XG5cbnR5cGUgUm91dGVyU3RhdGUgPSB7XG5cdGtleXM6IHN0cmluZ1tdO1xuXHRoYXNoOiBzdHJpbmc7XG5cdHByZXNlcnZlZD86IGJvb2xlYW47XG5cdHNMYXlvdXQ/OiBzdHJpbmc7XG5cdHNjcmVlbk1vZGU6IG51bWJlcjtcblx0Zm9jdXNDb250cm9sSWQ/OiBzdHJpbmc7XG5cdHNlY29uZGFyeUZvY3VzQ29udHJvbElkPzogc3RyaW5nO1xuXHRmb2N1c0luZm8/OiB7XG5cdFx0cHJldmVudFNjcm9sbD86IGJvb2xlYW47XG5cdFx0dGFyZ2V0SW5mbz86IHVua25vd247XG5cdH07XG5cdHNlY29uZGFyeUZvY3VzSW5mbz86IHtcblx0XHRwcmV2ZW50U2Nyb2xsPzogYm9vbGVhbjtcblx0fTtcbn07XG5cbnR5cGUgT3RoZXJIaXN0b3J5QWN0aW9uID0geyB0eXBlOiBcImFwcGVuZFwiIHwgXCJub25lXCIgfCBcInJlcGxhY2VcIiB9O1xuZXhwb3J0IHR5cGUgQmFja0hpc3RvcnlBY3Rpb24gPSB7IHR5cGU6IFwiYmFja1wiIHwgXCJiYWNrLXJlcGxhY2VcIjsgc3RlcHM6IG51bWJlciB9O1xudHlwZSBIeXN0b3J5QWN0aW9uID0gQmFja0hpc3RvcnlBY3Rpb24gfCBPdGhlckhpc3RvcnlBY3Rpb247XG5cbnR5cGUgTmF2aWdhdGlvbkd1YXJkID0geyBfZ3VhcmRIYXNoOiBzdHJpbmc7IGhhc2hUcmFja2VyOiBzdHJpbmcgfCB1bmRlZmluZWQ7IGNoZWNrOiAoaGFzaDogc3RyaW5nKSA9PiBib29sZWFuIH07XG4vKipcbiAqIENyZWF0ZXMgYSBIYXNoR3VhcmQgb2JqZWN0LlxuICogQHBhcmFtIHNHdWFyZEhhc2ggVGhlIGhhc2ggdXNlZCBmb3IgdGhlIGd1YXJkLlxuICogQHBhcmFtIFtoYXNoVHJha2VyXSBPcHRpb25hbCBoYXNoIHRyYWNrZXIgdXNlZCBmb3IgYWRkaXRpb25hbCBndWFyZCBjaGVja3MuXG4gKiBAcmV0dXJucyBUaGUgY3JlYXRlZCBoYXNoIGd1YXJkLlxuICovXG5mdW5jdGlvbiBjcmVhdGVHdWFyZEZyb21IYXNoKHNHdWFyZEhhc2g6IHN0cmluZywgaGFzaFRyYWtlcj86IHN0cmluZyk6IE5hdmlnYXRpb25HdWFyZCB7XG5cdHJldHVybiB7XG5cdFx0X2d1YXJkSGFzaDogc0d1YXJkSGFzaC5yZXBsYWNlKC9cXD9bXj9dKiQvLCBcIlwiKSwgLy8gUmVtb3ZlIHF1ZXJ5IHBhcnRcblx0XHRoYXNoVHJhY2tlcjogaGFzaFRyYWtlciA/IGhhc2hUcmFrZXIucmVwbGFjZSgvXFw/W14/XSokLywgXCJcIikgOiB1bmRlZmluZWQsXG5cdFx0Y2hlY2s6IGZ1bmN0aW9uIChzSGFzaDogc3RyaW5nKTogYm9vbGVhbiB7XG5cdFx0XHRyZXR1cm4gc0hhc2guaW5kZXhPZih0aGlzLl9ndWFyZEhhc2gpID09PSAwIHx8ICh0aGlzLmhhc2hUcmFja2VyID8gc0hhc2guaW5kZXhPZih0aGlzLmhhc2hUcmFja2VyKSA9PT0gMCA6IGZhbHNlKTtcblx0XHR9XG5cdH07XG59XG4vKipcbiAqIFJldHVybnMgYSBoYXNoIHdpdGhvdXQgaXRzIGlBcHBTdGF0ZSBwYXJ0LlxuICogQHBhcmFtIHNIYXNoIFRoZSBoYXNoXG4gKiBAcmV0dXJucyBUaGUgaGFzaCB3aXRob3V0IHRoZSBpQXBwU3RhdGVcbiAqL1xuZnVuY3Rpb24gcmVtb3ZlQXBwU3RhdGVJbkhhc2goc0hhc2g6IHN0cmluZyk6IHN0cmluZyB7XG5cdHJldHVybiBzSGFzaC5yZXBsYWNlKG5ldyBSZWdFeHAoYFsmP10qJHtlbnVtVVJMUGFyYW1zLklBUFBTVEFURVBBUkFNfT1bXiZdKmApLCBcIlwiKTtcbn1cblxuQGRlZmluZVVJNUNsYXNzKFwic2FwLmZlLmNvcmUuUm91dGVyUHJveHlcIilcbmNsYXNzIFJvdXRlclByb3h5IGV4dGVuZHMgQmFzZU9iamVjdCB7XG5cdGJJc1JlYnVpbGRIaXN0b3J5UnVubmluZyA9IGZhbHNlO1xuXG5cdGJJc0NvbXB1dGluZ1RpdGxlSGllcmFjaHkgPSBmYWxzZTtcblxuXHRiSXNHdWFyZENyb3NzQWxsb3dlZCA9IGZhbHNlO1xuXG5cdHNJQXBwU3RhdGVLZXk6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG5cdF9vU2hlbGxTZXJ2aWNlcyE6IElTaGVsbFNlcnZpY2VzO1xuXG5cdGZjbEVuYWJsZWQhOiBib29sZWFuO1xuXG5cdF9mbkJsb2NraW5nTmF2RmlsdGVyITogRnVuY3Rpb247XG5cblx0X2ZuSGFzaEd1YXJkITogKHRoaXM6IFdpbmRvdywgcG9wU3RhdGVFdmVudDogUG9wU3RhdGVFdmVudCkgPT4gdW5rbm93bjtcblxuXHRfYkRpc2FibGVPbkhhc2hDaGFuZ2UhOiBib29sZWFuO1xuXG5cdF9iSWdub3JlUmVzdG9yZSE6IGJvb2xlYW47XG5cblx0X2JGb3JjZUZvY3VzITogYm9vbGVhbjtcblxuXHRfb1JvdXRlciE6IFJvdXRlcjtcblxuXHRfb01hbmFnZWRIaXN0b3J5ITogUm91dGVyU3RhdGVbXTtcblxuXHRfb05hdmlnYXRpb25HdWFyZCE6IE5hdmlnYXRpb25HdWFyZCB8IG51bGw7XG5cblx0b1Jlc291cmNlQnVuZGxlPzogUmVzb3VyY2VCdW5kbGU7XG5cblx0X29Sb3V0ZU1hdGNoU3luY2hyb25pemF0aW9uPzogU3luY2hyb25pemF0aW9uO1xuXG5cdF9iQWN0aXZhdGVSb3V0ZU1hdGNoU3luY2hybyA9IGZhbHNlO1xuXG5cdF9iQXBwbHlSZXN0b3JlID0gZmFsc2U7XG5cblx0X3BhdGhNYXBwaW5nczogeyBvbGRQYXRoOiBzdHJpbmc7IG5ld1BhdGg6IHN0cmluZyB9W10gPSBbXTtcblxuXHRyZXN0b3JlSGlzdG9yeVRyaWdnZXJlZCA9IGZhbHNlO1xuXG5cdHJvdXRpbmdIaW50cz86IFJlY29yZDxzdHJpbmcsIHsgcGFyZW50T2Y6IHN0cmluZ1tdIH0+O1xuXG5cdGFwcE5hbWUhOiBzdHJpbmc7XG5cblx0YXBwU3RhdGVVcGRhdGluZyA9IGZhbHNlO1xuXG5cdGluaXQob0FwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LCBpc2ZjbEVuYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcblx0XHQvLyBTYXZlIHRoZSBuYW1lIG9mIHRoZSBhcHAgKGluY2x1ZGluZyBzdGFydHVwIHBhcmFtZXRlcnMpIGZvciByZWJ1aWxkaW5nIGZ1bGwgaGFzaGVzIGxhdGVyXG5cdFx0b0FwcENvbXBvbmVudFxuXHRcdFx0LmdldFNlcnZpY2UoXCJzaGVsbFNlcnZpY2VzXCIpXG5cdFx0XHQudGhlbigoKSA9PiB0aGlzLmFzeW5jSW5pdChvQXBwQ29tcG9uZW50LCBpc2ZjbEVuYWJsZWQpKVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IHVua25vd24pIHtcblx0XHRcdFx0TG9nLmVycm9yKFwiQ2Fubm90IHJldHJpZXZlIHRoZSBzaGVsbCBzZXJ2aWNlc1wiLCBvRXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdH0pO1xuXHRcdHRoaXMuX2ZuSGFzaEd1YXJkID0gdGhpcy5oYXNoR3VhcmQuYmluZCh0aGlzKTtcblx0XHR3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInBvcHN0YXRlXCIsIHRoaXMuX2ZuSGFzaEd1YXJkKTtcblx0XHR0aGlzLl9iRGlzYWJsZU9uSGFzaENoYW5nZSA9IGZhbHNlO1xuXHRcdHRoaXMuX2JJZ25vcmVSZXN0b3JlID0gZmFsc2U7XG5cdFx0dGhpcy5fYkZvcmNlRm9jdXMgPSB0cnVlOyAvLyBUcmlnZ2VyIHRoZSBmb2N1cyBtZWNoYW5pc20gZm9yIHRoZSBmaXJzdCB2aWV3IGRpc3BsYXllZCBieSB0aGUgYXBwXG5cdH1cblxuXHRhc3luY0luaXQob0FwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LCBpc2ZjbEVuYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcblx0XHR0aGlzLl9vU2hlbGxTZXJ2aWNlcyA9IG9BcHBDb21wb25lbnQuZ2V0U2hlbGxTZXJ2aWNlcygpO1xuXHRcdHRoaXMuaW5pdFJhdyhvQXBwQ29tcG9uZW50LmdldFJvdXRlcigpKTtcblx0XHR0aGlzLnJvdXRpbmdIaW50cyA9IG9BcHBDb21wb25lbnQuZ2V0Um91dGluZ1NlcnZpY2UoKS5nZXRSb3V0aW5nSGludHMoKTtcblx0XHQvLyBXZSB3YW50IHRvIHdhaXQgdW50aWwgdGhlIGluaXRpYWwgcm91dGVNYXRjaGVkIGlzIGRvbmUgYmVmb3JlIGRvaW5nIGFueSBuYXZpZ2F0aW9uXG5cdFx0dGhpcy53YWl0Rm9yUm91dGVNYXRjaEJlZm9yZU5hdmlnYXRpb24oKTtcblxuXHRcdC8vIFNldCBmZUxldmVsPTAgZm9yIHRoZSBmaXJzdCBBcHBsaWNhdGlvbiBwYWdlIGluIHRoZSBoaXN0b3J5XG5cdFx0aGlzdG9yeS5yZXBsYWNlU3RhdGUoXG5cdFx0XHRPYmplY3QuYXNzaWduKFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0ZmVMZXZlbDogMFxuXHRcdFx0XHR9LFxuXHRcdFx0XHRoaXN0b3J5LnN0YXRlXG5cdFx0XHQpLFxuXHRcdFx0XCJcIixcblx0XHRcdHdpbmRvdy5sb2NhdGlvbiBhcyB1bmtub3duIGFzIHN0cmluZ1xuXHRcdCk7XG5cdFx0dGhpcy5mY2xFbmFibGVkID0gaXNmY2xFbmFibGVkO1xuXG5cdFx0dGhpcy5fZm5CbG9ja2luZ05hdkZpbHRlciA9IHRoaXMuX2Jsb2NraW5nTmF2aWdhdGlvbkZpbHRlci5iaW5kKHRoaXMpO1xuXHRcdHRoaXMuX29TaGVsbFNlcnZpY2VzLnJlZ2lzdGVyTmF2aWdhdGlvbkZpbHRlcih0aGlzLl9mbkJsb2NraW5nTmF2RmlsdGVyKTtcblx0fVxuXG5cdGRlc3Ryb3koKTogdm9pZCB7XG5cdFx0aWYgKHRoaXMuX29TaGVsbFNlcnZpY2VzKSB7XG5cdFx0XHR0aGlzLl9vU2hlbGxTZXJ2aWNlcy51bnJlZ2lzdGVyTmF2aWdhdGlvbkZpbHRlcih0aGlzLl9mbkJsb2NraW5nTmF2RmlsdGVyKTtcblx0XHR9XG5cdFx0d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJwb3BzdGF0ZVwiLCB0aGlzLl9mbkhhc2hHdWFyZCk7XG5cdH1cblxuXHQvKipcblx0ICogQWRkcyBhbiBpQXBwU3RhdGUgaW5zaWRlIGEgaGFzaCAob3IgcmVwbGFjZXMgYW4gZXhpc3Rpbmcgb25lKS5cblx0ICogQHBhcmFtIHNIYXNoIFRoZSBoYXNoXG5cdCAqIEBwYXJhbSBzQXBwU3RhdGVLZXkgVGhlIGlBcHBTdGF0ZSB0byBhZGRcblx0ICogQHJldHVybnMgVGhlIGhhc2ggd2l0aCB0aGUgYXBwIHN0YXRlXG5cdCAqL1xuXHRzZXRBcHBTdGF0ZUluSGFzaChzSGFzaDogc3RyaW5nLCBzQXBwU3RhdGVLZXk6IHN0cmluZyk6IHN0cmluZyB7XG5cdFx0bGV0IHNOZXdIYXNoOiBzdHJpbmc7XG5cblx0XHRpZiAoc0hhc2guaW5jbHVkZXMoZW51bVVSTFBhcmFtcy5JQVBQU1RBVEVQQVJBTSkpIHtcblx0XHRcdC8vIElmIHRoZXJlJ3MgYWxyZWFkeSBhbiBpQXBwU3RhdGUgcGFyYW1ldGVyIGluIHRoZSBoYXNoLCByZXBsYWNlIGl0XG5cdFx0XHRzTmV3SGFzaCA9IHNIYXNoLnJlcGxhY2UoXG5cdFx0XHRcdG5ldyBSZWdFeHAoYCR7ZW51bVVSTFBhcmFtcy5JQVBQU1RBVEVQQVJBTX09W14mXSpgKSxcblx0XHRcdFx0YCR7ZW51bVVSTFBhcmFtcy5JQVBQU1RBVEVQQVJBTX09JHtzQXBwU3RhdGVLZXl9YFxuXHRcdFx0KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gQWRkIHRoZSBpQXBwU3RhdGUgcGFyYW1ldGVyIGluIHRoZSBoYXNoXG5cdFx0XHRpZiAoIXNIYXNoLmluY2x1ZGVzKFwiP1wiKSkge1xuXHRcdFx0XHRzTmV3SGFzaCA9IGAke3NIYXNofT9gO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0c05ld0hhc2ggPSBgJHtzSGFzaH0mYDtcblx0XHRcdH1cblx0XHRcdHNOZXdIYXNoICs9IGAke2VudW1VUkxQYXJhbXMuSUFQUFNUQVRFUEFSQU19PSR7c0FwcFN0YXRlS2V5fWA7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHNOZXdIYXNoO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIGlBcHBTdGF0ZSBwYXJ0IGZyb20gYSBoYXNoIChvciBudWxsIGlmIG5vdCBmb3VuZCkuXG5cdCAqIEBwYXJhbSBzSGFzaCBUaGUgaGFzaFxuXHQgKiBAcmV0dXJucyBUaGUgaUFwcFN0YXRlIHBhcnQgb2YgdGhlIGhhc2hcblx0ICovXG5cdGZpbmRBcHBTdGF0ZUluSGFzaChzSGFzaDogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG5cdFx0Y29uc3QgYUFwcFN0YXRlID0gc0hhc2gubWF0Y2gobmV3IFJlZ0V4cChgXFxcXD8uKiR7ZW51bVVSTFBhcmFtcy5JQVBQU1RBVEVQQVJBTX09KFteJl0qKWApKTtcblx0XHRyZXR1cm4gYUFwcFN0YXRlICYmIGFBcHBTdGF0ZS5sZW5ndGggPiAxID8gYUFwcFN0YXRlWzFdIDogbnVsbDtcblx0fVxuXG5cdHByaXZhdGUgZ2V0RGVjb2RlZFdpbmRvd0hhc2goKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gZGVjb2RlVVJJKHdpbmRvdy5sb2NhdGlvbi5oYXNoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSYXcgaW5pdGlhbGl6YXRpb24gKGZvciB1bml0IHRlc3RzKS5cblx0ICogQHBhcmFtIG9Sb3V0ZXIgVGhlIHJvdXRlciB1c2VkIGJ5IHRoaXMgcHJveHlcblx0ICovXG5cdGluaXRSYXcob1JvdXRlcjogUm91dGVyKTogdm9pZCB7XG5cdFx0dGhpcy5fb1JvdXRlciA9IG9Sb3V0ZXI7XG5cdFx0dGhpcy5fb01hbmFnZWRIaXN0b3J5ID0gW107XG5cdFx0dGhpcy5fb05hdmlnYXRpb25HdWFyZCA9IG51bGw7XG5cblx0XHRjb25zdCBzQ3VycmVudEFwcEhhc2ggPSB0aGlzLmdldEhhc2goKTtcblx0XHR0aGlzLl9vTWFuYWdlZEhpc3RvcnkucHVzaCh0aGlzLl9leHRyYWN0U3RhdGVGcm9tSGFzaChzQ3VycmVudEFwcEhhc2gpKTtcblxuXHRcdHRoaXMuYXBwTmFtZSA9IHRoaXMuZ2V0QXBwTmFtZUZyb21IYXNoKHRoaXMuZ2V0RGVjb2RlZFdpbmRvd0hhc2goKSk7XG5cblx0XHQvLyBTZXQgdGhlIGlBcHBTdGF0ZSBpZiB0aGUgaW5pdGlhbCBoYXNoIGNvbnRhaW5zIG9uZVxuXHRcdHRoaXMuc0lBcHBTdGF0ZUtleSA9IHRoaXMuZmluZEFwcFN0YXRlSW5IYXNoKHNDdXJyZW50QXBwSGFzaCk7XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJuIHRoZSBmdWxsIGFwcC1zcGVjaWZpYyBoYXNoIHBhcnQgZnJvbSB3aW5kb3cubG9jYXRpb24uaGFzaC5cblx0ICpcblx0ICogQ29tcGFyZWQgdG8ge0BsaW5rIGdldEhhc2h9IHRoaXMgZnVuY3Rpb24gaW5jbHVkZXMgc3ViLXJvdXRlcyBvZiBuZXN0ZWQgY29tcG9uZW50cy5cblx0ICogQHJldHVybnMgVGhlIGFwcC1zcGVjaWZpYyBoYXNoIHBhcnQgKGkuZS4sIHdpdGhvdXQgdGhlIHNoZWxsIHBhcnQpLCBvciBhbiBlbXB0eSBzdHJpbmcgaWYgdGhlcmUgaXMgbm9uZS5cblx0ICovXG5cdGdldEZ1bGxIYXNoKCk6IHN0cmluZyB7XG5cdFx0Y29uc3Qgc3BsaXRIYXNoID0gdGhpcy5fb1NoZWxsU2VydmljZXMuc3BsaXRIYXNoKHRoaXMuZ2V0RGVjb2RlZFdpbmRvd0hhc2goKSk7XG5cblx0XHRpZiAoXCJhcHBTcGVjaWZpY1JvdXRlXCIgaW4gc3BsaXRIYXNoKSB7XG5cdFx0XHRyZXR1cm4gc3BsaXRIYXNoLmFwcFNwZWNpZmljUm91dGU/LnJlcGxhY2UoL14mXFwvLywgXCJcIikgPz8gXCJcIjsgLy8gcmVtb3ZlIHRoZSBsZWFkaW5nIFwiJi9cIlxuXHRcdH1cblx0XHRyZXR1cm4gXCJcIjtcblx0fVxuXG5cdGdldEhhc2goKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy5fb1JvdXRlci5nZXRIYXNoQ2hhbmdlcigpLmdldEhhc2goKSA/PyBcIlwiO1xuXHR9XG5cblx0cHJvdGVjdGVkIGdldEFwcE5hbWVGcm9tSGFzaChoYXNoOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRcdGNvbnN0IHNwbGl0SGFzaCA9IHRoaXMuX29TaGVsbFNlcnZpY2VzPy5zcGxpdEhhc2goaGFzaCkgYXMgeyBzaGVsbFBhcnQ6IHN0cmluZzsgYXBwU3BlY2lmaWNSb3V0ZTogc3RyaW5nIH0gfCB1bmRlZmluZWQ7XG5cdFx0cmV0dXJuIHNwbGl0SGFzaD8uc2hlbGxQYXJ0ID8/IFwiXCI7XG5cdH1cblxuXHRpc0ZvY3VzRm9yY2VkKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLl9iRm9yY2VGb2N1cztcblx0fVxuXG5cdHNldEZvY3VzRm9yY2VkKGJGb3JjZWQ6IGJvb2xlYW4pOiB2b2lkIHtcblx0XHR0aGlzLl9iRm9yY2VGb2N1cyA9IGJGb3JjZWQ7XG5cdH1cblxuXHQvKipcblx0ICogUmVzZXRzIHRoZSBpbnRlcm5hbCB2YXJpYWJsZSBzSUFwcFN0YXRlS2V5LlxuXHQgKlxuXHQgKi9cblx0cmVtb3ZlSUFwcFN0YXRlS2V5KCk6IHZvaWQge1xuXHRcdHRoaXMuc0lBcHBTdGF0ZUtleSA9IG51bGw7XG5cdH1cblxuXHRzZXRBcHBTdGF0ZVVwZGF0aW5nKHVwZGF0aW5nQXBwU3RhdGU6IGJvb2xlYW4pOiB2b2lkIHtcblx0XHR0aGlzLmFwcFN0YXRlVXBkYXRpbmcgPSB1cGRhdGluZ0FwcFN0YXRlO1xuXHR9XG5cblx0aXNBcHBTdGF0ZVVwZGF0aW5nKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLmFwcFN0YXRlVXBkYXRpbmc7XG5cdH1cblxuXHRwcml2YXRlIHJlbW92ZVJlc3RvcmVIaXN0b3J5RmxhZ0Zyb21IYXNoKGhhc2g6IHN0cmluZyk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIGhhc2gucmVwbGFjZShcInJlc3RvcmVIaXN0b3J5PXRydWUmXCIsIFwiXCIpLnJlcGxhY2UoL1s/Jl1yZXN0b3JlSGlzdG9yeT10cnVlLywgXCJcIik7XG5cdH1cblxuXHQvKipcblx0ICogTmF2aWdhdGVzIHRvIGEgc3BlY2lmaWMgaGFzaC5cblx0ICogQHBhcmFtIHNIYXNoIEhhc2ggdG8gYmUgbmF2aWdhdGVkIHRvXG5cdCAqIEBwYXJhbSBiUHJlc2VydmVIaXN0b3J5IElmIHNldCB0byB0cnVlLCBub24tYW5jZXN0b3IgZW50cmllcyBpbiBoaXN0b3J5IHdpbGwgYmUgcmV0YWluZWRcblx0ICogQHBhcmFtIGJEaXNhYmxlUHJlc2VydmF0aW9uQ2FjaGUgSWYgc2V0IHRvIHRydWUsIGNhY2hlIHByZXNlcnZhdGlvbiBtZWNoYW5pc20gaXMgZGlzYWJsZWQgZm9yIHRoZSBjdXJyZW50IG5hdmlnYXRpb25cblx0ICogQHBhcmFtIGJGb3JjZUZvY3VzIElmIHNldCB0byB0cnVlLCB0aGUgbG9naWMgdG8gc2V0IHRoZSBmb2N1cyBvbmNlIHRoZSBuYXZpZ2F0aW9uIGlzIGZpbmFsaXplZCB3aWxsIGJlIHRyaWdnZXJlZCAob25QYWdlUmVhZHkpXG5cdCAqIEBwYXJhbSBiUHJlc2VydmVTaGVsbEJhY2tOYXZpZ2F0aW9uSGFuZGxlciBJZiBub3Qgc2V0IHRvIGZhbHNlLCB0aGUgYmFjayBuYXZpZ2F0aW9uIGlzIHNldCB0byB1bmRlZmluZWRcblx0ICogQHJldHVybnMgUHJvbWlzZSAocmVzb2x2ZWQgd2hlbiB0aGUgbmF2aWdhdGlvbiBpcyBmaW5hbGl6ZWQpIHRoYXQgcmV0dXJucyAndHJ1ZScgaWYgYSBuYXZpZ2F0aW9uIHRvb2sgcGxhY2UsICdmYWxzZScgaWYgdGhlIG5hdmlnYXRpb24gZGlkbid0IGhhcHBlblxuXHQgKi9cblx0YXN5bmMgbmF2VG9IYXNoKFxuXHRcdHNIYXNoOiBzdHJpbmcsXG5cdFx0YlByZXNlcnZlSGlzdG9yeT86IGJvb2xlYW4sXG5cdFx0YkRpc2FibGVQcmVzZXJ2YXRpb25DYWNoZT86IGJvb2xlYW4sXG5cdFx0YkZvcmNlRm9jdXM/OiBib29sZWFuLFxuXHRcdGJQcmVzZXJ2ZVNoZWxsQmFja05hdmlnYXRpb25IYW5kbGVyPzogYm9vbGVhblxuXHQpOiBQcm9taXNlPGJvb2xlYW4+IHtcblx0XHRzSGFzaCA9IHNIYXNoLnN0YXJ0c1dpdGgoXCIvXCIpID8gc0hhc2guc3Vic3RyaW5nKDEpIDogc0hhc2g7XG5cdFx0aWYgKGJQcmVzZXJ2ZVNoZWxsQmFja05hdmlnYXRpb25IYW5kbGVyICE9PSBmYWxzZSkge1xuXHRcdFx0YXdhaXQgdGhpcy5fb1NoZWxsU2VydmljZXMuc2V0QmFja05hdmlnYXRpb24oKTtcblx0XHR9XG5cdFx0c0hhc2ggPSB0aGlzLnJlbW92ZVJlc3RvcmVIaXN0b3J5RmxhZ0Zyb21IYXNoKHNIYXNoKTtcblx0XHRpZiAodGhpcy5fb1JvdXRlTWF0Y2hTeW5jaHJvbml6YXRpb24pIHtcblx0XHRcdHJldHVybiB0aGlzLl9vUm91dGVNYXRjaFN5bmNocm9uaXphdGlvbi53YWl0Rm9yKCkudGhlbihhc3luYyAoKSA9PiB7XG5cdFx0XHRcdHRoaXMuX29Sb3V0ZU1hdGNoU3luY2hyb25pemF0aW9uID0gdW5kZWZpbmVkO1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5faW50ZXJuYWxOYXZUb0hhc2goc0hhc2gsIGJQcmVzZXJ2ZUhpc3RvcnksIGJEaXNhYmxlUHJlc2VydmF0aW9uQ2FjaGUsIGJGb3JjZUZvY3VzKTtcblx0XHRcdH0pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRpZiAodGhpcy5fYkFjdGl2YXRlUm91dGVNYXRjaFN5bmNocm8pIHtcblx0XHRcdFx0dGhpcy53YWl0Rm9yUm91dGVNYXRjaEJlZm9yZU5hdmlnYXRpb24oKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiB0aGlzLl9pbnRlcm5hbE5hdlRvSGFzaChzSGFzaCwgYlByZXNlcnZlSGlzdG9yeSwgYkRpc2FibGVQcmVzZXJ2YXRpb25DYWNoZSwgYkZvcmNlRm9jdXMpO1xuXHRcdH1cblx0fVxuXG5cdGFzeW5jIF9pbnRlcm5hbE5hdlRvSGFzaChcblx0XHRzSGFzaDogc3RyaW5nLFxuXHRcdGJQcmVzZXJ2ZUhpc3Rvcnk/OiBib29sZWFuLFxuXHRcdGJEaXNhYmxlUHJlc2VydmF0aW9uQ2FjaGU/OiBib29sZWFuLFxuXHRcdGJGb3JjZUZvY3VzPzogYm9vbGVhblxuXHQpOiBQcm9taXNlPGJvb2xlYW4+IHtcblx0XHQvLyBBZGQgdGhlIGFwcCBzdGF0ZSBpbiB0aGUgaGFzaCBpZiBuZWVkZWRcblx0XHRpZiAodGhpcy5mY2xFbmFibGVkICYmIHRoaXMuc0lBcHBTdGF0ZUtleSAmJiAhdGhpcy5maW5kQXBwU3RhdGVJbkhhc2goc0hhc2gpKSB7XG5cdFx0XHRzSGFzaCA9IHRoaXMuc2V0QXBwU3RhdGVJbkhhc2goc0hhc2gsIHRoaXMuc0lBcHBTdGF0ZUtleSk7XG5cdFx0fVxuXG5cdFx0aWYgKCF0aGlzLmNoZWNrSGFzaFdpdGhHdWFyZChzSGFzaCkpIHtcblx0XHRcdGlmICghdGhpcy5vUmVzb3VyY2VCdW5kbGUpIHtcblx0XHRcdFx0dGhpcy5vUmVzb3VyY2VCdW5kbGUgPSBMaWJyYXJ5LmdldFJlc291cmNlQnVuZGxlRm9yKFwic2FwLmZlLmNvcmVcIikhO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBXZSBoYXZlIHRvIHVzZSBhIGNvbmZpcm0gaGVyZSBmb3IgVUkgY29uc2lzdGVuY3kgcmVhc29ucywgYXMgd2l0aCBzb21lIHNjZW5hcmlvc1xuXHRcdFx0Ly8gaW4gdGhlIEVkaXRGbG93IHdlIHJlbHkgb24gYSBVSTUgbWVjaGFuaXNtIHRoYXQgZGlzcGxheXMgYSBjb25maXJtIGRpYWxvZy5cblx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1hbGVydFxuXHRcdFx0aWYgKCFjb25maXJtKHRoaXMub1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX1JPVVRFUl9QUk9YWV9TQVBGRV9FWElUX05PVFNBVkVEX01FU1NBR0VcIikpKSB7XG5cdFx0XHRcdC8vIFRoZSB1c2VyIGNsaWNrZWQgb24gQ2FuY2VsIC0tPiBjYW5jZWwgbmF2aWdhdGlvblxuXHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcblx0XHRcdH1cblx0XHRcdHRoaXMuYklzR3VhcmRDcm9zc0FsbG93ZWQgPSB0cnVlO1xuXHRcdH1cblxuXHRcdC8vIEluIGNhc2UgdGhlIG5hdmlnYXRpb24gd2lsbCBjYXVzZSBhIG5ldyB2aWV3IHRvIGJlIGRpc3BsYXllZCwgd2UgZm9yY2UgdGhlIGZvY3VzXG5cdFx0Ly8gSS5lLiBpZiB0aGUga2V5cyBmb3IgdGhlIGhhc2ggd2UncmUgbmF2aWdhdGluZyB0byBpcyBhIHN1cGVyc2V0IG9mIHRoZSBjdXJyZW50IGhhc2gga2V5cy5cblx0XHRjb25zdCBvTmV3U3RhdGUgPSB0aGlzLl9leHRyYWN0U3RhdGVGcm9tSGFzaChzSGFzaCk7XG5cdFx0aWYgKCF0aGlzLl9iRm9yY2VGb2N1cykge1xuXHRcdFx0Ly8gSWYgdGhlIGZvY3VzIHdhcyBhbHJlYWR5IGZvcmNlZCwga2VlcCBpdFxuXHRcdFx0Y29uc3QgYUN1cnJlbnRIYXNoS2V5cyA9IFJvdXRlclByb3h5LmV4dHJhY3RFbnRpdHlTZXRzRnJvbUhhc2godGhpcy5nZXRIYXNoKCkpO1xuXHRcdFx0dGhpcy5fYkZvcmNlRm9jdXMgPVxuXHRcdFx0XHRiRm9yY2VGb2N1cyB8fFxuXHRcdFx0XHQoYUN1cnJlbnRIYXNoS2V5cy5sZW5ndGggPCBvTmV3U3RhdGUua2V5cy5sZW5ndGggJiZcblx0XHRcdFx0XHRhQ3VycmVudEhhc2hLZXlzLmV2ZXJ5KGZ1bmN0aW9uIChrZXk6IHN0cmluZywgaW5kZXg6IG51bWJlcikge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGtleSA9PT0gb05ld1N0YXRlLmtleXNbaW5kZXhdO1xuXHRcdFx0XHRcdH0pKTtcblx0XHR9XG5cblx0XHRjb25zdCBvSGlzdG9yeUFjdGlvbiA9IHRoaXMuX3B1c2hOZXdTdGF0ZShvTmV3U3RhdGUsIGZhbHNlLCBiUHJlc2VydmVIaXN0b3J5LCBiRGlzYWJsZVByZXNlcnZhdGlvbkNhY2hlKTtcblx0XHR0aGlzLnN0b3JlRm9jdXNJbmZvRm9yQ3VycmVudEhhc2goKTtcblxuXHRcdHJldHVybiB0aGlzLl9yZWJ1aWxkQnJvd3Nlckhpc3Rvcnkob0hpc3RvcnlBY3Rpb24sIGZhbHNlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDbGVhcnMgYnJvd3NlciBoaXN0b3J5IGlmIGVudHJpZXMgaGF2ZSBiZWVuIGFkZGVkIHdpdGhvdXQgdXNpbmcgdGhlIFJvdXRlclByb3h5LlxuXHQgKiBVcGRhdGVzIHRoZSBpbnRlcm5hbCBoaXN0b3J5IGFjY29yZGluZ2x5LlxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgb25jZSB0aGUgaGlzdG9yeSBpcyByZWJ1aWx0XG5cdCAqL1xuXHRhc3luYyByZXN0b3JlSGlzdG9yeSgpOiBQcm9taXNlPHZvaWQgfCBib29sZWFuPiB7XG5cdFx0aWYgKHRoaXMuX2JBcHBseVJlc3RvcmUpIHtcblx0XHRcdHRoaXMuX2JBcHBseVJlc3RvcmUgPSBmYWxzZTtcblx0XHRcdGxldCBzVGFyZ2V0SGFzaCA9IHRoaXMuZ2V0SGFzaCgpO1xuXHRcdFx0c1RhcmdldEhhc2ggPSB0aGlzLnJlbW92ZVJlc3RvcmVIaXN0b3J5RmxhZ0Zyb21IYXNoKHNUYXJnZXRIYXNoKTtcblx0XHRcdGNvbnN0IG9OZXdTdGF0ZSA9IHRoaXMuX2V4dHJhY3RTdGF0ZUZyb21IYXNoKHNUYXJnZXRIYXNoKTtcblxuXHRcdFx0Y29uc3Qgb0hpc3RvcnlBY3Rpb24gPSB0aGlzLl9wdXNoTmV3U3RhdGUob05ld1N0YXRlLCB0cnVlLCBmYWxzZSwgdHJ1ZSk7XG5cblx0XHRcdHRoaXMucmVzdG9yZUhpc3RvcnlUcmlnZ2VyZWQgPSB0cnVlO1xuXHRcdFx0cmV0dXJuIHRoaXMuX3JlYnVpbGRCcm93c2VySGlzdG9yeShvSGlzdG9yeUFjdGlvbiwgdHJ1ZSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2tzIGlmIFJlc3RvcmVIaXN0b3J5IGhhcyBiZWVuIHRyaWdnZXJlZCBvbiB0aGUgUm91dGVyUHJveHkuXG5cdCAqIEByZXR1cm5zIFRydWUgaWYgaXQgaGFzIGJlZW4gdHJpZ2dlcmVkXG5cdCAqL1xuXHRjaGVja1Jlc3RvcmVIaXN0b3J5V2FzVHJpZ2dlcmVkKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLnJlc3RvcmVIaXN0b3J5VHJpZ2dlcmVkO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlc2V0cyB0aGUgZmxhZyB0aGF0IHNheXMgaWYgUmVzdG9yZUhpc3RvcnkgaGFzIGJlZW4gdHJpZ2dlcmVkIG9uIHRoZSBSb3V0ZXJQcm94eS5cblx0ICovXG5cdHJlc2V0UmVzdG9yZUhpc3RvcnlGbGFnKCk6IHZvaWQge1xuXHRcdHRoaXMucmVzdG9yZUhpc3RvcnlUcmlnZ2VyZWQgPSBmYWxzZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBOYXZpZ2F0ZXMgYmFjayBpbiB0aGUgaGlzdG9yeS5cblx0ICogQHJldHVybnMgUHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdoZW4gdGhlIG5hdmlnYXRpb24gaXMgZmluYWxpemVkXG5cdCAqL1xuXHRhc3luYyBuYXZCYWNrKCk6IFByb21pc2U8dm9pZCB8IGJvb2xlYW4+IHtcblx0XHRjb25zdCBzQ3VycmVudEhhc2ggPSB0aGlzLmdldEhhc2goKTtcblx0XHRsZXQgc1ByZXZpb3VzSGFzaDtcblxuXHRcdC8vIExvb2sgZm9yIHRoZSBjdXJyZW50IGhhc2ggaW4gdGhlIG1hbmFnZWQgaGlzdG9yeVxuXHRcdGZvciAobGV0IGkgPSB0aGlzLl9vTWFuYWdlZEhpc3RvcnkubGVuZ3RoIC0gMTsgaSA+IDA7IGktLSkge1xuXHRcdFx0aWYgKHRoaXMuX29NYW5hZ2VkSGlzdG9yeVtpXS5oYXNoID09PSBzQ3VycmVudEhhc2gpIHtcblx0XHRcdFx0c1ByZXZpb3VzSGFzaCA9IHRoaXMuX29NYW5hZ2VkSGlzdG9yeVtpIC0gMV0uaGFzaDtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKHNQcmV2aW91c0hhc2gpIHtcblx0XHRcdHJldHVybiB0aGlzLm5hdlRvSGFzaChzUHJldmlvdXNIYXNoKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gV2UgY291bGRuJ3QgZmluZCBhIHByZXZpb3VzIGhhc2ggaW4gaGlzdG9yeVxuXHRcdFx0Ly8gVGhpcyBjYW4gaGFwcGVuIHdoZW4gbmF2aWdhdGluZyBmcm9tIGEgdHJhbnNpZW50IGhhc2ggaW4gYSBjcmVhdGUgYXBwLCBhbmRcblx0XHRcdC8vIGluIHRoYXQgY2FzZSBoaXN0b3J5LmJhY2sgd291bGQgZ28gYmFjayB0byB0aGUgRkxQXG5cdFx0XHR3aW5kb3cuaGlzdG9yeS5iYWNrKCk7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIE5hdmlnYXRlcyB0byBhIHJvdXRlIHdpdGggcGFyYW1ldGVycy5cblx0ICogQHBhcmFtIHNSb3V0ZU5hbWUgVGhlIHJvdXRlIG5hbWUgdG8gYmUgbmF2aWdhdGVkIHRvXG5cdCAqIEBwYXJhbSBvUGFyYW1ldGVycyBQYXJhbWV0ZXJzIGZvciB0aGUgbmF2aWdhdGlvblxuXHQgKiBAcGFyYW0gb1BhcmFtZXRlcnMubm9QcmVzZXJ2YXRpb25DYWNoZVxuXHQgKiBAcGFyYW0gb1BhcmFtZXRlcnMuYklzU3RpY2t5TW9kZVxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2hlbiB0aGUgbmF2aWdhdGlvbiBpcyBmaW5hbGl6ZWRcblx0ICovXG5cdGFzeW5jIG5hdlRvKHNSb3V0ZU5hbWU6IHN0cmluZywgb1BhcmFtZXRlcnM/OiB7IG5vUHJlc2VydmF0aW9uQ2FjaGU/OiBib29sZWFuOyBiSXNTdGlja3lNb2RlPzogYm9vbGVhbiB9KTogUHJvbWlzZTxib29sZWFuPiB7XG5cdFx0Y29uc3Qgc0hhc2ggPSB0aGlzLl9vUm91dGVyLmdldFVSTChzUm91dGVOYW1lLCBvUGFyYW1ldGVycyk7XG5cdFx0cmV0dXJuIHRoaXMubmF2VG9IYXNoKHNIYXNoISwgZmFsc2UsIG9QYXJhbWV0ZXJzPy5ub1ByZXNlcnZhdGlvbkNhY2hlLCBmYWxzZSwgIW9QYXJhbWV0ZXJzPy5iSXNTdGlja3lNb2RlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBFeGl0cyB0aGUgY3VycmVudCBhcHAgYnkgbmF2aWdhdGluZyBiYWNrXG5cdCAqIHRvIHRoZSBwcmV2aW91cyBhcHAgKGlmIGFueSkgb3IgdGhlIEZMUC5cblx0ICogQHJldHVybnMgUHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdoZW4gd2UgZXhpdCB0aGUgYXBwXG5cdCAqL1xuXHRleGl0RnJvbUFwcCgpOiB2b2lkIHtcblx0XHRyZXR1cm4gdGhpcy5fb1NoZWxsU2VydmljZXMuYmFja1RvUHJldmlvdXNBcHAoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVja3Mgd2hldGhlciBhIGdpdmVuIGhhc2ggY2FuIGhhdmUgYW4gaW1wYWN0IG9uIHRoZSBjdXJyZW50IHN0YXRlXG5cdCAqIGkuZS4gaWYgdGhlIGhhc2ggaXMgZXF1YWwsIGNvbXBhdGlibGUgb3IgYW4gYW5jZXN0b3Igb2YgdGhlIGN1cnJlbnQgc3RhdGUuXG5cdCAqIEBwYXJhbSBzSGFzaCBgdHJ1ZWAgaWYgdGhlcmUgaXMgYW4gaW1wYWN0XG5cdCAqIEByZXR1cm5zIElmIHRoZXJlIGlzIGFuIGltcGFjdFxuXHQgKi9cblx0aXNDdXJyZW50U3RhdGVJbXBhY3RlZEJ5KHNIYXNoOiBzdHJpbmcpOiBib29sZWFuIHtcblx0XHRpZiAoc0hhc2hbMF0gPT09IFwiL1wiKSB7XG5cdFx0XHRzSGFzaCA9IHNIYXNoLnN1YnN0cmluZygxKTtcblx0XHR9XG5cdFx0Y29uc3Qgb0xvY2FsR3VhcmQgPSBjcmVhdGVHdWFyZEZyb21IYXNoKHNIYXNoKTtcblx0XHRyZXR1cm4gb0xvY2FsR3VhcmQuY2hlY2sodGhpcy5nZXRIYXNoKCkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiBhIG5hdmlnYXRpb24gaXMgY3VycmVudGx5IGJlaW5nIHByb2Nlc3NlZC5cblx0ICogQHJldHVybnMgYGZhbHNlYCBpZiBhIG5hdmlnYXRpb24gaGFzIGJlZW4gdHJpZ2dlcmVkIGluIHRoZSBSb3V0ZXJQcm94eSBhbmQgaXMgbm90IHlldCBmaW5hbGl6ZWRcblx0ICovXG5cdGlzTmF2aWdhdGlvbkZpbmFsaXplZCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gIXRoaXMuYklzUmVidWlsZEhpc3RvcnlSdW5uaW5nO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgdGhlIGxhc3Qgc3RhdGUgYXMgYSBndWFyZC5cblx0ICogRWFjaCBmdXR1cmUgbmF2aWdhdGlvbiB3aWxsIGJlIGNoZWNrZWQgYWdhaW5zdCB0aGlzIGd1YXJkLCBhbmQgYSBjb25maXJtYXRpb24gZGlhbG9nIHdpbGxcblx0ICogYmUgZGlzcGxheWVkIGJlZm9yZSB0aGUgbmF2aWdhdGlvbiBnb2VzIHRvIGFuIGFuY2VzdG9yIG9mIHRoZSBndWFyZC5cblx0ICogQHBhcmFtIHNIYXNoIFRoZSBoYXNoIGZvciB0aGUgZ3VhcmQuXG5cdCAqIEBwYXJhbSBbaGFzaFRyYWtlcl0gT3B0aW9uYWwgaGFzaCB0cmFja2VyIHVzZWQgZm9yIGFkZGl0aW9uYWwgZ3VhcmQgY2hlY2tzLlxuXHQgKi9cblx0c2V0TmF2aWdhdGlvbkd1YXJkKHNIYXNoOiBzdHJpbmcsIGhhc2hUcmFrZXI/OiBzdHJpbmcpOiB2b2lkIHtcblx0XHR0aGlzLl9vTmF2aWdhdGlvbkd1YXJkID0gY3JlYXRlR3VhcmRGcm9tSGFzaChzSGFzaCwgaGFzaFRyYWtlcik7XG5cdFx0dGhpcy5iSXNHdWFyZENyb3NzQWxsb3dlZCA9IGZhbHNlO1xuXHR9XG5cblx0LyoqXG5cdCAqIERpc2FibGVzIHRoZSBuYXZpZ2F0aW9uIGd1YXJkLlxuXHQgKi9cblx0ZGlzY2FyZE5hdmlnYXRpb25HdWFyZCgpOiB2b2lkIHtcblx0XHR0aGlzLl9vTmF2aWdhdGlvbkd1YXJkID0gbnVsbDtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVja3MgZm9yIHRoZSBhdmFpbGFiaWxpdHkgb2YgdGhlIG5hdmlnYXRpb24gZ3VhcmQuXG5cdCAqIEByZXR1cm5zIGB0cnVlYCBpZiBuYXZpZ2F0aW5nIGd1YXJkIGlzIGF2YWlsYWJsZVxuXHQgKi9cblx0aGFzTmF2aWdhdGlvbkd1YXJkKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLl9vTmF2aWdhdGlvbkd1YXJkICE9PSBudWxsO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRlc3RzIGEgaGFzaCBhZ2FpbnN0IHRoZSBuYXZpZ2F0aW9uIGd1YXJkLlxuXHQgKiBAcGFyYW0gc0hhc2ggVGhlIGhhc2ggdG8gYmUgdGVzdGVkXG5cdCAqIEByZXR1cm5zIGB0cnVlYCBpZiBuYXZpZ2F0aW5nIHRvIHRoZSBoYXNoIGRvZXNuJ3QgY3Jvc3MgdGhlIGd1YXJkXG5cdCAqL1xuXHRjaGVja0hhc2hXaXRoR3VhcmQoc0hhc2g6IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLl9vTmF2aWdhdGlvbkd1YXJkID09PSBudWxsIHx8IHRoaXMuX29OYXZpZ2F0aW9uR3VhcmQuY2hlY2soc0hhc2gpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiB0aGUgdXNlciBhbGxvd2VkIHRoZSBuYXZpZ2F0aW9uIGd1YXJkIHRvIGJlIGNyb3NzZWQuXG5cdCAqIEByZXR1cm5zIGB0cnVlYCBpZiBjcm9zc2luZyB0aGUgZ3VhcmQgaGFzIGJlZW4gYWxsb3dlZCBieSB0aGUgdXNlclxuXHQgKi9cblx0aXNHdWFyZENyb3NzQWxsb3dlZEJ5VXNlcigpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5iSXNHdWFyZENyb3NzQWxsb3dlZDtcblx0fVxuXG5cdC8qKlxuXHQgKiBBY3RpdmF0ZXMgdGhlIHN5bmNocm9uaXphdGlvbiBmb3Igcm91dGVNYXRjaGVkRXZlbnQuXG5cdCAqIFRoZSBuZXh0IE5hdlRvSGFzaCBjYWxsIHdpbGwgY3JlYXRlIGEgU3luY2hyb25pemF0aW9uIG9iamVjdCB0aGF0IHdpbGwgYmUgcmVzb2x2ZWRcblx0ICogYnkgdGhlIGNvcnJlc3BvbmRpbmcgb25Sb3V0ZU1hdGNoZWQgZXZlbnQsIHByZXZlbnRpbmcgYW5vdGhlciBOYXZUb0hhc2ggdG8gaGFwcGVuIGluIHBhcmFsbGVsLlxuXHQgKi9cblx0YWN0aXZhdGVSb3V0ZU1hdGNoU3luY2hyb25pemF0aW9uKCk6IHZvaWQge1xuXHRcdHRoaXMuX2JBY3RpdmF0ZVJvdXRlTWF0Y2hTeW5jaHJvID0gdHJ1ZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXNvbHZlIHRoZSByb3V0ZU1hdGNoIHN5bmNocm9uaXphdGlvbiBvYmplY3QsIHVubG9ja2luZyBwb3RlbnRpYWwgcGVuZGluZyBOYXZUb0hhc2ggY2FsbHMuXG5cdCAqL1xuXHRyZXNvbHZlUm91dGVNYXRjaCgpOiB2b2lkIHtcblx0XHRpZiAodGhpcy5fb1JvdXRlTWF0Y2hTeW5jaHJvbml6YXRpb24pIHtcblx0XHRcdHRoaXMuX29Sb3V0ZU1hdGNoU3luY2hyb25pemF0aW9uLnJlc29sdmUoKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogTWFrZXMgc3VyZSBubyBuYXZpZ2F0aW9uIGNhbiBoYXBwZW4gYmVmb3JlIGEgcm91dGVNYXRjaCBoYXBwZW5lZC5cblx0ICovXG5cdHdhaXRGb3JSb3V0ZU1hdGNoQmVmb3JlTmF2aWdhdGlvbigpOiB2b2lkIHtcblx0XHR0aGlzLl9vUm91dGVNYXRjaFN5bmNocm9uaXphdGlvbiA9IG5ldyBTeW5jaHJvbml6YXRpb24oKTtcblx0XHR0aGlzLl9iQWN0aXZhdGVSb3V0ZU1hdGNoU3luY2hybyA9IGZhbHNlO1xuXHR9XG5cblx0c3RhdGljIGV4dHJhY3RFbnRpdHlTZXRzRnJvbUhhc2goc0hhc2g6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZ1tdIHtcblx0XHRpZiAoc0hhc2ggPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0c0hhc2ggPSBcIlwiO1xuXHRcdH1cblx0XHRjb25zdCBzSGFzaE5vUGFyYW1zID0gc0hhc2guc3BsaXQoXCI/XCIpWzBdOyAvLyByZW1vdmUgcGFyYW1zXG5cdFx0Y29uc3QgYVRva2VucyA9IHNIYXNoTm9QYXJhbXMuc3BsaXQoXCIvXCIpO1xuXHRcdGNvbnN0IG5hbWVzOiBzdHJpbmdbXSA9IFtdO1xuXG5cdFx0YVRva2Vucy5mb3JFYWNoKChzVG9rZW4pID0+IHtcblx0XHRcdGlmIChzVG9rZW4ubGVuZ3RoKSB7XG5cdFx0XHRcdG5hbWVzLnB1c2goc1Rva2VuLnNwbGl0KFwiKFwiKVswXSk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHRyZXR1cm4gbmFtZXM7XG5cdH1cblxuXHQvKipcblx0ICogQnVpbGRzIGEgc3RhdGUgZnJvbSBhIGhhc2guXG5cdCAqIEBwYXJhbSBzSGFzaCBUaGUgaGFzaCB0byBiZSB1c2VkIGFzIGVudHJ5XG5cdCAqIEByZXR1cm5zIFRoZSBzdGF0ZVxuXHQgKi9cblx0X2V4dHJhY3RTdGF0ZUZyb21IYXNoKHNIYXNoOiBzdHJpbmcpOiBSb3V0ZXJTdGF0ZSB7XG5cdFx0aWYgKHNIYXNoID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHNIYXNoID0gXCJcIjtcblx0XHR9XG5cblx0XHRjb25zdCBvU3RhdGU6IFJvdXRlclN0YXRlID0ge1xuXHRcdFx0a2V5czogUm91dGVyUHJveHkuZXh0cmFjdEVudGl0eVNldHNGcm9tSGFzaChzSGFzaCksXG5cdFx0XHRoYXNoOiBzSGFzaCxcblx0XHRcdHNjcmVlbk1vZGU6IDAgLy8gd2lsbCBiZSB1cGRhdGVkIGluIGEgc2VjXG5cdFx0fTtcblxuXHRcdC8vIFJldHJpZXZlIGxheW91dCAoaWYgYW55KVxuXHRcdGNvbnN0IGFMYXlvdXQgPSBzSGFzaC5tYXRjaChuZXcgUmVnRXhwKGBcXFxcPy4qJHtlbnVtVVJMUGFyYW1zLkxBWU9VVFBBUkFNfT0oW14mXSopYCkpO1xuXHRcdG9TdGF0ZS5zTGF5b3V0ID0gYUxheW91dCAmJiBhTGF5b3V0Lmxlbmd0aCA+IDEgPyBhTGF5b3V0WzFdIDogdW5kZWZpbmVkO1xuXHRcdGlmIChvU3RhdGUuc0xheW91dCA9PT0gXCJNaWRDb2x1bW5GdWxsU2NyZWVuXCIpIHtcblx0XHRcdG9TdGF0ZS5zY3JlZW5Nb2RlID0gMTtcblx0XHR9IGVsc2UgaWYgKG9TdGF0ZS5zTGF5b3V0ID09PSBcIkVuZENvbHVtbkZ1bGxTY3JlZW5cIikge1xuXHRcdFx0b1N0YXRlLnNjcmVlbk1vZGUgPSAyO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRvU3RhdGUuc2NyZWVuTW9kZSA9IDA7XG5cdFx0fVxuXHRcdHJldHVybiBvU3RhdGU7XG5cdH1cblxuXHQvKipcblx0ICogQWRkcyBhIG5ldyBzdGF0ZSBpbnRvIHRoZSBpbnRlcm5hbCBoaXN0b3J5IHN0cnVjdHVyZS5cblx0ICogTWFrZXMgc3VyZSB0aGlzIG5ldyBzdGF0ZSBpcyBhZGRlZCBhZnRlciBhbiBhbmNlc3Rvci5cblx0ICogQWxzbyBzZXRzIHRoZSBpQXBwU3RhdGUga2V5IGluIHRoZSB3aG9sZSBoaXN0b3J5LlxuXHQgKiBAcGFyYW0gb05ld1N0YXRlIFRoZSBuZXcgc3RhdGUgdG8gYmUgYWRkZWRcblx0ICogQHBhcmFtIGJSZWJ1aWxkT25seSBgdHJ1ZWAgaWYgd2UncmUgcmVidWlsZGluZyB0aGUgaGlzdG9yeSBhZnRlciBhIHNoZWxsIG1lbnUgbmF2aWdhdGlvblxuXHQgKiBAcGFyYW0gYlByZXNlcnZlSGlzdG9yeSBJZiBzZXQgdG8gdHJ1ZSwgbm9uLWFuY2VzdG9yIGVudHJpZXMgaW4gaGlzdG9yeSB3aWxsIGJlIHJldGFpbmVkXG5cdCAqIEBwYXJhbSBiRGlzYWJsZUhpc3RvcnlQcmVzZXJ2YXRpb24gRGlzYWJsZSB0aGUgbWVjaGFuaXNtIHRvIHJldGFpbmVkIG1hcmtlZCBlbnRyaWVzIGluIGNhY2hlXG5cdCAqIEByZXR1cm5zIFRoZSBuZXcgc3RhdGVcblx0ICogQGZpbmFsXG5cdCAqL1xuXHRfcHVzaE5ld1N0YXRlKFxuXHRcdG9OZXdTdGF0ZTogUm91dGVyU3RhdGUsXG5cdFx0YlJlYnVpbGRPbmx5OiBib29sZWFuLFxuXHRcdGJQcmVzZXJ2ZUhpc3Rvcnk/OiBib29sZWFuLFxuXHRcdGJEaXNhYmxlSGlzdG9yeVByZXNlcnZhdGlvbj86IGJvb2xlYW5cblx0KTogSHlzdG9yeUFjdGlvbiB7XG5cdFx0Y29uc3Qgc0N1cnJlbnRIYXNoID0gdGhpcy5yZW1vdmVSZXN0b3JlSGlzdG9yeUZsYWdGcm9tSGFzaCh0aGlzLmdldEhhc2goKSk7XG5cdFx0bGV0IGxhc3RJbmRleCA9IHRoaXMuX29NYW5hZ2VkSGlzdG9yeS5sZW5ndGggLSAxO1xuXHRcdGxldCBpUG9wQ291bnQgPSBiUmVidWlsZE9ubHkgPyAxIDogMDtcblxuXHRcdC8vIDEuIERvIHNvbWUgY2xlYW51cCBpbiB0aGUgbWFuYWdlZCBoaXN0b3J5IDogaW4gY2FzZSB0aGUgdXNlciBoYXMgbmF2aWdhdGVkIGJhY2sgaW4gdGhlIGJyb3dzZXIgaGlzdG9yeSwgd2UgbmVlZCB0byByZW1vdmVcblx0XHQvLyB0aGUgc3RhdGVzIGFoZWFkIGluIGhpc3RvcnkgYW5kIG1ha2Ugc3VyZSB0aGUgdG9wIHN0YXRlIGNvcnJlc3BvbmRzIHRvIHRoZSBjdXJyZW50IHBhZ2Vcblx0XHQvLyBXZSBkb24ndCBkbyB0aGF0IHdoZW4gcmVzdG9yaW5nIHRoZSBoaXN0b3J5LCBhcyB0aGUgY3VycmVudCBzdGF0ZSBoYXMgYmVlbiBhZGRlZCBvbiB0b3Agb2YgdGhlIGJyb3dzZXIgaGlzdG9yeVxuXHRcdC8vIGFuZCBpcyBub3QgcmVmbGVjdGVkIGluIHRoZSBtYW5hZ2VkIGhpc3Rvcnlcblx0XHRpZiAoIWJSZWJ1aWxkT25seSkge1xuXHRcdFx0d2hpbGUgKGxhc3RJbmRleCA+PSAwICYmIHRoaXMuX29NYW5hZ2VkSGlzdG9yeVtsYXN0SW5kZXhdLmhhc2ggIT09IHNDdXJyZW50SGFzaCkge1xuXHRcdFx0XHR0aGlzLl9vTWFuYWdlZEhpc3RvcnkucG9wKCk7XG5cdFx0XHRcdGxhc3RJbmRleC0tO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAodGhpcy5fb01hbmFnZWRIaXN0b3J5Lmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0XHQvLyBXZSBjb3VsZG4ndCBmaW5kIHRoZSBjdXJyZW50IGxvY2F0aW9uIGluIHRoZSBoaXN0b3J5LiBUaGlzIGNhbiBoYXBwZW4gaWYgYSBicm93c2VyIHJlbG9hZFxuXHRcdFx0XHQvLyBoYXBwZW5lZCwgY2F1c2luZyBhIHJlaW5pdGlhbGl6YXRpb24gb2YgdGhlIG1hbmFnZWQgaGlzdG9yeS5cblx0XHRcdFx0Ly8gSW4gdGhhdCBjYXNlLCB3ZSB1c2UgdGhlIGN1cnJlbnQgbG9jYXRpb24gYXMgdGhlIG5ldyBzdGFydGluZyBwb2ludCBpbiB0aGUgbWFuYWdlZCBoaXN0b3J5XG5cdFx0XHRcdHRoaXMuX29NYW5hZ2VkSGlzdG9yeS5wdXNoKHRoaXMuX2V4dHJhY3RTdGF0ZUZyb21IYXNoKHNDdXJyZW50SGFzaCkpO1xuXHRcdFx0XHRoaXN0b3J5LnJlcGxhY2VTdGF0ZShPYmplY3QuYXNzaWduKHsgZmVMZXZlbDogMCB9LCBoaXN0b3J5LnN0YXRlKSwgXCJcIik7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gMi4gTWFyayB0aGUgdG9wIHN0YXRlIGFzIHByZXNlcnZlZCBpZiByZXF1aXJlZFxuXHRcdGlmIChiUHJlc2VydmVIaXN0b3J5ICYmICFiRGlzYWJsZUhpc3RvcnlQcmVzZXJ2YXRpb24pIHtcblx0XHRcdHRoaXMuX29NYW5hZ2VkSGlzdG9yeVt0aGlzLl9vTWFuYWdlZEhpc3RvcnkubGVuZ3RoIC0gMV0ucHJlc2VydmVkID0gdHJ1ZTtcblx0XHR9XG5cblx0XHQvLyAzLiBUaGVuIHBvcCBhbGwgc3RhdGVzIHVudGlsIHdlIGZpbmQgYW4gYW5jZXN0b3Igb2YgdGhlIG5ldyBzdGF0ZSwgb3Igd2UgZmluZCBhIHN0YXRlIHRoYXQgbmVlZCB0byBiZSBwcmVzZXJ2ZWRcblx0XHRsZXQgb0xhc3RSZW1vdmVkSXRlbTtcblx0XHR3aGlsZSAodGhpcy5fb01hbmFnZWRIaXN0b3J5Lmxlbmd0aCA+IDApIHtcblx0XHRcdGNvbnN0IG9Ub3BTdGF0ZSA9IHRoaXMuX29NYW5hZ2VkSGlzdG9yeVt0aGlzLl9vTWFuYWdlZEhpc3RvcnkubGVuZ3RoIC0gMV07XG5cdFx0XHRpZiAoXG5cdFx0XHRcdChiRGlzYWJsZUhpc3RvcnlQcmVzZXJ2YXRpb24gfHwgIW9Ub3BTdGF0ZS5wcmVzZXJ2ZWQpICYmXG5cdFx0XHRcdHRoaXMuX2NvbXBhcmVDYWNoZVN0YXRlcyhvVG9wU3RhdGUsIG9OZXdTdGF0ZSkgIT09IGVudW1TdGF0ZS5BTkNFU1RPUlxuXHRcdFx0KSB7XG5cdFx0XHRcdC8vIFRoZSB0b3Agc3RhdGUgaXMgbm90IGFuIGFuY2VzdG9yIG9mIG9OZXdTdGF0ZSBhbmQgaXMgbm90IHByZXNlcnZlZCAtLT4gd2UgY2FuIHBvcCBpdFxuXHRcdFx0XHRvTGFzdFJlbW92ZWRJdGVtID0gdGhpcy5fb01hbmFnZWRIaXN0b3J5LnBvcCgpO1xuXHRcdFx0XHRpUG9wQ291bnQrKztcblx0XHRcdH0gZWxzZSBpZiAob1RvcFN0YXRlLnByZXNlcnZlZCAmJiByZW1vdmVBcHBTdGF0ZUluSGFzaChvVG9wU3RhdGUuaGFzaCkgPT09IHJlbW92ZUFwcFN0YXRlSW5IYXNoKG9OZXdTdGF0ZS5oYXNoKSkge1xuXHRcdFx0XHQvLyBXZSB0cnkgdG8gYWRkIGEgc3RhdGUgdGhhdCBpcyBhbHJlYWR5IGluIGNhY2hlIChkdWUgdG8gcHJlc2VydmVkIGZsYWcpIGJ1dCB3aXRoIGEgZGlmZmVyZW50IGlhcHAtc3RhdGVcblx0XHRcdFx0Ly8gLS0+IHdlIHNob3VsZCBkZWxldGUgdGhlIHByZXZpb3VzIGVudHJ5IChpdCB3aWxsIGJlIGxhdGVyIHJlcGxhY2VkIGJ5IHRoZSBuZXcgb25lKSBhbmQgc3RvcCBwb3BwaW5nXG5cdFx0XHRcdG9MYXN0UmVtb3ZlZEl0ZW0gPSB0aGlzLl9vTWFuYWdlZEhpc3RvcnkucG9wKCk7XG5cdFx0XHRcdGlQb3BDb3VudCsrO1xuXHRcdFx0XHRvTmV3U3RhdGUucHJlc2VydmVkID0gdHJ1ZTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRicmVhazsgLy8gQW5jZXN0b3Igb3IgcHJlc2VydmVkIHN0YXRlIGZvdW5kIC0tPiB3ZSBzdG9wIHBvcHBpbmcgb3V0IHN0YXRlc1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIDQuIGlBcHBTdGF0ZSBtYW5hZ2VtZW50XG5cdFx0dGhpcy5zSUFwcFN0YXRlS2V5ID0gdGhpcy5maW5kQXBwU3RhdGVJbkhhc2gob05ld1N0YXRlLmhhc2gpO1xuXHRcdGlmICghdGhpcy5mY2xFbmFibGVkICYmIG9MYXN0UmVtb3ZlZEl0ZW0pIHtcblx0XHRcdGNvbnN0IHNQcmV2aW91c0lBcHBTdGF0ZUtleSA9IHRoaXMuZmluZEFwcFN0YXRlSW5IYXNoKG9MYXN0UmVtb3ZlZEl0ZW0uaGFzaCk7XG5cdFx0XHRjb25zdCBvQ29tcGFyaXNvblN0YXRlUmVzdWx0ID0gdGhpcy5fY29tcGFyZUNhY2hlU3RhdGVzKG9MYXN0UmVtb3ZlZEl0ZW0sIG9OZXdTdGF0ZSk7XG5cdFx0XHQvLyBpZiBjdXJyZW50IHN0YXRlIGRvZXNuJ3QgY29udGFpbiBhIGktYXBwc3RhdGUgYW5kIHRoaXMgc3RhdGUgc2hvdWxkIHJlcGxhY2UgYSBzdGF0ZSBjb250YWluaW5nIGEgaUFwcFN0YXRlXG5cdFx0XHQvLyB0aGVuIHRoZSBwcmV2aW91cyBpQXBwU3RhdGUgaXMgcHJlc2VydmVkXG5cdFx0XHRpZiAoXG5cdFx0XHRcdCF0aGlzLnNJQXBwU3RhdGVLZXkgJiZcblx0XHRcdFx0c1ByZXZpb3VzSUFwcFN0YXRlS2V5ICYmXG5cdFx0XHRcdChvQ29tcGFyaXNvblN0YXRlUmVzdWx0ID09PSBlbnVtU3RhdGUuRVFVQUwgfHwgb0NvbXBhcmlzb25TdGF0ZVJlc3VsdCA9PT0gZW51bVN0YXRlLkNPTVBBVElCTEUpXG5cdFx0XHQpIHtcblx0XHRcdFx0b05ld1N0YXRlLmhhc2ggPSB0aGlzLnNldEFwcFN0YXRlSW5IYXNoKG9OZXdTdGF0ZS5oYXNoLCBzUHJldmlvdXNJQXBwU3RhdGVLZXkpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIDUuIE5vdyB3ZSBjYW4gcHVzaCB0aGUgc3RhdGUgYXQgdGhlIHRvcCBvZiB0aGUgaW50ZXJuYWwgaGlzdG9yeVxuXHRcdGNvbnN0IGJIYXNTYW1lSGFzaCA9IG9MYXN0UmVtb3ZlZEl0ZW0gJiYgb05ld1N0YXRlLmhhc2ggPT09IG9MYXN0UmVtb3ZlZEl0ZW0uaGFzaDtcblx0XHRpZiAodGhpcy5fb01hbmFnZWRIaXN0b3J5Lmxlbmd0aCA9PT0gMCB8fCB0aGlzLl9vTWFuYWdlZEhpc3RvcnlbdGhpcy5fb01hbmFnZWRIaXN0b3J5Lmxlbmd0aCAtIDFdLmhhc2ggIT09IG9OZXdTdGF0ZS5oYXNoKSB7XG5cdFx0XHR0aGlzLl9vTWFuYWdlZEhpc3RvcnkucHVzaChvTmV3U3RhdGUpO1xuXHRcdFx0aWYgKG9MYXN0UmVtb3ZlZEl0ZW0gJiYgcmVtb3ZlQXBwU3RhdGVJbkhhc2gob0xhc3RSZW1vdmVkSXRlbS5oYXNoKSA9PT0gcmVtb3ZlQXBwU3RhdGVJbkhhc2gob05ld1N0YXRlLmhhc2gpKSB7XG5cdFx0XHRcdG9OZXdTdGF0ZS5mb2N1c0NvbnRyb2xJZCA9IG9MYXN0UmVtb3ZlZEl0ZW0uZm9jdXNDb250cm9sSWQ7XG5cdFx0XHRcdG9OZXdTdGF0ZS5zZWNvbmRhcnlGb2N1c0NvbnRyb2xJZCA9IG9MYXN0UmVtb3ZlZEl0ZW0uc2Vjb25kYXJ5Rm9jdXNDb250cm9sSWQ7XG5cdFx0XHRcdG9OZXdTdGF0ZS5mb2N1c0luZm8gPSBvTGFzdFJlbW92ZWRJdGVtLmZvY3VzSW5mbztcblx0XHRcdFx0b05ld1N0YXRlLnNlY29uZGFyeUZvY3VzSW5mbyA9IG9MYXN0UmVtb3ZlZEl0ZW0uc2Vjb25kYXJ5Rm9jdXNJbmZvO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIDYuIERldGVybWluZSB3aGljaCBhY3Rpb25zIHRvIGRvIG9uIHRoZSBoaXN0b3J5XG5cdFx0aWYgKGlQb3BDb3VudCA9PT0gMCkge1xuXHRcdFx0Ly8gTm8gc3RhdGUgd2FzIHBvcHBlZCAtLT4gYXBwZW5kXG5cdFx0XHRyZXR1cm4geyB0eXBlOiBcImFwcGVuZFwiIH07XG5cdFx0fSBlbHNlIGlmIChpUG9wQ291bnQgPT09IDEpIHtcblx0XHRcdC8vIE9ubHkgMSBzdGF0ZSB3YXMgcG9wcGVkIC0tPiByZXBsYWNlIGN1cnJlbnQgaGFzaCB1bmxlc3MgaGFzaCBpcyB0aGUgc2FtZSAodGhlbiBub3RoaW5nIHRvIGRvKVxuXHRcdFx0cmV0dXJuIGJIYXNTYW1lSGFzaCA/IHsgdHlwZTogXCJub25lXCIgfSA6IHsgdHlwZTogXCJyZXBsYWNlXCIgfTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gTW9yZSB0aGFuIDEgc3RhdGUgd2FzIHBvcHBlZCAtLT4gZ28gYmFrYyBpbiBoaXN0b3J5IGFuZCByZXBsYWNlIGhhc2ggaWYgbmVjZXNzYXJ5XG5cdFx0XHRyZXR1cm4gYkhhc1NhbWVIYXNoID8geyB0eXBlOiBcImJhY2tcIiwgc3RlcHM6IGlQb3BDb3VudCAtIDEgfSA6IHsgdHlwZTogXCJiYWNrLXJlcGxhY2VcIiwgc3RlcHM6IGlQb3BDb3VudCAtIDEgfTtcblx0XHR9XG5cdH1cblxuXHRfYmxvY2tpbmdOYXZpZ2F0aW9uRmlsdGVyKCk6IFwiQ3VzdG9tXCIgfCBcIkNvbnRpbnVlXCIge1xuXHRcdHJldHVybiB0aGlzLl9iRGlzYWJsZU9uSGFzaENoYW5nZSA/IFwiQ3VzdG9tXCIgOiBcIkNvbnRpbnVlXCI7XG5cdH1cblxuXHQvKipcblx0ICogRGlzYWJsZSB0aGUgcm91dGluZyBieSBjYWxsaW5nIHRoZSByb3V0ZXIgc3RvcCBtZXRob2QuXG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0X2Rpc2FibGVFdmVudE9uSGFzaENoYW5nZSgpOiB2b2lkIHtcblx0XHR0aGlzLl9iRGlzYWJsZU9uSGFzaENoYW5nZSA9IHRydWU7XG5cdFx0dGhpcy5fb1JvdXRlci5zdG9wKCk7XG5cdH1cblxuXHQvKipcblx0ICogRW5hYmxlIHRoZSByb3V0aW5nIGJ5IGNhbGxpbmcgdGhlIHJvdXRlciBpbml0aWFsaXplIG1ldGhvZC5cblx0ICogQHBhcmFtIFtiSWdub3JlQ3VycmVudEhhc2hdIElnbm9yZSB0aGUgbGFzdCBoYXNoIGV2ZW50IHRyaWdnZXJlZCBiZWZvcmUgdGhlIHJvdXRlciBoYXMgaW5pdGlhbGl6ZWRcblx0ICogQGZpbmFsXG5cdCAqL1xuXHRfZW5hYmxlRXZlbnRPbkhhc2hDaGFuZ2UoYklnbm9yZUN1cnJlbnRIYXNoOiBib29sZWFuIHwgdW5kZWZpbmVkKTogdm9pZCB7XG5cdFx0dGhpcy5fYkRpc2FibGVPbkhhc2hDaGFuZ2UgPSBmYWxzZTtcblx0XHR0aGlzLl9vUm91dGVyLmluaXRpYWxpemUoYklnbm9yZUN1cnJlbnRIYXNoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTeW5jaHJvbml6ZXMgdGhlIGJyb3dzZXIgaGlzdG9yeSB3aXRoIHRoZSBpbnRlcm5hbCBoaXN0b3J5IG9mIHRoZSByb3V0ZXJQcm94eSwgYW5kIHRyaWdnZXJzIGEgbmF2aWdhdGlvbiBpZiBuZWVkZWQuXG5cdCAqIEBwYXJhbSBvSGlzdG9yeUFjdGlvbiBTcGVjaWZpZXMgdGhlIG5hdmlnYXRpb24gYWN0aW9uIHRvIGJlIHBlcmZvcm1lZFxuXHQgKiBAcGFyYW0gYlJlYnVpbGRPbmx5IGB0cnVlYCBpZiBpbnRlcm5hbCBoaXN0b3J5IGlzIGN1cnJlbnRseSBiZWluZyByZWJ1aWx0XG5cdCAqIEByZXR1cm5zIFByb21pc2UgKHJlc29sdmVkIHdoZW4gdGhlIG5hdmlnYXRpb24gaXMgZmluYWxpemVkKSB0aGF0IHJldHVybnMgJ3RydWUnIGlmIGEgbmF2aWdhdGlvbiB0b29rIHBsYWNlLCAnZmFsc2UnIGlmIHRoZSBuYXZpZ2F0aW9uIGRpZG4ndCBoYXBwZW5cblx0ICogQGZpbmFsXG5cdCAqL1xuXHRhc3luYyBfcmVidWlsZEJyb3dzZXJIaXN0b3J5KG9IaXN0b3J5QWN0aW9uOiBIeXN0b3J5QWN0aW9uLCBiUmVidWlsZE9ubHk6IGJvb2xlYW4pOiBQcm9taXNlPGJvb2xlYW4+IHtcblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXRoaXMtYWxpYXNcblx0XHRjb25zdCB0aGF0ID0gdGhpcztcblx0XHRyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcblx0XHRcdHRoaXMuYklzUmVidWlsZEhpc3RvcnlSdW5uaW5nID0gdHJ1ZTtcblx0XHRcdGNvbnN0IG9UYXJnZXRTdGF0ZSA9IHRoaXMuX29NYW5hZ2VkSGlzdG9yeVt0aGlzLl9vTWFuYWdlZEhpc3RvcnkubGVuZ3RoIC0gMV0sXG5cdFx0XHRcdG5ld0xldmVsID0gdGhpcy5fb01hbmFnZWRIaXN0b3J5Lmxlbmd0aCAtIDE7XG5cblx0XHRcdGZ1bmN0aW9uIHJlcGxhY2VBc3luYygpOiB2b2lkIHtcblx0XHRcdFx0aWYgKCFiUmVidWlsZE9ubHkpIHtcblx0XHRcdFx0XHR0aGF0Ll9lbmFibGVFdmVudE9uSGFzaENoYW5nZSh0cnVlKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdCh0aGF0Ll9vUm91dGVyLmdldEhhc2hDaGFuZ2VyKCkucmVwbGFjZUhhc2ggYXMgRnVuY3Rpb24pKG9UYXJnZXRTdGF0ZS5oYXNoKTtcblx0XHRcdFx0aGlzdG9yeS5yZXBsYWNlU3RhdGUoT2JqZWN0LmFzc2lnbih7IGZlTGV2ZWw6IG5ld0xldmVsIH0sIGhpc3Rvcnkuc3RhdGUpLCBcIlwiKTtcblxuXHRcdFx0XHRpZiAoYlJlYnVpbGRPbmx5KSB7XG5cdFx0XHRcdFx0c2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHQvLyBUaW1lb3V0IHRvIGxldCAnaGFzaGNoYW5nZScgZXZlbnQgYmUgcHJvY2Vzc2VkIGJlZm9yZSBieSB0aGUgSGFzaENoYW5nZXIsIHNvIHRoYXRcblx0XHRcdFx0XHRcdC8vIG9uUm91dGVNYXRjaGVkIG5vdGlmaWNhdGlvbiBpc24ndCByYWlzZWRcblx0XHRcdFx0XHRcdHRoYXQuX2VuYWJsZUV2ZW50T25IYXNoQ2hhbmdlKHRydWUpO1xuXHRcdFx0XHRcdH0sIDApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGhhdC5iSXNSZWJ1aWxkSGlzdG9yeVJ1bm5pbmcgPSBmYWxzZTtcblx0XHRcdFx0cmVzb2x2ZSh0cnVlKTsgLy8gYSBuYXZpZ2F0aW9uIG9jY3VycmVkXG5cdFx0XHR9XG5cblx0XHRcdC8vIEFzeW5jIGNhbGxiYWNrcyB3aGVuIG5hdmlnYXRpbmcgYmFjaywgaW4gb3JkZXIgdG8gbGV0IGFsbCBub3RpZmljYXRpb25zIGFuZCBldmVudHMgZ2V0IHByb2Nlc3NlZFxuXHRcdFx0ZnVuY3Rpb24gYmFja1JlcGxhY2VBc3luYygpOiB2b2lkIHtcblx0XHRcdFx0d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJwb3BzdGF0ZVwiLCBiYWNrUmVwbGFjZUFzeW5jKTtcblx0XHRcdFx0c2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0Ly8gVGltZW91dCB0byBsZXQgJ2hhc2hjaGFuZ2UnIGV2ZW50IGJlIHByb2Nlc3NlZCBiZWZvcmUgYnkgdGhlIEhhc2hDaGFuZ2VyXG5cdFx0XHRcdFx0cmVwbGFjZUFzeW5jKCk7XG5cdFx0XHRcdH0sIDApO1xuXHRcdFx0fVxuXG5cdFx0XHRmdW5jdGlvbiBiYWNrQXN5bmMoKTogdm9pZCB7XG5cdFx0XHRcdHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9wc3RhdGVcIiwgYmFja0FzeW5jKTtcblx0XHRcdFx0dGhhdC5iSXNSZWJ1aWxkSGlzdG9yeVJ1bm5pbmcgPSBmYWxzZTtcblx0XHRcdFx0cmVzb2x2ZSh0cnVlKTsgLy8gYSBuYXZpZ2F0aW9uIG9jY3VycmVkXG5cdFx0XHR9XG5cblx0XHRcdHRoYXQuX2JJZ25vcmVSZXN0b3JlID0gdHJ1ZTtcblxuXHRcdFx0c3dpdGNoIChvSGlzdG9yeUFjdGlvbi50eXBlKSB7XG5cdFx0XHRcdGNhc2UgXCJyZXBsYWNlXCI6XG5cdFx0XHRcdFx0Y29uc3QgZm9jdXNJbmZvID0gaGlzdG9yeS5zdGF0ZT8uZm9jdXNJbmZvO1xuXHRcdFx0XHRcdCh0aGF0Ll9vUm91dGVyLmdldEhhc2hDaGFuZ2VyKCkucmVwbGFjZUhhc2ggYXMgRnVuY3Rpb24pKG9UYXJnZXRTdGF0ZS5oYXNoKTtcblx0XHRcdFx0XHRoaXN0b3J5LnJlcGxhY2VTdGF0ZShcblx0XHRcdFx0XHRcdE9iamVjdC5hc3NpZ24oXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRmZUxldmVsOiBuZXdMZXZlbCxcblx0XHRcdFx0XHRcdFx0XHRmb2N1c0luZm86IGZvY3VzSW5mb1xuXHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHRoaXN0b3J5LnN0YXRlXG5cdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0XCJcIlxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0dGhhdC5iSXNSZWJ1aWxkSGlzdG9yeVJ1bm5pbmcgPSBmYWxzZTtcblx0XHRcdFx0XHRyZXNvbHZlKHRydWUpOyAvLyBhIG5hdmlnYXRpb24gb2NjdXJyZWRcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlIFwiYXBwZW5kXCI6XG5cdFx0XHRcdFx0dGhhdC5fb1JvdXRlci5nZXRIYXNoQ2hhbmdlcigpLnNldEhhc2gob1RhcmdldFN0YXRlLmhhc2gpO1xuXHRcdFx0XHRcdGhpc3RvcnkucmVwbGFjZVN0YXRlKE9iamVjdC5hc3NpZ24oeyBmZUxldmVsOiBuZXdMZXZlbCB9LCBoaXN0b3J5LnN0YXRlKSwgXCJcIik7XG5cdFx0XHRcdFx0dGhhdC5iSXNSZWJ1aWxkSGlzdG9yeVJ1bm5pbmcgPSBmYWxzZTtcblx0XHRcdFx0XHRyZXNvbHZlKHRydWUpOyAvLyBhIG5hdmlnYXRpb24gb2NjdXJyZWRcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlIFwiYmFja1wiOlxuXHRcdFx0XHRcdHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicG9wc3RhdGVcIiwgYmFja0FzeW5jKTtcblx0XHRcdFx0XHRoaXN0b3J5LmdvKC1vSGlzdG9yeUFjdGlvbi5zdGVwcyk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSBcImJhY2stcmVwbGFjZVwiOlxuXHRcdFx0XHRcdHRoaXMuX2Rpc2FibGVFdmVudE9uSGFzaENoYW5nZSgpO1xuXHRcdFx0XHRcdHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicG9wc3RhdGVcIiwgYmFja1JlcGxhY2VBc3luYyk7XG5cdFx0XHRcdFx0aGlzdG9yeS5nbygtb0hpc3RvcnlBY3Rpb24uc3RlcHMpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0Ly8gTm8gbmF2aWdhdGlvblxuXHRcdFx0XHRcdHRoaXMuYklzUmVidWlsZEhpc3RvcnlSdW5uaW5nID0gZmFsc2U7XG5cdFx0XHRcdFx0cmVzb2x2ZShmYWxzZSk7IC8vIG5vIG5hdmlnYXRpb24gLS0+IHJlc29sdmUgdG8gZmFsc2Vcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXG5cdGdldExhc3RIaXN0b3J5RW50cnkoKTogUm91dGVyU3RhdGUge1xuXHRcdHJldHVybiB0aGlzLl9vTWFuYWdlZEhpc3RvcnlbdGhpcy5fb01hbmFnZWRIaXN0b3J5Lmxlbmd0aCAtIDFdO1xuXHR9XG5cblx0c2V0UGF0aE1hcHBpbmcobWFwcGluZ3M6IHsgb2xkUGF0aDogc3RyaW5nOyBuZXdQYXRoOiBzdHJpbmcgfVtdKTogdm9pZCB7XG5cdFx0dGhpcy5fcGF0aE1hcHBpbmdzID0gbWFwcGluZ3MuZmlsdGVyKChtYXBwaW5nKSA9PiB7XG5cdFx0XHRyZXR1cm4gbWFwcGluZy5vbGRQYXRoICE9PSBtYXBwaW5nLm5ld1BhdGg7XG5cdFx0fSk7XG5cdH1cblxuXHRoYXNoR3VhcmQoKTogdm9pZCB7XG5cdFx0bGV0IHNIYXNoID0gdGhpcy5nZXREZWNvZGVkV2luZG93SGFzaCgpO1xuXHRcdGNvbnN0IGN1cnJlbnRBcHBOYW1lID0gdGhpcy5nZXRBcHBOYW1lRnJvbUhhc2goc0hhc2gpO1xuXHRcdGlmIChjdXJyZW50QXBwTmFtZSAhPSB0aGlzLmFwcE5hbWUpIHtcblx0XHRcdC8vIFdoZW4gZG9pbmcgZXh0ZXJuYWwgbmF2aWdhdGlvbiBpbiBhbm90aGVyIHdpbmRvdywgdGhlIGN1cnJlbnQgd2luZG93IGxvY2F0aW9uIGlzIHRlbXBvcmFyaWx5IG1vZGlmaWVkIHdpdGggdGhlIFVSTCBvZiB0aGUgdGFyZ2V0IGFwcFxuXHRcdFx0Ly8gSW4gdGhpcyBjYXNlLCB3ZSBkb24ndCB3YW50IHRvIHVwZGF0ZSB0aGUgaW50ZXJuYWxseSBtYW5hZ2VkIGhpc3RvcnksIHNvIHdlIHNpbXBseSBkbyBub3RoaW5nXG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKHNIYXNoLmluY2x1ZGVzKFwicmVzdG9yZUhpc3Rvcnk9dHJ1ZVwiKSkge1xuXHRcdFx0dGhpcy5fYkFwcGx5UmVzdG9yZSA9IHRydWU7XG5cdFx0fSBlbHNlIGlmICghdGhpcy5iSXNSZWJ1aWxkSGlzdG9yeVJ1bm5pbmcgJiYgdGhpcy5fb1JvdXRlci5pc0luaXRpYWxpemVkKCkpIHtcblx0XHRcdC8vIENoZWNrIGlmIHRoZSBoYXNoIG5lZWRzIHRvIGJlIGNoYW5nZWQgKHRoaXMgaGFwcGVucyBpbiBGQ0wgd2hlbiBzd2l0Y2hpbmcgYi93IGVkaXQgYW5kIHJlYWQtb25seSB3aXRoIDMgY29sdW1ucyBvcGVuKVxuXHRcdFx0Y29uc3QgbWFwcGluZyA9IHRoaXMuX3BhdGhNYXBwaW5ncy5maW5kKChtKSA9PiB7XG5cdFx0XHRcdHJldHVybiBzSGFzaC5pbmNsdWRlcyhtLm9sZFBhdGgpO1xuXHRcdFx0fSk7XG5cdFx0XHRpZiAobWFwcGluZykge1xuXHRcdFx0XHQvLyBSZXBsYWNlIHRoZSBjdXJyZW50IGhhc2hcblx0XHRcdFx0c0hhc2ggPSBzSGFzaC5yZXBsYWNlKG1hcHBpbmcub2xkUGF0aCwgbWFwcGluZy5uZXdQYXRoKTtcblx0XHRcdFx0aGlzdG9yeS5yZXBsYWNlU3RhdGUoT2JqZWN0LmFzc2lnbih7fSwgaGlzdG9yeS5zdGF0ZSksIFwiXCIsIGVuY29kZVVSSShzSGFzaCkpO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBhSGFzaFNwbGl0ID0gc0hhc2guc3BsaXQoXCImL1wiKTtcblx0XHRcdGNvbnN0IHNBcHBIYXNoID0gYUhhc2hTcGxpdFsxXSA/IGFIYXNoU3BsaXRbMV0gOiBcIlwiO1xuXHRcdFx0aWYgKHRoaXMuY2hlY2tIYXNoV2l0aEd1YXJkKHNBcHBIYXNoKSkge1xuXHRcdFx0XHRjb25zdCBvTmV3U3RhdGUgPSB0aGlzLl9leHRyYWN0U3RhdGVGcm9tSGFzaChzQXBwSGFzaCk7XG5cdFx0XHRcdHRoaXMuX3B1c2hOZXdTdGF0ZShvTmV3U3RhdGUsIGZhbHNlLCBmYWxzZSwgdGhpcy5pc0FwcFN0YXRlVXBkYXRpbmcoKSA/IGZhbHNlIDogdHJ1ZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIENvbXBhcmVzIDIgc3RhdGVzLlxuXHQgKiBAcGFyYW0ge29iamVjdH0gb1N0YXRlMVxuXHQgKiBAcGFyYW0ge29iamVjdH0gb1N0YXRlMlxuXHQgKiBAcmV0dXJucyB7bnVtYmVyfSBUaGUgcmVzdWx0IG9mIHRoZSBjb21wYXJpc29uOlxuXHQgKiAgICAgICAgLSBlbnVtU3RhdGUuRVFVQUwgaWYgb1N0YXRlMSBhbmQgb1N0YXRlMiBhcmUgZXF1YWxcblx0ICogICAgICAgIC0gZW51bVN0YXRlLkNPTVBBVElCTEUgaWYgb1N0YXRlMSBhbmQgb1N0YXRlMiBhcmUgY29tcGF0aWJsZVxuXHQgKiAgICAgICAgLSBlbnVtU3RhdGUuQU5DRVNUT1IgaWYgb1N0YXRlMSBpcyBhbiBhbmNlc3RvciBvZiBvU3RhdGUyXG5cdCAqICAgICAgICAtIGVudW1TdGF0ZS5ESUZGRVJFTlQgaWYgdGhlIDIgc3RhdGVzIGFyZSBkaWZmZXJlbnRcblx0ICovXG5cblx0X2NvbXBhcmVDYWNoZVN0YXRlcyhvU3RhdGUxOiBSb3V0ZXJTdGF0ZSwgb1N0YXRlMjogUm91dGVyU3RhdGUpOiBudW1iZXIge1xuXHRcdC8vIEZpcnN0IGNvbXBhcmUgb2JqZWN0IGtleXNcblx0XHRpZiAob1N0YXRlMS5rZXlzLmxlbmd0aCA+IG9TdGF0ZTIua2V5cy5sZW5ndGgpIHtcblx0XHRcdHJldHVybiBlbnVtU3RhdGUuRElGRkVSRU5UO1xuXHRcdH1cblx0XHRsZXQgZXF1YWwgPSB0cnVlO1xuXHRcdGxldCBpbmRleDtcblxuXHRcdGZvciAoaW5kZXggPSAwOyBlcXVhbCAmJiBpbmRleCA8IG9TdGF0ZTEua2V5cy5sZW5ndGg7IGluZGV4KyspIHtcblx0XHRcdGlmIChvU3RhdGUxLmtleXNbaW5kZXhdICE9PSBvU3RhdGUyLmtleXNbaW5kZXhdKSB7XG5cdFx0XHRcdGVxdWFsID0gZmFsc2U7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKCFlcXVhbCkge1xuXHRcdFx0Ly8gQ2hlY2sgcm91dGluZ0hpbnRzXG5cdFx0XHRpZiAob1N0YXRlMS5rZXlzLmxlbmd0aCA9PT0gMSAmJiBvU3RhdGUyLmtleXMubGVuZ3RoID09PSAxICYmIHRoaXMucm91dGluZ0hpbnRzPy5bb1N0YXRlMS5rZXlzWzBdXSkge1xuXHRcdFx0XHRpZiAodGhpcy5yb3V0aW5nSGludHNbb1N0YXRlMS5rZXlzWzBdXS5wYXJlbnRPZiAmJiB0aGlzLnJvdXRpbmdIaW50c1tvU3RhdGUxLmtleXNbMF1dLnBhcmVudE9mLmluY2x1ZGVzKG9TdGF0ZTIua2V5c1swXSkpIHtcblx0XHRcdFx0XHRyZXR1cm4gZW51bVN0YXRlLkFOQ0VTVE9SO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHQvLyBTb21lIG9iamVjdHMga2V5cyBhcmUgZGlmZmVyZW50XG5cdFx0XHRyZXR1cm4gZW51bVN0YXRlLkRJRkZFUkVOVDtcblx0XHR9XG5cblx0XHQvLyBBbGwga2V5cyBmcm9tIG9TdGF0ZTEgYXJlIGluIG9TdGF0ZTIgLS0+IGNoZWNrIGlmIGFuY2VzdG9yXG5cdFx0aWYgKG9TdGF0ZTEua2V5cy5sZW5ndGggPCBvU3RhdGUyLmtleXMubGVuZ3RoIHx8IG9TdGF0ZTEuc2NyZWVuTW9kZSA8IG9TdGF0ZTIuc2NyZWVuTW9kZSkge1xuXHRcdFx0cmV0dXJuIGVudW1TdGF0ZS5BTkNFU1RPUjtcblx0XHR9XG5cdFx0aWYgKG9TdGF0ZTEuc2NyZWVuTW9kZSA+IG9TdGF0ZTIuc2NyZWVuTW9kZSkge1xuXHRcdFx0cmV0dXJuIGVudW1TdGF0ZS5ESUZGRVJFTlQ7IC8vIE5vdCBzdXJlIHRoaXMgY2FzZSBjYW4gaGFwcGVuLi4uXG5cdFx0fVxuXG5cdFx0Ly8gQXQgdGhpcyBzdGFnZSwgdGhlIDIgc3RhdGVzIGhhdmUgdGhlIHNhbWUgb2JqZWN0IGtleXMgKGluIHRoZSBzYW1lIG9yZGVyKSBhbmQgc2FtZSBzY3JlZW5tb2RlXG5cdFx0Ly8gVGhleSBjYW4gYmUgZWl0aGVyIGNvbXBhdGlibGUgb3IgZXF1YWxcblx0XHRyZXR1cm4gb1N0YXRlMS5zTGF5b3V0ID09PSBvU3RhdGUyLnNMYXlvdXQgPyBlbnVtU3RhdGUuRVFVQUwgOiBlbnVtU3RhdGUuQ09NUEFUSUJMRTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTcGxpdCB0aGUgYXBwLXNwZWNpZmljIHJvdXRlIGF0IHRoZSBcIiYvXCIgc2VwYXJhdG9yLlxuXHQgKlxuXHQgKiBUaGUgYXBwLXNwZWNpZmljIHJvdXRlIGNvbnNpc3RzIG9mIG9uZSBvciBtb3JlIHNlZ21lbnRzIHNlcGFyYXRlZCBieSBcIiYvXCIuXG5cdCAqIEBleGFtcGxlXG5cdCAqIHNwbGl0QXBwU3BlY2lmaWNSb3V0ZShcIiYvRW50aXR5KCdhYmMnKS9OZXh0RW50aXR5KCd4eXonKVwiKTtcblx0ICogLy8gW1wiRW50aXR5KCdhYmMnKS9OZXh0RW50aXR5KCd4eXonKVwiXVxuXHQgKlxuXHQgKiBzcGxpdEFwcFNwZWNpZmljUm91dGUoXCImL0VudGl0eSgnYWJjJykvTmV4dEVudGl0eSgneHl6JykmL1ByZWZpeC9OZXN0ZWRSb3V0ZVwiKTtcblx0ICogLy8gW1wiRW50aXR5KCdhYmMnKS9OZXh0RW50aXR5KCd4eXonKVwiLCBcIlByZWZpeC9OZXN0ZWRSb3V0ZVwiXVxuXHQgKiBAcGFyYW0gYXBwU3BlY2lmaWNSb3V0ZVx0VGhlIGFwcC1zcGVjaWZpYyByb3V0ZS5cblx0ICogQHJldHVybnMgQW4gYXJyYXkgb2YgYXBwLXNwZWNpZmljIHJvdXRlIHNlZ21lbnRzLlxuXHQgKi9cblx0cHJpdmF0ZSBzdGF0aWMgc3BsaXRBcHBTcGVjaWZpY1JvdXRlKGFwcFNwZWNpZmljUm91dGU6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZ1tdIHtcblx0XHRjb25zdCByb3V0ZVNwbGl0ID0gYXBwU3BlY2lmaWNSb3V0ZT8uc3BsaXQoXCImL1wiKSA/PyBbXTtcblx0XHRpZiAoIXJvdXRlU3BsaXRbMF0pIHtcblx0XHRcdHJvdXRlU3BsaXQuc2hpZnQoKTsgLy8gcmVtb3ZlIHRoZSBsZWFkaW5nIGVtcHR5IHNlZ21lbnQgKHRoZSBhcHAtc3BlY2lmaWMgcm91dGUgc3RhcnRzIHdpdGggXCImL1wiKVxuXHRcdH1cblx0XHRyZXR1cm4gcm91dGVTcGxpdDtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgYmFjayBleGl0cyB0aGUgcHJlc2VudCBndWFyZCBzZXQuXG5cdCAqIEByZXR1cm5zIGB0cnVlYCBpZiBiYWNrIGV4aXRzIHRoZSBndWFyZFxuXHQgKi9cblx0Y2hlY2tJZkJhY2tJc091dE9mR3VhcmQoKTogYm9vbGVhbiB7XG5cdFx0Ly8gV2UgdXNlIHdpbmRvdy5sb2NhdGlvbi5oYXNoIGluc3RlYWQgb2YgSGFzaENoYW5nZXIuZ2V0SW5zdGFuY2UoKS5nZXRIYXNoKCkgYmVjYXVzZSB0aGUgbGF0dGVyXG5cdFx0Ly8gcmVwbGFjZXMgY2hhcmFjdGVycyBpbiB0aGUgVVJMIChlLmcuICUyNCByZXBsYWNlZCBieSAkKSBhbmQgaXQgY2F1c2VzIGlzc3VlcyB3aGVuIGNvbXBhcmluZ1xuXHRcdC8vIHdpdGggdGhlIFVSTHMgaW4gdGhlIG1hbmFnZWQgaGlzdG9yeVxuXHRcdGNvbnN0IHNwbGl0SGFzaCA9IHRoaXMuZ2V0RnVsbEhhc2goKTtcblxuXHRcdGNvbnN0IHNlZ21lbnRzID0gUm91dGVyUHJveHkuc3BsaXRBcHBTcGVjaWZpY1JvdXRlKHNwbGl0SGFzaCk7XG5cblx0XHRpZiAoc2VnbWVudHMubGVuZ3RoID4gMSkge1xuXHRcdFx0Ly8gdGhlcmUgaXMgYSBuZXN0ZWQgcm91dGUgaW52b2x2ZWQgLT4gYXNzdW1lIHdlIGFyZSBzdGlsbCBpbnNpZGUgdGhlIGd1YXJkXG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Y29uc3QgaGFzaCA9IHNlZ21lbnRzWzBdID8/IFwiXCI7XG5cblx0XHRsZXQgcHJldmlvdXNIYXNoO1xuXHRcdGlmICh0aGlzLl9vTmF2aWdhdGlvbkd1YXJkKSB7XG5cdFx0XHRmb3IgKGxldCBpID0gdGhpcy5fb01hbmFnZWRIaXN0b3J5Lmxlbmd0aCAtIDE7IGkgPiAwOyBpLS0pIHtcblx0XHRcdFx0aWYgKHRoaXMuX29NYW5hZ2VkSGlzdG9yeVtpXS5oYXNoID09PSBoYXNoKSB7XG5cdFx0XHRcdFx0cHJldmlvdXNIYXNoID0gdGhpcy5fb01hbmFnZWRIaXN0b3J5W2kgLSAxXS5oYXNoO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiAhcHJldmlvdXNIYXNoIHx8ICF0aGlzLmNoZWNrSGFzaFdpdGhHdWFyZChwcmV2aW91c0hhc2gpO1xuXHRcdH1cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2tzIGlmIGEgYmFjayBuYXZpZ2F0aW9uIHdpbGwgZXhpdCB0aGUgYXBwLlxuXHQgKiBAcmV0dXJucyBUcnVlIGlmIGJhY2sgZXhpdHMgdGhlIGFwcFxuXHQgKi9cblx0Y2hlY2tJZkJhY2tFeGl0c0FwcCgpOiBib29sZWFuIHtcblx0XHRjb25zdCBzcGxpdEhhc2ggPSB0aGlzLmdldEZ1bGxIYXNoKCk7XG5cblx0XHRjb25zdCBzZWdtZW50cyA9IFJvdXRlclByb3h5LnNwbGl0QXBwU3BlY2lmaWNSb3V0ZShzcGxpdEhhc2gpO1xuXG5cdFx0aWYgKHNlZ21lbnRzLmxlbmd0aCA+IDEpIHtcblx0XHRcdC8vIHRoZXJlIGlzIGEgbmVzdGVkIHJvdXRlIGludm9sdmVkIC0+IGFzc3VtZSB3ZSBhcmUgc3RpbGwgaW5zaWRlIHRoZSBhcHBcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyBJZiB0aGUgY3VycmVudCBoYXNoIGlzIHRoZSBmaXJzdCBvbmUgaW4gdGhlIGhpc3RvcnksIHRoZW4gYSBuYXZiYWNrIHdpbGwgZXhpdCB0aGUgYXBwXG5cdFx0Y29uc3QgaGFzaCA9IHNlZ21lbnRzWzBdID8/IFwiXCI7XG5cdFx0cmV0dXJuIHRoaXMuX29NYW5hZ2VkSGlzdG9yeS5sZW5ndGggPiAwICYmIHRoaXMuX29NYW5hZ2VkSGlzdG9yeVswXS5oYXNoID09PSBoYXNoO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiB0aGUgbGFzdCAyIGVudHJpZXMgaW4gdGhlIGhpc3Rvcnkgc2hhcmUgdGhlIHNhbWUgY29udGV4dC5cblx0ICogQHJldHVybnMgYHRydWVgIGlmIHRoZXkgc2hhcmUgdGhlIHNhbWUgY29udGV4dC5cblx0ICovXG5cdGNoZWNrSWZCYWNrSGFzU2FtZUNvbnRleHQoKTogYm9vbGVhbiB7XG5cdFx0aWYgKHRoaXMuX29NYW5hZ2VkSGlzdG9yeS5sZW5ndGggPCAyKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Y29uc3Qgb0N1cnJlbnRTdGF0ZSA9IHRoaXMuX29NYW5hZ2VkSGlzdG9yeVt0aGlzLl9vTWFuYWdlZEhpc3RvcnkubGVuZ3RoIC0gMV07XG5cdFx0Y29uc3Qgb1ByZXZpb3VzU3RhdGUgPSB0aGlzLl9vTWFuYWdlZEhpc3RvcnlbdGhpcy5fb01hbmFnZWRIaXN0b3J5Lmxlbmd0aCAtIDJdO1xuXG5cdFx0cmV0dXJuIG9DdXJyZW50U3RhdGUuaGFzaC5zcGxpdChcIj9cIilbMF0gPT09IG9QcmV2aW91c1N0YXRlLmhhc2guc3BsaXQoXCI/XCIpWzBdO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlc3RvcmVzIHRoZSBmb2N1cyBmb3IgdGhlIGN1cnJlbnQgaGFzaCwgaWYgd2UgY2FuIGZpbmQgaXQgaW4gdGhlIGhpc3RvcnkuXG5cdCAqIEByZXR1cm5zIFRydWUgaWYgZm9jdXMgd2FzIHNldCwgZmFsc2Ugb3RoZXJ3aXNlLlxuXHQgKi9cblx0cmVzdG9yZUZvY3VzRm9yQ3VycmVudEhhc2goKTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgY3VycmVudEhhc2ggPSByZW1vdmVBcHBTdGF0ZUluSGFzaCh0aGlzLmdldEhhc2goKSk7XG5cdFx0Y29uc3Qgc3RhdGVGb3JIYXNoID0gdGhpcy5fb01hbmFnZWRIaXN0b3J5LmZpbmQoKHN0YXRlKSA9PiB7XG5cdFx0XHRyZXR1cm4gcmVtb3ZlQXBwU3RhdGVJbkhhc2goc3RhdGUuaGFzaCkgPT09IGN1cnJlbnRIYXNoO1xuXHRcdH0pO1xuXG5cdFx0bGV0IGZvY3VzQXBwbGllZCA9IGZhbHNlO1xuXHRcdGlmIChzdGF0ZUZvckhhc2g/LmZvY3VzQ29udHJvbElkKSB7XG5cdFx0XHRsZXQgZm9jdXNDb250cm9sID0gRWxlbWVudC5nZXRFbGVtZW50QnlJZChzdGF0ZUZvckhhc2guZm9jdXNDb250cm9sSWQpO1xuXHRcdFx0bGV0IGZvY3VzSW5mbyA9IHN0YXRlRm9ySGFzaC5mb2N1c0luZm87XG5cdFx0XHRsZXQgdXNlU2Vjb25kYXJ5ID0gZmFsc2U7XG5cdFx0XHRpZiAoKCFmb2N1c0NvbnRyb2wgfHwgIWZvY3VzQ29udHJvbC5nZXRGb2N1c0RvbVJlZigpKSAmJiBzdGF0ZUZvckhhc2guc2Vjb25kYXJ5Rm9jdXNDb250cm9sSWQpIHtcblx0XHRcdFx0Ly8gVGhlIGNvbnRyb2wgZm9yIGZvY3VzIGlzIGVpdGhlciBub3QgZm91bmQgb3IgaXMgbm90IGRpc3BsYXllZCBvbiBzY3JlZW4gKG5vIGZvY3VzRG9tUmVmKVxuXHRcdFx0XHQvLyAtLT4gdHJ5IHRoZSBzZWNvbmRhcnkgY29udHJvbCBpZiB0aGVyZSdzIG9uZVxuXHRcdFx0XHRmb2N1c0NvbnRyb2wgPSBFbGVtZW50LmdldEVsZW1lbnRCeUlkKHN0YXRlRm9ySGFzaC5zZWNvbmRhcnlGb2N1c0NvbnRyb2xJZCk7XG5cdFx0XHRcdGZvY3VzSW5mbyA9IHN0YXRlRm9ySGFzaC5zZWNvbmRhcnlGb2N1c0luZm87XG5cdFx0XHRcdHVzZVNlY29uZGFyeSA9IHRydWU7XG5cdFx0XHR9XG5cdFx0XHRpZiAoXG5cdFx0XHRcdC8vIGlmIHRoZSBjb250cm9sIGlzIGEgYnVzeSB0YWJsZSwgd2UgZG9uJ3Qgd2FudCB0byBmb2N1cyBpdFxuXHRcdFx0XHQvLyB0YWJsZXMgaGF2ZSB0aGVpciBvd24gaGFuZGxpbmcgdG8gcmVzdG9yZSBmb2N1cywgc28gd2UgZG9uJ3Qgd2FudCB0byBpbnRlcmZlcmUgd2l0aCB0aGF0XG5cdFx0XHRcdC8vIHVubGVzcyB0aGUgdGFibGUgd2FzIGEgc2Vjb25kYXJ5IGNvbnRyb2wsIHdoZXJlIHdlIHdhbnQgdG8gZm9jdXMgb24gaXQgYW55d2F5XG5cdFx0XHRcdGZvY3VzQ29udHJvbD8uZ2V0UGFyZW50KCk/LmlzQTxUYWJsZT4oXCJzYXAudWkubWRjLlRhYmxlXCIpICYmXG5cdFx0XHRcdChmb2N1c0NvbnRyb2wgYXMgTVRhYmxlIHwgVUlUYWJsZSkuZ2V0QnVzeSgpICYmXG5cdFx0XHRcdCF1c2VTZWNvbmRhcnlcblx0XHRcdCkge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0XHRmb2N1c0NvbnRyb2w/LmZvY3VzKGZvY3VzSW5mbyk7XG5cdFx0XHRmb2N1c0FwcGxpZWQgPSBmb2N1c0NvbnRyb2wgIT09IHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHRyZXR1cm4gZm9jdXNBcHBsaWVkO1xuXHR9XG5cblx0LyoqXG5cdCAqIFN0b3JlcyB0aGUgSUQgb2YgdGhlIGN1cnJlbnRseSBmb2N1c2VkIGNvbnRyb2wgaW4gdGhlIGhpc3RvcnkgZm9yIHRoZSBjdXJyZW50IGhhc2guXG5cdCAqXG5cdCAqL1xuXHRwcml2YXRlIHN0b3JlRm9jdXNJbmZvRm9yQ3VycmVudEhhc2goKTogdm9pZCB7XG5cdFx0Y29uc3QgY3VycmVudEhhc2ggPSByZW1vdmVBcHBTdGF0ZUluSGFzaCh0aGlzLmdldEhhc2goKSk7XG5cdFx0Y29uc3Qgc3RhdGVGb3JIYXNoID0gdGhpcy5fb01hbmFnZWRIaXN0b3J5LmZpbmQoKHN0YXRlKSA9PiB7XG5cdFx0XHRyZXR1cm4gcmVtb3ZlQXBwU3RhdGVJbkhhc2goc3RhdGUuaGFzaCkgPT09IGN1cnJlbnRIYXNoO1xuXHRcdH0pO1xuXHRcdGlmIChzdGF0ZUZvckhhc2gpIHtcblx0XHRcdGNvbnN0IGZvY3VzQ29udHJvbCA9IEVsZW1lbnQuZ2V0QWN0aXZlRWxlbWVudCgpO1xuXHRcdFx0c3RhdGVGb3JIYXNoLmZvY3VzQ29udHJvbElkID0gZm9jdXNDb250cm9sPy5nZXRJZCgpO1xuXHRcdFx0aWYgKGZvY3VzQ29udHJvbCkge1xuXHRcdFx0XHQvLyBUaGUgc2Vjb25kYXJ5IGZvY3VzIGNvbnRyb2wgaXMgdGhlIHBhcmVudCB0YWJsZSBpZiB0aGVyZSdzIG9uZVxuXHRcdFx0XHRsZXQgcGFyZW50VGFibGUgPSBmb2N1c0NvbnRyb2wuZ2V0UGFyZW50KCk7XG5cdFx0XHRcdHdoaWxlIChwYXJlbnRUYWJsZSAmJiAhcGFyZW50VGFibGUuaXNBPFVJVGFibGU+KFwic2FwLnVpLnRhYmxlLlRhYmxlXCIpICYmICFwYXJlbnRUYWJsZS5pc0E8TVRhYmxlPihcInNhcC5tLlRhYmxlXCIpKSB7XG5cdFx0XHRcdFx0cGFyZW50VGFibGUgPSBwYXJlbnRUYWJsZS5nZXRQYXJlbnQoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRzdGF0ZUZvckhhc2guc2Vjb25kYXJ5Rm9jdXNDb250cm9sSWQgPSBwYXJlbnRUYWJsZT8uZ2V0SWQoKTtcblx0XHRcdFx0c3RhdGVGb3JIYXNoLnNlY29uZGFyeUZvY3VzSW5mbyA9IHsgcHJldmVudFNjcm9sbDogdHJ1ZSB9O1xuXHRcdFx0fVxuXHRcdFx0c3RhdGVGb3JIYXNoLmZvY3VzSW5mbyA9IGZvY3VzQ29udHJvbD8uZ2V0Rm9jdXNJbmZvKCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEZpbmRzIGEgbGF5b3V0IHZhbHVlIGZvciBhIGhhc2ggaW4gdGhlIGhpc3RvcnkuXG5cdCAqIEBwYXJhbSBoYXNoIFRoZSBoYXNoIHRvIGxvb2sgZm9yIGluIHRoZSBoaXN0b3J5LlxuXHQgKiBAcmV0dXJucyBBIGxheW91dCB2YWx1ZSBpZiBpdCBjb3VsZCBiZSBmb3VuZCwgdW5kZWZpbmVkIG90aGVyd2lzZS5cblx0ICovXG5cdGZpbmRMYXlvdXRGb3JIYXNoKGhhc2g6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdFx0aWYgKCF0aGlzLmZjbEVuYWJsZWQpIHtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXG5cdFx0Ly8gUmVtb3ZlIGFsbCBxdWVyeSBwYXJhbWV0ZXJzIGZyb20gdGhlIGhhc2hcblx0XHRjb25zdCBoYXNoTm9QYXJhbSA9IGhhc2guc3BsaXQoXCI/XCIpWzBdO1xuXG5cdFx0Ly8gTG9vayBmb3IgdGhlIHN0YXRlIGJhY2t3YXJkcywgc28gdGhhdCB3ZSBmaW5kIHRoZSBsYXN0IHN0YXRlIGluIHRoZSBoaXN0b3J5IChlLmcuIGlmIHdlIGhhdmUgMiBzdGF0ZXMgd2l0aCB0aGUgc2FtZSBoYXNoIGJ1dCAyIGRpZmZlcmVudCBsYXlvdXRzKVxuXHRcdGxldCB0YXJnZXRTdGF0ZTogUm91dGVyU3RhdGUgfCB1bmRlZmluZWQ7XG5cdFx0Zm9yIChsZXQgaW5kZXggPSB0aGlzLl9vTWFuYWdlZEhpc3RvcnkubGVuZ3RoIC0gMTsgaW5kZXggPj0gMCAmJiB0YXJnZXRTdGF0ZSA9PT0gdW5kZWZpbmVkOyBpbmRleC0tKSB7XG5cdFx0XHRpZiAodGhpcy5fb01hbmFnZWRIaXN0b3J5W2luZGV4XS5oYXNoLnNwbGl0KFwiP1wiKVswXSA9PT0gaGFzaE5vUGFyYW0pIHtcblx0XHRcdFx0dGFyZ2V0U3RhdGUgPSB0aGlzLl9vTWFuYWdlZEhpc3RvcnlbaW5kZXhdO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0YXJnZXRTdGF0ZT8uc0xheW91dDtcblx0fVxufVxuXG5leHBvcnQgZGVmYXVsdCBSb3V0ZXJQcm94eTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7RUFjQSxNQUFNQSxTQUFTLEdBQUc7SUFDakJDLEtBQUssRUFBRSxDQUFDO0lBQ1JDLFVBQVUsRUFBRSxDQUFDO0lBQ2JDLFFBQVEsRUFBRSxDQUFDO0lBQ1hDLFNBQVMsRUFBRTtFQUNaLENBQUM7RUFDRCxNQUFNQyxhQUFhLEdBQUc7SUFDckJDLFdBQVcsRUFBRSxRQUFRO0lBQ3JCQyxjQUFjLEVBQUU7RUFDakIsQ0FBQztFQXdCRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDQSxTQUFTQyxtQkFBbUJBLENBQUNDLFVBQWtCLEVBQUVDLFVBQW1CLEVBQW1CO0lBQ3RGLE9BQU87TUFDTkMsVUFBVSxFQUFFRixVQUFVLENBQUNHLE9BQU8sQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDO01BQUU7TUFDaERDLFdBQVcsRUFBRUgsVUFBVSxHQUFHQSxVQUFVLENBQUNFLE9BQU8sQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLEdBQUdFLFNBQVM7TUFDeEVDLEtBQUssRUFBRSxTQUFBQSxDQUFVQyxLQUFhLEVBQVc7UUFDeEMsT0FBT0EsS0FBSyxDQUFDQyxPQUFPLENBQUMsSUFBSSxDQUFDTixVQUFVLENBQUMsS0FBSyxDQUFDLEtBQUssSUFBSSxDQUFDRSxXQUFXLEdBQUdHLEtBQUssQ0FBQ0MsT0FBTyxDQUFDLElBQUksQ0FBQ0osV0FBVyxDQUFDLEtBQUssQ0FBQyxHQUFH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
939
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJlbnVtU3RhdGUiLCJFUVVBTCIsIkNPTVBBVElCTEUiLCJBTkNFU1RPUiIsIkRJRkZFUkVOVCIsImVudW1VUkxQYXJhbXMiLCJMQVlPVVRQQVJBTSIsIklBUFBTVEFURVBBUkFNIiwiY3JlYXRlR3VhcmRGcm9tSGFzaCIsInNHdWFyZEhhc2giLCJoYXNoVHJha2VyIiwiX2d1YXJkSGFzaCIsInJlcGxhY2UiLCJoYXNoVHJhY2tlciIsInVuZGVmaW5lZCIsImNoZWNrIiwic0hhc2giLCJpbmRleE9mIiwicmVtb3ZlQXBwU3RhdGVJbkhhc2giLCJSZWdFeHAiLCJSb3V0ZXJQcm94eSIsIl9kZWMiLCJkZWZpbmVVSTVDbGFzcyIsIl9jbGFzcyIsIl9CYXNlT2JqZWN0IiwiX3RoaXMiLCJfbGVuIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiYXJncyIsIkFycmF5IiwiX2tleSIsImNhbGwiLCJiSXNSZWJ1aWxkSGlzdG9yeVJ1bm5pbmciLCJiSXNDb21wdXRpbmdUaXRsZUhpZXJhY2h5IiwiYklzR3VhcmRDcm9zc0FsbG93ZWQiLCJzSUFwcFN0YXRlS2V5IiwiX2JBY3RpdmF0ZVJvdXRlTWF0Y2hTeW5jaHJvIiwiX2JBcHBseVJlc3RvcmUiLCJfcGF0aE1hcHBpbmdzIiwicmVzdG9yZUhpc3RvcnlUcmlnZ2VyZWQiLCJhcHBTdGF0ZVVwZGF0aW5nIiwiX2luaGVyaXRzTG9vc2UiLCJfcHJvdG8iLCJwcm90b3R5cGUiLCJpbml0Iiwib0FwcENvbXBvbmVudCIsImlzZmNsRW5hYmxlZCIsImdldFNlcnZpY2UiLCJ0aGVuIiwiYXN5bmNJbml0IiwiY2F0Y2giLCJvRXJyb3IiLCJMb2ciLCJlcnJvciIsIl9mbkhhc2hHdWFyZCIsImhhc2hHdWFyZCIsImJpbmQiLCJ3aW5kb3ciLCJhZGRFdmVudExpc3RlbmVyIiwiX2JEaXNhYmxlT25IYXNoQ2hhbmdlIiwiX2JJZ25vcmVSZXN0b3JlIiwiX2JGb3JjZUZvY3VzIiwiX29TaGVsbFNlcnZpY2VzIiwiZ2V0U2hlbGxTZXJ2aWNlcyIsImluaXRSYXciLCJnZXRSb3V0ZXIiLCJyb3V0aW5nSGludHMiLCJnZXRSb3V0aW5nU2VydmljZSIsImdldFJvdXRpbmdIaW50cyIsIndhaXRGb3JSb3V0ZU1hdGNoQmVmb3JlTmF2aWdhdGlvbiIsImhpc3RvcnkiLCJyZXBsYWNlU3RhdGUiLCJPYmplY3QiLCJhc3NpZ24iLCJmZUxldmVsIiwic3RhdGUiLCJsb2NhdGlvbiIsImZjbEVuYWJsZWQiLCJfZm5CbG9ja2luZ05hdkZpbHRlciIsIl9ibG9ja2luZ05hdmlnYXRpb25GaWx0ZXIiLCJyZWdpc3Rlck5hdmlnYXRpb25GaWx0ZXIiLCJkZXN0cm95IiwidW5yZWdpc3Rlck5hdmlnYXRpb25GaWx0ZXIiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwic2V0QXBwU3RhdGVJbkhhc2giLCJzQXBwU3RhdGVLZXkiLCJzTmV3SGFzaCIsImluY2x1ZGVzIiwiZmluZEFwcFN0YXRlSW5IYXNoIiwiYUFwcFN0YXRlIiwibWF0Y2giLCJnZXREZWNvZGVkV2luZG93SGFzaCIsImRlY29kZVVSSSIsImhhc2giLCJvUm91dGVyIiwiX29Sb3V0ZXIiLCJfb01hbmFnZWRIaXN0b3J5IiwiX29OYXZpZ2F0aW9uR3VhcmQiLCJzQ3VycmVudEFwcEhhc2giLCJnZXRIYXNoIiwicHVzaCIsIl9leHRyYWN0U3RhdGVGcm9tSGFzaCIsImFwcE5hbWUiLCJnZXRBcHBOYW1lRnJvbUhhc2giLCJnZXRGdWxsSGFzaCIsInNwbGl0SGFzaCIsImFwcFNwZWNpZmljUm91dGUiLCJnZXRIYXNoQ2hhbmdlciIsInNoZWxsUGFydCIsImlzRm9jdXNGb3JjZWQiLCJzZXRGb2N1c0ZvcmNlZCIsImJGb3JjZWQiLCJyZW1vdmVJQXBwU3RhdGVLZXkiLCJzZXRBcHBTdGF0ZVVwZGF0aW5nIiwidXBkYXRpbmdBcHBTdGF0ZSIsImlzQXBwU3RhdGVVcGRhdGluZyIsInJlbW92ZVJlc3RvcmVIaXN0b3J5RmxhZ0Zyb21IYXNoIiwibmF2VG9IYXNoIiwiYlByZXNlcnZlSGlzdG9yeSIsImJEaXNhYmxlUHJlc2VydmF0aW9uQ2FjaGUiLCJiRm9yY2VGb2N1cyIsInByZXNlcnZlU2hlbGxCYWNrTmF2aWdhdGlvbkhhbmRsZXIiLCJza2lwSGFzaEd1YXJkQ2hlY2siLCJzdGFydHNXaXRoIiwic3Vic3RyaW5nIiwic2V0QmFja05hdmlnYXRpb24iLCJfb1JvdXRlTWF0Y2hTeW5jaHJvbml6YXRpb24iLCJ3YWl0Rm9yIiwiX2ludGVybmFsTmF2VG9IYXNoIiwiY2hlY2tIYXNoV2l0aEd1YXJkIiwib1Jlc291cmNlQnVuZGxlIiwiTGlicmFyeSIsImdldFJlc291cmNlQnVuZGxlRm9yIiwiY29uZmlybSIsImdldFRleHQiLCJQcm9taXNlIiwicmVzb2x2ZSIsIm9OZXdTdGF0ZSIsImFDdXJyZW50SGFzaEtleXMiLCJleHRyYWN0RW50aXR5U2V0c0Zyb21IYXNoIiwia2V5cyIsImV2ZXJ5Iiwia2V5IiwiaW5kZXgiLCJvSGlzdG9yeUFjdGlvbiIsIl9wdXNoTmV3U3RhdGUiLCJzdG9yZUZvY3VzSW5mb0ZvckN1cnJlbnRIYXNoIiwiX3JlYnVpbGRCcm93c2VySGlzdG9yeSIsInJlc3RvcmVIaXN0b3J5Iiwic1RhcmdldEhhc2giLCJjaGVja1Jlc3RvcmVIaXN0b3J5V2FzVHJpZ2dlcmVkIiwicmVzZXRSZXN0b3JlSGlzdG9yeUZsYWciLCJuYXZCYWNrIiwic0N1cnJlbnRIYXNoIiwic1ByZXZpb3VzSGFzaCIsImkiLCJiYWNrIiwibmF2VG8iLCJzUm91dGVOYW1lIiwib1BhcmFtZXRlcnMiLCJnZXRVUkwiLCJub1ByZXNlcnZhdGlvbkNhY2hlIiwiYklzU3RpY2t5TW9kZSIsImlzSGlkZGVuRHJhZnRFbmFibGVkIiwiZXhpdEZyb21BcHAiLCJiYWNrVG9QcmV2aW91c0FwcCIsImlzQ3VycmVudFN0YXRlSW1wYWN0ZWRCeSIsIm9Mb2NhbEd1YXJkIiwiaXNOYXZpZ2F0aW9uRmluYWxpemVkIiwic2V0TmF2aWdhdGlvbkd1YXJkIiwiZGlzY2FyZE5hdmlnYXRpb25HdWFyZCIsImhhc05hdmlnYXRpb25HdWFyZCIsImlzR3VhcmRDcm9zc0FsbG93ZWRCeVVzZXIiLCJhY3RpdmF0ZVJvdXRlTWF0Y2hTeW5jaHJvbml6YXRpb24iLCJyZXNvbHZlUm91dGVNYXRjaCIsIlN5bmNocm9uaXphdGlvbiIsInNIYXNoTm9QYXJhbXMiLCJzcGxpdCIsImFUb2tlbnMiLCJuYW1lcyIsImZvckVhY2giLCJzVG9rZW4iLCJvU3RhdGUiLCJzY3JlZW5Nb2RlIiwiYUxheW91dCIsInNMYXlvdXQiLCJiUmVidWlsZE9ubHkiLCJiRGlzYWJsZUhpc3RvcnlQcmVzZXJ2YXRpb24iLCJsYXN0SW5kZXgiLCJpUG9wQ291bnQiLCJwb3AiLCJwcmVzZXJ2ZWQiLCJvTGFzdFJlbW92ZWRJdGVtIiwib1RvcFN0YXRlIiwiX2NvbXBhcmVDYWNoZVN0YXRlcyIsInNQcmV2aW91c0lBcHBTdGF0ZUtleSIsIm9Db21wYXJpc29uU3RhdGVSZXN1bHQiLCJiSGFzU2FtZUhhc2giLCJmb2N1c0NvbnRyb2xJZCIsInNlY29uZGFyeUZvY3VzQ29udHJvbElkIiwiZm9jdXNJbmZvIiwic2Vjb25kYXJ5Rm9jdXNJbmZvIiwidHlwZSIsInN0ZXBzIiwiX2Rpc2FibGVFdmVudE9uSGFzaENoYW5nZSIsInN0b3AiLCJfZW5hYmxlRXZlbnRPbkhhc2hDaGFuZ2UiLCJiSWdub3JlQ3VycmVudEhhc2giLCJpbml0aWFsaXplIiwidGhhdCIsIm9UYXJnZXRTdGF0ZSIsIm5ld0xldmVsIiwicmVwbGFjZUFzeW5jIiwicmVwbGFjZUhhc2giLCJzZXRUaW1lb3V0IiwiYmFja1JlcGxhY2VBc3luYyIsImJhY2tBc3luYyIsInNldEhhc2giLCJnbyIsImdldExhc3RIaXN0b3J5RW50cnkiLCJzZXRQYXRoTWFwcGluZyIsIm1hcHBpbmdzIiwiZmlsdGVyIiwibWFwcGluZyIsIm9sZFBhdGgiLCJuZXdQYXRoIiwiY3VycmVudEFwcE5hbWUiLCJpc0luaXRpYWxpemVkIiwiZmluZCIsIm0iLCJlbmNvZGVVUkkiLCJhSGFzaFNwbGl0Iiwic0FwcEhhc2giLCJvU3RhdGUxIiwib1N0YXRlMiIsImVxdWFsIiwicGFyZW50T2YiLCJzcGxpdEFwcFNwZWNpZmljUm91dGUiLCJyb3V0ZVNwbGl0Iiwic2hpZnQiLCJjaGVja0lmQmFja0lzT3V0T2ZHdWFyZCIsInNlZ21lbnRzIiwicHJldmlvdXNIYXNoIiwiY2hlY2tJZkJhY2tFeGl0c0FwcCIsImNoZWNrSWZCYWNrSGFzU2FtZUNvbnRleHQiLCJvQ3VycmVudFN0YXRlIiwib1ByZXZpb3VzU3RhdGUiLCJyZXN0b3JlRm9jdXNGb3JDdXJyZW50SGFzaCIsImN1cnJlbnRIYXNoIiwic3RhdGVGb3JIYXNoIiwiZm9jdXNBcHBsaWVkIiwiZm9jdXNDb250cm9sIiwiRWxlbWVudCIsImdldEVsZW1lbnRCeUlkIiwidXNlU2Vjb25kYXJ5IiwiZ2V0Rm9jdXNEb21SZWYiLCJnZXRQYXJlbnQiLCJpc0EiLCJnZXRCdXN5IiwiZm9jdXMiLCJnZXRBY3RpdmVFbGVtZW50IiwiZ2V0SWQiLCJwYXJlbnRUYWJsZSIsInByZXZlbnRTY3JvbGwiLCJnZXRGb2N1c0luZm8iLCJmaW5kTGF5b3V0Rm9ySGFzaCIsImhhc2hOb1BhcmFtIiwidGFyZ2V0U3RhdGUiLCJCYXNlT2JqZWN0Il0sInNvdXJjZVJvb3QiOiIuIiwic291cmNlcyI6WyJSb3V0ZXJQcm94eS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCB0eXBlIFJlc291cmNlQnVuZGxlIGZyb20gXCJzYXAvYmFzZS9pMThuL1Jlc291cmNlQnVuZGxlXCI7XG5pbXBvcnQgeyBkZWZpbmVVSTVDbGFzcyB9IGZyb20gXCJzYXAvZmUvYmFzZS9DbGFzc1N1cHBvcnRcIjtcbmltcG9ydCB0eXBlIEFwcENvbXBvbmVudCBmcm9tIFwic2FwL2ZlL2NvcmUvQXBwQ29tcG9uZW50XCI7XG5pbXBvcnQgU3luY2hyb25pemF0aW9uIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1N5bmNocm9uaXphdGlvblwiO1xuaW1wb3J0IHR5cGUgeyBJU2hlbGxTZXJ2aWNlcyB9IGZyb20gXCJzYXAvZmUvY29yZS9zZXJ2aWNlcy9TaGVsbFNlcnZpY2VzRmFjdG9yeVwiO1xuaW1wb3J0IHR5cGUgTVRhYmxlIGZyb20gXCJzYXAvbS9UYWJsZVwiO1xuaW1wb3J0IEJhc2VPYmplY3QgZnJvbSBcInNhcC91aS9iYXNlL09iamVjdFwiO1xuaW1wb3J0IEVsZW1lbnQgZnJvbSBcInNhcC91aS9jb3JlL0VsZW1lbnRcIjtcbmltcG9ydCBMaWJyYXJ5IGZyb20gXCJzYXAvdWkvY29yZS9MaWJcIjtcbmltcG9ydCB0eXBlIFJvdXRlciBmcm9tIFwic2FwL3VpL2NvcmUvcm91dGluZy9Sb3V0ZXJcIjtcbmltcG9ydCB0eXBlIFRhYmxlIGZyb20gXCJzYXAvdWkvbWRjL1RhYmxlXCI7XG5pbXBvcnQgdHlwZSBVSVRhYmxlIGZyb20gXCJzYXAvdWkvdGFibGUvVGFibGVcIjtcblxuY29uc3QgZW51bVN0YXRlID0ge1xuXHRFUVVBTDogMCxcblx0Q09NUEFUSUJMRTogMSxcblx0QU5DRVNUT1I6IDIsXG5cdERJRkZFUkVOVDogM1xufTtcbmNvbnN0IGVudW1VUkxQYXJhbXMgPSB7XG5cdExBWU9VVFBBUkFNOiBcImxheW91dFwiLFxuXHRJQVBQU1RBVEVQQVJBTTogXCJzYXAtaWFwcC1zdGF0ZVwiXG59O1xuXG50eXBlIFJvdXRlclN0YXRlID0ge1xuXHRrZXlzOiBzdHJpbmdbXTtcblx0aGFzaDogc3RyaW5nO1xuXHRwcmVzZXJ2ZWQ/OiBib29sZWFuO1xuXHRzTGF5b3V0Pzogc3RyaW5nO1xuXHRzY3JlZW5Nb2RlOiBudW1iZXI7XG5cdGZvY3VzQ29udHJvbElkPzogc3RyaW5nO1xuXHRzZWNvbmRhcnlGb2N1c0NvbnRyb2xJZD86IHN0cmluZztcblx0Zm9jdXNJbmZvPzoge1xuXHRcdHByZXZlbnRTY3JvbGw/OiBib29sZWFuO1xuXHRcdHRhcmdldEluZm8/OiB1bmtub3duO1xuXHR9O1xuXHRzZWNvbmRhcnlGb2N1c0luZm8/OiB7XG5cdFx0cHJldmVudFNjcm9sbD86IGJvb2xlYW47XG5cdH07XG59O1xuXG50eXBlIE90aGVySGlzdG9yeUFjdGlvbiA9IHsgdHlwZTogXCJhcHBlbmRcIiB8IFwibm9uZVwiIHwgXCJyZXBsYWNlXCIgfTtcbmV4cG9ydCB0eXBlIEJhY2tIaXN0b3J5QWN0aW9uID0geyB0eXBlOiBcImJhY2tcIiB8IFwiYmFjay1yZXBsYWNlXCI7IHN0ZXBzOiBudW1iZXIgfTtcbnR5cGUgSHlzdG9yeUFjdGlvbiA9IEJhY2tIaXN0b3J5QWN0aW9uIHwgT3RoZXJIaXN0b3J5QWN0aW9uO1xuXG50eXBlIE5hdmlnYXRpb25HdWFyZCA9IHsgX2d1YXJkSGFzaDogc3RyaW5nOyBoYXNoVHJhY2tlcjogc3RyaW5nIHwgdW5kZWZpbmVkOyBjaGVjazogKGhhc2g6IHN0cmluZykgPT4gYm9vbGVhbiB9O1xuLyoqXG4gKiBDcmVhdGVzIGEgSGFzaEd1YXJkIG9iamVjdC5cbiAqIEBwYXJhbSBzR3VhcmRIYXNoIFRoZSBoYXNoIHVzZWQgZm9yIHRoZSBndWFyZC5cbiAqIEBwYXJhbSBbaGFzaFRyYWtlcl0gT3B0aW9uYWwgaGFzaCB0cmFja2VyIHVzZWQgZm9yIGFkZGl0aW9uYWwgZ3VhcmQgY2hlY2tzLlxuICogQHJldHVybnMgVGhlIGNyZWF0ZWQgaGFzaCBndWFyZC5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlR3VhcmRGcm9tSGFzaChzR3VhcmRIYXNoOiBzdHJpbmcsIGhhc2hUcmFrZXI/OiBzdHJpbmcpOiBOYXZpZ2F0aW9uR3VhcmQge1xuXHRyZXR1cm4ge1xuXHRcdF9ndWFyZEhhc2g6IHNHdWFyZEhhc2gucmVwbGFjZSgvXFw/W14/XSokLywgXCJcIiksIC8vIFJlbW92ZSBxdWVyeSBwYXJ0XG5cdFx0aGFzaFRyYWNrZXI6IGhhc2hUcmFrZXIgPyBoYXNoVHJha2VyLnJlcGxhY2UoL1xcP1teP10qJC8sIFwiXCIpIDogdW5kZWZpbmVkLFxuXHRcdGNoZWNrOiBmdW5jdGlvbiAoc0hhc2g6IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRcdFx0cmV0dXJuIHNIYXNoLmluZGV4T2YodGhpcy5fZ3VhcmRIYXNoKSA9PT0gMCB8fCAodGhpcy5oYXNoVHJhY2tlciA/IHNIYXNoLmluZGV4T2YodGhpcy5oYXNoVHJhY2tlcikgPT09IDAgOiBmYWxzZSk7XG5cdFx0fVxuXHR9O1xufVxuLyoqXG4gKiBSZXR1cm5zIGEgaGFzaCB3aXRob3V0IGl0cyBpQXBwU3RhdGUgcGFydC5cbiAqIEBwYXJhbSBzSGFzaCBUaGUgaGFzaFxuICogQHJldHVybnMgVGhlIGhhc2ggd2l0aG91dCB0aGUgaUFwcFN0YXRlXG4gKi9cbmZ1bmN0aW9uIHJlbW92ZUFwcFN0YXRlSW5IYXNoKHNIYXNoOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRyZXR1cm4gc0hhc2gucmVwbGFjZShuZXcgUmVnRXhwKGBbJj9dKiR7ZW51bVVSTFBhcmFtcy5JQVBQU1RBVEVQQVJBTX09W14mXSpgKSwgXCJcIik7XG59XG5cbkBkZWZpbmVVSTVDbGFzcyhcInNhcC5mZS5jb3JlLlJvdXRlclByb3h5XCIpXG5jbGFzcyBSb3V0ZXJQcm94eSBleHRlbmRzIEJhc2VPYmplY3Qge1xuXHRiSXNSZWJ1aWxkSGlzdG9yeVJ1bm5pbmcgPSBmYWxzZTtcblxuXHRiSXNDb21wdXRpbmdUaXRsZUhpZXJhY2h5ID0gZmFsc2U7XG5cblx0YklzR3VhcmRDcm9zc0FsbG93ZWQgPSBmYWxzZTtcblxuXHRzSUFwcFN0YXRlS2V5OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuXHRfb1NoZWxsU2VydmljZXMhOiBJU2hlbGxTZXJ2aWNlcztcblxuXHRmY2xFbmFibGVkITogYm9vbGVhbjtcblxuXHRfZm5CbG9ja2luZ05hdkZpbHRlciE6IEZ1bmN0aW9uO1xuXG5cdF9mbkhhc2hHdWFyZCE6ICh0aGlzOiBXaW5kb3csIHBvcFN0YXRlRXZlbnQ6IFBvcFN0YXRlRXZlbnQpID0+IHVua25vd247XG5cblx0X2JEaXNhYmxlT25IYXNoQ2hhbmdlITogYm9vbGVhbjtcblxuXHRfYklnbm9yZVJlc3RvcmUhOiBib29sZWFuO1xuXG5cdF9iRm9yY2VGb2N1cyE6IGJvb2xlYW47XG5cblx0X29Sb3V0ZXIhOiBSb3V0ZXI7XG5cblx0X29NYW5hZ2VkSGlzdG9yeSE6IFJvdXRlclN0YXRlW107XG5cblx0X29OYXZpZ2F0aW9uR3VhcmQhOiBOYXZpZ2F0aW9uR3VhcmQgfCBudWxsO1xuXG5cdG9SZXNvdXJjZUJ1bmRsZT86IFJlc291cmNlQnVuZGxlO1xuXG5cdF9vUm91dGVNYXRjaFN5bmNocm9uaXphdGlvbj86IFN5bmNocm9uaXphdGlvbjtcblxuXHRfYkFjdGl2YXRlUm91dGVNYXRjaFN5bmNocm8gPSBmYWxzZTtcblxuXHRfYkFwcGx5UmVzdG9yZSA9IGZhbHNlO1xuXG5cdF9wYXRoTWFwcGluZ3M6IHsgb2xkUGF0aDogc3RyaW5nOyBuZXdQYXRoOiBzdHJpbmcgfVtdID0gW107XG5cblx0cmVzdG9yZUhpc3RvcnlUcmlnZ2VyZWQgPSBmYWxzZTtcblxuXHRyb3V0aW5nSGludHM/OiBSZWNvcmQ8c3RyaW5nLCB7IHBhcmVudE9mOiBzdHJpbmdbXSB9PjtcblxuXHRhcHBOYW1lITogc3RyaW5nO1xuXG5cdGFwcFN0YXRlVXBkYXRpbmcgPSBmYWxzZTtcblxuXHRpbml0KG9BcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCwgaXNmY2xFbmFibGVkOiBib29sZWFuKTogdm9pZCB7XG5cdFx0Ly8gU2F2ZSB0aGUgbmFtZSBvZiB0aGUgYXBwIChpbmNsdWRpbmcgc3RhcnR1cCBwYXJhbWV0ZXJzKSBmb3IgcmVidWlsZGluZyBmdWxsIGhhc2hlcyBsYXRlclxuXHRcdG9BcHBDb21wb25lbnRcblx0XHRcdC5nZXRTZXJ2aWNlKFwic2hlbGxTZXJ2aWNlc1wiKVxuXHRcdFx0LnRoZW4oKCkgPT4gdGhpcy5hc3luY0luaXQob0FwcENvbXBvbmVudCwgaXNmY2xFbmFibGVkKSlcblx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIkNhbm5vdCByZXRyaWV2ZSB0aGUgc2hlbGwgc2VydmljZXNcIiwgb0Vycm9yIGFzIHN0cmluZyk7XG5cdFx0XHR9KTtcblx0XHR0aGlzLl9mbkhhc2hHdWFyZCA9IHRoaXMuaGFzaEd1YXJkLmJpbmQodGhpcyk7XG5cdFx0d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJwb3BzdGF0ZVwiLCB0aGlzLl9mbkhhc2hHdWFyZCk7XG5cdFx0dGhpcy5fYkRpc2FibGVPbkhhc2hDaGFuZ2UgPSBmYWxzZTtcblx0XHR0aGlzLl9iSWdub3JlUmVzdG9yZSA9IGZhbHNlO1xuXHRcdHRoaXMuX2JGb3JjZUZvY3VzID0gdHJ1ZTsgLy8gVHJpZ2dlciB0aGUgZm9jdXMgbWVjaGFuaXNtIGZvciB0aGUgZmlyc3QgdmlldyBkaXNwbGF5ZWQgYnkgdGhlIGFwcFxuXHR9XG5cblx0YXN5bmNJbml0KG9BcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCwgaXNmY2xFbmFibGVkOiBib29sZWFuKTogdm9pZCB7XG5cdFx0dGhpcy5fb1NoZWxsU2VydmljZXMgPSBvQXBwQ29tcG9uZW50LmdldFNoZWxsU2VydmljZXMoKTtcblx0XHR0aGlzLmluaXRSYXcob0FwcENvbXBvbmVudC5nZXRSb3V0ZXIoKSk7XG5cdFx0dGhpcy5yb3V0aW5nSGludHMgPSBvQXBwQ29tcG9uZW50LmdldFJvdXRpbmdTZXJ2aWNlKCkuZ2V0Um91dGluZ0hpbnRzKCk7XG5cdFx0Ly8gV2Ugd2FudCB0byB3YWl0IHVudGlsIHRoZSBpbml0aWFsIHJvdXRlTWF0Y2hlZCBpcyBkb25lIGJlZm9yZSBkb2luZyBhbnkgbmF2aWdhdGlvblxuXHRcdHRoaXMud2FpdEZvclJvdXRlTWF0Y2hCZWZvcmVOYXZpZ2F0aW9uKCk7XG5cblx0XHQvLyBTZXQgZmVMZXZlbD0wIGZvciB0aGUgZmlyc3QgQXBwbGljYXRpb24gcGFnZSBpbiB0aGUgaGlzdG9yeVxuXHRcdGhpc3RvcnkucmVwbGFjZVN0YXRlKFxuXHRcdFx0T2JqZWN0LmFzc2lnbihcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGZlTGV2ZWw6IDBcblx0XHRcdFx0fSxcblx0XHRcdFx0aGlzdG9yeS5zdGF0ZVxuXHRcdFx0KSxcblx0XHRcdFwiXCIsXG5cdFx0XHR3aW5kb3cubG9jYXRpb24gYXMgdW5rbm93biBhcyBzdHJpbmdcblx0XHQpO1xuXHRcdHRoaXMuZmNsRW5hYmxlZCA9IGlzZmNsRW5hYmxlZDtcblxuXHRcdHRoaXMuX2ZuQmxvY2tpbmdOYXZGaWx0ZXIgPSB0aGlzLl9ibG9ja2luZ05hdmlnYXRpb25GaWx0ZXIuYmluZCh0aGlzKTtcblx0XHR0aGlzLl9vU2hlbGxTZXJ2aWNlcy5yZWdpc3Rlck5hdmlnYXRpb25GaWx0ZXIodGhpcy5fZm5CbG9ja2luZ05hdkZpbHRlcik7XG5cdH1cblxuXHRkZXN0cm95KCk6IHZvaWQge1xuXHRcdGlmICh0aGlzLl9vU2hlbGxTZXJ2aWNlcykge1xuXHRcdFx0dGhpcy5fb1NoZWxsU2VydmljZXMudW5yZWdpc3Rlck5hdmlnYXRpb25GaWx0ZXIodGhpcy5fZm5CbG9ja2luZ05hdkZpbHRlcik7XG5cdFx0fVxuXHRcdHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9wc3RhdGVcIiwgdGhpcy5fZm5IYXNoR3VhcmQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFkZHMgYW4gaUFwcFN0YXRlIGluc2lkZSBhIGhhc2ggKG9yIHJlcGxhY2VzIGFuIGV4aXN0aW5nIG9uZSkuXG5cdCAqIEBwYXJhbSBzSGFzaCBUaGUgaGFzaFxuXHQgKiBAcGFyYW0gc0FwcFN0YXRlS2V5IFRoZSBpQXBwU3RhdGUgdG8gYWRkXG5cdCAqIEByZXR1cm5zIFRoZSBoYXNoIHdpdGggdGhlIGFwcCBzdGF0ZVxuXHQgKi9cblx0c2V0QXBwU3RhdGVJbkhhc2goc0hhc2g6IHN0cmluZywgc0FwcFN0YXRlS2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuXHRcdGxldCBzTmV3SGFzaDogc3RyaW5nO1xuXG5cdFx0aWYgKHNIYXNoLmluY2x1ZGVzKGVudW1VUkxQYXJhbXMuSUFQUFNUQVRFUEFSQU0pKSB7XG5cdFx0XHQvLyBJZiB0aGVyZSdzIGFscmVhZHkgYW4gaUFwcFN0YXRlIHBhcmFtZXRlciBpbiB0aGUgaGFzaCwgcmVwbGFjZSBpdFxuXHRcdFx0c05ld0hhc2ggPSBzSGFzaC5yZXBsYWNlKFxuXHRcdFx0XHRuZXcgUmVnRXhwKGAke2VudW1VUkxQYXJhbXMuSUFQUFNUQVRFUEFSQU19PVteJl0qYCksXG5cdFx0XHRcdGAke2VudW1VUkxQYXJhbXMuSUFQUFNUQVRFUEFSQU19PSR7c0FwcFN0YXRlS2V5fWBcblx0XHRcdCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIEFkZCB0aGUgaUFwcFN0YXRlIHBhcmFtZXRlciBpbiB0aGUgaGFzaFxuXHRcdFx0aWYgKCFzSGFzaC5pbmNsdWRlcyhcIj9cIikpIHtcblx0XHRcdFx0c05ld0hhc2ggPSBgJHtzSGFzaH0/YDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHNOZXdIYXNoID0gYCR7c0hhc2h9JmA7XG5cdFx0XHR9XG5cdFx0XHRzTmV3SGFzaCArPSBgJHtlbnVtVVJMUGFyYW1zLklBUFBTVEFURVBBUkFNfT0ke3NBcHBTdGF0ZUtleX1gO1xuXHRcdH1cblxuXHRcdHJldHVybiBzTmV3SGFzaDtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSBpQXBwU3RhdGUgcGFydCBmcm9tIGEgaGFzaCAob3IgbnVsbCBpZiBub3QgZm91bmQpLlxuXHQgKiBAcGFyYW0gc0hhc2ggVGhlIGhhc2hcblx0ICogQHJldHVybnMgVGhlIGlBcHBTdGF0ZSBwYXJ0IG9mIHRoZSBoYXNoXG5cdCAqL1xuXHRmaW5kQXBwU3RhdGVJbkhhc2goc0hhc2g6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuXHRcdGNvbnN0IGFBcHBTdGF0ZSA9IHNIYXNoLm1hdGNoKG5ldyBSZWdFeHAoYFxcXFw/Lioke2VudW1VUkxQYXJhbXMuSUFQUFNUQVRFUEFSQU19PShbXiZdKilgKSk7XG5cdFx0cmV0dXJuIGFBcHBTdGF0ZSAmJiBhQXBwU3RhdGUubGVuZ3RoID4gMSA/IGFBcHBTdGF0ZVsxXSA6IG51bGw7XG5cdH1cblxuXHRwcml2YXRlIGdldERlY29kZWRXaW5kb3dIYXNoKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIGRlY29kZVVSSSh3aW5kb3cubG9jYXRpb24uaGFzaCk7XG5cdH1cblxuXHQvKipcblx0ICogUmF3IGluaXRpYWxpemF0aW9uIChmb3IgdW5pdCB0ZXN0cykuXG5cdCAqIEBwYXJhbSBvUm91dGVyIFRoZSByb3V0ZXIgdXNlZCBieSB0aGlzIHByb3h5XG5cdCAqL1xuXHRpbml0UmF3KG9Sb3V0ZXI6IFJvdXRlcik6IHZvaWQge1xuXHRcdHRoaXMuX29Sb3V0ZXIgPSBvUm91dGVyO1xuXHRcdHRoaXMuX29NYW5hZ2VkSGlzdG9yeSA9IFtdO1xuXHRcdHRoaXMuX29OYXZpZ2F0aW9uR3VhcmQgPSBudWxsO1xuXG5cdFx0Y29uc3Qgc0N1cnJlbnRBcHBIYXNoID0gdGhpcy5nZXRIYXNoKCk7XG5cdFx0dGhpcy5fb01hbmFnZWRIaXN0b3J5LnB1c2godGhpcy5fZXh0cmFjdFN0YXRlRnJvbUhhc2goc0N1cnJlbnRBcHBIYXNoKSk7XG5cblx0XHR0aGlzLmFwcE5hbWUgPSB0aGlzLmdldEFwcE5hbWVGcm9tSGFzaCh0aGlzLmdldERlY29kZWRXaW5kb3dIYXNoKCkpO1xuXG5cdFx0Ly8gU2V0IHRoZSBpQXBwU3RhdGUgaWYgdGhlIGluaXRpYWwgaGFzaCBjb250YWlucyBvbmVcblx0XHR0aGlzLnNJQXBwU3RhdGVLZXkgPSB0aGlzLmZpbmRBcHBTdGF0ZUluSGFzaChzQ3VycmVudEFwcEhhc2gpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybiB0aGUgZnVsbCBhcHAtc3BlY2lmaWMgaGFzaCBwYXJ0IGZyb20gd2luZG93LmxvY2F0aW9uLmhhc2guXG5cdCAqXG5cdCAqIENvbXBhcmVkIHRvIHtAbGluayBnZXRIYXNofSB0aGlzIGZ1bmN0aW9uIGluY2x1ZGVzIHN1Yi1yb3V0ZXMgb2YgbmVzdGVkIGNvbXBvbmVudHMuXG5cdCAqIEByZXR1cm5zIFRoZSBhcHAtc3BlY2lmaWMgaGFzaCBwYXJ0IChpLmUuLCB3aXRob3V0IHRoZSBzaGVsbCBwYXJ0KSwgb3IgYW4gZW1wdHkgc3RyaW5nIGlmIHRoZXJlIGlzIG5vbmUuXG5cdCAqL1xuXHRnZXRGdWxsSGFzaCgpOiBzdHJpbmcge1xuXHRcdGNvbnN0IHNwbGl0SGFzaCA9IHRoaXMuX29TaGVsbFNlcnZpY2VzLnNwbGl0SGFzaCh0aGlzLmdldERlY29kZWRXaW5kb3dIYXNoKCkpO1xuXG5cdFx0aWYgKFwiYXBwU3BlY2lmaWNSb3V0ZVwiIGluIHNwbGl0SGFzaCkge1xuXHRcdFx0cmV0dXJuIHNwbGl0SGFzaC5hcHBTcGVjaWZpY1JvdXRlPy5yZXBsYWNlKC9eJlxcLy8sIFwiXCIpID8/IFwiXCI7IC8vIHJlbW92ZSB0aGUgbGVhZGluZyBcIiYvXCJcblx0XHR9XG5cdFx0cmV0dXJuIFwiXCI7XG5cdH1cblxuXHRnZXRIYXNoKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMuX29Sb3V0ZXIuZ2V0SGFzaENoYW5nZXIoKS5nZXRIYXNoKCkgPz8gXCJcIjtcblx0fVxuXG5cdHByb3RlY3RlZCBnZXRBcHBOYW1lRnJvbUhhc2goaGFzaDogc3RyaW5nKTogc3RyaW5nIHtcblx0XHRjb25zdCBzcGxpdEhhc2ggPSB0aGlzLl9vU2hlbGxTZXJ2aWNlcz8uc3BsaXRIYXNoKGhhc2gpIGFzIHsgc2hlbGxQYXJ0OiBzdHJpbmc7IGFwcFNwZWNpZmljUm91dGU6IHN0cmluZyB9IHwgdW5kZWZpbmVkO1xuXHRcdHJldHVybiBzcGxpdEhhc2g/LnNoZWxsUGFydCA/PyBcIlwiO1xuXHR9XG5cblx0aXNGb2N1c0ZvcmNlZCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5fYkZvcmNlRm9jdXM7XG5cdH1cblxuXHRzZXRGb2N1c0ZvcmNlZChiRm9yY2VkOiBib29sZWFuKTogdm9pZCB7XG5cdFx0dGhpcy5fYkZvcmNlRm9jdXMgPSBiRm9yY2VkO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlc2V0cyB0aGUgaW50ZXJuYWwgdmFyaWFibGUgc0lBcHBTdGF0ZUtleS5cblx0ICpcblx0ICovXG5cdHJlbW92ZUlBcHBTdGF0ZUtleSgpOiB2b2lkIHtcblx0XHR0aGlzLnNJQXBwU3RhdGVLZXkgPSBudWxsO1xuXHR9XG5cblx0c2V0QXBwU3RhdGVVcGRhdGluZyh1cGRhdGluZ0FwcFN0YXRlOiBib29sZWFuKTogdm9pZCB7XG5cdFx0dGhpcy5hcHBTdGF0ZVVwZGF0aW5nID0gdXBkYXRpbmdBcHBTdGF0ZTtcblx0fVxuXG5cdGlzQXBwU3RhdGVVcGRhdGluZygpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5hcHBTdGF0ZVVwZGF0aW5nO1xuXHR9XG5cblx0cHJpdmF0ZSByZW1vdmVSZXN0b3JlSGlzdG9yeUZsYWdGcm9tSGFzaChoYXNoOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRcdHJldHVybiBoYXNoLnJlcGxhY2UoXCJyZXN0b3JlSGlzdG9yeT10cnVlJlwiLCBcIlwiKS5yZXBsYWNlKC9bPyZdcmVzdG9yZUhpc3Rvcnk9dHJ1ZS8sIFwiXCIpO1xuXHR9XG5cblx0LyoqXG5cdCAqIE5hdmlnYXRlcyB0byBhIHNwZWNpZmljIGhhc2guXG5cdCAqIEBwYXJhbSBzSGFzaCBIYXNoIHRvIGJlIG5hdmlnYXRlZCB0b1xuXHQgKiBAcGFyYW0gYlByZXNlcnZlSGlzdG9yeSBJZiBzZXQgdG8gdHJ1ZSwgbm9uLWFuY2VzdG9yIGVudHJpZXMgaW4gaGlzdG9yeSB3aWxsIGJlIHJldGFpbmVkXG5cdCAqIEBwYXJhbSBiRGlzYWJsZVByZXNlcnZhdGlvbkNhY2hlIElmIHNldCB0byB0cnVlLCBjYWNoZSBwcmVzZXJ2YXRpb24gbWVjaGFuaXNtIGlzIGRpc2FibGVkIGZvciB0aGUgY3VycmVudCBuYXZpZ2F0aW9uXG5cdCAqIEBwYXJhbSBiRm9yY2VGb2N1cyBJZiBzZXQgdG8gdHJ1ZSwgdGhlIGxvZ2ljIHRvIHNldCB0aGUgZm9jdXMgb25jZSB0aGUgbmF2aWdhdGlvbiBpcyBmaW5hbGl6ZWQgd2lsbCBiZSB0cmlnZ2VyZWQgKG9uUGFnZVJlYWR5KVxuXHQgKiBAcGFyYW0gcHJlc2VydmVTaGVsbEJhY2tOYXZpZ2F0aW9uSGFuZGxlciBJZiBzZXQgdG8gdHJ1ZSwgdGhlIGJhY2sgbmF2aWdhdGlvbiBjYWxsYmFjayBpcyBwcmVzZXJ2ZWQuIElmIHVuZGVmaW5lZCBvciBmYWxzZSwgdGhlIGJhY2sgbmF2aWdhdGlvbiBjYWxsYmFjayBpcyByZXNldC5cblx0ICogQHBhcmFtIHNraXBIYXNoR3VhcmRDaGVja1xuXHQgKiBAcmV0dXJucyBQcm9taXNlIChyZXNvbHZlZCB3aGVuIHRoZSBuYXZpZ2F0aW9uIGlzIGZpbmFsaXplZCkgdGhhdCByZXR1cm5zICd0cnVlJyBpZiBhIG5hdmlnYXRpb24gdG9vayBwbGFjZSwgJ2ZhbHNlJyBpZiB0aGUgbmF2aWdhdGlvbiBkaWRuJ3QgaGFwcGVuXG5cdCAqL1xuXHRhc3luYyBuYXZUb0hhc2goXG5cdFx0c0hhc2g6IHN0cmluZyxcblx0XHRiUHJlc2VydmVIaXN0b3J5PzogYm9vbGVhbixcblx0XHRiRGlzYWJsZVByZXNlcnZhdGlvbkNhY2hlPzogYm9vbGVhbixcblx0XHRiRm9yY2VGb2N1cz86IGJvb2xlYW4sXG5cdFx0cHJlc2VydmVTaGVsbEJhY2tOYXZpZ2F0aW9uSGFuZGxlcj86IGJvb2xlYW4sXG5cdFx0c2tpcEhhc2hHdWFyZENoZWNrPzogYm9vbGVhblxuXHQpOiBQcm9taXNlPGJvb2xlYW4+IHtcblx0XHRzSGFzaCA9IHNIYXNoLnN0YXJ0c1dpdGgoXCIvXCIpID8gc0hhc2guc3Vic3RyaW5nKDEpIDogc0hhc2g7XG5cdFx0aWYgKCFwcmVzZXJ2ZVNoZWxsQmFja05hdmlnYXRpb25IYW5kbGVyKSB7XG5cdFx0XHRhd2FpdCB0aGlzLl9vU2hlbGxTZXJ2aWNlcy5zZXRCYWNrTmF2aWdhdGlvbigpO1xuXHRcdH1cblx0XHRzSGFzaCA9IHRoaXMucmVtb3ZlUmVzdG9yZUhpc3RvcnlGbGFnRnJvbUhhc2goc0hhc2gpO1xuXHRcdGlmICh0aGlzLl9vUm91dGVNYXRjaFN5bmNocm9uaXphdGlvbikge1xuXHRcdFx0cmV0dXJuIHRoaXMuX29Sb3V0ZU1hdGNoU3luY2hyb25pemF0aW9uLndhaXRGb3IoKS50aGVuKGFzeW5jICgpID0+IHtcblx0XHRcdFx0dGhpcy5fb1JvdXRlTWF0Y2hTeW5jaHJvbml6YXRpb24gPSB1bmRlZmluZWQ7XG5cdFx0XHRcdHJldHVybiB0aGlzLl9pbnRlcm5hbE5hdlRvSGFzaChzSGFzaCwgYlByZXNlcnZlSGlzdG9yeSwgYkRpc2FibGVQcmVzZXJ2YXRpb25DYWNoZSwgYkZvcmNlRm9jdXMsIHNraXBIYXNoR3VhcmRDaGVjayk7XG5cdFx0XHR9KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0aWYgKHRoaXMuX2JBY3RpdmF0ZVJvdXRlTWF0Y2hTeW5jaHJvKSB7XG5cdFx0XHRcdHRoaXMud2FpdEZvclJvdXRlTWF0Y2hCZWZvcmVOYXZpZ2F0aW9uKCk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdGhpcy5faW50ZXJuYWxOYXZUb0hhc2goc0hhc2gsIGJQcmVzZXJ2ZUhpc3RvcnksIGJEaXNhYmxlUHJlc2VydmF0aW9uQ2FjaGUsIGJGb3JjZUZvY3VzLCBza2lwSGFzaEd1YXJkQ2hlY2spO1xuXHRcdH1cblx0fVxuXG5cdGFzeW5jIF9pbnRlcm5hbE5hdlRvSGFzaChcblx0XHRzSGFzaDogc3RyaW5nLFxuXHRcdGJQcmVzZXJ2ZUhpc3Rvcnk/OiBib29sZWFuLFxuXHRcdGJEaXNhYmxlUHJlc2VydmF0aW9uQ2FjaGU/OiBib29sZWFuLFxuXHRcdGJGb3JjZUZvY3VzPzogYm9vbGVhbixcblx0XHRza2lwSGFzaEd1YXJkQ2hlY2s/OiBib29sZWFuXG5cdCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRcdC8vIEFkZCB0aGUgYXBwIHN0YXRlIGluIHRoZSBoYXNoIGlmIG5lZWRlZFxuXHRcdGlmICh0aGlzLmZjbEVuYWJsZWQgJiYgdGhpcy5zSUFwcFN0YXRlS2V5ICYmICF0aGlzLmZpbmRBcHBTdGF0ZUluSGFzaChzSGFzaCkpIHtcblx0XHRcdHNIYXNoID0gdGhpcy5zZXRBcHBTdGF0ZUluSGFzaChzSGFzaCwgdGhpcy5zSUFwcFN0YXRlS2V5KTtcblx0XHR9XG5cblx0XHRpZiAoIXRoaXMuY2hlY2tIYXNoV2l0aEd1YXJkKHNIYXNoKSAmJiAhKHNraXBIYXNoR3VhcmRDaGVjayA/PyBmYWxzZSkpIHtcblx0XHRcdGlmICghdGhpcy5vUmVzb3VyY2VCdW5kbGUpIHtcblx0XHRcdFx0dGhpcy5vUmVzb3VyY2VCdW5kbGUgPSBMaWJyYXJ5LmdldFJlc291cmNlQnVuZGxlRm9yKFwic2FwLmZlLmNvcmVcIikhO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBXZSBoYXZlIHRvIHVzZSBhIGNvbmZpcm0gaGVyZSBmb3IgVUkgY29uc2lzdGVuY3kgcmVhc29ucywgYXMgd2l0aCBzb21lIHNjZW5hcmlvc1xuXHRcdFx0Ly8gaW4gdGhlIEVkaXRGbG93IHdlIHJlbHkgb24gYSBVSTUgbWVjaGFuaXNtIHRoYXQgZGlzcGxheXMgYSBjb25maXJtIGRpYWxvZy5cblx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1hbGVydFxuXHRcdFx0aWYgKCFjb25maXJtKHRoaXMub1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX1JPVVRFUl9QUk9YWV9TQVBGRV9FWElUX05PVFNBVkVEX01FU1NBR0VcIikpKSB7XG5cdFx0XHRcdC8vIFRoZSB1c2VyIGNsaWNrZWQgb24gQ2FuY2VsIC0tPiBjYW5jZWwgbmF2aWdhdGlvblxuXHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcblx0XHRcdH1cblx0XHRcdHRoaXMuYklzR3VhcmRDcm9zc0FsbG93ZWQgPSB0cnVlO1xuXHRcdH1cblxuXHRcdC8vIEluIGNhc2UgdGhlIG5hdmlnYXRpb24gd2lsbCBjYXVzZSBhIG5ldyB2aWV3IHRvIGJlIGRpc3BsYXllZCwgd2UgZm9yY2UgdGhlIGZvY3VzXG5cdFx0Ly8gSS5lLiBpZiB0aGUga2V5cyBmb3IgdGhlIGhhc2ggd2UncmUgbmF2aWdhdGluZyB0byBpcyBhIHN1cGVyc2V0IG9mIHRoZSBjdXJyZW50IGhhc2gga2V5cy5cblx0XHRjb25zdCBvTmV3U3RhdGUgPSB0aGlzLl9leHRyYWN0U3RhdGVGcm9tSGFzaChzSGFzaCk7XG5cdFx0aWYgKCF0aGlzLl9iRm9yY2VGb2N1cykge1xuXHRcdFx0Ly8gSWYgdGhlIGZvY3VzIHdhcyBhbHJlYWR5IGZvcmNlZCwga2VlcCBpdFxuXHRcdFx0Y29uc3QgYUN1cnJlbnRIYXNoS2V5cyA9IFJvdXRlclByb3h5LmV4dHJhY3RFbnRpdHlTZXRzRnJvbUhhc2godGhpcy5nZXRIYXNoKCkpO1xuXHRcdFx0dGhpcy5fYkZvcmNlRm9jdXMgPVxuXHRcdFx0XHRiRm9yY2VGb2N1cyB8fFxuXHRcdFx0XHQoYUN1cnJlbnRIYXNoS2V5cy5sZW5ndGggPCBvTmV3U3RhdGUua2V5cy5sZW5ndGggJiZcblx0XHRcdFx0XHRhQ3VycmVudEhhc2hLZXlzLmV2ZXJ5KGZ1bmN0aW9uIChrZXk6IHN0cmluZywgaW5kZXg6IG51bWJlcikge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGtleSA9PT0gb05ld1N0YXRlLmtleXNbaW5kZXhdO1xuXHRcdFx0XHRcdH0pKTtcblx0XHR9XG5cblx0XHRjb25zdCBvSGlzdG9yeUFjdGlvbiA9IHRoaXMuX3B1c2hOZXdTdGF0ZShvTmV3U3RhdGUsIGZhbHNlLCBiUHJlc2VydmVIaXN0b3J5LCBiRGlzYWJsZVByZXNlcnZhdGlvbkNhY2hlKTtcblx0XHR0aGlzLnN0b3JlRm9jdXNJbmZvRm9yQ3VycmVudEhhc2goKTtcblxuXHRcdHJldHVybiB0aGlzLl9yZWJ1aWxkQnJvd3Nlckhpc3Rvcnkob0hpc3RvcnlBY3Rpb24sIGZhbHNlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDbGVhcnMgYnJvd3NlciBoaXN0b3J5IGlmIGVudHJpZXMgaGF2ZSBiZWVuIGFkZGVkIHdpdGhvdXQgdXNpbmcgdGhlIFJvdXRlclByb3h5LlxuXHQgKiBVcGRhdGVzIHRoZSBpbnRlcm5hbCBoaXN0b3J5IGFjY29yZGluZ2x5LlxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgb25jZSB0aGUgaGlzdG9yeSBpcyByZWJ1aWx0XG5cdCAqL1xuXHRhc3luYyByZXN0b3JlSGlzdG9yeSgpOiBQcm9taXNlPHZvaWQgfCBib29sZWFuPiB7XG5cdFx0aWYgKHRoaXMuX2JBcHBseVJlc3RvcmUpIHtcblx0XHRcdHRoaXMuX2JBcHBseVJlc3RvcmUgPSBmYWxzZTtcblx0XHRcdGxldCBzVGFyZ2V0SGFzaCA9IHRoaXMuZ2V0SGFzaCgpO1xuXHRcdFx0c1RhcmdldEhhc2ggPSB0aGlzLnJlbW92ZVJlc3RvcmVIaXN0b3J5RmxhZ0Zyb21IYXNoKHNUYXJnZXRIYXNoKTtcblx0XHRcdGNvbnN0IG9OZXdTdGF0ZSA9IHRoaXMuX2V4dHJhY3RTdGF0ZUZyb21IYXNoKHNUYXJnZXRIYXNoKTtcblxuXHRcdFx0Y29uc3Qgb0hpc3RvcnlBY3Rpb24gPSB0aGlzLl9wdXNoTmV3U3RhdGUob05ld1N0YXRlLCB0cnVlLCBmYWxzZSwgdHJ1ZSk7XG5cblx0XHRcdHRoaXMucmVzdG9yZUhpc3RvcnlUcmlnZ2VyZWQgPSB0cnVlO1xuXHRcdFx0cmV0dXJuIHRoaXMuX3JlYnVpbGRCcm93c2VySGlzdG9yeShvSGlzdG9yeUFjdGlvbiwgdHJ1ZSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2tzIGlmIFJlc3RvcmVIaXN0b3J5IGhhcyBiZWVuIHRyaWdnZXJlZCBvbiB0aGUgUm91dGVyUHJveHkuXG5cdCAqIEByZXR1cm5zIFRydWUgaWYgaXQgaGFzIGJlZW4gdHJpZ2dlcmVkXG5cdCAqL1xuXHRjaGVja1Jlc3RvcmVIaXN0b3J5V2FzVHJpZ2dlcmVkKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLnJlc3RvcmVIaXN0b3J5VHJpZ2dlcmVkO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlc2V0cyB0aGUgZmxhZyB0aGF0IHNheXMgaWYgUmVzdG9yZUhpc3RvcnkgaGFzIGJlZW4gdHJpZ2dlcmVkIG9uIHRoZSBSb3V0ZXJQcm94eS5cblx0ICovXG5cdHJlc2V0UmVzdG9yZUhpc3RvcnlGbGFnKCk6IHZvaWQge1xuXHRcdHRoaXMucmVzdG9yZUhpc3RvcnlUcmlnZ2VyZWQgPSBmYWxzZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBOYXZpZ2F0ZXMgYmFjayBpbiB0aGUgaGlzdG9yeS5cblx0ICogQHJldHVybnMgUHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdoZW4gdGhlIG5hdmlnYXRpb24gaXMgZmluYWxpemVkXG5cdCAqL1xuXHRhc3luYyBuYXZCYWNrKCk6IFByb21pc2U8dm9pZCB8IGJvb2xlYW4+IHtcblx0XHRjb25zdCBzQ3VycmVudEhhc2ggPSB0aGlzLmdldEhhc2goKTtcblx0XHRsZXQgc1ByZXZpb3VzSGFzaDtcblxuXHRcdC8vIExvb2sgZm9yIHRoZSBjdXJyZW50IGhhc2ggaW4gdGhlIG1hbmFnZWQgaGlzdG9yeVxuXHRcdGZvciAobGV0IGkgPSB0aGlzLl9vTWFuYWdlZEhpc3RvcnkubGVuZ3RoIC0gMTsgaSA+IDA7IGktLSkge1xuXHRcdFx0aWYgKHRoaXMuX29NYW5hZ2VkSGlzdG9yeVtpXS5oYXNoID09PSBzQ3VycmVudEhhc2gpIHtcblx0XHRcdFx0c1ByZXZpb3VzSGFzaCA9IHRoaXMuX29NYW5hZ2VkSGlzdG9yeVtpIC0gMV0uaGFzaDtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKHNQcmV2aW91c0hhc2gpIHtcblx0XHRcdHJldHVybiB0aGlzLm5hdlRvSGFzaChzUHJldmlvdXNIYXNoKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gV2UgY291bGRuJ3QgZmluZCBhIHByZXZpb3VzIGhhc2ggaW4gaGlzdG9yeVxuXHRcdFx0Ly8gVGhpcyBjYW4gaGFwcGVuIHdoZW4gbmF2aWdhdGluZyBmcm9tIGEgdHJhbnNpZW50IGhhc2ggaW4gYSBjcmVhdGUgYXBwLCBhbmRcblx0XHRcdC8vIGluIHRoYXQgY2FzZSBoaXN0b3J5LmJhY2sgd291bGQgZ28gYmFjayB0byB0aGUgRkxQXG5cdFx0XHR3aW5kb3cuaGlzdG9yeS5iYWNrKCk7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIE5hdmlnYXRlcyB0byBhIHJvdXRlIHdpdGggcGFyYW1ldGVycy5cblx0ICogQHBhcmFtIHNSb3V0ZU5hbWUgVGhlIHJvdXRlIG5hbWUgdG8gYmUgbmF2aWdhdGVkIHRvXG5cdCAqIEBwYXJhbSBvUGFyYW1ldGVycyBQYXJhbWV0ZXJzIGZvciB0aGUgbmF2aWdhdGlvblxuXHQgKiBAcGFyYW0gb1BhcmFtZXRlcnMubm9QcmVzZXJ2YXRpb25DYWNoZVxuXHQgKiBAcGFyYW0gb1BhcmFtZXRlcnMuYklzU3RpY2t5TW9kZVxuXHQgKiBAcGFyYW0gb1BhcmFtZXRlcnMuaXNIaWRkZW5EcmFmdEVuYWJsZWRcblx0ICogQHJldHVybnMgUHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdoZW4gdGhlIG5hdmlnYXRpb24gaXMgZmluYWxpemVkXG5cdCAqL1xuXHRhc3luYyBuYXZUbyhcblx0XHRzUm91dGVOYW1lOiBzdHJpbmcsXG5cdFx0b1BhcmFtZXRlcnM/OiB7IG5vUHJlc2VydmF0aW9uQ2FjaGU/OiBib29sZWFuOyBiSXNTdGlja3lNb2RlPzogYm9vbGVhbjsgaXNIaWRkZW5EcmFmdEVuYWJsZWQ/OiBib29sZWFuIH1cblx0KTogUHJvbWlzZTxib29sZWFuPiB7XG5cdFx0Y29uc3Qgc0hhc2ggPSB0aGlzLl9vUm91dGVyLmdldFVSTChzUm91dGVOYW1lLCBvUGFyYW1ldGVycyk7XG5cdFx0cmV0dXJuIHRoaXMubmF2VG9IYXNoKFxuXHRcdFx0c0hhc2ghLFxuXHRcdFx0ZmFsc2UsXG5cdFx0XHRvUGFyYW1ldGVycz8ubm9QcmVzZXJ2YXRpb25DYWNoZSxcblx0XHRcdGZhbHNlLFxuXHRcdFx0KG9QYXJhbWV0ZXJzPy5iSXNTdGlja3lNb2RlID8/IGZhbHNlKSB8fCAob1BhcmFtZXRlcnM/LmlzSGlkZGVuRHJhZnRFbmFibGVkID8/IGZhbHNlKVxuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogRXhpdHMgdGhlIGN1cnJlbnQgYXBwIGJ5IG5hdmlnYXRpbmcgYmFja1xuXHQgKiB0byB0aGUgcHJldmlvdXMgYXBwIChpZiBhbnkpIG9yIHRoZSBGTFAuXG5cdCAqIEByZXR1cm5zIFByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aGVuIHdlIGV4aXQgdGhlIGFwcFxuXHQgKi9cblx0ZXhpdEZyb21BcHAoKTogdm9pZCB7XG5cdFx0cmV0dXJuIHRoaXMuX29TaGVsbFNlcnZpY2VzLmJhY2tUb1ByZXZpb3VzQXBwKCk7XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2tzIHdoZXRoZXIgYSBnaXZlbiBoYXNoIGNhbiBoYXZlIGFuIGltcGFjdCBvbiB0aGUgY3VycmVudCBzdGF0ZVxuXHQgKiBpLmUuIGlmIHRoZSBoYXNoIGlzIGVxdWFsLCBjb21wYXRpYmxlIG9yIGFuIGFuY2VzdG9yIG9mIHRoZSBjdXJyZW50IHN0YXRlLlxuXHQgKiBAcGFyYW0gc0hhc2ggYHRydWVgIGlmIHRoZXJlIGlzIGFuIGltcGFjdFxuXHQgKiBAcmV0dXJucyBJZiB0aGVyZSBpcyBhbiBpbXBhY3Rcblx0ICovXG5cdGlzQ3VycmVudFN0YXRlSW1wYWN0ZWRCeShzSGFzaDogc3RyaW5nKTogYm9vbGVhbiB7XG5cdFx0aWYgKHNIYXNoWzBdID09PSBcIi9cIikge1xuXHRcdFx0c0hhc2ggPSBzSGFzaC5zdWJzdHJpbmcoMSk7XG5cdFx0fVxuXHRcdGNvbnN0IG9Mb2NhbEd1YXJkID0gY3JlYXRlR3VhcmRGcm9tSGFzaChzSGFzaCk7XG5cdFx0cmV0dXJuIG9Mb2NhbEd1YXJkLmNoZWNrKHRoaXMuZ2V0SGFzaCgpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgYSBuYXZpZ2F0aW9uIGlzIGN1cnJlbnRseSBiZWluZyBwcm9jZXNzZWQuXG5cdCAqIEByZXR1cm5zIGBmYWxzZWAgaWYgYSBuYXZpZ2F0aW9uIGhhcyBiZWVuIHRyaWdnZXJlZCBpbiB0aGUgUm91dGVyUHJveHkgYW5kIGlzIG5vdCB5ZXQgZmluYWxpemVkXG5cdCAqL1xuXHRpc05hdmlnYXRpb25GaW5hbGl6ZWQoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuICF0aGlzLmJJc1JlYnVpbGRIaXN0b3J5UnVubmluZztcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBsYXN0IHN0YXRlIGFzIGEgZ3VhcmQuXG5cdCAqIEVhY2ggZnV0dXJlIG5hdmlnYXRpb24gd2lsbCBiZSBjaGVja2VkIGFnYWluc3QgdGhpcyBndWFyZCwgYW5kIGEgY29uZmlybWF0aW9uIGRpYWxvZyB3aWxsXG5cdCAqIGJlIGRpc3BsYXllZCBiZWZvcmUgdGhlIG5hdmlnYXRpb24gZ29lcyB0byBhbiBhbmNlc3RvciBvZiB0aGUgZ3VhcmQuXG5cdCAqIEBwYXJhbSBzSGFzaCBUaGUgaGFzaCBmb3IgdGhlIGd1YXJkLlxuXHQgKiBAcGFyYW0gW2hhc2hUcmFrZXJdIE9wdGlvbmFsIGhhc2ggdHJhY2tlciB1c2VkIGZvciBhZGRpdGlvbmFsIGd1YXJkIGNoZWNrcy5cblx0ICovXG5cdHNldE5hdmlnYXRpb25HdWFyZChzSGFzaDogc3RyaW5nLCBoYXNoVHJha2VyPzogc3RyaW5nKTogdm9pZCB7XG5cdFx0dGhpcy5fb05hdmlnYXRpb25HdWFyZCA9IGNyZWF0ZUd1YXJkRnJvbUhhc2goc0hhc2gsIGhhc2hUcmFrZXIpO1xuXHRcdHRoaXMuYklzR3VhcmRDcm9zc0FsbG93ZWQgPSBmYWxzZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBEaXNhYmxlcyB0aGUgbmF2aWdhdGlvbiBndWFyZC5cblx0ICovXG5cdGRpc2NhcmROYXZpZ2F0aW9uR3VhcmQoKTogdm9pZCB7XG5cdFx0dGhpcy5fb05hdmlnYXRpb25HdWFyZCA9IG51bGw7XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2tzIGZvciB0aGUgYXZhaWxhYmlsaXR5IG9mIHRoZSBuYXZpZ2F0aW9uIGd1YXJkLlxuXHQgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgbmF2aWdhdGluZyBndWFyZCBpcyBhdmFpbGFibGVcblx0ICovXG5cdGhhc05hdmlnYXRpb25HdWFyZCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5fb05hdmlnYXRpb25HdWFyZCAhPT0gbnVsbDtcblx0fVxuXG5cdC8qKlxuXHQgKiBUZXN0cyBhIGhhc2ggYWdhaW5zdCB0aGUgbmF2aWdhdGlvbiBndWFyZC5cblx0ICogQHBhcmFtIHNIYXNoIFRoZSBoYXNoIHRvIGJlIHRlc3RlZFxuXHQgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgbmF2aWdhdGluZyB0byB0aGUgaGFzaCBkb2Vzbid0IGNyb3NzIHRoZSBndWFyZFxuXHQgKi9cblx0Y2hlY2tIYXNoV2l0aEd1YXJkKHNIYXNoOiBzdHJpbmcpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5fb05hdmlnYXRpb25HdWFyZCA9PT0gbnVsbCB8fCB0aGlzLl9vTmF2aWdhdGlvbkd1YXJkLmNoZWNrKHNIYXNoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgdGhlIHVzZXIgYWxsb3dlZCB0aGUgbmF2aWdhdGlvbiBndWFyZCB0byBiZSBjcm9zc2VkLlxuXHQgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgY3Jvc3NpbmcgdGhlIGd1YXJkIGhhcyBiZWVuIGFsbG93ZWQgYnkgdGhlIHVzZXJcblx0ICovXG5cdGlzR3VhcmRDcm9zc0FsbG93ZWRCeVVzZXIoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuYklzR3VhcmRDcm9zc0FsbG93ZWQ7XG5cdH1cblxuXHQvKipcblx0ICogQWN0aXZhdGVzIHRoZSBzeW5jaHJvbml6YXRpb24gZm9yIHJvdXRlTWF0Y2hlZEV2ZW50LlxuXHQgKiBUaGUgbmV4dCBOYXZUb0hhc2ggY2FsbCB3aWxsIGNyZWF0ZSBhIFN5bmNocm9uaXphdGlvbiBvYmplY3QgdGhhdCB3aWxsIGJlIHJlc29sdmVkXG5cdCAqIGJ5IHRoZSBjb3JyZXNwb25kaW5nIG9uUm91dGVNYXRjaGVkIGV2ZW50LCBwcmV2ZW50aW5nIGFub3RoZXIgTmF2VG9IYXNoIHRvIGhhcHBlbiBpbiBwYXJhbGxlbC5cblx0ICovXG5cdGFjdGl2YXRlUm91dGVNYXRjaFN5bmNocm9uaXphdGlvbigpOiB2b2lkIHtcblx0XHR0aGlzLl9iQWN0aXZhdGVSb3V0ZU1hdGNoU3luY2hybyA9IHRydWU7XG5cdH1cblxuXHQvKipcblx0ICogUmVzb2x2ZSB0aGUgcm91dGVNYXRjaCBzeW5jaHJvbml6YXRpb24gb2JqZWN0LCB1bmxvY2tpbmcgcG90ZW50aWFsIHBlbmRpbmcgTmF2VG9IYXNoIGNhbGxzLlxuXHQgKi9cblx0cmVzb2x2ZVJvdXRlTWF0Y2goKTogdm9pZCB7XG5cdFx0aWYgKHRoaXMuX29Sb3V0ZU1hdGNoU3luY2hyb25pemF0aW9uKSB7XG5cdFx0XHR0aGlzLl9vUm91dGVNYXRjaFN5bmNocm9uaXphdGlvbi5yZXNvbHZlKCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIE1ha2VzIHN1cmUgbm8gbmF2aWdhdGlvbiBjYW4gaGFwcGVuIGJlZm9yZSBhIHJvdXRlTWF0Y2ggaGFwcGVuZWQuXG5cdCAqL1xuXHR3YWl0Rm9yUm91dGVNYXRjaEJlZm9yZU5hdmlnYXRpb24oKTogdm9pZCB7XG5cdFx0dGhpcy5fb1JvdXRlTWF0Y2hTeW5jaHJvbml6YXRpb24gPSBuZXcgU3luY2hyb25pemF0aW9uKCk7XG5cdFx0dGhpcy5fYkFjdGl2YXRlUm91dGVNYXRjaFN5bmNocm8gPSBmYWxzZTtcblx0fVxuXG5cdHN0YXRpYyBleHRyYWN0RW50aXR5U2V0c0Zyb21IYXNoKHNIYXNoOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmdbXSB7XG5cdFx0aWYgKHNIYXNoID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHNIYXNoID0gXCJcIjtcblx0XHR9XG5cdFx0Y29uc3Qgc0hhc2hOb1BhcmFtcyA9IHNIYXNoLnNwbGl0KFwiP1wiKVswXTsgLy8gcmVtb3ZlIHBhcmFtc1xuXHRcdGNvbnN0IGFUb2tlbnMgPSBzSGFzaE5vUGFyYW1zLnNwbGl0KFwiL1wiKTtcblx0XHRjb25zdCBuYW1lczogc3RyaW5nW10gPSBbXTtcblxuXHRcdGFUb2tlbnMuZm9yRWFjaCgoc1Rva2VuKSA9PiB7XG5cdFx0XHRpZiAoc1Rva2VuLmxlbmd0aCkge1xuXHRcdFx0XHRuYW1lcy5wdXNoKHNUb2tlbi5zcGxpdChcIihcIilbMF0pO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0cmV0dXJuIG5hbWVzO1xuXHR9XG5cblx0LyoqXG5cdCAqIEJ1aWxkcyBhIHN0YXRlIGZyb20gYSBoYXNoLlxuXHQgKiBAcGFyYW0gc0hhc2ggVGhlIGhhc2ggdG8gYmUgdXNlZCBhcyBlbnRyeVxuXHQgKiBAcmV0dXJucyBUaGUgc3RhdGVcblx0ICovXG5cdF9leHRyYWN0U3RhdGVGcm9tSGFzaChzSGFzaDogc3RyaW5nKTogUm91dGVyU3RhdGUge1xuXHRcdGlmIChzSGFzaCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRzSGFzaCA9IFwiXCI7XG5cdFx0fVxuXG5cdFx0Y29uc3Qgb1N0YXRlOiBSb3V0ZXJTdGF0ZSA9IHtcblx0XHRcdGtleXM6IFJvdXRlclByb3h5LmV4dHJhY3RFbnRpdHlTZXRzRnJvbUhhc2goc0hhc2gpLFxuXHRcdFx0aGFzaDogc0hhc2gsXG5cdFx0XHRzY3JlZW5Nb2RlOiAwIC8vIHdpbGwgYmUgdXBkYXRlZCBpbiBhIHNlY1xuXHRcdH07XG5cblx0XHQvLyBSZXRyaWV2ZSBsYXlvdXQgKGlmIGFueSlcblx0XHRjb25zdCBhTGF5b3V0ID0gc0hhc2gubWF0Y2gobmV3IFJlZ0V4cChgXFxcXD8uKiR7ZW51bVVSTFBhcmFtcy5MQVlPVVRQQVJBTX09KFteJl0qKWApKTtcblx0XHRvU3RhdGUuc0xheW91dCA9IGFMYXlvdXQgJiYgYUxheW91dC5sZW5ndGggPiAxID8gYUxheW91dFsxXSA6IHVuZGVmaW5lZDtcblx0XHRpZiAob1N0YXRlLnNMYXlvdXQgPT09IFwiTWlkQ29sdW1uRnVsbFNjcmVlblwiKSB7XG5cdFx0XHRvU3RhdGUuc2NyZWVuTW9kZSA9IDE7XG5cdFx0fSBlbHNlIGlmIChvU3RhdGUuc0xheW91dCA9PT0gXCJFbmRDb2x1bW5GdWxsU2NyZWVuXCIpIHtcblx0XHRcdG9TdGF0ZS5zY3JlZW5Nb2RlID0gMjtcblx0XHR9IGVsc2Uge1xuXHRcdFx0b1N0YXRlLnNjcmVlbk1vZGUgPSAwO1xuXHRcdH1cblx0XHRyZXR1cm4gb1N0YXRlO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFkZHMgYSBuZXcgc3RhdGUgaW50byB0aGUgaW50ZXJuYWwgaGlzdG9yeSBzdHJ1Y3R1cmUuXG5cdCAqIE1ha2VzIHN1cmUgdGhpcyBuZXcgc3RhdGUgaXMgYWRkZWQgYWZ0ZXIgYW4gYW5jZXN0b3IuXG5cdCAqIEFsc28gc2V0cyB0aGUgaUFwcFN0YXRlIGtleSBpbiB0aGUgd2hvbGUgaGlzdG9yeS5cblx0ICogQHBhcmFtIG9OZXdTdGF0ZSBUaGUgbmV3IHN0YXRlIHRvIGJlIGFkZGVkXG5cdCAqIEBwYXJhbSBiUmVidWlsZE9ubHkgYHRydWVgIGlmIHdlJ3JlIHJlYnVpbGRpbmcgdGhlIGhpc3RvcnkgYWZ0ZXIgYSBzaGVsbCBtZW51IG5hdmlnYXRpb25cblx0ICogQHBhcmFtIGJQcmVzZXJ2ZUhpc3RvcnkgSWYgc2V0IHRvIHRydWUsIG5vbi1hbmNlc3RvciBlbnRyaWVzIGluIGhpc3Rvcnkgd2lsbCBiZSByZXRhaW5lZFxuXHQgKiBAcGFyYW0gYkRpc2FibGVIaXN0b3J5UHJlc2VydmF0aW9uIERpc2FibGUgdGhlIG1lY2hhbmlzbSB0byByZXRhaW5lZCBtYXJrZWQgZW50cmllcyBpbiBjYWNoZVxuXHQgKiBAcmV0dXJucyBUaGUgbmV3IHN0YXRlXG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0X3B1c2hOZXdTdGF0ZShcblx0XHRvTmV3U3RhdGU6IFJvdXRlclN0YXRlLFxuXHRcdGJSZWJ1aWxkT25seTogYm9vbGVhbixcblx0XHRiUHJlc2VydmVIaXN0b3J5PzogYm9vbGVhbixcblx0XHRiRGlzYWJsZUhpc3RvcnlQcmVzZXJ2YXRpb24/OiBib29sZWFuXG5cdCk6IEh5c3RvcnlBY3Rpb24ge1xuXHRcdGNvbnN0IHNDdXJyZW50SGFzaCA9IHRoaXMucmVtb3ZlUmVzdG9yZUhpc3RvcnlGbGFnRnJvbUhhc2godGhpcy5nZXRIYXNoKCkpO1xuXHRcdGxldCBsYXN0SW5kZXggPSB0aGlzLl9vTWFuYWdlZEhpc3RvcnkubGVuZ3RoIC0gMTtcblx0XHRsZXQgaVBvcENvdW50ID0gYlJlYnVpbGRPbmx5ID8gMSA6IDA7XG5cblx0XHQvLyAxLiBEbyBzb21lIGNsZWFudXAgaW4gdGhlIG1hbmFnZWQgaGlzdG9yeSA6IGluIGNhc2UgdGhlIHVzZXIgaGFzIG5hdmlnYXRlZCBiYWNrIGluIHRoZSBicm93c2VyIGhpc3RvcnksIHdlIG5lZWQgdG8gcmVtb3ZlXG5cdFx0Ly8gdGhlIHN0YXRlcyBhaGVhZCBpbiBoaXN0b3J5IGFuZCBtYWtlIHN1cmUgdGhlIHRvcCBzdGF0ZSBjb3JyZXNwb25kcyB0byB0aGUgY3VycmVudCBwYWdlXG5cdFx0Ly8gV2UgZG9uJ3QgZG8gdGhhdCB3aGVuIHJlc3RvcmluZyB0aGUgaGlzdG9yeSwgYXMgdGhlIGN1cnJlbnQgc3RhdGUgaGFzIGJlZW4gYWRkZWQgb24gdG9wIG9mIHRoZSBicm93c2VyIGhpc3Rvcnlcblx0XHQvLyBhbmQgaXMgbm90IHJlZmxlY3RlZCBpbiB0aGUgbWFuYWdlZCBoaXN0b3J5XG5cdFx0aWYgKCFiUmVidWlsZE9ubHkpIHtcblx0XHRcdHdoaWxlIChsYXN0SW5kZXggPj0gMCAmJiB0aGlzLl9vTWFuYWdlZEhpc3RvcnlbbGFzdEluZGV4XS5oYXNoICE9PSBzQ3VycmVudEhhc2gpIHtcblx0XHRcdFx0dGhpcy5fb01hbmFnZWRIaXN0b3J5LnBvcCgpO1xuXHRcdFx0XHRsYXN0SW5kZXgtLTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHRoaXMuX29NYW5hZ2VkSGlzdG9yeS5sZW5ndGggPT09IDApIHtcblx0XHRcdFx0Ly8gV2UgY291bGRuJ3QgZmluZCB0aGUgY3VycmVudCBsb2NhdGlvbiBpbiB0aGUgaGlzdG9yeS4gVGhpcyBjYW4gaGFwcGVuIGlmIGEgYnJvd3NlciByZWxvYWRcblx0XHRcdFx0Ly8gaGFwcGVuZWQsIGNhdXNpbmcgYSByZWluaXRpYWxpemF0aW9uIG9mIHRoZSBtYW5hZ2VkIGhpc3RvcnkuXG5cdFx0XHRcdC8vIEluIHRoYXQgY2FzZSwgd2UgdXNlIHRoZSBjdXJyZW50IGxvY2F0aW9uIGFzIHRoZSBuZXcgc3RhcnRpbmcgcG9pbnQgaW4gdGhlIG1hbmFnZWQgaGlzdG9yeVxuXHRcdFx0XHR0aGlzLl9vTWFuYWdlZEhpc3RvcnkucHVzaCh0aGlzLl9leHRyYWN0U3RhdGVGcm9tSGFzaChzQ3VycmVudEhhc2gpKTtcblx0XHRcdFx0aGlzdG9yeS5yZXBsYWNlU3RhdGUoT2JqZWN0LmFzc2lnbih7IGZlTGV2ZWw6IDAgfSwgaGlzdG9yeS5zdGF0ZSksIFwiXCIpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIDIuIE1hcmsgdGhlIHRvcCBzdGF0ZSBhcyBwcmVzZXJ2ZWQgaWYgcmVxdWlyZWRcblx0XHRpZiAoYlByZXNlcnZlSGlzdG9yeSAmJiAhYkRpc2FibGVIaXN0b3J5UHJlc2VydmF0aW9uKSB7XG5cdFx0XHR0aGlzLl9vTWFuYWdlZEhpc3RvcnlbdGhpcy5fb01hbmFnZWRIaXN0b3J5Lmxlbmd0aCAtIDFdLnByZXNlcnZlZCA9IHRydWU7XG5cdFx0fVxuXG5cdFx0Ly8gMy4gVGhlbiBwb3AgYWxsIHN0YXRlcyB1bnRpbCB3ZSBmaW5kIGFuIGFuY2VzdG9yIG9mIHRoZSBuZXcgc3RhdGUsIG9yIHdlIGZpbmQgYSBzdGF0ZSB0aGF0IG5lZWQgdG8gYmUgcHJlc2VydmVkXG5cdFx0bGV0IG9MYXN0UmVtb3ZlZEl0ZW07XG5cdFx0d2hpbGUgKHRoaXMuX29NYW5hZ2VkSGlzdG9yeS5sZW5ndGggPiAwKSB7XG5cdFx0XHRjb25zdCBvVG9wU3RhdGUgPSB0aGlzLl9vTWFuYWdlZEhpc3RvcnlbdGhpcy5fb01hbmFnZWRIaXN0b3J5Lmxlbmd0aCAtIDFdO1xuXHRcdFx0aWYgKFxuXHRcdFx0XHQoYkRpc2FibGVIaXN0b3J5UHJlc2VydmF0aW9uIHx8ICFvVG9wU3RhdGUucHJlc2VydmVkKSAmJlxuXHRcdFx0XHR0aGlzLl9jb21wYXJlQ2FjaGVTdGF0ZXMob1RvcFN0YXRlLCBvTmV3U3RhdGUpICE9PSBlbnVtU3RhdGUuQU5DRVNUT1Jcblx0XHRcdCkge1xuXHRcdFx0XHQvLyBUaGUgdG9wIHN0YXRlIGlzIG5vdCBhbiBhbmNlc3RvciBvZiBvTmV3U3RhdGUgYW5kIGlzIG5vdCBwcmVzZXJ2ZWQgLS0+IHdlIGNhbiBwb3AgaXRcblx0XHRcdFx0b0xhc3RSZW1vdmVkSXRlbSA9IHRoaXMuX29NYW5hZ2VkSGlzdG9yeS5wb3AoKTtcblx0XHRcdFx0aVBvcENvdW50Kys7XG5cdFx0XHR9IGVsc2UgaWYgKG9Ub3BTdGF0ZS5wcmVzZXJ2ZWQgJiYgcmVtb3ZlQXBwU3RhdGVJbkhhc2gob1RvcFN0YXRlLmhhc2gpID09PSByZW1vdmVBcHBTdGF0ZUluSGFzaChvTmV3U3RhdGUuaGFzaCkpIHtcblx0XHRcdFx0Ly8gV2UgdHJ5IHRvIGFkZCBhIHN0YXRlIHRoYXQgaXMgYWxyZWFkeSBpbiBjYWNoZSAoZHVlIHRvIHByZXNlcnZlZCBmbGFnKSBidXQgd2l0aCBhIGRpZmZlcmVudCBpYXBwLXN0YXRlXG5cdFx0XHRcdC8vIC0tPiB3ZSBzaG91bGQgZGVsZXRlIHRoZSBwcmV2aW91cyBlbnRyeSAoaXQgd2lsbCBiZSBsYXRlciByZXBsYWNlZCBieSB0aGUgbmV3IG9uZSkgYW5kIHN0b3AgcG9wcGluZ1xuXHRcdFx0XHRvTGFzdFJlbW92ZWRJdGVtID0gdGhpcy5fb01hbmFnZWRIaXN0b3J5LnBvcCgpO1xuXHRcdFx0XHRpUG9wQ291bnQrKztcblx0XHRcdFx0b05ld1N0YXRlLnByZXNlcnZlZCA9IHRydWU7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0YnJlYWs7IC8vIEFuY2VzdG9yIG9yIHByZXNlcnZlZCBzdGF0ZSBmb3VuZCAtLT4gd2Ugc3RvcCBwb3BwaW5nIG91dCBzdGF0ZXNcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyA0LiBpQXBwU3RhdGUgbWFuYWdlbWVudFxuXHRcdHRoaXMuc0lBcHBTdGF0ZUtleSA9IHRoaXMuZmluZEFwcFN0YXRlSW5IYXNoKG9OZXdTdGF0ZS5oYXNoKTtcblx0XHRpZiAoIXRoaXMuZmNsRW5hYmxlZCAmJiBvTGFzdFJlbW92ZWRJdGVtKSB7XG5cdFx0XHRjb25zdCBzUHJldmlvdXNJQXBwU3RhdGVLZXkgPSB0aGlzLmZpbmRBcHBTdGF0ZUluSGFzaChvTGFzdFJlbW92ZWRJdGVtLmhhc2gpO1xuXHRcdFx0Y29uc3Qgb0NvbXBhcmlzb25TdGF0ZVJlc3VsdCA9IHRoaXMuX2NvbXBhcmVDYWNoZVN0YXRlcyhvTGFzdFJlbW92ZWRJdGVtLCBvTmV3U3RhdGUpO1xuXHRcdFx0Ly8gaWYgY3VycmVudCBzdGF0ZSBkb2Vzbid0IGNvbnRhaW4gYSBpLWFwcHN0YXRlIGFuZCB0aGlzIHN0YXRlIHNob3VsZCByZXBsYWNlIGEgc3RhdGUgY29udGFpbmluZyBhIGlBcHBTdGF0ZVxuXHRcdFx0Ly8gdGhlbiB0aGUgcHJldmlvdXMgaUFwcFN0YXRlIGlzIHByZXNlcnZlZFxuXHRcdFx0aWYgKFxuXHRcdFx0XHQhdGhpcy5zSUFwcFN0YXRlS2V5ICYmXG5cdFx0XHRcdHNQcmV2aW91c0lBcHBTdGF0ZUtleSAmJlxuXHRcdFx0XHQob0NvbXBhcmlzb25TdGF0ZVJlc3VsdCA9PT0gZW51bVN0YXRlLkVRVUFMIHx8IG9Db21wYXJpc29uU3RhdGVSZXN1bHQgPT09IGVudW1TdGF0ZS5DT01QQVRJQkxFKVxuXHRcdFx0KSB7XG5cdFx0XHRcdG9OZXdTdGF0ZS5oYXNoID0gdGhpcy5zZXRBcHBTdGF0ZUluSGFzaChvTmV3U3RhdGUuaGFzaCwgc1ByZXZpb3VzSUFwcFN0YXRlS2V5KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyA1LiBOb3cgd2UgY2FuIHB1c2ggdGhlIHN0YXRlIGF0IHRoZSB0b3Agb2YgdGhlIGludGVybmFsIGhpc3Rvcnlcblx0XHRjb25zdCBiSGFzU2FtZUhhc2ggPSBvTGFzdFJlbW92ZWRJdGVtICYmIG9OZXdTdGF0ZS5oYXNoID09PSBvTGFzdFJlbW92ZWRJdGVtLmhhc2g7XG5cdFx0aWYgKHRoaXMuX29NYW5hZ2VkSGlzdG9yeS5sZW5ndGggPT09IDAgfHwgdGhpcy5fb01hbmFnZWRIaXN0b3J5W3RoaXMuX29NYW5hZ2VkSGlzdG9yeS5sZW5ndGggLSAxXS5oYXNoICE9PSBvTmV3U3RhdGUuaGFzaCkge1xuXHRcdFx0dGhpcy5fb01hbmFnZWRIaXN0b3J5LnB1c2gob05ld1N0YXRlKTtcblx0XHRcdGlmIChvTGFzdFJlbW92ZWRJdGVtICYmIHJlbW92ZUFwcFN0YXRlSW5IYXNoKG9MYXN0UmVtb3ZlZEl0ZW0uaGFzaCkgPT09IHJlbW92ZUFwcFN0YXRlSW5IYXNoKG9OZXdTdGF0ZS5oYXNoKSkge1xuXHRcdFx0XHRvTmV3U3RhdGUuZm9jdXNDb250cm9sSWQgPSBvTGFzdFJlbW92ZWRJdGVtLmZvY3VzQ29udHJvbElkO1xuXHRcdFx0XHRvTmV3U3RhdGUuc2Vjb25kYXJ5Rm9jdXNDb250cm9sSWQgPSBvTGFzdFJlbW92ZWRJdGVtLnNlY29uZGFyeUZvY3VzQ29udHJvbElkO1xuXHRcdFx0XHRvTmV3U3RhdGUuZm9jdXNJbmZvID0gb0xhc3RSZW1vdmVkSXRlbS5mb2N1c0luZm87XG5cdFx0XHRcdG9OZXdTdGF0ZS5zZWNvbmRhcnlGb2N1c0luZm8gPSBvTGFzdFJlbW92ZWRJdGVtLnNlY29uZGFyeUZvY3VzSW5mbztcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyA2LiBEZXRlcm1pbmUgd2hpY2ggYWN0aW9ucyB0byBkbyBvbiB0aGUgaGlzdG9yeVxuXHRcdGlmIChpUG9wQ291bnQgPT09IDApIHtcblx0XHRcdC8vIE5vIHN0YXRlIHdhcyBwb3BwZWQgLS0+IGFwcGVuZFxuXHRcdFx0cmV0dXJuIHsgdHlwZTogXCJhcHBlbmRcIiB9O1xuXHRcdH0gZWxzZSBpZiAoaVBvcENvdW50ID09PSAxKSB7XG5cdFx0XHQvLyBPbmx5IDEgc3RhdGUgd2FzIHBvcHBlZCAtLT4gcmVwbGFjZSBjdXJyZW50IGhhc2ggdW5sZXNzIGhhc2ggaXMgdGhlIHNhbWUgKHRoZW4gbm90aGluZyB0byBkbylcblx0XHRcdHJldHVybiBiSGFzU2FtZUhhc2ggPyB7IHR5cGU6IFwibm9uZVwiIH0gOiB7IHR5cGU6IFwicmVwbGFjZVwiIH07XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIE1vcmUgdGhhbiAxIHN0YXRlIHdhcyBwb3BwZWQgLS0+IGdvIGJha2MgaW4gaGlzdG9yeSBhbmQgcmVwbGFjZSBoYXNoIGlmIG5lY2Vzc2FyeVxuXHRcdFx0cmV0dXJuIGJIYXNTYW1lSGFzaCA/IHsgdHlwZTogXCJiYWNrXCIsIHN0ZXBzOiBpUG9wQ291bnQgLSAxIH0gOiB7IHR5cGU6IFwiYmFjay1yZXBsYWNlXCIsIHN0ZXBzOiBpUG9wQ291bnQgLSAxIH07XG5cdFx0fVxuXHR9XG5cblx0X2Jsb2NraW5nTmF2aWdhdGlvbkZpbHRlcigpOiBcIkN1c3RvbVwiIHwgXCJDb250aW51ZVwiIHtcblx0XHRyZXR1cm4gdGhpcy5fYkRpc2FibGVPbkhhc2hDaGFuZ2UgPyBcIkN1c3RvbVwiIDogXCJDb250aW51ZVwiO1xuXHR9XG5cblx0LyoqXG5cdCAqIERpc2FibGUgdGhlIHJvdXRpbmcgYnkgY2FsbGluZyB0aGUgcm91dGVyIHN0b3AgbWV0aG9kLlxuXHQgKiBAZmluYWxcblx0ICovXG5cdF9kaXNhYmxlRXZlbnRPbkhhc2hDaGFuZ2UoKTogdm9pZCB7XG5cdFx0dGhpcy5fYkRpc2FibGVPbkhhc2hDaGFuZ2UgPSB0cnVlO1xuXHRcdHRoaXMuX29Sb3V0ZXIuc3RvcCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEVuYWJsZSB0aGUgcm91dGluZyBieSBjYWxsaW5nIHRoZSByb3V0ZXIgaW5pdGlhbGl6ZSBtZXRob2QuXG5cdCAqIEBwYXJhbSBbYklnbm9yZUN1cnJlbnRIYXNoXSBJZ25vcmUgdGhlIGxhc3QgaGFzaCBldmVudCB0cmlnZ2VyZWQgYmVmb3JlIHRoZSByb3V0ZXIgaGFzIGluaXRpYWxpemVkXG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0X2VuYWJsZUV2ZW50T25IYXNoQ2hhbmdlKGJJZ25vcmVDdXJyZW50SGFzaDogYm9vbGVhbiB8IHVuZGVmaW5lZCk6IHZvaWQge1xuXHRcdHRoaXMuX2JEaXNhYmxlT25IYXNoQ2hhbmdlID0gZmFsc2U7XG5cdFx0dGhpcy5fb1JvdXRlci5pbml0aWFsaXplKGJJZ25vcmVDdXJyZW50SGFzaCk7XG5cdH1cblxuXHQvKipcblx0ICogU3luY2hyb25pemVzIHRoZSBicm93c2VyIGhpc3Rvcnkgd2l0aCB0aGUgaW50ZXJuYWwgaGlzdG9yeSBvZiB0aGUgcm91dGVyUHJveHksIGFuZCB0cmlnZ2VycyBhIG5hdmlnYXRpb24gaWYgbmVlZGVkLlxuXHQgKiBAcGFyYW0gb0hpc3RvcnlBY3Rpb24gU3BlY2lmaWVzIHRoZSBuYXZpZ2F0aW9uIGFjdGlvbiB0byBiZSBwZXJmb3JtZWRcblx0ICogQHBhcmFtIGJSZWJ1aWxkT25seSBgdHJ1ZWAgaWYgaW50ZXJuYWwgaGlzdG9yeSBpcyBjdXJyZW50bHkgYmVpbmcgcmVidWlsdFxuXHQgKiBAcmV0dXJucyBQcm9taXNlIChyZXNvbHZlZCB3aGVuIHRoZSBuYXZpZ2F0aW9uIGlzIGZpbmFsaXplZCkgdGhhdCByZXR1cm5zICd0cnVlJyBpZiBhIG5hdmlnYXRpb24gdG9vayBwbGFjZSwgJ2ZhbHNlJyBpZiB0aGUgbmF2aWdhdGlvbiBkaWRuJ3QgaGFwcGVuXG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0YXN5bmMgX3JlYnVpbGRCcm93c2VySGlzdG9yeShvSGlzdG9yeUFjdGlvbjogSHlzdG9yeUFjdGlvbiwgYlJlYnVpbGRPbmx5OiBib29sZWFuKTogUHJvbWlzZTxib29sZWFuPiB7XG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzXG5cdFx0Y29uc3QgdGhhdCA9IHRoaXM7XG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG5cdFx0XHR0aGlzLmJJc1JlYnVpbGRIaXN0b3J5UnVubmluZyA9IHRydWU7XG5cdFx0XHRjb25zdCBvVGFyZ2V0U3RhdGUgPSB0aGlzLl9vTWFuYWdlZEhpc3RvcnlbdGhpcy5fb01hbmFnZWRIaXN0b3J5Lmxlbmd0aCAtIDFdLFxuXHRcdFx0XHRuZXdMZXZlbCA9IHRoaXMuX29NYW5hZ2VkSGlzdG9yeS5sZW5ndGggLSAxO1xuXG5cdFx0XHRmdW5jdGlvbiByZXBsYWNlQXN5bmMoKTogdm9pZCB7XG5cdFx0XHRcdGlmICghYlJlYnVpbGRPbmx5KSB7XG5cdFx0XHRcdFx0dGhhdC5fZW5hYmxlRXZlbnRPbkhhc2hDaGFuZ2UodHJ1ZSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQodGhhdC5fb1JvdXRlci5nZXRIYXNoQ2hhbmdlcigpLnJlcGxhY2VIYXNoIGFzIEZ1bmN0aW9uKShvVGFyZ2V0U3RhdGUuaGFzaCk7XG5cdFx0XHRcdGhpc3RvcnkucmVwbGFjZVN0YXRlKE9iamVjdC5hc3NpZ24oeyBmZUxldmVsOiBuZXdMZXZlbCB9LCBoaXN0b3J5LnN0YXRlKSwgXCJcIik7XG5cblx0XHRcdFx0aWYgKGJSZWJ1aWxkT25seSkge1xuXHRcdFx0XHRcdHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0Ly8gVGltZW91dCB0byBsZXQgJ2hhc2hjaGFuZ2UnIGV2ZW50IGJlIHByb2Nlc3NlZCBiZWZvcmUgYnkgdGhlIEhhc2hDaGFuZ2VyLCBzbyB0aGF0XG5cdFx0XHRcdFx0XHQvLyBvblJvdXRlTWF0Y2hlZCBub3RpZmljYXRpb24gaXNuJ3QgcmFpc2VkXG5cdFx0XHRcdFx0XHR0aGF0Ll9lbmFibGVFdmVudE9uSGFzaENoYW5nZSh0cnVlKTtcblx0XHRcdFx0XHR9LCAwKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRoYXQuYklzUmVidWlsZEhpc3RvcnlSdW5uaW5nID0gZmFsc2U7XG5cdFx0XHRcdHJlc29sdmUodHJ1ZSk7IC8vIGEgbmF2aWdhdGlvbiBvY2N1cnJlZFxuXHRcdFx0fVxuXG5cdFx0XHQvLyBBc3luYyBjYWxsYmFja3Mgd2hlbiBuYXZpZ2F0aW5nIGJhY2ssIGluIG9yZGVyIHRvIGxldCBhbGwgbm90aWZpY2F0aW9ucyBhbmQgZXZlbnRzIGdldCBwcm9jZXNzZWRcblx0XHRcdGZ1bmN0aW9uIGJhY2tSZXBsYWNlQXN5bmMoKTogdm9pZCB7XG5cdFx0XHRcdHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9wc3RhdGVcIiwgYmFja1JlcGxhY2VBc3luYyk7XG5cdFx0XHRcdHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdC8vIFRpbWVvdXQgdG8gbGV0ICdoYXNoY2hhbmdlJyBldmVudCBiZSBwcm9jZXNzZWQgYmVmb3JlIGJ5IHRoZSBIYXNoQ2hhbmdlclxuXHRcdFx0XHRcdHJlcGxhY2VBc3luYygpO1xuXHRcdFx0XHR9LCAwKTtcblx0XHRcdH1cblxuXHRcdFx0ZnVuY3Rpb24gYmFja0FzeW5jKCk6IHZvaWQge1xuXHRcdFx0XHR3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInBvcHN0YXRlXCIsIGJhY2tBc3luYyk7XG5cdFx0XHRcdHRoYXQuYklzUmVidWlsZEhpc3RvcnlSdW5uaW5nID0gZmFsc2U7XG5cdFx0XHRcdHJlc29sdmUodHJ1ZSk7IC8vIGEgbmF2aWdhdGlvbiBvY2N1cnJlZFxuXHRcdFx0fVxuXG5cdFx0XHR0aGF0Ll9iSWdub3JlUmVzdG9yZSA9IHRydWU7XG5cblx0XHRcdHN3aXRjaCAob0hpc3RvcnlBY3Rpb24udHlwZSkge1xuXHRcdFx0XHRjYXNlIFwicmVwbGFjZVwiOlxuXHRcdFx0XHRcdGNvbnN0IGZvY3VzSW5mbyA9IGhpc3Rvcnkuc3RhdGU/LmZvY3VzSW5mbztcblx0XHRcdFx0XHQodGhhdC5fb1JvdXRlci5nZXRIYXNoQ2hhbmdlcigpLnJlcGxhY2VIYXNoIGFzIEZ1bmN0aW9uKShvVGFyZ2V0U3RhdGUuaGFzaCk7XG5cdFx0XHRcdFx0aGlzdG9yeS5yZXBsYWNlU3RhdGUoXG5cdFx0XHRcdFx0XHRPYmplY3QuYXNzaWduKFxuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0ZmVMZXZlbDogbmV3TGV2ZWwsXG5cdFx0XHRcdFx0XHRcdFx0Zm9jdXNJbmZvOiBmb2N1c0luZm9cblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0aGlzdG9yeS5zdGF0ZVxuXHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdFwiXCJcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdHRoYXQuYklzUmVidWlsZEhpc3RvcnlSdW5uaW5nID0gZmFsc2U7XG5cdFx0XHRcdFx0cmVzb2x2ZSh0cnVlKTsgLy8gYSBuYXZpZ2F0aW9uIG9jY3VycmVkXG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSBcImFwcGVuZFwiOlxuXHRcdFx0XHRcdHRoYXQuX29Sb3V0ZXIuZ2V0SGFzaENoYW5nZXIoKS5zZXRIYXNoKG9UYXJnZXRTdGF0ZS5oYXNoKTtcblx0XHRcdFx0XHRoaXN0b3J5LnJlcGxhY2VTdGF0ZShPYmplY3QuYXNzaWduKHsgZmVMZXZlbDogbmV3TGV2ZWwgfSwgaGlzdG9yeS5zdGF0ZSksIFwiXCIpO1xuXHRcdFx0XHRcdHRoYXQuYklzUmVidWlsZEhpc3RvcnlSdW5uaW5nID0gZmFsc2U7XG5cdFx0XHRcdFx0cmVzb2x2ZSh0cnVlKTsgLy8gYSBuYXZpZ2F0aW9uIG9jY3VycmVkXG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSBcImJhY2tcIjpcblx0XHRcdFx0XHR3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInBvcHN0YXRlXCIsIGJhY2tBc3luYyk7XG5cdFx0XHRcdFx0aGlzdG9yeS5nbygtb0hpc3RvcnlBY3Rpb24uc3RlcHMpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgXCJiYWNrLXJlcGxhY2VcIjpcblx0XHRcdFx0XHR0aGlzLl9kaXNhYmxlRXZlbnRPbkhhc2hDaGFuZ2UoKTtcblx0XHRcdFx0XHR3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInBvcHN0YXRlXCIsIGJhY2tSZXBsYWNlQXN5bmMpO1xuXHRcdFx0XHRcdGhpc3RvcnkuZ28oLW9IaXN0b3J5QWN0aW9uLnN0ZXBzKTtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdC8vIE5vIG5hdmlnYXRpb25cblx0XHRcdFx0XHR0aGlzLmJJc1JlYnVpbGRIaXN0b3J5UnVubmluZyA9IGZhbHNlO1xuXHRcdFx0XHRcdHJlc29sdmUoZmFsc2UpOyAvLyBubyBuYXZpZ2F0aW9uIC0tPiByZXNvbHZlIHRvIGZhbHNlXG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHRnZXRMYXN0SGlzdG9yeUVudHJ5KCk6IFJvdXRlclN0YXRlIHtcblx0XHRyZXR1cm4gdGhpcy5fb01hbmFnZWRIaXN0b3J5W3RoaXMuX29NYW5hZ2VkSGlzdG9yeS5sZW5ndGggLSAxXTtcblx0fVxuXG5cdHNldFBhdGhNYXBwaW5nKG1hcHBpbmdzOiB7IG9sZFBhdGg6IHN0cmluZzsgbmV3UGF0aDogc3RyaW5nIH1bXSk6IHZvaWQge1xuXHRcdHRoaXMuX3BhdGhNYXBwaW5ncyA9IG1hcHBpbmdzLmZpbHRlcigobWFwcGluZykgPT4ge1xuXHRcdFx0cmV0dXJuIG1hcHBpbmcub2xkUGF0aCAhPT0gbWFwcGluZy5uZXdQYXRoO1xuXHRcdH0pO1xuXHR9XG5cblx0aGFzaEd1YXJkKCk6IHZvaWQge1xuXHRcdGxldCBzSGFzaCA9IHRoaXMuZ2V0RGVjb2RlZFdpbmRvd0hhc2goKTtcblx0XHRjb25zdCBjdXJyZW50QXBwTmFtZSA9IHRoaXMuZ2V0QXBwTmFtZUZyb21IYXNoKHNIYXNoKTtcblx0XHRpZiAoY3VycmVudEFwcE5hbWUgIT0gdGhpcy5hcHBOYW1lKSB7XG5cdFx0XHQvLyBXaGVuIGRvaW5nIGV4dGVybmFsIG5hdmlnYXRpb24gaW4gYW5vdGhlciB3aW5kb3csIHRoZSBjdXJyZW50IHdpbmRvdyBsb2NhdGlvbiBpcyB0ZW1wb3JhcmlseSBtb2RpZmllZCB3aXRoIHRoZSBVUkwgb2YgdGhlIHRhcmdldCBhcHBcblx0XHRcdC8vIEluIHRoaXMgY2FzZSwgd2UgZG9uJ3Qgd2FudCB0byB1cGRhdGUgdGhlIGludGVybmFsbHkgbWFuYWdlZCBoaXN0b3J5LCBzbyB3ZSBzaW1wbHkgZG8gbm90aGluZ1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmIChzSGFzaC5pbmNsdWRlcyhcInJlc3RvcmVIaXN0b3J5PXRydWVcIikpIHtcblx0XHRcdHRoaXMuX2JBcHBseVJlc3RvcmUgPSB0cnVlO1xuXHRcdH0gZWxzZSBpZiAoIXRoaXMuYklzUmVidWlsZEhpc3RvcnlSdW5uaW5nICYmIHRoaXMuX29Sb3V0ZXIuaXNJbml0aWFsaXplZCgpKSB7XG5cdFx0XHQvLyBDaGVjayBpZiB0aGUgaGFzaCBuZWVkcyB0byBiZSBjaGFuZ2VkICh0aGlzIGhhcHBlbnMgaW4gRkNMIHdoZW4gc3dpdGNoaW5nIGIvdyBlZGl0IGFuZCByZWFkLW9ubHkgd2l0aCAzIGNvbHVtbnMgb3Blbilcblx0XHRcdGNvbnN0IG1hcHBpbmcgPSB0aGlzLl9wYXRoTWFwcGluZ3MuZmluZCgobSkgPT4ge1xuXHRcdFx0XHRyZXR1cm4gc0hhc2guaW5jbHVkZXMobS5vbGRQYXRoKTtcblx0XHRcdH0pO1xuXHRcdFx0aWYgKG1hcHBpbmcpIHtcblx0XHRcdFx0Ly8gUmVwbGFjZSB0aGUgY3VycmVudCBoYXNoXG5cdFx0XHRcdHNIYXNoID0gc0hhc2gucmVwbGFjZShtYXBwaW5nLm9sZFBhdGgsIG1hcHBpbmcubmV3UGF0aCk7XG5cdFx0XHRcdGhpc3RvcnkucmVwbGFjZVN0YXRlKE9iamVjdC5hc3NpZ24oe30sIGhpc3Rvcnkuc3RhdGUpLCBcIlwiLCBlbmNvZGVVUkkoc0hhc2gpKTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgYUhhc2hTcGxpdCA9IHNIYXNoLnNwbGl0KFwiJi9cIik7XG5cdFx0XHRjb25zdCBzQXBwSGFzaCA9IGFIYXNoU3BsaXRbMV0gPyBhSGFzaFNwbGl0WzFdIDogXCJcIjtcblx0XHRcdGlmICh0aGlzLmNoZWNrSGFzaFdpdGhHdWFyZChzQXBwSGFzaCkpIHtcblx0XHRcdFx0Y29uc3Qgb05ld1N0YXRlID0gdGhpcy5fZXh0cmFjdFN0YXRlRnJvbUhhc2goc0FwcEhhc2gpO1xuXHRcdFx0XHR0aGlzLl9wdXNoTmV3U3RhdGUob05ld1N0YXRlLCBmYWxzZSwgZmFsc2UsIHRoaXMuaXNBcHBTdGF0ZVVwZGF0aW5nKCkgPyBmYWxzZSA6IHRydWUpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBDb21wYXJlcyAyIHN0YXRlcy5cblx0ICogQHBhcmFtIHtvYmplY3R9IG9TdGF0ZTFcblx0ICogQHBhcmFtIHtvYmplY3R9IG9TdGF0ZTJcblx0ICogQHJldHVybnMge251bWJlcn0gVGhlIHJlc3VsdCBvZiB0aGUgY29tcGFyaXNvbjpcblx0ICogICAgICAgIC0gZW51bVN0YXRlLkVRVUFMIGlmIG9TdGF0ZTEgYW5kIG9TdGF0ZTIgYXJlIGVxdWFsXG5cdCAqICAgICAgICAtIGVudW1TdGF0ZS5DT01QQVRJQkxFIGlmIG9TdGF0ZTEgYW5kIG9TdGF0ZTIgYXJlIGNvbXBhdGlibGVcblx0ICogICAgICAgIC0gZW51bVN0YXRlLkFOQ0VTVE9SIGlmIG9TdGF0ZTEgaXMgYW4gYW5jZXN0b3Igb2Ygb1N0YXRlMlxuXHQgKiAgICAgICAgLSBlbnVtU3RhdGUuRElGRkVSRU5UIGlmIHRoZSAyIHN0YXRlcyBhcmUgZGlmZmVyZW50XG5cdCAqL1xuXG5cdF9jb21wYXJlQ2FjaGVTdGF0ZXMob1N0YXRlMTogUm91dGVyU3RhdGUsIG9TdGF0ZTI6IFJvdXRlclN0YXRlKTogbnVtYmVyIHtcblx0XHQvLyBGaXJzdCBjb21wYXJlIG9iamVjdCBrZXlzXG5cdFx0aWYgKG9TdGF0ZTEua2V5cy5sZW5ndGggPiBvU3RhdGUyLmtleXMubGVuZ3RoKSB7XG5cdFx0XHRyZXR1cm4gZW51bVN0YXRlLkRJRkZFUkVOVDtcblx0XHR9XG5cdFx0bGV0IGVxdWFsID0gdHJ1ZTtcblx0XHRsZXQgaW5kZXg7XG5cblx0XHRmb3IgKGluZGV4ID0gMDsgZXF1YWwgJiYgaW5kZXggPCBvU3RhdGUxLmtleXMubGVuZ3RoOyBpbmRleCsrKSB7XG5cdFx0XHRpZiAob1N0YXRlMS5rZXlzW2luZGV4XSAhPT0gb1N0YXRlMi5rZXlzW2luZGV4XSkge1xuXHRcdFx0XHRlcXVhbCA9IGZhbHNlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmICghZXF1YWwpIHtcblx0XHRcdC8vIENoZWNrIHJvdXRpbmdIaW50c1xuXHRcdFx0aWYgKG9TdGF0ZTEua2V5cy5sZW5ndGggPT09IDEgJiYgb1N0YXRlMi5rZXlzLmxlbmd0aCA9PT0gMSAmJiB0aGlzLnJvdXRpbmdIaW50cz8uW29TdGF0ZTEua2V5c1swXV0pIHtcblx0XHRcdFx0aWYgKHRoaXMucm91dGluZ0hpbnRzW29TdGF0ZTEua2V5c1swXV0ucGFyZW50T2YgJiYgdGhpcy5yb3V0aW5nSGludHNbb1N0YXRlMS5rZXlzWzBdXS5wYXJlbnRPZi5pbmNsdWRlcyhvU3RhdGUyLmtleXNbMF0pKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGVudW1TdGF0ZS5BTkNFU1RPUjtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0Ly8gU29tZSBvYmplY3RzIGtleXMgYXJlIGRpZmZlcmVudFxuXHRcdFx0cmV0dXJuIGVudW1TdGF0ZS5ESUZGRVJFTlQ7XG5cdFx0fVxuXG5cdFx0Ly8gQWxsIGtleXMgZnJvbSBvU3RhdGUxIGFyZSBpbiBvU3RhdGUyIC0tPiBjaGVjayBpZiBhbmNlc3RvclxuXHRcdGlmIChvU3RhdGUxLmtleXMubGVuZ3RoIDwgb1N0YXRlMi5rZXlzLmxlbmd0aCB8fCBvU3RhdGUxLnNjcmVlbk1vZGUgPCBvU3RhdGUyLnNjcmVlbk1vZGUpIHtcblx0XHRcdHJldHVybiBlbnVtU3RhdGUuQU5DRVNUT1I7XG5cdFx0fVxuXHRcdGlmIChvU3RhdGUxLnNjcmVlbk1vZGUgPiBvU3RhdGUyLnNjcmVlbk1vZGUpIHtcblx0XHRcdHJldHVybiBlbnVtU3RhdGUuRElGRkVSRU5UOyAvLyBOb3Qgc3VyZSB0aGlzIGNhc2UgY2FuIGhhcHBlbi4uLlxuXHRcdH1cblxuXHRcdC8vIEF0IHRoaXMgc3RhZ2UsIHRoZSAyIHN0YXRlcyBoYXZlIHRoZSBzYW1lIG9iamVjdCBrZXlzIChpbiB0aGUgc2FtZSBvcmRlcikgYW5kIHNhbWUgc2NyZWVubW9kZVxuXHRcdC8vIFRoZXkgY2FuIGJlIGVpdGhlciBjb21wYXRpYmxlIG9yIGVxdWFsXG5cdFx0cmV0dXJuIG9TdGF0ZTEuc0xheW91dCA9PT0gb1N0YXRlMi5zTGF5b3V0ID8gZW51bVN0YXRlLkVRVUFMIDogZW51bVN0YXRlLkNPTVBBVElCTEU7XG5cdH1cblxuXHQvKipcblx0ICogU3BsaXQgdGhlIGFwcC1zcGVjaWZpYyByb3V0ZSBhdCB0aGUgXCImL1wiIHNlcGFyYXRvci5cblx0ICpcblx0ICogVGhlIGFwcC1zcGVjaWZpYyByb3V0ZSBjb25zaXN0cyBvZiBvbmUgb3IgbW9yZSBzZWdtZW50cyBzZXBhcmF0ZWQgYnkgXCImL1wiLlxuXHQgKiBAZXhhbXBsZVxuXHQgKiBzcGxpdEFwcFNwZWNpZmljUm91dGUoXCImL0VudGl0eSgnYWJjJykvTmV4dEVudGl0eSgneHl6JylcIik7XG5cdCAqIC8vIFtcIkVudGl0eSgnYWJjJykvTmV4dEVudGl0eSgneHl6JylcIl1cblx0ICpcblx0ICogc3BsaXRBcHBTcGVjaWZpY1JvdXRlKFwiJi9FbnRpdHkoJ2FiYycpL05leHRFbnRpdHkoJ3h5eicpJi9QcmVmaXgvTmVzdGVkUm91dGVcIik7XG5cdCAqIC8vIFtcIkVudGl0eSgnYWJjJykvTmV4dEVudGl0eSgneHl6JylcIiwgXCJQcmVmaXgvTmVzdGVkUm91dGVcIl1cblx0ICogQHBhcmFtIGFwcFNwZWNpZmljUm91dGVcdFRoZSBhcHAtc3BlY2lmaWMgcm91dGUuXG5cdCAqIEByZXR1cm5zIEFuIGFycmF5IG9mIGFwcC1zcGVjaWZpYyByb3V0ZSBzZWdtZW50cy5cblx0ICovXG5cdHByaXZhdGUgc3RhdGljIHNwbGl0QXBwU3BlY2lmaWNSb3V0ZShhcHBTcGVjaWZpY1JvdXRlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmdbXSB7XG5cdFx0Y29uc3Qgcm91dGVTcGxpdCA9IGFwcFNwZWNpZmljUm91dGU/LnNwbGl0KFwiJi9cIikgPz8gW107XG5cdFx0aWYgKCFyb3V0ZVNwbGl0WzBdKSB7XG5cdFx0XHRyb3V0ZVNwbGl0LnNoaWZ0KCk7IC8vIHJlbW92ZSB0aGUgbGVhZGluZyBlbXB0eSBzZWdtZW50ICh0aGUgYXBwLXNwZWNpZmljIHJvdXRlIHN0YXJ0cyB3aXRoIFwiJi9cIilcblx0XHR9XG5cdFx0cmV0dXJuIHJvdXRlU3BsaXQ7XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2tzIGlmIGJhY2sgZXhpdHMgdGhlIHByZXNlbnQgZ3VhcmQgc2V0LlxuXHQgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgYmFjayBleGl0cyB0aGUgZ3VhcmRcblx0ICovXG5cdGNoZWNrSWZCYWNrSXNPdXRPZkd1YXJkKCk6IGJvb2xlYW4ge1xuXHRcdC8vIFdlIHVzZSB3aW5kb3cubG9jYXRpb24uaGFzaCBpbnN0ZWFkIG9mIEhhc2hDaGFuZ2VyLmdldEluc3RhbmNlKCkuZ2V0SGFzaCgpIGJlY2F1c2UgdGhlIGxhdHRlclxuXHRcdC8vIHJlcGxhY2VzIGNoYXJhY3RlcnMgaW4gdGhlIFVSTCAoZS5nLiAlMjQgcmVwbGFjZWQgYnkgJCkgYW5kIGl0IGNhdXNlcyBpc3N1ZXMgd2hlbiBjb21wYXJpbmdcblx0XHQvLyB3aXRoIHRoZSBVUkxzIGluIHRoZSBtYW5hZ2VkIGhpc3Rvcnlcblx0XHRjb25zdCBzcGxpdEhhc2ggPSB0aGlzLmdldEZ1bGxIYXNoKCk7XG5cblx0XHRjb25zdCBzZWdtZW50cyA9IFJvdXRlclByb3h5LnNwbGl0QXBwU3BlY2lmaWNSb3V0ZShzcGxpdEhhc2gpO1xuXG5cdFx0aWYgKHNlZ21lbnRzLmxlbmd0aCA+IDEpIHtcblx0XHRcdC8vIHRoZXJlIGlzIGEgbmVzdGVkIHJvdXRlIGludm9sdmVkIC0+IGFzc3VtZSB3ZSBhcmUgc3RpbGwgaW5zaWRlIHRoZSBndWFyZFxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdGNvbnN0IGhhc2ggPSBzZWdtZW50c1swXSA/PyBcIlwiO1xuXG5cdFx0bGV0IHByZXZpb3VzSGFzaDtcblx0XHRpZiAodGhpcy5fb05hdmlnYXRpb25HdWFyZCkge1xuXHRcdFx0Zm9yIChsZXQgaSA9IHRoaXMuX29NYW5hZ2VkSGlzdG9yeS5sZW5ndGggLSAxOyBpID4gMDsgaS0tKSB7XG5cdFx0XHRcdGlmICh0aGlzLl9vTWFuYWdlZEhpc3RvcnlbaV0uaGFzaCA9PT0gaGFzaCkge1xuXHRcdFx0XHRcdHByZXZpb3VzSGFzaCA9IHRoaXMuX29NYW5hZ2VkSGlzdG9yeVtpIC0gMV0uaGFzaDtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gIXByZXZpb3VzSGFzaCB8fCAhdGhpcy5jaGVja0hhc2hXaXRoR3VhcmQocHJldmlvdXNIYXNoKTtcblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiBhIGJhY2sgbmF2aWdhdGlvbiB3aWxsIGV4aXQgdGhlIGFwcC5cblx0ICogQHJldHVybnMgVHJ1ZSBpZiBiYWNrIGV4aXRzIHRoZSBhcHBcblx0ICovXG5cdGNoZWNrSWZCYWNrRXhpdHNBcHAoKTogYm9vbGVhbiB7XG5cdFx0Y29uc3Qgc3BsaXRIYXNoID0gdGhpcy5nZXRGdWxsSGFzaCgpO1xuXG5cdFx0Y29uc3Qgc2VnbWVudHMgPSBSb3V0ZXJQcm94eS5zcGxpdEFwcFNwZWNpZmljUm91dGUoc3BsaXRIYXNoKTtcblxuXHRcdGlmIChzZWdtZW50cy5sZW5ndGggPiAxKSB7XG5cdFx0XHQvLyB0aGVyZSBpcyBhIG5lc3RlZCByb3V0ZSBpbnZvbHZlZCAtPiBhc3N1bWUgd2UgYXJlIHN0aWxsIGluc2lkZSB0aGUgYXBwXG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Ly8gSWYgdGhlIGN1cnJlbnQgaGFzaCBpcyB0aGUgZmlyc3Qgb25lIGluIHRoZSBoaXN0b3J5LCB0aGVuIGEgbmF2YmFjayB3aWxsIGV4aXQgdGhlIGFwcFxuXHRcdGNvbnN0IGhhc2ggPSBzZWdtZW50c1swXSA/PyBcIlwiO1xuXHRcdHJldHVybiB0aGlzLl9vTWFuYWdlZEhpc3RvcnkubGVuZ3RoID4gMCAmJiB0aGlzLl9vTWFuYWdlZEhpc3RvcnlbMF0uaGFzaCA9PT0gaGFzaDtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgdGhlIGxhc3QgMiBlbnRyaWVzIGluIHRoZSBoaXN0b3J5IHNoYXJlIHRoZSBzYW1lIGNvbnRleHQuXG5cdCAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGV5IHNoYXJlIHRoZSBzYW1lIGNvbnRleHQuXG5cdCAqL1xuXHRjaGVja0lmQmFja0hhc1NhbWVDb250ZXh0KCk6IGJvb2xlYW4ge1xuXHRcdGlmICh0aGlzLl9vTWFuYWdlZEhpc3RvcnkubGVuZ3RoIDwgMikge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdGNvbnN0IG9DdXJyZW50U3RhdGUgPSB0aGlzLl9vTWFuYWdlZEhpc3RvcnlbdGhpcy5fb01hbmFnZWRIaXN0b3J5Lmxlbmd0aCAtIDFdO1xuXHRcdGNvbnN0IG9QcmV2aW91c1N0YXRlID0gdGhpcy5fb01hbmFnZWRIaXN0b3J5W3RoaXMuX29NYW5hZ2VkSGlzdG9yeS5sZW5ndGggLSAyXTtcblxuXHRcdHJldHVybiBvQ3VycmVudFN0YXRlLmhhc2guc3BsaXQoXCI/XCIpWzBdID09PSBvUHJldmlvdXNTdGF0ZS5oYXNoLnNwbGl0KFwiP1wiKVswXTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXN0b3JlcyB0aGUgZm9jdXMgZm9yIHRoZSBjdXJyZW50IGhhc2gsIGlmIHdlIGNhbiBmaW5kIGl0IGluIHRoZSBoaXN0b3J5LlxuXHQgKiBAcmV0dXJucyBUcnVlIGlmIGZvY3VzIHdhcyBzZXQsIGZhbHNlIG90aGVyd2lzZS5cblx0ICovXG5cdHJlc3RvcmVGb2N1c0ZvckN1cnJlbnRIYXNoKCk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IGN1cnJlbnRIYXNoID0gcmVtb3ZlQXBwU3RhdGVJbkhhc2godGhpcy5nZXRIYXNoKCkpO1xuXHRcdGNvbnN0IHN0YXRlRm9ySGFzaCA9IHRoaXMuX29NYW5hZ2VkSGlzdG9yeS5maW5kKChzdGF0ZSkgPT4ge1xuXHRcdFx0cmV0dXJuIHJlbW92ZUFwcFN0YXRlSW5IYXNoKHN0YXRlLmhhc2gpID09PSBjdXJyZW50SGFzaDtcblx0XHR9KTtcblxuXHRcdGxldCBmb2N1c0FwcGxpZWQgPSBmYWxzZTtcblx0XHRpZiAoc3RhdGVGb3JIYXNoPy5mb2N1c0NvbnRyb2xJZCkge1xuXHRcdFx0bGV0IGZvY3VzQ29udHJvbCA9IEVsZW1lbnQuZ2V0RWxlbWVudEJ5SWQoc3RhdGVGb3JIYXNoLmZvY3VzQ29udHJvbElkKTtcblx0XHRcdGxldCBmb2N1c0luZm8gPSBzdGF0ZUZvckhhc2guZm9jdXNJbmZvO1xuXHRcdFx0bGV0IHVzZVNlY29uZGFyeSA9IGZhbHNlO1xuXHRcdFx0aWYgKCghZm9jdXNDb250cm9sIHx8ICFmb2N1c0NvbnRyb2wuZ2V0Rm9jdXNEb21SZWYoKSkgJiYgc3RhdGVGb3JIYXNoLnNlY29uZGFyeUZvY3VzQ29udHJvbElkKSB7XG5cdFx0XHRcdC8vIFRoZSBjb250cm9sIGZvciBmb2N1cyBpcyBlaXRoZXIgbm90IGZvdW5kIG9yIGlzIG5vdCBkaXNwbGF5ZWQgb24gc2NyZWVuIChubyBmb2N1c0RvbVJlZilcblx0XHRcdFx0Ly8gLS0+IHRyeSB0aGUgc2Vjb25kYXJ5IGNvbnRyb2wgaWYgdGhlcmUncyBvbmVcblx0XHRcdFx0Zm9jdXNDb250cm9sID0gRWxlbWVudC5nZXRFbGVtZW50QnlJZChzdGF0ZUZvckhhc2guc2Vjb25kYXJ5Rm9jdXNDb250cm9sSWQpO1xuXHRcdFx0XHRmb2N1c0luZm8gPSBzdGF0ZUZvckhhc2guc2Vjb25kYXJ5Rm9jdXNJbmZvO1xuXHRcdFx0XHR1c2VTZWNvbmRhcnkgPSB0cnVlO1xuXHRcdFx0fVxuXHRcdFx0aWYgKFxuXHRcdFx0XHQvLyBpZiB0aGUgY29udHJvbCBpcyBhIGJ1c3kgdGFibGUsIHdlIGRvbid0IHdhbnQgdG8gZm9jdXMgaXRcblx0XHRcdFx0Ly8gdGFibGVzIGhhdmUgdGhlaXIgb3duIGhhbmRsaW5nIHRvIHJlc3RvcmUgZm9jdXMsIHNvIHdlIGRvbid0IHdhbnQgdG8gaW50ZXJmZXJlIHdpdGggdGhhdFxuXHRcdFx0XHQvLyB1bmxlc3MgdGhlIHRhYmxlIHdhcyBhIHNlY29uZGFyeSBjb250cm9sLCB3aGVyZSB3ZSB3YW50IHRvIGZvY3VzIG9uIGl0IGFueXdheVxuXHRcdFx0XHRmb2N1c0NvbnRyb2w/LmdldFBhcmVudCgpPy5pc0E8VGFibGU+KFwic2FwLnVpLm1kYy5UYWJsZVwiKSAmJlxuXHRcdFx0XHQoZm9jdXNDb250cm9sIGFzIE1UYWJsZSB8IFVJVGFibGUpLmdldEJ1c3koKSAmJlxuXHRcdFx0XHQhdXNlU2Vjb25kYXJ5XG5cdFx0XHQpIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdFx0Zm9jdXNDb250cm9sPy5mb2N1cyhmb2N1c0luZm8pO1xuXHRcdFx0Zm9jdXNBcHBsaWVkID0gZm9jdXNDb250cm9sICE9PSB1bmRlZmluZWQ7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZvY3VzQXBwbGllZDtcblx0fVxuXG5cdC8qKlxuXHQgKiBTdG9yZXMgdGhlIElEIG9mIHRoZSBjdXJyZW50bHkgZm9jdXNlZCBjb250cm9sIGluIHRoZSBoaXN0b3J5IGZvciB0aGUgY3VycmVudCBoYXNoLlxuXHQgKlxuXHQgKi9cblx0cHJpdmF0ZSBzdG9yZUZvY3VzSW5mb0ZvckN1cnJlbnRIYXNoKCk6IHZvaWQge1xuXHRcdGNvbnN0IGN1cnJlbnRIYXNoID0gcmVtb3ZlQXBwU3RhdGVJbkhhc2godGhpcy5nZXRIYXNoKCkpO1xuXHRcdGNvbnN0IHN0YXRlRm9ySGFzaCA9IHRoaXMuX29NYW5hZ2VkSGlzdG9yeS5maW5kKChzdGF0ZSkgPT4ge1xuXHRcdFx0cmV0dXJuIHJlbW92ZUFwcFN0YXRlSW5IYXNoKHN0YXRlLmhhc2gpID09PSBjdXJyZW50SGFzaDtcblx0XHR9KTtcblx0XHRpZiAoc3RhdGVGb3JIYXNoKSB7XG5cdFx0XHRjb25zdCBmb2N1c0NvbnRyb2wgPSBFbGVtZW50LmdldEFjdGl2ZUVsZW1lbnQoKTtcblx0XHRcdHN0YXRlRm9ySGFzaC5mb2N1c0NvbnRyb2xJZCA9IGZvY3VzQ29udHJvbD8uZ2V0SWQoKTtcblx0XHRcdGlmIChmb2N1c0NvbnRyb2wpIHtcblx0XHRcdFx0Ly8gVGhlIHNlY29uZGFyeSBmb2N1cyBjb250cm9sIGlzIHRoZSBwYXJlbnQgdGFibGUgaWYgdGhlcmUncyBvbmVcblx0XHRcdFx0bGV0IHBhcmVudFRhYmxlID0gZm9jdXNDb250cm9sLmdldFBhcmVudCgpO1xuXHRcdFx0XHR3aGlsZSAocGFyZW50VGFibGUgJiYgIXBhcmVudFRhYmxlLmlzQTxVSVRhYmxlPihcInNhcC51aS50YWJsZS5UYWJsZVwiKSAmJiAhcGFyZW50VGFibGUuaXNBPE1UYWJsZT4oXCJzYXAubS5UYWJsZVwiKSkge1xuXHRcdFx0XHRcdHBhcmVudFRhYmxlID0gcGFyZW50VGFibGUuZ2V0UGFyZW50KCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0c3RhdGVGb3JIYXNoLnNlY29uZGFyeUZvY3VzQ29udHJvbElkID0gcGFyZW50VGFibGU/LmdldElkKCk7XG5cdFx0XHRcdHN0YXRlRm9ySGFzaC5zZWNvbmRhcnlGb2N1c0luZm8gPSB7IHByZXZlbnRTY3JvbGw6IHRydWUgfTtcblx0XHRcdH1cblx0XHRcdHN0YXRlRm9ySGFzaC5mb2N1c0luZm8gPSBmb2N1c0NvbnRyb2w/LmdldEZvY3VzSW5mbygpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBGaW5kcyBhIGxheW91dCB2YWx1ZSBmb3IgYSBoYXNoIGluIHRoZSBoaXN0b3J5LlxuXHQgKiBAcGFyYW0gaGFzaCBUaGUgaGFzaCB0byBsb29rIGZvciBpbiB0aGUgaGlzdG9yeS5cblx0ICogQHJldHVybnMgQSBsYXlvdXQgdmFsdWUgaWYgaXQgY291bGQgYmUgZm91bmQsIHVuZGVmaW5lZCBvdGhlcndpc2UuXG5cdCAqL1xuXHRmaW5kTGF5b3V0Rm9ySGFzaChoYXNoOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRcdGlmICghdGhpcy5mY2xFbmFibGVkKSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdC8vIFJlbW92ZSBhbGwgcXVlcnkgcGFyYW1ldGVycyBmcm9tIHRoZSBoYXNoXG5cdFx0Y29uc3QgaGFzaE5vUGFyYW0gPSBoYXNoLnNwbGl0KFwiP1wiKVswXTtcblxuXHRcdC8vIExvb2sgZm9yIHRoZSBzdGF0ZSBiYWNrd2FyZHMsIHNvIHRoYXQgd2UgZmluZCB0aGUgbGFzdCBzdGF0ZSBpbiB0aGUgaGlzdG9yeSAoZS5nLiBpZiB3ZSBoYXZlIDIgc3RhdGVzIHdpdGggdGhlIHNhbWUgaGFzaCBidXQgMiBkaWZmZXJlbnQgbGF5b3V0cylcblx0XHRsZXQgdGFyZ2V0U3RhdGU6IFJvdXRlclN0YXRlIHwgdW5kZWZpbmVkO1xuXHRcdGZvciAobGV0IGluZGV4ID0gdGhpcy5fb01hbmFnZWRIaXN0b3J5Lmxlbmd0aCAtIDE7IGluZGV4ID49IDAgJiYgdGFyZ2V0U3RhdGUgPT09IHVuZGVmaW5lZDsgaW5kZXgtLSkge1xuXHRcdFx0aWYgKHRoaXMuX29NYW5hZ2VkSGlzdG9yeVtpbmRleF0uaGFzaC5zcGxpdChcIj9cIilbMF0gPT09IGhhc2hOb1BhcmFtKSB7XG5cdFx0XHRcdHRhcmdldFN0YXRlID0gdGhpcy5fb01hbmFnZWRIaXN0b3J5W2luZGV4XTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdGFyZ2V0U3RhdGU/LnNMYXlvdXQ7XG5cdH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgUm91dGVyUHJveHk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0VBY0EsTUFBTUEsU0FBUyxHQUFHO0lBQ2pCQyxLQUFLLEVBQUUsQ0FBQztJQUNSQyxVQUFVLEVBQUUsQ0FBQztJQUNiQyxRQUFRLEVBQUUsQ0FBQztJQUNYQyxTQUFTLEVBQUU7RUFDWixDQUFDO0VBQ0QsTUFBTUMsYUFBYSxHQUFHO0lBQ3JCQyxXQUFX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
@@ -281,7 +281,8 @@ class RouterProxy extends BaseObject {
281
281
  * @param bPreserveHistory If set to true, non-ancestor entries in history will be retained
282
282
  * @param bDisablePreservationCache If set to true, cache preservation mechanism is disabled for the current navigation
283
283
  * @param bForceFocus If set to true, the logic to set the focus once the navigation is finalized will be triggered (onPageReady)
284
- * @param bPreserveShellBackNavigationHandler If not set to false, the back navigation is set to undefined
284
+ * @param preserveShellBackNavigationHandler If set to true, the back navigation callback is preserved. If undefined or false, the back navigation callback is reset.
285
+ * @param skipHashGuardCheck
285
286
  * @returns Promise (resolved when the navigation is finalized) that returns 'true' if a navigation took place, 'false' if the navigation didn't happen
286
287
  */
287
288
  async navToHash(
@@ -289,23 +290,24 @@ class RouterProxy extends BaseObject {
289
290
  bPreserveHistory?: boolean,
290
291
  bDisablePreservationCache?: boolean,
291
292
  bForceFocus?: boolean,
292
- bPreserveShellBackNavigationHandler?: boolean
293
+ preserveShellBackNavigationHandler?: boolean,
294
+ skipHashGuardCheck?: boolean
293
295
  ): Promise<boolean> {
294
296
  sHash = sHash.startsWith("/") ? sHash.substring(1) : sHash;
295
- if (bPreserveShellBackNavigationHandler !== false) {
297
+ if (!preserveShellBackNavigationHandler) {
296
298
  await this._oShellServices.setBackNavigation();
297
299
  }
298
300
  sHash = this.removeRestoreHistoryFlagFromHash(sHash);
299
301
  if (this._oRouteMatchSynchronization) {
300
302
  return this._oRouteMatchSynchronization.waitFor().then(async () => {
301
303
  this._oRouteMatchSynchronization = undefined;
302
- return this._internalNavToHash(sHash, bPreserveHistory, bDisablePreservationCache, bForceFocus);
304
+ return this._internalNavToHash(sHash, bPreserveHistory, bDisablePreservationCache, bForceFocus, skipHashGuardCheck);
303
305
  });
304
306
  } else {
305
307
  if (this._bActivateRouteMatchSynchro) {
306
308
  this.waitForRouteMatchBeforeNavigation();
307
309
  }
308
- return this._internalNavToHash(sHash, bPreserveHistory, bDisablePreservationCache, bForceFocus);
310
+ return this._internalNavToHash(sHash, bPreserveHistory, bDisablePreservationCache, bForceFocus, skipHashGuardCheck);
309
311
  }
310
312
  }
311
313
 
@@ -313,14 +315,15 @@ class RouterProxy extends BaseObject {
313
315
  sHash: string,
314
316
  bPreserveHistory?: boolean,
315
317
  bDisablePreservationCache?: boolean,
316
- bForceFocus?: boolean
318
+ bForceFocus?: boolean,
319
+ skipHashGuardCheck?: boolean
317
320
  ): Promise<boolean> {
318
321
  // Add the app state in the hash if needed
319
322
  if (this.fclEnabled && this.sIAppStateKey && !this.findAppStateInHash(sHash)) {
320
323
  sHash = this.setAppStateInHash(sHash, this.sIAppStateKey);
321
324
  }
322
325
 
323
- if (!this.checkHashWithGuard(sHash)) {
326
+ if (!this.checkHashWithGuard(sHash) && !(skipHashGuardCheck ?? false)) {
324
327
  if (!this.oResourceBundle) {
325
328
  this.oResourceBundle = Library.getResourceBundleFor("sap.fe.core")!;
326
329
  }
@@ -424,11 +427,21 @@ class RouterProxy extends BaseObject {
424
427
  * @param oParameters Parameters for the navigation
425
428
  * @param oParameters.noPreservationCache
426
429
  * @param oParameters.bIsStickyMode
430
+ * @param oParameters.isHiddenDraftEnabled
427
431
  * @returns Promise that is resolved when the navigation is finalized
428
432
  */
429
- async navTo(sRouteName: string, oParameters?: { noPreservationCache?: boolean; bIsStickyMode?: boolean }): Promise<boolean> {
433
+ async navTo(
434
+ sRouteName: string,
435
+ oParameters?: { noPreservationCache?: boolean; bIsStickyMode?: boolean; isHiddenDraftEnabled?: boolean }
436
+ ): Promise<boolean> {
430
437
  const sHash = this._oRouter.getURL(sRouteName, oParameters);
431
- return this.navToHash(sHash!, false, oParameters?.noPreservationCache, false, !oParameters?.bIsStickyMode);
438
+ return this.navToHash(
439
+ sHash!,
440
+ false,
441
+ oParameters?.noPreservationCache,
442
+ false,
443
+ (oParameters?.bIsStickyMode ?? false) || (oParameters?.isHiddenDraftEnabled ?? false)
444
+ );
432
445
  }
433
446
 
434
447
  /**