@sapui5/sap.fe.core 1.102.0 → 1.103.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (311) hide show
  1. package/package.json +5 -5
  2. package/src/sap/fe/core/.library +1 -1
  3. package/src/sap/fe/core/AppComponent.js +62 -26
  4. package/src/sap/fe/core/AppComponent.ts +56 -40
  5. package/src/sap/fe/core/AppStateHandler.js +10 -10
  6. package/src/sap/fe/core/AppStateHandler.ts +9 -9
  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 +236 -109
  10. package/src/sap/fe/core/CommonUtils.ts +252 -136
  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/BuildingBlockRuntime.js +8 -8
  22. package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.ts +11 -10
  23. package/src/sap/fe/core/buildingBlocks/TraceInfo.js +27 -27
  24. package/src/sap/fe/core/buildingBlocks/TraceInfo.ts +28 -26
  25. package/src/sap/fe/core/controllerextensions/EditFlow.js +129 -118
  26. package/src/sap/fe/core/controllerextensions/EditFlow.ts +154 -141
  27. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +9 -9
  28. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +10 -10
  29. package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +31 -26
  30. package/src/sap/fe/core/controllerextensions/InternalEditFlow.ts +34 -35
  31. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +70 -70
  32. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +77 -77
  33. package/src/sap/fe/core/controllerextensions/InternalRouting.js +84 -78
  34. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +105 -101
  35. package/src/sap/fe/core/controllerextensions/KPIManagement.js +66 -68
  36. package/src/sap/fe/core/controllerextensions/KPIManagement.ts +106 -123
  37. package/src/sap/fe/core/controllerextensions/MassEdit.js +8 -8
  38. package/src/sap/fe/core/controllerextensions/MassEdit.ts +19 -26
  39. package/src/sap/fe/core/controllerextensions/MessageHandler.js +20 -12
  40. package/src/sap/fe/core/controllerextensions/MessageHandler.ts +29 -14
  41. package/src/sap/fe/core/controllerextensions/PageReady.js +97 -25
  42. package/src/sap/fe/core/controllerextensions/PageReady.ts +94 -34
  43. package/src/sap/fe/core/controllerextensions/Paginator.js +21 -22
  44. package/src/sap/fe/core/controllerextensions/Paginator.ts +24 -25
  45. package/src/sap/fe/core/controllerextensions/Placeholder.js +4 -6
  46. package/src/sap/fe/core/controllerextensions/Placeholder.ts +12 -14
  47. package/src/sap/fe/core/controllerextensions/Routing.js +10 -11
  48. package/src/sap/fe/core/controllerextensions/Routing.ts +12 -13
  49. package/src/sap/fe/core/controllerextensions/Share.js +22 -22
  50. package/src/sap/fe/core/controllerextensions/Share.ts +30 -29
  51. package/src/sap/fe/core/controllerextensions/SideEffects.js +46 -50
  52. package/src/sap/fe/core/controllerextensions/SideEffects.ts +56 -60
  53. package/src/sap/fe/core/controllerextensions/ViewState.js +65 -62
  54. package/src/sap/fe/core/controllerextensions/ViewState.ts +68 -63
  55. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js +5 -5
  56. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.ts +8 -7
  57. package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.js +6 -6
  58. package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.ts +12 -17
  59. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +2 -2
  60. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.ts +4 -4
  61. package/src/sap/fe/core/controllerextensions/collaboration/Manage.js +7 -9
  62. package/src/sap/fe/core/controllerextensions/collaboration/Manage.ts +18 -19
  63. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +184 -137
  64. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +253 -206
  65. package/src/sap/fe/core/controllerextensions/editFlow/draft.js +113 -121
  66. package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +148 -158
  67. package/src/sap/fe/core/controllerextensions/editFlow/operations.js +198 -148
  68. package/src/sap/fe/core/controllerextensions/editFlow/operations.ts +223 -159
  69. package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +24 -26
  70. package/src/sap/fe/core/controllerextensions/editFlow/sticky.ts +35 -33
  71. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +78 -44
  72. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +90 -60
  73. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +52 -55
  74. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.ts +55 -58
  75. package/src/sap/fe/core/controls/Any.js +9 -5
  76. package/src/sap/fe/core/controls/Any.ts +10 -4
  77. package/src/sap/fe/core/controls/CommandExecution.js +11 -25
  78. package/src/sap/fe/core/controls/CommandExecution.ts +11 -25
  79. package/src/sap/fe/core/controls/ConditionalWrapper.js +2 -2
  80. package/src/sap/fe/core/controls/ConditionalWrapper.ts +3 -3
  81. package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.js +22 -22
  82. package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.ts +25 -24
  83. package/src/sap/fe/core/controls/CustomQuickViewPage.js +2 -2
  84. package/src/sap/fe/core/controls/CustomQuickViewPage.ts +2 -2
  85. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +3 -3
  86. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.ts +5 -5
  87. package/src/sap/fe/core/controls/FieldWrapper.js +2 -2
  88. package/src/sap/fe/core/controls/FieldWrapper.ts +3 -3
  89. package/src/sap/fe/core/controls/FileWrapper.js +2 -2
  90. package/src/sap/fe/core/controls/FileWrapper.ts +11 -11
  91. package/src/sap/fe/core/controls/FilterBar.js +6 -2
  92. package/src/sap/fe/core/controls/FilterBar.ts +13 -9
  93. package/src/sap/fe/core/controls/FormElementWrapper.js +1 -1
  94. package/src/sap/fe/core/controls/FormElementWrapper.ts +2 -2
  95. package/src/sap/fe/core/controls/MassEditSelect.js +1 -1
  96. package/src/sap/fe/core/controls/MassEditSelect.ts +0 -4
  97. package/src/sap/fe/core/controls/NonComputedVisibleKeyFieldsDialog.fragment.xml +3 -3
  98. package/src/sap/fe/core/controls/filterbar/VisualFilter.js +16 -12
  99. package/src/sap/fe/core/controls/filterbar/VisualFilter.ts +20 -22
  100. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +3 -3
  101. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.ts +8 -8
  102. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +47 -47
  103. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +52 -52
  104. package/src/sap/fe/core/controls/massEdit/MassEditDialog.fragment.xml +8 -2
  105. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +89 -88
  106. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.ts +107 -106
  107. package/src/sap/fe/core/converters/ConverterContext.js +26 -33
  108. package/src/sap/fe/core/converters/ConverterContext.ts +51 -60
  109. package/src/sap/fe/core/converters/ManifestSettings.js +1 -1
  110. package/src/sap/fe/core/converters/ManifestSettings.ts +14 -14
  111. package/src/sap/fe/core/converters/ManifestWrapper.js +59 -45
  112. package/src/sap/fe/core/converters/ManifestWrapper.ts +55 -45
  113. package/src/sap/fe/core/converters/MetaModelConverter.js +50 -32
  114. package/src/sap/fe/core/converters/MetaModelConverter.ts +145 -127
  115. package/src/sap/fe/core/converters/TemplateConverter.js +21 -20
  116. package/src/sap/fe/core/converters/TemplateConverter.ts +27 -24
  117. package/src/sap/fe/core/converters/annotations/DataField.js +54 -34
  118. package/src/sap/fe/core/converters/annotations/DataField.ts +97 -75
  119. package/src/sap/fe/core/converters/common/AnnotationConverter.js +1911 -1495
  120. package/src/sap/fe/core/converters/controls/Common/Action.js +50 -41
  121. package/src/sap/fe/core/converters/controls/Common/Action.ts +56 -46
  122. package/src/sap/fe/core/converters/controls/Common/Chart.js +14 -14
  123. package/src/sap/fe/core/converters/controls/Common/Chart.ts +23 -26
  124. package/src/sap/fe/core/converters/controls/Common/Criticality.js +3 -3
  125. package/src/sap/fe/core/converters/controls/Common/Criticality.ts +4 -4
  126. package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +28 -28
  127. package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +40 -36
  128. package/src/sap/fe/core/converters/controls/Common/Form.js +25 -27
  129. package/src/sap/fe/core/converters/controls/Common/Form.ts +37 -45
  130. package/src/sap/fe/core/converters/controls/Common/KPI.js +11 -11
  131. package/src/sap/fe/core/converters/controls/Common/KPI.ts +35 -39
  132. package/src/sap/fe/core/converters/controls/Common/Table.js +174 -183
  133. package/src/sap/fe/core/converters/controls/Common/Table.ts +237 -250
  134. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +119 -119
  135. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +144 -141
  136. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +45 -41
  137. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +64 -57
  138. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +28 -26
  139. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +46 -43
  140. package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.js +9 -9
  141. package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.ts +14 -13
  142. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +67 -64
  143. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.ts +69 -66
  144. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +73 -72
  145. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +98 -96
  146. package/src/sap/fe/core/converters/helpers/Aggregation.js +2 -4
  147. package/src/sap/fe/core/converters/helpers/Aggregation.ts +10 -13
  148. package/src/sap/fe/core/converters/helpers/BindingHelper.js +31 -31
  149. package/src/sap/fe/core/converters/helpers/BindingHelper.ts +30 -29
  150. package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +4 -4
  151. package/src/sap/fe/core/converters/helpers/ConfigurableObject.ts +9 -9
  152. package/src/sap/fe/core/converters/helpers/ID.js +46 -46
  153. package/src/sap/fe/core/converters/helpers/ID.ts +25 -25
  154. package/src/sap/fe/core/converters/helpers/Key.js +7 -7
  155. package/src/sap/fe/core/converters/helpers/Key.ts +7 -7
  156. package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.js +1 -1
  157. package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.ts +4 -4
  158. package/src/sap/fe/core/converters/objectPage/FormMenuActions.js +6 -6
  159. package/src/sap/fe/core/converters/objectPage/FormMenuActions.ts +10 -10
  160. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +46 -62
  161. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +54 -82
  162. package/src/sap/fe/core/converters/templates/ListReportConverter.js +30 -29
  163. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +40 -40
  164. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +39 -38
  165. package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +52 -61
  166. package/src/sap/fe/core/designtime/AppComponent.designtime.js +4 -4
  167. package/src/sap/fe/core/designtime/AppComponent.designtime.ts +4 -4
  168. package/src/sap/fe/core/formatters/CollaborationFormatter.js +2 -2
  169. package/src/sap/fe/core/formatters/CollaborationFormatter.ts +3 -3
  170. package/src/sap/fe/core/formatters/FPMFormatter.js +5 -5
  171. package/src/sap/fe/core/formatters/FPMFormatter.ts +10 -10
  172. package/src/sap/fe/core/formatters/KPIFormatter.js +7 -7
  173. package/src/sap/fe/core/formatters/KPIFormatter.ts +10 -10
  174. package/src/sap/fe/core/formatters/StandardFormatter.js +89 -0
  175. package/src/sap/fe/core/formatters/StandardFormatter.ts +64 -0
  176. package/src/sap/fe/core/formatters/TableFormatter.js +11 -11
  177. package/src/sap/fe/core/formatters/TableFormatter.ts +12 -12
  178. package/src/sap/fe/core/formatters/ValueFormatter.js +8 -8
  179. package/src/sap/fe/core/formatters/ValueFormatter.ts +9 -9
  180. package/src/sap/fe/core/helpers/AppStartupHelper.js +15 -15
  181. package/src/sap/fe/core/helpers/AppStartupHelper.ts +37 -40
  182. package/src/sap/fe/core/helpers/BindingToolkit.js +1809 -0
  183. package/src/sap/fe/core/helpers/{BindingExpression.ts → BindingToolkit.ts} +365 -264
  184. package/src/sap/fe/core/helpers/ClassSupport.js +20 -11
  185. package/src/sap/fe/core/helpers/ClassSupport.ts +14 -10
  186. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +2 -2
  187. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.ts +1 -1
  188. package/src/sap/fe/core/helpers/EditState.js +1 -6
  189. package/src/sap/fe/core/helpers/EditState.ts +5 -10
  190. package/src/sap/fe/core/helpers/ExcelFormatHelper.js +2 -2
  191. package/src/sap/fe/core/helpers/ExcelFormatHelper.ts +4 -4
  192. package/src/sap/fe/core/helpers/FPMHelper.js +1 -1
  193. package/src/sap/fe/core/helpers/FPMHelper.ts +2 -2
  194. package/src/sap/fe/core/helpers/KeepAliveHelper.js +31 -31
  195. package/src/sap/fe/core/helpers/KeepAliveHelper.ts +52 -56
  196. package/src/sap/fe/core/helpers/MassEditHelper.js +281 -254
  197. package/src/sap/fe/core/helpers/MassEditHelper.ts +337 -289
  198. package/src/sap/fe/core/helpers/ModelHelper.js +25 -25
  199. package/src/sap/fe/core/helpers/ModelHelper.ts +34 -32
  200. package/src/sap/fe/core/helpers/PasteHelper.js +3 -10
  201. package/src/sap/fe/core/helpers/PasteHelper.ts +20 -25
  202. package/src/sap/fe/core/helpers/SemanticDateOperators.js +1 -1
  203. package/src/sap/fe/core/helpers/SemanticDateOperators.ts +11 -11
  204. package/src/sap/fe/core/helpers/SemanticKeyHelper.js +3 -3
  205. package/src/sap/fe/core/helpers/SemanticKeyHelper.ts +8 -8
  206. package/src/sap/fe/core/helpers/StableIdHelper.js +12 -12
  207. package/src/sap/fe/core/helpers/StableIdHelper.ts +12 -12
  208. package/src/sap/fe/core/jsx-runtime/jsx.js +1 -1
  209. package/src/sap/fe/core/jsx-runtime/jsx.ts +8 -8
  210. package/src/sap/fe/core/library.js +42 -3
  211. package/src/sap/fe/core/library.ts +38 -0
  212. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +3 -3
  213. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +2 -2
  214. package/src/sap/fe/core/messagebundle.properties +49 -35
  215. package/src/sap/fe/core/messagebundle_ar.properties +13 -5
  216. package/src/sap/fe/core/messagebundle_bg.properties +13 -5
  217. package/src/sap/fe/core/messagebundle_ca.properties +13 -5
  218. package/src/sap/fe/core/messagebundle_cs.properties +13 -5
  219. package/src/sap/fe/core/messagebundle_cy.properties +14 -6
  220. package/src/sap/fe/core/messagebundle_da.properties +13 -5
  221. package/src/sap/fe/core/messagebundle_de.properties +15 -7
  222. package/src/sap/fe/core/messagebundle_el.properties +14 -6
  223. package/src/sap/fe/core/messagebundle_en.properties +9 -1
  224. package/src/sap/fe/core/messagebundle_en_GB.properties +11 -3
  225. package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +7 -1
  226. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +9 -1
  227. package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +44 -85
  228. package/src/sap/fe/core/messagebundle_es.properties +13 -5
  229. package/src/sap/fe/core/messagebundle_es_MX.properties +13 -5
  230. package/src/sap/fe/core/messagebundle_et.properties +13 -5
  231. package/src/sap/fe/core/messagebundle_fi.properties +14 -6
  232. package/src/sap/fe/core/messagebundle_fr.properties +14 -6
  233. package/src/sap/fe/core/messagebundle_fr_CA.properties +14 -6
  234. package/src/sap/fe/core/messagebundle_hi.properties +14 -6
  235. package/src/sap/fe/core/messagebundle_hr.properties +14 -6
  236. package/src/sap/fe/core/messagebundle_hu.properties +13 -5
  237. package/src/sap/fe/core/messagebundle_id.properties +13 -5
  238. package/src/sap/fe/core/messagebundle_it.properties +33 -25
  239. package/src/sap/fe/core/messagebundle_iw.properties +13 -5
  240. package/src/sap/fe/core/messagebundle_ja.properties +14 -6
  241. package/src/sap/fe/core/messagebundle_kk.properties +13 -5
  242. package/src/sap/fe/core/messagebundle_ko.properties +13 -5
  243. package/src/sap/fe/core/messagebundle_lt.properties +13 -5
  244. package/src/sap/fe/core/messagebundle_lv.properties +14 -6
  245. package/src/sap/fe/core/messagebundle_ms.properties +13 -5
  246. package/src/sap/fe/core/messagebundle_nl.properties +13 -5
  247. package/src/sap/fe/core/messagebundle_no.properties +13 -5
  248. package/src/sap/fe/core/messagebundle_pl.properties +13 -5
  249. package/src/sap/fe/core/messagebundle_pt.properties +13 -5
  250. package/src/sap/fe/core/messagebundle_pt_PT.properties +14 -6
  251. package/src/sap/fe/core/messagebundle_ro.properties +13 -5
  252. package/src/sap/fe/core/messagebundle_ru.properties +13 -5
  253. package/src/sap/fe/core/messagebundle_sh.properties +13 -5
  254. package/src/sap/fe/core/messagebundle_sk.properties +13 -5
  255. package/src/sap/fe/core/messagebundle_sl.properties +17 -9
  256. package/src/sap/fe/core/messagebundle_sv.properties +14 -6
  257. package/src/sap/fe/core/messagebundle_th.properties +13 -5
  258. package/src/sap/fe/core/messagebundle_tr.properties +13 -5
  259. package/src/sap/fe/core/messagebundle_uk.properties +13 -5
  260. package/src/sap/fe/core/messagebundle_vi.properties +13 -5
  261. package/src/sap/fe/core/messagebundle_zh_CN.properties +14 -6
  262. package/src/sap/fe/core/messagebundle_zh_TW.properties +13 -5
  263. package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +2 -2
  264. package/src/sap/fe/core/services/AsyncComponentServiceFactory.ts +5 -5
  265. package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +2 -2
  266. package/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +14 -14
  267. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +1 -1
  268. package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +3 -2
  269. package/src/sap/fe/core/services/NavigationServiceFactory.js +53 -44
  270. package/src/sap/fe/core/services/NavigationServiceFactory.ts +54 -46
  271. package/src/sap/fe/core/services/ResourceModelServiceFactory.js +2 -2
  272. package/src/sap/fe/core/services/ResourceModelServiceFactory.ts +4 -4
  273. package/src/sap/fe/core/services/RoutingServiceFactory.js +55 -55
  274. package/src/sap/fe/core/services/RoutingServiceFactory.ts +67 -65
  275. package/src/sap/fe/core/services/ShellServicesFactory.js +72 -76
  276. package/src/sap/fe/core/services/ShellServicesFactory.ts +76 -82
  277. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +61 -61
  278. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +102 -92
  279. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +20 -15
  280. package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +26 -21
  281. package/src/sap/fe/core/support/CommonHelper.js +3 -2
  282. package/src/sap/fe/core/support/CommonHelper.ts +9 -13
  283. package/src/sap/fe/core/support/Diagnostics.js +1 -1
  284. package/src/sap/fe/core/support/Diagnostics.ts +5 -5
  285. package/src/sap/fe/core/templating/CommonFormatters.js +84 -0
  286. package/src/sap/fe/core/templating/CommonFormatters.ts +86 -0
  287. package/src/sap/fe/core/templating/CriticalityFormatters.js +31 -31
  288. package/src/sap/fe/core/templating/CriticalityFormatters.ts +42 -40
  289. package/src/sap/fe/core/templating/DataFieldFormatters.js +8 -8
  290. package/src/sap/fe/core/templating/DataFieldFormatters.ts +13 -10
  291. package/src/sap/fe/core/templating/DataModelPathHelper.js +16 -15
  292. package/src/sap/fe/core/templating/DataModelPathHelper.ts +42 -32
  293. package/src/sap/fe/core/templating/DisplayModeFormatter.js +1 -1
  294. package/src/sap/fe/core/templating/DisplayModeFormatter.ts +2 -3
  295. package/src/sap/fe/core/templating/EntitySetHelper.js +7 -7
  296. package/src/sap/fe/core/templating/EntitySetHelper.ts +6 -8
  297. package/src/sap/fe/core/templating/FieldControlHelper.js +35 -34
  298. package/src/sap/fe/core/templating/FieldControlHelper.ts +29 -46
  299. package/src/sap/fe/core/templating/FilterHelper.js +10 -9
  300. package/src/sap/fe/core/templating/FilterHelper.ts +13 -13
  301. package/src/sap/fe/core/templating/FilterTemplating.js +1 -1
  302. package/src/sap/fe/core/templating/FilterTemplating.ts +3 -3
  303. package/src/sap/fe/core/templating/PropertyFormatters.js +7 -7
  304. package/src/sap/fe/core/templating/PropertyFormatters.ts +21 -19
  305. package/src/sap/fe/core/templating/PropertyHelper.js +25 -25
  306. package/src/sap/fe/core/templating/PropertyHelper.ts +25 -26
  307. package/src/sap/fe/core/templating/UIFormatters.js +148 -93
  308. package/src/sap/fe/core/templating/UIFormatters.ts +196 -124
  309. package/src/sap/fe/core/type/Email.js +2 -2
  310. package/src/sap/fe/core/type/Email.ts +2 -2
  311. package/src/sap/fe/core/helpers/BindingExpression.js +0 -1732
