@sapui5/sap.fe.templates 1.146.0 → 1.148.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 (102) hide show
  1. package/package.json +1 -1
  2. package/src/sap/fe/templates/.library +1 -1
  3. package/src/sap/fe/templates/AnalyticalListPage/manifest.json +1 -1
  4. package/src/sap/fe/templates/ListReport/ExtensionAPI.js +1 -1
  5. package/src/sap/fe/templates/ListReport/ExtensionAPI.ts +1 -1
  6. package/src/sap/fe/templates/ListReport/ListReport.view.xml +45 -10
  7. package/src/sap/fe/templates/ListReport/ListReportController.controller.js +43 -16
  8. package/src/sap/fe/templates/ListReport/ListReportController.controller.ts +51 -15
  9. package/src/sap/fe/templates/ListReport/ListReportTemplating.js +39 -3
  10. package/src/sap/fe/templates/ListReport/ListReportTemplating.ts +35 -1
  11. package/src/sap/fe/templates/ListReport/controls/MultipleModeControl.js +4 -1
  12. package/src/sap/fe/templates/ListReport/controls/MultipleModeControl.ts +3 -0
  13. package/src/sap/fe/templates/ListReport/manifest.json +1 -1
  14. package/src/sap/fe/templates/ListReport/overrides/MessageHandler.js +3 -2
  15. package/src/sap/fe/templates/ListReport/overrides/MessageHandler.ts +2 -1
  16. package/src/sap/fe/templates/ObjectPage/Component.js +4 -2
  17. package/src/sap/fe/templates/ObjectPage/Component.ts +3 -1
  18. package/src/sap/fe/templates/ObjectPage/ExtensionAPI.js +163 -28
  19. package/src/sap/fe/templates/ObjectPage/ExtensionAPI.ts +163 -23
  20. package/src/sap/fe/templates/ObjectPage/ObjectPageController.controller.js +246 -35
  21. package/src/sap/fe/templates/ObjectPage/ObjectPageController.controller.ts +286 -42
  22. package/src/sap/fe/templates/ObjectPage/ObjectPageTemplating.js +32 -16
  23. package/src/sap/fe/templates/ObjectPage/ObjectPageTemplating.ts +46 -33
  24. package/src/sap/fe/templates/ObjectPage/components/CollaborationDiscardDialog.js +4 -1
  25. package/src/sap/fe/templates/ObjectPage/components/CollaborationDiscardDialog.tsx +1 -0
  26. package/src/sap/fe/templates/ObjectPage/components/CollaborationDraft.js +15 -4
  27. package/src/sap/fe/templates/ObjectPage/components/CollaborationDraft.tsx +11 -2
  28. package/src/sap/fe/templates/ObjectPage/controls/StashableHBox.js +28 -1
  29. package/src/sap/fe/templates/ObjectPage/controls/StashableHBox.ts +31 -0
  30. package/src/sap/fe/templates/ObjectPage/helpers/SectionNavigationHelper.js +72 -0
  31. package/src/sap/fe/templates/ObjectPage/helpers/SectionNavigationHelper.ts +75 -0
  32. package/src/sap/fe/templates/ObjectPage/manifest.json +1 -15
  33. package/src/sap/fe/templates/ObjectPage/overrides/CollaborationManager.js +29 -20
  34. package/src/sap/fe/templates/ObjectPage/overrides/CollaborationManager.ts +28 -21
  35. package/src/sap/fe/templates/ObjectPage/overrides/IntentBasedNavigation.js +4 -3
  36. package/src/sap/fe/templates/ObjectPage/overrides/IntentBasedNavigation.ts +4 -4
  37. package/src/sap/fe/templates/ObjectPage/overrides/Share.js +2 -2
  38. package/src/sap/fe/templates/ObjectPage/overrides/Share.ts +1 -1
  39. package/src/sap/fe/templates/ObjectPage/overrides/ViewState.js +93 -17
  40. package/src/sap/fe/templates/ObjectPage/overrides/ViewState.ts +108 -22
  41. package/src/sap/fe/templates/ObjectPage/view/fragments/Actions.fragment.xml +12 -2
  42. package/src/sap/fe/templates/ObjectPage/view/fragments/EmphasizedFirstHeaderAction.fragment.xml +182 -0
  43. package/src/sap/fe/templates/ObjectPage/view/fragments/ExpandedHeading.fragment.xml +4 -4
  44. package/src/sap/fe/templates/ObjectPage/view/fragments/Heading.fragment.xml +4 -4
  45. package/src/sap/fe/templates/ObjectPage/view/fragments/ObjectPageHeaderAddress.fragment.xml +1 -1
  46. package/src/sap/fe/templates/ObjectPage/view/fragments/ObjectPageHeaderContact.fragment.xml +1 -1
  47. package/src/sap/fe/templates/ObjectPage/view/fragments/ObjectPageHeaderForm.fragment.xml +1 -0
  48. package/src/sap/fe/templates/ObjectPage/view/fragments/Section.fragment.xml +2 -0
  49. package/src/sap/fe/templates/ObjectPage/view/fragments/SectionContent.fragment.xml +18 -12
  50. package/src/sap/fe/templates/ObjectPage/view/fragments/SectionFormContent.fragment.xml +2 -0
  51. package/src/sap/fe/templates/ObjectPage/view/fragments/SectionMoreFormContent.fragment.xml +2 -0
  52. package/src/sap/fe/templates/library.js +1 -1
  53. package/src/sap/fe/templates/messagebundle.properties +1 -1
  54. package/src/sap/fe/templates/messagebundle_ar.properties +1 -1
  55. package/src/sap/fe/templates/messagebundle_bg.properties +1 -1
  56. package/src/sap/fe/templates/messagebundle_ca.properties +1 -1
  57. package/src/sap/fe/templates/messagebundle_cnr.properties +1 -1
  58. package/src/sap/fe/templates/messagebundle_cs.properties +1 -1
  59. package/src/sap/fe/templates/messagebundle_cy.properties +1 -1
  60. package/src/sap/fe/templates/messagebundle_da.properties +1 -1
  61. package/src/sap/fe/templates/messagebundle_de.properties +1 -1
  62. package/src/sap/fe/templates/messagebundle_el.properties +1 -1
  63. package/src/sap/fe/templates/messagebundle_en.properties +1 -1
  64. package/src/sap/fe/templates/messagebundle_en_GB.properties +1 -1
  65. package/src/sap/fe/templates/messagebundle_en_US_saprigi.properties +1 -1
  66. package/src/sap/fe/templates/messagebundle_es.properties +1 -1
  67. package/src/sap/fe/templates/messagebundle_es_MX.properties +1 -1
  68. package/src/sap/fe/templates/messagebundle_et.properties +1 -1
  69. package/src/sap/fe/templates/messagebundle_fi.properties +1 -1
  70. package/src/sap/fe/templates/messagebundle_fr.properties +1 -1
  71. package/src/sap/fe/templates/messagebundle_fr_CA.properties +1 -1
  72. package/src/sap/fe/templates/messagebundle_hi.properties +1 -1
  73. package/src/sap/fe/templates/messagebundle_hr.properties +1 -1
  74. package/src/sap/fe/templates/messagebundle_hu.properties +1 -1
  75. package/src/sap/fe/templates/messagebundle_id.properties +1 -1
  76. package/src/sap/fe/templates/messagebundle_it.properties +1 -1
  77. package/src/sap/fe/templates/messagebundle_iw.properties +2 -2
  78. package/src/sap/fe/templates/messagebundle_ja.properties +1 -1
  79. package/src/sap/fe/templates/messagebundle_kk.properties +1 -1
  80. package/src/sap/fe/templates/messagebundle_ko.properties +1 -1
  81. package/src/sap/fe/templates/messagebundle_lt.properties +1 -1
  82. package/src/sap/fe/templates/messagebundle_lv.properties +1 -1
  83. package/src/sap/fe/templates/messagebundle_mk.properties +1 -1
  84. package/src/sap/fe/templates/messagebundle_ms.properties +1 -1
  85. package/src/sap/fe/templates/messagebundle_nl.properties +1 -1
  86. package/src/sap/fe/templates/messagebundle_no.properties +2 -2
  87. package/src/sap/fe/templates/messagebundle_pl.properties +1 -1
  88. package/src/sap/fe/templates/messagebundle_pt.properties +1 -1
  89. package/src/sap/fe/templates/messagebundle_pt_PT.properties +1 -1
  90. package/src/sap/fe/templates/messagebundle_ro.properties +1 -1
  91. package/src/sap/fe/templates/messagebundle_ru.properties +1 -1
  92. package/src/sap/fe/templates/messagebundle_sh.properties +1 -1
  93. package/src/sap/fe/templates/messagebundle_sk.properties +1 -1
  94. package/src/sap/fe/templates/messagebundle_sl.properties +1 -1
  95. package/src/sap/fe/templates/messagebundle_sr.properties +1 -1
  96. package/src/sap/fe/templates/messagebundle_sv.properties +1 -1
  97. package/src/sap/fe/templates/messagebundle_th.properties +1 -1
  98. package/src/sap/fe/templates/messagebundle_tr.properties +1 -1
  99. package/src/sap/fe/templates/messagebundle_uk.properties +3 -3
  100. package/src/sap/fe/templates/messagebundle_vi.properties +1 -1
  101. package/src/sap/fe/templates/messagebundle_zh_CN.properties +1 -1
  102. package/src/sap/fe/templates/messagebundle_zh_TW.properties +1 -1
@@ -2,33 +2,109 @@
2
2
  * SAP UI development toolkit for HTML5 (SAPUI5)
3
3
  * (c) Copyright 2009-2026 SAP SE. All rights reserved
4
4
  */
5
- sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/helpers/KeepAliveHelper", "sap/fe/core/helpers/ModelHelper", "sap/fe/core/library"], function (Log, CommonUtils, KeepAliveHelper, ModelHelper, CoreLibrary) {
5
+ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/helpers/KeepAliveHelper", "sap/fe/core/helpers/ModelHelper", "sap/fe/core/library", "sap/fe/templates/ObjectPage/helpers/SectionNavigationHelper"], function (Log, CommonUtils, KeepAliveHelper, ModelHelper, CoreLibrary, SectionNavigationHelper) {
6
6
  "use strict";
7
7
 
8
+ var pollForSectionStability = SectionNavigationHelper.pollForSectionStability;
8
9
  const VariantManagement = CoreLibrary.VariantManagement;
9
10
  const opControlHandlers = {
10
11
  retrieve: function (oOPLayout) {
12
+ const controller = this.getView().getController();
13
+ // Get subsection from controller's stored target subsection (set by onNavigateChange or targetControlId navigation)
14
+ const targetSubSection = controller.targetSubSection;
15
+ const selectedSection = oOPLayout.getSelectedSection();
16
+ const selectedSubSection = targetSubSection?.getId() ?? null;
11
17
  return {
12
- selectedSection: oOPLayout.getSelectedSection()
18
+ selectedSection,
19
+ selectedSubSection
13
20
  };
14
21
  },
15
22
  apply: function (opLayout, controlState) {
16
23
  const selectedSection = controlState?.selectedSection;
17
- if (selectedSection) {
18
- const opSectionToSelect = opLayout.getSections().find(section => section.getId() === selectedSection);
19
- if (opSectionToSelect?.getVisible() === false) {
20
- const controller = this.getView().getController();
21
- controller.pageReady.waitPageReady().then(function () {
22
- opLayout.setSelectedSection(selectedSection);
23
- return undefined;
24
- }).catch(err => {
25
- const message = err instanceof Error ? err.message : String(err);
26
- Log.error(`FE V4 : OP : ViewState : ObjectPageLayout state couldn't be applied : ${message}`);
27
- });
28
- } else {
29
- opLayout.setSelectedSection(selectedSection);
30
- }
24
+ const selectedSubSection = controlState?.selectedSubSection;
25
+ if (!selectedSection) {
26
+ return;
31
27
  }
28
+
29
+ // Check if the selected section is a section or subsection
30
+ const opSectionToSelect = opLayout.getSections().find(section => section.getId() === selectedSection);
31
+ const isSubSectionId = !opSectionToSelect && this.getView().byId(selectedSection)?.isA("sap.uxap.ObjectPageSubSection");
32
+ const controller = this.getView().getController();
33
+
34
+ // Determine the target to navigate to: prefer subsection if available
35
+ const navigationTarget = selectedSubSection ?? selectedSection;
36
+ const isNavigatingToSubSection = !!selectedSubSection || isSubSectionId;
37
+
38
+ // Determine target section ID for comparison (needed before pageReady)
39
+ const getTargetSectionId = () => {
40
+ if (isSubSectionId) {
41
+ return opLayout.getSections().find(s => s.getSubSections().some(ss => ss.getId() === navigationTarget))?.getId();
42
+ }
43
+ return selectedSection;
44
+ };
45
+
46
+ // Wait for pageReady, then navigate and poll for UX rules reset
47
+ controller.pageReady.waitPageReady().then(async () => {
48
+ const targetSectionId = getTargetSectionId();
49
+
50
+ // Skip if no valid target section (e.g., subsection's parent no longer exists)
51
+ // or already on target section - no navigation or polling needed
52
+ if (!targetSectionId || opLayout.getSelectedSection() === targetSectionId) {
53
+ return;
54
+ }
55
+ const performNavigation = () => {
56
+ // Guard: don't navigate if ObjectPageLayout has been destroyed
57
+ if (!opLayout.getDomRef()) {
58
+ return;
59
+ }
60
+
61
+ // Guard: don't navigate if already on target section
62
+ const currentSection = opLayout.getSelectedSection();
63
+ if (currentSection === targetSectionId) {
64
+ return;
65
+ }
66
+ if (isNavigatingToSubSection) {
67
+ // For subsection navigation, use navigateToSubSection which handles parent section activation
68
+ const localId = controller.getView().getLocalId(navigationTarget);
69
+ if (localId) {
70
+ controller.getExtensionAPI().navigateToSubSection(localId);
71
+ } else {
72
+ opLayout.scrollToSection(navigationTarget, 0);
73
+ }
74
+ } else if (opSectionToSelect && opSectionToSelect.getVisible() === true) {
75
+ // For section IDs, navigate if section is visible
76
+ opLayout.scrollToSection(selectedSection, 0);
77
+ }
78
+ };
79
+
80
+ // Skip navigation and polling on subsequent loads - only restore section during initial load
81
+ // This prevents overriding user's manual tab selection when state is restored later
82
+ const controllerWithFlag = controller;
83
+ if (controllerWithFlag.hasInitialLoadCompleted === true) {
84
+ return;
85
+ }
86
+
87
+ // Navigate immediately
88
+ performNavigation();
89
+
90
+ // Skip polling if already on target section
91
+ if (opLayout.getSelectedSection() === targetSectionId) {
92
+ return;
93
+ }
94
+
95
+ // Poll to detect UX rules reset during initial load
96
+ // Uses shared utility from helpers/SectionNavigationHelper.ts
97
+ await pollForSectionStability({
98
+ getSelectedSection: () => opLayout.getSelectedSection(),
99
+ targetSectionId,
100
+ onResetDetected: performNavigation,
101
+ guardCheck: () => !!opLayout.getDomRef()
102
+ });
103
+ return; // Required by linter rule promise/always-return
104
+ }).catch(() => {
105
+ // ViewState: ObjectPageLayout section state couldn't be applied
106
+ // Don't re-throw - allow page to continue even if navigation fails
107
+ });
32
108
  },
33
109
  refreshBinding: function (oOPLayout) {
34
110
  const oBindingContext = oOPLayout.getBindingContext();
@@ -160,4 +236,4 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/helpers/K
160
236
  };
161
237
  return ViewStateExtensionOverride;
162
238
  }, false);
