@sapui5/sap.fe.core 1.111.0 → 1.112.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 (524) hide show
  1. package/package.json +1 -1
  2. package/src/sap/fe/core/.library +1 -1
  3. package/src/sap/fe/core/ActionRuntime-dbg.js +4 -4
  4. package/src/sap/fe/core/ActionRuntime.js +1 -1
  5. package/src/sap/fe/core/ActionRuntime.js.map +1 -1
  6. package/src/sap/fe/core/ActionRuntime.ts +11 -11
  7. package/src/sap/fe/core/AppComponent-dbg.js +27 -5
  8. package/src/sap/fe/core/AppComponent.js +1 -1
  9. package/src/sap/fe/core/AppComponent.js.map +1 -1
  10. package/src/sap/fe/core/AppComponent.ts +58 -3
  11. package/src/sap/fe/core/AppStateHandler-dbg.js +5 -2
  12. package/src/sap/fe/core/AppStateHandler.js +1 -1
  13. package/src/sap/fe/core/AppStateHandler.js.map +1 -1
  14. package/src/sap/fe/core/AppStateHandler.ts +10 -1
  15. package/src/sap/fe/core/BaseController-dbg.js +1 -1
  16. package/src/sap/fe/core/BaseController.ts +2 -1
  17. package/src/sap/fe/core/CommonUtils-dbg.js +152 -365
  18. package/src/sap/fe/core/CommonUtils.js +1 -1
  19. package/src/sap/fe/core/CommonUtils.js.map +1 -1
  20. package/src/sap/fe/core/CommonUtils.ts +201 -478
  21. package/src/sap/fe/core/ExtensionAPI-dbg.js +2 -1
  22. package/src/sap/fe/core/ExtensionAPI.js +1 -1
  23. package/src/sap/fe/core/ExtensionAPI.js.map +1 -1
  24. package/src/sap/fe/core/ExtensionAPI.ts +9 -1
  25. package/src/sap/fe/core/PageController-dbg.js +26 -31
  26. package/src/sap/fe/core/PageController.js +1 -1
  27. package/src/sap/fe/core/PageController.js.map +1 -1
  28. package/src/sap/fe/core/PageController.ts +17 -3
  29. package/src/sap/fe/core/ResourceModel-dbg.js +71 -0
  30. package/src/sap/fe/core/ResourceModel.js +6 -0
  31. package/src/sap/fe/core/ResourceModel.js.map +1 -0
  32. package/src/sap/fe/core/ResourceModel.ts +67 -0
  33. package/src/sap/fe/core/TemplateComponent-dbg.js +1 -1
  34. package/src/sap/fe/core/TemplateComponent.ts +1 -0
  35. package/src/sap/fe/core/TemplateModel-dbg.js +1 -1
  36. package/src/sap/fe/core/TemplateModel.ts +6 -1
  37. package/src/sap/fe/core/buildingBlocks/AttributeModel-dbg.js +5 -7
  38. package/src/sap/fe/core/buildingBlocks/AttributeModel.js +1 -1
  39. package/src/sap/fe/core/buildingBlocks/AttributeModel.js.map +1 -1
  40. package/src/sap/fe/core/buildingBlocks/AttributeModel.ts +6 -5
  41. package/src/sap/fe/core/buildingBlocks/BuildingBlockBase-dbg.js +163 -0
  42. package/src/sap/fe/core/buildingBlocks/BuildingBlockBase.js +6 -0
  43. package/src/sap/fe/core/buildingBlocks/BuildingBlockBase.js.map +1 -0
  44. package/src/sap/fe/core/buildingBlocks/BuildingBlockBase.ts +169 -0
  45. package/src/sap/fe/core/buildingBlocks/BuildingBlockSupport-dbg.js +88 -0
  46. package/src/sap/fe/core/buildingBlocks/BuildingBlockSupport.js +6 -0
  47. package/src/sap/fe/core/buildingBlocks/BuildingBlockSupport.js.map +1 -0
  48. package/src/sap/fe/core/buildingBlocks/BuildingBlockSupport.ts +147 -0
  49. package/src/sap/fe/core/buildingBlocks/BuildingBlockTemplateProcessor-dbg.js +905 -0
  50. package/src/sap/fe/core/buildingBlocks/BuildingBlockTemplateProcessor.js +21 -0
  51. package/src/sap/fe/core/buildingBlocks/BuildingBlockTemplateProcessor.js.map +1 -0
  52. package/src/sap/fe/core/buildingBlocks/{BuildingBlockRuntime.ts → BuildingBlockTemplateProcessor.ts} +279 -335
  53. package/src/sap/fe/core/buildingBlocks/RuntimeBuildingBlock-dbg.js +79 -0
  54. package/src/sap/fe/core/buildingBlocks/RuntimeBuildingBlock.js +15 -0
  55. package/src/sap/fe/core/buildingBlocks/RuntimeBuildingBlock.js.map +1 -0
  56. package/src/sap/fe/core/buildingBlocks/RuntimeBuildingBlock.ts +68 -0
  57. package/src/sap/fe/core/buildingBlocks/RuntimeBuildingBlockFragment-dbg.js +162 -0
  58. package/src/sap/fe/core/buildingBlocks/RuntimeBuildingBlockFragment.js +6 -0
  59. package/src/sap/fe/core/buildingBlocks/RuntimeBuildingBlockFragment.js.map +1 -0
  60. package/src/sap/fe/core/buildingBlocks/RuntimeBuildingBlockFragment.ts +181 -0
  61. package/src/sap/fe/core/buildingBlocks/TraceInfo-dbg.js +4 -2
  62. package/src/sap/fe/core/buildingBlocks/TraceInfo.js +1 -1
  63. package/src/sap/fe/core/buildingBlocks/TraceInfo.js.map +1 -1
  64. package/src/sap/fe/core/buildingBlocks/TraceInfo.ts +5 -3
  65. package/src/sap/fe/core/controllerextensions/EditFlow-dbg.js +890 -220
  66. package/src/sap/fe/core/controllerextensions/EditFlow.js +1 -1
  67. package/src/sap/fe/core/controllerextensions/EditFlow.js.map +1 -1
  68. package/src/sap/fe/core/controllerextensions/EditFlow.ts +974 -239
  69. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation-dbg.js +24 -34
  70. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +1 -1
  71. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js.map +1 -1
  72. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +71 -61
  73. package/src/sap/fe/core/controllerextensions/InternalRouting-dbg.js +14 -17
  74. package/src/sap/fe/core/controllerextensions/InternalRouting.js +1 -1
  75. package/src/sap/fe/core/controllerextensions/InternalRouting.js.map +1 -1
  76. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +23 -17
  77. package/src/sap/fe/core/controllerextensions/KPIManagement-dbg.js +1 -1
  78. package/src/sap/fe/core/controllerextensions/KPIManagement.ts +2 -0
  79. package/src/sap/fe/core/controllerextensions/MassEdit-dbg.js +3 -3
  80. package/src/sap/fe/core/controllerextensions/MassEdit.js +1 -1
  81. package/src/sap/fe/core/controllerextensions/MassEdit.js.map +1 -1
  82. package/src/sap/fe/core/controllerextensions/MassEdit.ts +2 -2
  83. package/src/sap/fe/core/controllerextensions/MessageHandler-dbg.js +2 -1
  84. package/src/sap/fe/core/controllerextensions/MessageHandler.js.map +1 -1
  85. package/src/sap/fe/core/controllerextensions/MessageHandler.ts +2 -0
  86. package/src/sap/fe/core/controllerextensions/PageReady-dbg.js +1 -1
  87. package/src/sap/fe/core/controllerextensions/PageReady.ts +24 -0
  88. package/src/sap/fe/core/controllerextensions/Paginator-dbg.js +2 -1
  89. package/src/sap/fe/core/controllerextensions/Paginator.js.map +1 -1
  90. package/src/sap/fe/core/controllerextensions/Paginator.ts +7 -0
  91. package/src/sap/fe/core/controllerextensions/Placeholder-dbg.js +1 -1
  92. package/src/sap/fe/core/controllerextensions/Placeholder.ts +8 -0
  93. package/src/sap/fe/core/controllerextensions/Share-dbg.js +8 -1
  94. package/src/sap/fe/core/controllerextensions/Share.js.map +1 -1
  95. package/src/sap/fe/core/controllerextensions/Share.ts +11 -0
  96. package/src/sap/fe/core/controllerextensions/SideEffects-dbg.js +14 -13
  97. package/src/sap/fe/core/controllerextensions/SideEffects.js +1 -1
  98. package/src/sap/fe/core/controllerextensions/SideEffects.js.map +1 -1
  99. package/src/sap/fe/core/controllerextensions/SideEffects.ts +27 -27
  100. package/src/sap/fe/core/controllerextensions/ViewState-dbg.js +17 -8
  101. package/src/sap/fe/core/controllerextensions/ViewState.js +1 -1
  102. package/src/sap/fe/core/controllerextensions/ViewState.js.map +1 -1
  103. package/src/sap/fe/core/controllerextensions/ViewState.ts +35 -14
  104. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase-dbg.js +6 -5
  105. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js +1 -1
  106. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js.map +1 -1
  107. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.ts +7 -4
  108. package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync-dbg.js +285 -82
  109. package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.js +1 -1
  110. package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.js.map +1 -1
  111. package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.ts +326 -89
  112. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon-dbg.js +23 -2
  113. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +1 -1
  114. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js.map +1 -1
  115. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.ts +32 -3
  116. package/src/sap/fe/core/controllerextensions/collaboration/Manage-dbg.js +1 -1
  117. package/src/sap/fe/core/controllerextensions/collaboration/Manage.js.map +1 -1
  118. package/src/sap/fe/core/controllerextensions/collaboration/Manage.ts +2 -3
  119. package/src/sap/fe/core/controllerextensions/collaboration/ManageDialog.fragment.xml +17 -3
  120. package/src/sap/fe/core/controllerextensions/dialog/OperationsDialog.block-dbg.js +65 -34
  121. package/src/sap/fe/core/controllerextensions/dialog/OperationsDialog.block.js +1 -1
  122. package/src/sap/fe/core/controllerextensions/dialog/OperationsDialog.block.js.map +1 -1
  123. package/src/sap/fe/core/controllerextensions/dialog/OperationsDialog.block.tsx +33 -18
  124. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper-dbg.js +45 -31
  125. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +1 -1
  126. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js.map +1 -1
  127. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +52 -42
  128. package/src/sap/fe/core/controllerextensions/editFlow/draft-dbg.js +44 -49
  129. package/src/sap/fe/core/controllerextensions/editFlow/draft.js +1 -1
  130. package/src/sap/fe/core/controllerextensions/editFlow/draft.js.map +1 -1
  131. package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +43 -63
  132. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.js.map +1 -1
  133. package/src/sap/fe/core/controllerextensions/editFlow/operations/_internal-dbg.js +77 -0
  134. package/src/sap/fe/core/controllerextensions/editFlow/operations/_internal.js +6 -0
  135. package/src/sap/fe/core/controllerextensions/editFlow/operations/_internal.js.map +1 -0
  136. package/src/sap/fe/core/controllerextensions/editFlow/operations/_internal.ts +114 -0
  137. package/src/sap/fe/core/controllerextensions/editFlow/operations/facade-dbg.js +1505 -0
  138. package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.js +6 -0
  139. package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.js.map +1 -0
  140. package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.ts +1985 -0
  141. package/src/sap/fe/core/controllerextensions/editFlow/operations-dbg.js +3 -1415
  142. package/src/sap/fe/core/controllerextensions/editFlow/operations.js +1 -1
  143. package/src/sap/fe/core/controllerextensions/editFlow/operations.js.map +1 -1
  144. package/src/sap/fe/core/controllerextensions/editFlow/operations.ts +2 -1921
  145. package/src/sap/fe/core/controllerextensions/editFlow/sticky-dbg.js +10 -11
  146. package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +1 -1
  147. package/src/sap/fe/core/controllerextensions/editFlow/sticky.js.map +1 -1
  148. package/src/sap/fe/core/controllerextensions/editFlow/sticky.ts +9 -13
  149. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling-dbg.js +43 -41
  150. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +1 -1
  151. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js.map +1 -1
  152. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +44 -47
  153. package/src/sap/fe/core/controllerextensions/pageReady/DataQueryWatcher-dbg.js +12 -1
  154. package/src/sap/fe/core/controllerextensions/pageReady/DataQueryWatcher.js.map +1 -1
  155. package/src/sap/fe/core/controllerextensions/pageReady/DataQueryWatcher.ts +19 -0
  156. package/src/sap/fe/core/controllerextensions/routing/RouterProxy-dbg.js +12 -13
  157. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +1 -1
  158. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js.map +1 -1
  159. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.ts +32 -13
  160. package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +4 -1
  161. package/src/sap/fe/core/controls/CommandExecution-dbg.js +16 -5
  162. package/src/sap/fe/core/controls/CommandExecution.js +1 -1
  163. package/src/sap/fe/core/controls/CommandExecution.js.map +1 -1
  164. package/src/sap/fe/core/controls/CommandExecution.ts +15 -3
  165. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler-dbg.js +3 -2
  166. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +1 -1
  167. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js.map +1 -1
  168. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.ts +4 -1
  169. package/src/sap/fe/core/controls/FilterBar-dbg.js +1 -1
  170. package/src/sap/fe/core/controls/FilterBar.ts +5 -0
  171. package/src/sap/fe/core/controls/FormElementWrapper-dbg.js +1 -1
  172. package/src/sap/fe/core/controls/FormElementWrapper.ts +3 -0
  173. package/src/sap/fe/core/controls/filterbar/FilterContainer-dbg.js +1 -1
  174. package/src/sap/fe/core/controls/filterbar/FilterContainer.ts +7 -0
  175. package/src/sap/fe/core/controls/filterbar/VisualFilter-dbg.js +1 -1
  176. package/src/sap/fe/core/controls/filterbar/VisualFilter.ts +4 -0
  177. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer-dbg.js +1 -1
  178. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.ts +10 -0
  179. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils-dbg.js +4 -3
  180. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +1 -1
  181. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js.map +1 -1
  182. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +3 -2
  183. package/src/sap/fe/core/controls/massEdit/MassEditDialog.fragment.xml +0 -1
  184. package/src/sap/fe/core/controls/massEdit/MassEditField.fragment.xml +2 -0
  185. package/src/sap/fe/core/controls/massEdit/MassEditHandlers-dbg.js +6 -1
  186. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +1 -1
  187. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js.map +1 -1
  188. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.ts +5 -0
  189. package/src/sap/fe/core/converters/ConverterContext-dbg.js +1 -1
  190. package/src/sap/fe/core/converters/ConverterContext.ts +2 -1
  191. package/src/sap/fe/core/converters/ManifestSettings-dbg.js +1 -8
  192. package/src/sap/fe/core/converters/ManifestSettings.js +1 -1
  193. package/src/sap/fe/core/converters/ManifestSettings.js.map +1 -1
  194. package/src/sap/fe/core/converters/ManifestSettings.ts +15 -6
  195. package/src/sap/fe/core/converters/ManifestWrapper-dbg.js +17 -1
  196. package/src/sap/fe/core/converters/ManifestWrapper.js +1 -1
  197. package/src/sap/fe/core/converters/ManifestWrapper.js.map +1 -1
  198. package/src/sap/fe/core/converters/ManifestWrapper.ts +16 -0
  199. package/src/sap/fe/core/converters/MetaModelConverter-dbg.js +61 -49
  200. package/src/sap/fe/core/converters/MetaModelConverter.js +1 -1
  201. package/src/sap/fe/core/converters/MetaModelConverter.js.map +1 -1
  202. package/src/sap/fe/core/converters/MetaModelConverter.ts +65 -51
  203. package/src/sap/fe/core/converters/TemplateConverter-dbg.js +2 -1
  204. package/src/sap/fe/core/converters/TemplateConverter.js.map +1 -1
  205. package/src/sap/fe/core/converters/TemplateConverter.ts +2 -1
  206. package/src/sap/fe/core/converters/annotations/DataField-dbg.js +65 -16
  207. package/src/sap/fe/core/converters/annotations/DataField.js +1 -1
  208. package/src/sap/fe/core/converters/annotations/DataField.js.map +1 -1
  209. package/src/sap/fe/core/converters/annotations/DataField.ts +62 -18
  210. package/src/sap/fe/core/converters/common/AnnotationConverter-dbg.js +1010 -957
  211. package/src/sap/fe/core/converters/common/AnnotationConverter.js +1 -1
  212. package/src/sap/fe/core/converters/common/AnnotationConverter.js.map +1 -1
  213. package/src/sap/fe/core/converters/controls/Common/Action-dbg.js +8 -8
  214. package/src/sap/fe/core/converters/controls/Common/Action.js +1 -1
  215. package/src/sap/fe/core/converters/controls/Common/Action.js.map +1 -1
  216. package/src/sap/fe/core/converters/controls/Common/Action.ts +28 -26
  217. package/src/sap/fe/core/converters/controls/Common/Chart-dbg.js +95 -33
  218. package/src/sap/fe/core/converters/controls/Common/Chart.js +1 -1
  219. package/src/sap/fe/core/converters/controls/Common/Chart.js.map +1 -1
  220. package/src/sap/fe/core/converters/controls/Common/Chart.ts +133 -49
  221. package/src/sap/fe/core/converters/controls/Common/DataVisualization-dbg.js +99 -62
  222. package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +1 -1
  223. package/src/sap/fe/core/converters/controls/Common/DataVisualization.js.map +1 -1
  224. package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +140 -75
  225. package/src/sap/fe/core/converters/controls/Common/Form-dbg.js +1 -1
  226. package/src/sap/fe/core/converters/controls/Common/Form.ts +3 -3
  227. package/src/sap/fe/core/converters/controls/Common/KPI-dbg.js +6 -6
  228. package/src/sap/fe/core/converters/controls/Common/KPI.js +1 -1
  229. package/src/sap/fe/core/converters/controls/Common/KPI.js.map +1 -1
  230. package/src/sap/fe/core/converters/controls/Common/KPI.ts +15 -15
  231. package/src/sap/fe/core/converters/controls/Common/Table-dbg.js +97 -69
  232. package/src/sap/fe/core/converters/controls/Common/Table.js +1 -1
  233. package/src/sap/fe/core/converters/controls/Common/Table.js.map +1 -1
  234. package/src/sap/fe/core/converters/controls/Common/Table.ts +161 -137
  235. package/src/sap/fe/core/converters/controls/Common/table/StandardActions-dbg.js +3 -3
  236. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +1 -1
  237. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js.map +1 -1
  238. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +10 -9
  239. package/src/sap/fe/core/converters/controls/ListReport/FilterBar-dbg.js +48 -44
  240. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +1 -1
  241. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js.map +1 -1
  242. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +130 -86
  243. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters-dbg.js +34 -26
  244. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +1 -1
  245. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js.map +1 -1
  246. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +62 -45
  247. package/src/sap/fe/core/converters/controls/ObjectPage/Avatar-dbg.js +1 -1
  248. package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.ts +1 -1
  249. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet-dbg.js +6 -6
  250. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +1 -1
  251. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js.map +1 -1
  252. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.ts +5 -8
  253. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection-dbg.js +34 -13
  254. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +1 -1
  255. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js.map +1 -1
  256. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +54 -20
  257. package/src/sap/fe/core/converters/helpers/Aggregation-dbg.js +3 -1
  258. package/src/sap/fe/core/converters/helpers/Aggregation.js.map +1 -1
  259. package/src/sap/fe/core/converters/helpers/Aggregation.ts +8 -0
  260. package/src/sap/fe/core/converters/helpers/ConfigurableObject-dbg.js +7 -6
  261. package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +1 -1
  262. package/src/sap/fe/core/converters/helpers/ConfigurableObject.js.map +1 -1
  263. package/src/sap/fe/core/converters/helpers/ConfigurableObject.ts +19 -10
  264. package/src/sap/fe/core/converters/helpers/DataFieldHelper-dbg.js +1 -1
  265. package/src/sap/fe/core/converters/helpers/DataFieldHelper.ts +7 -2
  266. package/src/sap/fe/core/converters/helpers/ID-dbg.js +1 -1
  267. package/src/sap/fe/core/converters/helpers/ID.ts +2 -1
  268. package/src/sap/fe/core/converters/helpers/IssueManager-dbg.js +9 -8
  269. package/src/sap/fe/core/converters/helpers/IssueManager.js +1 -1
  270. package/src/sap/fe/core/converters/helpers/IssueManager.js.map +1 -1
  271. package/src/sap/fe/core/converters/helpers/IssueManager.ts +8 -7
  272. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction-dbg.js +8 -7
  273. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +1 -1
  274. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js.map +1 -1
  275. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +9 -6
  276. package/src/sap/fe/core/converters/templates/ListReportConverter-dbg.js +25 -33
  277. package/src/sap/fe/core/converters/templates/ListReportConverter.js +1 -1
  278. package/src/sap/fe/core/converters/templates/ListReportConverter.js.map +1 -1
  279. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +35 -35
  280. package/src/sap/fe/core/converters/templates/ObjectPageConverter-dbg.js +11 -4
  281. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +1 -1
  282. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js.map +1 -1
  283. package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +7 -1
  284. package/src/sap/fe/core/formatters/FPMFormatter-dbg.js +1 -1
  285. package/src/sap/fe/core/formatters/FPMFormatter.ts +1 -1
  286. package/src/sap/fe/core/formatters/FiscalFormat-dbg.js +2 -2
  287. package/src/sap/fe/core/formatters/FiscalFormat.ts +6 -1
  288. package/src/sap/fe/core/formatters/TableFormatter-dbg.js +2 -2
  289. package/src/sap/fe/core/formatters/TableFormatter.js +1 -1
  290. package/src/sap/fe/core/formatters/TableFormatter.js.map +1 -1
  291. package/src/sap/fe/core/formatters/TableFormatter.ts +1 -1
  292. package/src/sap/fe/core/formatters/ValueFormatter-dbg.js +5 -5
  293. package/src/sap/fe/core/formatters/ValueFormatter.js +1 -1
  294. package/src/sap/fe/core/formatters/ValueFormatter.js.map +1 -1
  295. package/src/sap/fe/core/formatters/ValueFormatter.ts +6 -4
  296. package/src/sap/fe/core/fpm/Component-dbg.js +1 -1
  297. package/src/sap/fe/core/fpm/Component.ts +1 -0
  298. package/src/sap/fe/core/fpm/manifest.json +1 -1
  299. package/src/sap/fe/core/helpers/AppStartupHelper-dbg.js +2 -2
  300. package/src/sap/fe/core/helpers/AppStartupHelper.js +1 -1
  301. package/src/sap/fe/core/helpers/AppStartupHelper.js.map +1 -1
  302. package/src/sap/fe/core/helpers/AppStartupHelper.ts +1 -1
  303. package/src/sap/fe/core/helpers/BindingToolkit-dbg.js +6 -6
  304. package/src/sap/fe/core/helpers/BindingToolkit.js.map +1 -1
  305. package/src/sap/fe/core/helpers/BindingToolkit.ts +8 -8
  306. package/src/sap/fe/core/helpers/ClassSupport-dbg.js +1 -1
  307. package/src/sap/fe/core/helpers/ClassSupport.js.map +1 -1
  308. package/src/sap/fe/core/helpers/ClassSupport.ts +1 -0
  309. package/src/sap/fe/core/helpers/DeleteHelper-dbg.js +93 -62
  310. package/src/sap/fe/core/helpers/DeleteHelper.js +1 -1
  311. package/src/sap/fe/core/helpers/DeleteHelper.js.map +1 -1
  312. package/src/sap/fe/core/helpers/DeleteHelper.ts +140 -185
  313. package/src/sap/fe/core/helpers/MassEditHelper-dbg.js +20 -18
  314. package/src/sap/fe/core/helpers/MassEditHelper.js +1 -1
  315. package/src/sap/fe/core/helpers/MassEditHelper.js.map +1 -1
  316. package/src/sap/fe/core/helpers/MassEditHelper.ts +22 -23
  317. package/src/sap/fe/core/helpers/MessageStrip-dbg.js +4 -5
  318. package/src/sap/fe/core/helpers/MessageStrip.js +1 -1
  319. package/src/sap/fe/core/helpers/MessageStrip.js.map +1 -1
  320. package/src/sap/fe/core/helpers/MessageStrip.ts +4 -4
  321. package/src/sap/fe/core/helpers/MetaModelFunction-dbg.js +354 -0
  322. package/src/sap/fe/core/helpers/MetaModelFunction.js +6 -0
  323. package/src/sap/fe/core/helpers/MetaModelFunction.js.map +1 -0
  324. package/src/sap/fe/core/helpers/MetaModelFunction.ts +408 -0
  325. package/src/sap/fe/core/helpers/ModelHelper-dbg.js +13 -13
  326. package/src/sap/fe/core/helpers/ModelHelper.js.map +1 -1
  327. package/src/sap/fe/core/helpers/ModelHelper.ts +13 -13
  328. package/src/sap/fe/core/helpers/PasteHelper-dbg.js +5 -5
  329. package/src/sap/fe/core/helpers/PasteHelper.js +1 -1
  330. package/src/sap/fe/core/helpers/PasteHelper.js.map +1 -1
  331. package/src/sap/fe/core/helpers/PasteHelper.ts +6 -10
  332. package/src/sap/fe/core/helpers/ResourceModelHelper-dbg.js +26 -0
  333. package/src/sap/fe/core/helpers/ResourceModelHelper.js +6 -0
  334. package/src/sap/fe/core/helpers/ResourceModelHelper.js.map +1 -0
  335. package/src/sap/fe/core/helpers/ResourceModelHelper.ts +19 -0
  336. package/src/sap/fe/core/helpers/SemanticDateOperators-dbg.js +93 -18
  337. package/src/sap/fe/core/helpers/SemanticDateOperators.js +1 -1
  338. package/src/sap/fe/core/helpers/SemanticDateOperators.js.map +1 -1
  339. package/src/sap/fe/core/helpers/SemanticDateOperators.ts +70 -17
  340. package/src/sap/fe/core/helpers/SemanticKeyHelper-dbg.js +2 -2
  341. package/src/sap/fe/core/helpers/SemanticKeyHelper.js +1 -1
  342. package/src/sap/fe/core/helpers/SemanticKeyHelper.js.map +1 -1
  343. package/src/sap/fe/core/helpers/SemanticKeyHelper.ts +1 -1
  344. package/src/sap/fe/core/helpers/Synchronization-dbg.js +1 -1
  345. package/src/sap/fe/core/helpers/Synchronization.ts +2 -0
  346. package/src/sap/fe/core/helpers/TypeGuards-dbg.js +5 -1
  347. package/src/sap/fe/core/helpers/TypeGuards.js +1 -1
  348. package/src/sap/fe/core/helpers/TypeGuards.js.map +1 -1
  349. package/src/sap/fe/core/helpers/TypeGuards.ts +12 -1
  350. package/src/sap/fe/core/jsx-runtime/ViewLoader-dbg.js +2 -1
  351. package/src/sap/fe/core/jsx-runtime/ViewLoader.js.map +1 -1
  352. package/src/sap/fe/core/jsx-runtime/ViewLoader.tsx +6 -2
  353. package/src/sap/fe/core/jsx-runtime/jsx-control-dbg.js +1 -1
  354. package/src/sap/fe/core/jsx-runtime/jsx-control.ts +3 -1
  355. package/src/sap/fe/core/jsx-runtime/useMDXComponents-dbg.js +3 -3
  356. package/src/sap/fe/core/jsx-runtime/useMDXComponents.js +1 -1
  357. package/src/sap/fe/core/jsx-runtime/useMDXComponents.js.map +1 -1
  358. package/src/sap/fe/core/jsx-runtime/useMDXComponents.tsx +1 -1
  359. package/src/sap/fe/core/library-dbg.js +2 -2
  360. package/src/sap/fe/core/library-preload.js +127 -125
  361. package/src/sap/fe/core/library-preload.js.map +1 -1
  362. package/src/sap/fe/core/library.js +1 -1
  363. package/src/sap/fe/core/library.ts +7 -0
  364. package/src/sap/fe/core/manifest.json +1 -1
  365. package/src/sap/fe/core/messagebundle.properties +33 -0
  366. package/src/sap/fe/core/messagebundle_ar.properties +12 -10
  367. package/src/sap/fe/core/messagebundle_bg.properties +11 -9
  368. package/src/sap/fe/core/messagebundle_ca.properties +11 -9
  369. package/src/sap/fe/core/messagebundle_cs.properties +11 -9
  370. package/src/sap/fe/core/messagebundle_cy.properties +11 -9
  371. package/src/sap/fe/core/messagebundle_da.properties +11 -9
  372. package/src/sap/fe/core/messagebundle_de.properties +3 -1
  373. package/src/sap/fe/core/messagebundle_el.properties +11 -9
  374. package/src/sap/fe/core/messagebundle_en.properties +3 -1
  375. package/src/sap/fe/core/messagebundle_en_GB.properties +2 -0
  376. package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +2 -0
  377. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +20 -0
  378. package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +21 -3
  379. package/src/sap/fe/core/messagebundle_es.properties +11 -9
  380. package/src/sap/fe/core/messagebundle_es_MX.properties +11 -9
  381. package/src/sap/fe/core/messagebundle_et.properties +11 -9
  382. package/src/sap/fe/core/messagebundle_fi.properties +11 -9
  383. package/src/sap/fe/core/messagebundle_fr.properties +11 -9
  384. package/src/sap/fe/core/messagebundle_fr_CA.properties +3 -1
  385. package/src/sap/fe/core/messagebundle_hi.properties +2 -0
  386. package/src/sap/fe/core/messagebundle_hr.properties +11 -9
  387. package/src/sap/fe/core/messagebundle_hu.properties +11 -9
  388. package/src/sap/fe/core/messagebundle_id.properties +3 -1
  389. package/src/sap/fe/core/messagebundle_it.properties +11 -9
  390. package/src/sap/fe/core/messagebundle_iw.properties +11 -9
  391. package/src/sap/fe/core/messagebundle_ja.properties +11 -9
  392. package/src/sap/fe/core/messagebundle_kk.properties +11 -9
  393. package/src/sap/fe/core/messagebundle_ko.properties +2 -0
  394. package/src/sap/fe/core/messagebundle_lt.properties +11 -9
  395. package/src/sap/fe/core/messagebundle_lv.properties +2 -0
  396. package/src/sap/fe/core/messagebundle_ms.properties +12 -10
  397. package/src/sap/fe/core/messagebundle_nl.properties +12 -10
  398. package/src/sap/fe/core/messagebundle_no.properties +11 -9
  399. package/src/sap/fe/core/messagebundle_pl.properties +2 -0
  400. package/src/sap/fe/core/messagebundle_pt.properties +11 -9
  401. package/src/sap/fe/core/messagebundle_pt_PT.properties +11 -9
  402. package/src/sap/fe/core/messagebundle_ro.properties +3 -1
  403. package/src/sap/fe/core/messagebundle_ru.properties +3 -1
  404. package/src/sap/fe/core/messagebundle_sh.properties +11 -9
  405. package/src/sap/fe/core/messagebundle_sk.properties +11 -9
  406. package/src/sap/fe/core/messagebundle_sl.properties +11 -9
  407. package/src/sap/fe/core/messagebundle_sv.properties +2 -0
  408. package/src/sap/fe/core/messagebundle_th.properties +11 -9
  409. package/src/sap/fe/core/messagebundle_tr.properties +11 -9
  410. package/src/sap/fe/core/messagebundle_uk.properties +11 -9
  411. package/src/sap/fe/core/messagebundle_vi.properties +12 -10
  412. package/src/sap/fe/core/messagebundle_zh_CN.properties +2 -0
  413. package/src/sap/fe/core/messagebundle_zh_TW.properties +2 -0
  414. package/src/sap/fe/core/operationsHelper-dbg.js +70 -44
  415. package/src/sap/fe/core/operationsHelper.js +1 -1
  416. package/src/sap/fe/core/operationsHelper.js.map +1 -1
  417. package/src/sap/fe/core/operationsHelper.ts +88 -63
  418. package/src/sap/fe/core/rootView/Fcl-dbg.controller.js +1 -1
  419. package/src/sap/fe/core/rootView/Fcl.controller.ts +10 -0
  420. package/src/sap/fe/core/rootView/NavContainer-dbg.controller.js +2 -2
  421. package/src/sap/fe/core/rootView/NavContainer.controller.js +1 -1
  422. package/src/sap/fe/core/rootView/NavContainer.controller.js.map +1 -1
  423. package/src/sap/fe/core/rootView/NavContainer.controller.ts +5 -3
  424. package/src/sap/fe/core/rootView/RootViewBaseController-dbg.js +4 -3
  425. package/src/sap/fe/core/rootView/RootViewBaseController.js +1 -1
  426. package/src/sap/fe/core/rootView/RootViewBaseController.js.map +1 -1
  427. package/src/sap/fe/core/rootView/RootViewBaseController.ts +15 -5
  428. package/src/sap/fe/core/services/AsyncComponentServiceFactory-dbg.js +1 -1
  429. package/src/sap/fe/core/services/AsyncComponentServiceFactory.ts +3 -1
  430. package/src/sap/fe/core/services/CacheHandlerServiceFactory-dbg.js +1 -1
  431. package/src/sap/fe/core/services/CacheHandlerServiceFactory.js.map +1 -1
  432. package/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +15 -1
  433. package/src/sap/fe/core/services/EnvironmentServiceFactory-dbg.js +1 -1
  434. package/src/sap/fe/core/services/EnvironmentServiceFactory.js.map +1 -1
  435. package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +4 -1
  436. package/src/sap/fe/core/services/NavigationServiceFactory-dbg.js +9 -1
  437. package/src/sap/fe/core/services/NavigationServiceFactory.js.map +1 -1
  438. package/src/sap/fe/core/services/NavigationServiceFactory.ts +19 -1
  439. package/src/sap/fe/core/services/ResourceModelServiceFactory-dbg.js +2 -2
  440. package/src/sap/fe/core/services/ResourceModelServiceFactory.js +1 -1
  441. package/src/sap/fe/core/services/ResourceModelServiceFactory.js.map +1 -1
  442. package/src/sap/fe/core/services/ResourceModelServiceFactory.ts +10 -3
  443. package/src/sap/fe/core/services/RoutingServiceFactory-dbg.js +3 -3
  444. package/src/sap/fe/core/services/RoutingServiceFactory.js +1 -1
  445. package/src/sap/fe/core/services/RoutingServiceFactory.js.map +1 -1
  446. package/src/sap/fe/core/services/RoutingServiceFactory.ts +29 -3
  447. package/src/sap/fe/core/services/ShellServicesFactory-dbg.js +1 -1
  448. package/src/sap/fe/core/services/ShellServicesFactory.ts +14 -2
  449. package/src/sap/fe/core/services/SideEffectsServiceFactory-dbg.js +448 -279
  450. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +1 -1
  451. package/src/sap/fe/core/services/SideEffectsServiceFactory.js.map +1 -1
  452. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +502 -333
  453. package/src/sap/fe/core/services/TemplatedViewServiceFactory-dbg.js +18 -5
  454. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +1 -1
  455. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js.map +1 -1
  456. package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +41 -12
  457. package/src/sap/fe/core/support/Diagnostics-dbg.js +1 -1
  458. package/src/sap/fe/core/support/Diagnostics.ts +5 -0
  459. package/src/sap/fe/core/templating/DataModelPathHelper-dbg.js +185 -86
  460. package/src/sap/fe/core/templating/DataModelPathHelper.js +1 -1
  461. package/src/sap/fe/core/templating/DataModelPathHelper.js.map +1 -1
  462. package/src/sap/fe/core/templating/DataModelPathHelper.ts +190 -82
  463. package/src/sap/fe/core/templating/DisplayModeFormatter-dbg.js +1 -1
  464. package/src/sap/fe/core/templating/DisplayModeFormatter.ts +1 -1
  465. package/src/sap/fe/core/templating/EntitySetHelper-dbg.js +2 -3
  466. package/src/sap/fe/core/templating/EntitySetHelper.js +1 -1
  467. package/src/sap/fe/core/templating/EntitySetHelper.js.map +1 -1
  468. package/src/sap/fe/core/templating/EntitySetHelper.ts +1 -3
  469. package/src/sap/fe/core/templating/FilterHelper-dbg.js +3 -3
  470. package/src/sap/fe/core/templating/FilterHelper.js +1 -1
  471. package/src/sap/fe/core/templating/FilterHelper.js.map +1 -1
  472. package/src/sap/fe/core/templating/FilterHelper.ts +5 -3
  473. package/src/sap/fe/core/templating/PropertyHelper-dbg.js +1 -1
  474. package/src/sap/fe/core/templating/PropertyHelper.ts +2 -2
  475. package/src/sap/fe/core/templating/UIFormatters-dbg.js +1 -1
  476. package/src/sap/fe/core/templating/UIFormatters.ts +4 -0
  477. package/src/sap/fe/core/type/DateTimeWithTimezone-dbg.js +1 -1
  478. package/src/sap/fe/core/type/DateTimeWithTimezone.ts +2 -0
  479. package/src/sap/fe/core/type/FiscalDate-dbg.js +2 -2
  480. package/src/sap/fe/core/type/FiscalDate.js.map +1 -1
  481. package/src/sap/fe/core/type/FiscalDate.ts +2 -1
  482. package/src/sap/fe/core/type/TypeUtil-dbg.js +5 -10
  483. package/src/sap/fe/core/type/TypeUtil.js +1 -1
  484. package/src/sap/fe/core/type/TypeUtil.js.map +1 -1
  485. package/src/sap/fe/core/type/TypeUtil.ts +3 -6
  486. package/src/sap/fe/core/buildingBlocks/BuildingBlock-dbg.js +0 -410
  487. package/src/sap/fe/core/buildingBlocks/BuildingBlock.js +0 -15
  488. package/src/sap/fe/core/buildingBlocks/BuildingBlock.js.map +0 -1
  489. package/src/sap/fe/core/buildingBlocks/BuildingBlock.ts +0 -536
  490. package/src/sap/fe/core/buildingBlocks/BuildingBlockFragment-dbg.js +0 -44
  491. package/src/sap/fe/core/buildingBlocks/BuildingBlockFragment.js +0 -6
  492. package/src/sap/fe/core/buildingBlocks/BuildingBlockFragment.js.map +0 -1
  493. package/src/sap/fe/core/buildingBlocks/BuildingBlockFragment.ts +0 -14
  494. package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime-dbg.js +0 -932
  495. package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.js +0 -19
  496. package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.js.map +0 -1
  497. package/src/sap/fe/core/controllerextensions/InternalEditFlow-dbg.js +0 -711
  498. package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +0 -6
  499. package/src/sap/fe/core/controllerextensions/InternalEditFlow.js.map +0 -1
  500. package/src/sap/fe/core/controllerextensions/InternalEditFlow.ts +0 -863
  501. package/src/sap/fe/core/controls/ConditionalWrapper-dbg.js +0 -151
  502. package/src/sap/fe/core/controls/ConditionalWrapper.js +0 -6
  503. package/src/sap/fe/core/controls/ConditionalWrapper.js.map +0 -1
  504. package/src/sap/fe/core/controls/ConditionalWrapper.ts +0 -88
  505. package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper-dbg.js +0 -330
  506. package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.js +0 -6
  507. package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.js.map +0 -1
  508. package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.ts +0 -292
  509. package/src/sap/fe/core/controls/CustomQuickViewPage-dbg.js +0 -126
  510. package/src/sap/fe/core/controls/CustomQuickViewPage.js +0 -6
  511. package/src/sap/fe/core/controls/CustomQuickViewPage.js.map +0 -1
  512. package/src/sap/fe/core/controls/CustomQuickViewPage.ts +0 -105
  513. package/src/sap/fe/core/controls/FieldWrapper-dbg.js +0 -194
  514. package/src/sap/fe/core/controls/FieldWrapper.js +0 -6
  515. package/src/sap/fe/core/controls/FieldWrapper.js.map +0 -1
  516. package/src/sap/fe/core/controls/FieldWrapper.ts +0 -121
  517. package/src/sap/fe/core/controls/FileWrapper-dbg.js +0 -280
  518. package/src/sap/fe/core/controls/FileWrapper.js +0 -6
  519. package/src/sap/fe/core/controls/FileWrapper.js.map +0 -1
  520. package/src/sap/fe/core/controls/FileWrapper.ts +0 -202
  521. package/src/sap/fe/core/helpers/SideEffectsHelper-dbg.js +0 -141
  522. package/src/sap/fe/core/helpers/SideEffectsHelper.js +0 -6
  523. package/src/sap/fe/core/helpers/SideEffectsHelper.js.map +0 -1
  524. package/src/sap/fe/core/helpers/SideEffectsHelper.ts +0 -129
