@cyanheads/eurostat-mcp-server 0.11.0 → 0.11.2

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 (69) hide show
  1. package/AGENTS.md +1 -1
  2. package/CLAUDE.md +1 -1
  3. package/README.md +11 -8
  4. package/changelog/0.11.x/0.11.1.md +23 -0
  5. package/changelog/0.11.x/0.11.2.md +27 -0
  6. package/dist/mcp-server/resources/definitions/eurostat-dataset.resource.d.ts +14 -1
  7. package/dist/mcp-server/resources/definitions/eurostat-dataset.resource.d.ts.map +1 -1
  8. package/dist/mcp-server/resources/definitions/eurostat-dataset.resource.js +17 -0
  9. package/dist/mcp-server/resources/definitions/eurostat-dataset.resource.js.map +1 -1
  10. package/dist/mcp-server/tools/definitions/eurostat-browse-themes.tool.d.ts +1 -1
  11. package/dist/mcp-server/tools/definitions/eurostat-browse-themes.tool.js +1 -1
  12. package/dist/mcp-server/tools/definitions/eurostat-browse-themes.tool.js.map +1 -1
  13. package/dist/mcp-server/tools/definitions/eurostat-download-dataset.tool.d.ts +14 -12
  14. package/dist/mcp-server/tools/definitions/eurostat-download-dataset.tool.d.ts.map +1 -1
  15. package/dist/mcp-server/tools/definitions/eurostat-download-dataset.tool.js +98 -41
  16. package/dist/mcp-server/tools/definitions/eurostat-download-dataset.tool.js.map +1 -1
  17. package/dist/mcp-server/tools/definitions/eurostat-get-dataset-info.tool.d.ts +1 -1
  18. package/dist/mcp-server/tools/definitions/eurostat-get-dataset-info.tool.d.ts.map +1 -1
  19. package/dist/mcp-server/tools/definitions/eurostat-get-dataset-info.tool.js +10 -1
  20. package/dist/mcp-server/tools/definitions/eurostat-get-dataset-info.tool.js.map +1 -1
  21. package/dist/mcp-server/tools/definitions/eurostat-get-dimension-values.tool.d.ts +4 -4
  22. package/dist/mcp-server/tools/definitions/eurostat-get-dimension-values.tool.d.ts.map +1 -1
  23. package/dist/mcp-server/tools/definitions/eurostat-get-dimension-values.tool.js +25 -4
  24. package/dist/mcp-server/tools/definitions/eurostat-get-dimension-values.tool.js.map +1 -1
  25. package/dist/mcp-server/tools/definitions/eurostat-query-dataset.tool.d.ts +6 -4
  26. package/dist/mcp-server/tools/definitions/eurostat-query-dataset.tool.d.ts.map +1 -1
  27. package/dist/mcp-server/tools/definitions/eurostat-query-dataset.tool.js +88 -24
  28. package/dist/mcp-server/tools/definitions/eurostat-query-dataset.tool.js.map +1 -1
  29. package/dist/mcp-server/tools/definitions/eurostat-search-datasets.tool.d.ts +4 -4
  30. package/dist/mcp-server/tools/definitions/eurostat-search-datasets.tool.d.ts.map +1 -1
  31. package/dist/mcp-server/tools/definitions/eurostat-search-datasets.tool.js +18 -6
  32. package/dist/mcp-server/tools/definitions/eurostat-search-datasets.tool.js.map +1 -1
  33. package/dist/mcp-server/tools/hoist-dimensions.d.ts +18 -0
  34. package/dist/mcp-server/tools/hoist-dimensions.d.ts.map +1 -0
  35. package/dist/mcp-server/tools/hoist-dimensions.js +29 -0
  36. package/dist/mcp-server/tools/hoist-dimensions.js.map +1 -0
  37. package/dist/mcp-server/tools/narrowing-advice.d.ts +8 -7
  38. package/dist/mcp-server/tools/narrowing-advice.d.ts.map +1 -1
  39. package/dist/mcp-server/tools/narrowing-advice.js +16 -9
  40. package/dist/mcp-server/tools/narrowing-advice.js.map +1 -1
  41. package/dist/services/eurostat-bulk/eurostat-bulk-service.d.ts +5 -4
  42. package/dist/services/eurostat-bulk/eurostat-bulk-service.d.ts.map +1 -1
  43. package/dist/services/eurostat-bulk/eurostat-bulk-service.js +96 -18
  44. package/dist/services/eurostat-bulk/eurostat-bulk-service.js.map +1 -1
  45. package/dist/services/eurostat-bulk/types.d.ts +21 -4
  46. package/dist/services/eurostat-bulk/types.d.ts.map +1 -1
  47. package/dist/services/eurostat-catalogue/eurostat-catalogue-service.d.ts +14 -8
  48. package/dist/services/eurostat-catalogue/eurostat-catalogue-service.d.ts.map +1 -1
  49. package/dist/services/eurostat-catalogue/eurostat-catalogue-service.js +34 -17
  50. package/dist/services/eurostat-catalogue/eurostat-catalogue-service.js.map +1 -1
  51. package/dist/services/eurostat-codelists.d.ts +2 -1
  52. package/dist/services/eurostat-codelists.d.ts.map +1 -1
  53. package/dist/services/eurostat-codelists.js +2 -1
  54. package/dist/services/eurostat-codelists.js.map +1 -1
  55. package/dist/services/eurostat-data/eurostat-data-service.d.ts +12 -1
  56. package/dist/services/eurostat-data/eurostat-data-service.d.ts.map +1 -1
  57. package/dist/services/eurostat-data/eurostat-data-service.js +129 -26
  58. package/dist/services/eurostat-data/eurostat-data-service.js.map +1 -1
  59. package/dist/services/eurostat-data/types.d.ts +22 -11
  60. package/dist/services/eurostat-data/types.d.ts.map +1 -1
  61. package/dist/services/eurostat-data/types.js.map +1 -1
  62. package/dist/services/eurostat-periods.d.ts +107 -1
  63. package/dist/services/eurostat-periods.d.ts.map +1 -1
  64. package/dist/services/eurostat-periods.js +182 -7
  65. package/dist/services/eurostat-periods.js.map +1 -1
  66. package/package.json +4 -4
  67. package/server.json +3 -3
  68. package/skills/eurostat-guide/SKILL.md +4 -3
  69. package/skills/eurostat-guide/references/sql-analysis.md +18 -2
