@sapui5/sap.fe.core 1.97.0 → 1.100.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 (306) hide show
  1. package/package.json +7 -4
  2. package/src/sap/fe/core/.library +1 -1
  3. package/src/sap/fe/core/AnnotationHelper.js +309 -405
  4. package/src/sap/fe/core/AnnotationHelper.ts +315 -0
  5. package/src/sap/fe/core/AppComponent.js +389 -397
  6. package/src/sap/fe/core/AppComponent.ts +403 -0
  7. package/src/sap/fe/core/AppStateHandler.js +198 -181
  8. package/src/sap/fe/core/AppStateHandler.ts +171 -0
  9. package/src/sap/fe/core/BaseController.js +83 -58
  10. package/src/sap/fe/core/BaseController.ts +68 -0
  11. package/src/sap/fe/core/BusyLocker.js +105 -121
  12. package/src/sap/fe/core/BusyLocker.ts +98 -0
  13. package/src/sap/fe/core/CommonUtils.js +2164 -2379
  14. package/src/sap/fe/core/CommonUtils.ts +2177 -0
  15. package/src/sap/fe/core/ExtensionAPI.js +279 -266
  16. package/src/sap/fe/core/ExtensionAPI.ts +250 -0
  17. package/src/sap/fe/core/PageController.js +218 -125
  18. package/src/sap/fe/core/PageController.ts +129 -0
  19. package/src/sap/fe/core/RouterProxy.js +924 -807
  20. package/src/sap/fe/core/RouterProxy.ts +840 -0
  21. package/src/sap/fe/core/Synchronization.js +41 -35
  22. package/src/sap/fe/core/Synchronization.ts +29 -0
  23. package/src/sap/fe/core/TemplateComponent.js +173 -155
  24. package/src/sap/fe/core/TemplateComponent.ts +173 -0
  25. package/src/sap/fe/core/TemplateModel.js +79 -54
  26. package/src/sap/fe/core/TemplateModel.ts +63 -0
  27. package/src/sap/fe/core/TransactionHelper.js +1560 -1579
  28. package/src/sap/fe/core/TransactionHelper.ts +1717 -0
  29. package/src/sap/fe/core/actions/collaboration/ActivitySync.js +392 -0
  30. package/src/sap/fe/core/actions/collaboration/ActivitySync.ts +355 -0
  31. package/src/sap/fe/core/actions/collaboration/CollaborationCommon.js +136 -0
  32. package/src/sap/fe/core/actions/collaboration/CollaborationCommon.ts +119 -0
  33. package/src/sap/fe/core/actions/collaboration/Manage.js +262 -0
  34. package/src/sap/fe/core/actions/collaboration/Manage.ts +244 -0
  35. package/src/sap/fe/core/actions/collaboration/ManageDialog.fragment.xml +103 -0
  36. package/src/sap/fe/core/actions/collaboration/UserDetails.fragment.xml +13 -0
  37. package/src/sap/fe/core/actions/draft.js +521 -581
  38. package/src/sap/fe/core/actions/draft.ts +566 -0
  39. package/src/sap/fe/core/actions/messageHandling.js +564 -511
  40. package/src/sap/fe/core/actions/messageHandling.ts +552 -0
  41. package/src/sap/fe/core/actions/nonDraft.js +17 -19
  42. package/src/sap/fe/core/actions/nonDraft.ts +12 -0
  43. package/src/sap/fe/core/actions/operations.js +1093 -1211
  44. package/src/sap/fe/core/actions/operations.ts +1192 -0
  45. package/src/sap/fe/core/actions/sticky.js +114 -104
  46. package/src/sap/fe/core/actions/sticky.ts +119 -0
  47. package/src/sap/fe/core/controllerextensions/ControllerExtensionMetadata.js +70 -66
  48. package/src/sap/fe/core/controllerextensions/ControllerExtensionMetadata.ts +65 -0
  49. package/src/sap/fe/core/controllerextensions/EditFlow.js +1594 -1701
  50. package/src/sap/fe/core/controllerextensions/EditFlow.ts +1672 -0
  51. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +80 -54
  52. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +61 -0
  53. package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +719 -505
  54. package/src/sap/fe/core/controllerextensions/InternalEditFlow.ts +783 -0
  55. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +797 -813
  56. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +803 -0
  57. package/src/sap/fe/core/controllerextensions/InternalRouting.js +1005 -973
  58. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +978 -0
  59. package/src/sap/fe/core/controllerextensions/KPIManagement.js +530 -476
  60. package/src/sap/fe/core/controllerextensions/KPIManagement.ts +137 -46
  61. package/src/sap/fe/core/controllerextensions/MassEdit.js +144 -0
  62. package/src/sap/fe/core/controllerextensions/MassEdit.ts +156 -0
  63. package/src/sap/fe/core/controllerextensions/MessageHandler.js +234 -232
  64. package/src/sap/fe/core/controllerextensions/MessageHandler.ts +225 -0
  65. package/src/sap/fe/core/controllerextensions/PageReady.js +302 -337
  66. package/src/sap/fe/core/controllerextensions/PageReady.ts +23 -17
  67. package/src/sap/fe/core/controllerextensions/Paginator.js +189 -148
  68. package/src/sap/fe/core/controllerextensions/Paginator.ts +163 -0
  69. package/src/sap/fe/core/controllerextensions/Placeholder.js +158 -146
  70. package/src/sap/fe/core/controllerextensions/Placeholder.ts +151 -0
  71. package/src/sap/fe/core/controllerextensions/Routing.js +145 -106
  72. package/src/sap/fe/core/controllerextensions/Routing.ts +132 -0
  73. package/src/sap/fe/core/controllerextensions/RoutingListener.js +8 -6
  74. package/src/sap/fe/core/controllerextensions/RoutingListener.ts +3 -0
  75. package/src/sap/fe/core/controllerextensions/Share.js +220 -244
  76. package/src/sap/fe/core/controllerextensions/Share.ts +231 -0
  77. package/src/sap/fe/core/controllerextensions/SideEffects.js +593 -634
  78. package/src/sap/fe/core/controllerextensions/SideEffects.ts +29 -27
  79. package/src/sap/fe/core/controllerextensions/ViewState.js +789 -806
  80. package/src/sap/fe/core/controllerextensions/ViewState.ts +805 -0
  81. package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +4 -3
  82. package/src/sap/fe/core/controls/ActionPartial.fragment.xml +2 -2
  83. package/src/sap/fe/core/controls/CommandExecution.js +68 -66
  84. package/src/sap/fe/core/controls/CommandExecution.ts +72 -0
  85. package/src/sap/fe/core/controls/ConditionalWrapper.js +91 -75
  86. package/src/sap/fe/core/controls/ConditionalWrapper.ts +83 -0
  87. package/src/sap/fe/core/controls/CustomQuickViewPage.js +131 -125
  88. package/src/sap/fe/core/controls/CustomQuickViewPage.ts +126 -0
  89. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +105 -110
  90. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.ts +101 -0
  91. package/src/sap/fe/core/controls/FieldWrapper.js +122 -140
  92. package/src/sap/fe/core/controls/FieldWrapper.ts +115 -0
  93. package/src/sap/fe/core/controls/FilterBar.js +163 -159
  94. package/src/sap/fe/core/controls/FilterBar.ts +143 -0
  95. package/src/sap/fe/core/controls/FormElementWrapper.js +46 -44
  96. package/src/sap/fe/core/controls/FormElementWrapper.ts +40 -0
  97. package/src/sap/fe/core/controls/MultiValueParameterDelegate.js +38 -42
  98. package/src/sap/fe/core/controls/MultiValueParameterDelegate.ts +31 -0
  99. package/src/sap/fe/core/controls/NonComputedVisibleKeyFieldsDialog.fragment.xml +2 -1
  100. package/src/sap/fe/core/controls/filterbar/FilterContainer.js +127 -116
  101. package/src/sap/fe/core/controls/filterbar/FilterContainer.ts +98 -0
  102. package/src/sap/fe/core/controls/filterbar/VisualFilter.js +242 -255
  103. package/src/sap/fe/core/controls/filterbar/VisualFilter.ts +245 -0
  104. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +151 -141
  105. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.ts +125 -0
  106. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +336 -322
  107. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +337 -0
  108. package/src/sap/fe/core/controls/massEdit/MassEditDialog.fragment.xml +106 -0
  109. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +79 -0
  110. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.ts +70 -0
  111. package/src/sap/fe/core/converters/ConverterContext.js +348 -367
  112. package/src/sap/fe/core/converters/ConverterContext.ts +33 -19
  113. package/src/sap/fe/core/converters/ManifestSettings.js +12 -1
  114. package/src/sap/fe/core/converters/ManifestSettings.ts +16 -1
  115. package/src/sap/fe/core/converters/ManifestWrapper.js +354 -354
  116. package/src/sap/fe/core/converters/ManifestWrapper.ts +34 -6
  117. package/src/sap/fe/core/converters/MetaModelConverter.js +72 -9
  118. package/src/sap/fe/core/converters/MetaModelConverter.ts +75 -16
  119. package/src/sap/fe/core/converters/TemplateConverter.js +1 -1
  120. package/src/sap/fe/core/converters/TemplateConverter.ts +4 -3
  121. package/src/sap/fe/core/converters/annotations/DataField.js +28 -14
  122. package/src/sap/fe/core/converters/annotations/DataField.ts +38 -14
  123. package/src/sap/fe/core/converters/common/AnnotationConverter.js +33 -21
  124. package/src/sap/fe/core/converters/controls/Common/Action.js +11 -2
  125. package/src/sap/fe/core/converters/controls/Common/Action.ts +8 -2
  126. package/src/sap/fe/core/converters/controls/Common/Chart.js +5 -3
  127. package/src/sap/fe/core/converters/controls/Common/Chart.ts +11 -3
  128. package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +3 -3
  129. package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +2 -2
  130. package/src/sap/fe/core/converters/controls/Common/Form.js +21 -11
  131. package/src/sap/fe/core/converters/controls/Common/Form.ts +28 -6
  132. package/src/sap/fe/core/converters/controls/Common/KPI.js +69 -4
  133. package/src/sap/fe/core/converters/controls/Common/KPI.ts +75 -2
  134. package/src/sap/fe/core/converters/controls/Common/Table.js +507 -408
  135. package/src/sap/fe/core/converters/controls/Common/Table.ts +618 -500
  136. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +592 -0
  137. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +718 -0
  138. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +465 -59
  139. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +462 -72
  140. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +2 -2
  141. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +1 -1
  142. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +17 -9
  143. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +24 -9
  144. package/src/sap/fe/core/converters/helpers/Aggregation.js +118 -121
  145. package/src/sap/fe/core/converters/helpers/Aggregation.ts +28 -5
  146. package/src/sap/fe/core/converters/helpers/BindingHelper.js +20 -6
  147. package/src/sap/fe/core/converters/helpers/BindingHelper.ts +16 -4
  148. package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +12 -1
  149. package/src/sap/fe/core/converters/helpers/ConfigurableObject.ts +11 -0
  150. package/src/sap/fe/core/converters/helpers/IssueManager.js +7 -1
  151. package/src/sap/fe/core/converters/helpers/IssueManager.ts +6 -0
  152. package/src/sap/fe/core/converters/helpers/Key.js +42 -57
  153. package/src/sap/fe/core/converters/helpers/Key.ts +1 -1
  154. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +28 -7
  155. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +23 -6
  156. package/src/sap/fe/core/converters/templates/ListReportConverter.js +20 -7
  157. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +36 -14
  158. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +7 -5
  159. package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +5 -1
  160. package/src/sap/fe/core/designtime/AppComponent.designtime.js +93 -90
  161. package/src/sap/fe/core/designtime/AppComponent.designtime.ts +91 -0
  162. package/src/sap/fe/core/formatters/CollaborationFormatter.js +104 -0
  163. package/src/sap/fe/core/formatters/CollaborationFormatter.ts +60 -0
  164. package/src/sap/fe/core/formatters/CriticalityFormatter.js +1 -1
  165. package/src/sap/fe/core/formatters/CriticalityFormatter.ts +1 -1
  166. package/src/sap/fe/core/formatters/FPMFormatter.js +1 -1
  167. package/src/sap/fe/core/formatters/FPMFormatter.ts +4 -10
  168. package/src/sap/fe/core/formatters/KPIFormatter.js +1 -1
  169. package/src/sap/fe/core/formatters/KPIFormatter.ts +3 -1
  170. package/src/sap/fe/core/formatters/TableFormatter.js +91 -29
  171. package/src/sap/fe/core/formatters/TableFormatter.ts +94 -28
  172. package/src/sap/fe/core/formatters/ValueFormatter.js +30 -5
  173. package/src/sap/fe/core/formatters/ValueFormatter.ts +30 -7
  174. package/src/sap/fe/core/fpm/Component.js +51 -54
  175. package/src/sap/fe/core/fpm/Component.ts +48 -0
  176. package/src/sap/fe/core/helpers/AppStartupHelper.js +373 -0
  177. package/src/sap/fe/core/helpers/AppStartupHelper.ts +417 -0
  178. package/src/sap/fe/core/helpers/BindingExpression.js +489 -442
  179. package/src/sap/fe/core/helpers/BindingExpression.ts +486 -469
  180. package/src/sap/fe/core/helpers/ClassSupport.js +212 -76
  181. package/src/sap/fe/core/helpers/ClassSupport.ts +198 -71
  182. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +64 -59
  183. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.ts +52 -0
  184. package/src/sap/fe/core/helpers/EditState.js +81 -84
  185. package/src/sap/fe/core/helpers/EditState.ts +81 -0
  186. package/src/sap/fe/core/helpers/ExcelFormatHelper.js +62 -48
  187. package/src/sap/fe/core/helpers/ExcelFormatHelper.ts +49 -0
  188. package/src/sap/fe/core/helpers/FPMHelper.js +52 -56
  189. package/src/sap/fe/core/helpers/FPMHelper.ts +62 -0
  190. package/src/sap/fe/core/helpers/KeepAliveHelper.js +4 -5
  191. package/src/sap/fe/core/helpers/KeepAliveHelper.ts +10 -10
  192. package/src/sap/fe/core/helpers/MassEditHelper.js +604 -0
  193. package/src/sap/fe/core/helpers/MassEditHelper.ts +699 -0
  194. package/src/sap/fe/core/helpers/ModelHelper.js +253 -225
  195. package/src/sap/fe/core/helpers/ModelHelper.ts +250 -0
  196. package/src/sap/fe/core/helpers/PasteHelper.js +210 -132
  197. package/src/sap/fe/core/helpers/PasteHelper.ts +196 -0
  198. package/src/sap/fe/core/helpers/SemanticDateOperators.js +336 -313
  199. package/src/sap/fe/core/helpers/SemanticDateOperators.ts +334 -0
  200. package/src/sap/fe/core/helpers/SemanticKeyHelper.js +66 -67
  201. package/src/sap/fe/core/helpers/SemanticKeyHelper.ts +73 -0
  202. package/src/sap/fe/core/helpers/StableIdHelper.js +4 -7
  203. package/src/sap/fe/core/helpers/StableIdHelper.ts +2 -6
  204. package/src/sap/fe/core/jsx-runtime/jsx.js +1 -1
  205. package/src/sap/fe/core/jsx-runtime/jsx.ts +1 -1
  206. package/src/sap/fe/core/library.js +427 -425
  207. package/src/sap/fe/core/library.support.js +23 -27
  208. package/src/sap/fe/core/library.support.ts +23 -0
  209. package/src/sap/fe/core/library.ts +420 -0
  210. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +64 -0
  211. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +69 -0
  212. package/src/sap/fe/core/messagebundle.properties +78 -13
  213. package/src/sap/fe/core/messagebundle_ar.properties +58 -7
  214. package/src/sap/fe/core/messagebundle_bg.properties +58 -7
  215. package/src/sap/fe/core/messagebundle_ca.properties +58 -7
  216. package/src/sap/fe/core/messagebundle_cs.properties +59 -8
  217. package/src/sap/fe/core/messagebundle_cy.properties +58 -7
  218. package/src/sap/fe/core/messagebundle_da.properties +58 -7
  219. package/src/sap/fe/core/messagebundle_de.properties +58 -7
  220. package/src/sap/fe/core/messagebundle_el.properties +58 -7
  221. package/src/sap/fe/core/messagebundle_en.properties +57 -6
  222. package/src/sap/fe/core/messagebundle_en_GB.properties +57 -6
  223. package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +61 -6
  224. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +58 -7
  225. package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +58 -7
  226. package/src/sap/fe/core/messagebundle_es.properties +58 -7
  227. package/src/sap/fe/core/messagebundle_es_MX.properties +58 -7
  228. package/src/sap/fe/core/messagebundle_et.properties +58 -7
  229. package/src/sap/fe/core/messagebundle_fi.properties +60 -9
  230. package/src/sap/fe/core/messagebundle_fr.properties +64 -13
  231. package/src/sap/fe/core/messagebundle_fr_CA.properties +59 -8
  232. package/src/sap/fe/core/messagebundle_hi.properties +58 -7
  233. package/src/sap/fe/core/messagebundle_hr.properties +58 -7
  234. package/src/sap/fe/core/messagebundle_hu.properties +59 -8
  235. package/src/sap/fe/core/messagebundle_id.properties +61 -10
  236. package/src/sap/fe/core/messagebundle_it.properties +58 -7
  237. package/src/sap/fe/core/messagebundle_iw.properties +58 -7
  238. package/src/sap/fe/core/messagebundle_ja.properties +58 -7
  239. package/src/sap/fe/core/messagebundle_kk.properties +58 -7
  240. package/src/sap/fe/core/messagebundle_ko.properties +58 -7
  241. package/src/sap/fe/core/messagebundle_lt.properties +58 -7
  242. package/src/sap/fe/core/messagebundle_lv.properties +59 -8
  243. package/src/sap/fe/core/messagebundle_ms.properties +58 -7
  244. package/src/sap/fe/core/messagebundle_nl.properties +58 -7
  245. package/src/sap/fe/core/messagebundle_no.properties +58 -7
  246. package/src/sap/fe/core/messagebundle_pl.properties +58 -7
  247. package/src/sap/fe/core/messagebundle_pt.properties +59 -8
  248. package/src/sap/fe/core/messagebundle_pt_PT.properties +58 -7
  249. package/src/sap/fe/core/messagebundle_ro.properties +58 -7
  250. package/src/sap/fe/core/messagebundle_ru.properties +58 -7
  251. package/src/sap/fe/core/messagebundle_sh.properties +58 -7
  252. package/src/sap/fe/core/messagebundle_sk.properties +58 -7
  253. package/src/sap/fe/core/messagebundle_sl.properties +58 -7
  254. package/src/sap/fe/core/messagebundle_sv.properties +59 -8
  255. package/src/sap/fe/core/messagebundle_th.properties +58 -7
  256. package/src/sap/fe/core/messagebundle_tr.properties +60 -9
  257. package/src/sap/fe/core/messagebundle_uk.properties +58 -7
  258. package/src/sap/fe/core/messagebundle_vi.properties +58 -7
  259. package/src/sap/fe/core/messagebundle_zh_CN.properties +58 -7
  260. package/src/sap/fe/core/messagebundle_zh_TW.properties +58 -7
  261. package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +45 -71
  262. package/src/sap/fe/core/services/AsyncComponentServiceFactory.ts +3 -1
  263. package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +231 -202
  264. package/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +212 -0
  265. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +67 -92
  266. package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +10 -6
  267. package/src/sap/fe/core/services/NavigationServiceFactory.js +351 -300
  268. package/src/sap/fe/core/services/NavigationServiceFactory.ts +313 -0
  269. package/src/sap/fe/core/services/ResourceModelServiceFactory.js +114 -81
  270. package/src/sap/fe/core/services/ResourceModelServiceFactory.ts +83 -0
  271. package/src/sap/fe/core/services/RoutingServiceFactory.js +927 -1152
  272. package/src/sap/fe/core/services/RoutingServiceFactory.ts +898 -0
  273. package/src/sap/fe/core/services/ShellServicesFactory.js +649 -707
  274. package/src/sap/fe/core/services/ShellServicesFactory.ts +52 -15
  275. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +569 -637
  276. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +78 -102
  277. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +429 -478
  278. package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +460 -0
  279. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +10 -8
  280. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.ts +8 -0
  281. package/src/sap/fe/core/support/AnnotationIssue.support.js +15 -3
  282. package/src/sap/fe/core/support/AnnotationIssue.support.ts +16 -2
  283. package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.js +2 -2
  284. package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.ts +1 -1
  285. package/src/sap/fe/core/support/CommonHelper.js +1 -1
  286. package/src/sap/fe/core/support/CommonHelper.ts +1 -1
  287. package/src/sap/fe/core/support/Diagnostics.js +36 -48
  288. package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.js +38 -0
  289. package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.ts +18 -0
  290. package/src/sap/fe/core/templating/DataModelPathHelper.js +97 -127
  291. package/src/sap/fe/core/templating/DataModelPathHelper.ts +112 -135
  292. package/src/sap/fe/core/templating/DisplayModeFormatter.js +114 -0
  293. package/src/sap/fe/core/templating/DisplayModeFormatter.ts +86 -0
  294. package/src/sap/fe/core/templating/FieldControlHelper.js +8 -8
  295. package/src/sap/fe/core/templating/FieldControlHelper.ts +25 -7
  296. package/src/sap/fe/core/templating/FilterHelper.js +140 -78
  297. package/src/sap/fe/core/templating/FilterHelper.ts +149 -78
  298. package/src/sap/fe/core/templating/PropertyHelper.js +3 -3
  299. package/src/sap/fe/core/templating/PropertyHelper.ts +2 -2
  300. package/src/sap/fe/core/templating/UIFormatters.js +76 -135
  301. package/src/sap/fe/core/templating/UIFormatters.ts +76 -99
  302. package/src/sap/fe/core/type/Email.js +1 -1
  303. package/src/sap/fe/core/type/Email.ts +4 -6
  304. package/ui5.yaml +0 -3
  305. package/src/sap/fe/core/controls/filterbar.d.js +0 -8
  306. package/src/sap/fe/core/controls/filterbar.d.ts +0 -0