@@ -2,7 +2,7 @@
2
2
  * SAP UI development toolkit for HTML5 (SAPUI5)
3
3
  * (c) Copyright 2009-2023 SAP SE. All rights reserved
4
4
  */
5
- sap.ui.define(["sap/fe/core/CommonUtils", "sap/fe/core/controllerextensions/editFlow/draft", "sap/m/CheckBox", "sap/m/MessageToast", "sap/m/Text"], function (CommonUtils, draft, CheckBox, MessageToast, Text) {
5
+ sap.ui.define(["sap/base/Log", "sap/fe/core/controllerextensions/editFlow/draft", "sap/m/CheckBox", "sap/m/MessageToast", "sap/m/Text"], function (Log, draft, CheckBox, MessageToast, Text) {
6
6
  "use strict";
7
7
 
8
8
  var _exports = {};
@@ -13,6 +13,7 @@ sap.ui.define(["sap/fe/core/CommonUtils", "sap/fe/core/controllerextensions/edit
13
13
  DeleteOptionTypes["createModeContexts"] = "createModeContexts";
14
14
  DeleteOptionTypes["unSavedContexts"] = "unSavedContexts";
15
15
  DeleteOptionTypes["draftsWithNonDeletableActive"] = "draftsWithNonDeletableActive";
16
+ DeleteOptionTypes["draftsToDeleteBeforeActive"] = "draftsToDeleteBeforeActive";
16
17
  })(DeleteOptionTypes || (DeleteOptionTypes = {}));
17
18
  _exports.DeleteOptionTypes = DeleteOptionTypes;
18
19
  let DeleteDialogContentControl;
@@ -48,7 +49,7 @@ sap.ui.define(["sap/fe/core/CommonUtils", "sap/fe/core/controllerextensions/edit
48
49
  internalModelContext.setProperty("selectedContexts", selectedContexts);
49
50
  internalModelContext.setProperty("numberOfSelectedContexts", selectedContexts.length);
50
51
  }
51
- function afterDeleteProcess(parameters, options, contexts, oResourceBundle) {
52
+ function afterDeleteProcess(parameters, options, contexts, resourceModel) {
52
53
  const {
53
54
  internalModelContext,
54
55
  entitySetName
@@ -66,41 +67,41 @@ sap.ui.define(["sap/fe/core/CommonUtils", "sap/fe/core/controllerextensions/edit
66
67
  internalModelContext.setProperty("deleteEnabled", options.some(option => !option.selected));
67
68
  }
68
69
  if (contexts.length === 1) {
69
- MessageToast.show(CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_DELETE_TOAST_SINGULAR", oResourceBundle, undefined, entitySetName));
70
+ MessageToast.show(resourceModel.getText("C_TRANSACTION_HELPER_DELETE_TOAST_SINGULAR", undefined, entitySetName));
70
71
  } else {
71
- MessageToast.show(CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_DELETE_TOAST_PLURAL", oResourceBundle, undefined, entitySetName));
72
+ MessageToast.show(resourceModel.getText("C_TRANSACTION_HELPER_DELETE_TOAST_PLURAL", undefined, entitySetName));
72
73
  }
73
74
  }
74
75
  function getLockedContextUser(lockedContext) {
75
76
  const draftAdminData = lockedContext.getObject()["DraftAdministrativeData"];
76
77
  return draftAdminData && draftAdminData["InProcessByUser"] || "";
77
78
  }
78
- function getLockedObjectsText(oResourceBundle, numberOfSelectedContexts, lockedContexts) {
79
+ function getLockedObjectsText(resourceModel, numberOfSelectedContexts, lockedContexts) {
79
80
  let retTxt = "";
80
81
  if (numberOfSelectedContexts === 1 && lockedContexts.length === 1) {
81
82
  //only one unsaved object
82
83
  const lockedUser = getLockedContextUser(lockedContexts[0]);
83
- retTxt = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_SINGLE_OBJECT_LOCKED", oResourceBundle, [lockedUser]);
84
+ retTxt = resourceModel.getText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_SINGLE_OBJECT_LOCKED", [lockedUser]);
84
85
  } else if (lockedContexts.length == 1) {
85
86
  const lockedUser = getLockedContextUser(lockedContexts[0]);
86
- retTxt = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_OBJECTINFO_AND_ONE_OBJECT_LOCKED", oResourceBundle, [numberOfSelectedContexts, lockedUser]);
87
+ retTxt = resourceModel.getText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_OBJECTINFO_AND_ONE_OBJECT_LOCKED", [numberOfSelectedContexts, lockedUser]);
87
88
  } else if (lockedContexts.length > 1) {
88
- retTxt = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_OBJECTINFO_AND_FEW_OBJECTS_LOCKED", oResourceBundle, [lockedContexts.length, numberOfSelectedContexts]);
89
+ retTxt = resourceModel.getText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_OBJECTINFO_AND_FEW_OBJECTS_LOCKED", [lockedContexts.length, numberOfSelectedContexts]);
89
90
  }
90
91
  return retTxt;
91
92
  }
92
- function getNonDeletableActivesOfDraftsText(oResourceBundle, numberOfDrafts, totalDeletable) {
93
+ function getNonDeletableActivesOfDraftsText(resourceModel, numberOfDrafts, totalDeletable) {
93
94
  let retTxt = "";
94
95
  if (totalDeletable === numberOfDrafts) {
95
96
  if (numberOfDrafts === 1) {
96
- retTxt = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_CONFIRM_DELETE_ONLY_DRAFT_OF_NON_DELETABLE_ACTIVE", oResourceBundle);
97
+ retTxt = resourceModel.getText("C_TRANSACTION_HELPER_CONFIRM_DELETE_ONLY_DRAFT_OF_NON_DELETABLE_ACTIVE");
97
98
  } else {
98
- retTxt = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_CONFIRM_DELETE_ONLY_DRAFTS_OF_NON_DELETABLE_ACTIVE", oResourceBundle);
99
+ retTxt = resourceModel.getText("C_TRANSACTION_HELPER_CONFIRM_DELETE_ONLY_DRAFTS_OF_NON_DELETABLE_ACTIVE");
99
100
  }
100
101
  } else if (numberOfDrafts === 1) {
101
- retTxt = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_CONFIRM_DELETE_DRAFT_OF_NON_DELETABLE_ACTIVE", oResourceBundle);
102
+ retTxt = resourceModel.getText("C_TRANSACTION_HELPER_CONFIRM_DELETE_DRAFT_OF_NON_DELETABLE_ACTIVE");
102
103
  } else {
103
- retTxt = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_CONFIRM_DELETE_DRAFTS_OF_NON_DELETABLE_ACTIVE", oResourceBundle);
104
+ retTxt = resourceModel.getText("C_TRANSACTION_HELPER_CONFIRM_DELETE_DRAFTS_OF_NON_DELETABLE_ACTIVE");
104
105
  }
105
106
  return retTxt;
106
107
  }
@@ -112,35 +113,35 @@ sap.ui.define(["sap/fe/core/CommonUtils", "sap/fe/core/controllerextensions/edit
112
113
  }
113
114
  return sLastChangedByUser;
114
115
  }
115
- function getUnsavedContextsText(oResourceBundle, numberOfSelectedContexts, unSavedContexts, totalDeletable) {
116
+ function getUnsavedContextsText(resourceModel, numberOfSelectedContexts, unSavedContexts, totalDeletable) {
116
117
  let infoTxt = "",
117
118
  optionTxt = "",
118
119
  optionWithoutTxt = false;
119
120
  if (numberOfSelectedContexts === 1 && unSavedContexts.length === 1) {
120
121
  //only one unsaved object are selected
121
122
  const lastChangedByUser = getUnSavedContextUser(unSavedContexts[0]);
122
- infoTxt = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_UNSAVED_CHANGES", oResourceBundle, [lastChangedByUser]);
123
+ infoTxt = resourceModel.getText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_UNSAVED_CHANGES", [lastChangedByUser]);
123
124
  optionWithoutTxt = true;
124
125
  } else if (numberOfSelectedContexts === unSavedContexts.length) {
125
126
  //only multiple unsaved objects are selected
126
- infoTxt = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_UNSAVED_CHANGES_MULTIPLE_OBJECTS", oResourceBundle);
127
+ infoTxt = resourceModel.getText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_UNSAVED_CHANGES_MULTIPLE_OBJECTS");
127
128
  optionWithoutTxt = true;
128
129
  } else if (totalDeletable === unSavedContexts.length) {
129
130
  // non-deletable/locked exists, all deletable are unsaved by others
130
131
  if (unSavedContexts.length === 1) {
131
132
  const lastChangedByUser = getUnSavedContextUser(unSavedContexts[0]);
132
- infoTxt = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_UNSAVED_AND_FEW_OBJECTS_LOCKED_SINGULAR", oResourceBundle, [lastChangedByUser]);
133
+ infoTxt = resourceModel.getText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_UNSAVED_AND_FEW_OBJECTS_LOCKED_SINGULAR", [lastChangedByUser]);
133
134
  } else {
134
- infoTxt = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_UNSAVED_AND_FEW_OBJECTS_LOCKED_PLURAL", oResourceBundle);
135
+ infoTxt = resourceModel.getText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_UNSAVED_AND_FEW_OBJECTS_LOCKED_PLURAL");
135
136
  }
136
137
  optionWithoutTxt = true;
137
138
  } else if (totalDeletable > unSavedContexts.length) {
138
139
  // non-deletable/locked exists, deletable include unsaved and other types.
139
140
  if (unSavedContexts.length === 1) {
140
141
  const lastChangedByUser = getUnSavedContextUser(unSavedContexts[0]);
141
- optionTxt = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_OBJECTINFO_AND_FEW_OBJECTS_UNSAVED_SINGULAR", oResourceBundle, [lastChangedByUser]);
142
+ optionTxt = resourceModel.getText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_OBJECTINFO_AND_FEW_OBJECTS_UNSAVED_SINGULAR", [lastChangedByUser]);
142
143
  } else {
143
- optionTxt = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_OBJECTINFO_AND_FEW_OBJECTS_UNSAVED_PLURAL", oResourceBundle);
144
+ optionTxt = resourceModel.getText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_OBJECTINFO_AND_FEW_OBJECTS_UNSAVED_PLURAL");
144
145
  }
145
146
  }
146
147
  return {
@@ -149,11 +150,11 @@ sap.ui.define(["sap/fe/core/CommonUtils", "sap/fe/core/controllerextensions/edit
149
150
  optionWithoutTxt
150
151
  };
151
152
  }
152
- function getNonDeletableText(mParameters, totalNumDeletableContexts, oResourceBundle) {
153
+ function getNonDeletableText(mParameters, totalNumDeletableContexts, resourceModel) {
153
154
  const {
154
155
  numberOfSelectedContexts,
155
- lockedContexts,
156
- draftsWithNonDeletableActive
156
+ lockedContexts = [],
157
+ draftsWithNonDeletableActive = []
157
158
  } = mParameters;
158
159
  const nonDeletableContexts = numberOfSelectedContexts - (lockedContexts.length + totalNumDeletableContexts - draftsWithNonDeletableActive.length);
159
160
  let retTxt = "";
@@ -163,32 +164,40 @@ sap.ui.define(["sap/fe/core/CommonUtils", "sap/fe/core/controllerextensions/edit
163
164
  if (lockedContexts.length > 0) {
164
165
  // Locked contexts exist
165
166
  if (nonDeletableContexts === 1) {
166
- retTxt = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_ALL_REMAINING_NON_DELETABLE_SINGULAR", oResourceBundle, undefined);
167
+ retTxt = resourceModel.getText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_ALL_REMAINING_NON_DELETABLE_SINGULAR");
167
168
  } else {
168
- retTxt = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_ALL_REMAINING_NON_DELETABLE_PLURAL", oResourceBundle, undefined);
169
+ retTxt = resourceModel.getText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_ALL_REMAINING_NON_DELETABLE_PLURAL");
169
170
  }
170
171
  } else if (nonDeletableContexts === 1) {
171
172
  // Only pure non-deletable contexts exist single
172
- retTxt = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_SINGLE_AND_ONE_OBJECT_NON_DELETABLE", oResourceBundle, undefined);
173
+ retTxt = resourceModel.getText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_SINGLE_AND_ONE_OBJECT_NON_DELETABLE");
173
174
  } else {
174
175
  // Only pure non-deletable contexts exist multiple
175
- retTxt = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_MULTIPLE_AND_ALL_OBJECT_NON_DELETABLE", oResourceBundle, undefined);
176
+ retTxt = resourceModel.getText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_MULTIPLE_AND_ALL_OBJECT_NON_DELETABLE");
176
177
  }
177
178
  } else if (nonDeletableContexts === 1) {
178
179
  // deletable and non-deletable exists together, single
179
- retTxt = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_OBJECTINFO_AND_ONE_OBJECT_NON_DELETABLE", oResourceBundle, [numberOfSelectedContexts]);
180
+ retTxt = resourceModel.getText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_OBJECTINFO_AND_ONE_OBJECT_NON_DELETABLE", [numberOfSelectedContexts]);
180
181
  } else if (nonDeletableContexts > 1) {
181
182
  // deletable and non-deletable exists together, multiple
182
- retTxt = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_OBJECTINFO_AND_FEW_OBJECTS_NON_DELETABLE", oResourceBundle, [nonDeletableContexts, numberOfSelectedContexts]);
183
+ retTxt = resourceModel.getText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_OBJECTINFO_AND_FEW_OBJECTS_NON_DELETABLE", [nonDeletableContexts, numberOfSelectedContexts]);
183
184
  }
184
- return retTxt;
185
+ return retTxt ? new Text({
186
+ text: retTxt
187
+ }) : undefined;
185
188
  }
186
189
  function getConfirmedDeletableContext(contexts, options) {
187
190
  return options.reduce((result, option) => {
188
- return option.selected ? result.concat(option.contexts) : result;
191
+ return option.selected && option.type !== DeleteOptionTypes.draftsToDeleteBeforeActive ? result.concat(option.contexts) : result;
189
192
  }, contexts);
190
193
  }
191
- function updateDraftOptionsForDeletableTexts(mParameters, vContexts, totalDeletable, oResourceBundle, items, options) {
194
+ function getDraftsToDeleteBeforeActive(options) {
195
+ const contexts = [];
196
+ return options.reduce((result, option) => {
197
+ return option.selected && option.type === DeleteOptionTypes.draftsToDeleteBeforeActive ? result.concat(option.contexts) : result;
198
+ }, contexts);
199
+ }
200
+ function updateDraftOptionsForDeletableTexts(mParameters, vContexts, totalDeletable, resourceModel, items, options) {
192
201
  const {
193
202
  numberOfSelectedContexts,
194
203
  draftsWithDeletableActive,
@@ -197,14 +206,25 @@ sap.ui.define(["sap/fe/core/CommonUtils", "sap/fe/core/controllerextensions/edit
197
206
  lockedContexts,
198
207
  draftsWithNonDeletableActive
199
208
  } = mParameters;
200
- let nonDeletableContextText = "",
201
- lockedContextsTxt = "";
209
+ let lockedContextsTxt = "";
202
210
 
203
211
  // drafts with active
204
212
  if (draftsWithDeletableActive.length > 0) {
213
+ const draftsToDeleteBeforeActive = [];
205
214
  draftsWithDeletableActive.forEach(deletableDraftInfo => {
215
+ if (deletableDraftInfo.draft.getProperty("DraftAdministrativeData/InProcessByUser")) {
216
+ // If an own draft is locked then the draft needs to be discarded before deleting active record.
217
+ draftsToDeleteBeforeActive.push(deletableDraftInfo.draft);
218
+ }
206
219
  vContexts.push(deletableDraftInfo.siblingInfo.targetContext);
207
220
  });
221
+ if (draftsToDeleteBeforeActive.length > 0) {
222
+ options.push({
223
+ type: DeleteOptionTypes.draftsToDeleteBeforeActive,
224
+ contexts: draftsToDeleteBeforeActive,
225
+ selected: true
226
+ });
227
+ }
208
228
  }
209
229
 
210
230
  // create mode drafts
@@ -215,23 +235,22 @@ sap.ui.define(["sap/fe/core/CommonUtils", "sap/fe/core/controllerextensions/edit
215
235
 
216
236
  // items locked msg
217
237
  if (lockedContexts.length > 0) {
218
- lockedContextsTxt = deleteHelper.getLockedObjectsText(oResourceBundle, numberOfSelectedContexts, lockedContexts) || "";
238
+ lockedContextsTxt = deleteHelper.getLockedObjectsText(resourceModel, numberOfSelectedContexts, lockedContexts) || "";
219
239
  items.push(new Text({
220
240
  text: lockedContextsTxt
221
241
  }));
222
242
  }
223
243
 
224
244
  // non deletable msg
225
- if (numberOfSelectedContexts != totalDeletable - draftsWithNonDeletableActive.length + lockedContexts.length) {
226
- nonDeletableContextText = deleteHelper.getNonDeletableText(mParameters, totalDeletable, oResourceBundle);
227
- items.push(new Text({
228
- text: nonDeletableContextText
229
- }));
245
+ const nonDeletableExists = numberOfSelectedContexts != totalDeletable - draftsWithNonDeletableActive.length + lockedContexts.length;
246
+ const nonDeletableTextCtrl = nonDeletableExists && deleteHelper.getNonDeletableText(mParameters, totalDeletable, resourceModel);
247
+ if (nonDeletableTextCtrl) {
248
+ items.push(nonDeletableTextCtrl);
230
249
  }
231
250
 
232
251
  // option: unsaved changes by others
233
252
  if (unSavedContexts.length > 0) {
234
- const unsavedChangesTxts = deleteHelper.getUnsavedContextsText(oResourceBundle, numberOfSelectedContexts, unSavedContexts, totalDeletable) || {};
253
+ const unsavedChangesTxts = deleteHelper.getUnsavedContextsText(resourceModel, numberOfSelectedContexts, unSavedContexts, totalDeletable) || {};
235
254
  if (unsavedChangesTxts.infoTxt) {
236
255
  items.push(new Text({
237
256
  text: unsavedChangesTxts.infoTxt
@@ -250,7 +269,7 @@ sap.ui.define(["sap/fe/core/CommonUtils", "sap/fe/core/controllerextensions/edit
250
269
 
251
270
  // option: drafts with active not deletable
252
271
  if (draftsWithNonDeletableActive.length > 0) {
253
- const nonDeletableActivesOfDraftsText = deleteHelper.getNonDeletableActivesOfDraftsText(oResourceBundle, draftsWithNonDeletableActive.length, totalDeletable) || "";
272
+ const nonDeletableActivesOfDraftsText = deleteHelper.getNonDeletableActivesOfDraftsText(resourceModel, draftsWithNonDeletableActive.length, totalDeletable) || "";
254
273
  if (nonDeletableActivesOfDraftsText) {
255
274
  options.push({
256
275
  type: DeleteOptionTypes.draftsWithNonDeletableActive,
@@ -298,7 +317,7 @@ sap.ui.define(["sap/fe/core/CommonUtils", "sap/fe/core/controllerextensions/edit
298
317
  });
299
318
  }
300
319
  }
301
- function updateOptionsForDeletableTexts(mParameters, directDeletableContexts, oResourceBundle, options) {
320
+ function updateOptionsForDeletableTexts(mParameters, directDeletableContexts, resourceModel, options) {
302
321
  const {
303
322
  numberOfSelectedContexts,
304
323
  entitySetName,
@@ -326,15 +345,12 @@ sap.ui.define(["sap/fe/core/CommonUtils", "sap/fe/core/controllerextensions/edit
326
345
  } else {
327
346
  aParams = [sKeyValue, ""];
328
347
  }
329
- txt = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_OBJECTINFO", oResourceBundle, aParams, entitySetName);
330
- } else if (sKeyValue) {
331
- aParams = [sKeyValue, ""];
332
- txt = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_OBJECTINFO", oResourceBundle, aParams, entitySetName);
348
+ txt = resourceModel.getText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_OBJECTINFO", aParams, entitySetName);
333
349
  } else {
334
- txt = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_OBJECTTITLE_SINGULAR", oResourceBundle, undefined, entitySetName);
350
+ txt = resourceModel.getText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_OBJECTTITLE_SINGULAR", undefined, entitySetName);
335
351
  }
336
352
  } else {
337
- txt = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_OBJECTTITLE_SINGULAR", oResourceBundle, undefined, entitySetName);
353
+ txt = resourceModel.getText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_OBJECTTITLE_SINGULAR", undefined, entitySetName);
338
354
  }
339
355
  options.push({
340
356
  type: DeleteOptionTypes.deletableContexts,
@@ -348,9 +364,9 @@ sap.ui.define(["sap/fe/core/CommonUtils", "sap/fe/core/controllerextensions/edit
348
364
  // other types exists with pure deletable ones
349
365
  let deletableOptionTxt = "";
350
366
  if (totalDeletable === 1) {
351
- deletableOptionTxt = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_OBJECTTITLE_SINGULAR_NON_DELETABLE", oResourceBundle, undefined, entitySetName);
367
+ deletableOptionTxt = resourceModel.getText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_OBJECTTITLE_SINGULAR_NON_DELETABLE", undefined, entitySetName);
352
368
  } else {
353
- deletableOptionTxt = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_OBJECTTITLE_PLURAL_NON_DELETABLE", oResourceBundle, undefined, entitySetName);
369
+ deletableOptionTxt = resourceModel.getText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_OBJECTTITLE_PLURAL_NON_DELETABLE", undefined, entitySetName);
354
370
  }
355
371
  options.unshift({
356
372
  type: DeleteOptionTypes.deletableContexts,
@@ -361,7 +377,7 @@ sap.ui.define(["sap/fe/core/CommonUtils", "sap/fe/core/controllerextensions/edit
361
377
  });
362
378
  } else {
363
379
  // only deletable
364
- const allDeletableTxt = totalDeletable === 1 ? CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_OBJECTTITLE_SINGULAR", oResourceBundle, undefined, entitySetName) : CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_OBJECTTITLE_PLURAL", oResourceBundle, undefined, entitySetName);
380
+ const allDeletableTxt = totalDeletable === 1 ? resourceModel.getText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_OBJECTTITLE_SINGULAR", undefined, entitySetName) : resourceModel.getText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_OBJECTTITLE_PLURAL", undefined, entitySetName);
365
381
  options.push({
366
382
  type: DeleteOptionTypes.deletableContexts,
367
383
  contexts: directDeletableContexts,
@@ -372,9 +388,10 @@ sap.ui.define(["sap/fe/core/CommonUtils", "sap/fe/core/controllerextensions/edit
372
388
  }
373
389
  }
374
390
  }
375
- async function deleteConfirmHandler(options, mParameters, messageHandler, oResourceBundle, appComponent, draftEnabled) {
391
+ async function deleteConfirmHandler(options, mParameters, messageHandler, resourceModel, appComponent, draftEnabled) {
376
392
  try {
377
393
  const contexts = deleteHelper.getConfirmedDeletableContext([], options);
394
+ const draftsToDeleteBeforeActive = getDraftsToDeleteBeforeActive(options);
378
395
  const {
379
396
  beforeDeleteCallBack,
380
397
  parentControl
@@ -386,15 +403,27 @@ sap.ui.define(["sap/fe/core/CommonUtils", "sap/fe/core/controllerextensions/edit
386
403
  }
387
404
  if (contexts && contexts.length) {
388
405
  try {
406
+ const enableStrictHandling = contexts.length === 1 ? true : false;
407
+ const draftErrors = [];
408
+ await Promise.allSettled(draftsToDeleteBeforeActive.map(function (context) {
409
+ try {
410
+ return draft.deleteDraft(context, appComponent, enableStrictHandling);
411
+ } catch (e) {
412
+ Log.error(`FE : core : DeleteHelper : Error while discrding draft with path : ${context.getPath()}`);
413
+ draftErrors.push(e);
414
+ }
415
+ }));
389
416
  await Promise.all(contexts.map(function (context) {
390
417
  if (draftEnabled && !context.getProperty("IsActiveEntity")) {
391
418
  //delete the draft
392
- const enableStrictHandling = contexts.length === 1 ? true : false;
393
419
  return draft.deleteDraft(context, appComponent, enableStrictHandling);
394
420
  }
395
421
  return context.delete();
396
422
  }));
397
- deleteHelper.afterDeleteProcess(mParameters, options, contexts, oResourceBundle);
423
+ deleteHelper.afterDeleteProcess(mParameters, options, contexts, resourceModel);
424
+ if (draftErrors.length > 0) {
425
+ throw Error(`FE : core : DeleteHelper : Errors on draft delete : ${draftErrors}`);
426
+ }
398
427
  } catch (error) {
399
428
  await messageHandler.showMessageDialog({
400
429
  control: parentControl
@@ -441,11 +470,11 @@ sap.ui.define(["sap/fe/core/CommonUtils", "sap/fe/core/controllerextensions/edit
441
470
  info.locked = !!((_context$getObject = context.getObject("DraftAdministrativeData")) !== null && _context$getObject !== void 0 && _context$getObject.InProcessByUser);
442
471
  info.hasDraft = context.getProperty("HasDraftEntity");
443
472
  }
444
- if (info.isDraftRoot || info.isDraftNode) {
473
+ if (info.isDraftRoot) {
445
474
  info.isActive = context.getProperty("IsActiveEntity");
446
475
  info.hasActive = context.getProperty("HasActiveEntity");
447
476
  if (!info.isActive && info.hasActive) {
448
- // get sibling contexts
477
+ // get sibling contexts (only relevant for draft root, not for nodes)
449
478
  // draft.computeSiblingInformation expects draft root as first parameter - if we are on a subnode, this is not given
450
479
  // - done wrong also above, but seems not to break anything
451
480
  // - why is draft.computeSiblingInformation not able to calculate draft root on its own?!
@@ -476,7 +505,10 @@ sap.ui.define(["sap/fe/core/CommonUtils", "sap/fe/core/controllerextensions/edit
476
505
  value: contextInfos.filter(info => info.isDraftRoot && !info.isActive && info.hasActive && info.siblingDeletable)
477
506
  }, {
478
507
  key: "draftsWithNonDeletableActive",
479
- value: contextInfos.filter(info => !info.isActive && info.hasActive && !info.siblingDeletable)
508
+ // only for draft root: For draft node, we only rely on information in the draft itself (not its active sibling)
509
+ // application has to take care to set this correctly (in case active sibling must not be deletable, activation
510
+ // of draft with deleted node would also delte active sibling => deletion of draft node to be avoided)
511
+ value: contextInfos.filter(info => info.isDraftRoot && !info.isActive && info.hasActive && !info.siblingDeletable)
480
512
  }, {
481
513
  key: "lockedContexts",
482
514
  value: contextInfos.filter(info => info.isDraftRoot && info.isActive && info.hasDraft && info.locked)
@@ -487,11 +519,10 @@ sap.ui.define(["sap/fe/core/CommonUtils", "sap/fe/core/controllerextensions/edit
487
519
  // non-draft/sticky and deletable
488
520
  // active draft root without any draft and deletable
489
521
  // created draft root (regardless of deletable)
490
- // draft node without active (regardless whether root is create or edit, and regardless of deletable)
491
- // draft node with deletable active
522
+ // draft node only according to its annotation
492
523
  {
493
524
  key: "deletableContexts",
494
- value: contextInfos.filter(info => !info.isDraftRoot && !info.isDraftNode && info.deletable || info.isDraftRoot && info.isActive && !info.hasDraft && info.deletable || info.isDraftRoot && !info.isActive && !info.hasActive || info.isDraftNode && !info.isActive && !info.hasActive || info.isDraftNode && !info.isActive && info.hasActive && info.siblingDeletable)
525
+ value: contextInfos.filter(info => !info.isDraftRoot && !info.isDraftNode && info.deletable || info.isDraftRoot && info.isActive && !info.hasDraft && info.deletable || info.isDraftRoot && !info.isActive && !info.hasActive || info.isDraftNode && info.deletable)
495
526
  }];
496
527
  for (const {
497
528
  key,
@@ -523,4 +554,4 @@ sap.ui.define(["sap/fe/core/CommonUtils", "sap/fe/core/controllerextensions/edit
523
554
  };
524
555
  return deleteHelper;
525
556
  }, false);
526
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJEZWxldGVPcHRpb25UeXBlcyIsIkRlbGV0ZURpYWxvZ0NvbnRlbnRDb250cm9sIiwiZ2V0VXBkYXRlZFNlbGVjdGlvbnMiLCJpbnRlcm5hbE1vZGVsQ29udGV4dCIsInR5cGUiLCJzZWxlY3RlZENvbnRleHRzIiwiY29udGV4dHNUb1JlbW92ZSIsImZvckVhY2giLCJjb250ZXh0IiwiaWR4IiwiaW5kZXhPZiIsInNwbGljZSIsInNldFByb3BlcnR5IiwiY2xlYXJTZWxlY3RlZENvbnRleHRzRm9yT3B0aW9uIiwib3B0aW9uIiwiZ2V0UHJvcGVydHkiLCJkZWxldGFibGVDb250ZXh0cyIsImNyZWF0ZU1vZGVDb250ZXh0cyIsImRyYWZ0U2libGluZ1BhaXJzIiwiZHJhZnRzV2l0aERlbGV0YWJsZUFjdGl2ZSIsImRyYWZ0cyIsIm1hcCIsImNvbnRleHRQYWlyIiwiZHJhZnQiLCJsZW5ndGgiLCJhZnRlckRlbGV0ZVByb2Nlc3MiLCJwYXJhbWV0ZXJzIiwib3B0aW9ucyIsImNvbnRleHRzIiwib1Jlc291cmNlQnVuZGxlIiwiZW50aXR5U2V0TmFtZSIsInVuZGVmaW5lZCIsInNlbGVjdGVkIiwic29tZSIsIk1lc3NhZ2VUb2FzdCIsInNob3ciLCJDb21tb25VdGlscyIsImdldFRyYW5zbGF0ZWRUZXh0IiwiZ2V0TG9ja2VkQ29udGV4dFVzZXIiLCJsb2NrZWRDb250ZXh0IiwiZHJhZnRBZG1pbkRhdGEiLCJnZXRPYmplY3QiLCJnZXRMb2NrZWRPYmplY3RzVGV4dCIsIm51bWJlck9mU2VsZWN0ZWRDb250ZXh0cyIsImxvY2tlZENvbnRleHRzIiwicmV0VHh0IiwibG9ja2VkVXNlciIsImdldE5vbkRlbGV0YWJsZUFjdGl2ZXNPZkRyYWZ0c1RleHQiLCJudW1iZXJPZkRyYWZ0cyIsInRvdGFsRGVsZXRhYmxlIiwiZ2V0VW5TYXZlZENvbnRleHRVc2VyIiwidW5TYXZlZENvbnRleHQiLCJzTGFzdENoYW5nZWRCeVVzZXIiLCJnZXRVbnNhdmVkQ29udGV4dHNUZXh0IiwidW5TYXZlZENvbnRleHRzIiwiaW5mb1R4dCIsIm9wdGlvblR4dCIsIm9wdGlvbldpdGhvdXRUeHQiLCJsYXN0Q2hhbmdlZEJ5VXNlciIsImdldE5vbkRlbGV0YWJsZVRleHQiLCJtUGFyYW1ldGVycyIsInRvdGFsTnVtRGVsZXRhYmxlQ29udGV4dHMiLCJkcmFmdHNXaXRoTm9uRGVsZXRhYmxlQWN0aXZlIiwibm9uRGVsZXRhYmxlQ29udGV4dHMiLCJnZXRDb25maXJtZWREZWxldGFibGVDb250ZXh0IiwicmVkdWNlIiwicmVzdWx0IiwiY29uY2F0IiwidXBkYXRlRHJhZnRPcHRpb25zRm9yRGVsZXRhYmxlVGV4dHMiLCJ2Q29udGV4dHMiLCJpdGVtcyIsIm5vbkRlbGV0YWJsZUNvbnRleHRUZXh0IiwibG9ja2VkQ29udGV4dHNUeHQiLCJkZWxldGFibGVEcmFmdEluZm8iLCJwdXNoIiwic2libGluZ0luZm8iLCJ0YXJnZXRDb250ZXh0IiwiZGVsZXRlSGVscGVyIiwiVGV4dCIsInRleHQiLCJ1bnNhdmVkQ2hhbmdlc1R4dHMiLCJjb250cm9sIiwiQ0hFQ0tCT1giLCJub25EZWxldGFibGVBY3RpdmVzT2ZEcmFmdHNUZXh0IiwiVEVYVCIsInVwZGF0ZUNvbnRlbnRGb3JEZWxldGVEaWFsb2ciLCJDaGVja0JveCIsInNlbGVjdCIsIm9FdmVudCIsImNoZWNrQm94IiwiZ2V0U291cmNlIiwiZ2V0U2VsZWN0ZWQiLCJ1cGRhdGVPcHRpb25zRm9yRGVsZXRhYmxlVGV4dHMiLCJkaXJlY3REZWxldGFibGVDb250ZXh0cyIsInBhcmVudENvbnRyb2wiLCJkZXNjcmlwdGlvbiIsIm9MaW5lQ29udGV4dERhdGEiLCJvVGFibGUiLCJzS2V5IiwiZ2V0UGFyZW50IiwiZ2V0SWRlbnRpZmllckNvbHVtbiIsInR4dCIsImFQYXJhbXMiLCJzS2V5VmFsdWUiLCJzRGVzY3JpcHRpb24iLCJwYXRoIiwiZGVsZXRhYmxlT3B0aW9uVHh0IiwidW5zaGlmdCIsImFsbERlbGV0YWJsZVR4dCIsImRlbGV0ZUNvbmZpcm1IYW5kbGVyIiwibWVzc2FnZUhhbmRsZXIiLCJhcHBDb21wb25lbnQiLCJkcmFmdEVuYWJsZWQiLCJiZWZvcmVEZWxldGVDYWxsQmFjayIsIlByb21pc2UiLCJhbGwiLCJlbmFibGVTdHJpY3RIYW5kbGluZyIsImRlbGV0ZURyYWZ0IiwiZGVsZXRlIiwiZXJyb3IiLCJzaG93TWVzc2FnZURpYWxvZyIsIm9FcnJvciIsInNob3dNZXNzYWdlcyIsInVwZGF0ZURlbGV0ZUluZm9Gb3JTZWxlY3RlZENvbnRleHRzIiwiY29udGV4dEluZm9zIiwibWV0YUNvbnRleHQiLCJnZXRNb2RlbCIsImdldE1ldGFNb2RlbCIsImdldE1ldGFDb250ZXh0IiwiZ2V0Q2Fub25pY2FsUGF0aCIsImRlbGV0YWJsZVBhdGgiLCJzdGF0aWNEZWxldGFibGUiLCJpbmZvIiwiaXNEcmFmdFJvb3QiLCJpc0RyYWZ0Tm9kZSIsImlzQWN0aXZlIiwiaGFzQWN0aXZlIiwiaGFzRHJhZnQiLCJsb2NrZWQiLCJkZWxldGFibGUiLCJzaWJsaW5nUHJvbWlzZSIsInJlc29sdmUiLCJzaWJsaW5nRGVsZXRhYmxlIiwiSW5Qcm9jZXNzQnlVc2VyIiwiY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbiIsInRoZW4iLCJzaWJsaW5nSW5mb3JtYXRpb24iLCJyZXF1ZXN0UHJvcGVydHkiLCJidWNrZXRzIiwia2V5IiwidmFsdWUiLCJmaWx0ZXIiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIkRlbGV0ZUhlbHBlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSBSZXNvdXJjZUJ1bmRsZSBmcm9tIFwic2FwL2Jhc2UvaTE4bi9SZXNvdXJjZUJ1bmRsZVwiO1xuXG5pbXBvcnQgQXBwQ29tcG9uZW50IGZyb20gXCJzYXAvZmUvY29yZS9BcHBDb21wb25lbnRcIjtcbmltcG9ydCBDb21tb25VdGlscyBmcm9tIFwic2FwL2ZlL2NvcmUvQ29tbW9uVXRpbHNcIjtcbmltcG9ydCBkcmFmdCwgeyBTaWJsaW5nSW5mb3JtYXRpb24gfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvZWRpdEZsb3cvZHJhZnRcIjtcbmltcG9ydCB0eXBlIE1lc3NhZ2VIYW5kbGVyIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9NZXNzYWdlSGFuZGxlclwiO1xuXG5pbXBvcnQgQ2hlY2tCb3ggZnJvbSBcInNhcC9tL0NoZWNrQm94XCI7XG5pbXBvcnQgTWVzc2FnZVRvYXN0IGZyb20gXCJzYXAvbS9NZXNzYWdlVG9hc3RcIjtcbmltcG9ydCBUZXh0IGZyb20gXCJzYXAvbS9UZXh0XCI7XG5cbmltcG9ydCBUYWJsZUFQSSBmcm9tIFwic2FwL2ZlL21hY3Jvcy90YWJsZS9UYWJsZUFQSVwiO1xuaW1wb3J0IEV2ZW50IGZyb20gXCJzYXAvdWkvYmFzZS9FdmVudFwiO1xuaW1wb3J0IENvbnRyb2wgZnJvbSBcInNhcC91aS9jb3JlL0NvbnRyb2xcIjtcbmltcG9ydCBUYWJsZSBmcm9tIFwic2FwL3VpL21kYy9UYWJsZVwiO1xuaW1wb3J0IENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgdHlwZSB7IFY0Q29udGV4dCB9IGZyb20gXCJ0eXBlcy9leHRlbnNpb25fdHlwZXNcIjtcbmltcG9ydCB7IEludGVybmFsTW9kZWxDb250ZXh0IH0gZnJvbSBcIi4vTW9kZWxIZWxwZXJcIjtcblxuZXhwb3J0IGVudW0gRGVsZXRlT3B0aW9uVHlwZXMge1xuXHRkZWxldGFibGVDb250ZXh0cyA9IFwiZGVsZXRhYmxlQ29udGV4dHNcIixcblx0ZHJhZnRzV2l0aERlbGV0YWJsZUFjdGl2ZSA9IFwiZHJhZnRzV2l0aERlbGV0YWJsZUFjdGl2ZVwiLFxuXHRjcmVhdGVNb2RlQ29udGV4dHMgPSBcImNyZWF0ZU1vZGVDb250ZXh0c1wiLFxuXHR1blNhdmVkQ29udGV4dHMgPSBcInVuU2F2ZWRDb250ZXh0c1wiLFxuXHRkcmFmdHNXaXRoTm9uRGVsZXRhYmxlQWN0aXZlID0gXCJkcmFmdHNXaXRoTm9uRGVsZXRhYmxlQWN0aXZlXCJcbn1cblxuZXhwb3J0IGVudW0gRGVsZXRlRGlhbG9nQ29udGVudENvbnRyb2wge1xuXHRDSEVDS0JPWCA9IFwiY2hlY2tCb3hcIixcblx0VEVYVCA9IFwidGV4dFwiXG59XG5cbmV4cG9ydCB0eXBlIERyYWZ0U2libGluZ1BhaXIgPSB7XG5cdGRyYWZ0OiBWNENvbnRleHQ7XG5cdHNpYmxpbmdJbmZvOiBTaWJsaW5nSW5mb3JtYXRpb247XG59O1xuXG5leHBvcnQgdHlwZSBEZWxldGVPcHRpb24gPSB7XG5cdHR5cGU6IERlbGV0ZU9wdGlvblR5cGVzO1xuXHRjb250ZXh0czogVjRDb250ZXh0W107XG5cdHNlbGVjdGVkOiBib29sZWFuO1xuXHR0ZXh0Pzogc3RyaW5nO1xuXHRjb250cm9sPzogRGVsZXRlRGlhbG9nQ29udGVudENvbnRyb2w7XG59O1xuXG5leHBvcnQgdHlwZSBNb2RlbE9iamVjdFByb3BlcnRpZXMgPSB7XG5cdGRlbGV0YWJsZUNvbnRleHRzOiBWNENvbnRleHRbXTtcblx0dW5TYXZlZENvbnRleHRzOiBWNENvbnRleHRbXTtcblx0Y3JlYXRlTW9kZUNvbnRleHRzOiBWNENvbnRleHRbXTtcblx0ZHJhZnRzV2l0aE5vbkRlbGV0YWJsZUFjdGl2ZTogVjRDb250ZXh0W107XG5cdGxvY2tlZENvbnRleHRzOiBWNENvbnRleHRbXTtcblx0ZHJhZnRzV2l0aERlbGV0YWJsZUFjdGl2ZTogRHJhZnRTaWJsaW5nUGFpcltdO1xuXHRkZWxldGVFbmFibGVkOiBib29sZWFuO1xufTtcblxuZXhwb3J0IHR5cGUgRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGFUeXBlID0ge1xuXHREcmFmdFVVSUQ6IHN0cmluZztcblx0SW5Qcm9jZXNzQnlVc2VyPzogc3RyaW5nO1xuXHRJblByb2Nlc3NCeVVzZXJEZXNjcmlwdGlvbj86IHN0cmluZztcblx0Q3JlYXRlZEJ5VXNlckRlc2NyaXB0aW9uPzogc3RyaW5nO1xuXHRDcmVhdGVkQnlVc2VyPzogc3RyaW5nO1xuXHRMYXN0Q2hhbmdlZEJ5VXNlckRlc2NyaXB0aW9uPzogc3RyaW5nO1xuXHRMYXN0Q2hhbmdlZEJ5VXNlcj86IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIERlbGV0ZVBhcmFtZXRlcnMgPSB7XG5cdGludGVybmFsTW9kZWxDb250ZXh0OiBJbnRlcm5hbE1vZGVsQ29udGV4dDtcblx0bnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzOiBudW1iZXI7XG5cdGVudGl0eVNldE5hbWU6IHN0cmluZztcblx0cGFyZW50Q29udHJvbDogQ29udHJvbDtcblx0ZGVzY3JpcHRpb246IHsgcGF0aDogc3RyaW5nIH07XG5cdGJlZm9yZURlbGV0ZUNhbGxCYWNrOiBGdW5jdGlvbjtcblx0ZGVsZXRhYmxlQ29udGV4dHM6IFY0Q29udGV4dFtdO1xuXHR1blNhdmVkQ29udGV4dHM6IFY0Q29udGV4dFtdO1xuXHRjcmVhdGVNb2RlQ29udGV4dHM6IFY0Q29udGV4dFtdO1xuXHRkcmFmdHNXaXRoTm9uRGVsZXRhYmxlQWN0aXZlOiBWNENvbnRleHRbXTtcblx0bG9ja2VkQ29udGV4dHM6IFY0Q29udGV4dFtdO1xuXHRkcmFmdHNXaXRoRGVsZXRhYmxlQWN0aXZlOiBEcmFmdFNpYmxpbmdQYWlyW107XG59O1xuXG5leHBvcnQgdHlwZSBEZWxldGVUZXh0SW5mbyA9IHtcblx0aW5mb1R4dD86IHN0cmluZztcblx0b3B0aW9uVHh0Pzogc3RyaW5nO1xuXHRvcHRpb25XaXRob3V0VHh0PzogYm9vbGVhbjtcbn07XG5cbmZ1bmN0aW9uIGdldFVwZGF0ZWRTZWxlY3Rpb25zKFxuXHRpbnRlcm5hbE1vZGVsQ29udGV4dDogSW50ZXJuYWxNb2RlbENvbnRleHQsXG5cdHR5cGU6IERlbGV0ZU9wdGlvblR5cGVzLFxuXHRzZWxlY3RlZENvbnRleHRzOiBWNENvbnRleHRbXSxcblx0Y29udGV4dHNUb1JlbW92ZTogVjRDb250ZXh0W11cbik6IFY0Q29udGV4dFtdIHtcblx0Y29udGV4dHNUb1JlbW92ZS5mb3JFYWNoKChjb250ZXh0OiBWNENvbnRleHQpID0+IHtcblx0XHRjb25zdCBpZHggPSBzZWxlY3RlZENvbnRleHRzLmluZGV4T2YoY29udGV4dCk7XG5cdFx0aWYgKGlkeCAhPT0gLTEpIHtcblx0XHRcdHNlbGVjdGVkQ29udGV4dHMuc3BsaWNlKGlkeCwgMSk7XG5cdFx0fVxuXHR9KTtcblx0aW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkodHlwZSwgW10pO1xuXG5cdHJldHVybiBbLi4uc2VsZWN0ZWRDb250ZXh0c107XG59XG5cbmZ1bmN0aW9uIGNsZWFyU2VsZWN0ZWRDb250ZXh0c0Zvck9wdGlvbihpbnRlcm5hbE1vZGVsQ29udGV4dDogSW50ZXJuYWxNb2RlbENvbnRleHQsIG9wdGlvbjogRGVsZXRlT3B0aW9uKSB7XG5cdGxldCBzZWxlY3RlZENvbnRleHRzID0gKGludGVybmFsTW9kZWxDb250ZXh0LmdldFByb3BlcnR5KFwic2VsZWN0ZWRDb250ZXh0c1wiKSBhcyBWNENvbnRleHRbXSkgfHwgW107XG5cblx0aWYgKG9wdGlvbi50eXBlID09PSBEZWxldGVPcHRpb25UeXBlcy5kZWxldGFibGVDb250ZXh0cykge1xuXHRcdHNlbGVjdGVkQ29udGV4dHMgPSBnZXRVcGRhdGVkU2VsZWN0aW9ucyhcblx0XHRcdGludGVybmFsTW9kZWxDb250ZXh0LFxuXHRcdFx0RGVsZXRlT3B0aW9uVHlwZXMuZGVsZXRhYmxlQ29udGV4dHMsXG5cdFx0XHRzZWxlY3RlZENvbnRleHRzLFxuXHRcdFx0aW50ZXJuYWxNb2RlbENvbnRleHQuZ2V0UHJvcGVydHkoRGVsZXRlT3B0aW9uVHlwZXMuZGVsZXRhYmxlQ29udGV4dHMpIHx8IFtdXG5cdFx0KTtcblx0XHRzZWxlY3RlZENvbnRleHRzID0gZ2V0VXBkYXRlZFNlbGVjdGlvbnMoXG5cdFx0XHRpbnRlcm5hbE1vZGVsQ29udGV4dCxcblx0XHRcdERlbGV0ZU9wdGlvblR5cGVzLmNyZWF0ZU1vZGVDb250ZXh0cyxcblx0XHRcdHNlbGVjdGVkQ29udGV4dHMsXG5cdFx0XHRpbnRlcm5hbE1vZGVsQ29udGV4dC5nZXRQcm9wZXJ0eShEZWxldGVPcHRpb25UeXBlcy5jcmVhdGVNb2RlQ29udGV4dHMpIHx8IFtdXG5cdFx0KTtcblxuXHRcdGNvbnN0IGRyYWZ0U2libGluZ1BhaXJzID0gaW50ZXJuYWxNb2RlbENvbnRleHQuZ2V0UHJvcGVydHkoRGVsZXRlT3B0aW9uVHlwZXMuZHJhZnRzV2l0aERlbGV0YWJsZUFjdGl2ZSkgfHwgW107XG5cdFx0Y29uc3QgZHJhZnRzID0gZHJhZnRTaWJsaW5nUGFpcnMubWFwKChjb250ZXh0UGFpcjogRHJhZnRTaWJsaW5nUGFpcikgPT4ge1xuXHRcdFx0cmV0dXJuIGNvbnRleHRQYWlyLmRyYWZ0O1xuXHRcdH0pO1xuXHRcdHNlbGVjdGVkQ29udGV4dHMgPSBnZXRVcGRhdGVkU2VsZWN0aW9ucyhcblx0XHRcdGludGVybmFsTW9kZWxDb250ZXh0LFxuXHRcdFx0RGVsZXRlT3B0aW9uVHlwZXMuZHJhZnRzV2l0aERlbGV0YWJsZUFjdGl2ZSxcblx0XHRcdHNlbGVjdGVkQ29udGV4dHMsXG5cdFx0XHRkcmFmdHNcblx0XHQpO1xuXHR9IGVsc2Uge1xuXHRcdGNvbnN0IGNvbnRleHRzVG9SZW1vdmUgPSBpbnRlcm5hbE1vZGVsQ29udGV4dC5nZXRQcm9wZXJ0eShvcHRpb24udHlwZSkgfHwgW107XG5cdFx0c2VsZWN0ZWRDb250ZXh0cyA9IGdldFVwZGF0ZWRTZWxlY3Rpb25zKGludGVybmFsTW9kZWxDb250ZXh0LCBvcHRpb24udHlwZSwgc2VsZWN0ZWRDb250ZXh0cywgY29udGV4dHNUb1JlbW92ZSk7XG5cdH1cblx0aW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJzZWxlY3RlZENvbnRleHRzXCIsIHNlbGVjdGVkQ29udGV4dHMpO1xuXHRpbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcIm51bWJlck9mU2VsZWN0ZWRDb250ZXh0c1wiLCBzZWxlY3RlZENvbnRleHRzLmxlbmd0aCk7XG59XG5cbmZ1bmN0aW9uIGFmdGVyRGVsZXRlUHJvY2VzcyhwYXJhbWV0ZXJzOiBEZWxldGVQYXJhbWV0ZXJzLCBvcHRpb25zOiBEZWxldGVPcHRpb25bXSwgY29udGV4dHM6IFY0Q29udGV4dFtdLCBvUmVzb3VyY2VCdW5kbGU6IFJlc291cmNlQnVuZGxlKSB7XG5cdGNvbnN0IHsgaW50ZXJuYWxNb2RlbENvbnRleHQsIGVudGl0eVNldE5hbWUgfSA9IHBhcmFtZXRlcnM7XG5cdGlmIChpbnRlcm5hbE1vZGVsQ29udGV4dCkge1xuXHRcdGlmIChpbnRlcm5hbE1vZGVsQ29udGV4dC5nZXRQcm9wZXJ0eShcImRlbGV0ZUVuYWJsZWRcIikgIT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRvcHRpb25zLmZvckVhY2goKG9wdGlvbikgPT4ge1xuXHRcdFx0XHQvLyBpZiBhbiBvcHRpb24gaXMgc2VsZWN0ZWQsIHRoZW4gaXQgaXMgZGVsZXRlZC4gU28sIHdlIG5lZWQgdG8gcmVtb3ZlIHRoZW0gZnJvbSBzZWxlY3RlZCBjb250ZXh0cy5cblx0XHRcdFx0aWYgKG9wdGlvbi5zZWxlY3RlZCkge1xuXHRcdFx0XHRcdGNsZWFyU2VsZWN0ZWRDb250ZXh0c0Zvck9wdGlvbihpbnRlcm5hbE1vZGVsQ29udGV4dCwgb3B0aW9uKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdC8vIGlmIGF0bGVhc3Qgb25lIG9mIHRoZSBvcHRpb25zIGlzIG5vdCBzZWxlY3RlZCwgdGhlbiB0aGUgZGVsZXRlIGJ1dHRvbiBuZWVkcyB0byBiZSBlbmFibGVkLlxuXHRcdGludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFxuXHRcdFx0XCJkZWxldGVFbmFibGVkXCIsXG5cdFx0XHRvcHRpb25zLnNvbWUoKG9wdGlvbikgPT4gIW9wdGlvbi5zZWxlY3RlZClcblx0XHQpO1xuXHR9XG5cblx0aWYgKGNvbnRleHRzLmxlbmd0aCA9PT0gMSkge1xuXHRcdE1lc3NhZ2VUb2FzdC5zaG93KFxuXHRcdFx0Q29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9ERUxFVEVfVE9BU1RfU0lOR1VMQVJcIiwgb1Jlc291cmNlQnVuZGxlLCB1bmRlZmluZWQsIGVudGl0eVNldE5hbWUpXG5cdFx0KTtcblx0fSBlbHNlIHtcblx0XHRNZXNzYWdlVG9hc3Quc2hvdyhcblx0XHRcdENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfREVMRVRFX1RPQVNUX1BMVVJBTFwiLCBvUmVzb3VyY2VCdW5kbGUsIHVuZGVmaW5lZCwgZW50aXR5U2V0TmFtZSlcblx0XHQpO1xuXHR9XG59XG5cbmZ1bmN0aW9uIGdldExvY2tlZENvbnRleHRVc2VyKGxvY2tlZENvbnRleHQ6IFY0Q29udGV4dCk6IHN0cmluZyB7XG5cdGNvbnN0IGRyYWZ0QWRtaW5EYXRhID0gbG9ja2VkQ29udGV4dC5nZXRPYmplY3QoKVtcIkRyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhXCJdIGFzIERyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhVHlwZTtcblx0cmV0dXJuIChkcmFmdEFkbWluRGF0YSAmJiBkcmFmdEFkbWluRGF0YVtcIkluUHJvY2Vzc0J5VXNlclwiXSkgfHwgXCJcIjtcbn1cblxuZnVuY3Rpb24gZ2V0TG9ja2VkT2JqZWN0c1RleHQob1Jlc291cmNlQnVuZGxlOiBSZXNvdXJjZUJ1bmRsZSwgbnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzOiBudW1iZXIsIGxvY2tlZENvbnRleHRzOiBWNENvbnRleHRbXSk6IHN0cmluZyB7XG5cdGxldCByZXRUeHQgPSBcIlwiO1xuXG5cdGlmIChudW1iZXJPZlNlbGVjdGVkQ29udGV4dHMgPT09IDEgJiYgbG9ja2VkQ29udGV4dHMubGVuZ3RoID09PSAxKSB7XG5cdFx0Ly9vbmx5IG9uZSB1bnNhdmVkIG9iamVjdFxuXHRcdGNvbnN0IGxvY2tlZFVzZXIgPSBnZXRMb2NrZWRDb250ZXh0VXNlcihsb2NrZWRDb250ZXh0c1swXSk7XG5cdFx0cmV0VHh0ID0gQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9DT05GSVJNX0RFTEVURV9XSVRIX1NJTkdMRV9PQkpFQ1RfTE9DS0VEXCIsIG9SZXNvdXJjZUJ1bmRsZSwgW1xuXHRcdFx0bG9ja2VkVXNlclxuXHRcdF0pO1xuXHR9IGVsc2UgaWYgKGxvY2tlZENvbnRleHRzLmxlbmd0aCA9PSAxKSB7XG5cdFx0Y29uc3QgbG9ja2VkVXNlciA9IGdldExvY2tlZENvbnRleHRVc2VyKGxvY2tlZENvbnRleHRzWzBdKTtcblx0XHRyZXRUeHQgPSBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcblx0XHRcdFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfQ09ORklSTV9ERUxFVEVfV0lUSF9PQkpFQ1RJTkZPX0FORF9PTkVfT0JKRUNUX0xPQ0tFRFwiLFxuXHRcdFx0b1Jlc291cmNlQnVuZGxlLFxuXHRcdFx0W251bWJlck9mU2VsZWN0ZWRDb250ZXh0cywgbG9ja2VkVXNlcl1cblx0XHQpO1xuXHR9IGVsc2UgaWYgKGxvY2tlZENvbnRleHRzLmxlbmd0aCA+IDEpIHtcblx0XHRyZXRUeHQgPSBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcblx0XHRcdFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfQ09ORklSTV9ERUxFVEVfV0lUSF9PQkpFQ1RJTkZPX0FORF9GRVdfT0JKRUNUU19MT0NLRURcIixcblx0XHRcdG9SZXNvdXJjZUJ1bmRsZSxcblx0XHRcdFtsb2NrZWRDb250ZXh0cy5sZW5ndGgsIG51bWJlck9mU2VsZWN0ZWRDb250ZXh0c11cblx0XHQpO1xuXHR9XG5cblx0cmV0dXJuIHJldFR4dDtcbn1cblxuZnVuY3Rpb24gZ2V0Tm9uRGVsZXRhYmxlQWN0aXZlc09mRHJhZnRzVGV4dChvUmVzb3VyY2VCdW5kbGU6IFJlc291cmNlQnVuZGxlLCBudW1iZXJPZkRyYWZ0czogbnVtYmVyLCB0b3RhbERlbGV0YWJsZTogbnVtYmVyKTogc3RyaW5nIHtcblx0bGV0IHJldFR4dCA9IFwiXCI7XG5cblx0aWYgKHRvdGFsRGVsZXRhYmxlID09PSBudW1iZXJPZkRyYWZ0cykge1xuXHRcdGlmIChudW1iZXJPZkRyYWZ0cyA9PT0gMSkge1xuXHRcdFx0cmV0VHh0ID0gQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXG5cdFx0XHRcdFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfQ09ORklSTV9ERUxFVEVfT05MWV9EUkFGVF9PRl9OT05fREVMRVRBQkxFX0FDVElWRVwiLFxuXHRcdFx0XHRvUmVzb3VyY2VCdW5kbGVcblx0XHRcdCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldFR4dCA9IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFxuXHRcdFx0XHRcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0NPTkZJUk1fREVMRVRFX09OTFlfRFJBRlRTX09GX05PTl9ERUxFVEFCTEVfQUNUSVZFXCIsXG5cdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZVxuXHRcdFx0KTtcblx0XHR9XG5cdH0gZWxzZSBpZiAobnVtYmVyT2ZEcmFmdHMgPT09IDEpIHtcblx0XHRyZXRUeHQgPSBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0NPTkZJUk1fREVMRVRFX0RSQUZUX09GX05PTl9ERUxFVEFCTEVfQUNUSVZFXCIsIG9SZXNvdXJjZUJ1bmRsZSk7XG5cdH0gZWxzZSB7XG5cdFx0cmV0VHh0ID0gQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9DT05GSVJNX0RFTEVURV9EUkFGVFNfT0ZfTk9OX0RFTEVUQUJMRV9BQ1RJVkVcIiwgb1Jlc291cmNlQnVuZGxlKTtcblx0fVxuXG5cdHJldHVybiByZXRUeHQ7XG59XG5cbmZ1bmN0aW9uIGdldFVuU2F2ZWRDb250ZXh0VXNlcih1blNhdmVkQ29udGV4dDogVjRDb250ZXh0KTogc3RyaW5nIHtcblx0Y29uc3QgZHJhZnRBZG1pbkRhdGEgPSB1blNhdmVkQ29udGV4dC5nZXRPYmplY3QoKVtcIkRyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhXCJdIGFzIERyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhVHlwZTtcblx0bGV0IHNMYXN0Q2hhbmdlZEJ5VXNlciA9IFwiXCI7XG5cdGlmIChkcmFmdEFkbWluRGF0YSkge1xuXHRcdHNMYXN0Q2hhbmdlZEJ5VXNlciA9IGRyYWZ0QWRtaW5EYXRhW1wiTGFzdENoYW5nZWRCeVVzZXJEZXNjcmlwdGlvblwiXSB8fCBkcmFmdEFkbWluRGF0YVtcIkxhc3RDaGFuZ2VkQnlVc2VyXCJdIHx8IFwiXCI7XG5cdH1cblxuXHRyZXR1cm4gc0xhc3RDaGFuZ2VkQnlVc2VyO1xufVxuXG5mdW5jdGlvbiBnZXRVbnNhdmVkQ29udGV4dHNUZXh0KFxuXHRvUmVzb3VyY2VCdW5kbGU6IFJlc291cmNlQnVuZGxlLFxuXHRudW1iZXJPZlNlbGVjdGVkQ29udGV4dHM6IG51bWJlcixcblx0dW5TYXZlZENvbnRleHRzOiBWNENvbnRleHRbXSxcblx0dG90YWxEZWxldGFibGU6IG51bWJlclxuKTogRGVsZXRlVGV4dEluZm8ge1xuXHRsZXQgaW5mb1R4dCA9IFwiXCIsXG5cdFx0b3B0aW9uVHh0ID0gXCJcIixcblx0XHRvcHRpb25XaXRob3V0VHh0ID0gZmFsc2U7XG5cdGlmIChudW1iZXJPZlNlbGVjdGVkQ29udGV4dHMgPT09IDEgJiYgdW5TYXZlZENvbnRleHRzLmxlbmd0aCA9PT0gMSkge1xuXHRcdC8vb25seSBvbmUgdW5zYXZlZCBvYmplY3QgYXJlIHNlbGVjdGVkXG5cdFx0Y29uc3QgbGFzdENoYW5nZWRCeVVzZXIgPSBnZXRVblNhdmVkQ29udGV4dFVzZXIodW5TYXZlZENvbnRleHRzWzBdKTtcblx0XHRpbmZvVHh0ID0gQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9DT05GSVJNX0RFTEVURV9XSVRIX1VOU0FWRURfQ0hBTkdFU1wiLCBvUmVzb3VyY2VCdW5kbGUsIFtcblx0XHRcdGxhc3RDaGFuZ2VkQnlVc2VyXG5cdFx0XSk7XG5cdFx0b3B0aW9uV2l0aG91dFR4dCA9IHRydWU7XG5cdH0gZWxzZSBpZiAobnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzID09PSB1blNhdmVkQ29udGV4dHMubGVuZ3RoKSB7XG5cdFx0Ly9vbmx5IG11bHRpcGxlIHVuc2F2ZWQgb2JqZWN0cyBhcmUgc2VsZWN0ZWRcblx0XHRpbmZvVHh0ID0gQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXG5cdFx0XHRcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0NPTkZJUk1fREVMRVRFX1dJVEhfVU5TQVZFRF9DSEFOR0VTX01VTFRJUExFX09CSkVDVFNcIixcblx0XHRcdG9SZXNvdXJjZUJ1bmRsZVxuXHRcdCk7XG5cdFx0b3B0aW9uV2l0aG91dFR4dCA9IHRydWU7XG5cdH0gZWxzZSBpZiAodG90YWxEZWxldGFibGUgPT09IHVuU2F2ZWRDb250ZXh0cy5sZW5ndGgpIHtcblx0XHQvLyBub24tZGVsZXRhYmxlL2xvY2tlZCBleGlzdHMsIGFsbCBkZWxldGFibGUgYXJlIHVuc2F2ZWQgYnkgb3RoZXJzXG5cdFx0aWYgKHVuU2F2ZWRDb250ZXh0cy5sZW5ndGggPT09IDEpIHtcblx0XHRcdGNvbnN0IGxhc3RDaGFuZ2VkQnlVc2VyID0gZ2V0VW5TYXZlZENvbnRleHRVc2VyKHVuU2F2ZWRDb250ZXh0c1swXSk7XG5cdFx0XHRpbmZvVHh0ID0gQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXG5cdFx0XHRcdFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfQ09ORklSTV9ERUxFVEVfV0lUSF9VTlNBVkVEX0FORF9GRVdfT0JKRUNUU19MT0NLRURfU0lOR1VMQVJcIixcblx0XHRcdFx0b1Jlc291cmNlQnVuZGxlLFxuXHRcdFx0XHRbbGFzdENoYW5nZWRCeVVzZXJdXG5cdFx0XHQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRpbmZvVHh0ID0gQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXG5cdFx0XHRcdFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfQ09ORklSTV9ERUxFVEVfV0lUSF9VTlNBVkVEX0FORF9GRVdfT0JKRUNUU19MT0NLRURfUExVUkFMXCIsXG5cdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZVxuXHRcdFx0KTtcblx0XHR9XG5cdFx0b3B0aW9uV2l0aG91dFR4dCA9IHRydWU7XG5cdH0gZWxzZSBpZiAodG90YWxEZWxldGFibGUgPiB1blNhdmVkQ29udGV4dHMubGVuZ3RoKSB7XG5cdFx0Ly8gbm9uLWRlbGV0YWJsZS9sb2NrZWQgZXhpc3RzLCBkZWxldGFibGUgaW5jbHVkZSB1bnNhdmVkIGFuZCBvdGhlciB0eXBlcy5cblx0XHRpZiAodW5TYXZlZENvbnRleHRzLmxlbmd0aCA9PT0gMSkge1xuXHRcdFx0Y29uc3QgbGFzdENoYW5nZWRCeVVzZXIgPSBnZXRVblNhdmVkQ29udGV4dFVzZXIodW5TYXZlZENvbnRleHRzWzBdKTtcblx0XHRcdG9wdGlvblR4dCA9IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFxuXHRcdFx0XHRcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0NPTkZJUk1fREVMRVRFX1dJVEhfT0JKRUNUSU5GT19BTkRfRkVXX09CSkVDVFNfVU5TQVZFRF9TSU5HVUxBUlwiLFxuXHRcdFx0XHRvUmVzb3VyY2VCdW5kbGUsXG5cdFx0XHRcdFtsYXN0Q2hhbmdlZEJ5VXNlcl1cblx0XHRcdCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG9wdGlvblR4dCA9IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFxuXHRcdFx0XHRcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0NPTkZJUk1fREVMRVRFX1dJVEhfT0JKRUNUSU5GT19BTkRfRkVXX09CSkVDVFNfVU5TQVZFRF9QTFVSQUxcIixcblx0XHRcdFx0b1Jlc291cmNlQnVuZGxlXG5cdFx0XHQpO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiB7IGluZm9UeHQsIG9wdGlvblR4dCwgb3B0aW9uV2l0aG91dFR4dCB9O1xufVxuXG5mdW5jdGlvbiBnZXROb25EZWxldGFibGVUZXh0KG1QYXJhbWV0ZXJzOiBEZWxldGVQYXJhbWV0ZXJzLCB0b3RhbE51bURlbGV0YWJsZUNvbnRleHRzOiBudW1iZXIsIG9SZXNvdXJjZUJ1bmRsZTogUmVzb3VyY2VCdW5kbGUpOiBzdHJpbmcge1xuXHRjb25zdCB7IG51bWJlck9mU2VsZWN0ZWRDb250ZXh0cywgbG9ja2VkQ29udGV4dHMsIGRyYWZ0c1dpdGhOb25EZWxldGFibGVBY3RpdmUgfSA9IG1QYXJhbWV0ZXJzO1xuXHRjb25zdCBub25EZWxldGFibGVDb250ZXh0cyA9XG5cdFx0bnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzIC0gKGxvY2tlZENvbnRleHRzLmxlbmd0aCArIHRvdGFsTnVtRGVsZXRhYmxlQ29udGV4dHMgLSBkcmFmdHNXaXRoTm9uRGVsZXRhYmxlQWN0aXZlLmxlbmd0aCk7XG5cdGxldCByZXRUeHQgPSBcIlwiO1xuXG5cdGlmIChcblx0XHRub25EZWxldGFibGVDb250ZXh0cyA+IDAgJiZcblx0XHQodG90YWxOdW1EZWxldGFibGVDb250ZXh0cyA9PT0gMCB8fCBkcmFmdHNXaXRoTm9uRGVsZXRhYmxlQWN0aXZlLmxlbmd0aCA9PT0gdG90YWxOdW1EZWxldGFibGVDb250ZXh0cylcblx0KSB7XG5cdFx0Ly8gMS4gTm9uZSBvZiB0aGUgY2NvbnRleHRzIGFyZSBkZWxldGFibGVcblx0XHQvLyAyLiBPbmx5IGRyYWZ0cyBvZiBub24gZGVsZXRhYmxlIGNvbnRleHRzIGV4aXN0LlxuXHRcdGlmIChsb2NrZWRDb250ZXh0cy5sZW5ndGggPiAwKSB7XG5cdFx0XHQvLyBMb2NrZWQgY29udGV4dHMgZXhpc3Rcblx0XHRcdGlmIChub25EZWxldGFibGVDb250ZXh0cyA9PT0gMSkge1xuXHRcdFx0XHRyZXRUeHQgPSBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcblx0XHRcdFx0XHRcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0NPTkZJUk1fREVMRVRFX1dJVEhfQUxMX1JFTUFJTklOR19OT05fREVMRVRBQkxFX1NJTkdVTEFSXCIsXG5cdFx0XHRcdFx0b1Jlc291cmNlQnVuZGxlLFxuXHRcdFx0XHRcdHVuZGVmaW5lZFxuXHRcdFx0XHQpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmV0VHh0ID0gQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXG5cdFx0XHRcdFx0XCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9DT05GSVJNX0RFTEVURV9XSVRIX0FMTF9SRU1BSU5JTkdfTk9OX0RFTEVUQUJMRV9QTFVSQUxcIixcblx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGUsXG5cdFx0XHRcdFx0dW5kZWZpbmVkXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChub25EZWxldGFibGVDb250ZXh0cyA9PT0gMSkge1xuXHRcdFx0Ly8gT25seSBwdXJlIG5vbi1kZWxldGFibGUgY29udGV4dHMgZXhpc3Qgc2luZ2xlXG5cdFx0XHRyZXRUeHQgPSBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcblx0XHRcdFx0XCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9DT05GSVJNX0RFTEVURV9XSVRIX1NJTkdMRV9BTkRfT05FX09CSkVDVF9OT05fREVMRVRBQkxFXCIsXG5cdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZSxcblx0XHRcdFx0dW5kZWZpbmVkXG5cdFx0XHQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBPbmx5IHB1cmUgbm9uLWRlbGV0YWJsZSBjb250ZXh0cyBleGlzdCBtdWx0aXBsZVxuXHRcdFx0cmV0VHh0ID0gQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXG5cdFx0XHRcdFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfQ09ORklSTV9ERUxFVEVfV0lUSF9NVUxUSVBMRV9BTkRfQUxMX09CSkVDVF9OT05fREVMRVRBQkxFXCIsXG5cdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZSxcblx0XHRcdFx0dW5kZWZpbmVkXG5cdFx0XHQpO1xuXHRcdH1cblx0fSBlbHNlIGlmIChub25EZWxldGFibGVDb250ZXh0cyA9PT0gMSkge1xuXHRcdC8vIGRlbGV0YWJsZSBhbmQgbm9uLWRlbGV0YWJsZSBleGlzdHMgdG9nZXRoZXIsIHNpbmdsZVxuXHRcdHJldFR4dCA9IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFxuXHRcdFx0XCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9DT05GSVJNX0RFTEVURV9XSVRIX09CSkVDVElORk9fQU5EX09ORV9PQkpFQ1RfTk9OX0RFTEVUQUJMRVwiLFxuXHRcdFx0b1Jlc291cmNlQnVuZGxlLFxuXHRcdFx0W251bWJlck9mU2VsZWN0ZWRDb250ZXh0c11cblx0XHQpO1xuXHR9IGVsc2UgaWYgKG5vbkRlbGV0YWJsZUNvbnRleHRzID4gMSkge1xuXHRcdC8vIGRlbGV0YWJsZSBhbmQgbm9uLWRlbGV0YWJsZSBleGlzdHMgdG9nZXRoZXIsIG11bHRpcGxlXG5cdFx0cmV0VHh0ID0gQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXG5cdFx0XHRcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0NPTkZJUk1fREVMRVRFX1dJVEhfT0JKRUNUSU5GT19BTkRfRkVXX09CSkVDVFNfTk9OX0RFTEVUQUJMRVwiLFxuXHRcdFx0b1Jlc291cmNlQnVuZGxlLFxuXHRcdFx0W25vbkRlbGV0YWJsZUNvbnRleHRzLCBudW1iZXJPZlNlbGVjdGVkQ29udGV4dHNdXG5cdFx0KTtcblx0fVxuXG5cdHJldHVybiByZXRUeHQ7XG59XG5cbmZ1bmN0aW9uIGdldENvbmZpcm1lZERlbGV0YWJsZUNvbnRleHQoY29udGV4dHM6IFY0Q29udGV4dFtdLCBvcHRpb25zOiBEZWxldGVPcHRpb25bXSk6IFY0Q29udGV4dFtdIHtcblx0cmV0dXJuIG9wdGlvbnMucmVkdWNlKChyZXN1bHQsIG9wdGlvbikgPT4ge1xuXHRcdHJldHVybiBvcHRpb24uc2VsZWN0ZWQgPyByZXN1bHQuY29uY2F0KG9wdGlvbi5jb250ZXh0cykgOiByZXN1bHQ7XG5cdH0sIGNvbnRleHRzKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlRHJhZnRPcHRpb25zRm9yRGVsZXRhYmxlVGV4dHMoXG5cdG1QYXJhbWV0ZXJzOiBEZWxldGVQYXJhbWV0ZXJzLFxuXHR2Q29udGV4dHM6IFY0Q29udGV4dFtdLFxuXHR0b3RhbERlbGV0YWJsZTogbnVtYmVyLFxuXHRvUmVzb3VyY2VCdW5kbGU6IFJlc291cmNlQnVuZGxlLFxuXHRpdGVtczogQ29udHJvbFtdLFxuXHRvcHRpb25zOiBEZWxldGVPcHRpb25bXVxuKSB7XG5cdGNvbnN0IHtcblx0XHRudW1iZXJPZlNlbGVjdGVkQ29udGV4dHMsXG5cdFx0ZHJhZnRzV2l0aERlbGV0YWJsZUFjdGl2ZSxcblx0XHR1blNhdmVkQ29udGV4dHMsXG5cdFx0Y3JlYXRlTW9kZUNvbnRleHRzLFxuXHRcdGxvY2tlZENvbnRleHRzLFxuXHRcdGRyYWZ0c1dpdGhOb25EZWxldGFibGVBY3RpdmVcblx0fSA9IG1QYXJhbWV0ZXJzO1xuXHRsZXQgbm9uRGVsZXRhYmxlQ29udGV4dFRleHQgPSBcIlwiLFxuXHRcdGxvY2tlZENvbnRleHRzVHh0ID0gXCJcIjtcblxuXHQvLyBkcmFmdHMgd2l0aCBhY3RpdmVcblx0aWYgKGRyYWZ0c1dpdGhEZWxldGFibGVBY3RpdmUubGVuZ3RoID4gMCkge1xuXHRcdGRyYWZ0c1dpdGhEZWxldGFibGVBY3RpdmUuZm9yRWFjaCgoZGVsZXRhYmxlRHJhZnRJbmZvOiBEcmFmdFNpYmxpbmdQYWlyKSA9PiB7XG5cdFx0XHR2Q29udGV4dHMucHVzaChkZWxldGFibGVEcmFmdEluZm8uc2libGluZ0luZm8udGFyZ2V0Q29udGV4dCk7XG5cdFx0fSk7XG5cdH1cblxuXHQvLyBjcmVhdGUgbW9kZSBkcmFmdHNcblx0aWYgKGNyZWF0ZU1vZGVDb250ZXh0cy5sZW5ndGggPiAwKSB7XG5cdFx0Ly8gY3JlYXRlIG1vZGUgZHJhZnRzXG5cdFx0Y3JlYXRlTW9kZUNvbnRleHRzLmZvckVhY2goKGNvbnRleHQpID0+IHZDb250ZXh0cy5wdXNoKGNvbnRleHQpKTtcblx0fVxuXG5cdC8vIGl0ZW1zIGxvY2tlZCBtc2dcblx0aWYgKGxvY2tlZENvbnRleHRzLmxlbmd0aCA+IDApIHtcblx0XHRsb2NrZWRDb250ZXh0c1R4dCA9IGRlbGV0ZUhlbHBlci5nZXRMb2NrZWRPYmplY3RzVGV4dChvUmVzb3VyY2VCdW5kbGUsIG51bWJlck9mU2VsZWN0ZWRDb250ZXh0cywgbG9ja2VkQ29udGV4dHMpIHx8IFwiXCI7XG5cdFx0aXRlbXMucHVzaChuZXcgVGV4dCh7IHRleHQ6IGxvY2tlZENvbnRleHRzVHh0IH0pKTtcblx0fVxuXG5cdC8vIG5vbiBkZWxldGFibGUgbXNnXG5cdGlmIChudW1iZXJPZlNlbGVjdGVkQ29udGV4dHMgIT0gdG90YWxEZWxldGFibGUgLSBkcmFmdHNXaXRoTm9uRGVsZXRhYmxlQWN0aXZlLmxlbmd0aCArIGxvY2tlZENvbnRleHRzLmxlbmd0aCkge1xuXHRcdG5vbkRlbGV0YWJsZUNvbnRleHRUZXh0ID0gZGVsZXRlSGVscGVyLmdldE5vbkRlbGV0YWJsZVRleHQobVBhcmFtZXRlcnMsIHRvdGFsRGVsZXRhYmxlLCBvUmVzb3VyY2VCdW5kbGUpO1xuXHRcdGl0ZW1zLnB1c2gobmV3IFRleHQoeyB0ZXh0OiBub25EZWxldGFibGVDb250ZXh0VGV4dCB9KSk7XG5cdH1cblxuXHQvLyBvcHRpb246IHVuc2F2ZWQgY2hhbmdlcyBieSBvdGhlcnNcblx0aWYgKHVuU2F2ZWRDb250ZXh0cy5sZW5ndGggPiAwKSB7XG5cdFx0Y29uc3QgdW5zYXZlZENoYW5nZXNUeHRzID1cblx0XHRcdGRlbGV0ZUhlbHBlci5nZXRVbnNhdmVkQ29udGV4dHNUZXh0KG9SZXNvdXJjZUJ1bmRsZSwgbnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzLCB1blNhdmVkQ29udGV4dHMsIHRvdGFsRGVsZXRhYmxlKSB8fCB7fTtcblx0XHRpZiAodW5zYXZlZENoYW5nZXNUeHRzLmluZm9UeHQpIHtcblx0XHRcdGl0ZW1zLnB1c2gobmV3IFRleHQoeyB0ZXh0OiB1bnNhdmVkQ2hhbmdlc1R4dHMuaW5mb1R4dCB9KSk7XG5cdFx0fVxuXHRcdGlmICh1bnNhdmVkQ2hhbmdlc1R4dHMub3B0aW9uVHh0IHx8IHVuc2F2ZWRDaGFuZ2VzVHh0cy5vcHRpb25XaXRob3V0VHh0KSB7XG5cdFx0XHRvcHRpb25zLnB1c2goe1xuXHRcdFx0XHR0eXBlOiBEZWxldGVPcHRpb25UeXBlcy51blNhdmVkQ29udGV4dHMsXG5cdFx0XHRcdGNvbnRleHRzOiB1blNhdmVkQ29udGV4dHMsXG5cdFx0XHRcdHRleHQ6IHVuc2F2ZWRDaGFuZ2VzVHh0cy5vcHRpb25UeHQsXG5cdFx0XHRcdHNlbGVjdGVkOiB0cnVlLFxuXHRcdFx0XHRjb250cm9sOiBEZWxldGVEaWFsb2dDb250ZW50Q29udHJvbC5DSEVDS0JPWFxuXHRcdFx0fSk7XG5cdFx0fVxuXHR9XG5cblx0Ly8gb3B0aW9uOiBkcmFmdHMgd2l0aCBhY3RpdmUgbm90IGRlbGV0YWJsZVxuXHRpZiAoZHJhZnRzV2l0aE5vbkRlbGV0YWJsZUFjdGl2ZS5sZW5ndGggPiAwKSB7XG5cdFx0Y29uc3Qgbm9uRGVsZXRhYmxlQWN0aXZlc09mRHJhZnRzVGV4dCA9XG5cdFx0XHRkZWxldGVIZWxwZXIuZ2V0Tm9uRGVsZXRhYmxlQWN0aXZlc09mRHJhZnRzVGV4dChvUmVzb3VyY2VCdW5kbGUsIGRyYWZ0c1dpdGhOb25EZWxldGFibGVBY3RpdmUubGVuZ3RoLCB0b3RhbERlbGV0YWJsZSkgfHwgXCJcIjtcblx0XHRpZiAobm9uRGVsZXRhYmxlQWN0aXZlc09mRHJhZnRzVGV4dCkge1xuXHRcdFx0b3B0aW9ucy5wdXNoKHtcblx0XHRcdFx0dHlwZTogRGVsZXRlT3B0aW9uVHlwZXMuZHJhZnRzV2l0aE5vbkRlbGV0YWJsZUFjdGl2ZSxcblx0XHRcdFx0Y29udGV4dHM6IGRyYWZ0c1dpdGhOb25EZWxldGFibGVBY3RpdmUsXG5cdFx0XHRcdHRleHQ6IG5vbkRlbGV0YWJsZUFjdGl2ZXNPZkRyYWZ0c1RleHQsXG5cdFx0XHRcdHNlbGVjdGVkOiB0cnVlLFxuXHRcdFx0XHRjb250cm9sOiB0b3RhbERlbGV0YWJsZSA+IDAgPyBEZWxldGVEaWFsb2dDb250ZW50Q29udHJvbC5DSEVDS0JPWCA6IERlbGV0ZURpYWxvZ0NvbnRlbnRDb250cm9sLlRFWFRcblx0XHRcdH0pO1xuXHRcdH1cblx0fVxufVxuXG5mdW5jdGlvbiB1cGRhdGVDb250ZW50Rm9yRGVsZXRlRGlhbG9nKG9wdGlvbnM6IERlbGV0ZU9wdGlvbltdLCBpdGVtczogQ29udHJvbFtdKSB7XG5cdGlmIChvcHRpb25zLmxlbmd0aCA9PT0gMSkge1xuXHRcdC8vIFNpbmdsZSBvcHRpb24gZG9lc24ndCBuZWVkIGNoZWNrQm94XG5cdFx0Y29uc3Qgb3B0aW9uID0gb3B0aW9uc1swXTtcblx0XHRpZiAob3B0aW9uLnRleHQpIHtcblx0XHRcdGl0ZW1zLnB1c2gobmV3IFRleHQoeyB0ZXh0OiBvcHRpb24udGV4dCB9KSk7XG5cdFx0fVxuXHR9IGVsc2UgaWYgKG9wdGlvbnMubGVuZ3RoID4gMSkge1xuXHRcdC8vIE11bHRpcGxlIE9wdGlvbnNcblxuXHRcdC8vIFRleHRzXG5cdFx0b3B0aW9ucy5mb3JFYWNoKChvcHRpb246IERlbGV0ZU9wdGlvbikgPT4ge1xuXHRcdFx0aWYgKG9wdGlvbi5jb250cm9sID09PSBcInRleHRcIiAmJiBvcHRpb24udGV4dCkge1xuXHRcdFx0XHRpdGVtcy5wdXNoKG5ldyBUZXh0KHsgdGV4dDogb3B0aW9uLnRleHQgfSkpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdC8vIENoZWNrQm94c1xuXHRcdG9wdGlvbnMuZm9yRWFjaCgob3B0aW9uOiBEZWxldGVPcHRpb24pID0+IHtcblx0XHRcdGlmIChvcHRpb24uY29udHJvbCA9PT0gXCJjaGVja0JveFwiICYmIG9wdGlvbi50ZXh0KSB7XG5cdFx0XHRcdGl0ZW1zLnB1c2goXG5cdFx0XHRcdFx0bmV3IENoZWNrQm94KHtcblx0XHRcdFx0XHRcdHRleHQ6IG9wdGlvbi50ZXh0LFxuXHRcdFx0XHRcdFx0c2VsZWN0ZWQ6IHRydWUsXG5cdFx0XHRcdFx0XHRzZWxlY3Q6IGZ1bmN0aW9uIChvRXZlbnQ6IEV2ZW50KSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IGNoZWNrQm94ID0gb0V2ZW50LmdldFNvdXJjZSgpIGFzIENoZWNrQm94O1xuXHRcdFx0XHRcdFx0XHRjb25zdCBzZWxlY3RlZCA9IGNoZWNrQm94LmdldFNlbGVjdGVkKCk7XG5cdFx0XHRcdFx0XHRcdG9wdGlvbi5zZWxlY3RlZCA9IHNlbGVjdGVkO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlT3B0aW9uc0ZvckRlbGV0YWJsZVRleHRzKFxuXHRtUGFyYW1ldGVyczogRGVsZXRlUGFyYW1ldGVycyxcblx0ZGlyZWN0RGVsZXRhYmxlQ29udGV4dHM6IFY0Q29udGV4dFtdLFxuXHRvUmVzb3VyY2VCdW5kbGU6IFJlc291cmNlQnVuZGxlLFxuXHRvcHRpb25zOiBEZWxldGVPcHRpb25bXVxuKSB7XG5cdGNvbnN0IHtcblx0XHRudW1iZXJPZlNlbGVjdGVkQ29udGV4dHMsXG5cdFx0ZW50aXR5U2V0TmFtZSxcblx0XHRwYXJlbnRDb250cm9sLFxuXHRcdGRlc2NyaXB0aW9uLFxuXHRcdGxvY2tlZENvbnRleHRzLFxuXHRcdGRyYWZ0c1dpdGhOb25EZWxldGFibGVBY3RpdmUsXG5cdFx0dW5TYXZlZENvbnRleHRzXG5cdH0gPSBtUGFyYW1ldGVycztcblx0Y29uc3QgdG90YWxEZWxldGFibGUgPSBkaXJlY3REZWxldGFibGVDb250ZXh0cy5sZW5ndGggKyBkcmFmdHNXaXRoTm9uRGVsZXRhYmxlQWN0aXZlLmxlbmd0aCArIHVuU2F2ZWRDb250ZXh0cy5sZW5ndGg7XG5cdGNvbnN0IG5vbkRlbGV0YWJsZUNvbnRleHRzID0gbnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzIC0gKGxvY2tlZENvbnRleHRzLmxlbmd0aCArIHRvdGFsRGVsZXRhYmxlIC0gZHJhZnRzV2l0aE5vbkRlbGV0YWJsZUFjdGl2ZS5sZW5ndGgpO1xuXG5cdGlmIChudW1iZXJPZlNlbGVjdGVkQ29udGV4dHMgPT09IDEgJiYgbnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzID09PSBkaXJlY3REZWxldGFibGVDb250ZXh0cy5sZW5ndGgpIHtcblx0XHQvLyBzaW5nbGUgZGVsZXRhYmxlIGNvbnRleHRcblx0XHRjb25zdCBvTGluZUNvbnRleHREYXRhID0gZGlyZWN0RGVsZXRhYmxlQ29udGV4dHNbMF0uZ2V0T2JqZWN0KCk7XG5cdFx0Y29uc3Qgb1RhYmxlID0gcGFyZW50Q29udHJvbCBhcyBUYWJsZTtcblx0XHRjb25zdCBzS2V5ID0gb1RhYmxlICYmIChvVGFibGUuZ2V0UGFyZW50KCkgYXMgVGFibGVBUEkpLmdldElkZW50aWZpZXJDb2x1bW4oKTtcblx0XHRsZXQgdHh0O1xuXHRcdGxldCBhUGFyYW1zID0gW107XG5cdFx0aWYgKHNLZXkpIHtcblx0XHRcdGNvbnN0IHNLZXlWYWx1ZSA9IHNLZXkgPyBvTGluZUNvbnRleHREYXRhW3NLZXldIDogdW5kZWZpbmVkO1xuXHRcdFx0Y29uc3Qgc0Rlc2NyaXB0aW9uID0gZGVzY3JpcHRpb24gJiYgZGVzY3JpcHRpb24ucGF0aCA/IG9MaW5lQ29udGV4dERhdGFbZGVzY3JpcHRpb24ucGF0aF0gOiB1bmRlZmluZWQ7XG5cdFx0XHRpZiAoc0tleVZhbHVlKSB7XG5cdFx0XHRcdGlmIChzRGVzY3JpcHRpb24gJiYgZGVzY3JpcHRpb24gJiYgc0tleSAhPT0gZGVzY3JpcHRpb24ucGF0aCkge1xuXHRcdFx0XHRcdGFQYXJhbXMgPSBbc0tleVZhbHVlICsgXCIgXCIsIHNEZXNjcmlwdGlvbl07XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0YVBhcmFtcyA9IFtzS2V5VmFsdWUsIFwiXCJdO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHR4dCA9IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFxuXHRcdFx0XHRcdFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfQ09ORklSTV9ERUxFVEVfV0lUSF9PQkpFQ1RJTkZPXCIsXG5cdFx0XHRcdFx0b1Jlc291cmNlQnVuZGxlLFxuXHRcdFx0XHRcdGFQYXJhbXMsXG5cdFx0XHRcdFx0ZW50aXR5U2V0TmFtZVxuXHRcdFx0XHQpO1xuXHRcdFx0fSBlbHNlIGlmIChzS2V5VmFsdWUpIHtcblx0XHRcdFx0YVBhcmFtcyA9IFtzS2V5VmFsdWUsIFwiXCJdO1xuXHRcdFx0XHR0eHQgPSBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcblx0XHRcdFx0XHRcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0NPTkZJUk1fREVMRVRFX1dJVEhfT0JKRUNUSU5GT1wiLFxuXHRcdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZSxcblx0XHRcdFx0XHRhUGFyYW1zLFxuXHRcdFx0XHRcdGVudGl0eVNldE5hbWVcblx0XHRcdFx0KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHR4dCA9IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFxuXHRcdFx0XHRcdFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfQ09ORklSTV9ERUxFVEVfV0lUSF9PQkpFQ1RUSVRMRV9TSU5HVUxBUlwiLFxuXHRcdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZSxcblx0XHRcdFx0XHR1bmRlZmluZWQsXG5cdFx0XHRcdFx0ZW50aXR5U2V0TmFtZVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHR0eHQgPSBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcblx0XHRcdFx0XCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9DT05GSVJNX0RFTEVURV9XSVRIX09CSkVDVFRJVExFX1NJTkdVTEFSXCIsXG5cdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZSxcblx0XHRcdFx0dW5kZWZpbmVkLFxuXHRcdFx0XHRlbnRpdHlTZXROYW1lXG5cdFx0XHQpO1xuXHRcdH1cblx0XHRvcHRpb25zLnB1c2goe1xuXHRcdFx0dHlwZTogRGVsZXRlT3B0aW9uVHlwZXMuZGVsZXRhYmxlQ29udGV4dHMsXG5cdFx0XHRjb250ZXh0czogZGlyZWN0RGVsZXRhYmxlQ29udGV4dHMsXG5cdFx0XHR0ZXh0OiB0eHQsXG5cdFx0XHRzZWxlY3RlZDogdHJ1ZSxcblx0XHRcdGNvbnRyb2w6IERlbGV0ZURpYWxvZ0NvbnRlbnRDb250cm9sLlRFWFRcblx0XHR9KTtcblx0fSBlbHNlIGlmIChcblx0XHR1blNhdmVkQ29udGV4dHMubGVuZ3RoICE9PSB0b3RhbERlbGV0YWJsZSAmJlxuXHRcdG51bWJlck9mU2VsZWN0ZWRDb250ZXh0cyA+IDAgJiZcblx0XHQoZGlyZWN0RGVsZXRhYmxlQ29udGV4dHMubGVuZ3RoID4gMCB8fCAodW5TYXZlZENvbnRleHRzLmxlbmd0aCA+IDAgJiYgZHJhZnRzV2l0aE5vbkRlbGV0YWJsZUFjdGl2ZS5sZW5ndGggPiAwKSlcblx0KSB7XG5cdFx0aWYgKG51bWJlck9mU2VsZWN0ZWRDb250ZXh0cyA+IGRpcmVjdERlbGV0YWJsZUNvbnRleHRzLmxlbmd0aCAmJiBub25EZWxldGFibGVDb250ZXh0cyArIGxvY2tlZENvbnRleHRzLmxlbmd0aCA+IDApIHtcblx0XHRcdC8vIG90aGVyIHR5cGVzIGV4aXN0cyB3aXRoIHB1cmUgZGVsZXRhYmxlIG9uZXNcblx0XHRcdGxldCBkZWxldGFibGVPcHRpb25UeHQgPSBcIlwiO1xuXHRcdFx0aWYgKHRvdGFsRGVsZXRhYmxlID09PSAxKSB7XG5cdFx0XHRcdGRlbGV0YWJsZU9wdGlvblR4dCA9IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFxuXHRcdFx0XHRcdFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfQ09ORklSTV9ERUxFVEVfV0lUSF9PQkpFQ1RUSVRMRV9TSU5HVUxBUl9OT05fREVMRVRBQkxFXCIsXG5cdFx0XHRcdFx0b1Jlc291cmNlQnVuZGxlLFxuXHRcdFx0XHRcdHVuZGVmaW5lZCxcblx0XHRcdFx0XHRlbnRpdHlTZXROYW1lXG5cdFx0XHRcdCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRkZWxldGFibGVPcHRpb25UeHQgPSBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcblx0XHRcdFx0XHRcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0NPTkZJUk1fREVMRVRFX1dJVEhfT0JKRUNUVElUTEVfUExVUkFMX05PTl9ERUxFVEFCTEVcIixcblx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGUsXG5cdFx0XHRcdFx0dW5kZWZpbmVkLFxuXHRcdFx0XHRcdGVudGl0eVNldE5hbWVcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHRcdG9wdGlvbnMudW5zaGlmdCh7XG5cdFx0XHRcdHR5cGU6IERlbGV0ZU9wdGlvblR5cGVzLmRlbGV0YWJsZUNvbnRleHRzLFxuXHRcdFx0XHRjb250ZXh0czogZGlyZWN0RGVsZXRhYmxlQ29udGV4dHMsXG5cdFx0XHRcdHRleHQ6IGRlbGV0YWJsZU9wdGlvblR4dCxcblx0XHRcdFx0c2VsZWN0ZWQ6IHRydWUsXG5cdFx0XHRcdGNvbnRyb2w6IERlbGV0ZURpYWxvZ0NvbnRlbnRDb250cm9sLlRFWFRcblx0XHRcdH0pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBvbmx5IGRlbGV0YWJsZVxuXHRcdFx0Y29uc3QgYWxsRGVsZXRhYmxlVHh0ID1cblx0XHRcdFx0dG90YWxEZWxldGFibGUgPT09IDFcblx0XHRcdFx0XHQ/IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFxuXHRcdFx0XHRcdFx0XHRcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0NPTkZJUk1fREVMRVRFX1dJVEhfT0JKRUNUVElUTEVfU0lOR1VMQVJcIixcblx0XHRcdFx0XHRcdFx0b1Jlc291cmNlQnVuZGxlLFxuXHRcdFx0XHRcdFx0XHR1bmRlZmluZWQsXG5cdFx0XHRcdFx0XHRcdGVudGl0eVNldE5hbWVcblx0XHRcdFx0XHQgIClcblx0XHRcdFx0XHQ6IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFxuXHRcdFx0XHRcdFx0XHRcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0NPTkZJUk1fREVMRVRFX1dJVEhfT0JKRUNUVElUTEVfUExVUkFMXCIsXG5cdFx0XHRcdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZSxcblx0XHRcdFx0XHRcdFx0dW5kZWZpbmVkLFxuXHRcdFx0XHRcdFx0XHRlbnRpdHlTZXROYW1lXG5cdFx0XHRcdFx0ICApO1xuXHRcdFx0b3B0aW9ucy5wdXNoKHtcblx0XHRcdFx0dHlwZTogRGVsZXRlT3B0aW9uVHlwZXMuZGVsZXRhYmxlQ29udGV4dHMsXG5cdFx0XHRcdGNvbnRleHRzOiBkaXJlY3REZWxldGFibGVDb250ZXh0cyxcblx0XHRcdFx0dGV4dDogYWxsRGVsZXRhYmxlVHh0LFxuXHRcdFx0XHRzZWxlY3RlZDogdHJ1ZSxcblx0XHRcdFx0Y29udHJvbDogRGVsZXRlRGlhbG9nQ29udGVudENvbnRyb2wuVEVYVFxuXHRcdFx0fSk7XG5cdFx0fVxuXHR9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZUNvbmZpcm1IYW5kbGVyKFxuXHRvcHRpb25zOiBEZWxldGVPcHRpb25bXSxcblx0bVBhcmFtZXRlcnM6IERlbGV0ZVBhcmFtZXRlcnMsXG5cdG1lc3NhZ2VIYW5kbGVyOiBNZXNzYWdlSGFuZGxlcixcblx0b1Jlc291cmNlQnVuZGxlOiBSZXNvdXJjZUJ1bmRsZSxcblx0YXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsXG5cdGRyYWZ0RW5hYmxlZDogYm9vbGVhblxuKSB7XG5cdHRyeSB7XG5cdFx0Y29uc3QgY29udGV4dHMgPSBkZWxldGVIZWxwZXIuZ2V0Q29uZmlybWVkRGVsZXRhYmxlQ29udGV4dChbXSwgb3B0aW9ucyk7XG5cdFx0Y29uc3QgeyBiZWZvcmVEZWxldGVDYWxsQmFjaywgcGFyZW50Q29udHJvbCB9ID0gbVBhcmFtZXRlcnM7XG5cdFx0aWYgKGJlZm9yZURlbGV0ZUNhbGxCYWNrKSB7XG5cdFx0XHRhd2FpdCBiZWZvcmVEZWxldGVDYWxsQmFjayh7IGNvbnRleHRzOiBjb250ZXh0cyB9KTtcblx0XHR9XG5cblx0XHRpZiAoY29udGV4dHMgJiYgY29udGV4dHMubGVuZ3RoKSB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRhd2FpdCBQcm9taXNlLmFsbChcblx0XHRcdFx0XHRjb250ZXh0cy5tYXAoZnVuY3Rpb24gKGNvbnRleHQ6IFY0Q29udGV4dCkge1xuXHRcdFx0XHRcdFx0aWYgKGRyYWZ0RW5hYmxlZCAmJiAhY29udGV4dC5nZXRQcm9wZXJ0eShcIklzQWN0aXZlRW50aXR5XCIpKSB7XG5cdFx0XHRcdFx0XHRcdC8vZGVsZXRlIHRoZSBkcmFmdFxuXHRcdFx0XHRcdFx0XHRjb25zdCBlbmFibGVTdHJpY3RIYW5kbGluZyA9IGNvbnRleHRzLmxlbmd0aCA9PT0gMSA/IHRydWUgOiBmYWxzZTtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIGRyYWZ0LmRlbGV0ZURyYWZ0KGNvbnRleHQsIGFwcENvbXBvbmVudCwgZW5hYmxlU3RyaWN0SGFuZGxpbmcpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0cmV0dXJuIGNvbnRleHQuZGVsZXRlKCk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0KTtcblx0XHRcdFx0ZGVsZXRlSGVscGVyLmFmdGVyRGVsZXRlUHJvY2VzcyhtUGFyYW1ldGVycywgb3B0aW9ucywgY29udGV4dHMsIG9SZXNvdXJjZUJ1bmRsZSk7XG5cdFx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0XHRhd2FpdCBtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZURpYWxvZyh7IGNvbnRyb2w6IHBhcmVudENvbnRyb2wgfSk7XG5cdFx0XHRcdC8vIHJlLXRocm93IGVycm9yIHRvIGVuZm9yY2UgcmVqZWN0aW5nIHRoZSBnZW5lcmFsIHByb21pc2Vcblx0XHRcdFx0dGhyb3cgZXJyb3I7XG5cdFx0XHR9XG5cdFx0fVxuXHR9IGNhdGNoIChvRXJyb3IpIHtcblx0XHRhd2FpdCBtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZXMoKTtcblx0XHQvLyByZS10aHJvdyBlcnJvciB0byBlbmZvcmNlIHJlamVjdGluZyB0aGUgZ2VuZXJhbCBwcm9taXNlXG5cdFx0dGhyb3cgb0Vycm9yO1xuXHR9XG59XG5cbi8vIFRhYmxlIFJ1bnRpbWUgSGVscGVyczpcblxuLyogcmVmcmVzaGVzIGRhdGEgaW4gaW50ZXJuYWwgbW9kZWwgcmVsZXZhbnQgZm9yIGVuYWJsZW1lbnQgb2YgZGVsZXRlIGJ1dHRvbiBhY2NvcmRpbmcgdG8gc2VsZWN0ZWQgY29udGV4dHNcbnJlbGV2YW50IGRhdGEgYXJlOiBkZWxldGFibGVDb250ZXh0cywgZHJhZnRzV2l0aERlbGV0YWJsZUFjdGl2ZSwgZHJhZnRzV2l0aE5vbkRlbGV0YWJsZUFjdGl2ZSwgY3JlYXRlTW9kZUNvbnRleHRzLCB1blNhdmVkQ29udGV4dHMsIGRlbGV0ZUVuYWJsZWRcbm5vdCByZWxldmFudDogbG9ja2VkQ29udGV4dHNcbiovXG5hc3luYyBmdW5jdGlvbiB1cGRhdGVEZWxldGVJbmZvRm9yU2VsZWN0ZWRDb250ZXh0cyhpbnRlcm5hbE1vZGVsQ29udGV4dDogSW50ZXJuYWxNb2RlbENvbnRleHQsIHNlbGVjdGVkQ29udGV4dHM6IENvbnRleHRbXSkge1xuXHR0eXBlIGNvbnRleHRJbmZvID0ge1xuXHRcdGNvbnRleHQ6IENvbnRleHQ7XG5cdFx0c2libGluZ1Byb21pc2U6IFByb21pc2U8U2libGluZ0luZm9ybWF0aW9uIHwgdW5kZWZpbmVkIHwgdm9pZD47XG5cdFx0c2libGluZ0luZm86IFNpYmxpbmdJbmZvcm1hdGlvbiB8IHVuZGVmaW5lZDtcblx0XHRpc0RyYWZ0Um9vdDogYm9vbGVhbjtcblx0XHRpc0RyYWZ0Tm9kZTogYm9vbGVhbjtcblx0XHRpc0FjdGl2ZTogYm9vbGVhbjtcblx0XHRoYXNBY3RpdmU6IGJvb2xlYW47XG5cdFx0aGFzRHJhZnQ6IGJvb2xlYW47XG5cdFx0bG9ja2VkOiBib29sZWFuO1xuXHRcdGRlbGV0YWJsZTogYm9vbGVhbjtcblx0XHRzaWJsaW5nRGVsZXRhYmxlOiBib29sZWFuO1xuXHR9O1xuXHRjb25zdCBjb250ZXh0SW5mb3MgPSBzZWxlY3RlZENvbnRleHRzLm1hcCgoY29udGV4dCkgPT4ge1xuXHRcdC8vIGFzc3VtaW5nIG1ldGFDb250ZXh0IGlzIHRoZSBzYW1lIGZvciBhbGwgY29udGV4dHMsIHN0aWxsIG5vdCByZWx5aW5nIG9uIHRoaXMgYXNzdW1wdGlvblxuXHRcdGNvbnN0IG1ldGFDb250ZXh0ID0gY29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpLmdldE1ldGFDb250ZXh0KGNvbnRleHQuZ2V0Q2Fub25pY2FsUGF0aCgpKTtcblx0XHRjb25zdCBkZWxldGFibGVQYXRoID0gbWV0YUNvbnRleHQuZ2V0UHJvcGVydHkoXCJAT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5EZWxldGVSZXN0cmljdGlvbnMvRGVsZXRhYmxlLyRQYXRoXCIpO1xuXHRcdGNvbnN0IHN0YXRpY0RlbGV0YWJsZSA9XG5cdFx0XHQhZGVsZXRhYmxlUGF0aCAmJiBtZXRhQ29udGV4dC5nZXRQcm9wZXJ0eShcIkBPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLkRlbGV0ZVJlc3RyaWN0aW9ucy9EZWxldGFibGVcIikgIT09IGZhbHNlO1xuXHRcdC8vIGRlZmF1bHQgdmFsdWVzIGFjY29yZGluZyB0byBub24tZHJhZnQgY2FzZSAoc3RpY2t5IGJlaGF2ZXMgdGhlIHNhbWUgYXMgbm9uLWRyYWZ0IGZyb20gVUkgcG9pbnQgb2YgdmlldyByZWdhcmRpbmcgZGVsZXRpb24pXG5cdFx0Y29uc3QgaW5mbzogY29udGV4dEluZm8gPSB7XG5cdFx0XHRjb250ZXh0OiBjb250ZXh0LFxuXHRcdFx0aXNEcmFmdFJvb3Q6ICEhbWV0YUNvbnRleHQuZ2V0UHJvcGVydHkoXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRyYWZ0Um9vdFwiKSxcblx0XHRcdGlzRHJhZnROb2RlOiAhIW1ldGFDb250ZXh0LmdldFByb3BlcnR5KFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EcmFmdE5vZGVcIiksXG5cdFx0XHRpc0FjdGl2ZTogdHJ1ZSxcblx0XHRcdGhhc0FjdGl2ZTogZmFsc2UsXG5cdFx0XHRoYXNEcmFmdDogZmFsc2UsXG5cdFx0XHRsb2NrZWQ6IGZhbHNlLFxuXHRcdFx0ZGVsZXRhYmxlOiBkZWxldGFibGVQYXRoID8gY29udGV4dC5nZXRQcm9wZXJ0eShkZWxldGFibGVQYXRoKSA6IHN0YXRpY0RlbGV0YWJsZSxcblx0XHRcdHNpYmxpbmdQcm9taXNlOiBQcm9taXNlLnJlc29sdmUodW5kZWZpbmVkKSxcblx0XHRcdHNpYmxpbmdJbmZvOiB1bmRlZmluZWQsXG5cdFx0XHRzaWJsaW5nRGVsZXRhYmxlOiBmYWxzZVxuXHRcdH07XG5cblx0XHRpZiAoaW5mby5pc0RyYWZ0Um9vdCkge1xuXHRcdFx0aW5mby5sb2NrZWQgPSAhIWNvbnRleHQuZ2V0T2JqZWN0KFwiRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGFcIik/LkluUHJvY2Vzc0J5VXNlcjtcblx0XHRcdGluZm8uaGFzRHJhZnQgPSBjb250ZXh0LmdldFByb3BlcnR5KFwiSGFzRHJhZnRFbnRpdHlcIik7XG5cdFx0fVxuXHRcdGlmIChpbmZvLmlzRHJhZnRSb290IHx8IGluZm8uaXNEcmFmdE5vZGUpIHtcblx0XHRcdGluZm8uaXNBY3RpdmUgPSBjb250ZXh0LmdldFByb3BlcnR5KFwiSXNBY3RpdmVFbnRpdHlcIik7XG5cdFx0XHRpbmZvLmhhc0FjdGl2ZSA9IGNvbnRleHQuZ2V0UHJvcGVydHkoXCJIYXNBY3RpdmVFbnRpdHlcIik7XG5cdFx0XHRpZiAoIWluZm8uaXNBY3RpdmUgJiYgaW5mby5oYXNBY3RpdmUpIHtcblx0XHRcdFx0Ly8gZ2V0IHNpYmxpbmcgY29udGV4dHNcblx0XHRcdFx0Ly8gZHJhZnQuY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbiBleHBlY3RzIGRyYWZ0IHJvb3QgYXMgZmlyc3QgcGFyYW1ldGVyIC0gaWYgd2UgYXJlIG9uIGEgc3Vibm9kZSwgdGhpcyBpcyBub3QgZ2l2ZW5cblx0XHRcdFx0Ly8gLSBkb25lIHdyb25nIGFsc28gYWJvdmUsIGJ1dCBzZWVtcyBub3QgdG8gYnJlYWsgYW55dGhpbmdcblx0XHRcdFx0Ly8gLSB3aHkgaXMgZHJhZnQuY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbiBub3QgYWJsZSB0byBjYWxjdWxhdGUgZHJhZnQgcm9vdCBvbiBpdHMgb3duPyFcblx0XHRcdFx0Ly8gLSBhbmQgd2h5IGlzIGl0IG5vdCBhYmxlIHRvIGRlYWwgd2l0aCBjb250ZXh0cyBub3QgZHJhZnQgZW5hYmxlZCAob2YgY291cnNlIHRoZXkgbmV2ZXIgaGF2ZSBhIHNpYmxpbmcgLSBjb3VsZCBqdXN0IHJldHVybiB1bmRlZmluZWQpXG5cdFx0XHRcdGluZm8uc2libGluZ1Byb21pc2UgPSBkcmFmdC5jb21wdXRlU2libGluZ0luZm9ybWF0aW9uKGNvbnRleHQsIGNvbnRleHQpLnRoZW4oYXN5bmMgKHNpYmxpbmdJbmZvcm1hdGlvbikgPT4ge1xuXHRcdFx0XHRcdC8vIEZvciBkcmFmdFdpdGhEZWxldGFibGVBY3RpdmUgYnVja2V0LCBjdXJyZW50bHkgYWxzbyBzaWJsaW5nSW5mb3JtYXRpb24gaXMgcHV0IGludG8gaW50ZXJuYWxNb2RlbCBhbmQgdXNlZFxuXHRcdFx0XHRcdC8vIGZyb20gdGhlcmUgaW4gY2FzZSBvZiBkZWxldGlvbi4gVGhlcmVmb3JlLCBzaWJsaW5nIG5lZWRzIHRvIGJlIHJldHJpZXZlZCBpbiBjYXNlIG9mIHN0YXRpY0RlbGV0YWJsZS5cblx0XHRcdFx0XHQvLyBQb3NzaWJsZSBpbXByb3ZlbWVudDogT25seSByZWFkIHNpYmxpbmdJbmZvIGhlcmUgaWYgbmVlZGVkIGZvciBkZXRlcm1pbmF0aW9uIG9mIGRlbGV0ZSBidXR0b24gZW5hYmxlbWVudCxcblx0XHRcdFx0XHQvLyBpbiBvdGhlciBjYXNlcywgcmVhZCBpdCBvbmx5IGlmIGRlbGV0aW9uIHJlYWxseSBoYXBwZW5zLlxuXHRcdFx0XHRcdGluZm8uc2libGluZ0luZm8gPSBzaWJsaW5nSW5mb3JtYXRpb247XG5cdFx0XHRcdFx0aWYgKGRlbGV0YWJsZVBhdGgpIHtcblx0XHRcdFx0XHRcdGluZm8uc2libGluZ0RlbGV0YWJsZSA9IGF3YWl0IHNpYmxpbmdJbmZvcm1hdGlvbj8udGFyZ2V0Q29udGV4dD8ucmVxdWVzdFByb3BlcnR5KGRlbGV0YWJsZVBhdGgpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRpbmZvLnNpYmxpbmdEZWxldGFibGUgPSBzdGF0aWNEZWxldGFibGU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGluZm87XG5cdH0pO1xuXHQvLyB3YWl0IGZvciBhbGwgc2libGluZ1Byb21pc2VzLiBJZiBubyBzaWJsaW5nIGV4aXN0cywgcHJvbWlzZSBpcyByZXNvbHZlZCB0byB1bmRlZmluZWQgKGJ1dCBpdCdzIHN0aWxsIGEgcHJvbWlzZSlcblx0YXdhaXQgUHJvbWlzZS5hbGwoY29udGV4dEluZm9zLm1hcCgoaW5mbykgPT4gaW5mby5zaWJsaW5nUHJvbWlzZSkpO1xuXG5cdGNvbnN0IGJ1Y2tldHMgPSBbXG5cdFx0e1xuXHRcdFx0a2V5OiBcImRyYWZ0c1dpdGhEZWxldGFibGVBY3RpdmVcIixcblx0XHRcdC8vIG9ubHkgZm9yIGRyYWZ0IHJvb3Q6IEluIHRoYXQgY2FzZSwgdGhlIGRlbGV0ZSByZXF1ZXN0IG5lZWRzIHRvIGJlIHNlbnQgZm9yIHRoZSBhY3RpdmUgKGkuZS4gdGhlIHNpYmxpbmcpLFxuXHRcdFx0Ly8gd2hpbGUgaW4gZHJhZnQgbm9kZSwgdGhlIGRlbGV0ZSByZXF1ZXN0IG5lZWRzIHRvIGJlIHNlbmQgZm9yIHRoZSBkcmFmdCBpdHNlbGZcblx0XHRcdHZhbHVlOiBjb250ZXh0SW5mb3MuZmlsdGVyKChpbmZvKSA9PiBpbmZvLmlzRHJhZnRSb290ICYmICFpbmZvLmlzQWN0aXZlICYmIGluZm8uaGFzQWN0aXZlICYmIGluZm8uc2libGluZ0RlbGV0YWJsZSlcblx0XHR9LFxuXHRcdHtcblx0XHRcdGtleTogXCJkcmFmdHNXaXRoTm9uRGVsZXRhYmxlQWN0aXZlXCIsXG5cdFx0XHR2YWx1ZTogY29udGV4dEluZm9zLmZpbHRlcigoaW5mbykgPT4gIWluZm8uaXNBY3RpdmUgJiYgaW5mby5oYXNBY3RpdmUgJiYgIWluZm8uc2libGluZ0RlbGV0YWJsZSlcblx0XHR9LFxuXHRcdHsga2V5OiBcImxvY2tlZENvbnRleHRzXCIsIHZhbHVlOiBjb250ZXh0SW5mb3MuZmlsdGVyKChpbmZvKSA9PiBpbmZvLmlzRHJhZnRSb290ICYmIGluZm8uaXNBY3RpdmUgJiYgaW5mby5oYXNEcmFmdCAmJiBpbmZvLmxvY2tlZCkgfSxcblx0XHR7XG5cdFx0XHRrZXk6IFwidW5TYXZlZENvbnRleHRzXCIsXG5cdFx0XHR2YWx1ZTogY29udGV4dEluZm9zLmZpbHRlcigoaW5mbykgPT4gaW5mby5pc0RyYWZ0Um9vdCAmJiBpbmZvLmlzQWN0aXZlICYmIGluZm8uaGFzRHJhZnQgJiYgIWluZm8ubG9ja2VkKVxuXHRcdH0sXG5cdFx0Ly8gbm9uLWRyYWZ0L3N0aWNreSBhbmQgZGVsZXRhYmxlXG5cdFx0Ly8gYWN0aXZlIGRyYWZ0IHJvb3Qgd2l0aG91dCBhbnkgZHJhZnQgYW5kIGRlbGV0YWJsZVxuXHRcdC8vIGNyZWF0ZWQgZHJhZnQgcm9vdCAocmVnYXJkbGVzcyBvZiBkZWxldGFibGUpXG5cdFx0Ly8gZHJhZnQgbm9kZSB3aXRob3V0IGFjdGl2ZSAocmVnYXJkbGVzcyB3aGV0aGVyIHJvb3QgaXMgY3JlYXRlIG9yIGVkaXQsIGFuZCByZWdhcmRsZXNzIG9mIGRlbGV0YWJsZSlcblx0XHQvLyBkcmFmdCBub2RlIHdpdGggZGVsZXRhYmxlIGFjdGl2ZVxuXHRcdHtcblx0XHRcdGtleTogXCJkZWxldGFibGVDb250ZXh0c1wiLFxuXHRcdFx0dmFsdWU6IGNvbnRleHRJbmZvcy5maWx0ZXIoXG5cdFx0XHRcdChpbmZvKSA9PlxuXHRcdFx0XHRcdCghaW5mby5pc0RyYWZ0Um9vdCAmJiAhaW5mby5pc0RyYWZ0Tm9kZSAmJiBpbmZvLmRlbGV0YWJsZSkgfHxcblx0XHRcdFx0XHQoaW5mby5pc0RyYWZ0Um9vdCAmJiBpbmZvLmlzQWN0aXZlICYmICFpbmZvLmhhc0RyYWZ0ICYmIGluZm8uZGVsZXRhYmxlKSB8fFxuXHRcdFx0XHRcdChpbmZvLmlzRHJhZnRSb290ICYmICFpbmZvLmlzQWN0aXZlICYmICFpbmZvLmhhc0FjdGl2ZSkgfHxcblx0XHRcdFx0XHQoaW5mby5pc0RyYWZ0Tm9kZSAmJiAhaW5mby5pc0FjdGl2ZSAmJiAhaW5mby5oYXNBY3RpdmUpIHx8XG5cdFx0XHRcdFx0KGluZm8uaXNEcmFmdE5vZGUgJiYgIWluZm8uaXNBY3RpdmUgJiYgaW5mby5oYXNBY3RpdmUgJiYgaW5mby5zaWJsaW5nRGVsZXRhYmxlKVxuXHRcdFx0KVxuXHRcdH1cblx0XTtcblxuXHRmb3IgKGNvbnN0IHsga2V5LCB2YWx1ZSB9IG9mIGJ1Y2tldHMpIHtcblx0XHRpbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcblx0XHRcdGtleSxcblx0XHRcdC8vIEN1cnJlbnRseSwgYnVja2V0IGRyYWZ0c1dpdGhEZWxldGFibGVBY3RpdmUgaGFzIGEgZGlmZmVyZW50IHN0cnVjdHVyZSAoY29udGFpbmluZyBhbHNvIHNpYmxpbmcgaW5mb3JtYXRpb24sIHdoaWNoIGlzIHVzZWRcblx0XHRcdC8vIGluIGNhc2Ugb2YgZGVsZXRpb24pLiBQb3NzaWJsZSBpbXByb3ZlbWVudDogUmVhZCBzaWJsaW5nIGluZm9ybWF0aW9uIG9ubHkgd2hlbiBuZWVkZWQsIGFuZCBidWlsZCBhbGwgYnVja2V0cyB3aXRoIHNhbWVcblx0XHRcdC8vIHN0cnVjdHVyZS4gSG93ZXZlciwgaW4gdGhhdCBjYXNlIHNpYmxpbmdJbmZvcm1hdGlvbiBtaWdodCBuZWVkIHRvIGJlIHJlYWQgdHdpY2UgKGlmIGFscmVhZHkgbmVlZGVkIGZvciBidXR0b24gZW5hYmxlbWVudCksXG5cdFx0XHQvLyB0aHVzIGEgYnVmZmVyIHByb2JhYmx5IHdvdWxkIG1ha2Ugc2Vuc2UuXG5cdFx0XHR2YWx1ZS5tYXAoKGluZm8pID0+XG5cdFx0XHRcdGtleSA9PT0gXCJkcmFmdHNXaXRoRGVsZXRhYmxlQWN0aXZlXCIgPyB7IGRyYWZ0OiBpbmZvLmNvbnRleHQsIHNpYmxpbmdJbmZvOiBpbmZvLnNpYmxpbmdJbmZvIH0gOiBpbmZvLmNvbnRleHRcblx0XHRcdClcblx0XHQpO1xuXHR9XG59XG5cbmNvbnN0IGRlbGV0ZUhlbHBlciA9IHtcblx0Z2V0Tm9uRGVsZXRhYmxlVGV4dCxcblx0ZGVsZXRlQ29uZmlybUhhbmRsZXIsXG5cdHVwZGF0ZU9wdGlvbnNGb3JEZWxldGFibGVUZXh0cyxcblx0dXBkYXRlQ29udGVudEZvckRlbGV0ZURpYWxvZyxcblx0dXBkYXRlRHJhZnRPcHRpb25zRm9yRGVsZXRhYmxlVGV4dHMsXG5cdGdldENvbmZpcm1lZERlbGV0YWJsZUNvbnRleHQsXG5cdGdldExvY2tlZE9iamVjdHNUZXh0LFxuXHRnZXRVbnNhdmVkQ29udGV4dHNUZXh0LFxuXHRnZXROb25EZWxldGFibGVBY3RpdmVzT2ZEcmFmdHNUZXh0LFxuXHRhZnRlckRlbGV0ZVByb2Nlc3MsXG5cblx0dXBkYXRlRGVsZXRlSW5mb0ZvclNlbGVjdGVkQ29udGV4dHNcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGRlbGV0ZUhlbHBlcjtcbiJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQUE7QUFBQTs7Ozs7TUFtQllBLGlCQUFpQjtFQUFBLFdBQWpCQSxpQkFBaUI7SUFBakJBLGlCQUFpQjtJQUFqQkEsaUJBQWlCO0lBQWpCQSxpQkFBaUI7SUFBakJBLGlCQUFpQjtJQUFqQkEsaUJBQWlCO0VBQUEsR0FBakJBLGlCQUFpQixLQUFqQkEsaUJBQWlCO0VBQUE7RUFBQSxJQVFqQkMsMEJBQTBCO0VBQUEsV0FBMUJBLDBCQUEwQjtJQUExQkEsMEJBQTBCO0lBQTFCQSwwQkFBMEI7RUFBQSxHQUExQkEsMEJBQTBCLEtBQTFCQSwwQkFBMEI7RUFBQTtFQTJEdEMsU0FBU0Msb0JBQW9CLENBQzVCQyxvQkFBMEMsRUFDMUNDLElBQXVCLEVBQ3ZCQyxnQkFBNkIsRUFDN0JDLGdCQUE2QixFQUNmO0lBQ2RBLGdCQUFnQixDQUFDQyxPQUFPLENBQUVDLE9BQWtCLElBQUs7TUFDaEQsTUFBTUMsR0FBRyxHQUFHSixnQkFBZ0IsQ0FBQ0ssT0FBTyxDQUFDRixPQUFPLENBQUM7TUFDN0MsSUFBSUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxFQUFFO1FBQ2ZKLGdCQUFnQixDQUFDTSxNQUFNLENBQUNGLEdBQUcsRUFBRSxDQUFDLENBQUM7TUFDaEM7SUFDRCxDQUFDLENBQUM7SUFDRk4sb0JBQW9CLENBQUNTLFdBQVcsQ0FBQ1IsSUFBSSxFQUFFLEVBQUUsQ0FBQztJQUUxQyxPQUFPLENBQUMsR0FBR0MsZ0JBQWdCLENBQUM7RUFDN0I7RUFFQSxTQUFTUSw4QkFBOEIsQ0FBQ1Ysb0JBQTBDLEVBQUVXLE1BQW9CLEVBQUU7SUFDekcsSUFBSVQsZ0JBQWdCLEdBQUlGLG9CQUFvQixDQUFDWSxXQUFXLENBQUMsa0JBQWtCLENBQUMsSUFBb0IsRUFBRTtJQUVsRyxJQUFJRCxNQUFNLENBQUNWLElBQUksS0FBS0osaUJBQWlCLENBQUNnQixpQkFBaUIsRUFBRTtNQUN4RFgsZ0JBQWdCLEdBQUdILG9CQUFvQixDQUN0Q0Msb0JBQW9CLEVBQ3BCSCxpQkFBaUIsQ0FBQ2dCLGlCQUFpQixFQUNuQ1gsZ0JBQWdCLEVBQ2hCRixvQkFBb0IsQ0FBQ1ksV0FBVyxDQUFDZixpQkFBaUIsQ0FBQ2dCLGlCQUFpQixDQUFDLElBQUksRUFBRSxDQUMzRTtNQUNEWCxnQkFBZ0IsR0FBR0gsb0JBQW9CLENBQ3RDQyxvQkFBb0IsRUFDcEJILGlCQUFpQixDQUFDaUIsa0JBQWtCLEVBQ3BDWixnQkFBZ0IsRUFDaEJGLG9CQUFvQixDQUFDWSxXQUFXLENBQUNmLGlCQUFpQixDQUFDaUIsa0JBQWtCLENBQUMsSUFBSSxFQUFFLENBQzVFO01BRUQsTUFBTUMsaUJBQWlCLEdBQUdmLG9CQUFvQixDQUFDWSxXQUFXLENBQUNmLGlCQUFpQixDQUFDbUIseUJBQXlCLENBQUMsSUFBSSxFQUFFO01BQzdHLE1BQU1DLE1BQU0sR0FBR0YsaUJBQWlCLENBQUNHLEdBQUcsQ0FBRUMsV0FBNkIsSUFBSztRQUN2RSxPQUFPQSxXQUFXLENBQUNDLEtBQUs7TUFDekIsQ0FBQyxDQUFDO01BQ0ZsQixnQkFBZ0IsR0FBR0gsb0JBQW9CLENBQ3RDQyxvQkFBb0IsRUFDcEJILGlCQUFpQixDQUFDbUIseUJBQXlCLEVBQzNDZCxnQkFBZ0IsRUFDaEJlLE1BQU0sQ0FDTjtJQUNGLENBQUMsTUFBTTtNQUNOLE1BQU1kLGdCQUFnQixHQUFHSCxvQkFBb0IsQ0FBQ1ksV0FBVyxDQUFDRCxNQUFNLENBQUNWLElBQUksQ0FBQyxJQUFJLEVBQUU7TUFDNUVDLGdCQUFnQixHQUFHSCxvQkFBb0IsQ0FBQ0Msb0JBQW9CLEVBQUVXLE1BQU0sQ0FBQ1YsSUFBSSxFQUFFQyxnQkFBZ0IsRUFBRUMsZ0JBQWdCLENBQUM7SUFDL0c7SUFDQUgsb0JBQW9CLENBQUNTLFdBQVcsQ0FBQyxrQkFBa0IsRUFBRVAsZ0JBQWdCLENBQUM7SUFDdEVGLG9CQUFvQixDQUFDUyxXQUFXLENBQUMsMEJBQTBCLEVBQUVQLGdCQUFnQixDQUFDbUIsTUFBTSxDQUFDO0VBQ3RGO0VBRUEsU0FBU0Msa0JBQWtCLENBQUNDLFVBQTRCLEVBQUVDLE9BQXVCLEVBQUVDLFFBQXFCLEVBQUVDLGVBQStCLEVBQUU7SUFDMUksTUFBTTtNQUFFMUIsb0JBQW9CO01BQUUyQjtJQUFjLENBQUMsR0FBR0osVUFBVTtJQUMxRCxJQUFJdkIsb0JBQW9CLEVBQUU7TUFDekIsSUFBSUEsb0JBQW9CLENBQUNZLFdBQVcsQ0FBQyxlQUFlLENBQUMsSUFBSWdCLFNBQVMsRUFBRTtRQUNuRUosT0FBTyxDQUFDcEIsT0FBTyxDQUFFTyxNQUFNLElBQUs7VUFDM0I7VUFDQSxJQUFJQSxNQUFNLENBQUNrQixRQUFRLEVBQUU7WUFDcEJuQiw4QkFBOEIsQ0FBQ1Ysb0JBQW9CLEVBQUVXLE1BQU0sQ0FBQztVQUM3RDtRQUNELENBQUMsQ0FBQztNQUNIO01BQ0E7TUFDQVgsb0JBQW9CLENBQUNTLFdBQVcsQ0FDL0IsZUFBZSxFQUNmZSxPQUFPLENBQUNNLElBQUksQ0FBRW5CLE1BQU0sSUFBSyxDQUFDQSxNQUFNLENBQUNrQixRQUFRLENBQUMsQ0FDMUM7SUFDRjtJQUVBLElBQUlKLFFBQVEsQ0FBQ0osTUFBTSxLQUFLLENBQUMsRUFBRTtNQUMxQlUsWUFBWSxDQUFDQyxJQUFJLENBQ2hCQyxXQUFXLENBQUNDLGlCQUFpQixDQUFDLDRDQUE0QyxFQUFFUixlQUFlLEVBQUVFLFNBQVMsRUFBRUQsYUFBYSxDQUFDLENBQ3RIO0lBQ0YsQ0FBQyxNQUFNO01BQ05JLFlBQVksQ0FBQ0MsSUFBSSxDQUNoQkMsV0FBVyxDQUFDQyxpQkFBaUIsQ0FBQywwQ0FBMEMsRUFBRVIsZUFBZSxFQUFFRSxTQUFTLEVBQUVELGFBQWEsQ0FBQyxDQUNwSDtJQUNGO0VBQ0Q7RUFFQSxTQUFTUSxvQkFBb0IsQ0FBQ0MsYUFBd0IsRUFBVTtJQUMvRCxNQUFNQyxjQUFjLEdBQUdELGFBQWEsQ0FBQ0UsU0FBUyxFQUFFLENBQUMseUJBQXlCLENBQWdDO0lBQzFHLE9BQVFELGNBQWMsSUFBSUEsY0FBYyxDQUFDLGlCQUFpQixDQUFDLElBQUssRUFBRTtFQUNuRTtFQUVBLFNBQVNFLG9CQUFvQixDQUFDYixlQUErQixFQUFFYyx3QkFBZ0MsRUFBRUMsY0FBMkIsRUFBVTtJQUNySSxJQUFJQyxNQUFNLEdBQUcsRUFBRTtJQUVmLElBQUlGLHdCQUF3QixLQUFLLENBQUMsSUFBSUMsY0FBYyxDQUFDcEIsTUFBTSxLQUFLLENBQUMsRUFBRTtNQUNsRTtNQUNBLE1BQU1zQixVQUFVLEdBQUdSLG9CQUFvQixDQUFDTSxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDMURDLE1BQU0sR0FBR1QsV0FBVyxDQUFDQyxpQkFBaUIsQ0FBQywrREFBK0QsRUFBRVIsZUFBZSxFQUFFLENBQ3hIaUIsVUFBVSxDQUNWLENBQUM7SUFDSCxDQUFDLE1BQU0sSUFBSUYsY0FBYyxDQUFDcEIsTUFBTSxJQUFJLENBQUMsRUFBRTtNQUN0QyxNQUFNc0IsVUFBVSxHQUFHUixvQkFBb0IsQ0FBQ00sY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQzFEQyxNQUFNLEdBQUdULFdBQVcsQ0FBQ0MsaUJBQWlCLENBQ3JDLDJFQUEyRSxFQUMzRVIsZUFBZSxFQUNmLENBQUNjLHdCQUF3QixFQUFFRyxVQUFVLENBQUMsQ0FDdEM7SUFDRixDQUFDLE1BQU0sSUFBSUYsY0FBYyxDQUFDcEIsTUFBTSxHQUFHLENBQUMsRUFBRTtNQUNyQ3FCLE1BQU0sR0FBR1QsV0FBVyxDQUFDQyxpQkFBaUIsQ0FDckMsNEVBQTRFLEVBQzVFUixlQUFlLEVBQ2YsQ0FBQ2UsY0FBYyxDQUFDcEIsTUFBTSxFQUFFbUIsd0JBQXdCLENBQUMsQ0FDakQ7SUFDRjtJQUVBLE9BQU9FLE1BQU07RUFDZDtFQUVBLFNBQVNFLGtDQUFrQyxDQUFDbEIsZUFBK0IsRUFBRW1CLGNBQXNCLEVBQUVDLGNBQXNCLEVBQVU7SUFDcEksSUFBSUosTUFBTSxHQUFHLEVBQUU7SUFFZixJQUFJSSxjQUFjLEtBQUtELGNBQWMsRUFBRTtNQUN0QyxJQUFJQSxjQUFjLEtBQUssQ0FBQyxFQUFFO1FBQ3pCSCxNQUFNLEdBQUdULFdBQVcsQ0FBQ0MsaUJBQWlCLENBQ3JDLHdFQUF3RSxFQUN4RVIsZUFBZSxDQUNmO01BQ0YsQ0FBQyxNQUFNO1FBQ05nQixNQUFNLEdBQUdULFdBQVcsQ0FBQ0MsaUJBQWlCLENBQ3JDLHlFQUF5RSxFQUN6RVIsZUFBZSxDQUNmO01BQ0Y7SUFDRCxDQUFDLE1BQU0sSUFBSW1CLGNBQWMsS0FBSyxDQUFDLEVBQUU7TUFDaENILE1BQU0sR0FBR1QsV0FBVyxDQUFDQyxpQkFBaUIsQ0FBQyxtRUFBbUUsRUFBRVIsZUFBZSxDQUFDO0lBQzdILENBQUMsTUFBTTtNQUNOZ0IsTUFBTSxHQUFHVCxXQUFXLENBQUNDLGlCQUFpQixDQUFDLG9FQUFvRSxFQUFFUixlQUFlLENBQUM7SUFDOUg7SUFFQSxPQUFPZ0IsTUFBTTtFQUNkO0VBRUEsU0FBU0sscUJBQXFCLENBQUNDLGNBQXlCLEVBQVU7SUFDakUsTUFBTVgsY0FBYyxHQUFHVyxjQUFjLENBQUNWLFNBQVMsRUFBRSxDQUFDLHlCQUF5QixDQUFnQztJQUMzRyxJQUFJVyxrQkFBa0IsR0FBRyxFQUFFO0lBQzNCLElBQUlaLGNBQWMsRUFBRTtNQUNuQlksa0JBQWtCLEdBQUdaLGNBQWMsQ0FBQyw4QkFBOEIsQ0FBQyxJQUFJQSxjQUFjLENBQUMsbUJBQW1CLENBQUMsSUFBSSxFQUFFO0lBQ2pIO0lBRUEsT0FBT1ksa0JBQWtCO0VBQzFCO0VBRUEsU0FBU0Msc0JBQXNCLENBQzlCeEIsZUFBK0IsRUFDL0JjLHdCQUFnQyxFQUNoQ1csZUFBNEIsRUFDNUJMLGNBQXNCLEVBQ0w7SUFDakIsSUFBSU0sT0FBTyxHQUFHLEVBQUU7TUFDZkMsU0FBUyxHQUFHLEVBQUU7TUFDZEMsZ0JBQWdCLEdBQUcsS0FBSztJQUN6QixJQUFJZCx3QkFBd0IsS0FBSyxDQUFDLElBQUlXLGVBQWUsQ0FBQzlCLE1BQU0sS0FBSyxDQUFDLEVBQUU7TUFDbkU7TUFDQSxNQUFNa0MsaUJBQWlCLEdBQUdSLHFCQUFxQixDQUFDSSxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDbkVDLE9BQU8sR0FBR25CLFdBQVcsQ0FBQ0MsaUJBQWlCLENBQUMsMERBQTBELEVBQUVSLGVBQWUsRUFBRSxDQUNwSDZCLGlCQUFpQixDQUNqQixDQUFDO01BQ0ZELGdCQUFnQixHQUFHLElBQUk7SUFDeEIsQ0FBQyxNQUFNLElBQUlkLHdCQUF3QixLQUFLVyxlQUFlLENBQUM5QixNQUFNLEVBQUU7TUFDL0Q7TUFDQStCLE9BQU8sR0FBR25CLFdBQVcsQ0FBQ0MsaUJBQWlCLENBQ3RDLDJFQUEyRSxFQUMzRVIsZUFBZSxDQUNmO01BQ0Q0QixnQkFBZ0IsR0FBRyxJQUFJO0lBQ3hCLENBQUMsTUFBTSxJQUFJUixjQUFjLEtBQUtLLGVBQWUsQ0FBQzlCLE1BQU0sRUFBRTtNQUNyRDtNQUNBLElBQUk4QixlQUFlLENBQUM5QixNQUFNLEtBQUssQ0FBQyxFQUFFO1FBQ2pDLE1BQU1rQyxpQkFBaUIsR0FBR1IscUJBQXFCLENBQUNJLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNuRUMsT0FBTyxHQUFHbkIsV0FBVyxDQUFDQyxpQkFBaUIsQ0FDdEMsa0ZBQWtGLEVBQ2xGUixlQUFlLEVBQ2YsQ0FBQzZCLGlCQUFpQixDQUFDLENBQ25CO01BQ0YsQ0FBQyxNQUFNO1FBQ05ILE9BQU8sR0FBR25CLFdBQVcsQ0FBQ0MsaUJBQWlCLENBQ3RDLGdGQUFnRixFQUNoRlIsZUFBZSxDQUNmO01BQ0Y7TUFDQTRCLGdCQUFnQixHQUFHLElBQUk7SUFDeEIsQ0FBQyxNQUFNLElBQUlSLGNBQWMsR0FBR0ssZUFBZSxDQUFDOUIsTUFBTSxFQUFFO01BQ25EO01BQ0EsSUFBSThCLGVBQWUsQ0FBQzlCLE1BQU0sS0FBSyxDQUFDLEVBQUU7UUFDakMsTUFBTWtDLGlCQUFpQixHQUFHUixxQkFBcUIsQ0FBQ0ksZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25FRSxTQUFTLEdBQUdwQixXQUFXLENBQUNDLGlCQUFpQixDQUN4QyxzRkFBc0YsRUFDdEZSLGVBQWUsRUFDZixDQUFDNkIsaUJBQWlCLENBQUMsQ0FDbkI7TUFDRixDQUFDLE1BQU07UUFDTkYsU0FBUyxHQUFHcEIsV0FBVyxDQUFDQyxpQkFBaUIsQ0FDeEMsb0ZBQW9GLEVBQ3BGUixlQUFlLENBQ2Y7TUFDRjtJQUNEO0lBRUEsT0FBTztNQUFFMEIsT0FBTztNQUFFQyxTQUFTO01BQUVDO0lBQWlCLENBQUM7RUFDaEQ7RUFFQSxTQUFTRSxtQkFBbUIsQ0FBQ0MsV0FBNkIsRUFBRUMseUJBQWlDLEVBQUVoQyxlQUErQixFQUFVO0lBQ3ZJLE1BQU07TUFBRWMsd0JBQXdCO01BQUVDLGNBQWM7TUFBRWtCO0lBQTZCLENBQUMsR0FBR0YsV0FBVztJQUM5RixNQUFNRyxvQkFBb0IsR0FDekJwQix3QkFBd0IsSUFBSUMsY0FBYyxDQUFDcEIsTUFBTSxHQUFHcUMseUJBQXlCLEdBQUdDLDRCQUE0QixDQUFDdEMsTUFBTSxDQUFDO0lBQ3JILElBQUlxQixNQUFNLEdBQUcsRUFBRTtJQUVmLElBQ0NrQixvQkFBb0IsR0FBRyxDQUFDLEtBQ3ZCRix5QkFBeUIsS0FBSyxDQUFDLElBQUlDLDRCQUE0QixDQUFDdEMsTUFBTSxLQUFLcUMseUJBQXlCLENBQUMsRUFDckc7TUFDRDtNQUNBO01BQ0EsSUFBSWpCLGNBQWMsQ0FBQ3BCLE1BQU0sR0FBRyxDQUFDLEVBQUU7UUFDOUI7UUFDQSxJQUFJdUMsb0JBQW9CLEtBQUssQ0FBQyxFQUFFO1VBQy9CbEIsTUFBTSxHQUFHVCxXQUFXLENBQUNDLGlCQUFpQixDQUNyQywrRUFBK0UsRUFDL0VSLGVBQWUsRUFDZkUsU0FBUyxDQUNUO1FBQ0YsQ0FBQyxNQUFNO1VBQ05jLE1BQU0sR0FBR1QsV0FBVyxDQUFDQyxpQkFBaUIsQ0FDckMsNkVBQTZFLEVBQzdFUixlQUFlLEVBQ2ZFLFNBQVMsQ0FDVDtRQUNGO01BQ0QsQ0FBQyxNQUFNLElBQUlnQyxvQkFBb0IsS0FBSyxDQUFDLEVBQUU7UUFDdEM7UUFDQWxCLE1BQU0sR0FBR1QsV0FBVyxDQUFDQyxpQkFBaUIsQ0FDckMsOEVBQThFLEVBQzlFUixlQUFlLEVBQ2ZFLFNBQVMsQ0FDVDtNQUNGLENBQUMsTUFBTTtRQUNOO1FBQ0FjLE1BQU0sR0FBR1QsV0FBVyxDQUFDQyxpQkFBaUIsQ0FDckMsZ0ZBQWdGLEVBQ2hGUixlQUFlLEVBQ2ZFLFNBQVMsQ0FDVDtNQUNGO0lBQ0QsQ0FBQyxNQUFNLElBQUlnQyxvQkFBb0IsS0FBSyxDQUFDLEVBQUU7TUFDdEM7TUFDQWxCLE1BQU0sR0FBR1QsV0FBVyxDQUFDQyxpQkFBaUIsQ0FDckMsa0ZBQWtGLEVBQ2xGUixlQUFlLEVBQ2YsQ0FBQ2Msd0JBQXdCLENBQUMsQ0FDMUI7SUFDRixDQUFDLE1BQU0sSUFBSW9CLG9CQUFvQixHQUFHLENBQUMsRUFBRTtNQUNwQztNQUNBbEIsTUFBTSxHQUFHVCxXQUFXLENBQUNDLGlCQUFpQixDQUNyQyxtRkFBbUYsRUFDbkZSLGVBQWUsRUFDZixDQUFDa0Msb0JBQW9CLEVBQUVwQix3QkFBd0IsQ0FBQyxDQUNoRDtJQUNGO0lBRUEsT0FBT0UsTUFBTTtFQUNkO0VBRUEsU0FBU21CLDRCQUE0QixDQUFDcEMsUUFBcUIsRUFBRUQsT0FBdUIsRUFBZTtJQUNsRyxPQUFPQSxPQUFPLENBQUNzQyxNQUFNLENBQUMsQ0FBQ0MsTUFBTSxFQUFFcEQsTUFBTSxLQUFLO01BQ3pDLE9BQU9BLE1BQU0sQ0FBQ2tCLFFBQVEsR0FBR2tDLE1BQU0sQ0FBQ0MsTUFBTSxDQUFDckQsTUFBTSxDQUFDYyxRQUFRLENBQUMsR0FBR3NDLE1BQU07SUFDakUsQ0FBQyxFQUFFdEMsUUFBUSxDQUFDO0VBQ2I7RUFFQSxTQUFTd0MsbUNBQW1DLENBQzNDUixXQUE2QixFQUM3QlMsU0FBc0IsRUFDdEJwQixjQUFzQixFQUN0QnBCLGVBQStCLEVBQy9CeUMsS0FBZ0IsRUFDaEIzQyxPQUF1QixFQUN0QjtJQUNELE1BQU07TUFDTGdCLHdCQUF3QjtNQUN4QnhCLHlCQUF5QjtNQUN6Qm1DLGVBQWU7TUFDZnJDLGtCQUFrQjtNQUNsQjJCLGNBQWM7TUFDZGtCO0lBQ0QsQ0FBQyxHQUFHRixXQUFXO0lBQ2YsSUFBSVcsdUJBQXVCLEdBQUcsRUFBRTtNQUMvQkMsaUJBQWlCLEdBQUcsRUFBRTs7SUFFdkI7SUFDQSxJQUFJckQseUJBQXlCLENBQUNLLE1BQU0sR0FBRyxDQUFDLEVBQUU7TUFDekNMLHlCQUF5QixDQUFDWixPQUFPLENBQUVrRSxrQkFBb0MsSUFBSztRQUMzRUosU0FBUyxDQUFDSyxJQUFJLENBQUNELGtCQUFrQixDQUFDRSxXQUFXLENBQUNDLGFBQWEsQ0FBQztNQUM3RCxDQUFDLENBQUM7SUFDSDs7SUFFQTtJQUNBLElBQUkzRCxrQkFBa0IsQ0FBQ08sTUFBTSxHQUFHLENBQUMsRUFBRTtNQUNsQztNQUNBUCxrQkFBa0IsQ0FBQ1YsT0FBTyxDQUFFQyxPQUFPLElBQUs2RCxTQUFTLENBQUNLLElBQUksQ0FBQ2xFLE9BQU8sQ0FBQyxDQUFDO0lBQ2pFOztJQUVBO0lBQ0EsSUFBSW9DLGNBQWMsQ0FBQ3BCLE1BQU0sR0FBRyxDQUFDLEVBQUU7TUFDOUJnRCxpQkFBaUIsR0FBR0ssWUFBWSxDQUFDbkMsb0JBQW9CLENBQUNiLGVBQWUsRUFBRWMsd0JBQXdCLEVBQUVDLGNBQWMsQ0FBQyxJQUFJLEVBQUU7TUFDdEgwQixLQUFLLENBQUNJLElBQUksQ0FBQyxJQUFJSSxJQUFJLENBQUM7UUFBRUMsSUFBSSxFQUFFUDtNQUFrQixDQUFDLENBQUMsQ0FBQztJQUNsRDs7SUFFQTtJQUNBLElBQUk3Qix3QkFBd0IsSUFBSU0sY0FBYyxHQUFHYSw0QkFBNEIsQ0FBQ3RDLE1BQU0sR0FBR29CLGNBQWMsQ0FBQ3BCLE1BQU0sRUFBRTtNQUM3RytDLHVCQUF1QixHQUFHTSxZQUFZLENBQUNsQixtQkFBbUIsQ0FBQ0MsV0FBVyxFQUFFWCxjQUFjLEVBQUVwQixlQUFlLENBQUM7TUFDeEd5QyxLQUFLLENBQUNJLElBQUksQ0FBQyxJQUFJSSxJQUFJLENBQUM7UUFBRUMsSUFBSSxFQUFFUjtNQUF3QixDQUFDLENBQUMsQ0FBQztJQUN4RDs7SUFFQTtJQUNBLElBQUlqQixlQUFlLENBQUM5QixNQUFNLEdBQUcsQ0FBQyxFQUFFO01BQy9CLE1BQU13RCxrQkFBa0IsR0FDdkJILFlBQVksQ0FBQ3hCLHNCQUFzQixDQUFDeEIsZUFBZSxFQUFFYyx3QkFBd0IsRUFBRVcsZUFBZSxFQUFFTCxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7TUFDdEgsSUFBSStCLGtCQUFrQixDQUFDekIsT0FBTyxFQUFFO1FBQy9CZSxLQUFLLENBQUNJLElBQUksQ0FBQyxJQUFJSSxJQUFJLENBQUM7VUFBRUMsSUFBSSxFQUFFQyxrQkFBa0IsQ0FBQ3pCO1FBQVEsQ0FBQyxDQUFDLENBQUM7TUFDM0Q7TUFDQSxJQUFJeUIsa0JBQWtCLENBQUN4QixTQUFTLElBQUl3QixrQkFBa0IsQ0FBQ3ZCLGdCQUFnQixFQUFFO1FBQ3hFOUIsT0FBTyxDQUFDK0MsSUFBSSxDQUFDO1VBQ1p0RSxJQUFJLEVBQUVKLGlCQUFpQixDQUFDc0QsZUFBZTtVQUN2QzFCLFFBQVEsRUFBRTBCLGVBQWU7VUFDekJ5QixJQUFJLEVBQUVDLGtCQUFrQixDQUFDeEIsU0FBUztVQUNsQ3hCLFFBQVEsRUFBRSxJQUFJO1VBQ2RpRCxPQUFPLEVBQUVoRiwwQkFBMEIsQ0FBQ2lGO1FBQ3JDLENBQUMsQ0FBQztNQUNIO0lBQ0Q7O0lBRUE7SUFDQSxJQUFJcEIsNEJBQTRCLENBQUN0QyxNQUFNLEdBQUcsQ0FBQyxFQUFFO01BQzVDLE1BQU0yRCwrQkFBK0IsR0FDcENOLFlBQVksQ0FBQzlCLGtDQUFrQyxDQUFDbEIsZUFBZSxFQUFFaUMsNEJBQTRCLENBQUN0QyxNQUFNLEVBQUV5QixjQUFjLENBQUMsSUFBSSxFQUFFO01BQzVILElBQUlrQywrQkFBK0IsRUFBRTtRQUNwQ3hELE9BQU8sQ0FBQytDLElBQUksQ0FBQztVQUNadEUsSUFBSSxFQUFFSixpQkFBaUIsQ0FBQzhELDRCQUE0QjtVQUNwRGxDLFFBQVEsRUFBRWtDLDRCQUE0QjtVQUN0Q2lCLElBQUksRUFBRUksK0JBQStCO1VBQ3JDbkQsUUFBUSxFQUFFLElBQUk7VUFDZGlELE9BQU8sRUFBRWhDLGNBQWMsR0FBRyxDQUFDLEdBQUdoRCwwQkFBMEIsQ0FBQ2lGLFFBQVEsR0FBR2pGLDBCQUEwQixDQUFDbUY7UUFDaEcsQ0FBQyxDQUFDO01BQ0g7SUFDRDtFQUNEO0VBRUEsU0FBU0MsNEJBQTRCLENBQUMxRCxPQUF1QixFQUFFMkMsS0FBZ0IsRUFBRTtJQUNoRixJQUFJM0MsT0FBTyxDQUFDSCxNQUFNLEtBQUssQ0FBQyxFQUFFO01BQ3pCO01BQ0EsTUFBTVYsTUFBTSxHQUFHYSxPQUFPLENBQUMsQ0FBQyxDQUFDO01BQ3pCLElBQUliLE1BQU0sQ0FBQ2lFLElBQUksRUFBRTtRQUNoQlQsS0FBSyxDQUFDSSxJQUFJLENBQUMsSUFBSUksSUFBSSxDQUFDO1VBQUVDLElBQUksRUFBRWpFLE1BQU0sQ0FBQ2lFO1FBQUssQ0FBQyxDQUFDLENBQUM7TUFDNUM7SUFDRCxDQUFDLE1BQU0sSUFBSXBELE9BQU8sQ0FBQ0gsTUFBTSxHQUFHLENBQUMsRUFBRTtNQUM5Qjs7TUFFQTtNQUNBRyxPQUFPLENBQUNwQixPQUFPLENBQUVPLE1BQW9CLElBQUs7UUFDekMsSUFBSUEsTUFBTSxDQUFDbUUsT0FBTyxLQUFLLE1BQU0sSUFBSW5FLE1BQU0sQ0FBQ2lFLElBQUksRUFBRTtVQUM3Q1QsS0FBSyxDQUFDSSxJQUFJLENBQUMsSUFBSUksSUFBSSxDQUFDO1lBQUVDLElBQUksRUFBRWpFLE1BQU0sQ0FBQ2lFO1VBQUssQ0FBQyxDQUFDLENBQUM7UUFDNUM7TUFDRCxDQUFDLENBQUM7TUFDRjtNQUNBcEQsT0FBTyxDQUFDcEIsT0FBTyxDQUFFTyxNQUFvQixJQUFLO1FBQ3pDLElBQUlBLE1BQU0sQ0FBQ21FLE9BQU8sS0FBSyxVQUFVLElBQUluRSxNQUFNLENBQUNpRSxJQUFJLEVBQUU7VUFDakRULEtBQUssQ0FBQ0ksSUFBSSxDQUNULElBQUlZLFFBQVEsQ0FBQztZQUNaUCxJQUFJLEVBQUVqRSxNQUFNLENBQUNpRSxJQUFJO1lBQ2pCL0MsUUFBUSxFQUFFLElBQUk7WUFDZHVELE1BQU0sRUFBRSxVQUFVQyxNQUFhLEVBQUU7Y0FDaEMsTUFBTUMsUUFBUSxHQUFHRCxNQUFNLENBQUNFLFNBQVMsRUFBYztjQUMvQyxNQUFNMUQsUUFBUSxHQUFHeUQsUUFBUSxDQUFDRSxXQUFXLEVBQUU7Y0FDdkM3RSxNQUFNLENBQUNrQixRQUFRLEdBQUdBLFFBQVE7WUFDM0I7VUFDRCxDQUFDLENBQUMsQ0FDRjtRQUNGO01BQ0QsQ0FBQyxDQUFDO0lBQ0g7RUFDRDtFQUVBLFNBQVM0RCw4QkFBOEIsQ0FDdENoQyxXQUE2QixFQUM3QmlDLHVCQUFvQyxFQUNwQ2hFLGVBQStCLEVBQy9CRixPQUF1QixFQUN0QjtJQUNELE1BQU07TUFDTGdCLHdCQUF3QjtNQUN4QmIsYUFBYTtNQUNiZ0UsYUFBYTtNQUNiQyxXQUFXO01BQ1huRCxjQUFjO01BQ2RrQiw0QkFBNEI7TUFDNUJSO0lBQ0QsQ0FBQyxHQUFHTSxXQUFXO0lBQ2YsTUFBTVgsY0FBYyxHQUFHNEMsdUJBQXVCLENBQUNyRSxNQUFNLEdBQUdzQyw0QkFBNEIsQ0FBQ3RDLE1BQU0sR0FBRzhCLGVBQWUsQ0FBQzlCLE1BQU07SUFDcEgsTUFBTXVDLG9CQUFvQixHQUFHcEIsd0JBQXdCLElBQUlDLGNBQWMsQ0FBQ3BCLE1BQU0sR0FBR3lCLGNBQWMsR0FBR2EsNEJBQTRCLENBQUN0QyxNQUFNLENBQUM7SUFFdEksSUFBSW1CLHdCQUF3QixLQUFLLENBQUMsSUFBSUEsd0JBQXdCLEtBQUtrRCx1QkFBdUIsQ0FBQ3JFLE1BQU0sRUFBRTtNQUNsRztNQUNBLE1BQU13RSxnQkFBZ0IsR0FBR0gsdUJBQXVCLENBQUMsQ0FBQyxDQUFDLENBQUNwRCxTQUFTLEVBQUU7TUFDL0QsTUFBTXdELE1BQU0sR0FBR0gsYUFBc0I7TUFDckMsTUFBTUksSUFBSSxHQUFHRCxNQUFNLElBQUtBLE1BQU0sQ0FBQ0UsU0FBUyxFQUFFLENBQWNDLG1CQUFtQixFQUFFO01BQzdFLElBQUlDLEdBQUc7TUFDUCxJQUFJQyxPQUFPLEdBQUcsRUFBRTtNQUNoQixJQUFJSixJQUFJLEVBQUU7UUFDVCxNQUFNSyxTQUFTLEdBQUdMLElBQUksR0FBR0YsZ0JBQWdCLENBQUNFLElBQUksQ0FBQyxHQUFHbkUsU0FBUztRQUMzRCxNQUFNeUUsWUFBWSxHQUFHVCxXQUFXLElBQUlBLFdBQVcsQ0FBQ1UsSUFBSSxHQUFHVCxnQkFBZ0IsQ0FBQ0QsV0FBVyxDQUFDVSxJQUFJLENBQUMsR0FBRzFFLFNBQVM7UUFDckcsSUFBSXdFLFNBQVMsRUFBRTtVQUNkLElBQUlDLFlBQVksSUFBSVQsV0FBVyxJQUFJRyxJQUFJLEtBQUtILFdBQVcsQ0FBQ1UsSUFBSSxFQUFFO1lBQzdESCxPQUFPLEdBQUcsQ0FBQ0MsU0FBUyxHQUFHLEdBQUcsRUFBRUMsWUFBWSxDQUFDO1VBQzFDLENBQUMsTUFBTTtZQUNORixPQUFPLEdBQUcsQ0FBQ0MsU0FBUyxFQUFFLEVBQUUsQ0FBQztVQUMxQjtVQUNBRixHQUFHLEdBQUdqRSxXQUFXLENBQUNDLGlCQUFpQixDQUNsQyxxREFBcUQsRUFDckRSLGVBQWUsRUFDZnlFLE9BQU8sRUFDUHhFLGFBQWEsQ0FDYjtRQUNGLENBQUMsTUFBTSxJQUFJeUUsU0FBUyxFQUFFO1VBQ3JCRCxPQUFPLEdBQUcsQ0FBQ0MsU0FBUyxFQUFFLEVBQUUsQ0FBQztVQUN6QkYsR0FBRyxHQUFHakUsV0FBVyxDQUFDQyxpQkFBaUIsQ0FDbEMscURBQXFELEVBQ3JEUixlQUFlLEVBQ2Z5RSxPQUFPLEVBQ1B4RSxhQUFhLENBQ2I7UUFDRixDQUFDLE1BQU07VUFDTnVFLEdBQUcsR0FBR2pFLFdBQVcsQ0FBQ0MsaUJBQWlCLENBQ2xDLCtEQUErRCxFQUMvRFIsZUFBZSxFQUNmRSxTQUFTLEVBQ1RELGFBQWEsQ0FDYjtRQUNGO01BQ0QsQ0FBQyxNQUFNO1FBQ051RSxHQUFHLEdBQUdqRSxXQUFXLENBQUNDLGlCQUFpQixDQUNsQywrREFBK0QsRUFDL0RSLGVBQWUsRUFDZkUsU0FBUyxFQUNURCxhQUFhLENBQ2I7TUFDRjtNQUNBSCxPQUFPLENBQUMrQyxJQUFJLENBQUM7UUFDWnRFLElBQUksRUFBRUosaUJBQWlCLENBQUNnQixpQkFBaUI7UUFDekNZLFFBQVEsRUFBRWlFLHVCQUF1QjtRQUNqQ2QsSUFBSSxFQUFFc0IsR0FBRztRQUNUckUsUUFBUSxFQUFFLElBQUk7UUFDZGlELE9BQU8sRUFBRWhGLDBCQUEwQixDQUFDbUY7TUFDckMsQ0FBQyxDQUFDO0lBQ0gsQ0FBQyxNQUFNLElBQ045QixlQUFlLENBQUM5QixNQUFNLEtBQUt5QixjQUFjLElBQ3pDTix3QkFBd0IsR0FBRyxDQUFDLEtBQzNCa0QsdUJBQXVCLENBQUNyRSxNQUFNLEdBQUcsQ0FBQyxJQUFLOEIsZUFBZSxDQUFDOUIsTUFBTSxHQUFHLENBQUMsSUFBSXNDLDRCQUE0QixDQUFDdEMsTUFBTSxHQUFHLENBQUUsQ0FBQyxFQUM5RztNQUNELElBQUltQix3QkFBd0IsR0FBR2tELHVCQUF1QixDQUFDckUsTUFBTSxJQUFJdUMsb0JBQW9CLEdBQUduQixjQUFjLENBQUNwQixNQUFNLEdBQUcsQ0FBQyxFQUFFO1FBQ2xIO1FBQ0EsSUFBSWtGLGtCQUFrQixHQUFHLEVBQUU7UUFDM0IsSUFBSXpELGNBQWMsS0FBSyxDQUFDLEVBQUU7VUFDekJ5RCxrQkFBa0IsR0FBR3RFLFdBQVcsQ0FBQ0MsaUJBQWlCLENBQ2pELDZFQUE2RSxFQUM3RVIsZUFBZSxFQUNmRSxTQUFTLEVBQ1RELGFBQWEsQ0FDYjtRQUNGLENBQUMsTUFBTTtVQUNONEUsa0JBQWtCLEdBQUd0RSxXQUFXLENBQUNDLGlCQUFpQixDQUNqRCwyRUFBMkUsRUFDM0VSLGVBQWUsRUFDZkUsU0FBUyxFQUNURCxhQUFhLENBQ2I7UUFDRjtRQUNBSCxPQUFPLENBQUNnRixPQUFPLENBQUM7VUFDZnZHLElBQUksRUFBRUosaUJBQWlCLENBQUNnQixpQkFBaUI7VUFDekNZLFFBQVEsRUFBRWlFLHVCQUF1QjtVQUNqQ2QsSUFBSSxFQUFFMkIsa0JBQWtCO1VBQ3hCMUUsUUFBUSxFQUFFLElBQUk7VUFDZGlELE9BQU8sRUFBRWhGLDBCQUEwQixDQUFDbUY7UUFDckMsQ0FBQyxDQUFDO01BQ0gsQ0FBQyxNQUFNO1FBQ047UUFDQSxNQUFNd0IsZUFBZSxHQUNwQjNELGNBQWMsS0FBSyxDQUFDLEdBQ2pCYixXQUFXLENBQUNDLGlCQUFpQixDQUM3QiwrREFBK0QsRUFDL0RSLGVBQWUsRUFDZkUsU0FBUyxFQUNURCxhQUFhLENBQ1osR0FDRE0sV0FBVyxDQUFDQyxpQkFBaUIsQ0FDN0IsNkRBQTZELEVBQzdEUixlQUFlLEVBQ2ZFLFNBQVMsRUFDVEQsYUFBYSxDQUNaO1FBQ0xILE9BQU8sQ0FBQytDLElBQUksQ0FBQztVQUNadEUsSUFBSSxFQUFFSixpQkFBaUIsQ0FBQ2dCLGlCQUFpQjtVQUN6Q1ksUUFBUSxFQUFFaUUsdUJBQXVCO1VBQ2pDZCxJQUFJLEVBQUU2QixlQUFlO1VBQ3JCNUUsUUFBUSxFQUFFLElBQUk7VUFDZGlELE9BQU8sRUFBRWhGLDBCQUEwQixDQUFDbUY7UUFDckMsQ0FBQyxDQUFDO01BQ0g7SUFDRDtFQUNEO0VBRUEsZUFBZXlCLG9CQUFvQixDQUNsQ2xGLE9BQXVCLEVBQ3ZCaUMsV0FBNkIsRUFDN0JrRCxjQUE4QixFQUM5QmpGLGVBQStCLEVBQy9Ca0YsWUFBMEIsRUFDMUJDLFlBQXFCLEVBQ3BCO0lBQ0QsSUFBSTtNQUNILE1BQU1wRixRQUFRLEdBQUdpRCxZQUFZLENBQUNiLDRCQUE0QixDQUFDLEVBQUUsRUFBRXJDLE9BQU8sQ0FBQztNQUN2RSxNQUFNO1FBQUVzRixvQkFBb0I7UUFBRW5CO01BQWMsQ0FBQyxHQUFHbEMsV0FBVztNQUMzRCxJQUFJcUQsb0JBQW9CLEVBQUU7UUFDekIsTUFBTUEsb0JBQW9CLENBQUM7VUFBRXJGLFFBQVEsRUFBRUE7UUFBUyxDQUFDLENBQUM7TUFDbkQ7TUFFQSxJQUFJQSxRQUFRLElBQUlBLFFBQVEsQ0FBQ0osTUFBTSxFQUFFO1FBQ2hDLElBQUk7VUFDSCxNQUFNMEYsT0FBTyxDQUFDQyxHQUFHLENBQ2hCdkYsUUFBUSxDQUFDUCxHQUFHLENBQUMsVUFBVWIsT0FBa0IsRUFBRTtZQUMxQyxJQUFJd0csWUFBWSxJQUFJLENBQUN4RyxPQUFPLENBQUNPLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFO2NBQzNEO2NBQ0EsTUFBTXFHLG9CQUFvQixHQUFHeEYsUUFBUSxDQUFDSixNQUFNLEtBQUssQ0FBQyxHQUFHLElBQUksR0FBRyxLQUFLO2NBQ2pFLE9BQU9ELEtBQUssQ0FBQzhGLFdBQVcsQ0FBQzdHLE9BQU8sRUFBRXVHLFlBQVksRUFBRUssb0JBQW9CLENBQUM7WUFDdEU7WUFDQSxPQUFPNUcsT0FBTyxDQUFDOEcsTUFBTSxFQUFFO1VBQ3hCLENBQUMsQ0FBQyxDQUNGO1VBQ0R6QyxZQUFZLENBQUNwRCxrQkFBa0IsQ0FBQ21DLFdBQVcsRUFBRWpDLE9BQU8sRUFBRUMsUUFBUSxFQUFFQyxlQUFlLENBQUM7UUFDakYsQ0FBQyxDQUFDLE9BQU8wRixLQUFLLEVBQUU7VUFDZixNQUFNVCxjQUFjLENBQUNVLGlCQUFpQixDQUFDO1lBQUV2QyxPQUFPLEVBQUVhO1VBQWMsQ0FBQyxDQUFDO1VBQ2xFO1VBQ0EsTUFBTXlCLEtBQUs7UUFDWjtNQUNEO0lBQ0QsQ0FBQyxDQUFDLE9BQU9FLE1BQU0sRUFBRTtNQUNoQixNQUFNWCxjQUFjLENBQUNZLFlBQVksRUFBRTtNQUNuQztNQUNBLE1BQU1ELE1BQU07SUFDYjtFQUNEOztFQUVBOztFQUVBO0FBQ0E7QUFDQTtBQUNBO0VBQ0EsZUFBZUUsbUNBQW1DLENBQUN4SCxvQkFBMEMsRUFBRUUsZ0JBQTJCLEVBQUU7SUFjM0gsTUFBTXVILFlBQVksR0FBR3ZILGdCQUFnQixDQUFDZ0IsR0FBRyxDQUFFYixPQUFPLElBQUs7TUFDdEQ7TUFDQSxNQUFNcUgsV0FBVyxHQUFHckgsT0FBTyxDQUFDc0gsUUFBUSxFQUFFLENBQUNDLFlBQVksRUFBRSxDQUFDQyxjQUFjLENBQUN4SCxPQUFPLENBQUN5SCxnQkFBZ0IsRUFBRSxDQUFDO01BQ2hHLE1BQU1DLGFBQWEsR0FBR0wsV0FBVyxDQUFDOUcsV0FBVyxDQUFDLCtEQUErRCxDQUFDO01BQzlHLE1BQU1vSCxlQUFlLEdBQ3BCLENBQUNELGFBQWEsSUFBSUwsV0FBVyxDQUFDOUcsV0FBVyxDQUFDLHlEQUF5RCxDQUFDLEtBQUssS0FBSztNQUMvRztNQUNBLE1BQU1xSCxJQUFpQixHQUFHO1FBQ3pCNUgsT0FBTyxFQUFFQSxPQUFPO1FBQ2hCNkgsV0FBVyxFQUFFLENBQUMsQ0FBQ1IsV0FBVyxDQUFDOUcsV0FBVyxDQUFDLDJDQUEyQyxDQUFDO1FBQ25GdUgsV0FBVyxFQUFFLENBQUMsQ0FBQ1QsV0FBVyxDQUFDOUcsV0FBVyxDQUFDLDJDQUEyQyxDQUFDO1FBQ25Gd0gsUUFBUSxFQUFFLElBQUk7UUFDZEMsU0FBUyxFQUFFLEtBQUs7UUFDaEJDLFFBQVEsRUFBRSxLQUFLO1FBQ2ZDLE1BQU0sRUFBRSxLQUFLO1FBQ2JDLFNBQVMsRUFBRVQsYUFBYSxHQUFHMUgsT0FBTyxDQUFDTyxXQUFXLENBQUNtSCxhQUFhLENBQUMsR0FBR0MsZUFBZTtRQUMvRVMsY0FBYyxFQUFFMUIsT0FBTyxDQUFDMkIsT0FBTyxDQUFDOUcsU0FBUyxDQUFDO1FBQzFDNEMsV0FBVyxFQUFFNUMsU0FBUztRQUN0QitHLGdCQUFnQixFQUFFO01BQ25CLENBQUM7TUFFRCxJQUFJVixJQUFJLENBQUNDLFdBQVcsRUFBRTtRQUFBO1FBQ3JCRCxJQUFJLENBQUNNLE1BQU0sR0FBRyxDQUFDLHdCQUFDbEksT0FBTyxDQUFDaUMsU0FBUyxDQUFDLHlCQUF5QixDQUFDLCtDQUE1QyxtQkFBOENzRyxlQUFlO1FBQzdFWCxJQUFJLENBQUNLLFFBQVEsR0FBR2pJLE9BQU8sQ0FBQ08sV0FBVyxDQUFDLGdCQUFnQixDQUFDO01BQ3REO01BQ0EsSUFBSXFILElBQUksQ0FBQ0MsV0FBVyxJQUFJRCxJQUFJLENBQUNFLFdBQVcsRUFBRTtRQUN6Q0YsSUFBSSxDQUFDRyxRQUFRLEdBQUcvSCxPQUFPLENBQUNPLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQztRQUNyRHFILElBQUksQ0FBQ0ksU0FBUyxHQUFHaEksT0FBTyxDQUFDTyxXQUFXLENBQUMsaUJBQWlCLENBQUM7UUFDdkQsSUFBSSxDQUFDcUgsSUFBSSxDQUFDRyxRQUFRLElBQUlILElBQUksQ0FBQ0ksU0FBUyxFQUFFO1VBQ3JDO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQUosSUFBSSxDQUFDUSxjQUFjLEdBQUdySCxLQUFLLENBQUN5SCx5QkFBeUIsQ0FBQ3hJLE9BQU8sRUFBRUEsT0FBTyxDQUFDLENBQUN5SSxJQUFJLENBQUMsTUFBT0Msa0JBQWtCLElBQUs7WUFDMUc7WUFDQTtZQUNBO1lBQ0E7WUFDQWQsSUFBSSxDQUFDekQsV0FBVyxHQUFHdUUsa0JBQWtCO1lBQ3JDLElBQUloQixhQUFhLEVBQUU7Y0FBQTtjQUNsQkUsSUFBSSxDQUFDVSxnQkFBZ0IsR0FBRyxPQUFNSSxrQkFBa0IsYUFBbEJBLGtCQUFrQixnREFBbEJBLGtCQUFrQixDQUFFdEUsYUFBYSwwREFBakMsc0JBQW1DdUUsZUFBZSxDQUFDakIsYUFBYSxDQUFDO1lBQ2hHLENBQUMsTUFBTTtjQUNORSxJQUFJLENBQUNVLGdCQUFnQixHQUFHWCxlQUFlO1lBQ3hDO1VBQ0QsQ0FBQyxDQUFDO1FBQ0g7TUFDRDtNQUNBLE9BQU9DLElBQUk7SUFDWixDQUFDLENBQUM7SUFDRjtJQUNBLE1BQU1sQixPQUFPLENBQUNDLEdBQUcsQ0FBQ1MsWUFBWSxDQUFDdkcsR0FBRyxDQUFFK0csSUFBSSxJQUFLQSxJQUFJLENBQUNRLGNBQWMsQ0FBQyxDQUFDO0lBRWxFLE1BQU1RLE9BQU8sR0FBRyxDQUNmO01BQ0NDLEdBQUcsRUFBRSwyQkFBMkI7TUFDaEM7TUFDQTtNQUNBQyxLQUFLLEVBQUUxQixZQUFZLENBQUMyQixNQUFNLENBQUVuQixJQUFJLElBQUtBLElBQUksQ0FBQ0MsV0FBVyxJQUFJLENBQUNELElBQUksQ0FBQ0csUUFBUSxJQUFJSCxJQUFJLENBQUNJLFNBQVMsSUFBSUosSUFBSSxDQUFDVSxnQkFBZ0I7SUFDbkgsQ0FBQyxFQUNEO01BQ0NPLEdBQUcsRUFBRSw4QkFBOEI7TUFDbkNDLEtBQUssRUFBRTFCLFlBQVksQ0FBQzJCLE1BQU0sQ0FBRW5CLElBQUksSUFBSyxDQUFDQSxJQUFJLENBQUNHLFFBQVEsSUFBSUgsSUFBSSxDQUFDSSxTQUFTLElBQUksQ0FBQ0osSUFBSSxDQUFDVSxnQkFBZ0I7SUFDaEcsQ0FBQyxFQUNEO01BQUVPLEdBQUcsRUFBRSxnQkFBZ0I7TUFBRUMsS0FBSyxFQUFFMUIsWUFBWSxDQUFDMkIsTUFBTSxDQUFFbkIsSUFBSSxJQUFLQSxJQUFJLENBQUNDLFdBQVcsSUFBSUQsSUFBSSxDQUFDRyxRQUFRLElBQUlILElBQUksQ0FBQ0ssUUFBUSxJQUFJTCxJQUFJLENBQUNNLE1BQU07SUFBRSxDQUFDLEVBQ2xJO01BQ0NXLEdBQUcsRUFBRSxpQkFBaUI7TUFDdEJDLEtBQUssRUFBRTFCLFlBQVksQ0FBQzJCLE1BQU0sQ0FBRW5CLElBQUksSUFBS0EsSUFBSSxDQUFDQyxXQUFXLElBQUlELElBQUksQ0FBQ0csUUFBUSxJQUFJSCxJQUFJLENBQUNLLFFBQVEsSUFBSSxDQUFDTCxJQUFJLENBQUNNLE1BQU07SUFDeEcsQ0FBQztJQUNEO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtNQUNDVyxHQUFHLEVBQUUsbUJBQW1CO01BQ3hCQyxLQUFLLEVBQUUxQixZQUFZLENBQUMyQixNQUFNLENBQ3hCbkIsSUFBSSxJQUNILENBQUNBLElBQUksQ0FBQ0MsV0FBVyxJQUFJLENBQUNELElBQUksQ0FBQ0UsV0FBVyxJQUFJRixJQUFJLENBQUNPLFNBQVMsSUFDeERQLElBQUksQ0FBQ0MsV0FBVyxJQUFJRCxJQUFJLENBQUNHLFFBQVEsSUFBSSxDQUFDSCxJQUFJLENBQUNLLFFBQVEsSUFBSUwsSUFBSSxDQUFDTyxTQUFVLElBQ3RFUCxJQUFJLENBQUNDLFdBQVcsSUFBSSxDQUFDRCxJQUFJLENBQUNHLFFBQVEsSUFBSSxDQUFDSCxJQUFJLENBQUNJLFNBQVUsSUFDdERKLElBQUksQ0FBQ0UsV0FBVyxJQUFJLENBQUNGLElBQUksQ0FBQ0csUUFBUSxJQUFJLENBQUNILElBQUksQ0FBQ0ksU0FBVSxJQUN0REosSUFBSSxDQUFDRSxXQUFXLElBQUksQ0FBQ0YsSUFBSSxDQUFDRyxRQUFRLElBQUlILElBQUksQ0FBQ0ksU0FBUyxJQUFJSixJQUFJLENBQUNVLGdCQUFpQjtJQUVsRixDQUFDLENBQ0Q7SUFFRCxLQUFLLE1BQU07TUFBRU8sR0FBRztNQUFFQztJQUFNLENBQUMsSUFBSUYsT0FBTyxFQUFFO01BQ3JDakosb0JBQW9CLENBQUNTLFdBQVcsQ0FDL0J5SSxHQUFHO01BQ0g7TUFDQTtNQUNBO01BQ0E7TUFDQUMsS0FBSyxDQUFDakksR0FBRyxDQUFFK0csSUFBSSxJQUNkaUIsR0FBRyxLQUFLLDJCQUEyQixHQUFHO1FBQUU5SCxLQUFLLEVBQUU2RyxJQUFJLENBQUM1SCxPQUFPO1FBQUVtRSxXQUFXLEVBQUV5RCxJQUFJLENBQUN6RDtNQUFZLENBQUMsR0FBR3lELElBQUksQ0FBQzVILE9BQU8sQ0FDM0csQ0FDRDtJQUNGO0VBQ0Q7RUFFQSxNQUFNcUUsWUFBWSxHQUFHO0lBQ3BCbEIsbUJBQW1CO0lBQ25Ca0Qsb0JBQW9CO0lBQ3BCakIsOEJBQThCO0lBQzlCUCw0QkFBNEI7SUFDNUJqQixtQ0FBbUM7SUFDbkNKLDRCQUE0QjtJQUM1QnRCLG9CQUFvQjtJQUNwQlcsc0JBQXNCO0lBQ3RCTixrQ0FBa0M7SUFDbEN0QixrQkFBa0I7SUFFbEJrRztFQUNELENBQUM7RUFBQyxPQUVhOUMsWUFBWTtBQUFBIn0=
557
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJEZWxldGVPcHRpb25UeXBlcyIsIkRlbGV0ZURpYWxvZ0NvbnRlbnRDb250cm9sIiwiZ2V0VXBkYXRlZFNlbGVjdGlvbnMiLCJpbnRlcm5hbE1vZGVsQ29udGV4dCIsInR5cGUiLCJzZWxlY3RlZENvbnRleHRzIiwiY29udGV4dHNUb1JlbW92ZSIsImZvckVhY2giLCJjb250ZXh0IiwiaWR4IiwiaW5kZXhPZiIsInNwbGljZSIsInNldFByb3BlcnR5IiwiY2xlYXJTZWxlY3RlZENvbnRleHRzRm9yT3B0aW9uIiwib3B0aW9uIiwiZ2V0UHJvcGVydHkiLCJkZWxldGFibGVDb250ZXh0cyIsImNyZWF0ZU1vZGVDb250ZXh0cyIsImRyYWZ0U2libGluZ1BhaXJzIiwiZHJhZnRzV2l0aERlbGV0YWJsZUFjdGl2ZSIsImRyYWZ0cyIsIm1hcCIsImNvbnRleHRQYWlyIiwiZHJhZnQiLCJsZW5ndGgiLCJhZnRlckRlbGV0ZVByb2Nlc3MiLCJwYXJhbWV0ZXJzIiwib3B0aW9ucyIsImNvbnRleHRzIiwicmVzb3VyY2VNb2RlbCIsImVudGl0eVNldE5hbWUiLCJ1bmRlZmluZWQiLCJzZWxlY3RlZCIsInNvbWUiLCJNZXNzYWdlVG9hc3QiLCJzaG93IiwiZ2V0VGV4dCIsImdldExvY2tlZENvbnRleHRVc2VyIiwibG9ja2VkQ29udGV4dCIsImRyYWZ0QWRtaW5EYXRhIiwiZ2V0T2JqZWN0IiwiZ2V0TG9ja2VkT2JqZWN0c1RleHQiLCJudW1iZXJPZlNlbGVjdGVkQ29udGV4dHMiLCJsb2NrZWRDb250ZXh0cyIsInJldFR4dCIsImxvY2tlZFVzZXIiLCJnZXROb25EZWxldGFibGVBY3RpdmVzT2ZEcmFmdHNUZXh0IiwibnVtYmVyT2ZEcmFmdHMiLCJ0b3RhbERlbGV0YWJsZSIsImdldFVuU2F2ZWRDb250ZXh0VXNlciIsInVuU2F2ZWRDb250ZXh0Iiwic0xhc3RDaGFuZ2VkQnlVc2VyIiwiZ2V0VW5zYXZlZENvbnRleHRzVGV4dCIsInVuU2F2ZWRDb250ZXh0cyIsImluZm9UeHQiLCJvcHRpb25UeHQiLCJvcHRpb25XaXRob3V0VHh0IiwibGFzdENoYW5nZWRCeVVzZXIiLCJnZXROb25EZWxldGFibGVUZXh0IiwibVBhcmFtZXRlcnMiLCJ0b3RhbE51bURlbGV0YWJsZUNvbnRleHRzIiwiZHJhZnRzV2l0aE5vbkRlbGV0YWJsZUFjdGl2ZSIsIm5vbkRlbGV0YWJsZUNvbnRleHRzIiwiVGV4dCIsInRleHQiLCJnZXRDb25maXJtZWREZWxldGFibGVDb250ZXh0IiwicmVkdWNlIiwicmVzdWx0IiwiZHJhZnRzVG9EZWxldGVCZWZvcmVBY3RpdmUiLCJjb25jYXQiLCJnZXREcmFmdHNUb0RlbGV0ZUJlZm9yZUFjdGl2ZSIsInVwZGF0ZURyYWZ0T3B0aW9uc0ZvckRlbGV0YWJsZVRleHRzIiwidkNvbnRleHRzIiwiaXRlbXMiLCJsb2NrZWRDb250ZXh0c1R4dCIsImRlbGV0YWJsZURyYWZ0SW5mbyIsInB1c2giLCJzaWJsaW5nSW5mbyIsInRhcmdldENvbnRleHQiLCJkZWxldGVIZWxwZXIiLCJub25EZWxldGFibGVFeGlzdHMiLCJub25EZWxldGFibGVUZXh0Q3RybCIsInVuc2F2ZWRDaGFuZ2VzVHh0cyIsImNvbnRyb2wiLCJDSEVDS0JPWCIsIm5vbkRlbGV0YWJsZUFjdGl2ZXNPZkRyYWZ0c1RleHQiLCJURVhUIiwidXBkYXRlQ29udGVudEZvckRlbGV0ZURpYWxvZyIsIkNoZWNrQm94Iiwic2VsZWN0Iiwib0V2ZW50IiwiY2hlY2tCb3giLCJnZXRTb3VyY2UiLCJnZXRTZWxlY3RlZCIsInVwZGF0ZU9wdGlvbnNGb3JEZWxldGFibGVUZXh0cyIsImRpcmVjdERlbGV0YWJsZUNvbnRleHRzIiwicGFyZW50Q29udHJvbCIsImRlc2NyaXB0aW9uIiwib0xpbmVDb250ZXh0RGF0YSIsIm9UYWJsZSIsInNLZXkiLCJnZXRQYXJlbnQiLCJnZXRJZGVudGlmaWVyQ29sdW1uIiwidHh0IiwiYVBhcmFtcyIsInNLZXlWYWx1ZSIsInNEZXNjcmlwdGlvbiIsInBhdGgiLCJkZWxldGFibGVPcHRpb25UeHQiLCJ1bnNoaWZ0IiwiYWxsRGVsZXRhYmxlVHh0IiwiZGVsZXRlQ29uZmlybUhhbmRsZXIiLCJtZXNzYWdlSGFuZGxlciIsImFwcENvbXBvbmVudCIsImRyYWZ0RW5hYmxlZCIsImJlZm9yZURlbGV0ZUNhbGxCYWNrIiwiZW5hYmxlU3RyaWN0SGFuZGxpbmciLCJkcmFmdEVycm9ycyIsIlByb21pc2UiLCJhbGxTZXR0bGVkIiwiZGVsZXRlRHJhZnQiLCJlIiwiTG9nIiwiZXJyb3IiLCJnZXRQYXRoIiwiYWxsIiwiZGVsZXRlIiwiRXJyb3IiLCJzaG93TWVzc2FnZURpYWxvZyIsIm9FcnJvciIsInNob3dNZXNzYWdlcyIsInVwZGF0ZURlbGV0ZUluZm9Gb3JTZWxlY3RlZENvbnRleHRzIiwiY29udGV4dEluZm9zIiwibWV0YUNvbnRleHQiLCJnZXRNb2RlbCIsImdldE1ldGFNb2RlbCIsImdldE1ldGFDb250ZXh0IiwiZ2V0Q2Fub25pY2FsUGF0aCIsImRlbGV0YWJsZVBhdGgiLCJzdGF0aWNEZWxldGFibGUiLCJpbmZvIiwiaXNEcmFmdFJvb3QiLCJpc0RyYWZ0Tm9kZSIsImlzQWN0aXZlIiwiaGFzQWN0aXZlIiwiaGFzRHJhZnQiLCJsb2NrZWQiLCJkZWxldGFibGUiLCJzaWJsaW5nUHJvbWlzZSIsInJlc29sdmUiLCJzaWJsaW5nRGVsZXRhYmxlIiwiSW5Qcm9jZXNzQnlVc2VyIiwiY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbiIsInRoZW4iLCJzaWJsaW5nSW5mb3JtYXRpb24iLCJyZXF1ZXN0UHJvcGVydHkiLCJidWNrZXRzIiwia2V5IiwidmFsdWUiLCJmaWx0ZXIiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIkRlbGV0ZUhlbHBlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCBBcHBDb21wb25lbnQgZnJvbSBcInNhcC9mZS9jb3JlL0FwcENvbXBvbmVudFwiO1xuaW1wb3J0IGRyYWZ0LCB7IFNpYmxpbmdJbmZvcm1hdGlvbiB9IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9lZGl0Rmxvdy9kcmFmdFwiO1xuaW1wb3J0IHR5cGUgTWVzc2FnZUhhbmRsZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL01lc3NhZ2VIYW5kbGVyXCI7XG5pbXBvcnQgQ2hlY2tCb3ggZnJvbSBcInNhcC9tL0NoZWNrQm94XCI7XG5pbXBvcnQgTWVzc2FnZVRvYXN0IGZyb20gXCJzYXAvbS9NZXNzYWdlVG9hc3RcIjtcbmltcG9ydCBUZXh0IGZyb20gXCJzYXAvbS9UZXh0XCI7XG5cbmltcG9ydCBSZXNvdXJjZU1vZGVsIGZyb20gXCJzYXAvZmUvY29yZS9SZXNvdXJjZU1vZGVsXCI7XG5pbXBvcnQgVGFibGVBUEkgZnJvbSBcInNhcC9mZS9tYWNyb3MvdGFibGUvVGFibGVBUElcIjtcbmltcG9ydCBFdmVudCBmcm9tIFwic2FwL3VpL2Jhc2UvRXZlbnRcIjtcbmltcG9ydCBDb250cm9sIGZyb20gXCJzYXAvdWkvY29yZS9Db250cm9sXCI7XG5pbXBvcnQgVGFibGUgZnJvbSBcInNhcC91aS9tZGMvVGFibGVcIjtcbmltcG9ydCBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQ29udGV4dFwiO1xuaW1wb3J0IHsgSW50ZXJuYWxNb2RlbENvbnRleHQgfSBmcm9tIFwiLi9Nb2RlbEhlbHBlclwiO1xuXG5leHBvcnQgZW51bSBEZWxldGVPcHRpb25UeXBlcyB7XG5cdGRlbGV0YWJsZUNvbnRleHRzID0gXCJkZWxldGFibGVDb250ZXh0c1wiLFxuXHRkcmFmdHNXaXRoRGVsZXRhYmxlQWN0aXZlID0gXCJkcmFmdHNXaXRoRGVsZXRhYmxlQWN0aXZlXCIsXG5cdGNyZWF0ZU1vZGVDb250ZXh0cyA9IFwiY3JlYXRlTW9kZUNvbnRleHRzXCIsXG5cdHVuU2F2ZWRDb250ZXh0cyA9IFwidW5TYXZlZENvbnRleHRzXCIsXG5cdGRyYWZ0c1dpdGhOb25EZWxldGFibGVBY3RpdmUgPSBcImRyYWZ0c1dpdGhOb25EZWxldGFibGVBY3RpdmVcIixcblx0ZHJhZnRzVG9EZWxldGVCZWZvcmVBY3RpdmUgPSBcImRyYWZ0c1RvRGVsZXRlQmVmb3JlQWN0aXZlXCJcbn1cblxuZXhwb3J0IGVudW0gRGVsZXRlRGlhbG9nQ29udGVudENvbnRyb2wge1xuXHRDSEVDS0JPWCA9IFwiY2hlY2tCb3hcIixcblx0VEVYVCA9IFwidGV4dFwiXG59XG5cbmV4cG9ydCB0eXBlIERyYWZ0U2libGluZ1BhaXIgPSB7XG5cdGRyYWZ0OiBDb250ZXh0O1xuXHRzaWJsaW5nSW5mbzogU2libGluZ0luZm9ybWF0aW9uO1xufTtcblxuZXhwb3J0IHR5cGUgRGVsZXRlT3B0aW9uID0ge1xuXHR0eXBlOiBEZWxldGVPcHRpb25UeXBlcztcblx0Y29udGV4dHM6IENvbnRleHRbXTtcblx0c2VsZWN0ZWQ6IGJvb2xlYW47XG5cdHRleHQ/OiBzdHJpbmc7XG5cdGNvbnRyb2w/OiBEZWxldGVEaWFsb2dDb250ZW50Q29udHJvbDtcbn07XG5cbmV4cG9ydCB0eXBlIE1vZGVsT2JqZWN0UHJvcGVydGllcyA9IHtcblx0ZGVsZXRhYmxlQ29udGV4dHM6IENvbnRleHRbXTtcblx0dW5TYXZlZENvbnRleHRzOiBDb250ZXh0W107XG5cdGNyZWF0ZU1vZGVDb250ZXh0czogQ29udGV4dFtdO1xuXHRkcmFmdHNXaXRoTm9uRGVsZXRhYmxlQWN0aXZlOiBDb250ZXh0W107XG5cdGxvY2tlZENvbnRleHRzOiBDb250ZXh0W107XG5cdGRyYWZ0c1dpdGhEZWxldGFibGVBY3RpdmU6IERyYWZ0U2libGluZ1BhaXJbXTtcblx0ZGVsZXRlRW5hYmxlZDogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCB0eXBlIERyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhVHlwZSA9IHtcblx0RHJhZnRVVUlEOiBzdHJpbmc7XG5cdEluUHJvY2Vzc0J5VXNlcj86IHN0cmluZztcblx0SW5Qcm9jZXNzQnlVc2VyRGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cdENyZWF0ZWRCeVVzZXJEZXNjcmlwdGlvbj86IHN0cmluZztcblx0Q3JlYXRlZEJ5VXNlcj86IHN0cmluZztcblx0TGFzdENoYW5nZWRCeVVzZXJEZXNjcmlwdGlvbj86IHN0cmluZztcblx0TGFzdENoYW5nZWRCeVVzZXI/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBEZWxldGVQYXJhbWV0ZXJzID0ge1xuXHRpbnRlcm5hbE1vZGVsQ29udGV4dDogSW50ZXJuYWxNb2RlbENvbnRleHQ7XG5cdG51bWJlck9mU2VsZWN0ZWRDb250ZXh0czogbnVtYmVyO1xuXHRlbnRpdHlTZXROYW1lOiBzdHJpbmc7XG5cdHBhcmVudENvbnRyb2w6IENvbnRyb2w7XG5cdGRlc2NyaXB0aW9uOiB7IHBhdGg6IHN0cmluZyB9O1xuXHRiZWZvcmVEZWxldGVDYWxsQmFjazogRnVuY3Rpb247XG5cdGRlbGV0YWJsZUNvbnRleHRzOiBDb250ZXh0W107XG5cdHVuU2F2ZWRDb250ZXh0czogQ29udGV4dFtdO1xuXHRjcmVhdGVNb2RlQ29udGV4dHM6IENvbnRleHRbXTtcblx0ZHJhZnRzV2l0aE5vbkRlbGV0YWJsZUFjdGl2ZTogQ29udGV4dFtdO1xuXHRsb2NrZWRDb250ZXh0czogQ29udGV4dFtdO1xuXHRkcmFmdHNXaXRoRGVsZXRhYmxlQWN0aXZlOiBEcmFmdFNpYmxpbmdQYWlyW107XG59O1xuXG5leHBvcnQgdHlwZSBEZWxldGVUZXh0SW5mbyA9IHtcblx0aW5mb1R4dD86IHN0cmluZztcblx0b3B0aW9uVHh0Pzogc3RyaW5nO1xuXHRvcHRpb25XaXRob3V0VHh0PzogYm9vbGVhbjtcbn07XG5cbmZ1bmN0aW9uIGdldFVwZGF0ZWRTZWxlY3Rpb25zKFxuXHRpbnRlcm5hbE1vZGVsQ29udGV4dDogSW50ZXJuYWxNb2RlbENvbnRleHQsXG5cdHR5cGU6IERlbGV0ZU9wdGlvblR5cGVzLFxuXHRzZWxlY3RlZENvbnRleHRzOiBDb250ZXh0W10sXG5cdGNvbnRleHRzVG9SZW1vdmU6IENvbnRleHRbXVxuKTogQ29udGV4dFtdIHtcblx0Y29udGV4dHNUb1JlbW92ZS5mb3JFYWNoKChjb250ZXh0OiBDb250ZXh0KSA9PiB7XG5cdFx0Y29uc3QgaWR4ID0gc2VsZWN0ZWRDb250ZXh0cy5pbmRleE9mKGNvbnRleHQpO1xuXHRcdGlmIChpZHggIT09IC0xKSB7XG5cdFx0XHRzZWxlY3RlZENvbnRleHRzLnNwbGljZShpZHgsIDEpO1xuXHRcdH1cblx0fSk7XG5cdGludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KHR5cGUsIFtdKTtcblxuXHRyZXR1cm4gWy4uLnNlbGVjdGVkQ29udGV4dHNdO1xufVxuXG5mdW5jdGlvbiBjbGVhclNlbGVjdGVkQ29udGV4dHNGb3JPcHRpb24oaW50ZXJuYWxNb2RlbENvbnRleHQ6IEludGVybmFsTW9kZWxDb250ZXh0LCBvcHRpb246IERlbGV0ZU9wdGlvbikge1xuXHRsZXQgc2VsZWN0ZWRDb250ZXh0cyA9IChpbnRlcm5hbE1vZGVsQ29udGV4dC5nZXRQcm9wZXJ0eShcInNlbGVjdGVkQ29udGV4dHNcIikgYXMgQ29udGV4dFtdKSB8fCBbXTtcblxuXHRpZiAob3B0aW9uLnR5cGUgPT09IERlbGV0ZU9wdGlvblR5cGVzLmRlbGV0YWJsZUNvbnRleHRzKSB7XG5cdFx0c2VsZWN0ZWRDb250ZXh0cyA9IGdldFVwZGF0ZWRTZWxlY3Rpb25zKFxuXHRcdFx0aW50ZXJuYWxNb2RlbENvbnRleHQsXG5cdFx0XHREZWxldGVPcHRpb25UeXBlcy5kZWxldGFibGVDb250ZXh0cyxcblx0XHRcdHNlbGVjdGVkQ29udGV4dHMsXG5cdFx0XHRpbnRlcm5hbE1vZGVsQ29udGV4dC5nZXRQcm9wZXJ0eShEZWxldGVPcHRpb25UeXBlcy5kZWxldGFibGVDb250ZXh0cykgfHwgW11cblx0XHQpO1xuXHRcdHNlbGVjdGVkQ29udGV4dHMgPSBnZXRVcGRhdGVkU2VsZWN0aW9ucyhcblx0XHRcdGludGVybmFsTW9kZWxDb250ZXh0LFxuXHRcdFx0RGVsZXRlT3B0aW9uVHlwZXMuY3JlYXRlTW9kZUNvbnRleHRzLFxuXHRcdFx0c2VsZWN0ZWRDb250ZXh0cyxcblx0XHRcdGludGVybmFsTW9kZWxDb250ZXh0LmdldFByb3BlcnR5KERlbGV0ZU9wdGlvblR5cGVzLmNyZWF0ZU1vZGVDb250ZXh0cykgfHwgW11cblx0XHQpO1xuXG5cdFx0Y29uc3QgZHJhZnRTaWJsaW5nUGFpcnMgPSBpbnRlcm5hbE1vZGVsQ29udGV4dC5nZXRQcm9wZXJ0eShEZWxldGVPcHRpb25UeXBlcy5kcmFmdHNXaXRoRGVsZXRhYmxlQWN0aXZlKSB8fCBbXTtcblx0XHRjb25zdCBkcmFmdHMgPSBkcmFmdFNpYmxpbmdQYWlycy5tYXAoKGNvbnRleHRQYWlyOiBEcmFmdFNpYmxpbmdQYWlyKSA9PiB7XG5cdFx0XHRyZXR1cm4gY29udGV4dFBhaXIuZHJhZnQ7XG5cdFx0fSk7XG5cdFx0c2VsZWN0ZWRDb250ZXh0cyA9IGdldFVwZGF0ZWRTZWxlY3Rpb25zKFxuXHRcdFx0aW50ZXJuYWxNb2RlbENvbnRleHQsXG5cdFx0XHREZWxldGVPcHRpb25UeXBlcy5kcmFmdHNXaXRoRGVsZXRhYmxlQWN0aXZlLFxuXHRcdFx0c2VsZWN0ZWRDb250ZXh0cyxcblx0XHRcdGRyYWZ0c1xuXHRcdCk7XG5cdH0gZWxzZSB7XG5cdFx0Y29uc3QgY29udGV4dHNUb1JlbW92ZSA9IGludGVybmFsTW9kZWxDb250ZXh0LmdldFByb3BlcnR5KG9wdGlvbi50eXBlKSB8fCBbXTtcblx0XHRzZWxlY3RlZENvbnRleHRzID0gZ2V0VXBkYXRlZFNlbGVjdGlvbnMoaW50ZXJuYWxNb2RlbENvbnRleHQsIG9wdGlvbi50eXBlLCBzZWxlY3RlZENvbnRleHRzLCBjb250ZXh0c1RvUmVtb3ZlKTtcblx0fVxuXHRpbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcInNlbGVjdGVkQ29udGV4dHNcIiwgc2VsZWN0ZWRDb250ZXh0cyk7XG5cdGludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwibnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzXCIsIHNlbGVjdGVkQ29udGV4dHMubGVuZ3RoKTtcbn1cblxuZnVuY3Rpb24gYWZ0ZXJEZWxldGVQcm9jZXNzKHBhcmFtZXRlcnM6IERlbGV0ZVBhcmFtZXRlcnMsIG9wdGlvbnM6IERlbGV0ZU9wdGlvbltdLCBjb250ZXh0czogQ29udGV4dFtdLCByZXNvdXJjZU1vZGVsOiBSZXNvdXJjZU1vZGVsKSB7XG5cdGNvbnN0IHsgaW50ZXJuYWxNb2RlbENvbnRleHQsIGVudGl0eVNldE5hbWUgfSA9IHBhcmFtZXRlcnM7XG5cdGlmIChpbnRlcm5hbE1vZGVsQ29udGV4dCkge1xuXHRcdGlmIChpbnRlcm5hbE1vZGVsQ29udGV4dC5nZXRQcm9wZXJ0eShcImRlbGV0ZUVuYWJsZWRcIikgIT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRvcHRpb25zLmZvckVhY2goKG9wdGlvbikgPT4ge1xuXHRcdFx0XHQvLyBpZiBhbiBvcHRpb24gaXMgc2VsZWN0ZWQsIHRoZW4gaXQgaXMgZGVsZXRlZC4gU28sIHdlIG5lZWQgdG8gcmVtb3ZlIHRoZW0gZnJvbSBzZWxlY3RlZCBjb250ZXh0cy5cblx0XHRcdFx0aWYgKG9wdGlvbi5zZWxlY3RlZCkge1xuXHRcdFx0XHRcdGNsZWFyU2VsZWN0ZWRDb250ZXh0c0Zvck9wdGlvbihpbnRlcm5hbE1vZGVsQ29udGV4dCwgb3B0aW9uKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdC8vIGlmIGF0bGVhc3Qgb25lIG9mIHRoZSBvcHRpb25zIGlzIG5vdCBzZWxlY3RlZCwgdGhlbiB0aGUgZGVsZXRlIGJ1dHRvbiBuZWVkcyB0byBiZSBlbmFibGVkLlxuXHRcdGludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFxuXHRcdFx0XCJkZWxldGVFbmFibGVkXCIsXG5cdFx0XHRvcHRpb25zLnNvbWUoKG9wdGlvbikgPT4gIW9wdGlvbi5zZWxlY3RlZClcblx0XHQpO1xuXHR9XG5cblx0aWYgKGNvbnRleHRzLmxlbmd0aCA9PT0gMSkge1xuXHRcdE1lc3NhZ2VUb2FzdC5zaG93KHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0RFTEVURV9UT0FTVF9TSU5HVUxBUlwiLCB1bmRlZmluZWQsIGVudGl0eVNldE5hbWUpKTtcblx0fSBlbHNlIHtcblx0XHRNZXNzYWdlVG9hc3Quc2hvdyhyZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9ERUxFVEVfVE9BU1RfUExVUkFMXCIsIHVuZGVmaW5lZCwgZW50aXR5U2V0TmFtZSkpO1xuXHR9XG59XG5cbmZ1bmN0aW9uIGdldExvY2tlZENvbnRleHRVc2VyKGxvY2tlZENvbnRleHQ6IENvbnRleHQpOiBzdHJpbmcge1xuXHRjb25zdCBkcmFmdEFkbWluRGF0YSA9IGxvY2tlZENvbnRleHQuZ2V0T2JqZWN0KClbXCJEcmFmdEFkbWluaXN0cmF0aXZlRGF0YVwiXSBhcyBEcmFmdEFkbWluaXN0cmF0aXZlRGF0YVR5cGU7XG5cdHJldHVybiAoZHJhZnRBZG1pbkRhdGEgJiYgZHJhZnRBZG1pbkRhdGFbXCJJblByb2Nlc3NCeVVzZXJcIl0pIHx8IFwiXCI7XG59XG5cbmZ1bmN0aW9uIGdldExvY2tlZE9iamVjdHNUZXh0KHJlc291cmNlTW9kZWw6IFJlc291cmNlTW9kZWwsIG51bWJlck9mU2VsZWN0ZWRDb250ZXh0czogbnVtYmVyLCBsb2NrZWRDb250ZXh0czogQ29udGV4dFtdKTogc3RyaW5nIHtcblx0bGV0IHJldFR4dCA9IFwiXCI7XG5cblx0aWYgKG51bWJlck9mU2VsZWN0ZWRDb250ZXh0cyA9PT0gMSAmJiBsb2NrZWRDb250ZXh0cy5sZW5ndGggPT09IDEpIHtcblx0XHQvL29ubHkgb25lIHVuc2F2ZWQgb2JqZWN0XG5cdFx0Y29uc3QgbG9ja2VkVXNlciA9IGdldExvY2tlZENvbnRleHRVc2VyKGxvY2tlZENvbnRleHRzWzBdKTtcblx0XHRyZXRUeHQgPSByZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9DT05GSVJNX0RFTEVURV9XSVRIX1NJTkdMRV9PQkpFQ1RfTE9DS0VEXCIsIFtsb2NrZWRVc2VyXSk7XG5cdH0gZWxzZSBpZiAobG9ja2VkQ29udGV4dHMubGVuZ3RoID09IDEpIHtcblx0XHRjb25zdCBsb2NrZWRVc2VyID0gZ2V0TG9ja2VkQ29udGV4dFVzZXIobG9ja2VkQ29udGV4dHNbMF0pO1xuXHRcdHJldFR4dCA9IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0NPTkZJUk1fREVMRVRFX1dJVEhfT0JKRUNUSU5GT19BTkRfT05FX09CSkVDVF9MT0NLRURcIiwgW1xuXHRcdFx0bnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzLFxuXHRcdFx0bG9ja2VkVXNlclxuXHRcdF0pO1xuXHR9IGVsc2UgaWYgKGxvY2tlZENvbnRleHRzLmxlbmd0aCA+IDEpIHtcblx0XHRyZXRUeHQgPSByZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9DT05GSVJNX0RFTEVURV9XSVRIX09CSkVDVElORk9fQU5EX0ZFV19PQkpFQ1RTX0xPQ0tFRFwiLCBbXG5cdFx0XHRsb2NrZWRDb250ZXh0cy5sZW5ndGgsXG5cdFx0XHRudW1iZXJPZlNlbGVjdGVkQ29udGV4dHNcblx0XHRdKTtcblx0fVxuXG5cdHJldHVybiByZXRUeHQ7XG59XG5cbmZ1bmN0aW9uIGdldE5vbkRlbGV0YWJsZUFjdGl2ZXNPZkRyYWZ0c1RleHQocmVzb3VyY2VNb2RlbDogUmVzb3VyY2VNb2RlbCwgbnVtYmVyT2ZEcmFmdHM6IG51bWJlciwgdG90YWxEZWxldGFibGU6IG51bWJlcik6IHN0cmluZyB7XG5cdGxldCByZXRUeHQgPSBcIlwiO1xuXG5cdGlmICh0b3RhbERlbGV0YWJsZSA9PT0gbnVtYmVyT2ZEcmFmdHMpIHtcblx0XHRpZiAobnVtYmVyT2ZEcmFmdHMgPT09IDEpIHtcblx0XHRcdHJldFR4dCA9IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0NPTkZJUk1fREVMRVRFX09OTFlfRFJBRlRfT0ZfTk9OX0RFTEVUQUJMRV9BQ1RJVkVcIik7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldFR4dCA9IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0NPTkZJUk1fREVMRVRFX09OTFlfRFJBRlRTX09GX05PTl9ERUxFVEFCTEVfQUNUSVZFXCIpO1xuXHRcdH1cblx0fSBlbHNlIGlmIChudW1iZXJPZkRyYWZ0cyA9PT0gMSkge1xuXHRcdHJldFR4dCA9IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0NPTkZJUk1fREVMRVRFX0RSQUZUX09GX05PTl9ERUxFVEFCTEVfQUNUSVZFXCIpO1xuXHR9IGVsc2Uge1xuXHRcdHJldFR4dCA9IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0NPTkZJUk1fREVMRVRFX0RSQUZUU19PRl9OT05fREVMRVRBQkxFX0FDVElWRVwiKTtcblx0fVxuXG5cdHJldHVybiByZXRUeHQ7XG59XG5cbmZ1bmN0aW9uIGdldFVuU2F2ZWRDb250ZXh0VXNlcih1blNhdmVkQ29udGV4dDogQ29udGV4dCk6IHN0cmluZyB7XG5cdGNvbnN0IGRyYWZ0QWRtaW5EYXRhID0gdW5TYXZlZENvbnRleHQuZ2V0T2JqZWN0KClbXCJEcmFmdEFkbWluaXN0cmF0aXZlRGF0YVwiXSBhcyBEcmFmdEFkbWluaXN0cmF0aXZlRGF0YVR5cGU7XG5cdGxldCBzTGFzdENoYW5nZWRCeVVzZXIgPSBcIlwiO1xuXHRpZiAoZHJhZnRBZG1pbkRhdGEpIHtcblx0XHRzTGFzdENoYW5nZWRCeVVzZXIgPSBkcmFmdEFkbWluRGF0YVtcIkxhc3RDaGFuZ2VkQnlVc2VyRGVzY3JpcHRpb25cIl0gfHwgZHJhZnRBZG1pbkRhdGFbXCJMYXN0Q2hhbmdlZEJ5VXNlclwiXSB8fCBcIlwiO1xuXHR9XG5cblx0cmV0dXJuIHNMYXN0Q2hhbmdlZEJ5VXNlcjtcbn1cblxuZnVuY3Rpb24gZ2V0VW5zYXZlZENvbnRleHRzVGV4dChcblx0cmVzb3VyY2VNb2RlbDogUmVzb3VyY2VNb2RlbCxcblx0bnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzOiBudW1iZXIsXG5cdHVuU2F2ZWRDb250ZXh0czogQ29udGV4dFtdLFxuXHR0b3RhbERlbGV0YWJsZTogbnVtYmVyXG4pOiBEZWxldGVUZXh0SW5mbyB7XG5cdGxldCBpbmZvVHh0ID0gXCJcIixcblx0XHRvcHRpb25UeHQgPSBcIlwiLFxuXHRcdG9wdGlvbldpdGhvdXRUeHQgPSBmYWxzZTtcblx0aWYgKG51bWJlck9mU2VsZWN0ZWRDb250ZXh0cyA9PT0gMSAmJiB1blNhdmVkQ29udGV4dHMubGVuZ3RoID09PSAxKSB7XG5cdFx0Ly9vbmx5IG9uZSB1bnNhdmVkIG9iamVjdCBhcmUgc2VsZWN0ZWRcblx0XHRjb25zdCBsYXN0Q2hhbmdlZEJ5VXNlciA9IGdldFVuU2F2ZWRDb250ZXh0VXNlcih1blNhdmVkQ29udGV4dHNbMF0pO1xuXHRcdGluZm9UeHQgPSByZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9DT05GSVJNX0RFTEVURV9XSVRIX1VOU0FWRURfQ0hBTkdFU1wiLCBbbGFzdENoYW5nZWRCeVVzZXJdKTtcblx0XHRvcHRpb25XaXRob3V0VHh0ID0gdHJ1ZTtcblx0fSBlbHNlIGlmIChudW1iZXJPZlNlbGVjdGVkQ29udGV4dHMgPT09IHVuU2F2ZWRDb250ZXh0cy5sZW5ndGgpIHtcblx0XHQvL29ubHkgbXVsdGlwbGUgdW5zYXZlZCBvYmplY3RzIGFyZSBzZWxlY3RlZFxuXHRcdGluZm9UeHQgPSByZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9DT05GSVJNX0RFTEVURV9XSVRIX1VOU0FWRURfQ0hBTkdFU19NVUxUSVBMRV9PQkpFQ1RTXCIpO1xuXHRcdG9wdGlvbldpdGhvdXRUeHQgPSB0cnVlO1xuXHR9IGVsc2UgaWYgKHRvdGFsRGVsZXRhYmxlID09PSB1blNhdmVkQ29udGV4dHMubGVuZ3RoKSB7XG5cdFx0Ly8gbm9uLWRlbGV0YWJsZS9sb2NrZWQgZXhpc3RzLCBhbGwgZGVsZXRhYmxlIGFyZSB1bnNhdmVkIGJ5IG90aGVyc1xuXHRcdGlmICh1blNhdmVkQ29udGV4dHMubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRjb25zdCBsYXN0Q2hhbmdlZEJ5VXNlciA9IGdldFVuU2F2ZWRDb250ZXh0VXNlcih1blNhdmVkQ29udGV4dHNbMF0pO1xuXHRcdFx0aW5mb1R4dCA9IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0NPTkZJUk1fREVMRVRFX1dJVEhfVU5TQVZFRF9BTkRfRkVXX09CSkVDVFNfTE9DS0VEX1NJTkdVTEFSXCIsIFtcblx0XHRcdFx0bGFzdENoYW5nZWRCeVVzZXJcblx0XHRcdF0pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRpbmZvVHh0ID0gcmVzb3VyY2VNb2RlbC5nZXRUZXh0KFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfQ09ORklSTV9ERUxFVEVfV0lUSF9VTlNBVkVEX0FORF9GRVdfT0JKRUNUU19MT0NLRURfUExVUkFMXCIpO1xuXHRcdH1cblx0XHRvcHRpb25XaXRob3V0VHh0ID0gdHJ1ZTtcblx0fSBlbHNlIGlmICh0b3RhbERlbGV0YWJsZSA+IHVuU2F2ZWRDb250ZXh0cy5sZW5ndGgpIHtcblx0XHQvLyBub24tZGVsZXRhYmxlL2xvY2tlZCBleGlzdHMsIGRlbGV0YWJsZSBpbmNsdWRlIHVuc2F2ZWQgYW5kIG90aGVyIHR5cGVzLlxuXHRcdGlmICh1blNhdmVkQ29udGV4dHMubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRjb25zdCBsYXN0Q2hhbmdlZEJ5VXNlciA9IGdldFVuU2F2ZWRDb250ZXh0VXNlcih1blNhdmVkQ29udGV4dHNbMF0pO1xuXHRcdFx0b3B0aW9uVHh0ID0gcmVzb3VyY2VNb2RlbC5nZXRUZXh0KFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfQ09ORklSTV9ERUxFVEVfV0lUSF9PQkpFQ1RJTkZPX0FORF9GRVdfT0JKRUNUU19VTlNBVkVEX1NJTkdVTEFSXCIsIFtcblx0XHRcdFx0bGFzdENoYW5nZWRCeVVzZXJcblx0XHRcdF0pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRvcHRpb25UeHQgPSByZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9DT05GSVJNX0RFTEVURV9XSVRIX09CSkVDVElORk9fQU5EX0ZFV19PQkpFQ1RTX1VOU0FWRURfUExVUkFMXCIpO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiB7IGluZm9UeHQsIG9wdGlvblR4dCwgb3B0aW9uV2l0aG91dFR4dCB9O1xufVxuXG5mdW5jdGlvbiBnZXROb25EZWxldGFibGVUZXh0KFxuXHRtUGFyYW1ldGVyczogRGVsZXRlUGFyYW1ldGVycyxcblx0dG90YWxOdW1EZWxldGFibGVDb250ZXh0czogbnVtYmVyLFxuXHRyZXNvdXJjZU1vZGVsOiBSZXNvdXJjZU1vZGVsXG4pOiBUZXh0IHwgdW5kZWZpbmVkIHtcblx0Y29uc3QgeyBudW1iZXJPZlNlbGVjdGVkQ29udGV4dHMsIGxvY2tlZENvbnRleHRzID0gW10sIGRyYWZ0c1dpdGhOb25EZWxldGFibGVBY3RpdmUgPSBbXSB9ID0gbVBhcmFtZXRlcnM7XG5cdGNvbnN0IG5vbkRlbGV0YWJsZUNvbnRleHRzID1cblx0XHRudW1iZXJPZlNlbGVjdGVkQ29udGV4dHMgLSAobG9ja2VkQ29udGV4dHMubGVuZ3RoICsgdG90YWxOdW1EZWxldGFibGVDb250ZXh0cyAtIGRyYWZ0c1dpdGhOb25EZWxldGFibGVBY3RpdmUubGVuZ3RoKTtcblx0bGV0IHJldFR4dCA9IFwiXCI7XG5cblx0aWYgKFxuXHRcdG5vbkRlbGV0YWJsZUNvbnRleHRzID4gMCAmJlxuXHRcdCh0b3RhbE51bURlbGV0YWJsZUNvbnRleHRzID09PSAwIHx8IGRyYWZ0c1dpdGhOb25EZWxldGFibGVBY3RpdmUubGVuZ3RoID09PSB0b3RhbE51bURlbGV0YWJsZUNvbnRleHRzKVxuXHQpIHtcblx0XHQvLyAxLiBOb25lIG9mIHRoZSBjY29udGV4dHMgYXJlIGRlbGV0YWJsZVxuXHRcdC8vIDIuIE9ubHkgZHJhZnRzIG9mIG5vbiBkZWxldGFibGUgY29udGV4dHMgZXhpc3QuXG5cdFx0aWYgKGxvY2tlZENvbnRleHRzLmxlbmd0aCA+IDApIHtcblx0XHRcdC8vIExvY2tlZCBjb250ZXh0cyBleGlzdFxuXHRcdFx0aWYgKG5vbkRlbGV0YWJsZUNvbnRleHRzID09PSAxKSB7XG5cdFx0XHRcdHJldFR4dCA9IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0NPTkZJUk1fREVMRVRFX1dJVEhfQUxMX1JFTUFJTklOR19OT05fREVMRVRBQkxFX1NJTkdVTEFSXCIpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmV0VHh0ID0gcmVzb3VyY2VNb2RlbC5nZXRUZXh0KFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfQ09ORklSTV9ERUxFVEVfV0lUSF9BTExfUkVNQUlOSU5HX05PTl9ERUxFVEFCTEVfUExVUkFMXCIpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAobm9uRGVsZXRhYmxlQ29udGV4dHMgPT09IDEpIHtcblx0XHRcdC8vIE9ubHkgcHVyZSBub24tZGVsZXRhYmxlIGNvbnRleHRzIGV4aXN0IHNpbmdsZVxuXHRcdFx0cmV0VHh0ID0gcmVzb3VyY2VNb2RlbC5nZXRUZXh0KFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfQ09ORklSTV9ERUxFVEVfV0lUSF9TSU5HTEVfQU5EX09ORV9PQkpFQ1RfTk9OX0RFTEVUQUJMRVwiKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gT25seSBwdXJlIG5vbi1kZWxldGFibGUgY29udGV4dHMgZXhpc3QgbXVsdGlwbGVcblx0XHRcdHJldFR4dCA9IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0NPTkZJUk1fREVMRVRFX1dJVEhfTVVMVElQTEVfQU5EX0FMTF9PQkpFQ1RfTk9OX0RFTEVUQUJMRVwiKTtcblx0XHR9XG5cdH0gZWxzZSBpZiAobm9uRGVsZXRhYmxlQ29udGV4dHMgPT09IDEpIHtcblx0XHQvLyBkZWxldGFibGUgYW5kIG5vbi1kZWxldGFibGUgZXhpc3RzIHRvZ2V0aGVyLCBzaW5nbGVcblx0XHRyZXRUeHQgPSByZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9DT05GSVJNX0RFTEVURV9XSVRIX09CSkVDVElORk9fQU5EX09ORV9PQkpFQ1RfTk9OX0RFTEVUQUJMRVwiLCBbXG5cdFx0XHRudW1iZXJPZlNlbGVjdGVkQ29udGV4dHNcblx0XHRdKTtcblx0fSBlbHNlIGlmIChub25EZWxldGFibGVDb250ZXh0cyA+IDEpIHtcblx0XHQvLyBkZWxldGFibGUgYW5kIG5vbi1kZWxldGFibGUgZXhpc3RzIHRvZ2V0aGVyLCBtdWx0aXBsZVxuXHRcdHJldFR4dCA9IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0NPTkZJUk1fREVMRVRFX1dJVEhfT0JKRUNUSU5GT19BTkRfRkVXX09CSkVDVFNfTk9OX0RFTEVUQUJMRVwiLCBbXG5cdFx0XHRub25EZWxldGFibGVDb250ZXh0cyxcblx0XHRcdG51bWJlck9mU2VsZWN0ZWRDb250ZXh0c1xuXHRcdF0pO1xuXHR9XG5cblx0cmV0dXJuIHJldFR4dCA/IG5ldyBUZXh0KHsgdGV4dDogcmV0VHh0IH0pIDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBnZXRDb25maXJtZWREZWxldGFibGVDb250ZXh0KGNvbnRleHRzOiBDb250ZXh0W10sIG9wdGlvbnM6IERlbGV0ZU9wdGlvbltdKTogQ29udGV4dFtdIHtcblx0cmV0dXJuIG9wdGlvbnMucmVkdWNlKChyZXN1bHQsIG9wdGlvbikgPT4ge1xuXHRcdHJldHVybiBvcHRpb24uc2VsZWN0ZWQgJiYgb3B0aW9uLnR5cGUgIT09IERlbGV0ZU9wdGlvblR5cGVzLmRyYWZ0c1RvRGVsZXRlQmVmb3JlQWN0aXZlID8gcmVzdWx0LmNvbmNhdChvcHRpb24uY29udGV4dHMpIDogcmVzdWx0O1xuXHR9LCBjb250ZXh0cyk7XG59XG5cbmZ1bmN0aW9uIGdldERyYWZ0c1RvRGVsZXRlQmVmb3JlQWN0aXZlKG9wdGlvbnM6IERlbGV0ZU9wdGlvbltdKTogQ29udGV4dFtdIHtcblx0Y29uc3QgY29udGV4dHM6IENvbnRleHRbXSA9IFtdO1xuXHRyZXR1cm4gb3B0aW9ucy5yZWR1Y2UoKHJlc3VsdCwgb3B0aW9uKSA9PiB7XG5cdFx0cmV0dXJuIG9wdGlvbi5zZWxlY3RlZCAmJiBvcHRpb24udHlwZSA9PT0gRGVsZXRlT3B0aW9uVHlwZXMuZHJhZnRzVG9EZWxldGVCZWZvcmVBY3RpdmUgPyByZXN1bHQuY29uY2F0KG9wdGlvbi5jb250ZXh0cykgOiByZXN1bHQ7XG5cdH0sIGNvbnRleHRzKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlRHJhZnRPcHRpb25zRm9yRGVsZXRhYmxlVGV4dHMoXG5cdG1QYXJhbWV0ZXJzOiBEZWxldGVQYXJhbWV0ZXJzLFxuXHR2Q29udGV4dHM6IENvbnRleHRbXSxcblx0dG90YWxEZWxldGFibGU6IG51bWJlcixcblx0cmVzb3VyY2VNb2RlbDogUmVzb3VyY2VNb2RlbCxcblx0aXRlbXM6IENvbnRyb2xbXSxcblx0b3B0aW9uczogRGVsZXRlT3B0aW9uW11cbikge1xuXHRjb25zdCB7XG5cdFx0bnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzLFxuXHRcdGRyYWZ0c1dpdGhEZWxldGFibGVBY3RpdmUsXG5cdFx0dW5TYXZlZENvbnRleHRzLFxuXHRcdGNyZWF0ZU1vZGVDb250ZXh0cyxcblx0XHRsb2NrZWRDb250ZXh0cyxcblx0XHRkcmFmdHNXaXRoTm9uRGVsZXRhYmxlQWN0aXZlXG5cdH0gPSBtUGFyYW1ldGVycztcblx0bGV0IGxvY2tlZENvbnRleHRzVHh0ID0gXCJcIjtcblxuXHQvLyBkcmFmdHMgd2l0aCBhY3RpdmVcblx0aWYgKGRyYWZ0c1dpdGhEZWxldGFibGVBY3RpdmUubGVuZ3RoID4gMCkge1xuXHRcdGNvbnN0IGRyYWZ0c1RvRGVsZXRlQmVmb3JlQWN0aXZlOiBDb250ZXh0W10gPSBbXTtcblx0XHRkcmFmdHNXaXRoRGVsZXRhYmxlQWN0aXZlLmZvckVhY2goKGRlbGV0YWJsZURyYWZ0SW5mbzogRHJhZnRTaWJsaW5nUGFpcikgPT4ge1xuXHRcdFx0aWYgKGRlbGV0YWJsZURyYWZ0SW5mby5kcmFmdC5nZXRQcm9wZXJ0eShcIkRyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhL0luUHJvY2Vzc0J5VXNlclwiKSkge1xuXHRcdFx0XHQvLyBJZiBhbiBvd24gZHJhZnQgaXMgbG9ja2VkIHRoZW4gdGhlIGRyYWZ0IG5lZWRzIHRvIGJlIGRpc2NhcmRlZCBiZWZvcmUgZGVsZXRpbmcgYWN0aXZlIHJlY29yZC5cblx0XHRcdFx0ZHJhZnRzVG9EZWxldGVCZWZvcmVBY3RpdmUucHVzaChkZWxldGFibGVEcmFmdEluZm8uZHJhZnQpO1xuXHRcdFx0fVxuXHRcdFx0dkNvbnRleHRzLnB1c2goZGVsZXRhYmxlRHJhZnRJbmZvLnNpYmxpbmdJbmZvLnRhcmdldENvbnRleHQpO1xuXHRcdH0pO1xuXHRcdGlmIChkcmFmdHNUb0RlbGV0ZUJlZm9yZUFjdGl2ZS5sZW5ndGggPiAwKSB7XG5cdFx0XHRvcHRpb25zLnB1c2goe1xuXHRcdFx0XHR0eXBlOiBEZWxldGVPcHRpb25UeXBlcy5kcmFmdHNUb0RlbGV0ZUJlZm9yZUFjdGl2ZSxcblx0XHRcdFx0Y29udGV4dHM6IGRyYWZ0c1RvRGVsZXRlQmVmb3JlQWN0aXZlLFxuXHRcdFx0XHRzZWxlY3RlZDogdHJ1ZVxuXHRcdFx0fSk7XG5cdFx0fVxuXHR9XG5cblx0Ly8gY3JlYXRlIG1vZGUgZHJhZnRzXG5cdGlmIChjcmVhdGVNb2RlQ29udGV4dHMubGVuZ3RoID4gMCkge1xuXHRcdC8vIGNyZWF0ZSBtb2RlIGRyYWZ0c1xuXHRcdGNyZWF0ZU1vZGVDb250ZXh0cy5mb3JFYWNoKChjb250ZXh0KSA9PiB2Q29udGV4dHMucHVzaChjb250ZXh0KSk7XG5cdH1cblxuXHQvLyBpdGVtcyBsb2NrZWQgbXNnXG5cdGlmIChsb2NrZWRDb250ZXh0cy5sZW5ndGggPiAwKSB7XG5cdFx0bG9ja2VkQ29udGV4dHNUeHQgPSBkZWxldGVIZWxwZXIuZ2V0TG9ja2VkT2JqZWN0c1RleHQocmVzb3VyY2VNb2RlbCwgbnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzLCBsb2NrZWRDb250ZXh0cykgfHwgXCJcIjtcblx0XHRpdGVtcy5wdXNoKG5ldyBUZXh0KHsgdGV4dDogbG9ja2VkQ29udGV4dHNUeHQgfSkpO1xuXHR9XG5cblx0Ly8gbm9uIGRlbGV0YWJsZSBtc2dcblx0Y29uc3Qgbm9uRGVsZXRhYmxlRXhpc3RzID0gbnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzICE9IHRvdGFsRGVsZXRhYmxlIC0gZHJhZnRzV2l0aE5vbkRlbGV0YWJsZUFjdGl2ZS5sZW5ndGggKyBsb2NrZWRDb250ZXh0cy5sZW5ndGg7XG5cdGNvbnN0IG5vbkRlbGV0YWJsZVRleHRDdHJsID0gbm9uRGVsZXRhYmxlRXhpc3RzICYmIGRlbGV0ZUhlbHBlci5nZXROb25EZWxldGFibGVUZXh0KG1QYXJhbWV0ZXJzLCB0b3RhbERlbGV0YWJsZSwgcmVzb3VyY2VNb2RlbCk7XG5cdGlmIChub25EZWxldGFibGVUZXh0Q3RybCkge1xuXHRcdGl0ZW1zLnB1c2gobm9uRGVsZXRhYmxlVGV4dEN0cmwpO1xuXHR9XG5cblx0Ly8gb3B0aW9uOiB1bnNhdmVkIGNoYW5nZXMgYnkgb3RoZXJzXG5cdGlmICh1blNhdmVkQ29udGV4dHMubGVuZ3RoID4gMCkge1xuXHRcdGNvbnN0IHVuc2F2ZWRDaGFuZ2VzVHh0cyA9XG5cdFx0XHRkZWxldGVIZWxwZXIuZ2V0VW5zYXZlZENvbnRleHRzVGV4dChyZXNvdXJjZU1vZGVsLCBudW1iZXJPZlNlbGVjdGVkQ29udGV4dHMsIHVuU2F2ZWRDb250ZXh0cywgdG90YWxEZWxldGFibGUpIHx8IHt9O1xuXHRcdGlmICh1bnNhdmVkQ2hhbmdlc1R4dHMuaW5mb1R4dCkge1xuXHRcdFx0aXRlbXMucHVzaChuZXcgVGV4dCh7IHRleHQ6IHVuc2F2ZWRDaGFuZ2VzVHh0cy5pbmZvVHh0IH0pKTtcblx0XHR9XG5cdFx0aWYgKHVuc2F2ZWRDaGFuZ2VzVHh0cy5vcHRpb25UeHQgfHwgdW5zYXZlZENoYW5nZXNUeHRzLm9wdGlvbldpdGhvdXRUeHQpIHtcblx0XHRcdG9wdGlvbnMucHVzaCh7XG5cdFx0XHRcdHR5cGU6IERlbGV0ZU9wdGlvblR5cGVzLnVuU2F2ZWRDb250ZXh0cyxcblx0XHRcdFx0Y29udGV4dHM6IHVuU2F2ZWRDb250ZXh0cyxcblx0XHRcdFx0dGV4dDogdW5zYXZlZENoYW5nZXNUeHRzLm9wdGlvblR4dCxcblx0XHRcdFx0c2VsZWN0ZWQ6IHRydWUsXG5cdFx0XHRcdGNvbnRyb2w6IERlbGV0ZURpYWxvZ0NvbnRlbnRDb250cm9sLkNIRUNLQk9YXG5cdFx0XHR9KTtcblx0XHR9XG5cdH1cblxuXHQvLyBvcHRpb246IGRyYWZ0cyB3aXRoIGFjdGl2ZSBub3QgZGVsZXRhYmxlXG5cdGlmIChkcmFmdHNXaXRoTm9uRGVsZXRhYmxlQWN0aXZlLmxlbmd0aCA+IDApIHtcblx0XHRjb25zdCBub25EZWxldGFibGVBY3RpdmVzT2ZEcmFmdHNUZXh0ID1cblx0XHRcdGRlbGV0ZUhlbHBlci5nZXROb25EZWxldGFibGVBY3RpdmVzT2ZEcmFmdHNUZXh0KHJlc291cmNlTW9kZWwsIGRyYWZ0c1dpdGhOb25EZWxldGFibGVBY3RpdmUubGVuZ3RoLCB0b3RhbERlbGV0YWJsZSkgfHwgXCJcIjtcblx0XHRpZiAobm9uRGVsZXRhYmxlQWN0aXZlc09mRHJhZnRzVGV4dCkge1xuXHRcdFx0b3B0aW9ucy5wdXNoKHtcblx0XHRcdFx0dHlwZTogRGVsZXRlT3B0aW9uVHlwZXMuZHJhZnRzV2l0aE5vbkRlbGV0YWJsZUFjdGl2ZSxcblx0XHRcdFx0Y29udGV4dHM6IGRyYWZ0c1dpdGhOb25EZWxldGFibGVBY3RpdmUsXG5cdFx0XHRcdHRleHQ6IG5vbkRlbGV0YWJsZUFjdGl2ZXNPZkRyYWZ0c1RleHQsXG5cdFx0XHRcdHNlbGVjdGVkOiB0cnVlLFxuXHRcdFx0XHRjb250cm9sOiB0b3RhbERlbGV0YWJsZSA+IDAgPyBEZWxldGVEaWFsb2dDb250ZW50Q29udHJvbC5DSEVDS0JPWCA6IERlbGV0ZURpYWxvZ0NvbnRlbnRDb250cm9sLlRFWFRcblx0XHRcdH0pO1xuXHRcdH1cblx0fVxufVxuXG5mdW5jdGlvbiB1cGRhdGVDb250ZW50Rm9yRGVsZXRlRGlhbG9nKG9wdGlvbnM6IERlbGV0ZU9wdGlvbltdLCBpdGVtczogQ29udHJvbFtdKSB7XG5cdGlmIChvcHRpb25zLmxlbmd0aCA9PT0gMSkge1xuXHRcdC8vIFNpbmdsZSBvcHRpb24gZG9lc24ndCBuZWVkIGNoZWNrQm94XG5cdFx0Y29uc3Qgb3B0aW9uID0gb3B0aW9uc1swXTtcblx0XHRpZiAob3B0aW9uLnRleHQpIHtcblx0XHRcdGl0ZW1zLnB1c2gobmV3IFRleHQoeyB0ZXh0OiBvcHRpb24udGV4dCB9KSk7XG5cdFx0fVxuXHR9IGVsc2UgaWYgKG9wdGlvbnMubGVuZ3RoID4gMSkge1xuXHRcdC8vIE11bHRpcGxlIE9wdGlvbnNcblxuXHRcdC8vIFRleHRzXG5cdFx0b3B0aW9ucy5mb3JFYWNoKChvcHRpb246IERlbGV0ZU9wdGlvbikgPT4ge1xuXHRcdFx0aWYgKG9wdGlvbi5jb250cm9sID09PSBcInRleHRcIiAmJiBvcHRpb24udGV4dCkge1xuXHRcdFx0XHRpdGVtcy5wdXNoKG5ldyBUZXh0KHsgdGV4dDogb3B0aW9uLnRleHQgfSkpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdC8vIENoZWNrQm94c1xuXHRcdG9wdGlvbnMuZm9yRWFjaCgob3B0aW9uOiBEZWxldGVPcHRpb24pID0+IHtcblx0XHRcdGlmIChvcHRpb24uY29udHJvbCA9PT0gXCJjaGVja0JveFwiICYmIG9wdGlvbi50ZXh0KSB7XG5cdFx0XHRcdGl0ZW1zLnB1c2goXG5cdFx0XHRcdFx0bmV3IENoZWNrQm94KHtcblx0XHRcdFx0XHRcdHRleHQ6IG9wdGlvbi50ZXh0LFxuXHRcdFx0XHRcdFx0c2VsZWN0ZWQ6IHRydWUsXG5cdFx0XHRcdFx0XHRzZWxlY3Q6IGZ1bmN0aW9uIChvRXZlbnQ6IEV2ZW50KSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IGNoZWNrQm94ID0gb0V2ZW50LmdldFNvdXJjZSgpIGFzIENoZWNrQm94O1xuXHRcdFx0XHRcdFx0XHRjb25zdCBzZWxlY3RlZCA9IGNoZWNrQm94LmdldFNlbGVjdGVkKCk7XG5cdFx0XHRcdFx0XHRcdG9wdGlvbi5zZWxlY3RlZCA9IHNlbGVjdGVkO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlT3B0aW9uc0ZvckRlbGV0YWJsZVRleHRzKFxuXHRtUGFyYW1ldGVyczogRGVsZXRlUGFyYW1ldGVycyxcblx0ZGlyZWN0RGVsZXRhYmxlQ29udGV4dHM6IENvbnRleHRbXSxcblx0cmVzb3VyY2VNb2RlbDogUmVzb3VyY2VNb2RlbCxcblx0b3B0aW9uczogRGVsZXRlT3B0aW9uW11cbikge1xuXHRjb25zdCB7XG5cdFx0bnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzLFxuXHRcdGVudGl0eVNldE5hbWUsXG5cdFx0cGFyZW50Q29udHJvbCxcblx0XHRkZXNjcmlwdGlvbixcblx0XHRsb2NrZWRDb250ZXh0cyxcblx0XHRkcmFmdHNXaXRoTm9uRGVsZXRhYmxlQWN0aXZlLFxuXHRcdHVuU2F2ZWRDb250ZXh0c1xuXHR9ID0gbVBhcmFtZXRlcnM7XG5cdGNvbnN0IHRvdGFsRGVsZXRhYmxlID0gZGlyZWN0RGVsZXRhYmxlQ29udGV4dHMubGVuZ3RoICsgZHJhZnRzV2l0aE5vbkRlbGV0YWJsZUFjdGl2ZS5sZW5ndGggKyB1blNhdmVkQ29udGV4dHMubGVuZ3RoO1xuXHRjb25zdCBub25EZWxldGFibGVDb250ZXh0cyA9IG51bWJlck9mU2VsZWN0ZWRDb250ZXh0cyAtIChsb2NrZWRDb250ZXh0cy5sZW5ndGggKyB0b3RhbERlbGV0YWJsZSAtIGRyYWZ0c1dpdGhOb25EZWxldGFibGVBY3RpdmUubGVuZ3RoKTtcblxuXHRpZiAobnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzID09PSAxICYmIG51bWJlck9mU2VsZWN0ZWRDb250ZXh0cyA9PT0gZGlyZWN0RGVsZXRhYmxlQ29udGV4dHMubGVuZ3RoKSB7XG5cdFx0Ly8gc2luZ2xlIGRlbGV0YWJsZSBjb250ZXh0XG5cdFx0Y29uc3Qgb0xpbmVDb250ZXh0RGF0YSA9IGRpcmVjdERlbGV0YWJsZUNvbnRleHRzWzBdLmdldE9iamVjdCgpO1xuXHRcdGNvbnN0IG9UYWJsZSA9IHBhcmVudENvbnRyb2wgYXMgVGFibGU7XG5cdFx0Y29uc3Qgc0tleSA9IG9UYWJsZSAmJiAob1RhYmxlLmdldFBhcmVudCgpIGFzIFRhYmxlQVBJKS5nZXRJZGVudGlmaWVyQ29sdW1uKCk7XG5cdFx0bGV0IHR4dDtcblx0XHRsZXQgYVBhcmFtcyA9IFtdO1xuXHRcdGlmIChzS2V5KSB7XG5cdFx0XHRjb25zdCBzS2V5VmFsdWUgPSBzS2V5ID8gb0xpbmVDb250ZXh0RGF0YVtzS2V5XSA6IHVuZGVmaW5lZDtcblx0XHRcdGNvbnN0IHNEZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uICYmIGRlc2NyaXB0aW9uLnBhdGggPyBvTGluZUNvbnRleHREYXRhW2Rlc2NyaXB0aW9uLnBhdGhdIDogdW5kZWZpbmVkO1xuXHRcdFx0aWYgKHNLZXlWYWx1ZSkge1xuXHRcdFx0XHRpZiAoc0Rlc2NyaXB0aW9uICYmIGRlc2NyaXB0aW9uICYmIHNLZXkgIT09IGRlc2NyaXB0aW9uLnBhdGgpIHtcblx0XHRcdFx0XHRhUGFyYW1zID0gW3NLZXlWYWx1ZSArIFwiIFwiLCBzRGVzY3JpcHRpb25dO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGFQYXJhbXMgPSBbc0tleVZhbHVlLCBcIlwiXTtcblx0XHRcdFx0fVxuXHRcdFx0XHR0eHQgPSByZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9DT05GSVJNX0RFTEVURV9XSVRIX09CSkVDVElORk9cIiwgYVBhcmFtcywgZW50aXR5U2V0TmFtZSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0eHQgPSByZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9DT05GSVJNX0RFTEVURV9XSVRIX09CSkVDVFRJVExFX1NJTkdVTEFSXCIsIHVuZGVmaW5lZCwgZW50aXR5U2V0TmFtZSk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdHR4dCA9IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0NPTkZJUk1fREVMRVRFX1dJVEhfT0JKRUNUVElUTEVfU0lOR1VMQVJcIiwgdW5kZWZpbmVkLCBlbnRpdHlTZXROYW1lKTtcblx0XHR9XG5cdFx0b3B0aW9ucy5wdXNoKHtcblx0XHRcdHR5cGU6IERlbGV0ZU9wdGlvblR5cGVzLmRlbGV0YWJsZUNvbnRleHRzLFxuXHRcdFx0Y29udGV4dHM6IGRpcmVjdERlbGV0YWJsZUNvbnRleHRzLFxuXHRcdFx0dGV4dDogdHh0LFxuXHRcdFx0c2VsZWN0ZWQ6IHRydWUsXG5cdFx0XHRjb250cm9sOiBEZWxldGVEaWFsb2dDb250ZW50Q29udHJvbC5URVhUXG5cdFx0fSk7XG5cdH0gZWxzZSBpZiAoXG5cdFx0dW5TYXZlZENvbnRleHRzLmxlbmd0aCAhPT0gdG90YWxEZWxldGFibGUgJiZcblx0XHRudW1iZXJPZlNlbGVjdGVkQ29udGV4dHMgPiAwICYmXG5cdFx0KGRpcmVjdERlbGV0YWJsZUNvbnRleHRzLmxlbmd0aCA+IDAgfHwgKHVuU2F2ZWRDb250ZXh0cy5sZW5ndGggPiAwICYmIGRyYWZ0c1dpdGhOb25EZWxldGFibGVBY3RpdmUubGVuZ3RoID4gMCkpXG5cdCkge1xuXHRcdGlmIChudW1iZXJPZlNlbGVjdGVkQ29udGV4dHMgPiBkaXJlY3REZWxldGFibGVDb250ZXh0cy5sZW5ndGggJiYgbm9uRGVsZXRhYmxlQ29udGV4dHMgKyBsb2NrZWRDb250ZXh0cy5sZW5ndGggPiAwKSB7XG5cdFx0XHQvLyBvdGhlciB0eXBlcyBleGlzdHMgd2l0aCBwdXJlIGRlbGV0YWJsZSBvbmVzXG5cdFx0XHRsZXQgZGVsZXRhYmxlT3B0aW9uVHh0ID0gXCJcIjtcblx0XHRcdGlmICh0b3RhbERlbGV0YWJsZSA9PT0gMSkge1xuXHRcdFx0XHRkZWxldGFibGVPcHRpb25UeHQgPSByZXNvdXJjZU1vZGVsLmdldFRleHQoXG5cdFx0XHRcdFx0XCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9DT05GSVJNX0RFTEVURV9XSVRIX09CSkVDVFRJVExFX1NJTkdVTEFSX05PTl9ERUxFVEFCTEVcIixcblx0XHRcdFx0XHR1bmRlZmluZWQsXG5cdFx0XHRcdFx0ZW50aXR5U2V0TmFtZVxuXHRcdFx0XHQpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZGVsZXRhYmxlT3B0aW9uVHh0ID0gcmVzb3VyY2VNb2RlbC5nZXRUZXh0KFxuXHRcdFx0XHRcdFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfQ09ORklSTV9ERUxFVEVfV0lUSF9PQkpFQ1RUSVRMRV9QTFVSQUxfTk9OX0RFTEVUQUJMRVwiLFxuXHRcdFx0XHRcdHVuZGVmaW5lZCxcblx0XHRcdFx0XHRlbnRpdHlTZXROYW1lXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0XHRvcHRpb25zLnVuc2hpZnQoe1xuXHRcdFx0XHR0eXBlOiBEZWxldGVPcHRpb25UeXBlcy5kZWxldGFibGVDb250ZXh0cyxcblx0XHRcdFx0Y29udGV4dHM6IGRpcmVjdERlbGV0YWJsZUNvbnRleHRzLFxuXHRcdFx0XHR0ZXh0OiBkZWxldGFibGVPcHRpb25UeHQsXG5cdFx0XHRcdHNlbGVjdGVkOiB0cnVlLFxuXHRcdFx0XHRjb250cm9sOiBEZWxldGVEaWFsb2dDb250ZW50Q29udHJvbC5URVhUXG5cdFx0XHR9KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gb25seSBkZWxldGFibGVcblx0XHRcdGNvbnN0IGFsbERlbGV0YWJsZVR4dCA9XG5cdFx0XHRcdHRvdGFsRGVsZXRhYmxlID09PSAxXG5cdFx0XHRcdFx0PyByZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9DT05GSVJNX0RFTEVURV9XSVRIX09CSkVDVFRJVExFX1NJTkdVTEFSXCIsIHVuZGVmaW5lZCwgZW50aXR5U2V0TmFtZSlcblx0XHRcdFx0XHQ6IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0NPTkZJUk1fREVMRVRFX1dJVEhfT0JKRUNUVElUTEVfUExVUkFMXCIsIHVuZGVmaW5lZCwgZW50aXR5U2V0TmFtZSk7XG5cdFx0XHRvcHRpb25zLnB1c2goe1xuXHRcdFx0XHR0eXBlOiBEZWxldGVPcHRpb25UeXBlcy5kZWxldGFibGVDb250ZXh0cyxcblx0XHRcdFx0Y29udGV4dHM6IGRpcmVjdERlbGV0YWJsZUNvbnRleHRzLFxuXHRcdFx0XHR0ZXh0OiBhbGxEZWxldGFibGVUeHQsXG5cdFx0XHRcdHNlbGVjdGVkOiB0cnVlLFxuXHRcdFx0XHRjb250cm9sOiBEZWxldGVEaWFsb2dDb250ZW50Q29udHJvbC5URVhUXG5cdFx0XHR9KTtcblx0XHR9XG5cdH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZGVsZXRlQ29uZmlybUhhbmRsZXIoXG5cdG9wdGlvbnM6IERlbGV0ZU9wdGlvbltdLFxuXHRtUGFyYW1ldGVyczogRGVsZXRlUGFyYW1ldGVycyxcblx0bWVzc2FnZUhhbmRsZXI6IE1lc3NhZ2VIYW5kbGVyLFxuXHRyZXNvdXJjZU1vZGVsOiBSZXNvdXJjZU1vZGVsLFxuXHRhcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCxcblx0ZHJhZnRFbmFibGVkOiBib29sZWFuXG4pIHtcblx0dHJ5IHtcblx0XHRjb25zdCBjb250ZXh0cyA9IGRlbGV0ZUhlbHBlci5nZXRDb25maXJtZWREZWxldGFibGVDb250ZXh0KFtdLCBvcHRpb25zKTtcblx0XHRjb25zdCBkcmFmdHNUb0RlbGV0ZUJlZm9yZUFjdGl2ZSA9IGdldERyYWZ0c1RvRGVsZXRlQmVmb3JlQWN0aXZlKG9wdGlvbnMpO1xuXG5cdFx0Y29uc3QgeyBiZWZvcmVEZWxldGVDYWxsQmFjaywgcGFyZW50Q29udHJvbCB9ID0gbVBhcmFtZXRlcnM7XG5cdFx0aWYgKGJlZm9yZURlbGV0ZUNhbGxCYWNrKSB7XG5cdFx0XHRhd2FpdCBiZWZvcmVEZWxldGVDYWxsQmFjayh7IGNvbnRleHRzOiBjb250ZXh0cyB9KTtcblx0XHR9XG5cblx0XHRpZiAoY29udGV4dHMgJiYgY29udGV4dHMubGVuZ3RoKSB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRjb25zdCBlbmFibGVTdHJpY3RIYW5kbGluZyA9IGNvbnRleHRzLmxlbmd0aCA9PT0gMSA/IHRydWUgOiBmYWxzZTtcblx0XHRcdFx0Y29uc3QgZHJhZnRFcnJvcnM6IHVua25vd25bXSA9IFtdO1xuXHRcdFx0XHRhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoXG5cdFx0XHRcdFx0ZHJhZnRzVG9EZWxldGVCZWZvcmVBY3RpdmUubWFwKGZ1bmN0aW9uIChjb250ZXh0OiBDb250ZXh0KSB7XG5cdFx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gZHJhZnQuZGVsZXRlRHJhZnQoY29udGV4dCwgYXBwQ29tcG9uZW50LCBlbmFibGVTdHJpY3RIYW5kbGluZyk7XG5cdFx0XHRcdFx0XHR9IGNhdGNoIChlOiB1bmtub3duKSB7XG5cdFx0XHRcdFx0XHRcdExvZy5lcnJvcihgRkUgOiBjb3JlIDogRGVsZXRlSGVscGVyIDogRXJyb3Igd2hpbGUgZGlzY3JkaW5nIGRyYWZ0IHdpdGggcGF0aCA6ICR7Y29udGV4dC5nZXRQYXRoKCl9YCk7XG5cdFx0XHRcdFx0XHRcdGRyYWZ0RXJyb3JzLnB1c2goZSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0KTtcblxuXHRcdFx0XHRhd2FpdCBQcm9taXNlLmFsbChcblx0XHRcdFx0XHRjb250ZXh0cy5tYXAoZnVuY3Rpb24gKGNvbnRleHQ6IENvbnRleHQpIHtcblx0XHRcdFx0XHRcdGlmIChkcmFmdEVuYWJsZWQgJiYgIWNvbnRleHQuZ2V0UHJvcGVydHkoXCJJc0FjdGl2ZUVudGl0eVwiKSkge1xuXHRcdFx0XHRcdFx0XHQvL2RlbGV0ZSB0aGUgZHJhZnRcblx0XHRcdFx0XHRcdFx0cmV0dXJuIGRyYWZ0LmRlbGV0ZURyYWZ0KGNvbnRleHQsIGFwcENvbXBvbmVudCwgZW5hYmxlU3RyaWN0SGFuZGxpbmcpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0cmV0dXJuIGNvbnRleHQuZGVsZXRlKCk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0KTtcblx0XHRcdFx0ZGVsZXRlSGVscGVyLmFmdGVyRGVsZXRlUHJvY2VzcyhtUGFyYW1ldGVycywgb3B0aW9ucywgY29udGV4dHMsIHJlc291cmNlTW9kZWwpO1xuXHRcdFx0XHRpZiAoZHJhZnRFcnJvcnMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdHRocm93IEVycm9yKGBGRSA6IGNvcmUgOiBEZWxldGVIZWxwZXIgOiBFcnJvcnMgb24gZHJhZnQgZGVsZXRlIDogJHtkcmFmdEVycm9yc31gKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0YXdhaXQgbWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VEaWFsb2coeyBjb250cm9sOiBwYXJlbnRDb250cm9sIH0pO1xuXHRcdFx0XHQvLyByZS10aHJvdyBlcnJvciB0byBlbmZvcmNlIHJlamVjdGluZyB0aGUgZ2VuZXJhbCBwcm9taXNlXG5cdFx0XHRcdHRocm93IGVycm9yO1xuXHRcdFx0fVxuXHRcdH1cblx0fSBjYXRjaCAob0Vycm9yKSB7XG5cdFx0YXdhaXQgbWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VzKCk7XG5cdFx0Ly8gcmUtdGhyb3cgZXJyb3IgdG8gZW5mb3JjZSByZWplY3RpbmcgdGhlIGdlbmVyYWwgcHJvbWlzZVxuXHRcdHRocm93IG9FcnJvcjtcblx0fVxufVxuXG4vLyBUYWJsZSBSdW50aW1lIEhlbHBlcnM6XG5cbi8qIHJlZnJlc2hlcyBkYXRhIGluIGludGVybmFsIG1vZGVsIHJlbGV2YW50IGZvciBlbmFibGVtZW50IG9mIGRlbGV0ZSBidXR0b24gYWNjb3JkaW5nIHRvIHNlbGVjdGVkIGNvbnRleHRzXG5yZWxldmFudCBkYXRhIGFyZTogZGVsZXRhYmxlQ29udGV4dHMsIGRyYWZ0c1dpdGhEZWxldGFibGVBY3RpdmUsIGRyYWZ0c1dpdGhOb25EZWxldGFibGVBY3RpdmUsIGNyZWF0ZU1vZGVDb250ZXh0cywgdW5TYXZlZENvbnRleHRzLCBkZWxldGVFbmFibGVkXG5ub3QgcmVsZXZhbnQ6IGxvY2tlZENvbnRleHRzXG4qL1xuYXN5bmMgZnVuY3Rpb24gdXBkYXRlRGVsZXRlSW5mb0ZvclNlbGVjdGVkQ29udGV4dHMoaW50ZXJuYWxNb2RlbENvbnRleHQ6IEludGVybmFsTW9kZWxDb250ZXh0LCBzZWxlY3RlZENvbnRleHRzOiBDb250ZXh0W10pIHtcblx0dHlwZSBjb250ZXh0SW5mbyA9IHtcblx0XHRjb250ZXh0OiBDb250ZXh0O1xuXHRcdHNpYmxpbmdQcm9taXNlOiBQcm9taXNlPFNpYmxpbmdJbmZvcm1hdGlvbiB8IHVuZGVmaW5lZCB8IHZvaWQ+O1xuXHRcdHNpYmxpbmdJbmZvOiBTaWJsaW5nSW5mb3JtYXRpb24gfCB1bmRlZmluZWQ7XG5cdFx0aXNEcmFmdFJvb3Q6IGJvb2xlYW47XG5cdFx0aXNEcmFmdE5vZGU6IGJvb2xlYW47XG5cdFx0aXNBY3RpdmU6IGJvb2xlYW47XG5cdFx0aGFzQWN0aXZlOiBib29sZWFuO1xuXHRcdGhhc0RyYWZ0OiBib29sZWFuO1xuXHRcdGxvY2tlZDogYm9vbGVhbjtcblx0XHRkZWxldGFibGU6IGJvb2xlYW47XG5cdFx0c2libGluZ0RlbGV0YWJsZTogYm9vbGVhbjtcblx0fTtcblx0Y29uc3QgY29udGV4dEluZm9zID0gc2VsZWN0ZWRDb250ZXh0cy5tYXAoKGNvbnRleHQpID0+IHtcblx0XHQvLyBhc3N1bWluZyBtZXRhQ29udGV4dCBpcyB0aGUgc2FtZSBmb3IgYWxsIGNvbnRleHRzLCBzdGlsbCBub3QgcmVseWluZyBvbiB0aGlzIGFzc3VtcHRpb25cblx0XHRjb25zdCBtZXRhQ29udGV4dCA9IGNvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKS5nZXRNZXRhQ29udGV4dChjb250ZXh0LmdldENhbm9uaWNhbFBhdGgoKSk7XG5cdFx0Y29uc3QgZGVsZXRhYmxlUGF0aCA9IG1ldGFDb250ZXh0LmdldFByb3BlcnR5KFwiQE9yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuRGVsZXRlUmVzdHJpY3Rpb25zL0RlbGV0YWJsZS8kUGF0aFwiKTtcblx0XHRjb25zdCBzdGF0aWNEZWxldGFibGUgPVxuXHRcdFx0IWRlbGV0YWJsZVBhdGggJiYgbWV0YUNvbnRleHQuZ2V0UHJvcGVydHkoXCJAT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5EZWxldGVSZXN0cmljdGlvbnMvRGVsZXRhYmxlXCIpICE9PSBmYWxzZTtcblx0XHQvLyBkZWZhdWx0IHZhbHVlcyBhY2NvcmRpbmcgdG8gbm9uLWRyYWZ0IGNhc2UgKHN0aWNreSBiZWhhdmVzIHRoZSBzYW1lIGFzIG5vbi1kcmFmdCBmcm9tIFVJIHBvaW50IG9mIHZpZXcgcmVnYXJkaW5nIGRlbGV0aW9uKVxuXHRcdGNvbnN0IGluZm86IGNvbnRleHRJbmZvID0ge1xuXHRcdFx0Y29udGV4dDogY29udGV4dCxcblx0XHRcdGlzRHJhZnRSb290OiAhIW1ldGFDb250ZXh0LmdldFByb3BlcnR5KFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EcmFmdFJvb3RcIiksXG5cdFx0XHRpc0RyYWZ0Tm9kZTogISFtZXRhQ29udGV4dC5nZXRQcm9wZXJ0eShcIkBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnROb2RlXCIpLFxuXHRcdFx0aXNBY3RpdmU6IHRydWUsXG5cdFx0XHRoYXNBY3RpdmU6IGZhbHNlLFxuXHRcdFx0aGFzRHJhZnQ6IGZhbHNlLFxuXHRcdFx0bG9ja2VkOiBmYWxzZSxcblx0XHRcdGRlbGV0YWJsZTogZGVsZXRhYmxlUGF0aCA/IGNvbnRleHQuZ2V0UHJvcGVydHkoZGVsZXRhYmxlUGF0aCkgOiBzdGF0aWNEZWxldGFibGUsXG5cdFx0XHRzaWJsaW5nUHJvbWlzZTogUHJvbWlzZS5yZXNvbHZlKHVuZGVmaW5lZCksXG5cdFx0XHRzaWJsaW5nSW5mbzogdW5kZWZpbmVkLFxuXHRcdFx0c2libGluZ0RlbGV0YWJsZTogZmFsc2Vcblx0XHR9O1xuXG5cdFx0aWYgKGluZm8uaXNEcmFmdFJvb3QpIHtcblx0XHRcdGluZm8ubG9ja2VkID0gISFjb250ZXh0LmdldE9iamVjdChcIkRyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhXCIpPy5JblByb2Nlc3NCeVVzZXI7XG5cdFx0XHRpbmZvLmhhc0RyYWZ0ID0gY29udGV4dC5nZXRQcm9wZXJ0eShcIkhhc0RyYWZ0RW50aXR5XCIpO1xuXHRcdH1cblx0XHRpZiAoaW5mby5pc0RyYWZ0Um9vdCkge1xuXHRcdFx0aW5mby5pc0FjdGl2ZSA9IGNvbnRleHQuZ2V0UHJvcGVydHkoXCJJc0FjdGl2ZUVudGl0eVwiKTtcblx0XHRcdGluZm8uaGFzQWN0aXZlID0gY29udGV4dC5nZXRQcm9wZXJ0eShcIkhhc0FjdGl2ZUVudGl0eVwiKTtcblx0XHRcdGlmICghaW5mby5pc0FjdGl2ZSAmJiBpbmZvLmhhc0FjdGl2ZSkge1xuXHRcdFx0XHQvLyBnZXQgc2libGluZyBjb250ZXh0cyAob25seSByZWxldmFudCBmb3IgZHJhZnQgcm9vdCwgbm90IGZvciBub2Rlcylcblx0XHRcdFx0Ly8gZHJhZnQuY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbiBleHBlY3RzIGRyYWZ0IHJvb3QgYXMgZmlyc3QgcGFyYW1ldGVyIC0gaWYgd2UgYXJlIG9uIGEgc3Vibm9kZSwgdGhpcyBpcyBub3QgZ2l2ZW5cblx0XHRcdFx0Ly8gLSBkb25lIHdyb25nIGFsc28gYWJvdmUsIGJ1dCBzZWVtcyBub3QgdG8gYnJlYWsgYW55dGhpbmdcblx0XHRcdFx0Ly8gLSB3aHkgaXMgZHJhZnQuY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbiBub3QgYWJsZSB0byBjYWxjdWxhdGUgZHJhZnQgcm9vdCBvbiBpdHMgb3duPyFcblx0XHRcdFx0Ly8gLSBhbmQgd2h5IGlzIGl0IG5vdCBhYmxlIHRvIGRlYWwgd2l0aCBjb250ZXh0cyBub3QgZHJhZnQgZW5hYmxlZCAob2YgY291cnNlIHRoZXkgbmV2ZXIgaGF2ZSBhIHNpYmxpbmcgLSBjb3VsZCBqdXN0IHJldHVybiB1bmRlZmluZWQpXG5cdFx0XHRcdGluZm8uc2libGluZ1Byb21pc2UgPSBkcmFmdC5jb21wdXRlU2libGluZ0luZm9ybWF0aW9uKGNvbnRleHQsIGNvbnRleHQpLnRoZW4oYXN5bmMgKHNpYmxpbmdJbmZvcm1hdGlvbikgPT4ge1xuXHRcdFx0XHRcdC8vIEZvciBkcmFmdFdpdGhEZWxldGFibGVBY3RpdmUgYnVja2V0LCBjdXJyZW50bHkgYWxzbyBzaWJsaW5nSW5mb3JtYXRpb24gaXMgcHV0IGludG8gaW50ZXJuYWxNb2RlbCBhbmQgdXNlZFxuXHRcdFx0XHRcdC8vIGZyb20gdGhlcmUgaW4gY2FzZSBvZiBkZWxldGlvbi4gVGhlcmVmb3JlLCBzaWJsaW5nIG5lZWRzIHRvIGJlIHJldHJpZXZlZCBpbiBjYXNlIG9mIHN0YXRpY0RlbGV0YWJsZS5cblx0XHRcdFx0XHQvLyBQb3NzaWJsZSBpbXByb3ZlbWVudDogT25seSByZWFkIHNpYmxpbmdJbmZvIGhlcmUgaWYgbmVlZGVkIGZvciBkZXRlcm1pbmF0aW9uIG9mIGRlbGV0ZSBidXR0b24gZW5hYmxlbWVudCxcblx0XHRcdFx0XHQvLyBpbiBvdGhlciBjYXNlcywgcmVhZCBpdCBvbmx5IGlmIGRlbGV0aW9uIHJlYWxseSBoYXBwZW5zLlxuXHRcdFx0XHRcdGluZm8uc2libGluZ0luZm8gPSBzaWJsaW5nSW5mb3JtYXRpb247XG5cdFx0XHRcdFx0aWYgKGRlbGV0YWJsZVBhdGgpIHtcblx0XHRcdFx0XHRcdGluZm8uc2libGluZ0RlbGV0YWJsZSA9IGF3YWl0IHNpYmxpbmdJbmZvcm1hdGlvbj8udGFyZ2V0Q29udGV4dD8ucmVxdWVzdFByb3BlcnR5KGRlbGV0YWJsZVBhdGgpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRpbmZvLnNpYmxpbmdEZWxldGFibGUgPSBzdGF0aWNEZWxldGFibGU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGluZm87XG5cdH0pO1xuXHQvLyB3YWl0IGZvciBhbGwgc2libGluZ1Byb21pc2VzLiBJZiBubyBzaWJsaW5nIGV4aXN0cywgcHJvbWlzZSBpcyByZXNvbHZlZCB0byB1bmRlZmluZWQgKGJ1dCBpdCdzIHN0aWxsIGEgcHJvbWlzZSlcblx0YXdhaXQgUHJvbWlzZS5hbGwoY29udGV4dEluZm9zLm1hcCgoaW5mbykgPT4gaW5mby5zaWJsaW5nUHJvbWlzZSkpO1xuXG5cdGNvbnN0IGJ1Y2tldHMgPSBbXG5cdFx0e1xuXHRcdFx0a2V5OiBcImRyYWZ0c1dpdGhEZWxldGFibGVBY3RpdmVcIixcblx0XHRcdC8vIG9ubHkgZm9yIGRyYWZ0IHJvb3Q6IEluIHRoYXQgY2FzZSwgdGhlIGRlbGV0ZSByZXF1ZXN0IG5lZWRzIHRvIGJlIHNlbnQgZm9yIHRoZSBhY3RpdmUgKGkuZS4gdGhlIHNpYmxpbmcpLFxuXHRcdFx0Ly8gd2hpbGUgaW4gZHJhZnQgbm9kZSwgdGhlIGRlbGV0ZSByZXF1ZXN0IG5lZWRzIHRvIGJlIHNlbmQgZm9yIHRoZSBkcmFmdCBpdHNlbGZcblx0XHRcdHZhbHVlOiBjb250ZXh0SW5mb3MuZmlsdGVyKChpbmZvKSA9PiBpbmZvLmlzRHJhZnRSb290ICYmICFpbmZvLmlzQWN0aXZlICYmIGluZm8uaGFzQWN0aXZlICYmIGluZm8uc2libGluZ0RlbGV0YWJsZSlcblx0XHR9LFxuXHRcdHtcblx0XHRcdGtleTogXCJkcmFmdHNXaXRoTm9uRGVsZXRhYmxlQWN0aXZlXCIsXG5cdFx0XHQvLyBvbmx5IGZvciBkcmFmdCByb290OiBGb3IgZHJhZnQgbm9kZSwgd2Ugb25seSByZWx5IG9uIGluZm9ybWF0aW9uIGluIHRoZSBkcmFmdCBpdHNlbGYgKG5vdCBpdHMgYWN0aXZlIHNpYmxpbmcpXG5cdFx0XHQvLyBhcHBsaWNhdGlvbiBoYXMgdG8gdGFrZSBjYXJlIHRvIHNldCB0aGlzIGNvcnJlY3RseSAoaW4gY2FzZSBhY3RpdmUgc2libGluZyBtdXN0IG5vdCBiZSBkZWxldGFibGUsIGFjdGl2YXRpb25cblx0XHRcdC8vIG9mIGRyYWZ0IHdpdGggZGVsZXRlZCBub2RlIHdvdWxkIGFsc28gZGVsdGUgYWN0aXZlIHNpYmxpbmcgPT4gZGVsZXRpb24gb2YgZHJhZnQgbm9kZSB0byBiZSBhdm9pZGVkKVxuXHRcdFx0dmFsdWU6IGNvbnRleHRJbmZvcy5maWx0ZXIoKGluZm8pID0+IGluZm8uaXNEcmFmdFJvb3QgJiYgIWluZm8uaXNBY3RpdmUgJiYgaW5mby5oYXNBY3RpdmUgJiYgIWluZm8uc2libGluZ0RlbGV0YWJsZSlcblx0XHR9LFxuXHRcdHsga2V5OiBcImxvY2tlZENvbnRleHRzXCIsIHZhbHVlOiBjb250ZXh0SW5mb3MuZmlsdGVyKChpbmZvKSA9PiBpbmZvLmlzRHJhZnRSb290ICYmIGluZm8uaXNBY3RpdmUgJiYgaW5mby5oYXNEcmFmdCAmJiBpbmZvLmxvY2tlZCkgfSxcblx0XHR7XG5cdFx0XHRrZXk6IFwidW5TYXZlZENvbnRleHRzXCIsXG5cdFx0XHR2YWx1ZTogY29udGV4dEluZm9zLmZpbHRlcigoaW5mbykgPT4gaW5mby5pc0RyYWZ0Um9vdCAmJiBpbmZvLmlzQWN0aXZlICYmIGluZm8uaGFzRHJhZnQgJiYgIWluZm8ubG9ja2VkKVxuXHRcdH0sXG5cdFx0Ly8gbm9uLWRyYWZ0L3N0aWNreSBhbmQgZGVsZXRhYmxlXG5cdFx0Ly8gYWN0aXZlIGRyYWZ0IHJvb3Qgd2l0aG91dCBhbnkgZHJhZnQgYW5kIGRlbGV0YWJsZVxuXHRcdC8vIGNyZWF0ZWQgZHJhZnQgcm9vdCAocmVnYXJkbGVzcyBvZiBkZWxldGFibGUpXG5cdFx0Ly8gZHJhZnQgbm9kZSBvbmx5IGFjY29yZGluZyB0byBpdHMgYW5ub3RhdGlvblxuXHRcdHtcblx0XHRcdGtleTogXCJkZWxldGFibGVDb250ZXh0c1wiLFxuXHRcdFx0dmFsdWU6IGNvbnRleHRJbmZvcy5maWx0ZXIoXG5cdFx0XHRcdChpbmZvKSA9PlxuXHRcdFx0XHRcdCghaW5mby5pc0RyYWZ0Um9vdCAmJiAhaW5mby5pc0RyYWZ0Tm9kZSAmJiBpbmZvLmRlbGV0YWJsZSkgfHxcblx0XHRcdFx0XHQoaW5mby5pc0RyYWZ0Um9vdCAmJiBpbmZvLmlzQWN0aXZlICYmICFpbmZvLmhhc0RyYWZ0ICYmIGluZm8uZGVsZXRhYmxlKSB8fFxuXHRcdFx0XHRcdChpbmZvLmlzRHJhZnRSb290ICYmICFpbmZvLmlzQWN0aXZlICYmICFpbmZvLmhhc0FjdGl2ZSkgfHxcblx0XHRcdFx0XHQoaW5mby5pc0RyYWZ0Tm9kZSAmJiBpbmZvLmRlbGV0YWJsZSlcblx0XHRcdClcblx0XHR9XG5cdF07XG5cblx0Zm9yIChjb25zdCB7IGtleSwgdmFsdWUgfSBvZiBidWNrZXRzKSB7XG5cdFx0aW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXG5cdFx0XHRrZXksXG5cdFx0XHQvLyBDdXJyZW50bHksIGJ1Y2tldCBkcmFmdHNXaXRoRGVsZXRhYmxlQWN0aXZlIGhhcyBhIGRpZmZlcmVudCBzdHJ1Y3R1cmUgKGNvbnRhaW5pbmcgYWxzbyBzaWJsaW5nIGluZm9ybWF0aW9uLCB3aGljaCBpcyB1c2VkXG5cdFx0XHQvLyBpbiBjYXNlIG9mIGRlbGV0aW9uKS4gUG9zc2libGUgaW1wcm92ZW1lbnQ6IFJlYWQgc2libGluZyBpbmZvcm1hdGlvbiBvbmx5IHdoZW4gbmVlZGVkLCBhbmQgYnVpbGQgYWxsIGJ1Y2tldHMgd2l0aCBzYW1lXG5cdFx0XHQvLyBzdHJ1Y3R1cmUuIEhvd2V2ZXIsIGluIHRoYXQgY2FzZSBzaWJsaW5nSW5mb3JtYXRpb24gbWlnaHQgbmVlZCB0byBiZSByZWFkIHR3aWNlIChpZiBhbHJlYWR5IG5lZWRlZCBmb3IgYnV0dG9uIGVuYWJsZW1lbnQpLFxuXHRcdFx0Ly8gdGh1cyBhIGJ1ZmZlciBwcm9iYWJseSB3b3VsZCBtYWtlIHNlbnNlLlxuXHRcdFx0dmFsdWUubWFwKChpbmZvKSA9PlxuXHRcdFx0XHRrZXkgPT09IFwiZHJhZnRzV2l0aERlbGV0YWJsZUFjdGl2ZVwiID8geyBkcmFmdDogaW5mby5jb250ZXh0LCBzaWJsaW5nSW5mbzogaW5mby5zaWJsaW5nSW5mbyB9IDogaW5mby5jb250ZXh0XG5cdFx0XHQpXG5cdFx0KTtcblx0fVxufVxuXG5jb25zdCBkZWxldGVIZWxwZXIgPSB7XG5cdGdldE5vbkRlbGV0YWJsZVRleHQsXG5cdGRlbGV0ZUNvbmZpcm1IYW5kbGVyLFxuXHR1cGRhdGVPcHRpb25zRm9yRGVsZXRhYmxlVGV4dHMsXG5cdHVwZGF0ZUNvbnRlbnRGb3JEZWxldGVEaWFsb2csXG5cdHVwZGF0ZURyYWZ0T3B0aW9uc0ZvckRlbGV0YWJsZVRleHRzLFxuXHRnZXRDb25maXJtZWREZWxldGFibGVDb250ZXh0LFxuXHRnZXRMb2NrZWRPYmplY3RzVGV4dCxcblx0Z2V0VW5zYXZlZENvbnRleHRzVGV4dCxcblx0Z2V0Tm9uRGVsZXRhYmxlQWN0aXZlc09mRHJhZnRzVGV4dCxcblx0YWZ0ZXJEZWxldGVQcm9jZXNzLFxuXHR1cGRhdGVEZWxldGVJbmZvRm9yU2VsZWN0ZWRDb250ZXh0c1xufTtcblxuZXhwb3J0IGRlZmF1bHQgZGVsZXRlSGVscGVyO1xuIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFBQTtBQUFBOzs7OztNQWdCWUEsaUJBQWlCO0VBQUEsV0FBakJBLGlCQUFpQjtJQUFqQkEsaUJBQWlCO0lBQWpCQSxpQkFBaUI7SUFBakJBLGlCQUFpQjtJQUFqQkEsaUJBQWlCO0lBQWpCQSxpQkFBaUI7SUFBakJBLGlCQUFpQjtFQUFBLEdBQWpCQSxpQkFBaUIsS0FBakJBLGlCQUFpQjtFQUFBO0VBQUEsSUFTakJDLDBCQUEwQjtFQUFBLFdBQTFCQSwwQkFBMEI7SUFBMUJBLDBCQUEwQjtJQUExQkEsMEJBQTBCO0VBQUEsR0FBMUJBLDBCQUEwQixLQUExQkEsMEJBQTBCO0VBQUE7RUEyRHRDLFNB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