mcp-grampsweb 1.0.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.
Files changed (67) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +133 -0
  3. package/dist/auth.d.ts +37 -0
  4. package/dist/auth.d.ts.map +1 -0
  5. package/dist/auth.js +119 -0
  6. package/dist/auth.js.map +1 -0
  7. package/dist/client.d.ts +44 -0
  8. package/dist/client.d.ts.map +1 -0
  9. package/dist/client.js +153 -0
  10. package/dist/client.js.map +1 -0
  11. package/dist/config.d.ts +11 -0
  12. package/dist/config.d.ts.map +1 -0
  13. package/dist/config.js +32 -0
  14. package/dist/config.js.map +1 -0
  15. package/dist/constants.d.ts +24 -0
  16. package/dist/constants.d.ts.map +1 -0
  17. package/dist/constants.js +50 -0
  18. package/dist/constants.js.map +1 -0
  19. package/dist/index.d.ts +9 -0
  20. package/dist/index.d.ts.map +1 -0
  21. package/dist/index.js +132 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/schemas/common.d.ts +308 -0
  24. package/dist/schemas/common.d.ts.map +1 -0
  25. package/dist/schemas/common.js +120 -0
  26. package/dist/schemas/common.js.map +1 -0
  27. package/dist/schemas/entities.d.ts +1165 -0
  28. package/dist/schemas/entities.d.ts.map +1 -0
  29. package/dist/schemas/entities.js +125 -0
  30. package/dist/schemas/entities.js.map +1 -0
  31. package/dist/schemas/index.d.ts +7 -0
  32. package/dist/schemas/index.d.ts.map +1 -0
  33. package/dist/schemas/index.js +7 -0
  34. package/dist/schemas/index.js.map +1 -0
  35. package/dist/schemas/search.d.ts +47 -0
  36. package/dist/schemas/search.d.ts.map +1 -0
  37. package/dist/schemas/search.js +24 -0
  38. package/dist/schemas/search.js.map +1 -0
  39. package/dist/tools/analysis.d.ts +115 -0
  40. package/dist/tools/analysis.d.ts.map +1 -0
  41. package/dist/tools/analysis.js +387 -0
  42. package/dist/tools/analysis.js.map +1 -0
  43. package/dist/tools/create.d.ts +355 -0
  44. package/dist/tools/create.d.ts.map +1 -0
  45. package/dist/tools/create.js +547 -0
  46. package/dist/tools/create.js.map +1 -0
  47. package/dist/tools/index.d.ts +468 -0
  48. package/dist/tools/index.d.ts.map +1 -0
  49. package/dist/tools/index.js +17 -0
  50. package/dist/tools/index.js.map +1 -0
  51. package/dist/tools/search.d.ts +95 -0
  52. package/dist/tools/search.d.ts.map +1 -0
  53. package/dist/tools/search.js +161 -0
  54. package/dist/tools/search.js.map +1 -0
  55. package/dist/types.d.ts +210 -0
  56. package/dist/types.d.ts.map +1 -0
  57. package/dist/types.js +5 -0
  58. package/dist/types.js.map +1 -0
  59. package/dist/utils/errors.d.ts +19 -0
  60. package/dist/utils/errors.d.ts.map +1 -0
  61. package/dist/utils/errors.js +48 -0
  62. package/dist/utils/errors.js.map +1 -0
  63. package/dist/utils/formatting.d.ts +60 -0
  64. package/dist/utils/formatting.d.ts.map +1 -0
  65. package/dist/utils/formatting.js +256 -0
  66. package/dist/utils/formatting.js.map +1 -0
  67. package/package.json +48 -0
