@sapui5/sap.fe.base 1.125.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.
@@ -0,0 +1,44 @@
1
+ /*!
2
+ * SAP UI development toolkit for HTML5 (SAPUI5)
3
+ * (c) Copyright 2009-2024 SAP SE. All rights reserved
4
+ */
5
+ sap.ui.define([], function () {
6
+ "use strict";
7
+
8
+ const jsxRenderManager = function (type, mSettings, key, renderManager) {
9
+ return () => {
10
+ if (typeof type === "string") {
11
+ if (mSettings.ref) {
12
+ renderManager.openStart(type, mSettings.ref);
13
+ } else {
14
+ renderManager.openStart(type);
15
+ }
16
+ for (const mSetting in mSettings) {
17
+ if (mSetting !== "children" && mSetting !== "ref") {
18
+ renderManager.attr(mSetting, mSettings[mSetting]);
19
+ }
20
+ }
21
+ renderManager.openEnd();
22
+ }
23
+ const children = mSettings.children;
24
+ if (Array.isArray(children)) {
25
+ children.forEach(child => {
26
+ if (typeof child === "string") {
27
+ renderManager.text(child);
28
+ } else if (typeof child === "function") {
29
+ child();
30
+ } else if (child !== undefined) {
31
+ renderManager.renderControl(child);
32
+ }
33
+ });
34
+ } else {
35
+ renderManager.text(mSettings["children"]);
36
+ }
37
+ if (typeof type === "string") {
38
+ renderManager.close(type);
39
+ }
40
+ };
41
+ };
42
+ return jsxRenderManager;
43
+ }, false);
44
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJqc3hSZW5kZXJNYW5hZ2VyIiwidHlwZSIsIm1TZXR0aW5ncyIsImtleSIsInJlbmRlck1hbmFnZXIiLCJyZWYiLCJvcGVuU3RhcnQiLCJtU2V0dGluZyIsImF0dHIiLCJvcGVuRW5kIiwiY2hpbGRyZW4iLCJBcnJheSIsImlzQXJyYXkiLCJmb3JFYWNoIiwiY2hpbGQiLCJ0ZXh0IiwidW5kZWZpbmVkIiwicmVuZGVyQ29udHJvbCIsImNsb3NlIl0sInNvdXJjZVJvb3QiOiIuIiwic291cmNlcyI6WyJqc3gtcmVuZGVyTWFuYWdlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSBSZW5kZXJNYW5hZ2VyIGZyb20gXCJzYXAvdWkvY29yZS9SZW5kZXJNYW5hZ2VyXCI7XG5cbmNvbnN0IGpzeFJlbmRlck1hbmFnZXIgPSBmdW5jdGlvbiAoXG5cdHR5cGU6IHN0cmluZyB8IEZ1bmN0aW9uLFxuXHRtU2V0dGluZ3M6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG5cdGtleTogc3RyaW5nLFxuXHRyZW5kZXJNYW5hZ2VyOiBSZW5kZXJNYW5hZ2VyXG4pOiBGdW5jdGlvbiB7XG5cdHJldHVybiAoKSA9PiB7XG5cdFx0aWYgKHR5cGVvZiB0eXBlID09PSBcInN0cmluZ1wiKSB7XG5cdFx0XHRpZiAobVNldHRpbmdzLnJlZikge1xuXHRcdFx0XHRyZW5kZXJNYW5hZ2VyLm9wZW5TdGFydCh0eXBlLCBtU2V0dGluZ3MucmVmKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJlbmRlck1hbmFnZXIub3BlblN0YXJ0KHR5cGUpO1xuXHRcdFx0fVxuXHRcdFx0Zm9yIChjb25zdCBtU2V0dGluZyBpbiBtU2V0dGluZ3MpIHtcblx0XHRcdFx0aWYgKG1TZXR0aW5nICE9PSBcImNoaWxkcmVuXCIgJiYgbVNldHRpbmcgIT09IFwicmVmXCIpIHtcblx0XHRcdFx0XHRyZW5kZXJNYW5hZ2VyLmF0dHIobVNldHRpbmcsIG1TZXR0aW5nc1ttU2V0dGluZ10pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZW5kZXJNYW5hZ2VyLm9wZW5FbmQoKTtcblx0XHR9XG5cdFx0Y29uc3QgY2hpbGRyZW46IHN0cmluZyB8IEZ1bmN0aW9uW10gPSBtU2V0dGluZ3MuY2hpbGRyZW47XG5cdFx0aWYgKEFycmF5LmlzQXJyYXkoY2hpbGRyZW4pKSB7XG5cdFx0XHRjaGlsZHJlbi5mb3JFYWNoKChjaGlsZCkgPT4ge1xuXHRcdFx0XHRpZiAodHlwZW9mIGNoaWxkID09PSBcInN0cmluZ1wiKSB7XG5cdFx0XHRcdFx0cmVuZGVyTWFuYWdlci50ZXh0KGNoaWxkKTtcblx0XHRcdFx0fSBlbHNlIGlmICh0eXBlb2YgY2hpbGQgPT09IFwiZnVuY3Rpb25cIikge1xuXHRcdFx0XHRcdGNoaWxkKCk7XG5cdFx0XHRcdH0gZWxzZSBpZiAoY2hpbGQgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdHJlbmRlck1hbmFnZXIucmVuZGVyQ29udHJvbChjaGlsZCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZW5kZXJNYW5hZ2VyLnRleHQobVNldHRpbmdzW1wiY2hpbGRyZW5cIl0pO1xuXHRcdH1cblxuXHRcdGlmICh0eXBlb2YgdHlwZSA9PT0gXCJzdHJpbmdcIikge1xuXHRcdFx0cmVuZGVyTWFuYWdlci5jbG9zZSh0eXBlKTtcblx0XHR9XG5cdH07XG59O1xuZXhwb3J0IGRlZmF1bHQganN4UmVuZGVyTWFuYWdlcjtcbiJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQUE7QUFBQTs7OztFQUVBLE1BQU1BLGdCQUFnQixHQUFHLFVBQ3hCQyxJQUF1QixFQUN2QkMsU0FBaUMsRUFDakNDLEdBQVcsRUFDWEMsYUFBNEIsRUFDakI7SUFDWCxPQUFPLE1BQU07TUFDWixJQUFJLE9BQU9ILElBQUksS0FBSyxRQUFRLEVBQUU7UUFDN0IsSUFBSUMsU0FBUyxDQUFDRyxHQUFHLEVBQUU7VUFDbEJELGFBQWEsQ0FBQ0UsU0FBUyxDQUFDTCxJQUFJLEVBQUVDLFNBQVMsQ0FBQ0csR0FBRyxDQUFDO1FBQzdDLENBQUMsTUFBTTtVQUNORCxhQUFhLENBQUNFLFNBQVMsQ0FBQ0wsSUFBSSxDQUFDO1FBQzlCO1FBQ0EsS0FBSyxNQUFNTSxRQUFRLElBQUlMLFNBQVMsRUFBRTtVQUNqQyxJQUFJSyxRQUFRLEtBQUssVUFBVSxJQUFJQSxRQUFRLEtBQUssS0FBSyxFQUFFO1lBQ2xESCxhQUFhLENBQUNJLElBQUksQ0FBQ0QsUUFBUSxFQUFFTCxTQUFTLENBQUNLLFFBQVEsQ0FBQyxDQUFDO1VBQ2xEO1FBQ0Q7UUFDQUgsYUFBYSxDQUFDSyxPQUFPLEVBQUU7TUFDeEI7TUFDQSxNQUFNQyxRQUE2QixHQUFHUixTQUFTLENBQUNRLFFBQVE7TUFDeEQsSUFBSUMsS0FBSyxDQUFDQyxPQUFPLENBQUNGLFFBQVEsQ0FBQyxFQUFFO1FBQzVCQSxRQUFRLENBQUNHLE9BQU8sQ0FBRUMsS0FBSyxJQUFLO1VBQzNCLElBQUksT0FBT0EsS0FBSyxLQUFLLFFBQVEsRUFBRTtZQUM5QlYsYUFBYSxDQUFDVyxJQUFJLENBQUNELEtBQUssQ0FBQztVQUMxQixDQUFDLE1BQU0sSUFBSSxPQUFPQSxLQUFLLEtBQUssVUFBVSxFQUFFO1lBQ3ZDQSxLQUFLLEVBQUU7VUFDUixDQUFDLE1BQU0sSUFBSUEsS0FBSyxLQUFLRSxTQUFTLEVBQUU7WUFDL0JaLGFBQWEsQ0FBQ2EsYUFBYSxDQUFDSCxLQUFLLENBQUM7VUFDbkM7UUFDRCxDQUFDLENBQUM7TUFDSCxDQUFDLE1BQU07UUFDTlYsYUFBYSxDQUFDVyxJQUFJLENBQUNiLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQztNQUMxQztNQUVBLElBQUksT0FBT0QsSUFBSSxLQUFLLFFBQVEsRUFBRTtRQUM3QkcsYUFBYSxDQUFDYyxLQUFLLENBQUNqQixJQUFJLENBQUM7TUFDMUI7SUFDRCxDQUFDO0VBQ0YsQ0FBQztFQUFDLE9BQ2FELGdCQUFnQjtBQUFBIn0=
@@ -0,0 +1,43 @@
1
+ import type RenderManager from "sap/ui/core/RenderManager";
2
+
3
+ const jsxRenderManager = function (
4
+ type: string | Function,
5
+ mSettings: Record<string, string>,
6
+ key: string,
7
+ renderManager: RenderManager
8
+ ): Function {
9
+ return () => {
10
+ if (typeof type === "string") {
11
+ if (mSettings.ref) {
12
+ renderManager.openStart(type, mSettings.ref);
13
+ } else {
14
+ renderManager.openStart(type);
15
+ }
16
+ for (const mSetting in mSettings) {
17
+ if (mSetting !== "children" && mSetting !== "ref") {
18
+ renderManager.attr(mSetting, mSettings[mSetting]);
19
+ }
20
+ }
21
+ renderManager.openEnd();
22
+ }
23
+ const children: string | Function[] = mSettings.children;
24
+ if (Array.isArray(children)) {
25
+ children.forEach((child) => {
26
+ if (typeof child === "string") {
27
+ renderManager.text(child);
28
+ } else if (typeof child === "function") {
29
+ child();
30
+ } else if (child !== undefined) {
31
+ renderManager.renderControl(child);
32
+ }
33
+ });
34
+ } else {
35
+ renderManager.text(mSettings["children"]);
36
+ }
37
+
38
+ if (typeof type === "string") {
39
+ renderManager.close(type);
40
+ }
41
+ };
42
+ };
43
+ export default jsxRenderManager;
@@ -0,0 +1,237 @@
1
+ /*!
2
+ * SAP UI development toolkit for HTML5 (SAPUI5)
3
+ * (c) Copyright 2009-2024 SAP SE. All rights reserved
4
+ */
5
+ sap.ui.define(["sap/fe/core/helpers/BindingToolkit"], function (BindingToolkit) {
6
+ "use strict";
7
+
8
+ var isBindingToolkitExpression = BindingToolkit.isBindingToolkitExpression;
9
+ const writeChildren = function (val) {
10
+ if (Array.isArray(val)) {
11
+ return val.join("");
12
+ } else {
13
+ return val;
14
+ }
15
+ };
16
+
17
+ /**
18
+ * Some characters needs to be escaped when used as XML attribute value, otherwise this result in incorrect XML.
19
+ *
20
+ * @param value
21
+ * @returns The escaped xml attribute
22
+ */
23
+ function escapeXMLAttributeValue(value) {
24
+ return value === null || value === void 0 ? void 0 : value.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/"/g, "&quot;").replace(/'/g, "&apos;");
25
+ }
26
+ const addChildAggregation = function (aggregationChildren, aggregationName, child) {
27
+ if (child === undefined) {
28
+ return;
29
+ }
30
+ if (!aggregationChildren[aggregationName]) {
31
+ aggregationChildren[aggregationName] = [];
32
+ }
33
+ if (typeof child === "string") {
34
+ if (child.trim().length > 0) {
35
+ aggregationChildren[aggregationName].push(child);
36
+ }
37
+ } else if (Array.isArray(child)) {
38
+ child.forEach(subChild => {
39
+ addChildAggregation(aggregationChildren, aggregationName, subChild);
40
+ });
41
+ } else {
42
+ for (const childKey of Object.keys(child)) {
43
+ addChildAggregation(aggregationChildren, childKey, child[childKey]);
44
+ }
45
+ }
46
+ };
47
+ const isAControl = function (children) {
48
+ return !!(children !== null && children !== void 0 && children.getMetadata);
49
+ };
50
+ const FL_DELEGATE = "fl:delegate";
51
+ const CORE_REQUIRE = "core:require";
52
+ const LOG_SOURCEPATH = "log:sourcePath";
53
+ const CUSTOM_LOADVALUE = "customData:loadValue";
54
+ const CUSTOM_URL = "customData:url";
55
+ function processObjectPropertyValue(childrenObject, namespaceAlias, propertyName) {
56
+ // This is called when the child is
57
+ const aggregationProperties = [];
58
+ const aggregationChildren = [];
59
+ Object.keys(childrenObject).forEach(subPropName => {
60
+ const childValue = childrenObject[subPropName];
61
+ if (childValue !== undefined) {
62
+ if (typeof childValue === "object") {
63
+ // if the property is a value it needs to be serialized as a children
64
+ // <myObjectProp prop1='xxx', prop2='xxt'/>
65
+ aggregationChildren.push(processObjectPropertyValue(childValue, namespaceAlias, subPropName));
66
+ } else {
67
+ // Otherwise it's part of the main object just as another property
68
+ aggregationProperties.push(`${subPropName}='${escapeXMLAttributeValue(childValue.toString())}'`);
69
+ }
70
+ }
71
+ });
72
+ return `<${namespaceAlias}:${propertyName} ${aggregationProperties.join(" ")}>${aggregationChildren.join("\n")}</${namespaceAlias}:${propertyName}>`;
73
+ }
74
+ function processProperties(mSettings, metadataProperties, namespaceAlias, propertiesString, aggregationString) {
75
+ Object.keys(metadataProperties).forEach(propertyName => {
76
+ var _mSettings$children, _mSettings$children2;
77
+ if (mSettings.hasOwnProperty(propertyName) && mSettings[propertyName] !== undefined) {
78
+ const propertyValue = mSettings[propertyName];
79
+ if (propertyName === CORE_REQUIRE) {
80
+ propertiesString.push(`xmlns:core="sap.ui.core"`);
81
+ }
82
+ if (propertyName === LOG_SOURCEPATH) {
83
+ propertiesString.push(`xmlns:log="http://schemas.sap.com/sapui5/extension/sap.ui.core.CustomData/1"`);
84
+ }
85
+ if (propertyName === CUSTOM_URL || propertyName === CUSTOM_LOADVALUE) {
86
+ propertiesString.push(`xmlns:customData="http://schemas.sap.com/sapui5/extension/sap.ui.core.CustomData/1"`);
87
+ }
88
+ if (propertyValue && typeof propertyValue === "object") {
89
+ if (metadataProperties[propertyName].type === "sap.ui.model.Context") {
90
+ propertiesString.push(`${propertyName}='${propertyValue.getPath()}'`);
91
+ } else if (isBindingToolkitExpression(propertyValue) || propertyName === "delegate") {
92
+ propertiesString.push(`${propertyName}='${JSON.stringify(mSettings[propertyName])}'`);
93
+ } else if (Array.isArray(propertyValue)) {
94
+ if (propertyValue.length === 1) {
95
+ propertiesString.push(`${propertyName}='${JSON.stringify(propertyValue[0])}'`);
96
+ } else {
97
+ propertiesString.push(`${propertyName}='${JSON.stringify(mSettings[propertyName])}'`);
98
+ }
99
+ } else {
100
+ const complexProperty = [];
101
+ const propertyValueObj = propertyValue;
102
+ Object.keys(propertyValueObj).forEach(subPropName => {
103
+ if (propertyValueObj[subPropName] !== undefined) {
104
+ complexProperty.push(`${subPropName}='${escapeXMLAttributeValue(propertyValueObj[subPropName].toString())}'`);
105
+ }
106
+ });
107
+ aggregationString.push(`<${propertyName} ${complexProperty.join(" ")}/>`);
108
+ }
109
+ } else {
110
+ const prop = mSettings[propertyName];
111
+ propertiesString.push(`${propertyName}='${escapeXMLAttributeValue(prop.toString())}'`);
112
+ }
113
+ } else if ((_mSettings$children = mSettings.children) !== null && _mSettings$children !== void 0 && _mSettings$children.hasOwnProperty(propertyName) && Object.keys(((_mSettings$children2 = mSettings.children) === null || _mSettings$children2 === void 0 ? void 0 : _mSettings$children2[propertyName]) ?? {}).length > 0) {
114
+ var _mSettings$children3;
115
+ // Object / Array properties are part of the `children` aggregation and as such still need to be processed as properties
116
+ const childrenObject = (_mSettings$children3 = mSettings.children) === null || _mSettings$children3 === void 0 ? void 0 : _mSettings$children3[propertyName];
117
+ aggregationString.push(processObjectPropertyValue(childrenObject, namespaceAlias, propertyName));
118
+ }
119
+ });
120
+ }
121
+ function processAggregations(mSettings, metadataAggregations, namespaceAlias, defaultAggregationName, propertiesString, aggregationString) {
122
+ const aggregationChildren = {};
123
+ addChildAggregation(aggregationChildren, defaultAggregationName ?? "customData", mSettings.children);
124
+ const aggregationChildKeys = Object.keys(aggregationChildren);
125
+ let writeOnlyDefaultAggregation = false;
126
+ if (aggregationChildKeys.length === 1 && aggregationChildKeys[0] === defaultAggregationName) {
127
+ writeOnlyDefaultAggregation = true;
128
+ }
129
+ Object.keys(metadataAggregations).forEach(aggregationName => {
130
+ if (aggregationChildren.hasOwnProperty(aggregationName) && aggregationChildren[aggregationName].length > 0) {
131
+ if (aggregationName === defaultAggregationName && writeOnlyDefaultAggregation) {
132
+ aggregationString.push(`${writeChildren(aggregationChildren[aggregationName])}`);
133
+ } else {
134
+ aggregationString.push(`<${namespaceAlias}:${aggregationName}>
135
+ ${writeChildren(aggregationChildren[aggregationName])}
136
+ </${namespaceAlias}:${aggregationName}>`);
137
+ }
138
+ }
139
+ if (mSettings.hasOwnProperty(aggregationName) && mSettings[aggregationName] !== undefined) {
140
+ if (typeof mSettings[aggregationName] === "object") {
141
+ propertiesString.push(`${aggregationName}='${JSON.stringify(mSettings[aggregationName])}'`);
142
+ } else {
143
+ // In some case the aggregation expect a string value (like for the tooltip), in this case we set it directly as a property
144
+ propertiesString.push(`${aggregationName}='${mSettings[aggregationName]}'`);
145
+ }
146
+ }
147
+ });
148
+ return aggregationChildren;
149
+ }
150
+ const jsxXml = function (type, mSettings, key, xmlNamespaceMap, overrideNodeName) {
151
+ let metadata;
152
+ let metadataProperties;
153
+ let controlName;
154
+ let metadataAggregations;
155
+ let defaultAggregationName;
156
+ if (isAControl(type)) {
157
+ metadata = type.getMetadata();
158
+ metadataProperties = metadata.getAllProperties();
159
+ metadataProperties = {
160
+ ...metadataProperties,
161
+ ...metadata.getAllEvents(),
162
+ ...metadata.getAllAssociations()
163
+ };
164
+ controlName = metadata.getName();
165
+ metadataAggregations = metadata.getAllAggregations();
166
+ defaultAggregationName = metadata.getDefaultAggregationName();
167
+ } else {
168
+ metadata = type.metadata;
169
+ metadataProperties = metadata.properties;
170
+ metadataAggregations = {
171
+ ...{
172
+ dependents: {},
173
+ customData: {}
174
+ },
175
+ ...metadata.aggregations
176
+ };
177
+ defaultAggregationName = metadata.defaultAggregation;
178
+ controlName = metadata.namespace + "." + metadata.name;
179
+ }
180
+ const namesSplit = controlName.split(".");
181
+ if (key !== undefined) {
182
+ mSettings["key"] = key;
183
+ }
184
+ metadataProperties["class"] = {
185
+ name: "class"
186
+ };
187
+ metadataProperties["id"] = {
188
+ name: "id"
189
+ };
190
+ metadataProperties[FL_DELEGATE] = {
191
+ name: FL_DELEGATE
192
+ };
193
+ metadataProperties[CORE_REQUIRE] = {
194
+ name: CORE_REQUIRE
195
+ };
196
+ metadataProperties[LOG_SOURCEPATH] = {
197
+ name: LOG_SOURCEPATH
198
+ };
199
+ metadataProperties[CUSTOM_LOADVALUE] = {
200
+ name: CUSTOM_LOADVALUE
201
+ };
202
+ metadataProperties[CUSTOM_URL] = {
203
+ name: CUSTOM_URL
204
+ };
205
+ metadataProperties["xmlns:fl"] = {
206
+ name: FL_DELEGATE
207
+ };
208
+ metadataProperties["xmlns:core"] = {
209
+ name: CORE_REQUIRE
210
+ };
211
+ metadataProperties["xmlns:log"] = {
212
+ name: LOG_SOURCEPATH
213
+ };
214
+ if (controlName === "sap.ui.core.Fragment") {
215
+ metadataProperties["fragmentName"] = {
216
+ name: "fragmentName"
217
+ };
218
+ }
219
+ const namespace = namesSplit.slice(0, -1);
220
+ const name = namesSplit[namesSplit.length - 1];
221
+ let namespaceAlias = namespace[namespace.length - 1];
222
+ if (xmlNamespaceMap[namespace.join(".")]) {
223
+ namespaceAlias = xmlNamespaceMap[namespace.join(".")];
224
+ }
225
+ let tagName = `${namespaceAlias}:${name}`;
226
+ const propertiesString = [];
227
+ const aggregationString = [];
228
+ processProperties(mSettings, metadataProperties, namespaceAlias, propertiesString, aggregationString);
229
+ processAggregations(mSettings, metadataAggregations, namespaceAlias, defaultAggregationName, propertiesString, aggregationString);
230
+ if (overrideNodeName) {
231
+ tagName = overrideNodeName;
232
+ }
233
+ return `<${tagName} xmlns:${namespaceAlias}="${namespace.join(".")}" ${propertiesString.join(" ")}>${aggregationString.join("")}</${tagName}>`;
234
+ };
235
+ return jsxXml;
236
+ }, false);
237
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ3cml0ZUNoaWxkcmVuIiwidmFsIiwiQXJyYXkiLCJpc0FycmF5Iiwiam9pbiIsImVzY2FwZVhNTEF0dHJpYnV0ZVZhbHVlIiwidmFsdWUiLCJyZXBsYWNlIiwiYWRkQ2hpbGRBZ2dyZWdhdGlvbiIsImFnZ3JlZ2F0aW9uQ2hpbGRyZW4iLCJhZ2dyZWdhdGlvbk5hbWUiLCJjaGlsZCIsInVuZGVmaW5lZCIsInRyaW0iLCJsZW5ndGgiLCJwdXNoIiwiZm9yRWFjaCIsInN1YkNoaWxkIiwiY2hpbGRLZXkiLCJPYmplY3QiLCJrZXlzIiwiaXNBQ29udHJvbCIsImNoaWxkcmVuIiwiZ2V0TWV0YWRhdGEiLCJGTF9ERUxFR0FURSIsIkNPUkVfUkVRVUlSRSIsIkxPR19TT1VSQ0VQQVRIIiwiQ1VTVE9NX0xPQURWQUxVRSIsIkNVU1RPTV9VUkwiLCJwcm9jZXNzT2JqZWN0UHJvcGVydHlWYWx1ZSIsImNoaWxkcmVuT2JqZWN0IiwibmFtZXNwYWNlQWxpYXMiLCJwcm9wZXJ0eU5hbWUiLCJhZ2dyZWdhdGlvblByb3BlcnRpZXMiLCJzdWJQcm9wTmFtZSIsImNoaWxkVmFsdWUiLCJ0b1N0cmluZyIsInByb2Nlc3NQcm9wZXJ0aWVzIiwibVNldHRpbmdzIiwibWV0YWRhdGFQcm9wZXJ0aWVzIiwicHJvcGVydGllc1N0cmluZyIsImFnZ3JlZ2F0aW9uU3RyaW5nIiwiaGFzT3duUHJvcGVydHkiLCJwcm9wZXJ0eVZhbHVlIiwidHlwZSIsImdldFBhdGgiLCJpc0JpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiIsIkpTT04iLCJzdHJpbmdpZnkiLCJjb21wbGV4UHJvcGVydHkiLCJwcm9wZXJ0eVZhbHVlT2JqIiwicHJvcCIsInByb2Nlc3NBZ2dyZWdhdGlvbnMiLCJtZXRhZGF0YUFnZ3JlZ2F0aW9ucyIsImRlZmF1bHRBZ2dyZWdhdGlvbk5hbWUiLCJhZ2dyZWdhdGlvbkNoaWxkS2V5cyIsIndyaXRlT25seURlZmF1bHRBZ2dyZWdhdGlvbiIsImpzeFhtbCIsImtleSIsInhtbE5hbWVzcGFjZU1hcCIsIm92ZXJyaWRlTm9kZU5hbWUiLCJtZXRhZGF0YSIsImNvbnRyb2xOYW1lIiwiZ2V0QWxsUHJvcGVydGllcyIsImdldEFsbEV2ZW50cyIsImdldEFsbEFzc29jaWF0aW9ucyIsImdldE5hbWUiLCJnZXRBbGxBZ2dyZWdhdGlvbnMiLCJnZXREZWZhdWx0QWdncmVnYXRpb25OYW1lIiwicHJvcGVydGllcyIsImRlcGVuZGVudHMiLCJjdXN0b21EYXRhIiwiYWdncmVnYXRpb25zIiwiZGVmYXVsdEFnZ3JlZ2F0aW9uIiwibmFtZXNwYWNlIiwibmFtZSIsIm5hbWVzU3BsaXQiLCJzcGxpdCIsInNsaWNlIiwidGFnTmFtZSJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsianN4LXhtbC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IENvbnRyb2xQcm9wZXJ0aWVzLCBOb25Db250cm9sUHJvcGVydGllcyB9IGZyb20gXCJzYXAvZmUvYmFzZS9qc3gtcnVudGltZS9qc3hcIjtcbmltcG9ydCB0eXBlIEJ1aWxkaW5nQmxvY2tUZW1wbGF0aW5nQmFzZSBmcm9tIFwic2FwL2ZlL2NvcmUvYnVpbGRpbmdCbG9ja3MvdGVtcGxhdGluZy9CdWlsZGluZ0Jsb2NrVGVtcGxhdGluZ0Jhc2VcIjtcbmltcG9ydCB7IGlzQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvQmluZGluZ1Rvb2xraXRcIjtcbmltcG9ydCB0eXBlIENvbnRyb2wgZnJvbSBcInNhcC91aS9jb3JlL0NvbnRyb2xcIjtcbmltcG9ydCB0eXBlIFVJNUVsZW1lbnQgZnJvbSBcInNhcC91aS9jb3JlL0VsZW1lbnRcIjtcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9Db250ZXh0XCI7XG5cbmNvbnN0IHdyaXRlQ2hpbGRyZW4gPSBmdW5jdGlvbiAodmFsOiBzdHJpbmcgfCBzdHJpbmdbXSk6IHN0cmluZyB7XG5cdGlmIChBcnJheS5pc0FycmF5KHZhbCkpIHtcblx0XHRyZXR1cm4gdmFsLmpvaW4oXCJcIik7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIHZhbDtcblx0fVxufTtcblxuLyoqXG4gKiBTb21lIGNoYXJhY3RlcnMgbmVlZHMgdG8gYmUgZXNjYXBlZCB3aGVuIHVzZWQgYXMgWE1MIGF0dHJpYnV0ZSB2YWx1ZSwgb3RoZXJ3aXNlIHRoaXMgcmVzdWx0IGluIGluY29ycmVjdCBYTUwuXG4gKlxuICogQHBhcmFtIHZhbHVlXG4gKiBAcmV0dXJucyBUaGUgZXNjYXBlZCB4bWwgYXR0cmlidXRlXG4gKi9cbmZ1bmN0aW9uIGVzY2FwZVhNTEF0dHJpYnV0ZVZhbHVlKHZhbHVlPzogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0cmV0dXJuIHZhbHVlPy5yZXBsYWNlKC8mL2csIFwiJmFtcDtcIikucmVwbGFjZSgvPC9nLCBcIiZsdDtcIikucmVwbGFjZSgvXCIvZywgXCImcXVvdDtcIikucmVwbGFjZSgvJy9nLCBcIiZhcG9zO1wiKTtcbn1cblxuY29uc3QgYWRkQ2hpbGRBZ2dyZWdhdGlvbiA9IGZ1bmN0aW9uIChcblx0YWdncmVnYXRpb25DaGlsZHJlbjogUmVjb3JkPHN0cmluZywgKENvbnRyb2wgfCBzdHJpbmcpW10+LFxuXHRhZ2dyZWdhdGlvbk5hbWU6IHN0cmluZyxcblx0Y2hpbGQ6IHN0cmluZyB8IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbik6IHZvaWQge1xuXHRpZiAoY2hpbGQgPT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybjtcblx0fVxuXHRpZiAoIWFnZ3JlZ2F0aW9uQ2hpbGRyZW5bYWdncmVnYXRpb25OYW1lXSkge1xuXHRcdGFnZ3JlZ2F0aW9uQ2hpbGRyZW5bYWdncmVnYXRpb25OYW1lXSA9IFtdO1xuXHR9XG5cdGlmICh0eXBlb2YgY2hpbGQgPT09IFwic3RyaW5nXCIpIHtcblx0XHRpZiAoY2hpbGQudHJpbSgpLmxlbmd0aCA+IDApIHtcblx0XHRcdGFnZ3JlZ2F0aW9uQ2hpbGRyZW5bYWdncmVnYXRpb25OYW1lXS5wdXNoKGNoaWxkKTtcblx0XHR9XG5cdH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShjaGlsZCkpIHtcblx0XHRjaGlsZC5mb3JFYWNoKChzdWJDaGlsZCkgPT4ge1xuXHRcdFx0YWRkQ2hpbGRBZ2dyZWdhdGlvbihhZ2dyZWdhdGlvbkNoaWxkcmVuLCBhZ2dyZWdhdGlvbk5hbWUsIHN1YkNoaWxkKTtcblx0XHR9KTtcblx0fSBlbHNlIHtcblx0XHRmb3IgKGNvbnN0IGNoaWxkS2V5IG9mIE9iamVjdC5rZXlzKGNoaWxkKSkge1xuXHRcdFx0YWRkQ2hpbGRBZ2dyZWdhdGlvbihhZ2dyZWdhdGlvbkNoaWxkcmVuLCBjaGlsZEtleSwgY2hpbGRbY2hpbGRLZXldKTtcblx0XHR9XG5cdH1cbn07XG5cbmNvbnN0IGlzQUNvbnRyb2wgPSBmdW5jdGlvbiAoY2hpbGRyZW4/OiB0eXBlb2YgQ29udHJvbCB8IEZ1bmN0aW9uKTogY2hpbGRyZW4gaXMgdHlwZW9mIENvbnRyb2wge1xuXHRyZXR1cm4gISEoY2hpbGRyZW4gYXMgdHlwZW9mIENvbnRyb2wpPy5nZXRNZXRhZGF0YTtcbn07XG5cbmNvbnN0IEZMX0RFTEVHQVRFID0gXCJmbDpkZWxlZ2F0ZVwiO1xuY29uc3QgQ09SRV9SRVFVSVJFID0gXCJjb3JlOnJlcXVpcmVcIjtcbmNvbnN0IExPR19TT1VSQ0VQQVRIID0gXCJsb2c6c291cmNlUGF0aFwiO1xuY29uc3QgQ1VTVE9NX0xPQURWQUxVRSA9IFwiY3VzdG9tRGF0YTpsb2FkVmFsdWVcIjtcbmNvbnN0IENVU1RPTV9VUkwgPSBcImN1c3RvbURhdGE6dXJsXCI7XG5cbmZ1bmN0aW9uIHByb2Nlc3NPYmplY3RQcm9wZXJ0eVZhbHVlKGNoaWxkcmVuT2JqZWN0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgbmFtZXNwYWNlQWxpYXM6IHN0cmluZywgcHJvcGVydHlOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuXHQvLyBUaGlzIGlzIGNhbGxlZCB3aGVuIHRoZSBjaGlsZCBpc1xuXHRjb25zdCBhZ2dyZWdhdGlvblByb3BlcnRpZXM6IHN0cmluZ1tdID0gW107XG5cdGNvbnN0IGFnZ3JlZ2F0aW9uQ2hpbGRyZW46IHN0cmluZ1tdID0gW107XG5cdE9iamVjdC5rZXlzKGNoaWxkcmVuT2JqZWN0KS5mb3JFYWNoKChzdWJQcm9wTmFtZSkgPT4ge1xuXHRcdGNvbnN0IGNoaWxkVmFsdWUgPSBjaGlsZHJlbk9iamVjdFtzdWJQcm9wTmFtZV07XG5cdFx0aWYgKGNoaWxkVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0aWYgKHR5cGVvZiBjaGlsZFZhbHVlID09PSBcIm9iamVjdFwiKSB7XG5cdFx0XHRcdC8vIGlmIHRoZSBwcm9wZXJ0eSBpcyBhIHZhbHVlIGl0IG5lZWRzIHRvIGJlIHNlcmlhbGl6ZWQgYXMgYSBjaGlsZHJlblxuXHRcdFx0XHQvLyA8bXlPYmplY3RQcm9wIHByb3AxPSd4eHgnLCBwcm9wMj0neHh0Jy8+XG5cdFx0XHRcdGFnZ3JlZ2F0aW9uQ2hpbGRyZW4ucHVzaChwcm9jZXNzT2JqZWN0UHJvcGVydHlWYWx1ZShjaGlsZFZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBuYW1lc3BhY2VBbGlhcywgc3ViUHJvcE5hbWUpKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIE90aGVyd2lzZSBpdCdzIHBhcnQgb2YgdGhlIG1haW4gb2JqZWN0IGp1c3QgYXMgYW5vdGhlciBwcm9wZXJ0eVxuXHRcdFx0XHRhZ2dyZWdhdGlvblByb3BlcnRpZXMucHVzaChgJHtzdWJQcm9wTmFtZX09JyR7ZXNjYXBlWE1MQXR0cmlidXRlVmFsdWUoY2hpbGRWYWx1ZS50b1N0cmluZygpKX0nYCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9KTtcblx0cmV0dXJuIGA8JHtuYW1lc3BhY2VBbGlhc306JHtwcm9wZXJ0eU5hbWV9ICR7YWdncmVnYXRpb25Qcm9wZXJ0aWVzLmpvaW4oXCIgXCIpfT4ke2FnZ3JlZ2F0aW9uQ2hpbGRyZW4uam9pbihcblx0XHRcIlxcblwiXG5cdCl9PC8ke25hbWVzcGFjZUFsaWFzfToke3Byb3BlcnR5TmFtZX0+YDtcbn1cblxuZnVuY3Rpb24gcHJvY2Vzc1Byb3BlcnRpZXM8VD4oXG5cdG1TZXR0aW5nczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG5cdG1ldGFkYXRhUHJvcGVydGllczogUmVjb3JkPFxuXHRcdHN0cmluZyxcblx0XHR7XG5cdFx0XHRuYW1lPzogc3RyaW5nO1xuXHRcdFx0dHlwZT86IHN0cmluZztcblx0XHR9XG5cdD4sXG5cdG5hbWVzcGFjZUFsaWFzOiBzdHJpbmcsXG5cdHByb3BlcnRpZXNTdHJpbmc6IHN0cmluZ1tdLFxuXHRhZ2dyZWdhdGlvblN0cmluZzogc3RyaW5nW11cbik6IHZvaWQge1xuXHRPYmplY3Qua2V5cyhtZXRhZGF0YVByb3BlcnRpZXMpLmZvckVhY2goKHByb3BlcnR5TmFtZSkgPT4ge1xuXHRcdGlmIChtU2V0dGluZ3MuaGFzT3duUHJvcGVydHkocHJvcGVydHlOYW1lKSAmJiBtU2V0dGluZ3NbcHJvcGVydHlOYW1lXSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRjb25zdCBwcm9wZXJ0eVZhbHVlID0gbVNldHRpbmdzW3Byb3BlcnR5TmFtZV07XG5cdFx0XHRpZiAocHJvcGVydHlOYW1lID09PSBDT1JFX1JFUVVJUkUpIHtcblx0XHRcdFx0cHJvcGVydGllc1N0cmluZy5wdXNoKGB4bWxuczpjb3JlPVwic2FwLnVpLmNvcmVcImApO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHByb3BlcnR5TmFtZSA9PT0gTE9HX1NPVVJDRVBBVEgpIHtcblx0XHRcdFx0cHJvcGVydGllc1N0cmluZy5wdXNoKGB4bWxuczpsb2c9XCJodHRwOi8vc2NoZW1hcy5zYXAuY29tL3NhcHVpNS9leHRlbnNpb24vc2FwLnVpLmNvcmUuQ3VzdG9tRGF0YS8xXCJgKTtcblx0XHRcdH1cblx0XHRcdGlmIChwcm9wZXJ0eU5hbWUgPT09IENVU1RPTV9VUkwgfHwgcHJvcGVydHlOYW1lID09PSBDVVNUT01fTE9BRFZBTFVFKSB7XG5cdFx0XHRcdHByb3BlcnRpZXNTdHJpbmcucHVzaChgeG1sbnM6Y3VzdG9tRGF0YT1cImh0dHA6Ly9zY2hlbWFzLnNhcC5jb20vc2FwdWk1L2V4dGVuc2lvbi9zYXAudWkuY29yZS5DdXN0b21EYXRhLzFcImApO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHByb3BlcnR5VmFsdWUgJiYgdHlwZW9mIHByb3BlcnR5VmFsdWUgPT09IFwib2JqZWN0XCIpIHtcblx0XHRcdFx0aWYgKG1ldGFkYXRhUHJvcGVydGllc1twcm9wZXJ0eU5hbWVdLnR5cGUgPT09IFwic2FwLnVpLm1vZGVsLkNvbnRleHRcIikge1xuXHRcdFx0XHRcdHByb3BlcnRpZXNTdHJpbmcucHVzaChgJHtwcm9wZXJ0eU5hbWV9PSckeyhwcm9wZXJ0eVZhbHVlIGFzIENvbnRleHQpLmdldFBhdGgoKX0nYCk7XG5cdFx0XHRcdH0gZWxzZSBpZiAoaXNCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24ocHJvcGVydHlWYWx1ZSkgfHwgcHJvcGVydHlOYW1lID09PSBcImRlbGVnYXRlXCIpIHtcblx0XHRcdFx0XHRwcm9wZXJ0aWVzU3RyaW5nLnB1c2goYCR7cHJvcGVydHlOYW1lfT0nJHtKU09OLnN0cmluZ2lmeShtU2V0dGluZ3NbcHJvcGVydHlOYW1lXSl9J2ApO1xuXHRcdFx0XHR9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkocHJvcGVydHlWYWx1ZSkpIHtcblx0XHRcdFx0XHRpZiAocHJvcGVydHlWYWx1ZS5sZW5ndGggPT09IDEpIHtcblx0XHRcdFx0XHRcdHByb3BlcnRpZXNTdHJpbmcucHVzaChgJHtwcm9wZXJ0eU5hbWV9PScke0pTT04uc3RyaW5naWZ5KHByb3BlcnR5VmFsdWVbMF0pfSdgKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0cHJvcGVydGllc1N0cmluZy5wdXNoKGAke3Byb3BlcnR5TmFtZX09JyR7SlNPTi5zdHJpbmdpZnkobVNldHRpbmdzW3Byb3BlcnR5TmFtZV0pfSdgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Y29uc3QgY29tcGxleFByb3BlcnR5OiBzdHJpbmdbXSA9IFtdO1xuXHRcdFx0XHRcdGNvbnN0IHByb3BlcnR5VmFsdWVPYmogPSBwcm9wZXJ0eVZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG5cdFx0XHRcdFx0T2JqZWN0LmtleXMocHJvcGVydHlWYWx1ZU9iaikuZm9yRWFjaCgoc3ViUHJvcE5hbWUpID0+IHtcblx0XHRcdFx0XHRcdGlmIChwcm9wZXJ0eVZhbHVlT2JqW3N1YlByb3BOYW1lXSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRcdGNvbXBsZXhQcm9wZXJ0eS5wdXNoKGAke3N1YlByb3BOYW1lfT0nJHtlc2NhcGVYTUxBdHRyaWJ1dGVWYWx1ZShwcm9wZXJ0eVZhbHVlT2JqW3N1YlByb3BOYW1lXS50b1N0cmluZygpKX0nYCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0YWdncmVnYXRpb25TdHJpbmcucHVzaChgPCR7cHJvcGVydHlOYW1lfSAke2NvbXBsZXhQcm9wZXJ0eS5qb2luKFwiIFwiKX0vPmApO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCBwcm9wID0gbVNldHRpbmdzW3Byb3BlcnR5TmFtZV0gYXMgc3RyaW5nIHwgYm9vbGVhbiB8IG51bWJlcjtcblx0XHRcdFx0cHJvcGVydGllc1N0cmluZy5wdXNoKGAke3Byb3BlcnR5TmFtZX09JyR7ZXNjYXBlWE1MQXR0cmlidXRlVmFsdWUocHJvcC50b1N0cmluZygpKX0nYCk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChcblx0XHRcdG1TZXR0aW5ncy5jaGlsZHJlbj8uaGFzT3duUHJvcGVydHkocHJvcGVydHlOYW1lKSAmJlxuXHRcdFx0T2JqZWN0LmtleXMoKG1TZXR0aW5ncy5jaGlsZHJlbiBhcyBDb250cm9sUHJvcGVydGllczxUPik/Lltwcm9wZXJ0eU5hbWVdID8/IHt9KS5sZW5ndGggPiAwXG5cdFx0KSB7XG5cdFx0XHQvLyBPYmplY3QgLyBBcnJheSBwcm9wZXJ0aWVzIGFyZSBwYXJ0IG9mIHRoZSBgY2hpbGRyZW5gIGFnZ3JlZ2F0aW9uIGFuZCBhcyBzdWNoIHN0aWxsIG5lZWQgdG8gYmUgcHJvY2Vzc2VkIGFzIHByb3BlcnRpZXNcblx0XHRcdGNvbnN0IGNoaWxkcmVuT2JqZWN0ID0gKG1TZXR0aW5ncy5jaGlsZHJlbiBhcyBDb250cm9sUHJvcGVydGllczxUPik/Lltwcm9wZXJ0eU5hbWVdIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgb2JqZWN0Pjtcblx0XHRcdGFnZ3JlZ2F0aW9uU3RyaW5nLnB1c2gocHJvY2Vzc09iamVjdFByb3BlcnR5VmFsdWUoY2hpbGRyZW5PYmplY3QsIG5hbWVzcGFjZUFsaWFzLCBwcm9wZXJ0eU5hbWUpKTtcblx0XHR9XG5cdH0pO1xufVxuXG5mdW5jdGlvbiBwcm9jZXNzQWdncmVnYXRpb25zKFxuXHRtU2V0dGluZ3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuXHRtZXRhZGF0YUFnZ3JlZ2F0aW9uczogUmVjb3JkPHN0cmluZywgb2JqZWN0Pixcblx0bmFtZXNwYWNlQWxpYXM6IHN0cmluZyxcblx0ZGVmYXVsdEFnZ3JlZ2F0aW9uTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuXHRwcm9wZXJ0aWVzU3RyaW5nOiBzdHJpbmdbXSxcblx0YWdncmVnYXRpb25TdHJpbmc6IHN0cmluZ1tdXG4pOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4ge1xuXHRjb25zdCBhZ2dyZWdhdGlvbkNoaWxkcmVuOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4gPSB7fTtcblx0YWRkQ2hpbGRBZ2dyZWdhdGlvbihhZ2dyZWdhdGlvbkNoaWxkcmVuLCBkZWZhdWx0QWdncmVnYXRpb25OYW1lID8/IFwiY3VzdG9tRGF0YVwiLCBtU2V0dGluZ3MuY2hpbGRyZW4gYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPik7XG5cdGNvbnN0IGFnZ3JlZ2F0aW9uQ2hpbGRLZXlzID0gT2JqZWN0LmtleXMoYWdncmVnYXRpb25DaGlsZHJlbik7XG5cdGxldCB3cml0ZU9ubHlEZWZhdWx0QWdncmVnYXRpb24gPSBmYWxzZTtcblx0aWYgKGFnZ3JlZ2F0aW9uQ2hpbGRLZXlzLmxlbmd0aCA9PT0gMSAmJiBhZ2dyZWdhdGlvbkNoaWxkS2V5c1swXSA9PT0gZGVmYXVsdEFnZ3JlZ2F0aW9uTmFtZSkge1xuXHRcdHdyaXRlT25seURlZmF1bHRBZ2dyZWdhdGlvbiA9IHRydWU7XG5cdH1cblx0T2JqZWN0LmtleXMobWV0YWRhdGFBZ2dyZWdhdGlvbnMpLmZvckVhY2goKGFnZ3JlZ2F0aW9uTmFtZSkgPT4ge1xuXHRcdGlmIChhZ2dyZWdhdGlvbkNoaWxkcmVuLmhhc093blByb3BlcnR5KGFnZ3JlZ2F0aW9uTmFtZSkgJiYgYWdncmVnYXRpb25DaGlsZHJlblthZ2dyZWdhdGlvbk5hbWVdLmxlbmd0aCA+IDApIHtcblx0XHRcdGlmIChhZ2dyZWdhdGlvbk5hbWUgPT09IGRlZmF1bHRBZ2dyZWdhdGlvbk5hbWUgJiYgd3JpdGVPbmx5RGVmYXVsdEFnZ3JlZ2F0aW9uKSB7XG5cdFx0XHRcdGFnZ3JlZ2F0aW9uU3RyaW5nLnB1c2goYCR7d3JpdGVDaGlsZHJlbihhZ2dyZWdhdGlvbkNoaWxkcmVuW2FnZ3JlZ2F0aW9uTmFtZV0pfWApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0YWdncmVnYXRpb25TdHJpbmcucHVzaChcblx0XHRcdFx0XHRgPCR7bmFtZXNwYWNlQWxpYXN9OiR7YWdncmVnYXRpb25OYW1lfT5cblx0XHRcdFx0XHRcdCR7d3JpdGVDaGlsZHJlbihhZ2dyZWdhdGlvbkNoaWxkcmVuW2FnZ3JlZ2F0aW9uTmFtZV0pfVxuXHRcdFx0XHRcdDwvJHtuYW1lc3BhY2VBbGlhc306JHthZ2dyZWdhdGlvbk5hbWV9PmBcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKG1TZXR0aW5ncy5oYXNPd25Qcm9wZXJ0eShhZ2dyZWdhdGlvbk5hbWUpICYmIG1TZXR0aW5nc1thZ2dyZWdhdGlvbk5hbWVdICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdGlmICh0eXBlb2YgbVNldHRpbmdzW2FnZ3JlZ2F0aW9uTmFtZV0gPT09IFwib2JqZWN0XCIpIHtcblx0XHRcdFx0cHJvcGVydGllc1N0cmluZy5wdXNoKGAke2FnZ3JlZ2F0aW9uTmFtZX09JyR7SlNPTi5zdHJpbmdpZnkobVNldHRpbmdzW2FnZ3JlZ2F0aW9uTmFtZV0pfSdgKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIEluIHNvbWUgY2FzZSB0aGUgYWdncmVnYXRpb24gZXhwZWN0IGEgc3RyaW5nIHZhbHVlIChsaWtlIGZvciB0aGUgdG9vbHRpcCksIGluIHRoaXMgY2FzZSB3ZSBzZXQgaXQgZGlyZWN0bHkgYXMgYSBwcm9wZXJ0eVxuXHRcdFx0XHRwcm9wZXJ0aWVzU3RyaW5nLnB1c2goYCR7YWdncmVnYXRpb25OYW1lfT0nJHttU2V0dGluZ3NbYWdncmVnYXRpb25OYW1lXX0nYCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9KTtcblx0cmV0dXJuIGFnZ3JlZ2F0aW9uQ2hpbGRyZW47XG59XG5cbmNvbnN0IGpzeFhtbCA9IGZ1bmN0aW9uIDxUPihcblx0dHlwZTogdHlwZW9mIENvbnRyb2wgfCB0eXBlb2YgQnVpbGRpbmdCbG9ja1RlbXBsYXRpbmdCYXNlLFxuXHRtU2V0dGluZ3M6IE5vbkNvbnRyb2xQcm9wZXJ0aWVzPFQ+ICYgeyBrZXk/OiBzdHJpbmc7IGNoaWxkcmVuPzogVUk1RWxlbWVudCB8IENvbnRyb2xQcm9wZXJ0aWVzPFQ+IH0sXG5cdGtleTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuXHR4bWxOYW1lc3BhY2VNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG5cdG92ZXJyaWRlTm9kZU5hbWU/OiBzdHJpbmdcbik6IHN0cmluZyB7XG5cdGxldCBtZXRhZGF0YTtcblx0bGV0IG1ldGFkYXRhUHJvcGVydGllczogUmVjb3JkPHN0cmluZywgeyBuYW1lPzogc3RyaW5nOyB0eXBlPzogc3RyaW5nIH0+O1xuXHRsZXQgY29udHJvbE5hbWU7XG5cdGxldCBtZXRhZGF0YUFnZ3JlZ2F0aW9ucztcblx0bGV0IGRlZmF1bHRBZ2dyZWdhdGlvbk5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcblx0aWYgKGlzQUNvbnRyb2wodHlwZSkpIHtcblx0XHRtZXRhZGF0YSA9IHR5cGUuZ2V0TWV0YWRhdGEoKTtcblx0XHRtZXRhZGF0YVByb3BlcnRpZXMgPSBtZXRhZGF0YS5nZXRBbGxQcm9wZXJ0aWVzKCk7XG5cdFx0bWV0YWRhdGFQcm9wZXJ0aWVzID0geyAuLi5tZXRhZGF0YVByb3BlcnRpZXMsIC4uLm1ldGFkYXRhLmdldEFsbEV2ZW50cygpLCAuLi5tZXRhZGF0YS5nZXRBbGxBc3NvY2lhdGlvbnMoKSB9O1xuXHRcdGNvbnRyb2xOYW1lID0gbWV0YWRhdGEuZ2V0TmFtZSgpO1xuXHRcdG1ldGFkYXRhQWdncmVnYXRpb25zID0gbWV0YWRhdGEuZ2V0QWxsQWdncmVnYXRpb25zKCk7XG5cdFx0ZGVmYXVsdEFnZ3JlZ2F0aW9uTmFtZSA9IG1ldGFkYXRhLmdldERlZmF1bHRBZ2dyZWdhdGlvbk5hbWUoKTtcblx0fSBlbHNlIHtcblx0XHRtZXRhZGF0YSA9IHR5cGUubWV0YWRhdGE7XG5cdFx0bWV0YWRhdGFQcm9wZXJ0aWVzID0gbWV0YWRhdGEucHJvcGVydGllcztcblx0XHRtZXRhZGF0YUFnZ3JlZ2F0aW9ucyA9IHsgLi4ueyBkZXBlbmRlbnRzOiB7fSwgY3VzdG9tRGF0YToge30gfSwgLi4ubWV0YWRhdGEuYWdncmVnYXRpb25zIH07XG5cdFx0ZGVmYXVsdEFnZ3JlZ2F0aW9uTmFtZSA9IG1ldGFkYXRhLmRlZmF1bHRBZ2dyZWdhdGlvbjtcblx0XHRjb250cm9sTmFtZSA9IG1ldGFkYXRhLm5hbWVzcGFjZSArIFwiLlwiICsgbWV0YWRhdGEubmFtZTtcblx0fVxuXHRjb25zdCBuYW1lc1NwbGl0ID0gY29udHJvbE5hbWUuc3BsaXQoXCIuXCIpO1xuXHRpZiAoa2V5ICE9PSB1bmRlZmluZWQpIHtcblx0XHRtU2V0dGluZ3NbXCJrZXlcIl0gPSBrZXk7XG5cdH1cblxuXHRtZXRhZGF0YVByb3BlcnRpZXNbXCJjbGFzc1wiXSA9IHsgbmFtZTogXCJjbGFzc1wiIH07XG5cdG1ldGFkYXRhUHJvcGVydGllc1tcImlkXCJdID0geyBuYW1lOiBcImlkXCIgfTtcblx0bWV0YWRhdGFQcm9wZXJ0aWVzW0ZMX0RFTEVHQVRFXSA9IHsgbmFtZTogRkxfREVMRUdBVEUgfTtcblx0bWV0YWRhdGFQcm9wZXJ0aWVzW0NPUkVfUkVRVUlSRV0gPSB7IG5hbWU6IENPUkVfUkVRVUlSRSB9O1xuXHRtZXRhZGF0YVByb3BlcnRpZXNbTE9HX1NPVVJDRVBBVEhdID0geyBuYW1lOiBMT0dfU09VUkNFUEFUSCB9O1xuXHRtZXRhZGF0YVByb3BlcnRpZXNbQ1VTVE9NX0xPQURWQUxVRV0gPSB7IG5hbWU6IENVU1RPTV9MT0FEVkFMVUUgfTtcblx0bWV0YWRhdGFQcm9wZXJ0aWVzW0NVU1RPTV9VUkxdID0geyBuYW1lOiBDVVNUT01fVVJMIH07XG5cdG1ldGFkYXRhUHJvcGVydGllc1tcInhtbG5zOmZsXCJdID0geyBuYW1lOiBGTF9ERUxFR0FURSB9O1xuXHRtZXRhZGF0YVByb3BlcnRpZXNbXCJ4bWxuczpjb3JlXCJdID0geyBuYW1lOiBDT1JFX1JFUVVJUkUgfTtcblx0bWV0YWRhdGFQcm9wZXJ0aWVzW1wieG1sbnM6bG9nXCJdID0geyBuYW1lOiBMT0dfU09VUkNFUEFUSCB9O1xuXHRpZiAoY29udHJvbE5hbWUgPT09IFwic2FwLnVpLmNvcmUuRnJhZ21lbnRcIikge1xuXHRcdG1ldGFkYXRhUHJvcGVydGllc1tcImZyYWdtZW50TmFtZVwiXSA9IHsgbmFtZTogXCJmcmFnbWVudE5hbWVcIiB9O1xuXHR9XG5cdGNvbnN0IG5hbWVzcGFjZSA9IG5hbWVzU3BsaXQuc2xpY2UoMCwgLTEpO1xuXHRjb25zdCBuYW1lID0gbmFtZXNTcGxpdFtuYW1lc1NwbGl0Lmxlbmd0aCAtIDFdO1xuXHRsZXQgbmFtZXNwYWNlQWxpYXMgPSBuYW1lc3BhY2VbbmFtZXNwYWNlLmxlbmd0aCAtIDFdO1xuXHRpZiAoeG1sTmFtZXNwYWNlTWFwW25hbWVzcGFjZS5qb2luKFwiLlwiKV0pIHtcblx0XHRuYW1lc3BhY2VBbGlhcyA9IHhtbE5hbWVzcGFjZU1hcFtuYW1lc3BhY2Uuam9pbihcIi5cIildO1xuXHR9XG5cdGxldCB0YWdOYW1lID0gYCR7bmFtZXNwYWNlQWxpYXN9OiR7bmFtZX1gO1xuXHRjb25zdCBwcm9wZXJ0aWVzU3RyaW5nOiBzdHJpbmdbXSA9IFtdO1xuXHRjb25zdCBhZ2dyZWdhdGlvblN0cmluZzogc3RyaW5nW10gPSBbXTtcblx0cHJvY2Vzc1Byb3BlcnRpZXMobVNldHRpbmdzLCBtZXRhZGF0YVByb3BlcnRpZXMsIG5hbWVzcGFjZUFsaWFzLCBwcm9wZXJ0aWVzU3RyaW5nLCBhZ2dyZWdhdGlvblN0cmluZyk7XG5cdHByb2Nlc3NBZ2dyZWdhdGlvbnMobVNldHRpbmdzLCBtZXRhZGF0YUFnZ3JlZ2F0aW9ucywgbmFtZXNwYWNlQWxpYXMsIGRlZmF1bHRBZ2dyZWdhdGlvbk5hbWUsIHByb3BlcnRpZXNTdHJpbmcsIGFnZ3JlZ2F0aW9uU3RyaW5nKTtcblx0aWYgKG92ZXJyaWRlTm9kZU5hbWUpIHtcblx0XHR0YWdOYW1lID0gb3ZlcnJpZGVOb2RlTmFtZTtcblx0fVxuXHRyZXR1cm4gYDwke3RhZ05hbWV9IHhtbG5zOiR7bmFtZXNwYWNlQWxpYXN9PVwiJHtuYW1lc3BhY2Uuam9pbihcIi5cIil9XCIgJHtwcm9wZXJ0aWVzU3RyaW5nLmpvaW4oXCIgXCIpfT4ke2FnZ3JlZ2F0aW9uU3RyaW5nLmpvaW4oXG5cdFx0XCJcIlxuXHQpfTwvJHt0YWdOYW1lfT5gO1xufTtcbmV4cG9ydCBkZWZhdWx0IGpzeFhtbDtcbiJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQUE7QUFBQTs7Ozs7RUFPQSxNQUFNQSxhQUFhLEdBQUcsVUFBVUMsR0FBc0IsRUFBVTtJQUMvRCxJQUFJQyxLQUFLLENBQUNDLE9BQU8sQ0FBQ0YsR0FBRyxDQUFDLEVBQUU7TUFDdkIsT0FBT0EsR0FBRyxDQUFDRyxJQUFJ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
@@ -0,0 +1,246 @@
1
+ import type { ControlProperties, NonControlProperties } from "sap/fe/base/jsx-runtime/jsx";
2
+ import type BuildingBlockTemplatingBase from "sap/fe/core/buildingBlocks/templating/BuildingBlockTemplatingBase";
3
+ import { isBindingToolkitExpression } from "sap/fe/core/helpers/BindingToolkit";
4
+ import type Control from "sap/ui/core/Control";
5
+ import type UI5Element from "sap/ui/core/Element";
6
+ import type Context from "sap/ui/model/Context";
7
+
8
+ const writeChildren = function (val: string | string[]): string {
9
+ if (Array.isArray(val)) {
10
+ return val.join("");
11
+ } else {
12
+ return val;
13
+ }
14
+ };
15
+
16
+ /**
17
+ * Some characters needs to be escaped when used as XML attribute value, otherwise this result in incorrect XML.
18
+ *
19
+ * @param value
20
+ * @returns The escaped xml attribute
21
+ */
22
+ function escapeXMLAttributeValue(value?: string): string | undefined {
23
+ return value?.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/"/g, "&quot;").replace(/'/g, "&apos;");
24
+ }
25
+
26
+ const addChildAggregation = function (
27
+ aggregationChildren: Record<string, (Control | string)[]>,
28
+ aggregationName: string,
29
+ child: string | Record<string, string>
30
+ ): void {
31
+ if (child === undefined) {
32
+ return;
33
+ }
34
+ if (!aggregationChildren[aggregationName]) {
35
+ aggregationChildren[aggregationName] = [];
36
+ }
37
+ if (typeof child === "string") {
38
+ if (child.trim().length > 0) {
39
+ aggregationChildren[aggregationName].push(child);
40
+ }
41
+ } else if (Array.isArray(child)) {
42
+ child.forEach((subChild) => {
43
+ addChildAggregation(aggregationChildren, aggregationName, subChild);
44
+ });
45
+ } else {
46
+ for (const childKey of Object.keys(child)) {
47
+ addChildAggregation(aggregationChildren, childKey, child[childKey]);
48
+ }
49
+ }
50
+ };
51
+
52
+ const isAControl = function (children?: typeof Control | Function): children is typeof Control {
53
+ return !!(children as typeof Control)?.getMetadata;
54
+ };
55
+
56
+ const FL_DELEGATE = "fl:delegate";
57
+ const CORE_REQUIRE = "core:require";
58
+ const LOG_SOURCEPATH = "log:sourcePath";
59
+ const CUSTOM_LOADVALUE = "customData:loadValue";
60
+ const CUSTOM_URL = "customData:url";
61
+
62
+ function processObjectPropertyValue(childrenObject: Record<string, unknown>, namespaceAlias: string, propertyName: string): string {
63
+ // This is called when the child is
64
+ const aggregationProperties: string[] = [];
65
+ const aggregationChildren: string[] = [];
66
+ Object.keys(childrenObject).forEach((subPropName) => {
67
+ const childValue = childrenObject[subPropName];
68
+ if (childValue !== undefined) {
69
+ if (typeof childValue === "object") {
70
+ // if the property is a value it needs to be serialized as a children
71
+ // <myObjectProp prop1='xxx', prop2='xxt'/>
72
+ aggregationChildren.push(processObjectPropertyValue(childValue as Record<string, unknown>, namespaceAlias, subPropName));
73
+ } else {
74
+ // Otherwise it's part of the main object just as another property
75
+ aggregationProperties.push(`${subPropName}='${escapeXMLAttributeValue(childValue.toString())}'`);
76
+ }
77
+ }
78
+ });
79
+ return `<${namespaceAlias}:${propertyName} ${aggregationProperties.join(" ")}>${aggregationChildren.join(
80
+ "\n"
81
+ )}</${namespaceAlias}:${propertyName}>`;
82
+ }
83
+
84
+ function processProperties<T>(
85
+ mSettings: Record<string, unknown>,
86
+ metadataProperties: Record<
87
+ string,
88
+ {
89
+ name?: string;
90
+ type?: string;
91
+ }
92
+ >,
93
+ namespaceAlias: string,
94
+ propertiesString: string[],
95
+ aggregationString: string[]
96
+ ): void {
97
+ Object.keys(metadataProperties).forEach((propertyName) => {
98
+ if (mSettings.hasOwnProperty(propertyName) && mSettings[propertyName] !== undefined) {
99
+ const propertyValue = mSettings[propertyName];
100
+ if (propertyName === CORE_REQUIRE) {
101
+ propertiesString.push(`xmlns:core="sap.ui.core"`);
102
+ }
103
+ if (propertyName === LOG_SOURCEPATH) {
104
+ propertiesString.push(`xmlns:log="http://schemas.sap.com/sapui5/extension/sap.ui.core.CustomData/1"`);
105
+ }
106
+ if (propertyName === CUSTOM_URL || propertyName === CUSTOM_LOADVALUE) {
107
+ propertiesString.push(`xmlns:customData="http://schemas.sap.com/sapui5/extension/sap.ui.core.CustomData/1"`);
108
+ }
109
+ if (propertyValue && typeof propertyValue === "object") {
110
+ if (metadataProperties[propertyName].type === "sap.ui.model.Context") {
111
+ propertiesString.push(`${propertyName}='${(propertyValue as Context).getPath()}'`);
112
+ } else if (isBindingToolkitExpression(propertyValue) || propertyName === "delegate") {
113
+ propertiesString.push(`${propertyName}='${JSON.stringify(mSettings[propertyName])}'`);
114
+ } else if (Array.isArray(propertyValue)) {
115
+ if (propertyValue.length === 1) {
116
+ propertiesString.push(`${propertyName}='${JSON.stringify(propertyValue[0])}'`);
117
+ } else {
118
+ propertiesString.push(`${propertyName}='${JSON.stringify(mSettings[propertyName])}'`);
119
+ }
120
+ } else {
121
+ const complexProperty: string[] = [];
122
+ const propertyValueObj = propertyValue as Record<string, string>;
123
+ Object.keys(propertyValueObj).forEach((subPropName) => {
124
+ if (propertyValueObj[subPropName] !== undefined) {
125
+ complexProperty.push(`${subPropName}='${escapeXMLAttributeValue(propertyValueObj[subPropName].toString())}'`);
126
+ }
127
+ });
128
+ aggregationString.push(`<${propertyName} ${complexProperty.join(" ")}/>`);
129
+ }
130
+ } else {
131
+ const prop = mSettings[propertyName] as string | boolean | number;
132
+ propertiesString.push(`${propertyName}='${escapeXMLAttributeValue(prop.toString())}'`);
133
+ }
134
+ } else if (
135
+ mSettings.children?.hasOwnProperty(propertyName) &&
136
+ Object.keys((mSettings.children as ControlProperties<T>)?.[propertyName] ?? {}).length > 0
137
+ ) {
138
+ // Object / Array properties are part of the `children` aggregation and as such still need to be processed as properties
139
+ const childrenObject = (mSettings.children as ControlProperties<T>)?.[propertyName] as unknown as Record<string, object>;
140
+ aggregationString.push(processObjectPropertyValue(childrenObject, namespaceAlias, propertyName));
141
+ }
142
+ });
143
+ }
144
+
145
+ function processAggregations(
146
+ mSettings: Record<string, unknown>,
147
+ metadataAggregations: Record<string, object>,
148
+ namespaceAlias: string,
149
+ defaultAggregationName: string | undefined,
150
+ propertiesString: string[],
151
+ aggregationString: string[]
152
+ ): Record<string, string[]> {
153
+ const aggregationChildren: Record<string, string[]> = {};
154
+ addChildAggregation(aggregationChildren, defaultAggregationName ?? "customData", mSettings.children as Record<string, string>);
155
+ const aggregationChildKeys = Object.keys(aggregationChildren);
156
+ let writeOnlyDefaultAggregation = false;
157
+ if (aggregationChildKeys.length === 1 && aggregationChildKeys[0] === defaultAggregationName) {
158
+ writeOnlyDefaultAggregation = true;
159
+ }
160
+ Object.keys(metadataAggregations).forEach((aggregationName) => {
161
+ if (aggregationChildren.hasOwnProperty(aggregationName) && aggregationChildren[aggregationName].length > 0) {
162
+ if (aggregationName === defaultAggregationName && writeOnlyDefaultAggregation) {
163
+ aggregationString.push(`${writeChildren(aggregationChildren[aggregationName])}`);
164
+ } else {
165
+ aggregationString.push(
166
+ `<${namespaceAlias}:${aggregationName}>
167
+ ${writeChildren(aggregationChildren[aggregationName])}
168
+ </${namespaceAlias}:${aggregationName}>`
169
+ );
170
+ }
171
+ }
172
+ if (mSettings.hasOwnProperty(aggregationName) && mSettings[aggregationName] !== undefined) {
173
+ if (typeof mSettings[aggregationName] === "object") {
174
+ propertiesString.push(`${aggregationName}='${JSON.stringify(mSettings[aggregationName])}'`);
175
+ } else {
176
+ // In some case the aggregation expect a string value (like for the tooltip), in this case we set it directly as a property
177
+ propertiesString.push(`${aggregationName}='${mSettings[aggregationName]}'`);
178
+ }
179
+ }
180
+ });
181
+ return aggregationChildren;
182
+ }
183
+
184
+ const jsxXml = function <T>(
185
+ type: typeof Control | typeof BuildingBlockTemplatingBase,
186
+ mSettings: NonControlProperties<T> & { key?: string; children?: UI5Element | ControlProperties<T> },
187
+ key: string | undefined,
188
+ xmlNamespaceMap: Record<string, string>,
189
+ overrideNodeName?: string
190
+ ): string {
191
+ let metadata;
192
+ let metadataProperties: Record<string, { name?: string; type?: string }>;
193
+ let controlName;
194
+ let metadataAggregations;
195
+ let defaultAggregationName: string | undefined;
196
+ if (isAControl(type)) {
197
+ metadata = type.getMetadata();
198
+ metadataProperties = metadata.getAllProperties();
199
+ metadataProperties = { ...metadataProperties, ...metadata.getAllEvents(), ...metadata.getAllAssociations() };
200
+ controlName = metadata.getName();
201
+ metadataAggregations = metadata.getAllAggregations();
202
+ defaultAggregationName = metadata.getDefaultAggregationName();
203
+ } else {
204
+ metadata = type.metadata;
205
+ metadataProperties = metadata.properties;
206
+ metadataAggregations = { ...{ dependents: {}, customData: {} }, ...metadata.aggregations };
207
+ defaultAggregationName = metadata.defaultAggregation;
208
+ controlName = metadata.namespace + "." + metadata.name;
209
+ }
210
+ const namesSplit = controlName.split(".");
211
+ if (key !== undefined) {
212
+ mSettings["key"] = key;
213
+ }
214
+
215
+ metadataProperties["class"] = { name: "class" };
216
+ metadataProperties["id"] = { name: "id" };
217
+ metadataProperties[FL_DELEGATE] = { name: FL_DELEGATE };
218
+ metadataProperties[CORE_REQUIRE] = { name: CORE_REQUIRE };
219
+ metadataProperties[LOG_SOURCEPATH] = { name: LOG_SOURCEPATH };
220
+ metadataProperties[CUSTOM_LOADVALUE] = { name: CUSTOM_LOADVALUE };
221
+ metadataProperties[CUSTOM_URL] = { name: CUSTOM_URL };
222
+ metadataProperties["xmlns:fl"] = { name: FL_DELEGATE };
223
+ metadataProperties["xmlns:core"] = { name: CORE_REQUIRE };
224
+ metadataProperties["xmlns:log"] = { name: LOG_SOURCEPATH };
225
+ if (controlName === "sap.ui.core.Fragment") {
226
+ metadataProperties["fragmentName"] = { name: "fragmentName" };
227
+ }
228
+ const namespace = namesSplit.slice(0, -1);
229
+ const name = namesSplit[namesSplit.length - 1];
230
+ let namespaceAlias = namespace[namespace.length - 1];
231
+ if (xmlNamespaceMap[namespace.join(".")]) {
232
+ namespaceAlias = xmlNamespaceMap[namespace.join(".")];
233
+ }
234
+ let tagName = `${namespaceAlias}:${name}`;
235
+ const propertiesString: string[] = [];
236
+ const aggregationString: string[] = [];
237
+ processProperties(mSettings, metadataProperties, namespaceAlias, propertiesString, aggregationString);
238
+ processAggregations(mSettings, metadataAggregations, namespaceAlias, defaultAggregationName, propertiesString, aggregationString);
239
+ if (overrideNodeName) {
240
+ tagName = overrideNodeName;
241
+ }
242
+ return `<${tagName} xmlns:${namespaceAlias}="${namespace.join(".")}" ${propertiesString.join(" ")}>${aggregationString.join(
243
+ ""
244
+ )}</${tagName}>`;
245
+ };
246
+ export default jsxXml;