@sapui5/sap.fe.core 1.99.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 (246) hide show
  1. package/package.json +4 -2
  2. package/src/sap/fe/core/.library +1 -1
  3. package/src/sap/fe/core/AnnotationHelper.js +1 -69
  4. package/src/sap/fe/core/AnnotationHelper.ts +0 -70
  5. package/src/sap/fe/core/AppComponent.js +388 -399
  6. package/src/sap/fe/core/AppComponent.ts +403 -0
  7. package/src/sap/fe/core/AppStateHandler.js +127 -158
  8. package/src/sap/fe/core/BaseController.js +82 -58
  9. package/src/sap/fe/core/BaseController.ts +68 -0
  10. package/src/sap/fe/core/CommonUtils.js +111 -20
  11. package/src/sap/fe/core/CommonUtils.ts +131 -32
  12. package/src/sap/fe/core/ExtensionAPI.js +278 -274
  13. package/src/sap/fe/core/ExtensionAPI.ts +250 -0
  14. package/src/sap/fe/core/PageController.js +157 -29
  15. package/src/sap/fe/core/PageController.ts +60 -32
  16. package/src/sap/fe/core/RouterProxy.js +694 -756
  17. package/src/sap/fe/core/RouterProxy.ts +11 -9
  18. package/src/sap/fe/core/Synchronization.js +21 -31
  19. package/src/sap/fe/core/TemplateComponent.js +1 -1
  20. package/src/sap/fe/core/TemplateComponent.ts +10 -3
  21. package/src/sap/fe/core/TemplateModel.js +20 -38
  22. package/src/sap/fe/core/TemplateModel.ts +1 -1
  23. package/src/sap/fe/core/TransactionHelper.js +1354 -1370
  24. package/src/sap/fe/core/TransactionHelper.ts +33 -22
  25. package/src/sap/fe/core/actions/collaboration/ActivitySync.js +392 -0
  26. package/src/sap/fe/core/actions/collaboration/ActivitySync.ts +355 -0
  27. package/src/sap/fe/core/actions/collaboration/CollaborationCommon.js +136 -0
  28. package/src/sap/fe/core/actions/collaboration/CollaborationCommon.ts +119 -0
  29. package/src/sap/fe/core/actions/collaboration/Manage.js +262 -0
  30. package/src/sap/fe/core/actions/collaboration/Manage.ts +244 -0
  31. package/src/sap/fe/core/actions/collaboration/ManageDialog.fragment.xml +103 -0
  32. package/src/sap/fe/core/actions/collaboration/UserDetails.fragment.xml +13 -0
  33. package/src/sap/fe/core/actions/draft.js +30 -68
  34. package/src/sap/fe/core/actions/draft.ts +44 -71
  35. package/src/sap/fe/core/actions/messageHandling.js +55 -36
  36. package/src/sap/fe/core/actions/messageHandling.ts +66 -46
  37. package/src/sap/fe/core/actions/operations.js +34 -15
  38. package/src/sap/fe/core/actions/operations.ts +48 -18
  39. package/src/sap/fe/core/actions/sticky.js +17 -4
  40. package/src/sap/fe/core/actions/sticky.ts +21 -4
  41. package/src/sap/fe/core/controllerextensions/ControllerExtensionMetadata.js +69 -66
  42. package/src/sap/fe/core/controllerextensions/ControllerExtensionMetadata.ts +65 -0
  43. package/src/sap/fe/core/controllerextensions/EditFlow.js +1593 -1669
  44. package/src/sap/fe/core/controllerextensions/EditFlow.ts +1672 -0
  45. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +79 -54
  46. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +61 -0
  47. package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +718 -779
  48. package/src/sap/fe/core/controllerextensions/InternalEditFlow.ts +783 -0
  49. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +796 -816
  50. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +803 -0
  51. package/src/sap/fe/core/controllerextensions/InternalRouting.js +1004 -1005
  52. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +978 -0
  53. package/src/sap/fe/core/controllerextensions/KPIManagement.js +487 -521
  54. package/src/sap/fe/core/controllerextensions/KPIManagement.ts +2 -2
  55. package/src/sap/fe/core/controllerextensions/MassEdit.js +141 -169
  56. package/src/sap/fe/core/controllerextensions/MassEdit.ts +156 -0
  57. package/src/sap/fe/core/controllerextensions/MessageHandler.js +233 -244
  58. package/src/sap/fe/core/controllerextensions/MessageHandler.ts +225 -0
  59. package/src/sap/fe/core/controllerextensions/PageReady.js +301 -336
  60. package/src/sap/fe/core/controllerextensions/PageReady.ts +12 -10
  61. package/src/sap/fe/core/controllerextensions/Paginator.js +188 -175
  62. package/src/sap/fe/core/controllerextensions/Paginator.ts +163 -0
  63. package/src/sap/fe/core/controllerextensions/Placeholder.js +157 -149
  64. package/src/sap/fe/core/controllerextensions/Placeholder.ts +151 -0
  65. package/src/sap/fe/core/controllerextensions/Routing.js +144 -125
  66. package/src/sap/fe/core/controllerextensions/Routing.ts +132 -0
  67. package/src/sap/fe/core/controllerextensions/RoutingListener.js +7 -6
  68. package/src/sap/fe/core/controllerextensions/RoutingListener.ts +3 -0
  69. package/src/sap/fe/core/controllerextensions/Share.js +230 -268
  70. package/src/sap/fe/core/controllerextensions/Share.ts +231 -0
  71. package/src/sap/fe/core/controllerextensions/SideEffects.js +592 -633
  72. package/src/sap/fe/core/controllerextensions/SideEffects.ts +8 -7
  73. package/src/sap/fe/core/controllerextensions/ViewState.js +788 -806
  74. package/src/sap/fe/core/controllerextensions/ViewState.ts +805 -0
  75. package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +2 -2
  76. package/src/sap/fe/core/controls/ActionPartial.fragment.xml +2 -2
  77. package/src/sap/fe/core/controls/CommandExecution.js +67 -66
  78. package/src/sap/fe/core/controls/CommandExecution.ts +72 -0
  79. package/src/sap/fe/core/controls/ConditionalWrapper.js +90 -75
  80. package/src/sap/fe/core/controls/ConditionalWrapper.ts +83 -0
  81. package/src/sap/fe/core/controls/CustomQuickViewPage.js +130 -125
  82. package/src/sap/fe/core/controls/CustomQuickViewPage.ts +126 -0
  83. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +103 -112
  84. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.ts +101 -0
  85. package/src/sap/fe/core/controls/FieldWrapper.js +122 -135
  86. package/src/sap/fe/core/controls/FieldWrapper.ts +115 -0
  87. package/src/sap/fe/core/controls/FilterBar.js +162 -159
  88. package/src/sap/fe/core/controls/FilterBar.ts +143 -0
  89. package/src/sap/fe/core/controls/FormElementWrapper.js +45 -39
  90. package/src/sap/fe/core/controls/FormElementWrapper.ts +40 -0
  91. package/src/sap/fe/core/controls/MultiValueParameterDelegate.js +37 -42
  92. package/src/sap/fe/core/controls/MultiValueParameterDelegate.ts +31 -0
  93. package/src/sap/fe/core/controls/filterbar/FilterContainer.js +126 -116
  94. package/src/sap/fe/core/controls/filterbar/FilterContainer.ts +98 -0
  95. package/src/sap/fe/core/controls/filterbar/VisualFilter.js +241 -255
  96. package/src/sap/fe/core/controls/filterbar/VisualFilter.ts +245 -0
  97. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +150 -141
  98. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.ts +125 -0
  99. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +335 -322
  100. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +337 -0
  101. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +74 -74
  102. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.ts +70 -0
  103. package/src/sap/fe/core/converters/ConverterContext.js +348 -379
  104. package/src/sap/fe/core/converters/ConverterContext.ts +19 -16
  105. package/src/sap/fe/core/converters/ManifestSettings.js +12 -1
  106. package/src/sap/fe/core/converters/ManifestSettings.ts +12 -1
  107. package/src/sap/fe/core/converters/ManifestWrapper.js +354 -378
  108. package/src/sap/fe/core/converters/ManifestWrapper.ts +10 -0
  109. package/src/sap/fe/core/converters/MetaModelConverter.js +6 -4
  110. package/src/sap/fe/core/converters/MetaModelConverter.ts +5 -2
  111. package/src/sap/fe/core/converters/TemplateConverter.js +1 -1
  112. package/src/sap/fe/core/converters/TemplateConverter.ts +2 -1
  113. package/src/sap/fe/core/converters/annotations/DataField.js +26 -12
  114. package/src/sap/fe/core/converters/annotations/DataField.ts +37 -13
  115. package/src/sap/fe/core/converters/controls/Common/Form.js +2 -2
  116. package/src/sap/fe/core/converters/controls/Common/Form.ts +4 -2
  117. package/src/sap/fe/core/converters/controls/Common/KPI.js +1 -1
  118. package/src/sap/fe/core/converters/controls/Common/KPI.ts +3 -2
  119. package/src/sap/fe/core/converters/controls/Common/Table.js +130 -23
  120. package/src/sap/fe/core/converters/controls/Common/Table.ts +134 -29
  121. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +118 -53
  122. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +156 -93
  123. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +161 -207
  124. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +148 -206
  125. package/src/sap/fe/core/converters/helpers/Aggregation.js +115 -133
  126. package/src/sap/fe/core/converters/helpers/BindingHelper.js +20 -6
  127. package/src/sap/fe/core/converters/helpers/BindingHelper.ts +16 -4
  128. package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +12 -1
  129. package/src/sap/fe/core/converters/helpers/ConfigurableObject.ts +11 -0
  130. package/src/sap/fe/core/converters/helpers/Key.js +42 -57
  131. package/src/sap/fe/core/converters/helpers/Key.ts +1 -1
  132. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +25 -4
  133. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +20 -3
  134. package/src/sap/fe/core/converters/templates/ListReportConverter.js +10 -4
  135. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +15 -4
  136. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +7 -5
  137. package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +5 -1
  138. package/src/sap/fe/core/designtime/AppComponent.designtime.js +92 -98
  139. package/src/sap/fe/core/designtime/AppComponent.designtime.ts +91 -0
  140. package/src/sap/fe/core/formatters/CollaborationFormatter.js +104 -0
  141. package/src/sap/fe/core/formatters/CollaborationFormatter.ts +60 -0
  142. package/src/sap/fe/core/formatters/TableFormatter.js +53 -2
  143. package/src/sap/fe/core/formatters/TableFormatter.ts +51 -0
  144. package/src/sap/fe/core/fpm/Component.js +50 -54
  145. package/src/sap/fe/core/fpm/Component.ts +48 -0
  146. package/src/sap/fe/core/helpers/AppStartupHelper.js +323 -309
  147. package/src/sap/fe/core/helpers/AppStartupHelper.ts +363 -337
  148. package/src/sap/fe/core/helpers/BindingExpression.js +7 -7
  149. package/src/sap/fe/core/helpers/BindingExpression.ts +7 -7
  150. package/src/sap/fe/core/helpers/ClassSupport.js +186 -62
  151. package/src/sap/fe/core/helpers/ClassSupport.ts +168 -52
  152. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +5 -4
  153. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.ts +1 -5
  154. package/src/sap/fe/core/helpers/FPMHelper.js +1 -1
  155. package/src/sap/fe/core/helpers/FPMHelper.ts +1 -1
  156. package/src/sap/fe/core/helpers/MassEditHelper.js +601 -684
  157. package/src/sap/fe/core/helpers/MassEditHelper.ts +699 -0
  158. package/src/sap/fe/core/helpers/ModelHelper.js +25 -1
  159. package/src/sap/fe/core/helpers/ModelHelper.ts +23 -0
  160. package/src/sap/fe/core/helpers/SemanticDateOperators.js +5 -1
  161. package/src/sap/fe/core/helpers/SemanticDateOperators.ts +4 -0
  162. package/src/sap/fe/core/library.js +426 -451
  163. package/src/sap/fe/core/library.support.js +22 -33
  164. package/src/sap/fe/core/library.support.ts +23 -0
  165. package/src/sap/fe/core/library.ts +420 -0
  166. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +5 -3
  167. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +4 -1
  168. package/src/sap/fe/core/messagebundle.properties +22 -5
  169. package/src/sap/fe/core/messagebundle_ar.properties +27 -7
  170. package/src/sap/fe/core/messagebundle_bg.properties +27 -7
  171. package/src/sap/fe/core/messagebundle_ca.properties +27 -7
  172. package/src/sap/fe/core/messagebundle_cs.properties +27 -7
  173. package/src/sap/fe/core/messagebundle_cy.properties +27 -7
  174. package/src/sap/fe/core/messagebundle_da.properties +27 -7
  175. package/src/sap/fe/core/messagebundle_de.properties +27 -7
  176. package/src/sap/fe/core/messagebundle_el.properties +27 -7
  177. package/src/sap/fe/core/messagebundle_en.properties +27 -7
  178. package/src/sap/fe/core/messagebundle_en_GB.properties +27 -7
  179. package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +27 -7
  180. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +27 -7
  181. package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +27 -7
  182. package/src/sap/fe/core/messagebundle_es.properties +27 -7
  183. package/src/sap/fe/core/messagebundle_es_MX.properties +27 -7
  184. package/src/sap/fe/core/messagebundle_et.properties +27 -7
  185. package/src/sap/fe/core/messagebundle_fi.properties +28 -8
  186. package/src/sap/fe/core/messagebundle_fr.properties +28 -8
  187. package/src/sap/fe/core/messagebundle_fr_CA.properties +29 -9
  188. package/src/sap/fe/core/messagebundle_hi.properties +27 -7
  189. package/src/sap/fe/core/messagebundle_hr.properties +27 -7
  190. package/src/sap/fe/core/messagebundle_hu.properties +27 -7
  191. package/src/sap/fe/core/messagebundle_id.properties +27 -7
  192. package/src/sap/fe/core/messagebundle_it.properties +27 -7
  193. package/src/sap/fe/core/messagebundle_iw.properties +27 -7
  194. package/src/sap/fe/core/messagebundle_ja.properties +26 -6
  195. package/src/sap/fe/core/messagebundle_kk.properties +27 -7
  196. package/src/sap/fe/core/messagebundle_ko.properties +27 -7
  197. package/src/sap/fe/core/messagebundle_lt.properties +27 -7
  198. package/src/sap/fe/core/messagebundle_lv.properties +28 -8
  199. package/src/sap/fe/core/messagebundle_ms.properties +27 -7
  200. package/src/sap/fe/core/messagebundle_nl.properties +27 -7
  201. package/src/sap/fe/core/messagebundle_no.properties +27 -7
  202. package/src/sap/fe/core/messagebundle_pl.properties +27 -7
  203. package/src/sap/fe/core/messagebundle_pt.properties +28 -8
  204. package/src/sap/fe/core/messagebundle_pt_PT.properties +27 -7
  205. package/src/sap/fe/core/messagebundle_ro.properties +27 -7
  206. package/src/sap/fe/core/messagebundle_ru.properties +27 -7
  207. package/src/sap/fe/core/messagebundle_sh.properties +27 -7
  208. package/src/sap/fe/core/messagebundle_sk.properties +27 -7
  209. package/src/sap/fe/core/messagebundle_sl.properties +27 -7
  210. package/src/sap/fe/core/messagebundle_sv.properties +27 -7
  211. package/src/sap/fe/core/messagebundle_th.properties +26 -6
  212. package/src/sap/fe/core/messagebundle_tr.properties +30 -10
  213. package/src/sap/fe/core/messagebundle_uk.properties +27 -7
  214. package/src/sap/fe/core/messagebundle_vi.properties +27 -7
  215. package/src/sap/fe/core/messagebundle_zh_CN.properties +27 -7
  216. package/src/sap/fe/core/messagebundle_zh_TW.properties +27 -7
  217. package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +45 -71
  218. package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +154 -192
  219. package/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +4 -4
  220. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +66 -92
  221. package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +1 -1
  222. package/src/sap/fe/core/services/NavigationServiceFactory.js +284 -339
  223. package/src/sap/fe/core/services/NavigationServiceFactory.ts +10 -13
  224. package/src/sap/fe/core/services/ResourceModelServiceFactory.js +67 -102
  225. package/src/sap/fe/core/services/ResourceModelServiceFactory.ts +5 -2
  226. package/src/sap/fe/core/services/RoutingServiceFactory.js +754 -814
  227. package/src/sap/fe/core/services/RoutingServiceFactory.ts +13 -13
  228. package/src/sap/fe/core/services/ShellServicesFactory.js +649 -736
  229. package/src/sap/fe/core/services/ShellServicesFactory.ts +7 -4
  230. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +567 -592
  231. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +22 -3
  232. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +354 -386
  233. package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +21 -14
  234. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +1 -1
  235. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.ts +1 -1
  236. package/src/sap/fe/core/support/CommonHelper.js +1 -1
  237. package/src/sap/fe/core/support/CommonHelper.ts +1 -1
  238. package/src/sap/fe/core/support/Diagnostics.js +36 -48
  239. package/src/sap/fe/core/templating/DataModelPathHelper.js +93 -85
  240. package/src/sap/fe/core/templating/DataModelPathHelper.ts +104 -95
  241. package/src/sap/fe/core/templating/FilterHelper.js +25 -32
  242. package/src/sap/fe/core/templating/FilterHelper.ts +36 -35
  243. package/src/sap/fe/core/templating/PropertyHelper.js +2 -2
  244. package/src/sap/fe/core/templating/PropertyHelper.ts +1 -1
  245. package/src/sap/fe/core/templating/UIFormatters.js +32 -26
  246. package/src/sap/fe/core/templating/UIFormatters.ts +37 -24
@@ -2,410 +2,387 @@
2
2
  * SAP UI development toolkit for HTML5 (SAPUI5)
3
3
  * (c) Copyright 2009-2021 SAP SE. All rights reserved
4
4
  */