@@ -0,0 +1,387 @@
1
+ /**
2
+ * Analysis tools for genealogy tree exploration
3
+ */
4
+ import { z } from "zod";
5
+ import { grampsClient } from "../client.js";
6
+ import { API_ENDPOINTS } from "../constants.js";
7
+ import { formatPersonName } from "../utils/formatting.js";
8
+ // Schema for ancestor/descendant queries
9
+ const lineageSchema = z.object({
10
+ handle: z.string().describe("Person handle to start from"),
11
+ generations: z
12
+ .number()
13
+ .int()
14
+ .positive()
15
+ .max(10)
16
+ .default(3)
17
+ .describe("Number of generations to retrieve (max 10)"),
18
+ });
19
+ // Schema for recent changes
20
+ const recentChangesSchema = z.object({
21
+ page: z.number().int().positive().default(1).describe("Page number"),
22
+ pagesize: z.number().int().positive().max(100).default(20).describe("Results per page"),
23
+ });
24
+ /**
25
+ * Get tree statistics
26
+ */
27
+ export async function grampsTreeStats() {
28
+ // Fetch counts for each entity type
29
+ const entityTypes = [
30
+ "people",
31
+ "families",
32
+ "events",
33
+ "places",
34
+ "sources",
35
+ "citations",
36
+ "repositories",
37
+ "media",
38
+ "notes",
39
+ ];
40
+ const stats = {
41
+ people: 0,
42
+ families: 0,
43
+ events: 0,
44
+ places: 0,
45
+ sources: 0,
46
+ citations: 0,
47
+ repositories: 0,
48
+ media: 0,
49
+ notes: 0,
50
+ };
51
+ // Fetch metadata which includes counts
52
+ try {
53
+ const metadata = await grampsClient.get(API_ENDPOINTS.METADATA);
54
+ // Try to extract counts from metadata
55
+ for (const type of entityTypes) {
56
+ const countKey = `${type}_count`;
57
+ if (typeof metadata[countKey] === "number") {
58
+ stats[type] = metadata[countKey];
59
+ }
60
+ }
61
+ }
62
+ catch {
63
+ // Fallback: fetch each entity type with pagesize=1 to get total count
64
+ for (const type of entityTypes) {
65
+ try {
66
+ const response = await grampsClient.get(API_ENDPOINTS[type.toUpperCase()] || `/${type}/`, { pagesize: 1 });
67
+ // The response might include total_count header or we count the array
68
+ if (Array.isArray(response)) {
69
+ // This is a rough estimate - actual count would need pagination
70
+ stats[type] = response.length;
71
+ }
72
+ }
73
+ catch {
74
+ // Ignore errors for individual entity types
75
+ }
76
+ }
77
+ }
78
+ const lines = [
79
+ "Family Tree Statistics:",
80
+ "",
81
+ ` People: ${stats.people.toLocaleString()}`,
82
+ ` Families: ${stats.families.toLocaleString()}`,
83
+ ` Events: ${stats.events.toLocaleString()}`,
84
+ ` Places: ${stats.places.toLocaleString()}`,
85
+ ` Sources: ${stats.sources.toLocaleString()}`,
86
+ ` Citations: ${stats.citations.toLocaleString()}`,
87
+ ` Repositories: ${stats.repositories.toLocaleString()}`,
88
+ ` Media: ${stats.media.toLocaleString()}`,
89
+ ` Notes: ${stats.notes.toLocaleString()}`,
90
+ ];
91
+ return lines.join("\n");
92
+ }
93
+ /**
94
+ * Get ancestors of a person
95
+ */
96
+ export async function grampsGetAncestors(params) {
97
+ const { handle, generations } = lineageSchema.parse(params);
98
+ const ancestors = [];
99
+ // Queue for BFS traversal: [personHandle, generation, relationship]
100
+ const queue = [[handle, 0, "Self"]];
101
+ const visited = new Set();
102
+ while (queue.length > 0) {
103
+ const [currentHandle, gen, rel] = queue.shift();
104
+ if (visited.has(currentHandle) || gen > generations) {
105
+ continue;
106
+ }
107
+ visited.add(currentHandle);
108
+ try {
109
+ // Get person
110
+ const person = await grampsClient.get(`${API_ENDPOINTS.PEOPLE}${currentHandle}`);
111
+ ancestors.push({
112
+ generation: gen,
113
+ person,
114
+ relationship: rel,
115
+ });
116
+ // Get parent families
117
+ if (person.parent_family_list && gen < generations) {
118
+ for (const familyHandle of person.parent_family_list) {
119
+ try {
120
+ const family = await grampsClient.get(`${API_ENDPOINTS.FAMILIES}${familyHandle}`);
121
+ if (family.father_handle && !visited.has(family.father_handle)) {
122
+ const fatherRel = gen === 0
123
+ ? "Father"
124
+ : gen === 1
125
+ ? "Grandfather"
126
+ : `${gen + 1}x Great-Grandfather`;
127
+ queue.push([family.father_handle, gen + 1, fatherRel]);
128
+ }
129
+ if (family.mother_handle && !visited.has(family.mother_handle)) {
130
+ const motherRel = gen === 0
131
+ ? "Mother"
132
+ : gen === 1
133
+ ? "Grandmother"
134
+ : `${gen + 1}x Great-Grandmother`;
135
+ queue.push([family.mother_handle, gen + 1, motherRel]);
136
+ }
137
+ }
138
+ catch {
139
+ // Family not found, skip
140
+ }
141
+ }
142
+ }
143
+ }
144
+ catch {
145
+ // Person not found, skip
146
+ }
147
+ }
148
+ // Format output
149
+ if (ancestors.length === 0) {
150
+ return "No ancestors found.";
151
+ }
152
+ const lines = [`Found ${ancestors.length} ancestor(s) up to ${generations} generation(s):`, ""];
153
+ // Group by generation
154
+ const byGen = new Map();
155
+ for (const a of ancestors) {
156
+ if (!byGen.has(a.generation)) {
157
+ byGen.set(a.generation, []);
158
+ }
159
+ byGen.get(a.generation).push(a);
160
+ }
161
+ for (let g = 0; g <= generations; g++) {
162
+ const genAncestors = byGen.get(g);
163
+ if (genAncestors && genAncestors.length > 0) {
164
+ lines.push(`Generation ${g}:`);
165
+ for (const a of genAncestors) {
166
+ lines.push(` ${a.relationship}: ${formatPersonName(a.person.primary_name)} (${a.person.gramps_id})`);
167
+ }
168
+ lines.push("");
169
+ }
170
+ }
171
+ return lines.join("\n");
172
+ }
173
+ /**
174
+ * Get descendants of a person
175
+ */
176
+ export async function grampsGetDescendants(params) {
177
+ const { handle, generations } = lineageSchema.parse(params);
178
+ const descendants = [];
179
+ // Queue for BFS traversal
180
+ const queue = [[handle, 0, "Self"]];
181
+ const visited = new Set();
182
+ while (queue.length > 0) {
183
+ const [currentHandle, gen, rel] = queue.shift();
184
+ if (visited.has(currentHandle) || gen > generations) {
185
+ continue;
186
+ }
187
+ visited.add(currentHandle);
188
+ try {
189
+ // Get person
190
+ const person = await grampsClient.get(`${API_ENDPOINTS.PEOPLE}${currentHandle}`);
191
+ descendants.push({
192
+ generation: gen,
193
+ person,
194
+ relationship: rel,
195
+ });
196
+ // Get families where this person is a parent
197
+ if (person.family_list && gen < generations) {
198
+ for (const familyHandle of person.family_list) {
199
+ try {
200
+ const family = await grampsClient.get(`${API_ENDPOINTS.FAMILIES}${familyHandle}`);
201
+ if (family.child_ref_list) {
202
+ for (const childRef of family.child_ref_list) {
203
+ if (childRef.ref && !visited.has(childRef.ref)) {
204
+ const childRel = gen === 0
205
+ ? "Child"
206
+ : gen === 1
207
+ ? "Grandchild"
208
+ : `${gen + 1}x Great-Grandchild`;
209
+ queue.push([childRef.ref, gen + 1, childRel]);
210
+ }
211
+ }
212
+ }
213
+ }
214
+ catch {
215
+ // Family not found, skip
216
+ }
217
+ }
218
+ }
219
+ }
220
+ catch {
221
+ // Person not found, skip
222
+ }
223
+ }
224
+ // Format output
225
+ if (descendants.length === 0) {
226
+ return "No descendants found.";
227
+ }
228
+ const lines = [
229
+ `Found ${descendants.length} descendant(s) up to ${generations} generation(s):`,
230
+ "",
231
+ ];
232
+ // Group by generation
233
+ const byGen = new Map();
234
+ for (const d of descendants) {
235
+ if (!byGen.has(d.generation)) {
236
+ byGen.set(d.generation, []);
237
+ }
238
+ byGen.get(d.generation).push(d);
239
+ }
240
+ for (let g = 0; g <= generations; g++) {
241
+ const genDescendants = byGen.get(g);
242
+ if (genDescendants && genDescendants.length > 0) {
243
+ lines.push(`Generation ${g}:`);
244
+ for (const d of genDescendants) {
245
+ lines.push(` ${d.relationship}: ${formatPersonName(d.person.primary_name)} (${d.person.gramps_id})`);
246
+ }
247
+ lines.push("");
248
+ }
249
+ }
250
+ return lines.join("\n");
251
+ }
252
+ /**
253
+ * Get recent changes
254
+ */
255
+ export async function grampsRecentChanges(params) {
256
+ const { page, pagesize } = recentChangesSchema.parse(params);
257
+ try {
258
+ const response = await grampsClient.get(API_ENDPOINTS.RECENT, {
259
+ page,
260
+ pagesize,
261
+ });
262
+ if (!response || response.length === 0) {
263
+ return "No recent changes found.";
264
+ }
265
+ const lines = [`Recent Changes (page ${page}):`, ""];
266
+ for (const change of response) {
267
+ const date = new Date(change.change * 1000);
268
+ const dateStr = date.toISOString().replace("T", " ").substring(0, 19);
269
+ lines.push(`[${dateStr}] ${change.object_type}: ${change.gramps_id}`);
270
+ }
271
+ return lines.join("\n");
272
+ }
273
+ catch {
274
+ // Fallback: try fetching from each entity type and sorting by change time
275
+ const allEntities = [];
276
+ const entityTypes = ["people", "families", "events", "places", "sources"];
277
+ for (const type of entityTypes) {
278
+ try {
279
+ const entities = await grampsClient.get(API_ENDPOINTS[type.toUpperCase()] || `/${type}/`, { pagesize: 10 });
280
+ for (const entity of entities) {
281
+ if (entity.change) {
282
+ allEntities.push({
283
+ type,
284
+ entity,
285
+ change: entity.change,
286
+ });
287
+ }
288
+ }
289
+ }
290
+ catch {
291
+ // Ignore errors
292
+ }
293
+ }
294
+ // Sort by change time descending
295
+ allEntities.sort((a, b) => b.change - a.change);
296
+ const topEntities = allEntities.slice(0, pagesize);
297
+ if (topEntities.length === 0) {
298
+ return "No recent changes found.";
299
+ }
300
+ const lines = [`Recent Changes (page ${page}):`, ""];
301
+ for (const item of topEntities) {
302
+ const date = new Date(item.change * 1000);
303
+ const dateStr = date.toISOString().replace("T", " ").substring(0, 19);
304
+ lines.push(`[${dateStr}] ${item.type}: ${item.entity.gramps_id}`);
305
+ }
306
+ return lines.join("\n");
307
+ }
308
+ }
309
+ // Tool definitions for MCP
310
+ export const analysisTools = {
311
+ gramps_tree_stats: {
312
+ name: "gramps_tree_stats",
313
+ description: "Get statistics about the family tree including counts of people, " +
314
+ "families, events, places, sources, and other record types.",
315
+ inputSchema: {
316
+ type: "object",
317
+ properties: {},
318
+ required: [],
319
+ },
320
+ handler: grampsTreeStats,
321
+ },
322
+ gramps_get_ancestors: {
323
+ name: "gramps_get_ancestors",
324
+ description: "Find ancestors of a person going back a specified number of generations. " +
325
+ "Returns parents, grandparents, great-grandparents, etc.",
326
+ inputSchema: {
327
+ type: "object",
328
+ properties: {
329
+ handle: {
330
+ type: "string",
331
+ description: "Person handle to start from",
332
+ },
333
+ generations: {
334
+ type: "number",
335
+ description: "Number of generations to retrieve (max 10)",
336
+ default: 3,
337
+ },
338
+ },
339
+ required: ["handle"],
340
+ },
341
+ handler: grampsGetAncestors,
342
+ },
343
+ gramps_get_descendants: {
344
+ name: "gramps_get_descendants",
345
+ description: "Find descendants of a person going forward a specified number of generations. " +
346
+ "Returns children, grandchildren, great-grandchildren, etc.",
347
+ inputSchema: {
348
+ type: "object",
349
+ properties: {
350
+ handle: {
351
+ type: "string",
352
+ description: "Person handle to start from",
353
+ },
354
+ generations: {
355
+ type: "number",
356
+ description: "Number of generations to retrieve (max 10)",
357
+ default: 3,
358
+ },
359
+ },
360
+ required: ["handle"],
361
+ },
362
+ handler: grampsGetDescendants,
363
+ },
364
+ gramps_recent_changes: {
365
+ name: "gramps_recent_changes",
366
+ description: "Get recently modified records in the family tree. " +
367
+ "Useful for seeing what has been updated or added recently.",
368
+ inputSchema: {
369
+ type: "object",
370
+ properties: {
371
+ page: {
372
+ type: "number",
373
+ description: "Page number",
374
+ default: 1,
375
+ },
376
+ pagesize: {
377
+ type: "number",
378
+ description: "Results per page (max 100)",
379
+ default: 20,
380
+ },
381
+ },
382
+ required: [],
383
+ },
384
+ handler: grampsRecentChanges,
385
+ },
386
+ };
387
+ //# sourceMappingURL=analysis.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analysis.js","sourceRoot":"","sources":["../../src/tools/analysis.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAc,MAAM,wBAAwB,CAAC;AAGtE,yCAAyC;AACzC,MAAM,aAAa,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC;IAC1D,WAAW,EAAE,CAAC;SACX,MAAM,EAAE;SACR,GAAG,EAAE;SACL,QAAQ,EAAE;SACV,GAAG,CAAC,EAAE,CAAC;SACP,OAAO,CAAC,CAAC,CAAC;SACV,QAAQ,CAAC,4CAA4C,CAAC;CAC1D,CAAC,CAAC;AAEH,4BAA4B;AAC5B,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IACnC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC;IACpE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,kBAAkB,CAAC;CACxF,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,oCAAoC;IACpC,MAAM,WAAW,GAAG;QAClB,QAAQ;QACR,UAAU;QACV,QAAQ;QACR,QAAQ;QACR,SAAS;QACT,WAAW;QACX,cAAc;QACd,OAAO;QACP,OAAO;KACR,CAAC;IAEF,MAAM,KAAK,GAAc;QACvB,MAAM,EAAE,CAAC;QACT,QAAQ,EAAE,CAAC;QACX,MAAM,EAAE,CAAC;QACT,MAAM,EAAE,CAAC;QACT,OAAO,EAAE,CAAC;QACV,SAAS,EAAE,CAAC;QACZ,YAAY,EAAE,CAAC;QACf,KAAK,EAAE,CAAC;QACR,KAAK,EAAE,CAAC;KACT,CAAC;IAEF,uCAAuC;IACvC,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,GAAG,CAA0B,aAAa,CAAC,QAAQ,CAAC,CAAC;QAEzF,sCAAsC;QACtC,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;YAC/B,MAAM,QAAQ,GAAG,GAAG,IAAI,QAAQ,CAAC;YACjC,IAAI,OAAO,QAAQ,CAAC,QAAQ,CAAC,KAAK,QAAQ,EAAE,CAAC;gBAC3C,KAAK,CAAC,IAAuB,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAW,CAAC;YAChE,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,sEAAsE;QACtE,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;YAC/B,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,GAAG,CACrC,aAAa,CAAC,IAAI,CAAC,WAAW,EAAgC,CAAC,IAAI,IAAI,IAAI,GAAG,EAC9E,EAAE,QAAQ,EAAE,CAAC,EAAE,CAChB,CAAC;gBACF,sEAAsE;gBACtE,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC5B,gEAAgE;oBAChE,KAAK,CAAC,IAAuB,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC;gBACnD,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,4CAA4C;YAC9C,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,KAAK,GAAG;QACZ,yBAAyB;QACzB,EAAE;QACF,mBAAmB,KAAK,CAAC,MAAM,CAAC,cAAc,EAAE,EAAE;QAClD,mBAAmB,KAAK,CAAC,QAAQ,CAAC,cAAc,EAAE,EAAE;QACpD,mBAAmB,KAAK,CAAC,MAAM,CAAC,cAAc,EAAE,EAAE;QAClD,mBAAmB,KAAK,CAAC,MAAM,CAAC,cAAc,EAAE,EAAE;QAClD,mBAAmB,KAAK,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE;QACnD,mBAAmB,KAAK,CAAC,SAAS,CAAC,cAAc,EAAE,EAAE;QACrD,mBAAmB,KAAK,CAAC,YAAY,CAAC,cAAc,EAAE,EAAE;QACxD,mBAAmB,KAAK,CAAC,KAAK,CAAC,cAAc,EAAE,EAAE;QACjD,mBAAmB,KAAK,CAAC,KAAK,CAAC,cAAc,EAAE,EAAE;KAClD,CAAC;IAEF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,MAAqC;IAErC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAE5D,MAAM,SAAS,GAIV,EAAE,CAAC;IAER,oEAAoE;IACpE,MAAM,KAAK,GAAoC,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;IACrE,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAElC,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,CAAC,aAAa,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,EAAG,CAAC;QAEjD,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,GAAG,GAAG,WAAW,EAAE,CAAC;YACpD,SAAS;QACX,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QAE3B,IAAI,CAAC;YACH,aAAa;YACb,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,GAAG,CACnC,GAAG,aAAa,CAAC,MAAM,GAAG,aAAa,EAAE,CAC1C,CAAC;YAEF,SAAS,CAAC,IAAI,CAAC;gBACb,UAAU,EAAE,GAAG;gBACf,MAAM;gBACN,YAAY,EAAE,GAAG;aAClB,CAAC,CAAC;YAEH,sBAAsB;YACtB,IAAI,MAAM,CAAC,kBAAkB,IAAI,GAAG,GAAG,WAAW,EAAE,CAAC;gBACnD,KAAK,MAAM,YAAY,IAAI,MAAM,CAAC,kBAAkB,EAAE,CAAC;oBACrD,IAAI,CAAC;wBACH,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,GAAG,CACnC,GAAG,aAAa,CAAC,QAAQ,GAAG,YAAY,EAAE,CAC3C,CAAC;wBAEF,IAAI,MAAM,CAAC,aAAa,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC;4BAC/D,MAAM,SAAS,GACb,GAAG,KAAK,CAAC;gCACP,CAAC,CAAC,QAAQ;gCACV,CAAC,CAAC,GAAG,KAAK,CAAC;oCACT,CAAC,CAAC,aAAa;oCACf,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,qBAAqB,CAAC;4BACxC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,aAAa,EAAE,GAAG,GAAG,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC;wBACzD,CAAC;wBAED,IAAI,MAAM,CAAC,aAAa,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC;4BAC/D,MAAM,SAAS,GACb,GAAG,KAAK,CAAC;gCACP,CAAC,CAAC,QAAQ;gCACV,CAAC,CAAC,GAAG,KAAK,CAAC;oCACT,CAAC,CAAC,aAAa;oCACf,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,qBAAqB,CAAC;4BACxC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,aAAa,EAAE,GAAG,GAAG,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC;wBACzD,CAAC;oBACH,CAAC;oBAAC,MAAM,CAAC;wBACP,yBAAyB;oBAC3B,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,yBAAyB;QAC3B,CAAC;IACH,CAAC;IAED,gBAAgB;IAChB,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,qBAAqB,CAAC;IAC/B,CAAC;IAED,MAAM,KAAK,GAAG,CAAC,SAAS,SAAS,CAAC,MAAM,sBAAsB,WAAW,iBAAiB,EAAE,EAAE,CAAC,CAAC;IAEhG,sBAAsB;IACtB,MAAM,KAAK,GAAG,IAAI,GAAG,EAA4B,CAAC;IAClD,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;QAC1B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE,CAAC;YAC7B,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QAC9B,CAAC;QACD,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,CAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACnC,CAAC;IAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,YAAY,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAClC,IAAI,YAAY,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5C,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;YAC/B,KAAK,MAAM,CAAC,IAAI,YAAY,EAAE,CAAC;gBAC7B,KAAK,CAAC,IAAI,CACR,KAAK,CAAC,CAAC,YAAY,KAAK,gBAAgB,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,SAAS,GAAG,CAC1F,CAAC;YACJ,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,MAAqC;IAErC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAE5D,MAAM,WAAW,GAIZ,EAAE,CAAC;IAER,0BAA0B;IAC1B,MAAM,KAAK,GAAoC,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;IACrE,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAElC,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,CAAC,aAAa,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,EAAG,CAAC;QAEjD,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,GAAG,GAAG,WAAW,EAAE,CAAC;YACpD,SAAS;QACX,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QAE3B,IAAI,CAAC;YACH,aAAa;YACb,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,GAAG,CACnC,GAAG,aAAa,CAAC,MAAM,GAAG,aAAa,EAAE,CAC1C,CAAC;YAEF,WAAW,CAAC,IAAI,CAAC;gBACf,UAAU,EAAE,GAAG;gBACf,MAAM;gBACN,YAAY,EAAE,GAAG;aAClB,CAAC,CAAC;YAEH,6CAA6C;YAC7C,IAAI,MAAM,CAAC,WAAW,IAAI,GAAG,GAAG,WAAW,EAAE,CAAC;gBAC5C,KAAK,MAAM,YAAY,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;oBAC9C,IAAI,CAAC;wBACH,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,GAAG,CACnC,GAAG,aAAa,CAAC,QAAQ,GAAG,YAAY,EAAE,CAC3C,CAAC;wBAEF,IAAI,MAAM,CAAC,cAAc,EAAE,CAAC;4BAC1B,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,cAAc,EAAE,CAAC;gCAC7C,IAAI,QAAQ,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;oCAC/C,MAAM,QAAQ,GACZ,GAAG,KAAK,CAAC;wCACP,CAAC,CAAC,OAAO;wCACT,CAAC,CAAC,GAAG,KAAK,CAAC;4CACT,CAAC,CAAC,YAAY;4CACd,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,oBAAoB,CAAC;oCACvC,KAAK,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC;gCAChD,CAAC;4BACH,CAAC;wBACH,CAAC;oBACH,CAAC;oBAAC,MAAM,CAAC;wBACP,yBAAyB;oBAC3B,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,yBAAyB;QAC3B,CAAC;IACH,CAAC;IAED,gBAAgB;IAChB,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,OAAO,uBAAuB,CAAC;IACjC,CAAC;IAED,MAAM,KAAK,GAAG;QACZ,SAAS,WAAW,CAAC,MAAM,wBAAwB,WAAW,iBAAiB;QAC/E,EAAE;KACH,CAAC;IAEF,sBAAsB;IACtB,MAAM,KAAK,GAAG,IAAI,GAAG,EAA8B,CAAC;IACpD,KAAK,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC;QAC5B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE,CAAC;YAC7B,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QAC9B,CAAC;QACD,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,CAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACnC,CAAC;IAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,cAAc,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACpC,IAAI,cAAc,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChD,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;YAC/B,KAAK,MAAM,CAAC,IAAI,cAAc,EAAE,CAAC;gBAC/B,KAAK,CAAC,IAAI,CACR,KAAK,CAAC,CAAC,YAAY,KAAK,gBAAgB,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,SAAS,GAAG,CAC1F,CAAC;YACJ,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,MAA2C;IAE3C,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,mBAAmB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAU7D,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,GAAG,CAAiB,aAAa,CAAC,MAAM,EAAE;YAC5E,IAAI;YACJ,QAAQ;SACT,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvC,OAAO,0BAA0B,CAAC;QACpC,CAAC;QAED,MAAM,KAAK,GAAG,CAAC,wBAAwB,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC;QAErD,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;YAC9B,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;YAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAEtE,KAAK,CAAC,IAAI,CAAC,IAAI,OAAO,KAAK,MAAM,CAAC,WAAW,KAAK,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;QACxE,CAAC;QAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,0EAA0E;QAC1E,MAAM,WAAW,GAIZ,EAAE,CAAC;QAER,MAAM,WAAW,GAAG,CAAC,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;QAE1E,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;YAC/B,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,GAAG,CACrC,aAAa,CAAC,IAAI,CAAC,WAAW,EAAgC,CAAC,IAAI,IAAI,IAAI,GAAG,EAC9E,EAAE,QAAQ,EAAE,EAAE,EAAE,CACjB,CAAC;gBAEF,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;oBAC9B,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;wBAClB,WAAW,CAAC,IAAI,CAAC;4BACf,IAAI;4BACJ,MAAM;4BACN,MAAM,EAAE,MAAM,CAAC,MAAM;yBACtB,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,gBAAgB;YAClB,CAAC;QACH,CAAC;QAED,iCAAiC;QACjC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;QAEhD,MAAM,WAAW,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;QAEnD,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7B,OAAO,0BAA0B,CAAC;QACpC,CAAC;QAED,MAAM,KAAK,GAAG,CAAC,wBAAwB,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC;QAErD,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;YAC/B,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;YAC1C,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAEtE,KAAK,CAAC,IAAI,CAAC,IAAI,OAAO,KAAK,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;QACpE,CAAC;QAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;AACH,CAAC;AAED,2BAA2B;AAC3B,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,iBAAiB,EAAE;QACjB,IAAI,EAAE,mBAAmB;QACzB,WAAW,EACT,mEAAmE;YACnE,4DAA4D;QAC9D,WAAW,EAAE;YACX,IAAI,EAAE,QAAiB;YACvB,UAAU,EAAE,EAAE;YACd,QAAQ,EAAE,EAAE;SACb;QACD,OAAO,EAAE,eAAe;KACzB;IAED,oBAAoB,EAAE;QACpB,IAAI,EAAE,sBAAsB;QAC5B,WAAW,EACT,2EAA2E;YAC3E,yDAAyD;QAC3D,WAAW,EAAE;YACX,IAAI,EAAE,QAAiB;YACvB,UAAU,EAAE;gBACV,MAAM,EAAE;oBACN,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,6BAA6B;iBAC3C;gBACD,WAAW,EAAE;oBACX,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,4CAA4C;oBACzD,OAAO,EAAE,CAAC;iBACX;aACF;YACD,QAAQ,EAAE,CAAC,QAAQ,CAAC;SACrB;QACD,OAAO,EAAE,kBAAkB;KAC5B;IAED,sBAAsB,EAAE;QACtB,IAAI,EAAE,wBAAwB;QAC9B,WAAW,EACT,gFAAgF;YAChF,4DAA4D;QAC9D,WAAW,EAAE;YACX,IAAI,EAAE,QAAiB;YACvB,UAAU,EAAE;gBACV,MAAM,EAAE;oBACN,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,6BAA6B;iBAC3C;gBACD,WAAW,EAAE;oBACX,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,4CAA4C;oBACzD,OAAO,EAAE,CAAC;iBACX;aACF;YACD,QAAQ,EAAE,CAAC,QAAQ,CAAC;SACrB;QACD,OAAO,EAAE,oBAAoB;KAC9B;IAED,qBAAqB,EAAE;QACrB,IAAI,EAAE,uBAAuB;QAC7B,WAAW,EACT,oDAAoD;YACpD,4DAA4D;QAC9D,WAAW,EAAE;YACX,IAAI,EAAE,QAAiB;YACvB,UAAU,EAAE;gBACV,IAAI,EAAE;oBACJ,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,aAAa;oBAC1B,OAAO,EAAE,CAAC;iBACX;gBACD,QAAQ,EAAE;oBACR,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,4BAA4B;oBACzC,OAAO,EAAE,EAAE;iBACZ;aACF;YACD,QAAQ,EAAE,EAAE;SACb;QACD,OAAO,EAAE,mBAAmB;KAC7B;CACF,CAAC"}