@@ -1 +1 @@
1
- {"version":3,"file":"eurostat-periods.d.ts","sourceRoot":"","sources":["../../src/services/eurostat-periods.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;GAGG;AACH,eAAO,MAAM,YAAY,wMAC0J,CAAC;AAsGpL;;;;GAIG;AACH,MAAM,WAAW,MAAM;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,CA6C5E;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE;IACrC,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACnC,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CA4B9F"}
1
+ {"version":3,"file":"eurostat-periods.d.ts","sourceRoot":"","sources":["../../src/services/eurostat-periods.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  /**
2
2
  * @fileoverview Local check of the period literals `since_period`/`until_period`
3
- * carry, run by both data tools before any request reaches Eurostat.
3
+ * carry, run by both data tools before any request reaches Eurostat, and the calendar
4
+ * reasoning over those bounds: which periods they exclude, and when they name one day.
4
5
  * @module services/eurostat-periods
5
6
  */
6
7
  /**
@@ -18,9 +19,9 @@ export const PERIOD_FORMS = 'YYYY, YYYY-MM, YYYY-MM-DD, YYYY-Qn (1–4), YYYY-Sn
18
19
  * normalizePeriod} sends. The number after the letter may carry extra leading zeros
19
20
  * (`2020-Q01`, `2020-W001`) — the bulk endpoint reads those, the Statistics API
20
21
  * refuses them. Month and day in `YYYY-MM`/`YYYY-MM-DD` stay exactly two digits
21
- * (both endpoints refuse `2020-1`). Frequency is deliberately not checked — both
22
- * endpoints map a literal of another frequency (`2020-01` on annual data) onto the
23
- * dataset's own.
22
+ * (both endpoints refuse `2020-1`). Frequency is deliberately not checked: both
23
+ * endpoints read every form as a span of days and keep the periods wholly inside
24
+ * the range, per frequency (see {@link periodCuts}).
24
25
  */
25
26
  const PERIOD_SHAPE = /^(\d{4})(?:-(\d{2})(?:-(\d{2}))?|-(A)0{0,3}1|-([QSTMWD])(\d{1,4}))?$/i;
26
27
  /**
@@ -51,6 +52,7 @@ const MONTH_NAMES = [
51
52
  ];
52
53
  /** Characters of an offending value echoed back before it is cut short. */
53
54
  const ECHO_LIMIT = 40;
55
+ const MS_PER_DAY = 86_400_000;
54
56
  const isLeapYear = (year) => (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;
55
57
  const daysInMonth = (year, month) => month === 2 ? (isLeapYear(year) ? 29 : 28) : [4, 6, 9, 11].includes(month) ? 30 : 31;
56
58
  /**
@@ -66,8 +68,12 @@ function isoWeeksInYear(year) {
66
68
  function dayNumber(year, month, day) {
67
69
  const date = new Date(0);
68
70
  date.setUTCFullYear(year, month - 1, day);
69
- return date.getTime() / 86_400_000;
71
+ return date.getTime() / MS_PER_DAY;
70
72
  }
73
+ /** The calendar date of a {@link dayNumber}, as `YYYY-MM-DD`. */
74
+ const isoDate = (day) => new Date(day * MS_PER_DAY).toISOString().slice(0, 10);
75
+ /** Days since that week's Monday: 1970-01-01, day 0, was a Thursday. */
76
+ const weekdayOffset = (day) => (((day + 3) % 7) + 7) % 7;
71
77
  /** First and last day of months `from`–`to` of `year`, as {@link dayNumber}s. */
72
78
  const monthSpan = (year, from, to) => [
73
79
  dayNumber(year, from, 1),
@@ -76,8 +82,7 @@ const monthSpan = (year, from, to) => [
76
82
  /** First and last day of ISO week `week`: week 1 is the one holding 4 January. */
77
83
  function isoWeekSpan(year, week) {
78
84
  const jan4 = dayNumber(year, 1, 4);
79
- const mondayOffset = (((jan4 + 3) % 7) + 7) % 7; // 1970-01-01, day 0, was a Thursday
80
- const first = jan4 - mondayOffset + 7 * (week - 1);
85
+ const first = jan4 - weekdayOffset(jan4) + 7 * (week - 1);
81
86
  return [first, first + 6];
82
87
  }
83
88
  /** First and last day each frequency number covers. */
@@ -92,6 +97,39 @@ const FREQUENCY_SPAN = {
92
97
  return [day, day];
93
98
  },
94
99
  };
100
+ /**
101
+ * The frequencies a bound can fall inside a period of, finest first, with the months
102
+ * each period of a month-based frequency spans. A day has no inside.
103
+ */
104
+ const DIVISIBLE_FREQUENCIES = [
105
+ { code: 'W', label: 'weekly' },
106
+ { code: 'M', label: 'monthly', months: 1 },
107
+ { code: 'Q', label: 'quarterly', months: 3 },
108
+ { code: 'T', label: 'trimester', months: 4 },
109
+ { code: 'S', label: 'semester', months: 6 },
110
+ { code: 'A', label: 'annual', months: 12 },
111
+ ];
112
+ /** The period of `frequency` holding calendar day `day`: its code and the days it spans. */
113
+ function periodHolding(day, frequency) {
114
+ const fourDigits = (year) => String(year).padStart(4, '0');
115
+ if (frequency.code === 'W') {
116
+ const monday = day - weekdayOffset(day);
117
+ const thursday = monday + 3; // the day that decides an ISO week's year
118
+ const year = new Date(thursday * MS_PER_DAY).getUTCFullYear();
119
+ const week = Math.floor((thursday - dayNumber(year, 1, 1)) / 7) + 1;
120
+ const code = `${fourDigits(year)}-W${String(week).padStart(2, '0')}`;
121
+ return { code, firstDay: monday, lastDay: monday + 6 };
122
+ }
123
+ const date = new Date(day * MS_PER_DAY);
124
+ const year = date.getUTCFullYear();
125
+ const { code: letter, months } = frequency;
126
+ const n = Math.ceil((date.getUTCMonth() + 1) / months);
127
+ const [firstDay, lastDay] = monthSpan(year, (n - 1) * months + 1, n * months);
128
+ if (letter === 'A')
129
+ return { code: fourDigits(year), firstDay, lastDay };
130
+ const number = letter === 'M' ? String(n).padStart(2, '0') : `${letter}${n}`;
131
+ return { code: `${fourDigits(year)}-${number}`, firstDay, lastDay };
132
+ }
95
133
  /**
96
134
  * The period to send upstream, or why there is none.
97
135
  *
@@ -201,4 +239,141 @@ export function resolvePeriods(bounds) {
201
239
  ...(until && { until_period: until.period }),
202
240
  };
203
241
  }
242
+ /** A literal's days, or `undefined` for an unset or unreadable one: these reads never fail. */
243
+ function daysOf(literal) {
244
+ if (literal === undefined)
245
+ return;
246
+ const period = normalizePeriod(literal);
247
+ return 'problem' in period ? undefined : period;
248
+ }
249
+ /** Whether a span of days lies wholly past or wholly before the reported coverage. */
250
+ function missesCoverage(span, coverage) {
251
+ const oldest = daysOf(coverage.oldest);
252
+ const latest = daysOf(coverage.latest);
253
+ return ((oldest !== undefined && span.lastDay < oldest.firstDay) ||
254
+ (latest !== undefined && span.firstDay > latest.lastDay));
255
+ }
256
+ /**
257
+ * Whether a whole period of `frequency` lies inside a span of days, clipped to the
258
+ * reported coverage, since a period past the coverage is no period the reply could
259
+ * select. An open side no coverage closes has no end to measure against, so it holds none.
260
+ */
261
+ function holdsWholePeriod(span, coverage, frequency) {
262
+ const first = Math.max(span.firstDay, daysOf(coverage.oldest)?.firstDay ?? span.firstDay);
263
+ const last = Math.min(span.lastDay, daysOf(coverage.latest)?.lastDay ?? span.lastDay);
264
+ if (!Number.isFinite(first) || !Number.isFinite(last))
265
+ return false;
266
+ const holding = periodHolding(first, frequency);
267
+ const whole = holding.firstDay === first ? holding : periodHolding(holding.lastDay + 1, frequency);
268
+ return whole.lastDay <= last;
269
+ }
270
+ /**
271
+ * The range a pair of bounds selects when it names exactly one calendar day, whatever
272
+ * forms the bounds take (`2022-06-15` twice, `2022-D166` beside `2022-06-15`, `2022`
273
+ * beside `2022-01-01`), with the day after it.
274
+ *
275
+ * Eurostat ignores such a range on both endpoints, at every frequency, and answers
276
+ * with the whole series as a success, so neither tool can send it as it stands.
277
+ */
278
+ export function oneDayRange(range) {
279
+ const since = daysOf(range.since_period);
280
+ const until = daysOf(range.until_period);
281
+ if (!since || since.firstDay !== until?.lastDay)
282
+ return;
283
+ return { date: isoDate(since.firstDay), next: isoDate(since.firstDay + 1) };
284
+ }
285
+ /** The frequency codes a list of period codes is written in; a code of no known shape adds none. */
286
+ export function frequenciesOf(periods) {
287
+ const frequencies = new Set();
288
+ for (const period of periods) {
289
+ const match = PERIOD_SHAPE.exec(period);
290
+ if (!match)
291
+ continue;
292
+ const [, , month, day, , letter] = match;
293
+ frequencies.add(letter?.toUpperCase() ?? (day ? 'D' : month ? 'M' : 'A'));
294
+ }
295
+ return frequencies;
296
+ }
297
+ /**
298
+ * The periods a range excludes because a bound falls inside them, finest frequency
299
+ * first, for each of `frequencies` this module has a calendar span for.
300
+ *
301
+ * Both endpoints keep a period only when it lies wholly inside the range: its first
302
+ * day on or after `since_period`'s, its last day on or before `until_period`'s. So a
303
+ * `since_period` starting after a period does, or an `until_period` ending before it
304
+ * does, cuts that period out, a coarser bound included: 2022-01-01 falls inside
305
+ * `2021-W52`. A period known to lie outside `coverage` is not named.
306
+ *
307
+ * Reads only the bounds and the list it is handed, and skips what it cannot parse.
308
+ */
309
+ export function periodCuts(range, frequencies, coverage = {}) {
310
+ const since = daysOf(range.since_period);
311
+ const until = daysOf(range.until_period);
312
+ /** The code of the period a bound's own day lies in, when it is not that period's edge. */
313
+ const cutBy = (day, edge, f) => {
314
+ if (day === undefined)
315
+ return;
316
+ const period = periodHolding(day, f);
317
+ return period[edge] !== day && !missesCoverage(period, coverage) ? period.code : undefined;
318
+ };
319
+ const listed = new Set(frequencies);
320
+ return DIVISIBLE_FREQUENCIES.filter(({ code }) => listed.has(code)).flatMap((f) => {
321
+ const start = cutBy(since?.firstDay, 'firstDay', f);
322
+ const end = cutBy(until?.lastDay, 'lastDay', f);
323
+ const cut = (period, ...bounds) => ({
324
+ bounds,
325
+ frequency: f.label,
326
+ period,
327
+ });
328
+ if (start && start === end)
329
+ return [cut(start, 'since_period', 'until_period')];
330
+ return [
331
+ ...(start ? [cut(start, 'since_period')] : []),
332
+ ...(end ? [cut(end, 'until_period')] : []),
333
+ ];
334
+ });
335
+ }
336
+ /**
337
+ * Why a range selected no period, read from the reply in hand.
338
+ *
339
+ * Coverage comes first, then {@link periodCuts} at the finest frequency a bound falls
340
+ * inside and the range holds no whole period of. A whole period inside the range rules
341
+ * the cut out as the cause: `2019-06` to `2021-06` holds 2020, which a survey can skip.
342
+ * What is left overlaps the data with nothing to cut: a weekend, a survey gap, or, on a
343
+ * host that reports no coverage, a range past the data.
344
+ *
345
+ * A selection made with no bound at all (a `filters.time` value) has nothing to cut.
346
+ */
347
+ export function diagnoseEmptyRange(range, frequencies, coverage) {
348
+ const since = daysOf(range.since_period);
349
+ const until = daysOf(range.until_period);
350
+ const span = {
351
+ firstDay: since?.firstDay ?? Number.NEGATIVE_INFINITY,
352
+ lastDay: until?.lastDay ?? Number.POSITIVE_INFINITY,
353
+ };
354
+ if ((!since && !until) || missesCoverage(span, coverage)) {
355
+ return { kind: 'outside_coverage', coverage };
356
+ }
357
+ const whole = DIVISIBLE_FREQUENCIES.filter((f) => holdsWholePeriod(span, coverage, f));
358
+ const cuts = periodCuts(range, frequencies, coverage).filter((cut) => !whole.some((f) => f.label === cut.frequency));
359
+ const finest = cuts[0]?.frequency;
360
+ return finest
361
+ ? { kind: 'no_whole_period', coverage, cuts: cuts.filter((c) => c.frequency === finest) }
362
+ : { kind: 'no_published_period', coverage };
363
+ }
364
+ /** The bound or bounds to set to select a cut period: `since_period "2022"`. */
365
+ export const cutSelector = ({ bounds, period }) => bounds.map((bound) => `${bound} "${period}"`).join(' and ');
366
+ /**
367
+ * The success notice for `cuts`, quoting each bound as the caller wrote it. It says
368
+ * nothing about the period's data: the slice may hold none.
369
+ */
370
+ export function cutNotice(cuts, sent) {
371
+ return cuts
372
+ .map((cut) => {
373
+ const both = cut.bounds.length > 1;
374
+ const named = cut.bounds.map((bound) => `${bound} "${sent[bound]}"`).join(' and ');
375
+ return `${named} ${both ? 'fall' : 'falls'} inside ${cut.frequency} period ${cut.period}, which Eurostat excludes: it keeps only periods wholly inside the range. ${cutSelector(cut)} ${both ? 'together include' : 'includes'} that period if this slice has it.`;
376
+ })
377
+ .join(' ');
378
+ }
204
379
  //# sourceMappingURL=eurostat-periods.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"eurostat-periods.js","sourceRoot":"","sources":["../../src/services/eurostat-periods.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"eurostat-periods.js","sourceRoot":"","sources":["../../src/services/eurostat-periods.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;GAGG;AACH,MAAM,CAAC,MAAM,YAAY,GACvB,iLAAiL,CAAC;AAEpL;;;;;;;;;;;;;GAaG;AACH,MAAM,YAAY,GAAG,uEAAuE,CAAC;AAI7F;;;GAGG;AACH,MAAM,SAAS,GAAoE;IACjF,CAAC,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE;IACxC,CAAC,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE;IACzC,CAAC,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE;IAC1C,CAAC,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE;IACvC,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE;IACtC,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE;CACvC,CAAC;AAEF,MAAM,WAAW,GAAG;IAClB,SAAS;IACT,UAAU;IACV,OAAO;IACP,OAAO;IACP,KAAK;IACL,MAAM;IACN,MAAM;IACN,QAAQ;IACR,WAAW;IACX,SAAS;IACT,UAAU;IACV,UAAU;CACX,CAAC;AAEF,2EAA2E;AAC3E,MAAM,UAAU,GAAG,EAAE,CAAC;AAEtB,MAAM,UAAU,GAAG,UAAU,CAAC;AAE9B,MAAM,UAAU,GAAG,CAAC,IAAY,EAAW,EAAE,CAC3C,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,GAAG,GAAG,KAAK,CAAC,CAAC,IAAI,IAAI,GAAG,GAAG,KAAK,CAAC,CAAC;AAE3D,MAAM,WAAW,GAAG,CAAC,IAAY,EAAE,KAAa,EAAU,EAAE,CAC1D,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AAEvF;;;;GAIG;AACH,SAAS,cAAc,CAAC,IAAY;IAClC,MAAM,OAAO,GAAG,CAAC,CAAS,EAAE,EAAE,CAC5B,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IAC1E,OAAO,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AAClE,CAAC;AAED,+GAA+G;AAC/G,SAAS,SAAS,CAAC,IAAY,EAAE,KAAa,EAAE,GAAW;IACzD,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;IACzB,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;IAC1C,OAAO,IAAI,CAAC,OAAO,EAAE,GAAG,UAAU,CAAC;AACrC,CAAC;AAED,iEAAiE;AACjE,MAAM,OAAO,GAAG,CAAC,GAAW,EAAU,EAAE,CAAC,IAAI,IAAI,CAAC,GAAG,GAAG,UAAU,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAE/F,wEAAwE;AACxE,MAAM,aAAa,GAAG,CAAC,GAAW,EAAU,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;AAEzE,iFAAiF;AACjF,MAAM,SAAS,GAAG,CAAC,IAAY,EAAE,IAAY,EAAE,EAAU,EAAoB,EAAE,CAAC;IAC9E,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IACxB,SAAS,CAAC,IAAI,EAAE,EAAE,EAAE,WAAW,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;CAC3C,CAAC;AAEF,kFAAkF;AAClF,SAAS,WAAW,CAAC,IAAY,EAAE,IAAY;IAC7C,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACnC,MAAM,KAAK,GAAG,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;IAC1D,OAAO,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;AAC5B,CAAC;AAED,uDAAuD;AACvD,MAAM,cAAc,GAAqE;IACvF,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IACjD,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IACjD,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IACjD,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;IACrC,CAAC,EAAE,WAAW;IACd,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;QACb,MAAM,GAAG,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAClC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACpB,CAAC;CACF,CAAC;AAEF;;;GAGG;AACH,MAAM,qBAAqB,GAAG;IAC5B,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE;IAC9B,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,EAAE;IAC1C,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,EAAE;IAC5C,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,EAAE;IAC5C,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,EAAE;IAC3C,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE;CAClC,CAAC;AAIX,4FAA4F;AAC5F,SAAS,aAAa,CACpB,GAAW,EACX,SAA6B;IAE7B,MAAM,UAAU,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAEnE,IAAI,SAAS,CAAC,IAAI,KAAK,GAAG,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAG,GAAG,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;QACxC,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,CAAC,CAAC,0CAA0C;QACvE,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,QAAQ,GAAG,UAAU,CAAC,CAAC,cAAc,EAAE,CAAC;QAC9D,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;QACpE,MAAM,IAAI,GAAG,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;QACrE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,CAAC,EAAE,CAAC;IACzD,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,GAAG,GAAG,UAAU,CAAC,CAAC;IACxC,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;IACnC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IAC3C,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC;IACvD,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC;IAC9E,IAAI,MAAM,KAAK,GAAG;QAAE,OAAO,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;IACzE,MAAM,MAAM,GAAG,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC;IAC7E,OAAO,EAAE,IAAI,EAAE,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,MAAM,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;AACtE,CAAC;AAaD;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,eAAe,CAAC,MAAc;IAC5C,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACxC,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,OAAO,EAAE,4CAA4C,EAAE,CAAC;IAC7E,MAAM,CAAC,EAAE,QAAQ,GAAG,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,KAAK,CAAC;IAC5E,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC9B,MAAM,SAAS,GAAG,GAAG,EAAE;QACrB,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QACnD,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;IAC/B,CAAC,CAAC;IAEF,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,SAAS,EAAE,EAAE,CAAC;IAEtE,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC5B,MAAM,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;QAChC,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,EAAE;YAAE,OAAO,EAAE,OAAO,EAAE,SAAS,SAAS,mBAAmB,EAAE,CAAC;QACvF,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC1B,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;YAC1D,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;QACvC,CAAC;QACD,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;QAC5B,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACtC,IAAI,GAAG,GAAG,CAAC,IAAI,GAAG,GAAG,IAAI,EAAE,CAAC;YAC1B,OAAO;gBACL,OAAO,EAAE,OAAO,OAAO,oBAAoB,WAAW,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,QAAQ,QAAQ,IAAI,OAAO;aACjG,CAAC;QACJ,CAAC;QACD,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;QAC7C,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;IACjD,CAAC;IAED,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,EAAE,MAAM,EAAE,GAAG,SAAS,EAAE,EAAE,CAAC;IACpF,MAAM,IAAI,GAAG,MAAM,CAAC,WAAW,EAAe,CAAC;IAC/C,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IACzB,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAC7C,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG;QAAE,OAAO,EAAE,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,iBAAiB,GAAG,EAAE,EAAE,CAAC;IAC7E,IAAI,IAAI,KAAK,GAAG,IAAI,CAAC,GAAG,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7C,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,oBAAoB,QAAQ,mBAAmB,EAAE,CAAC;IAC/E,CAAC;IACD,IAAI,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACnD,OAAO,EAAE,OAAO,EAAE,2BAA2B,QAAQ,eAAe,EAAE,CAAC;IACzE,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,GAAG,KAAK,IAAI,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAC/F,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAC1D,OAAO,EAAE,MAAM,EAAE,GAAG,QAAQ,IAAI,MAAM,GAAG,MAAM,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;AACzE,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,cAAc,CAAC,MAG9B;IACC,MAAM,OAAO,GAA6D,EAAE,CAAC;IAC7E,KAAK,MAAM,KAAK,IAAI,CAAC,cAAc,EAAE,cAAc,CAAU,EAAE,CAAC;QAC9D,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAC5B,IAAI,KAAK,KAAK,SAAS;YAAE,SAAS;QAClC,MAAM,MAAM,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;QACtC,IAAI,SAAS,IAAI,MAAM,EAAE,CAAC;YACxB,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC;YACnF,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,OAAO,EAAE,GAAG,KAAK,KAAK,KAAK,4BAA4B,MAAM,CAAC,OAAO,GAAG;aACzE,CAAC;QACJ,CAAC;QACD,OAAO,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC;IAC1B,CAAC;IAED,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC;IAC7D,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC;QACrD,OAAO;YACL,EAAE,EAAE,KAAK;YACT,OAAO,EAAE,iBAAiB,MAAM,CAAC,YAAY,gCAAgC,MAAM,CAAC,YAAY,uCAAuC;SACxI,CAAC;IACJ,CAAC;IACD,OAAO;QACL,EAAE,EAAE,IAAI;QACR,GAAG,CAAC,KAAK,IAAI,EAAE,YAAY,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;QAC5C,GAAG,CAAC,KAAK,IAAI,EAAE,YAAY,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;KAC7C,CAAC;AACJ,CAAC;AAgCD,+FAA+F;AAC/F,SAAS,MAAM,CAAC,OAA2B;IACzC,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO;IAClC,MAAM,MAAM,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IACxC,OAAO,SAAS,IAAI,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC;AAClD,CAAC;AAED,sFAAsF;AACtF,SAAS,cAAc,CACrB,IAA2C,EAC3C,QAAwB;IAExB,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACvC,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACvC,OAAO,CACL,CAAC,MAAM,KAAK,SAAS,IAAI,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC;QACxD,CAAC,MAAM,KAAK,SAAS,IAAI,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,CACzD,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,SAAS,gBAAgB,CACvB,IAA2C,EAC3C,QAAwB,EACxB,SAA6B;IAE7B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC1F,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC;IACtF,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IACpE,MAAM,OAAO,GAAG,aAAa,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IAChD,MAAM,KAAK,GACT,OAAO,CAAC,QAAQ,KAAK,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,OAAO,GAAG,CAAC,EAAE,SAAS,CAAC,CAAC;IACvF,OAAO,KAAK,CAAC,OAAO,IAAI,IAAI,CAAC;AAC/B,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,WAAW,CAAC,KAAkB;IAC5C,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IACzC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IACzC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,QAAQ,KAAK,KAAK,EAAE,OAAO;QAAE,OAAO;IACxD,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,EAAE,CAAC;AAC9E,CAAC;AAED,oGAAoG;AACpG,MAAM,UAAU,aAAa,CAAC,OAA0B;IACtD,MAAM,WAAW,GAAG,IAAI,GAAG,EAAU,CAAC;IACtC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACxC,IAAI,CAAC,KAAK;YAAE,SAAS;QACrB,MAAM,CAAC,EAAE,AAAD,EAAG,KAAK,EAAE,GAAG,EAAE,AAAD,EAAG,MAAM,CAAC,GAAG,KAAK,CAAC;QACzC,WAAW,CAAC,GAAG,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5E,CAAC;IACD,OAAO,WAAW,CAAC;AACrB,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,UAAU,CACxB,KAAkB,EAClB,WAA6B,EAC7B,QAAQ,GAAmB,EAAE;IAE7B,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IACzC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IAEzC,2FAA2F;IAC3F,MAAM,KAAK,GAAG,CAAC,GAAuB,EAAE,IAA4B,EAAE,CAAqB,EAAE,EAAE;QAC7F,IAAI,GAAG,KAAK,SAAS;YAAE,OAAO;QAC9B,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACrC,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;IAC7F,CAAC,CAAC;IAEF,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,CAAC;IACpC,OAAO,qBAAqB,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;QAChF,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC;QACpD,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;QAChD,MAAM,GAAG,GAAG,CAAC,MAAc,EAAE,GAAG,MAAqB,EAAa,EAAE,CAAC,CAAC;YACpE,MAAM;YACN,SAAS,EAAE,CAAC,CAAC,KAAK;YAClB,MAAM;SACP,CAAC,CAAC;QACH,IAAI,KAAK,IAAI,KAAK,KAAK,GAAG;YAAE,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,cAAc,EAAE,cAAc,CAAC,CAAC,CAAC;QAChF,OAAO;YACL,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9C,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;SAC3C,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,kBAAkB,CAChC,KAAkB,EAClB,WAA6B,EAC7B,QAAwB;IAExB,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IACzC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IACzC,MAAM,IAAI,GAAG;QACX,QAAQ,EAAE,KAAK,EAAE,QAAQ,IAAI,MAAM,CAAC,iBAAiB;QACrD,OAAO,EAAE,KAAK,EAAE,OAAO,IAAI,MAAM,CAAC,iBAAiB;KACpD,CAAC;IACF,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,IAAI,cAAc,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,CAAC;QACzD,OAAO,EAAE,IAAI,EAAE,kBAAkB,EAAE,QAAQ,EAAE,CAAC;IAChD,CAAC;IAED,MAAM,KAAK,GAAG,qBAAqB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,gBAAgB,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC;IACvF,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC,MAAM,CAC1D,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,GAAG,CAAC,SAAS,CAAC,CACvD,CAAC;IACF,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC;IAClC,OAAO,MAAM;QACX,CAAC,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,MAAM,CAAC,EAAE;QACzF,CAAC,CAAC,EAAE,IAAI,EAAE,qBAAqB,EAAE,QAAQ,EAAE,CAAC;AAChD,CAAC;AAED,gFAAgF;AAChF,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,EAAE,MAAM,EAAE,MAAM,EAAa,EAAU,EAAE,CACnE,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,KAAK,KAAK,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAE9D;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,IAAiB,EAAE,IAAiB;IAC5D,OAAO,IAAI;SACR,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QACX,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;QACnC,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,KAAK,KAAK,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACnF,OAAO,GAAG,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,WAAW,GAAG,CAAC,SAAS,WAAW,GAAG,CAAC,MAAM,6EAA6E,WAAW,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,UAAU,oCAAoC,CAAC;IACrQ,CAAC,CAAC;SACD,IAAI,CAAC,GAAG,CAAC,CAAC;AACf,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cyanheads/eurostat-mcp-server",
3
- "version": "0.11.0",
3
+ "version": "0.11.2",
4
4
  "mcpName": "io.github.cyanheads/eurostat-mcp-server",
5
5
  "description": "Search and query the Eurostat catalogue — EU economy, demography, trade, health, and NUTS regional data via MCP. STDIO or Streamable HTTP.",
6
6
  "type": "module",
@@ -96,12 +96,12 @@
96
96
  "zod": "^4.6.7"
97
97
  },
98
98
  "devDependencies": {
99
- "@biomejs/biome": "2.6.3",
99
+ "@biomejs/biome": "2.6.4",
100
100
  "@socketsecurity/bun-security-scanner": "^1.1.3",
101
- "@types/node": "26.6.5",
101
+ "@types/node": "26.6.6",
102
102
  "depcheck": "^1.4.7",
103
103
  "ignore": "^7.0.14",
104
- "tsc-alias": "^1.9.9",
104
+ "tsc-alias": "^1.9.10",
105
105
  "typescript": "^7.0.2",
106
106
  "vitest": "^5.0.5"
107
107
  }
package/server.json CHANGED
@@ -12,14 +12,14 @@
12
12
  "url": "https://eurostat.caseyjhand.com/mcp"
13
13
  }
14
14
  ],
15
- "version": "0.11.0",
15
+ "version": "0.11.2",
16
16
  "packages": [
17
17
  {
18
18
  "registryType": "npm",
19
19
  "registryBaseUrl": "https://registry.npmjs.org",
20
20
  "identifier": "@cyanheads/eurostat-mcp-server",
21
21
  "runtimeHint": "npx",
22
- "version": "0.11.0",
22
+ "version": "0.11.2",
23
23
  "environmentVariables": [
24
24
  {
25
25
  "name": "EUROSTAT_CLAMP_LIMITS",
@@ -128,7 +128,7 @@
128
128
  "registryBaseUrl": "https://registry.npmjs.org",
129
129
  "identifier": "@cyanheads/eurostat-mcp-server",
130
130
  "runtimeHint": "npx",
131
- "version": "0.11.0",
131
+ "version": "0.11.2",
132
132
  "environmentVariables": [
133
133
  {
134
134
  "name": "MCP_TRANSPORT_TYPE",
@@ -4,7 +4,7 @@ description: Use with eurostat_* tools to compare countries or regions, analyse
4
4
  license: Apache-2.0
5
5
  metadata:
6
6
  author: "cyanheads"
7
- version: "1.0"
7
+ version: "1.1.1"
8
8
  ---
9
9
 
10
10
  ## Scope
@@ -29,9 +29,10 @@ Keep codes as identifiers and labels as display text. Resolve codes within the c
29
29
  - Before comparing observations, fix the statistical measure and every dimension that could change its meaning: unit, frequency, geography and any indicator, adjustment, demographic or classification breakdown present in the dataset. Inspect the labels rather than guessing a code from its abbreviation.
30
30
  - Before interpreting a GDP comparison, distinguish economic size, per-inhabitant values and price-adjusted comparisons. For comparisons across countries, PPS removes price-level differences; changes in current-price PPS values are not automatically real growth. Consult [Eurostat's PPP guidance](https://ec.europa.eu/eurostat/en/web/purchasing-power-parities/information-data) when choosing the measure.
31
31
  - Before a regional time-series comparison, establish the NUTS classification used by the data. A matching code or label alone does not establish unchanged boundaries. Eurostat revises NUTS and historical reconstruction depends on feasibility; consult [NUTS history and changes](https://ec.europa.eu/eurostat/en/web/nuts/history) and the dataset metadata when classifications differ. This server does not supply a concordance operation.
32
- - Before claiming a series is absent, distinguish an unknown metadata bound, an unlisted page, an unmatched code and an empty combination of otherwise valid codes. Inspect notices and discovery freshness; missing Comext discovery is not evidence that a known DS-* dataset is unavailable.
32
+ - Before claiming a series is absent, distinguish an unknown metadata bound, an unlisted page, an unmatched code, an empty combination of otherwise valid codes and a period range that excludes the period. Eurostat keeps only periods wholly inside since_period–until_period, per frequency, so a bound inside a period drops it; a notice or error names the bound to use. Inspect notices and discovery freshness; missing Comext discovery is not evidence that a known DS-* dataset is unavailable.
33
+ - Before comparing coverage across series, separate a period a series lacks from an observation published without a value. A query reports the former as absentCellCount (periods of a frequency a matched series carries, with no cell) and stages no row for it; obsCount and missingObsCount count only published cells. A download stages the former as a row with null obs_value and no flag, status or text (an unflagged ":"), counted in rowCount and missingCount, in absentCellCount when the series carries that frequency elsewhere, and also at periods of a frequency the series has no observation of (the padding of a mixed-frequency slice), which absentCellCount leaves out. Such a row is not an observation, and its period is not coverage; periodRange and timeRange leave it out. A flagged ":" or a text value is an observation.
33
34
  - Before calling observations the latest available for each geography, inspect the selected slice's actual periods. The dataset's latest period can have no populated value for that slice. Expand the search period when necessary; do not report an empty latest-period selection as a zero.
34
- - Before calculating totals or rankings, establish that the retained observations cover the intended population. Inline observations are a preview, not a random sample; a query's truncated=false does not prove the preview includes every matched row. Compare obsCount with the observations received or inspect the staged table. A bulk result with budgetExceeded is an ordered prefix, even when that prefix has been staged successfully. Narrow and refetch before presenting a complete total.
35
+ - Before calculating totals or rankings, establish that the retained observations cover the intended population. Inline observations are a preview, not a random sample, and a "Same in all N rows shown" line describes those rows, not the match; a query's truncated=false does not prove the preview includes every matched row. Compare obsCount with the observations received or inspect the staged table. A bulk result with budgetExceeded is an ordered prefix, even when that prefix has been staged successfully. Narrow and refetch before presenting a complete total.
35
36
  - Preserve missing numeric values, published text values, observation flags and confidentiality status. A null numeric value is not zero; a PRODCOM text value is not a numeric quantity. Carry relevant provisional, break-in-series or reliability flags into the interpretation.
36
37
  - Before summing Comext observations, select a frequency and non-overlapping reporter, partner and product levels. Annual and monthly observations coexist, as do aggregates and their members. Do not sum TOTAL or EU aggregates alongside their constituents, or broad product groups alongside their subgroups.
37
38
 
@@ -28,13 +28,29 @@ The ordering is total only when the selected slice has one row per geo/time pair
28
28
  Inspect missingness alongside an aggregate:
29
29
 
30
30
  ```sql
31
- SELECT geo, COUNT(*) AS cells, COUNT(obs_value) AS numeric_cells,
31
+ SELECT geo, COUNT(*) AS rows_staged, COUNT(obs_value) AS numeric_cells,
32
32
  AVG(obs_value) AS mean_value
33
33
  FROM observations_table
34
34
  GROUP BY geo
35
35
  ORDER BY geo
36
36
  ```
37
37
 
38
- AVG ignores null numeric values. Use it only when that average answers the statistical question; do not replace missing observations with zero. For DS-* tables, inspect obs_value_text before interpreting every null numeric cell as missing data. Inspect obs_flag and conf_status alongside the values before drawing conclusions.
38
+ AVG ignores null numeric values. Use it only when that average answers the statistical question; do not replace missing observations with zero.
39
+
40
+ A table staged by eurostat_query_dataset has a row only for each published cell, so a period a series lacks is not a row; the query's absentCellCount counts those. A table staged by eurostat_download_dataset also holds those periods as rows with null obs_value, obs_flag, conf_status and (on DS-* tables) obs_value_text. To count the null cells that are observations, exclude them:
41
+
42
+ ```sql
43
+ SELECT geo,
44
+ COUNT(*) AS rows_staged,
45
+ COUNT(*) FILTER (WHERE obs_value IS NOT NULL OR obs_flag IS NOT NULL
46
+ OR conf_status IS NOT NULL) AS observations,
47
+ COUNT(*) FILTER (WHERE obs_value IS NULL AND obs_flag IS NULL
48
+ AND conf_status IS NULL) AS unflagged_null_rows
49
+ FROM observations_table
50
+ GROUP BY geo
51
+ ORDER BY geo
52
+ ```
53
+
54
+ On a DS-* table add OR obs_value_text IS NOT NULL to the observation test and AND obs_value_text IS NULL to the unflagged test; otherwise a text value such as KG counts as an unflagged row. In a mixed-frequency slice, compare each row's frequency dimension (freq on Comext) with the shape of its time code: an unflagged null row at a monthly period of an annual series is padding, not a gap. For DS-* tables, inspect obs_value_text before interpreting every null numeric cell as missing data. Inspect obs_flag and conf_status alongside the values before drawing conclusions.
39
55
 
40
56
  When a SQL result is truncated, retrieve deterministic pages of an unchanged query with a total ORDER BY and LIMIT/OFFSET. Advance OFFSET by the returned rowCount. Restart at offset zero if the first query was unordered. Expired or changing tables and volatile expressions cannot provide stable paging. Integer counts may arrive as strings to preserve precision; do not coerce them to an unsafe JavaScript number.