@sun-asterisk/sungen 2.6.1 → 2.6.3

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 (62) hide show
  1. package/dist/cli/commands/dashboard.d.ts +10 -0
  2. package/dist/cli/commands/dashboard.d.ts.map +1 -0
  3. package/dist/cli/commands/dashboard.js +171 -0
  4. package/dist/cli/commands/dashboard.js.map +1 -0
  5. package/dist/cli/index.js +4 -2
  6. package/dist/cli/index.js.map +1 -1
  7. package/dist/dashboard/history-store.d.ts +27 -0
  8. package/dist/dashboard/history-store.d.ts.map +1 -0
  9. package/dist/dashboard/history-store.js +112 -0
  10. package/dist/dashboard/history-store.js.map +1 -0
  11. package/dist/dashboard/html-renderer.d.ts +30 -0
  12. package/dist/dashboard/html-renderer.d.ts.map +1 -0
  13. package/dist/dashboard/html-renderer.js +111 -0
  14. package/dist/dashboard/html-renderer.js.map +1 -0
  15. package/dist/dashboard/snapshot-builder.d.ts +30 -0
  16. package/dist/dashboard/snapshot-builder.d.ts.map +1 -0
  17. package/dist/dashboard/snapshot-builder.js +263 -0
  18. package/dist/dashboard/snapshot-builder.js.map +1 -0
  19. package/dist/dashboard/templates/index.html +287 -0
  20. package/dist/dashboard/types.d.ts +122 -0
  21. package/dist/dashboard/types.d.ts.map +1 -0
  22. package/dist/dashboard/types.js +11 -0
  23. package/dist/dashboard/types.js.map +1 -0
  24. package/dist/exporters/json-exporter.d.ts +25 -0
  25. package/dist/exporters/json-exporter.d.ts.map +1 -0
  26. package/dist/exporters/json-exporter.js +135 -0
  27. package/dist/exporters/json-exporter.js.map +1 -0
  28. package/dist/exporters/playwright-report-parser.d.ts +2 -1
  29. package/dist/exporters/playwright-report-parser.d.ts.map +1 -1
  30. package/dist/exporters/playwright-report-parser.js +12 -5
  31. package/dist/exporters/playwright-report-parser.js.map +1 -1
  32. package/dist/exporters/spec-parser.d.ts.map +1 -1
  33. package/dist/exporters/spec-parser.js +8 -3
  34. package/dist/exporters/spec-parser.js.map +1 -1
  35. package/dist/orchestrator/ai-rules-updater.d.ts.map +1 -1
  36. package/dist/orchestrator/ai-rules-updater.js +4 -0
  37. package/dist/orchestrator/ai-rules-updater.js.map +1 -1
  38. package/dist/orchestrator/templates/ai-instructions/claude-cmd-dashboard.md +62 -0
  39. package/dist/orchestrator/templates/ai-instructions/claude-skill-dashboard.md +121 -0
  40. package/dist/orchestrator/templates/ai-instructions/copilot-cmd-dashboard.md +62 -0
  41. package/dist/orchestrator/templates/ai-instructions/github-skill-sungen-dashboard.md +121 -0
  42. package/dist/orchestrator/templates/playwright.config.d.ts.map +1 -1
  43. package/dist/orchestrator/templates/playwright.config.js +17 -1
  44. package/dist/orchestrator/templates/playwright.config.js.map +1 -1
  45. package/dist/orchestrator/templates/playwright.config.ts +20 -1
  46. package/package.json +4 -3
  47. package/src/cli/commands/dashboard.ts +158 -0
  48. package/src/cli/index.ts +4 -2
  49. package/src/dashboard/history-store.ts +86 -0
  50. package/src/dashboard/html-renderer.ts +90 -0
  51. package/src/dashboard/snapshot-builder.ts +273 -0
  52. package/src/dashboard/templates/index.html +287 -0
  53. package/src/dashboard/types.ts +148 -0
  54. package/src/exporters/json-exporter.ts +162 -0
  55. package/src/exporters/playwright-report-parser.ts +12 -5
  56. package/src/exporters/spec-parser.ts +8 -3
  57. package/src/orchestrator/ai-rules-updater.ts +4 -0
  58. package/src/orchestrator/templates/ai-instructions/claude-cmd-dashboard.md +62 -0
  59. package/src/orchestrator/templates/ai-instructions/claude-skill-dashboard.md +121 -0
  60. package/src/orchestrator/templates/ai-instructions/copilot-cmd-dashboard.md +62 -0
  61. package/src/orchestrator/templates/ai-instructions/github-skill-sungen-dashboard.md +121 -0
  62. package/src/orchestrator/templates/playwright.config.ts +20 -1
