@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
@@ -1,5 +1,5 @@
1
- import { EntitySet, EntityType, NavigationProperty, Property } from "@sap-ux/annotation-converter";
2
- import { annotationExpression, constant, equal, Expression } from "sap/fe/core/helpers/BindingExpression";
1
+ import { ConverterOutput, EntitySet, EntityType, NavigationProperty, Property } from "@sap-ux/annotation-converter";
2
+ import { annotationExpression, constant, equal, Expression, unresolveableExpression } from "sap/fe/core/helpers/BindingExpression";
3
3
  import { NavigationPropertyRestrictionTypes } from "@sap-ux/vocabularies-types/dist/generated/Capabilities";
4
4
  import { PropertyOrPath } from "sap/fe/core/templating/DisplayModeFormatter";
5
5
  import { isAnnotationPathExpression, isPathExpression } from "sap/fe/core/templating/PropertyHelper";
@@ -20,6 +20,14 @@ export type DataModelObjectPath = {
20
20
  targetEntitySet?: EntitySet;
21
21
  targetEntityType: EntityType;
22
22
  targetObject: any;
23
+ convertedTypes: ConverterOutput;
24
+ };
25
+
26
+ type ExtractionParametersOnPath = {
27
+ propertyPath?: PropertyOrPath<Property>;
28
+ pathVisitor?: Function;
29
+ ignoreTargetCollection?: boolean;
30
+ authorizeUnresolvable?: boolean;
23
31
  };
24
32
 
