@sheetpane/charts 0.0.0-stage → 0.3.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/LICENSE +21 -0
- package/README.md +127 -2
- package/dist/colors.d.ts +48 -0
- package/dist/colors.d.ts.map +1 -0
- package/dist/colors.js +115 -0
- package/dist/colors.js.map +1 -0
- package/dist/index.d.ts +142 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +400 -0
- package/dist/index.js.map +1 -0
- package/dist/model.d.ts +85 -0
- package/dist/model.d.ts.map +1 -0
- package/dist/model.js +228 -0
- package/dist/model.js.map +1 -0
- package/dist/refs.d.ts +65 -0
- package/dist/refs.d.ts.map +1 -0
- package/dist/refs.js +144 -0
- package/dist/refs.js.map +1 -0
- package/dist/svg.d.ts +124 -0
- package/dist/svg.d.ts.map +1 -0
- package/dist/svg.js +398 -0
- package/dist/svg.js.map +1 -0
- package/dist/ui.d.ts +69 -0
- package/dist/ui.d.ts.map +1 -0
- package/dist/ui.js +143 -0
- package/dist/ui.js.map +1 -0
- package/package.json +49 -3
package/dist/svg.js
ADDED
|
@@ -0,0 +1,398 @@
|
|
|
1
|
+
/** Space at the top of the frame the title band (title, then type and series count) takes. */
|
|
2
|
+
export const HEAD = 42;
|
|
3
|
+
export const esc = (s) => s.replace(/[&<>"']/g, (c) => `&#${c.charCodeAt(0)};`);
|
|
4
|
+
const n2 = (v) => String(Math.round(v * 100) / 100);
|
|
5
|
+
const INK = 'fill:var(--sp-ink,#16171A)';
|
|
6
|
+
const INK3 = 'fill:var(--sp-ink-3,#63666E)';
|
|
7
|
+
const GRID = 'stroke:var(--sp-line,#E2E2DD)';
|
|
8
|
+
const AXIS = 'stroke:var(--sp-line-strong,#CBCBC5)';
|
|
9
|
+
const NEG = 'var(--sp-fail,#B42318)';
|
|
10
|
+
const nf = new Intl.NumberFormat(undefined, { maximumFractionDigits: 2 });
|
|
11
|
+
/**
|
|
12
|
+
* A number for an axis or label: `-9180` → `−9,180` (a true minus), at most two decimals, in the page's locale.
|
|
13
|
+
*
|
|
14
|
+
* @param v - The number.
|
|
15
|
+
* @param percent - Show `v` as a percentage (`0.25` → `25%`).
|
|
16
|
+
* @returns The text.
|
|
17
|
+
*/
|
|
18
|
+
export function formatNumber(v, percent = false) {
|
|
19
|
+
const x = percent ? v * 100 : v;
|
|
20
|
+
const s = nf.format(Math.abs(x)) + (percent ? '%' : '');
|
|
21
|
+
return x < 0 ? `−${s}` : s;
|
|
22
|
+
}
|
|
23
|
+
/** Cuts a label to `max` characters with an ellipsis. */
|
|
24
|
+
export const clip = (s, max) => (max <= 1 ? '' : s.length > max ? `${s.slice(0, Math.max(1, max - 1))}…` : s);
|
|
25
|
+
/**
|
|
26
|
+
* A "nice" axis: steps of 1, 2, 2.5 or 5 × 10ⁿ covering [lo, hi] in about `count` intervals.
|
|
27
|
+
*
|
|
28
|
+
* @param lo - The lowest value to cover.
|
|
29
|
+
* @param hi - The highest value to cover.
|
|
30
|
+
* @param count - About how many intervals.
|
|
31
|
+
* @returns The scale; at least two ticks.
|
|
32
|
+
*/
|
|
33
|
+
export function niceScale(lo, hi, count) {
|
|
34
|
+
if (!Number.isFinite(lo) || !Number.isFinite(hi)) {
|
|
35
|
+
lo = 0;
|
|
36
|
+
hi = 1;
|
|
37
|
+
}
|
|
38
|
+
if (hi < lo)
|
|
39
|
+
[lo, hi] = [hi, lo];
|
|
40
|
+
if (hi === lo) {
|
|
41
|
+
if (lo === 0)
|
|
42
|
+
hi = 1;
|
|
43
|
+
else if (lo > 0)
|
|
44
|
+
lo = 0;
|
|
45
|
+
else
|
|
46
|
+
hi = 0;
|
|
47
|
+
}
|
|
48
|
+
const raw = (hi - lo) / Math.max(1, count);
|
|
49
|
+
const mag = 10 ** Math.floor(Math.log10(raw));
|
|
50
|
+
const norm = raw / mag;
|
|
51
|
+
const step = (norm <= 1 ? 1 : norm <= 2 ? 2 : norm <= 2.5 ? 2.5 : norm <= 5 ? 5 : 10) * mag;
|
|
52
|
+
const fix = (v) => Number(v.toPrecision(12));
|
|
53
|
+
const nlo = fix(Math.floor(lo / step + 1e-9) * step), nhi = fix(Math.ceil(hi / step - 1e-9) * step);
|
|
54
|
+
const ticks = [];
|
|
55
|
+
for (let i = 0; i <= Math.round((nhi - nlo) / step); i++)
|
|
56
|
+
ticks.push(fix(nlo + i * step));
|
|
57
|
+
return { lo: nlo, hi: nhi === nlo ? fix(nlo + step) : nhi, step, ticks: ticks.length > 1 ? ticks : [nlo, fix(nlo + step)] };
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Excel's automatic axis range, roughly: it includes zero unless the data sit in a narrow band far from it.
|
|
61
|
+
*
|
|
62
|
+
* @param lo - The data's minimum.
|
|
63
|
+
* @param hi - The data's maximum.
|
|
64
|
+
* @returns `[lo, hi]` widened to zero, or unchanged.
|
|
65
|
+
*/
|
|
66
|
+
export function withZero(lo, hi) {
|
|
67
|
+
if (lo > 0 && hi - lo < hi / 6)
|
|
68
|
+
return [lo, hi];
|
|
69
|
+
if (hi < 0 && hi - lo < -lo / 6)
|
|
70
|
+
return [lo, hi];
|
|
71
|
+
return [Math.min(0, lo), Math.max(0, hi)];
|
|
72
|
+
}
|
|
73
|
+
const finite = (v) => typeof v === 'number' && Number.isFinite(v);
|
|
74
|
+
/**
|
|
75
|
+
* Per category: the value each series contributes once stacking (or 100 % stacking) is applied.
|
|
76
|
+
*
|
|
77
|
+
* @param series - The series.
|
|
78
|
+
* @param cats - How many categories.
|
|
79
|
+
* @param grouping - The group's grouping; `clustered` and `standard` do not stack.
|
|
80
|
+
* @returns Per series, per category: `{ base, top, value }` (`value` `null` for a missing point).
|
|
81
|
+
*/
|
|
82
|
+
export function stackedValues(series, cats, grouping) {
|
|
83
|
+
const out = series.map(() => []);
|
|
84
|
+
for (let j = 0; j < cats; j++) {
|
|
85
|
+
const total = grouping === 'percentStacked' ? series.reduce((t, s) => t + Math.abs(finite(s.values[j]) ? s.values[j] : 0), 0) : 1;
|
|
86
|
+
let pos = 0, neg = 0;
|
|
87
|
+
series.forEach((s, i) => {
|
|
88
|
+
const raw = s.values[j];
|
|
89
|
+
if (!finite(raw)) {
|
|
90
|
+
out[i].push({ base: 0, top: 0, value: null });
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
const v = grouping === 'percentStacked' ? (total ? raw / total : 0) : raw;
|
|
94
|
+
if (grouping === 'stacked' || grouping === 'percentStacked') {
|
|
95
|
+
if (v >= 0) {
|
|
96
|
+
out[i].push({ base: pos, top: pos + v, value: raw });
|
|
97
|
+
pos += v;
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
out[i].push({ base: neg, top: neg + v, value: raw });
|
|
101
|
+
neg += v;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
else
|
|
105
|
+
out[i].push({ base: 0, top: v, value: raw });
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
return out;
|
|
109
|
+
}
|
|
110
|
+
const stacked = (g) => g === 'stacked' || g === 'percentStacked';
|
|
111
|
+
const catCount = (d) => Math.max(d.cats.length, ...d.series.map((s) => s.values.length), 0);
|
|
112
|
+
function legendItems(d) {
|
|
113
|
+
if (d.kind === 'pie' || d.kind === 'doughnut') {
|
|
114
|
+
const s = d.series[0];
|
|
115
|
+
if (!s)
|
|
116
|
+
return [];
|
|
117
|
+
return s.values.map((_, j) => ({ label: d.cats[j] ?? String(j + 1), color: s.pointColors[j] ?? s.color })).filter((_, j) => finite(s.values[j]));
|
|
118
|
+
}
|
|
119
|
+
return d.series.map((s) => ({ label: s.name, color: d.kind === 'line' ? s.lineColor : s.color, line: d.kind === 'line' }));
|
|
120
|
+
}
|
|
121
|
+
/** Lays out the legend and returns the plot box left for the chart. */
|
|
122
|
+
function legend(d, area, parts) {
|
|
123
|
+
const items = legendItems(d);
|
|
124
|
+
if (d.legend === 'none' || !items.length)
|
|
125
|
+
return area;
|
|
126
|
+
if (d.legend === 'right' && area.width >= 300) {
|
|
127
|
+
const longest = Math.max(...items.map((i) => i.label.length));
|
|
128
|
+
const w = Math.min(area.width * 0.32, 24 + longest * 6.2);
|
|
129
|
+
const rows = Math.max(1, Math.min(items.length, Math.floor(area.height / 16)));
|
|
130
|
+
const top = area.y + Math.max(0, (area.height - rows * 16) / 2);
|
|
131
|
+
const max = Math.floor((w - 20) / 6.2);
|
|
132
|
+
parts.push('<g class="sp-legend">');
|
|
133
|
+
items.slice(0, rows).forEach((it, i) => {
|
|
134
|
+
const y = top + i * 16, x = area.x + area.width - w + 6;
|
|
135
|
+
parts.push(`<rect x="${n2(x)}" y="${n2(y + 3)}" width="9" height="9" fill="${it.color}" rx="1"/><text x="${n2(x + 14)}" y="${n2(y + 11)}" font-size="11" style="${INK3}">${esc(clip(it.label, max))}</text>`);
|
|
136
|
+
});
|
|
137
|
+
parts.push('</g>');
|
|
138
|
+
return { x: area.x, y: area.y, width: area.width - w, height: area.height };
|
|
139
|
+
}
|
|
140
|
+
// bottom: one row, as many items as fit
|
|
141
|
+
const y = area.y + area.height - 14;
|
|
142
|
+
let x = area.x + 4;
|
|
143
|
+
parts.push('<g class="sp-legend">');
|
|
144
|
+
for (const it of items) {
|
|
145
|
+
const label = clip(it.label, 18), w = 20 + label.length * 6.2;
|
|
146
|
+
if (x + w > area.x + area.width)
|
|
147
|
+
break;
|
|
148
|
+
parts.push(`<rect x="${n2(x)}" y="${n2(y + 1)}" width="9" height="9" fill="${it.color}" rx="1"/><text x="${n2(x + 13)}" y="${n2(y + 9)}" font-size="11" style="${INK3}">${esc(label)}</text>`);
|
|
149
|
+
x += w + 8;
|
|
150
|
+
}
|
|
151
|
+
parts.push('</g>');
|
|
152
|
+
return { x: area.x, y: area.y, width: area.width, height: area.height - 20 };
|
|
153
|
+
}
|
|
154
|
+
/** Category labels along an axis, thinned so they do not overlap. */
|
|
155
|
+
function catLabels(cats, n, at, room, place) {
|
|
156
|
+
if (!n)
|
|
157
|
+
return '';
|
|
158
|
+
const longest = Math.max(1, ...cats.slice(0, n).map((c) => c.length));
|
|
159
|
+
const every = Math.max(1, Math.ceil((Math.min(longest, 14) * 6 + 6) / Math.max(1, room)));
|
|
160
|
+
const max = Math.max(3, Math.floor((room * every) / 6) - 1);
|
|
161
|
+
let out = '';
|
|
162
|
+
for (let j = 0; j < n; j += every)
|
|
163
|
+
out += place(at(j), clip(cats[j] ?? String(j + 1), max));
|
|
164
|
+
return out;
|
|
165
|
+
}
|
|
166
|
+
function valueLabelWidth(s, percent) {
|
|
167
|
+
return 10 + Math.max(...s.ticks.map((t) => formatNumber(t, percent).length)) * 6;
|
|
168
|
+
}
|
|
169
|
+
function barsAndLines(d, plot, parts) {
|
|
170
|
+
const n = catCount(d);
|
|
171
|
+
const st = d.kind !== 'line' || d.grouping !== 'standard' ? stacked(d.grouping) : false;
|
|
172
|
+
const vals = stackedValues(d.series, n, st ? d.grouping : 'clustered');
|
|
173
|
+
const flat = vals.flat().filter((v) => v.value !== null);
|
|
174
|
+
let lo = Math.min(0, ...flat.map((v) => Math.min(v.base, v.top))), hi = Math.max(0, ...flat.map((v) => Math.max(v.base, v.top)));
|
|
175
|
+
if (d.kind === 'line' && !st && flat.length)
|
|
176
|
+
[lo, hi] = withZero(Math.min(...flat.map((v) => v.top)), Math.max(...flat.map((v) => v.top)));
|
|
177
|
+
const percent = d.grouping === 'percentStacked' || d.percent;
|
|
178
|
+
const horizontal = d.kind === 'bar';
|
|
179
|
+
const len = horizontal ? plot.width : plot.height;
|
|
180
|
+
const sc = niceScale(lo, hi, Math.max(2, Math.min(10, Math.floor(len / 30))));
|
|
181
|
+
const left = horizontal ? plot.x + 4 + Math.min(plot.width * 0.35, 8 + Math.min(14, Math.max(1, ...d.cats.map((c) => c.length))) * 6) : plot.x + valueLabelWidth(sc, percent);
|
|
182
|
+
const bottom = plot.y + plot.height - 18;
|
|
183
|
+
const box = { x: left, y: plot.y + 4, width: Math.max(10, plot.x + plot.width - left - 8), height: Math.max(10, bottom - plot.y - 4) };
|
|
184
|
+
const v2p = (v) => horizontal ? box.x + ((v - sc.lo) / (sc.hi - sc.lo)) * box.width : box.y + box.height - ((v - sc.lo) / (sc.hi - sc.lo)) * box.height;
|
|
185
|
+
// value axis: gridlines and labels
|
|
186
|
+
parts.push(`<g class="sp-axis sp-axis-value" data-lo="${sc.lo}" data-hi="${sc.hi}">`);
|
|
187
|
+
for (const t of sc.ticks) {
|
|
188
|
+
const p = v2p(t);
|
|
189
|
+
if (horizontal)
|
|
190
|
+
parts.push(`<line class="sp-grid" x1="${n2(p)}" x2="${n2(p)}" y1="${n2(box.y)}" y2="${n2(box.y + box.height)}" style="${GRID}"/><text class="sp-tick" data-value="${t}" x="${n2(p)}" y="${n2(box.y + box.height + 13)}" font-size="10" text-anchor="middle" style="${INK3}">${esc(formatNumber(t, percent))}</text>`);
|
|
191
|
+
else
|
|
192
|
+
parts.push(`<line class="sp-grid" x1="${n2(box.x)}" x2="${n2(box.x + box.width)}" y1="${n2(p)}" y2="${n2(p)}" style="${GRID}"/><text class="sp-tick" data-value="${t}" x="${n2(box.x - 5)}" y="${n2(p + 3.5)}" font-size="10" text-anchor="end" style="${INK3}">${esc(formatNumber(t, percent))}</text>`);
|
|
193
|
+
}
|
|
194
|
+
parts.push('</g>');
|
|
195
|
+
// category axis
|
|
196
|
+
const catLen = (horizontal ? box.height : box.width) / Math.max(1, n);
|
|
197
|
+
const catMid = (j) => horizontal ? box.y + box.height - (j + 0.5) * catLen : box.x + (j + 0.5) * catLen;
|
|
198
|
+
const zero = v2p(Math.min(Math.max(0, sc.lo), sc.hi));
|
|
199
|
+
parts.push('<g class="sp-axis sp-axis-cat">');
|
|
200
|
+
parts.push(horizontal
|
|
201
|
+
? `<line x1="${n2(zero)}" x2="${n2(zero)}" y1="${n2(box.y)}" y2="${n2(box.y + box.height)}" style="${AXIS}"/>`
|
|
202
|
+
: `<line x1="${n2(box.x)}" x2="${n2(box.x + box.width)}" y1="${n2(zero)}" y2="${n2(zero)}" style="${AXIS}"/>`);
|
|
203
|
+
parts.push(catLabels(d.cats, n, catMid, catLen, (pos, label) => horizontal
|
|
204
|
+
? `<text class="sp-cat" x="${n2(box.x - 5)}" y="${n2(pos + 3.5)}" font-size="10" text-anchor="end" style="${INK3}">${esc(label)}</text>`
|
|
205
|
+
: `<text class="sp-cat" x="${n2(pos)}" y="${n2(box.y + box.height + 13)}" font-size="10" text-anchor="middle" style="${INK3}">${esc(label)}</text>`));
|
|
206
|
+
parts.push('</g>');
|
|
207
|
+
if (d.kind === 'line') {
|
|
208
|
+
d.series.forEach((s, i) => {
|
|
209
|
+
const pts = vals[i].map((v, j) => (v.value === null ? null : { x: catMid(j), y: v2p(v.top), v: v.value, j }));
|
|
210
|
+
let path = '', pen = false;
|
|
211
|
+
for (const p of pts) {
|
|
212
|
+
if (!p) {
|
|
213
|
+
pen = false;
|
|
214
|
+
continue;
|
|
215
|
+
}
|
|
216
|
+
path += `${pen ? 'L' : 'M'}${n2(p.x)} ${n2(p.y)}`;
|
|
217
|
+
pen = true;
|
|
218
|
+
}
|
|
219
|
+
parts.push(`<g class="sp-series" data-series="${i}">`);
|
|
220
|
+
if (path && !s.noLine)
|
|
221
|
+
parts.push(`<path class="sp-line" d="${path}" fill="none" stroke="${s.lineColor}" stroke-width="2" stroke-linejoin="round" stroke-linecap="round"/>`);
|
|
222
|
+
for (const p of pts)
|
|
223
|
+
if (p)
|
|
224
|
+
parts.push(`<circle class="sp-point" data-series="${i}" data-point="${p.j}" data-value="${p.v}" cx="${n2(p.x)}" cy="${n2(p.y)}" r="2.75" fill="${s.lineColor}"/>`);
|
|
225
|
+
parts.push('</g>');
|
|
226
|
+
});
|
|
227
|
+
return;
|
|
228
|
+
}
|
|
229
|
+
// bars
|
|
230
|
+
const gap = Math.max(0, d.gapWidth) / 100;
|
|
231
|
+
const k = st ? 1 : Math.max(1, d.series.length);
|
|
232
|
+
const thick = catLen / (k + gap);
|
|
233
|
+
d.series.forEach((s, i) => {
|
|
234
|
+
parts.push(`<g class="sp-series" data-series="${i}">`);
|
|
235
|
+
vals[i].forEach((v, j) => {
|
|
236
|
+
if (v.value === null)
|
|
237
|
+
return;
|
|
238
|
+
const a = v2p(v.base), b = v2p(v.top);
|
|
239
|
+
const offset = (thick * gap) / 2 + (st ? 0 : i * thick);
|
|
240
|
+
const fill = v.value < 0 ? `style="fill:${NEG}"` : `fill="${s.color}"`;
|
|
241
|
+
const common = `class="sp-bar" data-series="${i}" data-point="${j}" data-value="${v.value}" ${fill}`;
|
|
242
|
+
if (horizontal) {
|
|
243
|
+
const bandBottom = box.y + box.height - j * catLen;
|
|
244
|
+
parts.push(`<rect ${common} x="${n2(Math.min(a, b))}" y="${n2(bandBottom - offset - thick)}" width="${n2(Math.abs(b - a))}" height="${n2(thick)}"/>`);
|
|
245
|
+
}
|
|
246
|
+
else {
|
|
247
|
+
parts.push(`<rect ${common} x="${n2(box.x + j * catLen + offset)}" y="${n2(Math.min(a, b))}" width="${n2(thick)}" height="${n2(Math.abs(b - a))}"/>`);
|
|
248
|
+
}
|
|
249
|
+
});
|
|
250
|
+
parts.push('</g>');
|
|
251
|
+
});
|
|
252
|
+
}
|
|
253
|
+
/** A point on a circle: 0° at 12 o'clock, clockwise. */
|
|
254
|
+
const polar = (cx, cy, r, deg) => ({ x: cx + r * Math.sin((deg * Math.PI) / 180), y: cy - r * Math.cos((deg * Math.PI) / 180) });
|
|
255
|
+
function slicePath(cx, cy, r, inner, a0, a1) {
|
|
256
|
+
if (a1 - a0 >= 359.999) {
|
|
257
|
+
// a whole ring: two half arcs
|
|
258
|
+
const o = `M${n2(cx)} ${n2(cy - r)}A${n2(r)} ${n2(r)} 0 1 1 ${n2(cx)} ${n2(cy + r)}A${n2(r)} ${n2(r)} 0 1 1 ${n2(cx)} ${n2(cy - r)}Z`;
|
|
259
|
+
return inner > 0 ? `${o}M${n2(cx)} ${n2(cy - inner)}A${n2(inner)} ${n2(inner)} 0 1 0 ${n2(cx)} ${n2(cy + inner)}A${n2(inner)} ${n2(inner)} 0 1 0 ${n2(cx)} ${n2(cy - inner)}Z` : o;
|
|
260
|
+
}
|
|
261
|
+
const large = a1 - a0 > 180 ? 1 : 0;
|
|
262
|
+
const p0 = polar(cx, cy, r, a0), p1 = polar(cx, cy, r, a1);
|
|
263
|
+
if (inner <= 0)
|
|
264
|
+
return `M${n2(cx)} ${n2(cy)}L${n2(p0.x)} ${n2(p0.y)}A${n2(r)} ${n2(r)} 0 ${large} 1 ${n2(p1.x)} ${n2(p1.y)}Z`;
|
|
265
|
+
const q0 = polar(cx, cy, inner, a0), q1 = polar(cx, cy, inner, a1);
|
|
266
|
+
return `M${n2(p0.x)} ${n2(p0.y)}A${n2(r)} ${n2(r)} 0 ${large} 1 ${n2(p1.x)} ${n2(p1.y)}L${n2(q1.x)} ${n2(q1.y)}A${n2(inner)} ${n2(inner)} 0 ${large} 0 ${n2(q0.x)} ${n2(q0.y)}Z`;
|
|
267
|
+
}
|
|
268
|
+
function pie(d, plot, parts) {
|
|
269
|
+
const s = d.series[0];
|
|
270
|
+
if (!s)
|
|
271
|
+
return;
|
|
272
|
+
const total = s.values.reduce((t, v) => t + (finite(v) ? Math.abs(v) : 0), 0);
|
|
273
|
+
const cx = plot.x + plot.width / 2, cy = plot.y + plot.height / 2, r = Math.max(4, Math.min(plot.width, plot.height) / 2 - 6);
|
|
274
|
+
const inner = d.kind === 'doughnut' ? (r * Math.min(90, Math.max(10, d.holeSize))) / 100 : 0;
|
|
275
|
+
let a = d.firstSliceAng;
|
|
276
|
+
parts.push(`<g class="sp-series" data-series="0" data-cx="${n2(cx)}" data-cy="${n2(cy)}" data-r="${n2(r)}">`);
|
|
277
|
+
s.values.forEach((v, j) => {
|
|
278
|
+
if (!finite(v) || v === 0 || !total)
|
|
279
|
+
return;
|
|
280
|
+
const sweep = (Math.abs(v) / total) * 360;
|
|
281
|
+
parts.push(`<path class="sp-slice" data-series="0" data-point="${j}" data-value="${v}" data-start="${n2(a)}" data-end="${n2(a + sweep)}" d="${slicePath(cx, cy, r, inner, a, a + sweep)}" fill="${s.pointColors[j] ?? s.color}" fill-rule="evenodd" style="stroke:var(--sp-surface,#FFFFFF);stroke-width:1"/>`);
|
|
282
|
+
a += sweep;
|
|
283
|
+
});
|
|
284
|
+
parts.push('</g>');
|
|
285
|
+
}
|
|
286
|
+
function scatter(d, plot, parts) {
|
|
287
|
+
const pts = d.series.map((s) => s.values.map((y, j) => {
|
|
288
|
+
const x = s.xs ? s.xs[j] : j + 1;
|
|
289
|
+
return finite(y) && finite(x) ? { x, y, j } : null;
|
|
290
|
+
}));
|
|
291
|
+
const all = pts.flat().filter((p) => !!p);
|
|
292
|
+
const xs = all.map((p) => p.x), ys = all.map((p) => p.y);
|
|
293
|
+
const [xlo, xhi] = withZero(Math.min(...xs, Infinity), Math.max(...xs, -Infinity));
|
|
294
|
+
const [ylo, yhi] = withZero(Math.min(...ys, Infinity), Math.max(...ys, -Infinity));
|
|
295
|
+
const sy = niceScale(all.length ? ylo : 0, all.length ? yhi : 1, Math.max(2, Math.min(10, Math.floor(plot.height / 30))));
|
|
296
|
+
const left = plot.x + valueLabelWidth(sy, d.percent);
|
|
297
|
+
const box = { x: left, y: plot.y + 4, width: Math.max(10, plot.x + plot.width - left - 10), height: Math.max(10, plot.y + plot.height - 18 - plot.y - 4) };
|
|
298
|
+
const sx = niceScale(all.length ? xlo : 0, all.length ? xhi : 1, Math.max(2, Math.min(10, Math.floor(box.width / 60))));
|
|
299
|
+
const X = (v) => box.x + ((v - sx.lo) / (sx.hi - sx.lo)) * box.width;
|
|
300
|
+
const Y = (v) => box.y + box.height - ((v - sy.lo) / (sy.hi - sy.lo)) * box.height;
|
|
301
|
+
parts.push(`<g class="sp-axis sp-axis-value" data-lo="${sy.lo}" data-hi="${sy.hi}">`);
|
|
302
|
+
for (const t of sy.ticks)
|
|
303
|
+
parts.push(`<line class="sp-grid" x1="${n2(box.x)}" x2="${n2(box.x + box.width)}" y1="${n2(Y(t))}" y2="${n2(Y(t))}" style="${GRID}"/><text class="sp-tick" data-value="${t}" x="${n2(box.x - 5)}" y="${n2(Y(t) + 3.5)}" font-size="10" text-anchor="end" style="${INK3}">${esc(formatNumber(t, d.percent))}</text>`);
|
|
304
|
+
parts.push('</g>');
|
|
305
|
+
parts.push(`<g class="sp-axis sp-axis-x" data-lo="${sx.lo}" data-hi="${sx.hi}">`);
|
|
306
|
+
parts.push(`<line x1="${n2(box.x)}" x2="${n2(box.x + box.width)}" y1="${n2(box.y + box.height)}" y2="${n2(box.y + box.height)}" style="${AXIS}"/>`);
|
|
307
|
+
for (const t of sx.ticks)
|
|
308
|
+
parts.push(`<text class="sp-tick" data-value="${t}" x="${n2(X(t))}" y="${n2(box.y + box.height + 13)}" font-size="10" text-anchor="middle" style="${INK3}">${esc(formatNumber(t))}</text>`);
|
|
309
|
+
parts.push('</g>');
|
|
310
|
+
const lines = /line|smooth/i.test(d.scatterStyle);
|
|
311
|
+
const markers = !/^(line|smooth)$/i.test(d.scatterStyle);
|
|
312
|
+
d.series.forEach((s, i) => {
|
|
313
|
+
parts.push(`<g class="sp-series" data-series="${i}">`);
|
|
314
|
+
const ps = pts[i].filter((p) => !!p);
|
|
315
|
+
if (lines && !s.noLine && ps.length > 1)
|
|
316
|
+
parts.push(`<path class="sp-line" d="${ps.map((p, k) => `${k ? 'L' : 'M'}${n2(X(p.x))} ${n2(Y(p.y))}`).join('')}" fill="none" stroke="${s.lineColor}" stroke-width="2"/>`);
|
|
317
|
+
for (const p of ps)
|
|
318
|
+
parts.push(`<circle class="sp-point" data-series="${i}" data-point="${p.j}" data-value="${p.y}" data-x="${p.x}" cx="${n2(X(p.x))}" cy="${n2(Y(p.y))}" r="${markers ? 3 : 0}" fill="${s.color}"/>`);
|
|
319
|
+
parts.push('</g>');
|
|
320
|
+
});
|
|
321
|
+
}
|
|
322
|
+
/** The note a frame carries once a plotted cell was changed. */
|
|
323
|
+
export const CHANGED_TAG = 'data changed — Excel will redraw';
|
|
324
|
+
const TAG_W = 14 + CHANGED_TAG.length * 5.6;
|
|
325
|
+
/**
|
|
326
|
+
* The title band: the title in bold (the frame's HTML button sits to its right), the type and
|
|
327
|
+
* series count under it, then — once a plotted cell changed — the tag, on the same line when it
|
|
328
|
+
* fits, else on a line of its own. Returns the markup and where the plot may start.
|
|
329
|
+
*/
|
|
330
|
+
export function titleBand(title, meta, width, changed = false) {
|
|
331
|
+
const t = clip(title, Math.max(8, Math.floor((width - 140) / 7.4)));
|
|
332
|
+
const m = clip(meta, Math.max(8, Math.floor((width - 16) / 6.2)));
|
|
333
|
+
let svg = `<text class="sp-chart-title" x="8" y="18" font-size="13" font-weight="600" style="${INK}">${esc(t)}</text>`
|
|
334
|
+
+ `<text class="sp-chart-meta" x="8" y="34" font-size="11" style="${INK3}">${esc(m)}</text>`;
|
|
335
|
+
let bottom = HEAD;
|
|
336
|
+
if (changed) {
|
|
337
|
+
const after = 8 + m.length * 6.2 + 10;
|
|
338
|
+
const inline = after + TAG_W <= width - 6;
|
|
339
|
+
const x = inline ? after : 8, y = inline ? 23 : 41;
|
|
340
|
+
if (!inline)
|
|
341
|
+
bottom += 20;
|
|
342
|
+
svg += `<g class="sp-chart-tag"><rect x="${n2(x)}" y="${y}" width="${n2(TAG_W)}" height="16" rx="8" style="fill:var(--sp-changed-soft,#FDF1E3)"/>`
|
|
343
|
+
+ `<text x="${n2(x + 7)}" y="${y + 11.5}" font-size="10" font-weight="500" style="fill:var(--sp-changed,#C46A00)">${esc(CHANGED_TAG)}</text></g>`;
|
|
344
|
+
}
|
|
345
|
+
return { svg, bottom };
|
|
346
|
+
}
|
|
347
|
+
const svgOpen = (w, h, label, attrs) => `<svg xmlns="http://www.w3.org/2000/svg" class="sp-chart-svg" viewBox="0 0 ${n2(w)} ${n2(h)}" width="100%" height="100%" preserveAspectRatio="xMidYMid meet" role="img" aria-label="${esc(label)}" ${attrs} style="display:block;overflow:hidden"><title>${esc(label)}</title>`;
|
|
348
|
+
/**
|
|
349
|
+
* Stage 2: the whole drawn chart as SVG markup, `width` × `height` in px at 100 % zoom. No font is named; every
|
|
350
|
+
* file string is escaped.
|
|
351
|
+
*
|
|
352
|
+
* @param d - What to draw.
|
|
353
|
+
* @param title - The chart's title.
|
|
354
|
+
* @param meta - The line under the title, e.g. `bar · 2 series`.
|
|
355
|
+
* @param width - Width in px.
|
|
356
|
+
* @param height - Height in px.
|
|
357
|
+
* @param attrs - Extra attributes for the `<svg>` element.
|
|
358
|
+
* @param changed - Show the "data changed — Excel will redraw" tag.
|
|
359
|
+
* @returns The `<svg>` markup.
|
|
360
|
+
*/
|
|
361
|
+
export function drawChart(d, title, meta, width, height, attrs = '', changed = false) {
|
|
362
|
+
const band = titleBand(title, meta, width, changed);
|
|
363
|
+
const parts = [svgOpen(width, height, title, `data-kind="${d.kind}" data-stage="2" ${attrs}`), band.svg];
|
|
364
|
+
const area = { x: 4, y: band.bottom, width: Math.max(10, width - 8), height: Math.max(10, height - band.bottom - 4) };
|
|
365
|
+
const plot = legend(d, area, parts);
|
|
366
|
+
parts.push('<g class="sp-plot">');
|
|
367
|
+
if (d.kind === 'pie' || d.kind === 'doughnut')
|
|
368
|
+
pie(d, plot, parts);
|
|
369
|
+
else if (d.kind === 'scatter')
|
|
370
|
+
scatter(d, plot, parts);
|
|
371
|
+
else
|
|
372
|
+
barsAndLines(d, plot, parts);
|
|
373
|
+
parts.push('</g></svg>');
|
|
374
|
+
return parts.join('');
|
|
375
|
+
}
|
|
376
|
+
/**
|
|
377
|
+
* Stage 1: the frame's content as SVG markup — title, type and series count, and as many of `lines` as fit under it.
|
|
378
|
+
*
|
|
379
|
+
* @param title - The chart's title.
|
|
380
|
+
* @param meta - The line under the title, e.g. `bar · 2 series`.
|
|
381
|
+
* @param lines - The lines to list (why it is not drawn, each series and the cells it reads).
|
|
382
|
+
* @param width - Width in px.
|
|
383
|
+
* @param height - Height in px.
|
|
384
|
+
* @param attrs - Extra attributes for the `<svg>` element.
|
|
385
|
+
* @param changed - Show the "data changed — Excel will redraw" tag.
|
|
386
|
+
* @returns The `<svg>` markup.
|
|
387
|
+
*/
|
|
388
|
+
export function frameSvg(title, meta, lines, width, height, attrs = '', changed = false) {
|
|
389
|
+
const band = titleBand(title, meta, width, changed);
|
|
390
|
+
const parts = [svgOpen(width, height, title, `data-stage="1" ${attrs}`), band.svg];
|
|
391
|
+
const max = Math.max(4, Math.floor((width - 16) / 6.3));
|
|
392
|
+
lines.slice(0, Math.max(0, Math.floor((height - band.bottom - 6) / 16))).forEach((l, i) => {
|
|
393
|
+
parts.push(`<text class="sp-chart-line" x="8" y="${n2(band.bottom + 14 + i * 16)}" font-size="11" style="${INK3}">${esc(clip(l, max))}</text>`);
|
|
394
|
+
});
|
|
395
|
+
parts.push('</svg>');
|
|
396
|
+
return parts.join('');
|
|
397
|
+
}
|
|
398
|
+
//# sourceMappingURL=svg.js.map
|
package/dist/svg.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"svg.js","sourceRoot":"","sources":["../src/svg.ts"],"names":[],"mappings":"AAyCA,8FAA8F;AAC9F,MAAM,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC;AAEvB,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AAChG,MAAM,EAAE,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC;AACpE,MAAM,GAAG,GAAG,4BAA4B,CAAC;AACzC,MAAM,IAAI,GAAG,8BAA8B,CAAC;AAC5C,MAAM,IAAI,GAAG,+BAA+B,CAAC;AAC7C,MAAM,IAAI,GAAG,sCAAsC,CAAC;AACpD,MAAM,GAAG,GAAG,wBAAwB,CAAC;AAErC,MAAM,EAAE,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,EAAE,qBAAqB,EAAE,CAAC,EAAE,CAAC,CAAC;AAC1E;;;;;;GAMG;AACH,MAAM,UAAU,YAAY,CAAC,CAAS,EAAE,OAAO,GAAG,KAAK;IACrD,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAChC,MAAM,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACxD,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AAC7B,CAAC;AAED,yDAAyD;AACzD,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,CAAS,EAAE,GAAW,EAAU,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAKtI;;;;;;;GAOG;AACH,MAAM,UAAU,SAAS,CAAC,EAAU,EAAE,EAAU,EAAE,KAAa;IAC7D,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;QAAC,EAAE,GAAG,CAAC,CAAC;QAAC,EAAE,GAAG,CAAC,CAAC;IAAC,CAAC;IACrE,IAAI,EAAE,GAAG,EAAE;QAAE,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IACjC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QAAC,IAAI,EAAE,KAAK,CAAC;YAAE,EAAE,GAAG,CAAC,CAAC;aAAM,IAAI,EAAE,GAAG,CAAC;YAAE,EAAE,GAAG,CAAC,CAAC;;YAAM,EAAE,GAAG,CAAC,CAAC;IAAC,CAAC;IAC9E,MAAM,GAAG,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAC3C,MAAM,GAAG,GAAG,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9C,MAAM,IAAI,GAAG,GAAG,GAAG,GAAG,CAAC;IACvB,MAAM,IAAI,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC;IAC5F,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC;IACrD,MAAM,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;IACpG,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,EAAE;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IAC1F,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC;AAC9H,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,QAAQ,CAAC,EAAU,EAAE,EAAU;IAC7C,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;QAAE,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAChD,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC;QAAE,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IACjD,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,MAAM,GAAG,CAAC,CAA4B,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;AAE1G;;;;;;;GAOG;AACH,MAAM,UAAU,aAAa,CAAC,MAA6B,EAAE,IAAY,EAAE,QAAkB;IAC3F,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,EAA2D,CAAC,CAAC;IAC1F,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;QAC9B,MAAM,KAAK,GAAG,QAAQ,KAAK,gBAAgB,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACnI,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC;QACrB,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACtB,MAAM,GAAG,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YACxB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;gBAAC,GAAG,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;gBAAC,OAAO;YAAC,CAAC;YAC7E,MAAM,CAAC,GAAG,QAAQ,KAAK,gBAAgB,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;YAC1E,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,gBAAgB,EAAE,CAAC;gBAC5D,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;oBAAC,GAAG,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;oBAAC,GAAG,IAAI,CAAC,CAAC;gBAAC,CAAC;qBAAM,CAAC;oBAAC,GAAG,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;oBAAC,GAAG,IAAI,CAAC,CAAC;gBAAC,CAAC;YAC5J,CAAC;;gBAAM,GAAG,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;QACvD,CAAC,CAAC,CAAC;IACL,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,OAAO,GAAG,CAAC,CAAW,EAAE,EAAE,CAAC,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,gBAAgB,CAAC;AAC3E,MAAM,QAAQ,GAAG,CAAC,CAAW,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;AAItG,SAAS,WAAW,CAAC,CAAW;IAC9B,IAAI,CAAC,CAAC,IAAI,KAAK,KAAK,IAAI,CAAC,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QAC9C,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACtB,IAAI,CAAC,CAAC;YAAE,OAAO,EAAE,CAAC;QAClB,OAAO,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACnJ,CAAC;IACD,OAAO,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC,CAAC,CAAC;AAC7H,CAAC;AAED,uEAAuE;AACvE,SAAS,MAAM,CAAC,CAAW,EAAE,IAAS,EAAE,KAAe;IACrD,MAAM,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;IAC7B,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACtD,IAAI,CAAC,CAAC,MAAM,KAAK,OAAO,IAAI,IAAI,CAAC,KAAK,IAAI,GAAG,EAAE,CAAC;QAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;QAC9D,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,EAAE,EAAE,GAAG,OAAO,GAAG,GAAG,CAAC,CAAC;QAC1D,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;QAC/E,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QAChE,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC;QACvC,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QACpC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE;YACrC,MAAM,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC;YACxD,KAAK,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,gCAAgC,EAAE,CAAC,KAAK,sBAAsB,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,2BAA2B,IAAI,KAAK,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC;QAChN,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACnB,OAAO,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,GAAG,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;IAC9E,CAAC;IACD,wCAAwC;IACxC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;IACpC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IACnB,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;IACpC,KAAK,MAAM,EAAE,IAAI,KAAK,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,MAAM,GAAG,GAAG,CAAC;QAC9D,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK;YAAE,MAAM;QACvC,KAAK,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,gCAAgC,EAAE,CAAC,KAAK,sBAAsB,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,2BAA2B,IAAI,KAAK,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC/L,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACb,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACnB,OAAO,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;AAC/E,CAAC;AAED,qEAAqE;AACrE,SAAS,SAAS,CAAC,IAAc,EAAE,CAAS,EAAE,EAAyB,EAAE,IAAY,EAAE,KAA6C;IAClI,IAAI,CAAC,CAAC;QAAE,OAAO,EAAE,CAAC;IAClB,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;IACtE,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IAC1F,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5D,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,KAAK;QAAE,GAAG,IAAI,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;IAC5F,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,eAAe,CAAC,CAAQ,EAAE,OAAgB;IACjD,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC;AACnF,CAAC;AAED,SAAS,YAAY,CAAC,CAAW,EAAE,IAAS,EAAE,KAAe;IAC3D,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IACtB,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,QAAQ,KAAK,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IACxF,MAAM,IAAI,GAAG,aAAa,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;IACvE,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC;IACzD,IAAI,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACjI,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,MAAM;QAAE,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAC3I,MAAM,OAAO,GAAG,CAAC,CAAC,QAAQ,KAAK,gBAAgB,IAAI,CAAC,CAAC,OAAO,CAAC;IAC7D,MAAM,UAAU,GAAG,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC;IACpC,MAAM,GAAG,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;IAClD,MAAM,EAAE,GAAG,SAAS,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9E,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,eAAe,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;IAC9K,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;IACzC,MAAM,GAAG,GAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;IAC5I,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC;IAEhK,mCAAmC;IACnC,KAAK,CAAC,IAAI,CAAC,6CAA6C,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;IACtF,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,CAAC;QACzB,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;QACjB,IAAI,UAAU;YAAE,KAAK,CAAC,IAAI,CAAC,6BAA6B,EAAE,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,YAAY,IAAI,wCAAwC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,gDAAgD,IAAI,KAAK,GAAG,CAAC,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC;;YACjU,KAAK,CAAC,IAAI,CAAC,6BAA6B,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,YAAY,IAAI,wCAAwC,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC,6CAA6C,IAAI,KAAK,GAAG,CAAC,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC;IACjT,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAEnB,gBAAgB;IAChB,MAAM,MAAM,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACtE,MAAM,MAAM,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,MAAM,CAAC;IAChH,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACtD,KAAK,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;IAC9C,KAAK,CAAC,IAAI,CAAC,UAAU;QACnB,CAAC,CAAC,aAAa,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,YAAY,IAAI,KAAK;QAC9G,CAAC,CAAC,aAAa,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,IAAI,CAAC,YAAY,IAAI,KAAK,CAAC,CAAC;IACjH,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,UAAU;QACxE,CAAC,CAAC,2BAA2B,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,GAAG,GAAG,GAAG,CAAC,6CAA6C,IAAI,KAAK,GAAG,CAAC,KAAK,CAAC,SAAS;QACxI,CAAC,CAAC,2BAA2B,EAAE,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,gDAAgD,IAAI,KAAK,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;IACxJ,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAEnB,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QACtB,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACxB,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YAC/G,IAAI,IAAI,GAAG,EAAE,EAAE,GAAG,GAAG,KAAK,CAAC;YAC3B,KAAK,MAAM,CAAC,IAAI,GAAG,EAAE,CAAC;gBAAC,IAAI,CAAC,CAAC,EAAE,CAAC;oBAAC,GAAG,GAAG,KAAK,CAAC;oBAAC,SAAS;gBAAC,CAAC;gBAAC,IAAI,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAAC,GAAG,GAAG,IAAI,CAAC;YAAC,CAAC;YAC1H,KAAK,CAAC,IAAI,CAAC,qCAAqC,CAAC,IAAI,CAAC,CAAC;YACvD,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM;gBAAE,KAAK,CAAC,IAAI,CAAC,4BAA4B,IAAI,yBAAyB,CAAC,CAAC,SAAS,qEAAqE,CAAC,CAAC;YAC7K,KAAK,MAAM,CAAC,IAAI,GAAG;gBAAE,IAAI,CAAC;oBAAE,KAAK,CAAC,IAAI,CAAC,yCAAyC,CAAC,iBAAiB,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,SAAS,KAAK,CAAC,CAAC;YAC/L,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACrB,CAAC,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IAED,OAAO;IACP,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,GAAG,CAAC;IAC1C,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAChD,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;IACjC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACxB,KAAK,CAAC,IAAI,CAAC,qCAAqC,CAAC,IAAI,CAAC,CAAC;QACvD,IAAI,CAAC,CAAC,CAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACxB,IAAI,CAAC,CAAC,KAAK,KAAK,IAAI;gBAAE,OAAO;YAC7B,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YACtC,MAAM,MAAM,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC;YACxD,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,eAAe,GAAG,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,KAAK,GAAG,CAAC;YACvE,MAAM,MAAM,GAAG,+BAA+B,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;YACrG,IAAI,UAAU,EAAE,CAAC;gBACf,MAAM,UAAU,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC;gBACnD,KAAK,CAAC,IAAI,CAAC,SAAS,MAAM,OAAO,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,UAAU,GAAG,MAAM,GAAG,KAAK,CAAC,YAAY,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACxJ,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,IAAI,CAAC,SAAS,MAAM,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YACxJ,CAAC;QACH,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACrB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,wDAAwD;AACxD,MAAM,KAAK,GAAG,CAAC,EAAU,EAAE,EAAU,EAAE,CAAS,EAAE,GAAW,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC;AAEjK,SAAS,SAAS,CAAC,EAAU,EAAE,EAAU,EAAE,CAAS,EAAE,KAAa,EAAE,EAAU,EAAE,EAAU;IACzF,IAAI,EAAE,GAAG,EAAE,IAAI,OAAO,EAAE,CAAC;QACvB,8BAA8B;QAC9B,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC;QACtI,OAAO,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACrL,CAAC;IACD,MAAM,KAAK,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpC,MAAM,EAAE,GAAG,KAAK,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,KAAK,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;IAC3D,IAAI,KAAK,IAAI,CAAC;QAAE,OAAO,IAAI,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;IAC9H,MAAM,EAAE,GAAG,KAAK,CAAC,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,KAAK,CAAC,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;IACnE,OAAO,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;AACnL,CAAC;AAED,SAAS,GAAG,CAAC,CAAW,EAAE,IAAS,EAAE,KAAe;IAClD,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACtB,IAAI,CAAC,CAAC;QAAE,OAAO;IACf,MAAM,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC,MAAM,CAAS,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACtF,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9H,MAAM,KAAK,GAAG,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7F,IAAI,CAAC,GAAG,CAAC,CAAC,aAAa,CAAC;IACxB,KAAK,CAAC,IAAI,CAAC,iDAAiD,EAAE,CAAC,EAAE,CAAC,cAAc,EAAE,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAC9G,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACxB,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK;YAAE,OAAO;QAC5C,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,GAAG,CAAC;QAC1C,KAAK,CAAC,IAAI,CAAC,sDAAsD,CAAC,iBAAiB,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,QAAQ,SAAS,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,iFAAiF,CAAC,CAAC;QAChT,CAAC,IAAI,KAAK,CAAC;IACb,CAAC,CAAC,CAAC;IACH,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AACrB,CAAC;AAED,SAAS,OAAO,CAAC,CAAW,EAAE,IAAS,EAAE,KAAe;IACtD,MAAM,GAAG,GAAG,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACpD,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACjC,OAAO,MAAM,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IACrD,CAAC,CAAC,CAAC,CAAC;IACJ,MAAM,GAAG,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAA4C,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpF,MAAM,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACzD,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IACnF,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IACnF,MAAM,EAAE,GAAG,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1H,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,GAAG,eAAe,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;IACrD,MAAM,GAAG,GAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;IAChK,MAAM,EAAE,GAAG,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACxH,MAAM,CAAC,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC;IAC7E,MAAM,CAAC,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC;IAC3F,KAAK,CAAC,IAAI,CAAC,6CAA6C,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;IACtF,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK;QAAE,KAAK,CAAC,IAAI,CAAC,6BAA6B,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,IAAI,wCAAwC,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,6CAA6C,IAAI,KAAK,GAAG,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC;IAC/U,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACnB,KAAK,CAAC,IAAI,CAAC,yCAAyC,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;IAClF,KAAK,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,YAAY,IAAI,KAAK,CAAC,CAAC;IACpJ,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK;QAAE,KAAK,CAAC,IAAI,CAAC,qCAAqC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,gDAAgD,IAAI,KAAK,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IACtN,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACnB,MAAM,KAAK,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;IAClD,MAAM,OAAO,GAAG,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;IACzD,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACxB,KAAK,CAAC,IAAI,CAAC,qCAAqC,CAAC,IAAI,CAAC,CAAC;QACvD,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,CAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAA4C,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAChF,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,4BAA4B,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,yBAAyB,CAAC,CAAC,SAAS,sBAAsB,CAAC,CAAC;QACpN,KAAK,MAAM,CAAC,IAAI,EAAE;YAAE,KAAK,CAAC,IAAI,CAAC,yCAAyC,CAAC,iBAAiB,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC;QACvN,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACrB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,gEAAgE;AAChE,MAAM,CAAC,MAAM,WAAW,GAAG,kCAAkC,CAAC;AAC9D,MAAM,KAAK,GAAG,EAAE,GAAG,WAAW,CAAC,MAAM,GAAG,GAAG,CAAC;AAE5C;;;;GAIG;AACH,MAAM,UAAU,SAAS,CAAC,KAAa,EAAE,IAAY,EAAE,KAAa,EAAE,OAAO,GAAG,KAAK;IACnF,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;IACpE,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;IAClE,IAAI,GAAG,GAAG,qFAAqF,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,SAAS;UAClH,kEAAkE,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;IAC/F,IAAI,MAAM,GAAG,IAAI,CAAC;IAClB,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,GAAG,GAAG,EAAE,CAAC;QACtC,MAAM,MAAM,GAAG,KAAK,GAAG,KAAK,IAAI,KAAK,GAAG,CAAC,CAAC;QAC1C,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACnD,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,EAAE,CAAC;QAC1B,GAAG,IAAI,oCAAoC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,YAAY,EAAE,CAAC,KAAK,CAAC,oEAAoE;cAC9I,YAAY,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,GAAG,IAAI,6EAA6E,GAAG,CAAC,WAAW,CAAC,aAAa,CAAC;IACtJ,CAAC;IACD,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC;AACzB,CAAC;AAED,MAAM,OAAO,GAAG,CAAC,CAAS,EAAE,CAAS,EAAE,KAAa,EAAE,KAAa,EAAE,EAAE,CACrE,6EAA6E,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,2FAA2F,GAAG,CAAC,KAAK,CAAC,KAAK,KAAK,iDAAiD,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC;AAElR;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,SAAS,CAAC,CAAW,EAAE,KAAa,EAAE,IAAY,EAAE,KAAa,EAAE,MAAc,EAAE,KAAK,GAAG,EAAE,EAAE,OAAO,GAAG,KAAK;IAC5H,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IACpD,MAAM,KAAK,GAAa,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC,IAAI,oBAAoB,KAAK,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;IACnH,MAAM,IAAI,GAAQ,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC;IAC3H,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;IACpC,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;IAClC,IAAI,CAAC,CAAC,IAAI,KAAK,KAAK,IAAI,CAAC,CAAC,IAAI,KAAK,UAAU;QAAE,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;SAC9D,IAAI,CAAC,CAAC,IAAI,KAAK,SAAS;QAAE,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;;QAClD,YAAY,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;IAClC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACzB,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACxB,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,QAAQ,CAAC,KAAa,EAAE,IAAY,EAAE,KAAe,EAAE,KAAa,EAAE,MAAc,EAAE,KAAK,GAAG,EAAE,EAAE,OAAO,GAAG,KAAK;IAC/H,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IACpD,MAAM,KAAK,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,kBAAkB,KAAK,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;IACnF,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;IACxD,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACxF,KAAK,CAAC,IAAI,CAAC,wCAAwC,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC,2BAA2B,IAAI,KAAK,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC;IAClJ,CAAC,CAAC,CAAC;IACH,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACrB,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACxB,CAAC"}
|
package/dist/ui.d.ts
ADDED
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { type Plugin, type Selection, type Snapshot, type WorkbookStore } from '@sheetpane/grid';
|
|
2
|
+
import { type ChartsOptions } from './index.js';
|
|
3
|
+
import { type SourceRange } from './refs.js';
|
|
4
|
+
import type { ChartModel } from './model.js';
|
|
5
|
+
/** The controls plugin's id. */
|
|
6
|
+
export declare const UI_ID = "charts-ui";
|
|
7
|
+
/** The keyboard shortcut for Show source cells. */
|
|
8
|
+
export declare const SHORTCUT = "Mod+Shift+U";
|
|
9
|
+
/**
|
|
10
|
+
* The ranges a chart reads, categories before values — the order the status line names them in.
|
|
11
|
+
*
|
|
12
|
+
* @param m - The chart model.
|
|
13
|
+
* @returns The ranges, without duplicates.
|
|
14
|
+
*/
|
|
15
|
+
export declare function sourceList(m: ChartModel): SourceRange[];
|
|
16
|
+
/**
|
|
17
|
+
* The status line's text for a selection: `Chart source: Holdings!E3:E15, H3:H15` while it lies in a chart's plotted
|
|
18
|
+
* cells or under its frame, else `2 charts` on a sheet that has some. Charts not yet read count, but cannot be named.
|
|
19
|
+
*
|
|
20
|
+
* @param snap - A snapshot of the store.
|
|
21
|
+
* @param sel - The selection.
|
|
22
|
+
* @returns The text, or `''`.
|
|
23
|
+
*/
|
|
24
|
+
export declare function statusText(snap: Snapshot, sel: Selection): string;
|
|
25
|
+
/**
|
|
26
|
+
* The chart the shortcut acts on: the one over the active cell, else the sheet's only chart.
|
|
27
|
+
*
|
|
28
|
+
* @param store - The workbook store.
|
|
29
|
+
* @param sel - The selection.
|
|
30
|
+
* @returns The chart part's path, or `undefined`.
|
|
31
|
+
*/
|
|
32
|
+
export declare function targetChart(store: WorkbookStore, sel: Selection): string | undefined;
|
|
33
|
+
/**
|
|
34
|
+
* The charts controls: no hooks; a status line naming the source of the chart under the selection (or the sheet's
|
|
35
|
+
* chart count), and Mod+Shift+U for Show source cells — the keyboard route to each frame's button. Pair it with
|
|
36
|
+
* {@link charts}; importing this module makes `plugins="charts"` enable both.
|
|
37
|
+
*
|
|
38
|
+
* @returns The controls plugin (`id: 'charts-ui'`).
|
|
39
|
+
* @see https://github.com/arpitarya/sheetpane/blob/main/records/0113_CHARTS.md
|
|
40
|
+
* @example
|
|
41
|
+
* ```ts
|
|
42
|
+
* import { createWorkbook } from '@sheetpane/grid';
|
|
43
|
+
* import { charts } from '@sheetpane/charts';
|
|
44
|
+
* import { ui } from '@sheetpane/charts/ui';
|
|
45
|
+
*
|
|
46
|
+
* const book = createWorkbook({ plugins: [charts(), ui()] });
|
|
47
|
+
* ```
|
|
48
|
+
* @example
|
|
49
|
+
* ```ts
|
|
50
|
+
* import '@sheetpane/charts/ui'; // registers `charts` with its controls
|
|
51
|
+
* excel.setAttribute('plugins', 'charts');
|
|
52
|
+
* ```
|
|
53
|
+
*/
|
|
54
|
+
export declare function ui(): Plugin;
|
|
55
|
+
/**
|
|
56
|
+
* The charts plugin and its controls together.
|
|
57
|
+
*
|
|
58
|
+
* @param o - The charts plugin's options.
|
|
59
|
+
* @returns `[charts(o), ui()]`.
|
|
60
|
+
* @example
|
|
61
|
+
* ```ts
|
|
62
|
+
* import { createWorkbook } from '@sheetpane/grid';
|
|
63
|
+
* import { chartsWithUi } from '@sheetpane/charts/ui';
|
|
64
|
+
*
|
|
65
|
+
* const book = createWorkbook({ plugins: chartsWithUi({ draw: false }) });
|
|
66
|
+
* ```
|
|
67
|
+
*/
|
|
68
|
+
export declare function chartsWithUi(o?: ChartsOptions): Plugin[];
|
|
69
|
+
//# sourceMappingURL=ui.d.ts.map
|
package/dist/ui.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../src/ui.ts"],"names":[],"mappings":"AAcA,OAAO,EAA0C,KAAK,MAAM,EAAE,KAAK,SAAS,EAAE,KAAK,QAAQ,EAAE,KAAK,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACzI,OAAO,EAAoE,KAAK,aAAa,EAAE,MAAM,YAAY,CAAC;AAClH,OAAO,EAA6D,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC;AACxG,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,gCAAgC;AAChC,eAAO,MAAM,KAAK,cAAc,CAAC;AACjC,mDAAmD;AACnD,eAAO,MAAM,QAAQ,gBAAgB,CAAC;AAEtC;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE,UAAU,GAAG,WAAW,EAAE,CAEvD;AAiBD;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,SAAS,GAAG,MAAM,CAcjE;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,aAAa,EAAE,GAAG,EAAE,SAAS,GAAG,MAAM,GAAG,SAAS,CAMpF;AAiBD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,EAAE,IAAI,MAAM,CAE3B;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,YAAY,CAAC,CAAC,GAAE,aAAkB,GAAG,MAAM,EAAE,CAE5D"}
|