@sapui5/sap.fe.core 1.135.0 → 1.136.0

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 (217) hide show
  1. package/package.json +1 -1
  2. package/src/sap/fe/core/.library +1 -1
  3. package/src/sap/fe/core/ActionRuntime.js +3 -2
  4. package/src/sap/fe/core/ActionRuntime.ts +3 -1
  5. package/src/sap/fe/core/AppComponent.js +6 -4
  6. package/src/sap/fe/core/AppComponent.ts +3 -1
  7. package/src/sap/fe/core/AppStateHandler.js +8 -6
  8. package/src/sap/fe/core/AppStateHandler.ts +7 -5
  9. package/src/sap/fe/core/CommonUtils.js +4 -1
  10. package/src/sap/fe/core/CommonUtils.ts +12 -2
  11. package/src/sap/fe/core/ExtensionAPI.js +5 -3
  12. package/src/sap/fe/core/ExtensionAPI.ts +4 -2
  13. package/src/sap/fe/core/PageController.js +13 -1
  14. package/src/sap/fe/core/PageController.ts +13 -0
  15. package/src/sap/fe/core/buildingBlocks/BuildingBlock.js +13 -5
  16. package/src/sap/fe/core/buildingBlocks/BuildingBlock.ts +19 -6
  17. package/src/sap/fe/core/controllerextensions/BaseControllerExtension.js +4 -2
  18. package/src/sap/fe/core/controllerextensions/BaseControllerExtension.ts +3 -1
  19. package/src/sap/fe/core/controllerextensions/EditFlow.js +58 -14
  20. package/src/sap/fe/core/controllerextensions/EditFlow.ts +71 -11
  21. package/src/sap/fe/core/controllerextensions/InlineEditFlow.js +184 -17
  22. package/src/sap/fe/core/controllerextensions/InlineEditFlow.ts +204 -12
  23. package/src/sap/fe/core/controllerextensions/InternalRouting.js +12 -3
  24. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +11 -1
  25. package/src/sap/fe/core/controllerextensions/MessageHandler.js +35 -5
  26. package/src/sap/fe/core/controllerextensions/MessageHandler.ts +41 -1
  27. package/src/sap/fe/core/controllerextensions/Routing.js +6 -6
  28. package/src/sap/fe/core/controllerextensions/Routing.ts +2 -2
  29. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js +3 -11
  30. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.ts +2 -10
  31. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +11 -1
  32. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.ts +12 -0
  33. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +21 -6
  34. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +19 -5
  35. package/src/sap/fe/core/controllerextensions/editFlow/draft.js +17 -14
  36. package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +19 -17
  37. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.js +2 -2
  38. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.ts +4 -1
  39. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataOperation.js +10 -2
  40. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataOperation.ts +8 -2
  41. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataStrictHandling.js +2 -2
  42. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataStrictHandling.ts +1 -1
  43. package/src/sap/fe/core/controllerextensions/editFlow/operations/Operation.js +1 -1
  44. package/src/sap/fe/core/controllerextensions/editFlow/operations/Operation.ts +33 -31
  45. package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.js +2 -2
  46. package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.ts +3 -3
  47. package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +4 -1
  48. package/src/sap/fe/core/controllerextensions/editFlow/sticky.ts +2 -1
  49. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.js +2 -2
  50. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.tsx +8 -1
  51. package/src/sap/fe/core/controls/HideFormGroupAutomatically.js +4 -3
  52. package/src/sap/fe/core/controls/HideFormGroupAutomatically.ts +7 -2
  53. package/src/sap/fe/core/controls/inlineEditFlow/BeforeActionDialog.js +68 -0
  54. package/src/sap/fe/core/controls/inlineEditFlow/BeforeActionDialog.tsx +52 -0
  55. package/src/sap/fe/core/controls/inlineEditFlow/BeforeNavigationDialog.js +144 -0
  56. package/src/sap/fe/core/controls/inlineEditFlow/BeforeNavigationDialog.tsx +128 -0
  57. package/src/sap/fe/core/controls/inlineEditFlow/DraftExistsDialog.js +53 -0
  58. package/src/sap/fe/core/controls/inlineEditFlow/DraftExistsDialog.tsx +39 -0
  59. package/src/sap/fe/core/converters/ManifestSettings.js +1 -1
  60. package/src/sap/fe/core/converters/ManifestSettings.ts +18 -8
  61. package/src/sap/fe/core/converters/controls/Common/Action.js +54 -5
  62. package/src/sap/fe/core/converters/controls/Common/Action.ts +59 -3
  63. package/src/sap/fe/core/converters/controls/Common/Chart.js +22 -4
  64. package/src/sap/fe/core/converters/controls/Common/Chart.ts +23 -4
  65. package/src/sap/fe/core/converters/controls/Common/Form.js +13 -4
  66. package/src/sap/fe/core/converters/controls/Common/Form.ts +13 -3
  67. package/src/sap/fe/core/converters/controls/Common/Table.js +29 -9
  68. package/src/sap/fe/core/converters/controls/Common/Table.ts +38 -8
  69. package/src/sap/fe/core/converters/controls/Common/table/Columns.js +14 -16
  70. package/src/sap/fe/core/converters/controls/Common/table/Columns.ts +61 -96
  71. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +62 -13
  72. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +75 -13
  73. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +4 -33
  74. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +4 -44
  75. package/src/sap/fe/core/converters/controls/ListReport/FilterField.js +106 -0
  76. package/src/sap/fe/core/converters/controls/ListReport/FilterField.ts +129 -0
  77. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +9 -4
  78. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +8 -3
  79. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +7 -2
  80. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +5 -1
  81. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +29 -7
  82. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +40 -16
  83. package/src/sap/fe/core/designtime/AnnotationBasedChanges.js +34 -16
  84. package/src/sap/fe/core/designtime/AnnotationBasedChanges.ts +35 -16
  85. package/src/sap/fe/core/designtime/messagebundle_ar.properties +7 -0
  86. package/src/sap/fe/core/designtime/messagebundle_bg.properties +7 -0
  87. package/src/sap/fe/core/designtime/messagebundle_ca.properties +7 -0
  88. package/src/sap/fe/core/designtime/messagebundle_cnr.properties +7 -0
  89. package/src/sap/fe/core/designtime/messagebundle_cs.properties +7 -0
  90. package/src/sap/fe/core/designtime/messagebundle_cy.properties +7 -0
  91. package/src/sap/fe/core/designtime/messagebundle_da.properties +7 -0
  92. package/src/sap/fe/core/designtime/messagebundle_de.properties +7 -0
  93. package/src/sap/fe/core/designtime/messagebundle_el.properties +7 -0
  94. package/src/sap/fe/core/designtime/messagebundle_en.properties +7 -0
  95. package/src/sap/fe/core/designtime/messagebundle_en_GB.properties +7 -0
  96. package/src/sap/fe/core/designtime/messagebundle_es.properties +7 -0
  97. package/src/sap/fe/core/designtime/messagebundle_es_MX.properties +7 -0
  98. package/src/sap/fe/core/designtime/messagebundle_et.properties +7 -0
  99. package/src/sap/fe/core/designtime/messagebundle_fi.properties +7 -0
  100. package/src/sap/fe/core/designtime/messagebundle_fr.properties +7 -0
  101. package/src/sap/fe/core/designtime/messagebundle_fr_CA.properties +7 -0
  102. package/src/sap/fe/core/designtime/messagebundle_hi.properties +7 -0
  103. package/src/sap/fe/core/designtime/messagebundle_hr.properties +7 -0
  104. package/src/sap/fe/core/designtime/messagebundle_hu.properties +7 -0
  105. package/src/sap/fe/core/designtime/messagebundle_id.properties +7 -0
  106. package/src/sap/fe/core/designtime/messagebundle_it.properties +7 -0
  107. package/src/sap/fe/core/designtime/messagebundle_iw.properties +7 -0
  108. package/src/sap/fe/core/designtime/messagebundle_ja.properties +7 -0
  109. package/src/sap/fe/core/designtime/messagebundle_kk.properties +7 -0
  110. package/src/sap/fe/core/designtime/messagebundle_ko.properties +7 -0
  111. package/src/sap/fe/core/designtime/messagebundle_lt.properties +7 -0
  112. package/src/sap/fe/core/designtime/messagebundle_lv.properties +7 -0
  113. package/src/sap/fe/core/designtime/messagebundle_mk.properties +7 -0
  114. package/src/sap/fe/core/designtime/messagebundle_ms.properties +7 -0
  115. package/src/sap/fe/core/designtime/messagebundle_nl.properties +7 -0
  116. package/src/sap/fe/core/designtime/messagebundle_no.properties +7 -0
  117. package/src/sap/fe/core/designtime/messagebundle_pl.properties +7 -0
  118. package/src/sap/fe/core/designtime/messagebundle_pt.properties +7 -0
  119. package/src/sap/fe/core/designtime/messagebundle_pt_PT.properties +7 -0
  120. package/src/sap/fe/core/designtime/messagebundle_ro.properties +7 -0
  121. package/src/sap/fe/core/designtime/messagebundle_ru.properties +7 -0
  122. package/src/sap/fe/core/designtime/messagebundle_sh.properties +7 -0
  123. package/src/sap/fe/core/designtime/messagebundle_sk.properties +7 -0
  124. package/src/sap/fe/core/designtime/messagebundle_sl.properties +7 -0
  125. package/src/sap/fe/core/designtime/messagebundle_sr.properties +7 -0
  126. package/src/sap/fe/core/designtime/messagebundle_sv.properties +7 -0
  127. package/src/sap/fe/core/designtime/messagebundle_th.properties +7 -0
  128. package/src/sap/fe/core/designtime/messagebundle_tr.properties +7 -0
  129. package/src/sap/fe/core/designtime/messagebundle_uk.properties +7 -0
  130. package/src/sap/fe/core/designtime/messagebundle_vi.properties +7 -0
  131. package/src/sap/fe/core/designtime/messagebundle_zh_CN.properties +7 -0
  132. package/src/sap/fe/core/designtime/messagebundle_zh_TW.properties +7 -0
  133. package/src/sap/fe/core/fpm/manifest.json +1 -1
  134. package/src/sap/fe/core/helpers/AppStartupHelper.js +24 -3
  135. package/src/sap/fe/core/helpers/AppStartupHelper.ts +28 -2
  136. package/src/sap/fe/core/helpers/BindingHelper.js +3 -2
  137. package/src/sap/fe/core/helpers/BindingHelper.ts +2 -1
  138. package/src/sap/fe/core/helpers/DeleteHelper.js +4 -9
  139. package/src/sap/fe/core/helpers/DeleteHelper.ts +3 -8
  140. package/src/sap/fe/core/helpers/ModelHelper.js +14 -4
  141. package/src/sap/fe/core/helpers/ModelHelper.ts +15 -4
  142. package/src/sap/fe/core/helpers/PasteHelper.js +38 -39
  143. package/src/sap/fe/core/helpers/PasteHelper.ts +49 -51
  144. package/src/sap/fe/core/helpers/WebSocket.js +10 -1
  145. package/src/sap/fe/core/helpers/WebSocket.ts +8 -0
  146. package/src/sap/fe/core/library.js +1 -1
  147. package/src/sap/fe/core/messagebundle.properties +41 -2
  148. package/src/sap/fe/core/messagebundle_ar.properties +23 -2
  149. package/src/sap/fe/core/messagebundle_bg.properties +23 -2
  150. package/src/sap/fe/core/messagebundle_ca.properties +21 -0
  151. package/src/sap/fe/core/messagebundle_cnr.properties +23 -2
  152. package/src/sap/fe/core/messagebundle_cs.properties +21 -0
  153. package/src/sap/fe/core/messagebundle_cy.properties +21 -0
  154. package/src/sap/fe/core/messagebundle_da.properties +23 -2
  155. package/src/sap/fe/core/messagebundle_de.properties +23 -2
  156. package/src/sap/fe/core/messagebundle_el.properties +21 -0
  157. package/src/sap/fe/core/messagebundle_en.properties +23 -2
  158. package/src/sap/fe/core/messagebundle_en_GB.properties +23 -2
  159. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +23 -2
  160. package/src/sap/fe/core/messagebundle_es.properties +21 -0
  161. package/src/sap/fe/core/messagebundle_es_MX.properties +21 -0
  162. package/src/sap/fe/core/messagebundle_et.properties +21 -0
  163. package/src/sap/fe/core/messagebundle_fi.properties +21 -0
  164. package/src/sap/fe/core/messagebundle_fr.properties +22 -1
  165. package/src/sap/fe/core/messagebundle_fr_CA.properties +21 -0
  166. package/src/sap/fe/core/messagebundle_hi.properties +22 -1
  167. package/src/sap/fe/core/messagebundle_hr.properties +24 -3
  168. package/src/sap/fe/core/messagebundle_hu.properties +21 -0
  169. package/src/sap/fe/core/messagebundle_id.properties +21 -0
  170. package/src/sap/fe/core/messagebundle_it.properties +23 -2
  171. package/src/sap/fe/core/messagebundle_iw.properties +21 -0
  172. package/src/sap/fe/core/messagebundle_ja.properties +21 -0
  173. package/src/sap/fe/core/messagebundle_kk.properties +21 -0
  174. package/src/sap/fe/core/messagebundle_ko.properties +21 -0
  175. package/src/sap/fe/core/messagebundle_lt.properties +21 -0
  176. package/src/sap/fe/core/messagebundle_lv.properties +23 -2
  177. package/src/sap/fe/core/messagebundle_mk.properties +21 -0
  178. package/src/sap/fe/core/messagebundle_ms.properties +22 -1
  179. package/src/sap/fe/core/messagebundle_nl.properties +21 -0
  180. package/src/sap/fe/core/messagebundle_no.properties +21 -0
  181. package/src/sap/fe/core/messagebundle_pl.properties +23 -2
  182. package/src/sap/fe/core/messagebundle_pt.properties +23 -2
  183. package/src/sap/fe/core/messagebundle_pt_PT.properties +21 -0
  184. package/src/sap/fe/core/messagebundle_ro.properties +23 -2
  185. package/src/sap/fe/core/messagebundle_ru.properties +22 -1
  186. package/src/sap/fe/core/messagebundle_sh.properties +23 -2
  187. package/src/sap/fe/core/messagebundle_sk.properties +21 -0
  188. package/src/sap/fe/core/messagebundle_sl.properties +23 -2
  189. package/src/sap/fe/core/messagebundle_sr.properties +23 -2
  190. package/src/sap/fe/core/messagebundle_sv.properties +21 -0
  191. package/src/sap/fe/core/messagebundle_th.properties +21 -0
  192. package/src/sap/fe/core/messagebundle_tr.properties +21 -0
  193. package/src/sap/fe/core/messagebundle_uk.properties +23 -2
  194. package/src/sap/fe/core/messagebundle_vi.properties +23 -2
  195. package/src/sap/fe/core/messagebundle_zh_CN.properties +23 -2
  196. package/src/sap/fe/core/messagebundle_zh_TW.properties +21 -0
  197. package/src/sap/fe/core/rootView/Fcl.controller.js +5 -5
  198. package/src/sap/fe/core/rootView/Fcl.controller.ts +10 -4
  199. package/src/sap/fe/core/rootView/NavContainer.controller.js +2 -2
  200. package/src/sap/fe/core/rootView/NavContainer.controller.ts +1 -1
  201. package/src/sap/fe/core/rootView/RootViewBaseController.js +61 -9
  202. package/src/sap/fe/core/rootView/RootViewBaseController.ts +70 -7
  203. package/src/sap/fe/core/services/CollaborationManagerServiceFactory.js +28 -12
  204. package/src/sap/fe/core/services/CollaborationManagerServiceFactory.ts +27 -13
  205. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +7 -1
  206. package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +6 -0
  207. package/src/sap/fe/core/services/RoutingServiceFactory.js +3 -2
  208. package/src/sap/fe/core/services/RoutingServiceFactory.ts +2 -1
  209. package/src/sap/fe/core/services/ShellServicesFactory.js +4 -3
  210. package/src/sap/fe/core/services/ShellServicesFactory.ts +5 -3
  211. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +27 -3
  212. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +32 -3
  213. package/src/sap/fe/core/services/view/TemplatingErrorPage.view.xml +1 -1
  214. package/src/sap/fe/core/templating/EntitySetHelper.js +198 -58
  215. package/src/sap/fe/core/templating/EntitySetHelper.ts +221 -61
  216. package/src/sap/fe/core/templating/SemanticObjectHelper.js +6 -7
  217. package/src/sap/fe/core/templating/SemanticObjectHelper.ts +9 -7
@@ -2,18 +2,20 @@
2
2
  * SAP UI development toolkit for HTML5 (SAPUI5)
3
3
  * (c) Copyright 2009-2025 SAP SE. All rights reserved
4
4
  */
5
- sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/converters/ManifestSettings", "sap/fe/core/converters/helpers/ConfigurableObject", "sap/fe/core/converters/helpers/ID", "sap/fe/core/formatters/FPMFormatter", "sap/fe/core/helpers/StableIdHelper", "sap/fe/core/templating/UIFormatters"], function (Log, BindingToolkit, ManifestSettings, ConfigurableObject, ID, fpmFormatter, StableIdHelper, UIFormatters) {
5
+ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/converters/ManifestSettings", "sap/fe/core/converters/helpers/ConfigurableObject", "sap/fe/core/converters/helpers/ID", "sap/fe/core/formatters/FPMFormatter", "sap/fe/core/helpers/BindingHelper", "sap/fe/core/helpers/ModelHelper", "sap/fe/core/helpers/StableIdHelper", "sap/fe/core/templating/UIFormatters"], function (Log, BindingToolkit, ManifestSettings, ConfigurableObject, ID, fpmFormatter, BindingHelper, ModelHelper, StableIdHelper, UIFormatters) {
6
6
  "use strict";
7
7
 
8
8
  var _exports = {};
9
9
  var getActionEnabledExpression = UIFormatters.getActionEnabledExpression;
10
10
  var replaceSpecialChars = StableIdHelper.replaceSpecialChars;
11
+ var UI = BindingHelper.UI;
11
12
  var getCustomActionID = ID.getCustomActionID;
12
13
  var Placement = ConfigurableObject.Placement;
13
14
  var ActionType = ManifestSettings.ActionType;
14
15
  var resolveBindingString = BindingToolkit.resolveBindingString;
15
16
  var pathInModel = BindingToolkit.pathInModel;
16
17
  var or = BindingToolkit.or;
18
+ var not = BindingToolkit.not;
17
19
  var isConstant = BindingToolkit.isConstant;
18
20
  var ifElse = BindingToolkit.ifElse;
19
21
  var greaterOrEqual = BindingToolkit.greaterOrEqual;
@@ -40,6 +42,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
40
42
  return ButtonType;
41
43
  }({});
42
44
  _exports.ButtonType = ButtonType;
45
+ const aiIcon = "sap-icon://ai";
46
+ _exports.aiIcon = aiIcon;
43
47
  /**
44
48
  * Method provides actions collection after calculating the visible setting for all actions of type menu depending on its visible setting and its menu items visible settings.
45
49
  * @param actions Collection of actions
@@ -85,6 +89,23 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
85
89
  return actions;
86
90
  };
87
91
 
92
+ /**
93
+ * Adds the collaboration condition to all actions with type ForAction.
94
+ * This disables the actions if the collaboration is enabled, but the user doesn't have the authorization from the back end.
95
+ * @param actions The list of definitions of the table actions.
96
+ */
97
+ _exports.getVisibilityEnablementMenuActions = getVisibilityEnablementMenuActions;
98
+ function addCollaborationCondition(actions) {
99
+ actions.forEach(action => {
100
+ if (action.visible?.valueOf() === "false") {
101
+ return;
102
+ }
103
+ if (action.type === "ForAction") {
104
+ action.visible = compileExpression(and(resolveBindingString(action.visible, "boolean"), not(equal(UI.hasCollaborationAuthorization, false))));
105
+ }
106
+ });
107
+ }
108
+
88
109
  /**
89
110
  * Maps an action by its key, based on the given annotation actions and manifest configuration. The result already represents the
90
111
  * merged action from both configuration sources.
@@ -96,7 +117,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
96
117
  * @param actionKey Action Key to look up
97
118
  * @returns Merged action and indicator whether it can be a menu item
98
119
  */
99
- _exports.getVisibilityEnablementMenuActions = getVisibilityEnablementMenuActions;
120
+ _exports.addCollaborationCondition = addCollaborationCondition;
100
121
  function mapActionByKey(manifestActions, annotationActions, actionKey) {
101
122
  const annotationAction = annotationActions.find(action => action.key === actionKey);
102
123
  const manifestAction = manifestActions[actionKey];
@@ -366,7 +387,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
366
387
  enableAutoScroll: enableAutoScroll(manifestAction),
367
388
  menu: manifestAction.menu ?? (annotationAction?.type === ActionType.Menu ? [] : undefined),
368
389
  facetName: manifestAction.inline ? facetName : undefined,
369
- defaultAction: manifestAction.defaultAction
390
+ defaultAction: manifestAction.defaultAction,
391
+ isAIOperation: manifestAction?.isAIOperation ?? undefined
370
392
  };
371
393
  overrideManifestConfigurationWithAnnotation(actions[actionKey], annotationAction);
372
394
  }
@@ -429,7 +451,11 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
429
451
  let pathFromContextLocation = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
430
452
  if (actionTarget?.annotations.Core?.OperationAvailable) {
431
453
  const dataModelObjectPath = converterContext.getDataModelObjectPath();
432
- const isEnabledExp = getActionEnabledExpression(actionTarget, converterContext.getConvertedTypes(), dataModelObjectPath, pathFromContextLocation);
454
+ let isEnabledExp = getActionEnabledExpression(actionTarget, converterContext.getConvertedTypes(), dataModelObjectPath, pathFromContextLocation);
455
+ const collaborationOnRoot = ModelHelper.isCollaborationDraftSupportedFromConverterContext(converterContext) && ModelHelper.getDraftRoot(converterContext.getEntitySet());
456
+ if (collaborationOnRoot) {
457
+ isEnabledExp = and(isEnabledExp, UI.hasCollaborationAuthorization);
458
+ }
433
459
  return compileExpression(isEnabledExp);
434
460
  }
435
461
  return "true";
@@ -533,7 +559,30 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
533
559
  }
534
560
  });
535
561
  }
562
+
563
+ /**
564
+ * Method to determine if the menu consists of all AI operation actions.
565
+ * @param annotationActions Collection of DataFieldForActions or DataFieldForIntentBasedNavigations in the menu
566
+ * @returns A boolean true if all records in the menu are AI operations, false otherwise
567
+ */
536
568
  _exports.prepareMenuActions = prepareMenuActions;
569
+ function isMenuAIOperation(annotationActions) {
570
+ return annotationActions.every(isActionAIOperation);
571
+ }
572
+
573
+ /**
574
+ * Method to determine if the given record is an AI operation.
575
+ * @param dataField The record of type DataFieldForAction or DataFieldForIntentBasedNavigation
576
+ * @returns A boolean true if the given record is an AI operation, false otherwise
577
+ */
578
+ _exports.isMenuAIOperation = isMenuAIOperation;
579
+ function isActionAIOperation(dataField) {
580
+ if (dataField.$Type === "com.sap.vocabularies.UI.v1.DataFieldForAction") {
581
+ return dataField.ActionTarget?.annotations.UI?.IsAIOperation?.valueOf() === true;
582
+ }
583
+ return false;
584
+ }
585
+ _exports.isActionAIOperation = isActionAIOperation;
537
586
  return _exports;
538
587
  }, false);
