@sapui5/sap.fe.core 1.111.1 → 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} +290 -362
  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 -948
  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,21 +2,15 @@
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/base/Log", "sap/base/util/array/uniqueSort", "sap/base/util/merge", "sap/fe/core/converters/ConverterContext", "sap/fe/core/converters/helpers/IssueManager", "sap/fe/core/converters/MetaModelConverter", "sap/fe/core/helpers/BindingToolkit", "sap/fe/core/helpers/ModelHelper", "sap/fe/core/helpers/SemanticDateOperators", "sap/fe/core/helpers/StableIdHelper", "sap/fe/core/type/EDM", "sap/fe/core/type/TypeUtil", "sap/fe/macros/ODataMetaModelUtil", "sap/ui/core/Component", "sap/ui/core/Core", "sap/ui/core/Fragment", "sap/ui/core/util/XMLPreprocessor", "sap/ui/core/XMLTemplateProcessor", "sap/ui/Device", "sap/ui/mdc/condition/FilterOperatorUtil", "sap/ui/mdc/condition/RangeOperator", "./controls/AnyElement", "./templating/FilterHelper"], function (Log, uniqueSort, mergeObjects, ConverterContext, IssueManager, MetaModelConverter, BindingToolkit, ModelHelper, SemanticDateOperators, StableIdHelper, EDM, TypeUtil, metaModelUtil, Component, Core, Fragment, XMLPreprocessor, XMLTemplateProcessor, Device, FilterOperatorUtil, RangeOperator, AnyElement, FilterHelper) {
5
+ sap.ui.define(["sap/base/Log", "sap/base/util/array/uniqueSort", "sap/base/util/merge", "sap/fe/core/converters/ConverterContext", "sap/fe/core/converters/MetaModelConverter", "sap/fe/core/helpers/BindingToolkit", "sap/fe/core/helpers/ModelHelper", "sap/fe/core/helpers/SemanticDateOperators", "sap/fe/core/helpers/StableIdHelper", "sap/fe/core/type/TypeUtil", "sap/ui/core/Component", "sap/ui/core/Fragment", "sap/ui/core/util/XMLPreprocessor", "sap/ui/core/XMLTemplateProcessor", "sap/ui/Device", "sap/ui/mdc/condition/FilterOperatorUtil", "sap/ui/mdc/condition/RangeOperator", "sap/ui/model/Filter", "./controls/AnyElement", "./helpers/MetaModelFunction", "./templating/FilterHelper"], function (Log, uniqueSort, mergeObjects, ConverterContext, MetaModelConverter, BindingToolkit, ModelHelper, SemanticDateOperators, StableIdHelper, TypeUtil, Component, Fragment, XMLPreprocessor, XMLTemplateProcessor, Device, FilterOperatorUtil, RangeOperator, Filter, AnyElement, MetaModelFunction, FilterHelper) {
6
6
  "use strict";
7
7
 
8
8
  var _exports = {};
9
9
  var getConditions = FilterHelper.getConditions;
10
10
  var system = Device.system;
11
- var isTypeFilterable = EDM.isTypeFilterable;
12
11
  var generate = StableIdHelper.generate;
13
12
  var pathInModel = BindingToolkit.pathInModel;
14
- var or = BindingToolkit.or;
15
- var not = BindingToolkit.not;
16
13
  var compileExpression = BindingToolkit.compileExpression;
17
- var IssueSeverity = IssueManager.IssueSeverity;
18
- var IssueCategoryType = IssueManager.IssueCategoryType;
19
- var IssueCategory = IssueManager.IssueCategory;
20
14
  function normalizeSearchTerm(sSearchTerm) {
21
15
  if (!sSearchTerm) {
22
16
  return undefined;
@@ -29,42 +23,6 @@ sap.ui.define(["sap/base/Log", "sap/base/util/array/uniqueSort", "sap/base/util/
29
23
  return sNormalized;
30
24
  }, undefined);
31
25
  }
32
- function getPropertyDataType(oNavigationContext) {
33
- let sDataType = oNavigationContext.getProperty("$Type");
34
- // if $kind exists, it's not a DataField and we have the final type already
35
- if (!oNavigationContext.getProperty("$kind")) {
36
- switch (sDataType) {
37
- case "com.sap.vocabularies.UI.v1.DataFieldForAction":
38
- case "com.sap.vocabularies.UI.v1.DataFieldForIntentBasedNavigation":
39
- sDataType = undefined;
40
- break;
41
- case "com.sap.vocabularies.UI.v1.DataField":
42
- case "com.sap.vocabularies.UI.v1.DataFieldWithNavigationPath":
43
- case "com.sap.vocabularies.UI.v1.DataFieldWithUrl":
44
- case "com.sap.vocabularies.UI.v1.DataFieldWithIntentBasedNavigation":
45
- case "com.sap.vocabularies.UI.v1.DataFieldWithAction":
46
- sDataType = oNavigationContext.getProperty("Value/$Path/$Type");
47
- break;
48
- case "com.sap.vocabularies.UI.v1.DataFieldForAnnotation":
49
- default:
50
- const sAnnotationPath = oNavigationContext.getProperty("Target/$AnnotationPath");
51
- if (sAnnotationPath) {
52
- if (sAnnotationPath.indexOf("com.sap.vocabularies.Communication.v1.Contact") > -1) {
53
- sDataType = oNavigationContext.getProperty("Target/$AnnotationPath/fn/$Path/$Type");
54
- } else if (sAnnotationPath.indexOf("com.sap.vocabularies.UI.v1.DataPoint") > -1) {
55
- sDataType = oNavigationContext.getProperty("Value/$Path/$Type");
56
- } else {
57
- // e.g. FieldGroup or Chart
58
- sDataType = undefined;
59
- }
60
- } else {
61
- sDataType = undefined;
62
- }
63
- break;
64
- }
65
- }
66
- return sDataType;
67
- }
68
26
  async function waitForContextRequested(bindingContext) {
69
27
  var _dataModel$targetEnti;
70
28
  const model = bindingContext.getModel();
@@ -84,147 +42,9 @@ sap.ui.define(["sap/base/Log", "sap/base/util/array/uniqueSort", "sap/base/util/
84
42
  }
85
43
  return bHasTransientContexts;
86
44
  }
87
- function getSearchRestrictions(sFullPath, oMetaModelContext) {
88
- let oSearchRestrictions;
89
- let oNavigationSearchRestrictions;
90
- const navigationText = "$NavigationPropertyBinding";
91
- const searchRestrictionsTerm = "@Org.OData.Capabilities.V1.SearchRestrictions";
92
- const entityTypePathParts = sFullPath.replaceAll("%2F", "/").split("/").filter(ModelHelper.filterOutNavPropBinding);
93
- const entitySetPath = ModelHelper.getEntitySetPath(sFullPath, oMetaModelContext);
94
- const entitySetPathParts = entitySetPath.split("/").filter(ModelHelper.filterOutNavPropBinding);
95
- const isContainment = oMetaModelContext.getObject(`/${entityTypePathParts.join("/")}/$ContainsTarget`);
96
- const containmentNavPath = isContainment && entityTypePathParts[entityTypePathParts.length - 1];
97
45
 
98
- //LEAST PRIORITY - Search restrictions directly at Entity Set
99
- //e.g. FR in "NS.EntityContainer/SalesOrderManage" ContextPath: /SalesOrderManage
100
- if (!isContainment) {
101
- oSearchRestrictions = oMetaModelContext.getObject(`${entitySetPath}${searchRestrictionsTerm}`);
102
- }
103
- if (entityTypePathParts.length > 1) {
104
- const navPath = isContainment ? containmentNavPath : entitySetPathParts[entitySetPathParts.length - 1];
105
- // In case of containment we take entitySet provided as parent. And in case of normal we would remove the last navigation from entitySetPath.
106
- const parentEntitySetPath = isContainment ? entitySetPath : `/${entitySetPathParts.slice(0, -1).join(`/${navigationText}/`)}`;
46
+ // there is no navigation in entitySet path and property path
107
47
 
108
- //HIGHEST priority - Navigation restrictions
109
- //e.g. Parent "/Customer" with NavigationPropertyPath="Set" ContextPath: Customer/Set
110
- const oNavigationRestrictions = CommonUtils.getNavigationRestrictions(oMetaModelContext, parentEntitySetPath, navPath.replaceAll("%2F", "/"));
111
- oNavigationSearchRestrictions = oNavigationRestrictions && oNavigationRestrictions["SearchRestrictions"];
112
- }
113
- return oNavigationSearchRestrictions || oSearchRestrictions;
114
- }
115
- function getNavigationRestrictions(oMetaModelContext, sEntitySetPath, sNavigationPath) {
116
- const oNavigationRestrictions = oMetaModelContext.getObject(`${sEntitySetPath}@Org.OData.Capabilities.V1.NavigationRestrictions`);
117
- const aRestrictedProperties = oNavigationRestrictions && oNavigationRestrictions.RestrictedProperties;
118
- return aRestrictedProperties && aRestrictedProperties.find(function (oRestrictedProperty) {
119
- return oRestrictedProperty && oRestrictedProperty.NavigationProperty && oRestrictedProperty.NavigationProperty.$NavigationPropertyPath === sNavigationPath;
120
- });
121
- }
122
- function _isInNonFilterableProperties(metamodelContext, sEntitySetPath, sContextPath) {
123
- let bIsNotFilterable = false;
124
- const oAnnotation = metamodelContext.getObject(`${sEntitySetPath}@Org.OData.Capabilities.V1.FilterRestrictions`);
125
- if (oAnnotation && oAnnotation.NonFilterableProperties) {
126
- bIsNotFilterable = oAnnotation.NonFilterableProperties.some(function (property) {
127
- return property.$NavigationPropertyPath === sContextPath || property.$PropertyPath === sContextPath;
128
- });
129
- }
130
- return bIsNotFilterable;
131
- }
132
- function _isCustomAggregate(metamodelContext, sEntitySetPath, sContextPath) {
133
- let bCustomAggregate = false;
134
- const bApplySupported = metamodelContext !== null && metamodelContext !== void 0 && metamodelContext.getObject(sEntitySetPath + "@Org.OData.Aggregation.V1.ApplySupported") ? true : false;
135
- if (bApplySupported) {
136
- const oAnnotations = metamodelContext.getObject(`${sEntitySetPath}@`);
137
- const oCustomAggreggates = metaModelUtil.getAllCustomAggregates(oAnnotations);
138
- const aCustomAggregates = oCustomAggreggates ? Object.keys(oCustomAggreggates) : undefined;
139
- if (aCustomAggregates && (aCustomAggregates === null || aCustomAggregates === void 0 ? void 0 : aCustomAggregates.indexOf(sContextPath)) > -1) {
140
- bCustomAggregate = true;
141
- }
142
- }
143
- return bCustomAggregate;
144
- }
145
-
146
- // TODO rework this!
147
- function _isContextPathFilterable(oModelContext, sEntitySetPath, sContexPath) {
148
- const sFullPath = `${sEntitySetPath}/${sContexPath}`,
149
- aESParts = sFullPath.split("/").splice(0, 2),
150
- aContext = sFullPath.split("/").splice(2);
151
- let bIsNotFilterable = false,
152
- sContext = "";
153
- sEntitySetPath = aESParts.join("/");
154
- bIsNotFilterable = aContext.some(function (item, index, array) {
155
- if (sContext.length > 0) {
156
- sContext += `/${item}`;
157
- } else {
158
- sContext = item;
159
- }
160
- if (index === array.length - 2) {
161
- // In case of "/Customer/Set/Property" this is to check navigation restrictions of "Customer" for non-filterable properties in "Set"
162
- const oNavigationRestrictions = getNavigationRestrictions(oModelContext, sEntitySetPath, item);
163
- const oFilterRestrictions = oNavigationRestrictions && oNavigationRestrictions.FilterRestrictions;
164
- const aNonFilterableProperties = oFilterRestrictions && oFilterRestrictions.NonFilterableProperties;
165
- const sTargetPropertyPath = array[array.length - 1];
166
- if (aNonFilterableProperties && aNonFilterableProperties.find(function (oPropertyPath) {
167
- return oPropertyPath.$PropertyPath === sTargetPropertyPath;
168
- })) {
169
- return true;
170
- }
171
- }
172
- if (index === array.length - 1) {
173
- //last path segment
174
- bIsNotFilterable = _isInNonFilterableProperties(oModelContext, sEntitySetPath, sContext);
175
- } else if (oModelContext.getObject(`${sEntitySetPath}/$NavigationPropertyBinding/${item}`)) {
176
- //check existing context path and initialize it
177
- bIsNotFilterable = _isInNonFilterableProperties(oModelContext, sEntitySetPath, sContext);
178
- sContext = "";
179
- //set the new EntitySet
180
- sEntitySetPath = `/${oModelContext.getObject(`${sEntitySetPath}/$NavigationPropertyBinding/${item}`)}`;
181
- }
182
- return bIsNotFilterable === true;
183
- });
184
- return bIsNotFilterable;
185
- }
186
-
187
- // TODO check used places and rework this
188
- function isPropertyFilterable(metaModelContext, sEntitySetPath, sProperty, bSkipHiddenFilter) {
189
- var _metaModelContext$get;
190
- if (typeof sProperty !== "string") {
191
- throw new Error("sProperty parameter must be a string");
192
- }
193
- let bIsFilterable;
194
-
195
- // Parameters should be rendered as filterfields
196
- if (((_metaModelContext$get = metaModelContext.getObject(`${sEntitySetPath}/@com.sap.vocabularies.Common.v1.ResultContext`)) === null || _metaModelContext$get === void 0 ? void 0 : _metaModelContext$get.valueOf()) === true) {
197
- return true;
198
- }
199
- const oNavigationContext = metaModelContext.createBindingContext(`${sEntitySetPath}/${sProperty}`);
200
- if (!bSkipHiddenFilter) {
201
- if (oNavigationContext.getProperty("@com.sap.vocabularies.UI.v1.Hidden") === true || oNavigationContext.getProperty("@com.sap.vocabularies.UI.v1.HiddenFilter") === true) {
202
- return false;
203
- }
204
- const sHiddenPath = oNavigationContext.getProperty("@com.sap.vocabularies.UI.v1.Hidden/$Path");
205
- const sHiddenFilterPath = oNavigationContext.getProperty("@com.sap.vocabularies.UI.v1.HiddenFilter/$Path");
206
- if (sHiddenPath && sHiddenFilterPath) {
207
- return compileExpression(not(or(pathInModel(sHiddenPath), pathInModel(sHiddenFilterPath))));
208
- } else if (sHiddenPath) {
209
- return compileExpression(not(pathInModel(sHiddenPath)));
210
- } else if (sHiddenFilterPath) {
211
- return compileExpression(not(pathInModel(sHiddenFilterPath)));
212
- }
213
- }
214
-
215
- // there is no navigation in entitySet path and property path
216
- bIsFilterable = sEntitySetPath.split("/").length === 2 && sProperty.indexOf("/") < 0 ? !_isInNonFilterableProperties(metaModelContext, sEntitySetPath, sProperty) && !_isCustomAggregate(metaModelContext, sEntitySetPath, sProperty) : !_isContextPathFilterable(metaModelContext, sEntitySetPath, sProperty);
217
- // check if type can be used for filtering
218
- if (bIsFilterable && oNavigationContext) {
219
- const sPropertyDataType = getPropertyDataType(oNavigationContext);
220
- if (sPropertyDataType) {
221
- bIsFilterable = sPropertyDataType ? isTypeFilterable(sPropertyDataType) : false;
222
- } else {
223
- bIsFilterable = false;
224
- }
225
- }
226
- return bIsFilterable;
227
- }
228
48
  function getShellServices(oControl) {
229
49
  return getAppComponent(oControl).getShellServices();
230
50
  }
@@ -296,7 +116,28 @@ sap.ui.define(["sap/base/Log", "sap/base/util/array/uniqueSort", "sap/base/util/
296
116
  _getRelatedAppsMenuItems(aLinks, aExcludedActions, oTargetParams, aManifestSOItems, aAllowedActions);
297
117
  }
298
118
  }
299
- async function updateRelateAppsModel(oBindingContext, oEntry, oObjectPageLayout, aSemKeys, oMetaModel, oMetaPath) {
119
+
120
+ /**
121
+ * @description This function fetches the related intents when semantic object and action are passed from feEnvironment.getIntent() only in case of My Inbox integration
122
+ * @param semanticObjectAndAction This specifies the semantic object and action for fetching the intents
123
+ * @param oBindingContext This sepcifies the binding context for updating related apps
124
+ * @param appComponentSOItems This is a list of semantic items used for updating the related apps button
125
+ * @param aLinks This is an array comprising of related intents
126
+ */
127
+
128
+ function _getRelatedIntentsWithSemanticObjectsAndAction(semanticObjectAndAction, oBindingContext, appComponentSOItems, aLinks) {
129
+ if (aLinks.length > 0) {
130
+ const actions = [semanticObjectAndAction.action];
131
+ const excludedActions = [];
132
+ const soMappings = [];
133
+ const targetParams = {
134
+ navigationContexts: oBindingContext,
135
+ semanticObjectMapping: soMappings
136
+ };
137
+ _getRelatedAppsMenuItems(aLinks, excludedActions, targetParams, appComponentSOItems, actions);
138
+ }
139
+ }
140
+ async function updateRelateAppsModel(oBindingContext, oEntry, oObjectPageLayout, aSemKeys, oMetaModel, oMetaPath, appComponent) {
300
141
  const oShellServiceHelper = getShellServices(oObjectPageLayout);
301
142
  const oParam = {};
302
143
  let sCurrentSemObj = "",
@@ -347,6 +188,18 @@ sap.ui.define(["sap/base/Log", "sap/base/util/array/uniqueSort", "sap/base/util/
347
188
  _getRelatedIntents(oManifestData.additionalSemanticObjects[aManifestSOKeys[key]], oBindingContext, aManifestSOItems, semanticObjectIntents);
348
189
  }
349
190
  }
191
+
192
+ // appComponentSOItems is updated in case of My Inbox integration when semantic object and action are passed from feEnvironment.getIntent() method
193
+ // In other cases it remains as an empty list
194
+ // We concat this list towards the end with aManifestSOItems
195
+
196
+ const appComponentSOItems = [];
197
+ const componentData = appComponent.getComponentData();
198
+ if (componentData.feEnvironment && componentData.feEnvironment.getIntent()) {
199
+ const intent = componentData.feEnvironment.getIntent();
200
+ semanticObjectIntents = await Promise.resolve(_getSOIntents(oShellServiceHelper, oObjectPageLayout, intent.semanticObject, oParam));
201
+ _getRelatedIntentsWithSemanticObjectsAndAction(intent, oBindingContext, appComponentSOItems, semanticObjectIntents);
202
+ }
350
203
  const internalModelContext = oObjectPageLayout.getBindingContext("internal");
351
204
  const aLinks = await fnGetParseShellHashAndGetLinks();
352
205
  if (aLinks) {
@@ -370,19 +223,21 @@ sap.ui.define(["sap/base/Log", "sap/base/util/array/uniqueSort", "sap/base/util/
370
223
  oTargetParams.semanticObjectMapping = oSemanticObjectAnnotations.aMappings;
371
224
  _getRelatedAppsMenuItems(aLinks, aExcludedActions, oTargetParams, aAnnotationsSOItems);
372
225
  aManifestSOItems.forEach(function (_ref) {
226
+ var _aAnnotationsSOItems$;
373
227
  let {
374
228
  targetSemObject
375
229
  } = _ref;
376
- if (aAnnotationsSOItems[0].targetSemObject === targetSemObject) {
230
+ if (((_aAnnotationsSOItems$ = aAnnotationsSOItems[0]) === null || _aAnnotationsSOItems$ === void 0 ? void 0 : _aAnnotationsSOItems$.targetSemObject) === targetSemObject) {
377
231
  isSemanticObjectHasSameTargetInManifest = true;
378
232
  }
379
233
  });
380
234
 
381
235
  // remove all actions from current hash application if manifest contains empty allowedActions
382
- if (oManifestData.additionalSemanticObjects && oManifestData.additionalSemanticObjects[aAnnotationsSOItems[0].targetSemObject] && ((_oManifestData$additi = oManifestData.additionalSemanticObjects[aAnnotationsSOItems[0].targetSemObject].allowedActions) === null || _oManifestData$additi === void 0 ? void 0 : _oManifestData$additi.length) === 0) {
236
+ if (oManifestData.additionalSemanticObjects && aAnnotationsSOItems[0] && oManifestData.additionalSemanticObjects[aAnnotationsSOItems[0].targetSemObject] && ((_oManifestData$additi = oManifestData.additionalSemanticObjects[aAnnotationsSOItems[0].targetSemObject].allowedActions) === null || _oManifestData$additi === void 0 ? void 0 : _oManifestData$additi.length) === 0) {
383
237
  isSemanticObjectHasSameTargetInManifest = true;
384
238
  }
385
- aRelatedAppsMenuItems = isSemanticObjectHasSameTargetInManifest ? aManifestSOItems : aManifestSOItems.concat(aAnnotationsSOItems);
239
+ const soItems = aManifestSOItems.concat(appComponentSOItems);
240
+ aRelatedAppsMenuItems = isSemanticObjectHasSameTargetInManifest ? soItems : soItems.concat(aAnnotationsSOItems);
386
241
  // If no app in list, related apps button will be hidden
387
242
  internalModelContext.setProperty("relatedApps/visibility", aRelatedAppsMenuItems.length > 0);
388
243
  internalModelContext.setProperty("relatedApps/items", aRelatedAppsMenuItems);
@@ -427,7 +282,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/array/uniqueSort", "sap/base/util/
427
282
  }
428
283
  return oSemanticObjectAnnotations;
429
284
  }
430
- function fnUpdateRelatedAppsDetails(oObjectPageLayout) {
285
+ function fnUpdateRelatedAppsDetails(oObjectPageLayout, appComponent) {
431
286
  const oMetaModel = oObjectPageLayout.getModel().getMetaModel();
432
287
  const oBindingContext = oObjectPageLayout.getBindingContext();
433
288
  const path = oBindingContext && oBindingContext.getPath() || "";
@@ -440,12 +295,12 @@ sap.ui.define(["sap/base/Log", "sap/base/util/array/uniqueSort", "sap/base/util/
440
295
  const oEntry = oBindingContext === null || oBindingContext === void 0 ? void 0 : oBindingContext.getObject();
441
296
  if (!oEntry && oBindingContext) {
442
297
  oBindingContext.requestObject().then(async function (requestedObject) {
443
- return updateRelateAppsModel(oBindingContext, requestedObject, oObjectPageLayout, aSemKeys, oMetaModel, oMetaPath);
298
+ return CommonUtils.updateRelateAppsModel(oBindingContext, requestedObject, oObjectPageLayout, aSemKeys, oMetaModel, oMetaPath, appComponent);
444
299
  }).catch(function (oError) {
445
300
  Log.error("Cannot update the related app details", oError);
446
301
  });
447
302
  } else {
448
- return updateRelateAppsModel(oBindingContext, oEntry, oObjectPageLayout, aSemKeys, oMetaModel, oMetaPath);
303
+ return CommonUtils.updateRelateAppsModel(oBindingContext, oEntry, oObjectPageLayout, aSemKeys, oMetaModel, oMetaPath, appComponent);
449
304
  }
450
305
  }
451
306
 
@@ -614,6 +469,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/array/uniqueSort", "sap/base/util/
614
469
  shellNavigationNotAvailable: !(aLink && aLink.length === 1)
615
470
  });
616
471
  }
472
+ return;
617
473
  }).catch(function (oError) {
618
474
  Log.error("Cannot retrieve the links from the shell service", oError);
619
475
  });
@@ -631,44 +487,8 @@ sap.ui.define(["sap/base/Log", "sap/base/util/array/uniqueSort", "sap/base/util/
631
487
  fnGetLinks();
632
488
  }
633
489
  }
634
- function getTranslatedText(sFrameworkKey, oResourceBundle, parameters, sEntitySetName) {
635
- let sResourceKey = sFrameworkKey;
636
- if (oResourceBundle) {
637
- if (sEntitySetName) {
638
- // There are console errors logged when making calls to getText for keys that are not defined in the resource bundle
639
- // for instance keys which are supposed to be provided by the application, e.g, <key>|<entitySet> to override instance specific text
640
- // hence check if text exists (using "hasText") in the resource bundle before calling "getText"
641
-
642
- // "hasText" only checks for the key in the immediate resource bundle and not it's custom bundles
643
- // hence we need to do this recurrsively to check if the key exists in any of the bundles the forms the FE resource bundle
644
- const bResourceKeyExists = checkIfResourceKeyExists(oResourceBundle.aCustomBundles, `${sFrameworkKey}|${sEntitySetName}`);
645
-
646
- // if resource key with entity set name for instance specific text overriding is provided by the application
647
- // then use the same key otherwise use the Framework key
648
- sResourceKey = bResourceKeyExists ? `${sFrameworkKey}|${sEntitySetName}` : sFrameworkKey;
649
- }
650
- return oResourceBundle.getText(sResourceKey, parameters);
651
- }
652
-
653
- // do not allow override so get text from the internal bundle directly
654
- oResourceBundle = Core.getLibraryResourceBundle("sap.fe.core");
655
- return oResourceBundle.getText(sResourceKey, parameters);
656
- }
657
- function checkIfResourceKeyExists(aCustomBundles, sKey) {
658
- if (aCustomBundles.length) {
659
- for (let i = aCustomBundles.length - 1; i >= 0; i--) {
660
- const sValue = aCustomBundles[i].hasText(sKey);
661
- // text found return true
662
- if (sValue) {
663
- return true;
664
- }
665
- checkIfResourceKeyExists(aCustomBundles[i].aCustomBundles, sKey);
666
- }
667
- }
668
- return false;
669
- }
670
- function getActionPath(actionContext, bReturnOnlyPath, sActionName, bCheckStaticValue) {
671
- sActionName = !sActionName ? actionContext.getObject(actionContext.getPath()).toString() : sActionName;
490
+ function getActionPath(actionContext, bReturnOnlyPath, inActionName, bCheckStaticValue) {
491
+ const sActionName = !inActionName ? actionContext.getObject(actionContext.getPath()).toString() : inActionName;
672
492
  let sContextPath = actionContext.getPath().split("/@")[0];
673
493
  const sEntityTypeName = actionContext.getObject(sContextPath).$Type;
674
494
  const sEntityName = getEntitySetName(actionContext.getModel(), sEntityTypeName);
@@ -737,13 +557,13 @@ sap.ui.define(["sap/base/Log", "sap/base/util/array/uniqueSort", "sap/base/util/
737
557
  }
738
558
  async function requestProperty(oSelectedContext, sAction, sProperty, sDynamicActionEnabledPath) {
739
559
  const oPromise = sProperty && sProperty.indexOf("/") === 0 ? requestSingletonProperty(sProperty, oSelectedContext.getModel()) : _requestObject(sAction, oSelectedContext, sProperty);
740
- return oPromise.then(async function (vPropertyValue) {
741
- return Promise.resolve({
560
+ return oPromise.then(function (vPropertyValue) {
561
+ return {
742
562
  vPropertyValue: vPropertyValue,
743
563
  oSelectedContext: oSelectedContext,
744
564
  sAction: sAction,
745
565
  sDynamicActionEnabledPath: sDynamicActionEnabledPath
746
- });
566
+ };
747
567
  });
748
568
  }
749
569
  async function setContextsBasedOnOperationAvailable(oInternalModelContext, aRequestPromises) {
@@ -763,6 +583,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/array/uniqueSort", "sap/base/util/
763
583
  });
764
584
  setDynamicActionContexts(oInternalModelContext, aResults[0].sAction, aApplicableContexts, aNotApplicableContexts);
765
585
  }
586
+ return;
766
587
  }).catch(function (oError) {
767
588
  Log.trace("Cannot retrieve property value from path", oError);
768
589
  });
@@ -982,7 +803,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/array/uniqueSort", "sap/base/util/
982
803
  aSelectOptions,
983
804
  aValidOperators,
984
805
  aSemanticDateOperators = [];
985
- if (isParameter || CommonUtils.isPropertyFilterable(metaModelContext, sContextPath, sConditionProp, true)) {
806
+ if (isParameter || MetaModelFunction.isPropertyFilterable(metaModelContext, sContextPath, sConditionProp, true)) {
986
807
  const oPropertyMetadata = oValidProperties[sConditionProp];
987
808
  aSelectOptions = oSelectionVariant.getSelectOption(sSelectOptionProp);
988
809
  const settings = getFilterConfigurationSetting(oViewData, sConditionProp);
@@ -1334,118 +1155,6 @@ sap.ui.define(["sap/base/Log", "sap/base/util/array/uniqueSort", "sap/base/util/
1334
1155
  }
1335
1156
  }
1336
1157
  }
1337
- function getNonComputedVisibleFields(metaModelContext, sPath, oView) {
1338
- const aTechnicalKeys = metaModelContext.getObject(`${sPath}/`).$Key;
1339
- const aNonComputedVisibleFields = [];
1340
- const aImmutableVisibleFields = [];
1341
- const oEntityType = metaModelContext.getObject(`${sPath}/`);
1342
- for (const item in oEntityType) {
1343
- if (oEntityType[item].$kind && oEntityType[item].$kind === "Property") {
1344
- const oAnnotations = metaModelContext.getObject(`${sPath}/${item}@`) || {},
1345
- bIsKey = aTechnicalKeys.indexOf(item) > -1,
1346
- bIsImmutable = oAnnotations["@Org.OData.Core.V1.Immutable"],
1347
- bIsNonComputed = !oAnnotations["@Org.OData.Core.V1.Computed"],
1348
- bIsVisible = !oAnnotations["@com.sap.vocabularies.UI.v1.Hidden"],
1349
- bIsComputedDefaultValue = oAnnotations["@Org.OData.Core.V1.ComputedDefaultValue"],
1350
- bIsKeyComputedDefaultValueWithText = bIsKey && oEntityType[item].$Type === "Edm.Guid" ? bIsComputedDefaultValue && oAnnotations["@com.sap.vocabularies.Common.v1.Text"] : false;
1351
- if ((bIsKeyComputedDefaultValueWithText || bIsKey && oEntityType[item].$Type !== "Edm.Guid") && bIsNonComputed && bIsVisible) {
1352
- aNonComputedVisibleFields.push(item);
1353
- } else if (bIsImmutable && bIsNonComputed && bIsVisible) {
1354
- aImmutableVisibleFields.push(item);
1355
- }
1356
- if (!bIsNonComputed && bIsComputedDefaultValue && oView) {
1357
- var _IssueCategoryType$An;
1358
- const oDiagnostics = getAppComponent(oView).getDiagnostics();
1359
- const sMessage = "Core.ComputedDefaultValue is ignored as Core.Computed is already set to true";
1360
- oDiagnostics.addIssue(IssueCategory.Annotation, IssueSeverity.Medium, sMessage, IssueCategoryType, IssueCategoryType === null || IssueCategoryType === void 0 ? void 0 : (_IssueCategoryType$An = IssueCategoryType.Annotations) === null || _IssueCategoryType$An === void 0 ? void 0 : _IssueCategoryType$An.IgnoredAnnotation);
1361
- }
1362
- }
1363
- }
1364
- const aRequiredProperties = CommonUtils.getRequiredPropertiesFromInsertRestrictions(sPath, metaModelContext);
1365
- if (aRequiredProperties.length) {
1366
- aRequiredProperties.forEach(function (sProperty) {
1367
- const oAnnotations = metaModelContext.getObject(`${sPath}/${sProperty}@`),
1368
- bIsVisible = !oAnnotations || !oAnnotations["@com.sap.vocabularies.UI.v1.Hidden"];
1369
- if (bIsVisible && aNonComputedVisibleFields.indexOf(sProperty) === -1 && aImmutableVisibleFields.indexOf(sProperty) === -1) {
1370
- aNonComputedVisibleFields.push(sProperty);
1371
- }
1372
- });
1373
- }
1374
- return aNonComputedVisibleFields.concat(aImmutableVisibleFields);
1375
- }
1376
- function getRequiredProperties(sPath, metaModelContext) {
1377
- let bCheckUpdateRestrictions = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
1378
- const aRequiredProperties = [];
1379
- let aRequiredPropertiesWithPaths = [];
1380
- const navigationText = "$NavigationPropertyBinding";
1381
- let oEntitySetAnnotations;
1382
- if (sPath.endsWith("$")) {
1383
- // if sPath comes with a $ in the end, removing it as it is of no significance
1384
- sPath = sPath.replace("/$", "");
1385
- }
1386
- const entityTypePathParts = sPath.replaceAll("%2F", "/").split("/").filter(ModelHelper.filterOutNavPropBinding);
1387
- const entitySetPath = ModelHelper.getEntitySetPath(sPath, metaModelContext);
1388
- const entitySetPathParts = entitySetPath.split("/").filter(ModelHelper.filterOutNavPropBinding);
1389
- const isContainment = metaModelContext.getObject(`/${entityTypePathParts.join("/")}/$ContainsTarget`);
1390
- const containmentNavPath = isContainment && entityTypePathParts[entityTypePathParts.length - 1];
1391
-
1392
- //Restrictions directly at Entity Set
1393
- //e.g. FR in "NS.EntityContainer/SalesOrderManage" ContextPath: /SalesOrderManage
1394
- if (!isContainment) {
1395
- oEntitySetAnnotations = metaModelContext.getObject(`${entitySetPath}@`);
1396
- }
1397
- if (entityTypePathParts.length > 1) {
1398
- const navPath = isContainment ? containmentNavPath : entitySetPathParts[entitySetPathParts.length - 1];
1399
- const parentEntitySetPath = isContainment ? entitySetPath : `/${entitySetPathParts.slice(0, -1).join(`/${navigationText}/`)}`;
1400
- //Navigation restrictions
1401
- //e.g. Parent "/Customer" with NavigationPropertyPath="Set" ContextPath: Customer/Set
1402
- const oNavRest = CommonUtils.getNavigationRestrictions(metaModelContext, parentEntitySetPath, navPath.replaceAll("%2F", "/"));
1403
- if (oNavRest !== undefined && CommonUtils.hasRestrictedPropertiesInAnnotations(oNavRest, true, bCheckUpdateRestrictions)) {
1404
- aRequiredPropertiesWithPaths = bCheckUpdateRestrictions ? oNavRest["UpdateRestrictions"].RequiredProperties || [] : oNavRest["InsertRestrictions"].RequiredProperties || [];
1405
- }
1406
- if ((!aRequiredPropertiesWithPaths || !aRequiredPropertiesWithPaths.length) && CommonUtils.hasRestrictedPropertiesInAnnotations(oEntitySetAnnotations, false, bCheckUpdateRestrictions)) {
1407
- aRequiredPropertiesWithPaths = CommonUtils.getRequiredPropertiesFromAnnotations(oEntitySetAnnotations, bCheckUpdateRestrictions);
1408
- }
1409
- } else if (CommonUtils.hasRestrictedPropertiesInAnnotations(oEntitySetAnnotations, false, bCheckUpdateRestrictions)) {
1410
- aRequiredPropertiesWithPaths = CommonUtils.getRequiredPropertiesFromAnnotations(oEntitySetAnnotations, bCheckUpdateRestrictions);
1411
- }
1412
- aRequiredPropertiesWithPaths.forEach(function (oRequiredProperty) {
1413
- const sProperty = oRequiredProperty.$PropertyPath;
1414
- aRequiredProperties.push(sProperty);
1415
- });
1416
- return aRequiredProperties;
1417
- }
1418
- function getRequiredPropertiesFromInsertRestrictions(sPath, oMetaModelContext) {
1419
- return CommonUtils.getRequiredProperties(sPath, oMetaModelContext);
1420
- }
1421
- function getRequiredPropertiesFromUpdateRestrictions(sPath, oMetaModelContext) {
1422
- return CommonUtils.getRequiredProperties(sPath, oMetaModelContext, true);
1423
- }
1424
- function getRequiredPropertiesFromAnnotations(oAnnotations) {
1425
- var _oAnnotations$OrgOD2;
1426
- let bCheckUpdateRestrictions = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
1427
- if (bCheckUpdateRestrictions) {
1428
- var _oAnnotations$OrgOD;
1429
- return ((_oAnnotations$OrgOD = oAnnotations["@Org.OData.Capabilities.V1.UpdateRestrictions"]) === null || _oAnnotations$OrgOD === void 0 ? void 0 : _oAnnotations$OrgOD.RequiredProperties) || [];
1430
- }
1431
- return ((_oAnnotations$OrgOD2 = oAnnotations["@Org.OData.Capabilities.V1.InsertRestrictions"]) === null || _oAnnotations$OrgOD2 === void 0 ? void 0 : _oAnnotations$OrgOD2.RequiredProperties) || [];
1432
- }
1433
- function hasRestrictedPropertiesInAnnotations(oAnnotations) {
1434
- let bIsNavigationRestrictions = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
1435
- let bCheckUpdateRestrictions = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
1436
- if (bIsNavigationRestrictions) {
1437
- const oNavAnnotations = oAnnotations;
1438
- if (bCheckUpdateRestrictions) {
1439
- return oNavAnnotations && oNavAnnotations["UpdateRestrictions"] && oNavAnnotations["UpdateRestrictions"].RequiredProperties ? true : false;
1440
- }
1441
- return oNavAnnotations && oNavAnnotations["InsertRestrictions"] && oNavAnnotations["InsertRestrictions"].RequiredProperties ? true : false;
1442
- } else if (bCheckUpdateRestrictions) {
1443
- const oEntityAnnotation = oAnnotations;
1444
- return oEntityAnnotation && oEntityAnnotation["@Org.OData.Capabilities.V1.UpdateRestrictions"] && oEntityAnnotation["@Org.OData.Capabilities.V1.UpdateRestrictions"].RequiredProperties ? true : false;
1445
- }
1446
- const oEntityAnnotation = oAnnotations;
1447
- return oEntityAnnotation && oEntityAnnotation["@Org.OData.Capabilities.V1.InsertRestrictions"] && oEntityAnnotation["@Org.OData.Capabilities.V1.InsertRestrictions"].RequiredProperties ? true : false;
1448
- }
1449
1158
  async function setUserDefaults(oAppComponent, aParameters, oModel, bIsAction, bIsCreate, oActionDefaultValues) {
1450
1159
  return new Promise(function (resolve) {
1451
1160
  const oComponentData = oAppComponent.getComponentData(),
@@ -1480,8 +1189,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/array/uniqueSort", "sap/base/util/
1480
1189
  } else if (oStartupParameters[sParameterName]) {
1481
1190
  oModel.setProperty(sPropertyName, oStartupParameters[sParameterName][0]);
1482
1191
  } else if (aExtendedParameters.length > 0) {
1483
- for (const i in aExtendedParameters) {
1484
- const oExtendedParameter = aExtendedParameters[i];
1192
+ for (const oExtendedParameter of aExtendedParameters) {
1485
1193
  if (oExtendedParameter.PropertyName === sParameterName) {
1486
1194
  const oRange = oExtendedParameter.Ranges.length ? oExtendedParameter.Ranges[oExtendedParameter.Ranges.length - 1] : undefined;
1487
1195
  if (oRange && oRange.Sign === "I" && oRange.Option === "EQ") {
@@ -1677,6 +1385,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/array/uniqueSort", "sap/base/util/
1677
1385
  oInternalModelContext.setProperty("semanticsTargets", mergeObjects(oFinalSemanticObjects, oInternalModelContext.getProperty("semanticsTargets")));
1678
1386
  return oFinalSemanticObjects;
1679
1387
  }
1388
+ return;
1680
1389
  }).catch(function (oError) {
1681
1390
  Log.error("fnUpdateSemanticTargetsModel: Cannot read links", oError);
1682
1391
  });
@@ -1705,9 +1414,9 @@ sap.ui.define(["sap/base/Log", "sap/base/util/array/uniqueSort", "sap/base/util/
1705
1414
  return list;
1706
1415
  }
1707
1416
  if (obj instanceof Array) {
1708
- for (const i in obj) {
1709
- list = list.concat(_fnfindValuesHelper(obj[i], key, []));
1710
- }
1417
+ obj.forEach(item => {
1418
+ list = list.concat(_fnfindValuesHelper(item, key, []));
1419
+ });
1711
1420
  return list;
1712
1421
  }
1713
1422
  if (obj[key]) {
@@ -1844,7 +1553,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/array/uniqueSort", "sap/base/util/
1844
1553
  const entitySetPath = ModelHelper.getEntitySetPath(entityPath, oContext);
1845
1554
  const entitySetPathParts = entitySetPath.split("/").filter(ModelHelper.filterOutNavPropBinding);
1846
1555
  const isContainment = oContext.getObject(`${entityTypePath}$ContainsTarget`);
1847
- const containmentNavPath = isContainment && entityTypePathParts[entityTypePathParts.length - 1];
1556
+ const containmentNavPath = !!isContainment && entityTypePathParts[entityTypePathParts.length - 1];
1848
1557
 
1849
1558
  //LEAST PRIORITY - Filter restrictions directly at Entity Set
1850
1559
  //e.g. FR in "NS.EntityContainer/SalesOrderManage" ContextPath: /SalesOrderManage
@@ -1889,7 +1598,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/array/uniqueSort", "sap/base/util/
1889
1598
 
1890
1599
  //SECOND HIGHEST priority - Navigation restrictions
1891
1600
  //e.g. Parent "/Customer" with NavigationPropertyPath="Set" ContextPath: Customer/Set
1892
- const oNavRestrictions = CommonUtils.getNavigationRestrictions(oContext, parentEntitySetPath, navPath.replaceAll("%2F", "/"));
1601
+ const oNavRestrictions = MetaModelFunction.getNavigationRestrictions(oContext, parentEntitySetPath, navPath.replaceAll("%2F", "/"));
1893
1602
  const oNavFilterRest = oNavRestrictions && oNavRestrictions["FilterRestrictions"];
1894
1603
  const navResReqProps = getFilterRestrictions(oNavFilterRest, "RequiredProperties") || [];
1895
1604
  oRet.RequiredProperties = uniqueSort(oRet.RequiredProperties.concat(navResReqProps));
@@ -1925,7 +1634,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/array/uniqueSort", "sap/base/util/
1925
1634
  }).then(async function (oFragment) {
1926
1635
  const oControl = oFragment.firstElementChild;
1927
1636
  if (!!oOptions.isXML && oControl) {
1928
- return Promise.resolve(oControl);
1637
+ return oControl;
1929
1638
  }
1930
1639
  return Fragment.load({
1931
1640
  id: oOptions.id,
@@ -1984,6 +1693,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/array/uniqueSort", "sap/base/util/
1984
1693
  oControl.innerChartBound().then(function () {
1985
1694
  oBindingInfo = oControl.getControlDelegate()._getChart(oControl).getBindingInfo("data");
1986
1695
  setBindingInfo();
1696
+ return;
1987
1697
  }).catch(function (sError) {
1988
1698
  Log.error(sError);
1989
1699
  });
@@ -2048,12 +1758,98 @@ sap.ui.define(["sap/base/Log", "sap/base/util/array/uniqueSort", "sap/base/util/
2048
1758
  function isSmallDevice() {
2049
1759
  return !system.desktop || Device.resize.width <= 320;
2050
1760
  }
1761
+ /**
1762
+ * Get filter information for a SelectionVariant annotation.
1763
+ *
1764
+ * @param oControl The table/chart instance
1765
+ * @param selectionVariantPath Relative SelectionVariant annotation path
1766
+ * @param isChart
1767
+ * @returns Information on filters
1768
+ * filters: array of sap.ui.model.filters
1769
+ * text: Text property of the SelectionVariant
1770
+ * @private
1771
+ * @ui5-restricted
1772
+ */
1773
+
1774
+ function getFiltersInfoForSV(oControl, selectionVariantPath, isChart) {
1775
+ const sEntityTypePath = oControl.data("entityType"),
1776
+ oMetaModel = CommonUtils.getAppComponent(oControl).getMetaModel(),
1777
+ mPropertyFilters = {},
1778
+ aFilters = [],
1779
+ aPaths = [];
1780
+ let sText = "";
1781
+ let oSelectionVariant = oMetaModel.getObject(`${sEntityTypePath}${selectionVariantPath}`);
1782
+ // for chart the structure varies hence read it from main object
1783
+ if (isChart) {
1784
+ oSelectionVariant = oSelectionVariant.SelectionVariant;
1785
+ }
1786
+ if (oSelectionVariant) {
1787
+ sText = oSelectionVariant.Text;
1788
+ (oSelectionVariant.SelectOptions || []).filter(function (oSelectOption) {
1789
+ return oSelectOption && oSelectOption.PropertyName && oSelectOption.PropertyName.$PropertyPath;
1790
+ }).forEach(function (oSelectOption) {
1791
+ const sPath = oSelectOption.PropertyName.$PropertyPath;
1792
+ if (!aPaths.includes(sPath)) {
1793
+ aPaths.push(sPath);
1794
+ }
1795
+ for (const j in oSelectOption.Ranges) {
1796
+ var _oRange$Option, _oRange$Option$$EnumM;
1797
+ const oRange = oSelectOption.Ranges[j];
1798
+ mPropertyFilters[sPath] = (mPropertyFilters[sPath] || []).concat(new Filter(sPath, (_oRange$Option = oRange.Option) === null || _oRange$Option === void 0 ? void 0 : (_oRange$Option$$EnumM = _oRange$Option.$EnumMember) === null || _oRange$Option$$EnumM === void 0 ? void 0 : _oRange$Option$$EnumM.split("/").pop(), oRange.Low, oRange.High));
1799
+ }
1800
+ });
1801
+ for (const sPropertyPath in mPropertyFilters) {
1802
+ aFilters.push(new Filter({
1803
+ filters: mPropertyFilters[sPropertyPath],
1804
+ and: false
1805
+ }));
1806
+ }
1807
+ }
1808
+ return {
1809
+ properties: aPaths,
1810
+ filters: aFilters,
1811
+ text: sText
1812
+ };
1813
+ }
2051
1814
  function getConverterContextForPath(sMetaPath, oMetaModel, sEntitySet, oDiagnostics) {
2052
1815
  const oContext = oMetaModel.createBindingContext(sMetaPath);
2053
1816
  return ConverterContext === null || ConverterContext === void 0 ? void 0 : ConverterContext.createConverterContextForMacro(sEntitySet, oContext || oMetaModel, oDiagnostics, mergeObjects, undefined);
2054
1817
  }
1818
+
1819
+ /**
1820
+ * This function returns an ID which should be used in the internal chart for the measure or dimension.
1821
+ * For standard cases, this is just the ID of the property.
1822
+ * If it is necessary to use another ID internally inside the chart (e.g. on duplicate property IDs) this method can be overwritten.
1823
+ * In this case, <code>getPropertyFromNameAndKind</code> needs to be overwritten as well.
1824
+ *
1825
+ * @param name ID of the property
1826
+ * @param kind Type of the property (measure or dimension)
1827
+ * @returns Internal ID for the sap.chart.Chart
1828
+ * @private
1829
+ * @ui5-restricted
1830
+ */
1831
+ function getInternalChartNameFromPropertyNameAndKind(name, kind) {
1832
+ return name.replace("_fe_" + kind + "_", "");
1833
+ }
1834
+
1835
+ /**
1836
+ * This function returns an array of chart properties by remvoing _fe_groupable prefix.
1837
+ *
1838
+ * @param {Array} aFilters Chart filter properties
1839
+ * @returns Chart properties without prefixes
1840
+ * @private
1841
+ * @ui5-restricted
1842
+ */
1843
+
1844
+ function getChartPropertiesWithoutPrefixes(aFilters) {
1845
+ aFilters.forEach(element => {
1846
+ if (element.sPath && element.sPath.includes("fe_groupable")) {
1847
+ element.sPath = CommonUtils.getInternalChartNameFromPropertyNameAndKind(element.sPath, "groupable");
1848
+ }
1849
+ });
1850
+ return aFilters;
1851
+ }
2055
1852
  const CommonUtils = {
2056
- isPropertyFilterable: isPropertyFilterable,
2057
1853
  isFieldControlPathInapplicable: isFieldControlPathInapplicable,
2058
1854
  removeSensitiveData: removeSensitiveData,
2059
1855
  fireButtonPress: fnFireButtonPress,
@@ -2067,7 +1863,6 @@ sap.ui.define(["sap/base/Log", "sap/base/util/array/uniqueSort", "sap/base/util/
2067
1863
  getContextPathProperties: fnGetContextPathProperties,
2068
1864
  getParameterInfo: getParameterInfo,
2069
1865
  updateDataFieldForIBNButtonsVisibility: fnUpdateDataFieldForIBNButtonsVisibility,
2070
- getTranslatedText: getTranslatedText,
2071
1866
  getEntitySetName: getEntitySetName,
2072
1867
  getActionPath: getActionPath,
2073
1868
  computeDisplayMode: computeDisplayMode,
@@ -2079,7 +1874,6 @@ sap.ui.define(["sap/base/Log", "sap/base/util/array/uniqueSort", "sap/base/util/
2079
1874
  addExternalStateFiltersToSelectionVariant: addExternalStateFiltersToSelectionVariant,
2080
1875
  addPageContextToSelectionVariant: addPageContextToSelectionVariant,
2081
1876
  addDefaultDisplayCurrency: addDefaultDisplayCurrency,
2082
- getNonComputedVisibleFields: getNonComputedVisibleFields,
2083
1877
  setUserDefaults: setUserDefaults,
2084
1878
  getShellServices: getShellServices,
2085
1879
  getHash: getHash,
@@ -2091,10 +1885,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/array/uniqueSort", "sap/base/util/
2091
1885
  getSemanticTargetsFromPageModel: fnGetSemanticTargetsFromPageModel,
2092
1886
  getSemanticObjectsFromPath: fnGetSemanticObjectsFromPath,
2093
1887
  updateSemanticTargets: fnUpdateSemanticTargetsModel,
2094
- getPropertyDataType: getPropertyDataType,
2095
1888
  waitForContextRequested: waitForContextRequested,
2096
- getNavigationRestrictions: getNavigationRestrictions,
2097
- getSearchRestrictions: getSearchRestrictions,
2098
1889
  getFilterRestrictionsByPath: getFilterRestrictionsByPath,
2099
1890
  getSpecificAllowedExpression: getSpecificAllowedExpression,
2100
1891
  getAdditionalParamsForCreate: getAdditionalParamsForCreate,
@@ -2109,12 +1900,6 @@ sap.ui.define(["sap/base/Log", "sap/base/util/array/uniqueSort", "sap/base/util/
2109
1900
  AllowedExpressionsPrio: ["SingleValue", "MultiValue", "SingleRange", "MultiRange", "SearchExpression", "MultiRangeOrSearchExpression"],
2110
1901
  normalizeSearchTerm: normalizeSearchTerm,
2111
1902
  getSingletonPath: getSingletonPath,
2112
- getRequiredPropertiesFromUpdateRestrictions: getRequiredPropertiesFromUpdateRestrictions,
2113
- getRequiredPropertiesFromInsertRestrictions: getRequiredPropertiesFromInsertRestrictions,
2114
- hasRestrictedPropertiesInAnnotations: hasRestrictedPropertiesInAnnotations,
2115
- getRequiredPropertiesFromAnnotations: getRequiredPropertiesFromAnnotations,
2116
- getRequiredProperties: getRequiredProperties,
2117
- checkIfResourceKeyExists: checkIfResourceKeyExists,
2118
1903
  setContextsBasedOnOperationAvailable: setContextsBasedOnOperationAvailable,
2119
1904
  setDynamicActionContexts: setDynamicActionContexts,
2120
1905
  requestProperty: requestProperty,
@@ -2126,10 +1911,12 @@ sap.ui.define(["sap/base/Log", "sap/base/util/array/uniqueSort", "sap/base/util/
2126
1911
  createSemanticDatesFromConditions: createSemanticDatesFromConditions,
2127
1912
  updateRelateAppsModel: updateRelateAppsModel,
2128
1913
  getSemanticObjectAnnotations: _getSemanticObjectAnnotations,
2129
- isCustomAggregate: _isCustomAggregate,
1914
+ getFiltersInfoForSV: getFiltersInfoForSV,
1915
+ getInternalChartNameFromPropertyNameAndKind: getInternalChartNameFromPropertyNameAndKind,
1916
+ getChartPropertiesWithoutPrefixes: getChartPropertiesWithoutPrefixes,
2130
1917
  isSmallDevice,
2131
1918
  getConverterContextForPath
2132
1919
  };
2133
1920
  return CommonUtils;
2134
1921
  }, false);
2135
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJub3JtYWxpemVTZWFyY2hUZXJtIiwic1NlYXJjaFRlcm0iLCJ1bmRlZmluZWQiLCJyZXBsYWNlIiwic3BsaXQiLCJyZWR1Y2UiLCJzTm9ybWFsaXplZCIsInNDdXJyZW50V29yZCIsImdldFByb3BlcnR5RGF0YVR5cGUiLCJvTmF2aWdhdGlvbkNvbnRleHQiLCJzRGF0YVR5cGUiLCJnZXRQcm9wZXJ0eSIsInNBbm5vdGF0aW9uUGF0aCIsImluZGV4T2YiLCJ3YWl0Rm9yQ29udGV4dFJlcXVlc3RlZCIsImJpbmRpbmdDb250ZXh0IiwibW9kZWwiLCJnZXRNb2RlbCIsIm1ldGFNb2RlbCIsImdldE1ldGFNb2RlbCIsImVudGl0eVBhdGgiLCJnZXRNZXRhUGF0aCIsImdldFBhdGgiLCJkYXRhTW9kZWwiLCJNZXRhTW9kZWxDb252ZXJ0ZXIiLCJnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMiLCJnZXRDb250ZXh0IiwicmVxdWVzdFByb3BlcnR5IiwidGFyZ2V0RW50aXR5VHlwZSIsImtleXMiLCJuYW1lIiwiZm5IYXNUcmFuc2llbnRDb250ZXh0cyIsIm9MaXN0QmluZGluZyIsImJIYXNUcmFuc2llbnRDb250ZXh0cyIsImdldEN1cnJlbnRDb250ZXh0cyIsImZvckVhY2giLCJvQ29udGV4dCIsImlzVHJhbnNpZW50IiwiZ2V0U2VhcmNoUmVzdHJpY3Rpb25zIiwic0Z1bGxQYXRoIiwib01ldGFNb2RlbENvbnRleHQiLCJvU2VhcmNoUmVzdHJpY3Rpb25zIiwib05hdmlnYXRpb25TZWFyY2hSZXN0cmljdGlvbnMiLCJuYXZpZ2F0aW9uVGV4dCIsInNlYXJjaFJlc3RyaWN0aW9uc1Rlcm0iLCJlbnRpdHlUeXBlUGF0aFBhcnRzIiwicmVwbGFjZUFsbCIsImZpbHRlciIsIk1vZGVsSGVscGVyIiwiZmlsdGVyT3V0TmF2UHJvcEJpbmRpbmciLCJlbnRpdHlTZXRQYXRoIiwiZ2V0RW50aXR5U2V0UGF0aCIsImVudGl0eVNldFBhdGhQYXJ0cyIsImlzQ29udGFpbm1lbnQiLCJnZXRPYmplY3QiLCJqb2luIiwiY29udGFpbm1lbnROYXZQYXRoIiwibGVuZ3RoIiwibmF2UGF0aCIsInBhcmVudEVudGl0eVNldFBhdGgiLCJzbGljZSIsIm9OYXZpZ2F0aW9uUmVzdHJpY3Rpb25zIiwiQ29tbW9uVXRpbHMiLCJnZXROYXZpZ2F0aW9uUmVzdHJpY3Rpb25zIiwic0VudGl0eVNldFBhdGgiLCJzTmF2aWdhdGlvblBhdGgiLCJhUmVzdHJpY3RlZFByb3BlcnRpZXMiLCJSZXN0cmljdGVkUHJvcGVydGllcyIsImZpbmQiLCJvUmVzdHJpY3RlZFByb3BlcnR5IiwiTmF2aWdhdGlvblByb3BlcnR5IiwiJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgiLCJfaXNJbk5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzIiwibWV0YW1vZGVsQ29udGV4dCIsInNDb250ZXh0UGF0aCIsImJJc05vdEZpbHRlcmFibGUiLCJvQW5ub3RhdGlvbiIsIk5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzIiwic29tZSIsInByb3BlcnR5IiwiJFByb3BlcnR5UGF0aCIsIl9pc0N1c3RvbUFnZ3JlZ2F0ZSIsImJDdXN0b21BZ2dyZWdhdGUiLCJiQXBwbHlTdXBwb3J0ZWQiLCJvQW5ub3RhdGlvbnMiLCJvQ3VzdG9tQWdncmVnZ2F0ZXMiLCJtZXRhTW9kZWxVdGlsIiwiZ2V0QWxsQ3VzdG9tQWdncmVnYXRlcyIsImFDdXN0b21BZ2dyZWdhdGVzIiwiT2JqZWN0IiwiX2lzQ29udGV4dFBhdGhGaWx0ZXJhYmxlIiwib01vZGVsQ29udGV4dCIsInNDb250ZXhQYXRoIiwiYUVTUGFydHMiLCJzcGxpY2UiLCJhQ29udGV4dCIsInNDb250ZXh0IiwiaXRlbSIsImluZGV4IiwiYXJyYXkiLCJvRmlsdGVyUmVzdHJpY3Rpb25zIiwiRmlsdGVyUmVzdHJpY3Rpb25zIiwiYU5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzIiwic1RhcmdldFByb3BlcnR5UGF0aCIsIm9Qcm9wZXJ0eVBhdGgiLCJpc1Byb3BlcnR5RmlsdGVyYWJsZSIsIm1ldGFNb2RlbENvbnRleHQiLCJzUHJvcGVydHkiLCJiU2tpcEhpZGRlbkZpbHRlciIsIkVycm9yIiwiYklzRmlsdGVyYWJsZSIsInZhbHVlT2YiLCJjcmVhdGVCaW5kaW5nQ29udGV4dCIsInNIaWRkZW5QYXRoIiwic0hpZGRlbkZpbHRlclBhdGgiLCJjb21waWxlRXhwcmVzc2lvbiIsIm5vdCIsIm9yIiwicGF0aEluTW9kZWwiLCJzUHJvcGVydHlEYXRhVHlwZSIsImlzVHlwZUZpbHRlcmFibGUiLCJnZXRTaGVsbFNlcnZpY2VzIiwib0NvbnRyb2wiLCJnZXRBcHBDb21wb25lbnQiLCJnZXRIYXNoIiwic0hhc2giLCJ3aW5kb3ciLCJsb2NhdGlvbiIsImhhc2giLCJfZ2V0U09JbnRlbnRzIiwib1NoZWxsU2VydmljZUhlbHBlciIsIm9PYmplY3RQYWdlTGF5b3V0Iiwib1NlbWFudGljT2JqZWN0Iiwib1BhcmFtIiwiZ2V0TGlua3MiLCJzZW1hbnRpY09iamVjdCIsInBhcmFtcyIsIl9jcmVhdGVNYXBwaW5ncyIsIm9NYXBwaW5nIiwiYVNPTWFwcGluZ3MiLCJhTWFwcGluZ0tleXMiLCJvU2VtYW50aWNNYXBwaW5nIiwiaSIsIkxvY2FsUHJvcGVydHkiLCJTZW1hbnRpY09iamVjdFByb3BlcnR5IiwicHVzaCIsIl9nZXRSZWxhdGVkQXBwc01lbnVJdGVtcyIsImFMaW5rcyIsImFFeGNsdWRlZEFjdGlvbnMiLCJvVGFyZ2V0UGFyYW1zIiwiYUl0ZW1zIiwiYUFsbG93ZWRBY3Rpb25zIiwib0xpbmsiLCJzSW50ZW50IiwiaW50ZW50Iiwic0FjdGlvbiIsImluY2x1ZGVzIiwidGV4dCIsInRhcmdldFNlbU9iamVjdCIsInRhcmdldEFjdGlvbiIsInRhcmdldFBhcmFtcyIsIl9nZXRSZWxhdGVkSW50ZW50cyIsIm9BZGRpdGlvbmFsU2VtYW50aWNPYmplY3RzIiwib0JpbmRpbmdDb250ZXh0IiwiYU1hbmlmZXN0U09JdGVtcyIsImFsbG93ZWRBY3Rpb25zIiwidW5hdmFpbGFibGVBY3Rpb25zIiwibWFwcGluZyIsIm5hdmlnYXRpb25Db250ZXh0cyIsInNlbWFudGljT2JqZWN0TWFwcGluZyIsInVwZGF0ZVJlbGF0ZUFwcHNNb2RlbCIsIm9FbnRyeSIsImFTZW1LZXlzIiwib01ldGFNb2RlbCIsIm9NZXRhUGF0aCIsInNDdXJyZW50U2VtT2JqIiwic0N1cnJlbnRBY3Rpb24iLCJvU2VtYW50aWNPYmplY3RBbm5vdGF0aW9ucyIsImFSZWxhdGVkQXBwc01lbnVJdGVtcyIsImFNYW5pZmVzdFNPS2V5cyIsImZuR2V0UGFyc2VTaGVsbEhhc2hBbmRHZXRMaW5rcyIsIm9QYXJzZWRVcmwiLCJwYXJzZVNoZWxsSGFzaCIsImRvY3VtZW50IiwiYWN0aW9uIiwiaiIsInNTZW1LZXkiLCJ2YWx1ZSIsImFUZWNobmljYWxLZXlzIiwia2V5Iiwic09iaktleSIsIm9NYW5pZmVzdERhdGEiLCJnZXRUYXJnZXRWaWV3IiwiZ2V0Vmlld0RhdGEiLCJzZW1hbnRpY09iamVjdEludGVudHMiLCJhZGRpdGlvbmFsU2VtYW50aWNPYmplY3RzIiwiUHJvbWlzZSIsInJlc29sdmUiLCJpbnRlcm5hbE1vZGVsQ29udGV4dCIsImdldEJpbmRpbmdDb250ZXh0IiwiaXNTZW1hbnRpY09iamVjdEhhc1NhbWVUYXJnZXRJbk1hbmlmZXN0IiwiYUFubm90YXRpb25zU09JdGVtcyIsInNFbnRpdHlUeXBlUGF0aCIsIm9FbnRpdHlTZXRBbm5vdGF0aW9ucyIsImdldFNlbWFudGljT2JqZWN0QW5ub3RhdGlvbnMiLCJiSGFzRW50aXR5U2V0U08iLCJvRW50aXR5VHlwZUFubm90YXRpb25zIiwiYVVuYXZhaWxhYmxlQWN0aW9ucyIsImFNYXBwaW5ncyIsImNvbmNhdCIsInNldFByb3BlcnR5IiwiZXJyb3IiLCJMb2ciLCJfZ2V0U2VtYW50aWNPYmplY3RBbm5vdGF0aW9ucyIsIm9FbnRpdHlBbm5vdGF0aW9ucyIsInNBbm5vdGF0aW9uTWFwcGluZ1Rlcm0iLCJzQW5ub3RhdGlvbkFjdGlvblRlcm0iLCJzUXVhbGlmaWVyIiwiZm5VcGRhdGVSZWxhdGVkQXBwc0RldGFpbHMiLCJwYXRoIiwic1NlbWFudGljS2V5Vm9jYWJ1bGFyeSIsInJlcXVlc3RPYmplY3QiLCJ0aGVuIiwicmVxdWVzdGVkT2JqZWN0IiwiY2F0Y2giLCJvRXJyb3IiLCJmbkZpcmVCdXR0b25QcmVzcyIsIm9CdXR0b24iLCJpc0EiLCJnZXRWaXNpYmxlIiwiZ2V0RW5hYmxlZCIsImZpcmVQcmVzcyIsImZuUmVzb2x2ZVN0cmluZ3RvQm9vbGVhbiIsInNWYWx1ZSIsIm9Pd25lciIsIkNvbXBvbmVudCIsImdldE93bmVyQ29tcG9uZW50Rm9yIiwiZ2V0Q3VycmVudFBhZ2VWaWV3Iiwib0FwcENvbXBvbmVudCIsInJvb3RWaWV3Q29udHJvbGxlciIsImdldFJvb3RWaWV3Q29udHJvbGxlciIsImlzRmNsRW5hYmxlZCIsImdldFJpZ2h0bW9zdFZpZXciLCJnZXRSb290Q29udGFpbmVyIiwiZ2V0Q3VycmVudFBhZ2UiLCJvQ29tcG9uZW50IiwiZ2V0Q29tcG9uZW50SW5zdGFuY2UiLCJnZXRSb290Q29udHJvbCIsImdldFBhcmVudCIsImlzRmllbGRDb250cm9sUGF0aEluYXBwbGljYWJsZSIsInNGaWVsZENvbnRyb2xQYXRoIiwib0F0dHJpYnV0ZSIsImJJbmFwcGxpY2FibGUiLCJhUGFydHMiLCJoYXNPd25Qcm9wZXJ0eSIsInJlbW92ZVNlbnNpdGl2ZURhdGEiLCJhQXR0cmlidXRlcyIsImFPdXRBdHRyaWJ1dGVzIiwic0VudGl0eVNldCIsImVudGl0eVNldCIsImNvbnRleHREYXRhIiwiYVByb3BlcnRpZXMiLCJzUHJvcCIsImFQcm9wZXJ0eUFubm90YXRpb25zIiwib0ZpZWxkQ29udHJvbCIsIl9mbkNoZWNrSXNNYXRjaCIsIm9PYmplY3QiLCJvS2V5c1RvQ2hlY2siLCJzS2V5IiwiZm5HZXRDb250ZXh0UGF0aFByb3BlcnRpZXMiLCJvRmlsdGVyIiwib0VudGl0eVR5cGUiLCJvUHJvcGVydGllcyIsInRlc3QiLCIka2luZCIsImZuR2V0TWFuZGF0b3J5RmlsdGVyRmllbGRzIiwiYU1hbmRhdG9yeUZpbHRlckZpZWxkcyIsImZuR2V0SUJOQWN0aW9ucyIsImFJQk5BY3Rpb25zIiwiYUFjdGlvbnMiLCJnZXRBY3Rpb25zIiwib0FjdGlvbiIsImdldEFjdGlvbiIsIm9NZW51IiwiZ2V0TWVudSIsImdldEl0ZW1zIiwib0l0ZW0iLCJkYXRhIiwiZm5VcGRhdGVEYXRhRmllbGRGb3JJQk5CdXR0b25zVmlzaWJpbGl0eSIsIm9WaWV3Iiwib1BhcmFtcyIsImlzU3RpY2t5IiwiaXNTdGlja3lTZXNzaW9uU3VwcG9ydGVkIiwiZm5HZXRMaW5rcyIsIm9EYXRhIiwiYUtleXMiLCJvSUJOQWN0aW9uIiwic1NlbWFudGljT2JqZWN0IiwiYUxpbmsiLCJzZXRWaXNpYmxlIiwiZ2V0SWQiLCJzaGVsbE5hdmlnYXRpb25Ob3RBdmFpbGFibGUiLCJnZXRUcmFuc2xhdGVkVGV4dCIsInNGcmFtZXdvcmtLZXkiLCJvUmVzb3VyY2VCdW5kbGUiLCJwYXJhbWV0ZXJzIiwic0VudGl0eVNldE5hbWUiLCJzUmVzb3VyY2VLZXkiLCJiUmVzb3VyY2VLZXlFeGlzdHMiLCJjaGVja0lmUmVzb3VyY2VLZXlFeGlzdHMiLCJhQ3VzdG9tQnVuZGxlcyIsImdldFRleHQiLCJDb3JlIiwiZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlIiwiaGFzVGV4dCIsImdldEFjdGlvblBhdGgiLCJhY3Rpb25Db250ZXh0IiwiYlJldHVybk9ubHlQYXRoIiwic0FjdGlvbk5hbWUiLCJiQ2hlY2tTdGF0aWNWYWx1ZSIsInRvU3RyaW5nIiwic0VudGl0eVR5cGVOYW1lIiwiJFR5cGUiLCJzRW50aXR5TmFtZSIsImdldEVudGl0eVNldE5hbWUiLCJzQmluZGluZ1BhcmFtZXRlciIsInNFbnRpdHlUeXBlIiwib0VudGl0eUNvbnRhaW5lciIsImNvbXB1dGVEaXNwbGF5TW9kZSIsIm9Qcm9wZXJ0eUFubm90YXRpb25zIiwib0NvbGxlY3Rpb25Bbm5vdGF0aW9ucyIsIm9UZXh0QW5ub3RhdGlvbiIsIm9UZXh0QXJyYW5nZW1lbnRBbm5vdGF0aW9uIiwiJEVudW1NZW1iZXIiLCJfZ2V0RW50aXR5VHlwZSIsIl9yZXF1ZXN0T2JqZWN0Iiwib1NlbGVjdGVkQ29udGV4dCIsIm5CcmFja2V0SW5kZXgiLCJzVGFyZ2V0VHlwZSIsInNDdXJyZW50VHlwZSIsImdldEJpbmRpbmciLCJ3YXJuaW5nIiwic0R5bmFtaWNBY3Rpb25FbmFibGVkUGF0aCIsIm9Qcm9taXNlIiwicmVxdWVzdFNpbmdsZXRvblByb3BlcnR5IiwidlByb3BlcnR5VmFsdWUiLCJzZXRDb250ZXh0c0Jhc2VkT25PcGVyYXRpb25BdmFpbGFibGUiLCJvSW50ZXJuYWxNb2RlbENvbnRleHQiLCJhUmVxdWVzdFByb21pc2VzIiwiYWxsIiwiYVJlc3VsdHMiLCJhQXBwbGljYWJsZUNvbnRleHRzIiwiYU5vdEFwcGxpY2FibGVDb250ZXh0cyIsImFSZXN1bHQiLCJzZXREeW5hbWljQWN0aW9uQ29udGV4dHMiLCJ0cmFjZSIsImFBcHBsaWNhYmxlIiwiYU5vdEFwcGxpY2FibGUiLCJzRHluYW1pY0FjdGlvblBhdGhQcmVmaXgiLCJvSW50ZXJuYWxNb2RlbCIsIl9nZXREZWZhdWx0T3BlcmF0b3JzIiwic1Byb3BlcnR5VHlwZSIsIm9EYXRhQ2xhc3MiLCJUeXBlVXRpbCIsImdldERhdGFUeXBlQ2xhc3NOYW1lIiwib0Jhc2VUeXBlIiwiZ2V0QmFzZVR5cGUiLCJGaWx0ZXJPcGVyYXRvclV0aWwiLCJnZXRPcGVyYXRvcnNGb3JUeXBlIiwiX2dldFJlc3RyaWN0aW9ucyIsImFEZWZhdWx0T3BzIiwiYUV4cHJlc3Npb25PcHMiLCJzRWxlbWVudCIsImdldFNwZWNpZmljQWxsb3dlZEV4cHJlc3Npb24iLCJhRXhwcmVzc2lvbnMiLCJhQWxsb3dlZEV4cHJlc3Npb25zUHJpb3JpdHkiLCJBbGxvd2VkRXhwcmVzc2lvbnNQcmlvIiwic29ydCIsImEiLCJiIiwiZ2V0T3BlcmF0b3JzRm9yUHJvcGVydHkiLCJzVHlwZSIsImJVc2VTZW1hbnRpY0RhdGVSYW5nZSIsInNTZXR0aW5ncyIsImdldEZpbHRlclJlc3RyaWN0aW9uc0J5UGF0aCIsImFFcXVhbHNPcHMiLCJhU2luZ2xlUmFuZ2VPcHMiLCJhU2luZ2xlUmFuZ2VEVEJhc2ljT3BzIiwiYVNpbmdsZVZhbHVlRGF0ZU9wcyIsImFCYXNpY0RhdGVUaW1lT3BzIiwiYU11bHRpUmFuZ2VPcHMiLCJhU2VhcmNoRXhwcmVzc2lvbk9wcyIsImFTZW1hbnRpY0RhdGVPcHNFeHQiLCJTZW1hbnRpY0RhdGVPcGVyYXRvcnMiLCJnZXRTdXBwb3J0ZWRPcGVyYXRpb25zIiwiYlNlbWFudGljRGF0ZVJhbmdlIiwiYVNlbWFudGljRGF0ZU9wcyIsIm9TZXR0aW5ncyIsIkpTT04iLCJwYXJzZSIsImN1c3RvbURhdGEiLCJvcGVyYXRvckNvbmZpZ3VyYXRpb24iLCJnZXRGaWx0ZXJPcGVyYXRpb25zIiwiZ2V0U2VtYW50aWNEYXRlT3BlcmF0aW9ucyIsImFEZWZhdWx0T3BlcmF0b3JzIiwicmVzdHJpY3Rpb25zIiwiRmlsdGVyQWxsb3dlZEV4cHJlc3Npb25zIiwic0FsbG93ZWRFeHByZXNzaW9uIiwiYVNpbmdsZVZhbHVlT3BzIiwic09wZXJhdG9ycyIsImdldE9wZXJhdG9yc0Zvckd1aWRQcm9wZXJ0eSIsImFsbG93ZWRPcGVyYXRvcnNGb3JHdWlkIiwiZ2V0T3BlcmF0b3JzRm9yRGF0ZVByb3BlcnR5IiwicHJvcGVydHlUeXBlIiwiZ2V0UGFyYW1ldGVySW5mbyIsInNQYXJhbWV0ZXJDb250ZXh0UGF0aCIsInN1YnN0cmluZyIsImxhc3RJbmRleE9mIiwiYlJlc3VsdENvbnRleHQiLCJvUGFyYW1ldGVySW5mbyIsImNvbnRleHRQYXRoIiwicGFyYW1ldGVyUHJvcGVydGllcyIsImdldENvbnRleHRQYXRoUHJvcGVydGllcyIsImFkZFNlbGVjdE9wdGlvblRvQ29uZGl0aW9ucyIsIm9Qcm9wZXJ0eU1ldGFkYXRhIiwiYVZhbGlkT3BlcmF0b3JzIiwiYVNlbWFudGljRGF0ZU9wZXJhdG9ycyIsImFDdW11bGF0aXZlQ29uZGl0aW9ucyIsIm9TZWxlY3RPcHRpb24iLCJvQ29uZGl0aW9uIiwiZ2V0Q29uZGl0aW9ucyIsIlNlbWFudGljRGF0ZXMiLCJvcGVyYXRvciIsInNlbWFudGljRGF0ZXMiLCJhZGRTZW1hbnRpY0RhdGVzVG9Db25kaXRpb25zIiwib1NlbWFudGljRGF0ZXMiLCJ2YWx1ZXMiLCJoaWdoIiwibG93IiwiaXNFbXB0eSIsImFkZFNlbGVjdE9wdGlvbnNUb0NvbmRpdGlvbnMiLCJvU2VsZWN0aW9uVmFyaWFudCIsInNTZWxlY3RPcHRpb25Qcm9wIiwib0NvbmRpdGlvbnMiLCJzQ29uZGl0aW9uUGF0aCIsInNDb25kaXRpb25Qcm9wIiwib1ZhbGlkUHJvcGVydGllcyIsImlzUGFyYW1ldGVyIiwiYklzRkxQVmFsdWVQcmVzZW50Iiwib1ZpZXdEYXRhIiwiYUNvbmRpdGlvbnMiLCJhU2VsZWN0T3B0aW9ucyIsImdldFNlbGVjdE9wdGlvbiIsInNldHRpbmdzIiwiZ2V0RmlsdGVyQ29uZmlndXJhdGlvblNldHRpbmciLCJiaW5kIiwiZWxlbWVudCIsImNyZWF0ZVNlbWFudGljRGF0ZXNGcm9tQ29uZGl0aW9ucyIsIm9Db25maWciLCJjb250cm9sQ29uZmlndXJhdGlvbiIsImZpbHRlckNvbmZpZyIsImZpbHRlckZpZWxkcyIsImFkZFNlbGVjdGlvblZhcmlhbnRUb0NvbmRpdGlvbnMiLCJiSXNGTFBWYWx1ZXMiLCJhU2VsZWN0T3B0aW9uc1Byb3BlcnR5TmFtZXMiLCJnZXRTZWxlY3RPcHRpb25zUHJvcGVydHlOYW1lcyIsImFNZXRhZGF0UHJvcGVydGllcyIsIm9WYWxpZFBhcmFtZXRlclByb3BlcnRpZXMiLCJhTWV0YWRhdGFQYXJhbWV0ZXJzIiwic01ldGFkYXRhUGFyYW1ldGVyIiwic1NlbGVjdE9wdGlvbk5hbWUiLCJzdGFydHNXaXRoIiwic01ldGFkYXRhUHJvcGVydHkiLCJzU2VsZWN0T3B0aW9uIiwic1JlcGxhY2VkT3B0aW9uIiwic0Z1bGxDb250ZXh0UGF0aCIsIl9jcmVhdGVDb25kaXRpb25zRm9yTmF2UHJvcGVydGllcyIsInNNYWluRW50aXR5U2V0UGF0aCIsImFOYXZPYmplY3ROYW1lcyIsInNOYXZQYXRoIiwic1Byb3BlcnR5TmFtZSIsIiRpc0NvbGxlY3Rpb24iLCJzTmF2UHJvcGVydHlQYXRoIiwiYWRkUGFnZUNvbnRleHRUb1NlbGVjdGlvblZhcmlhbnQiLCJtUGFnZUNvbnRleHQiLCJvTmF2aWdhdGlvblNlcnZpY2UiLCJnZXROYXZpZ2F0aW9uU2VydmljZSIsIm1peEF0dHJpYnV0ZXNBbmRTZWxlY3Rpb25WYXJpYW50IiwidG9KU09OU3RyaW5nIiwiYWRkRXh0ZXJuYWxTdGF0ZUZpbHRlcnNUb1NlbGVjdGlvblZhcmlhbnQiLCJtRmlsdGVycyIsIm9UYXJnZXRJbmZvIiwib0ZpbHRlckJhciIsInNGaWx0ZXIiLCJmbkdldFNpZ25BbmRPcHRpb24iLCJzT3BlcmF0b3IiLCJzTG93VmFsdWUiLCJzSGlnaFZhbHVlIiwib1NlbGVjdE9wdGlvblN0YXRlIiwib3B0aW9uIiwic2lnbiIsIm9GaWx0ZXJDb25kaXRpb25zIiwiZmlsdGVyQ29uZGl0aW9ucyIsIm9GaWx0ZXJzV2l0aG91dENvbmZsaWN0IiwiZmlsdGVyQ29uZGl0aW9uc1dpdGhvdXRDb25mbGljdCIsIm9UYWJsZVByb3BlcnRpZXNXaXRob3V0Q29uZmxpY3QiLCJwcm9wZXJ0aWVzV2l0aG91dENvbmZsaWN0IiwiYWRkRmlsdGVyc1RvU2VsZWN0aW9uVmFyaWFudCIsInNlbGVjdGlvblZhcmlhbnQiLCJzRmlsdGVyTmFtZSIsInNQYXRoIiwib1Byb3BlcnR5SW5mbyIsImdldFByb3BlcnR5SGVscGVyIiwib1R5cGVDb25maWciLCJ0eXBlQ29uZmlnIiwib1R5cGVVdGlsIiwiZ2V0Q29udHJvbERlbGVnYXRlIiwiZ2V0VHlwZVV0aWwiLCJvT3BlcmF0b3IiLCJnZXRPcGVyYXRvciIsIlJhbmdlT3BlcmF0b3IiLCJvTW9kZWxGaWx0ZXIiLCJnZXRNb2RlbEZpbHRlciIsInR5cGVJbnN0YW5jZSIsImJhc2VUeXBlIiwiZ2V0RmlsdGVycyIsImV4Y2x1ZGUiLCJleHRlcm5hbGl6ZVZhbHVlIiwiZ2V0VmFsdWUxIiwiZ2V0VmFsdWUyIiwidmFsdWUxIiwidmFsdWUyIiwiYWRkU2VsZWN0T3B0aW9uIiwiaXNTdGlja3lFZGl0TW9kZSIsImJJc1N0aWNreU1vZGUiLCJiVUlFZGl0YWJsZSIsImFkZERlZmF1bHREaXNwbGF5Q3VycmVuY3kiLCJvU2VsZWN0aW9uVmFyaWFudERlZmF1bHRzIiwiYVNWT3B0aW9uIiwiYURlZmF1bHRTVk9wdGlvbiIsImRpc3BsYXlDdXJyZW5jeVNlbGVjdE9wdGlvbiIsInNTaWduIiwic09wdGlvbiIsInNMb3ciLCJzSGlnaCIsImdldE5vbkNvbXB1dGVkVmlzaWJsZUZpZWxkcyIsIiRLZXkiLCJhTm9uQ29tcHV0ZWRWaXNpYmxlRmllbGRzIiwiYUltbXV0YWJsZVZpc2libGVGaWVsZHMiLCJiSXNLZXkiLCJiSXNJbW11dGFibGUiLCJiSXNOb25Db21wdXRlZCIsImJJc1Zpc2libGUiLCJiSXNDb21wdXRlZERlZmF1bHRWYWx1ZSIsImJJc0tleUNvbXB1dGVkRGVmYXVsdFZhbHVlV2l0aFRleHQiLCJvRGlhZ25vc3RpY3MiLCJnZXREaWFnbm9zdGljcyIsInNNZXNzYWdlIiwiYWRkSXNzdWUiLCJJc3N1ZUNhdGVnb3J5IiwiQW5ub3RhdGlvbiIsIklzc3VlU2V2ZXJpdHkiLCJNZWRpdW0iLCJJc3N1ZUNhdGVnb3J5VHlwZSIsIkFubm90YXRpb25zIiwiSWdub3JlZEFubm90YXRpb24iLCJhUmVxdWlyZWRQcm9wZXJ0aWVzIiwiZ2V0UmVxdWlyZWRQcm9wZXJ0aWVzRnJvbUluc2VydFJlc3RyaWN0aW9ucyIsImdldFJlcXVpcmVkUHJvcGVydGllcyIsImJDaGVja1VwZGF0ZVJlc3RyaWN0aW9ucyIsImFSZXF1aXJlZFByb3BlcnRpZXNXaXRoUGF0aHMiLCJlbmRzV2l0aCIsIm9OYXZSZXN0IiwiaGFzUmVzdHJpY3RlZFByb3BlcnRpZXNJbkFubm90YXRpb25zIiwiUmVxdWlyZWRQcm9wZXJ0aWVzIiwiZ2V0UmVxdWlyZWRQcm9wZXJ0aWVzRnJvbUFubm90YXRpb25zIiwib1JlcXVpcmVkUHJvcGVydHkiLCJnZXRSZXF1aXJlZFByb3BlcnRpZXNGcm9tVXBkYXRlUmVzdHJpY3Rpb25zIiwiYklzTmF2aWdhdGlvblJlc3RyaWN0aW9ucyIsIm9OYXZBbm5vdGF0aW9ucyIsIm9FbnRpdHlBbm5vdGF0aW9uIiwic2V0VXNlckRlZmF1bHRzIiwiYVBhcmFtZXRlcnMiLCJvTW9kZWwiLCJiSXNBY3Rpb24iLCJiSXNDcmVhdGUiLCJvQWN0aW9uRGVmYXVsdFZhbHVlcyIsIm9Db21wb25lbnREYXRhIiwiZ2V0Q29tcG9uZW50RGF0YSIsIm9TdGFydHVwUGFyYW1ldGVycyIsInN0YXJ0dXBQYXJhbWV0ZXJzIiwib1NoZWxsU2VydmljZXMiLCJoYXNVU2hlbGwiLCJvUGFyYW1ldGVyIiwiJE5hbWUiLCJzUGFyYW1ldGVyTmFtZSIsImdldFN0YXJ0dXBBcHBTdGF0ZSIsIm9TdGFydHVwQXBwU3RhdGUiLCJnZXREYXRhIiwiYUV4dGVuZGVkUGFyYW1ldGVycyIsIlNlbGVjdE9wdGlvbnMiLCJvRXh0ZW5kZWRQYXJhbWV0ZXIiLCJQcm9wZXJ0eU5hbWUiLCJvUmFuZ2UiLCJSYW5nZXMiLCJTaWduIiwiT3B0aW9uIiwiTG93IiwiZ2V0QWRkaXRpb25hbFBhcmFtc0ZvckNyZWF0ZSIsIm9JbmJvdW5kUGFyYW1ldGVycyIsIm9JbmJvdW5kcyIsImFDcmVhdGVQYXJhbWV0ZXJzIiwic1BhcmFtZXRlciIsInVzZUZvckNyZWF0ZSIsIm9SZXQiLCJzQ3JlYXRlUGFyYW1ldGVyIiwiYVZhbHVlcyIsImNyZWF0ZSIsImdldFNlbWFudGljT2JqZWN0TWFwcGluZyIsIm9PdXRib3VuZCIsImFTZW1hbnRpY09iamVjdE1hcHBpbmciLCJzUGFyYW0iLCJmb3JtYXQiLCJnZXRIZWFkZXJGYWNldEl0ZW1Db25maWdGb3JFeHRlcm5hbE5hdmlnYXRpb24iLCJvQ3Jvc3NOYXYiLCJvSGVhZGVyRmFjZXRJdGVtcyIsInNJZCIsIm9Db250cm9sQ29uZmlnIiwiY29uZmlnIiwic091dGJvdW5kIiwibmF2aWdhdGlvbiIsInRhcmdldE91dGJvdW5kIiwib3V0Ym91bmQiLCJnZW5lcmF0ZSIsInNldFNlbWFudGljT2JqZWN0TWFwcGluZ3MiLCJ2TWFwcGluZ3MiLCJvTWFwcGluZ3MiLCJzTG9jYWxQcm9wZXJ0eSIsInNTZW1hbnRpY09iamVjdFByb3BlcnR5IiwicmVtb3ZlU2VsZWN0T3B0aW9uIiwibWFzc0FkZFNlbGVjdE9wdGlvbiIsImZuR2V0U2VtYW50aWNPYmplY3RzRnJvbVBhdGgiLCJhU2VtYW50aWNPYmplY3RVbmF2YWlsYWJsZUFjdGlvbnMiLCJhU2VtYW50aWNPYmplY3RGb3JHZXRMaW5rcyIsInNlbWFudGljT2JqZWN0UGF0aCIsInNlbWFudGljT2JqZWN0Rm9yR2V0TGlua3MiLCJmblVwZGF0ZVNlbWFudGljVGFyZ2V0c01vZGVsIiwiYUdldExpbmtzUHJvbWlzZXMiLCJhU2VtYW50aWNPYmplY3RzIiwic0N1cnJlbnRIYXNoIiwiX29MaW5rIiwiX3NMaW5rSW50ZW50QWN0aW9uIiwiYUZpbmFsTGlua3MiLCJvRmluYWxTZW1hbnRpY09iamVjdHMiLCJiSW50ZW50SGFzQWN0aW9ucyIsImsiLCJvVG1wIiwic0FsdGVybmF0ZVBhdGgiLCJoYXNUYXJnZXRzTm90RmlsdGVyZWQiLCJoYXNUYXJnZXRzIiwiaUxpbmtDb3VudCIsIkhhc1RhcmdldHMiLCJIYXNUYXJnZXRzTm90RmlsdGVyZWQiLCJhc3NpZ24iLCJzU2VtYW50aWNPYmplY3ROYW1lIiwibWVyZ2VPYmplY3RzIiwiZm5HZXRTZW1hbnRpY09iamVjdFByb21pc2UiLCJnZXRTZW1hbnRpY09iamVjdHNGcm9tUGF0aCIsImZuUHJlcGFyZVNlbWFudGljT2JqZWN0c1Byb21pc2VzIiwiX29BcHBDb21wb25lbnQiLCJfb1ZpZXciLCJfb01ldGFNb2RlbCIsIl9hU2VtYW50aWNPYmplY3RzRm91bmQiLCJfYVNlbWFudGljT2JqZWN0c1Byb21pc2VzIiwiX0tleXMiLCJyZWdleFJlc3VsdCIsImV4ZWMiLCJnZXRTZW1hbnRpY09iamVjdFByb21pc2UiLCJmbkdldFNlbWFudGljVGFyZ2V0c0Zyb21QYWdlTW9kZWwiLCJvQ29udHJvbGxlciIsInNQYWdlTW9kZWwiLCJfZm5maW5kVmFsdWVzSGVscGVyIiwib2JqIiwibGlzdCIsIkFycmF5IiwiY2hpbGRyZW4iLCJfZm5maW5kVmFsdWVzIiwiX2ZuRGVsZXRlRHVwbGljYXRlU2VtYW50aWNPYmplY3RzIiwiYVNlbWFudGljT2JqZWN0UGF0aCIsImdldFZpZXciLCJhU2VtYW50aWNPYmplY3RzUHJvbWlzZXMiLCJnZXRPd25lckNvbXBvbmVudCIsIm9QYWdlTW9kZWwiLCJzdHJpbmdpZnkiLCJfZ2V0T2JqZWN0IiwiYVNlbWFudGljT2JqZWN0c0ZvdW5kIiwiYVNlbWFudGljT2JqZWN0c0ZvckdldExpbmtzIiwiX29TZW1hbnRpY09iamVjdCIsInNTZW1PYmpFeHByZXNzaW9uIiwiYVNlbWFudGljT2JqZWN0c1Jlc29sdmVkIiwiJFBhdGgiLCJnZXRMaW5rc1dpdGhDYWNoZSIsInVwZGF0ZVNlbWFudGljVGFyZ2V0cyIsImdldEZpbHRlckFsbG93ZWRFeHByZXNzaW9uIiwib0ZpbHRlclJlc3RyaWN0aW9uc0Fubm90YXRpb24iLCJtQWxsb3dlZEV4cHJlc3Npb25zIiwiRmlsdGVyRXhwcmVzc2lvblJlc3RyaWN0aW9ucyIsIm9Qcm9wZXJ0eSIsIlByb3BlcnR5IiwiQWxsb3dlZEV4cHJlc3Npb25zIiwiZ2V0RmlsdGVyUmVzdHJpY3Rpb25zIiwic1Jlc3RyaWN0aW9uIiwiYVByb3BzIiwibWFwIiwiX2ZldGNoUHJvcGVydGllc0Zvck5hdlBhdGgiLCJwYXRocyIsInByb3BzIiwibmF2UGF0aFByZWZpeCIsIm91dFBhdGhzIiwicGF0aFRvQ2hlY2siLCJvdXRQYXRoIiwiZnJUZXJtIiwiZW50aXR5VHlwZVBhdGgiLCJyZXN1bHRDb250ZXh0Q2hlY2siLCJvUGFyZW50UmV0Iiwib1BhcmVudEZSIiwiY29tcGxldGVBbGxvd2VkRXhwcyIsIm91dFByb3AiLCJwcm9wUGF0aCIsIm91dFByb3BQYXRoIiwib05hdlJlc3RyaWN0aW9ucyIsIm9OYXZGaWx0ZXJSZXN0IiwibmF2UmVzUmVxUHJvcHMiLCJ1bmlxdWVTb3J0IiwibmF2Tm9uRmlsdGVyUHJvcHMiLCJuYXZBc3NvY2lhdGlvbkVudGl0eVJlc3QiLCJuYXZBc3NvY1JlcVByb3BzIiwibmF2QXNzb2NOb25GaWx0ZXJQcm9wcyIsInRlbXBsYXRlQ29udHJvbEZyYWdtZW50Iiwic0ZyYWdtZW50TmFtZSIsIm9QcmVwcm9jZXNzb3JTZXR0aW5ncyIsIm9PcHRpb25zIiwib01vZGlmaWVyIiwidmlldyIsIm9GcmFnbWVudCIsInRhcmdldHMiLCJsb2FkTWFjcm9MaWJyYXJ5IiwiWE1MUHJlcHJvY2Vzc29yIiwicHJvY2VzcyIsIlhNTFRlbXBsYXRlUHJvY2Vzc29yIiwibG9hZFRlbXBsYXRlIiwiZmlyc3RFbGVtZW50Q2hpbGQiLCJpc1hNTCIsIkZyYWdtZW50IiwibG9hZCIsImlkIiwiZGVmaW5pdGlvbiIsImNvbnRyb2xsZXIiLCJnZXRTaW5nbGV0b25QYXRoIiwicGFydHMiLCJCb29sZWFuIiwicHJvcGVydHlOYW1lIiwicG9wIiwibmF2aWdhdGlvblBhdGgiLCJzaW5nbGV0b25OYW1lIiwicmVzb2x2ZWRQYXRoIiwicHJvcGVydHlCaW5kaW5nIiwiYmluZFByb3BlcnR5IiwicmVxdWVzdFZhbHVlIiwiYWRkRXZlbnRUb0JpbmRpbmdJbmZvIiwic0V2ZW50TmFtZSIsImZIYW5kbGVyIiwib0JpbmRpbmdJbmZvIiwic2V0QmluZGluZ0luZm8iLCJldmVudHMiLCJmT3JpZ2luYWxIYW5kbGVyIiwiYXJncyIsImFwcGx5IiwiaW5uZXJDaGFydEJvdW5kIiwiX2dldENoYXJ0IiwiZ2V0QmluZGluZ0luZm8iLCJzRXJyb3IiLCJzYXAiLCJ1aSIsInJlcXVpcmUiLCJnZXRQYXJhbWV0ZXJQYXRoIiwiYUFjdGlvbiIsIl9mbnRyYW5zbGF0ZWRUZXh0RnJvbUV4cEJpbmRpbmdTdHJpbmciLCJleHBCaW5kaW5nIiwiY29udHJvbCIsImFueVJlc291cmNlVGV4dCIsIkFueUVsZW1lbnQiLCJhbnlUZXh0IiwiYWRkRGVwZW5kZW50IiwicmVzdWx0VGV4dCIsImdldEFueVRleHQiLCJyZW1vdmVEZXBlbmRlbnQiLCJkZXN0cm95IiwiaXNTbWFsbERldmljZSIsInN5c3RlbSIsImRlc2t0b3AiLCJEZXZpY2UiLCJyZXNpemUiLCJ3aWR0aCIsImdldENvbnZlcnRlckNvbnRleHRGb3JQYXRoIiwic01ldGFQYXRoIiwiQ29udmVydGVyQ29udGV4dCIsImNyZWF0ZUNvbnZlcnRlckNvbnRleHRGb3JNYWNybyIsImZpcmVCdXR0b25QcmVzcyIsImhhc1RyYW5zaWVudENvbnRleHQiLCJ1cGRhdGVSZWxhdGVkQXBwc0RldGFpbHMiLCJyZXNvbHZlU3RyaW5ndG9Cb29sZWFuIiwiZ2V0TWFuZGF0b3J5RmlsdGVyRmllbGRzIiwidXBkYXRlRGF0YUZpZWxkRm9ySUJOQnV0dG9uc1Zpc2liaWxpdHkiLCJnZXRJQk5BY3Rpb25zIiwiZ2V0U2VtYW50aWNUYXJnZXRzRnJvbVBhZ2VNb2RlbCIsIlJFUVVJUkVEX1BST1BFUlRJRVMiLCJOT05fRklMVEVSQUJMRV9QUk9QRVJUSUVTIiwiQUxMT1dFRF9FWFBSRVNTSU9OUyIsImdldFJlbGF0ZWRBcHBzTWVudUl0ZW1zIiwiZ2V0VHJhbnNsYXRlZFRleHRGcm9tRXhwQmluZGluZ1N0cmluZyIsImlzQ3VzdG9tQWdncmVnYXRlIl0sInNvdXJjZVJvb3QiOiIuIiwic291cmNlcyI6WyJDb21tb25VdGlscy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSAqIGFzIEVkbSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvRWRtXCI7XG5pbXBvcnQgdHlwZSB7XG5cdEZpbHRlclJlc3RyaWN0aW9uc1R5cGUsXG5cdE5hdmlnYXRpb25Qcm9wZXJ0eVJlc3RyaWN0aW9uVHlwZXMsXG5cdE5hdmlnYXRpb25SZXN0cmljdGlvbnNUeXBlLFxuXHRTZWFyY2hSZXN0cmljdGlvbnNUeXBlXG59IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvQ2FwYWJpbGl0aWVzXCI7XG5pbXBvcnQgdHlwZSB7IFNlbWFudGljT2JqZWN0TWFwcGluZ1R5cGUsIFNlbWFudGljT2JqZWN0VW5hdmFpbGFibGVBY3Rpb25zIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3ZvY2FidWxhcmllcy9Db21tb25cIjtcbmltcG9ydCB7IENvbW1vbkFubm90YXRpb25UZXJtcyB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvQ29tbW9uXCI7XG5pbXBvcnQgdHlwZSB7IFRleHRBcnJhbmdlbWVudCB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvVUlcIjtcbmltcG9ydCB0eXBlIFJlc291cmNlQnVuZGxlIGZyb20gXCJzYXAvYmFzZS9pMThuL1Jlc291cmNlQnVuZGxlXCI7XG5pbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCB1bmlxdWVTb3J0IGZyb20gXCJzYXAvYmFzZS91dGlsL2FycmF5L3VuaXF1ZVNvcnRcIjtcbmltcG9ydCBtZXJnZU9iamVjdHMgZnJvbSBcInNhcC9iYXNlL3V0aWwvbWVyZ2VcIjtcbmltcG9ydCB0eXBlIEFwcENvbXBvbmVudCBmcm9tIFwic2FwL2ZlL2NvcmUvQXBwQ29tcG9uZW50XCI7XG5pbXBvcnQgQ29udmVydGVyQ29udGV4dCBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9Db252ZXJ0ZXJDb250ZXh0XCI7XG5pbXBvcnQgeyBJc3N1ZUNhdGVnb3J5LCBJc3N1ZUNhdGVnb3J5VHlwZSwgSXNzdWVTZXZlcml0eSB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2hlbHBlcnMvSXNzdWVNYW5hZ2VyXCI7XG5pbXBvcnQgKiBhcyBNZXRhTW9kZWxDb252ZXJ0ZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWV0YU1vZGVsQ29udmVydGVyXCI7XG5pbXBvcnQgdHlwZSB7IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvQmluZGluZ1Rvb2xraXRcIjtcbmltcG9ydCB7IGNvbXBpbGVFeHByZXNzaW9uLCBub3QsIG9yLCBwYXRoSW5Nb2RlbCB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0JpbmRpbmdUb29sa2l0XCI7XG5pbXBvcnQgdHlwZSB7IEludGVybmFsTW9kZWxDb250ZXh0IH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTW9kZWxIZWxwZXJcIjtcbmltcG9ydCBNb2RlbEhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0IFNlbWFudGljRGF0ZU9wZXJhdG9ycyBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9TZW1hbnRpY0RhdGVPcGVyYXRvcnNcIjtcbmltcG9ydCB7IGdlbmVyYXRlIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvU3RhYmxlSWRIZWxwZXJcIjtcbmltcG9ydCB0eXBlIFBhZ2VDb250cm9sbGVyIGZyb20gXCJzYXAvZmUvY29yZS9QYWdlQ29udHJvbGxlclwiO1xuaW1wb3J0IHR5cGUgeyBJU2hlbGxTZXJ2aWNlcyB9IGZyb20gXCJzYXAvZmUvY29yZS9zZXJ2aWNlcy9TaGVsbFNlcnZpY2VzRmFjdG9yeVwiO1xuaW1wb3J0IERpYWdub3N0aWNzIGZyb20gXCJzYXAvZmUvY29yZS9zdXBwb3J0L0RpYWdub3N0aWNzXCI7XG5pbXBvcnQgeyBEZWZhdWx0VHlwZUZvckVkbVR5cGUsIGlzVHlwZUZpbHRlcmFibGUgfSBmcm9tIFwic2FwL2ZlL2NvcmUvdHlwZS9FRE1cIjtcbmltcG9ydCBUeXBlVXRpbCBmcm9tIFwic2FwL2ZlL2NvcmUvdHlwZS9UeXBlVXRpbFwiO1xuaW1wb3J0IG1ldGFNb2RlbFV0aWwgZnJvbSBcInNhcC9mZS9tYWNyb3MvT0RhdGFNZXRhTW9kZWxVdGlsXCI7XG5pbXBvcnQgdHlwZSBTZWxlY3Rpb25WYXJpYW50IGZyb20gXCJzYXAvZmUvbmF2aWdhdGlvbi9TZWxlY3Rpb25WYXJpYW50XCI7XG5pbXBvcnQgdHlwZSB7IFNlbGVjdE9wdGlvbiwgU2VtYW50aWNEYXRlQ29uZmlndXJhdGlvbiB9IGZyb20gXCJzYXAvZmUvbmF2aWdhdGlvbi9TZWxlY3Rpb25WYXJpYW50XCI7XG5pbXBvcnQgdHlwZSBCdXR0b24gZnJvbSBcInNhcC9tL0J1dHRvblwiO1xuaW1wb3J0IHR5cGUgTWVudUJ1dHRvbiBmcm9tIFwic2FwL20vTWVudUJ1dHRvblwiO1xuaW1wb3J0IHR5cGUgTmF2Q29udGFpbmVyIGZyb20gXCJzYXAvbS9OYXZDb250YWluZXJcIjtcbmltcG9ydCB0eXBlIE92ZXJmbG93VG9vbGJhckJ1dHRvbiBmcm9tIFwic2FwL20vT3ZlcmZsb3dUb29sYmFyQnV0dG9uXCI7XG5pbXBvcnQgdHlwZSBNYW5hZ2VkT2JqZWN0IGZyb20gXCJzYXAvdWkvYmFzZS9NYW5hZ2VkT2JqZWN0XCI7XG5pbXBvcnQgdHlwZSB7IEFnZ3JlZ2F0aW9uQmluZGluZ0luZm8gfSBmcm9tIFwic2FwL3VpL2Jhc2UvTWFuYWdlZE9iamVjdFwiO1xuaW1wb3J0IENvbXBvbmVudCBmcm9tIFwic2FwL3VpL2NvcmUvQ29tcG9uZW50XCI7XG5pbXBvcnQgdHlwZSBDb21wb25lbnRDb250YWluZXIgZnJvbSBcInNhcC91aS9jb3JlL0NvbXBvbmVudENvbnRhaW5lclwiO1xuaW1wb3J0IHR5cGUgQ29udHJvbCBmcm9tIFwic2FwL3VpL2NvcmUvQ29udHJvbFwiO1xuaW1wb3J0IENvcmUgZnJvbSBcInNhcC91aS9jb3JlL0NvcmVcIjtcbmltcG9ydCB0eXBlIFVJNUVsZW1lbnQgZnJvbSBcInNhcC91aS9jb3JlL0VsZW1lbnRcIjtcbmltcG9ydCBGcmFnbWVudCBmcm9tIFwic2FwL3VpL2NvcmUvRnJhZ21lbnRcIjtcbmltcG9ydCB0eXBlIENvbnRyb2xsZXIgZnJvbSBcInNhcC91aS9jb3JlL212Yy9Db250cm9sbGVyXCI7XG5pbXBvcnQgdHlwZSBWaWV3IGZyb20gXCJzYXAvdWkvY29yZS9tdmMvVmlld1wiO1xuaW1wb3J0IFhNTFByZXByb2Nlc3NvciBmcm9tIFwic2FwL3VpL2NvcmUvdXRpbC9YTUxQcmVwcm9jZXNzb3JcIjtcbmltcG9ydCBYTUxUZW1wbGF0ZVByb2Nlc3NvciBmcm9tIFwic2FwL3VpL2NvcmUvWE1MVGVtcGxhdGVQcm9jZXNzb3JcIjtcbmltcG9ydCBEZXZpY2UsIHsgc3lzdGVtIH0gZnJvbSBcInNhcC91aS9EZXZpY2VcIjtcbmltcG9ydCB0eXBlIEFjdGlvblRvb2xiYXJBY3Rpb24gZnJvbSBcInNhcC91aS9tZGMvYWN0aW9udG9vbGJhci9BY3Rpb25Ub29sYmFyQWN0aW9uXCI7XG5pbXBvcnQgdHlwZSBDaGFydCBmcm9tIFwic2FwL3VpL21kYy9DaGFydFwiO1xuaW1wb3J0IHR5cGUgeyBDb25kaXRpb25PYmplY3QgfSBmcm9tIFwic2FwL3VpL21kYy9jb25kaXRpb24vQ29uZGl0aW9uXCI7XG5pbXBvcnQgRmlsdGVyT3BlcmF0b3JVdGlsIGZyb20gXCJzYXAvdWkvbWRjL2NvbmRpdGlvbi9GaWx0ZXJPcGVyYXRvclV0aWxcIjtcbmltcG9ydCBSYW5nZU9wZXJhdG9yIGZyb20gXCJzYXAvdWkvbWRjL2NvbmRpdGlvbi9SYW5nZU9wZXJhdG9yXCI7XG5pbXBvcnQgdHlwZSBGaWx0ZXJCYXIgZnJvbSBcInNhcC91aS9tZGMvRmlsdGVyQmFyXCI7XG5pbXBvcnQgdHlwZSBEZWxlZ2F0ZU1peGluIGZyb20gXCJzYXAvdWkvbWRjL21peGluL0RlbGVnYXRlTWl4aW5cIjtcbmltcG9ydCB0eXBlIFRhYmxlIGZyb20gXCJzYXAvdWkvbWRjL1RhYmxlXCI7XG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvQ29udGV4dFwiO1xuaW1wb3J0IHR5cGUgSlNPTk1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvanNvbi9KU09OTW9kZWxcIjtcbmltcG9ydCB0eXBlIE9EYXRhVjRDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQ29udGV4dFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFMaXN0QmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTGlzdEJpbmRpbmdcIjtcbmltcG9ydCB0eXBlIE9EYXRhTWV0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNZXRhTW9kZWxcIjtcbmltcG9ydCB0eXBlIE9EYXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1vZGVsXCI7XG5pbXBvcnQgdHlwZSBPYmplY3RQYWdlRHluYW1pY0hlYWRlclRpdGxlIGZyb20gXCJzYXAvdXhhcC9PYmplY3RQYWdlRHluYW1pY0hlYWRlclRpdGxlXCI7XG5pbXBvcnQgdHlwZSBPYmplY3RQYWdlTGF5b3V0IGZyb20gXCJzYXAvdXhhcC9PYmplY3RQYWdlTGF5b3V0XCI7XG5pbXBvcnQgdHlwZSB7IFY0Q29udGV4dCB9IGZyb20gXCJ0eXBlcy9leHRlbnNpb25fdHlwZXNcIjtcbmltcG9ydCB0eXBlIHtcblx0RXhwYW5kUGF0aFR5cGUsXG5cdE1ldGFNb2RlbEVudGl0eVNldEFubm90YXRpb24sXG5cdE1ldGFNb2RlbEVudGl0eVR5cGUsXG5cdE1ldGFNb2RlbEVudW0sXG5cdE1ldGFNb2RlbE5hdlByb3BlcnR5LFxuXHRNZXRhTW9kZWxQcm9wZXJ0eSxcblx0TWV0YU1vZGVsVHlwZVxufSBmcm9tIFwiLi4vLi4vLi4vLi4vLi4vLi4vdHlwZXMvZXh0ZW5zaW9uX3R5cGVzXCI7XG5pbXBvcnQgQW55RWxlbWVudCBmcm9tIFwiLi9jb250cm9scy9BbnlFbGVtZW50XCI7XG5pbXBvcnQgeyBnZXRDb25kaXRpb25zIH0gZnJvbSBcIi4vdGVtcGxhdGluZy9GaWx0ZXJIZWxwZXJcIjtcblxudHlwZSBJbnRlcm5hbFJlc291cmNlQnVuZGxlID0gUmVzb3VyY2VCdW5kbGUgJiB7XG5cdGFDdXN0b21CdW5kbGVzOiBJbnRlcm5hbFJlc291cmNlQnVuZGxlW107XG59O1xuXG50eXBlIENvbmRpdGlvblR5cGUgPSB7XG5cdG9wZXJhdG9yOiBzdHJpbmc7XG5cdHZhbHVlczogQXJyYXk8dW5rbm93bj4gfCB1bmRlZmluZWQ7XG5cdHZhbGlkYXRlZD86IHN0cmluZztcbn07XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVNlYXJjaFRlcm0oc1NlYXJjaFRlcm06IHN0cmluZykge1xuXHRpZiAoIXNTZWFyY2hUZXJtKSB7XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxuXG5cdHJldHVybiBzU2VhcmNoVGVybVxuXHRcdC5yZXBsYWNlKC9cIi9nLCBcIiBcIilcblx0XHQucmVwbGFjZSgvXFxcXC9nLCBcIlxcXFxcXFxcXCIpIC8vZXNjYXBlIGJhY2tzbGFzaCBjaGFyYWN0ZXJzLiBDYW4gYmUgcmVtb3ZlZCBpZiBvZGF0YS9iaW5kaW5nIGhhbmRsZXMgYmFja2VuZCBlcnJvcnMgcmVzcG9uZHMuXG5cdFx0LnNwbGl0KC9cXHMrLylcblx0XHQucmVkdWNlKGZ1bmN0aW9uIChzTm9ybWFsaXplZDogc3RyaW5nIHwgdW5kZWZpbmVkLCBzQ3VycmVudFdvcmQ6IHN0cmluZykge1xuXHRcdFx0aWYgKHNDdXJyZW50V29yZCAhPT0gXCJcIikge1xuXHRcdFx0XHRzTm9ybWFsaXplZCA9IGAke3NOb3JtYWxpemVkID8gYCR7c05vcm1hbGl6ZWR9IGAgOiBcIlwifVwiJHtzQ3VycmVudFdvcmR9XCJgO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHNOb3JtYWxpemVkO1xuXHRcdH0sIHVuZGVmaW5lZCk7XG59XG5cbmZ1bmN0aW9uIGdldFByb3BlcnR5RGF0YVR5cGUob05hdmlnYXRpb25Db250ZXh0OiBDb250ZXh0KSB7XG5cdGxldCBzRGF0YVR5cGUgPSBvTmF2aWdhdGlvbkNvbnRleHQuZ2V0UHJvcGVydHkoXCIkVHlwZVwiKTtcblx0Ly8gaWYgJGtpbmQgZXhpc3RzLCBpdCdzIG5vdCBhIERhdGFGaWVsZCBhbmQgd2UgaGF2ZSB0aGUgZmluYWwgdHlwZSBhbHJlYWR5XG5cdGlmICghb05hdmlnYXRpb25Db250ZXh0LmdldFByb3BlcnR5KFwiJGtpbmRcIikpIHtcblx0XHRzd2l0Y2ggKHNEYXRhVHlwZSkge1xuXHRcdFx0Y2FzZSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkRhdGFGaWVsZEZvckFjdGlvblwiOlxuXHRcdFx0Y2FzZSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkRhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvblwiOlxuXHRcdFx0XHRzRGF0YVR5cGUgPSB1bmRlZmluZWQ7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuRGF0YUZpZWxkXCI6XG5cdFx0XHRjYXNlIFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuRGF0YUZpZWxkV2l0aE5hdmlnYXRpb25QYXRoXCI6XG5cdFx0XHRjYXNlIFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuRGF0YUZpZWxkV2l0aFVybFwiOlxuXHRcdFx0Y2FzZSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkRhdGFGaWVsZFdpdGhJbnRlbnRCYXNlZE5hdmlnYXRpb25cIjpcblx0XHRcdGNhc2UgXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5EYXRhRmllbGRXaXRoQWN0aW9uXCI6XG5cdFx0XHRcdHNEYXRhVHlwZSA9IG9OYXZpZ2F0aW9uQ29udGV4dC5nZXRQcm9wZXJ0eShcIlZhbHVlLyRQYXRoLyRUeXBlXCIpO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkRhdGFGaWVsZEZvckFubm90YXRpb25cIjpcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdGNvbnN0IHNBbm5vdGF0aW9uUGF0aCA9IG9OYXZpZ2F0aW9uQ29udGV4dC5nZXRQcm9wZXJ0eShcIlRhcmdldC8kQW5ub3RhdGlvblBhdGhcIik7XG5cdFx0XHRcdGlmIChzQW5ub3RhdGlvblBhdGgpIHtcblx0XHRcdFx0XHRpZiAoc0Fubm90YXRpb25QYXRoLmluZGV4T2YoXCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tdW5pY2F0aW9uLnYxLkNvbnRhY3RcIikgPiAtMSkge1xuXHRcdFx0XHRcdFx0c0RhdGFUeXBlID0gb05hdmlnYXRpb25Db250ZXh0LmdldFByb3BlcnR5KFwiVGFyZ2V0LyRBbm5vdGF0aW9uUGF0aC9mbi8kUGF0aC8kVHlwZVwiKTtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKHNBbm5vdGF0aW9uUGF0aC5pbmRleE9mKFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuRGF0YVBvaW50XCIpID4gLTEpIHtcblx0XHRcdFx0XHRcdHNEYXRhVHlwZSA9IG9OYXZpZ2F0aW9uQ29udGV4dC5nZXRQcm9wZXJ0eShcIlZhbHVlLyRQYXRoLyRUeXBlXCIpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHQvLyBlLmcuIEZpZWxkR3JvdXAgb3IgQ2hhcnRcblx0XHRcdFx0XHRcdHNEYXRhVHlwZSA9IHVuZGVmaW5lZDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0c0RhdGFUeXBlID0gdW5kZWZpbmVkO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGJyZWFrO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBzRGF0YVR5cGU7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdhaXRGb3JDb250ZXh0UmVxdWVzdGVkKGJpbmRpbmdDb250ZXh0OiBWNENvbnRleHQpIHtcblx0Y29uc3QgbW9kZWwgPSBiaW5kaW5nQ29udGV4dC5nZXRNb2RlbCgpO1xuXHRjb25zdCBtZXRhTW9kZWwgPSBtb2RlbC5nZXRNZXRhTW9kZWwoKTtcblx0Y29uc3QgZW50aXR5UGF0aCA9IG1ldGFNb2RlbC5nZXRNZXRhUGF0aChiaW5kaW5nQ29udGV4dC5nZXRQYXRoKCkpO1xuXHRjb25zdCBkYXRhTW9kZWwgPSBNZXRhTW9kZWxDb252ZXJ0ZXIuZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzKG1ldGFNb2RlbC5nZXRDb250ZXh0KGVudGl0eVBhdGgpKTtcblx0YXdhaXQgYmluZGluZ0NvbnRleHQucmVxdWVzdFByb3BlcnR5KGRhdGFNb2RlbC50YXJnZXRFbnRpdHlUeXBlLmtleXNbMF0/Lm5hbWUpO1xufVxuXG5mdW5jdGlvbiBmbkhhc1RyYW5zaWVudENvbnRleHRzKG9MaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZykge1xuXHRsZXQgYkhhc1RyYW5zaWVudENvbnRleHRzID0gZmFsc2U7XG5cdGlmIChvTGlzdEJpbmRpbmcpIHtcblx0XHRvTGlzdEJpbmRpbmcuZ2V0Q3VycmVudENvbnRleHRzKCkuZm9yRWFjaChmdW5jdGlvbiAob0NvbnRleHQ6IE9EYXRhVjRDb250ZXh0KSB7XG5cdFx0XHRpZiAob0NvbnRleHQgJiYgb0NvbnRleHQuaXNUcmFuc2llbnQoKSkge1xuXHRcdFx0XHRiSGFzVHJhbnNpZW50Q29udGV4dHMgPSB0cnVlO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cdHJldHVybiBiSGFzVHJhbnNpZW50Q29udGV4dHM7XG59XG5cbmZ1bmN0aW9uIGdldFNlYXJjaFJlc3RyaWN0aW9ucyhzRnVsbFBhdGg6IHN0cmluZywgb01ldGFNb2RlbENvbnRleHQ6IE9EYXRhTWV0YU1vZGVsKSB7XG5cdGxldCBvU2VhcmNoUmVzdHJpY3Rpb25zO1xuXHRsZXQgb05hdmlnYXRpb25TZWFyY2hSZXN0cmljdGlvbnM7XG5cdGNvbnN0IG5hdmlnYXRpb25UZXh0ID0gXCIkTmF2aWdhdGlvblByb3BlcnR5QmluZGluZ1wiO1xuXHRjb25zdCBzZWFyY2hSZXN0cmljdGlvbnNUZXJtID0gXCJAT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5TZWFyY2hSZXN0cmljdGlvbnNcIjtcblx0Y29uc3QgZW50aXR5VHlwZVBhdGhQYXJ0cyA9IHNGdWxsUGF0aC5yZXBsYWNlQWxsKFwiJTJGXCIsIFwiL1wiKS5zcGxpdChcIi9cIikuZmlsdGVyKE1vZGVsSGVscGVyLmZpbHRlck91dE5hdlByb3BCaW5kaW5nKTtcblx0Y29uc3QgZW50aXR5U2V0UGF0aCA9IE1vZGVsSGVscGVyLmdldEVudGl0eVNldFBhdGgoc0Z1bGxQYXRoLCBvTWV0YU1vZGVsQ29udGV4dCk7XG5cdGNvbnN0IGVudGl0eVNldFBhdGhQYXJ0cyA9IGVudGl0eVNldFBhdGguc3BsaXQoXCIvXCIpLmZpbHRlcihNb2RlbEhlbHBlci5maWx0ZXJPdXROYXZQcm9wQmluZGluZyk7XG5cdGNvbnN0IGlzQ29udGFpbm1lbnQgPSBvTWV0YU1vZGVsQ29udGV4dC5nZXRPYmplY3QoYC8ke2VudGl0eVR5cGVQYXRoUGFydHMuam9pbihcIi9cIil9LyRDb250YWluc1RhcmdldGApO1xuXHRjb25zdCBjb250YWlubWVudE5hdlBhdGggPSBpc0NvbnRhaW5tZW50ICYmIGVudGl0eVR5cGVQYXRoUGFydHNbZW50aXR5VHlwZVBhdGhQYXJ0cy5sZW5ndGggLSAxXTtcblxuXHQvL0xFQVNUIFBSSU9SSVRZIC0gU2VhcmNoIHJlc3RyaWN0aW9ucyBkaXJlY3RseSBhdCBFbnRpdHkgU2V0XG5cdC8vZS5nLiBGUiBpbiBcIk5TLkVudGl0eUNvbnRhaW5lci9TYWxlc09yZGVyTWFuYWdlXCIgQ29udGV4dFBhdGg6IC9TYWxlc09yZGVyTWFuYWdlXG5cdGlmICghaXNDb250YWlubWVudCkge1xuXHRcdG9TZWFyY2hSZXN0cmljdGlvbnMgPSBvTWV0YU1vZGVsQ29udGV4dC5nZXRPYmplY3QoYCR7ZW50aXR5U2V0UGF0aH0ke3NlYXJjaFJlc3RyaWN0aW9uc1Rlcm19YCkgYXNcblx0XHRcdHwgTWV0YU1vZGVsVHlwZTxTZWFyY2hSZXN0cmljdGlvbnNUeXBlPlxuXHRcdFx0fCB1bmRlZmluZWQ7XG5cdH1cblx0aWYgKGVudGl0eVR5cGVQYXRoUGFydHMubGVuZ3RoID4gMSkge1xuXHRcdGNvbnN0IG5hdlBhdGggPSBpc0NvbnRhaW5tZW50ID8gY29udGFpbm1lbnROYXZQYXRoIDogZW50aXR5U2V0UGF0aFBhcnRzW2VudGl0eVNldFBhdGhQYXJ0cy5sZW5ndGggLSAxXTtcblx0XHQvLyBJbiBjYXNlIG9mIGNvbnRhaW5tZW50IHdlIHRha2UgZW50aXR5U2V0IHByb3ZpZGVkIGFzIHBhcmVudC4gQW5kIGluIGNhc2Ugb2Ygbm9ybWFsIHdlIHdvdWxkIHJlbW92ZSB0aGUgbGFzdCBuYXZpZ2F0aW9uIGZyb20gZW50aXR5U2V0UGF0aC5cblx0XHRjb25zdCBwYXJlbnRFbnRpdHlTZXRQYXRoID0gaXNDb250YWlubWVudCA/IGVudGl0eVNldFBhdGggOiBgLyR7ZW50aXR5U2V0UGF0aFBhcnRzLnNsaWNlKDAsIC0xKS5qb2luKGAvJHtuYXZpZ2F0aW9uVGV4dH0vYCl9YDtcblxuXHRcdC8vSElHSEVTVCBwcmlvcml0eSAtIE5hdmlnYXRpb24gcmVzdHJpY3Rpb25zXG5cdFx0Ly9lLmcuIFBhcmVudCBcIi9DdXN0b21lclwiIHdpdGggTmF2aWdhdGlvblByb3BlcnR5UGF0aD1cIlNldFwiIENvbnRleHRQYXRoOiBDdXN0b21lci9TZXRcblx0XHRjb25zdCBvTmF2aWdhdGlvblJlc3RyaWN0aW9ucyA9IENvbW1vblV0aWxzLmdldE5hdmlnYXRpb25SZXN0cmljdGlvbnMoXG5cdFx0XHRvTWV0YU1vZGVsQ29udGV4dCxcblx0XHRcdHBhcmVudEVudGl0eVNldFBhdGgsXG5cdFx0XHRuYXZQYXRoLnJlcGxhY2VBbGwoXCIlMkZcIiwgXCIvXCIpXG5cdFx0KTtcblx0XHRvTmF2aWdhdGlvblNlYXJjaFJlc3RyaWN0aW9ucyA9IG9OYXZpZ2F0aW9uUmVzdHJpY3Rpb25zICYmIG9OYXZpZ2F0aW9uUmVzdHJpY3Rpb25zW1wiU2VhcmNoUmVzdHJpY3Rpb25zXCJdO1xuXHR9XG5cdHJldHVybiBvTmF2aWdhdGlvblNlYXJjaFJlc3RyaWN0aW9ucyB8fCBvU2VhcmNoUmVzdHJpY3Rpb25zO1xufVxuXG5mdW5jdGlvbiBnZXROYXZpZ2F0aW9uUmVzdHJpY3Rpb25zKG9NZXRhTW9kZWxDb250ZXh0OiBPRGF0YU1ldGFNb2RlbCwgc0VudGl0eVNldFBhdGg6IHN0cmluZywgc05hdmlnYXRpb25QYXRoOiBzdHJpbmcpIHtcblx0Y29uc3Qgb05hdmlnYXRpb25SZXN0cmljdGlvbnMgPSBvTWV0YU1vZGVsQ29udGV4dC5nZXRPYmplY3QoYCR7c0VudGl0eVNldFBhdGh9QE9yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuTmF2aWdhdGlvblJlc3RyaWN0aW9uc2ApIGFzXG5cdFx0fCBNZXRhTW9kZWxUeXBlPE5hdmlnYXRpb25SZXN0cmljdGlvbnNUeXBlPlxuXHRcdHwgdW5kZWZpbmVkO1xuXHRjb25zdCBhUmVzdHJpY3RlZFByb3BlcnRpZXMgPSBvTmF2aWdhdGlvblJlc3RyaWN0aW9ucyAmJiBvTmF2aWdhdGlvblJlc3RyaWN0aW9ucy5SZXN0cmljdGVkUHJvcGVydGllcztcblx0cmV0dXJuIChcblx0XHRhUmVzdHJpY3RlZFByb3BlcnRpZXMgJiZcblx0XHRhUmVzdHJpY3RlZFByb3BlcnRpZXMuZmluZChmdW5jdGlvbiAob1Jlc3RyaWN0ZWRQcm9wZXJ0eSkge1xuXHRcdFx0cmV0dXJuIChcblx0XHRcdFx0b1Jlc3RyaWN0ZWRQcm9wZXJ0eSAmJlxuXHRcdFx0XHRvUmVzdHJpY3RlZFByb3BlcnR5Lk5hdmlnYXRpb25Qcm9wZXJ0eSAmJlxuXHRcdFx0XHRvUmVzdHJpY3RlZFByb3BlcnR5Lk5hdmlnYXRpb25Qcm9wZXJ0eS4kTmF2aWdhdGlvblByb3BlcnR5UGF0aCA9PT0gc05hdmlnYXRpb25QYXRoXG5cdFx0XHQpO1xuXHRcdH0pXG5cdCk7XG59XG5cbmZ1bmN0aW9uIF9pc0luTm9uRmlsdGVyYWJsZVByb3BlcnRpZXMobWV0YW1vZGVsQ29udGV4dDogT0RhdGFNZXRhTW9kZWwsIHNFbnRpdHlTZXRQYXRoOiBzdHJpbmcsIHNDb250ZXh0UGF0aDogc3RyaW5nKSB7XG5cdGxldCBiSXNOb3RGaWx0ZXJhYmxlID0gZmFsc2U7XG5cdGNvbnN0IG9Bbm5vdGF0aW9uID0gbWV0YW1vZGVsQ29udGV4dC5nZXRPYmplY3QoYCR7c0VudGl0eVNldFBhdGh9QE9yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuRmlsdGVyUmVzdHJpY3Rpb25zYCkgYXNcblx0XHR8IE1ldGFNb2RlbFR5cGU8RmlsdGVyUmVzdHJpY3Rpb25zVHlwZT5cblx0XHR8IHVuZGVmaW5lZDtcblx0aWYgKG9Bbm5vdGF0aW9uICYmIG9Bbm5vdGF0aW9uLk5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzKSB7XG5cdFx0YklzTm90RmlsdGVyYWJsZSA9IG9Bbm5vdGF0aW9uLk5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzLnNvbWUoZnVuY3Rpb24gKHByb3BlcnR5KSB7XG5cdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHQocHJvcGVydHkgYXMgdW5rbm93biBhcyBFeHBhbmRQYXRoVHlwZTxFZG0uTmF2aWdhdGlvblByb3BlcnR5UGF0aD4pLiROYXZpZ2F0aW9uUHJvcGVydHlQYXRoID09PSBzQ29udGV4dFBhdGggfHxcblx0XHRcdFx0cHJvcGVydHkuJFByb3BlcnR5UGF0aCA9PT0gc0NvbnRleHRQYXRoXG5cdFx0XHQpO1xuXHRcdH0pO1xuXHR9XG5cdHJldHVybiBiSXNOb3RGaWx0ZXJhYmxlO1xufVxuXG5mdW5jdGlvbiBfaXNDdXN0b21BZ2dyZWdhdGUobWV0YW1vZGVsQ29udGV4dDogT0RhdGFNZXRhTW9kZWwsIHNFbnRpdHlTZXRQYXRoOiBzdHJpbmcsIHNDb250ZXh0UGF0aDogc3RyaW5nKSB7XG5cdGxldCBiQ3VzdG9tQWdncmVnYXRlID0gZmFsc2U7XG5cdGNvbnN0IGJBcHBseVN1cHBvcnRlZCA9IG1ldGFtb2RlbENvbnRleHQ/LmdldE9iamVjdChzRW50aXR5U2V0UGF0aCArIFwiQE9yZy5PRGF0YS5BZ2dyZWdhdGlvbi5WMS5BcHBseVN1cHBvcnRlZFwiKSA/IHRydWUgOiBmYWxzZTtcblx0aWYgKGJBcHBseVN1cHBvcnRlZCkge1xuXHRcdGNvbnN0IG9Bbm5vdGF0aW9ucyA9IG1ldGFtb2RlbENvbnRleHQuZ2V0T2JqZWN0KGAke3NFbnRpdHlTZXRQYXRofUBgKTtcblx0XHRjb25zdCBvQ3VzdG9tQWdncmVnZ2F0ZXMgPSBtZXRhTW9kZWxVdGlsLmdldEFsbEN1c3RvbUFnZ3JlZ2F0ZXMob0Fubm90YXRpb25zKTtcblx0XHRjb25zdCBhQ3VzdG9tQWdncmVnYXRlcyA9IG9DdXN0b21BZ2dyZWdnYXRlcyA/IE9iamVjdC5rZXlzKG9DdXN0b21BZ2dyZWdnYXRlcykgOiB1bmRlZmluZWQ7XG5cdFx0aWYgKGFDdXN0b21BZ2dyZWdhdGVzICYmIGFDdXN0b21BZ2dyZWdhdGVzPy5pbmRleE9mKHNDb250ZXh0UGF0aCkgPiAtMSkge1xuXHRcdFx0YkN1c3RvbUFnZ3JlZ2F0ZSA9IHRydWU7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBiQ3VzdG9tQWdncmVnYXRlO1xufVxuXG4vLyBUT0RPIHJld29yayB0aGlzIVxuZnVuY3Rpb24gX2lzQ29udGV4dFBhdGhGaWx0ZXJhYmxlKG9Nb2RlbENvbnRleHQ6IE9EYXRhTWV0YU1vZGVsLCBzRW50aXR5U2V0UGF0aDogc3RyaW5nLCBzQ29udGV4UGF0aDogc3RyaW5nKSB7XG5cdGNvbnN0IHNGdWxsUGF0aCA9IGAke3NFbnRpdHlTZXRQYXRofS8ke3NDb250ZXhQYXRofWAsXG5cdFx0YUVTUGFydHMgPSBzRnVsbFBhdGguc3BsaXQoXCIvXCIpLnNwbGljZSgwLCAyKSxcblx0XHRhQ29udGV4dCA9IHNGdWxsUGF0aC5zcGxpdChcIi9cIikuc3BsaWNlKDIpO1xuXHRsZXQgYklzTm90RmlsdGVyYWJsZSA9IGZhbHNlLFxuXHRcdHNDb250ZXh0ID0gXCJcIjtcblxuXHRzRW50aXR5U2V0UGF0aCA9IGFFU1BhcnRzLmpvaW4oXCIvXCIpO1xuXG5cdGJJc05vdEZpbHRlcmFibGUgPSBhQ29udGV4dC5zb21lKGZ1bmN0aW9uIChpdGVtOiBzdHJpbmcsIGluZGV4OiBudW1iZXIsIGFycmF5OiBzdHJpbmdbXSkge1xuXHRcdGlmIChzQ29udGV4dC5sZW5ndGggPiAwKSB7XG5cdFx0XHRzQ29udGV4dCArPSBgLyR7aXRlbX1gO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRzQ29udGV4dCA9IGl0ZW07XG5cdFx0fVxuXHRcdGlmIChpbmRleCA9PT0gYXJyYXkubGVuZ3RoIC0gMikge1xuXHRcdFx0Ly8gSW4gY2FzZSBvZiBcIi9DdXN0b21lci9TZXQvUHJvcGVydHlcIiB0aGlzIGlzIHRvIGNoZWNrIG5hdmlnYXRpb24gcmVzdHJpY3Rpb25zIG9mIFwiQ3VzdG9tZXJcIiBmb3Igbm9uLWZpbHRlcmFibGUgcHJvcGVydGllcyBpbiBcIlNldFwiXG5cdFx0XHRjb25zdCBvTmF2aWdhdGlvblJlc3RyaWN0aW9ucyA9IGdldE5hdmlnYXRpb25SZXN0cmljdGlvbnMob01vZGVsQ29udGV4dCwgc0VudGl0eVNldFBhdGgsIGl0ZW0pO1xuXHRcdFx0Y29uc3Qgb0ZpbHRlclJlc3RyaWN0aW9ucyA9IG9OYXZpZ2F0aW9uUmVzdHJpY3Rpb25zICYmIG9OYXZpZ2F0aW9uUmVzdHJpY3Rpb25zLkZpbHRlclJlc3RyaWN0aW9ucztcblx0XHRcdGNvbnN0IGFOb25GaWx0ZXJhYmxlUHJvcGVydGllcyA9IG9GaWx0ZXJSZXN0cmljdGlvbnMgJiYgb0ZpbHRlclJlc3RyaWN0aW9ucy5Ob25GaWx0ZXJhYmxlUHJvcGVydGllcztcblx0XHRcdGNvbnN0IHNUYXJnZXRQcm9wZXJ0eVBhdGggPSBhcnJheVthcnJheS5sZW5ndGggLSAxXTtcblx0XHRcdGlmIChcblx0XHRcdFx0YU5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzICYmXG5cdFx0XHRcdGFOb25GaWx0ZXJhYmxlUHJvcGVydGllcy5maW5kKGZ1bmN0aW9uIChvUHJvcGVydHlQYXRoKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG9Qcm9wZXJ0eVBhdGguJFByb3BlcnR5UGF0aCA9PT0gc1RhcmdldFByb3BlcnR5UGF0aDtcblx0XHRcdFx0fSlcblx0XHRcdCkge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKGluZGV4ID09PSBhcnJheS5sZW5ndGggLSAxKSB7XG5cdFx0XHQvL2xhc3QgcGF0aCBzZWdtZW50XG5cdFx0XHRiSXNOb3RGaWx0ZXJhYmxlID0gX2lzSW5Ob25GaWx0ZXJhYmxlUHJvcGVydGllcyhvTW9kZWxDb250ZXh0LCBzRW50aXR5U2V0UGF0aCwgc0NvbnRleHQpO1xuXHRcdH0gZWxzZSBpZiAob01vZGVsQ29udGV4dC5nZXRPYmplY3QoYCR7c0VudGl0eVNldFBhdGh9LyROYXZpZ2F0aW9uUHJvcGVydHlCaW5kaW5nLyR7aXRlbX1gKSkge1xuXHRcdFx0Ly9jaGVjayBleGlzdGluZyBjb250ZXh0IHBhdGggYW5kIGluaXRpYWxpemUgaXRcblx0XHRcdGJJc05vdEZpbHRlcmFibGUgPSBfaXNJbk5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzKG9Nb2RlbENvbnRleHQsIHNFbnRpdHlTZXRQYXRoLCBzQ29udGV4dCk7XG5cdFx0XHRzQ29udGV4dCA9IFwiXCI7XG5cdFx0XHQvL3NldCB0aGUgbmV3IEVudGl0eVNldFxuXHRcdFx0c0VudGl0eVNldFBhdGggPSBgLyR7b01vZGVsQ29udGV4dC5nZXRPYmplY3QoYCR7c0VudGl0eVNldFBhdGh9LyROYXZpZ2F0aW9uUHJvcGVydHlCaW5kaW5nLyR7aXRlbX1gKX1gO1xuXHRcdH1cblx0XHRyZXR1cm4gYklzTm90RmlsdGVyYWJsZSA9PT0gdHJ1ZTtcblx0fSk7XG5cdHJldHVybiBiSXNOb3RGaWx0ZXJhYmxlO1xufVxuXG4vLyBUT0RPIGNoZWNrIHVzZWQgcGxhY2VzIGFuZCByZXdvcmsgdGhpc1xuZnVuY3Rpb24gaXNQcm9wZXJ0eUZpbHRlcmFibGUoXG5cdG1ldGFNb2RlbENvbnRleHQ6IE9EYXRhTWV0YU1vZGVsLFxuXHRzRW50aXR5U2V0UGF0aDogc3RyaW5nLFxuXHRzUHJvcGVydHk6IHN0cmluZyxcblx0YlNraXBIaWRkZW5GaWx0ZXI/OiBib29sZWFuXG4pOiBib29sZWFuIHwgQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24ge1xuXHRpZiAodHlwZW9mIHNQcm9wZXJ0eSAhPT0gXCJzdHJpbmdcIikge1xuXHRcdHRocm93IG5ldyBFcnJvcihcInNQcm9wZXJ0eSBwYXJhbWV0ZXIgbXVzdCBiZSBhIHN0cmluZ1wiKTtcblx0fVxuXHRsZXQgYklzRmlsdGVyYWJsZTtcblxuXHQvLyBQYXJhbWV0ZXJzIHNob3VsZCBiZSByZW5kZXJlZCBhcyBmaWx0ZXJmaWVsZHNcblx0aWYgKG1ldGFNb2RlbENvbnRleHQuZ2V0T2JqZWN0KGAke3NFbnRpdHlTZXRQYXRofS9AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLlJlc3VsdENvbnRleHRgKT8udmFsdWVPZigpID09PSB0cnVlKSB7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHRjb25zdCBvTmF2aWdhdGlvbkNvbnRleHQgPSBtZXRhTW9kZWxDb250ZXh0LmNyZWF0ZUJpbmRpbmdDb250ZXh0KGAke3NFbnRpdHlTZXRQYXRofS8ke3NQcm9wZXJ0eX1gKSBhcyBDb250ZXh0O1xuXG5cdGlmICghYlNraXBIaWRkZW5GaWx0ZXIpIHtcblx0XHRpZiAoXG5cdFx0XHRvTmF2aWdhdGlvbkNvbnRleHQuZ2V0UHJvcGVydHkoXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuSGlkZGVuXCIpID09PSB0cnVlIHx8XG5cdFx0XHRvTmF2aWdhdGlvbkNvbnRleHQuZ2V0UHJvcGVydHkoXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuSGlkZGVuRmlsdGVyXCIpID09PSB0cnVlXG5cdFx0KSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHRcdGNvbnN0IHNIaWRkZW5QYXRoID0gb05hdmlnYXRpb25Db250ZXh0LmdldFByb3BlcnR5KFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkhpZGRlbi8kUGF0aFwiKTtcblx0XHRjb25zdCBzSGlkZGVuRmlsdGVyUGF0aCA9IG9OYXZpZ2F0aW9uQ29udGV4dC5nZXRQcm9wZXJ0eShcIkBjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5IaWRkZW5GaWx0ZXIvJFBhdGhcIik7XG5cblx0XHRpZiAoc0hpZGRlblBhdGggJiYgc0hpZGRlbkZpbHRlclBhdGgpIHtcblx0XHRcdHJldHVybiBjb21waWxlRXhwcmVzc2lvbihub3Qob3IocGF0aEluTW9kZWwoc0hpZGRlblBhdGgpLCBwYXRoSW5Nb2RlbChzSGlkZGVuRmlsdGVyUGF0aCkpKSk7XG5cdFx0fSBlbHNlIGlmIChzSGlkZGVuUGF0aCkge1xuXHRcdFx0cmV0dXJuIGNvbXBpbGVFeHByZXNzaW9uKG5vdChwYXRoSW5Nb2RlbChzSGlkZGVuUGF0aCkpKTtcblx0XHR9IGVsc2UgaWYgKHNIaWRkZW5GaWx0ZXJQYXRoKSB7XG5cdFx0XHRyZXR1cm4gY29tcGlsZUV4cHJlc3Npb24obm90KHBhdGhJbk1vZGVsKHNIaWRkZW5GaWx0ZXJQYXRoKSkpO1xuXHRcdH1cblx0fVxuXG5cdC8vIHRoZXJlIGlzIG5vIG5hdmlnYXRpb24gaW4gZW50aXR5U2V0IHBhdGggYW5kIHByb3BlcnR5IHBhdGhcblx0YklzRmlsdGVyYWJsZSA9XG5cdFx0c0VudGl0eVNldFBhdGguc3BsaXQoXCIvXCIpLmxlbmd0aCA9PT0gMiAmJiBzUHJvcGVydHkuaW5kZXhPZihcIi9cIikgPCAwXG5cdFx0XHQ/ICFfaXNJbk5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzKG1ldGFNb2RlbENvbnRleHQsIHNFbnRpdHlTZXRQYXRoLCBzUHJvcGVydHkpICYmXG5cdFx0XHQgICFfaXNDdXN0b21BZ2dyZWdhdGUobWV0YU1vZGVsQ29udGV4dCwgc0VudGl0eVNldFBhdGgsIHNQcm9wZXJ0eSlcblx0XHRcdDogIV9pc0NvbnRleHRQYXRoRmlsdGVyYWJsZShtZXRhTW9kZWxDb250ZXh0LCBzRW50aXR5U2V0UGF0aCwgc1Byb3BlcnR5KTtcblx0Ly8gY2hlY2sgaWYgdHlwZSBjYW4gYmUgdXNlZCBmb3IgZmlsdGVyaW5nXG5cdGlmIChiSXNGaWx0ZXJhYmxlICYmIG9OYXZpZ2F0aW9uQ29udGV4dCkge1xuXHRcdGNvbnN0IHNQcm9wZXJ0eURhdGFUeXBlID0gZ2V0UHJvcGVydHlEYXRhVHlwZShvTmF2aWdhdGlvbkNvbnRleHQpO1xuXHRcdGlmIChzUHJvcGVydHlEYXRhVHlwZSkge1xuXHRcdFx0YklzRmlsdGVyYWJsZSA9IHNQcm9wZXJ0eURhdGFUeXBlID8gaXNUeXBlRmlsdGVyYWJsZShzUHJvcGVydHlEYXRhVHlwZSBhcyBrZXlvZiB0eXBlb2YgRGVmYXVsdFR5cGVGb3JFZG1UeXBlKSA6IGZhbHNlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRiSXNGaWx0ZXJhYmxlID0gZmFsc2U7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGJJc0ZpbHRlcmFibGU7XG59XG5mdW5jdGlvbiBnZXRTaGVsbFNlcnZpY2VzKG9Db250cm9sOiBDb250cm9sIHwgQ29tcG9uZW50KTogSVNoZWxsU2VydmljZXMge1xuXHRyZXR1cm4gZ2V0QXBwQ29tcG9uZW50KG9Db250cm9sKS5nZXRTaGVsbFNlcnZpY2VzKCk7XG59XG5cbmZ1bmN0aW9uIGdldEhhc2goKTogc3RyaW5nIHtcblx0Y29uc3Qgc0hhc2ggPSB3aW5kb3cubG9jYXRpb24uaGFzaDtcblx0cmV0dXJuIHNIYXNoLnNwbGl0KFwiJlwiKVswXTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gX2dldFNPSW50ZW50cyhcblx0b1NoZWxsU2VydmljZUhlbHBlcjogSVNoZWxsU2VydmljZXMsXG5cdG9PYmplY3RQYWdlTGF5b3V0OiBPYmplY3RQYWdlTGF5b3V0LFxuXHRvU2VtYW50aWNPYmplY3Q6IHVua25vd24sXG5cdG9QYXJhbTogdW5rbm93blxuKTogUHJvbWlzZTxMaW5rRGVmaW5pdGlvbltdPiB7XG5cdHJldHVybiBvU2hlbGxTZXJ2aWNlSGVscGVyLmdldExpbmtzKHtcblx0XHRzZW1hbnRpY09iamVjdDogb1NlbWFudGljT2JqZWN0LFxuXHRcdHBhcmFtczogb1BhcmFtXG5cdH0pIGFzIFByb21pc2U8TGlua0RlZmluaXRpb25bXT47XG59XG5cbi8vIFRPLURPIGFkZCB0aGlzIGFzIHBhcnQgb2YgYXBwbHlTZW1hbnRpY09iamVjdG1hcHBpbmdzIGxvZ2ljIGluIEludGVudEJhc2VkbmF2aWdhdGlvbiBjb250cm9sbGVyIGV4dGVuc2lvblxuZnVuY3Rpb24gX2NyZWF0ZU1hcHBpbmdzKG9NYXBwaW5nOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikge1xuXHRjb25zdCBhU09NYXBwaW5ncyA9IFtdO1xuXHRjb25zdCBhTWFwcGluZ0tleXMgPSBPYmplY3Qua2V5cyhvTWFwcGluZyk7XG5cdGxldCBvU2VtYW50aWNNYXBwaW5nO1xuXHRmb3IgKGxldCBpID0gMDsgaSA8IGFNYXBwaW5nS2V5cy5sZW5ndGg7IGkrKykge1xuXHRcdG9TZW1hbnRpY01hcHBpbmcgPSB7XG5cdFx0XHRMb2NhbFByb3BlcnR5OiB7XG5cdFx0XHRcdCRQcm9wZXJ0eVBhdGg6IGFNYXBwaW5nS2V5c1tpXVxuXHRcdFx0fSxcblx0XHRcdFNlbWFudGljT2JqZWN0UHJvcGVydHk6IG9NYXBwaW5nW2FNYXBwaW5nS2V5c1tpXV1cblx0XHR9O1xuXHRcdGFTT01hcHBpbmdzLnB1c2gob1NlbWFudGljTWFwcGluZyk7XG5cdH1cblxuXHRyZXR1cm4gYVNPTWFwcGluZ3M7XG59XG50eXBlIExpbmtEZWZpbml0aW9uID0ge1xuXHRpbnRlbnQ6IHN0cmluZztcblx0dGV4dDogc3RyaW5nO1xufTtcbnR5cGUgU2VtYW50aWNJdGVtID0ge1xuXHR0ZXh0OiBzdHJpbmc7XG5cdHRhcmdldFNlbU9iamVjdDogc3RyaW5nO1xuXHR0YXJnZXRBY3Rpb246IHN0cmluZztcblx0dGFyZ2V0UGFyYW1zOiB1bmtub3duO1xufTtcbi8qKlxuICogQHBhcmFtIGFMaW5rc1xuICogQHBhcmFtIGFFeGNsdWRlZEFjdGlvbnNcbiAqIEBwYXJhbSBvVGFyZ2V0UGFyYW1zXG4gKiBAcGFyYW0gYUl0ZW1zXG4gKiBAcGFyYW0gYUFsbG93ZWRBY3Rpb25zXG4gKi9cbmZ1bmN0aW9uIF9nZXRSZWxhdGVkQXBwc01lbnVJdGVtcyhcblx0YUxpbmtzOiBMaW5rRGVmaW5pdGlvbltdLFxuXHRhRXhjbHVkZWRBY3Rpb25zOiB1bmtub3duW10sXG5cdG9UYXJnZXRQYXJhbXM6IHVua25vd24sXG5cdGFJdGVtczogU2VtYW50aWNJdGVtW10sXG5cdGFBbGxvd2VkQWN0aW9ucz86IHVua25vd25bXVxuKSB7XG5cdGZvciAobGV0IGkgPSAwOyBpIDwgYUxpbmtzLmxlbmd0aDsgaSsrKSB7XG5cdFx0Y29uc3Qgb0xpbmsgPSBhTGlua3NbaV07XG5cdFx0Y29uc3Qgc0ludGVudCA9IG9MaW5rLmludGVudDtcblx0XHRjb25zdCBzQWN0aW9uID0gc0ludGVudC5zcGxpdChcIi1cIilbMV0uc3BsaXQoXCI/XCIpWzBdO1xuXHRcdGlmIChhQWxsb3dlZEFjdGlvbnMgJiYgYUFsbG93ZWRBY3Rpb25zLmluY2x1ZGVzKHNBY3Rpb24pKSB7XG5cdFx0XHRhSXRlbXMucHVzaCh7XG5cdFx0XHRcdHRleHQ6IG9MaW5rLnRleHQsXG5cdFx0XHRcdHRhcmdldFNlbU9iamVjdDogc0ludGVudC5zcGxpdChcIiNcIilbMV0uc3BsaXQoXCItXCIpWzBdLFxuXHRcdFx0XHR0YXJnZXRBY3Rpb246IHNBY3Rpb24uc3BsaXQoXCJ+XCIpWzBdLFxuXHRcdFx0XHR0YXJnZXRQYXJhbXM6IG9UYXJnZXRQYXJhbXNcblx0XHRcdH0pO1xuXHRcdH0gZWxzZSBpZiAoIWFBbGxvd2VkQWN0aW9ucyAmJiBhRXhjbHVkZWRBY3Rpb25zICYmIGFFeGNsdWRlZEFjdGlvbnMuaW5kZXhPZihzQWN0aW9uKSA9PT0gLTEpIHtcblx0XHRcdGFJdGVtcy5wdXNoKHtcblx0XHRcdFx0dGV4dDogb0xpbmsudGV4dCxcblx0XHRcdFx0dGFyZ2V0U2VtT2JqZWN0OiBzSW50ZW50LnNwbGl0KFwiI1wiKVsxXS5zcGxpdChcIi1cIilbMF0sXG5cdFx0XHRcdHRhcmdldEFjdGlvbjogc0FjdGlvbi5zcGxpdChcIn5cIilbMF0sXG5cdFx0XHRcdHRhcmdldFBhcmFtczogb1RhcmdldFBhcmFtc1xuXHRcdFx0fSk7XG5cdFx0fVxuXHR9XG59XG5cbnR5cGUgU2VtYW50aWNPYmplY3QgPSB7XG5cdGFsbG93ZWRBY3Rpb25zPzogdW5rbm93bltdO1xuXHR1bmF2YWlsYWJsZUFjdGlvbnM/OiB1bmtub3duW107XG5cdHNlbWFudGljT2JqZWN0OiBzdHJpbmc7XG5cdHBhdGg6IHN0cmluZztcblx0bWFwcGluZz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG59O1xuXG5mdW5jdGlvbiBfZ2V0UmVsYXRlZEludGVudHMoXG5cdG9BZGRpdGlvbmFsU2VtYW50aWNPYmplY3RzOiBTZW1hbnRpY09iamVjdCxcblx0b0JpbmRpbmdDb250ZXh0OiBDb250ZXh0LFxuXHRhTWFuaWZlc3RTT0l0ZW1zOiBTZW1hbnRpY0l0ZW1bXSxcblx0YUxpbmtzOiBMaW5rRGVmaW5pdGlvbltdXG4pIHtcblx0aWYgKGFMaW5rcyAmJiBhTGlua3MubGVuZ3RoID4gMCkge1xuXHRcdGNvbnN0IGFBbGxvd2VkQWN0aW9ucyA9IG9BZGRpdGlvbmFsU2VtYW50aWNPYmplY3RzLmFsbG93ZWRBY3Rpb25zIHx8IHVuZGVmaW5lZDtcblx0XHRjb25zdCBhRXhjbHVkZWRBY3Rpb25zID0gb0FkZGl0aW9uYWxTZW1hbnRpY09iamVjdHMudW5hdmFpbGFibGVBY3Rpb25zID8gb0FkZGl0aW9uYWxTZW1hbnRpY09iamVjdHMudW5hdmFpbGFibGVBY3Rpb25zIDogW107XG5cdFx0Y29uc3QgYVNPTWFwcGluZ3MgPSBvQWRkaXRpb25hbFNlbWFudGljT2JqZWN0cy5tYXBwaW5nID8gX2NyZWF0ZU1hcHBpbmdzKG9BZGRpdGlvbmFsU2VtYW50aWNPYmplY3RzLm1hcHBpbmcpIDogW107XG5cdFx0Y29uc3Qgb1RhcmdldFBhcmFtcyA9IHsgbmF2aWdhdGlvbkNvbnRleHRzOiBvQmluZGluZ0NvbnRleHQsIHNlbWFudGljT2JqZWN0TWFwcGluZzogYVNPTWFwcGluZ3MgfTtcblx0XHRfZ2V0UmVsYXRlZEFwcHNNZW51SXRlbXMoYUxpbmtzLCBhRXhjbHVkZWRBY3Rpb25zLCBvVGFyZ2V0UGFyYW1zLCBhTWFuaWZlc3RTT0l0ZW1zLCBhQWxsb3dlZEFjdGlvbnMpO1xuXHR9XG59XG5cbnR5cGUgU2VtYW50aWNPYmplY3RDb25maWcgPSB7XG5cdGFkZGl0aW9uYWxTZW1hbnRpY09iamVjdHM6IFJlY29yZDxzdHJpbmcsIFNlbWFudGljT2JqZWN0Pjtcbn07XG50eXBlIFJlbGF0ZWRBcHBzQ29uZmlnID0ge1xuXHR0ZXh0OiBzdHJpbmc7XG5cdHRhcmdldFNlbU9iamVjdDogc3RyaW5nO1xuXHR0YXJnZXRBY3Rpb246IHN0cmluZztcbn07XG5hc3luYyBmdW5jdGlvbiB1cGRhdGVSZWxhdGVBcHBzTW9kZWwoXG5cdG9CaW5kaW5nQ29udGV4dDogQ29udGV4dCxcblx0b0VudHJ5OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCxcblx0b09iamVjdFBhZ2VMYXlvdXQ6IE9iamVjdFBhZ2VMYXlvdXQsXG5cdGFTZW1LZXlzOiB7ICRQcm9wZXJ0eVBhdGg6IHN0cmluZyB9W10sXG5cdG9NZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsLFxuXHRvTWV0YVBhdGg6IHN0cmluZ1xuKTogUHJvbWlzZTxSZWxhdGVkQXBwc0NvbmZpZ1tdPiB7XG5cdGNvbnN0IG9TaGVsbFNlcnZpY2VIZWxwZXI6IElTaGVsbFNlcnZpY2VzID0gZ2V0U2hlbGxTZXJ2aWNlcyhvT2JqZWN0UGFnZUxheW91dCk7XG5cdGNvbnN0IG9QYXJhbTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblx0bGV0IHNDdXJyZW50U2VtT2JqID0gXCJcIixcblx0XHRzQ3VycmVudEFjdGlvbiA9IFwiXCI7XG5cdGxldCBvU2VtYW50aWNPYmplY3RBbm5vdGF0aW9ucztcblx0bGV0IGFSZWxhdGVkQXBwc01lbnVJdGVtczogUmVsYXRlZEFwcHNDb25maWdbXSA9IFtdO1xuXHRsZXQgYUV4Y2x1ZGVkQWN0aW9uczogdW5rbm93bltdID0gW107XG5cdGxldCBhTWFuaWZlc3RTT0tleXM6IHN0cmluZ1tdO1xuXG5cdGFzeW5jIGZ1bmN0aW9uIGZuR2V0UGFyc2VTaGVsbEhhc2hBbmRHZXRMaW5rcygpIHtcblx0XHRjb25zdCBvUGFyc2VkVXJsID0gb1NoZWxsU2VydmljZUhlbHBlci5wYXJzZVNoZWxsSGFzaChkb2N1bWVudC5sb2NhdGlvbi5oYXNoKTtcblx0XHRzQ3VycmVudFNlbU9iaiA9IG9QYXJzZWRVcmwuc2VtYW50aWNPYmplY3Q7IC8vIEN1cnJlbnQgU2VtYW50aWMgT2JqZWN0XG5cdFx0c0N1cnJlbnRBY3Rpb24gPSBvUGFyc2VkVXJsLmFjdGlvbjtcblx0XHRyZXR1cm4gX2dldFNPSW50ZW50cyhvU2hlbGxTZXJ2aWNlSGVscGVyLCBvT2JqZWN0UGFnZUxheW91dCwgc0N1cnJlbnRTZW1PYmosIG9QYXJhbSk7XG5cdH1cblxuXHR0cnkge1xuXHRcdGlmIChvRW50cnkpIHtcblx0XHRcdGlmIChhU2VtS2V5cyAmJiBhU2VtS2V5cy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdGZvciAobGV0IGogPSAwOyBqIDwgYVNlbUtleXMubGVuZ3RoOyBqKyspIHtcblx0XHRcdFx0XHRjb25zdCBzU2VtS2V5ID0gYVNlbUtleXNbal0uJFByb3BlcnR5UGF0aDtcblx0XHRcdFx0XHRpZiAoIW9QYXJhbVtzU2VtS2V5XSkge1xuXHRcdFx0XHRcdFx0b1BhcmFtW3NTZW1LZXldID0geyB2YWx1ZTogb0VudHJ5W3NTZW1LZXldIH07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyBmYWxsYmFjayB0byBUZWNobmljYWwgS2V5cyBpZiBubyBTZW1hbnRpYyBLZXkgaXMgcHJlc2VudFxuXHRcdFx0XHRjb25zdCBhVGVjaG5pY2FsS2V5cyA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke29NZXRhUGF0aH0vJFR5cGUvJEtleWApO1xuXHRcdFx0XHRmb3IgKGNvbnN0IGtleSBpbiBhVGVjaG5pY2FsS2V5cykge1xuXHRcdFx0XHRcdGNvbnN0IHNPYmpLZXkgPSBhVGVjaG5pY2FsS2V5c1trZXldO1xuXHRcdFx0XHRcdGlmICghb1BhcmFtW3NPYmpLZXldKSB7XG5cdFx0XHRcdFx0XHRvUGFyYW1bc09iaktleV0gPSB7IHZhbHVlOiBvRW50cnlbc09iaktleV0gfTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0Ly8gTG9naWMgdG8gcmVhZCBhZGRpdGlvbmFsIFNPIGZyb20gbWFuaWZlc3QgYW5kIHVwZGF0ZWQgcmVsYXRlZGFwcHMgbW9kZWxcblxuXHRcdGNvbnN0IG9NYW5pZmVzdERhdGEgPSBnZXRUYXJnZXRWaWV3KG9PYmplY3RQYWdlTGF5b3V0KS5nZXRWaWV3RGF0YSgpIGFzIFNlbWFudGljT2JqZWN0Q29uZmlnO1xuXHRcdGNvbnN0IGFNYW5pZmVzdFNPSXRlbXM6IFNlbWFudGljSXRlbVtdID0gW107XG5cdFx0bGV0IHNlbWFudGljT2JqZWN0SW50ZW50cztcblx0XHRpZiAob01hbmlmZXN0RGF0YS5hZGRpdGlvbmFsU2VtYW50aWNPYmplY3RzKSB7XG5cdFx0XHRhTWFuaWZlc3RTT0tleXMgPSBPYmplY3Qua2V5cyhvTWFuaWZlc3REYXRhLmFkZGl0aW9uYWxTZW1hbnRpY09iamVjdHMpO1xuXHRcdFx0Zm9yIChsZXQga2V5ID0gMDsga2V5IDwgYU1hbmlmZXN0U09LZXlzLmxlbmd0aDsga2V5KyspIHtcblx0XHRcdFx0c2VtYW50aWNPYmplY3RJbnRlbnRzID0gYXdhaXQgUHJvbWlzZS5yZXNvbHZlKFxuXHRcdFx0XHRcdF9nZXRTT0ludGVudHMob1NoZWxsU2VydmljZUhlbHBlciwgb09iamVjdFBhZ2VMYXlvdXQsIGFNYW5pZmVzdFNPS2V5c1trZXldLCBvUGFyYW0pXG5cdFx0XHRcdCk7XG5cdFx0XHRcdF9nZXRSZWxhdGVkSW50ZW50cyhcblx0XHRcdFx0XHRvTWFuaWZlc3REYXRhLmFkZGl0aW9uYWxTZW1hbnRpY09iamVjdHNbYU1hbmlmZXN0U09LZXlzW2tleV1dLFxuXHRcdFx0XHRcdG9CaW5kaW5nQ29udGV4dCxcblx0XHRcdFx0XHRhTWFuaWZlc3RTT0l0ZW1zLFxuXHRcdFx0XHRcdHNlbWFudGljT2JqZWN0SW50ZW50c1xuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRjb25zdCBpbnRlcm5hbE1vZGVsQ29udGV4dCA9IG9PYmplY3RQYWdlTGF5b3V0LmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQ7XG5cdFx0Y29uc3QgYUxpbmtzID0gYXdhaXQgZm5HZXRQYXJzZVNoZWxsSGFzaEFuZEdldExpbmtzKCk7XG5cdFx0aWYgKGFMaW5rcykge1xuXHRcdFx0aWYgKGFMaW5rcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdGxldCBpc1NlbWFudGljT2JqZWN0SGFzU2FtZVRhcmdldEluTWFuaWZlc3QgPSBmYWxzZTtcblx0XHRcdFx0Y29uc3Qgb1RhcmdldFBhcmFtczoge1xuXHRcdFx0XHRcdG5hdmlnYXRpb25Db250ZXh0cz86IENvbnRleHQ7XG5cdFx0XHRcdFx0c2VtYW50aWNPYmplY3RNYXBwaW5nPzogTWV0YU1vZGVsVHlwZTxTZW1hbnRpY09iamVjdE1hcHBpbmdUeXBlPltdO1xuXHRcdFx0XHR9ID0ge307XG5cdFx0XHRcdGNvbnN0IGFBbm5vdGF0aW9uc1NPSXRlbXM6IFNlbWFudGljSXRlbVtdID0gW107XG5cdFx0XHRcdGNvbnN0IHNFbnRpdHlTZXRQYXRoID0gYCR7b01ldGFQYXRofUBgO1xuXHRcdFx0XHRjb25zdCBzRW50aXR5VHlwZVBhdGggPSBgJHtvTWV0YVBhdGh9L0BgO1xuXHRcdFx0XHRjb25zdCBvRW50aXR5U2V0QW5ub3RhdGlvbnMgPSBvTWV0YU1vZGVsLmdldE9iamVjdChzRW50aXR5U2V0UGF0aCk7XG5cdFx0XHRcdG9TZW1hbnRpY09iamVjdEFubm90YXRpb25zID0gQ29tbW9uVXRpbHMuZ2V0U2VtYW50aWNPYmplY3RBbm5vdGF0aW9ucyhvRW50aXR5U2V0QW5ub3RhdGlvbnMsIHNDdXJyZW50U2VtT2JqKTtcblx0XHRcdFx0aWYgKCFvU2VtYW50aWNPYmplY3RBbm5vdGF0aW9ucy5iSGFzRW50aXR5U2V0U08pIHtcblx0XHRcdFx0XHRjb25zdCBvRW50aXR5VHlwZUFubm90YXRpb25zID0gb01ldGFNb2RlbC5nZXRPYmplY3Qoc0VudGl0eVR5cGVQYXRoKTtcblx0XHRcdFx0XHRvU2VtYW50aWNPYmplY3RBbm5vdGF0aW9ucyA9IENvbW1vblV0aWxzLmdldFNlbWFudGljT2JqZWN0QW5ub3RhdGlvbnMob0VudGl0eVR5cGVBbm5vdGF0aW9ucywgc0N1cnJlbnRTZW1PYmopO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGFFeGNsdWRlZEFjdGlvbnMgPSBvU2VtYW50aWNPYmplY3RBbm5vdGF0aW9ucy5hVW5hdmFpbGFibGVBY3Rpb25zO1xuXHRcdFx0XHQvL1NraXAgc2FtZSBhcHBsaWNhdGlvbiBmcm9tIFJlbGF0ZWQgQXBwc1xuXHRcdFx0XHRhRXhjbHVkZWRBY3Rpb25zLnB1c2goc0N1cnJlbnRBY3Rpb24pO1xuXHRcdFx0XHRvVGFyZ2V0UGFyYW1zLm5hdmlnYXRpb25Db250ZXh0cyA9IG9CaW5kaW5nQ29udGV4dDtcblx0XHRcdFx0b1RhcmdldFBhcmFtcy5zZW1hbnRpY09iamVjdE1hcHBpbmcgPSBvU2VtYW50aWNPYmplY3RBbm5vdGF0aW9ucy5hTWFwcGluZ3M7XG5cdFx0XHRcdF9nZXRSZWxhdGVkQXBwc01lbnVJdGVtcyhhTGlua3MsIGFFeGNsdWRlZEFjdGlvbnMsIG9UYXJnZXRQYXJhbXMsIGFBbm5vdGF0aW9uc1NPSXRlbXMpO1xuXG5cdFx0XHRcdGFNYW5pZmVzdFNPSXRlbXMuZm9yRWFjaChmdW5jdGlvbiAoeyB0YXJnZXRTZW1PYmplY3QgfSkge1xuXHRcdFx0XHRcdGlmIChhQW5ub3RhdGlvbnNTT0l0ZW1zWzBdLnRhcmdldFNlbU9iamVjdCA9PT0gdGFyZ2V0U2VtT2JqZWN0KSB7XG5cdFx0XHRcdFx0XHRpc1NlbWFudGljT2JqZWN0SGFzU2FtZVRhcmdldEluTWFuaWZlc3QgPSB0cnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0Ly8gcmVtb3ZlIGFsbCBhY3Rpb25zIGZyb20gY3VycmVudCBoYXNoIGFwcGxpY2F0aW9uIGlmIG1hbmlmZXN0IGNvbnRhaW5zIGVtcHR5IGFsbG93ZWRBY3Rpb25zXG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHRvTWFuaWZlc3REYXRhLmFkZGl0aW9uYWxTZW1hbnRpY09iamVjdHMgJiZcblx0XHRcdFx0XHRvTWFuaWZlc3REYXRhLmFkZGl0aW9uYWxTZW1hbnRpY09iamVjdHNbYUFubm90YXRpb25zU09JdGVtc1swXS50YXJnZXRTZW1PYmplY3RdICYmXG5cdFx0XHRcdFx0b01hbmlmZXN0RGF0YS5hZGRpdGlvbmFsU2VtYW50aWNPYmplY3RzW2FBbm5vdGF0aW9uc1NPSXRlbXNbMF0udGFyZ2V0U2VtT2JqZWN0XS5hbGxvd2VkQWN0aW9ucz8ubGVuZ3RoID09PSAwXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdGlzU2VtYW50aWNPYmplY3RIYXNTYW1lVGFyZ2V0SW5NYW5pZmVzdCA9IHRydWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRhUmVsYXRlZEFwcHNNZW51SXRlbXMgPSBpc1NlbWFudGljT2JqZWN0SGFzU2FtZVRhcmdldEluTWFuaWZlc3Rcblx0XHRcdFx0XHQ/IGFNYW5pZmVzdFNPSXRlbXNcblx0XHRcdFx0XHQ6IGFNYW5pZmVzdFNPSXRlbXMuY29uY2F0KGFBbm5vdGF0aW9uc1NPSXRlbXMpO1xuXHRcdFx0XHQvLyBJZiBubyBhcHAgaW4gbGlzdCwgcmVsYXRlZCBhcHBzIGJ1dHRvbiB3aWxsIGJlIGhpZGRlblxuXHRcdFx0XHRpbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcInJlbGF0ZWRBcHBzL3Zpc2liaWxpdHlcIiwgYVJlbGF0ZWRBcHBzTWVudUl0ZW1zLmxlbmd0aCA+IDApO1xuXHRcdFx0XHRpbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcInJlbGF0ZWRBcHBzL2l0ZW1zXCIsIGFSZWxhdGVkQXBwc01lbnVJdGVtcyk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRpbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcInJlbGF0ZWRBcHBzL3Zpc2liaWxpdHlcIiwgZmFsc2UpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRpbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcInJlbGF0ZWRBcHBzL3Zpc2liaWxpdHlcIiwgZmFsc2UpO1xuXHRcdH1cblx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRMb2cuZXJyb3IoXCJDYW5ub3QgcmVhZCBsaW5rc1wiLCBlcnJvciBhcyBzdHJpbmcpO1xuXHR9XG5cdHJldHVybiBhUmVsYXRlZEFwcHNNZW51SXRlbXM7XG59XG5cbmZ1bmN0aW9uIF9nZXRTZW1hbnRpY09iamVjdEFubm90YXRpb25zKG9FbnRpdHlBbm5vdGF0aW9uczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIHNDdXJyZW50U2VtT2JqOiBzdHJpbmcpIHtcblx0Y29uc3Qgb1NlbWFudGljT2JqZWN0QW5ub3RhdGlvbnMgPSB7XG5cdFx0Ykhhc0VudGl0eVNldFNPOiBmYWxzZSxcblx0XHRhQWxsb3dlZEFjdGlvbnM6IFtdLFxuXHRcdGFVbmF2YWlsYWJsZUFjdGlvbnM6IFtdIGFzIE1ldGFNb2RlbFR5cGU8U2VtYW50aWNPYmplY3RVbmF2YWlsYWJsZUFjdGlvbnM+W10sXG5cdFx0YU1hcHBpbmdzOiBbXSBhcyBNZXRhTW9kZWxUeXBlPFNlbWFudGljT2JqZWN0TWFwcGluZ1R5cGU+W11cblx0fTtcblx0bGV0IHNBbm5vdGF0aW9uTWFwcGluZ1Rlcm0sIHNBbm5vdGF0aW9uQWN0aW9uVGVybTtcblx0bGV0IHNRdWFsaWZpZXI7XG5cdGZvciAoY29uc3Qga2V5IGluIG9FbnRpdHlBbm5vdGF0aW9ucykge1xuXHRcdGlmIChrZXkuaW5kZXhPZihDb21tb25Bbm5vdGF0aW9uVGVybXMuU2VtYW50aWNPYmplY3QpID4gLTEgJiYgb0VudGl0eUFubm90YXRpb25zW2tleV0gPT09IHNDdXJyZW50U2VtT2JqKSB7XG5cdFx0XHRvU2VtYW50aWNPYmplY3RBbm5vdGF0aW9ucy5iSGFzRW50aXR5U2V0U08gPSB0cnVlO1xuXHRcdFx0c0Fubm90YXRpb25NYXBwaW5nVGVybSA9IGBAJHtDb21tb25Bbm5vdGF0aW9uVGVybXMuU2VtYW50aWNPYmplY3RNYXBwaW5nfWA7XG5cdFx0XHRzQW5ub3RhdGlvbkFjdGlvblRlcm0gPSBgQCR7Q29tbW9uQW5ub3RhdGlvblRlcm1zLlNlbWFudGljT2JqZWN0VW5hdmFpbGFibGVBY3Rpb25zfWA7XG5cblx0XHRcdGlmIChrZXkuaW5kZXhPZihcIiNcIikgPiAtMSkge1xuXHRcdFx0XHRzUXVhbGlmaWVyID0ga2V5LnNwbGl0KFwiI1wiKVsxXTtcblx0XHRcdFx0c0Fubm90YXRpb25NYXBwaW5nVGVybSA9IGAke3NBbm5vdGF0aW9uTWFwcGluZ1Rlcm19IyR7c1F1YWxpZmllcn1gO1xuXHRcdFx0XHRzQW5ub3RhdGlvbkFjdGlvblRlcm0gPSBgJHtzQW5ub3RhdGlvbkFjdGlvblRlcm19IyR7c1F1YWxpZmllcn1gO1xuXHRcdFx0fVxuXHRcdFx0aWYgKG9FbnRpdHlBbm5vdGF0aW9uc1tzQW5ub3RhdGlvbk1hcHBpbmdUZXJtXSkge1xuXHRcdFx0XHRvU2VtYW50aWNPYmplY3RBbm5vdGF0aW9ucy5hTWFwcGluZ3MgPSBvU2VtYW50aWNPYmplY3RBbm5vdGF0aW9ucy5hTWFwcGluZ3MuY29uY2F0KFxuXHRcdFx0XHRcdG9FbnRpdHlBbm5vdGF0aW9uc1tzQW5ub3RhdGlvbk1hcHBpbmdUZXJtXSBhcyBNZXRhTW9kZWxUeXBlPFNlbWFudGljT2JqZWN0TWFwcGluZ1R5cGU+XG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChvRW50aXR5QW5ub3RhdGlvbnNbc0Fubm90YXRpb25BY3Rpb25UZXJtXSkge1xuXHRcdFx0XHRvU2VtYW50aWNPYmplY3RBbm5vdGF0aW9ucy5hVW5hdmFpbGFibGVBY3Rpb25zID0gb1NlbWFudGljT2JqZWN0QW5ub3RhdGlvbnMuYVVuYXZhaWxhYmxlQWN0aW9ucy5jb25jYXQoXG5cdFx0XHRcdFx0b0VudGl0eUFubm90YXRpb25zW3NBbm5vdGF0aW9uQWN0aW9uVGVybV0gYXMgTWV0YU1vZGVsVHlwZTxTZW1hbnRpY09iamVjdFVuYXZhaWxhYmxlQWN0aW9ucz5cblx0XHRcdFx0KTtcblx0XHRcdH1cblxuXHRcdFx0YnJlYWs7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBvU2VtYW50aWNPYmplY3RBbm5vdGF0aW9ucztcbn1cblxuZnVuY3Rpb24gZm5VcGRhdGVSZWxhdGVkQXBwc0RldGFpbHMob09iamVjdFBhZ2VMYXlvdXQ6IE9iamVjdFBhZ2VMYXlvdXQpIHtcblx0Y29uc3Qgb01ldGFNb2RlbCA9IG9PYmplY3RQYWdlTGF5b3V0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCkgYXMgT0RhdGFNZXRhTW9kZWw7XG5cdGNvbnN0IG9CaW5kaW5nQ29udGV4dCA9IG9PYmplY3RQYWdlTGF5b3V0LmdldEJpbmRpbmdDb250ZXh0KCkgYXMgVjRDb250ZXh0O1xuXHRjb25zdCBwYXRoID0gKG9CaW5kaW5nQ29udGV4dCAmJiBvQmluZGluZ0NvbnRleHQuZ2V0UGF0aCgpKSB8fCBcIlwiO1xuXHRjb25zdCBvTWV0YVBhdGggPSBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKHBhdGgpO1xuXHQvLyBTZW1hbnRpYyBLZXkgVm9jYWJ1bGFyeVxuXHRjb25zdCBzU2VtYW50aWNLZXlWb2NhYnVsYXJ5ID0gYCR7b01ldGFQYXRofS9gICsgYEBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuU2VtYW50aWNLZXlgO1xuXHQvL1NlbWFudGljIEtleXNcblx0Y29uc3QgYVNlbUtleXMgPSBvTWV0YU1vZGVsLmdldE9iamVjdChzU2VtYW50aWNLZXlWb2NhYnVsYXJ5KTtcblx0Ly8gVW5hdmFpbGFibGUgQWN0aW9uc1xuXHRjb25zdCBvRW50cnkgPSBvQmluZGluZ0NvbnRleHQ/LmdldE9iamVjdCgpO1xuXHRpZiAoIW9FbnRyeSAmJiBvQmluZGluZ0NvbnRleHQpIHtcblx0XHRvQmluZGluZ0NvbnRleHRcblx0XHRcdC5yZXF1ZXN0T2JqZWN0KClcblx0XHRcdC50aGVuKGFzeW5jIGZ1bmN0aW9uIChyZXF1ZXN0ZWRPYmplY3Q6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHJldHVybiB1cGRhdGVSZWxhdGVBcHBzTW9kZWwob0JpbmRpbmdDb250ZXh0LCByZXF1ZXN0ZWRPYmplY3QsIG9PYmplY3RQYWdlTGF5b3V0LCBhU2VtS2V5cywgb01ldGFNb2RlbCwgb01ldGFQYXRoKTtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogdW5rbm93bikge1xuXHRcdFx0XHRMb2cuZXJyb3IoXCJDYW5ub3QgdXBkYXRlIHRoZSByZWxhdGVkIGFwcCBkZXRhaWxzXCIsIG9FcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0fSk7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIHVwZGF0ZVJlbGF0ZUFwcHNNb2RlbChvQmluZGluZ0NvbnRleHQsIG9FbnRyeSwgb09iamVjdFBhZ2VMYXlvdXQsIGFTZW1LZXlzLCBvTWV0YU1vZGVsLCBvTWV0YVBhdGgpO1xuXHR9XG59XG5cbi8qKlxuICogQHBhcmFtIG9CdXR0b25cbiAqL1xuZnVuY3Rpb24gZm5GaXJlQnV0dG9uUHJlc3Mob0J1dHRvbjogQ29udHJvbCkge1xuXHRpZiAoXG5cdFx0b0J1dHRvbiAmJlxuXHRcdG9CdXR0b24uaXNBPEJ1dHRvbiB8IE92ZXJmbG93VG9vbGJhckJ1dHRvbj4oW1wic2FwLm0uQnV0dG9uXCIsIFwic2FwLm0uT3ZlcmZsb3dUb29sYmFyQnV0dG9uXCJdKSAmJlxuXHRcdG9CdXR0b24uZ2V0VmlzaWJsZSgpICYmXG5cdFx0b0J1dHRvbi5nZXRFbmFibGVkKClcblx0KSB7XG5cdFx0b0J1dHRvbi5maXJlUHJlc3MoKTtcblx0fVxufVxuXG5mdW5jdGlvbiBmblJlc29sdmVTdHJpbmd0b0Jvb2xlYW4oc1ZhbHVlOiBzdHJpbmcgfCBib29sZWFuKSB7XG5cdGlmIChzVmFsdWUgPT09IFwidHJ1ZVwiIHx8IHNWYWx1ZSA9PT0gdHJ1ZSkge1xuXHRcdHJldHVybiB0cnVlO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxufVxuXG5mdW5jdGlvbiBnZXRBcHBDb21wb25lbnQob0NvbnRyb2w6IENvbnRyb2wgfCBDb21wb25lbnQpOiBBcHBDb21wb25lbnQge1xuXHRpZiAob0NvbnRyb2wuaXNBPEFwcENvbXBvbmVudD4oXCJzYXAuZmUuY29yZS5BcHBDb21wb25lbnRcIikpIHtcblx0XHRyZXR1cm4gb0NvbnRyb2w7XG5cdH1cblx0Y29uc3Qgb093bmVyID0gQ29tcG9uZW50LmdldE93bmVyQ29tcG9uZW50Rm9yKG9Db250cm9sKTtcblx0aWYgKCFvT3duZXIpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJUaGVyZSBzaG91bGQgYmUgYSBzYXAuZmUuY29yZS5BcHBDb21wb25lbnQgYXMgb3duZXIgb2YgdGhlIGNvbnRyb2xcIik7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIGdldEFwcENvbXBvbmVudChvT3duZXIpO1xuXHR9XG59XG5cbmZ1bmN0aW9uIGdldEN1cnJlbnRQYWdlVmlldyhvQXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQpIHtcblx0Y29uc3Qgcm9vdFZpZXdDb250cm9sbGVyID0gb0FwcENvbXBvbmVudC5nZXRSb290Vmlld0NvbnRyb2xsZXIoKTtcblx0cmV0dXJuIHJvb3RWaWV3Q29udHJvbGxlci5pc0ZjbEVuYWJsZWQoKVxuXHRcdD8gcm9vdFZpZXdDb250cm9sbGVyLmdldFJpZ2h0bW9zdFZpZXcoKVxuXHRcdDogQ29tbW9uVXRpbHMuZ2V0VGFyZ2V0Vmlldygob0FwcENvbXBvbmVudC5nZXRSb290Q29udGFpbmVyKCkgYXMgTmF2Q29udGFpbmVyKS5nZXRDdXJyZW50UGFnZSgpKTtcbn1cblxuZnVuY3Rpb24gZ2V0VGFyZ2V0VmlldyhvQ29udHJvbDogTWFuYWdlZE9iamVjdCB8IG51bGwpOiBWaWV3IHtcblx0aWYgKG9Db250cm9sICYmIG9Db250cm9sLmlzQTxDb21wb25lbnRDb250YWluZXI+KFwic2FwLnVpLmNvcmUuQ29tcG9uZW50Q29udGFpbmVyXCIpKSB7XG5cdFx0Y29uc3Qgb0NvbXBvbmVudCA9IG9Db250cm9sLmdldENvbXBvbmVudEluc3RhbmNlKCk7XG5cdFx0b0NvbnRyb2wgPSBvQ29tcG9uZW50ICYmIG9Db21wb25lbnQuZ2V0Um9vdENvbnRyb2woKTtcblx0fVxuXHR3aGlsZSAob0NvbnRyb2wgJiYgIW9Db250cm9sLmlzQTxWaWV3PihcInNhcC51aS5jb3JlLm12Yy5WaWV3XCIpKSB7XG5cdFx0b0NvbnRyb2wgPSBvQ29udHJvbC5nZXRQYXJlbnQoKTtcblx0fVxuXHRyZXR1cm4gb0NvbnRyb2whO1xufVxuXG5mdW5jdGlvbiBpc0ZpZWxkQ29udHJvbFBhdGhJbmFwcGxpY2FibGUoc0ZpZWxkQ29udHJvbFBhdGg6IHN0cmluZywgb0F0dHJpYnV0ZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pIHtcblx0bGV0IGJJbmFwcGxpY2FibGUgPSBmYWxzZTtcblx0Y29uc3QgYVBhcnRzID0gc0ZpZWxkQ29udHJvbFBhdGguc3BsaXQoXCIvXCIpO1xuXHQvLyBzZW5zaXRpdmUgZGF0YSBpcyByZW1vdmVkIG9ubHkgaWYgdGhlIHBhdGggaGFzIGFscmVhZHkgYmVlbiByZXNvbHZlZC5cblx0aWYgKGFQYXJ0cy5sZW5ndGggPiAxKSB7XG5cdFx0YkluYXBwbGljYWJsZSA9XG5cdFx0XHRvQXR0cmlidXRlW2FQYXJ0c1swXV0gIT09IHVuZGVmaW5lZCAmJlxuXHRcdFx0KG9BdHRyaWJ1dGVbYVBhcnRzWzBdXSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikuaGFzT3duUHJvcGVydHkoYVBhcnRzWzFdKSAmJlxuXHRcdFx0KG9BdHRyaWJ1dGVbYVBhcnRzWzBdXSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilbYVBhcnRzWzFdXSA9PT0gMDtcblx0fSBlbHNlIHtcblx0XHRiSW5hcHBsaWNhYmxlID0gb0F0dHJpYnV0ZVtzRmllbGRDb250cm9sUGF0aF0gPT09IDA7XG5cdH1cblx0cmV0dXJuIGJJbmFwcGxpY2FibGU7XG59XG50eXBlIFVua25vd25PRGF0YU9iamVjdCA9IHtcblx0ZW50aXR5U2V0Pzogc3RyaW5nO1xuXHRjb250ZXh0RGF0YToge1xuXHRcdFwiQG9kYXRhLmNvbnRleHRcIj86IHN0cmluZztcblx0XHRcIiU0MG9kYXRhLmNvbnRleHRcIj86IHN0cmluZztcblx0XHRcIkBvZGF0YS5tZXRhZGF0YUV0YWdcIj86IHN0cmluZztcblx0XHRcIiU0MG9kYXRhLm1ldGFkYXRhRXRhZ1wiPzogc3RyaW5nO1xuXHRcdFNBUF9fTWVzc2FnZXM/OiBzdHJpbmc7XG5cdFx0W1M6IHN0cmluZ106IHN0cmluZyB8IHVuZGVmaW5lZDtcblx0fTtcbn07XG5mdW5jdGlvbiByZW1vdmVTZW5zaXRpdmVEYXRhKGFBdHRyaWJ1dGVzOiBVbmtub3duT0RhdGFPYmplY3RbXSwgb01ldGFNb2RlbDogT0RhdGFNZXRhTW9kZWwpIHtcblx0Y29uc3QgYU91dEF0dHJpYnV0ZXMgPSBbXTtcblx0Zm9yIChsZXQgaSA9IDA7IGkgPCBhQXR0cmlidXRlcy5sZW5ndGg7IGkrKykge1xuXHRcdGNvbnN0IHNFbnRpdHlTZXQgPSBhQXR0cmlidXRlc1tpXS5lbnRpdHlTZXQsXG5cdFx0XHRvQXR0cmlidXRlID0gYUF0dHJpYnV0ZXNbaV0uY29udGV4dERhdGE7XG5cblx0XHRkZWxldGUgb0F0dHJpYnV0ZVtcIkBvZGF0YS5jb250ZXh0XCJdO1xuXHRcdGRlbGV0ZSBvQXR0cmlidXRlW1wiJTQwb2RhdGEuY29udGV4dFwiXTtcblx0XHRkZWxldGUgb0F0dHJpYnV0ZVtcIkBvZGF0YS5tZXRhZGF0YUV0YWdcIl07XG5cdFx0ZGVsZXRlIG9BdHRyaWJ1dGVbXCIlNDBvZGF0YS5tZXRhZGF0YUV0YWdcIl07XG5cdFx0ZGVsZXRlIG9BdHRyaWJ1dGVbXCJTQVBfX01lc3NhZ2VzXCJdO1xuXHRcdGNvbnN0IGFQcm9wZXJ0aWVzID0gT2JqZWN0LmtleXMob0F0dHJpYnV0ZSk7XG5cdFx0Zm9yIChsZXQgaiA9IDA7IGogPCBhUHJvcGVydGllcy5sZW5ndGg7IGorKykge1xuXHRcdFx0Y29uc3Qgc1Byb3AgPSBhUHJvcGVydGllc1tqXSxcblx0XHRcdFx0YVByb3BlcnR5QW5ub3RhdGlvbnMgPSBvTWV0YU1vZGVsLmdldE9iamVjdChgLyR7c0VudGl0eVNldH0vJHtzUHJvcH1AYCk7XG5cdFx0XHRpZiAoYVByb3BlcnR5QW5ub3RhdGlvbnMpIHtcblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdGFQcm9wZXJ0eUFubm90YXRpb25zW1wiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlBlcnNvbmFsRGF0YS52MS5Jc1BvdGVudGlhbGx5U2Vuc2l0aXZlXCJdIHx8XG5cdFx0XHRcdFx0YVByb3BlcnR5QW5ub3RhdGlvbnNbXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuRXhjbHVkZUZyb21OYXZpZ2F0aW9uQ29udGV4dFwiXSB8fFxuXHRcdFx0XHRcdGFQcm9wZXJ0eUFubm90YXRpb25zW1wiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkFuYWx5dGljcy52MS5NZWFzdXJlXCJdXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdGRlbGV0ZSBvQXR0cmlidXRlW3NQcm9wXTtcblx0XHRcdFx0fSBlbHNlIGlmIChhUHJvcGVydHlBbm5vdGF0aW9uc1tcIkBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRmllbGRDb250cm9sXCJdKSB7XG5cdFx0XHRcdFx0Y29uc3Qgb0ZpZWxkQ29udHJvbCA9IGFQcm9wZXJ0eUFubm90YXRpb25zW1wiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5GaWVsZENvbnRyb2xcIl07XG5cdFx0XHRcdFx0aWYgKG9GaWVsZENvbnRyb2xbXCIkRW51bU1lbWJlclwiXSAmJiBvRmllbGRDb250cm9sW1wiJEVudW1NZW1iZXJcIl0uc3BsaXQoXCIvXCIpWzFdID09PSBcIkluYXBwbGljYWJsZVwiKSB7XG5cdFx0XHRcdFx0XHRkZWxldGUgb0F0dHJpYnV0ZVtzUHJvcF07XG5cdFx0XHRcdFx0fSBlbHNlIGlmIChvRmllbGRDb250cm9sW1wiJFBhdGhcIl0gJiYgQ29tbW9uVXRpbHMuaXNGaWVsZENvbnRyb2xQYXRoSW5hcHBsaWNhYmxlKG9GaWVsZENvbnRyb2xbXCIkUGF0aFwiXSwgb0F0dHJpYnV0ZSkpIHtcblx0XHRcdFx0XHRcdGRlbGV0ZSBvQXR0cmlidXRlW3NQcm9wXTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0YU91dEF0dHJpYnV0ZXMucHVzaChvQXR0cmlidXRlKTtcblx0fVxuXG5cdHJldHVybiBhT3V0QXR0cmlidXRlcztcbn1cblxuZnVuY3Rpb24gX2ZuQ2hlY2tJc01hdGNoKG9PYmplY3Q6IG9iamVjdCwgb0tleXNUb0NoZWNrOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikge1xuXHRmb3IgKGNvbnN0IHNLZXkgaW4gb0tleXNUb0NoZWNrKSB7XG5cdFx0aWYgKG9LZXlzVG9DaGVja1tzS2V5XSAhPT0gb09iamVjdFtzS2V5IGFzIGtleW9mIHR5cGVvZiBvT2JqZWN0XSkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gZm5HZXRDb250ZXh0UGF0aFByb3BlcnRpZXMoXG5cdG1ldGFNb2RlbENvbnRleHQ6IE9EYXRhTWV0YU1vZGVsLFxuXHRzQ29udGV4dFBhdGg6IHN0cmluZyxcblx0b0ZpbHRlcj86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4pOiBSZWNvcmQ8c3RyaW5nLCBNZXRhTW9kZWxQcm9wZXJ0eT4gfCBSZWNvcmQ8c3RyaW5nLCBNZXRhTW9kZWxOYXZQcm9wZXJ0eT4ge1xuXHRjb25zdCBvRW50aXR5VHlwZTogTWV0YU1vZGVsRW50aXR5VHlwZSA9IChtZXRhTW9kZWxDb250ZXh0LmdldE9iamVjdChgJHtzQ29udGV4dFBhdGh9L2ApIHx8IHt9KSBhcyBNZXRhTW9kZWxFbnRpdHlUeXBlLFxuXHRcdG9Qcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBNZXRhTW9kZWxQcm9wZXJ0eT4gfCBSZWNvcmQ8c3RyaW5nLCBNZXRhTW9kZWxOYXZQcm9wZXJ0eT4gPSB7fTtcblxuXHRmb3IgKGNvbnN0IHNLZXkgaW4gb0VudGl0eVR5cGUpIHtcblx0XHRpZiAoXG5cdFx0XHRvRW50aXR5VHlwZS5oYXNPd25Qcm9wZXJ0eShzS2V5KSAmJlxuXHRcdFx0IS9eXFwkL2kudGVzdChzS2V5KSAmJlxuXHRcdFx0b0VudGl0eVR5cGVbc0tleV0uJGtpbmQgJiZcblx0XHRcdF9mbkNoZWNrSXNNYXRjaChvRW50aXR5VHlwZVtzS2V5XSwgb0ZpbHRlciB8fCB7ICRraW5kOiBcIlByb3BlcnR5XCIgfSlcblx0XHQpIHtcblx0XHRcdG9Qcm9wZXJ0aWVzW3NLZXldID0gb0VudGl0eVR5cGVbc0tleV07XG5cdFx0fVxuXHR9XG5cdHJldHVybiBvUHJvcGVydGllcztcbn1cblxuZnVuY3Rpb24gZm5HZXRNYW5kYXRvcnlGaWx0ZXJGaWVsZHMob01ldGFNb2RlbDogT0RhdGFNZXRhTW9kZWwsIHNDb250ZXh0UGF0aDogc3RyaW5nKSB7XG5cdGxldCBhTWFuZGF0b3J5RmlsdGVyRmllbGRzOiBFeHBhbmRQYXRoVHlwZTxFZG0uUHJvcGVydHlQYXRoPltdID0gW107XG5cdGlmIChvTWV0YU1vZGVsICYmIHNDb250ZXh0UGF0aCkge1xuXHRcdGFNYW5kYXRvcnlGaWx0ZXJGaWVsZHMgPSBvTWV0YU1vZGVsLmdldE9iamVjdChcblx0XHRcdGAke3NDb250ZXh0UGF0aH1AT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5GaWx0ZXJSZXN0cmljdGlvbnMvUmVxdWlyZWRQcm9wZXJ0aWVzYFxuXHRcdCkgYXMgRXhwYW5kUGF0aFR5cGU8RWRtLlByb3BlcnR5UGF0aD5bXTtcblx0fVxuXHRyZXR1cm4gYU1hbmRhdG9yeUZpbHRlckZpZWxkcztcbn1cblxuZnVuY3Rpb24gZm5HZXRJQk5BY3Rpb25zKG9Db250cm9sOiBUYWJsZSB8IE9iamVjdFBhZ2VEeW5hbWljSGVhZGVyVGl0bGUsIGFJQk5BY3Rpb25zOiB1bmtub3duW10pIHtcblx0Y29uc3QgYUFjdGlvbnMgPSBvQ29udHJvbCAmJiBvQ29udHJvbC5nZXRBY3Rpb25zKCk7XG5cdGlmIChhQWN0aW9ucykge1xuXHRcdGFBY3Rpb25zLmZvckVhY2goZnVuY3Rpb24gKG9BY3Rpb24pIHtcblx0XHRcdGlmIChvQWN0aW9uLmlzQTxBY3Rpb25Ub29sYmFyQWN0aW9uPihcInNhcC51aS5tZGMuYWN0aW9udG9vbGJhci5BY3Rpb25Ub29sYmFyQWN0aW9uXCIpKSB7XG5cdFx0XHRcdG9BY3Rpb24gPSBvQWN0aW9uLmdldEFjdGlvbigpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKG9BY3Rpb24uaXNBPE1lbnVCdXR0b24+KFwic2FwLm0uTWVudUJ1dHRvblwiKSkge1xuXHRcdFx0XHRjb25zdCBvTWVudSA9IG9BY3Rpb24uZ2V0TWVudSgpO1xuXHRcdFx0XHRjb25zdCBhSXRlbXMgPSBvTWVudS5nZXRJdGVtcygpO1xuXHRcdFx0XHRhSXRlbXMuZm9yRWFjaCgob0l0ZW0pID0+IHtcblx0XHRcdFx0XHRpZiAob0l0ZW0uZGF0YShcIklCTkRhdGFcIikpIHtcblx0XHRcdFx0XHRcdGFJQk5BY3Rpb25zLnB1c2gob0l0ZW0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHR9IGVsc2UgaWYgKG9BY3Rpb24uZGF0YShcIklCTkRhdGFcIikpIHtcblx0XHRcdFx0YUlCTkFjdGlvbnMucHVzaChvQWN0aW9uKTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXHRyZXR1cm4gYUlCTkFjdGlvbnM7XG59XG5cbi8qKlxuICogQHBhcmFtIGFJQk5BY3Rpb25zXG4gKiBAcGFyYW0gb1ZpZXdcbiAqL1xuZnVuY3Rpb24gZm5VcGRhdGVEYXRhRmllbGRGb3JJQk5CdXR0b25zVmlzaWJpbGl0eShhSUJOQWN0aW9uczogQ29udHJvbFtdLCBvVmlldzogVmlldykge1xuXHRjb25zdCBvUGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCB7IHZhbHVlOiB1bmtub3duIH0+ID0ge307XG5cdGNvbnN0IGlzU3RpY2t5ID0gTW9kZWxIZWxwZXIuaXNTdGlja3lTZXNzaW9uU3VwcG9ydGVkKChvVmlldy5nZXRNb2RlbCgpIGFzIE9EYXRhTW9kZWwpLmdldE1ldGFNb2RlbCgpKTtcblx0Y29uc3QgZm5HZXRMaW5rcyA9IGZ1bmN0aW9uIChvRGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkKSB7XG5cdFx0aWYgKG9EYXRhKSB7XG5cdFx0XHRjb25zdCBhS2V5cyA9IE9iamVjdC5rZXlzKG9EYXRhKTtcblx0XHRcdGFLZXlzLmZvckVhY2goZnVuY3Rpb24gKHNLZXk6IHN0cmluZykge1xuXHRcdFx0XHRpZiAoc0tleS5pbmRleE9mKFwiX1wiKSAhPT0gMCAmJiBzS2V5LmluZGV4T2YoXCJvZGF0YS5jb250ZXh0XCIpID09PSAtMSkge1xuXHRcdFx0XHRcdG9QYXJhbXNbc0tleV0gPSB7IHZhbHVlOiBvRGF0YVtzS2V5XSB9O1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0aWYgKGFJQk5BY3Rpb25zLmxlbmd0aCkge1xuXHRcdFx0YUlCTkFjdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAob0lCTkFjdGlvbikge1xuXHRcdFx0XHRjb25zdCBzU2VtYW50aWNPYmplY3QgPSBvSUJOQWN0aW9uLmRhdGEoXCJJQk5EYXRhXCIpLnNlbWFudGljT2JqZWN0O1xuXHRcdFx0XHRjb25zdCBzQWN0aW9uID0gb0lCTkFjdGlvbi5kYXRhKFwiSUJORGF0YVwiKS5hY3Rpb247XG5cdFx0XHRcdENvbW1vblV0aWxzLmdldFNoZWxsU2VydmljZXMob1ZpZXcpXG5cdFx0XHRcdFx0LmdldExpbmtzKHtcblx0XHRcdFx0XHRcdHNlbWFudGljT2JqZWN0OiBzU2VtYW50aWNPYmplY3QsXG5cdFx0XHRcdFx0XHRhY3Rpb246IHNBY3Rpb24sXG5cdFx0XHRcdFx0XHRwYXJhbXM6IG9QYXJhbXNcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdC50aGVuKGZ1bmN0aW9uIChhTGluaykge1xuXHRcdFx0XHRcdFx0b0lCTkFjdGlvbi5zZXRWaXNpYmxlKG9JQk5BY3Rpb24uZ2V0VmlzaWJsZSgpICYmIGFMaW5rICYmIGFMaW5rLmxlbmd0aCA9PT0gMSk7XG5cdFx0XHRcdFx0XHRpZiAoaXNTdGlja3kpIHtcblx0XHRcdFx0XHRcdFx0KG9JQk5BY3Rpb24uZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKSBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dCkuc2V0UHJvcGVydHkoXG5cdFx0XHRcdFx0XHRcdFx0b0lCTkFjdGlvbi5nZXRJZCgpLnNwbGl0KFwiLS1cIilbMV0sXG5cdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0c2hlbGxOYXZpZ2F0aW9uTm90QXZhaWxhYmxlOiAhKGFMaW5rICYmIGFMaW5rLmxlbmd0aCA9PT0gMSlcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogdW5rbm93bikge1xuXHRcdFx0XHRcdFx0TG9nLmVycm9yKFwiQ2Fubm90IHJldHJpZXZlIHRoZSBsaW5rcyBmcm9tIHRoZSBzaGVsbCBzZXJ2aWNlXCIsIG9FcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHR9O1xuXHRpZiAob1ZpZXcgJiYgb1ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoKSkge1xuXHRcdChvVmlldy5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIE9EYXRhVjRDb250ZXh0KVxuXHRcdFx0Py5yZXF1ZXN0T2JqZWN0KClcblx0XHRcdC50aGVuKGZ1bmN0aW9uIChvRGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQpIHtcblx0XHRcdFx0cmV0dXJuIGZuR2V0TGlua3Mob0RhdGEpO1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIkNhbm5vdCByZXRyaWV2ZSB0aGUgbGlua3MgZnJvbSB0aGUgc2hlbGwgc2VydmljZVwiLCBvRXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdH0pO1xuXHR9IGVsc2Uge1xuXHRcdGZuR2V0TGlua3MoKTtcblx0fVxufVxuXG5mdW5jdGlvbiBnZXRUcmFuc2xhdGVkVGV4dChzRnJhbWV3b3JrS2V5OiBzdHJpbmcsIG9SZXNvdXJjZUJ1bmRsZTogUmVzb3VyY2VCdW5kbGUsIHBhcmFtZXRlcnM/OiB1bmtub3duW10sIHNFbnRpdHlTZXROYW1lPzogc3RyaW5nKSB7XG5cdGxldCBzUmVzb3VyY2VLZXkgPSBzRnJhbWV3b3JrS2V5O1xuXHRpZiAob1Jlc291cmNlQnVuZGxlKSB7XG5cdFx0aWYgKHNFbnRpdHlTZXROYW1lKSB7XG5cdFx0XHQvLyBUaGVyZSBhcmUgY29uc29sZSBlcnJvcnMgbG9nZ2VkIHdoZW4gbWFraW5nIGNhbGxzIHRvIGdldFRleHQgZm9yIGtleXMgdGhhdCBhcmUgbm90IGRlZmluZWQgaW4gdGhlIHJlc291cmNlIGJ1bmRsZVxuXHRcdFx0Ly8gZm9yIGluc3RhbmNlIGtleXMgd2hpY2ggYXJlIHN1cHBvc2VkIHRvIGJlIHByb3ZpZGVkIGJ5IHRoZSBhcHBsaWNhdGlvbiwgZS5nLCA8a2V5Pnw8ZW50aXR5U2V0PiB0byBvdmVycmlkZSBpbnN0YW5jZSBzcGVjaWZpYyB0ZXh0XG5cdFx0XHQvLyBoZW5jZSBjaGVjayBpZiB0ZXh0IGV4aXN0cyAodXNpbmcgXCJoYXNUZXh0XCIpIGluIHRoZSByZXNvdXJjZSBidW5kbGUgYmVmb3JlIGNhbGxpbmcgXCJnZXRUZXh0XCJcblxuXHRcdFx0Ly8gXCJoYXNUZXh0XCIgb25seSBjaGVja3MgZm9yIHRoZSBrZXkgaW4gdGhlIGltbWVkaWF0ZSByZXNvdXJjZSBidW5kbGUgYW5kIG5vdCBpdCdzIGN1c3RvbSBidW5kbGVzXG5cdFx0XHQvLyBoZW5jZSB3ZSBuZWVkIHRvIGRvIHRoaXMgcmVjdXJyc2l2ZWx5IHRvIGNoZWNrIGlmIHRoZSBrZXkgZXhpc3RzIGluIGFueSBvZiB0aGUgYnVuZGxlcyB0aGUgZm9ybXMgdGhlIEZFIHJlc291cmNlIGJ1bmRsZVxuXHRcdFx0Y29uc3QgYlJlc291cmNlS2V5RXhpc3RzID0gY2hlY2tJZlJlc291cmNlS2V5RXhpc3RzKFxuXHRcdFx0XHQob1Jlc291cmNlQnVuZGxlIGFzIEludGVybmFsUmVzb3VyY2VCdW5kbGUpLmFDdXN0b21CdW5kbGVzLFxuXHRcdFx0XHRgJHtzRnJhbWV3b3JrS2V5fXwke3NFbnRpdHlTZXROYW1lfWBcblx0XHRcdCk7XG5cblx0XHRcdC8vIGlmIHJlc291cmNlIGtleSB3aXRoIGVudGl0eSBzZXQgbmFtZSBmb3IgaW5zdGFuY2Ugc3BlY2lmaWMgdGV4dCBvdmVycmlkaW5nIGlzIHByb3ZpZGVkIGJ5IHRoZSBhcHBsaWNhdGlvblxuXHRcdFx0Ly8gdGhlbiB1c2UgdGhlIHNhbWUga2V5IG90aGVyd2lzZSB1c2UgdGhlIEZyYW1ld29yayBrZXlcblx0XHRcdHNSZXNvdXJjZUtleSA9IGJSZXNvdXJjZUtleUV4aXN0cyA/IGAke3NGcmFtZXdvcmtLZXl9fCR7c0VudGl0eVNldE5hbWV9YCA6IHNGcmFtZXdvcmtLZXk7XG5cdFx0fVxuXHRcdHJldHVybiBvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChzUmVzb3VyY2VLZXksIHBhcmFtZXRlcnMpO1xuXHR9XG5cblx0Ly8gZG8gbm90IGFsbG93IG92ZXJyaWRlIHNvIGdldCB0ZXh0IGZyb20gdGhlIGludGVybmFsIGJ1bmRsZSBkaXJlY3RseVxuXHRvUmVzb3VyY2VCdW5kbGUgPSBDb3JlLmdldExpYnJhcnlSZXNvdXJjZUJ1bmRsZShcInNhcC5mZS5jb3JlXCIpO1xuXHRyZXR1cm4gb1Jlc291cmNlQnVuZGxlLmdldFRleHQoc1Jlc291cmNlS2V5LCBwYXJhbWV0ZXJzKTtcbn1cblxuZnVuY3Rpb24gY2hlY2tJZlJlc291cmNlS2V5RXhpc3RzKGFDdXN0b21CdW5kbGVzOiBJbnRlcm5hbFJlc291cmNlQnVuZGxlW10sIHNLZXk6IHN0cmluZykge1xuXHRpZiAoYUN1c3RvbUJ1bmRsZXMubGVuZ3RoKSB7XG5cdFx0Zm9yIChsZXQgaSA9IGFDdXN0b21CdW5kbGVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG5cdFx0XHRjb25zdCBzVmFsdWUgPSBhQ3VzdG9tQnVuZGxlc1tpXS5oYXNUZXh0KHNLZXkpO1xuXHRcdFx0Ly8gdGV4dCBmb3VuZCByZXR1cm4gdHJ1ZVxuXHRcdFx0aWYgKHNWYWx1ZSkge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHRcdGNoZWNrSWZSZXNvdXJjZUtleUV4aXN0cyhhQ3VzdG9tQnVuZGxlc1tpXS5hQ3VzdG9tQnVuZGxlcywgc0tleSk7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gZ2V0QWN0aW9uUGF0aChhY3Rpb25Db250ZXh0OiBDb250ZXh0LCBiUmV0dXJuT25seVBhdGg6IGJvb2xlYW4sIHNBY3Rpb25OYW1lPzogc3RyaW5nLCBiQ2hlY2tTdGF0aWNWYWx1ZT86IGJvb2xlYW4pIHtcblx0c0FjdGlvbk5hbWUgPSAhc0FjdGlvbk5hbWUgPyBhY3Rpb25Db250ZXh0LmdldE9iamVjdChhY3Rpb25Db250ZXh0LmdldFBhdGgoKSkudG9TdHJpbmcoKSA6IHNBY3Rpb25OYW1lO1xuXHRsZXQgc0NvbnRleHRQYXRoID0gYWN0aW9uQ29udGV4dC5nZXRQYXRoKCkuc3BsaXQoXCIvQFwiKVswXTtcblx0Y29uc3Qgc0VudGl0eVR5cGVOYW1lID0gKGFjdGlvbkNvbnRleHQuZ2V0T2JqZWN0KHNDb250ZXh0UGF0aCkgYXMgTWV0YU1vZGVsRW50aXR5VHlwZSkuJFR5cGU7XG5cdGNvbnN0IHNFbnRpdHlOYW1lID0gZ2V0RW50aXR5U2V0TmFtZShhY3Rpb25Db250ZXh0LmdldE1vZGVsKCkgYXMgT0RhdGFNZXRhTW9kZWwsIHNFbnRpdHlUeXBlTmFtZSk7XG5cdGlmIChzRW50aXR5TmFtZSkge1xuXHRcdHNDb250ZXh0UGF0aCA9IGAvJHtzRW50aXR5TmFtZX1gO1xuXHR9XG5cdGlmIChiQ2hlY2tTdGF0aWNWYWx1ZSkge1xuXHRcdHJldHVybiBhY3Rpb25Db250ZXh0LmdldE9iamVjdChgJHtzQ29udGV4dFBhdGh9LyR7c0FjdGlvbk5hbWV9QE9yZy5PRGF0YS5Db3JlLlYxLk9wZXJhdGlvbkF2YWlsYWJsZWApO1xuXHR9XG5cdGlmIChiUmV0dXJuT25seVBhdGgpIHtcblx0XHRyZXR1cm4gYCR7c0NvbnRleHRQYXRofS8ke3NBY3Rpb25OYW1lfWA7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdHNDb250ZXh0UGF0aDogc0NvbnRleHRQYXRoLFxuXHRcdFx0c1Byb3BlcnR5OiBhY3Rpb25Db250ZXh0LmdldE9iamVjdChgJHtzQ29udGV4dFBhdGh9LyR7c0FjdGlvbk5hbWV9QE9yZy5PRGF0YS5Db3JlLlYxLk9wZXJhdGlvbkF2YWlsYWJsZS8kUGF0aGApLFxuXHRcdFx0c0JpbmRpbmdQYXJhbWV0ZXI6IGFjdGlvbkNvbnRleHQuZ2V0T2JqZWN0KGAke3NDb250ZXh0UGF0aH0vJHtzQWN0aW9uTmFtZX0vQCR1aTUub3ZlcmxvYWQvMC8kUGFyYW1ldGVyLzAvJE5hbWVgKVxuXHRcdH07XG5cdH1cbn1cblxuZnVuY3Rpb24gZ2V0RW50aXR5U2V0TmFtZShvTWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbCwgc0VudGl0eVR5cGU6IHN0cmluZykge1xuXHRjb25zdCBvRW50aXR5Q29udGFpbmVyID0gb01ldGFNb2RlbC5nZXRPYmplY3QoXCIvXCIpO1xuXHRmb3IgKGNvbnN0IGtleSBpbiBvRW50aXR5Q29udGFpbmVyKSB7XG5cdFx0aWYgKHR5cGVvZiBvRW50aXR5Q29udGFpbmVyW2tleV0gPT09IFwib2JqZWN0XCIgJiYgb0VudGl0eUNvbnRhaW5lcltrZXldLiRUeXBlID09PSBzRW50aXR5VHlwZSkge1xuXHRcdFx0cmV0dXJuIGtleTtcblx0XHR9XG5cdH1cbn1cblxuZnVuY3Rpb24gY29tcHV0ZURpc3BsYXlNb2RlKG9Qcm9wZXJ0eUFubm90YXRpb25zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgb0NvbGxlY3Rpb25Bbm5vdGF0aW9ucz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSB7XG5cdGNvbnN0IG9UZXh0QW5ub3RhdGlvbiA9IG9Qcm9wZXJ0eUFubm90YXRpb25zW1wiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5UZXh0XCJdLFxuXHRcdG9UZXh0QXJyYW5nZW1lbnRBbm5vdGF0aW9uID0gKG9UZXh0QW5ub3RhdGlvbiAmJlxuXHRcdFx0KChvUHJvcGVydHlBbm5vdGF0aW9ucyAmJlxuXHRcdFx0XHRvUHJvcGVydHlBbm5vdGF0aW9uc1tcIkBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuVGV4dEBjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5UZXh0QXJyYW5nZW1lbnRcIl0pIHx8XG5cdFx0XHRcdChvQ29sbGVjdGlvbkFubm90YXRpb25zICYmXG5cdFx0XHRcdFx0b0NvbGxlY3Rpb25Bbm5vdGF0aW9uc1tcIkBjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5UZXh0QXJyYW5nZW1lbnRcIl0pKSkgYXMgTWV0YU1vZGVsRW51bTxUZXh0QXJyYW5nZW1lbnQ+O1xuXG5cdGlmIChvVGV4dEFycmFuZ2VtZW50QW5ub3RhdGlvbikge1xuXHRcdGlmIChvVGV4dEFycmFuZ2VtZW50QW5ub3RhdGlvbi4kRW51bU1lbWJlciA9PT0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5UZXh0QXJyYW5nZW1lbnRUeXBlL1RleHRPbmx5XCIpIHtcblx0XHRcdHJldHVybiBcIkRlc2NyaXB0aW9uXCI7XG5cdFx0fSBlbHNlIGlmIChvVGV4dEFycmFuZ2VtZW50QW5ub3RhdGlvbi4kRW51bU1lbWJlciA9PT0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5UZXh0QXJyYW5nZW1lbnRUeXBlL1RleHRMYXN0XCIpIHtcblx0XHRcdHJldHVybiBcIlZhbHVlRGVzY3JpcHRpb25cIjtcblx0XHR9IGVsc2UgaWYgKG9UZXh0QXJyYW5nZW1lbnRBbm5vdGF0aW9uLiRFbnVtTWVtYmVyID09PSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLlRleHRBcnJhbmdlbWVudFR5cGUvVGV4dFNlcGFyYXRlXCIpIHtcblx0XHRcdHJldHVybiBcIlZhbHVlXCI7XG5cdFx0fVxuXHRcdC8vRGVmYXVsdCBzaG91bGQgYmUgVGV4dEZpcnN0IGlmIHRoZXJlIGlzIGEgVGV4dCBhbm5vdGF0aW9uIGFuZCBuZWl0aGVyIFRleHRPbmx5IG5vciBUZXh0TGFzdCBhcmUgc2V0XG5cdFx0cmV0dXJuIFwiRGVzY3JpcHRpb25WYWx1ZVwiO1xuXHR9XG5cdHJldHVybiBvVGV4dEFubm90YXRpb24gPyBcIkRlc2NyaXB0aW9uVmFsdWVcIiA6IFwiVmFsdWVcIjtcbn1cblxuZnVuY3Rpb24gX2dldEVudGl0eVR5cGUob0NvbnRleHQ6IE9EYXRhVjRDb250ZXh0KSB7XG5cdGNvbnN0IG9NZXRhTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRyZXR1cm4gb01ldGFNb2RlbC5nZXRPYmplY3QoYCR7b01ldGFNb2RlbC5nZXRNZXRhUGF0aChvQ29udGV4dC5nZXRQYXRoKCkpfS8kVHlwZWApO1xufVxuXG5hc3luYyBmdW5jdGlvbiBfcmVxdWVzdE9iamVjdChzQWN0aW9uOiBzdHJpbmcsIG9TZWxlY3RlZENvbnRleHQ6IE9EYXRhVjRDb250ZXh0LCBzUHJvcGVydHk6IHN0cmluZykge1xuXHRsZXQgb0NvbnRleHQgPSBvU2VsZWN0ZWRDb250ZXh0O1xuXHRjb25zdCBuQnJhY2tldEluZGV4ID0gc0FjdGlvbi5pbmRleE9mKFwiKFwiKTtcblxuXHRpZiAobkJyYWNrZXRJbmRleCA+IC0xKSB7XG5cdFx0Y29uc3Qgc1RhcmdldFR5cGUgPSBzQWN0aW9uLnNsaWNlKG5CcmFja2V0SW5kZXggKyAxLCAtMSk7XG5cdFx0bGV0IHNDdXJyZW50VHlwZSA9IF9nZXRFbnRpdHlUeXBlKG9Db250ZXh0KTtcblxuXHRcdHdoaWxlIChzQ3VycmVudFR5cGUgIT09IHNUYXJnZXRUeXBlKSB7XG5cdFx0XHQvLyBGaW5kIHBhcmVudCBiaW5kaW5nIGNvbnRleHQgYW5kIHJldHJpZXZlIGVudGl0eSB0eXBlXG5cdFx0XHRvQ29udGV4dCA9IG9Db250ZXh0LmdldEJpbmRpbmcoKS5nZXRDb250ZXh0KCkgYXMgT0RhdGFWNENvbnRleHQ7XG5cdFx0XHRpZiAob0NvbnRleHQpIHtcblx0XHRcdFx0c0N1cnJlbnRUeXBlID0gX2dldEVudGl0eVR5cGUob0NvbnRleHQpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0TG9nLndhcm5pbmcoXCJDYW5ub3QgZGV0ZXJtaW5lIHRhcmdldCB0eXBlIHRvIHJlcXVlc3QgcHJvcGVydHkgdmFsdWUgZm9yIGJvdW5kIGFjdGlvbiBpbnZvY2F0aW9uXCIpO1xuXHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHVuZGVmaW5lZCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIG9Db250ZXh0LnJlcXVlc3RPYmplY3Qoc1Byb3BlcnR5KTtcbn1cblxuZXhwb3J0IHR5cGUgX1JlcXVlc3RlZFByb3BlcnR5ID0ge1xuXHR2UHJvcGVydHlWYWx1ZTogdW5rbm93bjtcblx0b1NlbGVjdGVkQ29udGV4dDogQ29udGV4dDtcblx0c0FjdGlvbjogc3RyaW5nO1xuXHRzRHluYW1pY0FjdGlvbkVuYWJsZWRQYXRoOiBzdHJpbmc7XG59O1xuYXN5bmMgZnVuY3Rpb24gcmVxdWVzdFByb3BlcnR5KFxuXHRvU2VsZWN0ZWRDb250ZXh0OiBWNENvbnRleHQsXG5cdHNBY3Rpb246IHN0cmluZyxcblx0c1Byb3BlcnR5OiBzdHJpbmcsXG5cdHNEeW5hbWljQWN0aW9uRW5hYmxlZFBhdGg6IHN0cmluZ1xuKTogUHJvbWlzZTxfUmVxdWVzdGVkUHJvcGVydHk+IHtcblx0Y29uc3Qgb1Byb21pc2UgPVxuXHRcdHNQcm9wZXJ0eSAmJiBzUHJvcGVydHkuaW5kZXhPZihcIi9cIikgPT09IDBcblx0XHRcdD8gcmVxdWVzdFNpbmdsZXRvblByb3BlcnR5KHNQcm9wZXJ0eSwgb1NlbGVjdGVkQ29udGV4dC5nZXRNb2RlbCgpKVxuXHRcdFx0OiBfcmVxdWVzdE9iamVjdChzQWN0aW9uLCBvU2VsZWN0ZWRDb250ZXh0LCBzUHJvcGVydHkpO1xuXG5cdHJldHVybiBvUHJvbWlzZS50aGVuKGFzeW5jIGZ1bmN0aW9uICh2UHJvcGVydHlWYWx1ZTogdW5rbm93bikge1xuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoe1xuXHRcdFx0dlByb3BlcnR5VmFsdWU6IHZQcm9wZXJ0eVZhbHVlLFxuXHRcdFx0b1NlbGVjdGVkQ29udGV4dDogb1NlbGVjdGVkQ29udGV4dCxcblx0XHRcdHNBY3Rpb246IHNBY3Rpb24sXG5cdFx0XHRzRHluYW1pY0FjdGlvbkVuYWJsZWRQYXRoOiBzRHluYW1pY0FjdGlvbkVuYWJsZWRQYXRoXG5cdFx0fSk7XG5cdH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzZXRDb250ZXh0c0Jhc2VkT25PcGVyYXRpb25BdmFpbGFibGUoXG5cdG9JbnRlcm5hbE1vZGVsQ29udGV4dDogSW50ZXJuYWxNb2RlbENvbnRleHQsXG5cdGFSZXF1ZXN0UHJvbWlzZXM6IFByb21pc2U8X1JlcXVlc3RlZFByb3BlcnR5PltdXG4pIHtcblx0cmV0dXJuIFByb21pc2UuYWxsKGFSZXF1ZXN0UHJvbWlzZXMpXG5cdFx0LnRoZW4oZnVuY3Rpb24gKGFSZXN1bHRzKSB7XG5cdFx0XHRpZiAoYVJlc3VsdHMubGVuZ3RoKSB7XG5cdFx0XHRcdGNvbnN0IGFBcHBsaWNhYmxlQ29udGV4dHM6IHVua25vd25bXSA9IFtdLFxuXHRcdFx0XHRcdGFOb3RBcHBsaWNhYmxlQ29udGV4dHM6IHVua25vd25bXSA9IFtdO1xuXHRcdFx0XHRhUmVzdWx0cy5mb3JFYWNoKGZ1bmN0aW9uIChhUmVzdWx0KSB7XG5cdFx0XHRcdFx0aWYgKGFSZXN1bHQpIHtcblx0XHRcdFx0XHRcdGlmIChhUmVzdWx0LnZQcm9wZXJ0eVZhbHVlKSB7XG5cdFx0XHRcdFx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5nZXRNb2RlbCgpLnNldFByb3BlcnR5KGFSZXN1bHQuc0R5bmFtaWNBY3Rpb25FbmFibGVkUGF0aCwgdHJ1ZSk7XG5cdFx0XHRcdFx0XHRcdGFBcHBsaWNhYmxlQ29udGV4dHMucHVzaChhUmVzdWx0Lm9TZWxlY3RlZENvbnRleHQpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0YU5vdEFwcGxpY2FibGVDb250ZXh0cy5wdXNoKGFSZXN1bHQub1NlbGVjdGVkQ29udGV4dCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdFx0c2V0RHluYW1pY0FjdGlvbkNvbnRleHRzKG9JbnRlcm5hbE1vZGVsQ29udGV4dCwgYVJlc3VsdHNbMF0uc0FjdGlvbiwgYUFwcGxpY2FibGVDb250ZXh0cywgYU5vdEFwcGxpY2FibGVDb250ZXh0cyk7XG5cdFx0XHR9XG5cdFx0fSlcblx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogdW5rbm93bikge1xuXHRcdFx0TG9nLnRyYWNlKFwiQ2Fubm90IHJldHJpZXZlIHByb3BlcnR5IHZhbHVlIGZyb20gcGF0aFwiLCBvRXJyb3IgYXMgc3RyaW5nKTtcblx0XHR9KTtcbn1cblxuLyoqXG4gKiBAcGFyYW0gb0ludGVybmFsTW9kZWxDb250ZXh0XG4gKiBAcGFyYW0gc0FjdGlvblxuICogQHBhcmFtIGFBcHBsaWNhYmxlXG4gKiBAcGFyYW0gYU5vdEFwcGxpY2FibGVcbiAqL1xuZnVuY3Rpb24gc2V0RHluYW1pY0FjdGlvbkNvbnRleHRzKFxuXHRvSW50ZXJuYWxNb2RlbENvbnRleHQ6IEludGVybmFsTW9kZWxDb250ZXh0LFxuXHRzQWN0aW9uOiBzdHJpbmcsXG5cdGFBcHBsaWNhYmxlOiB1bmtub3duW10sXG5cdGFOb3RBcHBsaWNhYmxlOiB1bmtub3duW11cbikge1xuXHRjb25zdCBzRHluYW1pY0FjdGlvblBhdGhQcmVmaXggPSBgJHtvSW50ZXJuYWxNb2RlbENvbnRleHQuZ2V0UGF0aCgpfS9keW5hbWljQWN0aW9ucy8ke3NBY3Rpb259YCxcblx0XHRvSW50ZXJuYWxNb2RlbCA9IG9JbnRlcm5hbE1vZGVsQ29udGV4dC5nZXRNb2RlbCgpO1xuXHRvSW50ZXJuYWxNb2RlbC5zZXRQcm9wZXJ0eShgJHtzRHluYW1pY0FjdGlvblBhdGhQcmVmaXh9L2FBcHBsaWNhYmxlYCwgYUFwcGxpY2FibGUpO1xuXHRvSW50ZXJuYWxNb2RlbC5zZXRQcm9wZXJ0eShgJHtzRHluYW1pY0FjdGlvblBhdGhQcmVmaXh9L2FOb3RBcHBsaWNhYmxlYCwgYU5vdEFwcGxpY2FibGUpO1xufVxuXG5mdW5jdGlvbiBfZ2V0RGVmYXVsdE9wZXJhdG9ycyhzUHJvcGVydHlUeXBlPzogc3RyaW5nKSB7XG5cdC8vIG1kYyBkZWZpbmVzIHRoZSBmdWxsIHNldCBvZiBvcGVyYXRpb25zIHRoYXQgYXJlIG1lYW5pbmdmdWwgZm9yIGVhY2ggRWRtIFR5cGVcblx0Ly8gVE9ETyBSZXBsYWNlIHdpdGggbW9kZWwgLyBpbnRlcm5hbCB3YXkgb2YgcmV0cmlldmluZyB0aGUgYWN0dWFsIG1vZGVsIHR5cGUgdXNlZCBmb3IgdGhlIHByb3BlcnR5XG5cdGNvbnN0IG9EYXRhQ2xhc3MgPSBUeXBlVXRpbC5nZXREYXRhVHlwZUNsYXNzTmFtZShzUHJvcGVydHlUeXBlKTtcblx0Ly8gVE9ETyBuZWVkIHRvIHBhc3MgcHJvcGVyIGZvcm1hdE9wdGlvbnMsIGNvbnN0cmFpbnRzIGhlcmVcblx0Y29uc3Qgb0Jhc2VUeXBlID0gVHlwZVV0aWwuZ2V0QmFzZVR5cGUob0RhdGFDbGFzcywge30sIHt9KTtcblx0cmV0dXJuIEZpbHRlck9wZXJhdG9yVXRpbC5nZXRPcGVyYXRvcnNGb3JUeXBlKG9CYXNlVHlwZSk7XG59XG5cbmZ1bmN0aW9uIF9nZXRSZXN0cmljdGlvbnMoYURlZmF1bHRPcHM6IHN0cmluZ1tdLCBhRXhwcmVzc2lvbk9wczogc3RyaW5nW10pOiBzdHJpbmdbXSB7XG5cdC8vIEZyb20gdGhlIGRlZmF1bHQgc2V0IG9mIE9wZXJhdG9ycyBmb3IgdGhlIEJhc2UgVHlwZSwgc2VsZWN0IHRob3NlIHRoYXQgYXJlIGRlZmluZWQgaW4gdGhlIEFsbG93ZWQgVmFsdWUuXG5cdC8vIEluIGNhc2UgdGhhdCBubyBvcGVyYXRvcnMgYXJlIGZvdW5kLCByZXR1cm4gdW5kZWZpbmVkIHNvIHRoYXQgdGhlIGRlZmF1bHQgc2V0IGlzIHVzZWQuXG5cdHJldHVybiBhRGVmYXVsdE9wcy5maWx0ZXIoZnVuY3Rpb24gKHNFbGVtZW50KSB7XG5cdFx0cmV0dXJuIGFFeHByZXNzaW9uT3BzLmluZGV4T2Yoc0VsZW1lbnQpID4gLTE7XG5cdH0pO1xufVxuXG5mdW5jdGlvbiBnZXRTcGVjaWZpY0FsbG93ZWRFeHByZXNzaW9uKGFFeHByZXNzaW9uczogc3RyaW5nW10pIHtcblx0Y29uc3QgYUFsbG93ZWRFeHByZXNzaW9uc1ByaW9yaXR5ID0gQ29tbW9uVXRpbHMuQWxsb3dlZEV4cHJlc3Npb25zUHJpbztcblxuXHRhRXhwcmVzc2lvbnMuc29ydChmdW5jdGlvbiAoYTogc3RyaW5nLCBiOiBzdHJpbmcpIHtcblx0XHRyZXR1cm4gYUFsbG93ZWRFeHByZXNzaW9uc1ByaW9yaXR5LmluZGV4T2YoYSkgLSBhQWxsb3dlZEV4cHJlc3Npb25zUHJpb3JpdHkuaW5kZXhPZihiKTtcblx0fSk7XG5cblx0cmV0dXJuIGFFeHByZXNzaW9uc1swXTtcbn1cblxuLyoqXG4gKiBNZXRob2QgdG8gZmV0Y2ggdGhlIGNvcnJlY3Qgb3BlcmF0b3JzIGJhc2VkIG9uIHRoZSBmaWx0ZXIgcmVzdHJpY3Rpb25zIHRoYXQgY2FuIGJlIGFubm90YXRlZCBvbiBhbiBlbnRpdHkgc2V0IG9yIGEgbmF2aWdhdGlvbiBwcm9wZXJ0eS5cbiAqIFdlIHJldHVybiB0aGUgY29ycmVjdCBvcGVyYXRvcnMgYmFzZWQgb24gdGhlIHNwZWNpZmllZCByZXN0cmljdGlvbiBhbmQgYWxzbyBjaGVjayBmb3IgdGhlIG9wZXJhdG9ycyBkZWZpbmVkIGluIHRoZSBtYW5pZmVzdCB0byBpbmNsdWRlIG9yIGV4Y2x1ZGUgdGhlbS5cbiAqXG4gKiBAcGFyYW0gc1Byb3BlcnR5IFN0cmluZyBuYW1lIG9mIHRoZSBwcm9wZXJ0eVxuICogQHBhcmFtIHNFbnRpdHlTZXRQYXRoIFN0cmluZyBwYXRoIHRvIHRoZSBlbnRpdHkgc2V0XG4gKiBAcGFyYW0gb0NvbnRleHQgQ29udGV4dCB1c2VkIGR1cmluZyB0ZW1wbGF0aW5nXG4gKiBAcGFyYW0gc1R5cGUgU3RyaW5nIGRhdGEgdHlwZSBvZCB0aGUgcHJvcGVydHksIGZvciBleGFtcGxlIGVkbS5EYXRlXG4gKiBAcGFyYW0gYlVzZVNlbWFudGljRGF0ZVJhbmdlIEJvb2xlYW4gcGFzc2VkIGZyb20gdGhlIG1hbmlmZXN0IGZvciBzZW1hbnRpYyBkYXRlIHJhbmdlXG4gKiBAcGFyYW0gc1NldHRpbmdzIFN0cmluZ2lmaWVkIG9iamVjdCBvZiB0aGUgcHJvcGVydHkgc2V0dGluZ3NcbiAqIEByZXR1cm5zIEFuIGFycmF5IG9mIHN0cmluZ3MgcmVwcmVzZW50aW5nIG9wZXJhdG9ycyBmb3IgZmlsdGVyaW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRPcGVyYXRvcnNGb3JQcm9wZXJ0eShcblx0c1Byb3BlcnR5OiBzdHJpbmcsXG5cdHNFbnRpdHlTZXRQYXRoOiBzdHJpbmcsXG5cdG9Db250ZXh0OiBPRGF0YU1ldGFNb2RlbCxcblx0c1R5cGU/OiBzdHJpbmcsXG5cdGJVc2VTZW1hbnRpY0RhdGVSYW5nZT86IGJvb2xlYW4gfCBzdHJpbmcsXG5cdHNTZXR0aW5ncz86IHN0cmluZ1xuKTogc3RyaW5nW10ge1xuXHRjb25zdCBvRmlsdGVyUmVzdHJpY3Rpb25zID0gQ29tbW9uVXRpbHMuZ2V0RmlsdGVyUmVzdHJpY3Rpb25zQnlQYXRoKHNFbnRpdHlTZXRQYXRoLCBvQ29udGV4dCk7XG5cdGNvbnN0IGFFcXVhbHNPcHMgPSBbXCJFUVwiXTtcblx0Y29uc3QgYVNpbmdsZVJhbmdlT3BzID0gW1wiRVFcIiwgXCJHRVwiLCBcIkxFXCIsIFwiTFRcIiwgXCJHVFwiLCBcIkJUXCIsIFwiTk9UTEVcIiwgXCJOT1RMVFwiLCBcIk5PVEdFXCIsIFwiTk9UR1RcIl07XG5cdGNvbnN0IGFTaW5nbGVSYW5nZURUQmFzaWNPcHMgPSBbXCJFUVwiLCBcIkJUXCJdO1xuXHRjb25zdCBhU2luZ2xlVmFsdWVEYXRlT3BzID0gW1xuXHRcdFwiVE9EQVlcIixcblx0XHRcIlRPTU9SUk9XXCIsXG5cdFx0XCJZRVNURVJEQVlcIixcblx0XHRcIkRBVEVcIixcblx0XHRcIkZJUlNUREFZV0VFS1wiLFxuXHRcdFwiTEFTVERBWVdFRUtcIixcblx0XHRcIkZJUlNUREFZTU9OVEhcIixcblx0XHRcIkxBU1REQVlNT05USFwiLFxuXHRcdFwiRklSU1REQVlRVUFSVEVSXCIsXG5cdFx0XCJMQVNUREFZUVVBUlRFUlwiLFxuXHRcdFwiRklSU1REQVlZRUFSXCIsXG5cdFx0XCJMQVNUREFZWUVBUlwiXG5cdF07XG5cdGNvbnN0IGFCYXNpY0RhdGVUaW1lT3BzID0gW1wiRVFcIiwgXCJCVFwiXTtcblx0Y29uc3QgYU11bHRpUmFuZ2VPcHMgPSBbXCJFUVwiLCBcIkdFXCIsIFwiTEVcIiwgXCJMVFwiLCBcIkdUXCIsIFwiQlRcIiwgXCJORVwiLCBcIk5PVEJUXCIsIFwiTk9UTEVcIiwgXCJOT1RMVFwiLCBcIk5PVEdFXCIsIFwiTk9UR1RcIl07XG5cdGNvbnN0IGFTZWFyY2hFeHByZXNzaW9uT3BzID0gW1wiQ29udGFpbnNcIiwgXCJOb3RDb250YWluc1wiLCBcIlN0YXJ0c1dpdGhcIiwgXCJOb3RTdGFydHNXaXRoXCIsIFwiRW5kc1dpdGhcIiwgXCJOb3RFbmRzV2l0aFwiXTtcblx0Y29uc3QgYVNlbWFudGljRGF0ZU9wc0V4dCA9IFNlbWFudGljRGF0ZU9wZXJhdG9ycy5nZXRTdXBwb3J0ZWRPcGVyYXRpb25zKCk7XG5cdGNvbnN0IGJTZW1hbnRpY0RhdGVSYW5nZSA9IGJVc2VTZW1hbnRpY0RhdGVSYW5nZSA9PT0gXCJ0cnVlXCIgfHwgYlVzZVNlbWFudGljRGF0ZVJhbmdlID09PSB0cnVlO1xuXHRsZXQgYVNlbWFudGljRGF0ZU9wczogc3RyaW5nW10gPSBbXTtcblx0Y29uc3Qgb1NldHRpbmdzID0gc1NldHRpbmdzICYmIHR5cGVvZiBzU2V0dGluZ3MgPT09IFwic3RyaW5nXCIgPyBKU09OLnBhcnNlKHNTZXR0aW5ncykuY3VzdG9tRGF0YSA6IHNTZXR0aW5ncztcblxuXHRpZiAoKG9Db250ZXh0LmdldE9iamVjdChgJHtzRW50aXR5U2V0UGF0aH0vQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5SZXN1bHRDb250ZXh0YCkgYXMgdW5rbm93bikgPT09IHRydWUpIHtcblx0XHRyZXR1cm4gYUVxdWFsc09wcztcblx0fVxuXG5cdGlmIChvU2V0dGluZ3MgJiYgb1NldHRpbmdzLm9wZXJhdG9yQ29uZmlndXJhdGlvbiAmJiBvU2V0dGluZ3Mub3BlcmF0b3JDb25maWd1cmF0aW9uLmxlbmd0aCA+IDApIHtcblx0XHRhU2VtYW50aWNEYXRlT3BzID0gU2VtYW50aWNEYXRlT3BlcmF0b3JzLmdldEZpbHRlck9wZXJhdGlvbnMob1NldHRpbmdzLm9wZXJhdG9yQ29uZmlndXJhdGlvbik7XG5cdH0gZWxzZSB7XG5cdFx0YVNlbWFudGljRGF0ZU9wcyA9IFNlbWFudGljRGF0ZU9wZXJhdG9ycy5nZXRTZW1hbnRpY0RhdGVPcGVyYXRpb25zKCk7XG5cdH1cblx0Ly8gR2V0IHRoZSBkZWZhdWx0IE9wZXJhdG9ycyBmb3IgdGhpcyBQcm9wZXJ0eSBUeXBlXG5cdGxldCBhRGVmYXVsdE9wZXJhdG9ycyA9IF9nZXREZWZhdWx0T3BlcmF0b3JzKHNUeXBlKTtcblx0aWYgKGJTZW1hbnRpY0RhdGVSYW5nZSkge1xuXHRcdGFEZWZhdWx0T3BlcmF0b3JzID0gYVNlbWFudGljRGF0ZU9wc0V4dC5jb25jYXQoYURlZmF1bHRPcGVyYXRvcnMpO1xuXHR9XG5cdGxldCByZXN0cmljdGlvbnM6IHN0cmluZ1tdID0gW107XG5cblx0Ly8gSXMgdGhlcmUgYSBGaWx0ZXIgUmVzdHJpY3Rpb24gZGVmaW5lZCBmb3IgdGhpcyBwcm9wZXJ0eT9cblx0aWYgKG9GaWx0ZXJSZXN0cmljdGlvbnMgJiYgb0ZpbHRlclJlc3RyaWN0aW9ucy5GaWx0ZXJBbGxvd2VkRXhwcmVzc2lvbnMgJiYgb0ZpbHRlclJlc3RyaWN0aW9ucy5GaWx0ZXJBbGxvd2VkRXhwcmVzc2lvbnNbc1Byb3BlcnR5XSkge1xuXHRcdC8vIEV4dGVuZGluZyB0aGUgZGVmYXVsdCBvcGVyYXRvcnMgbGlzdCB3aXRoIFNlbWFudGljIERhdGUgb3B0aW9ucyBEQVRFUkFOR0UsIERBVEUsIEZST00gYW5kIFRPXG5cdFx0Y29uc3Qgc0FsbG93ZWRFeHByZXNzaW9uID0gQ29tbW9uVXRpbHMuZ2V0U3BlY2lmaWNBbGxvd2VkRXhwcmVzc2lvbihvRmlsdGVyUmVzdHJpY3Rpb25zLkZpbHRlckFsbG93ZWRFeHByZXNzaW9uc1tzUHJvcGVydHldKTtcblx0XHQvLyBJbiBjYXNlIG1vcmUgdGhhbiBvbmUgQWxsb3dlZCBFeHByZXNzaW9ucyBoYXMgYmVlbiBkZWZpbmVkIGZvciBhIHByb3BlcnR5XG5cdFx0Ly8gY2hvb3NlIHRoZSBtb3N0IHJlc3RyaWN0aXZlIEFsbG93ZWQgRXhwcmVzc2lvblxuXG5cdFx0Ly8gTXVsdGlWYWx1ZSBoYXMgc2FtZSBPcGVyYXRvciBhcyBTaW5nbGVWYWx1ZSwgYnV0IHRoZXJlIGNhbiBiZSBtb3JlIHRoYW4gb25lIChtYXhDb25kaXRpb25zKVxuXHRcdHN3aXRjaCAoc0FsbG93ZWRFeHByZXNzaW9uKSB7XG5cdFx0XHRjYXNlIFwiU2luZ2xlVmFsdWVcIjpcblx0XHRcdFx0Y29uc3QgYVNpbmdsZVZhbHVlT3BzID0gc1R5cGUgPT09IFwiRWRtLkRhdGVcIiAmJiBiU2VtYW50aWNEYXRlUmFuZ2UgPyBhU2luZ2xlVmFsdWVEYXRlT3BzIDogYUVxdWFsc09wcztcblx0XHRcdFx0cmVzdHJpY3Rpb25zID0gX2dldFJlc3RyaWN0aW9ucyhhRGVmYXVsdE9wZXJhdG9ycywgYVNpbmdsZVZhbHVlT3BzKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFwiTXVsdGlWYWx1ZVwiOlxuXHRcdFx0XHRyZXN0cmljdGlvbnMgPSBfZ2V0UmVzdHJpY3Rpb25zKGFEZWZhdWx0T3BlcmF0b3JzLCBhRXF1YWxzT3BzKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFwiU2luZ2xlUmFuZ2VcIjpcblx0XHRcdFx0bGV0IGFFeHByZXNzaW9uT3BzOiBzdHJpbmdbXTtcblx0XHRcdFx0aWYgKGJTZW1hbnRpY0RhdGVSYW5nZSkge1xuXHRcdFx0XHRcdGlmIChzVHlwZSA9PT0gXCJFZG0uRGF0ZVwiKSB7XG5cdFx0XHRcdFx0XHRhRXhwcmVzc2lvbk9wcyA9IGFTZW1hbnRpY0RhdGVPcHM7XG5cdFx0XHRcdFx0fSBlbHNlIGlmIChzVHlwZSA9PT0gXCJFZG0uRGF0ZVRpbWVPZmZzZXRcIikge1xuXHRcdFx0XHRcdFx0YUV4cHJlc3Npb25PcHMgPSBhU2VtYW50aWNEYXRlT3BzLmNvbmNhdChhQmFzaWNEYXRlVGltZU9wcyk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGFFeHByZXNzaW9uT3BzID0gYVNpbmdsZVJhbmdlT3BzO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIGlmIChzVHlwZSA9PT0gXCJFZG0uRGF0ZVRpbWVPZmZzZXRcIikge1xuXHRcdFx0XHRcdGFFeHByZXNzaW9uT3BzID0gYVNpbmdsZVJhbmdlRFRCYXNpY09wcztcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRhRXhwcmVzc2lvbk9wcyA9IGFTaW5nbGVSYW5nZU9wcztcblx0XHRcdFx0fVxuXHRcdFx0XHRjb25zdCBzT3BlcmF0b3JzID0gX2dldFJlc3RyaWN0aW9ucyhhRGVmYXVsdE9wZXJhdG9ycywgYUV4cHJlc3Npb25PcHMpO1xuXHRcdFx0XHRyZXN0cmljdGlvbnMgPSBzT3BlcmF0b3JzO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgXCJNdWx0aVJhbmdlXCI6XG5cdFx0XHRcdHJlc3RyaWN0aW9ucyA9IF9nZXRSZXN0cmljdGlvbnMoYURlZmF1bHRPcGVyYXRvcnMsIGFNdWx0aVJhbmdlT3BzKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFwiU2VhcmNoRXhwcmVzc2lvblwiOlxuXHRcdFx0XHRyZXN0cmljdGlvbnMgPSBfZ2V0UmVzdHJpY3Rpb25zKGFEZWZhdWx0T3BlcmF0b3JzLCBhU2VhcmNoRXhwcmVzc2lvbk9wcyk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSBcIk11bHRpUmFuZ2VPclNlYXJjaEV4cHJlc3Npb25cIjpcblx0XHRcdFx0cmVzdHJpY3Rpb25zID0gX2dldFJlc3RyaWN0aW9ucyhhRGVmYXVsdE9wZXJhdG9ycywgYVNlYXJjaEV4cHJlc3Npb25PcHMuY29uY2F0KGFNdWx0aVJhbmdlT3BzKSk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0YnJlYWs7XG5cdFx0fVxuXHRcdC8vIEluIGNhc2UgQWxsb3dlZEV4cHJlc3Npb25zIGlzIG5vdCByZWNvZ25pc2VkLCB1bmRlZmluZWQgaW4gcmV0dXJuIHJlc3VsdHMgaW4gdGhlIGRlZmF1bHQgc2V0IG9mXG5cdFx0Ly8gb3BlcmF0b3JzIGZvciB0aGUgdHlwZS5cblx0fVxuXHRyZXR1cm4gcmVzdHJpY3Rpb25zO1xufVxuXG4vKipcbiAqIE1ldGhvZCB0byByZXR1cm4gYWxsb3dlZCBvcGVyYXRvcnMgZm9yIHR5cGUgR3VpZC5cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBuYW1lIGdldE9wZXJhdG9yc0Zvckd1aWRQcm9wZXJ0eVxuICogQHJldHVybnMgQWxsb3dlZCBvcGVyYXRvcnMgZm9yIHR5cGUgR3VpZFxuICovXG5mdW5jdGlvbiBnZXRPcGVyYXRvcnNGb3JHdWlkUHJvcGVydHkoKTogc3RyaW5nIHtcblx0Y29uc3QgYWxsb3dlZE9wZXJhdG9yc0Zvckd1aWQgPSBbXCJFUVwiLCBcIk5FXCJdO1xuXHRyZXR1cm4gYWxsb3dlZE9wZXJhdG9yc0Zvckd1aWQudG9TdHJpbmcoKTtcbn1cblxuZnVuY3Rpb24gZ2V0T3BlcmF0b3JzRm9yRGF0ZVByb3BlcnR5KHByb3BlcnR5VHlwZTogc3RyaW5nKTogc3RyaW5nW10ge1xuXHQvLyBJbiBjYXNlIEFsbG93ZWRFeHByZXNzaW9ucyBpcyBub3QgcHJvdmlkZWQgZm9yIHR5cGUgRWRtLkRhdGUgdGhlbiBhbGwgdGhlIGRlZmF1bHRcblx0Ly8gb3BlcmF0b3JzIGZvciB0aGUgdHlwZSBzaG91bGQgYmUgcmV0dXJuZWQgZXhjbHVkaW5nIHNlbWFudGljIG9wZXJhdG9ycyBmcm9tIHRoZSBsaXN0LlxuXHRjb25zdCBhRGVmYXVsdE9wZXJhdG9ycyA9IF9nZXREZWZhdWx0T3BlcmF0b3JzKHByb3BlcnR5VHlwZSk7XG5cdGNvbnN0IGFNdWx0aVJhbmdlT3BzID0gW1wiRVFcIiwgXCJHRVwiLCBcIkxFXCIsIFwiTFRcIiwgXCJHVFwiLCBcIkJUXCIsIFwiTkVcIiwgXCJOT1RCVFwiLCBcIk5PVExFXCIsIFwiTk9UTFRcIiwgXCJOT1RHRVwiLCBcIk5PVEdUXCJdO1xuXHRyZXR1cm4gX2dldFJlc3RyaWN0aW9ucyhhRGVmYXVsdE9wZXJhdG9ycywgYU11bHRpUmFuZ2VPcHMpO1xufVxuXG50eXBlIFBhcmFtZXRlckluZm8gPSB7XG5cdGNvbnRleHRQYXRoPzogc3RyaW5nO1xuXHRwYXJhbWV0ZXJQcm9wZXJ0aWVzPzogUmVjb3JkPHN0cmluZywgTWV0YU1vZGVsUHJvcGVydHk+O1xufTtcbmZ1bmN0aW9uIGdldFBhcmFtZXRlckluZm8obWV0YU1vZGVsQ29udGV4dDogT0RhdGFNZXRhTW9kZWwsIHNDb250ZXh0UGF0aDogc3RyaW5nKSB7XG5cdGNvbnN0IHNQYXJhbWV0ZXJDb250ZXh0UGF0aCA9IHNDb250ZXh0UGF0aC5zdWJzdHJpbmcoMCwgc0NvbnRleHRQYXRoLmxhc3RJbmRleE9mKFwiL1wiKSk7XG5cdGNvbnN0IGJSZXN1bHRDb250ZXh0ID0gbWV0YU1vZGVsQ29udGV4dC5nZXRPYmplY3QoYCR7c1BhcmFtZXRlckNvbnRleHRQYXRofS9AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLlJlc3VsdENvbnRleHRgKTtcblx0Y29uc3Qgb1BhcmFtZXRlckluZm86IFBhcmFtZXRlckluZm8gPSB7fTtcblx0aWYgKGJSZXN1bHRDb250ZXh0ICYmIHNQYXJhbWV0ZXJDb250ZXh0UGF0aCAhPT0gc0NvbnRleHRQYXRoKSB7XG5cdFx0b1BhcmFtZXRlckluZm8uY29udGV4dFBhdGggPSBzUGFyYW1ldGVyQ29udGV4dFBhdGg7XG5cdFx0b1BhcmFtZXRlckluZm8ucGFyYW1ldGVyUHJvcGVydGllcyA9IENvbW1vblV0aWxzLmdldENvbnRleHRQYXRoUHJvcGVydGllcyhtZXRhTW9kZWxDb250ZXh0LCBzUGFyYW1ldGVyQ29udGV4dFBhdGgpO1xuXHR9XG5cdHJldHVybiBvUGFyYW1ldGVySW5mbztcbn1cblxuLyoqXG4gKiBNZXRob2QgdG8gYWRkIHRoZSBzZWxlY3QgT3B0aW9ucyB0byBmaWx0ZXIgY29uZGl0aW9ucy5cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBuYW1lIGFkZFNlbGVjdE9wdGlvblRvQ29uZGl0aW9uc1xuICogQHBhcmFtIG9Qcm9wZXJ0eU1ldGFkYXRhIFByb3BlcnR5IG1ldGFkYXRhIGluZm9ybWF0aW9uXG4gKiBAcGFyYW0gYVZhbGlkT3BlcmF0b3JzIE9wZXJhdG9ycyBmb3IgYWxsIHRoZSBkYXRhIHR5cGVzXG4gKiBAcGFyYW0gYVNlbWFudGljRGF0ZU9wZXJhdG9ycyBPcGVyYXRvcnMgZm9yIHRoZSBEYXRlIHR5cGVcbiAqIEBwYXJhbSBhQ3VtdWxhdGl2ZUNvbmRpdGlvbnMgRmlsdGVyIGNvbmRpdGlvbnNcbiAqIEBwYXJhbSBvU2VsZWN0T3B0aW9uIFNlbGVjdG9wdGlvbiBvZiBzZWxlY3Rpb24gdmFyaWFudFxuICogQHJldHVybnMgVGhlIGZpbHRlciBjb25kaXRpb25zXG4gKi9cbmZ1bmN0aW9uIGFkZFNlbGVjdE9wdGlvblRvQ29uZGl0aW9ucyhcblx0b1Byb3BlcnR5TWV0YWRhdGE6IHVua25vd24sXG5cdGFWYWxpZE9wZXJhdG9yczogc3RyaW5nW10sXG5cdGFTZW1hbnRpY0RhdGVPcGVyYXRvcnM6IHN0cmluZ1tdLFxuXHRhQ3VtdWxhdGl2ZUNvbmRpdGlvbnM6IENvbmRpdGlvbk9iamVjdFtdLFxuXHRvU2VsZWN0T3B0aW9uOiBTZWxlY3RPcHRpb25cbikge1xuXHRjb25zdCBvQ29uZGl0aW9uID0gZ2V0Q29uZGl0aW9ucyhvU2VsZWN0T3B0aW9uLCBvUHJvcGVydHlNZXRhZGF0YSk7XG5cdGlmIChcblx0XHRvU2VsZWN0T3B0aW9uPy5TZW1hbnRpY0RhdGVzICYmXG5cdFx0YVNlbWFudGljRGF0ZU9wZXJhdG9ycyAmJlxuXHRcdGFTZW1hbnRpY0RhdGVPcGVyYXRvcnMuaW5kZXhPZihvU2VsZWN0T3B0aW9uPy5TZW1hbnRpY0RhdGVzPy5vcGVyYXRvcikgPiAtMVxuXHQpIHtcblx0XHRjb25zdCBzZW1hbnRpY0RhdGVzID0gQ29tbW9uVXRpbHMuYWRkU2VtYW50aWNEYXRlc1RvQ29uZGl0aW9ucyhvU2VsZWN0T3B0aW9uPy5TZW1hbnRpY0RhdGVzKTtcblx0XHRpZiAoc2VtYW50aWNEYXRlcyAmJiBPYmplY3Qua2V5cyhzZW1hbnRpY0RhdGVzKS5sZW5ndGggPiAwKSB7XG5cdFx0XHRhQ3VtdWxhdGl2ZUNvbmRpdGlvbnMucHVzaChzZW1hbnRpY0RhdGVzKTtcblx0XHR9XG5cdH0gZWxzZSBpZiAob0NvbmRpdGlvbikge1xuXHRcdGlmIChhVmFsaWRPcGVyYXRvcnMubGVuZ3RoID09PSAwIHx8IGFWYWxpZE9wZXJhdG9ycy5pbmRleE9mKG9Db25kaXRpb24ub3BlcmF0b3IpID4gLTEpIHtcblx0XHRcdGFDdW11bGF0aXZlQ29uZGl0aW9ucy5wdXNoKG9Db25kaXRpb24pO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gYUN1bXVsYXRpdmVDb25kaXRpb25zO1xufVxuXG4vKipcbiAqIE1ldGhvZCB0byBhZGQgdGhlIHNlbWFudGljIGRhdGVzIHRvIGZpbHRlciBjb25kaXRpb25zXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAbmFtZSBhZGRTZW1hbnRpY0RhdGVzVG9Db25kaXRpb25zXG4gKiBAcGFyYW0gb1NlbWFudGljRGF0ZXMgU2VtYW50aWMgZGF0ZSBpbmZvbWF0aW9uXG4gKiBAcmV0dXJucyBUaGUgZmlsdGVyIGNvbmRpdGlvbnMgY29udGFpbmluZyBzZW1hbnRpYyBkYXRlc1xuICovXG5cbmZ1bmN0aW9uIGFkZFNlbWFudGljRGF0ZXNUb0NvbmRpdGlvbnMob1NlbWFudGljRGF0ZXM6IFNlbWFudGljRGF0ZUNvbmZpZ3VyYXRpb24pOiBDb25kaXRpb25PYmplY3Qge1xuXHRjb25zdCB2YWx1ZXM6IHVua25vd25bXSA9IFtdO1xuXHRpZiAob1NlbWFudGljRGF0ZXM/LmhpZ2gpIHtcblx0XHR2YWx1ZXMucHVzaChvU2VtYW50aWNEYXRlcz8uaGlnaCk7XG5cdH1cblx0aWYgKG9TZW1hbnRpY0RhdGVzPy5sb3cpIHtcblx0XHR2YWx1ZXMucHVzaChvU2VtYW50aWNEYXRlcz8ubG93KTtcblx0fVxuXHRyZXR1cm4ge1xuXHRcdHZhbHVlczogdmFsdWVzLFxuXHRcdG9wZXJhdG9yOiBvU2VtYW50aWNEYXRlcz8ub3BlcmF0b3IsXG5cdFx0aXNFbXB0eTogdW5kZWZpbmVkXG5cdH07XG59XG5cbmZ1bmN0aW9uIGFkZFNlbGVjdE9wdGlvbnNUb0NvbmRpdGlvbnMoXG5cdHNDb250ZXh0UGF0aDogc3RyaW5nLFxuXHRvU2VsZWN0aW9uVmFyaWFudDogU2VsZWN0aW9uVmFyaWFudCxcblx0c1NlbGVjdE9wdGlvblByb3A6IHN0cmluZyxcblx0b0NvbmRpdGlvbnM6IFJlY29yZDxzdHJpbmcsIENvbmRpdGlvbk9iamVjdFtdPixcblx0c0NvbmRpdGlvblBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCxcblx0c0NvbmRpdGlvblByb3A6IHN0cmluZyxcblx0b1ZhbGlkUHJvcGVydGllczogUmVjb3JkPHN0cmluZywgTWV0YU1vZGVsUHJvcGVydHk+LFxuXHRtZXRhTW9kZWxDb250ZXh0OiBPRGF0YU1ldGFNb2RlbCxcblx0aXNQYXJhbWV0ZXI6IGJvb2xlYW4sXG5cdGJJc0ZMUFZhbHVlUHJlc2VudD86IGJvb2xlYW4sXG5cdGJVc2VTZW1hbnRpY0RhdGVSYW5nZT86IGJvb2xlYW4gfCBzdHJpbmcsXG5cdG9WaWV3RGF0YT86IG9iamVjdFxuKSB7XG5cdGxldCBhQ29uZGl0aW9uczogQ29uZGl0aW9uT2JqZWN0W10gPSBbXSxcblx0XHRhU2VsZWN0T3B0aW9uczogU2VsZWN0T3B0aW9uW10sXG5cdFx0YVZhbGlkT3BlcmF0b3JzOiBzdHJpbmdbXSxcblx0XHRhU2VtYW50aWNEYXRlT3BlcmF0b3JzOiBzdHJpbmdbXSA9IFtdO1xuXG5cdGlmIChpc1BhcmFtZXRlciB8fCBDb21tb25VdGlscy5pc1Byb3BlcnR5RmlsdGVyYWJsZShtZXRhTW9kZWxDb250ZXh0LCBzQ29udGV4dFBhdGgsIHNDb25kaXRpb25Qcm9wLCB0cnVlKSkge1xuXHRcdGNvbnN0IG9Qcm9wZXJ0eU1ldGFkYXRhID0gb1ZhbGlkUHJvcGVydGllc1tzQ29uZGl0aW9uUHJvcF07XG5cdFx0YVNlbGVjdE9wdGlvbnMgPSBvU2VsZWN0aW9uVmFyaWFudC5nZXRTZWxlY3RPcHRpb24oc1NlbGVjdE9wdGlvblByb3ApIGFzIFNlbGVjdE9wdGlvbltdO1xuXHRcdGNvbnN0IHNldHRpbmdzID0gZ2V0RmlsdGVyQ29uZmlndXJhdGlvblNldHRpbmcob1ZpZXdEYXRhLCBzQ29uZGl0aW9uUHJvcCk7XG5cdFx0YVZhbGlkT3BlcmF0b3JzID0gaXNQYXJhbWV0ZXIgPyBbXCJFUVwiXSA6IENvbW1vblV0aWxzLmdldE9wZXJhdG9yc0ZvclByb3BlcnR5KHNDb25kaXRpb25Qcm9wLCBzQ29udGV4dFBhdGgsIG1ldGFNb2RlbENvbnRleHQpO1xuXHRcdGlmIChiVXNlU2VtYW50aWNEYXRlUmFuZ2UpIHtcblx0XHRcdGFTZW1hbnRpY0RhdGVPcGVyYXRvcnMgPSBpc1BhcmFtZXRlclxuXHRcdFx0XHQ/IFtcIkVRXCJdXG5cdFx0XHRcdDogQ29tbW9uVXRpbHMuZ2V0T3BlcmF0b3JzRm9yUHJvcGVydHkoXG5cdFx0XHRcdFx0XHRzQ29uZGl0aW9uUHJvcCxcblx0XHRcdFx0XHRcdHNDb250ZXh0UGF0aCxcblx0XHRcdFx0XHRcdG1ldGFNb2RlbENvbnRleHQsXG5cdFx0XHRcdFx0XHRvUHJvcGVydHlNZXRhZGF0YT8uJFR5cGUsXG5cdFx0XHRcdFx0XHRiVXNlU2VtYW50aWNEYXRlUmFuZ2UsXG5cdFx0XHRcdFx0XHRzZXR0aW5nc1xuXHRcdFx0XHQgICk7XG5cdFx0fVxuXHRcdC8vIENyZWF0ZSBjb25kaXRpb25zIGZvciBhbGwgdGhlIHNlbGVjdE9wdGlvbnMgb2YgdGhlIHByb3BlcnR5XG5cdFx0YUNvbmRpdGlvbnMgPSBpc1BhcmFtZXRlclxuXHRcdFx0PyBDb21tb25VdGlscy5hZGRTZWxlY3RPcHRpb25Ub0NvbmRpdGlvbnMoXG5cdFx0XHRcdFx0b1Byb3BlcnR5TWV0YWRhdGEsXG5cdFx0XHRcdFx0YVZhbGlkT3BlcmF0b3JzLFxuXHRcdFx0XHRcdGFTZW1hbnRpY0RhdGVPcGVyYXRvcnMsXG5cdFx0XHRcdFx0YUNvbmRpdGlvbnMsXG5cdFx0XHRcdFx0YVNlbGVjdE9wdGlvbnNbMF1cblx0XHRcdCAgKVxuXHRcdFx0OiBhU2VsZWN0T3B0aW9ucy5yZWR1Y2UoXG5cdFx0XHRcdFx0Q29tbW9uVXRpbHMuYWRkU2VsZWN0T3B0aW9uVG9Db25kaXRpb25zLmJpbmQobnVsbCwgb1Byb3BlcnR5TWV0YWRhdGEsIGFWYWxpZE9wZXJhdG9ycywgYVNlbWFudGljRGF0ZU9wZXJhdG9ycyksXG5cdFx0XHRcdFx0YUNvbmRpdGlvbnNcblx0XHRcdCAgKTtcblx0XHRpZiAoYUNvbmRpdGlvbnMubGVuZ3RoKSB7XG5cdFx0XHRpZiAoc0NvbmRpdGlvblBhdGgpIHtcblx0XHRcdFx0b0NvbmRpdGlvbnNbc0NvbmRpdGlvblBhdGggKyBzQ29uZGl0aW9uUHJvcF0gPSBvQ29uZGl0aW9ucy5oYXNPd25Qcm9wZXJ0eShzQ29uZGl0aW9uUGF0aCArIHNDb25kaXRpb25Qcm9wKVxuXHRcdFx0XHRcdD8gb0NvbmRpdGlvbnNbc0NvbmRpdGlvblBhdGggKyBzQ29uZGl0aW9uUHJvcF0uY29uY2F0KGFDb25kaXRpb25zKVxuXHRcdFx0XHRcdDogYUNvbmRpdGlvbnM7XG5cdFx0XHR9IGVsc2UgaWYgKGJJc0ZMUFZhbHVlUHJlc2VudCkge1xuXHRcdFx0XHQvLyBJZiBGTFAgdmFsdWVzIGFyZSBwcmVzZW50IHJlcGxhY2UgaXQgd2l0aCBGTFAgdmFsdWVzXG5cdFx0XHRcdGFDb25kaXRpb25zLmZvckVhY2goKGVsZW1lbnQpID0+IHtcblx0XHRcdFx0XHRlbGVtZW50W1wiZmlsdGVyZWRcIl0gPSB0cnVlO1xuXHRcdFx0XHR9KTtcblx0XHRcdFx0aWYgKG9Db25kaXRpb25zLmhhc093blByb3BlcnR5KHNDb25kaXRpb25Qcm9wKSkge1xuXHRcdFx0XHRcdG9Db25kaXRpb25zW3NDb25kaXRpb25Qcm9wXS5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG5cdFx0XHRcdFx0XHRlbGVtZW50W1wiZmlsdGVyZWRcIl0gPSBmYWxzZTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRvQ29uZGl0aW9uc1tzQ29uZGl0aW9uUHJvcF0gPSBvQ29uZGl0aW9uc1tzQ29uZGl0aW9uUHJvcF0uY29uY2F0KGFDb25kaXRpb25zKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRvQ29uZGl0aW9uc1tzQ29uZGl0aW9uUHJvcF0gPSBhQ29uZGl0aW9ucztcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0b0NvbmRpdGlvbnNbc0NvbmRpdGlvblByb3BdID0gb0NvbmRpdGlvbnMuaGFzT3duUHJvcGVydHkoc0NvbmRpdGlvblByb3ApXG5cdFx0XHRcdFx0PyBvQ29uZGl0aW9uc1tzQ29uZGl0aW9uUHJvcF0uY29uY2F0KGFDb25kaXRpb25zKVxuXHRcdFx0XHRcdDogYUNvbmRpdGlvbnM7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59XG5cbi8qKlxuICogTWV0aG9kIHRvIGNyZWF0ZSB0aGUgc2VtYW50aWMgZGF0ZXMgZnJvbSBmaWx0ZXIgY29uZGl0aW9uc1xuICpcbiAqIEBmdW5jdGlvblxuICogQG5hbWUgY3JlYXRlU2VtYW50aWNEYXRlc0Zyb21Db25kaXRpb25zXG4gKiBAcGFyYW0gb0NvbmRpdGlvbiBGaWx0ZXIgZmllbGQgY29uZGl0aW9uXG4gKiBAcGFyYW0gc0ZpbHRlck5hbWUgRmlsdGVyIEZpZWxkIFBhdGhcbiAqIEByZXR1cm5zIFRoZSBTZW1hbnRpYyBkYXRlIGNvbmRpdGlvbnNcbiAqL1xuXG5mdW5jdGlvbiBjcmVhdGVTZW1hbnRpY0RhdGVzRnJvbUNvbmRpdGlvbnMob0NvbmRpdGlvbjogQ29uZGl0aW9uVHlwZSk6IFNlbWFudGljRGF0ZUNvbmZpZ3VyYXRpb24ge1xuXHRyZXR1cm4ge1xuXHRcdGhpZ2g6IChvQ29uZGl0aW9uPy52YWx1ZXM/LlswXSBhcyBzdHJpbmcpIHx8IG51bGwsXG5cdFx0bG93OiAob0NvbmRpdGlvbj8udmFsdWVzPy5bMV0gYXMgc3RyaW5nKSB8fCBudWxsLFxuXHRcdG9wZXJhdG9yOiBvQ29uZGl0aW9uPy5vcGVyYXRvclxuXHR9O1xufVxuXG4vKipcbiAqIE1ldGhvZCB0byBSZXR1cm4gdGhlIGZpbHRlciBjb25maWd1cmF0aW9uXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAbmFtZSBnZXRGaWx0ZXJDb25maWd1cmF0aW9uU2V0dGluZ1xuICogQHBhcmFtIG9WaWV3RGF0YSBtYW5pZmVzdCBDb25maWd1cmF0aW9uXG4gKiBAcGFyYW0gc1Byb3BlcnR5IEZpbHRlciBGaWVsZCBQYXRoXG4gKiBAcmV0dXJucyBUaGUgRmlsdGVyIEZpZWxkIENvbmZpZ3VyYXRpb25cbiAqL1xudHlwZSBWaWV3RGF0YSA9IHtcblx0Y29udHJvbENvbmZpZ3VyYXRpb24/OiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj47XG59O1xuZnVuY3Rpb24gZ2V0RmlsdGVyQ29uZmlndXJhdGlvblNldHRpbmcob1ZpZXdEYXRhOiBWaWV3RGF0YSA9IHt9LCBzUHJvcGVydHk6IHN0cmluZykge1xuXHRjb25zdCBvQ29uZmlnID0gb1ZpZXdEYXRhPy5jb250cm9sQ29uZmlndXJhdGlvbjtcblx0Y29uc3QgZmlsdGVyQ29uZmlnID1cblx0XHRvQ29uZmlnICYmIChvQ29uZmlnW1wiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLlNlbGVjdGlvbkZpZWxkc1wiXT8uZmlsdGVyRmllbGRzIGFzIFJlY29yZDxzdHJpbmcsIHsgc2V0dGluZ3M6IHN0cmluZyB9Pik7XG5cdHJldHVybiBmaWx0ZXJDb25maWc/LltzUHJvcGVydHldID8gZmlsdGVyQ29uZmlnW3NQcm9wZXJ0eV0/LnNldHRpbmdzIDogdW5kZWZpbmVkO1xufVxuZnVuY3Rpb24gYWRkU2VsZWN0aW9uVmFyaWFudFRvQ29uZGl0aW9ucyhcblx0b1NlbGVjdGlvblZhcmlhbnQ6IFNlbGVjdGlvblZhcmlhbnQsXG5cdG9Db25kaXRpb25zOiBSZWNvcmQ8c3RyaW5nLCBDb25kaXRpb25PYmplY3RbXT4sXG5cdG9NZXRhTW9kZWxDb250ZXh0OiBPRGF0YU1ldGFNb2RlbCxcblx0c0NvbnRleHRQYXRoOiBzdHJpbmcsXG5cdGJJc0ZMUFZhbHVlcz86IGJvb2xlYW4sXG5cdGJVc2VTZW1hbnRpY0RhdGVSYW5nZT86IGJvb2xlYW4sXG5cdG9WaWV3RGF0YT86IG9iamVjdFxuKSB7XG5cdGNvbnN0IGFTZWxlY3RPcHRpb25zUHJvcGVydHlOYW1lcyA9IG9TZWxlY3Rpb25WYXJpYW50LmdldFNlbGVjdE9wdGlvbnNQcm9wZXJ0eU5hbWVzKCksXG5cdFx0b1ZhbGlkUHJvcGVydGllcyA9IENvbW1vblV0aWxzLmdldENvbnRleHRQYXRoUHJvcGVydGllcyhvTWV0YU1vZGVsQ29udGV4dCwgc0NvbnRleHRQYXRoKSxcblx0XHRhTWV0YWRhdFByb3BlcnRpZXMgPSBPYmplY3Qua2V5cyhvVmFsaWRQcm9wZXJ0aWVzKSxcblx0XHRvUGFyYW1ldGVySW5mbyA9IENvbW1vblV0aWxzLmdldFBhcmFtZXRlckluZm8ob01ldGFNb2RlbENvbnRleHQsIHNDb250ZXh0UGF0aCksXG5cdFx0c1BhcmFtZXRlckNvbnRleHRQYXRoID0gb1BhcmFtZXRlckluZm8uY29udGV4dFBhdGgsXG5cdFx0b1ZhbGlkUGFyYW1ldGVyUHJvcGVydGllcyA9IG9QYXJhbWV0ZXJJbmZvLnBhcmFtZXRlclByb3BlcnRpZXM7XG5cblx0aWYgKHNQYXJhbWV0ZXJDb250ZXh0UGF0aCAhPT0gdW5kZWZpbmVkICYmIG9WYWxpZFBhcmFtZXRlclByb3BlcnRpZXMgJiYgT2JqZWN0LmtleXMob1ZhbGlkUGFyYW1ldGVyUHJvcGVydGllcykubGVuZ3RoID4gMCkge1xuXHRcdGNvbnN0IGFNZXRhZGF0YVBhcmFtZXRlcnMgPSBPYmplY3Qua2V5cyhvVmFsaWRQYXJhbWV0ZXJQcm9wZXJ0aWVzKTtcblx0XHRhTWV0YWRhdGFQYXJhbWV0ZXJzLmZvckVhY2goZnVuY3Rpb24gKHNNZXRhZGF0YVBhcmFtZXRlcjogc3RyaW5nKSB7XG5cdFx0XHRsZXQgc1NlbGVjdE9wdGlvbk5hbWU7XG5cdFx0XHRpZiAoYVNlbGVjdE9wdGlvbnNQcm9wZXJ0eU5hbWVzLmluY2x1ZGVzKGAkUGFyYW1ldGVyLiR7c01ldGFkYXRhUGFyYW1ldGVyfWApKSB7XG5cdFx0XHRcdHNTZWxlY3RPcHRpb25OYW1lID0gYCRQYXJhbWV0ZXIuJHtzTWV0YWRhdGFQYXJhbWV0ZXJ9YDtcblx0XHRcdH0gZWxzZSBpZiAoYVNlbGVjdE9wdGlvbnNQcm9wZXJ0eU5hbWVzLmluY2x1ZGVzKHNNZXRhZGF0YVBhcmFtZXRlcikpIHtcblx0XHRcdFx0c1NlbGVjdE9wdGlvbk5hbWUgPSBzTWV0YWRhdGFQYXJhbWV0ZXI7XG5cdFx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0XHRzTWV0YWRhdGFQYXJhbWV0ZXIuc3RhcnRzV2l0aChcIlBfXCIpICYmXG5cdFx0XHRcdGFTZWxlY3RPcHRpb25zUHJvcGVydHlOYW1lcy5pbmNsdWRlcyhgJFBhcmFtZXRlci4ke3NNZXRhZGF0YVBhcmFtZXRlci5zbGljZSgyLCBzTWV0YWRhdGFQYXJhbWV0ZXIubGVuZ3RoKX1gKVxuXHRcdFx0KSB7XG5cdFx0XHRcdHNTZWxlY3RPcHRpb25OYW1lID0gYCRQYXJhbWV0ZXIuJHtzTWV0YWRhdGFQYXJhbWV0ZXIuc2xpY2UoMiwgc01ldGFkYXRhUGFyYW1ldGVyLmxlbmd0aCl9YDtcblx0XHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRcdHNNZXRhZGF0YVBhcmFtZXRlci5zdGFydHNXaXRoKFwiUF9cIikgJiZcblx0XHRcdFx0YVNlbGVjdE9wdGlvbnNQcm9wZXJ0eU5hbWVzLmluY2x1ZGVzKHNNZXRhZGF0YVBhcmFtZXRlci5zbGljZSgyLCBzTWV0YWRhdGFQYXJhbWV0ZXIubGVuZ3RoKSlcblx0XHRcdCkge1xuXHRcdFx0XHRzU2VsZWN0T3B0aW9uTmFtZSA9IHNNZXRhZGF0YVBhcmFtZXRlci5zbGljZSgyLCBzTWV0YWRhdGFQYXJhbWV0ZXIubGVuZ3RoKTtcblx0XHRcdH0gZWxzZSBpZiAoYVNlbGVjdE9wdGlvbnNQcm9wZXJ0eU5hbWVzLmluY2x1ZGVzKGAkUGFyYW1ldGVyLlBfJHtzTWV0YWRhdGFQYXJhbWV0ZXJ9YCkpIHtcblx0XHRcdFx0c1NlbGVjdE9wdGlvbk5hbWUgPSBgJFBhcmFtZXRlci5QXyR7c01ldGFkYXRhUGFyYW1ldGVyfWA7XG5cdFx0XHR9IGVsc2UgaWYgKGFTZWxlY3RPcHRpb25zUHJvcGVydHlOYW1lcy5pbmNsdWRlcyhgUF8ke3NNZXRhZGF0YVBhcmFtZXRlcn1gKSkge1xuXHRcdFx0XHRzU2VsZWN0T3B0aW9uTmFtZSA9IGBQXyR7c01ldGFkYXRhUGFyYW1ldGVyfWA7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChzU2VsZWN0T3B0aW9uTmFtZSkge1xuXHRcdFx0XHRhZGRTZWxlY3RPcHRpb25zVG9Db25kaXRpb25zKFxuXHRcdFx0XHRcdHNQYXJhbWV0ZXJDb250ZXh0UGF0aCxcblx0XHRcdFx0XHRvU2VsZWN0aW9uVmFyaWFudCxcblx0XHRcdFx0XHRzU2VsZWN0T3B0aW9uTmFtZSxcblx0XHRcdFx0XHRvQ29uZGl0aW9ucyxcblx0XHRcdFx0XHR1bmRlZmluZWQsXG5cdFx0XHRcdFx0c01ldGFkYXRhUGFyYW1ldGVyLFxuXHRcdFx0XHRcdG9WYWxpZFBhcmFtZXRlclByb3BlcnRpZXMsXG5cdFx0XHRcdFx0b01ldGFNb2RlbENvbnRleHQsXG5cdFx0XHRcdFx0dHJ1ZSxcblx0XHRcdFx0XHRiSXNGTFBWYWx1ZXMsXG5cdFx0XHRcdFx0YlVzZVNlbWFudGljRGF0ZVJhbmdlLFxuXHRcdFx0XHRcdG9WaWV3RGF0YVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cdGFNZXRhZGF0UHJvcGVydGllcy5mb3JFYWNoKGZ1bmN0aW9uIChzTWV0YWRhdGFQcm9wZXJ0eTogc3RyaW5nKSB7XG5cdFx0bGV0IHNTZWxlY3RPcHRpb25OYW1lO1xuXHRcdGlmIChhU2VsZWN0T3B0aW9uc1Byb3BlcnR5TmFtZXMuaW5jbHVkZXMoc01ldGFkYXRhUHJvcGVydHkpKSB7XG5cdFx0XHRzU2VsZWN0T3B0aW9uTmFtZSA9IHNNZXRhZGF0YVByb3BlcnR5O1xuXHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRzTWV0YWRhdGFQcm9wZXJ0eS5zdGFydHNXaXRoKFwiUF9cIikgJiZcblx0XHRcdGFTZWxlY3RPcHRpb25zUHJvcGVydHlOYW1lcy5pbmNsdWRlcyhzTWV0YWRhdGFQcm9wZXJ0eS5zbGljZSgyLCBzTWV0YWRhdGFQcm9wZXJ0eS5sZW5ndGgpKVxuXHRcdCkge1xuXHRcdFx0c1NlbGVjdE9wdGlvbk5hbWUgPSBzTWV0YWRhdGFQcm9wZXJ0eS5zbGljZSgyLCBzTWV0YWRhdGFQcm9wZXJ0eS5sZW5ndGgpO1xuXHRcdH0gZWxzZSBpZiAoYVNlbGVjdE9wdGlvbnNQcm9wZXJ0eU5hbWVzLmluY2x1ZGVzKGBQXyR7c01ldGFkYXRhUHJvcGVydHl9YCkpIHtcblx0XHRcdHNTZWxlY3RPcHRpb25OYW1lID0gYFBfJHtzTWV0YWRhdGFQcm9wZXJ0eX1gO1xuXHRcdH1cblx0XHRpZiAoc1NlbGVjdE9wdGlvbk5hbWUpIHtcblx0XHRcdGFkZFNlbGVjdE9wdGlvbnNUb0NvbmRpdGlvbnMoXG5cdFx0XHRcdHNDb250ZXh0UGF0aCxcblx0XHRcdFx0b1NlbGVjdGlvblZhcmlhbnQsXG5cdFx0XHRcdHNTZWxlY3RPcHRpb25OYW1lLFxuXHRcdFx0XHRvQ29uZGl0aW9ucyxcblx0XHRcdFx0dW5kZWZpbmVkLFxuXHRcdFx0XHRzTWV0YWRhdGFQcm9wZXJ0eSxcblx0XHRcdFx0b1ZhbGlkUHJvcGVydGllcyxcblx0XHRcdFx0b01ldGFNb2RlbENvbnRleHQsXG5cdFx0XHRcdGZhbHNlLFxuXHRcdFx0XHRiSXNGTFBWYWx1ZXMsXG5cdFx0XHRcdGJVc2VTZW1hbnRpY0RhdGVSYW5nZSxcblx0XHRcdFx0b1ZpZXdEYXRhXG5cdFx0XHQpO1xuXHRcdH1cblx0fSk7XG5cblx0YVNlbGVjdE9wdGlvbnNQcm9wZXJ0eU5hbWVzLmZvckVhY2goZnVuY3Rpb24gKHNTZWxlY3RPcHRpb246IHN0cmluZykge1xuXHRcdGlmIChzU2VsZWN0T3B0aW9uLmluZGV4T2YoXCIuXCIpID4gMCAmJiAhc1NlbGVjdE9wdGlvbi5pbmNsdWRlcyhcIiRQYXJhbWV0ZXJcIikpIHtcblx0XHRcdGNvbnN0IHNSZXBsYWNlZE9wdGlvbiA9IHNTZWxlY3RPcHRpb24ucmVwbGFjZUFsbChcIi5cIiwgXCIvXCIpO1xuXHRcdFx0Y29uc3Qgc0Z1bGxDb250ZXh0UGF0aCA9IGAvJHtzUmVwbGFjZWRPcHRpb259YC5zdGFydHNXaXRoKHNDb250ZXh0UGF0aClcblx0XHRcdFx0PyBgLyR7c1JlcGxhY2VkT3B0aW9ufWBcblx0XHRcdFx0OiBgJHtzQ29udGV4dFBhdGh9LyR7c1JlcGxhY2VkT3B0aW9ufWA7IC8vIGNoZWNrIGlmIHRoZSBmdWxsIHBhdGgsIGVnIFNhbGVzT3JkZXJNYW5hZ2UuX0l0ZW0uTWF0ZXJpYWwgZXhpc3RzIGluIHRoZSBtZXRhbW9kZWxcblx0XHRcdGlmIChvTWV0YU1vZGVsQ29udGV4dC5nZXRPYmplY3Qoc0Z1bGxDb250ZXh0UGF0aC5yZXBsYWNlKFwiUF9cIiwgXCJcIikpKSB7XG5cdFx0XHRcdF9jcmVhdGVDb25kaXRpb25zRm9yTmF2UHJvcGVydGllcyhcblx0XHRcdFx0XHRzRnVsbENvbnRleHRQYXRoLFxuXHRcdFx0XHRcdHNDb250ZXh0UGF0aCxcblx0XHRcdFx0XHRvU2VsZWN0aW9uVmFyaWFudCxcblx0XHRcdFx0XHRzU2VsZWN0T3B0aW9uLFxuXHRcdFx0XHRcdG9NZXRhTW9kZWxDb250ZXh0LFxuXHRcdFx0XHRcdG9Db25kaXRpb25zLFxuXHRcdFx0XHRcdGJJc0ZMUFZhbHVlcyxcblx0XHRcdFx0XHRiVXNlU2VtYW50aWNEYXRlUmFuZ2UsXG5cdFx0XHRcdFx0b1ZpZXdEYXRhXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9KTtcblx0cmV0dXJuIG9Db25kaXRpb25zO1xufVxuXG5mdW5jdGlvbiBfY3JlYXRlQ29uZGl0aW9uc0Zvck5hdlByb3BlcnRpZXMoXG5cdHNGdWxsQ29udGV4dFBhdGg6IHN0cmluZyxcblx0c01haW5FbnRpdHlTZXRQYXRoOiBzdHJpbmcsXG5cdG9TZWxlY3Rpb25WYXJpYW50OiBTZWxlY3Rpb25WYXJpYW50LFxuXHRzU2VsZWN0T3B0aW9uOiBzdHJpbmcsXG5cdG9NZXRhTW9kZWxDb250ZXh0OiBPRGF0YU1ldGFNb2RlbCxcblx0b0NvbmRpdGlvbnM6IFJlY29yZDxzdHJpbmcsIENvbmRpdGlvbk9iamVjdFtdPixcblx0YklzRkxQVmFsdWVQcmVzZW50PzogYm9vbGVhbixcblx0YlNlbWFudGljRGF0ZVJhbmdlPzogYm9vbGVhbixcblx0b1ZpZXdEYXRhPzogb2JqZWN0XG4pIHtcblx0bGV0IGFOYXZPYmplY3ROYW1lcyA9IHNTZWxlY3RPcHRpb24uc3BsaXQoXCIuXCIpO1xuXHQvLyBFZzogXCJTYWxlc09yZGVyTWFuYWdlLl9JdGVtLl9NYXRlcmlhbC5NYXRlcmlhbFwiIG9yIFwiX0l0ZW0uTWF0ZXJpYWxcIlxuXHRpZiAoYC8ke3NTZWxlY3RPcHRpb24ucmVwbGFjZUFsbChcIi5cIiwgXCIvXCIpfWAuc3RhcnRzV2l0aChzTWFpbkVudGl0eVNldFBhdGgpKSB7XG5cdFx0Y29uc3Qgc0Z1bGxQYXRoID0gYC8ke3NTZWxlY3RPcHRpb259YC5yZXBsYWNlQWxsKFwiLlwiLCBcIi9cIiksXG5cdFx0XHRzTmF2UGF0aCA9IHNGdWxsUGF0aC5yZXBsYWNlKGAke3NNYWluRW50aXR5U2V0UGF0aH0vYCwgXCJcIik7XG5cdFx0YU5hdk9iamVjdE5hbWVzID0gc05hdlBhdGguc3BsaXQoXCIvXCIpO1xuXHR9XG5cdGxldCBzQ29uZGl0aW9uUGF0aCA9IFwiXCI7XG5cdGNvbnN0IHNQcm9wZXJ0eU5hbWUgPSBhTmF2T2JqZWN0TmFtZXNbYU5hdk9iamVjdE5hbWVzLmxlbmd0aCAtIDFdOyAvLyBNYXRlcmlhbCBmcm9tIFNhbGVzT3JkZXJNYW5hZ2UuX0l0ZW0uTWF0ZXJpYWxcblx0Zm9yIChsZXQgaSA9IDA7IGkgPCBhTmF2T2JqZWN0TmFtZXMubGVuZ3RoIC0gMTsgaSsrKSB7XG5cdFx0aWYgKG9NZXRhTW9kZWxDb250ZXh0LmdldE9iamVjdChgJHtzTWFpbkVudGl0eVNldFBhdGh9LyR7YU5hdk9iamVjdE5hbWVzW2ldLnJlcGxhY2UoXCJQX1wiLCBcIlwiKX1gKS4kaXNDb2xsZWN0aW9uKSB7XG5cdFx0XHRzQ29uZGl0aW9uUGF0aCA9IGAke3NDb25kaXRpb25QYXRoICsgYU5hdk9iamVjdE5hbWVzW2ldfSovYDsgLy8gX0l0ZW0qLyBpbiBjYXNlIG9mIDE6biBjYXJkaW5hbGl0eVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRzQ29uZGl0aW9uUGF0aCA9IGAke3NDb25kaXRpb25QYXRoICsgYU5hdk9iamVjdE5hbWVzW2ldfS9gOyAvLyBfSXRlbS8gaW4gY2FzZSBvZiAxOjEgY2FyZGluYWxpdHlcblx0XHR9XG5cdFx0c01haW5FbnRpdHlTZXRQYXRoID0gYCR7c01haW5FbnRpdHlTZXRQYXRofS8ke2FOYXZPYmplY3ROYW1lc1tpXX1gO1xuXHR9XG5cdGNvbnN0IHNOYXZQcm9wZXJ0eVBhdGggPSBzRnVsbENvbnRleHRQYXRoLnNsaWNlKDAsIHNGdWxsQ29udGV4dFBhdGgubGFzdEluZGV4T2YoXCIvXCIpKSxcblx0XHRvVmFsaWRQcm9wZXJ0aWVzID0gQ29tbW9uVXRpbHMuZ2V0Q29udGV4dFBhdGhQcm9wZXJ0aWVzKG9NZXRhTW9kZWxDb250ZXh0LCBzTmF2UHJvcGVydHlQYXRoKSxcblx0XHRhU2VsZWN0T3B0aW9uc1Byb3BlcnR5TmFtZXMgPSBvU2VsZWN0aW9uVmFyaWFudC5nZXRTZWxlY3RPcHRpb25zUHJvcGVydHlOYW1lcygpO1xuXHRsZXQgc1NlbGVjdE9wdGlvbk5hbWUgPSBzUHJvcGVydHlOYW1lO1xuXHRpZiAob1ZhbGlkUHJvcGVydGllc1tzUHJvcGVydHlOYW1lXSkge1xuXHRcdHNTZWxlY3RPcHRpb25OYW1lID0gc1Byb3BlcnR5TmFtZTtcblx0fSBlbHNlIGlmIChzUHJvcGVydHlOYW1lLnN0YXJ0c1dpdGgoXCJQX1wiKSAmJiBvVmFsaWRQcm9wZXJ0aWVzW3NQcm9wZXJ0eU5hbWUucmVwbGFjZShcIlBfXCIsIFwiXCIpXSkge1xuXHRcdHNTZWxlY3RPcHRpb25OYW1lID0gc1Byb3BlcnR5TmFtZS5yZXBsYWNlKFwiUF9cIiwgXCJcIik7XG5cdH0gZWxzZSBpZiAob1ZhbGlkUHJvcGVydGllc1tgUF8ke3NQcm9wZXJ0eU5hbWV9YF0gJiYgYVNlbGVjdE9wdGlvbnNQcm9wZXJ0eU5hbWVzLmluY2x1ZGVzKGBQXyR7c1Byb3BlcnR5TmFtZX1gKSkge1xuXHRcdHNTZWxlY3RPcHRpb25OYW1lID0gYFBfJHtzUHJvcGVydHlOYW1lfWA7XG5cdH1cblx0aWYgKHNQcm9wZXJ0eU5hbWUuc3RhcnRzV2l0aChcIlBfXCIpICYmIG9Db25kaXRpb25zW3NDb25kaXRpb25QYXRoICsgc1NlbGVjdE9wdGlvbk5hbWVdKSB7XG5cdFx0Ly8gaWYgdGhlcmUgaXMgbm8gU2FsZXNPcmRlck1hbmFnZS5fSXRlbS5NYXRlcmlhbCB5ZXQgaW4gdGhlIG9Db25kaXRpb25zXG5cdH0gZWxzZSBpZiAoIXNQcm9wZXJ0eU5hbWUuc3RhcnRzV2l0aChcIlBfXCIpICYmIG9Db25kaXRpb25zW3NDb25kaXRpb25QYXRoICsgc1NlbGVjdE9wdGlvbk5hbWVdKSB7XG5cdFx0ZGVsZXRlIG9Db25kaXRpb25zW3NDb25kaXRpb25QYXRoICsgc1NlbGVjdE9wdGlvbk5hbWVdO1xuXHRcdGFkZFNlbGVjdE9wdGlvbnNUb0NvbmRpdGlvbnMoXG5cdFx0XHRzTmF2UHJvcGVydHlQYXRoLFxuXHRcdFx0b1NlbGVjdGlvblZhcmlhbnQsXG5cdFx0XHRzU2VsZWN0T3B0aW9uLFxuXHRcdFx0b0NvbmRpdGlvbnMsXG5cdFx0XHRzQ29uZGl0aW9uUGF0aCxcblx0XHRcdHNTZWxlY3RPcHRpb25OYW1lLFxuXHRcdFx0b1ZhbGlkUHJvcGVydGllcyxcblx0XHRcdG9NZXRhTW9kZWxDb250ZXh0LFxuXHRcdFx0ZmFsc2UsXG5cdFx0XHRiSXNGTFBWYWx1ZVByZXNlbnQsXG5cdFx0XHRiU2VtYW50aWNEYXRlUmFuZ2UsXG5cdFx0XHRvVmlld0RhdGFcblx0XHQpO1xuXHR9IGVsc2Uge1xuXHRcdGFkZFNlbGVjdE9wdGlvbnNUb0NvbmRpdGlvbnMoXG5cdFx0XHRzTmF2UHJvcGVydHlQYXRoLFxuXHRcdFx0b1NlbGVjdGlvblZhcmlhbnQsXG5cdFx0XHRzU2VsZWN0T3B0aW9uLFxuXHRcdFx0b0NvbmRpdGlvbnMsXG5cdFx0XHRzQ29uZGl0aW9uUGF0aCxcblx0XHRcdHNTZWxlY3RPcHRpb25OYW1lLFxuXHRcdFx0b1ZhbGlkUHJvcGVydGllcyxcblx0XHRcdG9NZXRhTW9kZWxDb250ZXh0LFxuXHRcdFx0ZmFsc2UsXG5cdFx0XHRiSXNGTFBWYWx1ZVByZXNlbnQsXG5cdFx0XHRiU2VtYW50aWNEYXRlUmFuZ2UsXG5cdFx0XHRvVmlld0RhdGFcblx0XHQpO1xuXHR9XG59XG5cbmZ1bmN0aW9uIGFkZFBhZ2VDb250ZXh0VG9TZWxlY3Rpb25WYXJpYW50KG9TZWxlY3Rpb25WYXJpYW50OiBTZWxlY3Rpb25WYXJpYW50LCBtUGFnZUNvbnRleHQ6IHVua25vd25bXSwgb1ZpZXc6IFZpZXcpIHtcblx0Y29uc3Qgb0FwcENvbXBvbmVudCA9IENvbW1vblV0aWxzLmdldEFwcENvbXBvbmVudChvVmlldyk7XG5cdGNvbnN0IG9OYXZpZ2F0aW9uU2VydmljZSA9IG9BcHBDb21wb25lbnQuZ2V0TmF2aWdhdGlvblNlcnZpY2UoKTtcblx0cmV0dXJuIG9OYXZpZ2F0aW9uU2VydmljZS5taXhBdHRyaWJ1dGVzQW5kU2VsZWN0aW9uVmFyaWFudChtUGFnZUNvbnRleHQsIG9TZWxlY3Rpb25WYXJpYW50LnRvSlNPTlN0cmluZygpKTtcbn1cblxuZnVuY3Rpb24gYWRkRXh0ZXJuYWxTdGF0ZUZpbHRlcnNUb1NlbGVjdGlvblZhcmlhbnQoXG5cdG9TZWxlY3Rpb25WYXJpYW50OiBTZWxlY3Rpb25WYXJpYW50LFxuXHRtRmlsdGVyczoge1xuXHRcdGZpbHRlckNvbmRpdGlvbnM6IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIENvbmRpdGlvbk9iamVjdD4+O1xuXHRcdGZpbHRlckNvbmRpdGlvbnNXaXRob3V0Q29uZmxpY3Q6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG5cdH0sXG5cdG9UYXJnZXRJbmZvOiB7XG5cdFx0cHJvcGVydGllc1dpdGhvdXRDb25mbGljdD86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG5cdH0sXG5cdG9GaWx0ZXJCYXI/OiBGaWx0ZXJCYXJcbikge1xuXHRsZXQgc0ZpbHRlcjogc3RyaW5nO1xuXHRjb25zdCBmbkdldFNpZ25BbmRPcHRpb24gPSBmdW5jdGlvbiAoc09wZXJhdG9yOiBzdHJpbmcsIHNMb3dWYWx1ZTogc3RyaW5nLCBzSGlnaFZhbHVlOiBzdHJpbmcpIHtcblx0XHRjb25zdCBvU2VsZWN0T3B0aW9uU3RhdGUgPSB7XG5cdFx0XHRvcHRpb246IFwiXCIsXG5cdFx0XHRzaWduOiBcIklcIixcblx0XHRcdGxvdzogc0xvd1ZhbHVlLFxuXHRcdFx0aGlnaDogc0hpZ2hWYWx1ZVxuXHRcdH07XG5cdFx0c3dpdGNoIChzT3BlcmF0b3IpIHtcblx0XHRcdGNhc2UgXCJDb250YWluc1wiOlxuXHRcdFx0XHRvU2VsZWN0T3B0aW9uU3RhdGUub3B0aW9uID0gXCJDUFwiO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgXCJTdGFydHNXaXRoXCI6XG5cdFx0XHRcdG9TZWxlY3RPcHRpb25TdGF0ZS5vcHRpb24gPSBcIkNQXCI7XG5cdFx0XHRcdG9TZWxlY3RPcHRpb25TdGF0ZS5sb3cgKz0gXCIqXCI7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSBcIkVuZHNXaXRoXCI6XG5cdFx0XHRcdG9TZWxlY3RPcHRpb25TdGF0ZS5vcHRpb24gPSBcIkNQXCI7XG5cdFx0XHRcdG9TZWxlY3RPcHRpb25TdGF0ZS5sb3cgPSBgKiR7b1NlbGVjdE9wdGlvblN0YXRlLmxvd31gO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgXCJCVFwiOlxuXHRcdFx0Y2FzZSBcIkxFXCI6XG5cdFx0XHRjYXNlIFwiTFRcIjpcblx0XHRcdGNhc2UgXCJHVFwiOlxuXHRcdFx0Y2FzZSBcIk5FXCI6XG5cdFx0XHRjYXNlIFwiRVFcIjpcblx0XHRcdFx0b1NlbGVjdE9wdGlvblN0YXRlLm9wdGlvbiA9IHNPcGVyYXRvcjtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFwiREFURVwiOlxuXHRcdFx0XHRvU2VsZWN0T3B0aW9uU3RhdGUub3B0aW9uID0gXCJFUVwiO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgXCJEQVRFUkFOR0VcIjpcblx0XHRcdFx0b1NlbGVjdE9wdGlvblN0YXRlLm9wdGlvbiA9IFwiQlRcIjtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFwiRlJPTVwiOlxuXHRcdFx0XHRvU2VsZWN0T3B0aW9uU3RhdGUub3B0aW9uID0gXCJHRVwiO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgXCJUT1wiOlxuXHRcdFx0XHRvU2VsZWN0T3B0aW9uU3RhdGUub3B0aW9uID0gXCJMRVwiO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgXCJFRVFcIjpcblx0XHRcdFx0b1NlbGVjdE9wdGlvblN0YXRlLm9wdGlvbiA9IFwiRVFcIjtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFwiRW1wdHlcIjpcblx0XHRcdFx0b1NlbGVjdE9wdGlvblN0YXRlLm9wdGlvbiA9IFwiRVFcIjtcblx0XHRcdFx0b1NlbGVjdE9wdGlvblN0YXRlLmxvdyA9IFwiXCI7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSBcIk5vdENvbnRhaW5zXCI6XG5cdFx0XHRcdG9TZWxlY3RPcHRpb25TdGF0ZS5vcHRpb24gPSBcIkNQXCI7XG5cdFx0XHRcdG9TZWxlY3RPcHRpb25TdGF0ZS5zaWduID0gXCJFXCI7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSBcIk5PVEJUXCI6XG5cdFx0XHRcdG9TZWxlY3RPcHRpb25TdGF0ZS5vcHRpb24gPSBcIkJUXCI7XG5cdFx0XHRcdG9TZWxlY3RPcHRpb25TdGF0ZS5zaWduID0gXCJFXCI7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSBcIk5vdFN0YXJ0c1dpdGhcIjpcblx0XHRcdFx0b1NlbGVjdE9wdGlvblN0YXRlLm9wdGlvbiA9IFwiQ1BcIjtcblx0XHRcdFx0b1NlbGVjdE9wdGlvblN0YXRlLmxvdyArPSBcIipcIjtcblx0XHRcdFx0b1NlbGVjdE9wdGlvblN0YXRlLnNpZ24gPSBcIkVcIjtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFwiTm90RW5kc1dpdGhcIjpcblx0XHRcdFx0b1NlbGVjdE9wdGlvblN0YXRlLm9wdGlvbiA9IFwiQ1BcIjtcblx0XHRcdFx0b1NlbGVjdE9wdGlvblN0YXRlLmxvdyA9IGAqJHtvU2VsZWN0T3B0aW9uU3RhdGUubG93fWA7XG5cdFx0XHRcdG9TZWxlY3RPcHRpb25TdGF0ZS5zaWduID0gXCJFXCI7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSBcIk5vdEVtcHR5XCI6XG5cdFx0XHRcdG9TZWxlY3RPcHRpb25TdGF0ZS5vcHRpb24gPSBcIk5FXCI7XG5cdFx0XHRcdG9TZWxlY3RPcHRpb25TdGF0ZS5sb3cgPSBcIlwiO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgXCJOT1RMRVwiOlxuXHRcdFx0XHRvU2VsZWN0T3B0aW9uU3RhdGUub3B0aW9uID0gXCJMRVwiO1xuXHRcdFx0XHRvU2VsZWN0T3B0aW9uU3RhdGUuc2lnbiA9IFwiRVwiO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgXCJOT1RHRVwiOlxuXHRcdFx0XHRvU2VsZWN0T3B0aW9uU3RhdGUub3B0aW9uID0gXCJHRVwiO1xuXHRcdFx0XHRvU2VsZWN0T3B0aW9uU3RhdGUuc2lnbiA9IFwiRVwiO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgXCJOT1RMVFwiOlxuXHRcdFx0XHRvU2VsZWN0T3B0aW9uU3RhdGUub3B0aW9uID0gXCJMVFwiO1xuXHRcdFx0XHRvU2VsZWN0T3B0aW9uU3RhdGUuc2lnbiA9IFwiRVwiO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgXCJOT1RHVFwiOlxuXHRcdFx0XHRvU2VsZWN0T3B0aW9uU3RhdGUub3B0aW9uID0gXCJHVFwiO1xuXHRcdFx0XHRvU2VsZWN0T3B0aW9uU3RhdGUuc2lnbiA9IFwiRVwiO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdExvZy53YXJuaW5nKGAke3NPcGVyYXRvcn0gaXMgbm90IHN1cHBvcnRlZC4gJHtzRmlsdGVyfSBjb3VsZCBub3QgYmUgYWRkZWQgdG8gdGhlIG5hdmlnYXRpb24gY29udGV4dGApO1xuXHRcdH1cblx0XHRyZXR1cm4gb1NlbGVjdE9wdGlvblN0YXRlO1xuXHR9O1xuXHRjb25zdCBvRmlsdGVyQ29uZGl0aW9ucyA9IG1GaWx0ZXJzLmZpbHRlckNvbmRpdGlvbnM7XG5cdGNvbnN0IG9GaWx0ZXJzV2l0aG91dENvbmZsaWN0ID0gbUZpbHRlcnMuZmlsdGVyQ29uZGl0aW9uc1dpdGhvdXRDb25mbGljdCA/IG1GaWx0ZXJzLmZpbHRlckNvbmRpdGlvbnNXaXRob3V0Q29uZmxpY3QgOiB7fTtcblx0Y29uc3Qgb1RhYmxlUHJvcGVydGllc1dpdGhvdXRDb25mbGljdCA9IG9UYXJnZXRJbmZvLnByb3BlcnRpZXNXaXRob3V0Q29uZmxpY3QgPyBvVGFyZ2V0SW5mby5wcm9wZXJ0aWVzV2l0aG91dENvbmZsaWN0IDoge307XG5cdGNvbnN0IGFkZEZpbHRlcnNUb1NlbGVjdGlvblZhcmlhbnQgPSBmdW5jdGlvbiAoc2VsZWN0aW9uVmFyaWFudDogU2VsZWN0aW9uVmFyaWFudCwgc0ZpbHRlck5hbWU6IHN0cmluZywgc1BhdGg/OiBzdHJpbmcpIHtcblx0XHRjb25zdCBhQ29uZGl0aW9ucyA9IG9GaWx0ZXJDb25kaXRpb25zW3NGaWx0ZXJOYW1lXTtcblx0XHRjb25zdCBvUHJvcGVydHlJbmZvID0gb0ZpbHRlckJhciAmJiBvRmlsdGVyQmFyLmdldFByb3BlcnR5SGVscGVyKCkuZ2V0UHJvcGVydHkoc0ZpbHRlck5hbWUpO1xuXHRcdGNvbnN0IG9UeXBlQ29uZmlnID0gb1Byb3BlcnR5SW5mbz8udHlwZUNvbmZpZztcblx0XHRjb25zdCBvVHlwZVV0aWwgPSBvRmlsdGVyQmFyICYmIG9GaWx0ZXJCYXIuZ2V0Q29udHJvbERlbGVnYXRlKCkuZ2V0VHlwZVV0aWwoKTtcblxuXHRcdGZvciAoY29uc3QgaXRlbSBpbiBhQ29uZGl0aW9ucykge1xuXHRcdFx0Y29uc3Qgb0NvbmRpdGlvbiA9IGFDb25kaXRpb25zW2l0ZW1dO1xuXG5cdFx0XHRsZXQgb3B0aW9uOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBcIlwiLFxuXHRcdFx0XHRzaWduID0gXCJJXCIsXG5cdFx0XHRcdGxvdyA9IFwiXCIsXG5cdFx0XHRcdGhpZ2ggPSBudWxsLFxuXHRcdFx0XHRzZW1hbnRpY0RhdGVzO1xuXG5cdFx0XHRjb25zdCBvT3BlcmF0b3IgPSBGaWx0ZXJPcGVyYXRvclV0aWwuZ2V0T3BlcmF0b3Iob0NvbmRpdGlvbi5vcGVyYXRvcik7XG5cdFx0XHRpZiAob09wZXJhdG9yIGluc3RhbmNlb2YgUmFuZ2VPcGVyYXRvcikge1xuXHRcdFx0XHRzZW1hbnRpY0RhdGVzID0gQ29tbW9uVXRpbHMuY3JlYXRlU2VtYW50aWNEYXRlc0Zyb21Db25kaXRpb25zKG9Db25kaXRpb24pO1xuXHRcdFx0XHQvLyBoYW5kbGluZyBvZiBEYXRlIFJhbmdlT3BlcmF0b3JzXG5cdFx0XHRcdGNvbnN0IG9Nb2RlbEZpbHRlciA9IG9PcGVyYXRvci5nZXRNb2RlbEZpbHRlcihcblx0XHRcdFx0XHRvQ29uZGl0aW9uLFxuXHRcdFx0XHRcdHNGaWx0ZXJOYW1lLFxuXHRcdFx0XHRcdG9UeXBlQ29uZmlnPy50eXBlSW5zdGFuY2UsXG5cdFx0XHRcdFx0ZmFsc2UsXG5cdFx0XHRcdFx0b1R5cGVDb25maWc/LmJhc2VUeXBlXG5cdFx0XHRcdCk7XG5cdFx0XHRcdGlmICghb01vZGVsRmlsdGVyPy5nZXRGaWx0ZXJzKCkgJiYgIW9Nb2RlbEZpbHRlcj8uZ2V0RmlsdGVycygpPy5sZW5ndGgpIHtcblx0XHRcdFx0XHRzaWduID0gb09wZXJhdG9yLmV4Y2x1ZGUgPyBcIkVcIiA6IFwiSVwiO1xuXHRcdFx0XHRcdGxvdyA9IG9UeXBlVXRpbC5leHRlcm5hbGl6ZVZhbHVlKG9Nb2RlbEZpbHRlci5nZXRWYWx1ZTEoKSwgb1R5cGVDb25maWcudHlwZUluc3RhbmNlKTtcblx0XHRcdFx0XHRoaWdoID0gb1R5cGVVdGlsLmV4dGVybmFsaXplVmFsdWUob01vZGVsRmlsdGVyLmdldFZhbHVlMigpLCBvVHlwZUNvbmZpZy50eXBlSW5zdGFuY2UpO1xuXHRcdFx0XHRcdG9wdGlvbiA9IG9Nb2RlbEZpbHRlci5nZXRPcGVyYXRvcigpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCBhU2VtYW50aWNEYXRlT3BzRXh0ID0gU2VtYW50aWNEYXRlT3BlcmF0b3JzLmdldFN1cHBvcnRlZE9wZXJhdGlvbnMoKTtcblx0XHRcdFx0aWYgKGFTZW1hbnRpY0RhdGVPcHNFeHQuaW5jbHVkZXMob0NvbmRpdGlvbj8ub3BlcmF0b3IpKSB7XG5cdFx0XHRcdFx0c2VtYW50aWNEYXRlcyA9IENvbW1vblV0aWxzLmNyZWF0ZVNlbWFudGljRGF0ZXNGcm9tQ29uZGl0aW9ucyhvQ29uZGl0aW9uKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb25zdCB2YWx1ZTEgPSAob0NvbmRpdGlvbi52YWx1ZXNbMF0gJiYgb0NvbmRpdGlvbi52YWx1ZXNbMF0udG9TdHJpbmcoKSkgfHwgXCJcIjtcblx0XHRcdFx0Y29uc3QgdmFsdWUyID0gKG9Db25kaXRpb24udmFsdWVzWzFdICYmIG9Db25kaXRpb24udmFsdWVzWzFdLnRvU3RyaW5nKCkpIHx8IG51bGw7XG5cdFx0XHRcdGNvbnN0IG9TZWxlY3RPcHRpb24gPSBmbkdldFNpZ25BbmRPcHRpb24ob0NvbmRpdGlvbi5vcGVyYXRvciwgdmFsdWUxLCB2YWx1ZTIpO1xuXHRcdFx0XHRzaWduID0gb09wZXJhdG9yPy5leGNsdWRlID8gXCJFXCIgOiBcIklcIjtcblx0XHRcdFx0bG93ID0gb1NlbGVjdE9wdGlvbj8ubG93O1xuXHRcdFx0XHRoaWdoID0gb1NlbGVjdE9wdGlvbj8uaGlnaDtcblx0XHRcdFx0b3B0aW9uID0gb1NlbGVjdE9wdGlvbj8ub3B0aW9uO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAob3B0aW9uICYmIHNlbWFudGljRGF0ZXMpIHtcblx0XHRcdFx0c2VsZWN0aW9uVmFyaWFudC5hZGRTZWxlY3RPcHRpb24oc1BhdGggPyBzUGF0aCA6IHNGaWx0ZXJOYW1lLCBzaWduLCBvcHRpb24sIGxvdywgaGlnaCwgdW5kZWZpbmVkLCBzZW1hbnRpY0RhdGVzKTtcblx0XHRcdH0gZWxzZSBpZiAob3B0aW9uKSB7XG5cdFx0XHRcdHNlbGVjdGlvblZhcmlhbnQuYWRkU2VsZWN0T3B0aW9uKHNQYXRoID8gc1BhdGggOiBzRmlsdGVyTmFtZSwgc2lnbiwgb3B0aW9uLCBsb3csIGhpZ2gpO1xuXHRcdFx0fVxuXHRcdH1cblx0fTtcblxuXHRmb3IgKHNGaWx0ZXIgaW4gb0ZpbHRlckNvbmRpdGlvbnMpIHtcblx0XHQvLyBvbmx5IGFkZCB0aGUgZmlsdGVyIHZhbHVlcyBpZiBpdCBpcyBub3QgYWxyZWFkeSBwcmVzZW50IGluIHRoZSBTViBhbHJlYWR5XG5cdFx0aWYgKCFvU2VsZWN0aW9uVmFyaWFudC5nZXRTZWxlY3RPcHRpb24oc0ZpbHRlcikpIHtcblx0XHRcdC8vIFRPRE8gOiBjdXN0b20gZmlsdGVycyBzaG91bGQgYmUgaWdub3JlZCBtb3JlIGdlbmVyaWNhbGx5XG5cdFx0XHRpZiAoc0ZpbHRlciA9PT0gXCIkZWRpdFN0YXRlXCIpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cdFx0XHRhZGRGaWx0ZXJzVG9TZWxlY3Rpb25WYXJpYW50KG9TZWxlY3Rpb25WYXJpYW50LCBzRmlsdGVyKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0aWYgKG9UYWJsZVByb3BlcnRpZXNXaXRob3V0Q29uZmxpY3QgJiYgc0ZpbHRlciBpbiBvVGFibGVQcm9wZXJ0aWVzV2l0aG91dENvbmZsaWN0KSB7XG5cdFx0XHRcdGFkZEZpbHRlcnNUb1NlbGVjdGlvblZhcmlhbnQob1NlbGVjdGlvblZhcmlhbnQsIHNGaWx0ZXIsIG9UYWJsZVByb3BlcnRpZXNXaXRob3V0Q29uZmxpY3Rbc0ZpbHRlcl0pO1xuXHRcdFx0fVxuXHRcdFx0Ly8gaWYgcHJvcGVydHkgd2FzIHdpdGhvdXQgY29uZmxpY3QgaW4gcGFnZSBjb250ZXh0IHRoZW4gYWRkIHBhdGggZnJvbSBwYWdlIGNvbnRleHQgdG8gU1Zcblx0XHRcdGlmIChzRmlsdGVyIGluIG9GaWx0ZXJzV2l0aG91dENvbmZsaWN0KSB7XG5cdFx0XHRcdGFkZEZpbHRlcnNUb1NlbGVjdGlvblZhcmlhbnQob1NlbGVjdGlvblZhcmlhbnQsIHNGaWx0ZXIsIG9GaWx0ZXJzV2l0aG91dENvbmZsaWN0W3NGaWx0ZXJdKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0cmV0dXJuIG9TZWxlY3Rpb25WYXJpYW50O1xufVxuXG5mdW5jdGlvbiBpc1N0aWNreUVkaXRNb2RlKG9Db250cm9sOiBDb250cm9sKSB7XG5cdGNvbnN0IGJJc1N0aWNreU1vZGUgPSBNb2RlbEhlbHBlci5pc1N0aWNreVNlc3Npb25TdXBwb3J0ZWQoKG9Db250cm9sLmdldE1vZGVsKCkgYXMgT0RhdGFNb2RlbCkuZ2V0TWV0YU1vZGVsKCkpO1xuXHRjb25zdCBiVUlFZGl0YWJsZSA9IG9Db250cm9sLmdldE1vZGVsKFwidWlcIikuZ2V0UHJvcGVydHkoXCIvaXNFZGl0YWJsZVwiKTtcblx0cmV0dXJuIGJJc1N0aWNreU1vZGUgJiYgYlVJRWRpdGFibGU7XG59XG5cbi8qKlxuICogQHBhcmFtIGFNYW5kYXRvcnlGaWx0ZXJGaWVsZHNcbiAqIEBwYXJhbSBvU2VsZWN0aW9uVmFyaWFudFxuICogQHBhcmFtIG9TZWxlY3Rpb25WYXJpYW50RGVmYXVsdHNcbiAqL1xuZnVuY3Rpb24gYWRkRGVmYXVsdERpc3BsYXlDdXJyZW5jeShcblx0YU1hbmRhdG9yeUZpbHRlckZpZWxkczogRXhwYW5kUGF0aFR5cGU8RWRtLlByb3BlcnR5UGF0aD5bXSxcblx0b1NlbGVjdGlvblZhcmlhbnQ6IFNlbGVjdGlvblZhcmlhbnQsXG5cdG9TZWxlY3Rpb25WYXJpYW50RGVmYXVsdHM6IFNlbGVjdGlvblZhcmlhbnRcbikge1xuXHRpZiAob1NlbGVjdGlvblZhcmlhbnQgJiYgYU1hbmRhdG9yeUZpbHRlckZpZWxkcyAmJiBhTWFuZGF0b3J5RmlsdGVyRmllbGRzLmxlbmd0aCkge1xuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgYU1hbmRhdG9yeUZpbHRlckZpZWxkcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0Y29uc3QgYVNWT3B0aW9uID0gb1NlbGVjdGlvblZhcmlhbnQuZ2V0U2VsZWN0T3B0aW9uKFwiRGlzcGxheUN1cnJlbmN5XCIpLFxuXHRcdFx0XHRhRGVmYXVsdFNWT3B0aW9uID0gb1NlbGVjdGlvblZhcmlhbnREZWZhdWx0cyAmJiBvU2VsZWN0aW9uVmFyaWFudERlZmF1bHRzLmdldFNlbGVjdE9wdGlvbihcIkRpc3BsYXlDdXJyZW5jeVwiKTtcblx0XHRcdGlmIChcblx0XHRcdFx0YU1hbmRhdG9yeUZpbHRlckZpZWxkc1tpXS4kUHJvcGVydHlQYXRoID09PSBcIkRpc3BsYXlDdXJyZW5jeVwiICYmXG5cdFx0XHRcdCghYVNWT3B0aW9uIHx8ICFhU1ZPcHRpb24ubGVuZ3RoKSAmJlxuXHRcdFx0XHRhRGVmYXVsdFNWT3B0aW9uICYmXG5cdFx0XHRcdGFEZWZhdWx0U1ZPcHRpb24ubGVuZ3RoXG5cdFx0XHQpIHtcblx0XHRcdFx0Y29uc3QgZGlzcGxheUN1cnJlbmN5U2VsZWN0T3B0aW9uID0gYURlZmF1bHRTVk9wdGlvblswXTtcblx0XHRcdFx0Y29uc3Qgc1NpZ24gPSBkaXNwbGF5Q3VycmVuY3lTZWxlY3RPcHRpb25bXCJTaWduXCJdO1xuXHRcdFx0XHRjb25zdCBzT3B0aW9uID0gZGlzcGxheUN1cnJlbmN5U2VsZWN0T3B0aW9uW1wiT3B0aW9uXCJdO1xuXHRcdFx0XHRjb25zdCBzTG93ID0gZGlzcGxheUN1cnJlbmN5U2VsZWN0T3B0aW9uW1wiTG93XCJdO1xuXHRcdFx0XHRjb25zdCBzSGlnaCA9IGRpc3BsYXlDdXJyZW5jeVNlbGVjdE9wdGlvbltcIkhpZ2hcIl07XG5cdFx0XHRcdG9TZWxlY3Rpb25WYXJpYW50LmFkZFNlbGVjdE9wdGlvbihcIkRpc3BsYXlDdXJyZW5jeVwiLCBzU2lnbiwgc09wdGlvbiwgc0xvdywgc0hpZ2gpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufVxuXG5mdW5jdGlvbiBnZXROb25Db21wdXRlZFZpc2libGVGaWVsZHMobWV0YU1vZGVsQ29udGV4dDogT0RhdGFNZXRhTW9kZWwsIHNQYXRoOiBzdHJpbmcsIG9WaWV3PzogVmlldykge1xuXHRjb25zdCBhVGVjaG5pY2FsS2V5cyA9IG1ldGFNb2RlbENvbnRleHQuZ2V0T2JqZWN0KGAke3NQYXRofS9gKS4kS2V5O1xuXHRjb25zdCBhTm9uQ29tcHV0ZWRWaXNpYmxlRmllbGRzOiB1bmtub3duW10gPSBbXTtcblx0Y29uc3QgYUltbXV0YWJsZVZpc2libGVGaWVsZHM6IHVua25vd25bXSA9IFtdO1xuXHRjb25zdCBvRW50aXR5VHlwZSA9IG1ldGFNb2RlbENvbnRleHQuZ2V0T2JqZWN0KGAke3NQYXRofS9gKTtcblx0Zm9yIChjb25zdCBpdGVtIGluIG9FbnRpdHlUeXBlKSB7XG5cdFx0aWYgKG9FbnRpdHlUeXBlW2l0ZW1dLiRraW5kICYmIG9FbnRpdHlUeXBlW2l0ZW1dLiRraW5kID09PSBcIlByb3BlcnR5XCIpIHtcblx0XHRcdGNvbnN0IG9Bbm5vdGF0aW9ucyA9IChtZXRhTW9kZWxDb250ZXh0LmdldE9iamVjdChgJHtzUGF0aH0vJHtpdGVtfUBgKSB8fCB7fSkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG5cdFx0XHRcdGJJc0tleSA9IGFUZWNobmljYWxLZXlzLmluZGV4T2YoaXRlbSkgPiAtMSxcblx0XHRcdFx0YklzSW1tdXRhYmxlID0gb0Fubm90YXRpb25zW1wiQE9yZy5PRGF0YS5Db3JlLlYxLkltbXV0YWJsZVwiXSxcblx0XHRcdFx0YklzTm9uQ29tcHV0ZWQgPSAhb0Fubm90YXRpb25zW1wiQE9yZy5PRGF0YS5Db3JlLlYxLkNvbXB1dGVkXCJdLFxuXHRcdFx0XHRiSXNWaXNpYmxlID0gIW9Bbm5vdGF0aW9uc1tcIkBjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5IaWRkZW5cIl0sXG5cdFx0XHRcdGJJc0NvbXB1dGVkRGVmYXVsdFZhbHVlID0gb0Fubm90YXRpb25zW1wiQE9yZy5PRGF0YS5Db3JlLlYxLkNvbXB1dGVkRGVmYXVsdFZhbHVlXCJdLFxuXHRcdFx0XHRiSXNLZXlDb21wdXRlZERlZmF1bHRWYWx1ZVdpdGhUZXh0ID1cblx0XHRcdFx0XHRiSXNLZXkgJiYgb0VudGl0eVR5cGVbaXRlbV0uJFR5cGUgPT09IFwiRWRtLkd1aWRcIlxuXHRcdFx0XHRcdFx0PyBiSXNDb21wdXRlZERlZmF1bHRWYWx1ZSAmJiBvQW5ub3RhdGlvbnNbXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLlRleHRcIl1cblx0XHRcdFx0XHRcdDogZmFsc2U7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdChiSXNLZXlDb21wdXRlZERlZmF1bHRWYWx1ZVdpdGhUZXh0IHx8IChiSXNLZXkgJiYgb0VudGl0eVR5cGVbaXRlbV0uJFR5cGUgIT09IFwiRWRtLkd1aWRcIikpICYmXG5cdFx0XHRcdGJJc05vbkNvbXB1dGVkICYmXG5cdFx0XHRcdGJJc1Zpc2libGVcblx0XHRcdCkge1xuXHRcdFx0XHRhTm9uQ29tcHV0ZWRWaXNpYmxlRmllbGRzLnB1c2goaXRlbSk7XG5cdFx0XHR9IGVsc2UgaWYgKGJJc0ltbXV0YWJsZSAmJiBiSXNOb25Db21wdXRlZCAmJiBiSXNWaXNpYmxlKSB7XG5cdFx0XHRcdGFJbW11dGFibGVWaXNpYmxlRmllbGRzLnB1c2goaXRlbSk7XG5cdFx0XHR9XG5cblx0XHRcdGlmICghYklzTm9uQ29tcHV0ZWQgJiYgYklzQ29tcHV0ZWREZWZhdWx0VmFsdWUgJiYgb1ZpZXcpIHtcblx0XHRcdFx0Y29uc3Qgb0RpYWdub3N0aWNzID0gZ2V0QXBwQ29tcG9uZW50KG9WaWV3KS5nZXREaWFnbm9zdGljcygpO1xuXHRcdFx0XHRjb25zdCBzTWVzc2FnZSA9IFwiQ29yZS5Db21wdXRlZERlZmF1bHRWYWx1ZSBpcyBpZ25vcmVkIGFzIENvcmUuQ29tcHV0ZWQgaXMgYWxyZWFkeSBzZXQgdG8gdHJ1ZVwiO1xuXHRcdFx0XHRvRGlhZ25vc3RpY3MuYWRkSXNzdWUoXG5cdFx0XHRcdFx0SXNzdWVDYXRlZ29yeS5Bbm5vdGF0aW9uLFxuXHRcdFx0XHRcdElzc3VlU2V2ZXJpdHkuTWVkaXVtLFxuXHRcdFx0XHRcdHNNZXNzYWdlLFxuXHRcdFx0XHRcdElzc3VlQ2F0ZWdvcnlUeXBlLFxuXHRcdFx0XHRcdElzc3VlQ2F0ZWdvcnlUeXBlPy5Bbm5vdGF0aW9ucz8uSWdub3JlZEFubm90YXRpb25cblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0Y29uc3QgYVJlcXVpcmVkUHJvcGVydGllcyA9IENvbW1vblV0aWxzLmdldFJlcXVpcmVkUHJvcGVydGllc0Zyb21JbnNlcnRSZXN0cmljdGlvbnMoc1BhdGgsIG1ldGFNb2RlbENvbnRleHQpO1xuXHRpZiAoYVJlcXVpcmVkUHJvcGVydGllcy5sZW5ndGgpIHtcblx0XHRhUmVxdWlyZWRQcm9wZXJ0aWVzLmZvckVhY2goZnVuY3Rpb24gKHNQcm9wZXJ0eTogc3RyaW5nKSB7XG5cdFx0XHRjb25zdCBvQW5ub3RhdGlvbnMgPSBtZXRhTW9kZWxDb250ZXh0LmdldE9iamVjdChgJHtzUGF0aH0vJHtzUHJvcGVydHl9QGApIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuXHRcdFx0XHRiSXNWaXNpYmxlID0gIW9Bbm5vdGF0aW9ucyB8fCAhb0Fubm90YXRpb25zW1wiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkhpZGRlblwiXTtcblx0XHRcdGlmIChiSXNWaXNpYmxlICYmIGFOb25Db21wdXRlZFZpc2libGVGaWVsZHMuaW5kZXhPZihzUHJvcGVydHkpID09PSAtMSAmJiBhSW1tdXRhYmxlVmlzaWJsZUZpZWxkcy5pbmRleE9mKHNQcm9wZXJ0eSkgPT09IC0xKSB7XG5cdFx0XHRcdGFOb25Db21wdXRlZFZpc2libGVGaWVsZHMucHVzaChzUHJvcGVydHkpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cdHJldHVybiBhTm9uQ29tcHV0ZWRWaXNpYmxlRmllbGRzLmNvbmNhdChhSW1tdXRhYmxlVmlzaWJsZUZpZWxkcyk7XG59XG5cbmZ1bmN0aW9uIGdldFJlcXVpcmVkUHJvcGVydGllcyhzUGF0aDogc3RyaW5nLCBtZXRhTW9kZWxDb250ZXh0OiBPRGF0YU1ldGFNb2RlbCwgYkNoZWNrVXBkYXRlUmVzdHJpY3Rpb25zID0gZmFsc2UpIHtcblx0Y29uc3QgYVJlcXVpcmVkUHJvcGVydGllczogc3RyaW5nW10gPSBbXTtcblx0bGV0IGFSZXF1aXJlZFByb3BlcnRpZXNXaXRoUGF0aHM6IHsgJFByb3BlcnR5UGF0aDogc3RyaW5nIH1bXSA9IFtdO1xuXHRjb25zdCBuYXZpZ2F0aW9uVGV4dCA9IFwiJE5hdmlnYXRpb25Qcm9wZXJ0eUJpbmRpbmdcIjtcblx0bGV0IG9FbnRpdHlTZXRBbm5vdGF0aW9ucztcblx0aWYgKHNQYXRoLmVuZHNXaXRoKFwiJFwiKSkge1xuXHRcdC8vIGlmIHNQYXRoIGNvbWVzIHdpdGggYSAkIGluIHRoZSBlbmQsIHJlbW92aW5nIGl0IGFzIGl0IGlzIG9mIG5vIHNpZ25pZmljYW5jZVxuXHRcdHNQYXRoID0gc1BhdGgucmVwbGFjZShcIi8kXCIsIFwiXCIpO1xuXHR9XG5cdGNvbnN0IGVudGl0eVR5cGVQYXRoUGFydHMgPSBzUGF0aC5yZXBsYWNlQWxsKFwiJTJGXCIsIFwiL1wiKS5zcGxpdChcIi9cIikuZmlsdGVyKE1vZGVsSGVscGVyLmZpbHRlck91dE5hdlByb3BCaW5kaW5nKTtcblx0Y29uc3QgZW50aXR5U2V0UGF0aCA9IE1vZGVsSGVscGVyLmdldEVudGl0eVNldFBhdGgoc1BhdGgsIG1ldGFNb2RlbENvbnRleHQpO1xuXHRjb25zdCBlbnRpdHlTZXRQYXRoUGFydHMgPSBlbnRpdHlTZXRQYXRoLnNwbGl0KFwiL1wiKS5maWx0ZXIoTW9kZWxIZWxwZXIuZmlsdGVyT3V0TmF2UHJvcEJpbmRpbmcpO1xuXHRjb25zdCBpc0NvbnRhaW5tZW50ID0gbWV0YU1vZGVsQ29udGV4dC5nZXRPYmplY3QoYC8ke2VudGl0eVR5cGVQYXRoUGFydHMuam9pbihcIi9cIil9LyRDb250YWluc1RhcmdldGApO1xuXHRjb25zdCBjb250YWlubWVudE5hdlBhdGggPSBpc0NvbnRhaW5tZW50ICYmIGVudGl0eVR5cGVQYXRoUGFydHNbZW50aXR5VHlwZVBhdGhQYXJ0cy5sZW5ndGggLSAxXTtcblxuXHQvL1Jlc3RyaWN0aW9ucyBkaXJlY3RseSBhdCBFbnRpdHkgU2V0XG5cdC8vZS5nLiBGUiBpbiBcIk5TLkVudGl0eUNvbnRhaW5lci9TYWxlc09yZGVyTWFuYWdlXCIgQ29udGV4dFBhdGg6IC9TYWxlc09yZGVyTWFuYWdlXG5cdGlmICghaXNDb250YWlubWVudCkge1xuXHRcdG9FbnRpdHlTZXRBbm5vdGF0aW9ucyA9IG1ldGFNb2RlbENvbnRleHQuZ2V0T2JqZWN0KGAke2VudGl0eVNldFBhdGh9QGApO1xuXHR9XG5cdGlmIChlbnRpdHlUeXBlUGF0aFBhcnRzLmxlbmd0aCA+IDEpIHtcblx0XHRjb25zdCBuYXZQYXRoID0gaXNDb250YWlubWVudCA/IGNvbnRhaW5tZW50TmF2UGF0aCA6IGVudGl0eVNldFBhdGhQYXJ0c1tlbnRpdHlTZXRQYXRoUGFydHMubGVuZ3RoIC0gMV07XG5cdFx0Y29uc3QgcGFyZW50RW50aXR5U2V0UGF0aCA9IGlzQ29udGFpbm1lbnQgPyBlbnRpdHlTZXRQYXRoIDogYC8ke2VudGl0eVNldFBhdGhQYXJ0cy5zbGljZSgwLCAtMSkuam9pbihgLyR7bmF2aWdhdGlvblRleHR9L2ApfWA7XG5cdFx0Ly9OYXZpZ2F0aW9uIHJlc3RyaWN0aW9uc1xuXHRcdC8vZS5nLiBQYXJlbnQgXCIvQ3VzdG9tZXJcIiB3aXRoIE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGg9XCJTZXRcIiBDb250ZXh0UGF0aDogQ3VzdG9tZXIvU2V0XG5cdFx0Y29uc3Qgb05hdlJlc3QgPSBDb21tb25VdGlscy5nZXROYXZpZ2F0aW9uUmVzdHJpY3Rpb25zKG1ldGFNb2RlbENvbnRleHQsIHBhcmVudEVudGl0eVNldFBhdGgsIG5hdlBhdGgucmVwbGFjZUFsbChcIiUyRlwiLCBcIi9cIikpO1xuXG5cdFx0aWYgKG9OYXZSZXN0ICE9PSB1bmRlZmluZWQgJiYgQ29tbW9uVXRpbHMuaGFzUmVzdHJpY3RlZFByb3BlcnRpZXNJbkFubm90YXRpb25zKG9OYXZSZXN0LCB0cnVlLCBiQ2hlY2tVcGRhdGVSZXN0cmljdGlvbnMpKSB7XG5cdFx0XHRhUmVxdWlyZWRQcm9wZXJ0aWVzV2l0aFBhdGhzID0gYkNoZWNrVXBkYXRlUmVzdHJpY3Rpb25zXG5cdFx0XHRcdD8gb05hdlJlc3RbXCJVcGRhdGVSZXN0cmljdGlvbnNcIl0hLlJlcXVpcmVkUHJvcGVydGllcyB8fCBbXVxuXHRcdFx0XHQ6IG9OYXZSZXN0W1wiSW5zZXJ0UmVzdHJpY3Rpb25zXCJdIS5SZXF1aXJlZFByb3BlcnRpZXMgfHwgW107XG5cdFx0fVxuXHRcdGlmIChcblx0XHRcdCghYVJlcXVpcmVkUHJvcGVydGllc1dpdGhQYXRocyB8fCAhYVJlcXVpcmVkUHJvcGVydGllc1dpdGhQYXRocy5sZW5ndGgpICYmXG5cdFx0XHRDb21tb25VdGlscy5oYXNSZXN0cmljdGVkUHJvcGVydGllc0luQW5ub3RhdGlvbnMob0VudGl0eVNldEFubm90YXRpb25zLCBmYWxzZSwgYkNoZWNrVXBkYXRlUmVzdHJpY3Rpb25zKVxuXHRcdCkge1xuXHRcdFx0YVJlcXVpcmVkUHJvcGVydGllc1dpdGhQYXRocyA9IENvbW1vblV0aWxzLmdldFJlcXVpcmVkUHJvcGVydGllc0Zyb21Bbm5vdGF0aW9ucyhcblx0XHRcdFx0b0VudGl0eVNldEFubm90YXRpb25zLFxuXHRcdFx0XHRiQ2hlY2tVcGRhdGVSZXN0cmljdGlvbnNcblx0XHRcdCk7XG5cdFx0fVxuXHR9IGVsc2UgaWYgKENvbW1vblV0aWxzLmhhc1Jlc3RyaWN0ZWRQcm9wZXJ0aWVzSW5Bbm5vdGF0aW9ucyhvRW50aXR5U2V0QW5ub3RhdGlvbnMsIGZhbHNlLCBiQ2hlY2tVcGRhdGVSZXN0cmljdGlvbnMpKSB7XG5cdFx0YVJlcXVpcmVkUHJvcGVydGllc1dpdGhQYXRocyA9IENvbW1vblV0aWxzLmdldFJlcXVpcmVkUHJvcGVydGllc0Zyb21Bbm5vdGF0aW9ucyhvRW50aXR5U2V0QW5ub3RhdGlvbnMsIGJDaGVja1VwZGF0ZVJlc3RyaWN0aW9ucyk7XG5cdH1cblx0YVJlcXVpcmVkUHJvcGVydGllc1dpdGhQYXRocy5mb3JFYWNoKGZ1bmN0aW9uIChvUmVxdWlyZWRQcm9wZXJ0eSkge1xuXHRcdGNvbnN0IHNQcm9wZXJ0eSA9IG9SZXF1aXJlZFByb3BlcnR5LiRQcm9wZXJ0eVBhdGg7XG5cdFx0YVJlcXVpcmVkUHJvcGVydGllcy5wdXNoKHNQcm9wZXJ0eSk7XG5cdH0pO1xuXHRyZXR1cm4gYVJlcXVpcmVkUHJvcGVydGllcztcbn1cblxuZnVuY3Rpb24gZ2V0UmVxdWlyZWRQcm9wZXJ0aWVzRnJvbUluc2VydFJlc3RyaWN0aW9ucyhzUGF0aDogc3RyaW5nLCBvTWV0YU1vZGVsQ29udGV4dDogT0RhdGFNZXRhTW9kZWwpIHtcblx0cmV0dXJuIENvbW1vblV0aWxzLmdldFJlcXVpcmVkUHJvcGVydGllcyhzUGF0aCwgb01ldGFNb2RlbENvbnRleHQpO1xufVxuXG5mdW5jdGlvbiBnZXRSZXF1aXJlZFByb3BlcnRpZXNGcm9tVXBkYXRlUmVzdHJpY3Rpb25zKHNQYXRoOiBzdHJpbmcsIG9NZXRhTW9kZWxDb250ZXh0OiBPRGF0YU1ldGFNb2RlbCkge1xuXHRyZXR1cm4gQ29tbW9uVXRpbHMuZ2V0UmVxdWlyZWRQcm9wZXJ0aWVzKHNQYXRoLCBvTWV0YU1vZGVsQ29udGV4dCwgdHJ1ZSk7XG59XG5cbmZ1bmN0aW9uIGdldFJlcXVpcmVkUHJvcGVydGllc0Zyb21Bbm5vdGF0aW9ucyhvQW5ub3RhdGlvbnM6IE1ldGFNb2RlbEVudGl0eVNldEFubm90YXRpb24sIGJDaGVja1VwZGF0ZVJlc3RyaWN0aW9ucyA9IGZhbHNlKSB7XG5cdGlmIChiQ2hlY2tVcGRhdGVSZXN0cmljdGlvbnMpIHtcblx0XHRyZXR1cm4gb0Fubm90YXRpb25zW1wiQE9yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuVXBkYXRlUmVzdHJpY3Rpb25zXCJdPy5SZXF1aXJlZFByb3BlcnRpZXMgfHwgW107XG5cdH1cblx0cmV0dXJuIG9Bbm5vdGF0aW9uc1tcIkBPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLkluc2VydFJlc3RyaWN0aW9uc1wiXT8uUmVxdWlyZWRQcm9wZXJ0aWVzIHx8IFtdO1xufVxuXG5mdW5jdGlvbiBoYXNSZXN0cmljdGVkUHJvcGVydGllc0luQW5ub3RhdGlvbnMoXG5cdG9Bbm5vdGF0aW9uczogTWV0YU1vZGVsVHlwZTxOYXZpZ2F0aW9uUHJvcGVydHlSZXN0cmljdGlvblR5cGVzPiB8IE1ldGFNb2RlbEVudGl0eVNldEFubm90YXRpb24gfCB1bmRlZmluZWQsXG5cdGJJc05hdmlnYXRpb25SZXN0cmljdGlvbnMgPSBmYWxzZSxcblx0YkNoZWNrVXBkYXRlUmVzdHJpY3Rpb25zID0gZmFsc2Vcbikge1xuXHRpZiAoYklzTmF2aWdhdGlvblJlc3RyaWN0aW9ucykge1xuXHRcdGNvbnN0IG9OYXZBbm5vdGF0aW9ucyA9IG9Bbm5vdGF0aW9ucyBhcyBNZXRhTW9kZWxUeXBlPE5hdmlnYXRpb25Qcm9wZXJ0eVJlc3RyaWN0aW9uVHlwZXM+O1xuXHRcdGlmIChiQ2hlY2tVcGRhdGVSZXN0cmljdGlvbnMpIHtcblx0XHRcdHJldHVybiBvTmF2QW5ub3RhdGlvbnMgJiYgb05hdkFubm90YXRpb25zW1wiVXBkYXRlUmVzdHJpY3Rpb25zXCJdICYmIG9OYXZBbm5vdGF0aW9uc1tcIlVwZGF0ZVJlc3RyaWN0aW9uc1wiXS5SZXF1aXJlZFByb3BlcnRpZXNcblx0XHRcdFx0PyB0cnVlXG5cdFx0XHRcdDogZmFsc2U7XG5cdFx0fVxuXHRcdHJldHVybiBvTmF2QW5ub3RhdGlvbnMgJiYgb05hdkFubm90YXRpb25zW1wiSW5zZXJ0UmVzdHJpY3Rpb25zXCJdICYmIG9OYXZBbm5vdGF0aW9uc1tcIkluc2VydFJlc3RyaWN0aW9uc1wiXS5SZXF1aXJlZFByb3BlcnRpZXNcblx0XHRcdD8gdHJ1ZVxuXHRcdFx0OiBmYWxzZTtcblx0fSBlbHNlIGlmIChiQ2hlY2tVcGRhdGVSZXN0cmljdGlvbnMpIHtcblx0XHRjb25zdCBvRW50aXR5QW5ub3RhdGlvbiA9IG9Bbm5vdGF0aW9ucyBhcyBNZXRhTW9kZWxFbnRpdHlTZXRBbm5vdGF0aW9uO1xuXHRcdHJldHVybiBvRW50aXR5QW5ub3RhdGlvbiAmJlxuXHRcdFx0b0VudGl0eUFubm90YXRpb25bXCJAT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5VcGRhdGVSZXN0cmljdGlvbnNcIl0gJiZcblx0XHRcdG9FbnRpdHlBbm5vdGF0aW9uW1wiQE9yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuVXBkYXRlUmVzdHJpY3Rpb25zXCJdLlJlcXVpcmVkUHJvcGVydGllc1xuXHRcdFx0PyB0cnVlXG5cdFx0XHQ6IGZhbHNlO1xuXHR9XG5cdGNvbnN0IG9FbnRpdHlBbm5vdGF0aW9uID0gb0Fubm90YXRpb25zIGFzIE1ldGFNb2RlbEVudGl0eVNldEFubm90YXRpb247XG5cdHJldHVybiBvRW50aXR5QW5ub3RhdGlvbiAmJlxuXHRcdG9FbnRpdHlBbm5vdGF0aW9uW1wiQE9yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuSW5zZXJ0UmVzdHJpY3Rpb25zXCJdICYmXG5cdFx0b0VudGl0eUFubm90YXRpb25bXCJAT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5JbnNlcnRSZXN0cmljdGlvbnNcIl0uUmVxdWlyZWRQcm9wZXJ0aWVzXG5cdFx0PyB0cnVlXG5cdFx0OiBmYWxzZTtcbn1cblxudHlwZSBVc2VyRGVmYXVsdFBhcmFtZXRlciA9IHtcblx0JE5hbWU6IHN0cmluZztcblx0Z2V0UGF0aD8oKTogc3RyaW5nO1xufTtcbmFzeW5jIGZ1bmN0aW9uIHNldFVzZXJEZWZhdWx0cyhcblx0b0FwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LFxuXHRhUGFyYW1ldGVyczogVXNlckRlZmF1bHRQYXJhbWV0ZXJbXSxcblx0b01vZGVsOiBKU09OTW9kZWwgfCBPRGF0YVY0Q29udGV4dCxcblx0YklzQWN0aW9uOiBib29sZWFuLFxuXHRiSXNDcmVhdGU/OiBib29sZWFuLFxuXHRvQWN0aW9uRGVmYXVsdFZhbHVlcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbikge1xuXHRyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmU6IEZ1bmN0aW9uKSB7XG5cdFx0Y29uc3Qgb0NvbXBvbmVudERhdGEgPSBvQXBwQ29tcG9uZW50LmdldENvbXBvbmVudERhdGEoKSxcblx0XHRcdG9TdGFydHVwUGFyYW1ldGVycyA9IChvQ29tcG9uZW50RGF0YSAmJiBvQ29tcG9uZW50RGF0YS5zdGFydHVwUGFyYW1ldGVycykgfHwge30sXG5cdFx0XHRvU2hlbGxTZXJ2aWNlcyA9IG9BcHBDb21wb25lbnQuZ2V0U2hlbGxTZXJ2aWNlcygpO1xuXHRcdGlmICghb1NoZWxsU2VydmljZXMuaGFzVVNoZWxsKCkpIHtcblx0XHRcdGFQYXJhbWV0ZXJzLmZvckVhY2goZnVuY3Rpb24gKG9QYXJhbWV0ZXIpIHtcblx0XHRcdFx0Y29uc3Qgc1Byb3BlcnR5TmFtZSA9IGJJc0FjdGlvblxuXHRcdFx0XHRcdD8gYC8ke29QYXJhbWV0ZXIuJE5hbWV9YFxuXHRcdFx0XHRcdDogKG9QYXJhbWV0ZXIuZ2V0UGF0aD8uKCkuc2xpY2Uob1BhcmFtZXRlci5nZXRQYXRoKCkubGFzdEluZGV4T2YoXCIvXCIpICsgMSkgYXMgc3RyaW5nKTtcblx0XHRcdFx0Y29uc3Qgc1BhcmFtZXRlck5hbWUgPSBiSXNBY3Rpb24gPyBzUHJvcGVydHlOYW1lLnNsaWNlKDEpIDogc1Byb3BlcnR5TmFtZTtcblx0XHRcdFx0aWYgKG9BY3Rpb25EZWZhdWx0VmFsdWVzICYmIGJJc0NyZWF0ZSkge1xuXHRcdFx0XHRcdGlmIChvQWN0aW9uRGVmYXVsdFZhbHVlc1tzUGFyYW1ldGVyTmFtZV0pIHtcblx0XHRcdFx0XHRcdG9Nb2RlbC5zZXRQcm9wZXJ0eShzUHJvcGVydHlOYW1lLCBvQWN0aW9uRGVmYXVsdFZhbHVlc1tzUGFyYW1ldGVyTmFtZV0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIGlmIChvU3RhcnR1cFBhcmFtZXRlcnNbc1BhcmFtZXRlck5hbWVdKSB7XG5cdFx0XHRcdFx0b01vZGVsLnNldFByb3BlcnR5KHNQcm9wZXJ0eU5hbWUsIG9TdGFydHVwUGFyYW1ldGVyc1tzUGFyYW1ldGVyTmFtZV1bMF0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHRcdHJldHVybiByZXNvbHZlKHRydWUpO1xuXHRcdH1cblx0XHRyZXR1cm4gb1NoZWxsU2VydmljZXMuZ2V0U3RhcnR1cEFwcFN0YXRlKG9BcHBDb21wb25lbnQpLnRoZW4oZnVuY3Rpb24gKG9TdGFydHVwQXBwU3RhdGUpIHtcblx0XHRcdGNvbnN0IG9EYXRhID0gb1N0YXJ0dXBBcHBTdGF0ZT8uZ2V0RGF0YSgpIHx8IHt9LFxuXHRcdFx0XHRhRXh0ZW5kZWRQYXJhbWV0ZXJzID0gKG9EYXRhLnNlbGVjdGlvblZhcmlhbnQgJiYgb0RhdGEuc2VsZWN0aW9uVmFyaWFudC5TZWxlY3RPcHRpb25zKSB8fCBbXTtcblx0XHRcdGFQYXJhbWV0ZXJzLmZvckVhY2goZnVuY3Rpb24gKG9QYXJhbWV0ZXIpIHtcblx0XHRcdFx0Y29uc3Qgc1Byb3BlcnR5TmFtZSA9IGJJc0FjdGlvblxuXHRcdFx0XHRcdD8gYC8ke29QYXJhbWV0ZXIuJE5hbWV9YFxuXHRcdFx0XHRcdDogKG9QYXJhbWV0ZXIuZ2V0UGF0aD8uKCkuc2xpY2Uob1BhcmFtZXRlci5nZXRQYXRoKCkubGFzdEluZGV4T2YoXCIvXCIpICsgMSkgYXMgc3RyaW5nKTtcblx0XHRcdFx0Y29uc3Qgc1BhcmFtZXRlck5hbWUgPSBiSXNBY3Rpb24gPyBzUHJvcGVydHlOYW1lLnNsaWNlKDEpIDogc1Byb3BlcnR5TmFtZTtcblx0XHRcdFx0aWYgKG9BY3Rpb25EZWZhdWx0VmFsdWVzICYmIGJJc0NyZWF0ZSkge1xuXHRcdFx0XHRcdGlmIChvQWN0aW9uRGVmYXVsdFZhbHVlc1tzUGFyYW1ldGVyTmFtZV0pIHtcblx0XHRcdFx0XHRcdG9Nb2RlbC5zZXRQcm9wZXJ0eShzUHJvcGVydHlOYW1lLCBvQWN0aW9uRGVmYXVsdFZhbHVlc1tzUGFyYW1ldGVyTmFtZV0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIGlmIChvU3RhcnR1cFBhcmFtZXRlcnNbc1BhcmFtZXRlck5hbWVdKSB7XG5cdFx0XHRcdFx0b01vZGVsLnNldFByb3BlcnR5KHNQcm9wZXJ0eU5hbWUsIG9TdGFydHVwUGFyYW1ldGVyc1tzUGFyYW1ldGVyTmFtZV1bMF0pO1xuXHRcdFx0XHR9IGVsc2UgaWYgKGFFeHRlbmRlZFBhcmFtZXRlcnMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdGZvciAoY29uc3QgaSBpbiBhRXh0ZW5kZWRQYXJhbWV0ZXJzKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBvRXh0ZW5kZWRQYXJhbWV0ZXIgPSBhRXh0ZW5kZWRQYXJhbWV0ZXJzW2ldO1xuXHRcdFx0XHRcdFx0aWYgKG9FeHRlbmRlZFBhcmFtZXRlci5Qcm9wZXJ0eU5hbWUgPT09IHNQYXJhbWV0ZXJOYW1lKSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IG9SYW5nZSA9IG9FeHRlbmRlZFBhcmFtZXRlci5SYW5nZXMubGVuZ3RoXG5cdFx0XHRcdFx0XHRcdFx0PyBvRXh0ZW5kZWRQYXJhbWV0ZXIuUmFuZ2VzW29FeHRlbmRlZFBhcmFtZXRlci5SYW5nZXMubGVuZ3RoIC0gMV1cblx0XHRcdFx0XHRcdFx0XHQ6IHVuZGVmaW5lZDtcblx0XHRcdFx0XHRcdFx0aWYgKG9SYW5nZSAmJiBvUmFuZ2UuU2lnbiA9PT0gXCJJXCIgJiYgb1JhbmdlLk9wdGlvbiA9PT0gXCJFUVwiKSB7XG5cdFx0XHRcdFx0XHRcdFx0b01vZGVsLnNldFByb3BlcnR5KHNQcm9wZXJ0eU5hbWUsIG9SYW5nZS5Mb3cpOyAvLyBoaWdoIGlzIGlnbm9yZWQgd2hlbiBPcHRpb249RVFcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0XHRyZXR1cm4gcmVzb2x2ZSh0cnVlKTtcblx0XHR9KTtcblx0fSk7XG59XG5leHBvcnQgdHlwZSBJbmJvdW5kUGFyYW1ldGVyID0ge1xuXHR1c2VGb3JDcmVhdGU6IGJvb2xlYW47XG59O1xuZnVuY3Rpb24gZ2V0QWRkaXRpb25hbFBhcmFtc0ZvckNyZWF0ZShcblx0b1N0YXJ0dXBQYXJhbWV0ZXJzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duW10+LFxuXHRvSW5ib3VuZFBhcmFtZXRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBJbmJvdW5kUGFyYW1ldGVyPlxuKSB7XG5cdGNvbnN0IG9JbmJvdW5kcyA9IG9JbmJvdW5kUGFyYW1ldGVycyxcblx0XHRhQ3JlYXRlUGFyYW1ldGVycyA9XG5cdFx0XHRvSW5ib3VuZHMgIT09IHVuZGVmaW5lZFxuXHRcdFx0XHQ/IE9iamVjdC5rZXlzKG9JbmJvdW5kcykuZmlsdGVyKGZ1bmN0aW9uIChzUGFyYW1ldGVyOiBzdHJpbmcpIHtcblx0XHRcdFx0XHRcdHJldHVybiBvSW5ib3VuZHNbc1BhcmFtZXRlcl0udXNlRm9yQ3JlYXRlO1xuXHRcdFx0XHQgIH0pXG5cdFx0XHRcdDogW107XG5cdGxldCBvUmV0O1xuXHRmb3IgKGxldCBpID0gMDsgaSA8IGFDcmVhdGVQYXJhbWV0ZXJzLmxlbmd0aDsgaSsrKSB7XG5cdFx0Y29uc3Qgc0NyZWF0ZVBhcmFtZXRlciA9IGFDcmVhdGVQYXJhbWV0ZXJzW2ldO1xuXHRcdGNvbnN0IGFWYWx1ZXMgPSBvU3RhcnR1cFBhcmFtZXRlcnMgJiYgb1N0YXJ0dXBQYXJhbWV0ZXJzW3NDcmVhdGVQYXJhbWV0ZXJdO1xuXHRcdGlmIChhVmFsdWVzICYmIGFWYWx1ZXMubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRvUmV0ID0gb1JldCB8fCBPYmplY3QuY3JlYXRlKG51bGwpO1xuXHRcdFx0b1JldFtzQ3JlYXRlUGFyYW1ldGVyXSA9IGFWYWx1ZXNbMF07XG5cdFx0fVxuXHR9XG5cdHJldHVybiBvUmV0O1xufVxudHlwZSBPdXRib3VuZFBhcmFtZXRlciA9IHtcblx0cGFyYW1ldGVyczogUmVjb3JkPHN0cmluZywgT3V0Ym91bmRQYXJhbWV0ZXJWYWx1ZT47XG5cdHNlbWFudGljT2JqZWN0Pzogc3RyaW5nO1xuXHRhY3Rpb24/OiBzdHJpbmc7XG59O1xudHlwZSBPdXRib3VuZFBhcmFtZXRlclZhbHVlID0ge1xuXHR2YWx1ZT86IHtcblx0XHR2YWx1ZT86IHN0cmluZztcblx0XHRmb3JtYXQ/OiBzdHJpbmc7XG5cdH07XG59O1xuZnVuY3Rpb24gZ2V0U2VtYW50aWNPYmplY3RNYXBwaW5nKG9PdXRib3VuZDogT3V0Ym91bmRQYXJhbWV0ZXIpIHtcblx0Y29uc3QgYVNlbWFudGljT2JqZWN0TWFwcGluZzogTWV0YU1vZGVsVHlwZTxTZW1hbnRpY09iamVjdE1hcHBpbmdUeXBlPltdID0gW107XG5cdGlmIChvT3V0Ym91bmQucGFyYW1ldGVycykge1xuXHRcdGNvbnN0IGFQYXJhbWV0ZXJzID0gT2JqZWN0LmtleXMob091dGJvdW5kLnBhcmFtZXRlcnMpIHx8IFtdO1xuXHRcdGlmIChhUGFyYW1ldGVycy5sZW5ndGggPiAwKSB7XG5cdFx0XHRhUGFyYW1ldGVycy5mb3JFYWNoKGZ1bmN0aW9uIChzUGFyYW06IHN0cmluZykge1xuXHRcdFx0XHRjb25zdCBvTWFwcGluZyA9IG9PdXRib3VuZC5wYXJhbWV0ZXJzW3NQYXJhbV07XG5cdFx0XHRcdGlmIChvTWFwcGluZy52YWx1ZSAmJiBvTWFwcGluZy52YWx1ZS52YWx1ZSAmJiBvTWFwcGluZy52YWx1ZS5mb3JtYXQgPT09IFwiYmluZGluZ1wiKSB7XG5cdFx0XHRcdFx0Ly8gdXNpbmcgdGhlIGZvcm1hdCBvZiBVSS5NYXBwaW5nXG5cdFx0XHRcdFx0Y29uc3Qgb1NlbWFudGljTWFwcGluZyA9IHtcblx0XHRcdFx0XHRcdExvY2FsUHJvcGVydHk6IHtcblx0XHRcdFx0XHRcdFx0JFByb3BlcnR5UGF0aDogb01hcHBpbmcudmFsdWUudmFsdWVcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRTZW1hbnRpY09iamVjdFByb3BlcnR5OiBzUGFyYW1cblx0XHRcdFx0XHR9O1xuXG5cdFx0XHRcdFx0aWYgKGFTZW1hbnRpY09iamVjdE1hcHBpbmcubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdFx0Ly8gVG8gY2hlY2sgaWYgdGhlIHNlbWFudGljT2JqZWN0IE1hcHBpbmcgaXMgZG9uZSBmb3IgdGhlIHNhbWUgbG9jYWwgcHJvcGVydHkgbW9yZSB0aGF0IG9uY2UgdGhlbiBmaXJzdCBvbmUgd2lsbCBiZSBjb25zaWRlcmVkXG5cdFx0XHRcdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGFTZW1hbnRpY09iamVjdE1hcHBpbmcubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0XHRcdFx0aWYgKGFTZW1hbnRpY09iamVjdE1hcHBpbmdbaV0uTG9jYWxQcm9wZXJ0eT8uJFByb3BlcnR5UGF0aCAhPT0gb1NlbWFudGljTWFwcGluZy5Mb2NhbFByb3BlcnR5LiRQcm9wZXJ0eVBhdGgpIHtcblx0XHRcdFx0XHRcdFx0XHRhU2VtYW50aWNPYmplY3RNYXBwaW5nLnB1c2gob1NlbWFudGljTWFwcGluZyk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0YVNlbWFudGljT2JqZWN0TWFwcGluZy5wdXNoKG9TZW1hbnRpY01hcHBpbmcpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBhU2VtYW50aWNPYmplY3RNYXBwaW5nO1xufVxuXG5mdW5jdGlvbiBnZXRIZWFkZXJGYWNldEl0ZW1Db25maWdGb3JFeHRlcm5hbE5hdmlnYXRpb24ob1ZpZXdEYXRhOiBWaWV3RGF0YSwgb0Nyb3NzTmF2OiBSZWNvcmQ8c3RyaW5nLCBPdXRib3VuZFBhcmFtZXRlcj4pIHtcblx0Y29uc3Qgb0hlYWRlckZhY2V0SXRlbXM6IFJlY29yZDxcblx0XHRzdHJpbmcsXG5cdFx0e1xuXHRcdFx0c2VtYW50aWNPYmplY3Q6IHN0cmluZztcblx0XHRcdGFjdGlvbjogc3RyaW5nO1xuXHRcdFx0c2VtYW50aWNPYmplY3RNYXBwaW5nOiBNZXRhTW9kZWxUeXBlPFNlbWFudGljT2JqZWN0TWFwcGluZ1R5cGU+W107XG5cdFx0fVxuXHQ+ID0ge307XG5cdGxldCBzSWQ7XG5cdGNvbnN0IG9Db250cm9sQ29uZmlnID0gb1ZpZXdEYXRhLmNvbnRyb2xDb25maWd1cmF0aW9uIGFzIFJlY29yZDxcblx0XHRzdHJpbmcsXG5cdFx0e1xuXHRcdFx0bmF2aWdhdGlvbj86IHtcblx0XHRcdFx0dGFyZ2V0T3V0Ym91bmQ/OiB7XG5cdFx0XHRcdFx0b3V0Ym91bmQ6IHN0cmluZztcblx0XHRcdFx0fTtcblx0XHRcdH07XG5cdFx0fVxuXHQ+O1xuXHRmb3IgKGNvbnN0IGNvbmZpZyBpbiBvQ29udHJvbENvbmZpZykge1xuXHRcdGlmIChjb25maWcuaW5kZXhPZihcIkBjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5EYXRhUG9pbnRcIikgPiAtMSB8fCBjb25maWcuaW5kZXhPZihcIkBjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5DaGFydFwiKSA+IC0xKSB7XG5cdFx0XHRjb25zdCBzT3V0Ym91bmQgPSBvQ29udHJvbENvbmZpZ1tjb25maWddLm5hdmlnYXRpb24/LnRhcmdldE91dGJvdW5kPy5vdXRib3VuZDtcblx0XHRcdGlmIChzT3V0Ym91bmQgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRjb25zdCBvT3V0Ym91bmQgPSBvQ3Jvc3NOYXZbc091dGJvdW5kXTtcblx0XHRcdFx0aWYgKG9PdXRib3VuZC5zZW1hbnRpY09iamVjdCAmJiBvT3V0Ym91bmQuYWN0aW9uKSB7XG5cdFx0XHRcdFx0aWYgKGNvbmZpZy5pbmRleE9mKFwiQ2hhcnRcIikgPiAtMSkge1xuXHRcdFx0XHRcdFx0c0lkID0gZ2VuZXJhdGUoW1wiZmVcIiwgXCJNaWNyb0NoYXJ0TGlua1wiLCBjb25maWddKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0c0lkID0gZ2VuZXJhdGUoW1wiZmVcIiwgXCJIZWFkZXJEUExpbmtcIiwgY29uZmlnXSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGNvbnN0IGFTZW1hbnRpY09iamVjdE1hcHBpbmcgPSBDb21tb25VdGlscy5nZXRTZW1hbnRpY09iamVjdE1hcHBpbmcob091dGJvdW5kKTtcblx0XHRcdFx0XHRvSGVhZGVyRmFjZXRJdGVtc1tzSWRdID0ge1xuXHRcdFx0XHRcdFx0c2VtYW50aWNPYmplY3Q6IG9PdXRib3VuZC5zZW1hbnRpY09iamVjdCxcblx0XHRcdFx0XHRcdGFjdGlvbjogb091dGJvdW5kLmFjdGlvbixcblx0XHRcdFx0XHRcdHNlbWFudGljT2JqZWN0TWFwcGluZzogYVNlbWFudGljT2JqZWN0TWFwcGluZ1xuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0TG9nLmVycm9yKGBDcm9zcyBuYXZpZ2F0aW9uIG91dGJvdW5kIGlzIGNvbmZpZ3VyZWQgd2l0aG91dCBzZW1hbnRpYyBvYmplY3QgYW5kIGFjdGlvbiBmb3IgJHtzT3V0Ym91bmR9YCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblx0cmV0dXJuIG9IZWFkZXJGYWNldEl0ZW1zO1xufVxuXG5mdW5jdGlvbiBzZXRTZW1hbnRpY09iamVjdE1hcHBpbmdzKG9TZWxlY3Rpb25WYXJpYW50OiBTZWxlY3Rpb25WYXJpYW50LCB2TWFwcGluZ3M6IHVua25vd24pIHtcblx0Y29uc3Qgb01hcHBpbmdzID0gdHlwZW9mIHZNYXBwaW5ncyA9PT0gXCJzdHJpbmdcIiA/IEpTT04ucGFyc2Uodk1hcHBpbmdzKSA6IHZNYXBwaW5ncztcblx0Zm9yIChsZXQgaSA9IDA7IGkgPCBvTWFwcGluZ3MubGVuZ3RoOyBpKyspIHtcblx0XHRjb25zdCBzTG9jYWxQcm9wZXJ0eSA9XG5cdFx0XHQob01hcHBpbmdzW2ldW1wiTG9jYWxQcm9wZXJ0eVwiXSAmJiBvTWFwcGluZ3NbaV1bXCJMb2NhbFByb3BlcnR5XCJdW1wiJFByb3BlcnR5UGF0aFwiXSkgfHxcblx0XHRcdChvTWFwcGluZ3NbaV1bXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkxvY2FsUHJvcGVydHlcIl0gJiZcblx0XHRcdFx0b01hcHBpbmdzW2ldW1wiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5Mb2NhbFByb3BlcnR5XCJdW1wiJFBhdGhcIl0pO1xuXHRcdGNvbnN0IHNTZW1hbnRpY09iamVjdFByb3BlcnR5ID1cblx0XHRcdG9NYXBwaW5nc1tpXVtcIlNlbWFudGljT2JqZWN0UHJvcGVydHlcIl0gfHwgb01hcHBpbmdzW2ldW1wiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5TZW1hbnRpY09iamVjdFByb3BlcnR5XCJdO1xuXHRcdGNvbnN0IG9TZWxlY3RPcHRpb24gPSBvU2VsZWN0aW9uVmFyaWFudC5nZXRTZWxlY3RPcHRpb24oc0xvY2FsUHJvcGVydHkpO1xuXHRcdGlmIChvU2VsZWN0T3B0aW9uKSB7XG5cdFx0XHQvL0NyZWF0ZSBhIG5ldyBTZWxlY3RPcHRpb24gd2l0aCBzU2VtYW50aWNPYmplY3RQcm9wZXJ0eSBhcyB0aGUgcHJvcGVydHkgTmFtZSBhbmQgcmVtb3ZlIHRoZSBvbGRlciBvbmVcblx0XHRcdG9TZWxlY3Rpb25WYXJpYW50LnJlbW92ZVNlbGVjdE9wdGlvbihzTG9jYWxQcm9wZXJ0eSk7XG5cdFx0XHRvU2VsZWN0aW9uVmFyaWFudC5tYXNzQWRkU2VsZWN0T3B0aW9uKHNTZW1hbnRpY09iamVjdFByb3BlcnR5LCBvU2VsZWN0T3B0aW9uKTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIG9TZWxlY3Rpb25WYXJpYW50O1xufVxuXG50eXBlIFNlbWFudGljT2JqZWN0RnJvbVBhdGggPSB7XG5cdHNlbWFudGljT2JqZWN0UGF0aDogc3RyaW5nO1xuXHRzZW1hbnRpY09iamVjdEZvckdldExpbmtzOiB7IHNlbWFudGljT2JqZWN0OiBzdHJpbmcgfVtdO1xuXHRzZW1hbnRpY09iamVjdDoge1xuXHRcdHNlbWFudGljT2JqZWN0OiB7ICRQYXRoOiBzdHJpbmcgfTtcblx0fTtcblx0dW5hdmFpbGFibGVBY3Rpb25zOiBzdHJpbmdbXTtcbn07XG5hc3luYyBmdW5jdGlvbiBmbkdldFNlbWFudGljT2JqZWN0c0Zyb21QYXRoKG9NZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsLCBzUGF0aDogc3RyaW5nLCBzUXVhbGlmaWVyOiBzdHJpbmcpIHtcblx0cmV0dXJuIG5ldyBQcm9taXNlPFNlbWFudGljT2JqZWN0RnJvbVBhdGg+KGZ1bmN0aW9uIChyZXNvbHZlKSB7XG5cdFx0bGV0IHNTZW1hbnRpY09iamVjdCwgYVNlbWFudGljT2JqZWN0VW5hdmFpbGFibGVBY3Rpb25zO1xuXHRcdGlmIChzUXVhbGlmaWVyID09PSBcIlwiKSB7XG5cdFx0XHRzU2VtYW50aWNPYmplY3QgPSBvTWV0YU1vZGVsLmdldE9iamVjdChgJHtzUGF0aH1AJHtDb21tb25Bbm5vdGF0aW9uVGVybXMuU2VtYW50aWNPYmplY3R9YCk7XG5cdFx0XHRhU2VtYW50aWNPYmplY3RVbmF2YWlsYWJsZUFjdGlvbnMgPSBvTWV0YU1vZGVsLmdldE9iamVjdChgJHtzUGF0aH1AJHtDb21tb25Bbm5vdGF0aW9uVGVybXMuU2VtYW50aWNPYmplY3RVbmF2YWlsYWJsZUFjdGlvbnN9YCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHNTZW1hbnRpY09iamVjdCA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NQYXRofUAke0NvbW1vbkFubm90YXRpb25UZXJtcy5TZW1hbnRpY09iamVjdH0jJHtzUXVhbGlmaWVyfWApO1xuXHRcdFx0YVNlbWFudGljT2JqZWN0VW5hdmFpbGFibGVBY3Rpb25zID0gb01ldGFNb2RlbC5nZXRPYmplY3QoXG5cdFx0XHRcdGAke3NQYXRofUAke0NvbW1vbkFubm90YXRpb25UZXJtcy5TZW1hbnRpY09iamVjdFVuYXZhaWxhYmxlQWN0aW9uc30jJHtzUXVhbGlmaWVyfWBcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgYVNlbWFudGljT2JqZWN0Rm9yR2V0TGlua3MgPSBbeyBzZW1hbnRpY09iamVjdDogc1NlbWFudGljT2JqZWN0IH1dO1xuXHRcdGNvbnN0IG9TZW1hbnRpY09iamVjdCA9IHtcblx0XHRcdHNlbWFudGljT2JqZWN0OiBzU2VtYW50aWNPYmplY3Rcblx0XHR9O1xuXHRcdHJlc29sdmUoe1xuXHRcdFx0c2VtYW50aWNPYmplY3RQYXRoOiBzUGF0aCxcblx0XHRcdHNlbWFudGljT2JqZWN0Rm9yR2V0TGlua3M6IGFTZW1hbnRpY09iamVjdEZvckdldExpbmtzLFxuXHRcdFx0c2VtYW50aWNPYmplY3Q6IG9TZW1hbnRpY09iamVjdCxcblx0XHRcdHVuYXZhaWxhYmxlQWN0aW9uczogYVNlbWFudGljT2JqZWN0VW5hdmFpbGFibGVBY3Rpb25zXG5cdFx0fSk7XG5cdH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmblVwZGF0ZVNlbWFudGljVGFyZ2V0c01vZGVsKFxuXHRhR2V0TGlua3NQcm9taXNlczogUHJvbWlzZTxMaW5rRGVmaW5pdGlvbltdW11bXT5bXSxcblx0YVNlbWFudGljT2JqZWN0czogU2VtYW50aWNPYmplY3RbXSxcblx0b0ludGVybmFsTW9kZWxDb250ZXh0OiBJbnRlcm5hbE1vZGVsQ29udGV4dCxcblx0c0N1cnJlbnRIYXNoOiBzdHJpbmdcbikge1xuXHR0eXBlIFNlbWFudGljT2JqZWN0SW5mbyA9IHsgc2VtYW50aWNPYmplY3Q6IHN0cmluZzsgcGF0aDogc3RyaW5nOyBIYXNUYXJnZXRzOiBib29sZWFuOyBIYXNUYXJnZXRzTm90RmlsdGVyZWQ6IGJvb2xlYW4gfTtcblx0cmV0dXJuIFByb21pc2UuYWxsKGFHZXRMaW5rc1Byb21pc2VzKVxuXHRcdC50aGVuKGZ1bmN0aW9uIChhVmFsdWVzKSB7XG5cdFx0XHRsZXQgYUxpbmtzOiBMaW5rRGVmaW5pdGlvbltdW11bXSxcblx0XHRcdFx0X29MaW5rLFxuXHRcdFx0XHRfc0xpbmtJbnRlbnRBY3Rpb24sXG5cdFx0XHRcdGFGaW5hbExpbmtzOiBMaW5rRGVmaW5pdGlvbltdW10gPSBbXTtcblx0XHRcdGxldCBvRmluYWxTZW1hbnRpY09iamVjdHM6IFJlY29yZDxzdHJpbmcsIFNlbWFudGljT2JqZWN0SW5mbz4gPSB7fTtcblx0XHRcdGNvbnN0IGJJbnRlbnRIYXNBY3Rpb25zID0gZnVuY3Rpb24gKHNJbnRlbnQ6IHN0cmluZywgYUFjdGlvbnM/OiB1bmtub3duW10pIHtcblx0XHRcdFx0Zm9yIChjb25zdCBpbnRlbnQgaW4gYUFjdGlvbnMpIHtcblx0XHRcdFx0XHRpZiAoaW50ZW50ID09PSBzSW50ZW50KSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fTtcblxuXHRcdFx0Zm9yIChsZXQgayA9IDA7IGsgPCBhVmFsdWVzLmxlbmd0aDsgaysrKSB7XG5cdFx0XHRcdGFMaW5rcyA9IGFWYWx1ZXNba107XG5cdFx0XHRcdGlmIChhTGlua3MgJiYgYUxpbmtzLmxlbmd0aCA+IDAgJiYgYUxpbmtzWzBdICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRjb25zdCBvU2VtYW50aWNPYmplY3Q6IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIFNlbWFudGljT2JqZWN0SW5mbz4+ID0ge307XG5cdFx0XHRcdFx0bGV0IG9UbXA6IFNlbWFudGljT2JqZWN0SW5mbztcblx0XHRcdFx0XHRsZXQgc0FsdGVybmF0ZVBhdGg7XG5cdFx0XHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBhTGlua3MubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0XHRcdGFGaW5hbExpbmtzLnB1c2goW10pO1xuXHRcdFx0XHRcdFx0bGV0IGhhc1RhcmdldHNOb3RGaWx0ZXJlZCA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0bGV0IGhhc1RhcmdldHMgPSBmYWxzZTtcblx0XHRcdFx0XHRcdGZvciAobGV0IGlMaW5rQ291bnQgPSAwOyBpTGlua0NvdW50IDwgYUxpbmtzW2ldWzBdLmxlbmd0aDsgaUxpbmtDb3VudCsrKSB7XG5cdFx0XHRcdFx0XHRcdF9vTGluayA9IGFMaW5rc1tpXVswXVtpTGlua0NvdW50XTtcblx0XHRcdFx0XHRcdFx0X3NMaW5rSW50ZW50QWN0aW9uID0gX29MaW5rICYmIF9vTGluay5pbnRlbnQuc3BsaXQoXCI/XCIpWzBdLnNwbGl0KFwiLVwiKVsxXTtcblxuXHRcdFx0XHRcdFx0XHRpZiAoIShfb0xpbmsgJiYgX29MaW5rLmludGVudCAmJiBfb0xpbmsuaW50ZW50LmluZGV4T2Yoc0N1cnJlbnRIYXNoKSA9PT0gMCkpIHtcblx0XHRcdFx0XHRcdFx0XHRoYXNUYXJnZXRzTm90RmlsdGVyZWQgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHRcdGlmICghYkludGVudEhhc0FjdGlvbnMoX3NMaW5rSW50ZW50QWN0aW9uLCBhU2VtYW50aWNPYmplY3RzW2tdLnVuYXZhaWxhYmxlQWN0aW9ucykpIHtcblx0XHRcdFx0XHRcdFx0XHRcdGFGaW5hbExpbmtzW2ldLnB1c2goX29MaW5rKTtcblx0XHRcdFx0XHRcdFx0XHRcdGhhc1RhcmdldHMgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0b1RtcCA9IHtcblx0XHRcdFx0XHRcdFx0c2VtYW50aWNPYmplY3Q6IGFTZW1hbnRpY09iamVjdHNba10uc2VtYW50aWNPYmplY3QsXG5cdFx0XHRcdFx0XHRcdHBhdGg6IGFTZW1hbnRpY09iamVjdHNba10ucGF0aCxcblx0XHRcdFx0XHRcdFx0SGFzVGFyZ2V0czogaGFzVGFyZ2V0cyxcblx0XHRcdFx0XHRcdFx0SGFzVGFyZ2V0c05vdEZpbHRlcmVkOiBoYXNUYXJnZXRzTm90RmlsdGVyZWRcblx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHRpZiAob1NlbWFudGljT2JqZWN0W2FTZW1hbnRpY09iamVjdHNba10uc2VtYW50aWNPYmplY3RdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdFx0b1NlbWFudGljT2JqZWN0W2FTZW1hbnRpY09iamVjdHNba10uc2VtYW50aWNPYmplY3RdID0ge307XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRzQWx0ZXJuYXRlUGF0aCA9IGFTZW1hbnRpY09iamVjdHNba10ucGF0aC5yZXBsYWNlKC9cXC8vZywgXCJfXCIpO1xuXHRcdFx0XHRcdFx0aWYgKG9TZW1hbnRpY09iamVjdFthU2VtYW50aWNPYmplY3RzW2tdLnNlbWFudGljT2JqZWN0XVtzQWx0ZXJuYXRlUGF0aF0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdFx0XHRvU2VtYW50aWNPYmplY3RbYVNlbWFudGljT2JqZWN0c1trXS5zZW1hbnRpY09iamVjdF1bc0FsdGVybmF0ZVBhdGhdID0ge30gYXMgU2VtYW50aWNPYmplY3RJbmZvO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0b1NlbWFudGljT2JqZWN0W2FTZW1hbnRpY09iamVjdHNba10uc2VtYW50aWNPYmplY3RdW3NBbHRlcm5hdGVQYXRoXSA9IE9iamVjdC5hc3NpZ24oXG5cdFx0XHRcdFx0XHRcdG9TZW1hbnRpY09iamVjdFthU2VtYW50aWNPYmplY3RzW2tdLnNlbWFudGljT2JqZWN0XVtzQWx0ZXJuYXRlUGF0aF0sXG5cdFx0XHRcdFx0XHRcdG9UbXBcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGNvbnN0IHNTZW1hbnRpY09iamVjdE5hbWUgPSBPYmplY3Qua2V5cyhvU2VtYW50aWNPYmplY3QpWzBdO1xuXHRcdFx0XHRcdGlmIChPYmplY3Qua2V5cyhvRmluYWxTZW1hbnRpY09iamVjdHMpLmluY2x1ZGVzKHNTZW1hbnRpY09iamVjdE5hbWUpKSB7XG5cdFx0XHRcdFx0XHRvRmluYWxTZW1hbnRpY09iamVjdHNbc1NlbWFudGljT2JqZWN0TmFtZV0gPSBPYmplY3QuYXNzaWduKFxuXHRcdFx0XHRcdFx0XHRvRmluYWxTZW1hbnRpY09iamVjdHNbc1NlbWFudGljT2JqZWN0TmFtZV0sXG5cdFx0XHRcdFx0XHRcdG9TZW1hbnRpY09iamVjdFtzU2VtYW50aWNPYmplY3ROYW1lXVxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0b0ZpbmFsU2VtYW50aWNPYmplY3RzID0gT2JqZWN0LmFzc2lnbihvRmluYWxTZW1hbnRpY09iamVjdHMsIG9TZW1hbnRpY09iamVjdCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGFGaW5hbExpbmtzID0gW107XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmIChPYmplY3Qua2V5cyhvRmluYWxTZW1hbnRpY09iamVjdHMpLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFxuXHRcdFx0XHRcdFwic2VtYW50aWNzVGFyZ2V0c1wiLFxuXHRcdFx0XHRcdG1lcmdlT2JqZWN0cyhvRmluYWxTZW1hbnRpY09iamVjdHMsIG9JbnRlcm5hbE1vZGVsQ29udGV4dC5nZXRQcm9wZXJ0eShcInNlbWFudGljc1RhcmdldHNcIikpXG5cdFx0XHRcdCk7XG5cdFx0XHRcdHJldHVybiBvRmluYWxTZW1hbnRpY09iamVjdHM7XG5cdFx0XHR9XG5cdFx0fSlcblx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogdW5rbm93bikge1xuXHRcdFx0TG9nLmVycm9yKFwiZm5VcGRhdGVTZW1hbnRpY1RhcmdldHNNb2RlbDogQ2Fubm90IHJlYWQgbGlua3NcIiwgb0Vycm9yIGFzIHN0cmluZyk7XG5cdFx0fSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZuR2V0U2VtYW50aWNPYmplY3RQcm9taXNlKFxuXHRvQXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsXG5cdG9WaWV3OiBWaWV3LFxuXHRvTWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbCxcblx0c1BhdGg6IHN0cmluZyxcblx0c1F1YWxpZmllcjogc3RyaW5nXG4pIHtcblx0cmV0dXJuIENvbW1vblV0aWxzLmdldFNlbWFudGljT2JqZWN0c0Zyb21QYXRoKG9NZXRhTW9kZWwsIHNQYXRoLCBzUXVhbGlmaWVyKTtcbn1cblxuZnVuY3Rpb24gZm5QcmVwYXJlU2VtYW50aWNPYmplY3RzUHJvbWlzZXMoXG5cdF9vQXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsXG5cdF9vVmlldzogVmlldyxcblx0X29NZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsLFxuXHRfYVNlbWFudGljT2JqZWN0c0ZvdW5kOiBzdHJpbmdbXSxcblx0X2FTZW1hbnRpY09iamVjdHNQcm9taXNlczogUHJvbWlzZTxTZW1hbnRpY09iamVjdEZyb21QYXRoPltdXG4pIHtcblx0bGV0IF9LZXlzOiBzdHJpbmdbXSwgc1BhdGg7XG5cdGxldCBzUXVhbGlmaWVyOiBzdHJpbmcsIHJlZ2V4UmVzdWx0O1xuXHRmb3IgKGxldCBpID0gMDsgaSA8IF9hU2VtYW50aWNPYmplY3RzRm91bmQubGVuZ3RoOyBpKyspIHtcblx0XHRzUGF0aCA9IF9hU2VtYW50aWNPYmplY3RzRm91bmRbaV07XG5cdFx0X0tleXMgPSBPYmplY3Qua2V5cyhfb01ldGFNb2RlbC5nZXRPYmplY3Qoc1BhdGggKyBcIkBcIikpO1xuXHRcdGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBfS2V5cy5sZW5ndGg7IGluZGV4KyspIHtcblx0XHRcdGlmIChcblx0XHRcdFx0X0tleXNbaW5kZXhdLmluZGV4T2YoYEAke0NvbW1vbkFubm90YXRpb25UZXJtcy5TZW1hbnRpY09iamVjdH1gKSA9PT0gMCAmJlxuXHRcdFx0XHRfS2V5c1tpbmRleF0uaW5kZXhPZihgQCR7Q29tbW9uQW5ub3RhdGlvblRlcm1zLlNlbWFudGljT2JqZWN0TWFwcGluZ31gKSA9PT0gLTEgJiZcblx0XHRcdFx0X0tleXNbaW5kZXhdLmluZGV4T2YoYEAke0NvbW1vbkFubm90YXRpb25UZXJtcy5TZW1hbnRpY09iamVjdFVuYXZhaWxhYmxlQWN0aW9uc31gKSA9PT0gLTFcblx0XHRcdCkge1xuXHRcdFx0XHRyZWdleFJlc3VsdCA9IC8jKC4qKS8uZXhlYyhfS2V5c1tpbmRleF0pO1xuXHRcdFx0XHRzUXVhbGlmaWVyID0gcmVnZXhSZXN1bHQgPyByZWdleFJlc3VsdFsxXSA6IFwiXCI7XG5cdFx0XHRcdF9hU2VtYW50aWNPYmplY3RzUHJvbWlzZXMucHVzaChcblx0XHRcdFx0XHRDb21tb25VdGlscy5nZXRTZW1hbnRpY09iamVjdFByb21pc2UoX29BcHBDb21wb25lbnQsIF9vVmlldywgX29NZXRhTW9kZWwsIHNQYXRoLCBzUXVhbGlmaWVyKVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufVxuXG50eXBlIEludGVybmFsSlNPTk1vZGVsID0ge1xuXHRfZ2V0T2JqZWN0KHZhbDogc3RyaW5nLCBjb250ZXh0PzogQ29udGV4dCk6IG9iamVjdDtcbn07XG5mdW5jdGlvbiBmbkdldFNlbWFudGljVGFyZ2V0c0Zyb21QYWdlTW9kZWwob0NvbnRyb2xsZXI6IFBhZ2VDb250cm9sbGVyLCBzUGFnZU1vZGVsOiBzdHJpbmcpIHtcblx0Y29uc3QgX2ZuZmluZFZhbHVlc0hlbHBlciA9IGZ1bmN0aW9uIChcblx0XHRvYmo6IHVuZGVmaW5lZCB8IG51bGwgfCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+W10gfCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcblx0XHRrZXk6IHN0cmluZyxcblx0XHRsaXN0OiBzdHJpbmdbXVxuXHQpIHtcblx0XHRpZiAoIW9iaikge1xuXHRcdFx0cmV0dXJuIGxpc3Q7XG5cdFx0fVxuXHRcdGlmIChvYmogaW5zdGFuY2VvZiBBcnJheSkge1xuXHRcdFx0Zm9yIChjb25zdCBpIGluIG9iaikge1xuXHRcdFx0XHRsaXN0ID0gbGlzdC5jb25jYXQoX2ZuZmluZFZhbHVlc0hlbHBlcihvYmpbaV0sIGtleSwgW10pKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBsaXN0O1xuXHRcdH1cblx0XHRpZiAob2JqW2tleV0pIHtcblx0XHRcdGxpc3QucHVzaChvYmpba2V5XSBhcyBzdHJpbmcpO1xuXHRcdH1cblxuXHRcdGlmICh0eXBlb2Ygb2JqID09IFwib2JqZWN0XCIgJiYgb2JqICE9PSBudWxsKSB7XG5cdFx0XHRjb25zdCBjaGlsZHJlbiA9IE9iamVjdC5rZXlzKG9iaik7XG5cdFx0XHRpZiAoY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdFx0bGlzdCA9IGxpc3QuY29uY2F0KF9mbmZpbmRWYWx1ZXNIZWxwZXIob2JqW2NoaWxkcmVuW2ldXSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwga2V5LCBbXSkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBsaXN0O1xuXHR9O1xuXHRjb25zdCBfZm5maW5kVmFsdWVzID0gZnVuY3Rpb24gKG9iajogdW5kZWZpbmVkIHwgbnVsbCB8IFJlY29yZDxzdHJpbmcsIHN0cmluZz5bXSB8IFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBrZXk6IHN0cmluZykge1xuXHRcdHJldHVybiBfZm5maW5kVmFsdWVzSGVscGVyKG9iaiwga2V5LCBbXSk7XG5cdH07XG5cdGNvbnN0IF9mbkRlbGV0ZUR1cGxpY2F0ZVNlbWFudGljT2JqZWN0cyA9IGZ1bmN0aW9uIChhU2VtYW50aWNPYmplY3RQYXRoOiBzdHJpbmdbXSkge1xuXHRcdHJldHVybiBhU2VtYW50aWNPYmplY3RQYXRoLmZpbHRlcihmdW5jdGlvbiAodmFsdWU6IHN0cmluZywgaW5kZXg6IG51bWJlcikge1xuXHRcdFx0cmV0dXJuIGFTZW1hbnRpY09iamVjdFBhdGguaW5kZXhPZih2YWx1ZSkgPT09IGluZGV4O1xuXHRcdH0pO1xuXHR9O1xuXHRjb25zdCBvVmlldyA9IG9Db250cm9sbGVyLmdldFZpZXcoKTtcblx0Y29uc3Qgb0ludGVybmFsTW9kZWxDb250ZXh0ID0gb1ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKSBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dDtcblxuXHRpZiAob0ludGVybmFsTW9kZWxDb250ZXh0KSB7XG5cdFx0Y29uc3QgYVNlbWFudGljT2JqZWN0c1Byb21pc2VzOiBQcm9taXNlPFNlbWFudGljT2JqZWN0RnJvbVBhdGg+W10gPSBbXTtcblx0XHRjb25zdCBvQ29tcG9uZW50ID0gb0NvbnRyb2xsZXIuZ2V0T3duZXJDb21wb25lbnQoKTtcblx0XHRjb25zdCBvQXBwQ29tcG9uZW50ID0gQ29tcG9uZW50LmdldE93bmVyQ29tcG9uZW50Rm9yKG9Db21wb25lbnQpIGFzIEFwcENvbXBvbmVudDtcblx0XHRjb25zdCBvTWV0YU1vZGVsID0gb0FwcENvbXBvbmVudC5nZXRNZXRhTW9kZWwoKTtcblx0XHRsZXQgb1BhZ2VNb2RlbCA9IChvQ29tcG9uZW50LmdldE1vZGVsKHNQYWdlTW9kZWwpIGFzIEpTT05Nb2RlbCkuZ2V0RGF0YSgpO1xuXHRcdGlmIChKU09OLnN0cmluZ2lmeShvUGFnZU1vZGVsKSA9PT0gXCJ7fVwiKSB7XG5cdFx0XHRvUGFnZU1vZGVsID0gKG9Db21wb25lbnQuZ2V0TW9kZWwoc1BhZ2VNb2RlbCkgYXMgdW5rbm93biBhcyBJbnRlcm5hbEpTT05Nb2RlbCkuX2dldE9iamVjdChcIi9cIiwgdW5kZWZpbmVkKTtcblx0XHR9XG5cdFx0bGV0IGFTZW1hbnRpY09iamVjdHNGb3VuZCA9IF9mbmZpbmRWYWx1ZXMob1BhZ2VNb2RlbCwgXCJzZW1hbnRpY09iamVjdFBhdGhcIik7XG5cdFx0YVNlbWFudGljT2JqZWN0c0ZvdW5kID0gX2ZuRGVsZXRlRHVwbGljYXRlU2VtYW50aWNPYmplY3RzKGFTZW1hbnRpY09iamVjdHNGb3VuZCk7XG5cdFx0Y29uc3Qgb1NoZWxsU2VydmljZUhlbHBlciA9IENvbW1vblV0aWxzLmdldFNoZWxsU2VydmljZXMob0FwcENvbXBvbmVudCk7XG5cdFx0bGV0IHNDdXJyZW50SGFzaCA9IENvbW1vblV0aWxzLmdldEhhc2goKTtcblx0XHRjb25zdCBhU2VtYW50aWNPYmplY3RzRm9yR2V0TGlua3MgPSBbXTtcblx0XHRjb25zdCBhU2VtYW50aWNPYmplY3RzOiBTZW1hbnRpY09iamVjdFtdID0gW107XG5cdFx0bGV0IF9vU2VtYW50aWNPYmplY3Q7XG5cblx0XHRpZiAoc0N1cnJlbnRIYXNoICYmIHNDdXJyZW50SGFzaC5pbmRleE9mKFwiP1wiKSAhPT0gLTEpIHtcblx0XHRcdC8vIHNDdXJyZW50SGFzaCBjYW4gY29udGFpbiBxdWVyeSBzdHJpbmcsIGN1dCBpdCBvZmYhXG5cdFx0XHRzQ3VycmVudEhhc2ggPSBzQ3VycmVudEhhc2guc3BsaXQoXCI/XCIpWzBdO1xuXHRcdH1cblxuXHRcdGZuUHJlcGFyZVNlbWFudGljT2JqZWN0c1Byb21pc2VzKG9BcHBDb21wb25lbnQsIG9WaWV3LCBvTWV0YU1vZGVsLCBhU2VtYW50aWNPYmplY3RzRm91bmQsIGFTZW1hbnRpY09iamVjdHNQcm9taXNlcyk7XG5cblx0XHRpZiAoYVNlbWFudGljT2JqZWN0c1Byb21pc2VzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRQcm9taXNlLmFsbChhU2VtYW50aWNPYmplY3RzUHJvbWlzZXMpXG5cdFx0XHRcdC50aGVuKGFzeW5jIGZ1bmN0aW9uIChhVmFsdWVzKSB7XG5cdFx0XHRcdFx0Y29uc3QgYUdldExpbmtzUHJvbWlzZXMgPSBbXTtcblx0XHRcdFx0XHRsZXQgc1NlbU9iakV4cHJlc3Npb247XG5cdFx0XHRcdFx0dHlwZSBTZW1hbnRpY09iamVjdFJlc29sdmVkID0ge1xuXHRcdFx0XHRcdFx0c2VtYW50aWNPYmplY3RQYXRoOiBzdHJpbmc7XG5cdFx0XHRcdFx0XHRzZW1hbnRpY09iamVjdEZvckdldExpbmtzOiB7IHNlbWFudGljT2JqZWN0OiBzdHJpbmcgfVtdO1xuXHRcdFx0XHRcdFx0c2VtYW50aWNPYmplY3Q6IHtcblx0XHRcdFx0XHRcdFx0c2VtYW50aWNPYmplY3Q6IHN0cmluZztcblx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHR1bmF2YWlsYWJsZUFjdGlvbnM6IHN0cmluZ1tdO1xuXHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0Y29uc3QgYVNlbWFudGljT2JqZWN0c1Jlc29sdmVkOiBTZW1hbnRpY09iamVjdFJlc29sdmVkW10gPSBhVmFsdWVzLmZpbHRlcihmdW5jdGlvbiAoZWxlbWVudCkge1xuXHRcdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0XHRlbGVtZW50LnNlbWFudGljT2JqZWN0ICE9PSB1bmRlZmluZWQgJiZcblx0XHRcdFx0XHRcdFx0ZWxlbWVudC5zZW1hbnRpY09iamVjdC5zZW1hbnRpY09iamVjdCAmJlxuXHRcdFx0XHRcdFx0XHR0eXBlb2YgZWxlbWVudC5zZW1hbnRpY09iamVjdC5zZW1hbnRpY09iamVjdCA9PT0gXCJvYmplY3RcIlxuXHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdHNTZW1PYmpFeHByZXNzaW9uID0gY29tcGlsZUV4cHJlc3Npb24ocGF0aEluTW9kZWwoZWxlbWVudC5zZW1hbnRpY09iamVjdC5zZW1hbnRpY09iamVjdC4kUGF0aCkpITtcblx0XHRcdFx0XHRcdFx0KGVsZW1lbnQgYXMgdW5rbm93biBhcyBTZW1hbnRpY09iamVjdFJlc29sdmVkKS5zZW1hbnRpY09iamVjdC5zZW1hbnRpY09iamVjdCA9IHNTZW1PYmpFeHByZXNzaW9uO1xuXHRcdFx0XHRcdFx0XHRlbGVtZW50LnNlbWFudGljT2JqZWN0Rm9yR2V0TGlua3NbMF0uc2VtYW50aWNPYmplY3QgPSBzU2VtT2JqRXhwcmVzc2lvbjtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKGVsZW1lbnQpIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIGVsZW1lbnQuc2VtYW50aWNPYmplY3QgIT09IHVuZGVmaW5lZDtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KSBhcyB1bmtub3duIGFzIFNlbWFudGljT2JqZWN0UmVzb2x2ZWRbXTtcblx0XHRcdFx0XHRmb3IgKGxldCBqID0gMDsgaiA8IGFTZW1hbnRpY09iamVjdHNSZXNvbHZlZC5sZW5ndGg7IGorKykge1xuXHRcdFx0XHRcdFx0X29TZW1hbnRpY09iamVjdCA9IGFTZW1hbnRpY09iamVjdHNSZXNvbHZlZFtqXTtcblx0XHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdFx0X29TZW1hbnRpY09iamVjdCAmJlxuXHRcdFx0XHRcdFx0XHRfb1NlbWFudGljT2JqZWN0LnNlbWFudGljT2JqZWN0ICYmXG5cdFx0XHRcdFx0XHRcdCEoX29TZW1hbnRpY09iamVjdC5zZW1hbnRpY09iamVjdC5zZW1hbnRpY09iamVjdC5pbmRleE9mKFwie1wiKSA9PT0gMClcblx0XHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0XHRhU2VtYW50aWNPYmplY3RzRm9yR2V0TGlua3MucHVzaChfb1NlbWFudGljT2JqZWN0LnNlbWFudGljT2JqZWN0Rm9yR2V0TGlua3MpO1xuXHRcdFx0XHRcdFx0XHRhU2VtYW50aWNPYmplY3RzLnB1c2goe1xuXHRcdFx0XHRcdFx0XHRcdHNlbWFudGljT2JqZWN0OiBfb1NlbWFudGljT2JqZWN0LnNlbWFudGljT2JqZWN0LnNlbWFudGljT2JqZWN0LFxuXHRcdFx0XHRcdFx0XHRcdHVuYXZhaWxhYmxlQWN0aW9uczogX29TZW1hbnRpY09iamVjdC51bmF2YWlsYWJsZUFjdGlvbnMsXG5cdFx0XHRcdFx0XHRcdFx0cGF0aDogYVNlbWFudGljT2JqZWN0c1Jlc29sdmVkW2pdLnNlbWFudGljT2JqZWN0UGF0aFxuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0YUdldExpbmtzUHJvbWlzZXMucHVzaChvU2hlbGxTZXJ2aWNlSGVscGVyLmdldExpbmtzV2l0aENhY2hlKFtfb1NlbWFudGljT2JqZWN0LnNlbWFudGljT2JqZWN0Rm9yR2V0TGlua3NdKSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiBDb21tb25VdGlscy51cGRhdGVTZW1hbnRpY1RhcmdldHMoYUdldExpbmtzUHJvbWlzZXMsIGFTZW1hbnRpY09iamVjdHMsIG9JbnRlcm5hbE1vZGVsQ29udGV4dCwgc0N1cnJlbnRIYXNoKTtcblx0XHRcdFx0fSlcblx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IHVua25vd24pIHtcblx0XHRcdFx0XHRMb2cuZXJyb3IoXCJmbkdldFNlbWFudGljVGFyZ2V0c0Zyb21UYWJsZTogQ2Fubm90IGdldCBTZW1hbnRpYyBPYmplY3RzXCIsIG9FcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0XHR9KTtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG59XG5cbmZ1bmN0aW9uIGdldEZpbHRlckFsbG93ZWRFeHByZXNzaW9uKG9GaWx0ZXJSZXN0cmljdGlvbnNBbm5vdGF0aW9uPzogTWV0YU1vZGVsVHlwZTxGaWx0ZXJSZXN0cmljdGlvbnNUeXBlPikge1xuXHRjb25zdCBtQWxsb3dlZEV4cHJlc3Npb25zOiBfRmlsdGVyQWxsb3dlZEV4cHJlc3Npb25zID0ge307XG5cdGlmIChvRmlsdGVyUmVzdHJpY3Rpb25zQW5ub3RhdGlvbiAmJiBvRmlsdGVyUmVzdHJpY3Rpb25zQW5ub3RhdGlvbi5GaWx0ZXJFeHByZXNzaW9uUmVzdHJpY3Rpb25zICE9PSB1bmRlZmluZWQpIHtcblx0XHRvRmlsdGVyUmVzdHJpY3Rpb25zQW5ub3RhdGlvbi5GaWx0ZXJFeHByZXNzaW9uUmVzdHJpY3Rpb25zLmZvckVhY2goZnVuY3Rpb24gKG9Qcm9wZXJ0eSkge1xuXHRcdFx0aWYgKG9Qcm9wZXJ0eS5Qcm9wZXJ0eSAmJiBvUHJvcGVydHkuQWxsb3dlZEV4cHJlc3Npb25zICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0Ly9TaW5nbGVWYWx1ZSB8IE11bHRpVmFsdWUgfCBTaW5nbGVSYW5nZSB8IE11bHRpUmFuZ2UgfCBTZWFyY2hFeHByZXNzaW9uIHwgTXVsdGlSYW5nZU9yU2VhcmNoRXhwcmVzc2lvblxuXHRcdFx0XHRpZiAobUFsbG93ZWRFeHByZXNzaW9uc1tvUHJvcGVydHkuUHJvcGVydHkuJFByb3BlcnR5UGF0aF0gIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdG1BbGxvd2VkRXhwcmVzc2lvbnNbb1Byb3BlcnR5LlByb3BlcnR5LiRQcm9wZXJ0eVBhdGhdLnB1c2gob1Byb3BlcnR5LkFsbG93ZWRFeHByZXNzaW9ucyBhcyBzdHJpbmcpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdG1BbGxvd2VkRXhwcmVzc2lvbnNbb1Byb3BlcnR5LlByb3BlcnR5LiRQcm9wZXJ0eVBhdGhdID0gW29Qcm9wZXJ0eS5BbGxvd2VkRXhwcmVzc2lvbnMgYXMgc3RyaW5nXTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cdHJldHVybiBtQWxsb3dlZEV4cHJlc3Npb25zO1xufVxuZnVuY3Rpb24gZ2V0RmlsdGVyUmVzdHJpY3Rpb25zKFxuXHRvRmlsdGVyUmVzdHJpY3Rpb25zQW5ub3RhdGlvbj86IE1ldGFNb2RlbFR5cGU8RmlsdGVyUmVzdHJpY3Rpb25zVHlwZT4sXG5cdHNSZXN0cmljdGlvbj86IFwiUmVxdWlyZWRQcm9wZXJ0aWVzXCIgfCBcIk5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzXCJcbikge1xuXHRsZXQgYVByb3BzOiBzdHJpbmdbXSA9IFtdO1xuXHRpZiAob0ZpbHRlclJlc3RyaWN0aW9uc0Fubm90YXRpb24gJiYgb0ZpbHRlclJlc3RyaWN0aW9uc0Fubm90YXRpb25bc1Jlc3RyaWN0aW9uIGFzIGtleW9mIE1ldGFNb2RlbFR5cGU8RmlsdGVyUmVzdHJpY3Rpb25zVHlwZT5dKSB7XG5cdFx0YVByb3BzID0gKFxuXHRcdFx0b0ZpbHRlclJlc3RyaWN0aW9uc0Fubm90YXRpb25bc1Jlc3RyaWN0aW9uIGFzIGtleW9mIE1ldGFNb2RlbFR5cGU8RmlsdGVyUmVzdHJpY3Rpb25zVHlwZT5dIGFzIEV4cGFuZFBhdGhUeXBlPEVkbS5Qcm9wZXJ0eVBhdGg+W11cblx0XHQpLm1hcChmdW5jdGlvbiAob1Byb3BlcnR5OiBFeHBhbmRQYXRoVHlwZTxFZG0uUHJvcGVydHlQYXRoPikge1xuXHRcdFx0cmV0dXJuIG9Qcm9wZXJ0eS4kUHJvcGVydHlQYXRoO1xuXHRcdH0pO1xuXHR9XG5cdHJldHVybiBhUHJvcHM7XG59XG5cbmZ1bmN0aW9uIF9mZXRjaFByb3BlcnRpZXNGb3JOYXZQYXRoKHBhdGhzOiBzdHJpbmdbXSwgbmF2UGF0aDogc3RyaW5nLCBwcm9wczogc3RyaW5nW10pIHtcblx0Y29uc3QgbmF2UGF0aFByZWZpeCA9IG5hdlBhdGggKyBcIi9cIjtcblx0cmV0dXJuIHBhdGhzLnJlZHVjZSgob3V0UGF0aHM6IHN0cmluZ1tdLCBwYXRoVG9DaGVjazogc3RyaW5nKSA9PiB7XG5cdFx0aWYgKHBhdGhUb0NoZWNrLnN0YXJ0c1dpdGgobmF2UGF0aFByZWZpeCkpIHtcblx0XHRcdGNvbnN0IG91dFBhdGggPSBwYXRoVG9DaGVjay5yZXBsYWNlKG5hdlBhdGhQcmVmaXgsIFwiXCIpO1xuXHRcdFx0aWYgKG91dFBhdGhzLmluZGV4T2Yob3V0UGF0aCkgPT09IC0xKSB7XG5cdFx0XHRcdG91dFBhdGhzLnB1c2gob3V0UGF0aCk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBvdXRQYXRocztcblx0fSwgcHJvcHMpO1xufVxudHlwZSBfRmlsdGVyQWxsb3dlZEV4cHJlc3Npb25zID0gUmVjb3JkPHN0cmluZywgc3RyaW5nW10+O1xudHlwZSBfRmlsdGVyUmVzdHJpY3Rpb25zID0ge1xuXHRSZXF1aXJlZFByb3BlcnRpZXM6IHN0cmluZ1tdO1xuXHROb25GaWx0ZXJhYmxlUHJvcGVydGllczogc3RyaW5nW107XG5cdEZpbHRlckFsbG93ZWRFeHByZXNzaW9uczogX0ZpbHRlckFsbG93ZWRFeHByZXNzaW9ucztcbn07XG5mdW5jdGlvbiBnZXRGaWx0ZXJSZXN0cmljdGlvbnNCeVBhdGgoZW50aXR5UGF0aDogc3RyaW5nLCBvQ29udGV4dDogT0RhdGFNZXRhTW9kZWwpIHtcblx0Y29uc3Qgb1JldDogX0ZpbHRlclJlc3RyaWN0aW9ucyA9IHtcblx0XHRSZXF1aXJlZFByb3BlcnRpZXM6IFtdLFxuXHRcdE5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzOiBbXSxcblx0XHRGaWx0ZXJBbGxvd2VkRXhwcmVzc2lvbnM6IHt9XG5cdH07XG5cdGxldCBvRmlsdGVyUmVzdHJpY3Rpb25zO1xuXHRjb25zdCBuYXZpZ2F0aW9uVGV4dCA9IFwiJE5hdmlnYXRpb25Qcm9wZXJ0eUJpbmRpbmdcIjtcblx0Y29uc3QgZnJUZXJtID0gXCJAT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5GaWx0ZXJSZXN0cmljdGlvbnNcIjtcblx0Y29uc3QgZW50aXR5VHlwZVBhdGhQYXJ0cyA9IGVudGl0eVBhdGgucmVwbGFjZUFsbChcIiUyRlwiLCBcIi9cIikuc3BsaXQoXCIvXCIpLmZpbHRlcihNb2RlbEhlbHBlci5maWx0ZXJPdXROYXZQcm9wQmluZGluZyk7XG5cdGNvbnN0IGVudGl0eVR5cGVQYXRoID0gYC8ke2VudGl0eVR5cGVQYXRoUGFydHMuam9pbihcIi9cIil9L2A7XG5cdGNvbnN0IGVudGl0eVNldFBhdGggPSBNb2RlbEhlbHBlci5nZXRFbnRpdHlTZXRQYXRoKGVudGl0eVBhdGgsIG9Db250ZXh0KTtcblx0Y29uc3QgZW50aXR5U2V0UGF0aFBhcnRzID0gZW50aXR5U2V0UGF0aC5zcGxpdChcIi9cIikuZmlsdGVyKE1vZGVsSGVscGVyLmZpbHRlck91dE5hdlByb3BCaW5kaW5nKTtcblx0Y29uc3QgaXNDb250YWlubWVudCA9IG9Db250ZXh0LmdldE9iamVjdChgJHtlbnRpdHlUeXBlUGF0aH0kQ29udGFpbnNUYXJnZXRgKTtcblx0Y29uc3QgY29udGFpbm1lbnROYXZQYXRoID0gaXNDb250YWlubWVudCAmJiBlbnRpdHlUeXBlUGF0aFBhcnRzW2VudGl0eVR5cGVQYXRoUGFydHMubGVuZ3RoIC0gMV07XG5cblx0Ly9MRUFTVCBQUklPUklUWSAtIEZpbHRlciByZXN0cmljdGlvbnMgZGlyZWN0bHkgYXQgRW50aXR5IFNldFxuXHQvL2UuZy4gRlIgaW4gXCJOUy5FbnRpdHlDb250YWluZXIvU2FsZXNPcmRlck1hbmFnZVwiIENvbnRleHRQYXRoOiAvU2FsZXNPcmRlck1hbmFnZVxuXHRpZiAoIWlzQ29udGFpbm1lbnQpIHtcblx0XHRvRmlsdGVyUmVzdHJpY3Rpb25zID0gb0NvbnRleHQuZ2V0T2JqZWN0KGAke2VudGl0eVNldFBhdGh9JHtmclRlcm19YCkgYXMgTWV0YU1vZGVsVHlwZTxGaWx0ZXJSZXN0cmljdGlvbnNUeXBlPiB8IHVuZGVmaW5lZDtcblx0XHRvUmV0LlJlcXVpcmVkUHJvcGVydGllcyA9IGdldEZpbHRlclJlc3RyaWN0aW9ucyhvRmlsdGVyUmVzdHJpY3Rpb25zLCBcIlJlcXVpcmVkUHJvcGVydGllc1wiKSB8fCBbXTtcblx0XHRjb25zdCByZXN1bHRDb250ZXh0Q2hlY2sgPSBvQ29udGV4dC5nZXRPYmplY3QoYCR7ZW50aXR5VHlwZVBhdGh9QGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5SZXN1bHRDb250ZXh0YCk7XG5cdFx0aWYgKCFyZXN1bHRDb250ZXh0Q2hlY2spIHtcblx0XHRcdG9SZXQuTm9uRmlsdGVyYWJsZVByb3BlcnRpZXMgPSBnZXRGaWx0ZXJSZXN0cmljdGlvbnMob0ZpbHRlclJlc3RyaWN0aW9ucywgXCJOb25GaWx0ZXJhYmxlUHJvcGVydGllc1wiKSB8fCBbXTtcblx0XHR9XG5cdFx0Ly9TaW5nbGVWYWx1ZSB8IE11bHRpVmFsdWUgfCBTaW5nbGVSYW5nZSB8IE11bHRpUmFuZ2UgfCBTZWFyY2hFeHByZXNzaW9uIHwgTXVsdGlSYW5nZU9yU2VhcmNoRXhwcmVzc2lvblxuXHRcdG9SZXQuRmlsdGVyQWxsb3dlZEV4cHJlc3Npb25zID0gZ2V0RmlsdGVyQWxsb3dlZEV4cHJlc3Npb24ob0ZpbHRlclJlc3RyaWN0aW9ucykgfHwge307XG5cdH1cblxuXHRpZiAoZW50aXR5VHlwZVBhdGhQYXJ0cy5sZW5ndGggPiAxKSB7XG5cdFx0Y29uc3QgbmF2UGF0aCA9IGlzQ29udGFpbm1lbnQgPyBjb250YWlubWVudE5hdlBhdGggOiBlbnRpdHlTZXRQYXRoUGFydHNbZW50aXR5U2V0UGF0aFBhcnRzLmxlbmd0aCAtIDFdO1xuXHRcdC8vIEluIGNhc2Ugb2YgY29udGFpbm1lbnQgd2UgdGFrZSBlbnRpdHlTZXQgcHJvdmlkZWQgYXMgcGFyZW50LiBBbmQgaW4gY2FzZSBvZiBub3JtYWwgd2Ugd291bGQgcmVtb3ZlIHRoZSBsYXN0IG5hdmlnYXRpb24gZnJvbSBlbnRpdHlTZXRQYXRoLlxuXHRcdGNvbnN0IHBhcmVudEVudGl0eVNldFBhdGggPSBpc0NvbnRhaW5tZW50ID8gZW50aXR5U2V0UGF0aCA6IGAvJHtlbnRpdHlTZXRQYXRoUGFydHMuc2xpY2UoMCwgLTEpLmpvaW4oYC8ke25hdmlnYXRpb25UZXh0fS9gKX1gO1xuXHRcdC8vVEhJUkQgSElHSEVTVCBQUklPUklUWSAtIFJlYWRpbmcgcHJvcGVydHkgcGF0aCByZXN0cmljdGlvbnMgLSBBbm5vdGF0aW9uIGF0IG1haW4gZW50aXR5IGJ1dCBkaXJlY3RseSBvbiBuYXZpZ2F0aW9uIHByb3BlcnR5IHBhdGhcblx0XHQvL2UuZy4gUGFyZW50IEN1c3RvbWVyIHdpdGggUHJvcGVydHlQYXRoPVwiU2V0L0NpdHlOYW1lXCIgQ29udGV4dFBhdGg6IEN1c3RvbWVyL1NldFxuXHRcdGNvbnN0IG9QYXJlbnRSZXQ6IF9GaWx0ZXJSZXN0cmljdGlvbnMgPSB7XG5cdFx0XHRSZXF1aXJlZFByb3BlcnRpZXM6IFtdLFxuXHRcdFx0Tm9uRmlsdGVyYWJsZVByb3BlcnRpZXM6IFtdLFxuXHRcdFx0RmlsdGVyQWxsb3dlZEV4cHJlc3Npb25zOiB7fVxuXHRcdH07XG5cdFx0aWYgKCFuYXZQYXRoLmluY2x1ZGVzKFwiJTJGXCIpKSB7XG5cdFx0XHRjb25zdCBvUGFyZW50RlIgPSBvQ29udGV4dC5nZXRPYmplY3QoYCR7cGFyZW50RW50aXR5U2V0UGF0aH0ke2ZyVGVybX1gKSBhcyBNZXRhTW9kZWxUeXBlPEZpbHRlclJlc3RyaWN0aW9uc1R5cGU+IHwgdW5kZWZpbmVkO1xuXHRcdFx0b1JldC5SZXF1aXJlZFByb3BlcnRpZXMgPSBfZmV0Y2hQcm9wZXJ0aWVzRm9yTmF2UGF0aChcblx0XHRcdFx0Z2V0RmlsdGVyUmVzdHJpY3Rpb25zKG9QYXJlbnRGUiwgXCJSZXF1aXJlZFByb3BlcnRpZXNcIikgfHwgW10sXG5cdFx0XHRcdG5hdlBhdGgsXG5cdFx0XHRcdG9SZXQuUmVxdWlyZWRQcm9wZXJ0aWVzIHx8IFtdXG5cdFx0XHQpO1xuXHRcdFx0b1JldC5Ob25GaWx0ZXJhYmxlUHJvcGVydGllcyA9IF9mZXRjaFByb3BlcnRpZXNGb3JOYXZQYXRoKFxuXHRcdFx0XHRnZXRGaWx0ZXJSZXN0cmljdGlvbnMob1BhcmVudEZSLCBcIk5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzXCIpIHx8IFtdLFxuXHRcdFx0XHRuYXZQYXRoLFxuXHRcdFx0XHRvUmV0Lk5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzIHx8IFtdXG5cdFx0XHQpO1xuXHRcdFx0Ly9TaW5nbGVWYWx1ZSB8IE11bHRpVmFsdWUgfCBTaW5nbGVSYW5nZSB8IE11bHRpUmFuZ2UgfCBTZWFyY2hFeHByZXNzaW9uIHwgTXVsdGlSYW5nZU9yU2VhcmNoRXhwcmVzc2lvblxuXHRcdFx0Y29uc3QgY29tcGxldGVBbGxvd2VkRXhwcyA9IGdldEZpbHRlckFsbG93ZWRFeHByZXNzaW9uKG9QYXJlbnRGUikgfHwge307XG5cdFx0XHRvUGFyZW50UmV0LkZpbHRlckFsbG93ZWRFeHByZXNzaW9ucyA9IE9iamVjdC5rZXlzKGNvbXBsZXRlQWxsb3dlZEV4cHMpLnJlZHVjZShcblx0XHRcdFx0KG91dFByb3A6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPiwgcHJvcFBhdGg6IHN0cmluZykgPT4ge1xuXHRcdFx0XHRcdGlmIChwcm9wUGF0aC5zdGFydHNXaXRoKG5hdlBhdGggKyBcIi9cIikpIHtcblx0XHRcdFx0XHRcdGNvbnN0IG91dFByb3BQYXRoID0gcHJvcFBhdGgucmVwbGFjZShuYXZQYXRoICsgXCIvXCIsIFwiXCIpO1xuXHRcdFx0XHRcdFx0b3V0UHJvcFtvdXRQcm9wUGF0aF0gPSBjb21wbGV0ZUFsbG93ZWRFeHBzW3Byb3BQYXRoXTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIG91dFByb3A7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHt9IGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPlxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHQvL1NpbmdsZVZhbHVlIHwgTXVsdGlWYWx1ZSB8IFNpbmdsZVJhbmdlIHwgTXVsdGlSYW5nZSB8IFNlYXJjaEV4cHJlc3Npb24gfCBNdWx0aVJhbmdlT3JTZWFyY2hFeHByZXNzaW9uXG5cdFx0b1JldC5GaWx0ZXJBbGxvd2VkRXhwcmVzc2lvbnMgPSBtZXJnZU9iamVjdHMoXG5cdFx0XHR7fSxcblx0XHRcdG9SZXQuRmlsdGVyQWxsb3dlZEV4cHJlc3Npb25zIHx8IHt9LFxuXHRcdFx0b1BhcmVudFJldC5GaWx0ZXJBbGxvd2VkRXhwcmVzc2lvbnMgfHwge31cblx0XHQpIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPjtcblxuXHRcdC8vU0VDT05EIEhJR0hFU1QgcHJpb3JpdHkgLSBOYXZpZ2F0aW9uIHJlc3RyaWN0aW9uc1xuXHRcdC8vZS5nLiBQYXJlbnQgXCIvQ3VzdG9tZXJcIiB3aXRoIE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGg9XCJTZXRcIiBDb250ZXh0UGF0aDogQ3VzdG9tZXIvU2V0XG5cdFx0Y29uc3Qgb05hdlJlc3RyaWN0aW9ucyA9IENvbW1vblV0aWxzLmdldE5hdmlnYXRpb25SZXN0cmljdGlvbnMob0NvbnRleHQsIHBhcmVudEVudGl0eVNldFBhdGgsIG5hdlBhdGgucmVwbGFjZUFsbChcIiUyRlwiLCBcIi9cIikpO1xuXHRcdGNvbnN0IG9OYXZGaWx0ZXJSZXN0ID0gb05hdlJlc3RyaWN0aW9ucyAmJiAob05hdlJlc3RyaWN0aW9uc1tcIkZpbHRlclJlc3RyaWN0aW9uc1wiXSBhcyBNZXRhTW9kZWxUeXBlPEZpbHRlclJlc3RyaWN0aW9uc1R5cGU+KTtcblx0XHRjb25zdCBuYXZSZXNSZXFQcm9wcyA9IGdldEZpbHRlclJlc3RyaWN0aW9ucyhvTmF2RmlsdGVyUmVzdCwgXCJSZXF1aXJlZFByb3BlcnRpZXNcIikgfHwgW107XG5cdFx0b1JldC5SZXF1aXJlZFByb3BlcnRpZXMgPSB1bmlxdWVTb3J0KG9SZXQuUmVxdWlyZWRQcm9wZXJ0aWVzLmNvbmNhdChuYXZSZXNSZXFQcm9wcykpO1xuXHRcdGNvbnN0IG5hdk5vbkZpbHRlclByb3BzID0gZ2V0RmlsdGVyUmVzdHJpY3Rpb25zKG9OYXZGaWx0ZXJSZXN0LCBcIk5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzXCIpIHx8IFtdO1xuXHRcdG9SZXQuTm9uRmlsdGVyYWJsZVByb3BlcnRpZXMgPSB1bmlxdWVTb3J0KG9SZXQuTm9uRmlsdGVyYWJsZVByb3BlcnRpZXMuY29uY2F0KG5hdk5vbkZpbHRlclByb3BzKSk7XG5cdFx0Ly9TaW5nbGVWYWx1ZSB8IE11bHRpVmFsdWUgfCBTaW5nbGVSYW5nZSB8IE11bHRpUmFuZ2UgfCBTZWFyY2hFeHByZXNzaW9uIHwgTXVsdGlSYW5nZU9yU2VhcmNoRXhwcmVzc2lvblxuXHRcdG9SZXQuRmlsdGVyQWxsb3dlZEV4cHJlc3Npb25zID0gbWVyZ2VPYmplY3RzKFxuXHRcdFx0e30sXG5cdFx0XHRvUmV0LkZpbHRlckFsbG93ZWRFeHByZXNzaW9ucyB8fCB7fSxcblx0XHRcdGdldEZpbHRlckFsbG93ZWRFeHByZXNzaW9uKG9OYXZGaWx0ZXJSZXN0KSB8fCB7fVxuXHRcdCkgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nW10+O1xuXG5cdFx0Ly9ISUdIRVNUIHByaW9yaXR5IC0gUmVzdHJpY3Rpb25zIGhhdmluZyB0YXJnZXQgd2l0aCBuYXZpZ2F0aW9uIGFzc29jaWF0aW9uIGVudGl0eVxuXHRcdC8vIGUuZy4gRlIgaW4gXCJDdXN0b21lclBhcmFtZXRlcnMvU2V0XCIgQ29udGV4dFBhdGg6IFwiQ3VzdG9tZXIvU2V0XCJcblx0XHRjb25zdCBuYXZBc3NvY2lhdGlvbkVudGl0eVJlc3QgPSBvQ29udGV4dC5nZXRPYmplY3QoXG5cdFx0XHRgLyR7ZW50aXR5VHlwZVBhdGhQYXJ0cy5qb2luKFwiL1wiKX0ke2ZyVGVybX1gXG5cdFx0KSBhcyBNZXRhTW9kZWxUeXBlPEZpbHRlclJlc3RyaWN0aW9uc1R5cGU+O1xuXHRcdGNvbnN0IG5hdkFzc29jUmVxUHJvcHMgPSBnZXRGaWx0ZXJSZXN0cmljdGlvbnMobmF2QXNzb2NpYXRpb25FbnRpdHlSZXN0LCBcIlJlcXVpcmVkUHJvcGVydGllc1wiKSB8fCBbXTtcblx0XHRvUmV0LlJlcXVpcmVkUHJvcGVydGllcyA9IHVuaXF1ZVNvcnQob1JldC5SZXF1aXJlZFByb3BlcnRpZXMuY29uY2F0KG5hdkFzc29jUmVxUHJvcHMpKTtcblx0XHRjb25zdCBuYXZBc3NvY05vbkZpbHRlclByb3BzID0gZ2V0RmlsdGVyUmVzdHJpY3Rpb25zKG5hdkFzc29jaWF0aW9uRW50aXR5UmVzdCwgXCJOb25GaWx0ZXJhYmxlUHJvcGVydGllc1wiKSB8fCBbXTtcblx0XHRvUmV0Lk5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzID0gdW5pcXVlU29ydChvUmV0Lk5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzLmNvbmNhdChuYXZBc3NvY05vbkZpbHRlclByb3BzKSk7XG5cdFx0Ly9TaW5nbGVWYWx1ZSB8IE11bHRpVmFsdWUgfCBTaW5nbGVSYW5nZSB8IE11bHRpUmFuZ2UgfCBTZWFyY2hFeHByZXNzaW9uIHwgTXVsdGlSYW5nZU9yU2VhcmNoRXhwcmVzc2lvblxuXHRcdG9SZXQuRmlsdGVyQWxsb3dlZEV4cHJlc3Npb25zID0gbWVyZ2VPYmplY3RzKFxuXHRcdFx0e30sXG5cdFx0XHRvUmV0LkZpbHRlckFsbG93ZWRFeHByZXNzaW9ucyxcblx0XHRcdGdldEZpbHRlckFsbG93ZWRFeHByZXNzaW9uKG5hdkFzc29jaWF0aW9uRW50aXR5UmVzdCkgfHwge31cblx0XHQpIGFzIF9GaWx0ZXJBbGxvd2VkRXhwcmVzc2lvbnM7XG5cdH1cblx0cmV0dXJuIG9SZXQ7XG59XG5cbnR5cGUgUHJlcHJvY2Vzc29yU2V0dGluZ3MgPSB7XG5cdGJpbmRpbmdDb250ZXh0czogb2JqZWN0O1xuXHRtb2RlbHM6IG9iamVjdDtcbn07XG50eXBlIEJhc2VUcmVlTW9kaWZpZXIgPSB7XG5cdHRlbXBsYXRlQ29udHJvbEZyYWdtZW50KFxuXHRcdHNGcmFnbWVudE5hbWU6IHN0cmluZyxcblx0XHRtUHJlcHJvY2Vzc29yU2V0dGluZ3M6IFByZXByb2Nlc3NvclNldHRpbmdzLFxuXHRcdG9WaWV3PzogVmlld1xuXHQpOiBQcm9taXNlPFVJNUVsZW1lbnRbXSB8IEVsZW1lbnRbXT47XG5cdHRhcmdldHM6IHN0cmluZztcbn07XG5cbmFzeW5jIGZ1bmN0aW9uIHRlbXBsYXRlQ29udHJvbEZyYWdtZW50KFxuXHRzRnJhZ21lbnROYW1lOiBzdHJpbmcsXG5cdG9QcmVwcm9jZXNzb3JTZXR0aW5nczogUHJlcHJvY2Vzc29yU2V0dGluZ3MsXG5cdG9PcHRpb25zOiB7IHZpZXc/OiBWaWV3OyBpc1hNTD86IGJvb2xlYW47IGlkOiBzdHJpbmc7IGNvbnRyb2xsZXI6IENvbnRyb2xsZXIgfSxcblx0b01vZGlmaWVyPzogQmFzZVRyZWVNb2RpZmllclxuKTogUHJvbWlzZTxFbGVtZW50IHwgVUk1RWxlbWVudCB8IEVsZW1lbnRbXSB8IFVJNUVsZW1lbnRbXT4ge1xuXHRvT3B0aW9ucyA9IG9PcHRpb25zIHx8IHt9O1xuXHRpZiAob01vZGlmaWVyKSB7XG5cdFx0cmV0dXJuIG9Nb2RpZmllci50ZW1wbGF0ZUNvbnRyb2xGcmFnbWVudChzRnJhZ21lbnROYW1lLCBvUHJlcHJvY2Vzc29yU2V0dGluZ3MsIG9PcHRpb25zLnZpZXcpLnRoZW4oZnVuY3Rpb24gKG9GcmFnbWVudCkge1xuXHRcdFx0Ly8gVGhpcyBpcyByZXF1aXJlZCBhcyBGbGV4IHJldHVybnMgYW4gSFRNTENvbGxlY3Rpb24gYXMgdGVtcGxhdGluZyByZXN1bHQgaW4gWE1MIHRpbWUuXG5cdFx0XHRyZXR1cm4gb01vZGlmaWVyLnRhcmdldHMgPT09IFwieG1sVHJlZVwiICYmIG9GcmFnbWVudC5sZW5ndGggPiAwID8gb0ZyYWdtZW50WzBdIDogb0ZyYWdtZW50O1xuXHRcdH0pO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBsb2FkTWFjcm9MaWJyYXJ5KClcblx0XHRcdC50aGVuKGFzeW5jIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0cmV0dXJuIFhNTFByZXByb2Nlc3Nvci5wcm9jZXNzKFxuXHRcdFx0XHRcdFhNTFRlbXBsYXRlUHJvY2Vzc29yLmxvYWRUZW1wbGF0ZShzRnJhZ21lbnROYW1lLCBcImZyYWdtZW50XCIpLFxuXHRcdFx0XHRcdHsgbmFtZTogc0ZyYWdtZW50TmFtZSB9LFxuXHRcdFx0XHRcdG9QcmVwcm9jZXNzb3JTZXR0aW5nc1xuXHRcdFx0XHQpO1xuXHRcdFx0fSlcblx0XHRcdC50aGVuKGFzeW5jIGZ1bmN0aW9uIChvRnJhZ21lbnQ6IEVsZW1lbnQpOiBQcm9taXNlPEVsZW1lbnQgfCBDb250cm9sIHwgQ29udHJvbFtdPiB7XG5cdFx0XHRcdGNvbnN0IG9Db250cm9sID0gb0ZyYWdtZW50LmZpcnN0RWxlbWVudENoaWxkO1xuXHRcdFx0XHRpZiAoISFvT3B0aW9ucy5pc1hNTCAmJiBvQ29udHJvbCkge1xuXHRcdFx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUob0NvbnRyb2wpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBGcmFnbWVudC5sb2FkKHtcblx0XHRcdFx0XHRpZDogb09wdGlvbnMuaWQsXG5cdFx0XHRcdFx0ZGVmaW5pdGlvbjogb0ZyYWdtZW50IGFzIHVua25vd24gYXMgc3RyaW5nLFxuXHRcdFx0XHRcdGNvbnRyb2xsZXI6IG9PcHRpb25zLmNvbnRyb2xsZXJcblx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblx0fVxufVxuXG5mdW5jdGlvbiBnZXRTaW5nbGV0b25QYXRoKHBhdGg6IHN0cmluZywgbWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdGNvbnN0IHBhcnRzID0gcGF0aC5zcGxpdChcIi9cIikuZmlsdGVyKEJvb2xlYW4pLFxuXHRcdHByb3BlcnR5TmFtZSA9IHBhcnRzLnBvcCgpLFxuXHRcdG5hdmlnYXRpb25QYXRoID0gcGFydHMuam9pbihcIi9cIiksXG5cdFx0ZW50aXR5U2V0ID0gbmF2aWdhdGlvblBhdGggJiYgbWV0YU1vZGVsLmdldE9iamVjdChgLyR7bmF2aWdhdGlvblBhdGh9YCk7XG5cdGlmIChlbnRpdHlTZXQ/LiRraW5kID09PSBcIlNpbmdsZXRvblwiKSB7XG5cdFx0Y29uc3Qgc2luZ2xldG9uTmFtZSA9IHBhcnRzW3BhcnRzLmxlbmd0aCAtIDFdO1xuXHRcdHJldHVybiBgLyR7c2luZ2xldG9uTmFtZX0vJHtwcm9wZXJ0eU5hbWV9YDtcblx0fVxuXHRyZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZXF1ZXN0U2luZ2xldG9uUHJvcGVydHkocGF0aDogc3RyaW5nLCBtb2RlbDogT0RhdGFNb2RlbCkge1xuXHRpZiAoIXBhdGggfHwgIW1vZGVsKSB7XG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTtcblx0fVxuXHRjb25zdCBtZXRhTW9kZWwgPSBtb2RlbC5nZXRNZXRhTW9kZWwoKTtcblx0Ly8gRmluZCB0aGUgdW5kZXJseWluZyBlbnRpdHkgc2V0IGZyb20gdGhlIHByb3BlcnR5IHBhdGggYW5kIGNoZWNrIHdoZXRoZXIgaXQgaXMgYSBzaW5nbGV0b24uXG5cdGNvbnN0IHJlc29sdmVkUGF0aCA9IGdldFNpbmdsZXRvblBhdGgocGF0aCwgbWV0YU1vZGVsKTtcblx0aWYgKHJlc29sdmVkUGF0aCkge1xuXHRcdGNvbnN0IHByb3BlcnR5QmluZGluZyA9IG1vZGVsLmJpbmRQcm9wZXJ0eShyZXNvbHZlZFBhdGgpO1xuXHRcdHJldHVybiBwcm9wZXJ0eUJpbmRpbmcucmVxdWVzdFZhbHVlKCk7XG5cdH1cblxuXHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpO1xufVxuXG5mdW5jdGlvbiBhZGRFdmVudFRvQmluZGluZ0luZm8ob0NvbnRyb2w6IENvbnRyb2wsIHNFdmVudE5hbWU6IHN0cmluZywgZkhhbmRsZXI6IEZ1bmN0aW9uKSB7XG5cdGxldCBvQmluZGluZ0luZm86IEFnZ3JlZ2F0aW9uQmluZGluZ0luZm87XG5cdGNvbnN0IHNldEJpbmRpbmdJbmZvID0gZnVuY3Rpb24gKCkge1xuXHRcdGlmIChvQmluZGluZ0luZm8pIHtcblx0XHRcdGlmICghb0JpbmRpbmdJbmZvLmV2ZW50cykge1xuXHRcdFx0XHRvQmluZGluZ0luZm8uZXZlbnRzID0ge307XG5cdFx0XHR9XG5cdFx0XHRpZiAoIW9CaW5kaW5nSW5mby5ldmVudHNbc0V2ZW50TmFtZV0pIHtcblx0XHRcdFx0b0JpbmRpbmdJbmZvLmV2ZW50c1tzRXZlbnROYW1lXSA9IGZIYW5kbGVyO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3QgZk9yaWdpbmFsSGFuZGxlciA9IG9CaW5kaW5nSW5mby5ldmVudHNbc0V2ZW50TmFtZV07XG5cdFx0XHRcdG9CaW5kaW5nSW5mby5ldmVudHNbc0V2ZW50TmFtZV0gPSBmdW5jdGlvbiAoLi4uYXJnczogdW5rbm93bltdKSB7XG5cdFx0XHRcdFx0ZkhhbmRsZXIuYXBwbHkodGhpcywgLi4uYXJncyk7XG5cdFx0XHRcdFx0Zk9yaWdpbmFsSGFuZGxlci5hcHBseSh0aGlzLCAuLi5hcmdzKTtcblx0XHRcdFx0fTtcblx0XHRcdH1cblx0XHR9XG5cdH07XG5cdGlmIChvQ29udHJvbC5pc0E8Q2hhcnQgJiBEZWxlZ2F0ZU1peGluPihcInNhcC51aS5tZGMuQ2hhcnRcIikpIHtcblx0XHRvQ29udHJvbFxuXHRcdFx0LmlubmVyQ2hhcnRCb3VuZCgpXG5cdFx0XHQudGhlbihmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdG9CaW5kaW5nSW5mbyA9IG9Db250cm9sLmdldENvbnRyb2xEZWxlZ2F0ZSgpLl9nZXRDaGFydChvQ29udHJvbCkuZ2V0QmluZGluZ0luZm8oXCJkYXRhXCIpO1xuXHRcdFx0XHRzZXRCaW5kaW5nSW5mbygpO1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaChmdW5jdGlvbiAoc0Vycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdExvZy5lcnJvcihzRXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdH0pO1xuXHR9IGVsc2Uge1xuXHRcdG9CaW5kaW5nSW5mbyA9IG9Db250cm9sLmRhdGEoXCJyb3dzQmluZGluZ0luZm9cIik7XG5cdFx0c2V0QmluZGluZ0luZm8oKTtcblx0fVxufVxuXG5hc3luYyBmdW5jdGlvbiBsb2FkTWFjcm9MaWJyYXJ5KCkge1xuXHRyZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oZnVuY3Rpb24gKHJlc29sdmUpIHtcblx0XHRzYXAudWkucmVxdWlyZShbXCJzYXAvZmUvbWFjcm9zL21hY3JvTGlicmFyeVwiXSwgZnVuY3Rpb24gKC8qbWFjcm9MaWJyYXJ5Ki8pIHtcblx0XHRcdHJlc29sdmUoKTtcblx0XHR9KTtcblx0fSk7XG59XG5cbi8vIEdldCB0aGUgcGF0aCBmb3IgYWN0aW9uIHBhcmFtZXRlcnMgdGhhdCBpcyBuZWVkZWQgdG8gcmVhZCB0aGUgYW5ub3RhdGlvbnNcbmZ1bmN0aW9uIGdldFBhcmFtZXRlclBhdGgoc1BhdGg6IHN0cmluZywgc1BhcmFtZXRlcjogc3RyaW5nKSB7XG5cdGxldCBzQ29udGV4dDtcblx0aWYgKHNQYXRoLmluZGV4T2YoXCJAJHVpNS5vdmVybG9hZFwiKSA+IC0xKSB7XG5cdFx0c0NvbnRleHQgPSBzUGF0aC5zcGxpdChcIkAkdWk1Lm92ZXJsb2FkXCIpWzBdO1xuXHR9IGVsc2Uge1xuXHRcdC8vIEZvciBVbmJvdW5kIEFjdGlvbnMgaW4gQWN0aW9uIFBhcmFtZXRlciBEaWFsb2dzXG5cdFx0Y29uc3QgYUFjdGlvbiA9IHNQYXRoLnNwbGl0KFwiLzBcIilbMF0uc3BsaXQoXCIuXCIpO1xuXHRcdHNDb250ZXh0ID0gYC8ke2FBY3Rpb25bYUFjdGlvbi5sZW5ndGggLSAxXX0vYDtcblx0fVxuXHRyZXR1cm4gc0NvbnRleHQgKyBzUGFyYW1ldGVyO1xufVxuXG4vKipcbiAqIEdldCByZXNvbHZlZCBleHByZXNzaW9uIGJpbmRpbmcgdXNlZCBmb3IgdGV4dHMgYXQgcnVudGltZS5cbiAqXG4gKiBAcGFyYW0gZXhwQmluZGluZ1xuICogQHBhcmFtIGNvbnRyb2xcbiAqIEBmdW5jdGlvblxuICogQHN0YXRpY1xuICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLkNvbW1vblV0aWxzXG4gKiBAcmV0dXJucyBBIHN0cmluZyBhZnRlciByZXNvbHV0aW9uLlxuICogQHVpNS1yZXN0cmljdGVkXG4gKi9cbmZ1bmN0aW9uIF9mbnRyYW5zbGF0ZWRUZXh0RnJvbUV4cEJpbmRpbmdTdHJpbmcoZXhwQmluZGluZzogc3RyaW5nLCBjb250cm9sOiBDb250cm9sKSB7XG5cdC8vIFRoZSBpZGVhIGhlcmUgaXMgdG8gY3JlYXRlIGR1bW15IGVsZW1lbnQgd2l0aCB0aGUgZXhwcmVzaW9uIGJpbmRpbmcuXG5cdC8vIEFkZGluZyBpdCBhcyBkZXBlbmRlbnQgdG8gdGhlIHZpZXcvY29udHJvbCB3b3VsZCBwcm9wYWdhdGUgYWxsIHRoZSBtb2RlbHMgdG8gdGhlIGR1bW15IGVsZW1lbnQgYW5kIHJlc29sdmUgdGhlIGJpbmRpbmcuXG5cdC8vIFdlIHJlbW92ZSB0aGUgZHVtbXkgZWxlbWVudCBhZnRlciB0aGF0IGFuZCBkZXN0cm95IGl0LlxuXG5cdGNvbnN0IGFueVJlc291cmNlVGV4dCA9IG5ldyBBbnlFbGVtZW50KHsgYW55VGV4dDogZXhwQmluZGluZyB9KTtcblx0Y29udHJvbC5hZGREZXBlbmRlbnQoYW55UmVzb3VyY2VUZXh0KTtcblx0Y29uc3QgcmVzdWx0VGV4dCA9IGFueVJlc291cmNlVGV4dC5nZXRBbnlUZXh0KCk7XG5cdGNvbnRyb2wucmVtb3ZlRGVwZW5kZW50KGFueVJlc291cmNlVGV4dCk7XG5cdGFueVJlc291cmNlVGV4dC5kZXN0cm95KCk7XG5cblx0cmV0dXJuIHJlc3VsdFRleHQ7XG59XG4vKipcbiAqIENoZWNrIGlmIHRoZSBjdXJyZW50IGRldmljZSBoYXMgYSBzbWFsbCBzY3JlZW4uXG4gKlxuICogQHJldHVybnMgQSBCb29sZWFuLlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gaXNTbWFsbERldmljZSgpIHtcblx0cmV0dXJuICFzeXN0ZW0uZGVza3RvcCB8fCBEZXZpY2UucmVzaXplLndpZHRoIDw9IDMyMDtcbn1cblxuZnVuY3Rpb24gZ2V0Q29udmVydGVyQ29udGV4dEZvclBhdGgoc01ldGFQYXRoOiBzdHJpbmcsIG9NZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsLCBzRW50aXR5U2V0OiBzdHJpbmcsIG9EaWFnbm9zdGljczogRGlhZ25vc3RpY3MpIHtcblx0Y29uc3Qgb0NvbnRleHQgPSBvTWV0YU1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KHNNZXRhUGF0aCkgYXMgT0RhdGFWNENvbnRleHQ7XG5cdHJldHVybiBDb252ZXJ0ZXJDb250ZXh0Py5jcmVhdGVDb252ZXJ0ZXJDb250ZXh0Rm9yTWFjcm8oc0VudGl0eVNldCwgb0NvbnRleHQgfHwgb01ldGFNb2RlbCwgb0RpYWdub3N0aWNzLCBtZXJnZU9iamVjdHMsIHVuZGVmaW5lZCk7XG59XG5cbmNvbnN0IENvbW1vblV0aWxzID0ge1xuXHRpc1Byb3BlcnR5RmlsdGVyYWJsZTogaXNQcm9wZXJ0eUZpbHRlcmFibGUsXG5cdGlzRmllbGRDb250cm9sUGF0aEluYXBwbGljYWJsZTogaXNGaWVsZENvbnRyb2xQYXRoSW5hcHBsaWNhYmxlLFxuXHRyZW1vdmVTZW5zaXRpdmVEYXRhOiByZW1vdmVTZW5zaXRpdmVEYXRhLFxuXHRmaXJlQnV0dG9uUHJlc3M6IGZuRmlyZUJ1dHRvblByZXNzLFxuXHRnZXRUYXJnZXRWaWV3OiBnZXRUYXJnZXRWaWV3LFxuXHRnZXRDdXJyZW50UGFnZVZpZXc6IGdldEN1cnJlbnRQYWdlVmlldyxcblx0aGFzVHJhbnNpZW50Q29udGV4dDogZm5IYXNUcmFuc2llbnRDb250ZXh0cyxcblx0dXBkYXRlUmVsYXRlZEFwcHNEZXRhaWxzOiBmblVwZGF0ZVJlbGF0ZWRBcHBzRGV0YWlscyxcblx0cmVzb2x2ZVN0cmluZ3RvQm9vbGVhbjogZm5SZXNvbHZlU3RyaW5ndG9Cb29sZWFuLFxuXHRnZXRBcHBDb21wb25lbnQ6IGdldEFwcENvbXBvbmVudCxcblx0Z2V0TWFuZGF0b3J5RmlsdGVyRmllbGRzOiBmbkdldE1hbmRhdG9yeUZpbHRlckZpZWxkcyxcblx0Z2V0Q29udGV4dFBhdGhQcm9wZXJ0aWVzOiBmbkdldENvbnRleHRQYXRoUHJvcGVydGllcyxcblx0Z2V0UGFyYW1ldGVySW5mbzogZ2V0UGFyYW1ldGVySW5mbyxcblx0dXBkYXRlRGF0YUZpZWxkRm9ySUJOQnV0dG9uc1Zpc2liaWxpdHk6IGZuVXBkYXRlRGF0YUZpZWxkRm9ySUJOQnV0dG9uc1Zpc2liaWxpdHksXG5cdGdldFRyYW5zbGF0ZWRUZXh0OiBnZXRUcmFuc2xhdGVkVGV4dCxcblx0Z2V0RW50aXR5U2V0TmFtZTogZ2V0RW50aXR5U2V0TmFtZSxcblx0Z2V0QWN0aW9uUGF0aDogZ2V0QWN0aW9uUGF0aCxcblx0Y29tcHV0ZURpc3BsYXlNb2RlOiBjb21wdXRlRGlzcGxheU1vZGUsXG5cdGlzU3RpY2t5RWRpdE1vZGU6IGlzU3RpY2t5RWRpdE1vZGUsXG5cdGdldE9wZXJhdG9yc0ZvclByb3BlcnR5OiBnZXRPcGVyYXRvcnNGb3JQcm9wZXJ0eSxcblx0Z2V0T3BlcmF0b3JzRm9yRGF0ZVByb3BlcnR5OiBnZXRPcGVyYXRvcnNGb3JEYXRlUHJvcGVydHksXG5cdGdldE9wZXJhdG9yc0Zvckd1aWRQcm9wZXJ0eTogZ2V0T3BlcmF0b3JzRm9yR3VpZFByb3BlcnR5LFxuXHRhZGRTZWxlY3Rpb25WYXJpYW50VG9Db25kaXRpb25zOiBhZGRTZWxlY3Rpb25WYXJpYW50VG9Db25kaXRpb25zLFxuXHRhZGRFeHRlcm5hbFN0YXRlRmlsdGVyc1RvU2VsZWN0aW9uVmFyaWFudDogYWRkRXh0ZXJuYWxTdGF0ZUZpbHRlcnNUb1NlbGVjdGlvblZhcmlhbnQsXG5cdGFkZFBhZ2VDb250ZXh0VG9TZWxlY3Rpb25WYXJpYW50OiBhZGRQYWdlQ29udGV4dFRvU2VsZWN0aW9uVmFyaWFudCxcblx0YWRkRGVmYXVsdERpc3BsYXlDdXJyZW5jeTogYWRkRGVmYXVsdERpc3BsYXlDdXJyZW5jeSxcblx0Z2V0Tm9uQ29tcHV0ZWRWaXNpYmxlRmllbGRzOiBnZXROb25Db21wdXRlZFZpc2libGVGaWVsZHMsXG5cdHNldFVzZXJEZWZhdWx0czogc2V0VXNlckRlZmF1bHRzLFxuXHRnZXRTaGVsbFNlcnZpY2VzOiBnZXRTaGVsbFNlcnZpY2VzLFxuXHRnZXRIYXNoOiBnZXRIYXNoLFxuXHRnZXRJQk5BY3Rpb25zOiBmbkdldElCTkFjdGlvbnMsXG5cdGdldEhlYWRlckZhY2V0SXRlbUNvbmZpZ0ZvckV4dGVybmFsTmF2aWdhdGlvbjogZ2V0SGVhZGVyRmFjZXRJdGVtQ29uZmlnRm9yRXh0ZXJuYWxOYXZpZ2F0aW9uLFxuXHRnZXRTZW1hbnRpY09iamVjdE1hcHBpbmc6IGdldFNlbWFudGljT2JqZWN0TWFwcGluZyxcblx0c2V0U2VtYW50aWNPYmplY3RNYXBwaW5nczogc2V0U2VtYW50aWNPYmplY3RNYXBwaW5ncyxcblx0Z2V0U2VtYW50aWNPYmplY3RQcm9taXNlOiBmbkdldFNlbWFudGljT2JqZWN0UHJvbWlzZSxcblx0Z2V0U2VtYW50aWNUYXJnZXRzRnJvbVBhZ2VNb2RlbDogZm5HZXRTZW1hbnRpY1RhcmdldHNGcm9tUGFnZU1vZGVsLFxuXHRnZXRTZW1hbnRpY09iamVjdHNGcm9tUGF0aDogZm5HZXRTZW1hbnRpY09iamVjdHNGcm9tUGF0aCxcblx0dXBkYXRlU2VtYW50aWNUYXJnZXRzOiBmblVwZGF0ZVNlbWFudGljVGFyZ2V0c01vZGVsLFxuXHRnZXRQcm9wZXJ0eURhdGFUeXBlOiBnZXRQcm9wZXJ0eURhdGFUeXBlLFxuXHR3YWl0Rm9yQ29udGV4dFJlcXVlc3RlZDogd2FpdEZvckNvbnRleHRSZXF1ZXN0ZWQsXG5cdGdldE5hdmlnYXRpb25SZXN0cmljdGlvbnM6IGdldE5hdmlnYXRpb25SZXN0cmljdGlvbnMsXG5cdGdldFNlYXJjaFJlc3RyaWN0aW9uczogZ2V0U2VhcmNoUmVzdHJpY3Rpb25zLFxuXHRnZXRGaWx0ZXJSZXN0cmljdGlvbnNCeVBhdGg6IGdldEZpbHRlclJlc3RyaWN0aW9uc0J5UGF0aCxcblx0Z2V0U3BlY2lmaWNBbGxvd2VkRXhwcmVzc2lvbjogZ2V0U3BlY2lmaWNBbGxvd2VkRXhwcmVzc2lvbixcblx0Z2V0QWRkaXRpb25hbFBhcmFtc0ZvckNyZWF0ZTogZ2V0QWRkaXRpb25hbFBhcmFtc0ZvckNyZWF0ZSxcblx0cmVxdWVzdFNpbmdsZXRvblByb3BlcnR5OiByZXF1ZXN0U2luZ2xldG9uUHJvcGVydHksXG5cdHRlbXBsYXRlQ29udHJvbEZyYWdtZW50OiB0ZW1wbGF0ZUNvbnRyb2xGcmFnbWVudCxcblx0YWRkRXZlbnRUb0JpbmRpbmdJbmZvOiBhZGRFdmVudFRvQmluZGluZ0luZm8sXG5cdEZpbHRlclJlc3RyaWN0aW9uczoge1xuXHRcdFJFUVVJUkVEX1BST1BFUlRJRVM6IFwiUmVxdWlyZWRQcm9wZXJ0aWVzXCIsXG5cdFx0Tk9OX0ZJTFRFUkFCTEVfUFJPUEVSVElFUzogXCJOb25GaWx0ZXJhYmxlUHJvcGVydGllc1wiLFxuXHRcdEFMTE9XRURfRVhQUkVTU0lPTlM6IFwiRmlsdGVyQWxsb3dlZEV4cHJlc3Npb25zXCJcblx0fSxcblx0QWxsb3dlZEV4cHJlc3Npb25zUHJpbzogW1wiU2luZ2xlVmFsdWVcIiwgXCJNdWx0aVZhbHVlXCIsIFwiU2luZ2xlUmFuZ2VcIiwgXCJNdWx0aVJhbmdlXCIsIFwiU2VhcmNoRXhwcmVzc2lvblwiLCBcIk11bHRpUmFuZ2VPclNlYXJjaEV4cHJlc3Npb25cIl0sXG5cdG5vcm1hbGl6ZVNlYXJjaFRlcm06IG5vcm1hbGl6ZVNlYXJjaFRlcm0sXG5cdGdldFNpbmdsZXRvblBhdGg6IGdldFNpbmdsZXRvblBhdGgsXG5cdGdldFJlcXVpcmVkUHJvcGVydGllc0Zyb21VcGRhdGVSZXN0cmljdGlvbnM6IGdldFJlcXVpcmVkUHJvcGVydGllc0Zyb21VcGRhdGVSZXN0cmljdGlvbnMsXG5cdGdldFJlcXVpcmVkUHJvcGVydGllc0Zyb21JbnNlcnRSZXN0cmljdGlvbnM6IGdldFJlcXVpcmVkUHJvcGVydGllc0Zyb21JbnNlcnRSZXN0cmljdGlvbnMsXG5cdGhhc1Jlc3RyaWN0ZWRQcm9wZXJ0aWVzSW5Bbm5vdGF0aW9uczogaGFzUmVzdHJpY3RlZFByb3BlcnRpZXNJbkFubm90YXRpb25zLFxuXHRnZXRSZXF1aXJlZFByb3BlcnRpZXNGcm9tQW5ub3RhdGlvbnM6IGdldFJlcXVpcmVkUHJvcGVydGllc0Zyb21Bbm5vdGF0aW9ucyxcblx0Z2V0UmVxdWlyZWRQcm9wZXJ0aWVzOiBnZXRSZXF1aXJlZFByb3BlcnRpZXMsXG5cdGNoZWNrSWZSZXNvdXJjZUtleUV4aXN0czogY2hlY2tJZlJlc291cmNlS2V5RXhpc3RzLFxuXHRzZXRDb250ZXh0c0Jhc2VkT25PcGVyYXRpb25BdmFpbGFibGU6IHNldENvbnRleHRzQmFzZWRPbk9wZXJhdGlvbkF2YWlsYWJsZSxcblx0c2V0RHluYW1pY0FjdGlvbkNvbnRleHRzOiBzZXREeW5hbWljQWN0aW9uQ29udGV4dHMsXG5cdHJlcXVlc3RQcm9wZXJ0eTogcmVxdWVzdFByb3BlcnR5LFxuXHRnZXRQYXJhbWV0ZXJQYXRoOiBnZXRQYXJhbWV0ZXJQYXRoLFxuXHRnZXRSZWxhdGVkQXBwc01lbnVJdGVtczogX2dldFJlbGF0ZWRBcHBzTWVudUl0ZW1zLFxuXHRnZXRUcmFuc2xhdGVkVGV4dEZyb21FeHBCaW5kaW5nU3RyaW5nOiBfZm50cmFuc2xhdGVkVGV4dEZyb21FeHBCaW5kaW5nU3RyaW5nLFxuXHRhZGRTZW1hbnRpY0RhdGVzVG9Db25kaXRpb25zOiBhZGRTZW1hbnRpY0RhdGVzVG9Db25kaXRpb25zLFxuXHRhZGRTZWxlY3RPcHRpb25Ub0NvbmRpdGlvbnM6IGFkZFNlbGVjdE9wdGlvblRvQ29uZGl0aW9ucyxcblx0Y3JlYXRlU2VtYW50aWNEYXRlc0Zyb21Db25kaXRpb25zOiBjcmVhdGVTZW1hbnRpY0RhdGVzRnJvbUNvbmRpdGlvbnMsXG5cdHVwZGF0ZVJlbGF0ZUFwcHNNb2RlbDogdXBkYXRlUmVsYXRlQXBwc01vZGVsLFxuXHRnZXRTZW1hbnRpY09iamVjdEFubm90YXRpb25zOiBfZ2V0U2VtYW50aWNPYmplY3RBbm5vdGF0aW9ucyxcblx0aXNDdXN0b21BZ2dyZWdhdGU6IF9pc0N1c3RvbUFnZ3JlZ2F0ZSxcblx0aXNTbWFsbERldmljZSxcblx0Z2V0Q29udmVydGVyQ29udGV4dEZvclBhdGhcbn07XG5cbmV4cG9y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
1922
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJub3JtYWxpemVTZWFyY2hUZXJtIiwic1NlYXJjaFRlcm0iLCJ1bmRlZmluZWQiLCJyZXBsYWNlIiwic3BsaXQiLCJyZWR1Y2UiLCJzTm9ybWFsaXplZCIsInNDdXJyZW50V29yZCIsIndhaXRGb3JDb250ZXh0UmVxdWVzdGVkIiwiYmluZGluZ0NvbnRleHQiLCJtb2RlbCIsImdldE1vZGVsIiwibWV0YU1vZGVsIiwiZ2V0TWV0YU1vZGVsIiwiZW50aXR5UGF0aCIsImdldE1ldGFQYXRoIiwiZ2V0UGF0aCIsImRhdGFNb2RlbCIsIk1ldGFNb2RlbENvbnZlcnRlciIsImdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyIsImdldENvbnRleHQiLCJyZXF1ZXN0UHJvcGVydHkiLCJ0YXJnZXRFbnRpdHlUeXBlIiwia2V5cyIsIm5hbWUiLCJmbkhhc1RyYW5zaWVudENvbnRleHRzIiwib0xpc3RCaW5kaW5nIiwiYkhhc1RyYW5zaWVudENvbnRleHRzIiwiZ2V0Q3VycmVudENvbnRleHRzIiwiZm9yRWFjaCIsIm9Db250ZXh0IiwiaXNUcmFuc2llbnQiLCJnZXRTaGVsbFNlcnZpY2VzIiwib0NvbnRyb2wiLCJnZXRBcHBDb21wb25lbnQiLCJnZXRIYXNoIiwic0hhc2giLCJ3aW5kb3ciLCJsb2NhdGlvbiIsImhhc2giLCJfZ2V0U09JbnRlbnRzIiwib1NoZWxsU2VydmljZUhlbHBlciIsIm9PYmplY3RQYWdlTGF5b3V0Iiwib1NlbWFudGljT2JqZWN0Iiwib1BhcmFtIiwiZ2V0TGlua3MiLCJzZW1hbnRpY09iamVjdCIsInBhcmFtcyIsIl9jcmVhdGVNYXBwaW5ncyIsIm9NYXBwaW5nIiwiYVNPTWFwcGluZ3MiLCJhTWFwcGluZ0tleXMiLCJPYmplY3QiLCJvU2VtYW50aWNNYXBwaW5nIiwiaSIsImxlbmd0aCIsIkxvY2FsUHJvcGVydHkiLCIkUHJvcGVydHlQYXRoIiwiU2VtYW50aWNPYmplY3RQcm9wZXJ0eSIsInB1c2giLCJfZ2V0UmVsYXRlZEFwcHNNZW51SXRlbXMiLCJhTGlua3MiLCJhRXhjbHVkZWRBY3Rpb25zIiwib1RhcmdldFBhcmFtcyIsImFJdGVtcyIsImFBbGxvd2VkQWN0aW9ucyIsIm9MaW5rIiwic0ludGVudCIsImludGVudCIsInNBY3Rpb24iLCJpbmNsdWRlcyIsInRleHQiLCJ0YXJnZXRTZW1PYmplY3QiLCJ0YXJnZXRBY3Rpb24iLCJ0YXJnZXRQYXJhbXMiLCJpbmRleE9mIiwiX2dldFJlbGF0ZWRJbnRlbnRzIiwib0FkZGl0aW9uYWxTZW1hbnRpY09iamVjdHMiLCJvQmluZGluZ0NvbnRleHQiLCJhTWFuaWZlc3RTT0l0ZW1zIiwiYWxsb3dlZEFjdGlvbnMiLCJ1bmF2YWlsYWJsZUFjdGlvbnMiLCJtYXBwaW5nIiwibmF2aWdhdGlvbkNvbnRleHRzIiwic2VtYW50aWNPYmplY3RNYXBwaW5nIiwiX2dldFJlbGF0ZWRJbnRlbnRzV2l0aFNlbWFudGljT2JqZWN0c0FuZEFjdGlvbiIsInNlbWFudGljT2JqZWN0QW5kQWN0aW9uIiwiYXBwQ29tcG9uZW50U09JdGVtcyIsImFjdGlvbnMiLCJhY3Rpb24iLCJleGNsdWRlZEFjdGlvbnMiLCJzb01hcHBpbmdzIiwidXBkYXRlUmVsYXRlQXBwc01vZGVsIiwib0VudHJ5IiwiYVNlbUtleXMiLCJvTWV0YU1vZGVsIiwib01ldGFQYXRoIiwiYXBwQ29tcG9uZW50Iiwic0N1cnJlbnRTZW1PYmoiLCJzQ3VycmVudEFjdGlvbiIsIm9TZW1hbnRpY09iamVjdEFubm90YXRpb25zIiwiYVJlbGF0ZWRBcHBzTWVudUl0ZW1zIiwiYU1hbmlmZXN0U09LZXlzIiwiZm5HZXRQYXJzZVNoZWxsSGFzaEFuZEdldExpbmtzIiwib1BhcnNlZFVybCIsInBhcnNlU2hlbGxIYXNoIiwiZG9jdW1lbnQiLCJqIiwic1NlbUtleSIsInZhbHVlIiwiYVRlY2huaWNhbEtleXMiLCJnZXRPYmplY3QiLCJrZXkiLCJzT2JqS2V5Iiwib01hbmlmZXN0RGF0YSIsImdldFRhcmdldFZpZXciLCJnZXRWaWV3RGF0YSIsInNlbWFudGljT2JqZWN0SW50ZW50cyIsImFkZGl0aW9uYWxTZW1hbnRpY09iamVjdHMiLCJQcm9taXNlIiwicmVzb2x2ZSIsImNvbXBvbmVudERhdGEiLCJnZXRDb21wb25lbnREYXRhIiwiZmVFbnZpcm9ubWVudCIsImdldEludGVudCIsImludGVybmFsTW9kZWxDb250ZXh0IiwiZ2V0QmluZGluZ0NvbnRleHQiLCJpc1NlbWFudGljT2JqZWN0SGFzU2FtZVRhcmdldEluTWFuaWZlc3QiLCJhQW5ub3RhdGlvbnNTT0l0ZW1zIiwic0VudGl0eVNldFBhdGgiLCJzRW50aXR5VHlwZVBhdGgiLCJvRW50aXR5U2V0QW5ub3RhdGlvbnMiLCJDb21tb25VdGlscyIsImdldFNlbWFudGljT2JqZWN0QW5ub3RhdGlvbnMiLCJiSGFzRW50aXR5U2V0U08iLCJvRW50aXR5VHlwZUFubm90YXRpb25zIiwiYVVuYXZhaWxhYmxlQWN0aW9ucyIsImFNYXBwaW5ncyIsInNvSXRlbXMiLCJjb25jYXQiLCJzZXRQcm9wZXJ0eSIsImVycm9yIiwiTG9nIiwiX2dldFNlbWFudGljT2JqZWN0QW5ub3RhdGlvbnMiLCJvRW50aXR5QW5ub3RhdGlvbnMiLCJzQW5ub3RhdGlvbk1hcHBpbmdUZXJtIiwic0Fubm90YXRpb25BY3Rpb25UZXJtIiwic1F1YWxpZmllciIsImZuVXBkYXRlUmVsYXRlZEFwcHNEZXRhaWxzIiwicGF0aCIsInNTZW1hbnRpY0tleVZvY2FidWxhcnkiLCJyZXF1ZXN0T2JqZWN0IiwidGhlbiIsInJlcXVlc3RlZE9iamVjdCIsImNhdGNoIiwib0Vycm9yIiwiZm5GaXJlQnV0dG9uUHJlc3MiLCJvQnV0dG9uIiwiaXNBIiwiZ2V0VmlzaWJsZSIsImdldEVuYWJsZWQiLCJmaXJlUHJlc3MiLCJmblJlc29sdmVTdHJpbmd0b0Jvb2xlYW4iLCJzVmFsdWUiLCJvT3duZXIiLCJDb21wb25lbnQiLCJnZXRPd25lckNvbXBvbmVudEZvciIsIkVycm9yIiwiZ2V0Q3VycmVudFBhZ2VWaWV3Iiwib0FwcENvbXBvbmVudCIsInJvb3RWaWV3Q29udHJvbGxlciIsImdldFJvb3RWaWV3Q29udHJvbGxlciIsImlzRmNsRW5hYmxlZCIsImdldFJpZ2h0bW9zdFZpZXciLCJnZXRSb290Q29udGFpbmVyIiwiZ2V0Q3VycmVudFBhZ2UiLCJvQ29tcG9uZW50IiwiZ2V0Q29tcG9uZW50SW5zdGFuY2UiLCJnZXRSb290Q29udHJvbCIsImdldFBhcmVudCIsImlzRmllbGRDb250cm9sUGF0aEluYXBwbGljYWJsZSIsInNGaWVsZENvbnRyb2xQYXRoIiwib0F0dHJpYnV0ZSIsImJJbmFwcGxpY2FibGUiLCJhUGFydHMiLCJoYXNPd25Qcm9wZXJ0eSIsInJlbW92ZVNlbnNpdGl2ZURhdGEiLCJhQXR0cmlidXRlcyIsImFPdXRBdHRyaWJ1dGVzIiwic0VudGl0eVNldCIsImVudGl0eVNldCIsImNvbnRleHREYXRhIiwiYVByb3BlcnRpZXMiLCJzUHJvcCIsImFQcm9wZXJ0eUFubm90YXRpb25zIiwib0ZpZWxkQ29udHJvbCIsIl9mbkNoZWNrSXNNYXRjaCIsIm9PYmplY3QiLCJvS2V5c1RvQ2hlY2siLCJzS2V5IiwiZm5HZXRDb250ZXh0UGF0aFByb3BlcnRpZXMiLCJtZXRhTW9kZWxDb250ZXh0Iiwic0NvbnRleHRQYXRoIiwib0ZpbHRlciIsIm9FbnRpdHlUeXBlIiwib1Byb3BlcnRpZXMiLCJ0ZXN0IiwiJGtpbmQiLCJmbkdldE1hbmRhdG9yeUZpbHRlckZpZWxkcyIsImFNYW5kYXRvcnlGaWx0ZXJGaWVsZHMiLCJmbkdldElCTkFjdGlvbnMiLCJhSUJOQWN0aW9ucyIsImFBY3Rpb25zIiwiZ2V0QWN0aW9ucyIsIm9BY3Rpb24iLCJnZXRBY3Rpb24iLCJvTWVudSIsImdldE1lbnUiLCJnZXRJdGVtcyIsIm9JdGVtIiwiZGF0YSIsImZuVXBkYXRlRGF0YUZpZWxkRm9ySUJOQnV0dG9uc1Zpc2liaWxpdHkiLCJvVmlldyIsIm9QYXJhbXMiLCJpc1N0aWNreSIsIk1vZGVsSGVscGVyIiwiaXNTdGlja3lTZXNzaW9uU3VwcG9ydGVkIiwiZm5HZXRMaW5rcyIsIm9EYXRhIiwiYUtleXMiLCJvSUJOQWN0aW9uIiwic1NlbWFudGljT2JqZWN0IiwiYUxpbmsiLCJzZXRWaXNpYmxlIiwiZ2V0SWQiLCJzaGVsbE5hdmlnYXRpb25Ob3RBdmFpbGFibGUiLCJnZXRBY3Rpb25QYXRoIiwiYWN0aW9uQ29udGV4dCIsImJSZXR1cm5Pbmx5UGF0aCIsImluQWN0aW9uTmFtZSIsImJDaGVja1N0YXRpY1ZhbHVlIiwic0FjdGlvbk5hbWUiLCJ0b1N0cmluZyIsInNFbnRpdHlUeXBlTmFtZSIsIiRUeXBlIiwic0VudGl0eU5hbWUiLCJnZXRFbnRpdHlTZXROYW1lIiwic1Byb3BlcnR5Iiwic0JpbmRpbmdQYXJhbWV0ZXIiLCJzRW50aXR5VHlwZSIsIm9FbnRpdHlDb250YWluZXIiLCJjb21wdXRlRGlzcGxheU1vZGUiLCJvUHJvcGVydHlBbm5vdGF0aW9ucyIsIm9Db2xsZWN0aW9uQW5ub3RhdGlvbnMiLCJvVGV4dEFubm90YXRpb24iLCJvVGV4dEFycmFuZ2VtZW50QW5ub3RhdGlvbiIsIiRFbnVtTWVtYmVyIiwiX2dldEVudGl0eVR5cGUiLCJfcmVxdWVzdE9iamVjdCIsIm9TZWxlY3RlZENvbnRleHQiLCJuQnJhY2tldEluZGV4Iiwic1RhcmdldFR5cGUiLCJzbGljZSIsInNDdXJyZW50VHlwZSIsImdldEJpbmRpbmciLCJ3YXJuaW5nIiwic0R5bmFtaWNBY3Rpb25FbmFibGVkUGF0aCIsIm9Qcm9taXNlIiwicmVxdWVzdFNpbmdsZXRvblByb3BlcnR5IiwidlByb3BlcnR5VmFsdWUiLCJzZXRDb250ZXh0c0Jhc2VkT25PcGVyYXRpb25BdmFpbGFibGUiLCJvSW50ZXJuYWxNb2RlbENvbnRleHQiLCJhUmVxdWVzdFByb21pc2VzIiwiYWxsIiwiYVJlc3VsdHMiLCJhQXBwbGljYWJsZUNvbnRleHRzIiwiYU5vdEFwcGxpY2FibGVDb250ZXh0cyIsImFSZXN1bHQiLCJzZXREeW5hbWljQWN0aW9uQ29udGV4dHMiLCJ0cmFjZSIsImFBcHBsaWNhYmxlIiwiYU5vdEFwcGxpY2FibGUiLCJzRHluYW1pY0FjdGlvblBhdGhQcmVmaXgiLCJvSW50ZXJuYWxNb2RlbCIsIl9nZXREZWZhdWx0T3BlcmF0b3JzIiwic1Byb3BlcnR5VHlwZSIsIm9EYXRhQ2xhc3MiLCJUeXBlVXRpbCIsImdldERhdGFUeXBlQ2xhc3NOYW1lIiwib0Jhc2VUeXBlIiwiZ2V0QmFzZVR5cGUiLCJGaWx0ZXJPcGVyYXRvclV0aWwiLCJnZXRPcGVyYXRvcnNGb3JUeXBlIiwiX2dldFJlc3RyaWN0aW9ucyIsImFEZWZhdWx0T3BzIiwiYUV4cHJlc3Npb25PcHMiLCJmaWx0ZXIiLCJzRWxlbWVudCIsImdldFNwZWNpZmljQWxsb3dlZEV4cHJlc3Npb24iLCJhRXhwcmVzc2lvbnMiLCJhQWxsb3dlZEV4cHJlc3Npb25zUHJpb3JpdHkiLCJBbGxvd2VkRXhwcmVzc2lvbnNQcmlvIiwic29ydCIsImEiLCJiIiwiZ2V0T3BlcmF0b3JzRm9yUHJvcGVydHkiLCJzVHlwZSIsImJVc2VTZW1hbnRpY0RhdGVSYW5nZSIsInNTZXR0aW5ncyIsIm9GaWx0ZXJSZXN0cmljdGlvbnMiLCJnZXRGaWx0ZXJSZXN0cmljdGlvbnNCeVBhdGgiLCJhRXF1YWxzT3BzIiwiYVNpbmdsZVJhbmdlT3BzIiwiYVNpbmdsZVJhbmdlRFRCYXNpY09wcyIsImFTaW5nbGVWYWx1ZURhdGVPcHMiLCJhQmFzaWNEYXRlVGltZU9wcyIsImFNdWx0aVJhbmdlT3BzIiwiYVNlYXJjaEV4cHJlc3Npb25PcHMiLCJhU2VtYW50aWNEYXRlT3BzRXh0IiwiU2VtYW50aWNEYXRlT3BlcmF0b3JzIiwiZ2V0U3VwcG9ydGVkT3BlcmF0aW9ucyIsImJTZW1hbnRpY0RhdGVSYW5nZSIsImFTZW1hbnRpY0RhdGVPcHMiLCJvU2V0dGluZ3MiLCJKU09OIiwicGFyc2UiLCJjdXN0b21EYXRhIiwib3BlcmF0b3JDb25maWd1cmF0aW9uIiwiZ2V0RmlsdGVyT3BlcmF0aW9ucyIsImdldFNlbWFudGljRGF0ZU9wZXJhdGlvbnMiLCJhRGVmYXVsdE9wZXJhdG9ycyIsInJlc3RyaWN0aW9ucyIsIkZpbHRlckFsbG93ZWRFeHByZXNzaW9ucyIsInNBbGxvd2VkRXhwcmVzc2lvbiIsImFTaW5nbGVWYWx1ZU9wcyIsInNPcGVyYXRvcnMiLCJnZXRPcGVyYXRvcnNGb3JHdWlkUHJvcGVydHkiLCJhbGxvd2VkT3BlcmF0b3JzRm9yR3VpZCIsImdldE9wZXJhdG9yc0ZvckRhdGVQcm9wZXJ0eSIsInByb3BlcnR5VHlwZSIsImdldFBhcmFtZXRlckluZm8iLCJzUGFyYW1ldGVyQ29udGV4dFBhdGgiLCJzdWJzdHJpbmciLCJsYXN0SW5kZXhPZiIsImJSZXN1bHRDb250ZXh0Iiwib1BhcmFtZXRlckluZm8iLCJjb250ZXh0UGF0aCIsInBhcmFtZXRlclByb3BlcnRpZXMiLCJnZXRDb250ZXh0UGF0aFByb3BlcnRpZXMiLCJhZGRTZWxlY3RPcHRpb25Ub0NvbmRpdGlvbnMiLCJvUHJvcGVydHlNZXRhZGF0YSIsImFWYWxpZE9wZXJhdG9ycyIsImFTZW1hbnRpY0RhdGVPcGVyYXRvcnMiLCJhQ3VtdWxhdGl2ZUNvbmRpdGlvbnMiLCJvU2VsZWN0T3B0aW9uIiwib0NvbmRpdGlvbiIsImdldENvbmRpdGlvbnMiLCJTZW1hbnRpY0RhdGVzIiwib3BlcmF0b3IiLCJzZW1hbnRpY0RhdGVzIiwiYWRkU2VtYW50aWNEYXRlc1RvQ29uZGl0aW9ucyIsIm9TZW1hbnRpY0RhdGVzIiwidmFsdWVzIiwiaGlnaCIsImxvdyIsImlzRW1wdHkiLCJhZGRTZWxlY3RPcHRpb25zVG9Db25kaXRpb25zIiwib1NlbGVjdGlvblZhcmlhbnQiLCJzU2VsZWN0T3B0aW9uUHJvcCIsIm9Db25kaXRpb25zIiwic0NvbmRpdGlvblBhdGgiLCJzQ29uZGl0aW9uUHJvcCIsIm9WYWxpZFByb3BlcnRpZXMiLCJpc1BhcmFtZXRlciIsImJJc0ZMUFZhbHVlUHJlc2VudCIsIm9WaWV3RGF0YSIsImFDb25kaXRpb25zIiwiYVNlbGVjdE9wdGlvbnMiLCJNZXRhTW9kZWxGdW5jdGlvbiIsImlzUHJvcGVydHlGaWx0ZXJhYmxlIiwiZ2V0U2VsZWN0T3B0aW9uIiwic2V0dGluZ3MiLCJnZXRGaWx0ZXJDb25maWd1cmF0aW9uU2V0dGluZyIsImJpbmQiLCJlbGVtZW50IiwiY3JlYXRlU2VtYW50aWNEYXRlc0Zyb21Db25kaXRpb25zIiwib0NvbmZpZyIsImNvbnRyb2xDb25maWd1cmF0aW9uIiwiZmlsdGVyQ29uZmlnIiwiZmlsdGVyRmllbGRzIiwiYWRkU2VsZWN0aW9uVmFyaWFudFRvQ29uZGl0aW9ucyIsIm9NZXRhTW9kZWxDb250ZXh0IiwiYklzRkxQVmFsdWVzIiwiYVNlbGVjdE9wdGlvbnNQcm9wZXJ0eU5hbWVzIiwiZ2V0U2VsZWN0T3B0aW9uc1Byb3BlcnR5TmFtZXMiLCJhTWV0YWRhdFByb3BlcnRpZXMiLCJvVmFsaWRQYXJhbWV0ZXJQcm9wZXJ0aWVzIiwiYU1ldGFkYXRhUGFyYW1ldGVycyIsInNNZXRhZGF0YVBhcmFtZXRlciIsInNTZWxlY3RPcHRpb25OYW1lIiwic3RhcnRzV2l0aCIsInNNZXRhZGF0YVByb3BlcnR5Iiwic1NlbGVjdE9wdGlvbiIsInNSZXBsYWNlZE9wdGlvbiIsInJlcGxhY2VBbGwiLCJzRnVsbENvbnRleHRQYXRoIiwiX2NyZWF0ZUNvbmRpdGlvbnNGb3JOYXZQcm9wZXJ0aWVzIiwic01haW5FbnRpdHlTZXRQYXRoIiwiYU5hdk9iamVjdE5hbWVzIiwic0Z1bGxQYXRoIiwic05hdlBhdGgiLCJzUHJvcGVydHlOYW1lIiwiJGlzQ29sbGVjdGlvbiIsInNOYXZQcm9wZXJ0eVBhdGgiLCJhZGRQYWdlQ29udGV4dFRvU2VsZWN0aW9uVmFyaWFudCIsIm1QYWdlQ29udGV4dCIsIm9OYXZpZ2F0aW9uU2VydmljZSIsImdldE5hdmlnYXRpb25TZXJ2aWNlIiwibWl4QXR0cmlidXRlc0FuZFNlbGVjdGlvblZhcmlhbnQiLCJ0b0pTT05TdHJpbmciLCJhZGRFeHRlcm5hbFN0YXRlRmlsdGVyc1RvU2VsZWN0aW9uVmFyaWFudCIsIm1GaWx0ZXJzIiwib1RhcmdldEluZm8iLCJvRmlsdGVyQmFyIiwic0ZpbHRlciIsImZuR2V0U2lnbkFuZE9wdGlvbiIsInNPcGVyYXRvciIsInNMb3dWYWx1ZSIsInNIaWdoVmFsdWUiLCJvU2VsZWN0T3B0aW9uU3RhdGUiLCJvcHRpb24iLCJzaWduIiwib0ZpbHRlckNvbmRpdGlvbnMiLCJmaWx0ZXJDb25kaXRpb25zIiwib0ZpbHRlcnNXaXRob3V0Q29uZmxpY3QiLCJmaWx0ZXJDb25kaXRpb25zV2l0aG91dENvbmZsaWN0Iiwib1RhYmxlUHJvcGVydGllc1dpdGhvdXRDb25mbGljdCIsInByb3BlcnRpZXNXaXRob3V0Q29uZmxpY3QiLCJhZGRGaWx0ZXJzVG9TZWxlY3Rpb25WYXJpYW50Iiwic2VsZWN0aW9uVmFyaWFudCIsInNGaWx0ZXJOYW1lIiwic1BhdGgiLCJvUHJvcGVydHlJbmZvIiwiZ2V0UHJvcGVydHlIZWxwZXIiLCJnZXRQcm9wZXJ0eSIsIm9UeXBlQ29uZmlnIiwidHlwZUNvbmZpZyIsIm9UeXBlVXRpbCIsImdldENvbnRyb2xEZWxlZ2F0ZSIsImdldFR5cGVVdGlsIiwiaXRlbSIsIm9PcGVyYXRvciIsImdldE9wZXJhdG9yIiwiUmFuZ2VPcGVyYXRvciIsIm9Nb2RlbEZpbHRlciIsImdldE1vZGVsRmlsdGVyIiwidHlwZUluc3RhbmNlIiwiYmFzZVR5cGUiLCJnZXRGaWx0ZXJzIiwiZXhjbHVkZSIsImV4dGVybmFsaXplVmFsdWUiLCJnZXRWYWx1ZTEiLCJnZXRWYWx1ZTIiLCJ2YWx1ZTEiLCJ2YWx1ZTIiLCJhZGRTZWxlY3RPcHRpb24iLCJpc1N0aWNreUVkaXRNb2RlIiwiYklzU3RpY2t5TW9kZSIsImJVSUVkaXRhYmxlIiwiYWRkRGVmYXVsdERpc3BsYXlDdXJyZW5jeSIsIm9TZWxlY3Rpb25WYXJpYW50RGVmYXVsdHMiLCJhU1ZPcHRpb24iLCJhRGVmYXVsdFNWT3B0aW9uIiwiZGlzcGxheUN1cnJlbmN5U2VsZWN0T3B0aW9uIiwic1NpZ24iLCJzT3B0aW9uIiwic0xvdyIsInNIaWdoIiwic2V0VXNlckRlZmF1bHRzIiwiYVBhcmFtZXRlcnMiLCJvTW9kZWwiLCJiSXNBY3Rpb24iLCJiSXNDcmVhdGUiLCJvQWN0aW9uRGVmYXVsdFZhbHVlcyIsIm9Db21wb25lbnREYXRhIiwib1N0YXJ0dXBQYXJhbWV0ZXJzIiwic3RhcnR1cFBhcmFtZXRlcnMiLCJvU2hlbGxTZXJ2aWNlcyIsImhhc1VTaGVsbCIsIm9QYXJhbWV0ZXIiLCIkTmFtZSIsInNQYXJhbWV0ZXJOYW1lIiwiZ2V0U3RhcnR1cEFwcFN0YXRlIiwib1N0YXJ0dXBBcHBTdGF0ZSIsImdldERhdGEiLCJhRXh0ZW5kZWRQYXJhbWV0ZXJzIiwiU2VsZWN0T3B0aW9ucyIsIm9FeHRlbmRlZFBhcmFtZXRlciIsIlByb3BlcnR5TmFtZSIsIm9SYW5nZSIsIlJhbmdlcyIsIlNpZ24iLCJPcHRpb24iLCJMb3ciLCJnZXRBZGRpdGlvbmFsUGFyYW1zRm9yQ3JlYXRlIiwib0luYm91bmRQYXJhbWV0ZXJzIiwib0luYm91bmRzIiwiYUNyZWF0ZVBhcmFtZXRlcnMiLCJzUGFyYW1ldGVyIiwidXNlRm9yQ3JlYXRlIiwib1JldCIsInNDcmVhdGVQYXJhbWV0ZXIiLCJhVmFsdWVzIiwiY3JlYXRlIiwiZ2V0U2VtYW50aWNPYmplY3RNYXBwaW5nIiwib091dGJvdW5kIiwiYVNlbWFudGljT2JqZWN0TWFwcGluZyIsInBhcmFtZXRlcnMiLCJzUGFyYW0iLCJmb3JtYXQiLCJnZXRIZWFkZXJGYWNldEl0ZW1Db25maWdGb3JFeHRlcm5hbE5hdmlnYXRpb24iLCJvQ3Jvc3NOYXYiLCJvSGVhZGVyRmFjZXRJdGVtcyIsInNJZCIsIm9Db250cm9sQ29uZmlnIiwiY29uZmlnIiwic091dGJvdW5kIiwibmF2aWdhdGlvbiIsInRhcmdldE91dGJvdW5kIiwib3V0Ym91bmQiLCJnZW5lcmF0ZSIsInNldFNlbWFudGljT2JqZWN0TWFwcGluZ3MiLCJ2TWFwcGluZ3MiLCJvTWFwcGluZ3MiLCJzTG9jYWxQcm9wZXJ0eSIsInNTZW1hbnRpY09iamVjdFByb3BlcnR5IiwicmVtb3ZlU2VsZWN0T3B0aW9uIiwibWFzc0FkZFNlbGVjdE9wdGlvbiIsImZuR2V0U2VtYW50aWNPYmplY3RzRnJvbVBhdGgiLCJhU2VtYW50aWNPYmplY3RVbmF2YWlsYWJsZUFjdGlvbnMiLCJhU2VtYW50aWNPYmplY3RGb3JHZXRMaW5rcyIsInNlbWFudGljT2JqZWN0UGF0aCIsInNlbWFudGljT2JqZWN0Rm9yR2V0TGlua3MiLCJmblVwZGF0ZVNlbWFudGljVGFyZ2V0c01vZGVsIiwiYUdldExpbmtzUHJvbWlzZXMiLCJhU2VtYW50aWNPYmplY3RzIiwic0N1cnJlbnRIYXNoIiwiX29MaW5rIiwiX3NMaW5rSW50ZW50QWN0aW9uIiwiYUZpbmFsTGlua3MiLCJvRmluYWxTZW1hbnRpY09iamVjdHMiLCJiSW50ZW50SGFzQWN0aW9ucyIsImsiLCJvVG1wIiwic0FsdGVybmF0ZVBhdGgiLCJoYXNUYXJnZXRzTm90RmlsdGVyZWQiLCJoYXNUYXJnZXRzIiwiaUxpbmtDb3VudCIsIkhhc1RhcmdldHMiLCJIYXNUYXJnZXRzTm90RmlsdGVyZWQiLCJhc3NpZ24iLCJzU2VtYW50aWNPYmplY3ROYW1lIiwibWVyZ2VPYmplY3RzIiwiZm5HZXRTZW1hbnRpY09iamVjdFByb21pc2UiLCJnZXRTZW1hbnRpY09iamVjdHNGcm9tUGF0aCIsImZuUHJlcGFyZVNlbWFudGljT2JqZWN0c1Byb21pc2VzIiwiX29BcHBDb21wb25lbnQiLCJfb1ZpZXciLCJfb01ldGFNb2RlbCIsIl9hU2VtYW50aWNPYmplY3RzRm91bmQiLCJfYVNlbWFudGljT2JqZWN0c1Byb21pc2VzIiwiX0tleXMiLCJyZWdleFJlc3VsdCIsImluZGV4IiwiZXhlYyIsImdldFNlbWFudGljT2JqZWN0UHJvbWlzZSIsImZuR2V0U2VtYW50aWNUYXJnZXRzRnJvbVBhZ2VNb2RlbCIsIm9Db250cm9sbGVyIiwic1BhZ2VNb2RlbCIsIl9mbmZpbmRWYWx1ZXNIZWxwZXIiLCJvYmoiLCJsaXN0IiwiQXJyYXkiLCJjaGlsZHJlbiIsIl9mbmZpbmRWYWx1ZXMiLCJfZm5EZWxldGVEdXBsaWNhdGVTZW1hbnRpY09iamVjdHMiLCJhU2VtYW50aWNPYmplY3RQYXRoIiwiZ2V0VmlldyIsImFTZW1hbnRpY09iamVjdHNQcm9taXNlcyIsImdldE93bmVyQ29tcG9uZW50Iiwib1BhZ2VNb2RlbCIsInN0cmluZ2lmeSIsIl9nZXRPYmplY3QiLCJhU2VtYW50aWNPYmplY3RzRm91bmQiLCJhU2VtYW50aWNPYmplY3RzRm9yR2V0TGlua3MiLCJfb1NlbWFudGljT2JqZWN0Iiwic1NlbU9iakV4cHJlc3Npb24iLCJhU2VtYW50aWNPYmplY3RzUmVzb2x2ZWQiLCJjb21waWxlRXhwcmVzc2lvbiIsInBhdGhJbk1vZGVsIiwiJFBhdGgiLCJnZXRMaW5rc1dpdGhDYWNoZSIsInVwZGF0ZVNlbWFudGljVGFyZ2V0cyIsImdldEZpbHRlckFsbG93ZWRFeHByZXNzaW9uIiwib0ZpbHRlclJlc3RyaWN0aW9uc0Fubm90YXRpb24iLCJtQWxsb3dlZEV4cHJlc3Npb25zIiwiRmlsdGVyRXhwcmVzc2lvblJlc3RyaWN0aW9ucyIsIm9Qcm9wZXJ0eSIsIlByb3BlcnR5IiwiQWxsb3dlZEV4cHJlc3Npb25zIiwiZ2V0RmlsdGVyUmVzdHJpY3Rpb25zIiwic1Jlc3RyaWN0aW9uIiwiYVByb3BzIiwibWFwIiwiX2ZldGNoUHJvcGVydGllc0Zvck5hdlBhdGgiLCJwYXRocyIsIm5hdlBhdGgiLCJwcm9wcyIsIm5hdlBhdGhQcmVmaXgiLCJvdXRQYXRocyIsInBhdGhUb0NoZWNrIiwib3V0UGF0aCIsIlJlcXVpcmVkUHJvcGVydGllcyIsIk5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzIiwibmF2aWdhdGlvblRleHQiLCJmclRlcm0iLCJlbnRpdHlUeXBlUGF0aFBhcnRzIiwiZmlsdGVyT3V0TmF2UHJvcEJpbmRpbmciLCJlbnRpdHlUeXBlUGF0aCIsImpvaW4iLCJlbnRpdHlTZXRQYXRoIiwiZ2V0RW50aXR5U2V0UGF0aCIsImVudGl0eVNldFBhdGhQYXJ0cyIsImlzQ29udGFpbm1lbnQiLCJjb250YWlubWVudE5hdlBhdGgiLCJyZXN1bHRDb250ZXh0Q2hlY2siLCJwYXJlbnRFbnRpdHlTZXRQYXRoIiwib1BhcmVudFJldCIsIm9QYXJlbnRGUiIsImNvbXBsZXRlQWxsb3dlZEV4cHMiLCJvdXRQcm9wIiwicHJvcFBhdGgiLCJvdXRQcm9wUGF0aCIsIm9OYXZSZXN0cmljdGlvbnMiLCJnZXROYXZpZ2F0aW9uUmVzdHJpY3Rpb25zIiwib05hdkZpbHRlclJlc3QiLCJuYXZSZXNSZXFQcm9wcyIsInVuaXF1ZVNvcnQiLCJuYXZOb25GaWx0ZXJQcm9wcyIsIm5hdkFzc29jaWF0aW9uRW50aXR5UmVzdCIsIm5hdkFzc29jUmVxUHJvcHMiLCJuYXZBc3NvY05vbkZpbHRlclByb3BzIiwidGVtcGxhdGVDb250cm9sRnJhZ21lbnQiLCJzRnJhZ21lbnROYW1lIiwib1ByZXByb2Nlc3NvclNldHRpbmdzIiwib09wdGlvbnMiLCJvTW9kaWZpZXIiLCJ2aWV3Iiwib0ZyYWdtZW50IiwidGFyZ2V0cyIsImxvYWRNYWNyb0xpYnJhcnkiLCJYTUxQcmVwcm9jZXNzb3IiLCJwcm9jZXNzIiwiWE1MVGVtcGxhdGVQcm9jZXNzb3IiLCJsb2FkVGVtcGxhdGUiLCJmaXJzdEVsZW1lbnRDaGlsZCIsImlzWE1MIiwiRnJhZ21lbnQiLCJsb2FkIiwiaWQiLCJkZWZpbml0aW9uIiwiY29udHJvbGxlciIsImdldFNpbmdsZXRvblBhdGgiLCJwYXJ0cyIsIkJvb2xlYW4iLCJwcm9wZXJ0eU5hbWUiLCJwb3AiLCJuYXZpZ2F0aW9uUGF0aCIsInNpbmdsZXRvbk5hbWUiLCJyZXNvbHZlZFBhdGgiLCJwcm9wZXJ0eUJpbmRpbmciLCJiaW5kUHJvcGVydHkiLCJyZXF1ZXN0VmFsdWUiLCJhZGRFdmVudFRvQmluZGluZ0luZm8iLCJzRXZlbnROYW1lIiwiZkhhbmRsZXIiLCJvQmluZGluZ0luZm8iLCJzZXRCaW5kaW5nSW5mbyIsImV2ZW50cyIsImZPcmlnaW5hbEhhbmRsZXIiLCJhcmdzIiwiYXBwbHkiLCJpbm5lckNoYXJ0Qm91bmQiLCJfZ2V0Q2hhcnQiLCJnZXRCaW5kaW5nSW5mbyIsInNFcnJvciIsInNhcCIsInVpIiwicmVxdWlyZSIsImdldFBhcmFtZXRlclBhdGgiLCJzQ29udGV4dCIsImFBY3Rpb24iLCJfZm50cmFuc2xhdGVkVGV4dEZyb21FeHBCaW5kaW5nU3RyaW5nIiwiZXhwQmluZGluZyIsImNvbnRyb2wiLCJhbnlSZXNvdXJjZVRleHQiLCJBbnlFbGVtZW50IiwiYW55VGV4dCIsImFkZERlcGVuZGVudCIsInJlc3VsdFRleHQiLCJnZXRBbnlUZXh0IiwicmVtb3ZlRGVwZW5kZW50IiwiZGVzdHJveSIsImlzU21hbGxEZXZpY2UiLCJzeXN0ZW0iLCJkZXNrdG9wIiwiRGV2aWNlIiwicmVzaXplIiwid2lkdGgiLCJnZXRGaWx0ZXJzSW5mb0ZvclNWIiwic2VsZWN0aW9uVmFyaWFudFBhdGgiLCJpc0NoYXJ0IiwibVByb3BlcnR5RmlsdGVycyIsImFGaWx0ZXJzIiwiYVBhdGhzIiwic1RleHQiLCJTZWxlY3Rpb25WYXJpYW50IiwiVGV4dCIsIkZpbHRlciIsIkhpZ2giLCJzUHJvcGVydHlQYXRoIiwiZmlsdGVycyIsImFuZCIsInByb3BlcnRpZXMiLCJnZXRDb252ZXJ0ZXJDb250ZXh0Rm9yUGF0aCIsInNNZXRhUGF0aCIsIm9EaWFnbm9zdGljcyIsImNyZWF0ZUJpbmRpbmdDb250ZXh0IiwiQ29udmVydGVyQ29udGV4dCIsImNyZWF0ZUNvbnZlcnRlckNvbnRleHRGb3JNYWNybyIsImdldEludGVybmFsQ2hhcnROYW1lRnJvbVByb3BlcnR5TmFtZUFuZEtpbmQiLCJraW5kIiwiZ2V0Q2hhcnRQcm9wZXJ0aWVzV2l0aG91dFByZWZpeGVzIiwiZmlyZUJ1dHRvblByZXNzIiwiaGFzVHJhbnNpZW50Q29udGV4dCIsInVwZGF0ZVJlbGF0ZWRBcHBzRGV0YWlscyIsInJlc29sdmVTdHJpbmd0b0Jvb2xlYW4iLCJnZXRNYW5kYXRvcnlGaWx0ZXJGaWVsZHMiLCJ1cGRhdGVEYXRhRmllbGRGb3JJQk5CdXR0b25zVmlzaWJpbGl0eSIsImdldElCTkFjdGlvbnMiLCJnZXRTZW1hbnRpY1RhcmdldHNGcm9tUGFnZU1vZGVsIiwiRmlsdGVyUmVzdHJpY3Rpb25zIiwiUkVRVUlSRURfUFJPUEVSVElFUyIsIk5PTl9GSUxURVJBQkxFX1BST1BFUlRJRVMiLCJBTExPV0VEX0VYUFJFU1NJT05TIiwiZ2V0UmVsYXRlZEFwcHNNZW51SXRlbXMiLCJnZXRUcmFuc2xhdGVkVGV4dEZyb21FeHBCaW5kaW5nU3RyaW5nIl0sInNvdXJjZVJvb3QiOiIuIiwic291cmNlcyI6WyJDb21tb25VdGlscy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSAqIGFzIEVkbSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvRWRtXCI7XG5pbXBvcnQgdHlwZSB7IEZpbHRlclJlc3RyaWN0aW9uc1R5cGUgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL0NhcGFiaWxpdGllc1wiO1xuaW1wb3J0IHR5cGUgeyBTZW1hbnRpY09iamVjdE1hcHBpbmdUeXBlLCBTZW1hbnRpY09iamVjdFVuYXZhaWxhYmxlQWN0aW9ucyB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvQ29tbW9uXCI7XG5pbXBvcnQgeyBDb21tb25Bbm5vdGF0aW9uVGVybXMgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL0NvbW1vblwiO1xuaW1wb3J0IHR5cGUgeyBUZXh0QXJyYW5nZW1lbnQgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL1VJXCI7XG5pbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCB1bmlxdWVTb3J0IGZyb20gXCJzYXAvYmFzZS91dGlsL2FycmF5L3VuaXF1ZVNvcnRcIjtcbmltcG9ydCBtZXJnZU9iamVjdHMgZnJvbSBcInNhcC9iYXNlL3V0aWwvbWVyZ2VcIjtcbmltcG9ydCB0eXBlIEFwcENvbXBvbmVudCBmcm9tIFwic2FwL2ZlL2NvcmUvQXBwQ29tcG9uZW50XCI7XG5pbXBvcnQgdHlwZSB7IENvbXBvbmVudERhdGEgfSBmcm9tIFwic2FwL2ZlL2NvcmUvQXBwQ29tcG9uZW50XCI7XG5pbXBvcnQgQ29udmVydGVyQ29udGV4dCBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9Db252ZXJ0ZXJDb250ZXh0XCI7XG5pbXBvcnQgKiBhcyBNZXRhTW9kZWxDb252ZXJ0ZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWV0YU1vZGVsQ29udmVydGVyXCI7XG5pbXBvcnQgeyBjb21waWxlRXhwcmVzc2lvbiwgcGF0aEluTW9kZWwgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9CaW5kaW5nVG9vbGtpdFwiO1xuaW1wb3J0IHR5cGUgeyBJbnRlcm5hbE1vZGVsQ29udGV4dCB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01vZGVsSGVscGVyXCI7XG5pbXBvcnQgTW9kZWxIZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTW9kZWxIZWxwZXJcIjtcbmltcG9ydCBTZW1hbnRpY0RhdGVPcGVyYXRvcnMgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvU2VtYW50aWNEYXRlT3BlcmF0b3JzXCI7XG5pbXBvcnQgeyBnZW5lcmF0ZSB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1N0YWJsZUlkSGVscGVyXCI7XG5pbXBvcnQgdHlwZSBQYWdlQ29udHJvbGxlciBmcm9tIFwic2FwL2ZlL2NvcmUvUGFnZUNvbnRyb2xsZXJcIjtcbmltcG9ydCB0eXBlIHsgSVNoZWxsU2VydmljZXMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvc2VydmljZXMvU2hlbGxTZXJ2aWNlc0ZhY3RvcnlcIjtcbmltcG9ydCB0eXBlIERpYWdub3N0aWNzIGZyb20gXCJzYXAvZmUvY29yZS9zdXBwb3J0L0RpYWdub3N0aWNzXCI7XG5pbXBvcnQgVHlwZVV0aWwgZnJvbSBcInNhcC9mZS9jb3JlL3R5cGUvVHlwZVV0aWxcIjtcbmltcG9ydCB0eXBlIFNlbGVjdGlvblZhcmlhbnQgZnJvbSBcInNhcC9mZS9uYXZpZ2F0aW9uL1NlbGVjdGlvblZhcmlhbnRcIjtcbmltcG9ydCB0eXBlIHsgU2VsZWN0T3B0aW9uLCBTZW1hbnRpY0RhdGVDb25maWd1cmF0aW9uIH0gZnJvbSBcInNhcC9mZS9uYXZpZ2F0aW9uL1NlbGVjdGlvblZhcmlhbnRcIjtcbmltcG9ydCB0eXBlIEJ1dHRvbiBmcm9tIFwic2FwL20vQnV0dG9uXCI7XG5pbXBvcnQgdHlwZSBNZW51QnV0dG9uIGZyb20gXCJzYXAvbS9NZW51QnV0dG9uXCI7XG5pbXBvcnQgdHlwZSBOYXZDb250YWluZXIgZnJvbSBcInNhcC9tL05hdkNvbnRhaW5lclwiO1xuaW1wb3J0IHR5cGUgT3ZlcmZsb3dUb29sYmFyQnV0dG9uIGZyb20gXCJzYXAvbS9PdmVyZmxvd1Rvb2xiYXJCdXR0b25cIjtcbmltcG9ydCB0eXBlIE1hbmFnZWRPYmplY3QgZnJvbSBcInNhcC91aS9iYXNlL01hbmFnZWRPYmplY3RcIjtcbmltcG9ydCB0eXBlIHsgQWdncmVnYXRpb25CaW5kaW5nSW5mbyB9IGZyb20gXCJzYXAvdWkvYmFzZS9NYW5hZ2VkT2JqZWN0XCI7XG5pbXBvcnQgQ29tcG9uZW50IGZyb20gXCJzYXAvdWkvY29yZS9Db21wb25lbnRcIjtcbmltcG9ydCB0eXBlIENvbXBvbmVudENvbnRhaW5lciBmcm9tIFwic2FwL3VpL2NvcmUvQ29tcG9uZW50Q29udGFpbmVyXCI7XG5pbXBvcnQgdHlwZSBDb250cm9sIGZyb20gXCJzYXAvdWkvY29yZS9Db250cm9sXCI7XG5pbXBvcnQgdHlwZSBVSTVFbGVtZW50IGZyb20gXCJzYXAvdWkvY29yZS9FbGVtZW50XCI7XG5pbXBvcnQgRnJhZ21lbnQgZnJvbSBcInNhcC91aS9jb3JlL0ZyYWdtZW50XCI7XG5pbXBvcnQgdHlwZSBDb250cm9sbGVyIGZyb20gXCJzYXAvdWkvY29yZS9tdmMvQ29udHJvbGxlclwiO1xuaW1wb3J0IHR5cGUgVmlldyBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL1ZpZXdcIjtcbmltcG9ydCBYTUxQcmVwcm9jZXNzb3IgZnJvbSBcInNhcC91aS9jb3JlL3V0aWwvWE1MUHJlcHJvY2Vzc29yXCI7XG5pbXBvcnQgWE1MVGVtcGxhdGVQcm9jZXNzb3IgZnJvbSBcInNhcC91aS9jb3JlL1hNTFRlbXBsYXRlUHJvY2Vzc29yXCI7XG5pbXBvcnQgRGV2aWNlLCB7IHN5c3RlbSB9IGZyb20gXCJzYXAvdWkvRGV2aWNlXCI7XG5pbXBvcnQgdHlwZSBBY3Rpb25Ub29sYmFyQWN0aW9uIGZyb20gXCJzYXAvdWkvbWRjL2FjdGlvbnRvb2xiYXIvQWN0aW9uVG9vbGJhckFjdGlvblwiO1xuaW1wb3J0IHR5cGUgeyBkZWZhdWx0IGFzIENoYXJ0LCBkZWZhdWx0IGFzIE1EQ0NoYXJ0IH0gZnJvbSBcInNhcC91aS9tZGMvQ2hhcnRcIjtcbmltcG9ydCB0eXBlIHsgQ29uZGl0aW9uT2JqZWN0IH0gZnJvbSBcInNhcC91aS9tZGMvY29uZGl0aW9uL0NvbmRpdGlvblwiO1xuaW1wb3J0IEZpbHRlck9wZXJhdG9yVXRpbCBmcm9tIFwic2FwL3VpL21kYy9jb25kaXRpb24vRmlsdGVyT3BlcmF0b3JVdGlsXCI7XG5pbXBvcnQgUmFuZ2VPcGVyYXRvciBmcm9tIFwic2FwL3VpL21kYy9jb25kaXRpb24vUmFuZ2VPcGVyYXRvclwiO1xuaW1wb3J0IHR5cGUgRmlsdGVyQmFyIGZyb20gXCJzYXAvdWkvbWRjL0ZpbHRlckJhclwiO1xuaW1wb3J0IHR5cGUgRGVsZWdhdGVNaXhpbiBmcm9tIFwic2FwL3VpL21kYy9taXhpbi9EZWxlZ2F0ZU1peGluXCI7XG5pbXBvcnQgdHlwZSBUYWJsZSBmcm9tIFwic2FwL3VpL21kYy9UYWJsZVwiO1xuaW1wb3J0IHR5cGUgTURDVGFibGUgZnJvbSBcInNhcC91aS9tZGMvdmFsdWVoZWxwL2NvbnRlbnQvTURDVGFibGVcIjtcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9Db250ZXh0XCI7XG5pbXBvcnQgRmlsdGVyIGZyb20gXCJzYXAvdWkvbW9kZWwvRmlsdGVyXCI7XG5pbXBvcnQgdHlwZSBKU09OTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9qc29uL0pTT05Nb2RlbFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFWNENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgdHlwZSBPRGF0YUxpc3RCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFMaXN0QmluZGluZ1wiO1xuaW1wb3J0IHR5cGUgT0RhdGFNZXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1ldGFNb2RlbFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTW9kZWxcIjtcbmltcG9ydCB0eXBlIE9iamVjdFBhZ2VEeW5hbWljSGVhZGVyVGl0bGUgZnJvbSBcInNhcC91eGFwL09iamVjdFBhZ2VEeW5hbWljSGVhZGVyVGl0bGVcIjtcbmltcG9ydCB0eXBlIE9iamVjdFBhZ2VMYXlvdXQgZnJvbSBcInNhcC91eGFwL09iamVjdFBhZ2VMYXlvdXRcIjtcbmltcG9ydCB0eXBlIHtcblx0RXhwYW5kUGF0aFR5cGUsXG5cdE1ldGFNb2RlbEVudGl0eVR5cGUsXG5cdE1ldGFNb2RlbEVudW0sXG5cdE1ldGFNb2RlbE5hdlByb3BlcnR5LFxuXHRNZXRhTW9kZWxQcm9wZXJ0eSxcblx0TWV0YU1vZGVsVHlwZVxufSBmcm9tIFwidHlwZXMvbWV0YW1vZGVsX3R5cGVzXCI7XG5pbXBvcnQgQW55RWxlbWVudCBmcm9tIFwiLi9jb250cm9scy9BbnlFbGVtZW50XCI7XG5pbXBvcnQgKiBhcyBNZXRhTW9kZWxGdW5jdGlvbiBmcm9tIFwiLi9oZWxwZXJzL01ldGFNb2RlbEZ1bmN0aW9uXCI7XG5pbXBvcnQgeyBnZXRDb25kaXRpb25zIH0gZnJvbSBcIi4vdGVtcGxhdGluZy9GaWx0ZXJIZWxwZXJcIjtcblxudHlwZSBDb25kaXRpb25UeXBlID0ge1xuXHRvcGVyYXRvcjogc3RyaW5nO1xuXHR2YWx1ZXM6IEFycmF5PHVua25vd24+IHwgdW5kZWZpbmVkO1xuXHR2YWxpZGF0ZWQ/OiBzdHJpbmc7XG59O1xuXG50eXBlIE15SW5ib3hJbnRlbnQgPSB7XG5cdHNlbWFudGljT2JqZWN0OiBzdHJpbmc7XG5cdGFjdGlvbjogc3RyaW5nO1xufTtcblxuZnVuY3Rpb24gbm9ybWFsaXplU2VhcmNoVGVybShzU2VhcmNoVGVybTogc3RyaW5nKSB7XG5cdGlmICghc1NlYXJjaFRlcm0pIHtcblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cblx0cmV0dXJuIHNTZWFyY2hUZXJtXG5cdFx0LnJlcGxhY2UoL1wiL2csIFwiIFwiKVxuXHRcdC5yZXBsYWNlKC9cXFxcL2csIFwiXFxcXFxcXFxcIikgLy9lc2NhcGUgYmFja3NsYXNoIGNoYXJhY3RlcnMuIENhbiBiZSByZW1vdmVkIGlmIG9kYXRhL2JpbmRpbmcgaGFuZGxlcyBiYWNrZW5kIGVycm9ycyByZXNwb25kcy5cblx0XHQuc3BsaXQoL1xccysvKVxuXHRcdC5yZWR1Y2UoZnVuY3Rpb24gKHNOb3JtYWxpemVkOiBzdHJpbmcgfCB1bmRlZmluZWQsIHNDdXJyZW50V29yZDogc3RyaW5nKSB7XG5cdFx0XHRpZiAoc0N1cnJlbnRXb3JkICE9PSBcIlwiKSB7XG5cdFx0XHRcdHNOb3JtYWxpemVkID0gYCR7c05vcm1hbGl6ZWQgPyBgJHtzTm9ybWFsaXplZH0gYCA6IFwiXCJ9XCIke3NDdXJyZW50V29yZH1cImA7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gc05vcm1hbGl6ZWQ7XG5cdFx0fSwgdW5kZWZpbmVkKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gd2FpdEZvckNvbnRleHRSZXF1ZXN0ZWQoYmluZGluZ0NvbnRleHQ6IE9EYXRhVjRDb250ZXh0KSB7XG5cdGNvbnN0IG1vZGVsID0gYmluZGluZ0NvbnRleHQuZ2V0TW9kZWwoKTtcblx0Y29uc3QgbWV0YU1vZGVsID0gbW9kZWwuZ2V0TWV0YU1vZGVsKCk7XG5cdGNvbnN0IGVudGl0eVBhdGggPSBtZXRhTW9kZWwuZ2V0TWV0YVBhdGgoYmluZGluZ0NvbnRleHQuZ2V0UGF0aCgpKTtcblx0Y29uc3QgZGF0YU1vZGVsID0gTWV0YU1vZGVsQ29udmVydGVyLmdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyhtZXRhTW9kZWwuZ2V0Q29udGV4dChlbnRpdHlQYXRoKSk7XG5cdGF3YWl0IGJpbmRpbmdDb250ZXh0LnJlcXVlc3RQcm9wZXJ0eShkYXRhTW9kZWwudGFyZ2V0RW50aXR5VHlwZS5rZXlzWzBdPy5uYW1lKTtcbn1cblxuZnVuY3Rpb24gZm5IYXNUcmFuc2llbnRDb250ZXh0cyhvTGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcpIHtcblx0bGV0IGJIYXNUcmFuc2llbnRDb250ZXh0cyA9IGZhbHNlO1xuXHRpZiAob0xpc3RCaW5kaW5nKSB7XG5cdFx0b0xpc3RCaW5kaW5nLmdldEN1cnJlbnRDb250ZXh0cygpLmZvckVhY2goZnVuY3Rpb24gKG9Db250ZXh0OiBPRGF0YVY0Q29udGV4dCkge1xuXHRcdFx0aWYgKG9Db250ZXh0ICYmIG9Db250ZXh0LmlzVHJhbnNpZW50KCkpIHtcblx0XHRcdFx0Ykhhc1RyYW5zaWVudENvbnRleHRzID0gdHJ1ZTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXHRyZXR1cm4gYkhhc1RyYW5zaWVudENvbnRleHRzO1xufVxuXG4vLyB0aGVyZSBpcyBubyBuYXZpZ2F0aW9uIGluIGVudGl0eVNldCBwYXRoIGFuZCBwcm9wZXJ0eSBwYXRoXG5cbmZ1bmN0aW9uIGdldFNoZWxsU2VydmljZXMob0NvbnRyb2w6IENvbnRyb2wgfCBDb21wb25lbnQpOiBJU2hlbGxTZXJ2aWNlcyB7XG5cdHJldHVybiBnZXRBcHBDb21wb25lbnQob0NvbnRyb2wpLmdldFNoZWxsU2VydmljZXMoKTtcbn1cblxuZnVuY3Rpb24gZ2V0SGFzaCgpOiBzdHJpbmcge1xuXHRjb25zdCBzSGFzaCA9IHdpbmRvdy5sb2NhdGlvbi5oYXNoO1xuXHRyZXR1cm4gc0hhc2guc3BsaXQoXCImXCIpWzBdO1xufVxuXG5hc3luYyBmdW5jdGlvbiBfZ2V0U09JbnRlbnRzKFxuXHRvU2hlbGxTZXJ2aWNlSGVscGVyOiBJU2hlbGxTZXJ2aWNlcyxcblx0b09iamVjdFBhZ2VMYXlvdXQ6IE9iamVjdFBhZ2VMYXlvdXQsXG5cdG9TZW1hbnRpY09iamVjdDogdW5rbm93bixcblx0b1BhcmFtOiB1bmtub3duXG4pOiBQcm9taXNlPExpbmtEZWZpbml0aW9uW10+IHtcblx0cmV0dXJuIG9TaGVsbFNlcnZpY2VIZWxwZXIuZ2V0TGlua3Moe1xuXHRcdHNlbWFudGljT2JqZWN0OiBvU2VtYW50aWNPYmplY3QsXG5cdFx0cGFyYW1zOiBvUGFyYW1cblx0fSkgYXMgUHJvbWlzZTxMaW5rRGVmaW5pdGlvbltdPjtcbn1cblxuLy8gVE8tRE8gYWRkIHRoaXMgYXMgcGFydCBvZiBhcHBseVNlbWFudGljT2JqZWN0bWFwcGluZ3MgbG9naWMgaW4gSW50ZW50QmFzZWRuYXZpZ2F0aW9uIGNvbnRyb2xsZXIgZXh0ZW5zaW9uXG5mdW5jdGlvbiBfY3JlYXRlTWFwcGluZ3Mob01hcHBpbmc6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSB7XG5cdGNvbnN0IGFTT01hcHBpbmdzID0gW107XG5cdGNvbnN0IGFNYXBwaW5nS2V5cyA9IE9iamVjdC5rZXlzKG9NYXBwaW5nKTtcblx0bGV0IG9TZW1hbnRpY01hcHBpbmc7XG5cdGZvciAobGV0IGkgPSAwOyBpIDwgYU1hcHBpbmdLZXlzLmxlbmd0aDsgaSsrKSB7XG5cdFx0b1NlbWFudGljTWFwcGluZyA9IHtcblx0XHRcdExvY2FsUHJvcGVydHk6IHtcblx0XHRcdFx0JFByb3BlcnR5UGF0aDogYU1hcHBpbmdLZXlzW2ldXG5cdFx0XHR9LFxuXHRcdFx0U2VtYW50aWNPYmplY3RQcm9wZXJ0eTogb01hcHBpbmdbYU1hcHBpbmdLZXlzW2ldXVxuXHRcdH07XG5cdFx0YVNPTWFwcGluZ3MucHVzaChvU2VtYW50aWNNYXBwaW5nKTtcblx0fVxuXG5cdHJldHVybiBhU09NYXBwaW5ncztcbn1cbnR5cGUgTGlua0RlZmluaXRpb24gPSB7XG5cdGludGVudDogc3RyaW5nO1xuXHR0ZXh0OiBzdHJpbmc7XG59O1xudHlwZSBTZW1hbnRpY0l0ZW0gPSB7XG5cdHRleHQ6IHN0cmluZztcblx0dGFyZ2V0U2VtT2JqZWN0OiBzdHJpbmc7XG5cdHRhcmdldEFjdGlvbjogc3RyaW5nO1xuXHR0YXJnZXRQYXJhbXM6IHVua25vd247XG59O1xuLyoqXG4gKiBAcGFyYW0gYUxpbmtzXG4gKiBAcGFyYW0gYUV4Y2x1ZGVkQWN0aW9uc1xuICogQHBhcmFtIG9UYXJnZXRQYXJhbXNcbiAqIEBwYXJhbSBhSXRlbXNcbiAqIEBwYXJhbSBhQWxsb3dlZEFjdGlvbnNcbiAqL1xuZnVuY3Rpb24gX2dldFJlbGF0ZWRBcHBzTWVudUl0ZW1zKFxuXHRhTGlua3M6IExpbmtEZWZpbml0aW9uW10sXG5cdGFFeGNsdWRlZEFjdGlvbnM6IHVua25vd25bXSxcblx0b1RhcmdldFBhcmFtczogdW5rbm93bixcblx0YUl0ZW1zOiBTZW1hbnRpY0l0ZW1bXSxcblx0YUFsbG93ZWRBY3Rpb25zPzogdW5rbm93bltdXG4pIHtcblx0Zm9yIChsZXQgaSA9IDA7IGkgPCBhTGlua3MubGVuZ3RoOyBpKyspIHtcblx0XHRjb25zdCBvTGluayA9IGFMaW5rc1tpXTtcblx0XHRjb25zdCBzSW50ZW50ID0gb0xpbmsuaW50ZW50O1xuXHRcdGNvbnN0IHNBY3Rpb24gPSBzSW50ZW50LnNwbGl0KFwiLVwiKVsxXS5zcGxpdChcIj9cIilbMF07XG5cdFx0aWYgKGFBbGxvd2VkQWN0aW9ucyAmJiBhQWxsb3dlZEFjdGlvbnMuaW5jbHVkZXMoc0FjdGlvbikpIHtcblx0XHRcdGFJdGVtcy5wdXNoKHtcblx0XHRcdFx0dGV4dDogb0xpbmsudGV4dCxcblx0XHRcdFx0dGFyZ2V0U2VtT2JqZWN0OiBzSW50ZW50LnNwbGl0KFwiI1wiKVsxXS5zcGxpdChcIi1cIilbMF0sXG5cdFx0XHRcdHRhcmdldEFjdGlvbjogc0FjdGlvbi5zcGxpdChcIn5cIilbMF0sXG5cdFx0XHRcdHRhcmdldFBhcmFtczogb1RhcmdldFBhcmFtc1xuXHRcdFx0fSk7XG5cdFx0fSBlbHNlIGlmICghYUFsbG93ZWRBY3Rpb25zICYmIGFFeGNsdWRlZEFjdGlvbnMgJiYgYUV4Y2x1ZGVkQWN0aW9ucy5pbmRleE9mKHNBY3Rpb24pID09PSAtMSkge1xuXHRcdFx0YUl0ZW1zLnB1c2goe1xuXHRcdFx0XHR0ZXh0OiBvTGluay50ZXh0LFxuXHRcdFx0XHR0YXJnZXRTZW1PYmplY3Q6IHNJbnRlbnQuc3BsaXQoXCIjXCIpWzFdLnNwbGl0KFwiLVwiKVswXSxcblx0XHRcdFx0dGFyZ2V0QWN0aW9uOiBzQWN0aW9uLnNwbGl0KFwiflwiKVswXSxcblx0XHRcdFx0dGFyZ2V0UGFyYW1zOiBvVGFyZ2V0UGFyYW1zXG5cdFx0XHR9KTtcblx0XHR9XG5cdH1cbn1cblxudHlwZSBTZW1hbnRpY09iamVjdCA9IHtcblx0YWxsb3dlZEFjdGlvbnM/OiB1bmtub3duW107XG5cdHVuYXZhaWxhYmxlQWN0aW9ucz86IHVua25vd25bXTtcblx0c2VtYW50aWNPYmplY3Q6IHN0cmluZztcblx0cGF0aDogc3RyaW5nO1xuXHRtYXBwaW5nPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbn07XG5cbmZ1bmN0aW9uIF9nZXRSZWxhdGVkSW50ZW50cyhcblx0b0FkZGl0aW9uYWxTZW1hbnRpY09iamVjdHM6IFNlbWFudGljT2JqZWN0LFxuXHRvQmluZGluZ0NvbnRleHQ6IENvbnRleHQsXG5cdGFNYW5pZmVzdFNPSXRlbXM6IFNlbWFudGljSXRlbVtdLFxuXHRhTGlua3M6IExpbmtEZWZpbml0aW9uW11cbikge1xuXHRpZiAoYUxpbmtzICYmIGFMaW5rcy5sZW5ndGggPiAwKSB7XG5cdFx0Y29uc3QgYUFsbG93ZWRBY3Rpb25zID0gb0FkZGl0aW9uYWxTZW1hbnRpY09iamVjdHMuYWxsb3dlZEFjdGlvbnMgfHwgdW5kZWZpbmVkO1xuXHRcdGNvbnN0IGFFeGNsdWRlZEFjdGlvbnMgPSBvQWRkaXRpb25hbFNlbWFudGljT2JqZWN0cy51bmF2YWlsYWJsZUFjdGlvbnMgPyBvQWRkaXRpb25hbFNlbWFudGljT2JqZWN0cy51bmF2YWlsYWJsZUFjdGlvbnMgOiBbXTtcblx0XHRjb25zdCBhU09NYXBwaW5ncyA9IG9BZGRpdGlvbmFsU2VtYW50aWNPYmplY3RzLm1hcHBpbmcgPyBfY3JlYXRlTWFwcGluZ3Mob0FkZGl0aW9uYWxTZW1hbnRpY09iamVjdHMubWFwcGluZykgOiBbXTtcblx0XHRjb25zdCBvVGFyZ2V0UGFyYW1zID0geyBuYXZpZ2F0aW9uQ29udGV4dHM6IG9CaW5kaW5nQ29udGV4dCwgc2VtYW50aWNPYmplY3RNYXBwaW5nOiBhU09NYXBwaW5ncyB9O1xuXHRcdF9nZXRSZWxhdGVkQXBwc01lbnVJdGVtcyhhTGlua3MsIGFFeGNsdWRlZEFjdGlvbnMsIG9UYXJnZXRQYXJhbXMsIGFNYW5pZmVzdFNPSXRlbXMsIGFBbGxvd2VkQWN0aW9ucyk7XG5cdH1cbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gVGhpcyBmdW5jdGlvbiBmZXRjaGVzIHRoZSByZWxhdGVkIGludGVudHMgd2hlbiBzZW1hbnRpYyBvYmplY3QgYW5kIGFjdGlvbiBhcmUgcGFzc2VkIGZyb20gZmVFbnZpcm9ubWVudC5nZXRJbnRlbnQoKSBvbmx5IGluIGNhc2Ugb2YgTXkgSW5ib3ggaW50ZWdyYXRpb25cbiAqIEBwYXJhbSBzZW1hbnRpY09iamVjdEFuZEFjdGlvbiBUaGlzIHNwZWNpZmllcyB0aGUgc2VtYW50aWMgb2JqZWN0IGFuZCBhY3Rpb24gZm9yIGZldGNoaW5nIHRoZSBpbnRlbnRzXG4gKiBAcGFyYW0gb0JpbmRpbmdDb250ZXh0IFRoaXMgc2VwY2lmaWVzIHRoZSBiaW5kaW5nIGNvbnRleHQgZm9yIHVwZGF0aW5nIHJlbGF0ZWQgYXBwc1xuICogQHBhcmFtIGFwcENvbXBvbmVudFNPSXRlbXMgVGhpcyBpcyBhIGxpc3Qgb2Ygc2VtYW50aWMgaXRlbXMgdXNlZCBmb3IgdXBkYXRpbmcgdGhlIHJlbGF0ZWQgYXBwcyBidXR0b25cbiAqIEBwYXJhbSBhTGlua3MgVGhpcyBpcyBhbiBhcnJheSBjb21wcmlzaW5nIG9mIHJlbGF0ZWQgaW50ZW50c1xuICovXG5cbmZ1bmN0aW9uIF9nZXRSZWxhdGVkSW50ZW50c1dpdGhTZW1hbnRpY09iamVjdHNBbmRBY3Rpb24oXG5cdHNlbWFudGljT2JqZWN0QW5kQWN0aW9uOiBNeUluYm94SW50ZW50LFxuXHRvQmluZGluZ0NvbnRleHQ6IENvbnRleHQsXG5cdGFwcENvbXBvbmVudFNPSXRlbXM6IFNlbWFudGljSXRlbVtdLFxuXHRhTGlua3M6IExpbmtEZWZpbml0aW9uW11cbikge1xuXHRpZiAoYUxpbmtzLmxlbmd0aCA+IDApIHtcblx0XHRjb25zdCBhY3Rpb25zID0gW3NlbWFudGljT2JqZWN0QW5kQWN0aW9uLmFjdGlvbl07XG5cdFx0Y29uc3QgZXhjbHVkZWRBY3Rpb25zOiBbXSA9IFtdO1xuXHRcdGNvbnN0IHNvTWFwcGluZ3M6IFtdID0gW107XG5cdFx0Y29uc3QgdGFyZ2V0UGFyYW1zID0geyBuYXZpZ2F0aW9uQ29udGV4dHM6IG9CaW5kaW5nQ29udGV4dCwgc2VtYW50aWNPYmplY3RNYXBwaW5nOiBzb01hcHBpbmdzIH07XG5cdFx0X2dldFJlbGF0ZWRBcHBzTWVudUl0ZW1zKGFMaW5rcywgZXhjbHVkZWRBY3Rpb25zLCB0YXJnZXRQYXJhbXMsIGFwcENvbXBvbmVudFNPSXRlbXMsIGFjdGlvbnMpO1xuXHR9XG59XG5cbnR5cGUgU2VtYW50aWNPYmplY3RDb25maWcgPSB7XG5cdGFkZGl0aW9uYWxTZW1hbnRpY09iamVjdHM6IFJlY29yZDxzdHJpbmcsIFNlbWFudGljT2JqZWN0Pjtcbn07XG50eXBlIFJlbGF0ZWRBcHBzQ29uZmlnID0ge1xuXHR0ZXh0OiBzdHJpbmc7XG5cdHRhcmdldFNlbU9iamVjdDogc3RyaW5nO1xuXHR0YXJnZXRBY3Rpb246IHN0cmluZztcbn07XG5hc3luYyBmdW5jdGlvbiB1cGRhdGVSZWxhdGVBcHBzTW9kZWwoXG5cdG9CaW5kaW5nQ29udGV4dDogQ29udGV4dCxcblx0b0VudHJ5OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCxcblx0b09iamVjdFBhZ2VMYXlvdXQ6IE9iamVjdFBhZ2VMYXlvdXQsXG5cdGFTZW1LZXlzOiB7ICRQcm9wZXJ0eVBhdGg6IHN0cmluZyB9W10sXG5cdG9NZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsLFxuXHRvTWV0YVBhdGg6IHN0cmluZyxcblx0YXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnRcbik6IFByb21pc2U8UmVsYXRlZEFwcHNDb25maWdbXT4ge1xuXHRjb25zdCBvU2hlbGxTZXJ2aWNlSGVscGVyOiBJU2hlbGxTZXJ2aWNlcyA9IGdldFNoZWxsU2VydmljZXMob09iamVjdFBhZ2VMYXlvdXQpO1xuXHRjb25zdCBvUGFyYW06IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG5cdGxldCBzQ3VycmVudFNlbU9iaiA9IFwiXCIsXG5cdFx0c0N1cnJlbnRBY3Rpb24gPSBcIlwiO1xuXHRsZXQgb1NlbWFudGljT2JqZWN0QW5ub3RhdGlvbnM7XG5cdGxldCBhUmVsYXRlZEFwcHNNZW51SXRlbXM6IFJlbGF0ZWRBcHBzQ29uZmlnW10gPSBbXTtcblx0bGV0IGFFeGNsdWRlZEFjdGlvbnM6IHVua25vd25bXSA9IFtdO1xuXHRsZXQgYU1hbmlmZXN0U09LZXlzOiBzdHJpbmdbXTtcblxuXHRhc3luYyBmdW5jdGlvbiBmbkdldFBhcnNlU2hlbGxIYXNoQW5kR2V0TGlua3MoKSB7XG5cdFx0Y29uc3Qgb1BhcnNlZFVybCA9IG9TaGVsbFNlcnZpY2VIZWxwZXIucGFyc2VTaGVsbEhhc2goZG9jdW1lbnQubG9jYXRpb24uaGFzaCk7XG5cdFx0c0N1cnJlbnRTZW1PYmogPSBvUGFyc2VkVXJsLnNlbWFudGljT2JqZWN0OyAvLyBDdXJyZW50IFNlbWFudGljIE9iamVjdFxuXHRcdHNDdXJyZW50QWN0aW9uID0gb1BhcnNlZFVybC5hY3Rpb247XG5cdFx0cmV0dXJuIF9nZXRTT0ludGVudHMob1NoZWxsU2VydmljZUhlbHBlciwgb09iamVjdFBhZ2VMYXlvdXQsIHNDdXJyZW50U2VtT2JqLCBvUGFyYW0pO1xuXHR9XG5cblx0dHJ5IHtcblx0XHRpZiAob0VudHJ5KSB7XG5cdFx0XHRpZiAoYVNlbUtleXMgJiYgYVNlbUtleXMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRmb3IgKGxldCBqID0gMDsgaiA8IGFTZW1LZXlzLmxlbmd0aDsgaisrKSB7XG5cdFx0XHRcdFx0Y29uc3Qgc1NlbUtleSA9IGFTZW1LZXlzW2pdLiRQcm9wZXJ0eVBhdGg7XG5cdFx0XHRcdFx0aWYgKCFvUGFyYW1bc1NlbUtleV0pIHtcblx0XHRcdFx0XHRcdG9QYXJhbVtzU2VtS2V5XSA9IHsgdmFsdWU6IG9FbnRyeVtzU2VtS2V5XSB9O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ly8gZmFsbGJhY2sgdG8gVGVjaG5pY2FsIEtleXMgaWYgbm8gU2VtYW50aWMgS2V5IGlzIHByZXNlbnRcblx0XHRcdFx0Y29uc3QgYVRlY2huaWNhbEtleXMgPSBvTWV0YU1vZGVsLmdldE9iamVjdChgJHtvTWV0YVBhdGh9LyRUeXBlLyRLZXlgKTtcblx0XHRcdFx0Zm9yIChjb25zdCBrZXkgaW4gYVRlY2huaWNhbEtleXMpIHtcblx0XHRcdFx0XHRjb25zdCBzT2JqS2V5ID0gYVRlY2huaWNhbEtleXNba2V5XTtcblx0XHRcdFx0XHRpZiAoIW9QYXJhbVtzT2JqS2V5XSkge1xuXHRcdFx0XHRcdFx0b1BhcmFtW3NPYmpLZXldID0geyB2YWx1ZTogb0VudHJ5W3NPYmpLZXldIH07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdC8vIExvZ2ljIHRvIHJlYWQgYWRkaXRpb25hbCBTTyBmcm9tIG1hbmlmZXN0IGFuZCB1cGRhdGVkIHJlbGF0ZWRhcHBzIG1vZGVsXG5cblx0XHRjb25zdCBvTWFuaWZlc3REYXRhID0gZ2V0VGFyZ2V0VmlldyhvT2JqZWN0UGFnZUxheW91dCkuZ2V0Vmlld0RhdGEoKSBhcyBTZW1hbnRpY09iamVjdENvbmZpZztcblx0XHRjb25zdCBhTWFuaWZlc3RTT0l0ZW1zOiBTZW1hbnRpY0l0ZW1bXSA9IFtdO1xuXHRcdGxldCBzZW1hbnRpY09iamVjdEludGVudHM7XG5cdFx0aWYgKG9NYW5pZmVzdERhdGEuYWRkaXRpb25hbFNlbWFudGljT2JqZWN0cykge1xuXHRcdFx0YU1hbmlmZXN0U09LZXlzID0gT2JqZWN0LmtleXMob01hbmlmZXN0RGF0YS5hZGRpdGlvbmFsU2VtYW50aWNPYmplY3RzKTtcblx0XHRcdGZvciAobGV0IGtleSA9IDA7IGtleSA8IGFNYW5pZmVzdFNPS2V5cy5sZW5ndGg7IGtleSsrKSB7XG5cdFx0XHRcdHNlbWFudGljT2JqZWN0SW50ZW50cyA9IGF3YWl0IFByb21pc2UucmVzb2x2ZShcblx0XHRcdFx0XHRfZ2V0U09JbnRlbnRzKG9TaGVsbFNlcnZpY2VIZWxwZXIsIG9PYmplY3RQYWdlTGF5b3V0LCBhTWFuaWZlc3RTT0tleXNba2V5XSwgb1BhcmFtKVxuXHRcdFx0XHQpO1xuXHRcdFx0XHRfZ2V0UmVsYXRlZEludGVudHMoXG5cdFx0XHRcdFx0b01hbmlmZXN0RGF0YS5hZGRpdGlvbmFsU2VtYW50aWNPYmplY3RzW2FNYW5pZmVzdFNPS2V5c1trZXldXSxcblx0XHRcdFx0XHRvQmluZGluZ0NvbnRleHQsXG5cdFx0XHRcdFx0YU1hbmlmZXN0U09JdGVtcyxcblx0XHRcdFx0XHRzZW1hbnRpY09iamVjdEludGVudHNcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBhcHBDb21wb25lbnRTT0l0ZW1zIGlzIHVwZGF0ZWQgaW4gY2FzZSBvZiBNeSBJbmJveCBpbnRlZ3JhdGlvbiB3aGVuIHNlbWFudGljIG9iamVjdCBhbmQgYWN0aW9uIGFyZSBwYXNzZWQgZnJvbSBmZUVudmlyb25tZW50LmdldEludGVudCgpIG1ldGhvZFxuXHRcdC8vIEluIG90aGVyIGNhc2VzIGl0IHJlbWFpbnMgYXMgYW4gZW1wdHkgbGlzdFxuXHRcdC8vIFdlIGNvbmNhdCB0aGlzIGxpc3QgdG93YXJkcyB0aGUgZW5kIHdpdGggYU1hbmlmZXN0U09JdGVtc1xuXG5cdFx0Y29uc3QgYXBwQ29tcG9uZW50U09JdGVtczogU2VtYW50aWNJdGVtW10gPSBbXTtcblx0XHRjb25zdCBjb21wb25lbnREYXRhOiBDb21wb25lbnREYXRhID0gYXBwQ29tcG9uZW50LmdldENvbXBvbmVudERhdGEoKTtcblx0XHRpZiAoY29tcG9uZW50RGF0YS5mZUVudmlyb25tZW50ICYmIGNvbXBvbmVudERhdGEuZmVFbnZpcm9ubWVudC5nZXRJbnRlbnQoKSkge1xuXHRcdFx0Y29uc3QgaW50ZW50OiBNeUluYm94SW50ZW50ID0gY29tcG9uZW50RGF0YS5mZUVudmlyb25tZW50LmdldEludGVudCgpO1xuXHRcdFx0c2VtYW50aWNPYmplY3RJbnRlbnRzID0gYXdhaXQgUHJvbWlzZS5yZXNvbHZlKFxuXHRcdFx0XHRfZ2V0U09JbnRlbnRzKG9TaGVsbFNlcnZpY2VIZWxwZXIsIG9PYmplY3RQYWdlTGF5b3V0LCBpbnRlbnQuc2VtYW50aWNPYmplY3QsIG9QYXJhbSlcblx0XHRcdCk7XG5cdFx0XHRfZ2V0UmVsYXRlZEludGVudHNXaXRoU2VtYW50aWNPYmplY3RzQW5kQWN0aW9uKGludGVudCwgb0JpbmRpbmdDb250ZXh0LCBhcHBDb21wb25lbnRTT0l0ZW1zLCBzZW1hbnRpY09iamVjdEludGVudHMpO1xuXHRcdH1cblxuXHRcdGNvbnN0IGludGVybmFsTW9kZWxDb250ZXh0ID0gb09iamVjdFBhZ2VMYXlvdXQuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKSBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dDtcblx0XHRjb25zdCBhTGlua3MgPSBhd2FpdCBmbkdldFBhcnNlU2hlbGxIYXNoQW5kR2V0TGlua3MoKTtcblx0XHRpZiAoYUxpbmtzKSB7XG5cdFx0XHRpZiAoYUxpbmtzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0bGV0IGlzU2VtYW50aWNPYmplY3RIYXNTYW1lVGFyZ2V0SW5NYW5pZmVzdCA9IGZhbHNlO1xuXHRcdFx0XHRjb25zdCBvVGFyZ2V0UGFyYW1zOiB7XG5cdFx0XHRcdFx0bmF2aWdhdGlvbkNvbnRleHRzPzogQ29udGV4dDtcblx0XHRcdFx0XHRzZW1hbnRpY09iamVjdE1hcHBpbmc/OiBNZXRhTW9kZWxUeXBlPFNlbWFudGljT2JqZWN0TWFwcGluZ1R5cGU+W107XG5cdFx0XHRcdH0gPSB7fTtcblx0XHRcdFx0Y29uc3QgYUFubm90YXRpb25zU09JdGVtczogU2VtYW50aWNJdGVtW10gPSBbXTtcblx0XHRcdFx0Y29uc3Qgc0VudGl0eVNldFBhdGggPSBgJHtvTWV0YVBhdGh9QGA7XG5cdFx0XHRcdGNvbnN0IHNFbnRpdHlUeXBlUGF0aCA9IGAke29NZXRhUGF0aH0vQGA7XG5cdFx0XHRcdGNvbnN0IG9FbnRpdHlTZXRBbm5vdGF0aW9ucyA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KHNFbnRpdHlTZXRQYXRoKTtcblx0XHRcdFx0b1NlbWFudGljT2JqZWN0QW5ub3RhdGlvbnMgPSBDb21tb25VdGlscy5nZXRTZW1hbnRpY09iamVjdEFubm90YXRpb25zKG9FbnRpdHlTZXRBbm5vdGF0aW9ucywgc0N1cnJlbnRTZW1PYmopO1xuXHRcdFx0XHRpZiAoIW9TZW1hbnRpY09iamVjdEFubm90YXRpb25zLmJIYXNFbnRpdHlTZXRTTykge1xuXHRcdFx0XHRcdGNvbnN0IG9FbnRpdHlUeXBlQW5ub3RhdGlvbnMgPSBvTWV0YU1vZGVsLmdldE9iamVjdChzRW50aXR5VHlwZVBhdGgpO1xuXHRcdFx0XHRcdG9TZW1hbnRpY09iamVjdEFubm90YXRpb25zID0gQ29tbW9uVXRpbHMuZ2V0U2VtYW50aWNPYmplY3RBbm5vdGF0aW9ucyhvRW50aXR5VHlwZUFubm90YXRpb25zLCBzQ3VycmVudFNlbU9iaik7XG5cdFx0XHRcdH1cblx0XHRcdFx0YUV4Y2x1ZGVkQWN0aW9ucyA9IG9TZW1hbnRpY09iamVjdEFubm90YXRpb25zLmFVbmF2YWlsYWJsZUFjdGlvbnM7XG5cdFx0XHRcdC8vU2tpcCBzYW1lIGFwcGxpY2F0aW9uIGZyb20gUmVsYXRlZCBBcHBzXG5cdFx0XHRcdGFFeGNsdWRlZEFjdGlvbnMucHVzaChzQ3VycmVudEFjdGlvbik7XG5cdFx0XHRcdG9UYXJnZXRQYXJhbXMubmF2aWdhdGlvbkNvbnRleHRzID0gb0JpbmRpbmdDb250ZXh0O1xuXHRcdFx0XHRvVGFyZ2V0UGFyYW1zLnNlbWFudGljT2JqZWN0TWFwcGluZyA9IG9TZW1hbnRpY09iamVjdEFubm90YXRpb25zLmFNYXBwaW5ncztcblx0XHRcdFx0X2dldFJlbGF0ZWRBcHBzTWVudUl0ZW1zKGFMaW5rcywgYUV4Y2x1ZGVkQWN0aW9ucywgb1RhcmdldFBhcmFtcywgYUFubm90YXRpb25zU09JdGVtcyk7XG5cblx0XHRcdFx0YU1hbmlmZXN0U09JdGVtcy5mb3JFYWNoKGZ1bmN0aW9uICh7IHRhcmdldFNlbU9iamVjdCB9KSB7XG5cdFx0XHRcdFx0aWYgKGFBbm5vdGF0aW9uc1NPSXRlbXNbMF0/LnRhcmdldFNlbU9iamVjdCA9PT0gdGFyZ2V0U2VtT2JqZWN0KSB7XG5cdFx0XHRcdFx0XHRpc1NlbWFudGljT2JqZWN0SGFzU2FtZVRhcmdldEluTWFuaWZlc3QgPSB0cnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0Ly8gcmVtb3ZlIGFsbCBhY3Rpb25zIGZyb20gY3VycmVudCBoYXNoIGFwcGxpY2F0aW9uIGlmIG1hbmlmZXN0IGNvbnRhaW5zIGVtcHR5IGFsbG93ZWRBY3Rpb25zXG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHRvTWFuaWZlc3REYXRhLmFkZGl0aW9uYWxTZW1hbnRpY09iamVjdHMgJiZcblx0XHRcdFx0XHRhQW5ub3RhdGlvbnNTT0l0ZW1zWzBdICYmXG5cdFx0XHRcdFx0b01hbmlmZXN0RGF0YS5hZGRpdGlvbmFsU2VtYW50aWNPYmplY3RzW2FBbm5vdGF0aW9uc1NPSXRlbXNbMF0udGFyZ2V0U2VtT2JqZWN0XSAmJlxuXHRcdFx0XHRcdG9NYW5pZmVzdERhdGEuYWRkaXRpb25hbFNlbWFudGljT2JqZWN0c1thQW5ub3RhdGlvbnNTT0l0ZW1zWzBdLnRhcmdldFNlbU9iamVjdF0uYWxsb3dlZEFjdGlvbnM/Lmxlbmd0aCA9PT0gMFxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRpc1NlbWFudGljT2JqZWN0SGFzU2FtZVRhcmdldEluTWFuaWZlc3QgPSB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNvbnN0IHNvSXRlbXMgPSBhTWFuaWZlc3RTT0l0ZW1zLmNvbmNhdChhcHBDb21wb25lbnRTT0l0ZW1zKTtcblx0XHRcdFx0YVJlbGF0ZWRBcHBzTWVudUl0ZW1zID0gaXNTZW1hbnRpY09iamVjdEhhc1NhbWVUYXJnZXRJbk1hbmlmZXN0ID8gc29JdGVtcyA6IHNvSXRlbXMuY29uY2F0KGFBbm5vdGF0aW9uc1NPSXRlbXMpO1xuXHRcdFx0XHQvLyBJZiBubyBhcHAgaW4gbGlzdCwgcmVsYXRlZCBhcHBzIGJ1dHRvbiB3aWxsIGJlIGhpZGRlblxuXHRcdFx0XHRpbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcInJlbGF0ZWRBcHBzL3Zpc2liaWxpdHlcIiwgYVJlbGF0ZWRBcHBzTWVudUl0ZW1zLmxlbmd0aCA+IDApO1xuXHRcdFx0XHRpbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcInJlbGF0ZWRBcHBzL2l0ZW1zXCIsIGFSZWxhdGVkQXBwc01lbnVJdGVtcyk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRpbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcInJlbGF0ZWRBcHBzL3Zpc2liaWxpdHlcIiwgZmFsc2UpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRpbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcInJlbGF0ZWRBcHBzL3Zpc2liaWxpdHlcIiwgZmFsc2UpO1xuXHRcdH1cblx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRMb2cuZXJyb3IoXCJDYW5ub3QgcmVhZCBsaW5rc1wiLCBlcnJvciBhcyBzdHJpbmcpO1xuXHR9XG5cdHJldHVybiBhUmVsYXRlZEFwcHNNZW51SXRlbXM7XG59XG5cbmZ1bmN0aW9uIF9nZXRTZW1hbnRpY09iamVjdEFubm90YXRpb25zKG9FbnRpdHlBbm5vdGF0aW9uczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIHNDdXJyZW50U2VtT2JqOiBzdHJpbmcpIHtcblx0Y29uc3Qgb1NlbWFudGljT2JqZWN0QW5ub3RhdGlvbnMgPSB7XG5cdFx0Ykhhc0VudGl0eVNldFNPOiBmYWxzZSxcblx0XHRhQWxsb3dlZEFjdGlvbnM6IFtdLFxuXHRcdGFVbmF2YWlsYWJsZUFjdGlvbnM6IFtdIGFzIE1ldGFNb2RlbFR5cGU8U2VtYW50aWNPYmplY3RVbmF2YWlsYWJsZUFjdGlvbnM+W10sXG5cdFx0YU1hcHBpbmdzOiBbXSBhcyBNZXRhTW9kZWxUeXBlPFNlbWFudGljT2JqZWN0TWFwcGluZ1R5cGU+W11cblx0fTtcblx0bGV0IHNBbm5vdGF0aW9uTWFwcGluZ1Rlcm0sIHNBbm5vdGF0aW9uQWN0aW9uVGVybTtcblx0bGV0IHNRdWFsaWZpZXI7XG5cdGZvciAoY29uc3Qga2V5IGluIG9FbnRpdHlBbm5vdGF0aW9ucykge1xuXHRcdGlmIChrZXkuaW5kZXhPZihDb21tb25Bbm5vdGF0aW9uVGVybXMuU2VtYW50aWNPYmplY3QpID4gLTEgJiYgb0VudGl0eUFubm90YXRpb25zW2tleV0gPT09IHNDdXJyZW50U2VtT2JqKSB7XG5cdFx0XHRvU2VtYW50aWNPYmplY3RBbm5vdGF0aW9ucy5iSGFzRW50aXR5U2V0U08gPSB0cnVlO1xuXHRcdFx0c0Fubm90YXRpb25NYXBwaW5nVGVybSA9IGBAJHtDb21tb25Bbm5vdGF0aW9uVGVybXMuU2VtYW50aWNPYmplY3RNYXBwaW5nfWA7XG5cdFx0XHRzQW5ub3RhdGlvbkFjdGlvblRlcm0gPSBgQCR7Q29tbW9uQW5ub3RhdGlvblRlcm1zLlNlbWFudGljT2JqZWN0VW5hdmFpbGFibGVBY3Rpb25zfWA7XG5cblx0XHRcdGlmIChrZXkuaW5kZXhPZihcIiNcIikgPiAtMSkge1xuXHRcdFx0XHRzUXVhbGlmaWVyID0ga2V5LnNwbGl0KFwiI1wiKVsxXTtcblx0XHRcdFx0c0Fubm90YXRpb25NYXBwaW5nVGVybSA9IGAke3NBbm5vdGF0aW9uTWFwcGluZ1Rlcm19IyR7c1F1YWxpZmllcn1gO1xuXHRcdFx0XHRzQW5ub3RhdGlvbkFjdGlvblRlcm0gPSBgJHtzQW5ub3RhdGlvbkFjdGlvblRlcm19IyR7c1F1YWxpZmllcn1gO1xuXHRcdFx0fVxuXHRcdFx0aWYgKG9FbnRpdHlBbm5vdGF0aW9uc1tzQW5ub3RhdGlvbk1hcHBpbmdUZXJtXSkge1xuXHRcdFx0XHRvU2VtYW50aWNPYmplY3RBbm5vdGF0aW9ucy5hTWFwcGluZ3MgPSBvU2VtYW50aWNPYmplY3RBbm5vdGF0aW9ucy5hTWFwcGluZ3MuY29uY2F0KFxuXHRcdFx0XHRcdG9FbnRpdHlBbm5vdGF0aW9uc1tzQW5ub3RhdGlvbk1hcHBpbmdUZXJtXSBhcyBNZXRhTW9kZWxUeXBlPFNlbWFudGljT2JqZWN0TWFwcGluZ1R5cGU+XG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChvRW50aXR5QW5ub3RhdGlvbnNbc0Fubm90YXRpb25BY3Rpb25UZXJtXSkge1xuXHRcdFx0XHRvU2VtYW50aWNPYmplY3RBbm5vdGF0aW9ucy5hVW5hdmFpbGFibGVBY3Rpb25zID0gb1NlbWFudGljT2JqZWN0QW5ub3RhdGlvbnMuYVVuYXZhaWxhYmxlQWN0aW9ucy5jb25jYXQoXG5cdFx0XHRcdFx0b0VudGl0eUFubm90YXRpb25zW3NBbm5vdGF0aW9uQWN0aW9uVGVybV0gYXMgTWV0YU1vZGVsVHlwZTxTZW1hbnRpY09iamVjdFVuYXZhaWxhYmxlQWN0aW9ucz5cblx0XHRcdFx0KTtcblx0XHRcdH1cblxuXHRcdFx0YnJlYWs7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBvU2VtYW50aWNPYmplY3RBbm5vdGF0aW9ucztcbn1cblxuZnVuY3Rpb24gZm5VcGRhdGVSZWxhdGVkQXBwc0RldGFpbHMob09iamVjdFBhZ2VMYXlvdXQ6IE9iamVjdFBhZ2VMYXlvdXQsIGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50KSB7XG5cdGNvbnN0IG9NZXRhTW9kZWwgPSBvT2JqZWN0UGFnZUxheW91dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpIGFzIE9EYXRhTWV0YU1vZGVsO1xuXHRjb25zdCBvQmluZGluZ0NvbnRleHQgPSBvT2JqZWN0UGFnZUxheW91dC5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIE9EYXRhVjRDb250ZXh0O1xuXHRjb25zdCBwYXRoID0gKG9CaW5kaW5nQ29udGV4dCAmJiBvQmluZGluZ0NvbnRleHQuZ2V0UGF0aCgpKSB8fCBcIlwiO1xuXHRjb25zdCBvTWV0YVBhdGggPSBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKHBhdGgpO1xuXHQvLyBTZW1hbnRpYyBLZXkgVm9jYWJ1bGFyeVxuXHRjb25zdCBzU2VtYW50aWNLZXlWb2NhYnVsYXJ5ID0gYCR7b01ldGFQYXRofS9gICsgYEBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuU2VtYW50aWNLZXlgO1xuXHQvL1NlbWFudGljIEtleXNcblx0Y29uc3QgYVNlbUtleXMgPSBvTWV0YU1vZGVsLmdldE9iamVjdChzU2VtYW50aWNLZXlWb2NhYnVsYXJ5KTtcblx0Ly8gVW5hdmFpbGFibGUgQWN0aW9uc1xuXHRjb25zdCBvRW50cnkgPSBvQmluZGluZ0NvbnRleHQ/LmdldE9iamVjdCgpO1xuXHRpZiAoIW9FbnRyeSAmJiBvQmluZGluZ0NvbnRleHQpIHtcblx0XHRvQmluZGluZ0NvbnRleHRcblx0XHRcdC5yZXF1ZXN0T2JqZWN0KClcblx0XHRcdC50aGVuKGFzeW5jIGZ1bmN0aW9uIChyZXF1ZXN0ZWRPYmplY3Q6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHJldHVybiBDb21tb25VdGlscy51cGRhdGVSZWxhdGVBcHBzTW9kZWwoXG5cdFx0XHRcdFx0b0JpbmRpbmdDb250ZXh0LFxuXHRcdFx0XHRcdHJlcXVlc3RlZE9iamVjdCxcblx0XHRcdFx0XHRvT2JqZWN0UGFnZUxheW91dCxcblx0XHRcdFx0XHRhU2VtS2V5cyxcblx0XHRcdFx0XHRvTWV0YU1vZGVsLFxuXHRcdFx0XHRcdG9NZXRhUGF0aCxcblx0XHRcdFx0XHRhcHBDb21wb25lbnRcblx0XHRcdFx0KTtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogdW5rbm93bikge1xuXHRcdFx0XHRMb2cuZXJyb3IoXCJDYW5ub3QgdXBkYXRlIHRoZSByZWxhdGVkIGFwcCBkZXRhaWxzXCIsIG9FcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0fSk7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIENvbW1vblV0aWxzLnVwZGF0ZVJlbGF0ZUFwcHNNb2RlbChvQmluZGluZ0NvbnRleHQsIG9FbnRyeSwgb09iamVjdFBhZ2VMYXlvdXQsIGFTZW1LZXlzLCBvTWV0YU1vZGVsLCBvTWV0YVBhdGgsIGFwcENvbXBvbmVudCk7XG5cdH1cbn1cblxuLyoqXG4gKiBAcGFyYW0gb0J1dHRvblxuICovXG5mdW5jdGlvbiBmbkZpcmVCdXR0b25QcmVzcyhvQnV0dG9uOiBDb250cm9sKSB7XG5cdGlmIChcblx0XHRvQnV0dG9uICYmXG5cdFx0b0J1dHRvbi5pc0E8QnV0dG9uIHwgT3ZlcmZsb3dUb29sYmFyQnV0dG9uPihbXCJzYXAubS5CdXR0b25cIiwgXCJzYXAubS5PdmVyZmxvd1Rvb2xiYXJCdXR0b25cIl0pICYmXG5cdFx0b0J1dHRvbi5nZXRWaXNpYmxlKCkgJiZcblx0XHRvQnV0dG9uLmdldEVuYWJsZWQoKVxuXHQpIHtcblx0XHRvQnV0dG9uLmZpcmVQcmVzcygpO1xuXHR9XG59XG5cbmZ1bmN0aW9uIGZuUmVzb2x2ZVN0cmluZ3RvQm9vbGVhbihzVmFsdWU6IHN0cmluZyB8IGJvb2xlYW4pIHtcblx0aWYgKHNWYWx1ZSA9PT0gXCJ0cnVlXCIgfHwgc1ZhbHVlID09PSB0cnVlKSB7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG59XG5cbmZ1bmN0aW9uIGdldEFwcENvbXBvbmVudChvQ29udHJvbDogQ29udHJvbCB8IENvbXBvbmVudCk6IEFwcENvbXBvbmVudCB7XG5cdGlmIChvQ29udHJvbC5pc0E8QXBwQ29tcG9uZW50PihcInNhcC5mZS5jb3JlLkFwcENvbXBvbmVudFwiKSkge1xuXHRcdHJldHVybiBvQ29udHJvbDtcblx0fVxuXHRjb25zdCBvT3duZXIgPSBDb21wb25lbnQuZ2V0T3duZXJDb21wb25lbnRGb3Iob0NvbnRyb2wpO1xuXHRpZiAoIW9Pd25lcikge1xuXHRcdHRocm93IG5ldyBFcnJvcihcIlRoZXJlIHNob3VsZCBiZSBhIHNhcC5mZS5jb3JlLkFwcENvbXBvbmVudCBhcyBvd25lciBvZiB0aGUgY29udHJvbFwiKTtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gZ2V0QXBwQ29tcG9uZW50KG9Pd25lcik7XG5cdH1cbn1cblxuZnVuY3Rpb24gZ2V0Q3VycmVudFBhZ2VWaWV3KG9BcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCkge1xuXHRjb25zdCByb290Vmlld0NvbnRyb2xsZXIgPSBvQXBwQ29tcG9uZW50LmdldFJvb3RWaWV3Q29udHJvbGxlcigpO1xuXHRyZXR1cm4gcm9vdFZpZXdDb250cm9sbGVyLmlzRmNsRW5hYmxlZCgpXG5cdFx0PyByb290Vmlld0NvbnRyb2xsZXIuZ2V0UmlnaHRtb3N0VmlldygpXG5cdFx0OiBDb21tb25VdGlscy5nZXRUYXJnZXRWaWV3KChvQXBwQ29tcG9uZW50LmdldFJvb3RDb250YWluZXIoKSBhcyBOYXZDb250YWluZXIpLmdldEN1cnJlbnRQYWdlKCkpO1xufVxuXG5mdW5jdGlvbiBnZXRUYXJnZXRWaWV3KG9Db250cm9sOiBNYW5hZ2VkT2JqZWN0IHwgbnVsbCk6IFZpZXcge1xuXHRpZiAob0NvbnRyb2wgJiYgb0NvbnRyb2wuaXNBPENvbXBvbmVudENvbnRhaW5lcj4oXCJzYXAudWkuY29yZS5Db21wb25lbnRDb250YWluZXJcIikpIHtcblx0XHRjb25zdCBvQ29tcG9uZW50ID0gb0NvbnRyb2wuZ2V0Q29tcG9uZW50SW5zdGFuY2UoKTtcblx0XHRvQ29udHJvbCA9IG9Db21wb25lbnQgJiYgb0NvbXBvbmVudC5nZXRSb290Q29udHJvbCgpO1xuXHR9XG5cdHdoaWxlIChvQ29udHJvbCAmJiAhb0NvbnRyb2wuaXNBPFZpZXc+KFwic2FwLnVpLmNvcmUubXZjLlZpZXdcIikpIHtcblx0XHRvQ29udHJvbCA9IG9Db250cm9sLmdldFBhcmVudCgpO1xuXHR9XG5cdHJldHVybiBvQ29udHJvbCE7XG59XG5cbmZ1bmN0aW9uIGlzRmllbGRDb250cm9sUGF0aEluYXBwbGljYWJsZShzRmllbGRDb250cm9sUGF0aDogc3RyaW5nLCBvQXR0cmlidXRlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikge1xuXHRsZXQgYkluYXBwbGljYWJsZSA9IGZhbHNlO1xuXHRjb25zdCBhUGFydHMgPSBzRmllbGRDb250cm9sUGF0aC5zcGxpdChcIi9cIik7XG5cdC8vIHNlbnNpdGl2ZSBkYXRhIGlzIHJlbW92ZWQgb25seSBpZiB0aGUgcGF0aCBoYXMgYWxyZWFkeSBiZWVuIHJlc29sdmVkLlxuXHRpZiAoYVBhcnRzLmxlbmd0aCA+IDEpIHtcblx0XHRiSW5hcHBsaWNhYmxlID1cblx0XHRcdG9BdHRyaWJ1dGVbYVBhcnRzWzBdXSAhPT0gdW5kZWZpbmVkICYmXG5cdFx0XHQob0F0dHJpYnV0ZVthUGFydHNbMF1dIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KS5oYXNPd25Qcm9wZXJ0eShhUGFydHNbMV0pICYmXG5cdFx0XHQob0F0dHJpYnV0ZVthUGFydHNbMF1dIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVthUGFydHNbMV1dID09PSAwO1xuXHR9IGVsc2Uge1xuXHRcdGJJbmFwcGxpY2FibGUgPSBvQXR0cmlidXRlW3NGaWVsZENvbnRyb2xQYXRoXSA9PT0gMDtcblx0fVxuXHRyZXR1cm4gYkluYXBwbGljYWJsZTtcbn1cbnR5cGUgVW5rbm93bk9EYXRhT2JqZWN0ID0ge1xuXHRlbnRpdHlTZXQ/OiBzdHJpbmc7XG5cdGNvbnRleHREYXRhOiB7XG5cdFx0XCJAb2RhdGEuY29udGV4dFwiPzogc3RyaW5nO1xuXHRcdFwiJTQwb2RhdGEuY29udGV4dFwiPzogc3RyaW5nO1xuXHRcdFwiQG9kYXRhLm1ldGFkYXRhRXRhZ1wiPzogc3RyaW5nO1xuXHRcdFwiJTQwb2RhdGEubWV0YWRhdGFFdGFnXCI/OiBzdHJpbmc7XG5cdFx0U0FQX19NZXNzYWdlcz86IHN0cmluZztcblx0XHRbUzogc3RyaW5nXTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXHR9O1xufTtcbmZ1bmN0aW9uIHJlbW92ZVNlbnNpdGl2ZURhdGEoYUF0dHJpYnV0ZXM6IFVua25vd25PRGF0YU9iamVjdFtdLCBvTWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbCkge1xuXHRjb25zdCBhT3V0QXR0cmlidXRlcyA9IFtdO1xuXHRmb3IgKGxldCBpID0gMDsgaSA8IGFBdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0Y29uc3Qgc0VudGl0eVNldCA9IGFBdHRyaWJ1dGVzW2ldLmVudGl0eVNldCEsXG5cdFx0XHRvQXR0cmlidXRlID0gYUF0dHJpYnV0ZXNbaV0uY29udGV4dERhdGE7XG5cblx0XHRkZWxldGUgb0F0dHJpYnV0ZVtcIkBvZGF0YS5jb250ZXh0XCJdO1xuXHRcdGRlbGV0ZSBvQXR0cmlidXRlW1wiJTQwb2RhdGEuY29udGV4dFwiXTtcblx0XHRkZWxldGUgb0F0dHJpYnV0ZVtcIkBvZGF0YS5tZXRhZGF0YUV0YWdcIl07XG5cdFx0ZGVsZXRlIG9BdHRyaWJ1dGVbXCIlNDBvZGF0YS5tZXRhZGF0YUV0YWdcIl07XG5cdFx0ZGVsZXRlIG9BdHRyaWJ1dGVbXCJTQVBfX01lc3NhZ2VzXCJdO1xuXHRcdGNvbnN0IGFQcm9wZXJ0aWVzID0gT2JqZWN0LmtleXMob0F0dHJpYnV0ZSk7XG5cdFx0Zm9yIChsZXQgaiA9IDA7IGogPCBhUHJvcGVydGllcy5sZW5ndGg7IGorKykge1xuXHRcdFx0Y29uc3Qgc1Byb3AgPSBhUHJvcGVydGllc1tqXSxcblx0XHRcdFx0YVByb3BlcnR5QW5ub3RhdGlvbnMgPSBvTWV0YU1vZGVsLmdldE9iamVjdChgLyR7c0VudGl0eVNldH0vJHtzUHJvcH1AYCk7XG5cdFx0XHRpZiAoYVByb3BlcnR5QW5ub3RhdGlvbnMpIHtcblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdGFQcm9wZXJ0eUFubm90YXRpb25zW1wiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlBlcnNvbmFsRGF0YS52MS5Jc1BvdGVudGlhbGx5U2Vuc2l0aXZlXCJdIHx8XG5cdFx0XHRcdFx0YVByb3BlcnR5QW5ub3RhdGlvbnNbXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuRXhjbHVkZUZyb21OYXZpZ2F0aW9uQ29udGV4dFwiXSB8fFxuXHRcdFx0XHRcdGFQcm9wZXJ0eUFubm90YXRpb25zW1wiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkFuYWx5dGljcy52MS5NZWFzdXJlXCJdXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdGRlbGV0ZSBvQXR0cmlidXRlW3NQcm9wXTtcblx0XHRcdFx0fSBlbHNlIGlmIChhUHJvcGVydHlBbm5vdGF0aW9uc1tcIkBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRmllbGRDb250cm9sXCJdKSB7XG5cdFx0XHRcdFx0Y29uc3Qgb0ZpZWxkQ29udHJvbCA9IGFQcm9wZXJ0eUFubm90YXRpb25zW1wiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5GaWVsZENvbnRyb2xcIl07XG5cdFx0XHRcdFx0aWYgKG9GaWVsZENvbnRyb2xbXCIkRW51bU1lbWJlclwiXSAmJiBvRmllbGRDb250cm9sW1wiJEVudW1NZW1iZXJcIl0uc3BsaXQoXCIvXCIpWzFdID09PSBcIkluYXBwbGljYWJsZVwiKSB7XG5cdFx0XHRcdFx0XHRkZWxldGUgb0F0dHJpYnV0ZVtzUHJvcF07XG5cdFx0XHRcdFx0fSBlbHNlIGlmIChvRmllbGRDb250cm9sW1wiJFBhdGhcIl0gJiYgQ29tbW9uVXRpbHMuaXNGaWVsZENvbnRyb2xQYXRoSW5hcHBsaWNhYmxlKG9GaWVsZENvbnRyb2xbXCIkUGF0aFwiXSwgb0F0dHJpYnV0ZSkpIHtcblx0XHRcdFx0XHRcdGRlbGV0ZSBvQXR0cmlidXRlW3NQcm9wXTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0YU91dEF0dHJpYnV0ZXMucHVzaChvQXR0cmlidXRlKTtcblx0fVxuXG5cdHJldHVybiBhT3V0QXR0cmlidXRlcztcbn1cblxuZnVuY3Rpb24gX2ZuQ2hlY2tJc01hdGNoKG9PYmplY3Q6IG9iamVjdCwgb0tleXNUb0NoZWNrOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikge1xuXHRmb3IgKGNvbnN0IHNLZXkgaW4gb0tleXNUb0NoZWNrKSB7XG5cdFx0aWYgKG9LZXlzVG9DaGVja1tzS2V5XSAhPT0gb09iamVjdFtzS2V5IGFzIGtleW9mIHR5cGVvZiBvT2JqZWN0XSkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gZm5HZXRDb250ZXh0UGF0aFByb3BlcnRpZXMoXG5cdG1ldGFNb2RlbENvbnRleHQ6IE9EYXRhTWV0YU1vZGVsLFxuXHRzQ29udGV4dFBhdGg6IHN0cmluZyxcblx0b0ZpbHRlcj86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4pOiBSZWNvcmQ8c3RyaW5nLCBNZXRhTW9kZWxQcm9wZXJ0eT4gfCBSZWNvcmQ8c3RyaW5nLCBNZXRhTW9kZWxOYXZQcm9wZXJ0eT4ge1xuXHRjb25zdCBvRW50aXR5VHlwZTogTWV0YU1vZGVsRW50aXR5VHlwZSA9IChtZXRhTW9kZWxDb250ZXh0LmdldE9iamVjdChgJHtzQ29udGV4dFBhdGh9L2ApIHx8IHt9KSBhcyBNZXRhTW9kZWxFbnRpdHlUeXBlLFxuXHRcdG9Qcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBNZXRhTW9kZWxQcm9wZXJ0eT4gfCBSZWNvcmQ8c3RyaW5nLCBNZXRhTW9kZWxOYXZQcm9wZXJ0eT4gPSB7fTtcblxuXHRmb3IgKGNvbnN0IHNLZXkgaW4gb0VudGl0eVR5cGUpIHtcblx0XHRpZiAoXG5cdFx0XHRvRW50aXR5VHlwZS5oYXNPd25Qcm9wZXJ0eShzS2V5KSAmJlxuXHRcdFx0IS9eXFwkL2kudGVzdChzS2V5KSAmJlxuXHRcdFx0b0VudGl0eVR5cGVbc0tleV0uJGtpbmQgJiZcblx0XHRcdF9mbkNoZWNrSXNNYXRjaChvRW50aXR5VHlwZVtzS2V5XSwgb0ZpbHRlciB8fCB7ICRraW5kOiBcIlByb3BlcnR5XCIgfSlcblx0XHQpIHtcblx0XHRcdG9Qcm9wZXJ0aWVzW3NLZXldID0gb0VudGl0eVR5cGVbc0tleV07XG5cdFx0fVxuXHR9XG5cdHJldHVybiBvUHJvcGVydGllcztcbn1cblxuZnVuY3Rpb24gZm5HZXRNYW5kYXRvcnlGaWx0ZXJGaWVsZHMob01ldGFNb2RlbDogT0RhdGFNZXRhTW9kZWwsIHNDb250ZXh0UGF0aDogc3RyaW5nKSB7XG5cdGxldCBhTWFuZGF0b3J5RmlsdGVyRmllbGRzOiBFeHBhbmRQYXRoVHlwZTxFZG0uUHJvcGVydHlQYXRoPltdID0gW107XG5cdGlmIChvTWV0YU1vZGVsICYmIHNDb250ZXh0UGF0aCkge1xuXHRcdGFNYW5kYXRvcnlGaWx0ZXJGaWVsZHMgPSBvTWV0YU1vZGVsLmdldE9iamVjdChcblx0XHRcdGAke3NDb250ZXh0UGF0aH1AT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5GaWx0ZXJSZXN0cmljdGlvbnMvUmVxdWlyZWRQcm9wZXJ0aWVzYFxuXHRcdCkgYXMgRXhwYW5kUGF0aFR5cGU8RWRtLlByb3BlcnR5UGF0aD5bXTtcblx0fVxuXHRyZXR1cm4gYU1hbmRhdG9yeUZpbHRlckZpZWxkcztcbn1cblxuZnVuY3Rpb24gZm5HZXRJQk5BY3Rpb25zKG9Db250cm9sOiBUYWJsZSB8IE9iamVjdFBhZ2VEeW5hbWljSGVhZGVyVGl0bGUsIGFJQk5BY3Rpb25zOiB1bmtub3duW10pIHtcblx0Y29uc3QgYUFjdGlvbnMgPSBvQ29udHJvbCAmJiBvQ29udHJvbC5nZXRBY3Rpb25zKCk7XG5cdGlmIChhQWN0aW9ucykge1xuXHRcdGFBY3Rpb25zLmZvckVhY2goZnVuY3Rpb24gKG9BY3Rpb24pIHtcblx0XHRcdGlmIChvQWN0aW9uLmlzQTxBY3Rpb25Ub29sYmFyQWN0aW9uPihcInNhcC51aS5tZGMuYWN0aW9udG9vbGJhci5BY3Rpb25Ub29sYmFyQWN0aW9uXCIpKSB7XG5cdFx0XHRcdG9BY3Rpb24gPSBvQWN0aW9uLmdldEFjdGlvbigpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKG9BY3Rpb24uaXNBPE1lbnVCdXR0b24+KFwic2FwLm0uTWVudUJ1dHRvblwiKSkge1xuXHRcdFx0XHRjb25zdCBvTWVudSA9IG9BY3Rpb24uZ2V0TWVudSgpO1xuXHRcdFx0XHRjb25zdCBhSXRlbXMgPSBvTWVudS5nZXRJdGVtcygpO1xuXHRcdFx0XHRhSXRlbXMuZm9yRWFjaCgob0l0ZW0pID0+IHtcblx0XHRcdFx0XHRpZiAob0l0ZW0uZGF0YShcIklCTkRhdGFcIikpIHtcblx0XHRcdFx0XHRcdGFJQk5BY3Rpb25zLnB1c2gob0l0ZW0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHR9IGVsc2UgaWYgKG9BY3Rpb24uZGF0YShcIklCTkRhdGFcIikpIHtcblx0XHRcdFx0YUlCTkFjdGlvbnMucHVzaChvQWN0aW9uKTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXHRyZXR1cm4gYUlCTkFjdGlvbnM7XG59XG5cbi8qKlxuICogQHBhcmFtIGFJQk5BY3Rpb25zXG4gKiBAcGFyYW0gb1ZpZXdcbiAqL1xuZnVuY3Rpb24gZm5VcGRhdGVEYXRhRmllbGRGb3JJQk5CdXR0b25zVmlzaWJpbGl0eShhSUJOQWN0aW9uczogQ29udHJvbFtdLCBvVmlldzogVmlldykge1xuXHRjb25zdCBvUGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCB7IHZhbHVlOiB1bmtub3duIH0+ID0ge307XG5cdGNvbnN0IGlzU3RpY2t5ID0gTW9kZWxIZWxwZXIuaXNTdGlja3lTZXNzaW9uU3VwcG9ydGVkKChvVmlldy5nZXRNb2RlbCgpIGFzIE9EYXRhTW9kZWwpLmdldE1ldGFNb2RlbCgpKTtcblx0Y29uc3QgZm5HZXRMaW5rcyA9IGZ1bmN0aW9uIChvRGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkKSB7XG5cdFx0aWYgKG9EYXRhKSB7XG5cdFx0XHRjb25zdCBhS2V5cyA9IE9iamVjdC5rZXlzKG9EYXRhKTtcblx0XHRcdGFLZXlzLmZvckVhY2goZnVuY3Rpb24gKHNLZXk6IHN0cmluZykge1xuXHRcdFx0XHRpZiAoc0tleS5pbmRleE9mKFwiX1wiKSAhPT0gMCAmJiBzS2V5LmluZGV4T2YoXCJvZGF0YS5jb250ZXh0XCIpID09PSAtMSkge1xuXHRcdFx0XHRcdG9QYXJhbXNbc0tleV0gPSB7IHZhbHVlOiBvRGF0YVtzS2V5XSB9O1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0aWYgKGFJQk5BY3Rpb25zLmxlbmd0aCkge1xuXHRcdFx0YUlCTkFjdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAob0lCTkFjdGlvbikge1xuXHRcdFx0XHRjb25zdCBzU2VtYW50aWNPYmplY3QgPSBvSUJOQWN0aW9uLmRhdGEoXCJJQk5EYXRhXCIpLnNlbWFudGljT2JqZWN0O1xuXHRcdFx0XHRjb25zdCBzQWN0aW9uID0gb0lCTkFjdGlvbi5kYXRhKFwiSUJORGF0YVwiKS5hY3Rpb247XG5cdFx0XHRcdENvbW1vblV0aWxzLmdldFNoZWxsU2VydmljZXMob1ZpZXcpXG5cdFx0XHRcdFx0LmdldExpbmtzKHtcblx0XHRcdFx0XHRcdHNlbWFudGljT2JqZWN0OiBzU2VtYW50aWNPYmplY3QsXG5cdFx0XHRcdFx0XHRhY3Rpb246IHNBY3Rpb24sXG5cdFx0XHRcdFx0XHRwYXJhbXM6IG9QYXJhbXNcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdC50aGVuKGZ1bmN0aW9uIChhTGluaykge1xuXHRcdFx0XHRcdFx0b0lCTkFjdGlvbi5zZXRWaXNpYmxlKG9JQk5BY3Rpb24uZ2V0VmlzaWJsZSgpICYmIGFMaW5rICYmIGFMaW5rLmxlbmd0aCA9PT0gMSk7XG5cdFx0XHRcdFx0XHRpZiAoaXNTdGlja3kpIHtcblx0XHRcdFx0XHRcdFx0KG9JQk5BY3Rpb24uZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKSBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dCkuc2V0UHJvcGVydHkoXG5cdFx0XHRcdFx0XHRcdFx0b0lCTkFjdGlvbi5nZXRJZCgpLnNwbGl0KFwiLS1cIilbMV0sXG5cdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0c2hlbGxOYXZpZ2F0aW9uTm90QXZhaWxhYmxlOiAhKGFMaW5rICYmIGFMaW5rLmxlbmd0aCA9PT0gMSlcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogdW5rbm93bikge1xuXHRcdFx0XHRcdFx0TG9nLmVycm9yKFwiQ2Fubm90IHJldHJpZXZlIHRoZSBsaW5rcyBmcm9tIHRoZSBzaGVsbCBzZXJ2aWNlXCIsIG9FcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHR9O1xuXHRpZiAob1ZpZXcgJiYgb1ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoKSkge1xuXHRcdChvVmlldy5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIE9EYXRhVjRDb250ZXh0KVxuXHRcdFx0Py5yZXF1ZXN0T2JqZWN0KClcblx0XHRcdC50aGVuKGZ1bmN0aW9uIChvRGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQpIHtcblx0XHRcdFx0cmV0dXJuIGZuR2V0TGlua3Mob0RhdGEpO1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIkNhbm5vdCByZXRyaWV2ZSB0aGUgbGlua3MgZnJvbSB0aGUgc2hlbGwgc2VydmljZVwiLCBvRXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdH0pO1xuXHR9IGVsc2Uge1xuXHRcdGZuR2V0TGlua3MoKTtcblx0fVxufVxuXG5mdW5jdGlvbiBnZXRBY3Rpb25QYXRoKGFjdGlvbkNvbnRleHQ6IENvbnRleHQsIGJSZXR1cm5Pbmx5UGF0aDogYm9vbGVhbiwgaW5BY3Rpb25OYW1lPzogc3RyaW5nLCBiQ2hlY2tTdGF0aWNWYWx1ZT86IGJvb2xlYW4pIHtcblx0Y29uc3Qgc0FjdGlvbk5hbWU6IHN0cmluZyA9ICFpbkFjdGlvbk5hbWUgPyBhY3Rpb25Db250ZXh0LmdldE9iamVjdChhY3Rpb25Db250ZXh0LmdldFBhdGgoKSkudG9TdHJpbmcoKSA6IGluQWN0aW9uTmFtZTtcblx0bGV0IHNDb250ZXh0UGF0aCA9IGFjdGlvbkNvbnRleHQuZ2V0UGF0aCgpLnNwbGl0KFwiL0BcIilbMF07XG5cdGNvbnN0IHNFbnRpdHlUeXBlTmFtZSA9IChhY3Rpb25Db250ZXh0LmdldE9iamVjdChzQ29udGV4dFBhdGgpIGFzIE1ldGFNb2RlbEVudGl0eVR5cGUpLiRUeXBlO1xuXHRjb25zdCBzRW50aXR5TmFtZSA9IGdldEVudGl0eVNldE5hbWUoYWN0aW9uQ29udGV4dC5nZXRNb2RlbCgpIGFzIE9EYXRhTWV0YU1vZGVsLCBzRW50aXR5VHlwZU5hbWUpO1xuXHRpZiAoc0VudGl0eU5hbWUpIHtcblx0XHRzQ29udGV4dFBhdGggPSBgLyR7c0VudGl0eU5hbWV9YDtcblx0fVxuXHRpZiAoYkNoZWNrU3RhdGljVmFsdWUpIHtcblx0XHRyZXR1cm4gYWN0aW9uQ29udGV4dC5nZXRPYmplY3QoYCR7c0NvbnRleHRQYXRofS8ke3NBY3Rpb25OYW1lfUBPcmcuT0RhdGEuQ29yZS5WMS5PcGVyYXRpb25BdmFpbGFibGVgKTtcblx0fVxuXHRpZiAoYlJldHVybk9ubHlQYXRoKSB7XG5cdFx0cmV0dXJuIGAke3NDb250ZXh0UGF0aH0vJHtzQWN0aW9uTmFtZX1gO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiB7XG5cdFx0XHRzQ29udGV4dFBhdGg6IHNDb250ZXh0UGF0aCxcblx0XHRcdHNQcm9wZXJ0eTogYWN0aW9uQ29udGV4dC5nZXRPYmplY3QoYCR7c0NvbnRleHRQYXRofS8ke3NBY3Rpb25OYW1lfUBPcmcuT0RhdGEuQ29yZS5WMS5PcGVyYXRpb25BdmFpbGFibGUvJFBhdGhgKSxcblx0XHRcdHNCaW5kaW5nUGFyYW1ldGVyOiBhY3Rpb25Db250ZXh0LmdldE9iamVjdChgJHtzQ29udGV4dFBhdGh9LyR7c0FjdGlvbk5hbWV9L0AkdWk1Lm92ZXJsb2FkLzAvJFBhcmFtZXRlci8wLyROYW1lYClcblx0XHR9O1xuXHR9XG59XG5cbmZ1bmN0aW9uIGdldEVudGl0eVNldE5hbWUob01ldGFNb2RlbDogT0RhdGFNZXRhTW9kZWwsIHNFbnRpdHlUeXBlOiBzdHJpbmcpIHtcblx0Y29uc3Qgb0VudGl0eUNvbnRhaW5lciA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KFwiL1wiKTtcblx0Zm9yIChjb25zdCBrZXkgaW4gb0VudGl0eUNvbnRhaW5lcikge1xuXHRcdGlmICh0eXBlb2Ygb0VudGl0eUNvbnRhaW5lcltrZXldID09PSBcIm9iamVjdFwiICYmIG9FbnRpdHlDb250YWluZXJba2V5XS4kVHlwZSA9PT0gc0VudGl0eVR5cGUpIHtcblx0XHRcdHJldHVybiBrZXk7XG5cdFx0fVxuXHR9XG59XG5cbmZ1bmN0aW9uIGNvbXB1dGVEaXNwbGF5TW9kZShvUHJvcGVydHlBbm5vdGF0aW9uczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIG9Db2xsZWN0aW9uQW5ub3RhdGlvbnM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikge1xuXHRjb25zdCBvVGV4dEFubm90YXRpb24gPSBvUHJvcGVydHlBbm5vdGF0aW9uc1tcIkBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuVGV4dFwiXSxcblx0XHRvVGV4dEFycmFuZ2VtZW50QW5ub3RhdGlvbiA9IChvVGV4dEFubm90YXRpb24gJiZcblx0XHRcdCgob1Byb3BlcnR5QW5ub3RhdGlvbnMgJiZcblx0XHRcdFx0b1Byb3BlcnR5QW5ub3RhdGlvbnNbXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLlRleHRAY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuVGV4dEFycmFuZ2VtZW50XCJdKSB8fFxuXHRcdFx0XHQob0NvbGxlY3Rpb25Bbm5vdGF0aW9ucyAmJlxuXHRcdFx0XHRcdG9Db2xsZWN0aW9uQW5ub3RhdGlvbnNbXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuVGV4dEFycmFuZ2VtZW50XCJdKSkpIGFzIE1ldGFNb2RlbEVudW08VGV4dEFycmFuZ2VtZW50PjtcblxuXHRpZiAob1RleHRBcnJhbmdlbWVudEFubm90YXRpb24pIHtcblx0XHRpZiAob1RleHRBcnJhbmdlbWVudEFubm90YXRpb24uJEVudW1NZW1iZXIgPT09IFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuVGV4dEFycmFuZ2VtZW50VHlwZS9UZXh0T25seVwiKSB7XG5cdFx0XHRyZXR1cm4gXCJEZXNjcmlwdGlvblwiO1xuXHRcdH0gZWxzZSBpZiAob1RleHRBcnJhbmdlbWVudEFubm90YXRpb24uJEVudW1NZW1iZXIgPT09IFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuVGV4dEFycmFuZ2VtZW50VHlwZS9UZXh0TGFzdFwiKSB7XG5cdFx0XHRyZXR1cm4gXCJWYWx1ZURlc2NyaXB0aW9uXCI7XG5cdFx0fSBlbHNlIGlmIChvVGV4dEFycmFuZ2VtZW50QW5ub3RhdGlvbi4kRW51bU1lbWJlciA9PT0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5UZXh0QXJyYW5nZW1lbnRUeXBlL1RleHRTZXBhcmF0ZVwiKSB7XG5cdFx0XHRyZXR1cm4gXCJWYWx1ZVwiO1xuXHRcdH1cblx0XHQvL0RlZmF1bHQgc2hvdWxkIGJlIFRleHRGaXJzdCBpZiB0aGVyZSBpcyBhIFRleHQgYW5ub3RhdGlvbiBhbmQgbmVpdGhlciBUZXh0T25seSBub3IgVGV4dExhc3QgYXJlIHNldFxuXHRcdHJldHVybiBcIkRlc2NyaXB0aW9uVmFsdWVcIjtcblx0fVxuXHRyZXR1cm4gb1RleHRBbm5vdGF0aW9uID8gXCJEZXNjcmlwdGlvblZhbHVlXCIgOiBcIlZhbHVlXCI7XG59XG5cbmZ1bmN0aW9uIF9nZXRFbnRpdHlUeXBlKG9Db250ZXh0OiBPRGF0YVY0Q29udGV4dCkge1xuXHRjb25zdCBvTWV0YU1vZGVsID0gb0NvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKTtcblx0cmV0dXJuIG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke29NZXRhTW9kZWwuZ2V0TWV0YVBhdGgob0NvbnRleHQuZ2V0UGF0aCgpKX0vJFR5cGVgKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gX3JlcXVlc3RPYmplY3Qoc0FjdGlvbjogc3RyaW5nLCBvU2VsZWN0ZWRDb250ZXh0OiBPRGF0YVY0Q29udGV4dCwgc1Byb3BlcnR5OiBzdHJpbmcpIHtcblx0bGV0IG9Db250ZXh0ID0gb1NlbGVjdGVkQ29udGV4dDtcblx0Y29uc3QgbkJyYWNrZXRJbmRleCA9IHNBY3Rpb24uaW5kZXhPZihcIihcIik7XG5cblx0aWYgKG5CcmFja2V0SW5kZXggPiAtMSkge1xuXHRcdGNvbnN0IHNUYXJnZXRUeXBlID0gc0FjdGlvbi5zbGljZShuQnJhY2tldEluZGV4ICsgMSwgLTEpO1xuXHRcdGxldCBzQ3VycmVudFR5cGUgPSBfZ2V0RW50aXR5VHlwZShvQ29udGV4dCk7XG5cblx0XHR3aGlsZSAoc0N1cnJlbnRUeXBlICE9PSBzVGFyZ2V0VHlwZSkge1xuXHRcdFx0Ly8gRmluZCBwYXJlbnQgYmluZGluZyBjb250ZXh0IGFuZCByZXRyaWV2ZSBlbnRpdHkgdHlwZVxuXHRcdFx0b0NvbnRleHQgPSBvQ29udGV4dC5nZXRCaW5kaW5nKCkuZ2V0Q29udGV4dCgpIGFzIE9EYXRhVjRDb250ZXh0O1xuXHRcdFx0aWYgKG9Db250ZXh0KSB7XG5cdFx0XHRcdHNDdXJyZW50VHlwZSA9IF9nZXRFbnRpdHlUeXBlKG9Db250ZXh0KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdExvZy53YXJuaW5nKFwiQ2Fubm90IGRldGVybWluZSB0YXJnZXQgdHlwZSB0byByZXF1ZXN0IHByb3BlcnR5IHZhbHVlIGZvciBib3VuZCBhY3Rpb24gaW52b2NhdGlvblwiKTtcblx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSh1bmRlZmluZWQpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiBvQ29udGV4dC5yZXF1ZXN0T2JqZWN0KHNQcm9wZXJ0eSk7XG59XG5cbmV4cG9ydCB0eXBlIF9SZXF1ZXN0ZWRQcm9wZXJ0eSA9IHtcblx0dlByb3BlcnR5VmFsdWU6IHVua25vd247XG5cdG9TZWxlY3RlZENvbnRleHQ6IENvbnRleHQ7XG5cdHNBY3Rpb246IHN0cmluZztcblx0c0R5bmFtaWNBY3Rpb25FbmFibGVkUGF0aDogc3RyaW5nO1xufTtcbmFzeW5jIGZ1bmN0aW9uIHJlcXVlc3RQcm9wZXJ0eShcblx0b1NlbGVjdGVkQ29udGV4dDogT0RhdGFWNENvbnRleHQsXG5cdHNBY3Rpb246IHN0cmluZyxcblx0c1Byb3BlcnR5OiBzdHJpbmcsXG5cdHNEeW5hbWljQWN0aW9uRW5hYmxlZFBhdGg6IHN0cmluZ1xuKTogUHJvbWlzZTxfUmVxdWVzdGVkUHJvcGVydHk+IHtcblx0Y29uc3Qgb1Byb21pc2UgPVxuXHRcdHNQcm9wZXJ0eSAmJiBzUHJvcGVydHkuaW5kZXhPZihcIi9cIikgPT09IDBcblx0XHRcdD8gcmVxdWVzdFNpbmdsZXRvblByb3BlcnR5KHNQcm9wZXJ0eSwgb1NlbGVjdGVkQ29udGV4dC5nZXRNb2RlbCgpKVxuXHRcdFx0OiBfcmVxdWVzdE9iamVjdChzQWN0aW9uLCBvU2VsZWN0ZWRDb250ZXh0LCBzUHJvcGVydHkpO1xuXG5cdHJldHVybiBvUHJvbWlzZS50aGVuKGZ1bmN0aW9uICh2UHJvcGVydHlWYWx1ZTogdW5rbm93bikge1xuXHRcdHJldHVybiB7XG5cdFx0XHR2UHJvcGVydHlWYWx1ZTogdlByb3BlcnR5VmFsdWUsXG5cdFx0XHRvU2VsZWN0ZWRDb250ZXh0OiBvU2VsZWN0ZWRDb250ZXh0LFxuXHRcdFx0c0FjdGlvbjogc0FjdGlvbixcblx0XHRcdHNEeW5hbWljQWN0aW9uRW5hYmxlZFBhdGg6IHNEeW5hbWljQWN0aW9uRW5hYmxlZFBhdGhcblx0XHR9O1xuXHR9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2V0Q29udGV4dHNCYXNlZE9uT3BlcmF0aW9uQXZhaWxhYmxlKFxuXHRvSW50ZXJuYWxNb2RlbENvbnRleHQ6IEludGVybmFsTW9kZWxDb250ZXh0LFxuXHRhUmVxdWVzdFByb21pc2VzOiBQcm9taXNlPF9SZXF1ZXN0ZWRQcm9wZXJ0eT5bXVxuKSB7XG5cdHJldHVybiBQcm9taXNlLmFsbChhUmVxdWVzdFByb21pc2VzKVxuXHRcdC50aGVuKGZ1bmN0aW9uIChhUmVzdWx0cykge1xuXHRcdFx0aWYgKGFSZXN1bHRzLmxlbmd0aCkge1xuXHRcdFx0XHRjb25zdCBhQXBwbGljYWJsZUNvbnRleHRzOiB1bmtub3duW10gPSBbXSxcblx0XHRcdFx0XHRhTm90QXBwbGljYWJsZUNvbnRleHRzOiB1bmtub3duW10gPSBbXTtcblx0XHRcdFx0YVJlc3VsdHMuZm9yRWFjaChmdW5jdGlvbiAoYVJlc3VsdCkge1xuXHRcdFx0XHRcdGlmIChhUmVzdWx0KSB7XG5cdFx0XHRcdFx0XHRpZiAoYVJlc3VsdC52UHJvcGVydHlWYWx1ZSkge1xuXHRcdFx0XHRcdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuZ2V0TW9kZWwoKS5zZXRQcm9wZXJ0eShhUmVzdWx0LnNEeW5hbWljQWN0aW9uRW5hYmxlZFBhdGgsIHRydWUpO1xuXHRcdFx0XHRcdFx0XHRhQXBwbGljYWJsZUNvbnRleHRzLnB1c2goYVJlc3VsdC5vU2VsZWN0ZWRDb250ZXh0KTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdGFOb3RBcHBsaWNhYmxlQ29udGV4dHMucHVzaChhUmVzdWx0Lm9TZWxlY3RlZENvbnRleHQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHRcdHNldER5bmFtaWNBY3Rpb25Db250ZXh0cyhvSW50ZXJuYWxNb2RlbENvbnRleHQsIGFSZXN1bHRzWzBdLnNBY3Rpb24sIGFBcHBsaWNhYmxlQ29udGV4dHMsIGFOb3RBcHBsaWNhYmxlQ29udGV4dHMpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuO1xuXHRcdH0pXG5cdFx0LmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IHVua25vd24pIHtcblx0XHRcdExvZy50cmFjZShcIkNhbm5vdCByZXRyaWV2ZSBwcm9wZXJ0eSB2YWx1ZSBmcm9tIHBhdGhcIiwgb0Vycm9yIGFzIHN0cmluZyk7XG5cdFx0fSk7XG59XG5cbi8qKlxuICogQHBhcmFtIG9JbnRlcm5hbE1vZGVsQ29udGV4dFxuICogQHBhcmFtIHNBY3Rpb25cbiAqIEBwYXJhbSBhQXBwbGljYWJsZVxuICogQHBhcmFtIGFOb3RBcHBsaWNhYmxlXG4gKi9cbmZ1bmN0aW9uIHNldER5bmFtaWNBY3Rpb25Db250ZXh0cyhcblx0b0ludGVybmFsTW9kZWxDb250ZXh0OiBJbnRlcm5hbE1vZGVsQ29udGV4dCxcblx0c0FjdGlvbjogc3RyaW5nLFxuXHRhQXBwbGljYWJsZTogdW5rbm93bltdLFxuXHRhTm90QXBwbGljYWJsZTogdW5rbm93bltdXG4pIHtcblx0Y29uc3Qgc0R5bmFtaWNBY3Rpb25QYXRoUHJlZml4ID0gYCR7b0ludGVybmFsTW9kZWxDb250ZXh0LmdldFBhdGgoKX0vZHluYW1pY0FjdGlvbnMvJHtzQWN0aW9ufWAsXG5cdFx0b0ludGVybmFsTW9kZWwgPSBvSW50ZXJuYWxNb2RlbENvbnRleHQuZ2V0TW9kZWwoKTtcblx0b0ludGVybmFsTW9kZWwuc2V0UHJvcGVydHkoYCR7c0R5bmFtaWNBY3Rpb25QYXRoUHJlZml4fS9hQXBwbGljYWJsZWAsIGFBcHBsaWNhYmxlKTtcblx0b0ludGVybmFsTW9kZWwuc2V0UHJvcGVydHkoYCR7c0R5bmFtaWNBY3Rpb25QYXRoUHJlZml4fS9hTm90QXBwbGljYWJsZWAsIGFOb3RBcHBsaWNhYmxlKTtcbn1cblxuZnVuY3Rpb24gX2dldERlZmF1bHRPcGVyYXRvcnMoc1Byb3BlcnR5VHlwZT86IHN0cmluZykge1xuXHQvLyBtZGMgZGVmaW5lcyB0aGUgZnVsbCBzZXQgb2Ygb3BlcmF0aW9ucyB0aGF0IGFyZSBtZWFuaW5nZnVsIGZvciBlYWNoIEVkbSBUeXBlXG5cdC8vIFRPRE8gUmVwbGFjZSB3aXRoIG1vZGVsIC8gaW50ZXJuYWwgd2F5IG9mIHJldHJpZXZpbmcgdGhlIGFjdHVhbCBtb2RlbCB0eXBlIHVzZWQgZm9yIHRoZSBwcm9wZXJ0eVxuXHRjb25zdCBvRGF0YUNsYXNzID0gVHlwZVV0aWwuZ2V0RGF0YVR5cGVDbGFzc05hbWUoc1Byb3BlcnR5VHlwZSk7XG5cdC8vIFRPRE8gbmVlZCB0byBwYXNzIHByb3BlciBmb3JtYXRPcHRpb25zLCBjb25zdHJhaW50cyBoZXJlXG5cdGNvbnN0IG9CYXNlVHlwZSA9IFR5cGVVdGlsLmdldEJhc2VUeXBlKG9EYXRhQ2xhc3MsIHt9LCB7fSk7XG5cdHJldHVybiBGaWx0ZXJPcGVyYXRvclV0aWwuZ2V0T3BlcmF0b3JzRm9yVHlwZShvQmFzZVR5cGUpO1xufVxuXG5mdW5jdGlvbiBfZ2V0UmVzdHJpY3Rpb25zKGFEZWZhdWx0T3BzOiBzdHJpbmdbXSwgYUV4cHJlc3Npb25PcHM6IHN0cmluZ1tdKTogc3RyaW5nW10ge1xuXHQvLyBGcm9tIHRoZSBkZWZhdWx0IHNldCBvZiBPcGVyYXRvcnMgZm9yIHRoZSBCYXNlIFR5cGUsIHNlbGVjdCB0aG9zZSB0aGF0IGFyZSBkZWZpbmVkIGluIHRoZSBBbGxvd2VkIFZhbHVlLlxuXHQvLyBJbiBjYXNlIHRoYXQgbm8gb3BlcmF0b3JzIGFyZSBmb3VuZCwgcmV0dXJuIHVuZGVmaW5lZCBzbyB0aGF0IHRoZSBkZWZhdWx0IHNldCBpcyB1c2VkLlxuXHRyZXR1cm4gYURlZmF1bHRPcHMuZmlsdGVyKGZ1bmN0aW9uIChzRWxlbWVudCkge1xuXHRcdHJldHVybiBhRXhwcmVzc2lvbk9wcy5pbmRleE9mKHNFbGVtZW50KSA+IC0xO1xuXHR9KTtcbn1cblxuZnVuY3Rpb24gZ2V0U3BlY2lmaWNBbGxvd2VkRXhwcmVzc2lvbihhRXhwcmVzc2lvbnM6IHN0cmluZ1tdKSB7XG5cdGNvbnN0IGFBbGxvd2VkRXhwcmVzc2lvbnNQcmlvcml0eSA9IENvbW1vblV0aWxzLkFsbG93ZWRFeHByZXNzaW9uc1ByaW87XG5cblx0YUV4cHJlc3Npb25zLnNvcnQoZnVuY3Rpb24gKGE6IHN0cmluZywgYjogc3RyaW5nKSB7XG5cdFx0cmV0dXJuIGFBbGxvd2VkRXhwcmVzc2lvbnNQcmlvcml0eS5pbmRleE9mKGEpIC0gYUFsbG93ZWRFeHByZXNzaW9uc1ByaW9yaXR5LmluZGV4T2YoYik7XG5cdH0pO1xuXG5cdHJldHVybiBhRXhwcmVzc2lvbnNbMF07XG59XG5cbi8qKlxuICogTWV0aG9kIHRvIGZldGNoIHRoZSBjb3JyZWN0IG9wZXJhdG9ycyBiYXNlZCBvbiB0aGUgZmlsdGVyIHJlc3RyaWN0aW9ucyB0aGF0IGNhbiBiZSBhbm5vdGF0ZWQgb24gYW4gZW50aXR5IHNldCBvciBhIG5hdmlnYXRpb24gcHJvcGVydHkuXG4gKiBXZSByZXR1cm4gdGhlIGNvcnJlY3Qgb3BlcmF0b3JzIGJhc2VkIG9uIHRoZSBzcGVjaWZpZWQgcmVzdHJpY3Rpb24gYW5kIGFsc28gY2hlY2sgZm9yIHRoZSBvcGVyYXRvcnMgZGVmaW5lZCBpbiB0aGUgbWFuaWZlc3QgdG8gaW5jbHVkZSBvciBleGNsdWRlIHRoZW0uXG4gKlxuICogQHBhcmFtIHNQcm9wZXJ0eSBTdHJpbmcgbmFtZSBvZiB0aGUgcHJvcGVydHlcbiAqIEBwYXJhbSBzRW50aXR5U2V0UGF0aCBTdHJpbmcgcGF0aCB0byB0aGUgZW50aXR5IHNldFxuICogQHBhcmFtIG9Db250ZXh0IENvbnRleHQgdXNlZCBkdXJpbmcgdGVtcGxhdGluZ1xuICogQHBhcmFtIHNUeXBlIFN0cmluZyBkYXRhIHR5cGUgb2QgdGhlIHByb3BlcnR5LCBmb3IgZXhhbXBsZSBlZG0uRGF0ZVxuICogQHBhcmFtIGJVc2VTZW1hbnRpY0RhdGVSYW5nZSBCb29sZWFuIHBhc3NlZCBmcm9tIHRoZSBtYW5pZmVzdCBmb3Igc2VtYW50aWMgZGF0ZSByYW5nZVxuICogQHBhcmFtIHNTZXR0aW5ncyBTdHJpbmdpZmllZCBvYmplY3Qgb2YgdGhlIHByb3BlcnR5IHNldHRpbmdzXG4gKiBAcmV0dXJucyBBbiBhcnJheSBvZiBzdHJpbmdzIHJlcHJlc2VudGluZyBvcGVyYXRvcnMgZm9yIGZpbHRlcmluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0T3BlcmF0b3JzRm9yUHJvcGVydHkoXG5cdHNQcm9wZXJ0eTogc3RyaW5nLFxuXHRzRW50aXR5U2V0UGF0aDogc3RyaW5nLFxuXHRvQ29udGV4dDogT0RhdGFNZXRhTW9kZWwsXG5cdHNUeXBlPzogc3RyaW5nLFxuXHRiVXNlU2VtYW50aWNEYXRlUmFuZ2U/OiBib29sZWFuIHwgc3RyaW5nLFxuXHRzU2V0dGluZ3M/OiBzdHJpbmdcbik6IHN0cmluZ1tdIHtcblx0Y29uc3Qgb0ZpbHRlclJlc3RyaWN0aW9ucyA9IENvbW1vblV0aWxzLmdldEZpbHRlclJlc3RyaWN0aW9uc0J5UGF0aChzRW50aXR5U2V0UGF0aCwgb0NvbnRleHQpO1xuXHRjb25zdCBhRXF1YWxzT3BzID0gW1wiRVFcIl07XG5cdGNvbnN0IGFTaW5nbGVSYW5nZU9wcyA9IFtcIkVRXCIsIFwiR0VcIiwgXCJMRVwiLCBcIkxUXCIsIFwiR1RcIiwgXCJCVFwiLCBcIk5PVExFXCIsIFwiTk9UTFRcIiwgXCJOT1RHRVwiLCBcIk5PVEdUXCJdO1xuXHRjb25zdCBhU2luZ2xlUmFuZ2VEVEJhc2ljT3BzID0gW1wiRVFcIiwgXCJCVFwiXTtcblx0Y29uc3QgYVNpbmdsZVZhbHVlRGF0ZU9wcyA9IFtcblx0XHRcIlRPREFZXCIsXG5cdFx0XCJUT01PUlJPV1wiLFxuXHRcdFwiWUVTVEVSREFZXCIsXG5cdFx0XCJEQVRFXCIsXG5cdFx0XCJGSVJTVERBWVdFRUtcIixcblx0XHRcIkxBU1REQVlXRUVLXCIsXG5cdFx0XCJGSVJTVERBWU1PTlRIXCIsXG5cdFx0XCJMQVNUREFZTU9OVEhcIixcblx0XHRcIkZJUlNUREFZUVVBUlRFUlwiLFxuXHRcdFwiTEFTVERBWVFVQVJURVJcIixcblx0XHRcIkZJUlNUREFZWUVBUlwiLFxuXHRcdFwiTEFTVERBWVlFQVJcIlxuXHRdO1xuXHRjb25zdCBhQmFzaWNEYXRlVGltZU9wcyA9IFtcIkVRXCIsIFwiQlRcIl07XG5cdGNvbnN0IGFNdWx0aVJhbmdlT3BzID0gW1wiRVFcIiwgXCJHRVwiLCBcIkxFXCIsIFwiTFRcIiwgXCJHVFwiLCBcIkJUXCIsIFwiTkVcIiwgXCJOT1RCVFwiLCBcIk5PVExFXCIsIFwiTk9UTFRcIiwgXCJOT1RHRVwiLCBcIk5PVEdUXCJdO1xuXHRjb25zdCBhU2VhcmNoRXhwcmVzc2lvbk9wcyA9IFtcIkNvbnRhaW5zXCIsIFwiTm90Q29udGFpbnNcIiwgXCJTdGFydHNXaXRoXCIsIFwiTm90U3RhcnRzV2l0aFwiLCBcIkVuZHNXaXRoXCIsIFwiTm90RW5kc1dpdGhcIl07XG5cdGNvbnN0IGFTZW1hbnRpY0RhdGVPcHNFeHQgPSBTZW1hbnRpY0RhdGVPcGVyYXRvcnMuZ2V0U3VwcG9ydGVkT3BlcmF0aW9ucygpO1xuXHRjb25zdCBiU2VtYW50aWNEYXRlUmFuZ2UgPSBiVXNlU2VtYW50aWNEYXRlUmFuZ2UgPT09IFwidHJ1ZVwiIHx8IGJVc2VTZW1hbnRpY0RhdGVSYW5nZSA9PT0gdHJ1ZTtcblx0bGV0IGFTZW1hbnRpY0RhdGVPcHM6IHN0cmluZ1tdID0gW107XG5cdGNvbnN0IG9TZXR0aW5ncyA9IHNTZXR0aW5ncyAmJiB0eXBlb2Ygc1NldHRpbmdzID09PSBcInN0cmluZ1wiID8gSlNPTi5wYXJzZShzU2V0dGluZ3MpLmN1c3RvbURhdGEgOiBzU2V0dGluZ3M7XG5cblx0aWYgKChvQ29udGV4dC5nZXRPYmplY3QoYCR7c0VudGl0eVNldFBhdGh9L0Bjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuUmVzdWx0Q29udGV4dGApIGFzIHVua25vd24pID09PSB0cnVlKSB7XG5cdFx0cmV0dXJuIGFFcXVhbHNPcHM7XG5cdH1cblxuXHRpZiAob1NldHRpbmdzICYmIG9TZXR0aW5ncy5vcGVyYXRvckNvbmZpZ3VyYXRpb24gJiYgb1NldHRpbmdzLm9wZXJhdG9yQ29uZmlndXJhdGlvbi5sZW5ndGggPiAwKSB7XG5cdFx0YVNlbWFudGljRGF0ZU9wcyA9IFNlbWFudGljRGF0ZU9wZXJhdG9ycy5nZXRGaWx0ZXJPcGVyYXRpb25zKG9TZXR0aW5ncy5vcGVyYXRvckNvbmZpZ3VyYXRpb24pO1xuXHR9IGVsc2Uge1xuXHRcdGFTZW1hbnRpY0RhdGVPcHMgPSBTZW1hbnRpY0RhdGVPcGVyYXRvcnMuZ2V0U2VtYW50aWNEYXRlT3BlcmF0aW9ucygpO1xuXHR9XG5cdC8vIEdldCB0aGUgZGVmYXVsdCBPcGVyYXRvcnMgZm9yIHRoaXMgUHJvcGVydHkgVHlwZVxuXHRsZXQgYURlZmF1bHRPcGVyYXRvcnMgPSBfZ2V0RGVmYXVsdE9wZXJhdG9ycyhzVHlwZSk7XG5cdGlmIChiU2VtYW50aWNEYXRlUmFuZ2UpIHtcblx0XHRhRGVmYXVsdE9wZXJhdG9ycyA9IGFTZW1hbnRpY0RhdGVPcHNFeHQuY29uY2F0KGFEZWZhdWx0T3BlcmF0b3JzKTtcblx0fVxuXHRsZXQgcmVzdHJpY3Rpb25zOiBzdHJpbmdbXSA9IFtdO1xuXG5cdC8vIElzIHRoZXJlIGEgRmlsdGVyIFJlc3RyaWN0aW9uIGRlZmluZWQgZm9yIHRoaXMgcHJvcGVydHk/XG5cdGlmIChvRmlsdGVyUmVzdHJpY3Rpb25zICYmIG9GaWx0ZXJSZXN0cmljdGlvbnMuRmlsdGVyQWxsb3dlZEV4cHJlc3Npb25zICYmIG9GaWx0ZXJSZXN0cmljdGlvbnMuRmlsdGVyQWxsb3dlZEV4cHJlc3Npb25zW3NQcm9wZXJ0eV0pIHtcblx0XHQvLyBFeHRlbmRpbmcgdGhlIGRlZmF1bHQgb3BlcmF0b3JzIGxpc3Qgd2l0aCBTZW1hbnRpYyBEYXRlIG9wdGlvbnMgREFURVJBTkdFLCBEQVRFLCBGUk9NIGFuZCBUT1xuXHRcdGNvbnN0IHNBbGxvd2VkRXhwcmVzc2lvbiA9IENvbW1vblV0aWxzLmdldFNwZWNpZmljQWxsb3dlZEV4cHJlc3Npb24ob0ZpbHRlclJlc3RyaWN0aW9ucy5GaWx0ZXJBbGxvd2VkRXhwcmVzc2lvbnNbc1Byb3BlcnR5XSk7XG5cdFx0Ly8gSW4gY2FzZSBtb3JlIHRoYW4gb25lIEFsbG93ZWQgRXhwcmVzc2lvbnMgaGFzIGJlZW4gZGVmaW5lZCBmb3IgYSBwcm9wZXJ0eVxuXHRcdC8vIGNob29zZSB0aGUgbW9zdCByZXN0cmljdGl2ZSBBbGxvd2VkIEV4cHJlc3Npb25cblxuXHRcdC8vIE11bHRpVmFsdWUgaGFzIHNhbWUgT3BlcmF0b3IgYXMgU2luZ2xlVmFsdWUsIGJ1dCB0aGVyZSBjYW4gYmUgbW9yZSB0aGFuIG9uZSAobWF4Q29uZGl0aW9ucylcblx0XHRzd2l0Y2ggKHNBbGxvd2VkRXhwcmVzc2lvbikge1xuXHRcdFx0Y2FzZSBcIlNpbmdsZVZhbHVlXCI6XG5cdFx0XHRcdGNvbnN0IGFTaW5nbGVWYWx1ZU9wcyA9IHNUeXBlID09PSBcIkVkbS5EYXRlXCIgJiYgYlNlbWFudGljRGF0ZVJhbmdlID8gYVNpbmdsZVZhbHVlRGF0ZU9wcyA6IGFFcXVhbHNPcHM7XG5cdFx0XHRcdHJlc3RyaWN0aW9ucyA9IF9nZXRSZXN0cmljdGlvbnMoYURlZmF1bHRPcGVyYXRvcnMsIGFTaW5nbGVWYWx1ZU9wcyk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSBcIk11bHRpVmFsdWVcIjpcblx0XHRcdFx0cmVzdHJpY3Rpb25zID0gX2dldFJlc3RyaWN0aW9ucyhhRGVmYXVsdE9wZXJhdG9ycywgYUVxdWFsc09wcyk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSBcIlNpbmdsZVJhbmdlXCI6XG5cdFx0XHRcdGxldCBhRXhwcmVzc2lvbk9wczogc3RyaW5nW107XG5cdFx0XHRcdGlmIChiU2VtYW50aWNEYXRlUmFuZ2UpIHtcblx0XHRcdFx0XHRpZiAoc1R5cGUgPT09IFwiRWRtLkRhdGVcIikge1xuXHRcdFx0XHRcdFx0YUV4cHJlc3Npb25PcHMgPSBhU2VtYW50aWNEYXRlT3BzO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAoc1R5cGUgPT09IFwiRWRtLkRhdGVUaW1lT2Zmc2V0XCIpIHtcblx0XHRcdFx0XHRcdGFFeHByZXNzaW9uT3BzID0gYVNlbWFudGljRGF0ZU9wcy5jb25jYXQoYUJhc2ljRGF0ZVRpbWVPcHMpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRhRXhwcmVzc2lvbk9wcyA9IGFTaW5nbGVSYW5nZU9wcztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSBpZiAoc1R5cGUgPT09IFwiRWRtLkRhdGVUaW1lT2Zmc2V0XCIpIHtcblx0XHRcdFx0XHRhRXhwcmVzc2lvbk9wcyA9IGFTaW5nbGVSYW5nZURUQmFzaWNPcHM7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0YUV4cHJlc3Npb25PcHMgPSBhU2luZ2xlUmFuZ2VPcHM7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29uc3Qgc09wZXJhdG9ycyA9IF9nZXRSZXN0cmljdGlvbnMoYURlZmF1bHRPcGVyYXRvcnMsIGFFeHByZXNzaW9uT3BzKTtcblx0XHRcdFx0cmVzdHJpY3Rpb25zID0gc09wZXJhdG9ycztcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFwiTXVsdGlSYW5nZVwiOlxuXHRcdFx0XHRyZXN0cmljdGlvbnMgPSBfZ2V0UmVzdHJpY3Rpb25zKGFEZWZhdWx0T3BlcmF0b3JzLCBhTXVsdGlSYW5nZU9wcyk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSBcIlNlYXJjaEV4cHJlc3Npb25cIjpcblx0XHRcdFx0cmVzdHJpY3Rpb25zID0gX2dldFJlc3RyaWN0aW9ucyhhRGVmYXVsdE9wZXJhdG9ycywgYVNlYXJjaEV4cHJlc3Npb25PcHMpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgXCJNdWx0aVJhbmdlT3JTZWFyY2hFeHByZXNzaW9uXCI6XG5cdFx0XHRcdHJlc3RyaWN0aW9ucyA9IF9nZXRSZXN0cmljdGlvbnMoYURlZmF1bHRPcGVyYXRvcnMsIGFTZWFyY2hFeHByZXNzaW9uT3BzLmNvbmNhdChhTXVsdGlSYW5nZU9wcykpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdGJyZWFrO1xuXHRcdH1cblx0XHQvLyBJbiBjYXNlIEFsbG93ZWRFeHByZXNzaW9ucyBpcyBub3QgcmVjb2duaXNlZCwgdW5kZWZpbmVkIGluIHJldHVybiByZXN1bHRzIGluIHRoZSBkZWZhdWx0IHNldCBvZlxuXHRcdC8vIG9wZXJhdG9ycyBmb3IgdGhlIHR5cGUuXG5cdH1cblx0cmV0dXJuIHJlc3RyaWN0aW9ucztcbn1cblxuLyoqXG4gKiBNZXRob2QgdG8gcmV0dXJuIGFsbG93ZWQgb3BlcmF0b3JzIGZvciB0eXBlIEd1aWQuXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAbmFtZSBnZXRPcGVyYXRvcnNGb3JHdWlkUHJvcGVydHlcbiAqIEByZXR1cm5zIEFsbG93ZWQgb3BlcmF0b3JzIGZvciB0eXBlIEd1aWRcbiAqL1xuZnVuY3Rpb24gZ2V0T3BlcmF0b3JzRm9yR3VpZFByb3BlcnR5KCk6IHN0cmluZyB7XG5cdGNvbnN0IGFsbG93ZWRPcGVyYXRvcnNGb3JHdWlkID0gW1wiRVFcIiwgXCJORVwiXTtcblx0cmV0dXJuIGFsbG93ZWRPcGVyYXRvcnNGb3JHdWlkLnRvU3RyaW5nKCk7XG59XG5cbmZ1bmN0aW9uIGdldE9wZXJhdG9yc0ZvckRhdGVQcm9wZXJ0eShwcm9wZXJ0eVR5cGU6IHN0cmluZyk6IHN0cmluZ1tdIHtcblx0Ly8gSW4gY2FzZSBBbGxvd2VkRXhwcmVzc2lvbnMgaXMgbm90IHByb3ZpZGVkIGZvciB0eXBlIEVkbS5EYXRlIHRoZW4gYWxsIHRoZSBkZWZhdWx0XG5cdC8vIG9wZXJhdG9ycyBmb3IgdGhlIHR5cGUgc2hvdWxkIGJlIHJldHVybmVkIGV4Y2x1ZGluZyBzZW1hbnRpYyBvcGVyYXRvcnMgZnJvbSB0aGUgbGlzdC5cblx0Y29uc3QgYURlZmF1bHRPcGVyYXRvcnMgPSBfZ2V0RGVmYXVsdE9wZXJhdG9ycyhwcm9wZXJ0eVR5cGUpO1xuXHRjb25zdCBhTXVsdGlSYW5nZU9wcyA9IFtcIkVRXCIsIFwiR0VcIiwgXCJMRVwiLCBcIkxUXCIsIFwiR1RcIiwgXCJCVFwiLCBcIk5FXCIsIFwiTk9UQlRcIiwgXCJOT1RMRVwiLCBcIk5PVExUXCIsIFwiTk9UR0VcIiwgXCJOT1RHVFwiXTtcblx0cmV0dXJuIF9nZXRSZXN0cmljdGlvbnMoYURlZmF1bHRPcGVyYXRvcnMsIGFNdWx0aVJhbmdlT3BzKTtcbn1cblxudHlwZSBQYXJhbWV0ZXJJbmZvID0ge1xuXHRjb250ZXh0UGF0aD86IHN0cmluZztcblx0cGFyYW1ldGVyUHJvcGVydGllcz86IFJlY29yZDxzdHJpbmcsIE1ldGFNb2RlbFByb3BlcnR5Pjtcbn07XG5mdW5jdGlvbiBnZXRQYXJhbWV0ZXJJbmZvKG1ldGFNb2RlbENvbnRleHQ6IE9EYXRhTWV0YU1vZGVsLCBzQ29udGV4dFBhdGg6IHN0cmluZykge1xuXHRjb25zdCBzUGFyYW1ldGVyQ29udGV4dFBhdGggPSBzQ29udGV4dFBhdGguc3Vic3RyaW5nKDAsIHNDb250ZXh0UGF0aC5sYXN0SW5kZXhPZihcIi9cIikpO1xuXHRjb25zdCBiUmVzdWx0Q29udGV4dCA9IG1ldGFNb2RlbENvbnRleHQuZ2V0T2JqZWN0KGAke3NQYXJhbWV0ZXJDb250ZXh0UGF0aH0vQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5SZXN1bHRDb250ZXh0YCk7XG5cdGNvbnN0IG9QYXJhbWV0ZXJJbmZvOiBQYXJhbWV0ZXJJbmZvID0ge307XG5cdGlmIChiUmVzdWx0Q29udGV4dCAmJiBzUGFyYW1ldGVyQ29udGV4dFBhdGggIT09IHNDb250ZXh0UGF0aCkge1xuXHRcdG9QYXJhbWV0ZXJJbmZvLmNvbnRleHRQYXRoID0gc1BhcmFtZXRlckNvbnRleHRQYXRoO1xuXHRcdG9QYXJhbWV0ZXJJbmZvLnBhcmFtZXRlclByb3BlcnRpZXMgPSBDb21tb25VdGlscy5nZXRDb250ZXh0UGF0aFByb3BlcnRpZXMobWV0YU1vZGVsQ29udGV4dCwgc1BhcmFtZXRlckNvbnRleHRQYXRoKTtcblx0fVxuXHRyZXR1cm4gb1BhcmFtZXRlckluZm87XG59XG5cbi8qKlxuICogTWV0aG9kIHRvIGFkZCB0aGUgc2VsZWN0IE9wdGlvbnMgdG8gZmlsdGVyIGNvbmRpdGlvbnMuXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAbmFtZSBhZGRTZWxlY3RPcHRpb25Ub0NvbmRpdGlvbnNcbiAqIEBwYXJhbSBvUHJvcGVydHlNZXRhZGF0YSBQcm9wZXJ0eSBtZXRhZGF0YSBpbmZvcm1hdGlvblxuICogQHBhcmFtIGFWYWxpZE9wZXJhdG9ycyBPcGVyYXRvcnMgZm9yIGFsbCB0aGUgZGF0YSB0eXBlc1xuICogQHBhcmFtIGFTZW1hbnRpY0RhdGVPcGVyYXRvcnMgT3BlcmF0b3JzIGZvciB0aGUgRGF0ZSB0eXBlXG4gKiBAcGFyYW0gYUN1bXVsYXRpdmVDb25kaXRpb25zIEZpbHRlciBjb25kaXRpb25zXG4gKiBAcGFyYW0gb1NlbGVjdE9wdGlvbiBTZWxlY3RvcHRpb24gb2Ygc2VsZWN0aW9uIHZhcmlhbnRcbiAqIEByZXR1cm5zIFRoZSBmaWx0ZXIgY29uZGl0aW9uc1xuICovXG5mdW5jdGlvbiBhZGRTZWxlY3RPcHRpb25Ub0NvbmRpdGlvbnMoXG5cdG9Qcm9wZXJ0eU1ldGFkYXRhOiB1bmtub3duLFxuXHRhVmFsaWRPcGVyYXRvcnM6IHN0cmluZ1tdLFxuXHRhU2VtYW50aWNEYXRlT3BlcmF0b3JzOiBzdHJpbmdbXSxcblx0YUN1bXVsYXRpdmVDb25kaXRpb25zOiBDb25kaXRpb25PYmplY3RbXSxcblx0b1NlbGVjdE9wdGlvbjogU2VsZWN0T3B0aW9uXG4pIHtcblx0Y29uc3Qgb0NvbmRpdGlvbiA9IGdldENvbmRpdGlvbnMob1NlbGVjdE9wdGlvbiwgb1Byb3BlcnR5TWV0YWRhdGEpO1xuXHRpZiAoXG5cdFx0b1NlbGVjdE9wdGlvbj8uU2VtYW50aWNEYXRlcyAmJlxuXHRcdGFTZW1hbnRpY0RhdGVPcGVyYXRvcnMgJiZcblx0XHRhU2VtYW50aWNEYXRlT3BlcmF0b3JzLmluZGV4T2Yob1NlbGVjdE9wdGlvbj8uU2VtYW50aWNEYXRlcz8ub3BlcmF0b3IpID4gLTFcblx0KSB7XG5cdFx0Y29uc3Qgc2VtYW50aWNEYXRlcyA9IENvbW1vblV0aWxzLmFkZFNlbWFudGljRGF0ZXNUb0NvbmRpdGlvbnMob1NlbGVjdE9wdGlvbj8uU2VtYW50aWNEYXRlcyk7XG5cdFx0aWYgKHNlbWFudGljRGF0ZXMgJiYgT2JqZWN0LmtleXMoc2VtYW50aWNEYXRlcykubGVuZ3RoID4gMCkge1xuXHRcdFx0YUN1bXVsYXRpdmVDb25kaXRpb25zLnB1c2goc2VtYW50aWNEYXRlcyk7XG5cdFx0fVxuXHR9IGVsc2UgaWYgKG9Db25kaXRpb24pIHtcblx0XHRpZiAoYVZhbGlkT3BlcmF0b3JzLmxlbmd0aCA9PT0gMCB8fCBhVmFsaWRPcGVyYXRvcnMuaW5kZXhPZihvQ29uZGl0aW9uLm9wZXJhdG9yKSA+IC0xKSB7XG5cdFx0XHRhQ3VtdWxhdGl2ZUNvbmRpdGlvbnMucHVzaChvQ29uZGl0aW9uKTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIGFDdW11bGF0aXZlQ29uZGl0aW9ucztcbn1cblxuLyoqXG4gKiBNZXRob2QgdG8gYWRkIHRoZSBzZW1hbnRpYyBkYXRlcyB0byBmaWx0ZXIgY29uZGl0aW9uc1xuICpcbiAqIEBmdW5jdGlvblxuICogQG5hbWUgYWRkU2VtYW50aWNEYXRlc1RvQ29uZGl0aW9uc1xuICogQHBhcmFtIG9TZW1hbnRpY0RhdGVzIFNlbWFudGljIGRhdGUgaW5mb21hdGlvblxuICogQHJldHVybnMgVGhlIGZpbHRlciBjb25kaXRpb25zIGNvbnRhaW5pbmcgc2VtYW50aWMgZGF0ZXNcbiAqL1xuXG5mdW5jdGlvbiBhZGRTZW1hbnRpY0RhdGVzVG9Db25kaXRpb25zKG9TZW1hbnRpY0RhdGVzOiBTZW1hbnRpY0RhdGVDb25maWd1cmF0aW9uKTogQ29uZGl0aW9uT2JqZWN0IHtcblx0Y29uc3QgdmFsdWVzOiB1bmtub3duW10gPSBbXTtcblx0aWYgKG9TZW1hbnRpY0RhdGVzPy5oaWdoKSB7XG5cdFx0dmFsdWVzLnB1c2gob1NlbWFudGljRGF0ZXM/LmhpZ2gpO1xuXHR9XG5cdGlmIChvU2VtYW50aWNEYXRlcz8ubG93KSB7XG5cdFx0dmFsdWVzLnB1c2gob1NlbWFudGljRGF0ZXM/Lmxvdyk7XG5cdH1cblx0cmV0dXJuIHtcblx0XHR2YWx1ZXM6IHZhbHVlcyxcblx0XHRvcGVyYXRvcjogb1NlbWFudGljRGF0ZXM/Lm9wZXJhdG9yLFxuXHRcdGlzRW1wdHk6IHVuZGVmaW5lZFxuXHR9O1xufVxuXG5mdW5jdGlvbiBhZGRTZWxlY3RPcHRpb25zVG9Db25kaXRpb25zKFxuXHRzQ29udGV4dFBhdGg6IHN0cmluZyxcblx0b1NlbGVjdGlvblZhcmlhbnQ6IFNlbGVjdGlvblZhcmlhbnQsXG5cdHNTZWxlY3RPcHRpb25Qcm9wOiBzdHJpbmcsXG5cdG9Db25kaXRpb25zOiBSZWNvcmQ8c3RyaW5nLCBDb25kaXRpb25PYmplY3RbXT4sXG5cdHNDb25kaXRpb25QYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQsXG5cdHNDb25kaXRpb25Qcm9wOiBzdHJpbmcsXG5cdG9WYWxpZFByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIE1ldGFNb2RlbFByb3BlcnR5Pixcblx0bWV0YU1vZGVsQ29udGV4dDogT0RhdGFNZXRhTW9kZWwsXG5cdGlzUGFyYW1ldGVyOiBib29sZWFuLFxuXHRiSXNGTFBWYWx1ZVByZXNlbnQ/OiBib29sZWFuLFxuXHRiVXNlU2VtYW50aWNEYXRlUmFuZ2U/OiBib29sZWFuIHwgc3RyaW5nLFxuXHRvVmlld0RhdGE/OiBvYmplY3Rcbikge1xuXHRsZXQgYUNvbmRpdGlvbnM6IENvbmRpdGlvbk9iamVjdFtdID0gW10sXG5cdFx0YVNlbGVjdE9wdGlvbnM6IFNlbGVjdE9wdGlvbltdLFxuXHRcdGFWYWxpZE9wZXJhdG9yczogc3RyaW5nW10sXG5cdFx0YVNlbWFudGljRGF0ZU9wZXJhdG9yczogc3RyaW5nW10gPSBbXTtcblxuXHRpZiAoaXNQYXJhbWV0ZXIgfHwgTWV0YU1vZGVsRnVuY3Rpb24uaXNQcm9wZXJ0eUZpbHRlcmFibGUobWV0YU1vZGVsQ29udGV4dCwgc0NvbnRleHRQYXRoLCBzQ29uZGl0aW9uUHJvcCwgdHJ1ZSkpIHtcblx0XHRjb25zdCBvUHJvcGVydHlNZXRhZGF0YSA9IG9WYWxpZFByb3BlcnRpZXNbc0NvbmRpdGlvblByb3BdO1xuXHRcdGFTZWxlY3RPcHRpb25zID0gb1NlbGVjdGlvblZhcmlhbnQuZ2V0U2VsZWN0T3B0aW9uKHNTZWxlY3RPcHRpb25Qcm9wKSBhcyBTZWxlY3RPcHRpb25bXTtcblx0XHRjb25zdCBzZXR0aW5ncyA9IGdldEZpbHRlckNvbmZpZ3VyYXRpb25TZXR0aW5nKG9WaWV3RGF0YSwgc0NvbmRpdGlvblByb3ApO1xuXHRcdGFWYWxpZE9wZXJhdG9ycyA9IGlzUGFyYW1ldGVyID8gW1wiRVFcIl0gOiBDb21tb25VdGlscy5nZXRPcGVyYXRvcnNGb3JQcm9wZXJ0eShzQ29uZGl0aW9uUHJvcCwgc0NvbnRleHRQYXRoLCBtZXRhTW9kZWxDb250ZXh0KTtcblx0XHRpZiAoYlVzZVNlbWFudGljRGF0ZVJhbmdlKSB7XG5cdFx0XHRhU2VtYW50aWNEYXRlT3BlcmF0b3JzID0gaXNQYXJhbWV0ZXJcblx0XHRcdFx0PyBbXCJFUVwiXVxuXHRcdFx0XHQ6IENvbW1vblV0aWxzLmdldE9wZXJhdG9yc0ZvclByb3BlcnR5KFxuXHRcdFx0XHRcdFx0c0NvbmRpdGlvblByb3AsXG5cdFx0XHRcdFx0XHRzQ29udGV4dFBhdGgsXG5cdFx0XHRcdFx0XHRtZXRhTW9kZWxDb250ZXh0LFxuXHRcdFx0XHRcdFx0b1Byb3BlcnR5TWV0YWRhdGE/LiRUeXBlLFxuXHRcdFx0XHRcdFx0YlVzZVNlbWFudGljRGF0ZVJhbmdlLFxuXHRcdFx0XHRcdFx0c2V0dGluZ3Ncblx0XHRcdFx0ICApO1xuXHRcdH1cblx0XHQvLyBDcmVhdGUgY29uZGl0aW9ucyBmb3IgYWxsIHRoZSBzZWxlY3RPcHRpb25zIG9mIHRoZSBwcm9wZXJ0eVxuXHRcdGFDb25kaXRpb25zID0gaXNQYXJhbWV0ZXJcblx0XHRcdD8gQ29tbW9uVXRpbHMuYWRkU2VsZWN0T3B0aW9uVG9Db25kaXRpb25zKFxuXHRcdFx0XHRcdG9Qcm9wZXJ0eU1ldGFkYXRhLFxuXHRcdFx0XHRcdGFWYWxpZE9wZXJhdG9ycyxcblx0XHRcdFx0XHRhU2VtYW50aWNEYXRlT3BlcmF0b3JzLFxuXHRcdFx0XHRcdGFDb25kaXRpb25zLFxuXHRcdFx0XHRcdGFTZWxlY3RPcHRpb25zWzBdXG5cdFx0XHQgIClcblx0XHRcdDogYVNlbGVjdE9wdGlvbnMucmVkdWNlKFxuXHRcdFx0XHRcdENvbW1vblV0aWxzLmFkZFNlbGVjdE9wdGlvblRvQ29uZGl0aW9ucy5iaW5kKG51bGwsIG9Qcm9wZXJ0eU1ldGFkYXRhLCBhVmFsaWRPcGVyYXRvcnMsIGFTZW1hbnRpY0RhdGVPcGVyYXRvcnMpLFxuXHRcdFx0XHRcdGFDb25kaXRpb25zXG5cdFx0XHQgICk7XG5cdFx0aWYgKGFDb25kaXRpb25zLmxlbmd0aCkge1xuXHRcdFx0aWYgKHNDb25kaXRpb25QYXRoKSB7XG5cdFx0XHRcdG9Db25kaXRpb25zW3NDb25kaXRpb25QYXRoICsgc0NvbmRpdGlvblByb3BdID0gb0NvbmRpdGlvbnMuaGFzT3duUHJvcGVydHkoc0NvbmRpdGlvblBhdGggKyBzQ29uZGl0aW9uUHJvcClcblx0XHRcdFx0XHQ/IG9Db25kaXRpb25zW3NDb25kaXRpb25QYXRoICsgc0NvbmRpdGlvblByb3BdLmNvbmNhdChhQ29uZGl0aW9ucylcblx0XHRcdFx0XHQ6IGFDb25kaXRpb25zO1xuXHRcdFx0fSBlbHNlIGlmIChiSXNGTFBWYWx1ZVByZXNlbnQpIHtcblx0XHRcdFx0Ly8gSWYgRkxQIHZhbHVlcyBhcmUgcHJlc2VudCByZXBsYWNlIGl0IHdpdGggRkxQIHZhbHVlc1xuXHRcdFx0XHRhQ29uZGl0aW9ucy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG5cdFx0XHRcdFx0ZWxlbWVudFtcImZpbHRlcmVkXCJdID0gdHJ1ZTtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGlmIChvQ29uZGl0aW9ucy5oYXNPd25Qcm9wZXJ0eShzQ29uZGl0aW9uUHJvcCkpIHtcblx0XHRcdFx0XHRvQ29uZGl0aW9uc1tzQ29uZGl0aW9uUHJvcF0uZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuXHRcdFx0XHRcdFx0ZWxlbWVudFtcImZpbHRlcmVkXCJdID0gZmFsc2U7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0b0NvbmRpdGlvbnNbc0NvbmRpdGlvblByb3BdID0gb0NvbmRpdGlvbnNbc0NvbmRpdGlvblByb3BdLmNvbmNhdChhQ29uZGl0aW9ucyk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0b0NvbmRpdGlvbnNbc0NvbmRpdGlvblByb3BdID0gYUNvbmRpdGlvbnM7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG9Db25kaXRpb25zW3NDb25kaXRpb25Qcm9wXSA9IG9Db25kaXRpb25zLmhhc093blByb3BlcnR5KHNDb25kaXRpb25Qcm9wKVxuXHRcdFx0XHRcdD8gb0NvbmRpdGlvbnNbc0NvbmRpdGlvblByb3BdLmNvbmNhdChhQ29uZGl0aW9ucylcblx0XHRcdFx0XHQ6IGFDb25kaXRpb25zO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufVxuXG4vKipcbiAqIE1ldGhvZCB0byBjcmVhdGUgdGhlIHNlbWFudGljIGRhdGVzIGZyb20gZmlsdGVyIGNvbmRpdGlvbnNcbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBuYW1lIGNyZWF0ZVNlbWFudGljRGF0ZXNGcm9tQ29uZGl0aW9uc1xuICogQHBhcmFtIG9Db25kaXRpb24gRmlsdGVyIGZpZWxkIGNvbmRpdGlvblxuICogQHBhcmFtIHNGaWx0ZXJOYW1lIEZpbHRlciBGaWVsZCBQYXRoXG4gKiBAcmV0dXJucyBUaGUgU2VtYW50aWMgZGF0ZSBjb25kaXRpb25zXG4gKi9cblxuZnVuY3Rpb24gY3JlYXRlU2VtYW50aWNEYXRlc0Zyb21Db25kaXRpb25zKG9Db25kaXRpb246IENvbmRpdGlvblR5cGUpOiBTZW1hbnRpY0RhdGVDb25maWd1cmF0aW9uIHtcblx0cmV0dXJuIHtcblx0XHRoaWdoOiAob0NvbmRpdGlvbj8udmFsdWVzPy5bMF0gYXMgc3RyaW5nKSB8fCBudWxsLFxuXHRcdGxvdzogKG9Db25kaXRpb24/LnZhbHVlcz8uWzFdIGFzIHN0cmluZykgfHwgbnVsbCxcblx0XHRvcGVyYXRvcjogb0NvbmRpdGlvbj8ub3BlcmF0b3Jcblx0fTtcbn1cblxuLyoqXG4gKiBNZXRob2QgdG8gUmV0dXJuIHRoZSBmaWx0ZXIgY29uZmlndXJhdGlvblxuICpcbiAqIEBmdW5jdGlvblxuICogQG5hbWUgZ2V0RmlsdGVyQ29uZmlndXJhdGlvblNldHRpbmdcbiAqIEBwYXJhbSBvVmlld0RhdGEgbWFuaWZlc3QgQ29uZmlndXJhdGlvblxuICogQHBhcmFtIHNQcm9wZXJ0eSBGaWx0ZXIgRmllbGQgUGF0aFxuICogQHJldHVybnMgVGhlIEZpbHRlciBGaWVsZCBDb25maWd1cmF0aW9uXG4gKi9cbnR5cGUgVmlld0RhdGEgPSB7XG5cdGNvbnRyb2xDb25maWd1cmF0aW9uPzogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+O1xufTtcbmZ1bmN0aW9uIGdldEZpbHRlckNvbmZpZ3VyYXRpb25TZXR0aW5nKG9WaWV3RGF0YTogVmlld0RhdGEgPSB7fSwgc1Byb3BlcnR5OiBzdHJpbmcpIHtcblx0Y29uc3Qgb0NvbmZpZyA9IG9WaWV3RGF0YT8uY29udHJvbENvbmZpZ3VyYXRpb247XG5cdGNvbnN0IGZpbHRlckNvbmZpZyA9XG5cdFx0b0NvbmZpZyAmJiAob0NvbmZpZ1tcIkBjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5TZWxlY3Rpb25GaWVsZHNcIl0/LmZpbHRlckZpZWxkcyBhcyBSZWNvcmQ8c3RyaW5nLCB7IHNldHRpbmdzOiBzdHJpbmcgfT4pO1xuXHRyZXR1cm4gZmlsdGVyQ29uZmlnPy5bc1Byb3BlcnR5XSA/IGZpbHRlckNvbmZpZ1tzUHJvcGVydHldPy5zZXR0aW5ncyA6IHVuZGVmaW5lZDtcbn1cbmZ1bmN0aW9uIGFkZFNlbGVjdGlvblZhcmlhbnRUb0NvbmRpdGlvbnMoXG5cdG9TZWxlY3Rpb25WYXJpYW50OiBTZWxlY3Rpb25WYXJpYW50LFxuXHRvQ29uZGl0aW9uczogUmVjb3JkPHN0cmluZywgQ29uZGl0aW9uT2JqZWN0W10+LFxuXHRvTWV0YU1vZGVsQ29udGV4dDogT0RhdGFNZXRhTW9kZWwsXG5cdHNDb250ZXh0UGF0aDogc3RyaW5nLFxuXHRiSXNGTFBWYWx1ZXM/OiBib29sZWFuLFxuXHRiVXNlU2VtYW50aWNEYXRlUmFuZ2U/OiBib29sZWFuLFxuXHRvVmlld0RhdGE/OiBvYmplY3Rcbikge1xuXHRjb25zdCBhU2VsZWN0T3B0aW9uc1Byb3BlcnR5TmFtZXMgPSBvU2VsZWN0aW9uVmFyaWFudC5nZXRTZWxlY3RPcHRpb25zUHJvcGVydHlOYW1lcygpLFxuXHRcdG9WYWxpZFByb3BlcnRpZXMgPSBDb21tb25VdGlscy5nZXRDb250ZXh0UGF0aFByb3BlcnRpZXMob01ldGFNb2RlbENvbnRleHQsIHNDb250ZXh0UGF0aCksXG5cdFx0YU1ldGFkYXRQcm9wZXJ0aWVzID0gT2JqZWN0LmtleXMob1ZhbGlkUHJvcGVydGllcyksXG5cdFx0b1BhcmFtZXRlckluZm8gPSBDb21tb25VdGlscy5nZXRQYXJhbWV0ZXJJbmZvKG9NZXRhTW9kZWxDb250ZXh0LCBzQ29udGV4dFBhdGgpLFxuXHRcdHNQYXJhbWV0ZXJDb250ZXh0UGF0aCA9IG9QYXJhbWV0ZXJJbmZvLmNvbnRleHRQYXRoLFxuXHRcdG9WYWxpZFBhcmFtZXRlclByb3BlcnRpZXMgPSBvUGFyYW1ldGVySW5mby5wYXJhbWV0ZXJQcm9wZXJ0aWVzO1xuXG5cdGlmIChzUGFyYW1ldGVyQ29udGV4dFBhdGggIT09IHVuZGVmaW5lZCAmJiBvVmFsaWRQYXJhbWV0ZXJQcm9wZXJ0aWVzICYmIE9iamVjdC5rZXlzKG9WYWxpZFBhcmFtZXRlclByb3BlcnRpZXMpLmxlbmd0aCA+IDApIHtcblx0XHRjb25zdCBhTWV0YWRhdGFQYXJhbWV0ZXJzID0gT2JqZWN0LmtleXMob1ZhbGlkUGFyYW1ldGVyUHJvcGVydGllcyk7XG5cdFx0YU1ldGFkYXRhUGFyYW1ldGVycy5mb3JFYWNoKGZ1bmN0aW9uIChzTWV0YWRhdGFQYXJhbWV0ZXI6IHN0cmluZykge1xuXHRcdFx0bGV0IHNTZWxlY3RPcHRpb25OYW1lO1xuXHRcdFx0aWYgKGFTZWxlY3RPcHRpb25zUHJvcGVydHlOYW1lcy5pbmNsdWRlcyhgJFBhcmFtZXRlci4ke3NNZXRhZGF0YVBhcmFtZXRlcn1gKSkge1xuXHRcdFx0XHRzU2VsZWN0T3B0aW9uTmFtZSA9IGAkUGFyYW1ldGVyLiR7c01ldGFkYXRhUGFyYW1ldGVyfWA7XG5cdFx0XHR9IGVsc2UgaWYgKGFTZWxlY3RPcHRpb25zUHJvcGVydHlOYW1lcy5pbmNsdWRlcyhzTWV0YWRhdGFQYXJhbWV0ZXIpKSB7XG5cdFx0XHRcdHNTZWxlY3RPcHRpb25OYW1lID0gc01ldGFkYXRhUGFyYW1ldGVyO1xuXHRcdFx0fSBlbHNlIGlmIChcblx0XHRcdFx0c01ldGFkYXRhUGFyYW1ldGVyLnN0YXJ0c1dpdGgoXCJQX1wiKSAmJlxuXHRcdFx0XHRhU2VsZWN0T3B0aW9uc1Byb3BlcnR5TmFtZXMuaW5jbHVkZXMoYCRQYXJhbWV0ZXIuJHtzTWV0YWRhdGFQYXJhbWV0ZXIuc2xpY2UoMiwgc01ldGFkYXRhUGFyYW1ldGVyLmxlbmd0aCl9YClcblx0XHRcdCkge1xuXHRcdFx0XHRzU2VsZWN0T3B0aW9uTmFtZSA9IGAkUGFyYW1ldGVyLiR7c01ldGFkYXRhUGFyYW1ldGVyLnNsaWNlKDIsIHNNZXRhZGF0YVBhcmFtZXRlci5sZW5ndGgpfWA7XG5cdFx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0XHRzTWV0YWRhdGFQYXJhbWV0ZXIuc3RhcnRzV2l0aChcIlBfXCIpICYmXG5cdFx0XHRcdGFTZWxlY3RPcHRpb25zUHJvcGVydHlOYW1lcy5pbmNsdWRlcyhzTWV0YWRhdGFQYXJhbWV0ZXIuc2xpY2UoMiwgc01ldGFkYXRhUGFyYW1ldGVyLmxlbmd0aCkpXG5cdFx0XHQpIHtcblx0XHRcdFx0c1NlbGVjdE9wdGlvbk5hbWUgPSBzTWV0YWRhdGFQYXJhbWV0ZXIuc2xpY2UoMiwgc01ldGFkYXRhUGFyYW1ldGVyLmxlbmd0aCk7XG5cdFx0XHR9IGVsc2UgaWYgKGFTZWxlY3RPcHRpb25zUHJvcGVydHlOYW1lcy5pbmNsdWRlcyhgJFBhcmFtZXRlci5QXyR7c01ldGFkYXRhUGFyYW1ldGVyfWApKSB7XG5cdFx0XHRcdHNTZWxlY3RPcHRpb25OYW1lID0gYCRQYXJhbWV0ZXIuUF8ke3NNZXRhZGF0YVBhcmFtZXRlcn1gO1xuXHRcdFx0fSBlbHNlIGlmIChhU2VsZWN0T3B0aW9uc1Byb3BlcnR5TmFtZXMuaW5jbHVkZXMoYFBfJHtzTWV0YWRhdGFQYXJhbWV0ZXJ9YCkpIHtcblx0XHRcdFx0c1NlbGVjdE9wdGlvbk5hbWUgPSBgUF8ke3NNZXRhZGF0YVBhcmFtZXRlcn1gO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoc1NlbGVjdE9wdGlvbk5hbWUpIHtcblx0XHRcdFx0YWRkU2VsZWN0T3B0aW9uc1RvQ29uZGl0aW9ucyhcblx0XHRcdFx0XHRzUGFyYW1ldGVyQ29udGV4dFBhdGgsXG5cdFx0XHRcdFx0b1NlbGVjdGlvblZhcmlhbnQsXG5cdFx0XHRcdFx0c1NlbGVjdE9wdGlvbk5hbWUsXG5cdFx0XHRcdFx0b0NvbmRpdGlvbnMsXG5cdFx0XHRcdFx0dW5kZWZpbmVkLFxuXHRcdFx0XHRcdHNNZXRhZGF0YVBhcmFtZXRlcixcblx0XHRcdFx0XHRvVmFsaWRQYXJhbWV0ZXJQcm9wZXJ0aWVzLFxuXHRcdFx0XHRcdG9NZXRhTW9kZWxDb250ZXh0LFxuXHRcdFx0XHRcdHRydWUsXG5cdFx0XHRcdFx0YklzRkxQVmFsdWVzLFxuXHRcdFx0XHRcdGJVc2VTZW1hbnRpY0RhdGVSYW5nZSxcblx0XHRcdFx0XHRvVmlld0RhdGFcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXHRhTWV0YWRhdFByb3BlcnRpZXMuZm9yRWFjaChmdW5jdGlvbiAoc01ldGFkYXRhUHJvcGVydHk6IHN0cmluZykge1xuXHRcdGxldCBzU2VsZWN0T3B0aW9uTmFtZTtcblx0XHRpZiAoYVNlbGVjdE9wdGlvbnNQcm9wZXJ0eU5hbWVzLmluY2x1ZGVzKHNNZXRhZGF0YVByb3BlcnR5KSkge1xuXHRcdFx0c1NlbGVjdE9wdGlvbk5hbWUgPSBzTWV0YWRhdGFQcm9wZXJ0eTtcblx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0c01ldGFkYXRhUHJvcGVydHkuc3RhcnRzV2l0aChcIlBfXCIpICYmXG5cdFx0XHRhU2VsZWN0T3B0aW9uc1Byb3BlcnR5TmFtZXMuaW5jbHVkZXMoc01ldGFkYXRhUHJvcGVydHkuc2xpY2UoMiwgc01ldGFkYXRhUHJvcGVydHkubGVuZ3RoKSlcblx0XHQpIHtcblx0XHRcdHNTZWxlY3RPcHRpb25OYW1lID0gc01ldGFkYXRhUHJvcGVydHkuc2xpY2UoMiwgc01ldGFkYXRhUHJvcGVydHkubGVuZ3RoKTtcblx0XHR9IGVsc2UgaWYgKGFTZWxlY3RPcHRpb25zUHJvcGVydHlOYW1lcy5pbmNsdWRlcyhgUF8ke3NNZXRhZGF0YVByb3BlcnR5fWApKSB7XG5cdFx0XHRzU2VsZWN0T3B0aW9uTmFtZSA9IGBQXyR7c01ldGFkYXRhUHJvcGVydHl9YDtcblx0XHR9XG5cdFx0aWYgKHNTZWxlY3RPcHRpb25OYW1lKSB7XG5cdFx0XHRhZGRTZWxlY3RPcHRpb25zVG9Db25kaXRpb25zKFxuXHRcdFx0XHRzQ29udGV4dFBhdGgsXG5cdFx0XHRcdG9TZWxlY3Rpb25WYXJpYW50LFxuXHRcdFx0XHRzU2VsZWN0T3B0aW9uTmFtZSxcblx0XHRcdFx0b0NvbmRpdGlvbnMsXG5cdFx0XHRcdHVuZGVmaW5lZCxcblx0XHRcdFx0c01ldGFkYXRhUHJvcGVydHksXG5cdFx0XHRcdG9WYWxpZFByb3BlcnRpZXMsXG5cdFx0XHRcdG9NZXRhTW9kZWxDb250ZXh0LFxuXHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0YklzRkxQVmFsdWVzLFxuXHRcdFx0XHRiVXNlU2VtYW50aWNEYXRlUmFuZ2UsXG5cdFx0XHRcdG9WaWV3RGF0YVxuXHRcdFx0KTtcblx0XHR9XG5cdH0pO1xuXG5cdGFTZWxlY3RPcHRpb25zUHJvcGVydHlOYW1lcy5mb3JFYWNoKGZ1bmN0aW9uIChzU2VsZWN0T3B0aW9uOiBzdHJpbmcpIHtcblx0XHRpZiAoc1NlbGVjdE9wdGlvbi5pbmRleE9mKFwiLlwiKSA+IDAgJiYgIXNTZWxlY3RPcHRpb24uaW5jbHVkZXMoXCIkUGFyYW1ldGVyXCIpKSB7XG5cdFx0XHRjb25zdCBzUmVwbGFjZWRPcHRpb24gPSBzU2VsZWN0T3B0aW9uLnJlcGxhY2VBbGwoXCIuXCIsIFwiL1wiKTtcblx0XHRcdGNvbnN0IHNGdWxsQ29udGV4dFBhdGggPSBgLyR7c1JlcGxhY2VkT3B0aW9ufWAuc3RhcnRzV2l0aChzQ29udGV4dFBhdGgpXG5cdFx0XHRcdD8gYC8ke3NSZXBsYWNlZE9wdGlvbn1gXG5cdFx0XHRcdDogYCR7c0NvbnRleHRQYXRofS8ke3NSZXBsYWNlZE9wdGlvbn1gOyAvLyBjaGVjayBpZiB0aGUgZnVsbCBwYXRoLCBlZyBTYWxlc09yZGVyTWFuYWdlLl9JdGVtLk1hdGVyaWFsIGV4aXN0cyBpbiB0aGUgbWV0YW1vZGVsXG5cdFx0XHRpZiAob01ldGFNb2RlbENvbnRleHQuZ2V0T2JqZWN0KHNGdWxsQ29udGV4dFBhdGgucmVwbGFjZShcIlBfXCIsIFwiXCIpKSkge1xuXHRcdFx0XHRfY3JlYXRlQ29uZGl0aW9uc0Zvck5hdlByb3BlcnRpZXMoXG5cdFx0XHRcdFx0c0Z1bGxDb250ZXh0UGF0aCxcblx0XHRcdFx0XHRzQ29udGV4dFBhdGgsXG5cdFx0XHRcdFx0b1NlbGVjdGlvblZhcmlhbnQsXG5cdFx0XHRcdFx0c1NlbGVjdE9wdGlvbixcblx0XHRcdFx0XHRvTWV0YU1vZGVsQ29udGV4dCxcblx0XHRcdFx0XHRvQ29uZGl0aW9ucyxcblx0XHRcdFx0XHRiSXNGTFBWYWx1ZXMsXG5cdFx0XHRcdFx0YlVzZVNlbWFudGljRGF0ZVJhbmdlLFxuXHRcdFx0XHRcdG9WaWV3RGF0YVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblx0fSk7XG5cdHJldHVybiBvQ29uZGl0aW9ucztcbn1cblxuZnVuY3Rpb24gX2NyZWF0ZUNvbmRpdGlvbnNGb3JOYXZQcm9wZXJ0aWVzKFxuXHRzRnVsbENvbnRleHRQYXRoOiBzdHJpbmcsXG5cdHNNYWluRW50aXR5U2V0UGF0aDogc3RyaW5nLFxuXHRvU2VsZWN0aW9uVmFyaWFudDogU2VsZWN0aW9uVmFyaWFudCxcblx0c1NlbGVjdE9wdGlvbjogc3RyaW5nLFxuXHRvTWV0YU1vZGVsQ29udGV4dDogT0RhdGFNZXRhTW9kZWwsXG5cdG9Db25kaXRpb25zOiBSZWNvcmQ8c3RyaW5nLCBDb25kaXRpb25PYmplY3RbXT4sXG5cdGJJc0ZMUFZhbHVlUHJlc2VudD86IGJvb2xlYW4sXG5cdGJTZW1hbnRpY0RhdGVSYW5nZT86IGJvb2xlYW4sXG5cdG9WaWV3RGF0YT86IG9iamVjdFxuKSB7XG5cdGxldCBhTmF2T2JqZWN0TmFtZXMgPSBzU2VsZWN0T3B0aW9uLnNwbGl0KFwiLlwiKTtcblx0Ly8gRWc6IFwiU2FsZXNPcmRlck1hbmFnZS5fSXRlbS5fTWF0ZXJpYWwuTWF0ZXJpYWxcIiBvciBcIl9JdGVtLk1hdGVyaWFsXCJcblx0aWYgKGAvJHtzU2VsZWN0T3B0aW9uLnJlcGxhY2VBbGwoXCIuXCIsIFwiL1wiKX1gLnN0YXJ0c1dpdGgoc01haW5FbnRpdHlTZXRQYXRoKSkge1xuXHRcdGNvbnN0IHNGdWxsUGF0aCA9IGAvJHtzU2VsZWN0T3B0aW9ufWAucmVwbGFjZUFsbChcIi5cIiwgXCIvXCIpLFxuXHRcdFx0c05hdlBhdGggPSBzRnVsbFBhdGgucmVwbGFjZShgJHtzTWFpbkVudGl0eVNldFBhdGh9L2AsIFwiXCIpO1xuXHRcdGFOYXZPYmplY3ROYW1lcyA9IHNOYXZQYXRoLnNwbGl0KFwiL1wiKTtcblx0fVxuXHRsZXQgc0NvbmRpdGlvblBhdGggPSBcIlwiO1xuXHRjb25zdCBzUHJvcGVydHlOYW1lID0gYU5hdk9iamVjdE5hbWVzW2FOYXZPYmplY3ROYW1lcy5sZW5ndGggLSAxXTsgLy8gTWF0ZXJpYWwgZnJvbSBTYWxlc09yZGVyTWFuYWdlLl9JdGVtLk1hdGVyaWFsXG5cdGZvciAobGV0IGkgPSAwOyBpIDwgYU5hdk9iamVjdE5hbWVzLmxlbmd0aCAtIDE7IGkrKykge1xuXHRcdGlmIChvTWV0YU1vZGVsQ29udGV4dC5nZXRPYmplY3QoYCR7c01haW5FbnRpdHlTZXRQYXRofS8ke2FOYXZPYmplY3ROYW1lc1tpXS5yZXBsYWNlKFwiUF9cIiwgXCJcIil9YCkuJGlzQ29sbGVjdGlvbikge1xuXHRcdFx0c0NvbmRpdGlvblBhdGggPSBgJHtzQ29uZGl0aW9uUGF0aCArIGFOYXZPYmplY3ROYW1lc1tpXX0qL2A7IC8vIF9JdGVtKi8gaW4gY2FzZSBvZiAxOm4gY2FyZGluYWxpdHlcblx0XHR9IGVsc2Uge1xuXHRcdFx0c0NvbmRpdGlvblBhdGggPSBgJHtzQ29uZGl0aW9uUGF0aCArIGFOYXZPYmplY3ROYW1lc1tpXX0vYDsgLy8gX0l0ZW0vIGluIGNhc2Ugb2YgMToxIGNhcmRpbmFsaXR5XG5cdFx0fVxuXHRcdHNNYWluRW50aXR5U2V0UGF0aCA9IGAke3NNYWluRW50aXR5U2V0UGF0aH0vJHthTmF2T2JqZWN0TmFtZXNbaV19YDtcblx0fVxuXHRjb25zdCBzTmF2UHJvcGVydHlQYXRoID0gc0Z1bGxDb250ZXh0UGF0aC5zbGljZSgwLCBzRnVsbENvbnRleHRQYXRoLmxhc3RJbmRleE9mKFwiL1wiKSksXG5cdFx0b1ZhbGlkUHJvcGVydGllcyA9IENvbW1vblV0aWxzLmdldENvbnRleHRQYXRoUHJvcGVydGllcyhvTWV0YU1vZGVsQ29udGV4dCwgc05hdlByb3BlcnR5UGF0aCksXG5cdFx0YVNlbGVjdE9wdGlvbnNQcm9wZXJ0eU5hbWVzID0gb1NlbGVjdGlvblZhcmlhbnQuZ2V0U2VsZWN0T3B0aW9uc1Byb3BlcnR5TmFtZXMoKTtcblx0bGV0IHNTZWxlY3RPcHRpb25OYW1lID0gc1Byb3BlcnR5TmFtZTtcblx0aWYgKG9WYWxpZFByb3BlcnRpZXNbc1Byb3BlcnR5TmFtZV0pIHtcblx0XHRzU2VsZWN0T3B0aW9uTmFtZSA9IHNQcm9wZXJ0eU5hbWU7XG5cdH0gZWxzZSBpZiAoc1Byb3BlcnR5TmFtZS5zdGFydHNXaXRoKFwiUF9cIikgJiYgb1ZhbGlkUHJvcGVydGllc1tzUHJvcGVydHlOYW1lLnJlcGxhY2UoXCJQX1wiLCBcIlwiKV0pIHtcblx0XHRzU2VsZWN0T3B0aW9uTmFtZSA9IHNQcm9wZXJ0eU5hbWUucmVwbGFjZShcIlBfXCIsIFwiXCIpO1xuXHR9IGVsc2UgaWYgKG9WYWxpZFByb3BlcnRpZXNbYFBfJHtzUHJvcGVydHlOYW1lfWBdICYmIGFTZWxlY3RPcHRpb25zUHJvcGVydHlOYW1lcy5pbmNsdWRlcyhgUF8ke3NQcm9wZXJ0eU5hbWV9YCkpIHtcblx0XHRzU2VsZWN0T3B0aW9uTmFtZSA9IGBQXyR7c1Byb3BlcnR5TmFtZX1gO1xuXHR9XG5cdGlmIChzUHJvcGVydHlOYW1lLnN0YXJ0c1dpdGgoXCJQX1wiKSAmJiBvQ29uZGl0aW9uc1tzQ29uZGl0aW9uUGF0aCArIHNTZWxlY3RPcHRpb25OYW1lXSkge1xuXHRcdC8vIGlmIHRoZXJlIGlzIG5vIFNhbGVzT3JkZXJNYW5hZ2UuX0l0ZW0uTWF0ZXJpYWwgeWV0IGluIHRoZSBvQ29uZGl0aW9uc1xuXHR9IGVsc2UgaWYgKCFzUHJvcGVydHlOYW1lLnN0YXJ0c1dpdGgoXCJQX1wiKSAmJiBvQ29uZGl0aW9uc1tzQ29uZGl0aW9uUGF0aCArIHNTZWxlY3RPcHRpb25OYW1lXSkge1xuXHRcdGRlbGV0ZSBvQ29uZGl0aW9uc1tzQ29uZGl0aW9uUGF0aCArIHNTZWxlY3RPcHRpb25OYW1lXTtcblx0XHRhZGRTZWxlY3RPcHRpb25zVG9Db25kaXRpb25zKFxuXHRcdFx0c05hdlByb3BlcnR5UGF0aCxcblx0XHRcdG9TZWxlY3Rpb25WYXJpYW50LFxuXHRcdFx0c1NlbGVjdE9wdGlvbixcblx0XHRcdG9Db25kaXRpb25zLFxuXHRcdFx0c0NvbmRpdGlvblBhdGgsXG5cdFx0XHRzU2VsZWN0T3B0aW9uTmFtZSxcblx0XHRcdG9WYWxpZFByb3BlcnRpZXMsXG5cdFx0XHRvTWV0YU1vZGVsQ29udGV4dCxcblx0XHRcdGZhbHNlLFxuXHRcdFx0YklzRkxQVmFsdWVQcmVzZW50LFxuXHRcdFx0YlNlbWFudGljRGF0ZVJhbmdlLFxuXHRcdFx0b1ZpZXdEYXRhXG5cdFx0KTtcblx0fSBlbHNlIHtcblx0XHRhZGRTZWxlY3RPcHRpb25zVG9Db25kaXRpb25zKFxuXHRcdFx0c05hdlByb3BlcnR5UGF0aCxcblx0XHRcdG9TZWxlY3Rpb25WYXJpYW50LFxuXHRcdFx0c1NlbGVjdE9wdGlvbixcblx0XHRcdG9Db25kaXRpb25zLFxuXHRcdFx0c0NvbmRpdGlvblBhdGgsXG5cdFx0XHRzU2VsZWN0T3B0aW9uTmFtZSxcblx0XHRcdG9WYWxpZFByb3BlcnRpZXMsXG5cdFx0XHRvTWV0YU1vZGVsQ29udGV4dCxcblx0XHRcdGZhbHNlLFxuXHRcdFx0YklzRkxQVmFsdWVQcmVzZW50LFxuXHRcdFx0YlNlbWFudGljRGF0ZVJhbmdlLFxuXHRcdFx0b1ZpZXdEYXRhXG5cdFx0KTtcblx0fVxufVxuXG5mdW5jdGlvbiBhZGRQYWdlQ29udGV4dFRvU2VsZWN0aW9uVmFyaWFudChvU2VsZWN0aW9uVmFyaWFudDogU2VsZWN0aW9uVmFyaWFudCwgbVBhZ2VDb250ZXh0OiB1bmtub3duW10sIG9WaWV3OiBWaWV3KSB7XG5cdGNvbnN0IG9BcHBDb21wb25lbnQgPSBDb21tb25VdGlscy5nZXRBcHBDb21wb25lbnQob1ZpZXcpO1xuXHRjb25zdCBvTmF2aWdhdGlvblNlcnZpY2UgPSBvQXBwQ29tcG9uZW50LmdldE5hdmlnYXRpb25TZXJ2aWNlKCk7XG5cdHJldHVybiBvTmF2aWdhdGlvblNlcnZpY2UubWl4QXR0cmlidXRlc0FuZFNlbGVjdGlvblZhcmlhbnQobVBhZ2VDb250ZXh0LCBvU2VsZWN0aW9uVmFyaWFudC50b0pTT05TdHJpbmcoKSk7XG59XG5cbmZ1bmN0aW9uIGFkZEV4dGVybmFsU3RhdGVGaWx0ZXJzVG9TZWxlY3Rpb25WYXJpYW50KFxuXHRvU2VsZWN0aW9uVmFyaWFudDogU2VsZWN0aW9uVmFyaWFudCxcblx0bUZpbHRlcnM6IHtcblx0XHRmaWx0ZXJDb25kaXRpb25zOiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBDb25kaXRpb25PYmplY3Q+Pjtcblx0XHRmaWx0ZXJDb25kaXRpb25zV2l0aG91dENvbmZsaWN0OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuXHR9LFxuXHRvVGFyZ2V0SW5mbzoge1xuXHRcdHByb3BlcnRpZXNXaXRob3V0Q29uZmxpY3Q/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuXHR9LFxuXHRvRmlsdGVyQmFyPzogRmlsdGVyQmFyXG4pIHtcblx0bGV0IHNGaWx0ZXI6IHN0cmluZztcblx0Y29uc3QgZm5HZXRTaWduQW5kT3B0aW9uID0gZnVuY3Rpb24gKHNPcGVyYXRvcjogc3RyaW5nLCBzTG93VmFsdWU6IHN0cmluZywgc0hpZ2hWYWx1ZTogc3RyaW5nKSB7XG5cdFx0Y29uc3Qgb1NlbGVjdE9wdGlvblN0YXRlID0ge1xuXHRcdFx0b3B0aW9uOiBcIlwiLFxuXHRcdFx0c2lnbjogXCJJXCIsXG5cdFx0XHRsb3c6IHNMb3dWYWx1ZSxcblx0XHRcdGhpZ2g6IHNIaWdoVmFsdWVcblx0XHR9O1xuXHRcdHN3aXRjaCAoc09wZXJhdG9yKSB7XG5cdFx0XHRjYXNlIFwiQ29udGFpbnNcIjpcblx0XHRcdFx0b1NlbGVjdE9wdGlvblN0YXRlLm9wdGlvbiA9IFwiQ1BcIjtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFwiU3RhcnRzV2l0aFwiOlxuXHRcdFx0XHRvU2VsZWN0T3B0aW9uU3RhdGUub3B0aW9uID0gXCJDUFwiO1xuXHRcdFx0XHRvU2VsZWN0T3B0aW9uU3RhdGUubG93ICs9IFwiKlwiO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgXCJFbmRzV2l0aFwiOlxuXHRcdFx0XHRvU2VsZWN0T3B0aW9uU3RhdGUub3B0aW9uID0gXCJDUFwiO1xuXHRcdFx0XHRvU2VsZWN0T3B0aW9uU3RhdGUubG93ID0gYCoke29TZWxlY3RPcHRpb25TdGF0ZS5sb3d9YDtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFwiQlRcIjpcblx0XHRcdGNhc2UgXCJMRVwiOlxuXHRcdFx0Y2FzZSBcIkxUXCI6XG5cdFx0XHRjYXNlIFwiR1RcIjpcblx0XHRcdGNhc2UgXCJORVwiOlxuXHRcdFx0Y2FzZSBcIkVRXCI6XG5cdFx0XHRcdG9TZWxlY3RPcHRpb25TdGF0ZS5vcHRpb24gPSBzT3BlcmF0b3I7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSBcIkRBVEVcIjpcblx0XHRcdFx0b1NlbGVjdE9wdGlvblN0YXRlLm9wdGlvbiA9IFwiRVFcIjtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFwiREFURVJBTkdFXCI6XG5cdFx0XHRcdG9TZWxlY3RPcHRpb25TdGF0ZS5vcHRpb24gPSBcIkJUXCI7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSBcIkZST01cIjpcblx0XHRcdFx0b1NlbGVjdE9wdGlvblN0YXRlLm9wdGlvbiA9IFwiR0VcIjtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFwiVE9cIjpcblx0XHRcdFx0b1NlbGVjdE9wdGlvblN0YXRlLm9wdGlvbiA9IFwiTEVcIjtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFwiRUVRXCI6XG5cdFx0XHRcdG9TZWxlY3RPcHRpb25TdGF0ZS5vcHRpb24gPSBcIkVRXCI7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSBcIkVtcHR5XCI6XG5cdFx0XHRcdG9TZWxlY3RPcHRpb25TdGF0ZS5vcHRpb24gPSBcIkVRXCI7XG5cdFx0XHRcdG9TZWxlY3RPcHRpb25TdGF0ZS5sb3cgPSBcIlwiO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgXCJOb3RDb250YWluc1wiOlxuXHRcdFx0XHRvU2VsZWN0T3B0aW9uU3RhdGUub3B0aW9uID0gXCJDUFwiO1xuXHRcdFx0XHRvU2VsZWN0T3B0aW9uU3RhdGUuc2lnbiA9IFwiRVwiO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgXCJOT1RCVFwiOlxuXHRcdFx0XHRvU2VsZWN0T3B0aW9uU3RhdGUub3B0aW9uID0gXCJCVFwiO1xuXHRcdFx0XHRvU2VsZWN0T3B0aW9uU3RhdGUuc2lnbiA9IFwiRVwiO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgXCJOb3RTdGFydHNXaXRoXCI6XG5cdFx0XHRcdG9TZWxlY3RPcHRpb25TdGF0ZS5vcHRpb24gPSBcIkNQXCI7XG5cdFx0XHRcdG9TZWxlY3RPcHRpb25TdGF0ZS5sb3cgKz0gXCIqXCI7XG5cdFx0XHRcdG9TZWxlY3RPcHRpb25TdGF0ZS5zaWduID0gXCJFXCI7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSBcIk5vdEVuZHNXaXRoXCI6XG5cdFx0XHRcdG9TZWxlY3RPcHRpb25TdGF0ZS5vcHRpb24gPSBcIkNQXCI7XG5cdFx0XHRcdG9TZWxlY3RPcHRpb25TdGF0ZS5sb3cgPSBgKiR7b1NlbGVjdE9wdGlvblN0YXRlLmxvd31gO1xuXHRcdFx0XHRvU2VsZWN0T3B0aW9uU3RhdGUuc2lnbiA9IFwiRVwiO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgXCJOb3RFbXB0eVwiOlxuXHRcdFx0XHRvU2VsZWN0T3B0aW9uU3RhdGUub3B0aW9uID0gXCJORVwiO1xuXHRcdFx0XHRvU2VsZWN0T3B0aW9uU3RhdGUubG93ID0gXCJcIjtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFwiTk9UTEVcIjpcblx0XHRcdFx0b1NlbGVjdE9wdGlvblN0YXRlLm9wdGlvbiA9IFwiTEVcIjtcblx0XHRcdFx0b1NlbGVjdE9wdGlvblN0YXRlLnNpZ24gPSBcIkVcIjtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFwiTk9UR0VcIjpcblx0XHRcdFx0b1NlbGVjdE9wdGlvblN0YXRlLm9wdGlvbiA9IFwiR0VcIjtcblx0XHRcdFx0b1NlbGVjdE9wdGlvblN0YXRlLnNpZ24gPSBcIkVcIjtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFwiTk9UTFRcIjpcblx0XHRcdFx0b1NlbGVjdE9wdGlvblN0YXRlLm9wdGlvbiA9IFwiTFRcIjtcblx0XHRcdFx0b1NlbGVjdE9wdGlvblN0YXRlLnNpZ24gPSBcIkVcIjtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFwiTk9UR1RcIjpcblx0XHRcdFx0b1NlbGVjdE9wdGlvblN0YXRlLm9wdGlvbiA9IFwiR1RcIjtcblx0XHRcdFx0b1NlbGVjdE9wdGlvblN0YXRlLnNpZ24gPSBcIkVcIjtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRMb2cud2FybmluZyhgJHtzT3BlcmF0b3J9IGlzIG5vdCBzdXBwb3J0ZWQuICR7c0ZpbHRlcn0gY291bGQgbm90IGJlIGFkZGVkIHRvIHRoZSBuYXZpZ2F0aW9uIGNvbnRleHRgKTtcblx0XHR9XG5cdFx0cmV0dXJuIG9TZWxlY3RPcHRpb25TdGF0ZTtcblx0fTtcblx0Y29uc3Qgb0ZpbHRlckNvbmRpdGlvbnMgPSBtRmlsdGVycy5maWx0ZXJDb25kaXRpb25zO1xuXHRjb25zdCBvRmlsdGVyc1dpdGhvdXRDb25mbGljdCA9IG1GaWx0ZXJzLmZpbHRlckNvbmRpdGlvbnNXaXRob3V0Q29uZmxpY3QgPyBtRmlsdGVycy5maWx0ZXJDb25kaXRpb25zV2l0aG91dENvbmZsaWN0IDoge307XG5cdGNvbnN0IG9UYWJsZVByb3BlcnRpZXNXaXRob3V0Q29uZmxpY3QgPSBvVGFyZ2V0SW5mby5wcm9wZXJ0aWVzV2l0aG91dENvbmZsaWN0ID8gb1RhcmdldEluZm8ucHJvcGVydGllc1dpdGhvdXRDb25mbGljdCA6IHt9O1xuXHRjb25zdCBhZGRGaWx0ZXJzVG9TZWxlY3Rpb25WYXJpYW50ID0gZnVuY3Rpb24gKHNlbGVjdGlvblZhcmlhbnQ6IFNlbGVjdGlvblZhcmlhbnQsIHNGaWx0ZXJOYW1lOiBzdHJpbmcsIHNQYXRoPzogc3RyaW5nKSB7XG5cdFx0Y29uc3QgYUNvbmRpdGlvbnMgPSBvRmlsdGVyQ29uZGl0aW9uc1tzRmlsdGVyTmFtZV07XG5cdFx0Y29uc3Qgb1Byb3BlcnR5SW5mbyA9IG9GaWx0ZXJCYXIgJiYgb0ZpbHRlckJhci5nZXRQcm9wZXJ0eUhlbHBlcigpLmdldFByb3BlcnR5KHNGaWx0ZXJOYW1lKTtcblx0XHRjb25zdCBvVHlwZUNvbmZpZyA9IG9Qcm9wZXJ0eUluZm8/LnR5cGVDb25maWc7XG5cdFx0Y29uc3Qgb1R5cGVVdGlsID0gb0ZpbHRlckJhciAmJiBvRmlsdGVyQmFyLmdldENvbnRyb2xEZWxlZ2F0ZSgpLmdldFR5cGVVdGlsKCk7XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW0gaW4gYUNvbmRpdGlvbnMpIHtcblx0XHRcdGNvbnN0IG9Db25kaXRpb24gPSBhQ29uZGl0aW9uc1tpdGVtXTtcblxuXHRcdFx0bGV0IG9wdGlvbjogc3RyaW5nIHwgdW5kZWZpbmVkID0gXCJcIixcblx0XHRcdFx0c2lnbiA9IFwiSVwiLFxuXHRcdFx0XHRsb3cgPSBcIlwiLFxuXHRcdFx0XHRoaWdoID0gbnVsbCxcblx0XHRcdFx0c2VtYW50aWNEYXRlcztcblxuXHRcdFx0Y29uc3Qgb09wZXJhdG9yID0gRmlsdGVyT3BlcmF0b3JVdGlsLmdldE9wZXJhdG9yKG9Db25kaXRpb24ub3BlcmF0b3IpO1xuXHRcdFx0aWYgKG9PcGVyYXRvciBpbnN0YW5jZW9mIFJhbmdlT3BlcmF0b3IpIHtcblx0XHRcdFx0c2VtYW50aWNEYXRlcyA9IENvbW1vblV0aWxzLmNyZWF0ZVNlbWFudGljRGF0ZXNGcm9tQ29uZGl0aW9ucyhvQ29uZGl0aW9uKTtcblx0XHRcdFx0Ly8gaGFuZGxpbmcgb2YgRGF0ZSBSYW5nZU9wZXJhdG9yc1xuXHRcdFx0XHRjb25zdCBvTW9kZWxGaWx0ZXIgPSBvT3BlcmF0b3IuZ2V0TW9kZWxGaWx0ZXIoXG5cdFx0XHRcdFx0b0NvbmRpdGlvbixcblx0XHRcdFx0XHRzRmlsdGVyTmFtZSxcblx0XHRcdFx0XHRvVHlwZUNvbmZpZz8udHlwZUluc3RhbmNlLFxuXHRcdFx0XHRcdGZhbHNlLFxuXHRcdFx0XHRcdG9UeXBlQ29uZmlnPy5iYXNlVHlwZVxuXHRcdFx0XHQpO1xuXHRcdFx0XHRpZiAoIW9Nb2RlbEZpbHRlcj8uZ2V0RmlsdGVycygpICYmICFvTW9kZWxGaWx0ZXI/LmdldEZpbHRlcnMoKT8ubGVuZ3RoKSB7XG5cdFx0XHRcdFx0c2lnbiA9IG9PcGVyYXRvci5leGNsdWRlID8gXCJFXCIgOiBcIklcIjtcblx0XHRcdFx0XHRsb3cgPSBvVHlwZVV0aWwuZXh0ZXJuYWxpemVWYWx1ZShvTW9kZWxGaWx0ZXIuZ2V0VmFsdWUxKCksIG9UeXBlQ29uZmlnLnR5cGVJbnN0YW5jZSk7XG5cdFx0XHRcdFx0aGlnaCA9IG9UeXBlVXRpbC5leHRlcm5hbGl6ZVZhbHVlKG9Nb2RlbEZpbHRlci5nZXRWYWx1ZTIoKSwgb1R5cGVDb25maWcudHlwZUluc3RhbmNlKTtcblx0XHRcdFx0XHRvcHRpb24gPSBvTW9kZWxGaWx0ZXIuZ2V0T3BlcmF0b3IoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3QgYVNlbWFudGljRGF0ZU9wc0V4dCA9IFNlbWFudGljRGF0ZU9wZXJhdG9ycy5nZXRTdXBwb3J0ZWRPcGVyYXRpb25zKCk7XG5cdFx0XHRcdGlmIChhU2VtYW50aWNEYXRlT3BzRXh0LmluY2x1ZGVzKG9Db25kaXRpb24/Lm9wZXJhdG9yKSkge1xuXHRcdFx0XHRcdHNlbWFudGljRGF0ZXMgPSBDb21tb25VdGlscy5jcmVhdGVTZW1hbnRpY0RhdGVzRnJvbUNvbmRpdGlvbnMob0NvbmRpdGlvbik7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29uc3QgdmFsdWUxID0gKG9Db25kaXRpb24udmFsdWVzWzBdICYmIG9Db25kaXRpb24udmFsdWVzWzBdLnRvU3RyaW5nKCkpIHx8IFwiXCI7XG5cdFx0XHRcdGNvbnN0IHZhbHVlMiA9IChvQ29uZGl0aW9uLnZhbHVlc1sxXSAmJiBvQ29uZGl0aW9uLnZhbHVlc1sxXS50b1N0cmluZygpKSB8fCBudWxsO1xuXHRcdFx0XHRjb25zdCBvU2VsZWN0T3B0aW9uID0gZm5HZXRTaWduQW5kT3B0aW9uKG9Db25kaXRpb24ub3BlcmF0b3IsIHZhbHVlMSwgdmFsdWUyKTtcblx0XHRcdFx0c2lnbiA9IG9PcGVyYXRvcj8uZXhjbHVkZSA/IFwiRVwiIDogXCJJXCI7XG5cdFx0XHRcdGxvdyA9IG9TZWxlY3RPcHRpb24/Lmxvdztcblx0XHRcdFx0aGlnaCA9IG9TZWxlY3RPcHRpb24/LmhpZ2g7XG5cdFx0XHRcdG9wdGlvbiA9IG9TZWxlY3RPcHRpb24/Lm9wdGlvbjtcblx0XHRcdH1cblxuXHRcdFx0aWYgKG9wdGlvbiAmJiBzZW1hbnRpY0RhdGVzKSB7XG5cdFx0XHRcdHNlbGVjdGlvblZhcmlhbnQuYWRkU2VsZWN0T3B0aW9uKHNQYXRoID8gc1BhdGggOiBzRmlsdGVyTmFtZSwgc2lnbiwgb3B0aW9uLCBsb3csIGhpZ2gsIHVuZGVmaW5lZCwgc2VtYW50aWNEYXRlcyk7XG5cdFx0XHR9IGVsc2UgaWYgKG9wdGlvbikge1xuXHRcdFx0XHRzZWxlY3Rpb25WYXJpYW50LmFkZFNlbGVjdE9wdGlvbihzUGF0aCA/IHNQYXRoIDogc0ZpbHRlck5hbWUsIHNpZ24sIG9wdGlvbiwgbG93LCBoaWdoKTtcblx0XHRcdH1cblx0XHR9XG5cdH07XG5cblx0Zm9yIChzRmlsdGVyIGluIG9GaWx0ZXJDb25kaXRpb25zKSB7XG5cdFx0Ly8gb25seSBhZGQgdGhlIGZpbHRlciB2YWx1ZXMgaWYgaXQgaXMgbm90IGFscmVhZHkgcHJlc2VudCBpbiB0aGUgU1YgYWxyZWFkeVxuXHRcdGlmICghb1NlbGVjdGlvblZhcmlhbnQuZ2V0U2VsZWN0T3B0aW9uKHNGaWx0ZXIpKSB7XG5cdFx0XHQvLyBUT0RPIDogY3VzdG9tIGZpbHRlcnMgc2hvdWxkIGJlIGlnbm9yZWQgbW9yZSBnZW5lcmljYWxseVxuXHRcdFx0aWYgKHNGaWx0ZXIgPT09IFwiJGVkaXRTdGF0ZVwiKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXHRcdFx0YWRkRmlsdGVyc1RvU2VsZWN0aW9uVmFyaWFudChvU2VsZWN0aW9uVmFyaWFudCwgc0ZpbHRlcik7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGlmIChvVGFibGVQcm9wZXJ0aWVzV2l0aG91dENvbmZsaWN0ICYmIHNGaWx0ZXIgaW4gb1RhYmxlUHJvcGVydGllc1dpdGhvdXRDb25mbGljdCkge1xuXHRcdFx0XHRhZGRGaWx0ZXJzVG9TZWxlY3Rpb25WYXJpYW50KG9TZWxlY3Rpb25WYXJpYW50LCBzRmlsdGVyLCBvVGFibGVQcm9wZXJ0aWVzV2l0aG91dENvbmZsaWN0W3NGaWx0ZXJdKTtcblx0XHRcdH1cblx0XHRcdC8vIGlmIHByb3BlcnR5IHdhcyB3aXRob3V0IGNvbmZsaWN0IGluIHBhZ2UgY29udGV4dCB0aGVuIGFkZCBwYXRoIGZyb20gcGFnZSBjb250ZXh0IHRvIFNWXG5cdFx0XHRpZiAoc0ZpbHRlciBpbiBvRmlsdGVyc1dpdGhvdXRDb25mbGljdCkge1xuXHRcdFx0XHRhZGRGaWx0ZXJzVG9TZWxlY3Rpb25WYXJpYW50KG9TZWxlY3Rpb25WYXJpYW50LCBzRmlsdGVyLCBvRmlsdGVyc1dpdGhvdXRDb25mbGljdFtzRmlsdGVyXSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdHJldHVybiBvU2VsZWN0aW9uVmFyaWFudDtcbn1cblxuZnVuY3Rpb24gaXNTdGlja3lFZGl0TW9kZShvQ29udHJvbDogQ29udHJvbCkge1xuXHRjb25zdCBiSXNTdGlja3lNb2RlID0gTW9kZWxIZWxwZXIuaXNTdGlja3lTZXNzaW9uU3VwcG9ydGVkKChvQ29udHJvbC5nZXRNb2RlbCgpIGFzIE9EYXRhTW9kZWwpLmdldE1ldGFNb2RlbCgpKTtcblx0Y29uc3QgYlVJRWRpdGFibGUgPSBvQ29udHJvbC5nZXRNb2RlbChcInVpXCIpLmdldFByb3BlcnR5KFwiL2lzRWRpdGFibGVcIik7XG5cdHJldHVybiBiSXNTdGlja3lNb2RlICYmIGJVSUVkaXRhYmxlO1xufVxuXG4vKipcbiAqIEBwYXJhbSBhTWFuZGF0b3J5RmlsdGVyRmllbGRzXG4gKiBAcGFyYW0gb1NlbGVjdGlvblZhcmlhbnRcbiAqIEBwYXJhbSBvU2VsZWN0aW9uVmFyaWFudERlZmF1bHRzXG4gKi9cbmZ1bmN0aW9uIGFkZERlZmF1bHREaXNwbGF5Q3VycmVuY3koXG5cdGFNYW5kYXRvcnlGaWx0ZXJGaWVsZHM6IEV4cGFuZFBhdGhUeXBlPEVkbS5Qcm9wZXJ0eVBhdGg+W10sXG5cdG9TZWxlY3Rpb25WYXJpYW50OiBTZWxlY3Rpb25WYXJpYW50LFxuXHRvU2VsZWN0aW9uVmFyaWFudERlZmF1bHRzOiBTZWxlY3Rpb25WYXJpYW50XG4pIHtcblx0aWYgKG9TZWxlY3Rpb25WYXJpYW50ICYmIGFNYW5kYXRvcnlGaWx0ZXJGaWVsZHMgJiYgYU1hbmRhdG9yeUZpbHRlckZpZWxkcy5sZW5ndGgpIHtcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGFNYW5kYXRvcnlGaWx0ZXJGaWVsZHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdGNvbnN0IGFTVk9wdGlvbiA9IG9TZWxlY3Rpb25WYXJpYW50LmdldFNlbGVjdE9wdGlvbihcIkRpc3BsYXlDdXJyZW5jeVwiKSxcblx0XHRcdFx0YURlZmF1bHRTVk9wdGlvbiA9IG9TZWxlY3Rpb25WYXJpYW50RGVmYXVsdHMgJiYgb1NlbGVjdGlvblZhcmlhbnREZWZhdWx0cy5nZXRTZWxlY3RPcHRpb24oXCJEaXNwbGF5Q3VycmVuY3lcIik7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdGFNYW5kYXRvcnlGaWx0ZXJGaWVsZHNbaV0uJFByb3BlcnR5UGF0aCA9PT0gXCJEaXNwbGF5Q3VycmVuY3lcIiAmJlxuXHRcdFx0XHQoIWFTVk9wdGlvbiB8fCAhYVNWT3B0aW9uLmxlbmd0aCkgJiZcblx0XHRcdFx0YURlZmF1bHRTVk9wdGlvbiAmJlxuXHRcdFx0XHRhRGVmYXVsdFNWT3B0aW9uLmxlbmd0aFxuXHRcdFx0KSB7XG5cdFx0XHRcdGNvbnN0IGRpc3BsYXlDdXJyZW5jeVNlbGVjdE9wdGlvbiA9IGFEZWZhdWx0U1ZPcHRpb25bMF07XG5cdFx0XHRcdGNvbnN0IHNTaWduID0gZGlzcGxheUN1cnJlbmN5U2VsZWN0T3B0aW9uW1wiU2lnblwiXTtcblx0XHRcdFx0Y29uc3Qgc09wdGlvbiA9IGRpc3BsYXlDdXJyZW5jeVNlbGVjdE9wdGlvbltcIk9wdGlvblwiXTtcblx0XHRcdFx0Y29uc3Qgc0xvdyA9IGRpc3BsYXlDdXJyZW5jeVNlbGVjdE9wdGlvbltcIkxvd1wiXTtcblx0XHRcdFx0Y29uc3Qgc0hpZ2ggPSBkaXNwbGF5Q3VycmVuY3lTZWxlY3RPcHRpb25bXCJIaWdoXCJdO1xuXHRcdFx0XHRvU2VsZWN0aW9uVmFyaWFudC5hZGRTZWxlY3RPcHRpb24oXCJEaXNwbGF5Q3VycmVuY3lcIiwgc1NpZ24sIHNPcHRpb24sIHNMb3csIHNIaWdoKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn1cblxudHlwZSBVc2VyRGVmYXVsdFBhcmFtZXRlciA9IHtcblx0JE5hbWU6IHN0cmluZztcblx0Z2V0UGF0aD8oKTogc3RyaW5nO1xufTtcbmFzeW5jIGZ1bmN0aW9uIHNldFVzZXJEZWZhdWx0cyhcblx0b0FwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LFxuXHRhUGFyYW1ldGVyczogVXNlckRlZmF1bHRQYXJhbWV0ZXJbXSxcblx0b01vZGVsOiBKU09OTW9kZWwgfCBPRGF0YVY0Q29udGV4dCxcblx0YklzQWN0aW9uOiBib29sZWFuLFxuXHRiSXNDcmVhdGU/OiBib29sZWFuLFxuXHRvQWN0aW9uRGVmYXVsdFZhbHVlcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbikge1xuXHRyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmU6IEZ1bmN0aW9uKSB7XG5cdFx0Y29uc3Qgb0NvbXBvbmVudERhdGEgPSBvQXBwQ29tcG9uZW50LmdldENvbXBvbmVudERhdGEoKSxcblx0XHRcdG9TdGFydHVwUGFyYW1ldGVycyA9IChvQ29tcG9uZW50RGF0YSAmJiBvQ29tcG9uZW50RGF0YS5zdGFydHVwUGFyYW1ldGVycykgfHwge30sXG5cdFx0XHRvU2hlbGxTZXJ2aWNlcyA9IG9BcHBDb21wb25lbnQuZ2V0U2hlbGxTZXJ2aWNlcygpO1xuXHRcdGlmICghb1NoZWxsU2VydmljZXMuaGFzVVNoZWxsKCkpIHtcblx0XHRcdGFQYXJhbWV0ZXJzLmZvckVhY2goZnVuY3Rpb24gKG9QYXJhbWV0ZXIpIHtcblx0XHRcdFx0Y29uc3Qgc1Byb3BlcnR5TmFtZSA9IGJJc0FjdGlvblxuXHRcdFx0XHRcdD8gYC8ke29QYXJhbWV0ZXIuJE5hbWV9YFxuXHRcdFx0XHRcdDogKG9QYXJhbWV0ZXIuZ2V0UGF0aD8uKCkuc2xpY2Uob1BhcmFtZXRlci5nZXRQYXRoKCkubGFzdEluZGV4T2YoXCIvXCIpICsgMSkgYXMgc3RyaW5nKTtcblx0XHRcdFx0Y29uc3Qgc1BhcmFtZXRlck5hbWUgPSBiSXNBY3Rpb24gPyBzUHJvcGVydHlOYW1lLnNsaWNlKDEpIDogc1Byb3BlcnR5TmFtZTtcblx0XHRcdFx0aWYgKG9BY3Rpb25EZWZhdWx0VmFsdWVzICYmIGJJc0NyZWF0ZSkge1xuXHRcdFx0XHRcdGlmIChvQWN0aW9uRGVmYXVsdFZhbHVlc1tzUGFyYW1ldGVyTmFtZV0pIHtcblx0XHRcdFx0XHRcdG9Nb2RlbC5zZXRQcm9wZXJ0eShzUHJvcGVydHlOYW1lLCBvQWN0aW9uRGVmYXVsdFZhbHVlc1tzUGFyYW1ldGVyTmFtZV0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIGlmIChvU3RhcnR1cFBhcmFtZXRlcnNbc1BhcmFtZXRlck5hbWVdKSB7XG5cdFx0XHRcdFx0b01vZGVsLnNldFByb3BlcnR5KHNQcm9wZXJ0eU5hbWUsIG9TdGFydHVwUGFyYW1ldGVyc1tzUGFyYW1ldGVyTmFtZV1bMF0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHRcdHJldHVybiByZXNvbHZlKHRydWUpO1xuXHRcdH1cblx0XHRyZXR1cm4gb1NoZWxsU2VydmljZXMuZ2V0U3RhcnR1cEFwcFN0YXRlKG9BcHBDb21wb25lbnQpLnRoZW4oZnVuY3Rpb24gKG9TdGFydHVwQXBwU3RhdGUpIHtcblx0XHRcdGNvbnN0IG9EYXRhID0gb1N0YXJ0dXBBcHBTdGF0ZT8uZ2V0RGF0YSgpIHx8IHt9LFxuXHRcdFx0XHRhRXh0ZW5kZWRQYXJhbWV0ZXJzID0gKG9EYXRhLnNlbGVjdGlvblZhcmlhbnQgJiYgb0RhdGEuc2VsZWN0aW9uVmFyaWFudC5TZWxlY3RPcHRpb25zKSB8fCBbXTtcblx0XHRcdGFQYXJhbWV0ZXJzLmZvckVhY2goZnVuY3Rpb24gKG9QYXJhbWV0ZXIpIHtcblx0XHRcdFx0Y29uc3Qgc1Byb3BlcnR5TmFtZSA9IGJJc0FjdGlvblxuXHRcdFx0XHRcdD8gYC8ke29QYXJhbWV0ZXIuJE5hbWV9YFxuXHRcdFx0XHRcdDogKG9QYXJhbWV0ZXIuZ2V0UGF0aD8uKCkuc2xpY2Uob1BhcmFtZXRlci5nZXRQYXRoKCkubGFzdEluZGV4T2YoXCIvXCIpICsgMSkgYXMgc3RyaW5nKTtcblx0XHRcdFx0Y29uc3Qgc1BhcmFtZXRlck5hbWUgPSBiSXNBY3Rpb24gPyBzUHJvcGVydHlOYW1lLnNsaWNlKDEpIDogc1Byb3BlcnR5TmFtZTtcblx0XHRcdFx0aWYgKG9BY3Rpb25EZWZhdWx0VmFsdWVzICYmIGJJc0NyZWF0ZSkge1xuXHRcdFx0XHRcdGlmIChvQWN0aW9uRGVmYXVsdFZhbHVlc1tzUGFyYW1ldGVyTmFtZV0pIHtcblx0XHRcdFx0XHRcdG9Nb2RlbC5zZXRQcm9wZXJ0eShzUHJvcGVydHlOYW1lLCBvQWN0aW9uRGVmYXVsdFZhbHVlc1tzUGFyYW1ldGVyTmFtZV0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIGlmIChvU3RhcnR1cFBhcmFtZXRlcnNbc1BhcmFtZXRlck5hbWVdKSB7XG5cdFx0XHRcdFx0b01vZGVsLnNldFByb3BlcnR5KHNQcm9wZXJ0eU5hbWUsIG9TdGFydHVwUGFyYW1ldGVyc1tzUGFyYW1ldGVyTmFtZV1bMF0pO1xuXHRcdFx0XHR9IGVsc2UgaWYgKGFFeHRlbmRlZFBhcmFtZXRlcnMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdGZvciAoY29uc3Qgb0V4dGVuZGVkUGFyYW1ldGVyIG9mIGFFeHRlbmRlZFBhcmFtZXRlcnMpIHtcblx0XHRcdFx0XHRcdGlmIChvRXh0ZW5kZWRQYXJhbWV0ZXIuUHJvcGVydHlOYW1lID09PSBzUGFyYW1ldGVyTmFtZSkge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBvUmFuZ2UgPSBvRXh0ZW5kZWRQYXJhbWV0ZXIuUmFuZ2VzLmxlbmd0aFxuXHRcdFx0XHRcdFx0XHRcdD8gb0V4dGVuZGVkUGFyYW1ldGVyLlJhbmdlc1tvRXh0ZW5kZWRQYXJhbWV0ZXIuUmFuZ2VzLmxlbmd0aCAtIDFdXG5cdFx0XHRcdFx0XHRcdFx0OiB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0XHRcdGlmIChvUmFuZ2UgJiYgb1JhbmdlLlNpZ24gPT09IFwiSVwiICYmIG9SYW5nZS5PcHRpb24gPT09IFwiRVFcIikge1xuXHRcdFx0XHRcdFx0XHRcdG9Nb2RlbC5zZXRQcm9wZXJ0eShzUHJvcGVydHlOYW1lLCBvUmFuZ2UuTG93KTsgLy8gaGlnaCBpcyBpZ25vcmVkIHdoZW4gT3B0aW9uPUVRXG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdFx0cmV0dXJuIHJlc29sdmUodHJ1ZSk7XG5cdFx0fSk7XG5cdH0pO1xufVxuZXhwb3J0IHR5cGUgSW5ib3VuZFBhcmFtZXRlciA9IHtcblx0dXNlRm9yQ3JlYXRlOiBib29sZWFuO1xufTtcbmZ1bmN0aW9uIGdldEFkZGl0aW9uYWxQYXJhbXNGb3JDcmVhdGUoXG5cdG9TdGFydHVwUGFyYW1ldGVyczogUmVjb3JkPHN0cmluZywgdW5rbm93bltdPixcblx0b0luYm91bmRQYXJhbWV0ZXJzPzogUmVjb3JkPHN0cmluZywgSW5ib3VuZFBhcmFtZXRlcj5cbikge1xuXHRjb25zdCBvSW5ib3VuZHMgPSBvSW5ib3VuZFBhcmFtZXRlcnMsXG5cdFx0YUNyZWF0ZVBhcmFtZXRlcnMgPVxuXHRcdFx0b0luYm91bmRzICE9PSB1bmRlZmluZWRcblx0XHRcdFx0PyBPYmplY3Qua2V5cyhvSW5ib3VuZHMpLmZpbHRlcihmdW5jdGlvbiAoc1BhcmFtZXRlcjogc3RyaW5nKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gb0luYm91bmRzW3NQYXJhbWV0ZXJdLnVzZUZvckNyZWF0ZTtcblx0XHRcdFx0ICB9KVxuXHRcdFx0XHQ6IFtdO1xuXHRsZXQgb1JldDtcblx0Zm9yIChsZXQgaSA9IDA7IGkgPCBhQ3JlYXRlUGFyYW1ldGVycy5sZW5ndGg7IGkrKykge1xuXHRcdGNvbnN0IHNDcmVhdGVQYXJhbWV0ZXIgPSBhQ3JlYXRlUGFyYW1ldGVyc1tpXTtcblx0XHRjb25zdCBhVmFsdWVzID0gb1N0YXJ0dXBQYXJhbWV0ZXJzICYmIG9TdGFydHVwUGFyYW1ldGVyc1tzQ3JlYXRlUGFyYW1ldGVyXTtcblx0XHRpZiAoYVZhbHVlcyAmJiBhVmFsdWVzLmxlbmd0aCA9PT0gMSkge1xuXHRcdFx0b1JldCA9IG9SZXQgfHwgT2JqZWN0LmNyZWF0ZShudWxsKTtcblx0XHRcdG9SZXRbc0NyZWF0ZVBhcmFtZXRlcl0gPSBhVmFsdWVzWzBdO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gb1JldDtcbn1cbnR5cGUgT3V0Ym91bmRQYXJhbWV0ZXIgPSB7XG5cdHBhcmFtZXRlcnM6IFJlY29yZDxzdHJpbmcsIE91dGJvdW5kUGFyYW1ldGVyVmFsdWU+O1xuXHRzZW1hbnRpY09iamVjdD86IHN0cmluZztcblx0YWN0aW9uPzogc3RyaW5nO1xufTtcbnR5cGUgT3V0Ym91bmRQYXJhbWV0ZXJWYWx1ZSA9IHtcblx0dmFsdWU/OiB7XG5cdFx0dmFsdWU/OiBzdHJpbmc7XG5cdFx0Zm9ybWF0Pzogc3RyaW5nO1xuXHR9O1xufTtcbmZ1bmN0aW9uIGdldFNlbWFudGljT2JqZWN0TWFwcGluZyhvT3V0Ym91bmQ6IE91dGJvdW5kUGFyYW1ldGVyKSB7XG5cdGNvbnN0IGFTZW1hbnRpY09iamVjdE1hcHBpbmc6IE1ldGFNb2RlbFR5cGU8U2VtYW50aWNPYmplY3RNYXBwaW5nVHlwZT5bXSA9IFtdO1xuXHRpZiAob091dGJvdW5kLnBhcmFtZXRlcnMpIHtcblx0XHRjb25zdCBhUGFyYW1ldGVycyA9IE9iamVjdC5rZXlzKG9PdXRib3VuZC5wYXJhbWV0ZXJzKSB8fCBbXTtcblx0XHRpZiAoYVBhcmFtZXRlcnMubGVuZ3RoID4gMCkge1xuXHRcdFx0YVBhcmFtZXRlcnMuZm9yRWFjaChmdW5jdGlvbiAoc1BhcmFtOiBzdHJpbmcpIHtcblx0XHRcdFx0Y29uc3Qgb01hcHBpbmcgPSBvT3V0Ym91bmQucGFyYW1ldGVyc1tzUGFyYW1dO1xuXHRcdFx0XHRpZiAob01hcHBpbmcudmFsdWUgJiYgb01hcHBpbmcudmFsdWUudmFsdWUgJiYgb01hcHBpbmcudmFsdWUuZm9ybWF0ID09PSBcImJpbmRpbmdcIikge1xuXHRcdFx0XHRcdC8vIHVzaW5nIHRoZSBmb3JtYXQgb2YgVUkuTWFwcGluZ1xuXHRcdFx0XHRcdGNvbnN0IG9TZW1hbnRpY01hcHBpbmcgPSB7XG5cdFx0XHRcdFx0XHRMb2NhbFByb3BlcnR5OiB7XG5cdFx0XHRcdFx0XHRcdCRQcm9wZXJ0eVBhdGg6IG9NYXBwaW5nLnZhbHVlLnZhbHVlXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0U2VtYW50aWNPYmplY3RQcm9wZXJ0eTogc1BhcmFtXG5cdFx0XHRcdFx0fTtcblxuXHRcdFx0XHRcdGlmIChhU2VtYW50aWNPYmplY3RNYXBwaW5nLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRcdC8vIFRvIGNoZWNrIGlmIHRoZSBzZW1hbnRpY09iamVjdCBNYXBwaW5nIGlzIGRvbmUgZm9yIHRoZSBzYW1lIGxvY2FsIHByb3BlcnR5IG1vcmUgdGhhdCBvbmNlIHRoZW4gZmlyc3Qgb25lIHdpbGwgYmUgY29uc2lkZXJlZFxuXHRcdFx0XHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBhU2VtYW50aWNPYmplY3RNYXBwaW5nLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdFx0XHRcdGlmIChhU2VtYW50aWNPYmplY3RNYXBwaW5nW2ldLkxvY2FsUHJvcGVydHk/LiRQcm9wZXJ0eVBhdGggIT09IG9TZW1hbnRpY01hcHBpbmcuTG9jYWxQcm9wZXJ0eS4kUHJvcGVydHlQYXRoKSB7XG5cdFx0XHRcdFx0XHRcdFx0YVNlbWFudGljT2JqZWN0TWFwcGluZy5wdXNoKG9TZW1hbnRpY01hcHBpbmcpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGFTZW1hbnRpY09iamVjdE1hcHBpbmcucHVzaChvU2VtYW50aWNNYXBwaW5nKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gYVNlbWFudGljT2JqZWN0TWFwcGluZztcbn1cblxuZnVuY3Rpb24gZ2V0SGVhZGVyRmFjZXRJdGVtQ29uZmlnRm9yRXh0ZXJuYWxOYXZpZ2F0aW9uKG9WaWV3RGF0YTogVmlld0RhdGEsIG9Dcm9zc05hdjogUmVjb3JkPHN0cmluZywgT3V0Ym91bmRQYXJhbWV0ZXI+KSB7XG5cdGNvbnN0IG9IZWFkZXJGYWNldEl0ZW1zOiBSZWNvcmQ8XG5cdFx0c3RyaW5nLFxuXHRcdHtcblx0XHRcdHNlbWFudGljT2JqZWN0OiBzdHJpbmc7XG5cdFx0XHRhY3Rpb246IHN0cmluZztcblx0XHRcdHNlbWFudGljT2JqZWN0TWFwcGluZzogTWV0YU1vZGVsVHlwZTxTZW1hbnRpY09iamVjdE1hcHBpbmdUeXBlPltdO1xuXHRcdH1cblx0PiA9IHt9O1xuXHRsZXQgc0lkO1xuXHRjb25zdCBvQ29udHJvbENvbmZpZyA9IG9WaWV3RGF0YS5jb250cm9sQ29uZmlndXJhdGlvbiBhcyBSZWNvcmQ8XG5cdFx0c3RyaW5nLFxuXHRcdHtcblx0XHRcdG5hdmlnYXRpb24/OiB7XG5cdFx0XHRcdHRhcmdldE91dGJvdW5kPzoge1xuXHRcdFx0XHRcdG91dGJvdW5kOiBzdHJpbmc7XG5cdFx0XHRcdH07XG5cdFx0XHR9O1xuXHRcdH1cblx0Pjtcblx0Zm9yIChjb25zdCBjb25maWcgaW4gb0NvbnRyb2xDb25maWcpIHtcblx0XHRpZiAoY29uZmlnLmluZGV4T2YoXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuRGF0YVBvaW50XCIpID4gLTEgfHwgY29uZmlnLmluZGV4T2YoXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuQ2hhcnRcIikgPiAtMSkge1xuXHRcdFx0Y29uc3Qgc091dGJvdW5kID0gb0NvbnRyb2xDb25maWdbY29uZmlnXS5uYXZpZ2F0aW9uPy50YXJnZXRPdXRib3VuZD8ub3V0Ym91bmQ7XG5cdFx0XHRpZiAoc091dGJvdW5kICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0Y29uc3Qgb091dGJvdW5kID0gb0Nyb3NzTmF2W3NPdXRib3VuZF07XG5cdFx0XHRcdGlmIChvT3V0Ym91bmQuc2VtYW50aWNPYmplY3QgJiYgb091dGJvdW5kLmFjdGlvbikge1xuXHRcdFx0XHRcdGlmIChjb25maWcuaW5kZXhPZihcIkNoYXJ0XCIpID4gLTEpIHtcblx0XHRcdFx0XHRcdHNJZCA9IGdlbmVyYXRlKFtcImZlXCIsIFwiTWljcm9DaGFydExpbmtcIiwgY29uZmlnXSk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHNJZCA9IGdlbmVyYXRlKFtcImZlXCIsIFwiSGVhZGVyRFBMaW5rXCIsIGNvbmZpZ10pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRjb25zdCBhU2VtYW50aWNPYmplY3RNYXBwaW5nID0gQ29tbW9uVXRpbHMuZ2V0U2VtYW50aWNPYmplY3RNYXBwaW5nKG9PdXRib3VuZCk7XG5cdFx0XHRcdFx0b0hlYWRlckZhY2V0SXRlbXNbc0lkXSA9IHtcblx0XHRcdFx0XHRcdHNlbWFudGljT2JqZWN0OiBvT3V0Ym91bmQuc2VtYW50aWNPYmplY3QsXG5cdFx0XHRcdFx0XHRhY3Rpb246IG9PdXRib3VuZC5hY3Rpb24sXG5cdFx0XHRcdFx0XHRzZW1hbnRpY09iamVjdE1hcHBpbmc6IGFTZW1hbnRpY09iamVjdE1hcHBpbmdcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdExvZy5lcnJvcihgQ3Jvc3MgbmF2aWdhdGlvbiBvdXRib3VuZCBpcyBjb25maWd1cmVkIHdpdGhvdXQgc2VtYW50aWMgb2JqZWN0IGFuZCBhY3Rpb24gZm9yICR7c091dGJvdW5kfWApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdHJldHVybiBvSGVhZGVyRmFjZXRJdGVtcztcbn1cblxuZnVuY3Rpb24gc2V0U2VtYW50aWNPYmplY3RNYXBwaW5ncyhvU2VsZWN0aW9uVmFyaWFudDogU2VsZWN0aW9uVmFyaWFudCwgdk1hcHBpbmdzOiB1bmtub3duKSB7XG5cdGNvbnN0IG9NYXBwaW5ncyA9IHR5cGVvZiB2TWFwcGluZ3MgPT09IFwic3RyaW5nXCIgPyBKU09OLnBhcnNlKHZNYXBwaW5ncykgOiB2TWFwcGluZ3M7XG5cdGZvciAobGV0IGkgPSAwOyBpIDwgb01hcHBpbmdzLmxlbmd0aDsgaSsrKSB7XG5cdFx0Y29uc3Qgc0xvY2FsUHJvcGVydHkgPVxuXHRcdFx0KG9NYXBwaW5nc1tpXVtcIkxvY2FsUHJvcGVydHlcIl0gJiYgb01hcHBpbmdzW2ldW1wiTG9jYWxQcm9wZXJ0eVwiXVtcIiRQcm9wZXJ0eVBhdGhcIl0pIHx8XG5cdFx0XHQob01hcHBpbmdzW2ldW1wiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5Mb2NhbFByb3BlcnR5XCJdICYmXG5cdFx0XHRcdG9NYXBwaW5nc1tpXVtcIkBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuTG9jYWxQcm9wZXJ0eVwiXVtcIiRQYXRoXCJdKTtcblx0XHRjb25zdCBzU2VtYW50aWNPYmplY3RQcm9wZXJ0eSA9XG5cdFx0XHRvTWFwcGluZ3NbaV1bXCJTZW1hbnRpY09iamVjdFByb3BlcnR5XCJdIHx8IG9NYXBwaW5nc1tpXVtcIkBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuU2VtYW50aWNPYmplY3RQcm9wZXJ0eVwiXTtcblx0XHRjb25zdCBvU2VsZWN0T3B0aW9uID0gb1NlbGVjdGlvblZhcmlhbnQuZ2V0U2VsZWN0T3B0aW9uKHNMb2NhbFByb3BlcnR5KTtcblx0XHRpZiAob1NlbGVjdE9wdGlvbikge1xuXHRcdFx0Ly9DcmVhdGUgYSBuZXcgU2VsZWN0T3B0aW9uIHdpdGggc1NlbWFudGljT2JqZWN0UHJvcGVydHkgYXMgdGhlIHByb3BlcnR5IE5hbWUgYW5kIHJlbW92ZSB0aGUgb2xkZXIgb25lXG5cdFx0XHRvU2VsZWN0aW9uVmFyaWFudC5yZW1vdmVTZWxlY3RPcHRpb24oc0xvY2FsUHJvcGVydHkpO1xuXHRcdFx0b1NlbGVjdGlvblZhcmlhbnQubWFzc0FkZFNlbGVjdE9wdGlvbihzU2VtYW50aWNPYmplY3RQcm9wZXJ0eSwgb1NlbGVjdE9wdGlvbik7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBvU2VsZWN0aW9uVmFyaWFudDtcbn1cblxudHlwZSBTZW1hbnRpY09iamVjdEZyb21QYXRoID0ge1xuXHRzZW1hbnRpY09iamVjdFBhdGg6IHN0cmluZztcblx0c2VtYW50aWNPYmplY3RGb3JHZXRMaW5rczogeyBzZW1hbnRpY09iamVjdDogc3RyaW5nIH1bXTtcblx0c2VtYW50aWNPYmplY3Q6IHtcblx0XHRzZW1hbnRpY09iamVjdDogeyAkUGF0aDogc3RyaW5nIH07XG5cdH07XG5cdHVuYXZhaWxhYmxlQWN0aW9uczogc3RyaW5nW107XG59O1xuYXN5bmMgZnVuY3Rpb24gZm5HZXRTZW1hbnRpY09iamVjdHNGcm9tUGF0aChvTWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbCwgc1BhdGg6IHN0cmluZywgc1F1YWxpZmllcjogc3RyaW5nKSB7XG5cdHJldHVybiBuZXcgUHJvbWlzZTxTZW1hbnRpY09iamVjdEZyb21QYXRoPihmdW5jdGlvbiAocmVzb2x2ZSkge1xuXHRcdGxldCBzU2VtYW50aWNPYmplY3QsIGFTZW1hbnRpY09iamVjdFVuYXZhaWxhYmxlQWN0aW9ucztcblx0XHRpZiAoc1F1YWxpZmllciA9PT0gXCJcIikge1xuXHRcdFx0c1NlbWFudGljT2JqZWN0ID0gb01ldGFNb2RlbC5nZXRPYmplY3QoYCR7c1BhdGh9QCR7Q29tbW9uQW5ub3RhdGlvblRlcm1zLlNlbWFudGljT2JqZWN0fWApO1xuXHRcdFx0YVNlbWFudGljT2JqZWN0VW5hdmFpbGFibGVBY3Rpb25zID0gb01ldGFNb2RlbC5nZXRPYmplY3QoYCR7c1BhdGh9QCR7Q29tbW9uQW5ub3RhdGlvblRlcm1zLlNlbWFudGljT2JqZWN0VW5hdmFpbGFibGVBY3Rpb25zfWApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRzU2VtYW50aWNPYmplY3QgPSBvTWV0YU1vZGVsLmdldE9iamVjdChgJHtzUGF0aH1AJHtDb21tb25Bbm5vdGF0aW9uVGVybXMuU2VtYW50aWNPYmplY3R9IyR7c1F1YWxpZmllcn1gKTtcblx0XHRcdGFTZW1hbnRpY09iamVjdFVuYXZhaWxhYmxlQWN0aW9ucyA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KFxuXHRcdFx0XHRgJHtzUGF0aH1AJHtDb21tb25Bbm5vdGF0aW9uVGVybXMuU2VtYW50aWNPYmplY3RVbmF2YWlsYWJsZUFjdGlvbnN9IyR7c1F1YWxpZmllcn1gXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdGNvbnN0IGFTZW1hbnRpY09iamVjdEZvckdldExpbmtzID0gW3sgc2VtYW50aWNPYmplY3Q6IHNTZW1hbnRpY09iamVjdCB9XTtcblx0XHRjb25zdCBvU2VtYW50aWNPYmplY3QgPSB7XG5cdFx0XHRzZW1hbnRpY09iamVjdDogc1NlbWFudGljT2JqZWN0XG5cdFx0fTtcblx0XHRyZXNvbHZlKHtcblx0XHRcdHNlbWFudGljT2JqZWN0UGF0aDogc1BhdGgsXG5cdFx0XHRzZW1hbnRpY09iamVjdEZvckdldExpbmtzOiBhU2VtYW50aWNPYmplY3RGb3JHZXRMaW5rcyxcblx0XHRcdHNlbWFudGljT2JqZWN0OiBvU2VtYW50aWNPYmplY3QsXG5cdFx0XHR1bmF2YWlsYWJsZUFjdGlvbnM6IGFTZW1hbnRpY09iamVjdFVuYXZhaWxhYmxlQWN0aW9uc1xuXHRcdH0pO1xuXHR9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZm5VcGRhdGVTZW1hbnRpY1RhcmdldHNNb2RlbChcblx0YUdldExpbmtzUHJvbWlzZXM6IFByb21pc2U8TGlua0RlZmluaXRpb25bXVtdW10+W10sXG5cdGFTZW1hbnRpY09iamVjdHM6IFNlbWFudGljT2JqZWN0W10sXG5cdG9JbnRlcm5hbE1vZGVsQ29udGV4dDogSW50ZXJuYWxNb2RlbENvbnRleHQsXG5cdHNDdXJyZW50SGFzaDogc3RyaW5nXG4pIHtcblx0dHlwZSBTZW1hbnRpY09iamVjdEluZm8gPSB7IHNlbWFudGljT2JqZWN0OiBzdHJpbmc7IHBhdGg6IHN0cmluZzsgSGFzVGFyZ2V0czogYm9vbGVhbjsgSGFzVGFyZ2V0c05vdEZpbHRlcmVkOiBib29sZWFuIH07XG5cdHJldHVybiBQcm9taXNlLmFsbChhR2V0TGlua3NQcm9taXNlcylcblx0XHQudGhlbihmdW5jdGlvbiAoYVZhbHVlcykge1xuXHRcdFx0bGV0IGFMaW5rczogTGlua0RlZmluaXRpb25bXVtdW10sXG5cdFx0XHRcdF9vTGluayxcblx0XHRcdFx0X3NMaW5rSW50ZW50QWN0aW9uLFxuXHRcdFx0XHRhRmluYWxMaW5rczogTGlua0RlZmluaXRpb25bXVtdID0gW107XG5cdFx0XHRsZXQgb0ZpbmFsU2VtYW50aWNPYmplY3RzOiBSZWNvcmQ8c3RyaW5nLCBTZW1hbnRpY09iamVjdEluZm8+ID0ge307XG5cdFx0XHRjb25zdCBiSW50ZW50SGFzQWN0aW9ucyA9IGZ1bmN0aW9uIChzSW50ZW50OiBzdHJpbmcsIGFBY3Rpb25zPzogdW5rbm93bltdKSB7XG5cdFx0XHRcdGZvciAoY29uc3QgaW50ZW50IGluIGFBY3Rpb25zKSB7XG5cdFx0XHRcdFx0aWYgKGludGVudCA9PT0gc0ludGVudCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cblx0XHRcdGZvciAobGV0IGsgPSAwOyBrIDwgYVZhbHVlcy5sZW5ndGg7IGsrKykge1xuXHRcdFx0XHRhTGlua3MgPSBhVmFsdWVzW2tdO1xuXHRcdFx0XHRpZiAoYUxpbmtzICYmIGFMaW5rcy5sZW5ndGggPiAwICYmIGFMaW5rc1swXSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0Y29uc3Qgb1NlbWFudGljT2JqZWN0OiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBTZW1hbnRpY09iamVjdEluZm8+PiA9IHt9O1xuXHRcdFx0XHRcdGxldCBvVG1wOiBTZW1hbnRpY09iamVjdEluZm87XG5cdFx0XHRcdFx0bGV0IHNBbHRlcm5hdGVQYXRoO1xuXHRcdFx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgYUxpbmtzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdFx0XHRhRmluYWxMaW5rcy5wdXNoKFtdKTtcblx0XHRcdFx0XHRcdGxldCBoYXNUYXJnZXRzTm90RmlsdGVyZWQgPSBmYWxzZTtcblx0XHRcdFx0XHRcdGxldCBoYXNUYXJnZXRzID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRmb3IgKGxldCBpTGlua0NvdW50ID0gMDsgaUxpbmtDb3VudCA8IGFMaW5rc1tpXVswXS5sZW5ndGg7IGlMaW5rQ291bnQrKykge1xuXHRcdFx0XHRcdFx0XHRfb0xpbmsgPSBhTGlua3NbaV1bMF1baUxpbmtDb3VudF07XG5cdFx0XHRcdFx0XHRcdF9zTGlua0ludGVudEFjdGlvbiA9IF9vTGluayAmJiBfb0xpbmsuaW50ZW50LnNwbGl0KFwiP1wiKVswXS5zcGxpdChcIi1cIilbMV07XG5cblx0XHRcdFx0XHRcdFx0aWYgKCEoX29MaW5rICYmIF9vTGluay5pbnRlbnQgJiYgX29MaW5rLmludGVudC5pbmRleE9mKHNDdXJyZW50SGFzaCkgPT09IDApKSB7XG5cdFx0XHRcdFx0XHRcdFx0aGFzVGFyZ2V0c05vdEZpbHRlcmVkID0gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0XHRpZiAoIWJJbnRlbnRIYXNBY3Rpb25zKF9zTGlua0ludGVudEFjdGlvbiwgYVNlbWFudGljT2JqZWN0c1trXS51bmF2YWlsYWJsZUFjdGlvbnMpKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRhRmluYWxMaW5rc1tpXS5wdXNoKF9vTGluayk7XG5cdFx0XHRcdFx0XHRcdFx0XHRoYXNUYXJnZXRzID0gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdG9UbXAgPSB7XG5cdFx0XHRcdFx0XHRcdHNlbWFudGljT2JqZWN0OiBhU2VtYW50aWNPYmplY3RzW2tdLnNlbWFudGljT2JqZWN0LFxuXHRcdFx0XHRcdFx0XHRwYXRoOiBhU2VtYW50aWNPYmplY3RzW2tdLnBhdGgsXG5cdFx0XHRcdFx0XHRcdEhhc1RhcmdldHM6IGhhc1RhcmdldHMsXG5cdFx0XHRcdFx0XHRcdEhhc1RhcmdldHNOb3RGaWx0ZXJlZDogaGFzVGFyZ2V0c05vdEZpbHRlcmVkXG5cdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0aWYgKG9TZW1hbnRpY09iamVjdFthU2VtYW50aWNPYmplY3RzW2tdLnNlbWFudGljT2JqZWN0XSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRcdG9TZW1hbnRpY09iamVjdFthU2VtYW50aWNPYmplY3RzW2tdLnNlbWFudGljT2JqZWN0XSA9IHt9O1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0c0FsdGVybmF0ZVBhdGggPSBhU2VtYW50aWNPYmplY3RzW2tdLnBhdGgucmVwbGFjZSgvXFwvL2csIFwiX1wiKTtcblx0XHRcdFx0XHRcdGlmIChvU2VtYW50aWNPYmplY3RbYVNlbWFudGljT2JqZWN0c1trXS5zZW1hbnRpY09iamVjdF1bc0FsdGVybmF0ZVBhdGhdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdFx0b1NlbWFudGljT2JqZWN0W2FTZW1hbnRpY09iamVjdHNba10uc2VtYW50aWNPYmplY3RdW3NBbHRlcm5hdGVQYXRoXSA9IHt9IGFzIFNlbWFudGljT2JqZWN0SW5mbztcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdG9TZW1hbnRpY09iamVjdFthU2VtYW50aWNPYmplY3RzW2tdLnNlbWFudGljT2JqZWN0XVtzQWx0ZXJuYXRlUGF0aF0gPSBPYmplY3QuYXNzaWduKFxuXHRcdFx0XHRcdFx0XHRvU2VtYW50aWNPYmplY3RbYVNlbWFudGljT2JqZWN0c1trXS5zZW1hbnRpY09iamVjdF1bc0FsdGVybmF0ZVBhdGhdLFxuXHRcdFx0XHRcdFx0XHRvVG1wXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRjb25zdCBzU2VtYW50aWNPYmplY3ROYW1lID0gT2JqZWN0LmtleXMob1NlbWFudGljT2JqZWN0KVswXTtcblx0XHRcdFx0XHRpZiAoT2JqZWN0LmtleXMob0ZpbmFsU2VtYW50aWNPYmplY3RzKS5pbmNsdWRlcyhzU2VtYW50aWNPYmplY3ROYW1lKSkge1xuXHRcdFx0XHRcdFx0b0ZpbmFsU2VtYW50aWNPYmplY3RzW3NTZW1hbnRpY09iamVjdE5hbWVdID0gT2JqZWN0LmFzc2lnbihcblx0XHRcdFx0XHRcdFx0b0ZpbmFsU2VtYW50aWNPYmplY3RzW3NTZW1hbnRpY09iamVjdE5hbWVdLFxuXHRcdFx0XHRcdFx0XHRvU2VtYW50aWNPYmplY3Rbc1NlbWFudGljT2JqZWN0TmFtZV1cblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdG9GaW5hbFNlbWFudGljT2JqZWN0cyA9IE9iamVjdC5hc3NpZ24ob0ZpbmFsU2VtYW50aWNPYmplY3RzLCBvU2VtYW50aWNPYmplY3QpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRhRmluYWxMaW5rcyA9IFtdO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRpZiAoT2JqZWN0LmtleXMob0ZpbmFsU2VtYW50aWNPYmplY3RzKS5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcblx0XHRcdFx0XHRcInNlbWFudGljc1RhcmdldHNcIixcblx0XHRcdFx0XHRtZXJnZU9iamVjdHMob0ZpbmFsU2VtYW50aWNPYmplY3RzLCBvSW50ZXJuYWxNb2RlbENvbnRleHQuZ2V0UHJvcGVydHkoXCJzZW1hbnRpY3NUYXJnZXRzXCIpKVxuXHRcdFx0XHQpO1xuXHRcdFx0XHRyZXR1cm4gb0ZpbmFsU2VtYW50aWNPYmplY3RzO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuO1xuXHRcdH0pXG5cdFx0LmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IHVua25vd24pIHtcblx0XHRcdExvZy5lcnJvcihcImZuVXBkYXRlU2VtYW50aWNUYXJnZXRzTW9kZWw6IENhbm5vdCByZWFkIGxpbmtzXCIsIG9FcnJvciBhcyBzdHJpbmcpO1xuXHRcdH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmbkdldFNlbWFudGljT2JqZWN0UHJvbWlzZShcblx0b0FwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LFxuXHRvVmlldzogVmlldyxcblx0b01ldGFNb2RlbDogT0RhdGFNZXRhTW9kZWwsXG5cdHNQYXRoOiBzdHJpbmcsXG5cdHNRdWFsaWZpZXI6IHN0cmluZ1xuKSB7XG5cdHJldHVybiBDb21tb25VdGlscy5nZXRTZW1hbnRpY09iamVjdHNGcm9tUGF0aChvTWV0YU1vZGVsLCBzUGF0aCwgc1F1YWxpZmllcik7XG59XG5cbmZ1bmN0aW9uIGZuUHJlcGFyZVNlbWFudGljT2JqZWN0c1Byb21pc2VzKFxuXHRfb0FwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LFxuXHRfb1ZpZXc6IFZpZXcsXG5cdF9vTWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbCxcblx0X2FTZW1hbnRpY09iamVjdHNGb3VuZDogc3RyaW5nW10sXG5cdF9hU2VtYW50aWNPYmplY3RzUHJvbWlzZXM6IFByb21pc2U8U2VtYW50aWNPYmplY3RGcm9tUGF0aD5bXVxuKSB7XG5cdGxldCBfS2V5czogc3RyaW5nW10sIHNQYXRoO1xuXHRsZXQgc1F1YWxpZmllcjogc3RyaW5nLCByZWdleFJlc3VsdDtcblx0Zm9yIChsZXQgaSA9IDA7IGkgPCBfYVNlbWFudGljT2JqZWN0c0ZvdW5kLmxlbmd0aDsgaSsrKSB7XG5cdFx0c1BhdGggPSBfYVNlbWFudGljT2JqZWN0c0ZvdW5kW2ldO1xuXHRcdF9LZXlzID0gT2JqZWN0LmtleXMoX29NZXRhTW9kZWwuZ2V0T2JqZWN0KHNQYXRoICsgXCJAXCIpKTtcblx0XHRmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgX0tleXMubGVuZ3RoOyBpbmRleCsrKSB7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdF9LZXlzW2luZGV4XS5pbmRleE9mKGBAJHtDb21tb25Bbm5vdGF0aW9uVGVybXMuU2VtYW50aWNPYmplY3R9YCkgPT09IDAgJiZcblx0XHRcdFx0X0tleXNbaW5kZXhdLmluZGV4T2YoYEAke0NvbW1vbkFubm90YXRpb25UZXJtcy5TZW1hbnRpY09iamVjdE1hcHBpbmd9YCkgPT09IC0xICYmXG5cdFx0XHRcdF9LZXlzW2luZGV4XS5pbmRleE9mKGBAJHtDb21tb25Bbm5vdGF0aW9uVGVybXMuU2VtYW50aWNPYmplY3RVbmF2YWlsYWJsZUFjdGlvbnN9YCkgPT09IC0xXG5cdFx0XHQpIHtcblx0XHRcdFx0cmVnZXhSZXN1bHQgPSAvIyguKikvLmV4ZWMoX0tleXNbaW5kZXhdKTtcblx0XHRcdFx0c1F1YWxpZmllciA9IHJlZ2V4UmVzdWx0ID8gcmVnZXhSZXN1bHRbMV0gOiBcIlwiO1xuXHRcdFx0XHRfYVNlbWFudGljT2JqZWN0c1Byb21pc2VzLnB1c2goXG5cdFx0XHRcdFx0Q29tbW9uVXRpbHMuZ2V0U2VtYW50aWNPYmplY3RQcm9taXNlKF9vQXBwQ29tcG9uZW50LCBfb1ZpZXcsIF9vTWV0YU1vZGVsLCBzUGF0aCwgc1F1YWxpZmllcilcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn1cblxudHlwZSBJbnRlcm5hbEpTT05Nb2RlbCA9IHtcblx0X2dldE9iamVjdCh2YWw6IHN0cmluZywgY29udGV4dD86IENvbnRleHQpOiBvYmplY3Q7XG59O1xuZnVuY3Rpb24gZm5HZXRTZW1hbnRpY1RhcmdldHNGcm9tUGFnZU1vZGVsKG9Db250cm9sbGVyOiBQYWdlQ29udHJvbGxlciwgc1BhZ2VNb2RlbDogc3RyaW5nKSB7XG5cdGNvbnN0IF9mbmZpbmRWYWx1ZXNIZWxwZXIgPSBmdW5jdGlvbiAoXG5cdFx0b2JqOiB1bmRlZmluZWQgfCBudWxsIHwgUmVjb3JkPHN0cmluZywgc3RyaW5nPltdIHwgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG5cdFx0a2V5OiBzdHJpbmcsXG5cdFx0bGlzdDogc3RyaW5nW11cblx0KSB7XG5cdFx0aWYgKCFvYmopIHtcblx0XHRcdHJldHVybiBsaXN0O1xuXHRcdH1cblx0XHRpZiAob2JqIGluc3RhbmNlb2YgQXJyYXkpIHtcblx0XHRcdG9iai5mb3JFYWNoKChpdGVtKSA9PiB7XG5cdFx0XHRcdGxpc3QgPSBsaXN0LmNvbmNhdChfZm5maW5kVmFsdWVzSGVscGVyKGl0ZW0sIGtleSwgW10pKTtcblx0XHRcdH0pO1xuXHRcdFx0cmV0dXJuIGxpc3Q7XG5cdFx0fVxuXHRcdGlmIChvYmpba2V5XSkge1xuXHRcdFx0bGlzdC5wdXNoKG9ialtrZXldIGFzIHN0cmluZyk7XG5cdFx0fVxuXG5cdFx0aWYgKHR5cGVvZiBvYmogPT0gXCJvYmplY3RcIiAmJiBvYmogIT09IG51bGwpIHtcblx0XHRcdGNvbnN0IGNoaWxkcmVuID0gT2JqZWN0LmtleXMob2JqKTtcblx0XHRcdGlmIChjaGlsZHJlbi5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0XHRsaXN0ID0gbGlzdC5jb25jYXQoX2ZuZmluZFZhbHVlc0hlbHBlcihvYmpbY2hpbGRyZW5baV1dIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBrZXksIFtdKSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGxpc3Q7XG5cdH07XG5cdGNvbnN0IF9mbmZpbmRWYWx1ZXMgPSBmdW5jdGlvbiAob2JqOiB1bmRlZmluZWQgfCBudWxsIHwgUmVjb3JkPHN0cmluZywgc3RyaW5nPltdIHwgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIGtleTogc3RyaW5nKSB7XG5cdFx0cmV0dXJuIF9mbmZpbmRWYWx1ZXNIZWxwZXIob2JqLCBrZXksIFtdKTtcblx0fTtcblx0Y29uc3QgX2ZuRGVsZXRlRHVwbGljYXRlU2VtYW50aWNPYmplY3RzID0gZnVuY3Rpb24gKGFTZW1hbnRpY09iamVjdFBhdGg6IHN0cmluZ1tdKSB7XG5cdFx0cmV0dXJuIGFTZW1hbnRpY09iamVjdFBhdGguZmlsdGVyKGZ1bmN0aW9uICh2YWx1ZTogc3RyaW5nLCBpbmRleDogbnVtYmVyKSB7XG5cdFx0XHRyZXR1cm4gYVNlbWFudGljT2JqZWN0UGF0aC5pbmRleE9mKHZhbHVlKSA9PT0gaW5kZXg7XG5cdFx0fSk7XG5cdH07XG5cdGNvbnN0IG9WaWV3ID0gb0NvbnRyb2xsZXIuZ2V0VmlldygpO1xuXHRjb25zdCBvSW50ZXJuYWxNb2RlbENvbnRleHQgPSBvVmlldy5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0O1xuXG5cdGlmIChvSW50ZXJuYWxNb2RlbENvbnRleHQpIHtcblx0XHRjb25zdCBhU2VtYW50aWNPYmplY3RzUHJvbWlzZXM6IFByb21pc2U8U2VtYW50aWNPYmplY3RGcm9tUGF0aD5bXSA9IFtdO1xuXHRcdGNvbnN0IG9Db21wb25lbnQgPSBvQ29udHJvbGxlci5nZXRPd25lckNvbXBvbmVudCgpO1xuXHRcdGNvbnN0IG9BcHBDb21wb25lbnQgPSBDb21wb25lbnQuZ2V0T3duZXJDb21wb25lbnRGb3Iob0NvbXBvbmVudCkgYXMgQXBwQ29tcG9uZW50O1xuXHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvQXBwQ29tcG9uZW50LmdldE1ldGFNb2RlbCgpO1xuXHRcdGxldCBvUGFnZU1vZGVsID0gKG9Db21wb25lbnQuZ2V0TW9kZWwoc1BhZ2VNb2RlbCkgYXMgSlNPTk1vZGVsKS5nZXREYXRhKCk7XG5cdFx0aWYgKEpTT04uc3RyaW5naWZ5KG9QYWdlTW9kZWwpID09PSBcInt9XCIpIHtcblx0XHRcdG9QYWdlTW9kZWwgPSAob0NvbXBvbmVudC5nZXRNb2RlbChzUGFnZU1vZGVsKSBhcyB1bmtub3duIGFzIEludGVybmFsSlNPTk1vZGVsKS5fZ2V0T2JqZWN0KFwiL1wiLCB1bmRlZmluZWQpO1xuXHRcdH1cblx0XHRsZXQgYVNlbWFudGljT2JqZWN0c0ZvdW5kID0gX2ZuZmluZFZhbHVlcyhvUGFnZU1vZGVsLCBcInNlbWFudGljT2JqZWN0UGF0aFwiKTtcblx0XHRhU2VtYW50aWNPYmplY3RzRm91bmQgPSBfZm5EZWxldGVEdXBsaWNhdGVTZW1hbnRpY09iamVjdHMoYVNlbWFudGljT2JqZWN0c0ZvdW5kKTtcblx0XHRjb25zdCBvU2hlbGxTZXJ2aWNlSGVscGVyID0gQ29tbW9uVXRpbHMuZ2V0U2hlbGxTZXJ2aWNlcyhvQXBwQ29tcG9uZW50KTtcblx0XHRsZXQgc0N1cnJlbnRIYXNoID0gQ29tbW9uVXRpbHMuZ2V0SGFzaCgpO1xuXHRcdGNvbnN0IGFTZW1hbnRpY09iamVjdHNGb3JHZXRMaW5rcyA9IFtdO1xuXHRcdGNvbnN0IGFTZW1hbnRpY09iamVjdHM6IFNlbWFudGljT2JqZWN0W10gPSBbXTtcblx0XHRsZXQgX29TZW1hbnRpY09iamVjdDtcblxuXHRcdGlmIChzQ3VycmVudEhhc2ggJiYgc0N1cnJlbnRIYXNoLmluZGV4T2YoXCI/XCIpICE9PSAtMSkge1xuXHRcdFx0Ly8gc0N1cnJlbnRIYXNoIGNhbiBjb250YWluIHF1ZXJ5IHN0cmluZywgY3V0IGl0IG9mZiFcblx0XHRcdHNDdXJyZW50SGFzaCA9IHNDdXJyZW50SGFzaC5zcGxpdChcIj9cIilbMF07XG5cdFx0fVxuXG5cdFx0Zm5QcmVwYXJlU2VtYW50aWNPYmplY3RzUHJvbWlzZXMob0FwcENvbXBvbmVudCwgb1ZpZXcsIG9NZXRhTW9kZWwsIGFTZW1hbnRpY09iamVjdHNGb3VuZCwgYVNlbWFudGljT2JqZWN0c1Byb21pc2VzKTtcblxuXHRcdGlmIChhU2VtYW50aWNPYmplY3RzUHJvbWlzZXMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdFByb21pc2UuYWxsKGFTZW1hbnRpY09iamVjdHNQcm9taXNlcylcblx0XHRcdFx0LnRoZW4oYXN5bmMgZnVuY3Rpb24gKGFWYWx1ZXMpIHtcblx0XHRcdFx0XHRjb25zdCBhR2V0TGlua3NQcm9taXNlcyA9IFtdO1xuXHRcdFx0XHRcdGxldCBzU2VtT2JqRXhwcmVzc2lvbjtcblx0XHRcdFx0XHR0eXBlIFNlbWFudGljT2JqZWN0UmVzb2x2ZWQgPSB7XG5cdFx0XHRcdFx0XHRzZW1hbnRpY09iamVjdFBhdGg6IHN0cmluZztcblx0XHRcdFx0XHRcdHNlbWFudGljT2JqZWN0Rm9yR2V0TGlua3M6IHsgc2VtYW50aWNPYmplY3Q6IHN0cmluZyB9W107XG5cdFx0XHRcdFx0XHRzZW1hbnRpY09iamVjdDoge1xuXHRcdFx0XHRcdFx0XHRzZW1hbnRpY09iamVjdDogc3RyaW5nO1xuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdHVuYXZhaWxhYmxlQWN0aW9uczogc3RyaW5nW107XG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRjb25zdCBhU2VtYW50aWNPYmplY3RzUmVzb2x2ZWQ6IFNlbWFudGljT2JqZWN0UmVzb2x2ZWRbXSA9IGFWYWx1ZXMuZmlsdGVyKGZ1bmN0aW9uIChlbGVtZW50KSB7XG5cdFx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRcdGVsZW1lbnQuc2VtYW50aWNPYmplY3QgIT09IHVuZGVmaW5lZCAmJlxuXHRcdFx0XHRcdFx0XHRlbGVtZW50LnNlbWFudGljT2JqZWN0LnNlbWFudGljT2JqZWN0ICYmXG5cdFx0XHRcdFx0XHRcdHR5cGVvZiBlbGVtZW50LnNlbWFudGljT2JqZWN0LnNlbWFudGljT2JqZWN0ID09PSBcIm9iamVjdFwiXG5cdFx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdFx0c1NlbU9iakV4cHJlc3Npb24gPSBjb21waWxlRXhwcmVzc2lvbihwYXRoSW5Nb2RlbChlbGVtZW50LnNlbWFudGljT2JqZWN0LnNlbWFudGljT2JqZWN0LiRQYXRoKSkhO1xuXHRcdFx0XHRcdFx0XHQoZWxlbWVudCBhcyB1bmtub3duIGFzIFNlbWFudGljT2JqZWN0UmVzb2x2ZWQpLnNlbWFudGljT2JqZWN0LnNlbWFudGljT2JqZWN0ID0gc1NlbU9iakV4cHJlc3Npb247XG5cdFx0XHRcdFx0XHRcdGVsZW1lbnQuc2VtYW50aWNPYmplY3RGb3JHZXRMaW5rc1swXS5zZW1hbnRpY09iamVjdCA9IHNTZW1PYmpFeHByZXNzaW9uO1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoZWxlbWVudCkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gZWxlbWVudC5zZW1hbnRpY09iamVjdCAhPT0gdW5kZWZpbmVkO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pIGFzIHVua25vd24gYXMgU2VtYW50aWNPYmplY3RSZXNvbHZlZFtdO1xuXHRcdFx0XHRcdGZvciAobGV0IGogPSAwOyBqIDwgYVNlbWFudGljT2JqZWN0c1Jlc29sdmVkLmxlbmd0aDsgaisrKSB7XG5cdFx0XHRcdFx0XHRfb1NlbWFudGljT2JqZWN0ID0gYVNlbWFudGljT2JqZWN0c1Jlc29sdmVkW2pdO1xuXHRcdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0XHRfb1NlbWFudGljT2JqZWN0ICYmXG5cdFx0XHRcdFx0XHRcdF9vU2VtYW50aWNPYmplY3Quc2VtYW50aWNPYmplY3QgJiZcblx0XHRcdFx0XHRcdFx0IShfb1NlbWFudGljT2JqZWN0LnNlbWFudGljT2JqZWN0LnNlbWFudGljT2JqZWN0LmluZGV4T2YoXCJ7XCIpID09PSAwKVxuXHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdGFTZW1hbnRpY09iamVjdHNGb3JHZXRMaW5rcy5wdXNoKF9vU2VtYW50aWNPYmplY3Quc2VtYW50aWNPYmplY3RGb3JHZXRMaW5rcyk7XG5cdFx0XHRcdFx0XHRcdGFTZW1hbnRpY09iamVjdHMucHVzaCh7XG5cdFx0XHRcdFx0XHRcdFx0c2VtYW50aWNPYmplY3Q6IF9vU2VtYW50aWNPYmplY3Quc2VtYW50aWNPYmplY3Quc2VtYW50aWNPYmplY3QsXG5cdFx0XHRcdFx0XHRcdFx0dW5hdmFpbGFibGVBY3Rpb25zOiBfb1NlbWFudGljT2JqZWN0LnVuYXZhaWxhYmxlQWN0aW9ucyxcblx0XHRcdFx0XHRcdFx0XHRwYXRoOiBhU2VtYW50aWNPYmplY3RzUmVzb2x2ZWRbal0uc2VtYW50aWNPYmplY3RQYXRoXG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRhR2V0TGlua3NQcm9taXNlcy5wdXNoKG9TaGVsbFNlcnZpY2VIZWxwZXIuZ2V0TGlua3NXaXRoQ2FjaGUoW19vU2VtYW50aWNPYmplY3Quc2VtYW50aWNPYmplY3RGb3JHZXRMaW5rc10pKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIENvbW1vblV0aWxzLnVwZGF0ZVNlbWFudGljVGFyZ2V0cyhhR2V0TGlua3NQcm9taXNlcywgYVNlbWFudGljT2JqZWN0cywgb0ludGVybmFsTW9kZWxDb250ZXh0LCBzQ3VycmVudEhhc2gpO1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogdW5rbm93bikge1xuXHRcdFx0XHRcdExvZy5lcnJvcihcImZuR2V0U2VtYW50aWNUYXJnZXRzRnJvbVRhYmxlOiBDYW5ub3QgZ2V0IFNlbWFudGljIE9iamVjdHNcIiwgb0Vycm9yIGFzIHN0cmluZyk7XG5cdFx0XHRcdH0pO1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cbn1cblxuZnVuY3Rpb24gZ2V0RmlsdGVyQWxsb3dlZEV4cHJlc3Npb24ob0ZpbHRlclJlc3RyaWN0aW9uc0Fubm90YXRpb24/OiBNZXRhTW9kZWxUeXBlPEZpbHRlclJlc3RyaWN0aW9uc1R5cGU+KSB7XG5cdGNvbnN0IG1BbGxvd2VkRXhwcmVzc2lvbnM6IF9GaWx0ZXJBbGxvd2VkRXhwcmVzc2lvbnMgPSB7fTtcblx0aWYgKG9GaWx0ZXJSZXN0cmljdGlvbnNBbm5vdGF0aW9uICYmIG9GaWx0ZXJSZXN0cmljdGlvbnNBbm5vdGF0aW9uLkZpbHRlckV4cHJlc3Npb25SZXN0cmljdGlvbnMgIT09IHVuZGVmaW5lZCkge1xuXHRcdG9GaWx0ZXJSZXN0cmljdGlvbnNBbm5vdGF0aW9uLkZpbHRlckV4cHJlc3Npb25SZXN0cmljdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAob1Byb3BlcnR5KSB7XG5cdFx0XHRpZiAob1Byb3BlcnR5LlByb3BlcnR5ICYmIG9Qcm9wZXJ0eS5BbGxvd2VkRXhwcmVzc2lvbnMgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHQvL1NpbmdsZVZhbHVlIHwgTXVsdGlWYWx1ZSB8IFNpbmdsZVJhbmdlIHwgTXVsdGlSYW5nZSB8IFNlYXJjaEV4cHJlc3Npb24gfCBNdWx0aVJhbmdlT3JTZWFyY2hFeHByZXNzaW9uXG5cdFx0XHRcdGlmIChtQWxsb3dlZEV4cHJlc3Npb25zW29Qcm9wZXJ0eS5Qcm9wZXJ0eS4kUHJvcGVydHlQYXRoXSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0bUFsbG93ZWRFeHByZXNzaW9uc1tvUHJvcGVydHkuUHJvcGVydHkuJFByb3BlcnR5UGF0aF0ucHVzaChvUHJvcGVydHkuQWxsb3dlZEV4cHJlc3Npb25zIGFzIHN0cmluZyk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0bUFsbG93ZWRFeHByZXNzaW9uc1tvUHJvcGVydHkuUHJvcGVydHkuJFByb3BlcnR5UGF0aF0gPSBbb1Byb3BlcnR5LkFsbG93ZWRFeHByZXNzaW9ucyBhcyBzdHJpbmddO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblx0cmV0dXJuIG1BbGxvd2VkRXhwcmVzc2lvbnM7XG59XG5mdW5jdGlvbiBnZXRGaWx0ZXJSZXN0cmljdGlvbnMoXG5cdG9GaWx0ZXJSZXN0cmljdGlvbnNBbm5vdGF0aW9uPzogTWV0YU1vZGVsVHlwZTxGaWx0ZXJSZXN0cmljdGlvbnNUeXBlPixcblx0c1Jlc3RyaWN0aW9uPzogXCJSZXF1aXJlZFByb3BlcnRpZXNcIiB8IFwiTm9uRmlsdGVyYWJsZVByb3BlcnRpZXNcIlxuKSB7XG5cdGxldCBhUHJvcHM6IHN0cmluZ1tdID0gW107XG5cdGlmIChvRmlsdGVyUmVzdHJpY3Rpb25zQW5ub3RhdGlvbiAmJiBvRmlsdGVyUmVzdHJpY3Rpb25zQW5ub3RhdGlvbltzUmVzdHJpY3Rpb24gYXMga2V5b2YgTWV0YU1vZGVsVHlwZTxGaWx0ZXJSZXN0cmljdGlvbnNUeXBlPl0pIHtcblx0XHRhUHJvcHMgPSAoXG5cdFx0XHRvRmlsdGVyUmVzdHJpY3Rpb25zQW5ub3RhdGlvbltzUmVzdHJpY3Rpb24gYXMga2V5b2YgTWV0YU1vZGVsVHlwZTxGaWx0ZXJSZXN0cmljdGlvbnNUeXBlPl0gYXMgRXhwYW5kUGF0aFR5cGU8RWRtLlByb3BlcnR5UGF0aD5bXVxuXHRcdCkubWFwKGZ1bmN0aW9uIChvUHJvcGVydHk6IEV4cGFuZFBhdGhUeXBlPEVkbS5Qcm9wZXJ0eVBhdGg+KSB7XG5cdFx0XHRyZXR1cm4gb1Byb3BlcnR5LiRQcm9wZXJ0eVBhdGg7XG5cdFx0fSk7XG5cdH1cblx0cmV0dXJuIGFQcm9wcztcbn1cblxuZnVuY3Rpb24gX2ZldGNoUHJvcGVydGllc0Zvck5hdlBhdGgocGF0aHM6IHN0cmluZ1tdLCBuYXZQYXRoOiBzdHJpbmcsIHByb3BzOiBzdHJpbmdbXSkge1xuXHRjb25zdCBuYXZQYXRoUHJlZml4ID0gbmF2UGF0aCArIFwiL1wiO1xuXHRyZXR1cm4gcGF0aHMucmVkdWNlKChvdXRQYXRoczogc3RyaW5nW10sIHBhdGhUb0NoZWNrOiBzdHJpbmcpID0+IHtcblx0XHRpZiAocGF0aFRvQ2hlY2suc3RhcnRzV2l0aChuYXZQYXRoUHJlZml4KSkge1xuXHRcdFx0Y29uc3Qgb3V0UGF0aCA9IHBhdGhUb0NoZWNrLnJlcGxhY2UobmF2UGF0aFByZWZpeCwgXCJcIik7XG5cdFx0XHRpZiAob3V0UGF0aHMuaW5kZXhPZihvdXRQYXRoKSA9PT0gLTEpIHtcblx0XHRcdFx0b3V0UGF0aHMucHVzaChvdXRQYXRoKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIG91dFBhdGhzO1xuXHR9LCBwcm9wcyk7XG59XG50eXBlIF9GaWx0ZXJBbGxvd2VkRXhwcmVzc2lvbnMgPSBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT47XG50eXBlIF9GaWx0ZXJSZXN0cmljdGlvbnMgPSB7XG5cdFJlcXVpcmVkUHJvcGVydGllczogc3RyaW5nW107XG5cdE5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzOiBzdHJpbmdbXTtcblx0RmlsdGVyQWxsb3dlZEV4cHJlc3Npb25zOiBfRmlsdGVyQWxsb3dlZEV4cHJlc3Npb25zO1xufTtcbmZ1bmN0aW9uIGdldEZpbHRlclJlc3RyaWN0aW9uc0J5UGF0aChlbnRpdHlQYXRoOiBzdHJpbmcsIG9Db250ZXh0OiBPRGF0YU1ldGFNb2RlbCkge1xuXHRjb25zdCBvUmV0OiBfRmlsdGVyUmVzdHJpY3Rpb25zID0ge1xuXHRcdFJlcXVpcmVkUHJvcGVydGllczogW10sXG5cdFx0Tm9uRmlsdGVyYWJsZVByb3BlcnRpZXM6IFtdLFxuXHRcdEZpbHRlckFsbG93ZWRFeHByZXNzaW9uczoge31cblx0fTtcblx0bGV0IG9GaWx0ZXJSZXN0cmljdGlvbnM7XG5cdGNvbnN0IG5hdmlnYXRpb25UZXh0ID0gXCIkTmF2aWdhdGlvblByb3BlcnR5QmluZGluZ1wiO1xuXHRjb25zdCBmclRlcm0gPSBcIkBPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLkZpbHRlclJlc3RyaWN0aW9uc1wiO1xuXHRjb25zdCBlbnRpdHlUeXBlUGF0aFBhcnRzID0gZW50aXR5UGF0aC5yZXBsYWNlQWxsKFwiJTJGXCIsIFwiL1wiKS5zcGxpdChcIi9cIikuZmlsdGVyKE1vZGVsSGVscGVyLmZpbHRlck91dE5hdlByb3BCaW5kaW5nKTtcblx0Y29uc3QgZW50aXR5VHlwZVBhdGggPSBgLyR7ZW50aXR5VHlwZVBhdGhQYXJ0cy5qb2luKFwiL1wiKX0vYDtcblx0Y29uc3QgZW50aXR5U2V0UGF0aCA9IE1vZGVsSGVscGVyLmdldEVudGl0eVNldFBhdGgoZW50aXR5UGF0aCwgb0NvbnRleHQpO1xuXHRjb25zdCBlbnRpdHlTZXRQYXRoUGFydHMgPSBlbnRpdHlTZXRQYXRoLnNwbGl0KFwiL1wiKS5maWx0ZXIoTW9kZWxIZWxwZXIuZmlsdGVyT3V0TmF2UHJvcEJpbmRpbmcpO1xuXHRjb25zdCBpc0NvbnRhaW5tZW50ID0gb0NvbnRleHQuZ2V0T2JqZWN0KGAke2VudGl0eVR5cGVQYXRofSRDb250YWluc1RhcmdldGApO1xuXHRjb25zdCBjb250YWlubWVudE5hdlBhdGggPSAhIWlzQ29udGFpbm1lbnQgJiYgZW50aXR5VHlwZVBhdGhQYXJ0c1tlbnRpdHlUeXBlUGF0aFBhcnRzLmxlbmd0aCAtIDFdO1xuXG5cdC8vTEVBU1QgUFJJT1JJVFkgLSBGaWx0ZXIgcmVzdHJpY3Rpb25zIGRpcmVjdGx5IGF0IEVudGl0eSBTZXRcblx0Ly9lLmcuIEZSIGluIFwiTlMuRW50aXR5Q29udGFpbmVyL1NhbGVzT3JkZXJNYW5hZ2VcIiBDb250ZXh0UGF0aDogL1NhbGVzT3JkZXJNYW5hZ2Vcblx0aWYgKCFpc0NvbnRhaW5tZW50KSB7XG5cdFx0b0ZpbHRlclJlc3RyaWN0aW9ucyA9IG9Db250ZXh0LmdldE9iamVjdChgJHtlbnRpdHlTZXRQYXRofSR7ZnJUZXJtfWApIGFzIE1ldGFNb2RlbFR5cGU8RmlsdGVyUmVzdHJpY3Rpb25zVHlwZT4gfCB1bmRlZmluZWQ7XG5cdFx0b1JldC5SZXF1aXJlZFByb3BlcnRpZXMgPSBnZXRGaWx0ZXJSZXN0cmljdGlvbnMob0ZpbHRlclJlc3RyaWN0aW9ucywgXCJSZXF1aXJlZFByb3BlcnRpZXNcIikgfHwgW107XG5cdFx0Y29uc3QgcmVzdWx0Q29udGV4dENoZWNrID0gb0NvbnRleHQuZ2V0T2JqZWN0KGAke2VudGl0eVR5cGVQYXRofUBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuUmVzdWx0Q29udGV4dGApO1xuXHRcdGlmICghcmVzdWx0Q29udGV4dENoZWNrKSB7XG5cdFx0XHRvUmV0Lk5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzID0gZ2V0RmlsdGVyUmVzdHJpY3Rpb25zKG9GaWx0ZXJSZXN0cmljdGlvbnMsIFwiTm9uRmlsdGVyYWJsZVByb3BlcnRpZXNcIikgfHwgW107XG5cdFx0fVxuXHRcdC8vU2luZ2xlVmFsdWUgfCBNdWx0aVZhbHVlIHwgU2luZ2xlUmFuZ2UgfCBNdWx0aVJhbmdlIHwgU2VhcmNoRXhwcmVzc2lvbiB8IE11bHRpUmFuZ2VPclNlYXJjaEV4cHJlc3Npb25cblx0XHRvUmV0LkZpbHRlckFsbG93ZWRFeHByZXNzaW9ucyA9IGdldEZpbHRlckFsbG93ZWRFeHByZXNzaW9uKG9GaWx0ZXJSZXN0cmljdGlvbnMpIHx8IHt9O1xuXHR9XG5cblx0aWYgKGVudGl0eVR5cGVQYXRoUGFydHMubGVuZ3RoID4gMSkge1xuXHRcdGNvbnN0IG5hdlBhdGggPSBpc0NvbnRhaW5tZW50ID8gKGNvbnRhaW5tZW50TmF2UGF0aCBhcyBzdHJpbmcpIDogZW50aXR5U2V0UGF0aFBhcnRzW2VudGl0eVNldFBhdGhQYXJ0cy5sZW5ndGggLSAxXTtcblx0XHQvLyBJbiBjYXNlIG9mIGNvbnRhaW5tZW50IHdlIHRha2UgZW50aXR5U2V0IHByb3ZpZGVkIGFzIHBhcmVudC4gQW5kIGluIGNhc2Ugb2Ygbm9ybWFsIHdlIHdvdWxkIHJlbW92ZSB0aGUgbGFzdCBuYXZpZ2F0aW9uIGZyb20gZW50aXR5U2V0UGF0aC5cblx0XHRjb25zdCBwYXJlbnRFbnRpdHlTZXRQYXRoID0gaXNDb250YWlubWVudCA/IGVudGl0eVNldFBhdGggOiBgLyR7ZW50aXR5U2V0UGF0aFBhcnRzLnNsaWNlKDAsIC0xKS5qb2luKGAvJHtuYXZpZ2F0aW9uVGV4dH0vYCl9YDtcblx0XHQvL1RISVJEIEhJR0hFU1QgUFJJT1JJVFkgLSBSZWFkaW5nIHByb3BlcnR5IHBhdGggcmVzdHJpY3Rpb25zIC0gQW5ub3RhdGlvbiBhdCBtYWluIGVudGl0eSBidXQgZGlyZWN0bHkgb24gbmF2aWdhdGlvbiBwcm9wZXJ0eSBwYXRoXG5cdFx0Ly9lLmcuIFBhcmVudCBDdXN0b21lciB3aXRoIFByb3BlcnR5UGF0aD1cIlNldC9DaXR5TmFtZVwiIENvbnRleHRQYXRoOiBDdXN0b21lci9TZXRcblx0XHRjb25zdCBvUGFyZW50UmV0OiBfRmlsdGVyUmVzdHJpY3Rpb25zID0ge1xuXHRcdFx0UmVxdWlyZWRQcm9wZXJ0aWVzOiBbXSxcblx0XHRcdE5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzOiBbXSxcblx0XHRcdEZpbHRlckFsbG93ZWRFeHByZXNzaW9uczoge31cblx0XHR9O1xuXHRcdGlmICghbmF2UGF0aC5pbmNsdWRlcyhcIiUyRlwiKSkge1xuXHRcdFx0Y29uc3Qgb1BhcmVudEZSID0gb0NvbnRleHQuZ2V0T2JqZWN0KGAke3BhcmVudEVudGl0eVNldFBhdGh9JHtmclRlcm19YCkgYXMgTWV0YU1vZGVsVHlwZTxGaWx0ZXJSZXN0cmljdGlvbnNUeXBlPiB8IHVuZGVmaW5lZDtcblx0XHRcdG9SZXQuUmVxdWlyZWRQcm9wZXJ0aWVzID0gX2ZldGNoUHJvcGVydGllc0Zvck5hdlBhdGgoXG5cdFx0XHRcdGdldEZpbHRlclJlc3RyaWN0aW9ucyhvUGFyZW50RlIsIFwiUmVxdWlyZWRQcm9wZXJ0aWVzXCIpIHx8IFtdLFxuXHRcdFx0XHRuYXZQYXRoLFxuXHRcdFx0XHRvUmV0LlJlcXVpcmVkUHJvcGVydGllcyB8fCBbXVxuXHRcdFx0KTtcblx0XHRcdG9SZXQuTm9uRmlsdGVyYWJsZVByb3BlcnRpZXMgPSBfZmV0Y2hQcm9wZXJ0aWVzRm9yTmF2UGF0aChcblx0XHRcdFx0Z2V0RmlsdGVyUmVzdHJpY3Rpb25zKG9QYXJlbnRGUiwgXCJOb25GaWx0ZXJhYmxlUHJvcGVydGllc1wiKSB8fCBbXSxcblx0XHRcdFx0bmF2UGF0aCxcblx0XHRcdFx0b1JldC5Ob25GaWx0ZXJhYmxlUHJvcGVydGllcyB8fCBbXVxuXHRcdFx0KTtcblx0XHRcdC8vU2luZ2xlVmFsdWUgfCBNdWx0aVZhbHVlIHwgU2luZ2xlUmFuZ2UgfCBNdWx0aVJhbmdlIHwgU2VhcmNoRXhwcmVzc2lvbiB8IE11bHRpUmFuZ2VPclNlYXJjaEV4cHJlc3Npb25cblx0XHRcdGNvbnN0IGNvbXBsZXRlQWxsb3dlZEV4cHMgPSBnZXRGaWx0ZXJBbGxvd2VkRXhwcmVzc2lvbihvUGFyZW50RlIpIHx8IHt9O1xuXHRcdFx0b1BhcmVudFJldC5GaWx0ZXJBbGxvd2VkRXhwcmVzc2lvbnMgPSBPYmplY3Qua2V5cyhjb21wbGV0ZUFsbG93ZWRFeHBzKS5yZWR1Y2UoXG5cdFx0XHRcdChvdXRQcm9wOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4sIHByb3BQYXRoOiBzdHJpbmcpID0+IHtcblx0XHRcdFx0XHRpZiAocHJvcFBhdGguc3RhcnRzV2l0aChuYXZQYXRoICsgXCIvXCIpKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBvdXRQcm9wUGF0aCA9IHByb3BQYXRoLnJlcGxhY2UobmF2UGF0aCArIFwiL1wiLCBcIlwiKTtcblx0XHRcdFx0XHRcdG91dFByb3Bbb3V0UHJvcFBhdGhdID0gY29tcGxldGVBbGxvd2VkRXhwc1twcm9wUGF0aF07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiBvdXRQcm9wO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR7fSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT5cblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0Ly9TaW5nbGVWYWx1ZSB8IE11bHRpVmFsdWUgfCBTaW5nbGVSYW5nZSB8IE11bHRpUmFuZ2UgfCBTZWFyY2hFeHByZXNzaW9uIHwgTXVsdGlSYW5nZU9yU2VhcmNoRXhwcmVzc2lvblxuXHRcdG9SZXQuRmlsdGVyQWxsb3dlZEV4cHJlc3Npb25zID0gbWVyZ2VPYmplY3RzKFxuXHRcdFx0e30sXG5cdFx0XHRvUmV0LkZpbHRlckFsbG93ZWRFeHByZXNzaW9ucyB8fCB7fSxcblx0XHRcdG9QYXJlbnRSZXQuRmlsdGVyQWxsb3dlZEV4cHJlc3Npb25zIHx8IHt9XG5cdFx0KSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT47XG5cblx0XHQvL1NFQ09ORCBISUdIRVNUIHByaW9yaXR5IC0gTmF2aWdhdGlvbiByZXN0cmljdGlvbnNcblx0XHQvL2UuZy4gUGFyZW50IFwiL0N1c3RvbWVyXCIgd2l0aCBOYXZpZ2F0aW9uUHJvcGVydHlQYXRoPVwiU2V0XCIgQ29udGV4dFBhdGg6IEN1c3RvbWVyL1NldFxuXHRcdGNvbnN0IG9OYXZSZXN0cmljdGlvbnMgPSBNZXRhTW9kZWxGdW5jdGlvbi5nZXROYXZpZ2F0aW9uUmVzdHJpY3Rpb25zKG9Db250ZXh0LCBwYXJlbnRFbnRpdHlTZXRQYXRoLCBuYXZQYXRoLnJlcGxhY2VBbGwoXCIlMkZcIiwgXCIvXCIpKTtcblx0XHRjb25zdCBvTmF2RmlsdGVyUmVzdCA9IG9OYXZSZXN0cmljdGlvbnMgJiYgKG9OYXZSZXN0cmljdGlvbnNbXCJGaWx0ZXJSZXN0cmljdGlvbnNcIl0gYXMgTWV0YU1vZGVsVHlwZTxGaWx0ZXJSZXN0cmljdGlvbnNUeXBlPik7XG5cdFx0Y29uc3QgbmF2UmVzUmVxUHJvcHMgPSBnZXRGaWx0ZXJSZXN0cmljdGlvbnMob05hdkZpbHRlclJlc3QsIFwiUmVxdWlyZWRQcm9wZXJ0aWVzXCIpIHx8IFtdO1xuXHRcdG9SZXQuUmVxdWlyZWRQcm9wZXJ0aWVzID0gdW5pcXVlU29ydChvUmV0LlJlcXVpcmVkUHJvcGVydGllcy5jb25jYXQobmF2UmVzUmVxUHJvcHMpKTtcblx0XHRjb25zdCBuYXZOb25GaWx0ZXJQcm9wcyA9IGdldEZpbHRlclJlc3RyaWN0aW9ucyhvTmF2RmlsdGVyUmVzdCwgXCJOb25GaWx0ZXJhYmxlUHJvcGVydGllc1wiKSB8fCBbXTtcblx0XHRvUmV0Lk5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzID0gdW5pcXVlU29ydChvUmV0Lk5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzLmNvbmNhdChuYXZOb25GaWx0ZXJQcm9wcykpO1xuXHRcdC8vU2luZ2xlVmFsdWUgfCBNdWx0aVZhbHVlIHwgU2luZ2xlUmFuZ2UgfCBNdWx0aVJhbmdlIHwgU2VhcmNoRXhwcmVzc2lvbiB8IE11bHRpUmFuZ2VPclNlYXJjaEV4cHJlc3Npb25cblx0XHRvUmV0LkZpbHRlckFsbG93ZWRFeHByZXNzaW9ucyA9IG1lcmdlT2JqZWN0cyhcblx0XHRcdHt9LFxuXHRcdFx0b1JldC5GaWx0ZXJBbGxvd2VkRXhwcmVzc2lvbnMgfHwge30sXG5cdFx0XHRnZXRGaWx0ZXJBbGxvd2VkRXhwcmVzc2lvbihvTmF2RmlsdGVyUmVzdCkgfHwge31cblx0XHQpIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPjtcblxuXHRcdC8vSElHSEVTVCBwcmlvcml0eSAtIFJlc3RyaWN0aW9ucyBoYXZpbmcgdGFyZ2V0IHdpdGggbmF2aWdhdGlvbiBhc3NvY2lhdGlvbiBlbnRpdHlcblx0XHQvLyBlLmcuIEZSIGluIFwiQ3VzdG9tZXJQYXJhbWV0ZXJzL1NldFwiIENvbnRleHRQYXRoOiBcIkN1c3RvbWVyL1NldFwiXG5cdFx0Y29uc3QgbmF2QXNzb2NpYXRpb25FbnRpdHlSZXN0ID0gb0NvbnRleHQuZ2V0T2JqZWN0KFxuXHRcdFx0YC8ke2VudGl0eVR5cGVQYXRoUGFydHMuam9pbihcIi9cIil9JHtmclRlcm19YFxuXHRcdCkgYXMgTWV0YU1vZGVsVHlwZTxGaWx0ZXJSZXN0cmljdGlvbnNUeXBlPjtcblx0XHRjb25zdCBuYXZBc3NvY1JlcVByb3BzID0gZ2V0RmlsdGVyUmVzdHJpY3Rpb25zKG5hdkFzc29jaWF0aW9uRW50aXR5UmVzdCwgXCJSZXF1aXJlZFByb3BlcnRpZXNcIikgfHwgW107XG5cdFx0b1JldC5SZXF1aXJlZFByb3BlcnRpZXMgPSB1bmlxdWVTb3J0KG9SZXQuUmVxdWlyZWRQcm9wZXJ0aWVzLmNvbmNhdChuYXZBc3NvY1JlcVByb3BzKSk7XG5cdFx0Y29uc3QgbmF2QXNzb2NOb25GaWx0ZXJQcm9wcyA9IGdldEZpbHRlclJlc3RyaWN0aW9ucyhuYXZBc3NvY2lhdGlvbkVudGl0eVJlc3QsIFwiTm9uRmlsdGVyYWJsZVByb3BlcnRpZXNcIikgfHwgW107XG5cdFx0b1JldC5Ob25GaWx0ZXJhYmxlUHJvcGVydGllcyA9IHVuaXF1ZVNvcnQob1JldC5Ob25GaWx0ZXJhYmxlUHJvcGVydGllcy5jb25jYXQobmF2QXNzb2NOb25GaWx0ZXJQcm9wcykpO1xuXHRcdC8vU2luZ2xlVmFsdWUgfCBNdWx0aVZhbHVlIHwgU2luZ2xlUmFuZ2UgfCBNdWx0aVJhbmdlIHwgU2VhcmNoRXhwcmVzc2lvbiB8IE11bHRpUmFuZ2VPclNlYXJjaEV4cHJlc3Npb25cblx0XHRvUmV0LkZpbHRlckFsbG93ZWRFeHByZXNzaW9ucyA9IG1lcmdlT2JqZWN0cyhcblx0XHRcdHt9LFxuXHRcdFx0b1JldC5GaWx0ZXJBbGxvd2VkRXhwcmVzc2lvbnMsXG5cdFx0XHRnZXRGaWx0ZXJBbGxvd2VkRXhwcmVzc2lvbihuYXZBc3NvY2lhdGlvbkVudGl0eVJlc3QpIHx8IHt9XG5cdFx0KSBhcyBfRmlsdGVyQWxsb3dlZEV4cHJlc3Npb25zO1xuXHR9XG5cdHJldHVybiBvUmV0O1xufVxuXG50eXBlIFByZXByb2Nlc3NvclNldHRpbmdzID0ge1xuXHRiaW5kaW5nQ29udGV4dHM6IG9iamVjdDtcblx0bW9kZWxzOiBvYmplY3Q7XG59O1xudHlwZSBCYXNlVHJlZU1vZGlmaWVyID0ge1xuXHR0ZW1wbGF0ZUNvbnRyb2xGcmFnbWVudChcblx0XHRzRnJhZ21lbnROYW1lOiBzdHJpbmcsXG5cdFx0bVByZXByb2Nlc3NvclNldHRpbmdzOiBQcmVwcm9jZXNzb3JTZXR0aW5ncyxcblx0XHRvVmlldz86IFZpZXdcblx0KTogUHJvbWlzZTxVSTVFbGVtZW50W10gfCBFbGVtZW50W10+O1xuXHR0YXJnZXRzOiBzdHJpbmc7XG59O1xuXG5hc3luYyBmdW5jdGlvbiB0ZW1wbGF0ZUNvbnRyb2xGcmFnbWVudChcblx0c0ZyYWdtZW50TmFtZTogc3RyaW5nLFxuXHRvUHJlcHJvY2Vzc29yU2V0dGluZ3M6IFByZXByb2Nlc3NvclNldHRpbmdzLFxuXHRvT3B0aW9uczogeyB2aWV3PzogVmlldzsgaXNYTUw/OiBib29sZWFuOyBpZDogc3RyaW5nOyBjb250cm9sbGVyOiBDb250cm9sbGVyIH0sXG5cdG9Nb2RpZmllcj86IEJhc2VUcmVlTW9kaWZpZXJcbik6IFByb21pc2U8RWxlbWVudCB8IFVJNUVsZW1lbnQgfCBFbGVtZW50W10gfCBVSTVFbGVtZW50W10+IHtcblx0b09wdGlvbnMgPSBvT3B0aW9ucyB8fCB7fTtcblx0aWYgKG9Nb2RpZmllcikge1xuXHRcdHJldHVybiBvTW9kaWZpZXIudGVtcGxhdGVDb250cm9sRnJhZ21lbnQoc0ZyYWdtZW50TmFtZSwgb1ByZXByb2Nlc3NvclNldHRpbmdzLCBvT3B0aW9ucy52aWV3KS50aGVuKGZ1bmN0aW9uIChvRnJhZ21lbnQpIHtcblx0XHRcdC8vIFRoaXMgaXMgcmVxdWlyZWQgYXMgRmxleCByZXR1cm5zIGFuIEhUTUxDb2xsZWN0aW9uIGFzIHRlbXBsYXRpbmcgcmVzdWx0IGluIFhNTCB0aW1lLlxuXHRcdFx0cmV0dXJuIG9Nb2RpZmllci50YXJnZXRzID09PSBcInhtbFRyZWVcIiAmJiBvRnJhZ21lbnQubGVuZ3RoID4gMCA/IG9GcmFnbWVudFswXSA6IG9GcmFnbWVudDtcblx0XHR9KTtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gbG9hZE1hY3JvTGlicmFyeSgpXG5cdFx0XHQudGhlbihhc3luYyBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHJldHVybiBYTUxQcmVwcm9jZXNzb3IucHJvY2Vzcyhcblx0XHRcdFx0XHRYTUxUZW1wbGF0ZVByb2Nlc3Nvci5sb2FkVGVtcGxhdGUoc0ZyYWdtZW50TmFtZSwgXCJmcmFnbWVudFwiKSxcblx0XHRcdFx0XHR7IG5hbWU6IHNGcmFnbWVudE5hbWUgfSxcblx0XHRcdFx0XHRvUHJlcHJvY2Vzc29yU2V0dGluZ3Ncblx0XHRcdFx0KTtcblx0XHRcdH0pXG5cdFx0XHQudGhlbihhc3luYyBmdW5jdGlvbiAob0ZyYWdtZW50OiBFbGVtZW50KTogUHJvbWlzZTxFbGVtZW50IHwgQ29udHJvbCB8IENvbnRyb2xbXT4ge1xuXHRcdFx0XHRjb25zdCBvQ29udHJvbCA9IG9GcmFnbWVudC5maXJzdEVsZW1lbnRDaGlsZDtcblx0XHRcdFx0aWYgKCEhb09wdGlvbnMuaXNYTUwgJiYgb0NvbnRyb2wpIHtcblx0XHRcdFx0XHRyZXR1cm4gb0NvbnRyb2w7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIEZyYWdtZW50LmxvYWQoe1xuXHRcdFx0XHRcdGlkOiBvT3B0aW9ucy5pZCxcblx0XHRcdFx0XHRkZWZpbml0aW9uOiBvRnJhZ21lbnQgYXMgdW5rbm93biBhcyBzdHJpbmcsXG5cdFx0XHRcdFx0Y29udHJvbGxlcjogb09wdGlvbnMuY29udHJvbGxlclxuXHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXHR9XG59XG5cbmZ1bmN0aW9uIGdldFNpbmdsZXRvblBhdGgocGF0aDogc3RyaW5nLCBtZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0Y29uc3QgcGFydHMgPSBwYXRoLnNwbGl0KFwiL1wiKS5maWx0ZXIoQm9vbGVhbiksXG5cdFx0cHJvcGVydHlOYW1lID0gcGFydHMucG9wKCkhLFxuXHRcdG5hdmlnYXRpb25QYXRoID0gcGFydHMuam9pbihcIi9cIiksXG5cdFx0ZW50aXR5U2V0ID0gbmF2aWdhdGlvblBhdGggJiYgbWV0YU1vZGVsLmdldE9iamVjdChgLyR7bmF2aWdhdGlvblBhdGh9YCk7XG5cdGlmIChlbnRpdHlTZXQ/LiRraW5kID09PSBcIlNpbmdsZXRvblwiKSB7XG5cdFx0Y29uc3Qgc2luZ2xldG9uTmFtZSA9IHBhcnRzW3BhcnRzLmxlbmd0aCAtIDFdO1xuXHRcdHJldHVybiBgLyR7c2luZ2xldG9uTmFtZX0vJHtwcm9wZXJ0eU5hbWV9YDtcblx0fVxuXHRyZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZXF1ZXN0U2luZ2xldG9uUHJvcGVydHkocGF0aDogc3RyaW5nLCBtb2RlbDogT0RhdGFNb2RlbCkge1xuXHRpZiAoIXBhdGggfHwgIW1vZGVsKSB7XG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTtcblx0fVxuXHRjb25zdCBtZXRhTW9kZWwgPSBtb2RlbC5nZXRNZXRhTW9kZWwoKTtcblx0Ly8gRmluZCB0aGUgdW5kZXJseWluZyBlbnRpdHkgc2V0IGZyb20gdGhlIHByb3BlcnR5IHBhdGggYW5kIGNoZWNrIHdoZXRoZXIgaXQgaXMgYSBzaW5nbGV0b24uXG5cdGNvbnN0IHJlc29sdmVkUGF0aCA9IGdldFNpbmdsZXRvblBhdGgocGF0aCwgbWV0YU1vZGVsKTtcblx0aWYgKHJlc29sdmVkUGF0aCkge1xuXHRcdGNvbnN0IHByb3BlcnR5QmluZGluZyA9IG1vZGVsLmJpbmRQcm9wZXJ0eShyZXNvbHZlZFBhdGgpO1xuXHRcdHJldHVybiBwcm9wZXJ0eUJpbmRpbmcucmVxdWVzdFZhbHVlKCk7XG5cdH1cblxuXHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpO1xufVxuXG5mdW5jdGlvbiBhZGRFdmVudFRvQmluZGluZ0luZm8ob0NvbnRyb2w6IENvbnRyb2wsIHNFdmVudE5hbWU6IHN0cmluZywgZkhhbmRsZXI6IEZ1bmN0aW9uKSB7XG5cdGxldCBvQmluZGluZ0luZm86IEFnZ3JlZ2F0aW9uQmluZGluZ0luZm87XG5cdGNvbnN0IHNldEJpbmRpbmdJbmZvID0gZnVuY3Rpb24gKCkge1xuXHRcdGlmIChvQmluZGluZ0luZm8pIHtcblx0XHRcdGlmICghb0JpbmRpbmdJbmZvLmV2ZW50cykge1xuXHRcdFx0XHRvQmluZGluZ0luZm8uZXZlbnRzID0ge307XG5cdFx0XHR9XG5cdFx0XHRpZiAoIW9CaW5kaW5nSW5mby5ldmVudHNbc0V2ZW50TmFtZV0pIHtcblx0XHRcdFx0b0JpbmRpbmdJbmZvLmV2ZW50c1tzRXZlbnROYW1lXSA9IGZIYW5kbGVyO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3QgZk9yaWdpbmFsSGFuZGxlciA9IG9CaW5kaW5nSW5mby5ldmVudHNbc0V2ZW50TmFtZV07XG5cdFx0XHRcdG9CaW5kaW5nSW5mby5ldmVudHNbc0V2ZW50TmFtZV0gPSBmdW5jdGlvbiAoLi4uYXJnczogdW5rbm93bltdKSB7XG5cdFx0XHRcdFx0ZkhhbmRsZXIuYXBwbHkodGhpcywgLi4uYXJncyk7XG5cdFx0XHRcdFx0Zk9yaWdpbmFsSGFuZGxlci5hcHBseSh0aGlzLCAuLi5hcmdzKTtcblx0XHRcdFx0fTtcblx0XHRcdH1cblx0XHR9XG5cdH07XG5cdGlmIChvQ29udHJvbC5pc0E8Q2hhcnQgJiBEZWxlZ2F0ZU1peGluPihcInNhcC51aS5tZGMuQ2hhcnRcIikpIHtcblx0XHRvQ29udHJvbFxuXHRcdFx0LmlubmVyQ2hhcnRCb3VuZCgpXG5cdFx0XHQudGhlbihmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdG9CaW5kaW5nSW5mbyA9IG9Db250cm9sLmdldENvbnRyb2xEZWxlZ2F0ZSgpLl9nZXRDaGFydChvQ29udHJvbCkuZ2V0QmluZGluZ0luZm8oXCJkYXRhXCIpO1xuXHRcdFx0XHRzZXRCaW5kaW5nSW5mbygpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChzRXJyb3I6IHVua25vd24pIHtcblx0XHRcdFx0TG9nLmVycm9yKHNFcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0fSk7XG5cdH0gZWxzZSB7XG5cdFx0b0JpbmRpbmdJbmZvID0gb0NvbnRyb2wuZGF0YShcInJvd3NCaW5kaW5nSW5mb1wiKTtcblx0XHRzZXRCaW5kaW5nSW5mbygpO1xuXHR9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGxvYWRNYWNyb0xpYnJhcnkoKSB7XG5cdHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPihmdW5jdGlvbiAocmVzb2x2ZSkge1xuXHRcdHNhcC51aS5yZXF1aXJlKFtcInNhcC9mZS9tYWNyb3MvbWFjcm9MaWJyYXJ5XCJdLCBmdW5jdGlvbiAoLyptYWNyb0xpYnJhcnkqLykge1xuXHRcdFx0cmVzb2x2ZSgpO1xuXHRcdH0pO1xuXHR9KTtcbn1cblxuLy8gR2V0IHRoZSBwYXRoIGZvciBhY3Rpb24gcGFyYW1ldGVycyB0aGF0IGlzIG5lZWRlZCB0byByZWFkIHRoZSBhbm5vdGF0aW9uc1xuZnVuY3Rpb24gZ2V0UGFyYW1ldGVyUGF0aChzUGF0aDogc3RyaW5nLCBzUGFyYW1ldGVyOiBzdHJpbmcpIHtcblx0bGV0IHNDb250ZXh0O1xuXHRpZiAoc1BhdGguaW5kZXhPZihcIkAkdWk1Lm92ZXJsb2FkXCIpID4gLTEpIHtcblx0XHRzQ29udGV4dCA9IHNQYXRoLnNwbGl0KFwiQCR1aTUub3ZlcmxvYWRcIilbMF07XG5cdH0gZWxzZSB7XG5cdFx0Ly8gRm9yIFVuYm91bmQgQWN0aW9ucyBpbiBBY3Rpb24gUGFyYW1ldGVyIERpYWxvZ3Ncblx0XHRjb25zdCBhQWN0aW9uID0gc1BhdGguc3BsaXQoXCIvMFwiKVswXS5zcGxpdChcIi5cIik7XG5cdFx0c0NvbnRleHQgPSBgLyR7YUFjdGlvblthQWN0aW9uLmxlbmd0aCAtIDFdfS9gO1xuXHR9XG5cdHJldHVybiBzQ29udGV4dCArIHNQYXJhbWV0ZXI7XG59XG5cbi8qKlxuICogR2V0IHJlc29sdmVkIGV4cHJlc3Npb24gYmluZGluZyB1c2VkIGZvciB0ZXh0cyBhdCBydW50aW1lLlxuICpcbiAqIEBwYXJhbSBleHBCaW5kaW5nXG4gKiBAcGFyYW0gY29udHJvbFxuICogQGZ1bmN0aW9uXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuQ29tbW9uVXRpbHNcbiAqIEByZXR1cm5zIEEgc3RyaW5nIGFmdGVyIHJlc29sdXRpb24uXG4gKiBAdWk1LXJlc3RyaWN0ZWRcbiAqL1xuZnVuY3Rpb24gX2ZudHJhbnNsYXRlZFRleHRGcm9tRXhwQmluZGluZ1N0cmluZyhleHBCaW5kaW5nOiBzdHJpbmcsIGNvbnRyb2w6IENvbnRyb2wpIHtcblx0Ly8gVGhlIGlkZWEgaGVyZSBpcyB0byBjcmVhdGUgZHVtbXkgZWxlbWVudCB3aXRoIHRoZSBleHByZXNpb24gYmluZGluZy5cblx0Ly8gQWRkaW5nIGl0IGFzIGRlcGVuZGVudCB0byB0aGUgdmlldy9jb250cm9sIHdvdWxkIHByb3BhZ2F0ZSBhbGwgdGhlIG1vZGVscyB0byB0aGUgZHVtbXkgZWxlbWVudCBhbmQgcmVzb2x2ZSB0aGUgYmluZGluZy5cblx0Ly8gV2UgcmVtb3ZlIHRoZSBkdW1teSBlbGVtZW50IGFmdGVyIHRoYXQgYW5kIGRlc3Ryb3kgaXQuXG5cblx0Y29uc3QgYW55UmVzb3VyY2VUZXh0ID0gbmV3IEFueUVsZW1lbnQoeyBhbnlUZXh0OiBleHBCaW5kaW5nIH0pO1xuXHRjb250cm9sLmFkZERlcGVuZGVudChhbnlSZXNvdXJjZVRleHQpO1xuXHRjb25zdCByZXN1bHRUZXh0ID0gYW55UmVzb3VyY2VUZXh0LmdldEFueVRleHQoKTtcblx0Y29udHJvbC5yZW1vdmVEZXBlbmRlbnQoYW55UmVzb3VyY2VUZXh0KTtcblx0YW55UmVzb3VyY2VUZXh0LmRlc3Ryb3koKTtcblxuXHRyZXR1cm4gcmVzdWx0VGV4dDtcbn1cbi8qKlxuICogQ2hlY2sgaWYgdGhlIGN1cnJlbnQgZGV2aWNlIGhhcyBhIHNtYWxsIHNjcmVlbi5cbiAqXG4gKiBAcmV0dXJucyBBIEJvb2xlYW4uXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBpc1NtYWxsRGV2aWNlKCkge1xuXHRyZXR1cm4gIXN5c3RlbS5kZXNrdG9wIHx8IERldmljZS5yZXNpemUud2lkdGggPD0gMzIwO1xufVxuLyoqXG4gKiBHZXQgZmlsdGVyIGluZm9ybWF0aW9uIGZvciBhIFNlbGVjdGlvblZhcmlhbnQgYW5ub3RhdGlvbi5cbiAqXG4gKiBAcGFyYW0gb0NvbnRyb2wgVGhlIHRhYmxlL2NoYXJ0IGluc3RhbmNlXG4gKiBAcGFyYW0gc2VsZWN0aW9uVmFyaWFudFBhdGggUmVsYXRpdmUgU2VsZWN0aW9uVmFyaWFudCBhbm5vdGF0aW9uIHBhdGhcbiAqIEBwYXJhbSBpc0NoYXJ0XG4gKiBAcmV0dXJucyBJbmZvcm1hdGlvbiBvbiBmaWx0ZXJzXG4gKiAgZmlsdGVyczogYXJyYXkgb2Ygc2FwLnVpLm1vZGVsLmZpbHRlcnNcbiAqIHRleHQ6IFRleHQgcHJvcGVydHkgb2YgdGhlIFNlbGVjdGlvblZhcmlhbnRcbiAqIEBwcml2YXRlXG4gKiBAdWk1LXJlc3RyaWN0ZWRcbiAqL1xuaW50ZXJmYWNlIElTZWxlY3Rpb25PcHRpb24ge1xuXHRQcm9wZXJ0eU5hbWU6IHsgJFByb3BlcnR5UGF0aDogc3RyaW5nIH07XG5cdFJhbmdlczoge1xuXHRcdFtrZXk6IHN0cmluZ106IHtcblx0XHRcdE9wdGlvbjogeyAkRW51bU1lbWJlcjogU3RyaW5nIH07XG5cdFx0XHRMb3c6IHVua25vd247XG5cdFx0XHRIaWdoOiB1bmtub3duO1xuXHRcdH07XG5cdH07XG59XG5mdW5jdGlvbiBnZXRGaWx0ZXJzSW5mb0ZvclNWKG9Db250cm9sOiBDb250cm9sIHwgTURDQ2hhcnQgfCBNRENUYWJsZSwgc2VsZWN0aW9uVmFyaWFudFBhdGg6IHN0cmluZywgaXNDaGFydD86IGJvb2xlYW4pIHtcblx0Y29uc3Qgc0VudGl0eVR5cGVQYXRoID0gb0NvbnRyb2wuZGF0YShcImVudGl0eVR5cGVcIiksXG5cdFx0b01ldGFNb2RlbCA9IENvbW1vblV0aWxzLmdldEFwcENvbXBvbmVudChvQ29udHJvbCBhcyBDb250cm9sKS5nZXRNZXRhTW9kZWwoKSxcblx0XHRtUHJvcGVydHlGaWx0ZXJzOiBSZWNvcmQ8c3RyaW5nLCBGaWx0ZXJbXT4gPSB7fSxcblx0XHRhRmlsdGVycyA9IFtdLFxuXHRcdGFQYXRoczogc3RyaW5nW10gPSBbXTtcblx0bGV0IHNUZXh0ID0gXCJcIjtcblx0bGV0IG9TZWxlY3Rpb25WYXJpYW50ID0gb01ldGFNb2RlbC5nZXRPYmplY3QoYCR7c0VudGl0eVR5cGVQYXRofSR7c2VsZWN0aW9uVmFyaWFudFBhdGh9YCk7XG5cdC8vIGZvciBjaGFydCB0aGUgc3RydWN0dXJlIHZhcmllcyBoZW5jZSByZWFkIGl0IGZyb20gbWFpbiBvYmplY3Rcblx0aWYgKGlzQ2hhcnQpIHtcblx0XHRvU2VsZWN0aW9uVmFyaWFudCA9IG9TZWxlY3Rpb25WYXJpYW50LlNlbGVjdGlvblZhcmlhbnQ7XG5cdH1cblx0aWYgKG9TZWxlY3Rpb25WYXJpYW50KSB7XG5cdFx0c1RleHQgPSBvU2VsZWN0aW9uVmFyaWFudC5UZXh0O1xuXHRcdChvU2VsZWN0aW9uVmFyaWFudC5TZWxlY3RPcHRpb25zIHx8IFtdKVxuXHRcdFx0LmZpbHRlcihmdW5jdGlvbiAob1NlbGVjdE9wdGlvbjogSVNlbGVjdGlvbk9wdGlvbikge1xuXHRcdFx0XHRyZXR1cm4gb1NlbGVjdE9wdGlvbiAmJiBvU2VsZWN0T3B0aW9uLlByb3BlcnR5TmFtZSAmJiBvU2VsZWN0T3B0aW9uLlByb3BlcnR5TmFtZS4kUHJvcGVydHlQYXRoO1xuXHRcdFx0fSlcblx0XHRcdC5mb3JFYWNoKGZ1bmN0aW9uIChvU2VsZWN0T3B0aW9uOiBJU2VsZWN0aW9uT3B0aW9uKSB7XG5cdFx0XHRcdGNvbnN0IHNQYXRoID0gb1NlbGVjdE9wdGlvbi5Qcm9wZXJ0eU5hbWUuJFByb3BlcnR5UGF0aDtcblx0XHRcdFx0aWYgKCFhUGF0aHMuaW5jbHVkZXMoc1BhdGgpKSB7XG5cdFx0XHRcdFx0YVBhdGhzLnB1c2goc1BhdGgpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGZvciAoY29uc3QgaiBpbiBvU2VsZWN0T3B0aW9uLlJhbmdlcykge1xuXHRcdFx0XHRcdGNvbnN0IG9SYW5nZSA9IG9TZWxlY3RPcHRpb24uUmFuZ2VzW2pdO1xuXHRcdFx0XHRcdG1Qcm9wZXJ0eUZpbHRlcnNbc1BhdGhdID0gKG1Qcm9wZXJ0eUZpbHRlcnNbc1BhdGhdIHx8IFtdKS5jb25jYXQoXG5cdFx0XHRcdFx0XHRuZXcgRmlsdGVyKHNQYXRoLCBvUmFuZ2UuT3B0aW9uPy4kRW51bU1lbWJlcj8uc3BsaXQoXCIvXCIpLnBvcCgpIGFzIHVuZGVmaW5lZCwgb1JhbmdlLkxvdywgb1JhbmdlLkhpZ2gpXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cblx0XHRmb3IgKGNvbnN0IHNQcm9wZXJ0eVBhdGggaW4gbVByb3BlcnR5RmlsdGVycykge1xuXHRcdFx0YUZpbHRlcnMucHVzaChcblx0XHRcdFx0bmV3IEZpbHRlcih7XG5cdFx0XHRcdFx0ZmlsdGVyczogbVByb3BlcnR5RmlsdGVyc1tzUHJvcGVydHlQYXRoXSxcblx0XHRcdFx0XHRhbmQ6IGZhbHNlXG5cdFx0XHRcdH0pXG5cdFx0XHQpO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiB7XG5cdFx0cHJvcGVydGllczogYVBhdGhzLFxuXHRcdGZpbHRlcnM6IGFGaWx0ZXJzLFxuXHRcdHRleHQ6IHNUZXh0XG5cdH07XG59XG5cbmZ1bmN0aW9uIGdldENvbnZlcnRlckNvbnRleHRGb3JQYXRoKHNNZXRhUGF0aDogc3RyaW5nLCBvTWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbCwgc0VudGl0eVNldDogc3RyaW5nLCBvRGlhZ25vc3RpY3M6IERpYWdub3N0aWNzKSB7XG5cdGNvbnN0IG9Db250ZXh0ID0gb01ldGFNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChzTWV0YVBhdGgpIGFzIE9EYXRhVjRDb250ZXh0O1xuXHRyZXR1cm4gQ29udmVydGVyQ29udGV4dD8uY3JlYXRlQ29udmVydGVyQ29udGV4dEZvck1hY3JvKHNFbnRpdHlTZXQsIG9Db250ZXh0IHx8IG9NZXRhTW9kZWwsIG9EaWFnbm9zdGljcywgbWVyZ2VPYmplY3RzLCB1bmRlZmluZWQpO1xufVxuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhbiBJRCB3aGljaCBzaG91bGQgYmUgdXNlZCBpbiB0aGUgaW50ZXJuYWwgY2hhcnQgZm9yIHRoZSBtZWFzdXJlIG9yIGRpbWVuc2lvbi5cbiAqIEZvciBzdGFuZGFyZCBjYXNlcywgdGhpcyBpcyBqdXN0IHRoZSBJRCBvZiB0aGUgcHJvcGVydHkuXG4gKiBJZiBpdCBpcyBuZWNlc3NhcnkgdG8gdXNlIGFub3RoZXIgSUQgaW50ZXJuYWxseSBpbnNpZGUgdGhlIGNoYXJ0IChlLmcuIG9uIGR1cGxpY2F0ZSBwcm9wZXJ0eSBJRHMpIHRoaXMgbWV0aG9kIGNhbiBiZSBvdmVyd3JpdHRlbi5cbiAqIEluIHRoaXMgY2FzZSwgPGNvZGU+Z2V0UHJvcGVydHlGcm9tTmFtZUFuZEtpbmQ8L2NvZGU+IG5lZWRzIHRvIGJlIG92ZXJ3cml0dGVuIGFzIHdlbGwuXG4gKlxuICogQHBhcmFtIG5hbWUgSUQgb2YgdGhlIHByb3BlcnR5XG4gKiBAcGFyYW0ga2luZCBUeXBlIG9mIHRoZSBwcm9wZXJ0eSAobWVhc3VyZSBvciBkaW1lbnNpb24pXG4gKiBAcmV0dXJucyBJbnRlcm5hbCBJRCBmb3IgdGhlIHNhcC5jaGFydC5DaGFydFxuICogQHByaXZhdGVcbiAqIEB1aTUtcmVzdHJpY3RlZFxuICovXG5mdW5jdGlvbiBnZXRJbnRlcm5hbENoYXJ0TmFtZUZyb21Qcm9wZXJ0eU5hbWVBbmRLaW5kKG5hbWU6IHN0cmluZywga2luZDogc3RyaW5nKSB7XG5cdHJldHVybiBuYW1lLnJlcGxhY2UoXCJfZmVfXCIgKyBraW5kICsgXCJfXCIsIFwiXCIpO1xufVxuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhbiBhcnJheSBvZiBjaGFydCBwcm9wZXJ0aWVzIGJ5IHJlbXZvaW5nIF9mZV9ncm91cGFibGUgcHJlZml4LlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IGFGaWx0ZXJzIENoYXJ0IGZpbHRlciBwcm9wZXJ0aWVzXG4gKiBAcmV0dXJucyBDaGFydCBwcm9wZXJ0aWVzIHdpdGhvdXQgcHJlZml4ZXNcbiAqIEBwcml2YXRlXG4gKiBAdWk1LXJlc3RyaWN0ZWRcbiAqL1xuaW50ZXJmYWNlIElGaWx0ZXJQcm9wIHtcblx0c1BhdGg6IHN0cmluZztcbn1cbmZ1bmN0aW9uIGdldENoYXJ0UHJvcGVydGllc1dpdGhvdXRQcmVmaXhlcyhhRmlsdGVyczogSUZpbHRlclByb3BbXSkge1xuXHRhRmlsdGVycy5mb3JFYWNoKChlbGVtZW50OiBJRmlsdGVyUHJvcCkgPT4ge1xuXHRcdGlmIChlbGVtZW50LnNQYXRoICYmIGVsZW1lbnQuc1BhdGguaW5jbHVkZXMoXCJmZV9ncm91cGFibGVcIikpIHtcblx0XHRcdGVsZW1lbnQuc1BhdGggPSBDb21tb25VdGlscy5nZXRJbnRlcm5hbENoYXJ0TmFtZUZyb21Qcm9wZXJ0eU5hbWVBbmRLaW5kKGVsZW1lbnQuc1BhdGgsIFwiZ3JvdXBhYmxlXCIpO1xuXHRcdH1cblx0fSk7XG5cdHJldHVybiBhRmlsdGVycztcbn1cblxuY29uc3QgQ29tbW9uVXRpbHMgPSB7XG5cdGlzRmllbGRDb250cm9sUGF0aEluYXBwbGljYWJsZTogaXNGaWVsZENvbnRyb2xQYXRoSW5hcHBsaWNhYmxlLFxuXHRyZW1vdmVTZW5zaXRpdmVEYXRhOiByZW1vdmVTZW5zaXRpdmVEYXRhLFxuXHRmaXJlQnV0dG9uUHJlc3M6IGZuRmlyZUJ1dHRvblByZXNzLFxuXHRnZXRUYXJnZXRWaWV3OiBnZXRUYXJnZXRWaWV3LFxuXHRnZXRDdXJyZW50UGFnZVZpZXc6IGdldEN1cnJlbnRQYWdlVmlldyxcblx0aGFzVHJhbnNpZW50Q29udGV4dDogZm5IYXNUcmFuc2llbnRDb250ZXh0cyxcblx0dXBkYXRlUmVsYXRlZEFwcHNEZXRhaWxzOiBmblVwZGF0ZVJlbGF0ZWRBcHBzRGV0YWlscyxcblx0cmVzb2x2ZVN0cmluZ3RvQm9vbGVhbjogZm5SZXNvbHZlU3RyaW5ndG9Cb29sZWFuLFxuXHRnZXRBcHBDb21wb25lbnQ6IGdldEFwcENvbXBvbmVudCxcblx0Z2V0TWFuZGF0b3J5RmlsdGVyRmllbGRzOiBmbkdldE1hbmRhdG9yeUZpbHRlckZpZWxkcyxcblx0Z2V0Q29udGV4dFBhdGhQcm9wZXJ0aWVzOiBmbkdldENvbnRleHRQYXRoUHJvcGVydGllcyxcblx0Z2V0UGFyYW1ldGVySW5mbzogZ2V0UGFyYW1ldGVySW5mbyxcblx0dXBkYXRlRGF0YUZpZWxkRm9ySUJOQnV0dG9uc1Zpc2liaWxpdHk6IGZuVXBkYXRlRGF0YUZpZWxkRm9ySUJOQnV0dG9uc1Zpc2liaWxpdHksXG5cdGdldEVudGl0eVNldE5hbWU6IGdldEVudGl0eVNldE5hbWUsXG5cdGdldEFjdGlvblBhdGg6IGdldEFjdGlvblBhdGgsXG5cdGNvbXB1dGVEaXNwbGF5TW9kZTogY29tcHV0ZURpc3BsYXlNb2RlLFxuXHRpc1N0aWNreUVkaXRNb2RlOiBpc1N0aWNreUVkaXRNb2RlLFxuXHRnZXRPcGVyYXRvcnNGb3JQcm9wZXJ0eTogZ2V0T3BlcmF0b3JzRm9yUHJvcGVydHksXG5cdGdldE9wZXJhdG9yc0ZvckRhdGVQcm9wZXJ0eTogZ2V0T3BlcmF0b3JzRm9yRGF0ZVByb3BlcnR5LFxuXHRnZXRPcGVyYXRvcnNGb3JHdWlkUHJvcGVydHk6IGdldE9wZXJhdG9yc0Zvckd1aWRQcm9wZXJ0eSxcblx0YWRkU2VsZWN0aW9uVmFyaWFudFRvQ29uZGl0aW9uczogYWRkU2VsZWN0aW9uVmFyaWFudFRvQ29uZGl0aW9ucyxcblx0YWRkRXh0ZXJuYWxTdGF0ZUZpbHRlcnNUb1NlbGVjdGlvblZhcmlhbnQ6IGFkZEV4dGVybmFsU3RhdGVGaWx0ZXJzVG9TZWxlY3Rpb25WYXJpYW50LFxuXHRhZGRQYWdlQ29udGV4dFRvU2VsZWN0aW9uVmFyaWFudDogYWRkUGFnZUNvbnRleHRUb1NlbGVjdGlvblZhcmlhbnQsXG5cdGFkZERlZmF1bHREaXNwbGF5Q3VycmVuY3k6IGFkZERlZmF1bHREaXNwbGF5Q3VycmVuY3ksXG5cdHNldFVzZXJEZWZhdWx0czogc2V0VXNlckRlZmF1bHRzLFxuXHRnZXRTaGVsbFNlcnZpY2VzOiBnZXRTaGVsbFNlcnZpY2VzLFxuXHRnZXRIYXNoOiBnZXRIYXNoLFxuXHRnZXRJQk5BY3Rpb25zOiBmbkdldElCTkFjdGlvbnMsXG5cdGdldEhlYWRlckZhY2V0SXRlbUNvbmZpZ0ZvckV4dGVybmFsTmF2aWdhdGlvbjogZ2V0SGVhZGVyRmFjZXRJdGVtQ29uZmlnRm9yRXh0ZXJuYWxOYXZpZ2F0aW9uLFxuXHRnZXRTZW1hbnRpY09iamVjdE1hcHBpbmc6IGdldFNlbWFudGljT2JqZWN0TWFwcGluZyxcblx0c2V0U2VtYW50aWNPYmplY3RNYXBwaW5nczogc2V0U2VtYW50aWNPYmplY3RNYXBwaW5ncyxcblx0Z2V0U2VtYW50aWNPYmplY3RQcm9taXNlOiBmbkdldFNlbWFudGljT2JqZWN0UHJvbWlzZSxcblx0Z2V0U2VtYW50aWNUYXJnZXRzRnJvbVBhZ2VNb2RlbDogZm5HZXRTZW1hbnRpY1RhcmdldHNGcm9tUGFnZU1vZGVsLFxuXHRnZXRTZW1hbnRpY09iamVjdHNGcm9tUGF0aDogZm5HZXRTZW1hbnRpY09iamVjdHNGcm9tUGF0aCxcblx0dXBkYXRlU2VtYW50aWNUYXJnZXRzOiBmblVwZGF0ZVNlbWFudGljVGFyZ2V0c01vZGVsLFxuXHR3YWl0Rm9yQ29udGV4dFJlcXVlc3RlZDogd2FpdEZvckNvbnRleHRSZXF1ZXN0ZWQsXG5cdGdldEZpbHRlclJlc3RyaWN0aW9uc0J5UGF0aDogZ2V0RmlsdGVyUmVzdHJpY3Rpb25zQnlQYXRoLFxuXHRnZXRTcGVjaWZpY0FsbG93ZWRFeHByZXNzaW9uOiBnZXRTcGVjaWZpY0FsbG93ZWRFeHByZXNzaW9uLFxuXHRnZXRBZGRpdGlvbmFsUGFyYW1zRm9yQ3JlYXRlOiBnZXRBZGRpdGlvbmFsUGFyYW1zRm9yQ3JlYXRlLFxuXHRyZXF1ZXN0U2luZ2xldG9uUHJvcGVydHk6IHJlcXVlc3RTaW5nbGV0b25Qcm9wZXJ0eSxcblx0dGVtcGxhdGVDb250cm9sRnJhZ21lbnQ6IHRlbXBsYXRlQ29udHJvbEZyYWdtZW50LFxuXHRhZGRFdmVudFRvQmluZGluZ0luZm86IGFkZEV2ZW50VG9CaW5kaW5nSW5mbyxcblx0RmlsdGVyUmVzdHJpY3Rpb25zOiB7XG5cdFx0UkVRVUlSRURfUFJPUEVSVElFUzogXCJSZXF1aXJlZFByb3BlcnRpZXNcIixcblx0XHROT05fRklMVEVSQUJMRV9QUk9QRVJUSUVTOiBcIk5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzXCIsXG5cdFx0QUxMT1dFRF9FWFBSRVNTSU9OUzogXCJGaWx0ZXJBbGxvd2VkRXhwcmVzc2lvbnNcIlxuXHR9LFxuXHRBbGxvd2VkRXhwcmVzc2lvbnNQcmlvOiBbXCJTaW5nbGVWYWx1ZVwiLCBcIk11bHRpVmFsdWVcIiwgXCJTaW5nbGVSYW5nZVwiLCBcIk11bHRpUmFuZ2VcIiwgXCJTZWFyY2hFeHByZXNzaW9uXCIsIFwiTXVsdGlSYW5nZU9yU2VhcmNoRXhwcmVzc2lvblwiXSxcblx0bm9ybWFsaXplU2VhcmNoVGVybTogbm9ybWFsaXplU2VhcmNoVGVybSxcblx0Z2V0U2luZ2xldG9uUGF0aDogZ2V0U2luZ2xldG9uUGF0aCxcblx0c2V0Q29udGV4dHNCYXNlZE9uT3BlcmF0aW9uQXZhaWxhYmxlOiBzZXRDb250ZXh0c0Jhc2VkT25PcGVyYXRpb25BdmFpbGFibGUsXG5cdHNldER5bmFtaWNBY3Rpb25Db250ZXh0czogc2V0RHluYW1pY0FjdGlvbkNvbnRleHRzLFxuXHRyZXF1ZXN0UHJvcGVydHk6IHJlcXVlc3RQcm9wZXJ0eSxcblx0Z2V0UGFyYW1ldGVyUGF0aDogZ2V0UGFyYW1ldGVyUGF0aCxcblx0Z2V0UmVsYXRlZEFwcHNNZW51SXRlbXM6IF9nZXRSZWxhdGVkQXBwc01lbnVJdGVtcyxcblx0Z2V0VHJhbnNsYXRlZFRleHRGcm9tRXhwQmluZGluZ1N0cmluZzogX2ZudHJhbnNsYXRlZFRleHRGcm9tRXhwQmluZGluZ1N0cmluZyxcblx0YWRkU2VtYW50aWNEYXRlc1RvQ29uZGl0aW9uczogYWRkU2VtYW50aWNEYXRlc1RvQ29uZGl0aW9ucyxcblx0YWRkU2VsZWN0T3B0aW9uVG9Db25kaXRpb25zOiBhZGRTZWxlY3RPcHRpb25Ub0NvbmRpdGlvbnMsXG5cdGNyZWF0ZVNlbWFudGljRGF0ZXNGcm9tQ29uZGl0aW9uczogY3JlYXRlU2VtYW50aWNEYXRlc0Zyb21Db25kaXRpb25zLFxuXHR1cGRhdGVSZWxhdGVBcHBzTW9kZWw6IHVwZGF0ZVJlbGF0ZUFwcHNNb2RlbCxcblx0Z2V0U2VtYW50aWNPYmplY3RBbm5vdGF0aW9uczogX2dldFNlbWFudGljT2JqZWN0QW5ub3RhdGlvbnMsXG5cdGdldEZpbHRlcnNJbmZvRm9yU1Y6IGdldEZpbHRlcnNJbmZvRm9yU1YsXG5cdGdldEludGVybmFsQ2hhcnROYW1lRnJvbVByb3BlcnR5TmFtZUFuZEtpbmQ6IGdldEludGVybmFsQ2hhcnROYW1lRnJvbVByb3BlcnR5TmFtZUFuZEtpbmQsXG5cdGdldENoYXJ0UHJvcGVydGllc1dpdGhvdXRQcmVmaXhlczogZ2V0Q2hhcnRQcm9wZXJ0aWVzV2l0aG91dFByZWZpeGVzLFxuXHRpc1NtYWxsRGV2aWNlLFxuXHRnZXRDb252ZXJ0ZXJDb250ZXh0Rm9yUGF0aFxufTtcblxuZXhwb3J0IGRlZmF1bHQgQ29tbW9uVXRpbHM7XG4iXSwibWFwcGluZ3MiOiI7QUFBQTtBQUFBO0FBQUE7Ozs7Ozs7Ozs7RUFnRkEsU0FBU0EsbUJBQW1CLENBQUNDLFdBQW1CLEVBQUU7SUFDakQsSUFBSSxDQUFDQSxXQUFXLEVBQUU7TUFDakIsT0FBT0MsU0FBUztJQUNqQjtJQUVBLE9BQU9ELFdBQVcsQ0FDaEJFLE9BQU8sQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQ2xCQSxPQUFPLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQUEsQ0FDdkJDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FDWkMsTUFBTSxDQUFDLFVBQVVDLFdBQStCLEVBQUVDLFlBQW9CLEVBQUU7TUFDeEUsSUFBSUEsWUFBWSxLQUFLLEVBQUUsRUFBRTtRQUN4QkQsV0FBVyxHQUFJLEdBQUVBLFdBQVcsR0FBSSxHQUFFQSxXQUFZLEdBQUUsR0FB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