163
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJWYXJpYW50TWFuYWdlbWVudCIsIkNvcmVMaWJyYXJ5Iiwib3BDb250cm9sSGFuZGxlcnMiLCJyZXRyaWV2ZSIsIm9PUExheW91dCIsInNlbGVjdGVkU2VjdGlvbiIsImdldFNlbGVjdGVkU2VjdGlvbiIsImFwcGx5Iiwib3BMYXlvdXQiLCJjb250cm9sU3RhdGUiLCJvcFNlY3Rpb25Ub1NlbGVjdCIsImdldFNlY3Rpb25zIiwiZmluZCIsInNlY3Rpb24iLCJnZXRJZCIsImdldFZpc2libGUiLCJjb250cm9sbGVyIiwiZ2V0VmlldyIsImdldENvbnRyb2xsZXIiLCJwYWdlUmVhZHkiLCJ3YWl0UGFnZVJlYWR5IiwidGhlbiIsInNldFNlbGVjdGVkU2VjdGlvbiIsInVuZGVmaW5lZCIsImNhdGNoIiwiZXJyIiwibWVzc2FnZSIsIkVycm9yIiwiU3RyaW5nIiwiTG9nIiwiZXJyb3IiLCJyZWZyZXNoQmluZGluZyIsIm9CaW5kaW5nQ29udGV4dCIsImdldEJpbmRpbmdDb250ZXh0Iiwib0JpbmRpbmciLCJnZXRCaW5kaW5nIiwic01ldGFQYXRoIiwiTW9kZWxIZWxwZXIiLCJnZXRNZXRhUGF0aEZvckNvbnRleHQiLCJzU3RyYXRlZ3kiLCJLZWVwQWxpdmVIZWxwZXIiLCJnZXRDb250cm9sUmVmcmVzaFN0cmF0ZWd5Rm9yQ29udGV4dFBhdGgiLCJvTW9kZWwiLCJnZXRNb2RlbCIsIm9NZXRhTW9kZWwiLCJnZXRNZXRhTW9kZWwiLCJvTmF2aWdhdGlvblByb3BlcnRpZXMiLCJDb21tb25VdGlscyIsImdldENvbnRleHRQYXRoUHJvcGVydGllcyIsIiRraW5kIiwiYU5hdlByb3BlcnRpZXNUb1JlcXVlc3QiLCJPYmplY3QiLCJrZXlzIiwicmVkdWNlIiwiYVByZXYiLCJzTmF2UHJvcCIsIiRpc0NvbGxlY3Rpb24iLCJwdXNoIiwiJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgiLCJhUHJvcGVydGllcyIsIiRQcm9wZXJ0eVBhdGgiLCJzR3JvdXBJZCIsImdldEdyb3VwSWQiLCJyZXF1ZXN0U2lkZUVmZmVjdHMiLCJjb25jYXQiLCJyZWZyZXNoIiwiaW5mbyIsIlZpZXdTdGF0ZUV4dGVuc2lvbk92ZXJyaWRlIiwiX2dldE9iamVjdFBhZ2VMYXlvdXQiLCJ2aWV3IiwiX2dldE9iamVjdFBhZ2VMYXlvdXRDb250cm9sIiwiX2dldE9QU3RhdGVIYW5kbGVyIiwiY29udHJvbCIsInZpZXdPUCIsImNhbGwiLCJfZ2V0T1BSZWZyZXNoSGFuZGxlciIsImFkYXB0Q29udHJvbFN0YXRlSGFuZGxlciIsImNvbnRyb2xTdGF0ZUhhbmRsZXJzIiwib3BTdGF0ZUhhbmRsZXIiLCJhZGFwdEJpbmRpbmdSZWZyZXNoSGFuZGxlciIsImNvbnRyb2xSZWZyZXNoSGFuZGxlcnMiLCJhcHBseUluaXRpYWxTdGF0ZU9ubHkiLCJhZGFwdFN0YXRlQ29udHJvbHMiLCJhU3RhdGVDb250cm9scyIsIm9WaWV3IiwiYmFzZSIsIm9WaWV3RGF0YSIsImdldFZpZXdEYXRhIiwidmFyaWFudE1hbmFnZW1lbnQiLCJDb250cm9sIiwiUGFnZSIsIk5vbmUiLCJieUlkIiwiYWRhcHRCaW5kaW5nUmVmcmVzaENvbnRyb2xzIiwiYUNvbnRyb2xzIiwic1JlZnJlc2hTdHJhdGVneSIsImdldFZpZXdSZWZyZXNoSW5mbyIsIm9Db250cm9sbGVyIiwiYUNvbnRyb2xzVG9SZWZyZXNoIiwib09iamVjdFBhZ2VDb250cm9sIiwiYVZpZXdDb250cm9scyIsIl9maW5kVGFibGVzIiwiZ2V0Q29udHJvbHNGb3JSZWZyZXNoIiwiYVByZXZDb250cm9scyIsIm9Db250cm9sIiwiaW5jbHVkZXMiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIlZpZXdTdGF0ZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCBDb21tb25VdGlscyBmcm9tIFwic2FwL2ZlL2NvcmUvQ29tbW9uVXRpbHNcIjtcbmltcG9ydCB0eXBlIFZpZXdTdGF0ZSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvVmlld1N0YXRlXCI7XG5pbXBvcnQgeyB0eXBlIENvbnRyb2xTdGF0ZUhhbmRsZXIgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvVmlld1N0YXRlXCI7XG5pbXBvcnQgS2VlcEFsaXZlSGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0tlZXBBbGl2ZUhlbHBlclwiO1xuaW1wb3J0IE1vZGVsSGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01vZGVsSGVscGVyXCI7XG5pbXBvcnQgQ29yZUxpYnJhcnkgZnJvbSBcInNhcC9mZS9jb3JlL2xpYnJhcnlcIjtcbmltcG9ydCB0eXBlIE9iamVjdFBhZ2VDb250cm9sbGVyIGZyb20gXCJzYXAvZmUvdGVtcGxhdGVzL09iamVjdFBhZ2UvT2JqZWN0UGFnZUNvbnRyb2xsZXIuY29udHJvbGxlclwiO1xuaW1wb3J0IHR5cGUgTWFuYWdlZE9iamVjdCBmcm9tIFwic2FwL3VpL2Jhc2UvTWFuYWdlZE9iamVjdFwiO1xuaW1wb3J0IHR5cGUgQ29udHJvbCBmcm9tIFwic2FwL3VpL2NvcmUvQ29udHJvbFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFWNENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgdHlwZSBPYmplY3RQYWdlTGF5b3V0IGZyb20gXCJzYXAvdXhhcC9PYmplY3RQYWdlTGF5b3V0XCI7XG5pbXBvcnQgdHlwZSBPYmplY3RQYWdlU2VjdGlvbiBmcm9tIFwic2FwL3V4YXAvT2JqZWN0UGFnZVNlY3Rpb25cIjtcbmltcG9ydCB0eXBlIHsgTWV0YU1vZGVsTmF2UHJvcGVydHkgfSBmcm9tIFwidHlwZXMvbWV0YW1vZGVsX3R5cGVzXCI7XG5cbmNvbnN0IFZhcmlhbnRNYW5hZ2VtZW50ID0gQ29yZUxpYnJhcnkuVmFyaWFudE1hbmFnZW1lbnQ7XG5leHBvcnQgdHlwZSBPYmplY3RQYWdlU3RhdGUgPSB7IHNlbGVjdGVkU2VjdGlvbjogc3RyaW5nIHwgbnVsbCB9O1xuXG5jb25zdCBvcENvbnRyb2xIYW5kbGVycyA9IHtcblx0cmV0cmlldmU6IGZ1bmN0aW9uIChvT1BMYXlvdXQ6IE9iamVjdFBhZ2VMYXlvdXQpOiBPYmplY3RQYWdlU3RhdGUge1xuXHRcdHJldHVybiB7XG5cdFx0XHRzZWxlY3RlZFNlY3Rpb246IG9PUExheW91dC5nZXRTZWxlY3RlZFNlY3Rpb24oKVxuXHRcdH07XG5cdH0sXG5cdGFwcGx5OiBmdW5jdGlvbiAodGhpczogVmlld1N0YXRlLCBvcExheW91dDogT2JqZWN0UGFnZUxheW91dCwgY29udHJvbFN0YXRlPzogeyBzZWxlY3RlZFNlY3Rpb246IHN0cmluZyB8IG51bGwgfSk6IHZvaWQge1xuXHRcdGNvbnN0IHNlbGVjdGVkU2VjdGlvbiA9IGNvbnRyb2xTdGF0ZT8uc2VsZWN0ZWRTZWN0aW9uO1xuXHRcdGlmIChzZWxlY3RlZFNlY3Rpb24pIHtcblx0XHRcdGNvbnN0IG9wU2VjdGlvblRvU2VsZWN0ID0gb3BMYXlvdXQuZ2V0U2VjdGlvbnMoKS5maW5kKChzZWN0aW9uOiBPYmplY3RQYWdlU2VjdGlvbikgPT4gc2VjdGlvbi5nZXRJZCgpID09PSBzZWxlY3RlZFNlY3Rpb24pO1xuXHRcdFx0aWYgKG9wU2VjdGlvblRvU2VsZWN0Py5nZXRWaXNpYmxlKCkgPT09IGZhbHNlKSB7XG5cdFx0XHRcdGNvbnN0IGNvbnRyb2xsZXIgPSB0aGlzLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgT2JqZWN0UGFnZUNvbnRyb2xsZXI7XG5cdFx0XHRcdGNvbnRyb2xsZXIucGFnZVJlYWR5XG5cdFx0XHRcdFx0LndhaXRQYWdlUmVhZHkoKVxuXHRcdFx0XHRcdC50aGVuKGZ1bmN0aW9uICgpOiB2b2lkIHtcblx0XHRcdFx0XHRcdG9wTGF5b3V0LnNldFNlbGVjdGVkU2VjdGlvbihzZWxlY3RlZFNlY3Rpb24pO1xuXHRcdFx0XHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdC5jYXRjaCgoZXJyOiB1bmtub3duKTogdm9pZCA9PiB7XG5cdFx0XHRcdFx0XHRjb25zdCBtZXNzYWdlID0gZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpO1xuXHRcdFx0XHRcdFx0TG9nLmVycm9yKGBGRSBWNCA6IE9QIDogVmlld1N0YXRlIDogT2JqZWN0UGFnZUxheW91dCBzdGF0ZSBjb3VsZG4ndCBiZSBhcHBsaWVkIDogJHttZXNzYWdlfWApO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0b3BMYXlvdXQuc2V0U2VsZWN0ZWRTZWN0aW9uKHNlbGVjdGVkU2VjdGlvbik7XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXHRyZWZyZXNoQmluZGluZzogZnVuY3Rpb24gKG9PUExheW91dDogT2JqZWN0UGFnZUxheW91dCk6IHZvaWQge1xuXHRcdGNvbnN0IG9CaW5kaW5nQ29udGV4dCA9IG9PUExheW91dC5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIE9EYXRhVjRDb250ZXh0IHwgdW5kZWZpbmVkO1xuXHRcdGNvbnN0IG9CaW5kaW5nID0gb0JpbmRpbmdDb250ZXh0ICYmIG9CaW5kaW5nQ29udGV4dC5nZXRCaW5kaW5nKCk7XG5cdFx0aWYgKG9CaW5kaW5nKSB7XG5cdFx0XHRjb25zdCBzTWV0YVBhdGggPSBNb2RlbEhlbHBlci5nZXRNZXRhUGF0aEZvckNvbnRleHQob0JpbmRpbmdDb250ZXh0KTtcblx0XHRcdGNvbnN0IHNTdHJhdGVneSA9IEtlZXBBbGl2ZUhlbHBlci5nZXRDb250cm9sUmVmcmVzaFN0cmF0ZWd5Rm9yQ29udGV4dFBhdGgob09QTGF5b3V0LCBzTWV0YVBhdGgpO1xuXHRcdFx0aWYgKHNTdHJhdGVneSA9PT0gXCJzZWxmXCIpIHtcblx0XHRcdFx0Ly8gUmVmcmVzaCBtYWluIGNvbnRleHQgYW5kIDEtMSBuYXZpZ2F0aW9uIHByb3BlcnRpZXMgb3IgT1Bcblx0XHRcdFx0Y29uc3Qgb01vZGVsID0gb0JpbmRpbmdDb250ZXh0LmdldE1vZGVsKCksXG5cdFx0XHRcdFx0b01ldGFNb2RlbCA9IG9Nb2RlbC5nZXRNZXRhTW9kZWwoKSxcblx0XHRcdFx0XHRvTmF2aWdhdGlvblByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIE1ldGFNb2RlbE5hdlByb3BlcnR5PiA9XG5cdFx0XHRcdFx0XHQoQ29tbW9uVXRpbHMuZ2V0Q29udGV4dFBhdGhQcm9wZXJ0aWVzKG9NZXRhTW9kZWwsIHNNZXRhUGF0aCwge1xuXHRcdFx0XHRcdFx0XHQka2luZDogXCJOYXZpZ2F0aW9uUHJvcGVydHlcIlxuXHRcdFx0XHRcdFx0fSkgYXMgUmVjb3JkPHN0cmluZywgTWV0YU1vZGVsTmF2UHJvcGVydHk+KSB8fCB7fSxcblx0XHRcdFx0XHRhTmF2UHJvcGVydGllc1RvUmVxdWVzdCA9IE9iamVjdC5rZXlzKG9OYXZpZ2F0aW9uUHJvcGVydGllcykucmVkdWNlKGZ1bmN0aW9uIChcblx0XHRcdFx0XHRcdGFQcmV2OiB7ICROYXZpZ2F0aW9uUHJvcGVydHlQYXRoOiBzdHJpbmcgfVtdLFxuXHRcdFx0XHRcdFx0c05hdlByb3A6IHN0cmluZ1xuXHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0aWYgKG9OYXZpZ2F0aW9uUHJvcGVydGllc1tzTmF2UHJvcF0uJGlzQ29sbGVjdGlvbiAhPT0gdHJ1ZSkge1xuXHRcdFx0XHRcdFx0XHRhUHJldi5wdXNoKHsgJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGg6IHNOYXZQcm9wIH0pO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0cmV0dXJuIGFQcmV2O1xuXHRcdFx0XHRcdH0sIFtdKSxcblx0XHRcdFx0XHRhUHJvcGVydGllczogKHsgJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGg6IHN0cmluZyB9IHwgeyAkUHJvcGVydHlQYXRoOiBzdHJpbmcgfSlbXSA9IFt7ICRQcm9wZXJ0eVBhdGg6IFwiKlwiIH1dLFxuXHRcdFx0XHRcdHNHcm91cElkID0gb0JpbmRpbmcuZ2V0R3JvdXBJZCgpO1xuXG5cdFx0XHRcdG9CaW5kaW5nQ29udGV4dC5yZXF1ZXN0U2lkZUVmZmVjdHMoYVByb3BlcnRpZXMuY29uY2F0KGFOYXZQcm9wZXJ0aWVzVG9SZXF1ZXN0KSwgc0dyb3VwSWQpO1xuXHRcdFx0fSBlbHNlIGlmIChzU3RyYXRlZ3kgPT09IFwiaW5jbHVkaW5nRGVwZW5kZW50c1wiKSB7XG5cdFx0XHRcdC8vIENvbXBsZXRlIHJlZnJlc2hcblx0XHRcdFx0b0JpbmRpbmcucmVmcmVzaCgpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRMb2cuaW5mbyhgT2JqZWN0UGFnZTogJHtvT1BMYXlvdXQuZ2V0SWQoKX0gd2FzIG5vdCByZWZyZXNoZWQuIE5vIGJpbmRpbmcgZm91bmQhYCk7XG5cdFx0fVxuXHR9XG59O1xuXG5jb25zdCBWaWV3U3RhdGVFeHRlbnNpb25PdmVycmlkZSA9IHtcblx0X2dldE9iamVjdFBhZ2VMYXlvdXQ6IGZ1bmN0aW9uICh0aGlzOiBWaWV3U3RhdGUpOiBPYmplY3RQYWdlTGF5b3V0IHtcblx0XHRjb25zdCB2aWV3ID0gdGhpcy5nZXRWaWV3KCk7XG5cdFx0Y29uc3QgY29udHJvbGxlciA9IHZpZXcuZ2V0Q29udHJvbGxlcigpIGFzIE9iamVjdFBhZ2VDb250cm9sbGVyO1xuXHRcdHJldHVybiBjb250cm9sbGVyLl9nZXRPYmplY3RQYWdlTGF5b3V0Q29udHJvbCgpO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBHZXQgdGhlIHN0YXRlIGhhbmRsZXIgZm9yIE9iamVjdFBhZ2VMYXlvdXQgaW4gdmlldy5cblx0ICogQHBhcmFtIGNvbnRyb2wgVGhlIGNvbnRyb2wgZm9yIHN0YXRlIGludGVyYWN0aW9uXG5cdCAqIEByZXR1cm5zIFN0YXRlIGhhbmRsZXJcblx0ICovXG5cdF9nZXRPUFN0YXRlSGFuZGxlcjogZnVuY3Rpb24gKFxuXHRcdHRoaXM6IFZpZXdTdGF0ZSxcblx0XHRjb250cm9sOiBNYW5hZ2VkT2JqZWN0XG5cdCk6IENvbnRyb2xTdGF0ZUhhbmRsZXI8T2JqZWN0UGFnZUxheW91dCwgT2JqZWN0UGFnZVN0YXRlPiB8IHVuZGVmaW5lZCB7XG5cdFx0Y29uc3Qgdmlld09QID0gVmlld1N0YXRlRXh0ZW5zaW9uT3ZlcnJpZGUuX2dldE9iamVjdFBhZ2VMYXlvdXQuY2FsbCh0aGlzKTtcblx0XHRpZiAodmlld09QID09PSBjb250cm9sKSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRyZXRyaWV2ZTogb3BDb250cm9sSGFuZGxlcnMucmV0cmlldmUsXG5cdFx0XHRcdGFwcGx5OiBvcENvbnRyb2xIYW5kbGVycy5hcHBseVxuXHRcdFx0fTtcblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIEdldCB0aGUgcmVmcmVzaCBoYW5kbGVyIGZvciBPYmplY3RQYWdlTGF5b3V0IGluIHZpZXcuXG5cdCAqIEBwYXJhbSBjb250cm9sIFRoZSBjb250cm9sIGJlaW5nIHJlZnJlc2hlZFxuXHQgKiBAcmV0dXJucyBSZWZyZXNoIGhhbmRsZXJcblx0ICovXG5cdF9nZXRPUFJlZnJlc2hIYW5kbGVyOiBmdW5jdGlvbiAoXG5cdFx0dGhpczogVmlld1N0YXRlLFxuXHRcdGNvbnRyb2w6IE1hbmFnZWRPYmplY3Rcblx0KTogQ29udHJvbFN0YXRlSGFuZGxlcjxPYmplY3RQYWdlTGF5b3V0LCBPYmplY3RQYWdlU3RhdGU+IHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCB2aWV3T1AgPSBWaWV3U3RhdGVFeHRlbnNpb25PdmVycmlkZS5fZ2V0T2JqZWN0UGFnZUxheW91dC5jYWxsKHRoaXMpO1xuXHRcdGlmICh2aWV3T1AgPT09IGNvbnRyb2wpIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdHJlZnJlc2hCaW5kaW5nOiBvcENvbnRyb2xIYW5kbGVycy5yZWZyZXNoQmluZGluZ1xuXHRcdFx0fTtcblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIFBhc3MgdGhlIHN0YXRlIGhhbmRsZXJzIG9mIG9iamVjdCBwYWdlIHZpZXcgYWNjb3JkaW5nIHRvIHRoZSBjb250cm9sIGluIGNvbmNlcm4uXG5cdCAqIEBwYXJhbSBjb250cm9sIFRoZSBjb250cm9sIGZvciBzdGF0ZSBpbnRlcmFjdGlvblxuXHQgKiBAcGFyYW0gY29udHJvbFN0YXRlSGFuZGxlcnMgU3RhdGUgaGFuZGxlcnNcblx0ICovXG5cdGFkYXB0Q29udHJvbFN0YXRlSGFuZGxlcjogZnVuY3Rpb24gKFxuXHRcdHRoaXM6IFZpZXdTdGF0ZSxcblx0XHRjb250cm9sOiBNYW5hZ2VkT2JqZWN0LFxuXHRcdGNvbnRyb2xTdGF0ZUhhbmRsZXJzOiBDb250cm9sU3RhdGVIYW5kbGVyPE9iamVjdFBhZ2VMYXlvdXQsIE9iamVjdFBhZ2VTdGF0ZT5bXVxuXHQpOiB2b2lkIHtcblx0XHRjb25zdCBvcFN0YXRlSGFuZGxlciA9IFZpZXdTdGF0ZUV4dGVuc2lvbk92ZXJyaWRlLl9nZXRPUFN0YXRlSGFuZGxlci5jYWxsKHRoaXMsIGNvbnRyb2wpO1xuXHRcdGlmIChvcFN0YXRlSGFuZGxlcikge1xuXHRcdFx0Y29udHJvbFN0YXRlSGFuZGxlcnMucHVzaChvcFN0YXRlSGFuZGxlcik7XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBQYXNzIHRoZSByZWZyZXNoIGhhbmRsZXJzIG9mIG9iamVjdCBwYWdlIHZpZXcgYWNjb3JkaW5nIHRvIHRoZSBjb250cm9sIGJlaW5nIHJlZnJlc2hlZC5cblx0ICogQHBhcmFtIGNvbnRyb2wgVGhlIGNvbnRyb2wgYmVpbmcgcmVmcmVzaGVkXG5cdCAqIEBwYXJhbSBjb250cm9sUmVmcmVzaEhhbmRsZXJzIFJlZnJlc2ggaGFuZGxlcnNcblx0ICovXG5cdGFkYXB0QmluZGluZ1JlZnJlc2hIYW5kbGVyOiBmdW5jdGlvbiAoXG5cdFx0dGhpczogVmlld1N0YXRlLFxuXHRcdGNvbnRyb2w6IE1hbmFnZWRPYmplY3QsXG5cdFx0Y29udHJvbFJlZnJlc2hIYW5kbGVyczogQ29udHJvbFN0YXRlSGFuZGxlcjxPYmplY3RQYWdlTGF5b3V0LCBPYmplY3RQYWdlU3RhdGU+XG5cdCk6IHZvaWQge1xuXHRcdGNvbnN0IG9wU3RhdGVIYW5kbGVyID0gVmlld1N0YXRlRXh0ZW5zaW9uT3ZlcnJpZGUuX2dldE9QUmVmcmVzaEhhbmRsZXIuY2FsbCh0aGlzLCBjb250cm9sKTtcblx0XHRpZiAob3BTdGF0ZUhhbmRsZXIpIHtcblx0XHQgICAgY29udHJvbFJlZnJlc2hIYW5kbGVycy5yZWZyZXNoQmluZGluZyA9IG9wU3RhdGVIYW5kbGVyLnJlZnJlc2hCaW5kaW5nO1xuXHRcdH1cblx0fSxcblxuXHRhcHBseUluaXRpYWxTdGF0ZU9ubHk6IGZ1bmN0aW9uICgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH0sXG5cdGFkYXB0U3RhdGVDb250cm9sczogZnVuY3Rpb24gKHRoaXM6IFZpZXdTdGF0ZSwgYVN0YXRlQ29udHJvbHM6IENvbnRyb2xbXSk6IHZvaWQge1xuXHRcdGNvbnN0IG9WaWV3ID0gdGhpcy5iYXNlLmdldFZpZXcoKSxcblx0XHRcdG9WaWV3RGF0YSA9IG9WaWV3LmdldFZpZXdEYXRhKCk7XG5cdFx0c3dpdGNoIChvVmlld0RhdGEudmFyaWFudE1hbmFnZW1lbnQpIHtcblx0XHRcdGNhc2UgVmFyaWFudE1hbmFnZW1lbnQuQ29udHJvbDpcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFZhcmlhbnRNYW5hZ2VtZW50LlBhZ2U6XG5cdFx0XHRjYXNlIFZhcmlhbnRNYW5hZ2VtZW50Lk5vbmU6XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKGB1bmhhbmRsZWQgdmFyaWFudCBzZXR0aW5nOiAke29WaWV3RGF0YS52YXJpYW50TWFuYWdlbWVudH1gKTtcblx0XHR9XG5cblx0XHRhU3RhdGVDb250cm9scy5wdXNoKG9WaWV3LmJ5SWQoXCJmZTo6T2JqZWN0UGFnZVwiKSBhcyBDb250cm9sKTtcblx0fSxcblx0YWRhcHRCaW5kaW5nUmVmcmVzaENvbnRyb2xzOiBmdW5jdGlvbiAodGhpczogVmlld1N0YXRlLCBhQ29udHJvbHM6IENvbnRyb2xbXSk6IENvbnRyb2xbXSB7XG5cdFx0Y29uc3Qgb1ZpZXcgPSB0aGlzLmJhc2UuZ2V0VmlldygpLFxuXHRcdFx0c1JlZnJlc2hTdHJhdGVneSA9IEtlZXBBbGl2ZUhlbHBlci5nZXRWaWV3UmVmcmVzaEluZm8ob1ZpZXcpLFxuXHRcdFx0b0NvbnRyb2xsZXIgPSBvVmlldy5nZXRDb250cm9sbGVyKCk7XG5cdFx0bGV0IGFDb250cm9sc1RvUmVmcmVzaDogQ29udHJvbFtdID0gW107XG5cblx0XHRpZiAoc1JlZnJlc2hTdHJhdGVneSkge1xuXHRcdFx0Y29uc3Qgb09iamVjdFBhZ2VDb250cm9sID0gKG9Db250cm9sbGVyIGFzIE9iamVjdFBhZ2VDb250cm9sbGVyKS5fZ2V0T2JqZWN0UGFnZUxheW91dENvbnRyb2woKTtcblx0XHRcdGFDb250cm9sc1RvUmVmcmVzaC5wdXNoKG9PYmplY3RQYWdlQ29udHJvbCk7XG5cdFx0fVxuXHRcdGlmIChzUmVmcmVzaFN0cmF0ZWd5ICE9PSBcImluY2x1ZGluZ0RlcGVuZGVudHNcIikge1xuXHRcdFx0Y29uc3QgYVZpZXdDb250cm9scyA9IChvQ29udHJvbGxlciBhcyBPYmplY3RQYWdlQ29udHJvbGxlcikuX2ZpbmRUYWJsZXMoKTtcblx0XHRcdGFDb250cm9sc1RvUmVmcmVzaCA9IGFDb250cm9sc1RvUmVmcmVzaC5jb25jYXQoS2VlcEFsaXZlSGVscGVyLmdldENvbnRyb2xzRm9yUmVmcmVzaChvVmlldywgYVZpZXdDb250cm9scykgfHwgW10pO1xuXHRcdH1cblx0XHRyZXR1cm4gYUNvbnRyb2xzVG9SZWZyZXNoLnJlZHVjZShmdW5jdGlvbiAoYVByZXZDb250cm9scywgb0NvbnRyb2wpIHtcblx0XHRcdGlmICghYVByZXZDb250cm9scy5pbmNsdWRlcyhvQ29udHJvbCkpIHtcblx0XHRcdFx0YVByZXZDb250cm9scy5wdXNoKG9Db250cm9sKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBhUHJldkNvbnRyb2xzO1xuXHRcdH0sIGFDb250cm9scyk7XG5cdH1cbn07XG5cbmV4cG9ydCBk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
239
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJWYXJpYW50TWFuYWdlbWVudCIsIkNvcmVMaWJyYXJ5Iiwib3BDb250cm9sSGFuZGxlcnMiLCJyZXRyaWV2ZSIsIm9PUExheW91dCIsImNvbnRyb2xsZXIiLCJnZXRWaWV3IiwiZ2V0Q29udHJvbGxlciIsInRhcmdldFN1YlNlY3Rpb24iLCJzZWxlY3RlZFNlY3Rpb24iLCJnZXRTZWxlY3RlZFNlY3Rpb24iLCJzZWxlY3RlZFN1YlNlY3Rpb24iLCJnZXRJZCIsImFwcGx5Iiwib3BMYXlvdXQiLCJjb250cm9sU3RhdGUiLCJvcFNlY3Rpb25Ub1NlbGVjdCIsImdldFNlY3Rpb25zIiwiZmluZCIsInNlY3Rpb24iLCJpc1N1YlNlY3Rpb25JZCIsImJ5SWQiLCJpc0EiLCJuYXZpZ2F0aW9uVGFyZ2V0IiwiaXNOYXZpZ2F0aW5nVG9TdWJTZWN0aW9uIiwiZ2V0VGFyZ2V0U2VjdGlvbklkIiwicyIsImdldFN1YlNlY3Rpb25zIiwic29tZSIsInNzIiwicGFnZVJlYWR5Iiwid2FpdFBhZ2VSZWFkeSIsInRoZW4iLCJ0YXJnZXRTZWN0aW9uSWQiLCJwZXJmb3JtTmF2aWdhdGlvbiIsImdldERvbVJlZiIsImN1cnJlbnRTZWN0aW9uIiwibG9jYWxJZCIsImdldExvY2FsSWQiLCJnZXRFeHRlbnNpb25BUEkiLCJuYXZpZ2F0ZVRvU3ViU2VjdGlvbiIsInNjcm9sbFRvU2VjdGlvbiIsImdldFZpc2libGUiLCJjb250cm9sbGVyV2l0aEZsYWciLCJoYXNJbml0aWFsTG9hZENvbXBsZXRlZCIsInBvbGxGb3JTZWN0aW9uU3RhYmlsaXR5Iiwib25SZXNldERldGVjdGVkIiwiZ3VhcmRDaGVjayIsImNhdGNoIiwicmVmcmVzaEJpbmRpbmciLCJvQmluZGluZ0NvbnRleHQiLCJnZXRCaW5kaW5nQ29udGV4dCIsIm9CaW5kaW5nIiwiZ2V0QmluZGluZyIsInNNZXRhUGF0aCIsIk1vZGVsSGVscGVyIiwiZ2V0TWV0YVBhdGhGb3JDb250ZXh0Iiwic1N0cmF0ZWd5IiwiS2VlcEFsaXZlSGVscGVyIiwiZ2V0Q29udHJvbFJlZnJlc2hTdHJhdGVneUZvckNvbnRleHRQYXRoIiwib01vZGVsIiwiZ2V0TW9kZWwiLCJvTWV0YU1vZGVsIiwiZ2V0TWV0YU1vZGVsIiwib05hdmlnYXRpb25Qcm9wZXJ0aWVzIiwiQ29tbW9uVXRpbHMiLCJnZXRDb250ZXh0UGF0aFByb3BlcnRpZXMiLCIka2luZCIsImFOYXZQcm9wZXJ0aWVzVG9SZXF1ZXN0IiwiT2JqZWN0Iiwia2V5cyIsInJlZHVjZSIsImFQcmV2Iiwic05hdlByb3AiLCIkaXNDb2xsZWN0aW9uIiwicHVzaCIsIiROYXZpZ2F0aW9uUHJvcGVydHlQYXRoIiwiYVByb3BlcnRpZXMiLCIkUHJvcGVydHlQYXRoIiwic0dyb3VwSWQiLCJnZXRHcm91cElkIiwicmVxdWVzdFNpZGVFZmZlY3RzIiwiY29uY2F0IiwicmVmcmVzaCIsIkxvZyIsImluZm8iLCJWaWV3U3RhdGVFeHRlbnNpb25PdmVycmlkZSIsIl9nZXRPYmplY3RQYWdlTGF5b3V0IiwidmlldyIsIl9nZXRPYmplY3RQYWdlTGF5b3V0Q29udHJvbCIsIl9nZXRPUFN0YXRlSGFuZGxlciIsImNvbnRyb2wiLCJ2aWV3T1AiLCJjYWxsIiwiX2dldE9QUmVmcmVzaEhhbmRsZXIiLCJhZGFwdENvbnRyb2xTdGF0ZUhhbmRsZXIiLCJjb250cm9sU3RhdGVIYW5kbGVycyIsIm9wU3RhdGVIYW5kbGVyIiwiYWRhcHRCaW5kaW5nUmVmcmVzaEhhbmRsZXIiLCJjb250cm9sUmVmcmVzaEhhbmRsZXJzIiwiYXBwbHlJbml0aWFsU3RhdGVPbmx5IiwiYWRhcHRTdGF0ZUNvbnRyb2xzIiwiYVN0YXRlQ29udHJvbHMiLCJvVmlldyIsImJhc2UiLCJvVmlld0RhdGEiLCJnZXRWaWV3RGF0YSIsInZhcmlhbnRNYW5hZ2VtZW50IiwiQ29udHJvbCIsIlBhZ2UiLCJOb25lIiwiRXJyb3IiLCJhZGFwdEJpbmRpbmdSZWZyZXNoQ29udHJvbHMiLCJhQ29udHJvbHMiLCJzUmVmcmVzaFN0cmF0ZWd5IiwiZ2V0Vmlld1JlZnJlc2hJbmZvIiwib0NvbnRyb2xsZXIiLCJhQ29udHJvbHNUb1JlZnJlc2giLCJvT2JqZWN0UGFnZUNvbnRyb2wiLCJhVmlld0NvbnRyb2xzIiwiX2ZpbmRUYWJsZXMiLCJnZXRDb250cm9sc0ZvclJlZnJlc2giLCJhUHJldkNvbnRyb2xzIiwib0NvbnRyb2wiLCJpbmNsdWRlcyJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiVmlld1N0YXRlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IENvbW1vblV0aWxzIGZyb20gXCJzYXAvZmUvY29yZS9Db21tb25VdGlsc1wiO1xuaW1wb3J0IHR5cGUgVmlld1N0YXRlIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9WaWV3U3RhdGVcIjtcbmltcG9ydCB7IHR5cGUgQ29udHJvbFN0YXRlSGFuZGxlciB9IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9WaWV3U3RhdGVcIjtcbmltcG9ydCBLZWVwQWxpdmVIZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvS2VlcEFsaXZlSGVscGVyXCI7XG5pbXBvcnQgTW9kZWxIZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTW9kZWxIZWxwZXJcIjtcbmltcG9ydCBDb3JlTGlicmFyeSBmcm9tIFwic2FwL2ZlL2NvcmUvbGlicmFyeVwiO1xuaW1wb3J0IHsgcG9sbEZvclNlY3Rpb25TdGFiaWxpdHkgfSBmcm9tIFwic2FwL2ZlL3RlbXBsYXRlcy9PYmplY3RQYWdlL2hlbHBlcnMvU2VjdGlvbk5hdmlnYXRpb25IZWxwZXJcIjtcbmltcG9ydCB0eXBlIE9iamVjdFBhZ2VDb250cm9sbGVyIGZyb20gXCJzYXAvZmUvdGVtcGxhdGVzL09iamVjdFBhZ2UvT2JqZWN0UGFnZUNvbnRyb2xsZXIuY29udHJvbGxlclwiO1xuaW1wb3J0IHR5cGUgTWFuYWdlZE9iamVjdCBmcm9tIFwic2FwL3VpL2Jhc2UvTWFuYWdlZE9iamVjdFwiO1xuaW1wb3J0IHR5cGUgQ29udHJvbCBmcm9tIFwic2FwL3VpL2NvcmUvQ29udHJvbFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFWNENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgdHlwZSBPYmplY3RQYWdlTGF5b3V0IGZyb20gXCJzYXAvdXhhcC9PYmplY3RQYWdlTGF5b3V0XCI7XG5pbXBvcnQgdHlwZSBPYmplY3RQYWdlU2VjdGlvbiBmcm9tIFwic2FwL3V4YXAvT2JqZWN0UGFnZVNlY3Rpb25cIjtcbmltcG9ydCB0eXBlIHsgTWV0YU1vZGVsTmF2UHJvcGVydHkgfSBmcm9tIFwidHlwZXMvbWV0YW1vZGVsX3R5cGVzXCI7XG5cbmNvbnN0IFZhcmlhbnRNYW5hZ2VtZW50ID0gQ29yZUxpYnJhcnkuVmFyaWFudE1hbmFnZW1lbnQ7XG5leHBvcnQgdHlwZSBPYmplY3RQYWdlU3RhdGUgPSB7IHNlbGVjdGVkU2VjdGlvbjogc3RyaW5nIHwgbnVsbDsgc2VsZWN0ZWRTdWJTZWN0aW9uPzogc3RyaW5nIHwgbnVsbCB9O1xuXG5jb25zdCBvcENvbnRyb2xIYW5kbGVycyA9IHtcblx0cmV0cmlldmU6IGZ1bmN0aW9uICh0aGlzOiBWaWV3U3RhdGUsIG9PUExheW91dDogT2JqZWN0UGFnZUxheW91dCk6IE9iamVjdFBhZ2VTdGF0ZSB7XG5cdFx0Y29uc3QgY29udHJvbGxlciA9IHRoaXMuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBPYmplY3RQYWdlQ29udHJvbGxlcjtcblx0XHQvLyBHZXQgc3Vic2VjdGlvbiBmcm9tIGNvbnRyb2xsZXIncyBzdG9yZWQgdGFyZ2V0IHN1YnNlY3Rpb24gKHNldCBieSBvbk5hdmlnYXRlQ2hhbmdlIG9yIHRhcmdldENvbnRyb2xJZCBuYXZpZ2F0aW9uKVxuXHRcdGNvbnN0IHRhcmdldFN1YlNlY3Rpb24gPSAoY29udHJvbGxlciBhcyB1bmtub3duIGFzIHsgdGFyZ2V0U3ViU2VjdGlvbj86IHsgZ2V0SWQ6ICgpID0+IHN0cmluZyB9IH0pLnRhcmdldFN1YlNlY3Rpb247XG5cdFx0Y29uc3Qgc2VsZWN0ZWRTZWN0aW9uID0gb09QTGF5b3V0LmdldFNlbGVjdGVkU2VjdGlvbigpO1xuXHRcdGNvbnN0IHNlbGVjdGVkU3ViU2VjdGlvbiA9IHRhcmdldFN1YlNlY3Rpb24/LmdldElkKCkgPz8gbnVsbDtcblx0XHRyZXR1cm4ge1xuXHRcdFx0c2VsZWN0ZWRTZWN0aW9uLFxuXHRcdFx0c2VsZWN0ZWRTdWJTZWN0aW9uXG5cdFx0fTtcblx0fSxcblx0YXBwbHk6IGZ1bmN0aW9uIChcblx0XHR0aGlzOiBWaWV3U3RhdGUsXG5cdFx0b3BMYXlvdXQ6IE9iamVjdFBhZ2VMYXlvdXQsXG5cdFx0Y29udHJvbFN0YXRlPzogeyBzZWxlY3RlZFNlY3Rpb246IHN0cmluZyB8IG51bGw7IHNlbGVjdGVkU3ViU2VjdGlvbj86IHN0cmluZyB8IG51bGwgfVxuXHQpOiB2b2lkIHtcblx0XHRjb25zdCBzZWxlY3RlZFNlY3Rpb24gPSBjb250cm9sU3RhdGU/LnNlbGVjdGVkU2VjdGlvbjtcblx0XHRjb25zdCBzZWxlY3RlZFN1YlNlY3Rpb24gPSBjb250cm9sU3RhdGU/LnNlbGVjdGVkU3ViU2VjdGlvbjtcblxuXHRcdGlmICghc2VsZWN0ZWRTZWN0aW9uKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gQ2hlY2sgaWYgdGhlIHNlbGVjdGVkIHNlY3Rpb24gaXMgYSBzZWN0aW9uIG9yIHN1YnNlY3Rpb25cblx0XHRjb25zdCBvcFNlY3Rpb25Ub1NlbGVjdCA9IG9wTGF5b3V0LmdldFNlY3Rpb25zKCkuZmluZCgoc2VjdGlvbjogT2JqZWN0UGFnZVNlY3Rpb24pID0+IHNlY3Rpb24uZ2V0SWQoKSA9PT0gc2VsZWN0ZWRTZWN0aW9uKTtcblx0XHRjb25zdCBpc1N1YlNlY3Rpb25JZCA9ICFvcFNlY3Rpb25Ub1NlbGVjdCAmJiB0aGlzLmdldFZpZXcoKS5ieUlkKHNlbGVjdGVkU2VjdGlvbik/LmlzQShcInNhcC51eGFwLk9iamVjdFBhZ2VTdWJTZWN0aW9uXCIpO1xuXHRcdGNvbnN0IGNvbnRyb2xsZXIgPSB0aGlzLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgT2JqZWN0UGFnZUNvbnRyb2xsZXI7XG5cblx0XHQvLyBEZXRlcm1pbmUgdGhlIHRhcmdldCB0byBuYXZpZ2F0ZSB0bzogcHJlZmVyIHN1YnNlY3Rpb24gaWYgYXZhaWxhYmxlXG5cdFx0Y29uc3QgbmF2aWdhdGlvblRhcmdldCA9IHNlbGVjdGVkU3ViU2VjdGlvbiA/PyBzZWxlY3RlZFNlY3Rpb247XG5cdFx0Y29uc3QgaXNOYXZpZ2F0aW5nVG9TdWJTZWN0aW9uID0gISFzZWxlY3RlZFN1YlNlY3Rpb24gfHwgaXNTdWJTZWN0aW9uSWQ7XG5cblx0XHQvLyBEZXRlcm1pbmUgdGFyZ2V0IHNlY3Rpb24gSUQgZm9yIGNvbXBhcmlzb24gIChuZWVkZWQgYmVmb3JlIHBhZ2VSZWFkeSlcblx0XHRjb25zdCBnZXRUYXJnZXRTZWN0aW9uSWQgPSAoKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+IHtcblx0XHRcdGlmIChpc1N1YlNlY3Rpb25JZCkge1xuXHRcdFx0XHRyZXR1cm4gb3BMYXlvdXRcblx0XHRcdFx0XHQuZ2V0U2VjdGlvbnMoKVxuXHRcdFx0XHRcdC5maW5kKChzKSA9PiBzLmdldFN1YlNlY3Rpb25zKCkuc29tZSgoc3MpID0+IHNzLmdldElkKCkgPT09IG5hdmlnYXRpb25UYXJnZXQpKVxuXHRcdFx0XHRcdD8uZ2V0SWQoKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBzZWxlY3RlZFNlY3Rpb247XG5cdFx0fTtcblxuXHRcdC8vIFdhaXQgZm9yIHBhZ2VSZWFkeSwgdGhlbiBuYXZpZ2F0ZSBhbmQgcG9sbCBmb3IgVVggcnVsZXMgcmVzZXRcblx0XHRjb250cm9sbGVyLnBhZ2VSZWFkeVxuXHRcdFx0LndhaXRQYWdlUmVhZHkoKVxuXHRcdFx0LnRoZW4oYXN5bmMgKCkgPT4ge1xuXHRcdFx0XHRjb25zdCB0YXJnZXRTZWN0aW9uSWQgPSBnZXRUYXJnZXRTZWN0aW9uSWQoKTtcblxuXHRcdFx0XHQvLyBTa2lwIGlmIG5vIHZhbGlkIHRhcmdldCBzZWN0aW9uIChlLmcuLCBzdWJzZWN0aW9uJ3MgcGFyZW50IG5vIGxvbmdlciBleGlzdHMpXG5cdFx0XHRcdC8vIG9yIGFscmVhZHkgb24gdGFyZ2V0IHNlY3Rpb24gLSBubyBuYXZpZ2F0aW9uIG9yIHBvbGxpbmcgbmVlZGVkXG5cdFx0XHRcdGlmICghdGFyZ2V0U2VjdGlvbklkIHx8IG9wTGF5b3V0LmdldFNlbGVjdGVkU2VjdGlvbigpID09PSB0YXJnZXRTZWN0aW9uSWQpIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjb25zdCBwZXJmb3JtTmF2aWdhdGlvbiA9ICgpOiB2b2lkID0+IHtcblx0XHRcdFx0XHQvLyBHdWFyZDogZG9uJ3QgbmF2aWdhdGUgaWYgT2JqZWN0UGFnZUxheW91dCBoYXMgYmVlbiBkZXN0cm95ZWRcblx0XHRcdFx0XHRpZiAoIW9wTGF5b3V0LmdldERvbVJlZigpKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gR3VhcmQ6IGRvbid0IG5hdmlnYXRlIGlmIGFscmVhZHkgb24gdGFyZ2V0IHNlY3Rpb25cblx0XHRcdFx0XHRjb25zdCBjdXJyZW50U2VjdGlvbiA9IG9wTGF5b3V0LmdldFNlbGVjdGVkU2VjdGlvbigpO1xuXHRcdFx0XHRcdGlmIChjdXJyZW50U2VjdGlvbiA9PT0gdGFyZ2V0U2VjdGlvbklkKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKGlzTmF2aWdhdGluZ1RvU3ViU2VjdGlvbikge1xuXHRcdFx0XHRcdFx0Ly8gRm9yIHN1YnNlY3Rpb24gbmF2aWdhdGlvbiwgdXNlIG5hdmlnYXRlVG9TdWJTZWN0aW9uIHdoaWNoIGhhbmRsZXMgcGFyZW50IHNlY3Rpb24gYWN0aXZhdGlvblxuXHRcdFx0XHRcdFx0Y29uc3QgbG9jYWxJZCA9IGNvbnRyb2xsZXIuZ2V0VmlldygpLmdldExvY2FsSWQobmF2aWdhdGlvblRhcmdldCk7XG5cdFx0XHRcdFx0XHRpZiAobG9jYWxJZCkge1xuXHRcdFx0XHRcdFx0XHRjb250cm9sbGVyLmdldEV4dGVuc2lvbkFQSSgpLm5hdmlnYXRlVG9TdWJTZWN0aW9uKGxvY2FsSWQpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0b3BMYXlvdXQuc2Nyb2xsVG9TZWN0aW9uKG5hdmlnYXRpb25UYXJnZXQsIDApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gZWxzZSBpZiAob3BTZWN0aW9uVG9TZWxlY3QgJiYgb3BTZWN0aW9uVG9TZWxlY3QuZ2V0VmlzaWJsZSgpID09PSB0cnVlKSB7XG5cdFx0XHRcdFx0XHQvLyBGb3Igc2VjdGlvbiBJRHMsIG5hdmlnYXRlIGlmIHNlY3Rpb24gaXMgdmlzaWJsZVxuXHRcdFx0XHRcdFx0b3BMYXlvdXQuc2Nyb2xsVG9TZWN0aW9uKHNlbGVjdGVkU2VjdGlvbiwgMCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9O1xuXG5cdFx0XHRcdC8vIFNraXAgbmF2aWdhdGlvbiBhbmQgcG9sbGluZyBvbiBzdWJzZXF1ZW50IGxvYWRzIC0gb25seSByZXN0b3JlIHNlY3Rpb24gZHVyaW5nIGluaXRpYWwgbG9hZFxuXHRcdFx0XHQvLyBUaGlzIHByZXZlbnRzIG92ZXJyaWRpbmcgdXNlcidzIG1hbnVhbCB0YWIgc2VsZWN0aW9uIHdoZW4gc3RhdGUgaXMgcmVzdG9yZWQgbGF0ZXJcblx0XHRcdFx0Y29uc3QgY29udHJvbGxlcldpdGhGbGFnID0gY29udHJvbGxlciBhcyB1bmtub3duIGFzIHsgaGFzSW5pdGlhbExvYWRDb21wbGV0ZWQ/OiBib29sZWFuIH07XG5cdFx0XHRcdGlmIChjb250cm9sbGVyV2l0aEZsYWcuaGFzSW5pdGlhbExvYWRDb21wbGV0ZWQgPT09IHRydWUpIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBOYXZpZ2F0ZSBpbW1lZGlhdGVseVxuXHRcdFx0XHRwZXJmb3JtTmF2aWdhdGlvbigpO1xuXG5cdFx0XHRcdC8vIFNraXAgcG9sbGluZyBpZiBhbHJlYWR5IG9uIHRhcmdldCBzZWN0aW9uXG5cdFx0XHRcdGlmIChvcExheW91dC5nZXRTZWxlY3RlZFNlY3Rpb24oKSA9PT0gdGFyZ2V0U2VjdGlvbklkKSB7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gUG9sbCB0byBkZXRlY3QgVVggcnVsZXMgcmVzZXQgZHVyaW5nIGluaXRpYWwgbG9hZFxuXHRcdFx0XHQvLyBVc2VzIHNoYXJlZCB1dGlsaXR5IGZyb20gaGVscGVycy9TZWN0aW9uTmF2aWdhdGlvbkhlbHBlci50c1xuXHRcdFx0XHRhd2FpdCBwb2xsRm9yU2VjdGlvblN0YWJpbGl0eSh7XG5cdFx0XHRcdFx0Z2V0U2VsZWN0ZWRTZWN0aW9uOiAoKSA9PiBvcExheW91dC5nZXRTZWxlY3RlZFNlY3Rpb24oKSxcblx0XHRcdFx0XHR0YXJnZXRTZWN0aW9uSWQsXG5cdFx0XHRcdFx0b25SZXNldERldGVjdGVkOiBwZXJmb3JtTmF2aWdhdGlvbixcblx0XHRcdFx0XHRndWFyZENoZWNrOiAoKSA9PiAhIW9wTGF5b3V0LmdldERvbVJlZigpXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRyZXR1cm47IC8vIFJlcXVpcmVkIGJ5IGxpbnRlciBydWxlIHByb21pc2UvYWx3YXlzLXJldHVyblxuXHRcdFx0fSlcblx0XHRcdC5jYXRjaCgoKSA9PiB7XG5cdFx0XHRcdC8vIFZpZXdTdGF0ZTogT2JqZWN0UGFnZUxheW91dCBzZWN0aW9uIHN0YXRlIGNvdWxkbid0IGJlIGFwcGxpZWRcblx0XHRcdFx0Ly8gRG9uJ3QgcmUtdGhyb3cgLSBhbGxvdyBwYWdlIHRvIGNvbnRpbnVlIGV2ZW4gaWYgbmF2aWdhdGlvbiBmYWlsc1xuXHRcdFx0fSk7XG5cdH0sXG5cdHJlZnJlc2hCaW5kaW5nOiBmdW5jdGlvbiAob09QTGF5b3V0OiBPYmplY3RQYWdlTGF5b3V0KTogdm9pZCB7XG5cdFx0Y29uc3Qgb0JpbmRpbmdDb250ZXh0ID0gb09QTGF5b3V0LmdldEJpbmRpbmdDb250ZXh0KCkgYXMgT0RhdGFWNENvbnRleHQgfCB1bmRlZmluZWQ7XG5cdFx0Y29uc3Qgb0JpbmRpbmcgPSBvQmluZGluZ0NvbnRleHQgJiYgb0JpbmRpbmdDb250ZXh0LmdldEJpbmRpbmcoKTtcblx0XHRpZiAob0JpbmRpbmcpIHtcblx0XHRcdGNvbnN0IHNNZXRhUGF0aCA9IE1vZGVsSGVscGVyLmdldE1ldGFQYXRoRm9yQ29udGV4dChvQmluZGluZ0NvbnRleHQpO1xuXHRcdFx0Y29uc3Qgc1N0cmF0ZWd5ID0gS2VlcEFsaXZlSGVscGVyLmdldENvbnRyb2xSZWZyZXNoU3RyYXRlZ3lGb3JDb250ZXh0UGF0aChvT1BMYXlvdXQsIHNNZXRhUGF0aCk7XG5cdFx0XHRpZiAoc1N0cmF0ZWd5ID09PSBcInNlbGZcIikge1xuXHRcdFx0XHQvLyBSZWZyZXNoIG1haW4gY29udGV4dCBhbmQgMS0xIG5hdmlnYXRpb24gcHJvcGVydGllcyBvciBPUFxuXHRcdFx0XHRjb25zdCBvTW9kZWwgPSBvQmluZGluZ0NvbnRleHQuZ2V0TW9kZWwoKSxcblx0XHRcdFx0XHRvTWV0YU1vZGVsID0gb01vZGVsLmdldE1ldGFNb2RlbCgpLFxuXHRcdFx0XHRcdG9OYXZpZ2F0aW9uUHJvcGVydGllczogUmVjb3JkPHN0cmluZywgTWV0YU1vZGVsTmF2UHJvcGVydHk+ID1cblx0XHRcdFx0XHRcdChDb21tb25VdGlscy5nZXRDb250ZXh0UGF0aFByb3BlcnRpZXMob01ldGFNb2RlbCwgc01ldGFQYXRoLCB7XG5cdFx0XHRcdFx0XHRcdCRraW5kOiBcIk5hdmlnYXRpb25Qcm9wZXJ0eVwiXG5cdFx0XHRcdFx0XHR9KSBhcyBSZWNvcmQ8c3RyaW5nLCBNZXRhTW9kZWxOYXZQcm9wZXJ0eT4pIHx8IHt9LFxuXHRcdFx0XHRcdGFOYXZQcm9wZXJ0aWVzVG9SZXF1ZXN0ID0gT2JqZWN0LmtleXMob05hdmlnYXRpb25Qcm9wZXJ0aWVzKS5yZWR1Y2UoZnVuY3Rpb24gKFxuXHRcdFx0XHRcdFx0YVByZXY6IHsgJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGg6IHN0cmluZyB9W10sXG5cdFx0XHRcdFx0XHRzTmF2UHJvcDogc3RyaW5nXG5cdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRpZiAob05hdmlnYXRpb25Qcm9wZXJ0aWVzW3NOYXZQcm9wXS4kaXNDb2xsZWN0aW9uICE9PSB0cnVlKSB7XG5cdFx0XHRcdFx0XHRcdGFQcmV2LnB1c2goeyAkTmF2aWdhdGlvblByb3BlcnR5UGF0aDogc05hdlByb3AgfSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRyZXR1cm4gYVByZXY7XG5cdFx0XHRcdFx0fSwgW10pLFxuXHRcdFx0XHRcdGFQcm9wZXJ0aWVzOiAoeyAkTmF2aWdhdGlvblByb3BlcnR5UGF0aDogc3RyaW5nIH0gfCB7ICRQcm9wZXJ0eVBhdGg6IHN0cmluZyB9KVtdID0gW3sgJFByb3BlcnR5UGF0aDogXCIqXCIgfV0sXG5cdFx0XHRcdFx0c0dyb3VwSWQgPSBvQmluZGluZy5nZXRHcm91cElkKCk7XG5cblx0XHRcdFx0b0JpbmRpbmdDb250ZXh0LnJlcXVlc3RTaWRlRWZmZWN0cyhhUHJvcGVydGllcy5jb25jYXQoYU5hdlByb3BlcnRpZXNUb1JlcXVlc3QpLCBzR3JvdXBJZCk7XG5cdFx0XHR9IGVsc2UgaWYgKHNTdHJhdGVneSA9PT0gXCJpbmNsdWRpbmdEZXBlbmRlbnRzXCIpIHtcblx0XHRcdFx0Ly8gQ29tcGxldGUgcmVmcmVzaFxuXHRcdFx0XHRvQmluZGluZy5yZWZyZXNoKCk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdExvZy5pbmZvKGBPYmplY3RQYWdlOiAke29PUExheW91dC5nZXRJZCgpfSB3YXMgbm90IHJlZnJlc2hlZC4gTm8gYmluZGluZyBmb3VuZCFgKTtcblx0XHR9XG5cdH1cbn07XG5cbmNvbnN0IFZpZXdTdGF0ZUV4dGVuc2lvbk92ZXJyaWRlID0ge1xuXHRfZ2V0T2JqZWN0UGFnZUxheW91dDogZnVuY3Rpb24gKHRoaXM6IFZpZXdTdGF0ZSk6IE9iamVjdFBhZ2VMYXlvdXQge1xuXHRcdGNvbnN0IHZpZXcgPSB0aGlzLmdldFZpZXcoKTtcblx0XHRjb25zdCBjb250cm9sbGVyID0gdmlldy5nZXRDb250cm9sbGVyKCkgYXMgT2JqZWN0UGFnZUNvbnRyb2xsZXI7XG5cdFx0cmV0dXJuIGNvbnRyb2xsZXIuX2dldE9iamVjdFBhZ2VMYXlvdXRDb250cm9sKCk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEdldCB0aGUgc3RhdGUgaGFuZGxlciBmb3IgT2JqZWN0UGFnZUxheW91dCBpbiB2aWV3LlxuXHQgKiBAcGFyYW0gY29udHJvbCBUaGUgY29udHJvbCBmb3Igc3RhdGUgaW50ZXJhY3Rpb25cblx0ICogQHJldHVybnMgU3RhdGUgaGFuZGxlclxuXHQgKi9cblx0X2dldE9QU3RhdGVIYW5kbGVyOiBmdW5jdGlvbiAoXG5cdFx0dGhpczogVmlld1N0YXRlLFxuXHRcdGNvbnRyb2w6IE1hbmFnZWRPYmplY3Rcblx0KTogQ29udHJvbFN0YXRlSGFuZGxlcjxPYmplY3RQYWdlTGF5b3V0LCBPYmplY3RQYWdlU3RhdGU+IHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCB2aWV3T1AgPSBWaWV3U3RhdGVFeHRlbnNpb25PdmVycmlkZS5fZ2V0T2JqZWN0UGFnZUxheW91dC5jYWxsKHRoaXMpO1xuXHRcdGlmICh2aWV3T1AgPT09IGNvbnRyb2wpIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdHJldHJpZXZlOiBvcENvbnRyb2xIYW5kbGVycy5yZXRyaWV2ZSxcblx0XHRcdFx0YXBwbHk6IG9wQ29udHJvbEhhbmRsZXJzLmFwcGx5XG5cdFx0XHR9O1xuXHRcdH1cblx0fSxcblxuXHQvKipcblx0ICogR2V0IHRoZSByZWZyZXNoIGhhbmRsZXIgZm9yIE9iamVjdFBhZ2VMYXlvdXQgaW4gdmlldy5cblx0ICogQHBhcmFtIGNvbnRyb2wgVGhlIGNvbnRyb2wgYmVpbmcgcmVmcmVzaGVkXG5cdCAqIEByZXR1cm5zIFJlZnJlc2ggaGFuZGxlclxuXHQgKi9cblx0X2dldE9QUmVmcmVzaEhhbmRsZXI6IGZ1bmN0aW9uIChcblx0XHR0aGlzOiBWaWV3U3RhdGUsXG5cdFx0Y29udHJvbDogTWFuYWdlZE9iamVjdFxuXHQpOiBDb250cm9sU3RhdGVIYW5kbGVyPE9iamVjdFBhZ2VMYXlvdXQsIE9iamVjdFBhZ2VTdGF0ZT4gfCB1bmRlZmluZWQge1xuXHRcdGNvbnN0IHZpZXdPUCA9IFZpZXdTdGF0ZUV4dGVuc2lvbk92ZXJyaWRlLl9nZXRPYmplY3RQYWdlTGF5b3V0LmNhbGwodGhpcyk7XG5cdFx0aWYgKHZpZXdPUCA9PT0gY29udHJvbCkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0cmVmcmVzaEJpbmRpbmc6IG9wQ29udHJvbEhhbmRsZXJzLnJlZnJlc2hCaW5kaW5nXG5cdFx0XHR9O1xuXHRcdH1cblx0fSxcblxuXHQvKipcblx0ICogUGFzcyB0aGUgc3RhdGUgaGFuZGxlcnMgb2Ygb2JqZWN0IHBhZ2UgdmlldyBhY2NvcmRpbmcgdG8gdGhlIGNvbnRyb2wgaW4gY29uY2Vybi5cblx0ICogQHBhcmFtIGNvbnRyb2wgVGhlIGNvbnRyb2wgZm9yIHN0YXRlIGludGVyYWN0aW9uXG5cdCAqIEBwYXJhbSBjb250cm9sU3RhdGVIYW5kbGVycyBTdGF0ZSBoYW5kbGVyc1xuXHQgKi9cblx0YWRhcHRDb250cm9sU3RhdGVIYW5kbGVyOiBmdW5jdGlvbiAoXG5cdFx0dGhpczogVmlld1N0YXRlLFxuXHRcdGNvbnRyb2w6IE1hbmFnZWRPYmplY3QsXG5cdFx0Y29udHJvbFN0YXRlSGFuZGxlcnM6IENvbnRyb2xTdGF0ZUhhbmRsZXI8T2JqZWN0UGFnZUxheW91dCwgT2JqZWN0UGFnZVN0YXRlPltdXG5cdCk6IHZvaWQge1xuXHRcdGNvbnN0IG9wU3RhdGVIYW5kbGVyID0gVmlld1N0YXRlRXh0ZW5zaW9uT3ZlcnJpZGUuX2dldE9QU3RhdGVIYW5kbGVyLmNhbGwodGhpcywgY29udHJvbCk7XG5cdFx0aWYgKG9wU3RhdGVIYW5kbGVyKSB7XG5cdFx0XHRjb250cm9sU3RhdGVIYW5kbGVycy5wdXNoKG9wU3RhdGVIYW5kbGVyKTtcblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIFBhc3MgdGhlIHJlZnJlc2ggaGFuZGxlcnMgb2Ygb2JqZWN0IHBhZ2UgdmlldyBhY2NvcmRpbmcgdG8gdGhlIGNvbnRyb2wgYmVpbmcgcmVmcmVzaGVkLlxuXHQgKiBAcGFyYW0gY29udHJvbCBUaGUgY29udHJvbCBiZWluZyByZWZyZXNoZWRcblx0ICogQHBhcmFtIGNvbnRyb2xSZWZyZXNoSGFuZGxlcnMgUmVmcmVzaCBoYW5kbGVyc1xuXHQgKi9cblx0YWRhcHRCaW5kaW5nUmVmcmVzaEhhbmRsZXI6IGZ1bmN0aW9uIChcblx0XHR0aGlzOiBWaWV3U3RhdGUsXG5cdFx0Y29udHJvbDogTWFuYWdlZE9iamVjdCxcblx0XHRjb250cm9sUmVmcmVzaEhhbmRsZXJzOiBDb250cm9sU3RhdGVIYW5kbGVyPE9iamVjdFBhZ2VMYXlvdXQsIE9iamVjdFBhZ2VTdGF0ZT5cblx0KTogdm9pZCB7XG5cdFx0Y29uc3Qgb3BTdGF0ZUhhbmRsZXIgPSBWaWV3U3RhdGVFeHRlbnNpb25PdmVycmlkZS5fZ2V0T1BSZWZyZXNoSGFuZGxlci5jYWxsKHRoaXMsIGNvbnRyb2wpO1xuXHRcdGlmIChvcFN0YXRlSGFuZGxlcikge1xuXHRcdFx0Y29udHJvbFJlZnJlc2hIYW5kbGVycy5yZWZyZXNoQmluZGluZyA9IG9wU3RhdGVIYW5kbGVyLnJlZnJlc2hCaW5kaW5nO1xuXHRcdH1cblx0fSxcblxuXHRhcHBseUluaXRpYWxTdGF0ZU9ubHk6IGZ1bmN0aW9uICgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH0sXG5cdGFkYXB0U3RhdGVDb250cm9sczogZnVuY3Rpb24gKHRoaXM6IFZpZXdTdGF0ZSwgYVN0YXRlQ29udHJvbHM6IENvbnRyb2xbXSk6IHZvaWQge1xuXHRcdGNvbnN0IG9WaWV3ID0gdGhpcy5iYXNlLmdldFZpZXcoKSxcblx0XHRcdG9WaWV3RGF0YSA9IG9WaWV3LmdldFZpZXdEYXRhKCk7XG5cdFx0c3dpdGNoIChvVmlld0RhdGEudmFyaWFudE1hbmFnZW1lbnQpIHtcblx0XHRcdGNhc2UgVmFyaWFudE1hbmFnZW1lbnQuQ29udHJvbDpcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFZhcmlhbnRNYW5hZ2VtZW50LlBhZ2U6XG5cdFx0XHRjYXNlIFZhcmlhbnRNYW5hZ2VtZW50Lk5vbmU6XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKGB1bmhhbmRsZWQgdmFyaWFudCBzZXR0aW5nOiAke29WaWV3RGF0YS52YXJpYW50TWFuYWdlbWVudH1gKTtcblx0XHR9XG5cblx0XHRhU3RhdGVDb250cm9scy5wdXNoKG9WaWV3LmJ5SWQoXCJmZTo6T2JqZWN0UGFnZVwiKSBhcyBDb250cm9sKTtcblx0fSxcblx0YWRhcHRCaW5kaW5nUmVmcmVzaENvbnRyb2xzOiBmdW5jdGlvbiAodGhpczogVmlld1N0YXRlLCBhQ29udHJvbHM6IENvbnRyb2xbXSk6IENvbnRyb2xbXSB7XG5cdFx0Y29uc3Qgb1ZpZXcgPSB0aGlzLmJhc2UuZ2V0VmlldygpLFxuXHRcdFx0c1JlZnJlc2hTdHJhdGVneSA9IEtlZXBBbGl2ZUhlbHBlci5nZXRWaWV3UmVmcmVzaEluZm8ob1ZpZXcpLFxuXHRcdFx0b0NvbnRyb2xsZXIgPSBvVmlldy5nZXRDb250cm9sbGVyKCk7XG5cdFx0bGV0IGFDb250cm9sc1RvUmVmcmVzaDogQ29udHJvbFtdID0gW107XG5cblx0XHRpZiAoc1JlZnJlc2hTdHJhdGVneSkge1xuXHRcdFx0Y29uc3Qgb09iamVjdFBhZ2VDb250cm9sID0gKG9Db250cm9sbGVyIGFzIE9iamVjdFBhZ2VDb250cm9sbGVyKS5fZ2V0T2JqZWN0UGFnZUxheW91dENvbnRyb2woKTtcblx0XHRcdGFDb250cm9sc1RvUmVmcmVzaC5wdXNoKG9PYmplY3RQYWdlQ29udHJvbCk7XG5cdFx0fVxuXHRcdGlmIChzUmVmcmVzaFN0cmF0ZWd5ICE9PSBcImluY2x1ZGluZ0RlcGVuZGVudHNcIikge1xuXHRcdFx0Y29uc3QgYVZpZXdDb250cm9scyA9IChvQ29udHJvbGxlciBhcyBPYmplY3RQYWdlQ29udHJvbGxlcikuX2ZpbmRUYWJsZXMoKTtcblx0XHRcdGFDb250cm9sc1RvUmVmcmVzaCA9IGFDb250cm9sc1RvUmVmcmVzaC5jb25jYXQoS2VlcEFsaXZlSGVscGVyLmdldENvbnRyb2xzRm9yUmVmcmVzaChvVmlldywgYVZpZXdDb250cm9scykgfHwgW10pO1xuXHRcdH1cblx0XHRyZXR1cm4gYUNvbnRyb2xzVG9SZWZyZXNoLnJlZHVjZShmdW5jdGlvbiAoYVByZXZDb250cm9scywgb0NvbnRyb2wpIHtcblx0XHRcdGlmICghYVByZXZDb250cm9scy5pbmNsdWRlcyhvQ29udHJvbCkpIHtcblx0XHRcdFx0YVByZXZDb250cm9scy5wdXNoKG9Db250cm9sKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBhUHJldkNvbnRyb2xzO1xuXHRcdH0sIGFDb250cm9scyk7XG5cdH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IFZpZXdTdGF0ZUV4dGVuc2lvbk92ZXJyaWRlO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztFQWdCQSxNQUFNQSxpQkFBaUIsR0FBR0MsV0FBVyxDQUFDRCxpQkFBaUI7RUFHdkQsTUFBTUUsaUJBQWlCLEdBQUc7SUFDekJDLFFBQVEsRUFBRSxTQUFBQSxDQUEyQkMsU0FBMkIsRUFBbUI7TUFDbEYsTUFBTUMsVUFBVSxHQUFHLElBQUksQ0FBQ0MsT0FBTyxDQUFDLENBQUMsQ0FBQ0MsYUFBYSxDQUFDLENBQXlCO01BQ3pFO01BQ0EsTUFBTUMsZ0JBQWdCLEdBQUlILFVBQVUsQ0FBK0RHLGdCQUFnQjtNQUNuSCxNQUFNQyxlQUFlLEdBQUdMLFNBQVMsQ0FBQ00sa0JBQWtCLENBQUMsQ0FBQztNQUN0RCxNQUFNQyxrQkFBa0IsR0FBR0gsZ0JBQWdCLEVBQUVJLEtBQUssQ0FBQyxDQUFDLElBQUksSUFBSTtNQUM1RCxPQUFPO1FBQ05ILGVBQWU7UUFDZkU7TUFDRCxDQUFDO0lBQ0YsQ0FBQztJQUNERSxLQUFLLEVBQUUsU0FBQUEsQ0FFTkMsUUFBMEIsRUFDMUJDLFlBQXFGLEVBQzlFO01BQ1AsTUFBTU4sZUFBZSxHQUFHTSxZQUFZLEVBQUVOLGVBQWU7TUFDckQsTUFBTUUsa0JBQWtCLEdBQUdJLFlBQVksRUFBRUosa0JBQWtCO01BRTNELElBQUksQ0FBQ0YsZUFBZSxFQUFFO1FBQ3JCO01BQ0Q7O01BRUE7TUFDQSxNQUFNTyxpQkFBaUIsR0FBR0YsUUFBUSxDQUFDRyxXQUFXLENBQUMsQ0FBQyxDQUFDQyxJQUFJLENBQUVDLE9BQTBCLElBQUtBLE9BQU8sQ0FBQ1AsS0FBSyxDQUFDLENBQUMsS0FBS0gsZUFBZSxDQUFDO01BQzFILE1BQU1XLGNBQWMsR0FBRyxDQUFDSixpQkFBaUIsSUFBSSxJQUFJLENBQUNWLE9BQU8sQ0FBQyxDQUFDLENBQUNlLElBQUksQ0FBQ1osZUFBZSxDQUFDLEVBQUVhLEdBQUcsQ0FBQywrQkFBK0IsQ0FBQztNQUN2SCxNQUFNakIsVUFBVSxHQUFHLElBQUksQ0FBQ0MsT0FBTyxDQUFDLENBQUMsQ0FBQ0MsYUFBYSxDQUFDLENBQXlCOztNQUV6RTtNQUNBLE1BQU1nQixnQkFBZ0IsR0FBR1osa0JBQWtCLElBQUlGLGVBQWU7TUFDOUQsTUFBTWUsd0JBQXdCLEdBQUcsQ0FBQyxDQUFDYixrQkFBa0IsSUFBSVMsY0FBYzs7TUFFdkU7TUFDQSxNQUFNSyxrQkFBa0IsR0FBR0EsQ0FBQSxLQUEwQjtRQUNwRCxJQUFJTCxjQUFjLEVBQUU7VUFDbkIsT0FBT04sUUFBUSxDQUNiRyxXQUFXLENBQUMsQ0FBQyxDQUNiQyxJQUFJLENBQUVRLENBQUMsSUFBS0EsQ0FBQyxDQUFDQyxjQUFjLENBQUMsQ0FBQyxDQUFDQyxJQUFJLENBQUVDLEVBQUUsSUFBS0EsRUFBRSxDQUFDakIsS0FBSyxDQUFDLENBQUMsS0FBS1csZ0JBQWdCLENBQUMsQ0FBQyxFQUM1RVgsS0FBSyxDQUFDLENBQUM7UUFDWDtRQUNBLE9BQU9ILGVBQWU7TUFDdkIsQ0FBQzs7TUFFRDtNQUNBSixVQUFVLENBQUN5QixTQUFTLENBQ2xCQyxhQUFhLENBQUMsQ0FBQyxDQUNmQyxJQUFJLENBQUMsWUFBWTtRQUNqQixNQUFNQyxlQUFlLEdBQUdSLGtCQUFrQixDQUFDLENBQUM7O1FBRTVDO1FBQ0E7UUFDQSxJQUFJLENBQUNRLGVBQWUsSUFBSW5CLFFBQVEsQ0FBQ0osa0JBQWtCLENBQUMsQ0FBQyxLQUFLdUIsZUFBZSxFQUFFO1VBQzFFO1FBQ0Q7UUFFQSxNQUFNQyxpQkFBaUIsR0FBR0EsQ0FBQSxLQUFZO1VBQ3JDO1VBQ0EsSUFBSSxDQUFDcEIsUUFBUSxDQUFDcUIsU0FBUyxDQUFDLENBQUMsRUFBRTtZQUMxQjtVQUNEOztVQUVBO1VBQ0EsTUFBTUMsY0FBYyxHQUFHdEIsUUFBUSxDQUFDSixrQkFBa0IsQ0FBQyxDQUFDO1VBQ3BELElBQUkwQixjQUFjLEtBQUtILGVBQWUsRUFBRTtZQUN2QztVQUNEO1VBRUEsSUFBSVQsd0JBQXdCLEVBQUU7WUFDN0I7WUFDQSxNQUFNYSxPQUFPLEdBQUdoQyxVQUFVLENBQUNDLE9BQU8sQ0FBQyxDQUFDLENBQUNnQyxVQUFVLENBQUNmLGdCQUFnQixDQUFDO1lBQ2pFLElBQUljLE9BQU8sRUFBRTtjQUNaaEMsVUFBVSxDQUFDa0MsZUFBZSxDQUFDLENBQUMsQ0FBQ0Msb0JBQW9CLENBQUNILE9BQU8sQ0FBQztZQUMzRCxDQUFDLE1BQU07Y0FDTnZCLFFBQVEsQ0FBQzJCLGVBQWUsQ0FBQ2xCLGdCQUFnQixFQUFFLENBQUMsQ0FBQztZQUM5QztVQUNELENBQUMsTUFBTSxJQUFJUCxpQkFBaUIsSUFBSUEsaUJBQWlCLENBQUMwQixVQUFVLENBQUMsQ0FBQyxLQUFLLElBQUksRUFBRTtZQUN4RTtZQUNBNUIsUUFBUSxDQUFDMkIsZUFBZSxDQUFDaEMsZUFBZSxFQUFFLENBQUMsQ0FBQztVQUM3QztRQUNELENBQUM7O1FBRUQ7UUFDQTtRQUNBLE1BQU1rQyxrQkFBa0IsR0FBR3RDLFVBQThEO1FBQ3pGLElBQUlzQyxrQkFBa0IsQ0FBQ0MsdUJBQXVCLEtBQUssSUFBSSxFQUFFO1VBQ3hEO1FBQ0Q7O1FBRUE7UUFDQVYsaUJBQWlCLENBQUMsQ0FBQzs7UUFFbkI7UUFDQSxJQUFJcEIsUUFBUSxDQUFDSixrQkFBa0IsQ0FBQyxDQUFDLEtBQUt1QixlQUFlLEVBQUU7VUFDdEQ7UUFDRDs7UUFFQTtRQUNBO1FBQ0EsTUFBTVksdUJBQXVCLENBQUM7VUFDN0JuQyxrQkFBa0IsRUFBRUEsQ0FBQSxLQUFNSSxRQUFRLENBQUNKLGtCQUFrQixDQUFDLENBQUM7VUFDdkR1QixlQUFlO1VBQ2ZhLGVBQWUsRUFBRVosaUJBQWlCO1VBQ2xDYSxVQUFVLEVBQUVBLENBQUEsS0FBTSxDQUFDLENBQUNqQyxRQUFRLENBQUNxQixTQUFTLENBQUM7UUFDeEMsQ0FBQyxDQUFDO1FBQ0YsT0FBTyxDQUFDO01BQ1QsQ0FBQyxDQUFDLENBQ0RhLEtBQUssQ0FBQyxNQUFNO1FBQ1o7UUFDQTtNQUFBLENBQ0EsQ0FBQztJQUNKLENBQUM7SUFDREMsY0FBYyxFQUFFLFNBQUFBLENBQVU3QyxTQUEyQixFQUFRO01BQzVELE1BQU04QyxlQUFlLEdBQUc5QyxTQUFTLENBQUMrQyxpQkFBaUIsQ0FBQyxDQUErQjtNQUNuRixNQUFNQyxRQUFRLEdBQUdGLGVBQWUsSUFBSUEsZUFBZSxDQUFDRyxVQUFVLENBQUMsQ0FBQztNQUNoRSxJQUFJRCxRQUFRLEVBQUU7UUFDYixNQUFNRSxTQUFTLEdBQUdDLFdBQVcsQ0FBQ0MscUJBQXFCLENBQUNOLGVBQWUsQ0FBQztRQUNwRSxNQUFNTyxTQUFTLEdBQUdDLGVBQWUsQ0FBQ0MsdUNBQXVDLENBQUN2RCxTQUFTLEVBQUVrRCxTQUFTLENBQUM7UUFDL0YsSUFBSUcsU0FBUyxLQUFLLE1BQU0sRUFBRTtVQUN6QjtVQUNBLE1BQU1HLE1BQU0sR0FBR1YsZUFBZSxDQUFDVyxRQUFRLENBQUMsQ0FBQztZQUN4Q0MsVUFBVSxHQUFHRixNQUFNLENBQUNHLFlBQVksQ0FBQyxDQUFDO1lBQ2xDQyxxQkFBMkQsR0FDekRDLFdBQVcsQ0FBQ0Msd0JBQXdCLENBQUNKLFVBQVUsRUFBRVIsU0FBUyxFQUFFO2NBQzVEYSxLQUFLLEVBQUU7WUFDUixDQUFDLENBQUMsSUFBNkMsQ0FBQyxDQUFDO1lBQ2xEQyx1QkFBdUIsR0FBR0MsTUFBTSxDQUFDQyxJQUFJLENBQUNOLHFCQUFxQixDQUFDLENBQUNPLE1BQU0sQ0FBQyxVQUNuRUMsS0FBNEMsRUFDNUNDLFFBQWdCLEVBQ2Y7Y0FDRCxJQUFJVCxxQkFBcUIsQ0FBQ1MsUUFBUSxDQUFDLENBQUNDLGFBQWEsS0FBSyxJQUFJLEVBQUU7Z0JBQzNERixLQUFLLENBQUNHLElBQUksQ0FBQztrQkFBRUMsdUJBQXVCLEVBQUVIO2dCQUFTLENBQUMsQ0FBQztjQUNsRDtjQUNBLE9BQU9ELEtBQUs7WUFDYixDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ05LLFdBQWdGLEdBQUcsQ0FBQztjQUFFQyxhQUFhLEVBQUU7WUFBSSxDQUFDLENBQUM7WUFDM0dDLFFBQVEsR0FBRzNCLFFBQVEsQ0FBQzRCLFVBQVUsQ0FBQyxDQUFDO1VBRWpDOUIsZUFBZSxDQUFDK0Isa0JBQWtCLENBQUNKLFdBQVcsQ0FBQ0ssTUFBTSxDQUFDZCx1QkFBdUIsQ0FBQyxFQUFFVyxRQUFRLENBQUM7UUFDMUYsQ0FBQyxNQUFNLElBQUl0QixTQUFTLEtBQUsscUJBQXFCLEVBQUU7VUFDL0M7VUFDQUwsUUFBUSxDQUFDK0IsT0FBTyxDQUFDLENBQUM7UUFDbkI7TUFDRCxDQUFDLE1BQU07UUFDTkMsR0FBRyxDQUFDQyxJQUFJLENBQUMsZUFBZWpGLFNBQVMsQ0FBQ1EsS0FBSyxDQUFDLENBQUMsdUNBQXVDLENBQUM7TUFDbEY7SUFDRDtFQUNELENBQUM7RUFFRCxNQUFNMEUsMEJBQTBCLEdBQUc7SUFDbENDLG9CQUFvQixFQUFFLFNBQUFBLENBQUEsRUFBNkM7TUFDbEUsTUFBTUMsSUFBSSxHQUFHLElBQUksQ0FBQ2xGLE9BQU8sQ0FBQyxDQUFDO01BQzNCLE1BQU1ELFVBQVUsR0FBR21GLElBQUksQ0FBQ2pGLGFBQWEsQ0FBQyxDQUF5QjtNQUMvRCxPQUFPRixVQUFVLENBQUNvRiwyQkFBMkIsQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFFRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0lBQ0NDLGtCQUFrQixFQUFFLFNBQUFBLENBRW5CQyxPQUFzQixFQUMrQztNQUNyRSxNQUFNQyxNQUFNLEdBQUdOLDBCQUEwQixDQUFDQyxvQkFBb0IsQ0FBQ00sSUFBSSxDQUFDLElBQUksQ0FBQztNQUN6RSxJQUFJRCxNQUFNLEtBQUtELE9BQU8sRUFBRTtRQUN2QixPQUFPO1VBQ054RixRQUFRLEVBQUVELGlCQUFpQixDQUFDQyxRQUFRO1VBQ3BDVSxLQUFLLEVBQUVYLGlCQUFpQixDQUFDVztRQUMxQixDQUFDO01BQ0Y7SUFDRCxDQUFDO0lBRUQ7QUFDRDtBQUNBO0FBQ0E7QUFDQTtJQUNDaUYsb0JBQW9CLEVBQUUsU0FBQUEsQ0FFckJILE9BQXNCLEVBQytDO01BQ3JFLE1BQU1DLE1BQU0sR0FBR04sMEJBQTBCLENBQUNDLG9CQUFvQixDQUFDTSxJQUFJLENBQUMsSUFBSSxDQUFDO01BQ3pFLElBQUlELE1BQU0sS0FBS0QsT0FBTyxFQUFFO1FBQ3ZCLE9BQU87VUFDTjFDLGNBQWMsRUFBRS9DLGlCQUFpQixDQUFDK0M7UUFDbkMsQ0FBQztNQUNGO0lBQ0QsQ0FBQztJQUVEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7SUFDQzhDLHdCQUF3QixFQUFFLFNBQUFBLENBRXpCSixPQUFzQixFQUN0Qkssb0JBQThFLEVBQ3ZFO01BQ1AsTUFBTUMsY0FBYyxHQUFHWCwwQkFBMEIsQ0FBQ0ksa0JBQWtCLENBQUNHLElBQUksQ0FBQyxJQUFJLEVBQUVGLE9BQU8sQ0FBQztNQUN4RixJQUFJTSxjQUFjLEVBQUU7UUFDbkJELG9CQUFvQixDQUFDckIsSUFBSSxDQUFDc0IsY0FBYyxDQUFDO01BQzFDO0lBQ0QsQ0FBQztJQUVEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7SUFDQ0MsMEJBQTBCLEVBQUUsU0FBQUEsQ0FFM0JQLE9BQXNCLEVBQ3RCUSxzQkFBOEUsRUFDdkU7TUFDUCxNQUFNRixjQUFjLEdBQUdYLDBCQUEwQixDQUFDUSxvQkFBb0IsQ0FBQ0QsSUFBSSxDQUFDLElBQUksRUFBRUYsT0FBTyxDQUFDO01BQzFGLElBQUlNLGNBQWMsRUFBRTtRQUNuQkUsc0JBQXNCLENBQUNsRCxjQUFjLEdBQUdnRCxjQUFjLENBQUNoRCxjQUFjO01BQ3RFO0lBQ0QsQ0FBQztJQUVEbUQscUJBQXFCLEVBQUUsU0FBQUEsQ0FBQSxFQUFxQjtNQUMzQyxPQUFPLEtBQUs7SUFDYixDQUFDO0lBQ0RDLGtCQUFrQixFQUFFLFNBQUFBLENBQTJCQyxjQUF5QixFQUFRO01BQy9FLE1BQU1DLEtBQUssR0FBRyxJQUFJLENBQUNDLElBQUksQ0FBQ2xHLE9BQU8sQ0FBQyxDQUFDO1FBQ2hDbUcsU0FBUyxHQUFHRixLQUFLLENBQUNHLFdBQVcsQ0FBQyxDQUFDO01BQ2hDLFFBQVFELFNBQVMsQ0FBQ0UsaUJBQWlCO1FBQ2xDLEtBQUszRyxpQkFBaUIsQ0FBQzRHLE9BQU87VUFDN0I7UUFDRCxLQUFLNUcsaUJBQWlCLENBQUM2RyxJQUFJO1FBQzNCLEtBQUs3RyxpQkFBaUIsQ0FBQzhHLElBQUk7VUFDMUI7UUFDRDtVQUNDLE1BQU0sSUFBSUMsS0FBSyxDQUFDLDhCQUE4Qk4sU0FBUyxDQUFDRSxpQkFBaUIsRUFBRSxDQUFDO01BQzlFO01BRUFMLGNBQWMsQ0FBQzNCLElBQUksQ0FBQzRCLEtBQUssQ0FBQ2xGLElBQUksQ0FBQyxnQkFBZ0IsQ0FBWSxDQUFDO0lBQzdELENBQUM7SUFDRDJGLDJCQUEyQixFQUFFLFNBQUFBLENBQTJCQyxTQUFvQixFQUFhO01BQ3hGLE1BQU1WLEtBQUssR0FBRyxJQUFJLENBQUNDLElBQUksQ0FBQ2xHLE9BQU8sQ0FBQyxDQUFDO1FBQ2hDNEcsZ0JBQWdCLEdBQUd4RCxlQUFlLENBQUN5RCxrQkFBa0IsQ0FBQ1osS0FBSyxDQUFDO1FBQzVEYSxXQUFXLEdBQUdiLEtBQUssQ0FBQ2hHLGFBQWEsQ0FBQyxDQUFDO01BQ3BDLElBQUk4RyxrQkFBNkIsR0FBRyxFQUFFO01BRXRDLElBQUlILGdCQUFnQixFQUFFO1FBQ3JCLE1BQU1JLGtCQUFrQixHQUFJRixXQUFXLENBQTBCM0IsMkJBQTJCLENBQUMsQ0FBQztRQUM5RjRCLGtCQUFrQixDQUFDMUMsSUFBSSxDQUFDMkMsa0JBQWtCLENBQUM7TUFDNUM7TUFDQSxJQUFJSixnQkFBZ0IsS0FBSyxxQkFBcUIsRUFBRTtRQUMvQyxNQUFNSyxhQUFhLEdBQUlILFdBQVcsQ0FBMEJJLFdBQVcsQ0FBQyxDQUFDO1FBQ3pFSCxrQkFBa0IsR0FBR0Esa0JBQWtCLENBQUNuQyxNQUFNLENBQUN4QixlQUFlLENBQUMrRCxxQkFBcUIsQ0FBQ2xCLEtBQUssRUFBRWdCLGFBQWEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztNQUNsSDtNQUNBLE9BQU9GLGtCQUFrQixDQUFDOUMsTUFBTSxDQUFDLFVBQVVtRCxhQUFhLEVBQUVDLFFBQVEsRUFBRTtRQUNuRSxJQUFJLENBQUNELGFBQWEsQ0FBQ0UsUUFBUSxDQUFDRCxRQUFRLENBQUMsRUFBRTtVQUN0Q0QsYUFBYSxDQUFDL0MsSUFBSSxDQUFDZ0QsUUFBUSxDQUFDO1FBQzdCO1FBQ0EsT0FBT0QsYUFBYTtNQUNyQixDQUFDLEVBQUVULFNBQVMsQ0FBQztJQUNkO0VBQ0QsQ0FBQztFQUFDLE9BRWEzQiwwQkFBMEI7QUFBQSIsImlnbm9yZUxpc3QiOltdfQ==
@@ -5,6 +5,7 @@ import { type ControlStateHandler } from "sap/fe/core/controllerextensions/ViewS
5
5
  import KeepAliveHelper from "sap/fe/core/helpers/KeepAliveHelper";