@@ -16,9 +16,9 @@ sap.ui.define(["../../ManifestSettings", "sap/fe/core/converters/controls/Common
16
16
  var getVisualFilters = VisualFilters.getVisualFilters;
17
17
  var Placement = ConfigurableObject.Placement;
18
18
  var insertCustomElements = ConfigurableObject.insertCustomElements;
19
+ var getTypeConfig = Table.getTypeConfig;
19
20
  var isFilteringCaseSensitive = Table.isFilteringCaseSensitive;
20
21
  var getSelectionVariantConfiguration = Table.getSelectionVariantConfiguration;
21
- var TemplateType = ManifestSettings.TemplateType;
22
22
  var AvailabilityType = ManifestSettings.AvailabilityType;
23
23
 
24
24
  function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
@@ -27,11 +27,21 @@ sap.ui.define(["../../ManifestSettings", "sap/fe/core/converters/controls/Common
27
27
 
28
28
  function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
29
29
 
30
+ var filterFieldType;
31
+
32
+ (function (filterFieldType) {
33
+ filterFieldType["Default"] = "Default";
34
+ filterFieldType["Slot"] = "Slot";
35
+ })(filterFieldType || (filterFieldType = {}));
36
+
37
+ var sEdmString = "Edm.String";
38
+ var sStringDataType = "sap.ui.model.odata.type.String";
39
+
30
40
  /**
31
41
  * Enter all DataFields of a given FieldGroup into the filterFacetMap.
32
42
  *
33
43
  * @param {AnnotationTerm<FieldGroupType>} fieldGroup
34
- * @returns {Record<string, FilterGroup>} The map of facets for the given fieldGroup
44
+ * @returns {Record<string, FilterGroup>} The map of facets for the given FieldGroup
35
45
  */
36
46
  function getFieldGroupFilterGroups(fieldGroup) {
37
47
  var filterFacetMap = {};
@@ -57,8 +67,8 @@ sap.ui.define(["../../ManifestSettings", "sap/fe/core/converters/controls/Common
57
67
  }, {});
58
68
  }
59
69
  /**
60
- * Check that all the tables for a dedicated entityset are configured as analytical table.
61
- * @param {TableVisualization[]} listReportTables List Report tables
70
+ * Check that all the tables for a dedicated entity set are configured as analytical table.
71
+ * @param {TableVisualization[]} listReportTables List report tables
62
72
  * @param {string} contextPath
63
73
  * @returns {boolean} Is FilterBar search field hidden or not
64
74
  */
@@ -80,9 +90,9 @@ sap.ui.define(["../../ManifestSettings", "sap/fe/core/converters/controls/Common
80
90
  var tableFilters = visualization.control.filters;
81
91
  var tableSVConfigs = [];
82
92
 
83
- for (var key in tableFilters) {
84
- if (Array.isArray(tableFilters[key].paths)) {
85
- var paths = tableFilters[key].paths;
93
+ for (var _key in tableFilters) {
94
+ if (Array.isArray(tableFilters[_key].paths)) {
95
+ var paths = tableFilters[_key].paths;
86
96
  paths.forEach(function (path) {
87
97
  if (path && path.annotationPath && selectionVariantPaths.indexOf(path.annotationPath) === -1) {
88
98
  selectionVariantPaths.push(path.annotationPath);
@@ -102,10 +112,10 @@ sap.ui.define(["../../ManifestSettings", "sap/fe/core/converters/controls/Common
102
112
  }, []);
103
113
  }
104
114
  /**
105
- * Returns the condition path required for the condition model. It looks like follow:
115
+ * Returns the condition path required for the condition model. It looks as follows:
106
116
  * <1:N-PropertyName>*\/<1:1-PropertyName>/<PropertyName>.
107
117
  *
108
- * @param entityType The root EntityTy[e
118
+ * @param entityType The root EntityType
109
119
  * @param propertyPath The full path to the target property
110
120
  * @returns {string} The formatted condition path
111
121
  */
@@ -153,6 +163,67 @@ sap.ui.define(["../../ManifestSettings", "sap/fe/core/converters/controls/Common
153
163
  return undefined;
154
164
  };
155
165
 
166
+ function getModelType(sType) {
167
+ var mDefaultTypeForEdmType = {
168
+ "Edm.Boolean": {
169
+ modelType: "Bool"
170
+ },
171
+ "Edm.Byte": {
172
+ modelType: "Int"
173
+ },
174
+ "Edm.Date": {
175
+ modelType: "Date"
176
+ },
177
+ "Edm.DateTime": {
178
+ modelType: "Date"
179
+ },
180
+ "Edm.DateTimeOffset": {
181
+ modelType: "DateTimeOffset"
182
+ },
183
+ "Edm.Decimal": {
184
+ modelType: "Decimal"
185
+ },
186
+ "Edm.Double": {
187
+ modelType: "Float"
188
+ },
189
+ "Edm.Float": {
190
+ modelType: "Float"
191
+ },
192
+ "Edm.Guid": {
193
+ modelType: "Guid"
194
+ },
195
+ "Edm.Int16": {
196
+ modelType: "Int"
197
+ },
198
+ "Edm.Int32": {
199
+ modelType: "Int"
200
+ },
201
+ "Edm.Int64": {
202
+ modelType: "Int"
203
+ },
204
+ "Edm.SByte": {
205
+ modelType: "Int"
206
+ },
207
+ "Edm.Single": {
208
+ modelType: "Float"
209
+ },
210
+ "Edm.String": {
211
+ modelType: "String"
212
+ },
213
+ "Edm.Time": {
214
+ modelType: "TimeOfDay"
215
+ },
216
+ "Edm.TimeOfDay": {
217
+ modelType: "TimeOfDay"
218
+ },
219
+ "Edm.Stream": {//no corresponding modelType - ignore for filtering
220
+ }
221
+ };
222
+ return sType && sType in mDefaultTypeForEdmType && mDefaultTypeForEdmType[sType].modelType;
223
+ }
224
+
225
+ _exports.getModelType = getModelType;
226
+
156
227
  var _getSelectionFields = function (entityType, navigationPath, properties, includeHidden, converterContext) {
157
228
  var selectionFieldMap = {};
158
229
 
@@ -187,7 +258,7 @@ sap.ui.define(["../../ManifestSettings", "sap/fe/core/converters/controls/Common
187
258
  if (property._type === "NavigationProperty") {
188
259
  // handle navigation properties
189
260
  localSelectionFields = _getSelectionFields(entityType, propertyPath, property.targetType.entityProperties, includeHidden, converterContext);
190
- } else if (property.targetType !== undefined) {
261
+ } else if (property.targetType !== undefined && property.targetType._type === "ComplexType") {
191
262
  // handle ComplexType properties
192
263
  localSelectionFields = _getSelectionFields(entityType, propertyPath, property.targetType.properties, includeHidden, converterContext);
193
264
  } else {
@@ -212,7 +283,9 @@ sap.ui.define(["../../ManifestSettings", "sap/fe/core/converters/controls/Common
212
283
  }
213
284
 
214
285
  if (!filterField) {
215
- converterContext.getDiagnostics().addIssue(IssueCategory.Annotation, IssueSeverity.High, IssueType.MISSING_SELECTIONFIELD);
286
+ var _converterContext$get;
287
+
288
+ (_converterContext$get = converterContext.getDiagnostics()) === null || _converterContext$get === void 0 ? void 0 : _converterContext$get.addIssue(IssueCategory.Annotation, IssueSeverity.High, IssueType.MISSING_SELECTIONFIELD);
216
289
  } // defined SelectionFields are available by default
217
290
 
218
291
 
@@ -276,7 +349,7 @@ sap.ui.define(["../../ManifestSettings", "sap/fe/core/converters/controls/Common
276
349
  return selectionFields;
277
350
  };
278
351
  /**
279
- * Get all Parameter filterFields in case of a parameterized service.
352
+ * Get all parameter filter fields in case of a parameterized service.
280
353
  * @param {ConverterContext} converterContext
281
354
  * @returns {FilterField[]} An array of parameter filterfields
282
355
  */
@@ -298,20 +371,28 @@ sap.ui.define(["../../ManifestSettings", "sap/fe/core/converters/controls/Common
298
371
  * Determines if the FilterBar search field is hidden or not.
299
372
  *
300
373
  * @param {TableVisualization[]} listReportTables The list report tables
374
+ * @param {ChartVisualization[]} charts The ALP charts
301
375
  * @param {ConverterContext} converterContext The converter context
302
376
  * @returns {boolean} The information if the FilterBar search field is hidden or not
303
377
  */
304
378
 
305
379
 
306
- var getFilterBarhideBasicSearch = function (listReportTables, converterContext) {
307
- if (converterContext.getManifestWrapper().hasMultipleVisualizations() || converterContext.getTemplateType() === TemplateType.AnalyticalListPage) {
308
- return true;
309
- } // Tries to find a non-analytical table with the main entity set (page entity set) as collection
310
- // if at least one table matches these conditions, basic search field must be displayed.
380
+ var getFilterBarhideBasicSearch = function (listReportTables, charts, converterContext) {
381
+ // Check if charts allow search
382
+ var noSearchInCharts = charts.length === 0 || charts.every(function (chart) {
383
+ return !chart.applySupported.enableSearch;
384
+ }); // Check if all tables are analytical and none of them allow for search
311
385
 
386
+ var noSearchInTables = listReportTables.length === 0 || listReportTables.every(function (table) {
387
+ return table.enableAnalytics && !table.enableAnalyticsSearch;
388
+ });
389
+ var contextPath = converterContext.getContextPath();
312
390
 
313
- var sContextPath = converterContext.getContextPath();
314
- return checkAllTableForEntitySetAreAnalytical(listReportTables, sContextPath);
391
+ if (contextPath && noSearchInCharts && noSearchInTables) {
392
+ return true;
393
+ } else {
394
+ return false;
395
+ }
315
396
  };
316
397
  /**
317
398
  * Retrieves filter fields from the manifest.
@@ -338,9 +419,11 @@ sap.ui.define(["../../ManifestSettings", "sap/fe/core/converters/controls/Common
338
419
  var filterField = definedFilterFields[sKey];
339
420
  var propertyName = KeyHelper.getPathFromSelectionFieldKey(sKey);
340
421
  var selectionField = selectionFields[propertyName];
341
- var visualFilter = getVisualFilters(entityType, converterContext, sKey, definedFilterFields);
422
+ var type = filterField.type === "Slot" ? filterFieldType.Slot : filterFieldType.Default;
423
+ var visualFilter = filterField && filterField !== null && filterField !== void 0 && filterField.visualFilter ? getVisualFilters(entityType, converterContext, sKey, definedFilterFields) : undefined;
342
424
  filterFields[sKey] = {
343
425
  key: sKey,
426
+ type: type,
344
427
  annotationPath: selectionField === null || selectionField === void 0 ? void 0 : selectionField.annotationPath,
345
428
  conditionPath: (selectionField === null || selectionField === void 0 ? void 0 : selectionField.conditionPath) || propertyName,
346
429
  template: filterField.template,
@@ -362,10 +445,329 @@ sap.ui.define(["../../ManifestSettings", "sap/fe/core/converters/controls/Common
362
445
  var getFilterField = function (propertyPath, converterContext, entityType) {
363
446
  return _getFilterField({}, propertyPath, converterContext, entityType);
364
447
  };
448
+
449
+ _exports.getFilterField = getFilterField;
450
+
451
+ var getFilterRestrictions = function (oFilterRestrictionsAnnotation, sRestriction) {
452
+ if (sRestriction === "RequiredProperties" || sRestriction === "NonFilterableProperties") {
453
+ var aProps = [];
454
+
455
+ if (oFilterRestrictionsAnnotation && oFilterRestrictionsAnnotation[sRestriction]) {
456
+ aProps = oFilterRestrictionsAnnotation[sRestriction].map(function (oProperty) {
457
+ return oProperty.$PropertyPath || oProperty.value;
458
+ });
459
+ }
460
+
461
+ return aProps;
462
+ } else if (sRestriction === "FilterAllowedExpressions") {
463
+ var mAllowedExpressions = {};
464
+
465
+ if (oFilterRestrictionsAnnotation && oFilterRestrictionsAnnotation.FilterExpressionRestrictions) {
466
+ oFilterRestrictionsAnnotation.FilterExpressionRestrictions.forEach(function (oProperty) {
467
+ //SingleValue | MultiValue | SingleRange | MultiRange | SearchExpression | MultiRangeOrSearchExpression
468
+ if (mAllowedExpressions[oProperty.Property.value]) {
469
+ mAllowedExpressions[oProperty.Property.value].push(oProperty.AllowedExpressions);
470
+ } else {
471
+ mAllowedExpressions[oProperty.Property.value] = [oProperty.AllowedExpressions];
472
+ }
473
+ });
474
+ }
475
+
476
+ return mAllowedExpressions;
477
+ }
478
+
479
+ return oFilterRestrictionsAnnotation;
480
+ };
481
+
482
+ _exports.getFilterRestrictions = getFilterRestrictions;
483
+
484
+ var getSearchFilterPropertyInfo = function () {
485
+ return {
486
+ name: "$search",
487
+ path: "$search",
488
+ dataType: sStringDataType,
489
+ maxConditions: 1
490
+ };
491
+ };
492
+
493
+ var getEditStateFilterPropertyInfo = function () {
494
+ return {
495
+ name: "$editState",
496
+ path: "$editState",
497
+ groupLabel: "",
498
+ group: "",
499
+ dataType: sStringDataType,
500
+ hiddenFilter: false
501
+ };
502
+ };
503
+
504
+ var getSearchRestrictions = function (converterContext) {
505
+ var _converterContext$get2, _converterContext$get3, _converterContext$get4;
506
+
507
+ return (_converterContext$get2 = converterContext.getEntitySet()) === null || _converterContext$get2 === void 0 ? void 0 : (_converterContext$get3 = _converterContext$get2.annotations) === null || _converterContext$get3 === void 0 ? void 0 : (_converterContext$get4 = _converterContext$get3.Capabilities) === null || _converterContext$get4 === void 0 ? void 0 : _converterContext$get4.SearchRestrictions;
508
+ };
509
+
510
+ var getNavigationRestrictions = function (converterContext, sNavigationPath) {
511
+ var _converterContext$get5, _converterContext$get6, _converterContext$get7;
512
+
513
+ var oNavigationRestrictions = (_converterContext$get5 = converterContext.getEntitySet()) === null || _converterContext$get5 === void 0 ? void 0 : (_converterContext$get6 = _converterContext$get5.annotations) === null || _converterContext$get6 === void 0 ? void 0 : (_converterContext$get7 = _converterContext$get6.Capabilities) === null || _converterContext$get7 === void 0 ? void 0 : _converterContext$get7.NavigationRestrictions;
514
+ var aRestrictedProperties = oNavigationRestrictions && oNavigationRestrictions.RestrictedProperties;
515
+ return aRestrictedProperties && aRestrictedProperties.find(function (oRestrictedProperty) {
516
+ return oRestrictedProperty && oRestrictedProperty.NavigationProperty && (oRestrictedProperty.NavigationProperty.$NavigationPropertyPath === sNavigationPath || oRestrictedProperty.NavigationProperty.value === sNavigationPath);
517
+ });
518
+ };
519
+
520
+ _exports.getNavigationRestrictions = getNavigationRestrictions;
521
+
522
+ var _fetchBasicPropertyInfo = function (oFilterFieldInfo) {
523
+ return {
524
+ key: oFilterFieldInfo.key,
525
+ annotationPath: oFilterFieldInfo.annotationPath,
526
+ conditionPath: oFilterFieldInfo.conditionPath,
527
+ name: oFilterFieldInfo.conditionPath,
528
+ label: oFilterFieldInfo.label,
529
+ hiddenFilter: oFilterFieldInfo.availability === "Hidden",
530
+ display: "Value",
531
+ isParameter: oFilterFieldInfo.isParameter,
532
+ caseSensitive: oFilterFieldInfo.caseSensitive,
533
+ availability: oFilterFieldInfo.availability,
534
+ position: oFilterFieldInfo.position,
535
+ type: oFilterFieldInfo.type,
536
+ template: oFilterFieldInfo.template,
537
+ menu: oFilterFieldInfo.menu
538
+ };
539
+ };
540
+
541
+ var getSpecificAllowedExpression = function (aExpressions) {
542
+ var aAllowedExpressionsPriority = ["SingleValue", "MultiValue", "SingleRange", "MultiRange", "SearchExpression", "MultiRangeOrSearchExpression"];
543
+ aExpressions.sort(function (a, b) {
544
+ return aAllowedExpressionsPriority.indexOf(a) - aAllowedExpressionsPriority.indexOf(b);
545
+ });
546
+ return aExpressions[0];
547
+ };
548
+
549
+ _exports.getSpecificAllowedExpression = getSpecificAllowedExpression;
550
+
551
+ var displayMode = function (oPropertyAnnotations, oCollectionAnnotations) {
552
+ var _oPropertyAnnotations, _oPropertyAnnotations2, _oPropertyAnnotations3, _oPropertyAnnotations4, _oPropertyAnnotations5, _oCollectionAnnotatio;
553
+
554
+ var oTextAnnotation = oPropertyAnnotations === null || oPropertyAnnotations === void 0 ? void 0 : (_oPropertyAnnotations = oPropertyAnnotations.Common) === null || _oPropertyAnnotations === void 0 ? void 0 : _oPropertyAnnotations.Text,
555
+ oTextArrangmentAnnotation = oTextAnnotation && (oPropertyAnnotations && (oPropertyAnnotations === null || oPropertyAnnotations === void 0 ? void 0 : (_oPropertyAnnotations2 = oPropertyAnnotations.Common) === null || _oPropertyAnnotations2 === void 0 ? void 0 : (_oPropertyAnnotations3 = _oPropertyAnnotations2.Text) === null || _oPropertyAnnotations3 === void 0 ? void 0 : (_oPropertyAnnotations4 = _oPropertyAnnotations3.annotations) === null || _oPropertyAnnotations4 === void 0 ? void 0 : (_oPropertyAnnotations5 = _oPropertyAnnotations4.UI) === null || _oPropertyAnnotations5 === void 0 ? void 0 : _oPropertyAnnotations5.TextArrangement) || oCollectionAnnotations && (oCollectionAnnotations === null || oCollectionAnnotations === void 0 ? void 0 : (_oCollectionAnnotatio = oCollectionAnnotations.UI) === null || _oCollectionAnnotatio === void 0 ? void 0 : _oCollectionAnnotatio.TextArrangement));
556
+
557
+ if (oTextArrangmentAnnotation) {
558
+ if (oTextArrangmentAnnotation.valueOf() === "UI.TextArrangementType/TextOnly") {
559
+ return "Description";
560
+ } else if (oTextArrangmentAnnotation.valueOf() === "UI.TextArrangementType/TextLast") {
561
+ return "ValueDescription";
562
+ }
563
+
564
+ return "DescriptionValue"; //TextFirst
565
+ }
566
+
567
+ return oTextAnnotation ? "DescriptionValue" : "Value";
568
+ };
569
+
570
+ _exports.displayMode = displayMode;
571
+
572
+ var _fetchPropertyInfo = function (converterContext, oFilterFieldInfo, oTypeConfig) {
573
+ var _converterContext$get8;
574
+
575
+ var oPropertyInfo = _fetchBasicPropertyInfo(oFilterFieldInfo);
576
+
577
+ var sAnnotationPath = oFilterFieldInfo.annotationPath;
578
+
579
+ if (!sAnnotationPath) {
580
+ return oPropertyInfo;
581
+ }
582
+
583
+ var targetPropertyObject = converterContext.getConverterContextFor(sAnnotationPath).getDataModelObjectPath().targetObject;
584
+ var oPropertyAnnotations = targetPropertyObject === null || targetPropertyObject === void 0 ? void 0 : targetPropertyObject.annotations;
585
+ var oCollectionAnnotations = converterContext === null || converterContext === void 0 ? void 0 : (_converterContext$get8 = converterContext.getDataModelObjectPath().targetObject) === null || _converterContext$get8 === void 0 ? void 0 : _converterContext$get8.annotations;
586
+ var oFormatOptions = oTypeConfig.formatOptions;
587
+ var oConstraints = oTypeConfig.constraints;
588
+ oPropertyInfo = Object.assign(oPropertyInfo, {
589
+ formatOptions: oFormatOptions,
590
+ constraints: oConstraints,
591
+ display: displayMode(oPropertyAnnotations, oCollectionAnnotations)
592
+ });
593
+ return oPropertyInfo;
594
+ };
595
+
596
+ var isMultiValue = function (oProperty) {
597
+ var bIsMultiValue = true; //SingleValue | MultiValue | SingleRange | MultiRange | SearchExpression | MultiRangeOrSearchExpression
598
+
599
+ switch (oProperty.filterExpression) {
600
+ case "SearchExpression":
601
+ case "SingleRange":
602
+ case "SingleValue":
603
+ bIsMultiValue = false;
604
+ break;
605
+
606
+ default:
607
+ break;
608
+ }
609
+
610
+ if (oProperty.type && oProperty.type.indexOf("Boolean") > 0) {
611
+ bIsMultiValue = false;
612
+ }
613
+
614
+ return bIsMultiValue;
615
+ };
616
+
617
+ _exports.isMultiValue = isMultiValue;
618
+
619
+ var getAnnotatedSelectionFieldData = function (converterContext) {
620
+ var _converterContext$get9, _entityType$annotatio3, _entityType$annotatio4;
621
+
622
+ var lrTables = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
623
+ var annotationPath = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : "";
624
+ // Fetch all selectionVariants defined in the different visualizations and different views (multi table mode)
625
+ var selectionVariants = getSelectionVariants(lrTables, converterContext); // create a map of properties to be used in selection variants
626
+
627
+ var excludedFilterProperties = getExcludedFilterProperties(selectionVariants);
628
+ var entityType = converterContext.getEntityType(); //Filters which has to be added which is part of SV/Default annotations but not present in the SelectionFields
629
+
630
+ var annotatedSelectionFields = annotationPath && ((_converterContext$get9 = converterContext.getEntityTypeAnnotation(annotationPath)) === null || _converterContext$get9 === void 0 ? void 0 : _converterContext$get9.annotation) || ((_entityType$annotatio3 = entityType.annotations) === null || _entityType$annotatio3 === void 0 ? void 0 : (_entityType$annotatio4 = _entityType$annotatio3.UI) === null || _entityType$annotatio4 === void 0 ? void 0 : _entityType$annotatio4.SelectionFields) || []; // create a map of all potential filter fields based on...
631
+
632
+ var filterFields = _objectSpread(_objectSpread({}, _getSelectionFields(entityType, "", entityType.entityProperties, false, converterContext)), _getSelectionFieldsByPath(entityType, converterContext.getManifestWrapper().getFilterConfiguration().navigationProperties, false, converterContext));
633
+
634
+ var propertyInfoFields = (annotatedSelectionFields === null || annotatedSelectionFields === void 0 ? void 0 : annotatedSelectionFields.reduce(function (selectionFields, selectionField) {
635
+ var propertyPath = selectionField.value;
636
+
637
+ if (!(propertyPath in excludedFilterProperties)) {
638
+ var filterField = _getFilterField(filterFields, propertyPath, converterContext, entityType);
639
+
640
+ if (filterField) {
641
+ filterField.group = "";
642
+ filterField.groupLabel = "";
643
+ selectionFields.push(filterField);
644
+ }
645
+ }
646
+
647
+ return selectionFields;
648
+ }, [])) || [];
649
+ return {
650
+ excludedFilterProperties: excludedFilterProperties,
651
+ entityType: entityType,
652
+ annotatedSelectionFields: annotatedSelectionFields,
653
+ filterFields: filterFields,
654
+ propertyInfoFields: propertyInfoFields
655
+ };
656
+ };
657
+
658
+ var processSelectionFields = function (propertyInfoFields, converterContext) {
659
+ var _converterContext$get10, _converterContext$get11, _converterContext$get12, _converterContext$get13, _converterContext$get14, _converterContext$get15;
660
+
661
+ //get TypeConfig function
662
+ var aTypeConfig = [];
663
+ var selectionFieldTypes = [];
664
+
665
+ var _fnTypeConfig = function (property) {
666
+ var oTypeConfig = getTypeConfig(property, undefined);
667
+ selectionFieldTypes.push(property === null || property === void 0 ? void 0 : property.type);
668
+
669
+ if ((property === null || property === void 0 ? void 0 : property.type) === sEdmString && (!oTypeConfig.constraints.nullable || oTypeConfig.constraints.nullable === true)) {
670
+ oTypeConfig.formatOptions.parseKeepsEmptyString = false;
671
+ }
672
+
673
+ aTypeConfig.push(oTypeConfig);
674
+ }; //add typeConfig
675
+
676
+
677
+ propertyInfoFields.forEach(function (parameterField) {
678
+ if (parameterField.annotationPath) {
679
+ var propertyConvertyContext = converterContext.getConverterContextFor(parameterField.annotationPath);
680
+ var propertyTargetObject = propertyConvertyContext.getDataModelObjectPath().targetObject;
681
+
682
+ _fnTypeConfig(propertyTargetObject);
683
+ } else {
684
+ selectionFieldTypes.push(sEdmString);
685
+ aTypeConfig.push({
686
+ type: sStringDataType
687
+ });
688
+ }
689
+ }); // filterRestrictions
690
+
691
+ var oFilterRestrictions = (_converterContext$get10 = converterContext.getEntitySet()) === null || _converterContext$get10 === void 0 ? void 0 : (_converterContext$get11 = _converterContext$get10.annotations) === null || _converterContext$get11 === void 0 ? void 0 : (_converterContext$get12 = _converterContext$get11.Capabilities) === null || _converterContext$get12 === void 0 ? void 0 : _converterContext$get12.FilterRestrictions;
692
+ var oRet = {};
693
+ oRet["RequiredProperties"] = getFilterRestrictions(oFilterRestrictions, "RequiredProperties") || [];
694
+ oRet["NonFilterableProperties"] = getFilterRestrictions(oFilterRestrictions, "NonFilterableProperties") || [];
695
+ oRet["FilterAllowedExpressions"] = getFilterRestrictions(oFilterRestrictions, "FilterAllowedExpressions") || {};
696
+ var sEntitySetPath = converterContext.getContextPath();
697
+ var aPathParts = sEntitySetPath.split("/");
698
+
699
+ if (aPathParts.length > 2) {
700
+ var sNavigationPath = aPathParts[aPathParts.length - 1];
701
+ aPathParts.splice(-1, 1);
702
+ var oNavigationRestrictions = getNavigationRestrictions(converterContext, sNavigationPath);
703
+ var oNavigationFilterRestrictions = oNavigationRestrictions && oNavigationRestrictions.FilterRestrictions;
704
+ oRet.RequiredProperties.concat(getFilterRestrictions(oNavigationFilterRestrictions, "RequiredProperties") || []);
705
+ oRet.NonFilterableProperties.concat(getFilterRestrictions(oNavigationFilterRestrictions, "NonFilterableProperties") || []);
706
+ oRet.FilterAllowedExpressions = _objectSpread(_objectSpread({}, getFilterRestrictions(oNavigationFilterRestrictions, "FilterAllowedExpressions") || {}), oRet.FilterAllowedExpressions);
707
+ }
708
+
709
+ var isCaseSensitive = isFilteringCaseSensitive(converterContext);
710
+ var aRequiredProps = oRet.RequiredProperties;
711
+ var aNonFilterableProps = oRet.NonFilterableProperties;
712
+ var oPropertyInfo;
713
+ var aFetchedProperties = []; // process the fields to add necessary properties
714
+
715
+ Object.keys(propertyInfoFields).forEach(function (sFilterFieldKey) {
716
+ var oConvertedProperty = propertyInfoFields[sFilterFieldKey];
717
+ var sPropertyPath;
718
+
719
+ if (oConvertedProperty.conditionPath) {
720
+ sPropertyPath = oConvertedProperty.conditionPath.replace(/\+|\*/g, "");
721
+ }
722
+
723
+ if (aNonFilterableProps.indexOf(sPropertyPath) === -1) {
724
+ oPropertyInfo = _fetchPropertyInfo(converterContext, oConvertedProperty, aTypeConfig[sFilterFieldKey]);
725
+
726
+ if (oPropertyInfo) {
727
+ oPropertyInfo = Object.assign(oPropertyInfo, {
728
+ maxConditions: !oPropertyInfo.isParameter && isMultiValue(oPropertyInfo) ? -1 : 1,
729
+ required: oPropertyInfo.isParameter || aRequiredProps.indexOf(sPropertyPath) >= 0,
730
+ caseSensitive: isCaseSensitive,
731
+ dataType: selectionFieldTypes[sFilterFieldKey]
732
+ });
733
+ aFetchedProperties.push(oPropertyInfo);
734
+ }
735
+ }
736
+ }); //add edit
737
+
738
+ if ((_converterContext$get13 = converterContext.getDataModelObjectPath().targetObject) !== null && _converterContext$get13 !== void 0 && (_converterContext$get14 = _converterContext$get13.annotations) !== null && _converterContext$get14 !== void 0 && (_converterContext$get15 = _converterContext$get14.Common) !== null && _converterContext$get15 !== void 0 && _converterContext$get15.DraftRoot) {
739
+ aFetchedProperties.push(getEditStateFilterPropertyInfo());
740
+ } // add search
741
+
742
+
743
+ var searchRestrictions = getSearchRestrictions(converterContext);
744
+ var hideBasicSearch = Boolean(searchRestrictions && !searchRestrictions.Searchable);
745
+
746
+ if (sEntitySetPath && hideBasicSearch !== true) {
747
+ if (!searchRestrictions || searchRestrictions !== null && searchRestrictions !== void 0 && searchRestrictions.Searchable) {
748
+ aFetchedProperties.push(getSearchFilterPropertyInfo());
749
+ }
750
+ }
751
+
752
+ return aFetchedProperties;
753
+ };
754
+
755
+ _exports.processSelectionFields = processSelectionFields;
756
+
757
+ var insertCustomManifestElements = function (filterFields, entityType, converterContext) {
758
+ return insertCustomElements(filterFields, getManifestFilterFields(entityType, converterContext), {
759
+ "availability": "overwrite",
760
+ label: "overwrite",
761
+ type: "overwrite",
762
+ position: "overwrite",
763
+ template: "overwrite",
764
+ settings: "overwrite",
765
+ visualFilter: "overwrite"
766
+ });
767
+ };
365
768
  /**
366
769
  * Retrieve the configuration for the selection fields that will be used within the filter bar
367
770
  * This configuration takes into account annotation and the selection variants.
368
- *
369
771
  * @param {ConverterContext} converterContext
370
772
  * @param {TableVisualization[]} lrTables
371
773
  * @param {string} annotationPath
@@ -373,19 +775,44 @@ sap.ui.define(["../../ManifestSettings", "sap/fe/core/converters/controls/Common
373
775
  */
374
776
 
375
777
 
376
- _exports.getFilterField = getFilterField;
778
+ _exports.insertCustomManifestElements = insertCustomManifestElements;
377
779
 
378
780
  var getSelectionFields = function (converterContext) {
379
- var _entityType$annotatio3, _converterContext$get, _entityType$annotatio4, _entityType$annotatio5;
781
+ var _entityType$annotatio5, _entityType$annotatio6;
380
782
 
381
783
  var lrTables = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
382
784
  var annotationPath = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : "";
383
- // Fetch all selectionVariants defined in the different visualizations and different views (multi table mode)
384
- var selectionVariants = getSelectionVariants(lrTables, converterContext); // create a map of properties to be used in selection variants
785
+ var oAnnotatedSelectionFieldData = getAnnotatedSelectionFieldData(converterContext, lrTables, annotationPath);
786
+
787
+ var parameterFields = _getParameterFields(converterContext);
788
+
789
+ var propertyInfoFields = JSON.parse(JSON.stringify(oAnnotatedSelectionFieldData.propertyInfoFields));
790
+ var entityType = oAnnotatedSelectionFieldData.entityType;
791
+ propertyInfoFields = parameterFields.concat(propertyInfoFields);
792
+ propertyInfoFields = insertCustomManifestElements(propertyInfoFields, entityType, converterContext);
793
+ var aFetchedProperties = processSelectionFields(propertyInfoFields, converterContext);
794
+ aFetchedProperties.sort(function (a, b) {
795
+ if (a.groupLabel === undefined || a.groupLabel === null) {
796
+ return -1;
797
+ }
385
798
 
386
- var excludedFilterProperties = getExcludedFilterProperties(selectionVariants);
387
- var entityType = converterContext.getEntityType();
388
- var filterFacets = (_entityType$annotatio3 = entityType.annotations.UI) === null || _entityType$annotatio3 === void 0 ? void 0 : _entityType$annotatio3.FilterFacets;
799
+ if (b.groupLabel === undefined || b.groupLabel === null) {
800
+ return 1;
801
+ }
802
+
803
+ return a.groupLabel.localeCompare(b.groupLabel);
804
+ });
805
+ var sFetchProperties = JSON.stringify(aFetchedProperties);
806
+ sFetchProperties = sFetchProperties.replace(/\{/g, "\\{");
807
+ sFetchProperties = sFetchProperties.replace(/\}/g, "\\}");
808
+ var sPropertyInfo = sFetchProperties; // end of propertyFields processing
809
+ // to populate selection fields
810
+
811
+ var propSelectionFields = JSON.parse(JSON.stringify(oAnnotatedSelectionFieldData.propertyInfoFields));
812
+ propSelectionFields = parameterFields.concat(propSelectionFields); // create a map of properties to be used in selection variants
813
+
814
+ var excludedFilterProperties = oAnnotatedSelectionFieldData.excludedFilterProperties;
815
+ var filterFacets = entityType === null || entityType === void 0 ? void 0 : (_entityType$annotatio5 = entityType.annotations) === null || _entityType$annotatio5 === void 0 ? void 0 : (_entityType$annotatio6 = _entityType$annotatio5.UI) === null || _entityType$annotatio6 === void 0 ? void 0 : _entityType$annotatio6.FilterFacets;
389
816
  var filterFacetMap = {};
390
817
  var aFieldGroups = converterContext.getAnnotationsByTerm("UI", "com.sap.vocabularies.UI.v1.FieldGroup");
391
818
 
@@ -416,31 +843,14 @@ sap.ui.define(["../../ManifestSettings", "sap/fe/core/converters/controls/Common
416
843
  } // create a map of all potential filter fields based on...
417
844
 
418
845
 
419
- var filterFields = _objectSpread(_objectSpread({}, _getSelectionFields(entityType, "", entityType.entityProperties, false, converterContext)), _getSelectionFieldsByPath(entityType, converterContext.getManifestWrapper().getFilterConfiguration().navigationProperties, false, converterContext)); //Filters which has to be added which is part of SV/Default annotations but not present in the SelectionFields
420
-
846
+ var filterFields = oAnnotatedSelectionFieldData.filterFields; //Filters which has to be added which is part of SV/Default annotations but not present in the SelectionFields
421
847
 
422
- var annotatedSelectionFields = annotationPath && ((_converterContext$get = converterContext.getEntityTypeAnnotation(annotationPath)) === null || _converterContext$get === void 0 ? void 0 : _converterContext$get.annotation) || ((_entityType$annotatio4 = entityType.annotations) === null || _entityType$annotatio4 === void 0 ? void 0 : (_entityType$annotatio5 = _entityType$annotatio4.UI) === null || _entityType$annotatio5 === void 0 ? void 0 : _entityType$annotatio5.SelectionFields) || [];
848
+ var annotatedSelectionFields = oAnnotatedSelectionFieldData.annotatedSelectionFields;
423
849
 
424
- var defaultFilters = _getDefaultFilterFields(filterFields, aSelectOptions, entityType, converterContext, excludedFilterProperties, annotatedSelectionFields);
850
+ var defaultFilters = _getDefaultFilterFields(filterFields, aSelectOptions, entityType, converterContext, excludedFilterProperties, annotatedSelectionFields); // finally create final list of filter fields by adding the SelectionFields first (order matters)...
425
851
 
426
- var parameterFields = _getParameterFields(converterContext); // finally create final list of filter fields by adding the SelectionFields first (order matters)...
427
852
 
428
-
429
- var allFilters = parameterFields.concat((annotatedSelectionFields === null || annotatedSelectionFields === void 0 ? void 0 : annotatedSelectionFields.reduce(function (selectionFields, selectionField) {
430
- var propertyPath = selectionField.value;
431
-
432
- if (!(propertyPath in excludedFilterProperties)) {
433
- var filterField = _getFilterField(filterFields, propertyPath, converterContext, entityType);
434
-
435
- if (filterField) {
436
- filterField.group = "";
437
- filterField.groupLabel = "";
438
- selectionFields.push(filterField);
439
- }
440
- }
441
-
442
- return selectionFields;
443
- }, [])) || []) // To add the FilterField which is not part of the Selection Fields but the property is mentioned in the Selection Variant
853
+ var allFilters = propSelectionFields // To add the FilterField which is not part of the Selection Fields but the property is mentioned in the Selection Variant
444
854
  .concat(defaultFilters || []) // ...and adding remaining filter fields, that are not used in a SelectionVariant (order doesn't matter)
445
855
  .concat(Object.keys(filterFields).filter(function (propertyPath) {
446
856
  return !(propertyPath in excludedFilterProperties);
@@ -465,23 +875,19 @@ sap.ui.define(["../../ManifestSettings", "sap/fe/core/converters/controls/Common
465
875
  }
466
876
  }
467
877
 
468
- var selectionFields = insertCustomElements(allFilters, getManifestFilterFields(entityType, converterContext), {
469
- "availability": "overwrite",
470
- label: "overwrite",
471
- position: "overwrite",
472
- template: "overwrite",
473
- settings: "overwrite",
474
- visualFilter: "overwrite"
475
- }); // Add caseSensitive property to all selection fields.
878
+ var selectionFields = insertCustomManifestElements(allFilters, entityType, converterContext); // Add caseSensitive property to all selection fields.
476
879
 
477
880
  var isCaseSensitive = isFilteringCaseSensitive(converterContext);
478
881
  selectionFields.forEach(function (filterField) {
479
882
  filterField.caseSensitive = isCaseSensitive;
480
883
  });
481
- return selectionFields;
884
+ return {
885
+ selectionFields: selectionFields,
886
+ sPropertyInfo: sPropertyInfo
887
+ };
482
888
  };
483
889
 
484
890
  _exports.getSelectionFields = getSelectionFields;
485
891
  return _exports;
486
892
  }, false);
487
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkZpbHRlckJhci50cyJdLCJuYW1lcyI6WyJnZXRGaWVsZEdyb3VwRmlsdGVyR3JvdXBzIiwiZmllbGRHcm91cCIsImZpbHRlckZhY2V0TWFwIiwiRGF0YSIsImZvckVhY2giLCJkYXRhRmllbGQiLCIkVHlwZSIsIlZhbHVlIiwicGF0aCIsImdyb3VwIiwiZnVsbHlRdWFsaWZpZWROYW1lIiwiZ3JvdXBMYWJlbCIsImNvbXBpbGVCaW5kaW5nIiwiYW5ub3RhdGlvbkV4cHJlc3Npb24iLCJMYWJlbCIsImFubm90YXRpb25zIiwiQ29tbW9uIiwicXVhbGlmaWVyIiwiZ2V0RXhjbHVkZWRGaWx0ZXJQcm9wZXJ0aWVzIiwic2VsZWN0aW9uVmFyaWFudHMiLCJyZWR1Y2UiLCJwcmV2aW91c1ZhbHVlIiwic2VsZWN0aW9uVmFyaWFudCIsInByb3BlcnR5TmFtZXMiLCJwcm9wZXJ0eU5hbWUiLCJjaGVja0FsbFRhYmxlRm9yRW50aXR5U2V0QXJlQW5hbHl0aWNhbCIsImxpc3RSZXBvcnRUYWJsZXMiLCJjb250ZXh0UGF0aCIsImxlbmd0aCIsImV2ZXJ5IiwidmlzdWFsaXphdGlvbiIsImVuYWJsZUFuYWx5dGljcyIsImFubm90YXRpb24iLCJjb2xsZWN0aW9uIiwiZ2V0U2VsZWN0aW9uVmFyaWFudHMiLCJsclRhYmxlVmlzdWFsaXphdGlvbnMiLCJjb252ZXJ0ZXJDb250ZXh0Iiwic2VsZWN0aW9uVmFyaWFudFBhdGhzIiwibWFwIiwidGFibGVGaWx0ZXJzIiwiY29udHJvbCIsImZpbHRlcnMiLCJ0YWJsZVNWQ29uZmlncyIsImtleSIsIkFycmF5IiwiaXNBcnJheSIsInBhdGhzIiwiYW5ub3RhdGlvblBhdGgiLCJpbmRleE9mIiwicHVzaCIsInNlbGVjdGlvblZhcmlhbnRDb25maWciLCJnZXRTZWxlY3Rpb25WYXJpYW50Q29uZmlndXJhdGlvbiIsInN2Q29uZmlncyIsImNvbmNhdCIsIl9nZXRDb25kaXRpb25QYXRoIiwiZW50aXR5VHlwZSIsInByb3BlcnR5UGF0aCIsInBhcnRzIiwic3BsaXQiLCJwYXJ0aWFsUGF0aCIsInBhcnQiLCJzaGlmdCIsInByb3BlcnR5IiwicmVzb2x2ZVBhdGgiLCJfdHlwZSIsImlzQ29sbGVjdGlvbiIsIl9jcmVhdGVGaWx0ZXJTZWxlY3Rpb25GaWVsZCIsImZ1bGxQcm9wZXJ0eVBhdGgiLCJpbmNsdWRlSGlkZGVuIiwidW5kZWZpbmVkIiwidGFyZ2V0VHlwZSIsIlVJIiwiSGlkZGVuIiwidmFsdWVPZiIsInRhcmdldEVudGl0eVR5cGUiLCJnZXRBbm5vdGF0aW9uRW50aXR5VHlwZSIsIktleUhlbHBlciIsImdldFNlbGVjdGlvbkZpZWxkS2V5RnJvbVBhdGgiLCJnZXRBYnNvbHV0ZUFubm90YXRpb25QYXRoIiwiY29uZGl0aW9uUGF0aCIsImF2YWlsYWJpbGl0eSIsIkhpZGRlbkZpbHRlciIsIkF2YWlsYWJpbGl0eVR5cGUiLCJBZGFwdGF0aW9uIiwibGFiZWwiLCJuYW1lIiwiX2dldFNlbGVjdGlvbkZpZWxkcyIsIm5hdmlnYXRpb25QYXRoIiwicHJvcGVydGllcyIsInNlbGVjdGlvbkZpZWxkTWFwIiwiZnVsbFBhdGgiLCJzZWxlY3Rpb25GaWVsZCIsIl9nZXRTZWxlY3Rpb25GaWVsZHNCeVBhdGgiLCJwcm9wZXJ0eVBhdGhzIiwic2VsZWN0aW9uRmllbGRzIiwibG9jYWxTZWxlY3Rpb25GaWVsZHMiLCJlbnRpdHlQcm9wZXJ0aWVzIiwiaW5jbHVkZXMiLCJzcGxpY2UiLCJqb2luIiwiX2dldEZpbHRlckZpZWxkIiwiZmlsdGVyRmllbGRzIiwiZmlsdGVyRmllbGQiLCJnZXREaWFnbm9zdGljcyIsImFkZElzc3VlIiwiSXNzdWVDYXRlZ29yeSIsIkFubm90YXRpb24iLCJJc3N1ZVNldmVyaXR5IiwiSGlnaCIsIklzc3VlVHlwZSIsIk1JU1NJTkdfU0VMRUNUSU9ORklFTEQiLCJEZWZhdWx0IiwiaXNQYXJhbWV0ZXIiLCJSZXN1bHRDb250ZXh0IiwiX2dldERlZmF1bHRGaWx0ZXJGaWVsZHMiLCJhU2VsZWN0T3B0aW9ucyIsImV4Y2x1ZGVkRmlsdGVyUHJvcGVydGllcyIsImFubm90YXRlZFNlbGVjdGlvbkZpZWxkcyIsIlVJU2VsZWN0aW9uRmllbGRzIiwiU2VsZWN0aW9uRmllbGQiLCJ2YWx1ZSIsInNlbGVjdE9wdGlvbiIsIlByb3BlcnR5TmFtZSIsInNQcm9wZXJ0eVBhdGgiLCJGaWx0ZXJGaWVsZCIsImRlZmF1bHRGaWx0ZXJWYWx1ZSIsIkZpbHRlckRlZmF1bHRWYWx1ZSIsIlByb3BlcnR5UGF0aCIsIl9nZXRQYXJhbWV0ZXJGaWVsZHMiLCJkYXRhTW9kZWxPYmplY3RQYXRoIiwiZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCIsInBhcmFtZXRlckVudGl0eVR5cGUiLCJzdGFydGluZ0VudGl0eVNldCIsImlzUGFyYW1ldGVyaXplZCIsInBhcmFtZXRlckNvbnZlcnRlckNvbnRleHQiLCJnZXRDb252ZXJ0ZXJDb250ZXh0Rm9yIiwicGFyYW1ldGVyRmllbGRzIiwiZ2V0RmlsdGVyQmFyaGlkZUJhc2ljU2VhcmNoIiwiZ2V0TWFuaWZlc3RXcmFwcGVyIiwiaGFzTXVsdGlwbGVWaXN1YWxpemF0aW9ucyIsImdldFRlbXBsYXRlVHlwZSIsIlRlbXBsYXRlVHlwZSIsIkFuYWx5dGljYWxMaXN0UGFnZSIsInNDb250ZXh0UGF0aCIsImdldENvbnRleHRQYXRoIiwiZ2V0TWFuaWZlc3RGaWx0ZXJGaWVsZHMiLCJmYkNvbmZpZyIsImdldEZpbHRlckNvbmZpZ3VyYXRpb24iLCJkZWZpbmVkRmlsdGVyRmllbGRzIiwiT2JqZWN0Iiwia2V5cyIsImdldFBhdGhGcm9tU2VsZWN0aW9uRmllbGRLZXkiLCJzS2V5IiwidmlzdWFsRmlsdGVyIiwiZ2V0VmlzdWFsRmlsdGVycyIsInRlbXBsYXRlIiwicG9zaXRpb24iLCJwbGFjZW1lbnQiLCJQbGFjZW1lbnQiLCJBZnRlciIsInNldHRpbmdzIiwiZ2V0RmlsdGVyRmllbGQiLCJnZXRTZWxlY3Rpb25GaWVsZHMiLCJsclRhYmxlcyIsImdldEVudGl0eVR5cGUiLCJmaWx0ZXJGYWNldHMiLCJGaWx0ZXJGYWNldHMiLCJhRmllbGRHcm91cHMiLCJnZXRBbm5vdGF0aW9uc0J5VGVybSIsImkiLCJmaWx0ZXJGYWNldCIsIlRhcmdldCIsIiR0YXJnZXQiLCJJRCIsInRvU3RyaW5nIiwiZ2V0U2VsZWN0aW9uVmFyaWFudCIsIlNlbGVjdE9wdGlvbnMiLCJuYXZpZ2F0aW9uUHJvcGVydGllcyIsImdldEVudGl0eVR5cGVBbm5vdGF0aW9uIiwiU2VsZWN0aW9uRmllbGRzIiwiZGVmYXVsdEZpbHRlcnMiLCJhbGxGaWx0ZXJzIiwiZmlsdGVyIiwiYXNzaWduIiwiYWdncmVnYXRlcyIsImFnZ3JlZ2F0YWJsZVByb3BlcnRpZXMiLCJhZ2dyZWdhdGVLZXkiLCJyZWxhdGl2ZVBhdGgiLCJpbnNlcnRDdXN0b21FbGVtZW50cyIsImlzQ2FzZVNlbnNpdGl2ZSIsImlzRmlsdGVyaW5nQ2FzZVNlbnNpdGl2ZSIsImNhc2VTZW5zaXRpdmUiXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBNENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVNBLHlCQUFULENBQW1DQyxVQUFuQyxFQUE0RztBQUMzRyxRQUFNQyxjQUEyQyxHQUFHLEVBQXBEO0FBQ0FELElBQUFBLFVBQVUsQ0FBQ0UsSUFBWCxDQUFnQkMsT0FBaEIsQ0FBd0IsVUFBQ0MsU0FBRCxFQUF1QztBQUM5RCxVQUFJQSxTQUFTLENBQUNDLEtBQVYsS0FBb0Isc0NBQXhCLEVBQWdFO0FBQUE7O0FBQy9ESixRQUFBQSxjQUFjLENBQUNHLFNBQVMsQ0FBQ0UsS0FBVixDQUFnQkMsSUFBakIsQ0FBZCxHQUF1QztBQUN0Q0MsVUFBQUEsS0FBSyxFQUFFUixVQUFVLENBQUNTLGtCQURvQjtBQUV0Q0MsVUFBQUEsVUFBVSxFQUNUQyxjQUFjLENBQ2JDLG9CQUFvQixDQUFDWixVQUFVLENBQUNhLEtBQVgsOEJBQW9CYixVQUFVLENBQUNjLFdBQS9CLG9GQUFvQixzQkFBd0JDLE1BQTVDLDJEQUFvQix1QkFB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LFVBQUQsRUFBYXBDLHVCQUF1QixDQUFDMUYsVUFBRCxFQUFhbkIsZ0JBQWIsQ0FBcEMsRUFBb0U7QUFDL0csc0JBQWdCLFdBRCtGO0FBRS9HZ0QsTUFBQUEsS0FBSyxFQUFFLFdBRndHO0FBRy9Hd0UsTUFBQUEsUUFBUSxFQUFFLFdBSHFHO0FBSS9HRCxNQUFBQSxRQUFRLEVBQUUsV0FKcUc7QUFLL0dLLE1BQUFBLFFBQVEsRUFBRSxXQUxxRztBQU0vR1AsTUFBQUEsWUFBWSxFQUFFO0FBTmlHLEtBQXBFLENBQTVDLENBMUdnQixDQW1IaEI7O0FBQ0EsUUFBTW9DLGVBQWUsR0FBR0Msd0JBQXdCLENBQUMxSixnQkFBRCxDQUFoRDtBQUNBMEQsSUFBQUEsZUFBZSxDQUFDMUYsT0FBaEIsQ0FBd0IsVUFBQWtHLFdBQVcsRUFBSTtBQUN0Q0EsTUFBQUEsV0FBVyxDQUFDeUYsYUFBWixHQUE0QkYsZUFBNUI7QUFDQSxLQUZEO0FBSUEsV0FBTy9GLGVBQVA7QUFDQSxHQTlITSIsInNvdXJjZVJvb3QiOiIuIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcblx0QXZhaWxhYmlsaXR5VHlwZSxcblx0RmlsdGVyRmllbGRNYW5pZmVzdENvbmZpZ3VyYXRpb24sXG5cdEZpbHRlck1hbmlmZXN0Q29uZmlndXJhdGlvbixcblx0RmlsdGVyU2V0dGluZ3MsXG5cdFRlbXBsYXRlVHlwZVxufSBmcm9tIFwiLi4vLi4vTWFuaWZlc3RTZXR0aW5nc1wiO1xuaW1wb3J0IHsgRW50aXR5VHlwZSwgTmF2aWdhdGlvblByb3BlcnR5LCBQcm9wZXJ0eSB9IGZyb20gXCJAc2FwLXV4L2Fubm90YXRpb24tY29udmVydGVyXCI7XG5pbXBvcnQgQ29udmVydGVyQ29udGV4dCBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9Db252ZXJ0ZXJDb250ZXh0XCI7XG5pbXBvcnQgeyBBbm5vdGF0aW9uVGVybSwgRGF0YUZpZWxkQWJzdHJhY3RUeXBlcywgRGF0YUZpZWxkVHlwZXMsIFJlZmVyZW5jZUZhY2V0VHlwZXMsIFVJQW5ub3RhdGlvblRlcm1zIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG5pbXBvcnQge1xuXHRnZXRTZWxlY3Rpb25WYXJpYW50Q29uZmlndXJhdGlvbixcblx0U2VsZWN0aW9uVmFyaWFudENvbmZpZ3VyYXRpb24sXG5cdFRhYmxlVmlzdWFsaXphdGlvbixcblx0aXNGaWx0ZXJpbmdDYXNlU2Vuc2l0aXZlXG59IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2NvbnRyb2xzL0NvbW1vbi9UYWJsZVwiO1xuaW1wb3J0IHsgQ29uZmlndXJhYmxlT2JqZWN0LCBDdXN0b21FbGVtZW50LCBpbnNlcnRDdXN0b21FbGVtZW50cywgUGxhY2VtZW50IH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvaGVscGVycy9Db25maWd1cmFibGVPYmplY3RcIjtcbmltcG9ydCB7IGdldFZpc3VhbEZpbHRlcnMsIFZpc3VhbEZpbHRlcnMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9jb250cm9scy9MaXN0UmVwb3J0L1Zpc3VhbEZpbHRlcnNcIjtcbmltcG9ydCB7IFNlbGVjdE9wdGlvblR5cGUsIEZpZWxkR3JvdXBUeXBlLCBGaWVsZEdyb3VwIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL2Rpc3QvZ2VuZXJhdGVkL1VJXCI7XG5pbXBvcnQgeyBhbm5vdGF0aW9uRXhwcmVzc2lvbiwgY29tcGlsZUJpbmRpbmcgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9CaW5kaW5nRXhwcmVzc2lvblwiO1xuaW1wb3J0IHsgZ2V0U2VsZWN0aW9uVmFyaWFudCB9IGZyb20gXCIuLi9Db21tb24vRGF0YVZpc3VhbGl6YXRpb25cIjtcbmltcG9ydCB7IEtleUhlbHBlciB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2hlbHBlcnMvS2V5XCI7XG5pbXBvcnQgeyBJc3N1ZVR5cGUsIElzc3VlU2V2ZXJpdHksIElzc3VlQ2F0ZWdvcnkgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9oZWxwZXJzL0lzc3VlTWFuYWdlclwiO1xuaW1wb3J0IHsgUHJvcGVydHlQYXRoIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL2Rpc3QvRWRtXCI7XG5cbmV4cG9ydCB0eXBlIEZpbHRlckZpZWxkID0gQ29uZmlndXJhYmxlT2JqZWN0ICYge1xuXHRjb25kaXRpb25QYXRoOiBzdHJpbmc7XG5cdGF2YWlsYWJpbGl0eTogQXZhaWxhYmlsaXR5VHlwZTtcblx0YW5ub3RhdGlvblBhdGg6IHN0cmluZztcblx0bGFiZWw/OiBzdHJpbmc7XG5cdHRlbXBsYXRlPzogc3RyaW5nO1xuXHRncm91cD86IHN0cmluZztcblx0Z3JvdXBMYWJlbD86IHN0cmluZztcblx0c2V0dGluZ3M/OiBGaWx0ZXJTZXR0aW5ncztcblx0aXNQYXJhbWV0ZXI/OiBib29sZWFuO1xuXHR2aXN1YWxGaWx0ZXI/OiBWaXN1YWxGaWx0ZXJzO1xuXHRjYXNlU2Vuc2l0aXZlPzogYm9vbGVhbjtcbn07XG5cbnR5cGUgRmlsdGVyR3JvdXAgPSB7XG5cdGdyb3VwPzogc3RyaW5nO1xuXHRncm91cExhYmVsPzogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgQ3VzdG9tRWxlbWVudEZpbHRlckZpZWxkID0gQ3VzdG9tRWxlbWVudDxGaWx0ZXJGaWVsZD47XG5cbi8qKlxuICogRW50ZXIgYWxsIERhdGFGaWVsZHMgb2YgYSBnaXZlbiBGaWVsZEdyb3VwIGludG8gdGhlIGZpbHRlckZhY2V0TWFwLlxuICpcbiAqIEBwYXJhbSB7QW5ub3RhdGlvblRlcm08RmllbGRHcm91cFR5cGU+fSBmaWVsZEdyb3VwXG4gKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgRmlsdGVyR3JvdXA+fSBUaGUgbWFwIG9mIGZhY2V0cyBmb3IgdGhlIGdpdmVuIGZpZWxkR3JvdXBcbiAqL1xuZnVuY3Rpb24gZ2V0RmllbGRHcm91cEZpbHRlckdyb3VwcyhmaWVsZEdyb3VwOiBBbm5vdGF0aW9uVGVybTxGaWVsZEdyb3VwVHlwZT4pOiBSZWNvcmQ8c3RyaW5nLCBGaWx0ZXJHcm91cD4ge1xuXHRjb25zdCBmaWx0ZXJGYWNldE1hcDogUmVjb3JkPHN0cmluZywgRmlsdGVyR3JvdXA+ID0ge307XG5cdGZpZWxkR3JvdXAuRGF0YS5mb3JFYWNoKChkYXRhRmllbGQ6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMpID0+IHtcblx0XHRpZiAoZGF0YUZpZWxkLiRUeXBlID09PSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkRhdGFGaWVsZFwiKSB7XG5cdFx0XHRmaWx0ZXJGYWNldE1hcFtkYXRhRmllbGQuVmFsdWUucGF0aF0gPSB7XG5cdFx0XHRcdGdyb3VwOiBmaWVsZEdyb3VwLmZ1bGx5UXVhbGlmaWVkTmFtZSxcblx0XHRcdFx0Z3JvdXBMYWJlbDpcblx0XHRcdFx0XHRjb21waWxlQmluZGluZyhcblx0XHRcdFx0XHRcdGFubm90YXRpb25FeHByZXNzaW9uKGZpZWxkR3JvdXAuTGFiZWwgfHwgZmllbGRHcm91cC5hbm5vdGF0aW9ucz8uQ29tbW9uPy5MYWJlbCB8fCBmaWVsZEdyb3VwLnF1YWxpZmllcilcblx0XHRcdFx0XHQpIHx8IGZpZWxkR3JvdXAucXVhbGlmaWVyXG5cdFx0XHR9O1xuXHRcdH1cblx0fSk7XG5cdHJldHVybiBmaWx0ZXJGYWNldE1hcDtcbn1cblxuZnVuY3Rpb24gZ2V0RXhjbHVkZWRGaWx0ZXJQcm9wZXJ0aWVzKHNlbGVjdGlvblZhcmlhbnRzOiBTZWxlY3Rpb25WYXJpYW50Q29uZmlndXJhdGlvbltdKTogUmVjb3JkPHN0cmluZywgYm9vbGVhbj4ge1xuXHRyZXR1cm4gc2VsZWN0aW9uVmFyaWFudHMucmVkdWNlKChwcmV2aW91c1ZhbHVlOiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPiwgc2VsZWN0aW9uVmFyaWFudCkgPT4ge1xuXHRcdHNlbGVjdGlvblZhcmlhbnQucHJvcGVydHlOYW1lcy5mb3JFYWNoKHByb3BlcnR5TmFtZSA9PiB7XG5cdFx0XHRwcmV2aW91c1ZhbHVlW3Byb3BlcnR5TmFtZV0gPSB0cnVlO1xuXHRcdH0pO1xuXHRcdHJldHVybiBwcmV2aW91c1ZhbHVlO1xuXHR9LCB7fSk7XG59XG5cbi8qKlxuICogQ2hlY2sgdGhhdCBhbGwgdGhlIHRhYmxlcyBmb3IgYSBkZWRpY2F0ZWQgZW50aXR5c2V0IGFyZSBjb25maWd1cmVkIGFzIGFuYWx5dGljYWwgdGFibGUuXG4gKiBAcGFyYW0ge1RhYmxlVmlzdWFsaXphdGlvbltdfSBsaXN0UmVwb3J0VGFibGVzIExpc3QgUmVwb3J0IHRhYmxlc1xuICogQHBhcmFtIHtzdHJpbmd9IGNvbnRleHRQYXRoXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gSXMgRmlsdGVyQmFyIHNlYXJjaCBmaWVsZCBoaWRkZW4gb3Igbm90XG4gKi9cbmZ1bmN0aW9uIGNoZWNrQWxsVGFibGVGb3JFbnRpdHlTZXRBcmVBbmFseXRpY2FsKGxpc3RSZXBvcnRUYWJsZXM6IFRhYmxlVmlzdWFsaXphdGlvbltdLCBjb250ZXh0UGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG5cdGlmIChjb250ZXh0UGF0aCAmJiBsaXN0UmVwb3J0VGFibGVzLmxlbmd0aCA+IDApIHtcblx0XHRyZXR1cm4gbGlzdFJlcG9ydFRhYmxlcy5ldmVyeSh2aXN1YWxpemF0aW9uID0+IHtcblx0XHRcdHJldHVybiB2aXN1YWxpemF0aW9uLmVuYWJsZUFuYWx5dGljcyAmJiBjb250ZXh0UGF0aCA9PT0gdmlzdWFsaXphdGlvbi5hbm5vdGF0aW9uLmNvbGxlY3Rpb247XG5cdFx0fSk7XG5cdH1cblx0cmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBnZXRTZWxlY3Rpb25WYXJpYW50cyhcblx0bHJUYWJsZVZpc3VhbGl6YXRpb25zOiBUYWJsZVZpc3VhbGl6YXRpb25bXSxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dFxuKTogU2VsZWN0aW9uVmFyaWFudENvbmZpZ3VyYXRpb25bXSB7XG5cdGNvbnN0IHNlbGVjdGlvblZhcmlhbnRQYXRoczogc3RyaW5nW10gPSBbXTtcblx0cmV0dXJuIGxyVGFibGVWaXN1YWxpemF0aW9uc1xuXHRcdC5tYXAodmlzdWFsaXphdGlvbiA9PiB7XG5cdFx0XHRjb25zdCB0YWJsZUZpbHRlcnMgPSB2aXN1YWxpemF0aW9uLmNvbnRyb2wuZmlsdGVycztcblx0XHRcdGNvbnN0IHRhYmxlU1ZDb25maWdzOiBTZWxlY3Rpb25WYXJpYW50Q29uZmlndXJhdGlvbltdID0gW107XG5cdFx0XHRmb3IgKGNvbnN0IGtleSBpbiB0YWJsZUZpbHRlcnMpIHtcblx0XHRcdFx0aWYgKEFycmF5LmlzQXJyYXkodGFibGVGaWx0ZXJzW2tleV0ucGF0aHMpKSB7XG5cdFx0XHRcdFx0Y29uc3QgcGF0aHMgPSB0YWJsZUZpbHRlcnNba2V5XS5wYXRocztcblx0XHRcdFx0XHRwYXRocy5mb3JFYWNoKHBhdGggPT4ge1xuXHRcdFx0XHRcdFx0aWYgKHBhdGggJiYgcGF0aC5hbm5vdGF0aW9uUGF0aCAmJiBzZWxlY3Rpb25WYXJpYW50UGF0aHMuaW5kZXhPZihwYXRoLmFubm90YXRpb25QYXRoKSA9PT0gLTEpIHtcblx0XHRcdFx0XHRcdFx0c2VsZWN0aW9uVmFyaWFudFBhdGhzLnB1c2gocGF0aC5hbm5vdGF0aW9uUGF0aCk7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IHNlbGVjdGlvblZhcmlhbnRDb25maWcgPSBnZXRTZWxlY3Rpb25WYXJpYW50Q29uZmlndXJhdGlvbihwYXRoLmFubm90YXRpb25QYXRoLCBjb252ZXJ0ZXJDb250ZXh0KTtcblx0XHRcdFx0XHRcdFx0aWYgKHNlbGVjdGlvblZhcmlhbnRDb25maWcpIHtcblx0XHRcdFx0XHRcdFx0XHR0YWJsZVNWQ29uZmlncy5wdXNoKHNlbGVjdGlvblZhcmlhbnRDb25maWcpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiB0YWJsZVNWQ29uZmlncztcblx0XHR9KVxuXHRcdC5yZWR1Y2UoKHN2Q29uZmlncywgc2VsZWN0aW9uVmFyaWFudCkgPT4gc3ZDb25maWdzLmNvbmNhdChzZWxlY3Rpb25WYXJpYW50KSwgW10pO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGNvbmRpdGlvbiBwYXRoIHJlcXVpcmVkIGZvciB0aGUgY29uZGl0aW9uIG1vZGVsLiBJdCBsb29rcyBsaWtlIGZvbGxvdzpcbiAqIDwxOk4tUHJvcGVydHlOYW1lPipcXC88MToxLVByb3BlcnR5TmFtZT4vPFByb3BlcnR5TmFtZT4uXG4gKlxuICogQHBhcmFtIGVudGl0eVR5cGUgVGhlIHJvb3QgRW50aXR5VHlbZVxuICogQHBhcmFtIHByb3BlcnR5UGF0aCBUaGUgZnVsbCBwYXRoIHRvIHRoZSB0YXJnZXQgcHJvcGVydHlcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBmb3JtYXR0ZWQgY29uZGl0aW9uIHBhdGhcbiAqL1xuY29uc3QgX2dldENvbmRpdGlvblBhdGggPSBmdW5jdGlvbihlbnRpdHlUeXBlOiBFbnRpdHlUeXBlLCBwcm9wZXJ0eVBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG5cdGNvbnN0IHBhcnRzID0gcHJvcGVydHlQYXRoLnNwbGl0KFwiL1wiKTtcblx0bGV0IHBhcnRpYWxQYXRoO1xuXHRsZXQga2V5ID0gXCJcIjtcblx0d2hpbGUgKHBhcnRzLmxlbmd0aCkge1xuXHRcdGxldCBwYXJ0ID0gcGFydHMuc2hpZnQoKSBhcyBzdHJpbmc7XG5cdFx0cGFydGlhbFBhdGggPSBwYXJ0aWFsUGF0aCA/IHBhcnRpYWxQYXRoICsgXCIvXCIgKyBwYXJ0IDogcGFydDtcblx0XHRjb25zdCBwcm9wZXJ0eTogUHJvcGVydHkgfCBOYXZpZ2F0aW9uUHJvcGVydHkgPSBlbnRpdHlUeXBlLnJlc29sdmVQYXRoKHBhcnRpYWxQYXRoKTtcblx0XHRpZiAocHJvcGVydHkuX3R5cGUgPT09IFwiTmF2aWdhdGlvblByb3BlcnR5XCIgJiYgcHJvcGVydHkuaXNDb2xsZWN0aW9uKSB7XG5cdFx0XHRwYXJ0ICs9IFwiKlwiO1xuXHRcdH1cblx0XHRrZXkgPSBrZXkgPyBrZXkgKyBcIi9cIiArIHBhcnQgOiBwYXJ0O1xuXHR9XG5cdHJldHVybiBrZXk7XG59O1xuXG5jb25zdCBfY3JlYXRlRmlsdGVyU2VsZWN0aW9uRmllbGQgPSBmdW5jdGlvbihcblx0ZW50aXR5VHlwZTogRW50aXR5VHlwZSxcblx0cHJvcGVydHk6IFByb3BlcnR5LFxuXHRmdWxsUHJvcGVydHlQYXRoOiBzdHJpbmcsXG5cdGluY2x1ZGVIaWRkZW46IGJvb2xlYW4sXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHRcbik6IEZpbHRlckZpZWxkIHwgdW5kZWZpbmVkIHtcblx0Ly8gaWdub3JlIGNvbXBsZXggcHJvcGVydHkgdHlwZXMgYW5kIGhpZGRlbiBhbm5vdGF0ZWQgb25lc1xuXHRpZiAoXG5cdFx0cHJvcGVydHkgIT09IHVuZGVmaW5lZCAmJlxuXHRcdHByb3BlcnR5LnRhcmdldFR5cGUgPT09IHVuZGVmaW5lZCAmJlxuXHRcdChpbmNsdWRlSGlkZGVuIHx8IHByb3BlcnR5LmFubm90YXRpb25zPy5VST8uSGlkZGVuPy52YWx1ZU9mKCkgIT09IHRydWUpXG5cdCkge1xuXHRcdGNvbnN0IHRhcmdldEVudGl0eVR5cGUgPSBjb252ZXJ0ZXJDb250ZXh0LmdldEFubm90YXRpb25FbnRpdHlUeXBlKHByb3BlcnR5KTtcblx0XHRyZXR1cm4ge1xuXHRcdFx0a2V5OiBLZXlIZWxwZXIuZ2V0U2VsZWN0aW9uRmllbGRLZXlGcm9tUGF0aChmdWxsUHJvcGVydHlQYXRoKSxcblx0XHRcdGFubm90YXRpb25QYXRoOiBjb252ZXJ0ZXJDb250ZXh0LmdldEFic29sdXRlQW5ub3RhdGlvblBhdGgoZnVsbFByb3BlcnR5UGF0aCksXG5cdFx0XHRjb25kaXRpb25QYXRoOiBfZ2V0Q29uZGl0aW9uUGF0aChlbnRpdHlUeXBlLCBmdWxsUHJvcGVydHlQYXRoKSxcblx0XHRcdGF2YWlsYWJpbGl0eTpcblx0XHRcdFx0cHJvcGVydHkuYW5ub3RhdGlvbnM/LlVJPy5IaWRkZW5GaWx0ZXI/LnZhbHVlT2YoKSA9PT0gdHJ1ZSA/IEF2YWlsYWJpbGl0eVR5cGUuSGlkZGVuIDogQXZhaWxhYmlsaXR5VHlwZS5BZGFwdGF0aW9uLFxuXHRcdFx0bGFiZWw6IGNvbXBpbGVCaW5kaW5nKGFubm90YXRpb25FeHByZXNzaW9uKHByb3BlcnR5LmFubm90YXRpb25zLkNvbW1vbj8uTGFiZWw/LnZhbHVlT2YoKSB8fCBwcm9wZXJ0eS5uYW1lKSksXG5cdFx0XHRncm91cDogdGFyZ2V0RW50aXR5VHlwZS5uYW1lLFxuXHRcdFx0Z3JvdXBMYWJlbDogY29tcGlsZUJpbmRpbmcoXG5cdFx0XHRcdGFubm90YXRpb25FeHByZXNzaW9uKHRhcmdldEVudGl0eVR5cGU/LmFubm90YXRpb25zPy5Db21tb24/LkxhYmVsPy52YWx1ZU9mKCkgfHwgdGFyZ2V0RW50aXR5VHlwZS5uYW1lKVxuXHRcdFx0KVxuXHRcdH07XG5cdH1cblx0cmV0dXJuIHVuZGVmaW5lZDtcbn07XG5cbmNvbnN0IF9nZXRTZWxlY3Rpb25GaWVsZHMgPSBmdW5jdGlvbihcblx0ZW50aXR5VHlwZTogRW50aXR5VHlwZSxcblx0bmF2aWdhdGlvblBhdGg6IHN0cmluZyxcblx0cHJvcGVydGllczogQXJyYXk8UHJvcGVydHk+IHwgdW5kZWZpbmVkLFxuXHRpbmNsdWRlSGlkZGVuOiBib29sZWFuLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0XG4pOiBSZWNvcmQ8c3RyaW5nLCBGaWx0ZXJGaWVsZD4ge1xuXHRjb25zdCBzZWxlY3Rpb25GaWVsZE1hcDogUmVjb3JkPHN0cmluZywgRmlsdGVyRmllbGQ+ID0ge307XG5cdGlmIChwcm9wZXJ0aWVzKSB7XG5cdFx0cHJvcGVydGllcy5mb3JFYWNoKChwcm9wZXJ0eTogUHJvcGVydHkpID0+IHtcblx0XHRcdGNvbnN0IHByb3BlcnR5UGF0aDogc3RyaW5nID0gcHJvcGVydHkubmFtZTtcblx0XHRcdGNvbnN0IGZ1bGxQYXRoOiBzdHJpbmcgPSAobmF2aWdhdGlvblBhdGggPyBuYXZpZ2F0aW9uUGF0aCArIFwiL1wiIDogXCJcIikgKyBwcm9wZXJ0eVBhdGg7XG5cdFx0XHRjb25zdCBzZWxlY3Rpb25GaWVsZCA9IF9jcmVhdGVGaWx0ZXJTZWxlY3Rpb25GaWVsZChlbnRpdHlUeXBlLCBwcm9wZXJ0eSwgZnVsbFBhdGgsIGluY2x1ZGVIaWRkZW4sIGNvbnZlcnRlckNvbnRleHQpO1xuXHRcdFx0aWYgKHNlbGVjdGlvbkZpZWxkKSB7XG5cdFx0XHRcdHNlbGVjdGlvbkZpZWxkTWFwW2Z1bGxQYXRoXSA9IHNlbGVjdGlvbkZpZWxkO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cdHJldHVybiBzZWxlY3Rpb25GaWVsZE1hcDtcbn07XG5cbmNvbnN0IF9nZXRTZWxlY3Rpb25GaWVsZHNCeVBhdGggPSBmdW5jdGlvbihcblx0ZW50aXR5VHlwZTogRW50aXR5VHlwZSxcblx0cHJvcGVydHlQYXRoczogQXJyYXk8c3RyaW5nPiB8IHVuZGVmaW5lZCxcblx0aW5jbHVkZUhpZGRlbjogYm9vbGVhbixcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dFxuKTogUmVjb3JkPHN0cmluZywgRmlsdGVyRmllbGQ+IHtcblx0bGV0IHNlbGVjdGlvbkZpZWxkczogUmVjb3JkPHN0cmluZywgRmlsdGVyRmllbGQ+ID0ge307XG5cdGlmIChwcm9wZXJ0eVBhdGhzKSB7XG5cdFx0cHJvcGVydHlQYXRocy5mb3JFYWNoKChwcm9wZXJ0eVBhdGg6IHN0cmluZykgPT4ge1xuXHRcdFx0bGV0IGxvY2FsU2VsZWN0aW9uRmllbGRzOiBSZWNvcmQ8c3RyaW5nLCBGaWx0ZXJGaWVsZD47XG5cblx0XHRcdGNvbnN0IHByb3BlcnR5OiBQcm9wZXJ0eSB8IE5hdmlnYXRpb25Qcm9wZXJ0eSA9IGVudGl0eVR5cGUucmVzb2x2ZVBhdGgocHJvcGVydHlQYXRoKTtcblx0XHRcdGlmIChwcm9wZXJ0eSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGlmIChwcm9wZXJ0eS5fdHlwZSA9PT0gXCJOYXZpZ2F0aW9uUHJvcGVydHlcIikge1xuXHRcdFx0XHQvLyBoYW5kbGUgbmF2aWdhdGlvbiBwcm9wZXJ0aWVzXG5cdFx0XHRcdGxvY2FsU2VsZWN0aW9uRmllbGRzID0gX2dldFNlbGVjdGlvbkZpZWxkcyhcblx0XHRcdFx0XHRlbnRpdHlUeXBlLFxuXHRcdFx0XHRcdHByb3BlcnR5UGF0aCxcblx0XHRcdFx0XHRwcm9wZXJ0eS50YXJnZXRUeXBlLmVudGl0eVByb3BlcnRpZXMsXG5cdFx0XHRcdFx0aW5jbHVkZUhpZGRlbixcblx0XHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0XG5cdFx0XHRcdCk7XG5cdFx0XHR9IGVsc2UgaWYgKHByb3BlcnR5LnRhcmdldFR5cGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHQvLyBoYW5kbGUgQ29tcGxleFR5cGUgcHJvcGVydGllc1xuXHRcdFx0XHRsb2NhbFNlbGVjdGlvbkZpZWxkcyA9IF9nZXRTZWxlY3Rpb25GaWVsZHMoXG5cdFx0XHRcdFx0ZW50aXR5VHlwZSxcblx0XHRcdFx0XHRwcm9wZXJ0eVBhdGgsXG5cdFx0XHRcdFx0cHJvcGVydHkudGFyZ2V0VHlwZS5wcm9wZXJ0aWVzLFxuXHRcdFx0XHRcdGluY2x1ZGVIaWRkZW4sXG5cdFx0XHRcdFx0Y29udmVydGVyQ29udGV4dFxuXHRcdFx0XHQpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3QgbmF2aWdhdGlvblBhdGggPSBwcm9wZXJ0eVBhdGguaW5jbHVkZXMoXCIvXCIpXG5cdFx0XHRcdFx0PyBwcm9wZXJ0eVBhdGhcblx0XHRcdFx0XHRcdFx0LnNwbGl0KFwiL1wiKVxuXHRcdFx0XHRcdFx0XHQuc3BsaWNlKDAsIDEpXG5cdFx0XHRcdFx0XHRcdC5qb2luKFwiL1wiKVxuXHRcdFx0XHRcdDogXCJcIjtcblx0XHRcdFx0bG9jYWxTZWxlY3Rpb25GaWVsZHMgPSBfZ2V0U2VsZWN0aW9uRmllbGRzKGVudGl0eVR5cGUsIG5hdmlnYXRpb25QYXRoLCBbcHJvcGVydHldLCBpbmNsdWRlSGlkZGVuLCBjb252ZXJ0ZXJDb250ZXh0KTtcblx0XHRcdH1cblxuXHRcdFx0c2VsZWN0aW9uRmllbGRzID0ge1xuXHRcdFx0XHQuLi5zZWxlY3Rpb25GaWVsZHMsXG5cdFx0XHRcdC4uLmxvY2FsU2VsZWN0aW9uRmllbGRzXG5cdFx0XHR9O1xuXHRcdH0pO1xuXHR9XG5cdHJldHVybiBzZWxlY3Rpb25GaWVsZHM7XG59O1xuXG5jb25zdCBfZ2V0RmlsdGVyRmllbGQgPSBmdW5jdGlvbihcblx0ZmlsdGVyRmllbGRzOiBSZWNvcmQ8c3RyaW5nLCBGaWx0ZXJGaWVsZD4sXG5cdHByb3BlcnR5UGF0aDogc3RyaW5nLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LFxuXHRlbnRpdHlUeXBlOiBFbnRpdHlUeXBlXG4pOiBGaWx0ZXJGaWVsZCB8IHVuZGVmaW5lZCB7XG5cdGxldCBmaWx0ZXJGaWVsZDogRmlsdGVyRmllbGQgfCB1bmRlZmluZWQgPSBmaWx0ZXJGaWVsZHNbcHJvcGVydHlQYXRoXTtcblx0aWYgKGZpbHRlckZpZWxkKSB7XG5cdFx0ZGVsZXRlIGZpbHRlckZpZWxkc1twcm9wZXJ0eVBhdGhdO1xuXHR9IGVsc2Uge1xuXHRcdGZpbHRlckZpZWxkID0gX2NyZWF0ZUZpbHRlclNlbGVjdGlvbkZpZWxkKGVudGl0eVR5cGUsIGVudGl0eVR5cGUucmVzb2x2ZVBhdGgocHJvcGVydHlQYXRoKSwgcHJvcGVydHlQYXRoLCB0cnVlLCBjb252ZXJ0ZXJDb250ZXh0KTtcblx0fVxuXHRpZiAoIWZpbHRlckZpZWxkKSB7XG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXREaWFnbm9zdGljcygpLmFkZElzc3VlKElzc3VlQ2F0ZWdvcnkuQW5ub3RhdGlvbiwgSXNzdWVTZXZlcml0eS5IaWdoLCBJc3N1ZVR5cGUuTUlTU0lOR19TRUxFQ1RJT05GSUVMRCk7XG5cdH1cblx0Ly8gZGVmaW5lZCBTZWxlY3Rpb25GaWVsZHMgYXJlIGF2YWlsYWJsZSBieSBkZWZhdWx0XG5cdGlmIChmaWx0ZXJGaWVsZCkge1xuXHRcdGZpbHRlckZpZWxkLmF2YWlsYWJpbGl0eSA9IEF2YWlsYWJpbGl0eVR5cGUuRGVmYXVsdDtcblx0XHRmaWx0ZXJGaWVsZC5pc1BhcmFtZXRlciA9ICEhZW50aXR5VHlwZS5hbm5vdGF0aW9ucz8uQ29tbW9uPy5SZXN1bHRDb250ZXh0O1xuXHR9XG5cdHJldHVybiBmaWx0ZXJGaWVsZDtcbn07XG5cbmNvbnN0IF9nZXREZWZhdWx0RmlsdGVyRmllbGRzID0gZnVuY3Rpb24oXG5cdGZpbHRlckZpZWxkczogUmVjb3JkPHN0cmluZywgRmlsdGVyRmllbGQ+LFxuXHRhU2VsZWN0T3B0aW9uczogYW55W10sXG5cdGVudGl0eVR5cGU6IEVudGl0eVR5cGUsXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdGV4Y2x1ZGVkRmlsdGVyUHJvcGVydGllczogUmVjb3JkPHN0cmluZywgYm9vbGVhbj4sXG5cdGFubm90YXRlZFNlbGVjdGlvbkZpZWxkczogUHJvcGVydHlQYXRoW11cbik6IEZpbHRlckZpZWxkW10ge1xuXHRjb25zdCBzZWxlY3Rpb25GaWVsZHM6IEZpbHRlckZpZWxkW10gPSBbXTtcblx0Y29uc3QgVUlTZWxlY3Rpb25GaWVsZHM6IGFueSA9IHt9O1xuXHRjb25zdCBwcm9wZXJ0aWVzID0gZW50aXR5VHlwZS5lbnRpdHlQcm9wZXJ0aWVzO1xuXHQvLyBVc2luZyBlbnRpdHlUeXBlIGluc3RlYWQgb2YgZW50aXR5U2V0XG5cdGFubm90YXRlZFNlbGVjdGlvbkZpZWxkcz8uZm9yRWFjaChTZWxlY3Rpb25GaWVsZCA9PiB7XG5cdFx0VUlTZWxlY3Rpb25GaWVsZHNbU2VsZWN0aW9uRmllbGQudmFsdWVdID0gdHJ1ZTtcblx0fSk7XG5cdGlmIChhU2VsZWN0T3B0aW9ucyAmJiBhU2VsZWN0T3B0aW9ucy5sZW5ndGggPiAwKSB7XG5cdFx0YVNlbGVjdE9wdGlvbnM/LmZvckVhY2goKHNlbGVjdE9wdGlvbjogU2VsZWN0T3B0aW9uVHlwZSkgPT4ge1xuXHRcdFx0Y29uc3QgcHJvcGVydHlOYW1lOiBhbnkgPSBzZWxlY3RPcHRpb24uUHJvcGVydHlOYW1lO1xuXHRcdFx0Y29uc3Qgc1Byb3BlcnR5UGF0aDogc3RyaW5nID0gcHJvcGVydHlOYW1lLnZhbHVlO1xuXHRcdFx0Y29uc3QgVUlTZWxlY3Rpb25GaWVsZHM6IGFueSA9IHt9O1xuXHRcdFx0YW5ub3RhdGVkU2VsZWN0aW9uRmllbGRzPy5mb3JFYWNoKFNlbGVjdGlvbkZpZWxkID0+IHtcblx0XHRcdFx0VUlTZWxlY3Rpb25GaWVsZHNbU2VsZWN0aW9uRmllbGQudmFsdWVdID0gdHJ1ZTtcblx0XHRcdH0pO1xuXHRcdFx0aWYgKCEoc1Byb3BlcnR5UGF0aCBpbiBleGNsdWRlZEZpbHRlclByb3BlcnRpZXMpKSB7XG5cdFx0XHRcdGlmICghKHNQcm9wZXJ0eVBhdGggaW4gVUlTZWxlY3Rpb25GaWVsZHMpKSB7XG5cdFx0XHRcdFx0Y29uc3QgRmlsdGVyRmllbGQ6IEZpbHRlckZpZWxkIHwgdW5kZWZpbmVkID0gX2dldEZpbHRlckZpZWxkKGZpbHRlckZpZWxkcywgc1Byb3BlcnR5UGF0aCwgY29udmVydGVyQ29udGV4dCwgZW50aXR5VHlwZSk7XG5cdFx0XHRcdFx0aWYgKEZpbHRlckZpZWxkKSB7XG5cdFx0XHRcdFx0XHRzZWxlY3Rpb25GaWVsZHMucHVzaChGaWx0ZXJGaWVsZCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH0gZWxzZSBpZiAocHJvcGVydGllcykge1xuXHRcdHByb3BlcnRpZXMuZm9yRWFjaCgocHJvcGVydHk6IFByb3BlcnR5KSA9PiB7XG5cdFx0XHRjb25zdCBkZWZhdWx0RmlsdGVyVmFsdWUgPSBwcm9wZXJ0eS5hbm5vdGF0aW9ucz8uQ29tbW9uPy5GaWx0ZXJEZWZhdWx0VmFsdWU7XG5cdFx0XHRjb25zdCBQcm9wZXJ0eVBhdGggPSBwcm9wZXJ0eS5uYW1lO1xuXHRcdFx0aWYgKCEoUHJvcGVydHlQYXRoIGluIGV4Y2x1ZGVkRmlsdGVyUHJvcGVydGllcykpIHtcblx0XHRcdFx0aWYgKGRlZmF1bHRGaWx0ZXJWYWx1ZSAmJiAhKFByb3BlcnR5UGF0aCBpbiBVSVNlbGVjdGlvbkZpZWxkcykpIHtcblx0XHRcdFx0XHRjb25zdCBGaWx0ZXJGaWVsZDogRmlsdGVyRmllbGQgfCB1bmRlZmluZWQgPSBfZ2V0RmlsdGVyRmllbGQoZmlsdGVyRmllbGRzLCBQcm9wZXJ0eVBhdGgsIGNvbnZlcnRlckNvbnRleHQsIGVudGl0eVR5cGUpO1xuXHRcdFx0XHRcdGlmIChGaWx0ZXJGaWVsZCkge1xuXHRcdFx0XHRcdFx0c2VsZWN0aW9uRmllbGRzLnB1c2goRmlsdGVyRmllbGQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cdHJldHVybiBzZWxlY3Rpb25GaWVsZHM7XG59O1xuXG4vKipcbiAqIEdldCBhbGwgUGFyYW1ldGVyIGZpbHRlckZpZWxkcyBpbiBjYXNlIG9mIGEgcGFyYW1ldGVyaXplZCBzZXJ2aWNlLlxuICogQHBhcmFtIHtDb252ZXJ0ZXJDb250ZXh0fSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcmV0dXJucyB7RmlsdGVyRmllbGRbXX0gQW4gYXJyYXkgb2YgcGFyYW1ldGVyIGZpbHRlcmZpZWxkc1xuICovXG5mdW5jdGlvbiBfZ2V0UGFyYW1ldGVyRmllbGRzKGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQpOiBGaWx0ZXJGaWVsZFtdIHtcblx0Y29uc3QgZGF0YU1vZGVsT2JqZWN0UGF0aCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpO1xuXHRjb25zdCBwYXJhbWV0ZXJFbnRpdHlUeXBlID0gZGF0YU1vZGVsT2JqZWN0UGF0aC5zdGFydGluZ0VudGl0eVNldC5lbnRpdHlUeXBlO1xuXHRjb25zdCBpc1BhcmFtZXRlcml6ZWQgPSAhIXBhcmFtZXRlckVudGl0eVR5cGUuYW5ub3RhdGlvbnM/LkNvbW1vbj8uUmVzdWx0Q29udGV4dDtcblx0Y29uc3QgcGFyYW1ldGVyQ29udmVydGVyQ29udGV4dCA9XG5cdFx0aXNQYXJhbWV0ZXJpemVkICYmIGNvbnZlcnRlckNvbnRleHQuZ2V0Q29udmVydGVyQ29udGV4dEZvcihcIi9cIiArIGRhdGFNb2RlbE9iamVjdFBhdGguc3RhcnRpbmdFbnRpdHlTZXQubmFtZSk7XG5cblx0Y29uc3QgcGFyYW1ldGVyRmllbGRzID0gKHBhcmFtZXRlckNvbnZlcnRlckNvbnRleHRcblx0XHQ/IHBhcmFtZXRlckVudGl0eVR5cGUuZW50aXR5UHJvcGVydGllcy5tYXAoZnVuY3Rpb24ocHJvcGVydHkpIHtcblx0XHRcdFx0cmV0dXJuIF9nZXRGaWx0ZXJGaWVsZCh7fSBhcyBSZWNvcmQ8c3RyaW5nLCBGaWx0ZXJGaWVsZD4sIHByb3BlcnR5Lm5hbWUsIHBhcmFtZXRlckNvbnZlcnRlckNvbnRleHQsIHBhcmFtZXRlckVudGl0eVR5cGUpO1xuXHRcdCAgfSlcblx0XHQ6IFtdKSBhcyBGaWx0ZXJGaWVsZFtdO1xuXG5cdHJldHVybiBwYXJhbWV0ZXJGaWVsZHM7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyBpZiB0aGUgRmlsdGVyQmFyIHNlYXJjaCBmaWVsZCBpcyBoaWRkZW4gb3Igbm90LlxuICpcbiAqIEBwYXJhbSB7VGFibGVWaXN1YWxpemF0aW9uW119IGxpc3RSZXBvcnRUYWJsZXMgVGhlIGxpc3QgcmVwb3J0IHRhYmxlc1xuICogQHBhcmFtIHtDb252ZXJ0ZXJDb250ZXh0fSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHJldHVybnMge2Jvb2xlYW59IFRoZSBpbmZvcm1hdGlvbiBpZiB0aGUgRmlsdGVyQmFyIHNlYXJjaCBmaWVsZCBpcyBoaWRkZW4gb3Igbm90XG4gKi9cbmV4cG9ydCBjb25zdCBnZXRGaWx0ZXJCYXJoaWRlQmFzaWNTZWFyY2ggPSBmdW5jdGlvbihsaXN0UmVwb3J0VGFibGVzOiBUYWJsZVZpc3VhbGl6YXRpb25bXSwgY29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCk6IGJvb2xlYW4ge1xuXHRpZiAoXG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXRNYW5pZmVzdFdyYXBwZXIoKS5oYXNNdWx0aXBsZVZpc3VhbGl6YXRpb25zKCkgfHxcblx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldFRlbXBsYXRlVHlwZSgpID09PSBUZW1wbGF0ZVR5cGUuQW5hbHl0aWNhbExpc3RQYWdlXG5cdCkge1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cdC8vIFRyaWVzIHRvIGZpbmQgYSBub24tYW5hbHl0aWNhbCB0YWJsZSB3aXRoIHRoZSBtYWluIGVudGl0eSBzZXQgKHBhZ2UgZW50aXR5IHNldCkgYXMgY29sbGVjdGlvblxuXHQvLyBpZiBhdCBsZWFzdCBvbmUgdGFibGUgbWF0Y2hlcyB0aGVzZSBjb25kaXRpb25zLCBiYXNpYyBzZWFyY2ggZmllbGQgbXVzdCBiZSBkaXNwbGF5ZWQuXG5cdGNvbnN0IHNDb250ZXh0UGF0aCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0Q29udGV4dFBhdGgoKTtcblx0cmV0dXJuIGNoZWNrQWxsVGFibGVGb3JFbnRpdHlTZXRBcmVBbmFseXRpY2FsKGxpc3RSZXBvcnRUYWJsZXMsIHNDb250ZXh0UGF0aCk7XG59O1xuXG4vKipcbiAqIFJldHJpZXZlcyBmaWx0ZXIgZmllbGRzIGZyb20gdGhlIG1hbmlmZXN0LlxuICpcbiAqIEBwYXJhbSBlbnRpdHlUeXBlIFRoZSBjdXJyZW50IGVudGl0eVR5cGVcbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIEN1c3RvbUVsZW1lbnRGaWx0ZXJGaWVsZD59IFRoZSBmaWx0ZXIgZmllbGRzIGRlZmluZWQgaW4gdGhlIG1hbmlmZXN0XG4gKi9cbmV4cG9ydCBjb25zdCBnZXRNYW5pZmVzdEZpbHRlckZpZWxkcyA9IGZ1bmN0aW9uKFxuXHRlbnRpdHlUeXBlOiBFbnRpdHlUeXBlLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0XG4pOiBSZWNvcmQ8c3RyaW5nLCBDdXN0b21FbGVtZW50RmlsdGVyRmllbGQ+IHtcblx0Y29uc3QgZmJDb25maWc6IEZpbHRlck1hbmlmZXN0Q29uZmlndXJhdGlvbiA9IGNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RXcmFwcGVyKCkuZ2V0RmlsdGVyQ29uZmlndXJhdGlvbigpO1xuXHRjb25zdCBkZWZpbmVkRmlsdGVyRmllbGRzOiBSZWNvcmQ8c3RyaW5nLCBGaWx0ZXJGaWVsZE1hbmlmZXN0Q29uZmlndXJhdGlvbj4gPSBmYkNvbmZpZz8uZmlsdGVyRmllbGRzIHx8IHt9O1xuXHRjb25zdCBzZWxlY3Rpb25GaWVsZHM6IFJlY29yZDxzdHJpbmcsIEZpbHRlckZpZWxkPiA9IF9nZXRTZWxlY3Rpb25GaWVsZHNCeVBhdGgoXG5cdFx0ZW50aXR5VHlwZSxcblx0XHRPYmplY3Qua2V5cyhkZWZpbmVkRmlsdGVyRmllbGRzKS5tYXAoa2V5ID0+IEtleUhlbHBlci5nZXRQYXRoRnJvbVNlbGVjdGlvbkZpZWxkS2V5KGtleSkpLFxuXHRcdHRydWUsXG5cdFx0Y29udmVydGVyQ29udGV4dFxuXHQpO1xuXHRjb25zdCBmaWx0ZXJGaWVsZHM6IFJlY29yZDxzdHJpbmcsIEN1c3RvbUVsZW1lbnRGaWx0ZXJGaWVsZD4gPSB7fTtcblxuXHRmb3IgKGNvbnN0IHNLZXkgaW4gZGVmaW5lZEZpbHRlckZpZWxkcykge1xuXHRcdGNvbnN0IGZpbHRlckZpZWxkID0gZGVmaW5lZEZpbHRlckZpZWxkc1tzS2V5XTtcblx0XHRjb25zdCBwcm9wZXJ0eU5hbWUgPSBLZXlIZWxwZXIuZ2V0UGF0aEZyb21TZWxlY3Rpb25GaWVsZEtleShzS2V5KTtcblx0XHRjb25zdCBzZWxlY3Rpb25GaWVsZCA9IHNlbGVjdGlvbkZpZWxkc1twcm9wZXJ0eU5hbWVdO1xuXHRcdGNvbnN0IHZpc3VhbEZpbHRlciA9IGdldFZpc3VhbEZpbHRlcnMoZW50aXR5VHlwZSwgY29udmVydGVyQ29udGV4dCwgc0tleSwgZGVmaW5lZEZpbHRlckZpZWxkcyk7XG5cdFx0ZmlsdGVyRmllbGRzW3NLZXldID0ge1xuXHRcdFx0a2V5OiBzS2V5LFxuXHRcdFx0YW5ub3RhdGlvblBhdGg6IHNlbGVjdGlvbkZpZWxkPy5hbm5vdGF0aW9uUGF0aCxcblx0XHRcdGNvbmRpdGlvblBhdGg6IHNlbGVjdGlvbkZpZWxkPy5jb25kaXRpb25QYXRoIHx8IHByb3BlcnR5TmFtZSxcblx0XHRcdHRlbXBsYXRlOiBmaWx0ZXJGaWVsZC50ZW1wbGF0ZSxcblx0XHRcdGxhYmVsOiBmaWx0ZXJGaWVsZC5sYWJlbCxcblx0XHRcdHBvc2l0aW9uOiBmaWx0ZXJGaWVsZC5wb3NpdGlvbiB8fCB7IHBsYWNlbWVudDogUGxhY2VtZW50LkFmdGVyIH0sXG5cdFx0XHRhdmFpbGFiaWxpdHk6IGZpbHRlckZpZWxkLmF2YWlsYWJpbGl0eSB8fCBBdmFpbGFiaWxpdHlUeXBlLkRlZmF1bHQsXG5cdFx0XHRzZXR0aW5nczogZmlsdGVyRmllbGQuc2V0dGluZ3MsXG5cdFx0XHR2aXN1YWxGaWx0ZXI6IHZpc3VhbEZpbHRlclxuXHRcdH07XG5cdH1cblx0cmV0dXJuIGZpbHRlckZpZWxkcztcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRGaWx0ZXJGaWVsZCA9IGZ1bmN0aW9uKHByb3BlcnR5UGF0aDogc3RyaW5nLCBjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LCBlbnRpdHlUeXBlOiBFbnRpdHlUeXBlKSB7XG5cdHJldHVybiBfZ2V0RmlsdGVyRmllbGQoe30sIHByb3BlcnR5UGF0aCwgY29udmVydGVyQ29udGV4dCwgZW50aXR5VHlwZSk7XG59O1xuXG4vKipcbiAqIFJldHJpZXZlIHRoZSBjb25maWd1cmF0aW9uIGZvciB0aGUgc2VsZWN0aW9uIGZpZWxkcyB0aGF0IHdpbGwgYmUgdXNlZCB3aXRoaW4gdGhlIGZpbHRlciBiYXJcbiAqIFRoaXMgY29uZmlndXJhdGlvbiB0YWtlcyBpbnRvIGFjY291bnQgYW5ub3RhdGlvbiBhbmQgdGhlIHNlbGVjdGlvbiB2YXJpYW50cy5cbiAqXG4gKiBAcGFyYW0ge0NvbnZlcnRlckNvbnRleHR9IGNvbnZlcnRlckNvbnRleHRcbiAqIEBwYXJhbSB7VGFibGVWaXN1YWxpemF0aW9uW119IGxyVGFibGVzXG4gKiBAcGFyYW0ge3N0cmluZ30gYW5ub3RhdGlvblBhdGhcbiAqIEByZXR1cm5zIHtGaWx0ZXJTZWxlY3Rpb25GaWVsZFtdfSBBbiBhcnJheSBvZiBzZWxlY3Rpb24gZmllbGRzXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRTZWxlY3Rpb25GaWVsZHMgPSBmdW5jdGlvbihcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCxcblx0bHJUYWJsZXM6IFRhYmxlVmlzdWFsaXphdGlvbltdID0gW10sXG5cdGFubm90YXRpb25QYXRoOiBzdHJpbmcgPSBcIlwiXG4pOiBGaWx0ZXJGaWVsZFtdIHtcblx0Ly8gRmV0Y2ggYWxsIHNlbGVjdGlvblZhcmlhbnRzIGRlZmluZWQgaW4gdGhlIGRpZmZlcmVudCB2aXN1YWxpemF0aW9ucyBhbmQgZGlmZmVyZW50IHZpZXdzIChtdWx0aSB0YWJsZSBtb2RlKVxuXHRjb25zdCBzZWxlY3Rpb25WYXJpYW50czogU2VsZWN0aW9uVmFyaWFudENvbmZpZ3VyYXRpb25bXSA9IGdldFNlbGVjdGlvblZhcmlhbnRzKGxyVGFibGVzLCBjb252ZXJ0ZXJDb250ZXh0KTtcblxuXHQvLyBjcmVhdGUgYSBtYXAgb2YgcHJvcGVydGllcyB0byBiZSB1c2VkIGluIHNlbGVjdGlvbiB2YXJpYW50c1xuXHRjb25zdCBleGNsdWRlZEZpbHRlclByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+ID0gZ2V0RXhjbHVkZWRGaWx0ZXJQcm9wZXJ0aWVzKHNlbGVjdGlvblZhcmlhbnRzKTtcblx0Y29uc3QgZW50aXR5VHlwZSA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5VHlwZSgpO1xuXHRjb25zdCBmaWx0ZXJGYWNldHMgPSBlbnRpdHlUeXBlLmFubm90YXRpb25zLlVJPy5GaWx0ZXJGYWNldHM7XG5cdGxldCBmaWx0ZXJGYWNldE1hcDogUmVjb3JkPHN0cmluZywgRmlsdGVyR3JvdXA+ID0ge307XG5cblx0Y29uc3QgYUZpZWxkR3JvdXBzID0gY29udmVydGVyQ29udGV4dC5nZXRBbm5vdGF0aW9uc0J5VGVybShcIlVJXCIsIFVJQW5ub3RhdGlvblRlcm1zLkZpZWxkR3JvdXApO1xuXG5cdGlmIChmaWx0ZXJGYWNldHMgPT09IHVuZGVmaW5lZCB8fCBmaWx0ZXJGYWNldHMubGVuZ3RoIDwgMCkge1xuXHRcdGZvciAoY29uc3QgaSBpbiBhRmllbGRHcm91cHMpIHtcblx0XHRcdGZpbHRlckZhY2V0TWFwID0ge1xuXHRcdFx0XHQuLi5maWx0ZXJGYWNldE1hcCxcblx0XHRcdFx0Li4uZ2V0RmllbGRHcm91cEZpbHRlckdyb3VwcyhhRmllbGRHcm91cHNbaV0gYXMgQW5ub3RhdGlvblRlcm08RmllbGRHcm91cFR5cGU+KVxuXHRcdFx0fTtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0ZmlsdGVyRmFjZXRNYXAgPSBmaWx0ZXJGYWNldHMucmVkdWNlKChwcmV2aW91c1ZhbHVlOiBSZWNvcmQ8c3RyaW5nLCBGaWx0ZXJHcm91cD4sIGZpbHRlckZhY2V0OiBSZWZlcmVuY2VGYWNldFR5cGVzKSA9PiB7XG5cdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IChmaWx0ZXJGYWNldC5UYXJnZXQuJHRhcmdldCBhcyBGaWVsZEdyb3VwKS5EYXRhLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdHByZXZpb3VzVmFsdWVbKChmaWx0ZXJGYWNldC5UYXJnZXQuJHRhcmdldCBhcyBGaWVsZEdyb3VwKS5EYXRhW2ldIGFzIERhdGFGaWVsZFR5cGVzKS5WYWx1ZS5wYXRoXSA9IHtcblx0XHRcdFx0XHRncm91cDogZmlsdGVyRmFjZXQ/LklEPy50b1N0cmluZygpLFxuXHRcdFx0XHRcdGdyb3VwTGFiZWw6IGZpbHRlckZhY2V0Py5MYWJlbD8udG9TdHJpbmcoKVxuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHByZXZpb3VzVmFsdWU7XG5cdFx0fSwge30pO1xuXHR9XG5cblx0bGV0IGFTZWxlY3RPcHRpb25zOiBhbnlbXSA9IFtdO1xuXHRjb25zdCBzZWxlY3Rpb25WYXJpYW50ID0gZ2V0U2VsZWN0aW9uVmFyaWFudChlbnRpdHlUeXBlLCBjb252ZXJ0ZXJDb250ZXh0KTtcblx0aWYgKHNlbGVjdGlvblZhcmlhbnQpIHtcblx0XHRhU2VsZWN0T3B0aW9ucyA9IHNlbGVjdGlvblZhcmlhbnQuU2VsZWN0T3B0aW9ucztcblx0fVxuXG5cdC8vIGNyZWF0ZSBhIG1hcCBvZiBhbGwgcG90ZW50aWFsIGZpbHRlciBmaWVsZHMgYmFzZWQgb24uLi5cblx0Y29uc3QgZmlsdGVyRmllbGRzOiBSZWNvcmQ8c3RyaW5nLCBGaWx0ZXJGaWVsZD4gPSB7XG5cdFx0Ly8gLi4ubm9uIGhpZGRlbiBwcm9wZXJ0aWVzIG9mIHRoZSBlbnRpdHlcblx0XHQuLi5fZ2V0U2VsZWN0aW9uRmllbGRzKGVudGl0eVR5cGUsIFwiXCIsIGVudGl0eVR5cGUuZW50aXR5UHJvcGVydGllcywgZmFsc2UsIGNvbnZlcnRlckNvbnRleHQpLFxuXHRcdC8vIC4uLmFkZGl0aW9uYWwgbWFuaWZlc3QgZGVmaW5lZCBuYXZpZ2F0aW9uIHByb3BlcnRpZXNcblx0XHQuLi5fZ2V0U2VsZWN0aW9uRmllbGRzQnlQYXRoKFxuXHRcdFx0ZW50aXR5VHlwZSxcblx0XHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RXcmFwcGVyKCkuZ2V0RmlsdGVyQ29uZmlndXJhdGlvbigpLm5hdmlnYXRpb25Qcm9wZXJ0aWVzLFxuXHRcdFx0ZmFsc2UsXG5cdFx0XHRjb252ZXJ0ZXJDb250ZXh0XG5cdFx0KVxuXHR9O1xuXG5cdC8vRmlsdGVycyB3aGljaCBoYXMgdG8gYmUgYWRkZWQgd2hpY2ggaXMgcGFydCBvZiBTVi9EZWZhdWx0IGFubm90YXRpb25zIGJ1dCBub3QgcHJlc2VudCBpbiB0aGUgU2VsZWN0aW9uRmllbGRzXG5cdGNvbnN0IGFubm90YXRlZFNlbGVjdGlvbkZpZWxkcyA9ICgoYW5ub3RhdGlvblBhdGggJiYgY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlUeXBlQW5ub3RhdGlvbihhbm5vdGF0aW9uUGF0aCk/LmFubm90YXRpb24pIHx8XG5cdFx0ZW50aXR5VHlwZS5hbm5vdGF0aW9ucz8uVUk/LlNlbGVjdGlvbkZpZWxkcyB8fFxuXHRcdFtdKSBhcyBQcm9wZXJ0eVBhdGhbXTtcblx0Y29uc3QgZGVmYXVsdEZpbHRlcnMgPSBfZ2V0RGVmYXVsdEZpbHRlckZpZWxkcyhcblx0XHRmaWx0ZXJGaWVsZHMsXG5cdFx0YVNlbGVjdE9wdGlvbnMsXG5cdFx0ZW50aXR5VHlwZSxcblx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdGV4Y2x1ZGVkRmlsdGVyUHJvcGVydGllcyxcblx0XHRhbm5vdGF0ZWRTZWxlY3Rpb25GaWVsZHNcblx0KTtcblx0Y29uc3QgcGFyYW1ldGVyRmllbGRzID0gX2dldFBhcmFtZXRlckZpZWxkcyhjb252ZXJ0ZXJDb250ZXh0KTtcblxuXHQvLyBmaW5hbGx5IGNyZWF0ZSBmaW5hbCBsaXN0IG9mIGZpbHRlciBmaWVsZHMgYnkgYWRkaW5nIHRoZSBTZWxlY3Rpb25GaWVsZHMgZmlyc3QgKG9yZGVyIG1hdHRlcnMpLi4uXG5cdGxldCBhbGxGaWx0ZXJzID0gcGFyYW1ldGVyRmllbGRzXG5cdFx0LmNvbmNhdChcblx0XHRcdGFubm90YXRlZFNlbGVjdGlvbkZpZWxkcz8ucmVkdWNlKChzZWxlY3Rpb25GaWVsZHM6IEZpbHRlckZpZWxkW10sIHNlbGVjdGlvbkZpZWxkKSA9PiB7XG5cdFx0XHRcdGNvbnN0IHByb3BlcnR5UGF0aCA9IHNlbGVjdGlvbkZpZWxkLnZhbHVlO1xuXHRcdFx0XHRpZiAoIShwcm9wZXJ0eVBhdGggaW4gZXhjbHVkZWRGaWx0ZXJQcm9wZXJ0aWVzKSkge1xuXHRcdFx0XHRcdGNvbnN0IGZpbHRlckZpZWxkOiBGaWx0ZXJGaWVsZCB8IHVuZGVmaW5lZCA9IF9nZXRGaWx0ZXJGaWVsZChmaWx0ZXJGaWVsZHMsIHByb3BlcnR5UGF0aCwgY29udmVydGVyQ29udGV4dCwgZW50aXR5VHlwZSk7XG5cdFx0XHRcdFx0aWYgKGZpbHRlckZpZWxkKSB7XG5cdFx0XHRcdFx0XHRmaWx0ZXJGaWVsZC5ncm91cCA9IFwiXCI7XG5cdFx0XHRcdFx0XHRmaWx0ZXJGaWVsZC5ncm91cExhYmVsID0gXCJcIjtcblx0XHRcdFx0XHRcdHNlbGVjdGlvbkZpZWxkcy5wdXNoKGZpbHRlckZpZWxkKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHNlbGVjdGlvbkZpZWxkcztcblx0XHRcdH0sIFtdKSB8fCBbXVxuXHRcdClcblx0XHQvLyBUbyBhZGQgdGhlIEZpbHRlckZpZWxkIHdoaWNoIGlzIG5vdCBwYXJ0IG9mIHRoZSBTZWxlY3Rpb24gRmllbGRzIGJ1dCB0aGUgcHJvcGVydHkgaXMgbWVudGlvbmVkIGluIHRoZSBTZWxlY3Rpb24gVmFyaWFudFxuXHRcdC5jb25jYXQoZGVmYXVsdEZpbHRlcnMgfHwgW10pXG5cdFx0Ly8gLi4uYW5kIGFkZGluZyByZW1haW5pbmcgZmlsdGVyIGZpZWxkcywgdGhhdCBhcmUgbm90IHVzZWQgaW4gYSBTZWxlY3Rpb25WYXJpYW50IChvcmRlciBkb2Vzbid0IG1hdHRlcilcblx0XHQuY29uY2F0KFxuXHRcdFx0T2JqZWN0LmtleXMoZmlsdGVyRmllbGRzKVxuXHRcdFx0XHQuZmlsdGVyKHByb3BlcnR5UGF0aCA9PiAhKHByb3BlcnR5UGF0aCBpbiBleGNsdWRlZEZpbHRlclByb3BlcnRpZXMpKVxuXHRcdFx0XHQubWFwKHByb3BlcnR5UGF0aCA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuIE9iamVjdC5hc3NpZ24oZmlsdGVyRmllbGRzW3Byb3BlcnR5UGF0aF0sIGZpbHRlckZhY2V0TWFwW3Byb3BlcnR5UGF0aF0pO1xuXHRcdFx0XHR9KVxuXHRcdCk7XG5cdGNvbnN0IHNDb250ZXh0UGF0aCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0Q29udGV4dFBhdGgoKTtcblxuXHQvL2lmIGFsbCB0YWJsZXMgYXJlIGFuYWx5dGljYWwgdGFibGVzIFwiYWdncmVnYXRhYmxlXCIgcHJvcGVydGllcyBtdXN0IGJlIGV4Y2x1ZGVkXG5cdGlmIChjaGVja0FsbFRhYmxlRm9yRW50aXR5U2V0QXJlQW5hbHl0aWNhbChsclRhYmxlcywgc0NvbnRleHRQYXRoKSkge1xuXHRcdC8vIEN1cnJlbnRseSBhbGwgYWdyZWdhdGVzIGFyZSByb290IGVudGl0eSBwcm9wZXJ0aWVzIChubyBwcm9wZXJ0aWVzIGNvbWluZyBmcm9tIG5hdmlnYXRpb24pIGFuZCBhbGxcblx0XHQvLyB0YWJsZXMgd2l0aCBzYW1lIGVudGl0eVNldCBnZXRzIHNhbWUgYWdncmVhZ3RlIGNvbmZpZ3VyYXRpb24gdGhhdCdzIHdoeSB3ZSBjYW4gdXNlIGZpcnN0IHRhYmxlIGludG9cblx0XHQvLyBMUiB0byBnZXQgYWdncmVnYXRlcyAod2l0aG91dCBjdXJyZW5jeS91bml0IHByb3BlcnRpZXMgc2luY2Ugd2UgZXhwZWN0IHRvIGJlIGFibGUgdG8gZmlsdGVyIHRoZW0pLlxuXHRcdGNvbnN0IGFnZ3JlZ2F0ZXMgPSBsclRhYmxlc1swXS5hZ2dyZWdhdGVzO1xuXHRcdGlmIChhZ2dyZWdhdGVzKSB7XG5cdFx0XHRjb25zdCBhZ2dyZWdhdGFibGVQcm9wZXJ0aWVzOiBzdHJpbmdbXSA9IE9iamVjdC5rZXlzKGFnZ3JlZ2F0ZXMpLm1hcChhZ2dyZWdhdGVLZXkgPT4gYWdncmVnYXRlc1thZ2dyZWdhdGVLZXldLnJlbGF0aXZlUGF0aCk7XG5cdFx0XHRhbGxGaWx0ZXJzID0gYWxsRmlsdGVycy5maWx0ZXIoZmlsdGVyRmllbGQgPT4ge1xuXHRcdFx0XHRyZXR1cm4gYWdncmVnYXRhYmxlUHJvcGVydGllcy5pbmRleE9mKGZpbHRlckZpZWxkLmtleSkgPT09IC0xO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHR9XG5cblx0Y29uc3Qgc2VsZWN0aW9uRmllbGRzID0gaW5zZXJ0Q3VzdG9tRWxlbWVudHMoYWxsRmlsdGVycywgZ2V0TWFuaWZlc3RGaWx0ZXJGaWVsZHMoZW50aXR5VHlwZSwgY29udmVydGVyQ29udGV4dCksIHtcblx0XHRcImF2YWlsYWJpbGl0eVwiOiBcIm92ZXJ3cml0ZVwiLFxuXHRcdGxhYmVsOiBcIm92ZXJ3cml0ZVwiLFxuXHRcdHBvc2l0aW9uOiBcIm92ZXJ3cml0ZVwiLFxuXHRcdHRlbXBsYXRlOiBcIm92ZXJ3cml0ZVwiLFxuXHRcdHNldHRpbmdzOiBcIm92ZXJ3cml0ZVwiLFxuXHRcdHZpc3VhbEZpbHRlcjogXCJvdmVyd3JpdGVcIlxuXHR9KTtcblxuXHQvLyBBZGQgY2FzZVNlbnNpdGl2ZSBwcm9wZXJ0eSB0byBhbGwgc2VsZWN0aW9uIGZpZWxkcy5cblx0Y29uc3QgaXNDYXNlU2Vuc2l0aXZlID0gaXNGaWx0ZXJpbmdDYXNlU2Vuc2l0aXZlKGNvbnZlcnRlckNvbnRleHQpO1xuXHRzZWxlY3Rpb25GaWVsZHMuZm9yRWFjaChmaWx0ZXJGaWVsZCA9PiB7XG5cdFx0ZmlsdGVyRmllbGQuY2FzZVNlbnNpdGl2ZSA9IGlzQ2FzZVNlbnNpdGl2ZTtcblx0fSk7XG5cblx0cmV0dXJuIHNlbGVjdGlvbkZpZWxkcztcbn07XG4iXX0=
893
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkZpbHRlckJhci50cyJdLCJuYW1lcyI6WyJmaWx0ZXJGaWVsZFR5cGUiLCJzRWRtU3RyaW5nIiwic1N0cmluZ0RhdGFUeXBlIiwiZ2V0RmllbGRHcm91cEZpbHRlckdyb3VwcyIsImZpZWxkR3JvdXAiLCJmaWx0ZXJGYWNldE1hcCIsIkRhdGEiLCJmb3JFYWNoIiwiZGF0YUZpZWxkIiwiJFR5cGUiLCJWYWx1ZSIsInBhdGgiLCJncm91cCIsImZ1bGx5UXVhbGlmaWVkTmFtZSIsImdyb3VwTGFiZWwiLCJjb21waWxlQmluZGluZyIsImFubm90YXRpb25FeHByZXNzaW9uIiwiTGFiZWwiLCJhbm5vdGF0aW9ucyIsIkNvbW1vbiIsInF1YWxpZmllciIsImdldEV4Y2x1ZGVkRmlsdGVyUHJvcGVydGllcyIsInNlbGVjdGlvblZhcmlhbnRzIiwicmVkdWNlIiwicHJldmlvdXNWYWx1ZSIsInNlbGVjdGlvblZhcmlhbnQiLCJwcm9wZXJ0eU5hbWVzIiwicHJvcGVydHlOYW1lIiwiY2hlY2tBbGxUYWJsZUZvckVudGl0eVNldEFyZUFuYWx5dGljYWwiLCJsaXN0UmVwb3J0VGFibGVzIiwiY29udGV4dFBhdGgiLCJsZW5ndGgiLCJldmVyeSIsInZpc3VhbGl6YXRpb24iLCJlbmFibGVBbmFseXRpY3MiLCJhbm5vdGF0aW9uIiwiY29sbGVjdGlvbiIsImdldFNlbGVjdGlvblZhcmlhbnRzIiwibHJUYWJsZVZpc3VhbGl6YXRpb25zIiwiY29udmVydGVyQ29udGV4dCIsInNlbGVjdGlvblZhcmlhbnRQYXRocyIsIm1hcCIsInRhYmxlRmlsdGVycyIsImNvbnRyb2wiLCJmaWx0ZXJzIiwidGFibGVTVkNvbmZpZ3MiLCJrZXkiLCJBcnJheSIsImlzQXJyYXkiLCJwYXRocyIsImFubm90YXRpb25QYXRoIiwiaW5kZXhPZiIsInB1c2giLCJzZWxlY3Rpb25WYXJpYW50Q29uZmlnIiwiZ2V0U2VsZWN0aW9uVmFyaWFudENvbmZpZ3VyYXRpb24iLCJzdkNvbmZpZ3MiLCJjb25jYXQiLCJfZ2V0Q29uZGl0aW9uUGF0aCIsImVudGl0eVR5cGUiLCJwcm9wZXJ0eVBhdGgiLCJwYXJ0cyIsInNwbGl0IiwicGFydGlhbFBhdGgiLCJwYXJ0Iiwic2hpZnQiLCJwcm9wZXJ0eSIsInJlc29sdmVQYXRoIiwiX3R5cGUiLCJpc0NvbGxlY3Rpb24iLCJfY3JlYXRlRmlsdGVyU2VsZWN0aW9uRmllbGQiLCJmdWxsUHJvcGVydHlQYXRoIiwiaW5jbHVkZUhpZGRlbiIsInVuZGVmaW5lZCIsInRhcmdldFR5cGUiLCJVSSIsIkhpZGRlbiIsInZhbHVlT2YiLCJ0YXJnZXRFbnRpdHlUeXBlIiwiZ2V0QW5ub3RhdGlvbkVudGl0eVR5cGUiLCJLZXlIZWxwZXIiLCJnZXRTZWxlY3Rpb25GaWVsZEtleUZyb21QYXRoIiwiZ2V0QWJzb2x1dGVBbm5vdGF0aW9uUGF0aCIsImNvbmRpdGlvblBhdGgiLCJhdmFpbGFiaWxpdHkiLCJIaWRkZW5GaWx0ZXIiLCJBdmFpbGFiaWxpdHlUeXBlIiwiQWRhcHRhdGlvbiIsImxhYmVsIiwibmFtZSIsImdldE1vZGVsVHlwZSIsInNUeXBlIiwibURlZmF1bHRUeXBlRm9yRWRtVHlwZSIsIm1vZGVsVHlwZSIsIl9nZXRTZWxlY3Rpb25GaWVsZHMiLCJuYXZpZ2F0aW9uUGF0aCIsInByb3BlcnRpZXMiLCJzZWxlY3Rpb25GaWVsZE1hcCIsImZ1bGxQYXRoIiwic2VsZWN0aW9uRmllbGQiLCJfZ2V0U2VsZWN0aW9uRmllbGRzQnlQYXRoIiwicHJvcGVydHlQYXRocyIsInNlbGVjdGlvbkZpZWxkcyIsImxvY2FsU2VsZWN0aW9uRmllbGRzIiwiZW50aXR5UHJvcGVydGllcyIsImluY2x1ZGVzIiwic3BsaWNlIiwiam9pbiIsIl9nZXRGaWx0ZXJGaWVsZCIsImZpbHRlckZpZWxkcyIsImZpbHRlckZpZWxkIiwiZ2V0RGlhZ25vc3RpY3MiLCJhZGRJc3N1ZSIsIklzc3VlQ2F0ZWdvcnkiLCJBbm5vdGF0aW9uIiwiSXNzdWVTZXZlcml0eSIsIkhpZ2giLCJJc3N1ZVR5cGUiLCJNSVNTSU5HX1NFTEVDVElPTkZJRUxEIiwiRGVmYXVsdCIsImlzUGFyYW1ldGVyIiwiUmVzdWx0Q29udGV4dCIsIl9nZXREZWZhdWx0RmlsdGVyRmllbGRzIiwiYVNlbGVjdE9wdGlvbnMiLCJleGNsdWRlZEZpbHRlclByb3BlcnRpZXMiLCJhbm5vdGF0ZWRTZWxlY3Rpb25GaWVsZHMiLCJVSVNlbGVjdGlvbkZpZWxkcyIsIlNlbGVjdGlvbkZpZWxkIiwidmFsdWUiLCJzZWxlY3RPcHRpb24iLCJQcm9wZXJ0eU5hbWUiLCJzUHJvcGVydHlQYXRoIiwiRmlsdGVyRmllbGQiLCJkZWZhdWx0RmlsdGVyVmFsdWUiLCJGaWx0ZXJEZWZhdWx0VmFsdWUiLCJQcm9wZXJ0eVBhdGgiLCJfZ2V0UGFyYW1ldGVyRmllbGRzIiwiZGF0YU1vZGVsT2JqZWN0UGF0aCIsImdldERhdGFNb2RlbE9iamVjdFBhdGgiLCJwYXJhbWV0ZXJFbnRpdHlUeXBlIiwic3RhcnRpbmdFbnRpdHlTZXQiLCJpc1BhcmFtZXRlcml6ZWQiLCJwYXJhbWV0ZXJDb252ZXJ0ZXJDb250ZXh0IiwiZ2V0Q29udmVydGVyQ29udGV4dEZvciIsInBhcmFtZXRlckZpZWxkcyIsImdldEZpbHRlckJhcmhpZGVCYXNpY1NlYXJjaCIsImNoYXJ0cyIsIm5vU2VhcmNoSW5DaGFydHMiLCJjaGFydCIsImFwcGx5U3VwcG9ydGVkIiwiZW5hYmxlU2VhcmNoIiwibm9TZWFyY2hJblRhYmxlcyIsInRhYmxlIiwiZW5hYmxlQW5hbHl0aWNzU2VhcmNoIiwiZ2V0Q29udGV4dFBhdGgiLCJnZXRNYW5pZmVzdEZpbHRlckZpZWxkcyIsImZiQ29uZmlnIiwiZ2V0TWFuaWZlc3RXcmFwcGVyIiwiZ2V0RmlsdGVyQ29uZmlndXJhdGlvbiIsImRlZmluZWRGaWx0ZXJGaWVsZHMiLCJPYmplY3QiLCJrZXlzIiwiZ2V0UGF0aEZyb21TZWxlY3Rpb25GaWVsZEtleSIsInNLZXkiLCJ0eXBlIiwiU2xvdCIsInZpc3VhbEZpbHRlciIsImdldFZpc3VhbEZpbHRlcnMiLCJ0ZW1wbGF0ZSIsInBvc2l0aW9uIiwicGxhY2VtZW50IiwiUGxhY2VtZW50IiwiQWZ0ZXIiLCJzZXR0aW5ncyIsImdldEZpbHRlckZpZWxkIiwiZ2V0RmlsdGVyUmVzdHJpY3Rpb25zIiwib0ZpbHRlclJlc3RyaWN0aW9uc0Fubm90YXRpb24iLCJzUmVzdHJpY3Rpb24iLCJhUHJvcHMiLCJvUHJvcGVydHkiLCIkUHJvcGVydHlQYXRoIiwibUFsbG93ZWRFeHByZXNzaW9ucyIsIkZpbHRlckV4cHJlc3Npb25SZXN0cmljdGlvbnMiLCJQcm9wZXJ0eSIsIkFsbG93ZWRFeHByZXNzaW9ucyIsImdldFNlYXJjaEZpbHRlclByb3BlcnR5SW5mbyIsImRhdGFUeXBlIiwibWF4Q29uZGl0aW9ucyIsImdldEVkaXRTdGF0ZUZpbHRlclByb3BlcnR5SW5mbyIsImhpZGRlbkZpbHRlciIsImdldFNlYXJjaFJlc3RyaWN0aW9ucyIsImdldEVudGl0eVNldCIsIkNhcGFiaWxpdGllcyIsIlNlYXJjaFJlc3RyaWN0aW9ucyIsImdldE5hdmlnYXRpb25SZXN0cmljdGlvbnMiLCJzTmF2aWdhdGlvblBhdGgiLCJvTmF2aWdhdGlvblJlc3RyaWN0aW9ucyIsIk5hdmlnYXRpb25SZXN0cmljdGlvbnMiLCJhUmVzdHJpY3RlZFByb3BlcnRpZXMiLCJSZXN0cmljdGVkUHJvcGVydGllcyIsImZpbmQiLCJvUmVzdHJpY3RlZFByb3BlcnR5IiwiTmF2aWdhdGlvblByb3BlcnR5IiwiJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgiLCJfZmV0Y2hCYXNpY1Byb3BlcnR5SW5mbyIsIm9GaWx0ZXJGaWVsZEluZm8iLCJkaXNwbGF5IiwiY2FzZVNlbnNpdGl2ZSIsIm1lbnUiLCJnZXRTcGVjaWZpY0FsbG93ZWRFeHByZXNzaW9uIiwiYUV4cHJlc3Npb25zIiwiYUFsbG93ZWRFeHByZXNzaW9uc1ByaW9yaXR5Iiwic29ydCIsImEiLCJiIiwiZGlzcGxheU1vZGUiLCJvUHJvcGVydHlBbm5vdGF0aW9ucyIsIm9Db2xsZWN0aW9uQW5ub3RhdGlvbnMiLCJvVGV4dEFubm90YXRpb24iLCJUZXh0Iiwib1RleHRBcnJhbmdtZW50QW5ub3RhdGlvbiIsIlRleHRBcnJhbmdlbWVudCIsIl9mZXRjaFByb3BlcnR5SW5mbyIsIm9UeXBlQ29uZmlnIiwib1Byb3BlcnR5SW5mbyIsInNBbm5vdGF0aW9uUGF0aCIsInRhcmdldFByb3BlcnR5T2JqZWN0IiwidGFyZ2V0T2JqZWN0Iiwib0Zvcm1hdE9wdGlvbnMiLCJmb3JtYXRPcHRpb25zIiwib0NvbnN0cmFpbnRzIiwiY29uc3RyYWludHMiLCJhc3NpZ24iLCJpc011bHRpVmFsdWUiLCJiSXNNdWx0aVZhbHVlIiwiZmlsdGVyRXhwcmVzc2lvbiIsImdldEFubm90YXRlZFNlbGVjdGlvbkZpZWxkRGF0YSIsImxyVGFibGVzIiwiZ2V0RW50aXR5VHlwZSIsImdldEVudGl0eVR5cGVBbm5vdGF0aW9uIiwiU2VsZWN0aW9uRmllbGRzIiwibmF2aWdhdGlvblByb3BlcnRpZXMiLCJwcm9wZXJ0eUluZm9GaWVsZHMiLCJwcm9jZXNzU2VsZWN0aW9uRmllbGRzIiwiYVR5cGVDb25maWciLCJzZWxlY3Rpb25GaWVsZFR5cGVzIiwiX2ZuVHlwZUNvbmZpZyIsImdldFR5cGVDb25maWciLCJudWxsYWJsZSIsInBhcnNlS2VlcHNFbXB0eVN0cmluZyIsInBhcmFtZXRlckZpZWxkIiwicHJvcGVydHlDb252ZXJ0eUNvbnRleHQiLCJwcm9wZXJ0eVRhcmdldE9iamVjdCIsIm9GaWx0ZXJSZXN0cmljdGlvbnMiLCJGaWx0ZXJSZXN0cmljdGlvbnMiLCJvUmV0Iiwic0VudGl0eVNldFBhdGgiLCJhUGF0aFBhcnRzIiwib05hdmlnYXRpb25GaWx0ZXJSZXN0cmljdGlvbnMiLCJSZXF1aXJlZFByb3BlcnRpZXMiLCJOb25GaWx0ZXJhYmxlUHJvcGVydGllcyIsIkZpbHRlckFsbG93ZWRFeHByZXNzaW9ucyIsImlzQ2FzZVNlbnNpdGl2ZSIsImlzRmlsdGVyaW5nQ2FzZVNlbnNpdGl2ZSIsImFSZXF1aXJlZFByb3BzIiwiYU5vbkZpbHRlcmFibGVQcm9wcyIsImFGZXRjaGVkUHJvcGVydGllcyIsInNGaWx0ZXJGaWVsZEtleSIsIm9Db252ZXJ0ZWRQcm9wZXJ0eSIsInJlcGxhY2UiLCJyZXF1aXJlZCIsIkRyYWZ0Um9vdCIsInNlYXJjaFJlc3RyaWN0aW9ucyIsImhpZGVCYXNpY1NlYXJjaCIsIkJvb2xlYW4iLCJTZWFyY2hhYmxlIiwiaW5zZXJ0Q3VzdG9tTWFuaWZlc3RFbGVtZW50cyIsImluc2VydEN1c3RvbUVsZW1lbnRzIiwiZ2V0U2VsZWN0aW9uRmllbGRzIiwib0Fubm90YXRlZFNlbGVjdGlvbkZpZWxkRGF0YSIsIkpTT04iLCJwYXJzZSIsInN0cmluZ2lmeSIsImxvY2FsZUNvbXBhcmUiLCJzRmV0Y2hQcm9wZXJ0aWVzIiwic1Byb3BlcnR5SW5mbyIsInByb3BTZWxlY3Rpb25GaWVsZHMiLCJmaWx0ZXJGYWNldHMiLCJGaWx0ZXJGYWNldHMiLCJhRmllbGRHcm91cHMiLCJnZXRBbm5vdGF0aW9uc0J5VGVybSIsImkiLCJmaWx0ZXJGYWNldCIsIlRhcmdldCIsIiR0YXJnZXQiLCJJRCIsInRvU3RyaW5nIiwiZ2V0U2VsZWN0aW9uVmFyaWFudCIsIlNlbGVjdE9wdGlvbnMiLCJkZWZhdWx0RmlsdGVycyIsImFsbEZpbHRlcnMiLCJmaWx0ZXIiLCJzQ29udGV4dFBhdGgiLCJhZ2dyZWdhdGVzIiwiYWdncmVnYXRhYmxlUHJvcGVydGllcyIsImFnZ3JlZ2F0ZUtleSIsInJlbGF0aXZlUGF0aCJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7TUF3Q0tBLGU7O2FBQUFBLGU7QUFBQUEsSUFBQUEsZTtBQUFBQSxJQUFBQSxlO0tBQUFBLGUsS0FBQUEsZTs7QUFLTCxNQUFNQyxVQUFVLEdBQUcsWUFBbkI7QUFDQSxNQUFNQyxlQUFlLEdBQUcsZ0NBQXhCOztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVNDLHlCQUFULENBQW1DQyxVQUFuQyxFQUE0RztBQUMzRyxR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QjBELFdBQVcsQ0FBQy9ELEdBQTNDLE1BQW9ELENBQUMsQ0FBNUQ7QUFDQSxTQUZZLENBQWI7QUFHQTtBQUNEOztBQUVELFFBQU11RCxlQUFlLEdBQUc4Syw0QkFBNEIsQ0FBQ3dCLFVBQUQsRUFBYWpQLFVBQWIsRUFBeUJuQixnQkFBekIsQ0FBcEQsQ0F4R00sQ0EwR047O0FBQ0EsUUFBTThOLGVBQWUsR0FBR0Msd0JBQXdCLENBQUMvTixnQkFBRCxDQUFoRDtBQUNBOEQsSUFBQUEsZUFBZSxDQUFDOUYsT0FBaEIsQ0FBd0IsVUFBQXNHLFdBQVcsRUFBSTtBQUN0Q0EsTUFBQUEsV0FBVyxDQUFDaUcsYUFBWixHQUE0QnVELGVBQTVCO0FBQ0EsS0FGRDtBQUlBLFdBQU87QUFBRWhLLE1BQUFBLGVBQWUsRUFBZkEsZUFBRjtBQUFtQnVMLE1BQUFBLGFBQWEsRUFBYkE7QUFBbkIsS0FBUDtBQUNBLEdBckhNIiwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBdmFpbGFiaWxpdHlUeXBlLCBGaWx0ZXJGaWVsZE1hbmlmZXN0Q29uZmlndXJhdGlvbiwgRmlsdGVyTWFuaWZlc3RDb25maWd1cmF0aW9uLCBGaWx0ZXJTZXR0aW5ncyB9IGZyb20gXCIuLi8uLi9NYW5pZmVzdFNldHRpbmdzXCI7XG5pbXBvcnQgeyBFbnRpdHlUeXBlLCBOYXZpZ2F0aW9uUHJvcGVydHksIFByb3BlcnR5IH0gZnJvbSBcIkBzYXAtdXgvYW5ub3RhdGlvbi1jb252ZXJ0ZXJcIjtcbmltcG9ydCBDb252ZXJ0ZXJDb250ZXh0IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL0NvbnZlcnRlckNvbnRleHRcIjtcbmltcG9ydCB7IEFubm90YXRpb25UZXJtLCBEYXRhRmllbGRBYnN0cmFjdFR5cGVzLCBEYXRhRmllbGRUeXBlcywgUmVmZXJlbmNlRmFjZXRUeXBlcywgVUlBbm5vdGF0aW9uVGVybXMgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXNcIjtcbmltcG9ydCB7XG5cdGdldFNlbGVjdGlvblZhcmlhbnRDb25maWd1cmF0aW9uLFxuXHRTZWxlY3Rpb25WYXJpYW50Q29uZmlndXJhdGlvbixcblx0VGFibGVWaXN1YWxpemF0aW9uLFxuXHRpc0ZpbHRlcmluZ0Nhc2VTZW5zaXRpdmUsXG5cdGdldFR5cGVDb25maWdcbn0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvY29udHJvbHMvQ29tbW9uL1RhYmxlXCI7XG5pbXBvcnQgeyBDaGFydFZpc3VhbGl6YXRpb24gfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9jb250cm9scy9Db21tb24vQ2hhcnRcIjtcbmltcG9ydCB7IENvbmZpZ3VyYWJsZU9iamVjdCwgQ3VzdG9tRWxlbWVudCwgaW5zZXJ0Q3VzdG9tRWxlbWVudHMsIFBsYWNlbWVudCB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2hlbHBlcnMvQ29uZmlndXJhYmxlT2JqZWN0XCI7XG5pbXBvcnQgeyBnZXRWaXN1YWxGaWx0ZXJzLCBWaXN1YWxGaWx0ZXJzIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvY29udHJvbHMvTGlzdFJlcG9ydC9WaXN1YWxGaWx0ZXJzXCI7XG5pbXBvcnQgeyBTZWxlY3RPcHRpb25UeXBlLCBGaWVsZEdyb3VwVHlwZSwgRmllbGRHcm91cCB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy9kaXN0L2dlbmVyYXRlZC9VSVwiO1xuaW1wb3J0IHsgYW5ub3RhdGlvbkV4cHJlc3Npb24sIGNvbXBpbGVCaW5kaW5nIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvQmluZGluZ0V4cHJlc3Npb25cIjtcbmltcG9ydCB7IGdldFNlbGVjdGlvblZhcmlhbnQgfSBmcm9tIFwiLi4vQ29tbW9uL0RhdGFWaXN1YWxpemF0aW9uXCI7XG5pbXBvcnQgeyBLZXlIZWxwZXIgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9oZWxwZXJzL0tleVwiO1xuaW1wb3J0IHsgSXNzdWVUeXBlLCBJc3N1ZVNldmVyaXR5LCBJc3N1ZUNhdGVnb3J5IH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvaGVscGVycy9Jc3N1ZU1hbmFnZXJcIjtcbmltcG9ydCB7IFByb3BlcnR5UGF0aCB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy9kaXN0L0VkbVwiO1xuLy9pbXBvcnQgeyBoYXNWYWx1ZUhlbHAgfSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9Qcm9wZXJ0eUhlbHBlclwiO1xuXG5leHBvcnQgdHlwZSBGaWx0ZXJGaWVsZCA9IENvbmZpZ3VyYWJsZU9iamVjdCAmIHtcblx0dHlwZT86IHN0cmluZztcblx0Y29uZGl0aW9uUGF0aDogc3RyaW5nO1xuXHRhdmFpbGFiaWxpdHk6IEF2YWlsYWJpbGl0eVR5cGU7XG5cdGFubm90YXRpb25QYXRoOiBzdHJpbmc7XG5cdGxhYmVsPzogc3RyaW5nO1xuXHR0ZW1wbGF0ZT86IHN0cmluZztcblx0Z3JvdXA/OiBzdHJpbmc7XG5cdGdyb3VwTGFiZWw/OiBzdHJpbmc7XG5cdHNldHRpbmdzPzogRmlsdGVyU2V0dGluZ3M7XG5cdGlzUGFyYW1ldGVyPzogYm9vbGVhbjtcblx0dmlzdWFsRmlsdGVyPzogVmlzdWFsRmlsdGVycztcblx0Y2FzZVNlbnNpdGl2ZT86IGJvb2xlYW47XG59O1xuXG50eXBlIEZpbHRlckdyb3VwID0ge1xuXHRncm91cD86IHN0cmluZztcblx0Z3JvdXBMYWJlbD86IHN0cmluZztcbn07XG5cbmVudW0gZmlsdGVyRmllbGRUeXBlIHtcblx0RGVmYXVsdCA9IFwiRGVmYXVsdFwiLFxuXHRTbG90ID0gXCJTbG90XCJcbn1cblxuY29uc3Qgc0VkbVN0cmluZyA9IFwiRWRtLlN0cmluZ1wiO1xuY29uc3Qgc1N0cmluZ0RhdGFUeXBlID0gXCJzYXAudWkubW9kZWwub2RhdGEudHlwZS5TdHJpbmdcIjtcblxuZXhwb3J0IHR5cGUgQ3VzdG9tRWxlbWVudEZpbHRlckZpZWxkID0gQ3VzdG9tRWxlbWVudDxGaWx0ZXJGaWVsZD47XG5cbi8qKlxuICogRW50ZXIgYWxsIERhdGFGaWVsZHMgb2YgYSBnaXZlbiBGaWVsZEdyb3VwIGludG8gdGhlIGZpbHRlckZhY2V0TWFwLlxuICpcbiAqIEBwYXJhbSB7QW5ub3RhdGlvblRlcm08RmllbGRHcm91cFR5cGU+fSBmaWVsZEdyb3VwXG4gKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgRmlsdGVyR3JvdXA+fSBUaGUgbWFwIG9mIGZhY2V0cyBmb3IgdGhlIGdpdmVuIEZpZWxkR3JvdXBcbiAqL1xuZnVuY3Rpb24gZ2V0RmllbGRHcm91cEZpbHRlckdyb3VwcyhmaWVsZEdyb3VwOiBBbm5vdGF0aW9uVGVybTxGaWVsZEdyb3VwVHlwZT4pOiBSZWNvcmQ8c3RyaW5nLCBGaWx0ZXJHcm91cD4ge1xuXHRjb25zdCBmaWx0ZXJGYWNldE1hcDogUmVjb3JkPHN0cmluZywgRmlsdGVyR3JvdXA+ID0ge307XG5cdGZpZWxkR3JvdXAuRGF0YS5mb3JFYWNoKChkYXRhRmllbGQ6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMpID0+IHtcblx0XHRpZiAoZGF0YUZpZWxkLiRUeXBlID09PSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkRhdGFGaWVsZFwiKSB7XG5cdFx0XHRmaWx0ZXJGYWNldE1hcFtkYXRhRmllbGQuVmFsdWUucGF0aF0gPSB7XG5cdFx0XHRcdGdyb3VwOiBmaWVsZEdyb3VwLmZ1bGx5UXVhbGlmaWVkTmFtZSxcblx0XHRcdFx0Z3JvdXBMYWJlbDpcblx0XHRcdFx0XHRjb21waWxlQmluZGluZyhcblx0XHRcdFx0XHRcdGFubm90YXRpb25FeHByZXNzaW9uKGZpZWxkR3JvdXAuTGFiZWwgfHwgZmllbGRHcm91cC5hbm5vdGF0aW9ucz8uQ29tbW9uPy5MYWJlbCB8fCBmaWVsZEdyb3VwLnF1YWxpZmllcilcblx0XHRcdFx0XHQpIHx8IGZpZWxkR3JvdXAucXVhbGlmaWVyXG5cdFx0XHR9O1xuXHRcdH1cblx0fSk7XG5cdHJldHVybiBmaWx0ZXJGYWNldE1hcDtcbn1cblxuZnVuY3Rpb24gZ2V0RXhjbHVkZWRGaWx0ZXJQcm9wZXJ0aWVzKHNlbGVjdGlvblZhcmlhbnRzOiBTZWxlY3Rpb25WYXJpYW50Q29uZmlndXJhdGlvbltdKTogUmVjb3JkPHN0cmluZywgYm9vbGVhbj4ge1xuXHRyZXR1cm4gc2VsZWN0aW9uVmFyaWFudHMucmVkdWNlKChwcmV2aW91c1ZhbHVlOiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPiwgc2VsZWN0aW9uVmFyaWFudCkgPT4ge1xuXHRcdHNlbGVjdGlvblZhcmlhbnQucHJvcGVydHlOYW1lcy5mb3JFYWNoKHByb3BlcnR5TmFtZSA9PiB7XG5cdFx0XHRwcmV2aW91c1ZhbHVlW3Byb3BlcnR5TmFtZV0gPSB0cnVlO1xuXHRcdH0pO1xuXHRcdHJldHVybiBwcmV2aW91c1ZhbHVlO1xuXHR9LCB7fSk7XG59XG5cbi8qKlxuICogQ2hlY2sgdGhhdCBhbGwgdGhlIHRhYmxlcyBmb3IgYSBkZWRpY2F0ZWQgZW50aXR5IHNldCBhcmUgY29uZmlndXJlZCBhcyBhbmFseXRpY2FsIHRhYmxlLlxuICogQHBhcmFtIHtUYWJsZVZpc3VhbGl6YXRpb25bXX0gbGlzdFJlcG9ydFRhYmxlcyBMaXN0IHJlcG9ydCB0YWJsZXNcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb250ZXh0UGF0aFxuICogQHJldHVybnMge2Jvb2xlYW59IElzIEZpbHRlckJhciBzZWFyY2ggZmllbGQgaGlkZGVuIG9yIG5vdFxuICovXG5mdW5jdGlvbiBjaGVja0FsbFRhYmxlRm9yRW50aXR5U2V0QXJlQW5hbHl0aWNhbChsaXN0UmVwb3J0VGFibGVzOiBUYWJsZVZpc3VhbGl6YXRpb25bXSwgY29udGV4dFBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuXHRpZiAoY29udGV4dFBhdGggJiYgbGlzdFJlcG9ydFRhYmxlcy5sZW5ndGggPiAwKSB7XG5cdFx0cmV0dXJuIGxpc3RSZXBvcnRUYWJsZXMuZXZlcnkodmlzdWFsaXphdGlvbiA9PiB7XG5cdFx0XHRyZXR1cm4gdmlzdWFsaXphdGlvbi5lbmFibGVBbmFseXRpY3MgJiYgY29udGV4dFBhdGggPT09IHZpc3VhbGl6YXRpb24uYW5ub3RhdGlvbi5jb2xsZWN0aW9uO1xuXHRcdH0pO1xuXHR9XG5cdHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gZ2V0U2VsZWN0aW9uVmFyaWFudHMoXG5cdGxyVGFibGVWaXN1YWxpemF0aW9uczogVGFibGVWaXN1YWxpemF0aW9uW10sXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHRcbik6IFNlbGVjdGlvblZhcmlhbnRDb25maWd1cmF0aW9uW10ge1xuXHRjb25zdCBzZWxlY3Rpb25WYXJpYW50UGF0aHM6IHN0cmluZ1tdID0gW107XG5cdHJldHVybiBsclRhYmxlVmlzdWFsaXphdGlvbnNcblx0XHQubWFwKHZpc3VhbGl6YXRpb24gPT4ge1xuXHRcdFx0Y29uc3QgdGFibGVGaWx0ZXJzID0gdmlzdWFsaXphdGlvbi5jb250cm9sLmZpbHRlcnM7XG5cdFx0XHRjb25zdCB0YWJsZVNWQ29uZmlnczogU2VsZWN0aW9uVmFyaWFudENvbmZpZ3VyYXRpb25bXSA9IFtdO1xuXHRcdFx0Zm9yIChjb25zdCBrZXkgaW4gdGFibGVGaWx0ZXJzKSB7XG5cdFx0XHRcdGlmIChBcnJheS5pc0FycmF5KHRhYmxlRmlsdGVyc1trZXldLnBhdGhzKSkge1xuXHRcdFx0XHRcdGNvbnN0IHBhdGhzID0gdGFibGVGaWx0ZXJzW2tleV0ucGF0aHM7XG5cdFx0XHRcdFx0cGF0aHMuZm9yRWFjaChwYXRoID0+IHtcblx0XHRcdFx0XHRcdGlmIChwYXRoICYmIHBhdGguYW5ub3RhdGlvblBhdGggJiYgc2VsZWN0aW9uVmFyaWFudFBhdGhzLmluZGV4T2YocGF0aC5hbm5vdGF0aW9uUGF0aCkgPT09IC0xKSB7XG5cdFx0XHRcdFx0XHRcdHNlbGVjdGlvblZhcmlhbnRQYXRocy5wdXNoKHBhdGguYW5ub3RhdGlvblBhdGgpO1xuXHRcdFx0XHRcdFx0XHRjb25zdCBzZWxlY3Rpb25WYXJpYW50Q29uZmlnID0gZ2V0U2VsZWN0aW9uVmFyaWFudENvbmZpZ3VyYXRpb24ocGF0aC5hbm5vdGF0aW9uUGF0aCwgY29udmVydGVyQ29udGV4dCk7XG5cdFx0XHRcdFx0XHRcdGlmIChzZWxlY3Rpb25WYXJpYW50Q29uZmlnKSB7XG5cdFx0XHRcdFx0XHRcdFx0dGFibGVTVkNvbmZpZ3MucHVzaChzZWxlY3Rpb25WYXJpYW50Q29uZmlnKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdGFibGVTVkNvbmZpZ3M7XG5cdFx0fSlcblx0XHQucmVkdWNlKChzdkNvbmZpZ3MsIHNlbGVjdGlvblZhcmlhbnQpID0+IHN2Q29uZmlncy5jb25jYXQoc2VsZWN0aW9uVmFyaWFudCksIFtdKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBjb25kaXRpb24gcGF0aCByZXF1aXJlZCBmb3IgdGhlIGNvbmRpdGlvbiBtb2RlbC4gSXQgbG9va3MgYXMgZm9sbG93czpcbiAqIDwxOk4tUHJvcGVydHlOYW1lPipcXC88MToxLVByb3BlcnR5TmFtZT4vPFByb3BlcnR5TmFtZT4uXG4gKlxuICogQHBhcmFtIGVudGl0eVR5cGUgVGhlIHJvb3QgRW50aXR5VHlwZVxuICogQHBhcmFtIHByb3BlcnR5UGF0aCBUaGUgZnVsbCBwYXRoIHRvIHRoZSB0YXJnZXQgcHJvcGVydHlcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBmb3JtYXR0ZWQgY29uZGl0aW9uIHBhdGhcbiAqL1xuY29uc3QgX2dldENvbmRpdGlvblBhdGggPSBmdW5jdGlvbihlbnRpdHlUeXBlOiBFbnRpdHlUeXBlLCBwcm9wZXJ0eVBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG5cdGNvbnN0IHBhcnRzID0gcHJvcGVydHlQYXRoLnNwbGl0KFwiL1wiKTtcblx0bGV0IHBhcnRpYWxQYXRoO1xuXHRsZXQga2V5ID0gXCJcIjtcblx0d2hpbGUgKHBhcnRzLmxlbmd0aCkge1xuXHRcdGxldCBwYXJ0ID0gcGFydHMuc2hpZnQoKSBhcyBzdHJpbmc7XG5cdFx0cGFydGlhbFBhdGggPSBwYXJ0aWFsUGF0aCA/IHBhcnRpYWxQYXRoICsgXCIvXCIgKyBwYXJ0IDogcGFydDtcblx0XHRjb25zdCBwcm9wZXJ0eTogUHJvcGVydHkgfCBOYXZpZ2F0aW9uUHJvcGVydHkgPSBlbnRpdHlUeXBlLnJlc29sdmVQYXRoKHBhcnRpYWxQYXRoKTtcblx0XHRpZiAocHJvcGVydHkuX3R5cGUgPT09IFwiTmF2aWdhdGlvblByb3BlcnR5XCIgJiYgcHJvcGVydHkuaXNDb2xsZWN0aW9uKSB7XG5cdFx0XHRwYXJ0ICs9IFwiKlwiO1xuXHRcdH1cblx0XHRrZXkgPSBrZXkgPyBrZXkgKyBcIi9cIiArIHBhcnQgOiBwYXJ0O1xuXHR9XG5cdHJldHVybiBrZXk7XG59O1xuXG5jb25zdCBfY3JlYXRlRmlsdGVyU2VsZWN0aW9uRmllbGQgPSBmdW5jdGlvbihcblx0ZW50aXR5VHlwZTogRW50aXR5VHlwZSxcblx0cHJvcGVydHk6IFByb3BlcnR5LFxuXHRmdWxsUHJvcGVydHlQYXRoOiBzdHJpbmcsXG5cdGluY2x1ZGVIaWRkZW46IGJvb2xlYW4sXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHRcbik6IEZpbHRlckZpZWxkIHwgdW5kZWZpbmVkIHtcblx0Ly8gaWdub3JlIGNvbXBsZXggcHJvcGVydHkgdHlwZXMgYW5kIGhpZGRlbiBhbm5vdGF0ZWQgb25lc1xuXHRpZiAoXG5cdFx0cHJvcGVydHkgIT09IHVuZGVmaW5lZCAmJlxuXHRcdHByb3BlcnR5LnRhcmdldFR5cGUgPT09IHVuZGVmaW5lZCAmJlxuXHRcdChpbmNsdWRlSGlkZGVuIHx8IHByb3BlcnR5LmFubm90YXRpb25zPy5VST8uSGlkZGVuPy52YWx1ZU9mKCkgIT09IHRydWUpXG5cdCkge1xuXHRcdGNvbnN0IHRhcmdldEVudGl0eVR5cGUgPSBjb252ZXJ0ZXJDb250ZXh0LmdldEFubm90YXRpb25FbnRpdHlUeXBlKHByb3BlcnR5KTtcblx0XHRyZXR1cm4ge1xuXHRcdFx0a2V5OiBLZXlIZWxwZXIuZ2V0U2VsZWN0aW9uRmllbGRLZXlGcm9tUGF0aChmdWxsUHJvcGVydHlQYXRoKSxcblx0XHRcdGFubm90YXRpb25QYXRoOiBjb252ZXJ0ZXJDb250ZXh0LmdldEFic29sdXRlQW5ub3RhdGlvblBhdGgoZnVsbFByb3BlcnR5UGF0aCksXG5cdFx0XHRjb25kaXRpb25QYXRoOiBfZ2V0Q29uZGl0aW9uUGF0aChlbnRpdHlUeXBlLCBmdWxsUHJvcGVydHlQYXRoKSxcblx0XHRcdGF2YWlsYWJpbGl0eTpcblx0XHRcdFx0cHJvcGVydHkuYW5ub3RhdGlvbnM/LlVJPy5IaWRkZW5GaWx0ZXI/LnZhbHVlT2YoKSA9PT0gdHJ1ZSA/IEF2YWlsYWJpbGl0eVR5cGUuSGlkZGVuIDogQXZhaWxhYmlsaXR5VHlwZS5BZGFwdGF0aW9uLFxuXHRcdFx0bGFiZWw6IGNvbXBpbGVCaW5kaW5nKGFubm90YXRpb25FeHByZXNzaW9uKHByb3BlcnR5LmFubm90YXRpb25zLkNvbW1vbj8uTGFiZWw/LnZhbHVlT2YoKSB8fCBwcm9wZXJ0eS5uYW1lKSksXG5cdFx0XHRncm91cDogdGFyZ2V0RW50aXR5VHlwZS5uYW1lLFxuXHRcdFx0Z3JvdXBMYWJlbDogY29tcGlsZUJpbmRpbmcoXG5cdFx0XHRcdGFubm90YXRpb25FeHByZXNzaW9uKHRhcmdldEVudGl0eVR5cGU/LmFubm90YXRpb25zPy5Db21tb24/LkxhYmVsPy52YWx1ZU9mKCkgfHwgdGFyZ2V0RW50aXR5VHlwZS5uYW1lKVxuXHRcdFx0KVxuXHRcdH07XG5cdH1cblx0cmV0dXJuIHVuZGVmaW5lZDtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRNb2RlbFR5cGUoc1R5cGU6IGFueSkge1xuXHR0eXBlIGRlZmF1bHRNb2RlbFR5cGUgPSB7XG5cdFx0W2tleTogc3RyaW5nXToge1xuXHRcdFx0W2tleTogc3RyaW5nXTogc3RyaW5nO1xuXHRcdH07XG5cdH07XG5cdGNvbnN0IG1EZWZhdWx0VHlwZUZvckVkbVR5cGU6IGRlZmF1bHRNb2RlbFR5cGUgPSB7XG5cdFx0XCJFZG0uQm9vbGVhblwiOiB7XG5cdFx0XHRtb2RlbFR5cGU6IFwiQm9vbFwiXG5cdFx0fSxcblx0XHRcIkVkbS5CeXRlXCI6IHtcblx0XHRcdG1vZGVsVHlwZTogXCJJbnRcIlxuXHRcdH0sXG5cdFx0XCJFZG0uRGF0ZVwiOiB7XG5cdFx0XHRtb2RlbFR5cGU6IFwiRGF0ZVwiXG5cdFx0fSxcblx0XHRcIkVkbS5EYXRlVGltZVwiOiB7XG5cdFx0XHRtb2RlbFR5cGU6IFwiRGF0ZVwiXG5cdFx0fSxcblx0XHRcIkVkbS5EYXRlVGltZU9mZnNldFwiOiB7XG5cdFx0XHRtb2RlbFR5cGU6IFwiRGF0ZVRpbWVPZmZzZXRcIlxuXHRcdH0sXG5cdFx0XCJFZG0uRGVjaW1hbFwiOiB7XG5cdFx0XHRtb2RlbFR5cGU6IFwiRGVjaW1hbFwiXG5cdFx0fSxcblx0XHRcIkVkbS5Eb3VibGVcIjoge1xuXHRcdFx0bW9kZWxUeXBlOiBcIkZsb2F0XCJcblx0XHR9LFxuXHRcdFwiRWRtLkZsb2F0XCI6IHtcblx0XHRcdG1vZGVsVHlwZTogXCJGbG9hdFwiXG5cdFx0fSxcblx0XHRcIkVkbS5HdWlkXCI6IHtcblx0XHRcdG1vZGVsVHlwZTogXCJHdWlkXCJcblx0XHR9LFxuXHRcdFwiRWRtLkludDE2XCI6IHtcblx0XHRcdG1vZGVsVHlwZTogXCJJbnRcIlxuXHRcdH0sXG5cdFx0XCJFZG0uSW50MzJcIjoge1xuXHRcdFx0bW9kZWxUeXBlOiBcIkludFwiXG5cdFx0fSxcblx0XHRcIkVkbS5JbnQ2NFwiOiB7XG5cdFx0XHRtb2RlbFR5cGU6IFwiSW50XCJcblx0XHR9LFxuXHRcdFwiRWRtLlNCeXRlXCI6IHtcblx0XHRcdG1vZGVsVHlwZTogXCJJbnRcIlxuXHRcdH0sXG5cdFx0XCJFZG0uU2luZ2xlXCI6IHtcblx0XHRcdG1vZGVsVHlwZTogXCJGbG9hdFwiXG5cdFx0fSxcblx0XHRcIkVkbS5TdHJpbmdcIjoge1xuXHRcdFx0bW9kZWxUeXBlOiBcIlN0cmluZ1wiXG5cdFx0fSxcblx0XHRcIkVkbS5UaW1lXCI6IHtcblx0XHRcdG1vZGVsVHlwZTogXCJUaW1lT2ZEYXlcIlxuXHRcdH0sXG5cdFx0XCJFZG0uVGltZU9mRGF5XCI6IHtcblx0XHRcdG1vZGVsVHlwZTogXCJUaW1lT2ZEYXlcIlxuXHRcdH0sXG5cdFx0XCJFZG0uU3RyZWFtXCI6IHtcblx0XHRcdC8vbm8gY29ycmVzcG9uZGluZyBtb2RlbFR5cGUgLSBpZ25vcmUgZm9yIGZpbHRlcmluZ1xuXHRcdH1cblx0fTtcblx0cmV0dXJuIHNUeXBlICYmIHNUeXBlIGluIG1EZWZhdWx0VHlwZUZvckVkbVR5cGUgJiYgbURlZmF1bHRUeXBlRm9yRWRtVHlwZVtzVHlwZV0ubW9kZWxUeXBlO1xufVxuY29uc3QgX2dldFNlbGVjdGlvbkZpZWxkcyA9IGZ1bmN0aW9uKFxuXHRlbnRpdHlUeXBlOiBFbnRpdHlUeXBlLFxuXHRuYXZpZ2F0aW9uUGF0aDogc3RyaW5nLFxuXHRwcm9wZXJ0aWVzOiBBcnJheTxQcm9wZXJ0eT4gfCB1bmRlZmluZWQsXG5cdGluY2x1ZGVIaWRkZW46IGJvb2xlYW4sXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHRcbik6IFJlY29yZDxzdHJpbmcsIEZpbHRlckZpZWxkPiB7XG5cdGNvbnN0IHNlbGVjdGlvbkZpZWxkTWFwOiBSZWNvcmQ8c3RyaW5nLCBGaWx0ZXJGaWVsZD4gPSB7fTtcblx0aWYgKHByb3BlcnRpZXMpIHtcblx0XHRwcm9wZXJ0aWVzLmZvckVhY2goKHByb3BlcnR5OiBQcm9wZXJ0eSkgPT4ge1xuXHRcdFx0Y29uc3QgcHJvcGVydHlQYXRoOiBzdHJpbmcgPSBwcm9wZXJ0eS5uYW1lO1xuXHRcdFx0Y29uc3QgZnVsbFBhdGg6IHN0cmluZyA9IChuYXZpZ2F0aW9uUGF0aCA/IG5hdmlnYXRpb25QYXRoICsgXCIvXCIgOiBcIlwiKSArIHByb3BlcnR5UGF0aDtcblx0XHRcdGNvbnN0IHNlbGVjdGlvbkZpZWxkID0gX2NyZWF0ZUZpbHRlclNlbGVjdGlvbkZpZWxkKGVudGl0eVR5cGUsIHByb3BlcnR5LCBmdWxsUGF0aCwgaW5jbHVkZUhpZGRlbiwgY29udmVydGVyQ29udGV4dCk7XG5cdFx0XHRpZiAoc2VsZWN0aW9uRmllbGQpIHtcblx0XHRcdFx0c2VsZWN0aW9uRmllbGRNYXBbZnVsbFBhdGhdID0gc2VsZWN0aW9uRmllbGQ7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblx0cmV0dXJuIHNlbGVjdGlvbkZpZWxkTWFwO1xufTtcblxuY29uc3QgX2dldFNlbGVjdGlvbkZpZWxkc0J5UGF0aCA9IGZ1bmN0aW9uKFxuXHRlbnRpdHlUeXBlOiBFbnRpdHlUeXBlLFxuXHRwcm9wZXJ0eVBhdGhzOiBBcnJheTxzdHJpbmc+IHwgdW5kZWZpbmVkLFxuXHRpbmNsdWRlSGlkZGVuOiBib29sZWFuLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0XG4pOiBSZWNvcmQ8c3RyaW5nLCBGaWx0ZXJGaWVsZD4ge1xuXHRsZXQgc2VsZWN0aW9uRmllbGRzOiBSZWNvcmQ8c3RyaW5nLCBGaWx0ZXJGaWVsZD4gPSB7fTtcblx0aWYgKHByb3BlcnR5UGF0aHMpIHtcblx0XHRwcm9wZXJ0eVBhdGhzLmZvckVhY2goKHByb3BlcnR5UGF0aDogc3RyaW5nKSA9PiB7XG5cdFx0XHRsZXQgbG9jYWxTZWxlY3Rpb25GaWVsZHM6IFJlY29yZDxzdHJpbmcsIEZpbHRlckZpZWxkPjtcblxuXHRcdFx0Y29uc3QgcHJvcGVydHk6IFByb3BlcnR5IHwgTmF2aWdhdGlvblByb3BlcnR5ID0gZW50aXR5VHlwZS5yZXNvbHZlUGF0aChwcm9wZXJ0eVBhdGgpO1xuXHRcdFx0aWYgKHByb3BlcnR5ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHByb3BlcnR5Ll90eXBlID09PSBcIk5hdmlnYXRpb25Qcm9wZXJ0eVwiKSB7XG5cdFx0XHRcdC8vIGhhbmRsZSBuYXZpZ2F0aW9uIHByb3BlcnRpZXNcblx0XHRcdFx0bG9jYWxTZWxlY3Rpb25GaWVsZHMgPSBfZ2V0U2VsZWN0aW9uRmllbGRzKFxuXHRcdFx0XHRcdGVudGl0eVR5cGUsXG5cdFx0XHRcdFx0cHJvcGVydHlQYXRoLFxuXHRcdFx0XHRcdHByb3BlcnR5LnRhcmdldFR5cGUuZW50aXR5UHJvcGVydGllcyxcblx0XHRcdFx0XHRpbmNsdWRlSGlkZGVuLFxuXHRcdFx0XHRcdGNvbnZlcnRlckNvbnRleHRcblx0XHRcdFx0KTtcblx0XHRcdH0gZWxzZSBpZiAocHJvcGVydHkudGFyZ2V0VHlwZSAhPT0gdW5kZWZpbmVkICYmIHByb3BlcnR5LnRhcmdldFR5cGUuX3R5cGUgPT09IFwiQ29tcGxleFR5cGVcIikge1xuXHRcdFx0XHQvLyBoYW5kbGUgQ29tcGxleFR5cGUgcHJvcGVydGllc1xuXHRcdFx0XHRsb2NhbFNlbGVjdGlvbkZpZWxkcyA9IF9nZXRTZWxlY3Rpb25GaWVsZHMoXG5cdFx0XHRcdFx0ZW50aXR5VHlwZSxcblx0XHRcdFx0XHRwcm9wZXJ0eVBhdGgsXG5cdFx0XHRcdFx0cHJvcGVydHkudGFyZ2V0VHlwZS5wcm9wZXJ0aWVzLFxuXHRcdFx0XHRcdGluY2x1ZGVIaWRkZW4sXG5cdFx0XHRcdFx0Y29udmVydGVyQ29udGV4dFxuXHRcdFx0XHQpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3QgbmF2aWdhdGlvblBhdGggPSBwcm9wZXJ0eVBhdGguaW5jbHVkZXMoXCIvXCIpXG5cdFx0XHRcdFx0PyBwcm9wZXJ0eVBhdGhcblx0XHRcdFx0XHRcdFx0LnNwbGl0KFwiL1wiKVxuXHRcdFx0XHRcdFx0XHQuc3BsaWNlKDAsIDEpXG5cdFx0XHRcdFx0XHRcdC5qb2luKFwiL1wiKVxuXHRcdFx0XHRcdDogXCJcIjtcblx0XHRcdFx0bG9jYWxTZWxlY3Rpb25GaWVsZHMgPSBfZ2V0U2VsZWN0aW9uRmllbGRzKGVudGl0eVR5cGUsIG5hdmlnYXRpb25QYXRoLCBbcHJvcGVydHldLCBpbmNsdWRlSGlkZGVuLCBjb252ZXJ0ZXJDb250ZXh0KTtcblx0XHRcdH1cblxuXHRcdFx0c2VsZWN0aW9uRmllbGRzID0ge1xuXHRcdFx0XHQuLi5zZWxlY3Rpb25GaWVsZHMsXG5cdFx0XHRcdC4uLmxvY2FsU2VsZWN0aW9uRmllbGRzXG5cdFx0XHR9O1xuXHRcdH0pO1xuXHR9XG5cdHJldHVybiBzZWxlY3Rpb25GaWVsZHM7XG59O1xuXG5jb25zdCBfZ2V0RmlsdGVyRmllbGQgPSBmdW5jdGlvbihcblx0ZmlsdGVyRmllbGRzOiBSZWNvcmQ8c3RyaW5nLCBGaWx0ZXJGaWVsZD4sXG5cdHByb3BlcnR5UGF0aDogc3RyaW5nLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LFxuXHRlbnRpdHlUeXBlOiBFbnRpdHlUeXBlXG4pOiBGaWx0ZXJGaWVsZCB8IHVuZGVmaW5lZCB7XG5cdGxldCBmaWx0ZXJGaWVsZDogRmlsdGVyRmllbGQgfCB1bmRlZmluZWQgPSBmaWx0ZXJGaWVsZHNbcHJvcGVydHlQYXRoXTtcblx0aWYgKGZpbHRlckZpZWxkKSB7XG5cdFx0ZGVsZXRlIGZpbHRlckZpZWxkc1twcm9wZXJ0eVBhdGhdO1xuXHR9IGVsc2Uge1xuXHRcdGZpbHRlckZpZWxkID0gX2NyZWF0ZUZpbHRlclNlbGVjdGlvbkZpZWxkKGVudGl0eVR5cGUsIGVudGl0eVR5cGUucmVzb2x2ZVBhdGgocHJvcGVydHlQYXRoKSwgcHJvcGVydHlQYXRoLCB0cnVlLCBjb252ZXJ0ZXJDb250ZXh0KTtcblx0fVxuXHRpZiAoIWZpbHRlckZpZWxkKSB7XG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXREaWFnbm9zdGljcygpPy5hZGRJc3N1ZShJc3N1ZUNhdGVnb3J5LkFubm90YXRpb24sIElzc3VlU2V2ZXJpdHkuSGlnaCwgSXNzdWVUeXBlLk1JU1NJTkdfU0VMRUNUSU9ORklFTEQpO1xuXHR9XG5cdC8vIGRlZmluZWQgU2VsZWN0aW9uRmllbGRzIGFyZSBhdmFpbGFibGUgYnkgZGVmYXVsdFxuXHRpZiAoZmlsdGVyRmllbGQpIHtcblx0XHRmaWx0ZXJGaWVsZC5hdmFpbGFiaWxpdHkgPSBBdmFpbGFiaWxpdHlUeXBlLkRlZmF1bHQ7XG5cdFx0ZmlsdGVyRmllbGQuaXNQYXJhbWV0ZXIgPSAhIWVudGl0eVR5cGUuYW5ub3RhdGlvbnM/LkNvbW1vbj8uUmVzdWx0Q29udGV4dDtcblx0fVxuXHRyZXR1cm4gZmlsdGVyRmllbGQ7XG59O1xuXG5jb25zdCBfZ2V0RGVmYXVsdEZpbHRlckZpZWxkcyA9IGZ1bmN0aW9uKFxuXHRmaWx0ZXJGaWVsZHM6IFJlY29yZDxzdHJpbmcsIEZpbHRlckZpZWxkPixcblx0YVNlbGVjdE9wdGlvbnM6IGFueVtdLFxuXHRlbnRpdHlUeXBlOiBFbnRpdHlUeXBlLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LFxuXHRleGNsdWRlZEZpbHRlclByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+LFxuXHRhbm5vdGF0ZWRTZWxlY3Rpb25GaWVsZHM6IFByb3BlcnR5UGF0aFtdXG4pOiBGaWx0ZXJGaWVsZFtdIHtcblx0Y29uc3Qgc2VsZWN0aW9uRmllbGRzOiBGaWx0ZXJGaWVsZFtdID0gW107XG5cdGNvbnN0IFVJU2VsZWN0aW9uRmllbGRzOiBhbnkgPSB7fTtcblx0Y29uc3QgcHJvcGVydGllcyA9IGVudGl0eVR5cGUuZW50aXR5UHJvcGVydGllcztcblx0Ly8gVXNpbmcgZW50aXR5VHlwZSBpbnN0ZWFkIG9mIGVudGl0eVNldFxuXHRhbm5vdGF0ZWRTZWxlY3Rpb25GaWVsZHM/LmZvckVhY2goU2VsZWN0aW9uRmllbGQgPT4ge1xuXHRcdFVJU2VsZWN0aW9uRmllbGRzW1NlbGVjdGlvbkZpZWxkLnZhbHVlXSA9IHRydWU7XG5cdH0pO1xuXHRpZiAoYVNlbGVjdE9wdGlvbnMgJiYgYVNlbGVjdE9wdGlvbnMubGVuZ3RoID4gMCkge1xuXHRcdGFTZWxlY3RPcHRpb25zPy5mb3JFYWNoKChzZWxlY3RPcHRpb246IFNlbGVjdE9wdGlvblR5cGUpID0+IHtcblx0XHRcdGNvbnN0IHByb3BlcnR5TmFtZTogYW55ID0gc2VsZWN0T3B0aW9uLlByb3BlcnR5TmFtZTtcblx0XHRcdGNvbnN0IHNQcm9wZXJ0eVBhdGg6IHN0cmluZyA9IHByb3BlcnR5TmFtZS52YWx1ZTtcblx0XHRcdGNvbnN0IFVJU2VsZWN0aW9uRmllbGRzOiBhbnkgPSB7fTtcblx0XHRcdGFubm90YXRlZFNlbGVjdGlvbkZpZWxkcz8uZm9yRWFjaChTZWxlY3Rpb25GaWVsZCA9PiB7XG5cdFx0XHRcdFVJU2VsZWN0aW9uRmllbGRzW1NlbGVjdGlvbkZpZWxkLnZhbHVlXSA9IHRydWU7XG5cdFx0XHR9KTtcblx0XHRcdGlmICghKHNQcm9wZXJ0eVBhdGggaW4gZXhjbHVkZWRGaWx0ZXJQcm9wZXJ0aWVzKSkge1xuXHRcdFx0XHRpZiAoIShzUHJvcGVydHlQYXRoIGluIFVJU2VsZWN0aW9uRmllbGRzKSkge1xuXHRcdFx0XHRcdGNvbnN0IEZpbHRlckZpZWxkOiBGaWx0ZXJGaWVsZCB8IHVuZGVmaW5lZCA9IF9nZXRGaWx0ZXJGaWVsZChmaWx0ZXJGaWVsZHMsIHNQcm9wZXJ0eVBhdGgsIGNvbnZlcnRlckNvbnRleHQsIGVudGl0eVR5cGUpO1xuXHRcdFx0XHRcdGlmIChGaWx0ZXJGaWVsZCkge1xuXHRcdFx0XHRcdFx0c2VsZWN0aW9uRmllbGRzLnB1c2goRmlsdGVyRmllbGQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHR9IGVsc2UgaWYgKHByb3BlcnRpZXMpIHtcblx0XHRwcm9wZXJ0aWVzLmZvckVhY2goKHByb3BlcnR5OiBQcm9wZXJ0eSkgPT4ge1xuXHRcdFx0Y29uc3QgZGVmYXVsdEZpbHRlclZhbHVlID0gcHJvcGVydHkuYW5ub3RhdGlvbnM/LkNvbW1vbj8uRmlsdGVyRGVmYXVsdFZhbHVlO1xuXHRcdFx0Y29uc3QgUHJvcGVydHlQYXRoID0gcHJvcGVydHkubmFtZTtcblx0XHRcdGlmICghKFByb3BlcnR5UGF0aCBpbiBleGNsdWRlZEZpbHRlclByb3BlcnRpZXMpKSB7XG5cdFx0XHRcdGlmIChkZWZhdWx0RmlsdGVyVmFsdWUgJiYgIShQcm9wZXJ0eVBhdGggaW4gVUlTZWxlY3Rpb25GaWVsZHMpKSB7XG5cdFx0XHRcdFx0Y29uc3QgRmlsdGVyRmllbGQ6IEZpbHRlckZpZWxkIHwgdW5kZWZpbmVkID0gX2dldEZpbHRlckZpZWxkKGZpbHRlckZpZWxkcywgUHJvcGVydHlQYXRoLCBjb252ZXJ0ZXJDb250ZXh0LCBlbnRpdHlUeXBlKTtcblx0XHRcdFx0XHRpZiAoRmlsdGVyRmllbGQpIHtcblx0XHRcdFx0XHRcdHNlbGVjdGlvbkZpZWxkcy5wdXNoKEZpbHRlckZpZWxkKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXHRyZXR1cm4gc2VsZWN0aW9uRmllbGRzO1xufTtcblxuLyoqXG4gKiBHZXQgYWxsIHBhcmFtZXRlciBmaWx0ZXIgZmllbGRzIGluIGNhc2Ugb2YgYSBwYXJhbWV0ZXJpemVkIHNlcnZpY2UuXG4gKiBAcGFyYW0ge0NvbnZlcnRlckNvbnRleHR9IGNvbnZlcnRlckNvbnRleHRcbiAqIEByZXR1cm5zIHtGaWx0ZXJGaWVsZFtdfSBBbiBhcnJheSBvZiBwYXJhbWV0ZXIgZmlsdGVyZmllbGRzXG4gKi9cbmZ1bmN0aW9uIF9nZXRQYXJhbWV0ZXJGaWVsZHMoY29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCk6IEZpbHRlckZpZWxkW10ge1xuXHRjb25zdCBkYXRhTW9kZWxPYmplY3RQYXRoID0gY29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCk7XG5cdGNvbnN0IHBhcmFtZXRlckVudGl0eVR5cGUgPSBkYXRhTW9kZWxPYmplY3RQYXRoLnN0YXJ0aW5nRW50aXR5U2V0LmVudGl0eVR5cGU7XG5cdGNvbnN0IGlzUGFyYW1ldGVyaXplZCA9ICEhcGFyYW1ldGVyRW50aXR5VHlwZS5hbm5vdGF0aW9ucz8uQ29tbW9uPy5SZXN1bHRDb250ZXh0O1xuXHRjb25zdCBwYXJhbWV0ZXJDb252ZXJ0ZXJDb250ZXh0ID1cblx0XHRpc1BhcmFtZXRlcml6ZWQgJiYgY29udmVydGVyQ29udGV4dC5nZXRDb252ZXJ0ZXJDb250ZXh0Rm9yKFwiL1wiICsgZGF0YU1vZGVsT2JqZWN0UGF0aC5zdGFydGluZ0VudGl0eVNldC5uYW1lKTtcblxuXHRjb25zdCBwYXJhbWV0ZXJGaWVsZHMgPSAocGFyYW1ldGVyQ29udmVydGVyQ29udGV4dFxuXHRcdD8gcGFyYW1ldGVyRW50aXR5VHlwZS5lbnRpdHlQcm9wZXJ0aWVzLm1hcChmdW5jdGlvbihwcm9wZXJ0eSkge1xuXHRcdFx0XHRyZXR1cm4gX2dldEZpbHRlckZpZWxkKHt9IGFzIFJlY29yZDxzdHJpbmcsIEZpbHRlckZpZWxkPiwgcHJvcGVydHkubmFtZSwgcGFyYW1ldGVyQ29udmVydGVyQ29udGV4dCwgcGFyYW1ldGVyRW50aXR5VHlwZSk7XG5cdFx0ICB9KVxuXHRcdDogW10pIGFzIEZpbHRlckZpZWxkW107XG5cblx0cmV0dXJuIHBhcmFtZXRlckZpZWxkcztcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmVzIGlmIHRoZSBGaWx0ZXJCYXIgc2VhcmNoIGZpZWxkIGlzIGhpZGRlbiBvciBub3QuXG4gKlxuICogQHBhcmFtIHtUYWJsZVZpc3VhbGl6YXRpb25bXX0gbGlzdFJlcG9ydFRhYmxlcyBUaGUgbGlzdCByZXBvcnQgdGFibGVzXG4gKiBAcGFyYW0ge0NoYXJ0VmlzdWFsaXphdGlvbltdfSBjaGFydHMgVGhlIEFMUCBjaGFydHNcbiAqIEBwYXJhbSB7Q29udmVydGVyQ29udGV4dH0gY29udmVydGVyQ29udGV4dCBUaGUgY29udmVydGVyIGNvbnRleHRcbiAqIEByZXR1cm5zIHtib29sZWFufSBUaGUgaW5mb3JtYXRpb24gaWYgdGhlIEZpbHRlckJhciBzZWFyY2ggZmllbGQgaXMgaGlkZGVuIG9yIG5vdFxuICovXG5leHBvcnQgY29uc3QgZ2V0RmlsdGVyQmFyaGlkZUJhc2ljU2VhcmNoID0gZnVuY3Rpb24oXG5cdGxpc3RSZXBvcnRUYWJsZXM6IFRhYmxlVmlzdWFsaXphdGlvbltdLFxuXHRjaGFydHM6IENoYXJ0VmlzdWFsaXphdGlvbltdLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0XG4pOiBib29sZWFuIHtcblx0Ly8gQ2hlY2sgaWYgY2hhcnRzIGFsbG93IHNlYXJjaFxuXHRjb25zdCBub1NlYXJjaEluQ2hhcnRzID0gY2hhcnRzLmxlbmd0aCA9PT0gMCB8fCBjaGFydHMuZXZlcnkoY2hhcnQgPT4gIWNoYXJ0LmFwcGx5U3VwcG9ydGVkLmVuYWJsZVNlYXJjaCk7XG5cblx0Ly8gQ2hlY2sgaWYgYWxsIHRhYmxlcyBhcmUgYW5hbHl0aWNhbCBhbmQgbm9uZSBvZiB0aGVtIGFsbG93IGZvciBzZWFyY2hcblx0Y29uc3Qgbm9TZWFyY2hJblRhYmxlcyA9XG5cdFx0bGlzdFJlcG9ydFRhYmxlcy5sZW5ndGggPT09IDAgfHwgbGlzdFJlcG9ydFRhYmxlcy5ldmVyeSh0YWJsZSA9PiB0YWJsZS5lbmFibGVBbmFseXRpY3MgJiYgIXRhYmxlLmVuYWJsZUFuYWx5dGljc1NlYXJjaCk7XG5cblx0Y29uc3QgY29udGV4dFBhdGggPSBjb252ZXJ0ZXJDb250ZXh0LmdldENvbnRleHRQYXRoKCk7XG5cdGlmIChjb250ZXh0UGF0aCAmJiBub1NlYXJjaEluQ2hhcnRzICYmIG5vU2VhcmNoSW5UYWJsZXMpIHtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cbn07XG5cbi8qKlxuICogUmV0cmlldmVzIGZpbHRlciBmaWVsZHMgZnJvbSB0aGUgbWFuaWZlc3QuXG4gKlxuICogQHBhcmFtIGVudGl0eVR5cGUgVGhlIGN1cnJlbnQgZW50aXR5VHlwZVxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGNvbnZlcnRlciBjb250ZXh0XG4gKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgQ3VzdG9tRWxlbWVudEZpbHRlckZpZWxkPn0gVGhlIGZpbHRlciBmaWVsZHMgZGVmaW5lZCBpbiB0aGUgbWFuaWZlc3RcbiAqL1xuZXhwb3J0IGNvbnN0IGdldE1hbmlmZXN0RmlsdGVyRmllbGRzID0gZnVuY3Rpb24oXG5cdGVudGl0eVR5cGU6IEVudGl0eVR5cGUsXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHRcbik6IFJlY29yZDxzdHJpbmcsIEN1c3RvbUVsZW1lbnRGaWx0ZXJGaWVsZD4ge1xuXHRjb25zdCBmYkNvbmZpZzogRmlsdGVyTWFuaWZlc3RDb25maWd1cmF0aW9uID0gY29udmVydGVyQ29udGV4dC5nZXRNYW5pZmVzdFdyYXBwZXIoKS5nZXRGaWx0ZXJDb25maWd1cmF0aW9uKCk7XG5cdGNvbnN0IGRlZmluZWRGaWx0ZXJGaWVsZHM6IFJlY29yZDxzdHJpbmcsIEZpbHRlckZpZWxkTWFuaWZlc3RDb25maWd1cmF0aW9uPiA9IGZiQ29uZmlnPy5maWx0ZXJGaWVsZHMgfHwge307XG5cdGNvbnN0IHNlbGVjdGlvbkZpZWxkczogUmVjb3JkPHN0cmluZywgRmlsdGVyRmllbGQ+ID0gX2dldFNlbGVjdGlvbkZpZWxkc0J5UGF0aChcblx0XHRlbnRpdHlUeXBlLFxuXHRcdE9iamVjdC5rZXlzKGRlZmluZWRGaWx0ZXJGaWVsZHMpLm1hcChrZXkgPT4gS2V5SGVscGVyLmdldFBhdGhGcm9tU2VsZWN0aW9uRmllbGRLZXkoa2V5KSksXG5cdFx0dHJ1ZSxcblx0XHRjb252ZXJ0ZXJDb250ZXh0XG5cdCk7XG5cdGNvbnN0IGZpbHRlckZpZWxkczogUmVjb3JkPHN0cmluZywgQ3VzdG9tRWxlbWVudEZpbHRlckZpZWxkPiA9IHt9O1xuXG5cdGZvciAoY29uc3Qgc0tleSBpbiBkZWZpbmVkRmlsdGVyRmllbGRzKSB7XG5cdFx0Y29uc3QgZmlsdGVyRmllbGQgPSBkZWZpbmVkRmlsdGVyRmllbGRzW3NLZXldO1xuXHRcdGNvbnN0IHByb3BlcnR5TmFtZSA9IEtleUhlbHBlci5nZXRQYXRoRnJvbVNlbGVjdGlvbkZpZWxkS2V5KHNLZXkpO1xuXHRcdGNvbnN0IHNlbGVjdGlvbkZpZWxkID0gc2VsZWN0aW9uRmllbGRzW3Byb3BlcnR5TmFtZV07XG5cdFx0Y29uc3QgdHlwZSA9IGZpbHRlckZpZWxkLnR5cGUgPT09IFwiU2xvdFwiID8gZmlsdGVyRmllbGRUeXBlLlNsb3QgOiBmaWx0ZXJGaWVsZFR5cGUuRGVmYXVsdDtcblx0XHRjb25zdCB2aXN1YWxGaWx0ZXIgPVxuXHRcdFx0ZmlsdGVyRmllbGQgJiYgZmlsdGVyRmllbGQ/LnZpc3VhbEZpbHRlclxuXHRcdFx0XHQ/IGdldFZpc3VhbEZpbHRlcnMoZW50aXR5VHlwZSwgY29udmVydGVyQ29udGV4dCwgc0tleSwgZGVmaW5lZEZpbHRlckZpZWxkcylcblx0XHRcdFx0OiB1bmRlZmluZWQ7XG5cdFx0ZmlsdGVyRmllbGRzW3NLZXldID0ge1xuXHRcdFx0a2V5OiBzS2V5LFxuXHRcdFx0dHlwZTogdHlwZSxcblx0XHRcdGFubm90YXRpb25QYXRoOiBzZWxlY3Rpb25GaWVsZD8uYW5ub3RhdGlvblBhdGgsXG5cdFx0XHRjb25kaXRpb25QYXRoOiBzZWxlY3Rpb25GaWVsZD8uY29uZGl0aW9uUGF0aCB8fCBwcm9wZXJ0eU5hbWUsXG5cdFx0XHR0ZW1wbGF0ZTogZmlsdGVyRmllbGQudGVtcGxhdGUsXG5cdFx0XHRsYWJlbDogZmlsdGVyRmllbGQubGFiZWwsXG5cdFx0XHRwb3NpdGlvbjogZmlsdGVyRmllbGQucG9zaXRpb24gfHwgeyBwbGFjZW1lbnQ6IFBsYWNlbWVudC5BZnRlciB9LFxuXHRcdFx0YXZhaWxhYmlsaXR5OiBmaWx0ZXJGaWVsZC5hdmFpbGFiaWxpdHkgfHwgQXZhaWxhYmlsaXR5VHlwZS5EZWZhdWx0LFxuXHRcdFx0c2V0dGluZ3M6IGZpbHRlckZpZWxkLnNldHRpbmdzLFxuXHRcdFx0dmlzdWFsRmlsdGVyOiB2aXN1YWxGaWx0ZXJcblx0XHR9O1xuXHR9XG5cdHJldHVybiBmaWx0ZXJGaWVsZHM7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0RmlsdGVyRmllbGQgPSBmdW5jdGlvbihwcm9wZXJ0eVBhdGg6IHN0cmluZywgY29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCwgZW50aXR5VHlwZTogRW50aXR5VHlwZSkge1xuXHRyZXR1cm4gX2dldEZpbHRlckZpZWxkKHt9LCBwcm9wZXJ0eVBhdGgsIGNvbnZlcnRlckNvbnRleHQsIGVudGl0eVR5cGUpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEZpbHRlclJlc3RyaWN0aW9ucyA9IGZ1bmN0aW9uKG9GaWx0ZXJSZXN0cmljdGlvbnNBbm5vdGF0aW9uOiBhbnksIHNSZXN0cmljdGlvbjogYW55KSB7XG5cdGlmIChzUmVzdHJpY3Rpb24gPT09IFwiUmVxdWlyZWRQcm9wZXJ0aWVzXCIgfHwgc1Jlc3RyaWN0aW9uID09PSBcIk5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzXCIpIHtcblx0XHRsZXQgYVByb3BzID0gW107XG5cdFx0aWYgKG9GaWx0ZXJSZXN0cmljdGlvbnNBbm5vdGF0aW9uICYmIG9GaWx0ZXJSZXN0cmljdGlvbnNBbm5vdGF0aW9uW3NSZXN0cmljdGlvbl0pIHtcblx0XHRcdGFQcm9wcyA9IG9GaWx0ZXJSZXN0cmljdGlvbnNBbm5vdGF0aW9uW3NSZXN0cmljdGlvbl0ubWFwKGZ1bmN0aW9uKG9Qcm9wZXJ0eTogYW55KSB7XG5cdFx0XHRcdHJldHVybiBvUHJvcGVydHkuJFByb3BlcnR5UGF0aCB8fCBvUHJvcGVydHkudmFsdWU7XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0cmV0dXJuIGFQcm9wcztcblx0fSBlbHNlIGlmIChzUmVzdHJpY3Rpb24gPT09IFwiRmlsdGVyQWxsb3dlZEV4cHJlc3Npb25zXCIpIHtcblx0XHRjb25zdCBtQWxsb3dlZEV4cHJlc3Npb25zID0ge30gYXMgYW55O1xuXHRcdGlmIChvRmlsdGVyUmVzdHJpY3Rpb25zQW5ub3RhdGlvbiAmJiBvRmlsdGVyUmVzdHJpY3Rpb25zQW5ub3RhdGlvbi5GaWx0ZXJFeHByZXNzaW9uUmVzdHJpY3Rpb25zKSB7XG5cdFx0XHRvRmlsdGVyUmVzdHJpY3Rpb25zQW5ub3RhdGlvbi5GaWx0ZXJFeHByZXNzaW9uUmVzdHJpY3Rpb25zLmZvckVhY2goZnVuY3Rpb24ob1Byb3BlcnR5OiBhbnkpIHtcblx0XHRcdFx0Ly9TaW5nbGVWYWx1ZSB8IE11bHRpVmFsdWUgfCBTaW5nbGVSYW5nZSB8IE11bHRpUmFuZ2UgfCBTZWFyY2hFeHByZXNzaW9uIHwgTXVsdGlSYW5nZU9yU2VhcmNoRXhwcmVzc2lvblxuXHRcdFx0XHRpZiAobUFsbG93ZWRFeHByZXNzaW9uc1tvUHJvcGVydHkuUHJvcGVydHkudmFsdWVdKSB7XG5cdFx0XHRcdFx0bUFsbG93ZWRFeHByZXNzaW9uc1tvUHJvcGVydHkuUHJvcGVydHkudmFsdWVdLnB1c2gob1Byb3BlcnR5LkFsbG93ZWRFeHByZXNzaW9ucyk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0bUFsbG93ZWRFeHByZXNzaW9uc1tvUHJvcGVydHkuUHJvcGVydHkudmFsdWVdID0gW29Qcm9wZXJ0eS5BbGxvd2VkRXhwcmVzc2lvbnNdO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0cmV0dXJuIG1BbGxvd2VkRXhwcmVzc2lvbnM7XG5cdH1cblx0cmV0dXJuIG9GaWx0ZXJSZXN0cmljdGlvbnNBbm5vdGF0aW9uO1xufTtcblxuY29uc3QgZ2V0U2VhcmNoRmlsdGVyUHJvcGVydHlJbmZvID0gZnVuY3Rpb24oKSB7XG5cdHJldHVybiB7XG5cdFx0bmFtZTogXCIkc2VhcmNoXCIsXG5cdFx0cGF0aDogXCIkc2VhcmNoXCIsXG5cdFx0ZGF0YVR5cGU6IHNTdHJpbmdEYXRhVHlwZSxcblx0XHRtYXhDb25kaXRpb25zOiAxXG5cdH07XG59O1xuXG5jb25zdCBnZXRFZGl0U3RhdGVGaWx0ZXJQcm9wZXJ0eUluZm8gPSBmdW5jdGlvbigpIHtcblx0cmV0dXJuIHtcblx0XHRuYW1lOiBcIiRlZGl0U3RhdGVcIixcblx0XHRwYXRoOiBcIiRlZGl0U3RhdGVcIixcblx0XHRncm91cExhYmVsOiBcIlwiLFxuXHRcdGdyb3VwOiBcIlwiLFxuXHRcdGRhdGFUeXBlOiBzU3RyaW5nRGF0YVR5cGUsXG5cdFx0aGlkZGVuRmlsdGVyOiBmYWxzZVxuXHR9O1xufTtcblxuY29uc3QgZ2V0U2VhcmNoUmVzdHJpY3Rpb25zID0gZnVuY3Rpb24oY29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCkge1xuXHRyZXR1cm4gY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlTZXQoKT8uYW5ub3RhdGlvbnM/LkNhcGFiaWxpdGllcz8uU2VhcmNoUmVzdHJpY3Rpb25zO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldE5hdmlnYXRpb25SZXN0cmljdGlvbnMgPSBmdW5jdGlvbihjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LCBzTmF2aWdhdGlvblBhdGg6IHN0cmluZykge1xuXHRjb25zdCBvTmF2aWdhdGlvblJlc3RyaWN0aW9uczogYW55ID0gY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlTZXQoKT8uYW5ub3RhdGlvbnM/LkNhcGFiaWxpdGllcz8uTmF2aWdhdGlvblJlc3RyaWN0aW9ucztcblx0Y29uc3QgYVJlc3RyaWN0ZWRQcm9wZXJ0aWVzID0gb05hdmlnYXRpb25SZXN0cmljdGlvbnMgJiYgb05hdmlnYXRpb25SZXN0cmljdGlvbnMuUmVzdHJpY3RlZFByb3BlcnRpZXM7XG5cdHJldHVybiAoXG5cdFx0YVJlc3RyaWN0ZWRQcm9wZXJ0aWVzICYmXG5cdFx0YVJlc3RyaWN0ZWRQcm9wZXJ0aWVzLmZpbmQoZnVuY3Rpb24ob1Jlc3RyaWN0ZWRQcm9wZXJ0eTogYW55KSB7XG5cdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHRvUmVzdHJpY3RlZFByb3BlcnR5ICYmXG5cdFx0XHRcdG9SZXN0cmljdGVkUHJvcGVydHkuTmF2aWdhdGlvblByb3BlcnR5ICYmXG5cdFx0XHRcdChvUmVzdHJpY3RlZFByb3BlcnR5Lk5hdmlnYXRpb25Qcm9wZXJ0eS4kTmF2aWdhdGlvblByb3BlcnR5UGF0aCA9PT0gc05hdmlnYXRpb25QYXRoIHx8XG5cdFx0XHRcdFx0b1Jlc3RyaWN0ZWRQcm9wZXJ0eS5OYXZpZ2F0aW9uUHJvcGVydHkudmFsdWUgPT09IHNOYXZpZ2F0aW9uUGF0aClcblx0XHRcdCk7XG5cdFx0fSlcblx0KTtcbn07XG5cbmNvbnN0IF9mZXRjaEJhc2ljUHJvcGVydHlJbmZvID0gZnVuY3Rpb24ob0ZpbHRlckZpZWxkSW5mbzogYW55KSB7XG5cdHJldHVybiB7XG5cdFx0a2V5OiBvRmlsdGVyRmllbGRJbmZvLmtleSxcblx0XHRhbm5vdGF0aW9uUGF0aDogb0ZpbHRlckZpZWxkSW5mby5hbm5vdGF0aW9uUGF0aCxcblx0XHRjb25kaXRpb25QYXRoOiBvRmlsdGVyRmllbGRJbmZvLmNvbmRpdGlvblBhdGgsXG5cdFx0bmFtZTogb0ZpbHRlckZpZWxkSW5mby5jb25kaXRpb25QYXRoLFxuXHRcdGxhYmVsOiBvRmlsdGVyRmllbGRJbmZvLmxhYmVsLFxuXHRcdGhpZGRlbkZpbHRlcjogb0ZpbHRlckZpZWxkSW5mby5hdmFpbGFiaWxpdHkgPT09IFwiSGlkZGVuXCIsXG5cdFx0ZGlzcGxheTogXCJWYWx1ZVwiLFxuXHRcdGlzUGFyYW1ldGVyOiBvRmlsdGVyRmllbGRJbmZvLmlzUGFyYW1ldGVyLFxuXHRcdGNhc2VTZW5zaXRpdmU6IG9GaWx0ZXJGaWVsZEluZm8uY2FzZVNlbnNpdGl2ZSxcblx0XHRhdmFpbGFiaWxpdHk6IG9GaWx0ZXJGaWVsZEluZm8uYXZhaWxhYmlsaXR5LFxuXHRcdHBvc2l0aW9uOiBvRmlsdGVyRmllbGRJbmZvLnBvc2l0aW9uLFxuXHRcdHR5cGU6IG9GaWx0ZXJGaWVsZEluZm8udHlwZSxcblx0XHR0ZW1wbGF0ZTogb0ZpbHRlckZpZWxkSW5mby50ZW1wbGF0ZSxcblx0XHRtZW51OiBvRmlsdGVyRmllbGRJbmZvLm1lbnVcblx0fTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRTcGVjaWZpY0FsbG93ZWRFeHByZXNzaW9uID0gZnVuY3Rpb24oYUV4cHJlc3Npb25zOiBhbnkpIHtcblx0Y29uc3QgYUFsbG93ZWRFeHByZXNzaW9uc1ByaW9yaXR5ID0gW1xuXHRcdFwiU2luZ2xlVmFsdWVcIixcblx0XHRcIk11bHRpVmFsdWVcIixcblx0XHRcIlNpbmdsZVJhbmdlXCIsXG5cdFx0XCJNdWx0aVJhbmdlXCIsXG5cdFx0XCJTZWFyY2hFeHByZXNzaW9uXCIsXG5cdFx0XCJNdWx0aVJhbmdlT3JTZWFyY2hFeHByZXNzaW9uXCJcblx0XTtcblxuXHRhRXhwcmVzc2lvbnMuc29ydChmdW5jdGlvbihhOiBhbnksIGI6IGFueSkge1xuXHRcdHJldHVybiBhQWxsb3dlZEV4cHJlc3Npb25zUHJpb3JpdHkuaW5kZXhPZihhKSAtIGFBbGxvd2VkRXhwcmVzc2lvbnNQcmlvcml0eS5pbmRleE9mKGIpO1xuXHR9KTtcblxuXHRyZXR1cm4gYUV4cHJlc3Npb25zWzBdO1xufTtcblxuZXhwb3J0IGNvbnN0IGRpc3BsYXlNb2RlID0gZnVuY3Rpb24ob1Byb3BlcnR5QW5ub3RhdGlvbnM6IGFueSwgb0NvbGxlY3Rpb25Bbm5vdGF0aW9uczogYW55KSB7XG5cdGNvbnN0IG9UZXh0QW5ub3RhdGlvbiA9IG9Qcm9wZXJ0eUFubm90YXRpb25zPy5Db21tb24/LlRleHQsXG5cdFx0b1RleHRBcnJhbmdtZW50QW5ub3RhdGlvbiA9XG5cdFx0XHRvVGV4dEFubm90YXRpb24gJiZcblx0XHRcdCgob1Byb3BlcnR5QW5ub3RhdGlvbnMgJiYgb1Byb3BlcnR5QW5ub3RhdGlvbnM/LkNvbW1vbj8uVGV4dD8uYW5ub3RhdGlvbnM/LlVJPy5UZXh0QXJyYW5nZW1lbnQpIHx8XG5cdFx0XHRcdChvQ29sbGVjdGlvbkFubm90YXRpb25zICYmIG9Db2xsZWN0aW9uQW5ub3RhdGlvbnM/LlVJPy5UZXh0QXJyYW5nZW1lbnQpKTtcblxuXHRpZiAob1RleHRBcnJhbmdtZW50QW5ub3RhdGlvbikge1xuXHRcdGlmIChvVGV4dEFycmFuZ21lbnRBbm5vdGF0aW9uLnZhbHVlT2YoKSA9PT0gXCJVSS5UZXh0QXJyYW5nZW1lbnRUeXBlL1RleHRPbmx5XCIpIHtcblx0XHRcdHJldHVybiBcIkRlc2NyaXB0aW9uXCI7XG5cdFx0fSBlbHNlIGlmIChvVGV4dEFycmFuZ21lbnRBbm5vdGF0aW9uLnZhbHVlT2YoKSA9PT0gXCJVSS5UZXh0QXJyYW5nZW1lbnRUeXBlL1RleHRMYXN0XCIpIHtcblx0XHRcdHJldHVybiBcIlZhbHVlRGVzY3JpcHRpb25cIjtcblx0XHR9XG5cdFx0cmV0dXJuIFwiRGVzY3JpcHRpb25WYWx1ZVwiOyAvL1RleHRGaXJzdFxuXHR9XG5cdHJldHVybiBvVGV4dEFubm90YXRpb24gPyBcIkRlc2NyaXB0aW9uVmFsdWVcIiA6IFwiVmFsdWVcIjtcbn07XG5cbmNvbnN0IF9mZXRjaFByb3BlcnR5SW5mbyA9IGZ1bmN0aW9uKGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsIG9GaWx0ZXJGaWVsZEluZm86IGFueSwgb1R5cGVDb25maWc6IGFueSkge1xuXHRsZXQgb1Byb3BlcnR5SW5mbyA9IF9mZXRjaEJhc2ljUHJvcGVydHlJbmZvKG9GaWx0ZXJGaWVsZEluZm8pO1xuXHRjb25zdCBzQW5ub3RhdGlvblBhdGggPSBvRmlsdGVyRmllbGRJbmZvLmFubm90YXRpb25QYXRoO1xuXG5cdGlmICghc0Fubm90YXRpb25QYXRoKSB7XG5cdFx0cmV0dXJuIG9Qcm9wZXJ0eUluZm87XG5cdH1cblx0Y29uc3QgdGFyZ2V0UHJvcGVydHlPYmplY3QgPSBjb252ZXJ0ZXJDb250ZXh0LmdldENvbnZlcnRlckNvbnRleHRGb3Ioc0Fubm90YXRpb25QYXRoKS5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCkudGFyZ2V0T2JqZWN0O1xuXG5cdGNvbnN0IG9Qcm9wZXJ0eUFubm90YXRpb25zID0gdGFyZ2V0UHJvcGVydHlPYmplY3Q/LmFubm90YXRpb25zO1xuXHRjb25zdCBvQ29sbGVjdGlvbkFubm90YXRpb25zID0gY29udmVydGVyQ29udGV4dD8uZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpLnRhcmdldE9iamVjdD8uYW5ub3RhdGlvbnM7XG5cblx0Y29uc3Qgb0Zvcm1hdE9wdGlvbnMgPSBvVHlwZUNvbmZpZy5mb3JtYXRPcHRpb25zO1xuXHRjb25zdCBvQ29uc3RyYWludHMgPSBvVHlwZUNvbmZpZy5jb25zdHJhaW50cztcblx0b1Byb3BlcnR5SW5mbyA9IE9iamVjdC5hc3NpZ24ob1Byb3BlcnR5SW5mbywge1xuXHRcdGZvcm1hdE9wdGlvbnM6IG9Gb3JtYXRPcHRpb25zLFxuXHRcdGNvbnN0cmFpbnRzOiBvQ29uc3RyYWludHMsXG5cdFx0ZGlzcGxheTogZGlzcGxheU1vZGUob1Byb3BlcnR5QW5ub3RhdGlvbnMsIG9Db2xsZWN0aW9uQW5ub3RhdGlvbnMpXG5cdH0pO1xuXHRyZXR1cm4gb1Byb3BlcnR5SW5mbztcbn07XG5cbmV4cG9ydCBjb25zdCBpc011bHRpVmFsdWUgPSBmdW5jdGlvbihvUHJvcGVydHk6IGFueSkge1xuXHRsZXQgYklzTXVsdGlWYWx1ZSA9IHRydWU7XG5cdC8vU2luZ2xlVmFsdWUgfCBNdWx0aVZhbHVlIHwgU2luZ2xlUmFuZ2UgfCBNdWx0aVJhbmdlIHwgU2VhcmNoRXhwcmVzc2lvbiB8IE11bHRpUmFuZ2VPclNlYXJjaEV4cHJlc3Npb25cblx0c3dpdGNoIChvUHJvcGVydHkuZmlsdGVyRXhwcmVzc2lvbikge1xuXHRcdGNhc2UgXCJTZWFyY2hFeHByZXNzaW9uXCI6XG5cdFx0Y2FzZSBcIlNpbmdsZVJhbmdlXCI6XG5cdFx0Y2FzZSBcIlNpbmdsZVZhbHVlXCI6XG5cdFx0XHRiSXNNdWx0aVZhbHVlID0gZmFsc2U7XG5cdFx0XHRicmVhaztcblx0XHRkZWZhdWx0OlxuXHRcdFx0YnJlYWs7XG5cdH1cblx0aWYgKG9Qcm9wZXJ0eS50eXBlICYmIG9Qcm9wZXJ0eS50eXBlLmluZGV4T2YoXCJCb29sZWFuXCIpID4gMCkge1xuXHRcdGJJc011bHRpVmFsdWUgPSBmYWxzZTtcblx0fVxuXHRyZXR1cm4gYklzTXVsdGlWYWx1ZTtcbn07XG5cbmNvbnN0IGdldEFubm90YXRlZFNlbGVjdGlvbkZpZWxkRGF0YSA9IGZ1bmN0aW9uKFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LFxuXHRsclRhYmxlczogVGFibGVWaXN1YWxpemF0aW9uW10gPSBbXSxcblx0YW5ub3RhdGlvblBhdGg6IHN0cmluZyA9IFwiXCJcbikge1xuXHQvLyBGZXRjaCBhbGwgc2VsZWN0aW9uVmFyaWFudHMgZGVmaW5lZCBpbiB0aGUgZGlmZmVyZW50IHZpc3VhbGl6YXRpb25zIGFuZCBkaWZmZXJlbnQgdmlld3MgKG11bHRpIHRhYmxlIG1vZGUpXG5cdGNvbnN0IHNlbGVjdGlvblZhcmlhbnRzOiBTZWxlY3Rpb25WYXJpYW50Q29uZmlndXJhdGlvbltdID0gZ2V0U2VsZWN0aW9uVmFyaWFudHMobHJUYWJsZXMsIGNvbnZlcnRlckNvbnRleHQpO1xuXG5cdC8vIGNyZWF0ZSBhIG1hcCBvZiBwcm9wZXJ0aWVzIHRvIGJlIHVzZWQgaW4gc2VsZWN0aW9uIHZhcmlhbnRzXG5cdGNvbnN0IGV4Y2x1ZGVkRmlsdGVyUHJvcGVydGllczogUmVjb3JkPHN0cmluZywgYm9vbGVhbj4gPSBnZXRFeGNsdWRlZEZpbHRlclByb3BlcnRpZXMoc2VsZWN0aW9uVmFyaWFudHMpO1xuXHRjb25zdCBlbnRpdHlUeXBlID0gY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlUeXBlKCk7XG5cdC8vRmlsdGVycyB3aGljaCBoYXMgdG8gYmUgYWRkZWQgd2hpY2ggaXMgcGFydCBvZiBTVi9EZWZhdWx0IGFubm90YXRpb25zIGJ1dCBub3QgcHJlc2VudCBpbiB0aGUgU2VsZWN0aW9uRmllbGRzXG5cdGNvbnN0IGFubm90YXRlZFNlbGVjdGlvbkZpZWxkcyA9ICgoYW5ub3RhdGlvblBhdGggJiYgY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlUeXBlQW5ub3RhdGlvbihhbm5vdGF0aW9uUGF0aCk/LmFubm90YXRpb24pIHx8XG5cdFx0ZW50aXR5VHlwZS5hbm5vdGF0aW9ucz8uVUk/LlNlbGVjdGlvbkZpZWxkcyB8fFxuXHRcdFtdKSBhcyBQcm9wZXJ0eVBhdGhbXTtcblxuXHQvLyBjcmVhdGUgYSBtYXAgb2YgYWxsIHBvdGVudGlhbCBmaWx0ZXIgZmllbGRzIGJhc2VkIG9uLi4uXG5cdGNvbnN0IGZpbHRlckZpZWxkczogUmVjb3JkPHN0cmluZywgRmlsdGVyRmllbGQ+ID0ge1xuXHRcdC8vIC4uLm5vbiBoaWRkZW4gcHJvcGVydGllcyBvZiB0aGUgZW50aXR5XG5cdFx0Li4uX2dldFNlbGVjdGlvbkZpZWxkcyhlbnRpdHlUeXBlLCBcIlwiLCBlbnRpdHlUeXBlLmVudGl0eVByb3BlcnRpZXMsIGZhbHNlLCBjb252ZXJ0ZXJDb250ZXh0KSxcblx0XHQvLyAuLi5hZGRpdGlvbmFsIG1hbmlmZXN0IGRlZmluZWQgbmF2aWdhdGlvbiBwcm9wZXJ0aWVzXG5cdFx0Li4uX2dldFNlbGVjdGlvbkZpZWxkc0J5UGF0aChcblx0XHRcdGVudGl0eVR5cGUsXG5cdFx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0V3JhcHBlcigpLmdldEZpbHRlckNvbmZpZ3VyYXRpb24oKS5uYXZpZ2F0aW9uUHJvcGVydGllcyxcblx0XHRcdGZhbHNlLFxuXHRcdFx0Y29udmVydGVyQ29udGV4dFxuXHRcdClcblx0fTtcblxuXHRjb25zdCBwcm9wZXJ0eUluZm9GaWVsZHM6IGFueSA9XG5cdFx0YW5ub3RhdGVkU2VsZWN0aW9uRmllbGRzPy5yZWR1Y2UoKHNlbGVjdGlvbkZpZWxkczogRmlsdGVyRmllbGRbXSwgc2VsZWN0aW9uRmllbGQpID0+IHtcblx0XHRcdGNvbnN0IHByb3BlcnR5UGF0aCA9IHNlbGVjdGlvbkZpZWxkLnZhbHVlO1xuXHRcdFx0aWYgKCEocHJvcGVydHlQYXRoIGluIGV4Y2x1ZGVkRmlsdGVyUHJvcGVydGllcykpIHtcblx0XHRcdFx0Y29uc3QgZmlsdGVyRmllbGQ6IEZpbHRlckZpZWxkIHwgdW5kZWZpbmVkID0gX2dldEZpbHRlckZpZWxkKGZpbHRlckZpZWxkcywgcHJvcGVydHlQYXRoLCBjb252ZXJ0ZXJDb250ZXh0LCBlbnRpdHlUeXBlKTtcblx0XHRcdFx0aWYgKGZpbHRlckZpZWxkKSB7XG5cdFx0XHRcdFx0ZmlsdGVyRmllbGQuZ3JvdXAgPSBcIlwiO1xuXHRcdFx0XHRcdGZpbHRlckZpZWxkLmdyb3VwTGFiZWwgPSBcIlwiO1xuXHRcdFx0XHRcdHNlbGVjdGlvbkZpZWxkcy5wdXNoKGZpbHRlckZpZWxkKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHNlbGVjdGlvbkZpZWxkcztcblx0XHR9LCBbXSkgfHwgW107XG5cblx0cmV0dXJuIHtcblx0XHRleGNsdWRlZEZpbHRlclByb3BlcnRpZXM6IGV4Y2x1ZGVkRmlsdGVyUHJvcGVydGllcyxcblx0XHRlbnRpdHlUeXBlOiBlbnRpdHlUeXBlLFxuXHRcdGFubm90YXRlZFNlbGVjdGlvbkZpZWxkczogYW5ub3RhdGVkU2VsZWN0aW9uRmllbGRzLFxuXHRcdGZpbHRlckZpZWxkczogZmlsdGVyRmllbGRzLFxuXHRcdHByb3BlcnR5SW5mb0ZpZWxkczogcHJvcGVydHlJbmZvRmllbGRzXG5cdH07XG59O1xuZXhwb3J0IGNvbnN0IHByb2Nlc3NTZWxlY3Rpb25GaWVsZHMgPSBmdW5jdGlvbihwcm9wZXJ0eUluZm9GaWVsZHM6IGFueSwgY29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCkge1xuXHQvL2dldCBUeXBlQ29uZmlnIGZ1bmN0aW9uXG5cdGNvbnN0IGFUeXBlQ29uZmlnOiBhbnkgPSBbXTtcblx0Y29uc3Qgc2VsZWN0aW9uRmllbGRUeXBlczogYW55ID0gW107XG5cdGNvbnN0IF9mblR5cGVDb25maWcgPSBmdW5jdGlvbihwcm9wZXJ0eTogUHJvcGVydHkpIHtcblx0XHRjb25zdCBvVHlwZUNvbmZpZyA9IGdldFR5cGVDb25maWcocHJvcGVydHksIHVuZGVmaW5lZCk7XG5cdFx0c2VsZWN0aW9uRmllbGRUeXBlcy5wdXNoKHByb3BlcnR5Py50eXBlKTtcblx0XHRpZiAocHJvcGVydHk/LnR5cGUgPT09IHNFZG1TdHJpbmcgJiYgKCFvVHlwZUNvbmZpZy5jb25zdHJhaW50cy5udWxsYWJsZSB8fCBvVHlwZUNvbmZpZy5jb25zdHJhaW50cy5udWxsYWJsZSA9PT0gdHJ1ZSkpIHtcblx0XHRcdG9UeXBlQ29uZmlnLmZvcm1hdE9wdGlvbnMucGFyc2VLZWVwc0VtcHR5U3RyaW5nID0gZmFsc2U7XG5cdFx0fVxuXHRcdGFUeXBlQ29uZmlnLnB1c2gob1R5cGVDb25maWcpO1xuXHR9O1xuXG5cdC8vYWRkIHR5cGVDb25maWdcblx0cHJvcGVydHlJbmZvRmllbGRzLmZvckVhY2goZnVuY3Rpb24ocGFyYW1ldGVyRmllbGQ6IGFueSkge1xuXHRcdGlmIChwYXJhbWV0ZXJGaWVsZC5hbm5vdGF0aW9uUGF0aCkge1xuXHRcdFx0Y29uc3QgcHJvcGVydHlDb252ZXJ0eUNvbnRleHQgPSBjb252ZXJ0ZXJDb250ZXh0LmdldENvbnZlcnRlckNvbnRleHRGb3IocGFyYW1ldGVyRmllbGQuYW5ub3RhdGlvblBhdGgpO1xuXHRcdFx0Y29uc3QgcHJvcGVydHlUYXJnZXRPYmplY3QgPSBwcm9wZXJ0eUNvbnZlcnR5Q29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCkudGFyZ2V0T2JqZWN0O1xuXHRcdFx0X2ZuVHlwZUNvbmZpZyhwcm9wZXJ0eVRhcmdldE9iamVjdCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHNlbGVjdGlvbkZpZWxkVHlwZXMucHVzaChzRWRtU3RyaW5nKTtcblx0XHRcdGFUeXBlQ29uZmlnLnB1c2goeyB0eXBlOiBzU3RyaW5nRGF0YVR5cGUgfSk7XG5cdFx0fVxuXHR9KTtcblxuXHQvLyBmaWx0ZXJSZXN0cmljdGlvbnNcblx0Y29uc3Qgb0ZpbHRlclJlc3RyaWN0aW9ucyA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0KCk/LmFubm90YXRpb25zPy5DYXBhYmlsaXRpZXM/LkZpbHRlclJlc3RyaWN0aW9ucztcblx0Y29uc3Qgb1JldCA9IHt9IGFzIGFueTtcblx0b1JldFtcIlJlcXVpcmVkUHJvcGVydGllc1wiXSA9IGdldEZpbHRlclJlc3RyaWN0aW9ucyhvRmlsdGVyUmVzdHJpY3Rpb25zLCBcIlJlcXVpcmVkUHJvcGVydGllc1wiKSB8fCBbXTtcblx0b1JldFtcIk5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzXCJdID0gZ2V0RmlsdGVyUmVzdHJpY3Rpb25zKG9GaWx0ZXJSZXN0cmljdGlvbnMsIFwiTm9uRmlsdGVyYWJsZVByb3BlcnRpZXNcIikgfHwgW107XG5cdG9SZXRbXCJGaWx0ZXJBbGxvd2VkRXhwcmVzc2lvbnNcIl0gPSBnZXRGaWx0ZXJSZXN0cmljdGlvbnMob0ZpbHRlclJlc3RyaWN0aW9ucywgXCJGaWx0ZXJBbGxvd2VkRXhwcmVzc2lvbnNcIikgfHwge307XG5cblx0Y29uc3Qgc0VudGl0eVNldFBhdGggPSBjb252ZXJ0ZXJDb250ZXh0LmdldENvbnRleHRQYXRoKCk7XG5cdGNvbnN0IGFQYXRoUGFydHMgPSBzRW50aXR5U2V0UGF0aC5zcGxpdChcIi9cIik7XG5cdGlmIChhUGF0aFBhcnRzLmxlbmd0aCA+IDIpIHtcblx0XHRjb25zdCBzTmF2aWdhdGlvblBhdGggPSBhUGF0aFBhcnRzW2FQYXRoUGFydHMubGVuZ3RoIC0gMV07XG5cdFx0YVBhdGhQYXJ0cy5zcGxpY2UoLTEsIDEpO1xuXHRcdGNvbnN0IG9OYXZpZ2F0aW9uUmVzdHJpY3Rpb25zID0gZ2V0TmF2aWdhdGlvblJlc3RyaWN0aW9ucyhjb252ZXJ0ZXJDb250ZXh0LCBzTmF2aWdhdGlvblBhdGgpO1xuXHRcdGNvbnN0IG9OYXZpZ2F0aW9uRmlsdGVyUmVzdHJpY3Rpb25zID0gb05hdmlnYXRpb25SZXN0cmljdGlvbnMgJiYgb05hdmlnYXRpb25SZXN0cmljdGlvbnMuRmlsdGVyUmVzdHJpY3Rpb25zO1xuXHRcdG9SZXQuUmVxdWlyZWRQcm9wZXJ0aWVzLmNvbmNhdChnZXRGaWx0ZXJSZXN0cmljdGlvbnMob05hdmlnYXRpb25GaWx0ZXJSZXN0cmljdGlvbnMsIFwiUmVxdWlyZWRQcm9wZXJ0aWVzXCIpIHx8IFtdKTtcblx0XHRvUmV0Lk5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzLmNvbmNhdChnZXRGaWx0ZXJSZXN0cmljdGlvbnMob05hdmlnYXRpb25GaWx0ZXJSZXN0cmljdGlvbnMsIFwiTm9uRmlsdGVyYWJsZVByb3BlcnRpZXNcIikgfHwgW10pO1xuXHRcdG9SZXQuRmlsdGVyQWxsb3dlZEV4cHJlc3Npb25zID0ge1xuXHRcdFx0Li4uKGdldEZpbHRlclJlc3RyaWN0aW9ucyhvTmF2aWdhdGlvbkZpbHRlclJlc3RyaWN0aW9ucywgXCJGaWx0ZXJBbGxvd2VkRXhwcmVzc2lvbnNcIikgfHwge30pLFxuXHRcdFx0Li4ub1JldC5GaWx0ZXJBbGxvd2VkRXhwcmVzc2lvbnNcblx0XHR9O1xuXHR9XG5cdGNvbnN0IGlzQ2FzZVNlbnNpdGl2ZSA9IGlzRmlsdGVyaW5nQ2FzZVNlbnNpdGl2ZShjb252ZXJ0ZXJDb250ZXh0KTtcblx0Y29uc3QgYVJlcXVpcmVkUHJvcHMgPSBvUmV0LlJlcXVpcmVkUHJvcGVydGllcztcblx0Y29uc3QgYU5vbkZpbHRlcmFibGVQcm9wcyA9IG9SZXQuTm9uRmlsdGVyYWJsZVByb3BlcnRpZXM7XG5cdGxldCBvUHJvcGVydHlJbmZvO1xuXHRjb25zdCBhRmV0Y2hlZFByb3BlcnRpZXM6IGFueSA9IFtdO1xuXG5cdC8vIHByb2Nlc3MgdGhlIGZpZWxkcyB0byBhZGQgbmVjZXNzYXJ5IHByb3BlcnRpZXNcblx0T2JqZWN0LmtleXMocHJvcGVydHlJbmZvRmllbGRzKS5mb3JFYWNoKGZ1bmN0aW9uKHNGaWx0ZXJGaWVsZEtleTogc3RyaW5nKSB7XG5cdFx0Y29uc3Qgb0NvbnZlcnRlZFByb3BlcnR5ID0gcHJvcGVydHlJbmZvRmllbGRzW3NGaWx0ZXJGaWVsZEtleV07XG5cdFx0bGV0IHNQcm9wZXJ0eVBhdGg7XG5cdFx0aWYgKG9Db252ZXJ0ZWRQcm9wZXJ0eS5jb25kaXRpb25QYXRoKSB7XG5cdFx0XHRzUHJvcGVydHlQYXRoID0gb0NvbnZlcnRlZFByb3BlcnR5LmNvbmRpdGlvblBhdGgucmVwbGFjZSgvXFwrfFxcKi9nLCBcIlwiKTtcblx0XHR9XG5cdFx0aWYgKGFOb25GaWx0ZXJhYmxlUHJvcHMuaW5kZXhPZihzUHJvcGVydHlQYXRoKSA9PT0gLTEpIHtcblx0XHRcdG9Qcm9wZXJ0eUluZm8gPSBfZmV0Y2hQcm9wZXJ0eUluZm8oY29udmVydGVyQ29udGV4dCwgb0NvbnZlcnRlZFByb3BlcnR5LCBhVHlwZUNvbmZpZ1tzRmlsdGVyRmllbGRLZXldKTtcblx0XHRcdGlmIChvUHJvcGVydHlJbmZvKSB7XG5cdFx0XHRcdG9Qcm9wZXJ0eUluZm8gPSBPYmplY3QuYXNzaWduKG9Qcm9wZXJ0eUluZm8sIHtcblx0XHRcdFx0XHRtYXhDb25kaXRpb25zOiAhb1Byb3BlcnR5SW5mby5pc1BhcmFtZXRlciAmJiBpc011bHRpVmFsdWUob1Byb3BlcnR5SW5mbykgPyAtMSA6IDEsXG5cdFx0XHRcdFx0cmVxdWlyZWQ6IG9Qcm9wZXJ0eUluZm8uaXNQYXJhbWV0ZXIgfHwgYVJlcXVpcmVkUHJvcHMuaW5kZXhPZihzUHJvcGVydHlQYXRoKSA+PSAwLFxuXHRcdFx0XHRcdGNhc2VTZW5zaXRpdmU6IGlzQ2FzZVNlbnNpdGl2ZSxcblx0XHRcdFx0XHRkYXRhVHlwZTogc2VsZWN0aW9uRmllbGRUeXBlc1tzRmlsdGVyRmllbGRLZXldXG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdGFGZXRjaGVkUHJvcGVydGllcy5wdXNoKG9Qcm9wZXJ0eUluZm8pO1xuXHRcdFx0fVxuXHRcdH1cblx0fSk7XG5cblx0Ly9hZGQgZWRpdFxuXHRpZiAoY29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCkudGFyZ2V0T2JqZWN0Py5hbm5vdGF0aW9ucz8uQ29tbW9uPy5EcmFmdFJvb3QpIHtcblx0XHRhRmV0Y2hlZFByb3BlcnRpZXMucHVzaChnZXRFZGl0U3RhdGVGaWx0ZXJQcm9wZXJ0eUluZm8oKSk7XG5cdH1cblx0Ly8gYWRkIHNlYXJjaFxuXHRjb25zdCBzZWFyY2hSZXN0cmljdGlvbnMgPSBnZXRTZWFyY2hSZXN0cmljdGlvbnMoY29udmVydGVyQ29udGV4dCk7XG5cdGNvbnN0IGhpZGVCYXNpY1NlYXJjaCA9IEJvb2xlYW4oc2VhcmNoUmVzdHJpY3Rpb25zICYmICFzZWFyY2hSZXN0cmljdGlvbnMuU2VhcmNoYWJsZSk7XG5cdGlmIChzRW50aXR5U2V0UGF0aCAmJiBoaWRlQmFzaWNTZWFyY2ggIT09IHRydWUpIHtcblx0XHRpZiAoIXNlYXJjaFJlc3RyaWN0aW9ucyB8fCBzZWFyY2hSZXN0cmljdGlvbnM/LlNlYXJjaGFibGUpIHtcblx0XHRcdGFGZXRjaGVkUHJvcGVydGllcy5wdXNoKGdldFNlYXJjaEZpbHRlclByb3BlcnR5SW5mbygpKTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gYUZldGNoZWRQcm9wZXJ0aWVzO1xufTtcblxuZXhwb3J0IGNvbnN0IGluc2VydEN1c3RvbU1hbmlmZXN0RWxlbWVudHMgPSBmdW5jdGlvbihcblx0ZmlsdGVyRmllbGRzOiBGaWx0ZXJGaWVsZFtdLFxuXHRlbnRpdHlUeXBlOiBFbnRpdHlUeXBlLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0XG4pIHtcblx0cmV0dXJuIGluc2VydEN1c3RvbUVsZW1lbnRzKGZpbHRlckZpZWxkcywgZ2V0TWFuaWZlc3RGaWx0ZXJGaWVsZHMoZW50aXR5VHlwZSwgY29udmVydGVyQ29udGV4dCksIHtcblx0XHRcImF2YWlsYWJpbGl0eVwiOiBcIm92ZXJ3cml0ZVwiLFxuXHRcdGxhYmVsOiBcIm92ZXJ3cml0ZVwiLFxuXHRcdHR5cGU6IFwib3ZlcndyaXRlXCIsXG5cdFx0cG9zaXRpb246IFwib3ZlcndyaXRlXCIsXG5cdFx0dGVtcGxhdGU6IFwib3ZlcndyaXRlXCIsXG5cdFx0c2V0dGluZ3M6IFwib3ZlcndyaXRlXCIsXG5cdFx0dmlzdWFsRmlsdGVyOiBcIm92ZXJ3cml0ZVwiXG5cdH0pO1xufTtcblxuLyoqXG4gKiBSZXRyaWV2ZSB0aGUgY29uZmlndXJhdGlvbiBmb3IgdGhlIHNlbGVjdGlvbiBmaWVsZHMgdGhhdCB3aWxsIGJlIHVzZWQgd2l0aGluIHRoZSBmaWx0ZXIgYmFyXG4gKiBUaGlzIGNvbmZpZ3VyYXRpb24gdGFrZXMgaW50byBhY2NvdW50IGFubm90YXRpb24gYW5kIHRoZSBzZWxlY3Rpb24gdmFyaWFudHMuXG4gKiBAcGFyYW0ge0NvbnZlcnRlckNvbnRleHR9IGNvbnZlcnRlckNvbnRleHRcbiAqIEBwYXJhbSB7VGFibGVWaXN1YWxpemF0aW9uW119IGxyVGFibGVzXG4gKiBAcGFyYW0ge3N0cmluZ30gYW5ub3RhdGlvblBhdGhcbiAqIEByZXR1cm5zIHtGaWx0ZXJTZWxlY3Rpb25GaWVsZFtdfSBBbiBhcnJheSBvZiBzZWxlY3Rpb24gZmllbGRzXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRTZWxlY3Rpb25GaWVsZHMgPSBmdW5jdGlvbihcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCxcblx0bHJUYWJsZXM6IFRhYmxlVmlzdWFsaXphdGlvbltdID0gW10sXG5cdGFubm90YXRpb25QYXRoOiBzdHJpbmcgPSBcIlwiXG4pOiBhbnkge1xuXHRjb25zdCBvQW5ub3RhdGVkU2VsZWN0aW9uRmllbGREYXRhID0gZ2V0QW5ub3RhdGVkU2VsZWN0aW9uRmllbGREYXRhKGNvbnZlcnRlckNvbnRleHQsIGxyVGFibGVzLCBhbm5vdGF0aW9uUGF0aCk7XG5cdGNvbnN0IHBhcmFtZXRlckZpZWxkcyA9IF9nZXRQYXJhbWV0ZXJGaWVsZHMoY29udmVydGVyQ29udGV4dCk7XG5cdGxldCBwcm9wZXJ0eUluZm9GaWVsZHM6IEZpbHRlckZpZWxkW10gPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG9Bbm5vdGF0ZWRTZWxlY3Rpb25GaWVsZERhdGEucHJvcGVydHlJbmZvRmllbGRzKSk7XG5cdGNvbnN0IGVudGl0eVR5cGUgPSBvQW5ub3RhdGVkU2VsZWN0aW9uRmllbGREYXRhLmVudGl0eVR5cGU7XG5cblx0cHJvcGVydHlJbmZvRmllbGRzID0gcGFyYW1ldGVyRmllbGRzLmNvbmNhdChwcm9wZXJ0eUluZm9GaWVsZHMpO1xuXG5cdHByb3BlcnR5SW5mb0ZpZWxkcyA9IGluc2VydEN1c3RvbU1hbmlmZXN0RWxlbWVudHMocHJvcGVydHlJbmZvRmllbGRzLCBlbnRpdHlUeXBlLCBjb252ZXJ0ZXJDb250ZXh0KTtcblxuXHRjb25zdCBhRmV0Y2hlZFByb3BlcnRpZXMgPSBwcm9jZXNzU2VsZWN0aW9uRmllbGRzKHByb3BlcnR5SW5mb0ZpZWxkcywgY29udmVydGVyQ29udGV4dCk7XG5cdGFGZXRjaGVkUHJvcGVydGllcy5zb3J0KGZ1bmN0aW9uKGE6IGFueSwgYjogYW55KSB7XG5cdFx0aWYgKGEuZ3JvdXBMYWJlbCA9PT0gdW5kZWZpbmVkIHx8IGEuZ3JvdXBMYWJlbCA9PT0gbnVsbCkge1xuXHRcdFx0cmV0dXJuIC0xO1xuXHRcdH1cblx0XHRpZiAoYi5ncm91cExhYmVsID09PSB1bmRlZmluZWQgfHwgYi5ncm91cExhYmVsID09PSBudWxsKSB7XG5cdFx0XHRyZXR1cm4gMTtcblx0XHR9XG5cdFx0cmV0dXJuIGEuZ3JvdXBMYWJlbC5sb2NhbGVDb21wYXJlKGIuZ3JvdXBMYWJlbCk7XG5cdH0pO1xuXG5cdGxldCBzRmV0Y2hQcm9wZXJ0aWVzID0gSlNPTi5zdHJpbmdpZnkoYUZldGNoZWRQcm9wZXJ0aWVzKTtcblx0c0ZldGNoUHJvcGVydGllcyA9IHNGZXRjaFByb3BlcnRpZXMucmVwbGFjZSgvXFx7L2csIFwiXFxcXHtcIik7XG5cdHNGZXRjaFByb3BlcnRpZXMgPSBzRmV0Y2hQcm9wZXJ0aWVzLnJlcGxhY2UoL1xcfS9nLCBcIlxcXFx9XCIpO1xuXHRjb25zdCBzUHJvcGVydHlJbmZvID0gc0ZldGNoUHJvcGVydGllcztcblx0Ly8gZW5kIG9mIHByb3BlcnR5RmllbGRzIHByb2Nlc3NpbmdcblxuXHQvLyB0byBwb3B1bGF0ZSBzZWxlY3Rpb24gZmllbGRzXG5cdGxldCBwcm9wU2VsZWN0aW9uRmllbGRzOiBGaWx0ZXJGaWVsZFtdID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShvQW5ub3RhdGVkU2VsZWN0aW9uRmllbGREYXRhLnByb3BlcnR5SW5mb0ZpZWxkcykpO1xuXHRwcm9wU2VsZWN0aW9uRmllbGRzID0gcGFyYW1ldGVyRmllbGRzLmNvbmNhdChwcm9wU2VsZWN0aW9uRmllbGRzKTtcblx0Ly8gY3JlYXRlIGEgbWFwIG9mIHByb3BlcnRpZXMgdG8gYmUgdXNlZCBpbiBzZWxlY3Rpb24gdmFyaWFudHNcblx0Y29uc3QgZXhjbHVkZWRGaWx0ZXJQcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPiA9IG9Bbm5vdGF0ZWRTZWxlY3Rpb25GaWVsZERhdGEuZXhjbHVkZWRGaWx0ZXJQcm9wZXJ0aWVzO1xuXHRjb25zdCBmaWx0ZXJGYWNldHMgPSBlbnRpdHlUeXBlPy5hbm5vdGF0aW9ucz8uVUk/LkZpbHRlckZhY2V0cztcblx0bGV0IGZpbHRlckZhY2V0TWFwOiBSZWNvcmQ8c3RyaW5nLCBGaWx0ZXJHcm91cD4gPSB7fTtcblxuXHRjb25zdCBhRmllbGRHcm91cHMgPSBjb252ZXJ0ZXJDb250ZXh0LmdldEFubm90YXRpb25zQnlUZXJtKFwiVUlcIiwgVUlBbm5vdGF0aW9uVGVybXMuRmllbGRHcm91cCk7XG5cblx0aWYgKGZpbHRlckZhY2V0cyA9PT0gdW5kZWZpbmVkIHx8IGZpbHRlckZhY2V0cy5sZW5ndGggPCAwKSB7XG5cdFx0Zm9yIChjb25zdCBpIGluIGFGaWVsZEdyb3Vwcykge1xuXHRcdFx0ZmlsdGVyRmFjZXRNYXAgPSB7XG5cdFx0XHRcdC4uLmZpbHRlckZhY2V0TWFwLFxuXHRcdFx0XHQuLi5nZXRGaWVsZEdyb3VwRmlsdGVyR3JvdXBzKGFGaWVsZEdyb3Vwc1tpXSBhcyBBbm5vdGF0aW9uVGVybTxGaWVsZEdyb3VwVHlwZT4pXG5cdFx0XHR9O1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHRmaWx0ZXJGYWNldE1hcCA9IGZpbHRlckZhY2V0cy5yZWR1Y2UoKHByZXZpb3VzVmFsdWU6IFJlY29yZDxzdHJpbmcsIEZpbHRlckdyb3VwPiwgZmlsdGVyRmFjZXQ6IFJlZmVyZW5jZUZhY2V0VHlwZXMpID0+IHtcblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgKGZpbHRlckZhY2V0LlRhcmdldC4kdGFyZ2V0IGFzIEZpZWxkR3JvdXApLkRhdGEubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0cHJldmlvdXNWYWx1ZVsoKGZpbHRlckZhY2V0LlRhcmdldC4kdGFyZ2V0IGFzIEZpZWxkR3JvdXApLkRhdGFbaV0gYXMgRGF0YUZpZWxkVHlwZXMpLlZhbHVlLnBhdGhdID0ge1xuXHRcdFx0XHRcdGdyb3VwOiBmaWx0ZXJGYWNldD8uSUQ/LnRvU3RyaW5nKCksXG5cdFx0XHRcdFx0Z3JvdXBMYWJlbDogZmlsdGVyRmFjZXQ/LkxhYmVsPy50b1N0cmluZygpXG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gcHJldmlvdXNWYWx1ZTtcblx0XHR9LCB7fSk7XG5cdH1cblxuXHRsZXQgYVNlbGVjdE9wdGlvbnM6IGFueVtdID0gW107XG5cdGNvbnN0IHNlbGVjdGlvblZhcmlhbnQgPSBnZXRTZWxlY3Rpb25WYXJpYW50KGVudGl0eVR5cGUsIGNvbnZlcnRlckNvbnRleHQpO1xuXHRpZiAoc2VsZWN0aW9uVmFyaWFudCkge1xuXHRcdGFTZWxlY3RPcHRpb25zID0gc2VsZWN0aW9uVmFyaWFudC5TZWxlY3RPcHRpb25zO1xuXHR9XG5cblx0Ly8gY3JlYXRlIGEgbWFwIG9mIGFsbCBwb3RlbnRpYWwgZmlsdGVyIGZpZWxkcyBiYXNlZCBvbi4uLlxuXHRjb25zdCBmaWx0ZXJGaWVsZHM6IFJlY29yZDxzdHJpbmcsIEZpbHRlckZpZWxkPiA9IG9Bbm5vdGF0ZWRTZWxlY3Rpb25GaWVsZERhdGEuZmlsdGVyRmllbGRzO1xuXG5cdC8vRmlsdGVycyB3aGljaCBoYXMgdG8gYmUgYWRkZWQgd2hpY2ggaXMgcGFydCBvZiBTVi9EZWZhdWx0IGFubm90YXRpb25zIGJ1dCBub3QgcHJlc2VudCBpbiB0aGUgU2VsZWN0aW9uRmllbGRzXG5cdGNvbnN0IGFubm90YXRlZFNlbGVjdGlvbkZpZWxkcyA9IG9Bbm5vdGF0ZWRTZWxlY3Rpb25GaWVsZERhdGEuYW5ub3RhdGVkU2VsZWN0aW9uRmllbGRzO1xuXHRjb25zdCBkZWZhdWx0RmlsdGVycyA9IF9nZXREZWZhdWx0RmlsdGVyRmllbGRzKFxuXHRcdGZpbHRlckZpZWxkcyxcblx0XHRhU2VsZWN0T3B0aW9ucyxcblx0XHRlbnRpdHlUeXBlLFxuXHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0ZXhjbHVkZWRGaWx0ZXJQcm9wZXJ0aWVzLFxuXHRcdGFubm90YXRlZFNlbGVjdGlvbkZpZWxkc1xuXHQpO1xuXG5cdC8vIGZpbmFsbHkgY3JlYXRlIGZpbmFsIGxpc3Qgb2YgZmlsdGVyIGZpZWxkcyBieSBhZGRpbmcgdGhlIFNlbGVjdGlvbkZpZWxkcyBmaXJzdCAob3JkZXIgbWF0dGVycykuLi5cblx0bGV0IGFsbEZpbHRlcnMgPSBwcm9wU2VsZWN0aW9uRmllbGRzXG5cdFx0Ly8gVG8gYWRkIHRoZSBGaWx0ZXJGaWVsZCB3aGljaCBpcyBub3QgcGFydCBvZiB0aGUgU2VsZWN0aW9uIEZpZWxkcyBidXQgdGhlIHByb3BlcnR5IGlzIG1lbnRpb25lZCBpbiB0aGUgU2VsZWN0aW9uIFZhcmlhbnRcblx0XHQuY29uY2F0KGRlZmF1bHRGaWx0ZXJzIHx8IFtdKVxuXHRcdC8vIC4uLmFuZCBhZGRpbmcgcmVtYWluaW5nIGZpbHRlciBmaWVsZHMsIHRoYXQgYXJlIG5vdCB1c2VkIGluIGEgU2VsZWN0aW9uVmFyaWFudCAob3JkZXIgZG9lc24ndCBtYXR0ZXIpXG5cdFx0LmNvbmNhdChcblx0XHRcdE9iamVjdC5rZXlzKGZpbHRlckZpZWxkcylcblx0XHRcdFx0LmZpbHRlcihwcm9wZXJ0eVBhdGggPT4gIShwcm9wZXJ0eVBhdGggaW4gZXhjbHVkZWRGaWx0ZXJQcm9wZXJ0aWVzKSlcblx0XHRcdFx0Lm1hcChwcm9wZXJ0eVBhdGggPT4ge1xuXHRcdFx0XHRcdHJldHVybiBPYmplY3QuYXNzaWduKGZpbHRlckZpZWxkc1twcm9wZXJ0eVBhdGhdLCBmaWx0ZXJGYWNldE1hcFtwcm9wZXJ0eVBhdGhdKTtcblx0XHRcdFx0fSlcblx0XHQpO1xuXHRjb25zdCBzQ29udGV4dFBhdGggPSBjb252ZXJ0ZXJDb250ZXh0LmdldENvbnRleHRQYXRoKCk7XG5cblx0Ly9pZiBhbGwgdGFibGVzIGFyZSBhbmFseXRpY2FsIHRhYmxlcyBcImFnZ3JlZ2F0YWJsZVwiIHByb3BlcnRpZXMgbXVzdCBiZSBleGNsdWRlZFxuXHRpZiAoY2hlY2tBbGxUYWJsZUZvckVudGl0eVNldEFyZUFuYWx5dGljYWwobHJUYWJsZXMsIHNDb250ZXh0UGF0aCkpIHtcblx0XHQvLyBDdXJyZW50bHkgYWxsIGFncmVnYXRlcyBhcmUgcm9vdCBlbnRpdHkgcHJvcGVydGllcyAobm8gcHJvcGVydGllcyBjb21pbmcgZnJvbSBuYXZpZ2F0aW9uKSBhbmQgYWxsXG5cdFx0Ly8gdGFibGVzIHdpdGggc2FtZSBlbnRpdHlTZXQgZ2V0cyBzYW1lIGFnZ3JlYWd0ZSBjb25maWd1cmF0aW9uIHRoYXQncyB3aHkgd2UgY2FuIHVzZSBmaXJzdCB0YWJsZSBpbnRvXG5cdFx0Ly8gTFIgdG8gZ2V0IGFnZ3JlZ2F0ZXMgKHdpdGhvdXQgY3VycmVuY3kvdW5pdCBwcm9wZXJ0aWVzIHNpbmNlIHdlIGV4cGVjdCB0byBiZSBhYmxlIHRvIGZpbHRlciB0aGVtKS5cblx0XHRjb25zdCBhZ2dyZWdhdGVzID0gbHJUYWJsZXNbMF0uYWdncmVnYXRlcztcblx0XHRpZiAoYWdncmVnYXRlcykge1xuXHRcdFx0Y29uc3QgYWdncmVnYXRhYmxlUHJvcGVydGllczogc3RyaW5nW10gPSBPYmplY3Qua2V5cyhhZ2dyZWdhdGVzKS5tYXAoYWdncmVnYXRlS2V5ID0+IGFnZ3JlZ2F0ZXNbYWdncmVnYXRlS2V5XS5yZWxhdGl2ZVBhdGgpO1xuXHRcdFx0YWxsRmlsdGVycyA9IGFsbEZpbHRlcnMuZmlsdGVyKGZpbHRlckZpZWxkID0+IHtcblx0XHRcdFx0cmV0dXJuIGFnZ3JlZ2F0YWJsZVByb3BlcnRpZXMuaW5kZXhPZihmaWx0ZXJGaWVsZC5rZXkpID09PSAtMTtcblx0XHRcdH0pO1xuXHRcdH1cblx0fVxuXG5cdGNvbnN0IHNlbGVjdGlvbkZpZWxkcyA9IGluc2VydEN1c3RvbU1hbmlmZXN0RWxlbWVudHMoYWxsRmlsdGVycywgZW50aXR5VHlwZSwgY29udmVydGVyQ29udGV4dCk7XG5cblx0Ly8gQWRkIGNhc2VTZW5zaXRpdmUgcHJvcGVydHkgdG8gYWxsIHNlbGVjdGlvbiBmaWVsZHMuXG5cdGNvbnN0IGlzQ2FzZVNlbnNpdGl2ZSA9IGlzRmlsdGVyaW5nQ2FzZVNlbnNpdGl2ZShjb252ZXJ0ZXJDb250ZXh0KTtcblx0c2VsZWN0aW9uRmllbGRzLmZvckVhY2goZmlsdGVyRmllbGQgPT4ge1xuXHRcdGZpbHRlckZpZWxkLmNhc2VTZW5zaXRpdmUgPSBpc0Nhc2VTZW5zaXRpdmU7XG5cdH0pO1xuXG5cdHJldHVybiB7IHNlbGVjdGlvbkZpZWxkcywgc1Byb3BlcnR5SW5mbyB9O1xufTtcbiJdfQ==