@theromans/convex-dobty 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -0
- package/dist/client/index.d.ts +287 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +215 -0
- package/dist/client/index.js.map +1 -0
- package/dist/component/_generated/api.d.ts +23 -0
- package/dist/component/_generated/api.d.ts.map +1 -0
- package/dist/component/_generated/api.js +15 -0
- package/dist/component/_generated/api.js.map +1 -0
- package/dist/component/_generated/dataModel.d.ts +28 -0
- package/dist/component/_generated/dataModel.d.ts.map +1 -0
- package/dist/component/_generated/dataModel.js +11 -0
- package/dist/component/_generated/dataModel.js.map +1 -0
- package/dist/component/_generated/server.d.ts +23 -0
- package/dist/component/_generated/server.d.ts.map +1 -0
- package/dist/component/_generated/server.js +18 -0
- package/dist/component/_generated/server.js.map +1 -0
- package/dist/component/assessment.d.ts +141 -0
- package/dist/component/assessment.d.ts.map +1 -0
- package/dist/component/assessment.js +498 -0
- package/dist/component/assessment.js.map +1 -0
- package/dist/component/convex.config.d.ts +3 -0
- package/dist/component/convex.config.d.ts.map +1 -0
- package/dist/component/convex.config.js +3 -0
- package/dist/component/convex.config.js.map +1 -0
- package/dist/component/metrics.d.ts +145 -0
- package/dist/component/metrics.d.ts.map +1 -0
- package/dist/component/metrics.js +425 -0
- package/dist/component/metrics.js.map +1 -0
- package/dist/component/potentialAnalysis.d.ts +510 -0
- package/dist/component/potentialAnalysis.d.ts.map +1 -0
- package/dist/component/potentialAnalysis.js +1035 -0
- package/dist/component/potentialAnalysis.js.map +1 -0
- package/dist/component/schema.d.ts +342 -0
- package/dist/component/schema.d.ts.map +1 -0
- package/dist/component/schema.js +194 -0
- package/dist/component/schema.js.map +1 -0
- package/dist/component/scoring.d.ts +6 -0
- package/dist/component/scoring.d.ts.map +1 -0
- package/dist/component/scoring.js +394 -0
- package/dist/component/scoring.js.map +1 -0
- package/dist/data/dm/cvr.d.ts +12 -0
- package/dist/data/dm/cvr.d.ts.map +1 -0
- package/dist/data/dm/cvr.js +71 -0
- package/dist/data/dm/cvr.js.map +1 -0
- package/dist/data/dm/guidelines.d.ts +9 -0
- package/dist/data/dm/guidelines.d.ts.map +1 -0
- package/dist/data/dm/guidelines.js +22 -0
- package/dist/data/dm/guidelines.js.map +1 -0
- package/dist/data/dm/methods.d.ts +10 -0
- package/dist/data/dm/methods.d.ts.map +1 -0
- package/dist/data/dm/methods.js +50 -0
- package/dist/data/dm/methods.js.map +1 -0
- package/dist/data/dm/systems.d.ts +10 -0
- package/dist/data/dm/systems.d.ts.map +1 -0
- package/dist/data/dm/systems.js +52 -0
- package/dist/data/dm/systems.js.map +1 -0
- package/dist/data/domains.d.ts +20 -0
- package/dist/data/domains.d.ts.map +1 -0
- package/dist/data/domains.js +264 -0
- package/dist/data/domains.js.map +1 -0
- package/dist/data/ek/cvr.d.ts +12 -0
- package/dist/data/ek/cvr.d.ts.map +1 -0
- package/dist/data/ek/cvr.js +58 -0
- package/dist/data/ek/cvr.js.map +1 -0
- package/dist/data/ek/guidelines.d.ts +9 -0
- package/dist/data/ek/guidelines.d.ts.map +1 -0
- package/dist/data/ek/guidelines.js +26 -0
- package/dist/data/ek/guidelines.js.map +1 -0
- package/dist/data/ek/methods.d.ts +9 -0
- package/dist/data/ek/methods.d.ts.map +1 -0
- package/dist/data/ek/methods.js +35 -0
- package/dist/data/ek/methods.js.map +1 -0
- package/dist/data/ek/systems.d.ts +9 -0
- package/dist/data/ek/systems.d.ts.map +1 -0
- package/dist/data/ek/systems.js +23 -0
- package/dist/data/ek/systems.js.map +1 -0
- package/dist/data/influence-areas.d.ts +26 -0
- package/dist/data/influence-areas.d.ts.map +1 -0
- package/dist/data/influence-areas.js +143 -0
- package/dist/data/influence-areas.js.map +1 -0
- package/dist/data/km/cvr.d.ts +13 -0
- package/dist/data/km/cvr.d.ts.map +1 -0
- package/dist/data/km/cvr.js +65 -0
- package/dist/data/km/cvr.js.map +1 -0
- package/dist/data/km/guidelines.d.ts +9 -0
- package/dist/data/km/guidelines.d.ts.map +1 -0
- package/dist/data/km/guidelines.js +20 -0
- package/dist/data/km/guidelines.js.map +1 -0
- package/dist/data/km/methods.d.ts +9 -0
- package/dist/data/km/methods.d.ts.map +1 -0
- package/dist/data/km/methods.js +28 -0
- package/dist/data/km/methods.js.map +1 -0
- package/dist/data/km/systems.d.ts +9 -0
- package/dist/data/km/systems.d.ts.map +1 -0
- package/dist/data/km/systems.js +18 -0
- package/dist/data/km/systems.js.map +1 -0
- package/dist/data/stammdaten.d.ts +7 -0
- package/dist/data/stammdaten.d.ts.map +1 -0
- package/dist/data/stammdaten.js +94 -0
- package/dist/data/stammdaten.js.map +1 -0
- package/dist/data/types.d.ts +113 -0
- package/dist/data/types.d.ts.map +1 -0
- package/dist/data/types.js +23 -0
- package/dist/data/types.js.map +1 -0
- package/package.json +38 -0
- package/src/client/index.ts +442 -0
- package/src/component/_generated/api.ts +35 -0
- package/src/component/_generated/component.ts +50 -0
- package/src/component/_generated/dataModel.ts +42 -0
- package/src/component/_generated/server.ts +48 -0
- package/src/component/assessment.ts +536 -0
- package/src/component/convex.config.ts +3 -0
- package/src/component/metrics.ts +479 -0
- package/src/component/potentialAnalysis.ts +1118 -0
- package/src/component/schema.ts +209 -0
- package/src/component/scoring.ts +485 -0
- package/src/data/dm/cvr.ts +75 -0
- package/src/data/dm/guidelines.ts +24 -0
- package/src/data/dm/methods.ts +53 -0
- package/src/data/dm/systems.ts +55 -0
- package/src/data/domains.ts +275 -0
- package/src/data/ek/cvr.ts +62 -0
- package/src/data/ek/guidelines.ts +28 -0
- package/src/data/ek/methods.ts +39 -0
- package/src/data/ek/systems.ts +25 -0
- package/src/data/influence-areas.ts +162 -0
- package/src/data/km/cvr.ts +69 -0
- package/src/data/km/guidelines.ts +22 -0
- package/src/data/km/methods.ts +30 -0
- package/src/data/km/systems.ts +20 -0
- package/src/data/stammdaten.ts +96 -0
- package/src/data/types.ts +183 -0
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
/** Get current metrics for a workspace, optionally filtered by domain */
|
|
2
|
+
export declare const getMetrics: import("convex/server").RegisteredQuery<"public", {
|
|
3
|
+
domain?: string | undefined;
|
|
4
|
+
workspaceId: string;
|
|
5
|
+
}, Promise<{
|
|
6
|
+
_id: import("convex/values").GenericId<"metrics">;
|
|
7
|
+
_creationTime: number;
|
|
8
|
+
domain: string;
|
|
9
|
+
workspaceId: string;
|
|
10
|
+
data: any;
|
|
11
|
+
computedAt: number;
|
|
12
|
+
} | {
|
|
13
|
+
_id: import("convex/values").GenericId<"metrics">;
|
|
14
|
+
_creationTime: number;
|
|
15
|
+
domain: string;
|
|
16
|
+
workspaceId: string;
|
|
17
|
+
data: any;
|
|
18
|
+
computedAt: number;
|
|
19
|
+
}[] | null>>;
|
|
20
|
+
/** Get per-dimension score breakdown for a domain */
|
|
21
|
+
export declare const getDimensionScores: import("convex/server").RegisteredQuery<"public", {
|
|
22
|
+
domain: string;
|
|
23
|
+
workspaceId: string;
|
|
24
|
+
}, Promise<{} | null>>;
|
|
25
|
+
/** Get CVR monetary potential breakdown */
|
|
26
|
+
export declare const getMonetaryPotential: import("convex/server").RegisteredQuery<"public", {
|
|
27
|
+
domain?: string | undefined;
|
|
28
|
+
workspaceId: string;
|
|
29
|
+
}, Promise<{} | null>>;
|
|
30
|
+
/** Return full dashboard data structure for a workspace */
|
|
31
|
+
export declare const getDashboardData: import("convex/server").RegisteredQuery<"public", {
|
|
32
|
+
workspaceId: string;
|
|
33
|
+
}, Promise<{
|
|
34
|
+
domains: Record<string, unknown>;
|
|
35
|
+
overall: {
|
|
36
|
+
score: number;
|
|
37
|
+
maturityLevels: import("../data/types.js").MaturityLevelDef[];
|
|
38
|
+
};
|
|
39
|
+
snapshotCount: number;
|
|
40
|
+
lastSnapshotAt: number | null;
|
|
41
|
+
}>>;
|
|
42
|
+
/** Return mode-appropriate system prompt text for AI injection */
|
|
43
|
+
export declare const getSystemPrompt: import("convex/server").RegisteredQuery<"public", {
|
|
44
|
+
workspaceType: string;
|
|
45
|
+
}, Promise<string>>;
|
|
46
|
+
/** Persist an immutable snapshot */
|
|
47
|
+
export declare const createSnapshot: import("convex/server").RegisteredMutation<"internal", {
|
|
48
|
+
domain: string;
|
|
49
|
+
workspaceId: string;
|
|
50
|
+
snapshotType: string;
|
|
51
|
+
}, Promise<import("convex/values").GenericId<"snapshots"> | null>>;
|
|
52
|
+
/** Consultant dashboard — cross-domain view with radar data, priorities, flagged items */
|
|
53
|
+
export declare const getConsultantDashboard: import("convex/server").RegisteredQuery<"public", {
|
|
54
|
+
workspaceId?: string | undefined;
|
|
55
|
+
}, Promise<{
|
|
56
|
+
radarData: Record<string, {
|
|
57
|
+
score: number;
|
|
58
|
+
domain: string;
|
|
59
|
+
label: string;
|
|
60
|
+
}>;
|
|
61
|
+
domainSummaries: Record<string, {
|
|
62
|
+
overallScore: number;
|
|
63
|
+
maturityLevel: string;
|
|
64
|
+
progress: {
|
|
65
|
+
total: number;
|
|
66
|
+
answered: number;
|
|
67
|
+
progressPct: number;
|
|
68
|
+
};
|
|
69
|
+
totalMonetaryPotential: number;
|
|
70
|
+
}>;
|
|
71
|
+
priorities: {
|
|
72
|
+
dimensionKey: string;
|
|
73
|
+
domain: string;
|
|
74
|
+
label: string;
|
|
75
|
+
score: number;
|
|
76
|
+
gap: number;
|
|
77
|
+
}[];
|
|
78
|
+
flaggedItems: {
|
|
79
|
+
questionKey: string;
|
|
80
|
+
value: unknown;
|
|
81
|
+
confidence: number;
|
|
82
|
+
source: string;
|
|
83
|
+
}[];
|
|
84
|
+
maturityLevels: import("../data/types.js").MaturityLevelDef[];
|
|
85
|
+
}>>;
|
|
86
|
+
/** User dashboard — focused workspace view with progress and next questions */
|
|
87
|
+
export declare const getUserDashboard: import("convex/server").RegisteredQuery<"public", {
|
|
88
|
+
workspaceId: string;
|
|
89
|
+
}, Promise<{
|
|
90
|
+
totalProgress: {
|
|
91
|
+
answered: number;
|
|
92
|
+
total: number;
|
|
93
|
+
pct: number;
|
|
94
|
+
};
|
|
95
|
+
domainProgress: Record<string, {
|
|
96
|
+
answered: number;
|
|
97
|
+
total: number;
|
|
98
|
+
pct: number;
|
|
99
|
+
score: number;
|
|
100
|
+
}>;
|
|
101
|
+
nextQuestions: {
|
|
102
|
+
questionKey: string;
|
|
103
|
+
domain: string;
|
|
104
|
+
dimension: string;
|
|
105
|
+
label: string;
|
|
106
|
+
}[];
|
|
107
|
+
}>>;
|
|
108
|
+
/** Aggregate metrics across multiple workspaces for Overview workspace type */
|
|
109
|
+
export declare const getOverviewDashboard: import("convex/server").RegisteredQuery<"public", {
|
|
110
|
+
workspaceIds: string[];
|
|
111
|
+
}, Promise<{
|
|
112
|
+
aggregatedDimensions: Record<string, {
|
|
113
|
+
avgScore: number;
|
|
114
|
+
domain: string;
|
|
115
|
+
}>;
|
|
116
|
+
domainAverages: Record<string, {
|
|
117
|
+
avgScore: number;
|
|
118
|
+
workspaceCount: number;
|
|
119
|
+
totalMonetary: number;
|
|
120
|
+
}>;
|
|
121
|
+
overall: {
|
|
122
|
+
avgScore: number;
|
|
123
|
+
maturityLevel: string;
|
|
124
|
+
totalMonetaryPotential: number;
|
|
125
|
+
workspaceCount: number;
|
|
126
|
+
};
|
|
127
|
+
maturityLevels: import("../data/types.js").MaturityLevelDef[];
|
|
128
|
+
}>>;
|
|
129
|
+
/** List snapshots for a workspace, optionally filtered by domain */
|
|
130
|
+
export declare const getSnapshots: import("convex/server").RegisteredQuery<"public", {
|
|
131
|
+
domain?: string | undefined;
|
|
132
|
+
workspaceId: string;
|
|
133
|
+
}, Promise<{
|
|
134
|
+
_id: import("convex/values").GenericId<"snapshots">;
|
|
135
|
+
_creationTime: number;
|
|
136
|
+
financialInputs?: any;
|
|
137
|
+
monetaryPotential?: any;
|
|
138
|
+
domain: string;
|
|
139
|
+
workspaceId: string;
|
|
140
|
+
dimensionScores: any;
|
|
141
|
+
overallMaturity: any;
|
|
142
|
+
snapshotAt: number;
|
|
143
|
+
snapshotType: string;
|
|
144
|
+
}[]>>;
|
|
145
|
+
//# sourceMappingURL=metrics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../src/component/metrics.ts"],"names":[],"mappings":"AAMA,yEAAyE;AACzE,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;YAmBrB,CAAC;AAEH,qDAAqD;AACrD,eAAO,MAAM,kBAAkB;;;sBAgB7B,CAAC;AAEH,2CAA2C;AAC3C,eAAO,MAAM,oBAAoB;;;sBA2B/B,CAAC;AAEH,2DAA2D;AAC3D,eAAO,MAAM,gBAAgB;;;;;;;;;;GAgD3B,CAAC;AAEH,kEAAkE;AAClE,eAAO,MAAM,eAAe;;mBA4C1B,CAAC;AAIH,oCAAoC;AACpC,eAAO,MAAM,cAAc;;;;kEAgCzB,CAAC;AAIH,0FAA0F;AAC1F,eAAO,MAAM,sBAAsB;;;;eAiBU,MAAM;gBAAU,MAAM;eAAS,MAAM;;;sBAE9D,MAAM;uBACL,MAAM;kBACX;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,QAAQ,EAAE,MAAM,CAAC;YAAC,WAAW,EAAE,MAAM,CAAA;SAAE;gCAC1C,MAAM;;;;;;;;;;qBA+CO,MAAM;eAAS,OAAO;oBAAc,MAAM;gBAAU,MAAM;;;GAwBnG,CAAC;AAEH,+EAA+E;AAC/E,eAAO,MAAM,gBAAgB;;;;;;;;;kBAawB,MAAM;eAAS,MAAM;aAAO,MAAM;eAAS,MAAM;;;;;;;;GAgDpG,CAAC;AAIH,+EAA+E;AAC/E,eAAO,MAAM,oBAAoB;;;;kBAyC0B,MAAM;gBAAU,MAAM;;;kBAS5B,MAAM;wBAAkB,MAAM;uBAAiB,MAAM;;;;;;;;;GA6BxG,CAAC;AAEH,oEAAoE;AACpE,eAAO,MAAM,YAAY;;;;;;;;;;;;;;KAmBvB,CAAC"}
|
|
@@ -0,0 +1,425 @@
|
|
|
1
|
+
import { query, internalMutation } from "./_generated/server.js";
|
|
2
|
+
import { v } from "convex/values";
|
|
3
|
+
import { DOMAINS, MATURITY_LEVELS, getMaturityLevel } from "../data/domains.js";
|
|
4
|
+
// ── Queries ──
|
|
5
|
+
/** Get current metrics for a workspace, optionally filtered by domain */
|
|
6
|
+
export const getMetrics = query({
|
|
7
|
+
args: {
|
|
8
|
+
workspaceId: v.string(),
|
|
9
|
+
domain: v.optional(v.string()),
|
|
10
|
+
},
|
|
11
|
+
handler: async (ctx, args) => {
|
|
12
|
+
if (args.domain) {
|
|
13
|
+
return await ctx.db
|
|
14
|
+
.query("metrics")
|
|
15
|
+
.withIndex("by_workspace_domain", (q) => q.eq("workspaceId", args.workspaceId).eq("domain", args.domain))
|
|
16
|
+
.first();
|
|
17
|
+
}
|
|
18
|
+
return await ctx.db
|
|
19
|
+
.query("metrics")
|
|
20
|
+
.withIndex("by_workspace", (q) => q.eq("workspaceId", args.workspaceId))
|
|
21
|
+
.collect();
|
|
22
|
+
},
|
|
23
|
+
});
|
|
24
|
+
/** Get per-dimension score breakdown for a domain */
|
|
25
|
+
export const getDimensionScores = query({
|
|
26
|
+
args: {
|
|
27
|
+
workspaceId: v.string(),
|
|
28
|
+
domain: v.string(),
|
|
29
|
+
},
|
|
30
|
+
handler: async (ctx, args) => {
|
|
31
|
+
const metric = await ctx.db
|
|
32
|
+
.query("metrics")
|
|
33
|
+
.withIndex("by_workspace_domain", (q) => q.eq("workspaceId", args.workspaceId).eq("domain", args.domain))
|
|
34
|
+
.first();
|
|
35
|
+
if (!metric)
|
|
36
|
+
return null;
|
|
37
|
+
const data = metric.data;
|
|
38
|
+
return data.dimensionScores ?? null;
|
|
39
|
+
},
|
|
40
|
+
});
|
|
41
|
+
/** Get CVR monetary potential breakdown */
|
|
42
|
+
export const getMonetaryPotential = query({
|
|
43
|
+
args: {
|
|
44
|
+
workspaceId: v.string(),
|
|
45
|
+
domain: v.optional(v.string()),
|
|
46
|
+
},
|
|
47
|
+
handler: async (ctx, args) => {
|
|
48
|
+
if (args.domain) {
|
|
49
|
+
const metric = await ctx.db
|
|
50
|
+
.query("metrics")
|
|
51
|
+
.withIndex("by_workspace_domain", (q) => q.eq("workspaceId", args.workspaceId).eq("domain", args.domain))
|
|
52
|
+
.first();
|
|
53
|
+
if (!metric)
|
|
54
|
+
return null;
|
|
55
|
+
const data = metric.data;
|
|
56
|
+
return data.monetaryPotential ?? null;
|
|
57
|
+
}
|
|
58
|
+
// Aggregate across all domains
|
|
59
|
+
const metrics = await ctx.db
|
|
60
|
+
.query("metrics")
|
|
61
|
+
.withIndex("by_workspace", (q) => q.eq("workspaceId", args.workspaceId))
|
|
62
|
+
.collect();
|
|
63
|
+
return metrics.map((m) => ({
|
|
64
|
+
domain: m.domain,
|
|
65
|
+
monetaryPotential: m.data.monetaryPotential,
|
|
66
|
+
}));
|
|
67
|
+
},
|
|
68
|
+
});
|
|
69
|
+
/** Return full dashboard data structure for a workspace */
|
|
70
|
+
export const getDashboardData = query({
|
|
71
|
+
args: {
|
|
72
|
+
workspaceId: v.string(),
|
|
73
|
+
},
|
|
74
|
+
handler: async (ctx, args) => {
|
|
75
|
+
const metrics = await ctx.db
|
|
76
|
+
.query("metrics")
|
|
77
|
+
.withIndex("by_workspace", (q) => q.eq("workspaceId", args.workspaceId))
|
|
78
|
+
.collect();
|
|
79
|
+
const snapshots = await ctx.db
|
|
80
|
+
.query("snapshots")
|
|
81
|
+
.withIndex("by_workspace", (q) => q.eq("workspaceId", args.workspaceId))
|
|
82
|
+
.collect();
|
|
83
|
+
const domainData = {};
|
|
84
|
+
for (const m of metrics) {
|
|
85
|
+
domainData[m.domain] = m.data;
|
|
86
|
+
}
|
|
87
|
+
// Overall cross-domain summary
|
|
88
|
+
let totalDimScore = 0;
|
|
89
|
+
let totalMaxScore = 0;
|
|
90
|
+
for (const d of DOMAINS) {
|
|
91
|
+
const data = domainData[d.key];
|
|
92
|
+
if (data?.dimensionScores) {
|
|
93
|
+
const scores = data.dimensionScores;
|
|
94
|
+
for (const dim of Object.values(scores)) {
|
|
95
|
+
totalDimScore += dim.status;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
totalMaxScore += d.maxScore;
|
|
99
|
+
}
|
|
100
|
+
const overallScore = totalMaxScore > 0 ? (totalDimScore / totalMaxScore) * 4 : 0;
|
|
101
|
+
return {
|
|
102
|
+
domains: domainData,
|
|
103
|
+
overall: {
|
|
104
|
+
score: Math.round(overallScore * 100) / 100,
|
|
105
|
+
maturityLevels: MATURITY_LEVELS,
|
|
106
|
+
},
|
|
107
|
+
snapshotCount: snapshots.length,
|
|
108
|
+
lastSnapshotAt: snapshots.length > 0
|
|
109
|
+
? Math.max(...snapshots.map((s) => s.snapshotAt))
|
|
110
|
+
: null,
|
|
111
|
+
};
|
|
112
|
+
},
|
|
113
|
+
});
|
|
114
|
+
/** Return mode-appropriate system prompt text for AI injection */
|
|
115
|
+
export const getSystemPrompt = query({
|
|
116
|
+
args: {
|
|
117
|
+
workspaceType: v.string(),
|
|
118
|
+
},
|
|
119
|
+
handler: async (ctx, args) => {
|
|
120
|
+
const wt = args.workspaceType;
|
|
121
|
+
if (wt === "Project") {
|
|
122
|
+
return `## DOBT+ 5DoBT Potential Analysis
|
|
123
|
+
You are assisting with a 5DoBT Potential Analysis. Guide the user through the 7-step process:
|
|
124
|
+
1. Project Charter — define goal, business case, scope
|
|
125
|
+
2. Definition of Done — target states with effect types
|
|
126
|
+
3. Influence Areas — identify relevant sub-areas from 5 DoBT dimensions
|
|
127
|
+
4. Points of Changes — concrete changes creating business value
|
|
128
|
+
5. Fields of Action — action measures with SP/NSP classification
|
|
129
|
+
6. Potential Status — validate, estimate, calculate potentials
|
|
130
|
+
7. Calculation Summary — financial evaluation with 3-year projection
|
|
131
|
+
|
|
132
|
+
Use the assessment tools to track progress and record findings.`;
|
|
133
|
+
}
|
|
134
|
+
// Excellence Rating mode (KM, EK, DM, Overview)
|
|
135
|
+
const domainLabel = wt === "Overview"
|
|
136
|
+
? "all domains (Kostenmanagement, Einkauf, Digitales Management)"
|
|
137
|
+
: wt === "KM" ? "Kostenmanagement" : wt === "EK" ? "Einkauf" : "Digitales Management";
|
|
138
|
+
return `## DOBT+ Excellence Rating Assessment
|
|
139
|
+
You are conducting a DOBT+ Excellence Rating assessment for ${domainLabel}.
|
|
140
|
+
|
|
141
|
+
The assessment evaluates organizational maturity across methods, systems, guidelines, and expert dimensions on a 4-level scale:
|
|
142
|
+
- **Informativ (1)**: Basic awareness, ad-hoc processes
|
|
143
|
+
- **Steuernd (2)**: Controlled, repeatable processes with defined ownership
|
|
144
|
+
- **Integrativ (3)**: Integrated cross-functional processes, standardized practices
|
|
145
|
+
- **World Class (4)**: Optimized, continuously improving, industry-leading
|
|
146
|
+
|
|
147
|
+
### Your role:
|
|
148
|
+
- Use **getAssessmentStatus** to check current progress when asked
|
|
149
|
+
- Use **getNextQuestions** to identify priority questions to ask
|
|
150
|
+
- When the user provides information about methods, systems, or guidelines in use, use **submitAssessmentAnswer** to record it with an appropriate confidence score
|
|
151
|
+
- Use **getMetrics** to present dimension scores and maturity levels
|
|
152
|
+
- For method/system/guideline questions, gather the 5 sub-aspects: bekannt (known), in Anwendung (in use), definiert/dokumentiert (defined), verankert (anchored), Schulungen (training)
|
|
153
|
+
- Be proactive about gathering data during natural conversation but not overly pushy
|
|
154
|
+
- When presenting results, explain what each maturity level means in practical terms`;
|
|
155
|
+
},
|
|
156
|
+
});
|
|
157
|
+
// ── Snapshot Functions ──
|
|
158
|
+
/** Persist an immutable snapshot */
|
|
159
|
+
export const createSnapshot = internalMutation({
|
|
160
|
+
args: {
|
|
161
|
+
workspaceId: v.string(),
|
|
162
|
+
domain: v.string(),
|
|
163
|
+
snapshotType: v.string(),
|
|
164
|
+
},
|
|
165
|
+
handler: async (ctx, args) => {
|
|
166
|
+
const metric = await ctx.db
|
|
167
|
+
.query("metrics")
|
|
168
|
+
.withIndex("by_workspace_domain", (q) => q.eq("workspaceId", args.workspaceId).eq("domain", args.domain))
|
|
169
|
+
.first();
|
|
170
|
+
if (!metric)
|
|
171
|
+
return null;
|
|
172
|
+
const data = metric.data;
|
|
173
|
+
const config = await ctx.db
|
|
174
|
+
.query("config")
|
|
175
|
+
.withIndex("by_key", (q) => q.eq("key", "dobt-addon"))
|
|
176
|
+
.first();
|
|
177
|
+
return await ctx.db.insert("snapshots", {
|
|
178
|
+
workspaceId: args.workspaceId,
|
|
179
|
+
domain: args.domain,
|
|
180
|
+
dimensionScores: data.dimensionScores,
|
|
181
|
+
overallMaturity: data.overallMaturity,
|
|
182
|
+
monetaryPotential: data.monetaryPotential,
|
|
183
|
+
financialInputs: config?.financialInputs,
|
|
184
|
+
snapshotAt: Date.now(),
|
|
185
|
+
snapshotType: args.snapshotType,
|
|
186
|
+
});
|
|
187
|
+
},
|
|
188
|
+
});
|
|
189
|
+
// ── Dashboard Queries (Section 8) ──
|
|
190
|
+
/** Consultant dashboard — cross-domain view with radar data, priorities, flagged items */
|
|
191
|
+
export const getConsultantDashboard = query({
|
|
192
|
+
args: {
|
|
193
|
+
workspaceId: v.optional(v.string()),
|
|
194
|
+
},
|
|
195
|
+
handler: async (ctx, args) => {
|
|
196
|
+
// If workspaceId given, scope to that workspace; otherwise aggregate all
|
|
197
|
+
let metricsQuery;
|
|
198
|
+
if (args.workspaceId) {
|
|
199
|
+
metricsQuery = await ctx.db
|
|
200
|
+
.query("metrics")
|
|
201
|
+
.withIndex("by_workspace", (q) => q.eq("workspaceId", args.workspaceId))
|
|
202
|
+
.collect();
|
|
203
|
+
}
|
|
204
|
+
else {
|
|
205
|
+
metricsQuery = await ctx.db.query("metrics").collect();
|
|
206
|
+
}
|
|
207
|
+
// Build radar data across all 21 dimensions
|
|
208
|
+
const radarData = {};
|
|
209
|
+
const domainSummaries = {};
|
|
210
|
+
for (const m of metricsQuery) {
|
|
211
|
+
const data = m.data;
|
|
212
|
+
const dimScores = data.dimensionScores;
|
|
213
|
+
const overall = data.overallMaturity;
|
|
214
|
+
const progress = data.progress;
|
|
215
|
+
const monetary = data.monetaryPotential;
|
|
216
|
+
const totals = monetary?.totals;
|
|
217
|
+
const domainDef = DOMAINS.find((d) => d.key === m.domain);
|
|
218
|
+
if (dimScores && domainDef) {
|
|
219
|
+
for (const dim of domainDef.dimensions) {
|
|
220
|
+
const ds = dimScores[dim.key];
|
|
221
|
+
if (ds) {
|
|
222
|
+
radarData[dim.key] = {
|
|
223
|
+
score: ds.status,
|
|
224
|
+
domain: m.domain,
|
|
225
|
+
label: dim.label,
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
domainSummaries[m.domain] = {
|
|
231
|
+
overallScore: overall?.overall_score ?? 0,
|
|
232
|
+
maturityLevel: overall?.maturity_level ?? "not_assessed",
|
|
233
|
+
progress: progress ?? { total: 0, answered: 0, progressPct: 0 },
|
|
234
|
+
totalMonetaryPotential: totals?.total_margin_effect ?? 0,
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
// Improvement priorities — dimensions with largest gap, sorted desc
|
|
238
|
+
const priorities = Object.entries(radarData)
|
|
239
|
+
.map(([key, val]) => ({
|
|
240
|
+
dimensionKey: key,
|
|
241
|
+
domain: val.domain,
|
|
242
|
+
label: val.label,
|
|
243
|
+
score: val.score,
|
|
244
|
+
gap: Math.round((4 - val.score) * 100) / 100,
|
|
245
|
+
}))
|
|
246
|
+
.filter((p) => p.gap > 0)
|
|
247
|
+
.sort((a, b) => b.gap - a.gap)
|
|
248
|
+
.slice(0, 10);
|
|
249
|
+
// Flagged answers — low confidence AI extractions
|
|
250
|
+
let flaggedItems = [];
|
|
251
|
+
if (args.workspaceId) {
|
|
252
|
+
const answers = await ctx.db
|
|
253
|
+
.query("answers")
|
|
254
|
+
.withIndex("by_workspace", (q) => q.eq("workspaceId", args.workspaceId))
|
|
255
|
+
.collect();
|
|
256
|
+
flaggedItems = answers
|
|
257
|
+
.filter((a) => a.source === "ai_extracted" && a.confidence !== undefined && a.confidence < 0.7)
|
|
258
|
+
.map((a) => ({
|
|
259
|
+
questionKey: a.questionKey,
|
|
260
|
+
value: a.value,
|
|
261
|
+
confidence: a.confidence,
|
|
262
|
+
source: a.source,
|
|
263
|
+
}));
|
|
264
|
+
}
|
|
265
|
+
return {
|
|
266
|
+
radarData,
|
|
267
|
+
domainSummaries,
|
|
268
|
+
priorities,
|
|
269
|
+
flaggedItems,
|
|
270
|
+
maturityLevels: MATURITY_LEVELS,
|
|
271
|
+
};
|
|
272
|
+
},
|
|
273
|
+
});
|
|
274
|
+
/** User dashboard — focused workspace view with progress and next questions */
|
|
275
|
+
export const getUserDashboard = query({
|
|
276
|
+
args: {
|
|
277
|
+
workspaceId: v.string(),
|
|
278
|
+
},
|
|
279
|
+
handler: async (ctx, args) => {
|
|
280
|
+
const metrics = await ctx.db
|
|
281
|
+
.query("metrics")
|
|
282
|
+
.withIndex("by_workspace", (q) => q.eq("workspaceId", args.workspaceId))
|
|
283
|
+
.collect();
|
|
284
|
+
// Summary widgets
|
|
285
|
+
let totalAnswered = 0;
|
|
286
|
+
let totalQuestions = 0;
|
|
287
|
+
const domainProgress = {};
|
|
288
|
+
for (const m of metrics) {
|
|
289
|
+
const data = m.data;
|
|
290
|
+
const progress = data.progress;
|
|
291
|
+
const overall = data.overallMaturity;
|
|
292
|
+
if (progress) {
|
|
293
|
+
totalAnswered += progress.answered;
|
|
294
|
+
totalQuestions += progress.total;
|
|
295
|
+
domainProgress[m.domain] = {
|
|
296
|
+
answered: progress.answered,
|
|
297
|
+
total: progress.total,
|
|
298
|
+
pct: progress.progressPct,
|
|
299
|
+
score: overall?.overall_score ?? 0,
|
|
300
|
+
};
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
// Next recommended questions
|
|
304
|
+
const allQuestions = await ctx.db.query("questions").collect();
|
|
305
|
+
const answers = await ctx.db
|
|
306
|
+
.query("answers")
|
|
307
|
+
.withIndex("by_workspace", (q) => q.eq("workspaceId", args.workspaceId))
|
|
308
|
+
.collect();
|
|
309
|
+
const answeredKeys = new Set(answers.map((a) => a.questionKey));
|
|
310
|
+
const nextQuestions = allQuestions
|
|
311
|
+
.filter((q) => !answeredKeys.has(q.questionKey))
|
|
312
|
+
.sort((a, b) => a.sortOrder - b.sortOrder)
|
|
313
|
+
.slice(0, 5)
|
|
314
|
+
.map((q) => ({
|
|
315
|
+
questionKey: q.questionKey,
|
|
316
|
+
domain: q.domain,
|
|
317
|
+
dimension: q.dimension,
|
|
318
|
+
label: q.label,
|
|
319
|
+
}));
|
|
320
|
+
return {
|
|
321
|
+
totalProgress: {
|
|
322
|
+
answered: totalAnswered,
|
|
323
|
+
total: totalQuestions,
|
|
324
|
+
pct: totalQuestions > 0 ? Math.round((totalAnswered / totalQuestions) * 100) : 0,
|
|
325
|
+
},
|
|
326
|
+
domainProgress,
|
|
327
|
+
nextQuestions,
|
|
328
|
+
};
|
|
329
|
+
},
|
|
330
|
+
});
|
|
331
|
+
// ── Overview Workspace Aggregation (Section 9) ──
|
|
332
|
+
/** Aggregate metrics across multiple workspaces for Overview workspace type */
|
|
333
|
+
export const getOverviewDashboard = query({
|
|
334
|
+
args: {
|
|
335
|
+
workspaceIds: v.array(v.string()),
|
|
336
|
+
},
|
|
337
|
+
handler: async (ctx, args) => {
|
|
338
|
+
// Collect metrics from all specified workspaces
|
|
339
|
+
const allMetrics = [];
|
|
340
|
+
for (const wsId of args.workspaceIds) {
|
|
341
|
+
const wsMetrics = await ctx.db
|
|
342
|
+
.query("metrics")
|
|
343
|
+
.withIndex("by_workspace", (q) => q.eq("workspaceId", wsId))
|
|
344
|
+
.collect();
|
|
345
|
+
allMetrics.push(...wsMetrics);
|
|
346
|
+
}
|
|
347
|
+
// Aggregate dimension scores across workspaces (average per dimension)
|
|
348
|
+
const dimAccum = {};
|
|
349
|
+
const domainAccum = {};
|
|
350
|
+
for (const m of allMetrics) {
|
|
351
|
+
const data = m.data;
|
|
352
|
+
const dimScores = data.dimensionScores;
|
|
353
|
+
const overall = data.overallMaturity;
|
|
354
|
+
const monetary = data.monetaryPotential;
|
|
355
|
+
const totals = monetary?.totals;
|
|
356
|
+
if (dimScores) {
|
|
357
|
+
for (const [dimKey, dimData] of Object.entries(dimScores)) {
|
|
358
|
+
if (!dimAccum[dimKey])
|
|
359
|
+
dimAccum[dimKey] = { sum: 0, count: 0, domain: m.domain };
|
|
360
|
+
dimAccum[dimKey].sum += dimData.status;
|
|
361
|
+
dimAccum[dimKey].count++;
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
if (!domainAccum[m.domain])
|
|
365
|
+
domainAccum[m.domain] = { score: 0, count: 0, monetaryTotal: 0 };
|
|
366
|
+
domainAccum[m.domain].score += overall?.overall_score ?? 0;
|
|
367
|
+
domainAccum[m.domain].count++;
|
|
368
|
+
domainAccum[m.domain].monetaryTotal += totals?.total_margin_effect ?? 0;
|
|
369
|
+
}
|
|
370
|
+
// Averaged dimension scores (21 dimensions)
|
|
371
|
+
const aggregatedDimensions = {};
|
|
372
|
+
for (const [dimKey, acc] of Object.entries(dimAccum)) {
|
|
373
|
+
aggregatedDimensions[dimKey] = {
|
|
374
|
+
avgScore: acc.count > 0 ? Math.round((acc.sum / acc.count) * 100) / 100 : 0,
|
|
375
|
+
domain: acc.domain,
|
|
376
|
+
};
|
|
377
|
+
}
|
|
378
|
+
// Domain-level averages
|
|
379
|
+
const domainAverages = {};
|
|
380
|
+
for (const [domain, acc] of Object.entries(domainAccum)) {
|
|
381
|
+
domainAverages[domain] = {
|
|
382
|
+
avgScore: acc.count > 0 ? Math.round((acc.score / acc.count) * 100) / 100 : 0,
|
|
383
|
+
workspaceCount: acc.count,
|
|
384
|
+
totalMonetary: Math.round(acc.monetaryTotal),
|
|
385
|
+
};
|
|
386
|
+
}
|
|
387
|
+
// Overall cross-domain average
|
|
388
|
+
const allDomainScores = Object.values(domainAccum).map((a) => a.count > 0 ? a.score / a.count : 0);
|
|
389
|
+
const overallAvg = allDomainScores.length > 0
|
|
390
|
+
? allDomainScores.reduce((s, v) => s + v, 0) / allDomainScores.length
|
|
391
|
+
: 0;
|
|
392
|
+
const totalMonetary = Object.values(domainAccum).reduce((s, a) => s + a.monetaryTotal, 0);
|
|
393
|
+
return {
|
|
394
|
+
aggregatedDimensions,
|
|
395
|
+
domainAverages,
|
|
396
|
+
overall: {
|
|
397
|
+
avgScore: Math.round(overallAvg * 100) / 100,
|
|
398
|
+
maturityLevel: getMaturityLevel(overallAvg),
|
|
399
|
+
totalMonetaryPotential: Math.round(totalMonetary),
|
|
400
|
+
workspaceCount: args.workspaceIds.length,
|
|
401
|
+
},
|
|
402
|
+
maturityLevels: MATURITY_LEVELS,
|
|
403
|
+
};
|
|
404
|
+
},
|
|
405
|
+
});
|
|
406
|
+
/** List snapshots for a workspace, optionally filtered by domain */
|
|
407
|
+
export const getSnapshots = query({
|
|
408
|
+
args: {
|
|
409
|
+
workspaceId: v.string(),
|
|
410
|
+
domain: v.optional(v.string()),
|
|
411
|
+
},
|
|
412
|
+
handler: async (ctx, args) => {
|
|
413
|
+
if (args.domain) {
|
|
414
|
+
return await ctx.db
|
|
415
|
+
.query("snapshots")
|
|
416
|
+
.withIndex("by_workspace_domain", (q) => q.eq("workspaceId", args.workspaceId).eq("domain", args.domain))
|
|
417
|
+
.collect();
|
|
418
|
+
}
|
|
419
|
+
return await ctx.db
|
|
420
|
+
.query("snapshots")
|
|
421
|
+
.withIndex("by_workspace", (q) => q.eq("workspaceId", args.workspaceId))
|
|
422
|
+
.collect();
|
|
423
|
+
},
|
|
424
|
+
});
|
|
425
|
+
//# sourceMappingURL=metrics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../src/component/metrics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,CAAC,EAAE,MAAM,eAAe,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,eAAe,EAAa,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE3F,gBAAgB;AAEhB,yEAAyE;AACzE,MAAM,CAAC,MAAM,UAAU,GAAG,KAAK,CAAC;IAC9B,IAAI,EAAE;QACJ,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;QACvB,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;KAC/B;IACD,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QAC3B,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,OAAO,MAAM,GAAG,CAAC,EAAE;iBAChB,KAAK,CAAC,SAAS,CAAC;iBAChB,SAAS,CAAC,qBAAqB,EAAE,CAAC,CAAC,EAAE,EAAE,CACtC,CAAC,CAAC,EAAE,CAAC,aAAa,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAO,CAAC,CACjE;iBACA,KAAK,EAAE,CAAC;QACb,CAAC;QACD,OAAO,MAAM,GAAG,CAAC,EAAE;aAChB,KAAK,CAAC,SAAS,CAAC;aAChB,SAAS,CAAC,cAAc,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,aAAa,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;aACvE,OAAO,EAAE,CAAC;IACf,CAAC;CACF,CAAC,CAAC;AAEH,qDAAqD;AACrD,MAAM,CAAC,MAAM,kBAAkB,GAAG,KAAK,CAAC;IACtC,IAAI,EAAE;QACJ,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;QACvB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;KACnB;IACD,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QAC3B,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,EAAE;aACxB,KAAK,CAAC,SAAS,CAAC;aAChB,SAAS,CAAC,qBAAqB,EAAE,CAAC,CAAC,EAAE,EAAE,CACtC,CAAC,CAAC,EAAE,CAAC,aAAa,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,CAChE;aACA,KAAK,EAAE,CAAC;QACX,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC;QACzB,MAAM,IAAI,GAAG,MAAM,CAAC,IAA+B,CAAC;QACpD,OAAO,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC;IACtC,CAAC;CACF,CAAC,CAAC;AAEH,2CAA2C;AAC3C,MAAM,CAAC,MAAM,oBAAoB,GAAG,KAAK,CAAC;IACxC,IAAI,EAAE;QACJ,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;QACvB,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;KAC/B;IACD,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QAC3B,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,EAAE;iBACxB,KAAK,CAAC,SAAS,CAAC;iBAChB,SAAS,CAAC,qBAAqB,EAAE,CAAC,CAAC,EAAE,EAAE,CACtC,CAAC,CAAC,EAAE,CAAC,aAAa,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAO,CAAC,CACjE;iBACA,KAAK,EAAE,CAAC;YACX,IAAI,CAAC,MAAM;gBAAE,OAAO,IAAI,CAAC;YACzB,MAAM,IAAI,GAAG,MAAM,CAAC,IAA+B,CAAC;YACpD,OAAO,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC;QACxC,CAAC;QACD,+BAA+B;QAC/B,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,EAAE;aACzB,KAAK,CAAC,SAAS,CAAC;aAChB,SAAS,CAAC,cAAc,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,aAAa,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;aACvE,OAAO,EAAE,CAAC;QACb,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACzB,MAAM,EAAE,CAAC,CAAC,MAAM;YAChB,iBAAiB,EAAG,CAAC,CAAC,IAAgC,CAAC,iBAAiB;SACzE,CAAC,CAAC,CAAC;IACN,CAAC;CACF,CAAC,CAAC;AAEH,2DAA2D;AAC3D,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,CAAC;IACpC,IAAI,EAAE;QACJ,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;KACxB;IACD,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QAC3B,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,EAAE;aACzB,KAAK,CAAC,SAAS,CAAC;aAChB,SAAS,CAAC,cAAc,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,aAAa,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;aACvE,OAAO,EAAE,CAAC;QAEb,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,EAAE;aAC3B,KAAK,CAAC,WAAW,CAAC;aAClB,SAAS,CAAC,cAAc,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,aAAa,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;aACvE,OAAO,EAAE,CAAC;QAEb,MAAM,UAAU,GAA4B,EAAE,CAAC;QAC/C,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;QAChC,CAAC;QAED,+BAA+B;QAC/B,IAAI,aAAa,GAAG,CAAC,CAAC;QACtB,IAAI,aAAa,GAAG,CAAC,CAAC;QACtB,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,CAAwC,CAAC;YACtE,IAAI,IAAI,EAAE,eAAe,EAAE,CAAC;gBAC1B,MAAM,MAAM,GAAG,IAAI,CAAC,eAAqD,CAAC;gBAC1E,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;oBACxC,aAAa,IAAI,GAAG,CAAC,MAAM,CAAC;gBAC9B,CAAC;YACH,CAAC;YACD,aAAa,IAAI,CAAC,CAAC,QAAQ,CAAC;QAC9B,CAAC;QAED,MAAM,YAAY,GAAG,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAEjF,OAAO;YACL,OAAO,EAAE,UAAU;YACnB,OAAO,EAAE;gBACP,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,GAAG,CAAC,GAAG,GAAG;gBAC3C,cAAc,EAAE,eAAe;aAChC;YACD,aAAa,EAAE,SAAS,CAAC,MAAM;YAC/B,cAAc,EAAE,SAAS,CAAC,MAAM,GAAG,CAAC;gBAClC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;gBACjD,CAAC,CAAC,IAAI;SACT,CAAC;IACJ,CAAC;CACF,CAAC,CAAC;AAEH,kEAAkE;AAClE,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,CAAC;IACnC,IAAI,EAAE;QACJ,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE;KAC1B;IACD,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QAC3B,MAAM,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC;QAE9B,IAAI,EAAE,KAAK,SAAS,EAAE,CAAC;YACrB,OAAO;;;;;;;;;;gEAUmD,CAAC;QAC7D,CAAC;QAED,gDAAgD;QAChD,MAAM,WAAW,GAAG,EAAE,KAAK,UAAU;YACnC,CAAC,CAAC,+DAA+D;YACjE,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,sBAAsB,CAAC;QAExF,OAAO;8DACmD,WAAW;;;;;;;;;;;;;;;qFAeY,CAAC;IACpF,CAAC;CACF,CAAC,CAAC;AAEH,2BAA2B;AAE3B,oCAAoC;AACpC,MAAM,CAAC,MAAM,cAAc,GAAG,gBAAgB,CAAC;IAC7C,IAAI,EAAE;QACJ,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;QACvB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;QAClB,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE;KACzB;IACD,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QAC3B,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,EAAE;aACxB,KAAK,CAAC,SAAS,CAAC;aAChB,SAAS,CAAC,qBAAqB,EAAE,CAAC,CAAC,EAAE,EAAE,CACtC,CAAC,CAAC,EAAE,CAAC,aAAa,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,CAChE;aACA,KAAK,EAAE,CAAC;QACX,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC;QAEzB,MAAM,IAAI,GAAG,MAAM,CAAC,IAA+B,CAAC;QACpD,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,EAAE;aACxB,KAAK,CAAC,QAAQ,CAAC;aACf,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;aACrD,KAAK,EAAE,CAAC;QAEX,OAAO,MAAM,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,WAAW,EAAE;YACtC,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,eAAe,EAAE,IAAI,CAAC,eAAe;YACrC,eAAe,EAAE,IAAI,CAAC,eAAe;YACrC,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;YACzC,eAAe,EAAE,MAAM,EAAE,eAAe;YACxC,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE;YACtB,YAAY,EAAE,IAAI,CAAC,YAAY;SAChC,CAAC,CAAC;IACL,CAAC;CACF,CAAC,CAAC;AAEH,sCAAsC;AAEtC,0FAA0F;AAC1F,MAAM,CAAC,MAAM,sBAAsB,GAAG,KAAK,CAAC;IAC1C,IAAI,EAAE;QACJ,WAAW,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;KACpC;IACD,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QAC3B,yEAAyE;QACzE,IAAI,YAAY,CAAC;QACjB,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,YAAY,GAAG,MAAM,GAAG,CAAC,EAAE;iBACxB,KAAK,CAAC,SAAS,CAAC;iBAChB,SAAS,CAAC,cAAc,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,aAAa,EAAE,IAAI,CAAC,WAAY,CAAC,CAAC;iBACxE,OAAO,EAAE,CAAC;QACf,CAAC;aAAM,CAAC;YACN,YAAY,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC;QACzD,CAAC;QAED,4CAA4C;QAC5C,MAAM,SAAS,GAAqE,EAAE,CAAC;QACvF,MAAM,eAAe,GAKhB,EAAE,CAAC;QAER,KAAK,MAAM,CAAC,IAAI,YAAY,EAAE,CAAC;YAC7B,MAAM,IAAI,GAAG,CAAC,CAAC,IAA+B,CAAC;YAC/C,MAAM,SAAS,GAAG,IAAI,CAAC,eAAiE,CAAC;YACzF,MAAM,OAAO,GAAG,IAAI,CAAC,eAAgF,CAAC;YACtG,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAgF,CAAC;YACvG,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAwD,CAAC;YAC/E,MAAM,MAAM,GAAG,QAAQ,EAAE,MAAqD,CAAC;YAE/E,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC;YAC1D,IAAI,SAAS,IAAI,SAAS,EAAE,CAAC;gBAC3B,KAAK,MAAM,GAAG,IAAI,SAAS,CAAC,UAAU,EAAE,CAAC;oBACvC,MAAM,EAAE,GAAG,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;oBAC9B,IAAI,EAAE,EAAE,CAAC;wBACP,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG;4BACnB,KAAK,EAAE,EAAE,CAAC,MAAM;4BAChB,MAAM,EAAE,CAAC,CAAC,MAAM;4BAChB,KAAK,EAAE,GAAG,CAAC,KAAK;yBACjB,CAAC;oBACJ,CAAC;gBACH,CAAC;YACH,CAAC;YAED,eAAe,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG;gBAC1B,YAAY,EAAE,OAAO,EAAE,aAAa,IAAI,CAAC;gBACzC,aAAa,EAAE,OAAO,EAAE,cAAc,IAAI,cAAc;gBACxD,QAAQ,EAAE,QAAQ,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE;gBAC/D,sBAAsB,EAAE,MAAM,EAAE,mBAAmB,IAAI,CAAC;aACzD,CAAC;QACJ,CAAC;QAED,oEAAoE;QACpE,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC;aACzC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;YACpB,YAAY,EAAE,GAAG;YACjB,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG;SAC7C,CAAC,CAAC;aACF,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;aACxB,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC;aAC7B,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAEhB,kDAAkD;QAClD,IAAI,YAAY,GAAuF,EAAE,CAAC;QAC1G,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,EAAE;iBACzB,KAAK,CAAC,SAAS,CAAC;iBAChB,SAAS,CAAC,cAAc,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,aAAa,EAAE,IAAI,CAAC,WAAY,CAAC,CAAC;iBACxE,OAAO,EAAE,CAAC;YACb,YAAY,GAAG,OAAO;iBACnB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,cAAc,IAAI,CAAC,CAAC,UAAU,KAAK,SAAS,IAAI,CAAC,CAAC,UAAU,GAAG,GAAG,CAAC;iBAC9F,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACX,WAAW,EAAE,CAAC,CAAC,WAAW;gBAC1B,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,UAAU,EAAE,CAAC,CAAC,UAAW;gBACzB,MAAM,EAAE,CAAC,CAAC,MAAM;aACjB,CAAC,CAAC,CAAC;QACR,CAAC;QAED,OAAO;YACL,SAAS;YACT,eAAe;YACf,UAAU;YACV,YAAY;YACZ,cAAc,EAAE,eAAe;SAChC,CAAC;IACJ,CAAC;CACF,CAAC,CAAC;AAEH,+EAA+E;AAC/E,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,CAAC;IACpC,IAAI,EAAE;QACJ,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;KACxB;IACD,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QAC3B,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,EAAE;aACzB,KAAK,CAAC,SAAS,CAAC;aAChB,SAAS,CAAC,cAAc,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,aAAa,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;aACvE,OAAO,EAAE,CAAC;QAEb,kBAAkB;QAClB,IAAI,aAAa,GAAG,CAAC,CAAC;QACtB,IAAI,cAAc,GAAG,CAAC,CAAC;QACvB,MAAM,cAAc,GAAoF,EAAE,CAAC;QAE3G,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,MAAM,IAAI,GAAG,CAAC,CAAC,IAA+B,CAAC;YAC/C,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAgF,CAAC;YACvG,MAAM,OAAO,GAAG,IAAI,CAAC,eAAwD,CAAC;YAE9E,IAAI,QAAQ,EAAE,CAAC;gBACb,aAAa,IAAI,QAAQ,CAAC,QAAQ,CAAC;gBACnC,cAAc,IAAI,QAAQ,CAAC,KAAK,CAAC;gBACjC,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG;oBACzB,QAAQ,EAAE,QAAQ,CAAC,QAAQ;oBAC3B,KAAK,EAAE,QAAQ,CAAC,KAAK;oBACrB,GAAG,EAAE,QAAQ,CAAC,WAAW;oBACzB,KAAK,EAAE,OAAO,EAAE,aAAa,IAAI,CAAC;iBACnC,CAAC;YACJ,CAAC;QACH,CAAC;QAED,6BAA6B;QAC7B,MAAM,YAAY,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,OAAO,EAAE,CAAC;QAC/D,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,EAAE;aACzB,KAAK,CAAC,SAAS,CAAC;aAChB,SAAS,CAAC,cAAc,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,aAAa,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;aACvE,OAAO,EAAE,CAAC;QACb,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;QAEhE,MAAM,aAAa,GAAG,YAAY;aAC/B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;aAC/C,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC;aACzC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;aACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACX,WAAW,EAAE,CAAC,CAAC,WAAW;YAC1B,MAAM,EAAE,CAAC,CAAC,MAAM;YAChB,SAAS,EAAE,CAAC,CAAC,SAAS;YACtB,KAAK,EAAE,CAAC,CAAC,KAAK;SACf,CAAC,CAAC,CAAC;QAEN,OAAO;YACL,aAAa,EAAE;gBACb,QAAQ,EAAE,aAAa;gBACvB,KAAK,EAAE,cAAc;gBACrB,GAAG,EAAE,cAAc,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,aAAa,GAAG,cAAc,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;aACjF;YACD,cAAc;YACd,aAAa;SACd,CAAC;IACJ,CAAC;CACF,CAAC,CAAC;AAEH,mDAAmD;AAEnD,+EAA+E;AAC/E,MAAM,CAAC,MAAM,oBAAoB,GAAG,KAAK,CAAC;IACxC,IAAI,EAAE;QACJ,YAAY,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;KAClC;IACD,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QAC3B,gDAAgD;QAChD,MAAM,UAAU,GAAG,EAAE,CAAC;QACtB,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACrC,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,EAAE;iBAC3B,KAAK,CAAC,SAAS,CAAC;iBAChB,SAAS,CAAC,cAAc,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;iBAC3D,OAAO,EAAE,CAAC;YACb,UAAU,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,CAAC;QAChC,CAAC;QAED,uEAAuE;QACvE,MAAM,QAAQ,GAAmE,EAAE,CAAC;QACpF,MAAM,WAAW,GAA4E,EAAE,CAAC;QAEhG,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;YAC3B,MAAM,IAAI,GAAG,CAAC,CAAC,IAA+B,CAAC;YAC/C,MAAM,SAAS,GAAG,IAAI,CAAC,eAAiE,CAAC;YACzF,MAAM,OAAO,GAAG,IAAI,CAAC,eAAwD,CAAC;YAC9E,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAwD,CAAC;YAC/E,MAAM,MAAM,GAAG,QAAQ,EAAE,MAAqD,CAAC;YAE/E,IAAI,SAAS,EAAE,CAAC;gBACd,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;oBAC1D,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;wBAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;oBACjF,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC;oBACvC,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,CAAC;gBAC3B,CAAC;YACH,CAAC;YAED,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC;gBAAE,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,CAAC;YAC7F,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,IAAI,OAAO,EAAE,aAAa,IAAI,CAAC,CAAC;YAC3D,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,CAAC;YAC9B,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,aAAa,IAAI,MAAM,EAAE,mBAAmB,IAAI,CAAC,CAAC;QAC1E,CAAC;QAED,4CAA4C;QAC5C,MAAM,oBAAoB,GAAyD,EAAE,CAAC;QACtF,KAAK,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;YACrD,oBAAoB,CAAC,MAAM,CAAC,GAAG;gBAC7B,QAAQ,EAAE,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;gBAC3E,MAAM,EAAE,GAAG,CAAC,MAAM;aACnB,CAAC;QACJ,CAAC;QAED,wBAAwB;QACxB,MAAM,cAAc,GAAwF,EAAE,CAAC;QAC/G,KAAK,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;YACxD,cAAc,CAAC,MAAM,CAAC,GAAG;gBACvB,QAAQ,EAAE,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;gBAC7E,cAAc,EAAE,GAAG,CAAC,KAAK;gBACzB,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,CAAC;aAC7C,CAAC;QACJ,CAAC;QAED,+BAA+B;QAC/B,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACnG,MAAM,UAAU,GAAG,eAAe,CAAC,MAAM,GAAG,CAAC;YAC3C,CAAC,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,eAAe,CAAC,MAAM;YACrE,CAAC,CAAC,CAAC,CAAC;QAEN,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;QAE1F,OAAO;YACL,oBAAoB;YACpB,cAAc;YACd,OAAO,EAAE;gBACP,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,GAAG,CAAC,GAAG,GAAG;gBAC5C,aAAa,EAAE,gBAAgB,CAAC,UAAU,CAAC;gBAC3C,sBAAsB,EAAE,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC;gBACjD,cAAc,EAAE,IAAI,CAAC,YAAY,CAAC,MAAM;aACzC;YACD,cAAc,EAAE,eAAe;SAChC,CAAC;IACJ,CAAC;CACF,CAAC,CAAC;AAEH,oEAAoE;AACpE,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,CAAC;IAChC,IAAI,EAAE;QACJ,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;QACvB,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;KAC/B;IACD,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QAC3B,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,OAAO,MAAM,GAAG,CAAC,EAAE;iBAChB,KAAK,CAAC,WAAW,CAAC;iBAClB,SAAS,CAAC,qBAAqB,EAAE,CAAC,CAAC,EAAE,EAAE,CACtC,CAAC,CAAC,EAAE,CAAC,aAAa,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAO,CAAC,CACjE;iBACA,OAAO,EAAE,CAAC;QACf,CAAC;QACD,OAAO,MAAM,GAAG,CAAC,EAAE;aAChB,KAAK,CAAC,WAAW,CAAC;aAClB,SAAS,CAAC,cAAc,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,aAAa,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;aACvE,OAAO,EAAE,CAAC;IACf,CAAC;CACF,CAAC,CAAC"}
|