@sapui5/sap.fe.core 1.102.2 → 1.104.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (324) hide show
  1. package/package.json +6 -6
  2. package/src/sap/fe/core/.library +1 -1
  3. package/src/sap/fe/core/AppComponent.js +73 -30
  4. package/src/sap/fe/core/AppComponent.ts +65 -43
  5. package/src/sap/fe/core/AppStateHandler.js +82 -70
  6. package/src/sap/fe/core/AppStateHandler.ts +32 -37
  7. package/src/sap/fe/core/BaseController.js +11 -9
  8. package/src/sap/fe/core/BaseController.ts +15 -13
  9. package/src/sap/fe/core/CommonUtils.js +227 -126
  10. package/src/sap/fe/core/CommonUtils.ts +240 -163
  11. package/src/sap/fe/core/ExtensionAPI.js +24 -27
  12. package/src/sap/fe/core/ExtensionAPI.ts +36 -38
  13. package/src/sap/fe/core/PageController.js +4 -4
  14. package/src/sap/fe/core/PageController.ts +4 -5
  15. package/src/sap/fe/core/TemplateComponent.js +1 -1
  16. package/src/sap/fe/core/TemplateComponent.ts +6 -6
  17. package/src/sap/fe/core/TemplateModel.js +1 -1
  18. package/src/sap/fe/core/TemplateModel.ts +1 -1
  19. package/src/sap/fe/core/buildingBlocks/AttributeModel.js +1 -1
  20. package/src/sap/fe/core/buildingBlocks/AttributeModel.ts +1 -1
  21. package/src/sap/fe/core/buildingBlocks/BuildingBlock.js +181 -43
  22. package/src/sap/fe/core/buildingBlocks/BuildingBlock.ts +150 -24
  23. package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.js +585 -210
  24. package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.ts +246 -96
  25. package/src/sap/fe/core/buildingBlocks/TraceInfo.js +30 -30
  26. package/src/sap/fe/core/buildingBlocks/TraceInfo.ts +32 -29
  27. package/src/sap/fe/core/controllerextensions/EditFlow.js +379 -330
  28. package/src/sap/fe/core/controllerextensions/EditFlow.ts +253 -245
  29. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +9 -9
  30. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +10 -10
  31. package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +101 -74
  32. package/src/sap/fe/core/controllerextensions/InternalEditFlow.ts +69 -79
  33. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +67 -67
  34. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +76 -76
  35. package/src/sap/fe/core/controllerextensions/InternalRouting.js +85 -77
  36. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +103 -99
  37. package/src/sap/fe/core/controllerextensions/KPIManagement.js +66 -68
  38. package/src/sap/fe/core/controllerextensions/KPIManagement.ts +106 -123
  39. package/src/sap/fe/core/controllerextensions/MassEdit.js +9 -9
  40. package/src/sap/fe/core/controllerextensions/MassEdit.ts +20 -27
  41. package/src/sap/fe/core/controllerextensions/MessageHandler.js +20 -12
  42. package/src/sap/fe/core/controllerextensions/MessageHandler.ts +21 -14
  43. package/src/sap/fe/core/controllerextensions/PageReady.js +97 -25
  44. package/src/sap/fe/core/controllerextensions/PageReady.ts +98 -34
  45. package/src/sap/fe/core/controllerextensions/Paginator.js +21 -22
  46. package/src/sap/fe/core/controllerextensions/Paginator.ts +24 -25
  47. package/src/sap/fe/core/controllerextensions/Placeholder.js +4 -6
  48. package/src/sap/fe/core/controllerextensions/Placeholder.ts +12 -14
  49. package/src/sap/fe/core/controllerextensions/Routing.js +10 -11
  50. package/src/sap/fe/core/controllerextensions/Routing.ts +12 -13
  51. package/src/sap/fe/core/controllerextensions/Share.js +170 -139
  52. package/src/sap/fe/core/controllerextensions/Share.ts +117 -118
  53. package/src/sap/fe/core/controllerextensions/SideEffects.js +46 -50
  54. package/src/sap/fe/core/controllerextensions/SideEffects.ts +56 -60
  55. package/src/sap/fe/core/controllerextensions/ViewState.js +200 -131
  56. package/src/sap/fe/core/controllerextensions/ViewState.ts +141 -148
  57. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js +5 -5
  58. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.ts +8 -7
  59. package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.js +11 -10
  60. package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.ts +17 -20
  61. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +2 -2
  62. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.ts +4 -4
  63. package/src/sap/fe/core/controllerextensions/collaboration/Manage.js +7 -9
  64. package/src/sap/fe/core/controllerextensions/collaboration/Manage.ts +18 -19
  65. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +190 -141
  66. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +258 -210
  67. package/src/sap/fe/core/controllerextensions/editFlow/draft.js +183 -125
  68. package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +213 -156
  69. package/src/sap/fe/core/controllerextensions/editFlow/operations.js +164 -140
  70. package/src/sap/fe/core/controllerextensions/editFlow/operations.ts +180 -150
  71. package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +24 -26
  72. package/src/sap/fe/core/controllerextensions/editFlow/sticky.ts +35 -33
  73. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +71 -41
  74. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +102 -82
  75. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +61 -71
  76. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.ts +56 -64
  77. package/src/sap/fe/core/controls/Any.js +9 -5
  78. package/src/sap/fe/core/controls/Any.ts +10 -4
  79. package/src/sap/fe/core/controls/CommandExecution.js +11 -25
  80. package/src/sap/fe/core/controls/CommandExecution.ts +11 -25
  81. package/src/sap/fe/core/controls/ConditionalWrapper.js +2 -2
  82. package/src/sap/fe/core/controls/ConditionalWrapper.ts +3 -3
  83. package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.js +22 -22
  84. package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.ts +25 -24
  85. package/src/sap/fe/core/controls/CustomQuickViewPage.js +2 -2
  86. package/src/sap/fe/core/controls/CustomQuickViewPage.ts +2 -2
  87. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +3 -3
  88. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.ts +5 -5
  89. package/src/sap/fe/core/controls/FieldWrapper.js +2 -2
  90. package/src/sap/fe/core/controls/FieldWrapper.ts +3 -3
  91. package/src/sap/fe/core/controls/FileWrapper.js +7 -2
  92. package/src/sap/fe/core/controls/FileWrapper.ts +15 -11
  93. package/src/sap/fe/core/controls/FilterBar.js +6 -2
  94. package/src/sap/fe/core/controls/FilterBar.ts +13 -9
  95. package/src/sap/fe/core/controls/FormElementWrapper.js +1 -1
  96. package/src/sap/fe/core/controls/FormElementWrapper.ts +2 -2
  97. package/src/sap/fe/core/controls/MassEditSelect.js +1 -1
  98. package/src/sap/fe/core/controls/MassEditSelect.ts +0 -4
  99. package/src/sap/fe/core/controls/NonComputedVisibleKeyFieldsDialog.fragment.xml +3 -3
  100. package/src/sap/fe/core/controls/filterbar/VisualFilter.js +16 -12
  101. package/src/sap/fe/core/controls/filterbar/VisualFilter.ts +20 -22
  102. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +3 -3
  103. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.ts +8 -8
  104. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +49 -49
  105. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +54 -54
  106. package/src/sap/fe/core/controls/massEdit/MassEditDialog.fragment.xml +8 -2
  107. package/src/sap/fe/core/controls/massEdit/MassEditField.fragment.xml +22 -35
  108. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +89 -88
  109. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.ts +107 -106
  110. package/src/sap/fe/core/converters/ConverterContext.js +26 -33
  111. package/src/sap/fe/core/converters/ConverterContext.ts +52 -61
  112. package/src/sap/fe/core/converters/ManifestSettings.js +1 -1
  113. package/src/sap/fe/core/converters/ManifestSettings.ts +17 -15
  114. package/src/sap/fe/core/converters/ManifestWrapper.js +59 -45
  115. package/src/sap/fe/core/converters/ManifestWrapper.ts +55 -45
  116. package/src/sap/fe/core/converters/MetaModelConverter.js +64 -35
  117. package/src/sap/fe/core/converters/MetaModelConverter.ts +154 -129
  118. package/src/sap/fe/core/converters/TemplateConverter.js +21 -20
  119. package/src/sap/fe/core/converters/TemplateConverter.ts +27 -24
  120. package/src/sap/fe/core/converters/annotations/DataField.js +58 -35
  121. package/src/sap/fe/core/converters/annotations/DataField.ts +102 -76
  122. package/src/sap/fe/core/converters/common/AnnotationConverter.js +1911 -1495
  123. package/src/sap/fe/core/converters/controls/Common/Action.js +50 -41
  124. package/src/sap/fe/core/converters/controls/Common/Action.ts +56 -46
  125. package/src/sap/fe/core/converters/controls/Common/Chart.js +14 -14
  126. package/src/sap/fe/core/converters/controls/Common/Chart.ts +26 -33
  127. package/src/sap/fe/core/converters/controls/Common/Criticality.js +3 -3
  128. package/src/sap/fe/core/converters/controls/Common/Criticality.ts +4 -4
  129. package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +30 -28
  130. package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +60 -61
  131. package/src/sap/fe/core/converters/controls/Common/Form.js +27 -28
  132. package/src/sap/fe/core/converters/controls/Common/Form.ts +44 -57
  133. package/src/sap/fe/core/converters/controls/Common/KPI.js +11 -11
  134. package/src/sap/fe/core/converters/controls/Common/KPI.ts +49 -52
  135. package/src/sap/fe/core/converters/controls/Common/Table.js +181 -197
  136. package/src/sap/fe/core/converters/controls/Common/Table.ts +251 -280
  137. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +119 -119
  138. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +144 -141
  139. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +45 -41
  140. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +65 -59
  141. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +28 -26
  142. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +46 -43
  143. package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.js +9 -9
  144. package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.ts +14 -13
  145. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +67 -64
  146. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.ts +69 -66
  147. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +77 -73
  148. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +101 -97
  149. package/src/sap/fe/core/converters/helpers/Aggregation.js +2 -4
  150. package/src/sap/fe/core/converters/helpers/Aggregation.ts +12 -15
  151. package/src/sap/fe/core/converters/helpers/BindingHelper.js +31 -31
  152. package/src/sap/fe/core/converters/helpers/BindingHelper.ts +30 -29
  153. package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +4 -4
  154. package/src/sap/fe/core/converters/helpers/ConfigurableObject.ts +9 -9
  155. package/src/sap/fe/core/converters/helpers/ID.js +48 -46
  156. package/src/sap/fe/core/converters/helpers/ID.ts +26 -25
  157. package/src/sap/fe/core/converters/helpers/Key.js +7 -7
  158. package/src/sap/fe/core/converters/helpers/Key.ts +7 -7
  159. package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.js +1 -1
  160. package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.ts +4 -5
  161. package/src/sap/fe/core/converters/objectPage/FormMenuActions.js +6 -6
  162. package/src/sap/fe/core/converters/objectPage/FormMenuActions.ts +10 -10
  163. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +46 -62
  164. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +54 -82
  165. package/src/sap/fe/core/converters/templates/ListReportConverter.js +55 -42
  166. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +81 -66
  167. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +39 -38
  168. package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +52 -61
  169. package/src/sap/fe/core/designtime/AppComponent.designtime.js +4 -4
  170. package/src/sap/fe/core/designtime/AppComponent.designtime.ts +4 -4
  171. package/src/sap/fe/core/formatters/CollaborationFormatter.js +2 -2
  172. package/src/sap/fe/core/formatters/CollaborationFormatter.ts +3 -3
  173. package/src/sap/fe/core/formatters/FPMFormatter.js +5 -5
  174. package/src/sap/fe/core/formatters/FPMFormatter.ts +10 -10
  175. package/src/sap/fe/core/formatters/KPIFormatter.js +7 -7
  176. package/src/sap/fe/core/formatters/KPIFormatter.ts +10 -10
  177. package/src/sap/fe/core/formatters/StandardFormatter.js +96 -0
  178. package/src/sap/fe/core/formatters/StandardFormatter.ts +70 -0
  179. package/src/sap/fe/core/formatters/TableFormatter.js +11 -11
  180. package/src/sap/fe/core/formatters/TableFormatter.ts +12 -12
  181. package/src/sap/fe/core/formatters/ValueFormatter.js +8 -8
  182. package/src/sap/fe/core/formatters/ValueFormatter.ts +9 -9
  183. package/src/sap/fe/core/helpers/AppStartupHelper.js +15 -15
  184. package/src/sap/fe/core/helpers/AppStartupHelper.ts +37 -40
  185. package/src/sap/fe/core/helpers/BindingToolkit.js +1832 -0
  186. package/src/sap/fe/core/helpers/{BindingExpression.ts → BindingToolkit.ts} +396 -269
  187. package/src/sap/fe/core/helpers/ClassSupport.js +49 -12
  188. package/src/sap/fe/core/helpers/ClassSupport.ts +37 -10
  189. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +2 -2
  190. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.ts +1 -1
  191. package/src/sap/fe/core/helpers/EditState.js +1 -6
  192. package/src/sap/fe/core/helpers/EditState.ts +5 -10
  193. package/src/sap/fe/core/helpers/ExcelFormatHelper.js +2 -2
  194. package/src/sap/fe/core/helpers/ExcelFormatHelper.ts +4 -4
  195. package/src/sap/fe/core/helpers/FPMHelper.js +1 -1
  196. package/src/sap/fe/core/helpers/FPMHelper.ts +2 -2
  197. package/src/sap/fe/core/helpers/KeepAliveHelper.js +31 -31
  198. package/src/sap/fe/core/helpers/KeepAliveHelper.ts +52 -56
  199. package/src/sap/fe/core/helpers/MassEditHelper.js +306 -280
  200. package/src/sap/fe/core/helpers/MassEditHelper.ts +380 -360
  201. package/src/sap/fe/core/helpers/MessageStrip.js +81 -0
  202. package/src/sap/fe/core/helpers/MessageStrip.ts +79 -0
  203. package/src/sap/fe/core/helpers/ModelHelper.js +25 -25
  204. package/src/sap/fe/core/helpers/ModelHelper.ts +34 -32
  205. package/src/sap/fe/core/helpers/PasteHelper.js +3 -10
  206. package/src/sap/fe/core/helpers/PasteHelper.ts +20 -25
  207. package/src/sap/fe/core/helpers/SemanticDateOperators.js +1 -1
  208. package/src/sap/fe/core/helpers/SemanticDateOperators.ts +11 -11
  209. package/src/sap/fe/core/helpers/SemanticKeyHelper.js +3 -3
  210. package/src/sap/fe/core/helpers/SemanticKeyHelper.ts +8 -8
  211. package/src/sap/fe/core/helpers/StableIdHelper.js +12 -12
  212. package/src/sap/fe/core/helpers/StableIdHelper.ts +12 -12
  213. package/src/sap/fe/core/helpers/ToES6Promise.js +32 -0
  214. package/src/sap/fe/core/helpers/ToES6Promise.ts +19 -0
  215. package/src/sap/fe/core/jsx-runtime/Fragment.js +16 -0
  216. package/src/sap/fe/core/jsx-runtime/Fragment.ts +3 -0
  217. package/src/sap/fe/core/jsx-runtime/jsx-control.js +99 -0
  218. package/src/sap/fe/core/jsx-runtime/jsx-control.ts +82 -0
  219. package/src/sap/fe/core/jsx-runtime/jsx-xml.js +105 -0
  220. package/src/sap/fe/core/jsx-runtime/jsx-xml.ts +89 -0
  221. package/src/sap/fe/core/jsx-runtime/jsx.js +12 -90
  222. package/src/sap/fe/core/jsx-runtime/jsx.ts +24 -85
  223. package/src/sap/fe/core/library.js +42 -3
  224. package/src/sap/fe/core/library.ts +38 -0
  225. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +3 -3
  226. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +2 -2
  227. package/src/sap/fe/core/messagebundle.properties +39 -63
  228. package/src/sap/fe/core/messagebundle_ar.properties +25 -39
  229. package/src/sap/fe/core/messagebundle_bg.properties +25 -39
  230. package/src/sap/fe/core/messagebundle_ca.properties +25 -39
  231. package/src/sap/fe/core/messagebundle_cs.properties +25 -39
  232. package/src/sap/fe/core/messagebundle_cy.properties +25 -39
  233. package/src/sap/fe/core/messagebundle_da.properties +25 -39
  234. package/src/sap/fe/core/messagebundle_de.properties +25 -39
  235. package/src/sap/fe/core/messagebundle_el.properties +26 -40
  236. package/src/sap/fe/core/messagebundle_en.properties +25 -39
  237. package/src/sap/fe/core/messagebundle_en_GB.properties +25 -39
  238. package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +25 -39
  239. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +25 -39
  240. package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +26 -18
  241. package/src/sap/fe/core/messagebundle_es.properties +27 -41
  242. package/src/sap/fe/core/messagebundle_es_MX.properties +25 -39
  243. package/src/sap/fe/core/messagebundle_et.properties +25 -39
  244. package/src/sap/fe/core/messagebundle_fi.properties +25 -39
  245. package/src/sap/fe/core/messagebundle_fr.properties +26 -40
  246. package/src/sap/fe/core/messagebundle_fr_CA.properties +25 -39
  247. package/src/sap/fe/core/messagebundle_hi.properties +25 -39
  248. package/src/sap/fe/core/messagebundle_hr.properties +25 -39
  249. package/src/sap/fe/core/messagebundle_hu.properties +25 -39
  250. package/src/sap/fe/core/messagebundle_id.properties +25 -39
  251. package/src/sap/fe/core/messagebundle_it.properties +41 -55
  252. package/src/sap/fe/core/messagebundle_iw.properties +25 -39
  253. package/src/sap/fe/core/messagebundle_ja.properties +25 -39
  254. package/src/sap/fe/core/messagebundle_kk.properties +25 -39
  255. package/src/sap/fe/core/messagebundle_ko.properties +30 -44
  256. package/src/sap/fe/core/messagebundle_lt.properties +25 -39
  257. package/src/sap/fe/core/messagebundle_lv.properties +25 -39
  258. package/src/sap/fe/core/messagebundle_ms.properties +25 -39
  259. package/src/sap/fe/core/messagebundle_nl.properties +27 -41
  260. package/src/sap/fe/core/messagebundle_no.properties +25 -39
  261. package/src/sap/fe/core/messagebundle_pl.properties +26 -40
  262. package/src/sap/fe/core/messagebundle_pt.properties +26 -40
  263. package/src/sap/fe/core/messagebundle_pt_PT.properties +25 -39
  264. package/src/sap/fe/core/messagebundle_ro.properties +25 -39
  265. package/src/sap/fe/core/messagebundle_ru.properties +25 -39
  266. package/src/sap/fe/core/messagebundle_sh.properties +25 -39
  267. package/src/sap/fe/core/messagebundle_sk.properties +25 -39
  268. package/src/sap/fe/core/messagebundle_sl.properties +25 -39
  269. package/src/sap/fe/core/messagebundle_sv.properties +25 -39
  270. package/src/sap/fe/core/messagebundle_th.properties +25 -39
  271. package/src/sap/fe/core/messagebundle_tr.properties +25 -39
  272. package/src/sap/fe/core/messagebundle_uk.properties +25 -39
  273. package/src/sap/fe/core/messagebundle_vi.properties +25 -39
  274. package/src/sap/fe/core/messagebundle_zh_CN.properties +25 -39
  275. package/src/sap/fe/core/messagebundle_zh_TW.properties +25 -39
  276. package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +2 -2
  277. package/src/sap/fe/core/services/AsyncComponentServiceFactory.ts +5 -5
  278. package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +97 -69
  279. package/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +68 -69
  280. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +1 -1
  281. package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +3 -2
  282. package/src/sap/fe/core/services/NavigationServiceFactory.js +61 -49
  283. package/src/sap/fe/core/services/NavigationServiceFactory.ts +63 -52
  284. package/src/sap/fe/core/services/ResourceModelServiceFactory.js +2 -2
  285. package/src/sap/fe/core/services/ResourceModelServiceFactory.ts +4 -4
  286. package/src/sap/fe/core/services/RoutingServiceFactory.js +55 -55
  287. package/src/sap/fe/core/services/RoutingServiceFactory.ts +67 -65
  288. package/src/sap/fe/core/services/ShellServicesFactory.js +92 -76
  289. package/src/sap/fe/core/services/ShellServicesFactory.ts +95 -82
  290. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +61 -61
  291. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +102 -92
  292. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +224 -198
  293. package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +138 -139
  294. package/src/sap/fe/core/support/CommonHelper.js +3 -2
  295. package/src/sap/fe/core/support/CommonHelper.ts +9 -13
  296. package/src/sap/fe/core/support/Diagnostics.js +1 -1
  297. package/src/sap/fe/core/support/Diagnostics.ts +5 -5
  298. package/src/sap/fe/core/templating/CommonFormatters.js +84 -0
  299. package/src/sap/fe/core/templating/CommonFormatters.ts +86 -0
  300. package/src/sap/fe/core/templating/CriticalityFormatters.js +31 -31
  301. package/src/sap/fe/core/templating/CriticalityFormatters.ts +42 -40
  302. package/src/sap/fe/core/templating/DataFieldFormatters.js +8 -8
  303. package/src/sap/fe/core/templating/DataFieldFormatters.ts +13 -10
  304. package/src/sap/fe/core/templating/DataModelPathHelper.js +16 -15
  305. package/src/sap/fe/core/templating/DataModelPathHelper.ts +42 -32
  306. package/src/sap/fe/core/templating/DisplayModeFormatter.js +1 -1
  307. package/src/sap/fe/core/templating/DisplayModeFormatter.ts +2 -3
  308. package/src/sap/fe/core/templating/EntitySetHelper.js +7 -7
  309. package/src/sap/fe/core/templating/EntitySetHelper.ts +6 -8
  310. package/src/sap/fe/core/templating/FieldControlHelper.js +35 -34
  311. package/src/sap/fe/core/templating/FieldControlHelper.ts +29 -46
  312. package/src/sap/fe/core/templating/FilterHelper.js +16 -15
  313. package/src/sap/fe/core/templating/FilterHelper.ts +18 -18
  314. package/src/sap/fe/core/templating/FilterTemplating.js +1 -1
  315. package/src/sap/fe/core/templating/FilterTemplating.ts +3 -3
  316. package/src/sap/fe/core/templating/PropertyFormatters.js +7 -7
  317. package/src/sap/fe/core/templating/PropertyFormatters.ts +21 -19
  318. package/src/sap/fe/core/templating/PropertyHelper.js +25 -25
  319. package/src/sap/fe/core/templating/PropertyHelper.ts +25 -26
  320. package/src/sap/fe/core/templating/UIFormatters.js +152 -95
  321. package/src/sap/fe/core/templating/UIFormatters.ts +202 -128
  322. package/src/sap/fe/core/type/Email.js +2 -2
  323. package/src/sap/fe/core/type/Email.ts +2 -2
  324. package/src/sap/fe/core/helpers/BindingExpression.js +0 -1732
@@ -7,6 +7,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
7
7
 
8
8
  var generate = StableIdHelper.generate;
9
9
 
10
+ // import type Context from "sap/ui/model/odata/v4/Context";
10
11
  var Constants = FELibrary.Constants,
11
12
  InvocationGrouping = FELibrary.InvocationGrouping;
12
13
  var Action = MessageBox.Action;
@@ -17,22 +18,22 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
17
18
  * @static
18
19
  * @name sap.fe.core.actions.operations.callBoundAction
19
20
  * @memberof sap.fe.core.actions.operations
20
- * @param {string} sActionName The name of the action to be called
21
- * @param {sap.ui.model.odata.v4.Context} contexts Either one context or an array with contexts for which the action is to be be called
22
- * @param {sap.ui.model.odata.v4.Model} oModel OData Model
23
- * @param {object} oAppComponent The AppComponent
24
- * @param {map} [mParameters] Optional, can contain the following attributes:
25
- * @param {map} [mParameters.actionParameters] A map of parameters to be sent for every action call
26
- * @param {map} [mParameters.mBindingParameters] A map of binding parameters that would be part of $select and $expand coming from side effects for bound actions
27
- * @param {Array} [mParameters.additionalSideEffect] Array of property paths to be requested in addition to actual target properties of the side effect
28
- * @param {boolean} [mParameters.showActionParameterDialog] If set and if parameters exist the user retrieves a dialog to fill in parameters, if actionParameters are passed they are shown to the user
29
- * @param {string} [mParameters.label] A human-readable label for the action
30
- * @param {string} [mParameters.invocationGrouping] Mode how actions are to be called: Changeset to put all action calls into one changeset, Isolated to put them into separate changesets, defaults to Isolated
31
- * @param {Function} [mParameters.onSubmitted] Function which is called once the actions are submitted with an array of promises
32
- * @param {map} [mParameters.defaultParameters] Can contain default parameters from FLP user defaults
33
- * @param {sap.ui.core.Element} [mParameters.parentControl] If specified the dialogs are added as dependent of the parent control
34
- * @param {boolean} [mParameters.bGetBoundContext] If specified the action promise returns the bound context
35
- * @returns {Promise} Promise resolves with an array of response objects (TODO: to be changed)
21
+ * @param sActionName The name of the action to be called
22
+ * @param contexts Either one context or an array with contexts for which the action is to be be called
23
+ * @param oModel OData Model
24
+ * @param oAppComponent The AppComponent
25
+ * @param [mParameters] Optional, can contain the following attributes:
26
+ * @param [mParameters.actionParameters] A map of parameters to be sent for every action call
27
+ * @param [mParameters.mBindingParameters] A map of binding parameters that would be part of $select and $expand coming from side effects for bound actions
28
+ * @param [mParameters.additionalSideEffect] Array of property paths to be requested in addition to actual target properties of the side effect
29
+ * @param [mParameters.showActionParameterDialog] If set and if parameters exist the user retrieves a dialog to fill in parameters, if actionParameters are passed they are shown to the user
30
+ * @param [mParameters.label] A human-readable label for the action
31
+ * @param [mParameters.invocationGrouping] Mode how actions are to be called: Changeset to put all action calls into one changeset, Isolated to put them into separate changesets, defaults to Isolated
32
+ * @param [mParameters.onSubmitted] Function which is called once the actions are submitted with an array of promises
33
+ * @param [mParameters.defaultParameters] Can contain default parameters from FLP user defaults
34
+ * @param [mParameters.parentControl] If specified the dialogs are added as dependent of the parent control
35
+ * @param [mParameters.bGetBoundContext] If specified the action promise returns the bound context
36
+ * @returns Promise resolves with an array of response objects (TODO: to be changed)
36
37
  * @private
37
38
  * @ui5-restricted
38
39
  */
@@ -52,8 +53,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
52
53
  }
53
54
 
54
55
  var oMetaModel = oModel.getMetaModel(),
55
- sActionPath = oMetaModel.getMetaPath(contexts[0].getPath()) + "/" + sActionName,
56
- oBoundAction = oMetaModel.createBindingContext(sActionPath + "/@$ui5.overload/0");
56
+ sActionPath = "".concat(oMetaModel.getMetaPath(contexts[0].getPath()), "/").concat(sActionName),
57
+ oBoundAction = oMetaModel.createBindingContext("".concat(sActionPath, "/@$ui5.overload/0"));
57
58
  mParameters.aContexts = contexts;
58
59
  mParameters.isCriticalAction = getIsActionCritical(oMetaModel, sActionPath, contexts, oBoundAction);
59
60
  return callAction(sActionName, oModel, oBoundAction, oAppComponent, mParameters);
@@ -65,16 +66,16 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
65
66
  * @static
66
67
  * @name sap.fe.core.actions.operations.callActionImport
67
68
  * @memberof sap.fe.core.actions.operations
68
- * @param {string} sActionName The name of the action import to be called
69
- * @param {sap.ui.model.odata.v4.ODataModel} oModel An instance of an OData v4 model
70
- * @param {object} oAppComponent The AppComponent
71
- * @param {map} [mParameters] Optional, can contain the following attributes:
72
- * @param {map} [mParameters.actionParameters] A map of parameters to be sent with the action import
73
- * @param {string} [mParameters.label] A human-readable label for the action
74
- * @param {boolean} [mParameters.showActionParameterDialog] If set and if parameters exist the user retrieves a dialog to fill in parameters, if actionParameters are passed they are shown to the user
75
- * @param {Function} [mParameters.onSubmitted] Function which is called once the actions are submitted with an array of promises
76
- * @param {map} [mParameters.defaultParameters] Can contain default parameters from FLP user defaults
77
- * @returns {Promise} Promise resolves with an array of response objects (TODO: to be changed)
69
+ * @param sActionName The name of the action import to be called
70
+ * @param oModel An instance of an OData v4 model
71
+ * @param oAppComponent The AppComponent
72
+ * @param [mParameters] Optional, can contain the following attributes:
73
+ * @param [mParameters.actionParameters] A map of parameters to be sent with the action import
74
+ * @param [mParameters.label] A human-readable label for the action
75
+ * @param [mParameters.showActionParameterDialog] If set and if parameters exist the user retrieves a dialog to fill in parameters, if actionParameters are passed they are shown to the user
76
+ * @param [mParameters.onSubmitted] Function which is called once the actions are submitted with an array of promises
77
+ * @param [mParameters.defaultParameters] Can contain default parameters from FLP user defaults
78
+ * @returns Promise resolves with an array of response objects (TODO: to be changed)
78
79
  * @private
79
80
  * @ui5-restricted
80
81
  */
@@ -86,9 +87,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
86
87
  }
87
88
 
88
89
  var oMetaModel = oModel.getMetaModel(),
89
- sActionPath = oModel.bindContext("/" + sActionName).getPath(),
90
- oActionImport = oMetaModel.createBindingContext("/" + oMetaModel.createBindingContext(sActionPath).getObject("$Action") + "/0");
91
- mParameters.isCriticalAction = getIsActionCritical(oMetaModel, sActionPath + "/@$ui5.overload");
90
+ sActionPath = oModel.bindContext("/".concat(sActionName)).getPath(),
91
+ oActionImport = oMetaModel.createBindingContext("/".concat(oMetaModel.createBindingContext(sActionPath).getObject("$Action"), "/0"));
92
+ mParameters.isCriticalAction = getIsActionCritical(oMetaModel, "".concat(sActionPath, "/@$ui5.overload"));
92
93
  return callAction(sActionName, oModel, oActionImport, oAppComponent, mParameters);
93
94
  }
94
95
 
@@ -98,7 +99,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
98
99
  }
99
100
 
100
101
  var oMetaModel = oModel.getMetaModel(),
101
- sFunctionPath = oMetaModel.getMetaPath(context.getPath()) + "/" + sFunctionName,
102
+ sFunctionPath = "".concat(oMetaModel.getMetaPath(context.getPath()), "/").concat(sFunctionName),
102
103
  oBoundFunction = oMetaModel.createBindingContext(sFunctionPath);
103
104
  return _executeFunction(sFunctionName, oModel, oBoundFunction, context);
104
105
  }
@@ -109,9 +110,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
109
110
  * @static
110
111
  * @name sap.fe.core.actions.operations.callFunctionImport
111
112
  * @memberof sap.fe.core.actions.operations
112
- * @param {string} sFunctionName The name of the function to be called
113
- * @param {sap.ui.model.odata.v4.ODataModel} oModel An instance of an OData v4 model
114
- * @returns {Promise} Promise resolves
113
+ * @param sFunctionName The name of the function to be called
114
+ * @param oModel An instance of an OData v4 model
115
+ * @returns Promise resolves
115
116
  * @private
116
117
  */
117
118
 
@@ -122,8 +123,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
122
123
  }
123
124
 
124
125
  var oMetaModel = oModel.getMetaModel(),
125
- sFunctionPath = oModel.bindContext("/" + sFunctionName).getPath(),
126
- oFunctionImport = oMetaModel.createBindingContext("/" + oMetaModel.createBindingContext(sFunctionPath).getObject("$Function") + "/0");
126
+ sFunctionPath = oModel.bindContext("/".concat(sFunctionName)).getPath(),
127
+ oFunctionImport = oMetaModel.createBindingContext("/".concat(oMetaModel.createBindingContext(sFunctionPath).getObject("$Function"), "/0"));
127
128
  return _executeFunction(sFunctionName, oModel, oFunctionImport);
128
129
  }
129
130
 
@@ -131,14 +132,14 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
131
132
  var sGroupId;
132
133
 
133
134
  if (!oFunction || !oFunction.getObject()) {
134
- return Promise.reject(new Error("Function " + sFunctionName + " not found"));
135
+ return Promise.reject(new Error("Function ".concat(sFunctionName, " not found")));
135
136
  }
136
137
 
137
138
  if (context) {
138
- oFunction = oModel.bindContext(sFunctionName + "(...)", context);
139
+ oFunction = oModel.bindContext("".concat(sFunctionName, "(...)"), context);
139
140
  sGroupId = "functionGroup";
140
141
  } else {
141
- oFunction = oModel.bindContext("/" + sFunctionName + "(...)");
142
+ oFunction = oModel.bindContext("/".concat(sFunctionName, "(...)"));
142
143
  sGroupId = "functionImport";
143
144
  }
144
145
 
@@ -169,16 +170,11 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
169
170
  var actionDefinition = oAction.getObject();
170
171
 
171
172
  if (!oAction || !oAction.getObject()) {
172
- return reject(new Error("Action " + sActionName + " not found"));
173
+ return reject(new Error("Action ".concat(sActionName, " not found")));
173
174
  }
174
175
 
175
- if (bShowActionParameterDialog || aActionParameters.length > 0) {
176
- aActionParameters = prepareActionParameters(oAction, aActionParameters);
177
-
178
- if (!aActionParameters || aActionParameters.length === 0) {
179
- bShowActionParameterDialog = false;
180
- }
181
- }
176
+ aActionParameters = getActionParameters(oAction);
177
+ bShowActionParameterDialog = _showActionParameterDialog(bShowActionParameterDialog, aActionParameters);
182
178
 
183
179
  if (bShowActionParameterDialog) {
184
180
  fnDialog = showActionParameterDialog;
@@ -201,7 +197,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
201
197
  if (mParameters.additionalSideEffect && mParameters.additionalSideEffect.pathExpressions) {
202
198
  oMetaModel = oModel.getMetaModel();
203
199
  sMetaPath = oMetaModel.getMetaPath(aContexts[0].getPath());
204
- sMessagesPath = oMetaModel.getObject(sMetaPath + "/@com.sap.vocabularies.Common.v1.Messages/$Path");
200
+ sMessagesPath = oMetaModel.getObject("".concat(sMetaPath, "/@com.sap.vocabularies.Common.v1.Messages/$Path"));
205
201
 
206
202
  if (sMessagesPath) {
207
203
  iMessageSideEffect = mParameters.additionalSideEffect.pathExpressions.findIndex(function (exp) {
@@ -217,8 +213,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
217
213
  // to add it at a later point of time we have to take care it's part of the $select of the POST, therefore moving it.
218
214
  mParameters.mBindingParameters = mParameters.mBindingParameters || {};
219
215
 
220
- if (oAction.getObject("$ReturnType/$Type/" + sMessagesPath) && (!mParameters.mBindingParameters.$select || mParameters.mBindingParameters.$select.split(",").indexOf(sMessagesPath) === -1)) {
221
- mParameters.mBindingParameters.$select = mParameters.mBindingParameters.$select ? mParameters.mBindingParameters.$select + "," + sMessagesPath : sMessagesPath; // Add side effects at entity level because $select stops these being returned by the action
216
+ if (oAction.getObject("$ReturnType/$Type/".concat(sMessagesPath)) && (!mParameters.mBindingParameters.$select || mParameters.mBindingParameters.$select.split(",").indexOf(sMessagesPath) === -1)) {
217
+ mParameters.mBindingParameters.$select = mParameters.mBindingParameters.$select ? "".concat(mParameters.mBindingParameters.$select, ",").concat(sMessagesPath) : sMessagesPath; // Add side effects at entity level because $select stops these being returned by the action
222
218
  // Only if no other side effects were added for Messages
223
219
 
224
220
  if (iMessageSideEffect === -1) {
@@ -283,7 +279,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
283
279
  return new Promise(function (resolve, reject) {
284
280
  var boundActionName = sActionName ? sActionName : null;
285
281
  boundActionName = boundActionName.indexOf(".") >= 0 ? boundActionName.split(".")[boundActionName.split(".").length - 1] : boundActionName;
286
- var suffixResourceKey = boundActionName && entitySetName ? entitySetName + "|" + boundActionName : "";
282
+ var suffixResourceKey = boundActionName && entitySetName ? "".concat(entitySetName, "|").concat(boundActionName) : "";
287
283
  var oResourceBundle = oParentControl.getController().oResourceBundle;
288
284
  var sConfirmationText = CommonUtils.getTranslatedText("C_OPERATIONS_ACTION_CONFIRM_MESSAGE", oResourceBundle, null, suffixResourceKey);
289
285
  MessageBox.confirm(sConfirmationText, {
@@ -341,31 +337,31 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
341
337
  });
342
338
  };
343
339
 
344
- var _validateMessages = function (aActionParameters, aFieldInvalid, bClearTarget) {
340
+ var _validateMessages = function (actionParameters, invalidFields, bClearTarget) {
345
341
  var oMessageManager = Core.getMessageManager();
346
342
  var aMessages = oMessageManager.getMessageModel().getData();
347
- aFieldInvalid = aFieldInvalid || [];
343
+ invalidFields = invalidFields || [];
348
344
 
349
345
  if (!aMessages.length) {
350
- aFieldInvalid = [];
346
+ invalidFields = [];
351
347
  }
352
348
 
353
- aActionParameters.forEach(function (oActionParameters) {
349
+ actionParameters.forEach(function (oActionParameters) {
354
350
  var sParameter = oActionParameters.$Name;
355
351
  aMessages.forEach(function (oMessage) {
356
352
  var sParam = sParameter.replace("-inner", "");
357
353
 
358
- if (oMessage.controlIds.length > 0 && (oMessage.getControlId().includes("APD_::" + sParameter) || oMessage.getControlId().includes("APD_::" + sParameter + "inner") && aFieldInvalid.indexOf("APD_::" + sParam) < 0)) {
354
+ if (oMessage.controlIds.length > 0 && (oMessage.getControlId().includes("APD_::".concat(sParameter)) || oMessage.getControlId().includes("APD_::".concat(sParameter, "inner")) && invalidFields.indexOf("APD_::".concat(sParam)) < 0)) {
359
355
  if (bClearTarget) {
360
356
  oMessageManager.removeMessages(oMessage);
361
357
  } else {
362
- aFieldInvalid.push("APD_::" + sParam);
358
+ invalidFields.push("APD_::".concat(sParam));
363
359
  }
364
360
  } // Handle messages related to input with invalid token
365
361
 
366
362
 
367
- if (oMessage.target.includes("APD_::" + sParameter)) {
368
- aFieldInvalid.push("APD_::" + sParam);
363
+ if (oMessage.target.includes("APD_::".concat(sParameter))) {
364
+ invalidFields.push("APD_::".concat(sParam));
369
365
  oMessage.target = bClearTarget ? "" : oMessage.target;
370
366
 
371
367
  if (bClearTarget) {
@@ -374,7 +370,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
374
370
  }
375
371
  });
376
372
  });
377
- return aFieldInvalid;
373
+ return invalidFields;
378
374
  };
379
375
 
380
376
  var oController = {
@@ -407,7 +403,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
407
403
  entitySet: entitySetContext.getModel(),
408
404
  metaModel: entitySetContext.getModel()
409
405
  }
410
- })).then(function (oFragment) {
406
+ })).then(function (createdFragment) {
411
407
  // TODO: move the dialog into the fragment and move the handlers to the oController
412
408
  var aContexts;
413
409
  var aFunctionParams = [];
@@ -415,7 +411,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
415
411
  return CommonUtils.setUserDefaults(oAppComponent, aActionParameters, oParameterModel, true).then(function () {
416
412
  // TODO: move the dialog into the fragment and move the handlers to the oController
417
413
  return Fragment.load({
418
- definition: oFragment,
414
+ definition: createdFragment,
419
415
  controller: oController
420
416
  }).then(function (oDialogContent) {
421
417
  var oResourceBundle = oParentControl.getController().oResourceBundle;
@@ -468,7 +464,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
468
464
 
469
465
  for (var _i in aActionParameters) {
470
466
  if (aActionParameters[_i].$isCollection) {
471
- var aMVFContent = oDialog.getModel("mvfview").getProperty("/" + aActionParameters[_i].$Name),
467
+ var aMVFContent = oDialog.getModel("mvfview").getProperty("/".concat(aActionParameters[_i].$Name)),
472
468
  aKeyValues = [];
473
469
 
474
470
  for (var j in aMVFContent) {
@@ -493,7 +489,17 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
493
489
  messages = messages.concat(messageHandling.getMessages(true, true));
494
490
 
495
491
  if (!mParameters.bGrouped && !(!mParameters.control.isA("sap.ui.mdc.Table") && aContexts.length === 1) && messages.length) {
496
- oDialog.close();
492
+ var errorTargetsInAPD = false;
493
+ messages.forEach(function (message) {
494
+ if (message.getTarget().indexOf(mParameters.actionName) !== -1 && message.getTarget().indexOf(mParameters.aActionParameters[0].$Name) !== -1 && errorTargetsInAPD === false) {
495
+ errorTargetsInAPD = true;
496
+ }
497
+ });
498
+
499
+ if (!errorTargetsInAPD) {
500
+ oDialog.close();
501
+ oDialog.destroy();
502
+ }
497
503
  }
498
504
 
499
505
  throw oError;
@@ -502,9 +508,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
502
508
  var oMessageManager = Core.getMessageManager();
503
509
  var messages = oMessageManager.getMessageModel().getData();
504
510
  var subtitleColumn = CommonUtils.getMessageColumn(mParameters.control);
505
- var errorContext = undefined;
506
- var errorTargetsInAPM = false;
507
- var bShowMessageBox = false;
511
+ var errorContext;
512
+ var errorTargetsInAPD = false;
508
513
  messages.forEach(function (message) {
509
514
  var messageTargets = message.getTargets();
510
515
 
@@ -515,11 +520,29 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
515
520
  message.additionalText = errorContext ? errorContext.getObject()[subtitleColumn] : undefined;
516
521
  }
517
522
 
518
- if (message.getTarget().indexOf(mParameters.actionName) !== -1 && message.getTarget().indexOf(mParameters.aActionParameters[0].$Name) !== -1 && errorTargetsInAPM === false) {
519
- errorTargetsInAPM = true;
523
+ if (message.getTarget().indexOf(mParameters.actionName) !== -1 && message.getTarget().indexOf(mParameters.aActionParameters[0].$Name) !== -1 && errorTargetsInAPD === false) {
524
+ errorTargetsInAPD = true;
520
525
  }
521
526
  });
522
527
 
528
+ if (oDialog.isOpen()) {
529
+ if (!mParameters.bGrouped) {
530
+ //isolated
531
+ if (aContexts.length > 1 || !errorTargetsInAPD) {
532
+ // does not matter if error is in APD or not, if there are multiple contexts selected or if the error is not the APD, we close it.
533
+ oDialog.close();
534
+ oDialog.destroy();
535
+ }
536
+ } else if (mParameters.bGrouped && !errorTargetsInAPD) {
537
+ //changeset
538
+ oDialog.close();
539
+ oDialog.destroy();
540
+ }
541
+ }
542
+
543
+ var showErrorInAPD = oDialog.isOpen() && errorTargetsInAPD;
544
+ var bShowMessageBox = false;
545
+
523
546
  if (messages.length === 1 && messages[0].getTarget() !== undefined && messages[0].getTarget() !== "") {
524
547
  bShowMessageBox = true;
525
548
  }
@@ -532,7 +555,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
532
555
  messagePageNavigationCallback: function () {
533
556
  oDialog.close();
534
557
  },
535
- errorTargetsInAPM: errorTargetsInAPM,
558
+ showErrorInAPD: showErrorInAPD,
536
559
  bShowMessageBox: bShowMessageBox
537
560
  });
538
561
 
@@ -565,7 +588,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
565
588
  var getDefaultValuesFunction = function () {
566
589
  var oMetaModel = oDialog.getModel().getMetaModel(),
567
590
  sActionPath = oActionContext.sPath && oActionContext.sPath.split("/@")[0],
568
- sDefaultValuesFunction = oMetaModel.getObject(sActionPath + "@com.sap.vocabularies.Common.v1.DefaultValuesFunction");
591
+ sDefaultValuesFunction = oMetaModel.getObject("".concat(sActionPath, "@com.sap.vocabularies.Common.v1.DefaultValuesFunction"));
569
592
  return sDefaultValuesFunction;
570
593
  };
571
594
 
@@ -573,7 +596,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
573
596
  var sBoundFunctionName = getDefaultValuesFunction();
574
597
 
575
598
  var prefillParameter = function (sParamName, vParamDefaultValue) {
576
- return new Promise(function (resolve) {
599
+ // eslint-disable-next-line promise/param-names
600
+ return new Promise(function (inResolve) {
577
601
  // Case 1: There is a ParameterDefaultValue annotation
578
602
  if (vParamDefaultValue !== undefined) {
579
603
  if (aContexts.length > 0 && vParamDefaultValue.$Path) {
@@ -589,14 +613,14 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
589
613
  // For multi select, need to loop over aContexts (as contexts cannot be retrieved via binding parameter of the operation binding)
590
614
  var sPathForContext = vParamDefaultValue.$Path;
591
615
 
592
- if (sPathForContext.indexOf(sBindingParameter + "/") === 0) {
593
- sPathForContext = sPathForContext.replace(sBindingParameter + "/", "");
616
+ if (sPathForContext.indexOf("".concat(sBindingParameter, "/")) === 0) {
617
+ sPathForContext = sPathForContext.replace("".concat(sBindingParameter, "/"), "");
594
618
  }
595
619
 
596
620
  for (var i = 1; i < aContexts.length; i++) {
597
621
  if (aContexts[i].getProperty(sPathForContext) !== vParamValue) {
598
622
  // if the values from the contexts are not all the same, do not prefill
599
- resolve({
623
+ inResolve({
600
624
  paramName: sParamName,
601
625
  value: undefined,
602
626
  bNoPossibleValue: true
@@ -605,14 +629,14 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
605
629
  }
606
630
  }
607
631
 
608
- resolve({
632
+ inResolve({
609
633
  paramName: sParamName,
610
634
  value: vParamValue
611
635
  });
612
636
  }).catch(function () {
613
637
  // Simply clear parameter default if an error has occurred
614
638
  Log.error("Error while reading default action parameter", sParamName, mParameters.actionName);
615
- resolve({
639
+ inResolve({
616
640
  paramName: sParamName,
617
641
  value: undefined,
618
642
  bLatePropertyError: true
@@ -620,24 +644,22 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
620
644
  });
621
645
  } else {
622
646
  // Case 1.2: ParameterDefaultValue defines a fixed string value (i.e. vParamDefaultValue = 'someString')
623
- resolve({
647
+ inResolve({
624
648
  paramName: sParamName,
625
649
  value: vParamDefaultValue
626
650
  });
627
651
  }
628
- } else {
652
+ } else if (oParameterModel && oParameterModel.oData[sParamName]) {
629
653
  // Case 2: There is no ParameterDefaultValue annotation (=> look into the FLP User Defaults)
630
- if (oParameterModel && oParameterModel.oData[sParamName]) {
631
- resolve({
632
- paramName: sParamName,
633
- value: oParameterModel.oData[sParamName]
634
- });
635
- } else {
636
- resolve({
637
- paramName: sParamName,
638
- value: undefined
639
- });
640
- }
654
+ inResolve({
655
+ paramName: sParamName,
656
+ value: oParameterModel.oData[sParamName]
657
+ });
658
+ } else {
659
+ inResolve({
660
+ paramName: sParamName,
661
+ value: undefined
662
+ });
641
663
  }
642
664
  });
643
665
  };
@@ -645,7 +667,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
645
667
  var getParameterDefaultValue = function (sParamName) {
646
668
  var oMetaModel = oDialog.getModel().getMetaModel(),
647
669
  sActionPath = oActionContext.sPath && oActionContext.sPath.split("/@")[0],
648
- sActionParameterAnnotationTarget = sActionPath + "/" + sParamName + "@",
670
+ sActionParameterAnnotationTarget = "".concat(sActionPath, "/").concat(sParamName, "@"),
649
671
  oParameterAnnotations = oMetaModel.getObject(sActionParameterAnnotationTarget),
650
672
  oParameterDefaultValue = oParameterAnnotations && oParameterAnnotations["@com.sap.vocabularies.UI.v1.ParameterDefaultValue"]; // either { $Path: 'somePath' } or 'someString'
651
673
 
@@ -686,8 +708,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
686
708
  }
687
709
 
688
710
  Promise.all([aPrefillParamPromises, aExecFunctionPromises, oExecFunctionFromManifestPromise]).then(function (aPromises) {
689
- var aCurrentParamDefaultValue = aPromises[0];
690
- var aFunctionParams = aPromises[1];
711
+ var currentParamDefaultValue = aPromises[0];
712
+ var functionParams = aPromises[1];
691
713
  var oFunctionParamsFromManifest = aPromises[2];
692
714
  var sDialogParamName;
693
715
 
@@ -696,15 +718,15 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
696
718
 
697
719
  if (oFunctionParamsFromManifest && oFunctionParamsFromManifest.hasOwnProperty(sDialogParamName)) {
698
720
  oOperationBinding.setParameter(aActionParameters[_i3].$Name, oFunctionParamsFromManifest[sDialogParamName]);
699
- } else if (aCurrentParamDefaultValue[_i3] && aCurrentParamDefaultValue[_i3].value !== undefined) {
700
- oOperationBinding.setParameter(aActionParameters[_i3].$Name, aCurrentParamDefaultValue[_i3].value); // if the default value had not been previously determined due to different contexts, we do nothing else
701
- } else if (sBoundFunctionName && !aCurrentParamDefaultValue[_i3].bNoPossibleValue) {
721
+ } else if (currentParamDefaultValue[_i3] && currentParamDefaultValue[_i3].value !== undefined) {
722
+ oOperationBinding.setParameter(aActionParameters[_i3].$Name, currentParamDefaultValue[_i3].value); // if the default value had not been previously determined due to different contexts, we do nothing else
723
+ } else if (sBoundFunctionName && !currentParamDefaultValue[_i3].bNoPossibleValue) {
702
724
  if (aContexts.length > 1) {
703
725
  // we check if the function retrieves the same param value for all the contexts:
704
726
  var j = 0;
705
727
 
706
728
  while (j < aContexts.length - 1) {
707
- if (aFunctionParams[j] && aFunctionParams[j + 1] && aFunctionParams[j].getObject(sDialogParamName) === aFunctionParams[j + 1].getObject(sDialogParamName)) {
729
+ if (functionParams[j] && functionParams[j + 1] && functionParams[j].getObject(sDialogParamName) === functionParams[j + 1].getObject(sDialogParamName)) {
708
730
  j++;
709
731
  } else {
710
732
  break;
@@ -713,18 +735,16 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
713
735
 
714
736
 
715
737
  if (j === aContexts.length - 1) {
716
- oOperationBinding.setParameter(aActionParameters[_i3].$Name, aFunctionParams[j].getObject(sDialogParamName));
738
+ oOperationBinding.setParameter(aActionParameters[_i3].$Name, functionParams[j].getObject(sDialogParamName));
717
739
  }
718
- } else {
740
+ } else if (functionParams[0] && functionParams[0].getObject(sDialogParamName)) {
719
741
  //Only one context, then the default param values are to be verified from the function:
720
- if (aFunctionParams[0] && aFunctionParams[0].getObject(sDialogParamName)) {
721
- oOperationBinding.setParameter(aActionParameters[_i3].$Name, aFunctionParams[0].getObject(sDialogParamName));
722
- }
742
+ oOperationBinding.setParameter(aActionParameters[_i3].$Name, functionParams[0].getObject(sDialogParamName));
723
743
  }
724
744
  }
725
745
  }
726
746
 
727
- var bErrorFound = aCurrentParamDefaultValue.some(function (oValue) {
747
+ var bErrorFound = currentParamDefaultValue.some(function (oValue) {
728
748
  if (oValue.bLatePropertyError) {
729
749
  return oValue.bLatePropertyError;
730
750
  }
@@ -736,7 +756,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
736
756
  contentWidth: "25em"
737
757
  });
738
758
  }
739
- }).catch();
759
+ }).catch(function (oError) {
760
+ Log.error("Error while retrieving the parameter", oError);
761
+ });
740
762
  };
741
763
 
742
764
  if (oActionContext.getObject("$IsBound") && aContexts.length > 0) {
@@ -769,11 +791,11 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
769
791
 
770
792
  var oMVFModel = new JSONModel({});
771
793
  oDialog.setModel(oMVFModel, "mvfview");
772
- var sActionPath = sActionName + "(...)";
794
+ var sActionPath = "".concat(sActionName, "(...)");
773
795
  aContexts = mParameters.aContexts || [];
774
796
 
775
797
  if (!aContexts.length) {
776
- sActionPath = "/" + sActionPath;
798
+ sActionPath = "/".concat(sActionPath);
777
799
  }
778
800
 
779
801
  oDialog.bindElement({
@@ -797,17 +819,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
797
819
  });
798
820
  }
799
821
 
800
- function prepareActionParameters(oAction, aPredefinedParameters) {
801
- // check if parameters exist at all
802
- var aParameters = getActionParameters(oAction);
803
- aPredefinedParameters = aPredefinedParameters || [];
804
-
805
- if (aPredefinedParameters.length > 0) {// TODO: merge the predefined once with the real existing one
806
- }
807
-
808
- return aParameters;
809
- }
810
-
811
822
  function getActionParameters(oAction) {
812
823
  var aParameters = oAction.getObject("$Parameter") || [];
813
824
 
@@ -822,7 +833,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
822
833
  }
823
834
 
824
835
  function getIsActionCritical(oMetaModel, sPath, contexts, oBoundAction) {
825
- var vActionCritical = oMetaModel.getObject(sPath + "@com.sap.vocabularies.Common.v1.IsActionCritical");
836
+ var vActionCritical = oMetaModel.getObject("".concat(sPath, "@com.sap.vocabularies.Common.v1.IsActionCritical"));
826
837
  var sCriticalPath = vActionCritical && vActionCritical.$Path;
827
838
 
828
839
  if (!sCriticalPath) {
@@ -959,11 +970,11 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
959
970
  var i;
960
971
  var sGroupId;
961
972
 
962
- var fnExecuteAction = function (oAction, index, oSideEffect) {
973
+ var fnExecuteAction = function (actionContext, index, oSideEffect) {
963
974
  setActionParameterDefaultValue(); // For invocation grouping "isolated" need batch group per action call
964
975
 
965
- sGroupId = !bGrouped ? "$auto." + index : oAction.getUpdateGroupId();
966
- oActionPromise = executeDependingOnSelectedContexts(oAction, mParameters, bGetBoundContext, sGroupId);
976
+ sGroupId = !bGrouped ? "$auto.".concat(index) : actionContext.getUpdateGroupId();
977
+ oActionPromise = executeDependingOnSelectedContexts(actionContext, mParameters, bGetBoundContext, sGroupId);
967
978
  aActionPromises.push(oActionPromise);
968
979
  var oSideEffectsService = oAppComponent.getSideEffectsService(); // trigger actions from side effects
969
980
 
@@ -988,14 +999,15 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
988
999
  }
989
1000
  };
990
1001
 
991
- var fnExecuteSingleAction = function (oAction, index, oSideEffect) {
992
- var oPromise = new Promise(function (resolve) {
1002
+ var fnExecuteSingleAction = function (actionContext, index, oSideEffect) {
1003
+ // eslint-disable-next-line promise/param-names
1004
+ return new Promise(function (actionResolve) {
993
1005
  var oLocalPromise;
994
1006
  var aLocalPromise = [];
995
1007
  setActionParameterDefaultValue(); // For invocation grouping "isolated" need batch group per action call
996
1008
 
997
- sGroupId = "apiMode" + index;
998
- oActionPromise = executeDependingOnSelectedContexts(oAction, mParameters, bGetBoundContext, sGroupId);
1009
+ sGroupId = "apiMode".concat(index);
1010
+ oActionPromise = executeDependingOnSelectedContexts(actionContext, mParameters, bGetBoundContext, sGroupId);
999
1011
  aActionPromises.push(oActionPromise);
1000
1012
  aLocalPromise.push(oActionPromise);
1001
1013
  var oSideEffectsService = oAppComponent.getSideEffectsService(); // trigger actions from side effects
@@ -1025,23 +1037,22 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
1025
1037
 
1026
1038
  oModel.submitBatch(sGroupId);
1027
1039
  Promise.all(aLocalPromise).then(function () {
1028
- return resolve();
1040
+ return actionResolve();
1029
1041
  }).catch(function () {
1030
- return resolve();
1042
+ return actionResolve();
1031
1043
  });
1032
1044
  });
1033
- return oPromise;
1034
1045
  };
1035
1046
 
1036
- function fnExecuteSequentially(aContexts) {
1047
+ function fnExecuteSequentially(contextsToExecute) {
1037
1048
  // One action and its side effects are completed before the next action is executed
1038
1049
  (fnOnSubmitted || function noop() {
1039
1050
  /**/
1040
1051
  })(aActionPromises);
1041
1052
 
1042
- function processOneAction(context, i) {
1043
- oAction = oModel.bindContext(sActionName + "(...)", context, mBindingParameters);
1044
- return fnExecuteSingleAction(oAction, i, {
1053
+ function processOneAction(context, actionIndex) {
1054
+ oAction = oModel.bindContext("".concat(sActionName, "(...)"), context, mBindingParameters);
1055
+ return fnExecuteSingleAction(oAction, actionIndex, {
1045
1056
  context: context,
1046
1057
  pathExpressions: mParameters.additionalSideEffect && mParameters.additionalSideEffect.pathExpressions,
1047
1058
  triggerActions: mParameters.additionalSideEffect && mParameters.additionalSideEffect.triggerActions
@@ -1050,7 +1061,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
1050
1061
 
1051
1062
  var oActionAndSideEffectPromise = Promise.resolve();
1052
1063
  var j = 0;
1053
- aContexts.forEach(function (context) {
1064
+ contextsToExecute.forEach(function (context) {
1054
1065
  var id = ++j;
1055
1066
  oActionAndSideEffectPromise = oActionAndSideEffectPromise.then(function () {
1056
1067
  return processOneAction(context, id);
@@ -1058,7 +1069,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
1058
1069
  });
1059
1070
  oActionAndSideEffectPromise.then(function () {
1060
1071
  fnHandleResults();
1061
- }).catch();
1072
+ }).catch(function (oError) {
1073
+ Log.error(oError);
1074
+ });
1062
1075
  }
1063
1076
 
1064
1077
  if (!bGrouped) {
@@ -1068,7 +1081,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
1068
1081
  fnExecuteSequentially(aContexts);
1069
1082
  } else {
1070
1083
  for (i = 0; i < aContexts.length; i++) {
1071
- oAction = oModel.bindContext(sActionName + "(...)", aContexts[i], mBindingParameters);
1084
+ oAction = oModel.bindContext("".concat(sActionName, "(...)"), aContexts[i], mBindingParameters);
1072
1085
  fnExecuteAction(oAction, aContexts.length <= 1 ? null : i, {
1073
1086
  context: aContexts[i],
1074
1087
  pathExpressions: mParameters.additionalSideEffect && mParameters.additionalSideEffect.pathExpressions,
@@ -1130,7 +1143,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
1130
1143
  })();
1131
1144
  });
1132
1145
  } else {
1133
- oAction = oModel.bindContext("/" + sActionName + "(...)");
1146
+ oAction = oModel.bindContext("/".concat(sActionName, "(...)"));
1134
1147
  setActionParameterDefaultValue();
1135
1148
  var sGroupId = "actionImport";
1136
1149
  var oActionPromise = oAction.execute(sGroupId, undefined, CommonUtils.fnOnStrictHandlingFailed.bind(operations, sGroupId, mParameters.label, oModel));
@@ -1150,7 +1163,17 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
1150
1163
  function _getPath(oActionContext, sActionName) {
1151
1164
  var sPath = oActionContext.getPath();
1152
1165
  sPath = oActionContext.getObject("$IsBound") ? sPath.split("@$ui5.overload")[0] : sPath.split("/0")[0];
1153
- return sPath.split("/" + sActionName)[0];
1166
+ return sPath.split("/".concat(sActionName))[0];
1167
+ }
1168
+
1169
+ function _showActionParameterDialog(showDialog, actionParameters) {
1170
+ if (showDialog || actionParameters.length > 0) {
1171
+ if (!actionParameters || actionParameters.length === 0 || actionParameters.length === 1 && actionParameters[0].$Name === "ResultIsActiveEntity") {
1172
+ showDialog = false;
1173
+ }
1174
+ }
1175
+
1176
+ return showDialog;
1154
1177
  }
1155
1178
  /**
1156
1179
  * Static functions to call OData actions (bound/import) and functions (bound/import)
@@ -1168,8 +1191,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
1168
1191
  callActionImport: callActionImport,
1169
1192
  callBoundFunction: callBoundFunction,
1170
1193
  callFunctionImport: callFunctionImport,
1171
- executeDependingOnSelectedContexts: executeDependingOnSelectedContexts
1194
+ executeDependingOnSelectedContexts: executeDependingOnSelectedContexts,
1195
+ showActionParameterDialog: _showActionParameterDialog
1172
1196
  };
1173
1197
  return operations;
1174
1198
  }, false);
1175
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm9wZXJhdGlvbnMudHMiXSwibmFtZXMiOlsiQ29uc3RhbnRzIiwiRkVMaWJyYXJ5IiwiSW52b2NhdGlvbkdyb3VwaW5nIiwiQWN0aW9uIiwiTWVzc2FnZUJveCIsImNhbGxCb3VuZEFjdGlvbiIsInNBY3Rpb25OYW1lIiwiY29udGV4dHMiLCJvTW9kZWwiLCJvQXBwQ29tcG9uZW50IiwibVBhcmFtZXRlcnMiLCJsZW5ndGgiLCJQcm9taXNlIiwicmVqZWN0IiwiQXJyYXkiLCJpc0FycmF5IiwiYlJldHVybkFzQXJyYXkiLCJvTWV0YU1vZGVsIiwiZ2V0TWV0YU1vZGVsIiwic0FjdGlvblBhdGgiLCJnZXRNZXRhUGF0aCIsImdldFBhdGgiLCJvQm91bmRBY3Rpb24iLCJjcmVhdGVCaW5kaW5nQ29udGV4dCIsImFDb250ZXh0cyIsImlzQ3JpdGljYWxBY3Rpb24iLCJnZXRJc0FjdGlvbkNyaXRpY2FsIiwiY2FsbEFjdGlvbiIsImNhbGxBY3Rpb25JbXBvcnQiLCJiaW5kQ29udGV4dCIsIm9BY3Rpb25JbXBvcnQiLCJnZXRPYmplY3QiLCJjYWxsQm91bmRGdW5jdGlvbiIsInNGdW5jdGlvbk5hbWUiLCJjb250ZXh0Iiwic0Z1bmN0aW9uUGF0aCIsIm9Cb3VuZEZ1bmN0aW9uIiwiX2V4ZWN1dGVGdW5jdGlvbiIsImNhbGxGdW5jdGlvbkltcG9ydCIsInJlc29sdmUiLCJvRnVuY3Rpb25JbXBvcnQiLCJvRnVuY3Rpb24iLCJzR3JvdXBJZCIsIkVycm9yIiwib0Z1bmN0aW9uUHJvbWlzZSIsImV4ZWN1dGUiLCJzdWJtaXRCYXRjaCIsInRoZW4iLCJnZXRCb3VuZENvbnRleHQiLCJvQWN0aW9uIiwiYUFjdGlvblBhcmFtZXRlcnMiLCJhY3Rpb25QYXJhbWV0ZXJzIiwibUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMiLCJmbkRpYWxvZyIsIm9BY3Rpb25Qcm9taXNlIiwic0FjdGlvbkxhYmVsIiwibGFiZWwiLCJiU2hvd0FjdGlvblBhcmFtZXRlckRpYWxvZyIsInNob3dBY3Rpb25QYXJhbWV0ZXJEaWFsb2ciLCJiSXNDcmVhdGVBY3Rpb24iLCJiSXNDcml0aWNhbEFjdGlvbiIsInNNZXRhUGF0aCIsInNNZXNzYWdlc1BhdGgiLCJpTWVzc2FnZVNpZGVFZmZlY3QiLCJiSXNTYW1lRW50aXR5Iiwib1JldHVyblR5cGUiLCJhY3Rpb25EZWZpbml0aW9uIiwicHJlcGFyZUFjdGlvblBhcmFtZXRlcnMiLCJjb25maXJtQ3JpdGljYWxBY3Rpb24iLCJmbk9uU3VibWl0dGVkIiwib25TdWJtaXR0ZWQiLCJmbk9uUmVzcG9uc2UiLCJvblJlc3BvbnNlIiwiYWN0aW9uTmFtZSIsIm1vZGVsIiwiYkdldEJvdW5kQ29udGV4dCIsImRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbiIsImFkZGl0aW9uYWxTaWRlRWZmZWN0IiwicGF0aEV4cHJlc3Npb25zIiwiZmluZEluZGV4IiwiZXhwIiwiJGlzQ29sbGVjdGlvbiIsImdldE1vZGVsIiwiJFR5cGUiLCJtQmluZGluZ1BhcmFtZXRlcnMiLCIkc2VsZWN0Iiwic3BsaXQiLCJpbmRleE9mIiwicHVzaCIsInRyaWdnZXJBY3Rpb25zIiwic3BsaWNlIiwiYkdyb3VwZWQiLCJpbnZvY2F0aW9uR3JvdXBpbmciLCJDaGFuZ2VTZXQiLCJpbnRlcm5hbE1vZGVsQ29udGV4dCIsIm9wZXJhdGlvbkF2YWlsYWJsZU1hcCIsImJPYmplY3RQYWdlIiwiY29udHJvbElkIiwiY29udHJvbCIsInBhcmVudENvbnRyb2wiLCJieUlkIiwiZW50aXR5U2V0TmFtZSIsIm1lc3NhZ2VIYW5kbGVyIiwiX2V4ZWN1dGVBY3Rpb24iLCJvT3BlcmF0aW9uUmVzdWx0IiwiJElzQm91bmQiLCJpc1N0YXRpYyIsIiRQYXJhbWV0ZXIiLCJzb21lIiwiYVBhcmFtZXRlciIsIiRFbnRpdHlTZXRQYXRoIiwiJE5hbWUiLCJDb21tb25VdGlscyIsInNldEFjdGlvbkVuYWJsZW1lbnQiLCJKU09OIiwicGFyc2UiLCJjYXRjaCIsIm9BY3Rpb25Db250ZXh0Iiwib1BhcmVudENvbnRyb2wiLCJib3VuZEFjdGlvbk5hbWUiLCJzdWZmaXhSZXNvdXJjZUtleSIsIm9SZXNvdXJjZUJ1bmRsZSIsImdldENvbnRyb2xsZXIiLCJzQ29uZmlybWF0aW9uVGV4dCIsImdldFRyYW5zbGF0ZWRUZXh0IiwiY29uZmlybSIsIm9uQ2xvc2UiLCJzQWN0aW9uIiwiT0siLCJvT3BlcmF0aW9uIiwib0Vycm9yIiwic2hvd01lc3NhZ2VEaWFsb2ciLCJzUGF0aCIsIl9nZXRQYXRoIiwibWV0YU1vZGVsIiwiZW50aXR5U2V0Q29udGV4dCIsInNBY3Rpb25OYW1lUGF0aCIsImFjdGlvbk5hbWVDb250ZXh0Iiwic0ZyYWdtZW50TmFtZSIsIm9GcmFnbWVudCIsIlhNTFRlbXBsYXRlUHJvY2Vzc29yIiwibG9hZFRlbXBsYXRlIiwib1BhcmFtZXRlck1vZGVsIiwiSlNPTk1vZGVsIiwiJGRpc3BsYXlNb2RlIiwiYUZpZWxkSW52YWxpZCIsImFGb3JtRWxlbWVudHMiLCJtRmllbGRWYWx1ZU1hcCIsInZhbGlkYXRlUmVxdWlyZWRQcm9wZXJ0aWVzIiwiYWxsIiwiZmlsdGVyIiwib0Zvcm1FbGVtZW50Iiwib0ZpZWxkIiwiZ2V0RmllbGRzIiwiZ2V0UmVxdWlyZWQiLCJnZXRWYWx1ZVN0YXRlIiwibWFwIiwidmFsdWUiLCJpc0EiLCJnZXRJdGVtcyIsImdldFZhbHVlIiwidW5kZWZpbmVkIiwiZ2V0TGFiZWwiLCJnZXRUZXh0IiwiYVJlc3VsdHMiLCJyZXN1bHQiLCJfdmFsaWRhdGVNZXNzYWdlcyIsImJDbGVhclRhcmdldCIsIm9NZXNzYWdlTWFuYWdlciIsIkNvcmUiLCJnZXRNZXNzYWdlTWFuYWdlciIsImFNZXNzYWdlcyIsImdldE1lc3NhZ2VNb2RlbCIsImdldERhdGEiLCJmb3JFYWNoIiwib0FjdGlvblBhcmFtZXRlcnMiLCJzUGFyYW1ldGVyIiwib01lc3NhZ2UiLCJzUGFyYW0iLCJyZXBsYWNlIiwiY29udHJvbElkcyIsImdldENvbnRyb2xJZCIsImluY2x1ZGVzIiwicmVtb3ZlTWVzc2FnZXMiLCJ0YXJnZXQiLCJvQ29udHJvbGxlciIsImhhbmRsZUNoYW5nZSIsIm9FdmVudCIsInJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcyIsImdldFNvdXJjZSIsInNGaWVsZElkIiwiZ2V0UGFyYW1ldGVyIiwib0ZpZWxkUHJvbWlzZSIsIlhNTFByZXByb2Nlc3NvciIsInByb2Nlc3MiLCJuYW1lIiwiYmluZGluZ0NvbnRleHRzIiwiYWN0aW9uIiwiZW50aXR5U2V0IiwibW9kZWxzIiwiYUZ1bmN0aW9uUGFyYW1zIiwib09wZXJhdGlvbkJpbmRpbmciLCJzZXRVc2VyRGVmYXVsdHMiLCJGcmFnbWVudCIsImxvYWQiLCJkZWZpbml0aW9uIiwiY29udHJvbGxlciIsIm9EaWFsb2dDb250ZW50Iiwib0RpYWxvZyIsIkRpYWxvZyIsInRpdGxlIiwiY29udGVudCIsImVzY2FwZUhhbmRsZXIiLCJjbG9zZSIsImJlZ2luQnV0dG9uIiwiQnV0dG9uIiwiZ2VuZXJhdGUiLCJ0ZXh0IiwidHlwZSIsInByZXNzIiwiYUVtcHR5TWFuZGF0b3J5RmllbGRzIiwib01lc3NhZ2VzIiwiaSIsImNvZGUiLCJjdXN0b21NZXNzYWdlcyIsIm1lc3NhZ2VIYW5kbGluZyIsInNob3dVbmJvdW5kTWVzc2FnZXMiLCJCdXN5TG9ja2VyIiwibG9jayIsIk9iamVjdCIsImtleXMiLCJzS2V5IiwidlBhcmFtZXRlclZhbHVlIiwib1BhcmFtZXRlckNvbnRleHQiLCJnZXRQYXJhbWV0ZXJDb250ZXh0IiwiYU1WRkNvbnRlbnQiLCJnZXRQcm9wZXJ0eSIsImFLZXlWYWx1ZXMiLCJqIiwiS2V5IiwibWVzc2FnZXMiLCJnZXRNZXNzYWdlcyIsImNvbmNhdCIsInN1YnRpdGxlQ29sdW1uIiwiZ2V0TWVzc2FnZUNvbHVtbiIsImVycm9yQ29udGV4dCIsImVycm9yVGFyZ2V0c0luQVBNIiwiYlNob3dNZXNzYWdlQm94IiwibWVzc2FnZSIsIm1lc3NhZ2VUYXJnZXRzIiwiZ2V0VGFyZ2V0cyIsImZpbmQiLCJvQ29udGV4dCIsImdldFRhcmdldCIsImFkZGl0aW9uYWxUZXh0IiwiYkhhc0V0YWdNZXNzYWdlIiwibW9kaWZ5RVRhZ01lc3NhZ2VzT25seSIsInNob3dNZXNzYWdlcyIsImlzQWN0aW9uUGFyYW1ldGVyRGlhbG9nT3BlbiIsImlzT3BlbiIsIm1lc3NhZ2VQYWdlTmF2aWdhdGlvbkNhbGxiYWNrIiwiZmluYWxseSIsInVubG9jayIsImVuZEJ1dHRvbiIsIkNhbmNlbEFjdGlvbkRpYWxvZyIsImJlZm9yZU9wZW4iLCJvQ2xvbmVFdmVudCIsImFzc2lnbiIsImdldERlZmF1bHRWYWx1ZXNGdW5jdGlvbiIsInNEZWZhdWx0VmFsdWVzRnVuY3Rpb24iLCJmblNldERlZmF1bHRzQW5kT3BlbkRpYWxvZyIsInNCaW5kaW5nUGFyYW1ldGVyIiwic0JvdW5kRnVuY3Rpb25OYW1lIiwicHJlZmlsbFBhcmFtZXRlciIsInNQYXJhbU5hbWUiLCJ2UGFyYW1EZWZhdWx0VmFsdWUiLCIkUGF0aCIsIm9Qcm9taXNlIiwicmVxdWVzdFNpbmdsZXRvblByb3BlcnR5Iiwib1ZhbHVlIiwicmVxdWVzdFByb3BlcnR5IiwidlBhcmFtVmFsdWUiLCJzUGF0aEZvckNvbnRleHQiLCJwYXJhbU5hbWUiLCJiTm9Qb3NzaWJsZVZhbHVlIiwiTG9nIiwiZXJyb3IiLCJiTGF0ZVByb3BlcnR5RXJyb3IiLCJvRGF0YSIsImdldFBhcmFtZXRlckRlZmF1bHRWYWx1ZSIsInNBY3Rpb25QYXJhbWV0ZXJBbm5vdGF0aW9uVGFyZ2V0Iiwib1BhcmFtZXRlckFubm90YXRpb25zIiwib1BhcmFtZXRlckRlZmF1bHRWYWx1ZSIsImFDdXJyZW50UGFyYW1EZWZhdWx0VmFsdWUiLCJ2UGFyYW1ldGVyRGVmYXVsdFZhbHVlIiwiYVByZWZpbGxQYXJhbVByb21pc2VzIiwiYUV4ZWNGdW5jdGlvblByb21pc2VzIiwib0V4ZWNGdW5jdGlvbkZyb21NYW5pZmVzdFByb21pc2UiLCJzTW9kdWxlIiwic3Vic3RyaW5nIiwibGFzdEluZGV4T2YiLCJGUE1IZWxwZXIiLCJhY3Rpb25XcmFwcGVyIiwiYVByb21pc2VzIiwib0Z1bmN0aW9uUGFyYW1zRnJvbU1hbmlmZXN0Iiwic0RpYWxvZ1BhcmFtTmFtZSIsImhhc093blByb3BlcnR5Iiwic2V0UGFyYW1ldGVyIiwiYkVycm9yRm91bmQiLCJzVGV4dCIsIndhcm5pbmciLCJjb250ZW50V2lkdGgiLCJhUGFyYW1ldGVycyIsInJlcXVlc3RPYmplY3QiLCJvQ29udGV4dE9iamVjdCIsImFmdGVyQ2xvc2UiLCJkZXN0cm95IiwiZ2V0QWdncmVnYXRpb24iLCJzZXRNb2RlbCIsImJpbmRFbGVtZW50IiwicGF0aCIsIm9NVkZNb2RlbCIsImFkZERlcGVuZGVudCIsInNldEJpbmRpbmdDb250ZXh0IiwiZ2V0T2JqZWN0QmluZGluZyIsIm9wZW4iLCJhUHJlZGVmaW5lZFBhcmFtZXRlcnMiLCJnZXRBY3Rpb25QYXJhbWV0ZXJzIiwic2xpY2UiLCJ2QWN0aW9uQ3JpdGljYWwiLCJzQ3JpdGljYWxQYXRoIiwiYUJpbmRpbmdQYXJhbXMiLCJhUGF0aHMiLCJiQ29uZGl0aW9uIiwib1BhcmFtcyIsImluZGV4Iiwiam9pbiIsImV4ZWN1dGVEZXBlbmRpbmdPblNlbGVjdGVkQ29udGV4dHMiLCJiRW5hYmxlU3RyaWN0SGFuZGxpbmciLCJvUHJvcGVydHkiLCIka2luZCIsIm51bWJlck9mU2VsZWN0ZWRDb250ZXh0cyIsImZuT25TdHJpY3RIYW5kbGluZ0ZhaWxlZCIsImJpbmQiLCJvcGVyYXRpb25zIiwiaUV4aXN0aW5nTWVzc2FnZXMiLCJmbkRpZmZlcmVudGlhdGUiLCJwcm9taXNlIiwicmVzcG9uc2UiLCJzdGF0dXMiLCJzZXRBY3Rpb25QYXJhbWV0ZXJEZWZhdWx0VmFsdWUiLCJhQWN0aW9uUHJvbWlzZXMiLCJmbkV4ZWN1dGVBY3Rpb24iLCJvU2lkZUVmZmVjdCIsImdldFVwZGF0ZUdyb3VwSWQiLCJvU2lkZUVmZmVjdHNTZXJ2aWNlIiwiZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlIiwic1RyaWdnZXJBY3Rpb24iLCJleGVjdXRlQWN0aW9uIiwicmVxdWVzdFNpZGVFZmZlY3RzIiwiZm5FeGVjdXRlU2luZ2xlQWN0aW9uIiwib0xvY2FsUHJvbWlzZSIsImFMb2NhbFByb21pc2UiLCJmbkV4ZWN1dGVTZXF1ZW50aWFsbHkiLCJub29wIiwicHJvY2Vzc09uZUFjdGlvbiIsIm9BY3Rpb25BbmRTaWRlRWZmZWN0UHJvbWlzZSIsImlkIiwiZm5IYW5kbGVSZXN1bHRzIiwicmVzdWx0cyIsImFSZWplY3RlZEl0ZW1zIiwiYVJlc29sdmVkSXRlbXMiLCJpUmVzdWx0Q291bnQiLCJiQ29uc2lkZXJEb2N1bWVudE1vZGlmaWVkIiwicmVzb2x2ZWRJdGVtcyIsInJlamVjdGVkSXRlbXMiXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7Ozs7OztBQWNBLE1BQU1BLFNBQVMsR0FBR0MsU0FBUyxDQUFDRCxTQUE1QjtBQUFBLE1BQ0NFLGtCQUFrQixHQUFHRCxTQUFTLENBQUNDLGtCQURoQztBQUVBLE1BQU1DLE1BQU0sR0FBSUMsVUFBRCxDQUFvQkQsTUFBbkM7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUNBLFdBQVNFLGVBQVQsQ0FBeUJDLFdBQXpCLEVBQThDQyxRQUE5QyxFQUE2REMsTUFBN0QsRUFBMEVDLGFBQTFFLEVBQWlHQyxXQUFqRyxFQUFtSDtBQUNsSCxRQUFJLENBQUNILFFBQUQsSUFBYUEsUUFBUSxDQUFDSSxNQUFULEtBQW9CLENBQXJDLEVBQXdDO0FBQ3ZDO0FBQ0EsYUFBT0MsT0FBTyxDQUFDQyxNQUFSLENBQWUsb0RBQWYsQ0FBUDtBQUNBLEtBSmlILENBS2xIOzs7QUFDQSxRQUFJQyxLQUFLLENBQUNDLE9BQU4sQ0FBY1IsUUFBZCxDQUFKLEVBQTZCO0FBQzVCRyxNQUFBQSxXQUFXLENBQUNNLGNBQVosR0FBNkIsSUFBN0I7QUFDQSxLQUZELE1BRU87QUFDTjtBQUNB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Q0FBa0JoQixjQUFsQixFQUF1Qy9HLFdBQXZDLEVBQXlEO0FBQ3hELFFBQUk4SCxLQUFLLEdBQUdmLGNBQWMsQ0FBQ2hHLE9BQWYsRUFBWjtBQUNBK0csSUFBQUEsS0FBSyxHQUFHZixjQUFjLENBQUN0RixTQUFmLENBQXlCLFVBQXpCLElBQXVDcUcsS0FBSyxDQUFDOUMsS0FBTixDQUFZLGdCQUFaLEVBQThCLENBQTlCLENBQXZDLEdBQTBFOEMsS0FBSyxDQUFDOUMsS0FBTixDQUFZLElBQVosRUFBa0IsQ0FBbEIsQ0FBbEY7QUFDQSxXQUFPOEMsS0FBSyxDQUFDOUMsS0FBTixDQUFZLE1BQU1oRixXQUFsQixFQUErQixDQUEvQixDQUFQO0FBQ0E7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUNBLE1BQU1rVixVQUFVLEdBQUc7QUFDbEJuVixJQUFBQSxlQUFlLEVBQUVBLGVBREM7QUFFbEJ1QixJQUFBQSxnQkFBZ0IsRUFBRUEsZ0JBRkE7QUFHbEJJLElBQUFBLGlCQUFpQixFQUFFQSxpQkFIRDtBQUlsQk0sSUFBQUEsa0JBQWtCLEVBQUVBLGtCQUpGO0FBS2xCMlMsSUFBQUEsa0NBQWtDLEVBQUVBO0FBTGxCLEdBQW5CO1NBUWVPLFUiLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IENvbW1vblV0aWxzIGZyb20gXCJzYXAvZmUvY29yZS9Db21tb25VdGlsc1wiO1xuaW1wb3J0IEJ1c3lMb2NrZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL0J1c3lMb2NrZXJcIjtcbmltcG9ydCBtZXNzYWdlSGFuZGxpbmcgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL21lc3NhZ2VIYW5kbGVyL21lc3NhZ2VIYW5kbGluZ1wiO1xuaW1wb3J0IEZQTUhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9GUE1IZWxwZXJcIjtcbmltcG9ydCB7IGdlbmVyYXRlIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvU3RhYmxlSWRIZWxwZXJcIjtcbmltcG9ydCBGRUxpYnJhcnkgZnJvbSBcInNhcC9mZS9jb3JlL2xpYnJhcnlcIjtcbmltcG9ydCBCdXR0b24gZnJvbSBcInNhcC9tL0J1dHRvblwiO1xuaW1wb3J0IERpYWxvZyBmcm9tIFwic2FwL20vRGlhbG9nXCI7XG5pbXBvcnQgTWVzc2FnZUJveCBmcm9tIFwic2FwL20vTWVzc2FnZUJveFwiO1xuaW1wb3J0IENvcmUgZnJvbSBcInNhcC91aS9jb3JlL0NvcmVcIjtcbmltcG9ydCBGcmFnbWVudCBmcm9tIFwic2FwL3VpL2NvcmUvRnJhZ21lbnRcIjtcbmltcG9ydCBYTUxQcmVwcm9jZXNzb3IgZnJvbSBcInNhcC91aS9jb3JlL3V0aWwvWE1MUHJlcHJvY2Vzc29yXCI7XG5pbXBvcnQgWE1MVGVtcGxhdGVQcm9jZXNzb3IgZnJvbSBcInNhcC91aS9jb3JlL1hNTFRlbXBsYXRlUHJvY2Vzc29yXCI7XG5pbXBvcnQgSlNPTk1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvanNvbi9KU09OTW9kZWxcIjtcblxuY29uc3QgQ29uc3RhbnRzID0gRkVMaWJyYXJ5LkNvbnN0YW50cyxcblx0SW52b2NhdGlvbkdyb3VwaW5nID0gRkVMaWJyYXJ5Lkludm9jYXRpb25Hcm91cGluZztcbmNvbnN0IEFjdGlvbiA9IChNZXNzYWdlQm94IGFzIGFueSkuQWN0aW9uO1xuXG4vKipcbiAqIENhbGxzIGEgYm91bmQgYWN0aW9uIGZvciBvbmUgb3IgbXVsdGlwbGUgY29udGV4dHMuXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAc3RhdGljXG4gKiBAbmFtZSBzYXAuZmUuY29yZS5hY3Rpb25zLm9wZXJhdGlvbnMuY2FsbEJvdW5kQWN0aW9uXG4gKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuYWN0aW9ucy5vcGVyYXRpb25zXG4gKiBAcGFyYW0ge3N0cmluZ30gc0FjdGlvbk5hbWUgVGhlIG5hbWUgb2YgdGhlIGFjdGlvbiB0byBiZSBjYWxsZWRcbiAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IGNvbnRleHRzIEVpdGhlciBvbmUgY29udGV4dCBvciBhbiBhcnJheSB3aXRoIGNvbnRleHRzIGZvciB3aGljaCB0aGUgYWN0aW9uIGlzIHRvIGJlIGJlIGNhbGxlZFxuICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuTW9kZWx9IG9Nb2RlbCBPRGF0YSBNb2RlbFxuICogQHBhcmFtIHtvYmplY3R9IG9BcHBDb21wb25lbnQgVGhlIEFwcENvbXBvbmVudFxuICogQHBhcmFtIHttYXB9IFttUGFyYW1ldGVyc10gT3B0aW9uYWwsIGNhbiBjb250YWluIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcbiAqIEBwYXJhbSB7bWFwfSBbbVBhcmFtZXRlcnMuYWN0aW9uUGFyYW1ldGVyc10gQSBtYXAgb2YgcGFyYW1ldGVycyB0byBiZSBzZW50IGZvciBldmVyeSBhY3Rpb24gY2FsbFxuICogQHBhcmFtIHttYXB9IFttUGFyYW1ldGVycy5tQmluZGluZ1BhcmFtZXRlcnNdIEEgbWFwIG9mIGJpbmRpbmcgcGFyYW1ldGVycyB0aGF0IHdvdWxkIGJlIHBhcnQgb2YgJHNlbGVjdCBhbmQgJGV4cGFuZCBjb21pbmcgZnJvbSBzaWRlIGVmZmVjdHMgZm9yIGJvdW5kIGFjdGlvbnNcbiAqIEBwYXJhbSB7QXJyYXl9IFttUGFyYW1ldGVycy5hZGRpdGlvbmFsU2lkZUVmZmVjdF0gQXJyYXkgb2YgcHJvcGVydHkgcGF0aHMgdG8gYmUgcmVxdWVzdGVkIGluIGFkZGl0aW9uIHRvIGFjdHVhbCB0YXJnZXQgcHJvcGVydGllcyBvZiB0aGUgc2lkZSBlZmZlY3RcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW21QYXJhbWV0ZXJzLnNob3dBY3Rpb25QYXJhbWV0ZXJEaWFsb2ddIElmIHNldCBhbmQgaWYgcGFyYW1ldGVycyBleGlzdCB0aGUgdXNlciByZXRyaWV2ZXMgYSBkaWFsb2cgdG8gZmlsbCBpbiBwYXJhbWV0ZXJzLCBpZiBhY3Rpb25QYXJhbWV0ZXJzIGFyZSBwYXNzZWQgdGhleSBhcmUgc2hvd24gdG8gdGhlIHVzZXJcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbVBhcmFtZXRlcnMubGFiZWxdIEEgaHVtYW4tcmVhZGFibGUgbGFiZWwgZm9yIHRoZSBhY3Rpb25cbiAqIEBwYXJhbSB7c3RyaW5nfSBbbVBhcmFtZXRlcnMuaW52b2NhdGlvbkdyb3VwaW5nXSBNb2RlIGhvdyBhY3Rpb25zIGFyZSB0byBiZSBjYWxsZWQ6IENoYW5nZXNldCB0byBwdXQgYWxsIGFjdGlvbiBjYWxscyBpbnRvIG9uZSBjaGFuZ2VzZXQsIElzb2xhdGVkIHRvIHB1dCB0aGVtIGludG8gc2VwYXJhdGUgY2hhbmdlc2V0cywgZGVmYXVsdHMgdG8gSXNvbGF0ZWRcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFttUGFyYW1ldGVycy5vblN1Ym1pdHRlZF0gRnVuY3Rpb24gd2hpY2ggaXMgY2FsbGVkIG9uY2UgdGhlIGFjdGlvbnMgYXJlIHN1Ym1pdHRlZCB3aXRoIGFuIGFycmF5IG9mIHByb21pc2VzXG4gKiBAcGFyYW0ge21hcH0gW21QYXJhbWV0ZXJzLmRlZmF1bHRQYXJhbWV0ZXJzXSBDYW4gY29udGFpbiBkZWZhdWx0IHBhcmFtZXRlcnMgZnJvbSBGTFAgdXNlciBkZWZhdWx0c1xuICogQHBhcmFtIHtzYXAudWkuY29yZS5FbGVtZW50fSBbbVBhcmFtZXRlcnMucGFyZW50Q29udHJvbF0gSWYgc3BlY2lmaWVkIHRoZSBkaWFsb2dzIGFyZSBhZGRlZCBhcyBkZXBlbmRlbnQgb2YgdGhlIHBhcmVudCBjb250cm9sXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFttUGFyYW1ldGVycy5iR2V0Qm91bmRDb250ZXh0XSBJZiBzcGVjaWZpZWQgdGhlIGFjdGlvbiBwcm9taXNlIHJldHVybnMgdGhlIGJvdW5kIGNvbnRleHRcbiAqIEByZXR1cm5zIHtQcm9taXNlfSBQcm9taXNlIHJlc29sdmVzIHdpdGggYW4gYXJyYXkgb2YgcmVzcG9uc2Ugb2JqZWN0cyAoVE9ETzogdG8gYmUgY2hhbmdlZClcbiAqIEBwcml2YXRlXG4gKiBAdWk1LXJlc3RyaWN0ZWRcbiAqL1xuZnVuY3Rpb24gY2FsbEJvdW5kQWN0aW9uKHNBY3Rpb25OYW1lOiBzdHJpbmcsIGNvbnRleHRzOiBhbnksIG9Nb2RlbDogYW55LCBvQXBwQ29tcG9uZW50OiBvYmplY3QsIG1QYXJhbWV0ZXJzOiBhbnkpIHtcblx0aWYgKCFjb250ZXh0cyB8fCBjb250ZXh0cy5sZW5ndGggPT09IDApIHtcblx0XHQvL0luIEZyZWVzdHlsZSBhcHBzIGJvdW5kIGFjdGlvbnMgY2FuIGhhdmUgbm8gY29udGV4dFxuXHRcdHJldHVybiBQcm9taXNlLnJlamVjdChcIkJvdW5kIGFjdGlvbnMgYWx3YXlzIHJlcXVpcmVzIGF0IGxlYXN0IG9uZSBjb250ZXh0XCIpO1xuXHR9XG5cdC8vIHdlIGV4cGVjdCBlaXRoZXIgb25lIGNvbnRleHQgb3IgYW4gYXJyYXkgb2YgY29udGV4dHNcblx0aWYgKEFycmF5LmlzQXJyYXkoY29udGV4dHMpKSB7XG5cdFx0bVBhcmFtZXRlcnMuYlJldHVybkFzQXJyYXkgPSB0cnVlO1xuXHR9IGVsc2Uge1xuXHRcdC8vYWN0aW9uIG5lZWRzIHRvIGJlIGNhbGxlZCBvbiB0aGlzIGNvbnRleHQgZnJvbSB0aGUgZGVwZW5kZW50IGJpbmRpbmcgc28gVUkgZmllbGRzIGFyZSB1cGRhdGVkIHdpdGggcmVzcG9uc2UgZGF0YVxuXHRcdGNvbnRleHRzID0gW2NvbnRleHRzXTtcblx0fVxuXHRjb25zdCBvTWV0YU1vZGVsID0gb01vZGVsLmdldE1ldGFNb2RlbCgpLFxuXHRcdHNBY3Rpb25QYXRoID0gb01ldGFNb2RlbC5nZXRNZXRhUGF0aChjb250ZXh0c1swXS5nZXRQYXRoKCkpICsgXCIvXCIgKyBzQWN0aW9uTmFtZSxcblx0XHRvQm91bmRBY3Rpb24gPSBvTWV0YU1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KHNBY3Rpb25QYXRoICsgXCIvQCR1aTUub3ZlcmxvYWQvMFwiKTtcblx0bVBhcmFtZXRlcnMuYUNvbnRleHRzID0gY29udGV4dHM7XG5cdG1QYXJhbWV0ZXJzLmlzQ3JpdGljYWxBY3Rpb24gPSBnZXRJc0FjdGlvbkNyaXRpY2FsKG9NZXRhTW9kZWwsIHNBY3Rpb25QYXRoLCBjb250ZXh0cywgb0JvdW5kQWN0aW9uKTtcblx0cmV0dXJuIGNhbGxBY3Rpb24oc0FjdGlvbk5hbWUsIG9Nb2RlbCwgb0JvdW5kQWN0aW9uLCBvQXBwQ29tcG9uZW50LCBtUGFyYW1ldGVycyk7XG59XG4vKipcbiAqIENhbGxzIGFuIGFjdGlvbiBpbXBvcnQuXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAc3RhdGljXG4gKiBAbmFtZSBzYXAuZmUuY29yZS5hY3Rpb25zLm9wZXJhdGlvbnMuY2FsbEFjdGlvbkltcG9ydFxuICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmFjdGlvbnMub3BlcmF0aW9uc1xuICogQHBhcmFtIHtzdHJpbmd9IHNBY3Rpb25OYW1lIFRoZSBuYW1lIG9mIHRoZSBhY3Rpb24gaW1wb3J0IHRvIGJlIGNhbGxlZFxuICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFNb2RlbH0gb01vZGVsIEFuIGluc3RhbmNlIG9mIGFuIE9EYXRhIHY0IG1vZGVsXG4gKiBAcGFyYW0ge29iamVjdH0gb0FwcENvbXBvbmVudCBUaGUgQXBwQ29tcG9uZW50XG4gKiBAcGFyYW0ge21hcH0gW21QYXJhbWV0ZXJzXSBPcHRpb25hbCwgY2FuIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuICogQHBhcmFtIHttYXB9IFttUGFyYW1ldGVycy5hY3Rpb25QYXJhbWV0ZXJzXSBBIG1hcCBvZiBwYXJhbWV0ZXJzIHRvIGJlIHNlbnQgd2l0aCB0aGUgYWN0aW9uIGltcG9ydFxuICogQHBhcmFtIHtzdHJpbmd9IFttUGFyYW1ldGVycy5sYWJlbF0gQSBodW1hbi1yZWFkYWJsZSBsYWJlbCBmb3IgdGhlIGFjdGlvblxuICogQHBhcmFtIHtib29sZWFufSBbbVBhcmFtZXRlcnMuc2hvd0FjdGlvblBhcmFtZXRlckRpYWxvZ10gSWYgc2V0IGFuZCBpZiBwYXJhbWV0ZXJzIGV4aXN0IHRoZSB1c2VyIHJldHJpZXZlcyBhIGRpYWxvZyB0byBmaWxsIGluIHBhcmFtZXRlcnMsIGlmIGFjdGlvblBhcmFtZXRlcnMgYXJlIHBhc3NlZCB0aGV5IGFyZSBzaG93biB0byB0aGUgdXNlclxuICogQHBhcmFtIHtGdW5jdGlvbn0gW21QYXJhbWV0ZXJzLm9uU3VibWl0dGVkXSBGdW5jdGlvbiB3aGljaCBpcyBjYWxsZWQgb25jZSB0aGUgYWN0aW9ucyBhcmUgc3VibWl0dGVkIHdpdGggYW4gYXJyYXkgb2YgcHJvbWlzZXNcbiAqIEBwYXJhbSB7bWFwfSBbbVBhcmFtZXRlcnMuZGVmYXVsdFBhcmFtZXRlcnNdIENhbiBjb250YWluIGRlZmF1bHQgcGFyYW1ldGVycyBmcm9tIEZMUCB1c2VyIGRlZmF1bHRzXG4gKiBAcmV0dXJucyB7UHJvbWlzZX0gUHJvbWlzZSByZXNvbHZlcyB3aXRoIGFuIGFycmF5IG9mIHJlc3BvbnNlIG9iamVjdHMgKFRPRE86IHRvIGJlIGNoYW5nZWQpXG4gKiBAcHJpdmF0ZVxuICogQHVpNS1yZXN0cmljdGVkXG4gKi9cbmZ1bmN0aW9uIGNhbGxBY3Rpb25JbXBvcnQoc0FjdGlvbk5hbWU6IHN0cmluZywgb01vZGVsOiBhbnksIG9BcHBDb21wb25lbnQ6IG9iamVjdCwgbVBhcmFtZXRlcnM6IGFueSkge1xuXHRpZiAoIW9Nb2RlbCkge1xuXHRcdHJldHVybiBQcm9taXNlLnJlamVjdChcIkFjdGlvbiBleHBlY3RzIGEgbW9kZWwvY29udGV4dCBmb3IgZXhlY3V0aW9uXCIpO1xuXHR9XG5cdGNvbnN0IG9NZXRhTW9kZWwgPSBvTW9kZWwuZ2V0TWV0YU1vZGVsKCksXG5cdFx0c0FjdGlvblBhdGggPSBvTW9kZWwuYmluZENvbnRleHQoXCIvXCIgKyBzQWN0aW9uTmFtZSkuZ2V0UGF0aCgpLFxuXHRcdG9BY3Rpb25JbXBvcnQgPSBvTWV0YU1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KFwiL1wiICsgb01ldGFNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChzQWN0aW9uUGF0aCkuZ2V0T2JqZWN0KFwiJEFjdGlvblwiKSArIFwiLzBcIik7XG5cdG1QYXJhbWV0ZXJzLmlzQ3JpdGljYWxBY3Rpb24gPSBnZXRJc0FjdGlvbkNyaXRpY2FsKG9NZXRhTW9kZWwsIHNBY3Rpb25QYXRoICsgXCIvQCR1aTUub3ZlcmxvYWRcIik7XG5cdHJldHVybiBjYWxsQWN0aW9uKHNBY3Rpb25OYW1lLCBvTW9kZWwsIG9BY3Rpb25JbXBvcnQsIG9BcHBDb21wb25lbnQsIG1QYXJhbWV0ZXJzKTtcbn1cbmZ1bmN0aW9uIGNhbGxCb3VuZEZ1bmN0aW9uKHNGdW5jdGlvbk5hbWU6IHN0cmluZywgY29udGV4dDogYW55LCBvTW9kZWw6IGFueSkge1xuXHRpZiAoIWNvbnRleHQpIHtcblx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoXCJCb3VuZCBmdW5jdGlvbnMgYWx3YXlzIHJlcXVpcmVzIGEgY29udGV4dFwiKTtcblx0fVxuXHRjb25zdCBvTWV0YU1vZGVsID0gb01vZGVsLmdldE1ldGFNb2RlbCgpLFxuXHRcdHNGdW5jdGlvblBhdGggPSBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKGNvbnRleHQuZ2V0UGF0aCgpKSArIFwiL1wiICsgc0Z1bmN0aW9uTmFtZSxcblx0XHRvQm91bmRGdW5jdGlvbiA9IG9NZXRhTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoc0Z1bmN0aW9uUGF0aCk7XG5cdHJldHVybiBfZXhlY3V0ZUZ1bmN0aW9uKHNGdW5jdGlvbk5hbWUsIG9Nb2RlbCwgb0JvdW5kRnVuY3Rpb24sIGNvbnRleHQpO1xufVxuLyoqXG4gKiBDYWxscyBhIGZ1bmN0aW9uIGltcG9ydC5cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBzdGF0aWNcbiAqIEBuYW1lIHNhcC5mZS5jb3JlLmFjdGlvbnMub3BlcmF0aW9ucy5jYWxsRnVuY3Rpb25JbXBvcnRcbiAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5hY3Rpb25zLm9wZXJhdGlvbnNcbiAqIEBwYXJhbSB7c3RyaW5nfSBzRnVuY3Rpb25OYW1lIFRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiB0byBiZSBjYWxsZWRcbiAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTW9kZWx9IG9Nb2RlbCBBbiBpbnN0YW5jZSBvZiBhbiBPRGF0YSB2NCBtb2RlbFxuICogQHJldHVybnMge1Byb21pc2V9IFByb21pc2UgcmVzb2x2ZXNcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGNhbGxGdW5jdGlvbkltcG9ydChzRnVuY3Rpb25OYW1lOiBzdHJpbmcsIG9Nb2RlbDogYW55KSB7XG5cdGlmICghc0Z1bmN0aW9uTmFtZSkge1xuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0fVxuXHRjb25zdCBvTWV0YU1vZGVsID0gb01vZGVsLmdldE1ldGFNb2RlbCgpLFxuXHRcdHNGdW5jdGlvblBhdGggPSBvTW9kZWwuYmluZENvbnRleHQoXCIvXCIgKyBzRnVuY3Rpb25OYW1lKS5nZXRQYXRoKCksXG5cdFx0b0Z1bmN0aW9uSW1wb3J0ID0gb01ldGFNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChcblx0XHRcdFwiL1wiICsgb01ldGFNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChzRnVuY3Rpb25QYXRoKS5nZXRPYmplY3QoXCIkRnVuY3Rpb25cIikgKyBcIi8wXCJcblx0XHQpO1xuXHRyZXR1cm4gX2V4ZWN1dGVGdW5jdGlvbihzRnVuY3Rpb25OYW1lLCBvTW9kZWwsIG9GdW5jdGlvbkltcG9ydCk7XG59XG5mdW5jdGlvbiBfZXhlY3V0ZUZ1bmN0aW9uKHNGdW5jdGlvbk5hbWU6IGFueSwgb01vZGVsOiBhbnksIG9GdW5jdGlvbjogYW55LCBjb250ZXh0PzogYW55KSB7XG5cdGxldCBzR3JvdXBJZDtcblx0aWYgKCFvRnVuY3Rpb24gfHwgIW9GdW5jdGlvbi5nZXRPYmplY3QoKSkge1xuXHRcdHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJGdW5jdGlvbiBcIiArIHNGdW5jdGlvbk5hbWUgKyBcIiBub3QgZm91bmRcIikpO1xuXHR9XG5cdGlmIChjb250ZXh0KSB7XG5cdFx0b0Z1bmN0aW9uID0gb01vZGVsLmJpbmRDb250ZXh0KHNGdW5jdGlvbk5hbWUgKyBcIiguLi4pXCIsIGNvbnRleHQpO1xuXHRcdHNHcm91cElkID0gXCJmdW5jdGlvbkdyb3VwXCI7XG5cdH0gZWxzZSB7XG5cdFx0b0Z1bmN0aW9uID0gb01vZGVsLmJpbmRDb250ZXh0KFwiL1wiICsgc0Z1bmN0aW9uTmFtZSArIFwiKC4uLilcIik7XG5cdFx0c0dyb3VwSWQgPSBcImZ1bmN0aW9uSW1wb3J0XCI7XG5cdH1cblx0Y29uc3Qgb0Z1bmN0aW9uUHJvbWlzZSA9IG9GdW5jdGlvbi5leGVjdXRlKHNHcm91cElkKTtcblx0b01vZGVsLnN1Ym1pdEJhdGNoKHNHcm91cElkKTtcblx0cmV0dXJuIG9GdW5jdGlvblByb21pc2UudGhlbihmdW5jdGlvbiAoKSB7XG5cdFx0cmV0dXJuIG9GdW5jdGlvbi5nZXRCb3VuZENvbnRleHQoKTtcblx0fSk7XG59XG5mdW5jdGlvbiBjYWxsQWN0aW9uKHNBY3Rpb25OYW1lOiBhbnksIG9Nb2RlbDogYW55LCBvQWN0aW9uOiBhbnksIG9BcHBDb21wb25lbnQ6IGFueSwgbVBhcmFtZXRlcnM6IGFueSkge1xuXHRyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmU6ICh2YWx1ZTogYW55KSA9PiB2b2lkLCByZWplY3Q6IChyZWFzb24/OiBhbnkpID0+IHZvaWQpIHtcblx0XHRsZXQgYUFjdGlvblBhcmFtZXRlcnMgPSBtUGFyYW1ldGVycy5hY3Rpb25QYXJhbWV0ZXJzIHx8IFtdO1xuXHRcdGxldCBtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVyczogYW55ID0ge307XG5cdFx0bGV0IGZuRGlhbG9nO1xuXHRcdGxldCBvQWN0aW9uUHJvbWlzZTtcblx0XHRjb25zdCBzQWN0aW9uTGFiZWwgPSBtUGFyYW1ldGVycy5sYWJlbDtcblx0XHRsZXQgYlNob3dBY3Rpb25QYXJhbWV0ZXJEaWFsb2cgPSBtUGFyYW1ldGVycy5zaG93QWN0aW9uUGFyYW1ldGVyRGlhbG9nO1xuXHRcdGNvbnN0IGFDb250ZXh0cyA9IG1QYXJhbWV0ZXJzLmFDb250ZXh0cztcblx0XHRjb25zdCBiSXNDcmVhdGVBY3Rpb24gPSBtUGFyYW1ldGVycy5iSXNDcmVhdGVBY3Rpb247XG5cdFx0Y29uc3QgYklzQ3JpdGljYWxBY3Rpb24gPSBtUGFyYW1ldGVycy5pc0NyaXRpY2FsQWN0aW9uO1xuXHRcdGxldCBvTWV0YU1vZGVsO1xuXHRcdGxldCBzTWV0YVBhdGg7XG5cdFx0bGV0IHNNZXNzYWdlc1BhdGg6IGFueTtcblx0XHRsZXQgaU1lc3NhZ2VTaWRlRWZmZWN0O1xuXHRcdGxldCBiSXNTYW1lRW50aXR5O1xuXHRcdGxldCBvUmV0dXJuVHlwZTtcblx0XHRjb25zdCBhY3Rpb25EZWZpbml0aW9uID0gb0FjdGlvbi5nZXRPYmplY3QoKTtcblx0XHRpZiAoIW9BY3Rpb24gfHwgIW9BY3Rpb24uZ2V0T2JqZWN0KCkpIHtcblx0XHRcdHJldHVybiByZWplY3QobmV3IEVycm9yKFwiQWN0aW9uIFwiICsgc0FjdGlvbk5hbWUgKyBcIiBub3QgZm91bmRcIikpO1xuXHRcdH1cblx0XHRpZiAoYlNob3dBY3Rpb25QYXJhbWV0ZXJEaWFsb2cgfHwgYUFjdGlvblBhcmFtZXRlcnMubGVuZ3RoID4gMCkge1xuXHRcdFx0YUFjdGlvblBhcmFtZXRlcnMgPSBwcmVwYXJlQWN0aW9uUGFyYW1ldGVycyhvQWN0aW9uLCBhQWN0aW9uUGFyYW1ldGVycyk7XG5cdFx0XHRpZiAoIWFBY3Rpb25QYXJhbWV0ZXJzIHx8IGFBY3Rpb25QYXJhbWV0ZXJzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0XHRiU2hvd0FjdGlvblBhcmFtZXRlckRpYWxvZyA9IGZhbHNlO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAoYlNob3dBY3Rpb25QYXJhbWV0ZXJEaWFsb2cpIHtcblx0XHRcdGZuRGlhbG9nID0gc2hvd0FjdGlvblBhcmFtZXRlckRpYWxvZztcblx0XHR9IGVsc2UgaWYgKGJJc0NyaXRpY2FsQWN0aW9uKSB7XG5cdFx0XHRmbkRpYWxvZyA9IGNvbmZpcm1Dcml0aWNhbEFjdGlvbjtcblx0XHR9XG5cdFx0bUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMgPSB7XG5cdFx0XHRmbk9uU3VibWl0dGVkOiBtUGFyYW1ldGVycy5vblN1Ym1pdHRlZCxcblx0XHRcdGZuT25SZXNwb25zZTogbVBhcmFtZXRlcnMub25SZXNwb25zZSxcblx0XHRcdGFjdGlvbk5hbWU6IHNBY3Rpb25OYW1lLFxuXHRcdFx0bW9kZWw6IG9Nb2RlbCxcblx0XHRcdGFBY3Rpb25QYXJhbWV0ZXJzOiBhQWN0aW9uUGFyYW1ldGVycyxcblx0XHRcdGJHZXRCb3VuZENvbnRleHQ6IG1QYXJhbWV0ZXJzLmJHZXRCb3VuZENvbnRleHQsXG5cdFx0XHRkZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb246IG1QYXJhbWV0ZXJzLmRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbixcblx0XHRcdGxhYmVsOiBtUGFyYW1ldGVycy5sYWJlbFxuXHRcdH07XG5cdFx0aWYgKG9BY3Rpb24uZ2V0T2JqZWN0KFwiJElzQm91bmRcIikpIHtcblx0XHRcdGlmIChtUGFyYW1ldGVycy5hZGRpdGlvbmFsU2lkZUVmZmVjdCAmJiBtUGFyYW1ldGVycy5hZGRpdGlvbmFsU2lkZUVmZmVjdC5wYXRoRXhwcmVzc2lvbnMpIHtcblx0XHRcdFx0b01ldGFNb2RlbCA9IG9Nb2RlbC5nZXRNZXRhTW9kZWwoKTtcblx0XHRcdFx0c01ldGFQYXRoID0gb01ldGFNb2RlbC5nZXRNZXRhUGF0aChhQ29udGV4dHNbMF0uZ2V0UGF0aCgpKTtcblx0XHRcdFx0c01lc3NhZ2VzUGF0aCA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KHNNZXRhUGF0aCArIFwiL0Bjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuTWVzc2FnZXMvJFBhdGhcIik7XG5cblx0XHRcdFx0aWYgKHNNZXNzYWdlc1BhdGgpIHtcblx0XHRcdFx0XHRpTWVzc2FnZVNpZGVFZmZlY3QgPSBtUGFyYW1ldGVycy5hZGRpdGlvbmFsU2lkZUVmZmVjdC5wYXRoRXhwcmVzc2lvbnMuZmluZEluZGV4KGZ1bmN0aW9uIChleHA6IGFueSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHR5cGVvZiBleHAgPT09IFwic3RyaW5nXCIgJiYgZXhwID09PSBzTWVzc2FnZXNQYXRoO1xuXHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdFx0Ly8gQWRkIFNBUF9NZXNzYWdlcyBieSBkZWZhdWx0IGlmIG5vdCBhbm5vdGF0ZWQgYnkgc2lkZSBlZmZlY3RzLCBhY3Rpb24gZG9lcyBub3QgcmV0dXJuIGEgY29sbGVjdGlvbiBhbmRcblx0XHRcdFx0XHQvLyB0aGUgcmV0dXJuIHR5cGUgaXMgdGhlIHNhbWUgYXMgdGhlIGJvdW5kIHR5cGVcblx0XHRcdFx0XHRvUmV0dXJuVHlwZSA9IG9BY3Rpb24uZ2V0T2JqZWN0KFwiJFJldHVyblR5cGVcIik7XG5cdFx0XHRcdFx0YklzU2FtZUVudGl0eSA9XG5cdFx0XHRcdFx0XHRvUmV0dXJuVHlwZSAmJiAhb1JldHVyblR5cGUuJGlzQ29sbGVjdGlvbiAmJiBvQWN0aW9uLmdldE1vZGVsKCkuZ2V0T2JqZWN0KHNNZXRhUGF0aCkuJFR5cGUgPT09IG9SZXR1cm5UeXBlLiRUeXBlO1xuXG5cdFx0XHRcdFx0aWYgKGlNZXNzYWdlU2lkZUVmZmVjdCA+IC0xIHx8IGJJc1NhbWVFbnRpdHkpIHtcblx0XHRcdFx0XHRcdC8vIHRoZSBtZXNzYWdlIHBhdGggaXMgYW5ub3RhdGVkIGFzIHNpZGUgZWZmZWN0LiBBcyB0aGVyZSdzIG5vIGJpbmRpbmcgZm9yIGl0IGFuZCB0aGUgbW9kZWwgZG9lcyBjdXJyZW50bHkgbm90IGFsbG93XG5cdFx0XHRcdFx0XHQvLyB0byBhZGQgaXQgYXQgYSBsYXRlciBwb2ludCBvZiB0aW1lIHdlIGhhdmUgdG8gdGFrZSBjYXJlIGl0J3MgcGFydCBvZiB0aGUgJHNlbGVjdCBvZiB0aGUgUE9TVCwgdGhlcmVmb3JlIG1vdmluZyBpdC5cblx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLm1CaW5kaW5nUGFyYW1ldGVycyA9IG1QYXJhbWV0ZXJzLm1CaW5kaW5nUGFyYW1ldGVycyB8fCB7fTtcblxuXHRcdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0XHRvQWN0aW9uLmdldE9iamVjdChcIiRSZXR1cm5UeXBlLyRUeXBlL1wiICsgc01lc3NhZ2VzUGF0aCkgJiZcblx0XHRcdFx0XHRcdFx0KCFtUGFyYW1ldGVycy5tQmluZGluZ1BhcmFtZXRlcnMuJHNlbGVjdCB8fFxuXHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLm1CaW5kaW5nUGFyYW1ldGVycy4kc2VsZWN0LnNwbGl0KFwiLFwiKS5pbmRleE9mKHNNZXNzYWdlc1BhdGgpID09PSAtMSlcblx0XHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5tQmluZGluZ1BhcmFtZXRlcnMuJHNlbGVjdCA9IG1QYXJhbWV0ZXJzLm1CaW5kaW5nUGFyYW1ldGVycy4kc2VsZWN0XG5cdFx0XHRcdFx0XHRcdFx0PyBtUGFyYW1ldGVycy5tQmluZGluZ1BhcmFtZXRlcnMuJHNlbGVjdCArIFwiLFwiICsgc01lc3NhZ2VzUGF0aFxuXHRcdFx0XHRcdFx0XHRcdDogc01lc3NhZ2VzUGF0aDtcblx0XHRcdFx0XHRcdFx0Ly8gQWRkIHNpZGUgZWZmZWN0cyBhdCBlbnRpdHkgbGV2ZWwgYmVjYXVzZSAkc2VsZWN0IHN0b3BzIHRoZXNlIGJlaW5nIHJldHVybmVkIGJ5IHRoZSBhY3Rpb25cblx0XHRcdFx0XHRcdFx0Ly8gT25seSBpZiBubyBvdGhlciBzaWRlIGVmZmVjdHMgd2VyZSBhZGRlZCBmb3IgTWVzc2FnZXNcblx0XHRcdFx0XHRcdFx0aWYgKGlNZXNzYWdlU2lkZUVmZmVjdCA9PT0gLTEpIHtcblx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5hZGRpdGlvbmFsU2lkZUVmZmVjdC5wYXRoRXhwcmVzc2lvbnMucHVzaChcIipcIik7XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRpZiAobVBhcmFtZXRlcnMuYWRkaXRpb25hbFNpZGVFZmZlY3QudHJpZ2dlckFjdGlvbnMubGVuZ3RoID09PSAwICYmIGlNZXNzYWdlU2lkZUVmZmVjdCA+IC0xKSB7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gbm8gdHJpZ2dlciBhY3Rpb24gdGhlcmVmb3JlIG5vIG5lZWQgdG8gcmVxdWVzdCBtZXNzYWdlcyBhZ2FpblxuXHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmFkZGl0aW9uYWxTaWRlRWZmZWN0LnBhdGhFeHByZXNzaW9ucy5zcGxpY2UoaU1lc3NhZ2VTaWRlRWZmZWN0LCAxKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycy5hQ29udGV4dHMgPSBhQ29udGV4dHM7XG5cdFx0XHRtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycy5tQmluZGluZ1BhcmFtZXRlcnMgPSBtUGFyYW1ldGVycy5tQmluZGluZ1BhcmFtZXRlcnM7XG5cdFx0XHRtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycy5hZGRpdGlvbmFsU2lkZUVmZmVjdCA9IG1QYXJhbWV0ZXJzLmFkZGl0aW9uYWxTaWRlRWZmZWN0O1xuXHRcdFx0bUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMuYkdyb3VwZWQgPSBtUGFyYW1ldGVycy5pbnZvY2F0aW9uR3JvdXBpbmcgPT09IEludm9jYXRpb25Hcm91cGluZy5DaGFuZ2VTZXQ7XG5cdFx0XHRtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycy5iUmV0dXJuQXNBcnJheSA9IG1QYXJhbWV0ZXJzLmJSZXR1cm5Bc0FycmF5O1xuXHRcdFx0bUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMuaW50ZXJuYWxNb2RlbENvbnRleHQgPSBtUGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dDtcblx0XHRcdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLm9wZXJhdGlvbkF2YWlsYWJsZU1hcCA9IG1QYXJhbWV0ZXJzLm9wZXJhdGlvbkF2YWlsYWJsZU1hcDtcblx0XHRcdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLmJPYmplY3RQYWdlID0gbVBhcmFtZXRlcnMuYk9iamVjdFBhZ2U7XG5cdFx0XHRpZiAobVBhcmFtZXRlcnMuY29udHJvbElkKSB7XG5cdFx0XHRcdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLmNvbnRyb2wgPSBtUGFyYW1ldGVycy5wYXJlbnRDb250cm9sLmJ5SWQobVBhcmFtZXRlcnMuY29udHJvbElkKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLmNvbnRyb2wgPSBtUGFyYW1ldGVycy5wYXJlbnRDb250cm9sO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAoYklzQ3JlYXRlQWN0aW9uKSB7XG5cdFx0XHRtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycy5iSXNDcmVhdGVBY3Rpb24gPSBiSXNDcmVhdGVBY3Rpb247XG5cdFx0fVxuXHRcdGlmIChmbkRpYWxvZykge1xuXHRcdFx0b0FjdGlvblByb21pc2UgPSBmbkRpYWxvZyhcblx0XHRcdFx0c0FjdGlvbk5hbWUsXG5cdFx0XHRcdG9BcHBDb21wb25lbnQsXG5cdFx0XHRcdHNBY3Rpb25MYWJlbCxcblx0XHRcdFx0bUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMsXG5cdFx0XHRcdGFBY3Rpb25QYXJhbWV0ZXJzLFxuXHRcdFx0XHRvQWN0aW9uLFxuXHRcdFx0XHRtUGFyYW1ldGVycy5wYXJlbnRDb250cm9sLFxuXHRcdFx0XHRtUGFyYW1ldGVycy5lbnRpdHlTZXROYW1lLFxuXHRcdFx0XHRtUGFyYW1ldGVycy5tZXNzYWdlSGFuZGxlclxuXHRcdFx0KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0b0FjdGlvblByb21pc2UgPSBfZXhlY3V0ZUFjdGlvbihvQXBwQ29tcG9uZW50LCBtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycyk7XG5cdFx0fVxuXHRcdHJldHVybiBvQWN0aW9uUHJvbWlzZVxuXHRcdFx0LnRoZW4oZnVuY3Rpb24gKG9PcGVyYXRpb25SZXN1bHQ6IGFueSkge1xuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0bUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMuaW50ZXJuYWxNb2RlbENvbnRleHQgJiZcblx0XHRcdFx0XHRtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycy5vcGVyYXRpb25BdmFpbGFibGVNYXAgJiZcblx0XHRcdFx0XHRtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycy5hQ29udGV4dHMgJiZcblx0XHRcdFx0XHRtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycy5hQ29udGV4dHMubGVuZ3RoICYmXG5cdFx0XHRcdFx0YWN0aW9uRGVmaW5pdGlvbi4kSXNCb3VuZFxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHQvL2NoZWNrIGZvciBza2lwcGluZyBzdGF0aWMgYWN0aW9uc1xuXHRcdFx0XHRcdGNvbnN0IGlzU3RhdGljID0gKGFjdGlvbkRlZmluaXRpb24uJFBhcmFtZXRlciB8fCBbXSkuc29tZSgoYVBhcmFtZXRlcjogYW55KSA9PiB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHRcdFx0XHRhY3Rpb25EZWZpbml0aW9uLiRFbnRpdHlTZXRQYXRoICYmXG5cdFx0XHRcdFx0XHRcdGFjdGlvbkRlZmluaXRpb24uJEVudGl0eVNldFBhdGggPT09IGFQYXJhbWV0ZXIuJE5hbWUgJiZcblx0XHRcdFx0XHRcdFx0YVBhcmFtZXRlci4kaXNDb2xsZWN0aW9uXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdGlmICghaXNTdGF0aWMpIHtcblx0XHRcdFx0XHRcdENvbW1vblV0aWxzLnNldEFjdGlvbkVuYWJsZW1lbnQoXG5cdFx0XHRcdFx0XHRcdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0LFxuXHRcdFx0XHRcdFx0XHRKU09OLnBhcnNlKG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLm9wZXJhdGlvbkF2YWlsYWJsZU1hcCksXG5cdFx0XHRcdFx0XHRcdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLmFDb250ZXh0c1xuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0cmVzb2x2ZShvT3BlcmF0aW9uUmVzdWx0KTtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9PcGVyYXRpb25SZXN1bHQ6IGFueSkge1xuXHRcdFx0XHRyZWplY3Qob09wZXJhdGlvblJlc3VsdCk7XG5cdFx0XHR9KTtcblx0fSk7XG59XG5mdW5jdGlvbiBjb25maXJtQ3JpdGljYWxBY3Rpb24oXG5cdHNBY3Rpb25OYW1lOiBhbnksXG5cdG9BcHBDb21wb25lbnQ6IGFueSxcblx0c0FjdGlvbkxhYmVsOiBhbnksXG5cdG1QYXJhbWV0ZXJzOiBhbnksXG5cdGFBY3Rpb25QYXJhbWV0ZXJzOiBhbnksXG5cdG9BY3Rpb25Db250ZXh0OiBhbnksXG5cdG9QYXJlbnRDb250cm9sOiBhbnksXG5cdGVudGl0eVNldE5hbWU6IGFueSxcblx0bWVzc2FnZUhhbmRsZXI6IGFueVxuKSB7XG5cdHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0bGV0IGJvdW5kQWN0aW9uTmFtZSA9IHNBY3Rpb25OYW1lID8gc0FjdGlvbk5hbWUgOiBudWxsO1xuXHRcdGJvdW5kQWN0aW9uTmFtZSA9XG5cdFx0XHRib3VuZEFjdGlvbk5hbWUuaW5kZXhPZihcIi5cIikgPj0gMCA/IGJvdW5kQWN0aW9uTmFtZS5zcGxpdChcIi5cIilbYm91bmRBY3Rpb25OYW1lLnNwbGl0KFwiLlwiKS5sZW5ndGggLSAxXSA6IGJvdW5kQWN0aW9uTmFtZTtcblx0XHRjb25zdCBzdWZmaXhSZXNvdXJjZUtleSA9IGJvdW5kQWN0aW9uTmFtZSAmJiBlbnRpdHlTZXROYW1lID8gZW50aXR5U2V0TmFtZSArIFwifFwiICsgYm91bmRBY3Rpb25OYW1lIDogXCJcIjtcblx0XHRjb25zdCBvUmVzb3VyY2VCdW5kbGUgPSBvUGFyZW50Q29udHJvbC5nZXRDb250cm9sbGVyKCkub1Jlc291cmNlQnVuZGxlO1xuXHRcdGNvbnN0IHNDb25maXJtYXRpb25UZXh0ID0gQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXG5cdFx0XHRcIkNfT1BFUkFUSU9OU19BQ1RJT05fQ09ORklSTV9NRVNTQUdFXCIsXG5cdFx0XHRvUmVzb3VyY2VCdW5kbGUsXG5cdFx0XHRudWxsLFxuXHRcdFx0c3VmZml4UmVzb3VyY2VLZXlcblx0XHQpO1xuXG5cdFx0TWVzc2FnZUJveC5jb25maXJtKHNDb25maXJtYXRpb25UZXh0LCB7XG5cdFx0XHRvbkNsb3NlOiBmdW5jdGlvbiAoc0FjdGlvbjogYW55KSB7XG5cdFx0XHRcdGlmIChzQWN0aW9uID09PSBBY3Rpb24uT0spIHtcblx0XHRcdFx0XHRyZXR1cm4gX2V4ZWN1dGVBY3Rpb24ob0FwcENvbXBvbmVudCwgbVBhcmFtZXRlcnMpXG5cdFx0XHRcdFx0XHQudGhlbihmdW5jdGlvbiAob09wZXJhdGlvbjogYW55KSB7XG5cdFx0XHRcdFx0XHRcdHJlc29sdmUob09wZXJhdGlvbik7XG5cdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRtZXNzYWdlSGFuZGxlclxuXHRcdFx0XHRcdFx0XHRcdC5zaG93TWVzc2FnZURpYWxvZygpXG5cdFx0XHRcdFx0XHRcdFx0LnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0cmVqZWN0KG9FcnJvcik7XG5cdFx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0cmVqZWN0KG9FcnJvcik7XG5cdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRyZXNvbHZlKCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblx0fSk7XG59XG5mdW5jdGlvbiBzaG93QWN0aW9uUGFyYW1ldGVyRGlhbG9nKFxuXHRzQWN0aW9uTmFtZTogYW55LFxuXHRvQXBwQ29tcG9uZW50OiBhbnksXG5cdHNBY3Rpb25MYWJlbDogYW55LFxuXHRtUGFyYW1ldGVyczogYW55LFxuXHRhQWN0aW9uUGFyYW1ldGVyczogYW55LFxuXHRvQWN0aW9uQ29udGV4dDogYW55LFxuXHRvUGFyZW50Q29udHJvbDogYW55LFxuXHRlbnRpdHlTZXROYW1lOiBhbnksXG5cdG1lc3NhZ2VIYW5kbGVyOiBhbnlcbikge1xuXHRjb25zdCBzUGF0aCA9IF9nZXRQYXRoKG9BY3Rpb25Db250ZXh0LCBzQWN0aW9uTmFtZSksXG5cdFx0bWV0YU1vZGVsID0gb0FjdGlvbkNvbnRleHQuZ2V0TW9kZWwoKS5vTW9kZWwuZ2V0TWV0YU1vZGVsKCksXG5cdFx0ZW50aXR5U2V0Q29udGV4dCA9IG1ldGFNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChzUGF0aCksXG5cdFx0c0FjdGlvbk5hbWVQYXRoID0gb0FjdGlvbkNvbnRleHQuZ2V0T2JqZWN0KFwiJElzQm91bmRcIilcblx0XHRcdD8gb0FjdGlvbkNvbnRleHQuZ2V0UGF0aCgpLnNwbGl0KFwiL0AkdWk1Lm92ZXJsb2FkLzBcIilbMF1cblx0XHRcdDogb0FjdGlvbkNvbnRleHQuZ2V0UGF0aCgpLnNwbGl0KFwiLzBcIilbMF0sXG5cdFx0YWN0aW9uTmFtZUNvbnRleHQgPSBtZXRhTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoc0FjdGlvbk5hbWVQYXRoKSxcblx0XHRzRnJhZ21lbnROYW1lID0gXCJzYXAvZmUvY29yZS9jb250cm9scy9BY3Rpb25QYXJhbWV0ZXJEaWFsb2dcIjtcblx0cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlOiAodmFsdWU6IGFueSkgPT4gdm9pZCwgcmVqZWN0OiAocmVhc29uPzogYW55KSA9PiB2b2lkKSB7XG5cdFx0Y29uc3Qgb0ZyYWdtZW50ID0gWE1MVGVtcGxhdGVQcm9jZXNzb3IubG9hZFRlbXBsYXRlKHNGcmFnbWVudE5hbWUsIFwiZnJhZ21lbnRcIik7XG5cdFx0Y29uc3Qgb1BhcmFtZXRlck1vZGVsID0gbmV3IEpTT05Nb2RlbCh7XG5cdFx0XHQkZGlzcGxheU1vZGU6IHt9XG5cdFx0fSk7XG5cdFx0bGV0IGFGaWVsZEludmFsaWQ6IGFueVtdID0gW107XG5cdFx0bGV0IGFGb3JtRWxlbWVudHM6IGFueVtdID0gW107XG5cdFx0Y29uc3QgbUZpZWxkVmFsdWVNYXA6IGFueSA9IHt9O1xuXHRcdGNvbnN0IHZhbGlkYXRlUmVxdWlyZWRQcm9wZXJ0aWVzID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0cmV0dXJuIFByb21pc2UuYWxsKFxuXHRcdFx0XHRhRm9ybUVsZW1lbnRzXG5cdFx0XHRcdFx0LmZpbHRlcihmdW5jdGlvbiAob0Zvcm1FbGVtZW50OiBhbnkpIHtcblx0XHRcdFx0XHRcdGNvbnN0IG9GaWVsZCA9IG9Gb3JtRWxlbWVudC5nZXRGaWVsZHMoKVswXTtcblx0XHRcdFx0XHRcdHJldHVybiBvRmllbGQuZ2V0UmVxdWlyZWQoKSAmJiBvRmllbGQuZ2V0VmFsdWVTdGF0ZSgpICE9PSBcIkVycm9yXCI7XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQubWFwKGZ1bmN0aW9uIChvRm9ybUVsZW1lbnQ6IGFueSkge1xuXHRcdFx0XHRcdFx0Y29uc3QgdmFsdWUgPSBvRm9ybUVsZW1lbnQuZ2V0RmllbGRzKClbMF0uaXNBKFwic2FwLnVpLm1kYy5NdWx0aVZhbHVlRmllbGRcIilcblx0XHRcdFx0XHRcdFx0PyBvRm9ybUVsZW1lbnQuZ2V0RmllbGRzKClbMF0uZ2V0SXRlbXMoKVxuXHRcdFx0XHRcdFx0XHQ6IG9Gb3JtRWxlbWVudC5nZXRGaWVsZHMoKVswXS5nZXRWYWx1ZSgpO1xuXHRcdFx0XHRcdFx0aWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IFwiXCIgfHwgKEFycmF5LmlzQXJyYXkodmFsdWUpICYmICF2YWx1ZS5sZW5ndGgpKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBvRm9ybUVsZW1lbnQuZ2V0TGFiZWwoKS5nZXRUZXh0KCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSlcblx0XHRcdCkudGhlbihmdW5jdGlvbiAoYVJlc3VsdHM6IGFueVtdKSB7XG5cdFx0XHRcdGFSZXN1bHRzID0gYVJlc3VsdHMuZmlsdGVyKGZ1bmN0aW9uIChyZXN1bHQ6IGFueSkge1xuXHRcdFx0XHRcdHJldHVybiByZXN1bHQgIT09IHVuZGVmaW5lZDtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHJldHVybiBhUmVzdWx0cztcblx0XHRcdH0pO1xuXHRcdH07XG5cdFx0Y29uc3QgX3ZhbGlkYXRlTWVzc2FnZXMgPSBmdW5jdGlvbiAoYUFjdGlvblBhcmFtZXRlcnM6IGFueSwgYUZpZWxkSW52YWxpZDogYW55LCBiQ2xlYXJUYXJnZXQ/OiBib29sZWFuKSB7XG5cdFx0XHRjb25zdCBvTWVzc2FnZU1hbmFnZXIgPSBDb3JlLmdldE1lc3NhZ2VNYW5hZ2VyKCk7XG5cdFx0XHRjb25zdCBhTWVzc2FnZXMgPSBvTWVzc2FnZU1hbmFnZXIuZ2V0TWVzc2FnZU1vZGVsKCkuZ2V0RGF0YSgpO1xuXG5cdFx0XHRhRmllbGRJbnZhbGlkID0gYUZpZWxkSW52YWxpZCB8fCBbXTtcblxuXHRcdFx0aWYgKCFhTWVzc2FnZXMubGVuZ3RoKSB7XG5cdFx0XHRcdGFGaWVsZEludmFsaWQgPSBbXTtcblx0XHRcdH1cblx0XHRcdGFBY3Rpb25QYXJhbWV0ZXJzLmZvckVhY2goZnVuY3Rpb24gKG9BY3Rpb25QYXJhbWV0ZXJzOiBhbnkpIHtcblx0XHRcdFx0Y29uc3Qgc1BhcmFtZXRlciA9IG9BY3Rpb25QYXJhbWV0ZXJzLiROYW1lO1xuXHRcdFx0XHRhTWVzc2FnZXMuZm9yRWFjaChmdW5jdGlvbiAob01lc3NhZ2U6IGFueSkge1xuXHRcdFx0XHRcdGNvbnN0IHNQYXJhbSA9IHNQYXJhbWV0ZXIucmVwbGFjZShcIi1pbm5lclwiLCBcIlwiKTtcblx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRvTWVzc2FnZS5jb250cm9sSWRzLmxlbmd0aCA+IDAgJiZcblx0XHRcdFx0XHRcdChvTWVzc2FnZS5nZXRDb250cm9sSWQoKS5pbmNsdWRlcyhcIkFQRF86OlwiICsgc1BhcmFtZXRlcikgfHxcblx0XHRcdFx0XHRcdFx0KG9NZXNzYWdlLmdldENvbnRyb2xJZCgpLmluY2x1ZGVzKFwiQVBEXzo6XCIgKyBzUGFyYW1ldGVyICsgXCJpbm5lclwiKSAmJlxuXHRcdFx0XHRcdFx0XHRcdGFGaWVsZEludmFsaWQuaW5kZXhPZihcIkFQRF86OlwiICsgc1BhcmFtKSA8IDApKVxuXHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0aWYgKGJDbGVhclRhcmdldCkge1xuXHRcdFx0XHRcdFx0XHRvTWVzc2FnZU1hbmFnZXIucmVtb3ZlTWVzc2FnZXMob01lc3NhZ2UpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0YUZpZWxkSW52YWxpZC5wdXNoKFwiQVBEXzo6XCIgKyBzUGFyYW0pO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQvLyBIYW5kbGUgbWVzc2FnZXMgcmVsYXRlZCB0byBpbnB1dCB3aXRoIGludmFsaWQgdG9rZW5cblx0XHRcdFx0XHRpZiAob01lc3NhZ2UudGFyZ2V0LmluY2x1ZGVzKFwiQVBEXzo6XCIgKyBzUGFyYW1ldGVyKSkge1xuXHRcdFx0XHRcdFx0YUZpZWxkSW52YWxpZC5wdXNoKFwiQVBEXzo6XCIgKyBzUGFyYW0pO1xuXHRcdFx0XHRcdFx0b01lc3NhZ2UudGFyZ2V0ID0gYkNsZWFyVGFyZ2V0ID8gXCJcIiA6IG9NZXNzYWdlLnRhcmdldDtcblx0XHRcdFx0XHRcdGlmIChiQ2xlYXJUYXJnZXQpIHtcblx0XHRcdFx0XHRcdFx0b01lc3NhZ2VNYW5hZ2VyLnJlbW92ZU1lc3NhZ2VzKG9NZXNzYWdlKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cdFx0XHRyZXR1cm4gYUZpZWxkSW52YWxpZDtcblx0XHR9O1xuXHRcdGNvbnN0IG9Db250cm9sbGVyID0ge1xuXHRcdFx0aGFuZGxlQ2hhbmdlOiBmdW5jdGlvbiAob0V2ZW50OiBhbnkpIHtcblx0XHRcdFx0bWVzc2FnZUhhbmRsZXIucmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cdFx0XHRcdGNvbnN0IG9GaWVsZCA9IG9FdmVudC5nZXRTb3VyY2UoKTtcblx0XHRcdFx0Y29uc3Qgc0ZpZWxkSWQgPSBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwiaWRcIik7XG5cdFx0XHRcdGNvbnN0IG9GaWVsZFByb21pc2UgPSBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwicHJvbWlzZVwiKTtcblx0XHRcdFx0aWYgKG9GaWVsZFByb21pc2UpIHtcblx0XHRcdFx0XHRtRmllbGRWYWx1ZU1hcFtzRmllbGRJZF0gPSBvRmllbGRQcm9taXNlLnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIG9GaWVsZC5nZXRWYWx1ZSgpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdF92YWxpZGF0ZU1lc3NhZ2VzKGFBY3Rpb25QYXJhbWV0ZXJzLCBhRmllbGRJbnZhbGlkKTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZShcblx0XHRcdFhNTFByZXByb2Nlc3Nvci5wcm9jZXNzKFxuXHRcdFx0XHRvRnJhZ21lbnQsXG5cdFx0XHRcdHsgbmFtZTogc0ZyYWdtZW50TmFtZSB9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0YmluZGluZ0NvbnRleHRzOiB7XG5cdFx0XHRcdFx0XHRhY3Rpb246IG9BY3Rpb25Db250ZXh0LFxuXHRcdFx0XHRcdFx0YWN0aW9uTmFtZTogYWN0aW9uTmFtZUNvbnRleHQsXG5cdFx0XHRcdFx0XHRlbnRpdHlTZXQ6IGVudGl0eVNldENvbnRleHRcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdG1vZGVsczoge1xuXHRcdFx0XHRcdFx0YWN0aW9uOiBvQWN0aW9uQ29udGV4dC5nZXRNb2RlbCgpLFxuXHRcdFx0XHRcdFx0YWN0aW9uTmFtZTogYWN0aW9uTmFtZUNvbnRleHQuZ2V0TW9kZWwoKSxcblx0XHRcdFx0XHRcdGVudGl0eVNldDogZW50aXR5U2V0Q29udGV4dC5nZXRNb2RlbCgpLFxuXHRcdFx0XHRcdFx0bWV0YU1vZGVsOiBlbnRpdHlTZXRDb250ZXh0LmdldE1vZGVsKClcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdClcblx0XHQpXG5cdFx0XHQudGhlbihmdW5jdGlvbiAob0ZyYWdtZW50OiBhbnkpIHtcblx0XHRcdFx0Ly8gVE9ETzogbW92ZSB0aGUgZGlhbG9nIGludG8gdGhlIGZyYWdtZW50IGFuZCBtb3ZlIHRoZSBoYW5kbGVycyB0byB0aGUgb0NvbnRyb2xsZXJcblx0XHRcdFx0bGV0IGFDb250ZXh0czogYW55W107XG5cdFx0XHRcdGNvbnN0IGFGdW5jdGlvblBhcmFtczogYW55W10gPSBbXTtcblx0XHRcdFx0bGV0IG9PcGVyYXRpb25CaW5kaW5nOiBhbnk7XG5cdFx0XHRcdHJldHVybiBDb21tb25VdGlscy5zZXRVc2VyRGVmYXVsdHMob0FwcENvbXBvbmVudCwgYUFjdGlvblBhcmFtZXRlcnMsIG9QYXJhbWV0ZXJNb2RlbCwgdHJ1ZSkudGhlbihmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0Ly8gVE9ETzogbW92ZSB0aGUgZGlhbG9nIGludG8gdGhlIGZyYWdtZW50IGFuZCBtb3ZlIHRoZSBoYW5kbGVycyB0byB0aGUgb0NvbnRyb2xsZXJcblx0XHRcdFx0XHRyZXR1cm4gRnJhZ21lbnQubG9hZCh7IGRlZmluaXRpb246IG9GcmFnbWVudCwgY29udHJvbGxlcjogb0NvbnRyb2xsZXIgfSkudGhlbihmdW5jdGlvbiAob0RpYWxvZ0NvbnRlbnQ6IGFueSkge1xuXHRcdFx0XHRcdFx0Y29uc3Qgb1Jlc291cmNlQnVuZGxlID0gb1BhcmVudENvbnRyb2wuZ2V0Q29udHJvbGxlcigpLm9SZXNvdXJjZUJ1bmRsZTtcblx0XHRcdFx0XHRcdGNvbnN0IG9EaWFsb2cgPSBuZXcgRGlhbG9nKHVuZGVmaW5lZCwge1xuXHRcdFx0XHRcdFx0XHR0aXRsZTpcblx0XHRcdFx0XHRcdFx0XHRzQWN0aW9uTGFiZWwgfHxcblx0XHRcdFx0XHRcdFx0XHRDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcIkNfT1BFUkFUSU9OU19BQ1RJT05fUEFSQU1FVEVSX0RJQUxPR19USVRMRVwiLCBvUmVzb3VyY2VCdW5kbGUpLFxuXHRcdFx0XHRcdFx0XHRjb250ZW50OiBbb0RpYWxvZ0NvbnRlbnRdLFxuXHRcdFx0XHRcdFx0XHRlc2NhcGVIYW5kbGVyOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdFx0b0RpYWxvZy5jbG9zZSgpO1xuXHRcdFx0XHRcdFx0XHRcdG1lc3NhZ2VIYW5kbGVyLnJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcygpO1xuXHRcdFx0XHRcdFx0XHRcdHJlamVjdCgpO1xuXHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHRiZWdpbkJ1dHRvbjogbmV3IEJ1dHRvbihnZW5lcmF0ZShbXCJmZVwiLCBcIkFQRF9cIiwgc0FjdGlvbk5hbWUsIFwiQWN0aW9uXCIsIFwiT2tcIl0pLCB7XG5cdFx0XHRcdFx0XHRcdFx0dGV4dDogc0FjdGlvbkxhYmVsIHx8IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFwiQ19DT01NT05fRElBTE9HX09LXCIsIG9SZXNvdXJjZUJ1bmRsZSksXG5cdFx0XHRcdFx0XHRcdFx0dHlwZTogXCJFbXBoYXNpemVkXCIsXG5cdFx0XHRcdFx0XHRcdFx0cHJlc3M6IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0XHRcdHZhbGlkYXRlUmVxdWlyZWRQcm9wZXJ0aWVzKClcblx0XHRcdFx0XHRcdFx0XHRcdFx0LnRoZW4oZnVuY3Rpb24gKGFFbXB0eU1hbmRhdG9yeUZpZWxkczogYW55W10pIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoYUVtcHR5TWFuZGF0b3J5RmllbGRzLmxlbmd0aCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y29uc3Qgb01lc3NhZ2VzID0gW107XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGFFbXB0eU1hbmRhdG9yeUZpZWxkcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvTWVzc2FnZXMucHVzaCh7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0dGV4dDogQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcIkNfT1BFUkFUSU9OU19BQ1RJT05fUEFSQU1FVEVSX0RJQUxPR19NSVNTSU5HX01BTkRBVE9SWV9NU0dcIixcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFFbXB0eU1hbmRhdG9yeUZpZWxkc1tpXVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y29kZTogMjAwLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHR5cGU6IFwiRXJyb3JcIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG1lc3NhZ2VIYW5kbGVyLnNob3dNZXNzYWdlRGlhbG9nKHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y3VzdG9tTWVzc2FnZXM6IG9NZXNzYWdlc1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0YUZpZWxkSW52YWxpZCA9IF92YWxpZGF0ZU1lc3NhZ2VzKGFBY3Rpb25QYXJhbWV0ZXJzLCBhRmllbGRJbnZhbGlkKTtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChhRmllbGRJbnZhbGlkLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBtZXNzYWdlSGFuZGxpbmcuc2hvd1VuYm91bmRNZXNzYWdlcygpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRCdXN5TG9ja2VyLmxvY2sob0RpYWxvZyk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIFByb21pc2UuYWxsKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0T2JqZWN0LmtleXMobUZpZWxkVmFsdWVNYXApLm1hcChmdW5jdGlvbiAoc0tleTogc3RyaW5nKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBtRmllbGRWYWx1ZU1hcFtzS2V5XTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0LnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBUT0RPOiBkdWUgdG8gdXNpbmcgdGhlIHNlYXJjaCBhbmQgdmFsdWUgaGVscHMgb24gdGhlIGFjdGlvbiBkaWFsb2cgdHJhbnNpZW50IG1lc3NhZ2VzIGNvdWxkIGFwcGVhclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyB3ZSBuZWVkIGFuIFVYIGRlc2lnbiBmb3IgdGhvc2UgdG8gc2hvdyB0aGVtIHRvIHRoZSB1c2VyIC0gZm9yIG5vdyByZW1vdmUgdGhlbSBiZWZvcmUgY29udGludWluZ1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRtZXNzYWdlSGFuZGxlci5yZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gbW92ZSBwYXJhbWV0ZXIgdmFsdWVzIGZyb20gRGlhbG9nIChTaW1wbGVGb3JtKSB0byBtUGFyYW1ldGVycy5hY3Rpb25QYXJhbWV0ZXJzIHNvIHRoYXQgdGhleSBhcmUgYXZhaWxhYmxlIGluIHRoZSBvcGVyYXRpb24gYmluZGluZ3MgZm9yIGFsbCBjb250ZXh0c1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRsZXQgdlBhcmFtZXRlclZhbHVlO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBvUGFyYW1ldGVyQ29udGV4dCA9IG9PcGVyYXRpb25CaW5kaW5nICYmIG9PcGVyYXRpb25CaW5kaW5nLmdldFBhcmFtZXRlckNvbnRleHQoKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Zm9yIChjb25zdCBpIGluIGFBY3Rpb25QYXJhbWV0ZXJzKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKGFBY3Rpb25QYXJhbWV0ZXJzW2ldLiRpc0NvbGxlY3Rpb24pIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IGFNVkZDb250ZW50ID0gb0RpYWxvZ1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC5nZXRNb2RlbChcIm12ZnZpZXdcIilcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQuZ2V0UHJvcGVydHkoXCIvXCIgKyBhQWN0aW9uUGFyYW1ldGVyc1tpXS4kTmFtZSksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFLZXlWYWx1ZXMgPSBbXTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGZvciAoY29uc3QgaiBpbiBhTVZGQ29udGVudCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhS2V5VmFsdWVzLnB1c2goYU1WRkNvbnRlbnRbal0uS2V5KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHZQYXJhbWV0ZXJWYWx1ZSA9IGFLZXlWYWx1ZXM7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHZQYXJhbWV0ZXJWYWx1ZSA9IG9QYXJhbWV0ZXJDb250ZXh0LmdldFByb3BlcnR5KGFBY3Rpb25QYXJhbWV0ZXJzW2ldLiROYW1lKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YUFjdGlvblBhcmFtZXRlcnNbaV0udmFsdWUgPSB2UGFyYW1ldGVyVmFsdWU7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0dlBhcmFtZXRlclZhbHVlID0gdW5kZWZpbmVkO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmxhYmVsID0gc0FjdGlvbkxhYmVsO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gX2V4ZWN1dGVBY3Rpb24ob0FwcENvbXBvbmVudCwgbVBhcmFtZXRlcnMpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0LnRoZW4oZnVuY3Rpb24gKG9PcGVyYXRpb246IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0b0RpYWxvZy5jbG9zZSgpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmVzb2x2ZShvT3BlcmF0aW9uKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGxldCBtZXNzYWdlcyA9IG1lc3NhZ2VIYW5kbGluZy5nZXRNZXNzYWdlcygpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0bWVzc2FnZXMgPSBtZXNzYWdlcy5jb25jYXQobWVzc2FnZUhhbmRsaW5nLmdldE1lc3NhZ2VzKHRydWUsIHRydWUpKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0IW1QYXJhbWV0ZXJzLmJHcm91cGVkICYmXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCEoIW1QYXJhbWV0ZXJzLmNvbnRyb2wuaXNBKFwic2FwLnVpLm1kYy5UYWJsZVwiKSAmJiBhQ29udGV4dHMubGVuZ3RoID09PSAxKSAmJlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRtZXNzYWdlcy5sZW5ndGhcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvRGlhbG9nLmNsb3NlKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0aHJvdyBvRXJyb3I7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y29uc3Qgb01lc3NhZ2VNYW5hZ2VyID0gQ29yZS5nZXRNZXNzYWdlTWFuYWdlcigpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRsZXQgbWVzc2FnZXMgPSBvTWVzc2FnZU1hbmFnZXIuZ2V0TWVzc2FnZU1vZGVsKCkuZ2V0RGF0YSgpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBzdWJ0aXRsZUNvbHVtbiA9IENvbW1vblV0aWxzLmdldE1lc3NhZ2VDb2x1bW4obVBhcmFtZXRlcnMuY29udHJvbCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGxldCBlcnJvckNvbnRleHQgPSB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGxldCBlcnJvclRhcmdldHNJbkFQTSA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRsZXQgYlNob3dNZXNzYWdlQm94ID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG1lc3NhZ2VzLmZvckVhY2goZnVuY3Rpb24gKG1lc3NhZ2U6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IG1lc3NhZ2VUYXJnZXRzID0gbWVzc2FnZS5nZXRUYXJnZXRzKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKG1lc3NhZ2VUYXJnZXRzICYmIG1lc3NhZ2VUYXJnZXRzLmxlbmd0aCA9PT0gMSAmJiBtZXNzYWdlVGFyZ2V0c1swXS5sZW5ndGgpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGVycm9yQ29udGV4dCA9IGFDb250ZXh0cy5maW5kKGZ1bmN0aW9uIChvQ29udGV4dDogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBtZXNzYWdlLmdldFRhcmdldCgpLmluZGV4T2Yob0NvbnRleHQuZ2V0UGF0aCgpKSAhPT0gLTE7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG1lc3NhZ2UuYWRkaXRpb25hbFRleHQgPSBlcnJvckNvbnRleHRcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PyBlcnJvckNvbnRleHQuZ2V0T2JqZWN0KClbc3VidGl0bGVDb2x1bW5dXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDogdW5kZWZpbmVkO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG1lc3NhZ2UuZ2V0VGFyZ2V0KCkuaW5kZXhPZihtUGFyYW1ldGVycy5hY3Rpb25OYW1lKSAhPT0gLTEgJiZcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG1lc3NhZ2UuZ2V0VGFyZ2V0KCkuaW5kZXhPZihtUGFyYW1ldGVycy5hQWN0aW9uUGFyYW1ldGVyc1swXS4kTmFtZSkgIT09IC0xICYmXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRlcnJvclRhcmdldHNJbkFQTSA9PT0gZmFsc2Vcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGVycm9yVGFyZ2V0c0luQVBNID0gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRtZXNzYWdlcy5sZW5ndGggPT09IDEgJiZcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRtZXNzYWdlc1swXS5nZXRUYXJnZXQoKSAhPT0gdW5kZWZpbmVkICYmXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0bWVzc2FnZXNbMF0uZ2V0VGFyZ2V0KCkgIT09IFwiXCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YlNob3dNZXNzYWdlQm94ID0gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IGJIYXNFdGFnTWVzc2FnZSA9IG1lc3NhZ2VIYW5kbGluZy5tb2RpZnlFVGFnTWVzc2FnZXNPbmx5KFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9NZXNzYWdlTWFuYWdlcixcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGUsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0dW5kZWZpbmVkXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0bWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VzKHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRiSGFzRXRhZ01lc3NhZ2U6IGJIYXNFdGFnTWVzc2FnZSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjb250ZXh0OiBtUGFyYW1ldGVycy5hQ29udGV4dHNbMF0sXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aXNBY3Rpb25QYXJhbWV0ZXJEaWFsb2dPcGVuOiBvRGlhbG9nLmlzT3BlbigpLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG1lc3NhZ2VQYWdlTmF2aWdhdGlvbkNhbGxiYWNrOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvRGlhbG9nLmNsb3NlKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRlcnJvclRhcmdldHNJbkFQTTogZXJyb3JUYXJnZXRzSW5BUE0sXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YlNob3dNZXNzYWdlQm94OiBiU2hvd01lc3NhZ2VCb3hcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChvRGlhbG9nICYmIGJIYXNFdGFnTWVzc2FnZSAmJiBvRGlhbG9nLmlzT3BlbigpKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0b0RpYWxvZy5jbG9zZSgpOyAvL2Nsb3NlIHRoZSBhY3Rpb24gcGFyYW1ldGVyIGRpYWxvZyBhZnRlciByZWZyZXNoIG9mIHRoZSBjb250ZXh0IGFmdGVyIGV0YWcgbWlzbWF0Y2hcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC5maW5hbGx5KGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0QnVzeUxvY2tlci51bmxvY2sob0RpYWxvZyk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gbWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VEaWFsb2coKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9KSxcblx0XHRcdFx0XHRcdFx0ZW5kQnV0dG9uOiBuZXcgQnV0dG9uKGdlbmVyYXRlKFtcImZlXCIsIFwiQVBEX1wiLCBzQWN0aW9uTmFtZSwgXCJBY3Rpb25cIiwgXCJDYW5jZWxcIl0pLCB7XG5cdFx0XHRcdFx0XHRcdFx0dGV4dDogQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXCJDX0NPTU1PTl9BQ1RJT05fUEFSQU1FVEVSX0RJQUxPR19DQU5DRUxcIiwgb1Jlc291cmNlQnVuZGxlKSxcblx0XHRcdFx0XHRcdFx0XHRwcmVzczogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0X3ZhbGlkYXRlTWVzc2FnZXMoYUFjdGlvblBhcmFtZXRlcnMsIGFGaWVsZEludmFsaWQsIHRydWUpO1xuXHRcdFx0XHRcdFx0XHRcdFx0b0RpYWxvZy5jbG9zZSgpO1xuXHRcdFx0XHRcdFx0XHRcdFx0bWVzc2FnZUhhbmRsZXIucmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRyZWplY3QoQ29uc3RhbnRzLkNhbmNlbEFjdGlvbkRpYWxvZyk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9KSxcblx0XHRcdFx0XHRcdFx0YmVmb3JlT3BlbjogZnVuY3Rpb24gKG9FdmVudDogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gY2xvbmUgZXZlbnQgZm9yIGFjdGlvbldyYXBwZXIgYXMgb0V2ZW50Lm9Tb3VyY2UgZ2V0cyBsb3N0IGR1cmluZyBwcm9jZXNzaW5nIG9mIGJlZm9yZU9wZW4gZXZlbnQgaGFuZGxlclxuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IG9DbG9uZUV2ZW50ID0gT2JqZWN0LmFzc2lnbih7fSwgb0V2ZW50KTtcblxuXHRcdFx0XHRcdFx0XHRcdG1lc3NhZ2VIYW5kbGVyLnJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcygpO1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IGdldERlZmF1bHRWYWx1ZXNGdW5jdGlvbiA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvRGlhbG9nLmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHNBY3Rpb25QYXRoID0gb0FjdGlvbkNvbnRleHQuc1BhdGggJiYgb0FjdGlvbkNvbnRleHQuc1BhdGguc3BsaXQoXCIvQFwiKVswXSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0c0RlZmF1bHRWYWx1ZXNGdW5jdGlvbiA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHNBY3Rpb25QYXRoICsgXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRlZmF1bHRWYWx1ZXNGdW5jdGlvblwiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gc0RlZmF1bHRWYWx1ZXNGdW5jdGlvbjtcblx0XHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IGZuU2V0RGVmYXVsdHNBbmRPcGVuRGlhbG9nID0gZnVuY3Rpb24gKHNCaW5kaW5nUGFyYW1ldGVyPzogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBzQm91bmRGdW5jdGlvbk5hbWUgPSBnZXREZWZhdWx0VmFsdWVzRnVuY3Rpb24oKTtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IHByZWZpbGxQYXJhbWV0ZXIgPSBmdW5jdGlvbiAoc1BhcmFtTmFtZTogYW55LCB2UGFyYW1EZWZhdWx0VmFsdWU6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBDYXNlIDE6IFRoZXJlIGlzIGEgUGFyYW1ldGVyRGVmYXVsdFZhbHVlIGFubm90YXRpb25cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAodlBhcmFtRGVmYXVsdFZhbHVlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChhQ29udGV4dHMubGVuZ3RoID4gMCAmJiB2UGFyYW1EZWZhdWx0VmFsdWUuJFBhdGgpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y29uc3Qgb1Byb21pc2UgPSBDb21tb25VdGlscy5yZXF1ZXN0U2luZ2xldG9uUHJvcGVydHkoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0dlBhcmFtRGVmYXVsdFZhbHVlLiRQYXRoLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9PcGVyYXRpb25CaW5kaW5nLmdldE1vZGVsKClcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0b1Byb21pc2Vcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQudGhlbihmdW5jdGlvbiAob1ZhbHVlOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChvVmFsdWUgPT09IG51bGwpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG9PcGVyYXRpb25CaW5kaW5nXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0LmdldFBhcmFtZXRlckNvbnRleHQoKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC5yZXF1ZXN0UHJvcGVydHkodlBhcmFtRGVmYXVsdFZhbHVlLiRQYXRoKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBvVmFsdWU7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQudGhlbihmdW5jdGlvbiAodlBhcmFtVmFsdWU6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKGFDb250ZXh0cy5sZW5ndGggPiAxKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIEZvciBtdWx0aSBzZWxlY3QsIG5lZWQgdG8gbG9vcCBvdmVyIGFDb250ZXh0cyAoYXMgY29udGV4dHMgY2Fubm90IGJlIHJldHJpZXZlZCB2aWEgYmluZGluZyBwYXJhbWV0ZXIgb2YgdGhlIG9wZXJhdGlvbiBiaW5kaW5nKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRsZXQgc1BhdGhGb3JDb250ZXh0ID0gdlBhcmFtRGVmYXVsdFZhbHVlLiRQYXRoO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoc1BhdGhGb3JDb250ZXh0LmluZGV4T2Yoc0JpbmRpbmdQYXJhbWV0ZXIgKyBcIi9cIikgPT09IDApIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRzUGF0aEZvckNvbnRleHQgPSBzUGF0aEZvckNvbnRleHQucmVwbGFjZShzQmluZGluZ1BhcmFtZXRlciArIFwiL1wiLCBcIlwiKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRmb3IgKGxldCBpID0gMTsgaSA8IGFDb250ZXh0cy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChhQ29udGV4dHNbaV0uZ2V0UHJvcGVydHkoc1BhdGhGb3JDb250ZXh0KSAhPT0gdlBhcmFtVmFsdWUpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIGlmIHRoZSB2YWx1ZXMgZnJvbSB0aGUgY29udGV4dHMgYXJlIG5vdCBhbGwgdGhlIHNhbWUsIGRvIG5vdCBwcmVmaWxsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXNvbHZlKHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cGFyYW1OYW1lOiBzUGFyYW1OYW1lLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR2YWx1ZTogdW5kZWZpbmVkLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRiTm9Qb3NzaWJsZVZhbHVlOiB0cnVlXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJlc29sdmUoeyBwYXJhbU5hbWU6IHNQYXJhbU5hbWUsIHZhbHVlOiB2UGFyYW1WYWx1ZSB9KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBTaW1wbHkgY2xlYXIgcGFyYW1ldGVyIGRlZmF1bHQgaWYgYW4gZXJyb3IgaGFzIG9jY3VycmVkXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRMb2cuZXJyb3IoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFwiRXJyb3Igd2hpbGUgcmVhZGluZyBkZWZhdWx0IGFjdGlvbiBwYXJhbWV0ZXJcIixcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0c1BhcmFtTmFtZSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMuYWN0aW9uTmFtZVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJlc29sdmUoe1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRwYXJhbU5hbWU6IHNQYXJhbU5hbWUsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHZhbHVlOiB1bmRlZmluZWQsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGJMYXRlUHJvcGVydHlFcnJvcjogdHJ1ZVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBDYXNlIDEuMjogUGFyYW1ldGVyRGVmYXVsdFZhbHVlIGRlZmluZXMgYSBmaXhlZCBzdHJpbmcgdmFsdWUgKGkuZS4gdlBhcmFtRGVmYXVsdFZhbHVlID0gJ3NvbWVTdHJpbmcnKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXNvbHZlKHsgcGFyYW1OYW1lOiBzUGFyYW1OYW1lLCB2YWx1ZTogdlBhcmFtRGVmYXVsdFZhbHVlIH0pO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBDYXNlIDI6IFRoZXJlIGlzIG5vIFBhcmFtZXRlckRlZmF1bHRWYWx1ZSBhbm5vdGF0aW9uICg9PiBsb29rIGludG8gdGhlIEZMUCBVc2VyIERlZmF1bHRzKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKG9QYXJhbWV0ZXJNb2RlbCAmJiAob1BhcmFtZXRlck1vZGVsIGFzIGFueSkub0RhdGFbc1BhcmFtTmFtZV0pIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmVzb2x2ZSh7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cGFyYW1OYW1lOiBzUGFyYW1OYW1lLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHZhbHVlOiAob1BhcmFtZXRlck1vZGVsIGFzIGFueSkub0RhdGFbc1BhcmFtTmFtZV1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXNvbHZlKHsgcGFyYW1OYW1lOiBzUGFyYW1OYW1lLCB2YWx1ZTogdW5kZWZpbmVkIH0pO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9O1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBnZXRQYXJhbWV0ZXJEZWZhdWx0VmFsdWUgPSBmdW5jdGlvbiAoc1BhcmFtTmFtZTogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvRGlhbG9nLmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0c0FjdGlvblBhdGggPSBvQWN0aW9uQ29udGV4dC5zUGF0aCAmJiBvQWN0aW9uQ29udGV4dC5zUGF0aC5zcGxpdChcIi9AXCIpWzBdLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHNBY3Rpb25QYXJhbWV0ZXJBbm5vdGF0aW9uVGFyZ2V0ID0gc0FjdGlvblBhdGggKyBcIi9cIiArIHNQYXJhbU5hbWUgKyBcIkBcIixcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvUGFyYW1ldGVyQW5ub3RhdGlvbnMgPSBvTWV0YU1vZGVsLmdldE9iamVjdChzQWN0aW9uUGFyYW1ldGVyQW5ub3RhdGlvblRhcmdldCksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0b1BhcmFtZXRlckRlZmF1bHRWYWx1ZSA9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvUGFyYW1ldGVyQW5ub3RhdGlvbnMgJiZcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9QYXJhbWV0ZXJBbm5vdGF0aW9uc1tcIkBjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5QYXJhbWV0ZXJEZWZhdWx0VmFsdWVcIl07IC8vIGVpdGhlciB7ICRQYXRoOiAnc29tZVBhdGgnIH0gb3IgJ3NvbWVTdHJpbmcnXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBvUGFyYW1ldGVyRGVmYXVsdFZhbHVlO1xuXHRcdFx0XHRcdFx0XHRcdFx0fTtcblxuXHRcdFx0XHRcdFx0XHRcdFx0Y29uc3QgYUN1cnJlbnRQYXJhbURlZmF1bHRWYWx1ZSA9IFtdO1xuXHRcdFx0XHRcdFx0XHRcdFx0bGV0IHNQYXJhbU5hbWUsIHZQYXJhbWV0ZXJEZWZhdWx0VmFsdWU7XG5cdFx0XHRcdFx0XHRcdFx0XHRmb3IgKGNvbnN0IGkgaW4gYUFjdGlvblBhcmFtZXRlcnMpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0c1BhcmFtTmFtZSA9IGFBY3Rpb25QYXJhbWV0ZXJzW2ldLiROYW1lO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR2UGFyYW1ldGVyRGVmYXVsdFZhbHVlID0gZ2V0UGFyYW1ldGVyRGVmYXVsdFZhbHVlKHNQYXJhbU5hbWUpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRhQ3VycmVudFBhcmFtRGVmYXVsdFZhbHVlLnB1c2gocHJlZmlsbFBhcmFtZXRlcihzUGFyYW1OYW1lLCB2UGFyYW1ldGVyRGVmYXVsdFZhbHVlKSk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRcdGlmIChvQWN0aW9uQ29udGV4dC5nZXRPYmplY3QoXCIkSXNCb3VuZFwiKSAmJiBhQ29udGV4dHMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoc0JvdW5kRnVuY3Rpb25OYW1lICYmIHNCb3VuZEZ1bmN0aW9uTmFtZS5sZW5ndGggPiAwICYmIHR5cGVvZiBzQm91bmRGdW5jdGlvbk5hbWUgPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRmb3IgKGNvbnN0IGkgaW4gYUNvbnRleHRzKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhRnVuY3Rpb25QYXJhbXMucHVzaChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y2FsbEJvdW5kRnVuY3Rpb24oc0JvdW5kRnVuY3Rpb25OYW1lLCBhQ29udGV4dHNbaV0sIG1QYXJhbWV0ZXJzLm1vZGVsKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdFx0Y29uc3QgYVByZWZpbGxQYXJhbVByb21pc2VzID0gUHJvbWlzZS5hbGwoYUN1cnJlbnRQYXJhbURlZmF1bHRWYWx1ZSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRsZXQgYUV4ZWNGdW5jdGlvblByb21pc2VzOiBQcm9taXNlPGFueVtdPiA9IFByb21pc2UucmVzb2x2ZShbXSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRsZXQgb0V4ZWNGdW5jdGlvbkZyb21NYW5pZmVzdFByb21pc2U7XG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoYUZ1bmN0aW9uUGFyYW1zICYmIGFGdW5jdGlvblBhcmFtcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGFFeGVjRnVuY3Rpb25Qcm9taXNlcyA9IFByb21pc2UuYWxsKGFGdW5jdGlvblBhcmFtcyk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAobVBhcmFtZXRlcnMuZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IHNNb2R1bGUgPSBtUGFyYW1ldGVycy5kZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb25cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC5zdWJzdHJpbmcoMCwgbVBhcmFtZXRlcnMuZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uLmxhc3RJbmRleE9mKFwiLlwiKSB8fCAtMSlcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC5yZXBsYWNlKC9cXC4vZ2ksIFwiL1wiKSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRzRnVuY3Rpb25OYW1lID0gbVBhcmFtZXRlcnMuZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uLnN1YnN0cmluZyhcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbi5sYXN0SW5kZXhPZihcIi5cIikgKyAxLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMuZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uLmxlbmd0aFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdG9FeGVjRnVuY3Rpb25Gcm9tTWFuaWZlc3RQcm9taXNlID0gRlBNSGVscGVyLmFjdGlvbldyYXBwZXIob0Nsb25lRXZlbnQsIHNNb2R1bGUsIHNGdW5jdGlvbk5hbWUsIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcImNvbnRleHRzXCI6IGFDb250ZXh0c1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdFx0UHJvbWlzZS5hbGwoW2FQcmVmaWxsUGFyYW1Qcm9taXNlcywgYUV4ZWNGdW5jdGlvblByb21pc2VzLCBvRXhlY0Z1bmN0aW9uRnJvbU1hbmlmZXN0UHJvbWlzZV0pXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC50aGVuKGZ1bmN0aW9uIChhUHJvbWlzZXM6IFthbnlbXSwgYW55W10sIGFueV0pIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBhQ3VycmVudFBhcmFtRGVmYXVsdFZhbHVlOiBhbnkgPSBhUHJvbWlzZXNbMF07XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y29uc3QgYUZ1bmN0aW9uUGFyYW1zID0gYVByb21pc2VzWzFdO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IG9GdW5jdGlvblBhcmFtc0Zyb21NYW5pZmVzdCA9IGFQcm9taXNlc1syXTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRsZXQgc0RpYWxvZ1BhcmFtTmFtZTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRmb3IgKGNvbnN0IGkgaW4gYUFjdGlvblBhcmFtZXRlcnMpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHNEaWFsb2dQYXJhbU5hbWUgPSBhQWN0aW9uUGFyYW1ldGVyc1tpXS4kTmFtZTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0b0Z1bmN0aW9uUGFyYW1zRnJvbU1hbmlmZXN0ICYmXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9GdW5jdGlvblBhcmFtc0Zyb21NYW5pZmVzdC5oYXNPd25Qcm9wZXJ0eShzRGlhbG9nUGFyYW1OYW1lKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9PcGVyYXRpb25CaW5kaW5nLnNldFBhcmFtZXRlcihcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhQWN0aW9uUGFyYW1ldGVyc1tpXS4kTmFtZSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvRnVuY3Rpb25QYXJhbXNGcm9tTWFuaWZlc3Rbc0RpYWxvZ1BhcmFtTmFtZV1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFDdXJyZW50UGFyYW1EZWZhdWx0VmFsdWVbaV0gJiZcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YUN1cnJlbnRQYXJhbURlZmF1bHRWYWx1ZVtpXS52YWx1ZSAhPT0gdW5kZWZpbmVkXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0b09wZXJhdGlvbkJpbmRpbmcuc2V0UGFyYW1ldGVyKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFBY3Rpb25QYXJhbWV0ZXJzW2ldLiROYW1lLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFDdXJyZW50UGFyYW1EZWZhdWx0VmFsdWVbaV0udmFsdWVcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gaWYgdGhlIGRlZmF1bHQgdmFsdWUgaGFkIG5vdCBiZWVuIHByZXZpb3VzbHkgZGV0ZXJtaW5lZCBkdWUgdG8gZGlmZmVyZW50IGNvbnRleHRzLCB3ZSBkbyBub3RoaW5nIGVsc2Vcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoc0JvdW5kRnVuY3Rpb25OYW1lICYmICFhQ3VycmVudFBhcmFtRGVmYXVsdFZhbHVlW2ldLmJOb1Bvc3NpYmxlVmFsdWUpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKGFDb250ZXh0cy5sZW5ndGggPiAxKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gd2UgY2hlY2sgaWYgdGhlIGZ1bmN0aW9uIHJldHJpZXZlcyB0aGUgc2FtZSBwYXJhbSB2YWx1ZSBmb3IgYWxsIHRoZSBjb250ZXh0czpcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRsZXQgaiA9IDA7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0d2hpbGUgKGogPCBhQ29udGV4dHMubGVuZ3RoIC0gMSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhRnVuY3Rpb25QYXJhbXNbal0gJiZcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YUZ1bmN0aW9uUGFyYW1zW2ogKyAxXSAmJlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhRnVuY3Rpb25QYXJhbXNbal0uZ2V0T2JqZWN0KHNEaWFsb2dQYXJhbU5hbWUpID09PVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFGdW5jdGlvblBhcmFtc1tqICsgMV0uZ2V0T2JqZWN0KHNEaWFsb2dQYXJhbU5hbWUpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aisrO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vcGFyYW0gdmFsdWVzIGFyZSBhbGwgdGhlIHNhbWU6XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKGogPT09IGFDb250ZXh0cy5sZW5ndGggLSAxKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvT3BlcmF0aW9uQmluZGluZy5zZXRQYXJhbWV0ZXIoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFBY3Rpb25QYXJhbWV0ZXJzW2ldLiROYW1lLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhRnVuY3Rpb25QYXJhbXNbal0uZ2V0T2JqZWN0KHNEaWFsb2dQYXJhbU5hbWUpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvL09ubHkgb25lIGNvbnRleHQsIHRoZW4gdGhlIGRlZmF1bHQgcGFyYW0gdmFsdWVzIGFyZSB0byBiZSB2ZXJpZmllZCBmcm9tIHRoZSBmdW5jdGlvbjpcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChhRnVuY3Rpb25QYXJhbXNbMF0gJiYgYUZ1bmN0aW9uUGFyYW1zWzBdLmdldE9iamVjdChzRGlhbG9nUGFyYW1OYW1lKSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0b09wZXJhdGlvbkJpbmRpbmcuc2V0UGFyYW1ldGVyKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhQWN0aW9uUGFyYW1ldGVyc1tpXS4kTmFtZSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YUZ1bmN0aW9uUGFyYW1zWzBdLmdldE9iamVjdChzRGlhbG9nUGFyYW1OYW1lKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y29uc3QgYkVycm9yRm91bmQgPSBhQ3VycmVudFBhcmFtRGVmYXVsdFZhbHVlLnNvbWUoZnVuY3Rpb24gKG9WYWx1ZTogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAob1ZhbHVlLmJMYXRlUHJvcGVydHlFcnJvcikge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gb1ZhbHVlLmJMYXRlUHJvcGVydHlFcnJvcjtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBJZiBhdCBsZWFzdCBvbmUgRGVmYXVsdCBQcm9wZXJ0eSBpcyBhIExhdGUgUHJvcGVydHkgYW5kIGFuIGVUYWcgZXJyb3Igd2FzIHJhaXNlZC5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoYkVycm9yRm91bmQpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IHNUZXh0ID0gQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFwiQ19BUFBfQ09NUE9ORU5UX1NBUEZFX0VUQUdfTEFURV9QUk9QRVJUWVwiLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGVcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRNZXNzYWdlQm94Lndhcm5pbmcoc1RleHQsIHsgY29udGVudFdpZHRoOiBcIjI1ZW1cIiB9IGFzIGFueSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQuY2F0Y2goKTtcblx0XHRcdFx0XHRcdFx0XHR9O1xuXG5cdFx0XHRcdFx0XHRcdFx0aWYgKG9BY3Rpb25Db250ZXh0LmdldE9iamVjdChcIiRJc0JvdW5kXCIpICYmIGFDb250ZXh0cy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBhUGFyYW1ldGVycyA9IG9BY3Rpb25Db250ZXh0LmdldE9iamVjdChcIiRQYXJhbWV0ZXJcIiksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHNCaW5kaW5nUGFyYW1ldGVyID0gYVBhcmFtZXRlcnNbMF0gJiYgYVBhcmFtZXRlcnNbMF0uJE5hbWU7XG5cdFx0XHRcdFx0XHRcdFx0XHRhQ29udGV4dHNbMF1cblx0XHRcdFx0XHRcdFx0XHRcdFx0LnJlcXVlc3RPYmplY3QoKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQudGhlbihmdW5jdGlvbiAob0NvbnRleHRPYmplY3Q6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChvQ29udGV4dE9iamVjdCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0b09wZXJhdGlvbkJpbmRpbmcuc2V0UGFyYW1ldGVyKHNCaW5kaW5nUGFyYW1ldGVyLCBvQ29udGV4dE9iamVjdCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGZuU2V0RGVmYXVsdHNBbmRPcGVuRGlhbG9nKHNCaW5kaW5nUGFyYW1ldGVyKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHJldHJpZXZpbmcgdGhlIHBhcmFtZXRlclwiLCBvRXJyb3IpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0Zm5TZXREZWZhdWx0c0FuZE9wZW5EaWFsb2coKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdGFmdGVyQ2xvc2U6IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0XHRvRGlhbG9nLmRlc3Ryb3koKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRhRm9ybUVsZW1lbnRzID0gb0RpYWxvZ0NvbnRlbnRcblx0XHRcdFx0XHRcdFx0LmdldEFnZ3JlZ2F0aW9uKFwiZm9ybVwiKVxuXHRcdFx0XHRcdFx0XHQuZ2V0QWdncmVnYXRpb24oXCJmb3JtQ29udGFpbmVyc1wiKVswXVxuXHRcdFx0XHRcdFx0XHQuZ2V0QWdncmVnYXRpb24oXCJmb3JtRWxlbWVudHNcIik7XG5cdFx0XHRcdFx0XHRvRGlhbG9nLnNldE1vZGVsKG9BY3Rpb25Db250ZXh0LmdldE1vZGVsKCkub01vZGVsKTtcblx0XHRcdFx0XHRcdG9EaWFsb2cuc2V0TW9kZWwob1BhcmFtZXRlck1vZGVsLCBcInBhcmFtc01vZGVsXCIpO1xuXHRcdFx0XHRcdFx0b0RpYWxvZy5iaW5kRWxlbWVudCh7XG5cdFx0XHRcdFx0XHRcdHBhdGg6IFwiL1wiLFxuXHRcdFx0XHRcdFx0XHRtb2RlbDogXCJwYXJhbXNNb2RlbFwiXG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdC8vIGVtcHR5IG1vZGVsIHRvIGFkZCBlbGVtZW50cyBkeW5hbWljYWxseSBkZXBlbmRpbmcgb24gbnVtYmVyIG9mIE1WRiBmaWVsZHMgZGVmaW5lZCBvbiB0aGUgZGlhbG9nXG5cdFx0XHRcdFx0XHRjb25zdCBvTVZGTW9kZWwgPSBuZXcgSlNPTk1vZGVsKHt9KTtcblx0XHRcdFx0XHRcdG9EaWFsb2cuc2V0TW9kZWwob01WRk1vZGVsLCBcIm12ZnZpZXdcIik7XG5cblx0XHRcdFx0XHRcdGxldCBzQWN0aW9uUGF0aCA9IHNBY3Rpb25OYW1lICsgXCIoLi4uKVwiO1xuXHRcdFx0XHRcdFx0YUNvbnRleHRzID0gbVBhcmFtZXRlcnMuYUNvbnRleHRzIHx8IFtdO1xuXHRcdFx0XHRcdFx0aWYgKCFhQ29udGV4dHMubGVuZ3RoKSB7XG5cdFx0XHRcdFx0XHRcdHNBY3Rpb25QYXRoID0gXCIvXCIgKyBzQWN0aW9uUGF0aDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdG9EaWFsb2cuYmluZEVsZW1lbnQoe1xuXHRcdFx0XHRcdFx0XHRwYXRoOiBzQWN0aW9uUGF0aFxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRpZiAob1BhcmVudENvbnRyb2wpIHtcblx0XHRcdFx0XHRcdFx0Ly8gaWYgdGhlcmUgaXMgYSBwYXJlbnQgY29udHJvbCBzcGVjaWZpZWQgYWRkIHRoZSBkaWFsb2cgYXMgZGVwZW5kZW50XG5cdFx0XHRcdFx0XHRcdG9QYXJlbnRDb250cm9sLmFkZERlcGVuZGVudChvRGlhbG9nKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGlmIChhQ29udGV4dHMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdFx0XHRvRGlhbG9nLnNldEJpbmRpbmdDb250ZXh0KGFDb250ZXh0c1swXSk7IC8vIHVzZSBjb250ZXh0IG9mIGZpcnN0IHNlbGVjdGVkIGxpbmUgaXRlbVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0b09wZXJhdGlvbkJpbmRpbmcgPSBvRGlhbG9nLmdldE9iamVjdEJpbmRpbmcoKTtcblx0XHRcdFx0XHRcdG9EaWFsb2cub3BlbigpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9KTtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2gocmVqZWN0KTtcblx0fSk7XG59XG5mdW5jdGlvbiBwcmVwYXJlQWN0aW9uUGFyYW1ldGVycyhvQWN0aW9uOiBhbnksIGFQcmVkZWZpbmVkUGFyYW1ldGVyczogYW55KSB7XG5cdC8vIGNoZWNrIGlmIHBhcmFtZXRlcnMgZXhpc3QgYXQgYWxsXG5cdGNvbnN0IGFQYXJhbWV0ZXJzID0gZ2V0QWN0aW9uUGFyYW1ldGVycyhvQWN0aW9uKTtcblx0YVByZWRlZmluZWRQYXJhbWV0ZXJzID0gYVByZWRlZmluZWRQYXJhbWV0ZXJzIHx8IFtdO1xuXG5cdGlmIChhUHJlZGVmaW5lZFBhcmFtZXRlcnMubGVuZ3RoID4gMCkge1xuXHRcdC8vIFRPRE86IG1lcmdlIHRoZSBwcmVkZWZpbmVkIG9uY2Ugd2l0aCB0aGUgcmVhbCBleGlzdGluZyBvbmVcblx0fVxuXG5cdHJldHVybiBhUGFyYW1ldGVycztcbn1cbmZ1bmN0aW9uIGdldEFjdGlvblBhcmFtZXRlcnMob0FjdGlvbjogYW55KSB7XG5cdGNvbnN0IGFQYXJhbWV0ZXJzID0gb0FjdGlvbi5nZXRPYmplY3QoXCIkUGFyYW1ldGVyXCIpIHx8IFtdO1xuXHRpZiAoYVBhcmFtZXRlcnMgJiYgYVBhcmFtZXRlcnMubGVuZ3RoKSB7XG5cdFx0aWYgKG9BY3Rpb24uZ2V0T2JqZWN0KFwiJElzQm91bmRcIikpIHtcblx0XHRcdC8vaW4gY2FzZSBvZiBib3VuZCBhY3Rpb25zLCBpZ25vcmUgdGhlIGZpcnN0IHBhcmFtZXRlciBhbmQgY29uc2lkZXIgdGhlIHJlc3Rcblx0XHRcdHJldHVybiBhUGFyYW1ldGVycy5zbGljZSgxLCBhUGFyYW1ldGVycy5sZW5ndGgpIHx8IFtdO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gYVBhcmFtZXRlcnM7XG59XG5mdW5jdGlvbiBnZXRJc0FjdGlvbkNyaXRpY2FsKG9NZXRhTW9kZWw6IGFueSwgc1BhdGg6IGFueSwgY29udGV4dHM/OiBhbnksIG9Cb3VuZEFjdGlvbj86IGFueSkge1xuXHRjb25zdCB2QWN0aW9uQ3JpdGljYWwgPSBvTWV0YU1vZGVsLmdldE9iamVjdChzUGF0aCArIFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5Jc0FjdGlvbkNyaXRpY2FsXCIpO1xuXHRsZXQgc0NyaXRpY2FsUGF0aCA9IHZBY3Rpb25Dcml0aWNhbCAmJiB2QWN0aW9uQ3JpdGljYWwuJFBhdGg7XG5cdGlmICghc0NyaXRpY2FsUGF0aCkge1xuXHRcdC8vIHRoZSBzdGF0aWMgdmFsdWUgc2NlbmFyaW8gZm9yIGlzQWN0aW9uQ3JpdGljYWxcblx0XHRyZXR1cm4gISF2QWN0aW9uQ3JpdGljYWw7XG5cdH1cblx0Y29uc3QgYUJpbmRpbmdQYXJhbXMgPSBvQm91bmRBY3Rpb24gJiYgb0JvdW5kQWN0aW9uLmdldE9iamVjdChcIiRQYXJhbWV0ZXJcIiksXG5cdFx0YVBhdGhzID0gc0NyaXRpY2FsUGF0aCAmJiBzQ3JpdGljYWxQYXRoLnNwbGl0KFwiL1wiKSxcblx0XHRiQ29uZGl0aW9uID1cblx0XHRcdGFCaW5kaW5nUGFyYW1zICYmIGFCaW5kaW5nUGFyYW1zLmxlbmd0aCAmJiB0eXBlb2YgYUJpbmRpbmdQYXJhbXMgPT09IFwib2JqZWN0XCIgJiYgc0NyaXRpY2FsUGF0aCAmJiBjb250ZXh0cyAmJiBjb250ZXh0cy5sZW5ndGg7XG5cdGlmIChiQ29uZGl0aW9uKSB7XG5cdFx0Ly9pbiBjYXNlIGJpbmRpbmcgcGF0YW1ldGVycyBhcmUgdGhlcmUgaW4gcGF0aCBuZWVkIHRvIHJlbW92ZSBlZzogLSBfaXQvaXNWZXJpZmllZCA9PiBuZWVkIHRvIHJlbW92ZSBfaXQgYW5kIHRoZSBwYXRoIHNob3VsZCBiZSBpc1ZlcmlmaWVkXG5cdFx0YUJpbmRpbmdQYXJhbXMuZmlsdGVyKGZ1bmN0aW9uIChvUGFyYW1zOiBhbnkpIHtcblx0XHRcdGNvbnN0IGluZGV4ID0gYVBhdGhzICYmIGFQYXRocy5pbmRleE9mKG9QYXJhbXMuJE5hbWUpO1xuXHRcdFx0aWYgKGluZGV4ID4gLTEpIHtcblx0XHRcdFx0YVBhdGhzLnNwbGljZShpbmRleCwgMSk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0c0NyaXRpY2FsUGF0aCA9IGFQYXRocy5qb2luKFwiL1wiKTtcblx0XHRyZXR1cm4gY29udGV4dHNbMF0uZ2V0T2JqZWN0KHNDcml0aWNhbFBhdGgpO1xuXHR9IGVsc2UgaWYgKHNDcml0aWNhbFBhdGgpIHtcblx0XHQvL2lmIHNjZW5hcmlvIGlzIHBhdGggYmFzZWQgcmV0dXJuIHRoZSBwYXRoIHZhbHVlXG5cdFx0cmV0dXJuIGNvbnRleHRzWzBdLmdldE9iamVjdChzQ3JpdGljYWxQYXRoKTtcblx0fVxufVxuXG5mdW5jdGlvbiBleGVjdXRlRGVwZW5kaW5nT25TZWxlY3RlZENvbnRleHRzKG9BY3Rpb246IGFueSwgbVBhcmFtZXRlcnM6IGFueSwgYkdldEJvdW5kQ29udGV4dDogYm9vbGVhbiwgc0dyb3VwSWQ6IHN0cmluZykge1xuXHRsZXQgb0FjdGlvblByb21pc2UsXG5cdFx0YkVuYWJsZVN0cmljdEhhbmRsaW5nID0gdHJ1ZTtcblx0aWYgKGJHZXRCb3VuZENvbnRleHQpIHtcblx0XHRjb25zdCBzUGF0aCA9IG9BY3Rpb24uZ2V0Qm91bmRDb250ZXh0KCkuZ2V0UGF0aCgpO1xuXHRcdGNvbnN0IHNNZXRhUGF0aCA9IG9BY3Rpb24uZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKS5nZXRNZXRhUGF0aChzUGF0aCk7XG5cdFx0Y29uc3Qgb1Byb3BlcnR5ID0gb0FjdGlvbi5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpLmdldE9iamVjdChzTWV0YVBhdGgpO1xuXHRcdGlmIChvUHJvcGVydHkgJiYgb1Byb3BlcnR5WzBdPy4ka2luZCAhPT0gXCJBY3Rpb25cIikge1xuXHRcdFx0Ly9kbyBub3QgZW5hYmxlIHRoZSBzdHJpY3QgaGFuZGxpbmcgaWYgaXRzIG5vdCBhbiBhY3Rpb25cblx0XHRcdGJFbmFibGVTdHJpY3RIYW5kbGluZyA9IGZhbHNlO1xuXHRcdH1cblx0fVxuXG5cdGlmIChcblx0XHQobVBhcmFtZXRlcnMuaW50ZXJuYWxNb2RlbENvbnRleHQgJiYgbVBhcmFtZXRlcnMuaW50ZXJuYWxNb2RlbENvbnRleHQuZ2V0T2JqZWN0KCkubnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzID4gMSkgfHxcblx0XHQhYkVuYWJsZVN0cmljdEhhbmRsaW5nXG5cdCkge1xuXHRcdG9BY3Rpb25Qcm9taXNlID0gYkdldEJvdW5kQ29udGV4dFxuXHRcdFx0PyBvQWN0aW9uLmV4ZWN1dGUoc0dyb3VwSWQpLnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdHJldHVybiBvQWN0aW9uLmdldEJvdW5kQ29udGV4dCgpO1xuXHRcdFx0ICB9KVxuXHRcdFx0OiBvQWN0aW9uLmV4ZWN1dGUoc0dyb3VwSWQpO1xuXHR9IGVsc2Uge1xuXHRcdG9BY3Rpb25Qcm9taXNlID0gYkdldEJvdW5kQ29udGV4dFxuXHRcdFx0PyBvQWN0aW9uXG5cdFx0XHRcdFx0LmV4ZWN1dGUoXG5cdFx0XHRcdFx0XHRzR3JvdXBJZCxcblx0XHRcdFx0XHRcdHVuZGVmaW5lZCxcblx0XHRcdFx0XHRcdENvbW1vblV0aWxzLmZuT25TdHJpY3RIYW5kbGluZ0ZhaWxlZC5iaW5kKG9wZXJhdGlvbnMsIHNHcm91cElkLCBtUGFyYW1ldGVycy5sYWJlbCwgbVBhcmFtZXRlcnMubW9kZWwpXG5cdFx0XHRcdFx0KVxuXHRcdFx0XHRcdC50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdHJldHVybiBvQWN0aW9uLmdldEJvdW5kQ29udGV4dCgpO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHQ6IG9BY3Rpb24uZXhlY3V0ZShcblx0XHRcdFx0XHRzR3JvdXBJZCxcblx0XHRcdFx0XHR1bmRlZmluZWQsXG5cdFx0XHRcdFx0Q29tbW9uVXRpbHMuZm5PblN0cmljdEhhbmRsaW5nRmFpbGVkLmJpbmQob3BlcmF0aW9ucywgc0dyb3VwSWQsIG1QYXJhbWV0ZXJzLmxhYmVsLCBtUGFyYW1ldGVycy5tb2RlbClcblx0XHRcdCAgKTtcblx0fVxuXG5cdHJldHVybiBvQWN0aW9uUHJvbWlzZTtcbn1cbmZ1bmN0aW9uIF9leGVjdXRlQWN0aW9uKG9BcHBDb21wb25lbnQ6IGFueSwgbVBhcmFtZXRlcnM6IGFueSkge1xuXHRjb25zdCBhQ29udGV4dHMgPSBtUGFyYW1ldGVycy5hQ29udGV4dHMgfHwgW107XG5cdGNvbnN0IG9Nb2RlbCA9IG1QYXJhbWV0ZXJzLm1vZGVsO1xuXHRjb25zdCBpRXhpc3RpbmdNZXNzYWdlcyA9IG1lc3NhZ2VIYW5kbGluZy5nZXRNZXNzYWdlcygpLmxlbmd0aCB8fCAwO1xuXHRjb25zdCBhQWN0aW9uUGFyYW1ldGVycyA9IG1QYXJhbWV0ZXJzLmFBY3Rpb25QYXJhbWV0ZXJzIHx8IFtdO1xuXHRjb25zdCBzQWN0aW9uTmFtZSA9IG1QYXJhbWV0ZXJzLmFjdGlvbk5hbWU7XG5cdGNvbnN0IGZuT25TdWJtaXR0ZWQgPSBtUGFyYW1ldGVycy5mbk9uU3VibWl0dGVkO1xuXHRjb25zdCBmbk9uUmVzcG9uc2UgPSBtUGFyYW1ldGVycy5mbk9uUmVzcG9uc2U7XG5cdGNvbnN0IGJJc0NyZWF0ZUFjdGlvbiA9IG1QYXJhbWV0ZXJzLmJJc0NyZWF0ZUFjdGlvbjtcblx0bGV0IG9BY3Rpb246IGFueTtcblx0Ly8gbGV0IGNvbnRleHRJbmRleCA9IDA7XG5cdC8vIGxldCBhTWVzc2FnZXM6IGFueVtdID0gW107XG5cblx0ZnVuY3Rpb24gZm5EaWZmZXJlbnRpYXRlKHByb21pc2U6IGFueSkge1xuXHRcdHJldHVybiBwcm9taXNlLnRoZW4oXG5cdFx0XHRmdW5jdGlvbiAocmVzcG9uc2U6IGFueSkge1xuXHRcdFx0XHRsZXQgYU1lc3NhZ2VzID0gbWVzc2FnZUhhbmRsaW5nLmdldE1lc3NhZ2VzKCk7XG5cdFx0XHRcdGFNZXNzYWdlcyA9IGFNZXNzYWdlcy5jb25jYXQobWVzc2FnZUhhbmRsaW5nLmdldE1lc3NhZ2VzKHRydWUsIHRydWUpKTtcblx0XHRcdFx0Ly8gQWN0aW9uIERpYWxvZyBtdXN0IHJlbWFpbiBvcGVuIGlmIHRoZXJlIGFyZSByZXNwb25zZSBlcnJvci1tZXNzYWdlcywgYmVjYXVzZSBpbiB0aGUgamF2YSBzdGFjayB0aGUgZGlhbG9nIHdvdWxkIGJlIGNsb3NlZCBpbW1lZGlhdGVseS5cblx0XHRcdFx0aWYgKGFNZXNzYWdlcy5sZW5ndGggPiBpRXhpc3RpbmdNZXNzYWdlcyAmJiBhTWVzc2FnZXNbYU1lc3NhZ2VzLmxlbmd0aCAtIDFdLnR5cGUgPT09IFwiRXJyb3JcIikge1xuXHRcdFx0XHRcdHJldHVybiB7IHJlc3BvbnNlOiByZXNwb25zZSwgc3RhdHVzOiBcInJlamVjdGVkXCIgfTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4geyByZXNwb25zZTogcmVzcG9uc2UsIHN0YXR1czogXCJyZXNvbHZlZFwiIH07XG5cdFx0XHR9LFxuXHRcdFx0ZnVuY3Rpb24gKHJlc3BvbnNlOiBhbnkpIHtcblx0XHRcdFx0cmV0dXJuIHsgcmVzcG9uc2U6IHJlc3BvbnNlLCBzdGF0dXM6IFwicmVqZWN0ZWRcIiB9O1xuXHRcdFx0fVxuXHRcdCk7XG5cdH1cblxuXHRmdW5jdGlvbiBzZXRBY3Rpb25QYXJhbWV0ZXJEZWZhdWx0VmFsdWUoKSB7XG5cdFx0aWYgKGFBY3Rpb25QYXJhbWV0ZXJzICYmIGFBY3Rpb25QYXJhbWV0ZXJzLmxlbmd0aCkge1xuXHRcdFx0Zm9yIChsZXQgaiA9IDA7IGogPCBhQWN0aW9uUGFyYW1ldGVycy5sZW5ndGg7IGorKykge1xuXHRcdFx0XHRpZiAoIWFBY3Rpb25QYXJhbWV0ZXJzW2pdLnZhbHVlKSB7XG5cdFx0XHRcdFx0c3dpdGNoIChhQWN0aW9uUGFyYW1ldGVyc1tqXS4kVHlwZSkge1xuXHRcdFx0XHRcdFx0Y2FzZSBcIkVkbS5TdHJpbmdcIjpcblx0XHRcdFx0XHRcdFx0YUFjdGlvblBhcmFtZXRlcnNbal0udmFsdWUgPSBcIlwiO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdGNhc2UgXCJFZG0uQm9vbGVhblwiOlxuXHRcdFx0XHRcdFx0XHRhQWN0aW9uUGFyYW1ldGVyc1tqXS52YWx1ZSA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdGNhc2UgXCJFZG0uQnl0ZVwiOlxuXHRcdFx0XHRcdFx0Y2FzZSBcIkVkbS5JbnQxNlwiOlxuXHRcdFx0XHRcdFx0Y2FzZSBcIkVkbS5JbnQzMlwiOlxuXHRcdFx0XHRcdFx0Y2FzZSBcIkVkbS5JbnQ2NFwiOlxuXHRcdFx0XHRcdFx0XHRhQWN0aW9uUGFyYW1ldGVyc1tqXS52YWx1ZSA9IDA7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0Ly8gdGJjXG5cdFx0XHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0b0FjdGlvbi5zZXRQYXJhbWV0ZXIoYUFjdGlvblBhcmFtZXRlcnNbal0uJE5hbWUsIGFBY3Rpb25QYXJhbWV0ZXJzW2pdLnZhbHVlKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRpZiAoYUNvbnRleHRzLmxlbmd0aCkge1xuXHRcdHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZTogKHZhbHVlOiBhbnkpID0+IHZvaWQsIHJlamVjdDogKHJlYXNvbj86IGFueSkgPT4gdm9pZCkge1xuXHRcdFx0Y29uc3QgbUJpbmRpbmdQYXJhbWV0ZXJzID0gbVBhcmFtZXRlcnMubUJpbmRpbmdQYXJhbWV0ZXJzO1xuXHRcdFx0Y29uc3QgYkdyb3VwZWQgPSBtUGFyYW1ldGVycy5iR3JvdXBlZDtcblx0XHRcdGNvbnN0IGJSZXR1cm5Bc0FycmF5ID0gbVBhcmFtZXRlcnMuYlJldHVybkFzQXJyYXk7XG5cdFx0XHRjb25zdCBiR2V0Qm91bmRDb250ZXh0ID0gbVBhcmFtZXRlcnMuYkdldEJvdW5kQ29udGV4dDtcblx0XHRcdGNvbnN0IGFBY3Rpb25Qcm9taXNlczogYW55W10gPSBbXTtcblx0XHRcdGxldCBvQWN0aW9uUHJvbWlzZTtcblx0XHRcdGxldCBpO1xuXHRcdFx0bGV0IHNHcm91cElkOiBzdHJpbmc7XG5cdFx0XHRjb25zdCBmbkV4ZWN1dGVBY3Rpb24gPSBmdW5jdGlvbiAob0FjdGlvbjogYW55LCBpbmRleDogYW55LCBvU2lkZUVmZmVjdDogYW55KSB7XG5cdFx0XHRcdHNldEFjdGlvblBhcmFtZXRlckRlZmF1bHRWYWx1ZSgpO1xuXHRcdFx0XHQvLyBGb3IgaW52b2NhdGlvbiBncm91cGluZyBcImlzb2xhdGVkXCIgbmVlZCBiYXRjaCBncm91cCBwZXIgYWN0aW9uIGNhbGxcblx0XHRcdFx0c0dyb3VwSWQgPSAhYkdyb3VwZWQgPyBcIiRhdXRvLlwiICsgaW5kZXggOiBvQWN0aW9uLmdldFVwZGF0ZUdyb3VwSWQoKTtcblx0XHRcdFx0b0FjdGlvblByb21pc2UgPSBleGVjdXRlRGVwZW5kaW5nT25TZWxlY3RlZENvbnRleHRzKG9BY3Rpb24sIG1QYXJhbWV0ZXJzLCBiR2V0Qm91bmRDb250ZXh0LCBzR3JvdXBJZCk7XG5cdFx0XHRcdGFBY3Rpb25Qcm9taXNlcy5wdXNoKG9BY3Rpb25Qcm9taXNlKTtcblx0XHRcdFx0Y29uc3Qgb1NpZGVFZmZlY3RzU2VydmljZSA9IG9BcHBDb21wb25lbnQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKCk7XG5cdFx0XHRcdC8vIHRyaWdnZXIgYWN0aW9ucyBmcm9tIHNpZGUgZWZmZWN0c1xuXHRcdFx0XHRpZiAob1NpZGVFZmZlY3QgJiYgb1NpZGVFZmZlY3QudHJpZ2dlckFjdGlvbnMgJiYgb1NpZGVFZmZlY3QudHJpZ2dlckFjdGlvbnMubGVuZ3RoKSB7XG5cdFx0XHRcdFx0b1NpZGVFZmZlY3QudHJpZ2dlckFjdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAoc1RyaWdnZXJBY3Rpb246IGFueSkge1xuXHRcdFx0XHRcdFx0aWYgKHNUcmlnZ2VyQWN0aW9uKSB7XG5cdFx0XHRcdFx0XHRcdG9TaWRlRWZmZWN0c1NlcnZpY2UuZXhlY3V0ZUFjdGlvbihzVHJpZ2dlckFjdGlvbiwgb1NpZGVFZmZlY3QuY29udGV4dCwgc0dyb3VwSWQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdC8vIHJlcXVlc3Qgc2lkZSBlZmZlY3RzIGZvciB0aGlzIGFjdGlvblxuXHRcdFx0XHQvLyBhcyB3ZSBtb3ZlIHRoZSBtZXNzYWdlcyByZXF1ZXN0IHRvIFBPU1QgJHNlbGVjdCB3ZSBuZWVkIHRvIGJlIHByZXBhcmVkIGZvciBhbiBlbXB0eSBhcnJheVxuXHRcdFx0XHRpZiAob1NpZGVFZmZlY3QgJiYgb1NpZGVFZmZlY3QucGF0aEV4cHJlc3Npb25zICYmIG9TaWRlRWZmZWN0LnBhdGhFeHByZXNzaW9ucy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0b1NpZGVFZmZlY3RzU2VydmljZVxuXHRcdFx0XHRcdFx0LnJlcXVlc3RTaWRlRWZmZWN0cyhvU2lkZUVmZmVjdC5wYXRoRXhwcmVzc2lvbnMsIG9TaWRlRWZmZWN0LmNvbnRleHQsIHNHcm91cElkKVxuXHRcdFx0XHRcdFx0LnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRpZiAobVBhcmFtZXRlcnMub3BlcmF0aW9uQXZhaWxhYmxlTWFwICYmIG1QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0KSB7XG5cdFx0XHRcdFx0XHRcdFx0Q29tbW9uVXRpbHMuc2V0QWN0aW9uRW5hYmxlbWVudChcblx0XHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0LFxuXHRcdFx0XHRcdFx0XHRcdFx0SlNPTi5wYXJzZShtUGFyYW1ldGVycy5vcGVyYXRpb25BdmFpbGFibGVNYXApLFxuXHRcdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMuYUNvbnRleHRzXG5cdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgcmVxdWVzdGluZyBzaWRlIGVmZmVjdHNcIiwgb0Vycm9yKTtcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXHRcdFx0Y29uc3QgZm5FeGVjdXRlU2luZ2xlQWN0aW9uID0gZnVuY3Rpb24gKG9BY3Rpb246IGFueSwgaW5kZXg6IGFueSwgb1NpZGVFZmZlY3Q6IGFueSkge1xuXHRcdFx0XHRjb25zdCBvUHJvbWlzZSA9IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG5cdFx0XHRcdFx0bGV0IG9Mb2NhbFByb21pc2U7XG5cdFx0XHRcdFx0Y29uc3QgYUxvY2FsUHJvbWlzZSA9IFtdO1xuXHRcdFx0XHRcdHNldEFjdGlvblBhcmFtZXRlckRlZmF1bHRWYWx1ZSgpO1xuXHRcdFx0XHRcdC8vIEZvciBpbnZvY2F0aW9uIGdyb3VwaW5nIFwiaXNvbGF0ZWRcIiBuZWVkIGJhdGNoIGdyb3VwIHBlciBhY3Rpb24gY2FsbFxuXHRcdFx0XHRcdHNHcm91cElkID0gXCJhcGlNb2RlXCIgKyBpbmRleDtcblx0XHRcdFx0XHRvQWN0aW9uUHJvbWlzZSA9IGV4ZWN1dGVEZXBlbmRpbmdPblNlbGVjdGVkQ29udGV4dHMob0FjdGlvbiwgbVBhcmFtZXRlcnMsIGJHZXRCb3VuZENvbnRleHQsIHNHcm91cElkKTtcblx0XHRcdFx0XHRhQWN0aW9uUHJvbWlzZXMucHVzaChvQWN0aW9uUHJvbWlzZSk7XG5cdFx0XHRcdFx0YUxvY2FsUHJvbWlzZS5wdXNoKG9BY3Rpb25Qcm9taXNlKTtcblx0XHRcdFx0XHRjb25zdCBvU2lkZUVmZmVjdHNTZXJ2aWNlID0gb0FwcENvbXBvbmVudC5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKTtcblx0XHRcdFx0XHQvLyB0cmlnZ2VyIGFjdGlvbnMgZnJvbSBzaWRlIGVmZmVjdHNcblx0XHRcdFx0XHRpZiAob1NpZGVFZmZlY3QgJiYgb1NpZGVFZmZlY3QudHJpZ2dlckFjdGlvbnMgJiYgb1NpZGVFZmZlY3QudHJpZ2dlckFjdGlvbnMubGVuZ3RoKSB7XG5cdFx0XHRcdFx0XHRvU2lkZUVmZmVjdC50cmlnZ2VyQWN0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChzVHJpZ2dlckFjdGlvbjogYW55KSB7XG5cdFx0XHRcdFx0XHRcdGlmIChzVHJpZ2dlckFjdGlvbikge1xuXHRcdFx0XHRcdFx0XHRcdG9Mb2NhbFByb21pc2UgPSBvU2lkZUVmZmVjdHNTZXJ2aWNlLmV4ZWN1dGVBY3Rpb24oc1RyaWdnZXJBY3Rpb24sIG9TaWRlRWZmZWN0LmNvbnRleHQsIHNHcm91cElkKTtcblx0XHRcdFx0XHRcdFx0XHRhTG9jYWxQcm9taXNlLnB1c2gob0xvY2FsUHJvbWlzZSk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQvLyByZXF1ZXN0IHNpZGUgZWZmZWN0cyBmb3IgdGhpcyBhY3Rpb25cblx0XHRcdFx0XHQvLyBhcyB3ZSBtb3ZlIHRoZSBtZXNzYWdlcyByZXF1ZXN0IHRvIFBPU1QgJHNlbGVjdCB3ZSBuZWVkIHRvIGJlIHByZXBhcmVkIGZvciBhbiBlbXB0eSBhcnJheVxuXHRcdFx0XHRcdGlmIChvU2lkZUVmZmVjdCAmJiBvU2lkZUVmZmVjdC5wYXRoRXhwcmVzc2lvbnMgJiYgb1NpZGVFZmZlY3QucGF0aEV4cHJlc3Npb25zLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRcdG9Mb2NhbFByb21pc2UgPSBvU2lkZUVmZmVjdHNTZXJ2aWNlLnJlcXVlc3RTaWRlRWZmZWN0cyhvU2lkZUVmZmVjdC5wYXRoRXhwcmVzc2lvbnMsIG9TaWRlRWZmZWN0LmNvbnRleHQsIHNHcm91cElkKTtcblx0XHRcdFx0XHRcdGFMb2NhbFByb21pc2UucHVzaChvTG9jYWxQcm9taXNlKTtcblx0XHRcdFx0XHRcdG9Mb2NhbFByb21pc2Vcblx0XHRcdFx0XHRcdFx0LnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRcdGlmIChtUGFyYW1ldGVycy5vcGVyYXRpb25BdmFpbGFibGVNYXAgJiYgbVBhcmFtZXRlcnMuaW50ZXJuYWxNb2RlbENvbnRleHQpIHtcblx0XHRcdFx0XHRcdFx0XHRcdENvbW1vblV0aWxzLnNldEFjdGlvbkVuYWJsZW1lbnQoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0LFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRKU09OLnBhcnNlKG1QYXJhbWV0ZXJzLm9wZXJhdGlvbkF2YWlsYWJsZU1hcCksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmFDb250ZXh0c1xuXHRcdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSByZXF1ZXN0aW5nIHNpZGUgZWZmZWN0c1wiLCBvRXJyb3IpO1xuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0b01vZGVsLnN1Ym1pdEJhdGNoKHNHcm91cElkKTtcblx0XHRcdFx0XHRQcm9taXNlLmFsbChhTG9jYWxQcm9taXNlKVxuXHRcdFx0XHRcdFx0LnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gcmVzb2x2ZSgpO1xuXHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiByZXNvbHZlKCk7XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHJldHVybiBvUHJvbWlzZTtcblx0XHRcdH07XG5cblx0XHRcdGZ1bmN0aW9uIGZuRXhlY3V0ZVNlcXVlbnRpYWxseShhQ29udGV4dHM6IGFueSkge1xuXHRcdFx0XHQvLyBPbmUgYWN0aW9uIGFuZCBpdHMgc2lkZSBlZmZlY3RzIGFyZSBjb21wbGV0ZWQgYmVmb3JlIHRoZSBuZXh0IGFjdGlvbiBpcyBleGVjdXRlZFxuXHRcdFx0XHQoXG5cdFx0XHRcdFx0Zm5PblN1Ym1pdHRlZCB8fFxuXHRcdFx0XHRcdGZ1bmN0aW9uIG5vb3AoKSB7XG5cdFx0XHRcdFx0XHQvKiovXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHQpKGFBY3Rpb25Qcm9taXNlcyk7XG5cdFx0XHRcdGZ1bmN0aW9uIHByb2Nlc3NPbmVBY3Rpb24oY29udGV4dDogYW55LCBpOiBhbnkpIHtcblx0XHRcdFx0XHRvQWN0aW9uID0gb01vZGVsLmJpbmRDb250ZXh0KHNBY3Rpb25OYW1lICsgXCIoLi4uKVwiLCBjb250ZXh0LCBtQmluZGluZ1BhcmFtZXRlcnMpO1xuXHRcdFx0XHRcdHJldHVybiBmbkV4ZWN1dGVTaW5nbGVBY3Rpb24ob0FjdGlvbiwgaSwge1xuXHRcdFx0XHRcdFx0Y29udGV4dDogY29udGV4dCxcblx0XHRcdFx0XHRcdHBhdGhFeHByZXNzaW9uczogbVBhcmFtZXRlcnMuYWRkaXRpb25hbFNpZGVFZmZlY3QgJiYgbVBhcmFtZXRlcnMuYWRkaXRpb25hbFNpZGVFZmZlY3QucGF0aEV4cHJlc3Npb25zLFxuXHRcdFx0XHRcdFx0dHJpZ2dlckFjdGlvbnM6IG1QYXJhbWV0ZXJzLmFkZGl0aW9uYWxTaWRlRWZmZWN0ICYmIG1QYXJhbWV0ZXJzLmFkZGl0aW9uYWxTaWRlRWZmZWN0LnRyaWdnZXJBY3Rpb25zXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRsZXQgb0FjdGlvbkFuZFNpZGVFZmZlY3RQcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0XHRcdGxldCBqID0gMDtcblx0XHRcdFx0YUNvbnRleHRzLmZvckVhY2goZnVuY3Rpb24gKGNvbnRleHQ6IGFueSkge1xuXHRcdFx0XHRcdGNvbnN0IGlkID0gKytqO1xuXHRcdFx0XHRcdG9BY3Rpb25BbmRTaWRlRWZmZWN0UHJvbWlzZSA9IG9BY3Rpb25BbmRTaWRlRWZmZWN0UHJvbWlzZS50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdHJldHVybiBwcm9jZXNzT25lQWN0aW9uKGNvbnRleHQsIGlkKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdG9BY3Rpb25BbmRTaWRlRWZmZWN0UHJvbWlzZVxuXHRcdFx0XHRcdC50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdGZuSGFuZGxlUmVzdWx0cygpO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0LmNhdGNoKCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmICghYkdyb3VwZWQpIHtcblx0XHRcdFx0Ly8gRm9yIGludm9jYXRpb24gZ3JvdXBpbmcgXCJpc29sYXRlZFwiLCBlbnN1cmUgdGhhdCBlYWNoIGFjdGlvbiBhbmQgbWF0Y2hpbmcgc2lkZSBlZmZlY3RzXG5cdFx0XHRcdC8vIGFyZSBwcm9jZXNzZWQgYmVmb3JlIHRoZSBuZXh0IHNldCBpcyBzdWJtaXR0ZWQuIFdvcmthcm91bmQgdW50aWwgSlNPTiBiYXRjaCBpcyBhdmFpbGFibGUuXG5cdFx0XHRcdC8vIEFsbG93IGFsc28gZm9yIExpc3QgUmVwb3J0LlxuXHRcdFx0XHRmbkV4ZWN1dGVTZXF1ZW50aWFsbHkoYUNvbnRleHRzKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGZvciAoaSA9IDA7IGkgPCBhQ29udGV4dHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0XHRvQWN0aW9uID0gb01vZGVsLmJpbmRDb250ZXh0KHNBY3Rpb25OYW1lICsgXCIoLi4uKVwiLCBhQ29udGV4dHNbaV0sIG1CaW5kaW5nUGFyYW1ldGVycyk7XG5cdFx0XHRcdFx0Zm5FeGVjdXRlQWN0aW9uKG9BY3Rpb24sIGFDb250ZXh0cy5sZW5ndGggPD0gMSA/IG51bGwgOiBpLCB7XG5cdFx0XHRcdFx0XHRjb250ZXh0OiBhQ29udGV4dHNbaV0sXG5cdFx0XHRcdFx0XHRwYXRoRXhwcmVzc2lvbnM6IG1QYXJhbWV0ZXJzLmFkZGl0aW9uYWxTaWRlRWZmZWN0ICYmIG1QYXJhbWV0ZXJzLmFkZGl0aW9uYWxTaWRlRWZmZWN0LnBhdGhFeHByZXNzaW9ucyxcblx0XHRcdFx0XHRcdHRyaWdnZXJBY3Rpb25zOiBtUGFyYW1ldGVycy5hZGRpdGlvbmFsU2lkZUVmZmVjdCAmJiBtUGFyYW1ldGVycy5hZGRpdGlvbmFsU2lkZUVmZmVjdC50cmlnZ2VyQWN0aW9uc1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdChcblx0XHRcdFx0XHRmbk9uU3VibWl0dGVkIHx8XG5cdFx0XHRcdFx0ZnVuY3Rpb24gbm9vcCgpIHtcblx0XHRcdFx0XHRcdC8qKi9cblx0XHRcdFx0XHR9XG5cdFx0XHRcdCkoYUFjdGlvblByb21pc2VzKTtcblx0XHRcdFx0Zm5IYW5kbGVSZXN1bHRzKCk7XG5cdFx0XHR9XG5cblx0XHRcdGZ1bmN0aW9uIGZuSGFuZGxlUmVzdWx0cygpIHtcblx0XHRcdFx0UHJvbWlzZS5hbGwoYUFjdGlvblByb21pc2VzLm1hcChmbkRpZmZlcmVudGlhdGUpKVxuXHRcdFx0XHRcdC50aGVuKGZ1bmN0aW9uIChyZXN1bHRzOiBhbnlbXSkge1xuXHRcdFx0XHRcdFx0Y29uc3QgYVJlamVjdGVkSXRlbXMgPSBbXTtcblx0XHRcdFx0XHRcdGNvbnN0IGFSZXNvbHZlZEl0ZW1zID0gW107XG5cdFx0XHRcdFx0XHRsZXQgaVJlc3VsdENvdW50O1xuXHRcdFx0XHRcdFx0Zm9yIChpUmVzdWx0Q291bnQgPSAwOyBpUmVzdWx0Q291bnQgPCByZXN1bHRzLmxlbmd0aDsgaVJlc3VsdENvdW50KyspIHtcblx0XHRcdFx0XHRcdFx0aWYgKHJlc3VsdHNbaVJlc3VsdENvdW50XS5zdGF0dXMgPT09IFwicmVqZWN0ZWRcIikge1xuXHRcdFx0XHRcdFx0XHRcdGFSZWplY3RlZEl0ZW1zLnB1c2gocmVzdWx0c1tpUmVzdWx0Q291bnRdLnJlc3BvbnNlKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRpZiAocmVzdWx0c1tpUmVzdWx0Q291bnRdLnN0YXR1cyA9PT0gXCJyZXNvbHZlZFwiKSB7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKGJJc0NyZWF0ZUFjdGlvbikge1xuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gcmVtb3ZlZCB0aGUgYkFjdGlvblBhcmFtZXRlcnNFeGlzdCBzbyB0aGF0IGNyZWF0ZSBuZXcgYWN0aW9uIGNhbiB3b3JrIGluIGJvdGggY2FzZXMgLSB3aXRoIGFuZCB3aXRob3V0IGRpYWxvZ1xuXHRcdFx0XHRcdFx0XHRcdFx0Ly9vbmx5IHVzZWQgZm9yIE5ld0FjdGlvblxuXHRcdFx0XHRcdFx0XHRcdFx0cmVzdWx0c1tpUmVzdWx0Q291bnRdLmJDb25zaWRlckRvY3VtZW50TW9kaWZpZWQgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHRcdFx0YVJlc29sdmVkSXRlbXMucHVzaChyZXN1bHRzW2lSZXN1bHRDb3VudF0pO1xuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRhUmVzb2x2ZWRJdGVtcy5wdXNoKHJlc3VsdHNbaVJlc3VsdENvdW50XS5yZXNwb25zZSk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAoIXJlc3VsdHMgfHwgKHJlc3VsdHMgJiYgcmVzdWx0cy5sZW5ndGggPT09IDApKSB7XG5cdFx0XHRcdFx0XHRcdHJlamVjdCh0cnVlKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGlmIChhUmVqZWN0ZWRJdGVtcy5sZW5ndGggPT09IDApIHtcblx0XHRcdFx0XHRcdFx0aWYgKGJSZXR1cm5Bc0FycmF5KSB7XG5cdFx0XHRcdFx0XHRcdFx0cmVzb2x2ZShhUmVzb2x2ZWRJdGVtcyk7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gY29udGV4dCBpcyBnaXZlbiBkaXJlY3RseSB3aXRob3V0IGFuIGFycmF5IHNvIGFsc28gbm8gYXJyYXkgaXMgZXhwZWN0ZWRcblx0XHRcdFx0XHRcdFx0XHRyZXNvbHZlKGFSZXNvbHZlZEl0ZW1zWzBdKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0cmVqZWN0KHtcblx0XHRcdFx0XHRcdFx0XHRyZXNvbHZlZEl0ZW1zOiBhUmVzb2x2ZWRJdGVtcyxcblx0XHRcdFx0XHRcdFx0XHRyZWplY3RlZEl0ZW1zOiBhUmVqZWN0ZWRJdGVtc1xuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdC5jYXRjaChyZWplY3QpO1xuXHRcdFx0fVxuXHRcdH0pLmZpbmFsbHkoZnVuY3Rpb24gKCkge1xuXHRcdFx0KFxuXHRcdFx0XHRmbk9uUmVzcG9uc2UgfHxcblx0XHRcdFx0ZnVuY3Rpb24gbm9vcCgpIHtcblx0XHRcdFx0XHQvKiovXG5cdFx0XHRcdH1cblx0XHRcdCkoKTtcblx0XHR9KTtcblx0fSBlbHNlIHtcblx0XHRvQWN0aW9uID0gb01vZGVsLmJpbmRDb250ZXh0KFwiL1wiICsgc0FjdGlvbk5hbWUgKyBcIiguLi4pXCIpO1xuXHRcdHNldEFjdGlvblBhcmFtZXRlckRlZmF1bHRWYWx1ZSgpO1xuXHRcdGNvbnN0IHNHcm91cElkID0gXCJhY3Rpb25JbXBvcnRcIjtcblx0XHRjb25zdCBvQWN0aW9uUHJvbWlzZSA9IG9BY3Rpb24uZXhlY3V0ZShcblx0XHRcdHNHcm91cElkLFxuXHRcdFx0dW5kZWZpbmVkLFxuXHRcdFx0Q29tbW9uVXRpbHMuZm5PblN0cmljdEhhbmRsaW5nRmFpbGVkLmJpbmQob3BlcmF0aW9ucywgc0dyb3VwSWQsIG1QYXJhbWV0ZXJzLmxhYmVsLCBvTW9kZWwpXG5cdFx0KTtcblx0XHRvTW9kZWwuc3VibWl0QmF0Y2goc0dyb3VwSWQpO1xuXHRcdC8vIHRyaWdnZXIgb25TdWJtaXR0ZWQgXCJldmVudFwiXG5cdFx0KFxuXHRcdFx0Zm5PblN1Ym1pdHRlZCB8fFxuXHRcdFx0ZnVuY3Rpb24gbm9vcCgpIHtcblx0XHRcdFx0LyoqL1xuXHRcdFx0fVxuXHRcdCkob0FjdGlvblByb21pc2UpO1xuXHRcdHJldHVybiBvQWN0aW9uUHJvbWlzZS5maW5hbGx5KGZ1bmN0aW9uICgpIHtcblx0XHRcdChcblx0XHRcdFx0Zm5PblJlc3BvbnNlIHx8XG5cdFx0XHRcdGZ1bmN0aW9uIG5vb3AoKSB7XG5cdFx0XHRcdFx0LyoqL1xuXHRcdFx0XHR9XG5cdFx0XHQpKCk7XG5cdFx0fSk7XG5cdH1cbn1cbmZ1bmN0aW9uIF9nZXRQYXRoKG9BY3Rpb25Db250ZXh0OiBhbnksIHNBY3Rpb25OYW1lOiBhbnkpIHtcblx0bGV0IHNQYXRoID0gb0FjdGlvbkNvbnRleHQuZ2V0UGF0aCgpO1xuXHRzUGF0aCA9IG9BY3Rpb25Db250ZXh0LmdldE9iamVjdChcIiRJc0JvdW5kXCIpID8gc1BhdGguc3BsaXQoXCJAJHVpNS5vdmVybG9hZFwiKVswXSA6IHNQYXRoLnNwbGl0KFwiLzBcIilbMF07XG5cdHJldHVybiBzUGF0aC5zcGxpdChcIi9cIiArIHNBY3Rpb25OYW1lKVswXTtcbn1cblxuLyoqXG4gKiBTdGF0aWMgZnVuY3Rpb25zIHRvIGNhbGwgT0RhdGEgYWN0aW9ucyAoYm91bmQvaW1wb3J0KSBhbmQgZnVuY3Rpb25zIChib3VuZC9pbXBvcnQpXG4gKlxuICogQG5hbWVzcGFjZVxuICogQGFsaWFzIHNhcC5mZS5jb3JlLmFjdGlvbnMub3BlcmF0aW9uc1xuICogQHByaXZhdGVcbiAqIEBleHBlcmltZW50YWwgVGhpcyBtb2R1bGUgaXMgb25seSBmb3IgZXhwZXJpbWVudGFsIHVzZSEgPGJyLz48Yj5UaGlzIGlzIG9ubHkgYSBQT0MgYW5kIG1heWJlIGRlbGV0ZWQ8L2I+XG4gKiBAc2luY2UgMS41Ni4wXG4gKi9cbmNvbnN0IG9wZXJhdGlvbnMgPSB7XG5cdGNhbGxCb3VuZEFjdGlvbjogY2FsbEJvdW5kQWN0aW9uLFxuXHRjYWxsQWN0aW9uSW1wb3J0OiBjYWxsQWN0aW9uSW1wb3J0LFxuXHRjYWxsQm91bmRGdW5jdGlvbjogY2FsbEJvdW5kRnVuY3Rpb24sXG5cdGNhbGxGdW5jdGlvbkltcG9ydDogY2FsbEZ1bmN0aW9uSW1wb3J0LFxuXHRleGVjdXRlRGVwZW5kaW5nT25TZWxlY3RlZENvbnRleHRzOiBleGVjdXRlRGVwZW5kaW5nT25TZWxlY3RlZENvbnRleHRzXG59O1xuXG5leHBvcnQgZGVmYXVsdCBvcGVyYXRpb25zO1xuIl19
1199
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm9wZXJhdGlvbnMudHMiXSwibmFtZXMiOlsiQ29uc3RhbnRzIiwiRkVMaWJyYXJ5IiwiSW52b2NhdGlvbkdyb3VwaW5nIiwiQWN0aW9uIiwiTWVzc2FnZUJveCIsImNhbGxCb3VuZEFjdGlvbiIsInNBY3Rpb25OYW1lIiwiY29udGV4dHMiLCJvTW9kZWwiLCJvQXBwQ29tcG9uZW50IiwibVBhcmFtZXRlcnMiLCJsZW5ndGgiLCJQcm9taXNlIiwicmVqZWN0IiwiQXJyYXkiLCJpc0FycmF5IiwiYlJldHVybkFzQXJyYXkiLCJvTWV0YU1vZGVsIiwiZ2V0TWV0YU1vZGVsIiwic0FjdGlvblBhdGgiLCJnZXRNZXRhUGF0aCIsImdldFBhdGgiLCJvQm91bmRBY3Rpb24iLCJjcmVhdGVCaW5kaW5nQ29udGV4dCIsImFDb250ZXh0cyIsImlzQ3JpdGljYWxBY3Rpb24iLCJnZXRJc0FjdGlvbkNyaXRpY2FsIiwiY2FsbEFjdGlvbiIsImNhbGxBY3Rpb25JbXBvcnQiLCJiaW5kQ29udGV4dCIsIm9BY3Rpb25JbXBvcnQiLCJnZXRPYmplY3QiLCJjYWxsQm91bmRGdW5jdGlvbiIsInNGdW5jdGlvbk5hbWUiLCJjb250ZXh0Iiwic0Z1bmN0aW9uUGF0aCIsIm9Cb3VuZEZ1bmN0aW9uIiwiX2V4ZWN1dGVGdW5jdGlvbiIsImNhbGxGdW5jdGlvbkltcG9ydCIsInJlc29sdmUiLCJvRnVuY3Rpb25JbXBvcnQiLCJvRnVuY3Rpb24iLCJzR3JvdXBJZCIsIkVycm9yIiwib0Z1bmN0aW9uUHJvbWlzZSIsImV4ZWN1dGUiLCJzdWJtaXRCYXRjaCIsInRoZW4iLCJnZXRCb3VuZENvbnRleHQiLCJvQWN0aW9uIiwiYUFjdGlvblBhcmFtZXRlcnMiLCJhY3Rpb25QYXJhbWV0ZXJzIiwibUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMiLCJmbkRpYWxvZyIsIm9BY3Rpb25Qcm9taXNlIiwic0FjdGlvbkxhYmVsIiwibGFiZWwiLCJiU2hvd0FjdGlvblBhcmFtZXRlckRpYWxvZyIsInNob3dBY3Rpb25QYXJhbWV0ZXJEaWFsb2ciLCJiSXNDcmVhdGVBY3Rpb24iLCJiSXNDcml0aWNhbEFjdGlvbiIsInNNZXRhUGF0aCIsInNNZXNzYWdlc1BhdGgiLCJpTWVzc2FnZVNpZGVFZmZlY3QiLCJiSXNTYW1lRW50aXR5Iiwib1JldHVyblR5cGUiLCJhY3Rpb25EZWZpbml0aW9uIiwiZ2V0QWN0aW9uUGFyYW1ldGVycyIsIl9zaG93QWN0aW9uUGFyYW1ldGVyRGlhbG9nIiwiY29uZmlybUNyaXRpY2FsQWN0aW9uIiwiZm5PblN1Ym1pdHRlZCIsIm9uU3VibWl0dGVkIiwiZm5PblJlc3BvbnNlIiwib25SZXNwb25zZSIsImFjdGlvbk5hbWUiLCJtb2RlbCIsImJHZXRCb3VuZENvbnRleHQiLCJkZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb24iLCJhZGRpdGlvbmFsU2lkZUVmZmVjdCIsInBhdGhFeHByZXNzaW9ucyIsImZpbmRJbmRleCIsImV4cCIsIiRpc0NvbGxlY3Rpb24iLCJnZXRNb2RlbCIsIiRUeXBlIiwibUJpbmRpbmdQYXJhbWV0ZXJzIiwiJHNlbGVjdCIsInNwbGl0IiwiaW5kZXhPZiIsInB1c2giLCJ0cmlnZ2VyQWN0aW9ucyIsInNwbGljZSIsImJHcm91cGVkIiwiaW52b2NhdGlvbkdyb3VwaW5nIiwiQ2hhbmdlU2V0IiwiaW50ZXJuYWxNb2RlbENvbnRleHQiLCJvcGVyYXRpb25BdmFpbGFibGVNYXAiLCJiT2JqZWN0UGFnZSIsImNvbnRyb2xJZCIsImNvbnRyb2wiLCJwYXJlbnRDb250cm9sIiwiYnlJZCIsImVudGl0eVNldE5hbWUiLCJtZXNzYWdlSGFuZGxlciIsIl9leGVjdXRlQWN0aW9uIiwib09wZXJhdGlvblJlc3VsdCIsIiRJc0JvdW5kIiwiaXNTdGF0aWMiLCIkUGFyYW1ldGVyIiwic29tZSIsImFQYXJhbWV0ZXIiLCIkRW50aXR5U2V0UGF0aCIsIiROYW1lIiwiQ29tbW9uVXRpbHMiLCJzZXRBY3Rpb25FbmFibGVtZW50IiwiSlNPTiIsInBhcnNlIiwiY2F0Y2giLCJvQWN0aW9uQ29udGV4dCIsIm9QYXJlbnRDb250cm9sIiwiYm91bmRBY3Rpb25OYW1lIiwic3VmZml4UmVzb3VyY2VLZXkiLCJvUmVzb3VyY2VCdW5kbGUiLCJnZXRDb250cm9sbGVyIiwic0NvbmZpcm1hdGlvblRleHQiLCJnZXRUcmFuc2xhdGVkVGV4dCIsImNvbmZpcm0iLCJvbkNsb3NlIiwic0FjdGlvbiIsIk9LIiwib09wZXJhdGlvbiIsIm9FcnJvciIsInNob3dNZXNzYWdlRGlhbG9nIiwic1BhdGgiLCJfZ2V0UGF0aCIsIm1ldGFNb2RlbCIsImVudGl0eVNldENvbnRleHQiLCJzQWN0aW9uTmFtZVBhdGgiLCJhY3Rpb25OYW1lQ29udGV4dCIsInNGcmFnbWVudE5hbWUiLCJvRnJhZ21lbnQiLCJYTUxUZW1wbGF0ZVByb2Nlc3NvciIsImxvYWRUZW1wbGF0ZSIsIm9QYXJhbWV0ZXJNb2RlbCIsIkpTT05Nb2RlbCIsIiRkaXNwbGF5TW9kZSIsImFGaWVsZEludmFsaWQiLCJhRm9ybUVsZW1lbnRzIiwibUZpZWxkVmFsdWVNYXAiLCJ2YWxpZGF0ZVJlcXVpcmVkUHJvcGVydGllcyIsImFsbCIsImZpbHRlciIsIm9Gb3JtRWxlbWVudCIsIm9GaWVsZCIsImdldEZpZWxkcyIsImdldFJlcXVpcmVkIiwiZ2V0VmFsdWVTdGF0ZSIsIm1hcCIsInZhbHVlIiwiaXNBIiwiZ2V0SXRlbXMiLCJnZXRWYWx1ZSIsInVuZGVmaW5lZCIsImdldExhYmVsIiwiZ2V0VGV4dCIsImFSZXN1bHRzIiwicmVzdWx0IiwiX3ZhbGlkYXRlTWVzc2FnZXMiLCJpbnZhbGlkRmllbGRzIiwiYkNsZWFyVGFyZ2V0Iiwib01lc3NhZ2VNYW5hZ2VyIiwiQ29yZSIsImdldE1lc3NhZ2VNYW5hZ2VyIiwiYU1lc3NhZ2VzIiwiZ2V0TWVzc2FnZU1vZGVsIiwiZ2V0RGF0YSIsImZvckVhY2giLCJvQWN0aW9uUGFyYW1ldGVycyIsInNQYXJhbWV0ZXIiLCJvTWVzc2FnZSIsInNQYXJhbSIsInJlcGxhY2UiLCJjb250cm9sSWRzIiwiZ2V0Q29udHJvbElkIiwiaW5jbHVkZXMiLCJyZW1vdmVNZXNzYWdlcyIsInRhcmdldCIsIm9Db250cm9sbGVyIiwiaGFuZGxlQ2hhbmdlIiwib0V2ZW50IiwicmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzIiwiZ2V0U291cmNlIiwic0ZpZWxkSWQiLCJnZXRQYXJhbWV0ZXIiLCJvRmllbGRQcm9taXNlIiwiWE1MUHJlcHJvY2Vzc29yIiwicHJvY2VzcyIsIm5hbWUiLCJiaW5kaW5nQ29udGV4dHMiLCJhY3Rpb24iLCJlbnRpdHlTZXQiLCJtb2RlbHMiLCJjcmVhdGVkRnJhZ21lbnQiLCJhRnVuY3Rpb25QYXJhbXMiLCJvT3BlcmF0aW9uQmluZGluZyIsInNldFVzZXJEZWZhdWx0cyIsIkZyYWdtZW50IiwibG9hZCIsImRlZmluaXRpb24iLCJjb250cm9sbGVyIiwib0RpYWxvZ0NvbnRlbnQiLCJvRGlhbG9nIiwiRGlhbG9nIiwidGl0bGUiLCJjb250ZW50IiwiZXNjYXBlSGFuZGxlciIsImNsb3NlIiwiYmVnaW5CdXR0b24iLCJCdXR0b24iLCJnZW5lcmF0ZSIsInRleHQiLCJ0eXBlIiwicHJlc3MiLCJhRW1wdHlNYW5kYXRvcnlGaWVsZHMiLCJvTWVzc2FnZXMiLCJpIiwiY29kZSIsImN1c3RvbU1lc3NhZ2VzIiwibWVzc2FnZUhhbmRsaW5nIiwic2hvd1VuYm91bmRNZXNzYWdlcyIsIkJ1c3lMb2NrZXIiLCJsb2NrIiwiT2JqZWN0Iiwia2V5cyIsInNLZXkiLCJ2UGFyYW1ldGVyVmFsdWUiLCJvUGFyYW1ldGVyQ29udGV4dCIsImdldFBhcmFtZXRlckNvbnRleHQiLCJhTVZGQ29udGVudCIsImdldFByb3BlcnR5IiwiYUtleVZhbHVlcyIsImoiLCJLZXkiLCJtZXNzYWdlcyIsImdldE1lc3NhZ2VzIiwiY29uY2F0IiwiZXJyb3JUYXJnZXRzSW5BUEQiLCJtZXNzYWdlIiwiZ2V0VGFyZ2V0IiwiZGVzdHJveSIsInN1YnRpdGxlQ29sdW1uIiwiZ2V0TWVzc2FnZUNvbHVtbiIsImVycm9yQ29udGV4dCIsIm1lc3NhZ2VUYXJnZXRzIiwiZ2V0VGFyZ2V0cyIsImZpbmQiLCJvQ29udGV4dCIsImFkZGl0aW9uYWxUZXh0IiwiaXNPcGVuIiwic2hvd0Vycm9ySW5BUEQiLCJiU2hvd01lc3NhZ2VCb3giLCJiSGFzRXRhZ01lc3NhZ2UiLCJtb2RpZnlFVGFnTWVzc2FnZXNPbmx5Iiwic2hvd01lc3NhZ2VzIiwiaXNBY3Rpb25QYXJhbWV0ZXJEaWFsb2dPcGVuIiwibWVzc2FnZVBhZ2VOYXZpZ2F0aW9uQ2FsbGJhY2siLCJmaW5hbGx5IiwidW5sb2NrIiwiZW5kQnV0dG9uIiwiQ2FuY2VsQWN0aW9uRGlhbG9nIiwiYmVmb3JlT3BlbiIsIm9DbG9uZUV2ZW50IiwiYXNzaWduIiwiZ2V0RGVmYXVsdFZhbHVlc0Z1bmN0aW9uIiwic0RlZmF1bHRWYWx1ZXNGdW5jdGlvbiIsImZuU2V0RGVmYXVsdHNBbmRPcGVuRGlhbG9nIiwic0JpbmRpbmdQYXJhbWV0ZXIiLCJzQm91bmRGdW5jdGlvbk5hbWUiLCJwcmVmaWxsUGFyYW1ldGVyIiwic1BhcmFtTmFtZSIsInZQYXJhbURlZmF1bHRWYWx1ZSIsImluUmVzb2x2ZSIsIiRQYXRoIiwib1Byb21pc2UiLCJyZXF1ZXN0U2luZ2xldG9uUHJvcGVydHkiLCJvVmFsdWUiLCJyZXF1ZXN0UHJvcGVydHkiLCJ2UGFyYW1WYWx1ZSIsInNQYXRoRm9yQ29udGV4dCIsInBhcmFtTmFtZSIsImJOb1Bvc3NpYmxlVmFsdWUiLCJMb2ciLCJlcnJvciIsImJMYXRlUHJvcGVydHlFcnJvciIsIm9EYXRhIiwiZ2V0UGFyYW1ldGVyRGVmYXVsdFZhbHVlIiwic0FjdGlvblBhcmFtZXRlckFubm90YXRpb25UYXJnZXQiLCJvUGFyYW1ldGVyQW5ub3RhdGlvbnMiLCJvUGFyYW1ldGVyRGVmYXVsdFZhbHVlIiwiYUN1cnJlbnRQYXJhbURlZmF1bHRWYWx1ZSIsInZQYXJhbWV0ZXJEZWZhdWx0VmFsdWUiLCJhUHJlZmlsbFBhcmFtUHJvbWlzZXMiLCJhRXhlY0Z1bmN0aW9uUHJvbWlzZXMiLCJvRXhlY0Z1bmN0aW9uRnJvbU1hbmlmZXN0UHJvbWlzZSIsInNNb2R1bGUiLCJzdWJzdHJpbmciLCJsYXN0SW5kZXhPZiIsIkZQTUhlbHBlciIsImFjdGlvbldyYXBwZXIiLCJhUHJvbWlzZXMiLCJjdXJyZW50UGFyYW1EZWZhdWx0VmFsdWUiLCJmdW5jdGlvblBhcmFtcyIsIm9GdW5jdGlvblBhcmFtc0Zyb21NYW5pZmVzdCIsInNEaWFsb2dQYXJhbU5hbWUiLCJoYXNPd25Qcm9wZXJ0eSIsInNldFBhcmFtZXRlciIsImJFcnJvckZvdW5kIiwic1RleHQiLCJ3YXJuaW5nIiwiY29udGVudFdpZHRoIiwiYVBhcmFtZXRlcnMiLCJyZXF1ZXN0T2JqZWN0Iiwib0NvbnRleHRPYmplY3QiLCJhZnRlckNsb3NlIiwiZ2V0QWdncmVnYXRpb24iLCJzZXRNb2RlbCIsImJpbmRFbGVtZW50IiwicGF0aCIsIm9NVkZNb2RlbCIsImFkZERlcGVuZGVudCIsInNldEJpbmRpbmdDb250ZXh0IiwiZ2V0T2JqZWN0QmluZGluZyIsIm9wZW4iLCJzbGljZSIsInZBY3Rpb25Dcml0aWNhbCIsInNDcml0aWNhbFBhdGgiLCJhQmluZGluZ1BhcmFtcyIsImFQYXRocyIsImJDb25kaXRpb24iLCJvUGFyYW1zIiwiaW5kZXgiLCJqb2luIiwiZXhlY3V0ZURlcGVuZGluZ09uU2VsZWN0ZWRDb250ZXh0cyIsImJFbmFibGVTdHJpY3RIYW5kbGluZyIsIm9Qcm9wZXJ0eSIsIiRraW5kIiwibnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzIiwiZm5PblN0cmljdEhhbmRsaW5nRmFpbGVkIiwiYmluZCIsIm9wZXJhdGlvbnMiLCJpRXhpc3RpbmdNZXNzYWdlcyIsImZuRGlmZmVyZW50aWF0ZSIsInByb21pc2UiLCJyZXNwb25zZSIsInN0YXR1cyIsInNldEFjdGlvblBhcmFtZXRlckRlZmF1bHRWYWx1ZSIsImFBY3Rpb25Qcm9taXNlcyIsImZuRXhlY3V0ZUFjdGlvbiIsImFjdGlvbkNvbnRleHQiLCJvU2lkZUVmZmVjdCIsImdldFVwZGF0ZUdyb3VwSWQiLCJvU2lkZUVmZmVjdHNTZXJ2aWNlIiwiZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlIiwic1RyaWdnZXJBY3Rpb24iLCJleGVjdXRlQWN0aW9uIiwicmVxdWVzdFNpZGVFZmZlY3RzIiwiZm5FeGVjdXRlU2luZ2xlQWN0aW9uIiwiYWN0aW9uUmVzb2x2ZSIsIm9Mb2NhbFByb21pc2UiLCJhTG9jYWxQcm9taXNlIiwiZm5FeGVjdXRlU2VxdWVudGlhbGx5IiwiY29udGV4dHNUb0V4ZWN1dGUiLCJub29wIiwicHJvY2Vzc09uZUFjdGlvbiIsImFjdGlvbkluZGV4Iiwib0FjdGlvbkFuZFNpZGVFZmZlY3RQcm9taXNlIiwiaWQiLCJmbkhhbmRsZVJlc3VsdHMiLCJyZXN1bHRzIiwiYVJlamVjdGVkSXRlbXMiLCJhUmVzb2x2ZWRJdGVtcyIsImlSZXN1bHRDb3VudCIsImJDb25zaWRlckRvY3VtZW50TW9kaWZpZWQiLCJyZXNvbHZlZEl0ZW1zIiwicmVqZWN0ZWRJdGVtcyIsInNob3dEaWFsb2ciXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7Ozs7OztBQWFBO0FBRUEsTUFBTUEsU0FBUyxHQUFHQyxTQUFTLENBQUNELFNBQTVCO0FBQUEsTUFDQ0Usa0JBQWtCLEdBQUdELFNBQVMsQ0FBQ0Msa0JBRGhDO0FBRUEsTUFBTUMsTUFBTSxHQUFJQyxVQUFELENBQW9CRCxNQUFuQztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBQ0EsV0FBU0UsZUFBVCxDQUF5QkMsV0FBekIsRUFBOENDLFFBQTlDLEVBQTZEQyxNQUE3RCxFQUEwRUMsYUFBMUUsRUFBaUdDLFdBQWpHLEVBQW1IO0FBQ2xILFFBQUksQ0FBQ0gsUUFBRCxJQUFhQSxRQUFRLENBQUNJLE1BQVQsS0FBb0IsQ0FBckMsRUFBd0M7QUFDdkM7QUFDQSxh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QUQsSUFDQUEsZ0JBQWdCLENBQUN4QyxNQUFqQixLQUE0QixDQUQ1QixJQUVDd0MsZ0JBQWdCLENBQUN4QyxNQUFqQixLQUE0QixDQUE1QixJQUFpQ3dDLGdCQUFnQixDQUFDLENBQUQsQ0FBaEIsQ0FBb0I2RCxLQUFwQixLQUE4QixzQkFIakUsRUFJRTtBQUNEaVIsUUFBQUEsVUFBVSxHQUFHLEtBQWI7QUFDQTtBQUNEOztBQUVELFdBQU9BLFVBQVA7QUFDQTtBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ0EsTUFBTXBDLFVBQVUsR0FBRztBQUNsQnhWLElBQUFBLGVBQWUsRUFBRUEsZUFEQztBQUVsQnVCLElBQUFBLGdCQUFnQixFQUFFQSxnQkFGQTtBQUdsQkksSUFBQUEsaUJBQWlCLEVBQUVBLGlCQUhEO0FBSWxCTSxJQUFBQSxrQkFBa0IsRUFBRUEsa0JBSkY7QUFLbEJnVCxJQUFBQSxrQ0FBa0MsRUFBRUEsa0NBTGxCO0FBTWxCNVIsSUFBQUEseUJBQXlCLEVBQUVVO0FBTlQsR0FBbkI7U0FTZXlSLFUiLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IENvbW1vblV0aWxzIGZyb20gXCJzYXAvZmUvY29yZS9Db21tb25VdGlsc1wiO1xuaW1wb3J0IEJ1c3lMb2NrZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL0J1c3lMb2NrZXJcIjtcbmltcG9ydCBtZXNzYWdlSGFuZGxpbmcgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL21lc3NhZ2VIYW5kbGVyL21lc3NhZ2VIYW5kbGluZ1wiO1xuaW1wb3J0IEZQTUhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9GUE1IZWxwZXJcIjtcbmltcG9ydCB7IGdlbmVyYXRlIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvU3RhYmxlSWRIZWxwZXJcIjtcbmltcG9ydCBGRUxpYnJhcnkgZnJvbSBcInNhcC9mZS9jb3JlL2xpYnJhcnlcIjtcbmltcG9ydCBCdXR0b24gZnJvbSBcInNhcC9tL0J1dHRvblwiO1xuaW1wb3J0IERpYWxvZyBmcm9tIFwic2FwL20vRGlhbG9nXCI7XG5pbXBvcnQgTWVzc2FnZUJveCBmcm9tIFwic2FwL20vTWVzc2FnZUJveFwiO1xuaW1wb3J0IENvcmUgZnJvbSBcInNhcC91aS9jb3JlL0NvcmVcIjtcbmltcG9ydCBGcmFnbWVudCBmcm9tIFwic2FwL3VpL2NvcmUvRnJhZ21lbnRcIjtcbmltcG9ydCBYTUxQcmVwcm9jZXNzb3IgZnJvbSBcInNhcC91aS9jb3JlL3V0aWwvWE1MUHJlcHJvY2Vzc29yXCI7XG5pbXBvcnQgWE1MVGVtcGxhdGVQcm9jZXNzb3IgZnJvbSBcInNhcC91aS9jb3JlL1hNTFRlbXBsYXRlUHJvY2Vzc29yXCI7XG5pbXBvcnQgSlNPTk1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvanNvbi9KU09OTW9kZWxcIjtcbi8vIGltcG9ydCB0eXBlIENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5cbmNvbnN0IENvbnN0YW50cyA9IEZFTGlicmFyeS5Db25zdGFudHMsXG5cdEludm9jYXRpb25Hcm91cGluZyA9IEZFTGlicmFyeS5JbnZvY2F0aW9uR3JvdXBpbmc7XG5jb25zdCBBY3Rpb24gPSAoTWVzc2FnZUJveCBhcyBhbnkpLkFjdGlvbjtcblxuLyoqXG4gKiBDYWxscyBhIGJvdW5kIGFjdGlvbiBmb3Igb25lIG9yIG11bHRpcGxlIGNvbnRleHRzLlxuICpcbiAqIEBmdW5jdGlvblxuICogQHN0YXRpY1xuICogQG5hbWUgc2FwLmZlLmNvcmUuYWN0aW9ucy5vcGVyYXRpb25zLmNhbGxCb3VuZEFjdGlvblxuICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmFjdGlvbnMub3BlcmF0aW9uc1xuICogQHBhcmFtIHNBY3Rpb25OYW1lIFRoZSBuYW1lIG9mIHRoZSBhY3Rpb24gdG8gYmUgY2FsbGVkXG4gKiBAcGFyYW0gY29udGV4dHMgRWl0aGVyIG9uZSBjb250ZXh0IG9yIGFuIGFycmF5IHdpdGggY29udGV4dHMgZm9yIHdoaWNoIHRoZSBhY3Rpb24gaXMgdG8gYmUgYmUgY2FsbGVkXG4gKiBAcGFyYW0gb01vZGVsIE9EYXRhIE1vZGVsXG4gKiBAcGFyYW0gb0FwcENvbXBvbmVudCBUaGUgQXBwQ29tcG9uZW50XG4gKiBAcGFyYW0gIFttUGFyYW1ldGVyc10gT3B0aW9uYWwsIGNhbiBjb250YWluIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcbiAqIEBwYXJhbSAgW21QYXJhbWV0ZXJzLmFjdGlvblBhcmFtZXRlcnNdIEEgbWFwIG9mIHBhcmFtZXRlcnMgdG8gYmUgc2VudCBmb3IgZXZlcnkgYWN0aW9uIGNhbGxcbiAqIEBwYXJhbSAgW21QYXJhbWV0ZXJzLm1CaW5kaW5nUGFyYW1ldGVyc10gQSBtYXAgb2YgYmluZGluZyBwYXJhbWV0ZXJzIHRoYXQgd291bGQgYmUgcGFydCBvZiAkc2VsZWN0IGFuZCAkZXhwYW5kIGNvbWluZyBmcm9tIHNpZGUgZWZmZWN0cyBmb3IgYm91bmQgYWN0aW9uc1xuICogQHBhcmFtIFttUGFyYW1ldGVycy5hZGRpdGlvbmFsU2lkZUVmZmVjdF0gQXJyYXkgb2YgcHJvcGVydHkgcGF0aHMgdG8gYmUgcmVxdWVzdGVkIGluIGFkZGl0aW9uIHRvIGFjdHVhbCB0YXJnZXQgcHJvcGVydGllcyBvZiB0aGUgc2lkZSBlZmZlY3RcbiAqIEBwYXJhbSBbbVBhcmFtZXRlcnMuc2hvd0FjdGlvblBhcmFtZXRlckRpYWxvZ10gSWYgc2V0IGFuZCBpZiBwYXJhbWV0ZXJzIGV4aXN0IHRoZSB1c2VyIHJldHJpZXZlcyBhIGRpYWxvZyB0byBmaWxsIGluIHBhcmFtZXRlcnMsIGlmIGFjdGlvblBhcmFtZXRlcnMgYXJlIHBhc3NlZCB0aGV5IGFyZSBzaG93biB0byB0aGUgdXNlclxuICogQHBhcmFtIFttUGFyYW1ldGVycy5sYWJlbF0gQSBodW1hbi1yZWFkYWJsZSBsYWJlbCBmb3IgdGhlIGFjdGlvblxuICogQHBhcmFtIFttUGFyYW1ldGVycy5pbnZvY2F0aW9uR3JvdXBpbmddIE1vZGUgaG93IGFjdGlvbnMgYXJlIHRvIGJlIGNhbGxlZDogQ2hhbmdlc2V0IHRvIHB1dCBhbGwgYWN0aW9uIGNhbGxzIGludG8gb25lIGNoYW5nZXNldCwgSXNvbGF0ZWQgdG8gcHV0IHRoZW0gaW50byBzZXBhcmF0ZSBjaGFuZ2VzZXRzLCBkZWZhdWx0cyB0byBJc29sYXRlZFxuICogQHBhcmFtIFttUGFyYW1ldGVycy5vblN1Ym1pdHRlZF0gRnVuY3Rpb24gd2hpY2ggaXMgY2FsbGVkIG9uY2UgdGhlIGFjdGlvbnMgYXJlIHN1Ym1pdHRlZCB3aXRoIGFuIGFycmF5IG9mIHByb21pc2VzXG4gKiBAcGFyYW0gIFttUGFyYW1ldGVycy5kZWZhdWx0UGFyYW1ldGVyc10gQ2FuIGNvbnRhaW4gZGVmYXVsdCBwYXJhbWV0ZXJzIGZyb20gRkxQIHVzZXIgZGVmYXVsdHNcbiAqIEBwYXJhbSBbbVBhcmFtZXRlcnMucGFyZW50Q29udHJvbF0gSWYgc3BlY2lmaWVkIHRoZSBkaWFsb2dzIGFyZSBhZGRlZCBhcyBkZXBlbmRlbnQgb2YgdGhlIHBhcmVudCBjb250cm9sXG4gKiBAcGFyYW0gW21QYXJhbWV0ZXJzLmJHZXRCb3VuZENvbnRleHRdIElmIHNwZWNpZmllZCB0aGUgYWN0aW9uIHByb21pc2UgcmV0dXJucyB0aGUgYm91bmQgY29udGV4dFxuICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyB3aXRoIGFuIGFycmF5IG9mIHJlc3BvbnNlIG9iamVjdHMgKFRPRE86IHRvIGJlIGNoYW5nZWQpXG4gKiBAcHJpdmF0ZVxuICogQHVpNS1yZXN0cmljdGVkXG4gKi9cbmZ1bmN0aW9uIGNhbGxCb3VuZEFjdGlvbihzQWN0aW9uTmFtZTogc3RyaW5nLCBjb250ZXh0czogYW55LCBvTW9kZWw6IGFueSwgb0FwcENvbXBvbmVudDogb2JqZWN0LCBtUGFyYW1ldGVyczogYW55KSB7XG5cdGlmICghY29udGV4dHMgfHwgY29udGV4dHMubGVuZ3RoID09PSAwKSB7XG5cdFx0Ly9JbiBGcmVlc3R5bGUgYXBwcyBib3VuZCBhY3Rpb25zIGNhbiBoYXZlIG5vIGNvbnRleHRcblx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoXCJCb3VuZCBhY3Rpb25zIGFsd2F5cyByZXF1aXJlcyBhdCBsZWFzdCBvbmUgY29udGV4dFwiKTtcblx0fVxuXHQvLyB3ZSBleHBlY3QgZWl0aGVyIG9uZSBjb250ZXh0IG9yIGFuIGFycmF5IG9mIGNvbnRleHRzXG5cdGlmIChBcnJheS5pc0FycmF5KGNvbnRleHRzKSkge1xuXHRcdG1QYXJhbWV0ZXJzLmJSZXR1cm5Bc0FycmF5ID0gdHJ1ZTtcblx0fSBlbHNlIHtcblx0XHQvL2FjdGlvbiBuZWVkcyB0byBiZSBjYWxsZWQgb24gdGhpcyBjb250ZXh0IGZyb20gdGhlIGRlcGVuZGVudCBiaW5kaW5nIHNvIFVJIGZpZWxkcyBhcmUgdXBkYXRlZCB3aXRoIHJlc3BvbnNlIGRhdGFcblx0XHRjb250ZXh0cyA9IFtjb250ZXh0c107XG5cdH1cblx0Y29uc3Qgb01ldGFNb2RlbCA9IG9Nb2RlbC5nZXRNZXRhTW9kZWwoKSxcblx0XHRzQWN0aW9uUGF0aCA9IGAke29NZXRhTW9kZWwuZ2V0TWV0YVBhdGgoY29udGV4dHNbMF0uZ2V0UGF0aCgpKX0vJHtzQWN0aW9uTmFtZX1gLFxuXHRcdG9Cb3VuZEFjdGlvbiA9IG9NZXRhTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoYCR7c0FjdGlvblBhdGh9L0AkdWk1Lm92ZXJsb2FkLzBgKTtcblx0bVBhcmFtZXRlcnMuYUNvbnRleHRzID0gY29udGV4dHM7XG5cdG1QYXJhbWV0ZXJzLmlzQ3JpdGljYWxBY3Rpb24gPSBnZXRJc0FjdGlvbkNyaXRpY2FsKG9NZXRhTW9kZWwsIHNBY3Rpb25QYXRoLCBjb250ZXh0cywgb0JvdW5kQWN0aW9uKTtcblx0cmV0dXJuIGNhbGxBY3Rpb24oc0FjdGlvbk5hbWUsIG9Nb2RlbCwgb0JvdW5kQWN0aW9uLCBvQXBwQ29tcG9uZW50LCBtUGFyYW1ldGVycyk7XG59XG4vKipcbiAqIENhbGxzIGFuIGFjdGlvbiBpbXBvcnQuXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAc3RhdGljXG4gKiBAbmFtZSBzYXAuZmUuY29yZS5hY3Rpb25zLm9wZXJhdGlvbnMuY2FsbEFjdGlvbkltcG9ydFxuICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmFjdGlvbnMub3BlcmF0aW9uc1xuICogQHBhcmFtIHNBY3Rpb25OYW1lIFRoZSBuYW1lIG9mIHRoZSBhY3Rpb24gaW1wb3J0IHRvIGJlIGNhbGxlZFxuICogQHBhcmFtIG9Nb2RlbCBBbiBpbnN0YW5jZSBvZiBhbiBPRGF0YSB2NCBtb2RlbFxuICogQHBhcmFtIG9BcHBDb21wb25lbnQgVGhlIEFwcENvbXBvbmVudFxuICogQHBhcmFtIFttUGFyYW1ldGVyc10gT3B0aW9uYWwsIGNhbiBjb250YWluIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcbiAqIEBwYXJhbSBbbVBhcmFtZXRlcnMuYWN0aW9uUGFyYW1ldGVyc10gQSBtYXAgb2YgcGFyYW1ldGVycyB0byBiZSBzZW50IHdpdGggdGhlIGFjdGlvbiBpbXBvcnRcbiAqIEBwYXJhbSBbbVBhcmFtZXRlcnMubGFiZWxdIEEgaHVtYW4tcmVhZGFibGUgbGFiZWwgZm9yIHRoZSBhY3Rpb25cbiAqIEBwYXJhbSBbbVBhcmFtZXRlcnMuc2hvd0FjdGlvblBhcmFtZXRlckRpYWxvZ10gSWYgc2V0IGFuZCBpZiBwYXJhbWV0ZXJzIGV4aXN0IHRoZSB1c2VyIHJldHJpZXZlcyBhIGRpYWxvZyB0byBmaWxsIGluIHBhcmFtZXRlcnMsIGlmIGFjdGlvblBhcmFtZXRlcnMgYXJlIHBhc3NlZCB0aGV5IGFyZSBzaG93biB0byB0aGUgdXNlclxuICogQHBhcmFtIFttUGFyYW1ldGVycy5vblN1Ym1pdHRlZF0gRnVuY3Rpb24gd2hpY2ggaXMgY2FsbGVkIG9uY2UgdGhlIGFjdGlvbnMgYXJlIHN1Ym1pdHRlZCB3aXRoIGFuIGFycmF5IG9mIHByb21pc2VzXG4gKiBAcGFyYW0gW21QYXJhbWV0ZXJzLmRlZmF1bHRQYXJhbWV0ZXJzXSBDYW4gY29udGFpbiBkZWZhdWx0IHBhcmFtZXRlcnMgZnJvbSBGTFAgdXNlciBkZWZhdWx0c1xuICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyB3aXRoIGFuIGFycmF5IG9mIHJlc3BvbnNlIG9iamVjdHMgKFRPRE86IHRvIGJlIGNoYW5nZWQpXG4gKiBAcHJpdmF0ZVxuICogQHVpNS1yZXN0cmljdGVkXG4gKi9cbmZ1bmN0aW9uIGNhbGxBY3Rpb25JbXBvcnQoc0FjdGlvbk5hbWU6IHN0cmluZywgb01vZGVsOiBhbnksIG9BcHBDb21wb25lbnQ6IG9iamVjdCwgbVBhcmFtZXRlcnM6IGFueSkge1xuXHRpZiAoIW9Nb2RlbCkge1xuXHRcdHJldHVybiBQcm9taXNlLnJlamVjdChcIkFjdGlvbiBleHBlY3RzIGEgbW9kZWwvY29udGV4dCBmb3IgZXhlY3V0aW9uXCIpO1xuXHR9XG5cdGNvbnN0IG9NZXRhTW9kZWwgPSBvTW9kZWwuZ2V0TWV0YU1vZGVsKCksXG5cdFx0c0FjdGlvblBhdGggPSBvTW9kZWwuYmluZENvbnRleHQoYC8ke3NBY3Rpb25OYW1lfWApLmdldFBhdGgoKSxcblx0XHRvQWN0aW9uSW1wb3J0ID0gb01ldGFNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChgLyR7b01ldGFNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChzQWN0aW9uUGF0aCkuZ2V0T2JqZWN0KFwiJEFjdGlvblwiKX0vMGApO1xuXHRtUGFyYW1ldGVycy5pc0NyaXRpY2FsQWN0aW9uID0gZ2V0SXNBY3Rpb25Dcml0aWNhbChvTWV0YU1vZGVsLCBgJHtzQWN0aW9uUGF0aH0vQCR1aTUub3ZlcmxvYWRgKTtcblx0cmV0dXJuIGNhbGxBY3Rpb24oc0FjdGlvbk5hbWUsIG9Nb2RlbCwgb0FjdGlvbkltcG9ydCwgb0FwcENvbXBvbmVudCwgbVBhcmFtZXRlcnMpO1xufVxuZnVuY3Rpb24gY2FsbEJvdW5kRnVuY3Rpb24oc0Z1bmN0aW9uTmFtZTogc3RyaW5nLCBjb250ZXh0OiBhbnksIG9Nb2RlbDogYW55KSB7XG5cdGlmICghY29udGV4dCkge1xuXHRcdHJldHVybiBQcm9taXNlLnJlamVjdChcIkJvdW5kIGZ1bmN0aW9ucyBhbHdheXMgcmVxdWlyZXMgYSBjb250ZXh0XCIpO1xuXHR9XG5cdGNvbnN0IG9NZXRhTW9kZWwgPSBvTW9kZWwuZ2V0TWV0YU1vZGVsKCksXG5cdFx0c0Z1bmN0aW9uUGF0aCA9IGAke29NZXRhTW9kZWwuZ2V0TWV0YVBhdGgoY29udGV4dC5nZXRQYXRoKCkpfS8ke3NGdW5jdGlvbk5hbWV9YCxcblx0XHRvQm91bmRGdW5jdGlvbiA9IG9NZXRhTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoc0Z1bmN0aW9uUGF0aCk7XG5cdHJldHVybiBfZXhlY3V0ZUZ1bmN0aW9uKHNGdW5jdGlvbk5hbWUsIG9Nb2RlbCwgb0JvdW5kRnVuY3Rpb24sIGNvbnRleHQpO1xufVxuLyoqXG4gKiBDYWxscyBhIGZ1bmN0aW9uIGltcG9ydC5cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBzdGF0aWNcbiAqIEBuYW1lIHNhcC5mZS5jb3JlLmFjdGlvbnMub3BlcmF0aW9ucy5jYWxsRnVuY3Rpb25JbXBvcnRcbiAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5hY3Rpb25zLm9wZXJhdGlvbnNcbiAqIEBwYXJhbSBzRnVuY3Rpb25OYW1lIFRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiB0byBiZSBjYWxsZWRcbiAqIEBwYXJhbSBvTW9kZWwgQW4gaW5zdGFuY2Ugb2YgYW4gT0RhdGEgdjQgbW9kZWxcbiAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXNcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGNhbGxGdW5jdGlvbkltcG9ydChzRnVuY3Rpb25OYW1lOiBzdHJpbmcsIG9Nb2RlbDogYW55KSB7XG5cdGlmICghc0Z1bmN0aW9uTmFtZSkge1xuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0fVxuXHRjb25zdCBvTWV0YU1vZGVsID0gb01vZGVsLmdldE1ldGFNb2RlbCgpLFxuXHRcdHNGdW5jdGlvblBhdGggPSBvTW9kZWwuYmluZENvbnRleHQoYC8ke3NGdW5jdGlvbk5hbWV9YCkuZ2V0UGF0aCgpLFxuXHRcdG9GdW5jdGlvbkltcG9ydCA9IG9NZXRhTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoYC8ke29NZXRhTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoc0Z1bmN0aW9uUGF0aCkuZ2V0T2JqZWN0KFwiJEZ1bmN0aW9uXCIpfS8wYCk7XG5cdHJldHVybiBfZXhlY3V0ZUZ1bmN0aW9uKHNGdW5jdGlvbk5hbWUsIG9Nb2RlbCwgb0Z1bmN0aW9uSW1wb3J0KTtcbn1cbmZ1bmN0aW9uIF9leGVjdXRlRnVuY3Rpb24oc0Z1bmN0aW9uTmFtZTogYW55LCBvTW9kZWw6IGFueSwgb0Z1bmN0aW9uOiBhbnksIGNvbnRleHQ/OiBhbnkpIHtcblx0bGV0IHNHcm91cElkO1xuXHRpZiAoIW9GdW5jdGlvbiB8fCAhb0Z1bmN0aW9uLmdldE9iamVjdCgpKSB7XG5cdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgRnVuY3Rpb24gJHtzRnVuY3Rpb25OYW1lfSBub3QgZm91bmRgKSk7XG5cdH1cblx0aWYgKGNvbnRleHQpIHtcblx0XHRvRnVuY3Rpb24gPSBvTW9kZWwuYmluZENvbnRleHQoYCR7c0Z1bmN0aW9uTmFtZX0oLi4uKWAsIGNvbnRleHQpO1xuXHRcdHNHcm91cElkID0gXCJmdW5jdGlvbkdyb3VwXCI7XG5cdH0gZWxzZSB7XG5cdFx0b0Z1bmN0aW9uID0gb01vZGVsLmJpbmRDb250ZXh0KGAvJHtzRnVuY3Rpb25OYW1lfSguLi4pYCk7XG5cdFx0c0dyb3VwSWQgPSBcImZ1bmN0aW9uSW1wb3J0XCI7XG5cdH1cblx0Y29uc3Qgb0Z1bmN0aW9uUHJvbWlzZSA9IG9GdW5jdGlvbi5leGVjdXRlKHNHcm91cElkKTtcblx0b01vZGVsLnN1Ym1pdEJhdGNoKHNHcm91cElkKTtcblx0cmV0dXJuIG9GdW5jdGlvblByb21pc2UudGhlbihmdW5jdGlvbiAoKSB7XG5cdFx0cmV0dXJuIG9GdW5jdGlvbi5nZXRCb3VuZENvbnRleHQoKTtcblx0fSk7XG59XG5mdW5jdGlvbiBjYWxsQWN0aW9uKHNBY3Rpb25OYW1lOiBhbnksIG9Nb2RlbDogYW55LCBvQWN0aW9uOiBhbnksIG9BcHBDb21wb25lbnQ6IGFueSwgbVBhcmFtZXRlcnM6IGFueSkge1xuXHRyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmU6ICh2YWx1ZTogYW55KSA9PiB2b2lkLCByZWplY3Q6IChyZWFzb24/OiBhbnkpID0+IHZvaWQpIHtcblx0XHRsZXQgYUFjdGlvblBhcmFtZXRlcnMgPSBtUGFyYW1ldGVycy5hY3Rpb25QYXJhbWV0ZXJzIHx8IFtdO1xuXHRcdGxldCBtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVyczogYW55ID0ge307XG5cdFx0bGV0IGZuRGlhbG9nO1xuXHRcdGxldCBvQWN0aW9uUHJvbWlzZTtcblx0XHRjb25zdCBzQWN0aW9uTGFiZWwgPSBtUGFyYW1ldGVycy5sYWJlbDtcblx0XHRsZXQgYlNob3dBY3Rpb25QYXJhbWV0ZXJEaWFsb2cgPSBtUGFyYW1ldGVycy5zaG93QWN0aW9uUGFyYW1ldGVyRGlhbG9nO1xuXHRcdGNvbnN0IGFDb250ZXh0cyA9IG1QYXJhbWV0ZXJzLmFDb250ZXh0cztcblx0XHRjb25zdCBiSXNDcmVhdGVBY3Rpb24gPSBtUGFyYW1ldGVycy5iSXNDcmVhdGVBY3Rpb247XG5cdFx0Y29uc3QgYklzQ3JpdGljYWxBY3Rpb24gPSBtUGFyYW1ldGVycy5pc0NyaXRpY2FsQWN0aW9uO1xuXHRcdGxldCBvTWV0YU1vZGVsO1xuXHRcdGxldCBzTWV0YVBhdGg7XG5cdFx0bGV0IHNNZXNzYWdlc1BhdGg6IGFueTtcblx0XHRsZXQgaU1lc3NhZ2VTaWRlRWZmZWN0O1xuXHRcdGxldCBiSXNTYW1lRW50aXR5O1xuXHRcdGxldCBvUmV0dXJuVHlwZTtcblx0XHRjb25zdCBhY3Rpb25EZWZpbml0aW9uID0gb0FjdGlvbi5nZXRPYmplY3QoKTtcblx0XHRpZiAoIW9BY3Rpb24gfHwgIW9BY3Rpb24uZ2V0T2JqZWN0KCkpIHtcblx0XHRcdHJldHVybiByZWplY3QobmV3IEVycm9yKGBBY3Rpb24gJHtzQWN0aW9uTmFtZX0gbm90IGZvdW5kYCkpO1xuXHRcdH1cblxuXHRcdGFBY3Rpb25QYXJhbWV0ZXJzID0gZ2V0QWN0aW9uUGFyYW1ldGVycyhvQWN0aW9uKTtcblxuXHRcdGJTaG93QWN0aW9uUGFyYW1ldGVyRGlhbG9nID0gX3Nob3dBY3Rpb25QYXJhbWV0ZXJEaWFsb2coYlNob3dBY3Rpb25QYXJhbWV0ZXJEaWFsb2csIGFBY3Rpb25QYXJhbWV0ZXJzKTtcblxuXHRcdGlmIChiU2hvd0FjdGlvblBhcmFtZXRlckRpYWxvZykge1xuXHRcdFx0Zm5EaWFsb2cgPSBzaG93QWN0aW9uUGFyYW1ldGVyRGlhbG9nO1xuXHRcdH0gZWxzZSBpZiAoYklzQ3JpdGljYWxBY3Rpb24pIHtcblx0XHRcdGZuRGlhbG9nID0gY29uZmlybUNyaXRpY2FsQWN0aW9uO1xuXHRcdH1cblx0XHRtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycyA9IHtcblx0XHRcdGZuT25TdWJtaXR0ZWQ6IG1QYXJhbWV0ZXJzLm9uU3VibWl0dGVkLFxuXHRcdFx0Zm5PblJlc3BvbnNlOiBtUGFyYW1ldGVycy5vblJlc3BvbnNlLFxuXHRcdFx0YWN0aW9uTmFtZTogc0FjdGlvbk5hbWUsXG5cdFx0XHRtb2RlbDogb01vZGVsLFxuXHRcdFx0YUFjdGlvblBhcmFtZXRlcnM6IGFBY3Rpb25QYXJhbWV0ZXJzLFxuXHRcdFx0YkdldEJvdW5kQ29udGV4dDogbVBhcmFtZXRlcnMuYkdldEJvdW5kQ29udGV4dCxcblx0XHRcdGRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbjogbVBhcmFtZXRlcnMuZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uLFxuXHRcdFx0bGFiZWw6IG1QYXJhbWV0ZXJzLmxhYmVsXG5cdFx0fTtcblx0XHRpZiAob0FjdGlvbi5nZXRPYmplY3QoXCIkSXNCb3VuZFwiKSkge1xuXHRcdFx0aWYgKG1QYXJhbWV0ZXJzLmFkZGl0aW9uYWxTaWRlRWZmZWN0ICYmIG1QYXJhbWV0ZXJzLmFkZGl0aW9uYWxTaWRlRWZmZWN0LnBhdGhFeHByZXNzaW9ucykge1xuXHRcdFx0XHRvTWV0YU1vZGVsID0gb01vZGVsLmdldE1ldGFNb2RlbCgpO1xuXHRcdFx0XHRzTWV0YVBhdGggPSBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKGFDb250ZXh0c1swXS5nZXRQYXRoKCkpO1xuXHRcdFx0XHRzTWVzc2FnZXNQYXRoID0gb01ldGFNb2RlbC5nZXRPYmplY3QoYCR7c01ldGFQYXRofS9AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLk1lc3NhZ2VzLyRQYXRoYCk7XG5cblx0XHRcdFx0aWYgKHNNZXNzYWdlc1BhdGgpIHtcblx0XHRcdFx0XHRpTWVzc2FnZVNpZGVFZmZlY3QgPSBtUGFyYW1ldGVycy5hZGRpdGlvbmFsU2lkZUVmZmVjdC5wYXRoRXhwcmVzc2lvbnMuZmluZEluZGV4KGZ1bmN0aW9uIChleHA6IGFueSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHR5cGVvZiBleHAgPT09IFwic3RyaW5nXCIgJiYgZXhwID09PSBzTWVzc2FnZXNQYXRoO1xuXHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdFx0Ly8gQWRkIFNBUF9NZXNzYWdlcyBieSBkZWZhdWx0IGlmIG5vdCBhbm5vdGF0ZWQgYnkgc2lkZSBlZmZlY3RzLCBhY3Rpb24gZG9lcyBub3QgcmV0dXJuIGEgY29sbGVjdGlvbiBhbmRcblx0XHRcdFx0XHQvLyB0aGUgcmV0dXJuIHR5cGUgaXMgdGhlIHNhbWUgYXMgdGhlIGJvdW5kIHR5cGVcblx0XHRcdFx0XHRvUmV0dXJuVHlwZSA9IG9BY3Rpb24uZ2V0T2JqZWN0KFwiJFJldHVyblR5cGVcIik7XG5cdFx0XHRcdFx0YklzU2FtZUVudGl0eSA9XG5cdFx0XHRcdFx0XHRvUmV0dXJuVHlwZSAmJiAhb1JldHVyblR5cGUuJGlzQ29sbGVjdGlvbiAmJiBvQWN0aW9uLmdldE1vZGVsKCkuZ2V0T2JqZWN0KHNNZXRhUGF0aCkuJFR5cGUgPT09IG9SZXR1cm5UeXBlLiRUeXBlO1xuXG5cdFx0XHRcdFx0aWYgKGlNZXNzYWdlU2lkZUVmZmVjdCA+IC0xIHx8IGJJc1NhbWVFbnRpdHkpIHtcblx0XHRcdFx0XHRcdC8vIHRoZSBtZXNzYWdlIHBhdGggaXMgYW5ub3RhdGVkIGFzIHNpZGUgZWZmZWN0LiBBcyB0aGVyZSdzIG5vIGJpbmRpbmcgZm9yIGl0IGFuZCB0aGUgbW9kZWwgZG9lcyBjdXJyZW50bHkgbm90IGFsbG93XG5cdFx0XHRcdFx0XHQvLyB0byBhZGQgaXQgYXQgYSBsYXRlciBwb2ludCBvZiB0aW1lIHdlIGhhdmUgdG8gdGFrZSBjYXJlIGl0J3MgcGFydCBvZiB0aGUgJHNlbGVjdCBvZiB0aGUgUE9TVCwgdGhlcmVmb3JlIG1vdmluZyBpdC5cblx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLm1CaW5kaW5nUGFyYW1ldGVycyA9IG1QYXJhbWV0ZXJzLm1CaW5kaW5nUGFyYW1ldGVycyB8fCB7fTtcblxuXHRcdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0XHRvQWN0aW9uLmdldE9iamVjdChgJFJldHVyblR5cGUvJFR5cGUvJHtzTWVzc2FnZXNQYXRofWApICYmXG5cdFx0XHRcdFx0XHRcdCghbVBhcmFtZXRlcnMubUJpbmRpbmdQYXJhbWV0ZXJzLiRzZWxlY3QgfHxcblx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5tQmluZGluZ1BhcmFtZXRlcnMuJHNlbGVjdC5zcGxpdChcIixcIikuaW5kZXhPZihzTWVzc2FnZXNQYXRoKSA9PT0gLTEpXG5cdFx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMubUJpbmRpbmdQYXJhbWV0ZXJzLiRzZWxlY3QgPSBtUGFyYW1ldGVycy5tQmluZGluZ1BhcmFtZXRlcnMuJHNlbGVjdFxuXHRcdFx0XHRcdFx0XHRcdD8gYCR7bVBhcmFtZXRlcnMubUJpbmRpbmdQYXJhbWV0ZXJzLiRzZWxlY3R9LCR7c01lc3NhZ2VzUGF0aH1gXG5cdFx0XHRcdFx0XHRcdFx0OiBzTWVzc2FnZXNQYXRoO1xuXHRcdFx0XHRcdFx0XHQvLyBBZGQgc2lkZSBlZmZlY3RzIGF0IGVudGl0eSBsZXZlbCBiZWNhdXNlICRzZWxlY3Qgc3RvcHMgdGhlc2UgYmVpbmcgcmV0dXJuZWQgYnkgdGhlIGFjdGlvblxuXHRcdFx0XHRcdFx0XHQvLyBPbmx5IGlmIG5vIG90aGVyIHNpZGUgZWZmZWN0cyB3ZXJlIGFkZGVkIGZvciBNZXNzYWdlc1xuXHRcdFx0XHRcdFx0XHRpZiAoaU1lc3NhZ2VTaWRlRWZmZWN0ID09PSAtMSkge1xuXHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmFkZGl0aW9uYWxTaWRlRWZmZWN0LnBhdGhFeHByZXNzaW9ucy5wdXNoKFwiKlwiKTtcblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdGlmIChtUGFyYW1ldGVycy5hZGRpdGlvbmFsU2lkZUVmZmVjdC50cmlnZ2VyQWN0aW9ucy5sZW5ndGggPT09IDAgJiYgaU1lc3NhZ2VTaWRlRWZmZWN0ID4gLTEpIHtcblx0XHRcdFx0XHRcdFx0XHQvLyBubyB0cmlnZ2VyIGFjdGlvbiB0aGVyZWZvcmUgbm8gbmVlZCB0byByZXF1ZXN0IG1lc3NhZ2VzIGFnYWluXG5cdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMuYWRkaXRpb25hbFNpZGVFZmZlY3QucGF0aEV4cHJlc3Npb25zLnNwbGljZShpTWVzc2FnZVNpZGVFZmZlY3QsIDEpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLmFDb250ZXh0cyA9IGFDb250ZXh0cztcblx0XHRcdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLm1CaW5kaW5nUGFyYW1ldGVycyA9IG1QYXJhbWV0ZXJzLm1CaW5kaW5nUGFyYW1ldGVycztcblx0XHRcdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLmFkZGl0aW9uYWxTaWRlRWZmZWN0ID0gbVBhcmFtZXRlcnMuYWRkaXRpb25hbFNpZGVFZmZlY3Q7XG5cdFx0XHRtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycy5iR3JvdXBlZCA9IG1QYXJhbWV0ZXJzLmludm9jYXRpb25Hcm91cGluZyA9PT0gSW52b2NhdGlvbkdyb3VwaW5nLkNoYW5nZVNldDtcblx0XHRcdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLmJSZXR1cm5Bc0FycmF5ID0gbVBhcmFtZXRlcnMuYlJldHVybkFzQXJyYXk7XG5cdFx0XHRtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dCA9IG1QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0O1xuXHRcdFx0bUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMub3BlcmF0aW9uQXZhaWxhYmxlTWFwID0gbVBhcmFtZXRlcnMub3BlcmF0aW9uQXZhaWxhYmxlTWFwO1xuXHRcdFx0bUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMuYk9iamVjdFBhZ2UgPSBtUGFyYW1ldGVycy5iT2JqZWN0UGFnZTtcblx0XHRcdGlmIChtUGFyYW1ldGVycy5jb250cm9sSWQpIHtcblx0XHRcdFx0bUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMuY29udHJvbCA9IG1QYXJhbWV0ZXJzLnBhcmVudENvbnRyb2wuYnlJZChtUGFyYW1ldGVycy5jb250cm9sSWQpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0bUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMuY29udHJvbCA9IG1QYXJhbWV0ZXJzLnBhcmVudENvbnRyb2w7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmIChiSXNDcmVhdGVBY3Rpb24pIHtcblx0XHRcdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLmJJc0NyZWF0ZUFjdGlvbiA9IGJJc0NyZWF0ZUFjdGlvbjtcblx0XHR9XG5cdFx0aWYgKGZuRGlhbG9nKSB7XG5cdFx0XHRvQWN0aW9uUHJvbWlzZSA9IGZuRGlhbG9nKFxuXHRcdFx0XHRzQWN0aW9uTmFtZSxcblx0XHRcdFx0b0FwcENvbXBvbmVudCxcblx0XHRcdFx0c0FjdGlvbkxhYmVsLFxuXHRcdFx0XHRtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycyxcblx0XHRcdFx0YUFjdGlvblBhcmFtZXRlcnMsXG5cdFx0XHRcdG9BY3Rpb24sXG5cdFx0XHRcdG1QYXJhbWV0ZXJzLnBhcmVudENvbnRyb2wsXG5cdFx0XHRcdG1QYXJhbWV0ZXJzLmVudGl0eVNldE5hbWUsXG5cdFx0XHRcdG1QYXJhbWV0ZXJzLm1lc3NhZ2VIYW5kbGVyXG5cdFx0XHQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRvQWN0aW9uUHJvbWlzZSA9IF9leGVjdXRlQWN0aW9uKG9BcHBDb21wb25lbnQsIG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzKTtcblx0XHR9XG5cdFx0cmV0dXJuIG9BY3Rpb25Qcm9taXNlXG5cdFx0XHQudGhlbihmdW5jdGlvbiAob09wZXJhdGlvblJlc3VsdDogYW55KSB7XG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHRtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dCAmJlxuXHRcdFx0XHRcdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLm9wZXJhdGlvbkF2YWlsYWJsZU1hcCAmJlxuXHRcdFx0XHRcdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLmFDb250ZXh0cyAmJlxuXHRcdFx0XHRcdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLmFDb250ZXh0cy5sZW5ndGggJiZcblx0XHRcdFx0XHRhY3Rpb25EZWZpbml0aW9uLiRJc0JvdW5kXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdC8vY2hlY2sgZm9yIHNraXBwaW5nIHN0YXRpYyBhY3Rpb25zXG5cdFx0XHRcdFx0Y29uc3QgaXNTdGF0aWMgPSAoYWN0aW9uRGVmaW5pdGlvbi4kUGFyYW1ldGVyIHx8IFtdKS5zb21lKChhUGFyYW1ldGVyOiBhbnkpID0+IHtcblx0XHRcdFx0XHRcdHJldHVybiAoXG5cdFx0XHRcdFx0XHRcdGFjdGlvbkRlZmluaXRpb24uJEVudGl0eVNldFBhdGggJiZcblx0XHRcdFx0XHRcdFx0YWN0aW9uRGVmaW5pdGlvbi4kRW50aXR5U2V0UGF0aCA9PT0gYVBhcmFtZXRlci4kTmFtZSAmJlxuXHRcdFx0XHRcdFx0XHRhUGFyYW1ldGVyLiRpc0NvbGxlY3Rpb25cblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0aWYgKCFpc1N0YXRpYykge1xuXHRcdFx0XHRcdFx0Q29tbW9uVXRpbHMuc2V0QWN0aW9uRW5hYmxlbWVudChcblx0XHRcdFx0XHRcdFx0bUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMuaW50ZXJuYWxNb2RlbENvbnRleHQsXG5cdFx0XHRcdFx0XHRcdEpTT04ucGFyc2UobUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMub3BlcmF0aW9uQXZhaWxhYmxlTWFwKSxcblx0XHRcdFx0XHRcdFx0bUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMuYUNvbnRleHRzXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRyZXNvbHZlKG9PcGVyYXRpb25SZXN1bHQpO1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaChmdW5jdGlvbiAob09wZXJhdGlvblJlc3VsdDogYW55KSB7XG5cdFx0XHRcdHJlamVjdChvT3BlcmF0aW9uUmVzdWx0KTtcblx0XHRcdH0pO1xuXHR9KTtcbn1cbmZ1bmN0aW9uIGNvbmZpcm1Dcml0aWNhbEFjdGlvbihcblx0c0FjdGlvbk5hbWU6IGFueSxcblx0b0FwcENvbXBvbmVudDogYW55LFxuXHRzQWN0aW9uTGFiZWw6IGFueSxcblx0bVBhcmFtZXRlcnM6IGFueSxcblx0YUFjdGlvblBhcmFtZXRlcnM6IGFueSxcblx0b0FjdGlvbkNvbnRleHQ6IGFueSxcblx0b1BhcmVudENvbnRyb2w6IGFueSxcblx0ZW50aXR5U2V0TmFtZTogYW55LFxuXHRtZXNzYWdlSGFuZGxlcjogYW55XG4pIHtcblx0cmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRsZXQgYm91bmRBY3Rpb25OYW1lID0gc0FjdGlvbk5hbWUgPyBzQWN0aW9uTmFtZSA6IG51bGw7XG5cdFx0Ym91bmRBY3Rpb25OYW1lID1cblx0XHRcdGJvdW5kQWN0aW9uTmFtZS5pbmRleE9mKFwiLlwiKSA+PSAwID8gYm91bmRBY3Rpb25OYW1lLnNwbGl0KFwiLlwiKVtib3VuZEFjdGlvbk5hbWUuc3BsaXQoXCIuXCIpLmxlbmd0aCAtIDFdIDogYm91bmRBY3Rpb25OYW1lO1xuXHRcdGNvbnN0IHN1ZmZpeFJlc291cmNlS2V5ID0gYm91bmRBY3Rpb25OYW1lICYmIGVudGl0eVNldE5hbWUgPyBgJHtlbnRpdHlTZXROYW1lfXwke2JvdW5kQWN0aW9uTmFtZX1gIDogXCJcIjtcblx0XHRjb25zdCBvUmVzb3VyY2VCdW5kbGUgPSBvUGFyZW50Q29udHJvbC5nZXRDb250cm9sbGVyKCkub1Jlc291cmNlQnVuZGxlO1xuXHRcdGNvbnN0IHNDb25maXJtYXRpb25UZXh0ID0gQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXG5cdFx0XHRcIkNfT1BFUkFUSU9OU19BQ1RJT05fQ09ORklSTV9NRVNTQUdFXCIsXG5cdFx0XHRvUmVzb3VyY2VCdW5kbGUsXG5cdFx0XHRudWxsLFxuXHRcdFx0c3VmZml4UmVzb3VyY2VLZXlcblx0XHQpO1xuXG5cdFx0TWVzc2FnZUJveC5jb25maXJtKHNDb25maXJtYXRpb25UZXh0LCB7XG5cdFx0XHRvbkNsb3NlOiBmdW5jdGlvbiAoc0FjdGlvbjogYW55KSB7XG5cdFx0XHRcdGlmIChzQWN0aW9uID09PSBBY3Rpb24uT0spIHtcblx0XHRcdFx0XHRyZXR1cm4gX2V4ZWN1dGVBY3Rpb24ob0FwcENvbXBvbmVudCwgbVBhcmFtZXRlcnMpXG5cdFx0XHRcdFx0XHQudGhlbihmdW5jdGlvbiAob09wZXJhdGlvbjogYW55KSB7XG5cdFx0XHRcdFx0XHRcdHJlc29sdmUob09wZXJhdGlvbik7XG5cdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRtZXNzYWdlSGFuZGxlclxuXHRcdFx0XHRcdFx0XHRcdC5zaG93TWVzc2FnZURpYWxvZygpXG5cdFx0XHRcdFx0XHRcdFx0LnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0cmVqZWN0KG9FcnJvcik7XG5cdFx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0cmVqZWN0KG9FcnJvcik7XG5cdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRyZXNvbHZlKCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblx0fSk7XG59XG5mdW5jdGlvbiBzaG93QWN0aW9uUGFyYW1ldGVyRGlhbG9nKFxuXHRzQWN0aW9uTmFtZTogYW55LFxuXHRvQXBwQ29tcG9uZW50OiBhbnksXG5cdHNBY3Rpb25MYWJlbDogYW55LFxuXHRtUGFyYW1ldGVyczogYW55LFxuXHRhQWN0aW9uUGFyYW1ldGVyczogYW55LFxuXHRvQWN0aW9uQ29udGV4dDogYW55LFxuXHRvUGFyZW50Q29udHJvbDogYW55LFxuXHRlbnRpdHlTZXROYW1lOiBhbnksXG5cdG1lc3NhZ2VIYW5kbGVyOiBhbnlcbikge1xuXHRjb25zdCBzUGF0aCA9IF9nZXRQYXRoKG9BY3Rpb25Db250ZXh0LCBzQWN0aW9uTmFtZSksXG5cdFx0bWV0YU1vZGVsID0gb0FjdGlvbkNvbnRleHQuZ2V0TW9kZWwoKS5vTW9kZWwuZ2V0TWV0YU1vZGVsKCksXG5cdFx0ZW50aXR5U2V0Q29udGV4dCA9IG1ldGFNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChzUGF0aCksXG5cdFx0c0FjdGlvbk5hbWVQYXRoID0gb0FjdGlvbkNvbnRleHQuZ2V0T2JqZWN0KFwiJElzQm91bmRcIilcblx0XHRcdD8gb0FjdGlvbkNvbnRleHQuZ2V0UGF0aCgpLnNwbGl0KFwiL0AkdWk1Lm92ZXJsb2FkLzBcIilbMF1cblx0XHRcdDogb0FjdGlvbkNvbnRleHQuZ2V0UGF0aCgpLnNwbGl0KFwiLzBcIilbMF0sXG5cdFx0YWN0aW9uTmFtZUNvbnRleHQgPSBtZXRhTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoc0FjdGlvbk5hbWVQYXRoKSxcblx0XHRzRnJhZ21lbnROYW1lID0gXCJzYXAvZmUvY29yZS9jb250cm9scy9BY3Rpb25QYXJhbWV0ZXJEaWFsb2dcIjtcblx0cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlOiAodmFsdWU6IGFueSkgPT4gdm9pZCwgcmVqZWN0OiAocmVhc29uPzogYW55KSA9PiB2b2lkKSB7XG5cdFx0Y29uc3Qgb0ZyYWdtZW50ID0gWE1MVGVtcGxhdGVQcm9jZXNzb3IubG9hZFRlbXBsYXRlKHNGcmFnbWVudE5hbWUsIFwiZnJhZ21lbnRcIik7XG5cdFx0Y29uc3Qgb1BhcmFtZXRlck1vZGVsID0gbmV3IEpTT05Nb2RlbCh7XG5cdFx0XHQkZGlzcGxheU1vZGU6IHt9XG5cdFx0fSk7XG5cdFx0bGV0IGFGaWVsZEludmFsaWQ6IGFueVtdID0gW107XG5cdFx0bGV0IGFGb3JtRWxlbWVudHM6IGFueVtdID0gW107XG5cdFx0Y29uc3QgbUZpZWxkVmFsdWVNYXA6IGFueSA9IHt9O1xuXHRcdGNvbnN0IHZhbGlkYXRlUmVxdWlyZWRQcm9wZXJ0aWVzID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0cmV0dXJuIFByb21pc2UuYWxsKFxuXHRcdFx0XHRhRm9ybUVsZW1lbnRzXG5cdFx0XHRcdFx0LmZpbHRlcihmdW5jdGlvbiAob0Zvcm1FbGVtZW50OiBhbnkpIHtcblx0XHRcdFx0XHRcdGNvbnN0IG9GaWVsZCA9IG9Gb3JtRWxlbWVudC5nZXRGaWVsZHMoKVswXTtcblx0XHRcdFx0XHRcdHJldHVybiBvRmllbGQuZ2V0UmVxdWlyZWQoKSAmJiBvRmllbGQuZ2V0VmFsdWVTdGF0ZSgpICE9PSBcIkVycm9yXCI7XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQubWFwKGZ1bmN0aW9uIChvRm9ybUVsZW1lbnQ6IGFueSkge1xuXHRcdFx0XHRcdFx0Y29uc3QgdmFsdWUgPSBvRm9ybUVsZW1lbnQuZ2V0RmllbGRzKClbMF0uaXNBKFwic2FwLnVpLm1kYy5NdWx0aVZhbHVlRmllbGRcIilcblx0XHRcdFx0XHRcdFx0PyBvRm9ybUVsZW1lbnQuZ2V0RmllbGRzKClbMF0uZ2V0SXRlbXMoKVxuXHRcdFx0XHRcdFx0XHQ6IG9Gb3JtRWxlbWVudC5nZXRGaWVsZHMoKVswXS5nZXRWYWx1ZSgpO1xuXHRcdFx0XHRcdFx0aWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IFwiXCIgfHwgKEFycmF5LmlzQXJyYXkodmFsdWUpICYmICF2YWx1ZS5sZW5ndGgpKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBvRm9ybUVsZW1lbnQuZ2V0TGFiZWwoKS5nZXRUZXh0KCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSlcblx0XHRcdCkudGhlbihmdW5jdGlvbiAoYVJlc3VsdHM6IGFueVtdKSB7XG5cdFx0XHRcdGFSZXN1bHRzID0gYVJlc3VsdHMuZmlsdGVyKGZ1bmN0aW9uIChyZXN1bHQ6IGFueSkge1xuXHRcdFx0XHRcdHJldHVybiByZXN1bHQgIT09IHVuZGVmaW5lZDtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHJldHVybiBhUmVzdWx0cztcblx0XHRcdH0pO1xuXHRcdH07XG5cdFx0Y29uc3QgX3ZhbGlkYXRlTWVzc2FnZXMgPSBmdW5jdGlvbiAoYWN0aW9uUGFyYW1ldGVyczogYW55LCBpbnZhbGlkRmllbGRzOiBhbnksIGJDbGVhclRhcmdldD86IGJvb2xlYW4pIHtcblx0XHRcdGNvbnN0IG9NZXNzYWdlTWFuYWdlciA9IENvcmUuZ2V0TWVzc2FnZU1hbmFnZXIoKTtcblx0XHRcdGNvbnN0IGFNZXNzYWdlcyA9IG9NZXNzYWdlTWFuYWdlci5nZXRNZXNzYWdlTW9kZWwoKS5nZXREYXRhKCk7XG5cblx0XHRcdGludmFsaWRGaWVsZHMgPSBpbnZhbGlkRmllbGRzIHx8IFtdO1xuXG5cdFx0XHRpZiAoIWFNZXNzYWdlcy5sZW5ndGgpIHtcblx0XHRcdFx0aW52YWxpZEZpZWxkcyA9IFtdO1xuXHRcdFx0fVxuXHRcdFx0YWN0aW9uUGFyYW1ldGVycy5mb3JFYWNoKGZ1bmN0aW9uIChvQWN0aW9uUGFyYW1ldGVyczogYW55KSB7XG5cdFx0XHRcdGNvbnN0IHNQYXJhbWV0ZXIgPSBvQWN0aW9uUGFyYW1ldGVycy4kTmFtZTtcblx0XHRcdFx0YU1lc3NhZ2VzLmZvckVhY2goZnVuY3Rpb24gKG9NZXNzYWdlOiBhbnkpIHtcblx0XHRcdFx0XHRjb25zdCBzUGFyYW0gPSBzUGFyYW1ldGVyLnJlcGxhY2UoXCItaW5uZXJcIiwgXCJcIik7XG5cdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0b01lc3NhZ2UuY29udHJvbElkcy5sZW5ndGggPiAwICYmXG5cdFx0XHRcdFx0XHQob01lc3NhZ2UuZ2V0Q29udHJvbElkKCkuaW5jbHVkZXMoYEFQRF86OiR7c1BhcmFtZXRlcn1gKSB8fFxuXHRcdFx0XHRcdFx0XHQob01lc3NhZ2UuZ2V0Q29udHJvbElkKCkuaW5jbHVkZXMoYEFQRF86OiR7c1BhcmFtZXRlcn1pbm5lcmApICYmIGludmFsaWRGaWVsZHMuaW5kZXhPZihgQVBEXzo6JHtzUGFyYW19YCkgPCAwKSlcblx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdGlmIChiQ2xlYXJUYXJnZXQpIHtcblx0XHRcdFx0XHRcdFx0b01lc3NhZ2VNYW5hZ2VyLnJlbW92ZU1lc3NhZ2VzKG9NZXNzYWdlKTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdGludmFsaWRGaWVsZHMucHVzaChgQVBEXzo6JHtzUGFyYW19YCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdC8vIEhhbmRsZSBtZXNzYWdlcyByZWxhdGVkIHRvIGlucHV0IHdpdGggaW52YWxpZCB0b2tlblxuXHRcdFx0XHRcdGlmIChvTWVzc2FnZS50YXJnZXQuaW5jbHVkZXMoYEFQRF86OiR7c1BhcmFtZXRlcn1gKSkge1xuXHRcdFx0XHRcdFx0aW52YWxpZEZpZWxkcy5wdXNoKGBBUERfOjoke3NQYXJhbX1gKTtcblx0XHRcdFx0XHRcdG9NZXNzYWdlLnRhcmdldCA9IGJDbGVhclRhcmdldCA/IFwiXCIgOiBvTWVzc2FnZS50YXJnZXQ7XG5cdFx0XHRcdFx0XHRpZiAoYkNsZWFyVGFyZ2V0KSB7XG5cdFx0XHRcdFx0XHRcdG9NZXNzYWdlTWFuYWdlci5yZW1vdmVNZXNzYWdlcyhvTWVzc2FnZSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXHRcdFx0cmV0dXJuIGludmFsaWRGaWVsZHM7XG5cdFx0fTtcblx0XHRjb25zdCBvQ29udHJvbGxlciA9IHtcblx0XHRcdGhhbmRsZUNoYW5nZTogZnVuY3Rpb24gKG9FdmVudDogYW55KSB7XG5cdFx0XHRcdG1lc3NhZ2VIYW5kbGVyLnJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcygpO1xuXHRcdFx0XHRjb25zdCBvRmllbGQgPSBvRXZlbnQuZ2V0U291cmNlKCk7XG5cdFx0XHRcdGNvbnN0IHNGaWVsZElkID0gb0V2ZW50LmdldFBhcmFtZXRlcihcImlkXCIpO1xuXHRcdFx0XHRjb25zdCBvRmllbGRQcm9taXNlID0gb0V2ZW50LmdldFBhcmFtZXRlcihcInByb21pc2VcIik7XG5cdFx0XHRcdGlmIChvRmllbGRQcm9taXNlKSB7XG5cdFx0XHRcdFx0bUZpZWxkVmFsdWVNYXBbc0ZpZWxkSWRdID0gb0ZpZWxkUHJvbWlzZS50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdHJldHVybiBvRmllbGQuZ2V0VmFsdWUoKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRfdmFsaWRhdGVNZXNzYWdlcyhhQWN0aW9uUGFyYW1ldGVycywgYUZpZWxkSW52YWxpZCk7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoXG5cdFx0XHRYTUxQcmVwcm9jZXNzb3IucHJvY2Vzcyhcblx0XHRcdFx0b0ZyYWdtZW50LFxuXHRcdFx0XHR7IG5hbWU6IHNGcmFnbWVudE5hbWUgfSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGJpbmRpbmdDb250ZXh0czoge1xuXHRcdFx0XHRcdFx0YWN0aW9uOiBvQWN0aW9uQ29udGV4dCxcblx0XHRcdFx0XHRcdGFjdGlvbk5hbWU6IGFjdGlvbk5hbWVDb250ZXh0LFxuXHRcdFx0XHRcdFx0ZW50aXR5U2V0OiBlbnRpdHlTZXRDb250ZXh0XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRtb2RlbHM6IHtcblx0XHRcdFx0XHRcdGFjdGlvbjogb0FjdGlvbkNvbnRleHQuZ2V0TW9kZWwoKSxcblx0XHRcdFx0XHRcdGFjdGlvbk5hbWU6IGFjdGlvbk5hbWVDb250ZXh0LmdldE1vZGVsKCksXG5cdFx0XHRcdFx0XHRlbnRpdHlTZXQ6IGVudGl0eVNldENvbnRleHQuZ2V0TW9kZWwoKSxcblx0XHRcdFx0XHRcdG1ldGFNb2RlbDogZW50aXR5U2V0Q29udGV4dC5nZXRNb2RlbCgpXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHQpXG5cdFx0KVxuXHRcdFx0LnRoZW4oZnVuY3Rpb24gKGNyZWF0ZWRGcmFnbWVudDogYW55KSB7XG5cdFx0XHRcdC8vIFRPRE86IG1vdmUgdGhlIGRpYWxvZyBpbnRvIHRoZSBmcmFnbWVudCBhbmQgbW92ZSB0aGUgaGFuZGxlcnMgdG8gdGhlIG9Db250cm9sbGVyXG5cdFx0XHRcdGxldCBhQ29udGV4dHM6IGFueVtdO1xuXHRcdFx0XHRjb25zdCBhRnVuY3Rpb25QYXJhbXM6IGFueVtdID0gW107XG5cdFx0XHRcdGxldCBvT3BlcmF0aW9uQmluZGluZzogYW55O1xuXHRcdFx0XHRyZXR1cm4gQ29tbW9uVXRpbHMuc2V0VXNlckRlZmF1bHRzKG9BcHBDb21wb25lbnQsIGFBY3Rpb25QYXJhbWV0ZXJzLCBvUGFyYW1ldGVyTW9kZWwsIHRydWUpLnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdC8vIFRPRE86IG1vdmUgdGhlIGRpYWxvZyBpbnRvIHRoZSBmcmFnbWVudCBhbmQgbW92ZSB0aGUgaGFuZGxlcnMgdG8gdGhlIG9Db250cm9sbGVyXG5cdFx0XHRcdFx0cmV0dXJuIEZyYWdtZW50LmxvYWQoeyBkZWZpbml0aW9uOiBjcmVhdGVkRnJhZ21lbnQsIGNvbnRyb2xsZXI6IG9Db250cm9sbGVyIH0pLnRoZW4oZnVuY3Rpb24gKG9EaWFsb2dDb250ZW50OiBhbnkpIHtcblx0XHRcdFx0XHRcdGNvbnN0IG9SZXNvdXJjZUJ1bmRsZSA9IG9QYXJlbnRDb250cm9sLmdldENvbnRyb2xsZXIoKS5vUmVzb3VyY2VCdW5kbGU7XG5cdFx0XHRcdFx0XHRjb25zdCBvRGlhbG9nID0gbmV3IERpYWxvZyh1bmRlZmluZWQsIHtcblx0XHRcdFx0XHRcdFx0dGl0bGU6XG5cdFx0XHRcdFx0XHRcdFx0c0FjdGlvbkxhYmVsIHx8XG5cdFx0XHRcdFx0XHRcdFx0Q29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXCJDX09QRVJBVElPTlNfQUNUSU9OX1BBUkFNRVRFUl9ESUFMT0dfVElUTEVcIiwgb1Jlc291cmNlQnVuZGxlKSxcblx0XHRcdFx0XHRcdFx0Y29udGVudDogW29EaWFsb2dDb250ZW50XSxcblx0XHRcdFx0XHRcdFx0ZXNjYXBlSGFuZGxlcjogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRcdG9EaWFsb2cuY2xvc2UoKTtcblx0XHRcdFx0XHRcdFx0XHRtZXNzYWdlSGFuZGxlci5yZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblx0XHRcdFx0XHRcdFx0XHRyZWplY3QoKTtcblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0YmVnaW5CdXR0b246IG5ldyBCdXR0b24oZ2VuZXJhdGUoW1wiZmVcIiwgXCJBUERfXCIsIHNBY3Rpb25OYW1lLCBcIkFjdGlvblwiLCBcIk9rXCJdKSwge1xuXHRcdFx0XHRcdFx0XHRcdHRleHQ6IHNBY3Rpb25MYWJlbCB8fCBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcIkNfQ09NTU9OX0RJQUxPR19PS1wiLCBvUmVzb3VyY2VCdW5kbGUpLFxuXHRcdFx0XHRcdFx0XHRcdHR5cGU6IFwiRW1waGFzaXplZFwiLFxuXHRcdFx0XHRcdFx0XHRcdHByZXNzOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHR2YWxpZGF0ZVJlcXVpcmVkUHJvcGVydGllcygpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC50aGVuKGZ1bmN0aW9uIChhRW1wdHlNYW5kYXRvcnlGaWVsZHM6IGFueVtdKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKGFFbXB0eU1hbmRhdG9yeUZpZWxkcy5sZW5ndGgpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IG9NZXNzYWdlcyA9IFtdO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBhRW1wdHlNYW5kYXRvcnlGaWVsZHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0b01lc3NhZ2VzLnB1c2goe1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHRleHQ6IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XCJDX09QRVJBVElPTlNfQUNUSU9OX1BBUkFNRVRFUl9ESUFMT0dfTUlTU0lOR19NQU5EQVRPUllfTVNHXCIsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGUsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhRW1wdHlNYW5kYXRvcnlGaWVsZHNbaV1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvZGU6IDIwMCxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0eXBlOiBcIkVycm9yXCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZURpYWxvZyh7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGN1c3RvbU1lc3NhZ2VzOiBvTWVzc2FnZXNcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFGaWVsZEludmFsaWQgPSBfdmFsaWRhdGVNZXNzYWdlcyhhQWN0aW9uUGFyYW1ldGVycywgYUZpZWxkSW52YWxpZCk7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoYUZpZWxkSW52YWxpZC5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gbWVzc2FnZUhhbmRsaW5nLnNob3dVbmJvdW5kTWVzc2FnZXMoKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0QnVzeUxvY2tlci5sb2NrKG9EaWFsb2cpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBQcm9taXNlLmFsbChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdE9iamVjdC5rZXlzKG1GaWVsZFZhbHVlTWFwKS5tYXAoZnVuY3Rpb24gKHNLZXk6IHN0cmluZykge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gbUZpZWxkVmFsdWVNYXBbc0tleV07XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gVE9ETzogZHVlIHRvIHVzaW5nIHRoZSBzZWFyY2ggYW5kIHZhbHVlIGhlbHBzIG9uIHRoZSBhY3Rpb24gZGlhbG9nIHRyYW5zaWVudCBtZXNzYWdlcyBjb3VsZCBhcHBlYXJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gd2UgbmVlZCBhbiBVWCBkZXNpZ24gZm9yIHRob3NlIHRvIHNob3cgdGhlbSB0byB0aGUgdXNlciAtIGZvciBub3cgcmVtb3ZlIHRoZW0gYmVmb3JlIGNvbnRpbnVpbmdcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0bWVzc2FnZUhhbmRsZXIucmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIG1vdmUgcGFyYW1ldGVyIHZhbHVlcyBmcm9tIERpYWxvZyAoU2ltcGxlRm9ybSkgdG8gbVBhcmFtZXRlcnMuYWN0aW9uUGFyYW1ldGVycyBzbyB0aGF0IHRoZXkgYXJlIGF2YWlsYWJsZSBpbiB0aGUgb3BlcmF0aW9uIGJpbmRpbmdzIGZvciBhbGwgY29udGV4dHNcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0bGV0IHZQYXJhbWV0ZXJWYWx1ZTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y29uc3Qgb1BhcmFtZXRlckNvbnRleHQgPSBvT3BlcmF0aW9uQmluZGluZyAmJiBvT3BlcmF0aW9uQmluZGluZy5nZXRQYXJhbWV0ZXJDb250ZXh0KCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGZvciAoY29uc3QgaSBpbiBhQWN0aW9uUGFyYW1ldGVycykge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChhQWN0aW9uUGFyYW1ldGVyc1tpXS4kaXNDb2xsZWN0aW9uKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBhTVZGQ29udGVudCA9IG9EaWFsb2dcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQuZ2V0TW9kZWwoXCJtdmZ2aWV3XCIpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0LmdldFByb3BlcnR5KGAvJHthQWN0aW9uUGFyYW1ldGVyc1tpXS4kTmFtZX1gKSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YUtleVZhbHVlcyA9IFtdO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Zm9yIChjb25zdCBqIGluIGFNVkZDb250ZW50KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFLZXlWYWx1ZXMucHVzaChhTVZGQ29udGVudFtqXS5LZXkpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0dlBhcmFtZXRlclZhbHVlID0gYUtleVZhbHVlcztcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0dlBhcmFtZXRlclZhbHVlID0gb1BhcmFtZXRlckNvbnRleHQuZ2V0UHJvcGVydHkoYUFjdGlvblBhcmFtZXRlcnNbaV0uJE5hbWUpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhQWN0aW9uUGFyYW1ldGVyc1tpXS52YWx1ZSA9IHZQYXJhbWV0ZXJWYWx1ZTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR2UGFyYW1ldGVyVmFsdWUgPSB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMubGFiZWwgPSBzQWN0aW9uTGFiZWw7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBfZXhlY3V0ZUFjdGlvbihvQXBwQ29tcG9uZW50LCBtUGFyYW1ldGVycylcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQudGhlbihmdW5jdGlvbiAob09wZXJhdGlvbjogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvRGlhbG9nLmNsb3NlKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXNvbHZlKG9PcGVyYXRpb24pO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0bGV0IG1lc3NhZ2VzID0gbWVzc2FnZUhhbmRsaW5nLmdldE1lc3NhZ2VzKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRtZXNzYWdlcyA9IG1lc3NhZ2VzLmNvbmNhdChtZXNzYWdlSGFuZGxpbmcuZ2V0TWVzc2FnZXModHJ1ZSwgdHJ1ZSkpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQhbVBhcmFtZXRlcnMuYkdyb3VwZWQgJiZcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ISghbVBhcmFtZXRlcnMuY29udHJvbC5pc0EoXCJzYXAudWkubWRjLlRhYmxlXCIpICYmIGFDb250ZXh0cy5sZW5ndGggPT09IDEpICYmXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG1lc3NhZ2VzLmxlbmd0aFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGxldCBlcnJvclRhcmdldHNJbkFQRCA9IGZhbHNlO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG1lc3NhZ2VzLmZvckVhY2goZnVuY3Rpb24gKG1lc3NhZ2U6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG1lc3NhZ2UuZ2V0VGFyZ2V0KCkuaW5kZXhPZihtUGFyYW1ldGVycy5hY3Rpb25OYW1lKSAhPT0gLTEgJiZcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG1lc3NhZ2Vcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0LmdldFRhcmdldCgpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC5pbmRleE9mKG1QYXJhbWV0ZXJzLmFBY3Rpb25QYXJhbWV0ZXJzWzBdLiROYW1lKSAhPT0gLTEgJiZcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGVycm9yVGFyZ2V0c0luQVBEID09PSBmYWxzZVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZXJyb3JUYXJnZXRzSW5BUEQgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmICghZXJyb3JUYXJnZXRzSW5BUEQpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvRGlhbG9nLmNsb3NlKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0b0RpYWxvZy5kZXN0cm95KCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHRocm93IG9FcnJvcjtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBvTWVzc2FnZU1hbmFnZXIgPSBDb3JlLmdldE1lc3NhZ2VNYW5hZ2VyKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IG1lc3NhZ2VzID0gb01lc3NhZ2VNYW5hZ2VyLmdldE1lc3NhZ2VNb2RlbCgpLmdldERhdGEoKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y29uc3Qgc3VidGl0bGVDb2x1bW4gPSBDb21tb25VdGlscy5nZXRNZXNzYWdlQ29sdW1uKG1QYXJhbWV0ZXJzLmNvbnRyb2wpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRsZXQgZXJyb3JDb250ZXh0O1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRsZXQgZXJyb3JUYXJnZXRzSW5BUEQgPSBmYWxzZTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0bWVzc2FnZXMuZm9yRWFjaChmdW5jdGlvbiAobWVzc2FnZTogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y29uc3QgbWVzc2FnZVRhcmdldHMgPSBtZXNzYWdlLmdldFRhcmdldHMoKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAobWVzc2FnZVRhcmdldHMgJiYgbWVzc2FnZVRhcmdldHMubGVuZ3RoID09PSAxICYmIG1lc3NhZ2VUYXJnZXRzWzBdLmxlbmd0aCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZXJyb3JDb250ZXh0ID0gYUNvbnRleHRzLmZpbmQoZnVuY3Rpb24gKG9Db250ZXh0OiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG1lc3NhZ2UuZ2V0VGFyZ2V0KCkuaW5kZXhPZihvQ29udGV4dC5nZXRQYXRoKCkpICE9PSAtMTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0bWVzc2FnZS5hZGRpdGlvbmFsVGV4dCA9IGVycm9yQ29udGV4dFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ/IGVycm9yQ29udGV4dC5nZXRPYmplY3QoKVtzdWJ0aXRsZUNvbHVtbl1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0OiB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG1lc3NhZ2UuZ2V0VGFyZ2V0KCkuaW5kZXhPZihtUGFyYW1ldGVycy5hY3Rpb25OYW1lKSAhPT0gLTEgJiZcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG1lc3NhZ2UuZ2V0VGFyZ2V0KCkuaW5kZXhPZihtUGFyYW1ldGVycy5hQWN0aW9uUGFyYW1ldGVyc1swXS4kTmFtZSkgIT09IC0xICYmXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRlcnJvclRhcmdldHNJbkFQRCA9PT0gZmFsc2Vcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGVycm9yVGFyZ2V0c0luQVBEID0gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAob0RpYWxvZy5pc09wZW4oKSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmICghbVBhcmFtZXRlcnMuYkdyb3VwZWQpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vaXNvbGF0ZWRcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChhQ29udGV4dHMubGVuZ3RoID4gMSB8fCAhZXJyb3JUYXJnZXRzSW5BUEQpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gZG9lcyBub3QgbWF0dGVyIGlmIGVycm9yIGlzIGluIEFQRCBvciBub3QsIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSBjb250ZXh0cyBzZWxlY3RlZCBvciBpZiB0aGUgZXJyb3IgaXMgbm90IHRoZSBBUEQsIHdlIGNsb3NlIGl0LlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvRGlhbG9nLmNsb3NlKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9EaWFsb2cuZGVzdHJveSgpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAobVBhcmFtZXRlcnMuYkdyb3VwZWQgJiYgIWVycm9yVGFyZ2V0c0luQVBEKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvL2NoYW5nZXNldFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0b0RpYWxvZy5jbG9zZSgpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0b0RpYWxvZy5kZXN0cm95KCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y29uc3Qgc2hvd0Vycm9ySW5BUEQgPSBvRGlhbG9nLmlzT3BlbigpICYmIGVycm9yVGFyZ2V0c0luQVBEO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRsZXQgYlNob3dNZXNzYWdlQm94ID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRtZXNzYWdlcy5sZW5ndGggPT09IDEgJiZcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRtZXNzYWdlc1swXS5nZXRUYXJnZXQoKSAhPT0gdW5kZWZpbmVkICYmXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0bWVzc2FnZXNbMF0uZ2V0VGFyZ2V0KCkgIT09IFwiXCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YlNob3dNZXNzYWdlQm94ID0gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IGJIYXNFdGFnTWVzc2FnZSA9IG1lc3NhZ2VIYW5kbGluZy5tb2RpZnlFVGFnTWVzc2FnZXNPbmx5KFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9NZXNzYWdlTWFuYWdlcixcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGUsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0dW5kZWZpbmVkXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0bWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VzKHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRiSGFzRXRhZ01lc3NhZ2U6IGJIYXNFdGFnTWVzc2FnZSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjb250ZXh0OiBtUGFyYW1ldGVycy5hQ29udGV4dHNbMF0sXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aXNBY3Rpb25QYXJhbWV0ZXJEaWFsb2dPcGVuOiBvRGlhbG9nLmlzT3BlbigpLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG1lc3NhZ2VQYWdlTmF2aWdhdGlvbkNhbGxiYWNrOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvRGlhbG9nLmNsb3NlKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRzaG93RXJyb3JJbkFQRDogc2hvd0Vycm9ySW5BUEQsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YlNob3dNZXNzYWdlQm94OiBiU2hvd01lc3NhZ2VCb3hcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChvRGlhbG9nICYmIGJIYXNFdGFnTWVzc2FnZSAmJiBvRGlhbG9nLmlzT3BlbigpKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0b0RpYWxvZy5jbG9zZSgpOyAvL2Nsb3NlIHRoZSBhY3Rpb24gcGFyYW1ldGVyIGRpYWxvZyBhZnRlciByZWZyZXNoIG9mIHRoZSBjb250ZXh0IGFmdGVyIGV0YWcgbWlzbWF0Y2hcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC5maW5hbGx5KGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0QnVzeUxvY2tlci51bmxvY2sob0RpYWxvZyk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gbWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VEaWFsb2coKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9KSxcblx0XHRcdFx0XHRcdFx0ZW5kQnV0dG9uOiBuZXcgQnV0dG9uKGdlbmVyYXRlKFtcImZlXCIsIFwiQVBEX1wiLCBzQWN0aW9uTmFtZSwgXCJBY3Rpb25cIiwgXCJDYW5jZWxcIl0pLCB7XG5cdFx0XHRcdFx0XHRcdFx0dGV4dDogQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXCJDX0NPTU1PTl9BQ1RJT05fUEFSQU1FVEVSX0RJQUxPR19DQU5DRUxcIiwgb1Jlc291cmNlQnVuZGxlKSxcblx0XHRcdFx0XHRcdFx0XHRwcmVzczogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0X3ZhbGlkYXRlTWVzc2FnZXMoYUFjdGlvblBhcmFtZXRlcnMsIGFGaWVsZEludmFsaWQsIHRydWUpO1xuXHRcdFx0XHRcdFx0XHRcdFx0b0RpYWxvZy5jbG9zZSgpO1xuXHRcdFx0XHRcdFx0XHRcdFx0bWVzc2FnZUhhbmRsZXIucmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRyZWplY3QoQ29uc3RhbnRzLkNhbmNlbEFjdGlvbkRpYWxvZyk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9KSxcblx0XHRcdFx0XHRcdFx0YmVmb3JlT3BlbjogZnVuY3Rpb24gKG9FdmVudDogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gY2xvbmUgZXZlbnQgZm9yIGFjdGlvbldyYXBwZXIgYXMgb0V2ZW50Lm9Tb3VyY2UgZ2V0cyBsb3N0IGR1cmluZyBwcm9jZXNzaW5nIG9mIGJlZm9yZU9wZW4gZXZlbnQgaGFuZGxlclxuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IG9DbG9uZUV2ZW50ID0gT2JqZWN0LmFzc2lnbih7fSwgb0V2ZW50KTtcblxuXHRcdFx0XHRcdFx0XHRcdG1lc3NhZ2VIYW5kbGVyLnJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcygpO1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IGdldERlZmF1bHRWYWx1ZXNGdW5jdGlvbiA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvRGlhbG9nLmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHNBY3Rpb25QYXRoID0gb0FjdGlvbkNvbnRleHQuc1BhdGggJiYgb0FjdGlvbkNvbnRleHQuc1BhdGguc3BsaXQoXCIvQFwiKVswXSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0c0RlZmF1bHRWYWx1ZXNGdW5jdGlvbiA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGAke3NBY3Rpb25QYXRofUBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRGVmYXVsdFZhbHVlc0Z1bmN0aW9uYFxuXHRcdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHNEZWZhdWx0VmFsdWVzRnVuY3Rpb247XG5cdFx0XHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBmblNldERlZmF1bHRzQW5kT3BlbkRpYWxvZyA9IGZ1bmN0aW9uIChzQmluZGluZ1BhcmFtZXRlcj86IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0Y29uc3Qgc0JvdW5kRnVuY3Rpb25OYW1lID0gZ2V0RGVmYXVsdFZhbHVlc0Z1bmN0aW9uKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBwcmVmaWxsUGFyYW1ldGVyID0gZnVuY3Rpb24gKHNQYXJhbU5hbWU6IGFueSwgdlBhcmFtRGVmYXVsdFZhbHVlOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByb21pc2UvcGFyYW0tbmFtZXNcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG5ldyBQcm9taXNlKChpblJlc29sdmUpID0+IHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBDYXNlIDE6IFRoZXJlIGlzIGEgUGFyYW1ldGVyRGVmYXVsdFZhbHVlIGFubm90YXRpb25cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAodlBhcmFtRGVmYXVsdFZhbHVlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChhQ29udGV4dHMubGVuZ3RoID4gMCAmJiB2UGFyYW1EZWZhdWx0VmFsdWUuJFBhdGgpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y29uc3Qgb1Byb21pc2UgPSBDb21tb25VdGlscy5yZXF1ZXN0U2luZ2xldG9uUHJvcGVydHkoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0dlBhcmFtRGVmYXVsdFZhbHVlLiRQYXRoLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9PcGVyYXRpb25CaW5kaW5nLmdldE1vZGVsKClcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0b1Byb21pc2Vcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQudGhlbihmdW5jdGlvbiAob1ZhbHVlOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChvVmFsdWUgPT09IG51bGwpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG9PcGVyYXRpb25CaW5kaW5nXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0LmdldFBhcmFtZXRlckNvbnRleHQoKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC5yZXF1ZXN0UHJvcGVydHkodlBhcmFtRGVmYXVsdFZhbHVlLiRQYXRoKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBvVmFsdWU7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQudGhlbihmdW5jdGlvbiAodlBhcmFtVmFsdWU6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKGFDb250ZXh0cy5sZW5ndGggPiAxKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIEZvciBtdWx0aSBzZWxlY3QsIG5lZWQgdG8gbG9vcCBvdmVyIGFDb250ZXh0cyAoYXMgY29udGV4dHMgY2Fubm90IGJlIHJldHJpZXZlZCB2aWEgYmluZGluZyBwYXJhbWV0ZXIgb2YgdGhlIG9wZXJhdGlvbiBiaW5kaW5nKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRsZXQgc1BhdGhGb3JDb250ZXh0ID0gdlBhcmFtRGVmYXVsdFZhbHVlLiRQYXRoO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoc1BhdGhGb3JDb250ZXh0LmluZGV4T2YoYCR7c0JpbmRpbmdQYXJhbWV0ZXJ9L2ApID09PSAwKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0c1BhdGhGb3JDb250ZXh0ID0gc1BhdGhGb3JDb250ZXh0LnJlcGxhY2UoYCR7c0JpbmRpbmdQYXJhbWV0ZXJ9L2AsIFwiXCIpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGZvciAobGV0IGkgPSAxOyBpIDwgYUNvbnRleHRzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKGFDb250ZXh0c1tpXS5nZXRQcm9wZXJ0eShzUGF0aEZvckNvbnRleHQpICE9PSB2UGFyYW1WYWx1ZSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gaWYgdGhlIHZhbHVlcyBmcm9tIHRoZSBjb250ZXh0cyBhcmUgbm90IGFsbCB0aGUgc2FtZSwgZG8gbm90IHByZWZpbGxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGluUmVzb2x2ZSh7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHBhcmFtTmFtZTogc1BhcmFtTmFtZSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0dmFsdWU6IHVuZGVmaW5lZCxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Yk5vUG9zc2libGVWYWx1ZTogdHJ1ZVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpblJlc29sdmUoeyBwYXJhbU5hbWU6IHNQYXJhbU5hbWUsIHZhbHVlOiB2UGFyYW1WYWx1ZSB9KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBTaW1wbHkgY2xlYXIgcGFyYW1ldGVyIGRlZmF1bHQgaWYgYW4gZXJyb3IgaGFzIG9jY3VycmVkXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRMb2cuZXJyb3IoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFwiRXJyb3Igd2hpbGUgcmVhZGluZyBkZWZhdWx0IGFjdGlvbiBwYXJhbWV0ZXJcIixcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0c1BhcmFtTmFtZSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMuYWN0aW9uTmFtZVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGluUmVzb2x2ZSh7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHBhcmFtTmFtZTogc1BhcmFtTmFtZSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0dmFsdWU6IHVuZGVmaW5lZCxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YkxhdGVQcm9wZXJ0eUVycm9yOiB0cnVlXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIENhc2UgMS4yOiBQYXJhbWV0ZXJEZWZhdWx0VmFsdWUgZGVmaW5lcyBhIGZpeGVkIHN0cmluZyB2YWx1ZSAoaS5lLiB2UGFyYW1EZWZhdWx0VmFsdWUgPSAnc29tZVN0cmluZycpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGluUmVzb2x2ZSh7IHBhcmFtTmFtZTogc1BhcmFtTmFtZSwgdmFsdWU6IHZQYXJhbURlZmF1bHRWYWx1ZSB9KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKG9QYXJhbWV0ZXJNb2RlbCAmJiAob1BhcmFtZXRlck1vZGVsIGFzIGFueSkub0RhdGFbc1BhcmFtTmFtZV0pIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIENhc2UgMjogVGhlcmUgaXMgbm8gUGFyYW1ldGVyRGVmYXVsdFZhbHVlIGFubm90YXRpb24gKD0+IGxvb2sgaW50byB0aGUgRkxQIFVzZXIgRGVmYXVsdHMpXG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGluUmVzb2x2ZSh7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHBhcmFtTmFtZTogc1BhcmFtTmFtZSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0dmFsdWU6IChvUGFyYW1ldGVyTW9kZWwgYXMgYW55KS5vRGF0YVtzUGFyYW1OYW1lXVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGluUmVzb2x2ZSh7IHBhcmFtTmFtZTogc1BhcmFtTmFtZSwgdmFsdWU6IHVuZGVmaW5lZCB9KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRcdFx0fTtcblxuXHRcdFx0XHRcdFx0XHRcdFx0Y29uc3QgZ2V0UGFyYW1ldGVyRGVmYXVsdFZhbHVlID0gZnVuY3Rpb24gKHNQYXJhbU5hbWU6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBvTWV0YU1vZGVsID0gb0RpYWxvZy5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHNBY3Rpb25QYXRoID0gb0FjdGlvbkNvbnRleHQuc1BhdGggJiYgb0FjdGlvbkNvbnRleHQuc1BhdGguc3BsaXQoXCIvQFwiKVswXSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRzQWN0aW9uUGFyYW1ldGVyQW5ub3RhdGlvblRhcmdldCA9IGAke3NBY3Rpb25QYXRofS8ke3NQYXJhbU5hbWV9QGAsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0b1BhcmFtZXRlckFubm90YXRpb25zID0gb01ldGFNb2RlbC5nZXRPYmplY3Qoc0FjdGlvblBhcmFtZXRlckFubm90YXRpb25UYXJnZXQpLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9QYXJhbWV0ZXJEZWZhdWx0VmFsdWUgPVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0b1BhcmFtZXRlckFubm90YXRpb25zICYmXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvUGFyYW1ldGVyQW5ub3RhdGlvbnNbXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuUGFyYW1ldGVyRGVmYXVsdFZhbHVlXCJdOyAvLyBlaXRoZXIgeyAkUGF0aDogJ3NvbWVQYXRoJyB9IG9yICdzb21lU3RyaW5nJ1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gb1BhcmFtZXRlckRlZmF1bHRWYWx1ZTtcblx0XHRcdFx0XHRcdFx0XHRcdH07XG5cblx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IGFDdXJyZW50UGFyYW1EZWZhdWx0VmFsdWUgPSBbXTtcblx0XHRcdFx0XHRcdFx0XHRcdGxldCBzUGFyYW1OYW1lLCB2UGFyYW1ldGVyRGVmYXVsdFZhbHVlO1xuXHRcdFx0XHRcdFx0XHRcdFx0Zm9yIChjb25zdCBpIGluIGFBY3Rpb25QYXJhbWV0ZXJzKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHNQYXJhbU5hbWUgPSBhQWN0aW9uUGFyYW1ldGVyc1tpXS4kTmFtZTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0dlBhcmFtZXRlckRlZmF1bHRWYWx1ZSA9IGdldFBhcmFtZXRlckRlZmF1bHRWYWx1ZShzUGFyYW1OYW1lKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0YUN1cnJlbnRQYXJhbURlZmF1bHRWYWx1ZS5wdXNoKHByZWZpbGxQYXJhbWV0ZXIoc1BhcmFtTmFtZSwgdlBhcmFtZXRlckRlZmF1bHRWYWx1ZSkpO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAob0FjdGlvbkNvbnRleHQuZ2V0T2JqZWN0KFwiJElzQm91bmRcIikgJiYgYUNvbnRleHRzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKHNCb3VuZEZ1bmN0aW9uTmFtZSAmJiBzQm91bmRGdW5jdGlvbk5hbWUubGVuZ3RoID4gMCAmJiB0eXBlb2Ygc0JvdW5kRnVuY3Rpb25OYW1lID09PSBcInN0cmluZ1wiKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Zm9yIChjb25zdCBpIGluIGFDb250ZXh0cykge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YUZ1bmN0aW9uUGFyYW1zLnB1c2goXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNhbGxCb3VuZEZ1bmN0aW9uKHNCb3VuZEZ1bmN0aW9uTmFtZSwgYUNvbnRleHRzW2ldLCBtUGFyYW1ldGVycy5tb2RlbClcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IGFQcmVmaWxsUGFyYW1Qcm9taXNlcyA9IFByb21pc2UuYWxsKGFDdXJyZW50UGFyYW1EZWZhdWx0VmFsdWUpO1xuXHRcdFx0XHRcdFx0XHRcdFx0bGV0IGFFeGVjRnVuY3Rpb25Qcm9taXNlczogUHJvbWlzZTxhbnlbXT4gPSBQcm9taXNlLnJlc29sdmUoW10pO1xuXHRcdFx0XHRcdFx0XHRcdFx0bGV0IG9FeGVjRnVuY3Rpb25Gcm9tTWFuaWZlc3RQcm9taXNlO1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKGFGdW5jdGlvblBhcmFtcyAmJiBhRnVuY3Rpb25QYXJhbXMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRhRXhlY0Z1bmN0aW9uUHJvbWlzZXMgPSBQcm9taXNlLmFsbChhRnVuY3Rpb25QYXJhbXMpO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKG1QYXJhbWV0ZXJzLmRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbikge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBzTW9kdWxlID0gbVBhcmFtZXRlcnMuZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQuc3Vic3RyaW5nKDAsIG1QYXJhbWV0ZXJzLmRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbi5sYXN0SW5kZXhPZihcIi5cIikgfHwgLTEpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQucmVwbGFjZSgvXFwuL2dpLCBcIi9cIiksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0c0Z1bmN0aW9uTmFtZSA9IG1QYXJhbWV0ZXJzLmRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbi5zdWJzdHJpbmcoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5kZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb24ubGFzdEluZGV4T2YoXCIuXCIpICsgMSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbi5sZW5ndGhcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRvRXhlY0Z1bmN0aW9uRnJvbU1hbmlmZXN0UHJvbWlzZSA9IEZQTUhlbHBlci5hY3Rpb25XcmFwcGVyKG9DbG9uZUV2ZW50LCBzTW9kdWxlLCBzRnVuY3Rpb25OYW1lLCB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XCJjb250ZXh0c1wiOiBhQ29udGV4dHNcblx0XHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRcdFByb21pc2UuYWxsKFthUHJlZmlsbFBhcmFtUHJvbWlzZXMsIGFFeGVjRnVuY3Rpb25Qcm9taXNlcywgb0V4ZWNGdW5jdGlvbkZyb21NYW5pZmVzdFByb21pc2VdKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQudGhlbihmdW5jdGlvbiAoYVByb21pc2VzOiBbYW55W10sIGFueVtdLCBhbnldKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y29uc3QgY3VycmVudFBhcmFtRGVmYXVsdFZhbHVlOiBhbnkgPSBhUHJvbWlzZXNbMF07XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y29uc3QgZnVuY3Rpb25QYXJhbXMgPSBhUHJvbWlzZXNbMV07XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y29uc3Qgb0Z1bmN0aW9uUGFyYW1zRnJvbU1hbmlmZXN0ID0gYVByb21pc2VzWzJdO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGxldCBzRGlhbG9nUGFyYW1OYW1lO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGZvciAoY29uc3QgaSBpbiBhQWN0aW9uUGFyYW1ldGVycykge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0c0RpYWxvZ1BhcmFtTmFtZSA9IGFBY3Rpb25QYXJhbWV0ZXJzW2ldLiROYW1lO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvRnVuY3Rpb25QYXJhbXNGcm9tTWFuaWZlc3QgJiZcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0b0Z1bmN0aW9uUGFyYW1zRnJvbU1hbmlmZXN0Lmhhc093blByb3BlcnR5KHNEaWFsb2dQYXJhbU5hbWUpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0b09wZXJhdGlvbkJpbmRpbmcuc2V0UGFyYW1ldGVyKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFBY3Rpb25QYXJhbWV0ZXJzW2ldLiROYW1lLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9GdW5jdGlvblBhcmFtc0Zyb21NYW5pZmVzdFtzRGlhbG9nUGFyYW1OYW1lXVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmIChjdXJyZW50UGFyYW1EZWZhdWx0VmFsdWVbaV0gJiYgY3VycmVudFBhcmFtRGVmYXVsdFZhbHVlW2ldLnZhbHVlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0b09wZXJhdGlvbkJpbmRpbmcuc2V0UGFyYW1ldGVyKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFBY3Rpb25QYXJhbWV0ZXJzW2ldLiROYW1lLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGN1cnJlbnRQYXJhbURlZmF1bHRWYWx1ZVtpXS52YWx1ZVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBpZiB0aGUgZGVmYXVsdCB2YWx1ZSBoYWQgbm90IGJlZW4gcHJldmlvdXNseSBkZXRlcm1pbmVkIGR1ZSB0byBkaWZmZXJlbnQgY29udGV4dHMsIHdlIGRvIG5vdGhpbmcgZWxzZVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmIChzQm91bmRGdW5jdGlvbk5hbWUgJiYgIWN1cnJlbnRQYXJhbURlZmF1bHRWYWx1ZVtpXS5iTm9Qb3NzaWJsZVZhbHVlKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChhQ29udGV4dHMubGVuZ3RoID4gMSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIHdlIGNoZWNrIGlmIHRoZSBmdW5jdGlvbiByZXRyaWV2ZXMgdGhlIHNhbWUgcGFyYW0gdmFsdWUgZm9yIGFsbCB0aGUgY29udGV4dHM6XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0bGV0IGogPSAwO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHdoaWxlIChqIDwgYUNvbnRleHRzLmxlbmd0aCAtIDEpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZnVuY3Rpb25QYXJhbXNbal0gJiZcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZnVuY3Rpb25QYXJhbXNbaiArIDFdICYmXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGZ1bmN0aW9uUGFyYW1zW2pdLmdldE9iamVjdChzRGlhbG9nUGFyYW1OYW1lKSA9PT1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRmdW5jdGlvblBhcmFtc1tqICsgMV0uZ2V0T2JqZWN0KHNEaWFsb2dQYXJhbU5hbWUpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aisrO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vcGFyYW0gdmFsdWVzIGFyZSBhbGwgdGhlIHNhbWU6XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKGogPT09IGFDb250ZXh0cy5sZW5ndGggLSAxKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvT3BlcmF0aW9uQmluZGluZy5zZXRQYXJhbWV0ZXIoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFBY3Rpb25QYXJhbWV0ZXJzW2ldLiROYW1lLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRmdW5jdGlvblBhcmFtc1tqXS5nZXRPYmplY3Qoc0RpYWxvZ1BhcmFtTmFtZSlcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKGZ1bmN0aW9uUGFyYW1zWzBdICYmIGZ1bmN0aW9uUGFyYW1zWzBdLmdldE9iamVjdChzRGlhbG9nUGFyYW1OYW1lKSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vT25seSBvbmUgY29udGV4dCwgdGhlbiB0aGUgZGVmYXVsdCBwYXJhbSB2YWx1ZXMgYXJlIHRvIGJlIHZlcmlmaWVkIGZyb20gdGhlIGZ1bmN0aW9uOlxuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0b09wZXJhdGlvbkJpbmRpbmcuc2V0UGFyYW1ldGVyKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YUFjdGlvblBhcmFtZXRlcnNbaV0uJE5hbWUsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRmdW5jdGlvblBhcmFtc1swXS5nZXRPYmplY3Qoc0RpYWxvZ1BhcmFtTmFtZSlcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IGJFcnJvckZvdW5kID0gY3VycmVudFBhcmFtRGVmYXVsdFZhbHVlLnNvbWUoZnVuY3Rpb24gKG9WYWx1ZTogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAob1ZhbHVlLmJMYXRlUHJvcGVydHlFcnJvcikge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gb1ZhbHVlLmJMYXRlUHJvcGVydHlFcnJvcjtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBJZiBhdCBsZWFzdCBvbmUgRGVmYXVsdCBQcm9wZXJ0eSBpcyBhIExhdGUgUHJvcGVydHkgYW5kIGFuIGVUYWcgZXJyb3Igd2FzIHJhaXNlZC5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoYkVycm9yRm91bmQpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IHNUZXh0ID0gQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFwiQ19BUFBfQ09NUE9ORU5UX1NBUEZFX0VUQUdfTEFURV9QUk9QRVJUWVwiLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGVcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRNZXNzYWdlQm94Lndhcm5pbmcoc1RleHQsIHsgY29udGVudFdpZHRoOiBcIjI1ZW1cIiB9IGFzIGFueSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgcmV0cmlldmluZyB0aGUgcGFyYW1ldGVyXCIsIG9FcnJvcik7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRcdH07XG5cblx0XHRcdFx0XHRcdFx0XHRpZiAob0FjdGlvbkNvbnRleHQuZ2V0T2JqZWN0KFwiJElzQm91bmRcIikgJiYgYUNvbnRleHRzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IGFQYXJhbWV0ZXJzID0gb0FjdGlvbkNvbnRleHQuZ2V0T2JqZWN0KFwiJFBhcmFtZXRlclwiKSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0c0JpbmRpbmdQYXJhbWV0ZXIgPSBhUGFyYW1ldGVyc1swXSAmJiBhUGFyYW1ldGVyc1swXS4kTmFtZTtcblx0XHRcdFx0XHRcdFx0XHRcdGFDb250ZXh0c1swXVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQucmVxdWVzdE9iamVjdCgpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC50aGVuKGZ1bmN0aW9uIChvQ29udGV4dE9iamVjdDogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKG9Db250ZXh0T2JqZWN0KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvT3BlcmF0aW9uQmluZGluZy5zZXRQYXJhbWV0ZXIoc0JpbmRpbmdQYXJhbWV0ZXIsIG9Db250ZXh0T2JqZWN0KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Zm5TZXREZWZhdWx0c0FuZE9wZW5EaWFsb2coc0JpbmRpbmdQYXJhbWV0ZXIpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgcmV0cmlldmluZyB0aGUgcGFyYW1ldGVyXCIsIG9FcnJvcik7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRmblNldERlZmF1bHRzQW5kT3BlbkRpYWxvZygpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0YWZ0ZXJDbG9zZTogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRcdG9EaWFsb2cuZGVzdHJveSgpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdGFGb3JtRWxlbWVudHMgPSBvRGlhbG9nQ29udGVudFxuXHRcdFx0XHRcdFx0XHQuZ2V0QWdncmVnYXRpb24oXCJmb3JtXCIpXG5cdFx0XHRcdFx0XHRcdC5nZXRBZ2dyZWdhdGlvbihcImZvcm1Db250YWluZXJzXCIpWzBdXG5cdFx0XHRcdFx0XHRcdC5nZXRBZ2dyZWdhdGlvbihcImZvcm1FbGVtZW50c1wiKTtcblx0XHRcdFx0XHRcdG9EaWFsb2cuc2V0TW9kZWwob0FjdGlvbkNvbnRleHQuZ2V0TW9kZWwoKS5vTW9kZWwpO1xuXHRcdFx0XHRcdFx0b0RpYWxvZy5zZXRNb2RlbChvUGFyYW1ldGVyTW9kZWwsIFwicGFyYW1zTW9kZWxcIik7XG5cdFx0XHRcdFx0XHRvRGlhbG9nLmJpbmRFbGVtZW50KHtcblx0XHRcdFx0XHRcdFx0cGF0aDogXCIvXCIsXG5cdFx0XHRcdFx0XHRcdG1vZGVsOiBcInBhcmFtc01vZGVsXCJcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0Ly8gZW1wdHkgbW9kZWwgdG8gYWRkIGVsZW1lbnRzIGR5bmFtaWNhbGx5IGRlcGVuZGluZyBvbiBudW1iZXIgb2YgTVZGIGZpZWxkcyBkZWZpbmVkIG9uIHRoZSBkaWFsb2dcblx0XHRcdFx0XHRcdGNvbnN0IG9NVkZNb2RlbCA9IG5ldyBKU09OTW9kZWwoe30pO1xuXHRcdFx0XHRcdFx0b0RpYWxvZy5zZXRNb2RlbChvTVZGTW9kZWwsIFwibXZmdmlld1wiKTtcblxuXHRcdFx0XHRcdFx0bGV0IHNBY3Rpb25QYXRoID0gYCR7c0FjdGlvbk5hbWV9KC4uLilgO1xuXHRcdFx0XHRcdFx0YUNvbnRleHRzID0gbVBhcmFtZXRlcnMuYUNvbnRleHRzIHx8IFtdO1xuXHRcdFx0XHRcdFx0aWYgKCFhQ29udGV4dHMubGVuZ3RoKSB7XG5cdFx0XHRcdFx0XHRcdHNBY3Rpb25QYXRoID0gYC8ke3NBY3Rpb25QYXRofWA7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRvRGlhbG9nLmJpbmRFbGVtZW50KHtcblx0XHRcdFx0XHRcdFx0cGF0aDogc0FjdGlvblBhdGhcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0aWYgKG9QYXJlbnRDb250cm9sKSB7XG5cdFx0XHRcdFx0XHRcdC8vIGlmIHRoZXJlIGlzIGEgcGFyZW50IGNvbnRyb2wgc3BlY2lmaWVkIGFkZCB0aGUgZGlhbG9nIGFzIGRlcGVuZGVudFxuXHRcdFx0XHRcdFx0XHRvUGFyZW50Q29udHJvbC5hZGREZXBlbmRlbnQob0RpYWxvZyk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAoYUNvbnRleHRzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRcdFx0b0RpYWxvZy5zZXRCaW5kaW5nQ29udGV4dChhQ29udGV4dHNbMF0pOyAvLyB1c2UgY29udGV4dCBvZiBmaXJzdCBzZWxlY3RlZCBsaW5lIGl0ZW1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdG9PcGVyYXRpb25CaW5kaW5nID0gb0RpYWxvZy5nZXRPYmplY3RCaW5kaW5nKCk7XG5cdFx0XHRcdFx0XHRvRGlhbG9nLm9wZW4oKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKHJlamVjdCk7XG5cdH0pO1xufVxuZnVuY3Rpb24gZ2V0QWN0aW9uUGFyYW1ldGVycyhvQWN0aW9uOiBhbnkpIHtcblx0Y29uc3QgYVBhcmFtZXRlcnMgPSBvQWN0aW9uLmdldE9iamVjdChcIiRQYXJhbWV0ZXJcIikgfHwgW107XG5cdGlmIChhUGFyYW1ldGVycyAmJiBhUGFyYW1ldGVycy5sZW5ndGgpIHtcblx0XHRpZiAob0FjdGlvbi5nZXRPYmplY3QoXCIkSXNCb3VuZFwiKSkge1xuXHRcdFx0Ly9pbiBjYXNlIG9mIGJvdW5kIGFjdGlvbnMsIGlnbm9yZSB0aGUgZmlyc3QgcGFyYW1ldGVyIGFuZCBjb25zaWRlciB0aGUgcmVzdFxuXHRcdFx0cmV0dXJuIGFQYXJhbWV0ZXJzLnNsaWNlKDEsIGFQYXJhbWV0ZXJzLmxlbmd0aCkgfHwgW107XG5cdFx0fVxuXHR9XG5cdHJldHVybiBhUGFyYW1ldGVycztcbn1cbmZ1bmN0aW9uIGdldElzQWN0aW9uQ3JpdGljYWwob01ldGFNb2RlbDogYW55LCBzUGF0aDogYW55LCBjb250ZXh0cz86IGFueSwgb0JvdW5kQWN0aW9uPzogYW55KSB7XG5cdGNvbnN0IHZBY3Rpb25Dcml0aWNhbCA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NQYXRofUBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuSXNBY3Rpb25Dcml0aWNhbGApO1xuXHRsZXQgc0NyaXRpY2FsUGF0aCA9IHZBY3Rpb25Dcml0aWNhbCAmJiB2QWN0aW9uQ3JpdGljYWwuJFBhdGg7XG5cdGlmICghc0NyaXRpY2FsUGF0aCkge1xuXHRcdC8vIHRoZSBzdGF0aWMgdmFsdWUgc2NlbmFyaW8gZm9yIGlzQWN0aW9uQ3JpdGljYWxcblx0XHRyZXR1cm4gISF2QWN0aW9uQ3JpdGljYWw7XG5cdH1cblx0Y29uc3QgYUJpbmRpbmdQYXJhbXMgPSBvQm91bmRBY3Rpb24gJiYgb0JvdW5kQWN0aW9uLmdldE9iamVjdChcIiRQYXJhbWV0ZXJcIiksXG5cdFx0YVBhdGhzID0gc0NyaXRpY2FsUGF0aCAmJiBzQ3JpdGljYWxQYXRoLnNwbGl0KFwiL1wiKSxcblx0XHRiQ29uZGl0aW9uID1cblx0XHRcdGFCaW5kaW5nUGFyYW1zICYmIGFCaW5kaW5nUGFyYW1zLmxlbmd0aCAmJiB0eXBlb2YgYUJpbmRpbmdQYXJhbXMgPT09IFwib2JqZWN0XCIgJiYgc0NyaXRpY2FsUGF0aCAmJiBjb250ZXh0cyAmJiBjb250ZXh0cy5sZW5ndGg7XG5cdGlmIChiQ29uZGl0aW9uKSB7XG5cdFx0Ly9pbiBjYXNlIGJpbmRpbmcgcGF0YW1ldGVycyBhcmUgdGhlcmUgaW4gcGF0aCBuZWVkIHRvIHJlbW92ZSBlZzogLSBfaXQvaXNWZXJpZmllZCA9PiBuZWVkIHRvIHJlbW92ZSBfaXQgYW5kIHRoZSBwYXRoIHNob3VsZCBiZSBpc1ZlcmlmaWVkXG5cdFx0YUJpbmRpbmdQYXJhbXMuZmlsdGVyKGZ1bmN0aW9uIChvUGFyYW1zOiBhbnkpIHtcblx0XHRcdGNvbnN0IGluZGV4ID0gYVBhdGhzICYmIGFQYXRocy5pbmRleE9mKG9QYXJhbXMuJE5hbWUpO1xuXHRcdFx0aWYgKGluZGV4ID4gLTEpIHtcblx0XHRcdFx0YVBhdGhzLnNwbGljZShpbmRleCwgMSk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0c0NyaXRpY2FsUGF0aCA9IGFQYXRocy5qb2luKFwiL1wiKTtcblx0XHRyZXR1cm4gY29udGV4dHNbMF0uZ2V0T2JqZWN0KHNDcml0aWNhbFBhdGgpO1xuXHR9IGVsc2UgaWYgKHNDcml0aWNhbFBhdGgpIHtcblx0XHQvL2lmIHNjZW5hcmlvIGlzIHBhdGggYmFzZWQgcmV0dXJuIHRoZSBwYXRoIHZhbHVlXG5cdFx0cmV0dXJuIGNvbnRleHRzWzBdLmdldE9iamVjdChzQ3JpdGljYWxQYXRoKTtcblx0fVxufVxuXG5mdW5jdGlvbiBleGVjdXRlRGVwZW5kaW5nT25TZWxlY3RlZENvbnRleHRzKG9BY3Rpb246IGFueSwgbVBhcmFtZXRlcnM6IGFueSwgYkdldEJvdW5kQ29udGV4dDogYm9vbGVhbiwgc0dyb3VwSWQ6IHN0cmluZykge1xuXHRsZXQgb0FjdGlvblByb21pc2UsXG5cdFx0YkVuYWJsZVN0cmljdEhhbmRsaW5nID0gdHJ1ZTtcblx0aWYgKGJHZXRCb3VuZENvbnRleHQpIHtcblx0XHRjb25zdCBzUGF0aCA9IG9BY3Rpb24uZ2V0Qm91bmRDb250ZXh0KCkuZ2V0UGF0aCgpO1xuXHRcdGNvbnN0IHNNZXRhUGF0aCA9IG9BY3Rpb24uZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKS5nZXRNZXRhUGF0aChzUGF0aCk7XG5cdFx0Y29uc3Qgb1Byb3BlcnR5ID0gb0FjdGlvbi5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpLmdldE9iamVjdChzTWV0YVBhdGgpO1xuXHRcdGlmIChvUHJvcGVydHkgJiYgb1Byb3BlcnR5WzBdPy4ka2luZCAhPT0gXCJBY3Rpb25cIikge1xuXHRcdFx0Ly9kbyBub3QgZW5hYmxlIHRoZSBzdHJpY3QgaGFuZGxpbmcgaWYgaXRzIG5vdCBhbiBhY3Rpb25cblx0XHRcdGJFbmFibGVTdHJpY3RIYW5kbGluZyA9IGZhbHNlO1xuXHRcdH1cblx0fVxuXG5cdGlmIChcblx0XHQobVBhcmFtZXRlcnMuaW50ZXJuYWxNb2RlbENvbnRleHQgJiYgbVBhcmFtZXRlcnMuaW50ZXJuYWxNb2RlbENvbnRleHQuZ2V0T2JqZWN0KCkubnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzID4gMSkgfHxcblx0XHQhYkVuYWJsZVN0cmljdEhhbmRsaW5nXG5cdCkge1xuXHRcdG9BY3Rpb25Qcm9taXNlID0gYkdldEJvdW5kQ29udGV4dFxuXHRcdFx0PyBvQWN0aW9uLmV4ZWN1dGUoc0dyb3VwSWQpLnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdHJldHVybiBvQWN0aW9uLmdldEJvdW5kQ29udGV4dCgpO1xuXHRcdFx0ICB9KVxuXHRcdFx0OiBvQWN0aW9uLmV4ZWN1dGUoc0dyb3VwSWQpO1xuXHR9IGVsc2Uge1xuXHRcdG9BY3Rpb25Qcm9taXNlID0gYkdldEJvdW5kQ29udGV4dFxuXHRcdFx0PyBvQWN0aW9uXG5cdFx0XHRcdFx0LmV4ZWN1dGUoXG5cdFx0XHRcdFx0XHRzR3JvdXBJZCxcblx0XHRcdFx0XHRcdHVuZGVmaW5lZCxcblx0XHRcdFx0XHRcdENvbW1vblV0aWxzLmZuT25TdHJpY3RIYW5kbGluZ0ZhaWxlZC5iaW5kKG9wZXJhdGlvbnMsIHNHcm91cElkLCBtUGFyYW1ldGVycy5sYWJlbCwgbVBhcmFtZXRlcnMubW9kZWwpXG5cdFx0XHRcdFx0KVxuXHRcdFx0XHRcdC50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdHJldHVybiBvQWN0aW9uLmdldEJvdW5kQ29udGV4dCgpO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHQ6IG9BY3Rpb24uZXhlY3V0ZShcblx0XHRcdFx0XHRzR3JvdXBJZCxcblx0XHRcdFx0XHR1bmRlZmluZWQsXG5cdFx0XHRcdFx0Q29tbW9uVXRpbHMuZm5PblN0cmljdEhhbmRsaW5nRmFpbGVkLmJpbmQob3BlcmF0aW9ucywgc0dyb3VwSWQsIG1QYXJhbWV0ZXJzLmxhYmVsLCBtUGFyYW1ldGVycy5tb2RlbClcblx0XHRcdCAgKTtcblx0fVxuXG5cdHJldHVybiBvQWN0aW9uUHJvbWlzZTtcbn1cbmZ1bmN0aW9uIF9leGVjdXRlQWN0aW9uKG9BcHBDb21wb25lbnQ6IGFueSwgbVBhcmFtZXRlcnM6IGFueSkge1xuXHRjb25zdCBhQ29udGV4dHMgPSBtUGFyYW1ldGVycy5hQ29udGV4dHMgfHwgW107XG5cdGNvbnN0IG9Nb2RlbCA9IG1QYXJhbWV0ZXJzLm1vZGVsO1xuXHRjb25zdCBpRXhpc3RpbmdNZXNzYWdlcyA9IG1lc3NhZ2VIYW5kbGluZy5nZXRNZXNzYWdlcygpLmxlbmd0aCB8fCAwO1xuXHRjb25zdCBhQWN0aW9uUGFyYW1ldGVycyA9IG1QYXJhbWV0ZXJzLmFBY3Rpb25QYXJhbWV0ZXJzIHx8IFtdO1xuXHRjb25zdCBzQWN0aW9uTmFtZSA9IG1QYXJhbWV0ZXJzLmFjdGlvbk5hbWU7XG5cdGNvbnN0IGZuT25TdWJtaXR0ZWQgPSBtUGFyYW1ldGVycy5mbk9uU3VibWl0dGVkO1xuXHRjb25zdCBmbk9uUmVzcG9uc2UgPSBtUGFyYW1ldGVycy5mbk9uUmVzcG9uc2U7XG5cdGNvbnN0IGJJc0NyZWF0ZUFjdGlvbiA9IG1QYXJhbWV0ZXJzLmJJc0NyZWF0ZUFjdGlvbjtcblx0bGV0IG9BY3Rpb246IGFueTtcblx0Ly8gbGV0IGNvbnRleHRJbmRleCA9IDA7XG5cdC8vIGxldCBhTWVzc2FnZXM6IGFueVtdID0gW107XG5cblx0ZnVuY3Rpb24gZm5EaWZmZXJlbnRpYXRlKHByb21pc2U6IGFueSkge1xuXHRcdHJldHVybiBwcm9taXNlLnRoZW4oXG5cdFx0XHRmdW5jdGlvbiAocmVzcG9uc2U6IGFueSkge1xuXHRcdFx0XHRsZXQgYU1lc3NhZ2VzID0gbWVzc2FnZUhhbmRsaW5nLmdldE1lc3NhZ2VzKCk7XG5cdFx0XHRcdGFNZXNzYWdlcyA9IGFNZXNzYWdlcy5jb25jYXQobWVzc2FnZUhhbmRsaW5nLmdldE1lc3NhZ2VzKHRydWUsIHRydWUpKTtcblx0XHRcdFx0Ly8gQWN0aW9uIERpYWxvZyBtdXN0IHJlbWFpbiBvcGVuIGlmIHRoZXJlIGFyZSByZXNwb25zZSBlcnJvci1tZXNzYWdlcywgYmVjYXVzZSBpbiB0aGUgamF2YSBzdGFjayB0aGUgZGlhbG9nIHdvdWxkIGJlIGNsb3NlZCBpbW1lZGlhdGVseS5cblx0XHRcdFx0aWYgKGFNZXNzYWdlcy5sZW5ndGggPiBpRXhpc3RpbmdNZXNzYWdlcyAmJiBhTWVzc2FnZXNbYU1lc3NhZ2VzLmxlbmd0aCAtIDFdLnR5cGUgPT09IFwiRXJyb3JcIikge1xuXHRcdFx0XHRcdHJldHVybiB7IHJlc3BvbnNlOiByZXNwb25zZSwgc3RhdHVzOiBcInJlamVjdGVkXCIgfTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4geyByZXNwb25zZTogcmVzcG9uc2UsIHN0YXR1czogXCJyZXNvbHZlZFwiIH07XG5cdFx0XHR9LFxuXHRcdFx0ZnVuY3Rpb24gKHJlc3BvbnNlOiBhbnkpIHtcblx0XHRcdFx0cmV0dXJuIHsgcmVzcG9uc2U6IHJlc3BvbnNlLCBzdGF0dXM6IFwicmVqZWN0ZWRcIiB9O1xuXHRcdFx0fVxuXHRcdCk7XG5cdH1cblxuXHRmdW5jdGlvbiBzZXRBY3Rpb25QYXJhbWV0ZXJEZWZhdWx0VmFsdWUoKSB7XG5cdFx0aWYgKGFBY3Rpb25QYXJhbWV0ZXJzICYmIGFBY3Rpb25QYXJhbWV0ZXJzLmxlbmd0aCkge1xuXHRcdFx0Zm9yIChsZXQgaiA9IDA7IGogPCBhQWN0aW9uUGFyYW1ldGVycy5sZW5ndGg7IGorKykge1xuXHRcdFx0XHRpZiAoIWFBY3Rpb25QYXJhbWV0ZXJzW2pdLnZhbHVlKSB7XG5cdFx0XHRcdFx0c3dpdGNoIChhQWN0aW9uUGFyYW1ldGVyc1tqXS4kVHlwZSkge1xuXHRcdFx0XHRcdFx0Y2FzZSBcIkVkbS5TdHJpbmdcIjpcblx0XHRcdFx0XHRcdFx0YUFjdGlvblBhcmFtZXRlcnNbal0udmFsdWUgPSBcIlwiO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdGNhc2UgXCJFZG0uQm9vbGVhblwiOlxuXHRcdFx0XHRcdFx0XHRhQWN0aW9uUGFyYW1ldGVyc1tqXS52YWx1ZSA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdGNhc2UgXCJFZG0uQnl0ZVwiOlxuXHRcdFx0XHRcdFx0Y2FzZSBcIkVkbS5JbnQxNlwiOlxuXHRcdFx0XHRcdFx0Y2FzZSBcIkVkbS5JbnQzMlwiOlxuXHRcdFx0XHRcdFx0Y2FzZSBcIkVkbS5JbnQ2NFwiOlxuXHRcdFx0XHRcdFx0XHRhQWN0aW9uUGFyYW1ldGVyc1tqXS52YWx1ZSA9IDA7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0Ly8gdGJjXG5cdFx0XHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0b0FjdGlvbi5zZXRQYXJhbWV0ZXIoYUFjdGlvblBhcmFtZXRlcnNbal0uJE5hbWUsIGFBY3Rpb25QYXJhbWV0ZXJzW2pdLnZhbHVlKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRpZiAoYUNvbnRleHRzLmxlbmd0aCkge1xuXHRcdHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZTogKHZhbHVlOiBhbnkpID0+IHZvaWQsIHJlamVjdDogKHJlYXNvbj86IGFueSkgPT4gdm9pZCkge1xuXHRcdFx0Y29uc3QgbUJpbmRpbmdQYXJhbWV0ZXJzID0gbVBhcmFtZXRlcnMubUJpbmRpbmdQYXJhbWV0ZXJzO1xuXHRcdFx0Y29uc3QgYkdyb3VwZWQgPSBtUGFyYW1ldGVycy5iR3JvdXBlZDtcblx0XHRcdGNvbnN0IGJSZXR1cm5Bc0FycmF5ID0gbVBhcmFtZXRlcnMuYlJldHVybkFzQXJyYXk7XG5cdFx0XHRjb25zdCBiR2V0Qm91bmRDb250ZXh0ID0gbVBhcmFtZXRlcnMuYkdldEJvdW5kQ29udGV4dDtcblx0XHRcdGNvbnN0IGFBY3Rpb25Qcm9taXNlczogYW55W10gPSBbXTtcblx0XHRcdGxldCBvQWN0aW9uUHJvbWlzZTtcblx0XHRcdGxldCBpO1xuXHRcdFx0bGV0IHNHcm91cElkOiBzdHJpbmc7XG5cdFx0XHRjb25zdCBmbkV4ZWN1dGVBY3Rpb24gPSBmdW5jdGlvbiAoYWN0aW9uQ29udGV4dDogYW55LCBpbmRleDogYW55LCBvU2lkZUVmZmVjdDogYW55KSB7XG5cdFx0XHRcdHNldEFjdGlvblBhcmFtZXRlckRlZmF1bHRWYWx1ZSgpO1xuXHRcdFx0XHQvLyBGb3IgaW52b2NhdGlvbiBncm91cGluZyBcImlzb2xhdGVkXCIgbmVlZCBiYXRjaCBncm91cCBwZXIgYWN0aW9uIGNhbGxcblx0XHRcdFx0c0dyb3VwSWQgPSAhYkdyb3VwZWQgPyBgJGF1dG8uJHtpbmRleH1gIDogYWN0aW9uQ29udGV4dC5nZXRVcGRhdGVHcm91cElkKCk7XG5cdFx0XHRcdG9BY3Rpb25Qcm9taXNlID0gZXhlY3V0ZURlcGVuZGluZ09uU2VsZWN0ZWRDb250ZXh0cyhhY3Rpb25Db250ZXh0LCBtUGFyYW1ldGVycywgYkdldEJvdW5kQ29udGV4dCwgc0dyb3VwSWQpO1xuXHRcdFx0XHRhQWN0aW9uUHJvbWlzZXMucHVzaChvQWN0aW9uUHJvbWlzZSk7XG5cdFx0XHRcdGNvbnN0IG9TaWRlRWZmZWN0c1NlcnZpY2UgPSBvQXBwQ29tcG9uZW50LmdldFNpZGVFZmZlY3RzU2VydmljZSgpO1xuXHRcdFx0XHQvLyB0cmlnZ2VyIGFjdGlvbnMgZnJvbSBzaWRlIGVmZmVjdHNcblx0XHRcdFx0aWYgKG9TaWRlRWZmZWN0ICYmIG9TaWRlRWZmZWN0LnRyaWdnZXJBY3Rpb25zICYmIG9TaWRlRWZmZWN0LnRyaWdnZXJBY3Rpb25zLmxlbmd0aCkge1xuXHRcdFx0XHRcdG9TaWRlRWZmZWN0LnRyaWdnZXJBY3Rpb25zLmZvckVhY2goZnVuY3Rpb24gKHNUcmlnZ2VyQWN0aW9uOiBhbnkpIHtcblx0XHRcdFx0XHRcdGlmIChzVHJpZ2dlckFjdGlvbikge1xuXHRcdFx0XHRcdFx0XHRvU2lkZUVmZmVjdHNTZXJ2aWNlLmV4ZWN1dGVBY3Rpb24oc1RyaWdnZXJBY3Rpb24sIG9TaWRlRWZmZWN0LmNvbnRleHQsIHNHcm91cElkKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0XHQvLyByZXF1ZXN0IHNpZGUgZWZmZWN0cyBmb3IgdGhpcyBhY3Rpb25cblx0XHRcdFx0Ly8gYXMgd2UgbW92ZSB0aGUgbWVzc2FnZXMgcmVxdWVzdCB0byBQT1NUICRzZWxlY3Qgd2UgbmVlZCB0byBiZSBwcmVwYXJlZCBmb3IgYW4gZW1wdHkgYXJyYXlcblx0XHRcdFx0aWYgKG9TaWRlRWZmZWN0ICYmIG9TaWRlRWZmZWN0LnBhdGhFeHByZXNzaW9ucyAmJiBvU2lkZUVmZmVjdC5wYXRoRXhwcmVzc2lvbnMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdG9TaWRlRWZmZWN0c1NlcnZpY2Vcblx0XHRcdFx0XHRcdC5yZXF1ZXN0U2lkZUVmZmVjdHMob1NpZGVFZmZlY3QucGF0aEV4cHJlc3Npb25zLCBvU2lkZUVmZmVjdC5jb250ZXh0LCBzR3JvdXBJZClcblx0XHRcdFx0XHRcdC50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0aWYgKG1QYXJhbWV0ZXJzLm9wZXJhdGlvbkF2YWlsYWJsZU1hcCAmJiBtUGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dCkge1xuXHRcdFx0XHRcdFx0XHRcdENvbW1vblV0aWxzLnNldEFjdGlvbkVuYWJsZW1lbnQoXG5cdFx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dCxcblx0XHRcdFx0XHRcdFx0XHRcdEpTT04ucGFyc2UobVBhcmFtZXRlcnMub3BlcmF0aW9uQXZhaWxhYmxlTWFwKSxcblx0XHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmFDb250ZXh0c1xuXHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHJlcXVlc3Rpbmcgc2lkZSBlZmZlY3RzXCIsIG9FcnJvcik7XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0fTtcblx0XHRcdGNvbnN0IGZuRXhlY3V0ZVNpbmdsZUFjdGlvbiA9IGZ1bmN0aW9uIChhY3Rpb25Db250ZXh0OiBhbnksIGluZGV4OiBhbnksIG9TaWRlRWZmZWN0OiBhbnkpIHtcblx0XHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByb21pc2UvcGFyYW0tbmFtZXNcblx0XHRcdFx0cmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChhY3Rpb25SZXNvbHZlKSA9PiB7XG5cdFx0XHRcdFx0bGV0IG9Mb2NhbFByb21pc2U7XG5cdFx0XHRcdFx0Y29uc3QgYUxvY2FsUHJvbWlzZSA9IFtdO1xuXHRcdFx0XHRcdHNldEFjdGlvblBhcmFtZXRlckRlZmF1bHRWYWx1ZSgpO1xuXHRcdFx0XHRcdC8vIEZvciBpbnZvY2F0aW9uIGdyb3VwaW5nIFwiaXNvbGF0ZWRcIiBuZWVkIGJhdGNoIGdyb3VwIHBlciBhY3Rpb24gY2FsbFxuXHRcdFx0XHRcdHNHcm91cElkID0gYGFwaU1vZGUke2luZGV4fWA7XG5cdFx0XHRcdFx0b0FjdGlvblByb21pc2UgPSBleGVjdXRlRGVwZW5kaW5nT25TZWxlY3RlZENvbnRleHRzKGFjdGlvbkNvbnRleHQsIG1QYXJhbWV0ZXJzLCBiR2V0Qm91bmRDb250ZXh0LCBzR3JvdXBJZCk7XG5cdFx0XHRcdFx0YUFjdGlvblByb21pc2VzLnB1c2gob0FjdGlvblByb21pc2UpO1xuXHRcdFx0XHRcdGFMb2NhbFByb21pc2UucHVzaChvQWN0aW9uUHJvbWlzZSk7XG5cdFx0XHRcdFx0Y29uc3Qgb1NpZGVFZmZlY3RzU2VydmljZSA9IG9BcHBDb21wb25lbnQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKCk7XG5cdFx0XHRcdFx0Ly8gdHJpZ2dlciBhY3Rpb25zIGZyb20gc2lkZSBlZmZlY3RzXG5cdFx0XHRcdFx0aWYgKG9TaWRlRWZmZWN0ICYmIG9TaWRlRWZmZWN0LnRyaWdnZXJBY3Rpb25zICYmIG9TaWRlRWZmZWN0LnRyaWdnZXJBY3Rpb25zLmxlbmd0aCkge1xuXHRcdFx0XHRcdFx0b1NpZGVFZmZlY3QudHJpZ2dlckFjdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAoc1RyaWdnZXJBY3Rpb246IGFueSkge1xuXHRcdFx0XHRcdFx0XHRpZiAoc1RyaWdnZXJBY3Rpb24pIHtcblx0XHRcdFx0XHRcdFx0XHRvTG9jYWxQcm9taXNlID0gb1NpZGVFZmZlY3RzU2VydmljZS5leGVjdXRlQWN0aW9uKHNUcmlnZ2VyQWN0aW9uLCBvU2lkZUVmZmVjdC5jb250ZXh0LCBzR3JvdXBJZCk7XG5cdFx0XHRcdFx0XHRcdFx0YUxvY2FsUHJvbWlzZS5wdXNoKG9Mb2NhbFByb21pc2UpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Ly8gcmVxdWVzdCBzaWRlIGVmZmVjdHMgZm9yIHRoaXMgYWN0aW9uXG5cdFx0XHRcdFx0Ly8gYXMgd2UgbW92ZSB0aGUgbWVzc2FnZXMgcmVxdWVzdCB0byBQT1NUICRzZWxlY3Qgd2UgbmVlZCB0byBiZSBwcmVwYXJlZCBmb3IgYW4gZW1wdHkgYXJyYXlcblx0XHRcdFx0XHRpZiAob1NpZGVFZmZlY3QgJiYgb1NpZGVFZmZlY3QucGF0aEV4cHJlc3Npb25zICYmIG9TaWRlRWZmZWN0LnBhdGhFeHByZXNzaW9ucy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0XHRvTG9jYWxQcm9taXNlID0gb1NpZGVFZmZlY3RzU2VydmljZS5yZXF1ZXN0U2lkZUVmZmVjdHMob1NpZGVFZmZlY3QucGF0aEV4cHJlc3Npb25zLCBvU2lkZUVmZmVjdC5jb250ZXh0LCBzR3JvdXBJZCk7XG5cdFx0XHRcdFx0XHRhTG9jYWxQcm9taXNlLnB1c2gob0xvY2FsUHJvbWlzZSk7XG5cdFx0XHRcdFx0XHRvTG9jYWxQcm9taXNlXG5cdFx0XHRcdFx0XHRcdC50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0XHRpZiAobVBhcmFtZXRlcnMub3BlcmF0aW9uQXZhaWxhYmxlTWFwICYmIG1QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRDb21tb25VdGlscy5zZXRBY3Rpb25FbmFibGVtZW50KFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dCxcblx0XHRcdFx0XHRcdFx0XHRcdFx0SlNPTi5wYXJzZShtUGFyYW1ldGVycy5vcGVyYXRpb25BdmFpbGFibGVNYXApLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5hQ29udGV4dHNcblx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgcmVxdWVzdGluZyBzaWRlIGVmZmVjdHNcIiwgb0Vycm9yKTtcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdG9Nb2RlbC5zdWJtaXRCYXRjaChzR3JvdXBJZCk7XG5cdFx0XHRcdFx0UHJvbWlzZS5hbGwoYUxvY2FsUHJvbWlzZSlcblx0XHRcdFx0XHRcdC50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIGFjdGlvblJlc29sdmUoKTtcblx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gYWN0aW9uUmVzb2x2ZSgpO1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fTtcblxuXHRcdFx0ZnVuY3Rpb24gZm5FeGVjdXRlU2VxdWVudGlhbGx5KGNvbnRleHRzVG9FeGVjdXRlOiBhbnkpIHtcblx0XHRcdFx0Ly8gT25lIGFjdGlvbiBhbmQgaXRzIHNpZGUgZWZmZWN0cyBhcmUgY29tcGxldGVkIGJlZm9yZSB0aGUgbmV4dCBhY3Rpb24gaXMgZXhlY3V0ZWRcblx0XHRcdFx0KFxuXHRcdFx0XHRcdGZuT25TdWJtaXR0ZWQgfHxcblx0XHRcdFx0XHRmdW5jdGlvbiBub29wKCkge1xuXHRcdFx0XHRcdFx0LyoqL1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0KShhQWN0aW9uUHJvbWlzZXMpO1xuXHRcdFx0XHRmdW5jdGlvbiBwcm9jZXNzT25lQWN0aW9uKGNvbnRleHQ6IGFueSwgYWN0aW9uSW5kZXg6IGFueSkge1xuXHRcdFx0XHRcdG9BY3Rpb24gPSBvTW9kZWwuYmluZENvbnRleHQoYCR7c0FjdGlvbk5hbWV9KC4uLilgLCBjb250ZXh0LCBtQmluZGluZ1BhcmFtZXRlcnMpO1xuXHRcdFx0XHRcdHJldHVybiBmbkV4ZWN1dGVTaW5nbGVBY3Rpb24ob0FjdGlvbiwgYWN0aW9uSW5kZXgsIHtcblx0XHRcdFx0XHRcdGNvbnRleHQ6IGNvbnRleHQsXG5cdFx0XHRcdFx0XHRwYXRoRXhwcmVzc2lvbnM6IG1QYXJhbWV0ZXJzLmFkZGl0aW9uYWxTaWRlRWZmZWN0ICYmIG1QYXJhbWV0ZXJzLmFkZGl0aW9uYWxTaWRlRWZmZWN0LnBhdGhFeHByZXNzaW9ucyxcblx0XHRcdFx0XHRcdHRyaWdnZXJBY3Rpb25zOiBtUGFyYW1ldGVycy5hZGRpdGlvbmFsU2lkZUVmZmVjdCAmJiBtUGFyYW1ldGVycy5hZGRpdGlvbmFsU2lkZUVmZmVjdC50cmlnZ2VyQWN0aW9uc1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0bGV0IG9BY3Rpb25BbmRTaWRlRWZmZWN0UHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSgpO1xuXHRcdFx0XHRsZXQgaiA9IDA7XG5cdFx0XHRcdGNvbnRleHRzVG9FeGVjdXRlLmZvckVhY2goZnVuY3Rpb24gKGNvbnRleHQ6IGFueSkge1xuXHRcdFx0XHRcdGNvbnN0IGlkID0gKytqO1xuXHRcdFx0XHRcdG9BY3Rpb25BbmRTaWRlRWZmZWN0UHJvbWlzZSA9IG9BY3Rpb25BbmRTaWRlRWZmZWN0UHJvbWlzZS50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdHJldHVybiBwcm9jZXNzT25lQWN0aW9uKGNvbnRleHQsIGlkKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdG9BY3Rpb25BbmRTaWRlRWZmZWN0UHJvbWlzZVxuXHRcdFx0XHRcdC50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdGZuSGFuZGxlUmVzdWx0cygpO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRcdFx0TG9nLmVycm9yKG9FcnJvcik7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cblx0XHRcdGlmICghYkdyb3VwZWQpIHtcblx0XHRcdFx0Ly8gRm9yIGludm9jYXRpb24gZ3JvdXBpbmcgXCJpc29sYXRlZFwiLCBlbnN1cmUgdGhhdCBlYWNoIGFjdGlvbiBhbmQgbWF0Y2hpbmcgc2lkZSBlZmZlY3RzXG5cdFx0XHRcdC8vIGFyZSBwcm9jZXNzZWQgYmVmb3JlIHRoZSBuZXh0IHNldCBpcyBzdWJtaXR0ZWQuIFdvcmthcm91bmQgdW50aWwgSlNPTiBiYXRjaCBpcyBhdmFpbGFibGUuXG5cdFx0XHRcdC8vIEFsbG93IGFsc28gZm9yIExpc3QgUmVwb3J0LlxuXHRcdFx0XHRmbkV4ZWN1dGVTZXF1ZW50aWFsbHkoYUNvbnRleHRzKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGZvciAoaSA9IDA7IGkgPCBhQ29udGV4dHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0XHRvQWN0aW9uID0gb01vZGVsLmJpbmRDb250ZXh0KGAke3NBY3Rpb25OYW1lfSguLi4pYCwgYUNvbnRleHRzW2ldLCBtQmluZGluZ1BhcmFtZXRlcnMpO1xuXHRcdFx0XHRcdGZuRXhlY3V0ZUFjdGlvbihvQWN0aW9uLCBhQ29udGV4dHMubGVuZ3RoIDw9IDEgPyBudWxsIDogaSwge1xuXHRcdFx0XHRcdFx0Y29udGV4dDogYUNvbnRleHRzW2ldLFxuXHRcdFx0XHRcdFx0cGF0aEV4cHJlc3Npb25zOiBtUGFyYW1ldGVycy5hZGRpdGlvbmFsU2lkZUVmZmVjdCAmJiBtUGFyYW1ldGVycy5hZGRpdGlvbmFsU2lkZUVmZmVjdC5wYXRoRXhwcmVzc2lvbnMsXG5cdFx0XHRcdFx0XHR0cmlnZ2VyQWN0aW9uczogbVBhcmFtZXRlcnMuYWRkaXRpb25hbFNpZGVFZmZlY3QgJiYgbVBhcmFtZXRlcnMuYWRkaXRpb25hbFNpZGVFZmZlY3QudHJpZ2dlckFjdGlvbnNcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0XHQoXG5cdFx0XHRcdFx0Zm5PblN1Ym1pdHRlZCB8fFxuXHRcdFx0XHRcdGZ1bmN0aW9uIG5vb3AoKSB7XG5cdFx0XHRcdFx0XHQvKiovXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHQpKGFBY3Rpb25Qcm9taXNlcyk7XG5cdFx0XHRcdGZuSGFuZGxlUmVzdWx0cygpO1xuXHRcdFx0fVxuXG5cdFx0XHRmdW5jdGlvbiBmbkhhbmRsZVJlc3VsdHMoKSB7XG5cdFx0XHRcdFByb21pc2UuYWxsKGFBY3Rpb25Qcm9taXNlcy5tYXAoZm5EaWZmZXJlbnRpYXRlKSlcblx0XHRcdFx0XHQudGhlbihmdW5jdGlvbiAocmVzdWx0czogYW55W10pIHtcblx0XHRcdFx0XHRcdGNvbnN0IGFSZWplY3RlZEl0ZW1zID0gW107XG5cdFx0XHRcdFx0XHRjb25zdCBhUmVzb2x2ZWRJdGVtcyA9IFtdO1xuXHRcdFx0XHRcdFx0bGV0IGlSZXN1bHRDb3VudDtcblx0XHRcdFx0XHRcdGZvciAoaVJlc3VsdENvdW50ID0gMDsgaVJlc3VsdENvdW50IDwgcmVzdWx0cy5sZW5ndGg7IGlSZXN1bHRDb3VudCsrKSB7XG5cdFx0XHRcdFx0XHRcdGlmIChyZXN1bHRzW2lSZXN1bHRDb3VudF0uc3RhdHVzID09PSBcInJlamVjdGVkXCIpIHtcblx0XHRcdFx0XHRcdFx0XHRhUmVqZWN0ZWRJdGVtcy5wdXNoKHJlc3VsdHNbaVJlc3VsdENvdW50XS5yZXNwb25zZSk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0aWYgKHJlc3VsdHNbaVJlc3VsdENvdW50XS5zdGF0dXMgPT09IFwicmVzb2x2ZWRcIikge1xuXHRcdFx0XHRcdFx0XHRcdGlmIChiSXNDcmVhdGVBY3Rpb24pIHtcblx0XHRcdFx0XHRcdFx0XHRcdC8vIHJlbW92ZWQgdGhlIGJBY3Rpb25QYXJhbWV0ZXJzRXhpc3Qgc28gdGhhdCBjcmVhdGUgbmV3IGFjdGlvbiBjYW4gd29yayBpbiBib3RoIGNhc2VzIC0gd2l0aCBhbmQgd2l0aG91dCBkaWFsb2dcblx0XHRcdFx0XHRcdFx0XHRcdC8vb25seSB1c2VkIGZvciBOZXdBY3Rpb25cblx0XHRcdFx0XHRcdFx0XHRcdHJlc3VsdHNbaVJlc3VsdENvdW50XS5iQ29uc2lkZXJEb2N1bWVudE1vZGlmaWVkID0gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0XHRcdGFSZXNvbHZlZEl0ZW1zLnB1c2gocmVzdWx0c1tpUmVzdWx0Q291bnRdKTtcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0YVJlc29sdmVkSXRlbXMucHVzaChyZXN1bHRzW2lSZXN1bHRDb3VudF0ucmVzcG9uc2UpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0aWYgKCFyZXN1bHRzIHx8IChyZXN1bHRzICYmIHJlc3VsdHMubGVuZ3RoID09PSAwKSkge1xuXHRcdFx0XHRcdFx0XHRyZWplY3QodHJ1ZSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAoYVJlamVjdGVkSXRlbXMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRcdFx0XHRcdGlmIChiUmV0dXJuQXNBcnJheSkge1xuXHRcdFx0XHRcdFx0XHRcdHJlc29sdmUoYVJlc29sdmVkSXRlbXMpO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdC8vIGNvbnRleHQgaXMgZ2l2ZW4gZGlyZWN0bHkgd2l0aG91dCBhbiBhcnJheSBzbyBhbHNvIG5vIGFycmF5IGlzIGV4cGVjdGVkXG5cdFx0XHRcdFx0XHRcdFx0cmVzb2x2ZShhUmVzb2x2ZWRJdGVtc1swXSk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdHJlamVjdCh7XG5cdFx0XHRcdFx0XHRcdFx0cmVzb2x2ZWRJdGVtczogYVJlc29sdmVkSXRlbXMsXG5cdFx0XHRcdFx0XHRcdFx0cmVqZWN0ZWRJdGVtczogYVJlamVjdGVkSXRlbXNcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQuY2F0Y2gocmVqZWN0KTtcblx0XHRcdH1cblx0XHR9KS5maW5hbGx5KGZ1bmN0aW9uICgpIHtcblx0XHRcdChcblx0XHRcdFx0Zm5PblJlc3BvbnNlIHx8XG5cdFx0XHRcdGZ1bmN0aW9uIG5vb3AoKSB7XG5cdFx0XHRcdFx0LyoqL1xuXHRcdFx0XHR9XG5cdFx0XHQpKCk7XG5cdFx0fSk7XG5cdH0gZWxzZSB7XG5cdFx0b0FjdGlvbiA9IG9Nb2RlbC5iaW5kQ29udGV4dChgLyR7c0FjdGlvbk5hbWV9KC4uLilgKTtcblx0XHRzZXRBY3Rpb25QYXJhbWV0ZXJEZWZhdWx0VmFsdWUoKTtcblx0XHRjb25zdCBzR3JvdXBJZCA9IFwiYWN0aW9uSW1wb3J0XCI7XG5cdFx0Y29uc3Qgb0FjdGlvblByb21pc2UgPSBvQWN0aW9uLmV4ZWN1dGUoXG5cdFx0XHRzR3JvdXBJZCxcblx0XHRcdHVuZGVmaW5lZCxcblx0XHRcdENvbW1vblV0aWxzLmZuT25TdHJpY3RIYW5kbGluZ0ZhaWxlZC5iaW5kKG9wZXJhdGlvbnMsIHNHcm91cElkLCBtUGFyYW1ldGVycy5sYWJlbCwgb01vZGVsKVxuXHRcdCk7XG5cdFx0b01vZGVsLnN1Ym1pdEJhdGNoKHNHcm91cElkKTtcblx0XHQvLyB0cmlnZ2VyIG9uU3VibWl0dGVkIFwiZXZlbnRcIlxuXHRcdChcblx0XHRcdGZuT25TdWJtaXR0ZWQgfHxcblx0XHRcdGZ1bmN0aW9uIG5vb3AoKSB7XG5cdFx0XHRcdC8qKi9cblx0XHRcdH1cblx0XHQpKG9BY3Rpb25Qcm9taXNlKTtcblx0XHRyZXR1cm4gb0FjdGlvblByb21pc2UuZmluYWxseShmdW5jdGlvbiAoKSB7XG5cdFx0XHQoXG5cdFx0XHRcdGZuT25SZXNwb25zZSB8fFxuXHRcdFx0XHRmdW5jdGlvbiBub29wKCkge1xuXHRcdFx0XHRcdC8qKi9cblx0XHRcdFx0fVxuXHRcdFx0KSgpO1xuXHRcdH0pO1xuXHR9XG59XG5mdW5jdGlvbiBfZ2V0UGF0aChvQWN0aW9uQ29udGV4dDogYW55LCBzQWN0aW9uTmFtZTogYW55KSB7XG5cdGxldCBzUGF0aCA9IG9BY3Rpb25Db250ZXh0LmdldFBhdGgoKTtcblx0c1BhdGggPSBvQWN0aW9uQ29udGV4dC5nZXRPYmplY3QoXCIkSXNCb3VuZFwiKSA/IHNQYXRoLnNwbGl0KFwiQCR1aTUub3ZlcmxvYWRcIilbMF0gOiBzUGF0aC5zcGxpdChcIi8wXCIpWzBdO1xuXHRyZXR1cm4gc1BhdGguc3BsaXQoYC8ke3NBY3Rpb25OYW1lfWApWzBdO1xufVxuXG5mdW5jdGlvbiBfc2hvd0FjdGlvblBhcmFtZXRlckRpYWxvZyhzaG93RGlhbG9nOiBib29sZWFuLCBhY3Rpb25QYXJhbWV0ZXJzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+W10pOiBib29sZWFuIHtcblx0aWYgKHNob3dEaWFsb2cgfHwgYWN0aW9uUGFyYW1ldGVycy5sZW5ndGggPiAwKSB7XG5cdFx0aWYgKFxuXHRcdFx0IWFjdGlvblBhcmFtZXRlcnMgfHxcblx0XHRcdGFjdGlvblBhcmFtZXRlcnMubGVuZ3RoID09PSAwIHx8XG5cdFx0XHQoYWN0aW9uUGFyYW1ldGVycy5sZW5ndGggPT09IDEgJiYgYWN0aW9uUGFyYW1ldGVyc1swXS4kTmFtZSA9PT0gXCJSZXN1bHRJc0FjdGl2ZUVudGl0eVwiKVxuXHRcdCkge1xuXHRcdFx0c2hvd0RpYWxvZyA9IGZhbHNlO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBzaG93RGlhbG9nO1xufVxuXG4vKipcbiAqIFN0YXRpYyBmdW5jdGlvbnMgdG8gY2FsbCBPRGF0YSBhY3Rpb25zIChib3VuZC9pbXBvcnQpIGFuZCBmdW5jdGlvbnMgKGJvdW5kL2ltcG9ydClcbiAqXG4gKiBAbmFtZXNwYWNlXG4gKiBAYWxpYXMgc2FwLmZlLmNvcmUuYWN0aW9ucy5vcGVyYXRpb25zXG4gKiBAcHJpdmF0ZVxuICogQGV4cGVyaW1lbnRhbCBUaGlzIG1vZHVsZSBpcyBvbmx5IGZvciBleHBlcmltZW50YWwgdXNlISA8YnIvPjxiPlRoaXMgaXMgb25seSBhIFBPQyBhbmQgbWF5YmUgZGVsZXRlZDwvYj5cbiAqIEBzaW5jZSAxLjU2LjBcbiAqL1xuY29uc3Qgb3BlcmF0aW9ucyA9IHtcblx0Y2FsbEJvdW5kQWN0aW9uOiBjYWxsQm91bmRBY3Rpb24sXG5cdGNhbGxBY3Rpb25JbXBvcnQ6IGNhbGxBY3Rpb25JbXBvcnQsXG5cdGNhbGxCb3VuZEZ1bmN0aW9uOiBjYWxsQm91bmRGdW5jdGlvbixcblx0Y2FsbEZ1bmN0aW9uSW1wb3J0OiBjYWxsRnVuY3Rpb25JbXBvcnQsXG5cdGV4ZWN1dGVEZXBlbmRpbmdPblNlbGVjdGVkQ29udGV4dHM6IGV4ZWN1dGVEZXBlbmRpbmdPblNlbGVjdGVkQ29udGV4dHMsXG5cdHNob3dBY3Rpb25QYXJhbWV0ZXJEaWFsb2c6IF9zaG93QWN0aW9uUGFyYW1ldGVyRGlhbG9nXG59O1xuXG5leHBvcnQgZGVmYXVsdCBvcGVyYXRpb25zO1xuIl19