flow-debugger 1.9.8 → 1.9.9

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 (71) hide show
  1. package/ENHANCED_OBSERVABILITY.md +835 -0
  2. package/IMPLEMENTATION_SUMMARY.md +466 -0
  3. package/README.md +147 -8
  4. package/dist/cjs/core/Alerting.js +310 -0
  5. package/dist/cjs/core/Alerting.js.map +1 -0
  6. package/dist/cjs/core/AnomalyDetection.js +223 -0
  7. package/dist/cjs/core/AnomalyDetection.js.map +1 -0
  8. package/dist/cjs/core/DependencyGraph.js +251 -0
  9. package/dist/cjs/core/DependencyGraph.js.map +1 -0
  10. package/dist/cjs/core/DistributedTracing.js +245 -0
  11. package/dist/cjs/core/DistributedTracing.js.map +1 -0
  12. package/dist/cjs/core/ErrorClustering.js +257 -0
  13. package/dist/cjs/core/ErrorClustering.js.map +1 -0
  14. package/dist/cjs/core/LogCorrelation.js +242 -0
  15. package/dist/cjs/core/LogCorrelation.js.map +1 -0
  16. package/dist/cjs/core/Metrics.js +301 -0
  17. package/dist/cjs/core/Metrics.js.map +1 -0
  18. package/dist/cjs/core/TrendAnalysis.js +254 -0
  19. package/dist/cjs/core/TrendAnalysis.js.map +1 -0
  20. package/dist/cjs/core/types.js +14 -0
  21. package/dist/cjs/core/types.js.map +1 -1
  22. package/dist/cjs/index.js +27 -1
  23. package/dist/cjs/index.js.map +1 -1
  24. package/dist/cjs/middleware/express.js +105 -4
  25. package/dist/cjs/middleware/express.js.map +1 -1
  26. package/dist/esm/core/Alerting.js +305 -0
  27. package/dist/esm/core/Alerting.js.map +1 -0
  28. package/dist/esm/core/AnomalyDetection.js +218 -0
  29. package/dist/esm/core/AnomalyDetection.js.map +1 -0
  30. package/dist/esm/core/DependencyGraph.js +246 -0
  31. package/dist/esm/core/DependencyGraph.js.map +1 -0
  32. package/dist/esm/core/DistributedTracing.js +240 -0
  33. package/dist/esm/core/DistributedTracing.js.map +1 -0
  34. package/dist/esm/core/ErrorClustering.js +252 -0
  35. package/dist/esm/core/ErrorClustering.js.map +1 -0
  36. package/dist/esm/core/LogCorrelation.js +236 -0
  37. package/dist/esm/core/LogCorrelation.js.map +1 -0
  38. package/dist/esm/core/Metrics.js +297 -0
  39. package/dist/esm/core/Metrics.js.map +1 -0
  40. package/dist/esm/core/TrendAnalysis.js +250 -0
  41. package/dist/esm/core/TrendAnalysis.js.map +1 -0
  42. package/dist/esm/core/types.js +14 -0
  43. package/dist/esm/core/types.js.map +1 -1
  44. package/dist/esm/index.js +10 -0
  45. package/dist/esm/index.js.map +1 -1
  46. package/dist/esm/middleware/express.js +105 -4
  47. package/dist/esm/middleware/express.js.map +1 -1
  48. package/dist/types/core/Alerting.d.ts +82 -0
  49. package/dist/types/core/Alerting.d.ts.map +1 -0
  50. package/dist/types/core/AnomalyDetection.d.ts +93 -0
  51. package/dist/types/core/AnomalyDetection.d.ts.map +1 -0
  52. package/dist/types/core/DependencyGraph.d.ts +65 -0
  53. package/dist/types/core/DependencyGraph.d.ts.map +1 -0
  54. package/dist/types/core/DistributedTracing.d.ts +92 -0
  55. package/dist/types/core/DistributedTracing.d.ts.map +1 -0
  56. package/dist/types/core/ErrorClustering.d.ts +70 -0
  57. package/dist/types/core/ErrorClustering.d.ts.map +1 -0
  58. package/dist/types/core/LogCorrelation.d.ts +73 -0
  59. package/dist/types/core/LogCorrelation.d.ts.map +1 -0
  60. package/dist/types/core/Metrics.d.ts +73 -0
  61. package/dist/types/core/Metrics.d.ts.map +1 -0
  62. package/dist/types/core/TrendAnalysis.d.ts +63 -0
  63. package/dist/types/core/TrendAnalysis.d.ts.map +1 -0
  64. package/dist/types/core/types.d.ts +200 -0
  65. package/dist/types/core/types.d.ts.map +1 -1
  66. package/dist/types/index.d.ts +9 -1
  67. package/dist/types/index.d.ts.map +1 -1
  68. package/dist/types/middleware/express.d.ts +12 -0
  69. package/dist/types/middleware/express.d.ts.map +1 -1
  70. package/package.json +1 -1
  71. package/test-results.json +1 -0