539
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJCdXR0b25UeXBlIiwiX2V4cG9ydHMiLCJnZXRWaXNpYmlsaXR5RW5hYmxlbWVudE1lbnVBY3Rpb25zIiwiYWN0aW9ucyIsIm1lbnVBY3Rpb25Ob3RWaXNpYmxlIiwibWVudUFjdGlvblZpc2libGVQYXRocyIsImF0bGVhc3RPbmVNZW51SXRlbXNWaXNpYmxlIiwibWVudUl0ZW1zVmlzaWJsZVBhdGhzIiwiZm9yRWFjaCIsIm1lbnVBY3Rpb24iLCJ2aXNpYmxlIiwidmFsdWVPZiIsInB1c2giLCJtZW51IiwibGVuZ3RoIiwibWVudUl0ZW0iLCJtZW51SXRlbVZpc2libGUiLCJ0b1N0cmluZyIsInZpc2libGVFeHByZXNzaW9ucyIsIm1hcCIsIm1lbnVJdGVtVmlzaWJsZVBhdGgiLCJyZXNvbHZlQmluZGluZ1N0cmluZyIsImNvbXBpbGVFeHByZXNzaW9uIiwiYW5kIiwib3IiLCJtYXBBY3Rpb25CeUtleSIsIm1hbmlmZXN0QWN0aW9ucyIsImFubm90YXRpb25BY3Rpb25zIiwiYWN0aW9uS2V5IiwiYW5ub3RhdGlvbkFjdGlvbiIsImZpbmQiLCJhY3Rpb24iLCJrZXkiLCJtYW5pZmVzdEFjdGlvbiIsInJlc3VsdEFjdGlvbiIsIk9iamVjdCIsImtleXMiLCJmaWx0ZXIiLCJhY3Rpb25Bbm5vdGF0aW9uIiwidHlwZSIsIkFjdGlvblR5cGUiLCJNZW51IiwiZW5hYmxlZCIsInByb3AiLCJwcm9wS2V5IiwiY2FuQmVNZW51SXRlbSIsIkRhdGFGaWVsZEZvckFjdGlvbiIsIkRhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbiIsIm1hcE1lbnVEZWZhdWx0QWN0aW9uIiwiY29tbWFuZEFjdGlvbnMiLCJkZWZhdWx0QWN0aW9uIiwiY29tbWFuZCIsIm1hcE1lbnVJdGVtcyIsIm1hcHBlZE1lbnVJdGVtcyIsIm1hdGNoaW5nQW5ub3RhdGlvbkFjdGlvbiIsIm1lbnVJdGVtS2V5IiwibWFwcGVkTWVudUFjdGlvbiIsInRyYW5zZm9ybU1lbnVBY3Rpb25zQW5kSWRlbnRpZnlDb21tYW5kcyIsImFsbEFjdGlvbnMiLCJhY3Rpb25LZXlzVG9EZWxldGUiLCJ1bmRlZmluZWQiLCJfZ2V0TWFuaWZlc3RFbmFibGVkIiwiaXNBbm5vdGF0aW9uQWN0aW9uIiwiY29udmVydGVyQ29udGV4dCIsImZvckNvbnRleHRNZW51IiwiYXJndW1lbnRzIiwicmVzdWx0IiwiZ2V0TWFuaWZlc3RBY3Rpb25Cb29sZWFuUHJvcGVydHlXaXRoRm9ybWF0dGVyIiwiaW50ZXJuYWxNb2RlbFByb3BlcnR5IiwiaWZFbHNlIiwicmVxdWlyZXNTZWxlY3Rpb24iLCJlbmFibGVPblNlbGVjdCIsImVxdWFsIiwicGF0aEluTW9kZWwiLCJncmVhdGVyT3JFcXVhbCIsIl9nZXRNYW5pZmVzdFZpc2libGUiLCJvdmVycmlkZU1hbmlmZXN0Q29uZmlndXJhdGlvbldpdGhBbm5vdGF0aW9uIiwiYW5ub3RhdGlvblBhdGgiLCJwcmVzcyIsInZpc2libGVGb3JDb250ZXh0TWVudSIsImdldEFjdGlvbnNGcm9tTWFuaWZlc3QiLCJuYXZpZ2F0aW9uU2V0dGluZ3MiLCJjb25zaWRlck5hdmlnYXRpb25TZXR0aW5ncyIsImhpZGRlbkFjdGlvbnMiLCJmYWNldE5hbWUiLCJsYXN0RG90SW5kZXgiLCJsYXN0SW5kZXhPZiIsImlkIiwic3RhcnRzV2l0aCIsImdldEN1c3RvbUFjdGlvbklEIiwiRGVmYXVsdCIsImVuYWJsZWRGb3JDb250ZXh0TWVudSIsImhhbmRsZXJNb2R1bGUiLCJzdWJzdHJpbmciLCJyZXBsYWNlIiwiaGFuZGxlck1ldGhvZCIsInRleHQiLCJub1dyYXAiLCJfX25vV3JhcCIsInJlcGxhY2VTcGVjaWFsQ2hhcnMiLCJkZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb24iLCJkZWZhdWx0VmFsdWVzRnVuY3Rpb24iLCJwb3NpdGlvbiIsImFuY2hvciIsInBsYWNlbWVudCIsIlBsYWNlbWVudCIsIkFmdGVyIiwiaXNOYXZpZ2FibGUiLCJpc0FjdGlvbk5hdmlnYWJsZSIsImVuYWJsZUF1dG9TY3JvbGwiLCJpbmxpbmUiLCJwcm9wZXJ0eVZhbHVlIiwicmVzb2x2ZWRCaW5kaW5nIiwiaXNDb25zdGFudCIsInZhbHVlIiwiY29uc3RhbnQiLCJtZXRob2RQYXRoIiwiZm9ybWF0UmVzdWx0IiwiZnBtRm9ybWF0dGVyIiwiY3VzdG9tQm9vbGVhblByb3BlcnR5Q2hlY2siLCJnZXREYXRhTW9kZWxPYmplY3RQYXRoIiwiY29udGV4dExvY2F0aW9uIiwidGFyZ2V0RW50aXR5VHlwZSIsImdldEVudGl0eVR5cGUiLCJyZW1vdmVEdXBsaWNhdGVBY3Rpb25zIiwib01lbnVJdGVtS2V5cyIsImFjdGlvbk1lbnUiLCJyZWR1Y2UiLCJpdGVtIiwiX3JlZiIsImdldEVuYWJsZWRGb3JBbm5vdGF0aW9uQWN0aW9uIiwiYWN0aW9uVGFyZ2V0IiwicGF0aEZyb21Db250ZXh0TG9jYXRpb24iLCJhbm5vdGF0aW9ucyIsIkNvcmUiLCJPcGVyYXRpb25BdmFpbGFibGUiLCJkYXRhTW9kZWxPYmplY3RQYXRoIiwiaXNFbmFibGVkRXhwIiwiZ2V0QWN0aW9uRW5hYmxlZEV4cHJlc3Npb24iLCJnZXRDb252ZXJ0ZWRUeXBlcyIsImdldFNlbWFudGljT2JqZWN0TWFwcGluZyIsIm1hcHBpbmdzIiwibWFwcGluZyIsIkxvY2FsUHJvcGVydHkiLCIkUHJvcGVydHlQYXRoIiwiU2VtYW50aWNPYmplY3RQcm9wZXJ0eSIsImJJc05hdmlnYXRpb25Db25maWd1cmVkIiwiZGV0YWlsT3JEaXNwbGF5IiwiZGV0YWlsIiwiZGlzcGxheSIsInJvdXRlIiwiYWZ0ZXJFeGVjdXRpb24iLCJuYXZpZ2F0ZVRvSW5zdGFuY2UiLCJkYXRhRmllbGRJc0NvcHlBY3Rpb24iLCJkYXRhRmllbGQiLCJVSSIsIklzQ29weUFjdGlvbiIsIiRUeXBlIiwiZ2V0Q29weUFjdGlvbiIsImNvcHlEYXRhRmllbGRzIiwiTG9nIiwiZXJyb3IiLCJnZXRBbm5vdGF0aW9uTWVudUFjdGlvbkl0ZW1zIiwibWVudUFjdGlvbkl0ZW1zIiwiZ2V0TWF0Y2hpbmdNYW5pZmVzdEFjdGlvbiIsImFubm90YXRpb25NZW51SXRlbXMiLCJtYXRjaGluZ01hbmlmZXN0QWN0aW9ucyIsInByZXBhcmVNZW51QWN0aW9ucyIsInVucHJlcGFyZWRBY3Rpb25zIiwib3ZlcnJpZGVNZW51QWN0aW9ucyIsImZvdW5kQWN0aW9uIiwibWVudUl0ZW1JbmRleCIsIm92ZXJyaWRlTWVudUFjdGlvbiIsInNwbGljZSJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiQWN0aW9uLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQWN0aW9uIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IFNlbWFudGljT2JqZWN0TWFwcGluZ1R5cGUgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL0NvbW1vblwiO1xuaW1wb3J0IHR5cGUgeyBEYXRhRmllbGRGb3JBY3Rpb25Hcm91cFR5cGVzLCBEYXRhRmllbGRGb3JBY3Rpb25UeXBlcyB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvVUlcIjtcbmltcG9ydCB7IFVJQW5ub3RhdGlvblR5cGVzIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3ZvY2FidWxhcmllcy9VSVwiO1xuaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgdHlwZSB7IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiwgQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24gfSBmcm9tIFwic2FwL2ZlL2Jhc2UvQmluZGluZ1Rvb2xraXRcIjtcbmltcG9ydCB7XG5cdGFuZCxcblx0Y29tcGlsZUV4cHJlc3Npb24sXG5cdGNvbnN0YW50LFxuXHRlcXVhbCxcblx0Zm9ybWF0UmVzdWx0LFxuXHRncmVhdGVyT3JFcXVhbCxcblx0aWZFbHNlLFxuXHRpc0NvbnN0YW50LFxuXHRvcixcblx0cGF0aEluTW9kZWwsXG5cdHJlc29sdmVCaW5kaW5nU3RyaW5nXG59IGZyb20gXCJzYXAvZmUvYmFzZS9CaW5kaW5nVG9vbGtpdFwiO1xuaW1wb3J0IHR5cGUge1xuXHRDdXN0b21EZWZpbmVkVGFibGVDb2x1bW5Gb3JPdmVycmlkZSxcblx0TWFuaWZlc3RBY3Rpb24sXG5cdE5hdmlnYXRpb25TZXR0aW5nc0NvbmZpZ3VyYXRpb25cbn0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWFuaWZlc3RTZXR0aW5nc1wiO1xuaW1wb3J0IHsgQWN0aW9uVHlwZSB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01hbmlmZXN0U2V0dGluZ3NcIjtcbmltcG9ydCB0eXBlIHsgUGFnZUNvbnRleHRQYXRoVGFyZ2V0IH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvVGVtcGxhdGVDb252ZXJ0ZXJcIjtcbmltcG9ydCB0eXBlIHsgQ29uZmlndXJhYmxlT2JqZWN0LCBDdXN0b21FbGVtZW50LCBPdmVycmlkZVR5cGUgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9oZWxwZXJzL0NvbmZpZ3VyYWJsZU9iamVjdFwiO1xuaW1wb3J0IHsgUGxhY2VtZW50IH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvaGVscGVycy9Db25maWd1cmFibGVPYmplY3RcIjtcbmltcG9ydCB7IGdldEN1c3RvbUFjdGlvbklEIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvaGVscGVycy9JRFwiO1xuaW1wb3J0IGZwbUZvcm1hdHRlciBmcm9tIFwic2FwL2ZlL2NvcmUvZm9ybWF0dGVycy9GUE1Gb3JtYXR0ZXJcIjtcbmltcG9ydCB7IHJlcGxhY2VTcGVjaWFsQ2hhcnMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9TdGFibGVJZEhlbHBlclwiO1xuaW1wb3J0IHsgZ2V0QWN0aW9uRW5hYmxlZEV4cHJlc3Npb24gfSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9VSUZvcm1hdHRlcnNcIjtcbmltcG9ydCB0eXBlIFZpZXcgZnJvbSBcInNhcC91aS9jb3JlL212Yy9WaWV3XCI7XG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvQ29udGV4dFwiO1xuaW1wb3J0IHR5cGUgeyBNZXRhTW9kZWxUeXBlIH0gZnJvbSBcInR5cGVzL21ldGFtb2RlbF90eXBlc1wiO1xuaW1wb3J0IHR5cGUgQ29udmVydGVyQ29udGV4dCBmcm9tIFwiLi4vLi4vQ29udmVydGVyQ29udGV4dFwiO1xuXG5leHBvcnQgZW51bSBCdXR0b25UeXBlIHtcblx0QWNjZXB0ID0gXCJBY2NlcHRcIixcblx0QXR0ZW50aW9uID0gXCJBdHRlbnRpb25cIixcblx0QmFjayA9IFwiQmFja1wiLFxuXHRDcml0aWNhbCA9IFwiQ3JpdGljYWxcIixcblx0RGVmYXVsdCA9IFwiRGVmYXVsdFwiLFxuXHRFbXBoYXNpemVkID0gXCJFbXBoYXNpemVkXCIsXG5cdEdob3N0ID0gXCJHaG9zdFwiLFxuXHROZWdhdGl2ZSA9IFwiTmVnYXRpdmVcIixcblx0TmV1dHJhbCA9IFwiTmV1dHJhbFwiLFxuXHRSZWplY3QgPSBcIlJlamVjdFwiLFxuXHRTdWNjZXNzID0gXCJTdWNjZXNzXCIsXG5cdFRyYW5zcGFyZW50ID0gXCJUcmFuc3BhcmVudFwiLFxuXHRVbnN0eWxlZCA9IFwiVW5zdHlsZWRcIixcblx0VXAgPSBcIlVwXCJcbn1cblxuZXhwb3J0IHR5cGUgQmFzZUFjdGlvbiA9IENvbmZpZ3VyYWJsZU9iamVjdCAmIHtcblx0aWQ/OiBzdHJpbmc7XG5cdHRleHQ/OiBzdHJpbmc7XG5cdHR5cGU/OiBBY3Rpb25UeXBlO1xuXHRwcmVzcz86IHN0cmluZztcblx0ZW5hYmxlZD86IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uO1xuXHRlbmFibGVkRm9yQ29udGV4dE1lbnU/OiBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjtcblx0dmlzaWJsZT86IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uO1xuXHR2aXNpYmxlRm9yQ29udGV4dE1lbnU/OiBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjtcblx0ZW5hYmxlT25TZWxlY3Q/OiBzdHJpbmc7XG5cdGFubm90YXRpb25QYXRoPzogc3RyaW5nO1xuXHRkZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb24/OiBzdHJpbmc7XG5cdGlzTmF2aWdhYmxlPzogYm9vbGVhbjtcblx0ZW5hYmxlQXV0b1Njcm9sbD86IGJvb2xlYW47XG5cdHBhcmVudEVudGl0eURlbGV0ZUVuYWJsZWQ/OiBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjtcblx0bWVudT86IEJhc2VBY3Rpb25bXTtcblx0ZmFjZXROYW1lPzogc3RyaW5nO1xuXHRjb21tYW5kPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xufTtcblxuZXhwb3J0IHR5cGUgQW5ub3RhdGlvbkFjdGlvbiA9IEJhc2VBY3Rpb24gJiB7XG5cdHR5cGU6IEFjdGlvblR5cGUuRGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uIHwgQWN0aW9uVHlwZS5EYXRhRmllbGRGb3JBY3Rpb24gfCBBY3Rpb25UeXBlLk1lbnUgfCBBY3Rpb25UeXBlLkNvcHk7XG5cdGFubm90YXRpb25QYXRoOiBzdHJpbmc7XG5cdGN1c3RvbURhdGE/OiBzdHJpbmc7XG5cdHJlcXVpcmVzRGlhbG9nPzogc3RyaW5nO1xuXHRiaW5kaW5nPzogc3RyaW5nO1xuXHRidXR0b25UeXBlPzogQnV0dG9uVHlwZS5HaG9zdCB8IEJ1dHRvblR5cGUuVHJhbnNwYXJlbnQgfCBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBBbm5vdGF0aW9uQWN0aW9uQWN0aW9uR3JvdXAgPSBCYXNlQWN0aW9uICYge1xuXHQvLyBpbXBsZW1lbnRzIERhdGFGaWVsZEZvckFjdGlvbkdyb3VwXG5cdHR5cGU6IEFjdGlvblR5cGUuTWVudTtcblx0bWVudTogQW5ub3RhdGlvbkFjdGlvbltdO1xufTtcblxuZXhwb3J0IHR5cGUgQ3VzdG9tQWN0aW9uID0gQ3VzdG9tRWxlbWVudDxcblx0QmFzZUFjdGlvbiAmIHtcblx0XHRoYW5kbGVyTWV0aG9kPzogc3RyaW5nO1xuXHRcdGhhbmRsZXJNb2R1bGU/OiBzdHJpbmc7XG5cdFx0bm9XcmFwPzogYm9vbGVhbjsgLy8gSW5kaWNhdGVzIHRoYXQgd2Ugd2FudCB0byBhdm9pZCB0aGUgd3JhcHBpbmcgZnJvbSB0aGUgRlBNSGVscGVyXG5cdFx0cmVxdWlyZXNTZWxlY3Rpb24/OiBib29sZWFuO1xuXHRcdGRlZmF1bHRBY3Rpb24/OiBzdHJpbmcgfCBCYXNlQWN0aW9uIHwgQ3VzdG9tQWN0aW9uOyAvLyBJbmRpY2F0ZXMgd2hldGhlciBhIGRlZmF1bHQgYWN0aW9uIGV4aXN0cyBpbiB0aGlzIGNvbnRleHRcblx0fVxuPjtcblxuZXhwb3J0IHR5cGUgQW5ub3RhdGlvbkFjdGlvbkdyb3VwID0gQmFzZUFjdGlvbiAmIHtcblx0Ly8gaW1wbGVtZW50cyBEYXRhRmllbGRGb3JBY3Rpb25Hcm91cFxuXHR0eXBlOiBBY3Rpb25UeXBlLk1lbnU7XG5cdG1lbnU6IEFubm90YXRpb25BY3Rpb25bXTtcbn07XG5cbmV4cG9ydCB0eXBlIENvbWJpbmVkQWN0aW9uID0ge1xuXHRhY3Rpb25zOiBCYXNlQWN0aW9uW107XG5cdGNvbW1hbmRBY3Rpb25zOiBSZWNvcmQ8c3RyaW5nLCBDdXN0b21BY3Rpb24+O1xufTtcblxuZXhwb3J0IHR5cGUgT3ZlcnJpZGVUeXBlQWN0aW9uID0ge1xuXHRlbmFibGVBdXRvU2Nyb2xsPzogT3ZlcnJpZGVUeXBlLm92ZXJ3cml0ZTtcblx0ZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uPzogT3ZlcnJpZGVUeXBlLm92ZXJ3cml0ZTtcblx0aXNOYXZpZ2FibGU/OiBPdmVycmlkZVR5cGUub3ZlcndyaXRlO1xuXHRlbmFibGVPblNlbGVjdD86IE92ZXJyaWRlVHlwZS5vdmVyd3JpdGU7XG5cdG1lbnU/OiBPdmVycmlkZVR5cGUub3ZlcndyaXRlO1xuXG5cdC8vIENhbiBiZSBvdmVyd3JpdHRlbiBieSBtYW5pZmVzdCBjb25maWd1cmF0aW9uIGFuZCBzaG91bGQgYmUgYWxpZ25lZCBmb3IgYWxsIGFjdGlvbnNcblx0ZW5hYmxlZDogT3ZlcnJpZGVUeXBlLm92ZXJ3cml0ZTtcblx0dmlzaWJsZTogT3ZlcnJpZGVUeXBlLm92ZXJ3cml0ZTtcblx0dmlzaWJsZUZvckNvbnRleHRNZW51PzogT3ZlcnJpZGVUeXBlLm92ZXJ3cml0ZTtcblx0Y29tbWFuZDogT3ZlcnJpZGVUeXBlLm92ZXJ3cml0ZTtcblx0cG9zaXRpb246IE92ZXJyaWRlVHlwZS5vdmVyd3JpdGU7XG59O1xuXG5leHBvcnQgdHlwZSBEYXRhRmllbGRGb3JBY3Rpb25PckFjdGlvbkdyb3VwID0gRGF0YUZpZWxkRm9yQWN0aW9uVHlwZXMgfCBEYXRhRmllbGRGb3JBY3Rpb25Hcm91cFR5cGVzO1xuXG50eXBlIE1lbnVBY3Rpb24gPVxuXHR8IEJhc2VBY3Rpb25cblx0fCB7XG5cdFx0XHR2aXNpYmxlPzogc3RyaW5nW107XG5cdFx0XHRlbmFibGVkPzogc3RyaW5nW107XG5cdFx0XHRtZW51PzogQmFzZUFjdGlvbltdO1xuXHQgIH07XG4vKipcbiAqIE1ldGhvZCBwcm92aWRlcyBhY3Rpb25zIGNvbGxlY3Rpb24gYWZ0ZXIgY2FsY3VsYXRpbmcgdGhlIHZpc2libGUgc2V0dGluZyBmb3IgYWxsIGFjdGlvbnMgb2YgdHlwZSBtZW51IGRlcGVuZGluZyBvbiBpdHMgdmlzaWJsZSBzZXR0aW5nIGFuZCBpdHMgbWVudSBpdGVtcyB2aXNpYmxlIHNldHRpbmdzLlxuICogQHBhcmFtIGFjdGlvbnMgQ29sbGVjdGlvbiBvZiBhY3Rpb25zXG4gKiBAcmV0dXJucyBDb2xsZWN0aW9uIG9mIGFjdGlvbnMgd2l0aCB2aXNpYmxlIHNldHRpbmcgc2V0IGZvciBhY3Rpb25zIG9mIHR5cGUgbWVudVxuICovXG5leHBvcnQgY29uc3QgZ2V0VmlzaWJpbGl0eUVuYWJsZW1lbnRNZW51QWN0aW9ucyA9IChhY3Rpb25zOiBDdXN0b21BY3Rpb25bXSk6IEN1c3RvbUFjdGlvbltdID0+IHtcblx0bGV0IG1lbnVBY3Rpb25Ob3RWaXNpYmxlOiBzdHJpbmcgfCBib29sZWFuLFxuXHRcdG1lbnVBY3Rpb25WaXNpYmxlUGF0aHM6IHN0cmluZ1tdLFxuXHRcdGF0bGVhc3RPbmVNZW51SXRlbXNWaXNpYmxlOiBib29sZWFuLFxuXHRcdG1lbnVJdGVtc1Zpc2libGVQYXRoczogc3RyaW5nW107XG5cdGFjdGlvbnMuZm9yRWFjaCgobWVudUFjdGlvbjogTWVudUFjdGlvbikgPT4ge1xuXHRcdG1lbnVBY3Rpb25Ob3RWaXNpYmxlID0gbWVudUFjdGlvbi52aXNpYmxlPy52YWx1ZU9mKCkgPT09IFwiZmFsc2VcIjtcblx0XHRhdGxlYXN0T25lTWVudUl0ZW1zVmlzaWJsZSA9IGZhbHNlO1xuXHRcdG1lbnVJdGVtc1Zpc2libGVQYXRocyA9IFtdO1xuXHRcdG1lbnVBY3Rpb25WaXNpYmxlUGF0aHMgPSBbXTtcblx0XHRpZiAobWVudUFjdGlvbi52aXNpYmxlICYmICEobWVudUFjdGlvbi52aXNpYmxlLnZhbHVlT2YoKSA9PT0gXCJ0cnVlXCIgfHwgbWVudUFjdGlvbi52aXNpYmxlLnZhbHVlT2YoKSA9PT0gXCJmYWxzZVwiKSkge1xuXHRcdFx0bWVudUFjdGlvblZpc2libGVQYXRocy5wdXNoKG1lbnVBY3Rpb24udmlzaWJsZSBhcyBzdHJpbmcpO1xuXHRcdH1cblx0XHRpZiAobWVudUFjdGlvbj8ubWVudT8ubGVuZ3RoKSB7XG5cdFx0XHRtZW51QWN0aW9uPy5tZW51Py5mb3JFYWNoKChtZW51SXRlbTogQmFzZUFjdGlvbik6IHZvaWQgPT4ge1xuXHRcdFx0XHRjb25zdCBtZW51SXRlbVZpc2libGUgPSBtZW51SXRlbS52aXNpYmxlO1xuXHRcdFx0XHRpZiAobWVudUl0ZW1WaXNpYmxlICYmICh0eXBlb2YgbWVudUl0ZW1WaXNpYmxlID09PSBcImJvb2xlYW5cIiB8fCBtZW51SXRlbVZpc2libGUudmFsdWVPZigpID09PSBcInRydWVcIikpIHtcblx0XHRcdFx0XHRhdGxlYXN0T25lTWVudUl0ZW1zVmlzaWJsZSA9IHRydWU7XG5cdFx0XHRcdH0gZWxzZSBpZiAobWVudUl0ZW1WaXNpYmxlICYmIG1lbnVJdGVtVmlzaWJsZS52YWx1ZU9mKCkgIT09IFwiZmFsc2VcIikge1xuXHRcdFx0XHRcdG1lbnVJdGVtc1Zpc2libGVQYXRocy5wdXNoKG1lbnVJdGVtVmlzaWJsZS52YWx1ZU9mKCkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHRcdGlmIChtZW51QWN0aW9uTm90VmlzaWJsZSkge1xuXHRcdFx0XHQvLyBpZiBtZW51IGlzIHN0YXRpY2FsbHkgdmlzaWJsZSBmYWxzZVxuXHRcdFx0XHRtZW51QWN0aW9uLnZpc2libGUgPSBmYWxzZS50b1N0cmluZygpO1xuXHRcdFx0fSBlbHNlIGlmICghYXRsZWFzdE9uZU1lbnVJdGVtc1Zpc2libGUgJiYgIW1lbnVJdGVtc1Zpc2libGVQYXRocy5sZW5ndGgpIHtcblx0XHRcdFx0Ly8gaWYgYWxsIG1lbnUgaXRlbXMgYXJlIHN0YXRpY2FsbHkgdmlzaWJsZSBmYWxzZVxuXHRcdFx0XHRtZW51QWN0aW9uLnZpc2libGUgPSBmYWxzZS50b1N0cmluZygpO1xuXHRcdFx0fSBlbHNlIGlmIChhdGxlYXN0T25lTWVudUl0ZW1zVmlzaWJsZSAmJiAhbWVudUFjdGlvblZpc2libGVQYXRocy5sZW5ndGgpIHtcblx0XHRcdFx0Ly8gaWYgYXQgbGVhc3Qgb25lIG1lbnUgaXRlbSBpcyBzdGF0aWNhbGx5IHZpc2libGUgdHJ1ZSBhbmQgbm8gdmlzaWJsZSBzZXR0aW5nIGZvciBtZW51XG5cdFx0XHRcdG1lbnVBY3Rpb24udmlzaWJsZSA9IHRydWUudG9TdHJpbmcoKTtcblx0XHRcdH0gZWxzZSBpZiAobWVudUFjdGlvblZpc2libGVQYXRocy5sZW5ndGggfHwgbWVudUl0ZW1zVmlzaWJsZVBhdGhzLmxlbmd0aCkge1xuXHRcdFx0XHQvLyBJZiB0aGUgbWVudSBpcyBzZXQgdG8gaW52aXNpYmxlLCBpdCBzaG91bGQgYmUgaW52aXNpYmxlLCBvdGhlcndpc2UgdGhlIHZpc2liaWxpdHkgc2hvdWxkIGJlIGNhbGN1bGF0ZWQgZnJvbSB0aGUgaXRlbXNcblx0XHRcdFx0Y29uc3QgdmlzaWJsZUV4cHJlc3Npb25zOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj5bXSA9IG1lbnVJdGVtc1Zpc2libGVQYXRocy5tYXAoKG1lbnVJdGVtVmlzaWJsZVBhdGgpID0+XG5cdFx0XHRcdFx0cmVzb2x2ZUJpbmRpbmdTdHJpbmcobWVudUl0ZW1WaXNpYmxlUGF0aCwgXCJib29sZWFuXCIpXG5cdFx0XHRcdCk7XG5cdFx0XHRcdG1lbnVBY3Rpb24udmlzaWJsZSA9IGNvbXBpbGVFeHByZXNzaW9uKFxuXHRcdFx0XHRcdGFuZChyZXNvbHZlQmluZGluZ1N0cmluZygobWVudUFjdGlvbi52aXNpYmxlIGFzIHN0cmluZykgfHwgdHJ1ZSwgXCJib29sZWFuXCIpLCBvciguLi52aXNpYmxlRXhwcmVzc2lvbnMpKVxuXHRcdFx0XHQpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0bWVudUFjdGlvbi52aXNpYmxlID0gKCFtZW51QWN0aW9uTm90VmlzaWJsZSkudG9TdHJpbmcoKTtcblx0XHRcdH1cblx0XHR9XG5cdH0pO1xuXHRyZXR1cm4gYWN0aW9ucztcbn07XG5cbi8qKlxuICogTWFwcyBhbiBhY3Rpb24gYnkgaXRzIGtleSwgYmFzZWQgb24gdGhlIGdpdmVuIGFubm90YXRpb24gYWN0aW9ucyBhbmQgbWFuaWZlc3QgY29uZmlndXJhdGlvbi4gVGhlIHJlc3VsdCBhbHJlYWR5IHJlcHJlc2VudHMgdGhlXG4gKiBtZXJnZWQgYWN0aW9uIGZyb20gYm90aCBjb25maWd1cmF0aW9uIHNvdXJjZXMuXG4gKlxuICogVGhpcyBmdW5jdGlvbiBhbHNvIHJldHVybnMgYW4gaW5kaWNhdGlvbiB3aGV0aGVyIHRoZSBhY3Rpb24gY2FuIGJlIGEgbWVudSBpdGVtLCBzYXlpbmcgd2hldGhlciBpdCBpcyB2aXNpYmxlIG9yIG9mIGEgc3BlY2lmaWMgdHlwZVxuICogdGhhdCBhbGxvd3MgdGhpcy5cbiAqIEBwYXJhbSBtYW5pZmVzdEFjdGlvbnMgQWN0aW9ucyBkZWZpbmVkIGluIHRoZSBtYW5pZmVzdFxuICogQHBhcmFtIGFubm90YXRpb25BY3Rpb25zIEFjdGlvbnMgZGVmaW5lZCB0aHJvdWdoIGFubm90YXRpb25zXG4gKiBAcGFyYW0gYWN0aW9uS2V5IEFjdGlvbiBLZXkgdG8gbG9vayB1cFxuICogQHJldHVybnMgTWVyZ2VkIGFjdGlvbiBhbmQgaW5kaWNhdG9yIHdoZXRoZXIgaXQgY2FuIGJlIGEgbWVudSBpdGVtXG4gKi9cbmZ1bmN0aW9uIG1hcEFjdGlvbkJ5S2V5KFxuXHRtYW5pZmVzdEFjdGlvbnM6IFJlY29yZDxzdHJpbmcsIFBhcnRpYWxseUNvbnZlcnRlZEN1c3RvbUFjdGlvbj4sXG5cdGFubm90YXRpb25BY3Rpb25zOiBCYXNlQWN0aW9uW10sXG5cdGFjdGlvbktleTogc3RyaW5nXG4pOiB7IGFjdGlvbjogQmFzZUFjdGlvbiB8IEN1c3RvbUFjdGlvbjsgY2FuQmVNZW51SXRlbTogYm9vbGVhbiB8IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIH0ge1xuXHRjb25zdCBhbm5vdGF0aW9uQWN0aW9uID0gYW5ub3RhdGlvbkFjdGlvbnMuZmluZCgoYWN0aW9uKSA9PiBhY3Rpb24ua2V5ID09PSBhY3Rpb25LZXkpO1xuXHRjb25zdCBtYW5pZmVzdEFjdGlvbiA9IG1hbmlmZXN0QWN0aW9uc1thY3Rpb25LZXldO1xuXHRsZXQgcmVzdWx0QWN0aW9uOiBQYXJ0aWFsbHlDb252ZXJ0ZWRDdXN0b21BY3Rpb24gfCBCYXNlQWN0aW9uID0geyAuLi4oYW5ub3RhdGlvbkFjdGlvbiA/PyBtYW5pZmVzdEFjdGlvbikgfTtcblxuXHQvLyBhY3Rpb25zIGluc2lkZSBtZW51cyBjYW4ndCBiZSBmb3VuZCBvbiB0b3AgbGV2ZWwsIHNvIGFzc2lnbiBhY3Rpb25zIGZyb20gbWVudSB0byBpdFxuXHRpZiAoT2JqZWN0LmtleXMocmVzdWx0QWN0aW9uKS5sZW5ndGggPT09IDApIHtcblx0XHRhbm5vdGF0aW9uQWN0aW9uc1xuXHRcdFx0LmZpbHRlcigoYWN0aW9uQW5ub3RhdGlvbjogQmFzZUFjdGlvbikgPT4ge1xuXHRcdFx0XHRyZXR1cm4gYWN0aW9uQW5ub3RhdGlvbi50eXBlID09PSBBY3Rpb25UeXBlLk1lbnU7XG5cdFx0XHR9KVxuXHRcdFx0LmZvckVhY2goKG1lbnVBY3Rpb246IEJhc2VBY3Rpb24pID0+IHtcblx0XHRcdFx0bWVudUFjdGlvbi5tZW51Py5mb3JFYWNoKChtZW51SXRlbTogQmFzZUFjdGlvbikgPT4ge1xuXHRcdFx0XHRcdGlmIChtZW51SXRlbS5rZXkgPT09IGFjdGlvbktleSkge1xuXHRcdFx0XHRcdFx0cmVzdWx0QWN0aW9uID0gbWVudUl0ZW07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXHR9XG5cblx0Ly8gQW5ub3RhdGlvbiBhY3Rpb24gYW5kIG1hbmlmZXN0IGNvbmZpZ3VyYXRpb24gYWxyZWFkeSBoYXMgdG8gYmUgbWVyZ2VkIGhlcmUgYXMgaW5zZXJ0Q3VzdG9tRWxlbWVudHMgb25seSBjb25zaWRlcnMgdG9wLWxldmVsIGFjdGlvbnNcblx0aWYgKGFubm90YXRpb25BY3Rpb24pIHtcblx0XHQvLyBJZiBlbmFibGVkIG9yIHZpc2libGUgaXMgbm90IHNldCBpbiB0aGUgbWFuaWZlc3QsIHVzZSB0aGUgYW5ub3RhdGlvbiB2YWx1ZSBhbmQgaGVuY2UgZG8gbm90IG92ZXJ3cml0ZVxuXHRcdHJlc3VsdEFjdGlvbi5lbmFibGVkID0gbWFuaWZlc3RBY3Rpb24/LmVuYWJsZWQgPz8gYW5ub3RhdGlvbkFjdGlvbi5lbmFibGVkO1xuXHRcdHJlc3VsdEFjdGlvbi52aXNpYmxlID0gbWFuaWZlc3RBY3Rpb24/LnZpc2libGUgPz8gYW5ub3RhdGlvbkFjdGlvbi52aXNpYmxlO1xuXG5cdFx0Zm9yIChjb25zdCBwcm9wIGluIG1hbmlmZXN0QWN0aW9uIHx8IHt9KSB7XG5cdFx0XHRjb25zdCBwcm9wS2V5ID0gcHJvcCBhcyBrZXlvZiBCYXNlQWN0aW9uO1xuXHRcdFx0aWYgKCFhbm5vdGF0aW9uQWN0aW9uW3Byb3BLZXldICYmIHByb3BLZXkgIT09IFwibWVudVwiKSB7XG5cdFx0XHRcdHJlc3VsdEFjdGlvbltwcm9wS2V5XSA9IG1hbmlmZXN0QWN0aW9uW3Byb3BLZXldIGFzIG5ldmVyO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdGNvbnN0IGNhbkJlTWVudUl0ZW0gPVxuXHRcdHJlc3VsdEFjdGlvbj8udmlzaWJsZSB8fFxuXHRcdHJlc3VsdEFjdGlvbj8udHlwZSA9PT0gQWN0aW9uVHlwZS5EYXRhRmllbGRGb3JBY3Rpb24gfHxcblx0XHRyZXN1bHRBY3Rpb24/LnR5cGUgPT09IEFjdGlvblR5cGUuRGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uO1xuXG5cdHJldHVybiB7XG5cdFx0YWN0aW9uOiByZXN1bHRBY3Rpb24gYXMgQmFzZUFjdGlvbiB8IEN1c3RvbUFjdGlvbixcblx0XHRjYW5CZU1lbnVJdGVtXG5cdH07XG59XG5cbi8qKlxuICogTWFwIHRoZSBkZWZhdWx0IGFjdGlvbiBrZXkgb2YgYSBtZW51IHRvIGl0cyBhY3R1YWwgYWN0aW9uIGNvbmZpZ3VyYXRpb24gYW5kIGlkZW50aWZ5IHdoZXRoZXIgdGhpcyBkZWZhdWx0IGFjdGlvbiBpcyBhIGNvbW1hbmQuXG4gKiBAcGFyYW0gbWVudUFjdGlvbiBNZW51IGFjdGlvbiB0byBtYXAgdGhlIGRlZmF1bHQgYWN0aW9uIGZvclxuICogQHBhcmFtIG1hbmlmZXN0QWN0aW9ucyBBY3Rpb25zIGRlZmluZWQgaW4gdGhlIG1hbmlmZXN0XG4gKiBAcGFyYW0gYW5ub3RhdGlvbkFjdGlvbnMgQWN0aW9ucyBkZWZpbmVkIHRocm91Z2ggYW5ub3RhdGlvbnNcbiAqIEBwYXJhbSBjb21tYW5kQWN0aW9ucyBBcnJheSBvZiBjb21tYW5kIGFjdGlvbnMgdG8gcHVzaCB0aGUgZGVmYXVsdCBhY3Rpb24gdG8gaWYgYXBwbGljYWJsZVxuICovXG5mdW5jdGlvbiBtYXBNZW51RGVmYXVsdEFjdGlvbihcblx0bWVudUFjdGlvbjogUGFydGlhbGx5Q29udmVydGVkQ3VzdG9tQWN0aW9uLFxuXHRtYW5pZmVzdEFjdGlvbnM6IFJlY29yZDxzdHJpbmcsIFBhcnRpYWxseUNvbnZlcnRlZEN1c3RvbUFjdGlvbj4sXG5cdGFubm90YXRpb25BY3Rpb25zOiBCYXNlQWN0aW9uW10sXG5cdGNvbW1hbmRBY3Rpb25zOiBSZWNvcmQ8c3RyaW5nLCBDdXN0b21BY3Rpb24gfCBCYXNlQWN0aW9uPlxuKTogdm9pZCB7XG5cdGNvbnN0IHsgYWN0aW9uLCBjYW5CZU1lbnVJdGVtIH0gPSBtYXBBY3Rpb25CeUtleShtYW5pZmVzdEFjdGlvbnMsIGFubm90YXRpb25BY3Rpb25zLCBtZW51QWN0aW9uLmRlZmF1bHRBY3Rpb24gYXMgc3RyaW5nKTtcblxuXHRpZiAoY2FuQmVNZW51SXRlbSkge1xuXHRcdG1lbnVBY3Rpb24uZGVmYXVsdEFjdGlvbiA9IGFjdGlvbjtcblx0fVxuXG5cdGlmIChhY3Rpb24uY29tbWFuZCkge1xuXHRcdGNvbW1hbmRBY3Rpb25zW2FjdGlvbi5rZXldID0gYWN0aW9uO1xuXHR9XG59XG5cbi8qKlxuICogTWFwIHRoZSBtZW51IGl0ZW0ga2V5cyBvZiBhIG1lbnUgdG8gdGhlaXIgYWN0dWFsIGFjdGlvbiBjb25maWd1cmF0aW9ucyBhbmQgaWRlbnRpZnkgd2hldGhlciB0aGV5IGFyZSBjb21tYW5kcy5cbiAqIEBwYXJhbSBtZW51QWN0aW9uIE1lbnUgYWN0aW9uIHRvIG1hcCB0aGUgbWVudSBpdGVtcyBmb3JcbiAqIEBwYXJhbSBtYW5pZmVzdEFjdGlvbnMgQWN0aW9ucyBkZWZpbmVkIGluIHRoZSBtYW5pZmVzdFxuICogQHBhcmFtIGFubm90YXRpb25BY3Rpb25zIEFjdGlvbnMgZGVmaW5lZCB0aHJvdWdoIGFubm90YXRpb25zXG4gKiBAcGFyYW0gY29tbWFuZEFjdGlvbnMgQXJyYXkgb2YgY29tbWFuZCBhY3Rpb25zIHRvIHB1c2ggdGhlIG1lbnUgaXRlbSBhY3Rpb25zIHRvIGlmIGFwcGxpY2FibGVcbiAqL1xuZnVuY3Rpb24gbWFwTWVudUl0ZW1zKFxuXHRtZW51QWN0aW9uOiBQYXJ0aWFsbHlDb252ZXJ0ZWRDdXN0b21BY3Rpb24sXG5cdG1hbmlmZXN0QWN0aW9uczogUmVjb3JkPHN0cmluZywgUGFydGlhbGx5Q29udmVydGVkQ3VzdG9tQWN0aW9uPixcblx0YW5ub3RhdGlvbkFjdGlvbnM6IEJhc2VBY3Rpb25bXSxcblx0Y29tbWFuZEFjdGlvbnM6IFJlY29yZDxzdHJpbmcsIEJhc2VBY3Rpb24gfCBDdXN0b21BY3Rpb24+XG4pOiB2b2lkIHtcblx0Y29uc3QgbWFwcGVkTWVudUl0ZW1zOiAoQ3VzdG9tQWN0aW9uIHwgQmFzZUFjdGlvbilbXSA9IFtdO1xuXHRjb25zdCBtYXRjaGluZ0Fubm90YXRpb25BY3Rpb24gPSBhbm5vdGF0aW9uQWN0aW9ucy5maW5kKChhbm5vdGF0aW9uQWN0aW9uKSA9PiBhbm5vdGF0aW9uQWN0aW9uLmtleSA9PT0gbWVudUFjdGlvbi5rZXkpO1xuXG5cdGlmIChtZW51QWN0aW9uLm1lbnU/Lmxlbmd0aCAhPT0gMCkge1xuXHRcdGZvciAoY29uc3QgbWVudUl0ZW1LZXkgb2YgbWVudUFjdGlvbi5tZW51ID8/IFtdKSB7XG5cdFx0XHRjb25zdCB7IGFjdGlvbiwgY2FuQmVNZW51SXRlbSB9ID0gbWFwQWN0aW9uQnlLZXkobWFuaWZlc3RBY3Rpb25zLCBhbm5vdGF0aW9uQWN0aW9ucywgbWVudUl0ZW1LZXkpO1xuXG5cdFx0XHRpZiAoY2FuQmVNZW51SXRlbSkge1xuXHRcdFx0XHRtYXBwZWRNZW51SXRlbXMucHVzaChhY3Rpb24pO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoYWN0aW9uLmNvbW1hbmQpIHtcblx0XHRcdFx0Y29tbWFuZEFjdGlvbnNbbWVudUl0ZW1LZXldID0gYWN0aW9uO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIElmIG5vIG1lbnUgaXRlbXMgYXJlIGFzc2lnbmVkIHRvIHRoZSBtYW5pZmVzdC1vdmVycmlkZS1tZW51LCBpdCBpbmhlcml0cyB0aGUgaXRlbXMgZnJvbSB0aGUgcHJldmlvdXMgbWVudVxuXHRlbHNlIGlmIChtYXRjaGluZ0Fubm90YXRpb25BY3Rpb24pIHtcblx0XHRtYXRjaGluZ0Fubm90YXRpb25BY3Rpb24ubWVudT8uZm9yRWFjaCgobWVudUl0ZW0pID0+IG1hcHBlZE1lbnVJdGVtcy5wdXNoKG1lbnVJdGVtKSk7XG5cdH1cblxuXHRjb25zdCBtYXBwZWRNZW51QWN0aW9uID0gbWVudUFjdGlvbiBhcyBDdXN0b21BY3Rpb247XG5cdG1hcHBlZE1lbnVBY3Rpb24ubWVudSA9IG1hcHBlZE1lbnVJdGVtcztcblxuXHQvLyBJZiB0aGUgbWVudSBpcyBzZXQgdG8gaW52aXNpYmxlLCBpdCBzaG91bGQgYmUgaW52aXNpYmxlLCBvdGhlcndpc2UgdGhlIHZpc2liaWxpdHkgc2hvdWxkIGJlIGNhbGN1bGF0ZWQgZnJvbSB0aGUgaXRlbXNcblx0Y29uc3QgdmlzaWJsZUV4cHJlc3Npb25zOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj5bXSA9IG1hcHBlZE1lbnVJdGVtcy5tYXAoKG1lbnVJdGVtKSA9PlxuXHRcdHJlc29sdmVCaW5kaW5nU3RyaW5nKG1lbnVJdGVtLnZpc2libGUgYXMgc3RyaW5nLCBcImJvb2xlYW5cIilcblx0KTtcblx0bWFwcGVkTWVudUFjdGlvbi52aXNpYmxlID0gY29tcGlsZUV4cHJlc3Npb24oXG5cdFx0YW5kKHJlc29sdmVCaW5kaW5nU3RyaW5nKG1lbnVBY3Rpb24udmlzaWJsZSBhcyBzdHJpbmcsIFwiYm9vbGVhblwiKSwgb3IoLi4udmlzaWJsZUV4cHJlc3Npb25zKSlcblx0KTtcbn1cblxuLyoqXG4gKiBUcmFuc2Zvcm1zIHRoZSBmbGF0IGNvbGxlY3Rpb24gb2YgYWN0aW9ucyBpbnRvIGEgbmVzdGVkIHN0cnVjdHVyZXMgb2YgbWVudXMuIFRoZSByZXN1bHQgaXMgYSByZWNvcmQgb2YgYWN0aW9ucyB0aGF0IGFyZSBlaXRoZXIgbWVudXMgb3JcbiAqIG9uZXMgdGhhdCBkbyBub3QgYXBwZWFyIGluIG1lbnVzIGFzIG1lbnUgaXRlbXMuIEl0IGFsc28gcmV0dXJucyBhIGxpc3Qgb2YgYWN0aW9ucyB0aGF0IGhhdmUgYW4gYXNzaWduZWQgY29tbWFuZC5cbiAqXG4gKiBOb3RlIHRoYXQgbWVudSBpdGVtcyBhcmUgYWxyZWFkeSB0aGUgbWVyZ2VkIHJlc3VsdCBvZiBhbm5vdGF0aW9uIGFjdGlvbnMgYW5kIHRoZWlyIG1hbmlmZXN0IGNvbmZpZ3VyYXRpb24sIGFzIHtAbGluayBpbnNlcnRDdXN0b21FbGVtZW50c31cbiAqIG9ubHkgY29uc2lkZXJzIHJvb3QtbGV2ZWwgYWN0aW9ucy5cbiAqIEBwYXJhbSBtYW5pZmVzdEFjdGlvbnMgQWN0aW9ucyBkZWZpbmVkIGluIHRoZSBtYW5pZmVzdFxuICogQHBhcmFtIGFubm90YXRpb25BY3Rpb25zIEFjdGlvbnMgZGVmaW5lZCB0aHJvdWdoIGFubm90YXRpb25zXG4gKiBAcmV0dXJucyBUaGUgdHJhbnNmb3JtZWQgYWN0aW9ucyBmcm9tIHRoZSBtYW5pZmVzdCBhbmQgYSBsaXN0IG9mIGNvbW1hbmQgYWN0aW9uc1xuICovXG5mdW5jdGlvbiB0cmFuc2Zvcm1NZW51QWN0aW9uc0FuZElkZW50aWZ5Q29tbWFuZHMoXG5cdG1hbmlmZXN0QWN0aW9uczogUmVjb3JkPHN0cmluZywgUGFydGlhbGx5Q29udmVydGVkQ3VzdG9tQWN0aW9uPixcblx0YW5ub3RhdGlvbkFjdGlvbnM6IEJhc2VBY3Rpb25bXVxuKTogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgQ3VzdG9tQWN0aW9uPj4ge1xuXHRjb25zdCBhbGxBY3Rpb25zOiBSZWNvcmQ8c3RyaW5nLCBDdXN0b21BY3Rpb24+ID0ge307XG5cdGNvbnN0IGFjdGlvbktleXNUb0RlbGV0ZTogc3RyaW5nW10gPSBbXTtcblx0Y29uc3QgY29tbWFuZEFjdGlvbnM6IFJlY29yZDxzdHJpbmcsIEN1c3RvbUFjdGlvbj4gPSB7fTtcblxuXHRmb3IgKGNvbnN0IGFjdGlvbktleSBpbiBtYW5pZmVzdEFjdGlvbnMpIHtcblx0XHRjb25zdCBtYW5pZmVzdEFjdGlvbjogUGFydGlhbGx5Q29udmVydGVkQ3VzdG9tQWN0aW9uID0gbWFuaWZlc3RBY3Rpb25zW2FjdGlvbktleV07XG5cblx0XHRpZiAobWFuaWZlc3RBY3Rpb24uZGVmYXVsdEFjdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRtYXBNZW51RGVmYXVsdEFjdGlvbihtYW5pZmVzdEFjdGlvbiwgbWFuaWZlc3RBY3Rpb25zLCBhbm5vdGF0aW9uQWN0aW9ucywgY29tbWFuZEFjdGlvbnMpO1xuXHRcdH1cblxuXHRcdGlmIChtYW5pZmVzdEFjdGlvbi50eXBlID09PSBBY3Rpb25UeXBlLk1lbnUpIHtcblx0XHRcdG1hcE1lbnVJdGVtcyhtYW5pZmVzdEFjdGlvbiwgbWFuaWZlc3RBY3Rpb25zLCBhbm5vdGF0aW9uQWN0aW9ucywgY29tbWFuZEFjdGlvbnMpO1xuXG5cdFx0XHQvLyBNZW51IGhhcyBubyB2aXNpYmxlIGl0ZW1zLCBzbyByZW1vdmUgaXRcblx0XHRcdGlmICghbWFuaWZlc3RBY3Rpb24ubWVudT8ubGVuZ3RoKSB7XG5cdFx0XHRcdGFjdGlvbktleXNUb0RlbGV0ZS5wdXNoKG1hbmlmZXN0QWN0aW9uLmtleSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKG1hbmlmZXN0QWN0aW9uLmNvbW1hbmQpIHtcblx0XHRcdGNvbW1hbmRBY3Rpb25zW2FjdGlvbktleV0gPSBtYW5pZmVzdEFjdGlvbiBhcyBDdXN0b21BY3Rpb247XG5cdFx0fVxuXG5cdFx0YWxsQWN0aW9uc1thY3Rpb25LZXldID0gbWFuaWZlc3RBY3Rpb24gYXMgQ3VzdG9tQWN0aW9uO1xuXHR9XG5cblx0YWN0aW9uS2V5c1RvRGVsZXRlLmZvckVhY2goKGFjdGlvbktleTogc3RyaW5nKSA9PiBkZWxldGUgYWxsQWN0aW9uc1thY3Rpb25LZXldKTtcblxuXHRyZXR1cm4ge1xuXHRcdGFjdGlvbnM6IGFsbEFjdGlvbnMsXG5cdFx0Y29tbWFuZEFjdGlvbnM6IGNvbW1hbmRBY3Rpb25zXG5cdH07XG59XG5cbi8qKlxuICogR2V0cyB0aGUgYmluZGluZyBleHByZXNzaW9uIGZvciB0aGUgZW5hYmxlbWVudCBvZiBhIG1hbmlmZXN0IGFjdGlvbi5cbiAqIEBwYXJhbSBtYW5pZmVzdEFjdGlvbiBUaGUgYWN0aW9uIGNvbmZpZ3VyZWQgaW4gdGhlIG1hbmlmZXN0XG4gKiBAcGFyYW0gaXNBbm5vdGF0aW9uQWN0aW9uIFdoZXRoZXIgdGhlIGFjdGlvbiwgZGVmaW5lZCBpbiBtYW5pZmVzdCwgY29ycmVzcG9uZHMgdG8gYW4gZXhpc3RpbmcgYW5ub3RhdGlvbiBhY3Rpb24uXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dFxuICogQHBhcmFtIGZvckNvbnRleHRNZW51XG4gKiBAcmV0dXJucyBEZXRlcm1pbmVkIHByb3BlcnR5IHZhbHVlIGZvciB0aGUgZW5hYmxlbWVudFxuICovXG5jb25zdCBfZ2V0TWFuaWZlc3RFbmFibGVkID0gZnVuY3Rpb24gKFxuXHRtYW5pZmVzdEFjdGlvbjogTWFuaWZlc3RBY3Rpb24sXG5cdGlzQW5ub3RhdGlvbkFjdGlvbjogYm9vbGVhbixcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+LFxuXHRmb3JDb250ZXh0TWVudSA9IGZhbHNlXG4pOiBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiB8IHVuZGVmaW5lZCB7XG5cdGlmIChpc0Fubm90YXRpb25BY3Rpb24gJiYgbWFuaWZlc3RBY3Rpb24uZW5hYmxlZCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0Ly8gSWYgYW5ub3RhdGlvbiBhY3Rpb24gaGFzIG5vIHByb3BlcnR5IGRlZmluZWQgaW4gbWFuaWZlc3QsXG5cdFx0Ly8gZG8gbm90IG92ZXJ3cml0ZSBpdCB3aXRoIG1hbmlmZXN0IGFjdGlvbidzIGRlZmF1bHQgdmFsdWUuXG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxuXG5cdGNvbnN0IHJlc3VsdCA9IGdldE1hbmlmZXN0QWN0aW9uQm9vbGVhblByb3BlcnR5V2l0aEZvcm1hdHRlcihtYW5pZmVzdEFjdGlvbi5lbmFibGVkLCBjb252ZXJ0ZXJDb250ZXh0KTtcblxuXHQvLyBDb25zaWRlciByZXF1aXJlc1NlbGVjdGlvbiBwcm9wZXJ0eSB0byBpbmNsdWRlIHNlbGVjdGVkQ29udGV4dHMgaW4gdGhlIGJpbmRpbmcgZXhwcmVzc2lvblxuXHRjb25zdCBpbnRlcm5hbE1vZGVsUHJvcGVydHkgPSAhZm9yQ29udGV4dE1lbnUgPyBcIm51bWJlck9mU2VsZWN0ZWRDb250ZXh0c1wiIDogXCJjb250ZXh0bWVudS9udW1iZXJPZlNlbGVjdGVkQ29udGV4dHNcIjtcblx0cmV0dXJuIGNvbXBpbGVFeHByZXNzaW9uKFxuXHRcdGlmRWxzZShcblx0XHRcdG1hbmlmZXN0QWN0aW9uLnJlcXVpcmVzU2VsZWN0aW9uID09PSB0cnVlLFxuXHRcdFx0aWZFbHNlKFxuXHRcdFx0XHRtYW5pZmVzdEFjdGlvbi5lbmFibGVPblNlbGVjdCA9PT0gXCJzaW5nbGVcIixcblx0XHRcdFx0YW5kKGVxdWFsKHBhdGhJbk1vZGVsKGludGVybmFsTW9kZWxQcm9wZXJ0eSwgXCJpbnRlcm5hbFwiKSwgMSksIHJlc3VsdCksXG5cdFx0XHRcdGFuZChncmVhdGVyT3JFcXVhbChwYXRoSW5Nb2RlbChpbnRlcm5hbE1vZGVsUHJvcGVydHksIFwiaW50ZXJuYWxcIiksIDEpLCByZXN1bHQpXG5cdFx0XHQpLFxuXHRcdFx0cmVzdWx0XG5cdFx0KVxuXHQpO1xufTtcblxuLyoqXG4gKiBHZXRzIHRoZSBiaW5kaW5nIGV4cHJlc3Npb24gZm9yIHRoZSB2aXNpYmlsaXR5IG9mIGEgbWFuaWZlc3QgYWN0aW9uLlxuICogQHBhcmFtIG1hbmlmZXN0QWN0aW9uIFRoZSBhY3Rpb24gY29uZmlndXJlZCBpbiB0aGUgbWFuaWZlc3RcbiAqIEBwYXJhbSBpc0Fubm90YXRpb25BY3Rpb24gV2hldGhlciB0aGUgYWN0aW9uLCBkZWZpbmVkIGluIHRoZSBtYW5pZmVzdCwgY29ycmVzcG9uZHMgdG8gYW4gZXhpc3RpbmcgYW5ub3RhdGlvbiBhY3Rpb24uXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dFxuICogQHBhcmFtIGZvckNvbnRleHRNZW51XG4gKiBAcmV0dXJucyBEZXRlcm1pbmVkIHByb3BlcnR5IHZhbHVlIGZvciB0aGUgdmlzaWJpbGl0eVxuICovXG5jb25zdCBfZ2V0TWFuaWZlc3RWaXNpYmxlID0gZnVuY3Rpb24gKFxuXHRtYW5pZmVzdEFjdGlvbjogTWFuaWZlc3RBY3Rpb24sXG5cdGlzQW5ub3RhdGlvbkFjdGlvbjogYm9vbGVhbixcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+LFxuXHRmb3JDb250ZXh0TWVudSA9IGZhbHNlXG4pOiBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiB8IHVuZGVmaW5lZCB7XG5cdGlmIChpc0Fubm90YXRpb25BY3Rpb24gJiYgbWFuaWZlc3RBY3Rpb24udmlzaWJsZSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0Ly8gSWYgYW5ub3RhdGlvbiBhY3Rpb24gaGFzIG5vIHByb3BlcnR5IGRlZmluZWQgaW4gbWFuaWZlc3QsXG5cdFx0Ly8gZG8gbm90IG92ZXJ3cml0ZSBpdCB3aXRoIG1hbmlmZXN0IGFjdGlvbidzIGRlZmF1bHQgdmFsdWUuXG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxuXG5cdGxldCByZXN1bHQgPSBnZXRNYW5pZmVzdEFjdGlvbkJvb2xlYW5Qcm9wZXJ0eVdpdGhGb3JtYXR0ZXIobWFuaWZlc3RBY3Rpb24udmlzaWJsZSwgY29udmVydGVyQ29udGV4dCk7XG5cdC8vIEZvciB0aGUgY29udGV4dCBtZW51LCB0aGUgdmlzaWJpbGl0eSBzaG91bGQgYWxzbyBjb25zaWRlciB0aGUgJ2luYWN0aXZlQ29udGV4dCcgcHJvcGVydHk6XG5cdC8vIG9ubHkgd2hlbiBhdCBsZWFzdCBvbmUgc2VsZWN0ZWQgY29udGV4dCBpcyBhY3RpdmUgKGkuZS4gXCJjb250ZXh0bWVudS9pbmFjdGl2ZUNvbnRleHRcIiBpcyBmYWxzZSksIHRoZSBhY3Rpb24gc2hvdWxkIGJlIHZpc2libGUgaW4gdGhlIGNvbnRleHQgbWVudVxuXHQvLyBUaGlzIGlzIG9ubHkgcmVsZXZhbnQgd2hlbiB0aGUgdGFibGUgbWFuaWZlc3Qgc2V0dGluZyBcImNyZWF0aW9uTW9kZVwiIGlzIFwiSW5saW5lQ3JlYXRpb25Sb3dzXCJcblx0cmVzdWx0ID0gZm9yQ29udGV4dE1lbnUgPyBhbmQocmVzdWx0LCBlcXVhbChwYXRoSW5Nb2RlbChcImNvbnRleHRtZW51L2luYWN0aXZlQ29udGV4dFwiLCBcImludGVybmFsXCIpLCBmYWxzZSkpIDogcmVzdWx0O1xuXHRyZXR1cm4gY29tcGlsZUV4cHJlc3Npb24ocmVzdWx0KTtcbn07XG5cbnR5cGUgUGFydGlhbGx5Q29udmVydGVkQ3VzdG9tQWN0aW9uID0gT21pdDxDdXN0b21BY3Rpb24sIFwibWVudVwiPiAmIHsgbWVudTogc3RyaW5nW10gfCB1bmRlZmluZWQgfTtcblxuLyoqXG4gKiBBcyBzb21lIHByb3BlcnRpZXMgc2hvdWxkIG5vdCBiZSBvdmVycmlkYWJsZSBieSB0aGUgbWFuaWZlc3QsIG1ha2Ugc3VyZSB0aGF0IHRoZSBtYW5pZmVzdCBjb25maWd1cmF0aW9uIGdldHMgdGhlIGFubm90YXRpb24gdmFsdWVzIGZvciB0aGVzZS5cbiAqIEBwYXJhbSBtYW5pZmVzdEFjdGlvbiBBY3Rpb24gZGVmaW5lZCBpbiB0aGUgbWFuaWZlc3RcbiAqIEBwYXJhbSBhbm5vdGF0aW9uQWN0aW9uIEFjdGlvbiBkZWZpbmVkIHRocm91Z2ggYW5ub3RhdGlvbnNcbiAqL1xuZnVuY3Rpb24gb3ZlcnJpZGVNYW5pZmVzdENvbmZpZ3VyYXRpb25XaXRoQW5ub3RhdGlvbihtYW5pZmVzdEFjdGlvbjogUGFydGlhbGx5Q29udmVydGVkQ3VzdG9tQWN0aW9uLCBhbm5vdGF0aW9uQWN0aW9uPzogQmFzZUFjdGlvbik6IHZvaWQge1xuXHRpZiAoIWFubm90YXRpb25BY3Rpb24pIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHQvLyBEbyBub3Qgb3ZlcnJpZGUgdGhlICd0eXBlJyBnaXZlbiBpbiBhbiBhbm5vdGF0aW9uIGFjdGlvblxuXHRtYW5pZmVzdEFjdGlvbi50eXBlID0gYW5ub3RhdGlvbkFjdGlvbi50eXBlO1xuXHRtYW5pZmVzdEFjdGlvbi5hbm5vdGF0aW9uUGF0aCA9IGFubm90YXRpb25BY3Rpb24uYW5ub3RhdGlvblBhdGg7XG5cdG1hbmlmZXN0QWN0aW9uLnByZXNzID0gYW5ub3RhdGlvbkFjdGlvbi5wcmVzcztcblxuXHQvLyBPbmx5IHVzZSB0aGUgYW5ub3RhdGlvbiB2YWx1ZXMgZm9yIGVuYWJsZW1lbnQgYW5kIHZpc2liaWxpdHkgaWYgbm90IHNldCBpbiB0aGUgbWFuaWZlc3Rcblx0bWFuaWZlc3RBY3Rpb24uZW5hYmxlZCA9IG1hbmlmZXN0QWN0aW9uLmVuYWJsZWQgPz8gYW5ub3RhdGlvbkFjdGlvbi5lbmFibGVkO1xuXHRtYW5pZmVzdEFjdGlvbi52aXNpYmxlID0gbWFuaWZlc3RBY3Rpb24udmlzaWJsZSA/PyBhbm5vdGF0aW9uQWN0aW9uLnZpc2libGU7XG5cdG1hbmlmZXN0QWN0aW9uLnZpc2libGVGb3JDb250ZXh0TWVudSA9IG1hbmlmZXN0QWN0aW9uLnZpc2libGVGb3JDb250ZXh0TWVudSA/PyBhbm5vdGF0aW9uQWN0aW9uLnZpc2libGVGb3JDb250ZXh0TWVudTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIHRoZSBhY3Rpb24gY29uZmlndXJhdGlvbiBiYXNlZCBvbiB0aGUgbWFuaWZlc3Qgc2V0dGluZ3MuXG4gKiBAcGFyYW0gbWFuaWZlc3RBY3Rpb25zIFRoZSBtYW5pZmVzdCBhY3Rpb25zXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCBUaGUgY29udmVydGVyIGNvbnRleHRcbiAqIEBwYXJhbSBhbm5vdGF0aW9uQWN0aW9ucyBUaGUgYW5ub3RhdGlvbiBhY3Rpb25zIGRlZmluaXRpb25cbiAqIEBwYXJhbSBuYXZpZ2F0aW9uU2V0dGluZ3MgVGhlIG5hdmlnYXRpb24gc2V0dGluZ3NcbiAqIEBwYXJhbSBjb25zaWRlck5hdmlnYXRpb25TZXR0aW5ncyBUaGUgbmF2aWdhdGlvbiBzZXR0aW5ncyB0byBiZSBjb25zaWRlcmVkXG4gKiBAcGFyYW0gaGlkZGVuQWN0aW9ucyBBY3Rpb25zIHRoYXQgYXJlIGNvbmZpZ3VyZWQgYXMgaGlkZGVuIChhZGRpdGlvbmFsIHRvIHRoZSB2aXNpYmxlIHByb3BlcnR5KVxuICogQHBhcmFtIGZhY2V0TmFtZSBUaGUgZmFjZXQgd2hlcmUgYW4gYWN0aW9uIGlzIGRpc3BsYXllZCBpZiBpdCBpcyBpbmxpbmVcbiAqIEByZXR1cm5zIFRoZSBhY3Rpb25zIGZyb20gdGhlIG1hbmlmZXN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRBY3Rpb25zRnJvbU1hbmlmZXN0KFxuXHRtYW5pZmVzdEFjdGlvbnM6IFJlY29yZDxzdHJpbmcsIE1hbmlmZXN0QWN0aW9uPiB8IHVuZGVmaW5lZCxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+LFxuXHRhbm5vdGF0aW9uQWN0aW9ucz86IEJhc2VBY3Rpb25bXSxcblx0bmF2aWdhdGlvblNldHRpbmdzPzogTmF2aWdhdGlvblNldHRpbmdzQ29uZmlndXJhdGlvbixcblx0Y29uc2lkZXJOYXZpZ2F0aW9uU2V0dGluZ3M/OiBib29sZWFuLFxuXHRoaWRkZW5BY3Rpb25zPzogQmFzZUFjdGlvbltdLFxuXHRmYWNldE5hbWU/OiBzdHJpbmdcbik6IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIEN1c3RvbUFjdGlvbj4+IHtcblx0Y29uc3QgYWN0aW9uczogUmVjb3JkPHN0cmluZywgUGFydGlhbGx5Q29udmVydGVkQ3VzdG9tQWN0aW9uPiA9IHt9O1xuXHRmb3IgKGNvbnN0IGFjdGlvbktleSBpbiBtYW5pZmVzdEFjdGlvbnMpIHtcblx0XHRjb25zdCBtYW5pZmVzdEFjdGlvbjogTWFuaWZlc3RBY3Rpb24gPSBtYW5pZmVzdEFjdGlvbnNbYWN0aW9uS2V5XTtcblx0XHRjb25zdCBsYXN0RG90SW5kZXggPSBtYW5pZmVzdEFjdGlvbi5wcmVzcz8ubGFzdEluZGV4T2YoXCIuXCIpIHx8IC0xO1xuXHRcdGxldCBhbm5vdGF0aW9uQWN0aW9uOiBCYXNlQWN0aW9uIHwgdW5kZWZpbmVkO1xuXG5cdFx0aWYgKGFubm90YXRpb25BY3Rpb25zKSB7XG5cdFx0XHRmb3IgKGNvbnN0IGFjdGlvbiBvZiBhbm5vdGF0aW9uQWN0aW9ucykge1xuXHRcdFx0XHQvLyBTdWJTZWN0aW9uLnRzI2NyZWF0ZUZvcm1BY3Rpb25SZWR1Y2VyIHVzZXMgaW5zZXJ0Q3VzdG9tRWxlbWVudHMgd2hpY2ggcmVzdWx0cyBpbiBhbm5vdGF0aW9uIGFjdGlvbnMgbWl4aW5nIHVwIHdpdGggbWFuaWZlc3QgYWN0aW9uXG5cdFx0XHRcdC8vIHRoaXMgaXMgd2h5IHdlIG1heSBmaW5kIGFuIGFjdGlvbiB0aGF0IGhhcyBhIEN1c3RvbUFjdGlvbiBwcmVmaXhcblx0XHRcdFx0aWYgKGFjdGlvbi5pZD8uc3RhcnRzV2l0aChcIkN1c3RvbUFjdGlvbjo6XCIpKSB7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKGFjdGlvbi5rZXkgPT09IGFjdGlvbktleSkge1xuXHRcdFx0XHRcdGFubm90YXRpb25BY3Rpb24gPSBhY3Rpb247XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH0gZWxzZSBpZiAoYWN0aW9uLnR5cGUgPT09IFwiTWVudVwiKSB7XG5cdFx0XHRcdFx0Ly8gSWYgbm90IGZvdW5kLCBjaGVjayBpbnNpZGUgbWVudXNcblx0XHRcdFx0XHRhbm5vdGF0aW9uQWN0aW9uID0gYWN0aW9uLm1lbnU/LmZpbmQoKG1lbnVJdGVtOiBCYXNlQWN0aW9uKSA9PiB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gbWVudUl0ZW0ua2V5ID09PSBhY3Rpb25LZXk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0aWYgKGFubm90YXRpb25BY3Rpb24pIHtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIFRvIGlkZW50aWZ5IHRoZSBhbm5vdGF0aW9uIGFjdGlvbiBwcm9wZXJ0eSBvdmVyd3JpdGUgdmlhIG1hbmlmZXN0IHVzZS1jYXNlLlxuXHRcdGNvbnN0IGlzQW5ub3RhdGlvbkFjdGlvbiA9ICEhYW5ub3RhdGlvbkFjdGlvbjtcblx0XHRpZiAobWFuaWZlc3RBY3Rpb24uZmFjZXROYW1lKSB7XG5cdFx0XHRmYWNldE5hbWUgPSBtYW5pZmVzdEFjdGlvbi5mYWNldE5hbWU7XG5cdFx0fVxuXG5cdFx0YWN0aW9uc1thY3Rpb25LZXldID0ge1xuXHRcdFx0aWQ6IGFubm90YXRpb25BY3Rpb24gPyBhY3Rpb25LZXkgOiBnZXRDdXN0b21BY3Rpb25JRChhY3Rpb25LZXkpLFxuXHRcdFx0dHlwZTogbWFuaWZlc3RBY3Rpb24ubWVudSA/IEFjdGlvblR5cGUuTWVudSA6IEFjdGlvblR5cGUuRGVmYXVsdCxcblx0XHRcdHZpc2libGU6IF9nZXRNYW5pZmVzdFZpc2libGUobWFuaWZlc3RBY3Rpb24sIGlzQW5ub3RhdGlvbkFjdGlvbiwgY29udmVydGVyQ29udGV4dCksXG5cdFx0XHR2aXNpYmxlRm9yQ29udGV4dE1lbnU6IF9nZXRNYW5pZmVzdFZpc2libGUobWFuaWZlc3RBY3Rpb24sIGlzQW5ub3RhdGlvbkFjdGlvbiwgY29udmVydGVyQ29udGV4dCwgdHJ1ZSksXG5cdFx0XHRlbmFibGVkOiBfZ2V0TWFuaWZlc3RFbmFibGVkKG1hbmlmZXN0QWN0aW9uLCBpc0Fubm90YXRpb25BY3Rpb24sIGNvbnZlcnRlckNvbnRleHQpLFxuXHRcdFx0ZW5hYmxlZEZvckNvbnRleHRNZW51OiBfZ2V0TWFuaWZlc3RFbmFibGVkKG1hbmlmZXN0QWN0aW9uLCBpc0Fubm90YXRpb25BY3Rpb24sIGNvbnZlcnRlckNvbnRleHQsIHRydWUpLFxuXHRcdFx0aGFuZGxlck1vZHVsZTogbWFuaWZlc3RBY3Rpb24ucHJlc3MgJiYgbWFuaWZlc3RBY3Rpb24ucHJlc3Muc3Vic3RyaW5nKDAsIGxhc3REb3RJbmRleCkucmVwbGFjZSgvXFwuL2dpLCBcIi9cIiksXG5cdFx0XHRoYW5kbGVyTWV0aG9kOiBtYW5pZmVzdEFjdGlvbi5wcmVzcyAmJiBtYW5pZmVzdEFjdGlvbi5wcmVzcy5zdWJzdHJpbmcobGFzdERvdEluZGV4ICsgMSksXG5cdFx0XHRwcmVzczogbWFuaWZlc3RBY3Rpb24ucHJlc3MsXG5cdFx0XHR0ZXh0OiBtYW5pZmVzdEFjdGlvbi50ZXh0LFxuXHRcdFx0bm9XcmFwOiBtYW5pZmVzdEFjdGlvbi5fX25vV3JhcCxcblx0XHRcdGtleTogcmVwbGFjZVNwZWNpYWxDaGFycyhhY3Rpb25LZXkpLFxuXHRcdFx0ZW5hYmxlT25TZWxlY3Q6IG1hbmlmZXN0QWN0aW9uLmVuYWJsZU9uU2VsZWN0LFxuXHRcdFx0ZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uOiBtYW5pZmVzdEFjdGlvbi5kZWZhdWx0VmFsdWVzRnVuY3Rpb24sXG5cdFx0XHRwb3NpdGlvbjoge1xuXHRcdFx0XHRhbmNob3I6IG1hbmlmZXN0QWN0aW9uLnBvc2l0aW9uPy5hbmNob3IsXG5cdFx0XHRcdHBsYWNlbWVudDogbWFuaWZlc3RBY3Rpb24ucG9zaXRpb24gPT09IHVuZGVmaW5lZCA/IFBsYWNlbWVudC5BZnRlciA6IG1hbmlmZXN0QWN0aW9uLnBvc2l0aW9uLnBsYWNlbWVudFxuXHRcdFx0fSxcblx0XHRcdGlzTmF2aWdhYmxlOiBpc0FjdGlvbk5hdmlnYWJsZShtYW5pZmVzdEFjdGlvbiwgbmF2aWdhdGlvblNldHRpbmdzLCBjb25zaWRlck5hdmlnYXRpb25TZXR0aW5ncyksXG5cdFx0XHRjb21tYW5kOiBtYW5pZmVzdEFjdGlvbi5jb21tYW5kLFxuXHRcdFx0cmVxdWlyZXNTZWxlY3Rpb246IG1hbmlmZXN0QWN0aW9uLnJlcXVpcmVzU2VsZWN0aW9uID09PSB1bmRlZmluZWQgPyBmYWxzZSA6IG1hbmlmZXN0QWN0aW9uLnJlcXVpcmVzU2VsZWN0aW9uLFxuXHRcdFx0ZW5hYmxlQXV0b1Njcm9sbDogZW5hYmxlQXV0b1Njcm9sbChtYW5pZmVzdEFjdGlvbiksXG5cdFx0XHRtZW51OiBtYW5pZmVzdEFjdGlvbi5tZW51ID8/IChhbm5vdGF0aW9uQWN0aW9uPy50eXBlID09PSBBY3Rpb25UeXBlLk1lbnUgPyBbXSA6IHVuZGVmaW5lZCksXG5cdFx0XHRmYWNldE5hbWU6IG1hbmlmZXN0QWN0aW9uLmlubGluZSA/IGZhY2V0TmFtZSA6IHVuZGVmaW5lZCxcblx0XHRcdGRlZmF1bHRBY3Rpb246IG1hbmlmZXN0QWN0aW9uLmRlZmF1bHRBY3Rpb25cblx0XHR9O1xuXG5cdFx0b3ZlcnJpZGVNYW5pZmVzdENvbmZpZ3VyYXRpb25XaXRoQW5ub3RhdGlvbihhY3Rpb25zW2FjdGlvbktleV0sIGFubm90YXRpb25BY3Rpb24pO1xuXHR9XG5cblx0cmV0dXJuIHRyYW5zZm9ybU1lbnVBY3Rpb25zQW5kSWRlbnRpZnlDb21tYW5kcyhhY3Rpb25zLCBhbm5vdGF0aW9uQWN0aW9ucyA/PyBbXSk7XG59XG5cbi8qKlxuICogR2V0cyBhIGJpbmRpbmcgZXhwcmVzc2lvbiByZXByZXNlbnRpbmcgYSBCb29sZWFuIG1hbmlmZXN0IHByb3BlcnR5IHRoYXQgY2FuIGVpdGhlciBiZSByZXByZXNlbnRlZCBieSBhIHN0YXRpYyB2YWx1ZSwgYSBiaW5kaW5nIHN0cmluZyxcbiAqIG9yIGEgcnVudGltZSBmb3JtYXR0ZXIgZnVuY3Rpb24uXG4gKiBAcGFyYW0gcHJvcGVydHlWYWx1ZSBTdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBjb25maWd1cmVkIHByb3BlcnR5IHZhbHVlXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dFxuICogQHJldHVybnMgQSBiaW5kaW5nIGV4cHJlc3Npb24gcmVwcmVzZW50aW5nIHRoZSBwcm9wZXJ0eVxuICovXG5mdW5jdGlvbiBnZXRNYW5pZmVzdEFjdGlvbkJvb2xlYW5Qcm9wZXJ0eVdpdGhGb3JtYXR0ZXIoXG5cdHByb3BlcnR5VmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCB8IGJvb2xlYW4sXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0PlxuKTogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0Y29uc3QgcmVzb2x2ZWRCaW5kaW5nID0gcmVzb2x2ZUJpbmRpbmdTdHJpbmc8Ym9vbGVhbiB8IHN0cmluZz4ocHJvcGVydHlWYWx1ZSBhcyBzdHJpbmcsIFwiYm9vbGVhblwiKTtcblx0bGV0IHJlc3VsdDogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+O1xuXHRpZiAoaXNDb25zdGFudChyZXNvbHZlZEJpbmRpbmcpICYmIHJlc29sdmVkQmluZGluZy52YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0Ly8gTm8gcHJvcGVydHkgdmFsdWUgY29uZmlndXJlZCBpbiBtYW5pZmVzdCBmb3IgdGhlIGN1c3RvbSBhY3Rpb24gLS0+IGRlZmF1bHQgdmFsdWUgaXMgdHJ1ZVxuXHRcdHJlc3VsdCA9IGNvbnN0YW50KHRydWUpO1xuXHR9IGVsc2UgaWYgKGlzQ29uc3RhbnQocmVzb2x2ZWRCaW5kaW5nKSAmJiB0eXBlb2YgcmVzb2x2ZWRCaW5kaW5nLnZhbHVlID09PSBcInN0cmluZ1wiKSB7XG5cdFx0Ly8gVGhlbiBpdCdzIGEgbW9kdWxlLW1ldGhvZCByZWZlcmVuY2UgXCJzYXAueHh4Lnl5eS5kb1NvbWV0aGluZ1wiXG5cdFx0Y29uc3QgbWV0aG9kUGF0aCA9IHJlc29sdmVkQmluZGluZy52YWx1ZTtcblx0XHQvLyBGSVhNRTogVGhlIGN1c3RvbSBcImlzRW5hYmxlZFwiIGNoZWNrIGRvZXMgbm90IHRyaWdnZXIgKGJlY2F1c2Ugbm9uZSBvZiB0aGUgYm91bmQgdmFsdWVzIGNoYW5nZXMpXG5cdFx0cmVzdWx0ID0gZm9ybWF0UmVzdWx0KFxuXHRcdFx0W3BhdGhJbk1vZGVsPFZpZXc+KFwiL1wiLCBcIiR2aWV3XCIpLCBtZXRob2RQYXRoLCBwYXRoSW5Nb2RlbDxDb250ZXh0W10+KFwic2VsZWN0ZWRDb250ZXh0c1wiLCBcImludGVybmFsXCIpXSxcblx0XHRcdGZwbUZvcm1hdHRlci5jdXN0b21Cb29sZWFuUHJvcGVydHlDaGVjayxcblx0XHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpLmNvbnRleHRMb2NhdGlvbj8udGFyZ2V0RW50aXR5VHlwZSB8fCBjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVR5cGUoKVxuXHRcdCk7XG5cdH0gZWxzZSB7XG5cdFx0Ly8gdGhlbiBpdCdzIGEgYmluZGluZ1xuXHRcdHJlc3VsdCA9IHJlc29sdmVkQmluZGluZyBhcyBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj47XG5cdH1cblxuXHRyZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgY29uc3QgcmVtb3ZlRHVwbGljYXRlQWN0aW9ucyA9IChhY3Rpb25zOiBDdXN0b21BY3Rpb25bXSk6IEN1c3RvbUFjdGlvbltdID0+IHtcblx0bGV0IG9NZW51SXRlbUtleXM6IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+ID0ge307XG5cdGFjdGlvbnMuZm9yRWFjaCgoYWN0aW9uKSA9PiB7XG5cdFx0aWYgKGFjdGlvbj8ubWVudT8ubGVuZ3RoKSB7XG5cdFx0XHRjb25zdCBhY3Rpb25NZW51ID0gYWN0aW9uLm1lbnU7XG5cdFx0XHRvTWVudUl0ZW1LZXlzID0gYWN0aW9uTWVudS5yZWR1Y2UoKGl0ZW06IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+LCB7IGtleSB9KSA9PiB7XG5cdFx0XHRcdGlmIChrZXkgJiYgIWl0ZW1ba2V5XSkge1xuXHRcdFx0XHRcdGl0ZW1ba2V5XSA9IHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIGl0ZW07XG5cdFx0XHR9LCBvTWVudUl0ZW1LZXlzKTtcblx0XHR9XG5cdH0pO1xuXHRyZXR1cm4gYWN0aW9ucy5maWx0ZXIoKGFjdGlvbikgPT4gIW9NZW51SXRlbUtleXNbYWN0aW9uLmtleV0pO1xufTtcblxuLyoqXG4gKiBNZXRob2QgdG8gZGV0ZXJtaW5lIHRoZSB2YWx1ZSBvZiB0aGUgJ2VuYWJsZWQnIHByb3BlcnR5IG9mIGFuIGFubm90YXRpb24tYmFzZWQgYWN0aW9uLlxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGluc3RhbmNlIG9mIHRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHBhcmFtIGFjdGlvblRhcmdldCBUaGUgaW5zdGFuY2Ugb2YgdGhlIGFjdGlvblxuICogQHBhcmFtIHBhdGhGcm9tQ29udGV4dExvY2F0aW9uIElzIHRoZSBiaW5kaW5nIHBhdGggY2FsY3VsYXRlZCAgZnJvbSB0aGUgY29udmVydGVyIGNvbnRleHQgbG9jYXRpb25cbiAqIEByZXR1cm5zIFRoZSBiaW5kaW5nIGV4cHJlc3Npb24gZm9yIHRoZSAnZW5hYmxlZCcgcHJvcGVydHkgb2YgdGhlIGFjdGlvbiBidXR0b24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRFbmFibGVkRm9yQW5ub3RhdGlvbkFjdGlvbihcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+LFxuXHRhY3Rpb25UYXJnZXQ6IEFjdGlvbiB8IHVuZGVmaW5lZCxcblx0cGF0aEZyb21Db250ZXh0TG9jYXRpb24gPSBmYWxzZVxuKTogQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24ge1xuXHRpZiAoYWN0aW9uVGFyZ2V0Py5hbm5vdGF0aW9ucy5Db3JlPy5PcGVyYXRpb25BdmFpbGFibGUpIHtcblx0XHRjb25zdCBkYXRhTW9kZWxPYmplY3RQYXRoID0gY29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCk7XG5cdFx0Y29uc3QgaXNFbmFibGVkRXhwID0gZ2V0QWN0aW9uRW5hYmxlZEV4cHJlc3Npb24oXG5cdFx0XHRhY3Rpb25UYXJnZXQsXG5cdFx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldENvbnZlcnRlZFR5cGVzKCksXG5cdFx0XHRkYXRhTW9kZWxPYmplY3RQYXRoLFxuXHRcdFx0cGF0aEZyb21Db250ZXh0TG9jYXRpb25cblx0XHQpO1xuXHRcdHJldHVybiBjb21waWxlRXhwcmVzc2lvbihpc0VuYWJsZWRFeHApO1xuXHR9XG5cdHJldHVybiBcInRydWVcIjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNlbWFudGljT2JqZWN0TWFwcGluZyhtYXBwaW5ncz86IFNlbWFudGljT2JqZWN0TWFwcGluZ1R5cGVbXSk6IE1ldGFNb2RlbFR5cGU8U2VtYW50aWNPYmplY3RNYXBwaW5nVHlwZT5bXSB7XG5cdHJldHVybiBtYXBwaW5nc1xuXHRcdD8gbWFwcGluZ3MubWFwKChtYXBwaW5nKSA9PiB7XG5cdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0TG9jYWxQcm9wZXJ0eToge1xuXHRcdFx0XHRcdFx0JFByb3BlcnR5UGF0aDogbWFwcGluZy5Mb2NhbFByb3BlcnR5LnZhbHVlXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRTZW1hbnRpY09iamVjdFByb3BlcnR5OiBtYXBwaW5nLlNlbWFudGljT2JqZWN0UHJvcGVydHkudG9TdHJpbmcoKVxuXHRcdFx0XHR9O1xuXHRcdCAgfSlcblx0XHQ6IFtdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNBY3Rpb25OYXZpZ2FibGUoXG5cdGFjdGlvbjogTWFuaWZlc3RBY3Rpb24gfCBDdXN0b21EZWZpbmVkVGFibGVDb2x1bW5Gb3JPdmVycmlkZSB8IHVuZGVmaW5lZCxcblx0bmF2aWdhdGlvblNldHRpbmdzPzogTmF2aWdhdGlvblNldHRpbmdzQ29uZmlndXJhdGlvbixcblx0Y29uc2lkZXJOYXZpZ2F0aW9uU2V0dGluZ3M/OiBib29sZWFuXG4pOiBib29sZWFuIHtcblx0bGV0IGJJc05hdmlnYXRpb25Db25maWd1cmVkID0gdHJ1ZTtcblx0aWYgKGNvbnNpZGVyTmF2aWdhdGlvblNldHRpbmdzKSB7XG5cdFx0Y29uc3QgZGV0YWlsT3JEaXNwbGF5ID0gbmF2aWdhdGlvblNldHRpbmdzICYmIChuYXZpZ2F0aW9uU2V0dGluZ3MuZGV0YWlsIHx8IG5hdmlnYXRpb25TZXR0aW5ncy5kaXNwbGF5KTtcblx0XHRiSXNOYXZpZ2F0aW9uQ29uZmlndXJlZCA9IGRldGFpbE9yRGlzcGxheT8ucm91dGUgPyB0cnVlIDogZmFsc2U7XG5cdH1cblx0Ly8gd2hlbiBlbmFibGVBdXRvU2Nyb2xsIGlzIHRydWUgdGhlIG5hdmlnYXRlVG9JbnN0YW5jZSBmZWF0dXJlIGlzIGRpc2FibGVkXG5cdGlmIChcblx0XHQoYWN0aW9uICYmXG5cdFx0XHRhY3Rpb24uYWZ0ZXJFeGVjdXRpb24gJiZcblx0XHRcdChhY3Rpb24uYWZ0ZXJFeGVjdXRpb24/Lm5hdmlnYXRlVG9JbnN0YW5jZSA9PT0gZmFsc2UgfHwgYWN0aW9uLmFmdGVyRXhlY3V0aW9uPy5lbmFibGVBdXRvU2Nyb2xsID09PSB0cnVlKSkgfHxcblx0XHQhYklzTmF2aWdhdGlvbkNvbmZpZ3VyZWRcblx0KSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cdHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZW5hYmxlQXV0b1Njcm9sbChhY3Rpb246IE1hbmlmZXN0QWN0aW9uKTogYm9vbGVhbiB7XG5cdHJldHVybiBhY3Rpb24/LmFmdGVyRXhlY3V0aW9uPy5lbmFibGVBdXRvU2Nyb2xsID09PSB0cnVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGF0YUZpZWxkSXNDb3B5QWN0aW9uKGRhdGFGaWVsZDogRGF0YUZpZWxkRm9yQWN0aW9uVHlwZXMpOiBib29sZWFuIHtcblx0cmV0dXJuIGRhdGFGaWVsZC5hbm5vdGF0aW9ucz8uVUk/LklzQ29weUFjdGlvbj8udmFsdWVPZigpID09PSB0cnVlICYmIGRhdGFGaWVsZC4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQWN0aW9uO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29weUFjdGlvbihjb3B5RGF0YUZpZWxkczogRGF0YUZpZWxkRm9yQWN0aW9uVHlwZXNbXSk6IERhdGFGaWVsZEZvckFjdGlvblR5cGVzIHwgdW5kZWZpbmVkIHtcblx0aWYgKGNvcHlEYXRhRmllbGRzLmxlbmd0aCA9PT0gMSkge1xuXHRcdHJldHVybiBjb3B5RGF0YUZpZWxkc1swXTtcblx0fVxuXHRpZiAoY29weURhdGFGaWVsZHMubGVuZ3RoID4gMSkge1xuXHRcdExvZy5lcnJvcihcIk11bHRpcGxlIGFjdGlvbnMgYXJlIGFubm90YXRlZCB3aXRoIGlzQ29weUFjdGlvbi4gVGhlcmUgY2FuIGJlIG9ubHkgb25lIHN0YW5kYXJkIGNvcHkgYWN0aW9uLlwiKTtcblx0fVxuXHRyZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIE1ldGhvZCB0byBleHRyYWN0IG1lbnUgaXRlbXMgZnJvbSBhY3Rpb25zIG9mIHR5cGUgbWVudXMuXG4gKiBAcGFyYW0gYW5ub3RhdGlvbkFjdGlvbnMgQ29sbGVjdGlvbiBvZiBhbm5vdGF0aW9uIGJhc2VkIGFjdGlvbnNcbiAqIEByZXR1cm5zIENvbGxlY3Rpb24gb2YgYWN0aW9ucyB3aGljaCBhcmUgbWVudSBpdGVtcyBpbiBvbmUgb2YgdGhlIGFubm90YXRpb24gYmFzZWQgbWVudXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEFubm90YXRpb25NZW51QWN0aW9uSXRlbXMoYW5ub3RhdGlvbkFjdGlvbnM6IEJhc2VBY3Rpb25bXSk6IEJhc2VBY3Rpb25bXSB7XG5cdGNvbnN0IG1lbnVBY3Rpb25JdGVtczogQmFzZUFjdGlvbltdID0gW107XG5cblx0YW5ub3RhdGlvbkFjdGlvbnMuZm9yRWFjaCgoYWN0aW9uOiBCYXNlQWN0aW9uKSA9PiB7XG5cdFx0aWYgKGFjdGlvbi50eXBlID09PSBcIk1lbnVcIiAmJiAhYWN0aW9uLmlkPy5zdGFydHNXaXRoKFwiQ3VzdG9tQWN0aW9uOjpcIikgJiYgYWN0aW9uLm1lbnUpIHtcblx0XHRcdG1lbnVBY3Rpb25JdGVtcy5wdXNoKC4uLmFjdGlvbi5tZW51KTtcblx0XHR9XG5cdH0pO1xuXG5cdHJldHVybiBtZW51QWN0aW9uSXRlbXM7XG59XG5cbi8qKlxuICogTWV0aG9kIHRvIGZpbmQgdGhlIG1hdGNoaW5nIG1hbmlmZXN0IGFjdGlvbnMgd2hpY2ggb3ZlcnJpZGUgdGhlIGFubm90YXRpb24gbWVudSBpdGVtcy5cbiAqIEBwYXJhbSBhbm5vdGF0aW9uTWVudUl0ZW1zIENvbGxlY3Rpb24gb2YgYW5ub3RhdGlvbiBiYXNlZCBtZW51IGl0ZW1zXG4gKiBAcGFyYW0gbWFuaWZlc3RBY3Rpb25zIENvbGxlY3Rpb24gb2YgbWFuaWZlc3QgYmFzZWQgYWN0aW9uc1xuICogQHJldHVybnMgQ29sbGVjdGlvbiBvZiBhY3Rpb25zIHdoaWNoIGFyZSBtZW51IGl0ZW1zIGluIG9uZSBvZiB0aGUgYW5ub3RhdGlvbiBiYXNlZCBtZW51c1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWF0Y2hpbmdNYW5pZmVzdEFjdGlvbihcblx0YW5ub3RhdGlvbk1lbnVJdGVtczogQmFzZUFjdGlvbltdLFxuXHRtYW5pZmVzdEFjdGlvbnM6IFJlY29yZDxzdHJpbmcsIEN1c3RvbUFjdGlvbj5cbik6IFJlY29yZDxzdHJpbmcsIEN1c3RvbUFjdGlvbj4ge1xuXHRjb25zdCBtYXRjaGluZ01hbmlmZXN0QWN0aW9uczogUmVjb3JkPHN0cmluZywgQ3VzdG9tQWN0aW9uPiA9IHt9O1xuXG5cdGZvciAoY29uc3QgbWFuaWZlc3RBY3Rpb24gaW4gbWFuaWZlc3RBY3Rpb25zKSB7XG5cdFx0aWYgKFxuXHRcdFx0bWFuaWZlc3RBY3Rpb24uc3RhcnRzV2l0aChcIkRhdGFGaWVsZEZvckFjdGlvbjo6XCIpICYmXG5cdFx0XHRhbm5vdGF0aW9uTWVudUl0ZW1zLmZpbmQoKG1lbnVBY3Rpb25JdGVtcykgPT4ge1xuXHRcdFx0XHRyZXR1cm4gbWVudUFjdGlvbkl0ZW1zLmtleSA9PT0gbWFuaWZlc3RBY3Rpb247XG5cdFx0XHR9KVxuXHRcdCkge1xuXHRcdFx0bWF0Y2hpbmdNYW5pZmVzdEFjdGlvbnNbbWFuaWZlc3RBY3Rpb25dID0gbWFuaWZlc3RBY3Rpb25zW21hbmlmZXN0QWN0aW9uXTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gbWF0Y2hpbmdNYW5pZmVzdEFjdGlvbnM7XG59XG5cbi8qKlxuICogTWV0aG9kIHRvIHRyYW5zZm9ybSB0aGUgbWVudXMgYnkgcmVwbGFjaW5nIHRoZSBtZW51IGl0ZW1zIHdpdGggdGhlaXIgb3ZlcnJpZGluZyBhY3Rpb25zLlxuICogQHBhcmFtIHVucHJlcGFyZWRBY3Rpb25zIENvbGxlY3Rpb24gb2YgYWxsIGFjdGlvbnMgYWZ0ZXIgbWVyZ2luZyBtYW5pZmVzdCBhbmQgYW5ub3RhdGlvbiBhY3Rpb25zXG4gKiBAcGFyYW0gb3ZlcnJpZGVNZW51QWN0aW9ucyBDb2xsZWN0aW9uIG9mIGFsbCBvdmVycmlkZW4gbWVudSBpdGVtc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcHJlcGFyZU1lbnVBY3Rpb25zKHVucHJlcGFyZWRBY3Rpb25zOiBDdXN0b21BY3Rpb25bXSwgb3ZlcnJpZGVNZW51QWN0aW9uczogQmFzZUFjdGlvbltdKTogdm9pZCB7XG5cdGxldCBmb3VuZEFjdGlvbjtcblxuXHR1bnByZXBhcmVkQWN0aW9ucy5mb3JFYWNoKChhY3Rpb246IEN1c3RvbUFjdGlvbikgPT4ge1xuXHRcdGlmIChhY3Rpb24udHlwZSA9PT0gQWN0aW9uVHlwZS5NZW51KSB7XG5cdFx0XHRhY3Rpb24ubWVudT8uZm9yRWFjaCgobWVudUl0ZW06IEJhc2VBY3Rpb24sIG1lbnVJdGVtSW5kZXg6IG51bWJlcikgPT4ge1xuXHRcdFx0XHRmb3VuZEFjdGlvbiA9IG92ZXJyaWRlTWVudUFjdGlvbnMuZmluZCgob3ZlcnJpZGVNZW51QWN0aW9uOiBCYXNlQWN0aW9uKSA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuIG92ZXJyaWRlTWVudUFjdGlvbi5rZXkgPT09IG1lbnVJdGVtLmtleTtcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0aWYgKGZvdW5kQWN0aW9uKSB7XG5cdFx0XHRcdFx0YWN0aW9uLm1lbnU/LnNwbGljZShtZW51SXRlbUluZGV4LCAxLCBmb3VuZEFjdGlvbik7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH1cblx0fSk7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztNQXFDWUEsVUFBVSwwQkFBVkEsVUFBVTtJQUFWQSxVQUFVO0lBQVZBLFVBQVU7SUFBVkEsVUFBVTtJQUFWQSxVQUFVO0lBQVZBLFVBQVU7SUFBVkEsVUFBVTtJQUFWQSxVQUFVO0lBQVZBLFVBQVU7SUFBVkEsVUFBVTtJQUFWQSxVQUFVO0lBQVZBLFVBQVU7SUFBVkEsVUFBVTtJQUFWQSxVQUFVO0lBQVZBLFVBQVU7SUFBQSxPQUFWQSxVQUFVO0VBQUE7RUFBQUMsUUFBQSxDQUFBRCxVQUFBLEdBQUFBLFVBQUE7RUFpR3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDTyxNQUFNRSxrQ0FBa0MsR0FBSUMsT0FBdUIsSUFBcUI7SUFDOUYsSUFBSUMsb0JBQXNDLEVBQ3pDQyxzQkFBZ0MsRUFDaENDLDBCQUFtQyxFQUNuQ0MscUJBQStCO0lBQ2hDSixPQUFPLENBQUNLLE9BQU8sQ0FBRUMsVUFBc0IsSUFBSztNQUMzQ0wsb0JBQW9CLEdBQUdLLFVBQVUsQ0FBQ0MsT0FBTyxFQUFFQyxPQUFPLENBQUMsQ0FBQyxLQUFLLE9BQU87TUFDaEVMLDBCQUEwQixHQUFHLEtBQUs7TUFDbENDLHFCQUFxQixHQUFHLEVBQUU7TUFDMUJGLHNCQUFzQixHQUFHLEVBQUU7TUFDM0IsSUFBSUksVUFBVSxDQUFDQyxPQUFPLElBQUksRUFBRUQsVUFBVSxDQUFDQyxPQUFPLENBQUNDLE9BQU8sQ0FBQyxDQUFDLEtBQUssTUFBTSxJQUFJRixVQUFVLENBQUNDLE9BQU8sQ0FBQ0MsT0FBTyxDQUFDLENBQUMsS0FBSyxPQUFPLENBQUMsRUFBRTtRQUNqSE4sc0JBQXNCLENBQUNPLElBQUksQ0FBQ0gsVUFBVSxDQUFDQyxPQUFpQixDQUFDO01BQzFEO01BQ0EsSUFBSUQsVUFBVSxFQUFFSSxJQUFJ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
588
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJCdXR0b25UeXBlIiwiX2V4cG9ydHMiLCJhaUljb24iLCJnZXRWaXNpYmlsaXR5RW5hYmxlbWVudE1lbnVBY3Rpb25zIiwiYWN0aW9ucyIsIm1lbnVBY3Rpb25Ob3RWaXNpYmxlIiwibWVudUFjdGlvblZpc2libGVQYXRocyIsImF0bGVhc3RPbmVNZW51SXRlbXNWaXNpYmxlIiwibWVudUl0ZW1zVmlzaWJsZVBhdGhzIiwiZm9yRWFjaCIsIm1lbnVBY3Rpb24iLCJ2aXNpYmxlIiwidmFsdWVPZiIsInB1c2giLCJtZW51IiwibGVuZ3RoIiwibWVudUl0ZW0iLCJtZW51SXRlbVZpc2libGUiLCJ0b1N0cmluZyIsInZpc2libGVFeHByZXNzaW9ucyIsIm1hcCIsIm1lbnVJdGVtVmlzaWJsZVBhdGgiLCJyZXNvbHZlQmluZGluZ1N0cmluZyIsImNvbXBpbGVFeHByZXNzaW9uIiwiYW5kIiwib3IiLCJhZGRDb2xsYWJvcmF0aW9uQ29uZGl0aW9uIiwiYWN0aW9uIiwidHlwZSIsIm5vdCIsImVxdWFsIiwiVUkiLCJoYXNDb2xsYWJvcmF0aW9uQXV0aG9yaXphdGlvbiIsIm1hcEFjdGlvbkJ5S2V5IiwibWFuaWZlc3RBY3Rpb25zIiwiYW5ub3RhdGlvbkFjdGlvbnMiLCJhY3Rpb25LZXkiLCJhbm5vdGF0aW9uQWN0aW9uIiwiZmluZCIsImtleSIsIm1hbmlmZXN0QWN0aW9uIiwicmVzdWx0QWN0aW9uIiwiT2JqZWN0Iiwia2V5cyIsImZpbHRlciIsImFjdGlvbkFubm90YXRpb24iLCJBY3Rpb25UeXBlIiwiTWVudSIsImVuYWJsZWQiLCJwcm9wIiwicHJvcEtleSIsImNhbkJlTWVudUl0ZW0iLCJEYXRhRmllbGRGb3JBY3Rpb24iLCJEYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb24iLCJtYXBNZW51RGVmYXVsdEFjdGlvbiIsImNvbW1hbmRBY3Rpb25zIiwiZGVmYXVsdEFjdGlvbiIsImNvbW1hbmQiLCJtYXBNZW51SXRlbXMiLCJtYXBwZWRNZW51SXRlbXMiLCJtYXRjaGluZ0Fubm90YXRpb25BY3Rpb24iLCJtZW51SXRlbUtleSIsIm1hcHBlZE1lbnVBY3Rpb24iLCJ0cmFuc2Zvcm1NZW51QWN0aW9uc0FuZElkZW50aWZ5Q29tbWFuZHMiLCJhbGxBY3Rpb25zIiwiYWN0aW9uS2V5c1RvRGVsZXRlIiwidW5kZWZpbmVkIiwiX2dldE1hbmlmZXN0RW5hYmxlZCIsImlzQW5ub3RhdGlvbkFjdGlvbiIsImNvbnZlcnRlckNvbnRleHQiLCJmb3JDb250ZXh0TWVudSIsImFyZ3VtZW50cyIsInJlc3VsdCIsImdldE1hbmlmZXN0QWN0aW9uQm9vbGVhblByb3BlcnR5V2l0aEZvcm1hdHRlciIsImludGVybmFsTW9kZWxQcm9wZXJ0eSIsImlmRWxzZSIsInJlcXVpcmVzU2VsZWN0aW9uIiwiZW5hYmxlT25TZWxlY3QiLCJwYXRoSW5Nb2RlbCIsImdyZWF0ZXJPckVxdWFsIiwiX2dldE1hbmlmZXN0VmlzaWJsZSIsIm92ZXJyaWRlTWFuaWZlc3RDb25maWd1cmF0aW9uV2l0aEFubm90YXRpb24iLCJhbm5vdGF0aW9uUGF0aCIsInByZXNzIiwidmlzaWJsZUZvckNvbnRleHRNZW51IiwiZ2V0QWN0aW9uc0Zyb21NYW5pZmVzdCIsIm5hdmlnYXRpb25TZXR0aW5ncyIsImNvbnNpZGVyTmF2aWdhdGlvblNldHRpbmdzIiwiaGlkZGVuQWN0aW9ucyIsImZhY2V0TmFtZSIsImxhc3REb3RJbmRleCIsImxhc3RJbmRleE9mIiwiaWQiLCJzdGFydHNXaXRoIiwiZ2V0Q3VzdG9tQWN0aW9uSUQiLCJEZWZhdWx0IiwiZW5hYmxlZEZvckNvbnRleHRNZW51IiwiaGFuZGxlck1vZHVsZSIsInN1YnN0cmluZyIsInJlcGxhY2UiLCJoYW5kbGVyTWV0aG9kIiwidGV4dCIsIm5vV3JhcCIsIl9fbm9XcmFwIiwicmVwbGFjZVNwZWNpYWxDaGFycyIsImRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbiIsImRlZmF1bHRWYWx1ZXNGdW5jdGlvbiIsInBvc2l0aW9uIiwiYW5jaG9yIiwicGxhY2VtZW50IiwiUGxhY2VtZW50IiwiQWZ0ZXIiLCJpc05hdmlnYWJsZSIsImlzQWN0aW9uTmF2aWdhYmxlIiwiZW5hYmxlQXV0b1Njcm9sbCIsImlubGluZSIsImlzQUlPcGVyYXRpb24iLCJwcm9wZXJ0eVZhbHVlIiwicmVzb2x2ZWRCaW5kaW5nIiwiaXNDb25zdGFudCIsInZhbHVlIiwiY29uc3RhbnQiLCJtZXRob2RQYXRoIiwiZm9ybWF0UmVzdWx0IiwiZnBtRm9ybWF0dGVyIiwiY3VzdG9tQm9vbGVhblByb3BlcnR5Q2hlY2siLCJnZXREYXRhTW9kZWxPYmplY3RQYXRoIiwiY29udGV4dExvY2F0aW9uIiwidGFyZ2V0RW50aXR5VHlwZSIsImdldEVudGl0eVR5cGUiLCJyZW1vdmVEdXBsaWNhdGVBY3Rpb25zIiwib01lbnVJdGVtS2V5cyIsImFjdGlvbk1lbnUiLCJyZWR1Y2UiLCJpdGVtIiwiX3JlZiIsImdldEVuYWJsZWRGb3JBbm5vdGF0aW9uQWN0aW9uIiwiYWN0aW9uVGFyZ2V0IiwicGF0aEZyb21Db250ZXh0TG9jYXRpb24iLCJhbm5vdGF0aW9ucyIsIkNvcmUiLCJPcGVyYXRpb25BdmFpbGFibGUiLCJkYXRhTW9kZWxPYmplY3RQYXRoIiwiaXNFbmFibGVkRXhwIiwiZ2V0QWN0aW9uRW5hYmxlZEV4cHJlc3Npb24iLCJnZXRDb252ZXJ0ZWRUeXBlcyIsImNvbGxhYm9yYXRpb25PblJvb3QiLCJNb2RlbEhlbHBlciIsImlzQ29sbGFib3JhdGlvbkRyYWZ0U3VwcG9ydGVkRnJvbUNvbnZlcnRlckNvbnRleHQiLCJnZXREcmFmdFJvb3QiLCJnZXRFbnRpdHlTZXQiLCJnZXRTZW1hbnRpY09iamVjdE1hcHBpbmciLCJtYXBwaW5ncyIsIm1hcHBpbmciLCJMb2NhbFByb3BlcnR5IiwiJFByb3BlcnR5UGF0aCIsIlNlbWFudGljT2JqZWN0UHJvcGVydHkiLCJiSXNOYXZpZ2F0aW9uQ29uZmlndXJlZCIsImRldGFpbE9yRGlzcGxheSIsImRldGFpbCIsImRpc3BsYXkiLCJyb3V0ZSIsImFmdGVyRXhlY3V0aW9uIiwibmF2aWdhdGVUb0luc3RhbmNlIiwiZGF0YUZpZWxkSXNDb3B5QWN0aW9uIiwiZGF0YUZpZWxkIiwiSXNDb3B5QWN0aW9uIiwiJFR5cGUiLCJnZXRDb3B5QWN0aW9uIiwiY29weURhdGFGaWVsZHMiLCJMb2ciLCJlcnJvciIsImdldEFubm90YXRpb25NZW51QWN0aW9uSXRlbXMiLCJtZW51QWN0aW9uSXRlbXMiLCJnZXRNYXRjaGluZ01hbmlmZXN0QWN0aW9uIiwiYW5ub3RhdGlvbk1lbnVJdGVtcyIsIm1hdGNoaW5nTWFuaWZlc3RBY3Rpb25zIiwicHJlcGFyZU1lbnVBY3Rpb25zIiwidW5wcmVwYXJlZEFjdGlvbnMiLCJvdmVycmlkZU1lbnVBY3Rpb25zIiwiZm91bmRBY3Rpb24iLCJtZW51SXRlbUluZGV4Iiwib3ZlcnJpZGVNZW51QWN0aW9uIiwic3BsaWNlIiwiaXNNZW51QUlPcGVyYXRpb24iLCJldmVyeSIsImlzQWN0aW9uQUlPcGVyYXRpb24iLCJBY3Rpb25UYXJnZXQiLCJJc0FJT3BlcmF0aW9uIl0sInNvdXJjZVJvb3QiOiIuIiwic291cmNlcyI6WyJBY3Rpb24udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBBY3Rpb24gfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXNcIjtcbmltcG9ydCB0eXBlIHsgU2VtYW50aWNPYmplY3RNYXBwaW5nVHlwZSB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvQ29tbW9uXCI7XG5pbXBvcnQgdHlwZSB7XG5cdERhdGFGaWVsZEZvckFjdGlvbkFic3RyYWN0VHlwZXMsXG5cdERhdGFGaWVsZEZvckFjdGlvbkdyb3VwVHlwZXMsXG5cdERhdGFGaWVsZEZvckFjdGlvblR5cGVzXG59IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvVUlcIjtcbmltcG9ydCB7IFVJQW5ub3RhdGlvblR5cGVzIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3ZvY2FidWxhcmllcy9VSVwiO1xuaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgdHlwZSB7IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiwgQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24gfSBmcm9tIFwic2FwL2ZlL2Jhc2UvQmluZGluZ1Rvb2xraXRcIjtcbmltcG9ydCB7XG5cdGFuZCxcblx0Y29tcGlsZUV4cHJlc3Npb24sXG5cdGNvbnN0YW50LFxuXHRlcXVhbCxcblx0Zm9ybWF0UmVzdWx0LFxuXHRncmVhdGVyT3JFcXVhbCxcblx0aWZFbHNlLFxuXHRpc0NvbnN0YW50LFxuXHRub3QsXG5cdG9yLFxuXHRwYXRoSW5Nb2RlbCxcblx0cmVzb2x2ZUJpbmRpbmdTdHJpbmdcbn0gZnJvbSBcInNhcC9mZS9iYXNlL0JpbmRpbmdUb29sa2l0XCI7XG5pbXBvcnQgdHlwZSB7XG5cdEN1c3RvbURlZmluZWRUYWJsZUNvbHVtbkZvck92ZXJyaWRlLFxuXHRNYW5pZmVzdEFjdGlvbixcblx0TmF2aWdhdGlvblNldHRpbmdzQ29uZmlndXJhdGlvblxufSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9NYW5pZmVzdFNldHRpbmdzXCI7XG5pbXBvcnQgeyBBY3Rpb25UeXBlIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWFuaWZlc3RTZXR0aW5nc1wiO1xuaW1wb3J0IHR5cGUgeyBQYWdlQ29udGV4dFBhdGhUYXJnZXQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9UZW1wbGF0ZUNvbnZlcnRlclwiO1xuaW1wb3J0IHR5cGUgeyBDb25maWd1cmFibGVPYmplY3QsIEN1c3RvbUVsZW1lbnQsIE92ZXJyaWRlVHlwZSB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2hlbHBlcnMvQ29uZmlndXJhYmxlT2JqZWN0XCI7XG5pbXBvcnQgeyBQbGFjZW1lbnQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9oZWxwZXJzL0NvbmZpZ3VyYWJsZU9iamVjdFwiO1xuaW1wb3J0IHsgZ2V0Q3VzdG9tQWN0aW9uSUQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9oZWxwZXJzL0lEXCI7XG5pbXBvcnQgZnBtRm9ybWF0dGVyIGZyb20gXCJzYXAvZmUvY29yZS9mb3JtYXR0ZXJzL0ZQTUZvcm1hdHRlclwiO1xuaW1wb3J0IHsgVUkgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9CaW5kaW5nSGVscGVyXCI7XG5pbXBvcnQgTW9kZWxIZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTW9kZWxIZWxwZXJcIjtcbmltcG9ydCB7IHJlcGxhY2VTcGVjaWFsQ2hhcnMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9TdGFibGVJZEhlbHBlclwiO1xuaW1wb3J0IHsgZ2V0QWN0aW9uRW5hYmxlZEV4cHJlc3Npb24gfSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9VSUZvcm1hdHRlcnNcIjtcbmltcG9ydCB0eXBlIFZpZXcgZnJvbSBcInNhcC91aS9jb3JlL212Yy9WaWV3XCI7XG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvQ29udGV4dFwiO1xuaW1wb3J0IHR5cGUgeyBNZXRhTW9kZWxUeXBlIH0gZnJvbSBcInR5cGVzL21ldGFtb2RlbF90eXBlc1wiO1xuaW1wb3J0IHR5cGUgQ29udmVydGVyQ29udGV4dCBmcm9tIFwiLi4vLi4vQ29udmVydGVyQ29udGV4dFwiO1xuXG5leHBvcnQgZW51bSBCdXR0b25UeXBlIHtcblx0QWNjZXB0ID0gXCJBY2NlcHRcIixcblx0QXR0ZW50aW9uID0gXCJBdHRlbnRpb25cIixcblx0QmFjayA9IFwiQmFja1wiLFxuXHRDcml0aWNhbCA9IFwiQ3JpdGljYWxcIixcblx0RGVmYXVsdCA9IFwiRGVmYXVsdFwiLFxuXHRFbXBoYXNpemVkID0gXCJFbXBoYXNpemVkXCIsXG5cdEdob3N0ID0gXCJHaG9zdFwiLFxuXHROZWdhdGl2ZSA9IFwiTmVnYXRpdmVcIixcblx0TmV1dHJhbCA9IFwiTmV1dHJhbFwiLFxuXHRSZWplY3QgPSBcIlJlamVjdFwiLFxuXHRTdWNjZXNzID0gXCJTdWNjZXNzXCIsXG5cdFRyYW5zcGFyZW50ID0gXCJUcmFuc3BhcmVudFwiLFxuXHRVbnN0eWxlZCA9IFwiVW5zdHlsZWRcIixcblx0VXAgPSBcIlVwXCJcbn1cblxuZXhwb3J0IGNvbnN0IGFpSWNvbiA9IFwic2FwLWljb246Ly9haVwiO1xuXG5leHBvcnQgdHlwZSBCYXNlQWN0aW9uID0gQ29uZmlndXJhYmxlT2JqZWN0ICYge1xuXHRpZD86IHN0cmluZztcblx0dGV4dD86IHN0cmluZztcblx0dHlwZT86IEFjdGlvblR5cGU7XG5cdHByZXNzPzogc3RyaW5nO1xuXHRlbmFibGVkPzogQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb247XG5cdGVuYWJsZWRGb3JDb250ZXh0TWVudT86IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uO1xuXHR2aXNpYmxlPzogQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb247XG5cdHZpc2libGVGb3JDb250ZXh0TWVudT86IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uO1xuXHRlbmFibGVPblNlbGVjdD86IHN0cmluZztcblx0YW5ub3RhdGlvblBhdGg/OiBzdHJpbmc7XG5cdGRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbj86IHN0cmluZztcblx0aXNOYXZpZ2FibGU/OiBib29sZWFuO1xuXHRlbmFibGVBdXRvU2Nyb2xsPzogYm9vbGVhbjtcblx0cGFyZW50RW50aXR5RGVsZXRlRW5hYmxlZD86IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uO1xuXHRtZW51PzogQmFzZUFjdGlvbltdO1xuXHRmYWNldE5hbWU/OiBzdHJpbmc7XG5cdGNvbW1hbmQ/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cdGlzQUlPcGVyYXRpb24/OiBib29sZWFuO1xufTtcblxuZXhwb3J0IHR5cGUgQW5ub3RhdGlvbkFjdGlvbiA9IEJhc2VBY3Rpb24gJiB7XG5cdHR5cGU6IEFjdGlvblR5cGUuRGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uIHwgQWN0aW9uVHlwZS5EYXRhRmllbGRGb3JBY3Rpb24gfCBBY3Rpb25UeXBlLk1lbnUgfCBBY3Rpb25UeXBlLkNvcHk7XG5cdGFubm90YXRpb25QYXRoOiBzdHJpbmc7XG5cdGN1c3RvbURhdGE/OiBzdHJpbmc7XG5cdHJlcXVpcmVzRGlhbG9nPzogc3RyaW5nO1xuXHRiaW5kaW5nPzogc3RyaW5nO1xuXHRidXR0b25UeXBlPzogQnV0dG9uVHlwZS5HaG9zdCB8IEJ1dHRvblR5cGUuVHJhbnNwYXJlbnQgfCBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBBbm5vdGF0aW9uQWN0aW9uQWN0aW9uR3JvdXAgPSBCYXNlQWN0aW9uICYge1xuXHQvLyBpbXBsZW1lbnRzIERhdGFGaWVsZEZvckFjdGlvbkdyb3VwXG5cdHR5cGU6IEFjdGlvblR5cGUuTWVudTtcblx0bWVudTogQW5ub3RhdGlvbkFjdGlvbltdO1xufTtcblxuZXhwb3J0IHR5cGUgQ3VzdG9tQWN0aW9uID0gQ3VzdG9tRWxlbWVudDxcblx0QmFzZUFjdGlvbiAmIHtcblx0XHRoYW5kbGVyTWV0aG9kPzogc3RyaW5nO1xuXHRcdGhhbmRsZXJNb2R1bGU/OiBzdHJpbmc7XG5cdFx0bm9XcmFwPzogYm9vbGVhbjsgLy8gSW5kaWNhdGVzIHRoYXQgd2Ugd2FudCB0byBhdm9pZCB0aGUgd3JhcHBpbmcgZnJvbSB0aGUgRlBNSGVscGVyXG5cdFx0cmVxdWlyZXNTZWxlY3Rpb24/OiBib29sZWFuO1xuXHRcdGRlZmF1bHRBY3Rpb24/OiBzdHJpbmcgfCBCYXNlQWN0aW9uIHwgQ3VzdG9tQWN0aW9uOyAvLyBJbmRpY2F0ZXMgd2hldGhlciBhIGRlZmF1bHQgYWN0aW9uIGV4aXN0cyBpbiB0aGlzIGNvbnRleHRcblx0fVxuPjtcblxuZXhwb3J0IHR5cGUgQW5ub3RhdGlvbkFjdGlvbkdyb3VwID0gQmFzZUFjdGlvbiAmIHtcblx0Ly8gaW1wbGVtZW50cyBEYXRhRmllbGRGb3JBY3Rpb25Hcm91cFxuXHR0eXBlOiBBY3Rpb25UeXBlLk1lbnU7XG5cdG1lbnU6IEFubm90YXRpb25BY3Rpb25bXTtcbn07XG5cbmV4cG9ydCB0eXBlIENvbWJpbmVkQWN0aW9uID0ge1xuXHRhY3Rpb25zOiBCYXNlQWN0aW9uW107XG5cdGNvbW1hbmRBY3Rpb25zOiBSZWNvcmQ8c3RyaW5nLCBDdXN0b21BY3Rpb24+O1xufTtcblxuZXhwb3J0IHR5cGUgT3ZlcnJpZGVUeXBlQWN0aW9uID0ge1xuXHRlbmFibGVBdXRvU2Nyb2xsPzogT3ZlcnJpZGVUeXBlLm92ZXJ3cml0ZTtcblx0ZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uPzogT3ZlcnJpZGVUeXBlLm92ZXJ3cml0ZTtcblx0aXNOYXZpZ2FibGU/OiBPdmVycmlkZVR5cGUub3ZlcndyaXRlO1xuXHRlbmFibGVPblNlbGVjdD86IE92ZXJyaWRlVHlwZS5vdmVyd3JpdGU7XG5cdG1lbnU/OiBPdmVycmlkZVR5cGUub3ZlcndyaXRlO1xuXG5cdC8vIENhbiBiZSBvdmVyd3JpdHRlbiBieSBtYW5pZmVzdCBjb25maWd1cmF0aW9uIGFuZCBzaG91bGQgYmUgYWxpZ25lZCBmb3IgYWxsIGFjdGlvbnNcblx0ZW5hYmxlZDogT3ZlcnJpZGVUeXBlLm92ZXJ3cml0ZTtcblx0dmlzaWJsZTogT3ZlcnJpZGVUeXBlLm92ZXJ3cml0ZTtcblx0dmlzaWJsZUZvckNvbnRleHRNZW51PzogT3ZlcnJpZGVUeXBlLm92ZXJ3cml0ZTtcblx0Y29tbWFuZDogT3ZlcnJpZGVUeXBlLm92ZXJ3cml0ZTtcblx0cG9zaXRpb246IE92ZXJyaWRlVHlwZS5vdmVyd3JpdGU7XG59O1xuXG5leHBvcnQgdHlwZSBEYXRhRmllbGRGb3JBY3Rpb25PckFjdGlvbkdyb3VwID0gRGF0YUZpZWxkRm9yQWN0aW9uVHlwZXMgfCBEYXRhRmllbGRGb3JBY3Rpb25Hcm91cFR5cGVzO1xuXG50eXBlIE1lbnVBY3Rpb24gPVxuXHR8IEJhc2VBY3Rpb25cblx0fCB7XG5cdFx0XHR2aXNpYmxlPzogc3RyaW5nW107XG5cdFx0XHRlbmFibGVkPzogc3RyaW5nW107XG5cdFx0XHRtZW51PzogQmFzZUFjdGlvbltdO1xuXHQgIH07XG4vKipcbiAqIE1ldGhvZCBwcm92aWRlcyBhY3Rpb25zIGNvbGxlY3Rpb24gYWZ0ZXIgY2FsY3VsYXRpbmcgdGhlIHZpc2libGUgc2V0dGluZyBmb3IgYWxsIGFjdGlvbnMgb2YgdHlwZSBtZW51IGRlcGVuZGluZyBvbiBpdHMgdmlzaWJsZSBzZXR0aW5nIGFuZCBpdHMgbWVudSBpdGVtcyB2aXNpYmxlIHNldHRpbmdzLlxuICogQHBhcmFtIGFjdGlvbnMgQ29sbGVjdGlvbiBvZiBhY3Rpb25zXG4gKiBAcmV0dXJucyBDb2xsZWN0aW9uIG9mIGFjdGlvbnMgd2l0aCB2aXNpYmxlIHNldHRpbmcgc2V0IGZvciBhY3Rpb25zIG9mIHR5cGUgbWVudVxuICovXG5leHBvcnQgY29uc3QgZ2V0VmlzaWJpbGl0eUVuYWJsZW1lbnRNZW51QWN0aW9ucyA9IChhY3Rpb25zOiBDdXN0b21BY3Rpb25bXSk6IEN1c3RvbUFjdGlvbltdID0+IHtcblx0bGV0IG1lbnVBY3Rpb25Ob3RWaXNpYmxlOiBzdHJpbmcgfCBib29sZWFuLFxuXHRcdG1lbnVBY3Rpb25WaXNpYmxlUGF0aHM6IHN0cmluZ1tdLFxuXHRcdGF0bGVhc3RPbmVNZW51SXRlbXNWaXNpYmxlOiBib29sZWFuLFxuXHRcdG1lbnVJdGVtc1Zpc2libGVQYXRoczogc3RyaW5nW107XG5cdGFjdGlvbnMuZm9yRWFjaCgobWVudUFjdGlvbjogTWVudUFjdGlvbikgPT4ge1xuXHRcdG1lbnVBY3Rpb25Ob3RWaXNpYmxlID0gbWVudUFjdGlvbi52aXNpYmxlPy52YWx1ZU9mKCkgPT09IFwiZmFsc2VcIjtcblx0XHRhdGxlYXN0T25lTWVudUl0ZW1zVmlzaWJsZSA9IGZhbHNlO1xuXHRcdG1lbnVJdGVtc1Zpc2libGVQYXRocyA9IFtdO1xuXHRcdG1lbnVBY3Rpb25WaXNpYmxlUGF0aHMgPSBbXTtcblx0XHRpZiAobWVudUFjdGlvbi52aXNpYmxlICYmICEobWVudUFjdGlvbi52aXNpYmxlLnZhbHVlT2YoKSA9PT0gXCJ0cnVlXCIgfHwgbWVudUFjdGlvbi52aXNpYmxlLnZhbHVlT2YoKSA9PT0gXCJmYWxzZVwiKSkge1xuXHRcdFx0bWVudUFjdGlvblZpc2libGVQYXRocy5wdXNoKG1lbnVBY3Rpb24udmlzaWJsZSBhcyBzdHJpbmcpO1xuXHRcdH1cblx0XHRpZiAobWVudUFjdGlvbj8ubWVudT8ubGVuZ3RoKSB7XG5cdFx0XHRtZW51QWN0aW9uPy5tZW51Py5mb3JFYWNoKChtZW51SXRlbTogQmFzZUFjdGlvbik6IHZvaWQgPT4ge1xuXHRcdFx0XHRjb25zdCBtZW51SXRlbVZpc2libGUgPSBtZW51SXRlbS52aXNpYmxlO1xuXHRcdFx0XHRpZiAobWVudUl0ZW1WaXNpYmxlICYmICh0eXBlb2YgbWVudUl0ZW1WaXNpYmxlID09PSBcImJvb2xlYW5cIiB8fCBtZW51SXRlbVZpc2libGUudmFsdWVPZigpID09PSBcInRydWVcIikpIHtcblx0XHRcdFx0XHRhdGxlYXN0T25lTWVudUl0ZW1zVmlzaWJsZSA9IHRydWU7XG5cdFx0XHRcdH0gZWxzZSBpZiAobWVudUl0ZW1WaXNpYmxlICYmIG1lbnVJdGVtVmlzaWJsZS52YWx1ZU9mKCkgIT09IFwiZmFsc2VcIikge1xuXHRcdFx0XHRcdG1lbnVJdGVtc1Zpc2libGVQYXRocy5wdXNoKG1lbnVJdGVtVmlzaWJsZS52YWx1ZU9mKCkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHRcdGlmIChtZW51QWN0aW9uTm90VmlzaWJsZSkge1xuXHRcdFx0XHQvLyBpZiBtZW51IGlzIHN0YXRpY2FsbHkgdmlzaWJsZSBmYWxzZVxuXHRcdFx0XHRtZW51QWN0aW9uLnZpc2libGUgPSBmYWxzZS50b1N0cmluZygpO1xuXHRcdFx0fSBlbHNlIGlmICghYXRsZWFzdE9uZU1lbnVJdGVtc1Zpc2libGUgJiYgIW1lbnVJdGVtc1Zpc2libGVQYXRocy5sZW5ndGgpIHtcblx0XHRcdFx0Ly8gaWYgYWxsIG1lbnUgaXRlbXMgYXJlIHN0YXRpY2FsbHkgdmlzaWJsZSBmYWxzZVxuXHRcdFx0XHRtZW51QWN0aW9uLnZpc2libGUgPSBmYWxzZS50b1N0cmluZygpO1xuXHRcdFx0fSBlbHNlIGlmIChhdGxlYXN0T25lTWVudUl0ZW1zVmlzaWJsZSAmJiAhbWVudUFjdGlvblZpc2libGVQYXRocy5sZW5ndGgpIHtcblx0XHRcdFx0Ly8gaWYgYXQgbGVhc3Qgb25lIG1lbnUgaXRlbSBpcyBzdGF0aWNhbGx5IHZpc2libGUgdHJ1ZSBhbmQgbm8gdmlzaWJsZSBzZXR0aW5nIGZvciBtZW51XG5cdFx0XHRcdG1lbnVBY3Rpb24udmlzaWJsZSA9IHRydWUudG9TdHJpbmcoKTtcblx0XHRcdH0gZWxzZSBpZiAobWVudUFjdGlvblZpc2libGVQYXRocy5sZW5ndGggfHwgbWVudUl0ZW1zVmlzaWJsZVBhdGhzLmxlbmd0aCkge1xuXHRcdFx0XHQvLyBJZiB0aGUgbWVudSBpcyBzZXQgdG8gaW52aXNpYmxlLCBpdCBzaG91bGQgYmUgaW52aXNpYmxlLCBvdGhlcndpc2UgdGhlIHZpc2liaWxpdHkgc2hvdWxkIGJlIGNhbGN1bGF0ZWQgZnJvbSB0aGUgaXRlbXNcblx0XHRcdFx0Y29uc3QgdmlzaWJsZUV4cHJlc3Npb25zOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj5bXSA9IG1lbnVJdGVtc1Zpc2libGVQYXRocy5tYXAoKG1lbnVJdGVtVmlzaWJsZVBhdGgpID0+XG5cdFx0XHRcdFx0cmVzb2x2ZUJpbmRpbmdTdHJpbmcobWVudUl0ZW1WaXNpYmxlUGF0aCwgXCJib29sZWFuXCIpXG5cdFx0XHRcdCk7XG5cdFx0XHRcdG1lbnVBY3Rpb24udmlzaWJsZSA9IGNvbXBpbGVFeHByZXNzaW9uKFxuXHRcdFx0XHRcdGFuZChyZXNvbHZlQmluZGluZ1N0cmluZygobWVudUFjdGlvbi52aXNpYmxlIGFzIHN0cmluZykgfHwgdHJ1ZSwgXCJib29sZWFuXCIpLCBvciguLi52aXNpYmxlRXhwcmVzc2lvbnMpKVxuXHRcdFx0XHQpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0bWVudUFjdGlvbi52aXNpYmxlID0gKCFtZW51QWN0aW9uTm90VmlzaWJsZSkudG9TdHJpbmcoKTtcblx0XHRcdH1cblx0XHR9XG5cdH0pO1xuXHRyZXR1cm4gYWN0aW9ucztcbn07XG5cbi8qKlxuICogQWRkcyB0aGUgY29sbGFib3JhdGlvbiBjb25kaXRpb24gdG8gYWxsIGFjdGlvbnMgd2l0aCB0eXBlIEZvckFjdGlvbi5cbiAqIFRoaXMgZGlzYWJsZXMgdGhlIGFjdGlvbnMgaWYgdGhlIGNvbGxhYm9yYXRpb24gaXMgZW5hYmxlZCwgYnV0IHRoZSB1c2VyIGRvZXNuJ3QgaGF2ZSB0aGUgYXV0aG9yaXphdGlvbiBmcm9tIHRoZSBiYWNrIGVuZC5cbiAqIEBwYXJhbSBhY3Rpb25zIFRoZSBsaXN0IG9mIGRlZmluaXRpb25zIG9mIHRoZSB0YWJsZSBhY3Rpb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkQ29sbGFib3JhdGlvbkNvbmRpdGlvbihhY3Rpb25zOiBDdXN0b21BY3Rpb25bXSk6IHZvaWQge1xuXHRhY3Rpb25zLmZvckVhY2goKGFjdGlvbikgPT4ge1xuXHRcdGlmIChhY3Rpb24udmlzaWJsZT8udmFsdWVPZigpID09PSBcImZhbHNlXCIpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0aWYgKGFjdGlvbi50eXBlID09PSBcIkZvckFjdGlvblwiKSB7XG5cdFx0XHRhY3Rpb24udmlzaWJsZSA9IGNvbXBpbGVFeHByZXNzaW9uKFxuXHRcdFx0XHRhbmQocmVzb2x2ZUJpbmRpbmdTdHJpbmcoYWN0aW9uLnZpc2libGUgYXMgc3RyaW5nLCBcImJvb2xlYW5cIiksIG5vdChlcXVhbChVSS5oYXNDb2xsYWJvcmF0aW9uQXV0aG9yaXphdGlvbiwgZmFsc2UpKSlcblx0XHRcdCk7XG5cdFx0fVxuXHR9KTtcbn1cblxuLyoqXG4gKiBNYXBzIGFuIGFjdGlvbiBieSBpdHMga2V5LCBiYXNlZCBvbiB0aGUgZ2l2ZW4gYW5ub3RhdGlvbiBhY3Rpb25zIGFuZCBtYW5pZmVzdCBjb25maWd1cmF0aW9uLiBUaGUgcmVzdWx0IGFscmVhZHkgcmVwcmVzZW50cyB0aGVcbiAqIG1lcmdlZCBhY3Rpb24gZnJvbSBib3RoIGNvbmZpZ3VyYXRpb24gc291cmNlcy5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIGFsc28gcmV0dXJucyBhbiBpbmRpY2F0aW9uIHdoZXRoZXIgdGhlIGFjdGlvbiBjYW4gYmUgYSBtZW51IGl0ZW0sIHNheWluZyB3aGV0aGVyIGl0IGlzIHZpc2libGUgb3Igb2YgYSBzcGVjaWZpYyB0eXBlXG4gKiB0aGF0IGFsbG93cyB0aGlzLlxuICogQHBhcmFtIG1hbmlmZXN0QWN0aW9ucyBBY3Rpb25zIGRlZmluZWQgaW4gdGhlIG1hbmlmZXN0XG4gKiBAcGFyYW0gYW5ub3RhdGlvbkFjdGlvbnMgQWN0aW9ucyBkZWZpbmVkIHRocm91Z2ggYW5ub3RhdGlvbnNcbiAqIEBwYXJhbSBhY3Rpb25LZXkgQWN0aW9uIEtleSB0byBsb29rIHVwXG4gKiBAcmV0dXJucyBNZXJnZWQgYWN0aW9uIGFuZCBpbmRpY2F0b3Igd2hldGhlciBpdCBjYW4gYmUgYSBtZW51IGl0ZW1cbiAqL1xuZnVuY3Rpb24gbWFwQWN0aW9uQnlLZXkoXG5cdG1hbmlmZXN0QWN0aW9uczogUmVjb3JkPHN0cmluZywgUGFydGlhbGx5Q29udmVydGVkQ3VzdG9tQWN0aW9uPixcblx0YW5ub3RhdGlvbkFjdGlvbnM6IEJhc2VBY3Rpb25bXSxcblx0YWN0aW9uS2V5OiBzdHJpbmdcbik6IHsgYWN0aW9uOiBCYXNlQWN0aW9uIHwgQ3VzdG9tQWN0aW9uOyBjYW5CZU1lbnVJdGVtOiBib29sZWFuIHwgQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24gfSB7XG5cdGNvbnN0IGFubm90YXRpb25BY3Rpb24gPSBhbm5vdGF0aW9uQWN0aW9ucy5maW5kKChhY3Rpb24pID0+IGFjdGlvbi5rZXkgPT09IGFjdGlvbktleSk7XG5cdGNvbnN0IG1hbmlmZXN0QWN0aW9uID0gbWFuaWZlc3RBY3Rpb25zW2FjdGlvbktleV07XG5cdGxldCByZXN1bHRBY3Rpb246IFBhcnRpYWxseUNvbnZlcnRlZEN1c3RvbUFjdGlvbiB8IEJhc2VBY3Rpb24gPSB7IC4uLihhbm5vdGF0aW9uQWN0aW9uID8/IG1hbmlmZXN0QWN0aW9uKSB9O1xuXG5cdC8vIGFjdGlvbnMgaW5zaWRlIG1lbnVzIGNhbid0IGJlIGZvdW5kIG9uIHRvcCBsZXZlbCwgc28gYXNzaWduIGFjdGlvbnMgZnJvbSBtZW51IHRvIGl0XG5cdGlmIChPYmplY3Qua2V5cyhyZXN1bHRBY3Rpb24pLmxlbmd0aCA9PT0gMCkge1xuXHRcdGFubm90YXRpb25BY3Rpb25zXG5cdFx0XHQuZmlsdGVyKChhY3Rpb25Bbm5vdGF0aW9uOiBCYXNlQWN0aW9uKSA9PiB7XG5cdFx0XHRcdHJldHVybiBhY3Rpb25Bbm5vdGF0aW9uLnR5cGUgPT09IEFjdGlvblR5cGUuTWVudTtcblx0XHRcdH0pXG5cdFx0XHQuZm9yRWFjaCgobWVudUFjdGlvbjogQmFzZUFjdGlvbikgPT4ge1xuXHRcdFx0XHRtZW51QWN0aW9uLm1lbnU/LmZvckVhY2goKG1lbnVJdGVtOiBCYXNlQWN0aW9uKSA9PiB7XG5cdFx0XHRcdFx0aWYgKG1lbnVJdGVtLmtleSA9PT0gYWN0aW9uS2V5KSB7XG5cdFx0XHRcdFx0XHRyZXN1bHRBY3Rpb24gPSBtZW51SXRlbTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cdH1cblxuXHQvLyBBbm5vdGF0aW9uIGFjdGlvbiBhbmQgbWFuaWZlc3QgY29uZmlndXJhdGlvbiBhbHJlYWR5IGhhcyB0byBiZSBtZXJnZWQgaGVyZSBhcyBpbnNlcnRDdXN0b21FbGVtZW50cyBvbmx5IGNvbnNpZGVycyB0b3AtbGV2ZWwgYWN0aW9uc1xuXHRpZiAoYW5ub3RhdGlvbkFjdGlvbikge1xuXHRcdC8vIElmIGVuYWJsZWQgb3IgdmlzaWJsZSBpcyBub3Qgc2V0IGluIHRoZSBtYW5pZmVzdCwgdXNlIHRoZSBhbm5vdGF0aW9uIHZhbHVlIGFuZCBoZW5jZSBkbyBub3Qgb3ZlcndyaXRlXG5cdFx0cmVzdWx0QWN0aW9uLmVuYWJsZWQgPSBtYW5pZmVzdEFjdGlvbj8uZW5hYmxlZCA/PyBhbm5vdGF0aW9uQWN0aW9uLmVuYWJsZWQ7XG5cdFx0cmVzdWx0QWN0aW9uLnZpc2libGUgPSBtYW5pZmVzdEFjdGlvbj8udmlzaWJsZSA/PyBhbm5vdGF0aW9uQWN0aW9uLnZpc2libGU7XG5cblx0XHRmb3IgKGNvbnN0IHByb3AgaW4gbWFuaWZlc3RBY3Rpb24gfHwge30pIHtcblx0XHRcdGNvbnN0IHByb3BLZXkgPSBwcm9wIGFzIGtleW9mIEJhc2VBY3Rpb247XG5cdFx0XHRpZiAoIWFubm90YXRpb25BY3Rpb25bcHJvcEtleV0gJiYgcHJvcEtleSAhPT0gXCJtZW51XCIpIHtcblx0XHRcdFx0cmVzdWx0QWN0aW9uW3Byb3BLZXldID0gbWFuaWZlc3RBY3Rpb25bcHJvcEtleV0gYXMgbmV2ZXI7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Y29uc3QgY2FuQmVNZW51SXRlbSA9XG5cdFx0cmVzdWx0QWN0aW9uPy52aXNpYmxlIHx8XG5cdFx0cmVzdWx0QWN0aW9uPy50eXBlID09PSBBY3Rpb25UeXBlLkRhdGFGaWVsZEZvckFjdGlvbiB8fFxuXHRcdHJlc3VsdEFjdGlvbj8udHlwZSA9PT0gQWN0aW9uVHlwZS5EYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb247XG5cblx0cmV0dXJuIHtcblx0XHRhY3Rpb246IHJlc3VsdEFjdGlvbiBhcyBCYXNlQWN0aW9uIHwgQ3VzdG9tQWN0aW9uLFxuXHRcdGNhbkJlTWVudUl0ZW1cblx0fTtcbn1cblxuLyoqXG4gKiBNYXAgdGhlIGRlZmF1bHQgYWN0aW9uIGtleSBvZiBhIG1lbnUgdG8gaXRzIGFjdHVhbCBhY3Rpb24gY29uZmlndXJhdGlvbiBhbmQgaWRlbnRpZnkgd2hldGhlciB0aGlzIGRlZmF1bHQgYWN0aW9uIGlzIGEgY29tbWFuZC5cbiAqIEBwYXJhbSBtZW51QWN0aW9uIE1lbnUgYWN0aW9uIHRvIG1hcCB0aGUgZGVmYXVsdCBhY3Rpb24gZm9yXG4gKiBAcGFyYW0gbWFuaWZlc3RBY3Rpb25zIEFjdGlvbnMgZGVmaW5lZCBpbiB0aGUgbWFuaWZlc3RcbiAqIEBwYXJhbSBhbm5vdGF0aW9uQWN0aW9ucyBBY3Rpb25zIGRlZmluZWQgdGhyb3VnaCBhbm5vdGF0aW9uc1xuICogQHBhcmFtIGNvbW1hbmRBY3Rpb25zIEFycmF5IG9mIGNvbW1hbmQgYWN0aW9ucyB0byBwdXNoIHRoZSBkZWZhdWx0IGFjdGlvbiB0byBpZiBhcHBsaWNhYmxlXG4gKi9cbmZ1bmN0aW9uIG1hcE1lbnVEZWZhdWx0QWN0aW9uKFxuXHRtZW51QWN0aW9uOiBQYXJ0aWFsbHlDb252ZXJ0ZWRDdXN0b21BY3Rpb24sXG5cdG1hbmlmZXN0QWN0aW9uczogUmVjb3JkPHN0cmluZywgUGFydGlhbGx5Q29udmVydGVkQ3VzdG9tQWN0aW9uPixcblx0YW5ub3RhdGlvbkFjdGlvbnM6IEJhc2VBY3Rpb25bXSxcblx0Y29tbWFuZEFjdGlvbnM6IFJlY29yZDxzdHJpbmcsIEN1c3RvbUFjdGlvbiB8IEJhc2VBY3Rpb24+XG4pOiB2b2lkIHtcblx0Y29uc3QgeyBhY3Rpb24sIGNhbkJlTWVudUl0ZW0gfSA9IG1hcEFjdGlvbkJ5S2V5KG1hbmlmZXN0QWN0aW9ucywgYW5ub3RhdGlvbkFjdGlvbnMsIG1lbnVBY3Rpb24uZGVmYXVsdEFjdGlvbiBhcyBzdHJpbmcpO1xuXG5cdGlmIChjYW5CZU1lbnVJdGVtKSB7XG5cdFx0bWVudUFjdGlvbi5kZWZhdWx0QWN0aW9uID0gYWN0aW9uO1xuXHR9XG5cblx0aWYgKGFjdGlvbi5jb21tYW5kKSB7XG5cdFx0Y29tbWFuZEFjdGlvbnNbYWN0aW9uLmtleV0gPSBhY3Rpb247XG5cdH1cbn1cblxuLyoqXG4gKiBNYXAgdGhlIG1lbnUgaXRlbSBrZXlzIG9mIGEgbWVudSB0byB0aGVpciBhY3R1YWwgYWN0aW9uIGNvbmZpZ3VyYXRpb25zIGFuZCBpZGVudGlmeSB3aGV0aGVyIHRoZXkgYXJlIGNvbW1hbmRzLlxuICogQHBhcmFtIG1lbnVBY3Rpb24gTWVudSBhY3Rpb24gdG8gbWFwIHRoZSBtZW51IGl0ZW1zIGZvclxuICogQHBhcmFtIG1hbmlmZXN0QWN0aW9ucyBBY3Rpb25zIGRlZmluZWQgaW4gdGhlIG1hbmlmZXN0XG4gKiBAcGFyYW0gYW5ub3RhdGlvbkFjdGlvbnMgQWN0aW9ucyBkZWZpbmVkIHRocm91Z2ggYW5ub3RhdGlvbnNcbiAqIEBwYXJhbSBjb21tYW5kQWN0aW9ucyBBcnJheSBvZiBjb21tYW5kIGFjdGlvbnMgdG8gcHVzaCB0aGUgbWVudSBpdGVtIGFjdGlvbnMgdG8gaWYgYXBwbGljYWJsZVxuICovXG5mdW5jdGlvbiBtYXBNZW51SXRlbXMoXG5cdG1lbnVBY3Rpb246IFBhcnRpYWxseUNvbnZlcnRlZEN1c3RvbUFjdGlvbixcblx0bWFuaWZlc3RBY3Rpb25zOiBSZWNvcmQ8c3RyaW5nLCBQYXJ0aWFsbHlDb252ZXJ0ZWRDdXN0b21BY3Rpb24+LFxuXHRhbm5vdGF0aW9uQWN0aW9uczogQmFzZUFjdGlvbltdLFxuXHRjb21tYW5kQWN0aW9uczogUmVjb3JkPHN0cmluZywgQmFzZUFjdGlvbiB8IEN1c3RvbUFjdGlvbj5cbik6IHZvaWQge1xuXHRjb25zdCBtYXBwZWRNZW51SXRlbXM6IChDdXN0b21BY3Rpb24gfCBCYXNlQWN0aW9uKVtdID0gW107XG5cdGNvbnN0IG1hdGNoaW5nQW5ub3RhdGlvbkFjdGlvbiA9IGFubm90YXRpb25BY3Rpb25zLmZpbmQoKGFubm90YXRpb25BY3Rpb24pID0+IGFubm90YXRpb25BY3Rpb24ua2V5ID09PSBtZW51QWN0aW9uLmtleSk7XG5cblx0aWYgKG1lbnVBY3Rpb24ubWVudT8ubGVuZ3RoICE9PSAwKSB7XG5cdFx0Zm9yIChjb25zdCBtZW51SXRlbUtleSBvZiBtZW51QWN0aW9uLm1lbnUgPz8gW10pIHtcblx0XHRcdGNvbnN0IHsgYWN0aW9uLCBjYW5CZU1lbnVJdGVtIH0gPSBtYXBBY3Rpb25CeUtleShtYW5pZmVzdEFjdGlvbnMsIGFubm90YXRpb25BY3Rpb25zLCBtZW51SXRlbUtleSk7XG5cblx0XHRcdGlmIChjYW5CZU1lbnVJdGVtKSB7XG5cdFx0XHRcdG1hcHBlZE1lbnVJdGVtcy5wdXNoKGFjdGlvbik7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChhY3Rpb24uY29tbWFuZCkge1xuXHRcdFx0XHRjb21tYW5kQWN0aW9uc1ttZW51SXRlbUtleV0gPSBhY3Rpb247XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gSWYgbm8gbWVudSBpdGVtcyBhcmUgYXNzaWduZWQgdG8gdGhlIG1hbmlmZXN0LW92ZXJyaWRlLW1lbnUsIGl0IGluaGVyaXRzIHRoZSBpdGVtcyBmcm9tIHRoZSBwcmV2aW91cyBtZW51XG5cdGVsc2UgaWYgKG1hdGNoaW5nQW5ub3RhdGlvbkFjdGlvbikge1xuXHRcdG1hdGNoaW5nQW5ub3RhdGlvbkFjdGlvbi5tZW51Py5mb3JFYWNoKChtZW51SXRlbSkgPT4gbWFwcGVkTWVudUl0ZW1zLnB1c2gobWVudUl0ZW0pKTtcblx0fVxuXG5cdGNvbnN0IG1hcHBlZE1lbnVBY3Rpb24gPSBtZW51QWN0aW9uIGFzIEN1c3RvbUFjdGlvbjtcblx0bWFwcGVkTWVudUFjdGlvbi5tZW51ID0gbWFwcGVkTWVudUl0ZW1zO1xuXG5cdC8vIElmIHRoZSBtZW51IGlzIHNldCB0byBpbnZpc2libGUsIGl0IHNob3VsZCBiZSBpbnZpc2libGUsIG90aGVyd2lzZSB0aGUgdmlzaWJpbGl0eSBzaG91bGQgYmUgY2FsY3VsYXRlZCBmcm9tIHRoZSBpdGVtc1xuXHRjb25zdCB2aXNpYmxlRXhwcmVzc2lvbnM6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPltdID0gbWFwcGVkTWVudUl0ZW1zLm1hcCgobWVudUl0ZW0pID0+XG5cdFx0cmVzb2x2ZUJpbmRpbmdTdHJpbmcobWVudUl0ZW0udmlzaWJsZSBhcyBzdHJpbmcsIFwiYm9vbGVhblwiKVxuXHQpO1xuXHRtYXBwZWRNZW51QWN0aW9uLnZpc2libGUgPSBjb21waWxlRXhwcmVzc2lvbihcblx0XHRhbmQocmVzb2x2ZUJpbmRpbmdTdHJpbmcobWVudUFjdGlvbi52aXNpYmxlIGFzIHN0cmluZywgXCJib29sZWFuXCIpLCBvciguLi52aXNpYmxlRXhwcmVzc2lvbnMpKVxuXHQpO1xufVxuXG4vKipcbiAqIFRyYW5zZm9ybXMgdGhlIGZsYXQgY29sbGVjdGlvbiBvZiBhY3Rpb25zIGludG8gYSBuZXN0ZWQgc3RydWN0dXJlcyBvZiBtZW51cy4gVGhlIHJlc3VsdCBpcyBhIHJlY29yZCBvZiBhY3Rpb25zIHRoYXQgYXJlIGVpdGhlciBtZW51cyBvclxuICogb25lcyB0aGF0IGRvIG5vdCBhcHBlYXIgaW4gbWVudXMgYXMgbWVudSBpdGVtcy4gSXQgYWxzbyByZXR1cm5zIGEgbGlzdCBvZiBhY3Rpb25zIHRoYXQgaGF2ZSBhbiBhc3NpZ25lZCBjb21tYW5kLlxuICpcbiAqIE5vdGUgdGhhdCBtZW51IGl0ZW1zIGFyZSBhbHJlYWR5IHRoZSBtZXJnZWQgcmVzdWx0IG9mIGFubm90YXRpb24gYWN0aW9ucyBhbmQgdGhlaXIgbWFuaWZlc3QgY29uZmlndXJhdGlvbiwgYXMge0BsaW5rIGluc2VydEN1c3RvbUVsZW1lbnRzfVxuICogb25seSBjb25zaWRlcnMgcm9vdC1sZXZlbCBhY3Rpb25zLlxuICogQHBhcmFtIG1hbmlmZXN0QWN0aW9ucyBBY3Rpb25zIGRlZmluZWQgaW4gdGhlIG1hbmlmZXN0XG4gKiBAcGFyYW0gYW5ub3RhdGlvbkFjdGlvbnMgQWN0aW9ucyBkZWZpbmVkIHRocm91Z2ggYW5ub3RhdGlvbnNcbiAqIEByZXR1cm5zIFRoZSB0cmFuc2Zvcm1lZCBhY3Rpb25zIGZyb20gdGhlIG1hbmlmZXN0IGFuZCBhIGxpc3Qgb2YgY29tbWFuZCBhY3Rpb25zXG4gKi9cbmZ1bmN0aW9uIHRyYW5zZm9ybU1lbnVBY3Rpb25zQW5kSWRlbnRpZnlDb21tYW5kcyhcblx0bWFuaWZlc3RBY3Rpb25zOiBSZWNvcmQ8c3RyaW5nLCBQYXJ0aWFsbHlDb252ZXJ0ZWRDdXN0b21BY3Rpb24+LFxuXHRhbm5vdGF0aW9uQWN0aW9uczogQmFzZUFjdGlvbltdXG4pOiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBDdXN0b21BY3Rpb24+PiB7XG5cdGNvbnN0IGFsbEFjdGlvbnM6IFJlY29yZDxzdHJpbmcsIEN1c3RvbUFjdGlvbj4gPSB7fTtcblx0Y29uc3QgYWN0aW9uS2V5c1RvRGVsZXRlOiBzdHJpbmdbXSA9IFtdO1xuXHRjb25zdCBjb21tYW5kQWN0aW9uczogUmVjb3JkPHN0cmluZywgQ3VzdG9tQWN0aW9uPiA9IHt9O1xuXG5cdGZvciAoY29uc3QgYWN0aW9uS2V5IGluIG1hbmlmZXN0QWN0aW9ucykge1xuXHRcdGNvbnN0IG1hbmlmZXN0QWN0aW9uOiBQYXJ0aWFsbHlDb252ZXJ0ZWRDdXN0b21BY3Rpb24gPSBtYW5pZmVzdEFjdGlvbnNbYWN0aW9uS2V5XTtcblxuXHRcdGlmIChtYW5pZmVzdEFjdGlvbi5kZWZhdWx0QWN0aW9uICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdG1hcE1lbnVEZWZhdWx0QWN0aW9uKG1hbmlmZXN0QWN0aW9uLCBtYW5pZmVzdEFjdGlvbnMsIGFubm90YXRpb25BY3Rpb25zLCBjb21tYW5kQWN0aW9ucyk7XG5cdFx0fVxuXG5cdFx0aWYgKG1hbmlmZXN0QWN0aW9uLnR5cGUgPT09IEFjdGlvblR5cGUuTWVudSkge1xuXHRcdFx0bWFwTWVudUl0ZW1zKG1hbmlmZXN0QWN0aW9uLCBtYW5pZmVzdEFjdGlvbnMsIGFubm90YXRpb25BY3Rpb25zLCBjb21tYW5kQWN0aW9ucyk7XG5cblx0XHRcdC8vIE1lbnUgaGFzIG5vIHZpc2libGUgaXRlbXMsIHNvIHJlbW92ZSBpdFxuXHRcdFx0aWYgKCFtYW5pZmVzdEFjdGlvbi5tZW51Py5sZW5ndGgpIHtcblx0XHRcdFx0YWN0aW9uS2V5c1RvRGVsZXRlLnB1c2gobWFuaWZlc3RBY3Rpb24ua2V5KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAobWFuaWZlc3RBY3Rpb24uY29tbWFuZCkge1xuXHRcdFx0Y29tbWFuZEFjdGlvbnNbYWN0aW9uS2V5XSA9IG1hbmlmZXN0QWN0aW9uIGFzIEN1c3RvbUFjdGlvbjtcblx0XHR9XG5cblx0XHRhbGxBY3Rpb25zW2FjdGlvbktleV0gPSBtYW5pZmVzdEFjdGlvbiBhcyBDdXN0b21BY3Rpb247XG5cdH1cblxuXHRhY3Rpb25LZXlzVG9EZWxldGUuZm9yRWFjaCgoYWN0aW9uS2V5OiBzdHJpbmcpID0+IGRlbGV0ZSBhbGxBY3Rpb25zW2FjdGlvbktleV0pO1xuXG5cdHJldHVybiB7XG5cdFx0YWN0aW9uczogYWxsQWN0aW9ucyxcblx0XHRjb21tYW5kQWN0aW9uczogY29tbWFuZEFjdGlvbnNcblx0fTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBiaW5kaW5nIGV4cHJlc3Npb24gZm9yIHRoZSBlbmFibGVtZW50IG9mIGEgbWFuaWZlc3QgYWN0aW9uLlxuICogQHBhcmFtIG1hbmlmZXN0QWN0aW9uIFRoZSBhY3Rpb24gY29uZmlndXJlZCBpbiB0aGUgbWFuaWZlc3RcbiAqIEBwYXJhbSBpc0Fubm90YXRpb25BY3Rpb24gV2hldGhlciB0aGUgYWN0aW9uLCBkZWZpbmVkIGluIG1hbmlmZXN0LCBjb3JyZXNwb25kcyB0byBhbiBleGlzdGluZyBhbm5vdGF0aW9uIGFjdGlvbi5cbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcGFyYW0gZm9yQ29udGV4dE1lbnVcbiAqIEByZXR1cm5zIERldGVybWluZWQgcHJvcGVydHkgdmFsdWUgZm9yIHRoZSBlbmFibGVtZW50XG4gKi9cbmNvbnN0IF9nZXRNYW5pZmVzdEVuYWJsZWQgPSBmdW5jdGlvbiAoXG5cdG1hbmlmZXN0QWN0aW9uOiBNYW5pZmVzdEFjdGlvbixcblx0aXNBbm5vdGF0aW9uQWN0aW9uOiBib29sZWFuLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sXG5cdGZvckNvbnRleHRNZW51ID0gZmFsc2Vcbik6IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIHwgdW5kZWZpbmVkIHtcblx0aWYgKGlzQW5ub3RhdGlvbkFjdGlvbiAmJiBtYW5pZmVzdEFjdGlvbi5lbmFibGVkID09PSB1bmRlZmluZWQpIHtcblx0XHQvLyBJZiBhbm5vdGF0aW9uIGFjdGlvbiBoYXMgbm8gcHJvcGVydHkgZGVmaW5lZCBpbiBtYW5pZmVzdCxcblx0XHQvLyBkbyBub3Qgb3ZlcndyaXRlIGl0IHdpdGggbWFuaWZlc3QgYWN0aW9uJ3MgZGVmYXVsdCB2YWx1ZS5cblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cblx0Y29uc3QgcmVzdWx0ID0gZ2V0TWFuaWZlc3RBY3Rpb25Cb29sZWFuUHJvcGVydHlXaXRoRm9ybWF0dGVyKG1hbmlmZXN0QWN0aW9uLmVuYWJsZWQsIGNvbnZlcnRlckNvbnRleHQpO1xuXG5cdC8vIENvbnNpZGVyIHJlcXVpcmVzU2VsZWN0aW9uIHByb3BlcnR5IHRvIGluY2x1ZGUgc2VsZWN0ZWRDb250ZXh0cyBpbiB0aGUgYmluZGluZyBleHByZXNzaW9uXG5cdGNvbnN0IGludGVybmFsTW9kZWxQcm9wZXJ0eSA9ICFmb3JDb250ZXh0TWVudSA/IFwibnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzXCIgOiBcImNvbnRleHRtZW51L251bWJlck9mU2VsZWN0ZWRDb250ZXh0c1wiO1xuXHRyZXR1cm4gY29tcGlsZUV4cHJlc3Npb24oXG5cdFx0aWZFbHNlKFxuXHRcdFx0bWFuaWZlc3RBY3Rpb24ucmVxdWlyZXNTZWxlY3Rpb24gPT09IHRydWUsXG5cdFx0XHRpZkVsc2UoXG5cdFx0XHRcdG1hbmlmZXN0QWN0aW9uLmVuYWJsZU9uU2VsZWN0ID09PSBcInNpbmdsZVwiLFxuXHRcdFx0XHRhbmQoZXF1YWwocGF0aEluTW9kZWwoaW50ZXJuYWxNb2RlbFByb3BlcnR5LCBcImludGVybmFsXCIpLCAxKSwgcmVzdWx0KSxcblx0XHRcdFx0YW5kKGdyZWF0ZXJPckVxdWFsKHBhdGhJbk1vZGVsKGludGVybmFsTW9kZWxQcm9wZXJ0eSwgXCJpbnRlcm5hbFwiKSwgMSksIHJlc3VsdClcblx0XHRcdCksXG5cdFx0XHRyZXN1bHRcblx0XHQpXG5cdCk7XG59O1xuXG4vKipcbiAqIEdldHMgdGhlIGJpbmRpbmcgZXhwcmVzc2lvbiBmb3IgdGhlIHZpc2liaWxpdHkgb2YgYSBtYW5pZmVzdCBhY3Rpb24uXG4gKiBAcGFyYW0gbWFuaWZlc3RBY3Rpb24gVGhlIGFjdGlvbiBjb25maWd1cmVkIGluIHRoZSBtYW5pZmVzdFxuICogQHBhcmFtIGlzQW5ub3RhdGlvbkFjdGlvbiBXaGV0aGVyIHRoZSBhY3Rpb24sIGRlZmluZWQgaW4gdGhlIG1hbmlmZXN0LCBjb3JyZXNwb25kcyB0byBhbiBleGlzdGluZyBhbm5vdGF0aW9uIGFjdGlvbi5cbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcGFyYW0gZm9yQ29udGV4dE1lbnVcbiAqIEByZXR1cm5zIERldGVybWluZWQgcHJvcGVydHkgdmFsdWUgZm9yIHRoZSB2aXNpYmlsaXR5XG4gKi9cbmNvbnN0IF9nZXRNYW5pZmVzdFZpc2libGUgPSBmdW5jdGlvbiAoXG5cdG1hbmlmZXN0QWN0aW9uOiBNYW5pZmVzdEFjdGlvbixcblx0aXNBbm5vdGF0aW9uQWN0aW9uOiBib29sZWFuLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sXG5cdGZvckNvbnRleHRNZW51ID0gZmFsc2Vcbik6IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIHwgdW5kZWZpbmVkIHtcblx0aWYgKGlzQW5ub3RhdGlvbkFjdGlvbiAmJiBtYW5pZmVzdEFjdGlvbi52aXNpYmxlID09PSB1bmRlZmluZWQpIHtcblx0XHQvLyBJZiBhbm5vdGF0aW9uIGFjdGlvbiBoYXMgbm8gcHJvcGVydHkgZGVmaW5lZCBpbiBtYW5pZmVzdCxcblx0XHQvLyBkbyBub3Qgb3ZlcndyaXRlIGl0IHdpdGggbWFuaWZlc3QgYWN0aW9uJ3MgZGVmYXVsdCB2YWx1ZS5cblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cblx0bGV0IHJlc3VsdCA9IGdldE1hbmlmZXN0QWN0aW9uQm9vbGVhblByb3BlcnR5V2l0aEZvcm1hdHRlcihtYW5pZmVzdEFjdGlvbi52aXNpYmxlLCBjb252ZXJ0ZXJDb250ZXh0KTtcblx0Ly8gRm9yIHRoZSBjb250ZXh0IG1lbnUsIHRoZSB2aXNpYmlsaXR5IHNob3VsZCBhbHNvIGNvbnNpZGVyIHRoZSAnaW5hY3RpdmVDb250ZXh0JyBwcm9wZXJ0eTpcblx0Ly8gb25seSB3aGVuIGF0IGxlYXN0IG9uZSBzZWxlY3RlZCBjb250ZXh0IGlzIGFjdGl2ZSAoaS5lLiBcImNvbnRleHRtZW51L2luYWN0aXZlQ29udGV4dFwiIGlzIGZhbHNlKSwgdGhlIGFjdGlvbiBzaG91bGQgYmUgdmlzaWJsZSBpbiB0aGUgY29udGV4dCBtZW51XG5cdC8vIFRoaXMgaXMgb25seSByZWxldmFudCB3aGVuIHRoZSB0YWJsZSBtYW5pZmVzdCBzZXR0aW5nIFwiY3JlYXRpb25Nb2RlXCIgaXMgXCJJbmxpbmVDcmVhdGlvblJvd3NcIlxuXHRyZXN1bHQgPSBmb3JDb250ZXh0TWVudSA/IGFuZChyZXN1bHQsIGVxdWFsKHBhdGhJbk1vZGVsKFwiY29udGV4dG1lbnUvaW5hY3RpdmVDb250ZXh0XCIsIFwiaW50ZXJuYWxcIiksIGZhbHNlKSkgOiByZXN1bHQ7XG5cdHJldHVybiBjb21waWxlRXhwcmVzc2lvbihyZXN1bHQpO1xufTtcblxudHlwZSBQYXJ0aWFsbHlDb252ZXJ0ZWRDdXN0b21BY3Rpb24gPSBPbWl0PEN1c3RvbUFjdGlvbiwgXCJtZW51XCI+ICYgeyBtZW51OiBzdHJpbmdbXSB8IHVuZGVmaW5lZCB9O1xuXG4vKipcbiAqIEFzIHNvbWUgcHJvcGVydGllcyBzaG91bGQgbm90IGJlIG92ZXJyaWRhYmxlIGJ5IHRoZSBtYW5pZmVzdCwgbWFrZSBzdXJlIHRoYXQgdGhlIG1hbmlmZXN0IGNvbmZpZ3VyYXRpb24gZ2V0cyB0aGUgYW5ub3RhdGlvbiB2YWx1ZXMgZm9yIHRoZXNlLlxuICogQHBhcmFtIG1hbmlmZXN0QWN0aW9uIEFjdGlvbiBkZWZpbmVkIGluIHRoZSBtYW5pZmVzdFxuICogQHBhcmFtIGFubm90YXRpb25BY3Rpb24gQWN0aW9uIGRlZmluZWQgdGhyb3VnaCBhbm5vdGF0aW9uc1xuICovXG5mdW5jdGlvbiBvdmVycmlkZU1hbmlmZXN0Q29uZmlndXJhdGlvbldpdGhBbm5vdGF0aW9uKG1hbmlmZXN0QWN0aW9uOiBQYXJ0aWFsbHlDb252ZXJ0ZWRDdXN0b21BY3Rpb24sIGFubm90YXRpb25BY3Rpb24/OiBCYXNlQWN0aW9uKTogdm9pZCB7XG5cdGlmICghYW5ub3RhdGlvbkFjdGlvbikge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdC8vIERvIG5vdCBvdmVycmlkZSB0aGUgJ3R5cGUnIGdpdmVuIGluIGFuIGFubm90YXRpb24gYWN0aW9uXG5cdG1hbmlmZXN0QWN0aW9uLnR5cGUgPSBhbm5vdGF0aW9uQWN0aW9uLnR5cGU7XG5cdG1hbmlmZXN0QWN0aW9uLmFubm90YXRpb25QYXRoID0gYW5ub3RhdGlvbkFjdGlvbi5hbm5vdGF0aW9uUGF0aDtcblx0bWFuaWZlc3RBY3Rpb24ucHJlc3MgPSBhbm5vdGF0aW9uQWN0aW9uLnByZXNzO1xuXG5cdC8vIE9ubHkgdXNlIHRoZSBhbm5vdGF0aW9uIHZhbHVlcyBmb3IgZW5hYmxlbWVudCBhbmQgdmlzaWJpbGl0eSBpZiBub3Qgc2V0IGluIHRoZSBtYW5pZmVzdFxuXHRtYW5pZmVzdEFjdGlvbi5lbmFibGVkID0gbWFuaWZlc3RBY3Rpb24uZW5hYmxlZCA/PyBhbm5vdGF0aW9uQWN0aW9uLmVuYWJsZWQ7XG5cdG1hbmlmZXN0QWN0aW9uLnZpc2libGUgPSBtYW5pZmVzdEFjdGlvbi52aXNpYmxlID8/IGFubm90YXRpb25BY3Rpb24udmlzaWJsZTtcblx0bWFuaWZlc3RBY3Rpb24udmlzaWJsZUZvckNvbnRleHRNZW51ID0gbWFuaWZlc3RBY3Rpb24udmlzaWJsZUZvckNvbnRleHRNZW51ID8/IGFubm90YXRpb25BY3Rpb24udmlzaWJsZUZvckNvbnRleHRNZW51O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgdGhlIGFjdGlvbiBjb25maWd1cmF0aW9uIGJhc2VkIG9uIHRoZSBtYW5pZmVzdCBzZXR0aW5ncy5cbiAqIEBwYXJhbSBtYW5pZmVzdEFjdGlvbnMgVGhlIG1hbmlmZXN0IGFjdGlvbnNcbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHBhcmFtIGFubm90YXRpb25BY3Rpb25zIFRoZSBhbm5vdGF0aW9uIGFjdGlvbnMgZGVmaW5pdGlvblxuICogQHBhcmFtIG5hdmlnYXRpb25TZXR0aW5ncyBUaGUgbmF2aWdhdGlvbiBzZXR0aW5nc1xuICogQHBhcmFtIGNvbnNpZGVyTmF2aWdhdGlvblNldHRpbmdzIFRoZSBuYXZpZ2F0aW9uIHNldHRpbmdzIHRvIGJlIGNvbnNpZGVyZWRcbiAqIEBwYXJhbSBoaWRkZW5BY3Rpb25zIEFjdGlvbnMgdGhhdCBhcmUgY29uZmlndXJlZCBhcyBoaWRkZW4gKGFkZGl0aW9uYWwgdG8gdGhlIHZpc2libGUgcHJvcGVydHkpXG4gKiBAcGFyYW0gZmFjZXROYW1lIFRoZSBmYWNldCB3aGVyZSBhbiBhY3Rpb24gaXMgZGlzcGxheWVkIGlmIGl0IGlzIGlubGluZVxuICogQHJldHVybnMgVGhlIGFjdGlvbnMgZnJvbSB0aGUgbWFuaWZlc3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEFjdGlvbnNGcm9tTWFuaWZlc3QoXG5cdG1hbmlmZXN0QWN0aW9uczogUmVjb3JkPHN0cmluZywgTWFuaWZlc3RBY3Rpb24+IHwgdW5kZWZpbmVkLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sXG5cdGFubm90YXRpb25BY3Rpb25zPzogQmFzZUFjdGlvbltdLFxuXHRuYXZpZ2F0aW9uU2V0dGluZ3M/OiBOYXZpZ2F0aW9uU2V0dGluZ3NDb25maWd1cmF0aW9uLFxuXHRjb25zaWRlck5hdmlnYXRpb25TZXR0aW5ncz86IGJvb2xlYW4sXG5cdGhpZGRlbkFjdGlvbnM/OiBCYXNlQWN0aW9uW10sXG5cdGZhY2V0TmFtZT86IHN0cmluZ1xuKTogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgQ3VzdG9tQWN0aW9uPj4ge1xuXHRjb25zdCBhY3Rpb25zOiBSZWNvcmQ8c3RyaW5nLCBQYXJ0aWFsbHlDb252ZXJ0ZWRDdXN0b21BY3Rpb24+ID0ge307XG5cdGZvciAoY29uc3QgYWN0aW9uS2V5IGluIG1hbmlmZXN0QWN0aW9ucykge1xuXHRcdGNvbnN0IG1hbmlmZXN0QWN0aW9uOiBNYW5pZmVzdEFjdGlvbiA9IG1hbmlmZXN0QWN0aW9uc1thY3Rpb25LZXldO1xuXHRcdGNvbnN0IGxhc3REb3RJbmRleCA9IG1hbmlmZXN0QWN0aW9uLnByZXNzPy5sYXN0SW5kZXhPZihcIi5cIikgfHwgLTE7XG5cdFx0bGV0IGFubm90YXRpb25BY3Rpb246IEJhc2VBY3Rpb24gfCB1bmRlZmluZWQ7XG5cblx0XHRpZiAoYW5ub3RhdGlvbkFjdGlvbnMpIHtcblx0XHRcdGZvciAoY29uc3QgYWN0aW9uIG9mIGFubm90YXRpb25BY3Rpb25zKSB7XG5cdFx0XHRcdC8vIFN1YlNlY3Rpb24udHMjY3JlYXRlRm9ybUFjdGlvblJlZHVjZXIgdXNlcyBpbnNlcnRDdXN0b21FbGVtZW50cyB3aGljaCByZXN1bHRzIGluIGFubm90YXRpb24gYWN0aW9ucyBtaXhpbmcgdXAgd2l0aCBtYW5pZmVzdCBhY3Rpb25cblx0XHRcdFx0Ly8gdGhpcyBpcyB3aHkgd2UgbWF5IGZpbmQgYW4gYWN0aW9uIHRoYXQgaGFzIGEgQ3VzdG9tQWN0aW9uIHByZWZpeFxuXHRcdFx0XHRpZiAoYWN0aW9uLmlkPy5zdGFydHNXaXRoKFwiQ3VzdG9tQWN0aW9uOjpcIikpIHtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoYWN0aW9uLmtleSA9PT0gYWN0aW9uS2V5KSB7XG5cdFx0XHRcdFx0YW5ub3RhdGlvbkFjdGlvbiA9IGFjdGlvbjtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fSBlbHNlIGlmIChhY3Rpb24udHlwZSA9PT0gXCJNZW51XCIpIHtcblx0XHRcdFx0XHQvLyBJZiBub3QgZm91bmQsIGNoZWNrIGluc2lkZSBtZW51c1xuXHRcdFx0XHRcdGFubm90YXRpb25BY3Rpb24gPSBhY3Rpb24ubWVudT8uZmluZCgobWVudUl0ZW06IEJhc2VBY3Rpb24pID0+IHtcblx0XHRcdFx0XHRcdHJldHVybiBtZW51SXRlbS5rZXkgPT09IGFjdGlvbktleTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRpZiAoYW5ub3RhdGlvbkFjdGlvbikge1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gVG8gaWRlbnRpZnkgdGhlIGFubm90YXRpb24gYWN0aW9uIHByb3BlcnR5IG92ZXJ3cml0ZSB2aWEgbWFuaWZlc3QgdXNlLWNhc2UuXG5cdFx0Y29uc3QgaXNBbm5vdGF0aW9uQWN0aW9uID0gISFhbm5vdGF0aW9uQWN0aW9uO1xuXHRcdGlmIChtYW5pZmVzdEFjdGlvbi5mYWNldE5hbWUpIHtcblx0XHRcdGZhY2V0TmFtZSA9IG1hbmlmZXN0QWN0aW9uLmZhY2V0TmFtZTtcblx0XHR9XG5cblx0XHRhY3Rpb25zW2FjdGlvbktleV0gPSB7XG5cdFx0XHRpZDogYW5ub3RhdGlvbkFjdGlvbiA/IGFjdGlvbktleSA6IGdldEN1c3RvbUFjdGlvbklEKGFjdGlvbktleSksXG5cdFx0XHR0eXBlOiBtYW5pZmVzdEFjdGlvbi5tZW51ID8gQWN0aW9uVHlwZS5NZW51IDogQWN0aW9uVHlwZS5EZWZhdWx0LFxuXHRcdFx0dmlzaWJsZTogX2dldE1hbmlmZXN0VmlzaWJsZShtYW5pZmVzdEFjdGlvbiwgaXNBbm5vdGF0aW9uQWN0aW9uLCBjb252ZXJ0ZXJDb250ZXh0KSxcblx0XHRcdHZpc2libGVGb3JDb250ZXh0TWVudTogX2dldE1hbmlmZXN0VmlzaWJsZShtYW5pZmVzdEFjdGlvbiwgaXNBbm5vdGF0aW9uQWN0aW9uLCBjb252ZXJ0ZXJDb250ZXh0LCB0cnVlKSxcblx0XHRcdGVuYWJsZWQ6IF9nZXRNYW5pZmVzdEVuYWJsZWQobWFuaWZlc3RBY3Rpb24sIGlzQW5ub3RhdGlvbkFjdGlvbiwgY29udmVydGVyQ29udGV4dCksXG5cdFx0XHRlbmFibGVkRm9yQ29udGV4dE1lbnU6IF9nZXRNYW5pZmVzdEVuYWJsZWQobWFuaWZlc3RBY3Rpb24sIGlzQW5ub3RhdGlvbkFjdGlvbiwgY29udmVydGVyQ29udGV4dCwgdHJ1ZSksXG5cdFx0XHRoYW5kbGVyTW9kdWxlOiBtYW5pZmVzdEFjdGlvbi5wcmVzcyAmJiBtYW5pZmVzdEFjdGlvbi5wcmVzcy5zdWJzdHJpbmcoMCwgbGFzdERvdEluZGV4KS5yZXBsYWNlKC9cXC4vZ2ksIFwiL1wiKSxcblx0XHRcdGhhbmRsZXJNZXRob2Q6IG1hbmlmZXN0QWN0aW9uLnByZXNzICYmIG1hbmlmZXN0QWN0aW9uLnByZXNzLnN1YnN0cmluZyhsYXN0RG90SW5kZXggKyAxKSxcblx0XHRcdHByZXNzOiBtYW5pZmVzdEFjdGlvbi5wcmVzcyxcblx0XHRcdHRleHQ6IG1hbmlmZXN0QWN0aW9uLnRleHQsXG5cdFx0XHRub1dyYXA6IG1hbmlmZXN0QWN0aW9uLl9fbm9XcmFwLFxuXHRcdFx0a2V5OiByZXBsYWNlU3BlY2lhbENoYXJzKGFjdGlvbktleSksXG5cdFx0XHRlbmFibGVPblNlbGVjdDogbWFuaWZlc3RBY3Rpb24uZW5hYmxlT25TZWxlY3QsXG5cdFx0XHRkZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb246IG1hbmlmZXN0QWN0aW9uLmRlZmF1bHRWYWx1ZXNGdW5jdGlvbixcblx0XHRcdHBvc2l0aW9uOiB7XG5cdFx0XHRcdGFuY2hvcjogbWFuaWZlc3RBY3Rpb24ucG9zaXRpb24/LmFuY2hvcixcblx0XHRcdFx0cGxhY2VtZW50OiBtYW5pZmVzdEFjdGlvbi5wb3NpdGlvbiA9PT0gdW5kZWZpbmVkID8gUGxhY2VtZW50LkFmdGVyIDogbWFuaWZlc3RBY3Rpb24ucG9zaXRpb24ucGxhY2VtZW50XG5cdFx0XHR9LFxuXHRcdFx0aXNOYXZpZ2FibGU6IGlzQWN0aW9uTmF2aWdhYmxlKG1hbmlmZXN0QWN0aW9uLCBuYXZpZ2F0aW9uU2V0dGluZ3MsIGNvbnNpZGVyTmF2aWdhdGlvblNldHRpbmdzKSxcblx0XHRcdGNvbW1hbmQ6IG1hbmlmZXN0QWN0aW9uLmNvbW1hbmQsXG5cdFx0XHRyZXF1aXJlc1NlbGVjdGlvbjogbWFuaWZlc3RBY3Rpb24ucmVxdWlyZXNTZWxlY3Rpb24gPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogbWFuaWZlc3RBY3Rpb24ucmVxdWlyZXNTZWxlY3Rpb24sXG5cdFx0XHRlbmFibGVBdXRvU2Nyb2xsOiBlbmFibGVBdXRvU2Nyb2xsKG1hbmlmZXN0QWN0aW9uKSxcblx0XHRcdG1lbnU6IG1hbmlmZXN0QWN0aW9uLm1lbnUgPz8gKGFubm90YXRpb25BY3Rpb24/LnR5cGUgPT09IEFjdGlvblR5cGUuTWVudSA/IFtdIDogdW5kZWZpbmVkKSxcblx0XHRcdGZhY2V0TmFtZTogbWFuaWZlc3RBY3Rpb24uaW5saW5lID8gZmFjZXROYW1lIDogdW5kZWZpbmVkLFxuXHRcdFx0ZGVmYXVsdEFjdGlvbjogbWFuaWZlc3RBY3Rpb24uZGVmYXVsdEFjdGlvbixcblx0XHRcdGlzQUlPcGVyYXRpb246IG1hbmlmZXN0QWN0aW9uPy5pc0FJT3BlcmF0aW9uID8/IHVuZGVmaW5lZFxuXHRcdH07XG5cblx0XHRvdmVycmlkZU1hbmlmZXN0Q29uZmlndXJhdGlvbldpdGhBbm5vdGF0aW9uKGFjdGlvbnNbYWN0aW9uS2V5XSwgYW5ub3RhdGlvbkFjdGlvbik7XG5cdH1cblxuXHRyZXR1cm4gdHJhbnNmb3JtTWVudUFjdGlvbnNBbmRJZGVudGlmeUNvbW1hbmRzKGFjdGlvbnMsIGFubm90YXRpb25BY3Rpb25zID8/IFtdKTtcbn1cblxuLyoqXG4gKiBHZXRzIGEgYmluZGluZyBleHByZXNzaW9uIHJlcHJlc2VudGluZyBhIEJvb2xlYW4gbWFuaWZlc3QgcHJvcGVydHkgdGhhdCBjYW4gZWl0aGVyIGJlIHJlcHJlc2VudGVkIGJ5IGEgc3RhdGljIHZhbHVlLCBhIGJpbmRpbmcgc3RyaW5nLFxuICogb3IgYSBydW50aW1lIGZvcm1hdHRlciBmdW5jdGlvbi5cbiAqIEBwYXJhbSBwcm9wZXJ0eVZhbHVlIFN0cmluZyByZXByZXNlbnRpbmcgdGhlIGNvbmZpZ3VyZWQgcHJvcGVydHkgdmFsdWVcbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcmV0dXJucyBBIGJpbmRpbmcgZXhwcmVzc2lvbiByZXByZXNlbnRpbmcgdGhlIHByb3BlcnR5XG4gKi9cbmZ1bmN0aW9uIGdldE1hbmlmZXN0QWN0aW9uQm9vbGVhblByb3BlcnR5V2l0aEZvcm1hdHRlcihcblx0cHJvcGVydHlWYWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkIHwgYm9vbGVhbixcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+XG4pOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj4ge1xuXHRjb25zdCByZXNvbHZlZEJpbmRpbmcgPSByZXNvbHZlQmluZGluZ1N0cmluZzxib29sZWFuIHwgc3RyaW5nPihwcm9wZXJ0eVZhbHVlIGFzIHN0cmluZywgXCJib29sZWFuXCIpO1xuXHRsZXQgcmVzdWx0OiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj47XG5cdGlmIChpc0NvbnN0YW50KHJlc29sdmVkQmluZGluZykgJiYgcmVzb2x2ZWRCaW5kaW5nLnZhbHVlID09PSB1bmRlZmluZWQpIHtcblx0XHQvLyBObyBwcm9wZXJ0eSB2YWx1ZSBjb25maWd1cmVkIGluIG1hbmlmZXN0IGZvciB0aGUgY3VzdG9tIGFjdGlvbiAtLT4gZGVmYXVsdCB2YWx1ZSBpcyB0cnVlXG5cdFx0cmVzdWx0ID0gY29uc3RhbnQodHJ1ZSk7XG5cdH0gZWxzZSBpZiAoaXNDb25zdGFudChyZXNvbHZlZEJpbmRpbmcpICYmIHR5cGVvZiByZXNvbHZlZEJpbmRpbmcudmFsdWUgPT09IFwic3RyaW5nXCIpIHtcblx0XHQvLyBUaGVuIGl0J3MgYSBtb2R1bGUtbWV0aG9kIHJlZmVyZW5jZSBcInNhcC54eHgueXl5LmRvU29tZXRoaW5nXCJcblx0XHRjb25zdCBtZXRob2RQYXRoID0gcmVzb2x2ZWRCaW5kaW5nLnZhbHVlO1xuXHRcdC8vIEZJWE1FOiBUaGUgY3VzdG9tIFwiaXNFbmFibGVkXCIgY2hlY2sgZG9lcyBub3QgdHJpZ2dlciAoYmVjYXVzZSBub25lIG9mIHRoZSBib3VuZCB2YWx1ZXMgY2hhbmdlcylcblx0XHRyZXN1bHQgPSBmb3JtYXRSZXN1bHQoXG5cdFx0XHRbcGF0aEluTW9kZWw8Vmlldz4oXCIvXCIsIFwiJHZpZXdcIiksIG1ldGhvZFBhdGgsIHBhdGhJbk1vZGVsPENvbnRleHRbXT4oXCJzZWxlY3RlZENvbnRleHRzXCIsIFwiaW50ZXJuYWxcIildLFxuXHRcdFx0ZnBtRm9ybWF0dGVyLmN1c3RvbUJvb2xlYW5Qcm9wZXJ0eUNoZWNrLFxuXHRcdFx0Y29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCkuY29udGV4dExvY2F0aW9uPy50YXJnZXRFbnRpdHlUeXBlIHx8IGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5VHlwZSgpXG5cdFx0KTtcblx0fSBlbHNlIHtcblx0XHQvLyB0aGVuIGl0J3MgYSBiaW5kaW5nXG5cdFx0cmVzdWx0ID0gcmVzb2x2ZWRCaW5kaW5nIGFzIEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPjtcblx0fVxuXG5cdHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBjb25zdCByZW1vdmVEdXBsaWNhdGVBY3Rpb25zID0gKGFjdGlvbnM6IEN1c3RvbUFjdGlvbltdKTogQ3VzdG9tQWN0aW9uW10gPT4ge1xuXHRsZXQgb01lbnVJdGVtS2V5czogUmVjb3JkPHN0cmluZywgYm9vbGVhbj4gPSB7fTtcblx0YWN0aW9ucy5mb3JFYWNoKChhY3Rpb24pID0+IHtcblx0XHRpZiAoYWN0aW9uPy5tZW51Py5sZW5ndGgpIHtcblx0XHRcdGNvbnN0IGFjdGlvbk1lbnUgPSBhY3Rpb24ubWVudTtcblx0XHRcdG9NZW51SXRlbUtleXMgPSBhY3Rpb25NZW51LnJlZHVjZSgoaXRlbTogUmVjb3JkPHN0cmluZywgYm9vbGVhbj4sIHsga2V5IH0pID0+IHtcblx0XHRcdFx0aWYgKGtleSAmJiAhaXRlbVtrZXldKSB7XG5cdFx0XHRcdFx0aXRlbVtrZXldID0gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gaXRlbTtcblx0XHRcdH0sIG9NZW51SXRlbUtleXMpO1xuXHRcdH1cblx0fSk7XG5cdHJldHVybiBhY3Rpb25zLmZpbHRlcigoYWN0aW9uKSA9PiAhb01lbnVJdGVtS2V5c1thY3Rpb24ua2V5XSk7XG59O1xuXG4vKipcbiAqIE1ldGhvZCB0byBkZXRlcm1pbmUgdGhlIHZhbHVlIG9mIHRoZSAnZW5hYmxlZCcgcHJvcGVydHkgb2YgYW4gYW5ub3RhdGlvbi1iYXNlZCBhY3Rpb24uXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCBUaGUgaW5zdGFuY2Ugb2YgdGhlIGNvbnZlcnRlciBjb250ZXh0XG4gKiBAcGFyYW0gYWN0aW9uVGFyZ2V0IFRoZSBpbnN0YW5jZSBvZiB0aGUgYWN0aW9uXG4gKiBAcGFyYW0gcGF0aEZyb21Db250ZXh0TG9jYXRpb24gSXMgdGhlIGJpbmRpbmcgcGF0aCBjYWxjdWxhdGVkICBmcm9tIHRoZSBjb252ZXJ0ZXIgY29udGV4dCBsb2NhdGlvblxuICogQHJldHVybnMgVGhlIGJpbmRpbmcgZXhwcmVzc2lvbiBmb3IgdGhlICdlbmFibGVkJyBwcm9wZXJ0eSBvZiB0aGUgYWN0aW9uIGJ1dHRvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEVuYWJsZWRGb3JBbm5vdGF0aW9uQWN0aW9uKFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sXG5cdGFjdGlvblRhcmdldDogQWN0aW9uIHwgdW5kZWZpbmVkLFxuXHRwYXRoRnJvbUNvbnRleHRMb2NhdGlvbiA9IGZhbHNlXG4pOiBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiB7XG5cdGlmIChhY3Rpb25UYXJnZXQ/LmFubm90YXRpb25zLkNvcmU/Lk9wZXJhdGlvbkF2YWlsYWJsZSkge1xuXHRcdGNvbnN0IGRhdGFNb2RlbE9iamVjdFBhdGggPSBjb252ZXJ0ZXJDb250ZXh0LmdldERhdGFNb2RlbE9iamVjdFBhdGgoKTtcblx0XHRsZXQgaXNFbmFibGVkRXhwID0gZ2V0QWN0aW9uRW5hYmxlZEV4cHJlc3Npb24oXG5cdFx0XHRhY3Rpb25UYXJnZXQsXG5cdFx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldENvbnZlcnRlZFR5cGVzKCksXG5cdFx0XHRkYXRhTW9kZWxPYmplY3RQYXRoLFxuXHRcdFx0cGF0aEZyb21Db250ZXh0TG9jYXRpb25cblx0XHQpO1xuXHRcdGNvbnN0IGNvbGxhYm9yYXRpb25PblJvb3QgPVxuXHRcdFx0TW9kZWxIZWxwZXIuaXNDb2xsYWJvcmF0aW9uRHJhZnRTdXBwb3J0ZWRGcm9tQ29udmVydGVyQ29udGV4dChjb252ZXJ0ZXJDb250ZXh0KSAmJlxuXHRcdFx0TW9kZWxIZWxwZXIuZ2V0RHJhZnRSb290KGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0KCkpO1xuXHRcdGlmIChjb2xsYWJvcmF0aW9uT25Sb290KSB7XG5cdFx0XHRpc0VuYWJsZWRFeHAgPSBhbmQoaXNFbmFibGVkRXhwLCBVSS5oYXNDb2xsYWJvcmF0aW9uQXV0aG9yaXphdGlvbik7XG5cdFx0fVxuXHRcdHJldHVybiBjb21waWxlRXhwcmVzc2lvbihpc0VuYWJsZWRFeHApO1xuXHR9XG5cdHJldHVybiBcInRydWVcIjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNlbWFudGljT2JqZWN0TWFwcGluZyhtYXBwaW5ncz86IFNlbWFudGljT2JqZWN0TWFwcGluZ1R5cGVbXSk6IE1ldGFNb2RlbFR5cGU8U2VtYW50aWNPYmplY3RNYXBwaW5nVHlwZT5bXSB7XG5cdHJldHVybiBtYXBwaW5nc1xuXHRcdD8gbWFwcGluZ3MubWFwKChtYXBwaW5nKSA9PiB7XG5cdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0TG9jYWxQcm9wZXJ0eToge1xuXHRcdFx0XHRcdFx0JFByb3BlcnR5UGF0aDogbWFwcGluZy5Mb2NhbFByb3BlcnR5LnZhbHVlXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRTZW1hbnRpY09iamVjdFByb3BlcnR5OiBtYXBwaW5nLlNlbWFudGljT2JqZWN0UHJvcGVydHkudG9TdHJpbmcoKVxuXHRcdFx0XHR9O1xuXHRcdCAgfSlcblx0XHQ6IFtdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNBY3Rpb25OYXZpZ2FibGUoXG5cdGFjdGlvbjogTWFuaWZlc3RBY3Rpb24gfCBDdXN0b21EZWZpbmVkVGFibGVDb2x1bW5Gb3JPdmVycmlkZSB8IHVuZGVmaW5lZCxcblx0bmF2aWdhdGlvblNldHRpbmdzPzogTmF2aWdhdGlvblNldHRpbmdzQ29uZmlndXJhdGlvbixcblx0Y29uc2lkZXJOYXZpZ2F0aW9uU2V0dGluZ3M/OiBib29sZWFuXG4pOiBib29sZWFuIHtcblx0bGV0IGJJc05hdmlnYXRpb25Db25maWd1cmVkID0gdHJ1ZTtcblx0aWYgKGNvbnNpZGVyTmF2aWdhdGlvblNldHRpbmdzKSB7XG5cdFx0Y29uc3QgZGV0YWlsT3JEaXNwbGF5ID0gbmF2aWdhdGlvblNldHRpbmdzICYmIChuYXZpZ2F0aW9uU2V0dGluZ3MuZGV0YWlsIHx8IG5hdmlnYXRpb25TZXR0aW5ncy5kaXNwbGF5KTtcblx0XHRiSXNOYXZpZ2F0aW9uQ29uZmlndXJlZCA9IGRldGFpbE9yRGlzcGxheT8ucm91dGUgPyB0cnVlIDogZmFsc2U7XG5cdH1cblx0Ly8gd2hlbiBlbmFibGVBdXRvU2Nyb2xsIGlzIHRydWUgdGhlIG5hdmlnYXRlVG9JbnN0YW5jZSBmZWF0dXJlIGlzIGRpc2FibGVkXG5cdGlmIChcblx0XHQoYWN0aW9uICYmXG5cdFx0XHRhY3Rpb24uYWZ0ZXJFeGVjdXRpb24gJiZcblx0XHRcdChhY3Rpb24uYWZ0ZXJFeGVjdXRpb24/Lm5hdmlnYXRlVG9JbnN0YW5jZSA9PT0gZmFsc2UgfHwgYWN0aW9uLmFmdGVyRXhlY3V0aW9uPy5lbmFibGVBdXRvU2Nyb2xsID09PSB0cnVlKSkgfHxcblx0XHQhYklzTmF2aWdhdGlvbkNvbmZpZ3VyZWRcblx0KSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cdHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZW5hYmxlQXV0b1Njcm9sbChhY3Rpb246IE1hbmlmZXN0QWN0aW9uKTogYm9vbGVhbiB7XG5cdHJldHVybiBhY3Rpb24/LmFmdGVyRXhlY3V0aW9uPy5lbmFibGVBdXRvU2Nyb2xsID09PSB0cnVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGF0YUZpZWxkSXNDb3B5QWN0aW9uKGRhdGFGaWVsZDogRGF0YUZpZWxkRm9yQWN0aW9uVHlwZXMpOiBib29sZWFuIHtcblx0cmV0dXJuIGRhdGFGaWVsZC5hbm5vdGF0aW9ucz8uVUk/LklzQ29weUFjdGlvbj8udmFsdWVPZigpID09PSB0cnVlICYmIGRhdGFGaWVsZC4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQWN0aW9uO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29weUFjdGlvbihjb3B5RGF0YUZpZWxkczogRGF0YUZpZWxkRm9yQWN0aW9uVHlwZXNbXSk6IERhdGFGaWVsZEZvckFjdGlvblR5cGVzIHwgdW5kZWZpbmVkIHtcblx0aWYgKGNvcHlEYXRhRmllbGRzLmxlbmd0aCA9PT0gMSkge1xuXHRcdHJldHVybiBjb3B5RGF0YUZpZWxkc1swXTtcblx0fVxuXHRpZiAoY29weURhdGFGaWVsZHMubGVuZ3RoID4gMSkge1xuXHRcdExvZy5lcnJvcihcIk11bHRpcGxlIGFjdGlvbnMgYXJlIGFubm90YXRlZCB3aXRoIGlzQ29weUFjdGlvbi4gVGhlcmUgY2FuIGJlIG9ubHkgb25lIHN0YW5kYXJkIGNvcHkgYWN0aW9uLlwiKTtcblx0fVxuXHRyZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIE1ldGhvZCB0byBleHRyYWN0IG1lbnUgaXRlbXMgZnJvbSBhY3Rpb25zIG9mIHR5cGUgbWVudXMuXG4gKiBAcGFyYW0gYW5ub3RhdGlvbkFjdGlvbnMgQ29sbGVjdGlvbiBvZiBhbm5vdGF0aW9uIGJhc2VkIGFjdGlvbnNcbiAqIEByZXR1cm5zIENvbGxlY3Rpb24gb2YgYWN0aW9ucyB3aGljaCBhcmUgbWVudSBpdGVtcyBpbiBvbmUgb2YgdGhlIGFubm90YXRpb24gYmFzZWQgbWVudXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEFubm90YXRpb25NZW51QWN0aW9uSXRlbXMoYW5ub3RhdGlvbkFjdGlvbnM6IEJhc2VBY3Rpb25bXSk6IEJhc2VBY3Rpb25bXSB7XG5cdGNvbnN0IG1lbnVBY3Rpb25JdGVtczogQmFzZUFjdGlvbltdID0gW107XG5cblx0YW5ub3RhdGlvbkFjdGlvbnMuZm9yRWFjaCgoYWN0aW9uOiBCYXNlQWN0aW9uKSA9PiB7XG5cdFx0aWYgKGFjdGlvbi50eXBlID09PSBcIk1lbnVcIiAmJiAhYWN0aW9uLmlkPy5zdGFydHNXaXRoKFwiQ3VzdG9tQWN0aW9uOjpcIikgJiYgYWN0aW9uLm1lbnUpIHtcblx0XHRcdG1lbnVBY3Rpb25JdGVtcy5wdXNoKC4uLmFjdGlvbi5tZW51KTtcblx0XHR9XG5cdH0pO1xuXG5cdHJldHVybiBtZW51QWN0aW9uSXRlbXM7XG59XG5cbi8qKlxuICogTWV0aG9kIHRvIGZpbmQgdGhlIG1hdGNoaW5nIG1hbmlmZXN0IGFjdGlvbnMgd2hpY2ggb3ZlcnJpZGUgdGhlIGFubm90YXRpb24gbWVudSBpdGVtcy5cbiAqIEBwYXJhbSBhbm5vdGF0aW9uTWVudUl0ZW1zIENvbGxlY3Rpb24gb2YgYW5ub3RhdGlvbiBiYXNlZCBtZW51IGl0ZW1zXG4gKiBAcGFyYW0gbWFuaWZlc3RBY3Rpb25zIENvbGxlY3Rpb24gb2YgbWFuaWZlc3QgYmFzZWQgYWN0aW9uc1xuICogQHJldHVybnMgQ29sbGVjdGlvbiBvZiBhY3Rpb25zIHdoaWNoIGFyZSBtZW51IGl0ZW1zIGluIG9uZSBvZiB0aGUgYW5ub3RhdGlvbiBiYXNlZCBtZW51c1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWF0Y2hpbmdNYW5pZmVzdEFjdGlvbihcblx0YW5ub3RhdGlvbk1lbnVJdGVtczogQmFzZUFjdGlvbltdLFxuXHRtYW5pZmVzdEFjdGlvbnM6IFJlY29yZDxzdHJpbmcsIEN1c3RvbUFjdGlvbj5cbik6IFJlY29yZDxzdHJpbmcsIEN1c3RvbUFjdGlvbj4ge1xuXHRjb25zdCBtYXRjaGluZ01hbmlmZXN0QWN0aW9uczogUmVjb3JkPHN0cmluZywgQ3VzdG9tQWN0aW9uPiA9IHt9O1xuXG5cdGZvciAoY29uc3QgbWFuaWZlc3RBY3Rpb24gaW4gbWFuaWZlc3RBY3Rpb25zKSB7XG5cdFx0aWYgKFxuXHRcdFx0bWFuaWZlc3RBY3Rpb24uc3RhcnRzV2l0aChcIkRhdGFGaWVsZEZvckFjdGlvbjo6XCIpICYmXG5cdFx0XHRhbm5vdGF0aW9uTWVudUl0ZW1zLmZpbmQoKG1lbnVBY3Rpb25JdGVtcykgPT4ge1xuXHRcdFx0XHRyZXR1cm4gbWVudUFjdGlvbkl0ZW1zLmtleSA9PT0gbWFuaWZlc3RBY3Rpb247XG5cdFx0XHR9KVxuXHRcdCkge1xuXHRcdFx0bWF0Y2hpbmdNYW5pZmVzdEFjdGlvbnNbbWFuaWZlc3RBY3Rpb25dID0gbWFuaWZlc3RBY3Rpb25zW21hbmlmZXN0QWN0aW9uXTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gbWF0Y2hpbmdNYW5pZmVzdEFjdGlvbnM7XG59XG5cbi8qKlxuICogTWV0aG9kIHRvIHRyYW5zZm9ybSB0aGUgbWVudXMgYnkgcmVwbGFjaW5nIHRoZSBtZW51IGl0ZW1zIHdpdGggdGhlaXIgb3ZlcnJpZGluZyBhY3Rpb25zLlxuICogQHBhcmFtIHVucHJlcGFyZWRBY3Rpb25zIENvbGxlY3Rpb24gb2YgYWxsIGFjdGlvbnMgYWZ0ZXIgbWVyZ2luZyBtYW5pZmVzdCBhbmQgYW5ub3RhdGlvbiBhY3Rpb25zXG4gKiBAcGFyYW0gb3ZlcnJpZGVNZW51QWN0aW9ucyBDb2xsZWN0aW9uIG9mIGFsbCBvdmVycmlkZW4gbWVudSBpdGVtc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcHJlcGFyZU1lbnVBY3Rpb25zKHVucHJlcGFyZWRBY3Rpb25zOiBDdXN0b21BY3Rpb25bXSwgb3ZlcnJpZGVNZW51QWN0aW9uczogQmFzZUFjdGlvbltdKTogdm9pZCB7XG5cdGxldCBmb3VuZEFjdGlvbjtcblxuXHR1bnByZXBhcmVkQWN0aW9ucy5mb3JFYWNoKChhY3Rpb246IEN1c3RvbUFjdGlvbikgPT4ge1xuXHRcdGlmIChhY3Rpb24udHlwZSA9PT0gQWN0aW9uVHlwZS5NZW51KSB7XG5cdFx0XHRhY3Rpb24ubWVudT8uZm9yRWFjaCgobWVudUl0ZW06IEJhc2VBY3Rpb24sIG1lbnVJdGVtSW5kZXg6IG51bWJlcikgPT4ge1xuXHRcdFx0XHRmb3VuZEFjdGlvbiA9IG92ZXJyaWRlTWVudUFjdGlvbnMuZmluZCgob3ZlcnJpZGVNZW51QWN0aW9uOiBCYXNlQWN0aW9uKSA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuIG92ZXJyaWRlTWVudUFjdGlvbi5rZXkgPT09IG1lbnVJdGVtLmtleTtcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0aWYgKGZvdW5kQWN0aW9uKSB7XG5cdFx0XHRcdFx0YWN0aW9uLm1lbnU/LnNwbGljZShtZW51SXRlbUluZGV4LCAxLCBmb3VuZEFjdGlvbik7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH1cblx0fSk7XG59XG5cbi8qKlxuICogTWV0aG9kIHRvIGRldGVybWluZSBpZiB0aGUgbWVudSBjb25zaXN0cyBvZiBhbGwgQUkgb3BlcmF0aW9uIGFjdGlvbnMuXG4gKiBAcGFyYW0gYW5ub3RhdGlvbkFjdGlvbnMgQ29sbGVjdGlvbiBvZiBEYXRhRmllbGRGb3JBY3Rpb25zIG9yIERhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbnMgaW4gdGhlIG1lbnVcbiAqIEByZXR1cm5zIEEgYm9vbGVhbiB0cnVlIGlmIGFsbCByZWNvcmRzIGluIHRoZSBtZW51IGFyZSBBSSBvcGVyYXRpb25zLCBmYWxzZSBvdGhlcndpc2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTWVudUFJT3BlcmF0aW9uKGFubm90YXRpb25BY3Rpb25zOiBEYXRhRmllbGRGb3JBY3Rpb25BYnN0cmFjdFR5cGVzW10pOiBib29sZWFuIHtcblx0cmV0dXJuIGFubm90YXRpb25BY3Rpb25zLmV2ZXJ5KGlzQWN0aW9uQUlPcGVyYXRpb24pO1xufVxuXG4vKipcbiAqIE1ldGhvZCB0byBkZXRlcm1pbmUgaWYgdGhlIGdpdmVuIHJlY29yZCBpcyBhbiBBSSBvcGVyYXRpb24uXG4gKiBAcGFyYW0gZGF0YUZpZWxkIFRoZSByZWNvcmQgb2YgdHlwZSBEYXRhRmllbGRGb3JBY3Rpb24gb3IgRGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uXG4gKiBAcmV0dXJucyBBIGJvb2xlYW4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gcmVjb3JkIGlzIGFuIEFJIG9wZXJhdGlvbiwgZmFsc2Ugb3RoZXJ3aXNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0FjdGlvbkFJT3BlcmF0aW9uKGRhdGFGaWVsZDogRGF0YUZpZWxkRm9yQWN0aW9uQWJzdHJhY3RUeXBlcyk6IGJvb2xlYW4ge1xuXHRpZiAoZGF0YUZpZWxkLiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBY3Rpb24pIHtcblx0XHRyZXR1cm4gZGF0YUZpZWxkLkFjdGlvblRhcmdldD8uYW5ub3RhdGlvbnMuVUk/LklzQUlPcGVyYXRpb24/LnZhbHVlT2YoKSA9PT0gdHJ1ZTtcblx0fVxuXHRyZXR1cm4gZmFsc2U7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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
@@ -1,6 +1,10 @@
1
1
  import type { Action } from "@sap-ux/vocabularies-types";
