@marinoscar/platform-web 0.1.0-next.19 → 0.1.0-next.21

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 (174) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/README.md +5 -3
  3. package/dist/alerts/headless/client.d.ts +134 -0
  4. package/dist/alerts/headless/client.d.ts.map +1 -0
  5. package/dist/alerts/headless/client.js +105 -0
  6. package/dist/alerts/headless/client.js.map +1 -0
  7. package/dist/alerts/headless/format.d.ts +95 -0
  8. package/dist/alerts/headless/format.d.ts.map +1 -0
  9. package/dist/alerts/headless/format.js +164 -0
  10. package/dist/alerts/headless/format.js.map +1 -0
  11. package/dist/alerts/headless/hooks.d.ts +245 -0
  12. package/dist/alerts/headless/hooks.d.ts.map +1 -0
  13. package/dist/alerts/headless/hooks.js +315 -0
  14. package/dist/alerts/headless/hooks.js.map +1 -0
  15. package/dist/alerts/headless/index.d.ts +9 -0
  16. package/dist/alerts/headless/index.d.ts.map +1 -0
  17. package/dist/alerts/headless/index.js +9 -0
  18. package/dist/alerts/headless/index.js.map +1 -0
  19. package/dist/alerts/headless/rule-draft.d.ts +175 -0
  20. package/dist/alerts/headless/rule-draft.d.ts.map +1 -0
  21. package/dist/alerts/headless/rule-draft.js +261 -0
  22. package/dist/alerts/headless/rule-draft.js.map +1 -0
  23. package/dist/alerts/ui/AlertIncidentDrawer.d.ts +30 -0
  24. package/dist/alerts/ui/AlertIncidentDrawer.d.ts.map +1 -0
  25. package/dist/alerts/ui/AlertIncidentDrawer.js +33 -0
  26. package/dist/alerts/ui/AlertIncidentDrawer.js.map +1 -0
  27. package/dist/alerts/ui/AlertRuleDialog.d.ts +47 -0
  28. package/dist/alerts/ui/AlertRuleDialog.d.ts.map +1 -0
  29. package/dist/alerts/ui/AlertRuleDialog.js +124 -0
  30. package/dist/alerts/ui/AlertRuleDialog.js.map +1 -0
  31. package/dist/alerts/ui/AlertRuleTestResult.d.ts +23 -0
  32. package/dist/alerts/ui/AlertRuleTestResult.d.ts.map +1 -0
  33. package/dist/alerts/ui/AlertRuleTestResult.js +30 -0
  34. package/dist/alerts/ui/AlertRuleTestResult.js.map +1 -0
  35. package/dist/alerts/ui/AlertsPage.d.ts +41 -0
  36. package/dist/alerts/ui/AlertsPage.d.ts.map +1 -0
  37. package/dist/alerts/ui/AlertsPage.js +238 -0
  38. package/dist/alerts/ui/AlertsPage.js.map +1 -0
  39. package/dist/alerts/ui/FiringAlertsBanner.d.ts +28 -0
  40. package/dist/alerts/ui/FiringAlertsBanner.d.ts.map +1 -0
  41. package/dist/alerts/ui/FiringAlertsBanner.js +45 -0
  42. package/dist/alerts/ui/FiringAlertsBanner.js.map +1 -0
  43. package/dist/alerts/ui/copy.d.ts +15 -0
  44. package/dist/alerts/ui/copy.d.ts.map +1 -0
  45. package/dist/alerts/ui/copy.js +14 -0
  46. package/dist/alerts/ui/copy.js.map +1 -0
  47. package/dist/alerts/ui/index.d.ts +14 -0
  48. package/dist/alerts/ui/index.d.ts.map +1 -0
  49. package/dist/alerts/ui/index.js +12 -0
  50. package/dist/alerts/ui/index.js.map +1 -0
  51. package/dist/alerts/ui/parts.d.ts +26 -0
  52. package/dist/alerts/ui/parts.d.ts.map +1 -0
  53. package/dist/alerts/ui/parts.js +27 -0
  54. package/dist/alerts/ui/parts.js.map +1 -0
  55. package/dist/alerts/ui/settings.d.ts +27 -0
  56. package/dist/alerts/ui/settings.d.ts.map +1 -0
  57. package/dist/alerts/ui/settings.js +37 -0
  58. package/dist/alerts/ui/settings.js.map +1 -0
  59. package/dist/nodes/headless/api.d.ts +3 -1
  60. package/dist/nodes/headless/api.d.ts.map +1 -1
  61. package/dist/nodes/headless/api.js +22 -0
  62. package/dist/nodes/headless/api.js.map +1 -1
  63. package/dist/nodes/headless/index.d.ts +7 -2
  64. package/dist/nodes/headless/index.d.ts.map +1 -1
  65. package/dist/nodes/headless/index.js +4 -1
  66. package/dist/nodes/headless/index.js.map +1 -1
  67. package/dist/nodes/headless/node-events.d.ts +43 -0
  68. package/dist/nodes/headless/node-events.d.ts.map +1 -0
  69. package/dist/nodes/headless/node-events.js +150 -0
  70. package/dist/nodes/headless/node-events.js.map +1 -0
  71. package/dist/nodes/headless/power.d.ts +43 -0
  72. package/dist/nodes/headless/power.d.ts.map +1 -0
  73. package/dist/nodes/headless/power.js +74 -0
  74. package/dist/nodes/headless/power.js.map +1 -0
  75. package/dist/nodes/headless/types.d.ts +40 -3
  76. package/dist/nodes/headless/types.d.ts.map +1 -1
  77. package/dist/nodes/headless/types.js +1 -1
  78. package/dist/nodes/headless/types.js.map +1 -1
  79. package/dist/nodes/headless/use-node-events.d.ts +59 -0
  80. package/dist/nodes/headless/use-node-events.d.ts.map +1 -0
  81. package/dist/nodes/headless/use-node-events.js +159 -0
  82. package/dist/nodes/headless/use-node-events.js.map +1 -0
  83. package/dist/nodes/ui/NodeEventsTimeline.d.ts +39 -0
  84. package/dist/nodes/ui/NodeEventsTimeline.d.ts.map +1 -0
  85. package/dist/nodes/ui/NodeEventsTimeline.js +63 -0
  86. package/dist/nodes/ui/NodeEventsTimeline.js.map +1 -0
  87. package/dist/nodes/ui/NodePowerBadge.d.ts +27 -0
  88. package/dist/nodes/ui/NodePowerBadge.d.ts.map +1 -0
  89. package/dist/nodes/ui/NodePowerBadge.js +48 -0
  90. package/dist/nodes/ui/NodePowerBadge.js.map +1 -0
  91. package/dist/nodes/ui/NodeVitalsDialog.d.ts +11 -1
  92. package/dist/nodes/ui/NodeVitalsDialog.d.ts.map +1 -1
  93. package/dist/nodes/ui/NodeVitalsDialog.js +14 -5
  94. package/dist/nodes/ui/NodeVitalsDialog.js.map +1 -1
  95. package/dist/nodes/ui/WorkersPage.d.ts.map +1 -1
  96. package/dist/nodes/ui/WorkersPage.js +2 -1
  97. package/dist/nodes/ui/WorkersPage.js.map +1 -1
  98. package/dist/nodes/ui/workerVitals.d.ts +17 -1
  99. package/dist/nodes/ui/workerVitals.d.ts.map +1 -1
  100. package/dist/nodes/ui/workerVitals.js +43 -0
  101. package/dist/nodes/ui/workerVitals.js.map +1 -1
  102. package/dist/nodes/ui/workersTable.d.ts.map +1 -1
  103. package/dist/nodes/ui/workersTable.js +2 -1
  104. package/dist/nodes/ui/workersTable.js.map +1 -1
  105. package/dist/telemetry/headless/hooks/useTelemetryDashboard.d.ts +1 -1
  106. package/dist/telemetry/ui/components/dashboard/metrics/MetricSections.d.ts +11 -0
  107. package/dist/telemetry/ui/components/dashboard/metrics/MetricSections.d.ts.map +1 -1
  108. package/dist/telemetry/ui/components/dashboard/metrics/MetricSections.js +17 -2
  109. package/dist/telemetry/ui/components/dashboard/metrics/MetricSections.js.map +1 -1
  110. package/dist/webhooks/headless/client.d.ts +101 -0
  111. package/dist/webhooks/headless/client.d.ts.map +1 -0
  112. package/dist/webhooks/headless/client.js +105 -0
  113. package/dist/webhooks/headless/client.js.map +1 -0
  114. package/dist/webhooks/headless/event-selection.d.ts +119 -0
  115. package/dist/webhooks/headless/event-selection.d.ts.map +1 -0
  116. package/dist/webhooks/headless/event-selection.js +225 -0
  117. package/dist/webhooks/headless/event-selection.js.map +1 -0
  118. package/dist/webhooks/headless/format.d.ts +84 -0
  119. package/dist/webhooks/headless/format.d.ts.map +1 -0
  120. package/dist/webhooks/headless/format.js +142 -0
  121. package/dist/webhooks/headless/format.js.map +1 -0
  122. package/dist/webhooks/headless/hooks.d.ts +199 -0
  123. package/dist/webhooks/headless/hooks.d.ts.map +1 -0
  124. package/dist/webhooks/headless/hooks.js +249 -0
  125. package/dist/webhooks/headless/hooks.js.map +1 -0
  126. package/dist/webhooks/headless/index.d.ts +9 -0
  127. package/dist/webhooks/headless/index.d.ts.map +1 -0
  128. package/dist/webhooks/headless/index.js +9 -0
  129. package/dist/webhooks/headless/index.js.map +1 -0
  130. package/dist/webhooks/ui/WebhookDeliveryDrawer.d.ts +32 -0
  131. package/dist/webhooks/ui/WebhookDeliveryDrawer.d.ts.map +1 -0
  132. package/dist/webhooks/ui/WebhookDeliveryDrawer.js +64 -0
  133. package/dist/webhooks/ui/WebhookDeliveryDrawer.js.map +1 -0
  134. package/dist/webhooks/ui/WebhookEndpointDetail.d.ts +21 -0
  135. package/dist/webhooks/ui/WebhookEndpointDetail.d.ts.map +1 -0
  136. package/dist/webhooks/ui/WebhookEndpointDetail.js +96 -0
  137. package/dist/webhooks/ui/WebhookEndpointDetail.js.map +1 -0
  138. package/dist/webhooks/ui/WebhookEndpointDialog.d.ts +39 -0
  139. package/dist/webhooks/ui/WebhookEndpointDialog.d.ts.map +1 -0
  140. package/dist/webhooks/ui/WebhookEndpointDialog.js +79 -0
  141. package/dist/webhooks/ui/WebhookEndpointDialog.js.map +1 -0
  142. package/dist/webhooks/ui/WebhookEventPicker.d.ts +30 -0
  143. package/dist/webhooks/ui/WebhookEventPicker.d.ts.map +1 -0
  144. package/dist/webhooks/ui/WebhookEventPicker.js +33 -0
  145. package/dist/webhooks/ui/WebhookEventPicker.js.map +1 -0
  146. package/dist/webhooks/ui/WebhookSecretDialog.d.ts +27 -0
  147. package/dist/webhooks/ui/WebhookSecretDialog.d.ts.map +1 -0
  148. package/dist/webhooks/ui/WebhookSecretDialog.js +52 -0
  149. package/dist/webhooks/ui/WebhookSecretDialog.js.map +1 -0
  150. package/dist/webhooks/ui/WebhookSignatureHelp.d.ts +18 -0
  151. package/dist/webhooks/ui/WebhookSignatureHelp.d.ts.map +1 -0
  152. package/dist/webhooks/ui/WebhookSignatureHelp.js +40 -0
  153. package/dist/webhooks/ui/WebhookSignatureHelp.js.map +1 -0
  154. package/dist/webhooks/ui/WebhooksPage.d.ts +47 -0
  155. package/dist/webhooks/ui/WebhooksPage.d.ts.map +1 -0
  156. package/dist/webhooks/ui/WebhooksPage.js +172 -0
  157. package/dist/webhooks/ui/WebhooksPage.js.map +1 -0
  158. package/dist/webhooks/ui/copy.d.ts +24 -0
  159. package/dist/webhooks/ui/copy.d.ts.map +1 -0
  160. package/dist/webhooks/ui/copy.js +34 -0
  161. package/dist/webhooks/ui/copy.js.map +1 -0
  162. package/dist/webhooks/ui/index.d.ts +15 -0
  163. package/dist/webhooks/ui/index.d.ts.map +1 -0
  164. package/dist/webhooks/ui/index.js +12 -0
  165. package/dist/webhooks/ui/index.js.map +1 -0
  166. package/dist/webhooks/ui/parts.d.ts +25 -0
  167. package/dist/webhooks/ui/parts.d.ts.map +1 -0
  168. package/dist/webhooks/ui/parts.js +28 -0
  169. package/dist/webhooks/ui/parts.js.map +1 -0
  170. package/dist/webhooks/ui/settings.d.ts +58 -0
  171. package/dist/webhooks/ui/settings.d.ts.map +1 -0
  172. package/dist/webhooks/ui/settings.js +79 -0
  173. package/dist/webhooks/ui/settings.js.map +1 -0
  174. package/package.json +18 -2