25
33
  export const getPathRelativeLocation = function(
@@ -28,51 +36,49 @@ export const getPathRelativeLocation = function(
28
36
  ): NavigationProperty[] {
29
37
  if (!contextPath) {
30
38
  return visitedNavProps;
39
+ } else if (visitedNavProps.length >= contextPath.navigationProperties.length) {
40
+ let remainingNavProps: NavigationProperty[] = [];
41
+ contextPath.navigationProperties.forEach((navProp, navIndex) => {
42
+ if (visitedNavProps[navIndex] !== navProp) {
43
+ remainingNavProps.push(visitedNavProps[navIndex]);
44
+ }
45
+ });
46
+ remainingNavProps = remainingNavProps.concat(visitedNavProps.slice(contextPath.navigationProperties.length));
47
+ // Clean up NavProp -> Owner
48
+ let currentIdx = 0;
49
+ while (remainingNavProps.length > 1 && currentIdx != remainingNavProps.length - 1) {
50
+ const currentNav = remainingNavProps[currentIdx];
51
+ const nextNavProp = remainingNavProps[currentIdx + 1];
52
+ if (currentNav.partner === nextNavProp.name) {
53
+ remainingNavProps.splice(0, 2);
54
+ } else {
55
+ currentIdx++;
56
+ }
57
+ }
58
+ return remainingNavProps;
31
59
  } else {
32
- if (visitedNavProps.length >= contextPath.navigationProperties.length) {
33
- let remainingNavProps: NavigationProperty[] = [];
34
- contextPath.navigationProperties.forEach((navProp, navIndex) => {
35
- if (visitedNavProps[navIndex] !== navProp) {
36
- remainingNavProps.push(visitedNavProps[navIndex]);
37
- }
38
- });
39
- remainingNavProps = remainingNavProps.concat(visitedNavProps.slice(contextPath.navigationProperties.length));
40
- // Clean up NavProp -> Owner
41
- let currentIdx = 0;
42
- while (remainingNavProps.length > 1 && currentIdx != remainingNavProps.length - 1) {
43
- const currentNav = remainingNavProps[currentIdx];
44
- const nextNavProp = remainingNavProps[currentIdx + 1];
45
- if (currentNav.partner === nextNavProp.name) {
46
- remainingNavProps.splice(0, 2);
47
- } else {
48
- currentIdx++;
49
- }
60
+ let extraNavProp: NavigationProperty[] = [];
61
+ visitedNavProps.forEach((navProp, navIndex) => {
62
+ if (contextPath.navigationProperties[navIndex] !== navProp) {
63
+ extraNavProp.push(visitedNavProps[navIndex]);
50
64
  }
51
- return remainingNavProps;
52
- } else {
53
- let extraNavProp: NavigationProperty[] = [];
54
- visitedNavProps.forEach((navProp, navIndex) => {
55
- if (contextPath.navigationProperties[navIndex] !== navProp) {
56
- extraNavProp.push(visitedNavProps[navIndex]);
57
- }
58
- });
59
- extraNavProp = extraNavProp.concat(contextPath.navigationProperties.slice(visitedNavProps.length));
60
- // Clean up NavProp -> Owner
61
- let currentIdx = 0;
62
- while (extraNavProp.length > 1 && currentIdx != extraNavProp.length - 1) {
63
- const currentNav = extraNavProp[currentIdx];
64
- const nextNavProp = extraNavProp[currentIdx + 1];
65
- if (currentNav.partner === nextNavProp.name) {
66
- extraNavProp.splice(0, 2);
67
- } else {
68
- currentIdx++;
69
- }
65
+ });
66
+ extraNavProp = extraNavProp.concat(contextPath.navigationProperties.slice(visitedNavProps.length));
67
+ // Clean up NavProp -> Owner
68
+ let currentIdx = 0;
69
+ while (extraNavProp.length > 1 && currentIdx != extraNavProp.length - 1) {
70
+ const currentNav = extraNavProp[currentIdx];
71
+ const nextNavProp = extraNavProp[currentIdx + 1];
72
+ if (currentNav.partner === nextNavProp.name) {
73
+ extraNavProp.splice(0, 2);
74
+ } else {
75
+ currentIdx++;
70
76
  }
71
- extraNavProp = extraNavProp.map(navProp => {
72
- return navProp.targetType.navigationProperties.find(np => np.name === navProp.partner) as NavigationProperty;
73
- });
74
- return extraNavProp;
75
77
  }
78
+ extraNavProp = extraNavProp.map(navProp => {
79
+ return navProp.targetType.navigationProperties.find(np => np.name === navProp.partner) as NavigationProperty;
80
+ });
81
+ return extraNavProp;
76
82
  }
77
83
  };
78
84
 
@@ -122,7 +128,8 @@ export const enhanceDataModelPath = function(
122
128
  contextLocation: dataModelObjectPath.contextLocation,
123
129
  targetEntitySet: currentEntitySet,
124
130
  targetEntityType: currentEntityType,
125
- targetObject: oTarget
131
+ targetObject: oTarget,
132
+ convertedTypes: dataModelObjectPath.convertedTypes
126
133
  };
127
134
  };
128
135
 
@@ -217,61 +224,53 @@ export const getContextRelativeTargetObjectPath = function(
217
224
 
218
225
  export const isPathUpdatable = function(
219
226
  dataModelObjectPath: DataModelObjectPath | undefined,
220
- propertyPath?: PropertyOrPath<Property>,
221
- bTableCase?: boolean
227
+ extractionParametersOnPath?: ExtractionParametersOnPath
222
228
  ): Expression<boolean> {
223
229
  return checkOnPath(
224
230
  dataModelObjectPath,
225
231
  (annotationObject: NavigationPropertyRestriction | EntitySetAnnotations_Capabilities) => {
226
232
  return annotationObject?.UpdateRestrictions?.Updatable;
227
233
  },
228
- propertyPath,
229
- bTableCase
234
+ extractionParametersOnPath
230
235
  );
231
236
  };
232
237
 
233
238
  export const isPathSearchable = function(
234
239
  dataModelObjectPath: DataModelObjectPath | undefined,
235
- propertyPath?: PropertyOrPath<Property>,
236
- bTableCase?: boolean
240
+ extractionParametersOnPath?: ExtractionParametersOnPath
237
241
  ): Expression<boolean> {
238
242
  return checkOnPath(
239
243
  dataModelObjectPath,
240
244
  (annotationObject: NavigationPropertyRestriction | EntitySetAnnotations_Capabilities) => {
241
245
  return annotationObject?.SearchRestrictions?.Searchable;
242
246
  },
243
- propertyPath,
244
- bTableCase
247
+ extractionParametersOnPath
245
248
  );
246
249
  };
247
250
 
248
251
  export const isPathDeletable = function(
249
252
  dataModelObjectPath: DataModelObjectPath | undefined,
250
- propertyPath?: PropertyOrPath<Property>,
251
- bTableCase?: boolean
253
+ extractionParametersOnPath?: ExtractionParametersOnPath
252
254
  ): Expression<boolean> {
253
255
  return checkOnPath(
254
256
  dataModelObjectPath,
255
257
  (annotationObject: NavigationPropertyRestriction | EntitySetAnnotations_Capabilities) => {
256
258
  return annotationObject?.DeleteRestrictions?.Deletable;
257
259
  },
258
- propertyPath,
259
- bTableCase
260
+ extractionParametersOnPath
260
261
  );
261
262
  };
262
263
 
263
264
  export const isPathInsertable = function(
264
265
  dataModelObjectPath: DataModelObjectPath | undefined,
265
- propertyPath?: PropertyOrPath<Property>,
266
- bTableCase?: boolean
266
+ extractionParametersOnPath?: ExtractionParametersOnPath
267
267
  ): Expression<boolean> {
268
268
  return checkOnPath(
269
269
  dataModelObjectPath,
270
270
  (annotationObject: NavigationPropertyRestriction | EntitySetAnnotations_Capabilities) => {
271
271
  return annotationObject?.InsertRestrictions?.Insertable;
272
272
  },
273
- propertyPath,
274
- bTableCase
273
+ extractionParametersOnPath
275
274
  );
276
275
  };
277
276
 
@@ -303,13 +302,13 @@ export const checkFilterExpressionRestrictions = function(
303
302
  export const checkOnPath = function(
304
303
  dataModelObjectPath: DataModelObjectPath | undefined,
305
304
  checkFunction: Function,
306
- propertyPath?: PropertyOrPath<Property>,
307
- bTableCase?: boolean
305
+ extractionParametersOnPath?: ExtractionParametersOnPath
308
306
  ): Expression<boolean> {
309
307
  if (!dataModelObjectPath || !dataModelObjectPath.startingEntitySet) {
310
308
  return constant(true);
311
309
  }
312
- dataModelObjectPath = enhanceDataModelPath(dataModelObjectPath, propertyPath);
310
+
311
+ dataModelObjectPath = enhanceDataModelPath(dataModelObjectPath, extractionParametersOnPath?.propertyPath);
313
312
 
314
313
  let currentEntitySet: EntitySet | null = dataModelObjectPath.startingEntitySet;
315
314
  let parentEntitySet: EntitySet | null = null;
@@ -347,11 +346,11 @@ export const checkOnPath = function(
347
346
  });
348
347
 
349
348
  // At this point we have navigated down all the nav prop and we should have
350
- // The target entityset pointing to either null (in case of containment navprop a last part), or the actual target (non containment as target)
351
- // The parent entitySet pointing to the previous entityset used in the path
349
+ // The target entitySet pointing to either null (in case of containment navprop a last part), or the actual target (non containment as target)
350
+ // The parent entitySet pointing to the previous entitySet used in the path
352
351
  // VisitedNavigationPath should contain the path up to this property
353
352
 
354
- // Restrictions should then be evaluated as ParentEntitySet.NavRestrictions[NavpropertyPath] || TargetEntitySet.Restrictions
353
+ // Restrictions should then be evaluated as ParentEntitySet.NavRestrictions[NavPropertyPath] || TargetEntitySet.Restrictions
355
354
  const fullNavigationPath = visitedNavigationPropsName.join("/");
356
355
  let restrictions, visitedNavProps;
357
356
  if (parentEntitySet !== null) {
@@ -364,18 +363,19 @@ export const checkOnPath = function(
364
363
  const _allVisitedNavigationProps = allVisitedNavigationProps.slice(0, -1);
365
364
  if (targetEntitySet !== null) {
366
365
  visitedNavProps = _allVisitedNavigationProps;
366
+ } else if (_allVisitedNavigationProps.length === 0) {
367
+ visitedNavProps = allVisitedNavigationProps.slice(0);
367
368
  } else {
368
- if (_allVisitedNavigationProps.length === 0) {
369
- visitedNavProps = allVisitedNavigationProps.slice(0);
370
- } else {
371
- visitedNavProps = _allVisitedNavigationProps;
372
- }
369
+ visitedNavProps = _allVisitedNavigationProps;
373
370
  }
371
+ const pathRelativeLocation = getPathRelativeLocation(dataModelObjectPath?.contextLocation, visitedNavProps).map(
372
+ np => np.name
373
+ );
374
+ const pathVisitorFunction = extractionParametersOnPath?.pathVisitor
375
+ ? getPathVisitorForSingleton(extractionParametersOnPath.pathVisitor, pathRelativeLocation)
376
+ : undefined; // send pathVisitor function only when it is defined and only send function or defined as a parameter
374
377
  restrictions = equal(
375
- annotationExpression(
376
- restrictionDefinition,
377
- getPathRelativeLocation(dataModelObjectPath?.contextLocation, visitedNavProps).map(np => np.name)
378
- ),
378
+ annotationExpression(restrictionDefinition, pathRelativeLocation, undefined, pathVisitorFunction),
379
379
  true
380
380
  );
381
381
  }
@@ -384,25 +384,34 @@ export const checkOnPath = function(
384
384
  );
385
385
  }
386
386
  let targetRestrictions;
387
- let restrictionDefinition = checkFunction(targetEntitySet?.annotations?.Capabilities);
388
- if (targetEntitySet === null && restrictionDefinition === undefined) {
389
- restrictionDefinition = checkFunction(targetEntityType?.annotations?.Capabilities);
390
- }
391
- if (restrictionDefinition !== undefined) {
392
- targetRestrictions = equal(
393
- annotationExpression(
394
- restrictionDefinition,
395
- getPathRelativeLocation(dataModelObjectPath.contextLocation, allVisitedNavigationProps).map(np => np.name)
396
- ),
397
- true
398
- );
399
- }
400
- // On table case we need to know if restrictions are only set on targetEntity
401
- if (bTableCase && !restrictions && targetRestrictions) {
402
- const oResult: any = {
403
- "currentEntityRestriction": targetRestrictions
404
- };
405
- return oResult;
387
+ if (!extractionParametersOnPath?.ignoreTargetCollection) {
388
+ let restrictionDefinition = checkFunction(targetEntitySet?.annotations?.Capabilities);
389
+ if (targetEntitySet === null && restrictionDefinition === undefined) {
390
+ restrictionDefinition = checkFunction(targetEntityType?.annotations?.Capabilities);
391
+ }
392
+ if (restrictionDefinition !== undefined) {
393
+ const pathRelativeLocation = getPathRelativeLocation(dataModelObjectPath.contextLocation, allVisitedNavigationProps).map(
394
+ np => np.name
395
+ );
396
+ const pathVisitorFunction = extractionParametersOnPath?.pathVisitor
397
+ ? getPathVisitorForSingleton(extractionParametersOnPath.pathVisitor, pathRelativeLocation)
398
+ : undefined;
399
+ targetRestrictions = equal(
400
+ annotationExpression(restrictionDefinition, pathRelativeLocation, undefined, pathVisitorFunction),
401
+ true
402
+ );
403
+ }
406
404
  }
407
- return restrictions || targetRestrictions || constant(true);
405
+
406
+ return (
407
+ restrictions || targetRestrictions || (extractionParametersOnPath?.authorizeUnresolvable ? unresolveableExpression : constant(true))
408
+ );
409
+ };
410
+ // This helper method is used to add relative path location argument to singletonPathVisitorFunction i.e. pathVisitor
411
+ // pathVisitor method is used later to get the correct bindings for singleton entity
412
+ // method is invoked later in bindingExpression() method to get the correct binding.
413
+ const getPathVisitorForSingleton = function(pathVisitor: Function, pathRelativeLocation: string[]) {
414
+ return function(path: string) {
415
+ return pathVisitor(path, pathRelativeLocation);
416
+ };
408
417
  };
@@ -6,7 +6,6 @@ sap.ui.define(["sap/ui/mdc/condition/Condition", "sap/ui/mdc/enum/ConditionValid
6
6
  "use strict";
7
7
 
8
8
  var _exports = {};
9
- var createCondition = Condition.createCondition;
10
9
 
11
10
  function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
12
11
 
@@ -225,36 +224,30 @@ sap.ui.define(["sap/ui/mdc/condition/Condition", "sap/ui/mdc/enum/ConditionValid
225
224
  return aConditions;
226
225
  }
227
226
 
228
- function _buildFiltersConditionsFromSelectOption(oSelectOption, oMetaModel, sEntitySetPath, getCustomConditions) {
229
- var propertyName = oSelectOption.PropertyName,
230
- oFilterConditions = {},
231
- sPropertyName = propertyName.value || propertyName.$PropertyPath,
232
- Ranges = oSelectOption.Ranges;
233
- var sNavigationPropertyName, sTargetPropertyName, aValidProperties;
234
-
235
- if (sPropertyName && sPropertyName.lastIndexOf("/") > -1) {
236
- sNavigationPropertyName = sPropertyName.substring(0, sPropertyName.lastIndexOf("/") + 1);
237
- sTargetPropertyName = sPropertyName.replace(sNavigationPropertyName, "");
238
- aValidProperties = oMetaModel.getObject(sEntitySetPath + "/" + sNavigationPropertyName);
239
- } else {
240
- aValidProperties = oMetaModel.getObject(sEntitySetPath + "/");
241
- sTargetPropertyName = sPropertyName;
242
- }
227
+ function _getProperty(propertyName, metaModel, entitySetPath) {
228
+ var lastSlashIndex = propertyName.lastIndexOf("/");
229
+ var navigationPath = lastSlashIndex > -1 ? propertyName.substring(0, propertyName.lastIndexOf("/") + 1) : "";
230
+ var collection = metaModel.getObject(entitySetPath + "/" + navigationPath);
231
+ return collection === null || collection === void 0 ? void 0 : collection[propertyName.replace(navigationPath, "")];
232
+ }
243
233
 
244
- for (var key in aValidProperties) {
245
- var aConditions = [];
234
+ function _buildFiltersConditionsFromSelectOption(selectOption, metaModel, entitySetPath, getCustomConditions) {
235
+ var propertyName = selectOption.PropertyName,
236
+ filterConditions = {},
237
+ propertyPath = propertyName.value || propertyName.$PropertyPath,
238
+ Ranges = selectOption.Ranges;
246
239
 
247
- if (sTargetPropertyName === key) {
248
- var oValidProperty = aValidProperties[key];
249
- aConditions = (aConditions || []).concat(_buildConditionsFromSelectionRanges(Ranges, oValidProperty, sPropertyName, getCustomConditions));
240
+ var targetProperty = _getProperty(propertyPath, metaModel, entitySetPath);
250
241
 
251
- if (aConditions.length) {
252
- oFilterConditions[sPropertyName] = (oFilterConditions[sPropertyName] || []).concat(aConditions);
253
- }
242
+ if (targetProperty) {
243
+ var conditions = _buildConditionsFromSelectionRanges(Ranges, targetProperty, propertyPath, getCustomConditions);
244
+
245
+ if (conditions.length) {
246
+ filterConditions[propertyPath] = (filterConditions[propertyPath] || []).concat(conditions);
254
247
  }
255
248
  }
256
249
 
257
- return oFilterConditions;
250
+ return filterConditions;
258
251
  }
259
252
 
260
253
  function getFiltersConditionsFromSelectionVariant(sEntitySetPath, oMetaModel, selectionVariant, getCustomConditions) {
@@ -302,12 +295,12 @@ sap.ui.define(["sap/ui/mdc/condition/Condition", "sap/ui/mdc/enum/ConditionValid
302
295
  var oCondition;
303
296
  var sign = Range.Sign;
304
297
  var sOption = Range.Option ? getOperator(Range.Option) : undefined;
305
- var oValue1 = getTypeCompliantValue(Range.Low, oValidProperty.$Type);
306
- var oValue2 = Range.High ? getTypeCompliantValue(Range.High, oValidProperty.$Type) : undefined;
298
+ var oValue1 = getTypeCompliantValue(Range.Low, oValidProperty.$Type || oValidProperty.type);
299
+ var oValue2 = Range.High ? getTypeCompliantValue(Range.High, oValidProperty.$Type || oValidProperty.type) : undefined;
307
300
  var oConditionValues = resolveConditionValues(sOption, oValue1, oValue2, sign);
308
301
 
309
302
  if (oConditionValues) {
310
- oCondition = createCondition(oConditionValues.operator, oConditionValues.values, null, null, ConditionValidated.Validated);
303
+ oCondition = Condition.createCondition(oConditionValues.operator, oConditionValues.values, null, null, ConditionValidated.Validated);
311
304
  }
312
305
 
313
306
  return oCondition;
@@ -326,7 +319,7 @@ sap.ui.define(["sap/ui/mdc/condition/Condition", "sap/ui/mdc/enum/ConditionValid
326
319
 
327
320
  if (defaultFilterValue !== undefined) {
328
321
  var PropertyName = key;
329
- filterConditions[PropertyName] = [createCondition("EQ", [defaultFilterValue], null, null, ConditionValidated.Validated)];
322
+ filterConditions[PropertyName] = [Condition.createCondition("EQ", [defaultFilterValue], null, null, ConditionValidated.Validated)];
330
323
  }
331
324
  }
332
325
  }
@@ -341,7 +334,7 @@ sap.ui.define(["sap/ui/mdc/condition/Condition", "sap/ui/mdc/enum/ConditionValid
341
334
  for (var key in properties) {
342
335
  // currently defaultSemanticDates can support only one entry, we pick the first one directly using 0 index
343
336
  if (defaultSemanticDates[key] && defaultSemanticDates[key][0]) {
344
- filterConditions[key] = [createCondition(defaultSemanticDates[key][0].operator, [], null, null, null)];
337
+ filterConditions[key] = [Condition.createCondition(defaultSemanticDates[key][0].operator, [], null, null, null)];
345
338
  }
346
339
  }
347
340
  }
@@ -351,7 +344,7 @@ sap.ui.define(["sap/ui/mdc/condition/Condition", "sap/ui/mdc/enum/ConditionValid
351
344
 
352
345
  function getEditStatusFilter() {
353
346
  var ofilterConditions = {};
354
- ofilterConditions["$editState"] = [createCondition("DRAFT_EDIT_STATE", ["ALL"], null, null, ConditionValidated.Validated)];
347
+ ofilterConditions["$editState"] = [Condition.createCondition("DRAFT_EDIT_STATE", ["ALL"], null, null, ConditionValidated.Validated)];
355
348
  return ofilterConditions;
356
349
  }
357
350
 
@@ -397,4 +390,4 @@ sap.ui.define(["sap/ui/mdc/condition/Condition", "sap/ui/mdc/enum/ConditionValid
397
390
  getFilterConditions.requiresIContext = true;
398
391
  return _exports;
399
392
  }, false);
400
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkZpbHRlckhlbHBlci50cyJdLCJuYW1lcyI6WyJhVmFsaWRUeXBlcyIsIm9FeGNsdWRlTWFwIiwiX2dldERhdGVUaW1lT2Zmc2V0Q29tcGxpYW50VmFsdWUiLCJzVmFsdWUiLCJvVmFsdWUiLCJtYXRjaCIsImluZGV4T2YiLCJsZW5ndGgiLCJzcGxpdCIsInVuZGVmaW5lZCIsIl9nZXREYXRlQ29tcGxpYW50VmFsdWUiLCJnZXRUeXBlQ29tcGxpYW50VmFsdWUiLCJzVHlwZSIsImlzTmFOIiwicGFyc2VGbG9hdCIsInBhcnNlSW50IiwicmVzb2x2ZUNvbmRpdGlvblZhbHVlcyIsInNPcHRpb24iLCJvVjEiLCJvVjIiLCJzU2lnbiIsIm9WYWx1ZTIiLCJzSW50ZXJuYWxPcGVyYXRpb24iLCJvQ29uZGl0aW9uIiwidmFsdWVzIiwiaXNFbXB0eSIsIm5JbmRleE9mIiwibkxhc3RJbmRleCIsImxhc3RJbmRleE9mIiwic3Vic3RyaW5nIiwib3BlcmF0b3IiLCJwdXNoIiwiZ2V0T3BlcmF0b3IiLCJzT3BlcmF0b3IiLCJfYnVpbGRDb25kaXRpb25zRnJvbVNlbGVjdGlvblJhbmdlcyIsIlJhbmdlcyIsIm9Qcm9wZXJ0eSIsInNQcm9wZXJ0eU5hbWUiLCJnZXRDdXN0b21Db25kaXRpb25zIiwiYUNvbmRpdGlvbnMiLCJmb3JFYWNoIiwiUmFuZ2UiLCJnZXRDb25kaXRpb25zIiwiX2J1aWxkRmlsdGVyc0NvbmRpdGlvbnNGcm9tU2VsZWN0T3B0aW9uIiwib1NlbGVjdE9wdGlvbiIsIm9NZXRhTW9kZWwiLCJzRW50aXR5U2V0UGF0aCIsInByb3BlcnR5TmFtZSIsIlByb3BlcnR5TmFtZSIsIm9GaWx0ZXJDb25kaXRpb25zIiwidmFsdWUiLCIkUHJvcGVydHlQYXRoIiwic05hdmlnYXRpb25Qcm9wZXJ0eU5hbWUiLCJzVGFyZ2V0UHJvcGVydHlOYW1lIiwiYVZhbGlkUHJvcGVydGllcyIsInJlcGxhY2UiLCJnZXRPYmplY3QiLCJrZXkiLCJvVmFsaWRQcm9wZXJ0eSIsImNvbmNhdCIsImdldEZpbHRlcnNDb25kaXRpb25zRnJvbVNlbGVjdGlvblZhcmlhbnQiLCJzZWxlY3Rpb25WYXJpYW50IiwiYVNlbGVjdE9wdGlvbnMiLCJTZWxlY3RPcHRpb25zIiwiYVBhcmFtZXRlcnMiLCJQYXJhbWV0ZXJzIiwic2VsZWN0T3B0aW9uIiwiT2JqZWN0Iiwia2V5cyIsImluY2x1ZGVzIiwicGFyYW1ldGVyIiwic1Byb3BlcnR5UGF0aCIsInZhbHVlMSIsIlByb3BlcnR5VmFsdWUiLCJ2YWx1ZTIiLCJwYXRoIiwiaXNQYXJhbWV0ZXIiLCJ2YWxpZGF0ZWQiLCJDb25kaXRpb25WYWxpZGF0ZWQiLCJWYWxpZGF0ZWQiLCJzaWduIiwiU2lnbiIsIk9wdGlvbiIsIm9WYWx1ZTEiLCJMb3ciLCIkVHlwZSIsIkhpZ2giLCJvQ29uZGl0aW9uVmFsdWVzIiwiY3JlYXRlQ29uZGl0aW9uIiwiZ2V0RGVmYXVsdFZhbHVlRmlsdGVycyIsIm9Db250ZXh0IiwicHJvcGVydGllcyIsImZpbHRlckNvbmRpdGlvbnMiLCJlbnRpdHlTZXRQYXRoIiwiZ2V0SW50ZXJmYWNlIiwiZ2V0UGF0aCIsImdldE1vZGVsIiwiZGVmYXVsdEZpbHRlclZhbHVlIiwiZ2V0RGVmYXVsdFNlbWFudGljRGF0ZUZpbHRlcnMiLCJkZWZhdWx0U2VtYW50aWNEYXRlcyIsImdldEVkaXRTdGF0dXNGaWx0ZXIiLCJvZmlsdGVyQ29uZGl0aW9ucyIsImdldEZpbHRlckNvbmRpdGlvbnMiLCJlZGl0U3RhdGVGaWx0ZXIiLCJlbnRpdHlUeXBlQW5ub3RhdGlvbnMiLCJlbnRpdHlUeXBlUHJvcGVydGllcyIsImRlZmF1bHRGaWx0ZXJzIiwiZGVmYXVsdFNlbWFudGljRGF0ZUZpbHRlcnMiLCJKU09OIiwic3RyaW5naWZ5IiwicmVxdWlyZXNJQ29udGV4dCJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7OztBQVNBLE1BQU1BLFdBQVcsR0FBRyxDQUNuQixhQURtQixFQUVuQixVQUZtQixFQUduQixVQUhtQixF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RUFBc0QsTUFBdEQsQ0FBM0MsR0FBMkc5QyxTQUFuSDtBQUNBOzs7QUFFRDZGLEVBQUFBLG1CQUFtQixDQUFDUSxnQkFBcEIsR0FBdUMsSUFBdkMiLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNlbGVjdE9wdGlvblR5cGUsIFNlbGVjdGlvblZhcmlhbnRUeXBlVHlwZXMsIFNlbGVjdGlvblJhbmdlVHlwZVR5cGVzIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL2Rpc3QvZ2VuZXJhdGVkL1VJXCI7XG5pbXBvcnQgeyBjcmVhdGVDb25kaXRpb24gfSBmcm9tIFwic2FwL3VpL21kYy9jb25kaXRpb24vQ29uZGl0aW9uXCI7XG5pbXBvcnQgQ29uZGl0aW9uVmFsaWRhdGVkIGZyb20gXCJzYXAvdWkvbWRjL2VudW0vQ29uZGl0aW9uVmFsaWRhdGVkXCI7XG5pbXBvcnQgT0RhdGFNZXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1ldGFNb2RlbFwiO1xuZXhwb3J0IHR5cGUgRmlsdGVyQ29uZGl0aW9ucyA9IHtcblx0b3BlcmF0b3I6IHN0cmluZztcblx0dmFsdWVzOiBBcnJheTxzdHJpbmc+O1xuXHRpc0VtcHR5PzogYm9vbGVhbiB8IG51bGw7XG5cdHZhbGlkYXRlZD86IHN0cmluZztcbn07XG5cbmNvbnN0IGFWYWxpZFR5cGVzID0gW1xuXHRcIkVkbS5Cb29sZWFuXCIsXG5cdFwiRWRtLkJ5dGVcIixcblx0XCJFZG0uRGF0ZVwiLFxuXHRcIkVkbS5EYXRlVGltZVwiLFxuXHRcIkVkbS5EYXRlVGltZU9mZnNldFwiLFxuXHRcIkVkbS5EZWNpbWFsXCIsXG5cdFwiRWRtLkRvdWJsZVwiLFxuXHRcIkVkbS5GbG9hdFwiLFxuXHRcIkVkbS5HdWlkXCIsXG5cdFwiRWRtLkludDE2XCIsXG5cdFwiRWRtLkludDMyXCIsXG5cdFwiRWRtLkludDY0XCIsXG5cdFwiRWRtLlNCeXRlXCIsXG5cdFwiRWRtLlNpbmdsZVwiLFxuXHRcIkVkbS5TdHJpbmdcIixcblx0XCJFZG0uVGltZVwiLFxuXHRcIkVkbS5UaW1lT2ZEYXlcIlxuXTtcblxuY29uc3Qgb0V4Y2x1ZGVNYXA6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7XG5cdFwiQ29udGFpbnNcIjogXCJOb3RDb250YWluc1wiLFxuXHRcIlN0YXJ0c1dpdGhcIjogXCJOb3RTdGFydHNXaXRoXCIsXG5cdFwiRW5kc1dpdGhcIjogXCJOb3RFbmRzV2l0aFwiLFxuXHRcIkVtcHR5XCI6IFwiTm90RW1wdHlcIixcblx0XCJOb3RFbXB0eVwiOiBcIkVtcHR5XCIsXG5cdFwiTEVcIjogXCJOT1RMRVwiLFxuXHRcIkdFXCI6IFwiTk9UR0VcIixcblx0XCJMVFwiOiBcIk5PVExUXCIsXG5cdFwiR1RcIjogXCJOT1RHVFwiLFxuXHRcIkJUXCI6IFwiTk9UQlRcIixcblx0XCJORVwiOiBcIkVRXCIsXG5cdFwiRVFcIjogXCJORVwiXG59O1xuXG5leHBvcnQgZnVuY3Rpb24gX2dldERhdGVUaW1lT2Zmc2V0Q29tcGxpYW50VmFsdWUoc1ZhbHVlOiBhbnkpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRsZXQgb1ZhbHVlO1xuXHRpZiAoc1ZhbHVlLm1hdGNoKC9eKFxcZHs0fSktKFxcZHsxLDJ9KS0oXFxkezEsMn0pVChcXGR7MSwyfSk6KFxcZHsxLDJ9KTooXFxkezEsMn0pXFwrKFxcZHsxLDR9KS8pKSB7XG5cdFx0b1ZhbHVlID0gc1ZhbHVlLm1hdGNoKC9eKFxcZHs0fSktKFxcZHsxLDJ9KS0oXFxkezEsMn0pVChcXGR7MSwyfSk6KFxcZHsxLDJ9KTooXFxkezEsMn0pXFwrKFxcZHsxLDR9KS8pWzBdO1xuXHR9IGVsc2UgaWYgKHNWYWx1ZS5tYXRjaCgvXihcXGR7NH0pLShcXGR7MSwyfSktKFxcZHsxLDJ9KVQoXFxkezEsMn0pOihcXGR7MSwyfSk6KFxcZHsxLDJ9KS8pKSB7XG5cdFx0b1ZhbHVlID0gc1ZhbHVlLm1hdGNoKC9eKFxcZHs0fSktKFxcZHsxLDJ9KS0oXFxkezEsMn0pVChcXGR7MSwyfSk6KFxcZHsxLDJ9KTooXFxkezEsMn0pLylbMF0gKyBcIiswMDAwXCI7XG5cdH0gZWxzZSBpZiAoc1ZhbHVlLm1hdGNoKC9eKFxcZHs0fSktKFxcZHsxLDJ9KS0oXFxkezEsMn0pLykpIHtcblx0XHRvVmFsdWUgPSBzVmFsdWUubWF0Y2goL14oXFxkezR9KS0oXFxkezEsMn0pLShcXGR7MSwyfSkvKVswXSArIFwiVDAwOjAwOjAwKzAwMDBcIjtcblx0fSBlbHNlIGlmIChzVmFsdWUuaW5kZXhPZihcIlpcIikgPT09IHNWYWx1ZS5sZW5ndGggLSAxKSB7XG5cdFx0b1ZhbHVlID0gc1ZhbHVlLnNwbGl0KFwiWlwiKVswXSArIFwiKzAxMDBcIjtcblx0fSBlbHNlIHtcblx0XHRvVmFsdWUgPSB1bmRlZmluZWQ7XG5cdH1cblx0cmV0dXJuIG9WYWx1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9nZXREYXRlQ29tcGxpYW50VmFsdWUoc1ZhbHVlOiBhbnkpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRyZXR1cm4gc1ZhbHVlLm1hdGNoKC9eKFxcZHs0fSktKFxcZHsxLDJ9KS0oXFxkezEsMn0pLylcblx0XHQ/IHNWYWx1ZS5tYXRjaCgvXihcXGR7NH0pLShcXGR7MSwyfSktKFxcZHsxLDJ9KS8pWzBdXG5cdFx0OiBzVmFsdWUubWF0Y2goL14oXFxkezh9KS8pICYmIHNWYWx1ZS5tYXRjaCgvXihcXGR7OH0pLylbMF07XG59XG5cbi8qKlxuICogTWV0aG9kIHRvIGdldCB0aGUgY29tcGxpYW50IHZhbHVlIHR5cGUgYmFzZWQgb24gdGhlIGRhdGEgdHlwZS5cbiAqXG4gKiBAcGFyYW0gIHNWYWx1ZSBSYXcgdmFsdWVcbiAqIEBwYXJhbSAgc1R5cGUgVGhlIHByb3BlcnR5IHR5cGVcbiAqIEByZXR1cm5zIFZhbHVlIHRvIGJlIHByb3BhZ2F0ZWQgdG8gdGhlIGNvbmRpdGlvbi5cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VHlwZUNvbXBsaWFudFZhbHVlKHNWYWx1ZTogYW55LCBzVHlwZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0bGV0IG9WYWx1ZTtcblx0aWYgKGFWYWxpZFR5cGVzLmluZGV4T2Yoc1R5cGUpID09PSAtMSkge1xuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblx0b1ZhbHVlID0gc1ZhbHVlO1xuXHRzd2l0Y2ggKHNUeXBlKSB7XG5cdFx0Y2FzZSBcIkVkbS5Cb29sZWFuXCI6XG5cdFx0XHRvVmFsdWUgPSBzVmFsdWUgPT09IFwidHJ1ZVwiIHx8IChzVmFsdWUgPT09IFwiZmFsc2VcIiA/IGZhbHNlIDogdW5kZWZpbmVkKTtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgXCJFZG0uRG91YmxlXCI6XG5cdFx0Y2FzZSBcIkVkbS5TaW5nbGVcIjpcblx0XHRcdG9WYWx1ZSA9IGlzTmFOKHNWYWx1ZSkgPyB1bmRlZmluZWQgOiBwYXJzZUZsb2F0KHNWYWx1ZSk7XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIFwiRWRtLkJ5dGVcIjpcblx0XHRjYXNlIFwiRWRtLkludDE2XCI6XG5cdFx0Y2FzZSBcIkVkbS5JbnQzMlwiOlxuXHRcdGNhc2UgXCJFZG0uU0J5dGVcIjpcblx0XHRcdG9WYWx1ZSA9IGlzTmFOKHNWYWx1ZSkgPyB1bmRlZmluZWQgOiBwYXJzZUludChzVmFsdWUsIDEwKTtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgXCJFZG0uRGF0ZVwiOlxuXHRcdFx0b1ZhbHVlID0gX2dldERhdGVDb21wbGlhbnRWYWx1ZShzVmFsdWUpO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSBcIkVkbS5EYXRlVGltZU9mZnNldFwiOlxuXHRcdFx0b1ZhbHVlID0gX2dldERhdGVUaW1lT2Zmc2V0Q29tcGxpYW50VmFsdWUoc1ZhbHVlKTtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgXCJFZG0uVGltZU9mRGF5XCI6XG5cdFx0XHRvVmFsdWUgPSBzVmFsdWUubWF0Y2goLyhcXGR7MSwyfSk6KFxcZHsxLDJ9KTooXFxkezEsMn0pLykgPyBzVmFsdWUubWF0Y2goLyhcXGR7MSwyfSk6KFxcZHsxLDJ9KTooXFxkezEsMn0pLylbMF0gOiB1bmRlZmluZWQ7XG5cdFx0XHRicmVhaztcblx0XHRkZWZhdWx0OlxuXHR9XG5cblx0cmV0dXJuIG9WYWx1ZSA9PT0gbnVsbCA/IHVuZGVmaW5lZCA6IG9WYWx1ZTtcbn1cblxuLyoqXG4gKiBNZXRob2QgdG8gY3JlYXRlIGEgY29uZGl0aW9uLlxuICogQHBhcmFtICBzT3B0aW9uIE9wZXJhdG9yIHRvIGJlIHVzZWQuXG4gKiBAcGFyYW0gIG9WMSBMb3dlciB2YWx1ZVxuICogQHBhcmFtICBvVjIgSGlnaGVyIHZhbHVlXG4gKiBAcGFyYW0gc1NpZ25cbiAqIEByZXR1cm5zIENvbmRpdGlvbiB0byBiZSBjcmVhdGVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlQ29uZGl0aW9uVmFsdWVzKHNPcHRpb246IHN0cmluZyB8IHVuZGVmaW5lZCwgb1YxOiBhbnksIG9WMjogYW55LCBzU2lnbjogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG5cdGxldCBvVmFsdWUgPSBvVjEsXG5cdFx0b1ZhbHVlMixcblx0XHRzSW50ZXJuYWxPcGVyYXRpb246IGFueTtcblx0Y29uc3Qgb0NvbmRpdGlvbjogUmVjb3JkPHN0cmluZywgRmlsdGVyQ29uZGl0aW9uc1tdPiA9IHt9O1xuXHRvQ29uZGl0aW9uLnZhbHVlcyA9IFtdO1xuXHRvQ29uZGl0aW9uLmlzRW1wdHkgPSBudWxsIGFzIGFueTtcblx0aWYgKG9WMSA9PT0gdW5kZWZpbmVkIHx8IG9WMSA9PT0gbnVsbCkge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdHN3aXRjaCAoc09wdGlvbikge1xuXHRcdGNhc2UgXCJDUFwiOlxuXHRcdFx0c0ludGVybmFsT3BlcmF0aW9uID0gXCJDb250YWluc1wiO1xuXHRcdFx0aWYgKG9WYWx1ZSkge1xuXHRcdFx0XHRjb25zdCBuSW5kZXhPZiA9IG9WYWx1ZS5pbmRleE9mKFwiKlwiKTtcblx0XHRcdFx0Y29uc3Qgbkxhc3RJbmRleCA9IG9WYWx1ZS5sYXN0SW5kZXhPZihcIipcIik7XG5cblx0XHRcdFx0Ly8gb25seSB3aGVuIHRoZXJlIGFyZSAnKicgYXQgYWxsXG5cdFx0XHRcdGlmIChuSW5kZXhPZiA+IC0xKSB7XG5cdFx0XHRcdFx0aWYgKG5JbmRleE9mID09PSAwICYmIG5MYXN0SW5kZXggIT09IG9WYWx1ZS5sZW5ndGggLSAxKSB7XG5cdFx0XHRcdFx0XHRzSW50ZXJuYWxPcGVyYXRpb24gPSBcIkVuZHNXaXRoXCI7XG5cdFx0XHRcdFx0XHRvVmFsdWUgPSBvVmFsdWUuc3Vic3RyaW5nKDEsIG9WYWx1ZS5sZW5ndGgpO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAobkluZGV4T2YgIT09IDAgJiYgbkxhc3RJbmRleCA9PT0gb1ZhbHVlLmxlbmd0aCAtIDEpIHtcblx0XHRcdFx0XHRcdHNJbnRlcm5hbE9wZXJhdGlvbiA9IFwiU3RhcnRzV2l0aFwiO1xuXHRcdFx0XHRcdFx0b1ZhbHVlID0gb1ZhbHVlLnN1YnN0cmluZygwLCBvVmFsdWUubGVuZ3RoIC0gMSk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdG9WYWx1ZSA9IG9WYWx1ZS5zdWJzdHJpbmcoMSwgb1ZhbHVlLmxlbmd0aCAtIDEpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvKiBUT0RPIEFkZCBkaWFnb25vc3RpY3MgTG9nLndhcm5pbmcoXCJDb250YWlucyBPcHRpb24gY2Fubm90IGJlIHVzZWQgd2l0aG91dCAnKicuXCIpICovXG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIFwiRVFcIjpcblx0XHRcdHNJbnRlcm5hbE9wZXJhdGlvbiA9IG9WMSA9PT0gXCJcIiA/IFwiRW1wdHlcIiA6IHNPcHRpb247XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIFwiTkVcIjpcblx0XHRcdHNJbnRlcm5hbE9wZXJhdGlvbiA9IG9WMSA9PT0gXCJcIiA/IFwiTm90RW1wdHlcIiA6IHNPcHRpb247XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIFwiQlRcIjpcblx0XHRcdGlmIChvVjIgPT09IHVuZGVmaW5lZCB8fCBvVjIgPT09IG51bGwpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0b1ZhbHVlMiA9IG9WMjtcblx0XHRcdHNJbnRlcm5hbE9wZXJhdGlvbiA9IHNPcHRpb247XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIFwiTEVcIjpcblx0XHRjYXNlIFwiR0VcIjpcblx0XHRjYXNlIFwiR1RcIjpcblx0XHRjYXNlIFwiTFRcIjpcblx0XHRcdHNJbnRlcm5hbE9wZXJhdGlvbiA9IHNPcHRpb247XG5cdFx0XHRicmVhaztcblx0XHRkZWZhdWx0OlxuXHRcdFx0LyogVE9ETyBBZGQgZGlhZ29ub3N0aWNzIExvZy53YXJuaW5nKFwiU2VsZWN0aW9uIE9wdGlvbiBpcyBub3Qgc3VwcG9ydGVkIDogJ1wiICsgc09wdGlvbiArIFwiJ1wiKTsgKi9cblx0XHRcdHJldHVybjtcblx0fVxuXHRpZiAoc1NpZ24gPT09IFwiRVwiKSB7XG5cdFx0c0ludGVybmFsT3BlcmF0aW9uID0gb0V4Y2x1ZGVNYXBbc0ludGVybmFsT3BlcmF0aW9uXTtcblx0fVxuXHRvQ29uZGl0aW9uLm9wZXJhdG9yID0gc0ludGVybmFsT3BlcmF0aW9uO1xuXHRpZiAoc0ludGVybmFsT3BlcmF0aW9uICE9PSBcIkVtcHR5XCIpIHtcblx0XHRvQ29uZGl0aW9uLnZhbHVlcy5wdXNoKG9WYWx1ZSk7XG5cdFx0aWYgKG9WYWx1ZTIpIHtcblx0XHRcdG9Db25kaXRpb24udmFsdWVzLnB1c2gob1ZhbHVlMik7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBvQ29uZGl0aW9uO1xufVxuXG4vKiBNZXRob2QgdG8gZ2V0IHRoZSBvcGVyYXRvciBmcm9tIHRoZSBTZWxlY3Rpb24gT3B0aW9uICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0T3BlcmF0b3Ioc09wZXJhdG9yOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRyZXR1cm4gc09wZXJhdG9yLmluZGV4T2YoXCIvXCIpID4gMCA/IHNPcGVyYXRvci5zcGxpdChcIi9cIilbMV0gOiBzT3BlcmF0b3I7XG59XG5cbmZ1bmN0aW9uIF9idWlsZENvbmRpdGlvbnNGcm9tU2VsZWN0aW9uUmFuZ2VzKFxuXHRSYW5nZXM6IFNlbGVjdGlvblJhbmdlVHlwZVR5cGVzW10sXG5cdG9Qcm9wZXJ0eTogUmVjb3JkPHN0cmluZywgb2JqZWN0Pixcblx0c1Byb3BlcnR5TmFtZTogc3RyaW5nLFxuXHRnZXRDdXN0b21Db25kaXRpb25zPzogRnVuY3Rpb25cbik6IGFueVtdIHtcblx0Y29uc3QgYUNvbmRpdGlvbnM6IGFueVtdID0gW107XG5cdFJhbmdlcz8uZm9yRWFjaCgoUmFuZ2U6IGFueSkgPT4ge1xuXHRcdGNvbnN0IG9Db25kaXRpb24gPSBnZXRDdXN0b21Db25kaXRpb25zID8gZ2V0Q3VzdG9tQ29uZGl0aW9ucyhSYW5nZSwgb1Byb3BlcnR5LCBzUHJvcGVydHlOYW1lKSA6IGdldENvbmRpdGlvbnMoUmFuZ2UsIG9Qcm9wZXJ0eSk7XG5cdFx0aWYgKG9Db25kaXRpb24pIHtcblx0XHRcdGFDb25kaXRpb25zLnB1c2gob0NvbmRpdGlvbik7XG5cdFx0fVxuXHR9KTtcblx0cmV0dXJuIGFDb25kaXRpb25zO1xufVxuXG5mdW5jdGlvbiBfYnVpbGRGaWx0ZXJzQ29uZGl0aW9uc0Zyb21TZWxlY3RPcHRpb24oXG5cdG9TZWxlY3RPcHRpb246IFNlbGVjdE9wdGlvblR5cGUsXG5cdG9NZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsLFxuXHRzRW50aXR5U2V0UGF0aDogc3RyaW5nLFxuXHRnZXRDdXN0b21Db25kaXRpb25zPzogRnVuY3Rpb25cbik6IFJlY29yZDxzdHJpbmcsIEZpbHRlckNvbmRpdGlvbnNbXT4ge1xuXHRjb25zdCBwcm9wZXJ0eU5hbWU6IGFueSA9IG9TZWxlY3RPcHRpb24uUHJvcGVydHlOYW1lLFxuXHRcdG9GaWx0ZXJDb25kaXRpb25zOiBSZWNvcmQ8c3RyaW5nLCBGaWx0ZXJDb25kaXRpb25zW10+ID0ge30sXG5cdFx0c1Byb3BlcnR5TmFtZTogc3RyaW5nID0gcHJvcGVydHlOYW1lLnZhbHVlIHx8IHByb3BlcnR5TmFtZS4kUHJvcGVydHlQYXRoLFxuXHRcdFJhbmdlczogU2VsZWN0aW9uUmFuZ2VUeXBlVHlwZXNbXSA9IG9TZWxlY3RPcHRpb24uUmFuZ2VzO1xuXHRsZXQgc05hdmlnYXRpb25Qcm9wZXJ0eU5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCwgc1RhcmdldFByb3BlcnR5TmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkLCBhVmFsaWRQcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBvYmplY3Q+O1xuXHRpZiAoc1Byb3BlcnR5TmFtZSAmJiBzUHJvcGVydHlOYW1lLmxhc3RJbmRleE9mKFwiL1wiKSA+IC0xKSB7XG5cdFx0c05hdmlnYXRpb25Qcm9wZXJ0eU5hbWUgPSBzUHJvcGVydHlOYW1lLnN1YnN0cmluZygwLCBzUHJvcGVydHlOYW1lLmxhc3RJbmRleE9mKFwiL1wiKSArIDEpO1xuXHRcdHNUYXJnZXRQcm9wZXJ0eU5hbWUgPSBzUHJvcGVydHlOYW1lLnJlcGxhY2Uoc05hdmlnYXRpb25Qcm9wZXJ0eU5hbWUsIFwiXCIpO1xuXHRcdGFWYWxpZFByb3BlcnRpZXMgPSBvTWV0YU1vZGVsLmdldE9iamVjdChzRW50aXR5U2V0UGF0aCArIFwiL1wiICsgc05hdmlnYXRpb25Qcm9wZXJ0eU5hbWUpO1xuXHR9IGVsc2Uge1xuXHRcdGFWYWxpZFByb3BlcnRpZXMgPSBvTWV0YU1vZGVsLmdldE9iamVjdChzRW50aXR5U2V0UGF0aCArIFwiL1wiKTtcblx0XHRzVGFyZ2V0UHJvcGVydHlOYW1lID0gc1Byb3BlcnR5TmFtZTtcblx0fVxuXHRmb3IgKGNvbnN0IGtleSBpbiBhVmFsaWRQcm9wZXJ0aWVzKSB7XG5cdFx0bGV0IGFDb25kaXRpb25zOiBhbnlbXSA9IFtdO1xuXHRcdGlmIChzVGFyZ2V0UHJvcGVydHlOYW1lID09PSBrZXkpIHtcblx0XHRcdGNvbnN0IG9WYWxpZFByb3BlcnR5ID0gYVZhbGlkUHJvcGVydGllc1trZXldIGFzIGFueTtcblx0XHRcdGFDb25kaXRpb25zID0gKGFDb25kaXRpb25zIHx8IFtdKS5jb25jYXQoXG5cdFx0XHRcdF9idWlsZENvbmRpdGlvbnNGcm9tU2VsZWN0aW9uUmFuZ2VzKFJhbmdlcywgb1ZhbGlkUHJvcGVydHksIHNQcm9wZXJ0eU5hbWUsIGdldEN1c3RvbUNvbmRpdGlvbnMpXG5cdFx0XHQpO1xuXHRcdFx0aWYgKGFDb25kaXRpb25zLmxlbmd0aCkge1xuXHRcdFx0XHRvRmlsdGVyQ29uZGl0aW9uc1tzUHJvcGVydHlOYW1lXSA9IChvRmlsdGVyQ29uZGl0aW9uc1tzUHJvcGVydHlOYW1lXSB8fCBbXSkuY29uY2F0KGFDb25kaXRpb25zKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0cmV0dXJuIG9GaWx0ZXJDb25kaXRpb25zO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RmlsdGVyc0NvbmRpdGlvbnNGcm9tU2VsZWN0aW9uVmFyaWFudChcblx0c0VudGl0eVNldFBhdGg6IHN0cmluZyxcblx0b01ldGFNb2RlbDogT0RhdGFNZXRhTW9kZWwsXG5cdHNlbGVjdGlvblZhcmlhbnQ6IFNlbGVjdGlvblZhcmlhbnRUeXBlVHlwZXMsXG5cdGdldEN1c3RvbUNvbmRpdGlvbnM/OiBGdW5jdGlvblxuKTogUmVjb3JkPHN0cmluZywgRmlsdGVyQ29uZGl0aW9uc1tdPiB7XG5cdGxldCBvRmlsdGVyQ29uZGl0aW9uczogUmVjb3JkPHN0cmluZywgRmlsdGVyQ29uZGl0aW9uc1tdPiA9IHt9O1xuXHRpZiAoIXNlbGVjdGlvblZhcmlhbnQpIHtcblx0XHRyZXR1cm4gb0ZpbHRlckNvbmRpdGlvbnM7XG5cdH1cblx0Y29uc3QgYVNlbGVjdE9wdGlvbnMgPSBzZWxlY3Rpb25WYXJpYW50LlNlbGVjdE9wdGlvbnMsXG5cdFx0YVBhcmFtZXRlcnMgPSBzZWxlY3Rpb25WYXJpYW50LlBhcmFtZXRlcnM7XG5cdGFTZWxlY3RPcHRpb25zPy5mb3JFYWNoKChzZWxlY3RPcHRpb246IFNlbGVjdE9wdGlvblR5cGUpID0+IHtcblx0XHRjb25zdCBwcm9wZXJ0eU5hbWU6IGFueSA9IHNlbGVjdE9wdGlvbi5Qcm9wZXJ0eU5hbWUsXG5cdFx0XHRzUHJvcGVydHlOYW1lOiBzdHJpbmcgPSBwcm9wZXJ0eU5hbWUudmFsdWUgfHwgcHJvcGVydHlOYW1lLiRQcm9wZXJ0eVBhdGg7XG5cdFx0aWYgKE9iamVjdC5rZXlzKG9GaWx0ZXJDb25kaXRpb25zKS5pbmNsdWRlcyhzUHJvcGVydHlOYW1lKSkge1xuXHRcdFx0b0ZpbHRlckNvbmRpdGlvbnNbc1Byb3BlcnR5TmFtZV0gPSBvRmlsdGVyQ29uZGl0aW9uc1tzUHJvcGVydHlOYW1lXS5jb25jYXQoXG5cdFx0XHRcdF9idWlsZEZpbHRlcnNDb25kaXRpb25zRnJvbVNlbGVjdE9wdGlvbihzZWxlY3RPcHRpb24sIG9NZXRhTW9kZWwsIHNFbnRpdHlTZXRQYXRoLCBnZXRDdXN0b21Db25kaXRpb25zKVtzUHJvcGVydHlOYW1lXVxuXHRcdFx0KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0b0ZpbHRlckNvbmRpdGlvbnMgPSB7XG5cdFx0XHRcdC4uLm9GaWx0ZXJDb25kaXRpb25zLFxuXHRcdFx0XHQuLi5fYnVpbGRGaWx0ZXJzQ29uZGl0aW9uc0Zyb21TZWxlY3RPcHRpb24oc2VsZWN0T3B0aW9uLCBvTWV0YU1vZGVsLCBzRW50aXR5U2V0UGF0aCwgZ2V0Q3VzdG9tQ29uZGl0aW9ucylcblx0XHRcdH07XG5cdFx0fVxuXHR9KTtcblx0YVBhcmFtZXRlcnM/LmZvckVhY2goKHBhcmFtZXRlcjogYW55KSA9PiB7XG5cdFx0Y29uc3Qgc1Byb3BlcnR5UGF0aCA9IHBhcmFtZXRlci5Qcm9wZXJ0eU5hbWUudmFsdWUgfHwgcGFyYW1ldGVyLlByb3BlcnR5TmFtZS4kUHJvcGVydHlQYXRoO1xuXHRcdGNvbnN0IG9Db25kaXRpb246IGFueSA9IGdldEN1c3RvbUNvbmRpdGlvbnNcblx0XHRcdD8geyBvcGVyYXRvcjogXCJFUVwiLCB2YWx1ZTE6IHBhcmFtZXRlci5Qcm9wZXJ0eVZhbHVlLCB2YWx1ZTI6IG51bGwsIHBhdGg6IHNQcm9wZXJ0eVBhdGgsIGlzUGFyYW1ldGVyOiB0cnVlIH1cblx0XHRcdDoge1xuXHRcdFx0XHRcdG9wZXJhdG9yOiBcIkVRXCIsXG5cdFx0XHRcdFx0dmFsdWVzOiBbcGFyYW1ldGVyLlByb3BlcnR5VmFsdWVdLFxuXHRcdFx0XHRcdGlzRW1wdHk6IG51bGwsXG5cdFx0XHRcdFx0dmFsaWRhdGVkOiBDb25kaXRpb25WYWxpZGF0ZWQuVmFsaWRhdGVkLFxuXHRcdFx0XHRcdGlzUGFyYW1ldGVyOiB0cnVlXG5cdFx0XHQgIH07XG5cdFx0b0ZpbHRlckNvbmRpdGlvbnNbc1Byb3BlcnR5UGF0aF0gPSBbb0NvbmRpdGlvbl07XG5cdH0pO1xuXG5cdHJldHVybiBvRmlsdGVyQ29uZGl0aW9ucztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldENvbmRpdGlvbnMoUmFuZ2U6IGFueSwgb1ZhbGlkUHJvcGVydHk6IGFueSkge1xuXHRsZXQgb0NvbmRpdGlvbjtcblx0Y29uc3Qgc2lnbjogc3RyaW5nIHwgdW5kZWZpbmVkID0gUmFuZ2UuU2lnbjtcblx0Y29uc3Qgc09wdGlvbjogc3RyaW5nIHwgdW5kZWZpbmVkID0gUmFuZ2UuT3B0aW9uID8gZ2V0T3BlcmF0b3IoUmFuZ2UuT3B0aW9uKSA6IHVuZGVmaW5lZDtcblx0Y29uc3Qgb1ZhbHVlMTogYW55ID0gZ2V0VHlwZUNvbXBsaWFudFZhbHVlKFJhbmdlLkxvdywgb1ZhbGlkUHJvcGVydHkuJFR5cGUpO1xuXHRjb25zdCBvVmFsdWUyOiBhbnkgPSBSYW5nZS5IaWdoID8gZ2V0VHlwZUNvbXBsaWFudFZhbHVlKFJhbmdlLkhpZ2gsIG9WYWxpZFByb3BlcnR5LiRUeXBlKSA6IHVuZGVmaW5lZDtcblx0Y29uc3Qgb0NvbmRpdGlvblZhbHVlcyA9IHJlc29sdmVDb25kaXRpb25WYWx1ZXMoc09wdGlvbiwgb1ZhbHVlMSwgb1ZhbHVlMiwgc2lnbikgYXMgYW55O1xuXHRpZiAob0NvbmRpdGlvblZhbHVlcykge1xuXHRcdG9Db25kaXRpb24gPSBjcmVhdGVDb25kaXRpb24ob0NvbmRpdGlvblZhbHVlcy5vcGVyYXRvciwgb0NvbmRpdGlvblZhbHVlcy52YWx1ZXMsIG51bGwsIG51bGwsIENvbmRpdGlvblZhbGlkYXRlZC5WYWxpZGF0ZWQpO1xuXHR9XG5cdHJldHVybiBvQ29uZGl0aW9uO1xufVxuXG5jb25zdCBnZXREZWZhdWx0VmFsdWVGaWx0ZXJzID0gZnVuY3Rpb24ob0NvbnRleHQ6IGFueSwgcHJvcGVydGllczogYW55KTogUmVjb3JkPHN0cmluZywgRmlsdGVyQ29uZGl0aW9uc1tdPiB7XG5cdGNvbnN0IGZpbHRlckNvbmRpdGlvbnM6IFJlY29yZDxzdHJpbmcsIEZpbHRlckNvbmRpdGlvbnNbXT4gPSB7fTtcblx0Y29uc3QgZW50aXR5U2V0UGF0aCA9IG9Db250ZXh0LmdldEludGVyZmFjZSgxKS5nZXRQYXRoKCksXG5cdFx0b01ldGFNb2RlbCA9IG9Db250ZXh0LmdldEludGVyZmFjZSgxKS5nZXRNb2RlbCgpO1xuXHRpZiAocHJvcGVydGllcykge1xuXHRcdGZvciAoY29uc3Qga2V5IGluIHByb3BlcnRpZXMpIHtcblx0XHRcdGNvbnN0IGRlZmF1bHRGaWx0ZXJWYWx1ZSA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KFxuXHRcdFx0XHRlbnRpdHlTZXRQYXRoICsgXCIvXCIgKyBrZXkgKyBcIkBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRmlsdGVyRGVmYXVsdFZhbHVlXCJcblx0XHRcdCk7XG5cdFx0XHRpZiAoZGVmYXVsdEZpbHRlclZhbHVlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0Y29uc3QgUHJvcGVydHlOYW1lID0ga2V5O1xuXHRcdFx0XHRmaWx0ZXJDb25kaXRpb25zW1Byb3BlcnR5TmFtZV0gPSBbXG5cdFx0XHRcdFx0Y3JlYXRlQ29uZGl0aW9uKFwiRVFcIiwgW2RlZmF1bHRGaWx0ZXJWYWx1ZV0sIG51bGwsIG51bGwsIENvbmRpdGlvblZhbGlkYXRlZC5WYWxpZGF0ZWQpIGFzIEZpbHRlckNvbmRpdGlvbnNcblx0XHRcdFx0XTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0cmV0dXJuIGZpbHRlckNvbmRpdGlvbnM7XG59O1xuXG5jb25zdCBnZXREZWZhdWx0U2VtYW50aWNEYXRlRmlsdGVycyA9IGZ1bmN0aW9uKFxuXHRvQ29udGV4dDogYW55LFxuXHRwcm9wZXJ0aWVzOiBhbnksXG5cdGRlZmF1bHRTZW1hbnRpY0RhdGVzOiBhbnlcbik6IFJlY29yZDxzdHJpbmcsIEZpbHRlckNvbmRpdGlvbnNbXT4ge1xuXHRjb25zdCBmaWx0ZXJDb25kaXRpb25zOiBSZWNvcmQ8c3RyaW5nLCBGaWx0ZXJDb25kaXRpb25zW10+ID0ge307XG5cdGlmIChwcm9wZXJ0aWVzKSB7XG5cdFx0Zm9yIChjb25zdCBrZXkgaW4gcHJvcGVydGllcykge1xuXHRcdFx0Ly8gY3VycmVudGx5IGRlZmF1bHRTZW1hbnRpY0RhdGVzIGNhbiBzdXBwb3J0IG9ubHkgb25lIGVudHJ5LCB3ZSBwaWNrIHRoZSBmaXJzdCBvbmUgZGlyZWN0bHkgdXNpbmcgMCBpbmRleFxuXHRcdFx0aWYgKGRlZmF1bHRTZW1hbnRpY0RhdGVzW2tleV0gJiYgZGVmYXVsdFNlbWFudGljRGF0ZXNba2V5XVswXSkge1xuXHRcdFx0XHRmaWx0ZXJDb25kaXRpb25zW2tleV0gPSBbY3JlYXRlQ29uZGl0aW9uKGRlZmF1bHRTZW1hbnRpY0RhdGVzW2tleV1bMF0ub3BlcmF0b3IsIFtdLCBudWxsLCBudWxsLCBudWxsKSBhcyBGaWx0ZXJDb25kaXRpb25zXTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0cmV0dXJuIGZpbHRlckNvbmRpdGlvbnM7XG59O1xuXG5mdW5jdGlvbiBnZXRFZGl0U3RhdHVzRmlsdGVyKCk6IFJlY29yZDxzdHJpbmcsIEZpbHRlckNvbmRpdGlvbnNbXT4ge1xuXHRjb25zdCBvZmlsdGVyQ29uZGl0aW9uczogUmVjb3JkPHN0cmluZywgRmlsdGVyQ29uZGl0aW9uc1tdPiA9IHt9O1xuXHRvZmlsdGVyQ29uZGl0aW9uc1tcIiRlZGl0U3RhdGVcIl0gPSBbXG5cdFx0Y3JlYXRlQ29uZGl0aW9uKFwiRFJBRlRfRURJVF9TVEFURVwiLCBbXCJBTExcIl0sIG51bGwsIG51bGwsIENvbmRpdGlvblZhbGlkYXRlZC5WYWxpZGF0ZWQpIGFzIEZpbHRlckNvbmRpdGlvbnNcblx0XTtcblx0cmV0dXJuIG9maWx0ZXJDb25kaXRpb25zO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RmlsdGVyQ29uZGl0aW9ucyhvQ29udGV4dDogYW55LCBmaWx0ZXJDb25kaXRpb25zOiBhbnkpOiBSZWNvcmQ8c3RyaW5nLCBGaWx0ZXJDb25kaXRpb25zW10+IHtcblx0bGV0IGVkaXRTdGF0ZUZpbHRlcjtcblx0Y29uc3QgZW50aXR5U2V0UGF0aCA9IG9Db250ZXh0LmdldEludGVyZmFjZSgxKS5nZXRQYXRoKCksXG5cdFx0b01ldGFNb2RlbCA9IG9Db250ZXh0LmdldEludGVyZmFjZSgxKS5nZXRNb2RlbCgpLFxuXHRcdGVudGl0eVR5cGVBbm5vdGF0aW9ucyA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGVudGl0eVNldFBhdGggKyBcIkBcIiksXG5cdFx0ZW50aXR5VHlwZVByb3BlcnRpZXMgPSBvTWV0YU1vZGVsLmdldE9iamVjdChlbnRpdHlTZXRQYXRoICsgXCIvXCIpO1xuXHRpZiAoXG5cdFx0ZW50aXR5VHlwZUFubm90YXRpb25zW1wiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EcmFmdFJvb3RcIl0gfHxcblx0XHRlbnRpdHlUeXBlQW5ub3RhdGlvbnNbXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRyYWZ0Tm9kZVwiXVxuXHQpIHtcblx0XHRlZGl0U3RhdGVGaWx0ZXIgPSBnZXRFZGl0U3RhdHVzRmlsdGVyKCk7XG5cdH1cblx0Y29uc3Qgc2VsZWN0aW9uVmFyaWFudCA9IGZpbHRlckNvbmRpdGlvbnM/LnNlbGVjdGlvblZhcmlhbnQ7XG5cdGNvbnN0IGRlZmF1bHRTZW1hbnRpY0RhdGVzID0gZmlsdGVyQ29uZGl0aW9ucz8uZGVmYXVsdFNlbWFudGljRGF0ZXMgfHwge307XG5cdGNvbnN0IGRlZmF1bHRGaWx0ZXJzID0gZ2V0RGVmYXVsdFZhbHVlRmlsdGVycyhvQ29udGV4dCwgZW50aXR5VHlwZVByb3BlcnRpZXMpO1xuXHRjb25zdCBkZWZhdWx0U2VtYW50aWNEYXRlRmlsdGVycyA9IGdldERlZmF1bHRTZW1hbnRpY0RhdGVGaWx0ZXJzKG9Db250ZXh0LCBlbnRpdHlUeXBlUHJvcGVydGllcywgZGVmYXVsdFNlbWFudGljRGF0ZXMpO1xuXHRpZiAoc2VsZWN0aW9uVmFyaWFudCkge1xuXHRcdGZpbHRlckNvbmRpdGlvbnMgPSBnZXRGaWx0ZXJzQ29uZGl0aW9uc0Zyb21TZWxlY3Rpb25WYXJpYW50KGVudGl0eVNldFBhdGgsIG9NZXRhTW9kZWwsIHNlbGVjdGlvblZhcmlhbnQpO1xuXHR9IGVsc2UgaWYgKGRlZmF1bHRGaWx0ZXJzKSB7XG5cdFx0ZmlsdGVyQ29uZGl0aW9ucyA9IGRlZmF1bHRGaWx0ZXJzO1xuXHR9XG5cdGlmIChkZWZhdWx0U2VtYW50aWNEYXRlRmlsdGVycykge1xuXHRcdC8vIG9ubHkgZm9yIHNlbWFudGljIGRhdGU6XG5cdFx0Ly8gMS4gdmFsdWUgZnJvbSBtYW5pZmVzdCBnZXQgbWVyZ2VkIHdpdGggU1Zcblx0XHQvLyAyLiBtYW5pZmVzdCB2YWx1ZSBpcyBnaXZlbiBwcmVmZXJlbmNlIHdoZW4gdGhlcmUgaXMgc2FtZSBzZW1hbnRpYyBkYXRlIHByb3BlcnR5IGluIFNWIGFuZCBtYW5pZmVzdFxuXHRcdGZpbHRlckNvbmRpdGlvbnMgPSB7IC4uLmZpbHRlckNvbmRpdGlvbnMsIC4uLmRlZmF1bHRTZW1hbnRpY0RhdGVGaWx0ZXJzIH07XG5cdH1cblx0aWYgKGVkaXRTdGF0ZUZpbHRlcikge1xuXHRcdGZpbHRlckNvbmRpdGlvbnMgPSB7IC4uLmZpbHRlckNvbmRpdGlvbnMsIC4uLmVkaXRTdGF0ZUZpbHRlciB9O1xuXHR9XG5cdHJldHVybiAoT2JqZWN0LmtleXMoZmlsdGVyQ29uZGl0aW9ucykubGVuZ3RoID4gMCA/IEpTT04uc3RyaW5naWZ5KGZpbHRlckNvbmRpdGlvbnMpLnJlcGxhY2UoLyhbXFx7XFx9XSkvZywgXCJcXFxcJDFcIikgOiB1bmRlZmluZWQpIGFzIGFueTtcbn1cblxuZ2V0RmlsdGVyQ29uZGl0aW9ucy5yZXF1aXJlc0lDb250ZXh0ID0gdHJ1ZTtcbiJdfQ==
393
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkZpbHRlckhlbHBlci50cyJdLCJuYW1lcyI6WyJhVmFsaWRUeXBlcyIsIm9FeGNsdWRlTWFwIiwiX2dldERhdGVUaW1lT2Zmc2V0Q29tcGxpYW50VmFsdWUiLCJzVmFsdWUiLCJvVmFsdWUiLCJtYXRjaCIsImluZGV4T2YiLCJsZW5ndGgiLCJzcGxpdCIsInVuZGVmaW5lZCIsIl9nZXREYXRlQ29tcGxpYW50VmFsdWUiLCJnZXRUeXBlQ29tcGxpYW50VmFsdWUiLCJzVHlwZSIsImlzTmFOIiwicGFyc2VGbG9hdCIsInBhcnNlSW50IiwicmVzb2x2ZUNvbmRpdGlvblZhbHVlcyIsInNPcHRpb24iLCJvVjEiLCJvVjIiLCJzU2lnbiIsIm9WYWx1ZTIiLCJzSW50ZXJuYWxPcGVyYXRpb24iLCJvQ29uZGl0aW9uIiwidmFsdWVzIiwiaXNFbXB0eSIsIm5JbmRleE9mIiwibkxhc3RJbmRleCIsImxhc3RJbmRleE9mIiwic3Vic3RyaW5nIiwib3BlcmF0b3IiLCJwdXNoIiwiZ2V0T3BlcmF0b3IiLCJzT3BlcmF0b3IiLCJfYnVpbGRDb25kaXRpb25zRnJvbVNlbGVjdGlvblJhbmdlcyIsIlJhbmdlcyIsIm9Qcm9wZXJ0eSIsInNQcm9wZXJ0eU5hbWUiLCJnZXRDdXN0b21Db25kaXRpb25zIiwiYUNvbmRpdGlvbnMiLCJmb3JFYWNoIiwiUmFuZ2UiLCJnZXRDb25kaXRpb25zIiwiX2dldFByb3BlcnR5IiwicHJvcGVydHlOYW1lIiwibWV0YU1vZGVsIiwiZW50aXR5U2V0UGF0aCIsImxhc3RTbGFzaEluZGV4IiwibmF2aWdhdGlvblBhdGgiLCJjb2xsZWN0aW9uIiwiZ2V0T2JqZWN0IiwicmVwbGFjZSIsIl9idWlsZEZpbHRlcnNDb25kaXRpb25zRnJvbVNlbGVjdE9wdGlvbiIsInNlbGVjdE9wdGlvbiIsIlByb3BlcnR5TmFtZSIsImZpbHRlckNvbmRpdGlvbnMiLCJwcm9wZXJ0eVBhdGgiLCJ2YWx1ZSIsIiRQcm9wZXJ0eVBhdGgiLCJ0YXJnZXRQcm9wZXJ0eSIsImNvbmRpdGlvbnMiLCJjb25jYXQiLCJnZXRGaWx0ZXJzQ29uZGl0aW9uc0Zyb21TZWxlY3Rpb25WYXJpYW50Iiwic0VudGl0eVNldFBhdGgiLCJvTWV0YU1vZGVsIiwic2VsZWN0aW9uVmFyaWFudCIsIm9GaWx0ZXJDb25kaXRpb25zIiwiYVNlbGVjdE9wdGlvbnMiLCJTZWxlY3RPcHRpb25zIiwiYVBhcmFtZXRlcnMiLCJQYXJhbWV0ZXJzIiwiT2JqZWN0Iiwia2V5cyIsImluY2x1ZGVzIiwicGFyYW1ldGVyIiwic1Byb3BlcnR5UGF0aCIsInZhbHVlMSIsIlByb3BlcnR5VmFsdWUiLCJ2YWx1ZTIiLCJwYXRoIiwiaXNQYXJhbWV0ZXIiLCJ2YWxpZGF0ZWQiLCJDb25kaXRpb25WYWxpZGF0ZWQiLCJWYWxpZGF0ZWQiLCJvVmFsaWRQcm9wZXJ0eSIsInNpZ24iLCJTaWduIiwiT3B0aW9uIiwib1ZhbHVlMSIsIkxvdyIsIiRUeXBlIiwidHlwZSIsIkhpZ2giLCJvQ29uZGl0aW9uVmFsdWVzIiwiQ29uZGl0aW9uIiwiY3JlYXRlQ29uZGl0aW9uIiwiZ2V0RGVmYXVsdFZhbHVlRmlsdGVycyIsIm9Db250ZXh0IiwicHJvcGVydGllcyIsImdldEludGVyZmFjZSIsImdldFBhdGgiLCJnZXRNb2RlbCIsImtleSIsImRlZmF1bHRGaWx0ZXJWYWx1ZSIsImdldERlZmF1bHRTZW1hbnRpY0RhdGVGaWx0ZXJzIiwiZGVmYXVsdFNlbWFudGljRGF0ZXMiLCJnZXRFZGl0U3RhdHVzRmlsdGVyIiwib2ZpbHRlckNvbmRpdGlvbnMiLCJnZXRGaWx0ZXJDb25kaXRpb25zIiwiZWRpdFN0YXRlRmlsdGVyIiwiZW50aXR5VHlwZUFubm90YXRpb25zIiwiZW50aXR5VHlwZVByb3BlcnRpZXMiLCJkZWZhdWx0RmlsdGVycyIsImRlZmF1bHRTZW1hbnRpY0RhdGVGaWx0ZXJzIiwiSlNPTiIsInN0cmluZ2lmeSIsInJlcXVpcmVzSUNvbnRleHQiXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQVNB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QUVEbUcsRUFBQUEsbUJBQW1CLENBQUNRLGdCQUFwQixHQUF1QyxJQUF2QyIsInNvdXJjZVJvb3QiOiIuIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU2VsZWN0T3B0aW9uVHlwZSwgU2VsZWN0aW9uVmFyaWFudFR5cGVUeXBlcywgU2VsZWN0aW9uUmFuZ2VUeXBlVHlwZXMgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvZGlzdC9nZW5lcmF0ZWQvVUlcIjtcbmltcG9ydCBDb25kaXRpb24sIHsgQ29uZGl0aW9uT2JqZWN0IH0gZnJvbSBcInNhcC91aS9tZGMvY29uZGl0aW9uL0NvbmRpdGlvblwiO1xuaW1wb3J0IENvbmRpdGlvblZhbGlkYXRlZCBmcm9tIFwic2FwL3VpL21kYy9lbnVtL0NvbmRpdGlvblZhbGlkYXRlZFwiO1xuaW1wb3J0IE9EYXRhTWV0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNZXRhTW9kZWxcIjtcbmV4cG9ydCB0eXBlIEZpbHRlckNvbmRpdGlvbnMgPSB7XG5cdG9wZXJhdG9yOiBzdHJpbmc7XG5cdHZhbHVlczogQXJyYXk8c3RyaW5nPjtcblx0aXNFbXB0eT86IGJvb2xlYW4gfCBudWxsO1xuXHR2YWxpZGF0ZWQ/OiBzdHJpbmc7XG59O1xuXG5jb25zdCBhVmFsaWRUeXBlcyA9IFtcblx0XCJFZG0uQm9vbGVhblwiLFxuXHRcIkVkbS5CeXRlXCIsXG5cdFwiRWRtLkRhdGVcIixcblx0XCJFZG0uRGF0ZVRpbWVcIixcblx0XCJFZG0uRGF0ZVRpbWVPZmZzZXRcIixcblx0XCJFZG0uRGVjaW1hbFwiLFxuXHRcIkVkbS5Eb3VibGVcIixcblx0XCJFZG0uRmxvYXRcIixcblx0XCJFZG0uR3VpZFwiLFxuXHRcIkVkbS5JbnQxNlwiLFxuXHRcIkVkbS5JbnQzMlwiLFxuXHRcIkVkbS5JbnQ2NFwiLFxuXHRcIkVkbS5TQnl0ZVwiLFxuXHRcIkVkbS5TaW5nbGVcIixcblx0XCJFZG0uU3RyaW5nXCIsXG5cdFwiRWRtLlRpbWVcIixcblx0XCJFZG0uVGltZU9mRGF5XCJcbl07XG5cbmNvbnN0IG9FeGNsdWRlTWFwOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge1xuXHRcIkNvbnRhaW5zXCI6IFwiTm90Q29udGFpbnNcIixcblx0XCJTdGFydHNXaXRoXCI6IFwiTm90U3RhcnRzV2l0aFwiLFxuXHRcIkVuZHNXaXRoXCI6IFwiTm90RW5kc1dpdGhcIixcblx0XCJFbXB0eVwiOiBcIk5vdEVtcHR5XCIsXG5cdFwiTm90RW1wdHlcIjogXCJFbXB0eVwiLFxuXHRcIkxFXCI6IFwiTk9UTEVcIixcblx0XCJHRVwiOiBcIk5PVEdFXCIsXG5cdFwiTFRcIjogXCJOT1RMVFwiLFxuXHRcIkdUXCI6IFwiTk9UR1RcIixcblx0XCJCVFwiOiBcIk5PVEJUXCIsXG5cdFwiTkVcIjogXCJFUVwiLFxuXHRcIkVRXCI6IFwiTkVcIlxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9nZXREYXRlVGltZU9mZnNldENvbXBsaWFudFZhbHVlKHNWYWx1ZTogYW55KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0bGV0IG9WYWx1ZTtcblx0aWYgKHNWYWx1ZS5tYXRjaCgvXihcXGR7NH0pLShcXGR7MSwyfSktKFxcZHsxLDJ9KVQoXFxkezEsMn0pOihcXGR7MSwyfSk6KFxcZHsxLDJ9KVxcKyhcXGR7MSw0fSkvKSkge1xuXHRcdG9WYWx1ZSA9IHNWYWx1ZS5tYXRjaCgvXihcXGR7NH0pLShcXGR7MSwyfSktKFxcZHsxLDJ9KVQoXFxkezEsMn0pOihcXGR7MSwyfSk6KFxcZHsxLDJ9KVxcKyhcXGR7MSw0fSkvKVswXTtcblx0fSBlbHNlIGlmIChzVmFsdWUubWF0Y2goL14oXFxkezR9KS0oXFxkezEsMn0pLShcXGR7MSwyfSlUKFxcZHsxLDJ9KTooXFxkezEsMn0pOihcXGR7MSwyfSkvKSkge1xuXHRcdG9WYWx1ZSA9IHNWYWx1ZS5tYXRjaCgvXihcXGR7NH0pLShcXGR7MSwyfSktKFxcZHsxLDJ9KVQoXFxkezEsMn0pOihcXGR7MSwyfSk6KFxcZHsxLDJ9KS8pWzBdICsgXCIrMDAwMFwiO1xuXHR9IGVsc2UgaWYgKHNWYWx1ZS5tYXRjaCgvXihcXGR7NH0pLShcXGR7MSwyfSktKFxcZHsxLDJ9KS8pKSB7XG5cdFx0b1ZhbHVlID0gc1ZhbHVlLm1hdGNoKC9eKFxcZHs0fSktKFxcZHsxLDJ9KS0oXFxkezEsMn0pLylbMF0gKyBcIlQwMDowMDowMCswMDAwXCI7XG5cdH0gZWxzZSBpZiAoc1ZhbHVlLmluZGV4T2YoXCJaXCIpID09PSBzVmFsdWUubGVuZ3RoIC0gMSkge1xuXHRcdG9WYWx1ZSA9IHNWYWx1ZS5zcGxpdChcIlpcIilbMF0gKyBcIiswMTAwXCI7XG5cdH0gZWxzZSB7XG5cdFx0b1ZhbHVlID0gdW5kZWZpbmVkO1xuXHR9XG5cdHJldHVybiBvVmFsdWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfZ2V0RGF0ZUNvbXBsaWFudFZhbHVlKHNWYWx1ZTogYW55KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0cmV0dXJuIHNWYWx1ZS5tYXRjaCgvXihcXGR7NH0pLShcXGR7MSwyfSktKFxcZHsxLDJ9KS8pXG5cdFx0PyBzVmFsdWUubWF0Y2goL14oXFxkezR9KS0oXFxkezEsMn0pLShcXGR7MSwyfSkvKVswXVxuXHRcdDogc1ZhbHVlLm1hdGNoKC9eKFxcZHs4fSkvKSAmJiBzVmFsdWUubWF0Y2goL14oXFxkezh9KS8pWzBdO1xufVxuXG4vKipcbiAqIE1ldGhvZCB0byBnZXQgdGhlIGNvbXBsaWFudCB2YWx1ZSB0eXBlIGJhc2VkIG9uIHRoZSBkYXRhIHR5cGUuXG4gKlxuICogQHBhcmFtICBzVmFsdWUgUmF3IHZhbHVlXG4gKiBAcGFyYW0gIHNUeXBlIFRoZSBwcm9wZXJ0eSB0eXBlXG4gKiBAcmV0dXJucyBWYWx1ZSB0byBiZSBwcm9wYWdhdGVkIHRvIHRoZSBjb25kaXRpb24uXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFR5cGVDb21wbGlhbnRWYWx1ZShzVmFsdWU6IGFueSwgc1R5cGU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdGxldCBvVmFsdWU7XG5cdGlmIChhVmFsaWRUeXBlcy5pbmRleE9mKHNUeXBlKSA9PT0gLTEpIHtcblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cdG9WYWx1ZSA9IHNWYWx1ZTtcblx0c3dpdGNoIChzVHlwZSkge1xuXHRcdGNhc2UgXCJFZG0uQm9vbGVhblwiOlxuXHRcdFx0b1ZhbHVlID0gc1ZhbHVlID09PSBcInRydWVcIiB8fCAoc1ZhbHVlID09PSBcImZhbHNlXCIgPyBmYWxzZSA6IHVuZGVmaW5lZCk7XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIFwiRWRtLkRvdWJsZVwiOlxuXHRcdGNhc2UgXCJFZG0uU2luZ2xlXCI6XG5cdFx0XHRvVmFsdWUgPSBpc05hTihzVmFsdWUpID8gdW5kZWZpbmVkIDogcGFyc2VGbG9hdChzVmFsdWUpO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSBcIkVkbS5CeXRlXCI6XG5cdFx0Y2FzZSBcIkVkbS5JbnQxNlwiOlxuXHRcdGNhc2UgXCJFZG0uSW50MzJcIjpcblx0XHRjYXNlIFwiRWRtLlNCeXRlXCI6XG5cdFx0XHRvVmFsdWUgPSBpc05hTihzVmFsdWUpID8gdW5kZWZpbmVkIDogcGFyc2VJbnQoc1ZhbHVlLCAxMCk7XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIFwiRWRtLkRhdGVcIjpcblx0XHRcdG9WYWx1ZSA9IF9nZXREYXRlQ29tcGxpYW50VmFsdWUoc1ZhbHVlKTtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgXCJFZG0uRGF0ZVRpbWVPZmZzZXRcIjpcblx0XHRcdG9WYWx1ZSA9IF9nZXREYXRlVGltZU9mZnNldENvbXBsaWFudFZhbHVlKHNWYWx1ZSk7XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIFwiRWRtLlRpbWVPZkRheVwiOlxuXHRcdFx0b1ZhbHVlID0gc1ZhbHVlLm1hdGNoKC8oXFxkezEsMn0pOihcXGR7MSwyfSk6KFxcZHsxLDJ9KS8pID8gc1ZhbHVlLm1hdGNoKC8oXFxkezEsMn0pOihcXGR7MSwyfSk6KFxcZHsxLDJ9KS8pWzBdIDogdW5kZWZpbmVkO1xuXHRcdFx0YnJlYWs7XG5cdFx0ZGVmYXVsdDpcblx0fVxuXG5cdHJldHVybiBvVmFsdWUgPT09IG51bGwgPyB1bmRlZmluZWQgOiBvVmFsdWU7XG59XG5cbi8qKlxuICogTWV0aG9kIHRvIGNyZWF0ZSBhIGNvbmRpdGlvbi5cbiAqIEBwYXJhbSAgc09wdGlvbiBPcGVyYXRvciB0byBiZSB1c2VkLlxuICogQHBhcmFtICBvVjEgTG93ZXIgdmFsdWVcbiAqIEBwYXJhbSAgb1YyIEhpZ2hlciB2YWx1ZVxuICogQHBhcmFtIHNTaWduXG4gKiBAcmV0dXJucyBDb25kaXRpb24gdG8gYmUgY3JlYXRlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUNvbmRpdGlvblZhbHVlcyhzT3B0aW9uOiBzdHJpbmcgfCB1bmRlZmluZWQsIG9WMTogYW55LCBvVjI6IGFueSwgc1NpZ246IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuXHRsZXQgb1ZhbHVlID0gb1YxLFxuXHRcdG9WYWx1ZTIsXG5cdFx0c0ludGVybmFsT3BlcmF0aW9uOiBhbnk7XG5cdGNvbnN0IG9Db25kaXRpb246IFJlY29yZDxzdHJpbmcsIEZpbHRlckNvbmRpdGlvbnNbXT4gPSB7fTtcblx0b0NvbmRpdGlvbi52YWx1ZXMgPSBbXTtcblx0b0NvbmRpdGlvbi5pc0VtcHR5ID0gbnVsbCBhcyBhbnk7XG5cdGlmIChvVjEgPT09IHVuZGVmaW5lZCB8fCBvVjEgPT09IG51bGwpIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHRzd2l0Y2ggKHNPcHRpb24pIHtcblx0XHRjYXNlIFwiQ1BcIjpcblx0XHRcdHNJbnRlcm5hbE9wZXJhdGlvbiA9IFwiQ29udGFpbnNcIjtcblx0XHRcdGlmIChvVmFsdWUpIHtcblx0XHRcdFx0Y29uc3QgbkluZGV4T2YgPSBvVmFsdWUuaW5kZXhPZihcIipcIik7XG5cdFx0XHRcdGNvbnN0IG5MYXN0SW5kZXggPSBvVmFsdWUubGFzdEluZGV4T2YoXCIqXCIpO1xuXG5cdFx0XHRcdC8vIG9ubHkgd2hlbiB0aGVyZSBhcmUgJyonIGF0IGFsbFxuXHRcdFx0XHRpZiAobkluZGV4T2YgPiAtMSkge1xuXHRcdFx0XHRcdGlmIChuSW5kZXhPZiA9PT0gMCAmJiBuTGFzdEluZGV4ICE9PSBvVmFsdWUubGVuZ3RoIC0gMSkge1xuXHRcdFx0XHRcdFx0c0ludGVybmFsT3BlcmF0aW9uID0gXCJFbmRzV2l0aFwiO1xuXHRcdFx0XHRcdFx0b1ZhbHVlID0gb1ZhbHVlLnN1YnN0cmluZygxLCBvVmFsdWUubGVuZ3RoKTtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKG5JbmRleE9mICE9PSAwICYmIG5MYXN0SW5kZXggPT09IG9WYWx1ZS5sZW5ndGggLSAxKSB7XG5cdFx0XHRcdFx0XHRzSW50ZXJuYWxPcGVyYXRpb24gPSBcIlN0YXJ0c1dpdGhcIjtcblx0XHRcdFx0XHRcdG9WYWx1ZSA9IG9WYWx1ZS5zdWJzdHJpbmcoMCwgb1ZhbHVlLmxlbmd0aCAtIDEpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRvVmFsdWUgPSBvVmFsdWUuc3Vic3RyaW5nKDEsIG9WYWx1ZS5sZW5ndGggLSAxKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0LyogVE9ETyBBZGQgZGlhZ29ub3N0aWNzIExvZy53YXJuaW5nKFwiQ29udGFpbnMgT3B0aW9uIGNhbm5vdCBiZSB1c2VkIHdpdGhvdXQgJyonLlwiKSAqL1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSBcIkVRXCI6XG5cdFx0XHRzSW50ZXJuYWxPcGVyYXRpb24gPSBvVjEgPT09IFwiXCIgPyBcIkVtcHR5XCIgOiBzT3B0aW9uO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSBcIk5FXCI6XG5cdFx0XHRzSW50ZXJuYWxPcGVyYXRpb24gPSBvVjEgPT09IFwiXCIgPyBcIk5vdEVtcHR5XCIgOiBzT3B0aW9uO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSBcIkJUXCI6XG5cdFx0XHRpZiAob1YyID09PSB1bmRlZmluZWQgfHwgb1YyID09PSBudWxsKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdG9WYWx1ZTIgPSBvVjI7XG5cdFx0XHRzSW50ZXJuYWxPcGVyYXRpb24gPSBzT3B0aW9uO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSBcIkxFXCI6XG5cdFx0Y2FzZSBcIkdFXCI6XG5cdFx0Y2FzZSBcIkdUXCI6XG5cdFx0Y2FzZSBcIkxUXCI6XG5cdFx0XHRzSW50ZXJuYWxPcGVyYXRpb24gPSBzT3B0aW9uO1xuXHRcdFx0YnJlYWs7XG5cdFx0ZGVmYXVsdDpcblx0XHRcdC8qIFRPRE8gQWRkIGRpYWdvbm9zdGljcyBMb2cud2FybmluZyhcIlNlbGVjdGlvbiBPcHRpb24gaXMgbm90IHN1cHBvcnRlZCA6ICdcIiArIHNPcHRpb24gKyBcIidcIik7ICovXG5cdFx0XHRyZXR1cm47XG5cdH1cblx0aWYgKHNTaWduID09PSBcIkVcIikge1xuXHRcdHNJbnRlcm5hbE9wZXJhdGlvbiA9IG9FeGNsdWRlTWFwW3NJbnRlcm5hbE9wZXJhdGlvbl07XG5cdH1cblx0b0NvbmRpdGlvbi5vcGVyYXRvciA9IHNJbnRlcm5hbE9wZXJhdGlvbjtcblx0aWYgKHNJbnRlcm5hbE9wZXJhdGlvbiAhPT0gXCJFbXB0eVwiKSB7XG5cdFx0b0NvbmRpdGlvbi52YWx1ZXMucHVzaChvVmFsdWUpO1xuXHRcdGlmIChvVmFsdWUyKSB7XG5cdFx0XHRvQ29uZGl0aW9uLnZhbHVlcy5wdXNoKG9WYWx1ZTIpO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gb0NvbmRpdGlvbjtcbn1cblxuLyogTWV0aG9kIHRvIGdldCB0aGUgb3BlcmF0b3IgZnJvbSB0aGUgU2VsZWN0aW9uIE9wdGlvbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE9wZXJhdG9yKHNPcGVyYXRvcjogc3RyaW5nKTogc3RyaW5nIHtcblx0cmV0dXJuIHNPcGVyYXRvci5pbmRleE9mKFwiL1wiKSA+IDAgPyBzT3BlcmF0b3Iuc3BsaXQoXCIvXCIpWzFdIDogc09wZXJhdG9yO1xufVxuXG5mdW5jdGlvbiBfYnVpbGRDb25kaXRpb25zRnJvbVNlbGVjdGlvblJhbmdlcyhcblx0UmFuZ2VzOiBTZWxlY3Rpb25SYW5nZVR5cGVUeXBlc1tdLFxuXHRvUHJvcGVydHk6IFJlY29yZDxzdHJpbmcsIG9iamVjdD4sXG5cdHNQcm9wZXJ0eU5hbWU6IHN0cmluZyxcblx0Z2V0Q3VzdG9tQ29uZGl0aW9ucz86IEZ1bmN0aW9uXG4pOiBhbnlbXSB7XG5cdGNvbnN0IGFDb25kaXRpb25zOiBhbnlbXSA9IFtdO1xuXHRSYW5nZXM/LmZvckVhY2goKFJhbmdlOiBhbnkpID0+IHtcblx0XHRjb25zdCBvQ29uZGl0aW9uID0gZ2V0Q3VzdG9tQ29uZGl0aW9ucyA/IGdldEN1c3RvbUNvbmRpdGlvbnMoUmFuZ2UsIG9Qcm9wZXJ0eSwgc1Byb3BlcnR5TmFtZSkgOiBnZXRDb25kaXRpb25zKFJhbmdlLCBvUHJvcGVydHkpO1xuXHRcdGlmIChvQ29uZGl0aW9uKSB7XG5cdFx0XHRhQ29uZGl0aW9ucy5wdXNoKG9Db25kaXRpb24pO1xuXHRcdH1cblx0fSk7XG5cdHJldHVybiBhQ29uZGl0aW9ucztcbn1cblxuZnVuY3Rpb24gX2dldFByb3BlcnR5KHByb3BlcnR5TmFtZTogc3RyaW5nLCBtZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsLCBlbnRpdHlTZXRQYXRoOiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCBvYmplY3Q+IHtcblx0Y29uc3QgbGFzdFNsYXNoSW5kZXggPSBwcm9wZXJ0eU5hbWUubGFzdEluZGV4T2YoXCIvXCIpO1xuXHRjb25zdCBuYXZpZ2F0aW9uUGF0aCA9IGxhc3RTbGFzaEluZGV4ID4gLTEgPyBwcm9wZXJ0eU5hbWUuc3Vic3RyaW5nKDAsIHByb3BlcnR5TmFtZS5sYXN0SW5kZXhPZihcIi9cIikgKyAxKSA6IFwiXCI7XG5cdGNvbnN0IGNvbGxlY3Rpb24gPSBtZXRhTW9kZWwuZ2V0T2JqZWN0KGVudGl0eVNldFBhdGggKyBcIi9cIiArIG5hdmlnYXRpb25QYXRoKTtcblx0cmV0dXJuIGNvbGxlY3Rpb24/Lltwcm9wZXJ0eU5hbWUucmVwbGFjZShuYXZpZ2F0aW9uUGF0aCwgXCJcIildO1xufVxuXG5mdW5jdGlvbiBfYnVpbGRGaWx0ZXJzQ29uZGl0aW9uc0Zyb21TZWxlY3RPcHRpb24oXG5cdHNlbGVjdE9wdGlvbjogU2VsZWN0T3B0aW9uVHlwZSxcblx0bWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbCxcblx0ZW50aXR5U2V0UGF0aDogc3RyaW5nLFxuXHRnZXRDdXN0b21Db25kaXRpb25zPzogRnVuY3Rpb25cbik6IFJlY29yZDxzdHJpbmcsIEZpbHRlckNvbmRpdGlvbnNbXT4ge1xuXHRjb25zdCBwcm9wZXJ0eU5hbWU6IGFueSA9IHNlbGVjdE9wdGlvbi5Qcm9wZXJ0eU5hbWUsXG5cdFx0ZmlsdGVyQ29uZGl0aW9uczogUmVjb3JkPHN0cmluZywgRmlsdGVyQ29uZGl0aW9uc1tdPiA9IHt9LFxuXHRcdHByb3BlcnR5UGF0aDogc3RyaW5nID0gcHJvcGVydHlOYW1lLnZhbHVlIHx8IHByb3BlcnR5TmFtZS4kUHJvcGVydHlQYXRoLFxuXHRcdFJhbmdlczogU2VsZWN0aW9uUmFuZ2VUeXBlVHlwZXNbXSA9IHNlbGVjdE9wdGlvbi5SYW5nZXM7XG5cdGNvbnN0IHRhcmdldFByb3BlcnR5ID0gX2dldFByb3BlcnR5KHByb3BlcnR5UGF0aCwgbWV0YU1vZGVsLCBlbnRpdHlTZXRQYXRoKTtcblx0aWYgKHRhcmdldFByb3BlcnR5KSB7XG5cdFx0Y29uc3QgY29uZGl0aW9uczogYW55W10gPSBfYnVpbGRDb25kaXRpb25zRnJvbVNlbGVjdGlvblJhbmdlcyhSYW5nZXMsIHRhcmdldFByb3BlcnR5LCBwcm9wZXJ0eVBhdGgsIGdldEN1c3RvbUNvbmRpdGlvbnMpO1xuXHRcdGlmIChjb25kaXRpb25zLmxlbmd0aCkge1xuXHRcdFx0ZmlsdGVyQ29uZGl0aW9uc1twcm9wZXJ0eVBhdGhdID0gKGZpbHRlckNvbmRpdGlvbnNbcHJvcGVydHlQYXRoXSB8fCBbXSkuY29uY2F0KGNvbmRpdGlvbnMpO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gZmlsdGVyQ29uZGl0aW9ucztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEZpbHRlcnNDb25kaXRpb25zRnJvbVNlbGVjdGlvblZhcmlhbnQoXG5cdHNFbnRpdHlTZXRQYXRoOiBzdHJpbmcsXG5cdG9NZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsLFxuXHRzZWxlY3Rpb25WYXJpYW50OiBTZWxlY3Rpb25WYXJpYW50VHlwZVR5cGVzLFxuXHRnZXRDdXN0b21Db25kaXRpb25zPzogRnVuY3Rpb25cbik6IFJlY29yZDxzdHJpbmcsIEZpbHRlckNvbmRpdGlvbnNbXT4ge1xuXHRsZXQgb0ZpbHRlckNvbmRpdGlvbnM6IFJlY29yZDxzdHJpbmcsIEZpbHRlckNvbmRpdGlvbnNbXT4gPSB7fTtcblx0aWYgKCFzZWxlY3Rpb25WYXJpYW50KSB7XG5cdFx0cmV0dXJuIG9GaWx0ZXJDb25kaXRpb25zO1xuXHR9XG5cdGNvbnN0IGFTZWxlY3RPcHRpb25zID0gc2VsZWN0aW9uVmFyaWFudC5TZWxlY3RPcHRpb25zLFxuXHRcdGFQYXJhbWV0ZXJzID0gc2VsZWN0aW9uVmFyaWFudC5QYXJhbWV0ZXJzO1xuXHRhU2VsZWN0T3B0aW9ucz8uZm9yRWFjaCgoc2VsZWN0T3B0aW9uOiBTZWxlY3RPcHRpb25UeXBlKSA9PiB7XG5cdFx0Y29uc3QgcHJvcGVydHlOYW1lOiBhbnkgPSBzZWxlY3RPcHRpb24uUHJvcGVydHlOYW1lLFxuXHRcdFx0c1Byb3BlcnR5TmFtZTogc3RyaW5nID0gcHJvcGVydHlOYW1lLnZhbHVlIHx8IHByb3BlcnR5TmFtZS4kUHJvcGVydHlQYXRoO1xuXHRcdGlmIChPYmplY3Qua2V5cyhvRmlsdGVyQ29uZGl0aW9ucykuaW5jbHVkZXMoc1Byb3BlcnR5TmFtZSkpIHtcblx0XHRcdG9GaWx0ZXJDb25kaXRpb25zW3NQcm9wZXJ0eU5hbWVdID0gb0ZpbHRlckNvbmRpdGlvbnNbc1Byb3BlcnR5TmFtZV0uY29uY2F0KFxuXHRcdFx0XHRfYnVpbGRGaWx0ZXJzQ29uZGl0aW9uc0Zyb21TZWxlY3RPcHRpb24oc2VsZWN0T3B0aW9uLCBvTWV0YU1vZGVsLCBzRW50aXR5U2V0UGF0aCwgZ2V0Q3VzdG9tQ29uZGl0aW9ucylbc1Byb3BlcnR5TmFtZV1cblx0XHRcdCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG9GaWx0ZXJDb25kaXRpb25zID0ge1xuXHRcdFx0XHQuLi5vRmlsdGVyQ29uZGl0aW9ucyxcblx0XHRcdFx0Li4uX2J1aWxkRmlsdGVyc0NvbmRpdGlvbnNGcm9tU2VsZWN0T3B0aW9uKHNlbGVjdE9wdGlvbiwgb01ldGFNb2RlbCwgc0VudGl0eVNldFBhdGgsIGdldEN1c3RvbUNvbmRpdGlvbnMpXG5cdFx0XHR9O1xuXHRcdH1cblx0fSk7XG5cdGFQYXJhbWV0ZXJzPy5mb3JFYWNoKChwYXJhbWV0ZXI6IGFueSkgPT4ge1xuXHRcdGNvbnN0IHNQcm9wZXJ0eVBhdGggPSBwYXJhbWV0ZXIuUHJvcGVydHlOYW1lLnZhbHVlIHx8IHBhcmFtZXRlci5Qcm9wZXJ0eU5hbWUuJFByb3BlcnR5UGF0aDtcblx0XHRjb25zdCBvQ29uZGl0aW9uOiBhbnkgPSBnZXRDdXN0b21Db25kaXRpb25zXG5cdFx0XHQ/IHsgb3BlcmF0b3I6IFwiRVFcIiwgdmFsdWUxOiBwYXJhbWV0ZXIuUHJvcGVydHlWYWx1ZSwgdmFsdWUyOiBudWxsLCBwYXRoOiBzUHJvcGVydHlQYXRoLCBpc1BhcmFtZXRlcjogdHJ1ZSB9XG5cdFx0XHQ6IHtcblx0XHRcdFx0XHRvcGVyYXRvcjogXCJFUVwiLFxuXHRcdFx0XHRcdHZhbHVlczogW3BhcmFtZXRlci5Qcm9wZXJ0eVZhbHVlXSxcblx0XHRcdFx0XHRpc0VtcHR5OiBudWxsLFxuXHRcdFx0XHRcdHZhbGlkYXRlZDogQ29uZGl0aW9uVmFsaWRhdGVkLlZhbGlkYXRlZCxcblx0XHRcdFx0XHRpc1BhcmFtZXRlcjogdHJ1ZVxuXHRcdFx0ICB9O1xuXHRcdG9GaWx0ZXJDb25kaXRpb25zW3NQcm9wZXJ0eVBhdGhdID0gW29Db25kaXRpb25dO1xuXHR9KTtcblxuXHRyZXR1cm4gb0ZpbHRlckNvbmRpdGlvbnM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb25kaXRpb25zKFJhbmdlOiBhbnksIG9WYWxpZFByb3BlcnR5OiBhbnkpOiBDb25kaXRpb25PYmplY3QgfCB1bmRlZmluZWQge1xuXHRsZXQgb0NvbmRpdGlvbjtcblx0Y29uc3Qgc2lnbjogc3RyaW5nIHwgdW5kZWZpbmVkID0gUmFuZ2UuU2lnbjtcblx0Y29uc3Qgc09wdGlvbjogc3RyaW5nIHwgdW5kZWZpbmVkID0gUmFuZ2UuT3B0aW9uID8gZ2V0T3BlcmF0b3IoUmFuZ2UuT3B0aW9uKSA6IHVuZGVmaW5lZDtcblx0Y29uc3Qgb1ZhbHVlMTogYW55ID0gZ2V0VHlwZUNvbXBsaWFudFZhbHVlKFJhbmdlLkxvdywgb1ZhbGlkUHJvcGVydHkuJFR5cGUgfHwgb1ZhbGlkUHJvcGVydHkudHlwZSk7XG5cdGNvbnN0IG9WYWx1ZTI6IGFueSA9IFJhbmdlLkhpZ2ggPyBnZXRUeXBlQ29tcGxpYW50VmFsdWUoUmFuZ2UuSGlnaCwgb1ZhbGlkUHJvcGVydHkuJFR5cGUgfHwgb1ZhbGlkUHJvcGVydHkudHlwZSkgOiB1bmRlZmluZWQ7XG5cdGNvbnN0IG9Db25kaXRpb25WYWx1ZXMgPSByZXNvbHZlQ29uZGl0aW9uVmFsdWVzKHNPcHRpb24sIG9WYWx1ZTEsIG9WYWx1ZTIsIHNpZ24pIGFzIGFueTtcblx0aWYgKG9Db25kaXRpb25WYWx1ZXMpIHtcblx0XHRvQ29uZGl0aW9uID0gQ29uZGl0aW9uLmNyZWF0ZUNvbmRpdGlvbihcblx0XHRcdG9Db25kaXRpb25WYWx1ZXMub3BlcmF0b3IsXG5cdFx0XHRvQ29uZGl0aW9uVmFsdWVzLnZhbHVlcyxcblx0XHRcdG51bGwsXG5cdFx0XHRudWxsLFxuXHRcdFx0Q29uZGl0aW9uVmFsaWRhdGVkLlZhbGlkYXRlZFxuXHRcdCk7XG5cdH1cblx0cmV0dXJuIG9Db25kaXRpb247XG59XG5cbmNvbnN0IGdldERlZmF1bHRWYWx1ZUZpbHRlcnMgPSBmdW5jdGlvbihvQ29udGV4dDogYW55LCBwcm9wZXJ0aWVzOiBhbnkpOiBSZWNvcmQ8c3RyaW5nLCBGaWx0ZXJDb25kaXRpb25zW10+IHtcblx0Y29uc3QgZmlsdGVyQ29uZGl0aW9uczogUmVjb3JkPHN0cmluZywgRmlsdGVyQ29uZGl0aW9uc1tdPiA9IHt9O1xuXHRjb25zdCBlbnRpdHlTZXRQYXRoID0gb0NvbnRleHQuZ2V0SW50ZXJmYWNlKDEpLmdldFBhdGgoKSxcblx0XHRvTWV0YU1vZGVsID0gb0NvbnRleHQuZ2V0SW50ZXJmYWNlKDEpLmdldE1vZGVsKCk7XG5cdGlmIChwcm9wZXJ0aWVzKSB7XG5cdFx0Zm9yIChjb25zdCBrZXkgaW4gcHJvcGVydGllcykge1xuXHRcdFx0Y29uc3QgZGVmYXVsdEZpbHRlclZhbHVlID0gb01ldGFNb2RlbC5nZXRPYmplY3QoXG5cdFx0XHRcdGVudGl0eVNldFBhdGggKyBcIi9cIiArIGtleSArIFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5GaWx0ZXJEZWZhdWx0VmFsdWVcIlxuXHRcdFx0KTtcblx0XHRcdGlmIChkZWZhdWx0RmlsdGVyVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRjb25zdCBQcm9wZXJ0eU5hbWUgPSBrZXk7XG5cdFx0XHRcdGZpbHRlckNvbmRpdGlvbnNbUHJvcGVydHlOYW1lXSA9IFtcblx0XHRcdFx0XHRDb25kaXRpb24uY3JlYXRlQ29uZGl0aW9uKFwiRVFcIiwgW2RlZmF1bHRGaWx0ZXJWYWx1ZV0sIG51bGwsIG51bGwsIENvbmRpdGlvblZhbGlkYXRlZC5WYWxpZGF0ZWQpIGFzIEZpbHRlckNvbmRpdGlvbnNcblx0XHRcdFx0XTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0cmV0dXJuIGZpbHRlckNvbmRpdGlvbnM7XG59O1xuXG5jb25zdCBnZXREZWZhdWx0U2VtYW50aWNEYXRlRmlsdGVycyA9IGZ1bmN0aW9uKFxuXHRvQ29udGV4dDogYW55LFxuXHRwcm9wZXJ0aWVzOiBhbnksXG5cdGRlZmF1bHRTZW1hbnRpY0RhdGVzOiBhbnlcbik6IFJlY29yZDxzdHJpbmcsIEZpbHRlckNvbmRpdGlvbnNbXT4ge1xuXHRjb25zdCBmaWx0ZXJDb25kaXRpb25zOiBSZWNvcmQ8c3RyaW5nLCBGaWx0ZXJDb25kaXRpb25zW10+ID0ge307XG5cdGlmIChwcm9wZXJ0aWVzKSB7XG5cdFx0Zm9yIChjb25zdCBrZXkgaW4gcHJvcGVydGllcykge1xuXHRcdFx0Ly8gY3VycmVudGx5IGRlZmF1bHRTZW1hbnRpY0RhdGVzIGNhbiBzdXBwb3J0IG9ubHkgb25lIGVudHJ5LCB3ZSBwaWNrIHRoZSBmaXJzdCBvbmUgZGlyZWN0bHkgdXNpbmcgMCBpbmRleFxuXHRcdFx0aWYgKGRlZmF1bHRTZW1hbnRpY0RhdGVzW2tleV0gJiYgZGVmYXVsdFNlbWFudGljRGF0ZXNba2V5XVswXSkge1xuXHRcdFx0XHRmaWx0ZXJDb25kaXRpb25zW2tleV0gPSBbXG5cdFx0XHRcdFx0Q29uZGl0aW9uLmNyZWF0ZUNvbmRpdGlvbihkZWZhdWx0U2VtYW50aWNEYXRlc1trZXldWzBdLm9wZXJhdG9yLCBbXSwgbnVsbCwgbnVsbCwgbnVsbCkgYXMgRmlsdGVyQ29uZGl0aW9uc1xuXHRcdFx0XHRdO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHRyZXR1cm4gZmlsdGVyQ29uZGl0aW9ucztcbn07XG5cbmZ1bmN0aW9uIGdldEVkaXRTdGF0dXNGaWx0ZXIoKTogUmVjb3JkPHN0cmluZywgRmlsdGVyQ29uZGl0aW9uc1tdPiB7XG5cdGNvbnN0IG9maWx0ZXJDb25kaXRpb25zOiBSZWNvcmQ8c3RyaW5nLCBGaWx0ZXJDb25kaXRpb25zW10+ID0ge307XG5cdG9maWx0ZXJDb25kaXRpb25zW1wiJGVkaXRTdGF0ZVwiXSA9IFtcblx0XHRDb25kaXRpb24uY3JlYXRlQ29uZGl0aW9uKFwiRFJBRlRfRURJVF9TVEFURVwiLCBbXCJBTExcIl0sIG51bGwsIG51bGwsIENvbmRpdGlvblZhbGlkYXRlZC5WYWxpZGF0ZWQpIGFzIEZpbHRlckNvbmRpdGlvbnNcblx0XTtcblx0cmV0dXJuIG9maWx0ZXJDb25kaXRpb25zO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RmlsdGVyQ29uZGl0aW9ucyhvQ29udGV4dDogYW55LCBmaWx0ZXJDb25kaXRpb25zOiBhbnkpOiBSZWNvcmQ8c3RyaW5nLCBGaWx0ZXJDb25kaXRpb25zW10+IHtcblx0bGV0IGVkaXRTdGF0ZUZpbHRlcjtcblx0Y29uc3QgZW50aXR5U2V0UGF0aCA9IG9Db250ZXh0LmdldEludGVyZmFjZSgxKS5nZXRQYXRoKCksXG5cdFx0b01ldGFNb2RlbCA9IG9Db250ZXh0LmdldEludGVyZmFjZSgxKS5nZXRNb2RlbCgpLFxuXHRcdGVudGl0eVR5cGVBbm5vdGF0aW9ucyA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGVudGl0eVNldFBhdGggKyBcIkBcIiksXG5cdFx0ZW50aXR5VHlwZVByb3BlcnRpZXMgPSBvTWV0YU1vZGVsLmdldE9iamVjdChlbnRpdHlTZXRQYXRoICsgXCIvXCIpO1xuXHRpZiAoXG5cdFx0ZW50aXR5VHlwZUFubm90YXRpb25zW1wiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EcmFmdFJvb3RcIl0gfHxcblx0XHRlbnRpdHlUeXBlQW5ub3RhdGlvbnNbXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRyYWZ0Tm9kZVwiXVxuXHQpIHtcblx0XHRlZGl0U3RhdGVGaWx0ZXIgPSBnZXRFZGl0U3RhdHVzRmlsdGVyKCk7XG5cdH1cblx0Y29uc3Qgc2VsZWN0aW9uVmFyaWFudCA9IGZpbHRlckNvbmRpdGlvbnM/LnNlbGVjdGlvblZhcmlhbnQ7XG5cdGNvbnN0IGRlZmF1bHRTZW1hbnRpY0RhdGVzID0gZmlsdGVyQ29uZGl0aW9ucz8uZGVmYXVsdFNlbWFudGljRGF0ZXMgfHwge307XG5cdGNvbnN0IGRlZmF1bHRGaWx0ZXJzID0gZ2V0RGVmYXVsdFZhbHVlRmlsdGVycyhvQ29udGV4dCwgZW50aXR5VHlwZVByb3BlcnRpZXMpO1xuXHRjb25zdCBkZWZhdWx0U2VtYW50aWNEYXRlRmlsdGVycyA9IGdldERlZmF1bHRTZW1hbnRpY0RhdGVGaWx0ZXJzKG9Db250ZXh0LCBlbnRpdHlUeXBlUHJvcGVydGllcywgZGVmYXVsdFNlbWFudGljRGF0ZXMpO1xuXHRpZiAoc2VsZWN0aW9uVmFyaWFudCkge1xuXHRcdGZpbHRlckNvbmRpdGlvbnMgPSBnZXRGaWx0ZXJzQ29uZGl0aW9uc0Zyb21TZWxlY3Rpb25WYXJpYW50KGVudGl0eVNldFBhdGgsIG9NZXRhTW9kZWwsIHNlbGVjdGlvblZhcmlhbnQpO1xuXHR9IGVsc2UgaWYgKGRlZmF1bHRGaWx0ZXJzKSB7XG5cdFx0ZmlsdGVyQ29uZGl0aW9ucyA9IGRlZmF1bHRGaWx0ZXJzO1xuXHR9XG5cdGlmIChkZWZhdWx0U2VtYW50aWNEYXRlRmlsdGVycykge1xuXHRcdC8vIG9ubHkgZm9yIHNlbWFudGljIGRhdGU6XG5cdFx0Ly8gMS4gdmFsdWUgZnJvbSBtYW5pZmVzdCBnZXQgbWVyZ2VkIHdpdGggU1Zcblx0XHQvLyAyLiBtYW5pZmVzdCB2YWx1ZSBpcyBnaXZlbiBwcmVmZXJlbmNlIHdoZW4gdGhlcmUgaXMgc2FtZSBzZW1hbnRpYyBkYXRlIHByb3BlcnR5IGluIFNWIGFuZCBtYW5pZmVzdFxuXHRcdGZpbHRlckNvbmRpdGlvbnMgPSB7IC4uLmZpbHRlckNvbmRpdGlvbnMsIC4uLmRlZmF1bHRTZW1hbnRpY0RhdGVGaWx0ZXJzIH07XG5cdH1cblx0aWYgKGVkaXRTdGF0ZUZpbHRlcikge1xuXHRcdGZpbHRlckNvbmRpdGlvbnMgPSB7IC4uLmZpbHRlckNvbmRpdGlvbnMsIC4uLmVkaXRTdGF0ZUZpbHRlciB9O1xuXHR9XG5cdHJldHVybiAoT2JqZWN0LmtleXMoZmlsdGVyQ29uZGl0aW9ucykubGVuZ3RoID4gMCA/IEpTT04uc3RyaW5naWZ5KGZpbHRlckNvbmRpdGlvbnMpLnJlcGxhY2UoLyhbXFx7XFx9XSkvZywgXCJcXFxcJDFcIikgOiB1bmRlZmluZWQpIGFzIGFueTtcbn1cblxuZ2V0RmlsdGVyQ29uZGl0aW9ucy5yZXF1aXJlc0lDb250ZXh0ID0gdHJ1ZTtcbiJdfQ==