@@ -0,0 +1,310 @@
1
+ "use strict";
2
+ // ─────────────────────────────────────────────────────────────
3
+ // flow-debugger — Real-time Alerting System
4
+ // Webhooks, Slack, and intelligent alert delivery
5
+ // ─────────────────────────────────────────────────────────────
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.AlertManager = void 0;
8
+ exports.formatSlackMessage = formatSlackMessage;
9
+ const events_1 = require("events");
10
+ /**
11
+ * Alert Manager - Handles alert creation, deduplication, and delivery
12
+ */
13
+ class AlertManager extends events_1.EventEmitter {
14
+ constructor(webhooks = [], alertOnCritical = true, alertOnErrorSpike = true, errorSpikeThreshold = 5) {
15
+ super();
16
+ this.alerts = [];
17
+ this.rules = new Map();
18
+ this.webhooks = [];
19
+ this.maxAlerts = 1000;
20
+ this.dedupWindowMs = 5 * 60 * 1000; // 5 minutes
21
+ this.errorCounts = [];
22
+ this.webhooks = webhooks;
23
+ this.alertOnCritical = alertOnCritical;
24
+ this.alertOnErrorSpike = alertOnErrorSpike;
25
+ this.errorSpikeThreshold = errorSpikeThreshold;
26
+ this.setupDefaultRules();
27
+ }
28
+ /**
29
+ * Setup default alert rules
30
+ */
31
+ setupDefaultRules() {
32
+ this.addRule({
33
+ id: 'critical_error',
34
+ name: 'Critical Error Detected',
35
+ type: 'critical_error',
36
+ condition: 'classification == CRITICAL',
37
+ threshold: 1,
38
+ windowMs: 0,
39
+ severity: 'critical',
40
+ enabled: this.alertOnCritical,
41
+ });
42
+ this.addRule({
43
+ id: 'error_spike',
44
+ name: 'Error Spike Detected',
45
+ type: 'error_spike',
46
+ condition: 'error_count > threshold',
47
+ threshold: this.errorSpikeThreshold,
48
+ windowMs: 5 * 60 * 1000,
49
+ severity: 'error',
50
+ enabled: this.alertOnErrorSpike,
51
+ });
52
+ }
53
+ /**
54
+ * Add alert rule
55
+ */
56
+ addRule(rule) {
57
+ this.rules.set(rule.id, rule);
58
+ }
59
+ /**
60
+ * Remove alert rule
61
+ */
62
+ removeRule(ruleId) {
63
+ this.rules.delete(ruleId);
64
+ }
65
+ /**
66
+ * Enable/disable rule
67
+ */
68
+ toggleRule(ruleId, enabled) {
69
+ const rule = this.rules.get(ruleId);
70
+ if (rule) {
71
+ rule.enabled = enabled;
72
+ }
73
+ }
74
+ /**
75
+ * Add webhook endpoint
76
+ */
77
+ addWebhook(url) {
78
+ if (!this.webhooks.includes(url)) {
79
+ this.webhooks.push(url);
80
+ }
81
+ }
82
+ /**
83
+ * Remove webhook endpoint
84
+ */
85
+ removeWebhook(url) {
86
+ this.webhooks = this.webhooks.filter(w => w !== url);
87
+ }
88
+ /**
89
+ * Process trace and check for alerts
90
+ */
91
+ processTrace(trace) {
92
+ // Track error counts for spike detection
93
+ if (trace.classification === 'ERROR' || trace.classification === 'CRITICAL') {
94
+ this.recordError();
95
+ }
96
+ // Check critical error alert
97
+ if (this.alertOnCritical && trace.classification === 'CRITICAL') {
98
+ this.createAlert({
99
+ type: 'critical_error',
100
+ severity: 'critical',
101
+ title: 'Critical Error Detected',
102
+ message: `Critical error on ${trace.method} ${trace.endpoint}${trace.rootCause ? `: ${trace.rootCause.cause}` : ''}`,
103
+ traceId: trace.traceId,
104
+ endpoint: trace.endpoint,
105
+ metadata: {
106
+ classification: trace.classification,
107
+ rootCause: trace.rootCause,
108
+ duration: trace.totalDuration,
109
+ },
110
+ });
111
+ }
112
+ // Check error spike
113
+ if (this.alertOnErrorSpike) {
114
+ this.checkErrorSpike();
115
+ }
116
+ // Check custom rules
117
+ this.checkCustomRules(trace);
118
+ }
119
+ /**
120
+ * Create and deliver an alert
121
+ */
122
+ createAlert(alert) {
123
+ // Deduplication check
124
+ if (this.isDuplicate(alert)) {
125
+ return null;
126
+ }
127
+ const fullAlert = {
128
+ id: this.generateAlertId(),
129
+ timestamp: new Date(),
130
+ delivered: false,
131
+ ...alert,
132
+ };
133
+ this.alerts.unshift(fullAlert);
134
+ // Trim old alerts
135
+ if (this.alerts.length > this.maxAlerts) {
136
+ this.alerts = this.alerts.slice(0, this.maxAlerts);
137
+ }
138
+ // Emit event
139
+ this.emit('alert', fullAlert);
140
+ // Deliver to webhooks
141
+ this.deliverAlert(fullAlert);
142
+ return fullAlert;
143
+ }
144
+ /**
145
+ * Get recent alerts
146
+ */
147
+ getAlerts(limit = 50) {
148
+ return this.alerts.slice(0, limit);
149
+ }
150
+ /**
151
+ * Get alerts by type
152
+ */
153
+ getAlertsByType(type) {
154
+ return this.alerts.filter(a => a.type === type);
155
+ }
156
+ /**
157
+ * Get alerts by severity
158
+ */
159
+ getAlertsBySeverity(severity) {
160
+ return this.alerts.filter(a => a.severity === severity);
161
+ }
162
+ /**
163
+ * Clear all alerts
164
+ */
165
+ clear() {
166
+ this.alerts = [];
167
+ }
168
+ /**
169
+ * Get all rules
170
+ */
171
+ getRules() {
172
+ return Array.from(this.rules.values());
173
+ }
174
+ recordError() {
175
+ const now = Date.now();
176
+ const windowStart = now - 5 * 60 * 1000;
177
+ // Remove old entries
178
+ this.errorCounts = this.errorCounts.filter(e => e.timestamp > windowStart);
179
+ // Add current error
180
+ const lastEntry = this.errorCounts[this.errorCounts.length - 1];
181
+ if (lastEntry && lastEntry.timestamp > now - 60 * 1000) {
182
+ lastEntry.count++;
183
+ }
184
+ else {
185
+ this.errorCounts.push({ timestamp: now, count: 1 });
186
+ }
187
+ }
188
+ checkErrorSpike() {
189
+ const now = Date.now();
190
+ const windowStart = now - 5 * 60 * 1000;
191
+ const recentErrors = this.errorCounts
192
+ .filter(e => e.timestamp > windowStart)
193
+ .reduce((sum, e) => sum + e.count, 0);
194
+ if (recentErrors >= this.errorSpikeThreshold) {
195
+ this.createAlert({
196
+ type: 'error_spike',
197
+ severity: 'error',
198
+ title: 'Error Spike Detected',
199
+ message: `${recentErrors} errors detected in the last 5 minutes (threshold: ${this.errorSpikeThreshold})`,
200
+ metadata: {
201
+ errorCount: recentErrors,
202
+ threshold: this.errorSpikeThreshold,
203
+ windowMs: 5 * 60 * 1000,
204
+ },
205
+ });
206
+ }
207
+ }
208
+ checkCustomRules(trace) {
209
+ this.rules.forEach(rule => {
210
+ if (!rule.enabled)
211
+ return;
212
+ // Evaluate rule condition (simplified evaluation)
213
+ if (this.evaluateRule(rule, trace)) {
214
+ this.createAlert({
215
+ type: rule.type,
216
+ severity: rule.severity,
217
+ title: rule.name,
218
+ message: `Rule "${rule.name}" triggered on ${trace.method} ${trace.endpoint}`,
219
+ traceId: trace.traceId,
220
+ endpoint: trace.endpoint,
221
+ metadata: {
222
+ ruleId: rule.id,
223
+ condition: rule.condition,
224
+ },
225
+ });
226
+ }
227
+ });
228
+ }
229
+ evaluateRule(rule, trace) {
230
+ // Simplified rule evaluation
231
+ // In production, use a proper expression parser
232
+ const condition = rule.condition;
233
+ if (condition.includes('classification == CRITICAL') && trace.classification === 'CRITICAL') {
234
+ return true;
235
+ }
236
+ if (condition.includes('duration >') && trace.totalDuration > rule.threshold) {
237
+ return true;
238
+ }
239
+ return false;
240
+ }
241
+ isDuplicate(alert) {
242
+ const now = Date.now();
243
+ return this.alerts.some(a => a.type === alert.type &&
244
+ a.endpoint === alert.endpoint &&
245
+ now - a.timestamp.getTime() < this.dedupWindowMs);
246
+ }
247
+ async deliverAlert(alert) {
248
+ const deliveryPromises = this.webhooks.map(url => this.sendWebhook(url, alert));
249
+ try {
250
+ await Promise.all(deliveryPromises);
251
+ alert.delivered = true;
252
+ alert.deliveredAt = new Date();
253
+ }
254
+ catch (error) {
255
+ console.error('[AlertManager] Failed to deliver alert:', error);
256
+ }
257
+ }
258
+ async sendWebhook(url, alert) {
259
+ try {
260
+ const response = await fetch(url, {
261
+ method: 'POST',
262
+ headers: { 'Content-Type': 'application/json' },
263
+ body: JSON.stringify({
264
+ alert_type: 'flow_debugger',
265
+ ...alert,
266
+ }),
267
+ });
268
+ if (!response.ok) {
269
+ throw new Error(`Webhook responded with ${response.status}`);
270
+ }
271
+ }
272
+ catch (error) {
273
+ // Log but don't throw - don't fail the app
274
+ console.error(`[AlertManager] Webhook ${url} failed:`, error);
275
+ }
276
+ }
277
+ generateAlertId() {
278
+ return `alert_${Date.now()}_${Math.random().toString(36).substring(2, 8)}`;
279
+ }
280
+ }
281
+ exports.AlertManager = AlertManager;
282
+ /**
283
+ * Slack-specific alert formatter
284
+ */
285
+ function formatSlackMessage(alert) {
286
+ const colorMap = {
287
+ info: '#36a64f',
288
+ warning: '#ffcc00',
289
+ error: '#ff6600',
290
+ critical: '#ff0000',
291
+ };
292
+ return {
293
+ attachments: [
294
+ {
295
+ color: colorMap[alert.severity],
296
+ title: alert.title,
297
+ text: alert.message,
298
+ fields: [
299
+ { title: 'Type', value: alert.type, short: true },
300
+ { title: 'Severity', value: alert.severity, short: true },
301
+ ...(alert.endpoint ? [{ title: 'Endpoint', value: alert.endpoint, short: true }] : []),
302
+ ...(alert.traceId ? [{ title: 'Trace ID', value: alert.traceId, short: true }] : []),
303
+ ],
304
+ ts: Math.floor(alert.timestamp.getTime() / 1000),
305
+ footer: 'Flow Debugger',
306
+ },
307
+ ],
308
+ };
309
+ }
310
+ //# sourceMappingURL=Alerting.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Alerting.js","sourceRoot":"","sources":["../../../src/core/Alerting.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,223 @@
1
+ "use strict";
2
+ // ─────────────────────────────────────────────────────────────
3
+ // flow-debugger — Anomaly Detection System
4
+ // Statistical and ML-based anomaly detection for metrics
5
+ // ─────────────────────────────────────────────────────────────
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.CUSUMDetector = exports.AnomalyDetector = void 0;
8
+ /**
9
+ * Anomaly Detector - Uses statistical methods to detect anomalies
10
+ */
11
+ class AnomalyDetector {
12
+ constructor(sensitivity = 2) {
13
+ this.baseline = new Map();
14
+ this.minSamples = 30;
15
+ this.decayFactor = 0.1; // For exponential moving average
16
+ this.sensitivity = sensitivity;
17
+ }
18
+ /**
19
+ * Record a data point for a metric
20
+ */
21
+ record(metric, value, timestamp = new Date()) {
22
+ const stats = this.baseline.get(metric);
23
+ if (!stats) {
24
+ this.baseline.set(metric, {
25
+ count: 1,
26
+ mean: value,
27
+ m2: 0,
28
+ min: value,
29
+ max: value,
30
+ lastUpdated: timestamp,
31
+ values: [value],
32
+ });
33
+ }
34
+ else {
35
+ // Welford's online algorithm for variance
36
+ stats.count++;
37
+ const delta = value - stats.mean;
38
+ stats.mean += delta / stats.count;
39
+ const delta2 = value - stats.mean;
40
+ stats.m2 += delta * delta2;
41
+ stats.min = Math.min(stats.min, value);
42
+ stats.max = Math.max(stats.max, value);
43
+ stats.lastUpdated = timestamp;
44
+ // Keep recent values for percentile calculations
45
+ stats.values.push(value);
46
+ if (stats.values.length > 1000) {
47
+ stats.values.shift();
48
+ }
49
+ // Exponential moving average for recent behavior
50
+ stats.ema = stats.ema ? stats.ema * (1 - this.decayFactor) + value * this.decayFactor : value;
51
+ }
52
+ }
53
+ /**
54
+ * Check if a value is anomalous
55
+ */
56
+ detect(metric, value, timestamp = new Date()) {
57
+ const stats = this.baseline.get(metric);
58
+ if (!stats || stats.count < this.minSamples) {
59
+ // Not enough data for detection
60
+ return null;
61
+ }
62
+ const variance = stats.m2 / (stats.count - 1);
63
+ const stdDev = Math.sqrt(variance);
64
+ if (stdDev === 0) {
65
+ // No variance - any difference is anomalous
66
+ return {
67
+ isAnomaly: value !== stats.mean,
68
+ score: value !== stats.mean ? 1 : 0,
69
+ expectedValue: stats.mean,
70
+ actualValue: value,
71
+ deviation: value !== stats.mean ? Infinity : 0,
72
+ metric,
73
+ timestamp,
74
+ confidence: 50,
75
+ };
76
+ }
77
+ const deviation = Math.abs(value - stats.mean) / stdDev;
78
+ const isAnomaly = deviation > this.sensitivity;
79
+ const score = Math.min(1, deviation / (this.sensitivity * 2));
80
+ // Calculate confidence based on sample size
81
+ const confidence = Math.min(100, (stats.count / this.minSamples) * 100);
82
+ return {
83
+ isAnomaly,
84
+ score,
85
+ expectedValue: stats.mean,
86
+ actualValue: value,
87
+ deviation,
88
+ metric,
89
+ timestamp,
90
+ confidence,
91
+ };
92
+ }
93
+ /**
94
+ * Analyze a trace for anomalies
95
+ */
96
+ analyzeTrace(trace) {
97
+ const results = [];
98
+ // Check total duration
99
+ const durationResult = this.detect('request_duration', trace.totalDuration, trace.timestamp);
100
+ if (durationResult) {
101
+ results.push(durationResult);
102
+ }
103
+ // Check each step duration
104
+ trace.steps.forEach((step, index) => {
105
+ const stepMetric = `step_duration_${step.service}_${step.name.replace(/\s+/g, '_')}`;
106
+ const stepResult = this.detect(stepMetric, step.duration, trace.timestamp);
107
+ if (stepResult && stepResult.isAnomaly) {
108
+ results.push(stepResult);
109
+ }
110
+ });
111
+ return results;
112
+ }
113
+ /**
114
+ * Get baseline statistics for a metric
115
+ */
116
+ getBaseline(metric) {
117
+ return this.baseline.get(metric) || null;
118
+ }
119
+ /**
120
+ * Get all baselines
121
+ */
122
+ getAllBaselines() {
123
+ return new Map(this.baseline);
124
+ }
125
+ /**
126
+ * Reset baseline for a metric
127
+ */
128
+ reset(metric) {
129
+ this.baseline.delete(metric);
130
+ }
131
+ /**
132
+ * Clear all baselines
133
+ */
134
+ clear() {
135
+ this.baseline.clear();
136
+ }
137
+ /**
138
+ * Get percentiles for a metric
139
+ */
140
+ getPercentiles(metric) {
141
+ const stats = this.baseline.get(metric);
142
+ if (!stats || stats.values.length < 10)
143
+ return null;
144
+ const sorted = [...stats.values].sort((a, b) => a - b);
145
+ const length = sorted.length;
146
+ return {
147
+ p50: sorted[Math.floor(length * 0.5)],
148
+ p90: sorted[Math.floor(length * 0.9)],
149
+ p95: sorted[Math.floor(length * 0.95)],
150
+ p99: sorted[Math.floor(length * 0.99)],
151
+ };
152
+ }
153
+ /**
154
+ * Detect seasonal patterns (simplified)
155
+ */
156
+ detectSeasonality(metric, points, periodMs) {
157
+ if (points.length < periodMs * 2)
158
+ return false;
159
+ // Autocorrelation-based seasonality detection
160
+ const values = points.map(p => p.value);
161
+ const mean = values.reduce((a, b) => a + b, 0) / values.length;
162
+ const variance = values.reduce((sum, v) => sum + Math.pow(v - mean, 2), 0) / values.length;
163
+ if (variance === 0)
164
+ return false;
165
+ // Calculate autocorrelation at lag = period
166
+ const lag = Math.min(periodMs, values.length / 2);
167
+ let autocorr = 0;
168
+ for (let i = 0; i < values.length - lag; i++) {
169
+ autocorr += (values[i] - mean) * (values[i + lag] - mean);
170
+ }
171
+ autocorr /= (values.length - lag) * variance;
172
+ // Strong autocorrelation indicates seasonality
173
+ return Math.abs(autocorr) > 0.5;
174
+ }
175
+ }
176
+ exports.AnomalyDetector = AnomalyDetector;
177
+ /**
178
+ * CUSUM algorithm for change point detection
179
+ */
180
+ class CUSUMDetector {
181
+ constructor(threshold = 5, drift = 0.5) {
182
+ this.sum = 0;
183
+ this.target = 0;
184
+ this.changePoints = [];
185
+ this.threshold = threshold;
186
+ this.drift = drift;
187
+ }
188
+ /**
189
+ * Process a new value and detect change points
190
+ */
191
+ update(value, timestamp = new Date()) {
192
+ if (this.target === 0) {
193
+ this.target = value;
194
+ return false;
195
+ }
196
+ // Update target with moving average
197
+ this.target = this.target * 0.9 + value * 0.1;
198
+ // CUSUM calculation
199
+ this.sum = Math.max(0, this.sum + (value - this.target) - this.drift);
200
+ if (this.sum > this.threshold) {
201
+ this.changePoints.push({ timestamp, value });
202
+ this.sum = 0;
203
+ return true; // Change point detected
204
+ }
205
+ return false;
206
+ }
207
+ /**
208
+ * Get detected change points
209
+ */
210
+ getChangePoints() {
211
+ return [...this.changePoints];
212
+ }
213
+ /**
214
+ * Reset detector
215
+ */
216
+ reset() {
217
+ this.sum = 0;
218
+ this.target = 0;
219
+ this.changePoints = [];
220
+ }
221
+ }
222
+ exports.CUSUMDetector = CUSUMDetector;
223
+ //# sourceMappingURL=AnomalyDetection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AnomalyDetection.js","sourceRoot":"","sources":["../../../src/core/AnomalyDetection.ts"],"names":[],"mappings":";AAAA,gEAAgE;AAChE,2CAA2C;AAC3C,yDAAyD;AACzD,gEAAgE;;;AAIhE;;GAEG;AACH,MAAa,eAAe;IAMxB,YAAY,cAAsB,CAAC;QAL3B,aAAQ,GAA+B,IAAI,GAAG,EAAE,CAAC;QAExC,eAAU,GAAW,EAAE,CAAC;QACxB,gBAAW,GAAW,GAAG,CAAC,CAAC,iCAAiC;QAGzE,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;IACnC,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,MAAc,EAAE,KAAa,EAAE,YAAkB,IAAI,IAAI,EAAE;QAC9D,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAExC,IAAI,CAAC,KAAK,EAAE,CAAC;YACT,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE;gBACtB,KAAK,EAAE,CAAC;gBACR,IAAI,EAAE,KAAK;gBACX,EAAE,EAAE,CAAC;gBACL,GAAG,EAAE,KAAK;gBACV,GAAG,EAAE,KAAK;gBACV,WAAW,EAAE,SAAS;gBACtB,MAAM,EAAE,CAAC,KAAK,CAAC;aAClB,CAAC,CAAC;QACP,CAAC;aAAM,CAAC;YACJ,0CAA0C;YAC1C,KAAK,CAAC,KAAK,EAAE,CAAC;YACd,MAAM,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC;YACjC,KAAK,CAAC,IAAI,IAAI,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;YAClC,MAAM,MAAM,GAAG,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC;YAClC,KAAK,CAAC,EAAE,IAAI,KAAK,GAAG,MAAM,CAAC;YAE3B,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YACvC,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YACvC,KAAK,CAAC,WAAW,GAAG,SAAS,CAAC;YAE9B,iDAAiD;YACjD,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACzB,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,EAAE,CAAC;gBAC7B,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YACzB,CAAC;YAED,iDAAiD;YACjD,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC;QAClG,CAAC;IACL,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,MAAc,EAAE,KAAa,EAAE,YAAkB,IAAI,IAAI,EAAE;QAC9D,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAExC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;YAC1C,gCAAgC;YAChC,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,MAAM,QAAQ,GAAG,KAAK,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAEnC,IAAI,MAAM,KAAK,CAAC,EAAE,CAAC;YACf,4CAA4C;YAC5C,OAAO;gBACH,SAAS,EAAE,KAAK,KAAK,KAAK,CAAC,IAAI;gBAC/B,KAAK,EAAE,KAAK,KAAK,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACnC,aAAa,EAAE,KAAK,CAAC,IAAI;gBACzB,WAAW,EAAE,KAAK;gBAClB,SAAS,EAAE,KAAK,KAAK,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;gBAC9C,MAAM;gBACN,SAAS;gBACT,UAAU,EAAE,EAAE;aACjB,CAAC;QACN,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;QACxD,MAAM,SAAS,GAAG,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC;QAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,GAAG,CAAC,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC;QAE9D,4CAA4C;QAC5C,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,GAAG,CAAC,CAAC;QAExE,OAAO;YACH,SAAS;YACT,KAAK;YACL,aAAa,EAAE,KAAK,CAAC,IAAI;YACzB,WAAW,EAAE,KAAK;YAClB,SAAS;YACT,MAAM;YACN,SAAS;YACT,UAAU;SACb,CAAC;IACN,CAAC;IAED;;OAEG;IACH,YAAY,CAAC,KAAY;QACrB,MAAM,OAAO,GAAoB,EAAE,CAAC;QAEpC,uBAAuB;QACvB,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC,kBAAkB,EAAE,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;QAC7F,IAAI,cAAc,EAAE,CAAC;YACjB,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACjC,CAAC;QAED,2BAA2B;QAC3B,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;YAChC,MAAM,UAAU,GAAG,iBAAiB,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC;YACrF,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;YAC3E,IAAI,UAAU,IAAI,UAAU,CAAC,SAAS,EAAE,CAAC;gBACrC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC7B,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,OAAO,OAAO,CAAC;IACnB,CAAC;IAED;;OAEG;IACH,WAAW,CAAC,MAAc;QACtB,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC;IAC7C,CAAC;IAED;;OAEG;IACH,eAAe;QACX,OAAO,IAAI,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAClC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAc;QAChB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACjC,CAAC;IAED;;OAEG;IACH,KAAK;QACD,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,cAAc,CAAC,MAAc;QACzB,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACxC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,EAAE;YAAE,OAAO,IAAI,CAAC;QAEpD,MAAM,MAAM,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACvD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAE7B,OAAO;YACH,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC;YACrC,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC;YACrC,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;YACtC,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;SACzC,CAAC;IACN,CAAC;IAED;;OAEG;IACH,iBAAiB,CAAC,MAAc,EAAE,MAAyB,EAAE,QAAgB;QACzE,IAAI,MAAM,CAAC,MAAM,GAAG,QAAQ,GAAG,CAAC;YAAE,OAAO,KAAK,CAAC;QAE/C,8CAA8C;QAC9C,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACxC,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;QAC/D,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;QAE3F,IAAI,QAAQ,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QAEjC,4CAA4C;QAC5C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAClD,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3C,QAAQ,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;QAC9D,CAAC;QACD,QAAQ,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,GAAG,QAAQ,CAAC;QAE7C,+CAA+C;QAC/C,OAAO,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,GAAG,CAAC;IACpC,CAAC;CACJ;AA9LD,0CA8LC;AAgBD;;GAEG;AACH,MAAa,aAAa;IAOtB,YAAY,YAAoB,CAAC,EAAE,QAAgB,GAAG;QAN9C,QAAG,GAAW,CAAC,CAAC;QAChB,WAAM,GAAW,CAAC,CAAC;QAGnB,iBAAY,GAAyC,EAAE,CAAC;QAG5D,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACvB,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,KAAa,EAAE,YAAkB,IAAI,IAAI,EAAE;QAC9C,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACpB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;YACpB,OAAO,KAAK,CAAC;QACjB,CAAC;QAED,oCAAoC;QACpC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,GAAG,GAAG,GAAG,KAAK,GAAG,GAAG,CAAC;QAE9C,oBAAoB;QACpB,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;QAEtE,IAAI,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;YAC5B,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;YAC7C,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC;YACb,OAAO,IAAI,CAAC,CAAC,wBAAwB;QACzC,CAAC;QAED,OAAO,KAAK,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,eAAe;QACX,OAAO,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC;IAClC,CAAC;IAED;;OAEG;IACH,KAAK;QACD,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC;QACb,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;QAChB,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;IAC3B,CAAC;CACJ;AAnDD,sCAmDC"}