6
6
  import ModelHelper from "sap/fe/core/helpers/ModelHelper";
7
7
  import CoreLibrary from "sap/fe/core/library";
8
+ import { pollForSectionStability } from "sap/fe/templates/ObjectPage/helpers/SectionNavigationHelper";
8
9
  import type ObjectPageController from "sap/fe/templates/ObjectPage/ObjectPageController.controller";
9
10
  import type ManagedObject from "sap/ui/base/ManagedObject";
10
11
  import type Control from "sap/ui/core/Control";
@@ -14,34 +15,119 @@ import type ObjectPageSection from "sap/uxap/ObjectPageSection";
14
15
  import type { MetaModelNavProperty } from "types/metamodel_types";
15
16
 
16
17
  const VariantManagement = CoreLibrary.VariantManagement;
17
- export type ObjectPageState = { selectedSection: string | null };
18
+ export type ObjectPageState = { selectedSection: string | null; selectedSubSection?: string | null };
18
19
 
19
20
  const opControlHandlers = {
20
- retrieve: function (oOPLayout: ObjectPageLayout): ObjectPageState {
21
+ retrieve: function (this: ViewState, oOPLayout: ObjectPageLayout): ObjectPageState {
22
+ const controller = this.getView().getController() as ObjectPageController;
23
+ // Get subsection from controller's stored target subsection (set by onNavigateChange or targetControlId navigation)
24
+ const targetSubSection = (controller as unknown as { targetSubSection?: { getId: () => string } }).targetSubSection;
25
+ const selectedSection = oOPLayout.getSelectedSection();
26
+ const selectedSubSection = targetSubSection?.getId() ?? null;
21
27
  return {
22
- selectedSection: oOPLayout.getSelectedSection()
28
+ selectedSection,
29
+ selectedSubSection
23
30
  };
24
31
  },
25
- apply: function (this: ViewState, opLayout: ObjectPageLayout, controlState?: { selectedSection: string | null }): void {
32
+ apply: function (
33
+ this: ViewState,
34
+ opLayout: ObjectPageLayout,
35
+ controlState?: { selectedSection: string | null; selectedSubSection?: string | null }
36
+ ): void {
26
37
  const selectedSection = controlState?.selectedSection;
27
- if (selectedSection) {
28
- const opSectionToSelect = opLayout.getSections().find((section: ObjectPageSection) => section.getId() === selectedSection);
29
- if (opSectionToSelect?.getVisible() === false) {
30
- const controller = this.getView().getController() as ObjectPageController;
31
- controller.pageReady
32
- .waitPageReady()
33
- .then(function (): void {
34
- opLayout.setSelectedSection(selectedSection);
35
- return undefined;
36
- })
37
- .catch((err: unknown): void => {
38
- const message = err instanceof Error ? err.message : String(err);
39
- Log.error(`FE V4 : OP : ViewState : ObjectPageLayout state couldn't be applied : ${message}`);
40
- });
41
- } else {
42
- opLayout.setSelectedSection(selectedSection);
43
- }
38
+ const selectedSubSection = controlState?.selectedSubSection;
39
+
40
+ if (!selectedSection) {
41
+ return;
44
42
  }
43
+
44
+ // Check if the selected section is a section or subsection
45
+ const opSectionToSelect = opLayout.getSections().find((section: ObjectPageSection) => section.getId() === selectedSection);
46
+ const isSubSectionId = !opSectionToSelect && this.getView().byId(selectedSection)?.isA("sap.uxap.ObjectPageSubSection");
47
+ const controller = this.getView().getController() as ObjectPageController;
48
+
49
+ // Determine the target to navigate to: prefer subsection if available
50
+ const navigationTarget = selectedSubSection ?? selectedSection;
51
+ const isNavigatingToSubSection = !!selectedSubSection || isSubSectionId;
52
+
53
+ // Determine target section ID for comparison (needed before pageReady)
54
+ const getTargetSectionId = (): string | undefined => {
55
+ if (isSubSectionId) {
56
+ return opLayout
57
+ .getSections()
58
+ .find((s) => s.getSubSections().some((ss) => ss.getId() === navigationTarget))
59
+ ?.getId();
60
+ }
61
+ return selectedSection;
62
+ };
63
+
64
+ // Wait for pageReady, then navigate and poll for UX rules reset
65
+ controller.pageReady
66
+ .waitPageReady()
67
+ .then(async () => {
68
+ const targetSectionId = getTargetSectionId();
69
+
70
+ // Skip if no valid target section (e.g., subsection's parent no longer exists)
71
+ // or already on target section - no navigation or polling needed
72
+ if (!targetSectionId || opLayout.getSelectedSection() === targetSectionId) {
73
+ return;
74
+ }
75
+
76
+ const performNavigation = (): void => {
77
+ // Guard: don't navigate if ObjectPageLayout has been destroyed
78
+ if (!opLayout.getDomRef()) {
79
+ return;
80
+ }
81
+
82
+ // Guard: don't navigate if already on target section
83
+ const currentSection = opLayout.getSelectedSection();
84
+ if (currentSection === targetSectionId) {
85
+ return;
86
+ }
87
+
88
+ if (isNavigatingToSubSection) {
89
+ // For subsection navigation, use navigateToSubSection which handles parent section activation
90
+ const localId = controller.getView().getLocalId(navigationTarget);
91
+ if (localId) {
92
+ controller.getExtensionAPI().navigateToSubSection(localId);
93
+ } else {
94
+ opLayout.scrollToSection(navigationTarget, 0);
95
+ }
96
+ } else if (opSectionToSelect && opSectionToSelect.getVisible() === true) {
97
+ // For section IDs, navigate if section is visible
98
+ opLayout.scrollToSection(selectedSection, 0);
99
+ }
100
+ };
101
+
102
+ // Skip navigation and polling on subsequent loads - only restore section during initial load
103
+ // This prevents overriding user's manual tab selection when state is restored later
104
+ const controllerWithFlag = controller as unknown as { hasInitialLoadCompleted?: boolean };
105
+ if (controllerWithFlag.hasInitialLoadCompleted === true) {
106
+ return;
107
+ }
108
+
109
+ // Navigate immediately
110
+ performNavigation();
111
+
112
+ // Skip polling if already on target section
113
+ if (opLayout.getSelectedSection() === targetSectionId) {
114
+ return;
115
+ }
116
+
117
+ // Poll to detect UX rules reset during initial load
118
+ // Uses shared utility from helpers/SectionNavigationHelper.ts
119
+ await pollForSectionStability({
120
+ getSelectedSection: () => opLayout.getSelectedSection(),
121
+ targetSectionId,
122
+ onResetDetected: performNavigation,
123
+ guardCheck: () => !!opLayout.getDomRef()
124
+ });
125
+ return; // Required by linter rule promise/always-return
126
+ })
127
+ .catch(() => {
128
+ // ViewState: ObjectPageLayout section state couldn't be applied
129
+ // Don't re-throw - allow page to continue even if navigation fails
130
+ });
45
131
  },
46
132
  refreshBinding: function (oOPLayout: ObjectPageLayout): void {
47
133
  const oBindingContext = oOPLayout.getBindingContext() as ODataV4Context | undefined;
@@ -150,7 +236,7 @@ const ViewStateExtensionOverride = {
150
236
  ): void {
151
237
  const opStateHandler = ViewStateExtensionOverride._getOPRefreshHandler.call(this, control);
152
238
  if (opStateHandler) {
153
- controlRefreshHandlers.refreshBinding = opStateHandler.refreshBinding;
239
+ controlRefreshHandlers.refreshBinding = opStateHandler.refreshBinding;
154
240
  }
155
241
  },
156
242
 
@@ -23,6 +23,9 @@
23
23
  FE_MODEL: 'sap/fe/core/helpers/ModelHelper'
24
24
  }"
25
25
  >
26
+ <template:if test="{= !!${converterContext>header/emphasizedFirstActions} &amp;&amp; !${converterContext>isDraftEnabled} }">
27
+ <core:Fragment fragmentName="sap.fe.templates.ObjectPage.view.fragments.EmphasizedFirstHeaderAction" type="XML" />
28
+ </template:if>
26
29
  <template:if test="{converterContext>header/actions}">
27
30
  <template:repeat list="{converterContext>header/actions}" var="headerAction">
28
31
  <template:if
@@ -43,6 +46,13 @@
43
46
  <components:CollaborationDraft contextPath="{entitySet>@@COMMON.getMetaPath}" id="fe::CollaborationDraft" />
44
47
  </template:if>
45
48
  <ToolbarSpacer />
49
+
50
+ <!-- Render emphasized-first action AFTER the flexible spacer in draft mode (prevents large gap). -->
51
+ <template:if
52
+ test="{= !!${converterContext>header/emphasizedFirstActions} &amp;&amp; ${converterContext>isDraftEnabled} }"
53
+ >
54
+ <core:Fragment fragmentName="sap.fe.templates.ObjectPage.view.fragments.EmphasizedFirstHeaderAction" type="XML" />
55
+ </template:if>
46
56
  </template:elseif>
47
57
  <template:elseif test="{= ${headerAction>type} === 'Separator'}">
48
58
  <ToolbarSeparator>
@@ -153,7 +163,7 @@
153
163
  <Button
154
164
  id="fe::StandardAction::Edit"
155
165
  dt:designtime="not-adaptable"
156
- type="{= OP.buildEmphasizedButtonExpression(${fullContextPath>@@UI.getDataModelObjectPath}) }"
166
+ type="{headerAction>buttonType}"
157
167
  text="{sap.fe.i18n>C_COMMON_OBJECT_PAGE_EDIT}"
158
168
  enabled="{headerAction>enabled}"
159
169
  visible="{headerAction>visible}"
@@ -206,7 +216,7 @@
206
216
  press="{= ${headerAction>command} ? ('cmd:' + ${headerAction>command}) : OP.getPressExpressionForEdit(${dataField>}, ${entitySet>@sapui.name}, ${headerAction>}) }"
207
217
  visible="{headerAction>visible}"
208
218
  enabled="{headerAction>enabled}"
209
- type="{= CRIT.buildExpressionForCriticalityButtonType(${dataField>@@UI.getDataModelObjectPath}) }"
219
+ type="{= ${headerAction>buttonType} ? ${headerAction>buttonType} : CRIT.buildExpressionForCriticalityButtonType(${dataField>@@UI.getDataModelObjectPath}) }"
210
220
  ariaHasPopup="{= DATAFIELDANNOTATIONS.isDataModelObjectPathForActionWithDialog(${actionContext>@@UI.getDataModelObjectPath})}"
211
221
  macrodata:annotatedActionIdentifier="{= ID.generate([${dataField>@@UI.getDataModelObjectPath}]) }"
212
222
  icon="{= ${headerAction>isAIOperation} ? COMMON.getAIIcon() : undefined }"
@@ -0,0 +1,182 @@
1
+ <core:FragmentDefinition
2
+ xmlns:template="http://schemas.sap.com/sapui5/extension/sap.ui.core.template/1"
3
+ xmlns:macrodata="http://schemas.sap.com/sapui5/extension/sap.ui.core.CustomData/1"
4
+ xmlns="sap.m"
5
+ xmlns:core="sap.ui.core"
6
+ xmlns:customData="http://schemas.sap.com/sapui5/extension/sap.ui.core.CustomData/1"
7
+ xmlns:dt="sap.ui.dt"
8
+ template:require="{
9
+ ID: 'sap/fe/core/helpers/StableIdHelper',
10
+ OP: 'sap/fe/templates/ObjectPage/ObjectPageTemplating',
11
+ COMMON: 'sap/fe/macros/CommonHelper',
12
+ DATAFIELDANNOTATIONS : 'sap/fe/core/converters/annotations/DataField',
13
+ DEFAULTACTIONHANDLER: 'sap/fe/macros/internal/helpers/DefaultActionHandler'
14
+ }"
15
+ >
16
+ <!--
17
+ Renders the *active* emphasized-first instances of all emphasized header actions.
18
+ Supports multiple emphasized actions with dynamic visibility (UI.Hidden) via cascading priority.
19
+ The caller (Actions.fragment.xml) is responsible for placing this fragment at the desired position.
20
+ -->
21
+ <template:repeat list="{converterContext>header/emphasizedFirstActions}" var="emphHeaderAction">
22
+ <template:if test="{= ${emphHeaderAction>type} === 'ForNavigation' }">
23
+ <template:with path="emphHeaderAction>annotationPath" var="dataField">
24
+ <Button
25
+ id="{= ID.generate(['fe', ${dataField>@@UI.getDataModelObjectPath}, 'EmphasizedFirst']) }"
26
+ dt:designtime="not-adaptable"
27
+ text="{emphHeaderAction>text}"
28
+ press="{= ${emphHeaderAction>command} ? ('cmd:' + ${emphHeaderAction>command}) : ${emphHeaderAction>press}}"
29
+ visible="{emphHeaderAction>emphFirstVisible}"
30
+ enabled="{emphHeaderAction>enabled}"
31
+ type="Emphasized"
32
+ macrodata:IBNData="{emphHeaderAction>customData}"
33
+ macrodata:fePrimaryActionShortcut="true"
34
+ >
35
+ <layoutData>
36
+ <OverflowToolbarLayoutData
37
+ priority="{= ${emphHeaderAction>priority} ? ${emphHeaderAction>priority} : 'Low' }"
38
+ group="{= ${emphHeaderAction>overflowGroup} || ${emphHeaderAction>group} }"
39
+ />
40
+ </layoutData>
41
+ </Button>
42
+ </template:with>
43
+ </template:if>
44
+
45
+ <template:if test="{= (${emphHeaderAction>type} === 'ForAction' || ${emphHeaderAction>type} === 'Copy') }">
46
+ <template:with path="emphHeaderAction>annotationPath" var="dataField">
47
+ <template:if
48
+ test="{= ${dataField>$Type} === 'com.sap.vocabularies.UI.v1.DataFieldForAction' &amp;&amp; ${dataField>Determining} !== true }"
49
+ >
50
+ <template:with path="dataField>Action" helper="COMMON.getActionContext" var="actionContext">
51
+ <Button
52
+ id="{= ID.generate(['fe', ${dataField>@@UI.getDataModelObjectPath}, 'EmphasizedFirst']) }"
53
+ dt:designtime="not-adaptable"
54
+ text="{= ${emphHeaderAction>text} ? ${emphHeaderAction>text} : ${dataField>Label} }"
55
+ press="{= ${emphHeaderAction>command} ? ('cmd:' + ${emphHeaderAction>command}) : OP.getPressExpressionForEdit(${dataField>}, ${entitySet>@sapui.name}, ${emphHeaderAction>}) }"
56
+ visible="{emphHeaderAction>emphFirstVisible}"
57
+ enabled="{emphHeaderAction>enabled}"
58
+ type="Emphasized"
59
+ ariaHasPopup="{= DATAFIELDANNOTATIONS.isDataModelObjectPathForActionWithDialog(${actionContext>@@UI.getDataModelObjectPath})}"
60
+ macrodata:annotatedActionIdentifier="{= ID.generate([${dataField>@@UI.getDataModelObjectPath}]) }"
61
+ icon="{= ${emphHeaderAction>isAIOperation} ? COMMON.getAIIcon() : undefined }"
62
+ ariaDescribedBy="{= ${emphHeaderAction>isAIOperation} === true ? 'fe::AiAction::AriaText' : undefined}"
63
+ macrodata:fePrimaryActionShortcut="true"
64
+ >
65
+ <layoutData>
66
+ <OverflowToolbarLayoutData
67
+ priority="{= ${emphHeaderAction>priority} ? ${emphHeaderAction>priority} : 'Low' }"
68
+ group="{emphHeaderAction>group}"
69
+ />
70
+ </layoutData>
71
+ </Button>
72
+ </template:with>
73
+ </template:if>
74
+ </template:with>
75
+ </template:if>
76
+
77
+ <template:if test="{= OP.isManifestAction(${emphHeaderAction>}) }">
78
+ <!-- Manifest Menu: place MenuButton first and emphasize it; defaultAction stays the menu defaultAction -->
79
+ <template:if test="{= ${emphHeaderAction>type} === 'Menu' }">
80
+ <template:repeat list="{converterContext>header/actions}" var="matchedHeaderAction">
81
+ <template:if test="{= ${matchedHeaderAction>id} === ${emphHeaderAction>id} }">
82
+ <template:then>
83
+ <template:with path="matchedHeaderAction>defaultAction/annotationPath" var="dataFieldForDefaultAction">
84
+ <template:with
85
+ path="dataFieldForDefaultAction>Action"
86
+ helper="COMMON.getActionContext"
87
+ var="defaultActionContext"
88
+ >
89
+ <MenuButton
90
+ core:require="{FPM: 'sap/fe/core/helpers/FPMHelper'}"
91
+ text="{matchedHeaderAction>text}"
92
+ type="Emphasized"
93
+ menuPosition="BeginBottom"
94
+ id="{= ID.generate(['fe', ${matchedHeaderAction>id}, 'EmphasizedFirst'])}"
95
+ dt:designtime="not-adaptable"
96
+ visible="{emphHeaderAction>emphFirstVisible}"
97
+ enabled="{matchedHeaderAction>enabled}"
98
+ useDefaultActionOnly="{= DEFAULTACTIONHANDLER.getUseDefaultActionOnly(${matchedHeaderAction>})}"
99
+ buttonMode="{= DEFAULTACTIONHANDLER.getButtonMode(${matchedHeaderAction>})}"
100
+ defaultAction="{= OP.getDefaultActionHandler(${converterContext>header}, ${matchedHeaderAction>}, ${dataFieldForDefaultAction>}, ${entitySet>@sapui.name})}"
101
+ icon="{= ${matchedHeaderAction>isAIOperation} ? COMMON.getAIIcon() : undefined }"
102
+ ariaDescribedBy="{= ${matchedHeaderAction>isAIOperation} === true ? 'fe::AiAction::AriaText' : undefined}"
103
+ macrodata:fePrimaryActionShortcut="true"
104
+ >
105
+ <layoutData>
106
+ <OverflowToolbarLayoutData
107
+ priority="{= ${matchedHeaderAction>priority} ? ${matchedHeaderAction>priority} : 'Low' }"
108
+ group="{matchedHeaderAction>group}"
109
+ />
110
+ </layoutData>
111
+ <menu>
112
+ <Menu>
113
+ <template:repeat list="{matchedHeaderAction>menu}" var="menuItemAction">
114
+ <template:with path="menuItemAction>annotationPath" var="dataField">
115
+ <template:if test="{= ${menuItemAction>type} === 'ForAction'}">
116
+ <template:then>
117
+ <MenuItem
118
+ id="{= ID.generate(['fe', ${matchedHeaderAction>id}, ${dataField>@@UI.getDataModelObjectPath}, 'EmphasizedFirst']) }"
119
+ text="{dataField>Label}"
120
+ press="{= ${menuItemAction>command} ? ('cmd:' + ${menuItemAction>command}) : OP.getPressExpressionForEdit(${dataField>}, ${entitySet>@sapui.name}, ${matchedHeaderAction>}) }"
121
+ visible="{menuItemAction>visible}"
122
+ enabled="{menuItemAction>enabled}"
123
+ macrodata:annotatedActionIdentifier="{= ID.generate([${dataField>@@UI.getDataModelObjectPath}]) }"
124
+ />
125
+ </template:then>
126
+ <template:elseif test="{= ${menuItemAction>type} === 'ForNavigation'}">
127
+ <MenuItem
128
+ id="{= ID.generate(['fe', ${matchedHeaderAction>id}, ${dataField>@@UI.getDataModelObjectPath}, 'EmphasizedFirst']) }"
129
+ text="{dataField>Label}"
130
+ press="{= ${menuItemAction>command} ? ('cmd:' + ${menuItemAction>command}) : ${menuItemAction>press}}"
131
+ enabled="{menuItemAction>enabled}"
132
+ visible="{menuItemAction>visible}"
133
+ macrodata:IBNData="{menuItemAction>customData}"
134
+ />
135
+ </template:elseif>
136
+ <template:else>
137
+ <MenuItem
138
+ id="{= ID.generate(['fe', ${matchedHeaderAction>id}, ${menuItemAction>id}, 'EmphasizedFirst'])}"
139
+ text="{menuItemAction>text}"
140
+ press="{= ${menuItemAction>command} ? ('cmd:' + ${menuItemAction>command}) : COMMON.buildActionWrapper(${menuItemAction>}, ${converterContext>header})}"
141
+ visible="{menuItemAction>visible}"
142
+ enabled="{menuItemAction>enabled}"
143
+ />
144
+ </template:else>
145
+ </template:if>
146
+ </template:with>
147
+ </template:repeat>
148
+ </Menu>
149
+ </menu>
150
+ </MenuButton>
151
+ </template:with>
152
+ </template:with>
153
+ </template:then>
154
+ </template:if>
155
+ </template:repeat>
156
+ </template:if>
157
+
158
+ <template:if test="{= ${emphHeaderAction>type} !== 'Menu' }">
159
+ <Button
160
+ core:require="{FPM: 'sap/fe/core/helpers/FPMHelper'}"
161
+ id="{= ID.generate(['fe', (${emphHeaderAction>id} ? ${emphHeaderAction>id} : ${emphHeaderAction>key}), 'EmphasizedFirst']) }"
162
+ dt:designtime="not-adaptable"
163
+ text="{emphHeaderAction>text}"
164
+ press="{= ${emphHeaderAction>command} ? ('cmd:' + ${emphHeaderAction>command}) : COMMON.buildActionWrapper(${emphHeaderAction>}, ${converterContext>header}) }"
165
+ visible="{emphHeaderAction>emphFirstVisible}"
166
+ enabled="{emphHeaderAction>enabled}"
167
+ type="Emphasized"
168
+ icon="{= ${emphHeaderAction>isAIOperation} ? COMMON.getAIIcon() : undefined }"
169
+ ariaDescribedBy="{= ${emphHeaderAction>isAIOperation} === true ? 'fe::AiAction::AriaText' : undefined}"
170
+ macrodata:fePrimaryActionShortcut="true"
171
+ >
172
+ <layoutData>
173
+ <OverflowToolbarLayoutData
174
+ priority="{= ${emphHeaderAction>priority} ? ${emphHeaderAction>priority} : 'Low' }"
175
+ group="{emphHeaderAction>group}"
176
+ />
177
+ </layoutData>
178
+ </Button>
179
+ </template:if>
180
+ </template:if>
181
+ </template:repeat>
182
+ </core:FragmentDefinition>
@@ -35,16 +35,16 @@ OP: 'sap/fe/templates/ObjectPage/ObjectPageTemplating'
35
35
  <template:if test="{= ${header>aiNotice} &amp;&amp; ${header>aiNotice/visible} !== false }">
36
36
  <macros:AINotice visible="{header>aiNotice/visible}" placementType="Bottom">
37
37
  <macros:popoverContent>
38
- <template:if test="{header>aiNotice/contentText}">
38
+ <template:if test="{header>aiNotice/contentFragmentName}">
39
39
  <template:then>
40
- <Text text="{header>aiNotice/contentText}" />
41
- </template:then>
42
- <template:elseif test="{header>aiNotice/contentFragmentName}">
43
40
  <fpm:CustomFragment
44
41
  id="fe::expandedHeaderNotice"
45
42
  fragmentName="{header>aiNotice/contentFragmentName}"
46
43
  contextPath="{fullContextPath>}"
47
44
  />
45
+ </template:then>
46
+ <template:elseif test="{header>aiNotice/contentText}">
47
+ <Text text="{header>aiNotice/contentText}" />
48
48
  </template:elseif>
49
49
  </template:if>
50
50
  </macros:popoverContent>