2
2
  import type { SemanticObjectMappingType } from "@sap-ux/vocabularies-types/vocabularies/Common";
3
- import type { DataFieldForActionGroupTypes, DataFieldForActionTypes } from "@sap-ux/vocabularies-types/vocabularies/UI";
3
+ import type {
4
+ DataFieldForActionAbstractTypes,
5
+ DataFieldForActionGroupTypes,
6
+ DataFieldForActionTypes
7
+ } from "@sap-ux/vocabularies-types/vocabularies/UI";
4
8
  import { UIAnnotationTypes } from "@sap-ux/vocabularies-types/vocabularies/UI";
5
9
  import Log from "sap/base/Log";
6
10
  import type { BindingToolkitExpression, CompiledBindingToolkitExpression } from "sap/fe/base/BindingToolkit";
@@ -13,6 +17,7 @@ import {
13
17
  greaterOrEqual,
14
18
  ifElse,
15
19
  isConstant,
20
+ not,
16
21
  or,
17
22
  pathInModel,
18
23
  resolveBindingString
@@ -28,6 +33,8 @@ import type { ConfigurableObject, CustomElement, OverrideType } from "sap/fe/cor
28
33
  import { Placement } from "sap/fe/core/converters/helpers/ConfigurableObject";
29
34
  import { getCustomActionID } from "sap/fe/core/converters/helpers/ID";
30
35
  import fpmFormatter from "sap/fe/core/formatters/FPMFormatter";
36
+ import { UI } from "sap/fe/core/helpers/BindingHelper";
37
+ import ModelHelper from "sap/fe/core/helpers/ModelHelper";
31
38
  import { replaceSpecialChars } from "sap/fe/core/helpers/StableIdHelper";
32
39
  import { getActionEnabledExpression } from "sap/fe/core/templating/UIFormatters";
33
40
  import type View from "sap/ui/core/mvc/View";
@@ -52,6 +59,8 @@ export enum ButtonType {
52
59
  Up = "Up"
53
60
  }
54
61
 
62
+ export const aiIcon = "sap-icon://ai";
63
+
55
64
  export type BaseAction = ConfigurableObject & {
56
65
  id?: string;
57
66
  text?: string;
@@ -70,6 +79,7 @@ export type BaseAction = ConfigurableObject & {
70
79
  menu?: BaseAction[];
71
80
  facetName?: string;
72
81
  command?: string | undefined;
82
+ isAIOperation?: boolean;
73
83
  };
74
84
 
75
85
  export type AnnotationAction = BaseAction & {
@@ -184,6 +194,24 @@ export const getVisibilityEnablementMenuActions = (actions: CustomAction[]): Cus
184
194
  return actions;
185
195
  };
186
196
 
197
+ /**
198
+ * Adds the collaboration condition to all actions with type ForAction.
199
+ * This disables the actions if the collaboration is enabled, but the user doesn't have the authorization from the back end.
200
+ * @param actions The list of definitions of the table actions.
201
+ */
202
+ export function addCollaborationCondition(actions: CustomAction[]): void {
203
+ actions.forEach((action) => {
204
+ if (action.visible?.valueOf() === "false") {
205
+ return;
206
+ }
207
+ if (action.type === "ForAction") {
208
+ action.visible = compileExpression(
209
+ and(resolveBindingString(action.visible as string, "boolean"), not(equal(UI.hasCollaborationAuthorization, false)))
210
+ );
211
+ }
212
+ });
213
+ }
214
+
187
215
  /**
188
216
  * Maps an action by its key, based on the given annotation actions and manifest configuration. The result already represents the
189
217
  * merged action from both configuration sources.
@@ -531,7 +559,8 @@ export function getActionsFromManifest(
531
559
  enableAutoScroll: enableAutoScroll(manifestAction),
532
560
  menu: manifestAction.menu ?? (annotationAction?.type === ActionType.Menu ? [] : undefined),
533
561
  facetName: manifestAction.inline ? facetName : undefined,
534
- defaultAction: manifestAction.defaultAction
562
+ defaultAction: manifestAction.defaultAction,
563
+ isAIOperation: manifestAction?.isAIOperation ?? undefined
535
564
  };
536
565
 
537
566
  overrideManifestConfigurationWithAnnotation(actions[actionKey], annotationAction);
@@ -603,12 +632,18 @@ export function getEnabledForAnnotationAction(
603
632
  ): CompiledBindingToolkitExpression {
604
633
  if (actionTarget?.annotations.Core?.OperationAvailable) {
605
634
  const dataModelObjectPath = converterContext.getDataModelObjectPath();
606
- const isEnabledExp = getActionEnabledExpression(
635
+ let isEnabledExp = getActionEnabledExpression(
607
636
  actionTarget,
608
637
  converterContext.getConvertedTypes(),
609
638
  dataModelObjectPath,
610
639
  pathFromContextLocation
611
640
  );
641
+ const collaborationOnRoot =
642
+ ModelHelper.isCollaborationDraftSupportedFromConverterContext(converterContext) &&
643
+ ModelHelper.getDraftRoot(converterContext.getEntitySet());
644
+ if (collaborationOnRoot) {
645
+ isEnabledExp = and(isEnabledExp, UI.hasCollaborationAuthorization);
646
+ }
612
647
  return compileExpression(isEnabledExp);
613
648
  }
614
649
  return "true";
@@ -732,3 +767,24 @@ export function prepareMenuActions(unpreparedActions: CustomAction[], overrideMe
732
767
  }
733
768
  });
734
769
  }
770
+
771
+ /**
772
+ * Method to determine if the menu consists of all AI operation actions.
773
+ * @param annotationActions Collection of DataFieldForActions or DataFieldForIntentBasedNavigations in the menu
774
+ * @returns A boolean true if all records in the menu are AI operations, false otherwise
775
+ */
776
+ export function isMenuAIOperation(annotationActions: DataFieldForActionAbstractTypes[]): boolean {
777
+ return annotationActions.every(isActionAIOperation);
778
+ }
779
+
780
+ /**
781
+ * Method to determine if the given record is an AI operation.
782
+ * @param dataField The record of type DataFieldForAction or DataFieldForIntentBasedNavigation
783
+ * @returns A boolean true if the given record is an AI operation, false otherwise
784
+ */
785
+ export function isActionAIOperation(dataField: DataFieldForActionAbstractTypes): boolean {
786
+ if (dataField.$Type === UIAnnotationTypes.DataFieldForAction) {
787
+ return dataField.ActionTarget?.annotations.UI?.IsAIOperation?.valueOf() === true;
788
+ }
789
+ return false;
790
+ }