@@ -0,0 +1,263 @@
1
+ "use strict";
2
+ /**
3
+ * Orchestrate dashboard snapshot construction across all screens/flows.
4
+ *
5
+ * Inputs are read from the same on-disk sources used by `sungen delivery`:
6
+ * qa/screens/<name>/... feature, test-data, selectors, requirements
7
+ * qa/flows/<name>/...
8
+ * specs/generated/<...>/... compiled .spec.ts + per-target test-result.json
9
+ * test-results/results.json global fallback
10
+ *
11
+ * Output is a DashboardSnapshot ready to be embedded in HTML or written as
12
+ * a history entry under qa/dashboard/history/<runId>.json.
13
+ */
14
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
15
+ if (k2 === undefined) k2 = k;
16
+ var desc = Object.getOwnPropertyDescriptor(m, k);
17
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
18
+ desc = { enumerable: true, get: function() { return m[k]; } };
19
+ }
20
+ Object.defineProperty(o, k2, desc);
21
+ }) : (function(o, m, k, k2) {
22
+ if (k2 === undefined) k2 = k;
23
+ o[k2] = m[k];
24
+ }));
25
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
26
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
27
+ }) : function(o, v) {
28
+ o["default"] = v;
29
+ });
30
+ var __importStar = (this && this.__importStar) || (function () {
31
+ var ownKeys = function(o) {
32
+ ownKeys = Object.getOwnPropertyNames || function (o) {
33
+ var ar = [];
34
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
35
+ return ar;
36
+ };
37
+ return ownKeys(o);
38
+ };
39
+ return function (mod) {
40
+ if (mod && mod.__esModule) return mod;
41
+ var result = {};
42
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
43
+ __setModuleDefault(result, mod);
44
+ return result;
45
+ };
46
+ })();
47
+ Object.defineProperty(exports, "__esModule", { value: true });
48
+ exports.buildDashboardSnapshot = buildDashboardSnapshot;
49
+ exports.listDashboardTargets = listDashboardTargets;
50
+ exports.resolveTargetType = resolveTargetType;
51
+ const fs = __importStar(require("fs"));
52
+ const path = __importStar(require("path"));
53
+ const child_process_1 = require("child_process");
54
+ const feature_parser_1 = require("../exporters/feature-parser");
55
+ const spec_parser_1 = require("../exporters/spec-parser");
56
+ const test_data_resolver_1 = require("../exporters/test-data-resolver");
57
+ const playwright_report_parser_1 = require("../exporters/playwright-report-parser");
58
+ const scenario_merger_1 = require("../exporters/scenario-merger");
59
+ const json_exporter_1 = require("../exporters/json-exporter");
60
+ const package_info_1 = require("../exporters/package-info");
61
+ const types_1 = require("./types");
62
+ function buildDashboardSnapshot(options) {
63
+ const { cwd, targets, env } = options;
64
+ const screens = [];
65
+ for (const target of targets) {
66
+ try {
67
+ const screen = buildOneScreen(cwd, target, env);
68
+ if (screen)
69
+ screens.push(screen);
70
+ }
71
+ catch (err) {
72
+ if (!options.continueOnError)
73
+ throw err;
74
+ // eslint-disable-next-line no-console
75
+ console.warn(`[dashboard] skipping ${target.name}: ${err.message}`);
76
+ }
77
+ }
78
+ const now = new Date();
79
+ return {
80
+ version: types_1.SNAPSHOT_VERSION,
81
+ runId: makeRunId(now),
82
+ generatedAt: toLocalIso(now),
83
+ environment: collectEnvironment(cwd, env),
84
+ summary: aggregateSummary(screens),
85
+ screens: screens.sort((a, b) => a.name.localeCompare(b.name)),
86
+ };
87
+ }
88
+ // ----------------------------------------------------------------------------
89
+ // Per-target build
90
+ // ----------------------------------------------------------------------------
91
+ function buildOneScreen(cwd, target, env) {
92
+ const base = qaDir(cwd, target);
93
+ const genBase = generatedDir(cwd, target);
94
+ const featureFile = path.join(base, 'features', `${target.name}.feature`);
95
+ const testDataFile = path.join(base, 'test-data', `${target.name}.yaml`);
96
+ const specFile = path.join(genBase, `${target.name}.spec.ts`);
97
+ const specMdFile = path.join(base, 'requirements', 'spec.md');
98
+ const resultsFile = resolveResultsPath(cwd, target);
99
+ if (!fs.existsSync(featureFile))
100
+ return null;
101
+ const feature = (0, feature_parser_1.parseFeatureMetadata)(featureFile);
102
+ const spec = fs.existsSync(specFile)
103
+ ? (0, spec_parser_1.parseSpecFile)(specFile)
104
+ : { tests: [] };
105
+ const testData = fs.existsSync(testDataFile) ? (0, test_data_resolver_1.loadTestData)(testDataFile) : {};
106
+ const results = resultsFile ? (0, playwright_report_parser_1.loadPlaywrightReport)(resultsFile) : null;
107
+ const merged = (0, scenario_merger_1.mergeFeatureAndSpec)(feature, spec);
108
+ const label = target.isFlow ? `flow/${target.name}` : target.name;
109
+ const specLink = fs.existsSync(specMdFile) ? path.relative(cwd, specMdFile) : undefined;
110
+ return (0, json_exporter_1.buildScreenSnapshot)({
111
+ screen: label,
112
+ isFlow: target.isFlow,
113
+ featureName: feature.featureName,
114
+ featurePath: feature.featurePath,
115
+ specLink,
116
+ merged,
117
+ testData,
118
+ results,
119
+ env,
120
+ });
121
+ }
122
+ // ----------------------------------------------------------------------------
123
+ // Aggregate summary across all screens
124
+ // ----------------------------------------------------------------------------
125
+ function aggregateSummary(screens) {
126
+ const summary = {
127
+ total: 0,
128
+ passed: 0,
129
+ failed: 0,
130
+ pending: 0,
131
+ na: 0,
132
+ notCompiled: 0,
133
+ passRate: 0,
134
+ byPriority: { Critical: 0, High: 0, Normal: 0, Low: 0 },
135
+ byCategory: { Accessing: 0, GUI: 0, Function: 0 },
136
+ byType: { Auto: 0, Manual: 0, 'Not compiled': 0 },
137
+ };
138
+ for (const screen of screens) {
139
+ summary.total += screen.summary.total;
140
+ summary.passed += screen.summary.passed;
141
+ summary.failed += screen.summary.failed;
142
+ summary.pending += screen.summary.pending;
143
+ summary.na += screen.summary.na;
144
+ summary.notCompiled += screen.summary.notCompiled;
145
+ for (const s of screen.scenarios) {
146
+ bumpKey(summary.byPriority, s.priority);
147
+ bumpKey(summary.byCategory, s.category2);
148
+ bumpKey(summary.byType, s.type);
149
+ }
150
+ }
151
+ const executed = summary.passed + summary.failed;
152
+ summary.passRate = executed > 0 ? summary.passed / executed : 0;
153
+ return summary;
154
+ }
155
+ function bumpKey(record, key) {
156
+ record[key] = (record[key] ?? 0) + 1;
157
+ }
158
+ // ----------------------------------------------------------------------------
159
+ // Path helpers (mirror delivery.ts to stay consistent)
160
+ // ----------------------------------------------------------------------------
161
+ function qaDir(cwd, target) {
162
+ return path.join(cwd, 'qa', target.isFlow ? 'flows' : 'screens', target.name);
163
+ }
164
+ function generatedDir(cwd, target) {
165
+ return target.isFlow
166
+ ? path.join(cwd, 'specs', 'generated', 'flows', target.name)
167
+ : path.join(cwd, 'specs', 'generated', target.name);
168
+ }
169
+ function resolveResultsPath(cwd, target) {
170
+ const genDir = generatedDir(cwd, target);
171
+ const perTarget = path.join(genDir, `${target.name}-test-result.json`);
172
+ if (fs.existsSync(perTarget))
173
+ return perTarget;
174
+ const global = path.join(cwd, 'test-results', 'results.json');
175
+ if (fs.existsSync(global))
176
+ return global;
177
+ return null;
178
+ }
179
+ // ----------------------------------------------------------------------------
180
+ // Discovery (also used by CLI)
181
+ // ----------------------------------------------------------------------------
182
+ function listDashboardTargets(cwd) {
183
+ const targets = [];
184
+ const screensDir = path.join(cwd, 'qa', 'screens');
185
+ if (fs.existsSync(screensDir)) {
186
+ for (const d of fs.readdirSync(screensDir, { withFileTypes: true })) {
187
+ if (d.isDirectory())
188
+ targets.push({ name: d.name, isFlow: false });
189
+ }
190
+ }
191
+ const flowsDir = path.join(cwd, 'qa', 'flows');
192
+ if (fs.existsSync(flowsDir)) {
193
+ for (const d of fs.readdirSync(flowsDir, { withFileTypes: true })) {
194
+ if (d.isDirectory())
195
+ targets.push({ name: d.name, isFlow: true });
196
+ }
197
+ }
198
+ return targets.sort((a, b) => a.name.localeCompare(b.name));
199
+ }
200
+ function resolveTargetType(cwd, name) {
201
+ if (fs.existsSync(path.join(cwd, 'qa', 'flows', name))) {
202
+ return { name, isFlow: true };
203
+ }
204
+ return { name, isFlow: false };
205
+ }
206
+ // ----------------------------------------------------------------------------
207
+ // Run ID + environment metadata (Vietnam Indochina Time, UTC+7, no DST)
208
+ // ----------------------------------------------------------------------------
209
+ const VN_OFFSET_MS = 7 * 60 * 60 * 1000;
210
+ /**
211
+ * Filename-safe ISO timestamp in Vietnam time (UTC+7).
212
+ * Example: 2026-04-29T08-13-53+0700
213
+ *
214
+ * Colons in HH:MM:SS are replaced with `-` (filename-safe on Windows too).
215
+ * The `+0700` suffix makes the offset explicit so consumers don't need
216
+ * to assume a default timezone.
217
+ */
218
+ function makeRunId(now) {
219
+ const vn = new Date(now.getTime() + VN_OFFSET_MS);
220
+ const yyyy = vn.getUTCFullYear();
221
+ const MM = String(vn.getUTCMonth() + 1).padStart(2, '0');
222
+ const dd = String(vn.getUTCDate()).padStart(2, '0');
223
+ const HH = String(vn.getUTCHours()).padStart(2, '0');
224
+ const mm = String(vn.getUTCMinutes()).padStart(2, '0');
225
+ const ss = String(vn.getUTCSeconds()).padStart(2, '0');
226
+ return `${yyyy}-${MM}-${dd}T${HH}-${mm}-${ss}+0700`;
227
+ }
228
+ /**
229
+ * Full ISO 8601 timestamp in Vietnam time, with milliseconds and `+07:00` offset.
230
+ * Example: 2026-04-29T08:13:53.495+07:00
231
+ */
232
+ function toLocalIso(now) {
233
+ const vn = new Date(now.getTime() + VN_OFFSET_MS);
234
+ const yyyy = vn.getUTCFullYear();
235
+ const MM = String(vn.getUTCMonth() + 1).padStart(2, '0');
236
+ const dd = String(vn.getUTCDate()).padStart(2, '0');
237
+ const HH = String(vn.getUTCHours()).padStart(2, '0');
238
+ const mm = String(vn.getUTCMinutes()).padStart(2, '0');
239
+ const ss = String(vn.getUTCSeconds()).padStart(2, '0');
240
+ const ms = String(vn.getUTCMilliseconds()).padStart(3, '0');
241
+ return `${yyyy}-${MM}-${dd}T${HH}:${mm}:${ss}.${ms}+07:00`;
242
+ }
243
+ function collectEnvironment(cwd, env) {
244
+ let gitBranch;
245
+ let gitSha;
246
+ try {
247
+ gitBranch = (0, child_process_1.execSync)('git rev-parse --abbrev-ref HEAD', { cwd, encoding: 'utf-8' }).trim();
248
+ }
249
+ catch { /* ignore */ }
250
+ try {
251
+ gitSha = (0, child_process_1.execSync)('git rev-parse --short HEAD', { cwd, encoding: 'utf-8' }).trim();
252
+ }
253
+ catch { /* ignore */ }
254
+ return {
255
+ baseURL: env.baseURL,
256
+ projectName: env.projectName,
257
+ executor: env.executor,
258
+ sungenVersion: (0, package_info_1.getPackageVersion)(),
259
+ gitBranch,
260
+ gitSha,
261
+ };
262
+ }
263
+ //# sourceMappingURL=snapshot-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot-builder.js","sourceRoot":"","sources":["../../src/dashboard/snapshot-builder.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;GAWG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkCH,wDAwBC;AAkHD,oDAkBC;AAED,8CAKC;AAnMD,uCAAyB;AACzB,2CAA6B;AAC7B,iDAAyC;AACzC,gEAAmE;AACnE,0DAAyD;AACzD,wEAA+D;AAC/D,oFAA6E;AAC7E,kEAAmE;AACnE,8DAAiE;AACjE,4DAA8D;AAE9D,mCAMiB;AAejB,SAAgB,sBAAsB,CAAC,OAA6B;IAClE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC;IACtC,MAAM,OAAO,GAAqB,EAAE,CAAC;IAErC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;YAChD,IAAI,MAAM;gBAAE,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACnC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,OAAO,CAAC,eAAe;gBAAE,MAAM,GAAG,CAAC;YACxC,sCAAsC;YACtC,OAAO,CAAC,IAAI,CAAC,wBAAwB,MAAM,CAAC,IAAI,KAAM,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;QACjF,CAAC;IACH,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,OAAO;QACL,OAAO,EAAE,wBAAgB;QACzB,KAAK,EAAE,SAAS,CAAC,GAAG,CAAC;QACrB,WAAW,EAAE,UAAU,CAAC,GAAG,CAAC;QAC5B,WAAW,EAAE,kBAAkB,CAAC,GAAG,EAAE,GAAG,CAAC;QACzC,OAAO,EAAE,gBAAgB,CAAC,OAAO,CAAC;QAClC,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;KAC9D,CAAC;AACJ,CAAC;AAED,+EAA+E;AAC/E,mBAAmB;AACnB,+EAA+E;AAE/E,SAAS,cAAc,CACrB,GAAW,EACX,MAAuB,EACvB,GAAoB;IAEpB,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAChC,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAC1C,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,MAAM,CAAC,IAAI,UAAU,CAAC,CAAC;IAC1E,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,MAAM,CAAC,IAAI,OAAO,CAAC,CAAC;IACzE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,MAAM,CAAC,IAAI,UAAU,CAAC,CAAC;IAC9D,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,EAAE,SAAS,CAAC,CAAC;IAC9D,MAAM,WAAW,GAAG,kBAAkB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAEpD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC;QAAE,OAAO,IAAI,CAAC;IAE7C,MAAM,OAAO,GAAG,IAAA,qCAAoB,EAAC,WAAW,CAAC,CAAC;IAClD,MAAM,IAAI,GAAG,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;QAClC,CAAC,CAAC,IAAA,2BAAa,EAAC,QAAQ,CAAC;QACzB,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;IAClB,MAAM,QAAQ,GAAG,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAA,iCAAY,EAAC,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/E,MAAM,OAAO,GAAG,WAAW,CAAC,CAAC,CAAC,IAAA,+CAAoB,EAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAEvE,MAAM,MAAM,GAAG,IAAA,qCAAmB,EAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAClD,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;IAClE,MAAM,QAAQ,GAAG,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAExF,OAAO,IAAA,mCAAmB,EAAC;QACzB,MAAM,EAAE,KAAK;QACb,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,QAAQ;QACR,MAAM;QACN,QAAQ;QACR,OAAO;QACP,GAAG;KACJ,CAAC,CAAC;AACL,CAAC;AAED,+EAA+E;AAC/E,uCAAuC;AACvC,+EAA+E;AAE/E,SAAS,gBAAgB,CAAC,OAAyB;IACjD,MAAM,OAAO,GAAqB;QAChC,KAAK,EAAE,CAAC;QACR,MAAM,EAAE,CAAC;QACT,MAAM,EAAE,CAAC;QACT,OAAO,EAAE,CAAC;QACV,EAAE,EAAE,CAAC;QACL,WAAW,EAAE,CAAC;QACd,QAAQ,EAAE,CAAC;QACX,UAAU,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE;QACvD,UAAU,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE;QACjD,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC,EAAE;KAClD,CAAC;IAEF,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,OAAO,CAAC,KAAK,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;QACtC,OAAO,CAAC,MAAM,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;QACxC,OAAO,CAAC,MAAM,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;QACxC,OAAO,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC;QAC1C,OAAO,CAAC,EAAE,IAAI,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;QAChC,OAAO,CAAC,WAAW,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;QAElD,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;YACjC,OAAO,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC;YACxC,OAAO,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC;YACzC,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IAED,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IACjD,OAAO,CAAC,QAAQ,GAAG,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IAChE,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,OAAO,CAAC,MAA8B,EAAE,GAAW;IAC1D,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;AACvC,CAAC;AAED,+EAA+E;AAC/E,uDAAuD;AACvD,+EAA+E;AAE/E,SAAS,KAAK,CAAC,GAAW,EAAE,MAAuB;IACjD,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;AAChF,CAAC;AAED,SAAS,YAAY,CAAC,GAAW,EAAE,MAAuB;IACxD,OAAO,MAAM,CAAC,MAAM;QAClB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC;QAC5D,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;AACxD,CAAC;AAED,SAAS,kBAAkB,CAAC,GAAW,EAAE,MAAuB;IAC9D,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACzC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,mBAAmB,CAAC,CAAC;IACvE,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,OAAO,SAAS,CAAC;IAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,EAAE,cAAc,CAAC,CAAC;IAC9D,IAAI,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,OAAO,MAAM,CAAC;IACzC,OAAO,IAAI,CAAC;AACd,CAAC;AAED,+EAA+E;AAC/E,+BAA+B;AAC/B,+EAA+E;AAE/E,SAAgB,oBAAoB,CAAC,GAAW;IAC9C,MAAM,OAAO,GAAsB,EAAE,CAAC;IAEtC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;IACnD,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9B,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,CAAC,UAAU,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;YACpE,IAAI,CAAC,CAAC,WAAW,EAAE;gBAAE,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;QACrE,CAAC;IACH,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IAC/C,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5B,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,CAAC,QAAQ,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;YAClE,IAAI,CAAC,CAAC,WAAW,EAAE;gBAAE,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AAC9D,CAAC;AAED,SAAgB,iBAAiB,CAAC,GAAW,EAAE,IAAY;IACzD,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;QACvD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IAChC,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;AACjC,CAAC;AAED,+EAA+E;AAC/E,wEAAwE;AACxE,+EAA+E;AAE/E,MAAM,YAAY,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAExC;;;;;;;GAOG;AACH,SAAS,SAAS,CAAC,GAAS;IAC1B,MAAM,EAAE,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,YAAY,CAAC,CAAC;IAClD,MAAM,IAAI,GAAG,EAAE,CAAC,cAAc,EAAE,CAAC;IACjC,MAAM,EAAE,GAAG,MAAM,CAAC,EAAE,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACzD,MAAM,EAAE,GAAG,MAAM,CAAC,EAAE,CAAC,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACpD,MAAM,EAAE,GAAG,MAAM,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACrD,MAAM,EAAE,GAAG,MAAM,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACvD,MAAM,EAAE,GAAG,MAAM,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACvD,OAAO,GAAG,IAAI,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC;AACtD,CAAC;AAED;;;GAGG;AACH,SAAS,UAAU,CAAC,GAAS;IAC3B,MAAM,EAAE,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,YAAY,CAAC,CAAC;IAClD,MAAM,IAAI,GAAG,EAAE,CAAC,cAAc,EAAE,CAAC;IACjC,MAAM,EAAE,GAAG,MAAM,CAAC,EAAE,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACzD,MAAM,EAAE,GAAG,MAAM,CAAC,EAAE,CAAC,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACpD,MAAM,EAAE,GAAG,MAAM,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACrD,MAAM,EAAE,GAAG,MAAM,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACvD,MAAM,EAAE,GAAG,MAAM,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACvD,MAAM,EAAE,GAAG,MAAM,CAAC,EAAE,CAAC,kBAAkB,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC5D,OAAO,GAAG,IAAI,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC;AAC7D,CAAC;AAED,SAAS,kBAAkB,CAAC,GAAW,EAAE,GAAoB;IAC3D,IAAI,SAA6B,CAAC;IAClC,IAAI,MAA0B,CAAC;IAC/B,IAAI,CAAC;QACH,SAAS,GAAG,IAAA,wBAAQ,EAAC,iCAAiC,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC7F,CAAC;IAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;IACxB,IAAI,CAAC;QACH,MAAM,GAAG,IAAA,wBAAQ,EAAC,4BAA4B,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACrF,CAAC;IAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;IAExB,OAAO;QACL,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,WAAW,EAAE,GAAG,CAAC,WAAW;QAC5B,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,aAAa,EAAE,IAAA,gCAAiB,GAAE;QAClC,SAAS;QACT,MAAM;KACP,CAAC;AACJ,CAAC"}