@@ -0,0 +1,124 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ // =============================================================================
3
+ // AlertRuleDialog (issue #1047): create, edit or view one alert rule
4
+ // =============================================================================
5
+ //
6
+ // Kind first (fixed once the rule exists), then the kind's own form:
7
+ // metric_threshold: metric (from the telemetry store's table list, or typed),
8
+ // aggregation, window, comparator, threshold, group-by
9
+ // attributes and attribute filters;
10
+ // node_event: event types (NODE_EVENT_TYPES, or a `prefix.*`), least
11
+ // severity, node ids, required attributes, recovery events
12
+ // and the auto-resolve delay;
13
+ // verdict: the least dashboard verdict level;
14
+ // node_offline, telemetry_unavailable: nothing to configure;
15
+ // any other kind: its config as JSON.
16
+ // Then the common fields: severity, `for`, cooldown, notification channels and
17
+ // the webhook toggle. "Test" evaluates the SAVED rule now and shows what it
18
+ // observed. The draft is checked against the contract before sending; the API
19
+ // validates again and decides.
20
+ // =============================================================================
21
+ import { Alert, Autocomplete, Box, Button, Checkbox, Dialog, DialogActions, DialogContent, DialogTitle, Divider, FormControl, FormControlLabel, FormGroup, FormHelperText, FormLabel, IconButton, MenuItem, Stack, Switch, TextField, Typography, useMediaQuery, useTheme, } from '@mui/material';
22
+ import AddIcon from '@mui/icons-material/Add';
23
+ import DeleteOutlineIcon from '@mui/icons-material/DeleteOutlined';
24
+ import { useEffect, useMemo, useState } from 'react';
25
+ import { ALERT_AGGREGATIONS, ALERT_COMPARATORS, ALERT_FILTERS_MAX, ALERT_GROUP_BY_MAX, ALERT_KIND_IDS, ALERT_SEVERITIES, } from '@marinoscar/platform-contract/alerts';
26
+ import { NODE_EVENT_SEVERITIES, NODE_EVENT_TYPES } from '@marinoscar/platform-contract/nodes';
27
+ import { PLATFORM_NOTIFICATION_CHANNEL_IDS } from '@marinoscar/platform-contract/notifications';
28
+ import { ALERT_AGGREGATION_LABELS, ALERT_COMPARATOR_LABELS, ALERT_FORM_KINDS, ALERT_SEVERITY_LABELS, alertKindHasNoConfig, alertKindLabel, alertRuleDraftFromRule, buildAlertRulePayload, emptyAlertRuleDraft, formatAlertSeconds, } from '../headless/index.js';
29
+ import { AlertRuleTestResult } from './AlertRuleTestResult.js';
30
+ /** The node event types the picker offers, then the two prefixes. */
31
+ const EVENT_TYPE_OPTIONS = [...Object.values(NODE_EVENT_TYPES), 'power.*', 'node.*'];
32
+ const CHANNEL_LABELS = { email: 'Email', browser: 'In-app', push: 'Push' };
33
+ function numberOf(text) {
34
+ return text.trim() === '' ? Number.NaN : Number(text);
35
+ }
36
+ function SecondsField({ label, value, onChange, error, disabled, helper, }) {
37
+ return (_jsx(TextField, { label: label, type: "number", value: Number.isFinite(value) ? value : '', onChange: (event) => onChange(numberOf(event.target.value)), error: Boolean(error), helperText: error ?? `${helper ? `${helper} ` : ''}${Number.isFinite(value) ? `(${formatAlertSeconds(value)})` : ''}`, disabled: disabled, slotProps: { htmlInput: { min: 0, step: 1 } }, fullWidth: true }));
38
+ }
39
+ function AttrsEditor({ label, attrs, onChange, disabled, error, }) {
40
+ return (_jsxs(FormControl, { component: "fieldset", error: Boolean(error), fullWidth: true, children: [_jsx(FormLabel, { component: "legend", children: label }), _jsxs(Stack, { spacing: 1, sx: { mt: 1 }, children: [attrs.map((attr, index) => (_jsxs(Stack, { direction: { xs: 'column', sm: 'row' }, spacing: 1, sx: { alignItems: { sm: 'center' } }, children: [_jsx(TextField, { label: "Attribute", size: "small", value: attr.key, disabled: disabled, onChange: (event) => onChange(attrs.map((a, i) => (i === index ? { ...a, key: event.target.value } : a))) }), _jsx(TextField, { label: "Value", size: "small", value: attr.value, disabled: disabled, onChange: (event) => onChange(attrs.map((a, i) => (i === index ? { ...a, value: event.target.value } : a))) }), disabled ? null : (_jsx(IconButton, { "aria-label": `Remove attribute ${index + 1}`, onClick: () => onChange(attrs.filter((_, i) => i !== index)), children: _jsx(DeleteOutlineIcon, {}) }))] }, index))), disabled || attrs.length >= 5 ? null : (_jsx(Box, { children: _jsx(Button, { size: "small", startIcon: _jsx(AddIcon, {}), onClick: () => onChange([...attrs, { key: '', value: '' }]), children: "Add attribute" }) }))] }), error ? _jsx(FormHelperText, { children: error }) : null] }));
41
+ }
42
+ function MetricThresholdFields({ value, onChange, metrics, metricsError, errors, disabled, }) {
43
+ const metricNames = useMemo(() => metrics.map((metric) => metric.name), [metrics]);
44
+ const attributes = useMemo(() => {
45
+ const table = value.metric.replace(/\./g, '_');
46
+ const entry = metrics.find((metric) => metric.name === value.metric || metric.name.startsWith(table));
47
+ return entry?.attributes ?? [];
48
+ }, [metrics, value.metric]);
49
+ return (_jsxs(Stack, { spacing: 2, children: [_jsx(Autocomplete, { freeSolo: true, options: metricNames, value: value.metric, disabled: disabled, onInputChange: (_, next) => onChange({ ...value, metric: next }), renderInput: (params) => (_jsx(TextField, { ...params, label: "Metric", required: true, error: Boolean(errors['metric']), helperText: errors['metric'] ?? metricsError ?? 'A metric name (app.jobs.settled) or a table of the telemetry store.' })) }), _jsxs(Stack, { direction: { xs: 'column', sm: 'row' }, spacing: 2, children: [_jsx(TextField, { select: true, label: "Aggregation", value: value.aggregation, disabled: disabled, onChange: (event) => onChange({ ...value, aggregation: event.target.value }), fullWidth: true, children: ALERT_AGGREGATIONS.map((aggregation) => (_jsx(MenuItem, { value: aggregation, children: ALERT_AGGREGATION_LABELS[aggregation] }, aggregation))) }), _jsx(SecondsField, { label: "Window (seconds)", value: value.windowSeconds, onChange: (windowSeconds) => onChange({ ...value, windowSeconds }), error: errors['windowSeconds'], disabled: disabled })] }), _jsxs(Stack, { direction: { xs: 'column', sm: 'row' }, spacing: 2, children: [_jsx(TextField, { select: true, label: "Comparator", value: value.comparator, disabled: disabled, onChange: (event) => onChange({ ...value, comparator: event.target.value }), fullWidth: true, children: ALERT_COMPARATORS.map((comparator) => (_jsx(MenuItem, { value: comparator, children: ALERT_COMPARATOR_LABELS[comparator] }, comparator))) }), _jsx(TextField, { label: "Threshold", type: "number", required: true, value: value.threshold, disabled: disabled, onChange: (event) => onChange({ ...value, threshold: event.target.value }), error: Boolean(errors['threshold']), helperText: errors['threshold'] ?? ' ', fullWidth: true })] }), _jsx(Autocomplete, { multiple: true, freeSolo: true, options: attributes, value: value.groupBy, disabled: disabled, onChange: (_, next) => onChange({ ...value, groupBy: next.slice(0, ALERT_GROUP_BY_MAX) }), renderInput: (params) => (_jsx(TextField, { ...params, label: "Group by", error: Boolean(errors['groupBy']), helperText: errors['groupBy'] ?? `Up to ${ALERT_GROUP_BY_MAX} attributes; one incident per value.` })) }), _jsxs(FormControl, { component: "fieldset", error: Boolean(errors['filters']), fullWidth: true, children: [_jsx(FormLabel, { component: "legend", children: "Filters" }), _jsxs(Stack, { spacing: 1, sx: { mt: 1 }, children: [value.filters.map((filter, index) => (_jsxs(Stack, { direction: { xs: 'column', sm: 'row' }, spacing: 1, sx: { alignItems: { sm: 'center' } }, children: [_jsx(TextField, { label: "Attribute", size: "small", value: filter.attr, disabled: disabled, onChange: (event) => onChange({ ...value, filters: value.filters.map((f, i) => (i === index ? { ...f, attr: event.target.value } : f)) }) }), _jsxs(TextField, { select: true, label: "Operator", size: "small", value: filter.op, disabled: disabled, onChange: (event) => onChange({
50
+ ...value,
51
+ filters: value.filters.map((f, i) => (i === index ? { ...f, op: event.target.value === 'neq' ? 'neq' : 'eq' } : f)),
52
+ }), sx: { minWidth: 120 }, children: [_jsx(MenuItem, { value: "eq", children: "equals" }), _jsx(MenuItem, { value: "neq", children: "does not equal" })] }), _jsx(TextField, { label: "Value", size: "small", value: filter.value, disabled: disabled, onChange: (event) => onChange({ ...value, filters: value.filters.map((f, i) => (i === index ? { ...f, value: event.target.value } : f)) }) }), disabled ? null : (_jsx(IconButton, { "aria-label": `Remove filter ${index + 1}`, onClick: () => onChange({ ...value, filters: value.filters.filter((_, i) => i !== index) }), children: _jsx(DeleteOutlineIcon, {}) }))] }, index))), disabled || value.filters.length >= ALERT_FILTERS_MAX ? null : (_jsx(Box, { children: _jsx(Button, { size: "small", startIcon: _jsx(AddIcon, {}), onClick: () => onChange({ ...value, filters: [...value.filters, { attr: '', op: 'eq', value: '' }] }), children: "Add filter" }) }))] }), errors['filters'] ? _jsx(FormHelperText, { children: errors['filters'] }) : null] })] }));
53
+ }
54
+ function EventTypesField({ label, value, onChange, disabled, error, helper, required, }) {
55
+ return (_jsx(Autocomplete, { multiple: true, freeSolo: true, options: EVENT_TYPE_OPTIONS, value: value, disabled: disabled, onChange: (_, next) => onChange(next), renderInput: (params) => (_jsx(TextField, { ...params, label: label, required: required ?? false, error: Boolean(error), helperText: error ?? helper })) }));
56
+ }
57
+ function NodeEventFields({ value, onChange, errors, disabled, }) {
58
+ return (_jsxs(Stack, { spacing: 2, children: [_jsx(EventTypesField, { label: "Event types", required: true, value: value.eventTypes, onChange: (eventTypes) => onChange({ ...value, eventTypes }), disabled: disabled, error: errors['eventTypes'], helper: "The node events that raise the alert; a prefix such as power.* matches every power event." }), _jsxs(Stack, { direction: { xs: 'column', sm: 'row' }, spacing: 2, children: [_jsxs(TextField, { select: true, label: "Least severity", value: value.minSeverity, disabled: disabled, onChange: (event) => onChange({ ...value, minSeverity: event.target.value }), fullWidth: true, children: [_jsx(MenuItem, { value: "", children: "Any severity" }), NODE_EVENT_SEVERITIES.map((severity) => (_jsx(MenuItem, { value: severity, children: ALERT_SEVERITY_LABELS[severity] }, severity)))] }), _jsx(SecondsField, { label: "Resolve after (seconds)", value: value.resolveAfterSeconds, onChange: (resolveAfterSeconds) => onChange({ ...value, resolveAfterSeconds }), error: errors['resolveAfterSeconds'], disabled: disabled, helper: "Without a recovery event." })] }), _jsx(Autocomplete, { multiple: true, freeSolo: true, options: [], value: value.nodeIds, disabled: disabled, onChange: (_, next) => onChange({ ...value, nodeIds: next }), renderInput: (params) => (_jsx(TextField, { ...params, label: "Only these nodes", error: Boolean(errors['nodeIds']), helperText: errors['nodeIds'] ?? 'Node ids; leave empty for every node. Press Enter after each.' })) }), _jsx(AttrsEditor, { label: "The event must carry", attrs: value.attrs, onChange: (attrs) => onChange({ ...value, attrs }), disabled: disabled, error: errors['attrs'] }), _jsx(Divider, {}), _jsx(EventTypesField, { label: "Recovery event types", value: value.recoveryEventTypes, onChange: (recoveryEventTypes) => onChange({ ...value, recoveryEventTypes }), disabled: disabled, error: errors['recovery'], helper: "Events that resolve the incident early; leave empty to resolve only after the delay." }), value.recoveryEventTypes.length > 0 ? (_jsx(AttrsEditor, { label: "The recovery event must carry", attrs: value.recoveryAttrs, onChange: (recoveryAttrs) => onChange({ ...value, recoveryAttrs }), disabled: disabled })) : null] }));
59
+ }
60
+ /**
61
+ * The create, edit and view dialog of one alert rule.
62
+ *
63
+ * @param props - see {@link AlertRuleDialogProps}.
64
+ * @returns the dialog.
65
+ *
66
+ * @extensionPoint component
67
+ * @stability experimental
68
+ */
69
+ export function AlertRuleDialog({ open, rule, kinds, metrics = [], metricsError = null, channels = PLATFORM_NOTIFICATION_CHANNEL_IDS, readOnly = false, saving = false, error = null, onSubmit, onTest, onDelete, onClose, }) {
70
+ const theme = useTheme();
71
+ const fullScreen = useMediaQuery(theme.breakpoints.down('sm'));
72
+ const [draft, setDraft] = useState(() => (rule ? alertRuleDraftFromRule(rule) : emptyAlertRuleDraft()));
73
+ const [errors, setErrors] = useState({});
74
+ const [testResult, setTestResult] = useState(null);
75
+ const [testing, setTesting] = useState(false);
76
+ useEffect(() => {
77
+ if (!open)
78
+ return;
79
+ setDraft(rule ? alertRuleDraftFromRule(rule) : emptyAlertRuleDraft());
80
+ setErrors({});
81
+ setTestResult(null);
82
+ }, [open, rule]);
83
+ const kindOptions = useMemo(() => {
84
+ const ids = kinds.length > 0 ? kinds.map((kind) => kind.id) : [...ALERT_FORM_KINDS];
85
+ if (rule && !ids.includes(rule.kind))
86
+ ids.push(rule.kind);
87
+ return ids;
88
+ }, [kinds, rule]);
89
+ const kindDescription = kinds.find((kind) => kind.id === draft.kind)?.description;
90
+ const channelOptions = useMemo(() => [...new Set([...channels, ...draft.notifyChannels])], [channels, draft.notifyChannels]);
91
+ const disabled = readOnly || saving;
92
+ const set = (patch) => setDraft((current) => ({ ...current, ...patch }));
93
+ const submit = () => {
94
+ const result = rule ? buildAlertRulePayload(draft, 'update') : buildAlertRulePayload(draft, 'create');
95
+ if (!result.ok) {
96
+ setErrors(result.errors);
97
+ return;
98
+ }
99
+ setErrors({});
100
+ onSubmit(result.value);
101
+ };
102
+ const runTest = async () => {
103
+ if (!onTest)
104
+ return;
105
+ setTesting(true);
106
+ try {
107
+ setTestResult(await onTest());
108
+ }
109
+ finally {
110
+ setTesting(false);
111
+ }
112
+ };
113
+ const title = rule ? (readOnly ? rule.name : `Edit ${rule.name}`) : 'New alert rule';
114
+ return (_jsxs(Dialog, { open: open, onClose: onClose, fullScreen: fullScreen, maxWidth: "md", fullWidth: true, "aria-labelledby": "alert-rule-dialog-title", children: [_jsx(DialogTitle, { id: "alert-rule-dialog-title", children: title }), _jsx(DialogContent, { dividers: true, children: _jsxs(Stack, { spacing: 2, children: [error ? _jsx(Alert, { severity: "error", children: error }) : null, rule?.starter ? (_jsx(Alert, { severity: "info", children: "This is a built-in rule. You can edit, enable and disable it; it cannot be deleted." })) : null, _jsx(TextField, { label: "Name", required: true, value: draft.name, disabled: disabled, onChange: (event) => set({ name: event.target.value }), error: Boolean(errors['name']), helperText: errors['name'] ?? ' ', fullWidth: true }), _jsx(TextField, { label: "Description", value: draft.description, disabled: disabled, onChange: (event) => set({ description: event.target.value }), multiline: true, minRows: 2, fullWidth: true }), _jsx(TextField, { select: true, label: "Kind", value: draft.kind, disabled: disabled || rule !== null, onChange: (event) => {
115
+ const kind = event.target.value;
116
+ setDraft((current) => ({ ...emptyAlertRuleDraft(kind), name: current.name, description: current.description }));
117
+ setErrors({});
118
+ }, helperText: rule ? 'The kind of an existing rule cannot change.' : (kindDescription ?? ' '), fullWidth: true, children: kindOptions.map((id) => (_jsx(MenuItem, { value: id, children: alertKindLabel(id, kinds) }, id))) }), _jsx(Typography, { variant: "subtitle2", component: "h3", children: "Condition" }), draft.kind === ALERT_KIND_IDS.METRIC_THRESHOLD ? (_jsx(MetricThresholdFields, { value: draft.metric, onChange: (metric) => set({ metric }), metrics: metrics, metricsError: metricsError, errors: errors, disabled: disabled })) : draft.kind === ALERT_KIND_IDS.NODE_EVENT ? (_jsx(NodeEventFields, { value: draft.nodeEvent, onChange: (nodeEvent) => set({ nodeEvent }), errors: errors, disabled: disabled })) : draft.kind === ALERT_KIND_IDS.VERDICT ? (_jsxs(TextField, { select: true, label: "Least verdict level", value: draft.verdict.minLevel, disabled: disabled, onChange: (event) => set({ verdict: { minLevel: event.target.value === 'degraded' ? 'degraded' : 'critical' } }), helperText: "Fires when the telemetry dashboard verdict is at this level or worse.", fullWidth: true, children: [_jsx(MenuItem, { value: "degraded", children: "Degraded" }), _jsx(MenuItem, { value: "critical", children: "Critical" })] })) : alertKindHasNoConfig(draft.kind) ? (_jsx(Typography, { variant: "body2", color: "text.secondary", children: "This kind has nothing to configure." })) : (_jsx(TextField, { label: "Configuration (JSON)", value: draft.rawConfig, disabled: disabled, onChange: (event) => set({ rawConfig: event.target.value }), error: Boolean(errors['config']), helperText: errors['config'] ?? 'Validated by the API against the kind’s schema.', multiline: true, minRows: 4, fullWidth: true, slotProps: { htmlInput: { spellCheck: false, style: { fontFamily: 'monospace' } } } })), errors['config'] && ALERT_FORM_KINDS.includes(draft.kind) ? _jsx(Alert, { severity: "error", children: errors['config'] }) : null, _jsx(Typography, { variant: "subtitle2", component: "h3", children: "Firing and notifications" }), _jsxs(Stack, { direction: { xs: 'column', sm: 'row' }, spacing: 2, children: [_jsx(TextField, { select: true, label: "Severity", value: draft.severity, disabled: disabled, onChange: (event) => set({ severity: event.target.value }), fullWidth: true, children: ALERT_SEVERITIES.map((severity) => (_jsx(MenuItem, { value: severity, children: ALERT_SEVERITY_LABELS[severity] }, severity))) }), _jsx(SecondsField, { label: "For (seconds)", value: draft.forSeconds, onChange: (forSeconds) => set({ forSeconds }), error: errors['forSeconds'], disabled: disabled, helper: "How long the condition must hold." }), _jsx(SecondsField, { label: "Cooldown (seconds)", value: draft.cooldownSeconds, onChange: (cooldownSeconds) => set({ cooldownSeconds }), error: errors['cooldownSeconds'], disabled: disabled, helper: "Quiet time before firing again." })] }), _jsxs(FormControl, { component: "fieldset", error: Boolean(errors['notifyChannels']), children: [_jsx(FormLabel, { component: "legend", children: "Notification channels" }), _jsx(FormGroup, { row: true, children: channelOptions.map((channel) => (_jsx(FormControlLabel, { label: CHANNEL_LABELS[channel] ?? channel, control: _jsx(Checkbox, { checked: draft.notifyChannels.includes(channel), disabled: disabled, onChange: (event) => set({
119
+ notifyChannels: event.target.checked
120
+ ? [...draft.notifyChannels, channel]
121
+ : draft.notifyChannels.filter((id) => id !== channel),
122
+ }) }) }, channel))) }), _jsx(FormHelperText, { children: errors['notifyChannels'] ?? 'None checked: every channel the recipients have turned on for alerts.' })] }), _jsx(FormControlLabel, { control: _jsx(Switch, { checked: draft.webhook, disabled: disabled, onChange: (event) => set({ webhook: event.target.checked }) }), label: "Also send alerts.alert.fired and alerts.alert.resolved webhooks" }), _jsx(FormControlLabel, { control: _jsx(Switch, { checked: draft.enabled, disabled: disabled, onChange: (event) => set({ enabled: event.target.checked }) }), label: "Enabled" }), rule && onTest ? (_jsxs(Box, { children: [_jsx(Divider, { sx: { mb: 2 } }), _jsxs(Stack, { direction: "row", spacing: 2, sx: { mb: 1, alignItems: 'center' }, children: [_jsx(Button, { variant: "outlined", onClick: () => void runTest(), disabled: testing, sx: { minHeight: 44 }, children: testing ? 'Testing…' : 'Test' }), _jsx(Typography, { variant: "body2", color: "text.secondary", children: "Evaluates the saved rule now. Save your changes first to test them." })] }), testResult ? _jsx(AlertRuleTestResult, { result: testResult }) : null] })) : null] }) }), _jsxs(DialogActions, { children: [onDelete && rule && !rule.starter && !readOnly ? (_jsx(Button, { color: "error", startIcon: _jsx(DeleteOutlineIcon, {}), onClick: onDelete, disabled: saving, sx: { minHeight: 44, mr: 'auto' }, children: "Delete" })) : null, _jsx(Button, { onClick: onClose, sx: { minHeight: 44 }, children: readOnly ? 'Close' : 'Cancel' }), readOnly ? null : (_jsx(Button, { variant: "contained", onClick: submit, disabled: saving, sx: { minHeight: 44 }, children: rule ? 'Save' : 'Create rule' }))] })] }));
123
+ }
124
+ //# sourceMappingURL=AlertRuleDialog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AlertRuleDialog.js","sourceRoot":"","sources":["../../../src/alerts/ui/AlertRuleDialog.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import type { ReactElement } from 'react';
2
+ import type { AlertRuleTestResponse } from '@marinoscar/platform-contract/alerts';
3
+ /**
4
+ * Props of {@link AlertRuleTestResult}.
5
+ *
6
+ * @stability experimental
7
+ */
8
+ export interface AlertRuleTestResultProps {
9
+ /** The dry run's answer. */
10
+ result: AlertRuleTestResponse;
11
+ }
12
+ /**
13
+ * A rule's dry-run observations: the error, or each label set with its value
14
+ * and whether it breached, breached ones first.
15
+ *
16
+ * @param props - see {@link AlertRuleTestResultProps}.
17
+ * @returns the panel.
18
+ *
19
+ * @extensionPoint component
20
+ * @stability experimental
21
+ */
22
+ export declare function AlertRuleTestResult({ result }: AlertRuleTestResultProps): ReactElement;
23
+ //# sourceMappingURL=AlertRuleTestResult.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AlertRuleTestResult.d.ts","sourceRoot":"","sources":["../../../src/alerts/ui/AlertRuleTestResult.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAE1C,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AAKlF;;;;GAIG;AACH,MAAM,WAAW,wBAAwB;IACvC,4BAA4B;IAC5B,MAAM,EAAE,qBAAqB,CAAC;CAC/B;AAED;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAAC,EAAE,MAAM,EAAE,EAAE,wBAAwB,GAAG,YAAY,CA+CtF"}
@@ -0,0 +1,30 @@
1
+ import { jsxs as _jsxs, jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
2
+ // The observations of a rule's dry run (issue #1047): what `POST
3
+ // /admin/alerts/rules/:id/test` saw, one row per label set, breached first.
4
+ // Nothing was stored and nothing was sent; the panel says so.
5
+ import { Alert, Box, Chip, List, ListItem, ListItemText, Stack, Typography } from '@mui/material';
6
+ import { formatAlertLabels } from '../headless/index.js';
7
+ import { when } from './parts.js';
8
+ /**
9
+ * A rule's dry-run observations: the error, or each label set with its value
10
+ * and whether it breached, breached ones first.
11
+ *
12
+ * @param props - see {@link AlertRuleTestResultProps}.
13
+ * @returns the panel.
14
+ *
15
+ * @extensionPoint component
16
+ * @stability experimental
17
+ */
18
+ export function AlertRuleTestResult({ result }) {
19
+ const observations = [...result.observations].sort((a, b) => Number(b.breached) - Number(a.breached));
20
+ const breached = observations.filter((observation) => observation.breached).length;
21
+ return (_jsxs(Box, { "data-testid": "alert-test-result", children: [_jsxs(Typography, { variant: "body2", color: "text.secondary", sx: { mb: 1 }, children: ["Evaluated ", when(result.evaluatedAt), " in ", result.durationMs, " ms. Nothing was stored and no notification was sent."] }), result.error ? (_jsxs(Alert, { severity: "error", children: ["The rule could not be evaluated: ", result.error] })) : observations.length === 0 ? (_jsx(Alert, { severity: "info", children: "No observations: nothing matched the rule right now." })) : (_jsxs(_Fragment, { children: [_jsx(Alert, { severity: breached > 0 ? 'warning' : 'success', sx: { mb: 1 }, children: breached > 0
22
+ ? `${breached} of ${observations.length} ${observations.length === 1 ? 'observation' : 'observations'} would fire.`
23
+ : `None of the ${observations.length} ${observations.length === 1 ? 'observation' : 'observations'} would fire.` }), _jsx(List, { dense: true, "aria-label": "Observations", children: observations.map((observation, index) => (_jsx(ListItem, { divider: true, children: _jsx(ListItemText, { primary: _jsxs(Stack, { direction: "row", spacing: 1, useFlexGap: true, sx: { alignItems: 'center', flexWrap: 'wrap' }, children: [_jsx(Chip, { size: "small", label: observation.breached ? 'Breached' : 'OK', color: observation.breached ? 'warning' : 'success' }), _jsx("span", { children: observation.summary })] }), secondary: [
24
+ formatAlertLabels(observation.labels) || 'No labels',
25
+ observation.value === null ? null : `value ${observation.value}`,
26
+ ]
27
+ .filter(Boolean)
28
+ .join(' · ') }) }, `${formatAlertLabels(observation.labels)}-${index}`))) })] }))] }));
29
+ }
30
+ //# sourceMappingURL=AlertRuleTestResult.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AlertRuleTestResult.js","sourceRoot":"","sources":["../../../src/alerts/ui/AlertRuleTestResult.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ import { type ReactElement } from 'react';
2
+ import type { PageSlotsBase } from '../../core/index.js';
3
+ /**
4
+ * The slots of {@link AlertsPage}: the page-slot contract.
5
+ *
6
+ * @example
7
+ * ```tsx
8
+ * <AlertsPage slots={{ BeforeContent: OnCallNotice }} />
9
+ * ```
10
+ *
11
+ * @extensionPoint slot
12
+ * @stability experimental
13
+ */
14
+ export type AlertsPageSlots = PageSlotsBase;
15
+ /**
16
+ * Props of {@link AlertsPage}.
17
+ *
18
+ * @stability experimental
19
+ */
20
+ export interface AlertsPageProps {
21
+ /** Optional extension slots; omitted, the page renders exactly its own markup. */
22
+ slots?: AlertsPageSlots;
23
+ /** The notification channel ids the rule editor offers; default `email`, `browser`, `push`. */
24
+ channels?: readonly string[];
25
+ }
26
+ /**
27
+ * The Alerts page: the Rules and Incidents tabs.
28
+ *
29
+ * @param props - see {@link AlertsPageProps}.
30
+ * @returns the page.
31
+ *
32
+ * @example
33
+ * ```tsx
34
+ * <Route path="/admin/settings/alerts" element={<AlertsPage />} />
35
+ * ```
36
+ *
37
+ * @extensionPoint component
38
+ * @stability experimental
39
+ */
40
+ export declare function AlertsPage({ slots, channels }?: AlertsPageProps): ReactElement;
41
+ //# sourceMappingURL=AlertsPage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AlertsPage.d.ts","sourceRoot":"","sources":["../../../src/alerts/ui/AlertsPage.tsx"],"names":[],"mappings":"AAuCA,OAAO,EAAkC,KAAK,YAAY,EAAE,MAAM,OAAO,CAAC;AAe1E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAmBzD;;;;;;;;;;GAUG;AACH,MAAM,MAAM,eAAe,GAAG,aAAa,CAAC;AAE5C;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC9B,kFAAkF;IAClF,KAAK,CAAC,EAAE,eAAe,CAAC;IACxB,+FAA+F;IAC/F,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC9B;AAyXD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,UAAU,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAE,eAAoB,GAAG,YAAY,CAiDlF"}
@@ -0,0 +1,238 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ // =============================================================================
3
+ // AlertsPage (issue #1047): the rules and the incidents they raised
4
+ // =============================================================================
5
+ //
6
+ // One destination (`/admin/settings/alerts`, `alerts:read`) with two tabs of
7
+ // PARALLEL content: Rules (the list with the enable switch, the editor, the
8
+ // dry-run "Test") and Incidents (filters, the table, the detail drawer,
9
+ // Acknowledge). The tab is kept in the URL (`?tab=incidents`) so the firing
10
+ // banner can link straight to it. Write controls are drawn only for a viewer
11
+ // holding `alerts:write`; the API enforces it either way. A built-in (starter)
12
+ // rule shows "Built-in" and has no Delete.
13
+ // =============================================================================
14
+ import AddIcon from '@mui/icons-material/Add';
15
+ import EditOutlinedIcon from '@mui/icons-material/EditOutlined';
16
+ import PlayArrowOutlinedIcon from '@mui/icons-material/PlayArrowOutlined';
17
+ import VisibilityOutlinedIcon from '@mui/icons-material/VisibilityOutlined';
18
+ import DoneIcon from '@mui/icons-material/Done';
19
+ import { Alert, Box, Button, Card, CardContent, Chip, Container, Dialog, DialogActions, DialogContent, DialogTitle, Link, MenuItem, Stack, Switch, Tab, Tabs, TextField, Typography, } from '@mui/material';
20
+ import { useCallback, useMemo, useState } from 'react';
21
+ import { useSearchParams } from 'react-router-dom';
22
+ import { ALERT_INCIDENT_STATES, ALERT_PAGE_SIZE_DEFAULT, ALERT_PERMISSIONS, ALERT_SEVERITIES } from '@marinoscar/platform-contract/alerts';
23
+ import { PageSlotsFrame, useDisplayTimeZone, usePlatformViewer } from '../../core/index.js';
24
+ import { DataTable } from '../../datatable/index.js';
25
+ import { ALERT_SEVERITY_LABELS, ALERT_STATE_LABELS, alertKindLabel, formatAlertLabels, useAlertIncidents, useAlertKinds, useAlertMetricCatalog, useAlertMutations, useAlertRules, } from '../headless/index.js';
26
+ import { AlertIncidentDrawer } from './AlertIncidentDrawer.js';
27
+ import { AlertRuleDialog } from './AlertRuleDialog.js';
28
+ import { AlertRuleTestResult } from './AlertRuleTestResult.js';
29
+ import { ALERTS_PAGE_COPY } from './copy.js';
30
+ import { ConfirmDialog, SeverityChip, StateChip, when } from './parts.js';
31
+ function RulesTab({ canWrite, channels }) {
32
+ const { rules, isLoading, error, refresh } = useAlertRules();
33
+ const { kinds } = useAlertKinds();
34
+ const mutations = useAlertMutations();
35
+ const [editing, setEditing] = useState(null);
36
+ const metricsWanted = editing !== null && canWrite;
37
+ const catalog = useAlertMetricCatalog({ enabled: metricsWanted });
38
+ const [deleting, setDeleting] = useState(null);
39
+ const [testing, setTesting] = useState(null);
40
+ const [notice, setNotice] = useState(null);
41
+ const open = useCallback((rule) => {
42
+ mutations.reset();
43
+ setNotice(null);
44
+ setEditing(rule);
45
+ }, [mutations]);
46
+ const save = async (body) => {
47
+ if (editing === null)
48
+ return;
49
+ const saved = editing === 'new' ? await mutations.create(body) : await mutations.update(editing.id, body);
50
+ if (!saved)
51
+ return;
52
+ setEditing(null);
53
+ setNotice(editing === 'new' ? `Rule “${saved.name}” created.` : `Rule “${saved.name}” saved.`);
54
+ await refresh();
55
+ };
56
+ const toggle = useCallback(async (rule, enabled) => {
57
+ const updated = await mutations.toggle(rule.id, enabled);
58
+ if (updated)
59
+ await refresh();
60
+ }, [mutations, refresh]);
61
+ const runTest = useCallback(async (rule) => {
62
+ setTesting({ rule, result: null });
63
+ const result = await mutations.test(rule.id);
64
+ setTesting(result ? { rule, result } : null);
65
+ }, [mutations]);
66
+ const remove = async () => {
67
+ if (!deleting)
68
+ return;
69
+ const ok = await mutations.remove(deleting.id);
70
+ const name = deleting.name;
71
+ setDeleting(null);
72
+ if (!ok)
73
+ return;
74
+ setEditing(null);
75
+ setNotice(`Rule “${name}” deleted.`);
76
+ await refresh();
77
+ };
78
+ const columns = useMemo(() => [
79
+ {
80
+ id: 'enabled',
81
+ label: 'Enabled',
82
+ priority: 'primary',
83
+ value: (row) => (row.enabled ? 'On' : 'Off'),
84
+ render: (row) => (_jsx(Switch, { checked: row.enabled, disabled: !canWrite || mutations.pending, onChange: (event) => void toggle(row, event.target.checked), slotProps: { input: { 'aria-label': `${row.enabled ? 'Disable' : 'Enable'} ${row.name}` } } })),
85
+ },
86
+ {
87
+ id: 'name',
88
+ label: 'Name',
89
+ priority: 'primary',
90
+ value: (row) => row.name,
91
+ render: (row) => (_jsxs(Stack, { direction: "row", spacing: 1, useFlexGap: true, sx: { alignItems: 'center', flexWrap: 'wrap' }, children: [_jsx(Link, { component: "button", type: "button", variant: "body2", onClick: () => open(row), sx: { textAlign: 'left', fontWeight: 600 }, children: row.name }), row.starter ? _jsx(Chip, { size: "small", variant: "outlined", label: "Built-in" }) : null] })),
92
+ },
93
+ { id: 'kind', label: 'Kind', priority: 'secondary', value: (row) => alertKindLabel(row.kind, kinds) },
94
+ {
95
+ id: 'severity',
96
+ label: 'Severity',
97
+ priority: 'secondary',
98
+ value: (row) => ALERT_SEVERITY_LABELS[row.severity],
99
+ render: (row) => _jsx(SeverityChip, { severity: row.severity }),
100
+ },
101
+ { id: 'lastEvaluatedAt', label: 'Last evaluated', priority: 'detail', value: (row) => when(row.lastEvaluatedAt) },
102
+ {
103
+ id: 'lastError',
104
+ label: 'Last error',
105
+ priority: 'detail',
106
+ value: (row) => row.lastError ?? '',
107
+ render: (row) => row.lastError ? (_jsx(Typography, { variant: "body2", color: "error", children: row.lastError })) : ('—'),
108
+ },
109
+ ], [canWrite, kinds, mutations.pending, open, toggle]);
110
+ const rowActions = useMemo(() => {
111
+ const actions = [
112
+ canWrite
113
+ ? { id: 'edit', label: 'Edit rule', icon: _jsx(EditOutlinedIcon, {}), onClick: (row) => open(row) }
114
+ : { id: 'view', label: 'View rule', icon: _jsx(VisibilityOutlinedIcon, {}), onClick: (row) => open(row) },
115
+ ];
116
+ if (canWrite) {
117
+ actions.push({ id: 'test', label: 'Test rule', icon: _jsx(PlayArrowOutlinedIcon, {}), onClick: (row) => void runTest(row) });
118
+ }
119
+ return actions;
120
+ }, [canWrite, open, runTest]);
121
+ return (_jsxs(Stack, { spacing: 2, children: [error ? _jsx(Alert, { severity: "error", children: error }) : null, mutations.error && editing === null ? (_jsx(Alert, { severity: "error", onClose: mutations.reset, children: mutations.error })) : null, notice ? (_jsx(Alert, { severity: "success", onClose: () => setNotice(null), children: notice })) : null, canWrite ? (_jsx(Box, { children: _jsx(Button, { variant: "contained", startIcon: _jsx(AddIcon, {}), onClick: () => open('new'), sx: { minHeight: 44 }, children: "New rule" }) })) : null, _jsx(Card, { variant: "outlined", children: _jsx(CardContent, { children: _jsx(DataTable, { tableId: "alert-rules", ariaLabel: "Alert rules", columns: columns, rows: rules, rowId: (row) => row.id, loading: isLoading, rowActions: rowActions, emptyState: _jsxs(Typography, { variant: "body2", color: "text.secondary", sx: { p: 2 }, children: ["No alert rules yet.", canWrite ? ' Create one to get told when something needs attention.' : ''] }), disableExport: true }) }) }), _jsx(AlertRuleDialog, { open: editing !== null, rule: editing === 'new' ? null : editing, kinds: kinds, metrics: catalog.metrics, metricsError: metricsWanted ? catalog.error : null, ...(channels ? { channels } : {}), readOnly: !canWrite, saving: mutations.pending, error: editing !== null ? mutations.error : null, onSubmit: (body) => void save(body), ...(canWrite && editing !== null && editing !== 'new'
122
+ ? { onTest: () => mutations.test(editing.id) }
123
+ : {}), ...(canWrite && editing !== null && editing !== 'new' && !editing.starter
124
+ ? { onDelete: () => setDeleting(editing) }
125
+ : {}), onClose: () => {
126
+ setEditing(null);
127
+ mutations.reset();
128
+ } }), _jsxs(ConfirmDialog, { open: deleting !== null, title: "Delete this rule?", confirmLabel: "Delete rule", destructive: true, busy: mutations.pending, onConfirm: () => void remove(), onClose: () => setDeleting(null), children: [deleting ? _jsx("strong", { children: deleting.name }) : 'The rule', " stops being evaluated now, and its incidents are deleted with it. This cannot be undone."] }), _jsxs(Dialog, { open: testing !== null, onClose: () => setTesting(null), maxWidth: "sm", fullWidth: true, "aria-labelledby": "alert-test-title", children: [_jsxs(DialogTitle, { id: "alert-test-title", children: ["Test: ", testing?.rule.name] }), _jsx(DialogContent, { dividers: true, children: testing?.result ? _jsx(AlertRuleTestResult, { result: testing.result }) : _jsx(Typography, { color: "text.secondary", children: "Evaluating\u2026" }) }), _jsx(DialogActions, { children: _jsx(Button, { onClick: () => setTesting(null), sx: { minHeight: 44 }, children: "Close" }) })] })] }));
129
+ }
130
+ function IncidentsTab({ canWrite }) {
131
+ const [state, setState] = useState('');
132
+ const [severity, setSeverity] = useState('');
133
+ const [paging, setPaging] = useState({ page: 0, pageSize: ALERT_PAGE_SIZE_DEFAULT });
134
+ const { incidents, total, isLoading, error, refresh } = useAlertIncidents({
135
+ ...(state ? { state } : {}),
136
+ ...(severity ? { severity } : {}),
137
+ page: paging.page + 1,
138
+ pageSize: paging.pageSize,
139
+ });
140
+ const mutations = useAlertMutations();
141
+ const [openId, setOpenId] = useState(null);
142
+ const acknowledge = useCallback(async (incident) => {
143
+ const updated = await mutations.acknowledge(incident.id);
144
+ if (updated)
145
+ await refresh();
146
+ return updated;
147
+ }, [mutations, refresh]);
148
+ const columns = useMemo(() => [
149
+ {
150
+ id: 'state',
151
+ label: 'State',
152
+ priority: 'primary',
153
+ value: (row) => ALERT_STATE_LABELS[row.state],
154
+ render: (row) => _jsx(StateChip, { state: row.state }),
155
+ },
156
+ {
157
+ id: 'rule',
158
+ label: 'Rule',
159
+ priority: 'primary',
160
+ value: (row) => row.ruleName,
161
+ render: (row) => (_jsx(Link, { component: "button", type: "button", variant: "body2", onClick: () => setOpenId(row.id), sx: { textAlign: 'left', fontWeight: 600 }, children: row.ruleName })),
162
+ },
163
+ {
164
+ id: 'severity',
165
+ label: 'Severity',
166
+ priority: 'secondary',
167
+ value: (row) => ALERT_SEVERITY_LABELS[row.severity],
168
+ render: (row) => _jsx(SeverityChip, { severity: row.severity }),
169
+ },
170
+ { id: 'summary', label: 'Summary', priority: 'secondary', value: (row) => row.summary },
171
+ { id: 'labels', label: 'Labels', priority: 'detail', value: (row) => formatAlertLabels(row.labels) || '—' },
172
+ { id: 'firedAt', label: 'Fired', priority: 'detail', value: (row) => when(row.firedAt ?? row.pendingSince) },
173
+ {
174
+ id: 'acknowledged',
175
+ label: 'Acknowledged',
176
+ priority: 'detail',
177
+ value: (row) => (row.acknowledgedAt ? when(row.acknowledgedAt) : 'No'),
178
+ },
179
+ ], []);
180
+ const rowActions = useMemo(() => {
181
+ const actions = [
182
+ { id: 'view', label: 'View incident', icon: _jsx(VisibilityOutlinedIcon, {}), onClick: (row) => setOpenId(row.id) },
183
+ ];
184
+ if (canWrite) {
185
+ actions.push({
186
+ id: 'acknowledge',
187
+ label: 'Acknowledge',
188
+ icon: _jsx(DoneIcon, {}),
189
+ onClick: (row) => void acknowledge(row),
190
+ disabled: (row) => row.acknowledgedAt !== null || row.state === 'resolved',
191
+ });
192
+ }
193
+ return actions;
194
+ }, [acknowledge, canWrite]);
195
+ return (_jsxs(Stack, { spacing: 2, children: [error ? _jsx(Alert, { severity: "error", children: error }) : null, mutations.error ? (_jsx(Alert, { severity: "error", onClose: mutations.reset, children: mutations.error })) : null, _jsxs(Stack, { direction: { xs: 'column', sm: 'row' }, spacing: 2, children: [_jsxs(TextField, { select: true, label: "State", value: state, onChange: (event) => {
196
+ setState(event.target.value);
197
+ setPaging((current) => ({ ...current, page: 0 }));
198
+ }, sx: { minWidth: 180 }, children: [_jsx(MenuItem, { value: "", children: "Any state" }), ALERT_INCIDENT_STATES.map((value) => (_jsx(MenuItem, { value: value, children: ALERT_STATE_LABELS[value] }, value)))] }), _jsxs(TextField, { select: true, label: "Severity", value: severity, onChange: (event) => {
199
+ setSeverity(event.target.value);
200
+ setPaging((current) => ({ ...current, page: 0 }));
201
+ }, sx: { minWidth: 180 }, children: [_jsx(MenuItem, { value: "", children: "Any severity" }), ALERT_SEVERITIES.map((value) => (_jsx(MenuItem, { value: value, children: ALERT_SEVERITY_LABELS[value] }, value)))] })] }), _jsx(Card, { variant: "outlined", children: _jsx(CardContent, { children: _jsx(DataTable, { tableId: "alert-incidents", ariaLabel: "Alert incidents", columns: columns, rows: incidents, rowId: (row) => row.id, loading: isLoading, rowActions: rowActions, pagination: {
202
+ page: paging.page,
203
+ pageSize: paging.pageSize,
204
+ total,
205
+ onPaginationChange: (next) => setPaging(next),
206
+ }, emptyState: _jsx(Typography, { variant: "body2", color: "text.secondary", sx: { p: 2 }, children: "No incidents match." }), disableExport: true }) }) }), _jsx(AlertIncidentDrawer, { incidentId: openId, canWrite: canWrite, onAcknowledge: acknowledge, acknowledging: mutations.pending, onClose: () => setOpenId(null) })] }));
207
+ }
208
+ /**
209
+ * The Alerts page: the Rules and Incidents tabs.
210
+ *
211
+ * @param props - see {@link AlertsPageProps}.
212
+ * @returns the page.
213
+ *
214
+ * @example
215
+ * ```tsx
216
+ * <Route path="/admin/settings/alerts" element={<AlertsPage />} />
217
+ * ```
218
+ *
219
+ * @extensionPoint component
220
+ * @stability experimental
221
+ */
222
+ export function AlertsPage({ slots, channels } = {}) {
223
+ useDisplayTimeZone();
224
+ const viewer = usePlatformViewer();
225
+ const canWrite = viewer.hasPermission(ALERT_PERMISSIONS.WRITE);
226
+ const [params, setParams] = useSearchParams();
227
+ const tab = params.get('tab') === 'incidents' ? 'incidents' : 'rules';
228
+ const setTab = (next) => {
229
+ const updated = new URLSearchParams(params);
230
+ if (next === 'rules')
231
+ updated.delete('tab');
232
+ else
233
+ updated.set('tab', next);
234
+ setParams(updated, { replace: true });
235
+ };
236
+ return (_jsx(Container, { maxWidth: "lg", children: _jsx(Box, { sx: { py: { xs: 2, sm: 4 } }, children: _jsxs(PageSlotsFrame, { slots: slots, headerProps: { title: ALERTS_PAGE_COPY.title, description: ALERTS_PAGE_COPY.description, readOnly: !canWrite, actions: null }, header: _jsxs(_Fragment, { children: [_jsxs(Typography, { variant: "h4", component: "h1", gutterBottom: true, children: [ALERTS_PAGE_COPY.title, canWrite ? null : ' (read-only)'] }), _jsx(Typography, { color: "text.secondary", sx: { mb: 2 }, children: ALERTS_PAGE_COPY.description })] }), children: [_jsxs(Tabs, { value: tab, onChange: (_, next) => setTab(next), "aria-label": "Alerts sections", variant: "scrollable", allowScrollButtonsMobile: true, sx: { mb: 2, borderBottom: 1, borderColor: 'divider' }, children: [_jsx(Tab, { value: "rules", label: "Rules", id: "alerts-tab-rules", "aria-controls": "alerts-panel-rules", sx: { minHeight: 48 } }), _jsx(Tab, { value: "incidents", label: "Incidents", id: "alerts-tab-incidents", "aria-controls": "alerts-panel-incidents", sx: { minHeight: 48 } })] }), _jsx(Box, { role: "tabpanel", id: `alerts-panel-${tab}`, "aria-labelledby": `alerts-tab-${tab}`, children: tab === 'rules' ? _jsx(RulesTab, { canWrite: canWrite, channels: channels }) : _jsx(IncidentsTab, { canWrite: canWrite }) })] }) }) }));
237
+ }
238
+ //# sourceMappingURL=AlertsPage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AlertsPage.js","sourceRoot":"","sources":["../../../src/alerts/ui/AlertsPage.tsx"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,oEAAoE;AACpE,gFAAgF;AAChF,EAAE;AACF,6EAA6E;AAC7E,4EAA4E;AAC5E,wEAAwE;AACxE,4EAA4E;AAC5E,6EAA6E;AAC7E,+EAA+E;AAC/E,2CAA2C;AAC3C,gFAAgF;AAEhF,OAAO,OAAO,MAAM,yBAAyB,CAAC;AAC9C,OAAO,gBAAgB,MAAM,kCAAkC,CAAC;AAChE,OAAO,qBAAqB,MAAM,uCAAuC,CAAC;AAC1E,OAAO,sBAAsB,MAAM,wCAAwC,CAAC;AAC5E,OAAO,QAAQ,MAAM,0BAA0B,CAAC;AAChD,OAAO,EACL,KAAK,EACL,GAAG,EACH,MAAM,EACN,IAAI,EACJ,WAAW,EACX,IAAI,EACJ,SAAS,EACT,MAAM,EACN,aAAa,EACb,aAAa,EACb,WAAW,EACX,IAAI,EACJ,QAAQ,EACR,KAAK,EACL,MAAM,EACN,GAAG,EACH,IAAI,EACJ,SAAS,EACT,UAAU,GACX,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAqB,MAAM,OAAO,CAAC;AAC1E,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAEnD,OAAO,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,sCAAsC,CAAC;AAW3I,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAE5F,OAAO,EAAE,SAAS,EAAiD,MAAM,0BAA0B,CAAC;AACpG,OAAO,EACL,qBAAqB,EACrB,kBAAkB,EAClB,cAAc,EACd,iBAAiB,EACjB,iBAAiB,EACjB,aAAa,EACb,qBAAqB,EACrB,iBAAiB,EACjB,aAAa,GACd,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AA6B1E,SAAS,QAAQ,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAkE;IACtG,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,aAAa,EAAE,CAAC;IAC7D,MAAM,EAAE,KAAK,EAAE,GAAG,aAAa,EAAE,CAAC;IAClC,MAAM,SAAS,GAAG,iBAAiB,EAAE,CAAC;IACtC,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAA2B,IAAI,CAAC,CAAC;IACvE,MAAM,aAAa,GAAG,OAAO,KAAK,IAAI,IAAI,QAAQ,CAAC;IACnD,MAAM,OAAO,GAAG,qBAAqB,CAAC,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC,CAAC;IAClE,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAmB,IAAI,CAAC,CAAC;IACjE,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAmE,IAAI,CAAC,CAAC;IAC/G,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAE1D,MAAM,IAAI,GAAG,WAAW,CACtB,CAAC,IAAuB,EAAE,EAAE;QAC1B,SAAS,CAAC,KAAK,EAAE,CAAC;QAClB,SAAS,CAAC,IAAI,CAAC,CAAC;QAChB,UAAU,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC,EACD,CAAC,SAAS,CAAC,CACZ,CAAC;IAEF,MAAM,IAAI,GAAG,KAAK,EAAE,IAAuC,EAAE,EAAE;QAC7D,IAAI,OAAO,KAAK,IAAI;YAAE,OAAO;QAC7B,MAAM,KAAK,GAAG,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,MAAM,SAAS,CAAC,MAAM,CAAC,IAAuB,CAAC,CAAC,CAAC,CAAC,MAAM,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QAC7H,IAAI,CAAC,KAAK;YAAE,OAAO;QACnB,UAAU,CAAC,IAAI,CAAC,CAAC;QACjB,SAAS,CAAC,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,SAAS,KAAK,CAAC,IAAI,YAAY,CAAC,CAAC,CAAC,SAAS,KAAK,CAAC,IAAI,UAAU,CAAC,CAAC;QAC/F,MAAM,OAAO,EAAE,CAAC;IAClB,CAAC,CAAC;IAEF,MAAM,MAAM,GAAG,WAAW,CACxB,KAAK,EAAE,IAAe,EAAE,OAAgB,EAAE,EAAE;QAC1C,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;QACzD,IAAI,OAAO;YAAE,MAAM,OAAO,EAAE,CAAC;IAC/B,CAAC,EACD,CAAC,SAAS,EAAE,OAAO,CAAC,CACrB,CAAC;IAEF,MAAM,OAAO,GAAG,WAAW,CACzB,KAAK,EAAE,IAAe,EAAE,EAAE;QACxB,UAAU,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QACnC,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC7C,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAC/C,CAAC,EACD,CAAC,SAAS,CAAC,CACZ,CAAC;IAEF,MAAM,MAAM,GAAG,KAAK,IAAI,EAAE;QACxB,IAAI,CAAC,QAAQ;YAAE,OAAO;QACtB,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC/C,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;QAC3B,WAAW,CAAC,IAAI,CAAC,CAAC;QAClB,IAAI,CAAC,EAAE;YAAE,OAAO;QAChB,UAAU,CAAC,IAAI,CAAC,CAAC;QACjB,SAAS,CAAC,SAAS,IAAI,YAAY,CAAC,CAAC;QACrC,MAAM,OAAO,EAAE,CAAC;IAClB,CAAC,CAAC;IAEF,MAAM,OAAO,GAAG,OAAO,CACrB,GAAG,EAAE,CAAC;QACJ;YACE,EAAE,EAAE,SAAS;YACb,KAAK,EAAE,SAAS;YAChB,QAAQ,EAAE,SAAS;YACnB,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;YAC5C,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CACf,KAAC,MAAM,IACL,OAAO,EAAE,GAAG,CAAC,OAAO,EACpB,QAAQ,EAAE,CAAC,QAAQ,IAAI,SAAS,CAAC,OAAO,EACxC,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,EAC3D,SAAS,EAAE,EAAE,KAAK,EAAE,EAAE,YAAY,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,IAAI,GAAG,CAAC,IAAI,EAAE,EAAE,EAAE,GAC3F,CACH;SACF;QACD;YACE,EAAE,EAAE,MAAM;YACV,KAAK,EAAE,MAAM;YACb,QAAQ,EAAE,SAAS;YACnB,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI;YACxB,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CACf,MAAC,KAAK,IAAC,SAAS,EAAC,KAAK,EAAC,OAAO,EAAE,CAAC,EAAE,UAAU,QAAC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,aAC1F,KAAC,IAAI,IAAC,SAAS,EAAC,QAAQ,EAAC,IAAI,EAAC,QAAQ,EAAC,OAAO,EAAC,OAAO,EAAC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,YACxH,GAAG,CAAC,IAAI,GACJ,EACN,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,KAAC,IAAI,IAAC,IAAI,EAAC,OAAO,EAAC,OAAO,EAAC,UAAU,EAAC,KAAK,EAAC,UAAU,GAAG,CAAC,CAAC,CAAC,IAAI,IACzE,CACT;SACF;QACD,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE;QACrG;YACE,EAAE,EAAE,UAAU;YACd,KAAK,EAAE,UAAU;YACjB,QAAQ,EAAE,WAAW;YACrB,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,qBAAqB,CAAC,GAAG,CAAC,QAAQ,CAAC;YACnD,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,KAAC,YAAY,IAAC,QAAQ,EAAE,GAAG,CAAC,QAAQ,GAAI;SAC1D;QACD,EAAE,EAAE,EAAE,iBAAiB,EAAE,KAAK,EAAE,gBAAgB,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE;QACjH;YACE,EAAE,EAAE,WAAW;YACf,KAAK,EAAE,YAAY;YACnB,QAAQ,EAAE,QAAQ;YAClB,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,SAAS,IAAI,EAAE;YACnC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CACd,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CACd,KAAC,UAAU,IAAC,OAAO,EAAC,OAAO,EAAC,KAAK,EAAC,OAAO,YACtC,GAAG,CAAC,SAAS,GACH,CACd,CAAC,CAAC,CAAC,CACF,GAAG,CACJ;SACJ;KACF,EACD,CAAC,QAAQ,EAAE,KAAK,EAAE,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,CACnD,CAAC;IAEF,MAAM,UAAU,GAAG,OAAO,CAAkC,GAAG,EAAE;QAC/D,MAAM,OAAO,GAAoC;YAC/C,QAAQ;gBACN,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,KAAC,gBAAgB,KAAG,EAAE,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;gBAC7F,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,KAAC,sBAAsB,KAAG,EAAE,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;SACtG,CAAC;QACF,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,KAAC,qBAAqB,KAAG,EAAE,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACzH,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;IAE9B,OAAO,CACL,MAAC,KAAK,IAAC,OAAO,EAAE,CAAC,aACd,KAAK,CAAC,CAAC,CAAC,KAAC,KAAK,IAAC,QAAQ,EAAC,OAAO,YAAE,KAAK,GAAS,CAAC,CAAC,CAAC,IAAI,EACtD,SAAS,CAAC,KAAK,IAAI,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,CACrC,KAAC,KAAK,IAAC,QAAQ,EAAC,OAAO,EAAC,OAAO,EAAE,SAAS,CAAC,KAAK,YAC7C,SAAS,CAAC,KAAK,GACV,CACT,CAAC,CAAC,CAAC,IAAI,EACP,MAAM,CAAC,CAAC,CAAC,CACR,KAAC,KAAK,IAAC,QAAQ,EAAC,SAAS,EAAC,OAAO,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,YACrD,MAAM,GACD,CACT,CAAC,CAAC,CAAC,IAAI,EACP,QAAQ,CAAC,CAAC,CAAC,CACV,KAAC,GAAG,cACF,KAAC,MAAM,IAAC,OAAO,EAAC,WAAW,EAAC,SAAS,EAAE,KAAC,OAAO,KAAG,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,yBAE5F,GACL,CACP,CAAC,CAAC,CAAC,IAAI,EACR,KAAC,IAAI,IAAC,OAAO,EAAC,UAAU,YACtB,KAAC,WAAW,cACV,KAAC,SAAS,IACR,OAAO,EAAC,aAAa,EACrB,SAAS,EAAC,aAAa,EACvB,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,KAAK,EACX,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,EACtB,OAAO,EAAE,SAAS,EAClB,UAAU,EAAE,UAAU,EACtB,UAAU,EACR,MAAC,UAAU,IAAC,OAAO,EAAC,OAAO,EAAC,KAAK,EAAC,gBAAgB,EAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,oCACzC,QAAQ,CAAC,CAAC,CAAC,yDAAyD,CAAC,CAAC,CAAC,EAAE,IAClF,EAEf,aAAa,SACb,GACU,GACT,EAEP,KAAC,eAAe,IACd,IAAI,EAAE,OAAO,KAAK,IAAI,EACtB,IAAI,EAAE,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,EACxC,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,OAAO,CAAC,OAAO,EACxB,YAAY,EAAE,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAC9C,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAClC,QAAQ,EAAE,CAAC,QAAQ,EACnB,MAAM,EAAE,SAAS,CAAC,OAAO,EACzB,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAChD,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,KAC/B,CAAC,QAAQ,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK;oBACpD,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE;oBAC9C,CAAC,CAAC,EAAE,CAAC,KACH,CAAC,QAAQ,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,IAAI,CAAC,OAAO,CAAC,OAAO;oBACxE,CAAC,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE;oBAC1C,CAAC,CAAC,EAAE,CAAC,EACP,OAAO,EAAE,GAAG,EAAE;oBACZ,UAAU,CAAC,IAAI,CAAC,CAAC;oBACjB,SAAS,CAAC,KAAK,EAAE,CAAC;gBACpB,CAAC,GACD,EACF,MAAC,aAAa,IACZ,IAAI,EAAE,QAAQ,KAAK,IAAI,EACvB,KAAK,EAAC,mBAAmB,EACzB,YAAY,EAAC,aAAa,EAC1B,WAAW,QACX,IAAI,EAAE,SAAS,CAAC,OAAO,EACvB,SAAS,EAAE,GAAG,EAAE,CAAC,KAAK,MAAM,EAAE,EAC9B,OAAO,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,aAE/B,QAAQ,CAAC,CAAC,CAAC,2BAAS,QAAQ,CAAC,IAAI,GAAU,CAAC,CAAC,CAAC,UAAU,iGAE3C,EAChB,MAAC,MAAM,IAAC,IAAI,EAAE,OAAO,KAAK,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAC,IAAI,EAAC,SAAS,2BAAiB,kBAAkB,aACzH,MAAC,WAAW,IAAC,EAAE,EAAC,kBAAkB,uBAAQ,OAAO,EAAE,IAAI,CAAC,IAAI,IAAe,EAC3E,KAAC,aAAa,IAAC,QAAQ,kBACpB,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,KAAC,mBAAmB,IAAC,MAAM,EAAE,OAAO,CAAC,MAAM,GAAI,CAAC,CAAC,CAAC,KAAC,UAAU,IAAC,KAAK,EAAC,gBAAgB,iCAAyB,GAClH,EAChB,KAAC,aAAa,cACZ,KAAC,MAAM,IAAC,OAAO,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,sBAErD,GACK,IACT,IACH,CACT,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,EAAE,QAAQ,EAAyB;IACvD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAA0B,EAAE,CAAC,CAAC;IAChE,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAqB,EAAE,CAAC,CAAC;IACjE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,uBAAuB,EAAE,CAAC,CAAC;IACrF,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,iBAAiB,CAAC;QACxE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3B,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACjC,IAAI,EAAE,MAAM,CAAC,IAAI,GAAG,CAAC;QACrB,QAAQ,EAAE,MAAM,CAAC,QAAQ;KAC1B,CAAC,CAAC;IACH,MAAM,SAAS,GAAG,iBAAiB,EAAE,CAAC;IACtC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAE1D,MAAM,WAAW,GAAG,WAAW,CAC7B,KAAK,EAAE,QAAuB,EAAE,EAAE;QAChC,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QACzD,IAAI,OAAO;YAAE,MAAM,OAAO,EAAE,CAAC;QAC7B,OAAO,OAAO,CAAC;IACjB,CAAC,EACD,CAAC,SAAS,EAAE,OAAO,CAAC,CACrB,CAAC;IAEF,MAAM,OAAO,GAAG,OAAO,CACrB,GAAG,EAAE,CAAC;QACJ;YACE,EAAE,EAAE,OAAO;YACX,KAAK,EAAE,OAAO;YACd,QAAQ,EAAE,SAAS;YACnB,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC;YAC7C,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,KAAC,SAAS,IAAC,KAAK,EAAE,GAAG,CAAC,KAAK,GAAI;SACjD;QACD;YACE,EAAE,EAAE,MAAM;YACV,KAAK,EAAE,MAAM;YACb,QAAQ,EAAE,SAAS;YACnB,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ;YAC5B,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CACf,KAAC,IAAI,IAAC,SAAS,EAAC,QAAQ,EAAC,IAAI,EAAC,QAAQ,EAAC,OAAO,EAAC,OAAO,EAAC,OAAO,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,YAChI,GAAG,CAAC,QAAQ,GACR,CACR;SACF;QACD;YACE,EAAE,EAAE,UAAU;YACd,KAAK,EAAE,UAAU;YACjB,QAAQ,EAAE,WAAW;YACrB,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,qBAAqB,CAAC,GAAG,CAAC,QAAQ,CAAC;YACnD,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,KAAC,YAAY,IAAC,QAAQ,EAAE,GAAG,CAAC,QAAQ,GAAI;SAC1D;QACD,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE;QACvF,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,iBAAiB,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,GAAG,EAAE;QAC3G,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,YAAY,CAAC,EAAE;QAC5G;YACE,EAAE,EAAE,cAAc;YAClB,KAAK,EAAE,cAAc;YACrB,QAAQ,EAAE,QAAQ;YAClB,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;SACvE;KACF,EACD,EAAE,CACH,CAAC;IAEF,MAAM,UAAU,GAAG,OAAO,CAAsC,GAAG,EAAE;QACnE,MAAM,OAAO,GAAwC;YACnD,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,EAAE,IAAI,EAAE,KAAC,sBAAsB,KAAG,EAAE,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;SAC9G,CAAC;QACF,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC;gBACX,EAAE,EAAE,aAAa;gBACjB,KAAK,EAAE,aAAa;gBACpB,IAAI,EAAE,KAAC,QAAQ,KAAG;gBAClB,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,WAAW,CAAC,GAAG,CAAC;gBACvC,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,cAAc,KAAK,IAAI,IAAI,GAAG,CAAC,KAAK,KAAK,UAAU;aAC3E,CAAC,CAAC;QACL,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC,EAAE,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC;IAE5B,OAAO,CACL,MAAC,KAAK,IAAC,OAAO,EAAE,CAAC,aACd,KAAK,CAAC,CAAC,CAAC,KAAC,KAAK,IAAC,QAAQ,EAAC,OAAO,YAAE,KAAK,GAAS,CAAC,CAAC,CAAC,IAAI,EACtD,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CACjB,KAAC,KAAK,IAAC,QAAQ,EAAC,OAAO,EAAC,OAAO,EAAE,SAAS,CAAC,KAAK,YAC7C,SAAS,CAAC,KAAK,GACV,CACT,CAAC,CAAC,CAAC,IAAI,EACR,MAAC,KAAK,IAAC,SAAS,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,CAAC,aACvD,MAAC,SAAS,IACR,MAAM,QACN,KAAK,EAAC,OAAO,EACb,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE;4BAClB,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,KAAgC,CAAC,CAAC;4BACxD,SAAS,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;wBACpD,CAAC,EACD,EAAE,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,aAErB,KAAC,QAAQ,IAAC,KAAK,EAAC,EAAE,0BAAqB,EACtC,qBAAqB,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CACpC,KAAC,QAAQ,IAAa,KAAK,EAAE,KAAK,YAC/B,kBAAkB,CAAC,KAAK,CAAC,IADb,KAAK,CAET,CACZ,CAAC,IACQ,EACZ,MAAC,SAAS,IACR,MAAM,QACN,KAAK,EAAC,UAAU,EAChB,KAAK,EAAE,QAAQ,EACf,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE;4BAClB,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,KAA2B,CAAC,CAAC;4BACtD,SAAS,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;wBACpD,CAAC,EACD,EAAE,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,aAErB,KAAC,QAAQ,IAAC,KAAK,EAAC,EAAE,6BAAwB,EACzC,gBAAgB,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAC/B,KAAC,QAAQ,IAAa,KAAK,EAAE,KAAK,YAC/B,qBAAqB,CAAC,KAAK,CAAC,IADhB,KAAK,CAET,CACZ,CAAC,IACQ,IACN,EACR,KAAC,IAAI,IAAC,OAAO,EAAC,UAAU,YACtB,KAAC,WAAW,cACV,KAAC,SAAS,IACR,OAAO,EAAC,iBAAiB,EACzB,SAAS,EAAC,iBAAiB,EAC3B,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,SAAS,EACf,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,EACtB,OAAO,EAAE,SAAS,EAClB,UAAU,EAAE,UAAU,EACtB,UAAU,EAAE;4BACV,IAAI,EAAE,MAAM,CAAC,IAAI;4BACjB,QAAQ,EAAE,MAAM,CAAC,QAAQ;4BACzB,KAAK;4BACL,kBAAkB,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC;yBAC9C,EACD,UAAU,EACR,KAAC,UAAU,IAAC,OAAO,EAAC,OAAO,EAAC,KAAK,EAAC,gBAAgB,EAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,oCAElD,EAEf,aAAa,SACb,GACU,GACT,EACP,KAAC,mBAAmB,IAClB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,QAAQ,EAClB,aAAa,EAAE,WAAW,EAC1B,aAAa,EAAE,SAAS,CAAC,OAAO,EAChC,OAAO,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,GAC9B,IACI,CACT,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,UAAU,CAAC,EAAE,KAAK,EAAE,QAAQ,KAAsB,EAAE;IAClE,kBAAkB,EAAE,CAAC;IACrB,MAAM,MAAM,GAAG,iBAAiB,EAAE,CAAC;IACnC,MAAM,QAAQ,GAAG,MAAM,CAAC,aAAa,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAC/D,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,eAAe,EAAE,CAAC;IAC9C,MAAM,GAAG,GAAc,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC;IACjF,MAAM,MAAM,GAAG,CAAC,IAAe,EAAE,EAAE;QACjC,MAAM,OAAO,GAAG,IAAI,eAAe,CAAC,MAAM,CAAC,CAAC;QAC5C,IAAI,IAAI,KAAK,OAAO;YAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;;YACvC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAC9B,SAAS,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IACxC,CAAC,CAAC;IAEF,OAAO,CACL,KAAC,SAAS,IAAC,QAAQ,EAAC,IAAI,YACtB,KAAC,GAAG,IAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,YAC/B,MAAC,cAAc,IACb,KAAK,EAAE,KAAK,EACZ,WAAW,EAAE,EAAE,KAAK,EAAE,gBAAgB,CAAC,KAAK,EAAE,WAAW,EAAE,gBAAgB,CAAC,WAAW,EAAE,QAAQ,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,EAC7H,MAAM,EACJ,8BACE,MAAC,UAAU,IAAC,OAAO,EAAC,IAAI,EAAC,SAAS,EAAC,IAAI,EAAC,YAAY,mBACjD,gBAAgB,CAAC,KAAK,EACtB,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc,IACtB,EACb,KAAC,UAAU,IAAC,KAAK,EAAC,gBAAgB,EAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,YAC7C,gBAAgB,CAAC,WAAW,GAClB,IACZ,aAGL,MAAC,IAAI,IACH,KAAK,EAAE,GAAG,EACV,QAAQ,EAAE,CAAC,CAAC,EAAE,IAAe,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,gBACnC,iBAAiB,EAC5B,OAAO,EAAC,YAAY,EACpB,wBAAwB,QACxB,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,WAAW,EAAE,SAAS,EAAE,aAEtD,KAAC,GAAG,IAAC,KAAK,EAAC,OAAO,EAAC,KAAK,EAAC,OAAO,EAAC,EAAE,EAAC,kBAAkB,mBAAe,oBAAoB,EAAC,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,GAAI,EACnH,KAAC,GAAG,IAAC,KAAK,EAAC,WAAW,EAAC,KAAK,EAAC,WAAW,EAAC,EAAE,EAAC,sBAAsB,mBAAe,wBAAwB,EAAC,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,GAAI,IAC9H,EACP,KAAC,GAAG,IAAC,IAAI,EAAC,UAAU,EAAC,EAAE,EAAE,gBAAgB,GAAG,EAAE,qBAAmB,cAAc,GAAG,EAAE,YACjF,GAAG,KAAK,OAAO,CAAC,CAAC,CAAC,KAAC,QAAQ,IAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,GAAI,CAAC,CAAC,CAAC,KAAC,YAAY,IAAC,QAAQ,EAAE,QAAQ,GAAI,GAC1G,IACS,GACb,GACI,CACb,CAAC;AACJ,CAAC"}