@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
@@ -2,7 +2,7 @@
2
2
  * SAP UI development toolkit for HTML5 (SAPUI5)
3
3
  * (c) Copyright 2009-2021 SAP SE. All rights reserved
4
4
  */
5
- sap.ui.define(["sap/fe/core/converters/helpers/BindingHelper", "sap/fe/core/converters/MetaModelConverter", "sap/fe/core/formatters/ValueFormatter", "sap/fe/core/helpers/BindingExpression", "sap/fe/core/templating/DataModelPathHelper", "sap/fe/core/templating/DisplayModeFormatter", "sap/fe/core/templating/FieldControlHelper", "sap/fe/core/templating/PropertyHelper"], function (BindingHelper, MetaModelConverter, valueFormatters, BindingExpression, DataModelPathHelper, DisplayModeFormatter, FieldControlHelper, PropertyHelper) {
5
+ sap.ui.define(["sap/fe/core/converters/helpers/BindingHelper", "sap/fe/core/converters/MetaModelConverter", "sap/fe/core/formatters/ValueFormatter", "sap/fe/core/helpers/BindingToolkit", "sap/fe/core/templating/DataModelPathHelper", "sap/fe/core/templating/DisplayModeFormatter", "sap/fe/core/templating/FieldControlHelper", "sap/fe/core/templating/PropertyHelper"], function (BindingHelper, MetaModelConverter, valueFormatters, BindingToolkit, DataModelPathHelper, DisplayModeFormatter, FieldControlHelper, PropertyHelper) {
6
6
  "use strict";
7
7
 
8
8
  var _exports = {};
@@ -21,19 +21,21 @@ sap.ui.define(["sap/fe/core/converters/helpers/BindingHelper", "sap/fe/core/conv
21
21
  var isPathUpdatable = DataModelPathHelper.isPathUpdatable;
22
22
  var getTargetObjectPath = DataModelPathHelper.getTargetObjectPath;
23
23
  var getPathRelativeLocation = DataModelPathHelper.getPathRelativeLocation;
24
- var or = BindingExpression.or;
25
- var not = BindingExpression.not;
26
- var isTruthy = BindingExpression.isTruthy;
27
- var isConstant = BindingExpression.isConstant;
28
- var ifElse = BindingExpression.ifElse;
29
- var formatResult = BindingExpression.formatResult;
30
- var equal = BindingExpression.equal;
31
- var constant = BindingExpression.constant;
32
- var compileBinding = BindingExpression.compileBinding;
33
- var bindingExpression = BindingExpression.bindingExpression;
34
- var annotationExpression = BindingExpression.annotationExpression;
35
- var and = BindingExpression.and;
36
- var addTypeInformation = BindingExpression.addTypeInformation;
24
+ var getContextRelativeTargetObjectPath = DataModelPathHelper.getContextRelativeTargetObjectPath;
25
+ var pathInModel = BindingToolkit.pathInModel;
26
+ var or = BindingToolkit.or;
27
+ var notEqual = BindingToolkit.notEqual;
28
+ var not = BindingToolkit.not;
29
+ var isTruthy = BindingToolkit.isTruthy;
30
+ var isConstant = BindingToolkit.isConstant;
31
+ var ifElse = BindingToolkit.ifElse;
32
+ var getExpressionFromAnnotation = BindingToolkit.getExpressionFromAnnotation;
33
+ var formatResult = BindingToolkit.formatResult;
34
+ var equal = BindingToolkit.equal;
35
+ var constant = BindingToolkit.constant;
36
+ var compileExpression = BindingToolkit.compileExpression;
37
+ var and = BindingToolkit.and;
38
+ var addTypeInformation = BindingToolkit.addTypeInformation;
37
39
  var getInvolvedDataModelObjects = MetaModelConverter.getInvolvedDataModelObjects;
38
40
  var convertMetaModelContext = MetaModelConverter.convertMetaModelContext;
39
41
  var UI = BindingHelper.UI;
@@ -57,19 +59,28 @@ sap.ui.define(["sap/fe/core/converters/helpers/BindingHelper", "sap/fe/core/conv
57
59
  var getDisplayMode = function (oDataModelObjectPath) {
58
60
  return DisplayModeFormatter.getDisplayMode(oDataModelObjectPath.targetObject, oDataModelObjectPath);
59
61
  };
62
+
63
+ _exports.getDisplayMode = getDisplayMode;
64
+
65
+ var getEditableExpressionAsObject = function (oPropertyPath) {
66
+ var oDataFieldConverted = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
67
+ var oDataModelObjectPath = arguments.length > 2 ? arguments[2] : undefined;
68
+ var isEditable = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : UI.IsEditable;
69
+ return getEditableExpression(oPropertyPath, oDataFieldConverted, oDataModelObjectPath, true, isEditable);
70
+ };
60
71
  /**
61
72
  * Create the expression to generate an "editable" boolean value.
62
73
  *
63
- * @param {PropertyPath} oPropertyPath The input property
64
- * @param {object} oDataFieldConverted The DataFieldConverted object to read the fieldControl annotation
65
- * @param {DataModelObjectPath} oDataModelObjectPath The path to this property object
66
- * @param {boolean} bAsObject Whether or not this should be returned as an object or a binding string
67
- * @param {boolean} isEditable Whether or not UI.IsEditable be considered.
68
- * @returns {string} The binding expression used to determine if a property is editable or not
74
+ * @param oPropertyPath The input property
75
+ * @param oDataFieldConverted The DataFieldConverted object to read the fieldControl annotation
76
+ * @param oDataModelObjectPath The path to this property object
77
+ * @param bAsObject Whether or not this should be returned as an object or a binding string
78
+ * @param isEditable Whether or not UI.IsEditable be considered.
79
+ * @returns The binding expression used to determine if a property is editable or not
69
80
  */
70
81
 
71
82
 
72
- _exports.getDisplayMode = getDisplayMode;
83
+ _exports.getEditableExpressionAsObject = getEditableExpressionAsObject;
73
84
 
74
85
  var getEditableExpression = function (oPropertyPath) {
75
86
  var oDataFieldConverted = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
@@ -78,10 +89,10 @@ sap.ui.define(["sap/fe/core/converters/helpers/BindingHelper", "sap/fe/core/conv
78
89
  var isEditable = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : UI.IsEditable;
79
90
 
80
91
  if (!oPropertyPath || typeof oPropertyPath === "string") {
81
- return compileBinding(false);
92
+ return compileExpression(false);
82
93
  }
83
94
 
84
- var dataFieldEditableExpression = true;
95
+ var dataFieldEditableExpression = constant(true);
85
96
 
86
97
  if (oDataFieldConverted !== null) {
87
98
  dataFieldEditableExpression = ifElse(isNonEditableExpression(oDataFieldConverted), false, isEditable);
@@ -110,7 +121,7 @@ sap.ui.define(["sap/fe/core/converters/helpers/BindingHelper", "sap/fe/core/conv
110
121
  return and(editableExpression, dataFieldEditableExpression);
111
122
  }
112
123
 
113
- return compileBinding(and(editableExpression, dataFieldEditableExpression));
124
+ return compileExpression(and(editableExpression, dataFieldEditableExpression));
114
125
  };
115
126
 
116
127
  _exports.getEditableExpression = getEditableExpression;
@@ -119,35 +130,41 @@ sap.ui.define(["sap/fe/core/converters/helpers/BindingHelper", "sap/fe/core/conv
119
130
  var _dataModelObjectPath$;
120
131
 
121
132
  var objectPath = getTargetObjectPath(dataModelObjectPath);
122
- var activityExpression = bindingExpression("/collaboration/activities" + objectPath, "internal");
133
+ var activityExpression = pathInModel("/collaboration/activities".concat(objectPath), "internal");
123
134
  var keys = dataModelObjectPath === null || dataModelObjectPath === void 0 ? void 0 : (_dataModelObjectPath$ = dataModelObjectPath.targetEntityType) === null || _dataModelObjectPath$ === void 0 ? void 0 : _dataModelObjectPath$.keys;
124
135
  var keysExpressions = [];
125
136
  keys === null || keys === void 0 ? void 0 : keys.forEach(function (key) {
126
- var keyExpression = bindingExpression(key.name);
137
+ var keyExpression = pathInModel(key.name);
127
138
  keysExpressions.push(keyExpression);
128
139
  });
129
140
  return formatResult([activityExpression].concat(keysExpressions), formatter);
130
141
  };
142
+
143
+ _exports.getCollaborationExpression = getCollaborationExpression;
144
+
145
+ var getEnabledExpressionAsObject = function (oPropertyPath, oDataFieldConverted) {
146
+ return getEnabledExpression(oPropertyPath, oDataFieldConverted, true);
147
+ };
131
148
  /**
132
149
  * Create the expression to generate an "enabled" boolean value.
133
150
  *
134
- * @param {PropertyPath} oPropertyPath The input property
135
- * @param {any} oDataFieldConverted The DataFieldConverted Object to read the fieldControl annotation
136
- * @param {boolean} bAsObject Whether or not this should be returned as an object or a binding string
137
- * @returns {string} The binding expression to determine if a property is enabled or not
151
+ * @param oPropertyPath The input property
152
+ * @param oDataFieldConverted The DataFieldConverted Object to read the fieldControl annotation
153
+ * @param bAsObject Whether or not this should be returned as an object or a binding string
154
+ * @returns The binding expression to determine if a property is enabled or not
138
155
  */
139
156
 
140
157
 
141
- _exports.getCollaborationExpression = getCollaborationExpression;
158
+ _exports.getEnabledExpressionAsObject = getEnabledExpressionAsObject;
142
159
 
143
160
  var getEnabledExpression = function (oPropertyPath, oDataFieldConverted) {
144
161
  var bAsObject = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
145
162
 
146
163
  if (!oPropertyPath || typeof oPropertyPath === "string") {
147
- return compileBinding(true);
164
+ return compileExpression(true);
148
165
  }
149
166
 
150
- var dataFieldEnabledExpression = true;
167
+ var dataFieldEnabledExpression = constant(true);
151
168
 
152
169
  if (oDataFieldConverted !== null) {
153
170
  dataFieldEnabledExpression = ifElse(isDisabledExpression(oDataFieldConverted), false, true);
@@ -162,18 +179,18 @@ sap.ui.define(["sap/fe/core/converters/helpers/BindingHelper", "sap/fe/core/conv
162
179
  return and(enabledExpression, dataFieldEnabledExpression);
163
180
  }
164
181
 
165
- return compileBinding(and(enabledExpression, dataFieldEnabledExpression));
182
+ return compileExpression(and(enabledExpression, dataFieldEnabledExpression));
166
183
  };
167
184
  /**
168
185
  * Create the expression to generate an "editMode" enum value.
169
186
  *
170
- * @param {PropertyPath} oPropertyPath The input property
171
- * @param {DataModelObjectPath} oDataModelObjectPath The list of data model objects that are involved to reach that property
172
- * @param {boolean} bMeasureReadOnly Whether we should set UoM / currency field mode to read only
173
- * @param {boolean} bAsObject Whether we should return this as an expression or as a string
174
- * @param {object} oDataFieldConverted The dataField object
175
- * @param {boolean} isEditable Whether or not UI.IsEditable be considered.
176
- * @returns {BindingExpression<string> | ExpressionOrPrimitive<string>} The binding expression representing the current property edit mode, compliant with the MDC Field definition of editMode.
187
+ * @param oPropertyPath The input property
188
+ * @param oDataModelObjectPath The list of data model objects that are involved to reach that property
189
+ * @param bMeasureReadOnly Whether we should set UoM / currency field mode to read only
190
+ * @param bAsObject Whether we should return this as an expression or as a string
191
+ * @param oDataFieldConverted The dataField object
192
+ * @param isEditable Whether or not UI.IsEditable be considered.
193
+ * @returns The binding expression representing the current property edit mode, compliant with the MDC Field definition of editMode.
177
194
  */
178
195
 
179
196
 
@@ -196,14 +213,15 @@ sap.ui.define(["sap/fe/core/converters/helpers/BindingHelper", "sap/fe/core/conv
196
213
  // if the unit field control is readonly -> EditableReadOnly
197
214
  // otherwise -> Editable
198
215
 
199
- var editableExpression = getEditableExpression(oPropertyPath, oDataFieldConverted, oDataModelObjectPath, true, isEditable);
200
- var enabledExpression = getEnabledExpression(oPropertyPath, oDataFieldConverted, true);
216
+ var editableExpression = getEditableExpressionAsObject(oPropertyPath, oDataFieldConverted, oDataModelObjectPath, isEditable);
217
+ var enabledExpression = getEnabledExpressionAsObject(oPropertyPath, oDataFieldConverted);
201
218
  var associatedCurrencyProperty = getAssociatedCurrencyProperty(oProperty);
202
219
  var unitProperty = associatedCurrencyProperty || getAssociatedUnitProperty(oProperty);
203
- var resultExpression = "Editable";
220
+ var resultExpression = constant("Editable");
204
221
 
205
222
  if (unitProperty) {
206
- resultExpression = ifElse(or(isReadOnlyExpression(unitProperty), isComputed(unitProperty), bMeasureReadOnly), "EditableReadOnly", "Editable");
223
+ var isUnitReadOnly = isReadOnlyExpression(unitProperty);
224
+ resultExpression = ifElse(or(isUnitReadOnly, isComputed(unitProperty), bMeasureReadOnly), ifElse(!isConstant(isUnitReadOnly) && isUnitReadOnly, "EditableReadOnly", "EditableDisplay"), "Editable");
207
225
  }
208
226
 
209
227
  var readOnlyExpression = or(isReadOnlyExpression(oProperty), isReadOnlyExpression(oDataFieldConverted)); // if the property is from a non-updatable entity => Read only mode, previously calculated edit Mode is ignored
@@ -215,7 +233,7 @@ sap.ui.define(["sap/fe/core/converters/helpers/BindingHelper", "sap/fe/core/conv
215
233
  return editModeExpression;
216
234
  }
217
235
 
218
- return compileBinding(editModeExpression);
236
+ return compileExpression(editModeExpression);
219
237
  };
220
238
 
221
239
  _exports.getEditMode = getEditMode;
@@ -228,9 +246,9 @@ sap.ui.define(["sap/fe/core/converters/helpers/BindingHelper", "sap/fe/core/conv
228
246
  var measure = currency ? currency : (_oPropertyDefinition$3 = oPropertyDefinition.annotations) === null || _oPropertyDefinition$3 === void 0 ? void 0 : (_oPropertyDefinition$4 = _oPropertyDefinition$3.Measures) === null || _oPropertyDefinition$4 === void 0 ? void 0 : _oPropertyDefinition$4.Unit;
229
247
 
230
248
  if (measure) {
231
- return compileBinding(or(isTruthy(annotationExpression(measure)), not(UI.IsTotal)));
249
+ return compileExpression(or(isTruthy(getExpressionFromAnnotation(measure)), not(UI.IsTotal)));
232
250
  } else {
233
- return compileBinding(constant(true));
251
+ return compileExpression(constant(true));
234
252
  }
235
253
  };
236
254
 
@@ -241,18 +259,19 @@ sap.ui.define(["sap/fe/core/converters/helpers/BindingHelper", "sap/fe/core/conv
241
259
  var unitProperty = getAssociatedCurrencyProperty(oProperty) || getAssociatedUnitProperty(oProperty);
242
260
 
243
261
  if (!unitProperty) {
244
- return compileBinding(sNonEditableValue);
262
+ return compileExpression(sNonEditableValue);
245
263
  }
246
264
 
247
- var editableExpression = and(not(isReadOnlyExpression(unitProperty)), not(isComputed(unitProperty)));
248
- return compileBinding(ifElse(editableExpression, sEditableValue, sNonEditableValue));
265
+ var isUnitReadOnly = isReadOnlyExpression(unitProperty);
266
+ var editableExpression = and(or(!isConstant(isUnitReadOnly), not(isUnitReadOnly)), not(isComputed(unitProperty)));
267
+ return compileExpression(ifElse(editableExpression, sEditableValue, sNonEditableValue));
249
268
  };
250
269
 
251
270
  _exports.ifUnitEditable = ifUnitEditable;
252
271
 
253
272
  var getFieldDisplay = function (oPropertyPath, sTargetDisplayMode, oComputedEditMode) {
254
273
  var oProperty = isPathExpression(oPropertyPath) && oPropertyPath.$target || oPropertyPath;
255
- return hasValueHelp(oProperty) ? compileBinding(sTargetDisplayMode) : compileBinding(ifElse(equal(oComputedEditMode, "Editable"), "Value", sTargetDisplayMode));
274
+ return hasValueHelp(oProperty) ? compileExpression(sTargetDisplayMode) : compileExpression(ifElse(equal(oComputedEditMode, "Editable"), "Value", sTargetDisplayMode));
256
275
  };
257
276
 
258
277
  _exports.getFieldDisplay = getFieldDisplay;
@@ -359,7 +378,7 @@ sap.ui.define(["sap/fe/core/converters/helpers/BindingHelper", "sap/fe/core/conv
359
378
  };
360
379
 
361
380
  if (isProperty(oProperty)) {
362
- var _oTargetMapping$const2, _oTargetMapping$const3, _oTargetMapping$const4, _oTargetMapping$const5, _oTargetMapping$const6, _oProperty$annotation7, _oProperty$annotation8, _oProperty$annotation9, _oProperty$annotation10, _oTargetMapping$const7, _oProperty$annotation11, _oProperty$annotation12, _oProperty$annotation13, _oProperty$annotation14, _oTargetMapping$const8, _annotations, _annotations$Common, _oTargetMapping$const9;
381
+ var _oTargetMapping$const2, _oTargetMapping$const3, _oTargetMapping$const4, _oTargetMapping$const5, _oTargetMapping$const6, _oProperty$annotation7, _oProperty$annotation8, _oProperty$annotation9, _oProperty$annotation10, _oTargetMapping$const7, _oProperty$annotation11, _oProperty$annotation12, _oProperty$annotation13, _oProperty$annotation14, _oTargetMapping$const8, _oProperty$annotation15, _oProperty$annotation16, _oTargetMapping$const9;
363
382
 
364
383
  propertyTypeConfig.constraints = {
365
384
  scale: (_oTargetMapping$const2 = oTargetMapping.constraints) !== null && _oTargetMapping$const2 !== void 0 && _oTargetMapping$const2.$Scale ? oProperty.scale : undefined,
@@ -368,7 +387,7 @@ sap.ui.define(["sap/fe/core/converters/helpers/BindingHelper", "sap/fe/core/conv
368
387
  nullable: (_oTargetMapping$const5 = oTargetMapping.constraints) !== null && _oTargetMapping$const5 !== void 0 && _oTargetMapping$const5.$Nullable ? oProperty.nullable : undefined,
369
388
  minimum: (_oTargetMapping$const6 = oTargetMapping.constraints) !== null && _oTargetMapping$const6 !== void 0 && _oTargetMapping$const6["@Org.OData.Validation.V1.Minimum/$Decimal"] && !isNaN((_oProperty$annotation7 = oProperty.annotations) === null || _oProperty$annotation7 === void 0 ? void 0 : (_oProperty$annotation8 = _oProperty$annotation7.Validation) === null || _oProperty$annotation8 === void 0 ? void 0 : _oProperty$annotation8.Minimum) ? "".concat((_oProperty$annotation9 = oProperty.annotations) === null || _oProperty$annotation9 === void 0 ? void 0 : (_oProperty$annotation10 = _oProperty$annotation9.Validation) === null || _oProperty$annotation10 === void 0 ? void 0 : _oProperty$annotation10.Minimum) : undefined,
370
389
  maximum: (_oTargetMapping$const7 = oTargetMapping.constraints) !== null && _oTargetMapping$const7 !== void 0 && _oTargetMapping$const7["@Org.OData.Validation.V1.Maximum/$Decimal"] && !isNaN((_oProperty$annotation11 = oProperty.annotations) === null || _oProperty$annotation11 === void 0 ? void 0 : (_oProperty$annotation12 = _oProperty$annotation11.Validation) === null || _oProperty$annotation12 === void 0 ? void 0 : _oProperty$annotation12.Maximum) ? "".concat((_oProperty$annotation13 = oProperty.annotations) === null || _oProperty$annotation13 === void 0 ? void 0 : (_oProperty$annotation14 = _oProperty$annotation13.Validation) === null || _oProperty$annotation14 === void 0 ? void 0 : _oProperty$annotation14.Maximum) : undefined,
371
- isDigitSequence: propertyTypeConfig.type === "sap.ui.model.odata.type.String" && (_oTargetMapping$const8 = oTargetMapping.constraints) !== null && _oTargetMapping$const8 !== void 0 && _oTargetMapping$const8["@com.sap.vocabularies.Common.v1.IsDigitSequence"] && (_annotations = oProperty.annotations) !== null && _annotations !== void 0 && (_annotations$Common = _annotations.Common) !== null && _annotations$Common !== void 0 && _annotations$Common.IsDigitSequence ? true : undefined,
390
+ isDigitSequence: propertyTypeConfig.type === "sap.ui.model.odata.type.String" && (_oTargetMapping$const8 = oTargetMapping.constraints) !== null && _oTargetMapping$const8 !== void 0 && _oTargetMapping$const8["@com.sap.vocabularies.Common.v1.IsDigitSequence"] && (_oProperty$annotation15 = oProperty.annotations) !== null && _oProperty$annotation15 !== void 0 && (_oProperty$annotation16 = _oProperty$annotation15.Common) !== null && _oProperty$annotation16 !== void 0 && _oProperty$annotation16.IsDigitSequence ? true : undefined,
372
391
  V4: (_oTargetMapping$const9 = oTargetMapping.constraints) !== null && _oTargetMapping$const9 !== void 0 && _oTargetMapping$const9.$V4 ? true : undefined
373
392
  };
374
393
  }
@@ -383,7 +402,7 @@ sap.ui.define(["sap/fe/core/converters/helpers/BindingHelper", "sap/fe/core/conv
383
402
 
384
403
  _exports.getTypeConfig = getTypeConfig;
385
404
 
386
- var getBindingWithUnitOrCurrency = function (oPropertyDataModelPath, propertyBindingExpression, ignoreUnitConstraint) {
405
+ var getBindingWithUnitOrCurrency = function (oPropertyDataModelPath, propertyBindingExpression, ignoreUnitConstraint, formatOptions) {
387
406
  var _oPropertyDefinition$5, _oPropertyDefinition$6, _unit, _oPropertyDefinition$7, _oPropertyDefinition$8;
388
407
 
389
408
  var oPropertyDefinition = oPropertyDataModelPath.targetObject;
@@ -399,23 +418,50 @@ sap.ui.define(["sap/fe/core/converters/helpers/BindingHelper", "sap/fe/core/conv
399
418
 
400
419
  var complexType = unit ? "sap.ui.model.odata.type.Unit" : "sap.ui.model.odata.type.Currency";
401
420
  unit = unit ? unit : (_oPropertyDefinition$7 = oPropertyDefinition.annotations) === null || _oPropertyDefinition$7 === void 0 ? void 0 : (_oPropertyDefinition$8 = _oPropertyDefinition$7.Measures) === null || _oPropertyDefinition$8 === void 0 ? void 0 : _oPropertyDefinition$8.ISOCurrency;
402
- var unitBindingExpression = unit.$target ? formatWithTypeInformation(unit.$target, annotationExpression(unit, relativeLocation), ignoreUnitConstraint) : annotationExpression(unit, relativeLocation);
403
- return addTypeInformation([propertyBindingExpression, unitBindingExpression], complexType);
421
+ var unitBindingExpression = unit.$target ? formatWithTypeInformation(unit.$target, getExpressionFromAnnotation(unit, relativeLocation), ignoreUnitConstraint) : getExpressionFromAnnotation(unit, relativeLocation);
422
+ return addTypeInformation([propertyBindingExpression, unitBindingExpression], complexType, undefined, formatOptions);
404
423
  };
405
424
 
406
425
  _exports.getBindingWithUnitOrCurrency = getBindingWithUnitOrCurrency;
407
426
 
427
+ var getBindingForUnitOrCurrency = function (oPropertyDataModelPath) {
428
+ var _oPropertyDefinition$9, _oPropertyDefinition$10, _unit2, _oPropertyDefinition$11, _oPropertyDefinition$12;
429
+
430
+ var oPropertyDefinition = oPropertyDataModelPath.targetObject;
431
+ var unit = (_oPropertyDefinition$9 = oPropertyDefinition.annotations) === null || _oPropertyDefinition$9 === void 0 ? void 0 : (_oPropertyDefinition$10 = _oPropertyDefinition$9.Measures) === null || _oPropertyDefinition$10 === void 0 ? void 0 : _oPropertyDefinition$10.Unit;
432
+
433
+ if (((_unit2 = unit) === null || _unit2 === void 0 ? void 0 : _unit2.toString()) === "%") {
434
+ return constant("%");
435
+ }
436
+
437
+ var relativeLocation = getPathRelativeLocation(oPropertyDataModelPath.contextLocation, oPropertyDataModelPath.navigationProperties).map(function (np) {
438
+ return np.name;
439
+ });
440
+ var complexType = unit ? "sap.ui.model.odata.type.Unit" : "sap.ui.model.odata.type.Currency";
441
+ unit = unit ? unit : (_oPropertyDefinition$11 = oPropertyDefinition.annotations) === null || _oPropertyDefinition$11 === void 0 ? void 0 : (_oPropertyDefinition$12 = _oPropertyDefinition$11.Measures) === null || _oPropertyDefinition$12 === void 0 ? void 0 : _oPropertyDefinition$12.ISOCurrency;
442
+ var unitBindingExpression = unit.$target ? formatWithTypeInformation(unit.$target, getExpressionFromAnnotation(unit, relativeLocation)) : getExpressionFromAnnotation(unit, relativeLocation);
443
+ var propertyBindingExpression = pathInModel(getContextRelativeTargetObjectPath(oPropertyDataModelPath));
444
+ propertyBindingExpression = formatWithTypeInformation(oPropertyDefinition, propertyBindingExpression, true);
445
+ return addTypeInformation([propertyBindingExpression, unitBindingExpression], complexType, undefined, {
446
+ parseKeepsEmptyString: true,
447
+ emptyString: "",
448
+ showNumber: false
449
+ });
450
+ };
451
+
452
+ _exports.getBindingForUnitOrCurrency = getBindingForUnitOrCurrency;
453
+
408
454
  var getBindingWithTimezone = function (oPropertyDataModelPath, propertyBindingExpression, ignoreUnitConstraint, hideTimezoneForEmptyValues) {
409
- var _oPropertyDefinition$9, _oPropertyDefinition$10;
455
+ var _oPropertyDefinition$13, _oPropertyDefinition$14;
410
456
 
411
457
  var oPropertyDefinition = oPropertyDataModelPath.targetObject;
412
- var timezone = (_oPropertyDefinition$9 = oPropertyDefinition.annotations) === null || _oPropertyDefinition$9 === void 0 ? void 0 : (_oPropertyDefinition$10 = _oPropertyDefinition$9.Common) === null || _oPropertyDefinition$10 === void 0 ? void 0 : _oPropertyDefinition$10.Timezone;
458
+ var timezone = (_oPropertyDefinition$13 = oPropertyDefinition.annotations) === null || _oPropertyDefinition$13 === void 0 ? void 0 : (_oPropertyDefinition$14 = _oPropertyDefinition$13.Common) === null || _oPropertyDefinition$14 === void 0 ? void 0 : _oPropertyDefinition$14.Timezone;
413
459
  var relativeLocation = getPathRelativeLocation(oPropertyDataModelPath.contextLocation, oPropertyDataModelPath.navigationProperties).map(function (np) {
414
460
  return np.name;
415
461
  });
416
462
  propertyBindingExpression = formatWithTypeInformation(oPropertyDefinition, propertyBindingExpression);
417
463
  var complexType = "sap.fe.core.type.DateTimeWithTimezone";
418
- var unitBindingExpression = timezone.$target ? formatWithTypeInformation(timezone.$target, annotationExpression(timezone, relativeLocation), ignoreUnitConstraint) : annotationExpression(timezone, relativeLocation);
464
+ var unitBindingExpression = timezone.$target ? formatWithTypeInformation(timezone.$target, getExpressionFromAnnotation(timezone, relativeLocation), ignoreUnitConstraint) : getExpressionFromAnnotation(timezone, relativeLocation);
419
465
  var formatOptions;
420
466
 
421
467
  if (hideTimezoneForEmptyValues) {
@@ -432,14 +478,14 @@ sap.ui.define(["sap/fe/core/converters/helpers/BindingHelper", "sap/fe/core/conv
432
478
  var getAlignmentExpression = function (oComputedEditMode) {
433
479
  var sAlignDisplay = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "Begin";
434
480
  var sAlignEdit = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : "Begin";
435
- return compileBinding(ifElse(equal(oComputedEditMode, "Display"), sAlignDisplay, sAlignEdit));
481
+ return compileExpression(ifElse(equal(oComputedEditMode, "Display"), sAlignDisplay, sAlignEdit));
436
482
  };
437
483
  /**
438
484
  * Formatter helper to retrieve the converterContext from the metamodel context.
439
485
  *
440
- * @param {Context} oContext The original metamodel context
441
- * @param {ComputedAnnotationInterface} oInterface The current templating context
442
- * @returns {object} The ConverterContext representing that object
486
+ * @param oContext The original metamodel context
487
+ * @param oInterface The current templating context
488
+ * @returns The ConverterContext representing that object
443
489
  */
444
490
 
445
491
 
@@ -457,9 +503,9 @@ sap.ui.define(["sap/fe/core/converters/helpers/BindingHelper", "sap/fe/core/conv
457
503
  /**
458
504
  * Formatter helper to retrieve the data model objects that are involved from the metamodel context.
459
505
  *
460
- * @param {Context} oContext The original ODataMetaModel context
461
- * @param {ComputedAnnotationInterface} oInterface The current templating context
462
- * @returns {object[]} An array of entitysets and navproperties that are involved to get to a specific object in the metamodel
506
+ * @param oContext The original ODataMetaModel context
507
+ * @param oInterface The current templating context
508
+ * @returns An array of entitysets and navproperties that are involved to get to a specific object in the metamodel
463
509
  */
464
510
 
465
511
  _exports.getConverterContext = getConverterContext;
@@ -473,21 +519,8 @@ sap.ui.define(["sap/fe/core/converters/helpers/BindingHelper", "sap/fe/core/conv
473
519
  };
474
520
 
475
521
  getDataModelObjectPath.requiresIContext = true;
476
- /**
477
- * Retrieves the expressionBinding created out of a binding expression.
478
- *
479
- * @param {Expression<any>} expression The expression which needs to be compiled
480
- * @returns {BindingExpression<string>} The expression-binding string
481
- */
482
-
483
522
  _exports.getDataModelObjectPath = getDataModelObjectPath;
484
523
 
485
- var getExpressionBinding = function (expression) {
486
- return compileBinding(expression);
487
- };
488
-
489
- _exports.getExpressionBinding = getExpressionBinding;
490
-
491
524
  var isCollectionField = function (oDataModelPath) {
492
525
  var _oDataModelPath$navig;
493
526
 
@@ -521,31 +554,54 @@ sap.ui.define(["sap/fe/core/converters/helpers/BindingHelper", "sap/fe/core/conv
521
554
 
522
555
  _exports.isCollectionField = isCollectionField;
523
556
 
557
+ var getRequiredExpressionAsObject = function (oPropertyPath, oDataFieldConverted) {
558
+ var forceEditMode = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
559
+ return getRequiredExpression(oPropertyPath, oDataFieldConverted, forceEditMode, true);
560
+ };
561
+
562
+ _exports.getRequiredExpressionAsObject = getRequiredExpressionAsObject;
563
+
524
564
  var getRequiredExpression = function (oPropertyPath, oDataFieldConverted) {
525
565
  var forceEditMode = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
526
566
  var bAsObject = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
567
+ var oRequiredProperties = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {};
568
+ var returnExpression;
569
+ var aRequiredPropertiesFromInsertRestrictions = oRequiredProperties.requiredPropertiesFromInsertRestrictions || [];
570
+ var aRequiredPropertiesFromUpdateRestrictions = oRequiredProperties.requiredPropertiesFromUpdateRestrictions || [];
527
571
 
528
572
  if (!oPropertyPath || typeof oPropertyPath === "string") {
529
- return compileBinding(false);
530
- }
573
+ returnExpression = constant(false);
574
+ } else {
575
+ var dataFieldRequiredExpression = constant(true);
531
576
 
532
- var dataFieldRequiredExpression = true;
577
+ if (oDataFieldConverted !== null) {
578
+ dataFieldRequiredExpression = isRequiredExpression(oDataFieldConverted);
579
+ }
533
580
 
534
- if (oDataFieldConverted !== null) {
535
- dataFieldRequiredExpression = isRequiredExpression(oDataFieldConverted);
536
- }
581
+ var requiredPropertyFromInsertRestrictionsExpression = constant(false);
582
+ var requiredPropertyFromUpdateRestrictionsExpression = constant(false);
583
+ var oProperty = isPathExpression(oPropertyPath) && oPropertyPath.$target || oPropertyPath; // Enablement depends on the field control expression
584
+ // If the Field control is statically in Inapplicable (disabled) -> not enabled
537
585
 
538
- var oProperty = isPathExpression(oPropertyPath) && oPropertyPath.$target || oPropertyPath; // Enablement depends on the field control expression
539
- // If the Field control is statically in Inapplicable (disabled) -> not enabled
586
+ var requiredExpression = isRequiredExpression(oProperty);
587
+ var editMode = forceEditMode || UI.IsEditable;
588
+
589
+ if (aRequiredPropertiesFromInsertRestrictions.length && aRequiredPropertiesFromInsertRestrictions.includes(oPropertyPath.name)) {
590
+ requiredPropertyFromInsertRestrictionsExpression = and(constant(true), UI.IsCreateMode);
591
+ }
540
592
 
541
- var requiredExpression = isRequiredExpression(oProperty);
542
- var editMode = forceEditMode || UI.IsEditable;
593
+ if (aRequiredPropertiesFromUpdateRestrictions.length && aRequiredPropertiesFromUpdateRestrictions.includes(oPropertyPath.name)) {
594
+ requiredPropertyFromUpdateRestrictionsExpression = and(constant(true), notEqual(UI.IsCreateMode, true));
595
+ }
596
+
597
+ returnExpression = or(and(or(requiredExpression, dataFieldRequiredExpression), editMode), requiredPropertyFromInsertRestrictionsExpression, requiredPropertyFromUpdateRestrictionsExpression);
598
+ }
543
599
 
544
600
  if (bAsObject) {
545
- return and(or(requiredExpression, dataFieldRequiredExpression), editMode);
601
+ return returnExpression;
546
602
  }
547
603
 
548
- return compileBinding(and(or(requiredExpression, dataFieldRequiredExpression), editMode));
604
+ return compileExpression(returnExpression);
549
605
  };
550
606
 
551
607
  _exports.getRequiredExpression = getRequiredExpression;
@@ -598,15 +654,16 @@ sap.ui.define(["sap/fe/core/converters/helpers/BindingHelper", "sap/fe/core/conv
598
654
  }
599
655
 
600
656
  break;
657
+ // no default
601
658
  }
602
659
 
603
- isRequiredExpressions.push(getRequiredExpression(propertyPath, dataField, false, true));
660
+ isRequiredExpressions.push(getRequiredExpressionAsObject(propertyPath, dataField, false));
604
661
  }
605
662
 
606
- return compileBinding(or.apply(void 0, _toConsumableArray(isRequiredExpressions)));
663
+ return compileExpression(or.apply(void 0, _toConsumableArray(isRequiredExpressions)));
607
664
  };
608
665
 
609
666
  _exports.getRequiredExpressionForConnectedDataField = getRequiredExpressionForConnectedDataField;
610
667
  return _exports;
611
668
  }, false);
612
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlVJRm9ybWF0dGVycy50cyJdLCJuYW1lcyI6WyJFRE1fVFlQRV9NQVBQSU5HIiwiRGlzcGxheU1vZGVGb3JtYXR0ZXIiLCJnZXREaXNwbGF5TW9kZSIsIm9EYXRhTW9kZWxPYmplY3RQYXRoIiwidGFyZ2V0T2JqZWN0IiwiZ2V0RWRpdGFibGVFeHByZXNzaW9uIiwib1Byb3BlcnR5UGF0aCIsIm9EYXRhRmllbGRDb252ZXJ0ZWQiLCJiQXNPYmplY3QiLCJpc0VkaXRhYmxlIiwiVUkiLCJJc0VkaXRhYmxlIiwiY29tcGlsZUJpbmRpbmciLCJkYXRhRmllbGRFZGl0YWJsZUV4cHJlc3Npb24iLCJpZkVsc2UiLCJpc05vbkVkaXRhYmxlRXhwcmVzc2lvbiIsIm9Qcm9wZXJ0eSIsImlzUGF0aEV4cHJlc3Npb24iLCIkdGFyZ2V0IiwiaXNQYXRoVXBkYXRhYmxlRXhwcmVzc2lvbiIsImlzUGF0aFVwZGF0YWJsZSIsInByb3BlcnR5UGF0aCIsInBhdGhWaXNpdG9yIiwicGF0aCIsIm5hdmlnYXRpb25QYXRocyIsInNpbmdsZXRvblBhdGhWaXNpdG9yIiwiY29udmVydGVkVHlwZXMiLCJlZGl0YWJsZUV4cHJlc3Npb24iLCJvciIsIm5vdCIsImlzQ29tcHV0ZWQiLCJpc0tleSIsImlzSW1tdXRhYmxlIiwiSXNUcmFuc2llbnRCaW5kaW5nIiwiYW5kIiwiZ2V0Q29sbGFib3JhdGlvbkV4cHJlc3Npb24iLCJkYXRhTW9kZWxPYmplY3RQYXRoIiwiZm9ybWF0dGVyIiwib2JqZWN0UGF0aCIsImdldFRhcmdldE9iamVjdFBhdGgiLCJhY3Rpdml0eUV4cHJlc3Npb24iLCJiaW5kaW5nRXhwcmVzc2lvbiIsImtleXMiLCJ0YXJnZXRFbnRpdHlUeXBlIiwia2V5c0V4cHJlc3Npb25zIiwiZm9yRWFjaCIsImtleSIsImtleUV4cHJlc3Npb24iLCJuYW1lIiwicHVzaCIsImZvcm1hdFJlc3VsdCIsImdldEVuYWJsZWRFeHByZXNzaW9uIiwiZGF0YUZpZWxkRW5hYmxlZEV4cHJlc3Npb24iLCJpc0Rpc2FibGVkRXhwcmVzc2lvbiIsImVuYWJsZWRFeHByZXNzaW9uIiwiZ2V0RWRpdE1vZGUiLCJiTWVhc3VyZVJlYWRPbmx5IiwiYXNzb2NpYXRlZEN1cnJlbmN5UHJvcGVydHkiLCJnZXRBc3NvY2lhdGVkQ3VycmVuY3lQcm9wZXJ0eSIsInVuaXRQcm9wZXJ0eSIsImdldEFzc29jaWF0ZWRVbml0UHJvcGVydHkiLCJyZXN1bHRFeHByZXNzaW9uIiwiaXNSZWFkT25seUV4cHJlc3Npb24iLCJyZWFkT25seUV4cHJlc3Npb24iLCJlZGl0TW9kZUV4cHJlc3Npb24iLCJpc0NvbnN0YW50IiwiaGFzVmFsaWRBbmFseXRpY2FsQ3VycmVuY3lPclVuaXQiLCJvUHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoIiwib1Byb3BlcnR5RGVmaW5pdGlvbiIsImN1cnJlbmN5IiwiYW5ub3RhdGlvbnMiLCJNZWFzdXJlcyIsIklTT0N1cnJlbmN5IiwibWVhc3VyZSIsIlVuaXQiLCJpc1RydXRoeSIsImFubm90YXRpb25FeHByZXNzaW9uIiwiSXNUb3RhbCIsImNvbnN0YW50IiwiaWZVbml0RWRpdGFibGUiLCJzRWRpdGFibGVWYWx1ZSIsInNOb25FZGl0YWJsZVZhbHVlIiwiZ2V0RmllbGREaXNwbGF5Iiwic1RhcmdldERpc3BsYXlNb2RlIiwib0NvbXB1dGVkRWRpdE1vZGUiLCJoYXNWYWx1ZUhlbHAiLCJlcXVhbCIsImZvcm1hdFdpdGhUeXBlSW5mb3JtYXRpb24iLCJwcm9wZXJ0eUJpbmRpbmdFeHByZXNzaW9uIiwiaWdub3JlQ29uc3RyYWludHMiLCJvdXRFeHByZXNzaW9uIiwiX3R5cGUiLCJvVGFyZ2V0TWFwcGluZyIsInR5cGUiLCJjb25zdHJhaW50cyIsIiRTY2FsZSIsInNjYWxlIiwidW5kZWZpbmVkIiwiJFByZWNpc2lvbiIsInByZWNpc2lvbiIsIiRNYXhMZW5ndGgiLCJtYXhMZW5ndGgiLCJudWxsYWJsZSIsIlZhbGlkYXRpb24iLCJNaW5pbXVtIiwiaXNOYU4iLCJtaW5pbXVtIiwiTWF4aW11bSIsIm1heGltdW0iLCJpbmRleE9mIiwiZm9ybWF0T3B0aW9ucyIsIk9iamVjdCIsImFzc2lnbiIsInBhcnNlQXNTdHJpbmciLCJlbXB0eVN0cmluZyIsInBhcnNlS2VlcHNFbXB0eVN0cmluZyIsIkNvbW1vbiIsIklzRGlnaXRTZXF1ZW5jZSIsImlzRGlnaXRTZXF1ZW5jZSIsIlY0IiwiZ2V0VHlwZUNvbmZpZyIsImRhdGFUeXBlIiwicHJvcGVydHlUeXBlQ29uZmlnIiwiaXNQcm9wZXJ0eSIsIiROdWxsYWJsZSIsIiRWNCIsImdldEJpbmRpbmdXaXRoVW5pdE9yQ3VycmVuY3kiLCJvUHJvcGVydHlEYXRhTW9kZWxQYXRoIiwiaWdub3JlVW5pdENvbnN0cmFpbnQiLCJ1bml0IiwicmVsYXRpdmVMb2NhdGlvbiIsImdldFBhdGhSZWxhdGl2ZUxvY2F0aW9uIiwiY29udGV4dExvY2F0aW9uIiwibmF2aWdhdGlvblByb3BlcnRpZXMiLCJtYXAiLCJucCIsInRvU3RyaW5nIiwidmFsdWVGb3JtYXR0ZXJzIiwiZm9ybWF0V2l0aFBlcmNlbnRhZ2UiLCJjb21wbGV4VHlwZSIsInVuaXRCaW5kaW5nRXhwcmVzc2lvbiIsImFkZFR5cGVJbmZvcm1hdGlvbiIsImdldEJpbmRpbmdXaXRoVGltZXpvbmUiLCJoaWRlVGltZXpvbmVGb3JFbXB0eVZhbHVlcyIsInRpbWV6b25lIiwiVGltZXpvbmUiLCJzaG93VGltZXpvbmVGb3JFbXB0eVZhbHVlcyIsImdldEFsaWdubWVudEV4cHJlc3Npb24iLCJzQWxpZ25EaXNwbGF5Iiwic0FsaWduRWRpdCIsImdldENvbnZlcnRlckNvbnRleHQiLCJvQ29udGV4dCIsIm9JbnRlcmZhY2UiLCJjb250ZXh0IiwiY29udmVydE1ldGFNb2RlbENvbnRleHQiLCJyZXF1aXJlc0lDb250ZXh0IiwiZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCIsImdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyIsImdldEV4cHJlc3Npb25CaW5kaW5nIiwiZXhwcmVzc2lvbiIsImlzQ29sbGVjdGlvbkZpZWxkIiwib0RhdGFNb2RlbFBhdGgiLCJsZW5ndGgiLCJoYXNPbmVUb01hbnlOYXZpZ2F0aW9uIiwiZmluZEluZGV4Iiwib05hdiIsImlzQ29sbGVjdGlvbiIsIm9Db250ZXh0TmF2IiwiZ2V0UmVxdWlyZWRFeHByZXNzaW9uIiwiZm9yY2VFZGl0TW9kZSIsImRhdGFGaWVsZFJlcXVpcmVkRXhwcmVzc2lvbiIsImlzUmVxdWlyZWRFeHByZXNzaW9uIiwicmVxdWlyZWRFeHByZXNzaW9uIiwiZWRpdE1vZGUiLCJnZXRSZXF1aXJlZEV4cHJlc3Npb25Gb3JDb25uZWN0ZWREYXRhRmllbGQiLCJkYXRhRmllbGRPYmplY3RQYXRoIiwiZGF0YSIsIkRhdGEiLCJkYXRhRmllbGRzIiwiaXNSZXF1aXJlZEV4cHJlc3Npb25zIiwiZGF0YUZpZWxkIiwiJFR5cGUiLCJWYWx1ZSIsIlRhcmdldCJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFvRE8sTUFBTUEsZ0JBQWdCLEdBQUdDLG9CQUFvQixDQUFDRCxnQkFBOUM7OztBQW1DQSxNQUFNRSxjQUFjLEdBQUcsVUFBVUMsb0JBQVYsRUFBa0U7QUFDL0YsV0FBT0Ysb0JBQW9CLENBQUNDLGNBQXJCLENBQW9DQyxvQkFBb0IsQ0FBQ0MsWUFBekQsRUFBdUVELG9CQUF2RSxDQUFQO0FBQ0EsR0FGTTtBQUlQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQUNPLE1BQU1FLHFCQUFxQixHQUFHLFVBQ3BDQyxhQURvQyxFQU0wQjtBQUFBLFFBSjlEQyxtQkFJOEQsdUVBSm5DLElBSW1DO0FBQUEsUUFIOURKLG9CQUc4RDtBQUFBLFFBRjlESyxTQUU4RCx1RUFGekMsS0FFeUM7QUFBQSxRQUQ5REMsVUFDOEQsdUVBRGpCQyxFQUFFLENBQUNDLFVBQ2M7O0FBQzlELFFBQUksQ0FBQ0wsYUFBRCxJQUFrQixPQUFPQSxhQUFQ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Q00iLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5hdmlnYXRpb25Qcm9wZXJ0eSwgUHJvcGVydHkgfSBmcm9tIFwiQHNhcC11eC9hbm5vdGF0aW9uLWNvbnZlcnRlclwiO1xuaW1wb3J0IHsgRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlc1wiO1xuaW1wb3J0IHsgUGF0aEFubm90YXRpb25FeHByZXNzaW9uIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3R5cGVzL0VkbVwiO1xuaW1wb3J0IHsgVUlBbm5vdGF0aW9uVHlwZXMgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdHlwZXMvZ2VuZXJhdGVkL1VJXCI7XG5pbXBvcnQgeyBzaW5nbGV0b25QYXRoVmlzaXRvciwgVUkgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9oZWxwZXJzL0JpbmRpbmdIZWxwZXJcIjtcbmltcG9ydCB7IGNvbnZlcnRNZXRhTW9kZWxDb250ZXh0LCBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9NZXRhTW9kZWxDb252ZXJ0ZXJcIjtcbmltcG9ydCB2YWx1ZUZvcm1hdHRlcnMgZnJvbSBcInNhcC9mZS9jb3JlL2Zvcm1hdHRlcnMvVmFsdWVGb3JtYXR0ZXJcIjtcbmltcG9ydCB7XG5cdGFkZFR5cGVJbmZvcm1hdGlvbixcblx0YW5kLFxuXHRhbm5vdGF0aW9uRXhwcmVzc2lvbixcblx0YmluZGluZ0V4cHJlc3Npb24sXG5cdEJpbmRpbmdFeHByZXNzaW9uLFxuXHRCaW5kaW5nRXhwcmVzc2lvbkV4cHJlc3Npb24sXG5cdGNvbXBpbGVCaW5kaW5nLFxuXHRjb25zdGFudCxcblx0ZXF1YWwsXG5cdEV4cHJlc3Npb24sXG5cdEV4cHJlc3Npb25PclByaW1pdGl2ZSxcblx0Zm9ybWF0UmVzdWx0LFxuXHRpZkVsc2UsXG5cdGlzQ29uc3RhbnQsXG5cdGlzVHJ1dGh5LFxuXHRub3QsXG5cdG9yXG59IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0JpbmRpbmdFeHByZXNzaW9uXCI7XG5pbXBvcnQge1xuXHREYXRhTW9kZWxPYmplY3RQYXRoLFxuXHRnZXRQYXRoUmVsYXRpdmVMb2NhdGlvbixcblx0Z2V0VGFyZ2V0T2JqZWN0UGF0aCxcblx0aXNQYXRoVXBkYXRhYmxlXG59IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL0RhdGFNb2RlbFBhdGhIZWxwZXJcIjtcbmltcG9ydCAqIGFzIERpc3BsYXlNb2RlRm9ybWF0dGVyIGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL0Rpc3BsYXlNb2RlRm9ybWF0dGVyXCI7XG5pbXBvcnQge1xuXHRpc0Rpc2FibGVkRXhwcmVzc2lvbixcblx0aXNOb25FZGl0YWJsZUV4cHJlc3Npb24sXG5cdGlzUmVhZE9ubHlFeHByZXNzaW9uLFxuXHRpc1JlcXVpcmVkRXhwcmVzc2lvblxufSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9GaWVsZENvbnRyb2xIZWxwZXJcIjtcbmltcG9ydCB7XG5cdGdldEFzc29jaWF0ZWRDdXJyZW5jeVByb3BlcnR5LFxuXHRnZXRBc3NvY2lhdGVkVW5pdFByb3BlcnR5LFxuXHRoYXNWYWx1ZUhlbHAsXG5cdGlzQ29tcHV0ZWQsXG5cdGlzSW1tdXRhYmxlLFxuXHRpc0tleSxcblx0aXNQYXRoRXhwcmVzc2lvbixcblx0aXNQcm9wZXJ0eVxufSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9Qcm9wZXJ0eUhlbHBlclwiO1xuaW1wb3J0IENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5cbi8vIEltcG9ydC1leHBvcnQgbWV0aG9kIHVzZWQgYnkgdGhlIGNvbnZlcnRlciB0byB1c2UgdGhlbSBpbiB0aGUgdGVtcGxhdGluZyB0aHJvdWdoIHRoZSBVSUZvcm1hdHRlcnMuXG5leHBvcnQgdHlwZSBEaXNwbGF5TW9kZSA9IERpc3BsYXlNb2RlRm9ybWF0dGVyLkRpc3BsYXlNb2RlO1xuXG5leHBvcnQgY29uc3QgRURNX1RZUEVfTUFQUElORyA9IERpc3BsYXlNb2RlRm9ybWF0dGVyLkVETV9UWVBFX01BUFBJTkc7XG5cbmV4cG9ydCB0eXBlIFByb3BlcnR5T3JQYXRoPFA+ID0gc3RyaW5nIHwgUCB8IFBhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbjxQPjtcbmV4cG9ydCB0eXBlIE1ldGFNb2RlbENvbnRleHQgPSB7XG5cdCRraW5kOiBzdHJpbmc7XG59O1xuZXhwb3J0IHR5cGUgQ29tcHV0ZWRBbm5vdGF0aW9uSW50ZXJmYWNlID0ge1xuXHRjb250ZXh0OiBDb250ZXh0O1xuXHRhcmd1bWVudHM/OiBhbnlbXTtcblx0JCR2YWx1ZUFzUHJvbWlzZT86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgdHlwZSBjb25maWdUeXBlQ29uc3RyYWludHMgPSB7XG5cdHNjYWxlPzogbnVtYmVyO1xuXHRwcmVjaXNpb24/OiBudW1iZXI7XG5cdG1heExlbmd0aD86IG51bWJlcjtcblx0bnVsbGFibGU/OiBib29sZWFuO1xuXHRtaW5pbXVtPzogc3RyaW5nO1xuXHRtYXhpbXVtPzogc3RyaW5nO1xuXHRpc0RpZ2l0U2VxdWVuY2U/OiBib29sZWFuO1xuXHRWND86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgdHlwZSBjb25maWdUeXBlZm9ybWF0T3B0aW9ucyA9IHtcblx0cGFyc2VBc1N0cmluZz86IGJvb2xlYW47XG5cdGVtcHR5U3RyaW5nPzogc3RyaW5nO1xuXHRwYXJzZUtlZXBzRW1wdHlTdHJpbmc/OiBib29sZWFuO1xufTtcblxuZXhwb3J0IHR5cGUgY29uZmlnVHlwZSA9IHtcblx0dHlwZTogc3RyaW5nO1xuXHRjb25zdHJhaW50czogY29uZmlnVHlwZUNvbnN0cmFpbnRzO1xuXHRmb3JtYXRPcHRpb25zOiBjb25maWdUeXBlZm9ybWF0T3B0aW9ucztcbn07XG5cbmV4cG9ydCBjb25zdCBnZXREaXNwbGF5TW9kZSA9IGZ1bmN0aW9uIChvRGF0YU1vZGVsT2JqZWN0UGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aCk6IERpc3BsYXlNb2RlIHtcblx0cmV0dXJuIERpc3BsYXlNb2RlRm9ybWF0dGVyLmdldERpc3BsYXlNb2RlKG9EYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldE9iamVjdCwgb0RhdGFNb2RlbE9iamVjdFBhdGgpO1xufTtcblxuLyoqXG4gKiBDcmVhdGUgdGhlIGV4cHJlc3Npb24gdG8gZ2VuZXJhdGUgYW4gXCJlZGl0YWJsZVwiIGJvb2xlYW4gdmFsdWUuXG4gKlxuICogQHBhcmFtIHtQcm9wZXJ0eVBhdGh9IG9Qcm9wZXJ0eVBhdGggVGhlIGlucHV0IHByb3BlcnR5XG4gKiBAcGFyYW0ge29iamVjdH0gb0RhdGFGaWVsZENvbnZlcnRlZCBUaGUgRGF0YUZpZWxkQ29udmVydGVkIG9iamVjdCB0byByZWFkIHRoZSBmaWVsZENvbnRyb2wgYW5ub3RhdGlvblxuICogQHBhcmFtIHtEYXRhTW9kZWxPYmplY3RQYXRofSBvRGF0YU1vZGVsT2JqZWN0UGF0aCBUaGUgcGF0aCB0byB0aGlzIHByb3BlcnR5IG9iamVjdFxuICogQHBhcmFtIHtib29sZWFufSBiQXNPYmplY3QgV2hldGhlciBvciBub3QgdGhpcyBzaG91bGQgYmUgcmV0dXJuZWQgYXMgYW4gb2JqZWN0IG9yIGEgYmluZGluZyBzdHJpbmdcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNFZGl0YWJsZSBXaGV0aGVyIG9yIG5vdCBVSS5Jc0VkaXRhYmxlIGJlIGNvbnNpZGVyZWQuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgYmluZGluZyBleHByZXNzaW9uIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIGEgcHJvcGVydHkgaXMgZWRpdGFibGUgb3Igbm90XG4gKi9cbmV4cG9ydCBjb25zdCBnZXRFZGl0YWJsZUV4cHJlc3Npb24gPSBmdW5jdGlvbiAoXG5cdG9Qcm9wZXJ0eVBhdGg6IFByb3BlcnR5T3JQYXRoPFByb3BlcnR5Pixcblx0b0RhdGFGaWVsZENvbnZlcnRlZDogYW55ID0gbnVsbCxcblx0b0RhdGFNb2RlbE9iamVjdFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGgsXG5cdGJBc09iamVjdDogYm9vbGVhbiA9IGZhbHNlLFxuXHRpc0VkaXRhYmxlOiBFeHByZXNzaW9uT3JQcmltaXRpdmU8Ym9vbGVhbj4gPSBVSS5Jc0VkaXRhYmxlXG4pOiBCaW5kaW5nRXhwcmVzc2lvbjxib29sZWFuPiB8IEV4cHJlc3Npb25PclByaW1pdGl2ZTxib29sZWFuPiB7XG5cdGlmICghb1Byb3BlcnR5UGF0aCB8fCB0eXBlb2Ygb1Byb3BlcnR5UGF0aCA9PT0gXCJzdHJpbmdcIikge1xuXHRcdHJldHVybiBjb21waWxlQmluZGluZyhmYWxzZSk7XG5cdH1cblx0bGV0IGRhdGFGaWVsZEVkaXRhYmxlRXhwcmVzc2lvbjogQmluZGluZ0V4cHJlc3Npb248Ym9vbGVhbj4gfCBFeHByZXNzaW9uT3JQcmltaXRpdmU8Ym9vbGVhbj4gPSB0cnVlO1xuXHRpZiAob0RhdGFGaWVsZENvbnZlcnRlZCAhPT0gbnVsbCkge1xuXHRcdGRhdGFGaWVsZEVkaXRhYmxlRXhwcmVzc2lvbiA9IGlmRWxzZShpc05vbkVkaXRhYmxlRXhwcmVzc2lvbihvRGF0YUZpZWxkQ29udmVydGVkKSwgZmFsc2UsIGlzRWRpdGFibGUpO1xuXHR9XG5cblx0Y29uc3Qgb1Byb3BlcnR5OiBQcm9wZXJ0eSA9IChpc1BhdGhFeHByZXNzaW9uKG9Qcm9wZXJ0eVBhdGgpICYmIG9Qcm9wZXJ0eVBhdGguJHRhcmdldCkgfHwgKG9Qcm9wZXJ0eVBhdGggYXMgUHJvcGVydHkpO1xuXHQvLyBFZGl0YWJpbGl0eSBkZXBlbmRzIG9uIHRoZSBmaWVsZCBjb250cm9sIGV4cHJlc3Npb25cblx0Ly8gSWYgdGhlIEZpZWxkIGNvbnRyb2wgaXMgc3RhdGljYWxseSBpbiBSZWFkT25seSBvciBJbmFwcGxpY2FibGUgKGRpc2FibGVkKSAtPiBub3QgZWRpdGFibGVcblx0Ly8gSWYgdGhlIHByb3BlcnR5IGlzIGEga2V5IC0+IG5vdCBlZGl0YWJsZSBleGNlcHQgaW4gY3JlYXRpb24gaWYgbm90IGNvbXB1dGVkXG5cdC8vIElmIHRoZSBwcm9wZXJ0eSBpcyBjb21wdXRlZCAtPiBub3QgZWRpdGFibGVcblx0Ly8gSWYgdGhlIHByb3BlcnR5IGlzIG5vdCB1cGRhdGFibGUgLT4gbm90IGVkaXRhYmxlXG5cdC8vIElmIHRoZSBwcm9wZXJ0eSBpcyBpbW11dGFibGUgLT4gbm90IGVkaXRhYmxlIGV4Y2VwdCBpbiBjcmVhdGlvblxuXHQvLyBJZiB0aGUgRmllbGQgY29udHJvbCBpcyBhIHBhdGggcmVzb2x2aW5nIHRvIFJlYWRPbmx5IG9yIEluYXBwbGljYWJsZSAoZGlzYWJsZWQpICg8PSAxKSAtPiBub3QgZWRpdGFibGVcblx0Ly8gRWxzZSwgdG8gYmUgZWRpdGFibGUgeW91IG5lZWRcblx0Ly8gaW1tdXRhYmxlIGFuZCBrZXkgd2hpbGUgaW4gdGhlIGNyZWF0aW9uIHJvd1xuXHQvLyB1aS9pc0VkaXRhYmxlXG5cdGNvbnN0IGlzUGF0aFVwZGF0YWJsZUV4cHJlc3Npb24gPSBpc1BhdGhVcGRhdGFibGUob0RhdGFNb2RlbE9iamVjdFBhdGgsIHtcblx0XHRwcm9wZXJ0eVBhdGg6IG9Qcm9wZXJ0eVBhdGgsXG5cdFx0cGF0aFZpc2l0b3I6IChwYXRoOiBzdHJpbmcsIG5hdmlnYXRpb25QYXRoczogc3RyaW5nW10pID0+XG5cdFx0XHRzaW5nbGV0b25QYXRoVmlzaXRvcihwYXRoLCBvRGF0YU1vZGVsT2JqZWN0UGF0aC5jb252ZXJ0ZWRUeXBlcywgbmF2aWdhdGlvblBhdGhzKVxuXHR9KTtcblx0Y29uc3QgZWRpdGFibGVFeHByZXNzaW9uID0gaWZFbHNlKFxuXHRcdG9yKFxuXHRcdFx0bm90KGlzUGF0aFVwZGF0YWJsZUV4cHJlc3Npb24pLFxuXHRcdFx0aXNDb21wdXRlZChvUHJvcGVydHkpLFxuXHRcdFx0aXNLZXkob1Byb3BlcnR5KSxcblx0XHRcdGlzSW1tdXRhYmxlKG9Qcm9wZXJ0eSksXG5cdFx0XHRpc05vbkVkaXRhYmxlRXhwcmVzc2lvbihvUHJvcGVydHkpXG5cdFx0KSxcblx0XHRpZkVsc2Uob3IoaXNDb21wdXRlZChvUHJvcGVydHkpLCBpc05vbkVkaXRhYmxlRXhwcmVzc2lvbihvUHJvcGVydHkpKSwgZmFsc2UsIFVJLklzVHJhbnNpZW50QmluZGluZyksXG5cdFx0aXNFZGl0YWJsZVxuXHQpO1xuXHRpZiAoYkFzT2JqZWN0KSB7XG5cdFx0cmV0dXJuIGFuZChlZGl0YWJsZUV4cHJlc3Npb24sIGRhdGFGaWVsZEVkaXRhYmxlRXhwcmVzc2lvbik7XG5cdH1cblx0cmV0dXJuIGNvbXBpbGVCaW5kaW5nKGFuZChlZGl0YWJsZUV4cHJlc3Npb24sIGRhdGFGaWVsZEVkaXRhYmxlRXhwcmVzc2lvbikpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldENvbGxhYm9yYXRpb25FeHByZXNzaW9uID0gZnVuY3Rpb24gKGRhdGFNb2RlbE9iamVjdFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGgsIGZvcm1hdHRlcjogYW55KTogQmluZGluZ0V4cHJlc3Npb248YW55PiB7XG5cdGNvbnN0IG9iamVjdFBhdGggPSBnZXRUYXJnZXRPYmplY3RQYXRoKGRhdGFNb2RlbE9iamVjdFBhdGgpO1xuXHRjb25zdCBhY3Rpdml0eUV4cHJlc3Npb24gPSBiaW5kaW5nRXhwcmVzc2lvbihcIi9jb2xsYWJvcmF0aW9uL2FjdGl2aXRpZXNcIiArIG9iamVjdFBhdGgsIFwiaW50ZXJuYWxcIik7XG5cdGNvbnN0IGtleXMgPSBkYXRhTW9kZWxPYmplY3RQYXRoPy50YXJnZXRFbnRpdHlUeXBlPy5rZXlzO1xuXHRjb25zdCBrZXlzRXhwcmVzc2lvbnM6IEJpbmRpbmdFeHByZXNzaW9uRXhwcmVzc2lvbjxhbnk+W10gPSBbXTtcblx0a2V5cz8uZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG5cdFx0Y29uc3Qga2V5RXhwcmVzc2lvbiA9IGJpbmRpbmdFeHByZXNzaW9uKGtleS5uYW1lKSBhcyBCaW5kaW5nRXhwcmVzc2lvbkV4cHJlc3Npb248YW55Pjtcblx0XHRrZXlzRXhwcmVzc2lvbnMucHVzaChrZXlFeHByZXNzaW9uKTtcblx0fSk7XG5cdHJldHVybiBmb3JtYXRSZXN1bHQoW2FjdGl2aXR5RXhwcmVzc2lvbiwgLi4ua2V5c0V4cHJlc3Npb25zXSwgZm9ybWF0dGVyKTtcbn07XG5cbi8qKlxuICogQ3JlYXRlIHRoZSBleHByZXNzaW9uIHRvIGdlbmVyYXRlIGFuIFwiZW5hYmxlZFwiIGJvb2xlYW4gdmFsdWUuXG4gKlxuICogQHBhcmFtIHtQcm9wZXJ0eVBhdGh9IG9Qcm9wZXJ0eVBhdGggVGhlIGlucHV0IHByb3BlcnR5XG4gKiBAcGFyYW0ge2FueX0gb0RhdGFGaWVsZENvbnZlcnRlZCBUaGUgRGF0YUZpZWxkQ29udmVydGVkIE9iamVjdCB0byByZWFkIHRoZSBmaWVsZENvbnRyb2wgYW5ub3RhdGlvblxuICogQHBhcmFtIHtib29sZWFufSBiQXNPYmplY3QgV2hldGhlciBvciBub3QgdGhpcyBzaG91bGQgYmUgcmV0dXJuZWQgYXMgYW4gb2JqZWN0IG9yIGEgYmluZGluZyBzdHJpbmdcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBiaW5kaW5nIGV4cHJlc3Npb24gdG8gZGV0ZXJtaW5lIGlmIGEgcHJvcGVydHkgaXMgZW5hYmxlZCBvciBub3RcbiAqL1xuZXhwb3J0IGNvbnN0IGdldEVuYWJsZWRFeHByZXNzaW9uID0gZnVuY3Rpb24gKFxuXHRvUHJvcGVydHlQYXRoOiBQcm9wZXJ0eU9yUGF0aDxQcm9wZXJ0eT4sXG5cdG9EYXRhRmllbGRDb252ZXJ0ZWQ/OiBhbnksXG5cdGJBc09iamVjdDogYm9vbGVhbiA9IGZhbHNlXG4pOiBCaW5kaW5nRXhwcmVzc2lvbjxib29sZWFuPiB8IEV4cHJlc3Npb25PclByaW1pdGl2ZTxib29sZWFuPiB7XG5cdGlmICghb1Byb3BlcnR5UGF0aCB8fCB0eXBlb2Ygb1Byb3BlcnR5UGF0aCA9PT0gXCJzdHJpbmdcIikge1xuXHRcdHJldHVybiBjb21waWxlQmluZGluZyh0cnVlKTtcblx0fVxuXHRsZXQgZGF0YUZpZWxkRW5hYmxlZEV4cHJlc3Npb246IEJpbmRpbmdFeHByZXNzaW9uPGJvb2xlYW4+IHwgRXhwcmVzc2lvbk9yUHJpbWl0aXZlPGJvb2xlYW4+ID0gdHJ1ZTtcblx0aWYgKG9EYXRhRmllbGRDb252ZXJ0ZWQgIT09IG51bGwpIHtcblx0XHRkYXRhRmllbGRFbmFibGVkRXhwcmVzc2lvbiA9IGlmRWxzZShpc0Rpc2FibGVkRXhwcmVzc2lvbihvRGF0YUZpZWxkQ29udmVydGVkKSwgZmFsc2UsIHRydWUpO1xuXHR9XG5cblx0Y29uc3Qgb1Byb3BlcnR5OiBQcm9wZXJ0eSA9IChpc1BhdGhFeHByZXNzaW9uKG9Qcm9wZXJ0eVBhdGgpICYmIG9Qcm9wZXJ0eVBhdGguJHRhcmdldCkgfHwgKG9Qcm9wZXJ0eVBhdGggYXMgUHJvcGVydHkpO1xuXHQvLyBFbmFibGVtZW50IGRlcGVuZHMgb24gdGhlIGZpZWxkIGNvbnRyb2wgZXhwcmVzc2lvblxuXHQvLyBJZiB0aGUgRmllbGQgY29udHJvbCBpcyBzdGF0aWNhbGx5IGluIEluYXBwbGljYWJsZSAoZGlzYWJsZWQpIC0+IG5vdCBlbmFibGVkXG5cdGNvbnN0IGVuYWJsZWRFeHByZXNzaW9uID0gaWZFbHNlKGlzRGlzYWJsZWRFeHByZXNzaW9uKG9Qcm9wZXJ0eSksIGZhbHNlLCB0cnVlKTtcblx0aWYgKGJBc09iamVjdCkge1xuXHRcdHJldHVybiBhbmQoZW5hYmxlZEV4cHJlc3Npb24sIGRhdGFGaWVsZEVuYWJsZWRFeHByZXNzaW9uKTtcblx0fVxuXHRyZXR1cm4gY29tcGlsZUJpbmRpbmcoYW5kKGVuYWJsZWRFeHByZXNzaW9uLCBkYXRhRmllbGRFbmFibGVkRXhwcmVzc2lvbikpO1xufTtcblxuLyoqXG4gKiBDcmVhdGUgdGhlIGV4cHJlc3Npb24gdG8gZ2VuZXJhdGUgYW4gXCJlZGl0TW9kZVwiIGVudW0gdmFsdWUuXG4gKlxuICogQHBhcmFtIHtQcm9wZXJ0eVBhdGh9IG9Qcm9wZXJ0eVBhdGggVGhlIGlucHV0IHByb3BlcnR5XG4gKiBAcGFyYW0ge0RhdGFNb2RlbE9iamVjdFBhdGh9IG9EYXRhTW9kZWxPYmplY3RQYXRoIFRoZSBsaXN0IG9mIGRhdGEgbW9kZWwgb2JqZWN0cyB0aGF0IGFyZSBpbnZvbHZlZCB0byByZWFjaCB0aGF0IHByb3BlcnR5XG4gKiBAcGFyYW0ge2Jvb2xlYW59IGJNZWFzdXJlUmVhZE9ubHkgV2hldGhlciB3ZSBzaG91bGQgc2V0IFVvTSAvIGN1cnJlbmN5IGZpZWxkIG1vZGUgdG8gcmVhZCBvbmx5XG4gKiBAcGFyYW0ge2Jvb2xlYW59IGJBc09iamVjdCBXaGV0aGVyIHdlIHNob3VsZCByZXR1cm4gdGhpcyBhcyBhbiBleHByZXNzaW9uIG9yIGFzIGEgc3RyaW5nXG4gKiBAcGFyYW0ge29iamVjdH0gb0RhdGFGaWVsZENvbnZlcnRlZCBUaGUgZGF0YUZpZWxkIG9iamVjdFxuICogQHBhcmFtIHtib29sZWFufSBpc0VkaXRhYmxlIFdoZXRoZXIgb3Igbm90IFVJLklzRWRpdGFibGUgYmUgY29uc2lkZXJlZC5cbiAqIEByZXR1cm5zIHtCaW5kaW5nRXhwcmVzc2lvbjxzdHJpbmc+IHwgRXhwcmVzc2lvbk9yUHJpbWl0aXZlPHN0cmluZz59IFRoZSBiaW5kaW5nIGV4cHJlc3Npb24gcmVwcmVzZW50aW5nIHRoZSBjdXJyZW50IHByb3BlcnR5IGVkaXQgbW9kZSwgY29tcGxpYW50IHdpdGggdGhlIE1EQyBGaWVsZCBkZWZpbml0aW9uIG9mIGVkaXRNb2RlLlxuICovXG5leHBvcnQgY29uc3QgZ2V0RWRpdE1vZGUgPSBmdW5jdGlvbiAoXG5cdG9Qcm9wZXJ0eVBhdGg6IFByb3BlcnR5T3JQYXRoPFByb3BlcnR5Pixcblx0b0RhdGFNb2RlbE9iamVjdFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGgsXG5cdGJNZWFzdXJlUmVhZE9ubHk6IGJvb2xlYW4gPSBmYWxzZSxcblx0YkFzT2JqZWN0OiBib29sZWFuID0gZmFsc2UsXG5cdG9EYXRhRmllbGRDb252ZXJ0ZWQ6IGFueSA9IG51bGwsXG5cdGlzRWRpdGFibGU6IEV4cHJlc3Npb25PclByaW1pdGl2ZTxib29sZWFuPiA9IFVJLklzRWRpdGFibGVcbik6IEJpbmRpbmdFeHByZXNzaW9uPHN0cmluZz4gfCBFeHByZXNzaW9uT3JQcmltaXRpdmU8c3RyaW5nPiB7XG5cdGlmICghb1Byb3BlcnR5UGF0aCB8fCB0eXBlb2Ygb1Byb3BlcnR5UGF0aCA9PT0gXCJzdHJpbmdcIikge1xuXHRcdHJldHVybiBcIkRpc3BsYXlcIjtcblx0fVxuXHRjb25zdCBvUHJvcGVydHk6IFByb3BlcnR5ID0gKGlzUGF0aEV4cHJlc3Npb24ob1Byb3BlcnR5UGF0aCkgJiYgb1Byb3BlcnR5UGF0aC4kdGFyZ2V0KSB8fCAob1Byb3BlcnR5UGF0aCBhcyBQcm9wZXJ0eSk7XG5cdC8vIGlmIHRoZSBwcm9wZXJ0eSBpcyBub3QgZW5hYmxlZCA9PiBEaXNhYmxlZFxuXHQvLyBpZiB0aGUgcHJvcGVydHkgaXMgZW5hYmxlZCAmJiBub3QgZWRpdGFibGUgPT4gUmVhZE9ubHlcblx0Ly8gaWYgdGhlIHByb3BlcnR5IGlzIGVuYWJsZWQgJiYgZWRpdGFibGUgPT4gRWRpdGFibGVcblx0Ly8gSWYgdGhlcmUgaXMgYW4gYXNzb2NpYXRlZCB1bml0LCBhbmQgaXQgaGFzIGEgZmllbGQgY29udHJvbCBhbHNvIHVzZSBjb25zaWRlciB0aGUgZm9sbG93aW5nXG5cdC8vIGlmIHRoZSB1bml0IGZpZWxkIGNvbnRyb2wgaXMgcmVhZG9ubHkgLT4gRWRpdGFibGVSZWFkT25seVxuXHQvLyBvdGhlcndpc2UgLT4gRWRpdGFibGVcblx0Y29uc3QgZWRpdGFibGVFeHByZXNzaW9uID0gZ2V0RWRpdGFibGVFeHByZXNzaW9uKFxuXHRcdG9Qcm9wZXJ0eVBhdGgsXG5cdFx0b0RhdGFGaWVsZENvbnZlcnRlZCxcblx0XHRvRGF0YU1vZGVsT2JqZWN0UGF0aCxcblx0XHR0cnVlLFxuXHRcdGlzRWRpdGFibGVcblx0KSBhcyBFeHByZXNzaW9uT3JQcmltaXRpdmU8Ym9vbGVhbj47XG5cblx0Y29uc3QgZW5hYmxlZEV4cHJlc3Npb24gPSBnZXRFbmFibGVkRXhwcmVzc2lvbihvUHJvcGVydHlQYXRoLCBvRGF0YUZpZWxkQ29udmVydGVkLCB0cnVlKSBhcyBFeHByZXNzaW9uT3JQcmltaXRpdmU8Ym9vbGVhbj47XG5cdGNvbnN0IGFzc29jaWF0ZWRDdXJyZW5jeVByb3BlcnR5ID0gZ2V0QXNzb2NpYXRlZEN1cnJlbmN5UHJvcGVydHkob1Byb3BlcnR5KTtcblx0Y29uc3QgdW5pdFByb3BlcnR5ID0gYXNzb2NpYXRlZEN1cnJlbmN5UHJvcGVydHkgfHwgZ2V0QXNzb2NpYXRlZFVuaXRQcm9wZXJ0eShvUHJvcGVydHkpO1xuXHRsZXQgcmVzdWx0RXhwcmVzc2lvbjogRXhwcmVzc2lvbk9yUHJpbWl0aXZlPHN0cmluZz4gPSBcIkVkaXRhYmxlXCI7XG5cdGlmICh1bml0UHJvcGVydHkpIHtcblx0XHRyZXN1bHRFeHByZXNzaW9uID0gaWZFbHNlKFxuXHRcdFx0b3IoaXNSZWFkT25seUV4cHJlc3Npb24odW5pdFByb3BlcnR5KSwgaXNDb21wdXRlZCh1bml0UHJvcGVydHkpLCBiTWVhc3VyZVJlYWRPbmx5KSxcblx0XHRcdFwiRWRpdGFibGVSZWFkT25seVwiLFxuXHRcdFx0XCJFZGl0YWJsZVwiXG5cdFx0KTtcblx0fVxuXHRjb25zdCByZWFkT25seUV4cHJlc3Npb24gPSBvcihpc1JlYWRPbmx5RXhwcmVzc2lvbihvUHJvcGVydHkpLCBpc1JlYWRPbmx5RXhwcmVzc2lvbihvRGF0YUZpZWxkQ29udmVydGVkKSk7XG5cblx0Ly8gaWYgdGhlIHByb3BlcnR5IGlzIGZyb20gYSBub24tdXBkYXRhYmxlIGVudGl0eSA9PiBSZWFkIG9ubHkgbW9kZSwgcHJldmlvdXNseSBjYWxjdWxhdGVkIGVkaXQgTW9kZSBpcyBpZ25vcmVkXG5cdC8vIGlmIHRoZSBwcm9wZXJ0eSBpcyBmcm9tIGFuIHVwZGF0YWJsZSBlbnRpdHkgPT4gcHJldmlvdXNseSBjYWxjdWxhdGVkIGVkaXQgTW9kZSBleHByZXNzaW9uXG5cdGNvbnN0IGVkaXRNb2RlRXhwcmVzc2lvbiA9IGlmRWxzZShcblx0XHRlbmFibGVkRXhwcmVzc2lvbixcblx0XHRpZkVsc2UoXG5cdFx0XHRlZGl0YWJsZUV4cHJlc3Npb24sXG5cdFx0XHRyZXN1bHRFeHByZXNzaW9uLFxuXHRcdFx0aWZFbHNlKGFuZCghaXNDb25zdGFudChyZWFkT25seUV4cHJlc3Npb24pICYmIHJlYWRPbmx5RXhwcmVzc2lvbiwgaXNFZGl0YWJsZSksIFwiUmVhZE9ubHlcIiwgXCJEaXNwbGF5XCIpXG5cdFx0KSxcblx0XHRpZkVsc2UoaXNFZGl0YWJsZSwgXCJEaXNhYmxlZFwiLCBcIkRpc3BsYXlcIilcblx0KTtcblx0aWYgKGJBc09iamVjdCkge1xuXHRcdHJldHVybiBlZGl0TW9kZUV4cHJlc3Npb247XG5cdH1cblx0cmV0dXJuIGNvbXBpbGVCaW5kaW5nKGVkaXRNb2RlRXhwcmVzc2lvbik7XG59O1xuXG5leHBvcnQgY29uc3QgaGFzVmFsaWRBbmFseXRpY2FsQ3VycmVuY3lPclVuaXQgPSBmdW5jdGlvbiAob1Byb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aCk6IEJpbmRpbmdFeHByZXNzaW9uPHN0cmluZz4ge1xuXHRjb25zdCBvUHJvcGVydHlEZWZpbml0aW9uID0gb1Byb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRPYmplY3QgYXMgUHJvcGVydHk7XG5cdGNvbnN0IGN1cnJlbmN5ID0gb1Byb3BlcnR5RGVmaW5pdGlvbi5hbm5vdGF0aW9ucz8uTWVhc3VyZXM/LklTT0N1cnJlbmN5O1xuXHRjb25zdCBtZWFzdXJlID0gY3VycmVuY3kgPyBjdXJyZW5jeSA6IG9Qcm9wZXJ0eURlZmluaXRpb24uYW5ub3RhdGlvbnM/Lk1lYXN1cmVzPy5Vbml0O1xuXHRpZiAobWVhc3VyZSkge1xuXHRcdHJldHVybiBjb21waWxlQmluZGluZyhvcihpc1RydXRoeShhbm5vdGF0aW9uRXhwcmVzc2lvbihtZWFzdXJlKSBhcyBFeHByZXNzaW9uPHN0cmluZz4pLCBub3QoVUkuSXNUb3RhbCkpKTtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gY29tcGlsZUJpbmRpbmcoY29uc3RhbnQodHJ1ZSkpO1xuXHR9XG59O1xuXG5leHBvcnQgY29uc3QgaWZVbml0RWRpdGFibGUgPSBmdW5jdGlvbiAoXG5cdG9Qcm9wZXJ0eVBhdGg6IFByb3BlcnR5T3JQYXRoPFByb3BlcnR5Pixcblx0c0VkaXRhYmxlVmFsdWU6IEV4cHJlc3Npb25PclByaW1pdGl2ZTxzdHJpbmc+LFxuXHRzTm9uRWRpdGFibGVWYWx1ZTogRXhwcmVzc2lvbk9yUHJpbWl0aXZlPHN0cmluZz5cbik6IEJpbmRpbmdFeHByZXNzaW9uPHN0cmluZz4ge1xuXHRjb25zdCBvUHJvcGVydHkgPSAoaXNQYXRoRXhwcmVzc2lvbihvUHJvcGVydHlQYXRoKSAmJiBvUHJvcGVydHlQYXRoLiR0YXJnZXQpIHx8IChvUHJvcGVydHlQYXRoIGFzIFByb3BlcnR5KTtcblx0Y29uc3QgdW5pdFByb3BlcnR5ID0gZ2V0QXNzb2NpYXRlZEN1cnJlbmN5UHJvcGVydHkob1Byb3BlcnR5KSB8fCBnZXRBc3NvY2lhdGVkVW5pdFByb3BlcnR5KG9Qcm9wZXJ0eSk7XG5cdGlmICghdW5pdFByb3BlcnR5KSB7XG5cdFx0cmV0dXJuIGNvbXBpbGVCaW5kaW5nKHNOb25FZGl0YWJsZVZhbHVlKTtcblx0fVxuXHRjb25zdCBlZGl0YWJsZUV4cHJlc3Npb24gPSBhbmQobm90KGlzUmVhZE9ubHlFeHByZXNzaW9uKHVuaXRQcm9wZXJ0eSkpLCBub3QoaXNDb21wdXRlZCh1bml0UHJvcGVydHkpKSk7XG5cdHJldHVybiBjb21waWxlQmluZGluZyhpZkVsc2UoZWRpdGFibGVFeHByZXNzaW9uLCBzRWRpdGFibGVWYWx1ZSwgc05vbkVkaXRhYmxlVmFsdWUpKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRGaWVsZERpc3BsYXkgPSBmdW5jdGlvbiAoXG5cdG9Qcm9wZXJ0eVBhdGg6IFByb3BlcnR5T3JQYXRoPFByb3BlcnR5Pixcblx0c1RhcmdldERpc3BsYXlNb2RlOiBzdHJpbmcsXG5cdG9Db21wdXRlZEVkaXRNb2RlOiBFeHByZXNzaW9uT3JQcmltaXRpdmU8c3RyaW5nPlxuKTogQmluZGluZ0V4cHJlc3Npb248c3RyaW5nPiB7XG5cdGNvbnN0IG9Qcm9wZXJ0eSA9IChpc1BhdGhFeHByZXNzaW9uKG9Qcm9wZXJ0eVBhdGgpICYmIG9Qcm9wZXJ0eVBhdGguJHRhcmdldCkgfHwgKG9Qcm9wZXJ0eVBhdGggYXMgUHJvcGVydHkpO1xuXG5cdHJldHVybiBoYXNWYWx1ZUhlbHAob1Byb3BlcnR5KVxuXHRcdD8gY29tcGlsZUJpbmRpbmcoc1RhcmdldERpc3BsYXlNb2RlKVxuXHRcdDogY29tcGlsZUJpbmRpbmcoaWZFbHNlKGVxdWFsKG9Db21wdXRlZEVkaXRNb2RlLCBcIkVkaXRhYmxlXCIpLCBcIlZhbHVlXCIsIHNUYXJnZXREaXNwbGF5TW9kZSkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGZvcm1hdFdpdGhUeXBlSW5mb3JtYXRpb24gPSBmdW5jdGlvbiAoXG5cdG9Qcm9wZXJ0eTogUHJvcGVydHksXG5cdHByb3BlcnR5QmluZGluZ0V4cHJlc3Npb246IEV4cHJlc3Npb248c3RyaW5nPixcblx0aWdub3JlQ29uc3RyYWludHM/OiBib29sZWFuXG4pOiBFeHByZXNzaW9uPHN0cmluZz4ge1xuXHRjb25zdCBvdXRFeHByZXNzaW9uOiBCaW5kaW5nRXhwcmVzc2lvbkV4cHJlc3Npb248YW55PiA9IHByb3BlcnR5QmluZGluZ0V4cHJlc3Npb24gYXMgQmluZGluZ0V4cHJlc3Npb25FeHByZXNzaW9uPGFueT47XG5cdGlmIChvUHJvcGVydHkuX3R5cGUgPT09IFwiUHJvcGVydHlcIikge1xuXHRcdGNvbnN0IG9UYXJnZXRNYXBwaW5nID0gRURNX1RZUEVfTUFQUElOR1sob1Byb3BlcnR5IGFzIFByb3BlcnR5KS50eXBlXTtcblx0XHRpZiAob1RhcmdldE1hcHBpbmcpIHtcblx0XHRcdG91dEV4cHJlc3Npb24udHlwZSA9IG9UYXJnZXRNYXBwaW5nLnR5cGU7XG5cdFx0XHRpZiAob1RhcmdldE1hcHBpbmcuY29uc3RyYWludHMgJiYgIWlnbm9yZUNvbnN0cmFpbnRzKSB7XG5cdFx0XHRcdG91dEV4cHJlc3Npb24uY29uc3RyYWludHMgPSB7fTtcblx0XHRcdFx0aWYgKG9UYXJnZXRNYXBwaW5nLmNvbnN0cmFpbnRzLiRTY2FsZSAmJiBvUHJvcGVydHkuc2NhbGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdG91dEV4cHJlc3Npb24uY29uc3RyYWludHMuc2NhbGUgPSBvUHJvcGVydHkuc2NhbGU7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKG9UYXJnZXRNYXBwaW5nLmNvbnN0cmFpbnRzLiRQcmVjaXNpb24gJiYgb1Byb3BlcnR5LnByZWNpc2lvbiAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0b3V0RXhwcmVzc2lvbi5jb25zdHJhaW50cy5wcmVjaXNpb24gPSBvUHJvcGVydHkucHJlY2lzaW9uO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChvVGFyZ2V0TWFwcGluZy5jb25zdHJhaW50cy4kTWF4TGVuZ3RoICYmIG9Qcm9wZXJ0eS5tYXhMZW5ndGggIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdG91dEV4cHJlc3Npb24uY29uc3RyYWludHMubWF4TGVuZ3RoID0gb1Byb3BlcnR5Lm1heExlbmd0aDtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAob1Byb3BlcnR5Lm51bGxhYmxlID09PSBmYWxzZSkge1xuXHRcdFx0XHRcdG91dEV4cHJlc3Npb24uY29uc3RyYWludHMubnVsbGFibGUgPSBvUHJvcGVydHkubnVsbGFibGU7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdG9UYXJnZXRNYXBwaW5nLmNvbnN0cmFpbnRzW1wiQE9yZy5PRGF0YS5WYWxpZGF0aW9uLlYxLk1pbmltdW0vJERlY2ltYWxcIl0gJiZcblx0XHRcdFx0XHRvUHJvcGVydHkuYW5ub3RhdGlvbnM/LlZhbGlkYXRpb24/Lk1pbmltdW0gIT09IHVuZGVmaW5lZCAmJlxuXHRcdFx0XHRcdCFpc05hTihvUHJvcGVydHkuYW5ub3RhdGlvbnMuVmFsaWRhdGlvbi5NaW5pbXVtKVxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRvdXRFeHByZXNzaW9uLmNvbnN0cmFpbnRzLm1pbmltdW0gPSBgJHtvUHJvcGVydHkuYW5ub3RhdGlvbnMuVmFsaWRhdGlvbi5NaW5pbXVtfWA7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdG9UYXJnZXRNYXBwaW5nLmNvbnN0cmFpbnRzW1wiQE9yZy5PRGF0YS5WYWxpZGF0aW9uLlYxLk1heGltdW0vJERlY2ltYWxcIl0gJiZcblx0XHRcdFx0XHRvUHJvcGVydHkuYW5ub3RhdGlvbnM/LlZhbGlkYXRpb24/Lk1heGltdW0gIT09IHVuZGVmaW5lZCAmJlxuXHRcdFx0XHRcdCFpc05hTihvUHJvcGVydHkuYW5ub3RhdGlvbnMuVmFsaWRhdGlvbi5NYXhpbXVtKVxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRvdXRFeHByZXNzaW9uLmNvbnN0cmFpbnRzLm1heGltdW0gPSBgJHtvUHJvcGVydHkuYW5ub3RhdGlvbnMuVmFsaWRhdGlvbi5NYXhpbXVtfWA7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAob1Byb3BlcnR5Lm51bGxhYmxlID09PSBmYWxzZSkge1xuXHRcdFx0XHRvdXRFeHByZXNzaW9uLmNvbnN0cmFpbnRzID0ge307XG5cdFx0XHRcdG91dEV4cHJlc3Npb24uY29uc3RyYWludHMubnVsbGFibGUgPSBvUHJvcGVydHkubnVsbGFibGU7XG5cdFx0XHR9XG5cdFx0XHRpZiAob3V0RXhwcmVzc2lvbj8udHlwZT8uaW5kZXhPZihcInNhcC51aS5tb2RlbC5vZGF0YS50eXBlLkludFwiKSA9PT0gMCkge1xuXHRcdFx0XHRpZiAoIW91dEV4cHJlc3Npb24uZm9ybWF0T3B0aW9ucykge1xuXHRcdFx0XHRcdG91dEV4cHJlc3Npb24uZm9ybWF0T3B0aW9ucyA9IHt9O1xuXHRcdFx0XHR9XG5cdFx0XHRcdG91dEV4cHJlc3Npb24uZm9ybWF0T3B0aW9ucyA9IE9iamVjdC5hc3NpZ24ob3V0RXhwcmVzc2lvbi5mb3JtYXRPcHRpb25zLCB7XG5cdFx0XHRcdFx0cGFyc2VBc1N0cmluZzogZmFsc2UsXG5cdFx0XHRcdFx0ZW1wdHlTdHJpbmc6IFwiXCJcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0XHRpZiAob3V0RXhwcmVzc2lvbi50eXBlID09PSBcInNhcC51aS5tb2RlbC5vZGF0YS50eXBlLlN0cmluZ1wiKSB7XG5cdFx0XHRcdGlmICghb3V0RXhwcmVzc2lvbi5mb3JtYXRPcHRpb25zKSB7XG5cdFx0XHRcdFx0b3V0RXhwcmVzc2lvbi5mb3JtYXRPcHRpb25zID0ge307XG5cdFx0XHRcdH1cblx0XHRcdFx0b3V0RXhwcmVzc2lvbi5mb3JtYXRPcHRpb25zLnBhcnNlS2VlcHNFbXB0eVN0cmluZyA9IHRydWU7XG5cblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdG9UYXJnZXRNYXBwaW5nLmNvbnN0cmFpbnRzPy5bXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLklzRGlnaXRTZXF1ZW5jZVwiXSAmJlxuXHRcdFx0XHRcdG9Qcm9wZXJ0eS5hbm5vdGF0aW9ucz8uQ29tbW9uPy5Jc0RpZ2l0U2VxdWVuY2Vcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0b3V0RXhwcmVzc2lvbi5jb25zdHJhaW50cy5pc0RpZ2l0U2VxdWVuY2UgPSB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRpZiAob3V0RXhwcmVzc2lvbj8udHlwZT8uaW5kZXhPZihcInNhcC51aS5tb2RlbC5vZGF0YS50eXBlLkRvdWJsZVwiKSA9PT0gMCkge1xuXHRcdFx0XHRpZiAoIW91dEV4cHJlc3Npb24uZm9ybWF0T3B0aW9ucykge1xuXHRcdFx0XHRcdG91dEV4cHJlc3Npb24uZm9ybWF0T3B0aW9ucyA9IHt9O1xuXHRcdFx0XHR9XG5cdFx0XHRcdG91dEV4cHJlc3Npb24uZm9ybWF0T3B0aW9ucyA9IE9iamVjdC5hc3NpZ24ob3V0RXhwcmVzc2lvbi5mb3JtYXRPcHRpb25zLCB7XG5cdFx0XHRcdFx0cGFyc2VBc1N0cmluZzogZmFsc2UsXG5cdFx0XHRcdFx0ZW1wdHlTdHJpbmc6IFwiXCJcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0XHRpZiAob3V0RXhwcmVzc2lvbj8udHlwZT8uaW5kZXhPZihcInNhcC51aS5tb2RlbC5vZGF0YS50eXBlLkRhdGVUaW1lT2Zmc2V0XCIpID09PSAwKSB7XG5cdFx0XHRcdG91dEV4cHJlc3Npb24uY29uc3RyYWludHMuVjQgPSB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHRyZXR1cm4gb3V0RXhwcmVzc2lvbjtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRUeXBlQ29uZmlnID0gZnVuY3Rpb24gKG9Qcm9wZXJ0eTogUHJvcGVydHkgfCBEYXRhRmllbGRBYnN0cmFjdFR5cGVzLCBkYXRhVHlwZTogc3RyaW5nIHwgdW5kZWZpbmVkKTogYW55IHtcblx0Y29uc3Qgb1RhcmdldE1hcHBpbmcgPSBFRE1fVFlQRV9NQVBQSU5HWyhvUHJvcGVydHkgYXMgUHJvcGVydHkpPy50eXBlXSB8fCAoZGF0YVR5cGUgPyBFRE1fVFlQRV9NQVBQSU5HW2RhdGFUeXBlXSA6IHVuZGVmaW5lZCk7XG5cdGNvbnN0IHByb3BlcnR5VHlwZUNvbmZpZzogY29uZmlnVHlwZSA9IHtcblx0XHR0eXBlOiBvVGFyZ2V0TWFwcGluZy50eXBlLFxuXHRcdGNvbnN0cmFpbnRzOiB7fSxcblx0XHRmb3JtYXRPcHRpb25zOiB7fVxuXHR9O1xuXHRpZiAoaXNQcm9wZXJ0eShvUHJvcGVydHkpKSB7XG5cdFx0cHJvcGVydHlUeXBlQ29uZmlnLmNvbnN0cmFpbnRzID0ge1xuXHRcdFx0c2NhbGU6IG9UYXJnZXRNYXBwaW5nLmNvbnN0cmFpbnRzPy4kU2NhbGUgPyBvUHJvcGVydHkuc2NhbGUgOiB1bmRlZmluZWQsXG5cdFx0XHRwcmVjaXNpb246IG9UYXJnZXRNYXBwaW5nLmNvbnN0cmFpbnRzPy4kUHJlY2lzaW9uID8gb1Byb3BlcnR5LnByZWNpc2lvbiA6IHVuZGVmaW5lZCxcblx0XHRcdG1heExlbmd0aDogb1RhcmdldE1hcHBpbmcuY29uc3RyYWludHM/LiRNYXhMZW5ndGggPyBvUHJvcGVydHkubWF4TGVuZ3RoIDogdW5kZWZpbmVkLFxuXHRcdFx0bnVsbGFibGU6IG9UYXJnZXRNYXBwaW5nLmNvbnN0cmFpbnRzPy4kTnVsbGFibGUgPyBvUHJvcGVydHkubnVsbGFibGUgOiB1bmRlZmluZWQsXG5cdFx0XHRtaW5pbXVtOlxuXHRcdFx0XHRvVGFyZ2V0TWFwcGluZy5jb25zdHJhaW50cz8uW1wiQE9yZy5PRGF0YS5WYWxpZGF0aW9uLlYxLk1pbmltdW0vJERlY2ltYWxcIl0gJiZcblx0XHRcdFx0IWlzTmFOKG9Qcm9wZXJ0eS5hbm5vdGF0aW9ucz8uVmFsaWRhdGlvbj8uTWluaW11bSlcblx0XHRcdFx0XHQ/IGAke29Qcm9wZXJ0eS5hbm5vdGF0aW9ucz8uVmFsaWRhdGlvbj8uTWluaW11bX1gXG5cdFx0XHRcdFx0OiB1bmRlZmluZWQsXG5cdFx0XHRtYXhpbXVtOlxuXHRcdFx0XHRvVGFyZ2V0TWFwcGluZy5jb25zdHJhaW50cz8uW1wiQE9yZy5PRGF0YS5WYWxpZGF0aW9uLlYxLk1heGltdW0vJERlY2ltYWxcIl0gJiZcblx0XHRcdFx0IWlzTmFOKG9Qcm9wZXJ0eS5hbm5vdGF0aW9ucz8uVmFsaWRhdGlvbj8uTWF4aW11bSlcblx0XHRcdFx0XHQ/IGAke29Qcm9wZXJ0eS5hbm5vdGF0aW9ucz8uVmFsaWRhdGlvbj8uTWF4aW11bX1gXG5cdFx0XHRcdFx0OiB1bmRlZmluZWQsXG5cdFx0XHRpc0RpZ2l0U2VxdWVuY2U6XG5cdFx0XHRcdHByb3BlcnR5VHlwZUNvbmZpZy50eXBlID09PSBcInNhcC51aS5tb2RlbC5vZGF0YS50eXBlLlN0cmluZ1wiICYmXG5cdFx0XHRcdG9UYXJnZXRNYXBwaW5nLmNvbnN0cmFpbnRzPy5bXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLklzRGlnaXRTZXF1ZW5jZVwiXSAmJlxuXHRcdFx0XHQob1Byb3BlcnR5IGFzIFByb3BlcnR5KS5hbm5vdGF0aW9ucz8uQ29tbW9uPy5Jc0RpZ2l0U2VxdWVuY2Vcblx0XHRcdFx0XHQ/IHRydWVcblx0XHRcdFx0XHQ6IHVuZGVmaW5lZCxcblx0XHRcdFY0OiBvVGFyZ2V0TWFwcGluZy5jb25zdHJhaW50cz8uJFY0ID8gdHJ1ZSA6IHVuZGVmaW5lZFxuXHRcdH07XG5cdH1cblx0cHJvcGVydHlUeXBlQ29uZmlnLmZvcm1hdE9wdGlvbnMgPSB7XG5cdFx0cGFyc2VBc1N0cmluZzpcblx0XHRcdHByb3BlcnR5VHlwZUNvbmZpZz8udHlwZT8uaW5kZXhPZihcInNhcC51aS5tb2RlbC5vZGF0YS50eXBlLkludFwiKSA9PT0gMCB8fFxuXHRcdFx0cHJvcGVydHlUeXBlQ29uZmlnPy50eXBlPy5pbmRleE9mKFwic2FwLnVpLm1vZGVsLm9kYXRhLnR5cGUuRG91YmxlXCIpID09PSAwXG5cdFx0XHRcdD8gZmFsc2Vcblx0XHRcdFx0OiB1bmRlZmluZWQsXG5cdFx0ZW1wdHlTdHJpbmc6XG5cdFx0XHRwcm9wZXJ0eVR5cGVDb25maWc/LnR5cGU/LmluZGV4T2YoXCJzYXAudWkubW9kZWwub2RhdGEudHlwZS5JbnRcIikgPT09IDAgfHxcblx0XHRcdHByb3BlcnR5VHlwZUNvbmZpZz8udHlwZT8uaW5kZXhPZihcInNhcC51aS5tb2RlbC5vZGF0YS50eXBlLkRvdWJsZVwiKSA9PT0gMFxuXHRcdFx0XHQ/IFwiXCJcblx0XHRcdFx0OiB1bmRlZmluZWQsXG5cdFx0cGFyc2VLZWVwc0VtcHR5U3RyaW5nOiBwcm9wZXJ0eVR5cGVDb25maWcudHlwZSA9PT0gXCJzYXAudWkubW9kZWwub2RhdGEudHlwZS5TdHJpbmdcIiA/IHRydWUgOiB1bmRlZmluZWRcblx0fTtcblx0cmV0dXJuIHByb3BlcnR5VHlwZUNvbmZpZztcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRCaW5kaW5nV2l0aFVuaXRPckN1cnJlbmN5ID0gZnVuY3Rpb24gKFxuXHRvUHJvcGVydHlEYXRhTW9kZWxQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoLFxuXHRwcm9wZXJ0eUJpbmRpbmdFeHByZXNzaW9uOiBFeHByZXNzaW9uPHN0cmluZz4sXG5cdGlnbm9yZVVuaXRDb25zdHJhaW50PzogYm9vbGVhblxuKTogRXhwcmVzc2lvbjxzdHJpbmc+IHtcblx0Y29uc3Qgb1Byb3BlcnR5RGVmaW5pdGlvbiA9IG9Qcm9wZXJ0eURhdGFNb2RlbFBhdGgudGFyZ2V0T2JqZWN0IGFzIFByb3BlcnR5O1xuXHRsZXQgdW5pdCA9IG9Qcm9wZXJ0eURlZmluaXRpb24uYW5ub3RhdGlvbnM/Lk1lYXN1cmVzPy5Vbml0O1xuXHRjb25zdCByZWxhdGl2ZUxvY2F0aW9uID0gZ2V0UGF0aFJlbGF0aXZlTG9jYXRpb24oXG5cdFx0b1Byb3BlcnR5RGF0YU1vZGVsUGF0aC5jb250ZXh0TG9jYXRpb24sXG5cdFx0b1Byb3BlcnR5RGF0YU1vZGVsUGF0aC5uYXZpZ2F0aW9uUHJvcGVydGllc1xuXHQpLm1hcCgobnApID0+IG5wLm5hbWUpO1xuXHRwcm9wZXJ0eUJpbmRpbmdFeHByZXNzaW9uID0gZm9ybWF0V2l0aFR5cGVJbmZvcm1hdGlvbihvUHJvcGVydHlEZWZpbml0aW9uLCBwcm9wZXJ0eUJpbmRpbmdFeHByZXNzaW9uKTtcblx0aWYgKHVuaXQ/LnRvU3RyaW5nKCkgPT09IFwiJVwiKSB7XG5cdFx0cmV0dXJuIGZvcm1hdFJlc3VsdChbcHJvcGVydHlCaW5kaW5nRXhwcmVzc2lvbl0sIHZhbHVlRm9ybWF0dGVycy5mb3JtYXRXaXRoUGVyY2VudGFnZSk7XG5cdH1cblx0Y29uc3QgY29tcGxleFR5cGUgPSB1bml0ID8gXCJzYXAudWkubW9kZWwub2RhdGEudHlwZS5Vbml0XCIgOiBcInNhcC51aS5tb2RlbC5vZGF0YS50eXBlLkN1cnJlbmN5XCI7XG5cdHVuaXQgPSB1bml0ID8gdW5pdCA6IG9Qcm9wZXJ0eURlZmluaXRpb24uYW5ub3RhdGlvbnM/Lk1lYXN1cmVzPy5JU09DdXJyZW5jeTtcblx0Y29uc3QgdW5pdEJpbmRpbmdFeHByZXNzaW9uID0gKHVuaXQgYXMgYW55KS4kdGFyZ2V0XG5cdFx0PyBmb3JtYXRXaXRoVHlwZUluZm9ybWF0aW9uKFxuXHRcdFx0XHQodW5pdCBhcyBhbnkpLiR0YXJnZXQsXG5cdFx0XHRcdGFubm90YXRpb25FeHByZXNzaW9uKHVuaXQsIHJlbGF0aXZlTG9jYXRpb24pIGFzIEV4cHJlc3Npb248c3RyaW5nPixcblx0XHRcdFx0aWdub3JlVW5pdENvbnN0cmFpbnRcblx0XHQgIClcblx0XHQ6IChhbm5vdGF0aW9uRXhwcmVzc2lvbih1bml0LCByZWxhdGl2ZUxvY2F0aW9uKSBhcyBFeHByZXNzaW9uPHN0cmluZz4pO1xuXG5cdHJldHVybiBhZGRUeXBlSW5mb3JtYXRpb24oW3Byb3BlcnR5QmluZGluZ0V4cHJlc3Npb24sIHVuaXRCaW5kaW5nRXhwcmVzc2lvbl0sIGNvbXBsZXhUeXBlKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRCaW5kaW5nV2l0aFRpbWV6b25lID0gZnVuY3Rpb24gKFxuXHRvUHJvcGVydHlEYXRhTW9kZWxQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoLFxuXHRwcm9wZXJ0eUJpbmRpbmdFeHByZXNzaW9uOiBFeHByZXNzaW9uPHN0cmluZz4sXG5cdGlnbm9yZVVuaXRDb25zdHJhaW50PzogYm9vbGVhbixcblx0aGlkZVRpbWV6b25lRm9yRW1wdHlWYWx1ZXM/OiBib29sZWFuXG4pOiBFeHByZXNzaW9uPHN0cmluZz4ge1xuXHRjb25zdCBvUHJvcGVydHlEZWZpbml0aW9uID0gb1Byb3BlcnR5RGF0YU1vZGVsUGF0aC50YXJnZXRPYmplY3QgYXMgUHJvcGVydHk7XG5cdGNvbnN0IHRpbWV6b25lID0gb1Byb3BlcnR5RGVmaW5pdGlvbi5hbm5vdGF0aW9ucz8uQ29tbW9uPy5UaW1lem9uZTtcblx0Y29uc3QgcmVsYXRpdmVMb2NhdGlvbiA9IGdldFBhdGhSZWxhdGl2ZUxvY2F0aW9uKFxuXHRcdG9Qcm9wZXJ0eURhdGFNb2RlbFBhdGguY29udGV4dExvY2F0aW9uLFxuXHRcdG9Qcm9wZXJ0eURhdGFNb2RlbFBhdGgubmF2aWdhdGlvblByb3BlcnRpZXNcblx0KS5tYXAoKG5wKSA9PiBucC5uYW1lKTtcblx0cHJvcGVydHlCaW5kaW5nRXhwcmVzc2lvbiA9IGZvcm1hdFdpdGhUeXBlSW5mb3JtYXRpb24ob1Byb3BlcnR5RGVmaW5pdGlvbiwgcHJvcGVydHlCaW5kaW5nRXhwcmVzc2lvbik7XG5cblx0Y29uc3QgY29tcGxleFR5cGUgPSBcInNhcC5mZS5jb3JlLnR5cGUuRGF0ZVRpbWVXaXRoVGltZXpvbmVcIjtcblx0Y29uc3QgdW5pdEJpbmRpbmdFeHByZXNzaW9uID0gKHRpbWV6b25lIGFzIGFueSkuJHRhcmdldFxuXHRcdD8gZm9ybWF0V2l0aFR5cGVJbmZvcm1hdGlvbihcblx0XHRcdFx0KHRpbWV6b25lIGFzIGFueSkuJHRhcmdldCxcblx0XHRcdFx0YW5ub3RhdGlvbkV4cHJlc3Npb24odGltZXpvbmUsIHJlbGF0aXZlTG9jYXRpb24pIGFzIEV4cHJlc3Npb248c3RyaW5nPixcblx0XHRcdFx0aWdub3JlVW5pdENvbnN0cmFpbnRcblx0XHQgIClcblx0XHQ6IChhbm5vdGF0aW9uRXhwcmVzc2lvbih0aW1lem9uZSwgcmVsYXRpdmVMb2NhdGlvbikgYXMgRXhwcmVzc2lvbjxzdHJpbmc+KTtcblx0bGV0IGZvcm1hdE9wdGlvbnM7XG5cdGlmIChoaWRlVGltZXpvbmVGb3JFbXB0eVZhbHVlcykge1xuXHRcdGZvcm1hdE9wdGlvbnMgPSB7XG5cdFx0XHRzaG93VGltZXpvbmVGb3JFbXB0eVZhbHVlczogZmFsc2Vcblx0XHR9O1xuXHR9XG5cdHJldHVybiBhZGRUeXBlSW5mb3JtYXRpb24oW3Byb3BlcnR5QmluZGluZ0V4cHJlc3Npb24sIHVuaXRCaW5kaW5nRXhwcmVzc2lvbl0sIGNvbXBsZXhUeXBlLCB1bmRlZmluZWQsIGZvcm1hdE9wdGlvbnMpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEFsaWdubWVudEV4cHJlc3Npb24gPSBmdW5jdGlvbiAoXG5cdG9Db21wdXRlZEVkaXRNb2RlOiBFeHByZXNzaW9uPHN0cmluZz4sXG5cdHNBbGlnbkRpc3BsYXk6IHN0cmluZyA9IFwiQmVnaW5cIixcblx0c0FsaWduRWRpdDogc3RyaW5nID0gXCJCZWdpblwiXG4pOiBCaW5kaW5nRXhwcmVzc2lvbjxzdHJpbmc+IHwgRXhwcmVzc2lvbjxzdHJpbmc+IHtcblx0cmV0dXJuIGNvbXBpbGVCaW5kaW5nKGlmRWxzZShlcXVhbChvQ29tcHV0ZWRFZGl0TW9kZSwgXCJEaXNwbGF5XCIpLCBzQWxpZ25EaXNwbGF5LCBzQWxpZ25FZGl0KSk7XG59O1xuXG4vKipcbiAqIEZvcm1hdHRlciBoZWxwZXIgdG8gcmV0cmlldmUgdGhlIGNvbnZlcnRlckNvbnRleHQgZnJvbSB0aGUgbWV0YW1vZGVsIGNvbnRleHQuXG4gKlxuICogQHBhcmFtIHtDb250ZXh0fSBvQ29udGV4dCBUaGUgb3JpZ2luYWwgbWV0YW1vZGVsIGNvbnRleHRcbiAqIEBwYXJhbSB7Q29tcHV0ZWRBbm5vdGF0aW9uSW50ZXJmYWNlfSBvSW50ZXJmYWNlIFRoZSBjdXJyZW50IHRlbXBsYXRpbmcgY29udGV4dFxuICogQHJldHVybnMge29iamVjdH0gVGhlIENvbnZlcnRlckNvbnRleHQgcmVwcmVzZW50aW5nIHRoYXQgb2JqZWN0XG4gKi9cbmV4cG9ydCBjb25zdCBnZXRDb252ZXJ0ZXJDb250ZXh0ID0gZnVuY3Rpb24gKG9Db250ZXh0OiBNZXRhTW9kZWxDb250ZXh0LCBvSW50ZXJmYWNlOiBDb21wdXRlZEFubm90YXRpb25JbnRlcmZhY2UpOiBvYmplY3QgfCBudWxsIHtcblx0aWYgKG9JbnRlcmZhY2UgJiYgb0ludGVyZmFjZS5jb250ZXh0KSB7XG5cdFx0cmV0dXJuIGNvbnZlcnRNZXRhTW9kZWxDb250ZXh0KG9JbnRlcmZhY2UuY29udGV4dCk7XG5cdH1cblx0cmV0dXJuIG51bGw7XG59O1xuZ2V0Q29udmVydGVyQ29udGV4dC5yZXF1aXJlc0lDb250ZXh0ID0gdHJ1ZTtcblxuLyoqXG4gKiBGb3JtYXR0ZXIgaGVscGVyIHRvIHJldHJpZXZlIHRoZSBkYXRhIG1vZGVsIG9iamVjdHMgdGhhdCBhcmUgaW52b2x2ZWQgZnJvbSB0aGUgbWV0YW1vZGVsIGNvbnRleHQuXG4gKlxuICogQHBhcmFtIHtDb250ZXh0fSBvQ29udGV4dCBUaGUgb3JpZ2luYWwgT0RhdGFNZXRhTW9kZWwgY29udGV4dFxuICogQHBhcmFtIHtDb21wdXRlZEFubm90YXRpb25JbnRlcmZhY2V9IG9JbnRlcmZhY2UgVGhlIGN1cnJlbnQgdGVtcGxhdGluZyBjb250ZXh0XG4gKiBAcmV0dXJucyB7b2JqZWN0W119IEFuIGFycmF5IG9mIGVudGl0eXNldHMgYW5kIG5hdnByb3BlcnRpZXMgdGhhdCBhcmUgaW52b2x2ZWQgdG8gZ2V0IHRvIGEgc3BlY2lmaWMgb2JqZWN0IGluIHRoZSBtZXRhbW9kZWxcbiAqL1xuZXhwb3J0IGNvbnN0IGdldERhdGFNb2RlbE9iamVjdFBhdGggPSBmdW5jdGlvbiAoXG5cdG9Db250ZXh0OiBNZXRhTW9kZWxDb250ZXh0LFxuXHRvSW50ZXJmYWNlOiBDb21wdXRlZEFubm90YXRpb25JbnRlcmZhY2Vcbik6IERhdGFNb2RlbE9iamVjdFBhdGggfCBudWxsIHtcblx0aWYgKG9JbnRlcmZhY2UgJiYgb0ludGVyZmFjZS5jb250ZXh0KSB7XG5cdFx0cmV0dXJuIGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyhvSW50ZXJmYWNlLmNvbnRleHQpO1xuXHR9XG5cdHJldHVybiBudWxsO1xufTtcbmdldERhdGFNb2RlbE9iamVjdFBhdGgucmVxdWlyZXNJQ29udGV4dCA9IHRydWU7XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSBleHByZXNzaW9uQmluZGluZyBjcmVhdGVkIG91dCBvZiBhIGJpbmRpbmcgZXhwcmVzc2lvbi5cbiAqXG4gKiBAcGFyYW0ge0V4cHJlc3Npb248YW55Pn0gZXhwcmVzc2lvbiBUaGUgZXhwcmVzc2lvbiB3aGljaCBuZWVkcyB0byBiZSBjb21waWxlZFxuICogQHJldHVybnMge0JpbmRpbmdFeHByZXNzaW9uPHN0cmluZz59IFRoZSBleHByZXNzaW9uLWJpbmRpbmcgc3RyaW5nXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRFeHByZXNzaW9uQmluZGluZyA9IGZ1bmN0aW9uIChleHByZXNzaW9uOiBFeHByZXNzaW9uPGFueT4pOiBCaW5kaW5nRXhwcmVzc2lvbjxzdHJpbmc+IHtcblx0cmV0dXJuIGNvbXBpbGVCaW5kaW5nKGV4cHJlc3Npb24pO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzQ29sbGVjdGlvbkZpZWxkID0gZnVuY3Rpb24gKG9EYXRhTW9kZWxQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoKTogYm9vbGVhbiB7XG5cdGlmIChvRGF0YU1vZGVsUGF0aC5uYXZpZ2F0aW9uUHJvcGVydGllcz8ubGVuZ3RoKSB7XG5cdFx0Y29uc3QgaGFzT25lVG9NYW55TmF2aWdhdGlvbiA9XG5cdFx0XHRvRGF0YU1vZGVsUGF0aD8ubmF2aWdhdGlvblByb3BlcnRpZXMuZmluZEluZGV4KChvTmF2OiBOYXZpZ2F0aW9uUHJvcGVydHkpID0+IHtcblx0XHRcdFx0aWYgKG9OYXYuaXNDb2xsZWN0aW9uKSB7XG5cdFx0XHRcdFx0aWYgKG9EYXRhTW9kZWxQYXRoLmNvbnRleHRMb2NhdGlvbj8ubmF2aWdhdGlvblByb3BlcnRpZXM/Lmxlbmd0aCkge1xuXHRcdFx0XHRcdFx0Ly93ZSBjaGVjayB0aGUgb25lIHRvIG1hbnkgbmF2IGlzIG5vdCBhbHJlYWR5IHBhcnQgb2YgdGhlIGNvbnRleHRcblx0XHRcdFx0XHRcdHJldHVybiAoXG5cdFx0XHRcdFx0XHRcdG9EYXRhTW9kZWxQYXRoLmNvbnRleHRMb2NhdGlvbj8ubmF2aWdhdGlvblByb3BlcnRpZXMuZmluZEluZGV4KFxuXHRcdFx0XHRcdFx0XHRcdChvQ29udGV4dE5hdjogTmF2aWdhdGlvblByb3BlcnR5KSA9PiBvQ29udGV4dE5hdi5uYW1lID09PSBvTmF2Lm5hbWVcblx0XHRcdFx0XHRcdFx0KSA9PT0gLTFcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH0pID4gLTE7XG5cdFx0aWYgKGhhc09uZVRvTWFueU5hdmlnYXRpb24pIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gZmFsc2U7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0UmVxdWlyZWRFeHByZXNzaW9uID0gZnVuY3Rpb24gKFxuXHRvUHJvcGVydHlQYXRoOiBQcm9wZXJ0eU9yUGF0aDxQcm9wZXJ0eT4sXG5cdG9EYXRhRmllbGRDb252ZXJ0ZWQ/OiBhbnksXG5cdGZvcmNlRWRpdE1vZGU6IGJvb2xlYW4gPSBmYWxzZSxcblx0YkFzT2JqZWN0OiBib29sZWFuID0gZmFsc2Vcbik6IEJpbmRpbmdFeHByZXNzaW9uPGJvb2xlYW4+IHwgRXhwcmVzc2lvbk9yUHJpbWl0aXZlPGJvb2xlYW4+IHtcblx0aWYgKCFvUHJvcGVydHlQYXRoIHx8IHR5cGVvZiBvUHJvcGVydHlQYXRoID09PSBcInN0cmluZ1wiKSB7XG5cdFx0cmV0dXJuIGNvbXBpbGVCaW5kaW5nKGZhbHNlKTtcblx0fVxuXG5cdGxldCBkYXRhRmllbGRSZXF1aXJlZEV4cHJlc3Npb246IEJpbmRpbmdFeHByZXNzaW9uPGJvb2xlYW4+IHwgRXhwcmVzc2lvbk9yUHJpbWl0aXZlPGJvb2xlYW4+ID0gdHJ1ZTtcblx0aWYgKG9EYXRhRmllbGRDb252ZXJ0ZWQgIT09IG51bGwpIHtcblx0XHRkYXRhRmllbGRSZXF1aXJlZEV4cHJlc3Npb24gPSBpc1JlcXVpcmVkRXhwcmVzc2lvbihvRGF0YUZpZWxkQ29udmVydGVkKTtcblx0fVxuXG5cdGNvbnN0IG9Qcm9wZXJ0eTogUHJvcGVydHkgPSAoaXNQYXRoRXhwcmVzc2lvbihvUHJvcGVydHlQYXRoKSAmJiBvUHJvcGVydHlQYXRoLiR0YXJnZXQpIHx8IChvUHJvcGVydHlQYXRoIGFzIFByb3BlcnR5KTtcblx0Ly8gRW5hYmxlbWVudCBkZXBlbmRzIG9uIHRoZSBmaWVsZCBjb250cm9sIGV4cHJlc3Npb25cblx0Ly8gSWYgdGhlIEZpZWxkIGNvbnRyb2wgaXMgc3RhdGljYWxseSBpbiBJbmFwcGxpY2FibGUgKGRpc2FibGVkKSAtPiBub3QgZW5hYmxlZFxuXHRjb25zdCByZXF1aXJlZEV4cHJlc3Npb24gPSBpc1JlcXVpcmVkRXhwcmVzc2lvbihvUHJvcGVydHkpO1xuXHRjb25zdCBlZGl0TW9kZSA9IGZvcmNlRWRpdE1vZGUgfHwgVUkuSXNFZGl0YWJsZTtcblx0aWYgKGJBc09iamVjdCkge1xuXHRcdHJldHVybiBhbmQob3IocmVxdWlyZWRFeHByZXNzaW9uLCBkYXRhRmllbGRSZXF1aXJlZEV4cHJlc3Npb24pLCBlZGl0TW9kZSk7XG5cdH1cblx0cmV0dXJuIGNvbXBpbGVCaW5kaW5nKGFuZChvcihyZXF1aXJlZEV4cHJlc3Npb24sIGRhdGFGaWVsZFJlcXVpcmVkRXhwcmVzc2lvbiksIGVkaXRNb2RlKSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0UmVxdWlyZWRFeHByZXNzaW9uRm9yQ29ubmVjdGVkRGF0YUZpZWxkID0gZnVuY3Rpb24gKGRhdGFGaWVsZE9iamVjdFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGgpOiBCaW5kaW5nRXhwcmVzc2lvbjxzdHJpbmc+IHtcblx0Y29uc3QgZGF0YSA9IGRhdGFGaWVsZE9iamVjdFBhdGg/LnRhcmdldE9iamVjdD8uJHRhcmdldD8uRGF0YTtcblx0Y29uc3Qga2V5czogQXJyYXk8c3RyaW5nPiA9IE9iamVjdC5rZXlzKGRhdGEpO1xuXHRjb25zdCBkYXRhRmllbGRzID0gW107XG5cdGxldCBwcm9wZXJ0eVBhdGg7XG5cdGNvbnN0IGlzUmVxdWlyZWRFeHByZXNzaW9uczogKEJpbmRpbmdFeHByZXNzaW9uPGJvb2xlYW4+IHwgRXhwcmVzc2lvbk9yUHJpbWl0aXZlPGJvb2xlYW4+KVtdIHwgdW5kZWZpbmVkID0gW107XG5cdGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcblx0XHRpZiAoZGF0YVtrZXldW1wiJFR5cGVcIl0gJiYgZGF0YVtrZXldW1wiJFR5cGVcIl0uaW5kZXhPZihcIkRhdGFGaWVsZFwiKSA+IC0xKSB7XG5cdFx0XHRkYXRhRmllbGRzLnB1c2goZGF0YVtrZXldKTtcblx0XHR9XG5cdH1cblx0Zm9yIChjb25zdCBkYXRhRmllbGQgb2YgZGF0YUZpZWxkcykge1xuXHRcdHN3aXRjaCAoZGF0YUZpZWxkLiRUeXBlKSB7XG5cdFx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZDpcblx0XHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aE5hdmlnYXRpb25QYXRoOlxuXHRcdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoVXJsOlxuXHRcdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoSW50ZW50QmFzZWROYXZpZ2F0aW9uOlxuXHRcdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoQWN0aW9uOlxuXHRcdFx0XHRpZiAodHlwZW9mIGRhdGFGaWVsZC5WYWx1ZSA9PT0gXCJvYmplY3RcIikge1xuXHRcdFx0XHRcdHByb3BlcnR5UGF0aCA9IGRhdGFGaWVsZC5WYWx1ZS4kdGFyZ2V0O1xuXHRcdFx0XHR9XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBbm5vdGF0aW9uOlxuXHRcdFx0XHRpZiAoZGF0YUZpZWxkLlRhcmdldC4kdGFyZ2V0KSB7XG5cdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0ZGF0YUZpZWxkLlRhcmdldC4kdGFyZ2V0LiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGQgfHxcblx0XHRcdFx0XHRcdGRhdGFGaWVsZC5UYXJnZXQuJHRhcmdldC4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YVBvaW50VHlwZVxuXHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0aWYgKHR5cGVvZiBkYXRhRmllbGQuVGFyZ2V0LiR0YXJnZXQuVmFsdWUgPT09IFwib2JqZWN0XCIpIHtcblx0XHRcdFx0XHRcdFx0cHJvcGVydHlQYXRoID0gZGF0YUZpZWxkLlRhcmdldC4kdGFyZ2V0LlZhbHVlLiR0YXJnZXQ7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGlmICh0eXBlb2YgZGF0YUZpZWxkLlRhcmdldCA9PT0gXCJvYmplY3RcIikge1xuXHRcdFx0XHRcdFx0XHRwcm9wZXJ0eVBhdGggPSBkYXRhRmllbGQuVGFyZ2V0LiR0YXJnZXQ7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0YnJlYWs7XG5cdFx0fVxuXHRcdGlzUmVxdWlyZWRFeHByZXNzaW9ucy5wdXNoKGdldFJlcXVpcmVkRXhwcmVzc2lvbihwcm9wZXJ0eVBhdGgsIGRhdGFGaWVsZCwgZmFsc2UsIHRydWUpKTtcblx0fVxuXHRyZXR1cm4gY29tcGlsZUJpbmRpbmcob3IoLi4uKGlzUmVxdWlyZWRFeHByZXNzaW9ucyBhcyBFeHByZXNzaW9uT3JQcmltaXRpdmU8Ym9vbGVhbj5bXSkpKTtcbn07XG4iXX0=
669
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlVJRm9ybWF0dGVycy50cyJdLCJuYW1lcyI6WyJFRE1fVFlQRV9NQVBQSU5HIiwiRGlzcGxheU1vZGVGb3JtYXR0ZXIiLCJnZXREaXNwbGF5TW9kZSIsIm9EYXRhTW9kZWxPYmplY3RQYXRoIiwidGFyZ2V0T2JqZWN0IiwiZ2V0RWRpdGFibGVFeHByZXNzaW9uQXNPYmplY3QiLCJvUHJvcGVydHlQYXRoIiwib0RhdGFGaWVsZENvbnZlcnRlZCIsImlzRWRpdGFibGUiLCJVSSIsIklzRWRpdGFibGUiLCJnZXRFZGl0YWJsZUV4cHJlc3Npb24iLCJiQXNPYmplY3QiLCJjb21waWxlRXhwcmVzc2lvbiIsImRhdGFGaWVsZEVkaXRhYmxlRXhwcmVzc2lvbiIsImNvbnN0YW50IiwiaWZFbHNlIiwiaXNOb25FZGl0YWJsZUV4cHJlc3Npb24iLCJvUHJvcGVydHkiLCJpc1BhdGhFeHByZXNzaW9uIiwiJHRhcmdldCIsImlzUGF0aFVwZGF0YWJsZUV4cHJlc3Npb24iLCJpc1BhdGhVcGRhdGFibGUiLCJwcm9wZXJ0eVBhdGgiLCJwYXRoVmlzaXRvciIsInBhdGgiLCJuYXZpZ2F0aW9uUGF0aHMiLCJzaW5nbGV0b25QYXRoVmlzaXRvciIsImNvbnZlcnRlZFR5cGVzIiwiZWRpdGFibGVFeHByZXNzaW9uIiwib3IiLCJub3QiLCJpc0NvbXB1dGVkIiwiaXNLZXkiLCJpc0ltbXV0YWJsZSIsIklzVHJhbnNpZW50QmluZGluZyIsImFuZCIsImdldENvbGxhYm9yYXRpb25FeHByZXNzaW9uIiwiZGF0YU1vZGVsT2JqZWN0UGF0aCIsImZvcm1hdHRlciIsIm9iamVjdFBhdGgiLCJnZXRUYXJnZXRPYmplY3RQYXRoIiwiYWN0aXZpdHlFeHByZXNzaW9uIiwicGF0aEluTW9kZWwiLCJrZXlzIiwidGFyZ2V0RW50aXR5VHlwZSIsImtleXNFeHByZXNzaW9ucyIsImZvckVhY2giLCJrZXkiLCJrZXlFeHByZXNzaW9uIiwibmFtZSIsInB1c2giLCJmb3JtYXRSZXN1bHQiLCJnZXRFbmFibGVkRXhwcmVzc2lvbkFzT2JqZWN0IiwiZ2V0RW5hYmxlZEV4cHJlc3Npb24iLCJkYXRhRmllbGRFbmFibGVkRXhwcmVzc2lvbiIsImlzRGlzYWJsZWRFeHByZXNzaW9uIiwiZW5hYmxlZEV4cHJlc3Npb24iLCJnZXRFZGl0TW9kZSIsImJNZWFzdXJlUmVhZE9ubHkiLCJhc3NvY2lhdGVkQ3VycmVuY3lQcm9wZXJ0eSIsImdldEFzc29jaWF0ZWRDdXJyZW5jeVByb3BlcnR5IiwidW5pdFByb3BlcnR5IiwiZ2V0QXNzb2NpYXRlZFVuaXRQcm9wZXJ0eSIsInJlc3VsdEV4cHJlc3Npb24iLCJpc1VuaXRSZWFkT25seSIsImlzUmVhZE9ubHlFeHByZXNzaW9uIiwiaXNDb25zdGFudCIsInJlYWRPbmx5RXhwcmVzc2lvbiIsImVkaXRNb2RlRXhwcmVzc2lvbiIsImhhc1ZhbGlkQW5hbHl0aWNhbEN1cnJlbmN5T3JVbml0Iiwib1Byb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aCIsIm9Qcm9wZXJ0eURlZmluaXRpb24iLCJjdXJyZW5jeSIsImFubm90YXRpb25zIiwiTWVhc3VyZXMiLCJJU09DdXJyZW5jeSIsIm1lYXN1cmUiLCJVbml0IiwiaXNUcnV0aHkiLCJnZXRFeHByZXNzaW9uRnJvbUFubm90YXRpb24iLCJJc1RvdGFsIiwiaWZVbml0RWRpdGFibGUiLCJzRWRpdGFibGVWYWx1ZSIsInNOb25FZGl0YWJsZVZhbHVlIiwiZ2V0RmllbGREaXNwbGF5Iiwic1RhcmdldERpc3BsYXlNb2RlIiwib0NvbXB1dGVkRWRpdE1vZGUiLCJoYXNWYWx1ZUhlbHAiLCJlcXVhbCIsImZvcm1hdFdpdGhUeXBlSW5mb3JtYXRpb24iLCJwcm9wZXJ0eUJpbmRpbmdFeHByZXNzaW9uIiwiaWdub3JlQ29uc3RyYWludHMiLCJvdXRFeHByZXNzaW9uIiwiX3R5cGUiLCJvVGFyZ2V0TWFwcGluZyIsInR5cGUiLCJjb25zdHJhaW50cyIsIiRTY2FsZSIsInNjYWxlIiwidW5kZWZpbmVkIiwiJFByZWNpc2lvbiIsInByZWNpc2lvbiIsIiRNYXhMZW5ndGgiLCJtYXhMZW5ndGgiLCJudWxsYWJsZSIsIlZhbGlkYXRpb24iLCJNaW5pbXVtIiwiaXNOYU4iLCJtaW5pbXVtIiwiTWF4aW11bSIsIm1heGltdW0iLCJpbmRleE9mIiwiZm9ybWF0T3B0aW9ucyIsIk9iamVjdCIsImFzc2lnbiIsInBhcnNlQXNTdHJpbmciLCJlbXB0eVN0cmluZyIsInBhcnNlS2VlcHNFbXB0eVN0cmluZyIsIkNvbW1vbiIsIklzRGlnaXRTZXF1ZW5jZSIsImlzRGlnaXRTZXF1ZW5jZSIsIlY0IiwiZ2V0VHlwZUNvbmZpZyIsImRhdGFUeXBlIiwicHJvcGVydHlUeXBlQ29uZmlnIiwiaXNQcm9wZXJ0eSIsIiROdWxsYWJsZSIsIiRWNCIsImdldEJpbmRpbmdXaXRoVW5pdE9yQ3VycmVuY3kiLCJvUHJvcGVydHlEYXRhTW9kZWxQYXRoIiwiaWdub3JlVW5pdENvbnN0cmFpbnQiLCJ1bml0IiwicmVsYXRpdmVMb2NhdGlvbiIsImdldFBhdGhSZWxhdGl2ZUxvY2F0aW9uIiwiY29udGV4dExvY2F0aW9uIiwibmF2aWdhdGlvblByb3BlcnRpZXMiLCJtYXAiLCJucCIsInRvU3RyaW5nIiwidmFsdWVGb3JtYXR0ZXJzIiwiZm9ybWF0V2l0aFBlcmNlbnRhZ2UiLCJjb21wbGV4VHlwZSIsInVuaXRCaW5kaW5nRXhwcmVzc2lvbiIsImFkZFR5cGVJbmZvcm1hdGlvbiIsImdldEJpbmRpbmdGb3JVbml0T3JDdXJyZW5jeSIsImdldENvbnRleHRSZWxhdGl2ZVRhcmdldE9iamVjdFBhdGgiLCJzaG93TnVtYmVyIiwiZ2V0QmluZGluZ1dpdGhUaW1lem9uZSIsImhpZGVUaW1lem9uZUZvckVtcHR5VmFsdWVzIiwidGltZXpvbmUiLCJUaW1lem9uZSIsInNob3dUaW1lem9uZUZvckVtcHR5VmFsdWVzIiwiZ2V0QWxpZ25tZW50RXhwcmVzc2lvbiIsInNBbGlnbkRpc3BsYXkiLCJzQWxpZ25FZGl0IiwiZ2V0Q29udmVydGVyQ29udGV4dCIsIm9Db250ZXh0Iiwib0ludGVyZmFjZSIsImNvbnRleHQiLCJjb252ZXJ0TWV0YU1vZGVsQ29udGV4dCIsInJlcXVpcmVzSUNvbnRleHQiLCJnZXREYXRhTW9kZWxPYmplY3RQYXRoIiwiZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzIiwiaXNDb2xsZWN0aW9uRmllbGQiLCJvRGF0YU1vZGVsUGF0aCIsImxlbmd0aCIsImhhc09uZVRvTWFueU5hdmlnYXRpb24iLCJmaW5kSW5kZXgiLCJvTmF2IiwiaXNDb2xsZWN0aW9uIiwib0NvbnRleHROYXYiLCJnZXRSZXF1aXJlZEV4cHJlc3Npb25Bc09iamVjdCIsImZvcmNlRWRpdE1vZGUiLCJnZXRSZXF1aXJlZEV4cHJlc3Npb24iLCJvUmVxdWlyZWRQcm9wZXJ0aWVzIiwicmV0dXJuRXhwcmVzc2lvbiIsImFSZXF1aXJlZFByb3BlcnRpZXNGcm9tSW5zZXJ0UmVzdHJpY3Rpb25zIiwicmVxdWlyZWRQcm9wZXJ0aWVzRnJvbUluc2VydFJlc3RyaWN0aW9ucyIsImFSZXF1aXJlZFByb3BlcnRpZXNGcm9tVXBkYXRlUmVzdHJpY3Rpb25zIiwicmVxdWlyZWRQcm9wZXJ0aWVzRnJvbVVwZGF0ZVJlc3RyaWN0aW9ucyIsImRhdGFGaWVsZFJlcXVpcmVkRXhwcmVzc2lvbiIsImlzUmVxdWlyZWRFeHByZXNzaW9uIiwicmVxdWlyZWRQcm9wZXJ0eUZyb21JbnNlcnRSZXN0cmljdGlvbnNFeHByZXNzaW9uIiwicmVxdWlyZWRQcm9wZXJ0eUZyb21VcGRhdGVSZXN0cmljdGlvbnNFeHByZXNzaW9uIiwicmVxdWlyZWRFeHByZXNzaW9uIiwiZWRpdE1vZGUiLCJpbmNsdWRlcyIsIklzQ3JlYXRlTW9kZSIsIm5vdEVxdWFsIiwiZ2V0UmVxdWlyZWRFeHByZXNzaW9uRm9yQ29ubmVjdGVkRGF0YUZpZWxkIiwiZGF0YUZpZWxkT2JqZWN0UGF0aCIsImRhdGEiLCJEYXRhIiwiZGF0YUZpZWxkcyIsImlzUmVxdWlyZWRFeHByZXNzaW9ucyIsImRhdGFGaWVsZCIsIiRUeXBlIiwiVmFsdWUiLCJUYXJn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QWlCbkwsT0FBakIsQ0FBeUJrTCxLQUF6QixDQUErQmxMLE9BQTlDO0FBQ0E7QUFDRCxhQVBELE1BT087QUFDTixrQkFBSSxPQUFPZ0wsU0FBUyxDQUFDRyxNQUFqQixLQUE0QixRQUFoQyxFQUEwQztBQUN6Q2hMLGdCQUFBQSxZQUFZLEdBQUc2SyxTQUFTLENBQUNHLE1BQVYsQ0FBaUJuTCxPQUFoQztBQUNBOztBQUNEO0FBQ0E7QUFDRDs7QUFDRDtBQUNEO0FBM0JEOztBQTZCQStLLE1BQUFBLHFCQUFxQixDQUFDaEosSUFBdEIsQ0FBMkJ5SCw2QkFBNkIsQ0FBQ3JKLFlBQUQsRUFBZTZLLFNBQWYsRUFBMEIsS0FBMUIsQ0FBeEQ7QUFDQTs7QUFDRCxXQUFPdkwsaUJBQWlCLENBQUNpQixFQUFFLE1BQUYsNEJBQU9xSyxxQkFBUCxFQUFELENBQXhCO0FBQ0EsR0E5Q00iLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgTmF2aWdhdGlvblByb3BlcnR5LCBQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb24sIFByb3BlcnR5IH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IERhdGFGaWVsZEFic3RyYWN0VHlwZXMgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL1VJXCI7XG5pbXBvcnQgeyBVSUFubm90YXRpb25UeXBlcyB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvVUlcIjtcbmltcG9ydCB7IHNpbmdsZXRvblBhdGhWaXNpdG9yLCBVSSB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2hlbHBlcnMvQmluZGluZ0hlbHBlclwiO1xuaW1wb3J0IHsgY29udmVydE1ldGFNb2RlbENvbnRleHQsIGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01ldGFNb2RlbENvbnZlcnRlclwiO1xuaW1wb3J0IHZhbHVlRm9ybWF0dGVycyBmcm9tIFwic2FwL2ZlL2NvcmUvZm9ybWF0dGVycy9WYWx1ZUZvcm1hdHRlclwiO1xuaW1wb3J0IHR5cGUgeyBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24sIENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uLCBQYXRoSW5Nb2RlbEV4cHJlc3Npb24gfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9CaW5kaW5nVG9vbGtpdFwiO1xuaW1wb3J0IHtcblx0YWRkVHlwZUluZm9ybWF0aW9uLFxuXHRhbmQsXG5cdGNvbXBpbGVFeHByZXNzaW9uLFxuXHRjb25zdGFudCxcblx0ZXF1YWwsXG5cdGZvcm1hdFJlc3VsdCxcblx0Z2V0RXhwcmVzc2lvbkZyb21Bbm5vdGF0aW9uLFxuXHRpZkVsc2UsXG5cdGlzQ29uc3RhbnQsXG5cdGlzVHJ1dGh5LFxuXHRub3QsXG5cdG5vdEVxdWFsLFxuXHRvcixcblx0cGF0aEluTW9kZWxcbn0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvQmluZGluZ1Rvb2xraXRcIjtcbmltcG9ydCB7XG5cdERhdGFNb2RlbE9iamVjdFBhdGgsXG5cdGdldENvbnRleHRSZWxhdGl2ZVRhcmdldE9iamVjdFBhdGgsXG5cdGdldFBhdGhSZWxhdGl2ZUxvY2F0aW9uLFxuXHRnZXRUYXJnZXRPYmplY3RQYXRoLFxuXHRpc1BhdGhVcGRhdGFibGVcbn0gZnJvbSBcInNhcC9mZS9jb3JlL3RlbXBsYXRpbmcvRGF0YU1vZGVsUGF0aEhlbHBlclwiO1xuaW1wb3J0ICogYXMgRGlzcGxheU1vZGVGb3JtYXR0ZXIgZnJvbSBcInNhcC9mZS9jb3JlL3RlbXBsYXRpbmcvRGlzcGxheU1vZGVGb3JtYXR0ZXJcIjtcbmltcG9ydCB7XG5cdGlzRGlzYWJsZWRFeHByZXNzaW9uLFxuXHRpc05vbkVkaXRhYmxlRXhwcmVzc2lvbixcblx0aXNSZWFkT25seUV4cHJlc3Npb24sXG5cdGlzUmVxdWlyZWRFeHByZXNzaW9uXG59IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL0ZpZWxkQ29udHJvbEhlbHBlclwiO1xuaW1wb3J0IHtcblx0Z2V0QXNzb2NpYXRlZEN1cnJlbmN5UHJvcGVydHksXG5cdGdldEFzc29jaWF0ZWRVbml0UHJvcGVydHksXG5cdGhhc1ZhbHVlSGVscCxcblx0aXNDb21wdXRlZCxcblx0aXNJbW11dGFibGUsXG5cdGlzS2V5LFxuXHRpc1BhdGhFeHByZXNzaW9uLFxuXHRpc1Byb3BlcnR5XG59IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL1Byb3BlcnR5SGVscGVyXCI7XG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQ29udGV4dFwiO1xuXG4vLyBJbXBvcnQtZXhwb3J0IG1ldGhvZCB1c2VkIGJ5IHRoZSBjb252ZXJ0ZXIgdG8gdXNlIHRoZW0gaW4gdGhlIHRlbXBsYXRpbmcgdGhyb3VnaCB0aGUgVUlGb3JtYXR0ZXJzLlxuZXhwb3J0IHR5cGUgRGlzcGxheU1vZGUgPSBEaXNwbGF5TW9kZUZvcm1hdHRlci5EaXNwbGF5TW9kZTtcblxuZXhwb3J0IGNvbnN0IEVETV9UWVBFX01BUFBJTkcgPSBEaXNwbGF5TW9kZUZvcm1hdHRlci5FRE1fVFlQRV9NQVBQSU5HO1xuXG5leHBvcnQgdHlwZSBQcm9wZXJ0eU9yUGF0aDxQPiA9IHN0cmluZyB8IFAgfCBQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb248UD47XG5leHBvcnQgdHlwZSBNZXRhTW9kZWxDb250ZXh0ID0ge1xuXHQka2luZDogc3RyaW5nO1xufTtcbmV4cG9ydCB0eXBlIENvbXB1dGVkQW5ub3RhdGlvbkludGVyZmFjZSA9IHtcblx0Y29udGV4dDogQ29udGV4dDtcblx0YXJndW1lbnRzPzogYW55W107XG5cdCQkdmFsdWVBc1Byb21pc2U/OiBib29sZWFuO1xufTtcblxuZXhwb3J0IHR5cGUgY29uZmlnVHlwZUNvbnN0cmFpbnRzID0ge1xuXHRzY2FsZT86IG51bWJlcjtcblx0cHJlY2lzaW9uPzogbnVtYmVyO1xuXHRtYXhMZW5ndGg/OiBudW1iZXI7XG5cdG51bGxhYmxlPzogYm9vbGVhbjtcblx0bWluaW11bT86IHN0cmluZztcblx0bWF4aW11bT86IHN0cmluZztcblx0aXNEaWdpdFNlcXVlbmNlPzogYm9vbGVhbjtcblx0VjQ/OiBib29sZWFuO1xufTtcblxuZXhwb3J0IHR5cGUgY29uZmlnVHlwZWZvcm1hdE9wdGlvbnMgPSB7XG5cdHBhcnNlQXNTdHJpbmc/OiBib29sZWFuO1xuXHRlbXB0eVN0cmluZz86IHN0cmluZztcblx0cGFyc2VLZWVwc0VtcHR5U3RyaW5nPzogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCB0eXBlIGNvbmZpZ1R5cGUgPSB7XG5cdHR5cGU6IHN0cmluZztcblx0Y29uc3RyYWludHM6IGNvbmZpZ1R5cGVDb25zdHJhaW50cztcblx0Zm9ybWF0T3B0aW9uczogY29uZmlnVHlwZWZvcm1hdE9wdGlvbnM7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0RGlzcGxheU1vZGUgPSBmdW5jdGlvbiAob0RhdGFNb2RlbE9iamVjdFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGgpOiBEaXNwbGF5TW9kZSB7XG5cdHJldHVybiBEaXNwbGF5TW9kZUZvcm1hdHRlci5nZXREaXNwbGF5TW9kZShvRGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRPYmplY3QsIG9EYXRhTW9kZWxPYmplY3RQYXRoKTtcbn07XG5leHBvcnQgY29uc3QgZ2V0RWRpdGFibGVFeHByZXNzaW9uQXNPYmplY3QgPSBmdW5jdGlvbiAoXG5cdG9Qcm9wZXJ0eVBhdGg6IFByb3BlcnR5T3JQYXRoPFByb3BlcnR5Pixcblx0b0RhdGFGaWVsZENvbnZlcnRlZDogYW55ID0gbnVsbCxcblx0b0RhdGFNb2RlbE9iamVjdFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGgsXG5cdGlzRWRpdGFibGU6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPiA9IFVJLklzRWRpdGFibGVcbik6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPiB7XG5cdHJldHVybiBnZXRFZGl0YWJsZUV4cHJlc3Npb24oXG5cdFx0b1Byb3BlcnR5UGF0aCxcblx0XHRvRGF0YUZpZWxkQ29udmVydGVkLFxuXHRcdG9EYXRhTW9kZWxPYmplY3RQYXRoLFxuXHRcdHRydWUsXG5cdFx0aXNFZGl0YWJsZVxuXHQpIGFzIEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPjtcbn07XG4vKipcbiAqIENyZWF0ZSB0aGUgZXhwcmVzc2lvbiB0byBnZW5lcmF0ZSBhbiBcImVkaXRhYmxlXCIgYm9vbGVhbiB2YWx1ZS5cbiAqXG4gKiBAcGFyYW0gb1Byb3BlcnR5UGF0aCBUaGUgaW5wdXQgcHJvcGVydHlcbiAqIEBwYXJhbSBvRGF0YUZpZWxkQ29udmVydGVkIFRoZSBEYXRhRmllbGRDb252ZXJ0ZWQgb2JqZWN0IHRvIHJlYWQgdGhlIGZpZWxkQ29udHJvbCBhbm5vdGF0aW9uXG4gKiBAcGFyYW0gb0RhdGFNb2RlbE9iamVjdFBhdGggVGhlIHBhdGggdG8gdGhpcyBwcm9wZXJ0eSBvYmplY3RcbiAqIEBwYXJhbSBiQXNPYmplY3QgV2hldGhlciBvciBub3QgdGhpcyBzaG91bGQgYmUgcmV0dXJuZWQgYXMgYW4gb2JqZWN0IG9yIGEgYmluZGluZyBzdHJpbmdcbiAqIEBwYXJhbSBpc0VkaXRhYmxlIFdoZXRoZXIgb3Igbm90IFVJLklzRWRpdGFibGUgYmUgY29uc2lkZXJlZC5cbiAqIEByZXR1cm5zIFRoZSBiaW5kaW5nIGV4cHJlc3Npb24gdXNlZCB0byBkZXRlcm1pbmUgaWYgYSBwcm9wZXJ0eSBpcyBlZGl0YWJsZSBvciBub3RcbiAqL1xuZXhwb3J0IGNvbnN0IGdldEVkaXRhYmxlRXhwcmVzc2lvbiA9IGZ1bmN0aW9uIChcblx0b1Byb3BlcnR5UGF0aDogUHJvcGVydHlPclBhdGg8UHJvcGVydHk+LFxuXHRvRGF0YUZpZWxkQ29udmVydGVkOiBhbnkgPSBudWxsLFxuXHRvRGF0YU1vZGVsT2JqZWN0UGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aCxcblx0YkFzT2JqZWN0OiBib29sZWFuID0gZmFsc2UsXG5cdGlzRWRpdGFibGU6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPiA9IFVJLklzRWRpdGFibGVcbik6IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIHwgQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0aWYgKCFvUHJvcGVydHlQYXRoIHx8IHR5cGVvZiBvUHJvcGVydHlQYXRoID09PSBcInN0cmluZ1wiKSB7XG5cdFx0cmV0dXJuIGNvbXBpbGVFeHByZXNzaW9uKGZhbHNlKTtcblx0fVxuXHRsZXQgZGF0YUZpZWxkRWRpdGFibGVFeHByZXNzaW9uOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj4gPSBjb25zdGFudCh0cnVlKTtcblx0aWYgKG9EYXRhRmllbGRDb252ZXJ0ZWQgIT09IG51bGwpIHtcblx0XHRkYXRhRmllbGRFZGl0YWJsZUV4cHJlc3Npb24gPSBpZkVsc2UoaXNOb25FZGl0YWJsZUV4cHJlc3Npb24ob0RhdGFGaWVsZENvbnZlcnRlZCksIGZhbHNlLCBpc0VkaXRhYmxlKTtcblx0fVxuXG5cdGNvbnN0IG9Qcm9wZXJ0eTogUHJvcGVydHkgPSAoaXNQYXRoRXhwcmVzc2lvbihvUHJvcGVydHlQYXRoKSAmJiBvUHJvcGVydHlQYXRoLiR0YXJnZXQpIHx8IChvUHJvcGVydHlQYXRoIGFzIFByb3BlcnR5KTtcblx0Ly8gRWRpdGFiaWxpdHkgZGVwZW5kcyBvbiB0aGUgZmllbGQgY29udHJvbCBleHByZXNzaW9uXG5cdC8vIElmIHRoZSBGaWVsZCBjb250cm9sIGlzIHN0YXRpY2FsbHkgaW4gUmVhZE9ubHkgb3IgSW5hcHBsaWNhYmxlIChkaXNhYmxlZCkgLT4gbm90IGVkaXRhYmxlXG5cdC8vIElmIHRoZSBwcm9wZXJ0eSBpcyBhIGtleSAtPiBub3QgZWRpdGFibGUgZXhjZXB0IGluIGNyZWF0aW9uIGlmIG5vdCBjb21wdXRlZFxuXHQvLyBJZiB0aGUgcHJvcGVydHkgaXMgY29tcHV0ZWQgLT4gbm90IGVkaXRhYmxlXG5cdC8vIElmIHRoZSBwcm9wZXJ0eSBpcyBub3QgdXBkYXRhYmxlIC0+IG5vdCBlZGl0YWJsZVxuXHQvLyBJZiB0aGUgcHJvcGVydHkgaXMgaW1tdXRhYmxlIC0+IG5vdCBlZGl0YWJsZSBleGNlcHQgaW4gY3JlYXRpb25cblx0Ly8gSWYgdGhlIEZpZWxkIGNvbnRyb2wgaXMgYSBwYXRoIHJlc29sdmluZyB0byBSZWFkT25seSBvciBJbmFwcGxpY2FibGUgKGRpc2FibGVkKSAoPD0gMSkgLT4gbm90IGVkaXRhYmxlXG5cdC8vIEVsc2UsIHRvIGJlIGVkaXRhYmxlIHlvdSBuZWVkXG5cdC8vIGltbXV0YWJsZSBhbmQga2V5IHdoaWxlIGluIHRoZSBjcmVhdGlvbiByb3dcblx0Ly8gdWkvaXNFZGl0YWJsZVxuXHRjb25zdCBpc1BhdGhVcGRhdGFibGVFeHByZXNzaW9uID0gaXNQYXRoVXBkYXRhYmxlKG9EYXRhTW9kZWxPYmplY3RQYXRoLCB7XG5cdFx0cHJvcGVydHlQYXRoOiBvUHJvcGVydHlQYXRoLFxuXHRcdHBhdGhWaXNpdG9yOiAocGF0aDogc3RyaW5nLCBuYXZpZ2F0aW9uUGF0aHM6IHN0cmluZ1tdKSA9PlxuXHRcdFx0c2luZ2xldG9uUGF0aFZpc2l0b3IocGF0aCwgb0RhdGFNb2RlbE9iamVjdFBhdGguY29udmVydGVkVHlwZXMsIG5hdmlnYXRpb25QYXRocylcblx0fSk7XG5cdGNvbnN0IGVkaXRhYmxlRXhwcmVzc2lvbiA9IGlmRWxzZShcblx0XHRvcihcblx0XHRcdG5vdChpc1BhdGhVcGRhdGFibGVFeHByZXNzaW9uKSxcblx0XHRcdGlzQ29tcHV0ZWQob1Byb3BlcnR5KSxcblx0XHRcdGlzS2V5KG9Qcm9wZXJ0eSksXG5cdFx0XHRpc0ltbXV0YWJsZShvUHJvcGVydHkpLFxuXHRcdFx0aXNOb25FZGl0YWJsZUV4cHJlc3Npb24ob1Byb3BlcnR5KVxuXHRcdCksXG5cdFx0aWZFbHNlKG9yKGlzQ29tcHV0ZWQob1Byb3BlcnR5KSwgaXNOb25FZGl0YWJsZUV4cHJlc3Npb24ob1Byb3BlcnR5KSksIGZhbHNlLCBVSS5Jc1RyYW5zaWVudEJpbmRpbmcpLFxuXHRcdGlzRWRpdGFibGVcblx0KTtcblx0aWYgKGJBc09iamVjdCkge1xuXHRcdHJldHVybiBhbmQoZWRpdGFibGVFeHByZXNzaW9uLCBkYXRhRmllbGRFZGl0YWJsZUV4cHJlc3Npb24pO1xuXHR9XG5cdHJldHVybiBjb21waWxlRXhwcmVzc2lvbihhbmQoZWRpdGFibGVFeHByZXNzaW9uLCBkYXRhRmllbGRFZGl0YWJsZUV4cHJlc3Npb24pKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRDb2xsYWJvcmF0aW9uRXhwcmVzc2lvbiA9IGZ1bmN0aW9uIChcblx0ZGF0YU1vZGVsT2JqZWN0UGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aCxcblx0Zm9ybWF0dGVyOiBhbnlcbik6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxhbnk+IHtcblx0Y29uc3Qgb2JqZWN0UGF0aCA9IGdldFRhcmdldE9iamVjdFBhdGgoZGF0YU1vZGVsT2JqZWN0UGF0aCk7XG5cdGNvbnN0IGFjdGl2aXR5RXhwcmVzc2lvbiA9IHBhdGhJbk1vZGVsKGAvY29sbGFib3JhdGlvbi9hY3Rpdml0aWVzJHtvYmplY3RQYXRofWAsIFwiaW50ZXJuYWxcIik7XG5cdGNvbnN0IGtleXMgPSBkYXRhTW9kZWxPYmplY3RQYXRoPy50YXJnZXRFbnRpdHlUeXBlPy5rZXlzO1xuXHRjb25zdCBrZXlzRXhwcmVzc2lvbnM6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxhbnk+W10gPSBbXTtcblx0a2V5cz8uZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG5cdFx0Y29uc3Qga2V5RXhwcmVzc2lvbiA9IHBhdGhJbk1vZGVsKGtleS5uYW1lKTtcblx0XHRrZXlzRXhwcmVzc2lvbnMucHVzaChrZXlFeHByZXNzaW9uKTtcblx0fSk7XG5cdHJldHVybiBmb3JtYXRSZXN1bHQoW2FjdGl2aXR5RXhwcmVzc2lvbiwgLi4ua2V5c0V4cHJlc3Npb25zXSwgZm9ybWF0dGVyKTtcbn07XG5leHBvcnQgY29uc3QgZ2V0RW5hYmxlZEV4cHJlc3Npb25Bc09iamVjdCA9IGZ1bmN0aW9uIChcblx0b1Byb3BlcnR5UGF0aDogUHJvcGVydHlPclBhdGg8UHJvcGVydHk+LFxuXHRvRGF0YUZpZWxkQ29udmVydGVkPzogYW55XG4pOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj4ge1xuXHRyZXR1cm4gZ2V0RW5hYmxlZEV4cHJlc3Npb24ob1Byb3BlcnR5UGF0aCwgb0RhdGFGaWVsZENvbnZlcnRlZCwgdHJ1ZSkgYXMgQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+O1xufTtcbi8qKlxuICogQ3JlYXRlIHRoZSBleHByZXNzaW9uIHRvIGdlbmVyYXRlIGFuIFwiZW5hYmxlZFwiIGJvb2xlYW4gdmFsdWUuXG4gKlxuICogQHBhcmFtIG9Qcm9wZXJ0eVBhdGggVGhlIGlucHV0IHByb3BlcnR5XG4gKiBAcGFyYW0gb0RhdGFGaWVsZENvbnZlcnRlZCBUaGUgRGF0YUZpZWxkQ29udmVydGVkIE9iamVjdCB0byByZWFkIHRoZSBmaWVsZENvbnRyb2wgYW5ub3RhdGlvblxuICogQHBhcmFtIGJBc09iamVjdCBXaGV0aGVyIG9yIG5vdCB0aGlzIHNob3VsZCBiZSByZXR1cm5lZCBhcyBhbiBvYmplY3Qgb3IgYSBiaW5kaW5nIHN0cmluZ1xuICogQHJldHVybnMgVGhlIGJpbmRpbmcgZXhwcmVzc2lvbiB0byBkZXRlcm1pbmUgaWYgYSBwcm9wZXJ0eSBpcyBlbmFibGVkIG9yIG5vdFxuICovXG5leHBvcnQgY29uc3QgZ2V0RW5hYmxlZEV4cHJlc3Npb24gPSBmdW5jdGlvbiAoXG5cdG9Qcm9wZXJ0eVBhdGg6IFByb3BlcnR5T3JQYXRoPFByb3BlcnR5Pixcblx0b0RhdGFGaWVsZENvbnZlcnRlZD86IGFueSxcblx0YkFzT2JqZWN0OiBib29sZWFuID0gZmFsc2Vcbik6IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIHwgQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0aWYgKCFvUHJvcGVydHlQYXRoIHx8IHR5cGVvZiBvUHJvcGVydHlQYXRoID09PSBcInN0cmluZ1wiKSB7XG5cdFx0cmV0dXJuIGNvbXBpbGVFeHByZXNzaW9uKHRydWUpO1xuXHR9XG5cdGxldCBkYXRhRmllbGRFbmFibGVkRXhwcmVzc2lvbjogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+ID0gY29uc3RhbnQodHJ1ZSk7XG5cdGlmIChvRGF0YUZpZWxkQ29udmVydGVkICE9PSBudWxsKSB7XG5cdFx0ZGF0YUZpZWxkRW5hYmxlZEV4cHJlc3Npb24gPSBpZkVsc2UoaXNEaXNhYmxlZEV4cHJlc3Npb24ob0RhdGFGaWVsZENvbnZlcnRlZCksIGZhbHNlLCB0cnVlKTtcblx0fVxuXG5cdGNvbnN0IG9Qcm9wZXJ0eTogUHJvcGVydHkgPSAoaXNQYXRoRXhwcmVzc2lvbihvUHJvcGVydHlQYXRoKSAmJiBvUHJvcGVydHlQYXRoLiR0YXJnZXQpIHx8IChvUHJvcGVydHlQYXRoIGFzIFByb3BlcnR5KTtcblx0Ly8gRW5hYmxlbWVudCBkZXBlbmRzIG9uIHRoZSBmaWVsZCBjb250cm9sIGV4cHJlc3Npb25cblx0Ly8gSWYgdGhlIEZpZWxkIGNvbnRyb2wgaXMgc3RhdGljYWxseSBpbiBJbmFwcGxpY2FibGUgKGRpc2FibGVkKSAtPiBub3QgZW5hYmxlZFxuXHRjb25zdCBlbmFibGVkRXhwcmVzc2lvbiA9IGlmRWxzZShpc0Rpc2FibGVkRXhwcmVzc2lvbihvUHJvcGVydHkpLCBmYWxzZSwgdHJ1ZSk7XG5cdGlmIChiQXNPYmplY3QpIHtcblx0XHRyZXR1cm4gYW5kKGVuYWJsZWRFeHByZXNzaW9uLCBkYXRhRmllbGRFbmFibGVkRXhwcmVzc2lvbik7XG5cdH1cblx0cmV0dXJuIGNvbXBpbGVFeHByZXNzaW9uKGFuZChlbmFibGVkRXhwcmVzc2lvbiwgZGF0YUZpZWxkRW5hYmxlZEV4cHJlc3Npb24pKTtcbn07XG5cbi8qKlxuICogQ3JlYXRlIHRoZSBleHByZXNzaW9uIHRvIGdlbmVyYXRlIGFuIFwiZWRpdE1vZGVcIiBlbnVtIHZhbHVlLlxuICpcbiAqIEBwYXJhbSBvUHJvcGVydHlQYXRoIFRoZSBpbnB1dCBwcm9wZXJ0eVxuICogQHBhcmFtIG9EYXRhTW9kZWxPYmplY3RQYXRoIFRoZSBsaXN0IG9mIGRhdGEgbW9kZWwgb2JqZWN0cyB0aGF0IGFyZSBpbnZvbHZlZCB0byByZWFjaCB0aGF0IHByb3BlcnR5XG4gKiBAcGFyYW0gYk1lYXN1cmVSZWFkT25seSBXaGV0aGVyIHdlIHNob3VsZCBzZXQgVW9NIC8gY3VycmVuY3kgZmllbGQgbW9kZSB0byByZWFkIG9ubHlcbiAqIEBwYXJhbSBiQXNPYmplY3QgV2hldGhlciB3ZSBzaG91bGQgcmV0dXJuIHRoaXMgYXMgYW4gZXhwcmVzc2lvbiBvciBhcyBhIHN0cmluZ1xuICogQHBhcmFtIG9EYXRhRmllbGRDb252ZXJ0ZWQgVGhlIGRhdGFGaWVsZCBvYmplY3RcbiAqIEBwYXJhbSBpc0VkaXRhYmxlIFdoZXRoZXIgb3Igbm90IFVJLklzRWRpdGFibGUgYmUgY29uc2lkZXJlZC5cbiAqIEByZXR1cm5zIFRoZSBiaW5kaW5nIGV4cHJlc3Npb24gcmVwcmVzZW50aW5nIHRoZSBjdXJyZW50IHByb3BlcnR5IGVkaXQgbW9kZSwgY29tcGxpYW50IHdpdGggdGhlIE1EQyBGaWVsZCBkZWZpbml0aW9uIG9mIGVkaXRNb2RlLlxuICovXG5leHBvcnQgY29uc3QgZ2V0RWRpdE1vZGUgPSBmdW5jdGlvbiAoXG5cdG9Qcm9wZXJ0eVBhdGg6IFByb3BlcnR5T3JQYXRoPFByb3BlcnR5Pixcblx0b0RhdGFNb2RlbE9iamVjdFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGgsXG5cdGJNZWFzdXJlUmVhZE9ubHk6IGJvb2xlYW4gPSBmYWxzZSxcblx0YkFzT2JqZWN0OiBib29sZWFuID0gZmFsc2UsXG5cdG9EYXRhRmllbGRDb252ZXJ0ZWQ6IGFueSA9IG51bGwsXG5cdGlzRWRpdGFibGU6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPiA9IFVJLklzRWRpdGFibGVcbik6IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIHwgQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPHN0cmluZz4ge1xuXHRpZiAoIW9Qcm9wZXJ0eVBhdGggfHwgdHlwZW9mIG9Qcm9wZXJ0eVBhdGggPT09IFwic3RyaW5nXCIpIHtcblx0XHRyZXR1cm4gXCJEaXNwbGF5XCI7XG5cdH1cblx0Y29uc3Qgb1Byb3BlcnR5OiBQcm9wZXJ0eSA9IChpc1BhdGhFeHByZXNzaW9uKG9Qcm9wZXJ0eVBhdGgpICYmIG9Qcm9wZXJ0eVBhdGguJHRhcmdldCkgfHwgKG9Qcm9wZXJ0eVBhdGggYXMgUHJvcGVydHkpO1xuXHQvLyBpZiB0aGUgcHJvcGVydHkgaXMgbm90IGVuYWJsZWQgPT4gRGlzYWJsZWRcblx0Ly8gaWYgdGhlIHByb3BlcnR5IGlzIGVuYWJsZWQgJiYgbm90IGVkaXRhYmxlID0+IFJlYWRPbmx5XG5cdC8vIGlmIHRoZSBwcm9wZXJ0eSBpcyBlbmFibGVkICYmIGVkaXRhYmxlID0+IEVkaXRhYmxlXG5cdC8vIElmIHRoZXJlIGlzIGFuIGFzc29jaWF0ZWQgdW5pdCwgYW5kIGl0IGhhcyBhIGZpZWxkIGNvbnRyb2wgYWxzbyB1c2UgY29uc2lkZXIgdGhlIGZvbGxvd2luZ1xuXHQvLyBpZiB0aGUgdW5pdCBmaWVsZCBjb250cm9sIGlzIHJlYWRvbmx5IC0+IEVkaXRhYmxlUmVhZE9ubHlcblx0Ly8gb3RoZXJ3aXNlIC0+IEVkaXRhYmxlXG5cdGNvbnN0IGVkaXRhYmxlRXhwcmVzc2lvbiA9IGdldEVkaXRhYmxlRXhwcmVzc2lvbkFzT2JqZWN0KG9Qcm9wZXJ0eVBhdGgsIG9EYXRhRmllbGRDb252ZXJ0ZWQsIG9EYXRhTW9kZWxPYmplY3RQYXRoLCBpc0VkaXRhYmxlKTtcblxuXHRjb25zdCBlbmFibGVkRXhwcmVzc2lvbiA9IGdldEVuYWJsZWRFeHByZXNzaW9uQXNPYmplY3Qob1Byb3BlcnR5UGF0aCwgb0RhdGFGaWVsZENvbnZlcnRlZCk7XG5cdGNvbnN0IGFzc29jaWF0ZWRDdXJyZW5jeVByb3BlcnR5ID0gZ2V0QXNzb2NpYXRlZEN1cnJlbmN5UHJvcGVydHkob1Byb3BlcnR5KTtcblx0Y29uc3QgdW5pdFByb3BlcnR5ID0gYXNzb2NpYXRlZEN1cnJlbmN5UHJvcGVydHkgfHwgZ2V0QXNzb2NpYXRlZFVuaXRQcm9wZXJ0eShvUHJvcGVydHkpO1xuXHRsZXQgcmVzdWx0RXhwcmVzc2lvbjogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPHN0cmluZz4gPSBjb25zdGFudChcIkVkaXRhYmxlXCIpO1xuXHRpZiAodW5pdFByb3BlcnR5KSB7XG5cdFx0Y29uc3QgaXNVbml0UmVhZE9ubHkgPSBpc1JlYWRPbmx5RXhwcmVzc2lvbih1bml0UHJvcGVydHkpO1xuXHRcdHJlc3VsdEV4cHJlc3Npb24gPSBpZkVsc2UoXG5cdFx0XHRvcihpc1VuaXRSZWFkT25seSwgaXNDb21wdXRlZCh1bml0UHJvcGVydHkpLCBiTWVhc3VyZVJlYWRPbmx5KSxcblx0XHRcdGlmRWxzZSghaXNDb25zdGFudChpc1VuaXRSZWFkT25seSkgJiYgaXNVbml0UmVhZE9ubHksIFwiRWRpdGFibGVSZWFkT25seVwiLCBcIkVkaXRhYmxlRGlzcGxheVwiKSxcblx0XHRcdFwiRWRpdGFibGVcIlxuXHRcdCk7XG5cdH1cblx0Y29uc3QgcmVhZE9ubHlFeHByZXNzaW9uID0gb3IoaXNSZWFkT25seUV4cHJlc3Npb24ob1Byb3BlcnR5KSwgaXNSZWFkT25seUV4cHJlc3Npb24ob0RhdGFGaWVsZENvbnZlcnRlZCkpO1xuXG5cdC8vIGlmIHRoZSBwcm9wZXJ0eSBpcyBmcm9tIGEgbm9uLXVwZGF0YWJsZSBlbnRpdHkgPT4gUmVhZCBvbmx5IG1vZGUsIHByZXZpb3VzbHkgY2FsY3VsYXRlZCBlZGl0IE1vZGUgaXMgaWdub3JlZFxuXHQvLyBpZiB0aGUgcHJvcGVydHkgaXMgZnJvbSBhbiB1cGRhdGFibGUgZW50aXR5ID0+IHByZXZpb3VzbHkgY2FsY3VsYXRlZCBlZGl0IE1vZGUgZXhwcmVzc2lvblxuXHRjb25zdCBlZGl0TW9kZUV4cHJlc3Npb24gPSBpZkVsc2UoXG5cdFx0ZW5hYmxlZEV4cHJlc3Npb24sXG5cdFx0aWZFbHNlKFxuXHRcdFx0ZWRpdGFibGVFeHByZXNzaW9uLFxuXHRcdFx0cmVzdWx0RXhwcmVzc2lvbixcblx0XHRcdGlmRWxzZShhbmQoIWlzQ29uc3RhbnQocmVhZE9ubHlFeHByZXNzaW9uKSAmJiByZWFkT25seUV4cHJlc3Npb24sIGlzRWRpdGFibGUpLCBcIlJlYWRPbmx5XCIsIFwiRGlzcGxheVwiKVxuXHRcdCksXG5cdFx0aWZFbHNlKGlzRWRpdGFibGUsIFwiRGlzYWJsZWRcIiwgXCJEaXNwbGF5XCIpXG5cdCk7XG5cdGlmIChiQXNPYmplY3QpIHtcblx0XHRyZXR1cm4gZWRpdE1vZGVFeHByZXNzaW9uO1xuXHR9XG5cdHJldHVybiBjb21waWxlRXhwcmVzc2lvbihlZGl0TW9kZUV4cHJlc3Npb24pO1xufTtcblxuZXhwb3J0IGNvbnN0IGhhc1ZhbGlkQW5hbHl0aWNhbEN1cnJlbmN5T3JVbml0ID0gZnVuY3Rpb24gKFxuXHRvUHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoXG4pOiBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiB7XG5cdGNvbnN0IG9Qcm9wZXJ0eURlZmluaXRpb24gPSBvUHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldE9iamVjdCBhcyBQcm9wZXJ0eTtcblx0Y29uc3QgY3VycmVuY3kgPSBvUHJvcGVydHlEZWZpbml0aW9uLmFubm90YXRpb25zPy5NZWFzdXJlcz8uSVNPQ3VycmVuY3k7XG5cdGNvbnN0IG1lYXN1cmUgPSBjdXJyZW5jeSA/IGN1cnJlbmN5IDogb1Byb3BlcnR5RGVmaW5pdGlvbi5hbm5vdGF0aW9ucz8uTWVhc3VyZXM/LlVuaXQ7XG5cdGlmIChtZWFzdXJlKSB7XG5cdFx0cmV0dXJuIGNvbXBpbGVFeHByZXNzaW9uKG9yKGlzVHJ1dGh5KGdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbihtZWFzdXJlKSBhcyBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248c3RyaW5nPiksIG5vdChVSS5Jc1RvdGFsKSkpO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBjb21waWxlRXhwcmVzc2lvbihjb25zdGFudCh0cnVlKSk7XG5cdH1cbn07XG5cbmV4cG9ydCBjb25zdCBpZlVuaXRFZGl0YWJsZSA9IGZ1bmN0aW9uIChcblx0b1Byb3BlcnR5UGF0aDogUHJvcGVydHlPclBhdGg8UHJvcGVydHk+LFxuXHRzRWRpdGFibGVWYWx1ZTogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPHN0cmluZz4gfCBzdHJpbmcsXG5cdHNOb25FZGl0YWJsZVZhbHVlOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248c3RyaW5nPiB8IHN0cmluZ1xuKTogQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24ge1xuXHRjb25zdCBvUHJvcGVydHkgPSAoaXNQYXRoRXhwcmVzc2lvbihvUHJvcGVydHlQYXRoKSAmJiBvUHJvcGVydHlQYXRoLiR0YXJnZXQpIHx8IChvUHJvcGVydHlQYXRoIGFzIFByb3BlcnR5KTtcblx0Y29uc3QgdW5pdFByb3BlcnR5ID0gZ2V0QXNzb2NpYXRlZEN1cnJlbmN5UHJvcGVydHkob1Byb3BlcnR5KSB8fCBnZXRBc3NvY2lhdGVkVW5pdFByb3BlcnR5KG9Qcm9wZXJ0eSk7XG5cdGlmICghdW5pdFByb3BlcnR5KSB7XG5cdFx0cmV0dXJuIGNvbXBpbGVFeHByZXNzaW9uKHNOb25FZGl0YWJsZVZhbHVlKTtcblx0fVxuXHRjb25zdCBpc1VuaXRSZWFkT25seSA9IGlzUmVhZE9ubHlFeHByZXNzaW9uKHVuaXRQcm9wZXJ0eSk7XG5cdGNvbnN0IGVkaXRhYmxlRXhwcmVzc2lvbiA9IGFuZChvcighaXNDb25zdGFudChpc1VuaXRSZWFkT25seSksIG5vdChpc1VuaXRSZWFkT25seSkpLCBub3QoaXNDb21wdXRlZCh1bml0UHJvcGVydHkpKSk7XG5cdHJldHVybiBjb21waWxlRXhwcmVzc2lvbihpZkVsc2UoZWRpdGFibGVFeHByZXNzaW9uLCBzRWRpdGFibGVWYWx1ZSwgc05vbkVkaXRhYmxlVmFsdWUpKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRGaWVsZERpc3BsYXkgPSBmdW5jdGlvbiAoXG5cdG9Qcm9wZXJ0eVBhdGg6IFByb3BlcnR5T3JQYXRoPFByb3BlcnR5Pixcblx0c1RhcmdldERpc3BsYXlNb2RlOiBzdHJpbmcsXG5cdG9Db21wdXRlZEVkaXRNb2RlOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248c3RyaW5nPlxuKTogQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24ge1xuXHRjb25zdCBvUHJvcGVydHkgPSAoaXNQYXRoRXhwcmVzc2lvbihvUHJvcGVydHlQYXRoKSAmJiBvUHJvcGVydHlQYXRoLiR0YXJnZXQpIHx8IChvUHJvcGVydHlQYXRoIGFzIFByb3BlcnR5KTtcblxuXHRyZXR1cm4gaGFzVmFsdWVIZWxwKG9Qcm9wZXJ0eSlcblx0XHQ/IGNvbXBpbGVFeHByZXNzaW9uKHNUYXJnZXREaXNwbGF5TW9kZSlcblx0XHQ6IGNvbXBpbGVFeHByZXNzaW9uKGlmRWxzZShlcXVhbChvQ29tcHV0ZWRFZGl0TW9kZSwgXCJFZGl0YWJsZVwiKSwgXCJWYWx1ZVwiLCBzVGFyZ2V0RGlzcGxheU1vZGUpKTtcbn07XG5cbmV4cG9ydCBjb25zdCBmb3JtYXRXaXRoVHlwZUluZm9ybWF0aW9uID0gZnVuY3Rpb24gKFxuXHRvUHJvcGVydHk6IFByb3BlcnR5LFxuXHRwcm9wZXJ0eUJpbmRpbmdFeHByZXNzaW9uOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248c3RyaW5nPixcblx0aWdub3JlQ29uc3RyYWludHM/OiBib29sZWFuXG4pOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248c3RyaW5nPiB7XG5cdGNvbnN0IG91dEV4cHJlc3Npb246IFBhdGhJbk1vZGVsRXhwcmVzc2lvbjxhbnk+ID0gcHJvcGVydHlCaW5kaW5nRXhwcmVzc2lvbiBhcyBQYXRoSW5Nb2RlbEV4cHJlc3Npb248YW55Pjtcblx0aWYgKG9Qcm9wZXJ0eS5fdHlwZSA9PT0gXCJQcm9wZXJ0eVwiKSB7XG5cdFx0Y29uc3Qgb1RhcmdldE1hcHBpbmcgPSBFRE1fVFlQRV9NQVBQSU5HW29Qcm9wZXJ0eS50eXBlXTtcblx0XHRpZiAob1RhcmdldE1hcHBpbmcpIHtcblx0XHRcdG91dEV4cHJlc3Npb24udHlwZSA9IG9UYXJnZXRNYXBwaW5nLnR5cGU7XG5cdFx0XHRpZiAob1RhcmdldE1hcHBpbmcuY29uc3RyYWludHMgJiYgIWlnbm9yZUNvbnN0cmFpbnRzKSB7XG5cdFx0XHRcdG91dEV4cHJlc3Npb24uY29uc3RyYWludHMgPSB7fTtcblx0XHRcdFx0aWYgKG9UYXJnZXRNYXBwaW5nLmNvbnN0cmFpbnRzLiRTY2FsZSAmJiBvUHJvcGVydHkuc2NhbGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdG91dEV4cHJlc3Npb24uY29uc3RyYWludHMuc2NhbGUgPSBvUHJvcGVydHkuc2NhbGU7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKG9UYXJnZXRNYXBwaW5nLmNvbnN0cmFpbnRzLiRQcmVjaXNpb24gJiYgb1Byb3BlcnR5LnByZWNpc2lvbiAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0b3V0RXhwcmVzc2lvbi5jb25zdHJhaW50cy5wcmVjaXNpb24gPSBvUHJvcGVydHkucHJlY2lzaW9uO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChvVGFyZ2V0TWFwcGluZy5jb25zdHJhaW50cy4kTWF4TGVuZ3RoICYmIG9Qcm9wZXJ0eS5tYXhMZW5ndGggIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdG91dEV4cHJlc3Npb24uY29uc3RyYWludHMubWF4TGVuZ3RoID0gb1Byb3BlcnR5Lm1heExlbmd0aDtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAob1Byb3BlcnR5Lm51bGxhYmxlID09PSBmYWxzZSkge1xuXHRcdFx0XHRcdG91dEV4cHJlc3Npb24uY29uc3RyYWludHMubnVsbGFibGUgPSBvUHJvcGVydHkubnVsbGFibGU7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdG9UYXJnZXRNYXBwaW5nLmNvbnN0cmFpbnRzW1wiQE9yZy5PRGF0YS5WYWxpZGF0aW9uLlYxLk1pbmltdW0vJERlY2ltYWxcIl0gJiZcblx0XHRcdFx0XHRvUHJvcGVydHkuYW5ub3RhdGlvbnM/LlZhbGlkYXRpb24/Lk1pbmltdW0gIT09IHVuZGVmaW5lZCAmJlxuXHRcdFx0XHRcdCFpc05hTihvUHJvcGVydHkuYW5ub3RhdGlvbnMuVmFsaWRhdGlvbi5NaW5pbXVtKVxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRvdXRFeHByZXNzaW9uLmNvbnN0cmFpbnRzLm1pbmltdW0gPSBgJHtvUHJvcGVydHkuYW5ub3RhdGlvbnMuVmFsaWRhdGlvbi5NaW5pbXVtfWA7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdG9UYXJnZXRNYXBwaW5nLmNvbnN0cmFpbnRzW1wiQE9yZy5PRGF0YS5WYWxpZGF0aW9uLlYxLk1heGltdW0vJERlY2ltYWxcIl0gJiZcblx0XHRcdFx0XHRvUHJvcGVydHkuYW5ub3RhdGlvbnM/LlZhbGlkYXRpb24/Lk1heGltdW0gIT09IHVuZGVmaW5lZCAmJlxuXHRcdFx0XHRcdCFpc05hTihvUHJvcGVydHkuYW5ub3RhdGlvbnMuVmFsaWRhdGlvbi5NYXhpbXVtKVxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRvdXRFeHByZXNzaW9uLmNvbnN0cmFpbnRzLm1heGltdW0gPSBgJHtvUHJvcGVydHkuYW5ub3RhdGlvbnMuVmFsaWRhdGlvbi5NYXhpbXVtfWA7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAob1Byb3BlcnR5Lm51bGxhYmxlID09PSBmYWxzZSkge1xuXHRcdFx0XHRvdXRFeHByZXNzaW9uLmNvbnN0cmFpbnRzID0ge307XG5cdFx0XHRcdG91dEV4cHJlc3Npb24uY29uc3RyYWludHMubnVsbGFibGUgPSBvUHJvcGVydHkubnVsbGFibGU7XG5cdFx0XHR9XG5cdFx0XHRpZiAob3V0RXhwcmVzc2lvbj8udHlwZT8uaW5kZXhPZihcInNhcC51aS5tb2RlbC5vZGF0YS50eXBlLkludFwiKSA9PT0gMCkge1xuXHRcdFx0XHRpZiAoIW91dEV4cHJlc3Npb24uZm9ybWF0T3B0aW9ucykge1xuXHRcdFx0XHRcdG91dEV4cHJlc3Npb24uZm9ybWF0T3B0aW9ucyA9IHt9O1xuXHRcdFx0XHR9XG5cdFx0XHRcdG91dEV4cHJlc3Npb24uZm9ybWF0T3B0aW9ucyA9IE9iamVjdC5hc3NpZ24ob3V0RXhwcmVzc2lvbi5mb3JtYXRPcHRpb25zLCB7XG5cdFx0XHRcdFx0cGFyc2VBc1N0cmluZzogZmFsc2UsXG5cdFx0XHRcdFx0ZW1wdHlTdHJpbmc6IFwiXCJcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0XHRpZiAob3V0RXhwcmVzc2lvbi50eXBlID09PSBcInNhcC51aS5tb2RlbC5vZGF0YS50eXBlLlN0cmluZ1wiKSB7XG5cdFx0XHRcdGlmICghb3V0RXhwcmVzc2lvbi5mb3JtYXRPcHRpb25zKSB7XG5cdFx0XHRcdFx0b3V0RXhwcmVzc2lvbi5mb3JtYXRPcHRpb25zID0ge307XG5cdFx0XHRcdH1cblx0XHRcdFx0b3V0RXhwcmVzc2lvbi5mb3JtYXRPcHRpb25zLnBhcnNlS2VlcHNFbXB0eVN0cmluZyA9IHRydWU7XG5cblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdG9UYXJnZXRNYXBwaW5nLmNvbnN0cmFpbnRzPy5bXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLklzRGlnaXRTZXF1ZW5jZVwiXSAmJlxuXHRcdFx0XHRcdG9Qcm9wZXJ0eS5hbm5vdGF0aW9ucz8uQ29tbW9uPy5Jc0RpZ2l0U2VxdWVuY2Vcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0b3V0RXhwcmVzc2lvbi5jb25zdHJhaW50cy5pc0RpZ2l0U2VxdWVuY2UgPSB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRpZiAob3V0RXhwcmVzc2lvbj8udHlwZT8uaW5kZXhPZihcInNhcC51aS5tb2RlbC5vZGF0YS50eXBlLkRvdWJsZVwiKSA9PT0gMCkge1xuXHRcdFx0XHRpZiAoIW91dEV4cHJlc3Npb24uZm9ybWF0T3B0aW9ucykge1xuXHRcdFx0XHRcdG91dEV4cHJlc3Npb24uZm9ybWF0T3B0aW9ucyA9IHt9O1xuXHRcdFx0XHR9XG5cdFx0XHRcdG91dEV4cHJlc3Npb24uZm9ybWF0T3B0aW9ucyA9IE9iamVjdC5hc3NpZ24ob3V0RXhwcmVzc2lvbi5mb3JtYXRPcHRpb25zLCB7XG5cdFx0XHRcdFx0cGFyc2VBc1N0cmluZzogZmFsc2UsXG5cdFx0XHRcdFx0ZW1wdHlTdHJpbmc6IFwiXCJcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0XHRpZiAob3V0RXhwcmVzc2lvbj8udHlwZT8uaW5kZXhPZihcInNhcC51aS5tb2RlbC5vZGF0YS50eXBlLkRhdGVUaW1lT2Zmc2V0XCIpID09PSAwKSB7XG5cdFx0XHRcdG91dEV4cHJlc3Npb24uY29uc3RyYWludHMuVjQgPSB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHRyZXR1cm4gb3V0RXhwcmVzc2lvbjtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRUeXBlQ29uZmlnID0gZnVuY3Rpb24gKG9Qcm9wZXJ0eTogUHJvcGVydHkgfCBEYXRhRmllbGRBYnN0cmFjdFR5cGVzLCBkYXRhVHlwZTogc3RyaW5nIHwgdW5kZWZpbmVkKTogYW55IHtcblx0Y29uc3Qgb1RhcmdldE1hcHBpbmcgPSBFRE1fVFlQRV9NQVBQSU5HWyhvUHJvcGVydHkgYXMgUHJvcGVydHkpPy50eXBlXSB8fCAoZGF0YVR5cGUgPyBFRE1fVFlQRV9NQVBQSU5HW2RhdGFUeXBlXSA6IHVuZGVmaW5lZCk7XG5cdGNvbnN0IHByb3BlcnR5VHlwZUNvbmZpZzogY29uZmlnVHlwZSA9IHtcblx0XHR0eXBlOiBvVGFyZ2V0TWFwcGluZy50eXBlLFxuXHRcdGNvbnN0cmFpbnRzOiB7fSxcblx0XHRmb3JtYXRPcHRpb25zOiB7fVxuXHR9O1xuXHRpZiAoaXNQcm9wZXJ0eShvUHJvcGVydHkpKSB7XG5cdFx0cHJvcGVydHlUeXBlQ29uZmlnLmNvbnN0cmFpbnRzID0ge1xuXHRcdFx0c2NhbGU6IG9UYXJnZXRNYXBwaW5nLmNvbnN0cmFpbnRzPy4kU2NhbGUgPyBvUHJvcGVydHkuc2NhbGUgOiB1bmRlZmluZWQsXG5cdFx0XHRwcmVjaXNpb246IG9UYXJnZXRNYXBwaW5nLmNvbnN0cmFpbnRzPy4kUHJlY2lzaW9uID8gb1Byb3BlcnR5LnByZWNpc2lvbiA6IHVuZGVmaW5lZCxcblx0XHRcdG1heExlbmd0aDogb1RhcmdldE1hcHBpbmcuY29uc3RyYWludHM/LiRNYXhMZW5ndGggPyBvUHJvcGVydHkubWF4TGVuZ3RoIDogdW5kZWZpbmVkLFxuXHRcdFx0bnVsbGFibGU6IG9UYXJnZXRNYXBwaW5nLmNvbnN0cmFpbnRzPy4kTnVsbGFibGUgPyBvUHJvcGVydHkubnVsbGFibGUgOiB1bmRlZmluZWQsXG5cdFx0XHRtaW5pbXVtOlxuXHRcdFx0XHRvVGFyZ2V0TWFwcGluZy5jb25zdHJhaW50cz8uW1wiQE9yZy5PRGF0YS5WYWxpZGF0aW9uLlYxLk1pbmltdW0vJERlY2ltYWxcIl0gJiZcblx0XHRcdFx0IWlzTmFOKG9Qcm9wZXJ0eS5hbm5vdGF0aW9ucz8uVmFsaWRhdGlvbj8uTWluaW11bSlcblx0XHRcdFx0XHQ/IGAke29Qcm9wZXJ0eS5hbm5vdGF0aW9ucz8uVmFsaWRhdGlvbj8uTWluaW11bX1gXG5cdFx0XHRcdFx0OiB1bmRlZmluZWQsXG5cdFx0XHRtYXhpbXVtOlxuXHRcdFx0XHRvVGFyZ2V0TWFwcGluZy5jb25zdHJhaW50cz8uW1wiQE9yZy5PRGF0YS5WYWxpZGF0aW9uLlYxLk1heGltdW0vJERlY2ltYWxcIl0gJiZcblx0XHRcdFx0IWlzTmFOKG9Qcm9wZXJ0eS5hbm5vdGF0aW9ucz8uVmFsaWRhdGlvbj8uTWF4aW11bSlcblx0XHRcdFx0XHQ/IGAke29Qcm9wZXJ0eS5hbm5vdGF0aW9ucz8uVmFsaWRhdGlvbj8uTWF4aW11bX1gXG5cdFx0XHRcdFx0OiB1bmRlZmluZWQsXG5cdFx0XHRpc0RpZ2l0U2VxdWVuY2U6XG5cdFx0XHRcdHByb3BlcnR5VHlwZUNvbmZpZy50eXBlID09PSBcInNhcC51aS5tb2RlbC5vZGF0YS50eXBlLlN0cmluZ1wiICYmXG5cdFx0XHRcdG9UYXJnZXRNYXBwaW5nLmNvbnN0cmFpbnRzPy5bXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLklzRGlnaXRTZXF1ZW5jZVwiXSAmJlxuXHRcdFx0XHRvUHJvcGVydHkuYW5ub3RhdGlvbnM/LkNvbW1vbj8uSXNEaWdpdFNlcXVlbmNlXG5cdFx0XHRcdFx0PyB0cnVlXG5cdFx0XHRcdFx0OiB1bmRlZmluZWQsXG5cdFx0XHRWNDogb1RhcmdldE1hcHBpbmcuY29uc3RyYWludHM/LiRWNCA/IHRydWUgOiB1bmRlZmluZWRcblx0XHR9O1xuXHR9XG5cdHByb3BlcnR5VHlwZUNvbmZpZy5mb3JtYXRPcHRpb25zID0ge1xuXHRcdHBhcnNlQXNTdHJpbmc6XG5cdFx0XHRwcm9wZXJ0eVR5cGVDb25maWc/LnR5cGU/LmluZGV4T2YoXCJzYXAudWkubW9kZWwub2RhdGEudHlwZS5JbnRcIikgPT09IDAgfHxcblx0XHRcdHByb3BlcnR5VHlwZUNvbmZpZz8udHlwZT8uaW5kZXhPZihcInNhcC51aS5tb2RlbC5vZGF0YS50eXBlLkRvdWJsZVwiKSA9PT0gMFxuXHRcdFx0XHQ/IGZhbHNlXG5cdFx0XHRcdDogdW5kZWZpbmVkLFxuXHRcdGVtcHR5U3RyaW5nOlxuXHRcdFx0cHJvcGVydHlUeXBlQ29uZmlnPy50eXBlPy5pbmRleE9mKFwic2FwLnVpLm1vZGVsLm9kYXRhLnR5cGUuSW50XCIpID09PSAwIHx8XG5cdFx0XHRwcm9wZXJ0eVR5cGVDb25maWc/LnR5cGU/LmluZGV4T2YoXCJzYXAudWkubW9kZWwub2RhdGEudHlwZS5Eb3VibGVcIikgPT09IDBcblx0XHRcdFx0PyBcIlwiXG5cdFx0XHRcdDogdW5kZWZpbmVkLFxuXHRcdHBhcnNlS2VlcHNFbXB0eVN0cmluZzogcHJvcGVydHlUeXBlQ29uZmlnLnR5cGUgPT09IFwic2FwLnVpLm1vZGVsLm9kYXRhLnR5cGUuU3RyaW5nXCIgPyB0cnVlIDogdW5kZWZpbmVkXG5cdH07XG5cdHJldHVybiBwcm9wZXJ0eVR5cGVDb25maWc7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0QmluZGluZ1dpdGhVbml0T3JDdXJyZW5jeSA9IGZ1bmN0aW9uIChcblx0b1Byb3BlcnR5RGF0YU1vZGVsUGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aCxcblx0cHJvcGVydHlCaW5kaW5nRXhwcmVzc2lvbjogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPHN0cmluZz4sXG5cdGlnbm9yZVVuaXRDb25zdHJhaW50PzogYm9vbGVhbixcblx0Zm9ybWF0T3B0aW9ucz86IGFueVxuKTogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPHN0cmluZz4ge1xuXHRjb25zdCBvUHJvcGVydHlEZWZpbml0aW9uID0gb1Byb3BlcnR5RGF0YU1vZGVsUGF0aC50YXJnZXRPYmplY3QgYXMgUHJvcGVydHk7XG5cdGxldCB1bml0ID0gb1Byb3BlcnR5RGVmaW5pdGlvbi5hbm5vdGF0aW9ucz8uTWVhc3VyZXM/LlVuaXQ7XG5cdGNvbnN0IHJlbGF0aXZlTG9jYXRpb24gPSBnZXRQYXRoUmVsYXRpdmVMb2NhdGlvbihcblx0XHRvUHJvcGVydHlEYXRhTW9kZWxQYXRoLmNvbnRleHRMb2NhdGlvbixcblx0XHRvUHJvcGVydHlEYXRhTW9kZWxQYXRoLm5hdmlnYXRpb25Qcm9wZXJ0aWVzXG5cdCkubWFwKChucCkgPT4gbnAubmFtZSk7XG5cdHByb3BlcnR5QmluZGluZ0V4cHJlc3Npb24gPSBmb3JtYXRXaXRoVHlwZUluZm9ybWF0aW9uKG9Qcm9wZXJ0eURlZmluaXRpb24sIHByb3BlcnR5QmluZGluZ0V4cHJlc3Npb24pO1xuXHRpZiAodW5pdD8udG9TdHJpbmcoKSA9PT0gXCIlXCIpIHtcblx0XHRyZXR1cm4gZm9ybWF0UmVzdWx0KFtwcm9wZXJ0eUJpbmRpbmdFeHByZXNzaW9uXSwgdmFsdWVGb3JtYXR0ZXJzLmZvcm1hdFdpdGhQZXJjZW50YWdlKTtcblx0fVxuXHRjb25zdCBjb21wbGV4VHlwZSA9IHVuaXQgPyBcInNhcC51aS5tb2RlbC5vZGF0YS50eXBlLlVuaXRcIiA6IFwic2FwLnVpLm1vZGVsLm9kYXRhLnR5cGUuQ3VycmVuY3lcIjtcblx0dW5pdCA9IHVuaXQgPyB1bml0IDogKG9Qcm9wZXJ0eURlZmluaXRpb24uYW5ub3RhdGlvbnM/Lk1lYXN1cmVzPy5JU09DdXJyZW5jeSBhcyBhbnkpO1xuXHRjb25zdCB1bml0QmluZGluZ0V4cHJlc3Npb24gPSAodW5pdCBhcyBhbnkpLiR0YXJnZXRcblx0XHQ/IGZvcm1hdFdpdGhUeXBlSW5mb3JtYXRpb24oXG5cdFx0XHRcdCh1bml0IGFzIGFueSkuJHRhcmdldCxcblx0XHRcdFx0Z2V0RXhwcmVzc2lvbkZyb21Bbm5vdGF0aW9uKHVuaXQsIHJlbGF0aXZlTG9jYXRpb24pIGFzIEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxzdHJpbmc+LFxuXHRcdFx0XHRpZ25vcmVVbml0Q29uc3RyYWludFxuXHRcdCAgKVxuXHRcdDogKGdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbih1bml0LCByZWxhdGl2ZUxvY2F0aW9uKSBhcyBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248c3RyaW5nPik7XG5cblx0cmV0dXJuIGFkZFR5cGVJbmZvcm1hdGlvbihbcHJvcGVydHlCaW5kaW5nRXhwcmVzc2lvbiwgdW5pdEJpbmRpbmdFeHByZXNzaW9uXSwgY29tcGxleFR5cGUsIHVuZGVmaW5lZCwgZm9ybWF0T3B0aW9ucyk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0QmluZGluZ0ZvclVuaXRPckN1cnJlbmN5ID0gZnVuY3Rpb24gKFxuXHRvUHJvcGVydHlEYXRhTW9kZWxQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoXG4pOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248c3RyaW5nPiB8IHN0cmluZyB7XG5cdGNvbnN0IG9Qcm9wZXJ0eURlZmluaXRpb24gPSBvUHJvcGVydHlEYXRhTW9kZWxQYXRoLnRhcmdldE9iamVjdCBhcyBQcm9wZXJ0eTtcblxuXHRsZXQgdW5pdCA9IG9Qcm9wZXJ0eURlZmluaXRpb24uYW5ub3RhdGlvbnM/Lk1lYXN1cmVzPy5Vbml0O1xuXHRpZiAodW5pdD8udG9TdHJpbmcoKSA9PT0gXCIlXCIpIHtcblx0XHRyZXR1cm4gY29uc3RhbnQoXCIlXCIpO1xuXHR9XG5cdGNvbnN0IHJlbGF0aXZlTG9jYXRpb24gPSBnZXRQYXRoUmVsYXRpdmVMb2NhdGlvbihcblx0XHRvUHJvcGVydHlEYXRhTW9kZWxQYXRoLmNvbnRleHRMb2NhdGlvbixcblx0XHRvUHJvcGVydHlEYXRhTW9kZWxQYXRoLm5hdmlnYXRpb25Qcm9wZXJ0aWVzXG5cdCkubWFwKChucCkgPT4gbnAubmFtZSk7XG5cblx0Y29uc3QgY29tcGxleFR5cGUgPSB1bml0ID8gXCJzYXAudWkubW9kZWwub2RhdGEudHlwZS5Vbml0XCIgOiBcInNhcC51aS5tb2RlbC5vZGF0YS50eXBlLkN1cnJlbmN5XCI7XG5cdHVuaXQgPSB1bml0ID8gdW5pdCA6IChvUHJvcGVydHlEZWZpbml0aW9uLmFubm90YXRpb25zPy5NZWFzdXJlcz8uSVNPQ3VycmVuY3kgYXMgYW55KTtcblx0Y29uc3QgdW5pdEJpbmRpbmdFeHByZXNzaW9uID0gKHVuaXQgYXMgYW55KS4kdGFyZ2V0XG5cdFx0PyBmb3JtYXRXaXRoVHlwZUluZm9ybWF0aW9uKFxuXHRcdFx0XHQodW5pdCBhcyBhbnkpLiR0YXJnZXQsXG5cdFx0XHRcdGdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbih1bml0LCByZWxhdGl2ZUxvY2F0aW9uKSBhcyBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248c3RyaW5nPlxuXHRcdCAgKVxuXHRcdDogKGdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbih1bml0LCByZWxhdGl2ZUxvY2F0aW9uKSBhcyBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248c3RyaW5nPik7XG5cblx0bGV0IHByb3BlcnR5QmluZGluZ0V4cHJlc3Npb24gPSBwYXRoSW5Nb2RlbChcblx0XHRnZXRDb250ZXh0UmVsYXRpdmVUYXJnZXRPYmplY3RQYXRoKG9Qcm9wZXJ0eURhdGFNb2RlbFBhdGgpXG5cdCkgYXMgQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPHN0cmluZz47XG5cdHByb3BlcnR5QmluZGluZ0V4cHJlc3Npb24gPSBmb3JtYXRXaXRoVHlwZUluZm9ybWF0aW9uKG9Qcm9wZXJ0eURlZmluaXRpb24sIHByb3BlcnR5QmluZGluZ0V4cHJlc3Npb24sIHRydWUpO1xuXHRyZXR1cm4gYWRkVHlwZUluZm9ybWF0aW9uKFtwcm9wZXJ0eUJpbmRpbmdFeHByZXNzaW9uLCB1bml0QmluZGluZ0V4cHJlc3Npb25dLCBjb21wbGV4VHlwZSwgdW5kZWZpbmVkLCB7XG5cdFx0cGFyc2VLZWVwc0VtcHR5U3RyaW5nOiB0cnVlLFxuXHRcdGVtcHR5U3RyaW5nOiBcIlwiLFxuXHRcdHNob3dOdW1iZXI6IGZhbHNlXG5cdH0pO1xufTtcbmV4cG9ydCBjb25zdCBnZXRCaW5kaW5nV2l0aFRpbWV6b25lID0gZnVuY3Rpb24gKFxuXHRvUHJvcGVydHlEYXRhTW9kZWxQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoLFxuXHRwcm9wZXJ0eUJpbmRpbmdFeHByZXNzaW9uOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248c3RyaW5nPixcblx0aWdub3JlVW5pdENvbnN0cmFpbnQ/OiBib29sZWFuLFxuXHRoaWRlVGltZXpvbmVGb3JFbXB0eVZhbHVlcz86IGJvb2xlYW5cbik6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxzdHJpbmc+IHtcblx0Y29uc3Qgb1Byb3BlcnR5RGVmaW5pdGlvbiA9IG9Qcm9wZXJ0eURhdGFNb2RlbFBhdGgudGFyZ2V0T2JqZWN0IGFzIFByb3BlcnR5O1xuXHRjb25zdCB0aW1lem9uZSA9IG9Qcm9wZXJ0eURlZmluaXRpb24uYW5ub3RhdGlvbnM/LkNvbW1vbj8uVGltZXpvbmU7XG5cdGNvbnN0IHJlbGF0aXZlTG9jYXRpb24gPSBnZXRQYXRoUmVsYXRpdmVMb2NhdGlvbihcblx0XHRvUHJvcGVydHlEYXRhTW9kZWxQYXRoLmNvbnRleHRMb2NhdGlvbixcblx0XHRvUHJvcGVydHlEYXRhTW9kZWxQYXRoLm5hdmlnYXRpb25Qcm9wZXJ0aWVzXG5cdCkubWFwKChucCkgPT4gbnAubmFtZSk7XG5cdHByb3BlcnR5QmluZGluZ0V4cHJlc3Npb24gPSBmb3JtYXRXaXRoVHlwZUluZm9ybWF0aW9uKG9Qcm9wZXJ0eURlZmluaXRpb24sIHByb3BlcnR5QmluZGluZ0V4cHJlc3Npb24pO1xuXG5cdGNvbnN0IGNvbXBsZXhUeXBlID0gXCJzYXAuZmUuY29yZS50eXBlLkRhdGVUaW1lV2l0aFRpbWV6b25lXCI7XG5cdGNvbnN0IHVuaXRCaW5kaW5nRXhwcmVzc2lvbiA9ICh0aW1lem9uZSBhcyBhbnkpLiR0YXJnZXRcblx0XHQ/IGZvcm1hdFdpdGhUeXBlSW5mb3JtYXRpb24oXG5cdFx0XHRcdCh0aW1lem9uZSBhcyBhbnkpLiR0YXJnZXQsXG5cdFx0XHRcdGdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbih0aW1lem9uZSwgcmVsYXRpdmVMb2NhdGlvbikgYXMgQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPHN0cmluZz4sXG5cdFx0XHRcdGlnbm9yZVVuaXRDb25zdHJhaW50XG5cdFx0ICApXG5cdFx0OiAoZ2V0RXhwcmVzc2lvbkZyb21Bbm5vdGF0aW9uKHRpbWV6b25lLCByZWxhdGl2ZUxvY2F0aW9uKSBhcyBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248c3RyaW5nPik7XG5cdGxldCBmb3JtYXRPcHRpb25zO1xuXHRpZiAoaGlkZVRpbWV6b25lRm9yRW1wdHlWYWx1ZXMpIHtcblx0XHRmb3JtYXRPcHRpb25zID0ge1xuXHRcdFx0c2hvd1RpbWV6b25lRm9yRW1wdHlWYWx1ZXM6IGZhbHNlXG5cdFx0fTtcblx0fVxuXHRyZXR1cm4gYWRkVHlwZUluZm9ybWF0aW9uKFtwcm9wZXJ0eUJpbmRpbmdFeHByZXNzaW9uLCB1bml0QmluZGluZ0V4cHJlc3Npb25dLCBjb21wbGV4VHlwZSwgdW5kZWZpbmVkLCBmb3JtYXRPcHRpb25zKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRBbGlnbm1lbnRFeHByZXNzaW9uID0gZnVuY3Rpb24gKFxuXHRvQ29tcHV0ZWRFZGl0TW9kZTogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPHN0cmluZz4sXG5cdHNBbGlnbkRpc3BsYXk6IHN0cmluZyA9IFwiQmVnaW5cIixcblx0c0FsaWduRWRpdDogc3RyaW5nID0gXCJCZWdpblwiXG4pOiBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiB8IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxzdHJpbmc+IHtcblx0cmV0dXJuIGNvbXBpbGVFeHByZXNzaW9uKGlmRWxzZShlcXVhbChvQ29tcHV0ZWRFZGl0TW9kZSwgXCJEaXNwbGF5XCIpLCBzQWxpZ25EaXNwbGF5LCBzQWxpZ25FZGl0KSk7XG59O1xuXG4vKipcbiAqIEZvcm1hdHRlciBoZWxwZXIgdG8gcmV0cmlldmUgdGhlIGNvbnZlcnRlckNvbnRleHQgZnJvbSB0aGUgbWV0YW1vZGVsIGNvbnRleHQuXG4gKlxuICogQHBhcmFtIG9Db250ZXh0IFRoZSBvcmlnaW5hbCBtZXRhbW9kZWwgY29udGV4dFxuICogQHBhcmFtIG9JbnRlcmZhY2UgVGhlIGN1cnJlbnQgdGVtcGxhdGluZyBjb250ZXh0XG4gKiBAcmV0dXJucyBUaGUgQ29udmVydGVyQ29udGV4dCByZXByZXNlbnRpbmcgdGhhdCBvYmplY3RcbiAqL1xuZXhwb3J0IGNvbnN0IGdldENvbnZlcnRlckNvbnRleHQgPSBmdW5jdGlvbiAob0NvbnRleHQ6IE1ldGFNb2RlbENvbnRleHQsIG9JbnRlcmZhY2U6IENvbXB1dGVkQW5ub3RhdGlvbkludGVyZmFjZSk6IG9iamVjdCB8IG51bGwge1xuXHRpZiAob0ludGVyZmFjZSAmJiBvSW50ZXJmYWNlLmNvbnRleHQpIHtcblx0XHRyZXR1cm4gY29udmVydE1ldGFNb2RlbENvbnRleHQob0ludGVyZmFjZS5jb250ZXh0KTtcblx0fVxuXHRyZXR1cm4gbnVsbDtcbn07XG5nZXRDb252ZXJ0ZXJDb250ZXh0LnJlcXVpcmVzSUNvbnRleHQgPSB0cnVlO1xuXG4vKipcbiAqIEZvcm1hdHRlciBoZWxwZXIgdG8gcmV0cmlldmUgdGhlIGRhdGEgbW9kZWwgb2JqZWN0cyB0aGF0IGFyZSBpbnZvbHZlZCBmcm9tIHRoZSBtZXRhbW9kZWwgY29udGV4dC5cbiAqXG4gKiBAcGFyYW0gb0NvbnRleHQgVGhlIG9yaWdpbmFsIE9EYXRhTWV0YU1vZGVsIGNvbnRleHRcbiAqIEBwYXJhbSBvSW50ZXJmYWNlIFRoZSBjdXJyZW50IHRlbXBsYXRpbmcgY29udGV4dFxuICogQHJldHVybnMgQW4gYXJyYXkgb2YgZW50aXR5c2V0cyBhbmQgbmF2cHJvcGVydGllcyB0aGF0IGFyZSBpbnZvbHZlZCB0byBnZXQgdG8gYSBzcGVjaWZpYyBvYmplY3QgaW4gdGhlIG1ldGFtb2RlbFxuICovXG5leHBvcnQgY29uc3QgZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCA9IGZ1bmN0aW9uIChcblx0b0NvbnRleHQ6IE1ldGFNb2RlbENvbnRleHQsXG5cdG9JbnRlcmZhY2U6IENvbXB1dGVkQW5ub3RhdGlvbkludGVyZmFjZVxuKTogRGF0YU1vZGVsT2JqZWN0UGF0aCB8IG51bGwge1xuXHRpZiAob0ludGVyZmFjZSAmJiBvSW50ZXJmYWNlLmNvbnRleHQpIHtcblx0XHRyZXR1cm4gZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzKG9JbnRlcmZhY2UuY29udGV4dCk7XG5cdH1cblx0cmV0dXJuIG51bGw7XG59O1xuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aC5yZXF1aXJlc0lDb250ZXh0ID0gdHJ1ZTtcblxuZXhwb3J0IGNvbnN0IGlzQ29sbGVjdGlvbkZpZWxkID0gZnVuY3Rpb24gKG9EYXRhTW9kZWxQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoKTogYm9vbGVhbiB7XG5cdGlmIChvRGF0YU1vZGVsUGF0aC5uYXZpZ2F0aW9uUHJvcGVydGllcz8ubGVuZ3RoKSB7XG5cdFx0Y29uc3QgaGFzT25lVG9NYW55TmF2aWdhdGlvbiA9XG5cdFx0XHRvRGF0YU1vZGVsUGF0aD8ubmF2aWdhdGlvblByb3BlcnRpZXMuZmluZEluZGV4KChvTmF2OiBOYXZpZ2F0aW9uUHJvcGVydHkpID0+IHtcblx0XHRcdFx0aWYgKG9OYXYuaXNDb2xsZWN0aW9uKSB7XG5cdFx0XHRcdFx0aWYgKG9EYXRhTW9kZWxQYXRoLmNvbnRleHRMb2NhdGlvbj8ubmF2aWdhdGlvblByb3BlcnRpZXM/Lmxlbmd0aCkge1xuXHRcdFx0XHRcdFx0Ly93ZSBjaGVjayB0aGUgb25lIHRvIG1hbnkgbmF2IGlzIG5vdCBhbHJlYWR5IHBhcnQgb2YgdGhlIGNvbnRleHRcblx0XHRcdFx0XHRcdHJldHVybiAoXG5cdFx0XHRcdFx0XHRcdG9EYXRhTW9kZWxQYXRoLmNvbnRleHRMb2NhdGlvbj8ubmF2aWdhdGlvblByb3BlcnRpZXMuZmluZEluZGV4KFxuXHRcdFx0XHRcdFx0XHRcdChvQ29udGV4dE5hdjogTmF2aWdhdGlvblByb3BlcnR5KSA9PiBvQ29udGV4dE5hdi5uYW1lID09PSBvTmF2Lm5hbWVcblx0XHRcdFx0XHRcdFx0KSA9PT0gLTFcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH0pID4gLTE7XG5cdFx0aWYgKGhhc09uZVRvTWFueU5hdmlnYXRpb24pIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gZmFsc2U7XG59O1xuZXhwb3J0IGNvbnN0IGdldFJlcXVpcmVkRXhwcmVzc2lvbkFzT2JqZWN0ID0gZnVuY3Rpb24gKFxuXHRvUHJvcGVydHlQYXRoOiBQcm9wZXJ0eU9yUGF0aDxQcm9wZXJ0eT4sXG5cdG9EYXRhRmllbGRDb252ZXJ0ZWQ/OiBhbnksXG5cdGZvcmNlRWRpdE1vZGU6IGJvb2xlYW4gPSBmYWxzZVxuKTogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0cmV0dXJuIGdldFJlcXVpcmVkRXhwcmVzc2lvbihvUHJvcGVydHlQYXRoLCBvRGF0YUZpZWxkQ29udmVydGVkLCBmb3JjZUVkaXRNb2RlLCB0cnVlKSBhcyBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj47XG59O1xuZXhwb3J0IGNvbnN0IGdldFJlcXVpcmVkRXhwcmVzc2lvbiA9IGZ1bmN0aW9uIChcblx0b1Byb3BlcnR5UGF0aDogUHJvcGVydHlPclBhdGg8UHJvcGVydHk+LFxuXHRvRGF0YUZpZWxkQ29udmVydGVkPzogYW55LFxuXHRmb3JjZUVkaXRNb2RlOiBib29sZWFuID0gZmFsc2UsXG5cdGJBc09iamVjdDogYm9vbGVhbiA9IGZhbHNlLFxuXHRvUmVxdWlyZWRQcm9wZXJ0aWVzOiBhbnkgPSB7fVxuKTogQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24gfCBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj4ge1xuXHRsZXQgcmV0dXJuRXhwcmVzc2lvbjogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+O1xuXHRjb25zdCBhUmVxdWlyZWRQcm9wZXJ0aWVzRnJvbUluc2VydFJlc3RyaWN0aW9ucyA9IG9SZXF1aXJlZFByb3BlcnRpZXMucmVxdWlyZWRQcm9wZXJ0aWVzRnJvbUluc2VydFJlc3RyaWN0aW9ucyB8fCBbXTtcblx0Y29uc3QgYVJlcXVpcmVkUHJvcGVydGllc0Zyb21VcGRhdGVSZXN0cmljdGlvbnMgPSBvUmVxdWlyZWRQcm9wZXJ0aWVzLnJlcXVpcmVkUHJvcGVydGllc0Zyb21VcGRhdGVSZXN0cmljdGlvbnMgfHwgW107XG5cdGlmICghb1Byb3BlcnR5UGF0aCB8fCB0eXBlb2Ygb1Byb3BlcnR5UGF0aCA9PT0gXCJzdHJpbmdcIikge1xuXHRcdHJldHVybkV4cHJlc3Npb24gPSBjb25zdGFudChmYWxzZSk7XG5cdH0gZWxzZSB7XG5cdFx0bGV0IGRhdGFGaWVsZFJlcXVpcmVkRXhwcmVzc2lvbjogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+ID0gY29uc3RhbnQodHJ1ZSk7XG5cdFx0aWYgKG9EYXRhRmllbGRDb252ZXJ0ZWQgIT09IG51bGwpIHtcblx0XHRcdGRhdGFGaWVsZFJlcXVpcmVkRXhwcmVzc2lvbiA9IGlzUmVxdWlyZWRFeHByZXNzaW9uKG9EYXRhRmllbGRDb252ZXJ0ZWQpO1xuXHRcdH1cblx0XHRsZXQgcmVxdWlyZWRQcm9wZXJ0eUZyb21JbnNlcnRSZXN0cmljdGlvbnNFeHByZXNzaW9uOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj4gPSBjb25zdGFudChmYWxzZSk7XG5cdFx0bGV0IHJlcXVpcmVkUHJvcGVydHlGcm9tVXBkYXRlUmVzdHJpY3Rpb25zRXhwcmVzc2lvbjogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+ID0gY29uc3RhbnQoZmFsc2UpO1xuXG5cdFx0Y29uc3Qgb1Byb3BlcnR5OiBQcm9wZXJ0eSA9IChpc1BhdGhFeHByZXNzaW9uKG9Qcm9wZXJ0eVBhdGgpICYmIG9Qcm9wZXJ0eVBhdGguJHRhcmdldCkgfHwgKG9Qcm9wZXJ0eVBhdGggYXMgUHJvcGVydHkpO1xuXHRcdC8vIEVuYWJsZW1lbnQgZGVwZW5kcyBvbiB0aGUgZmllbGQgY29udHJvbCBleHByZXNzaW9uXG5cdFx0Ly8gSWYgdGhlIEZpZWxkIGNvbnRyb2wgaXMgc3RhdGljYWxseSBpbiBJbmFwcGxpY2FibGUgKGRpc2FibGVkKSAtPiBub3QgZW5hYmxlZFxuXHRcdGNvbnN0IHJlcXVpcmVkRXhwcmVzc2lvbiA9IGlzUmVxdWlyZWRFeHByZXNzaW9uKG9Qcm9wZXJ0eSk7XG5cdFx0Y29uc3QgZWRpdE1vZGUgPSBmb3JjZUVkaXRNb2RlIHx8IFVJLklzRWRpdGFibGU7XG5cdFx0aWYgKFxuXHRcdFx0YVJlcXVpcmVkUHJvcGVydGllc0Zyb21JbnNlcnRSZXN0cmljdGlvbnMubGVuZ3RoICYmXG5cdFx0XHRhUmVxdWlyZWRQcm9wZXJ0aWVzRnJvbUluc2VydFJlc3RyaWN0aW9ucy5pbmNsdWRlcygob1Byb3BlcnR5UGF0aCBhcyBhbnkpLm5hbWUpXG5cdFx0KSB7XG5cdFx0XHRyZXF1aXJlZFByb3BlcnR5RnJvbUluc2VydFJlc3RyaWN0aW9uc0V4cHJlc3Npb24gPSBhbmQoY29uc3RhbnQodHJ1ZSksIFVJLklzQ3JlYXRlTW9kZSk7XG5cdFx0fVxuXHRcdGlmIChcblx0XHRcdGFSZXF1aXJlZFByb3BlcnRpZXNGcm9tVXBkYXRlUmVzdHJpY3Rpb25zLmxlbmd0aCAmJlxuXHRcdFx0YVJlcXVpcmVkUHJvcGVydGllc0Zyb21VcGRhdGVSZXN0cmljdGlvbnMuaW5jbHVkZXMoKG9Qcm9wZXJ0eVBhdGggYXMgYW55KS5uYW1lKVxuXHRcdCkge1xuXHRcdFx0cmVxdWlyZWRQcm9wZXJ0eUZyb21VcGRhdGVSZXN0cmljdGlvbnNFeHByZXNzaW9uID0gYW5kKGNvbnN0YW50KHRydWUpLCBub3RFcXVhbChVSS5Jc0NyZWF0ZU1vZGUsIHRydWUpKTtcblx0XHR9XG5cdFx0cmV0dXJuRXhwcmVzc2lvbiA9IG9yKFxuXHRcdFx0YW5kKG9yKHJlcXVpcmVkRXhwcmVzc2lvbiwgZGF0YUZpZWxkUmVxdWlyZWRFeHByZXNzaW9uKSwgZWRpdE1vZGUpLFxuXHRcdFx0cmVxdWlyZWRQcm9wZXJ0eUZyb21JbnNlcnRSZXN0cmljdGlvbnNFeHByZXNzaW9uLFxuXHRcdFx0cmVxdWlyZWRQcm9wZXJ0eUZyb21VcGRhdGVSZXN0cmljdGlvbnNFeHByZXNzaW9uXG5cdFx0KTtcblx0fVxuXG5cdGlmIChiQXNPYmplY3QpIHtcblx0XHRyZXR1cm4gcmV0dXJuRXhwcmVzc2lvbjtcblx0fVxuXHRyZXR1cm4gY29tcGlsZUV4cHJlc3Npb24ocmV0dXJuRXhwcmVzc2lvbik7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0UmVxdWlyZWRFeHByZXNzaW9uRm9yQ29ubmVjdGVkRGF0YUZpZWxkID0gZnVuY3Rpb24gKFxuXHRkYXRhRmllbGRPYmplY3RQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoXG4pOiBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiB7XG5cdGNvbnN0IGRhdGEgPSBkYXRhRmllbGRPYmplY3RQYXRoPy50YXJnZXRPYmplY3Q/LiR0YXJnZXQ/LkRhdGE7XG5cdGNvbnN0IGtleXM6IEFycmF5PHN0cmluZz4gPSBPYmplY3Qua2V5cyhkYXRhKTtcblx0Y29uc3QgZGF0YUZpZWxkcyA9IFtdO1xuXHRsZXQgcHJvcGVydHlQYXRoO1xuXHRjb25zdCBpc1JlcXVpcmVkRXhwcmVzc2lvbnM6IChDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiB8IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPilbXSB8IHVuZGVmaW5lZCA9IFtdO1xuXHRmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG5cdFx0aWYgKGRhdGFba2V5XVtcIiRUeXBlXCJdICYmIGRhdGFba2V5XVtcIiRUeXBlXCJdLmluZGV4T2YoXCJEYXRhRmllbGRcIikgPiAtMSkge1xuXHRcdFx0ZGF0YUZpZWxkcy5wdXNoKGRhdGFba2V5XSk7XG5cdFx0fVxuXHR9XG5cdGZvciAoY29uc3QgZGF0YUZpZWxkIG9mIGRhdGFGaWVsZHMpIHtcblx0XHRzd2l0Y2ggKGRhdGFGaWVsZC4kVHlwZSkge1xuXHRcdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGQ6XG5cdFx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhOYXZpZ2F0aW9uUGF0aDpcblx0XHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aFVybDpcblx0XHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aEludGVudEJhc2VkTmF2aWdhdGlvbjpcblx0XHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aEFjdGlvbjpcblx0XHRcdFx0aWYgKHR5cGVvZiBkYXRhRmllbGQuVmFsdWUgPT09IFwib2JqZWN0XCIpIHtcblx0XHRcdFx0XHRwcm9wZXJ0eVBhdGggPSBkYXRhRmllbGQuVmFsdWUuJHRhcmdldDtcblx0XHRcdFx0fVxuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQW5ub3RhdGlvbjpcblx0XHRcdFx0aWYgKGRhdGFGaWVsZC5UYXJnZXQuJHRhcmdldCkge1xuXHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdGRhdGFGaWVsZC5UYXJnZXQuJHRhcmdldC4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkIHx8XG5cdFx0XHRcdFx0XHRkYXRhRmllbGQuVGFyZ2V0LiR0YXJnZXQuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFQb2ludFR5cGVcblx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdGlmICh0eXBlb2YgZGF0YUZpZWxkLlRhcmdldC4kdGFyZ2V0LlZhbHVlID09PSBcIm9iamVjdFwiKSB7XG5cdFx0XHRcdFx0XHRcdHByb3BlcnR5UGF0aCA9IGRhdGFGaWVsZC5UYXJnZXQuJHRhcmdldC5WYWx1ZS4kdGFyZ2V0O1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRpZiAodHlwZW9mIGRhdGFGaWVsZC5UYXJnZXQgPT09IFwib2JqZWN0XCIpIHtcblx0XHRcdFx0XHRcdFx0cHJvcGVydHlQYXRoID0gZGF0YUZpZWxkLlRhcmdldC4kdGFyZ2V0O1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Ly8gbm8gZGVmYXVsdFxuXHRcdH1cblx0XHRpc1JlcXVpcmVkRXhwcmVzc2lvbnMucHVzaChnZXRSZXF1aXJlZEV4cHJlc3Npb25Bc09iamVjdChwcm9wZXJ0eVBhdGgsIGRhdGFGaWVsZCwgZmFsc2UpKTtcblx0fVxuXHRyZXR1cm4gY29tcGlsZUV4cHJlc3Npb24ob3IoLi4uKGlzUmVxdWlyZWRFeHByZXNzaW9ucyBhcyBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj5bXSkpKTtcbn07XG4iXX0=