@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
@@ -16,6 +16,20 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
16
16
  var Activity = CollaborationCommon.Activity;
17
17
  var send = ActivitySync.send;
18
18
 
19
+ function _catch(body, recover) {
20
+ try {
21
+ var result = body();
22
+ } catch (e) {
23
+ return recover(e);
24
+ }
25
+
26
+ if (result && result.then) {
27
+ return result.then(void 0, recover);
28
+ }
29
+
30
+ return result;
31
+ }
32
+
19
33
  function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); }
20
34
 
21
35
  function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
@@ -61,17 +75,16 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
61
75
  BusyLocker.lock(oLockObject);
62
76
  var aFinalContexts = [];
63
77
  return this.syncTask().then(function () {
64
- var onBeforeCreatePromise = beforeCreateCallBack ? beforeCreateCallBack({
78
+ return beforeCreateCallBack ? beforeCreateCallBack({
65
79
  contextPath: oListBinding && oListBinding.getPath()
66
80
  }) : Promise.resolve();
67
- return onBeforeCreatePromise;
68
81
  }).then(function () {
69
82
  var oModel = oListBinding.getModel(),
70
83
  oMetaModel = oModel.getMetaModel();
71
84
  var sMetaPath;
72
85
 
73
86
  if (oListBinding.getContext()) {
74
- sMetaPath = oMetaModel.getMetaPath(oListBinding.getContext().getPath() + "/" + oListBinding.getPath());
87
+ sMetaPath = oMetaModel.getMetaPath("".concat(oListBinding.getContext().getPath(), "/").concat(oListBinding.getPath()));
75
88
  } else {
76
89
  sMetaPath = oMetaModel.getMetaPath(oListBinding.getPath());
77
90
  }
@@ -92,7 +105,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
92
105
  mParameters.inactive = bInactive; // Remove navigation properties as we don't support deep create
93
106
 
94
107
  for (var sPropertyPath in mPropertyValues) {
95
- var oProperty = oMetaModel.getObject(sMetaPath + "/" + sPropertyPath);
108
+ var oProperty = oMetaModel.getObject("".concat(sMetaPath, "/").concat(sPropertyPath));
96
109
 
97
110
  if (oProperty && oProperty.$kind !== "NavigationProperty" && mPropertyValues[sPropertyPath]) {
98
111
  mParameters.data[sPropertyPath] = mPropertyValues[sPropertyPath];
@@ -142,7 +155,12 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
142
155
 
143
156
  var oListBinding = oTable.getRowBinding();
144
157
  mParameters.bFindActiveContexts = true;
145
- BusyLocker.lock(oLockObject);
158
+ BusyLocker.lock(oLockObject); // Check if a displayed view can be impacted by the deletion, i.e. if there's an OP displaying a deleted object.
159
+ // We have to check this before the contexts are deleted (after, the contexts are invalid)
160
+
161
+ var navigateBackFromContext = aContexts.find(function (context) {
162
+ return oRoutingListener.isCurrentStateImpactedBy(context);
163
+ });
146
164
  return this.deleteDocumentTransaction(aContexts, mParameters).then(function () {
147
165
  var oResult; // Multiple object deletion is triggered from a list
148
166
  // First clear the selection in the table as it's not valid any more
@@ -172,14 +190,10 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
172
190
  EditState.setEditStateDirty();
173
191
  send(_this2.getView(), Activity.Delete, aContexts.map(function (context) {
174
192
  return context.getPath();
175
- })); // Finally, check if the current state can be impacted by the deletion, i.e. if there's
176
- // an OP displaying a deleted object. If yes navigate back to dismiss the OP
193
+ })); // Navigate back from a deleted context if needed
177
194
 
178
- for (var index = 0; index < aContexts.length; index++) {
179
- if (oRoutingListener.isCurrentStateImpactedBy(aContexts[index])) {
180
- oRoutingListener.navigateBackFromContext(aContexts[index]);
181
- break;
182
- }
195
+ if (navigateBackFromContext) {
196
+ oRoutingListener.navigateBackFromContext(navigateBackFromContext);
183
197
  }
184
198
 
185
199
  return oResult;
@@ -201,53 +215,64 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
201
215
  ;
202
216
 
203
217
  _proto.computeEditMode = function computeEditMode(oContext) {
204
- var _this3 = this;
218
+ try {
219
+ var _this4 = this;
205
220
 
206
- var sCustomAction = this.getInternalModel().getProperty("/sCustomAction");
207
- return Promise.resolve(function () {
208
- var sProgrammingModel = _this3.getProgrammingModel(oContext);
221
+ var sCustomAction = _this4.getInternalModel().getProperty("/sCustomAction");
209
222
 
210
- if (sProgrammingModel === ProgrammingModel.Draft) {
211
- _this3.setDraftStatus(DraftStatus.Clear);
223
+ var sProgrammingModel = _this4.getProgrammingModel(oContext);
224
+
225
+ return Promise.resolve(function () {
226
+ if (sProgrammingModel === ProgrammingModel.Draft) {
227
+ return _catch(function () {
228
+ _this4.setDraftStatus(DraftStatus.Clear);
229
+
230
+ return Promise.resolve(oContext.requestObject("IsActiveEntity")).then(function (bIsActiveEntity) {
231
+ var _temp = function () {
232
+ if (bIsActiveEntity === false) {
233
+ // in case the document is draft set it in edit mode
234
+ _this4.setEditMode(EditMode.Editable);
212
235
 
213
- return oContext.requestObject("IsActiveEntity").then(function (bIsActiveEntity) {
214
- if (bIsActiveEntity === false) {
215
- // in case the document is draft set it in edit mode
216
- _this3.setEditMode(EditMode.Editable);
236
+ return Promise.resolve(oContext.requestObject("HasActiveEntity")).then(function (bHasActiveEntity) {
237
+ _this4.setEditMode(undefined, !bHasActiveEntity);
238
+ });
239
+ } else {
240
+ // active document, stay on display mode
241
+ _this4.setEditMode(EditMode.Display, false);
242
+ }
243
+ }();
217
244
 
218
- return oContext.requestObject("HasActiveEntity").then(function (bHasActiveEntity) {
219
- _this3.setEditMode(undefined, !bHasActiveEntity);
245
+ if (_temp && _temp.then) return _temp.then(function () {});
220
246
  });
221
- } else {
222
- // active document, stay on display mode
223
- _this3.setEditMode(EditMode.Display, false);
224
- }
225
- }).catch(function (oError) {
226
- Log.error("Error while determining the editMode for draft", oError);
227
- throw oError;
228
- });
229
- } else if (sProgrammingModel === ProgrammingModel.Sticky) {
230
- if (sCustomAction && sCustomAction !== "" && _this3._hasNewActionForSticky(oContext, _this3.getView(), sCustomAction)) {
231
- _this3.getTransactionHelper()._bCreateMode = true;
247
+ }, function (oError) {
248
+ Log.error("Error while determining the editMode for draft", oError);
249
+ throw oError;
250
+ });
251
+ } else if (sProgrammingModel === ProgrammingModel.Sticky) {
252
+ if (sCustomAction && sCustomAction !== "" && _this4._hasNewActionForSticky(oContext, _this4.getView(), sCustomAction)) {
253
+ _this4.getTransactionHelper()._bCreateMode = true;
232
254
 
233
- _this3.getTransactionHelper().handleDocumentModifications();
255
+ _this4.getTransactionHelper().handleDocumentModifications();
234
256
 
235
- _this3.setEditMode(EditMode.Editable, true);
257
+ _this4.setEditMode(EditMode.Editable, true);
236
258
 
237
- EditState.setEditStateDirty();
259
+ EditState.setEditStateDirty();
238
260
 
239
- _this3.handleStickyOn(oContext);
261
+ _this4.handleStickyOn(oContext);
240
262
 
241
- _this3.getInternalModel().setProperty("/sCustomAction", "");
263
+ _this4.getInternalModel().setProperty("/sCustomAction", "");
264
+ }
242
265
  }
243
- }
244
- }());
266
+ }());
267
+ } catch (e) {
268
+ return Promise.reject(e);
269
+ }
245
270
  }
246
271
  /**
247
272
  * Sets the edit mode.
248
273
  *
249
- * @param {string} sEditMode
250
- * @param {boolean} bCreationMode CreateMode flag to identify the creation mode
274
+ * @param sEditMode
275
+ * @param bCreationMode CreateMode flag to identify the creation mode
251
276
  */
252
277
  ;
253
278
 
@@ -296,9 +321,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
296
321
  * @name sap.fe.core.controllerextensions.EditFlow#syncTask
297
322
  * @memberof sap.fe.core.controllerextensions.EditFlow
298
323
  * @static
299
- * @param {Promise|Function} [vTask] Optional, a promise or function to be executed synchronously
300
- * @returns {Promise} Promise resolves once the task is completed
301
- *
324
+ * @param [vTask] Optional, a promise or function to be executed synchronously
325
+ * @returns Promise resolves once the task is completed
302
326
  * @ui5-restricted
303
327
  * @final
304
328
  */
@@ -317,7 +341,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
317
341
 
318
342
  this._pTasks = this._pTasks || Promise.resolve();
319
343
 
320
- if (!!fnNewTask) {
344
+ if (fnNewTask) {
321
345
  this._pTasks = this._pTasks.then(fnNewTask).catch(function () {
322
346
  return Promise.resolve();
323
347
  });
@@ -332,7 +356,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
332
356
 
333
357
  _proto.deleteDocumentTransaction = function deleteDocumentTransaction(oContext, mParameters) {
334
358
  var _sap$ui$getCore$byId,
335
- _this4 = this;
359
+ _this5 = this;
336
360
 
337
361
  var oResourceBundle = this.getView().getController().oResourceBundle,
338
362
  transactionHelper = this.getTransactionHelper();
@@ -341,7 +365,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
341
365
 
342
366
  mParameters.internalModelContext = mParameters.controlId ? (_sap$ui$getCore$byId = sap.ui.getCore().byId(mParameters.controlId)) === null || _sap$ui$getCore$byId === void 0 ? void 0 : _sap$ui$getCore$byId.getBindingContext("internal") : null;
343
367
  return this.syncTask().then(transactionHelper.deleteDocument.bind(transactionHelper, oContext, mParameters, oResourceBundle, this.getMessageHandler())).then(function () {
344
- var internalModel = _this4.getInternalModel();
368
+ var internalModel = _this5.getInternalModel();
345
369
 
346
370
  internalModel.setProperty("/sessionOn", false);
347
371
  internalModel.setProperty("/stickySessionToken", undefined);
@@ -353,12 +377,12 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
353
377
  * Handles the create event: shows messages and in case of a draft, updates the draft indicator.
354
378
  *
355
379
  * @memberof sap.fe.core.controllerextensions.EditFlow
356
- * @param {object} oBinding OData list binding object
380
+ * @param oBinding OData list binding object
357
381
  */
358
382
  ;
359
383
 
360
384
  _proto.handleCreateEvents = function handleCreateEvents(oBinding) {
361
- var _this5 = this;
385
+ var _this6 = this;
362
386
 
363
387
  var transactionHelper = this.getTransactionHelper();
364
388
  this.setDraftStatus(DraftStatus.Clear);
@@ -368,17 +392,17 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
368
392
  transactionHelper.handleDocumentModifications();
369
393
 
370
394
  if (sProgrammingModel === ProgrammingModel.Draft) {
371
- _this5.setDraftStatus(DraftStatus.Saving);
395
+ _this6.setDraftStatus(DraftStatus.Saving);
372
396
  }
373
397
  });
374
398
  oBinding.attachEvent("createCompleted", function (oEvent) {
375
399
  var bSuccess = oEvent.getParameter("success");
376
400
 
377
401
  if (sProgrammingModel === ProgrammingModel.Draft) {
378
- _this5.setDraftStatus(bSuccess ? DraftStatus.Saved : DraftStatus.Clear);
402
+ _this6.setDraftStatus(bSuccess ? DraftStatus.Saved : DraftStatus.Clear);
379
403
  }
380
404
 
381
- _this5.getMessageHandler().showMessageDialog();
405
+ _this6.getMessageHandler().showMessageDialog();
382
406
  });
383
407
  };
384
408
 
@@ -396,16 +420,16 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
396
420
  }
397
421
  /**
398
422
  * Creates a new promise to wait for an action to be executed
423
+ *
399
424
  * @function
400
425
  * @name _createActionPromise
401
426
  * @memberof sap.fe.core.controllerextensions.EditFlow
402
- *
403
427
  * @returns {Function} The resolver function which can be used to externally resolve the promise
404
428
  */
405
429
  ;
406
430
 
407
431
  _proto.createActionPromise = function createActionPromise(sActionName, sControlId) {
408
- var _this6 = this;
432
+ var _this7 = this;
409
433
 
410
434
  var fResolver, fRejector;
411
435
  this.oActionPromise = new Promise(function (resolve, reject) {
@@ -414,7 +438,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
414
438
  }).then(function (oResponse) {
415
439
  return Object.assign({
416
440
  controlId: sControlId
417
- }, _this6.getActionResponseDataAndKeys(sActionName, oResponse));
441
+ }, _this7.getActionResponseDataAndKeys(sActionName, oResponse));
418
442
  });
419
443
  return {
420
444
  fResolver: fResolver,
@@ -427,8 +451,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
427
451
  * @function
428
452
  * @name _getCurrentActionPromise
429
453
  * @memberof sap.fe.core.controllerextensions.EditFlow
430
- *
431
- * @returns {Promise} Returns the promise
454
+ * @returns Returns the promise
432
455
  */
433
456
  ;
434
457
 
@@ -443,9 +466,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
443
466
  * @function
444
467
  * @name getActionResponseDataAndKeys
445
468
  * @memberof sap.fe.core.controllerextensions.EditFlow
446
- * @param {string} sActionName The name of the action that is executed
447
- * @param {object} oResponse The bound action's response data or response context
448
- * @returns {object} Object with data and names of the key fields of the response
469
+ * @param sActionName The name of the action that is executed
470
+ * @param oResponse The bound action's response data or response context
471
+ * @returns Object with data and names of the key fields of the response
449
472
  */
450
473
  ;
451
474
 
@@ -560,7 +583,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
560
583
  }
561
584
  /**
562
585
  * @description Method to display a 'discard' popover when exiting a sticky session.
563
- *
564
586
  * @function
565
587
  * @name onBackNavigationInSession
566
588
  * @memberof sap.fe.core.controllerextensions.InternalEditFlow
@@ -568,7 +590,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
568
590
  ;
569
591
 
570
592
  _proto.onBackNavigationInSession = function onBackNavigationInSession() {
571
- var _this7 = this;
593
+ var _this8 = this;
572
594
 
573
595
  var oView = this.getView(),
574
596
  oAppComponent = CommonUtils.getAppComponent(oView),
@@ -577,7 +599,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
577
599
  if (oRouterProxy.checkIfBackIsOutOfGuard()) {
578
600
  var oBindingContext = oView && oView.getBindingContext();
579
601
  sticky.processDataLossConfirmation(function () {
580
- _this7.discardStickySession(oBindingContext);
602
+ _this8.discardStickySession(oBindingContext);
581
603
 
582
604
  history.back();
583
605
  }, oView, this.getProgrammingModel(oBindingContext));
@@ -600,7 +622,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
600
622
 
601
623
  var oMetaModel = oView.getModel().getMetaModel(),
602
624
  sMetaPath = oContext.getPath().substring(0, oContext.getPath().indexOf("(")),
603
- oStickySession = oMetaModel.getObject(sMetaPath + "@com.sap.vocabularies.Session.v1.StickySessionSupported");
625
+ oStickySession = oMetaModel.getObject("".concat(sMetaPath, "@com.sap.vocabularies.Session.v1.StickySessionSupported"));
604
626
 
605
627
  if (oStickySession && oStickySession.NewAction && oStickySession.NewAction === sCustomAction) {
606
628
  return true;
@@ -673,15 +695,17 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
673
695
  };
674
696
 
675
697
  _proto._attachSessionTimeout = function _attachSessionTimeout(oContext, i18nModel) {
676
- var that = this;
677
- return function fnHandleSessionTimeout() {
698
+ var _this9 = this;
699
+
700
+ return function () {
678
701
  try {
679
702
  if (oContext === undefined) {
680
703
  throw new Error("Context missing for function fnHandleSessionTimeout");
681
704
  } // remove transient messages since we will showing our own message
682
705
 
683
706
 
684
- that.getMessageHandler().removeTransitionMessages();
707
+ _this9.getMessageHandler().removeTransitionMessages();
708
+
685
709
  var oDialog = new Dialog({
686
710
  title: "{sap.fe.i18n>C_EDITFLOW_OBJECT_PAGE_SESSION_EXPIRED_DIALOG_TITLE}",
687
711
  state: "Warning",
@@ -693,8 +717,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
693
717
  type: "Emphasized",
694
718
  press: function () {
695
719
  // remove sticky handling after navigation since session has already been terminated
696
- that.handleStickyOff();
697
- that.getRoutingListener().navigateBackFromContext(oContext);
720
+ _this9.handleStickyOff();
721
+
722
+ _this9.getRoutingListener().navigateBackFromContext(oContext);
698
723
  }
699
724
  }),
700
725
  afterClose: function () {
@@ -703,7 +728,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
703
728
  });
704
729
  oDialog.addStyleClass("sapUiContentPadding");
705
730
  oDialog.setModel(i18nModel, "sap.fe.i18n");
706
- that.getView().addDependent(oDialog);
731
+
732
+ _this9.getView().addDependent(oDialog);
733
+
707
734
  oDialog.open();
708
735
  } catch (error) {
709
736
  Log.info(error);
@@ -740,4 +767,4 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
740
767
  }(ControllerExtension), (_applyDecoratedDescriptor(_class2.prototype, "onInit", [_dec2], Object.getOwnPropertyDescriptor(_class2.prototype, "onInit"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "setCreationMode", [_dec3, _dec4], Object.getOwnPropertyDescriptor(_class2.prototype, "setCreationMode"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "createMultipleDocuments", [_dec5, _dec6], Object.getOwnPropertyDescriptor(_class2.prototype, "createMultipleDocuments"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "deleteMultipleDocuments", [_dec7, _dec8], Object.getOwnPropertyDescriptor(_class2.prototype, "deleteMultipleDocuments"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "computeEditMode", [_dec9, _dec10], Object.getOwnPropertyDescriptor(_class2.prototype, "computeEditMode"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "setEditMode", [_dec11, _dec12], Object.getOwnPropertyDescriptor(_class2.prototype, "setEditMode"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "setDraftStatus", [_dec13, _dec14], Object.getOwnPropertyDescriptor(_class2.prototype, "setDraftStatus"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "getRoutingListener", [_dec15, _dec16], Object.getOwnPropertyDescriptor(_class2.prototype, "getRoutingListener"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "getGlobalUIModel", [_dec17, _dec18], Object.getOwnPropertyDescriptor(_class2.prototype, "getGlobalUIModel"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "syncTask", [_dec19, _dec20], Object.getOwnPropertyDescriptor(_class2.prototype, "syncTask"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "getProgrammingModel", [_dec21, _dec22], Object.getOwnPropertyDescriptor(_class2.prototype, "getProgrammingModel"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "deleteDocumentTransaction", [_dec23, _dec24], Object.getOwnPropertyDescriptor(_class2.prototype, "deleteDocumentTransaction"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "handleCreateEvents", [_dec25, _dec26], Object.getOwnPropertyDescriptor(_class2.prototype, "handleCreateEvents"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "getTransactionHelper", [_dec27, _dec28], Object.getOwnPropertyDescriptor(_class2.prototype, "getTransactionHelper"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "getInternalModel", [_dec29, _dec30], Object.getOwnPropertyDescriptor(_class2.prototype, "getInternalModel"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "createActionPromise", [_dec31, _dec32], Object.getOwnPropertyDescriptor(_class2.prototype, "createActionPromise"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "getCurrentActionPromise", [_dec33, _dec34], Object.getOwnPropertyDescriptor(_class2.prototype, "getCurrentActionPromise"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "deleteCurrentActionPromise", [_dec35, _dec36], Object.getOwnPropertyDescriptor(_class2.prototype, "deleteCurrentActionPromise"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "getActionResponseDataAndKeys", [_dec37, _dec38], Object.getOwnPropertyDescriptor(_class2.prototype, "getActionResponseDataAndKeys"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "getMessageHandler", [_dec39, _dec40], Object.getOwnPropertyDescriptor(_class2.prototype, "getMessageHandler"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "handleStickyOn", [_dec41, _dec42], Object.getOwnPropertyDescriptor(_class2.prototype, "handleStickyOn"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "handleStickyOff", [_dec43, _dec44], Object.getOwnPropertyDescriptor(_class2.prototype, "handleStickyOff"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBackNavigationInSession", [_dec45, _dec46], Object.getOwnPropertyDescriptor(_class2.prototype, "onBackNavigationInSession"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "discardStickySession", [_dec47, _dec48], Object.getOwnPropertyDescriptor(_class2.prototype, "discardStickySession"), _class2.prototype)), _class2)) || _class);
741
768
  return InternalEditFlow;
742
769
  }, false);
743
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkludGVybmFsRWRpdEZsb3cudHMiXSwibmFtZXMiOlsiUHJvZ3JhbW1pbmdNb2RlbCIsIkZFTGlicmFyeSIsIkRyYWZ0U3RhdHVzIiwiRWRpdE1vZGUiLCJDcmVhdGlvbk1vZGUiLCJJbnRlcm5hbEVkaXRGbG93IiwiZGVmaW5lVUk1Q2xhc3MiLCJtZXRob2RPdmVycmlkZSIsInByaXZhdGVFeHRlbnNpb24iLCJleHRlbnNpYmxlIiwiT3ZlcnJpZGVFeGVjdXRpb24iLCJBZnRlciIsInB1YmxpY0V4dGVuc2lvbiIsImZpbmFsRXh0ZW5zaW9uIiwib25Jbml0IiwiX29BcHBDb21wb25lbnQiLCJiYXNlIiwiZ2V0QXBwQ29tcG9uZW50Iiwic2V0Q3JlYXRpb25Nb2RlIiwiYkNyZWF0aW9uTW9kZSIsImNyZWF0ZU11bHRpcGxlRG9jdW1lbnRzIiwib0xpc3RCaW5kaW5nIiwiYURhdGEiLCJiQ3JlYXRlQXRFbmQiLCJiRnJvbUNvcHlQYXN0ZSIsImJlZm9yZUNyZWF0ZUNhbGxCYWNrIiwiYkluYWN0aXZlIiwidHJhbnNhY3Rpb25IZWxwZXIiLCJnZXRUcmFuc2FjdGlvbkhlbHBlciIsIm9Mb2NrT2JqZWN0IiwiZ2V0R2xvYmFsVUlNb2RlbCIsIm9SZXNvdXJjZUJ1bmRsZSIsImdldFZpZXciLCJnZXRDb250cm9sbGVyIiwiQnVzeUxvY2tlciIsImxvY2siLCJhRmluYWxDb250ZXh0cyIsInN5bmNUYXNrIiwidGhlbiIsIm9uQmVmb3JlQ3JlYXRlUHJvbWlzZSIsImNvbnRleHRQYXRoIiwiZ2V0UGF0aCIsIlByb21pc2UiLCJyZXNvbHZlIiwib01vZGVsIiwiZ2V0TW9kZWwiLCJvTWV0YU1vZGVsIiwiZ2V0TWV0YU1vZGVsIiwic01ldGFQYXRoIiwiZ2V0Q29udGV4dCIsImdldE1ldGFQYXRoIiwiaGFuZGxlQ3JlYXRlRXZlbnRzIiwiYUNyZWF0aW9uUHJvbWlzZXMiLCJtYXAiLCJtUHJvcGVydHlWYWx1ZXMiLCJtUGFyYW1ldGVycyIsImRhdGEiLCJrZWVwVHJhbnNpZW50Q29udGV4dE9uRmFpbGVkIiwiYnVzeU1vZGUiLCJjcmVhdGlvbk1vZGUiLCJDcmVhdGlvblJvdyIsInBhcmVudENvbnRyb2wiLCJjcmVhdGVBdEVuZCIsImluYWN0aXZlIiwic1Byb3BlcnR5UGF0aCIsIm9Qcm9wZXJ0eSIsImdldE9iamVjdCIsIiRraW5kIiwiY3JlYXRlRG9jdW1lbnQiLCJnZXRNZXNzYWdlSGFuZGxlciIsImFsbCIsImFDb250ZXh0cyIsIm9OZXdDb250ZXh0IiwiY3JlYXRlZCIsIm9CaW5kaW5nQ29udGV4dCIsImdldEJpbmRpbmdDb250ZXh0IiwiQ29tbW9uVXRpbHMiLCJoYXNUcmFuc2llbnRDb250ZXh0IiwiZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlIiwicmVxdWVzdFNpZGVFZmZlY3RzRm9yTmF2aWdhdGlvblByb3BlcnR5IiwiY2F0Y2giLCJlcnIiLCJMb2ciLCJlcnJvciIsInJlamVjdCIsImZpbmFsbHkiLCJ1bmxvY2siLCJkZWxldGVNdWx0aXBsZURvY3VtZW50cyIsIm9Sb3V0aW5nTGlzdGVuZXIiLCJnZXRSb3V0aW5nTGlzdGVuZXIiLCJvVGFibGUiLCJieUlkIiwiY29udHJvbElkIiwiaXNBIiwiRXJyb3IiLCJnZXRSb3dCaW5kaW5nIiwiYkZpbmRBY3RpdmVDb250ZXh0cyIsImRlbGV0ZURvY3VtZW50VHJhbnNhY3Rpb24iLCJvUmVzdWx0IiwiY2xlYXJTZWxlY3Rpb24iLCJpc1Jvb3QiLCJhdHRhY2hFdmVudE9uY2UiLCJyZWZyZXNoIiwiRWRpdFN0YXRlIiwic2V0RWRpdFN0YXRlRGlydHkiLCJzZW5kIiwiQWN0aXZpdHkiLCJEZWxldGUiLCJjb250ZXh0IiwiaW5kZXgiLCJsZW5ndGgiLCJpc0N1cnJlbnRTdGF0ZUltcGFjdGVkQnkiLCJuYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dCIsIm9FcnJvciIsImNvbXB1dGVFZGl0TW9kZSIsIm9Db250ZXh0Iiwic0N1c3RvbUFjdGlvbiIsImdldEludGVybmFsTW9kZWwiLCJnZXRQcm9wZXJ0eSIsInNQcm9ncmFtbWluZ01vZGVsIiwiZ2V0UHJvZ3JhbW1pbmdNb2RlbCIsIkRyYWZ0Iiwic2V0RHJhZnRTdGF0dXMiLCJDbGVhciIsInJlcXVlc3RPYmplY3QiLCJiSXNBY3RpdmVFbnRpdHkiLCJzZXRFZGl0TW9kZSIsIkVkaXRhYmxlIiwiYkhhc0FjdGl2ZUVudGl0eSIsInVuZGVmaW5lZCIsIkRpc3BsYXkiLCJTdGlja3kiLCJfaGFzTmV3QWN0aW9uRm9yU3RpY2t5IiwiX2JDcmVhdGVNb2RlIiwiaGFuZGxlRG9jdW1lbnRNb2RpZmljYXRpb25zIiwiaGFuZGxlU3RpY2t5T24iLCJzZXRQcm9wZXJ0eSIsInNFZGl0TW9kZSIsIm9HbG9iYWxNb2RlbCIsInNEcmFmdFN0YXRlIiwiX3JvdXRpbmciLCJ2VGFzayIsImZuTmV3VGFzayIsIl9wVGFza3MiLCJpbnRlcm5hbE1vZGVsQ29udGV4dCIsInNhcCIsInVpIiwiZ2V0Q29yZSIsImRlbGV0ZURvY3VtZW50IiwiYmluZCIsImludGVybmFsTW9kZWwiLCJvQmluZGluZyIsImdldEJpbmRpbmciLCJhdHRhY2hFdmVudCIsIlNhdmluZyIsIm9FdmVudCIsImJTdWNjZXNzIiwiZ2V0UGFyYW1ldGVyIiwiU2F2ZWQiLCJzaG93TWVzc2FnZURpYWxvZyIsIl9vVHJhbnNhY3Rpb25IZWxwZXIiLCJUcmFuc2FjdGlvbkhlbHBlciIsImNyZWF0ZUFjdGlvblByb21pc2UiLCJzQWN0aW9uTmFtZSIsInNDb250cm9sSWQiLCJmUmVzb2x2ZXIiLCJmUmVqZWN0b3IiLCJvQWN0aW9uUHJvbWlzZSIsIm9SZXNwb25zZSIsIk9iamVjdCIsImFzc2lnbiIsImdldEFjdGlvblJlc3BvbnNlRGF0YUFuZEtleXMiLCJnZXRDdXJyZW50QWN0aW9uUHJvbWlzZSIsImRlbGV0ZUN1cnJlbnRBY3Rpb25Qcm9taXNlIiwiQXJyYXkiLCJpc0FycmF5Iiwib1ZpZXciLCJnZXREYXRhIiwic0FjdGlvblJldHVyblR5cGUiLCIkUmV0dXJuVHlwZSIsIiRUeXBlIiwiYUtleSIsIiRLZXkiLCJvRGF0YSIsImtleXMiLCJtZXNzYWdlSGFuZGxlciIsIm9BcHBDb21wb25lbnQiLCJnZXRSb3V0ZXJQcm94eSIsImhhc05hdmlnYXRpb25HdWFyZCIsInNIYXNoVHJhY2tlciIsImdldEhhc2giLCJvSW50ZXJuYWxNb2RlbCIsInNldFRpbWVvdXQiLCJzZXROYXZpZ2F0aW9uR3VhcmQiLCJzdWJzdHJpbmciLCJnZXRTaGVsbFNlcnZpY2VzIiwic2V0QmFja05hdmlnYXRpb24iLCJvbkJhY2tOYXZpZ2F0aW9uSW5TZXNzaW9uIiwiZm5EaXJ0eVN0YXRlUHJvdmlkZXIiLCJfcmVnaXN0ZXJEaXJ0eVN0YXRlUHJvdmlkZXIiLCJyZWdpc3RlckRpcnR5U3RhdGVQcm92aWRlciIsImkxOG5Nb2RlbCIsImZuSGFuZGxlU2Vzc2lvblRpbWVvdXQiLCJfYXR0YWNoU2Vzc2lvblRpbWVvdXQiLCJhdHRhY2hTZXNzaW9uVGltZW91dCIsImZuU3RpY2t5RGlzY2FyZEFmdGVyTmF2aWdhdGlvbiIsIl9hdHRhY2hSb3V0ZU1hdGNoZWQiLCJnZXRSb3V0aW5nU2VydmljZSIsImF0dGFjaFJvdXRlTWF0Y2hlZCIsImluZm8iLCJoYW5kbGVTdGlja3lPZmYiLCJkaXNjYXJkTmF2aWdhdGlvbkd1YXJkIiwiZGVyZWdpc3RlckRpcnR5U3RhdGVQcm92aWRlciIsImRldGFjaFNlc3Npb25UaW1lb3V0IiwiZGV0YWNoUm91dGVNYXRjaGVkIiwib1JvdXRlclByb3h5IiwiY2hlY2tJZkJhY2tJc091dE9mR3VhcmQiLCJzdGlja3kiLCJwcm9jZXNzRGF0YUxvc3NDb25maXJtYXRpb24iLCJkaXNjYXJkU3RpY2t5U2Vzc2lvbiIsImhpc3RvcnkiLCJiYWNrIiwiZGlzY2FyZERvY3VtZW50IiwiaW5kZXhPZiIsIm9TdGlja3lTZXNzaW9uIiwiTmV3QWN0aW9uIiwiQWRkaXRpb25hbE5ld0FjdGlvbnMiLCJmaW5kIiwic0FkZGl0aW9uYWxBY3Rpb24iLCJvTmF2aWdhdGlvbkNvbnRleHQiLCJzVGFyZ2V0SGFzaCIsImlubmVyQXBwUm91dGUiLCJzTGNsSGFzaFRyYWNrZXIiLCJiRGlydHkiLCJiU2Vzc2lvbk9OIiwiaXNOYXZpZ2F0aW9uRmluYWxpemVkIiwiY2hlY2tIYXNoV2l0aEd1YXJkIiwiaXNHdWFyZENyb3NzQWxsb3dlZEJ5VXNlciIsInNldERpcnR5RmxhZyIsInRoYXQiLCJyZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMiLCJvRGlhbG9nIiwiRGlhbG9nIiwidGl0bGUiLCJzdGF0ZSIsImNvbnRlbnQiLCJUZXh0IiwidGV4dCIsImJlZ2luQnV0dG9uIiwiQnV0dG9uIiwidHlwZSIsInByZXNzIiwiYWZ0ZXJDbG9zZSIsImRlc3Ryb3kiLCJhZGRTdHlsZUNsYXNzIiwic2V0TW9kZWwiLCJhZGREZXBlbmRlbnQiLCJvcGVuIiwib0ZuQ29udGV4dCIsInNDdXJyZW50SGFzaCIsInNjcm9sbEFuZEZvY3VzT25JbmFjdGl2ZVJvdyIsIm9Sb3dCaW5kaW5nIiwiaUFjdGl2ZVJvd0luZGV4IiwiZ2V0Q291bnQiLCJzY3JvbGxUb0luZGV4IiwiZm9jdXNSb3ciLCJDb250cm9sbGVyRXh0ZW5zaW9uIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUE2QkEsTUFBTUEsZ0JBQWdCLEdBQUdDLFNBQVMsQ0FBQ0QsZ0JBQW5DO0FBQUEsTUFDQ0UsV0FBVyxHQUFHRCxTQUFTLENBQUNDLFdBRHpCO0FBQUEsTUFFQ0MsUUFBUSxHQUFHRixTQUFTLENBQUNFLFFBRnRCO0FBQUEsTUFHQ0MsWUFBWSxHQUFHSCxTQUFTLENBQUNHLFlBSDFCO01BTU1DLGdCLFdBRExDLGNBQWMsQ0FBQyxtREFBRCxDLFVBVWJDLGNBQWMsRSxVQWFkQyxnQkFBZ0IsRSxVQUNoQkMsVUFBVSxDQUFDQyxpQkFBaUIsQ0FBQ0MsS0FBbkIsQyxVQUtWQyxlQUFlLEUsVUFDZkMsY0FBYyxFLFVBb0dkRCxlQUFlLEUsVUFDZkMsY0FBYyxFLFVBOEVkRCxlQUFlLEUsV0FDZkMsY0FBYyxFLFdBZ0RkRCxlQUFlLEUsV0FDZkMsY0FBYyxFLFdBaUJk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QyxjQUFkLEdBQStCaUQsa0JBQS9CLENBQWtEdUIsWUFBbEQsQ0FBdEIsRUFBdUY7QUFDdEZELFVBQUFBLFVBQVUsQ0FBQ3ZDLG9CQUFYLENBQWdDeEcsUUFBaEM7QUFDQTtBQUNELE9BTkQ7QUFPQSxLOztXQUNEaUosMkIsR0FBQSxxQ0FBNEIxSyxNQUE1QixFQUEyQztBQUMxQyxVQUFNMkssV0FBVyxHQUFHM0ssTUFBTSxDQUFDSyxhQUFQLEVBQXBCO0FBQ0EsVUFBTXVLLGVBQWUsR0FBR0QsV0FBVyxDQUFDRSxRQUFaLE1BQTBCLENBQWxEOztBQUNBLFVBQUlELGVBQWUsR0FBRyxDQUF0QixFQUF5QjtBQUN4QjVLLFFBQUFBLE1BQU0sQ0FBQzhLLGFBQVAsQ0FBcUJGLGVBQWUsR0FBRyxDQUF2QztBQUNBNUssUUFBQUEsTUFBTSxDQUFDK0ssUUFBUCxDQUFnQkgsZUFBaEIsRUFBaUMsSUFBakM7QUFDQSxPQUhELE1BR087QUFDTjVLLFFBQUFBLE1BQU0sQ0FBQytLLFFBQVAsQ0FBZ0JILGVBQWhCLEVBQWlDLElBQWpDO0FBQ0E7QUFDRCxLOzs7SUF4d0I2QkksbUI7U0Eyd0JoQnJRLGdCIiwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCBBcHBDb21wb25lbnQgZnJvbSBcInNhcC9mZS9jb3JlL0FwcENvbXBvbmVudFwiO1xuaW1wb3J0IENvbW1vblV0aWxzIGZyb20gXCJzYXAvZmUvY29yZS9Db21tb25VdGlsc1wiO1xuaW1wb3J0IEJ1c3lMb2NrZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL0J1c3lMb2NrZXJcIjtcbmltcG9ydCB7IHNlbmQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvY29sbGFib3JhdGlvbi9BY3Rpdml0eVN5bmNcIjtcbmltcG9ydCB7IEFjdGl2aXR5IH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2NvbGxhYm9yYXRpb24vQ29sbGFib3JhdGlvbkNvbW1vblwiO1xuaW1wb3J0IHN0aWNreSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvZWRpdEZsb3cvc3RpY2t5XCI7XG5pbXBvcnQgVHJhbnNhY3Rpb25IZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2VkaXRGbG93L1RyYW5zYWN0aW9uSGVscGVyXCI7XG5pbXBvcnQge1xuXHRkZWZpbmVVSTVDbGFzcyxcblx0ZXh0ZW5zaWJsZSxcblx0ZmluYWxFeHRlbnNpb24sXG5cdG1ldGhvZE92ZXJyaWRlLFxuXHRwcml2YXRlRXh0ZW5zaW9uLFxuXHRwdWJsaWNFeHRlbnNpb25cbn0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvQ2xhc3NTdXBwb3J0XCI7XG5pbXBvcnQgRWRpdFN0YXRlIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0VkaXRTdGF0ZVwiO1xuaW1wb3J0IEZFTGlicmFyeSBmcm9tIFwic2FwL2ZlL2NvcmUvbGlicmFyeVwiO1xuaW1wb3J0IFBhZ2VDb250cm9sbGVyIGZyb20gXCJzYXAvZmUvY29yZS9QYWdlQ29udHJvbGxlclwiO1xuaW1wb3J0IEJ1dHRvbiBmcm9tIFwic2FwL20vQnV0dG9uXCI7XG5pbXBvcnQgRGlhbG9nIGZyb20gXCJzYXAvbS9EaWFsb2dcIjtcbmltcG9ydCBUZXh0IGZyb20gXCJzYXAvbS9UZXh0XCI7XG5pbXBvcnQgQ29udHJvbGxlckV4dGVuc2lvbiBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL0NvbnRyb2xsZXJFeHRlbnNpb25cIjtcbmltcG9ydCBPdmVycmlkZUV4ZWN1dGlvbiBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL092ZXJyaWRlRXhlY3V0aW9uXCI7XG5pbXBvcnQgVmlldyBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL1ZpZXdcIjtcbmltcG9ydCBUYWJsZSBmcm9tIFwic2FwL3VpL21kYy9UYWJsZVwiO1xuaW1wb3J0IEpTT05Nb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL2pzb24vSlNPTk1vZGVsXCI7XG5pbXBvcnQgTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9Nb2RlbFwiO1xuaW1wb3J0IENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgT0RhdGFMaXN0QmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTGlzdEJpbmRpbmdcIjtcblxuY29uc3QgUHJvZ3JhbW1pbmdNb2RlbCA9IEZFTGlicmFyeS5Qcm9ncmFtbWluZ01vZGVsLFxuXHREcmFmdFN0YXR1cyA9IEZFTGlicmFyeS5EcmFmdFN0YXR1cyxcblx0RWRpdE1vZGUgPSBGRUxpYnJhcnkuRWRpdE1vZGUsXG5cdENyZWF0aW9uTW9kZSA9IEZFTGlicmFyeS5DcmVhdGlvbk1vZGU7XG5cbkBkZWZpbmVVSTVDbGFzcyhcInNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkludGVybmFsRWRpdEZsb3dcIilcbmNsYXNzIEludGVybmFsRWRpdEZsb3cgZXh0ZW5kcyBDb250cm9sbGVyRXh0ZW5zaW9uIHtcblx0cHJvdGVjdGVkIGJhc2UhOiBQYWdlQ29udHJvbGxlcjtcblx0cHJpdmF0ZSBfb0FwcENvbXBvbmVudCE6IEFwcENvbXBvbmVudDtcblx0cHJpdmF0ZSBfcFRhc2tzOiBhbnk7XG5cdHByaXZhdGUgb0FjdGlvblByb21pc2U/OiBQcm9taXNlPGFueT47XG5cdHByaXZhdGUgX29UcmFuc2FjdGlvbkhlbHBlcj86IFRyYW5zYWN0aW9uSGVscGVyO1xuXHRwcml2YXRlIGZuRGlydHlTdGF0ZVByb3ZpZGVyPzogRnVuY3Rpb247XG5cdHByaXZhdGUgZm5IYW5kbGVTZXNzaW9uVGltZW91dD86IEZ1bmN0aW9uO1xuXHRwcml2YXRlIGZuU3RpY2t5RGlzY2FyZEFmdGVyTmF2aWdhdGlvbj86IEZ1bmN0aW9uO1xuXHRAbWV0aG9kT3ZlcnJpZGUoKVxuXHRvbkluaXQoKSB7XG5cdFx0dGhpcy5fb0FwcENvbXBvbmVudCA9IHRoaXMuYmFzZS5nZXRBcHBDb21wb25lbnQoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBPdmVycmlkZSB0byBzZXQgdGhlIGNyZWF0aW9uIG1vZGUuXG5cdCAqXG5cdCAqIEBwYXJhbSBiQ3JlYXRpb25Nb2RlXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5JbnRlcm5hbEVkaXRGbG93XG5cdCAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5JbnRlcm5hbEVkaXRGbG93I3NldENyZWF0aW9uTW9kZVxuXHQgKiBAc2luY2UgMS45MC4wXG5cdCAqL1xuXHRAcHJpdmF0ZUV4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5cdHNldENyZWF0aW9uTW9kZShiQ3JlYXRpb25Nb2RlOiBib29sZWFuKSB7XG5cdFx0Ly8gdG8gYmUgb3ZlcnJpZGRlblxuXHR9XG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRjcmVhdGVNdWx0aXBsZURvY3VtZW50cyhcblx0XHRvTGlzdEJpbmRpbmc6IGFueSxcblx0XHRhRGF0YTogYW55LFxuXHRcdGJDcmVhdGVBdEVuZDogYW55LFxuXHRcdGJGcm9tQ29weVBhc3RlOiBib29sZWFuLFxuXHRcdGJlZm9yZUNyZWF0ZUNhbGxCYWNrOiBhbnksXG5cdFx0YkluYWN0aXZlPzogYm9vbGVhblxuXHQpIHtcblx0XHRjb25zdCB0cmFuc2FjdGlvbkhlbHBlciA9IHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKSxcblx0XHRcdG9Mb2NrT2JqZWN0ID0gdGhpcy5nZXRHbG9iYWxVSU1vZGVsKCksXG5cdFx0XHRvUmVzb3VyY2VCdW5kbGUgPSAodGhpcy5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIGFueSkub1Jlc291cmNlQnVuZGxlO1xuXG5cdFx0QnVzeUxvY2tlci5sb2NrKG9Mb2NrT2JqZWN0KTtcblx0XHRsZXQgYUZpbmFsQ29udGV4dHM6IGFueVtdID0gW107XG5cdFx0cmV0dXJuIHRoaXMuc3luY1Rhc2soKVxuXHRcdFx0LnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRjb25zdCBvbkJlZm9yZUNyZWF0ZVByb21pc2UgPSBiZWZvcmVDcmVhdGVDYWxsQmFja1xuXHRcdFx0XHRcdD8gYmVmb3JlQ3JlYXRlQ2FsbEJhY2soeyBjb250ZXh0UGF0aDogb0xpc3RCaW5kaW5nICYmIG9MaXN0QmluZGluZy5nZXRQYXRoKCkgfSlcblx0XHRcdFx0XHQ6IFByb21pc2UucmVzb2x2ZSgpO1xuXHRcdFx0XHRyZXR1cm4gb25CZWZvcmVDcmVhdGVQcm9taXNlO1xuXHRcdFx0fSlcblx0XHRcdC50aGVuKCgpID0+IHtcblx0XHRcdFx0Y29uc3Qgb01vZGVsID0gb0xpc3RCaW5kaW5nLmdldE1vZGVsKCksXG5cdFx0XHRcdFx0b01ldGFNb2RlbCA9IG9Nb2RlbC5nZXRNZXRhTW9kZWwoKTtcblx0XHRcdFx0bGV0IHNNZXRhUGF0aDogc3RyaW5nO1xuXG5cdFx0XHRcdGlmIChvTGlzdEJpbmRpbmcuZ2V0Q29udGV4dCgpKSB7XG5cdFx0XHRcdFx0c01ldGFQYXRoID0gb01ldGFNb2RlbC5nZXRNZXRhUGF0aChvTGlzdEJpbmRpbmcuZ2V0Q29udGV4dCgpLmdldFBhdGgoKSArIFwiL1wiICsgb0xpc3RCaW5kaW5nLmdldFBhdGgoKSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0c01ldGFQYXRoID0gb01ldGFNb2RlbC5nZXRNZXRhUGF0aChvTGlzdEJpbmRpbmcuZ2V0UGF0aCgpKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRoaXMuaGFuZGxlQ3JlYXRlRXZlbnRzKG9MaXN0QmluZGluZyk7XG5cblx0XHRcdFx0Ly8gSXRlcmF0ZSBvbiBhbGwgaXRlbXMgYW5kIHN0b3JlIHRoZSBjb3JyZXNwb25kaW5nIGNyZWF0aW9uIHByb21pc2Vcblx0XHRcdFx0Y29uc3QgYUNyZWF0aW9uUHJvbWlzZXMgPSBhRGF0YS5tYXAoKG1Qcm9wZXJ0eVZhbHVlczogYW55KSA9PiB7XG5cdFx0XHRcdFx0Y29uc3QgbVBhcmFtZXRlcnM6IGFueSA9IHsgZGF0YToge30gfTtcblxuXHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmtlZXBUcmFuc2llbnRDb250ZXh0T25GYWlsZWQgPSBmYWxzZTsgLy8gY3VycmVudGx5IG5vdCBmdWxseSBzdXBwb3J0ZWRcblx0XHRcdFx0XHRtUGFyYW1ldGVycy5idXN5TW9kZSA9IFwiTm9uZVwiO1xuXHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSA9IENyZWF0aW9uTW9kZS5DcmVhdGlvblJvdztcblx0XHRcdFx0XHRtUGFyYW1ldGVycy5wYXJlbnRDb250cm9sID0gdGhpcy5nZXRWaWV3KCk7XG5cdFx0XHRcdFx0bVBhcmFtZXRlcnMuY3JlYXRlQXRFbmQgPSBiQ3JlYXRlQXRFbmQ7XG5cdFx0XHRcdFx0bVBhcmFtZXRlcnMuaW5hY3RpdmUgPSBiSW5hY3RpdmU7XG5cblx0XHRcdFx0XHQvLyBSZW1vdmUgbmF2aWdhdGlvbiBwcm9wZXJ0aWVzIGFzIHdlIGRvbid0IHN1cHBvcnQgZGVlcCBjcmVhdGVcblx0XHRcdFx0XHRmb3IgKGNvbnN0IHNQcm9wZXJ0eVBhdGggaW4gbVByb3BlcnR5VmFsdWVzKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBvUHJvcGVydHkgPSBvTWV0YU1vZGVsLmdldE9iamVjdChzTWV0YVBhdGggKyBcIi9cIiArIHNQcm9wZXJ0eVBhdGgpO1xuXHRcdFx0XHRcdFx0aWYgKG9Qcm9wZXJ0eSAmJiBvUHJvcGVydHkuJGtpbmQgIT09IFwiTmF2aWdhdGlvblByb3BlcnR5XCIgJiYgbVByb3BlcnR5VmFsdWVzW3NQcm9wZXJ0eVBhdGhdKSB7XG5cdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmRhdGFbc1Byb3BlcnR5UGF0aF0gPSBtUHJvcGVydHlWYWx1ZXNbc1Byb3BlcnR5UGF0aF07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0cmV0dXJuIHRyYW5zYWN0aW9uSGVscGVyLmNyZWF0ZURvY3VtZW50KFxuXHRcdFx0XHRcdFx0b0xpc3RCaW5kaW5nLFxuXHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMsXG5cdFx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGUsXG5cdFx0XHRcdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCksXG5cdFx0XHRcdFx0XHRiRnJvbUNvcHlQYXN0ZSxcblx0XHRcdFx0XHRcdHRoaXMuZ2V0VmlldygpXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0cmV0dXJuIFByb21pc2UuYWxsKGFDcmVhdGlvblByb21pc2VzKTtcblx0XHRcdH0pXG5cdFx0XHQudGhlbihmdW5jdGlvbiAoYUNvbnRleHRzOiBhbnkpIHtcblx0XHRcdFx0Ly8gdHJhbnNpZW50IGNvbnRleHRzIGFyZSByZWxpYWJseSByZW1vdmVkIG9uY2Ugb05ld0NvbnRleHQuY3JlYXRlZCgpIGlzIHJlc29sdmVkXG5cdFx0XHRcdGFGaW5hbENvbnRleHRzID0gYUNvbnRleHRzO1xuXHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5hbGwoXG5cdFx0XHRcdFx0YUNvbnRleHRzLm1hcChmdW5jdGlvbiAob05ld0NvbnRleHQ6IGFueSkge1xuXHRcdFx0XHRcdFx0aWYgKCFvTmV3Q29udGV4dC5iSW5hY3RpdmUpIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIG9OZXdDb250ZXh0LmNyZWF0ZWQoKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KVxuXHRcdFx0XHQpO1xuXHRcdFx0fSlcblx0XHRcdC50aGVuKCgpID0+IHtcblx0XHRcdFx0Y29uc3Qgb0JpbmRpbmdDb250ZXh0ID0gdGhpcy5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoKTtcblxuXHRcdFx0XHQvLyBpZiB0aGVyZSBhcmUgdHJhbnNpZW50IGNvbnRleHRzLCB3ZSBtdXN0IGF2b2lkIHJlcXVlc3Rpbmcgc2lkZSBlZmZlY3RzXG5cdFx0XHRcdC8vIHRoaXMgaXMgYXZvaWQgYSBwb3RlbnRpYWwgbGlzdCByZWZyZXNoLCB0aGVyZSBjb3VsZCBiZSBhIHNpZGUgZWZmZWN0IHRoYXQgcmVmcmVzaGVzIHRoZSBsaXN0IGJpbmRpbmdcblx0XHRcdFx0Ly8gaWYgbGlzdCBiaW5kaW5nIGlzIHJlZnJlc2hlZCwgdHJhbnNpZW50IGNvbnRleHRzIG1pZ2h0IGJlIGxvc3Rcblx0XHRcdFx0aWYgKCFDb21tb25VdGlscy5oYXNUcmFuc2llbnRDb250ZXh0KG9MaXN0QmluZGluZykpIHtcblx0XHRcdFx0XHR0aGlzLl9vQXBwQ29tcG9uZW50XG5cdFx0XHRcdFx0XHQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKClcblx0XHRcdFx0XHRcdC5yZXF1ZXN0U2lkZUVmZmVjdHNGb3JOYXZpZ2F0aW9uUHJvcGVydHkob0xpc3RCaW5kaW5nLmdldFBhdGgoKSwgb0JpbmRpbmdDb250ZXh0IGFzIENvbnRleHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChlcnI6IGFueSkge1xuXHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBjcmVhdGluZyBtdWx0aXBsZSBkb2N1bWVudHMuXCIpO1xuXHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyKTtcblx0XHRcdH0pXG5cdFx0XHQuZmluYWxseShmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdEJ1c3lMb2NrZXIudW5sb2NrKG9Mb2NrT2JqZWN0KTtcblx0XHRcdH0pXG5cdFx0XHQudGhlbigoKSA9PiB7XG5cdFx0XHRcdHJldHVybiBhRmluYWxDb250ZXh0cztcblx0XHRcdH0pO1xuXHR9XG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRkZWxldGVNdWx0aXBsZURvY3VtZW50cyhhQ29udGV4dHM6IGFueSwgbVBhcmFtZXRlcnM6IGFueSkge1xuXHRcdGNvbnN0IG9Sb3V0aW5nTGlzdGVuZXIgPSB0aGlzLmdldFJvdXRpbmdMaXN0ZW5lcigpLFxuXHRcdFx0b0xvY2tPYmplY3QgPSB0aGlzLmdldEdsb2JhbFVJTW9kZWwoKTtcblx0XHRjb25zdCBvVGFibGUgPSB0aGlzLmdldFZpZXcoKS5ieUlkKG1QYXJhbWV0ZXJzLmNvbnRyb2xJZCkgYXMgVGFibGU7XG5cdFx0aWYgKCFvVGFibGUgfHwgIW9UYWJsZS5pc0EoXCJzYXAudWkubWRjLlRhYmxlXCIpKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJwYXJhbWV0ZXIgY29udHJvbElkIG1pc3Npbmcgb3IgaW5jb3JyZWN0XCIpO1xuXHRcdH1cblx0XHRjb25zdCBvTGlzdEJpbmRpbmcgPSBvVGFibGUuZ2V0Um93QmluZGluZygpIGFzIGFueTtcblx0XHRtUGFyYW1ldGVycy5iRmluZEFjdGl2ZUNvbnRleHRzID0gdHJ1ZTtcblx0XHRCdXN5TG9ja2VyLmxvY2sob0xvY2tPYmplY3QpO1xuXHRcdHJldHVybiB0aGlzLmRlbGV0ZURvY3VtZW50VHJhbnNhY3Rpb24oYUNvbnRleHRzLCBtUGFyYW1ldGVycylcblx0XHRcdC50aGVuKCgpID0+IHtcblx0XHRcdFx0bGV0IG9SZXN1bHQ7XG5cblx0XHRcdFx0Ly8gTXVsdGlwbGUgb2JqZWN0IGRlbGV0aW9uIGlzIHRyaWdnZXJlZCBmcm9tIGEgbGlzdFxuXHRcdFx0XHQvLyBGaXJzdCBjbGVhciB0aGUgc2VsZWN0aW9uIGluIHRoZSB0YWJsZSBhcyBpdCdzIG5vdCB2YWxpZCBhbnkgbW9yZVxuXHRcdFx0XHQob1RhYmxlIGFzIGFueSkuY2xlYXJTZWxlY3Rpb24oKTtcblxuXHRcdFx0XHQvLyBUaGVuIHJlZnJlc2ggdGhlIGxpc3QtYmluZGluZyAoTFIpLCBvciByZXF1aXJlIHNpZGUtZWZmZWN0cyAoT1ApXG5cdFx0XHRcdGNvbnN0IG9CaW5kaW5nQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0XHRcdGlmIChvTGlzdEJpbmRpbmcuaXNSb290KCkpIHtcblx0XHRcdFx0XHQvLyBrZWVwIHByb21pc2UgY2hhaW4gcGVuZGluZyB1bnRpbCByZWZyZXNoIG9mIGxpc3RiaW5kaW5nIGlzIGNvbXBsZXRlZFxuXHRcdFx0XHRcdG9SZXN1bHQgPSBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuXHRcdFx0XHRcdFx0b0xpc3RCaW5kaW5nLmF0dGFjaEV2ZW50T25jZShcImRhdGFSZWNlaXZlZFwiLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdHJlc29sdmUoKTtcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdG9MaXN0QmluZGluZy5yZWZyZXNoKCk7XG5cdFx0XHRcdH0gZWxzZSBpZiAob0JpbmRpbmdDb250ZXh0KSB7XG5cdFx0XHRcdFx0Ly8gaWYgdGhlcmUgYXJlIHRyYW5zaWVudCBjb250ZXh0cywgd2UgbXVzdCBhdm9pZCByZXF1ZXN0aW5nIHNpZGUgZWZmZWN0c1xuXHRcdFx0XHRcdC8vIHRoaXMgaXMgYXZvaWQgYSBwb3RlbnRpYWwgbGlzdCByZWZyZXNoLCB0aGVyZSBjb3VsZCBiZSBhIHNpZGUgZWZmZWN0IHRoYXQgcmVmcmVzaGVzIHRoZSBsaXN0IGJpbmRpbmdcblx0XHRcdFx0XHQvLyBpZiBsaXN0IGJpbmRpbmcgaXMgcmVmcmVzaGVkLCB0cmFuc2llbnQgY29udGV4dHMgbWlnaHQgYmUgbG9zdFxuXHRcdFx0XHRcdGlmICghQ29tbW9uVXRpbHMuaGFzVHJhbnNpZW50Q29udGV4dChvTGlzdEJpbmRpbmcpKSB7XG5cdFx0XHRcdFx0XHR0aGlzLl9vQXBwQ29tcG9uZW50XG5cdFx0XHRcdFx0XHRcdC5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKVxuXHRcdFx0XHRcdFx0XHQucmVxdWVzdFNpZGVFZmZlY3RzRm9yTmF2aWdhdGlvblByb3BlcnR5KG9MaXN0QmluZGluZy5nZXRQYXRoKCksIG9CaW5kaW5nQ29udGV4dCBhcyBDb250ZXh0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBkZWxldGluZyBhdCBsZWFzdCBvbmUgb2JqZWN0IHNob3VsZCBhbHNvIHNldCB0aGUgVUkgdG8gZGlydHlcblx0XHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cblx0XHRcdFx0c2VuZChcblx0XHRcdFx0XHR0aGlzLmdldFZpZXcoKSxcblx0XHRcdFx0XHRBY3Rpdml0eS5EZWxldGUsXG5cdFx0XHRcdFx0YUNvbnRleHRzLm1hcCgoY29udGV4dDogQ29udGV4dCkgPT4gY29udGV4dC5nZXRQYXRoKCkpXG5cdFx0XHRcdCk7XG5cblx0XHRcdFx0Ly8gRmluYWxseSwgY2hlY2sgaWYgdGhlIGN1cnJlbnQgc3RhdGUgY2FuIGJlIGltcGFjdGVkIGJ5IHRoZSBkZWxldGlvbiwgaS5lLiBpZiB0aGVyZSdzXG5cdFx0XHRcdC8vIGFuIE9QIGRpc3BsYXlpbmcgYSBkZWxldGVkIG9iamVjdC4gSWYgeWVzIG5hdmlnYXRlIGJhY2sgdG8gZGlzbWlzcyB0aGUgT1Bcblx0XHRcdFx0Zm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGFDb250ZXh0cy5sZW5ndGg7IGluZGV4KyspIHtcblx0XHRcdFx0XHRpZiAob1JvdXRpbmdMaXN0ZW5lci5pc0N1cnJlbnRTdGF0ZUltcGFjdGVkQnkoYUNvbnRleHRzW2luZGV4XSkpIHtcblx0XHRcdFx0XHRcdG9Sb3V0aW5nTGlzdGVuZXIubmF2aWdhdGVCYWNrRnJvbUNvbnRleHQoYUNvbnRleHRzW2luZGV4XSk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gb1Jlc3VsdDtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGRlbGV0aW5nIHRoZSBkb2N1bWVudChzKVwiLCBvRXJyb3IpO1xuXHRcdFx0fSlcblx0XHRcdC5maW5hbGx5KGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0QnVzeUxvY2tlci51bmxvY2sob0xvY2tPYmplY3QpO1xuXHRcdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogRGVjaWRlcyBpZiBhIGRvY3VtZW50IGlzIHRvIGJlIHNob3duIGluIGRpc3BsYXkgb3IgZWRpdCBtb2RlLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgX2NvbXB1dGVFZGl0TW9kZVxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuSW50ZXJuYWxFZGl0Rmxvd1xuXHQgKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSBvQ29udGV4dCBUaGUgY29udGV4dCB0byBiZSBkaXNwbGF5ZWQgb3IgZWRpdGVkXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBQcm9taXNlIHJlc29sdmVzIG9uY2UgdGhlIGVkaXQgbW9kZSBpcyBjb21wdXRlZFxuXHQgKi9cblxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0Y29tcHV0ZUVkaXRNb2RlKG9Db250ZXh0OiBhbnkpIHtcblx0XHRjb25zdCBzQ3VzdG9tQWN0aW9uID0gdGhpcy5nZXRJbnRlcm5hbE1vZGVsKCkuZ2V0UHJvcGVydHkoXCIvc0N1c3RvbUFjdGlvblwiKTtcblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFxuXHRcdFx0KCgpID0+IHtcblx0XHRcdFx0Y29uc3Qgc1Byb2dyYW1taW5nTW9kZWwgPSB0aGlzLmdldFByb2dyYW1taW5nTW9kZWwob0NvbnRleHQpO1xuXG5cdFx0XHRcdGlmIChzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCkge1xuXHRcdFx0XHRcdHRoaXMuc2V0RHJhZnRTdGF0dXMoRHJhZnRTdGF0dXMuQ2xlYXIpO1xuXG5cdFx0XHRcdFx0cmV0dXJuIG9Db250ZXh0XG5cdFx0XHRcdFx0XHQucmVxdWVzdE9iamVjdChcIklzQWN0aXZlRW50aXR5XCIpXG5cdFx0XHRcdFx0XHQudGhlbigoYklzQWN0aXZlRW50aXR5OiBhbnkpID0+IHtcblx0XHRcdFx0XHRcdFx0aWYgKGJJc0FjdGl2ZUVudGl0eSA9PT0gZmFsc2UpIHtcblx0XHRcdFx0XHRcdFx0XHQvLyBpbiBjYXNlIHRoZSBkb2N1bWVudCBpcyBkcmFmdCBzZXQgaXQgaW4gZWRpdCBtb2RlXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5zZXRFZGl0TW9kZShFZGl0TW9kZS5FZGl0YWJsZSk7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG9Db250ZXh0LnJlcXVlc3RPYmplY3QoXCJIYXNBY3RpdmVFbnRpdHlcIikudGhlbigoYkhhc0FjdGl2ZUVudGl0eTogYW55KSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0XHR0aGlzLnNldEVkaXRNb2RlKHVuZGVmaW5lZCwgIWJIYXNBY3RpdmVFbnRpdHkpO1xuXHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdC8vIGFjdGl2ZSBkb2N1bWVudCwgc3RheSBvbiBkaXNwbGF5IG1vZGVcblx0XHRcdFx0XHRcdFx0XHR0aGlzLnNldEVkaXRNb2RlKEVkaXRNb2RlLkRpc3BsYXksIGZhbHNlKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgZGV0ZXJtaW5pbmcgdGhlIGVkaXRNb2RlIGZvciBkcmFmdFwiLCBvRXJyb3IpO1xuXHRcdFx0XHRcdFx0XHR0aHJvdyBvRXJyb3I7XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSBlbHNlIGlmIChzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kpIHtcblx0XHRcdFx0XHRpZiAoc0N1c3RvbUFjdGlvbiAmJiBzQ3VzdG9tQWN0aW9uICE9PSBcIlwiICYmIHRoaXMuX2hhc05ld0FjdGlvbkZvclN0aWNreShvQ29udGV4dCwgdGhpcy5nZXRWaWV3KCksIHNDdXN0b21BY3Rpb24pKSB7XG5cdFx0XHRcdFx0XHR0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCkuX2JDcmVhdGVNb2RlID0gdHJ1ZTtcblx0XHRcdFx0XHRcdHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKS5oYW5kbGVEb2N1bWVudE1vZGlmaWNhdGlvbnMoKTtcblx0XHRcdFx0XHRcdHRoaXMuc2V0RWRpdE1vZGUoRWRpdE1vZGUuRWRpdGFibGUsIHRydWUpO1xuXHRcdFx0XHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cdFx0XHRcdFx0XHR0aGlzLmhhbmRsZVN0aWNreU9uKG9Db250ZXh0KTtcblx0XHRcdFx0XHRcdHRoaXMuZ2V0SW50ZXJuYWxNb2RlbCgpLnNldFByb3BlcnR5KFwiL3NDdXN0b21BY3Rpb25cIiwgXCJcIik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9KSgpXG5cdFx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBlZGl0IG1vZGUuXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzRWRpdE1vZGVcblx0ICogQHBhcmFtIHtib29sZWFufSBiQ3JlYXRpb25Nb2RlIENyZWF0ZU1vZGUgZmxhZyB0byBpZGVudGlmeSB0aGUgY3JlYXRpb24gbW9kZVxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdHNldEVkaXRNb2RlKHNFZGl0TW9kZT86IHN0cmluZywgYkNyZWF0aW9uTW9kZT86IGJvb2xlYW4pIHtcblx0XHQvLyBhdCB0aGlzIHBvaW50IG9mIHRpbWUgaXQncyBub3QgbWVhbnQgdG8gcmVsZWFzZSB0aGUgZWRpdCBmbG93IGZvciBmcmVlc3R5bGUgdXNhZ2UgdGhlcmVmb3JlIHdlIGNhblxuXHRcdC8vIHJlbHkgb24gdGhlIGdsb2JhbCBVSSBtb2RlbCB0byBleGlzdFxuXHRcdGNvbnN0IG9HbG9iYWxNb2RlbCA9IHRoaXMuZ2V0R2xvYmFsVUlNb2RlbCgpO1xuXG5cdFx0aWYgKHNFZGl0TW9kZSkge1xuXHRcdFx0b0dsb2JhbE1vZGVsLnNldFByb3BlcnR5KFwiL2lzRWRpdGFibGVcIiwgc0VkaXRNb2RlID09PSBcIkVkaXRhYmxlXCIsIHVuZGVmaW5lZCwgdHJ1ZSk7XG5cdFx0fVxuXG5cdFx0aWYgKGJDcmVhdGlvbk1vZGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Ly8gU2luY2Ugc2V0Q3JlYXRpb25Nb2RlIGlzIHB1YmxpYyBpbiBFZGl0RmxvdyBhbmQgY2FuIGJlIG92ZXJyaWRlbiwgbWFrZSBzdXJlIHRvIGNhbGwgaXQgdmlhIHRoZSBjb250cm9sbGVyXG5cdFx0XHQvLyB0byBlbnN1cmUgYW55IG92ZXJyaWRlcyBhcmUgdGFrZW4gaW50byBhY2NvdW50XG5cdFx0XHR0aGlzLnNldENyZWF0aW9uTW9kZShiQ3JlYXRpb25Nb2RlKTtcblx0XHR9XG5cdH1cblxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0c2V0RHJhZnRTdGF0dXMoc0RyYWZ0U3RhdGU6IGFueSkge1xuXHRcdC8vIGF0IHRoaXMgcG9pbnQgb2YgdGltZSBpdCdzIG5vdCBtZWFudCB0byByZWxlYXNlIHRoZSBlZGl0IGZsb3cgZm9yIGZyZWVzdHlsZSB1c2FnZSB0aGVyZWZvcmUgd2UgY2FuXG5cdFx0Ly8gcmVseSBvbiB0aGUgZ2xvYmFsIFVJIG1vZGVsIHRvIGV4aXN0XG5cdFx0KHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJ1aVwiKSBhcyBKU09OTW9kZWwpLnNldFByb3BlcnR5KFwiL2RyYWZ0U3RhdHVzXCIsIHNEcmFmdFN0YXRlLCB1bmRlZmluZWQsIHRydWUpO1xuXHR9XG5cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGdldFJvdXRpbmdMaXN0ZW5lcigpIHtcblx0XHQvLyBhdCB0aGlzIHBvaW50IG9mIHRpbWUgaXQncyBub3QgbWVhbnQgdG8gcmVsZWFzZSB0aGUgZWRpdCBmbG93IGZvciBGUE0gY3VzdG9tIHBhZ2VzIGFuZCB0aGUgcm91dGluZ1xuXHRcdC8vIGxpc3RlbmVyIGlzIG5vdCB5ZXQgcHVibGljIHRoZXJlZm9yZSBrZWVwIHRoZSBsb2dpYyBoZXJlIGZvciBub3dcblxuXHRcdGlmICh0aGlzLmJhc2UuX3JvdXRpbmcpIHtcblx0XHRcdHJldHVybiB0aGlzLmJhc2UuX3JvdXRpbmc7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIkVkaXQgRmxvdyB3b3JrcyBvbmx5IHdpdGggYSBnaXZlbiByb3V0aW5nIGxpc3RlbmVyXCIpO1xuXHRcdH1cblx0fVxuXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRnZXRHbG9iYWxVSU1vZGVsKCk6IEpTT05Nb2RlbCB7XG5cdFx0Ly8gYXQgdGhpcyBwb2ludCBvZiB0aW1lIGl0J3Mgbm90IG1lYW50IHRvIHJlbGVhc2UgdGhlIGVkaXQgZmxvdyBmb3IgZnJlZXN0eWxlIHVzYWdlIHRoZXJlZm9yZSB3ZSBjYW5cblx0XHQvLyByZWx5IG9uIHRoZSBnbG9iYWwgVUkgbW9kZWwgdG8gZXhpc3Rcblx0XHRyZXR1cm4gdGhpcy5iYXNlLmdldFZpZXcoKS5nZXRNb2RlbChcInVpXCIpIGFzIEpTT05Nb2RlbDtcblx0fVxuXG5cdC8qKlxuXHQgKiBQZXJmb3JtcyBhIHRhc2sgaW4gc3luYyB3aXRoIG90aGVyIHRhc2tzIGNyZWF0ZWQgdmlhIHRoaXMgZnVuY3Rpb24uXG5cdCAqIFJldHVybnMgdGhlIHByb21pc2UgY2hhaW4gb2YgdGhlIHRhc2suXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0RmxvdyNzeW5jVGFza1xuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQHN0YXRpY1xuXHQgKiBAcGFyYW0ge1Byb21pc2V8RnVuY3Rpb259IFt2VGFza10gT3B0aW9uYWwsIGEgcHJvbWlzZSBvciBmdW5jdGlvbiB0byBiZSBleGVjdXRlZCBzeW5jaHJvbm91c2x5XG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBQcm9taXNlIHJlc29sdmVzIG9uY2UgdGhlIHRhc2sgaXMgY29tcGxldGVkXG5cdCAqXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAZmluYWxcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRzeW5jVGFzayh2VGFzaz86IEZ1bmN0aW9uIHwgUHJvbWlzZTxhbnk+KSB7XG5cdFx0bGV0IGZuTmV3VGFzaztcblx0XHRpZiAodlRhc2sgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG5cdFx0XHRmbk5ld1Rhc2sgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHJldHVybiB2VGFzaztcblx0XHRcdH07XG5cdFx0fSBlbHNlIGlmICh0eXBlb2YgdlRhc2sgPT09IFwiZnVuY3Rpb25cIikge1xuXHRcdFx0Zm5OZXdUYXNrID0gdlRhc2s7XG5cdFx0fVxuXG5cdFx0dGhpcy5fcFRhc2tzID0gdGhpcy5fcFRhc2tzIHx8IFByb21pc2UucmVzb2x2ZSgpO1xuXHRcdGlmICghIWZuTmV3VGFzaykge1xuXHRcdFx0dGhpcy5fcFRhc2tzID0gdGhpcy5fcFRhc2tzLnRoZW4oZm5OZXdUYXNrKS5jYXRjaChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLl9wVGFza3M7XG5cdH1cblxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0Z2V0UHJvZ3JhbW1pbmdNb2RlbChvQ29udGV4dD86IGFueSk6IHR5cGVvZiBQcm9ncmFtbWluZ01vZGVsIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpLmdldFByb2dyYW1taW5nTW9kZWwob0NvbnRleHQpO1xuXHR9XG5cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGRlbGV0ZURvY3VtZW50VHJhbnNhY3Rpb24ob0NvbnRleHQ6IGFueSwgbVBhcmFtZXRlcnM6IGFueSkge1xuXHRcdGNvbnN0IG9SZXNvdXJjZUJ1bmRsZSA9ICh0aGlzLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgYW55KS5vUmVzb3VyY2VCdW5kbGUsXG5cdFx0XHR0cmFuc2FjdGlvbkhlbHBlciA9IHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKTtcblxuXHRcdG1QYXJhbWV0ZXJzID0gbVBhcmFtZXRlcnMgfHwge307XG5cblx0XHQvLyBUT0RPOiB0aGlzIHNldHRpbmcgYW5kIHJlbW92aW5nIG9mIGNvbnRleHRzIHNob3VsZG4ndCBiZSBpbiB0aGUgdHJhbnNhY3Rpb24gaGVscGVyIGF0IGFsbFxuXHRcdC8vIGZvciB0aGUgdGltZSBiZWluZyBJIGtlcHQgaXQgYW5kIHByb3ZpZGUgdGhlIGludGVybmFsIG1vZGVsIGNvbnRleHQgdG8gbm90IGJyZWFrIHNvbWV0aGluZ1xuXHRcdG1QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0ID0gbVBhcmFtZXRlcnMuY29udHJvbElkXG5cdFx0XHQ/IHNhcC51aS5nZXRDb3JlKCkuYnlJZChtUGFyYW1ldGVycy5jb250cm9sSWQpPy5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpXG5cdFx0XHQ6IG51bGw7XG5cblx0XHRyZXR1cm4gdGhpcy5zeW5jVGFzaygpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0dHJhbnNhY3Rpb25IZWxwZXIuZGVsZXRlRG9jdW1lbnQuYmluZCh0cmFuc2FjdGlvbkhlbHBlciwgb0NvbnRleHQsIG1QYXJhbWV0ZXJzLCBvUmVzb3VyY2VCdW5kbGUsIHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKSlcblx0XHRcdClcblx0XHRcdC50aGVuKCgpID0+IHtcblx0XHRcdFx0Y29uc3QgaW50ZXJuYWxNb2RlbCA9IHRoaXMuZ2V0SW50ZXJuYWxNb2RlbCgpO1xuXHRcdFx0XHRpbnRlcm5hbE1vZGVsLnNldFByb3BlcnR5KFwiL3Nlc3Npb25PblwiLCBmYWxzZSk7XG5cdFx0XHRcdGludGVybmFsTW9kZWwuc2V0UHJvcGVydHkoXCIvc3RpY2t5U2Vzc2lvblRva2VuXCIsIHVuZGVmaW5lZCk7XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3Qob0Vycm9yKTtcblx0XHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEhhbmRsZXMgdGhlIGNyZWF0ZSBldmVudDogc2hvd3MgbWVzc2FnZXMgYW5kIGluIGNhc2Ugb2YgYSBkcmFmdCwgdXBkYXRlcyB0aGUgZHJhZnQgaW5kaWNhdG9yLlxuXHQgKlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQHBhcmFtIHtvYmplY3R9IG9CaW5kaW5nIE9EYXRhIGxpc3QgYmluZGluZyBvYmplY3Rcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRoYW5kbGVDcmVhdGVFdmVudHMob0JpbmRpbmc6IGFueSkge1xuXHRcdGNvbnN0IHRyYW5zYWN0aW9uSGVscGVyID0gdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpO1xuXG5cdFx0dGhpcy5zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5DbGVhcik7XG5cblx0XHRvQmluZGluZyA9IChvQmluZGluZy5nZXRCaW5kaW5nICYmIG9CaW5kaW5nLmdldEJpbmRpbmcoKSkgfHwgb0JpbmRpbmc7XG5cdFx0Y29uc3Qgc1Byb2dyYW1taW5nTW9kZWwgPSB0aGlzLmdldFByb2dyYW1taW5nTW9kZWwob0JpbmRpbmcpO1xuXG5cdFx0b0JpbmRpbmcuYXR0YWNoRXZlbnQoXCJjcmVhdGVTZW50XCIsICgpID0+IHtcblx0XHRcdHRyYW5zYWN0aW9uSGVscGVyLmhhbmRsZURvY3VtZW50TW9kaWZpY2F0aW9ucygpO1xuXHRcdFx0aWYgKHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0KSB7XG5cdFx0XHRcdHRoaXMuc2V0RHJhZnRTdGF0dXMoRHJhZnRTdGF0dXMuU2F2aW5nKTtcblx0XHRcdH1cblx0XHR9KTtcblx0XHRvQmluZGluZy5hdHRhY2hFdmVudChcImNyZWF0ZUNvbXBsZXRlZFwiLCAob0V2ZW50OiBhbnkpID0+IHtcblx0XHRcdGNvbnN0IGJTdWNjZXNzID0gb0V2ZW50LmdldFBhcmFtZXRlcihcInN1Y2Nlc3NcIik7XG5cdFx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQpIHtcblx0XHRcdFx0dGhpcy5zZXREcmFmdFN0YXR1cyhiU3VjY2VzcyA/IERyYWZ0U3RhdHVzLlNhdmVkIDogRHJhZnRTdGF0dXMuQ2xlYXIpO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnNob3dNZXNzYWdlRGlhbG9nKCk7XG5cdFx0fSk7XG5cdH1cblxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0Z2V0VHJhbnNhY3Rpb25IZWxwZXIoKSB7XG5cdFx0aWYgKCF0aGlzLl9vVHJhbnNhY3Rpb25IZWxwZXIpIHtcblx0XHRcdC8vIGN1cnJlbnRseSBhbHNvIHRoZSB0cmFuc2FjdGlvbiBoZWxwZXIgaXMgbG9ja2luZyB0aGVyZWZvcmUgcGFzc2luZyBsb2NrIG9iamVjdFxuXHRcdFx0dGhpcy5fb1RyYW5zYWN0aW9uSGVscGVyID0gbmV3IFRyYW5zYWN0aW9uSGVscGVyKHRoaXMuX29BcHBDb21wb25lbnQsIHRoaXMuZ2V0R2xvYmFsVUlNb2RlbCgpKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5fb1RyYW5zYWN0aW9uSGVscGVyO1xuXHR9XG5cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGdldEludGVybmFsTW9kZWwoKTogSlNPTk1vZGVsIHtcblx0XHRyZXR1cm4gdGhpcy5iYXNlLmdldFZpZXcoKS5nZXRNb2RlbChcImludGVybmFsXCIpIGFzIEpTT05Nb2RlbDtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmV3IHByb21pc2UgdG8gd2FpdCBmb3IgYW4gYWN0aW9uIHRvIGJlIGV4ZWN1dGVkXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBfY3JlYXRlQWN0aW9uUHJvbWlzZVxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICpcblx0ICogQHJldHVybnMge0Z1bmN0aW9ufSBUaGUgcmVzb2x2ZXIgZnVuY3Rpb24gd2hpY2ggY2FuIGJlIHVzZWQgdG8gZXh0ZXJuYWxseSByZXNvbHZlIHRoZSBwcm9taXNlXG5cdCAqL1xuXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRjcmVhdGVBY3Rpb25Qcm9taXNlKHNBY3Rpb25OYW1lOiBhbnksIHNDb250cm9sSWQ6IGFueSkge1xuXHRcdGxldCBmUmVzb2x2ZXIsIGZSZWplY3Rvcjtcblx0XHR0aGlzLm9BY3Rpb25Qcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdFx0ZlJlc29sdmVyID0gcmVzb2x2ZTtcblx0XHRcdGZSZWplY3RvciA9IHJlamVjdDtcblx0XHR9KS50aGVuKChvUmVzcG9uc2U6IGFueSkgPT4ge1xuXHRcdFx0cmV0dXJuIE9iamVjdC5hc3NpZ24oeyBjb250cm9sSWQ6IHNDb250cm9sSWQgfSwgdGhpcy5nZXRBY3Rpb25SZXNwb25zZURhdGFBbmRLZXlzKHNBY3Rpb25OYW1lLCBvUmVzcG9uc2UpKTtcblx0XHR9KTtcblx0XHRyZXR1cm4geyBmUmVzb2x2ZXI6IGZSZXNvbHZlciwgZlJlamVjdG9yOiBmUmVqZWN0b3IgfTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBnZXRDdXJyZW50QWN0aW9uUHJvbWlzZSBvYmplY3QuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBfZ2V0Q3VycmVudEFjdGlvblByb21pc2Vcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XG5cdCAqXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBSZXR1cm5zIHRoZSBwcm9taXNlXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0Z2V0Q3VycmVudEFjdGlvblByb21pc2UoKSB7XG5cdFx0cmV0dXJuIHRoaXMub0FjdGlvblByb21pc2U7XG5cdH1cblxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0ZGVsZXRlQ3VycmVudEFjdGlvblByb21pc2UoKSB7XG5cdFx0dGhpcy5vQWN0aW9uUHJvbWlzZSA9IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgZ2V0QWN0aW9uUmVzcG9uc2VEYXRhQW5kS2V5c1xuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNBY3Rpb25OYW1lIFRoZSBuYW1lIG9mIHRoZSBhY3Rpb24gdGhhdCBpcyBleGVjdXRlZFxuXHQgKiBAcGFyYW0ge29iamVjdH0gb1Jlc3BvbnNlIFRoZSBib3VuZCBhY3Rpb24ncyByZXNwb25zZSBkYXRhIG9yIHJlc3BvbnNlIGNvbnRleHRcblx0ICogQHJldHVybnMge29iamVjdH0gT2JqZWN0IHdpdGggZGF0YSBhbmQgbmFtZXMgb2YgdGhlIGtleSBmaWVsZHMgb2YgdGhlIHJlc3BvbnNlXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0Z2V0QWN0aW9uUmVzcG9uc2VEYXRhQW5kS2V5cyhzQWN0aW9uTmFtZTogc3RyaW5nLCBvUmVzcG9uc2U6IGFueSkge1xuXHRcdGlmIChBcnJheS5pc0FycmF5KG9SZXNwb25zZSkpIHtcblx0XHRcdGlmIChvUmVzcG9uc2UubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRcdG9SZXNwb25zZSA9IG9SZXNwb25zZVswXTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybiBudWxsO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAoIW9SZXNwb25zZSkge1xuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fVxuXHRcdGNvbnN0IG9WaWV3ID0gdGhpcy5nZXRWaWV3KCksXG5cdFx0XHRvTWV0YU1vZGVsID0gKG9WaWV3LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCkgYXMgYW55KS5nZXREYXRhKCksXG5cdFx0XHRzQWN0aW9uUmV0dXJuVHlwZSA9XG5cdFx0XHRcdG9NZXRhTW9kZWwgJiYgb01ldGFNb2RlbFtzQWN0aW9uTmFtZV0gJiYgb01ldGFNb2RlbFtzQWN0aW9uTmFtZV1bMF0gJiYgb01ldGFNb2RlbFtzQWN0aW9uTmFtZV1bMF0uJFJldHVyblR5cGVcblx0XHRcdFx0XHQ/IG9NZXRhTW9kZWxbc0FjdGlvbk5hbWVdWzBdLiRSZXR1cm5UeXBlLiRUeXBlXG5cdFx0XHRcdFx0OiBudWxsLFxuXHRcdFx0YUtleSA9IHNBY3Rpb25SZXR1cm5UeXBlICYmIG9NZXRhTW9kZWxbc0FjdGlvblJldHVyblR5cGVdID8gb01ldGFNb2RlbFtzQWN0aW9uUmV0dXJuVHlwZV0uJEtleSA6IG51bGw7XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0b0RhdGE6IG9SZXNwb25zZS5nZXRPYmplY3QoKSxcblx0XHRcdGtleXM6IGFLZXlcblx0XHR9O1xuXHR9XG5cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGdldE1lc3NhZ2VIYW5kbGVyKCkge1xuXHRcdC8vIGF0IHRoaXMgcG9pbnQgb2YgdGltZSBpdCdzIG5vdCBtZWFudCB0byByZWxlYXNlIHRoZSBlZGl0IGZsb3cgZm9yIEZQTSBjdXN0b20gcGFnZXMgdGhlcmVmb3JlIGtlZXBcblx0XHQvLyB0aGUgbG9naWMgaGVyZSBmb3Igbm93XG5cblx0XHRpZiAodGhpcy5iYXNlLm1lc3NhZ2VIYW5kbGVyKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5iYXNlLm1lc3NhZ2VIYW5kbGVyO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJFZGl0IEZsb3cgd29ya3Mgb25seSB3aXRoIGEgZ2l2ZW4gbWVzc2FnZSBoYW5kbGVyXCIpO1xuXHRcdH1cblx0fVxuXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRoYW5kbGVTdGlja3lPbihvQ29udGV4dDogQ29udGV4dCkge1xuXHRcdGNvbnN0IG9BcHBDb21wb25lbnQgPSBDb21tb25VdGlscy5nZXRBcHBDb21wb25lbnQodGhpcy5nZXRWaWV3KCkpO1xuXG5cdFx0dHJ5IHtcblx0XHRcdGlmIChvQXBwQ29tcG9uZW50ID09PSB1bmRlZmluZWQgfHwgb0NvbnRleHQgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJ1bmRlZmluZWQgQXBwQ29tcG9uZW50IG9yIENvbnRleHQgZm9yIGZ1bmN0aW9uIGhhbmRsZVN0aWNreU9uXCIpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIW9BcHBDb21wb25lbnQuZ2V0Um91dGVyUHJveHkoKS5oYXNOYXZpZ2F0aW9uR3VhcmQoKSkge1xuXHRcdFx0XHRjb25zdCBzSGFzaFRyYWNrZXIgPSBvQXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCkuZ2V0SGFzaCgpLFxuXHRcdFx0XHRcdG9JbnRlcm5hbE1vZGVsID0gdGhpcy5nZXRJbnRlcm5hbE1vZGVsKCk7XG5cblx0XHRcdFx0Ly8gU2V0IGEgZ3VhcmQgaW4gdGhlIFJvdXRlclByb3h5XG5cdFx0XHRcdC8vIEEgdGltZW91dCBpcyBuZWNlc3NhcnksIGFzIHdpdGggZGVmZXJyZWQgY3JlYXRpb24gdGhlIGhhc2hDaGFuZ2VyIGlzIG5vdCB1cGRhdGVkIHlldCB3aXRoXG5cdFx0XHRcdC8vIHRoZSBuZXcgaGFzaCwgYW5kIHRoZSBndWFyZCBjYW5ub3QgYmUgZm91bmQgaW4gdGhlIG1hbmFnZWQgaGlzdG9yeSBvZiB0aGUgcm91dGVyIHByb3h5XG5cdFx0XHRcdHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdG9BcHBDb21wb25lbnQuZ2V0Um91dGVyUHJveHkoKS5zZXROYXZpZ2F0aW9uR3VhcmQob0NvbnRleHQuZ2V0UGF0aCgpLnN1YnN0cmluZygxKSk7XG5cdFx0XHRcdH0sIDApO1xuXG5cdFx0XHRcdC8vIFNldHRpbmcgYmFjayBuYXZpZ2F0aW9uIG9uIHNoZWxsIHNlcnZpY2UsIHRvIGdldCB0aGUgZGljYXJkIG1lc3NhZ2UgYm94IGluIGNhc2Ugb2Ygc3RpY2t5XG5cdFx0XHRcdG9BcHBDb21wb25lbnQuZ2V0U2hlbGxTZXJ2aWNlcygpLnNldEJhY2tOYXZpZ2F0aW9uKHRoaXMub25CYWNrTmF2aWdhdGlvbkluU2Vzc2lvbi5iaW5kKHRoaXMpKTtcblxuXHRcdFx0XHR0aGlzLmZuRGlydHlTdGF0ZVByb3ZpZGVyID0gdGhpcy5fcmVnaXN0ZXJEaXJ0eVN0YXRlUHJvdmlkZXIob0FwcENvbXBvbmVudCwgb0ludGVybmFsTW9kZWwsIHNIYXNoVHJhY2tlcik7XG5cdFx0XHRcdG9BcHBDb21wb25lbnQuZ2V0U2hlbGxTZXJ2aWNlcygpLnJlZ2lzdGVyRGlydHlTdGF0ZVByb3ZpZGVyKHRoaXMuZm5EaXJ0eVN0YXRlUHJvdmlkZXIpO1xuXG5cdFx0XHRcdC8vIGhhbmRsZSBzZXNzaW9uIHRpbWVvdXRcblx0XHRcdFx0Y29uc3QgaTE4bk1vZGVsID0gdGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJzYXAuZmUuaTE4blwiKTtcblx0XHRcdFx0dGhpcy5mbkhhbmRsZVNlc3Npb25UaW1lb3V0ID0gdGhpcy5fYXR0YWNoU2Vzc2lvblRpbWVvdXQob0NvbnRleHQsIGkxOG5Nb2RlbCk7XG5cdFx0XHRcdCh0aGlzLmdldFZpZXcoKS5nZXRNb2RlbCgpIGFzIGFueSkuYXR0YWNoU2Vzc2lvblRpbWVvdXQodGhpcy5mbkhhbmRsZVNlc3Npb25UaW1lb3V0KTtcblxuXHRcdFx0XHR0aGlzLmZuU3RpY2t5RGlzY2FyZEFmdGVyTmF2aWdhdGlvbiA9IHRoaXMuX2F0dGFjaFJvdXRlTWF0Y2hlZCh0aGlzLCBvQ29udGV4dCwgb0FwcENvbXBvbmVudCk7XG5cdFx0XHRcdG9BcHBDb21wb25lbnQuZ2V0Um91dGluZ1NlcnZpY2UoKS5hdHRhY2hSb3V0ZU1hdGNoZWQodGhpcy5mblN0aWNreURpc2NhcmRBZnRlck5hdmlnYXRpb24pO1xuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRMb2cuaW5mbyhlcnJvciBhcyBhbnkpO1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0aGFuZGxlU3RpY2t5T2ZmKCkge1xuXHRcdGNvbnN0IG9BcHBDb21wb25lbnQgPSBDb21tb25VdGlscy5nZXRBcHBDb21wb25lbnQodGhpcy5nZXRWaWV3KCkpO1xuXHRcdHRyeSB7XG5cdFx0XHRpZiAob0FwcENvbXBvbmVudCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcInVuZGVmaW5lZCBBcHBDb21wb25lbnQgZm9yIGZ1bmN0aW9uIGhhbmRsZVN0aWNreU9mZlwiKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKG9BcHBDb21wb25lbnQgJiYgb0FwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSkge1xuXHRcdFx0XHQvLyBJZiB3ZSBoYXZlIGV4aXRlZCBmcm9tIHRoZSBhcHAsIENvbW1vblV0aWxzLmdldEFwcENvbXBvbmVudCBkb2Vzbid0IHJldHVybiBhXG5cdFx0XHRcdC8vIHNhcC5mZS5jb3JlLkFwcENvbXBvbmVudCwgaGVuY2UgdGhlICdpZicgYWJvdmVcblx0XHRcdFx0b0FwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSgpLmRpc2NhcmROYXZpZ2F0aW9uR3VhcmQoKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHRoaXMuZm5EaXJ0eVN0YXRlUHJvdmlkZXIpIHtcblx0XHRcdFx0b0FwcENvbXBvbmVudC5nZXRTaGVsbFNlcnZpY2VzKCkuZGVyZWdpc3RlckRpcnR5U3RhdGVQcm92aWRlcih0aGlzLmZuRGlydHlTdGF0ZVByb3ZpZGVyKTtcblx0XHRcdFx0dGhpcy5mbkRpcnR5U3RhdGVQcm92aWRlciA9IHVuZGVmaW5lZDtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKCkgJiYgdGhpcy5mbkhhbmRsZVNlc3Npb25UaW1lb3V0KSB7XG5cdFx0XHRcdCh0aGlzLmdldFZpZXcoKS5nZXRNb2RlbCgpIGFzIGFueSkuZGV0YWNoU2Vzc2lvblRpbWVvdXQodGhpcy5mbkhhbmRsZVNlc3Npb25UaW1lb3V0KTtcblx0XHRcdH1cblxuXHRcdFx0b0FwcENvbXBvbmVudC5nZXRSb3V0aW5nU2VydmljZSgpLmRldGFjaFJvdXRlTWF0Y2hlZCh0aGlzLmZuU3RpY2t5RGlzY2FyZEFmdGVyTmF2aWdhdGlvbik7XG5cdFx0XHR0aGlzLmZuU3RpY2t5RGlzY2FyZEFmdGVyTmF2aWdhdGlvbiA9IHVuZGVmaW5lZDtcblxuXHRcdFx0dGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpLl9iQ3JlYXRlTW9kZSA9IGZhbHNlO1xuXHRcdFx0dGhpcy5zZXRFZGl0TW9kZShFZGl0TW9kZS5EaXNwbGF5LCBmYWxzZSk7XG5cblx0XHRcdGlmIChvQXBwQ29tcG9uZW50KSB7XG5cdFx0XHRcdC8vIElmIHdlIGhhdmUgZXhpdGVkIGZyb20gdGhlIGFwcCwgQ29tbW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50IGRvZXNuJ3QgcmV0dXJuIGFcblx0XHRcdFx0Ly8gc2FwLmZlLmNvcmUuQXBwQ29tcG9uZW50LCBoZW5jZSB0aGUgJ2lmJyBhYm92ZVxuXHRcdFx0XHRvQXBwQ29tcG9uZW50LmdldFNoZWxsU2VydmljZXMoKS5zZXRCYWNrTmF2aWdhdGlvbigpO1xuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRMb2cuaW5mbyhlcnJvciBhcyBhbnkpO1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uIE1ldGhvZCB0byBkaXNwbGF5IGEgJ2Rpc2NhcmQnIHBvcG92ZXIgd2hlbiBleGl0aW5nIGEgc3RpY2t5IHNlc3Npb24uXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBvbkJhY2tOYXZpZ2F0aW9uSW5TZXNzaW9uXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5JbnRlcm5hbEVkaXRGbG93XG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0b25CYWNrTmF2aWdhdGlvbkluU2Vzc2lvbigpIHtcblx0XHRjb25zdCBvVmlldyA9IHRoaXMuZ2V0VmlldygpLFxuXHRcdFx0b0FwcENvbXBvbmVudCA9IENvbW1vblV0aWxzLmdldEFwcENvbXBvbmVudChvVmlldyksXG5cdFx0XHRvUm91dGVyUHJveHkgPSBvQXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCk7XG5cblx0XHRpZiAob1JvdXRlclByb3h5LmNoZWNrSWZCYWNrSXNPdXRPZkd1YXJkKCkpIHtcblx0XHRcdGNvbnN0IG9CaW5kaW5nQ29udGV4dCA9IG9WaWV3ICYmIG9WaWV3LmdldEJpbmRpbmdDb250ZXh0KCk7XG5cblx0XHRcdHN0aWNreS5wcm9jZXNzRGF0YUxvc3NDb25maXJtYXRpb24oXG5cdFx0XHRcdCgpID0+IHtcblx0XHRcdFx0XHR0aGlzLmRpc2NhcmRTdGlja3lTZXNzaW9uKG9CaW5kaW5nQ29udGV4dCk7XG5cdFx0XHRcdFx0aGlzdG9yeS5iYWNrKCk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdG9WaWV3LFxuXHRcdFx0XHR0aGlzLmdldFByb2dyYW1taW5nTW9kZWwob0JpbmRpbmdDb250ZXh0KVxuXHRcdFx0KTtcblxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRoaXN0b3J5LmJhY2soKTtcblx0fVxuXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRkaXNjYXJkU3RpY2t5U2Vzc2lvbihvQ29udGV4dDogYW55KSB7XG5cdFx0c3RpY2t5LmRpc2NhcmREb2N1bWVudChvQ29udGV4dCk7XG5cdFx0dGhpcy5oYW5kbGVTdGlja3lPZmYoKTtcblx0fVxuXG5cdF9oYXNOZXdBY3Rpb25Gb3JTdGlja3kob0NvbnRleHQ6IGFueSwgb1ZpZXc6IFZpZXcsIHNDdXN0b21BY3Rpb246IHN0cmluZykge1xuXHRcdHRyeSB7XG5cdFx0XHRpZiAob0NvbnRleHQgPT09IHVuZGVmaW5lZCB8fCBvVmlldyA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgaW5wdXQgcGFyYW1ldGVycyBmb3IgZnVuY3Rpb24gX2hhc05ld0FjdGlvbkZvclN0aWNreVwiKTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG9WaWV3LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCksXG5cdFx0XHRcdHNNZXRhUGF0aCA9IG9Db250ZXh0LmdldFBhdGgoKS5zdWJzdHJpbmcoMCwgb0NvbnRleHQuZ2V0UGF0aCgpLmluZGV4T2YoXCIoXCIpKSxcblx0XHRcdFx0b1N0aWNreVNlc3Npb24gPSBvTWV0YU1vZGVsLmdldE9iamVjdChzTWV0YVBhdGggKyBcIkBjb20uc2FwLnZvY2FidWxhcmllcy5TZXNzaW9uLnYxLlN0aWNreVNlc3Npb25TdXBwb3J0ZWRcIik7XG5cblx0XHRcdGlmIChvU3RpY2t5U2Vzc2lvbiAmJiBvU3RpY2t5U2Vzc2lvbi5OZXdBY3Rpb24gJiYgb1N0aWNreVNlc3Npb24uTmV3QWN0aW9uID09PSBzQ3VzdG9tQWN0aW9uKSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fSBlbHNlIGlmIChvU3RpY2t5U2Vzc2lvbiAmJiBvU3RpY2t5U2Vzc2lvbi5BZGRpdGlvbmFsTmV3QWN0aW9ucykge1xuXHRcdFx0XHRyZXR1cm4gc0N1c3RvbUFjdGlvbiA9PT1cblx0XHRcdFx0XHRvU3RpY2t5U2Vzc2lvbi5BZGRpdGlvbmFsTmV3QWN0aW9ucy5maW5kKGZ1bmN0aW9uIChzQWRkaXRpb25hbEFjdGlvbjogc3RyaW5nKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gc0FkZGl0aW9uYWxBY3Rpb24gPT09IHNDdXN0b21BY3Rpb247XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQ/IHRydWVcblx0XHRcdFx0XHQ6IGZhbHNlO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRMb2cuaW5mbyhlcnJvciBhcyBhbnkpO1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cdH1cblxuXHRfcmVnaXN0ZXJEaXJ0eVN0YXRlUHJvdmlkZXIob0FwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LCBvSW50ZXJuYWxNb2RlbDogSlNPTk1vZGVsLCBzSGFzaFRyYWNrZXI6IHN0cmluZykge1xuXHRcdHJldHVybiBmdW5jdGlvbiBmbkRpcnR5U3RhdGVQcm92aWRlcihvTmF2aWdhdGlvbkNvbnRleHQ6IGFueSkge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0aWYgKG9OYXZpZ2F0aW9uQ29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBpbnB1dCBwYXJhbWV0ZXJzIGZvciBmdW5jdGlvbiBmbkRpcnR5U3RhdGVQcm92aWRlclwiKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNvbnN0IHNUYXJnZXRIYXNoID0gb05hdmlnYXRpb25Db250ZXh0LmlubmVyQXBwUm91dGUsXG5cdFx0XHRcdFx0b1JvdXRlclByb3h5ID0gb0FwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSgpO1xuXHRcdFx0XHRsZXQgc0xjbEhhc2hUcmFja2VyID0gXCJcIjtcblx0XHRcdFx0bGV0IGJEaXJ0eTogYm9vbGVhbjtcblx0XHRcdFx0Y29uc3QgYlNlc3Npb25PTiA9IG9JbnRlcm5hbE1vZGVsLmdldFByb3BlcnR5KFwiL3Nlc3Npb25PblwiKTtcblxuXHRcdFx0XHRpZiAoIWJTZXNzaW9uT04pIHtcblx0XHRcdFx0XHQvLyBJZiB0aGUgc3RpY2t5IHNlc3Npb24gd2FzIHRlcm1pbmF0ZWQgYmVmb3JlIGhhbmQuXG5cdFx0XHRcdFx0Ly8gRWV4YW1wbGUgaW4gY2FzZSBvZiBuYXZpZ2F0aW5nIGF3YXkgZnJvbSBhcHBsaWNhdGlvbiB1c2luZyBJQk4uXG5cdFx0XHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICghb1JvdXRlclByb3h5LmlzTmF2aWdhdGlvbkZpbmFsaXplZCgpKSB7XG5cdFx0XHRcdFx0Ly8gSWYgbmF2aWdhdGlvbiBpcyBjdXJyZW50bHkgaGFwcGVuaW5nIGluIFJvdXRlclByb3h5LCBpdCdzIGEgdHJhbnNpZW50IHN0YXRlXG5cdFx0XHRcdFx0Ly8gKG5vdCBkaXJ0eSlcblx0XHRcdFx0XHRiRGlydHkgPSBmYWxzZTtcblx0XHRcdFx0XHRzTGNsSGFzaFRyYWNrZXIgPSBzVGFyZ2V0SGFzaDtcblx0XHRcdFx0fSBlbHNlIGlmIChzSGFzaFRyYWNrZXIgPT09IHNUYXJnZXRIYXNoKSB7XG5cdFx0XHRcdFx0Ly8gdGhlIGhhc2ggZGlkbid0IGNoYW5nZSBzbyBlaXRoZXIgdGhlIHVzZXIgYXR0ZW1wdHMgdG8gcmVmcmVzaCBvciB0byBsZWF2ZSB0aGUgYXBwXG5cdFx0XHRcdFx0YkRpcnR5ID0gdHJ1ZTtcblx0XHRcdFx0fSBlbHNlIGlmIChvUm91dGVyUHJveHkuY2hlY2tIYXNoV2l0aEd1YXJkKHNUYXJnZXRIYXNoKSB8fCBvUm91dGVyUHJveHkuaXNHdWFyZENyb3NzQWxsb3dlZEJ5VXNlcigpKSB7XG5cdFx0XHRcdFx0Ly8gdGhlIHVzZXIgYXR0ZW1wdHMgdG8gbmF2aWdhdGUgd2l0aGluIHRoZSByb290IG9iamVjdFxuXHRcdFx0XHRcdC8vIG9yIGNyb3NzaW5nIHRoZSBndWFyZCBoYXMgYWxyZWFkeSBiZWVuIGFsbG93ZWQgYnkgdGhlIFJvdXRlclByb3h5XG5cdFx0XHRcdFx0c0xjbEhhc2hUcmFja2VyID0gc1RhcmdldEhhc2g7XG5cdFx0XHRcdFx0YkRpcnR5ID0gZmFsc2U7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gdGhlIHVzZXIgYXR0ZW1wdHMgdG8gbmF2aWdhdGUgd2l0aGluIHRoZSBhcHAsIGZvciBleGFtcGxlIGJhY2sgdG8gdGhlIGxpc3QgcmVwb3J0XG5cdFx0XHRcdFx0YkRpcnR5ID0gdHJ1ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChiRGlydHkpIHtcblx0XHRcdFx0XHQvLyB0aGUgRkxQIGRvZXNuJ3QgY2FsbCB0aGUgZGlydHkgc3RhdGUgcHJvdmlkZXIgYW55bW9yZSBvbmNlIGl0J3MgZGlydHksIGFzIHRoZXkgY2FuJ3Rcblx0XHRcdFx0XHQvLyBjaGFuZ2UgdGhpcyBkdWUgdG8gY29tcGF0aWJpbGl0eSByZWFzb25zIHdlIHNldCBpdCBiYWNrIHRvIG5vdC1kaXJ0eVxuXHRcdFx0XHRcdHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0b0FwcENvbXBvbmVudC5nZXRTaGVsbFNlcnZpY2VzKCkuc2V0RGlydHlGbGFnKGZhbHNlKTtcblx0XHRcdFx0XHR9LCAwKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRzSGFzaFRyYWNrZXIgPSBzTGNsSGFzaFRyYWNrZXI7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gYkRpcnR5O1xuXHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0TG9nLmluZm8oZXJyb3IgYXMgYW55KTtcblx0XHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHRcdH1cblx0XHR9O1xuXHR9XG5cblx0X2F0dGFjaFNlc3Npb25UaW1lb3V0KG9Db250ZXh0OiBhbnksIGkxOG5Nb2RlbDogTW9kZWwpIHtcblx0XHRjb25zdCB0aGF0ID0gdGhpcztcblxuXHRcdHJldHVybiBmdW5jdGlvbiBmbkhhbmRsZVNlc3Npb25UaW1lb3V0KCkge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0aWYgKG9Db250ZXh0ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJDb250ZXh0IG1pc3NpbmcgZm9yIGZ1bmN0aW9uIGZuSGFuZGxlU2Vzc2lvblRpbWVvdXRcIik7XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly8gcmVtb3ZlIHRyYW5zaWVudCBtZXNzYWdlcyBzaW5jZSB3ZSB3aWxsIHNob3dpbmcgb3VyIG93biBtZXNzYWdlXG5cdFx0XHRcdHRoYXQuZ2V0TWVzc2FnZUhhbmRsZXIoKS5yZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblxuXHRcdFx0XHRjb25zdCBvRGlhbG9nID0gbmV3IERpYWxvZyh7XG5cdFx0XHRcdFx0dGl0bGU6IFwie3NhcC5mZS5pMThuPkNfRURJVEZMT1dfT0JKRUNUX1BBR0VfU0VTU0lPTl9FWFBJUkVEX0RJQUxPR19USVRMRX1cIixcblx0XHRcdFx0XHRzdGF0ZTogXCJXYXJuaW5nXCIsXG5cdFx0XHRcdFx0Y29udGVudDogbmV3IFRleHQoeyB0ZXh0OiBcIntzYXAuZmUuaTE4bj5DX0VESVRGTE9XX09CSkVDVF9QQUdFX1NFU1NJT05fRVhQSVJFRF9ESUFMT0dfTUVTU0FHRX1cIiB9KSxcblx0XHRcdFx0XHRiZWdpbkJ1dHRvbjogbmV3IEJ1dHRvbih7XG5cdFx0XHRcdFx0XHR0ZXh0OiBcIntzYXAuZmUuaTE4bj5DX0NPTU1PTl9ESUFMT0dfT0t9XCIsXG5cdFx0XHRcdFx0XHR0eXBlOiBcIkVtcGhhc2l6ZWRcIixcblx0XHRcdFx0XHRcdHByZXNzOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdC8vIHJlbW92ZSBzdGlja3kgaGFuZGxpbmcgYWZ0ZXIgbmF2aWdhdGlvbiBzaW5jZSBzZXNzaW9uIGhhcyBhbHJlYWR5IGJlZW4gdGVybWluYXRlZFxuXHRcdFx0XHRcdFx0XHR0aGF0LmhhbmRsZVN0aWNreU9mZigpO1xuXHRcdFx0XHRcdFx0XHR0aGF0LmdldFJvdXRpbmdMaXN0ZW5lcigpLm5hdmlnYXRlQmFja0Zyb21Db250ZXh0KG9Db250ZXh0KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KSxcblx0XHRcdFx0XHRhZnRlckNsb3NlOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRvRGlhbG9nLmRlc3Ryb3koKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRvRGlhbG9nLmFkZFN0eWxlQ2xhc3MoXCJzYXBVaUNvbnRlbnRQYWRkaW5nXCIpO1xuXHRcdFx0XHRvRGlhbG9nLnNldE1vZGVsKGkxOG5Nb2RlbCwgXCJzYXAuZmUuaTE4blwiKTtcblx0XHRcdFx0dGhhdC5nZXRWaWV3KCkuYWRkRGVwZW5kZW50KG9EaWFsb2cpO1xuXHRcdFx0XHRvRGlhbG9nLm9wZW4oKTtcblx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRcdExvZy5pbmZvKGVycm9yIGFzIGFueSk7XG5cdFx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9O1xuXHR9XG5cblx0X2F0dGFjaFJvdXRlTWF0Y2hlZChvRm5Db250ZXh0OiBhbnksIG9Db250ZXh0OiBhbnksIG9BcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCkge1xuXHRcdHJldHVybiBmdW5jdGlvbiBmblN0aWNreURpc2NhcmRBZnRlck5hdmlnYXRpb24oKSB7XG5cdFx0XHRjb25zdCBzQ3VycmVudEhhc2ggPSBvQXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCkuZ2V0SGFzaCgpO1xuXHRcdFx0Ly8gZWl0aGVyIGN1cnJlbnQgaGFzaCBpcyBlbXB0eSBzbyB0aGUgdXNlciBsZWZ0IHRoZSBhcHAgb3IgaGUgbmF2aWdhdGVkIGF3YXkgZnJvbSB0aGUgb2JqZWN0XG5cdFx0XHRpZiAoIXNDdXJyZW50SGFzaCB8fCAhb0FwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSgpLmNoZWNrSGFzaFdpdGhHdWFyZChzQ3VycmVudEhhc2gpKSB7XG5cdFx0XHRcdG9GbkNvbnRleHQuZGlzY2FyZFN0aWNreVNlc3Npb24ob0NvbnRleHQpO1xuXHRcdFx0fVxuXHRcdH07XG5cdH1cblx0c2Nyb2xsQW5kRm9jdXNPbkluYWN0aXZlUm93KG9UYWJsZTogVGFibGUpIHtcblx0XHRjb25zdCBvUm93QmluZGluZyA9IG9UYWJsZS5nZXRSb3dCaW5kaW5nKCkgYXMgT0RhdGFMaXN0QmluZGluZztcblx0XHRjb25zdCBpQWN0aXZlUm93SW5kZXggPSBvUm93QmluZGluZy5nZXRDb3VudCgpIHx8IDA7XG5cdFx0aWYgKGlBY3RpdmVSb3dJbmRleCA+IDApIHtcblx0XHRcdG9UYWJsZS5zY3JvbGxUb0luZGV4KGlBY3RpdmVSb3dJbmRleCAtIDEpO1xuXHRcdFx0b1RhYmxlLmZvY3VzUm93KGlBY3RpdmVSb3dJbmRleCwgdHJ1ZSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG9UYWJsZS5mb2N1c1JvdyhpQWN0aXZlUm93SW5kZXgsIHRydWUpO1xuXHRcdH1cblx0fVxufVxuXG5leHBvcnQgZGVmYXVsdCBJbnRlcm5hbEVkaXRGbG93O1xuIl19
770
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkludGVybmFsRWRpdEZsb3cudHMiXSwibmFtZXMiOlsiYm9keSIsInJlY292ZXIiLCJyZXN1bHQiLCJlIiwidGhlbiIsIlByb2dyYW1taW5nTW9kZWwiLCJGRUxpYnJhcnkiLCJEcmFmdFN0YXR1cyIsIkVkaXRNb2RlIiwiQ3JlYXRpb25Nb2RlIiwiSW50ZXJuYWxFZGl0RmxvdyIsImRlZmluZVVJNUNsYXNzIiwibWV0aG9kT3ZlcnJpZGUiLCJwcml2YXRlRXh0ZW5zaW9uIiwiZXh0ZW5zaWJsZSIsIk92ZXJyaWRlRXhlY3V0aW9uIiwiQWZ0ZXIiLCJwdWJsaWNFeHRlbnNpb24iLCJmaW5hbEV4dGVuc2lvbiIsIm9uSW5pdCIsIl9vQXBwQ29tcG9uZW50IiwiYmFzZSIsImdldEFwcENvbXBvbmVudCIsInNldENyZWF0aW9uTW9kZSIsImJDcmVhdGlvbk1vZGUiLCJjcmVhdGVNdWx0aXBsZURvY3VtZW50cyIsIm9MaXN0QmluZGluZyIsImFEYXRhIiwiYkNyZWF0ZUF0RW5kIiwiYkZyb21Db3B5UGFzdGUiLCJiZWZvcmVDcmVhdGVDYWxsQmFjayIsImJJbmFjdGl2ZSIsInRyYW5zYWN0aW9uSGVscGVyIiwiZ2V0VHJhbnNhY3Rpb25IZWxwZXIiLCJvTG9ja09iamVjdCIsImdldEdsb2JhbFVJTW9kZWwiLCJvUmVzb3VyY2VCdW5kbGUiLCJnZXRWaWV3IiwiZ2V0Q29udHJvbGxlciIsIkJ1c3lMb2NrZXIiLCJsb2NrIiwiYUZpbmFsQ29udGV4dHMiLCJzeW5jVGFzayIsImNvbnRleHRQYXRoIiwiZ2V0UGF0aCIsIlByb21pc2UiLCJyZXNvbHZlIiwib01vZGVsIiwiZ2V0TW9kZWwiLCJvTWV0YU1vZGVsIiwiZ2V0TWV0YU1vZGVsIiwic01ldGFQYXRoIiwiZ2V0Q29udGV4dCIsImdldE1ldGFQYXRoIiwiaGFuZGxlQ3JlYXRlRXZlbnRzIiwiYUNyZWF0aW9uUHJvbWlzZXMiLCJtYXAiLCJtUHJvcGVydHlWYWx1ZXMiLCJtUGFyYW1ldGVycyIsImRhdGEiLCJrZWVwVHJhbnNpZW50Q29udGV4dE9uRmFpbGVkIiwiYnVzeU1vZGUiLCJjcmVhdGlvbk1vZGUiLCJDcmVhdGlvblJvdyIsInBhcmVudENvbnRyb2wiLCJjcmVhdGVBdEVuZCIsImluYWN0aXZlIiwic1Byb3BlcnR5UGF0aCIsIm9Qcm9wZXJ0eSIsImdldE9iamVjdCIsIiRraW5kIiwiY3JlYXRlRG9jdW1lbnQiLCJnZXRNZXNzYWdlSGFuZGxlciIsImFsbCIsImFDb250ZXh0cyIsIm9OZXdDb250ZXh0IiwiY3JlYXRlZCIsIm9CaW5kaW5nQ29udGV4dCIsImdldEJpbmRpbmdDb250ZXh0IiwiQ29tbW9uVXRpbHMiLCJoYXNUcmFuc2llbnRDb250ZXh0IiwiZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlIiwicmVxdWVzdFNpZGVFZmZlY3RzRm9yTmF2aWdhdGlvblByb3BlcnR5IiwiY2F0Y2giLCJlcnIiLCJMb2ciLCJlcnJvciIsInJlamVjdCIsImZpbmFsbHkiLCJ1bmxvY2siLCJkZWxldGVNdWx0aXBsZURvY3VtZW50cyIsIm9Sb3V0aW5nTGlzdGVuZXIiLCJnZXRSb3V0aW5nTGlzdGVuZXIiLCJvVGFibGUiLCJieUlkIiwiY29udHJvbElkIiwiaXNBIiwiRXJyb3IiLCJnZXRSb3dCaW5kaW5nIiwiYkZpbmRBY3RpdmVDb250ZXh0cyIsIm5hdmlnYXRlQmFja0Zyb21Db250ZXh0IiwiZmluZCIsImNvbnRleHQiLCJpc0N1cnJlbnRTdGF0ZUltcGFjdGVkQnkiLCJkZWxldGVEb2N1bWVudFRyYW5zYWN0aW9uIiwib1Jlc3VsdCIsImNsZWFyU2VsZWN0aW9uIiwiaXNSb290IiwiYXR0YWNoRXZlbnRPbmNlIiwicmVmcmVzaCIsIkVkaXRTdGF0ZSIsInNldEVkaXRTdGF0ZURpcnR5Iiwic2VuZCIsIkFjdGl2aXR5IiwiRGVsZXRlIiwib0Vycm9yIiwiY29tcHV0ZUVkaXRNb2RlIiwib0NvbnRleHQiLCJzQ3VzdG9tQWN0aW9uIiwiZ2V0SW50ZXJuYWxNb2RlbCIsImdldFByb3BlcnR5Iiwic1Byb2dyYW1taW5nTW9kZWwiLCJnZXRQcm9ncmFtbWluZ01vZGVsIiwiRHJhZnQiLCJzZXREcmFmdFN0YXR1cyIsIkNsZWFyIiwicmVxdWVzdE9iamVjdCIsImJJc0FjdGl2ZUVudGl0eSIsInNldEVkaXRNb2RlIiwiRWRpdGFibGUiLCJiSGFzQWN0aXZlRW50aXR5IiwidW5kZWZpbmVkIiwiRGlzcGxheSIsIlN0aWNreSIsIl9oYXNOZXdBY3Rpb25Gb3JTdGlja3kiLCJfYkNyZWF0ZU1vZGUiLCJoYW5kbGVEb2N1bWVudE1vZGlmaWNhdGlvbnMiLCJoYW5kbGVTdGlja3lPbiIsInNldFByb3BlcnR5Iiwic0VkaXRNb2RlIiwib0dsb2JhbE1vZGVsIiwic0RyYWZ0U3RhdGUiLCJfcm91dGluZyIsInZUYXNrIiwiZm5OZXdUYXNrIiwiX3BUYXNrcyIsImludGVybmFsTW9kZWxDb250ZXh0Iiwic2FwIiwidWkiLCJnZXRDb3JlIiwiZGVsZXRlRG9jdW1lbnQiLCJiaW5kIiwiaW50ZXJuYWxNb2RlbCIsIm9CaW5kaW5nIiwiZ2V0QmluZGluZyIsImF0dGFjaEV2ZW50IiwiU2F2aW5nIiwib0V2ZW50IiwiYlN1Y2Nlc3MiLCJnZXRQYXJhbWV0ZXIiLCJTYXZlZCIsInNob3dNZXNzYWdlRGlhbG9nIiwiX29UcmFuc2FjdGlvbkhlbHBlciIsIlRyYW5zYWN0aW9uSGVscGVyIiwiY3JlYXRlQWN0aW9uUHJvbWlzZSIsInNBY3Rpb25OYW1lIiwic0NvbnRyb2xJZCIsImZSZXNvbHZlciIsImZSZWplY3RvciIsIm9BY3Rpb25Qcm9taXNlIiwib1Jlc3BvbnNlIiwiT2JqZWN0IiwiYXNzaWduIiwiZ2V0QWN0aW9uUmVzcG9uc2VEYXRhQW5kS2V5cyIsImdldEN1cnJlbnRBY3Rpb25Qcm9taXNlIiwiZGVsZXRlQ3VycmVudEFjdGlvblByb21pc2UiLCJBcnJheSIsImlzQXJyYXkiLCJsZW5ndGgiLCJvVmlldyIsImdldERhdGEiLCJzQWN0aW9uUmV0dXJuVHlwZSIsIiRSZXR1cm5UeXBlIiwiJFR5cGUiLCJhS2V5IiwiJEtleSIsIm9EYXRhIiwia2V5cyIsIm1lc3NhZ2VIYW5kbGVyIiwib0FwcENvbXBvbmVudCIsImdldFJvdXRlclByb3h5IiwiaGFzTmF2aWdhdGlvbkd1YXJkIiwic0hhc2hUcmFja2VyIiwiZ2V0SGFzaCIsIm9JbnRlcm5hbE1vZGVsIiwic2V0VGltZW91dCIsInNldE5hdmlnYXRpb25HdWFyZCIsInN1YnN0cmluZyIsImdldFNoZWxsU2VydmljZXMiLCJzZXRCYWNrTmF2aWdhdGlvbiIsIm9uQmFja05hdmlnYXRpb25JblNlc3Npb24iLCJmbkRpcnR5U3RhdGVQcm92aWRlciIsIl9yZWdpc3RlckRpcnR5U3RhdGVQcm92aWRlciIsInJlZ2lzdGVyRGlydHlTdGF0ZVByb3ZpZGVyIiwiaTE4bk1vZGVsIiwiZm5IYW5kbGVTZXNzaW9uVGltZW91dCIsIl9hdHRhY2hTZXNzaW9uVGltZW91dCIsImF0dGFjaFNlc3Npb25UaW1lb3V0IiwiZm5TdGlja3lEaXNjYXJkQWZ0ZXJOYXZpZ2F0aW9uIiwiX2F0dGFjaFJvdXRlTWF0Y2hlZCIsImdldFJvdXRpbmdTZXJ2aWNlIiwiYXR0YWNoUm91dGVNYXRjaGVkIiwiaW5mbyIsImhhbmRsZVN0aWNreU9mZiIsImRpc2NhcmROYXZpZ2F0aW9uR3VhcmQiLCJkZXJlZ2lzdGVyRGlydHlTdGF0ZVByb3ZpZGVyIiwiZGV0YWNoU2Vzc2lvblRpbWVvdXQiLCJkZXRhY2hSb3V0ZU1hdGNoZWQiLCJvUm91dGVyUHJveHkiLCJjaGVja0lmQmFja0lzT3V0T2ZHdWFyZCIsInN0aWNreSIsInByb2Nlc3NEYXRhTG9zc0NvbmZpcm1hdGlvbiIsImRpc2NhcmRTdGlja3lTZXNzaW9uIiwiaGlzdG9yeSIsImJhY2siLCJkaXNjYXJkRG9jdW1lbnQiLCJpbmRleE9mIiwib1N0aWNreVNlc3Npb24iLCJOZXdBY3Rpb24iLCJBZGRpdGlvbmFsTmV3QWN0aW9ucyIsInNBZGRpdGlvbmFsQWN0aW9uIiwib05hdmlnYXRpb25Db250ZXh0Iiwic1RhcmdldEhhc2giLCJpbm5lckFwcFJvdXRlIiwic0xjbEhhc2hUcmFja2VyIiwiYkRpcnR5IiwiYlNlc3Npb25PTiIsImlzTmF2aWdhdGlvbkZpbmFsaXplZCIsImNoZWNrSGFzaFdpdGhHdWFyZCIsImlzR3VhcmRDcm9zc0FsbG93ZWRCeVVzZXIiLCJzZXREaXJ0eUZsYWciLCJyZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMiLCJvRGlhbG9nIiwiRGlhbG9nIiwidGl0bGUiLCJzdGF0ZSIsImNvbnRlbnQiLCJUZXh0IiwidGV4dCIsImJlZ2luQnV0dG9uIiwiQnV0dG9uIiwidHlwZSIsInByZXNzIiwiYWZ0ZXJDbG9zZSIsImRlc3Ryb3kiLCJhZGRTdHlsZUNsYXNzIiwic2V0TW9kZWwiLCJhZGREZXBlbmRlbnQiLCJvcGVuIiwib0ZuQ29udGV4dCIsInNDdXJyZW50SGFzaCIsInNjcm9sbEFuZEZvY3VzT25JbmFjdGl2ZVJvdyIsIm9Sb3dCaW5kaW5nIiwiaUFjdGl2ZVJvd0luZGV4IiwiZ2V0Q291bnQiLCJzY3JvbGxUb0luZGV4IiwiZm9jdXNSb3ciLCJDb250cm9sbGVyRXh0ZW5zaW9uIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7QUFnakJPLGtCQUFnQkEsSUFBaEIsRUFBc0JDLE9BQXRCLEVBQStCO0FBQ3JDLFFBQUk7QUFDSCxVQUFJQyxNQUFNLEdBQUdGLElBQUksRUFBakI7QUFDQSxLQUZELENBRUUsT0FBTUcsQ0FBTixFQUFTO0FBQ1YsYUFBT0YsT0FBTyxDQUFDRSxDQUFELENBQWQ7QUFDQTs7QUFDRCxRQUFJRCxNQUFNLElBQUlBLE1BQU0sQ0FBQ0UsSUFBckIsRUFBMkI7QUFDMUIsYUFBT0YsTUFBTSxDQUFDRSxJQUFQLENBQVksS0FBSyxDQUFqQixFQUFvQkgsT0FBcEIsQ0FBUDtBQUNBOztBQUNELFdBQU9DLE1BQVA7QUFDQTs7Ozs7Ozs7QUE3aEJELE1BQU1HLGdCQUFnQixHQUFHQyxTQUFTLENBQUNELGdCQUFuQztBQUFBLE1BQ0NFLFdBQVcsR0FBR0QsU0FBUyxDQUFDQyxXQUR6QjtBQUFBLE1BRUND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QUEsVUFBVSxDQUFDckMsb0JBQVgsQ0FBZ0N6RyxRQUFoQztBQUNBO0FBQ0QsT0FORDtBQU9BLEs7O1dBQ0RnSiwyQixHQUFBLHFDQUE0QnhLLE1BQTVCLEVBQTJDO0FBQzFDLFVBQU15SyxXQUFXLEdBQUd6SyxNQUFNLENBQUNLLGFBQVAsRUFBcEI7QUFDQSxVQUFNcUssZUFBZSxHQUFHRCxXQUFXLENBQUNFLFFBQVosTUFBMEIsQ0FBbEQ7O0FBQ0EsVUFBSUQsZUFBZSxHQUFHLENBQXRCLEVBQXlCO0FBQ3hCMUssUUFBQUEsTUFBTSxDQUFDNEssYUFBUCxDQUFxQkYsZUFBZSxHQUFHLENBQXZDO0FBQ0ExSyxRQUFBQSxNQUFNLENBQUM2SyxRQUFQLENBQWdCSCxlQUFoQixFQUFpQyxJQUFqQztBQUNBLE9BSEQsTUFHTztBQUNOMUssUUFBQUEsTUFBTSxDQUFDNkssUUFBUCxDQUFnQkgsZUFBaEIsRUFBaUMsSUFBakM7QUFDQTtBQUNELEs7OztJQTl2QjZCSSxtQjtTQWl3QmhCalEsZ0IiLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IHR5cGUgQXBwQ29tcG9uZW50IGZyb20gXCJzYXAvZmUvY29yZS9BcHBDb21wb25lbnRcIjtcbmltcG9ydCBDb21tb25VdGlscyBmcm9tIFwic2FwL2ZlL2NvcmUvQ29tbW9uVXRpbHNcIjtcbmltcG9ydCBCdXN5TG9ja2VyIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9CdXN5TG9ja2VyXCI7XG5pbXBvcnQgeyBzZW5kIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2NvbGxhYm9yYXRpb24vQWN0aXZpdHlTeW5jXCI7XG5pbXBvcnQgeyBBY3Rpdml0eSB9IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9jb2xsYWJvcmF0aW9uL0NvbGxhYm9yYXRpb25Db21tb25cIjtcbmltcG9ydCBzdGlja3kgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2VkaXRGbG93L3N0aWNreVwiO1xuaW1wb3J0IFRyYW5zYWN0aW9uSGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9lZGl0Rmxvdy9UcmFuc2FjdGlvbkhlbHBlclwiO1xuaW1wb3J0IHtcblx0ZGVmaW5lVUk1Q2xhc3MsXG5cdGV4dGVuc2libGUsXG5cdGZpbmFsRXh0ZW5zaW9uLFxuXHRtZXRob2RPdmVycmlkZSxcblx0cHJpdmF0ZUV4dGVuc2lvbixcblx0cHVibGljRXh0ZW5zaW9uXG59IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0NsYXNzU3VwcG9ydFwiO1xuaW1wb3J0IEVkaXRTdGF0ZSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9FZGl0U3RhdGVcIjtcbmltcG9ydCBGRUxpYnJhcnkgZnJvbSBcInNhcC9mZS9jb3JlL2xpYnJhcnlcIjtcbmltcG9ydCB0eXBlIFBhZ2VDb250cm9sbGVyIGZyb20gXCJzYXAvZmUvY29yZS9QYWdlQ29udHJvbGxlclwiO1xuaW1wb3J0IEJ1dHRvbiBmcm9tIFwic2FwL20vQnV0dG9uXCI7XG5pbXBvcnQgRGlhbG9nIGZyb20gXCJzYXAvbS9EaWFsb2dcIjtcbmltcG9ydCBUZXh0IGZyb20gXCJzYXAvbS9UZXh0XCI7XG5pbXBvcnQgQ29udHJvbGxlckV4dGVuc2lvbiBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL0NvbnRyb2xsZXJFeHRlbnNpb25cIjtcbmltcG9ydCBPdmVycmlkZUV4ZWN1dGlvbiBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL092ZXJyaWRlRXhlY3V0aW9uXCI7XG5pbXBvcnQgdHlwZSBWaWV3IGZyb20gXCJzYXAvdWkvY29yZS9tdmMvVmlld1wiO1xuaW1wb3J0IHR5cGUgVGFibGUgZnJvbSBcInNhcC91aS9tZGMvVGFibGVcIjtcbmltcG9ydCB0eXBlIEpTT05Nb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL2pzb24vSlNPTk1vZGVsXCI7XG5pbXBvcnQgdHlwZSBNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL01vZGVsXCI7XG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQ29udGV4dFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFMaXN0QmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTGlzdEJpbmRpbmdcIjtcblxuY29uc3QgUHJvZ3JhbW1pbmdNb2RlbCA9IEZFTGlicmFyeS5Qcm9ncmFtbWluZ01vZGVsLFxuXHREcmFmdFN0YXR1cyA9IEZFTGlicmFyeS5EcmFmdFN0YXR1cyxcblx0RWRpdE1vZGUgPSBGRUxpYnJhcnkuRWRpdE1vZGUsXG5cdENyZWF0aW9uTW9kZSA9IEZFTGlicmFyeS5DcmVhdGlvbk1vZGU7XG5cbkBkZWZpbmVVSTVDbGFzcyhcInNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkludGVybmFsRWRpdEZsb3dcIilcbmNsYXNzIEludGVybmFsRWRpdEZsb3cgZXh0ZW5kcyBDb250cm9sbGVyRXh0ZW5zaW9uIHtcblx0cHJvdGVjdGVkIGJhc2UhOiBQYWdlQ29udHJvbGxlcjtcblx0cHJpdmF0ZSBfb0FwcENvbXBvbmVudCE6IEFwcENvbXBvbmVudDtcblx0cHJpdmF0ZSBfcFRhc2tzOiBhbnk7XG5cdHByaXZhdGUgb0FjdGlvblByb21pc2U/OiBQcm9taXNlPGFueT47XG5cdHByaXZhdGUgX29UcmFuc2FjdGlvbkhlbHBlcj86IFRyYW5zYWN0aW9uSGVscGVyO1xuXHRwcml2YXRlIGZuRGlydHlTdGF0ZVByb3ZpZGVyPzogRnVuY3Rpb247XG5cdHByaXZhdGUgZm5IYW5kbGVTZXNzaW9uVGltZW91dD86IEZ1bmN0aW9uO1xuXHRwcml2YXRlIGZuU3RpY2t5RGlzY2FyZEFmdGVyTmF2aWdhdGlvbj86IEZ1bmN0aW9uO1xuXHRAbWV0aG9kT3ZlcnJpZGUoKVxuXHRvbkluaXQoKSB7XG5cdFx0dGhpcy5fb0FwcENvbXBvbmVudCA9IHRoaXMuYmFzZS5nZXRBcHBDb21wb25lbnQoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBPdmVycmlkZSB0byBzZXQgdGhlIGNyZWF0aW9uIG1vZGUuXG5cdCAqXG5cdCAqIEBwYXJhbSBiQ3JlYXRpb25Nb2RlXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5JbnRlcm5hbEVkaXRGbG93XG5cdCAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5JbnRlcm5hbEVkaXRGbG93I3NldENyZWF0aW9uTW9kZVxuXHQgKiBAc2luY2UgMS45MC4wXG5cdCAqL1xuXHRAcHJpdmF0ZUV4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5cdHNldENyZWF0aW9uTW9kZShiQ3JlYXRpb25Nb2RlOiBib29sZWFuKSB7XG5cdFx0Ly8gdG8gYmUgb3ZlcnJpZGRlblxuXHR9XG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRjcmVhdGVNdWx0aXBsZURvY3VtZW50cyhcblx0XHRvTGlzdEJpbmRpbmc6IGFueSxcblx0XHRhRGF0YTogYW55LFxuXHRcdGJDcmVhdGVBdEVuZDogYW55LFxuXHRcdGJGcm9tQ29weVBhc3RlOiBib29sZWFuLFxuXHRcdGJlZm9yZUNyZWF0ZUNhbGxCYWNrOiBhbnksXG5cdFx0YkluYWN0aXZlPzogYm9vbGVhblxuXHQpIHtcblx0XHRjb25zdCB0cmFuc2FjdGlvbkhlbHBlciA9IHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKSxcblx0XHRcdG9Mb2NrT2JqZWN0ID0gdGhpcy5nZXRHbG9iYWxVSU1vZGVsKCksXG5cdFx0XHRvUmVzb3VyY2VCdW5kbGUgPSAodGhpcy5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIGFueSkub1Jlc291cmNlQnVuZGxlO1xuXG5cdFx0QnVzeUxvY2tlci5sb2NrKG9Mb2NrT2JqZWN0KTtcblx0XHRsZXQgYUZpbmFsQ29udGV4dHM6IGFueVtdID0gW107XG5cdFx0cmV0dXJuIHRoaXMuc3luY1Rhc2soKVxuXHRcdFx0LnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRyZXR1cm4gYmVmb3JlQ3JlYXRlQ2FsbEJhY2tcblx0XHRcdFx0XHQ/IGJlZm9yZUNyZWF0ZUNhbGxCYWNrKHsgY29udGV4dFBhdGg6IG9MaXN0QmluZGluZyAmJiBvTGlzdEJpbmRpbmcuZ2V0UGF0aCgpIH0pXG5cdFx0XHRcdFx0OiBQcm9taXNlLnJlc29sdmUoKTtcblx0XHRcdH0pXG5cdFx0XHQudGhlbigoKSA9PiB7XG5cdFx0XHRcdGNvbnN0IG9Nb2RlbCA9IG9MaXN0QmluZGluZy5nZXRNb2RlbCgpLFxuXHRcdFx0XHRcdG9NZXRhTW9kZWwgPSBvTW9kZWwuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0XHRcdGxldCBzTWV0YVBhdGg6IHN0cmluZztcblxuXHRcdFx0XHRpZiAob0xpc3RCaW5kaW5nLmdldENvbnRleHQoKSkge1xuXHRcdFx0XHRcdHNNZXRhUGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgoYCR7b0xpc3RCaW5kaW5nLmdldENvbnRleHQoKS5nZXRQYXRoKCl9LyR7b0xpc3RCaW5kaW5nLmdldFBhdGgoKX1gKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRzTWV0YVBhdGggPSBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKG9MaXN0QmluZGluZy5nZXRQYXRoKCkpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGhpcy5oYW5kbGVDcmVhdGVFdmVudHMob0xpc3RCaW5kaW5nKTtcblxuXHRcdFx0XHQvLyBJdGVyYXRlIG9uIGFsbCBpdGVtcyBhbmQgc3RvcmUgdGhlIGNvcnJlc3BvbmRpbmcgY3JlYXRpb24gcHJvbWlzZVxuXHRcdFx0XHRjb25zdCBhQ3JlYXRpb25Qcm9taXNlcyA9IGFEYXRhLm1hcCgobVByb3BlcnR5VmFsdWVzOiBhbnkpID0+IHtcblx0XHRcdFx0XHRjb25zdCBtUGFyYW1ldGVyczogYW55ID0geyBkYXRhOiB7fSB9O1xuXG5cdFx0XHRcdFx0bVBhcmFtZXRlcnMua2VlcFRyYW5zaWVudENvbnRleHRPbkZhaWxlZCA9IGZhbHNlOyAvLyBjdXJyZW50bHkgbm90IGZ1bGx5IHN1cHBvcnRlZFxuXHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmJ1c3lNb2RlID0gXCJOb25lXCI7XG5cdFx0XHRcdFx0bVBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlID0gQ3JlYXRpb25Nb2RlLkNyZWF0aW9uUm93O1xuXHRcdFx0XHRcdG1QYXJhbWV0ZXJzLnBhcmVudENvbnRyb2wgPSB0aGlzLmdldFZpZXcoKTtcblx0XHRcdFx0XHRtUGFyYW1ldGVycy5jcmVhdGVBdEVuZCA9IGJDcmVhdGVBdEVuZDtcblx0XHRcdFx0XHRtUGFyYW1ldGVycy5pbmFjdGl2ZSA9IGJJbmFjdGl2ZTtcblxuXHRcdFx0XHRcdC8vIFJlbW92ZSBuYXZpZ2F0aW9uIHByb3BlcnRpZXMgYXMgd2UgZG9uJ3Qgc3VwcG9ydCBkZWVwIGNyZWF0ZVxuXHRcdFx0XHRcdGZvciAoY29uc3Qgc1Byb3BlcnR5UGF0aCBpbiBtUHJvcGVydHlWYWx1ZXMpIHtcblx0XHRcdFx0XHRcdGNvbnN0IG9Qcm9wZXJ0eSA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NNZXRhUGF0aH0vJHtzUHJvcGVydHlQYXRofWApO1xuXHRcdFx0XHRcdFx0aWYgKG9Qcm9wZXJ0eSAmJiBvUHJvcGVydHkuJGtpbmQgIT09IFwiTmF2aWdhdGlvblByb3BlcnR5XCIgJiYgbVByb3BlcnR5VmFsdWVzW3NQcm9wZXJ0eVBhdGhdKSB7XG5cdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmRhdGFbc1Byb3BlcnR5UGF0aF0gPSBtUHJvcGVydHlWYWx1ZXNbc1Byb3BlcnR5UGF0aF07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0cmV0dXJuIHRyYW5zYWN0aW9uSGVscGVyLmNyZWF0ZURvY3VtZW50KFxuXHRcdFx0XHRcdFx0b0xpc3RCaW5kaW5nLFxuXHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMsXG5cdFx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGUsXG5cdFx0XHRcdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCksXG5cdFx0XHRcdFx0XHRiRnJvbUNvcHlQYXN0ZSxcblx0XHRcdFx0XHRcdHRoaXMuZ2V0VmlldygpXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0cmV0dXJuIFByb21pc2UuYWxsKGFDcmVhdGlvblByb21pc2VzKTtcblx0XHRcdH0pXG5cdFx0XHQudGhlbihmdW5jdGlvbiAoYUNvbnRleHRzOiBhbnkpIHtcblx0XHRcdFx0Ly8gdHJhbnNpZW50IGNvbnRleHRzIGFyZSByZWxpYWJseSByZW1vdmVkIG9uY2Ugb05ld0NvbnRleHQuY3JlYXRlZCgpIGlzIHJlc29sdmVkXG5cdFx0XHRcdGFGaW5hbENvbnRleHRzID0gYUNvbnRleHRzO1xuXHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5hbGwoXG5cdFx0XHRcdFx0YUNvbnRleHRzLm1hcChmdW5jdGlvbiAob05ld0NvbnRleHQ6IGFueSkge1xuXHRcdFx0XHRcdFx0aWYgKCFvTmV3Q29udGV4dC5iSW5hY3RpdmUpIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIG9OZXdDb250ZXh0LmNyZWF0ZWQoKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KVxuXHRcdFx0XHQpO1xuXHRcdFx0fSlcblx0XHRcdC50aGVuKCgpID0+IHtcblx0XHRcdFx0Y29uc3Qgb0JpbmRpbmdDb250ZXh0ID0gdGhpcy5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoKTtcblxuXHRcdFx0XHQvLyBpZiB0aGVyZSBhcmUgdHJhbnNpZW50IGNvbnRleHRzLCB3ZSBtdXN0IGF2b2lkIHJlcXVlc3Rpbmcgc2lkZSBlZmZlY3RzXG5cdFx0XHRcdC8vIHRoaXMgaXMgYXZvaWQgYSBwb3RlbnRpYWwgbGlzdCByZWZyZXNoLCB0aGVyZSBjb3VsZCBiZSBhIHNpZGUgZWZmZWN0IHRoYXQgcmVmcmVzaGVzIHRoZSBsaXN0IGJpbmRpbmdcblx0XHRcdFx0Ly8gaWYgbGlzdCBiaW5kaW5nIGlzIHJlZnJlc2hlZCwgdHJhbnNpZW50IGNvbnRleHRzIG1pZ2h0IGJlIGxvc3Rcblx0XHRcdFx0aWYgKCFDb21tb25VdGlscy5oYXNUcmFuc2llbnRDb250ZXh0KG9MaXN0QmluZGluZykpIHtcblx0XHRcdFx0XHR0aGlzLl9vQXBwQ29tcG9uZW50XG5cdFx0XHRcdFx0XHQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKClcblx0XHRcdFx0XHRcdC5yZXF1ZXN0U2lkZUVmZmVjdHNGb3JOYXZpZ2F0aW9uUHJvcGVydHkob0xpc3RCaW5kaW5nLmdldFBhdGgoKSwgb0JpbmRpbmdDb250ZXh0IGFzIENvbnRleHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChlcnI6IGFueSkge1xuXHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBjcmVhdGluZyBtdWx0aXBsZSBkb2N1bWVudHMuXCIpO1xuXHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyKTtcblx0XHRcdH0pXG5cdFx0XHQuZmluYWxseShmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdEJ1c3lMb2NrZXIudW5sb2NrKG9Mb2NrT2JqZWN0KTtcblx0XHRcdH0pXG5cdFx0XHQudGhlbigoKSA9PiB7XG5cdFx0XHRcdHJldHVybiBhRmluYWxDb250ZXh0cztcblx0XHRcdH0pO1xuXHR9XG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRkZWxldGVNdWx0aXBsZURvY3VtZW50cyhhQ29udGV4dHM6IGFueSwgbVBhcmFtZXRlcnM6IGFueSkge1xuXHRcdGNvbnN0IG9Sb3V0aW5nTGlzdGVuZXIgPSB0aGlzLmdldFJvdXRpbmdMaXN0ZW5lcigpLFxuXHRcdFx0b0xvY2tPYmplY3QgPSB0aGlzLmdldEdsb2JhbFVJTW9kZWwoKTtcblx0XHRjb25zdCBvVGFibGUgPSB0aGlzLmdldFZpZXcoKS5ieUlkKG1QYXJhbWV0ZXJzLmNvbnRyb2xJZCkgYXMgVGFibGU7XG5cdFx0aWYgKCFvVGFibGUgfHwgIW9UYWJsZS5pc0EoXCJzYXAudWkubWRjLlRhYmxlXCIpKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJwYXJhbWV0ZXIgY29udHJvbElkIG1pc3Npbmcgb3IgaW5jb3JyZWN0XCIpO1xuXHRcdH1cblx0XHRjb25zdCBvTGlzdEJpbmRpbmcgPSBvVGFibGUuZ2V0Um93QmluZGluZygpIGFzIGFueTtcblx0XHRtUGFyYW1ldGVycy5iRmluZEFjdGl2ZUNvbnRleHRzID0gdHJ1ZTtcblx0XHRCdXN5TG9ja2VyLmxvY2sob0xvY2tPYmplY3QpO1xuXG5cdFx0Ly8gQ2hlY2sgaWYgYSBkaXNwbGF5ZWQgdmlldyBjYW4gYmUgaW1wYWN0ZWQgYnkgdGhlIGRlbGV0aW9uLCBpLmUuIGlmIHRoZXJlJ3MgYW4gT1AgZGlzcGxheWluZyBhIGRlbGV0ZWQgb2JqZWN0LlxuXHRcdC8vIFdlIGhhdmUgdG8gY2hlY2sgdGhpcyBiZWZvcmUgdGhlIGNvbnRleHRzIGFyZSBkZWxldGVkIChhZnRlciwgdGhlIGNvbnRleHRzIGFyZSBpbnZhbGlkKVxuXHRcdGNvbnN0IG5hdmlnYXRlQmFja0Zyb21Db250ZXh0ID0gYUNvbnRleHRzLmZpbmQoKGNvbnRleHQ6IGFueSkgPT4ge1xuXHRcdFx0cmV0dXJuIG9Sb3V0aW5nTGlzdGVuZXIuaXNDdXJyZW50U3RhdGVJbXBhY3RlZEJ5KGNvbnRleHQpO1xuXHRcdH0pO1xuXG5cdFx0cmV0dXJuIHRoaXMuZGVsZXRlRG9jdW1lbnRUcmFuc2FjdGlvbihhQ29udGV4dHMsIG1QYXJhbWV0ZXJzKVxuXHRcdFx0LnRoZW4oKCkgPT4ge1xuXHRcdFx0XHRsZXQgb1Jlc3VsdDtcblxuXHRcdFx0XHQvLyBNdWx0aXBsZSBvYmplY3QgZGVsZXRpb24gaXMgdHJpZ2dlcmVkIGZyb20gYSBsaXN0XG5cdFx0XHRcdC8vIEZpcnN0IGNsZWFyIHRoZSBzZWxlY3Rpb24gaW4gdGhlIHRhYmxlIGFzIGl0J3Mgbm90IHZhbGlkIGFueSBtb3JlXG5cdFx0XHRcdChvVGFibGUgYXMgYW55KS5jbGVhclNlbGVjdGlvbigpO1xuXG5cdFx0XHRcdC8vIFRoZW4gcmVmcmVzaCB0aGUgbGlzdC1iaW5kaW5nIChMUiksIG9yIHJlcXVpcmUgc2lkZS1lZmZlY3RzIChPUClcblx0XHRcdFx0Y29uc3Qgb0JpbmRpbmdDb250ZXh0ID0gdGhpcy5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoKTtcblx0XHRcdFx0aWYgKG9MaXN0QmluZGluZy5pc1Jvb3QoKSkge1xuXHRcdFx0XHRcdC8vIGtlZXAgcHJvbWlzZSBjaGFpbiBwZW5kaW5nIHVudGlsIHJlZnJlc2ggb2YgbGlzdGJpbmRpbmcgaXMgY29tcGxldGVkXG5cdFx0XHRcdFx0b1Jlc3VsdCA9IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG5cdFx0XHRcdFx0XHRvTGlzdEJpbmRpbmcuYXR0YWNoRXZlbnRPbmNlKFwiZGF0YVJlY2VpdmVkXCIsIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0cmVzb2x2ZSgpO1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0b0xpc3RCaW5kaW5nLnJlZnJlc2goKTtcblx0XHRcdFx0fSBlbHNlIGlmIChvQmluZGluZ0NvbnRleHQpIHtcblx0XHRcdFx0XHQvLyBpZiB0aGVyZSBhcmUgdHJhbnNpZW50IGNvbnRleHRzLCB3ZSBtdXN0IGF2b2lkIHJlcXVlc3Rpbmcgc2lkZSBlZmZlY3RzXG5cdFx0XHRcdFx0Ly8gdGhpcyBpcyBhdm9pZCBhIHBvdGVudGlhbCBsaXN0IHJlZnJlc2gsIHRoZXJlIGNvdWxkIGJlIGEgc2lkZSBlZmZlY3QgdGhhdCByZWZyZXNoZXMgdGhlIGxpc3QgYmluZGluZ1xuXHRcdFx0XHRcdC8vIGlmIGxpc3QgYmluZGluZyBpcyByZWZyZXNoZWQsIHRyYW5zaWVudCBjb250ZXh0cyBtaWdodCBiZSBsb3N0XG5cdFx0XHRcdFx0aWYgKCFDb21tb25VdGlscy5oYXNUcmFuc2llbnRDb250ZXh0KG9MaXN0QmluZGluZykpIHtcblx0XHRcdFx0XHRcdHRoaXMuX29BcHBDb21wb25lbnRcblx0XHRcdFx0XHRcdFx0LmdldFNpZGVFZmZlY3RzU2VydmljZSgpXG5cdFx0XHRcdFx0XHRcdC5yZXF1ZXN0U2lkZUVmZmVjdHNGb3JOYXZpZ2F0aW9uUHJvcGVydHkob0xpc3RCaW5kaW5nLmdldFBhdGgoKSwgb0JpbmRpbmdDb250ZXh0IGFzIENvbnRleHQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIGRlbGV0aW5nIGF0IGxlYXN0IG9uZSBvYmplY3Qgc2hvdWxkIGFsc28gc2V0IHRoZSBVSSB0byBkaXJ0eVxuXHRcdFx0XHRFZGl0U3RhdGUuc2V0RWRpdFN0YXRlRGlydHkoKTtcblxuXHRcdFx0XHRzZW5kKFxuXHRcdFx0XHRcdHRoaXMuZ2V0VmlldygpLFxuXHRcdFx0XHRcdEFjdGl2aXR5LkRlbGV0ZSxcblx0XHRcdFx0XHRhQ29udGV4dHMubWFwKChjb250ZXh0OiBDb250ZXh0KSA9PiBjb250ZXh0LmdldFBhdGgoKSlcblx0XHRcdFx0KTtcblxuXHRcdFx0XHQvLyBOYXZpZ2F0ZSBiYWNrIGZyb20gYSBkZWxldGVkIGNvbnRleHQgaWYgbmVlZGVkXG5cdFx0XHRcdGlmIChuYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dCkge1xuXHRcdFx0XHRcdG9Sb3V0aW5nTGlzdGVuZXIubmF2aWdhdGVCYWNrRnJvbUNvbnRleHQobmF2aWdhdGVCYWNrRnJvbUNvbnRleHQpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIG9SZXN1bHQ7XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBkZWxldGluZyB0aGUgZG9jdW1lbnQocylcIiwgb0Vycm9yKTtcblx0XHRcdH0pXG5cdFx0XHQuZmluYWxseShmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdEJ1c3lMb2NrZXIudW5sb2NrKG9Mb2NrT2JqZWN0KTtcblx0XHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIERlY2lkZXMgaWYgYSBkb2N1bWVudCBpcyB0byBiZSBzaG93biBpbiBkaXNwbGF5IG9yIGVkaXQgbW9kZS5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIF9jb21wdXRlRWRpdE1vZGVcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkludGVybmFsRWRpdEZsb3dcblx0ICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dH0gb0NvbnRleHQgVGhlIGNvbnRleHQgdG8gYmUgZGlzcGxheWVkIG9yIGVkaXRlZFxuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX0gUHJvbWlzZSByZXNvbHZlcyBvbmNlIHRoZSBlZGl0IG1vZGUgaXMgY29tcHV0ZWRcblx0ICovXG5cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGFzeW5jIGNvbXB1dGVFZGl0TW9kZShvQ29udGV4dDogYW55KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3Qgc0N1c3RvbUFjdGlvbiA9IHRoaXMuZ2V0SW50ZXJuYWxNb2RlbCgpLmdldFByb3BlcnR5KFwiL3NDdXN0b21BY3Rpb25cIik7XG5cdFx0Y29uc3Qgc1Byb2dyYW1taW5nTW9kZWwgPSB0aGlzLmdldFByb2dyYW1taW5nTW9kZWwob0NvbnRleHQpO1xuXG5cdFx0aWYgKHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0KSB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHR0aGlzLnNldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLkNsZWFyKTtcblxuXHRcdFx0XHRjb25zdCBiSXNBY3RpdmVFbnRpdHkgPSBhd2FpdCBvQ29udGV4dC5yZXF1ZXN0T2JqZWN0KFwiSXNBY3RpdmVFbnRpdHlcIik7XG5cdFx0XHRcdGlmIChiSXNBY3RpdmVFbnRpdHkgPT09IGZhbHNlKSB7XG5cdFx0XHRcdFx0Ly8gaW4gY2FzZSB0aGUgZG9jdW1lbnQgaXMgZHJhZnQgc2V0IGl0IGluIGVkaXQgbW9kZVxuXHRcdFx0XHRcdHRoaXMuc2V0RWRpdE1vZGUoRWRpdE1vZGUuRWRpdGFibGUpO1xuXHRcdFx0XHRcdGNvbnN0IGJIYXNBY3RpdmVFbnRpdHkgPSBhd2FpdCBvQ29udGV4dC5yZXF1ZXN0T2JqZWN0KFwiSGFzQWN0aXZlRW50aXR5XCIpO1xuXHRcdFx0XHRcdHRoaXMuc2V0RWRpdE1vZGUodW5kZWZpbmVkLCAhYkhhc0FjdGl2ZUVudGl0eSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gYWN0aXZlIGRvY3VtZW50LCBzdGF5IG9uIGRpc3BsYXkgbW9kZVxuXHRcdFx0XHRcdHRoaXMuc2V0RWRpdE1vZGUoRWRpdE1vZGUuRGlzcGxheSwgZmFsc2UpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGNhdGNoIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBkZXRlcm1pbmluZyB0aGUgZWRpdE1vZGUgZm9yIGRyYWZ0XCIsIG9FcnJvcik7XG5cdFx0XHRcdHRocm93IG9FcnJvcjtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSkge1xuXHRcdFx0aWYgKHNDdXN0b21BY3Rpb24gJiYgc0N1c3RvbUFjdGlvbiAhPT0gXCJcIiAmJiB0aGlzLl9oYXNOZXdBY3Rpb25Gb3JTdGlja3kob0NvbnRleHQsIHRoaXMuZ2V0VmlldygpLCBzQ3VzdG9tQWN0aW9uKSkge1xuXHRcdFx0XHR0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCkuX2JDcmVhdGVNb2RlID0gdHJ1ZTtcblx0XHRcdFx0dGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpLmhhbmRsZURvY3VtZW50TW9kaWZpY2F0aW9ucygpO1xuXHRcdFx0XHR0aGlzLnNldEVkaXRNb2RlKEVkaXRNb2RlLkVkaXRhYmxlLCB0cnVlKTtcblx0XHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cdFx0XHRcdHRoaXMuaGFuZGxlU3RpY2t5T24ob0NvbnRleHQpO1xuXHRcdFx0XHR0aGlzLmdldEludGVybmFsTW9kZWwoKS5zZXRQcm9wZXJ0eShcIi9zQ3VzdG9tQWN0aW9uXCIsIFwiXCIpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBlZGl0IG1vZGUuXG5cdCAqXG5cdCAqIEBwYXJhbSBzRWRpdE1vZGVcblx0ICogQHBhcmFtIGJDcmVhdGlvbk1vZGUgQ3JlYXRlTW9kZSBmbGFnIHRvIGlkZW50aWZ5IHRoZSBjcmVhdGlvbiBtb2RlXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0c2V0RWRpdE1vZGUoc0VkaXRNb2RlPzogc3RyaW5nLCBiQ3JlYXRpb25Nb2RlPzogYm9vbGVhbikge1xuXHRcdC8vIGF0IHRoaXMgcG9pbnQgb2YgdGltZSBpdCdzIG5vdCBtZWFudCB0byByZWxlYXNlIHRoZSBlZGl0IGZsb3cgZm9yIGZyZWVzdHlsZSB1c2FnZSB0aGVyZWZvcmUgd2UgY2FuXG5cdFx0Ly8gcmVseSBvbiB0aGUgZ2xvYmFsIFVJIG1vZGVsIHRvIGV4aXN0XG5cdFx0Y29uc3Qgb0dsb2JhbE1vZGVsID0gdGhpcy5nZXRHbG9iYWxVSU1vZGVsKCk7XG5cblx0XHRpZiAoc0VkaXRNb2RlKSB7XG5cdFx0XHRvR2xvYmFsTW9kZWwuc2V0UHJvcGVydHkoXCIvaXNFZGl0YWJsZVwiLCBzRWRpdE1vZGUgPT09IFwiRWRpdGFibGVcIiwgdW5kZWZpbmVkLCB0cnVlKTtcblx0XHR9XG5cblx0XHRpZiAoYkNyZWF0aW9uTW9kZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHQvLyBTaW5jZSBzZXRDcmVhdGlvbk1vZGUgaXMgcHVibGljIGluIEVkaXRGbG93IGFuZCBjYW4gYmUgb3ZlcnJpZGVuLCBtYWtlIHN1cmUgdG8gY2FsbCBpdCB2aWEgdGhlIGNvbnRyb2xsZXJcblx0XHRcdC8vIHRvIGVuc3VyZSBhbnkgb3ZlcnJpZGVzIGFyZSB0YWtlbiBpbnRvIGFjY291bnRcblx0XHRcdHRoaXMuc2V0Q3JlYXRpb25Nb2RlKGJDcmVhdGlvbk1vZGUpO1xuXHRcdH1cblx0fVxuXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRzZXREcmFmdFN0YXR1cyhzRHJhZnRTdGF0ZTogYW55KSB7XG5cdFx0Ly8gYXQgdGhpcyBwb2ludCBvZiB0aW1lIGl0J3Mgbm90IG1lYW50IHRvIHJlbGVhc2UgdGhlIGVkaXQgZmxvdyBmb3IgZnJlZXN0eWxlIHVzYWdlIHRoZXJlZm9yZSB3ZSBjYW5cblx0XHQvLyByZWx5IG9uIHRoZSBnbG9iYWwgVUkgbW9kZWwgdG8gZXhpc3Rcblx0XHQodGhpcy5iYXNlLmdldFZpZXcoKS5nZXRNb2RlbChcInVpXCIpIGFzIEpTT05Nb2RlbCkuc2V0UHJvcGVydHkoXCIvZHJhZnRTdGF0dXNcIiwgc0RyYWZ0U3RhdGUsIHVuZGVmaW5lZCwgdHJ1ZSk7XG5cdH1cblxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0Z2V0Um91dGluZ0xpc3RlbmVyKCkge1xuXHRcdC8vIGF0IHRoaXMgcG9pbnQgb2YgdGltZSBpdCdzIG5vdCBtZWFudCB0byByZWxlYXNlIHRoZSBlZGl0IGZsb3cgZm9yIEZQTSBjdXN0b20gcGFnZXMgYW5kIHRoZSByb3V0aW5nXG5cdFx0Ly8gbGlzdGVuZXIgaXMgbm90IHlldCBwdWJsaWMgdGhlcmVmb3JlIGtlZXAgdGhlIGxvZ2ljIGhlcmUgZm9yIG5vd1xuXG5cdFx0aWYgKHRoaXMuYmFzZS5fcm91dGluZykge1xuXHRcdFx0cmV0dXJuIHRoaXMuYmFzZS5fcm91dGluZztcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiRWRpdCBGbG93IHdvcmtzIG9ubHkgd2l0aCBhIGdpdmVuIHJvdXRpbmcgbGlzdGVuZXJcIik7XG5cdFx0fVxuXHR9XG5cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGdldEdsb2JhbFVJTW9kZWwoKTogSlNPTk1vZGVsIHtcblx0XHQvLyBhdCB0aGlzIHBvaW50IG9mIHRpbWUgaXQncyBub3QgbWVhbnQgdG8gcmVsZWFzZSB0aGUgZWRpdCBmbG93IGZvciBmcmVlc3R5bGUgdXNhZ2UgdGhlcmVmb3JlIHdlIGNhblxuXHRcdC8vIHJlbHkgb24gdGhlIGdsb2JhbCBVSSBtb2RlbCB0byBleGlzdFxuXHRcdHJldHVybiB0aGlzLmJhc2UuZ2V0VmlldygpLmdldE1vZGVsKFwidWlcIikgYXMgSlNPTk1vZGVsO1xuXHR9XG5cblx0LyoqXG5cdCAqIFBlcmZvcm1zIGEgdGFzayBpbiBzeW5jIHdpdGggb3RoZXIgdGFza3MgY3JlYXRlZCB2aWEgdGhpcyBmdW5jdGlvbi5cblx0ICogUmV0dXJucyB0aGUgcHJvbWlzZSBjaGFpbiBvZiB0aGUgdGFzay5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93I3N5bmNUYXNrXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0Rmxvd1xuXHQgKiBAc3RhdGljXG5cdCAqIEBwYXJhbSBbdlRhc2tdIE9wdGlvbmFsLCBhIHByb21pc2Ugb3IgZnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQgc3luY2hyb25vdXNseVxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIG9uY2UgdGhlIHRhc2sgaXMgY29tcGxldGVkXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAZmluYWxcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRzeW5jVGFzayh2VGFzaz86IEZ1bmN0aW9uIHwgUHJvbWlzZTxhbnk+KSB7XG5cdFx0bGV0IGZuTmV3VGFzaztcblx0XHRpZiAodlRhc2sgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG5cdFx0XHRmbk5ld1Rhc2sgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHJldHVybiB2VGFzaztcblx0XHRcdH07XG5cdFx0fSBlbHNlIGlmICh0eXBlb2YgdlRhc2sgPT09IFwiZnVuY3Rpb25cIikge1xuXHRcdFx0Zm5OZXdUYXNrID0gdlRhc2s7XG5cdFx0fVxuXG5cdFx0dGhpcy5fcFRhc2tzID0gdGhpcy5fcFRhc2tzIHx8IFByb21pc2UucmVzb2x2ZSgpO1xuXHRcdGlmIChmbk5ld1Rhc2spIHtcblx0XHRcdHRoaXMuX3BUYXNrcyA9IHRoaXMuX3BUYXNrcy50aGVuKGZuTmV3VGFzaykuY2F0Y2goZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5fcFRhc2tzO1xuXHR9XG5cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGdldFByb2dyYW1taW5nTW9kZWwob0NvbnRleHQ/OiBhbnkpOiB0eXBlb2YgUHJvZ3JhbW1pbmdNb2RlbCB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKS5nZXRQcm9ncmFtbWluZ01vZGVsKG9Db250ZXh0KTtcblx0fVxuXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRkZWxldGVEb2N1bWVudFRyYW5zYWN0aW9uKG9Db250ZXh0OiBhbnksIG1QYXJhbWV0ZXJzOiBhbnkpIHtcblx0XHRjb25zdCBvUmVzb3VyY2VCdW5kbGUgPSAodGhpcy5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIGFueSkub1Jlc291cmNlQnVuZGxlLFxuXHRcdFx0dHJhbnNhY3Rpb25IZWxwZXIgPSB0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCk7XG5cblx0XHRtUGFyYW1ldGVycyA9IG1QYXJhbWV0ZXJzIHx8IHt9O1xuXG5cdFx0Ly8gVE9ETzogdGhpcyBzZXR0aW5nIGFuZCByZW1vdmluZyBvZiBjb250ZXh0cyBzaG91bGRuJ3QgYmUgaW4gdGhlIHRyYW5zYWN0aW9uIGhlbHBlciBhdCBhbGxcblx0XHQvLyBmb3IgdGhlIHRpbWUgYmVpbmcgSSBrZXB0IGl0IGFuZCBwcm92aWRlIHRoZSBpbnRlcm5hbCBtb2RlbCBjb250ZXh0IHRvIG5vdCBicmVhayBzb21ldGhpbmdcblx0XHRtUGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dCA9IG1QYXJhbWV0ZXJzLmNvbnRyb2xJZFxuXHRcdFx0PyBzYXAudWkuZ2V0Q29yZSgpLmJ5SWQobVBhcmFtZXRlcnMuY29udHJvbElkKT8uZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKVxuXHRcdFx0OiBudWxsO1xuXG5cdFx0cmV0dXJuIHRoaXMuc3luY1Rhc2soKVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdHRyYW5zYWN0aW9uSGVscGVyLmRlbGV0ZURvY3VtZW50LmJpbmQodHJhbnNhY3Rpb25IZWxwZXIsIG9Db250ZXh0LCBtUGFyYW1ldGVycywgb1Jlc291cmNlQnVuZGxlLCB0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkpXG5cdFx0XHQpXG5cdFx0XHQudGhlbigoKSA9PiB7XG5cdFx0XHRcdGNvbnN0IGludGVybmFsTW9kZWwgPSB0aGlzLmdldEludGVybmFsTW9kZWwoKTtcblx0XHRcdFx0aW50ZXJuYWxNb2RlbC5zZXRQcm9wZXJ0eShcIi9zZXNzaW9uT25cIiwgZmFsc2UpO1xuXHRcdFx0XHRpbnRlcm5hbE1vZGVsLnNldFByb3BlcnR5KFwiL3N0aWNreVNlc3Npb25Ub2tlblwiLCB1bmRlZmluZWQpO1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KG9FcnJvcik7XG5cdFx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBIYW5kbGVzIHRoZSBjcmVhdGUgZXZlbnQ6IHNob3dzIG1lc3NhZ2VzIGFuZCBpbiBjYXNlIG9mIGEgZHJhZnQsIHVwZGF0ZXMgdGhlIGRyYWZ0IGluZGljYXRvci5cblx0ICpcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XG5cdCAqIEBwYXJhbSBvQmluZGluZyBPRGF0YSBsaXN0IGJpbmRpbmcgb2JqZWN0XG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0aGFuZGxlQ3JlYXRlRXZlbnRzKG9CaW5kaW5nOiBhbnkpIHtcblx0XHRjb25zdCB0cmFuc2FjdGlvbkhlbHBlciA9IHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKTtcblxuXHRcdHRoaXMuc2V0RHJhZnRTdGF0dXMoRHJhZnRTdGF0dXMuQ2xlYXIpO1xuXG5cdFx0b0JpbmRpbmcgPSAob0JpbmRpbmcuZ2V0QmluZGluZyAmJiBvQmluZGluZy5nZXRCaW5kaW5nKCkpIHx8IG9CaW5kaW5nO1xuXHRcdGNvbnN0IHNQcm9ncmFtbWluZ01vZGVsID0gdGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKG9CaW5kaW5nKTtcblxuXHRcdG9CaW5kaW5nLmF0dGFjaEV2ZW50KFwiY3JlYXRlU2VudFwiLCAoKSA9PiB7XG5cdFx0XHR0cmFuc2FjdGlvbkhlbHBlci5oYW5kbGVEb2N1bWVudE1vZGlmaWNhdGlvbnMoKTtcblx0XHRcdGlmIChzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCkge1xuXHRcdFx0XHR0aGlzLnNldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLlNhdmluZyk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0b0JpbmRpbmcuYXR0YWNoRXZlbnQoXCJjcmVhdGVDb21wbGV0ZWRcIiwgKG9FdmVudDogYW55KSA9PiB7XG5cdFx0XHRjb25zdCBiU3VjY2VzcyA9IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJzdWNjZXNzXCIpO1xuXHRcdFx0aWYgKHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0KSB7XG5cdFx0XHRcdHRoaXMuc2V0RHJhZnRTdGF0dXMoYlN1Y2Nlc3MgPyBEcmFmdFN0YXR1cy5TYXZlZCA6IERyYWZ0U3RhdHVzLkNsZWFyKTtcblx0XHRcdH1cblx0XHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKS5zaG93TWVzc2FnZURpYWxvZygpO1xuXHRcdH0pO1xuXHR9XG5cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGdldFRyYW5zYWN0aW9uSGVscGVyKCkge1xuXHRcdGlmICghdGhpcy5fb1RyYW5zYWN0aW9uSGVscGVyKSB7XG5cdFx0XHQvLyBjdXJyZW50bHkgYWxzbyB0aGUgdHJhbnNhY3Rpb24gaGVscGVyIGlzIGxvY2tpbmcgdGhlcmVmb3JlIHBhc3NpbmcgbG9jayBvYmplY3Rcblx0XHRcdHRoaXMuX29UcmFuc2FjdGlvbkhlbHBlciA9IG5ldyBUcmFuc2FjdGlvbkhlbHBlcih0aGlzLl9vQXBwQ29tcG9uZW50LCB0aGlzLmdldEdsb2JhbFVJTW9kZWwoKSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuX29UcmFuc2FjdGlvbkhlbHBlcjtcblx0fVxuXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRnZXRJbnRlcm5hbE1vZGVsKCk6IEpTT05Nb2RlbCB7XG5cdFx0cmV0dXJuIHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJpbnRlcm5hbFwiKSBhcyBKU09OTW9kZWw7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIG5ldyBwcm9taXNlIHRvIHdhaXQgZm9yIGFuIGFjdGlvbiB0byBiZSBleGVjdXRlZFxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgX2NyZWF0ZUFjdGlvblByb21pc2Vcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XG5cdCAqIEByZXR1cm5zIHtGdW5jdGlvbn0gVGhlIHJlc29sdmVyIGZ1bmN0aW9uIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGV4dGVybmFsbHkgcmVzb2x2ZSB0aGUgcHJvbWlzZVxuXHQgKi9cblxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0Y3JlYXRlQWN0aW9uUHJvbWlzZShzQWN0aW9uTmFtZTogYW55LCBzQ29udHJvbElkOiBhbnkpIHtcblx0XHRsZXQgZlJlc29sdmVyLCBmUmVqZWN0b3I7XG5cdFx0dGhpcy5vQWN0aW9uUHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRcdGZSZXNvbHZlciA9IHJlc29sdmU7XG5cdFx0XHRmUmVqZWN0b3IgPSByZWplY3Q7XG5cdFx0fSkudGhlbigob1Jlc3BvbnNlOiBhbnkpID0+IHtcblx0XHRcdHJldHVybiBPYmplY3QuYXNzaWduKHsgY29udHJvbElkOiBzQ29udHJvbElkIH0sIHRoaXMuZ2V0QWN0aW9uUmVzcG9uc2VEYXRhQW5kS2V5cyhzQWN0aW9uTmFtZSwgb1Jlc3BvbnNlKSk7XG5cdFx0fSk7XG5cdFx0cmV0dXJuIHsgZlJlc29sdmVyOiBmUmVzb2x2ZXIsIGZSZWplY3RvcjogZlJlamVjdG9yIH07XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgZ2V0Q3VycmVudEFjdGlvblByb21pc2Ugb2JqZWN0LlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgX2dldEN1cnJlbnRBY3Rpb25Qcm9taXNlXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0Rmxvd1xuXHQgKiBAcmV0dXJucyBSZXR1cm5zIHRoZSBwcm9taXNlXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0Z2V0Q3VycmVudEFjdGlvblByb21pc2UoKSB7XG5cdFx0cmV0dXJuIHRoaXMub0FjdGlvblByb21pc2U7XG5cdH1cblxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0ZGVsZXRlQ3VycmVudEFjdGlvblByb21pc2UoKSB7XG5cdFx0dGhpcy5vQWN0aW9uUHJvbWlzZSA9IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgZ2V0QWN0aW9uUmVzcG9uc2VEYXRhQW5kS2V5c1xuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQHBhcmFtIHNBY3Rpb25OYW1lIFRoZSBuYW1lIG9mIHRoZSBhY3Rpb24gdGhhdCBpcyBleGVjdXRlZFxuXHQgKiBAcGFyYW0gb1Jlc3BvbnNlIFRoZSBib3VuZCBhY3Rpb24ncyByZXNwb25zZSBkYXRhIG9yIHJlc3BvbnNlIGNvbnRleHRcblx0ICogQHJldHVybnMgT2JqZWN0IHdpdGggZGF0YSBhbmQgbmFtZXMgb2YgdGhlIGtleSBmaWVsZHMgb2YgdGhlIHJlc3BvbnNlXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0Z2V0QWN0aW9uUmVzcG9uc2VEYXRhQW5kS2V5cyhzQWN0aW9uTmFtZTogc3RyaW5nLCBvUmVzcG9uc2U6IGFueSkge1xuXHRcdGlmIChBcnJheS5pc0FycmF5KG9SZXNwb25zZSkpIHtcblx0XHRcdGlmIChvUmVzcG9uc2UubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRcdG9SZXNwb25zZSA9IG9SZXNwb25zZVswXTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybiBudWxsO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAoIW9SZXNwb25zZSkge1xuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fVxuXHRcdGNvbnN0IG9WaWV3ID0gdGhpcy5nZXRWaWV3KCksXG5cdFx0XHRvTWV0YU1vZGVsID0gKG9WaWV3LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCkgYXMgYW55KS5nZXREYXRhKCksXG5cdFx0XHRzQWN0aW9uUmV0dXJuVHlwZSA9XG5cdFx0XHRcdG9NZXRhTW9kZWwgJiYgb01ldGFNb2RlbFtzQWN0aW9uTmFtZV0gJiYgb01ldGFNb2RlbFtzQWN0aW9uTmFtZV1bMF0gJiYgb01ldGFNb2RlbFtzQWN0aW9uTmFtZV1bMF0uJFJldHVyblR5cGVcblx0XHRcdFx0XHQ/IG9NZXRhTW9kZWxbc0FjdGlvbk5hbWVdWzBdLiRSZXR1cm5UeXBlLiRUeXBlXG5cdFx0XHRcdFx0OiBudWxsLFxuXHRcdFx0YUtleSA9IHNBY3Rpb25SZXR1cm5UeXBlICYmIG9NZXRhTW9kZWxbc0FjdGlvblJldHVyblR5cGVdID8gb01ldGFNb2RlbFtzQWN0aW9uUmV0dXJuVHlwZV0uJEtleSA6IG51bGw7XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0b0RhdGE6IG9SZXNwb25zZS5nZXRPYmplY3QoKSxcblx0XHRcdGtleXM6IGFLZXlcblx0XHR9O1xuXHR9XG5cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGdldE1lc3NhZ2VIYW5kbGVyKCkge1xuXHRcdC8vIGF0IHRoaXMgcG9pbnQgb2YgdGltZSBpdCdzIG5vdCBtZWFudCB0byByZWxlYXNlIHRoZSBlZGl0IGZsb3cgZm9yIEZQTSBjdXN0b20gcGFnZXMgdGhlcmVmb3JlIGtlZXBcblx0XHQvLyB0aGUgbG9naWMgaGVyZSBmb3Igbm93XG5cblx0XHRpZiAodGhpcy5iYXNlLm1lc3NhZ2VIYW5kbGVyKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5iYXNlLm1lc3NhZ2VIYW5kbGVyO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJFZGl0IEZsb3cgd29ya3Mgb25seSB3aXRoIGEgZ2l2ZW4gbWVzc2FnZSBoYW5kbGVyXCIpO1xuXHRcdH1cblx0fVxuXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRoYW5kbGVTdGlja3lPbihvQ29udGV4dDogQ29udGV4dCkge1xuXHRcdGNvbnN0IG9BcHBDb21wb25lbnQgPSBDb21tb25VdGlscy5nZXRBcHBDb21wb25lbnQodGhpcy5nZXRWaWV3KCkpO1xuXG5cdFx0dHJ5IHtcblx0XHRcdGlmIChvQXBwQ29tcG9uZW50ID09PSB1bmRlZmluZWQgfHwgb0NvbnRleHQgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJ1bmRlZmluZWQgQXBwQ29tcG9uZW50IG9yIENvbnRleHQgZm9yIGZ1bmN0aW9uIGhhbmRsZVN0aWNreU9uXCIpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIW9BcHBDb21wb25lbnQuZ2V0Um91dGVyUHJveHkoKS5oYXNOYXZpZ2F0aW9uR3VhcmQoKSkge1xuXHRcdFx0XHRjb25zdCBzSGFzaFRyYWNrZXIgPSBvQXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCkuZ2V0SGFzaCgpLFxuXHRcdFx0XHRcdG9JbnRlcm5hbE1vZGVsID0gdGhpcy5nZXRJbnRlcm5hbE1vZGVsKCk7XG5cblx0XHRcdFx0Ly8gU2V0IGEgZ3VhcmQgaW4gdGhlIFJvdXRlclByb3h5XG5cdFx0XHRcdC8vIEEgdGltZW91dCBpcyBuZWNlc3NhcnksIGFzIHdpdGggZGVmZXJyZWQgY3JlYXRpb24gdGhlIGhhc2hDaGFuZ2VyIGlzIG5vdCB1cGRhdGVkIHlldCB3aXRoXG5cdFx0XHRcdC8vIHRoZSBuZXcgaGFzaCwgYW5kIHRoZSBndWFyZCBjYW5ub3QgYmUgZm91bmQgaW4gdGhlIG1hbmFnZWQgaGlzdG9yeSBvZiB0aGUgcm91dGVyIHByb3h5XG5cdFx0XHRcdHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdG9BcHBDb21wb25lbnQuZ2V0Um91dGVyUHJveHkoKS5zZXROYXZpZ2F0aW9uR3VhcmQob0NvbnRleHQuZ2V0UGF0aCgpLnN1YnN0cmluZygxKSk7XG5cdFx0XHRcdH0sIDApO1xuXG5cdFx0XHRcdC8vIFNldHRpbmcgYmFjayBuYXZpZ2F0aW9uIG9uIHNoZWxsIHNlcnZpY2UsIHRvIGdldCB0aGUgZGljYXJkIG1lc3NhZ2UgYm94IGluIGNhc2Ugb2Ygc3RpY2t5XG5cdFx0XHRcdG9BcHBDb21wb25lbnQuZ2V0U2hlbGxTZXJ2aWNlcygpLnNldEJhY2tOYXZpZ2F0aW9uKHRoaXMub25CYWNrTmF2aWdhdGlvbkluU2Vzc2lvbi5iaW5kKHRoaXMpKTtcblxuXHRcdFx0XHR0aGlzLmZuRGlydHlTdGF0ZVByb3ZpZGVyID0gdGhpcy5fcmVnaXN0ZXJEaXJ0eVN0YXRlUHJvdmlkZXIob0FwcENvbXBvbmVudCwgb0ludGVybmFsTW9kZWwsIHNIYXNoVHJhY2tlcik7XG5cdFx0XHRcdG9BcHBDb21wb25lbnQuZ2V0U2hlbGxTZXJ2aWNlcygpLnJlZ2lzdGVyRGlydHlTdGF0ZVByb3ZpZGVyKHRoaXMuZm5EaXJ0eVN0YXRlUHJvdmlkZXIpO1xuXG5cdFx0XHRcdC8vIGhhbmRsZSBzZXNzaW9uIHRpbWVvdXRcblx0XHRcdFx0Y29uc3QgaTE4bk1vZGVsID0gdGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJzYXAuZmUuaTE4blwiKTtcblx0XHRcdFx0dGhpcy5mbkhhbmRsZVNlc3Npb25UaW1lb3V0ID0gdGhpcy5fYXR0YWNoU2Vzc2lvblRpbWVvdXQob0NvbnRleHQsIGkxOG5Nb2RlbCk7XG5cdFx0XHRcdCh0aGlzLmdldFZpZXcoKS5nZXRNb2RlbCgpIGFzIGFueSkuYXR0YWNoU2Vzc2lvblRpbWVvdXQodGhpcy5mbkhhbmRsZVNlc3Npb25UaW1lb3V0KTtcblxuXHRcdFx0XHR0aGlzLmZuU3RpY2t5RGlzY2FyZEFmdGVyTmF2aWdhdGlvbiA9IHRoaXMuX2F0dGFjaFJvdXRlTWF0Y2hlZCh0aGlzLCBvQ29udGV4dCwgb0FwcENvbXBvbmVudCk7XG5cdFx0XHRcdG9BcHBDb21wb25lbnQuZ2V0Um91dGluZ1NlcnZpY2UoKS5hdHRhY2hSb3V0ZU1hdGNoZWQodGhpcy5mblN0aWNreURpc2NhcmRBZnRlck5hdmlnYXRpb24pO1xuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRMb2cuaW5mbyhlcnJvciBhcyBhbnkpO1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0aGFuZGxlU3RpY2t5T2ZmKCkge1xuXHRcdGNvbnN0IG9BcHBDb21wb25lbnQgPSBDb21tb25VdGlscy5nZXRBcHBDb21wb25lbnQodGhpcy5nZXRWaWV3KCkpO1xuXHRcdHRyeSB7XG5cdFx0XHRpZiAob0FwcENvbXBvbmVudCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcInVuZGVmaW5lZCBBcHBDb21wb25lbnQgZm9yIGZ1bmN0aW9uIGhhbmRsZVN0aWNreU9mZlwiKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKG9BcHBDb21wb25lbnQgJiYgb0FwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSkge1xuXHRcdFx0XHQvLyBJZiB3ZSBoYXZlIGV4aXRlZCBmcm9tIHRoZSBhcHAsIENvbW1vblV0aWxzLmdldEFwcENvbXBvbmVudCBkb2Vzbid0IHJldHVybiBhXG5cdFx0XHRcdC8vIHNhcC5mZS5jb3JlLkFwcENvbXBvbmVudCwgaGVuY2UgdGhlICdpZicgYWJvdmVcblx0XHRcdFx0b0FwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSgpLmRpc2NhcmROYXZpZ2F0aW9uR3VhcmQoKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHRoaXMuZm5EaXJ0eVN0YXRlUHJvdmlkZXIpIHtcblx0XHRcdFx0b0FwcENvbXBvbmVudC5nZXRTaGVsbFNlcnZpY2VzKCkuZGVyZWdpc3RlckRpcnR5U3RhdGVQcm92aWRlcih0aGlzLmZuRGlydHlTdGF0ZVByb3ZpZGVyKTtcblx0XHRcdFx0dGhpcy5mbkRpcnR5U3RhdGVQcm92aWRlciA9IHVuZGVmaW5lZDtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKCkgJiYgdGhpcy5mbkhhbmRsZVNlc3Npb25UaW1lb3V0KSB7XG5cdFx0XHRcdCh0aGlzLmdldFZpZXcoKS5nZXRNb2RlbCgpIGFzIGFueSkuZGV0YWNoU2Vzc2lvblRpbWVvdXQodGhpcy5mbkhhbmRsZVNlc3Npb25UaW1lb3V0KTtcblx0XHRcdH1cblxuXHRcdFx0b0FwcENvbXBvbmVudC5nZXRSb3V0aW5nU2VydmljZSgpLmRldGFjaFJvdXRlTWF0Y2hlZCh0aGlzLmZuU3RpY2t5RGlzY2FyZEFmdGVyTmF2aWdhdGlvbik7XG5cdFx0XHR0aGlzLmZuU3RpY2t5RGlzY2FyZEFmdGVyTmF2aWdhdGlvbiA9IHVuZGVmaW5lZDtcblxuXHRcdFx0dGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpLl9iQ3JlYXRlTW9kZSA9IGZhbHNlO1xuXHRcdFx0dGhpcy5zZXRFZGl0TW9kZShFZGl0TW9kZS5EaXNwbGF5LCBmYWxzZSk7XG5cblx0XHRcdGlmIChvQXBwQ29tcG9uZW50KSB7XG5cdFx0XHRcdC8vIElmIHdlIGhhdmUgZXhpdGVkIGZyb20gdGhlIGFwcCwgQ29tbW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50IGRvZXNuJ3QgcmV0dXJuIGFcblx0XHRcdFx0Ly8gc2FwLmZlLmNvcmUuQXBwQ29tcG9uZW50LCBoZW5jZSB0aGUgJ2lmJyBhYm92ZVxuXHRcdFx0XHRvQXBwQ29tcG9uZW50LmdldFNoZWxsU2VydmljZXMoKS5zZXRCYWNrTmF2aWdhdGlvbigpO1xuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRMb2cuaW5mbyhlcnJvciBhcyBhbnkpO1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uIE1ldGhvZCB0byBkaXNwbGF5IGEgJ2Rpc2NhcmQnIHBvcG92ZXIgd2hlbiBleGl0aW5nIGEgc3RpY2t5IHNlc3Npb24uXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBvbkJhY2tOYXZpZ2F0aW9uSW5TZXNzaW9uXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5JbnRlcm5hbEVkaXRGbG93XG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0b25CYWNrTmF2aWdhdGlvbkluU2Vzc2lvbigpIHtcblx0XHRjb25zdCBvVmlldyA9IHRoaXMuZ2V0VmlldygpLFxuXHRcdFx0b0FwcENvbXBvbmVudCA9IENvbW1vblV0aWxzLmdldEFwcENvbXBvbmVudChvVmlldyksXG5cdFx0XHRvUm91dGVyUHJveHkgPSBvQXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCk7XG5cblx0XHRpZiAob1JvdXRlclByb3h5LmNoZWNrSWZCYWNrSXNPdXRPZkd1YXJkKCkpIHtcblx0XHRcdGNvbnN0IG9CaW5kaW5nQ29udGV4dCA9IG9WaWV3ICYmIG9WaWV3LmdldEJpbmRpbmdDb250ZXh0KCk7XG5cblx0XHRcdHN0aWNreS5wcm9jZXNzRGF0YUxvc3NDb25maXJtYXRpb24oXG5cdFx0XHRcdCgpID0+IHtcblx0XHRcdFx0XHR0aGlzLmRpc2NhcmRTdGlja3lTZXNzaW9uKG9CaW5kaW5nQ29udGV4dCk7XG5cdFx0XHRcdFx0aGlzdG9yeS5iYWNrKCk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdG9WaWV3LFxuXHRcdFx0XHR0aGlzLmdldFByb2dyYW1taW5nTW9kZWwob0JpbmRpbmdDb250ZXh0KVxuXHRcdFx0KTtcblxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRoaXN0b3J5LmJhY2soKTtcblx0fVxuXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRkaXNjYXJkU3RpY2t5U2Vzc2lvbihvQ29udGV4dDogYW55KSB7XG5cdFx0c3RpY2t5LmRpc2NhcmREb2N1bWVudChvQ29udGV4dCk7XG5cdFx0dGhpcy5oYW5kbGVTdGlja3lPZmYoKTtcblx0fVxuXG5cdF9oYXNOZXdBY3Rpb25Gb3JTdGlja3kob0NvbnRleHQ6IGFueSwgb1ZpZXc6IFZpZXcsIHNDdXN0b21BY3Rpb246IHN0cmluZykge1xuXHRcdHRyeSB7XG5cdFx0XHRpZiAob0NvbnRleHQgPT09IHVuZGVmaW5lZCB8fCBvVmlldyA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgaW5wdXQgcGFyYW1ldGVycyBmb3IgZnVuY3Rpb24gX2hhc05ld0FjdGlvbkZvclN0aWNreVwiKTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG9WaWV3LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCksXG5cdFx0XHRcdHNNZXRhUGF0aCA9IG9Db250ZXh0LmdldFBhdGgoKS5zdWJzdHJpbmcoMCwgb0NvbnRleHQuZ2V0UGF0aCgpLmluZGV4T2YoXCIoXCIpKSxcblx0XHRcdFx0b1N0aWNreVNlc3Npb24gPSBvTWV0YU1vZGVsLmdldE9iamVjdChgJHtzTWV0YVBhdGh9QGNvbS5zYXAudm9jYWJ1bGFyaWVzLlNlc3Npb24udjEuU3RpY2t5U2Vzc2lvblN1cHBvcnRlZGApO1xuXG5cdFx0XHRpZiAob1N0aWNreVNlc3Npb24gJiYgb1N0aWNreVNlc3Npb24uTmV3QWN0aW9uICYmIG9TdGlja3lTZXNzaW9uLk5ld0FjdGlvbiA9PT0gc0N1c3RvbUFjdGlvbikge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH0gZWxzZSBpZiAob1N0aWNreVNlc3Npb24gJiYgb1N0aWNreVNlc3Npb24uQWRkaXRpb25hbE5ld0FjdGlvbnMpIHtcblx0XHRcdFx0cmV0dXJuIHNDdXN0b21BY3Rpb24gPT09XG5cdFx0XHRcdFx0b1N0aWNreVNlc3Npb24uQWRkaXRpb25hbE5ld0FjdGlvbnMuZmluZChmdW5jdGlvbiAoc0FkZGl0aW9uYWxBY3Rpb246IHN0cmluZykge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHNBZGRpdGlvbmFsQWN0aW9uID09PSBzQ3VzdG9tQWN0aW9uO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0PyB0cnVlXG5cdFx0XHRcdFx0OiBmYWxzZTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0TG9nLmluZm8oZXJyb3IgYXMgYW55KTtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXHR9XG5cblx0X3JlZ2lzdGVyRGlydHlTdGF0ZVByb3ZpZGVyKG9BcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCwgb0ludGVybmFsTW9kZWw6IEpTT05Nb2RlbCwgc0hhc2hUcmFja2VyOiBzdHJpbmcpIHtcblx0XHRyZXR1cm4gZnVuY3Rpb24gZm5EaXJ0eVN0YXRlUHJvdmlkZXIob05hdmlnYXRpb25Db250ZXh0OiBhbnkpIHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGlmIChvTmF2aWdhdGlvbkNvbnRleHQgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgaW5wdXQgcGFyYW1ldGVycyBmb3IgZnVuY3Rpb24gZm5EaXJ0eVN0YXRlUHJvdmlkZXJcIik7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjb25zdCBzVGFyZ2V0SGFzaCA9IG9OYXZpZ2F0aW9uQ29udGV4dC5pbm5lckFwcFJvdXRlLFxuXHRcdFx0XHRcdG9Sb3V0ZXJQcm94eSA9IG9BcHBDb21wb25lbnQuZ2V0Um91dGVyUHJveHkoKTtcblx0XHRcdFx0bGV0IHNMY2xIYXNoVHJhY2tlciA9IFwiXCI7XG5cdFx0XHRcdGxldCBiRGlydHk6IGJvb2xlYW47XG5cdFx0XHRcdGNvbnN0IGJTZXNzaW9uT04gPSBvSW50ZXJuYWxNb2RlbC5nZXRQcm9wZXJ0eShcIi9zZXNzaW9uT25cIik7XG5cblx0XHRcdFx0aWYgKCFiU2Vzc2lvbk9OKSB7XG5cdFx0XHRcdFx0Ly8gSWYgdGhlIHN0aWNreSBzZXNzaW9uIHdhcyB0ZXJtaW5hdGVkIGJlZm9yZSBoYW5kLlxuXHRcdFx0XHRcdC8vIEVleGFtcGxlIGluIGNhc2Ugb2YgbmF2aWdhdGluZyBhd2F5IGZyb20gYXBwbGljYXRpb24gdXNpbmcgSUJOLlxuXHRcdFx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIW9Sb3V0ZXJQcm94eS5pc05hdmlnYXRpb25GaW5hbGl6ZWQoKSkge1xuXHRcdFx0XHRcdC8vIElmIG5hdmlnYXRpb24gaXMgY3VycmVudGx5IGhhcHBlbmluZyBpbiBSb3V0ZXJQcm94eSwgaXQncyBhIHRyYW5zaWVudCBzdGF0ZVxuXHRcdFx0XHRcdC8vIChub3QgZGlydHkpXG5cdFx0XHRcdFx0YkRpcnR5ID0gZmFsc2U7XG5cdFx0XHRcdFx0c0xjbEhhc2hUcmFja2VyID0gc1RhcmdldEhhc2g7XG5cdFx0XHRcdH0gZWxzZSBpZiAoc0hhc2hUcmFja2VyID09PSBzVGFyZ2V0SGFzaCkge1xuXHRcdFx0XHRcdC8vIHRoZSBoYXNoIGRpZG4ndCBjaGFuZ2Ugc28gZWl0aGVyIHRoZSB1c2VyIGF0dGVtcHRzIHRvIHJlZnJlc2ggb3IgdG8gbGVhdmUgdGhlIGFwcFxuXHRcdFx0XHRcdGJEaXJ0eSA9IHRydWU7XG5cdFx0XHRcdH0gZWxzZSBpZiAob1JvdXRlclByb3h5LmNoZWNrSGFzaFdpdGhHdWFyZChzVGFyZ2V0SGFzaCkgfHwgb1JvdXRlclByb3h5LmlzR3VhcmRDcm9zc0FsbG93ZWRCeVVzZXIoKSkge1xuXHRcdFx0XHRcdC8vIHRoZSB1c2VyIGF0dGVtcHRzIHRvIG5hdmlnYXRlIHdpdGhpbiB0aGUgcm9vdCBvYmplY3Rcblx0XHRcdFx0XHQvLyBvciBjcm9zc2luZyB0aGUgZ3VhcmQgaGFzIGFscmVhZHkgYmVlbiBhbGxvd2VkIGJ5IHRoZSBSb3V0ZXJQcm94eVxuXHRcdFx0XHRcdHNMY2xIYXNoVHJhY2tlciA9IHNUYXJnZXRIYXNoO1xuXHRcdFx0XHRcdGJEaXJ0eSA9IGZhbHNlO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIHRoZSB1c2VyIGF0dGVtcHRzIHRvIG5hdmlnYXRlIHdpdGhpbiB0aGUgYXBwLCBmb3IgZXhhbXBsZSBiYWNrIHRvIHRoZSBsaXN0IHJlcG9ydFxuXHRcdFx0XHRcdGJEaXJ0eSA9IHRydWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoYkRpcnR5KSB7XG5cdFx0XHRcdFx0Ly8gdGhlIEZMUCBkb2Vzbid0IGNhbGwgdGhlIGRpcnR5IHN0YXRlIHByb3ZpZGVyIGFueW1vcmUgb25jZSBpdCdzIGRpcnR5LCBhcyB0aGV5IGNhbid0XG5cdFx0XHRcdFx0Ly8gY2hhbmdlIHRoaXMgZHVlIHRvIGNvbXBhdGliaWxpdHkgcmVhc29ucyB3ZSBzZXQgaXQgYmFjayB0byBub3QtZGlydHlcblx0XHRcdFx0XHRzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdG9BcHBDb21wb25lbnQuZ2V0U2hlbGxTZXJ2aWNlcygpLnNldERpcnR5RmxhZyhmYWxzZSk7XG5cdFx0XHRcdFx0fSwgMCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0c0hhc2hUcmFja2VyID0gc0xjbEhhc2hUcmFja2VyO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIGJEaXJ0eTtcblx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRcdExvZy5pbmZvKGVycm9yIGFzIGFueSk7XG5cdFx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0XHR9XG5cdFx0fTtcblx0fVxuXG5cdF9hdHRhY2hTZXNzaW9uVGltZW91dChvQ29udGV4dDogYW55LCBpMThuTW9kZWw6IE1vZGVsKSB7XG5cdFx0cmV0dXJuICgpID0+IHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGlmIChvQ29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiQ29udGV4dCBtaXNzaW5nIGZvciBmdW5jdGlvbiBmbkhhbmRsZVNlc3Npb25UaW1lb3V0XCIpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdC8vIHJlbW92ZSB0cmFuc2llbnQgbWVzc2FnZXMgc2luY2Ugd2Ugd2lsbCBzaG93aW5nIG91ciBvd24gbWVzc2FnZVxuXHRcdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkucmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cblx0XHRcdFx0Y29uc3Qgb0RpYWxvZyA9IG5ldyBEaWFsb2coe1xuXHRcdFx0XHRcdHRpdGxlOiBcIntzYXAuZmUuaTE4bj5DX0VESVRGTE9XX09CSkVDVF9QQUdFX1NFU1NJT05fRVhQSVJFRF9ESUFMT0dfVElUTEV9XCIsXG5cdFx0XHRcdFx0c3RhdGU6IFwiV2FybmluZ1wiLFxuXHRcdFx0XHRcdGNvbnRlbnQ6IG5ldyBUZXh0KHsgdGV4dDogXCJ7c2FwLmZlLmkxOG4+Q19FRElURkxPV19PQkpFQ1RfUEFHRV9TRVNTSU9OX0VYUElSRURfRElBTE9HX01FU1NBR0V9XCIgfSksXG5cdFx0XHRcdFx0YmVnaW5CdXR0b246IG5ldyBCdXR0b24oe1xuXHRcdFx0XHRcdFx0dGV4dDogXCJ7c2FwLmZlLmkxOG4+Q19DT01NT05fRElBTE9HX09LfVwiLFxuXHRcdFx0XHRcdFx0dHlwZTogXCJFbXBoYXNpemVkXCIsXG5cdFx0XHRcdFx0XHRwcmVzczogKCkgPT4ge1xuXHRcdFx0XHRcdFx0XHQvLyByZW1vdmUgc3RpY2t5IGhhbmRsaW5nIGFmdGVyIG5hdmlnYXRpb24gc2luY2Ugc2Vzc2lvbiBoYXMgYWxyZWFkeSBiZWVuIHRlcm1pbmF0ZWRcblx0XHRcdFx0XHRcdFx0dGhpcy5oYW5kbGVTdGlja3lPZmYoKTtcblx0XHRcdFx0XHRcdFx0dGhpcy5nZXRSb3V0aW5nTGlzdGVuZXIoKS5uYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dChvQ29udGV4dCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSksXG5cdFx0XHRcdFx0YWZ0ZXJDbG9zZTogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0b0RpYWxvZy5kZXN0cm95KCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdFx0b0RpYWxvZy5hZGRTdHlsZUNsYXNzKFwic2FwVWlDb250ZW50UGFkZGluZ1wiKTtcblx0XHRcdFx0b0RpYWxvZy5zZXRNb2RlbChpMThuTW9kZWwsIFwic2FwLmZlLmkxOG5cIik7XG5cdFx0XHRcdHRoaXMuZ2V0VmlldygpLmFkZERlcGVuZGVudChvRGlhbG9nKTtcblx0XHRcdFx0b0RpYWxvZy5vcGVuKCk7XG5cdFx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0XHRMb2cuaW5mbyhlcnJvciBhcyBhbnkpO1xuXHRcdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fTtcblx0fVxuXG5cdF9hdHRhY2hSb3V0ZU1hdGNoZWQob0ZuQ29udGV4dDogYW55LCBvQ29udGV4dDogYW55LCBvQXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQpIHtcblx0XHRyZXR1cm4gZnVuY3Rpb24gZm5TdGlja3lEaXNjYXJkQWZ0ZXJOYXZpZ2F0aW9uKCkge1xuXHRcdFx0Y29uc3Qgc0N1cnJlbnRIYXNoID0gb0FwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSgpLmdldEhhc2goKTtcblx0XHRcdC8vIGVpdGhlciBjdXJyZW50IGhhc2ggaXMgZW1wdHkgc28gdGhlIHVzZXIgbGVmdCB0aGUgYXBwIG9yIGhlIG5hdmlnYXRlZCBhd2F5IGZyb20gdGhlIG9iamVjdFxuXHRcdFx0aWYgKCFzQ3VycmVudEhhc2ggfHwgIW9BcHBDb21wb25lbnQuZ2V0Um91dGVyUHJveHkoKS5jaGVja0hhc2hXaXRoR3VhcmQoc0N1cnJlbnRIYXNoKSkge1xuXHRcdFx0XHRvRm5Db250ZXh0LmRpc2NhcmRTdGlja3lTZXNzaW9uKG9Db250ZXh0KTtcblx0XHRcdH1cblx0XHR9O1xuXHR9XG5cdHNjcm9sbEFuZEZvY3VzT25JbmFjdGl2ZVJvdyhvVGFibGU6IFRhYmxlKSB7XG5cdFx0Y29uc3Qgb1Jvd0JpbmRpbmcgPSBvVGFibGUuZ2V0Um93QmluZGluZygpIGFzIE9EYXRhTGlzdEJpbmRpbmc7XG5cdFx0Y29uc3QgaUFjdGl2ZVJvd0luZGV4ID0gb1Jvd0JpbmRpbmcuZ2V0Q291bnQoKSB8fCAwO1xuXHRcdGlmIChpQWN0aXZlUm93SW5kZXggPiAwKSB7XG5cdFx0XHRvVGFibGUuc2Nyb2xsVG9JbmRleChpQWN0aXZlUm93SW5kZXggLSAxKTtcblx0XHRcdG9UYWJsZS5mb2N1c1JvdyhpQWN0aXZlUm93SW5kZXgsIHRydWUpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRvVGFibGUuZm9jdXNSb3coaUFjdGl2ZVJvd0luZGV4LCB0cnVlKTtcblx0XHR9XG5cdH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgSW50ZXJuYWxFZGl0RmxvdztcbiJdfQ==