5
- sap.ui.define(["sap/ui/core/service/Service", "sap/ui/core/service/ServiceFactory", "sap/ui/core/service/ServiceFactoryRegistry", "sap/ui/model/base/ManagedObjectModel", "sap/ui/core/mvc/View", "sap/ui/core/Component", "sap/ui/model/json/JSONModel", "sap/base/Log", "sap/fe/core/TemplateModel", "sap/fe/core/helpers/DynamicAnnotationPathHelper", "sap/ui/core/cache/CacheManager", "sap/ui/VersionInfo", "sap/ui/Device", "sap/base/util/UriParameters"], function (Service, ServiceFactory, ServiceFactoryRegistry, ManagedObjectModel, View, Component, JSONModel, Log, TemplateModel, DynamicAnnotationPathHelper, CacheManager, VersionInfo, Device, UriParameters) {
5
+ sap.ui.define(["sap/ui/core/service/Service", "sap/ui/core/service/ServiceFactory", "sap/ui/core/service/ServiceFactoryRegistry", "sap/ui/model/base/ManagedObjectModel", "sap/ui/core/mvc/View", "sap/ui/core/Component", "sap/ui/model/json/JSONModel", "sap/base/Log", "sap/fe/core/TemplateModel", "sap/ui/core/cache/CacheManager", "sap/ui/VersionInfo", "sap/ui/Device", "sap/base/util/UriParameters", "../helpers/DynamicAnnotationPathHelper"], function (Service, ServiceFactory, ServiceFactoryRegistry, ManagedObjectModel, View, Component, JSONModel, Log, TemplateModel, CacheManager, VersionInfo, Device, UriParameters, DynamicAnnotationPathHelper) {
6
6
  "use strict";
7
7
 
8
- 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; }
9
-
10
- function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
11
-
12
- function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
13
-
14
- function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
8
+ var resolveDynamicExpression = DynamicAnnotationPathHelper.resolveDynamicExpression;
15
9
 
16
10
  function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }
17
11
 
18
12
  function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
19
13
 
20
- function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
21
-
22
- function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); }
23
-
24
- function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
25
-
26
- function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
27
-
28
- function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
29
-
30
14
  var TemplatedViewService = /*#__PURE__*/function (_Service) {
31
15
  _inherits(TemplatedViewService, _Service);
32
16
 
33
- var _super = _createSuper(TemplatedViewService);
34
-
35
17
  function TemplatedViewService() {
36
- _classCallCheck(this, TemplatedViewService);
37
-
38
- return _super.apply(this, arguments);
18
+ return _Service.apply(this, arguments) || this;
39
19
  }
40
20
 
41
- _createClass(TemplatedViewService, [{
42
- key: "init",
43
- value: function init() {
44
- var _this = this;
45
-
46
- var aServiceDependencies = [];
47
- var oContext = this.getContext();
48
- var oComponent = oContext.scopeObject;
49
- var oAppComponent = Component.getOwnerComponentFor(oComponent);
50
- var oMetaModel = oAppComponent.getMetaModel();
51
- var sStableId = oAppComponent.getMetadata().getComponentName() + "::" + oAppComponent.getLocalId(oComponent.getId());
52
- var aEnhanceI18n = oComponent.getEnhanceI18n() || [];
53
- var sAppNamespace;
54
- this.oFactory = oContext.factory;
55
-
56
- if (aEnhanceI18n) {
57
- sAppNamespace = oAppComponent.getMetadata().getComponentName();
58
-
59
- for (var i = 0; i < aEnhanceI18n.length; i++) {
60
- // In order to support text-verticalization applications can also passs a resource model defined in the manifest
61
- // UI5 takes care of text-verticalization for resource models defined in the manifest
62
- // Hence check if the given key is a resource model defined in the manifest
63
- // if so this model should be used to enhance the sap.fe resource model so pass it as it is
64
- var oResourceModel = oAppComponent.getModel(aEnhanceI18n[i]);
65
-
66
- if (oResourceModel && oResourceModel.isA("sap.ui.model.resource.ResourceModel")) {
67
- aEnhanceI18n[i] = oResourceModel;
68
- } else {
69
- aEnhanceI18n[i] = sAppNamespace + "." + aEnhanceI18n[i].replace(".properties", "");
70
- }
21
+ var _proto = TemplatedViewService.prototype;
22
+
23
+ _proto.init = function init() {
24
+ var _this = this;
25
+
26
+ var aServiceDependencies = [];
27
+ var oContext = this.getContext();
28
+ var oComponent = oContext.scopeObject;
29
+ var oAppComponent = Component.getOwnerComponentFor(oComponent);
30
+ var oMetaModel = oAppComponent.getMetaModel();
31
+ var sStableId = oAppComponent.getMetadata().getComponentName() + "::" + oAppComponent.getLocalId(oComponent.getId());
32
+ var aEnhanceI18n = oComponent.getEnhanceI18n() || [];
33
+ var sAppNamespace;
34
+ this.oFactory = oContext.factory;
35
+
36
+ if (aEnhanceI18n) {
37
+ sAppNamespace = oAppComponent.getMetadata().getComponentName();
38
+
39
+ for (var i = 0; i < aEnhanceI18n.length; i++) {
40
+ // In order to support text-verticalization applications can also passs a resource model defined in the manifest
41
+ // UI5 takes care of text-verticalization for resource models defined in the manifest
42
+ // Hence check if the given key is a resource model defined in the manifest
43
+ // if so this model should be used to enhance the sap.fe resource model so pass it as it is
44
+ var oResourceModel = oAppComponent.getModel(aEnhanceI18n[i]);
45
+
46
+ if (oResourceModel && oResourceModel.isA("sap.ui.model.resource.ResourceModel")) {
47
+ aEnhanceI18n[i] = oResourceModel;
48
+ } else {
49
+ aEnhanceI18n[i] = sAppNamespace + "." + aEnhanceI18n[i].replace(".properties", "");
71
50
  }
72
51
  }
52
+ }
73
53
 
74
- var sCacheIdentifier = oAppComponent.getMetadata().getName() + "_" + sStableId + "_" + sap.ui.getCore().getConfiguration().getLanguageTag();
75
- aServiceDependencies.push(ServiceFactoryRegistry.get("sap.fe.core.services.ResourceModelService").createInstance({
76
- scopeType: "component",
77
- scopeObject: oComponent,
78
- settings: {
79
- bundles: ["sap.fe.core.messagebundle", "sap.fe.macros.messagebundle", "sap.fe.templates.messagebundle"],
80
- enhanceI18n: aEnhanceI18n,
81
- modelName: "sap.fe.i18n"
82
- }
83
- }).then(function (oResourceModelService) {
84
- _this.oResourceModelService = oResourceModelService;
85
- return oResourceModelService.getResourceModel();
86
- }));
87
- aServiceDependencies.push(ServiceFactoryRegistry.get("sap.fe.core.services.CacheHandlerService").createInstance({
88
- settings: {
89
- metaModel: oMetaModel,
90
- appComponent: oAppComponent,
91
- component: oComponent
92
- }
93
- }).then(function (oCacheHandlerService) {
94
- _this.oCacheHandlerService = oCacheHandlerService;
95
- return oCacheHandlerService.validateCacheKey(sCacheIdentifier);
96
- }));
97
- aServiceDependencies.push(VersionInfo.load().then(function (oInfo) {
98
- var sTimestamp = "";
99
-
100
- if (!oInfo.libraries) {
101
- sTimestamp = sap.ui.buildinfo.buildtime;
102
- } else {
103
- oInfo.libraries.forEach(function (oLibrary) {
104
- sTimestamp += oLibrary.buildTimestamp;
105
- });
106
- }
54
+ var sCacheIdentifier = oAppComponent.getMetadata().getName() + "_" + sStableId + "_" + sap.ui.getCore().getConfiguration().getLanguageTag();
55
+ aServiceDependencies.push(ServiceFactoryRegistry.get("sap.fe.core.services.ResourceModelService").createInstance({
56
+ scopeType: "component",
57
+ scopeObject: oComponent,
58
+ settings: {
59
+ bundles: ["sap.fe.core.messagebundle", "sap.fe.macros.messagebundle", "sap.fe.templates.messagebundle"],
60
+ enhanceI18n: aEnhanceI18n,
61
+ modelName: "sap.fe.i18n"
62
+ }
63
+ }).then(function (oResourceModelService) {
64
+ _this.oResourceModelService = oResourceModelService;
65
+ return oResourceModelService.getResourceModel();
66
+ }));
67
+ aServiceDependencies.push(ServiceFactoryRegistry.get("sap.fe.core.services.CacheHandlerService").createInstance({
68
+ settings: {
69
+ metaModel: oMetaModel,
70
+ appComponent: oAppComponent,
71
+ component: oComponent
72
+ }
73
+ }).then(function (oCacheHandlerService) {
74
+ _this.oCacheHandlerService = oCacheHandlerService;
75
+ return oCacheHandlerService.validateCacheKey(sCacheIdentifier);
76
+ }));
77
+ aServiceDependencies.push(VersionInfo.load().then(function (oInfo) {
78
+ var sTimestamp = "";
79
+
80
+ if (!oInfo.libraries) {
81
+ sTimestamp = sap.ui.buildinfo.buildtime;
82
+ } else {
83
+ oInfo.libraries.forEach(function (oLibrary) {
84
+ sTimestamp += oLibrary.buildTimestamp;
85
+ });
86
+ }
107
87
 
108
- return sTimestamp;
109
- }).catch(function () {
110
- return "<NOVALUE>";
111
- }));
112
- var sPageModelCacheKey = "";
113
- this.initPromise = Promise.all(aServiceDependencies).then(function (aDependenciesResult) {
114
- var sCacheKey = aDependenciesResult[1];
115
- var sVersionInfo = aDependenciesResult[2];
116
- var oShellServices = oAppComponent.getShellServices();
117
- var oSideEffectsServices = oAppComponent.getSideEffectsService();
118
- oSideEffectsServices.initializeSideEffects(oAppComponent.getEnvironmentCapabilities().getCapabilities());
119
- sPageModelCacheKey = sCacheKey + "-" + sVersionInfo + "-" + sStableId + "-" + oShellServices.instanceType + "-pageModel";
120
- return Promise.all(aDependenciesResult.concat([_this._getCachedModel(sPageModelCacheKey)]));
121
- }).then(function (aDependenciesResult) {
122
- var oResourceModel = aDependenciesResult[0];
123
- var sCacheKey = aDependenciesResult[1];
124
- var oPageModelCache = aDependenciesResult[3];
125
- return new Promise(function (resolve) {
126
- sap.ui.require(["sap/fe/core/converters/TemplateConverter", "sap/fe/core/converters/MetaModelConverter"], function (TemplateConverter, MetaModelConverter) {
127
- resolve(_this.createView(oResourceModel, sStableId, sCacheKey, sPageModelCacheKey, oPageModelCache, TemplateConverter, MetaModelConverter));
128
- });
88
+ return sTimestamp;
89
+ }).catch(function () {
90
+ return "<NOVALUE>";
91
+ }));
92
+ var sPageModelCacheKey;
93
+ this.initPromise = Promise.all(aServiceDependencies).then(function (aDependenciesResult) {
94
+ var sCacheKey = aDependenciesResult[1];
95
+ var sVersionInfo = aDependenciesResult[2];
96
+ var oShellServices = oAppComponent.getShellServices();
97
+ var oSideEffectsServices = oAppComponent.getSideEffectsService();
98
+ oSideEffectsServices.initializeSideEffects(oAppComponent.getEnvironmentCapabilities().getCapabilities()); // In case there is no cache key we ignore the view cache
99
+
100
+ sPageModelCacheKey = sCacheKey ? sCacheKey + "-" + sVersionInfo + "-" + sStableId + "-" + oShellServices.instanceType + "-pageModel" : undefined;
101
+ return Promise.all(aDependenciesResult.concat([_this._getCachedModel(sPageModelCacheKey)]));
102
+ }).then(function (aDependenciesResult) {
103
+ var oResourceModel = aDependenciesResult[0];
104
+ var sCacheKey = aDependenciesResult[1];
105
+ var oPageModelCache = aDependenciesResult[3];
106
+ return new Promise(function (resolve) {
107
+ sap.ui.require(["sap/fe/core/converters/TemplateConverter", "sap/fe/core/converters/MetaModelConverter"], function (TemplateConverter, MetaModelConverter) {
108
+ resolve(_this.createView(oResourceModel, sStableId, sCacheKey, sPageModelCacheKey, oPageModelCache, TemplateConverter, MetaModelConverter));
129
109
  });
130
- }).then(function (sCacheKey) {
131
- var oCacheHandlerService = ServiceFactoryRegistry.get("sap.fe.core.services.CacheHandlerService").getInstance(oMetaModel);
132
- oCacheHandlerService.invalidateIfNeeded(sCacheKey, sCacheIdentifier);
133
110
  });
111
+ }).then(function (sCacheKey) {
112
+ var oCacheHandlerService = ServiceFactoryRegistry.get("sap.fe.core.services.CacheHandlerService").getInstance(oMetaModel);
113
+ oCacheHandlerService.invalidateIfNeeded(sCacheKey, sCacheIdentifier);
114
+ });
115
+ };
116
+
117
+ _proto._getCachedModel = function _getCachedModel(sCacheKey) {
118
+ if (sCacheKey && sap.ui.getCore().getConfiguration().getViewCache()) {
119
+ return CacheManager.get(sCacheKey);
134
120
  }
135
- }, {
136
- key: "_getCachedModel",
137
- value: function _getCachedModel(sCacheKey) {
138
- if (sap.ui.getCore().getConfiguration().getViewCache()) {
139
- return CacheManager.get(sCacheKey);
140
- }
141
121
 
142
- return undefined;
143
- }
144
- }, {
145
- key: "_setCachedModel",
146
- value: function _setCachedModel(sCacheKey, oCacheModel) {
147
- if (sap.ui.getCore().getConfiguration().getViewCache()) {
148
- CacheManager.set(sCacheKey, oCacheModel);
149
- }
122
+ return undefined;
123
+ };
150
124
 
151
- return undefined;
125
+ _proto._setCachedModel = function _setCachedModel(sCacheKey, oCacheModel) {
126
+ if (sCacheKey && sap.ui.getCore().getConfiguration().getViewCache()) {
127
+ CacheManager.set(sCacheKey, oCacheModel);
152
128
  }
153
- /**
154
- * Refresh the current view using the same configuration as before.
155
- * This is useful for our demokit !
156
- *
157
- * @param oComponent
158
- * @returns {Promise<void>}
159
- * @private
160
- */
161
-
162
- }, {
163
- key: "refreshView",
164
- value: function refreshView(oComponent) {
165
- var oRootView = oComponent.getRootControl();
166
-
167
- if (oRootView) {
168
- oRootView.destroy();
169
- } else if (this.oView) {
170
- this.oView.destroy();
171
- }
172
129
 
173
- return this.createView(this.resourceModel, this.stableId, "", "", undefined, this.TemplateConverter, this.MetaModelConverter).then(function () {
174
- oComponent.oContainer.invalidate();
175
- }).catch(function (oError) {
176
- oComponent.oContainer.invalidate();
177
- Log.error(oError);
178
- });
130
+ return undefined;
131
+ }
132
+ /**
133
+ * Refresh the current view using the same configuration as before.
134
+ * This is useful for our demokit !
135
+ *
136
+ * @param oComponent
137
+ * @returns {Promise<void>}
138
+ * @private
139
+ */
140
+ ;
141
+
142
+ _proto.refreshView = function refreshView(oComponent) {
143
+ var oRootView = oComponent.getRootControl();
144
+
145
+ if (oRootView) {
146
+ oRootView.destroy();
147
+ } else if (this.oView) {
148
+ this.oView.destroy();
179
149
  }
180
- }, {
181
- key: "createView",
182
- value: function createView(oResourceModel, sStableId, sCacheKey, sPageModelCacheKey, oPageModelCache, TemplateConverter, MetaModelConverter) {
183
- var _this2 = this;
184
-
185
- this.resourceModel = oResourceModel;
186
- this.stableId = sStableId;
187
- this.TemplateConverter = TemplateConverter;
188
- this.MetaModelConverter = MetaModelConverter;
189
- var oContext = this.getContext();
190
- var mServiceSettings = oContext.settings;
191
- var sConverterType = mServiceSettings.converterType;
192
- var oComponent = oContext.scopeObject;
193
- var oAppComponent = Component.getOwnerComponentFor(oComponent);
194
- var sFullContextPath = oAppComponent.getRoutingService().getTargetInformationFor(oComponent).options.settings.fullContextPath;
195
- var oMetaModel = oAppComponent.getMetaModel();
196
- var oManifestContent = oAppComponent.getManifest();
197
- var oDeviceModel = new JSONModel(sap.ui.Device).setDefaultBindingMode("OneWay");
198
- var oManifestModel = new JSONModel(oManifestContent);
199
- var bError = false;
200
- var oPageModel, oViewDataModel, oViewSettings, mViewData;
201
-
202
- function getViewSettings() {
203
- var aSplitPath = sFullContextPath.split("/");
204
- var sEntitySetPath = aSplitPath.reduce(function (sPathSoFar, sNextPathPart) {
205
- if (sNextPathPart === "") {
206
- return sPathSoFar;
207
- }
208
150
 
209
- if (sPathSoFar === "") {
210
- sPathSoFar = "/" + sNextPathPart;
211
- } else {
212
- var oTarget = oMetaModel.getObject(sPathSoFar + "/$NavigationPropertyBinding/" + sNextPathPart);
151
+ return this.createView(this.resourceModel, this.stableId, "", "", undefined, this.TemplateConverter, this.MetaModelConverter).then(function () {
152
+ oComponent.oContainer.invalidate();
153
+ }).catch(function (oError) {
154
+ oComponent.oContainer.invalidate();
155
+ Log.error(oError);
156
+ });
157
+ };
158
+
159
+ _proto.createView = function createView(oResourceModel, sStableId, sCacheKey, sPageModelCacheKey, oPageModelCache, TemplateConverter, MetaModelConverter) {
160
+ var _this2 = this;
161
+
162
+ this.resourceModel = oResourceModel;
163
+ this.stableId = sStableId;
164
+ this.TemplateConverter = TemplateConverter;
165
+ this.MetaModelConverter = MetaModelConverter;
166
+ var oContext = this.getContext();
167
+ var mServiceSettings = oContext.settings;
168
+ var sConverterType = mServiceSettings.converterType;
169
+ var oComponent = oContext.scopeObject;
170
+ var oAppComponent = Component.getOwnerComponentFor(oComponent);
171
+ var sFullContextPath = oAppComponent.getRoutingService().getTargetInformationFor(oComponent).options.settings.fullContextPath;
172
+ var oMetaModel = oAppComponent.getMetaModel();
173
+ var oManifestContent = oAppComponent.getManifest();
174
+ var oDeviceModel = new JSONModel(sap.ui.Device).setDefaultBindingMode("OneWay");
175
+ var oManifestModel = new JSONModel(oManifestContent);
176
+ var bError = false;
177
+ var oPageModel, oViewDataModel, oViewSettings, mViewData;
178
+
179
+ function getViewSettings() {
180
+ var aSplitPath = sFullContextPath.split("/");
181
+ var sEntitySetPath = aSplitPath.reduce(function (sPathSoFar, sNextPathPart) {
182
+ if (sNextPathPart === "") {
183
+ return sPathSoFar;
184
+ }
213
185
 
214
- if (oTarget && Object.keys(oTarget).length > 0) {
215
- sPathSoFar += "/$NavigationPropertyBinding";
216
- }
186
+ if (sPathSoFar === "") {
187
+ sPathSoFar = "/" + sNextPathPart;
188
+ } else {
189
+ var oTarget = oMetaModel.getObject(sPathSoFar + "/$NavigationPropertyBinding/" + sNextPathPart);
217
190
 
218
- sPathSoFar += "/" + sNextPathPart;
191
+ if (oTarget && Object.keys(oTarget).length > 0) {
192
+ sPathSoFar += "/$NavigationPropertyBinding";
219
193
  }
220
194
 
221
- return sPathSoFar;
222
- }, "");
223
- var oViewSettings = {
224
- type: "XML",
225
- preprocessors: {
226
- xml: {
227
- bindingContexts: {
228
- entitySet: sEntitySetPath ? oMetaModel.createBindingContext(sEntitySetPath) : null,
229
- fullContextPath: sFullContextPath ? oMetaModel.createBindingContext(sFullContextPath) : null,
230
- contextPath: sFullContextPath ? oMetaModel.createBindingContext(sFullContextPath) : null,
231
- converterContext: oPageModel.createBindingContext("/", undefined, {
232
- noResolve: true
233
- }),
234
- viewData: mViewData ? oViewDataModel.createBindingContext("/") : null
235
- },
236
- models: {
237
- entitySet: oMetaModel,
238
- fullContextPath: oMetaModel,
239
- contextPath: oMetaModel,
240
- "sap.fe.i18n": oResourceModel,
241
- metaModel: oMetaModel,
242
- "device": oDeviceModel,
243
- // TODO: discuss names here
244
- manifest: oManifestModel,
245
- converterContext: oPageModel,
246
- viewData: oViewDataModel
247
- },
248
- appComponent: oAppComponent
249
- }
250
- },
251
- id: sStableId,
252
- viewName: mServiceSettings.viewName || oComponent.getViewName(),
253
- viewData: mViewData,
254
- cache: {
255
- keys: [sCacheKey]
256
- },
257
- models: {
258
- "sap.fe.i18n": oResourceModel
259
- },
260
- height: "100%"
261
- };
262
- return oViewSettings;
263
- }
195
+ sPathSoFar += "/" + sNextPathPart;
196
+ }
264
197
 
265
- var createErrorPage = function (reason) {
266
- // just replace the view name and add an additional model containing the reason, but
267
- // keep the other settings
268
- Log.error(reason.message, reason);
269
- oViewSettings.viewName = mServiceSettings.errorViewName || "sap.fe.core.services.view.TemplatingErrorPage";
270
- oViewSettings.preprocessors.xml.models["error"] = new JSONModel(reason);
271
- return oComponent.runAsOwner(function () {
272
- return View.create(oViewSettings).then(function (oView) {
273
- _this2.oView = oView;
198
+ return sPathSoFar;
199
+ }, "");
200
+ var oViewSettings = {
201
+ type: "XML",
202
+ preprocessors: {
203
+ xml: {
204
+ bindingContexts: {
205
+ entitySet: sEntitySetPath ? oMetaModel.createBindingContext(sEntitySetPath) : null,
206
+ fullContextPath: sFullContextPath ? oMetaModel.createBindingContext(sFullContextPath) : null,
207
+ contextPath: sFullContextPath ? oMetaModel.createBindingContext(sFullContextPath) : null,
208
+ converterContext: oPageModel.createBindingContext("/", undefined, {
209
+ noResolve: true
210
+ }),
211
+ viewData: mViewData ? oViewDataModel.createBindingContext("/") : null
212
+ },
213
+ models: {
214
+ entitySet: oMetaModel,
215
+ fullContextPath: oMetaModel,
216
+ contextPath: oMetaModel,
217
+ "sap.fe.i18n": oResourceModel,
218
+ metaModel: oMetaModel,
219
+ "device": oDeviceModel,
220
+ // TODO: discuss names here
221
+ manifest: oManifestModel,
222
+ converterContext: oPageModel,
223
+ viewData: oViewDataModel
224
+ },
225
+ appComponent: oAppComponent
226
+ }
227
+ },
228
+ id: sStableId,
229
+ viewName: mServiceSettings.viewName || oComponent.getViewName(),
230
+ viewData: mViewData,
231
+ cache: {
232
+ keys: [sCacheKey]
233
+ },
234
+ models: {
235
+ "sap.fe.i18n": oResourceModel
236
+ },
237
+ height: "100%"
238
+ };
239
+ return oViewSettings;
240
+ }
274
241
 
275
- _this2.oView.setModel(new ManagedObjectModel(_this2.oView), "$view");
242
+ var createErrorPage = function (reason) {
243
+ // just replace the view name and add an additional model containing the reason, but
244
+ // keep the other settings
245
+ Log.error(reason.message, reason);
246
+ oViewSettings.viewName = mServiceSettings.errorViewName || "sap.fe.core.services.view.TemplatingErrorPage";
247
+ oViewSettings.preprocessors.xml.models["error"] = new JSONModel(reason);
248
+ return oComponent.runAsOwner(function () {
249
+ return View.create(oViewSettings).then(function (oView) {
250
+ _this2.oView = oView;
276
251
 
277
- oComponent.setAggregation("rootControl", _this2.oView);
278
- return sCacheKey;
279
- });
252
+ _this2.oView.setModel(new ManagedObjectModel(_this2.oView), "$view");
253
+
254
+ oComponent.setAggregation("rootControl", _this2.oView);
255
+ return sCacheKey;
280
256
  });
257
+ });
258
+ };
259
+
260
+ return oAppComponent.getService("routingService").then(function (oRoutingService) {
261
+ // Retrieve the viewLevel for the component
262
+ var oTargetInfo = oRoutingService.getTargetInformationFor(oComponent);
263
+ var mOutbounds = oManifestContent["sap.app"] && oManifestContent["sap.app"].crossNavigation && oManifestContent["sap.app"].crossNavigation.outbounds;
264
+ var mNavigation = oComponent.getNavigation() || {};
265
+ Object.keys(mNavigation).forEach(function (navigationObjectKey) {
266
+ var navigationObject = mNavigation[navigationObjectKey];
267
+ var outboundConfig;
268
+
269
+ if (navigationObject.detail && navigationObject.detail.outbound && mOutbounds[navigationObject.detail.outbound]) {
270
+ outboundConfig = mOutbounds[navigationObject.detail.outbound];
271
+ navigationObject.detail.outboundDetail = {
272
+ semanticObject: outboundConfig.semanticObject,
273
+ action: outboundConfig.action,
274
+ parameters: outboundConfig.parameters
275
+ };
276
+ }
277
+
278
+ if (navigationObject.create && navigationObject.create.outbound && mOutbounds[navigationObject.create.outbound]) {
279
+ outboundConfig = mOutbounds[navigationObject.create.outbound];
280
+ navigationObject.create.outboundDetail = {
281
+ semanticObject: outboundConfig.semanticObject,
282
+ action: outboundConfig.action,
283
+ parameters: outboundConfig.parameters
284
+ };
285
+ }
286
+ });
287
+ mViewData = {
288
+ navigation: mNavigation,
289
+ viewLevel: oTargetInfo.viewLevel,
290
+ stableId: sStableId,
291
+ contentDensities: oManifestContent["sap.ui5"].contentDensities,
292
+ resourceBundle: oResourceModel.__bundle,
293
+ fullContextPath: sFullContextPath,
294
+ isDesktop: Device.system.desktop,
295
+ isPhone: Device.system.phone
281
296
  };
282
297
 
283
- return oAppComponent.getService("routingService").then(function (oRoutingService) {
284
- // Retrieve the viewLevel for the component
285
- var oTargetInfo = oRoutingService.getTargetInformationFor(oComponent);
286
- var mOutbounds = oManifestContent["sap.app"] && oManifestContent["sap.app"].crossNavigation && oManifestContent["sap.app"].crossNavigation.outbounds;
287
- var mNavigation = oComponent.getNavigation() || {};
288
- Object.keys(mNavigation).forEach(function (navigationObjectKey) {
289
- var navigationObject = mNavigation[navigationObjectKey];
290
- var outboundConfig;
291
-
292
- if (navigationObject.detail && navigationObject.detail.outbound && mOutbounds[navigationObject.detail.outbound]) {
293
- outboundConfig = mOutbounds[navigationObject.detail.outbound];
294
- navigationObject.detail.outboundDetail = {
295
- semanticObject: outboundConfig.semanticObject,
296
- action: outboundConfig.action,
297
- parameters: outboundConfig.parameters
298
- };
299
- }
298
+ if (oComponent.getViewData) {
299
+ Object.assign(mViewData, oComponent.getViewData());
300
+ }
300
301
 
301
- if (navigationObject.create && navigationObject.create.outbound && mOutbounds[navigationObject.create.outbound]) {
302
- outboundConfig = mOutbounds[navigationObject.create.outbound];
303
- navigationObject.create.outboundDetail = {
304
- semanticObject: outboundConfig.semanticObject,
305
- action: outboundConfig.action,
306
- parameters: outboundConfig.parameters
307
- };
302
+ var oShellServices = oAppComponent.getShellServices();
303
+ mViewData.converterType = sConverterType;
304
+ mViewData.shellContentDensity = oShellServices.getContentDensity();
305
+ mViewData.useNewLazyLoading = UriParameters.fromQuery(window.location.search).get("sap-fe-xx-lazyloadingtest") === "true";
306
+ mViewData.retrieveTextFromValueList = oManifestContent["sap.fe"] && oManifestContent["sap.fe"].form ? oManifestContent["sap.fe"].form.retrieveTextFromValueList : undefined;
307
+ oViewDataModel = new JSONModel(mViewData);
308
+
309
+ if (mViewData && mViewData.controlConfiguration) {
310
+ Object.keys(mViewData.controlConfiguration).forEach(function (sAnnotationPath) {
311
+ if (sAnnotationPath.indexOf("[") !== -1) {
312
+ var sTargetAnnotationPath = resolveDynamicExpression(sAnnotationPath, oMetaModel);
313
+ mViewData.controlConfiguration[sTargetAnnotationPath] = mViewData.controlConfiguration[sAnnotationPath];
308
314
  }
309
315
  });
310
- mViewData = {
311
- navigation: mNavigation,
312
- viewLevel: oTargetInfo.viewLevel,
313
- stableId: sStableId,
314
- contentDensities: oManifestContent["sap.ui5"].contentDensities,
315
- resourceBundle: oResourceModel.__bundle,
316
- fullContextPath: sFullContextPath,
317
- isDesktop: Device.system.desktop,
318
- isPhone: Device.system.phone
319
- };
320
-
321
- if (oComponent.getViewData) {
322
- Object.assign(mViewData, oComponent.getViewData());
323
- }
316
+ }
324
317
 
325
- var oShellServices = oAppComponent.getShellServices();
326
- mViewData.converterType = sConverterType;
327
- mViewData.shellContentDensity = oShellServices.getContentDensity();
328
- mViewData.useNewLazyLoading = UriParameters.fromQuery(window.location.search).get("sap-fe-xx-lazyloadingtest") === "true";
329
- mViewData.retrieveTextFromValueList = oManifestContent["sap.fe"] && oManifestContent["sap.fe"].form ? oManifestContent["sap.fe"].form.retrieveTextFromValueList : undefined;
330
- oViewDataModel = new JSONModel(mViewData);
331
-
332
- if (mViewData && mViewData.controlConfiguration) {
333
- Object.keys(mViewData.controlConfiguration).forEach(function (sAnnotationPath) {
334
- if (sAnnotationPath.indexOf("[") !== -1) {
335
- var sTargetAnnotationPath = DynamicAnnotationPathHelper.resolveDynamicExpression(sAnnotationPath, oMetaModel);
336
- mViewData.controlConfiguration[sTargetAnnotationPath] = mViewData.controlConfiguration[sAnnotationPath];
318
+ MetaModelConverter.convertTypes(oMetaModel, oAppComponent.getEnvironmentCapabilities().getCapabilities());
319
+ oPageModel = new TemplateModel(function () {
320
+ try {
321
+ if (!!oPageModelCache) {
322
+ return oPageModelCache;
323
+ } else {
324
+ var oDiagnostics = oAppComponent.getDiagnostics();
325
+ var iIssueCount = oDiagnostics.getIssues().length;
326
+ var oConverterPageModel = TemplateConverter.convertPage(sConverterType, oMetaModel, mViewData, oDiagnostics, sFullContextPath, oAppComponent.getEnvironmentCapabilities().getCapabilities());
327
+ var aIssues = oDiagnostics.getIssues();
328
+ var aAddedIssues = aIssues.slice(iIssueCount);
329
+
330
+ if (aAddedIssues.length > 0) {
331
+ Log.warning("Some issues have been detected in your project, please check the UI5 support assistant rule for sap.fe.core");
337
332
  }
338
- });
339
- }
340
-
341
- MetaModelConverter.convertTypes(oMetaModel, oAppComponent.getEnvironmentCapabilities().getCapabilities());
342
- oPageModel = new TemplateModel(function () {
343
- try {
344
- if (!!oPageModelCache) {
345
- return oPageModelCache;
346
- } else {
347
- var oDiagnostics = oAppComponent.getDiagnostics();
348
- var iIssueCount = oDiagnostics.getIssues().length;
349
- var oConverterPageModel = TemplateConverter.convertPage(sConverterType, oMetaModel, mViewData, oDiagnostics, sFullContextPath, oAppComponent.getEnvironmentCapabilities().getCapabilities());
350
- var aIssues = oDiagnostics.getIssues();
351
- var aAddedIssues = aIssues.slice(iIssueCount);
352
-
353
- if (aAddedIssues.length > 0) {
354
- Log.warning("Some issues have been detected in your project, please check the UI5 support assistant rule for sap.fe.core");
355
- } // Fire and forget in the cache
356
333
 
334
+ return oConverterPageModel;
335
+ }
336
+ } catch (error) {
337
+ Log.error(error, error);
338
+ return {};
339
+ }
340
+ }, oMetaModel);
357
341
 
358
- _this2._setCachedModel(sPageModelCacheKey, oConverterPageModel);
342
+ if (!bError) {
343
+ oViewSettings = getViewSettings(); // Setting the pageModel on the component for potential reuse
359
344
 
360
- return oConverterPageModel;
361
- }
362
- } catch (error) {
363
- Log.error(error, error);
364
- return {};
365
- }
366
- }, oMetaModel);
345
+ oComponent.setModel(oPageModel, "_pageModel");
346
+ return oComponent.runAsOwner(function () {
347
+ return View.create(oViewSettings).catch(createErrorPage).then(function (oView) {
348
+ _this2.oView = oView;
367
349
 
368
- if (!bError) {
369
- oViewSettings = getViewSettings(); // Setting the pageModel on the component for potential reuse
350
+ _this2.oView.setModel(new ManagedObjectModel(_this2.oView), "$view");
370
351
 
371
- oComponent.setModel(oPageModel, "_pageModel");
372
- return oComponent.runAsOwner(function () {
373
- return View.create(oViewSettings).catch(createErrorPage).then(function (oView) {
374
- _this2.oView = oView;
352
+ _this2.oView.setModel(oViewDataModel, "viewData");
375
353
 
376
- _this2.oView.setModel(new ManagedObjectModel(_this2.oView), "$view");
354
+ oComponent.setAggregation("rootControl", _this2.oView); // Fire and forget in the cache
377
355
 
378
- _this2.oView.setModel(oViewDataModel, "viewData");
356
+ if (!oPageModelCache) {
357
+ _this2._setCachedModel(sPageModelCacheKey, oPageModel.getData());
358
+ }
379
359
 
380
- oComponent.setAggregation("rootControl", _this2.oView);
381
- return sCacheKey;
382
- }).catch(Log.error);
360
+ return sCacheKey;
361
+ }).catch(function (e) {
362
+ return Log.error(e.message, e);
383
363
  });
384
- }
385
- }).catch(function (error) {
386
- Log.error(error.message, error);
387
- throw new Error("Error while creating view : " + error);
388
- });
389
- }
390
- }, {
391
- key: "getView",
392
- value: function getView() {
393
- return this.oView;
394
- }
395
- }, {
396
- key: "getInterface",
397
- value: function getInterface() {
398
- return this;
399
- }
400
- }, {
401
- key: "exit",
402
- value: function exit() {
403
- // Deregister global instance
404
- this.oResourceModelService && this.oResourceModelService.destroy();
405
- this.oCacheHandlerService && this.oCacheHandlerService.destroy();
406
- this.oFactory.removeGlobalInstance();
407
- }
408
- }]);
364
+ });
365
+ }
366
+ }).catch(function (error) {
367
+ Log.error(error.message, error);
368
+ throw new Error("Error while creating view : " + error);
369
+ });
370
+ };
371
+
372
+ _proto.getView = function getView() {
373
+ return this.oView;
374
+ };
375
+
376
+ _proto.getInterface = function getInterface() {
377
+ return this;
378
+ };
379
+
380
+ _proto.exit = function exit() {
381
+ // Deregister global instance
382
+ this.oResourceModelService && this.oResourceModelService.destroy();
383
+ this.oCacheHandlerService && this.oCacheHandlerService.destroy();
384
+ this.oFactory.removeGlobalInstance();
385
+ };
409
386
 
410
387
  return TemplatedViewService;
411
388
  }(Service);
@@ -413,51 +390,42 @@ sap.ui.define(["sap/ui/core/service/Service", "sap/ui/core/service/ServiceFactor
413
390
  var TemplatedViewServiceFactory = /*#__PURE__*/function (_ServiceFactory) {
414
391
  _inherits(TemplatedViewServiceFactory, _ServiceFactory);
415
392
 
416
- var _super2 = _createSuper(TemplatedViewServiceFactory);
417
-
418
393
  function TemplatedViewServiceFactory() {
419
394
  var _this3;
420
395
 
421
- _classCallCheck(this, TemplatedViewServiceFactory);
422
-
423
396
  for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
424
397
  args[_key] = arguments[_key];
425
398
  }
426
399
 
427
- _this3 = _super2.call.apply(_super2, [this].concat(args));
428
-
429
- _defineProperty(_assertThisInitialized(_this3), "_oInstanceRegistry", {});
430
-
400
+ _this3 = _ServiceFactory.call.apply(_ServiceFactory, [this].concat(args)) || this;
401
+ _this3._oInstanceRegistry = {};
431
402
  return _this3;
432
403
  }
433
404
 
434
- _createClass(TemplatedViewServiceFactory, [{
435
- key: "createInstance",
436
- value: function createInstance(oServiceContext) {
437
- TemplatedViewServiceFactory.iCreatingViews++;
438
- var oTemplatedViewService = new TemplatedViewService(Object.assign({
439
- factory: this
440
- }, oServiceContext));
441
- return oTemplatedViewService.initPromise.then(function () {
442
- TemplatedViewServiceFactory.iCreatingViews--;
443
- return oTemplatedViewService;
444
- });
445
- }
446
- }, {
447
- key: "removeGlobalInstance",
448
- value: function removeGlobalInstance() {
449
- this._oInstanceRegistry = {};
450
- }
451
- }], [{
452
- key: "getNumberOfViewsInCreationState",
453
- value: function getNumberOfViewsInCreationState() {
454
- return TemplatedViewServiceFactory.iCreatingViews;
455
- }
456
- }]);
405
+ var _proto2 = TemplatedViewServiceFactory.prototype;
406
+
407
+ _proto2.createInstance = function createInstance(oServiceContext) {
408
+ TemplatedViewServiceFactory.iCreatingViews++;
409
+ var oTemplatedViewService = new TemplatedViewService(Object.assign({
410
+ factory: this
411
+ }, oServiceContext));
412
+ return oTemplatedViewService.initPromise.then(function () {
413
+ TemplatedViewServiceFactory.iCreatingViews--;
414
+ return oTemplatedViewService;
415
+ });
416
+ };
417
+
418
+ _proto2.removeGlobalInstance = function removeGlobalInstance() {
419
+ this._oInstanceRegistry = {};
420
+ };
421
+
422
+ TemplatedViewServiceFactory.getNumberOfViewsInCreationState = function getNumberOfViewsInCreationState() {
423
+ return TemplatedViewServiceFactory.iCreatingViews;
424
+ };
457
425
 
458
426
  return TemplatedViewServiceFactory;
459
427
  }(ServiceFactory);
460
428
 
461
429
  return TemplatedViewServiceFactory;
462
430
  }, false);
463
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlRlbXBsYXRlZFZpZXdTZXJ2aWNlRmFjdG9yeS50cyJdLCJuYW1lcyI6WyJUZW1wbGF0ZWRWaWV3U2VydmljZSIsImFTZXJ2aWNlRGVwZW5kZW5jaWVzIiwib0NvbnRleHQiLCJnZXRDb250ZXh0Iiwib0NvbXBvbmVudCIsInNjb3BlT2JqZWN0Iiwib0FwcENvbXBvbmVudCIsIkNvbXBvbmVudCIsImdldE93bmVyQ29tcG9uZW50Rm9yIiwib01ldGFNb2RlbCIsImdldE1ldGFNb2RlbCIsInNTdGFibGVJZCIsImdldE1ldGFkYXRhIiwiZ2V0Q29tcG9uZW50TmFtZSIsImdldExvY2FsSWQiLCJnZXRJZCIsImFFbmhhbmNlSTE4biIsImdldEVuaGFuY2VJMThuIiwic0FwcE5hbWVzcGFjZSIsIm9GYWN0b3J5IiwiZmFjdG9yeSIsImkiLCJsZW5ndGgiLCJvUmVzb3VyY2VNb2RlbCIsImdldE1vZGVsIiwiaXNBIiwicmVwbGFjZSIsInNDYWNoZUlkZW50aWZpZXIiLCJnZXROYW1lIiwic2FwIiwidWkiLCJnZXRDb3JlIiwiZ2V0Q29uZmlndXJhdGlvbiIsImdldExhbmd1YWdlVGFnIiwicHVzaCIsIlNlcnZpY2VGYWN0b3J5UmVnaXN0cnkiLCJnZXQiLCJjcmVhdGVJbnN0YW5jZSIsInNjb3BlVHlwZSIsInNldHRpbmdzIiwiYnVuZGxlcyIsImVuaGFuY2VJMThuIiwibW9kZWxOYW1lIiwidGhlbiIsIm9SZXNvdXJjZU1vZGVsU2VydmljZSIsImdldFJlc291cmNlTW9kZWwiLCJtZXRhTW9kZWwiLCJhcHBDb21wb25lbnQiLCJjb21wb25lbnQiLCJvQ2FjaGVIYW5kbGVyU2VydmljZSIsInZhbGlkYXRlQ2FjaGVLZXkiLCJWZXJzaW9uSW5mbyIsImxvYWQiLCJvSW5mbyIsInNUaW1lc3RhbXAiLCJsaWJyYXJpZXMiLCJidWlsZGluZm8iLCJidWlsZHRpbWUiLCJmb3JFYWNoIiwib0xpYnJhcnkiLCJidWlsZFRpbWVzdGFtcCIsImNhdGNoIiwic1BhZ2VNb2RlbENhY2hlS2V5IiwiaW5pdFByb21pc2UiLCJQcm9taXNlIiwiYWxsIiwiYURlcGVuZGVuY2llc1Jlc3VsdCIsInNDYWNoZUtleSIsInNWZXJzaW9uSW5mbyIsIm9TaGVsbFNlcnZpY2VzIiwiZ2V0U2hlbGxTZXJ2aWNlcyIsIm9TaWRlRWZmZWN0c1NlcnZpY2VzIiwiZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlIiwiaW5pdGlhbGl6ZVNpZGVFZmZlY3RzIiwiZ2V0RW52aXJvbm1lbnRDYXBhYmlsaXRpZXMiLCJnZXRDYXBhYmlsaXRpZXMiLCJpbnN0YW5jZVR5cGUiLCJjb25jYXQiLCJfZ2V0Q2FjaGVkTW9kZWwiLCJvUGFnZU1vZGVsQ2FjaGUiLCJyZXNvbHZlIiwicmVxdWlyZSIsIlRlbXBsYXRlQ29udmVydGVyIiwiTWV0YU1vZGVsQ29udmVydGVyIiwiY3JlYXRlVmlldyIsImdldEluc3RhbmNlIiwiaW52YWxpZGF0ZUlmTmVlZGVkIiwiZ2V0Vmlld0NhY2hlIiwiQ2FjaGVNYW5hZ2VyIiwidW5kZWZpbmVkIiwib0NhY2hlTW9kZWwiLCJzZXQiLCJvUm9vdFZpZXciLCJnZXRSb290Q29udHJvbCIsImRlc3Ryb3kiLCJvVmlldyIsInJlc291cmNlTW9kZWwiLCJzdGFibGVJZCIsIm9Db250YWluZXIiLCJpbnZhbGlkYXRlIiwib0Vycm9yIiwiTG9nIiwiZXJyb3IiLCJtU2VydmljZVNldHRpbmdzIiwic0NvbnZlcnRlclR5cGUiLCJjb252ZXJ0ZXJUeXBlIiwic0Z1bGxDb250ZXh0UGF0aCIsImdldFJvdXRpbmdTZXJ2aWNlIiwiZ2V0VGFyZ2V0SW5mb3JtYXRpb25Gb3IiLCJvcHRpb25zIiwiZnVsbENvbnRleHRQYXRoIiwib01hbmlmZXN0Q29udGVudCIsImdldE1hbmlmZXN0Iiwib0RldmljZU1vZGVsIiwiSlNPTk1vZGVsIiwiRGV2aWNlIiwic2V0RGVmYXVsdEJpbmRpbmdNb2RlIiwib01hbmlmZXN0TW9kZWwiLCJiRXJyb3IiLCJvUGFnZU1vZGVsIiwib1ZpZXdEYXRhTW9kZWwiLCJvVmlld1NldHRpbmdzIiwibVZpZXdEYXRhIiwiZ2V0Vmlld1NldHRpbmdzIiwiYVNwbGl0UGF0aCIsInNwbGl0Iiwic0VudGl0eVNldFBhdGgiLCJyZWR1Y2UiLCJzUGF0aFNvRmFyIiwic05leHRQYXRoUGFydCIsIm9UYXJnZXQiLCJnZXRPYmplY3QiLCJPYmplY3QiLCJrZXlzIiwidHlwZSIsInByZXByb2Nlc3NvcnMiLCJ4bWwiLCJiaW5kaW5nQ29udGV4dHMiLCJlbnRpdHlTZXQiLCJjcmVhdGVCaW5kaW5nQ29udGV4dCIsImNvbnRleHRQYXRoIiwiY29udmVydGVyQ29udGV4dCIsIm5vUmVzb2x2ZSIsInZpZXdEYXRhIiwibW9kZWxzIiwibWFuaWZlc3QiLCJpZCIsInZpZXdOYW1lIiwiZ2V0Vmlld05hbWUiLCJjYWNoZSIsImhlaWdodCIsImNyZWF0ZUVycm9yUGFnZSIsInJlYXNvbiIsIm1lc3NhZ2UiLCJlcnJvclZpZXdOYW1lIiwicnVuQXNPd25lciIsIlZpZXciLCJjcmVhdGUiLCJzZXRNb2RlbCIsIk1hbmFnZWRPYmplY3RNb2RlbCIsInNldEFnZ3JlZ2F0aW9uIiwiZ2V0U2VydmljZSIsIm9Sb3V0aW5nU2VydmljZSIsIm9UYXJnZXRJbmZvIiwibU91dGJvdW5kcyIsImNyb3NzTmF2aWdhdGlvbiIsIm91dGJvdW5kcyIsIm1OYXZpZ2F0aW9uIiwiZ2V0TmF2aWdhdGlvbiIsIm5hdmlnYXRpb25PYmplY3RLZXkiLCJuYXZpZ2F0aW9uT2JqZWN0Iiwib3V0Ym91bmRDb25maWciLCJkZXRhaWwiLCJvdXRib3VuZCIsIm91dGJvdW5kRGV0YWlsIiwic2VtYW50aWNPYmplY3QiLCJhY3Rpb24iLCJwYXJhbWV0ZXJzIiwibmF2aWdhdGlvbiIsInZpZXdMZXZlbCIsImNvbnRlbnREZW5zaXRpZXMiLCJyZXNvdXJjZUJ1bmRsZSIsIl9fYnVuZGxlIiwiaXNEZXNrdG9wIiwic3lzdGVtIiwiZGVza3RvcCIsImlzUGhvbmUiLCJwaG9uZSIsImdldFZpZXdEYXRhIiwiYXNzaWduIiwic2hlbGxDb250ZW50RGVuc2l0eSIsImdldENvbnRlbnREZW5zaXR5IiwidXNlTmV3TGF6eUxvYWRpbmciLCJVcmlQYXJhbWV0ZXJzIiwiZnJvbVF1ZXJ5Iiwid2luZG93IiwibG9jYXRpb24iLCJzZWFyY2giLCJyZXRyaWV2ZVRleHRGcm9tVmFsdWVMaXN0IiwiZm9ybSIsImNvbnRyb2xDb25maWd1cmF0aW9uIiwic0Fubm90YXRpb25QYXRoIiwiaW5kZXhPZiIsInNUYXJnZXRBbm5vdGF0aW9uUGF0aCIsIkR5bmFtaWNBbm5vdGF0aW9uUGF0aEhlbHBlciIsInJlc29sdmVEeW5hbWljRXhwcmVzc2lvbiIsImNvbnZlcnRUeXBlcyIsIlRlbXBsYXRlTW9kZWwiLCJvRGlhZ25vc3RpY3MiLCJnZXREaWFnbm9zdGljcyIsImlJc3N1ZUNvdW50IiwiZ2V0SXNzdWVzIiwib0NvbnZlcnRlclBhZ2VNb2RlbCIsImNvbnZlcnRQYWdlIiwiYUlzc3VlcyIsImFBZGRlZElzc3VlcyIsInNsaWNlIiwid2FybmluZyIsIl9zZXRDYWNoZWRNb2RlbCIsIkVycm9yIiwicmVtb3ZlR2xvYmFsSW5zdGFuY2UiLCJTZXJ2aWNlIiwiVGVtcGxhdGVkVmlld1NlcnZpY2VGYWN0b3J5Iiwib1NlcnZpY2VDb250ZXh0IiwiaUNyZWF0aW5nVmlld3MiLCJvVGVtcGxhdGVkVmlld1NlcnZpY2UiLCJfb0luc3RhbmNlUmVnaXN0cnkiLCJTZXJ2aWNlRmFjdG9yeSJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7TUFxQk1BLG9COzs7Ozs7Ozs7Ozs7O2FBVUwsZ0JBQU87QUFBQTs7QUFDTixZQUFNQyxvQkFBb0IsR0FBRyxFQUE3QjtBQUNBLFlBQU1DLFFBQVEsR0FBRyxLQUFLQyxVQUFMLEVBQWpCO0FBQ0EsWUFBTUMsVUFBVSxHQUFHRixRQUFRLENBQUNHLFdBQTVCO0FBQ0EsWUFBTUMsYUFBYSxHQUFHQyxTQUFTLENBQUNDLG9CQUFWLENBQStCSixVQUEvQixDQUF0QjtBQUNBLFlBQU1LLFVBQVUsR0FB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c0QsRTs7Ozs7OzthQUUzRCx3QkFBZUMsZUFBZixFQUE4RTtBQUM3RUQsUUFBQUEsMkJBQTJCLENBQUNFLGNBQTVCO0FBRUEsWUFBTUMscUJBQXFCLEdBQUcsSUFBSWpPLG9CQUFKLENBQXlCb0ksTUFBTSxDQUFDeUQsTUFBUCxDQUFjO0FBQUV6SyxVQUFBQSxPQUFPLEVBQUU7QUFBWCxTQUFkLEVBQWlDMk0sZUFBakMsQ0FBekIsQ0FBOUI7QUFDQSxlQUFPRSxxQkFBcUIsQ0FBQ2xLLFdBQXRCLENBQWtDcEIsSUFBbEMsQ0FBdUMsWUFBVztBQUN4RG1MLFVBQUFBLDJCQUEyQixDQUFDRSxjQUE1QjtBQUNBLGlCQUFPQyxxQkFBUDtBQUNBLFNBSE0sQ0FBUDtBQUlBOzs7YUFDRCxnQ0FBdUI7QUFDdEIsYUFBS0Msa0JBQUwsR0FBMEIsRUFBMUI7QUFDQTs7O2FBQ0QsMkNBQXlDO0FBQ3hDLGVBQU9KLDJCQUEyQixDQUFDRSxjQUFuQztBQUNBOzs7O0lBakJ3Q0csYzs7U0FvQjNCTCwyQiIsInNvdXJjZVJvb3QiOiIuIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFNlcnZpY2UgZnJvbSBcInNhcC91aS9jb3JlL3NlcnZpY2UvU2VydmljZVwiO1xuaW1wb3J0IFNlcnZpY2VGYWN0b3J5IGZyb20gXCJzYXAvdWkvY29yZS9zZXJ2aWNlL1NlcnZpY2VGYWN0b3J5XCI7XG5pbXBvcnQgU2VydmljZUZhY3RvcnlSZWdpc3RyeSBmcm9tIFwic2FwL3VpL2NvcmUvc2VydmljZS9TZXJ2aWNlRmFjdG9yeVJlZ2lzdHJ5XCI7XG5pbXBvcnQgTWFuYWdlZE9iamVjdE1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvYmFzZS9NYW5hZ2VkT2JqZWN0TW9kZWxcIjtcbmltcG9ydCBWaWV3IGZyb20gXCJzYXAvdWkvY29yZS9tdmMvVmlld1wiO1xuaW1wb3J0IENvbXBvbmVudCBmcm9tIFwic2FwL3VpL2NvcmUvQ29tcG9uZW50XCI7XG5pbXBvcnQgSlNPTk1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvanNvbi9KU09OTW9kZWxcIjtcbmltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IFRlbXBsYXRlTW9kZWwgZnJvbSBcInNhcC9mZS9jb3JlL1RlbXBsYXRlTW9kZWxcIjtcbmltcG9ydCBEeW5hbWljQW5ub3RhdGlvblBhdGhIZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvRHluYW1pY0Fubm90YXRpb25QYXRoSGVscGVyXCI7XG5pbXBvcnQgQ2FjaGVNYW5hZ2VyIGZyb20gXCJzYXAvdWkvY29yZS9jYWNoZS9DYWNoZU1hbmFnZXJcIjtcbmltcG9ydCBWZXJzaW9uSW5mbyBmcm9tIFwic2FwL3VpL1ZlcnNpb25JbmZvXCI7XG5pbXBvcnQgRGV2aWNlIGZyb20gXCJzYXAvdWkvRGV2aWNlXCI7XG5pbXBvcnQgVXJpUGFyYW1ldGVycyBmcm9tIFwic2FwL2Jhc2UvdXRpbC9VcmlQYXJhbWV0ZXJzXCI7XG5pbXBvcnQgeyBTZXJ2aWNlQ29udGV4dCB9IGZyb20gXCJzYXAvdWkvY29yZS9zZXJ2aWNlXCI7XG5pbXBvcnQgeyBSZXNvdXJjZU1vZGVsU2VydmljZSB9IGZyb20gXCIuL1Jlc291cmNlTW9kZWxTZXJ2aWNlRmFjdG9yeVwiO1xuaW1wb3J0IHsgQXBwQ29tcG9uZW50IH0gZnJvbSBcInNhcC9mZS9jb3JlXCI7XG5pbXBvcnQgeyBDYWNoZUhhbmRsZXJTZXJ2aWNlIH0gZnJvbSBcInNhcC9mZS9jb3JlL3NlcnZpY2VzL0NhY2hlSGFuZGxlclNlcnZpY2VGYWN0b3J5XCI7XG5pbXBvcnQgeyBSZXNvdXJjZU1vZGVsIH0gZnJvbSBcInNhcC9mZS9tYWNyb3NcIjtcbmltcG9ydCBNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL01vZGVsXCI7XG5cbnR5cGUgVGVtcGxhdGVkVmlld1NlcnZpY2VTZXR0aW5ncyA9IHt9O1xuXG5jbGFzcyBUZW1wbGF0ZWRWaWV3U2VydmljZSBleHRlbmRzIFNlcnZpY2U8VGVtcGxhdGVkVmlld1NlcnZpY2VTZXR0aW5ncz4ge1xuXHRpbml0UHJvbWlzZSE6IFByb21pc2U8YW55Pjtcblx0b1ZpZXchOiBWaWV3O1xuXHRvUmVzb3VyY2VNb2RlbFNlcnZpY2UhOiBSZXNvdXJjZU1vZGVsU2VydmljZTtcblx0b0NhY2hlSGFuZGxlclNlcnZpY2UhOiBDYWNoZUhhbmRsZXJTZXJ2aWNlO1xuXHRvRmFjdG9yeSE6IFRlbXBsYXRlZFZpZXdTZXJ2aWNlRmFjdG9yeTtcblx0cmVzb3VyY2VNb2RlbCE6IFJlc291cmNlTW9kZWw7XG5cdHN0YWJsZUlkITogc3RyaW5nO1xuXHRUZW1wbGF0ZUNvbnZlcnRlcjogYW55O1xuXHRNZXRhTW9kZWxDb252ZXJ0ZXI6IGFueTtcblx0aW5pdCgpIHtcblx0XHRjb25zdCBhU2VydmljZURlcGVuZGVuY2llcyA9IFtdO1xuXHRcdGNvbnN0IG9Db250ZXh0ID0gdGhpcy5nZXRDb250ZXh0KCk7XG5cdFx0Y29uc3Qgb0NvbXBvbmVudCA9IG9Db250ZXh0LnNjb3BlT2JqZWN0O1xuXHRcdGNvbnN0IG9BcHBDb21wb25lbnQgPSBDb21wb25lbnQuZ2V0T3duZXJDb21wb25lbnRGb3Iob0NvbXBvbmVudCkgYXMgQXBwQ29tcG9uZW50O1xuXHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvQXBwQ29tcG9uZW50LmdldE1ldGFNb2RlbCgpO1xuXHRcdGNvbnN0IHNTdGFibGVJZCA9IG9BcHBDb21wb25lbnQuZ2V0TWV0YWRhdGEoKS5nZXRDb21wb25lbnROYW1lKCkgKyBcIjo6XCIgKyBvQXBwQ29tcG9uZW50LmdldExvY2FsSWQob0NvbXBvbmVudC5nZXRJZCgpKTtcblx0XHRjb25zdCBhRW5oYW5jZUkxOG4gPSBvQ29tcG9uZW50LmdldEVuaGFuY2VJMThuKCkgfHwgW107XG5cdFx0bGV0IHNBcHBOYW1lc3BhY2U7XG5cdFx0dGhpcy5vRmFjdG9yeSA9IG9Db250ZXh0LmZhY3Rvcnk7XG5cdFx0aWYgKGFFbmhhbmNlSTE4bikge1xuXHRcdFx0c0FwcE5hbWVzcGFjZSA9IG9BcHBDb21wb25lbnQuZ2V0TWV0YWRhdGEoKS5nZXRDb21wb25lbnROYW1lKCk7XG5cdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGFFbmhhbmNlSTE4bi5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHQvLyBJbiBvcmRlciB0byBzdXBwb3J0IHRleHQtdmVydGljYWxpemF0aW9uIGFwcGxpY2F0aW9ucyBjYW4gYWxzbyBwYXNzcyBhIHJlc291cmNlIG1vZGVsIGRlZmluZWQgaW4gdGhlIG1hbmlmZXN0XG5cdFx0XHRcdC8vIFVJNSB0YWtlcyBjYXJlIG9mIHRleHQtdmVydGljYWxpemF0aW9uIGZvciByZXNvdXJjZSBtb2RlbHMgZGVmaW5lZCBpbiB0aGUgbWFuaWZlc3Rcblx0XHRcdFx0Ly8gSGVuY2UgY2hlY2sgaWYgdGhlIGdpdmVuIGtleSBpcyBhIHJlc291cmNlIG1vZGVsIGRlZmluZWQgaW4gdGhlIG1hbmlmZXN0XG5cdFx0XHRcdC8vIGlmIHNvIHRoaXMgbW9kZWwgc2hvdWxkIGJlIHVzZWQgdG8gZW5oYW5jZSB0aGUgc2FwLmZlIHJlc291cmNlIG1vZGVsIHNvIHBhc3MgaXQgYXMgaXQgaXNcblx0XHRcdFx0Y29uc3Qgb1Jlc291cmNlTW9kZWwgPSBvQXBwQ29tcG9uZW50LmdldE1vZGVsKGFFbmhhbmNlSTE4bltpXSk7XG5cdFx0XHRcdGlmIChvUmVzb3VyY2VNb2RlbCAmJiBvUmVzb3VyY2VNb2RlbC5pc0EoXCJzYXAudWkubW9kZWwucmVzb3VyY2UuUmVzb3VyY2VNb2RlbFwiKSkge1xuXHRcdFx0XHRcdGFFbmhhbmNlSTE4bltpXSA9IG9SZXNvdXJjZU1vZGVsO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGFFbmhhbmNlSTE4bltpXSA9IHNBcHBOYW1lc3BhY2UgKyBcIi5cIiArIGFFbmhhbmNlSTE4bltpXS5yZXBsYWNlKFwiLnByb3BlcnRpZXNcIiwgXCJcIik7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRjb25zdCBzQ2FjaGVJZGVudGlmaWVyID1cblx0XHRcdG9BcHBDb21wb25lbnQuZ2V0TWV0YWRhdGEoKS5nZXROYW1lKCkgK1xuXHRcdFx0XCJfXCIgK1xuXHRcdFx0c1N0YWJsZUlkICtcblx0XHRcdFwiX1wiICtcblx0XHRcdHNhcC51aVxuXHRcdFx0XHQuZ2V0Q29yZSgpXG5cdFx0XHRcdC5nZXRDb25maWd1cmF0aW9uKClcblx0XHRcdFx0LmdldExhbmd1YWdlVGFnKCk7XG5cdFx0YVNlcnZpY2VEZXBlbmRlbmNpZXMucHVzaChcblx0XHRcdFNlcnZpY2VGYWN0b3J5UmVnaXN0cnkuZ2V0KFwic2FwLmZlLmNvcmUuc2VydmljZXMuUmVzb3VyY2VNb2RlbFNlcnZpY2VcIilcblx0XHRcdFx0LmNyZWF0ZUluc3RhbmNlKHtcblx0XHRcdFx0XHRzY29wZVR5cGU6IFwiY29tcG9uZW50XCIsXG5cdFx0XHRcdFx0c2NvcGVPYmplY3Q6IG9Db21wb25lbnQsXG5cdFx0XHRcdFx0c2V0dGluZ3M6IHtcblx0XHRcdFx0XHRcdGJ1bmRsZXM6IFtcInNhcC5mZS5jb3JlLm1lc3NhZ2VidW5kbGVcIiwgXCJzYXAuZmUubWFjcm9zLm1lc3NhZ2VidW5kbGVcIiwgXCJzYXAuZmUudGVtcGxhdGVzLm1lc3NhZ2VidW5kbGVcIl0sXG5cdFx0XHRcdFx0XHRlbmhhbmNlSTE4bjogYUVuaGFuY2VJMThuLFxuXHRcdFx0XHRcdFx0bW9kZWxOYW1lOiBcInNhcC5mZS5pMThuXCJcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC50aGVuKChvUmVzb3VyY2VNb2RlbFNlcnZpY2U6IFJlc291cmNlTW9kZWxTZXJ2aWNlKSA9PiB7XG5cdFx0XHRcdFx0dGhpcy5vUmVzb3VyY2VNb2RlbFNlcnZpY2UgPSBvUmVzb3VyY2VNb2RlbFNlcnZpY2U7XG5cdFx0XHRcdFx0cmV0dXJuIG9SZXNvdXJjZU1vZGVsU2VydmljZS5nZXRSZXNvdXJjZU1vZGVsKCk7XG5cdFx0XHRcdH0pXG5cdFx0KTtcblxuXHRcdGFTZXJ2aWNlRGVwZW5kZW5jaWVzLnB1c2goXG5cdFx0XHRTZXJ2aWNlRmFjdG9yeVJlZ2lzdHJ5LmdldChcInNhcC5mZS5jb3JlLnNlcnZpY2VzLkNhY2hlSGFuZGxlclNlcnZpY2VcIilcblx0XHRcdFx0LmNyZWF0ZUluc3RhbmNlKHtcblx0XHRcdFx0XHRzZXR0aW5nczoge1xuXHRcdFx0XHRcdFx0bWV0YU1vZGVsOiBvTWV0YU1vZGVsLFxuXHRcdFx0XHRcdFx0YXBwQ29tcG9uZW50OiBvQXBwQ29tcG9uZW50LFxuXHRcdFx0XHRcdFx0Y29tcG9uZW50OiBvQ29tcG9uZW50XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KVxuXHRcdFx0XHQudGhlbigob0NhY2hlSGFuZGxlclNlcnZpY2U6IGFueSkgPT4ge1xuXHRcdFx0XHRcdHRoaXMub0NhY2hlSGFuZGxlclNlcnZpY2UgPSBvQ2FjaGVIYW5kbGVyU2VydmljZTtcblx0XHRcdFx0XHRyZXR1cm4gb0NhY2hlSGFuZGxlclNlcnZpY2UudmFsaWRhdGVDYWNoZUtleShzQ2FjaGVJZGVudGlmaWVyKTtcblx0XHRcdFx0fSlcblx0XHQpO1xuXHRcdGFTZXJ2aWNlRGVwZW5kZW5jaWVzLnB1c2goXG5cdFx0XHQoVmVyc2lvbkluZm8gYXMgYW55KVxuXHRcdFx0XHQubG9hZCgpXG5cdFx0XHRcdC50aGVuKGZ1bmN0aW9uKG9JbmZvOiBhbnkpIHtcblx0XHRcdFx0XHRsZXQgc1RpbWVzdGFtcCA9IFwiXCI7XG5cdFx0XHRcdFx0aWYgKCFvSW5mby5saWJyYXJpZXMpIHtcblx0XHRcdFx0XHRcdHNUaW1lc3RhbXAgPSAoc2FwLnVpIGFzIGFueSkuYnVpbGRpbmZvLmJ1aWxkdGltZTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0b0luZm8ubGlicmFyaWVzLmZvckVhY2goZnVuY3Rpb24ob0xpYnJhcnk6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRzVGltZXN0YW1wICs9IG9MaWJyYXJ5LmJ1aWxkVGltZXN0YW1wO1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiBzVGltZXN0YW1wO1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0cmV0dXJuIFwiPE5PVkFMVUU+XCI7XG5cdFx0XHRcdH0pXG5cdFx0KTtcblxuXHRcdGxldCBzUGFnZU1vZGVsQ2FjaGVLZXkgPSBcIlwiO1xuXHRcdHRoaXMuaW5pdFByb21pc2UgPSBQcm9taXNlLmFsbChhU2VydmljZURlcGVuZGVuY2llcylcblx0XHRcdC50aGVuKChhRGVwZW5kZW5jaWVzUmVzdWx0OiBhbnlbXSkgPT4ge1xuXHRcdFx0XHRjb25zdCBzQ2FjaGVLZXkgPSBhRGVwZW5kZW5jaWVzUmVzdWx0WzFdO1xuXHRcdFx0XHRjb25zdCBzVmVyc2lvbkluZm8gPSBhRGVwZW5kZW5jaWVzUmVzdWx0WzJdO1xuXHRcdFx0XHRjb25zdCBvU2hlbGxTZXJ2aWNlcyA9IG9BcHBDb21wb25lbnQuZ2V0U2hlbGxTZXJ2aWNlcygpO1xuXHRcdFx0XHRjb25zdCBvU2lkZUVmZmVjdHNTZXJ2aWNlcyA9IG9BcHBDb21wb25lbnQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKCk7XG5cblx0XHRcdFx0b1NpZGVFZmZlY3RzU2VydmljZXMuaW5pdGlhbGl6ZVNpZGVFZmZlY3RzKG9BcHBDb21wb25lbnQuZ2V0RW52aXJvbm1lbnRDYXBhYmlsaXRpZXMoKS5nZXRDYXBhYmlsaXRpZXMoKSk7XG5cblx0XHRcdFx0c1BhZ2VNb2RlbENhY2hlS2V5ID0gc0NhY2hlS2V5ICsgXCItXCIgKyBzVmVyc2lvbkluZm8gKyBcIi1cIiArIHNTdGFibGVJZCArIFwiLVwiICsgb1NoZWxsU2VydmljZXMuaW5zdGFuY2VUeXBlICsgXCItcGFnZU1vZGVsXCI7XG5cdFx0XHRcdHJldHVybiBQcm9taXNlLmFsbChhRGVwZW5kZW5jaWVzUmVzdWx0LmNvbmNhdChbdGhpcy5fZ2V0Q2FjaGVkTW9kZWwoc1BhZ2VNb2RlbENhY2hlS2V5KV0pKTtcblx0XHRcdH0pXG5cdFx0XHQudGhlbigoYURlcGVuZGVuY2llc1Jlc3VsdDogYW55W10pID0+IHtcblx0XHRcdFx0Y29uc3Qgb1Jlc291cmNlTW9kZWwgPSBhRGVwZW5kZW5jaWVzUmVzdWx0WzBdO1xuXHRcdFx0XHRjb25zdCBzQ2FjaGVLZXkgPSBhRGVwZW5kZW5jaWVzUmVzdWx0WzFdO1xuXHRcdFx0XHRjb25zdCBvUGFnZU1vZGVsQ2FjaGUgPSBhRGVwZW5kZW5jaWVzUmVzdWx0WzNdO1xuXHRcdFx0XHRyZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG5cdFx0XHRcdFx0c2FwLnVpLnJlcXVpcmUoXG5cdFx0XHRcdFx0XHRbXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL1RlbXBsYXRlQ29udmVydGVyXCIsIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9NZXRhTW9kZWxDb252ZXJ0ZXJcIl0sXG5cdFx0XHRcdFx0XHQoVGVtcGxhdGVDb252ZXJ0ZXI6IGFueSwgTWV0YU1vZGVsQ29udmVydGVyOiBhbnkpID0+IHtcblx0XHRcdFx0XHRcdFx0cmVzb2x2ZShcblx0XHRcdFx0XHRcdFx0XHR0aGlzLmNyZWF0ZVZpZXcoXG5cdFx0XHRcdFx0XHRcdFx0XHRvUmVzb3VyY2VNb2RlbCxcblx0XHRcdFx0XHRcdFx0XHRcdHNTdGFibGVJZCxcblx0XHRcdFx0XHRcdFx0XHRcdHNDYWNoZUtleSxcblx0XHRcdFx0XHRcdFx0XHRcdHNQYWdlTW9kZWxDYWNoZUtleSxcblx0XHRcdFx0XHRcdFx0XHRcdG9QYWdlTW9kZWxDYWNoZSxcblx0XHRcdFx0XHRcdFx0XHRcdFRlbXBsYXRlQ29udmVydGVyLFxuXHRcdFx0XHRcdFx0XHRcdFx0TWV0YU1vZGVsQ29udmVydGVyXG5cdFx0XHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSlcblx0XHRcdC50aGVuKGZ1bmN0aW9uKHNDYWNoZUtleTogYW55KSB7XG5cdFx0XHRcdGNvbnN0IG9DYWNoZUhhbmRsZXJTZXJ2aWNlID0gU2VydmljZUZhY3RvcnlSZWdpc3RyeS5nZXQoXCJzYXAuZmUuY29yZS5zZXJ2aWNlcy5DYWNoZUhhbmRsZXJTZXJ2aWNlXCIpLmdldEluc3RhbmNlKG9NZXRhTW9kZWwpO1xuXHRcdFx0XHRvQ2FjaGVIYW5kbGVyU2VydmljZS5pbnZhbGlkYXRlSWZOZWVkZWQoc0NhY2hlS2V5LCBzQ2FjaGVJZGVudGlmaWVyKTtcblx0XHRcdH0pO1xuXHR9XG5cdF9nZXRDYWNoZWRNb2RlbChzQ2FjaGVLZXk6IGFueSkge1xuXHRcdGlmIChcblx0XHRcdHNhcC51aVxuXHRcdFx0XHQuZ2V0Q29yZSgpXG5cdFx0XHRcdC5nZXRDb25maWd1cmF0aW9uKClcblx0XHRcdFx0LmdldFZpZXdDYWNoZSgpXG5cdFx0KSB7XG5cdFx0XHRyZXR1cm4gQ2FjaGVNYW5hZ2VyLmdldChzQ2FjaGVLZXkpO1xuXHRcdH1cblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cdF9zZXRDYWNoZWRNb2RlbChzQ2FjaGVLZXk6IHN0cmluZywgb0NhY2hlTW9kZWw6IGFueSkge1xuXHRcdGlmIChcblx0XHRcdHNhcC51aVxuXHRcdFx0XHQuZ2V0Q29yZSgpXG5cdFx0XHRcdC5nZXRDb25maWd1cmF0aW9uKClcblx0XHRcdFx0LmdldFZpZXdDYWNoZSgpXG5cdFx0KSB7XG5cdFx0XHRDYWNoZU1hbmFnZXIuc2V0KHNDYWNoZUtleSwgb0NhY2hlTW9kZWwpO1xuXHRcdH1cblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cdC8qKlxuXHQgKiBSZWZyZXNoIHRoZSBjdXJyZW50IHZpZXcgdXNpbmcgdGhlIHNhbWUgY29uZmlndXJhdGlvbiBhcyBiZWZvcmUuXG5cdCAqIFRoaXMgaXMgdXNlZnVsIGZvciBvdXIgZGVtb2tpdCAhXG5cdCAqXG5cdCAqIEBwYXJhbSBvQ29tcG9uZW50XG5cdCAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0cmVmcmVzaFZpZXcob0NvbXBvbmVudDogYW55KSB7XG5cdFx0Y29uc3Qgb1Jvb3RWaWV3ID0gb0NvbXBvbmVudC5nZXRSb290Q29udHJvbCgpO1xuXHRcdGlmIChvUm9vdFZpZXcpIHtcblx0XHRcdG9Sb290Vmlldy5kZXN0cm95KCk7XG5cdFx0fSBlbHNlIGlmICh0aGlzLm9WaWV3KSB7XG5cdFx0XHR0aGlzLm9WaWV3LmRlc3Ryb3koKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMuY3JlYXRlVmlldyh0aGlzLnJlc291cmNlTW9kZWwsIHRoaXMuc3RhYmxlSWQsIFwiXCIsIFwiXCIsIHVuZGVmaW5lZCwgdGhpcy5UZW1wbGF0ZUNvbnZlcnRlciwgdGhpcy5NZXRhTW9kZWxDb252ZXJ0ZXIpXG5cdFx0XHQudGhlbihmdW5jdGlvbigpIHtcblx0XHRcdFx0b0NvbXBvbmVudC5vQ29udGFpbmVyLmludmFsaWRhdGUoKTtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24ob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0b0NvbXBvbmVudC5vQ29udGFpbmVyLmludmFsaWRhdGUoKTtcblx0XHRcdFx0TG9nLmVycm9yKG9FcnJvcik7XG5cdFx0XHR9KTtcblx0fVxuXHRjcmVhdGVWaWV3KFxuXHRcdG9SZXNvdXJjZU1vZGVsOiBhbnksXG5cdFx0c1N0YWJsZUlkOiBhbnksXG5cdFx0c0NhY2hlS2V5OiBhbnksXG5cdFx0c1BhZ2VNb2RlbENhY2hlS2V5OiBhbnksXG5cdFx0b1BhZ2VNb2RlbENhY2hlOiBhbnksXG5cdFx0VGVtcGxhdGVDb252ZXJ0ZXI6IGFueSxcblx0XHRNZXRhTW9kZWxDb252ZXJ0ZXI6IGFueVxuXHQpIHtcblx0XHR0aGlzLnJlc291cmNlTW9kZWwgPSBvUmVzb3VyY2VNb2RlbDtcblx0XHR0aGlzLnN0YWJsZUlkID0gc1N0YWJsZUlkO1xuXHRcdHRoaXMuVGVtcGxhdGVDb252ZXJ0ZXIgPSBUZW1wbGF0ZUNvbnZlcnRlcjtcblx0XHR0aGlzLk1ldGFNb2RlbENvbnZlcnRlciA9IE1ldGFNb2RlbENvbnZlcnRlcjtcblx0XHRjb25zdCBvQ29udGV4dCA9IHRoaXMuZ2V0Q29udGV4dCgpO1xuXHRcdGNvbnN0IG1TZXJ2aWNlU2V0dGluZ3MgPSBvQ29udGV4dC5zZXR0aW5ncztcblx0XHRjb25zdCBzQ29udmVydGVyVHlwZSA9IG1TZXJ2aWNlU2V0dGluZ3MuY29udmVydGVyVHlwZTtcblx0XHRjb25zdCBvQ29tcG9uZW50ID0gb0NvbnRleHQuc2NvcGVPYmplY3Q7XG5cdFx0Y29uc3Qgb0FwcENvbXBvbmVudDogQXBwQ29tcG9uZW50ID0gQ29tcG9uZW50LmdldE93bmVyQ29tcG9uZW50Rm9yKG9Db21wb25lbnQpO1xuXHRcdGNvbnN0IHNGdWxsQ29udGV4dFBhdGggPSBvQXBwQ29tcG9uZW50LmdldFJvdXRpbmdTZXJ2aWNlKCkuZ2V0VGFyZ2V0SW5mb3JtYXRpb25Gb3Iob0NvbXBvbmVudCkub3B0aW9ucy5zZXR0aW5ncy5mdWxsQ29udGV4dFBhdGg7XG5cdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG9BcHBDb21wb25lbnQuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0Y29uc3Qgb01hbmlmZXN0Q29udGVudDogYW55ID0gb0FwcENvbXBvbmVudC5nZXRNYW5pZmVzdCgpO1xuXHRcdGNvbnN0IG9EZXZpY2VNb2RlbCA9IG5ldyBKU09OTW9kZWwoc2FwLnVpLkRldmljZSkuc2V0RGVmYXVsdEJpbmRpbmdNb2RlKFwiT25lV2F5XCIpO1xuXHRcdGNvbnN0IG9NYW5pZmVzdE1vZGVsID0gbmV3IEpTT05Nb2RlbChvTWFuaWZlc3RDb250ZW50KTtcblx0XHRjb25zdCBiRXJyb3IgPSBmYWxzZTtcblx0XHRsZXQgb1BhZ2VNb2RlbDogVGVtcGxhdGVNb2RlbCwgb1ZpZXdEYXRhTW9kZWw6IE1vZGVsLCBvVmlld1NldHRpbmdzOiBhbnksIG1WaWV3RGF0YTogYW55O1xuXG5cdFx0ZnVuY3Rpb24gZ2V0Vmlld1NldHRpbmdzKCkge1xuXHRcdFx0Y29uc3QgYVNwbGl0UGF0aCA9IHNGdWxsQ29udGV4dFBhdGguc3BsaXQoXCIvXCIpO1xuXHRcdFx0Y29uc3Qgc0VudGl0eVNldFBhdGggPSBhU3BsaXRQYXRoLnJlZHVjZShmdW5jdGlvbihzUGF0aFNvRmFyOiBhbnksIHNOZXh0UGF0aFBhcnQ6IGFueSkge1xuXHRcdFx0XHRpZiAoc05leHRQYXRoUGFydCA9PT0gXCJcIikge1xuXHRcdFx0XHRcdHJldHVybiBzUGF0aFNvRmFyO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChzUGF0aFNvRmFyID09PSBcIlwiKSB7XG5cdFx0XHRcdFx0c1BhdGhTb0ZhciA9IFwiL1wiICsgc05leHRQYXRoUGFydDtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRjb25zdCBvVGFyZ2V0ID0gb01ldGFNb2RlbC5nZXRPYmplY3Qoc1BhdGhTb0ZhciArIFwiLyROYXZpZ2F0aW9uUHJvcGVydHlCaW5kaW5nL1wiICsgc05leHRQYXRoUGFydCk7XG5cdFx0XHRcdFx0aWYgKG9UYXJnZXQgJiYgT2JqZWN0LmtleXMob1RhcmdldCkubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdFx0c1BhdGhTb0ZhciArPSBcIi8kTmF2aWdhdGlvblByb3BlcnR5QmluZGluZ1wiO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRzUGF0aFNvRmFyICs9IFwiL1wiICsgc05leHRQYXRoUGFydDtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gc1BhdGhTb0Zhcjtcblx0XHRcdH0sIFwiXCIpO1xuXHRcdFx0Y29uc3Qgb1ZpZXdTZXR0aW5ncyA9IHtcblx0XHRcdFx0dHlwZTogXCJYTUxcIixcblx0XHRcdFx0cHJlcHJvY2Vzc29yczoge1xuXHRcdFx0XHRcdHhtbDoge1xuXHRcdFx0XHRcdFx0YmluZGluZ0NvbnRleHRzOiB7XG5cdFx0XHRcdFx0XHRcdGVudGl0eVNldDogc0VudGl0eVNldFBhdGggPyBvTWV0YU1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KHNFbnRpdHlTZXRQYXRoKSA6IG51bGwsXG5cdFx0XHRcdFx0XHRcdGZ1bGxDb250ZXh0UGF0aDogc0Z1bGxDb250ZXh0UGF0aCA/IG9NZXRhTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoc0Z1bGxDb250ZXh0UGF0aCkgOiBudWxsLFxuXHRcdFx0XHRcdFx0XHRjb250ZXh0UGF0aDogc0Z1bGxDb250ZXh0UGF0aCA/IG9NZXRhTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoc0Z1bGxDb250ZXh0UGF0aCkgOiBudWxsLFxuXHRcdFx0XHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0OiBvUGFnZU1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KFwiL1wiLCB1bmRlZmluZWQsIHsgbm9SZXNvbHZlOiB0cnVlIH0pLFxuXHRcdFx0XHRcdFx0XHR2aWV3RGF0YTogbVZpZXdEYXRhID8gb1ZpZXdEYXRhTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoXCIvXCIpIDogbnVsbFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdG1vZGVsczoge1xuXHRcdFx0XHRcdFx0XHRlbnRpdHlTZXQ6IG9NZXRhTW9kZWwsXG5cdFx0XHRcdFx0XHRcdGZ1bGxDb250ZXh0UGF0aDogb01ldGFNb2RlbCxcblx0XHRcdFx0XHRcdFx0Y29udGV4dFBhdGg6IG9NZXRhTW9kZWwsXG5cdFx0XHRcdFx0XHRcdFwic2FwLmZlLmkxOG5cIjogb1Jlc291cmNlTW9kZWwsXG5cdFx0XHRcdFx0XHRcdG1ldGFNb2RlbDogb01ldGFNb2RlbCxcblx0XHRcdFx0XHRcdFx0XCJkZXZpY2VcIjogb0RldmljZU1vZGVsLCAvLyBUT0RPOiBkaXNjdXNzIG5hbWVzIGhlcmVcblx0XHRcdFx0XHRcdFx0bWFuaWZlc3Q6IG9NYW5pZmVzdE1vZGVsLFxuXHRcdFx0XHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0OiBvUGFnZU1vZGVsLFxuXHRcdFx0XHRcdFx0XHR2aWV3RGF0YTogb1ZpZXdEYXRhTW9kZWxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRhcHBDb21wb25lbnQ6IG9BcHBDb21wb25lbnRcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0sXG5cdFx0XHRcdGlkOiBzU3RhYmxlSWQsXG5cdFx0XHRcdHZpZXdOYW1lOiBtU2VydmljZVNldHRpbmdzLnZpZXdOYW1lIHx8IG9Db21wb25lbnQuZ2V0Vmlld05hbWUoKSxcblx0XHRcdFx0dmlld0RhdGE6IG1WaWV3RGF0YSxcblx0XHRcdFx0Y2FjaGU6IHsga2V5czogW3NDYWNoZUtleV0gfSxcblx0XHRcdFx0bW9kZWxzOiB7XG5cdFx0XHRcdFx0XCJzYXAuZmUuaTE4blwiOiBvUmVzb3VyY2VNb2RlbFxuXHRcdFx0XHR9LFxuXHRcdFx0XHRoZWlnaHQ6IFwiMTAwJVwiXG5cdFx0XHR9O1xuXHRcdFx0cmV0dXJuIG9WaWV3U2V0dGluZ3M7XG5cdFx0fVxuXHRcdGNvbnN0IGNyZWF0ZUVycm9yUGFnZSA9IChyZWFzb246IGFueSkgPT4ge1xuXHRcdFx0Ly8ganVzdCByZXBsYWNlIHRoZSB2aWV3IG5hbWUgYW5kIGFkZCBhbiBhZGRpdGlvbmFsIG1vZGVsIGNvbnRhaW5pbmcgdGhlIHJlYXNvbiwgYnV0XG5cdFx0XHQvLyBrZWVwIHRoZSBvdGhlciBzZXR0aW5nc1xuXHRcdFx0TG9nLmVycm9yKHJlYXNvbi5tZXNzYWdlLCByZWFzb24pO1xuXHRcdFx0b1ZpZXdTZXR0aW5ncy52aWV3TmFtZSA9IG1TZXJ2aWNlU2V0dGluZ3MuZXJyb3JWaWV3TmFtZSB8fCBcInNhcC5mZS5jb3JlLnNlcnZpY2VzLnZpZXcuVGVtcGxhdGluZ0Vycm9yUGFnZVwiO1xuXHRcdFx0b1ZpZXdTZXR0aW5ncy5wcmVwcm9jZXNzb3JzLnhtbC5tb2RlbHNbXCJlcnJvclwiXSA9IG5ldyBKU09OTW9kZWwocmVhc29uKTtcblxuXHRcdFx0cmV0dXJuIG9Db21wb25lbnQucnVuQXNPd25lcigoKSA9PiB7XG5cdFx0XHRcdHJldHVybiBWaWV3LmNyZWF0ZShvVmlld1NldHRpbmdzKS50aGVuKChvVmlldzogYW55KSA9PiB7XG5cdFx0XHRcdFx0dGhpcy5vVmlldyA9IG9WaWV3O1xuXHRcdFx0XHRcdHRoaXMub1ZpZXcuc2V0TW9kZWwobmV3IE1hbmFnZWRPYmplY3RNb2RlbCh0aGlzLm9WaWV3KSwgXCIkdmlld1wiKTtcblx0XHRcdFx0XHRvQ29tcG9uZW50LnNldEFnZ3JlZ2F0aW9uKFwicm9vdENvbnRyb2xcIiwgdGhpcy5vVmlldyk7XG5cdFx0XHRcdFx0cmV0dXJuIHNDYWNoZUtleTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblx0XHR9O1xuXHRcdHJldHVybiBvQXBwQ29tcG9uZW50XG5cdFx0XHQuZ2V0U2VydmljZShcInJvdXRpbmdTZXJ2aWNlXCIpXG5cdFx0XHQudGhlbigob1JvdXRpbmdTZXJ2aWNlOiBhbnkpID0+IHtcblx0XHRcdFx0Ly8gUmV0cmlldmUgdGhlIHZpZXdMZXZlbCBmb3IgdGhlIGNvbXBvbmVudFxuXHRcdFx0XHRjb25zdCBvVGFyZ2V0SW5mbyA9IG9Sb3V0aW5nU2VydmljZS5nZXRUYXJnZXRJbmZvcm1hdGlvbkZvcihvQ29tcG9uZW50KTtcblx0XHRcdFx0Y29uc3QgbU91dGJvdW5kcyA9XG5cdFx0XHRcdFx0b01hbmlmZXN0Q29udGVudFtcInNhcC5hcHBcIl0gJiZcblx0XHRcdFx0XHRvTWFuaWZlc3RDb250ZW50W1wic2FwLmFwcFwiXS5jcm9zc05hdmlnYXRpb24gJiZcblx0XHRcdFx0XHRvTWFuaWZlc3RDb250ZW50W1wic2FwLmFwcFwiXS5jcm9zc05hdmlnYXRpb24ub3V0Ym91bmRzO1xuXHRcdFx0XHRjb25zdCBtTmF2aWdhdGlvbiA9IG9Db21wb25lbnQuZ2V0TmF2aWdhdGlvbigpIHx8IHt9O1xuXHRcdFx0XHRPYmplY3Qua2V5cyhtTmF2aWdhdGlvbikuZm9yRWFjaChmdW5jdGlvbihuYXZpZ2F0aW9uT2JqZWN0S2V5OiBzdHJpbmcpIHtcblx0XHRcdFx0XHRjb25zdCBuYXZpZ2F0aW9uT2JqZWN0ID0gbU5hdmlnYXRpb25bbmF2aWdhdGlvbk9iamVjdEtleV07XG5cdFx0XHRcdFx0bGV0IG91dGJvdW5kQ29uZmlnO1xuXHRcdFx0XHRcdGlmIChuYXZpZ2F0aW9uT2JqZWN0LmRldGFpbCAmJiBuYXZpZ2F0aW9uT2JqZWN0LmRldGFpbC5vdXRib3VuZCAmJiBtT3V0Ym91bmRzW25hdmlnYXRpb25PYmplY3QuZGV0YWlsLm91dGJvdW5kXSkge1xuXHRcdFx0XHRcdFx0b3V0Ym91bmRDb25maWcgPSBtT3V0Ym91bmRzW25hdmlnYXRpb25PYmplY3QuZGV0YWlsLm91dGJvdW5kXTtcblx0XHRcdFx0XHRcdG5hdmlnYXRpb25PYmplY3QuZGV0YWlsLm91dGJvdW5kRGV0YWlsID0ge1xuXHRcdFx0XHRcdFx0XHRzZW1hbnRpY09iamVjdDogb3V0Ym91bmRDb25maWcuc2VtYW50aWNPYmplY3QsXG5cdFx0XHRcdFx0XHRcdGFjdGlvbjogb3V0Ym91bmRDb25maWcuYWN0aW9uLFxuXHRcdFx0XHRcdFx0XHRwYXJhbWV0ZXJzOiBvdXRib3VuZENvbmZpZy5wYXJhbWV0ZXJzXG5cdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAobmF2aWdhdGlvbk9iamVjdC5jcmVhdGUgJiYgbmF2aWdhdGlvbk9iamVjdC5jcmVhdGUub3V0Ym91bmQgJiYgbU91dGJvdW5kc1tuYXZpZ2F0aW9uT2JqZWN0LmNyZWF0ZS5vdXRib3VuZF0pIHtcblx0XHRcdFx0XHRcdG91dGJvdW5kQ29uZmlnID0gbU91dGJvdW5kc1tuYXZpZ2F0aW9uT2JqZWN0LmNyZWF0ZS5vdXRib3VuZF07XG5cdFx0XHRcdFx0XHRuYXZpZ2F0aW9uT2JqZWN0LmNyZWF0ZS5vdXRib3VuZERldGFpbCA9IHtcblx0XHRcdFx0XHRcdFx0c2VtYW50aWNPYmplY3Q6IG91dGJvdW5kQ29uZmlnLnNlbWFudGljT2JqZWN0LFxuXHRcdFx0XHRcdFx0XHRhY3Rpb246IG91dGJvdW5kQ29uZmlnLmFjdGlvbixcblx0XHRcdFx0XHRcdFx0cGFyYW1ldGVyczogb3V0Ym91bmRDb25maWcucGFyYW1ldGVyc1xuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRtVmlld0RhdGEgPSB7XG5cdFx0XHRcdFx0bmF2aWdhdGlvbjogbU5hdmlnYXRpb24sXG5cdFx0XHRcdFx0dmlld0xldmVsOiBvVGFyZ2V0SW5mby52aWV3TGV2ZWwsXG5cdFx0XHRcdFx0c3RhYmxlSWQ6IHNTdGFibGVJZCxcblx0XHRcdFx0XHRjb250ZW50RGVuc2l0aWVzOiBvTWFuaWZlc3RDb250ZW50W1wic2FwLnVpNVwiXS5jb250ZW50RGVuc2l0aWVzLFxuXHRcdFx0XHRcdHJlc291cmNlQnVuZGxlOiBvUmVzb3VyY2VNb2RlbC5fX2J1bmRsZSxcblx0XHRcdFx0XHRmdWxsQ29udGV4dFBhdGg6IHNGdWxsQ29udGV4dFBhdGgsXG5cdFx0XHRcdFx0aXNEZXNrdG9wOiAoRGV2aWNlIGFzIGFueSkuc3lzdGVtLmRlc2t0b3AsXG5cdFx0XHRcdFx0aXNQaG9uZTogKERldmljZSBhcyBhbnkpLnN5c3RlbS5waG9uZVxuXHRcdFx0XHR9O1xuXG5cdFx0XHRcdGlmIChvQ29tcG9uZW50LmdldFZpZXdEYXRhKSB7XG5cdFx0XHRcdFx0T2JqZWN0LmFzc2lnbihtVmlld0RhdGEsIG9Db21wb25lbnQuZ2V0Vmlld0RhdGEoKSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjb25zdCBvU2hlbGxTZXJ2aWNlcyA9IG9BcHBDb21wb25lbnQuZ2V0U2hlbGxTZXJ2aWNlcygpO1xuXHRcdFx0XHRtVmlld0RhdGEuY29udmVydGVyVHlwZSA9IHNDb252ZXJ0ZXJUeXBlO1xuXHRcdFx0XHRtVmlld0RhdGEuc2hlbGxDb250ZW50RGVuc2l0eSA9IG9TaGVsbFNlcnZpY2VzLmdldENvbnRlbnREZW5zaXR5KCk7XG5cdFx0XHRcdG1WaWV3RGF0YS51c2VOZXdMYXp5TG9hZGluZyA9IFVyaVBhcmFtZXRlcnMuZnJvbVF1ZXJ5KHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpLmdldChcInNhcC1mZS14eC1sYXp5bG9hZGluZ3Rlc3RcIikgPT09IFwidHJ1ZVwiO1xuXHRcdFx0XHRtVmlld0RhdGEucmV0cmlldmVUZXh0RnJvbVZhbHVlTGlzdCA9XG5cdFx0XHRcdFx0b01hbmlmZXN0Q29udGVudFtcInNhcC5mZVwiXSAmJiBvTWFuaWZlc3RDb250ZW50W1wic2FwLmZlXCJdLmZvcm1cblx0XHRcdFx0XHRcdD8gb01hbmlmZXN0Q29udGVudFtcInNhcC5mZVwiXS5mb3JtLnJldHJpZXZlVGV4dEZyb21WYWx1ZUxpc3Rcblx0XHRcdFx0XHRcdDogdW5kZWZpbmVkO1xuXHRcdFx0XHRvVmlld0RhdGFNb2RlbCA9IG5ldyBKU09OTW9kZWwobVZpZXdEYXRhKTtcblx0XHRcdFx0aWYgKG1WaWV3RGF0YSAmJiBtVmlld0RhdGEuY29udHJvbENvbmZpZ3VyYXRpb24pIHtcblx0XHRcdFx0XHRPYmplY3Qua2V5cyhtVmlld0RhdGEuY29udHJvbENvbmZpZ3VyYXRpb24pLmZvckVhY2goZnVuY3Rpb24oc0Fubm90YXRpb25QYXRoOiBzdHJpbmcpIHtcblx0XHRcdFx0XHRcdGlmIChzQW5ub3RhdGlvblBhdGguaW5kZXhPZihcIltcIikgIT09IC0xKSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IHNUYXJnZXRBbm5vdGF0aW9uUGF0aCA9IER5bmFtaWNBbm5vdGF0aW9uUGF0aEhlbHBlci5yZXNvbHZlRHluYW1pY0V4cHJlc3Npb24oc0Fubm90YXRpb25QYXRoLCBvTWV0YU1vZGVsKTtcblx0XHRcdFx0XHRcdFx0bVZpZXdEYXRhLmNvbnRyb2xDb25maWd1cmF0aW9uW3NUYXJnZXRBbm5vdGF0aW9uUGF0aF0gPSBtVmlld0RhdGEuY29udHJvbENvbmZpZ3VyYXRpb25bc0Fubm90YXRpb25QYXRoXTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRNZXRhTW9kZWxDb252ZXJ0ZXIuY29udmVydFR5cGVzKG9NZXRhTW9kZWwsIG9BcHBDb21wb25lbnQuZ2V0RW52aXJvbm1lbnRDYXBhYmlsaXRpZXMoKS5nZXRDYXBhYmlsaXRpZXMoKSk7XG5cdFx0XHRcdG9QYWdlTW9kZWwgPSBuZXcgVGVtcGxhdGVNb2RlbCgoKSA9PiB7XG5cdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdGlmICghIW9QYWdlTW9kZWxDYWNoZSkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gb1BhZ2VNb2RlbENhY2hlO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0Y29uc3Qgb0RpYWdub3N0aWNzID0gb0FwcENvbXBvbmVudC5nZXREaWFnbm9zdGljcygpO1xuXHRcdFx0XHRcdFx0XHRjb25zdCBpSXNzdWVDb3VudCA9IG9EaWFnbm9zdGljcy5nZXRJc3N1ZXMoKS5sZW5ndGg7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IG9Db252ZXJ0ZXJQYWdlTW9kZWwgPSBUZW1wbGF0ZUNvbnZlcnRlci5jb252ZXJ0UGFnZShcblx0XHRcdFx0XHRcdFx0XHRzQ29udmVydGVyVHlwZSxcblx0XHRcdFx0XHRcdFx0XHRvTWV0YU1vZGVsLFxuXHRcdFx0XHRcdFx0XHRcdG1WaWV3RGF0YSxcblx0XHRcdFx0XHRcdFx0XHRvRGlhZ25vc3RpY3MsXG5cdFx0XHRcdFx0XHRcdFx0c0Z1bGxDb250ZXh0UGF0aCxcblx0XHRcdFx0XHRcdFx0XHRvQXBwQ29tcG9uZW50LmdldEVudmlyb25tZW50Q2FwYWJpbGl0aWVzKCkuZ2V0Q2FwYWJpbGl0aWVzKClcblx0XHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0XHRjb25zdCBhSXNzdWVzID0gb0RpYWdub3N0aWNzLmdldElzc3VlcygpO1xuXHRcdFx0XHRcdFx0XHRjb25zdCBhQWRkZWRJc3N1ZXMgPSBhSXNzdWVzLnNsaWNlKGlJc3N1ZUNvdW50KTtcblx0XHRcdFx0XHRcdFx0aWYgKGFBZGRlZElzc3Vlcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0XHRcdFx0TG9nLndhcm5pbmcoXG5cdFx0XHRcdFx0XHRcdFx0XHRcIlNvbWUgaXNzdWVzIGhhdmUgYmVlbiBkZXRlY3RlZCBpbiB5b3VyIHByb2plY3QsIHBsZWFzZSBjaGVjayB0aGUgVUk1IHN1cHBvcnQgYXNzaXN0YW50IHJ1bGUgZm9yIHNhcC5mZS5jb3JlXCJcblx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdC8vIEZpcmUgYW5kIGZvcmdldCBpbiB0aGUgY2FjaGVcblx0XHRcdFx0XHRcdFx0dGhpcy5fc2V0Q2FjaGVkTW9kZWwoc1BhZ2VNb2RlbENhY2hlS2V5LCBvQ29udmVydGVyUGFnZU1vZGVsKTtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIG9Db252ZXJ0ZXJQYWdlTW9kZWw7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0XHRcdExvZy5lcnJvcihlcnJvciwgZXJyb3IpO1xuXHRcdFx0XHRcdFx0cmV0dXJuIHt9O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSwgb01ldGFNb2RlbCk7XG5cblx0XHRcdFx0aWYgKCFiRXJyb3IpIHtcblx0XHRcdFx0XHRvVmlld1NldHRpbmdzID0gZ2V0Vmlld1NldHRpbmdzKCk7XG5cdFx0XHRcdFx0Ly8gU2V0dGluZyB0aGUgcGFnZU1vZGVsIG9uIHRoZSBjb21wb25lbnQgZm9yIHBvdGVudGlhbCByZXVzZVxuXHRcdFx0XHRcdG9Db21wb25lbnQuc2V0TW9kZWwob1BhZ2VNb2RlbCwgXCJfcGFnZU1vZGVsXCIpO1xuXHRcdFx0XHRcdHJldHVybiBvQ29tcG9uZW50LnJ1bkFzT3duZXIoKCkgPT4ge1xuXHRcdFx0XHRcdFx0cmV0dXJuIFZpZXcuY3JlYXRlKG9WaWV3U2V0dGluZ3MpXG5cdFx0XHRcdFx0XHRcdC5jYXRjaChjcmVhdGVFcnJvclBhZ2UpXG5cdFx0XHRcdFx0XHRcdC50aGVuKChvVmlldzogYW55KSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5vVmlldyA9IG9WaWV3O1xuXHRcdFx0XHRcdFx0XHRcdHRoaXMub1ZpZXcuc2V0TW9kZWwobmV3IE1hbmFnZWRPYmplY3RNb2RlbCh0aGlzLm9WaWV3KSwgXCIkdmlld1wiKTtcblx0XHRcdFx0XHRcdFx0XHR0aGlzLm9WaWV3LnNldE1vZGVsKG9WaWV3RGF0YU1vZGVsLCBcInZpZXdEYXRhXCIpO1xuXHRcdFx0XHRcdFx0XHRcdG9Db21wb25lbnQuc2V0QWdncmVnYXRpb24oXCJyb290Q29udHJvbFwiLCB0aGlzLm9WaWV3KTtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gc0NhY2hlS2V5O1xuXHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHQuY2F0Y2goTG9nLmVycm9yKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0fSlcblx0XHRcdC5jYXRjaChmdW5jdGlvbihlcnJvcjogYW55KSB7XG5cdFx0XHRcdExvZy5lcnJvcihlcnJvci5tZXNzYWdlLCBlcnJvcik7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcIkVycm9yIHdoaWxlIGNyZWF0aW5nIHZpZXcgOiBcIiArIGVycm9yKTtcblx0XHRcdH0pO1xuXHR9XG5cdGdldFZpZXcoKSB7XG5cdFx0cmV0dXJuIHRoaXMub1ZpZXc7XG5cdH1cblx0Z2V0SW50ZXJmYWNlKCk6IGFueSB7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblx0ZXhpdCgpIHtcblx0XHQvLyBEZXJlZ2lzdGVyIGdsb2JhbCBpbnN0YW5jZVxuXHRcdHRoaXMub1Jlc291cmNlTW9kZWxTZXJ2aWNlICYmIHRoaXMub1Jlc291cmNlTW9kZWxTZXJ2aWNlLmRlc3Ryb3koKTtcblx0XHR0aGlzLm9DYWNoZUhhbmRsZXJTZXJ2aWNlICYmIHRoaXMub0NhY2hlSGFuZGxlclNlcnZpY2UuZGVzdHJveSgpO1xuXHRcdHRoaXMub0ZhY3RvcnkucmVtb3ZlR2xvYmFsSW5zdGFuY2UoKTtcblx0fVxufVxuY2xhc3MgVGVtcGxhdGVkVmlld1NlcnZpY2VGYWN0b3J5IGV4dGVuZHMgU2VydmljZUZhY3Rvcnk8VGVtcGxhdGVkVmlld1NlcnZpY2VTZXR0aW5ncz4ge1xuXHRfb0luc3RhbmNlUmVnaXN0cnk6IFJlY29yZDxzdHJpbmcsIFRlbXBsYXRlZFZpZXdTZXJ2aWNlPiA9IHt9O1xuXHRzdGF0aWMgaUNyZWF0aW5nVmlld3M6IDA7XG5cdGNyZWF0ZUluc3RhbmNlKG9TZXJ2aWNlQ29udGV4dDogU2VydmljZUNvbnRleHQ8VGVtcGxhdGVkVmlld1NlcnZpY2VTZXR0aW5ncz4pIHtcblx0XHRUZW1wbGF0ZWRWaWV3U2VydmljZUZhY3RvcnkuaUNyZWF0aW5nVmlld3MrKztcblxuXHRcdGNvbnN0IG9UZW1wbGF0ZWRWaWV3U2VydmljZSA9IG5ldyBUZW1wbGF0ZWRWaWV3U2VydmljZShPYmplY3QuYXNzaWduKHsgZmFjdG9yeTogdGhpcyB9LCBvU2VydmljZUNvbnRleHQpKTtcblx0XHRyZXR1cm4gb1RlbXBsYXRlZFZpZXdTZXJ2aWNlLmluaXRQcm9taXNlLnRoZW4oZnVuY3Rpb24oKSB7XG5cdFx0XHRUZW1wbGF0ZWRWaWV3U2VydmljZUZhY3RvcnkuaUNyZWF0aW5nVmlld3MtLTtcblx0XHRcdHJldHVybiBvVGVtcGxhdGVkVmlld1NlcnZpY2U7XG5cdFx0fSk7XG5cdH1cblx0cmVtb3ZlR2xvYmFsSW5zdGFuY2UoKSB7XG5cdFx0dGhpcy5fb0luc3RhbmNlUmVnaXN0cnkgPSB7fTtcblx0fVxuXHRzdGF0aWMgZ2V0TnVtYmVyT2ZWaWV3c0luQ3JlYXRpb25TdGF0ZSgpIHtcblx0XHRyZXR1cm4gVGVtcGxhdGVkVmlld1NlcnZpY2VGYWN0b3J5LmlDcmVhdGluZ1ZpZXdzO1xuXHR9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFRlbXBsYXRlZFZpZXdTZXJ2aWNlRmFjdG9yeTtcbiJdfQ==
431
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlRlbXBsYXRlZFZpZXdTZXJ2aWNlRmFjdG9yeS50cyJdLCJuYW1lcyI6WyJUZW1wbGF0ZWRWaWV3U2VydmljZSIsImluaXQiLCJhU2VydmljZURlcGVuZGVuY2llcyIsIm9Db250ZXh0IiwiZ2V0Q29udGV4dCIsIm9Db21wb25lbnQiLCJzY29wZU9iamVjdCIsIm9BcHBDb21wb25lbnQiLCJDb21wb25lbnQiLCJnZXRPd25lckNvbXBvbmVudEZvciIsIm9NZXRhTW9kZWwiLCJnZXRNZXRhTW9kZWwiLCJzU3RhYmxlSWQiLCJnZXRNZXRhZGF0YSIsImdldENvbXBvbmVudE5hbWUiLCJnZXRMb2NhbElkIiwiZ2V0SWQiLCJhRW5oYW5jZUkxOG4iLCJnZXRFbmhhbmNlSTE4biIsInNBcHBOYW1lc3BhY2UiLCJvRmFjdG9yeSIsImZhY3RvcnkiLCJpIiwibGVuZ3RoIiwib1Jlc291cmNlTW9kZWwiLCJnZXRNb2RlbCIsImlzQSIsInJlcGxhY2UiLCJzQ2FjaGVJZGVudGlmaWVyIiwiZ2V0TmFtZSIsInNhcCIsInVpIiwiZ2V0Q29yZSIsImdldENvbmZpZ3VyYXRpb24iLCJnZXRMYW5ndWFnZVRhZyIsInB1c2giLCJTZXJ2aWNlRmFjdG9yeVJlZ2lzdHJ5IiwiZ2V0IiwiY3JlYXRlSW5zdGFuY2UiLCJzY29wZVR5cGUiLCJzZXR0aW5ncyIsImJ1bmRsZXMiLCJlbmhhbmNlSTE4biIsIm1vZGVsTmFtZSIsInRoZW4iLCJvUmVzb3VyY2VNb2RlbFNlcnZpY2UiLCJnZXRSZXNvdXJjZU1vZGVsIiwibWV0YU1vZGVsIiwiYXBwQ29tcG9uZW50IiwiY29tcG9uZW50Iiwib0NhY2hlSGFuZGxlclNlcnZpY2UiLCJ2YWxpZGF0ZUNhY2hlS2V5IiwiVmVyc2lvbkluZm8iLCJsb2FkIiwib0luZm8iLCJzVGltZXN0YW1wIiwibGlicmFyaWVzIiwiYnVpbGRpbmZvIiwiYnVpbGR0aW1lIiwiZm9yRWFjaCIsIm9MaWJyYXJ5IiwiYnVpbGRUaW1lc3RhbXAiLCJjYXRjaCIsInNQYWdlTW9kZWxDYWNoZUtleSIsImluaXRQcm9taXNlIiwiUHJvbWlzZSIsImFsbCIsImFEZXBlbmRlbmNpZXNSZXN1bHQiLCJzQ2FjaGVLZXkiLCJzVmVyc2lvbkluZm8iLCJvU2hlbGxTZXJ2aWNlcyIsImdldFNoZWxsU2VydmljZXMiLCJvU2lkZUVmZmVjdHNTZXJ2aWNlcyIsImdldFNpZGVFZmZlY3RzU2VydmljZSIsImluaXRpYWxpemVTaWRlRWZmZWN0cyIsImdldEVudmlyb25tZW50Q2FwYWJpbGl0aWVzIiwiZ2V0Q2FwYWJpbGl0aWVzIiwiaW5zdGFuY2VUeXBlIiwidW5kZWZpbmVkIiwiY29uY2F0IiwiX2dldENhY2hlZE1vZGVsIiwib1BhZ2VNb2RlbENhY2hlIiwicmVzb2x2ZSIsInJlcXVpcmUiLCJUZW1wbGF0ZUNvbnZlcnRlciIsIk1ldGFNb2RlbENvbnZlcnRlciIsImNyZWF0ZVZpZXciLCJnZXRJbnN0YW5jZSIsImludmFsaWRhdGVJZk5lZWRlZCIsImdldFZpZXdDYWNoZSIsIkNhY2hlTWFuYWdlciIsIl9zZXRDYWNoZWRNb2RlbCIsIm9DYWNoZU1vZGVsIiwic2V0IiwicmVmcmVzaFZpZXciLCJvUm9vdFZpZXciLCJnZXRSb290Q29udHJvbCIsImRlc3Ryb3kiLCJvVmlldyIsInJlc291cmNlTW9kZWwiLCJzdGFibGVJZCIsIm9Db250YWluZXIiLCJpbnZhbGlkYXRlIiwib0Vycm9yIiwiTG9nIiwiZXJyb3IiLCJtU2VydmljZVNldHRpbmdzIiwic0NvbnZlcnRlclR5cGUiLCJjb252ZXJ0ZXJUeXBlIiwic0Z1bGxDb250ZXh0UGF0aCIsImdldFJvdXRpbmdTZXJ2aWNlIiwiZ2V0VGFyZ2V0SW5mb3JtYXRpb25Gb3IiLCJvcHRpb25zIiwiZnVsbENvbnRleHRQYXRoIiwib01hbmlmZXN0Q29udGVudCIsImdldE1hbmlmZXN0Iiwib0RldmljZU1vZGVsIiwiSlNPTk1vZGVsIiwiRGV2aWNlIiwic2V0RGVmYXVsdEJpbmRpbmdNb2RlIiwib01hbmlmZXN0TW9kZWwiLCJiRXJyb3IiLCJvUGFnZU1vZGVsIiwib1ZpZXdEYXRhTW9kZWwiLCJvVmlld1NldHRpbmdzIiwibVZpZXdEYXRhIiwiZ2V0Vmlld1NldHRpbmdzIiwiYVNwbGl0UGF0aCIsInNwbGl0Iiwic0VudGl0eVNldFBhdGgiLCJyZWR1Y2UiLCJzUGF0aFNvRmFyIiwic05leHRQYXRoUGFydCIsIm9UYXJnZXQiLCJnZXRPYmplY3QiLCJPYmplY3QiLCJrZXlzIiwidHlwZSIsInByZXByb2Nlc3NvcnMiLCJ4bWwiLCJiaW5kaW5nQ29udGV4dHMiLCJlbnRpdHlTZXQiLCJjcmVhdGVCaW5kaW5nQ29udGV4dCIsImNvbnRleHRQYXRoIiwiY29udmVydGVyQ29udGV4dCIsIm5vUmVzb2x2ZSIsInZpZXdEYXRhIiwibW9kZWxzIiwibWFuaWZlc3QiLCJpZCIsInZpZXdOYW1lIiwiZ2V0Vmlld05hbWUiLCJjYWNoZSIsImhlaWdodCIsImNyZWF0ZUVycm9yUGFnZSIsInJlYXNvbiIsIm1lc3NhZ2UiLCJlcnJvclZpZXdOYW1lIiwicnVuQXNPd25lciIsIlZpZXciLCJjcmVhdGUiLCJzZXRNb2RlbCIsIk1hbmFnZWRPYmplY3RNb2RlbCIsInNldEFnZ3JlZ2F0aW9uIiwiZ2V0U2VydmljZSIsIm9Sb3V0aW5nU2VydmljZSIsIm9UYXJnZXRJbmZvIiwibU91dGJvdW5kcyIsImNyb3NzTmF2aWdhdGlvbiIsIm91dGJvdW5kcyIsIm1OYXZpZ2F0aW9uIiwiZ2V0TmF2aWdhdGlvbiIsIm5hdmlnYXRpb25PYmplY3RLZXkiLCJuYXZpZ2F0aW9uT2JqZWN0Iiwib3V0Ym91bmRDb25maWciLCJkZXRhaWwiLCJvdXRib3VuZCIsIm91dGJvdW5kRGV0YWlsIiwic2VtYW50aWNPYmplY3QiLCJhY3Rpb24iLCJwYXJhbWV0ZXJzIiwibmF2aWdhdGlvbiIsInZpZXdMZXZlbCIsImNvbnRlbnREZW5zaXRpZXMiLCJyZXNvdXJjZUJ1bmRsZSIsIl9fYnVuZGxlIiwiaXNEZXNrdG9wIiwic3lzdGVtIiwiZGVza3RvcCIsImlzUGhvbmUiLCJwaG9uZSIsImdldFZpZXdEYXRhIiwiYXNzaWduIiwic2hlbGxDb250ZW50RGVuc2l0eSIsImdldENvbnRlbnREZW5zaXR5IiwidXNlTmV3TGF6eUxvYWRpbmciLCJVcmlQYXJhbWV0ZXJzIiwiZnJvbVF1ZXJ5Iiwid2luZG93IiwibG9jYXRpb24iLCJzZWFyY2giLCJyZXRyaWV2ZVRleHRGcm9tVmFsdWVMaXN0IiwiZm9ybSIsImNvbnRyb2xDb25maWd1cmF0aW9uIiwic0Fubm90YXRpb25QYXRoIiwiaW5kZXhPZiIsInNUYXJnZXRBbm5vdGF0aW9uUGF0aCIsInJlc29sdmVEeW5hbWljRXhwcmVzc2lvbiIsImNvbnZlcnRUeXBlcyIsIlRlbXBsYXRlTW9kZWwiLCJvRGlhZ25vc3RpY3MiLCJnZXREaWFnbm9zdGljcyIsImlJc3N1ZUNvdW50IiwiZ2V0SXNzdWVzIiwib0NvbnZlcnRlclBhZ2VNb2RlbCIsImNvbnZlcnRQYWdlIiwiYUlzc3VlcyIsImFBZGRlZElzc3VlcyIsInNsaWNlIiwid2FybmluZyIsImdldERhdGEiLCJlIiwiRXJyb3IiLCJnZXRWaWV3IiwiZ2V0SW50ZXJmYWNlIiwiZXhpdCIsInJlbW92ZUdsb2JhbEluc3RhbmNlIiwiU2VydmljZSIsIlRlbXBsYXRlZFZpZXdTZXJ2aWNlRmFjdG9yeSIsIl9vSW5zdGFuY2VSZWdpc3RyeSIsIm9TZXJ2aWNlQ29udGV4dCIsImlDcmVhdGluZ1ZpZXdzIiwib1RlbXBsYXRlZFZpZXdTZXJ2aWNlIiwiZ2V0TnVtYmVyT2ZWaWV3c0luQ3JlYXRpb25TdGF0ZSIsIlNlcnZpY2VGYWN0b3J5Il0sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBOzs7Ozs7Ozs7O01BcUJNQSxvQjs7Ozs7Ozs7O1dBVUxDLEksR0FBQSxnQkFBTztBQUFBOztBQUNOLFVBQU1DLG9CQUFvQixHQUFHLEVBQTdCO0FBQ0EsVUFBTUMsUUFBUSxHQUFHLEtBQUtDLFVBQUwsRUFBakI7QUFDQSxVQUFNQyxVQUFVLEdBQUdGLFFBQVEsQ0FBQ0csV0FBNUI7QUFDQSxVQUFNQyxhQUFhLEdBQUdDLFNBQVMsQ0FBQ0Msb0JBQVYsQ0FBK0JKLFVBQS9CLENBQXRCO0FBQ0EsVUFBTUssVUFBVSxHQUFHSCxhQUFhLENBQUNJLFlBQWQsRUFBbkI7QUFDQSxVQUFNQyxTQUFTLEdBQUdMLGFBQWEsQ0FBQ00sV0FBZCxHQUE0QkMsZ0JBQTVCLEtBQWlELElBQWpELEdBQXdEUCxhQUFhLENBQUNRLFVBQWQsQ0FBeUJWLFVBQVUsQ0FBQ1csS0FBWCxFQUF6QixDQUExRTtBQUNBLFVBQU1DLFlBQVksR0FBR1osVUFBVSxDQUFDYSxjQUFYLE1BQStCLEVBQXBEO0FBQ0EsVUFBSUMsYUFBSjtBQUNBLFdBQUtDLFFBQUwsR0FBZ0JqQixRQUFRLENBQUNrQixPQUF6Qjs7QUFDQSxVQUFJSixZQUFKLEVBQWtCO0FBQ2pCRSxRQUFBQSxhQUFhLEdBQUdaLGFBQWEsQ0FBQ00sV0FBZCxHQUE0QkMsZ0JBQTVCLEVBQWhCOztBQUNBLGFBQUssSUFBSVEsQ0FBQyxHQUFHLENBQWIsRUFBZ0JBLENBQUMsR0FBR0wsWUFBWSxDQUFDTSxNQUFqQyxFQUF5Q0QsQ0FBQyxFQUExQyxFQUE4QztBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQU1FLGNBQWMsR0FBR2pCLGFBQWEsQ0FBQ2tCLFFBQWQsQ0FBdUJSLFlBQVksQ0FBQ0ssQ0FBRCxDQUFuQyxDQUF2Qjs7QUFDQSxjQUFJRSxjQUFjLElBQUlBLGNBQWMsQ0FBQ0UsR0FBZixDQUFtQixxQ0FBbkIsQ0FBdEIsRUFBaUY7QUFDaEZULFlBQUFBLFlBQVksQ0FBQ0ssQ0FBRCxDQUFaLEdBQWtCRSxjQUFsQjtBQUNBLFdBRkQsTUFFTztBQUNOUCxZQUFBQSxZQUFZLENBQUNLLENBQUQsQ0FBWixHQUFrQkgsYUFBYSxHQUFHLEdBQWhCLEdBQXNCRixZQUFZLENBQUNLLENBQUQsQ0FBWixDQUFnQkssT0FBaEIsQ0FBd0IsYUFBeEIsRUFBdUMsRUFBdkMsQ0FBeEM7QUFDQTtBQUNEO0FBQ0Q7O0FBRUQsVUFBTUMsZ0JBQWdCLEdBQ3JCckIsYUFBYSxDQUFDTSxXQUFkLEdBQTRCZ0IsT0FBNUIsS0FDQSxHQURBLEdBRUFqQixTQUZBLEdBR0EsR0FIQSxHQUlBa0IsR0FBRyxDQUFDQyxFQUFKLENBQ0VDLE9BREYsR0FFRUMsZ0JBRkYsR0FHRUMsY0FIRixFQUxEO0FBU0FoQyxNQUFBQSxvQkFBb0IsQ0FBQ2lDLElBQXJCLENBQ0NDLHNCQUFzQixDQUFDQyxHQUF2QixDQUEyQiwyQ0FBM0IsRUFDRUMsY0FERixDQUNpQjtBQUNmQyxRQUFBQSxTQUFTLEVBQUUsV0FESTtBQUVmakMsUUFBQUEsV0FBVyxFQUFFRCxVQUZFO0FBR2ZtQyxRQUFBQSxRQUFRLEVBQUU7QUFDVEMsVUFBQUEsT0FBTyxFQUFFLENBQUMsMkJBQUQsRUFBOEIsNkJBQTlCLEVBQTZELGdDQUE3RCxDQURBO0FBRVRDLFVBQUFBLFdBQVcsRUFBRXpCLFlBRko7QUFHVDBCLFVBQUFBLFNBQVMsRUFBRTtBQUhGO0FBSEssT0FEakIsRUFVRUMsSUFWRixDQVVPLFVBQUNDLHFCQUFELEVBQWlEO0FBQ3RELFFBQUEsS0FBSSxDQUFDQSxxQkFBTCxHQUE2QkEscUJBQTdCO0FBQ0EsZUFBT0EscUJBQXFCLENBQUNDLGdCQUF0QixFQUFQO0FBQ0EsT0FiRixDQUREO0FBaUJBNUMsTUFBQUEsb0JBQW9CLENBQUNpQyxJQUFyQixDQUNDQyxzQkFBc0IsQ0FBQ0MsR0FBdkIsQ0FBMkIsMENBQTNCLEVBQ0VDLGNBREYsQ0FDaUI7QUFDZkUsUUFBQUEsUUFBUSxFQUFFO0FBQ1RPLFVBQUFBLFNBQVMsRUFBRXJDLFVBREY7QUFFVHNDLFVBQUFBLFlBQVksRUFBRXpDLGFBRkw7QUFHVDBDLFVBQUFBLFNBQVMsRUFBRTVDO0FBSEY7QUFESyxPQURqQixFQVFFdUMsSUFSRixDQVFPLFVBQUNNLG9CQUFELEVBQStCO0FBQ3BDLFFBQUEsS0FBSSxDQUFDQSxvQkFBTCxHQUE0QkEsb0JBQTVCO0FBQ0EsZUFBT0Esb0JBQW9CLENBQUNDLGdCQUFyQixDQUFzQ3ZCLGdCQUF0QyxDQUFQO0FBQ0EsT0FYRixDQUREO0FBY0ExQixNQUFBQSxvQkFBb0IsQ0FBQ2lDLElBQXJCLENBQ0VpQixXQUFELENBQ0VDLElBREYsR0FFRVQsSUFGRixDQUVPLFVBQVNVLEtBQVQsRUFBcUI7QUFDMUIsWUFBSUMsVUFBVSxHQUFHLEVBQWpCOztBQUNBLFlBQUksQ0FBQ0QsS0FBSyxDQUFDRSxTQUFYLEVBQXNCO0FBQ3JCRCxVQUFBQSxVQUFVLEdBQUl6QixHQUFHLENBQUNDLEVBQUwsQ0FBZ0IwQixTQUFoQixDQUEwQkMsU0FBdkM7QUFDQSxTQUZELE1BRU87QUFDTkosVUFBQUEsS0FBSyxDQUFDRSxTQUFOLENBQWdCRyxPQUFoQixDQUF3QixVQUFTQyxRQUFULEVBQXdCO0FBQy9DTCxZQUFBQSxVQUFVLElBQUlLLFFBQVEsQ0FBQ0MsY0FBdkI7QUFDQSxXQUZEO0FBR0E7O0FBQ0QsZUFBT04sVUFBUDtBQUNBLE9BWkYsRUFhRU8sS0FiRixDQWFRLFlBQVc7QUFDakIsZUFBTyxXQUFQO0FBQ0EsT0FmRixDQUREO0FBbUJBLFVBQUlDLGtCQUFKO0FBQ0EsV0FBS0MsV0FBTCxHQUFtQkMsT0FBTyxDQUFDQyxHQUFSLENBQVloRSxvQkFBWixFQUNqQjBDLElBRGlCLENBQ1osVUFBQ3VCLG1CQUFELEVBQWdDO0FBQ3JDLFlBQU1DLFNBQVMsR0FBR0QsbUJBQW1CLENBQUMsQ0FBRCxDQUFyQztBQUNBLFlBQU1FLFlBQVksR0FBR0YsbUJBQW1CLENBQUMsQ0FBRCxDQUF4QztBQUNBLFlBQU1HLGNBQWMsR0FBRy9ELGFBQWEsQ0FBQ2dFLGdCQUFkLEVBQXZCO0FBQ0EsWUFBTUMsb0JBQW9CLEdBQUdqRSxhQUFhLENBQUNrRSxxQkFBZCxFQUE3QjtBQUVBRCxRQUFBQSxvQkFBb0IsQ0FBQ0UscUJBQXJCLENBQTJDbkUsYUFBYSxDQUFDb0UsMEJBQWQsR0FBMkNDLGVBQTNDLEVBQTNDLEVBTnFDLENBUXJDOztBQUNBYixRQUFBQSxrQkFBa0IsR0FBR0ssU0FBUyxHQUMzQkEsU0FBUyxHQUFHLEdBQVosR0FBa0JDLFlBQWxCLEdBQWlDLEdBQWpDLEdBQXVDekQsU0FBdkMsR0FBbUQsR0FBbkQsR0FBeUQwRCxjQUFjLENBQUNPLFlBQXhFLEdBQXVGLFlBRDVELEdBRTNCQyxTQUZIO0FBR0EsZUFBT2IsT0FBTyxDQUFDQyxHQUFSLENBQVlDLG1CQUFtQixDQUFDWSxNQUFwQixDQUEyQixDQUFDLEtBQUksQ0FBQ0MsZUFBTCxDQUFxQmpCLGtCQUFyQixDQUFELENBQTNCLENBQVosQ0FBUDtBQUNBLE9BZGlCLEVBZWpCbkIsSUFmaUIsQ0FlWixVQUFDdUIsbUJBQUQsRUFBZ0M7QUFDckMsWUFBTTNDLGNBQWMsR0FBRzJDLG1CQUFtQixDQUFDLENBQUQsQ0FBMUM7QUFDQSxZQUFNQyxTQUFTLEdBQUdELG1CQUFtQixDQUFDLENBQUQsQ0FBckM7QUFDQSxZQUFNYyxlQUFlLEdBQUdkLG1CQUFtQixDQUFDLENBQUQsQ0FBM0M7QUFDQSxlQUFPLElBQUlGLE9BQUosQ0FBWSxVQUFBaUIsT0FBTyxFQUFJO0FBQzdCcEQsVUFBQUEsR0FBRyxDQUFDQyxFQUFKLENBQU9vRCxPQUFQLENBQ0MsQ0FBQywwQ0FBRCxFQUE2QywyQ0FBN0MsQ0FERCxFQUVDLFVBQUNDLGlCQUFELEVBQXlCQyxrQkFBekIsRUFBcUQ7QUFDcERILFlBQUFBLE9BQU8sQ0FDTixLQUFJLENBQUNJLFVBQUwsQ0FDQzlELGNBREQsRUFFQ1osU0FGRCxFQUdDd0QsU0FIRCxFQUlDTCxrQkFKRCxFQUtDa0IsZUFMRCxFQU1DRyxpQkFORCxFQU9DQyxrQkFQRCxDQURNLENBQVA7QUFXQSxXQWRGO0FBZ0JBLFNBakJNLENBQVA7QUFrQkEsT0FyQ2lCLEVBc0NqQnpDLElBdENpQixDQXNDWixVQUFTd0IsU0FBVCxFQUF5QjtBQUM5QixZQUFNbEIsb0JBQW9CLEdBQUdkLHNCQUFzQixDQUFDQyxHQUF2QixDQUEyQiwwQ0FBM0IsRUFBdUVrRCxXQUF2RSxDQUFtRjdFLFVBQW5GLENBQTdCO0FBQ0F3QyxRQUFBQSxvQkFBb0IsQ0FBQ3NDLGtCQUFyQixDQUF3Q3BCLFNBQXhDLEVBQW1EeEMsZ0JBQW5EO0FBQ0EsT0F6Q2lCLENBQW5CO0FBMENBLEs7O1dBQ0RvRCxlLEdBQUEseUJBQWdCWixTQUFoQixFQUErQztBQUM5QyxVQUNDQSxTQUFTLElBQ1R0QyxHQUFHLENBQUNDLEVBQUosQ0FDRUMsT0FERixHQUVFQyxnQkFGRixHQUdFd0QsWUFIRixFQUZELEVBTUU7QUFDRCxlQUFPQyxZQUFZLENBQUNyRCxHQUFiLENBQWlCK0IsU0FBakIsQ0FBUDtBQUNBOztBQUNELGFBQU9VLFNBQVA7QUFDQSxLOztXQUNEYSxlLEdBQUEseUJBQWdCdkIsU0FBaEIsRUFBK0N3QixXQUEvQyxFQUFpRTtBQUNoRSxVQUNDeEIsU0FBUyxJQUNUdEMsR0FBRyxDQUFDQyxFQUFKLENBQ0VDLE9BREYsR0FFRUMsZ0JBRkYsR0FHRXdELFlBSEYsRUFGRCxFQU1FO0FBQ0RDLFFBQUFBLFlBQVksQ0FBQ0csR0FBYixDQUFpQnpCLFNBQWpCLEVBQTRCd0IsV0FBNUI7QUFDQTs7QUFDRCxhQUFPZCxTQUFQO0FBQ0E7QUFDRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7V0FDQ2dCLFcsR0FBQSxxQkFBWXpGLFVBQVosRUFBNkI7QUFDNUIsVUFBTTBGLFNBQVMsR0FBRzFGLFVBQVUsQ0FBQzJGLGNBQVgsRUFBbEI7O0FBQ0EsVUFBSUQsU0FBSixFQUFlO0FBQ2RBLFFBQUFBLFNBQVMsQ0FBQ0UsT0FBVjtBQUNBLE9BRkQsTUFFTyxJQUFJLEtBQUtDLEtBQVQsRUFBZ0I7QUFDdEIsYUFBS0EsS0FBTCxDQUFXRCxPQUFYO0FBQ0E7O0FBQ0QsYUFBTyxLQUFLWCxVQUFMLENBQWdCLEtBQUthLGFBQXJCLEVBQW9DLEtBQUtDLFFBQXpDLEVBQW1ELEVBQW5ELEVBQXVELEVBQXZELEVBQTJEdEIsU0FBM0QsRUFBc0UsS0FBS00saUJBQTNFLEVBQThGLEtBQUtDLGtCQUFuRyxFQUNMekMsSUFESyxDQUNBLFlBQVc7QUFDaEJ2QyxRQUFBQSxVQUFVLENBQUNnRyxVQUFYLENBQXNCQyxVQUF0QjtBQUNBLE9BSEssRUFJTHhDLEtBSkssQ0FJQyxVQUFTeUMsTUFBVCxFQUFzQjtBQUM1QmxHLFFBQUFBLFVBQVUsQ0FBQ2dHLFVBQVgsQ0FBc0JDLFVBQXRCO0FBQ0FFLFFBQUFBLEdBQUcsQ0FBQ0MsS0FBSixDQUFVRixNQUFWO0FBQ0EsT0FQSyxDQUFQO0FBUUEsSzs7V0FDRGpCLFUsR0FBQSxvQkFDQzlELGNBREQsRUFFQ1osU0FGRCxFQUdDd0QsU0FIRCxFQUlDTCxrQkFKRCxFQUtDa0IsZUFMRCxFQU1DRyxpQkFORCxFQU9DQyxrQkFQRCxFQVFFO0FBQUE7O0FBQ0QsV0FBS2MsYUFBTCxHQUFxQjNFLGNBQXJCO0FBQ0EsV0FBSzRFLFFBQUwsR0FBZ0J4RixTQUFoQjtBQUNBLFdBQUt3RSxpQkFBTCxHQUF5QkEsaUJBQXpCO0FBQ0EsV0FBS0Msa0JBQUwsR0FBMEJBLGtCQUExQjtBQUNBLFVBQU1sRixRQUFRLEdBQUcsS0FBS0MsVUFBTCxFQUFqQjtBQUNBLFVBQU1zRyxnQkFBZ0IsR0FBR3ZHLFFBQVEsQ0FBQ3FDLFFBQWxDO0FBQ0EsVUFBTW1FLGNBQWMsR0FBR0QsZ0JBQWdCLENBQUNFLGFBQXhDO0FBQ0EsVUFBTXZHLFVBQVUsR0FBR0YsUUFBUSxDQUFDRyxXQUE1QjtBQUNBLFVBQU1DLGFBQTJCLEdBQUdDLFNBQVMsQ0FBQ0Msb0JBQVYsQ0FBK0JKLFVBQS9CLENBQXBDO0FBQ0EsVUFBTXdHLGdCQUFnQixHQUFHdEcsYUFBYSxDQUFDdUcsaUJBQWQsR0FBa0NDLHVCQUFsQyxDQUEwRDFHLFVBQTFELEVBQXNFMkcsT0FBdEUsQ0FBOEV4RSxRQUE5RSxDQUF1RnlFLGVBQWhIO0FBQ0EsVUFBTXZHLFVBQVUsR0FBR0gsYUFBYSxDQUFDSSxZQUFkLEVBQW5CO0FBQ0EsVUFBTXVHLGdCQUFxQixHQUFHM0csYUFBYSxDQUFDNEcsV0FBZCxFQUE5QjtBQUNBLFVBQU1DLFlBQVksR0FBRyxJQUFJQyxTQUFKLENBQWN2RixHQUFHLENBQUNDLEVBQUosQ0FBT3VGLE1BQXJCLEVBQTZCQyxxQkFBN0IsQ0FBbUQsUUFBbkQsQ0FBckI7QUFDQSxVQUFNQyxjQUFjLEdBQUcsSUFBSUgsU0FBSixDQUFjSCxnQkFBZCxDQUF2QjtBQUNBLFVBQU1PLE1BQU0sR0FBRyxLQUFmO0FBQ0EsVUFBSUMsVUFBSixFQUErQkMsY0FBL0IsRUFBc0RDLGFBQXRELEVBQTBFQyxTQUExRTs7QUFFQSxlQUFTQyxlQUFULEdBQTJCO0FBQzFCLFlBQU1DLFVBQVUsR0FBR2xCLGdCQUFnQixDQUFDbUIsS0FBakIsQ0FBdUIsR0FBdkIsQ0FBbkI7QUFDQSxZQUFNQyxjQUFjLEdBQUdGLFVBQVUsQ0FBQ0csTUFBWCxDQUFrQixVQUFTQyxVQUFULEVBQTBCQyxhQUExQixFQUE4QztBQUN0RixjQUFJQSxhQUFhLEtBQUssRUFBdEIsRUFBMEI7QUFDekIsbUJBQU9ELFVBQVA7QUFDQTs7QUFDRCxjQUFJQSxVQUFVLEtBQUssRUFBbkIsRUFBdUI7QUFDdEJBLFlBQUFBLFVBQVUsR0FBRyxNQUFNQyxhQUFuQjtBQUNBLFdBRkQsTUFFTztBQUNOLGdCQUFNQyxPQUFPLEdBQUczSCxVQUFVLENBQUM0SCxTQUFYLENBQXFCSCxVQUFVLEdBQUcsOEJBQWIsR0FBOENDLGFBQW5FLENBQWhCOztBQUNBLGdCQUFJQyxPQUFPLElBQUlFLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZSCxPQUFaLEVBQXFCOUcsTUFBckIsR0FBOEIsQ0FBN0MsRUFBZ0Q7QUFDL0M0RyxjQUFBQSxVQUFVLElBQUksNkJBQWQ7QUFDQTs7QUFDREEsWUFBQUEsVUFBVSxJQUFJLE1BQU1DLGFBQXBCO0FBQ0E7O0FBQ0QsaUJBQU9ELFVBQVA7QUFDQSxTQWRzQixFQWNwQixFQWRvQixDQUF2QjtBQWVBLFlBQU1QLGFBQWEsR0FBRztBQUNyQmEsVUFBQUEsSUFBSSxFQUFFLEtBRGU7QUFFckJDLFVBQUFBLGFBQWEsRUFBRTtBQUNkQyxZQUFBQSxHQUFHLEVBQUU7QUFDSkMsY0FBQUEsZUFBZSxFQUFFO0FBQ2hCQyxnQkFBQUEsU0FBUyxFQUFFWixjQUFjLEdBQUd2SCxVQUFVLENBQUNvSSxvQkFBWCxDQUFnQ2IsY0FBaEMsQ0FBSCxHQUFxRCxJQUQ5RDtBQUVoQmhCLGdCQUFBQSxlQUFlLEVBQUVKLGdCQUFnQixHQUFHbkcsVUFBVSxDQUFDb0ksb0JBQVgsQ0FBZ0NqQyxnQkFBaEMsQ0FBSCxHQUF1RCxJQUZ4RTtBQUdoQmtDLGdCQUFBQSxXQUFXLEVBQUVsQyxnQkFBZ0IsR0FBR25HLFVBQVUsQ0FBQ29JLG9CQUFYLENBQWdDakMsZ0JBQWhDLENBQUgsR0FBdUQsSUFIcEU7QUFJaEJtQyxnQkFBQUEsZ0JBQWdCLEVBQUV0QixVQUFVLENBQUNvQixvQkFBWCxDQUFnQyxHQUFoQyxFQUFxQ2hFLFNBQXJDLEVBQWdEO0FBQUVtRSxrQkFBQUEsU0FBUyxFQUFFO0FBQWIsaUJBQWhELENBSkY7QUFLaEJDLGdCQUFBQSxRQUFRLEVBQUVyQixTQUFTLEdBQUdGLGNBQWMsQ0FBQ21CLG9CQUFmLENBQW9DLEdBQXBDLENBQUgsR0FBOEM7QUFMakQsZUFEYjtBQVFKSyxjQUFBQSxNQUFNLEVBQUU7QUFDUE4sZ0JBQUFBLFNBQVMsRUFBRW5JLFVBREo7QUFFUHVHLGdCQUFBQSxlQUFlLEVBQUV2RyxVQUZWO0FBR1BxSSxnQkFBQUEsV0FBVyxFQUFFckksVUFITjtBQUlQLCtCQUFlYyxjQUpSO0FBS1B1QixnQkFBQUEsU0FBUyxFQUFFckMsVUFMSjtBQU1QLDBCQUFVMEcsWUFOSDtBQU1pQjtBQUN4QmdDLGdCQUFBQSxRQUFRLEVBQUU1QixjQVBIO0FBUVB3QixnQkFBQUEsZ0JBQWdCLEVBQUV0QixVQVJYO0FBU1B3QixnQkFBQUEsUUFBUSxFQUFFdkI7QUFUSCxlQVJKO0FBbUJKM0UsY0FBQUEsWUFBWSxFQUFFekM7QUFuQlY7QUFEUyxXQUZNO0FBeUJyQjhJLFVBQUFBLEVBQUUsRUFBRXpJLFNBekJpQjtBQTBCckIwSSxVQUFBQSxRQUFRLEVBQUU1QyxnQkFBZ0IsQ0FBQzRDLFFBQWpCLElBQTZCakosVUFBVSxDQUFDa0osV0FBWCxFQTFCbEI7QUEyQnJCTCxVQUFBQSxRQUFRLEVBQUVyQixTQTNCVztBQTRCckIyQixVQUFBQSxLQUFLLEVBQUU7QUFBRWhCLFlBQUFBLElBQUksRUFBRSxDQUFDcEUsU0FBRDtBQUFSLFdBNUJjO0FBNkJyQitFLFVBQUFBLE1BQU0sRUFBRTtBQUNQLDJCQUFlM0g7QUFEUixXQTdCYTtBQWdDckJpSSxVQUFBQSxNQUFNLEVBQUU7QUFoQ2EsU0FBdEI7QUFrQ0EsZUFBTzdCLGFBQVA7QUFDQTs7QUFDRCxVQUFNOEIsZUFBZSxHQUFHLFVBQUNDLE1BQUQsRUFBaUI7QUFDeEM7QUFDQTtBQUNBbkQsUUFBQUEsR0FBRyxDQUFDQyxLQUFKLENBQVVrRCxNQUFNLENBQUNDLE9BQWpCLEVBQTBCRCxNQUExQjtBQUNBL0IsUUFBQUEsYUFBYSxDQUFDMEIsUUFBZCxHQUF5QjVDLGdCQUFnQixDQUFDbUQsYUFBakIsSUFBa0MsK0NBQTNEO0FBQ0FqQyxRQUFBQSxhQUFhLENBQUNjLGFBQWQsQ0FBNEJDLEdBQTVCLENBQWdDUSxNQUFoQyxDQUF1QyxPQUF2QyxJQUFrRCxJQUFJOUIsU0FBSixDQUFjc0MsTUFBZCxDQUFsRDtBQUVBLGVBQU90SixVQUFVLENBQUN5SixVQUFYLENBQXNCLFlBQU07QUFDbEMsaUJBQU9DLElBQUksQ0FBQ0MsTUFBTCxDQUFZcEMsYUFBWixFQUEyQmhGLElBQTNCLENBQWdDLFVBQUNzRCxLQUFELEVBQWdCO0FBQ3RELFlBQUEsTUFBSSxDQUFDQSxLQUFMLEdBQWFBLEtBQWI7O0FBQ0EsWUFBQSxNQUFJLENBQUNBLEtBQUwsQ0FBVytELFFBQVgsQ0FBb0IsSUFBSUMsa0JBQUosQ0FBdUIsTUFBSSxDQUFDaEUsS0FBNUIsQ0FBcEIsRUFBd0QsT0FBeEQ7O0FBQ0E3RixZQUFBQSxVQUFVLENBQUM4SixjQUFYLENBQTBCLGFBQTFCLEVBQXlDLE1BQUksQ0FBQ2pFLEtBQTlDO0FBQ0EsbUJBQU85QixTQUFQO0FBQ0EsV0FMTSxDQUFQO0FBTUEsU0FQTSxDQUFQO0FBUUEsT0FmRDs7QUFnQkEsYUFBTzdELGFBQWEsQ0FDbEI2SixVQURLLENBQ00sZ0JBRE4sRUFFTHhILElBRkssQ0FFQSxVQUFDeUgsZUFBRCxFQUEwQjtBQUMvQjtBQUNBLFlBQU1DLFdBQVcsR0FBR0QsZUFBZSxDQUFDdEQsdUJBQWhCLENBQXdDMUcsVUFBeEMsQ0FBcEI7QUFDQSxZQUFNa0ssVUFBVSxHQUNmckQsZ0JBQWdCLENBQUMsU0FBRCxDQUFoQixJQUNBQSxnQkFBZ0IsQ0FBQyxTQUFELENBQWhCLENBQTRCc0QsZUFENUIsSUFFQXRELGdCQUFnQixDQUFDLFNBQUQsQ0FBaEIsQ0FBNEJzRCxlQUE1QixDQUE0Q0MsU0FIN0M7QUFJQSxZQUFNQyxXQUFXLEdBQUdySyxVQUFVLENBQUNzSyxhQUFYLE1BQThCLEVBQWxEO0FBQ0FwQyxRQUFBQSxNQUFNLENBQUNDLElBQVAsQ0FBWWtDLFdBQVosRUFBeUIvRyxPQUF6QixDQUFpQyxVQUFTaUgsbUJBQVQsRUFBc0M7QUFDdEUsY0FBTUMsZ0JBQWdCLEdBQUdILFdBQVcsQ0FBQ0UsbUJBQUQsQ0FBcEM7QUFDQSxjQUFJRSxjQUFKOztBQUNBLGNBQUlELGdCQUFnQixDQUFDRSxNQUFqQixJQUEyQkYsZ0JBQWdCLENBQUNFLE1BQWpCLENBQXdCQyxRQUFuRCxJQUErRFQsVUFBVSxDQUFDTSxnQkFBZ0IsQ0FBQ0UsTUFBakIsQ0FBd0JDLFFBQXpCLENBQTdFLEVBQWlIO0FBQ2hIRixZQUFBQSxjQUFjLEdBQUdQLFVBQVUsQ0FBQ00sZ0JBQWdCLENBQUNFLE1BQWpCLENBQXdCQyxRQUF6QixDQUEzQjtBQUNBSCxZQUFBQSxnQkFBZ0IsQ0FBQ0UsTUFBakIsQ0FBd0JFLGNBQXhCLEdBQXlDO0FBQ3hDQyxjQUFBQSxjQUFjLEVBQUVKLGNBQWMsQ0FBQ0ksY0FEUztBQUV4Q0MsY0FBQUEsTUFBTSxFQUFFTCxjQUFjLENBQUNLLE1BRmlCO0FBR3hDQyxjQUFBQSxVQUFVLEVBQUVOLGNBQWMsQ0FBQ007QUFIYSxhQUF6QztBQUtBOztBQUNELGNBQUlQLGdCQUFnQixDQUFDYixNQUFqQixJQUEyQmEsZ0JBQWdCLENBQUNiLE1BQWpCLENBQXdCZ0IsUUFBbkQsSUFBK0RULFVBQVUsQ0FBQ00sZ0JBQWdCLENBQUNiLE1BQWpCLENBQXdCZ0IsUUFBekIsQ0FBN0UsRUFBaUg7QUFDaEhGLFlBQUFBLGNBQWMsR0FBR1AsVUFBVSxDQUFDTSxnQkFBZ0IsQ0FBQ2IsTUFBakIsQ0FBd0JnQixRQUF6QixDQUEzQjtBQUNBSCxZQUFBQSxnQkFBZ0IsQ0FBQ2IsTUFBakIsQ0FBd0JpQixjQUF4QixHQUF5QztBQUN4Q0MsY0FBQUEsY0FBYyxFQUFFSixjQUFjLENBQUNJLGNBRFM7QUFFeENDLGNBQUFBLE1BQU0sRUFBRUwsY0FBYyxDQUFDSyxNQUZpQjtBQUd4Q0MsY0FBQUEsVUFBVSxFQUFFTixjQUFjLENBQUNNO0FBSGEsYUFBekM7QUFLQTtBQUNELFNBbkJEO0FBb0JBdkQsUUFBQUEsU0FBUyxHQUFHO0FBQ1h3RCxVQUFBQSxVQUFVLEVBQUVYLFdBREQ7QUFFWFksVUFBQUEsU0FBUyxFQUFFaEIsV0FBVyxDQUFDZ0IsU0FGWjtBQUdYbEYsVUFBQUEsUUFBUSxFQUFFeEYsU0FIQztBQUlYMkssVUFBQUEsZ0JBQWdCLEVBQUVyRSxnQkFBZ0IsQ0FBQyxTQUFELENBQWhCLENBQTRCcUUsZ0JBSm5DO0FBS1hDLFVBQUFBLGNBQWMsRUFBRWhLLGNBQWMsQ0FBQ2lLLFFBTHBCO0FBTVh4RSxVQUFBQSxlQUFlLEVBQUVKLGdCQU5OO0FBT1g2RSxVQUFBQSxTQUFTLEVBQUdwRSxNQUFELENBQWdCcUUsTUFBaEIsQ0FBdUJDLE9BUHZCO0FBUVhDLFVBQUFBLE9BQU8sRUFBR3ZFLE1BQUQsQ0FBZ0JxRSxNQUFoQixDQUF1Qkc7QUFSckIsU0FBWjs7QUFXQSxZQUFJekwsVUFBVSxDQUFDMEwsV0FBZixFQUE0QjtBQUMzQnhELFVBQUFBLE1BQU0sQ0FBQ3lELE1BQVAsQ0FBY25FLFNBQWQsRUFBeUJ4SCxVQUFVLENBQUMwTCxXQUFYLEVBQXpCO0FBQ0E7O0FBRUQsWUFBTXpILGNBQWMsR0FBRy9ELGFBQWEsQ0FBQ2dFLGdCQUFkLEVBQXZCO0FBQ0FzRCxRQUFBQSxTQUFTLENBQUNqQixhQUFWLEdBQTBCRCxjQUExQjtBQUNBa0IsUUFBQUEsU0FBUyxDQUFDb0UsbUJBQVYsR0FBZ0MzSCxjQUFjLENBQUM0SCxpQkFBZixFQUFoQztBQUNBckUsUUFBQUEsU0FBUyxDQUFDc0UsaUJBQVYsR0FBOEJDLGFBQWEsQ0FBQ0MsU0FBZCxDQUF3QkMsTUFBTSxDQUFDQyxRQUFQLENBQWdCQyxNQUF4QyxFQUFnRG5LLEdBQWhELENBQW9ELDJCQUFwRCxNQUFxRixNQUFuSDtBQUNBd0YsUUFBQUEsU0FBUyxDQUFDNEUseUJBQVYsR0FDQ3ZGLGdCQUFnQixDQUFDLFFBQUQsQ0FBaEIsSUFBOEJBLGdCQUFnQixDQUFDLFFBQUQsQ0FBaEIsQ0FBMkJ3RixJQUF6RCxHQUNHeEYsZ0JBQWdCLENBQUMsUUFBRCxDQUFoQixDQUEyQndGLElBQTNCLENBQWdDRCx5QkFEbkMsR0FFRzNILFNBSEo7QUFJQTZDLFFBQUFBLGNBQWMsR0FBRyxJQUFJTixTQUFKLENBQWNRLFNBQWQsQ0FBakI7O0FBQ0EsWUFBSUEsU0FBUyxJQUFJQSxTQUFTLENBQUM4RSxvQkFBM0IsRUFBaUQ7QUFDaERwRSxVQUFBQSxNQUFNLENBQUNDLElBQVAsQ0FBWVgsU0FBUyxDQUFDOEUsb0JBQXRCLEVBQTRDaEosT0FBNUMsQ0FBb0QsVUFBU2lKLGVBQVQsRUFBa0M7QUFDckYsZ0JBQUlBLGVBQWUsQ0FBQ0MsT0FBaEIsQ0FBd0IsR0FBeEIsTUFBaUMsQ0FBQyxDQUF0QyxFQUF5QztBQUN4QyxrQkFBTUMscUJBQXFCLEdBQUdDLHdCQUF3QixDQUFDSCxlQUFELEVBQWtCbE0sVUFBbEIsQ0FBdEQ7QUFDQW1ILGNBQUFBLFNBQVMsQ0FBQzhFLG9CQUFWLENBQStCRyxxQkFBL0IsSUFBd0RqRixTQUFTLENBQUM4RSxvQkFBVixDQUErQkMsZUFBL0IsQ0FBeEQ7QUFDQTtBQUNELFdBTEQ7QUFNQTs7QUFDRHZILFFBQUFBLGtCQUFrQixDQUFDMkgsWUFBbkIsQ0FBZ0N0TSxVQUFoQyxFQUE0Q0gsYUFBYSxDQUFDb0UsMEJBQWQsR0FBMkNDLGVBQTNDLEVBQTVDO0FBQ0E4QyxRQUFBQSxVQUFVLEdBQUcsSUFBSXVGLGFBQUosQ0FBa0IsWUFBTTtBQUNwQyxjQUFJO0FBQ0gsZ0JBQUksQ0FBQyxDQUFDaEksZUFBTixFQUF1QjtBQUN0QixxQkFBT0EsZUFBUDtBQUNBLGFBRkQsTUFFTztBQUNOLGtCQUFNaUksWUFBWSxHQUFHM00sYUFBYSxDQUFDNE0sY0FBZCxFQUFyQjtBQUNBLGtCQUFNQyxXQUFXLEdBQUdGLFlBQVksQ0FBQ0csU0FBYixHQUF5QjlMLE1BQTdDO0FBQ0Esa0JBQU0rTCxtQkFBbUIsR0FBR2xJLGlCQUFpQixDQUFDbUksV0FBbEIsQ0FDM0I1RyxjQUQyQixFQUUzQmpHLFVBRjJCLEVBRzNCbUgsU0FIMkIsRUFJM0JxRixZQUoyQixFQUszQnJHLGdCQUwyQixFQU0zQnRHLGFBQWEsQ0FBQ29FLDBCQUFkLEdBQTJDQyxlQUEzQyxFQU4yQixDQUE1QjtBQVNBLGtCQUFNNEksT0FBTyxHQUFHTixZQUFZLENBQUNHLFNBQWIsRUFBaEI7QUFDQSxrQkFBTUksWUFBWSxHQUFHRCxPQUFPLENBQUNFLEtBQVIsQ0FBY04sV0FBZCxDQUFyQjs7QUFDQSxrQkFBSUssWUFBWSxDQUFDbE0sTUFBYixHQUFzQixDQUExQixFQUE2QjtBQUM1QmlGLGdCQUFBQSxHQUFHLENBQUNtSCxPQUFKLENBQ0MsNkdBREQ7QUFHQTs7QUFDRCxxQkFBT0wsbUJBQVA7QUFDQTtBQUNELFdBeEJELENBd0JFLE9BQU83RyxLQUFQLEVBQWM7QUFDZkQsWUFBQUEsR0FBRyxDQUFDQyxLQUFKLENBQVVBLEtBQVYsRUFBaUJBLEtBQWpCO0FBQ0EsbUJBQU8sRUFBUDtBQUNBO0FBQ0QsU0E3QlksRUE2QlYvRixVQTdCVSxDQUFiOztBQStCQSxZQUFJLENBQUMrRyxNQUFMLEVBQWE7QUFDWkcsVUFBQUEsYUFBYSxHQUFHRSxlQUFlLEVBQS9CLENBRFksQ0FFWjs7QUFDQXpILFVBQUFBLFVBQVUsQ0FBQzRKLFFBQVgsQ0FBb0J2QyxVQUFwQixFQUFnQyxZQUFoQztBQUNBLGlCQUFPckgsVUFBVSxDQUFDeUosVUFBWCxDQUFzQixZQUFNO0FBQ2xDLG1CQUFPQyxJQUFJLENBQUNDLE1BQUwsQ0FBWXBDLGFBQVosRUFDTDlELEtBREssQ0FDQzRGLGVBREQsRUFFTDlHLElBRkssQ0FFQSxVQUFDc0QsS0FBRCxFQUFnQjtBQUNyQixjQUFBLE1BQUksQ0FBQ0EsS0FBTCxHQUFhQSxLQUFiOztBQUNBLGNBQUEsTUFBSSxDQUFDQSxLQUFMLENBQVcrRCxRQUFYLENBQW9CLElBQUlDLGtCQUFKLENBQXVCLE1BQUksQ0FBQ2hFLEtBQTVCLENBQXBCLEVBQXdELE9BQXhEOztBQUNBLGNBQUEsTUFBSSxDQUFDQSxLQUFMLENBQVcrRCxRQUFYLENBQW9CdEMsY0FBcEIsRUFBb0MsVUFBcEM7O0FBQ0F0SCxjQUFBQSxVQUFVLENBQUM4SixjQUFYLENBQTBCLGFBQTFCLEVBQXlDLE1BQUksQ0FBQ2pFLEtBQTlDLEVBSnFCLENBS3JCOztBQUNBLGtCQUFJLENBQUNqQixlQUFMLEVBQXNCO0FBQ3JCLGdCQUFBLE1BQUksQ0FBQ1UsZUFBTCxDQUFxQjVCLGtCQUFyQixFQUEwQzJELFVBQUQsQ0FBb0JrRyxPQUFwQixFQUF6QztBQUNBOztBQUNELHFCQUFPeEosU0FBUDtBQUNBLGFBWkssRUFhTE4sS0FiSyxDQWFDLFVBQUErSixDQUFDO0FBQUEscUJBQUlySCxHQUFHLENBQUNDLEtBQUosQ0FBVW9ILENBQUMsQ0FBQ2pFLE9BQVosRUFBcUJpRSxDQUFyQixDQUFKO0FBQUEsYUFiRixDQUFQO0FBY0EsV0FmTSxDQUFQO0FBZ0JBO0FBQ0QsT0FuSEssRUFvSEwvSixLQXBISyxDQW9IQyxVQUFTMkMsS0FBVCxFQUFxQjtBQUMzQkQsUUFBQUEsR0FBRyxDQUFDQyxLQUFKLENBQVVBLEtBQUssQ0FBQ21ELE9BQWhCLEVBQXlCbkQsS0FBekI7QUFDQSxjQUFNLElBQUlxSCxLQUFKLENBQVUsaUNBQWlDckgsS0FBM0MsQ0FBTjtBQUNBLE9BdkhLLENBQVA7QUF3SEEsSzs7V0FDRHNILE8sR0FBQSxtQkFBVTtBQUNULGFBQU8sS0FBSzdILEtBQVo7QUFDQSxLOztXQUNEOEgsWSxHQUFBLHdCQUFvQjtBQUNuQixhQUFPLElBQVA7QUFDQSxLOztXQUNEQyxJLEdBQUEsZ0JBQU87QUFDTjtBQUNBLFdBQUtwTCxxQkFBTCxJQUE4QixLQUFLQSxxQkFBTCxDQUEyQm9ELE9BQTNCLEVBQTlCO0FBQ0EsV0FBSy9DLG9CQUFMLElBQTZCLEtBQUtBLG9CQUFMLENBQTBCK0MsT0FBMUIsRUFBN0I7QUFDQSxXQUFLN0UsUUFBTCxDQUFjOE0sb0JBQWQ7QUFDQSxLOzs7SUE5WmlDQyxPOztNQWdhN0JDLDJCOzs7Ozs7Ozs7OzthQUNMQyxrQixHQUEyRCxFOzs7Ozs7WUFFM0QvTCxjLEdBQUEsd0JBQWVnTSxlQUFmLEVBQThFO0FBQzdFRixNQUFBQSwyQkFBMkIsQ0FBQ0csY0FBNUI7QUFFQSxVQUFNQyxxQkFBcUIsR0FBRyxJQUFJeE8sb0JBQUosQ0FBeUJ1SSxNQUFNLENBQUN5RCxNQUFQLENBQWM7QUFBRTNLLFFBQUFBLE9BQU8sRUFBRTtBQUFYLE9BQWQsRUFBaUNpTixlQUFqQyxDQUF6QixDQUE5QjtBQUNBLGFBQU9FLHFCQUFxQixDQUFDeEssV0FBdEIsQ0FBa0NwQixJQUFsQyxDQUF1QyxZQUFXO0FBQ3hEd0wsUUFBQUEsMkJBQTJCLENBQUNHLGNBQTVCO0FBQ0EsZUFBT0MscUJBQVA7QUFDQSxPQUhNLENBQVA7QUFJQSxLOztZQUNETixvQixHQUFBLGdDQUF1QjtBQUN0QixXQUFLRyxrQkFBTCxHQUEwQixFQUExQjtBQUNBLEs7O2dDQUNNSSwrQixHQUFQLDJDQUF5QztBQUN4QyxhQUFPTCwyQkFBMkIsQ0FBQ0csY0FBbkM7QUFDQSxLOzs7SUFqQndDRyxjOztTQW9CM0JOLDJCIiwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgU2VydmljZSBmcm9tIFwic2FwL3VpL2NvcmUvc2VydmljZS9TZXJ2aWNlXCI7XG5pbXBvcnQgU2VydmljZUZhY3RvcnkgZnJvbSBcInNhcC91aS9jb3JlL3NlcnZpY2UvU2VydmljZUZhY3RvcnlcIjtcbmltcG9ydCBTZXJ2aWNlRmFjdG9yeVJlZ2lzdHJ5IGZyb20gXCJzYXAvdWkvY29yZS9zZXJ2aWNlL1NlcnZpY2VGYWN0b3J5UmVnaXN0cnlcIjtcbmltcG9ydCBNYW5hZ2VkT2JqZWN0TW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9iYXNlL01hbmFnZWRPYmplY3RNb2RlbFwiO1xuaW1wb3J0IFZpZXcgZnJvbSBcInNhcC91aS9jb3JlL212Yy9WaWV3XCI7XG5pbXBvcnQgQ29tcG9uZW50IGZyb20gXCJzYXAvdWkvY29yZS9Db21wb25lbnRcIjtcbmltcG9ydCBKU09OTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9qc29uL0pTT05Nb2RlbFwiO1xuaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgVGVtcGxhdGVNb2RlbCBmcm9tIFwic2FwL2ZlL2NvcmUvVGVtcGxhdGVNb2RlbFwiO1xuaW1wb3J0IENhY2hlTWFuYWdlciBmcm9tIFwic2FwL3VpL2NvcmUvY2FjaGUvQ2FjaGVNYW5hZ2VyXCI7XG5pbXBvcnQgVmVyc2lvbkluZm8gZnJvbSBcInNhcC91aS9WZXJzaW9uSW5mb1wiO1xuaW1wb3J0IERldmljZSBmcm9tIFwic2FwL3VpL0RldmljZVwiO1xuaW1wb3J0IFVyaVBhcmFtZXRlcnMgZnJvbSBcInNhcC9iYXNlL3V0aWwvVXJpUGFyYW1ldGVyc1wiO1xuaW1wb3J0IHsgU2VydmljZUNvbnRleHQgfSBmcm9tIFwic2FwL3VpL2NvcmUvc2VydmljZVwiO1xuaW1wb3J0IHsgUmVzb3VyY2VNb2RlbFNlcnZpY2UgfSBmcm9tIFwiLi9SZXNvdXJjZU1vZGVsU2VydmljZUZhY3RvcnlcIjtcbmltcG9ydCBBcHBDb21wb25lbnQgZnJvbSBcInNhcC9mZS9jb3JlL0FwcENvbXBvbmVudFwiO1xuaW1wb3J0IHsgQ2FjaGVIYW5kbGVyU2VydmljZSB9IGZyb20gXCJzYXAvZmUvY29yZS9zZXJ2aWNlcy9DYWNoZUhhbmRsZXJTZXJ2aWNlRmFjdG9yeVwiO1xuaW1wb3J0IFJlc291cmNlTW9kZWwgZnJvbSBcInNhcC9mZS9tYWNyb3MvUmVzb3VyY2VNb2RlbFwiO1xuaW1wb3J0IE1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvTW9kZWxcIjtcbmltcG9ydCB7IHJlc29sdmVEeW5hbWljRXhwcmVzc2lvbiB9IGZyb20gXCIuLi9oZWxwZXJzL0R5bmFtaWNBbm5vdGF0aW9uUGF0aEhlbHBlclwiO1xuXG50eXBlIFRlbXBsYXRlZFZpZXdTZXJ2aWNlU2V0dGluZ3MgPSB7fTtcblxuY2xhc3MgVGVtcGxhdGVkVmlld1NlcnZpY2UgZXh0ZW5kcyBTZXJ2aWNlPFRlbXBsYXRlZFZpZXdTZXJ2aWNlU2V0dGluZ3M+IHtcblx0aW5pdFByb21pc2UhOiBQcm9taXNlPGFueT47XG5cdG9WaWV3ITogVmlldztcblx0b1Jlc291cmNlTW9kZWxTZXJ2aWNlITogUmVzb3VyY2VNb2RlbFNlcnZpY2U7XG5cdG9DYWNoZUhhbmRsZXJTZXJ2aWNlITogQ2FjaGVIYW5kbGVyU2VydmljZTtcblx0b0ZhY3RvcnkhOiBUZW1wbGF0ZWRWaWV3U2VydmljZUZhY3Rvcnk7XG5cdHJlc291cmNlTW9kZWwhOiB0eXBlb2YgUmVzb3VyY2VNb2RlbDtcblx0c3RhYmxlSWQhOiBzdHJpbmc7XG5cdFRlbXBsYXRlQ29udmVydGVyOiBhbnk7XG5cdE1ldGFNb2RlbENvbnZlcnRlcjogYW55O1xuXHRpbml0KCkge1xuXHRcdGNvbnN0IGFTZXJ2aWNlRGVwZW5kZW5jaWVzID0gW107XG5cdFx0Y29uc3Qgb0NvbnRleHQgPSB0aGlzLmdldENvbnRleHQoKTtcblx0XHRjb25zdCBvQ29tcG9uZW50ID0gb0NvbnRleHQuc2NvcGVPYmplY3Q7XG5cdFx0Y29uc3Qgb0FwcENvbXBvbmVudCA9IENvbXBvbmVudC5nZXRPd25lckNvbXBvbmVudEZvcihvQ29tcG9uZW50KSBhcyBBcHBDb21wb25lbnQ7XG5cdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG9BcHBDb21wb25lbnQuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0Y29uc3Qgc1N0YWJsZUlkID0gb0FwcENvbXBvbmVudC5nZXRNZXRhZGF0YSgpLmdldENvbXBvbmVudE5hbWUoKSArIFwiOjpcIiArIG9BcHBDb21wb25lbnQuZ2V0TG9jYWxJZChvQ29tcG9uZW50LmdldElkKCkpO1xuXHRcdGNvbnN0IGFFbmhhbmNlSTE4biA9IG9Db21wb25lbnQuZ2V0RW5oYW5jZUkxOG4oKSB8fCBbXTtcblx0XHRsZXQgc0FwcE5hbWVzcGFjZTtcblx0XHR0aGlzLm9GYWN0b3J5ID0gb0NvbnRleHQuZmFjdG9yeTtcblx0XHRpZiAoYUVuaGFuY2VJMThuKSB7XG5cdFx0XHRzQXBwTmFtZXNwYWNlID0gb0FwcENvbXBvbmVudC5nZXRNZXRhZGF0YSgpLmdldENvbXBvbmVudE5hbWUoKTtcblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgYUVuaGFuY2VJMThuLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdC8vIEluIG9yZGVyIHRvIHN1cHBvcnQgdGV4dC12ZXJ0aWNhbGl6YXRpb24gYXBwbGljYXRpb25zIGNhbiBhbHNvIHBhc3NzIGEgcmVzb3VyY2UgbW9kZWwgZGVmaW5lZCBpbiB0aGUgbWFuaWZlc3Rcblx0XHRcdFx0Ly8gVUk1IHRha2VzIGNhcmUgb2YgdGV4dC12ZXJ0aWNhbGl6YXRpb24gZm9yIHJlc291cmNlIG1vZGVscyBkZWZpbmVkIGluIHRoZSBtYW5pZmVzdFxuXHRcdFx0XHQvLyBIZW5jZSBjaGVjayBpZiB0aGUgZ2l2ZW4ga2V5IGlzIGEgcmVzb3VyY2UgbW9kZWwgZGVmaW5lZCBpbiB0aGUgbWFuaWZlc3Rcblx0XHRcdFx0Ly8gaWYgc28gdGhpcyBtb2RlbCBzaG91bGQgYmUgdXNlZCB0byBlbmhhbmNlIHRoZSBzYXAuZmUgcmVzb3VyY2UgbW9kZWwgc28gcGFzcyBpdCBhcyBpdCBpc1xuXHRcdFx0XHRjb25zdCBvUmVzb3VyY2VNb2RlbCA9IG9BcHBDb21wb25lbnQuZ2V0TW9kZWwoYUVuaGFuY2VJMThuW2ldKTtcblx0XHRcdFx0aWYgKG9SZXNvdXJjZU1vZGVsICYmIG9SZXNvdXJjZU1vZGVsLmlzQShcInNhcC51aS5tb2RlbC5yZXNvdXJjZS5SZXNvdXJjZU1vZGVsXCIpKSB7XG5cdFx0XHRcdFx0YUVuaGFuY2VJMThuW2ldID0gb1Jlc291cmNlTW9kZWw7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0YUVuaGFuY2VJMThuW2ldID0gc0FwcE5hbWVzcGFjZSArIFwiLlwiICsgYUVuaGFuY2VJMThuW2ldLnJlcGxhY2UoXCIucHJvcGVydGllc1wiLCBcIlwiKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGNvbnN0IHNDYWNoZUlkZW50aWZpZXIgPVxuXHRcdFx0b0FwcENvbXBvbmVudC5nZXRNZXRhZGF0YSgpLmdldE5hbWUoKSArXG5cdFx0XHRcIl9cIiArXG5cdFx0XHRzU3RhYmxlSWQgK1xuXHRcdFx0XCJfXCIgK1xuXHRcdFx0c2FwLnVpXG5cdFx0XHRcdC5nZXRDb3JlKClcblx0XHRcdFx0LmdldENvbmZpZ3VyYXRpb24oKVxuXHRcdFx0XHQuZ2V0TGFuZ3VhZ2VUYWcoKTtcblx0XHRhU2VydmljZURlcGVuZGVuY2llcy5wdXNoKFxuXHRcdFx0U2VydmljZUZhY3RvcnlSZWdpc3RyeS5nZXQoXCJzYXAuZmUuY29yZS5zZXJ2aWNlcy5SZXNvdXJjZU1vZGVsU2VydmljZVwiKVxuXHRcdFx0XHQuY3JlYXRlSW5zdGFuY2Uoe1xuXHRcdFx0XHRcdHNjb3BlVHlwZTogXCJjb21wb25lbnRcIixcblx0XHRcdFx0XHRzY29wZU9iamVjdDogb0NvbXBvbmVudCxcblx0XHRcdFx0XHRzZXR0aW5nczoge1xuXHRcdFx0XHRcdFx0YnVuZGxlczogW1wic2FwLmZlLmNvcmUubWVzc2FnZWJ1bmRsZVwiLCBcInNhcC5mZS5tYWNyb3MubWVzc2FnZWJ1bmRsZVwiLCBcInNhcC5mZS50ZW1wbGF0ZXMubWVzc2FnZWJ1bmRsZVwiXSxcblx0XHRcdFx0XHRcdGVuaGFuY2VJMThuOiBhRW5oYW5jZUkxOG4sXG5cdFx0XHRcdFx0XHRtb2RlbE5hbWU6IFwic2FwLmZlLmkxOG5cIlxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSlcblx0XHRcdFx0LnRoZW4oKG9SZXNvdXJjZU1vZGVsU2VydmljZTogUmVzb3VyY2VNb2RlbFNlcnZpY2UpID0+IHtcblx0XHRcdFx0XHR0aGlzLm9SZXNvdXJjZU1vZGVsU2VydmljZSA9IG9SZXNvdXJjZU1vZGVsU2VydmljZTtcblx0XHRcdFx0XHRyZXR1cm4gb1Jlc291cmNlTW9kZWxTZXJ2aWNlLmdldFJlc291cmNlTW9kZWwoKTtcblx0XHRcdFx0fSlcblx0XHQpO1xuXG5cdFx0YVNlcnZpY2VEZXBlbmRlbmNpZXMucHVzaChcblx0XHRcdFNlcnZpY2VGYWN0b3J5UmVnaXN0cnkuZ2V0KFwic2FwLmZlLmNvcmUuc2VydmljZXMuQ2FjaGVIYW5kbGVyU2VydmljZVwiKVxuXHRcdFx0XHQuY3JlYXRlSW5zdGFuY2Uoe1xuXHRcdFx0XHRcdHNldHRpbmdzOiB7XG5cdFx0XHRcdFx0XHRtZXRhTW9kZWw6IG9NZXRhTW9kZWwsXG5cdFx0XHRcdFx0XHRhcHBDb21wb25lbnQ6IG9BcHBDb21wb25lbnQsXG5cdFx0XHRcdFx0XHRjb21wb25lbnQ6IG9Db21wb25lbnRcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC50aGVuKChvQ2FjaGVIYW5kbGVyU2VydmljZTogYW55KSA9PiB7XG5cdFx0XHRcdFx0dGhpcy5vQ2FjaGVIYW5kbGVyU2VydmljZSA9IG9DYWNoZUhhbmRsZXJTZXJ2aWNlO1xuXHRcdFx0XHRcdHJldHVybiBvQ2FjaGVIYW5kbGVyU2VydmljZS52YWxpZGF0ZUNhY2hlS2V5KHNDYWNoZUlkZW50aWZpZXIpO1xuXHRcdFx0XHR9KVxuXHRcdCk7XG5cdFx0YVNlcnZpY2VEZXBlbmRlbmNpZXMucHVzaChcblx0XHRcdChWZXJzaW9uSW5mbyBhcyBhbnkpXG5cdFx0XHRcdC5sb2FkKClcblx0XHRcdFx0LnRoZW4oZnVuY3Rpb24ob0luZm86IGFueSkge1xuXHRcdFx0XHRcdGxldCBzVGltZXN0YW1wID0gXCJcIjtcblx0XHRcdFx0XHRpZiAoIW9JbmZvLmxpYnJhcmllcykge1xuXHRcdFx0XHRcdFx0c1RpbWVzdGFtcCA9IChzYXAudWkgYXMgYW55KS5idWlsZGluZm8uYnVpbGR0aW1lO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRvSW5mby5saWJyYXJpZXMuZm9yRWFjaChmdW5jdGlvbihvTGlicmFyeTogYW55KSB7XG5cdFx0XHRcdFx0XHRcdHNUaW1lc3RhbXAgKz0gb0xpYnJhcnkuYnVpbGRUaW1lc3RhbXA7XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIHNUaW1lc3RhbXA7XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5jYXRjaChmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRyZXR1cm4gXCI8Tk9WQUxVRT5cIjtcblx0XHRcdFx0fSlcblx0XHQpO1xuXG5cdFx0bGV0IHNQYWdlTW9kZWxDYWNoZUtleTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXHRcdHRoaXMuaW5pdFByb21pc2UgPSBQcm9taXNlLmFsbChhU2VydmljZURlcGVuZGVuY2llcylcblx0XHRcdC50aGVuKChhRGVwZW5kZW5jaWVzUmVzdWx0OiBhbnlbXSkgPT4ge1xuXHRcdFx0XHRjb25zdCBzQ2FjaGVLZXkgPSBhRGVwZW5kZW5jaWVzUmVzdWx0WzFdO1xuXHRcdFx0XHRjb25zdCBzVmVyc2lvbkluZm8gPSBhRGVwZW5kZW5jaWVzUmVzdWx0WzJdO1xuXHRcdFx0XHRjb25zdCBvU2hlbGxTZXJ2aWNlcyA9IG9BcHBDb21wb25lbnQuZ2V0U2hlbGxTZXJ2aWNlcygpO1xuXHRcdFx0XHRjb25zdCBvU2lkZUVmZmVjdHNTZXJ2aWNlcyA9IG9BcHBDb21wb25lbnQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKCk7XG5cblx0XHRcdFx0b1NpZGVFZmZlY3RzU2VydmljZXMuaW5pdGlhbGl6ZVNpZGVFZmZlY3RzKG9BcHBDb21wb25lbnQuZ2V0RW52aXJvbm1lbnRDYXBhYmlsaXRpZXMoKS5nZXRDYXBhYmlsaXRpZXMoKSk7XG5cblx0XHRcdFx0Ly8gSW4gY2FzZSB0aGVyZSBpcyBubyBjYWNoZSBrZXkgd2UgaWdub3JlIHRoZSB2aWV3IGNhY2hlXG5cdFx0XHRcdHNQYWdlTW9kZWxDYWNoZUtleSA9IHNDYWNoZUtleVxuXHRcdFx0XHRcdD8gc0NhY2hlS2V5ICsgXCItXCIgKyBzVmVyc2lvbkluZm8gKyBcIi1cIiArIHNTdGFibGVJZCArIFwiLVwiICsgb1NoZWxsU2VydmljZXMuaW5zdGFuY2VUeXBlICsgXCItcGFnZU1vZGVsXCJcblx0XHRcdFx0XHQ6IHVuZGVmaW5lZDtcblx0XHRcdFx0cmV0dXJuIFByb21pc2UuYWxsKGFEZXBlbmRlbmNpZXNSZXN1bHQuY29uY2F0KFt0aGlzLl9nZXRDYWNoZWRNb2RlbChzUGFnZU1vZGVsQ2FjaGVLZXkpXSkpO1xuXHRcdFx0fSlcblx0XHRcdC50aGVuKChhRGVwZW5kZW5jaWVzUmVzdWx0OiBhbnlbXSkgPT4ge1xuXHRcdFx0XHRjb25zdCBvUmVzb3VyY2VNb2RlbCA9IGFEZXBlbmRlbmNpZXNSZXN1bHRbMF07XG5cdFx0XHRcdGNvbnN0IHNDYWNoZUtleSA9IGFEZXBlbmRlbmNpZXNSZXN1bHRbMV07XG5cdFx0XHRcdGNvbnN0IG9QYWdlTW9kZWxDYWNoZSA9IGFEZXBlbmRlbmNpZXNSZXN1bHRbM107XG5cdFx0XHRcdHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcblx0XHRcdFx0XHRzYXAudWkucmVxdWlyZShcblx0XHRcdFx0XHRcdFtcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvVGVtcGxhdGVDb252ZXJ0ZXJcIiwgXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01ldGFNb2RlbENvbnZlcnRlclwiXSxcblx0XHRcdFx0XHRcdChUZW1wbGF0ZUNvbnZlcnRlcjogYW55LCBNZXRhTW9kZWxDb252ZXJ0ZXI6IGFueSkgPT4ge1xuXHRcdFx0XHRcdFx0XHRyZXNvbHZlKFxuXHRcdFx0XHRcdFx0XHRcdHRoaXMuY3JlYXRlVmlldyhcblx0XHRcdFx0XHRcdFx0XHRcdG9SZXNvdXJjZU1vZGVsLFxuXHRcdFx0XHRcdFx0XHRcdFx0c1N0YWJsZUlkLFxuXHRcdFx0XHRcdFx0XHRcdFx0c0NhY2hlS2V5LFxuXHRcdFx0XHRcdFx0XHRcdFx0c1BhZ2VNb2RlbENhY2hlS2V5LFxuXHRcdFx0XHRcdFx0XHRcdFx0b1BhZ2VNb2RlbENhY2hlLFxuXHRcdFx0XHRcdFx0XHRcdFx0VGVtcGxhdGVDb252ZXJ0ZXIsXG5cdFx0XHRcdFx0XHRcdFx0XHRNZXRhTW9kZWxDb252ZXJ0ZXJcblx0XHRcdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9KVxuXHRcdFx0LnRoZW4oZnVuY3Rpb24oc0NhY2hlS2V5OiBhbnkpIHtcblx0XHRcdFx0Y29uc3Qgb0NhY2hlSGFuZGxlclNlcnZpY2UgPSBTZXJ2aWNlRmFjdG9yeVJlZ2lzdHJ5LmdldChcInNhcC5mZS5jb3JlLnNlcnZpY2VzLkNhY2hlSGFuZGxlclNlcnZpY2VcIikuZ2V0SW5zdGFuY2Uob01ldGFNb2RlbCk7XG5cdFx0XHRcdG9DYWNoZUhhbmRsZXJTZXJ2aWNlLmludmFsaWRhdGVJZk5lZWRlZChzQ2FjaGVLZXksIHNDYWNoZUlkZW50aWZpZXIpO1xuXHRcdFx0fSk7XG5cdH1cblx0X2dldENhY2hlZE1vZGVsKHNDYWNoZUtleTogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG5cdFx0aWYgKFxuXHRcdFx0c0NhY2hlS2V5ICYmXG5cdFx0XHRzYXAudWlcblx0XHRcdFx0LmdldENvcmUoKVxuXHRcdFx0XHQuZ2V0Q29uZmlndXJhdGlvbigpXG5cdFx0XHRcdC5nZXRWaWV3Q2FjaGUoKVxuXHRcdCkge1xuXHRcdFx0cmV0dXJuIENhY2hlTWFuYWdlci5nZXQoc0NhY2hlS2V5KTtcblx0XHR9XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxuXHRfc2V0Q2FjaGVkTW9kZWwoc0NhY2hlS2V5OiBzdHJpbmcgfCB1bmRlZmluZWQsIG9DYWNoZU1vZGVsOiBhbnkpIHtcblx0XHRpZiAoXG5cdFx0XHRzQ2FjaGVLZXkgJiZcblx0XHRcdHNhcC51aVxuXHRcdFx0XHQuZ2V0Q29yZSgpXG5cdFx0XHRcdC5nZXRDb25maWd1cmF0aW9uKClcblx0XHRcdFx0LmdldFZpZXdDYWNoZSgpXG5cdFx0KSB7XG5cdFx0XHRDYWNoZU1hbmFnZXIuc2V0KHNDYWNoZUtleSwgb0NhY2hlTW9kZWwpO1xuXHRcdH1cblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cdC8qKlxuXHQgKiBSZWZyZXNoIHRoZSBjdXJyZW50IHZpZXcgdXNpbmcgdGhlIHNhbWUgY29uZmlndXJhdGlvbiBhcyBiZWZvcmUuXG5cdCAqIFRoaXMgaXMgdXNlZnVsIGZvciBvdXIgZGVtb2tpdCAhXG5cdCAqXG5cdCAqIEBwYXJhbSBvQ29tcG9uZW50XG5cdCAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0cmVmcmVzaFZpZXcob0NvbXBvbmVudDogYW55KSB7XG5cdFx0Y29uc3Qgb1Jvb3RWaWV3ID0gb0NvbXBvbmVudC5nZXRSb290Q29udHJvbCgpO1xuXHRcdGlmIChvUm9vdFZpZXcpIHtcblx0XHRcdG9Sb290Vmlldy5kZXN0cm95KCk7XG5cdFx0fSBlbHNlIGlmICh0aGlzLm9WaWV3KSB7XG5cdFx0XHR0aGlzLm9WaWV3LmRlc3Ryb3koKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMuY3JlYXRlVmlldyh0aGlzLnJlc291cmNlTW9kZWwsIHRoaXMuc3RhYmxlSWQsIFwiXCIsIFwiXCIsIHVuZGVmaW5lZCwgdGhpcy5UZW1wbGF0ZUNvbnZlcnRlciwgdGhpcy5NZXRhTW9kZWxDb252ZXJ0ZXIpXG5cdFx0XHQudGhlbihmdW5jdGlvbigpIHtcblx0XHRcdFx0b0NvbXBvbmVudC5vQ29udGFpbmVyLmludmFsaWRhdGUoKTtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24ob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0b0NvbXBvbmVudC5vQ29udGFpbmVyLmludmFsaWRhdGUoKTtcblx0XHRcdFx0TG9nLmVycm9yKG9FcnJvcik7XG5cdFx0XHR9KTtcblx0fVxuXHRjcmVhdGVWaWV3KFxuXHRcdG9SZXNvdXJjZU1vZGVsOiBhbnksXG5cdFx0c1N0YWJsZUlkOiBhbnksXG5cdFx0c0NhY2hlS2V5OiBhbnksXG5cdFx0c1BhZ2VNb2RlbENhY2hlS2V5OiBzdHJpbmcgfCB1bmRlZmluZWQsXG5cdFx0b1BhZ2VNb2RlbENhY2hlOiBhbnksXG5cdFx0VGVtcGxhdGVDb252ZXJ0ZXI6IGFueSxcblx0XHRNZXRhTW9kZWxDb252ZXJ0ZXI6IGFueVxuXHQpIHtcblx0XHR0aGlzLnJlc291cmNlTW9kZWwgPSBvUmVzb3VyY2VNb2RlbDtcblx0XHR0aGlzLnN0YWJsZUlkID0gc1N0YWJsZUlkO1xuXHRcdHRoaXMuVGVtcGxhdGVDb252ZXJ0ZXIgPSBUZW1wbGF0ZUNvbnZlcnRlcjtcblx0XHR0aGlzLk1ldGFNb2RlbENvbnZlcnRlciA9IE1ldGFNb2RlbENvbnZlcnRlcjtcblx0XHRjb25zdCBvQ29udGV4dCA9IHRoaXMuZ2V0Q29udGV4dCgpO1xuXHRcdGNvbnN0IG1TZXJ2aWNlU2V0dGluZ3MgPSBvQ29udGV4dC5zZXR0aW5ncztcblx0XHRjb25zdCBzQ29udmVydGVyVHlwZSA9IG1TZXJ2aWNlU2V0dGluZ3MuY29udmVydGVyVHlwZTtcblx0XHRjb25zdCBvQ29tcG9uZW50ID0gb0NvbnRleHQuc2NvcGVPYmplY3Q7XG5cdFx0Y29uc3Qgb0FwcENvbXBvbmVudDogQXBwQ29tcG9uZW50ID0gQ29tcG9uZW50LmdldE93bmVyQ29tcG9uZW50Rm9yKG9Db21wb25lbnQpIGFzIEFwcENvbXBvbmVudDtcblx0XHRjb25zdCBzRnVsbENvbnRleHRQYXRoID0gb0FwcENvbXBvbmVudC5nZXRSb3V0aW5nU2VydmljZSgpLmdldFRhcmdldEluZm9ybWF0aW9uRm9yKG9Db21wb25lbnQpLm9wdGlvbnMuc2V0dGluZ3MuZnVsbENvbnRleHRQYXRoO1xuXHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvQXBwQ29tcG9uZW50LmdldE1ldGFNb2RlbCgpO1xuXHRcdGNvbnN0IG9NYW5pZmVzdENvbnRlbnQ6IGFueSA9IG9BcHBDb21wb25lbnQuZ2V0TWFuaWZlc3QoKTtcblx0XHRjb25zdCBvRGV2aWNlTW9kZWwgPSBuZXcgSlNPTk1vZGVsKHNhcC51aS5EZXZpY2UpLnNldERlZmF1bHRCaW5kaW5nTW9kZShcIk9uZVdheVwiKTtcblx0XHRjb25zdCBvTWFuaWZlc3RNb2RlbCA9IG5ldyBKU09OTW9kZWwob01hbmlmZXN0Q29udGVudCk7XG5cdFx0Y29uc3QgYkVycm9yID0gZmFsc2U7XG5cdFx0bGV0IG9QYWdlTW9kZWw6IFRlbXBsYXRlTW9kZWwsIG9WaWV3RGF0YU1vZGVsOiBNb2RlbCwgb1ZpZXdTZXR0aW5nczogYW55LCBtVmlld0RhdGE6IGFueTtcblxuXHRcdGZ1bmN0aW9uIGdldFZpZXdTZXR0aW5ncygpIHtcblx0XHRcdGNvbnN0IGFTcGxpdFBhdGggPSBzRnVsbENvbnRleHRQYXRoLnNwbGl0KFwiL1wiKTtcblx0XHRcdGNvbnN0IHNFbnRpdHlTZXRQYXRoID0gYVNwbGl0UGF0aC5yZWR1Y2UoZnVuY3Rpb24oc1BhdGhTb0ZhcjogYW55LCBzTmV4dFBhdGhQYXJ0OiBhbnkpIHtcblx0XHRcdFx0aWYgKHNOZXh0UGF0aFBhcnQgPT09IFwiXCIpIHtcblx0XHRcdFx0XHRyZXR1cm4gc1BhdGhTb0Zhcjtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoc1BhdGhTb0ZhciA9PT0gXCJcIikge1xuXHRcdFx0XHRcdHNQYXRoU29GYXIgPSBcIi9cIiArIHNOZXh0UGF0aFBhcnQ7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Y29uc3Qgb1RhcmdldCA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KHNQYXRoU29GYXIgKyBcIi8kTmF2aWdhdGlvblByb3BlcnR5QmluZGluZy9cIiArIHNOZXh0UGF0aFBhcnQpO1xuXHRcdFx0XHRcdGlmIChvVGFyZ2V0ICYmIE9iamVjdC5rZXlzKG9UYXJnZXQpLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRcdHNQYXRoU29GYXIgKz0gXCIvJE5hdmlnYXRpb25Qcm9wZXJ0eUJpbmRpbmdcIjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0c1BhdGhTb0ZhciArPSBcIi9cIiArIHNOZXh0UGF0aFBhcnQ7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHNQYXRoU29GYXI7XG5cdFx0XHR9LCBcIlwiKTtcblx0XHRcdGNvbnN0IG9WaWV3U2V0dGluZ3MgPSB7XG5cdFx0XHRcdHR5cGU6IFwiWE1MXCIsXG5cdFx0XHRcdHByZXByb2Nlc3NvcnM6IHtcblx0XHRcdFx0XHR4bWw6IHtcblx0XHRcdFx0XHRcdGJpbmRpbmdDb250ZXh0czoge1xuXHRcdFx0XHRcdFx0XHRlbnRpdHlTZXQ6IHNFbnRpdHlTZXRQYXRoID8gb01ldGFNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChzRW50aXR5U2V0UGF0aCkgOiBudWxsLFxuXHRcdFx0XHRcdFx0XHRmdWxsQ29udGV4dFBhdGg6IHNGdWxsQ29udGV4dFBhdGggPyBvTWV0YU1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KHNGdWxsQ29udGV4dFBhdGgpIDogbnVsbCxcblx0XHRcdFx0XHRcdFx0Y29udGV4dFBhdGg6IHNGdWxsQ29udGV4dFBhdGggPyBvTWV0YU1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KHNGdWxsQ29udGV4dFBhdGgpIDogbnVsbCxcblx0XHRcdFx0XHRcdFx0Y29udmVydGVyQ29udGV4dDogb1BhZ2VNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChcIi9cIiwgdW5kZWZpbmVkLCB7IG5vUmVzb2x2ZTogdHJ1ZSB9KSxcblx0XHRcdFx0XHRcdFx0dmlld0RhdGE6IG1WaWV3RGF0YSA/IG9WaWV3RGF0YU1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KFwiL1wiKSA6IG51bGxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRtb2RlbHM6IHtcblx0XHRcdFx0XHRcdFx0ZW50aXR5U2V0OiBvTWV0YU1vZGVsLFxuXHRcdFx0XHRcdFx0XHRmdWxsQ29udGV4dFBhdGg6IG9NZXRhTW9kZWwsXG5cdFx0XHRcdFx0XHRcdGNvbnRleHRQYXRoOiBvTWV0YU1vZGVsLFxuXHRcdFx0XHRcdFx0XHRcInNhcC5mZS5pMThuXCI6IG9SZXNvdXJjZU1vZGVsLFxuXHRcdFx0XHRcdFx0XHRtZXRhTW9kZWw6IG9NZXRhTW9kZWwsXG5cdFx0XHRcdFx0XHRcdFwiZGV2aWNlXCI6IG9EZXZpY2VNb2RlbCwgLy8gVE9ETzogZGlzY3VzcyBuYW1lcyBoZXJlXG5cdFx0XHRcdFx0XHRcdG1hbmlmZXN0OiBvTWFuaWZlc3RNb2RlbCxcblx0XHRcdFx0XHRcdFx0Y29udmVydGVyQ29udGV4dDogb1BhZ2VNb2RlbCxcblx0XHRcdFx0XHRcdFx0dmlld0RhdGE6IG9WaWV3RGF0YU1vZGVsXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0YXBwQ29tcG9uZW50OiBvQXBwQ29tcG9uZW50XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9LFxuXHRcdFx0XHRpZDogc1N0YWJsZUlkLFxuXHRcdFx0XHR2aWV3TmFtZTogbVNlcnZpY2VTZXR0aW5ncy52aWV3TmFtZSB8fCBvQ29tcG9uZW50LmdldFZpZXdOYW1lKCksXG5cdFx0XHRcdHZpZXdEYXRhOiBtVmlld0RhdGEsXG5cdFx0XHRcdGNhY2hlOiB7IGtleXM6IFtzQ2FjaGVLZXldIH0sXG5cdFx0XHRcdG1vZGVsczoge1xuXHRcdFx0XHRcdFwic2FwLmZlLmkxOG5cIjogb1Jlc291cmNlTW9kZWxcblx0XHRcdFx0fSxcblx0XHRcdFx0aGVpZ2h0OiBcIjEwMCVcIlxuXHRcdFx0fTtcblx0XHRcdHJldHVybiBvVmlld1NldHRpbmdzO1xuXHRcdH1cblx0XHRjb25zdCBjcmVhdGVFcnJvclBhZ2UgPSAocmVhc29uOiBhbnkpID0+IHtcblx0XHRcdC8vIGp1c3QgcmVwbGFjZSB0aGUgdmlldyBuYW1lIGFuZCBhZGQgYW4gYWRkaXRpb25hbCBtb2RlbCBjb250YWluaW5nIHRoZSByZWFzb24sIGJ1dFxuXHRcdFx0Ly8ga2VlcCB0aGUgb3RoZXIgc2V0dGluZ3Ncblx0XHRcdExvZy5lcnJvcihyZWFzb24ubWVzc2FnZSwgcmVhc29uKTtcblx0XHRcdG9WaWV3U2V0dGluZ3Mudmlld05hbWUgPSBtU2VydmljZVNldHRpbmdzLmVycm9yVmlld05hbWUgfHwgXCJzYXAuZmUuY29yZS5zZXJ2aWNlcy52aWV3LlRlbXBsYXRpbmdFcnJvclBhZ2VcIjtcblx0XHRcdG9WaWV3U2V0dGluZ3MucHJlcHJvY2Vzc29ycy54bWwubW9kZWxzW1wiZXJyb3JcIl0gPSBuZXcgSlNPTk1vZGVsKHJlYXNvbik7XG5cblx0XHRcdHJldHVybiBvQ29tcG9uZW50LnJ1bkFzT3duZXIoKCkgPT4ge1xuXHRcdFx0XHRyZXR1cm4gVmlldy5jcmVhdGUob1ZpZXdTZXR0aW5ncykudGhlbigob1ZpZXc6IGFueSkgPT4ge1xuXHRcdFx0XHRcdHRoaXMub1ZpZXcgPSBvVmlldztcblx0XHRcdFx0XHR0aGlzLm9WaWV3LnNldE1vZGVsKG5ldyBNYW5hZ2VkT2JqZWN0TW9kZWwodGhpcy5vVmlldyksIFwiJHZpZXdcIik7XG5cdFx0XHRcdFx0b0NvbXBvbmVudC5zZXRBZ2dyZWdhdGlvbihcInJvb3RDb250cm9sXCIsIHRoaXMub1ZpZXcpO1xuXHRcdFx0XHRcdHJldHVybiBzQ2FjaGVLZXk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cdFx0fTtcblx0XHRyZXR1cm4gb0FwcENvbXBvbmVudFxuXHRcdFx0LmdldFNlcnZpY2UoXCJyb3V0aW5nU2VydmljZVwiKVxuXHRcdFx0LnRoZW4oKG9Sb3V0aW5nU2VydmljZTogYW55KSA9PiB7XG5cdFx0XHRcdC8vIFJldHJpZXZlIHRoZSB2aWV3TGV2ZWwgZm9yIHRoZSBjb21wb25lbnRcblx0XHRcdFx0Y29uc3Qgb1RhcmdldEluZm8gPSBvUm91dGluZ1NlcnZpY2UuZ2V0VGFyZ2V0SW5mb3JtYXRpb25Gb3Iob0NvbXBvbmVudCk7XG5cdFx0XHRcdGNvbnN0IG1PdXRib3VuZHMgPVxuXHRcdFx0XHRcdG9NYW5pZmVzdENvbnRlbnRbXCJzYXAuYXBwXCJdICYmXG5cdFx0XHRcdFx0b01hbmlmZXN0Q29udGVudFtcInNhcC5hcHBcIl0uY3Jvc3NOYXZpZ2F0aW9uICYmXG5cdFx0XHRcdFx0b01hbmlmZXN0Q29udGVudFtcInNhcC5hcHBcIl0uY3Jvc3NOYXZpZ2F0aW9uLm91dGJvdW5kcztcblx0XHRcdFx0Y29uc3QgbU5hdmlnYXRpb24gPSBvQ29tcG9uZW50LmdldE5hdmlnYXRpb24oKSB8fCB7fTtcblx0XHRcdFx0T2JqZWN0LmtleXMobU5hdmlnYXRpb24pLmZvckVhY2goZnVuY3Rpb24obmF2aWdhdGlvbk9iamVjdEtleTogc3RyaW5nKSB7XG5cdFx0XHRcdFx0Y29uc3QgbmF2aWdhdGlvbk9iamVjdCA9IG1OYXZpZ2F0aW9uW25hdmlnYXRpb25PYmplY3RLZXldO1xuXHRcdFx0XHRcdGxldCBvdXRib3VuZENvbmZpZztcblx0XHRcdFx0XHRpZiAobmF2aWdhdGlvbk9iamVjdC5kZXRhaWwgJiYgbmF2aWdhdGlvbk9iamVjdC5kZXRhaWwub3V0Ym91bmQgJiYgbU91dGJvdW5kc1tuYXZpZ2F0aW9uT2JqZWN0LmRldGFpbC5vdXRib3VuZF0pIHtcblx0XHRcdFx0XHRcdG91dGJvdW5kQ29uZmlnID0gbU91dGJvdW5kc1tuYXZpZ2F0aW9uT2JqZWN0LmRldGFpbC5vdXRib3VuZF07XG5cdFx0XHRcdFx0XHRuYXZpZ2F0aW9uT2JqZWN0LmRldGFpbC5vdXRib3VuZERldGFpbCA9IHtcblx0XHRcdFx0XHRcdFx0c2VtYW50aWNPYmplY3Q6IG91dGJvdW5kQ29uZmlnLnNlbWFudGljT2JqZWN0LFxuXHRcdFx0XHRcdFx0XHRhY3Rpb246IG91dGJvdW5kQ29uZmlnLmFjdGlvbixcblx0XHRcdFx0XHRcdFx0cGFyYW1ldGVyczogb3V0Ym91bmRDb25maWcucGFyYW1ldGVyc1xuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKG5hdmlnYXRpb25PYmplY3QuY3JlYXRlICYmIG5hdmlnYXRpb25PYmplY3QuY3JlYXRlLm91dGJvdW5kICYmIG1PdXRib3VuZHNbbmF2aWdhdGlvbk9iamVjdC5jcmVhdGUub3V0Ym91bmRdKSB7XG5cdFx0XHRcdFx0XHRvdXRib3VuZENvbmZpZyA9IG1PdXRib3VuZHNbbmF2aWdhdGlvbk9iamVjdC5jcmVhdGUub3V0Ym91bmRdO1xuXHRcdFx0XHRcdFx0bmF2aWdhdGlvbk9iamVjdC5jcmVhdGUub3V0Ym91bmREZXRhaWwgPSB7XG5cdFx0XHRcdFx0XHRcdHNlbWFudGljT2JqZWN0OiBvdXRib3VuZENvbmZpZy5zZW1hbnRpY09iamVjdCxcblx0XHRcdFx0XHRcdFx0YWN0aW9uOiBvdXRib3VuZENvbmZpZy5hY3Rpb24sXG5cdFx0XHRcdFx0XHRcdHBhcmFtZXRlcnM6IG91dGJvdW5kQ29uZmlnLnBhcmFtZXRlcnNcblx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdFx0bVZpZXdEYXRhID0ge1xuXHRcdFx0XHRcdG5hdmlnYXRpb246IG1OYXZpZ2F0aW9uLFxuXHRcdFx0XHRcdHZpZXdMZXZlbDogb1RhcmdldEluZm8udmlld0xldmVsLFxuXHRcdFx0XHRcdHN0YWJsZUlkOiBzU3RhYmxlSWQsXG5cdFx0XHRcdFx0Y29udGVudERlbnNpdGllczogb01hbmlmZXN0Q29udGVudFtcInNhcC51aTVcIl0uY29udGVudERlbnNpdGllcyxcblx0XHRcdFx0XHRyZXNvdXJjZUJ1bmRsZTogb1Jlc291cmNlTW9kZWwuX19idW5kbGUsXG5cdFx0XHRcdFx0ZnVsbENvbnRleHRQYXRoOiBzRnVsbENvbnRleHRQYXRoLFxuXHRcdFx0XHRcdGlzRGVza3RvcDogKERldmljZSBhcyBhbnkpLnN5c3RlbS5kZXNrdG9wLFxuXHRcdFx0XHRcdGlzUGhvbmU6IChEZXZpY2UgYXMgYW55KS5zeXN0ZW0ucGhvbmVcblx0XHRcdFx0fTtcblxuXHRcdFx0XHRpZiAob0NvbXBvbmVudC5nZXRWaWV3RGF0YSkge1xuXHRcdFx0XHRcdE9iamVjdC5hc3NpZ24obVZpZXdEYXRhLCBvQ29tcG9uZW50LmdldFZpZXdEYXRhKCkpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Y29uc3Qgb1NoZWxsU2VydmljZXMgPSBvQXBwQ29tcG9uZW50LmdldFNoZWxsU2VydmljZXMoKTtcblx0XHRcdFx0bVZpZXdEYXRhLmNvbnZlcnRlclR5cGUgPSBzQ29udmVydGVyVHlwZTtcblx0XHRcdFx0bVZpZXdEYXRhLnNoZWxsQ29udGVudERlbnNpdHkgPSBvU2hlbGxTZXJ2aWNlcy5nZXRDb250ZW50RGVuc2l0eSgpO1xuXHRcdFx0XHRtVmlld0RhdGEudXNlTmV3TGF6eUxvYWRpbmcgPSBVcmlQYXJhbWV0ZXJzLmZyb21RdWVyeSh3aW5kb3cubG9jYXRpb24uc2VhcmNoKS5nZXQoXCJzYXAtZmUteHgtbGF6eWxvYWRpbmd0ZXN0XCIpID09PSBcInRydWVcIjtcblx0XHRcdFx0bVZpZXdEYXRhLnJldHJpZXZlVGV4dEZyb21WYWx1ZUxpc3QgPVxuXHRcdFx0XHRcdG9NYW5pZmVzdENvbnRlbnRbXCJzYXAuZmVcIl0gJiYgb01hbmlmZXN0Q29udGVudFtcInNhcC5mZVwiXS5mb3JtXG5cdFx0XHRcdFx0XHQ/IG9NYW5pZmVzdENvbnRlbnRbXCJzYXAuZmVcIl0uZm9ybS5yZXRyaWV2ZVRleHRGcm9tVmFsdWVMaXN0XG5cdFx0XHRcdFx0XHQ6IHVuZGVmaW5lZDtcblx0XHRcdFx0b1ZpZXdEYXRhTW9kZWwgPSBuZXcgSlNPTk1vZGVsKG1WaWV3RGF0YSk7XG5cdFx0XHRcdGlmIChtVmlld0RhdGEgJiYgbVZpZXdEYXRhLmNvbnRyb2xDb25maWd1cmF0aW9uKSB7XG5cdFx0XHRcdFx0T2JqZWN0LmtleXMobVZpZXdEYXRhLmNvbnRyb2xDb25maWd1cmF0aW9uKS5mb3JFYWNoKGZ1bmN0aW9uKHNBbm5vdGF0aW9uUGF0aDogc3RyaW5nKSB7XG5cdFx0XHRcdFx0XHRpZiAoc0Fubm90YXRpb25QYXRoLmluZGV4T2YoXCJbXCIpICE9PSAtMSkge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBzVGFyZ2V0QW5ub3RhdGlvblBhdGggPSByZXNvbHZlRHluYW1pY0V4cHJlc3Npb24oc0Fubm90YXRpb25QYXRoLCBvTWV0YU1vZGVsKTtcblx0XHRcdFx0XHRcdFx0bVZpZXdEYXRhLmNvbnRyb2xDb25maWd1cmF0aW9uW3NUYXJnZXRBbm5vdGF0aW9uUGF0aF0gPSBtVmlld0RhdGEuY29udHJvbENvbmZpZ3VyYXRpb25bc0Fubm90YXRpb25QYXRoXTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRNZXRhTW9kZWxDb252ZXJ0ZXIuY29udmVydFR5cGVzKG9NZXRhTW9kZWwsIG9BcHBDb21wb25lbnQuZ2V0RW52aXJvbm1lbnRDYXBhYmlsaXRpZXMoKS5nZXRDYXBhYmlsaXRpZXMoKSk7XG5cdFx0XHRcdG9QYWdlTW9kZWwgPSBuZXcgVGVtcGxhdGVNb2RlbCgoKSA9PiB7XG5cdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdGlmICghIW9QYWdlTW9kZWxDYWNoZSkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gb1BhZ2VNb2RlbENhY2hlO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0Y29uc3Qgb0RpYWdub3N0aWNzID0gb0FwcENvbXBvbmVudC5nZXREaWFnbm9zdGljcygpO1xuXHRcdFx0XHRcdFx0XHRjb25zdCBpSXNzdWVDb3VudCA9IG9EaWFnbm9zdGljcy5nZXRJc3N1ZXMoKS5sZW5ndGg7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IG9Db252ZXJ0ZXJQYWdlTW9kZWwgPSBUZW1wbGF0ZUNvbnZlcnRlci5jb252ZXJ0UGFnZShcblx0XHRcdFx0XHRcdFx0XHRzQ29udmVydGVyVHlwZSxcblx0XHRcdFx0XHRcdFx0XHRvTWV0YU1vZGVsLFxuXHRcdFx0XHRcdFx0XHRcdG1WaWV3RGF0YSxcblx0XHRcdFx0XHRcdFx0XHRvRGlhZ25vc3RpY3MsXG5cdFx0XHRcdFx0XHRcdFx0c0Z1bGxDb250ZXh0UGF0aCxcblx0XHRcdFx0XHRcdFx0XHRvQXBwQ29tcG9uZW50LmdldEVudmlyb25tZW50Q2FwYWJpbGl0aWVzKCkuZ2V0Q2FwYWJpbGl0aWVzKClcblx0XHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0XHRjb25zdCBhSXNzdWVzID0gb0RpYWdub3N0aWNzLmdldElzc3VlcygpO1xuXHRcdFx0XHRcdFx0XHRjb25zdCBhQWRkZWRJc3N1ZXMgPSBhSXNzdWVzLnNsaWNlKGlJc3N1ZUNvdW50KTtcblx0XHRcdFx0XHRcdFx0aWYgKGFBZGRlZElzc3Vlcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0XHRcdFx0TG9nLndhcm5pbmcoXG5cdFx0XHRcdFx0XHRcdFx0XHRcIlNvbWUgaXNzdWVzIGhhdmUgYmVlbiBkZXRlY3RlZCBpbiB5b3VyIHByb2plY3QsIHBsZWFzZSBjaGVjayB0aGUgVUk1IHN1cHBvcnQgYXNzaXN0YW50IHJ1bGUgZm9yIHNhcC5mZS5jb3JlXCJcblx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHJldHVybiBvQ29udmVydGVyUGFnZU1vZGVsO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRcdFx0XHRMb2cuZXJyb3IoZXJyb3IsIGVycm9yKTtcblx0XHRcdFx0XHRcdHJldHVybiB7fTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0sIG9NZXRhTW9kZWwpO1xuXG5cdFx0XHRcdGlmICghYkVycm9yKSB7XG5cdFx0XHRcdFx0b1ZpZXdTZXR0aW5ncyA9IGdldFZpZXdTZXR0aW5ncygpO1xuXHRcdFx0XHRcdC8vIFNldHRpbmcgdGhlIHBhZ2VNb2RlbCBvbiB0aGUgY29tcG9uZW50IGZvciBwb3RlbnRpYWwgcmV1c2Vcblx0XHRcdFx0XHRvQ29tcG9uZW50LnNldE1vZGVsKG9QYWdlTW9kZWwsIFwiX3BhZ2VNb2RlbFwiKTtcblx0XHRcdFx0XHRyZXR1cm4gb0NvbXBvbmVudC5ydW5Bc093bmVyKCgpID0+IHtcblx0XHRcdFx0XHRcdHJldHVybiBWaWV3LmNyZWF0ZShvVmlld1NldHRpbmdzKVxuXHRcdFx0XHRcdFx0XHQuY2F0Y2goY3JlYXRlRXJyb3JQYWdlKVxuXHRcdFx0XHRcdFx0XHQudGhlbigob1ZpZXc6IGFueSkgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdHRoaXMub1ZpZXcgPSBvVmlldztcblx0XHRcdFx0XHRcdFx0XHR0aGlzLm9WaWV3LnNldE1vZGVsKG5ldyBNYW5hZ2VkT2JqZWN0TW9kZWwodGhpcy5vVmlldyksIFwiJHZpZXdcIik7XG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5vVmlldy5zZXRNb2RlbChvVmlld0RhdGFNb2RlbCwgXCJ2aWV3RGF0YVwiKTtcblx0XHRcdFx0XHRcdFx0XHRvQ29tcG9uZW50LnNldEFnZ3JlZ2F0aW9uKFwicm9vdENvbnRyb2xcIiwgdGhpcy5vVmlldyk7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gRmlyZSBhbmQgZm9yZ2V0IGluIHRoZSBjYWNoZVxuXHRcdFx0XHRcdFx0XHRcdGlmICghb1BhZ2VNb2RlbENhY2hlKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHR0aGlzLl9zZXRDYWNoZWRNb2RlbChzUGFnZU1vZGVsQ2FjaGVLZXksIChvUGFnZU1vZGVsIGFzIGFueSkuZ2V0RGF0YSgpKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHNDYWNoZUtleTtcblx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0LmNhdGNoKGUgPT4gTG9nLmVycm9yKGUubWVzc2FnZSwgZSkpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uKGVycm9yOiBhbnkpIHtcblx0XHRcdFx0TG9nLmVycm9yKGVycm9yLm1lc3NhZ2UsIGVycm9yKTtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiRXJyb3Igd2hpbGUgY3JlYXRpbmcgdmlldyA6IFwiICsgZXJyb3IpO1xuXHRcdFx0fSk7XG5cdH1cblx0Z2V0VmlldygpIHtcblx0XHRyZXR1cm4gdGhpcy5vVmlldztcblx0fVxuXHRnZXRJbnRlcmZhY2UoKTogYW55IHtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXHRleGl0KCkge1xuXHRcdC8vIERlcmVnaXN0ZXIgZ2xvYmFsIGluc3RhbmNlXG5cdFx0dGhpcy5vUmVzb3VyY2VNb2RlbFNlcnZpY2UgJiYgdGhpcy5vUmVzb3VyY2VNb2RlbFNlcnZpY2UuZGVzdHJveSgpO1xuXHRcdHRoaXMub0NhY2hlSGFuZGxlclNlcnZpY2UgJiYgdGhpcy5vQ2FjaGVIYW5kbGVyU2VydmljZS5kZXN0cm95KCk7XG5cdFx0dGhpcy5vRmFjdG9yeS5yZW1vdmVHbG9iYWxJbnN0YW5jZSgpO1xuXHR9XG59XG5jbGFzcyBUZW1wbGF0ZWRWaWV3U2VydmljZUZhY3RvcnkgZXh0ZW5kcyBTZXJ2aWNlRmFjdG9yeTxUZW1wbGF0ZWRWaWV3U2VydmljZVNldHRpbmdzPiB7XG5cdF9vSW5zdGFuY2VSZWdpc3RyeTogUmVjb3JkPHN0cmluZywgVGVtcGxhdGVkVmlld1NlcnZpY2U+ID0ge307XG5cdHN0YXRpYyBpQ3JlYXRpbmdWaWV3czogMDtcblx0Y3JlYXRlSW5zdGFuY2Uob1NlcnZpY2VDb250ZXh0OiBTZXJ2aWNlQ29udGV4dDxUZW1wbGF0ZWRWaWV3U2VydmljZVNldHRpbmdzPikge1xuXHRcdFRlbXBsYXRlZFZpZXdTZXJ2aWNlRmFjdG9yeS5pQ3JlYXRpbmdWaWV3cysrO1xuXG5cdFx0Y29uc3Qgb1RlbXBsYXRlZFZpZXdTZXJ2aWNlID0gbmV3IFRlbXBsYXRlZFZpZXdTZXJ2aWNlKE9iamVjdC5hc3NpZ24oeyBmYWN0b3J5OiB0aGlzIH0sIG9TZXJ2aWNlQ29udGV4dCkpO1xuXHRcdHJldHVybiBvVGVtcGxhdGVkVmlld1NlcnZpY2UuaW5pdFByb21pc2UudGhlbihmdW5jdGlvbigpIHtcblx0XHRcdFRlbXBsYXRlZFZpZXdTZXJ2aWNlRmFjdG9yeS5pQ3JlYXRpbmdWaWV3cy0tO1xuXHRcdFx0cmV0dXJuIG9UZW1wbGF0ZWRWaWV3U2VydmljZTtcblx0XHR9KTtcblx0fVxuXHRyZW1vdmVHbG9iYWxJbnN0YW5jZSgpIHtcblx0XHR0aGlzLl9vSW5zdGFuY2VSZWdpc3RyeSA9IHt9O1xuXHR9XG5cdHN0YXRpYyBnZXROdW1iZXJPZlZpZXdzSW5DcmVhdGlvblN0YXRlKCkge1xuXHRcdHJldHVybiBUZW1wbGF0ZWRWaWV3U2VydmljZUZhY3RvcnkuaUNyZWF0aW5nVmlld3M7XG5cdH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgVGVtcGxhdGVkVmlld1NlcnZpY2VGYWN0b3J5O1xuIl19