@conduction/nextcloud-vue 2.56.0-beta.21 → 2.56.0-beta.23

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 (66) hide show
  1. package/dist/esm/components/CnAppRoot/CnAppRoot.vue2.js +29 -0
  2. package/dist/esm/components/CnAppRoot/CnAppRoot.vue2.js.map +1 -1
  3. package/dist/esm/components/CnAppRoot/CnAppRoot.vue3.js.map +1 -1
  4. package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js +18 -0
  5. package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js.map +1 -1
  6. package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js +9 -6
  7. package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js.map +1 -1
  8. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue2.js +16 -1
  9. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue2.js.map +1 -1
  10. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue3.js +5 -4
  11. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue3.js.map +1 -1
  12. package/dist/esm/components/CnFlowDetail/CnFlowDetail.vue2.js +25 -0
  13. package/dist/esm/components/CnFlowDetail/CnFlowDetail.vue2.js.map +1 -1
  14. package/dist/esm/components/CnFlowDetail/CnFlowDetail.vue3.js +3 -1
  15. package/dist/esm/components/CnFlowDetail/CnFlowDetail.vue3.js.map +1 -1
  16. package/dist/esm/components/CnGraphCanvas/CnFlowNode.vue2.js +36 -1
  17. package/dist/esm/components/CnGraphCanvas/CnFlowNode.vue2.js.map +1 -1
  18. package/dist/esm/components/CnGraphCanvas/CnFlowNode.vue3.js.map +1 -1
  19. package/dist/esm/components/CnGraphCanvas/CnGraphCanvas.vue2.js +37 -0
  20. package/dist/esm/components/CnGraphCanvas/CnGraphCanvas.vue2.js.map +1 -1
  21. package/dist/esm/components/CnGraphCanvas/CnGraphCanvas.vue3.js +4 -2
  22. package/dist/esm/components/CnGraphCanvas/CnGraphCanvas.vue3.js.map +1 -1
  23. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js +16 -1
  24. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js.map +1 -1
  25. package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js +6 -6
  26. package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js.map +1 -1
  27. package/dist/esm/components/CnNotificationPreferences/CnNotificationPreferences.vue2.js +53 -5
  28. package/dist/esm/components/CnNotificationPreferences/CnNotificationPreferences.vue2.js.map +1 -1
  29. package/dist/esm/components/CnNotificationPreferences/CnNotificationPreferences.vue3.js +1 -1
  30. package/dist/esm/components/CnNotificationPreferences/CnNotificationPreferences.vue3.js.map +1 -1
  31. package/dist/esm/components/CnPageRenderer/CnPageRenderer.vue2.js +133 -0
  32. package/dist/esm/components/CnPageRenderer/CnPageRenderer.vue2.js.map +1 -1
  33. package/dist/esm/components/CnPageRenderer/CnPageRenderer.vue3.js +22 -14
  34. package/dist/esm/components/CnPageRenderer/CnPageRenderer.vue3.js.map +1 -1
  35. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue2.js +15 -1
  36. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue2.js.map +1 -1
  37. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue3.js +3 -2
  38. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue3.js.map +1 -1
  39. package/dist/esm/components/CnWidgetGrid/CnWidgetGrid.vue2.js +15 -1
  40. package/dist/esm/components/CnWidgetGrid/CnWidgetGrid.vue2.js.map +1 -1
  41. package/dist/esm/components/CnWidgetGrid/CnWidgetGrid.vue3.js +2 -2
  42. package/dist/esm/components/CnWidgetGrid/CnWidgetGrid.vue3.js.map +1 -1
  43. package/dist/esm/index.js +1 -0
  44. package/dist/esm/index.js.map +1 -1
  45. package/dist/esm/utils/notificationRuleLabel.js +132 -0
  46. package/dist/esm/utils/notificationRuleLabel.js.map +1 -0
  47. package/dist/nextcloud-vue.cjs.js +578 -47
  48. package/dist/nextcloud-vue.cjs.js.map +2 -2
  49. package/package.json +1 -1
  50. package/scripts/openregister-reliance.js +206 -0
  51. package/src/components/CnAppRoot/CnAppRoot.md +1 -0
  52. package/src/components/CnAppRoot/CnAppRoot.vue +29 -0
  53. package/src/components/CnDetailPage/CnDetailPage.vue +24 -3
  54. package/src/components/CnDetailWidgetHost/CnDetailWidgetHost.vue +22 -4
  55. package/src/components/CnFlowDetail/CnFlowDetail.vue +27 -0
  56. package/src/components/CnGraphCanvas/CnFlowNode.vue +36 -1
  57. package/src/components/CnGraphCanvas/CnGraphCanvas.vue +40 -1
  58. package/src/components/CnIndexPage/CnIndexPage.vue +17 -2
  59. package/src/components/CnNotificationPreferences/CnNotificationPreferences.vue +54 -6
  60. package/src/components/CnPageRenderer/CnPageRenderer.vue +147 -6
  61. package/src/components/CnTabsWidget/CnTabsWidget.vue +17 -2
  62. package/src/components/CnWidgetGrid/CnWidgetGrid.vue +19 -3
  63. package/src/index.js +2 -0
  64. package/src/utils/notificationRuleLabel.js +129 -0
  65. package/webpack/index.d.ts +16 -0
  66. package/webpack/index.js +70 -0
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -0,0 +1,132 @@
1
+ /**
2
+ * SPDX-FileCopyrightText: 2026 Conduction B.V. <info@conduction.nl>
3
+ * SPDX-License-Identifier: EUPL-1.2
4
+ *
5
+ * The label a person reads for one notification rule in their settings.
6
+ *
7
+ * A rule is declared in a schema's `x-openregister-notifications` map under a
8
+ * KEY (`caseAssigned`, `clientUpdated`, `onCreate`). The key is an identifier
9
+ * for a developer. The settings pane used to print it as is, so a person saw
10
+ * "substitutionRegisteredForSubstitute" next to a switch and had to guess.
11
+ *
12
+ * The label is taken from the first source that has one, most specific first:
13
+ *
14
+ * 1. the rule's own words, when OpenRegister passes them on the preference
15
+ * entry (`label`, then `title`), as a plain string or a per-locale map
16
+ * like the dialect's `subject` (`{ "nl": "…", "en": "…" }`);
17
+ * 2. the app's own label for the rule, from the `labels` map the app hands
18
+ * to CnAppRoot (`notificationLabels`), keyed `<schema>.<key>` or `<key>`;
19
+ * 3. the library's wording for the generic object-event keys;
20
+ * 4. the key made readable: `caseAssigned` becomes "Case assigned".
21
+ *
22
+ * The rule's `subject` is used only when it carries no `{{placeholder}}`: it
23
+ * is the notification TITLE template, and "Case "{{title}}" assigned to you"
24
+ * reads worse as a setting than the readable key does.
25
+ *
26
+ * Pure: no store, no fetch, no Vue.
27
+ *
28
+ * @spec openspec/changes/notification-rule-labels-and-runtime-version/specs/notification-preferences/spec.md
29
+ */
30
+
31
+ /**
32
+ * Pick the string for the current language out of a string or per-locale map.
33
+ *
34
+ * @param {string|object|null|undefined} value A string, or `{ nl, en, … }`.
35
+ * @param {string} [language] The current language, e.g. `nl` or `de_DE`.
36
+ * @return {string} The resolved text, or '' when there is none.
37
+ */
38
+ function resolveLocalised(value, language = 'en') {
39
+ if (typeof value === 'string') {
40
+ return value.trim()
41
+ }
42
+ if (!value || typeof value !== 'object' || Array.isArray(value)) {
43
+ return ''
44
+ }
45
+ const lang = String(language || 'en');
46
+ const base = lang.split(/[-_]/)[0];
47
+ for (const candidate of [lang, base, 'en']) {
48
+ if (typeof value[candidate] === 'string' && value[candidate].trim() !== '') {
49
+ return value[candidate].trim()
50
+ }
51
+ }
52
+ const first = Object.values(value).find((text) => typeof text === 'string' && text.trim() !== '');
53
+ return first ? first.trim() : ''
54
+ }
55
+
56
+ /**
57
+ * Make a rule key readable: split camelCase, snake_case and kebab-case into
58
+ * words, keep acronyms, and capitalise only the first word.
59
+ *
60
+ * `caseAssigned` → "Case assigned", `object_created` → "Object created",
61
+ * `newBRPRecord` → "New BRP record".
62
+ *
63
+ * @param {string} key The rule key.
64
+ * @return {string} A readable sentence-case label, or the key when it has no words.
65
+ */
66
+ function humaniseRuleKey(key) {
67
+ const words = String(key || '')
68
+ .replace(/([a-z0-9])([A-Z])/g, '$1 $2')
69
+ .replace(/([A-Z]+)([A-Z][a-z])/g, '$1 $2')
70
+ .split(/[\s_\-.]+/)
71
+ .filter(Boolean);
72
+ if (words.length === 0) {
73
+ return String(key || '')
74
+ }
75
+ return words
76
+ .map((word, index) => {
77
+ const isAcronym = word.length > 1 && word === word.toUpperCase() && /[A-Z]/.test(word);
78
+ if (isAcronym) {
79
+ return word
80
+ }
81
+ const lower = word.toLowerCase();
82
+ return index === 0 ? lower.charAt(0).toUpperCase() + lower.slice(1) : lower
83
+ })
84
+ .join(' ')
85
+ }
86
+
87
+ /**
88
+ * The label for one preference entry.
89
+ *
90
+ * @param {object} entry A preference entry: `{ schema, notification, label?, title?, subject? }`.
91
+ * @param {object} [options] Where else a label may come from.
92
+ * @param {object} [options.labels] App-supplied labels keyed `<schema>.<key>` or `<key>`;
93
+ * values are strings or per-locale maps.
94
+ * @param {object} [options.known] Library wording for generic keys, keyed by rule key.
95
+ * @param {string} [options.language] The current language.
96
+ * @return {string} The label to show.
97
+ */
98
+ function notificationRuleLabel(entry, { labels = {}, known = {}, language = 'en' } = {}) {
99
+ const key = String(entry?.notification ?? '');
100
+ const schema = String(entry?.schema ?? '');
101
+
102
+ for (const field of ['label', 'title']) {
103
+ const own = resolveLocalised(entry?.[field], language);
104
+ if (own) {
105
+ return own
106
+ }
107
+ }
108
+
109
+ const map = labels && typeof labels === 'object' ? labels : {};
110
+ for (const lookup of [schema ? `${schema}.${key}` : '', key]) {
111
+ if (lookup && Object.hasOwn(map, lookup)) {
112
+ const fromApp = resolveLocalised(map[lookup], language);
113
+ if (fromApp) {
114
+ return fromApp
115
+ }
116
+ }
117
+ }
118
+
119
+ if (known && typeof known[key] === 'string' && known[key]) {
120
+ return known[key]
121
+ }
122
+
123
+ const subject = resolveLocalised(entry?.subject, language);
124
+ if (subject && !subject.includes('{{')) {
125
+ return subject
126
+ }
127
+
128
+ return humaniseRuleKey(key)
129
+ }
130
+
131
+ export { humaniseRuleKey, notificationRuleLabel, resolveLocalised };
132
+ //# sourceMappingURL=notificationRuleLabel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notificationRuleLabel.js","sources":["../../../src/utils/notificationRuleLabel.js"],"sourcesContent":["/**\n * SPDX-FileCopyrightText: 2026 Conduction B.V. <info@conduction.nl>\n * SPDX-License-Identifier: EUPL-1.2\n *\n * The label a person reads for one notification rule in their settings.\n *\n * A rule is declared in a schema's `x-openregister-notifications` map under a\n * KEY (`caseAssigned`, `clientUpdated`, `onCreate`). The key is an identifier\n * for a developer. The settings pane used to print it as is, so a person saw\n * \"substitutionRegisteredForSubstitute\" next to a switch and had to guess.\n *\n * The label is taken from the first source that has one, most specific first:\n *\n * 1. the rule's own words, when OpenRegister passes them on the preference\n * entry (`label`, then `title`), as a plain string or a per-locale map\n * like the dialect's `subject` (`{ \"nl\": \"…\", \"en\": \"…\" }`);\n * 2. the app's own label for the rule, from the `labels` map the app hands\n * to CnAppRoot (`notificationLabels`), keyed `<schema>.<key>` or `<key>`;\n * 3. the library's wording for the generic object-event keys;\n * 4. the key made readable: `caseAssigned` becomes \"Case assigned\".\n *\n * The rule's `subject` is used only when it carries no `{{placeholder}}`: it\n * is the notification TITLE template, and \"Case \"{{title}}\" assigned to you\"\n * reads worse as a setting than the readable key does.\n *\n * Pure: no store, no fetch, no Vue.\n *\n * @spec openspec/changes/notification-rule-labels-and-runtime-version/specs/notification-preferences/spec.md\n */\n\n/**\n * Pick the string for the current language out of a string or per-locale map.\n *\n * @param {string|object|null|undefined} value A string, or `{ nl, en, … }`.\n * @param {string} [language] The current language, e.g. `nl` or `de_DE`.\n * @return {string} The resolved text, or '' when there is none.\n */\nexport function resolveLocalised(value, language = 'en') {\n\tif (typeof value === 'string') {\n\t\treturn value.trim()\n\t}\n\tif (!value || typeof value !== 'object' || Array.isArray(value)) {\n\t\treturn ''\n\t}\n\tconst lang = String(language || 'en')\n\tconst base = lang.split(/[-_]/)[0]\n\tfor (const candidate of [lang, base, 'en']) {\n\t\tif (typeof value[candidate] === 'string' && value[candidate].trim() !== '') {\n\t\t\treturn value[candidate].trim()\n\t\t}\n\t}\n\tconst first = Object.values(value).find((text) => typeof text === 'string' && text.trim() !== '')\n\treturn first ? first.trim() : ''\n}\n\n/**\n * Make a rule key readable: split camelCase, snake_case and kebab-case into\n * words, keep acronyms, and capitalise only the first word.\n *\n * `caseAssigned` → \"Case assigned\", `object_created` → \"Object created\",\n * `newBRPRecord` → \"New BRP record\".\n *\n * @param {string} key The rule key.\n * @return {string} A readable sentence-case label, or the key when it has no words.\n */\nexport function humaniseRuleKey(key) {\n\tconst words = String(key || '')\n\t\t.replace(/([a-z0-9])([A-Z])/g, '$1 $2')\n\t\t.replace(/([A-Z]+)([A-Z][a-z])/g, '$1 $2')\n\t\t.split(/[\\s_\\-.]+/)\n\t\t.filter(Boolean)\n\tif (words.length === 0) {\n\t\treturn String(key || '')\n\t}\n\treturn words\n\t\t.map((word, index) => {\n\t\t\tconst isAcronym = word.length > 1 && word === word.toUpperCase() && /[A-Z]/.test(word)\n\t\t\tif (isAcronym) {\n\t\t\t\treturn word\n\t\t\t}\n\t\t\tconst lower = word.toLowerCase()\n\t\t\treturn index === 0 ? lower.charAt(0).toUpperCase() + lower.slice(1) : lower\n\t\t})\n\t\t.join(' ')\n}\n\n/**\n * The label for one preference entry.\n *\n * @param {object} entry A preference entry: `{ schema, notification, label?, title?, subject? }`.\n * @param {object} [options] Where else a label may come from.\n * @param {object} [options.labels] App-supplied labels keyed `<schema>.<key>` or `<key>`;\n * values are strings or per-locale maps.\n * @param {object} [options.known] Library wording for generic keys, keyed by rule key.\n * @param {string} [options.language] The current language.\n * @return {string} The label to show.\n */\nexport function notificationRuleLabel(entry, { labels = {}, known = {}, language = 'en' } = {}) {\n\tconst key = String(entry?.notification ?? '')\n\tconst schema = String(entry?.schema ?? '')\n\n\tfor (const field of ['label', 'title']) {\n\t\tconst own = resolveLocalised(entry?.[field], language)\n\t\tif (own) {\n\t\t\treturn own\n\t\t}\n\t}\n\n\tconst map = labels && typeof labels === 'object' ? labels : {}\n\tfor (const lookup of [schema ? `${schema}.${key}` : '', key]) {\n\t\tif (lookup && Object.hasOwn(map, lookup)) {\n\t\t\tconst fromApp = resolveLocalised(map[lookup], language)\n\t\t\tif (fromApp) {\n\t\t\t\treturn fromApp\n\t\t\t}\n\t\t}\n\t}\n\n\tif (known && typeof known[key] === 'string' && known[key]) {\n\t\treturn known[key]\n\t}\n\n\tconst subject = resolveLocalised(entry?.subject, language)\n\tif (subject && !subject.includes('{{')) {\n\t\treturn subject\n\t}\n\n\treturn humaniseRuleKey(key)\n}\n"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAAS,gBAAgB,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI,EAAE;AACzD,CAAC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;AAChC,EAAE,OAAO,KAAK,CAAC,IAAI,EAAE;AACrB,EAAE;AACF,CAAC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AAClE,EAAE,OAAO,EAAE;AACX,EAAE;AACF,CAAC,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,IAAI,IAAI,EAAC;AACtC,CAAC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAC;AACnC,CAAC,KAAK,MAAM,SAAS,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE;AAC7C,EAAE,IAAI,OAAO,KAAK,CAAC,SAAS,CAAC,KAAK,QAAQ,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;AAC9E,GAAG,OAAO,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE;AACjC,GAAG;AACH,EAAE;AACF,CAAC,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,EAAC;AAClG,CAAC,OAAO,KAAK,GAAG,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE;AACjC,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAAS,eAAe,CAAC,GAAG,EAAE;AACrC,CAAC,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC;AAChC,GAAG,OAAO,CAAC,oBAAoB,EAAE,OAAO,CAAC;AACzC,GAAG,OAAO,CAAC,uBAAuB,EAAE,OAAO,CAAC;AAC5C,GAAG,KAAK,CAAC,WAAW,CAAC;AACrB,GAAG,MAAM,CAAC,OAAO,EAAC;AAClB,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;AACzB,EAAE,OAAO,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC;AAC1B,EAAE;AACF,CAAC,OAAO,KAAK;AACb,GAAG,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,KAAK;AACxB,GAAG,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,KAAK,IAAI,CAAC,WAAW,EAAE,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,EAAC;AACzF,GAAG,IAAI,SAAS,EAAE;AAClB,IAAI,OAAO,IAAI;AACf,IAAI;AACJ,GAAG,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,GAAE;AACnC,GAAG,OAAO,KAAK,KAAK,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK;AAC9E,GAAG,CAAC;AACJ,GAAG,IAAI,CAAC,GAAG,CAAC;AACZ,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAAS,qBAAqB,CAAC,KAAK,EAAE,EAAE,MAAM,GAAG,EAAE,EAAE,KAAK,GAAG,EAAE,EAAE,QAAQ,GAAG,IAAI,EAAE,GAAG,EAAE,EAAE;AAChG,CAAC,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,EAAE,YAAY,IAAI,EAAE,EAAC;AAC9C,CAAC,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,EAAE,MAAM,IAAI,EAAE,EAAC;AAC3C;AACA,CAAC,KAAK,MAAM,KAAK,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE;AACzC,EAAE,MAAM,GAAG,GAAG,gBAAgB,CAAC,KAAK,GAAG,KAAK,CAAC,EAAE,QAAQ,EAAC;AACxD,EAAE,IAAI,GAAG,EAAE;AACX,GAAG,OAAO,GAAG;AACb,GAAG;AACH,EAAE;AACF;AACA,CAAC,MAAM,GAAG,GAAG,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,GAAG,MAAM,GAAG,GAAE;AAC/D,CAAC,KAAK,MAAM,MAAM,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,GAAG,CAAC,EAAE;AAC/D,EAAE,IAAI,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE;AAC5C,GAAG,MAAM,OAAO,GAAG,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAC;AAC1D,GAAG,IAAI,OAAO,EAAE;AAChB,IAAI,OAAO,OAAO;AAClB,IAAI;AACJ,GAAG;AACH,EAAE;AACF;AACA,CAAC,IAAI,KAAK,IAAI,OAAO,KAAK,CAAC,GAAG,CAAC,KAAK,QAAQ,IAAI,KAAK,CAAC,GAAG,CAAC,EAAE;AAC5D,EAAE,OAAO,KAAK,CAAC,GAAG,CAAC;AACnB,EAAE;AACF;AACA,CAAC,MAAM,OAAO,GAAG,gBAAgB,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAC;AAC3D,CAAC,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;AACzC,EAAE,OAAO,OAAO;AAChB,EAAE;AACF;AACA,CAAC,OAAO,eAAe,CAAC,GAAG,CAAC;AAC5B;;;;"}