@@ -2,14 +2,14 @@
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/controls/Common/Table", "sap/fe/core/converters/controls/ListReport/VisualFilters", "sap/fe/core/converters/helpers/ConfigurableObject", "sap/fe/core/converters/helpers/IssueManager", "sap/fe/core/converters/helpers/Key", "sap/fe/core/helpers/BindingExpression", "../../ManifestSettings", "../Common/DataVisualization"], function (Table, VisualFilters, ConfigurableObject, IssueManager, Key, BindingExpression, ManifestSettings, DataVisualization) {
5
+ sap.ui.define(["sap/fe/core/converters/controls/Common/Table", "sap/fe/core/converters/controls/ListReport/VisualFilters", "sap/fe/core/converters/helpers/ConfigurableObject", "sap/fe/core/converters/helpers/IssueManager", "sap/fe/core/converters/helpers/Key", "sap/fe/core/helpers/BindingToolkit", "../../ManifestSettings", "../Common/DataVisualization"], function (Table, VisualFilters, ConfigurableObject, IssueManager, Key, BindingToolkit, ManifestSettings, DataVisualization) {
6
6
  "use strict";
7
7
 
8
8
  var _exports = {};
9
9
  var getSelectionVariant = DataVisualization.getSelectionVariant;
10
10
  var AvailabilityType = ManifestSettings.AvailabilityType;
11
- var compileBinding = BindingExpression.compileBinding;
12
- var annotationExpression = BindingExpression.annotationExpression;
11
+ var getExpressionFromAnnotation = BindingToolkit.getExpressionFromAnnotation;
12
+ var compileExpression = BindingToolkit.compileExpression;
13
13
  var KeyHelper = Key.KeyHelper;
14
14
  var IssueType = IssueManager.IssueType;
15
15
  var IssueSeverity = IssueManager.IssueSeverity;
@@ -40,8 +40,8 @@ sap.ui.define(["sap/fe/core/converters/controls/Common/Table", "sap/fe/core/conv
40
40
  /**
41
41
  * Enter all DataFields of a given FieldGroup into the filterFacetMap.
42
42
  *
43
- * @param {AnnotationTerm<FieldGroupType>} fieldGroup
44
- * @returns {Record<string, FilterGroup>} The map of facets for the given FieldGroup
43
+ * @param fieldGroup
44
+ * @returns The map of facets for the given FieldGroup
45
45
  */
46
46
  function getFieldGroupFilterGroups(fieldGroup) {
47
47
  var filterFacetMap = {};
@@ -51,7 +51,7 @@ sap.ui.define(["sap/fe/core/converters/controls/Common/Table", "sap/fe/core/conv
51
51
 
52
52
  filterFacetMap[dataField.Value.path] = {
53
53
  group: fieldGroup.fullyQualifiedName,
54
- groupLabel: compileBinding(annotationExpression(fieldGroup.Label || ((_fieldGroup$annotatio = fieldGroup.annotations) === null || _fieldGroup$annotatio === void 0 ? void 0 : (_fieldGroup$annotatio2 = _fieldGroup$annotatio.Common) === null || _fieldGroup$annotatio2 === void 0 ? void 0 : _fieldGroup$annotatio2.Label) || fieldGroup.qualifier)) || fieldGroup.qualifier
54
+ groupLabel: compileExpression(getExpressionFromAnnotation(fieldGroup.Label || ((_fieldGroup$annotatio = fieldGroup.annotations) === null || _fieldGroup$annotatio === void 0 ? void 0 : (_fieldGroup$annotatio2 = _fieldGroup$annotatio.Common) === null || _fieldGroup$annotatio2 === void 0 ? void 0 : _fieldGroup$annotatio2.Label) || fieldGroup.qualifier)) || fieldGroup.qualifier
55
55
  };
56
56
  }
57
57
  });
@@ -68,9 +68,10 @@ sap.ui.define(["sap/fe/core/converters/controls/Common/Table", "sap/fe/core/conv
68
68
  }
69
69
  /**
70
70
  * Check that all the tables for a dedicated entity set are configured as analytical table.
71
- * @param {TableVisualization[]} listReportTables List report tables
72
- * @param {string} contextPath
73
- * @returns {boolean} Is FilterBar search field hidden or not
71
+ *
72
+ * @param listReportTables List report tables
73
+ * @param contextPath
74
+ * @returns Is FilterBar search field hidden or not
74
75
  */
75
76
 
76
77
 
@@ -117,7 +118,7 @@ sap.ui.define(["sap/fe/core/converters/controls/Common/Table", "sap/fe/core/conv
117
118
  *
118
119
  * @param entityType The root EntityType
119
120
  * @param propertyPath The full path to the target property
120
- * @returns {string} The formatted condition path
121
+ * @returns The formatted condition path
121
122
  */
122
123
 
123
124
 
@@ -128,14 +129,14 @@ sap.ui.define(["sap/fe/core/converters/controls/Common/Table", "sap/fe/core/conv
128
129
 
129
130
  while (parts.length) {
130
131
  var part = parts.shift();
131
- partialPath = partialPath ? partialPath + "/" + part : part;
132
+ partialPath = partialPath ? "".concat(partialPath, "/").concat(part) : part;
132
133
  var property = entityType.resolvePath(partialPath);
133
134
 
134
135
  if (property._type === "NavigationProperty" && property.isCollection) {
135
136
  part += "*";
136
137
  }
137
138
 
138
- key = key ? key + "/" + part : part;
139
+ key = key ? "".concat(key, "/").concat(part) : part;
139
140
  }
140
141
 
141
142
  return key;
@@ -154,9 +155,9 @@ sap.ui.define(["sap/fe/core/converters/controls/Common/Table", "sap/fe/core/conv
154
155
  annotationPath: converterContext.getAbsoluteAnnotationPath(fullPropertyPath),
155
156
  conditionPath: _getConditionPath(entityType, fullPropertyPath),
156
157
  availability: ((_property$annotations4 = property.annotations) === null || _property$annotations4 === void 0 ? void 0 : (_property$annotations5 = _property$annotations4.UI) === null || _property$annotations5 === void 0 ? void 0 : (_property$annotations6 = _property$annotations5.HiddenFilter) === null || _property$annotations6 === void 0 ? void 0 : _property$annotations6.valueOf()) === true ? AvailabilityType.Hidden : AvailabilityType.Adaptation,
157
- label: compileBinding(annotationExpression(((_property$annotations7 = property.annotations.Common) === null || _property$annotations7 === void 0 ? void 0 : (_property$annotations8 = _property$annotations7.Label) === null || _property$annotations8 === void 0 ? void 0 : _property$annotations8.valueOf()) || property.name)),
158
+ label: compileExpression(getExpressionFromAnnotation(((_property$annotations7 = property.annotations.Common) === null || _property$annotations7 === void 0 ? void 0 : (_property$annotations8 = _property$annotations7.Label) === null || _property$annotations8 === void 0 ? void 0 : _property$annotations8.valueOf()) || property.name)),
158
159
  group: targetEntityType.name,
159
- groupLabel: compileBinding(annotationExpression((targetEntityType === null || targetEntityType === void 0 ? void 0 : (_targetEntityType$ann = targetEntityType.annotations) === null || _targetEntityType$ann === void 0 ? void 0 : (_targetEntityType$ann2 = _targetEntityType$ann.Common) === null || _targetEntityType$ann2 === void 0 ? void 0 : (_targetEntityType$ann3 = _targetEntityType$ann2.Label) === null || _targetEntityType$ann3 === void 0 ? void 0 : _targetEntityType$ann3.valueOf()) || targetEntityType.name))
160
+ groupLabel: compileExpression(getExpressionFromAnnotation((targetEntityType === null || targetEntityType === void 0 ? void 0 : (_targetEntityType$ann = targetEntityType.annotations) === null || _targetEntityType$ann === void 0 ? void 0 : (_targetEntityType$ann2 = _targetEntityType$ann.Common) === null || _targetEntityType$ann2 === void 0 ? void 0 : (_targetEntityType$ann3 = _targetEntityType$ann2.Label) === null || _targetEntityType$ann3 === void 0 ? void 0 : _targetEntityType$ann3.valueOf()) || targetEntityType.name))
160
161
  };
161
162
  }
162
163
 
@@ -230,7 +231,7 @@ sap.ui.define(["sap/fe/core/converters/controls/Common/Table", "sap/fe/core/conv
230
231
  if (properties) {
231
232
  properties.forEach(function (property) {
232
233
  var propertyPath = property.name;
233
- var fullPath = (navigationPath ? navigationPath + "/" : "") + propertyPath;
234
+ var fullPath = (navigationPath ? "".concat(navigationPath, "/") : "") + propertyPath;
234
235
 
235
236
  var selectionField = _createFilterSelectionField(entityType, property, fullPath, includeHidden, converterContext);
236
237
 
@@ -313,13 +314,13 @@ sap.ui.define(["sap/fe/core/converters/controls/Common/Table", "sap/fe/core/conv
313
314
  aSelectOptions === null || aSelectOptions === void 0 ? void 0 : aSelectOptions.forEach(function (selectOption) {
314
315
  var propertyName = selectOption.PropertyName;
315
316
  var sPropertyPath = propertyName.value;
316
- var UISelectionFields = {};
317
+ var currentSelectionFields = {};
317
318
  annotatedSelectionFields === null || annotatedSelectionFields === void 0 ? void 0 : annotatedSelectionFields.forEach(function (SelectionField) {
318
- UISelectionFields[SelectionField.value] = true;
319
+ currentSelectionFields[SelectionField.value] = true;
319
320
  });
320
321
 
321
322
  if (!(sPropertyPath in excludedFilterProperties)) {
322
- if (!(sPropertyPath in UISelectionFields)) {
323
+ if (!(sPropertyPath in currentSelectionFields)) {
323
324
  var _FilterField = getFilterField(sPropertyPath, converterContext, entityType);
324
325
 
325
326
  if (_FilterField) {
@@ -333,11 +334,11 @@ sap.ui.define(["sap/fe/core/converters/controls/Common/Table", "sap/fe/core/conv
333
334
  var _property$annotations9, _property$annotations10;
334
335
 
335
336
  var defaultFilterValue = (_property$annotations9 = property.annotations) === null || _property$annotations9 === void 0 ? void 0 : (_property$annotations10 = _property$annotations9.Common) === null || _property$annotations10 === void 0 ? void 0 : _property$annotations10.FilterDefaultValue;
336
- var PropertyPath = property.name;
337
+ var propertyPath = property.name;
337
338
 
338
- if (!(PropertyPath in excludedFilterProperties)) {
339
- if (defaultFilterValue && !(PropertyPath in UISelectionFields)) {
340
- var _FilterField2 = getFilterField(PropertyPath, converterContext, entityType);
339
+ if (!(propertyPath in excludedFilterProperties)) {
340
+ if (defaultFilterValue && !(propertyPath in UISelectionFields)) {
341
+ var _FilterField2 = getFilterField(propertyPath, converterContext, entityType);
341
342
 
342
343
  if (_FilterField2) {
343
344
  selectionFields.push(_FilterField2);
@@ -351,8 +352,9 @@ sap.ui.define(["sap/fe/core/converters/controls/Common/Table", "sap/fe/core/conv
351
352
  };
352
353
  /**
353
354
  * Get all parameter filter fields in case of a parameterized service.
354
- * @param {ConverterContext} converterContext
355
- * @returns {FilterField[]} An array of parameter filterfields
355
+ *
356
+ * @param converterContext
357
+ * @returns An array of parameter filterfields
356
358
  */
357
359
 
358
360
 
@@ -362,19 +364,18 @@ sap.ui.define(["sap/fe/core/converters/controls/Common/Table", "sap/fe/core/conv
362
364
  var dataModelObjectPath = converterContext.getDataModelObjectPath();
363
365
  var parameterEntityType = dataModelObjectPath.startingEntitySet.entityType;
364
366
  var isParameterized = !!((_parameterEntityType$ = parameterEntityType.annotations) !== null && _parameterEntityType$ !== void 0 && (_parameterEntityType$2 = _parameterEntityType$.Common) !== null && _parameterEntityType$2 !== void 0 && _parameterEntityType$2.ResultContext) && !dataModelObjectPath.targetEntitySet;
365
- var parameterConverterContext = isParameterized && converterContext.getConverterContextFor("/" + dataModelObjectPath.startingEntitySet.name);
366
- var parameterFields = parameterConverterContext ? parameterEntityType.entityProperties.map(function (property) {
367
+ var parameterConverterContext = isParameterized && converterContext.getConverterContextFor("/".concat(dataModelObjectPath.startingEntitySet.name));
368
+ return parameterConverterContext ? parameterEntityType.entityProperties.map(function (property) {
367
369
  return _getFilterField({}, property.name, parameterConverterContext, parameterEntityType);
368
370
  }) : [];
369
- return parameterFields;
370
371
  }
371
372
  /**
372
373
  * Determines if the FilterBar search field is hidden or not.
373
374
  *
374
- * @param {TableVisualization[]} listReportTables The list report tables
375
- * @param {ChartVisualization[]} charts The ALP charts
376
- * @param {ConverterContext} converterContext The converter context
377
- * @returns {boolean} The information if the FilterBar search field is hidden or not
375
+ * @param listReportTables The list report tables
376
+ * @param charts The ALP charts
377
+ * @param converterContext The converter context
378
+ * @returns The information if the FilterBar search field is hidden or not
378
379
  */
379
380
 
380
381
 
@@ -400,7 +401,7 @@ sap.ui.define(["sap/fe/core/converters/controls/Common/Table", "sap/fe/core/conv
400
401
  *
401
402
  * @param entityType The current entityType
402
403
  * @param converterContext The converter context
403
- * @returns {Record<string, CustomElementFilterField>} The filter fields defined in the manifest
404
+ * @returns The filter fields defined in the manifest
404
405
  */
405
406
 
406
407
 
@@ -785,10 +786,12 @@ sap.ui.define(["sap/fe/core/converters/controls/Common/Table", "sap/fe/core/conv
785
786
  /**
786
787
  * Retrieve the configuration for the selection fields that will be used within the filter bar
787
788
  * This configuration takes into account annotation and the selection variants.
788
- * @param {ConverterContext} converterContext
789
- * @param {TableVisualization[]} lrTables
790
- * @param {string} annotationPath
791
- * @returns {FilterSelectionField[]} An array of selection fields
789
+ *
790
+ * @param converterContext
791
+ * @param lrTables
792
+ * @param annotationPath
793
+ * @param [includeHidden]
794
+ * @returns An array of selection fields
792
795
  */
793
796
 
794
797
 
@@ -896,10 +899,11 @@ sap.ui.define(["sap/fe/core/converters/controls/Common/Table", "sap/fe/core/conv
896
899
  * (1) a filter property is mandatory,
897
900
  * (2) no search field exists (entity isn't search enabled),
898
901
  * (3) when the data isn't loaded by default (annotation FetchValues = 2).
899
- * @param {ConverterContext} converterContext The converter context
900
- * @param {any} filterRestrictionsAnnotation The FilterRestriction annotation
901
- * @param {any} valueListAnnotation The ValueList annotation
902
- * @returns {boolean} The value for expandFilterFields
902
+ *
903
+ * @param converterContext The converter context
904
+ * @param filterRestrictionsAnnotation The FilterRestriction annotation
905
+ * @param valueListAnnotation The ValueList annotation
906
+ * @returns The value for expandFilterFields
903
907
  */
904
908
 
905
909
 
@@ -921,4 +925,4 @@ sap.ui.define(["sap/fe/core/converters/controls/Common/Table", "sap/fe/core/conv
921
925
  _exports.getExpandFilterFields = getExpandFilterFields;
922
926
  return _exports;
923
927
  }, false);
924
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkZpbHRlckJhci50cyJdLCJuYW1lcyI6WyJmaWx0ZXJGaWVsZFR5cGUiLCJzRWRtU3RyaW5nIiwic1N0cmluZ0RhdGFUeXBlIiwiZ2V0RmllbGRHcm91cEZpbHRlckdyb3VwcyIsImZpZWxkR3JvdXAiLCJmaWx0ZXJGYWNldE1hcCIsIkRhdGEiLCJmb3JFYWNoIiwiZGF0YUZpZWxkIiwiJFR5cGUiLCJWYWx1ZSIsInBhdGgiLCJncm91cCIsImZ1bGx5UXVhbGlmaWVkTmFtZSIsImdyb3VwTGFiZWwiLCJjb21waWxlQmluZGluZyIsImFubm90YXRpb25FeHByZXNzaW9uIiwiTGFiZWwiLCJhbm5vdGF0aW9ucyIsIkNvbW1vbiIsInF1YWxpZmllciIsImdldEV4Y2x1ZGVkRmlsdGVyUHJvcGVydGllcyIsInNlbGVjdGlvblZhcmlhbnRzIiwicmVkdWNlIiwicHJldmlvdXNWYWx1ZSIsInNlbGVjdGlvblZhcmlhbnQiLCJwcm9wZXJ0eU5hbWVzIiwicHJvcGVydHlOYW1lIiwiY2hlY2tBbGxUYWJsZUZvckVudGl0eVNldEFyZUFuYWx5dGljYWwiLCJsaXN0UmVwb3J0VGFibGVzIiwiY29udGV4dFBhdGgiLCJsZW5ndGgiLCJldmVyeSIsInZpc3VhbGl6YXRpb24iLCJlbmFibGVBbmFseXRpY3MiLCJhbm5vdGF0aW9uIiwiY29sbGVjdGlvbiIsImdldFNlbGVjdGlvblZhcmlhbnRzIiwibHJUYWJsZVZpc3VhbGl6YXRpb25zIiwiY29udmVydGVyQ29udGV4dCIsInNlbGVjdGlvblZhcmlhbnRQYXRocyIsIm1hcCIsInRhYmxlRmlsdGVycyIsImNvbnRyb2wiLCJmaWx0ZXJzIiwidGFibGVTVkNvbmZpZ3MiLCJrZXkiLCJBcnJheSIsImlzQXJyYXkiLCJwYXRocyIsImFubm90YXRpb25QYXRoIiwiaW5kZXhPZiIsInB1c2giLCJzZWxlY3Rpb25WYXJpYW50Q29uZmlnIiwiZ2V0U2VsZWN0aW9uVmFyaWFudENvbmZpZ3VyYXRpb24iLCJzdkNvbmZpZ3MiLCJjb25jYXQiLCJfZ2V0Q29uZGl0aW9uUGF0aCIsImVudGl0eVR5cGUiLCJwcm9wZXJ0eVBhdGgiLCJwYXJ0cyIsInNwbGl0IiwicGFydGlhbFBhdGgiLCJwYXJ0Iiwic2hpZnQiLCJwcm9wZXJ0eSIsInJlc29sdmVQYXRoIiwiX3R5cGUiLCJpc0NvbGxlY3Rpb24iLCJfY3JlYXRlRmlsdGVyU2VsZWN0aW9uRmllbGQiLCJmdWxsUHJvcGVydHlQYXRoIiwiaW5jbHVkZUhpZGRlbiIsInVuZGVmaW5lZCIsInRhcmdldFR5cGUiLCJVSSIsIkhpZGRlbiIsInZhbHVlT2YiLCJ0YXJnZXRFbnRpdHlUeXBlIiwiZ2V0QW5ub3RhdGlvbkVudGl0eVR5cGUiLCJLZXlIZWxwZXIiLCJnZXRTZWxlY3Rpb25GaWVsZEtleUZyb21QYXRoIiwiZ2V0QWJzb2x1dGVBbm5vdGF0aW9uUGF0aCIsImNvbmRpdGlvblBhdGgiLCJhdmFpbGFiaWxpdHkiLCJIaWRkZW5GaWx0ZXIiLCJBdmFpbGFiaWxpdHlUeXBlIiwiQWRhcHRhdGlvbiIsImxhYmVsIiwibmFtZSIsImdldE1vZGVsVHlwZSIsInNUeXBlIiwibURlZmF1bHRUeXBlRm9yRWRtVHlwZSIsIm1vZGVsVHlwZSIsIl9nZXRTZWxlY3Rpb25GaWVsZHMiLCJuYXZpZ2F0aW9uUGF0aCIsInByb3BlcnRpZXMiLCJzZWxlY3Rpb25GaWVsZE1hcCIsImZ1bGxQYXRoIiwic2VsZWN0aW9uRmllbGQiLCJfZ2V0U2VsZWN0aW9uRmllbGRzQnlQYXRoIiwicHJvcGVydHlQYXRocyIsInNlbGVjdGlvbkZpZWxkcyIsImxvY2FsU2VsZWN0aW9uRmllbGRzIiwiZW50aXR5UHJvcGVydGllcyIsImluY2x1ZGVzIiwic3BsaWNlIiwiam9pbiIsIl9nZXRGaWx0ZXJGaWVsZCIsImZpbHRlckZpZWxkcyIsImZpbHRlckZpZWxkIiwiZ2V0RGlhZ25vc3RpY3MiLCJhZGRJc3N1ZSIsIklzc3VlQ2F0ZWdvcnkiLCJBbm5vdGF0aW9uIiwiSXNzdWVTZXZlcml0eSIsIkhpZ2giLCJJc3N1ZVR5cGUiLCJNSVNTSU5HX1NFTEVDVElPTkZJRUxEIiwiRGVmYXVsdCIsImlzUGFyYW1ldGVyIiwiUmVzdWx0Q29udGV4dCIsIl9nZXREZWZhdWx0RmlsdGVyRmllbGRzIiwiYVNlbGVjdE9wdGlvbnMiLCJleGNsdWRlZEZpbHRlclByb3BlcnRpZXMiLCJhbm5vdGF0ZWRTZWxlY3Rpb25GaWVsZHMiLCJVSVNlbGVjdGlvbkZpZWxkcyIsIlNlbGVjdGlvbkZpZWxkIiwidmFsdWUiLCJzZWxlY3RPcHRpb24iLCJQcm9wZXJ0eU5hbWUiLCJzUHJvcGVydHlQYXRoIiwiRmlsdGVyRmllbGQiLCJnZXRGaWx0ZXJGaWVsZCIsImRlZmF1bHRGaWx0ZXJWYWx1ZSIsIkZpbHRlckRlZmF1bHRWYWx1ZSIsIlByb3BlcnR5UGF0aCIsIl9nZXRQYXJhbWV0ZXJGaWVsZHMiLCJkYXRhTW9kZWxPYmplY3RQYXRoIiwiZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCIsInBhcmFtZXRlckVudGl0eVR5cGUiLCJzdGFydGluZ0VudGl0eVNldCIsImlzUGFyYW1ldGVyaXplZCIsInRhcmdldEVudGl0eVNldCIsInBhcmFtZXRlckNvbnZlcnRlckNvbnRleHQiLCJnZXRDb252ZXJ0ZXJDb250ZXh0Rm9yIiwicGFyYW1ldGVyRmllbGRzIiwiZ2V0RmlsdGVyQmFyaGlkZUJhc2ljU2VhcmNoIiwiY2hhcnRzIiwibm9TZWFyY2hJbkNoYXJ0cyIsImNoYXJ0IiwiYXBwbHlTdXBwb3J0ZWQiLCJlbmFibGVTZWFyY2giLCJub1NlYXJjaEluVGFibGVzIiwidGFibGUiLCJlbmFibGVBbmFseXRpY3NTZWFyY2giLCJnZXRDb250ZXh0UGF0aCIsImdldE1hbmlmZXN0RmlsdGVyRmllbGRzIiwiZmJDb25maWciLCJnZXRNYW5pZmVzdFdyYXBwZXIiLCJnZXRGaWx0ZXJDb25maWd1cmF0aW9uIiwiZGVmaW5lZEZpbHRlckZpZWxkcyIsIk9iamVjdCIsImtleXMiLCJnZXRQYXRoRnJvbVNlbGVjdGlvbkZpZWxkS2V5Iiwic0tleSIsInR5cGUiLCJTbG90IiwidmlzdWFsRmlsdGVyIiwiZ2V0VmlzdWFsRmlsdGVycyIsInRlbXBsYXRlIiwicG9zaXRpb24iLCJwbGFjZW1lbnQiLCJQbGFjZW1lbnQiLCJBZnRlciIsInNldHRpbmdzIiwiZ2V0RmlsdGVyUmVzdHJpY3Rpb25zIiwib0ZpbHRlclJlc3RyaWN0aW9uc0Fubm90YXRpb24iLCJzUmVzdHJpY3Rpb24iLCJhUHJvcHMiLCJvUHJvcGVydHkiLCIkUHJvcGVydHlQYXRoIiwibUFsbG93ZWRFeHByZXNzaW9ucyIsIkZpbHRlckV4cHJlc3Npb25SZXN0cmljdGlvbnMiLCJQcm9wZXJ0eSIsIkFsbG93ZWRFeHByZXNzaW9ucyIsImdldFNlYXJjaEZpbHRlclByb3BlcnR5SW5mbyIsImRhdGFUeXBlIiwibWF4Q29uZGl0aW9ucyIsImdldEVkaXRTdGF0ZUZpbHRlclByb3BlcnR5SW5mbyIsImhpZGRlbkZpbHRlciIsImdldFNlYXJjaFJlc3RyaWN0aW9ucyIsImdldEVudGl0eVNldCIsIkNhcGFiaWxpdGllcyIsIlNlYXJjaFJlc3RyaWN0aW9ucyIsImdldE5hdmlnYXRpb25SZXN0cmljdGlvbnMiLCJzTmF2aWdhdGlvblBhdGgiLCJvTmF2aWdhdGlvblJlc3RyaWN0aW9ucyIsIk5hdmlnYXRpb25SZXN0cmljdGlvbnMiLCJhUmVzdHJpY3RlZFByb3BlcnRpZXMiLCJSZXN0cmljdGVkUHJvcGVydGllcyIsImZpbmQiLCJvUmVzdHJpY3RlZFByb3BlcnR5IiwiTmF2aWdhdGlvblByb3BlcnR5IiwiJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgiLCJfZmV0Y2hCYXNpY1Byb3BlcnR5SW5mbyIsIm9GaWx0ZXJGaWVsZEluZm8iLCJkaXNwbGF5IiwiY2FzZVNlbnNpdGl2ZSIsIm1lbnUiLCJnZXRTcGVjaWZpY0FsbG93ZWRFeHByZXNzaW9uIiwiYUV4cHJlc3Npb25zIiwiYUFsbG93ZWRFeHByZXNzaW9uc1ByaW9yaXR5Iiwic29ydCIsImEiLCJiIiwiZGlzcGxheU1vZGUiLCJvUHJvcGVydHlBbm5vdGF0aW9ucyIsIm9Db2xsZWN0aW9uQW5ub3RhdGlvbnMiLCJvVGV4dEFubm90YXRpb24iLCJUZXh0Iiwib1RleHRBcnJhbmdtZW50QW5ub3RhdGlvbiIsIlRleHRBcnJhbmdlbWVudCIsIl9mZXRjaFByb3BlcnR5SW5mbyIsIm9UeXBlQ29uZmlnIiwib1Byb3BlcnR5SW5mbyIsInNBbm5vdGF0aW9uUGF0aCIsInRhcmdldFByb3BlcnR5T2JqZWN0IiwidGFyZ2V0T2JqZWN0Iiwib0Zvcm1hdE9wdGlvbnMiLCJmb3JtYXRPcHRpb25zIiwib0NvbnN0cmFpbnRzIiwiY29uc3RyYWludHMiLCJhc3NpZ24iLCJpc011bHRpVmFsdWUiLCJiSXNNdWx0aVZhbHVlIiwiZmlsdGVyRXhwcmVzc2lvbiIsImdldEFubm90YXRlZFNlbGVjdGlvbkZpZWxkRGF0YSIsImxyVGFibGVzIiwiZ2V0RW50aXR5VHlwZSIsImdldEVudGl0eVR5cGVBbm5vdGF0aW9uIiwiU2VsZWN0aW9uRmllbGRzIiwibmF2aWdhdGlvblByb3BlcnRpZXMiLCJnZXRTZWxlY3Rpb25WYXJpYW50IiwiU2VsZWN0T3B0aW9ucyIsInByb3BlcnR5SW5mb0ZpZWxkcyIsImRlZmF1bHRGaWx0ZXJGaWVsZHMiLCJwcm9jZXNzU2VsZWN0aW9uRmllbGRzIiwiZGVmYXVsdFZhbHVlUHJvcGVydHlGaWVsZHMiLCJzZWxlY3Rpb25GaWVsZFR5cGVzIiwiYVR5cGVDb25maWciLCJfZm5UeXBlQ29uZmlnIiwiZ2V0VHlwZUNvbmZpZyIsIm51bGxhYmxlIiwicGFyc2VLZWVwc0VtcHR5U3RyaW5nIiwicGFyYW1ldGVyRmllbGQiLCJwcm9wZXJ0eUNvbnZlcnR5Q29udGV4dCIsInByb3BlcnR5VGFyZ2V0T2JqZWN0Iiwib0ZpbHRlclJlc3RyaWN0aW9ucyIsIkZpbHRlclJlc3RyaWN0aW9ucyIsIm9SZXQiLCJzRW50aXR5U2V0UGF0aCIsImFQYXRoUGFydHMiLCJvTmF2aWdhdGlvbkZpbHRlclJlc3RyaWN0aW9ucyIsIlJlcXVpcmVkUHJvcGVydGllcyIsIk5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzIiwiRmlsdGVyQWxsb3dlZEV4cHJlc3Npb25zIiwiaXNDYXNlU2Vuc2l0aXZlIiwiaXNGaWx0ZXJpbmdDYXNlU2Vuc2l0aXZlIiwiYVJlcXVpcmVkUHJvcHMiLCJhTm9uRmlsdGVyYWJsZVByb3BzIiwiYUZldGNoZWRQcm9wZXJ0aWVzIiwicHJvcGVydHlJbmZvRmllbGQiLCJvQ29udmVydGVkUHJvcGVydHkiLCJyZXBsYWNlIiwicmVxdWlyZWQiLCJEcmFmdFJvb3QiLCJzZWFyY2hSZXN0cmljdGlvbnMiLCJoaWRlQmFzaWNTZWFyY2giLCJCb29sZWFuIiwiU2VhcmNoYWJsZSIsImluc2VydEN1c3RvbU1hbmlmZXN0RWxlbWVudHMiLCJpbnNlcnRDdXN0b21FbGVtZW50cyIsImdldFNlbGVjdGlvbkZpZWxkcyIsIm9Bbm5vdGF0ZWRTZWxlY3Rpb25GaWVsZERhdGEiLCJKU09OIiwicGFyc2UiLCJzdHJpbmdpZnkiLCJsb2NhbGVDb21wYXJlIiwic0ZldGNoUHJvcGVydGllcyIsInNQcm9wZXJ0eUluZm8iLCJwcm9wU2VsZWN0aW9uRmllbGRzIiwiZmlsdGVyRmFjZXRzIiwiRmlsdGVyRmFjZXRzIiwiYUZpZWxkR3JvdXBzIiwiZ2V0QW5ub3RhdGlvbnNCeVRlcm0iLCJpIiwiZmlsdGVyRmFjZXQiLCJUYXJnZXQiLCIkdGFyZ2V0IiwiSUQiLCJ0b1N0cmluZyIsImFsbEZpbHRlcnMiLCJmaWx0ZXIiLCJzQ29udGV4dFBhdGgiLCJhZ2dyZWdhdGVzIiwiYWdncmVnYXRhYmxlUHJvcGVydGllcyIsImFnZ3JlZ2F0ZUtleSIsInJlbGF0aXZlUGF0aCIsImdldEV4cGFuZEZpbHRlckZpZWxkcyIsImZpbHRlclJlc3RyaWN0aW9uc0Fubm90YXRpb24iLCJ2YWx1ZUxpc3RBbm5vdGF0aW9uIiwicmVxdWlyZWRQcm9wZXJ0aWVzIiwidmFsdWVMaXN0IiwiZ2V0T2JqZWN0IiwiRmV0Y2hWYWx1ZXMiXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O01B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YUFBYSxFQUFiQTtBQUFuQixLQUFQO0FBQ0EsR0F4R007QUEwR1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FBQ08sTUFBTW1CLHFCQUFxQixHQUFHLFVBQ3BDN1EsZ0JBRG9DLEVBRXBDOFEsNEJBRm9DLEVBR3BDQyxtQkFIb0MsRUFJMUI7QUFDVixRQUFNQyxrQkFBa0IsR0FBR3hJLHFCQUFxQixDQUFDc0ksNEJBQUQsRUFBK0Isb0JBQS9CLENBQWhEO0FBQ0EsUUFBTWpDLGtCQUFrQixHQUFHdEYscUJBQXFCLENBQUN2SixnQkFBRCxDQUFoRDtBQUNBLFFBQU04TyxlQUFlLEdBQUdDLE9BQU8sQ0FBQ0Ysa0JBQWtCLElBQUksQ0FBQ0Esa0JBQWtCLENBQUNHLFVBQTNDLENBQS9CO0FBQ0EsUUFBTWlDLFNBQVMsR0FBR0YsbUJBQW1CLENBQUNHLFNBQXBCLEVBQWxCOztBQUNBLFFBQUlGLGtCQUFrQixDQUFDeFIsTUFBbkIsR0FBNEIsQ0FBNUIsSUFBaUNzUCxlQUFqQyxJQUFvRCxDQUFBbUMsU0FBUyxTQUFULElBQUFBLFNBQVMsV0FBVCxZQUFBQSxTQUFTLENBQUVFLFdBQVgsTUFBMkIsQ0FBbkYsRUFBc0Y7QUFDckYsYUFBTyxJQUFQO0FBQ0E7O0FBQ0QsV0FBTyxLQUFQO0FBQ0EsR0FiTSIsInNvdXJjZVJvb3QiOiIuIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRW50aXR5VHlwZSwgTmF2aWdhdGlvblByb3BlcnR5LCBQcm9wZXJ0eSB9IGZyb20gXCJAc2FwLXV4L2Fubm90YXRpb24tY29udmVydGVyXCI7XG5pbXBvcnQgeyBBbm5vdGF0aW9uVGVybSwgRGF0YUZpZWxkQWJzdHJhY3RUeXBlcywgRGF0YUZpZWxkVHlwZXMsIFJlZmVyZW5jZUZhY2V0VHlwZXMsIFVJQW5ub3RhdGlvblRlcm1zIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG5pbXBvcnQgeyBQcm9wZXJ0eVBhdGggfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvZGlzdC9FZG1cIjtcbmltcG9ydCB7IEZpZWxkR3JvdXAsIEZpZWxkR3JvdXBUeXBlLCBTZWxlY3RPcHRpb25UeXBlIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL2Rpc3QvZ2VuZXJhdGVkL1VJXCI7XG5pbXBvcnQgeyBDaGFydFZpc3VhbGl6YXRpb24gfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9jb250cm9scy9Db21tb24vQ2hhcnRcIjtcbmltcG9ydCB7XG5cdGdldFNlbGVjdGlvblZhcmlhbnRDb25maWd1cmF0aW9uLFxuXHRnZXRUeXBlQ29uZmlnLFxuXHRpc0ZpbHRlcmluZ0Nhc2VTZW5zaXRpdmUsXG5cdFNlbGVjdGlvblZhcmlhbnRDb25maWd1cmF0aW9uLFxuXHRUYWJsZVZpc3VhbGl6YXRpb25cbn0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvY29udHJvbHMvQ29tbW9uL1RhYmxlXCI7XG5pbXBvcnQgeyBnZXRWaXN1YWxGaWx0ZXJzLCBWaXN1YWxGaWx0ZXJzIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvY29udHJvbHMvTGlzdFJlcG9ydC9WaXN1YWxGaWx0ZXJzXCI7XG5pbXBvcnQgQ29udmVydGVyQ29udGV4dCBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9Db252ZXJ0ZXJDb250ZXh0XCI7XG5pbXBvcnQgeyBDb25maWd1cmFibGVPYmplY3QsIEN1c3RvbUVsZW1lbnQsIGluc2VydEN1c3RvbUVsZW1lbnRzLCBQbGFjZW1lbnQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9oZWxwZXJzL0NvbmZpZ3VyYWJsZU9iamVjdFwiO1xuaW1wb3J0IHsgSXNzdWVDYXRlZ29yeSwgSXNzdWVTZXZlcml0eSwgSXNzdWVUeXBlIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvaGVscGVycy9Jc3N1ZU1hbmFnZXJcIjtcbmltcG9ydCB7IEtleUhlbHBlciB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2hlbHBlcnMvS2V5XCI7XG5pbXBvcnQgeyBhbm5vdGF0aW9uRXhwcmVzc2lvbiwgY29tcGlsZUJpbmRpbmcgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9CaW5kaW5nRXhwcmVzc2lvblwiO1xuaW1wb3J0IHsgQXZhaWxhYmlsaXR5VHlwZSwgRmlsdGVyRmllbGRNYW5pZmVzdENvbmZpZ3VyYXRpb24sIEZpbHRlck1hbmlmZXN0Q29uZmlndXJhdGlvbiwgRmlsdGVyU2V0dGluZ3MgfSBmcm9tIFwiLi4vLi4vTWFuaWZlc3RTZXR0aW5nc1wiO1xuaW1wb3J0IHsgZ2V0U2VsZWN0aW9uVmFyaWFudCB9IGZyb20gXCIuLi9Db21tb24vRGF0YVZpc3VhbGl6YXRpb25cIjtcbi8vaW1wb3J0IHsgaGFzVmFsdWVIZWxwIH0gZnJvbSBcInNhcC9mZS9jb3JlL3RlbXBsYXRpbmcvUHJvcGVydHlIZWxwZXJcIjtcblxuZXhwb3J0IHR5cGUgRmlsdGVyRmllbGQgPSBDb25maWd1cmFibGVPYmplY3QgJiB7XG5cdHR5cGU/OiBzdHJpbmc7XG5cdGNvbmRpdGlvblBhdGg6IHN0cmluZztcblx0YXZhaWxhYmlsaXR5OiBBdmFpbGFiaWxpdHlUeXBlO1xuXHRhbm5vdGF0aW9uUGF0aDogc3RyaW5nO1xuXHRsYWJlbD86IHN0cmluZztcblx0dGVtcGxhdGU/OiBzdHJpbmc7XG5cdGdyb3VwPzogc3RyaW5nO1xuXHRncm91cExhYmVsPzogc3RyaW5nO1xuXHRzZXR0aW5ncz86IEZpbHRlclNldHRpbmdzO1xuXHRpc1BhcmFtZXRlcj86IGJvb2xlYW47XG5cdHZpc3VhbEZpbHRlcj86IFZpc3VhbEZpbHRlcnM7XG5cdGNhc2VTZW5zaXRpdmU/OiBib29sZWFuO1xufTtcblxudHlwZSBGaWx0ZXJHcm91cCA9IHtcblx0Z3JvdXA/OiBzdHJpbmc7XG5cdGdyb3VwTGFiZWw/OiBzdHJpbmc7XG59O1xuXG5lbnVtIGZpbHRlckZpZWxkVHlwZSB7XG5cdERlZmF1bHQgPSBcIkRlZmF1bHRcIixcblx0U2xvdCA9IFwiU2xvdFwiXG59XG5cbmNvbnN0IHNFZG1TdHJpbmcgPSBcIkVkbS5TdHJpbmdcIjtcbmNvbnN0IHNTdHJpbmdEYXRhVHlwZSA9IFwic2FwLnVpLm1vZGVsLm9kYXRhLnR5cGUuU3RyaW5nXCI7XG5cbmV4cG9ydCB0eXBlIEN1c3RvbUVsZW1lbnRGaWx0ZXJGaWVsZCA9IEN1c3RvbUVsZW1lbnQ8RmlsdGVyRmllbGQ+O1xuXG4vKipcbiAqIEVudGVyIGFsbCBEYXRhRmllbGRzIG9mIGEgZ2l2ZW4gRmllbGRHcm91cCBpbnRvIHRoZSBmaWx0ZXJGYWNldE1hcC5cbiAqXG4gKiBAcGFyYW0ge0Fubm90YXRpb25UZXJtPEZpZWxkR3JvdXBUeXBlPn0gZmllbGRHcm91cFxuICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIEZpbHRlckdyb3VwPn0gVGhlIG1hcCBvZiBmYWNldHMgZm9yIHRoZSBnaXZlbiBGaWVsZEdyb3VwXG4gKi9cbmZ1bmN0aW9uIGdldEZpZWxkR3JvdXBGaWx0ZXJHcm91cHMoZmllbGRHcm91cDogQW5ub3RhdGlvblRlcm08RmllbGRHcm91cFR5cGU+KTogUmVjb3JkPHN0cmluZywgRmlsdGVyR3JvdXA+IHtcblx0Y29uc3QgZmlsdGVyRmFjZXRNYXA6IFJlY29yZDxzdHJpbmcsIEZpbHRlckdyb3VwPiA9IHt9O1xuXHRmaWVsZEdyb3VwLkRhdGEuZm9yRWFjaCgoZGF0YUZpZWxkOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzKSA9PiB7XG5cdFx0aWYgKGRhdGFGaWVsZC4kVHlwZSA9PT0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5EYXRhRmllbGRcIikge1xuXHRcdFx0ZmlsdGVyRmFjZXRNYXBbZGF0YUZpZWxkLlZhbHVlLnBhdGhdID0ge1xuXHRcdFx0XHRncm91cDogZmllbGRHcm91cC5mdWxseVF1YWxpZmllZE5hbWUsXG5cdFx0XHRcdGdyb3VwTGFiZWw6XG5cdFx0XHRcdFx0Y29tcGlsZUJpbmRpbmcoXG5cdFx0XHRcdFx0XHRhbm5vdGF0aW9uRXhwcmVzc2lvbihmaWVsZEdyb3VwLkxhYmVsIHx8IGZpZWxkR3JvdXAuYW5ub3RhdGlvbnM/LkNvbW1vbj8uTGFiZWwgfHwgZmllbGRHcm91cC5xdWFsaWZpZXIpXG5cdFx0XHRcdFx0KSB8fCBmaWVsZEdyb3VwLnF1YWxpZmllclxuXHRcdFx0fTtcblx0XHR9XG5cdH0pO1xuXHRyZXR1cm4gZmlsdGVyRmFjZXRNYXA7XG59XG5cbmZ1bmN0aW9uIGdldEV4Y2x1ZGVkRmlsdGVyUHJvcGVydGllcyhzZWxlY3Rpb25WYXJpYW50czogU2VsZWN0aW9uVmFyaWFudENvbmZpZ3VyYXRpb25bXSk6IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+IHtcblx0cmV0dXJuIHNlbGVjdGlvblZhcmlhbnRzLnJlZHVjZSgocHJldmlvdXNWYWx1ZTogUmVjb3JkPHN0cmluZywgYm9vbGVhbj4sIHNlbGVjdGlvblZhcmlhbnQpID0+IHtcblx0XHRzZWxlY3Rpb25WYXJpYW50LnByb3BlcnR5TmFtZXMuZm9yRWFjaCgocHJvcGVydHlOYW1lKSA9PiB7XG5cdFx0XHRwcmV2aW91c1ZhbHVlW3Byb3BlcnR5TmFtZV0gPSB0cnVlO1xuXHRcdH0pO1xuXHRcdHJldHVybiBwcmV2aW91c1ZhbHVlO1xuXHR9LCB7fSk7XG59XG5cbi8qKlxuICogQ2hlY2sgdGhhdCBhbGwgdGhlIHRhYmxlcyBmb3IgYSBkZWRpY2F0ZWQgZW50aXR5IHNldCBhcmUgY29uZmlndXJlZCBhcyBhbmFseXRpY2FsIHRhYmxlLlxuICogQHBhcmFtIHtUYWJsZVZpc3VhbGl6YXRpb25bXX0gbGlzdFJlcG9ydFRhYmxlcyBMaXN0IHJlcG9ydCB0YWJsZXNcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb250ZXh0UGF0aFxuICogQHJldHVybnMge2Jvb2xlYW59IElzIEZpbHRlckJhciBzZWFyY2ggZmllbGQgaGlkZGVuIG9yIG5vdFxuICovXG5mdW5jdGlvbiBjaGVja0FsbFRhYmxlRm9yRW50aXR5U2V0QXJlQW5hbHl0aWNhbChsaXN0UmVwb3J0VGFibGVzOiBUYWJsZVZpc3VhbGl6YXRpb25bXSwgY29udGV4dFBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuXHRpZiAoY29udGV4dFBhdGggJiYgbGlzdFJlcG9ydFRhYmxlcy5sZW5ndGggPiAwKSB7XG5cdFx0cmV0dXJuIGxpc3RSZXBvcnRUYWJsZXMuZXZlcnkoKHZpc3VhbGl6YXRpb24pID0+IHtcblx0XHRcdHJldHVybiB2aXN1YWxpemF0aW9uLmVuYWJsZUFuYWx5dGljcyAmJiBjb250ZXh0UGF0aCA9PT0gdmlzdWFsaXphdGlvbi5hbm5vdGF0aW9uLmNvbGxlY3Rpb247XG5cdFx0fSk7XG5cdH1cblx0cmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBnZXRTZWxlY3Rpb25WYXJpYW50cyhcblx0bHJUYWJsZVZpc3VhbGl6YXRpb25zOiBUYWJsZVZpc3VhbGl6YXRpb25bXSxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dFxuKTogU2VsZWN0aW9uVmFyaWFudENvbmZpZ3VyYXRpb25bXSB7XG5cdGNvbnN0IHNlbGVjdGlvblZhcmlhbnRQYXRoczogc3RyaW5nW10gPSBbXTtcblx0cmV0dXJuIGxyVGFibGVWaXN1YWxpemF0aW9uc1xuXHRcdC5tYXAoKHZpc3VhbGl6YXRpb24pID0+IHtcblx0XHRcdGNvbnN0IHRhYmxlRmlsdGVycyA9IHZpc3VhbGl6YXRpb24uY29udHJvbC5maWx0ZXJzO1xuXHRcdFx0Y29uc3QgdGFibGVTVkNvbmZpZ3M6IFNlbGVjdGlvblZhcmlhbnRDb25maWd1cmF0aW9uW10gPSBbXTtcblx0XHRcdGZvciAoY29uc3Qga2V5IGluIHRhYmxlRmlsdGVycykge1xuXHRcdFx0XHRpZiAoQXJyYXkuaXNBcnJheSh0YWJsZUZpbHRlcnNba2V5XS5wYXRocykpIHtcblx0XHRcdFx0XHRjb25zdCBwYXRocyA9IHRhYmxlRmlsdGVyc1trZXldLnBhdGhzO1xuXHRcdFx0XHRcdHBhdGhzLmZvckVhY2goKHBhdGgpID0+IHtcblx0XHRcdFx0XHRcdGlmIChwYXRoICYmIHBhdGguYW5ub3RhdGlvblBhdGggJiYgc2VsZWN0aW9uVmFyaWFudFBhdGhzLmluZGV4T2YocGF0aC5hbm5vdGF0aW9uUGF0aCkgPT09IC0xKSB7XG5cdFx0XHRcdFx0XHRcdHNlbGVjdGlvblZhcmlhbnRQYXRocy5wdXNoKHBhdGguYW5ub3RhdGlvblBhdGgpO1xuXHRcdFx0XHRcdFx0XHRjb25zdCBzZWxlY3Rpb25WYXJpYW50Q29uZmlnID0gZ2V0U2VsZWN0aW9uVmFyaWFudENvbmZpZ3VyYXRpb24ocGF0aC5hbm5vdGF0aW9uUGF0aCwgY29udmVydGVyQ29udGV4dCk7XG5cdFx0XHRcdFx0XHRcdGlmIChzZWxlY3Rpb25WYXJpYW50Q29uZmlnKSB7XG5cdFx0XHRcdFx0XHRcdFx0dGFibGVTVkNvbmZpZ3MucHVzaChzZWxlY3Rpb25WYXJpYW50Q29uZmlnKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdGFibGVTVkNvbmZpZ3M7XG5cdFx0fSlcblx0XHQucmVkdWNlKChzdkNvbmZpZ3MsIHNlbGVjdGlvblZhcmlhbnQpID0+IHN2Q29uZmlncy5jb25jYXQoc2VsZWN0aW9uVmFyaWFudCksIFtdKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBjb25kaXRpb24gcGF0aCByZXF1aXJlZCBmb3IgdGhlIGNvbmRpdGlvbiBtb2RlbC4gSXQgbG9va3MgYXMgZm9sbG93czpcbiAqIDwxOk4tUHJvcGVydHlOYW1lPipcXC88MToxLVByb3BlcnR5TmFtZT4vPFByb3BlcnR5TmFtZT4uXG4gKlxuICogQHBhcmFtIGVudGl0eVR5cGUgVGhlIHJvb3QgRW50aXR5VHlwZVxuICogQHBhcmFtIHByb3BlcnR5UGF0aCBUaGUgZnVsbCBwYXRoIHRvIHRoZSB0YXJnZXQgcHJvcGVydHlcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBmb3JtYXR0ZWQgY29uZGl0aW9uIHBhdGhcbiAqL1xuY29uc3QgX2dldENvbmRpdGlvblBhdGggPSBmdW5jdGlvbiAoZW50aXR5VHlwZTogRW50aXR5VHlwZSwgcHJvcGVydHlQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRjb25zdCBwYXJ0cyA9IHByb3BlcnR5UGF0aC5zcGxpdChcIi9cIik7XG5cdGxldCBwYXJ0aWFsUGF0aDtcblx0bGV0IGtleSA9IFwiXCI7XG5cdHdoaWxlIChwYXJ0cy5sZW5ndGgpIHtcblx0XHRsZXQgcGFydCA9IHBhcnRzLnNoaWZ0KCkgYXMgc3RyaW5nO1xuXHRcdHBhcnRpYWxQYXRoID0gcGFydGlhbFBhdGggPyBwYXJ0aWFsUGF0aCArIFwiL1wiICsgcGFydCA6IHBhcnQ7XG5cdFx0Y29uc3QgcHJvcGVydHk6IFByb3BlcnR5IHwgTmF2aWdhdGlvblByb3BlcnR5ID0gZW50aXR5VHlwZS5yZXNvbHZlUGF0aChwYXJ0aWFsUGF0aCk7XG5cdFx0aWYgKHByb3BlcnR5Ll90eXBlID09PSBcIk5hdmlnYXRpb25Qcm9wZXJ0eVwiICYmIHByb3BlcnR5LmlzQ29sbGVjdGlvbikge1xuXHRcdFx0cGFydCArPSBcIipcIjtcblx0XHR9XG5cdFx0a2V5ID0ga2V5ID8ga2V5ICsgXCIvXCIgKyBwYXJ0IDogcGFydDtcblx0fVxuXHRyZXR1cm4ga2V5O1xufTtcblxuY29uc3QgX2NyZWF0ZUZpbHRlclNlbGVjdGlvbkZpZWxkID0gZnVuY3Rpb24gKFxuXHRlbnRpdHlUeXBlOiBFbnRpdHlUeXBlLFxuXHRwcm9wZXJ0eTogUHJvcGVydHksXG5cdGZ1bGxQcm9wZXJ0eVBhdGg6IHN0cmluZyxcblx0aW5jbHVkZUhpZGRlbjogYm9vbGVhbixcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dFxuKTogRmlsdGVyRmllbGQgfCB1bmRlZmluZWQge1xuXHQvLyBpZ25vcmUgY29tcGxleCBwcm9wZXJ0eSB0eXBlcyBhbmQgaGlkZGVuIGFubm90YXRlZCBvbmVzXG5cdGlmIChcblx0XHRwcm9wZXJ0eSAhPT0gdW5kZWZpbmVkICYmXG5cdFx0cHJvcGVydHkudGFyZ2V0VHlwZSA9PT0gdW5kZWZpbmVkICYmXG5cdFx0KGluY2x1ZGVIaWRkZW4gfHwgcHJvcGVydHkuYW5ub3RhdGlvbnM/LlVJPy5IaWRkZW4/LnZhbHVlT2YoKSAhPT0gdHJ1ZSlcblx0KSB7XG5cdFx0Y29uc3QgdGFyZ2V0RW50aXR5VHlwZSA9IGNvbnZlcnRlckNvbnRleHQuZ2V0QW5ub3RhdGlvbkVudGl0eVR5cGUocHJvcGVydHkpO1xuXHRcdHJldHVybiB7XG5cdFx0XHRrZXk6IEtleUhlbHBlci5nZXRTZWxlY3Rpb25GaWVsZEtleUZyb21QYXRoKGZ1bGxQcm9wZXJ0eVBhdGgpLFxuXHRcdFx0YW5ub3RhdGlvblBhdGg6IGNvbnZlcnRlckNvbnRleHQuZ2V0QWJzb2x1dGVBbm5vdGF0aW9uUGF0aChmdWxsUHJvcGVydHlQYXRoKSxcblx0XHRcdGNvbmRpdGlvblBhdGg6IF9nZXRDb25kaXRpb25QYXRoKGVudGl0eVR5cGUsIGZ1bGxQcm9wZXJ0eVBhdGgpLFxuXHRcdFx0YXZhaWxhYmlsaXR5OlxuXHRcdFx0XHRwcm9wZXJ0eS5hbm5vdGF0aW9ucz8uVUk/LkhpZGRlbkZpbHRlcj8udmFsdWVPZigpID09PSB0cnVlID8gQXZhaWxhYmlsaXR5VHlwZS5IaWRkZW4gOiBBdmFpbGFiaWxpdHlUeXBlLkFkYXB0YXRpb24sXG5cdFx0XHRsYWJlbDogY29tcGlsZUJpbmRpbmcoYW5ub3RhdGlvbkV4cHJlc3Npb24ocHJvcGVydHkuYW5ub3RhdGlvbnMuQ29tbW9uPy5MYWJlbD8udmFsdWVPZigpIHx8IHByb3BlcnR5Lm5hbWUpKSxcblx0XHRcdGdyb3VwOiB0YXJnZXRFbnRpdHlUeXBlLm5hbWUsXG5cdFx0XHRncm91cExhYmVsOiBjb21waWxlQmluZGluZyhcblx0XHRcdFx0YW5ub3RhdGlvbkV4cHJlc3Npb24odGFyZ2V0RW50aXR5VHlwZT8uYW5ub3RhdGlvbnM/LkNvbW1vbj8uTGFiZWw/LnZhbHVlT2YoKSB8fCB0YXJnZXRFbnRpdHlUeXBlLm5hbWUpXG5cdFx0XHQpXG5cdFx0fTtcblx0fVxuXHRyZXR1cm4gdW5kZWZpbmVkO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldE1vZGVsVHlwZShzVHlwZTogYW55KSB7XG5cdHR5cGUgZGVmYXVsdE1vZGVsVHlwZSA9IHtcblx0XHRba2V5OiBzdHJpbmddOiB7XG5cdFx0XHRba2V5OiBzdHJpbmddOiBzdHJpbmc7XG5cdFx0fTtcblx0fTtcblx0Y29uc3QgbURlZmF1bHRUeXBlRm9yRWRtVHlwZTogZGVmYXVsdE1vZGVsVHlwZSA9IHtcblx0XHRcIkVkbS5Cb29sZWFuXCI6IHtcblx0XHRcdG1vZGVsVHlwZTogXCJCb29sXCJcblx0XHR9LFxuXHRcdFwiRWRtLkJ5dGVcIjoge1xuXHRcdFx0bW9kZWxUeXBlOiBcIkludFwiXG5cdFx0fSxcblx0XHRcIkVkbS5EYXRlXCI6IHtcblx0XHRcdG1vZGVsVHlwZTogXCJEYXRlXCJcblx0XHR9LFxuXHRcdFwiRWRtLkRhdGVUaW1lXCI6IHtcblx0XHRcdG1vZGVsVHlwZTogXCJEYXRlXCJcblx0XHR9LFxuXHRcdFwiRWRtLkRhdGVUaW1lT2Zmc2V0XCI6IHtcblx0XHRcdG1vZGVsVHlwZTogXCJEYXRlVGltZU9mZnNldFwiXG5cdFx0fSxcblx0XHRcIkVkbS5EZWNpbWFsXCI6IHtcblx0XHRcdG1vZGVsVHlwZTogXCJEZWNpbWFsXCJcblx0XHR9LFxuXHRcdFwiRWRtLkRvdWJsZVwiOiB7XG5cdFx0XHRtb2RlbFR5cGU6IFwiRmxvYXRcIlxuXHRcdH0sXG5cdFx0XCJFZG0uRmxvYXRcIjoge1xuXHRcdFx0bW9kZWxUeXBlOiBcIkZsb2F0XCJcblx0XHR9LFxuXHRcdFwiRWRtLkd1aWRcIjoge1xuXHRcdFx0bW9kZWxUeXBlOiBcIkd1aWRcIlxuXHRcdH0sXG5cdFx0XCJFZG0uSW50MTZcIjoge1xuXHRcdFx0bW9kZWxUeXBlOiBcIkludFwiXG5cdFx0fSxcblx0XHRcIkVkbS5JbnQzMlwiOiB7XG5cdFx0XHRtb2RlbFR5cGU6IFwiSW50XCJcblx0XHR9LFxuXHRcdFwiRWRtLkludDY0XCI6IHtcblx0XHRcdG1vZGVsVHlwZTogXCJJbnRcIlxuXHRcdH0sXG5cdFx0XCJFZG0uU0J5dGVcIjoge1xuXHRcdFx0bW9kZWxUeXBlOiBcIkludFwiXG5cdFx0fSxcblx0XHRcIkVkbS5TaW5nbGVcIjoge1xuXHRcdFx0bW9kZWxUeXBlOiBcIkZsb2F0XCJcblx0XHR9LFxuXHRcdFwiRWRtLlN0cmluZ1wiOiB7XG5cdFx0XHRtb2RlbFR5cGU6IFwiU3RyaW5nXCJcblx0XHR9LFxuXHRcdFwiRWRtLlRpbWVcIjoge1xuXHRcdFx0bW9kZWxUeXBlOiBcIlRpbWVPZkRheVwiXG5cdFx0fSxcblx0XHRcIkVkbS5UaW1lT2ZEYXlcIjoge1xuXHRcdFx0bW9kZWxUeXBlOiBcIlRpbWVPZkRheVwiXG5cdFx0fSxcblx0XHRcIkVkbS5TdHJlYW1cIjoge1xuXHRcdFx0Ly9ubyBjb3JyZXNwb25kaW5nIG1vZGVsVHlwZSAtIGlnbm9yZSBmb3IgZmlsdGVyaW5nXG5cdFx0fVxuXHR9O1xuXHRyZXR1cm4gc1R5cGUgJiYgc1R5cGUgaW4gbURlZmF1bHRUeXBlRm9yRWRtVHlwZSAmJiBtRGVmYXVsdFR5cGVGb3JFZG1UeXBlW3NUeXBlXS5tb2RlbFR5cGU7XG59XG5jb25zdCBfZ2V0U2VsZWN0aW9uRmllbGRzID0gZnVuY3Rpb24gKFxuXHRlbnRpdHlUeXBlOiBFbnRpdHlUeXBlLFxuXHRuYXZpZ2F0aW9uUGF0aDogc3RyaW5nLFxuXHRwcm9wZXJ0aWVzOiBBcnJheTxQcm9wZXJ0eT4gfCB1bmRlZmluZWQsXG5cdGluY2x1ZGVIaWRkZW46IGJvb2xlYW4sXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHRcbik6IFJlY29yZDxzdHJpbmcsIEZpbHRlckZpZWxkPiB7XG5cdGNvbnN0IHNlbGVjdGlvbkZpZWxkTWFwOiBSZWNvcmQ8c3RyaW5nLCBGaWx0ZXJGaWVsZD4gPSB7fTtcblx0aWYgKHByb3BlcnRpZXMpIHtcblx0XHRwcm9wZXJ0aWVzLmZvckVhY2goKHByb3BlcnR5OiBQcm9wZXJ0eSkgPT4ge1xuXHRcdFx0Y29uc3QgcHJvcGVydHlQYXRoOiBzdHJpbmcgPSBwcm9wZXJ0eS5uYW1lO1xuXHRcdFx0Y29uc3QgZnVsbFBhdGg6IHN0cmluZyA9IChuYXZpZ2F0aW9uUGF0aCA/IG5hdmlnYXRpb25QYXRoICsgXCIvXCIgOiBcIlwiKSArIHByb3BlcnR5UGF0aDtcblx0XHRcdGNvbnN0IHNlbGVjdGlvbkZpZWxkID0gX2NyZWF0ZUZpbHRlclNlbGVjdGlvbkZpZWxkKGVudGl0eVR5cGUsIHByb3BlcnR5LCBmdWxsUGF0aCwgaW5jbHVkZUhpZGRlbiwgY29udmVydGVyQ29udGV4dCk7XG5cdFx0XHRpZiAoc2VsZWN0aW9uRmllbGQpIHtcblx0XHRcdFx0c2VsZWN0aW9uRmllbGRNYXBbZnVsbFBhdGhdID0gc2VsZWN0aW9uRmllbGQ7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblx0cmV0dXJuIHNlbGVjdGlvbkZpZWxkTWFwO1xufTtcblxuY29uc3QgX2dldFNlbGVjdGlvbkZpZWxkc0J5UGF0aCA9IGZ1bmN0aW9uIChcblx0ZW50aXR5VHlwZTogRW50aXR5VHlwZSxcblx0cHJvcGVydHlQYXRoczogQXJyYXk8c3RyaW5nPiB8IHVuZGVmaW5lZCxcblx0aW5jbHVkZUhpZGRlbjogYm9vbGVhbixcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dFxuKTogUmVjb3JkPHN0cmluZywgRmlsdGVyRmllbGQ+IHtcblx0bGV0IHNlbGVjdGlvbkZpZWxkczogUmVjb3JkPHN0cmluZywgRmlsdGVyRmllbGQ+ID0ge307XG5cdGlmIChwcm9wZXJ0eVBhdGhzKSB7XG5cdFx0cHJvcGVydHlQYXRocy5mb3JFYWNoKChwcm9wZXJ0eVBhdGg6IHN0cmluZykgPT4ge1xuXHRcdFx0bGV0IGxvY2FsU2VsZWN0aW9uRmllbGRzOiBSZWNvcmQ8c3RyaW5nLCBGaWx0ZXJGaWVsZD47XG5cblx0XHRcdGNvbnN0IHByb3BlcnR5OiBQcm9wZXJ0eSB8IE5hdmlnYXRpb25Qcm9wZXJ0eSA9IGVudGl0eVR5cGUucmVzb2x2ZVBhdGgocHJvcGVydHlQYXRoKTtcblx0XHRcdGlmIChwcm9wZXJ0eSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGlmIChwcm9wZXJ0eS5fdHlwZSA9PT0gXCJOYXZpZ2F0aW9uUHJvcGVydHlcIikge1xuXHRcdFx0XHQvLyBoYW5kbGUgbmF2aWdhdGlvbiBwcm9wZXJ0aWVzXG5cdFx0XHRcdGxvY2FsU2VsZWN0aW9uRmllbGRzID0gX2dldFNlbGVjdGlvbkZpZWxkcyhcblx0XHRcdFx0XHRlbnRpdHlUeXBlLFxuXHRcdFx0XHRcdHByb3BlcnR5UGF0aCxcblx0XHRcdFx0XHRwcm9wZXJ0eS50YXJnZXRUeXBlLmVudGl0eVByb3BlcnRpZXMsXG5cdFx0XHRcdFx0aW5jbHVkZUhpZGRlbixcblx0XHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0XG5cdFx0XHRcdCk7XG5cdFx0XHR9IGVsc2UgaWYgKHByb3BlcnR5LnRhcmdldFR5cGUgIT09IHVuZGVmaW5lZCAmJiBwcm9wZXJ0eS50YXJnZXRUeXBlLl90eXBlID09PSBcIkNvbXBsZXhUeXBlXCIpIHtcblx0XHRcdFx0Ly8gaGFuZGxlIENvbXBsZXhUeXBlIHByb3BlcnRpZXNcblx0XHRcdFx0bG9jYWxTZWxlY3Rpb25GaWVsZHMgPSBfZ2V0U2VsZWN0aW9uRmllbGRzKFxuXHRcdFx0XHRcdGVudGl0eVR5cGUsXG5cdFx0XHRcdFx0cHJvcGVydHlQYXRoLFxuXHRcdFx0XHRcdHByb3BlcnR5LnRhcmdldFR5cGUucHJvcGVydGllcyxcblx0XHRcdFx0XHRpbmNsdWRlSGlkZGVuLFxuXHRcdFx0XHRcdGNvbnZlcnRlckNvbnRleHRcblx0XHRcdFx0KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IG5hdmlnYXRpb25QYXRoID0gcHJvcGVydHlQYXRoLmluY2x1ZGVzKFwiL1wiKSA/IHByb3BlcnR5UGF0aC5zcGxpdChcIi9cIikuc3BsaWNlKDAsIDEpLmpvaW4oXCIvXCIpIDogXCJcIjtcblx0XHRcdFx0bG9jYWxTZWxlY3Rpb25GaWVsZHMgPSBfZ2V0U2VsZWN0aW9uRmllbGRzKGVudGl0eVR5cGUsIG5hdmlnYXRpb25QYXRoLCBbcHJvcGVydHldLCBpbmNsdWRlSGlkZGVuLCBjb252ZXJ0ZXJDb250ZXh0KTtcblx0XHRcdH1cblxuXHRcdFx0c2VsZWN0aW9uRmllbGRzID0ge1xuXHRcdFx0XHQuLi5zZWxlY3Rpb25GaWVsZHMsXG5cdFx0XHRcdC4uLmxvY2FsU2VsZWN0aW9uRmllbGRzXG5cdFx0XHR9O1xuXHRcdH0pO1xuXHR9XG5cdHJldHVybiBzZWxlY3Rpb25GaWVsZHM7XG59O1xuXG5jb25zdCBfZ2V0RmlsdGVyRmllbGQgPSBmdW5jdGlvbiAoXG5cdGZpbHRlckZpZWxkczogUmVjb3JkPHN0cmluZywgRmlsdGVyRmllbGQ+LFxuXHRwcm9wZXJ0eVBhdGg6IHN0cmluZyxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCxcblx0ZW50aXR5VHlwZTogRW50aXR5VHlwZVxuKTogRmlsdGVyRmllbGQgfCB1bmRlZmluZWQge1xuXHRsZXQgZmlsdGVyRmllbGQ6IEZpbHRlckZpZWxkIHwgdW5kZWZpbmVkID0gZmlsdGVyRmllbGRzW3Byb3BlcnR5UGF0aF07XG5cdGNvbnN0IGF2YWlsYWJpbGl0eSA9IGZpbHRlckZpZWxkICYmIGZpbHRlckZpZWxkLmF2YWlsYWJpbGl0eTtcblx0aWYgKGZpbHRlckZpZWxkKSB7XG5cdFx0ZGVsZXRlIGZpbHRlckZpZWxkc1twcm9wZXJ0eVBhdGhdO1xuXHR9IGVsc2Uge1xuXHRcdGZpbHRlckZpZWxkID0gX2NyZWF0ZUZpbHRlclNlbGVjdGlvbkZpZWxkKGVudGl0eVR5cGUsIGVudGl0eVR5cGUucmVzb2x2ZVBhdGgocHJvcGVydHlQYXRoKSwgcHJvcGVydHlQYXRoLCB0cnVlLCBjb252ZXJ0ZXJDb250ZXh0KTtcblx0fVxuXHRpZiAoIWZpbHRlckZpZWxkKSB7XG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXREaWFnbm9zdGljcygpPy5hZGRJc3N1ZShJc3N1ZUNhdGVnb3J5LkFubm90YXRpb24sIElzc3VlU2V2ZXJpdHkuSGlnaCwgSXNzdWVUeXBlLk1JU1NJTkdfU0VMRUNUSU9ORklFTEQpO1xuXHR9XG5cdC8vIGRlZmluZWQgU2VsZWN0aW9uRmllbGRzIGFyZSBhdmFpbGFibGUgYnkgZGVmYXVsdFxuXHRpZiAoZmlsdGVyRmllbGQpIHtcblx0XHRmaWx0ZXJGaWVsZC5hdmFpbGFiaWxpdHkgPSBhdmFpbGFiaWxpdHkgPT09IEF2YWlsYWJpbGl0eVR5cGUuSGlkZGVuID8gQXZhaWxhYmlsaXR5VHlwZS5IaWRkZW4gOiBBdmFpbGFiaWxpdHlUeXBlLkRlZmF1bHQ7XG5cdFx0ZmlsdGVyRmllbGQuaXNQYXJhbWV0ZXIgPSAhIWVudGl0eVR5cGUuYW5ub3RhdGlvbnM/LkNvbW1vbj8uUmVzdWx0Q29udGV4dDtcblx0fVxuXHRyZXR1cm4gZmlsdGVyRmllbGQ7XG59O1xuXG5jb25zdCBfZ2V0RGVmYXVsdEZpbHRlckZpZWxkcyA9IGZ1bmN0aW9uIChcblx0YVNlbGVjdE9wdGlvbnM6IGFueVtdLFxuXHRlbnRpdHlUeXBlOiBFbnRpdHlUeXBlLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LFxuXHRleGNsdWRlZEZpbHRlclByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+LFxuXHRhbm5vdGF0ZWRTZWxlY3Rpb25GaWVsZHM6IFByb3BlcnR5UGF0aFtdXG4pOiBGaWx0ZXJGaWVsZFtdIHtcblx0Y29uc3Qgc2VsZWN0aW9uRmllbGRzOiBGaWx0ZXJGaWVsZFtdID0gW107XG5cdGNvbnN0IFVJU2VsZWN0aW9uRmllbGRzOiBhbnkgPSB7fTtcblx0Y29uc3QgcHJvcGVydGllcyA9IGVudGl0eVR5cGUuZW50aXR5UHJvcGVydGllcztcblx0Ly8gVXNpbmcgZW50aXR5VHlwZSBpbnN0ZWFkIG9mIGVudGl0eVNldFxuXHRhbm5vdGF0ZWRTZWxlY3Rpb25GaWVsZHM/LmZvckVhY2goKFNlbGVjdGlvbkZpZWxkKSA9PiB7XG5cdFx0VUlTZWxlY3Rpb25GaWVsZHNbU2VsZWN0aW9uRmllbGQudmFsdWVdID0gdHJ1ZTtcblx0fSk7XG5cdGlmIChhU2VsZWN0T3B0aW9ucyAmJiBhU2VsZWN0T3B0aW9ucy5sZW5ndGggPiAwKSB7XG5cdFx0YVNlbGVjdE9wdGlvbnM/LmZvckVhY2goKHNlbGVjdE9wdGlvbjogU2VsZWN0T3B0aW9uVHlwZSkgPT4ge1xuXHRcdFx0Y29uc3QgcHJvcGVydHlOYW1lOiBhbnkgPSBzZWxlY3RPcHRpb24uUHJvcGVydHlOYW1lO1xuXHRcdFx0Y29uc3Qgc1Byb3BlcnR5UGF0aDogc3RyaW5nID0gcHJvcGVydHlOYW1lLnZhbHVlO1xuXHRcdFx0Y29uc3QgVUlTZWxlY3Rpb25GaWVsZHM6IGFueSA9IHt9O1xuXHRcdFx0YW5ub3RhdGVkU2VsZWN0aW9uRmllbGRzPy5mb3JFYWNoKChTZWxlY3Rpb25GaWVsZCkgPT4ge1xuXHRcdFx0XHRVSVNlbGVjdGlvbkZpZWxkc1tTZWxlY3Rpb25GaWVsZC52YWx1ZV0gPSB0cnVlO1xuXHRcdFx0fSk7XG5cdFx0XHRpZiAoIShzUHJvcGVydHlQYXRoIGluIGV4Y2x1ZGVkRmlsdGVyUHJvcGVydGllcykpIHtcblx0XHRcdFx0aWYgKCEoc1Byb3BlcnR5UGF0aCBpbiBVSVNlbGVjdGlvbkZpZWxkcykpIHtcblx0XHRcdFx0XHRjb25zdCBGaWx0ZXJGaWVsZDogRmlsdGVyRmllbGQgfCB1bmRlZmluZWQgPSBnZXRGaWx0ZXJGaWVsZChzUHJvcGVydHlQYXRoLCBjb252ZXJ0ZXJDb250ZXh0LCBlbnRpdHlUeXBlKTtcblx0XHRcdFx0XHRpZiAoRmlsdGVyRmllbGQpIHtcblx0XHRcdFx0XHRcdHNlbGVjdGlvbkZpZWxkcy5wdXNoKEZpbHRlckZpZWxkKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblx0fSBlbHNlIGlmIChwcm9wZXJ0aWVzKSB7XG5cdFx0cHJvcGVydGllcy5mb3JFYWNoKChwcm9wZXJ0eTogUHJvcGVydHkpID0+IHtcblx0XHRcdGNvbnN0IGRlZmF1bHRGaWx0ZXJWYWx1ZSA9IHByb3BlcnR5LmFubm90YXRpb25zPy5Db21tb24/LkZpbHRlckRlZmF1bHRWYWx1ZTtcblx0XHRcdGNvbnN0IFByb3BlcnR5UGF0aCA9IHByb3BlcnR5Lm5hbWU7XG5cdFx0XHRpZiAoIShQcm9wZXJ0eVBhdGggaW4gZXhjbHVkZWRGaWx0ZXJQcm9wZXJ0aWVzKSkge1xuXHRcdFx0XHRpZiAoZGVmYXVsdEZpbHRlclZhbHVlICYmICEoUHJvcGVydHlQYXRoIGluIFVJU2VsZWN0aW9uRmllbGRzKSkge1xuXHRcdFx0XHRcdGNvbnN0IEZpbHRlckZpZWxkOiBGaWx0ZXJGaWVsZCB8IHVuZGVmaW5lZCA9IGdldEZpbHRlckZpZWxkKFByb3BlcnR5UGF0aCwgY29udmVydGVyQ29udGV4dCwgZW50aXR5VHlwZSk7XG5cdFx0XHRcdFx0aWYgKEZpbHRlckZpZWxkKSB7XG5cdFx0XHRcdFx0XHRzZWxlY3Rpb25GaWVsZHMucHVzaChGaWx0ZXJGaWVsZCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblx0cmV0dXJuIHNlbGVjdGlvbkZpZWxkcztcbn07XG5cbi8qKlxuICogR2V0IGFsbCBwYXJhbWV0ZXIgZmlsdGVyIGZpZWxkcyBpbiBjYXNlIG9mIGEgcGFyYW1ldGVyaXplZCBzZXJ2aWNlLlxuICogQHBhcmFtIHtDb252ZXJ0ZXJDb250ZXh0fSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcmV0dXJucyB7RmlsdGVyRmllbGRbXX0gQW4gYXJyYXkgb2YgcGFyYW1ldGVyIGZpbHRlcmZpZWxkc1xuICovXG5mdW5jdGlvbiBfZ2V0UGFyYW1ldGVyRmllbGRzKGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQpOiBGaWx0ZXJGaWVsZFtdIHtcblx0Y29uc3QgZGF0YU1vZGVsT2JqZWN0UGF0aCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpO1xuXHRjb25zdCBwYXJhbWV0ZXJFbnRpdHlUeXBlID0gZGF0YU1vZGVsT2JqZWN0UGF0aC5zdGFydGluZ0VudGl0eVNldC5lbnRpdHlUeXBlO1xuXHRjb25zdCBpc1BhcmFtZXRlcml6ZWQgPSAhIXBhcmFtZXRlckVudGl0eVR5cGUuYW5ub3RhdGlvbnM/LkNvbW1vbj8uUmVzdWx0Q29udGV4dCAmJiAhZGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRFbnRpdHlTZXQ7XG5cdGNvbnN0IHBhcmFtZXRlckNvbnZlcnRlckNvbnRleHQgPVxuXHRcdGlzUGFyYW1ldGVyaXplZCAmJiBjb252ZXJ0ZXJDb250ZXh0LmdldENvbnZlcnRlckNvbnRleHRGb3IoXCIvXCIgKyBkYXRhTW9kZWxPYmplY3RQYXRoLnN0YXJ0aW5nRW50aXR5U2V0Lm5hbWUpO1xuXG5cdGNvbnN0IHBhcmFtZXRlckZpZWxkcyA9IChcblx0XHRwYXJhbWV0ZXJDb252ZXJ0ZXJDb250ZXh0XG5cdFx0XHQ/IHBhcmFtZXRlckVudGl0eVR5cGUuZW50aXR5UHJvcGVydGllcy5tYXAoZnVuY3Rpb24gKHByb3BlcnR5KSB7XG5cdFx0XHRcdFx0cmV0dXJuIF9nZXRGaWx0ZXJGaWVsZChcblx0XHRcdFx0XHRcdHt9IGFzIFJlY29yZDxzdHJpbmcsIEZpbHRlckZpZWxkPixcblx0XHRcdFx0XHRcdHByb3BlcnR5Lm5hbWUsXG5cdFx0XHRcdFx0XHRwYXJhbWV0ZXJDb252ZXJ0ZXJDb250ZXh0LFxuXHRcdFx0XHRcdFx0cGFyYW1ldGVyRW50aXR5VHlwZVxuXHRcdFx0XHRcdCk7XG5cdFx0XHQgIH0pXG5cdFx0XHQ6IFtdXG5cdCkgYXMgRmlsdGVyRmllbGRbXTtcblxuXHRyZXR1cm4gcGFyYW1ldGVyRmllbGRzO1xufVxuXG4vKipcbiAqIERldGVybWluZXMgaWYgdGhlIEZpbHRlckJhciBzZWFyY2ggZmllbGQgaXMgaGlkZGVuIG9yIG5vdC5cbiAqXG4gKiBAcGFyYW0ge1RhYmxlVmlzdWFsaXphdGlvbltdfSBsaXN0UmVwb3J0VGFibGVzIFRoZSBsaXN0IHJlcG9ydCB0YWJsZXNcbiAqIEBwYXJhbSB7Q2hhcnRWaXN1YWxpemF0aW9uW119IGNoYXJ0cyBUaGUgQUxQIGNoYXJ0c1xuICogQHBhcmFtIHtDb252ZXJ0ZXJDb250ZXh0fSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHJldHVybnMge2Jvb2xlYW59IFRoZSBpbmZvcm1hdGlvbiBpZiB0aGUgRmlsdGVyQmFyIHNlYXJjaCBmaWVsZCBpcyBoaWRkZW4gb3Igbm90XG4gKi9cbmV4cG9ydCBjb25zdCBnZXRGaWx0ZXJCYXJoaWRlQmFzaWNTZWFyY2ggPSBmdW5jdGlvbiAoXG5cdGxpc3RSZXBvcnRUYWJsZXM6IFRhYmxlVmlzdWFsaXphdGlvbltdLFxuXHRjaGFydHM6IENoYXJ0VmlzdWFsaXphdGlvbltdLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0XG4pOiBib29sZWFuIHtcblx0Ly8gQ2hlY2sgaWYgY2hhcnRzIGFsbG93IHNlYXJjaFxuXHRjb25zdCBub1NlYXJjaEluQ2hhcnRzID0gY2hhcnRzLmxlbmd0aCA9PT0gMCB8fCBjaGFydHMuZXZlcnkoKGNoYXJ0KSA9PiAhY2hhcnQuYXBwbHlTdXBwb3J0ZWQuZW5hYmxlU2VhcmNoKTtcblxuXHQvLyBDaGVjayBpZiBhbGwgdGFibGVzIGFyZSBhbmFseXRpY2FsIGFuZCBub25lIG9mIHRoZW0gYWxsb3cgZm9yIHNlYXJjaFxuXHRjb25zdCBub1NlYXJjaEluVGFibGVzID1cblx0XHRsaXN0UmVwb3J0VGFibGVzLmxlbmd0aCA9PT0gMCB8fCBsaXN0UmVwb3J0VGFibGVzLmV2ZXJ5KCh0YWJsZSkgPT4gdGFibGUuZW5hYmxlQW5hbHl0aWNzICYmICF0YWJsZS5lbmFibGVBbmFseXRpY3NTZWFyY2gpO1xuXG5cdGNvbnN0IGNvbnRleHRQYXRoID0gY29udmVydGVyQ29udGV4dC5nZXRDb250ZXh0UGF0aCgpO1xuXHRpZiAoY29udGV4dFBhdGggJiYgbm9TZWFyY2hJbkNoYXJ0cyAmJiBub1NlYXJjaEluVGFibGVzKSB7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG59O1xuXG4vKipcbiAqIFJldHJpZXZlcyBmaWx0ZXIgZmllbGRzIGZyb20gdGhlIG1hbmlmZXN0LlxuICpcbiAqIEBwYXJhbSBlbnRpdHlUeXBlIFRoZSBjdXJyZW50IGVudGl0eVR5cGVcbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIEN1c3RvbUVsZW1lbnRGaWx0ZXJGaWVsZD59IFRoZSBmaWx0ZXIgZmllbGRzIGRlZmluZWQgaW4gdGhlIG1hbmlmZXN0XG4gKi9cbmV4cG9ydCBjb25zdCBnZXRNYW5pZmVzdEZpbHRlckZpZWxkcyA9IGZ1bmN0aW9uIChcblx0ZW50aXR5VHlwZTogRW50aXR5VHlwZSxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dFxuKTogUmVjb3JkPHN0cmluZywgQ3VzdG9tRWxlbWVudEZpbHRlckZpZWxkPiB7XG5cdGNvbnN0IGZiQ29uZmlnOiBGaWx0ZXJNYW5pZmVzdENvbmZpZ3VyYXRpb24gPSBjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0V3JhcHBlcigpLmdldEZpbHRlckNvbmZpZ3VyYXRpb24oKTtcblx0Y29uc3QgZGVmaW5lZEZpbHRlckZpZWxkczogUmVjb3JkPHN0cmluZywgRmlsdGVyRmllbGRNYW5pZmVzdENvbmZpZ3VyYXRpb24+ID0gZmJDb25maWc/LmZpbHRlckZpZWxkcyB8fCB7fTtcblx0Y29uc3Qgc2VsZWN0aW9uRmllbGRzOiBSZWNvcmQ8c3RyaW5nLCBGaWx0ZXJGaWVsZD4gPSBfZ2V0U2VsZWN0aW9uRmllbGRzQnlQYXRoKFxuXHRcdGVudGl0eVR5cGUsXG5cdFx0T2JqZWN0LmtleXMoZGVmaW5lZEZpbHRlckZpZWxkcykubWFwKChrZXkpID0+IEtleUhlbHBlci5nZXRQYXRoRnJvbVNlbGVjdGlvbkZpZWxkS2V5KGtleSkpLFxuXHRcdHRydWUsXG5cdFx0Y29udmVydGVyQ29udGV4dFxuXHQpO1xuXHRjb25zdCBmaWx0ZXJGaWVsZHM6IFJlY29yZDxzdHJpbmcsIEN1c3RvbUVsZW1lbnRGaWx0ZXJGaWVsZD4gPSB7fTtcblxuXHRmb3IgKGNvbnN0IHNLZXkgaW4gZGVmaW5lZEZpbHRlckZpZWxkcykge1xuXHRcdGNvbnN0IGZpbHRlckZpZWxkID0gZGVmaW5lZEZpbHRlckZpZWxkc1tzS2V5XTtcblx0XHRjb25zdCBwcm9wZXJ0eU5hbWUgPSBLZXlIZWxwZXIuZ2V0UGF0aEZyb21TZWxlY3Rpb25GaWVsZEtleShzS2V5KTtcblx0XHRjb25zdCBzZWxlY3Rpb25GaWVsZCA9IHNlbGVjdGlvbkZpZWxkc1twcm9wZXJ0eU5hbWVdO1xuXHRcdGNvbnN0IHR5cGUgPSBmaWx0ZXJGaWVsZC50eXBlID09PSBcIlNsb3RcIiA/IGZpbHRlckZpZWxkVHlwZS5TbG90IDogZmlsdGVyRmllbGRUeXBlLkRlZmF1bHQ7XG5cdFx0Y29uc3QgdmlzdWFsRmlsdGVyID1cblx0XHRcdGZpbHRlckZpZWxkICYmIGZpbHRlckZpZWxkPy52aXN1YWxGaWx0ZXJcblx0XHRcdFx0PyBnZXRWaXN1YWxGaWx0ZXJzKGVudGl0eVR5cGUsIGNvbnZlcnRlckNvbnRleHQsIHNLZXksIGRlZmluZWRGaWx0ZXJGaWVsZHMpXG5cdFx0XHRcdDogdW5kZWZpbmVkO1xuXHRcdGZpbHRlckZpZWxkc1tzS2V5XSA9IHtcblx0XHRcdGtleTogc0tleSxcblx0XHRcdHR5cGU6IHR5cGUsXG5cdFx0XHRhbm5vdGF0aW9uUGF0aDogc2VsZWN0aW9uRmllbGQ/LmFubm90YXRpb25QYXRoLFxuXHRcdFx0Y29uZGl0aW9uUGF0aDogc2VsZWN0aW9uRmllbGQ/LmNvbmRpdGlvblBhdGggfHwgcHJvcGVydHlOYW1lLFxuXHRcdFx0dGVtcGxhdGU6IGZpbHRlckZpZWxkLnRlbXBsYXRlLFxuXHRcdFx0bGFiZWw6IGZpbHRlckZpZWxkLmxhYmVsLFxuXHRcdFx0cG9zaXRpb246IGZpbHRlckZpZWxkLnBvc2l0aW9uIHx8IHsgcGxhY2VtZW50OiBQbGFjZW1lbnQuQWZ0ZXIgfSxcblx0XHRcdGF2YWlsYWJpbGl0eTogZmlsdGVyRmllbGQuYXZhaWxhYmlsaXR5IHx8IEF2YWlsYWJpbGl0eVR5cGUuRGVmYXVsdCxcblx0XHRcdHNldHRpbmdzOiBmaWx0ZXJGaWVsZC5zZXR0aW5ncyxcblx0XHRcdHZpc3VhbEZpbHRlcjogdmlzdWFsRmlsdGVyXG5cdFx0fTtcblx0fVxuXHRyZXR1cm4gZmlsdGVyRmllbGRzO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEZpbHRlckZpZWxkID0gZnVuY3Rpb24gKHByb3BlcnR5UGF0aDogc3RyaW5nLCBjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LCBlbnRpdHlUeXBlOiBFbnRpdHlUeXBlKSB7XG5cdHJldHVybiBfZ2V0RmlsdGVyRmllbGQoe30sIHByb3BlcnR5UGF0aCwgY29udmVydGVyQ29udGV4dCwgZW50aXR5VHlwZSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0RmlsdGVyUmVzdHJpY3Rpb25zID0gZnVuY3Rpb24gKG9GaWx0ZXJSZXN0cmljdGlvbnNBbm5vdGF0aW9uOiBhbnksIHNSZXN0cmljdGlvbjogYW55KSB7XG5cdGlmIChzUmVzdHJpY3Rpb24gPT09IFwiUmVxdWlyZWRQcm9wZXJ0aWVzXCIgfHwgc1Jlc3RyaWN0aW9uID09PSBcIk5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzXCIpIHtcblx0XHRsZXQgYVByb3BzID0gW107XG5cdFx0aWYgKG9GaWx0ZXJSZXN0cmljdGlvbnNBbm5vdGF0aW9uICYmIG9GaWx0ZXJSZXN0cmljdGlvbnNBbm5vdGF0aW9uW3NSZXN0cmljdGlvbl0pIHtcblx0XHRcdGFQcm9wcyA9IG9GaWx0ZXJSZXN0cmljdGlvbnNBbm5vdGF0aW9uW3NSZXN0cmljdGlvbl0ubWFwKGZ1bmN0aW9uIChvUHJvcGVydHk6IGFueSkge1xuXHRcdFx0XHRyZXR1cm4gb1Byb3BlcnR5LiRQcm9wZXJ0eVBhdGggfHwgb1Byb3BlcnR5LnZhbHVlO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdHJldHVybiBhUHJvcHM7XG5cdH0gZWxzZSBpZiAoc1Jlc3RyaWN0aW9uID09PSBcIkZpbHRlckFsbG93ZWRFeHByZXNzaW9uc1wiKSB7XG5cdFx0Y29uc3QgbUFsbG93ZWRFeHByZXNzaW9ucyA9IHt9IGFzIGFueTtcblx0XHRpZiAob0ZpbHRlclJlc3RyaWN0aW9uc0Fubm90YXRpb24gJiYgb0ZpbHRlclJlc3RyaWN0aW9uc0Fubm90YXRpb24uRmlsdGVyRXhwcmVzc2lvblJlc3RyaWN0aW9ucykge1xuXHRcdFx0b0ZpbHRlclJlc3RyaWN0aW9uc0Fubm90YXRpb24uRmlsdGVyRXhwcmVzc2lvblJlc3RyaWN0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChvUHJvcGVydHk6IGFueSkge1xuXHRcdFx0XHQvL1NpbmdsZVZhbHVlIHwgTXVsdGlWYWx1ZSB8IFNpbmdsZVJhbmdlIHwgTXVsdGlSYW5nZSB8IFNlYXJjaEV4cHJlc3Npb24gfCBNdWx0aVJhbmdlT3JTZWFyY2hFeHByZXNzaW9uXG5cdFx0XHRcdGlmIChtQWxsb3dlZEV4cHJlc3Npb25zW29Qcm9wZXJ0eS5Qcm9wZXJ0eS52YWx1ZV0pIHtcblx0XHRcdFx0XHRtQWxsb3dlZEV4cHJlc3Npb25zW29Qcm9wZXJ0eS5Qcm9wZXJ0eS52YWx1ZV0ucHVzaChvUHJvcGVydHkuQWxsb3dlZEV4cHJlc3Npb25zKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRtQWxsb3dlZEV4cHJlc3Npb25zW29Qcm9wZXJ0eS5Qcm9wZXJ0eS52YWx1ZV0gPSBbb1Byb3BlcnR5LkFsbG93ZWRFeHByZXNzaW9uc107XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH1cblx0XHRyZXR1cm4gbUFsbG93ZWRFeHByZXNzaW9ucztcblx0fVxuXHRyZXR1cm4gb0ZpbHRlclJlc3RyaWN0aW9uc0Fubm90YXRpb247XG59O1xuXG5jb25zdCBnZXRTZWFyY2hGaWx0ZXJQcm9wZXJ0eUluZm8gPSBmdW5jdGlvbiAoKSB7XG5cdHJldHVybiB7XG5cdFx0bmFtZTogXCIkc2VhcmNoXCIsXG5cdFx0cGF0aDogXCIkc2VhcmNoXCIsXG5cdFx0ZGF0YVR5cGU6IHNTdHJpbmdEYXRhVHlwZSxcblx0XHRtYXhDb25kaXRpb25zOiAxXG5cdH07XG59O1xuXG5jb25zdCBnZXRFZGl0U3RhdGVGaWx0ZXJQcm9wZXJ0eUluZm8gPSBmdW5jdGlvbiAoKSB7XG5cdHJldHVybiB7XG5cdFx0bmFtZTogXCIkZWRpdFN0YXRlXCIsXG5cdFx0cGF0aDogXCIkZWRpdFN0YXRlXCIsXG5cdFx0Z3JvdXBMYWJlbDogXCJcIixcblx0XHRncm91cDogXCJcIixcblx0XHRkYXRhVHlwZTogc1N0cmluZ0RhdGFUeXBlLFxuXHRcdGhpZGRlbkZpbHRlcjogZmFsc2Vcblx0fTtcbn07XG5cbmNvbnN0IGdldFNlYXJjaFJlc3RyaWN0aW9ucyA9IGZ1bmN0aW9uIChjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0KSB7XG5cdHJldHVybiBjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVNldCgpPy5hbm5vdGF0aW9ucz8uQ2FwYWJpbGl0aWVzPy5TZWFyY2hSZXN0cmljdGlvbnM7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0TmF2aWdhdGlvblJlc3RyaWN0aW9ucyA9IGZ1bmN0aW9uIChjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LCBzTmF2aWdhdGlvblBhdGg6IHN0cmluZykge1xuXHRjb25zdCBvTmF2aWdhdGlvblJlc3RyaWN0aW9uczogYW55ID0gY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlTZXQoKT8uYW5ub3RhdGlvbnM/LkNhcGFiaWxpdGllcz8uTmF2aWdhdGlvblJlc3RyaWN0aW9ucztcblx0Y29uc3QgYVJlc3RyaWN0ZWRQcm9wZXJ0aWVzID0gb05hdmlnYXRpb25SZXN0cmljdGlvbnMgJiYgb05hdmlnYXRpb25SZXN0cmljdGlvbnMuUmVzdHJpY3RlZFByb3BlcnRpZXM7XG5cdHJldHVybiAoXG5cdFx0YVJlc3RyaWN0ZWRQcm9wZXJ0aWVzICYmXG5cdFx0YVJlc3RyaWN0ZWRQcm9wZXJ0aWVzLmZpbmQoZnVuY3Rpb24gKG9SZXN0cmljdGVkUHJvcGVydHk6IGFueSkge1xuXHRcdFx0cmV0dXJuIChcblx0XHRcdFx0b1Jlc3RyaWN0ZWRQcm9wZXJ0eSAmJlxuXHRcdFx0XHRvUmVzdHJpY3RlZFByb3BlcnR5Lk5hdmlnYXRpb25Qcm9wZXJ0eSAmJlxuXHRcdFx0XHQob1Jlc3RyaWN0ZWRQcm9wZXJ0eS5OYXZpZ2F0aW9uUHJvcGVydHkuJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGggPT09IHNOYXZpZ2F0aW9uUGF0aCB8fFxuXHRcdFx0XHRcdG9SZXN0cmljdGVkUHJvcGVydHkuTmF2aWdhdGlvblByb3BlcnR5LnZhbHVlID09PSBzTmF2aWdhdGlvblBhdGgpXG5cdFx0XHQpO1xuXHRcdH0pXG5cdCk7XG59O1xuXG5jb25zdCBfZmV0Y2hCYXNpY1Byb3BlcnR5SW5mbyA9IGZ1bmN0aW9uIChvRmlsdGVyRmllbGRJbmZvOiBhbnkpIHtcblx0cmV0dXJuIHtcblx0XHRrZXk6IG9GaWx0ZXJGaWVsZEluZm8ua2V5LFxuXHRcdGFubm90YXRpb25QYXRoOiBvRmlsdGVyRmllbGRJbmZvLmFubm90YXRpb25QYXRoLFxuXHRcdGNvbmRpdGlvblBhdGg6IG9GaWx0ZXJGaWVsZEluZm8uY29uZGl0aW9uUGF0aCxcblx0XHRuYW1lOiBvRmlsdGVyRmllbGRJbmZvLmNvbmRpdGlvblBhdGgsXG5cdFx0bGFiZWw6IG9GaWx0ZXJGaWVsZEluZm8ubGFiZWwsXG5cdFx0aGlkZGVuRmlsdGVyOiBvRmlsdGVyRmllbGRJbmZvLmF2YWlsYWJpbGl0eSA9PT0gXCJIaWRkZW5cIixcblx0XHRkaXNwbGF5OiBcIlZhbHVlXCIsXG5cdFx0aXNQYXJhbWV0ZXI6IG9GaWx0ZXJGaWVsZEluZm8uaXNQYXJhbWV0ZXIsXG5cdFx0Y2FzZVNlbnNpdGl2ZTogb0ZpbHRlckZpZWxkSW5mby5jYXNlU2Vuc2l0aXZlLFxuXHRcdGF2YWlsYWJpbGl0eTogb0ZpbHRlckZpZWxkSW5mby5hdmFpbGFiaWxpdHksXG5cdFx0cG9zaXRpb246IG9GaWx0ZXJGaWVsZEluZm8ucG9zaXRpb24sXG5cdFx0dHlwZTogb0ZpbHRlckZpZWxkSW5mby50eXBlLFxuXHRcdHRlbXBsYXRlOiBvRmlsdGVyRmllbGRJbmZvLnRlbXBsYXRlLFxuXHRcdG1lbnU6IG9GaWx0ZXJGaWVsZEluZm8ubWVudVxuXHR9O1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFNwZWNpZmljQWxsb3dlZEV4cHJlc3Npb24gPSBmdW5jdGlvbiAoYUV4cHJlc3Npb25zOiBhbnkpIHtcblx0Y29uc3QgYUFsbG93ZWRFeHByZXNzaW9uc1ByaW9yaXR5ID0gW1xuXHRcdFwiU2luZ2xlVmFsdWVcIixcblx0XHRcIk11bHRpVmFsdWVcIixcblx0XHRcIlNpbmdsZVJhbmdlXCIsXG5cdFx0XCJNdWx0aVJhbmdlXCIsXG5cdFx0XCJTZWFyY2hFeHByZXNzaW9uXCIsXG5cdFx0XCJNdWx0aVJhbmdlT3JTZWFyY2hFeHByZXNzaW9uXCJcblx0XTtcblxuXHRhRXhwcmVzc2lvbnMuc29ydChmdW5jdGlvbiAoYTogYW55LCBiOiBhbnkpIHtcblx0XHRyZXR1cm4gYUFsbG93ZWRFeHByZXNzaW9uc1ByaW9yaXR5LmluZGV4T2YoYSkgLSBhQWxsb3dlZEV4cHJlc3Npb25zUHJpb3JpdHkuaW5kZXhPZihiKTtcblx0fSk7XG5cblx0cmV0dXJuIGFFeHByZXNzaW9uc1swXTtcbn07XG5cbmV4cG9ydCBjb25zdCBkaXNwbGF5TW9kZSA9IGZ1bmN0aW9uIChvUHJvcGVydHlBbm5vdGF0aW9uczogYW55LCBvQ29sbGVjdGlvbkFubm90YXRpb25zOiBhbnkpIHtcblx0Y29uc3Qgb1RleHRBbm5vdGF0aW9uID0gb1Byb3BlcnR5QW5ub3RhdGlvbnM/LkNvbW1vbj8uVGV4dCxcblx0XHRvVGV4dEFycmFuZ21lbnRBbm5vdGF0aW9uID1cblx0XHRcdG9UZXh0QW5ub3RhdGlvbiAmJlxuXHRcdFx0KChvUHJvcGVydHlBbm5vdGF0aW9ucyAmJiBvUHJvcGVydHlBbm5vdGF0aW9ucz8uQ29tbW9uPy5UZXh0Py5hbm5vdGF0aW9ucz8uVUk/LlRleHRBcnJhbmdlbWVudCkgfHxcblx0XHRcdFx0KG9Db2xsZWN0aW9uQW5ub3RhdGlvbnMgJiYgb0NvbGxlY3Rpb25Bbm5vdGF0aW9ucz8uVUk/LlRleHRBcnJhbmdlbWVudCkpO1xuXG5cdGlmIChvVGV4dEFycmFuZ21lbnRBbm5vdGF0aW9uKSB7XG5cdFx0aWYgKG9UZXh0QXJyYW5nbWVudEFubm90YXRpb24udmFsdWVPZigpID09PSBcIlVJLlRleHRBcnJhbmdlbWVudFR5cGUvVGV4dE9ubHlcIikge1xuXHRcdFx0cmV0dXJuIFwiRGVzY3JpcHRpb25cIjtcblx0XHR9IGVsc2UgaWYgKG9UZXh0QXJyYW5nbWVudEFubm90YXRpb24udmFsdWVPZigpID09PSBcIlVJLlRleHRBcnJhbmdlbWVudFR5cGUvVGV4dExhc3RcIikge1xuXHRcdFx0cmV0dXJuIFwiVmFsdWVEZXNjcmlwdGlvblwiO1xuXHRcdH1cblx0XHRyZXR1cm4gXCJEZXNjcmlwdGlvblZhbHVlXCI7IC8vVGV4dEZpcnN0XG5cdH1cblx0cmV0dXJuIG9UZXh0QW5ub3RhdGlvbiA/IFwiRGVzY3JpcHRpb25WYWx1ZVwiIDogXCJWYWx1ZVwiO1xufTtcblxuY29uc3QgX2ZldGNoUHJvcGVydHlJbmZvID0gZnVuY3Rpb24gKGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsIG9GaWx0ZXJGaWVsZEluZm86IGFueSwgb1R5cGVDb25maWc6IGFueSkge1xuXHRsZXQgb1Byb3BlcnR5SW5mbyA9IF9mZXRjaEJhc2ljUHJvcGVydHlJbmZvKG9GaWx0ZXJGaWVsZEluZm8pO1xuXHRjb25zdCBzQW5ub3RhdGlvblBhdGggPSBvRmlsdGVyRmllbGRJbmZvLmFubm90YXRpb25QYXRoO1xuXG5cdGlmICghc0Fubm90YXRpb25QYXRoKSB7XG5cdFx0cmV0dXJuIG9Qcm9wZXJ0eUluZm87XG5cdH1cblx0Y29uc3QgdGFyZ2V0UHJvcGVydHlPYmplY3QgPSBjb252ZXJ0ZXJDb250ZXh0LmdldENvbnZlcnRlckNvbnRleHRGb3Ioc0Fubm90YXRpb25QYXRoKS5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCkudGFyZ2V0T2JqZWN0O1xuXG5cdGNvbnN0IG9Qcm9wZXJ0eUFubm90YXRpb25zID0gdGFyZ2V0UHJvcGVydHlPYmplY3Q/LmFubm90YXRpb25zO1xuXHRjb25zdCBvQ29sbGVjdGlvbkFubm90YXRpb25zID0gY29udmVydGVyQ29udGV4dD8uZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpLnRhcmdldE9iamVjdD8uYW5ub3RhdGlvbnM7XG5cblx0Y29uc3Qgb0Zvcm1hdE9wdGlvbnMgPSBvVHlwZUNvbmZpZy5mb3JtYXRPcHRpb25zO1xuXHRjb25zdCBvQ29uc3RyYWludHMgPSBvVHlwZUNvbmZpZy5jb25zdHJhaW50cztcblx0b1Byb3BlcnR5SW5mbyA9IE9iamVjdC5hc3NpZ24ob1Byb3BlcnR5SW5mbywge1xuXHRcdGZvcm1hdE9wdGlvbnM6IG9Gb3JtYXRPcHRpb25zLFxuXHRcdGNvbnN0cmFpbnRzOiBvQ29uc3RyYWludHMsXG5cdFx0ZGlzcGxheTogZGlzcGxheU1vZGUob1Byb3BlcnR5QW5ub3RhdGlvbnMsIG9Db2xsZWN0aW9uQW5ub3RhdGlvbnMpXG5cdH0pO1xuXHRyZXR1cm4gb1Byb3BlcnR5SW5mbztcbn07XG5cbmV4cG9ydCBjb25zdCBpc011bHRpVmFsdWUgPSBmdW5jdGlvbiAob1Byb3BlcnR5OiBhbnkpIHtcblx0bGV0IGJJc011bHRpVmFsdWUgPSB0cnVlO1xuXHQvL1NpbmdsZVZhbHVlIHwgTXVsdGlWYWx1ZSB8IFNpbmdsZVJhbmdlIHwgTXVsdGlSYW5nZSB8IFNlYXJjaEV4cHJlc3Npb24gfCBNdWx0aVJhbmdlT3JTZWFyY2hFeHByZXNzaW9uXG5cdHN3aXRjaCAob1Byb3BlcnR5LmZpbHRlckV4cHJlc3Npb24pIHtcblx0XHRjYXNlIFwiU2VhcmNoRXhwcmVzc2lvblwiOlxuXHRcdGNhc2UgXCJTaW5nbGVSYW5nZVwiOlxuXHRcdGNhc2UgXCJTaW5nbGVWYWx1ZVwiOlxuXHRcdFx0YklzTXVsdGlWYWx1ZSA9IGZhbHNlO1xuXHRcdFx0YnJlYWs7XG5cdFx0ZGVmYXVsdDpcblx0XHRcdGJyZWFrO1xuXHR9XG5cdGlmIChvUHJvcGVydHkudHlwZSAmJiBvUHJvcGVydHkudHlwZS5pbmRleE9mKFwiQm9vbGVhblwiKSA+IDApIHtcblx0XHRiSXNNdWx0aVZhbHVlID0gZmFsc2U7XG5cdH1cblx0cmV0dXJuIGJJc011bHRpVmFsdWU7XG59O1xuXG5jb25zdCBnZXRBbm5vdGF0ZWRTZWxlY3Rpb25GaWVsZERhdGEgPSBmdW5jdGlvbiAoXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdGxyVGFibGVzOiBUYWJsZVZpc3VhbGl6YXRpb25bXSA9IFtdLFxuXHRhbm5vdGF0aW9uUGF0aDogc3RyaW5nID0gXCJcIixcblx0aW5jbHVkZUhpZGRlbjogYm9vbGVhbiA9IGZhbHNlXG4pIHtcblx0Ly8gRmV0Y2ggYWxsIHNlbGVjdGlvblZhcmlhbnRzIGRlZmluZWQgaW4gdGhlIGRpZmZlcmVudCB2aXN1YWxpemF0aW9ucyBhbmQgZGlmZmVyZW50IHZpZXdzIChtdWx0aSB0YWJsZSBtb2RlKVxuXHRjb25zdCBzZWxlY3Rpb25WYXJpYW50czogU2VsZWN0aW9uVmFyaWFudENvbmZpZ3VyYXRpb25bXSA9IGdldFNlbGVjdGlvblZhcmlhbnRzKGxyVGFibGVzLCBjb252ZXJ0ZXJDb250ZXh0KTtcblxuXHQvLyBjcmVhdGUgYSBtYXAgb2YgcHJvcGVydGllcyB0byBiZSB1c2VkIGluIHNlbGVjdGlvbiB2YXJpYW50c1xuXHRjb25zdCBleGNsdWRlZEZpbHRlclByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+ID0gZ2V0RXhjbHVkZWRGaWx0ZXJQcm9wZXJ0aWVzKHNlbGVjdGlvblZhcmlhbnRzKTtcblx0Y29uc3QgZW50aXR5VHlwZSA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5VHlwZSgpO1xuXHQvL0ZpbHRlcnMgd2hpY2ggaGFzIHRvIGJlIGFkZGVkIHdoaWNoIGlzIHBhcnQgb2YgU1YvRGVmYXVsdCBhbm5vdGF0aW9ucyBidXQgbm90IHByZXNlbnQgaW4gdGhlIFNlbGVjdGlvbkZpZWxkc1xuXHRjb25zdCBhbm5vdGF0ZWRTZWxlY3Rpb25GaWVsZHMgPSAoKGFubm90YXRpb25QYXRoICYmIGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5VHlwZUFubm90YXRpb24oYW5ub3RhdGlvblBhdGgpPy5hbm5vdGF0aW9uKSB8fFxuXHRcdGVudGl0eVR5cGUuYW5ub3RhdGlvbnM/LlVJPy5TZWxlY3Rpb25GaWVsZHMgfHxcblx0XHRbXSkgYXMgUHJvcGVydHlQYXRoW107XG5cblx0Ly8gY3JlYXRlIGEgbWFwIG9mIGFsbCBwb3RlbnRpYWwgZmlsdGVyIGZpZWxkcyBiYXNlZCBvbi4uLlxuXHRjb25zdCBmaWx0ZXJGaWVsZHM6IFJlY29yZDxzdHJpbmcsIEZpbHRlckZpZWxkPiA9IHtcblx0XHQvLyAuLi5ub24gaGlkZGVuIHByb3BlcnRpZXMgb2YgdGhlIGVudGl0eVxuXHRcdC4uLl9nZXRTZWxlY3Rpb25GaWVsZHMoZW50aXR5VHlwZSwgXCJcIiwgZW50aXR5VHlwZS5lbnRpdHlQcm9wZXJ0aWVzLCBpbmNsdWRlSGlkZGVuLCBjb252ZXJ0ZXJDb250ZXh0KSxcblx0XHQvLyAuLi5hZGRpdGlvbmFsIG1hbmlmZXN0IGRlZmluZWQgbmF2aWdhdGlvbiBwcm9wZXJ0aWVzXG5cdFx0Li4uX2dldFNlbGVjdGlvbkZpZWxkc0J5UGF0aChcblx0XHRcdGVudGl0eVR5cGUsXG5cdFx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0V3JhcHBlcigpLmdldEZpbHRlckNvbmZpZ3VyYXRpb24oKS5uYXZpZ2F0aW9uUHJvcGVydGllcyxcblx0XHRcdGluY2x1ZGVIaWRkZW4sXG5cdFx0XHRjb252ZXJ0ZXJDb250ZXh0XG5cdFx0KVxuXHR9O1xuXHRsZXQgYVNlbGVjdE9wdGlvbnM6IGFueVtdID0gW107XG5cdGNvbnN0IHNlbGVjdGlvblZhcmlhbnQgPSBnZXRTZWxlY3Rpb25WYXJpYW50KGVudGl0eVR5cGUsIGNvbnZlcnRlckNvbnRleHQpO1xuXHRpZiAoc2VsZWN0aW9uVmFyaWFudCkge1xuXHRcdGFTZWxlY3RPcHRpb25zID0gc2VsZWN0aW9uVmFyaWFudC5TZWxlY3RPcHRpb25zO1xuXHR9XG5cblx0Y29uc3QgcHJvcGVydHlJbmZvRmllbGRzOiBhbnkgPVxuXHRcdGFubm90YXRlZFNlbGVjdGlvbkZpZWxkcz8ucmVkdWNlKChzZWxlY3Rpb25GaWVsZHM6IEZpbHRlckZpZWxkW10sIHNlbGVjdGlvbkZpZWxkKSA9PiB7XG5cdFx0XHRjb25zdCBwcm9wZXJ0eVBhdGggPSBzZWxlY3Rpb25GaWVsZC52YWx1ZTtcblx0XHRcdGlmICghKHByb3BlcnR5UGF0aCBpbiBleGNsdWRlZEZpbHRlclByb3BlcnRpZXMpKSB7XG5cdFx0XHRcdGNvbnN0IGZpbHRlckZpZWxkOiBGaWx0ZXJGaWVsZCB8IHVuZGVmaW5lZCA9IF9nZXRGaWx0ZXJGaWVsZChmaWx0ZXJGaWVsZHMsIHByb3BlcnR5UGF0aCwgY29udmVydGVyQ29udGV4dCwgZW50aXR5VHlwZSk7XG5cdFx0XHRcdGlmIChmaWx0ZXJGaWVsZCkge1xuXHRcdFx0XHRcdGZpbHRlckZpZWxkLmdyb3VwID0gXCJcIjtcblx0XHRcdFx0XHRmaWx0ZXJGaWVsZC5ncm91cExhYmVsID0gXCJcIjtcblx0XHRcdFx0XHRzZWxlY3Rpb25GaWVsZHMucHVzaChmaWx0ZXJGaWVsZCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiBzZWxlY3Rpb25GaWVsZHM7XG5cdFx0fSwgW10pIHx8IFtdO1xuXG5cdGNvbnN0IGRlZmF1bHRGaWx0ZXJGaWVsZHMgPSBfZ2V0RGVmYXVsdEZpbHRlckZpZWxkcyhcblx0XHRhU2VsZWN0T3B0aW9ucyxcblx0XHRlbnRpdHlUeXBlLFxuXHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0ZXhjbHVkZWRGaWx0ZXJQcm9wZXJ0aWVzLFxuXHRcdGFubm90YXRlZFNlbGVjdGlvbkZpZWxkc1xuXHQpO1xuXG5cdHJldHVybiB7XG5cdFx0ZXhjbHVkZWRGaWx0ZXJQcm9wZXJ0aWVzOiBleGNsdWRlZEZpbHRlclByb3BlcnRpZXMsXG5cdFx0ZW50aXR5VHlwZTogZW50aXR5VHlwZSxcblx0XHRhbm5vdGF0ZWRTZWxlY3Rpb25GaWVsZHM6IGFubm90YXRlZFNlbGVjdGlvbkZpZWxkcyxcblx0XHRmaWx0ZXJGaWVsZHM6IGZpbHRlckZpZWxkcyxcblx0XHRwcm9wZXJ0eUluZm9GaWVsZHM6IHByb3BlcnR5SW5mb0ZpZWxkcyxcblx0XHRkZWZhdWx0RmlsdGVyRmllbGRzOiBkZWZhdWx0RmlsdGVyRmllbGRzXG5cdH07XG59O1xuZXhwb3J0IGNvbnN0IHByb2Nlc3NTZWxlY3Rpb25GaWVsZHMgPSBmdW5jdGlvbiAoXG5cdHByb3BlcnR5SW5mb0ZpZWxkczogYW55LFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LFxuXHRkZWZhdWx0VmFsdWVQcm9wZXJ0eUZpZWxkcz86IGFueVxuKSB7XG5cdC8vZ2V0IFR5cGVDb25maWcgZnVuY3Rpb25cblx0Y29uc3Qgc2VsZWN0aW9uRmllbGRUeXBlczogYW55ID0gW107XG5cdGNvbnN0IGFUeXBlQ29uZmlnOiBhbnkgPSB7fTtcblx0Y29uc3QgX2ZuVHlwZUNvbmZpZyA9IGZ1bmN0aW9uIChwcm9wZXJ0eTogUHJvcGVydHksIGtleTogc3RyaW5nKSB7XG5cdFx0Y29uc3Qgb1R5cGVDb25maWcgPSBnZXRUeXBlQ29uZmlnKHByb3BlcnR5LCBwcm9wZXJ0eT8udHlwZSk7XG5cdFx0c2VsZWN0aW9uRmllbGRUeXBlcy5wdXNoKHByb3BlcnR5Py50eXBlKTtcblx0XHRpZiAoXG5cdFx0XHRwcm9wZXJ0eT8udHlwZSA9PT0gc0VkbVN0cmluZyAmJlxuXHRcdFx0KG9UeXBlQ29uZmlnLmNvbnN0cmFpbnRzLm51bGxhYmxlID09PSB1bmRlZmluZWQgfHwgb1R5cGVDb25maWcuY29uc3RyYWludHMubnVsbGFibGUgPT09IHRydWUpXG5cdFx0KSB7XG5cdFx0XHRvVHlwZUNvbmZpZy5mb3JtYXRPcHRpb25zLnBhcnNlS2VlcHNFbXB0eVN0cmluZyA9IGZhbHNlO1xuXHRcdH1cblx0XHRhVHlwZUNvbmZpZ1trZXldID0gb1R5cGVDb25maWc7XG5cdH07XG5cblx0aWYgKGRlZmF1bHRWYWx1ZVByb3BlcnR5RmllbGRzKSB7XG5cdFx0cHJvcGVydHlJbmZvRmllbGRzID0gcHJvcGVydHlJbmZvRmllbGRzLmNvbmNhdChkZWZhdWx0VmFsdWVQcm9wZXJ0eUZpZWxkcyk7XG5cdH1cblx0Ly9hZGQgdHlwZUNvbmZpZ1xuXHRwcm9wZXJ0eUluZm9GaWVsZHMuZm9yRWFjaChmdW5jdGlvbiAocGFyYW1ldGVyRmllbGQ6IGFueSkge1xuXHRcdGlmIChwYXJhbWV0ZXJGaWVsZC5hbm5vdGF0aW9uUGF0aCkge1xuXHRcdFx0Y29uc3QgcHJvcGVydHlDb252ZXJ0eUNvbnRleHQgPSBjb252ZXJ0ZXJDb250ZXh0LmdldENvbnZlcnRlckNvbnRleHRGb3IocGFyYW1ldGVyRmllbGQuYW5ub3RhdGlvblBhdGgpO1xuXHRcdFx0Y29uc3QgcHJvcGVydHlUYXJnZXRPYmplY3QgPSBwcm9wZXJ0eUNvbnZlcnR5Q29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCkudGFyZ2V0T2JqZWN0O1xuXHRcdFx0X2ZuVHlwZUNvbmZpZyhwcm9wZXJ0eVRhcmdldE9iamVjdCwgcGFyYW1ldGVyRmllbGQua2V5KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0c2VsZWN0aW9uRmllbGRUeXBlcy5wdXNoKHNFZG1TdHJpbmcpO1xuXHRcdFx0YVR5cGVDb25maWdbcGFyYW1ldGVyRmllbGQua2V5XSA9IHsgdHlwZTogc1N0cmluZ0RhdGFUeXBlIH07XG5cdFx0fVxuXHR9KTtcblxuXHQvLyBmaWx0ZXJSZXN0cmljdGlvbnNcblx0Y29uc3Qgb0ZpbHRlclJlc3RyaWN0aW9ucyA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0KCk/LmFubm90YXRpb25zPy5DYXBhYmlsaXRpZXM/LkZpbHRlclJlc3RyaWN0aW9ucztcblx0Y29uc3Qgb1JldCA9IHt9IGFzIGFueTtcblx0b1JldFtcIlJlcXVpcmVkUHJvcGVydGllc1wiXSA9IGdldEZpbHRlclJlc3RyaWN0aW9ucyhvRmlsdGVyUmVzdHJpY3Rpb25zLCBcIlJlcXVpcmVkUHJvcGVydGllc1wiKSB8fCBbXTtcblx0b1JldFtcIk5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzXCJdID0gZ2V0RmlsdGVyUmVzdHJpY3Rpb25zKG9GaWx0ZXJSZXN0cmljdGlvbnMsIFwiTm9uRmlsdGVyYWJsZVByb3BlcnRpZXNcIikgfHwgW107XG5cdG9SZXRbXCJGaWx0ZXJBbGxvd2VkRXhwcmVzc2lvbnNcIl0gPSBnZXRGaWx0ZXJSZXN0cmljdGlvbnMob0ZpbHRlclJlc3RyaWN0aW9ucywgXCJGaWx0ZXJBbGxvd2VkRXhwcmVzc2lvbnNcIikgfHwge307XG5cblx0Y29uc3Qgc0VudGl0eVNldFBhdGggPSBjb252ZXJ0ZXJDb250ZXh0LmdldENvbnRleHRQYXRoKCk7XG5cdGNvbnN0IGFQYXRoUGFydHMgPSBzRW50aXR5U2V0UGF0aC5zcGxpdChcIi9cIik7XG5cdGlmIChhUGF0aFBhcnRzLmxlbmd0aCA+IDIpIHtcblx0XHRjb25zdCBzTmF2aWdhdGlvblBhdGggPSBhUGF0aFBhcnRzW2FQYXRoUGFydHMubGVuZ3RoIC0gMV07XG5cdFx0YVBhdGhQYXJ0cy5zcGxpY2UoLTEsIDEpO1xuXHRcdGNvbnN0IG9OYXZpZ2F0aW9uUmVzdHJpY3Rpb25zID0gZ2V0TmF2aWdhdGlvblJlc3RyaWN0aW9ucyhjb252ZXJ0ZXJDb250ZXh0LCBzTmF2aWdhdGlvblBhdGgpO1xuXHRcdGNvbnN0IG9OYXZpZ2F0aW9uRmlsdGVyUmVzdHJpY3Rpb25zID0gb05hdmlnYXRpb25SZXN0cmljdGlvbnMgJiYgb05hdmlnYXRpb25SZXN0cmljdGlvbnMuRmlsdGVyUmVzdHJpY3Rpb25zO1xuXHRcdG9SZXQuUmVxdWlyZWRQcm9wZXJ0aWVzLmNvbmNhdChnZXRGaWx0ZXJSZXN0cmljdGlvbnMob05hdmlnYXRpb25GaWx0ZXJSZXN0cmljdGlvbnMsIFwiUmVxdWlyZWRQcm9wZXJ0aWVzXCIpIHx8IFtdKTtcblx0XHRvUmV0Lk5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzLmNvbmNhdChnZXRGaWx0ZXJSZXN0cmljdGlvbnMob05hdmlnYXRpb25GaWx0ZXJSZXN0cmljdGlvbnMsIFwiTm9uRmlsdGVyYWJsZVByb3BlcnRpZXNcIikgfHwgW10pO1xuXHRcdG9SZXQuRmlsdGVyQWxsb3dlZEV4cHJlc3Npb25zID0ge1xuXHRcdFx0Li4uKGdldEZpbHRlclJlc3RyaWN0aW9ucyhvTmF2aWdhdGlvbkZpbHRlclJlc3RyaWN0aW9ucywgXCJGaWx0ZXJBbGxvd2VkRXhwcmVzc2lvbnNcIikgfHwge30pLFxuXHRcdFx0Li4ub1JldC5GaWx0ZXJBbGxvd2VkRXhwcmVzc2lvbnNcblx0XHR9O1xuXHR9XG5cdGNvbnN0IGlzQ2FzZVNlbnNpdGl2ZSA9IGlzRmlsdGVyaW5nQ2FzZVNlbnNpdGl2ZShjb252ZXJ0ZXJDb250ZXh0KTtcblx0Y29uc3QgYVJlcXVpcmVkUHJvcHMgPSBvUmV0LlJlcXVpcmVkUHJvcGVydGllcztcblx0Y29uc3QgYU5vbkZpbHRlcmFibGVQcm9wcyA9IG9SZXQuTm9uRmlsdGVyYWJsZVByb3BlcnRpZXM7XG5cdGxldCBvUHJvcGVydHlJbmZvO1xuXHRjb25zdCBhRmV0Y2hlZFByb3BlcnRpZXM6IGFueSA9IFtdO1xuXG5cdC8vIHByb2Nlc3MgdGhlIGZpZWxkcyB0byBhZGQgbmVjZXNzYXJ5IHByb3BlcnRpZXNcblx0cHJvcGVydHlJbmZvRmllbGRzLmZvckVhY2goZnVuY3Rpb24gKHByb3BlcnR5SW5mb0ZpZWxkOiBhbnkpIHtcblx0XHRjb25zdCBvQ29udmVydGVkUHJvcGVydHkgPSBwcm9wZXJ0eUluZm9GaWVsZDtcblx0XHRsZXQgc1Byb3BlcnR5UGF0aDtcblx0XHRpZiAob0NvbnZlcnRlZFByb3BlcnR5LmNvbmRpdGlvblBhdGgpIHtcblx0XHRcdHNQcm9wZXJ0eVBhdGggPSBvQ29udmVydGVkUHJvcGVydHkuY29uZGl0aW9uUGF0aC5yZXBsYWNlKC9cXCt8XFwqL2csIFwiXCIpO1xuXHRcdH1cblx0XHRpZiAoYU5vbkZpbHRlcmFibGVQcm9wcy5pbmRleE9mKHNQcm9wZXJ0eVBhdGgpID09PSAtMSkge1xuXHRcdFx0b1Byb3BlcnR5SW5mbyA9IF9mZXRjaFByb3BlcnR5SW5mbyhjb252ZXJ0ZXJDb250ZXh0LCBvQ29udmVydGVkUHJvcGVydHksIGFUeXBlQ29uZmlnW3Byb3BlcnR5SW5mb0ZpZWxkLmtleV0pO1xuXHRcdFx0aWYgKG9Qcm9wZXJ0eUluZm8pIHtcblx0XHRcdFx0b1Byb3BlcnR5SW5mbyA9IE9iamVjdC5hc3NpZ24ob1Byb3BlcnR5SW5mbywge1xuXHRcdFx0XHRcdG1heENvbmRpdGlvbnM6ICFvUHJvcGVydHlJbmZvLmlzUGFyYW1ldGVyICYmIGlzTXVsdGlWYWx1ZShvUHJvcGVydHlJbmZvKSA/IC0xIDogMSxcblx0XHRcdFx0XHRyZXF1aXJlZDogb1Byb3BlcnR5SW5mby5pc1BhcmFtZXRlciB8fCBhUmVxdWlyZWRQcm9wcy5pbmRleE9mKHNQcm9wZXJ0eVBhdGgpID49IDAsXG5cdFx0XHRcdFx0Y2FzZVNlbnNpdGl2ZTogaXNDYXNlU2Vuc2l0aXZlLFxuXHRcdFx0XHRcdGRhdGFUeXBlOiBhVHlwZUNvbmZpZ1twcm9wZXJ0eUluZm9GaWVsZC5rZXldLnR5cGVcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0YUZldGNoZWRQcm9wZXJ0aWVzLnB1c2gob1Byb3BlcnR5SW5mbyk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9KTtcblxuXHQvL2FkZCBlZGl0XG5cdGlmIChjb252ZXJ0ZXJDb250ZXh0LmdldERhdGFNb2RlbE9iamVjdFBhdGgoKS50YXJnZXRPYmplY3Q/LmFubm90YXRpb25zPy5Db21tb24/LkRyYWZ0Um9vdCkge1xuXHRcdGFGZXRjaGVkUHJvcGVydGllcy5wdXNoKGdldEVkaXRTdGF0ZUZpbHRlclByb3BlcnR5SW5mbygpKTtcblx0fVxuXHQvLyBhZGQgc2VhcmNoXG5cdGNvbnN0IHNlYXJjaFJlc3RyaWN0aW9ucyA9IGdldFNlYXJjaFJlc3RyaWN0aW9ucyhjb252ZXJ0ZXJDb250ZXh0KTtcblx0Y29uc3QgaGlkZUJhc2ljU2VhcmNoID0gQm9vbGVhbihzZWFyY2hSZXN0cmljdGlvbnMgJiYgIXNlYXJjaFJlc3RyaWN0aW9ucy5TZWFyY2hhYmxlKTtcblx0aWYgKHNFbnRpdHlTZXRQYXRoICYmIGhpZGVCYXNpY1NlYXJjaCAhPT0gdHJ1ZSkge1xuXHRcdGlmICghc2VhcmNoUmVzdHJpY3Rpb25zIHx8IHNlYXJjaFJlc3RyaWN0aW9ucz8uU2VhcmNoYWJsZSkge1xuXHRcdFx0YUZldGNoZWRQcm9wZXJ0aWVzLnB1c2goZ2V0U2VhcmNoRmlsdGVyUHJvcGVydHlJbmZvKCkpO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBhRmV0Y2hlZFByb3BlcnRpZXM7XG59O1xuXG5leHBvcnQgY29uc3QgaW5zZXJ0Q3VzdG9tTWFuaWZlc3RFbGVtZW50cyA9IGZ1bmN0aW9uIChcblx0ZmlsdGVyRmllbGRzOiBGaWx0ZXJGaWVsZFtdLFxuXHRlbnRpdHlUeXBlOiBFbnRpdHlUeXBlLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0XG4pIHtcblx0cmV0dXJuIGluc2VydEN1c3RvbUVsZW1lbnRzKGZpbHRlckZpZWxkcywgZ2V0TWFuaWZlc3RGaWx0ZXJGaWVsZHMoZW50aXR5VHlwZSwgY29udmVydGVyQ29udGV4dCksIHtcblx0XHRcImF2YWlsYWJpbGl0eVwiOiBcIm92ZXJ3cml0ZVwiLFxuXHRcdGxhYmVsOiBcIm92ZXJ3cml0ZVwiLFxuXHRcdHR5cGU6IFwib3ZlcndyaXRlXCIsXG5cdFx0cG9zaXRpb246IFwib3ZlcndyaXRlXCIsXG5cdFx0dGVtcGxhdGU6IFwib3ZlcndyaXRlXCIsXG5cdFx0c2V0dGluZ3M6IFwib3ZlcndyaXRlXCIsXG5cdFx0dmlzdWFsRmlsdGVyOiBcIm92ZXJ3cml0ZVwiXG5cdH0pO1xufTtcblxuLyoqXG4gKiBSZXRyaWV2ZSB0aGUgY29uZmlndXJhdGlvbiBmb3IgdGhlIHNlbGVjdGlvbiBmaWVsZHMgdGhhdCB3aWxsIGJlIHVzZWQgd2l0aGluIHRoZSBmaWx0ZXIgYmFyXG4gKiBUaGlzIGNvbmZpZ3VyYXRpb24gdGFrZXMgaW50byBhY2NvdW50IGFubm90YXRpb24gYW5kIHRoZSBzZWxlY3Rpb24gdmFyaWFudHMuXG4gKiBAcGFyYW0ge0NvbnZlcnRlckNvbnRleHR9IGNvbnZlcnRlckNvbnRleHRcbiAqIEBwYXJhbSB7VGFibGVWaXN1YWxpemF0aW9uW119IGxyVGFibGVzXG4gKiBAcGFyYW0ge3N0cmluZ30gYW5ub3RhdGlvblBhdGhcbiAqIEByZXR1cm5zIHtGaWx0ZXJTZWxlY3Rpb25GaWVsZFtdfSBBbiBhcnJheSBvZiBzZWxlY3Rpb24gZmllbGRzXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRTZWxlY3Rpb25GaWVsZHMgPSBmdW5jdGlvbiAoXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdGxyVGFibGVzOiBUYWJsZVZpc3VhbGl6YXRpb25bXSA9IFtdLFxuXHRhbm5vdGF0aW9uUGF0aDogc3RyaW5nID0gXCJcIixcblx0aW5jbHVkZUhpZGRlbj86IGJvb2xlYW5cbik6IGFueSB7XG5cdGNvbnN0IG9Bbm5vdGF0ZWRTZWxlY3Rpb25GaWVsZERhdGEgPSBnZXRBbm5vdGF0ZWRTZWxlY3Rpb25GaWVsZERhdGEoY29udmVydGVyQ29udGV4dCwgbHJUYWJsZXMsIGFubm90YXRpb25QYXRoLCBpbmNsdWRlSGlkZGVuKTtcblx0Y29uc3QgcGFyYW1ldGVyRmllbGRzID0gX2dldFBhcmFtZXRlckZpZWxkcyhjb252ZXJ0ZXJDb250ZXh0KTtcblx0bGV0IHByb3BlcnR5SW5mb0ZpZWxkczogRmlsdGVyRmllbGRbXSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkob0Fubm90YXRlZFNlbGVjdGlvbkZpZWxkRGF0YS5wcm9wZXJ0eUluZm9GaWVsZHMpKTtcblx0Y29uc3QgZW50aXR5VHlwZSA9IG9Bbm5vdGF0ZWRTZWxlY3Rpb25GaWVsZERhdGEuZW50aXR5VHlwZTtcblxuXHRwcm9wZXJ0eUluZm9GaWVsZHMgPSBwYXJhbWV0ZXJGaWVsZHMuY29uY2F0KHByb3BlcnR5SW5mb0ZpZWxkcyk7XG5cblx0cHJvcGVydHlJbmZvRmllbGRzID0gaW5zZXJ0Q3VzdG9tTWFuaWZlc3RFbGVtZW50cyhwcm9wZXJ0eUluZm9GaWVsZHMsIGVudGl0eVR5cGUsIGNvbnZlcnRlckNvbnRleHQpO1xuXG5cdGNvbnN0IGFGZXRjaGVkUHJvcGVydGllcyA9IHByb2Nlc3NTZWxlY3Rpb25GaWVsZHMoXG5cdFx0cHJvcGVydHlJbmZvRmllbGRzLFxuXHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0b0Fubm90YXRlZFNlbGVjdGlvbkZpZWxkRGF0YS5kZWZhdWx0RmlsdGVyRmllbGRzXG5cdCk7XG5cdGFGZXRjaGVkUHJvcGVydGllcy5zb3J0KGZ1bmN0aW9uIChhOiBhbnksIGI6IGFueSkge1xuXHRcdGlmIChhLmdyb3VwTGFiZWwgPT09IHVuZGVmaW5lZCB8fCBhLmdyb3VwTGFiZWwgPT09IG51bGwpIHtcblx0XHRcdHJldHVybiAtMTtcblx0XHR9XG5cdFx0aWYgKGIuZ3JvdXBMYWJlbCA9PT0gdW5kZWZpbmVkIHx8IGIuZ3JvdXBMYWJlbCA9PT0gbnVsbCkge1xuXHRcdFx0cmV0dXJuIDE7XG5cdFx0fVxuXHRcdHJldHVybiBhLmdyb3VwTGFiZWwubG9jYWxlQ29tcGFyZShiLmdyb3VwTGFiZWwpO1xuXHR9KTtcblxuXHRsZXQgc0ZldGNoUHJvcGVydGllcyA9IEpTT04uc3RyaW5naWZ5KGFGZXRjaGVkUHJvcGVydGllcyk7XG5cdHNGZXRjaFByb3BlcnRpZXMgPSBzRmV0Y2hQcm9wZXJ0aWVzLnJlcGxhY2UoL1xcey9nLCBcIlxcXFx7XCIpO1xuXHRzRmV0Y2hQcm9wZXJ0aWVzID0gc0ZldGNoUHJvcGVydGllcy5yZXBsYWNlKC9cXH0vZywgXCJcXFxcfVwiKTtcblx0Y29uc3Qgc1Byb3BlcnR5SW5mbyA9IHNGZXRjaFByb3BlcnRpZXM7XG5cdC8vIGVuZCBvZiBwcm9wZXJ0eUZpZWxkcyBwcm9jZXNzaW5nXG5cblx0Ly8gdG8gcG9wdWxhdGUgc2VsZWN0aW9uIGZpZWxkc1xuXHRsZXQgcHJvcFNlbGVjdGlvbkZpZWxkczogRmlsdGVyRmllbGRbXSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkob0Fubm90YXRlZFNlbGVjdGlvbkZpZWxkRGF0YS5wcm9wZXJ0eUluZm9GaWVsZHMpKTtcblx0cHJvcFNlbGVjdGlvbkZpZWxkcyA9IHBhcmFtZXRlckZpZWxkcy5jb25jYXQocHJvcFNlbGVjdGlvbkZpZWxkcyk7XG5cdC8vIGNyZWF0ZSBhIG1hcCBvZiBwcm9wZXJ0aWVzIHRvIGJlIHVzZWQgaW4gc2VsZWN0aW9uIHZhcmlhbnRzXG5cdGNvbnN0IGV4Y2x1ZGVkRmlsdGVyUHJvcGVydGllczogUmVjb3JkPHN0cmluZywgYm9vbGVhbj4gPSBvQW5ub3RhdGVkU2VsZWN0aW9uRmllbGREYXRhLmV4Y2x1ZGVkRmlsdGVyUHJvcGVydGllcztcblx0Y29uc3QgZmlsdGVyRmFjZXRzID0gZW50aXR5VHlwZT8uYW5ub3RhdGlvbnM/LlVJPy5GaWx0ZXJGYWNldHM7XG5cdGxldCBmaWx0ZXJGYWNldE1hcDogUmVjb3JkPHN0cmluZywgRmlsdGVyR3JvdXA+ID0ge307XG5cblx0Y29uc3QgYUZpZWxkR3JvdXBzID0gY29udmVydGVyQ29udGV4dC5nZXRBbm5vdGF0aW9uc0J5VGVybShcIlVJXCIsIFVJQW5ub3RhdGlvblRlcm1zLkZpZWxkR3JvdXApO1xuXG5cdGlmIChmaWx0ZXJGYWNldHMgPT09IHVuZGVmaW5lZCB8fCBmaWx0ZXJGYWNldHMubGVuZ3RoIDwgMCkge1xuXHRcdGZvciAoY29uc3QgaSBpbiBhRmllbGRHcm91cHMpIHtcblx0XHRcdGZpbHRlckZhY2V0TWFwID0ge1xuXHRcdFx0XHQuLi5maWx0ZXJGYWNldE1hcCxcblx0XHRcdFx0Li4uZ2V0RmllbGRHcm91cEZpbHRlckdyb3VwcyhhRmllbGRHcm91cHNbaV0gYXMgQW5ub3RhdGlvblRlcm08RmllbGRHcm91cFR5cGU+KVxuXHRcdFx0fTtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0ZmlsdGVyRmFjZXRNYXAgPSBmaWx0ZXJGYWNldHMucmVkdWNlKChwcmV2aW91c1ZhbHVlOiBSZWNvcmQ8c3RyaW5nLCBGaWx0ZXJHcm91cD4sIGZpbHRlckZhY2V0OiBSZWZlcmVuY2VGYWNldFR5cGVzKSA9PiB7XG5cdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IChmaWx0ZXJGYWNldC5UYXJnZXQuJHRhcmdldCBhcyBGaWVsZEdyb3VwKS5EYXRhLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdHByZXZpb3VzVmFsdWVbKChmaWx0ZXJGYWNldC5UYXJnZXQuJHRhcmdldCBhcyBGaWVsZEdyb3VwKS5EYXRhW2ldIGFzIERhdGFGaWVsZFR5cGVzKS5WYWx1ZS5wYXRoXSA9IHtcblx0XHRcdFx0XHRncm91cDogZmlsdGVyRmFjZXQ/LklEPy50b1N0cmluZygpLFxuXHRcdFx0XHRcdGdyb3VwTGFiZWw6IGZpbHRlckZhY2V0Py5MYWJlbD8udG9TdHJpbmcoKVxuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHByZXZpb3VzVmFsdWU7XG5cdFx0fSwge30pO1xuXHR9XG5cblx0Ly8gY3JlYXRlIGEgbWFwIG9mIGFsbCBwb3RlbnRpYWwgZmlsdGVyIGZpZWxkcyBiYXNlZCBvbi4uLlxuXHRjb25zdCBmaWx0ZXJGaWVsZHM6IFJlY29yZDxzdHJpbmcsIEZpbHRlckZpZWxkPiA9IG9Bbm5vdGF0ZWRTZWxlY3Rpb25GaWVsZERhdGEuZmlsdGVyRmllbGRzO1xuXG5cdC8vIGZpbmFsbHkgY3JlYXRlIGZpbmFsIGxpc3Qgb2YgZmlsdGVyIGZpZWxkcyBieSBhZGRpbmcgdGhlIFNlbGVjdGlvbkZpZWxkcyBmaXJzdCAob3JkZXIgbWF0dGVycykuLi5cblx0bGV0IGFsbEZpbHRlcnMgPSBwcm9wU2VsZWN0aW9uRmllbGRzXG5cblx0XHQvLyAuLi5hbmQgYWRkaW5nIHJlbWFpbmluZyBmaWx0ZXIgZmllbGRzLCB0aGF0IGFyZSBub3QgdXNlZCBpbiBhIFNlbGVjdGlvblZhcmlhbnQgKG9yZGVyIGRvZXNuJ3QgbWF0dGVyKVxuXHRcdC5jb25jYXQoXG5cdFx0XHRPYmplY3Qua2V5cyhmaWx0ZXJGaWVsZHMpXG5cdFx0XHRcdC5maWx0ZXIoKHByb3BlcnR5UGF0aCkgPT4gIShwcm9wZXJ0eVBhdGggaW4gZXhjbHVkZWRGaWx0ZXJQcm9wZXJ0aWVzKSlcblx0XHRcdFx0Lm1hcCgocHJvcGVydHlQYXRoKSA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuIE9iamVjdC5hc3NpZ24oZmlsdGVyRmllbGRzW3Byb3BlcnR5UGF0aF0sIGZpbHRlckZhY2V0TWFwW3Byb3BlcnR5UGF0aF0pO1xuXHRcdFx0XHR9KVxuXHRcdCk7XG5cdGNvbnN0IHNDb250ZXh0UGF0aCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0Q29udGV4dFBhdGgoKTtcblxuXHQvL2lmIGFsbCB0YWJsZXMgYXJlIGFuYWx5dGljYWwgdGFibGVzIFwiYWdncmVnYXRhYmxlXCIgcHJvcGVydGllcyBtdXN0IGJlIGV4Y2x1ZGVkXG5cdGlmIChjaGVja0FsbFRhYmxlRm9yRW50aXR5U2V0QXJlQW5hbHl0aWNhbChsclRhYmxlcywgc0NvbnRleHRQYXRoKSkge1xuXHRcdC8vIEN1cnJlbnRseSBhbGwgYWdyZWdhdGVzIGFyZSByb290IGVudGl0eSBwcm9wZXJ0aWVzIChubyBwcm9wZXJ0aWVzIGNvbWluZyBmcm9tIG5hdmlnYXRpb24pIGFuZCBhbGxcblx0XHQvLyB0YWJsZXMgd2l0aCBzYW1lIGVudGl0eVNldCBnZXRzIHNhbWUgYWdncmVhZ3RlIGNvbmZpZ3VyYXRpb24gdGhhdCdzIHdoeSB3ZSBjYW4gdXNlIGZpcnN0IHRhYmxlIGludG9cblx0XHQvLyBMUiB0byBnZXQgYWdncmVnYXRlcyAod2l0aG91dCBjdXJyZW5jeS91bml0IHByb3BlcnRpZXMgc2luY2Ugd2UgZXhwZWN0IHRvIGJlIGFibGUgdG8gZmlsdGVyIHRoZW0pLlxuXHRcdGNvbnN0IGFnZ3JlZ2F0ZXMgPSBsclRhYmxlc1swXS5hZ2dyZWdhdGVzO1xuXHRcdGlmIChhZ2dyZWdhdGVzKSB7XG5cdFx0XHRjb25zdCBhZ2dyZWdhdGFibGVQcm9wZXJ0aWVzOiBzdHJpbmdbXSA9IE9iamVjdC5rZXlzKGFnZ3JlZ2F0ZXMpLm1hcCgoYWdncmVnYXRlS2V5KSA9PiBhZ2dyZWdhdGVzW2FnZ3JlZ2F0ZUtleV0ucmVsYXRpdmVQYXRoKTtcblx0XHRcdGFsbEZpbHRlcnMgPSBhbGxGaWx0ZXJzLmZpbHRlcigoZmlsdGVyRmllbGQpID0+IHtcblx0XHRcdFx0cmV0dXJuIGFnZ3JlZ2F0YWJsZVByb3BlcnRpZXMuaW5kZXhPZihmaWx0ZXJGaWVsZC5rZXkpID09PSAtMTtcblx0XHRcdH0pO1xuXHRcdH1cblx0fVxuXG5cdGNvbnN0IHNlbGVjdGlvbkZpZWxkcyA9IGluc2VydEN1c3RvbU1hbmlmZXN0RWxlbWVudHMoYWxsRmlsdGVycywgZW50aXR5VHlwZSwgY29udmVydGVyQ29udGV4dCk7XG5cblx0Ly8gQWRkIGNhc2VTZW5zaXRpdmUgcHJvcGVydHkgdG8gYWxsIHNlbGVjdGlvbiBmaWVsZHMuXG5cdGNvbnN0IGlzQ2FzZVNlbnNpdGl2ZSA9IGlzRmlsdGVyaW5nQ2FzZVNlbnNpdGl2ZShjb252ZXJ0ZXJDb250ZXh0KTtcblx0c2VsZWN0aW9uRmllbGRzLmZvckVhY2goKGZpbHRlckZpZWxkKSA9PiB7XG5cdFx0ZmlsdGVyRmllbGQuY2FzZVNlbnNpdGl2ZSA9IGlzQ2FzZVNlbnNpdGl2ZTtcblx0fSk7XG5cblx0cmV0dXJuIHsgc2VsZWN0aW9uRmllbGRzLCBzUHJvcGVydHlJbmZvIH07XG59O1xuXG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciB0aGUgZmlsdGVyIGJhciBpbnNpZGUgYSB2YWx1ZSBoZWxwIGRpYWxvZyBzaG91bGQgYmUgZXhwYW5kZWQuIFRoaXMgaXMgdHJ1ZSBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb24gaG9sZHM6XG4gKiAoMSkgYSBmaWx0ZXIgcHJvcGVydHkgaXMgbWFuZGF0b3J5LFxuICogKDIpIG5vIHNlYXJjaCBmaWVsZCBleGlzdHMgKGVudGl0eSBpc24ndCBzZWFyY2ggZW5hYmxlZCksXG4gKiAoMykgd2hlbiB0aGUgZGF0YSBpc24ndCBsb2FkZWQgYnkgZGVmYXVsdCAoYW5ub3RhdGlvbiBGZXRjaFZhbHVlcyA9IDIpLlxuICogQHBhcmFtIHtDb252ZXJ0ZXJDb250ZXh0fSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHBhcmFtIHthbnl9IGZpbHRlclJlc3RyaWN0aW9uc0Fubm90YXRpb24gVGhlIEZpbHRlclJlc3RyaWN0aW9uIGFubm90YXRpb25cbiAqIEBwYXJhbSB7YW55fSB2YWx1ZUxpc3RBbm5vdGF0aW9uIFRoZSBWYWx1ZUxpc3QgYW5ub3RhdGlvblxuICogQHJldHVybnMge2Jvb2xlYW59IFRoZSB2YWx1ZSBmb3IgZXhwYW5kRmlsdGVyRmllbGRzXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRFeHBhbmRGaWx0ZXJGaWVsZHMgPSBmdW5jdGlvbiAoXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdGZpbHRlclJlc3RyaWN0aW9uc0Fubm90YXRpb246IGFueSxcblx0dmFsdWVMaXN0QW5ub3RhdGlvbjogYW55XG4pOiBib29sZWFuIHtcblx0Y29uc3QgcmVxdWlyZWRQcm9wZXJ0aWVzID0gZ2V0RmlsdGVyUmVzdHJpY3Rpb25zKGZpbHRlclJlc3RyaWN0aW9uc0Fubm90YXRpb24sIFwiUmVxdWlyZWRQcm9wZXJ0aWVzXCIpO1xuXHRjb25zdCBzZWFyY2hSZXN0cmljdGlvbnMgPSBnZXRTZWFyY2hSZXN0cmljdGlvbnMoY29udmVydGVyQ29udGV4dCk7XG5cdGNvbnN0IGhpZGVCYXNpY1NlYXJjaCA9IEJvb2xlYW4oc2VhcmNoUmVzdHJpY3Rpb25zICYmICFzZWFyY2hSZXN0cmljdGlvbnMuU2VhcmNoYWJsZSk7XG5cdGNvbnN0IHZhbHVlTGlzdCA9IHZhbHVlTGlzdEFubm90YXRpb24uZ2V0T2JqZWN0KCk7XG5cdGlmIChyZXF1aXJlZFByb3BlcnRpZXMubGVuZ3RoID4gMCB8fCBoaWRlQmFzaWNTZWFyY2ggfHwgdmFsdWVMaXN0Py5GZXRjaFZhbHVlcyA9PT0gMikge1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cdHJldHVybiBmYWxzZTtcbn07XG4iXX0=
928
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkZpbHRlckJhci50cyJdLCJuYW1lcyI6WyJmaWx0ZXJGaWVsZFR5cGUiLCJzRWRtU3RyaW5nIiwic1N0cmluZ0RhdGFUeXBlIiwiZ2V0RmllbGRHcm91cEZpbHRlckdyb3VwcyIsImZpZWxkR3JvdXAiLCJmaWx0ZXJGYWNldE1hcCIsIkRhdGEiLCJmb3JFYWNoIiwiZGF0YUZpZWxkIiwiJFR5cGUiLCJWYWx1ZSIsInBhdGgiLCJncm91cCIsImZ1bGx5UXVhbGlmaWVkTmFtZSIsImdyb3VwTGFiZWwiLCJjb21waWxlRXhwcmVzc2lvbiIsImdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbiIsIkxhYmVsIiwiYW5ub3RhdGlvbnMiLCJDb21tb24iLCJxdWFsaWZpZXIiLCJnZXRFeGNsdWRlZEZpbHRlclByb3BlcnRpZXMiLCJzZWxlY3Rpb25WYXJpYW50cyIsInJlZHVjZSIsInByZXZpb3VzVmFsdWUiLCJzZWxlY3Rpb25WYXJpYW50IiwicHJvcGVydHlOYW1lcyIsInByb3BlcnR5TmFtZSIsImNoZWNrQWxsVGFibGVGb3JFbnRpdHlTZXRBcmVBbmFseXRpY2FsIiwibGlzdFJlcG9ydFRhYmxlcyIsImNvbnRleHRQYXRoIiwibGVuZ3RoIiwiZXZlcnkiLCJ2aXN1YWxpemF0aW9uIiwiZW5hYmxlQW5hbHl0aWNzIiwiYW5ub3RhdGlvbiIsImNvbGxlY3Rpb24iLCJnZXRTZWxlY3Rpb25WYXJpYW50cyIsImxyVGFibGVWaXN1YWxpemF0aW9ucyIsImNvbnZlcnRlckNvbnRleHQiLCJzZWxlY3Rpb25WYXJpYW50UGF0aHMiLCJtYXAiLCJ0YWJsZUZpbHRlcnMiLCJjb250cm9sIiwiZmlsdGVycyIsInRhYmxlU1ZDb25maWdzIiwia2V5IiwiQXJyYXkiLCJpc0FycmF5IiwicGF0aHMiLCJhbm5vdGF0aW9uUGF0aCIsImluZGV4T2YiLCJwdXNoIiwic2VsZWN0aW9uVmFyaWFudENvbmZpZyIsImdldFNlbGVjdGlvblZhcmlhbnRDb25maWd1cmF0aW9uIiwic3ZDb25maWdzIiwiY29uY2F0IiwiX2dldENvbmRpdGlvblBhdGgiLCJlbnRpdHlUeXBlIiwicHJvcGVydHlQYXRoIiwicGFydHMiLCJzcGxpdCIsInBhcnRpYWxQYXRoIiwicGFydCIsInNoaWZ0IiwicHJvcGVydHkiLCJyZXNvbHZlUGF0aCIsIl90eXBlIiwiaXNDb2xsZWN0aW9uIiwiX2NyZWF0ZUZpbHRlclNlbGVjdGlvbkZpZWxkIiwiZnVsbFByb3BlcnR5UGF0aCIsImluY2x1ZGVIaWRkZW4iLCJ1bmRlZmluZWQiLCJ0YXJnZXRUeXBlIiwiVUkiLCJIaWRkZW4iLCJ2YWx1ZU9mIiwidGFyZ2V0RW50aXR5VHlwZSIsImdldEFubm90YXRpb25FbnRpdHlUeXBlIiwiS2V5SGVscGVyIiwiZ2V0U2VsZWN0aW9uRmllbGRLZXlGcm9tUGF0aCIsImdldEFic29sdXRlQW5ub3RhdGlvblBhdGgiLCJjb25kaXRpb25QYXRoIiwiYXZhaWxhYmlsaXR5IiwiSGlkZGVuRmlsdGVyIiwiQXZhaWxhYmlsaXR5VHlwZSIsIkFkYXB0YXRpb24iLCJsYWJlbCIsIm5hbWUiLCJnZXRNb2RlbFR5cGUiLCJzVHlwZSIsIm1EZWZhdWx0VHlwZUZvckVkbVR5cGUiLCJtb2RlbFR5cGUiLCJfZ2V0U2VsZWN0aW9uRmllbGRzIiwibmF2aWdhdGlvblBhdGgiLCJwcm9wZXJ0aWVzIiwic2VsZWN0aW9uRmllbGRNYXAiLCJmdWxsUGF0aCIsInNlbGVjdGlvbkZpZWxkIiwiX2dldFNlbGVjdGlvbkZpZWxkc0J5UGF0aCIsInByb3BlcnR5UGF0aHMiLCJzZWxlY3Rpb25GaWVsZHMiLCJsb2NhbFNlbGVjdGlvbkZpZWxkcyIsImVudGl0eVByb3BlcnRpZXMiLCJpbmNsdWRlcyIsInNwbGljZSIsImpvaW4iLCJfZ2V0RmlsdGVyRmllbGQiLCJmaWx0ZXJGaWVsZHMiLCJmaWx0ZXJGaWVsZCIsImdldERpYWdub3N0aWNzIiwiYWRkSXNzdWUiLCJJc3N1ZUNhdGVnb3J5IiwiQW5ub3RhdGlvbiIsIklzc3VlU2V2ZXJpdHkiLCJIaWdoIiwiSXNzdWVUeXBlIiwiTUlTU0lOR19TRUxFQ1RJT05GSUVMRCIsIkRlZmF1bHQiLCJpc1BhcmFtZXRlciIsIlJlc3VsdENvbnRleHQiLCJfZ2V0RGVmYXVsdEZpbHRlckZpZWxkcyIsImFTZWxlY3RPcHRpb25zIiwiZXhjbHVkZWRGaWx0ZXJQcm9wZXJ0aWVzIiwiYW5ub3RhdGVkU2VsZWN0aW9uRmllbGRzIiwiVUlTZWxlY3Rpb25GaWVsZHMiLCJTZWxlY3Rpb25GaWVsZCIsInZhbHVlIiwic2VsZWN0T3B0aW9uIiwiUHJvcGVydHlOYW1lIiwic1Byb3BlcnR5UGF0aCIsImN1cnJlbnRTZWxlY3Rpb25GaWVsZHMiLCJGaWx0ZXJGaWVsZCIsImdldEZpbHRlckZpZWxkIiwiZGVmYXVsdEZpbHRlclZhbHVlIiwiRmlsdGVyRGVmYXVsdFZhbHVlIiwiX2dldFBhcmFtZXRlckZpZWxkcyIsImRhdGFNb2RlbE9iamVjdFBhdGgiLCJnZXREYXRhTW9kZWxPYmplY3RQYXRoIiwicGFyYW1ldGVyRW50aXR5VHlwZSIsInN0YXJ0aW5nRW50aXR5U2V0IiwiaXNQYXJhbWV0ZXJpemVkIiwidGFyZ2V0RW50aXR5U2V0IiwicGFyYW1ldGVyQ29udmVydGVyQ29udGV4dCIsImdldENvbnZlcnRlckNvbnRleHRGb3IiLCJnZXRGaWx0ZXJCYXJoaWRlQmFzaWNTZWFyY2giLCJjaGFydHMiLCJub1NlYXJjaEluQ2hhcnRzIiwiY2hhcnQiLCJhcHBseVN1cHBvcnRlZCIsImVuYWJsZVNlYXJjaCIsIm5vU2VhcmNoSW5UYWJsZXMiLCJ0YWJsZSIsImVuYWJsZUFuYWx5dGljc1NlYXJjaCIsImdldENvbnRleHRQYXRoIiwiZ2V0TWFuaWZlc3RGaWx0ZXJGaWVsZHMiLCJmYkNvbmZpZyIsImdldE1hbmlmZXN0V3JhcHBlciIsImdldEZpbHRlckNvbmZpZ3VyYXRpb24iLCJkZWZpbmVkRmlsdGVyRmllbGRzIiwiT2JqZWN0Iiwia2V5cyIsImdldFBhdGhGcm9tU2VsZWN0aW9uRmllbGRLZXkiLCJzS2V5IiwidHlwZSIsIlNsb3QiLCJ2aXN1YWxGaWx0ZXIiLCJnZXRWaXN1YWxGaWx0ZXJzIiwidGVtcGxhdGUiLCJwb3NpdGlvbiIsInBsYWNlbWVudCIsIlBsYWNlbWVudCIsIkFmdGVyIiwic2V0dGluZ3MiLCJnZXRGaWx0ZXJSZXN0cmljdGlvbnMiLCJvRmlsdGVyUmVzdHJpY3Rpb25zQW5ub3RhdGlvbiIsInNSZXN0cmljdGlvbiIsImFQcm9wcyIsIm9Qcm9wZXJ0eSIsIiRQcm9wZXJ0eVBhdGgiLCJtQWxsb3dlZEV4cHJlc3Npb25zIiwiRmlsdGVyRXhwcmVzc2lvblJlc3RyaWN0aW9ucyIsIlByb3BlcnR5IiwiQWxsb3dlZEV4cHJlc3Npb25zIiwiZ2V0U2VhcmNoRmlsdGVyUHJvcGVydHlJbmZvIiwiZGF0YVR5cGUiLCJtYXhDb25kaXRpb25zIiwiZ2V0RWRpdFN0YXRlRmlsdGVyUHJvcGVydHlJbmZvIiwiaGlkZGVuRmlsdGVyIiwiZ2V0U2VhcmNoUmVzdHJpY3Rpb25zIiwiZ2V0RW50aXR5U2V0IiwiQ2FwYWJpbGl0aWVzIiwiU2VhcmNoUmVzdHJpY3Rpb25zIiwiZ2V0TmF2aWdhdGlvblJlc3RyaWN0aW9ucyIsInNOYXZpZ2F0aW9uUGF0aCIsIm9OYXZpZ2F0aW9uUmVzdHJpY3Rpb25zIiwiTmF2aWdhdGlvblJlc3RyaWN0aW9ucyIsImFSZXN0cmljdGVkUHJvcGVydGllcyIsIlJlc3RyaWN0ZWRQcm9wZXJ0aWVzIiwiZmluZCIsIm9SZXN0cmljdGVkUHJvcGVydHkiLCJOYXZpZ2F0aW9uUHJvcGVydHkiLCIkTmF2aWdhdGlvblByb3BlcnR5UGF0aCIsIl9mZXRjaEJhc2ljUHJvcGVydHlJbmZvIiwib0ZpbHRlckZpZWxkSW5mbyIsImRpc3BsYXkiLCJjYXNlU2Vuc2l0aXZlIiwibWVudSIsImdldFNwZWNpZmljQWxsb3dlZEV4cHJlc3Npb24iLCJhRXhwcmVzc2lvbnMiLCJhQWxsb3dlZEV4cHJlc3Npb25zUHJpb3JpdHkiLCJzb3J0IiwiYSIsImIiLCJkaXNwbGF5TW9kZSIsIm9Qcm9wZXJ0eUFubm90YXRpb25zIiwib0NvbGxlY3Rpb25Bbm5vdGF0aW9ucyIsIm9UZXh0QW5ub3RhdGlvbiIsIlRleHQiLCJvVGV4dEFycmFuZ21lbnRBbm5vdGF0aW9uIiwiVGV4dEFycmFuZ2VtZW50IiwiX2ZldGNoUHJvcGVydHlJbmZvIiwib1R5cGVDb25maWciLCJvUHJvcGVydHlJbmZvIiwic0Fubm90YXRpb25QYXRoIiwidGFyZ2V0UHJvcGVydHlPYmplY3QiLCJ0YXJnZXRPYmplY3QiLCJvRm9ybWF0T3B0aW9ucyIsImZvcm1hdE9wdGlvbnMiLCJvQ29uc3RyYWludHMiLCJjb25zdHJhaW50cyIsImFzc2lnbiIsImlzTXVsdGlWYWx1ZSIsImJJc011bHRpVmFsdWUiLCJmaWx0ZXJFeHByZXNzaW9uIiwiZ2V0QW5ub3RhdGVkU2VsZWN0aW9uRmllbGREYXRhIiwibHJUYWJsZXMiLCJnZXRFbnRpdHlUeXBlIiwiZ2V0RW50aXR5VHlwZUFubm90YXRpb24iLCJTZWxlY3Rpb25GaWVsZHMiLCJuYXZpZ2F0aW9uUHJvcGVydGllcyIsImdldFNlbGVjdGlvblZhcmlhbnQiLCJTZWxlY3RPcHRpb25zIiwicHJvcGVydHlJbmZvRmllbGRzIiwiZGVmYXVsdEZpbHRlckZpZWxkcyIsInByb2Nlc3NTZWxlY3Rpb25GaWVsZHMiLCJkZWZhdWx0VmFsdWVQcm9wZXJ0eUZpZWxkcyIsInNlbGVjdGlvbkZpZWxkVHlwZXMiLCJhVHlwZUNvbmZpZyIsIl9mblR5cGVDb25maWciLCJnZXRUeXBlQ29uZmlnIiwibnVsbGFibGUiLCJwYXJzZUtlZXBzRW1wdHlTdHJpbmciLCJwYXJhbWV0ZXJGaWVsZCIsInByb3BlcnR5Q29udmVydHlDb250ZXh0IiwicHJvcGVydHlUYXJnZXRPYmplY3QiLCJvRmlsdGVyUmVzdHJpY3Rpb25zIiwiRmlsdGVyUmVzdHJpY3Rpb25zIiwib1JldCIsInNFbnRpdHlTZXRQYXRoIiwiYVBhdGhQYXJ0cyIsIm9OYXZpZ2F0aW9uRmlsdGVyUmVzdHJpY3Rpb25zIiwiUmVxdWlyZWRQcm9wZXJ0aWVzIiwiTm9uRmlsdGVyYWJsZVByb3BlcnRpZXMiLCJGaWx0ZXJBbGxvd2VkRXhwcmVzc2lvbnMiLCJpc0Nhc2VTZW5zaXRpdmUiLCJpc0ZpbHRlcmluZ0Nhc2VTZW5zaXRpdmUiLCJhUmVxdWlyZWRQcm9wcyIsImFOb25GaWx0ZXJhYmxlUHJvcHMiLCJhRmV0Y2hlZFByb3BlcnRpZXMiLCJwcm9wZXJ0eUluZm9GaWVsZCIsIm9Db252ZXJ0ZWRQcm9wZXJ0eSIsInJlcGxhY2UiLCJyZXF1aXJlZCIsIkRyYWZ0Um9vdCIsInNlYXJjaFJlc3RyaWN0aW9ucyIsImhpZGVCYXNpY1NlYXJjaCIsIkJvb2xlYW4iLCJTZWFyY2hhYmxlIiwiaW5zZXJ0Q3VzdG9tTWFuaWZlc3RFbGVtZW50cyIsImluc2VydEN1c3RvbUVsZW1lbnRzIiwiZ2V0U2VsZWN0aW9uRmllbGRzIiwib0Fubm90YXRlZFNlbGVjdGlvbkZpZWxkRGF0YSIsInBhcmFtZXRlckZpZWxkcyIsIkpTT04iLCJwYXJzZSIsInN0cmluZ2lmeSIsImxvY2FsZUNvbXBhcmUiLCJzRmV0Y2hQcm9wZXJ0aWVzIiwic1Byb3BlcnR5SW5mbyIsInByb3BTZWxlY3Rpb25GaWVsZHMiLCJmaWx0ZXJGYWNldHMiLCJGaWx0ZXJGYWNldHMiLCJhRmllbGRHcm91cHMiLCJnZXRBbm5vdGF0aW9uc0J5VGVybSIsImkiLCJmaWx0ZXJGYWNldCIsIlRhcmdldCIsIiR0YXJnZXQiLCJJRCIsInRvU3RyaW5nIiwiYWxsRmlsdGVycyIsImZpbHRlciIsInNDb250ZXh0UGF0aCIsImFnZ3JlZ2F0ZXMiLCJhZ2dyZWdhdGFibGVQcm9wZXJ0aWVzIiwiYWdncmVnYXRlS2V5IiwicmVsYXRpdmVQYXRoIiwiZ2V0RXhwYW5kRmlsdGVyRmllbGRzIiwiZmlsdGVyUmVzdHJpY3Rpb25zQW5ub3RhdGlvbiIsInZhbHVlTGlzdEFubm90YXRpb24iLCJyZXF1aXJlZFByb3BlcnRpZXMiLCJ2YWx1ZUxpc3QiLCJnZXRPYmplY3QiLCJGZXRjaFZhbHVlcyJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTs7Ozs7Ozs7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YkE7QUFBbkIsS0FBUDtBQUNBLEdBeEdNO0FBMEdQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FBQ08sTUFBTW1CLHFCQUFxQixHQUFHLFVBQ3BDN1EsZ0JBRG9DLEVBRXBDOFEsNEJBRm9DLEVBR3BDQyxtQkFIb0MsRUFJMUI7QUFDVixRQUFNQyxrQkFBa0IsR0FBR3pJLHFCQUFxQixDQUFDdUksNEJBQUQsRUFBK0Isb0JBQS9CLENBQWhEO0FBQ0EsUUFBTWxDLGtCQUFrQixHQUFHdEYscUJBQXFCLENBQUN0SixnQkFBRCxDQUFoRDtBQUNBLFFBQU02TyxlQUFlLEdBQUdDLE9BQU8sQ0FBQ0Ysa0JBQWtCLElBQUksQ0FBQ0Esa0JBQWtCLENBQUNHLFVBQTNDLENBQS9CO0FBQ0EsUUFBTWtDLFNBQVMsR0FBR0YsbUJBQW1CLENBQUNHLFNBQXBCLEVBQWxCOztBQUNBLFFBQUlGLGtCQUFrQixDQUFDeFIsTUFBbkIsR0FBNEIsQ0FBNUIsSUFBaUNxUCxlQUFqQyxJQUFvRCxDQUFBb0MsU0FBUyxTQUFULElBQUFBLFNBQVMsV0FBVCxZQUFBQSxTQUFTLENBQUVFLFdBQVgsTUFBMkIsQ0FBbkYsRUFBc0Y7QUFDckYsYUFBTyxJQUFQO0FBQ0E7O0FBQ0QsV0FBTyxLQUFQO0FBQ0EsR0FiTSIsInNvdXJjZVJvb3QiOiIuIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBBbm5vdGF0aW9uVGVybSwgRW50aXR5VHlwZSwgTmF2aWdhdGlvblByb3BlcnR5LCBQcm9wZXJ0eSwgUHJvcGVydHlQYXRoIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG5pbXBvcnQgdHlwZSB7XG5cdERhdGFGaWVsZEFic3RyYWN0VHlwZXMsXG5cdERhdGFGaWVsZFR5cGVzLFxuXHRGaWVsZEdyb3VwLFxuXHRGaWVsZEdyb3VwVHlwZSxcblx0UmVmZXJlbmNlRmFjZXRUeXBlcyxcblx0U2VsZWN0T3B0aW9uVHlwZVxufSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL1VJXCI7XG5pbXBvcnQgeyBVSUFubm90YXRpb25UZXJtcyB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvVUlcIjtcbmltcG9ydCB0eXBlIHsgQ2hhcnRWaXN1YWxpemF0aW9uIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvY29udHJvbHMvQ29tbW9uL0NoYXJ0XCI7XG5pbXBvcnQgdHlwZSB7IFNlbGVjdGlvblZhcmlhbnRDb25maWd1cmF0aW9uLCBUYWJsZVZpc3VhbGl6YXRpb24gfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9jb250cm9scy9Db21tb24vVGFibGVcIjtcbmltcG9ydCB7IGdldFNlbGVjdGlvblZhcmlhbnRDb25maWd1cmF0aW9uLCBnZXRUeXBlQ29uZmlnLCBpc0ZpbHRlcmluZ0Nhc2VTZW5zaXRpdmUgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9jb250cm9scy9Db21tb24vVGFibGVcIjtcbmltcG9ydCB0eXBlIHsgVmlzdWFsRmlsdGVycyB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2NvbnRyb2xzL0xpc3RSZXBvcnQvVmlzdWFsRmlsdGVyc1wiO1xuaW1wb3J0IHsgZ2V0VmlzdWFsRmlsdGVycyB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2NvbnRyb2xzL0xpc3RSZXBvcnQvVmlzdWFsRmlsdGVyc1wiO1xuaW1wb3J0IHR5cGUgQ29udmVydGVyQ29udGV4dCBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9Db252ZXJ0ZXJDb250ZXh0XCI7XG5pbXBvcnQgdHlwZSB7IENvbmZpZ3VyYWJsZU9iamVjdCwgQ3VzdG9tRWxlbWVudCB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2hlbHBlcnMvQ29uZmlndXJhYmxlT2JqZWN0XCI7XG5pbXBvcnQgeyBpbnNlcnRDdXN0b21FbGVtZW50cywgUGxhY2VtZW50IH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvaGVscGVycy9Db25maWd1cmFibGVPYmplY3RcIjtcbmltcG9ydCB7IElzc3VlQ2F0ZWdvcnksIElzc3VlU2V2ZXJpdHksIElzc3VlVHlwZSB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2hlbHBlcnMvSXNzdWVNYW5hZ2VyXCI7XG5pbXBvcnQgeyBLZXlIZWxwZXIgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9oZWxwZXJzL0tleVwiO1xuaW1wb3J0IHsgY29tcGlsZUV4cHJlc3Npb24sIGdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbiB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0JpbmRpbmdUb29sa2l0XCI7XG5pbXBvcnQgdHlwZSB7IEZpbHRlckZpZWxkTWFuaWZlc3RDb25maWd1cmF0aW9uLCBGaWx0ZXJNYW5pZmVzdENvbmZpZ3VyYXRpb24sIEZpbHRlclNldHRpbmdzIH0gZnJvbSBcIi4uLy4uL01hbmlmZXN0U2V0dGluZ3NcIjtcbmltcG9ydCB7IEF2YWlsYWJpbGl0eVR5cGUgfSBmcm9tIFwiLi4vLi4vTWFuaWZlc3RTZXR0aW5nc1wiO1xuaW1wb3J0IHsgZ2V0U2VsZWN0aW9uVmFyaWFudCB9IGZyb20gXCIuLi9Db21tb24vRGF0YVZpc3VhbGl6YXRpb25cIjtcbi8vaW1wb3J0IHsgaGFzVmFsdWVIZWxwIH0gZnJvbSBcInNhcC9mZS9jb3JlL3RlbXBsYXRpbmcvUHJvcGVydHlIZWxwZXJcIjtcblxuZXhwb3J0IHR5cGUgRmlsdGVyRmllbGQgPSBDb25maWd1cmFibGVPYmplY3QgJiB7XG5cdHR5cGU/OiBzdHJpbmc7XG5cdGNvbmRpdGlvblBhdGg6IHN0cmluZztcblx0YXZhaWxhYmlsaXR5OiBBdmFpbGFiaWxpdHlUeXBlO1xuXHRhbm5vdGF0aW9uUGF0aDogc3RyaW5nO1xuXHRsYWJlbD86IHN0cmluZztcblx0dGVtcGxhdGU/OiBzdHJpbmc7XG5cdGdyb3VwPzogc3RyaW5nO1xuXHRncm91cExhYmVsPzogc3RyaW5nO1xuXHRzZXR0aW5ncz86IEZpbHRlclNldHRpbmdzO1xuXHRpc1BhcmFtZXRlcj86IGJvb2xlYW47XG5cdHZpc3VhbEZpbHRlcj86IFZpc3VhbEZpbHRlcnM7XG5cdGNhc2VTZW5zaXRpdmU/OiBib29sZWFuO1xufTtcblxudHlwZSBGaWx0ZXJHcm91cCA9IHtcblx0Z3JvdXA/OiBzdHJpbmc7XG5cdGdyb3VwTGFiZWw/OiBzdHJpbmc7XG59O1xuXG5lbnVtIGZpbHRlckZpZWxkVHlwZSB7XG5cdERlZmF1bHQgPSBcIkRlZmF1bHRcIixcblx0U2xvdCA9IFwiU2xvdFwiXG59XG5cbmNvbnN0IHNFZG1TdHJpbmcgPSBcIkVkbS5TdHJpbmdcIjtcbmNvbnN0IHNTdHJpbmdEYXRhVHlwZSA9IFwic2FwLnVpLm1vZGVsLm9kYXRhLnR5cGUuU3RyaW5nXCI7XG5cbmV4cG9ydCB0eXBlIEN1c3RvbUVsZW1lbnRGaWx0ZXJGaWVsZCA9IEN1c3RvbUVsZW1lbnQ8RmlsdGVyRmllbGQ+O1xuXG4vKipcbiAqIEVudGVyIGFsbCBEYXRhRmllbGRzIG9mIGEgZ2l2ZW4gRmllbGRHcm91cCBpbnRvIHRoZSBmaWx0ZXJGYWNldE1hcC5cbiAqXG4gKiBAcGFyYW0gZmllbGRHcm91cFxuICogQHJldHVybnMgVGhlIG1hcCBvZiBmYWNldHMgZm9yIHRoZSBnaXZlbiBGaWVsZEdyb3VwXG4gKi9cbmZ1bmN0aW9uIGdldEZpZWxkR3JvdXBGaWx0ZXJHcm91cHMoZmllbGRHcm91cDogQW5ub3RhdGlvblRlcm08RmllbGRHcm91cFR5cGU+KTogUmVjb3JkPHN0cmluZywgRmlsdGVyR3JvdXA+IHtcblx0Y29uc3QgZmlsdGVyRmFjZXRNYXA6IFJlY29yZDxzdHJpbmcsIEZpbHRlckdyb3VwPiA9IHt9O1xuXHRmaWVsZEdyb3VwLkRhdGEuZm9yRWFjaCgoZGF0YUZpZWxkOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzKSA9PiB7XG5cdFx0aWYgKGRhdGFGaWVsZC4kVHlwZSA9PT0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5EYXRhRmllbGRcIikge1xuXHRcdFx0ZmlsdGVyRmFjZXRNYXBbZGF0YUZpZWxkLlZhbHVlLnBhdGhdID0ge1xuXHRcdFx0XHRncm91cDogZmllbGRHcm91cC5mdWxseVF1YWxpZmllZE5hbWUsXG5cdFx0XHRcdGdyb3VwTGFiZWw6XG5cdFx0XHRcdFx0Y29tcGlsZUV4cHJlc3Npb24oXG5cdFx0XHRcdFx0XHRnZXRFeHByZXNzaW9uRnJvbUFubm90YXRpb24oZmllbGRHcm91cC5MYWJlbCB8fCBmaWVsZEdyb3VwLmFubm90YXRpb25zPy5Db21tb24/LkxhYmVsIHx8IGZpZWxkR3JvdXAucXVhbGlmaWVyKVxuXHRcdFx0XHRcdCkgfHwgZmllbGRHcm91cC5xdWFsaWZpZXJcblx0XHRcdH07XG5cdFx0fVxuXHR9KTtcblx0cmV0dXJuIGZpbHRlckZhY2V0TWFwO1xufVxuXG5mdW5jdGlvbiBnZXRFeGNsdWRlZEZpbHRlclByb3BlcnRpZXMoc2VsZWN0aW9uVmFyaWFudHM6IFNlbGVjdGlvblZhcmlhbnRDb25maWd1cmF0aW9uW10pOiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPiB7XG5cdHJldHVybiBzZWxlY3Rpb25WYXJpYW50cy5yZWR1Y2UoKHByZXZpb3VzVmFsdWU6IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+LCBzZWxlY3Rpb25WYXJpYW50KSA9PiB7XG5cdFx0c2VsZWN0aW9uVmFyaWFudC5wcm9wZXJ0eU5hbWVzLmZvckVhY2goKHByb3BlcnR5TmFtZSkgPT4ge1xuXHRcdFx0cHJldmlvdXNWYWx1ZVtwcm9wZXJ0eU5hbWVdID0gdHJ1ZTtcblx0XHR9KTtcblx0XHRyZXR1cm4gcHJldmlvdXNWYWx1ZTtcblx0fSwge30pO1xufVxuXG4vKipcbiAqIENoZWNrIHRoYXQgYWxsIHRoZSB0YWJsZXMgZm9yIGEgZGVkaWNhdGVkIGVudGl0eSBzZXQgYXJlIGNvbmZpZ3VyZWQgYXMgYW5hbHl0aWNhbCB0YWJsZS5cbiAqXG4gKiBAcGFyYW0gbGlzdFJlcG9ydFRhYmxlcyBMaXN0IHJlcG9ydCB0YWJsZXNcbiAqIEBwYXJhbSBjb250ZXh0UGF0aFxuICogQHJldHVybnMgSXMgRmlsdGVyQmFyIHNlYXJjaCBmaWVsZCBoaWRkZW4gb3Igbm90XG4gKi9cbmZ1bmN0aW9uIGNoZWNrQWxsVGFibGVGb3JFbnRpdHlTZXRBcmVBbmFseXRpY2FsKGxpc3RSZXBvcnRUYWJsZXM6IFRhYmxlVmlzdWFsaXphdGlvbltdLCBjb250ZXh0UGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG5cdGlmIChjb250ZXh0UGF0aCAmJiBsaXN0UmVwb3J0VGFibGVzLmxlbmd0aCA+IDApIHtcblx0XHRyZXR1cm4gbGlzdFJlcG9ydFRhYmxlcy5ldmVyeSgodmlzdWFsaXphdGlvbikgPT4ge1xuXHRcdFx0cmV0dXJuIHZpc3VhbGl6YXRpb24uZW5hYmxlQW5hbHl0aWNzICYmIGNvbnRleHRQYXRoID09PSB2aXN1YWxpemF0aW9uLmFubm90YXRpb24uY29sbGVjdGlvbjtcblx0XHR9KTtcblx0fVxuXHRyZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGdldFNlbGVjdGlvblZhcmlhbnRzKFxuXHRsclRhYmxlVmlzdWFsaXphdGlvbnM6IFRhYmxlVmlzdWFsaXphdGlvbltdLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0XG4pOiBTZWxlY3Rpb25WYXJpYW50Q29uZmlndXJhdGlvbltdIHtcblx0Y29uc3Qgc2VsZWN0aW9uVmFyaWFudFBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuXHRyZXR1cm4gbHJUYWJsZVZpc3VhbGl6YXRpb25zXG5cdFx0Lm1hcCgodmlzdWFsaXphdGlvbikgPT4ge1xuXHRcdFx0Y29uc3QgdGFibGVGaWx0ZXJzID0gdmlzdWFsaXphdGlvbi5jb250cm9sLmZpbHRlcnM7XG5cdFx0XHRjb25zdCB0YWJsZVNWQ29uZmlnczogU2VsZWN0aW9uVmFyaWFudENvbmZpZ3VyYXRpb25bXSA9IFtdO1xuXHRcdFx0Zm9yIChjb25zdCBrZXkgaW4gdGFibGVGaWx0ZXJzKSB7XG5cdFx0XHRcdGlmIChBcnJheS5pc0FycmF5KHRhYmxlRmlsdGVyc1trZXldLnBhdGhzKSkge1xuXHRcdFx0XHRcdGNvbnN0IHBhdGhzID0gdGFibGVGaWx0ZXJzW2tleV0ucGF0aHM7XG5cdFx0XHRcdFx0cGF0aHMuZm9yRWFjaCgocGF0aCkgPT4ge1xuXHRcdFx0XHRcdFx0aWYgKHBhdGggJiYgcGF0aC5hbm5vdGF0aW9uUGF0aCAmJiBzZWxlY3Rpb25WYXJpYW50UGF0aHMuaW5kZXhPZihwYXRoLmFubm90YXRpb25QYXRoKSA9PT0gLTEpIHtcblx0XHRcdFx0XHRcdFx0c2VsZWN0aW9uVmFyaWFudFBhdGhzLnB1c2gocGF0aC5hbm5vdGF0aW9uUGF0aCk7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IHNlbGVjdGlvblZhcmlhbnRDb25maWcgPSBnZXRTZWxlY3Rpb25WYXJpYW50Q29uZmlndXJhdGlvbihwYXRoLmFubm90YXRpb25QYXRoLCBjb252ZXJ0ZXJDb250ZXh0KTtcblx0XHRcdFx0XHRcdFx0aWYgKHNlbGVjdGlvblZhcmlhbnRDb25maWcpIHtcblx0XHRcdFx0XHRcdFx0XHR0YWJsZVNWQ29uZmlncy5wdXNoKHNlbGVjdGlvblZhcmlhbnRDb25maWcpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiB0YWJsZVNWQ29uZmlncztcblx0XHR9KVxuXHRcdC5yZWR1Y2UoKHN2Q29uZmlncywgc2VsZWN0aW9uVmFyaWFudCkgPT4gc3ZDb25maWdzLmNvbmNhdChzZWxlY3Rpb25WYXJpYW50KSwgW10pO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGNvbmRpdGlvbiBwYXRoIHJlcXVpcmVkIGZvciB0aGUgY29uZGl0aW9uIG1vZGVsLiBJdCBsb29rcyBhcyBmb2xsb3dzOlxuICogPDE6Ti1Qcm9wZXJ0eU5hbWU+KlxcLzwxOjEtUHJvcGVydHlOYW1lPi88UHJvcGVydHlOYW1lPi5cbiAqXG4gKiBAcGFyYW0gZW50aXR5VHlwZSBUaGUgcm9vdCBFbnRpdHlUeXBlXG4gKiBAcGFyYW0gcHJvcGVydHlQYXRoIFRoZSBmdWxsIHBhdGggdG8gdGhlIHRhcmdldCBwcm9wZXJ0eVxuICogQHJldHVybnMgVGhlIGZvcm1hdHRlZCBjb25kaXRpb24gcGF0aFxuICovXG5jb25zdCBfZ2V0Q29uZGl0aW9uUGF0aCA9IGZ1bmN0aW9uIChlbnRpdHlUeXBlOiBFbnRpdHlUeXBlLCBwcm9wZXJ0eVBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG5cdGNvbnN0IHBhcnRzID0gcHJvcGVydHlQYXRoLnNwbGl0KFwiL1wiKTtcblx0bGV0IHBhcnRpYWxQYXRoO1xuXHRsZXQga2V5ID0gXCJcIjtcblx0d2hpbGUgKHBhcnRzLmxlbmd0aCkge1xuXHRcdGxldCBwYXJ0ID0gcGFydHMuc2hpZnQoKSBhcyBzdHJpbmc7XG5cdFx0cGFydGlhbFBhdGggPSBwYXJ0aWFsUGF0aCA/IGAke3BhcnRpYWxQYXRofS8ke3BhcnR9YCA6IHBhcnQ7XG5cdFx0Y29uc3QgcHJvcGVydHk6IFByb3BlcnR5IHwgTmF2aWdhdGlvblByb3BlcnR5ID0gZW50aXR5VHlwZS5yZXNvbHZlUGF0aChwYXJ0aWFsUGF0aCk7XG5cdFx0aWYgKHByb3BlcnR5Ll90eXBlID09PSBcIk5hdmlnYXRpb25Qcm9wZXJ0eVwiICYmIHByb3BlcnR5LmlzQ29sbGVjdGlvbikge1xuXHRcdFx0cGFydCArPSBcIipcIjtcblx0XHR9XG5cdFx0a2V5ID0ga2V5ID8gYCR7a2V5fS8ke3BhcnR9YCA6IHBhcnQ7XG5cdH1cblx0cmV0dXJuIGtleTtcbn07XG5cbmNvbnN0IF9jcmVhdGVGaWx0ZXJTZWxlY3Rpb25GaWVsZCA9IGZ1bmN0aW9uIChcblx0ZW50aXR5VHlwZTogRW50aXR5VHlwZSxcblx0cHJvcGVydHk6IFByb3BlcnR5LFxuXHRmdWxsUHJvcGVydHlQYXRoOiBzdHJpbmcsXG5cdGluY2x1ZGVIaWRkZW46IGJvb2xlYW4sXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHRcbik6IEZpbHRlckZpZWxkIHwgdW5kZWZpbmVkIHtcblx0Ly8gaWdub3JlIGNvbXBsZXggcHJvcGVydHkgdHlwZXMgYW5kIGhpZGRlbiBhbm5vdGF0ZWQgb25lc1xuXHRpZiAoXG5cdFx0cHJvcGVydHkgIT09IHVuZGVmaW5lZCAmJlxuXHRcdHByb3BlcnR5LnRhcmdldFR5cGUgPT09IHVuZGVmaW5lZCAmJlxuXHRcdChpbmNsdWRlSGlkZGVuIHx8IHByb3BlcnR5LmFubm90YXRpb25zPy5VST8uSGlkZGVuPy52YWx1ZU9mKCkgIT09IHRydWUpXG5cdCkge1xuXHRcdGNvbnN0IHRhcmdldEVudGl0eVR5cGUgPSBjb252ZXJ0ZXJDb250ZXh0LmdldEFubm90YXRpb25FbnRpdHlUeXBlKHByb3BlcnR5KTtcblx0XHRyZXR1cm4ge1xuXHRcdFx0a2V5OiBLZXlIZWxwZXIuZ2V0U2VsZWN0aW9uRmllbGRLZXlGcm9tUGF0aChmdWxsUHJvcGVydHlQYXRoKSxcblx0XHRcdGFubm90YXRpb25QYXRoOiBjb252ZXJ0ZXJDb250ZXh0LmdldEFic29sdXRlQW5ub3RhdGlvblBhdGgoZnVsbFByb3BlcnR5UGF0aCksXG5cdFx0XHRjb25kaXRpb25QYXRoOiBfZ2V0Q29uZGl0aW9uUGF0aChlbnRpdHlUeXBlLCBmdWxsUHJvcGVydHlQYXRoKSxcblx0XHRcdGF2YWlsYWJpbGl0eTpcblx0XHRcdFx0cHJvcGVydHkuYW5ub3RhdGlvbnM/LlVJPy5IaWRkZW5GaWx0ZXI/LnZhbHVlT2YoKSA9PT0gdHJ1ZSA/IEF2YWlsYWJpbGl0eVR5cGUuSGlkZGVuIDogQXZhaWxhYmlsaXR5VHlwZS5BZGFwdGF0aW9uLFxuXHRcdFx0bGFiZWw6IGNvbXBpbGVFeHByZXNzaW9uKGdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbihwcm9wZXJ0eS5hbm5vdGF0aW9ucy5Db21tb24/LkxhYmVsPy52YWx1ZU9mKCkgfHwgcHJvcGVydHkubmFtZSkpLFxuXHRcdFx0Z3JvdXA6IHRhcmdldEVudGl0eVR5cGUubmFtZSxcblx0XHRcdGdyb3VwTGFiZWw6IGNvbXBpbGVFeHByZXNzaW9uKFxuXHRcdFx0XHRnZXRFeHByZXNzaW9uRnJvbUFubm90YXRpb24odGFyZ2V0RW50aXR5VHlwZT8uYW5ub3RhdGlvbnM/LkNvbW1vbj8uTGFiZWw/LnZhbHVlT2YoKSB8fCB0YXJnZXRFbnRpdHlUeXBlLm5hbWUpXG5cdFx0XHQpXG5cdFx0fTtcblx0fVxuXHRyZXR1cm4gdW5kZWZpbmVkO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldE1vZGVsVHlwZShzVHlwZTogYW55KSB7XG5cdHR5cGUgZGVmYXVsdE1vZGVsVHlwZSA9IHtcblx0XHRba2V5OiBzdHJpbmddOiB7XG5cdFx0XHRba2V5OiBzdHJpbmddOiBzdHJpbmc7XG5cdFx0fTtcblx0fTtcblx0Y29uc3QgbURlZmF1bHRUeXBlRm9yRWRtVHlwZTogZGVmYXVsdE1vZGVsVHlwZSA9IHtcblx0XHRcIkVkbS5Cb29sZWFuXCI6IHtcblx0XHRcdG1vZGVsVHlwZTogXCJCb29sXCJcblx0XHR9LFxuXHRcdFwiRWRtLkJ5dGVcIjoge1xuXHRcdFx0bW9kZWxUeXBlOiBcIkludFwiXG5cdFx0fSxcblx0XHRcIkVkbS5EYXRlXCI6IHtcblx0XHRcdG1vZGVsVHlwZTogXCJEYXRlXCJcblx0XHR9LFxuXHRcdFwiRWRtLkRhdGVUaW1lXCI6IHtcblx0XHRcdG1vZGVsVHlwZTogXCJEYXRlXCJcblx0XHR9LFxuXHRcdFwiRWRtLkRhdGVUaW1lT2Zmc2V0XCI6IHtcblx0XHRcdG1vZGVsVHlwZTogXCJEYXRlVGltZU9mZnNldFwiXG5cdFx0fSxcblx0XHRcIkVkbS5EZWNpbWFsXCI6IHtcblx0XHRcdG1vZGVsVHlwZTogXCJEZWNpbWFsXCJcblx0XHR9LFxuXHRcdFwiRWRtLkRvdWJsZVwiOiB7XG5cdFx0XHRtb2RlbFR5cGU6IFwiRmxvYXRcIlxuXHRcdH0sXG5cdFx0XCJFZG0uRmxvYXRcIjoge1xuXHRcdFx0bW9kZWxUeXBlOiBcIkZsb2F0XCJcblx0XHR9LFxuXHRcdFwiRWRtLkd1aWRcIjoge1xuXHRcdFx0bW9kZWxUeXBlOiBcIkd1aWRcIlxuXHRcdH0sXG5cdFx0XCJFZG0uSW50MTZcIjoge1xuXHRcdFx0bW9kZWxUeXBlOiBcIkludFwiXG5cdFx0fSxcblx0XHRcIkVkbS5JbnQzMlwiOiB7XG5cdFx0XHRtb2RlbFR5cGU6IFwiSW50XCJcblx0XHR9LFxuXHRcdFwiRWRtLkludDY0XCI6IHtcblx0XHRcdG1vZGVsVHlwZTogXCJJbnRcIlxuXHRcdH0sXG5cdFx0XCJFZG0uU0J5dGVcIjoge1xuXHRcdFx0bW9kZWxUeXBlOiBcIkludFwiXG5cdFx0fSxcblx0XHRcIkVkbS5TaW5nbGVcIjoge1xuXHRcdFx0bW9kZWxUeXBlOiBcIkZsb2F0XCJcblx0XHR9LFxuXHRcdFwiRWRtLlN0cmluZ1wiOiB7XG5cdFx0XHRtb2RlbFR5cGU6IFwiU3RyaW5nXCJcblx0XHR9LFxuXHRcdFwiRWRtLlRpbWVcIjoge1xuXHRcdFx0bW9kZWxUeXBlOiBcIlRpbWVPZkRheVwiXG5cdFx0fSxcblx0XHRcIkVkbS5UaW1lT2ZEYXlcIjoge1xuXHRcdFx0bW9kZWxUeXBlOiBcIlRpbWVPZkRheVwiXG5cdFx0fSxcblx0XHRcIkVkbS5TdHJlYW1cIjoge1xuXHRcdFx0Ly9ubyBjb3JyZXNwb25kaW5nIG1vZGVsVHlwZSAtIGlnbm9yZSBmb3IgZmlsdGVyaW5nXG5cdFx0fVxuXHR9O1xuXHRyZXR1cm4gc1R5cGUgJiYgc1R5cGUgaW4gbURlZmF1bHRUeXBlRm9yRWRtVHlwZSAmJiBtRGVmYXVsdFR5cGVGb3JFZG1UeXBlW3NUeXBlXS5tb2RlbFR5cGU7XG59XG5jb25zdCBfZ2V0U2VsZWN0aW9uRmllbGRzID0gZnVuY3Rpb24gKFxuXHRlbnRpdHlUeXBlOiBFbnRpdHlUeXBlLFxuXHRuYXZpZ2F0aW9uUGF0aDogc3RyaW5nLFxuXHRwcm9wZXJ0aWVzOiBBcnJheTxQcm9wZXJ0eT4gfCB1bmRlZmluZWQsXG5cdGluY2x1ZGVIaWRkZW46IGJvb2xlYW4sXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHRcbik6IFJlY29yZDxzdHJpbmcsIEZpbHRlckZpZWxkPiB7XG5cdGNvbnN0IHNlbGVjdGlvbkZpZWxkTWFwOiBSZWNvcmQ8c3RyaW5nLCBGaWx0ZXJGaWVsZD4gPSB7fTtcblx0aWYgKHByb3BlcnRpZXMpIHtcblx0XHRwcm9wZXJ0aWVzLmZvckVhY2goKHByb3BlcnR5OiBQcm9wZXJ0eSkgPT4ge1xuXHRcdFx0Y29uc3QgcHJvcGVydHlQYXRoOiBzdHJpbmcgPSBwcm9wZXJ0eS5uYW1lO1xuXHRcdFx0Y29uc3QgZnVsbFBhdGg6IHN0cmluZyA9IChuYXZpZ2F0aW9uUGF0aCA/IGAke25hdmlnYXRpb25QYXRofS9gIDogXCJcIikgKyBwcm9wZXJ0eVBhdGg7XG5cdFx0XHRjb25zdCBzZWxlY3Rpb25GaWVsZCA9IF9jcmVhdGVGaWx0ZXJTZWxlY3Rpb25GaWVsZChlbnRpdHlUeXBlLCBwcm9wZXJ0eSwgZnVsbFBhdGgsIGluY2x1ZGVIaWRkZW4sIGNvbnZlcnRlckNvbnRleHQpO1xuXHRcdFx0aWYgKHNlbGVjdGlvbkZpZWxkKSB7XG5cdFx0XHRcdHNlbGVjdGlvbkZpZWxkTWFwW2Z1bGxQYXRoXSA9IHNlbGVjdGlvbkZpZWxkO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cdHJldHVybiBzZWxlY3Rpb25GaWVsZE1hcDtcbn07XG5cbmNvbnN0IF9nZXRTZWxlY3Rpb25GaWVsZHNCeVBhdGggPSBmdW5jdGlvbiAoXG5cdGVudGl0eVR5cGU6IEVudGl0eVR5cGUsXG5cdHByb3BlcnR5UGF0aHM6IEFycmF5PHN0cmluZz4gfCB1bmRlZmluZWQsXG5cdGluY2x1ZGVIaWRkZW46IGJvb2xlYW4sXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHRcbik6IFJlY29yZDxzdHJpbmcsIEZpbHRlckZpZWxkPiB7XG5cdGxldCBzZWxlY3Rpb25GaWVsZHM6IFJlY29yZDxzdHJpbmcsIEZpbHRlckZpZWxkPiA9IHt9O1xuXHRpZiAocHJvcGVydHlQYXRocykge1xuXHRcdHByb3BlcnR5UGF0aHMuZm9yRWFjaCgocHJvcGVydHlQYXRoOiBzdHJpbmcpID0+IHtcblx0XHRcdGxldCBsb2NhbFNlbGVjdGlvbkZpZWxkczogUmVjb3JkPHN0cmluZywgRmlsdGVyRmllbGQ+O1xuXG5cdFx0XHRjb25zdCBwcm9wZXJ0eTogUHJvcGVydHkgfCBOYXZpZ2F0aW9uUHJvcGVydHkgPSBlbnRpdHlUeXBlLnJlc29sdmVQYXRoKHByb3BlcnR5UGF0aCk7XG5cdFx0XHRpZiAocHJvcGVydHkgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRpZiAocHJvcGVydHkuX3R5cGUgPT09IFwiTmF2aWdhdGlvblByb3BlcnR5XCIpIHtcblx0XHRcdFx0Ly8gaGFuZGxlIG5hdmlnYXRpb24gcHJvcGVydGllc1xuXHRcdFx0XHRsb2NhbFNlbGVjdGlvbkZpZWxkcyA9IF9nZXRTZWxlY3Rpb25GaWVsZHMoXG5cdFx0XHRcdFx0ZW50aXR5VHlwZSxcblx0XHRcdFx0XHRwcm9wZXJ0eVBhdGgsXG5cdFx0XHRcdFx0cHJvcGVydHkudGFyZ2V0VHlwZS5lbnRpdHlQcm9wZXJ0aWVzLFxuXHRcdFx0XHRcdGluY2x1ZGVIaWRkZW4sXG5cdFx0XHRcdFx0Y29udmVydGVyQ29udGV4dFxuXHRcdFx0XHQpO1xuXHRcdFx0fSBlbHNlIGlmIChwcm9wZXJ0eS50YXJnZXRUeXBlICE9PSB1bmRlZmluZWQgJiYgcHJvcGVydHkudGFyZ2V0VHlwZS5fdHlwZSA9PT0gXCJDb21wbGV4VHlwZVwiKSB7XG5cdFx0XHRcdC8vIGhhbmRsZSBDb21wbGV4VHlwZSBwcm9wZXJ0aWVzXG5cdFx0XHRcdGxvY2FsU2VsZWN0aW9uRmllbGRzID0gX2dldFNlbGVjdGlvbkZpZWxkcyhcblx0XHRcdFx0XHRlbnRpdHlUeXBlLFxuXHRcdFx0XHRcdHByb3BlcnR5UGF0aCxcblx0XHRcdFx0XHRwcm9wZXJ0eS50YXJnZXRUeXBlLnByb3BlcnRpZXMsXG5cdFx0XHRcdFx0aW5jbHVkZUhpZGRlbixcblx0XHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0XG5cdFx0XHRcdCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCBuYXZpZ2F0aW9uUGF0aCA9IHByb3BlcnR5UGF0aC5pbmNsdWRlcyhcIi9cIikgPyBwcm9wZXJ0eVBhdGguc3BsaXQoXCIvXCIpLnNwbGljZSgwLCAxKS5qb2luKFwiL1wiKSA6IFwiXCI7XG5cdFx0XHRcdGxvY2FsU2VsZWN0aW9uRmllbGRzID0gX2dldFNlbGVjdGlvbkZpZWxkcyhlbnRpdHlUeXBlLCBuYXZpZ2F0aW9uUGF0aCwgW3Byb3BlcnR5XSwgaW5jbHVkZUhpZGRlbiwgY29udmVydGVyQ29udGV4dCk7XG5cdFx0XHR9XG5cblx0XHRcdHNlbGVjdGlvbkZpZWxkcyA9IHtcblx0XHRcdFx0Li4uc2VsZWN0aW9uRmllbGRzLFxuXHRcdFx0XHQuLi5sb2NhbFNlbGVjdGlvbkZpZWxkc1xuXHRcdFx0fTtcblx0XHR9KTtcblx0fVxuXHRyZXR1cm4gc2VsZWN0aW9uRmllbGRzO1xufTtcblxuY29uc3QgX2dldEZpbHRlckZpZWxkID0gZnVuY3Rpb24gKFxuXHRmaWx0ZXJGaWVsZHM6IFJlY29yZDxzdHJpbmcsIEZpbHRlckZpZWxkPixcblx0cHJvcGVydHlQYXRoOiBzdHJpbmcsXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdGVudGl0eVR5cGU6IEVudGl0eVR5cGVcbik6IEZpbHRlckZpZWxkIHwgdW5kZWZpbmVkIHtcblx0bGV0IGZpbHRlckZpZWxkOiBGaWx0ZXJGaWVsZCB8IHVuZGVmaW5lZCA9IGZpbHRlckZpZWxkc1twcm9wZXJ0eVBhdGhdO1xuXHRjb25zdCBhdmFpbGFiaWxpdHkgPSBmaWx0ZXJGaWVsZCAmJiBmaWx0ZXJGaWVsZC5hdmFpbGFiaWxpdHk7XG5cdGlmIChmaWx0ZXJGaWVsZCkge1xuXHRcdGRlbGV0ZSBmaWx0ZXJGaWVsZHNbcHJvcGVydHlQYXRoXTtcblx0fSBlbHNlIHtcblx0XHRmaWx0ZXJGaWVsZCA9IF9jcmVhdGVGaWx0ZXJTZWxlY3Rpb25GaWVsZChlbnRpdHlUeXBlLCBlbnRpdHlUeXBlLnJlc29sdmVQYXRoKHByb3BlcnR5UGF0aCksIHByb3BlcnR5UGF0aCwgdHJ1ZSwgY29udmVydGVyQ29udGV4dCk7XG5cdH1cblx0aWYgKCFmaWx0ZXJGaWVsZCkge1xuXHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0RGlhZ25vc3RpY3MoKT8uYWRkSXNzdWUoSXNzdWVDYXRlZ29yeS5Bbm5vdGF0aW9uLCBJc3N1ZVNldmVyaXR5LkhpZ2gsIElzc3VlVHlwZS5NSVNTSU5HX1NFTEVDVElPTkZJRUxEKTtcblx0fVxuXHQvLyBkZWZpbmVkIFNlbGVjdGlvbkZpZWxkcyBhcmUgYXZhaWxhYmxlIGJ5IGRlZmF1bHRcblx0aWYgKGZpbHRlckZpZWxkKSB7XG5cdFx0ZmlsdGVyRmllbGQuYXZhaWxhYmlsaXR5ID0gYXZhaWxhYmlsaXR5ID09PSBBdmFpbGFiaWxpdHlUeXBlLkhpZGRlbiA/IEF2YWlsYWJpbGl0eVR5cGUuSGlkZGVuIDogQXZhaWxhYmlsaXR5VHlwZS5EZWZhdWx0O1xuXHRcdGZpbHRlckZpZWxkLmlzUGFyYW1ldGVyID0gISFlbnRpdHlUeXBlLmFubm90YXRpb25zPy5Db21tb24/LlJlc3VsdENvbnRleHQ7XG5cdH1cblx0cmV0dXJuIGZpbHRlckZpZWxkO1xufTtcblxuY29uc3QgX2dldERlZmF1bHRGaWx0ZXJGaWVsZHMgPSBmdW5jdGlvbiAoXG5cdGFTZWxlY3RPcHRpb25zOiBhbnlbXSxcblx0ZW50aXR5VHlwZTogRW50aXR5VHlwZSxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCxcblx0ZXhjbHVkZWRGaWx0ZXJQcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPixcblx0YW5ub3RhdGVkU2VsZWN0aW9uRmllbGRzOiBQcm9wZXJ0eVBhdGhbXVxuKTogRmlsdGVyRmllbGRbXSB7XG5cdGNvbnN0IHNlbGVjdGlvbkZpZWxkczogRmlsdGVyRmllbGRbXSA9IFtdO1xuXHRjb25zdCBVSVNlbGVjdGlvbkZpZWxkczogYW55ID0ge307XG5cdGNvbnN0IHByb3BlcnRpZXMgPSBlbnRpdHlUeXBlLmVudGl0eVByb3BlcnRpZXM7XG5cdC8vIFVzaW5nIGVudGl0eVR5cGUgaW5zdGVhZCBvZiBlbnRpdHlTZXRcblx0YW5ub3RhdGVkU2VsZWN0aW9uRmllbGRzPy5mb3JFYWNoKChTZWxlY3Rpb25GaWVsZCkgPT4ge1xuXHRcdFVJU2VsZWN0aW9uRmllbGRzW1NlbGVjdGlvbkZpZWxkLnZhbHVlXSA9IHRydWU7XG5cdH0pO1xuXHRpZiAoYVNlbGVjdE9wdGlvbnMgJiYgYVNlbGVjdE9wdGlvbnMubGVuZ3RoID4gMCkge1xuXHRcdGFTZWxlY3RPcHRpb25zPy5mb3JFYWNoKChzZWxlY3RPcHRpb246IFNlbGVjdE9wdGlvblR5cGUpID0+IHtcblx0XHRcdGNvbnN0IHByb3BlcnR5TmFtZTogYW55ID0gc2VsZWN0T3B0aW9uLlByb3BlcnR5TmFtZTtcblx0XHRcdGNvbnN0IHNQcm9wZXJ0eVBhdGg6IHN0cmluZyA9IHByb3BlcnR5TmFtZS52YWx1ZTtcblx0XHRcdGNvbnN0IGN1cnJlbnRTZWxlY3Rpb25GaWVsZHM6IGFueSA9IHt9O1xuXHRcdFx0YW5ub3RhdGVkU2VsZWN0aW9uRmllbGRzPy5mb3JFYWNoKChTZWxlY3Rpb25GaWVsZCkgPT4ge1xuXHRcdFx0XHRjdXJyZW50U2VsZWN0aW9uRmllbGRzW1NlbGVjdGlvbkZpZWxkLnZhbHVlXSA9IHRydWU7XG5cdFx0XHR9KTtcblx0XHRcdGlmICghKHNQcm9wZXJ0eVBhdGggaW4gZXhjbHVkZWRGaWx0ZXJQcm9wZXJ0aWVzKSkge1xuXHRcdFx0XHRpZiAoIShzUHJvcGVydHlQYXRoIGluIGN1cnJlbnRTZWxlY3Rpb25GaWVsZHMpKSB7XG5cdFx0XHRcdFx0Y29uc3QgRmlsdGVyRmllbGQ6IEZpbHRlckZpZWxkIHwgdW5kZWZpbmVkID0gZ2V0RmlsdGVyRmllbGQoc1Byb3BlcnR5UGF0aCwgY29udmVydGVyQ29udGV4dCwgZW50aXR5VHlwZSk7XG5cdFx0XHRcdFx0aWYgKEZpbHRlckZpZWxkKSB7XG5cdFx0XHRcdFx0XHRzZWxlY3Rpb25GaWVsZHMucHVzaChGaWx0ZXJGaWVsZCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH0gZWxzZSBpZiAocHJvcGVydGllcykge1xuXHRcdHByb3BlcnRpZXMuZm9yRWFjaCgocHJvcGVydHk6IFByb3BlcnR5KSA9PiB7XG5cdFx0XHRjb25zdCBkZWZhdWx0RmlsdGVyVmFsdWUgPSBwcm9wZXJ0eS5hbm5vdGF0aW9ucz8uQ29tbW9uPy5GaWx0ZXJEZWZhdWx0VmFsdWU7XG5cdFx0XHRjb25zdCBwcm9wZXJ0eVBhdGggPSBwcm9wZXJ0eS5uYW1lO1xuXHRcdFx0aWYgKCEocHJvcGVydHlQYXRoIGluIGV4Y2x1ZGVkRmlsdGVyUHJvcGVydGllcykpIHtcblx0XHRcdFx0aWYgKGRlZmF1bHRGaWx0ZXJWYWx1ZSAmJiAhKHByb3BlcnR5UGF0aCBpbiBVSVNlbGVjdGlvbkZpZWxkcykpIHtcblx0XHRcdFx0XHRjb25zdCBGaWx0ZXJGaWVsZDogRmlsdGVyRmllbGQgfCB1bmRlZmluZWQgPSBnZXRGaWx0ZXJGaWVsZChwcm9wZXJ0eVBhdGgsIGNvbnZlcnRlckNvbnRleHQsIGVudGl0eVR5cGUpO1xuXHRcdFx0XHRcdGlmIChGaWx0ZXJGaWVsZCkge1xuXHRcdFx0XHRcdFx0c2VsZWN0aW9uRmllbGRzLnB1c2goRmlsdGVyRmllbGQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cdHJldHVybiBzZWxlY3Rpb25GaWVsZHM7XG59O1xuXG4vKipcbiAqIEdldCBhbGwgcGFyYW1ldGVyIGZpbHRlciBmaWVsZHMgaW4gY2FzZSBvZiBhIHBhcmFtZXRlcml6ZWQgc2VydmljZS5cbiAqXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dFxuICogQHJldHVybnMgQW4gYXJyYXkgb2YgcGFyYW1ldGVyIGZpbHRlcmZpZWxkc1xuICovXG5mdW5jdGlvbiBfZ2V0UGFyYW1ldGVyRmllbGRzKGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQpOiBGaWx0ZXJGaWVsZFtdIHtcblx0Y29uc3QgZGF0YU1vZGVsT2JqZWN0UGF0aCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpO1xuXHRjb25zdCBwYXJhbWV0ZXJFbnRpdHlUeXBlID0gZGF0YU1vZGVsT2JqZWN0UGF0aC5zdGFydGluZ0VudGl0eVNldC5lbnRpdHlUeXBlO1xuXHRjb25zdCBpc1BhcmFtZXRlcml6ZWQgPSAhIXBhcmFtZXRlckVudGl0eVR5cGUuYW5ub3RhdGlvbnM/LkNvbW1vbj8uUmVzdWx0Q29udGV4dCAmJiAhZGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRFbnRpdHlTZXQ7XG5cdGNvbnN0IHBhcmFtZXRlckNvbnZlcnRlckNvbnRleHQgPVxuXHRcdGlzUGFyYW1ldGVyaXplZCAmJiBjb252ZXJ0ZXJDb250ZXh0LmdldENvbnZlcnRlckNvbnRleHRGb3IoYC8ke2RhdGFNb2RlbE9iamVjdFBhdGguc3RhcnRpbmdFbnRpdHlTZXQubmFtZX1gKTtcblxuXHRyZXR1cm4gKFxuXHRcdHBhcmFtZXRlckNvbnZlcnRlckNvbnRleHRcblx0XHRcdD8gcGFyYW1ldGVyRW50aXR5VHlwZS5lbnRpdHlQcm9wZXJ0aWVzLm1hcChmdW5jdGlvbiAocHJvcGVydHkpIHtcblx0XHRcdFx0XHRyZXR1cm4gX2dldEZpbHRlckZpZWxkKFxuXHRcdFx0XHRcdFx0e30gYXMgUmVjb3JkPHN0cmluZywgRmlsdGVyRmllbGQ+LFxuXHRcdFx0XHRcdFx0cHJvcGVydHkubmFtZSxcblx0XHRcdFx0XHRcdHBhcmFtZXRlckNvbnZlcnRlckNvbnRleHQsXG5cdFx0XHRcdFx0XHRwYXJhbWV0ZXJFbnRpdHlUeXBlXG5cdFx0XHRcdFx0KTtcblx0XHRcdCAgfSlcblx0XHRcdDogW11cblx0KSBhcyBGaWx0ZXJGaWVsZFtdO1xufVxuXG4vKipcbiAqIERldGVybWluZXMgaWYgdGhlIEZpbHRlckJhciBzZWFyY2ggZmllbGQgaXMgaGlkZGVuIG9yIG5vdC5cbiAqXG4gKiBAcGFyYW0gbGlzdFJlcG9ydFRhYmxlcyBUaGUgbGlzdCByZXBvcnQgdGFibGVzXG4gKiBAcGFyYW0gY2hhcnRzIFRoZSBBTFAgY2hhcnRzXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCBUaGUgY29udmVydGVyIGNvbnRleHRcbiAqIEByZXR1cm5zIFRoZSBpbmZvcm1hdGlvbiBpZiB0aGUgRmlsdGVyQmFyIHNlYXJjaCBmaWVsZCBpcyBoaWRkZW4gb3Igbm90XG4gKi9cbmV4cG9ydCBjb25zdCBnZXRGaWx0ZXJCYXJoaWRlQmFzaWNTZWFyY2ggPSBmdW5jdGlvbiAoXG5cdGxpc3RSZXBvcnRUYWJsZXM6IFRhYmxlVmlzdWFsaXphdGlvbltdLFxuXHRjaGFydHM6IENoYXJ0VmlzdWFsaXphdGlvbltdLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0XG4pOiBib29sZWFuIHtcblx0Ly8gQ2hlY2sgaWYgY2hhcnRzIGFsbG93IHNlYXJjaFxuXHRjb25zdCBub1NlYXJjaEluQ2hhcnRzID0gY2hhcnRzLmxlbmd0aCA9PT0gMCB8fCBjaGFydHMuZXZlcnkoKGNoYXJ0KSA9PiAhY2hhcnQuYXBwbHlTdXBwb3J0ZWQuZW5hYmxlU2VhcmNoKTtcblxuXHQvLyBDaGVjayBpZiBhbGwgdGFibGVzIGFyZSBhbmFseXRpY2FsIGFuZCBub25lIG9mIHRoZW0gYWxsb3cgZm9yIHNlYXJjaFxuXHRjb25zdCBub1NlYXJjaEluVGFibGVzID1cblx0XHRsaXN0UmVwb3J0VGFibGVzLmxlbmd0aCA9PT0gMCB8fCBsaXN0UmVwb3J0VGFibGVzLmV2ZXJ5KCh0YWJsZSkgPT4gdGFibGUuZW5hYmxlQW5hbHl0aWNzICYmICF0YWJsZS5lbmFibGVBbmFseXRpY3NTZWFyY2gpO1xuXG5cdGNvbnN0IGNvbnRleHRQYXRoID0gY29udmVydGVyQ29udGV4dC5nZXRDb250ZXh0UGF0aCgpO1xuXHRpZiAoY29udGV4dFBhdGggJiYgbm9TZWFyY2hJbkNoYXJ0cyAmJiBub1NlYXJjaEluVGFibGVzKSB7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG59O1xuXG4vKipcbiAqIFJldHJpZXZlcyBmaWx0ZXIgZmllbGRzIGZyb20gdGhlIG1hbmlmZXN0LlxuICpcbiAqIEBwYXJhbSBlbnRpdHlUeXBlIFRoZSBjdXJyZW50IGVudGl0eVR5cGVcbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHJldHVybnMgVGhlIGZpbHRlciBmaWVsZHMgZGVmaW5lZCBpbiB0aGUgbWFuaWZlc3RcbiAqL1xuZXhwb3J0IGNvbnN0IGdldE1hbmlmZXN0RmlsdGVyRmllbGRzID0gZnVuY3Rpb24gKFxuXHRlbnRpdHlUeXBlOiBFbnRpdHlUeXBlLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0XG4pOiBSZWNvcmQ8c3RyaW5nLCBDdXN0b21FbGVtZW50RmlsdGVyRmllbGQ+IHtcblx0Y29uc3QgZmJDb25maWc6IEZpbHRlck1hbmlmZXN0Q29uZmlndXJhdGlvbiA9IGNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RXcmFwcGVyKCkuZ2V0RmlsdGVyQ29uZmlndXJhdGlvbigpO1xuXHRjb25zdCBkZWZpbmVkRmlsdGVyRmllbGRzOiBSZWNvcmQ8c3RyaW5nLCBGaWx0ZXJGaWVsZE1hbmlmZXN0Q29uZmlndXJhdGlvbj4gPSBmYkNvbmZpZz8uZmlsdGVyRmllbGRzIHx8IHt9O1xuXHRjb25zdCBzZWxlY3Rpb25GaWVsZHM6IFJlY29yZDxzdHJpbmcsIEZpbHRlckZpZWxkPiA9IF9nZXRTZWxlY3Rpb25GaWVsZHNCeVBhdGgoXG5cdFx0ZW50aXR5VHlwZSxcblx0XHRPYmplY3Qua2V5cyhkZWZpbmVkRmlsdGVyRmllbGRzKS5tYXAoKGtleSkgPT4gS2V5SGVscGVyLmdldFBhdGhGcm9tU2VsZWN0aW9uRmllbGRLZXkoa2V5KSksXG5cdFx0dHJ1ZSxcblx0XHRjb252ZXJ0ZXJDb250ZXh0XG5cdCk7XG5cdGNvbnN0IGZpbHRlckZpZWxkczogUmVjb3JkPHN0cmluZywgQ3VzdG9tRWxlbWVudEZpbHRlckZpZWxkPiA9IHt9O1xuXG5cdGZvciAoY29uc3Qgc0tleSBpbiBkZWZpbmVkRmlsdGVyRmllbGRzKSB7XG5cdFx0Y29uc3QgZmlsdGVyRmllbGQgPSBkZWZpbmVkRmlsdGVyRmllbGRzW3NLZXldO1xuXHRcdGNvbnN0IHByb3BlcnR5TmFtZSA9IEtleUhlbHBlci5nZXRQYXRoRnJvbVNlbGVjdGlvbkZpZWxkS2V5KHNLZXkpO1xuXHRcdGNvbnN0IHNlbGVjdGlvbkZpZWxkID0gc2VsZWN0aW9uRmllbGRzW3Byb3BlcnR5TmFtZV07XG5cdFx0Y29uc3QgdHlwZSA9IGZpbHRlckZpZWxkLnR5cGUgPT09IFwiU2xvdFwiID8gZmlsdGVyRmllbGRUeXBlLlNsb3QgOiBmaWx0ZXJGaWVsZFR5cGUuRGVmYXVsdDtcblx0XHRjb25zdCB2aXN1YWxGaWx0ZXIgPVxuXHRcdFx0ZmlsdGVyRmllbGQgJiYgZmlsdGVyRmllbGQ/LnZpc3VhbEZpbHRlclxuXHRcdFx0XHQ/IGdldFZpc3VhbEZpbHRlcnMoZW50aXR5VHlwZSwgY29udmVydGVyQ29udGV4dCwgc0tleSwgZGVmaW5lZEZpbHRlckZpZWxkcylcblx0XHRcdFx0OiB1bmRlZmluZWQ7XG5cdFx0ZmlsdGVyRmllbGRzW3NLZXldID0ge1xuXHRcdFx0a2V5OiBzS2V5LFxuXHRcdFx0dHlwZTogdHlwZSxcblx0XHRcdGFubm90YXRpb25QYXRoOiBzZWxlY3Rpb25GaWVsZD8uYW5ub3RhdGlvblBhdGgsXG5cdFx0XHRjb25kaXRpb25QYXRoOiBzZWxlY3Rpb25GaWVsZD8uY29uZGl0aW9uUGF0aCB8fCBwcm9wZXJ0eU5hbWUsXG5cdFx0XHR0ZW1wbGF0ZTogZmlsdGVyRmllbGQudGVtcGxhdGUsXG5cdFx0XHRsYWJlbDogZmlsdGVyRmllbGQubGFiZWwsXG5cdFx0XHRwb3NpdGlvbjogZmlsdGVyRmllbGQucG9zaXRpb24gfHwgeyBwbGFjZW1lbnQ6IFBsYWNlbWVudC5BZnRlciB9LFxuXHRcdFx0YXZhaWxhYmlsaXR5OiBmaWx0ZXJGaWVsZC5hdmFpbGFiaWxpdHkgfHwgQXZhaWxhYmlsaXR5VHlwZS5EZWZhdWx0LFxuXHRcdFx0c2V0dGluZ3M6IGZpbHRlckZpZWxkLnNldHRpbmdzLFxuXHRcdFx0dmlzdWFsRmlsdGVyOiB2aXN1YWxGaWx0ZXJcblx0XHR9O1xuXHR9XG5cdHJldHVybiBmaWx0ZXJGaWVsZHM7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0RmlsdGVyRmllbGQgPSBmdW5jdGlvbiAocHJvcGVydHlQYXRoOiBzdHJpbmcsIGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsIGVudGl0eVR5cGU6IEVudGl0eVR5cGUpIHtcblx0cmV0dXJuIF9nZXRGaWx0ZXJGaWVsZCh7fSwgcHJvcGVydHlQYXRoLCBjb252ZXJ0ZXJDb250ZXh0LCBlbnRpdHlUeXBlKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRGaWx0ZXJSZXN0cmljdGlvbnMgPSBmdW5jdGlvbiAob0ZpbHRlclJlc3RyaWN0aW9uc0Fubm90YXRpb246IGFueSwgc1Jlc3RyaWN0aW9uOiBhbnkpIHtcblx0aWYgKHNSZXN0cmljdGlvbiA9PT0gXCJSZXF1aXJlZFByb3BlcnRpZXNcIiB8fCBzUmVzdHJpY3Rpb24gPT09IFwiTm9uRmlsdGVyYWJsZVByb3BlcnRpZXNcIikge1xuXHRcdGxldCBhUHJvcHMgPSBbXTtcblx0XHRpZiAob0ZpbHRlclJlc3RyaWN0aW9uc0Fubm90YXRpb24gJiYgb0ZpbHRlclJlc3RyaWN0aW9uc0Fubm90YXRpb25bc1Jlc3RyaWN0aW9uXSkge1xuXHRcdFx0YVByb3BzID0gb0ZpbHRlclJlc3RyaWN0aW9uc0Fubm90YXRpb25bc1Jlc3RyaWN0aW9uXS5tYXAoZnVuY3Rpb24gKG9Qcm9wZXJ0eTogYW55KSB7XG5cdFx0XHRcdHJldHVybiBvUHJvcGVydHkuJFByb3BlcnR5UGF0aCB8fCBvUHJvcGVydHkudmFsdWU7XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0cmV0dXJuIGFQcm9wcztcblx0fSBlbHNlIGlmIChzUmVzdHJpY3Rpb24gPT09IFwiRmlsdGVyQWxsb3dlZEV4cHJlc3Npb25zXCIpIHtcblx0XHRjb25zdCBtQWxsb3dlZEV4cHJlc3Npb25zID0ge30gYXMgYW55O1xuXHRcdGlmIChvRmlsdGVyUmVzdHJpY3Rpb25zQW5ub3RhdGlvbiAmJiBvRmlsdGVyUmVzdHJpY3Rpb25zQW5ub3RhdGlvbi5GaWx0ZXJFeHByZXNzaW9uUmVzdHJpY3Rpb25zKSB7XG5cdFx0XHRvRmlsdGVyUmVzdHJpY3Rpb25zQW5ub3RhdGlvbi5GaWx0ZXJFeHByZXNzaW9uUmVzdHJpY3Rpb25zLmZvckVhY2goZnVuY3Rpb24gKG9Qcm9wZXJ0eTogYW55KSB7XG5cdFx0XHRcdC8vU2luZ2xlVmFsdWUgfCBNdWx0aVZhbHVlIHwgU2luZ2xlUmFuZ2UgfCBNdWx0aVJhbmdlIHwgU2VhcmNoRXhwcmVzc2lvbiB8IE11bHRpUmFuZ2VPclNlYXJjaEV4cHJlc3Npb25cblx0XHRcdFx0aWYgKG1BbGxvd2VkRXhwcmVzc2lvbnNbb1Byb3BlcnR5LlByb3BlcnR5LnZhbHVlXSkge1xuXHRcdFx0XHRcdG1BbGxvd2VkRXhwcmVzc2lvbnNbb1Byb3BlcnR5LlByb3BlcnR5LnZhbHVlXS5wdXNoKG9Qcm9wZXJ0eS5BbGxvd2VkRXhwcmVzc2lvbnMpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdG1BbGxvd2VkRXhwcmVzc2lvbnNbb1Byb3BlcnR5LlByb3BlcnR5LnZhbHVlXSA9IFtvUHJvcGVydHkuQWxsb3dlZEV4cHJlc3Npb25zXTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdHJldHVybiBtQWxsb3dlZEV4cHJlc3Npb25zO1xuXHR9XG5cdHJldHVybiBvRmlsdGVyUmVzdHJpY3Rpb25zQW5ub3RhdGlvbjtcbn07XG5cbmNvbnN0IGdldFNlYXJjaEZpbHRlclByb3BlcnR5SW5mbyA9IGZ1bmN0aW9uICgpIHtcblx0cmV0dXJuIHtcblx0XHRuYW1lOiBcIiRzZWFyY2hcIixcblx0XHRwYXRoOiBcIiRzZWFyY2hcIixcblx0XHRkYXRhVHlwZTogc1N0cmluZ0RhdGFUeXBlLFxuXHRcdG1heENvbmRpdGlvbnM6IDFcblx0fTtcbn07XG5cbmNvbnN0IGdldEVkaXRTdGF0ZUZpbHRlclByb3BlcnR5SW5mbyA9IGZ1bmN0aW9uICgpIHtcblx0cmV0dXJuIHtcblx0XHRuYW1lOiBcIiRlZGl0U3RhdGVcIixcblx0XHRwYXRoOiBcIiRlZGl0U3RhdGVcIixcblx0XHRncm91cExhYmVsOiBcIlwiLFxuXHRcdGdyb3VwOiBcIlwiLFxuXHRcdGRhdGFUeXBlOiBzU3RyaW5nRGF0YVR5cGUsXG5cdFx0aGlkZGVuRmlsdGVyOiBmYWxzZVxuXHR9O1xufTtcblxuY29uc3QgZ2V0U2VhcmNoUmVzdHJpY3Rpb25zID0gZnVuY3Rpb24gKGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQpIHtcblx0cmV0dXJuIGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0KCk/LmFubm90YXRpb25zPy5DYXBhYmlsaXRpZXM/LlNlYXJjaFJlc3RyaWN0aW9ucztcbn07XG5cbmV4cG9ydCBjb25zdCBnZXROYXZpZ2F0aW9uUmVzdHJpY3Rpb25zID0gZnVuY3Rpb24gKGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsIHNOYXZpZ2F0aW9uUGF0aDogc3RyaW5nKSB7XG5cdGNvbnN0IG9OYXZpZ2F0aW9uUmVzdHJpY3Rpb25zOiBhbnkgPSBjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVNldCgpPy5hbm5vdGF0aW9ucz8uQ2FwYWJpbGl0aWVzPy5OYXZpZ2F0aW9uUmVzdHJpY3Rpb25zO1xuXHRjb25zdCBhUmVzdHJpY3RlZFByb3BlcnRpZXMgPSBvTmF2aWdhdGlvblJlc3RyaWN0aW9ucyAmJiBvTmF2aWdhdGlvblJlc3RyaWN0aW9ucy5SZXN0cmljdGVkUHJvcGVydGllcztcblx0cmV0dXJuIChcblx0XHRhUmVzdHJpY3RlZFByb3BlcnRpZXMgJiZcblx0XHRhUmVzdHJpY3RlZFByb3BlcnRpZXMuZmluZChmdW5jdGlvbiAob1Jlc3RyaWN0ZWRQcm9wZXJ0eTogYW55KSB7XG5cdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHRvUmVzdHJpY3RlZFByb3BlcnR5ICYmXG5cdFx0XHRcdG9SZXN0cmljdGVkUHJvcGVydHkuTmF2aWdhdGlvblByb3BlcnR5ICYmXG5cdFx0XHRcdChvUmVzdHJpY3RlZFByb3BlcnR5Lk5hdmlnYXRpb25Qcm9wZXJ0eS4kTmF2aWdhdGlvblByb3BlcnR5UGF0aCA9PT0gc05hdmlnYXRpb25QYXRoIHx8XG5cdFx0XHRcdFx0b1Jlc3RyaWN0ZWRQcm9wZXJ0eS5OYXZpZ2F0aW9uUHJvcGVydHkudmFsdWUgPT09IHNOYXZpZ2F0aW9uUGF0aClcblx0XHRcdCk7XG5cdFx0fSlcblx0KTtcbn07XG5cbmNvbnN0IF9mZXRjaEJhc2ljUHJvcGVydHlJbmZvID0gZnVuY3Rpb24gKG9GaWx0ZXJGaWVsZEluZm86IGFueSkge1xuXHRyZXR1cm4ge1xuXHRcdGtleTogb0ZpbHRlckZpZWxkSW5mby5rZXksXG5cdFx0YW5ub3RhdGlvblBhdGg6IG9GaWx0ZXJGaWVsZEluZm8uYW5ub3RhdGlvblBhdGgsXG5cdFx0Y29uZGl0aW9uUGF0aDogb0ZpbHRlckZpZWxkSW5mby5jb25kaXRpb25QYXRoLFxuXHRcdG5hbWU6IG9GaWx0ZXJGaWVsZEluZm8uY29uZGl0aW9uUGF0aCxcblx0XHRsYWJlbDogb0ZpbHRlckZpZWxkSW5mby5sYWJlbCxcblx0XHRoaWRkZW5GaWx0ZXI6IG9GaWx0ZXJGaWVsZEluZm8uYXZhaWxhYmlsaXR5ID09PSBcIkhpZGRlblwiLFxuXHRcdGRpc3BsYXk6IFwiVmFsdWVcIixcblx0XHRpc1BhcmFtZXRlcjogb0ZpbHRlckZpZWxkSW5mby5pc1BhcmFtZXRlcixcblx0XHRjYXNlU2Vuc2l0aXZlOiBvRmlsdGVyRmllbGRJbmZvLmNhc2VTZW5zaXRpdmUsXG5cdFx0YXZhaWxhYmlsaXR5OiBvRmlsdGVyRmllbGRJbmZvLmF2YWlsYWJpbGl0eSxcblx0XHRwb3NpdGlvbjogb0ZpbHRlckZpZWxkSW5mby5wb3NpdGlvbixcblx0XHR0eXBlOiBvRmlsdGVyRmllbGRJbmZvLnR5cGUsXG5cdFx0dGVtcGxhdGU6IG9GaWx0ZXJGaWVsZEluZm8udGVtcGxhdGUsXG5cdFx0bWVudTogb0ZpbHRlckZpZWxkSW5mby5tZW51XG5cdH07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0U3BlY2lmaWNBbGxvd2VkRXhwcmVzc2lvbiA9IGZ1bmN0aW9uIChhRXhwcmVzc2lvbnM6IGFueSkge1xuXHRjb25zdCBhQWxsb3dlZEV4cHJlc3Npb25zUHJpb3JpdHkgPSBbXG5cdFx0XCJTaW5nbGVWYWx1ZVwiLFxuXHRcdFwiTXVsdGlWYWx1ZVwiLFxuXHRcdFwiU2luZ2xlUmFuZ2VcIixcblx0XHRcIk11bHRpUmFuZ2VcIixcblx0XHRcIlNlYXJjaEV4cHJlc3Npb25cIixcblx0XHRcIk11bHRpUmFuZ2VPclNlYXJjaEV4cHJlc3Npb25cIlxuXHRdO1xuXG5cdGFFeHByZXNzaW9ucy5zb3J0KGZ1bmN0aW9uIChhOiBhbnksIGI6IGFueSkge1xuXHRcdHJldHVybiBhQWxsb3dlZEV4cHJlc3Npb25zUHJpb3JpdHkuaW5kZXhPZihhKSAtIGFBbGxvd2VkRXhwcmVzc2lvbnNQcmlvcml0eS5pbmRleE9mKGIpO1xuXHR9KTtcblxuXHRyZXR1cm4gYUV4cHJlc3Npb25zWzBdO1xufTtcblxuZXhwb3J0IGNvbnN0IGRpc3BsYXlNb2RlID0gZnVuY3Rpb24gKG9Qcm9wZXJ0eUFubm90YXRpb25zOiBhbnksIG9Db2xsZWN0aW9uQW5ub3RhdGlvbnM6IGFueSkge1xuXHRjb25zdCBvVGV4dEFubm90YXRpb24gPSBvUHJvcGVydHlBbm5vdGF0aW9ucz8uQ29tbW9uPy5UZXh0LFxuXHRcdG9UZXh0QXJyYW5nbWVudEFubm90YXRpb24gPVxuXHRcdFx0b1RleHRBbm5vdGF0aW9uICYmXG5cdFx0XHQoKG9Qcm9wZXJ0eUFubm90YXRpb25zICYmIG9Qcm9wZXJ0eUFubm90YXRpb25zPy5Db21tb24/LlRleHQ/LmFubm90YXRpb25zPy5VST8uVGV4dEFycmFuZ2VtZW50KSB8fFxuXHRcdFx0XHQob0NvbGxlY3Rpb25Bbm5vdGF0aW9ucyAmJiBvQ29sbGVjdGlvbkFubm90YXRpb25zPy5VST8uVGV4dEFycmFuZ2VtZW50KSk7XG5cblx0aWYgKG9UZXh0QXJyYW5nbWVudEFubm90YXRpb24pIHtcblx0XHRpZiAob1RleHRBcnJhbmdtZW50QW5ub3RhdGlvbi52YWx1ZU9mKCkgPT09IFwiVUkuVGV4dEFycmFuZ2VtZW50VHlwZS9UZXh0T25seVwiKSB7XG5cdFx0XHRyZXR1cm4gXCJEZXNjcmlwdGlvblwiO1xuXHRcdH0gZWxzZSBpZiAob1RleHRBcnJhbmdtZW50QW5ub3RhdGlvbi52YWx1ZU9mKCkgPT09IFwiVUkuVGV4dEFycmFuZ2VtZW50VHlwZS9UZXh0TGFzdFwiKSB7XG5cdFx0XHRyZXR1cm4gXCJWYWx1ZURlc2NyaXB0aW9uXCI7XG5cdFx0fVxuXHRcdHJldHVybiBcIkRlc2NyaXB0aW9uVmFsdWVcIjsgLy9UZXh0Rmlyc3Rcblx0fVxuXHRyZXR1cm4gb1RleHRBbm5vdGF0aW9uID8gXCJEZXNjcmlwdGlvblZhbHVlXCIgOiBcIlZhbHVlXCI7XG59O1xuXG5jb25zdCBfZmV0Y2hQcm9wZXJ0eUluZm8gPSBmdW5jdGlvbiAoY29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCwgb0ZpbHRlckZpZWxkSW5mbzogYW55LCBvVHlwZUNvbmZpZzogYW55KSB7XG5cdGxldCBvUHJvcGVydHlJbmZvID0gX2ZldGNoQmFzaWNQcm9wZXJ0eUluZm8ob0ZpbHRlckZpZWxkSW5mbyk7XG5cdGNvbnN0IHNBbm5vdGF0aW9uUGF0aCA9IG9GaWx0ZXJGaWVsZEluZm8uYW5ub3RhdGlvblBhdGg7XG5cblx0aWYgKCFzQW5ub3RhdGlvblBhdGgpIHtcblx0XHRyZXR1cm4gb1Byb3BlcnR5SW5mbztcblx0fVxuXHRjb25zdCB0YXJnZXRQcm9wZXJ0eU9iamVjdCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0Q29udmVydGVyQ29udGV4dEZvcihzQW5ub3RhdGlvblBhdGgpLmdldERhdGFNb2RlbE9iamVjdFBhdGgoKS50YXJnZXRPYmplY3Q7XG5cblx0Y29uc3Qgb1Byb3BlcnR5QW5ub3RhdGlvbnMgPSB0YXJnZXRQcm9wZXJ0eU9iamVjdD8uYW5ub3RhdGlvbnM7XG5cdGNvbnN0IG9Db2xsZWN0aW9uQW5ub3RhdGlvbnMgPSBjb252ZXJ0ZXJDb250ZXh0Py5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCkudGFyZ2V0T2JqZWN0Py5hbm5vdGF0aW9ucztcblxuXHRjb25zdCBvRm9ybWF0T3B0aW9ucyA9IG9UeXBlQ29uZmlnLmZvcm1hdE9wdGlvbnM7XG5cdGNvbnN0IG9Db25zdHJhaW50cyA9IG9UeXBlQ29uZmlnLmNvbnN0cmFpbnRzO1xuXHRvUHJvcGVydHlJbmZvID0gT2JqZWN0LmFzc2lnbihvUHJvcGVydHlJbmZvLCB7XG5cdFx0Zm9ybWF0T3B0aW9uczogb0Zvcm1hdE9wdGlvbnMsXG5cdFx0Y29uc3RyYWludHM6IG9Db25zdHJhaW50cyxcblx0XHRkaXNwbGF5OiBkaXNwbGF5TW9kZShvUHJvcGVydHlBbm5vdGF0aW9ucywgb0NvbGxlY3Rpb25Bbm5vdGF0aW9ucylcblx0fSk7XG5cdHJldHVybiBvUHJvcGVydHlJbmZvO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzTXVsdGlWYWx1ZSA9IGZ1bmN0aW9uIChvUHJvcGVydHk6IGFueSkge1xuXHRsZXQgYklzTXVsdGlWYWx1ZSA9IHRydWU7XG5cdC8vU2luZ2xlVmFsdWUgfCBNdWx0aVZhbHVlIHwgU2luZ2xlUmFuZ2UgfCBNdWx0aVJhbmdlIHwgU2VhcmNoRXhwcmVzc2lvbiB8IE11bHRpUmFuZ2VPclNlYXJjaEV4cHJlc3Npb25cblx0c3dpdGNoIChvUHJvcGVydHkuZmlsdGVyRXhwcmVzc2lvbikge1xuXHRcdGNhc2UgXCJTZWFyY2hFeHByZXNzaW9uXCI6XG5cdFx0Y2FzZSBcIlNpbmdsZVJhbmdlXCI6XG5cdFx0Y2FzZSBcIlNpbmdsZVZhbHVlXCI6XG5cdFx0XHRiSXNNdWx0aVZhbHVlID0gZmFsc2U7XG5cdFx0XHRicmVhaztcblx0XHRkZWZhdWx0OlxuXHRcdFx0YnJlYWs7XG5cdH1cblx0aWYgKG9Qcm9wZXJ0eS50eXBlICYmIG9Qcm9wZXJ0eS50eXBlLmluZGV4T2YoXCJCb29sZWFuXCIpID4gMCkge1xuXHRcdGJJc011bHRpVmFsdWUgPSBmYWxzZTtcblx0fVxuXHRyZXR1cm4gYklzTXVsdGlWYWx1ZTtcbn07XG5cbmNvbnN0IGdldEFubm90YXRlZFNlbGVjdGlvbkZpZWxkRGF0YSA9IGZ1bmN0aW9uIChcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCxcblx0bHJUYWJsZXM6IFRhYmxlVmlzdWFsaXphdGlvbltdID0gW10sXG5cdGFubm90YXRpb25QYXRoOiBzdHJpbmcgPSBcIlwiLFxuXHRpbmNsdWRlSGlkZGVuOiBib29sZWFuID0gZmFsc2Vcbikge1xuXHQvLyBGZXRjaCBhbGwgc2VsZWN0aW9uVmFyaWFudHMgZGVmaW5lZCBpbiB0aGUgZGlmZmVyZW50IHZpc3VhbGl6YXRpb25zIGFuZCBkaWZmZXJlbnQgdmlld3MgKG11bHRpIHRhYmxlIG1vZGUpXG5cdGNvbnN0IHNlbGVjdGlvblZhcmlhbnRzOiBTZWxlY3Rpb25WYXJpYW50Q29uZmlndXJhdGlvbltdID0gZ2V0U2VsZWN0aW9uVmFyaWFudHMobHJUYWJsZXMsIGNvbnZlcnRlckNvbnRleHQpO1xuXG5cdC8vIGNyZWF0ZSBhIG1hcCBvZiBwcm9wZXJ0aWVzIHRvIGJlIHVzZWQgaW4gc2VsZWN0aW9uIHZhcmlhbnRzXG5cdGNvbnN0IGV4Y2x1ZGVkRmlsdGVyUHJvcGVydGllczogUmVjb3JkPHN0cmluZywgYm9vbGVhbj4gPSBnZXRFeGNsdWRlZEZpbHRlclByb3BlcnRpZXMoc2VsZWN0aW9uVmFyaWFudHMpO1xuXHRjb25zdCBlbnRpdHlUeXBlID0gY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlUeXBlKCk7XG5cdC8vRmlsdGVycyB3aGljaCBoYXMgdG8gYmUgYWRkZWQgd2hpY2ggaXMgcGFydCBvZiBTVi9EZWZhdWx0IGFubm90YXRpb25zIGJ1dCBub3QgcHJlc2VudCBpbiB0aGUgU2VsZWN0aW9uRmllbGRzXG5cdGNvbnN0IGFubm90YXRlZFNlbGVjdGlvbkZpZWxkcyA9ICgoYW5ub3RhdGlvblBhdGggJiYgY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlUeXBlQW5ub3RhdGlvbihhbm5vdGF0aW9uUGF0aCk/LmFubm90YXRpb24pIHx8XG5cdFx0ZW50aXR5VHlwZS5hbm5vdGF0aW9ucz8uVUk/LlNlbGVjdGlvbkZpZWxkcyB8fFxuXHRcdFtdKSBhcyBQcm9wZXJ0eVBhdGhbXTtcblxuXHQvLyBjcmVhdGUgYSBtYXAgb2YgYWxsIHBvdGVudGlhbCBmaWx0ZXIgZmllbGRzIGJhc2VkIG9uLi4uXG5cdGNvbnN0IGZpbHRlckZpZWxkczogUmVjb3JkPHN0cmluZywgRmlsdGVyRmllbGQ+ID0ge1xuXHRcdC8vIC4uLm5vbiBoaWRkZW4gcHJvcGVydGllcyBvZiB0aGUgZW50aXR5XG5cdFx0Li4uX2dldFNlbGVjdGlvbkZpZWxkcyhlbnRpdHlUeXBlLCBcIlwiLCBlbnRpdHlUeXBlLmVudGl0eVByb3BlcnRpZXMsIGluY2x1ZGVIaWRkZW4sIGNvbnZlcnRlckNvbnRleHQpLFxuXHRcdC8vIC4uLmFkZGl0aW9uYWwgbWFuaWZlc3QgZGVmaW5lZCBuYXZpZ2F0aW9uIHByb3BlcnRpZXNcblx0XHQuLi5fZ2V0U2VsZWN0aW9uRmllbGRzQnlQYXRoKFxuXHRcdFx0ZW50aXR5VHlwZSxcblx0XHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RXcmFwcGVyKCkuZ2V0RmlsdGVyQ29uZmlndXJhdGlvbigpLm5hdmlnYXRpb25Qcm9wZXJ0aWVzLFxuXHRcdFx0aW5jbHVkZUhpZGRlbixcblx0XHRcdGNvbnZlcnRlckNvbnRleHRcblx0XHQpXG5cdH07XG5cdGxldCBhU2VsZWN0T3B0aW9uczogYW55W10gPSBbXTtcblx0Y29uc3Qgc2VsZWN0aW9uVmFyaWFudCA9IGdldFNlbGVjdGlvblZhcmlhbnQoZW50aXR5VHlwZSwgY29udmVydGVyQ29udGV4dCk7XG5cdGlmIChzZWxlY3Rpb25WYXJpYW50KSB7XG5cdFx0YVNlbGVjdE9wdGlvbnMgPSBzZWxlY3Rpb25WYXJpYW50LlNlbGVjdE9wdGlvbnM7XG5cdH1cblxuXHRjb25zdCBwcm9wZXJ0eUluZm9GaWVsZHM6IGFueSA9XG5cdFx0YW5ub3RhdGVkU2VsZWN0aW9uRmllbGRzPy5yZWR1Y2UoKHNlbGVjdGlvbkZpZWxkczogRmlsdGVyRmllbGRbXSwgc2VsZWN0aW9uRmllbGQpID0+IHtcblx0XHRcdGNvbnN0IHByb3BlcnR5UGF0aCA9IHNlbGVjdGlvbkZpZWxkLnZhbHVlO1xuXHRcdFx0aWYgKCEocHJvcGVydHlQYXRoIGluIGV4Y2x1ZGVkRmlsdGVyUHJvcGVydGllcykpIHtcblx0XHRcdFx0Y29uc3QgZmlsdGVyRmllbGQ6IEZpbHRlckZpZWxkIHwgdW5kZWZpbmVkID0gX2dldEZpbHRlckZpZWxkKGZpbHRlckZpZWxkcywgcHJvcGVydHlQYXRoLCBjb252ZXJ0ZXJDb250ZXh0LCBlbnRpdHlUeXBlKTtcblx0XHRcdFx0aWYgKGZpbHRlckZpZWxkKSB7XG5cdFx0XHRcdFx0ZmlsdGVyRmllbGQuZ3JvdXAgPSBcIlwiO1xuXHRcdFx0XHRcdGZpbHRlckZpZWxkLmdyb3VwTGFiZWwgPSBcIlwiO1xuXHRcdFx0XHRcdHNlbGVjdGlvbkZpZWxkcy5wdXNoKGZpbHRlckZpZWxkKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHNlbGVjdGlvbkZpZWxkcztcblx0XHR9LCBbXSkgfHwgW107XG5cblx0Y29uc3QgZGVmYXVsdEZpbHRlckZpZWxkcyA9IF9nZXREZWZhdWx0RmlsdGVyRmllbGRzKFxuXHRcdGFTZWxlY3RPcHRpb25zLFxuXHRcdGVudGl0eVR5cGUsXG5cdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHRleGNsdWRlZEZpbHRlclByb3BlcnRpZXMsXG5cdFx0YW5ub3RhdGVkU2VsZWN0aW9uRmllbGRzXG5cdCk7XG5cblx0cmV0dXJuIHtcblx0XHRleGNsdWRlZEZpbHRlclByb3BlcnRpZXM6IGV4Y2x1ZGVkRmlsdGVyUHJvcGVydGllcyxcblx0XHRlbnRpdHlUeXBlOiBlbnRpdHlUeXBlLFxuXHRcdGFubm90YXRlZFNlbGVjdGlvbkZpZWxkczogYW5ub3RhdGVkU2VsZWN0aW9uRmllbGRzLFxuXHRcdGZpbHRlckZpZWxkczogZmlsdGVyRmllbGRzLFxuXHRcdHByb3BlcnR5SW5mb0ZpZWxkczogcHJvcGVydHlJbmZvRmllbGRzLFxuXHRcdGRlZmF1bHRGaWx0ZXJGaWVsZHM6IGRlZmF1bHRGaWx0ZXJGaWVsZHNcblx0fTtcbn07XG5leHBvcnQgY29uc3QgcHJvY2Vzc1NlbGVjdGlvbkZpZWxkcyA9IGZ1bmN0aW9uIChcblx0cHJvcGVydHlJbmZvRmllbGRzOiBhbnksXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdGRlZmF1bHRWYWx1ZVByb3BlcnR5RmllbGRzPzogYW55XG4pIHtcblx0Ly9nZXQgVHlwZUNvbmZpZyBmdW5jdGlvblxuXHRjb25zdCBzZWxlY3Rpb25GaWVsZFR5cGVzOiBhbnkgPSBbXTtcblx0Y29uc3QgYVR5cGVDb25maWc6IGFueSA9IHt9O1xuXHRjb25zdCBfZm5UeXBlQ29uZmlnID0gZnVuY3Rpb24gKHByb3BlcnR5OiBQcm9wZXJ0eSwga2V5OiBzdHJpbmcpIHtcblx0XHRjb25zdCBvVHlwZUNvbmZpZyA9IGdldFR5cGVDb25maWcocHJvcGVydHksIHByb3BlcnR5Py50eXBlKTtcblx0XHRzZWxlY3Rpb25GaWVsZFR5cGVzLnB1c2gocHJvcGVydHk/LnR5cGUpO1xuXHRcdGlmIChcblx0XHRcdHByb3BlcnR5Py50eXBlID09PSBzRWRtU3RyaW5nICYmXG5cdFx0XHQob1R5cGVDb25maWcuY29uc3RyYWludHMubnVsbGFibGUgPT09IHVuZGVmaW5lZCB8fCBvVHlwZUNvbmZpZy5jb25zdHJhaW50cy5udWxsYWJsZSA9PT0gdHJ1ZSlcblx0XHQpIHtcblx0XHRcdG9UeXBlQ29uZmlnLmZvcm1hdE9wdGlvbnMucGFyc2VLZWVwc0VtcHR5U3RyaW5nID0gZmFsc2U7XG5cdFx0fVxuXHRcdGFUeXBlQ29uZmlnW2tleV0gPSBvVHlwZUNvbmZpZztcblx0fTtcblxuXHRpZiAoZGVmYXVsdFZhbHVlUHJvcGVydHlGaWVsZHMpIHtcblx0XHRwcm9wZXJ0eUluZm9GaWVsZHMgPSBwcm9wZXJ0eUluZm9GaWVsZHMuY29uY2F0KGRlZmF1bHRWYWx1ZVByb3BlcnR5RmllbGRzKTtcblx0fVxuXHQvL2FkZCB0eXBlQ29uZmlnXG5cdHByb3BlcnR5SW5mb0ZpZWxkcy5mb3JFYWNoKGZ1bmN0aW9uIChwYXJhbWV0ZXJGaWVsZDogYW55KSB7XG5cdFx0aWYgKHBhcmFtZXRlckZpZWxkLmFubm90YXRpb25QYXRoKSB7XG5cdFx0XHRjb25zdCBwcm9wZXJ0eUNvbnZlcnR5Q29udGV4dCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0Q29udmVydGVyQ29udGV4dEZvcihwYXJhbWV0ZXJGaWVsZC5hbm5vdGF0aW9uUGF0aCk7XG5cdFx0XHRjb25zdCBwcm9wZXJ0eVRhcmdldE9iamVjdCA9IHByb3BlcnR5Q29udmVydHlDb250ZXh0LmdldERhdGFNb2RlbE9iamVjdFBhdGgoKS50YXJnZXRPYmplY3Q7XG5cdFx0XHRfZm5UeXBlQ29uZmlnKHByb3BlcnR5VGFyZ2V0T2JqZWN0LCBwYXJhbWV0ZXJGaWVsZC5rZXkpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRzZWxlY3Rpb25GaWVsZFR5cGVzLnB1c2goc0VkbVN0cmluZyk7XG5cdFx0XHRhVHlwZUNvbmZpZ1twYXJhbWV0ZXJGaWVsZC5rZXldID0geyB0eXBlOiBzU3RyaW5nRGF0YVR5cGUgfTtcblx0XHR9XG5cdH0pO1xuXG5cdC8vIGZpbHRlclJlc3RyaWN0aW9uc1xuXHRjb25zdCBvRmlsdGVyUmVzdHJpY3Rpb25zID0gY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlTZXQoKT8uYW5ub3RhdGlvbnM/LkNhcGFiaWxpdGllcz8uRmlsdGVyUmVzdHJpY3Rpb25zO1xuXHRjb25zdCBvUmV0ID0ge30gYXMgYW55O1xuXHRvUmV0W1wiUmVxdWlyZWRQcm9wZXJ0aWVzXCJdID0gZ2V0RmlsdGVyUmVzdHJpY3Rpb25zKG9GaWx0ZXJSZXN0cmljdGlvbnMsIFwiUmVxdWlyZWRQcm9wZXJ0aWVzXCIpIHx8IFtdO1xuXHRvUmV0W1wiTm9uRmlsdGVyYWJsZVByb3BlcnRpZXNcIl0gPSBnZXRGaWx0ZXJSZXN0cmljdGlvbnMob0ZpbHRlclJlc3RyaWN0aW9ucywgXCJOb25GaWx0ZXJhYmxlUHJvcGVydGllc1wiKSB8fCBbXTtcblx0b1JldFtcIkZpbHRlckFsbG93ZWRFeHByZXNzaW9uc1wiXSA9IGdldEZpbHRlclJlc3RyaWN0aW9ucyhvRmlsdGVyUmVzdHJpY3Rpb25zLCBcIkZpbHRlckFsbG93ZWRFeHByZXNzaW9uc1wiKSB8fCB7fTtcblxuXHRjb25zdCBzRW50aXR5U2V0UGF0aCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0Q29udGV4dFBhdGgoKTtcblx0Y29uc3QgYVBhdGhQYXJ0cyA9IHNFbnRpdHlTZXRQYXRoLnNwbGl0KFwiL1wiKTtcblx0aWYgKGFQYXRoUGFydHMubGVuZ3RoID4gMikge1xuXHRcdGNvbnN0IHNOYXZpZ2F0aW9uUGF0aCA9IGFQYXRoUGFydHNbYVBhdGhQYXJ0cy5sZW5ndGggLSAxXTtcblx0XHRhUGF0aFBhcnRzLnNwbGljZSgtMSwgMSk7XG5cdFx0Y29uc3Qgb05hdmlnYXRpb25SZXN0cmljdGlvbnMgPSBnZXROYXZpZ2F0aW9uUmVzdHJpY3Rpb25zKGNvbnZlcnRlckNvbnRleHQsIHNOYXZpZ2F0aW9uUGF0aCk7XG5cdFx0Y29uc3Qgb05hdmlnYXRpb25GaWx0ZXJSZXN0cmljdGlvbnMgPSBvTmF2aWdhdGlvblJlc3RyaWN0aW9ucyAmJiBvTmF2aWdhdGlvblJlc3RyaWN0aW9ucy5GaWx0ZXJSZXN0cmljdGlvbnM7XG5cdFx0b1JldC5SZXF1aXJlZFByb3BlcnRpZXMuY29uY2F0KGdldEZpbHRlclJlc3RyaWN0aW9ucyhvTmF2aWdhdGlvbkZpbHRlclJlc3RyaWN0aW9ucywgXCJSZXF1aXJlZFByb3BlcnRpZXNcIikgfHwgW10pO1xuXHRcdG9SZXQuTm9uRmlsdGVyYWJsZVByb3BlcnRpZXMuY29uY2F0KGdldEZpbHRlclJlc3RyaWN0aW9ucyhvTmF2aWdhdGlvbkZpbHRlclJlc3RyaWN0aW9ucywgXCJOb25GaWx0ZXJhYmxlUHJvcGVydGllc1wiKSB8fCBbXSk7XG5cdFx0b1JldC5GaWx0ZXJBbGxvd2VkRXhwcmVzc2lvbnMgPSB7XG5cdFx0XHQuLi4oZ2V0RmlsdGVyUmVzdHJpY3Rpb25zKG9OYXZpZ2F0aW9uRmlsdGVyUmVzdHJpY3Rpb25zLCBcIkZpbHRlckFsbG93ZWRFeHByZXNzaW9uc1wiKSB8fCB7fSksXG5cdFx0XHQuLi5vUmV0LkZpbHRlckFsbG93ZWRFeHByZXNzaW9uc1xuXHRcdH07XG5cdH1cblx0Y29uc3QgaXNDYXNlU2Vuc2l0aXZlID0gaXNGaWx0ZXJpbmdDYXNlU2Vuc2l0aXZlKGNvbnZlcnRlckNvbnRleHQpO1xuXHRjb25zdCBhUmVxdWlyZWRQcm9wcyA9IG9SZXQuUmVxdWlyZWRQcm9wZXJ0aWVzO1xuXHRjb25zdCBhTm9uRmlsdGVyYWJsZVByb3BzID0gb1JldC5Ob25GaWx0ZXJhYmxlUHJvcGVydGllcztcblx0bGV0IG9Qcm9wZXJ0eUluZm87XG5cdGNvbnN0IGFGZXRjaGVkUHJvcGVydGllczogYW55ID0gW107XG5cblx0Ly8gcHJvY2VzcyB0aGUgZmllbGRzIHRvIGFkZCBuZWNlc3NhcnkgcHJvcGVydGllc1xuXHRwcm9wZXJ0eUluZm9GaWVsZHMuZm9yRWFjaChmdW5jdGlvbiAocHJvcGVydHlJbmZvRmllbGQ6IGFueSkge1xuXHRcdGNvbnN0IG9Db252ZXJ0ZWRQcm9wZXJ0eSA9IHByb3BlcnR5SW5mb0ZpZWxkO1xuXHRcdGxldCBzUHJvcGVydHlQYXRoO1xuXHRcdGlmIChvQ29udmVydGVkUHJvcGVydHkuY29uZGl0aW9uUGF0aCkge1xuXHRcdFx0c1Byb3BlcnR5UGF0aCA9IG9Db252ZXJ0ZWRQcm9wZXJ0eS5jb25kaXRpb25QYXRoLnJlcGxhY2UoL1xcK3xcXCovZywgXCJcIik7XG5cdFx0fVxuXHRcdGlmIChhTm9uRmlsdGVyYWJsZVByb3BzLmluZGV4T2Yoc1Byb3BlcnR5UGF0aCkgPT09IC0xKSB7XG5cdFx0XHRvUHJvcGVydHlJbmZvID0gX2ZldGNoUHJvcGVydHlJbmZvKGNvbnZlcnRlckNvbnRleHQsIG9Db252ZXJ0ZWRQcm9wZXJ0eSwgYVR5cGVDb25maWdbcHJvcGVydHlJbmZvRmllbGQua2V5XSk7XG5cdFx0XHRpZiAob1Byb3BlcnR5SW5mbykge1xuXHRcdFx0XHRvUHJvcGVydHlJbmZvID0gT2JqZWN0LmFzc2lnbihvUHJvcGVydHlJbmZvLCB7XG5cdFx0XHRcdFx0bWF4Q29uZGl0aW9uczogIW9Qcm9wZXJ0eUluZm8uaXNQYXJhbWV0ZXIgJiYgaXNNdWx0aVZhbHVlKG9Qcm9wZXJ0eUluZm8pID8gLTEgOiAxLFxuXHRcdFx0XHRcdHJlcXVpcmVkOiBvUHJvcGVydHlJbmZvLmlzUGFyYW1ldGVyIHx8IGFSZXF1aXJlZFByb3BzLmluZGV4T2Yoc1Byb3BlcnR5UGF0aCkgPj0gMCxcblx0XHRcdFx0XHRjYXNlU2Vuc2l0aXZlOiBpc0Nhc2VTZW5zaXRpdmUsXG5cdFx0XHRcdFx0ZGF0YVR5cGU6IGFUeXBlQ29uZmlnW3Byb3BlcnR5SW5mb0ZpZWxkLmtleV0udHlwZVxuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHRhRmV0Y2hlZFByb3BlcnRpZXMucHVzaChvUHJvcGVydHlJbmZvKTtcblx0XHRcdH1cblx0XHR9XG5cdH0pO1xuXG5cdC8vYWRkIGVkaXRcblx0aWYgKGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpLnRhcmdldE9iamVjdD8uYW5ub3RhdGlvbnM/LkNvbW1vbj8uRHJhZnRSb290KSB7XG5cdFx0YUZldGNoZWRQcm9wZXJ0aWVzLnB1c2goZ2V0RWRpdFN0YXRlRmlsdGVyUHJvcGVydHlJbmZvKCkpO1xuXHR9XG5cdC8vIGFkZCBzZWFyY2hcblx0Y29uc3Qgc2VhcmNoUmVzdHJpY3Rpb25zID0gZ2V0U2VhcmNoUmVzdHJpY3Rpb25zKGNvbnZlcnRlckNvbnRleHQpO1xuXHRjb25zdCBoaWRlQmFzaWNTZWFyY2ggPSBCb29sZWFuKHNlYXJjaFJlc3RyaWN0aW9ucyAmJiAhc2VhcmNoUmVzdHJpY3Rpb25zLlNlYXJjaGFibGUpO1xuXHRpZiAoc0VudGl0eVNldFBhdGggJiYgaGlkZUJhc2ljU2VhcmNoICE9PSB0cnVlKSB7XG5cdFx0aWYgKCFzZWFyY2hSZXN0cmljdGlvbnMgfHwgc2VhcmNoUmVzdHJpY3Rpb25zPy5TZWFyY2hhYmxlKSB7XG5cdFx0XHRhRmV0Y2hlZFByb3BlcnRpZXMucHVzaChnZXRTZWFyY2hGaWx0ZXJQcm9wZXJ0eUluZm8oKSk7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGFGZXRjaGVkUHJvcGVydGllcztcbn07XG5cbmV4cG9ydCBjb25zdCBpbnNlcnRDdXN0b21NYW5pZmVzdEVsZW1lbnRzID0gZnVuY3Rpb24gKFxuXHRmaWx0ZXJGaWVsZHM6IEZpbHRlckZpZWxkW10sXG5cdGVudGl0eVR5cGU6IEVudGl0eVR5cGUsXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHRcbikge1xuXHRyZXR1cm4gaW5zZXJ0Q3VzdG9tRWxlbWVudHMoZmlsdGVyRmllbGRzLCBnZXRNYW5pZmVzdEZpbHRlckZpZWxkcyhlbnRpdHlUeXBlLCBjb252ZXJ0ZXJDb250ZXh0KSwge1xuXHRcdFwiYXZhaWxhYmlsaXR5XCI6IFwib3ZlcndyaXRlXCIsXG5cdFx0bGFiZWw6IFwib3ZlcndyaXRlXCIsXG5cdFx0dHlwZTogXCJvdmVyd3JpdGVcIixcblx0XHRwb3NpdGlvbjogXCJvdmVyd3JpdGVcIixcblx0XHR0ZW1wbGF0ZTogXCJvdmVyd3JpdGVcIixcblx0XHRzZXR0aW5nczogXCJvdmVyd3JpdGVcIixcblx0XHR2aXN1YWxGaWx0ZXI6IFwib3ZlcndyaXRlXCJcblx0fSk7XG59O1xuXG4vKipcbiAqIFJldHJpZXZlIHRoZSBjb25maWd1cmF0aW9uIGZvciB0aGUgc2VsZWN0aW9uIGZpZWxkcyB0aGF0IHdpbGwgYmUgdXNlZCB3aXRoaW4gdGhlIGZpbHRlciBiYXJcbiAqIFRoaXMgY29uZmlndXJhdGlvbiB0YWtlcyBpbnRvIGFjY291bnQgYW5ub3RhdGlvbiBhbmQgdGhlIHNlbGVjdGlvbiB2YXJpYW50cy5cbiAqXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dFxuICogQHBhcmFtIGxyVGFibGVzXG4gKiBAcGFyYW0gYW5ub3RhdGlvblBhdGhcbiAqIEBwYXJhbSBbaW5jbHVkZUhpZGRlbl1cbiAqIEByZXR1cm5zIEFuIGFycmF5IG9mIHNlbGVjdGlvbiBmaWVsZHNcbiAqL1xuZXhwb3J0IGNvbnN0IGdldFNlbGVjdGlvbkZpZWxkcyA9IGZ1bmN0aW9uIChcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCxcblx0bHJUYWJsZXM6IFRhYmxlVmlzdWFsaXphdGlvbltdID0gW10sXG5cdGFubm90YXRpb25QYXRoOiBzdHJpbmcgPSBcIlwiLFxuXHRpbmNsdWRlSGlkZGVuPzogYm9vbGVhblxuKTogYW55IHtcblx0Y29uc3Qgb0Fubm90YXRlZFNlbGVjdGlvbkZpZWxkRGF0YSA9IGdldEFubm90YXRlZFNlbGVjdGlvbkZpZWxkRGF0YShjb252ZXJ0ZXJDb250ZXh0LCBsclRhYmxlcywgYW5ub3RhdGlvblBhdGgsIGluY2x1ZGVIaWRkZW4pO1xuXHRjb25zdCBwYXJhbWV0ZXJGaWVsZHMgPSBfZ2V0UGFyYW1ldGVyRmllbGRzKGNvbnZlcnRlckNvbnRleHQpO1xuXHRsZXQgcHJvcGVydHlJbmZvRmllbGRzOiBGaWx0ZXJGaWVsZFtdID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShvQW5ub3RhdGVkU2VsZWN0aW9uRmllbGREYXRhLnByb3BlcnR5SW5mb0ZpZWxkcykpO1xuXHRjb25zdCBlbnRpdHlUeXBlID0gb0Fubm90YXRlZFNlbGVjdGlvbkZpZWxkRGF0YS5lbnRpdHlUeXBlO1xuXG5cdHByb3BlcnR5SW5mb0ZpZWxkcyA9IHBhcmFtZXRlckZpZWxkcy5jb25jYXQocHJvcGVydHlJbmZvRmllbGRzKTtcblxuXHRwcm9wZXJ0eUluZm9GaWVsZHMgPSBpbnNlcnRDdXN0b21NYW5pZmVzdEVsZW1lbnRzKHByb3BlcnR5SW5mb0ZpZWxkcywgZW50aXR5VHlwZSwgY29udmVydGVyQ29udGV4dCk7XG5cblx0Y29uc3QgYUZldGNoZWRQcm9wZXJ0aWVzID0gcHJvY2Vzc1NlbGVjdGlvbkZpZWxkcyhcblx0XHRwcm9wZXJ0eUluZm9GaWVsZHMsXG5cdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHRvQW5ub3RhdGVkU2VsZWN0aW9uRmllbGREYXRhLmRlZmF1bHRGaWx0ZXJGaWVsZHNcblx0KTtcblx0YUZldGNoZWRQcm9wZXJ0aWVzLnNvcnQoZnVuY3Rpb24gKGE6IGFueSwgYjogYW55KSB7XG5cdFx0aWYgKGEuZ3JvdXBMYWJlbCA9PT0gdW5kZWZpbmVkIHx8IGEuZ3JvdXBMYWJlbCA9PT0gbnVsbCkge1xuXHRcdFx0cmV0dXJuIC0xO1xuXHRcdH1cblx0XHRpZiAoYi5ncm91cExhYmVsID09PSB1bmRlZmluZWQgfHwgYi5ncm91cExhYmVsID09PSBudWxsKSB7XG5cdFx0XHRyZXR1cm4gMTtcblx0XHR9XG5cdFx0cmV0dXJuIGEuZ3JvdXBMYWJlbC5sb2NhbGVDb21wYXJlKGIuZ3JvdXBMYWJlbCk7XG5cdH0pO1xuXG5cdGxldCBzRmV0Y2hQcm9wZXJ0aWVzID0gSlNPTi5zdHJpbmdpZnkoYUZldGNoZWRQcm9wZXJ0aWVzKTtcblx0c0ZldGNoUHJvcGVydGllcyA9IHNGZXRjaFByb3BlcnRpZXMucmVwbGFjZSgvXFx7L2csIFwiXFxcXHtcIik7XG5cdHNGZXRjaFByb3BlcnRpZXMgPSBzRmV0Y2hQcm9wZXJ0aWVzLnJlcGxhY2UoL1xcfS9nLCBcIlxcXFx9XCIpO1xuXHRjb25zdCBzUHJvcGVydHlJbmZvID0gc0ZldGNoUHJvcGVydGllcztcblx0Ly8gZW5kIG9mIHByb3BlcnR5RmllbGRzIHByb2Nlc3NpbmdcblxuXHQvLyB0byBwb3B1bGF0ZSBzZWxlY3Rpb24gZmllbGRzXG5cdGxldCBwcm9wU2VsZWN0aW9uRmllbGRzOiBGaWx0ZXJGaWVsZFtdID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShvQW5ub3RhdGVkU2VsZWN0aW9uRmllbGREYXRhLnByb3BlcnR5SW5mb0ZpZWxkcykpO1xuXHRwcm9wU2VsZWN0aW9uRmllbGRzID0gcGFyYW1ldGVyRmllbGRzLmNvbmNhdChwcm9wU2VsZWN0aW9uRmllbGRzKTtcblx0Ly8gY3JlYXRlIGEgbWFwIG9mIHByb3BlcnRpZXMgdG8gYmUgdXNlZCBpbiBzZWxlY3Rpb24gdmFyaWFudHNcblx0Y29uc3QgZXhjbHVkZWRGaWx0ZXJQcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPiA9IG9Bbm5vdGF0ZWRTZWxlY3Rpb25GaWVsZERhdGEuZXhjbHVkZWRGaWx0ZXJQcm9wZXJ0aWVzO1xuXHRjb25zdCBmaWx0ZXJGYWNldHMgPSBlbnRpdHlUeXBlPy5hbm5vdGF0aW9ucz8uVUk/LkZpbHRlckZhY2V0cztcblx0bGV0IGZpbHRlckZhY2V0TWFwOiBSZWNvcmQ8c3RyaW5nLCBGaWx0ZXJHcm91cD4gPSB7fTtcblxuXHRjb25zdCBhRmllbGRHcm91cHMgPSBjb252ZXJ0ZXJDb250ZXh0LmdldEFubm90YXRpb25zQnlUZXJtKFwiVUlcIiwgVUlBbm5vdGF0aW9uVGVybXMuRmllbGRHcm91cCk7XG5cblx0aWYgKGZpbHRlckZhY2V0cyA9PT0gdW5kZWZpbmVkIHx8IGZpbHRlckZhY2V0cy5sZW5ndGggPCAwKSB7XG5cdFx0Zm9yIChjb25zdCBpIGluIGFGaWVsZEdyb3Vwcykge1xuXHRcdFx0ZmlsdGVyRmFjZXRNYXAgPSB7XG5cdFx0XHRcdC4uLmZpbHRlckZhY2V0TWFwLFxuXHRcdFx0XHQuLi5nZXRGaWVsZEdyb3VwRmlsdGVyR3JvdXBzKGFGaWVsZEdyb3Vwc1tpXSBhcyBBbm5vdGF0aW9uVGVybTxGaWVsZEdyb3VwVHlwZT4pXG5cdFx0XHR9O1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHRmaWx0ZXJGYWNldE1hcCA9IGZpbHRlckZhY2V0cy5yZWR1Y2UoKHByZXZpb3VzVmFsdWU6IFJlY29yZDxzdHJpbmcsIEZpbHRlckdyb3VwPiwgZmlsdGVyRmFjZXQ6IFJlZmVyZW5jZUZhY2V0VHlwZXMpID0+IHtcblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgKGZpbHRlckZhY2V0LlRhcmdldC4kdGFyZ2V0IGFzIEZpZWxkR3JvdXApLkRhdGEubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0cHJldmlvdXNWYWx1ZVsoKGZpbHRlckZhY2V0LlRhcmdldC4kdGFyZ2V0IGFzIEZpZWxkR3JvdXApLkRhdGFbaV0gYXMgRGF0YUZpZWxkVHlwZXMpLlZhbHVlLnBhdGhdID0ge1xuXHRcdFx0XHRcdGdyb3VwOiBmaWx0ZXJGYWNldD8uSUQ/LnRvU3RyaW5nKCksXG5cdFx0XHRcdFx0Z3JvdXBMYWJlbDogZmlsdGVyRmFjZXQ/LkxhYmVsPy50b1N0cmluZygpXG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gcHJldmlvdXNWYWx1ZTtcblx0XHR9LCB7fSk7XG5cdH1cblxuXHQvLyBjcmVhdGUgYSBtYXAgb2YgYWxsIHBvdGVudGlhbCBmaWx0ZXIgZmllbGRzIGJhc2VkIG9uLi4uXG5cdGNvbnN0IGZpbHRlckZpZWxkczogUmVjb3JkPHN0cmluZywgRmlsdGVyRmllbGQ+ID0gb0Fubm90YXRlZFNlbGVjdGlvbkZpZWxkRGF0YS5maWx0ZXJGaWVsZHM7XG5cblx0Ly8gZmluYWxseSBjcmVhdGUgZmluYWwgbGlzdCBvZiBmaWx0ZXIgZmllbGRzIGJ5IGFkZGluZyB0aGUgU2VsZWN0aW9uRmllbGRzIGZpcnN0IChvcmRlciBtYXR0ZXJzKS4uLlxuXHRsZXQgYWxsRmlsdGVycyA9IHByb3BTZWxlY3Rpb25GaWVsZHNcblxuXHRcdC8vIC4uLmFuZCBhZGRpbmcgcmVtYWluaW5nIGZpbHRlciBmaWVsZHMsIHRoYXQgYXJlIG5vdCB1c2VkIGluIGEgU2VsZWN0aW9uVmFyaWFudCAob3JkZXIgZG9lc24ndCBtYXR0ZXIpXG5cdFx0LmNvbmNhdChcblx0XHRcdE9iamVjdC5rZXlzKGZpbHRlckZpZWxkcylcblx0XHRcdFx0LmZpbHRlcigocHJvcGVydHlQYXRoKSA9PiAhKHByb3BlcnR5UGF0aCBpbiBleGNsdWRlZEZpbHRlclByb3BlcnRpZXMpKVxuXHRcdFx0XHQubWFwKChwcm9wZXJ0eVBhdGgpID0+IHtcblx0XHRcdFx0XHRyZXR1cm4gT2JqZWN0LmFzc2lnbihmaWx0ZXJGaWVsZHNbcHJvcGVydHlQYXRoXSwgZmlsdGVyRmFjZXRNYXBbcHJvcGVydHlQYXRoXSk7XG5cdFx0XHRcdH0pXG5cdFx0KTtcblx0Y29uc3Qgc0NvbnRleHRQYXRoID0gY29udmVydGVyQ29udGV4dC5nZXRDb250ZXh0UGF0aCgpO1xuXG5cdC8vaWYgYWxsIHRhYmxlcyBhcmUgYW5hbHl0aWNhbCB0YWJsZXMgXCJhZ2dyZWdhdGFibGVcIiBwcm9wZXJ0aWVzIG11c3QgYmUgZXhjbHVkZWRcblx0aWYgKGNoZWNrQWxsVGFibGVGb3JFbnRpdHlTZXRBcmVBbmFseXRpY2FsKGxyVGFibGVzLCBzQ29udGV4dFBhdGgpKSB7XG5cdFx0Ly8gQ3VycmVudGx5IGFsbCBhZ3JlZ2F0ZXMgYXJlIHJvb3QgZW50aXR5IHByb3BlcnRpZXMgKG5vIHByb3BlcnRpZXMgY29taW5nIGZyb20gbmF2aWdhdGlvbikgYW5kIGFsbFxuXHRcdC8vIHRhYmxlcyB3aXRoIHNhbWUgZW50aXR5U2V0IGdldHMgc2FtZSBhZ2dyZWFndGUgY29uZmlndXJhdGlvbiB0aGF0J3Mgd2h5IHdlIGNhbiB1c2UgZmlyc3QgdGFibGUgaW50b1xuXHRcdC8vIExSIHRvIGdldCBhZ2dyZWdhdGVzICh3aXRob3V0IGN1cnJlbmN5L3VuaXQgcHJvcGVydGllcyBzaW5jZSB3ZSBleHBlY3QgdG8gYmUgYWJsZSB0byBmaWx0ZXIgdGhlbSkuXG5cdFx0Y29uc3QgYWdncmVnYXRlcyA9IGxyVGFibGVzWzBdLmFnZ3JlZ2F0ZXM7XG5cdFx0aWYgKGFnZ3JlZ2F0ZXMpIHtcblx0XHRcdGNvbnN0IGFnZ3JlZ2F0YWJsZVByb3BlcnRpZXM6IHN0cmluZ1tdID0gT2JqZWN0LmtleXMoYWdncmVnYXRlcykubWFwKChhZ2dyZWdhdGVLZXkpID0+IGFnZ3JlZ2F0ZXNbYWdncmVnYXRlS2V5XS5yZWxhdGl2ZVBhdGgpO1xuXHRcdFx0YWxsRmlsdGVycyA9IGFsbEZpbHRlcnMuZmlsdGVyKChmaWx0ZXJGaWVsZCkgPT4ge1xuXHRcdFx0XHRyZXR1cm4gYWdncmVnYXRhYmxlUHJvcGVydGllcy5pbmRleE9mKGZpbHRlckZpZWxkLmtleSkgPT09IC0xO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHR9XG5cblx0Y29uc3Qgc2VsZWN0aW9uRmllbGRzID0gaW5zZXJ0Q3VzdG9tTWFuaWZlc3RFbGVtZW50cyhhbGxGaWx0ZXJzLCBlbnRpdHlUeXBlLCBjb252ZXJ0ZXJDb250ZXh0KTtcblxuXHQvLyBBZGQgY2FzZVNlbnNpdGl2ZSBwcm9wZXJ0eSB0byBhbGwgc2VsZWN0aW9uIGZpZWxkcy5cblx0Y29uc3QgaXNDYXNlU2Vuc2l0aXZlID0gaXNGaWx0ZXJpbmdDYXNlU2Vuc2l0aXZlKGNvbnZlcnRlckNvbnRleHQpO1xuXHRzZWxlY3Rpb25GaWVsZHMuZm9yRWFjaCgoZmlsdGVyRmllbGQpID0+IHtcblx0XHRmaWx0ZXJGaWVsZC5jYXNlU2Vuc2l0aXZlID0gaXNDYXNlU2Vuc2l0aXZlO1xuXHR9KTtcblxuXHRyZXR1cm4geyBzZWxlY3Rpb25GaWVsZHMsIHNQcm9wZXJ0eUluZm8gfTtcbn07XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBmaWx0ZXIgYmFyIGluc2lkZSBhIHZhbHVlIGhlbHAgZGlhbG9nIHNob3VsZCBiZSBleHBhbmRlZC4gVGhpcyBpcyB0cnVlIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbiBob2xkczpcbiAqICgxKSBhIGZpbHRlciBwcm9wZXJ0eSBpcyBtYW5kYXRvcnksXG4gKiAoMikgbm8gc2VhcmNoIGZpZWxkIGV4aXN0cyAoZW50aXR5IGlzbid0IHNlYXJjaCBlbmFibGVkKSxcbiAqICgzKSB3aGVuIHRoZSBkYXRhIGlzbid0IGxvYWRlZCBieSBkZWZhdWx0IChhbm5vdGF0aW9uIEZldGNoVmFsdWVzID0gMikuXG4gKlxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGNvbnZlcnRlciBjb250ZXh0XG4gKiBAcGFyYW0gZmlsdGVyUmVzdHJpY3Rpb25zQW5ub3RhdGlvbiBUaGUgRmlsdGVyUmVzdHJpY3Rpb24gYW5ub3RhdGlvblxuICogQHBhcmFtIHZhbHVlTGlzdEFubm90YXRpb24gVGhlIFZhbHVlTGlzdCBhbm5vdGF0aW9uXG4gKiBAcmV0dXJucyBUaGUgdmFsdWUgZm9yIGV4cGFuZEZpbHRlckZpZWxkc1xuICovXG5leHBvcnQgY29uc3QgZ2V0RXhwYW5kRmlsdGVyRmllbGRzID0gZnVuY3Rpb24gKFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LFxuXHRmaWx0ZXJSZXN0cmljdGlvbnNBbm5vdGF0aW9uOiBhbnksXG5cdHZhbHVlTGlzdEFubm90YXRpb246IGFueVxuKTogYm9vbGVhbiB7XG5cdGNvbnN0IHJlcXVpcmVkUHJvcGVydGllcyA9IGdldEZpbHRlclJlc3RyaWN0aW9ucyhmaWx0ZXJSZXN0cmljdGlvbnNBbm5vdGF0aW9uLCBcIlJlcXVpcmVkUHJvcGVydGllc1wiKTtcblx0Y29uc3Qgc2VhcmNoUmVzdHJpY3Rpb25zID0gZ2V0U2VhcmNoUmVzdHJpY3Rpb25zKGNvbnZlcnRlckNvbnRleHQpO1xuXHRjb25zdCBoaWRlQmFzaWNTZWFyY2ggPSBCb29sZWFuKHNlYXJjaFJlc3RyaWN0aW9ucyAmJiAhc2VhcmNoUmVzdHJpY3Rpb25zLlNlYXJjaGFibGUpO1xuXHRjb25zdCB2YWx1ZUxpc3QgPSB2YWx1ZUxpc3RBbm5vdGF0aW9uLmdldE9iamVjdCgpO1xuXHRpZiAocmVxdWlyZWRQcm9wZXJ0aWVzLmxlbmd0aCA+IDAgfHwgaGlkZUJhc2ljU2VhcmNoIHx8IHZhbHVlTGlzdD8uRmV0Y2hWYWx1ZXMgPT09IDIpIHtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXHRyZXR1cm4gZmFsc2U7XG59O1xuIl19