@fideus-labs/fiff 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,116 @@
1
+ /**
2
+ * Metadata synthesis: generate Zarr v3 (OME-Zarr 0.5) metadata from
3
+ * TIFF image properties and OME-XML.
4
+ */
5
+ import type { ZarrDataType } from "./dtypes.js";
6
+ import type { OmePixels } from "./ome-xml.js";
7
+ import type { PyramidInfo } from "./ifd-indexer.js";
8
+ /** Zarr v3 group zarr.json. */
9
+ export interface ZarrGroupMetadata {
10
+ zarr_format: 3;
11
+ node_type: "group";
12
+ attributes: Record<string, unknown>;
13
+ }
14
+ /** Zarr v3 array zarr.json. */
15
+ export interface ZarrArrayMetadata {
16
+ zarr_format: 3;
17
+ node_type: "array";
18
+ shape: number[];
19
+ data_type: string;
20
+ chunk_grid: {
21
+ name: "regular";
22
+ configuration: {
23
+ chunk_shape: number[];
24
+ };
25
+ };
26
+ chunk_key_encoding: {
27
+ name: "default";
28
+ configuration: {
29
+ separator: string;
30
+ };
31
+ };
32
+ fill_value: number;
33
+ codecs: Array<{
34
+ name: string;
35
+ configuration?: Record<string, unknown>;
36
+ }>;
37
+ dimension_names: string[];
38
+ }
39
+ export interface OmeAxis {
40
+ name: string;
41
+ type: "time" | "space" | "channel";
42
+ unit?: string;
43
+ }
44
+ export interface OmeCoordinateTransformation {
45
+ type: "scale" | "translation";
46
+ scale?: number[];
47
+ translation?: number[];
48
+ }
49
+ export interface OmeDataset {
50
+ path: string;
51
+ coordinateTransformations: OmeCoordinateTransformation[];
52
+ }
53
+ export interface OmeMultiscale {
54
+ name?: string;
55
+ axes: OmeAxis[];
56
+ datasets: OmeDataset[];
57
+ coordinateTransformations?: OmeCoordinateTransformation[];
58
+ }
59
+ export interface OmeroChannel {
60
+ active: boolean;
61
+ color: string;
62
+ label: string;
63
+ window: {
64
+ start: number;
65
+ end: number;
66
+ min: number;
67
+ max: number;
68
+ };
69
+ }
70
+ export interface OmeroMetadata {
71
+ channels: OmeroChannel[];
72
+ rdefs: {
73
+ defaultT: number;
74
+ defaultZ: number;
75
+ model: string;
76
+ };
77
+ }
78
+ /**
79
+ * Determine which axes are present and their order based on the TIFF/OME data.
80
+ *
81
+ * OME-Zarr axis ordering: time first, then channel, then spatial (z, y, x).
82
+ */
83
+ export declare function buildAxes(pixels?: OmePixels): {
84
+ axes: OmeAxis[];
85
+ dimNames: string[];
86
+ };
87
+ /**
88
+ * Build the shape array for a given resolution level.
89
+ */
90
+ export declare function buildShape(pixels: OmePixels | undefined, pyramid: PyramidInfo, level: number, dimNames: string[]): number[];
91
+ /**
92
+ * Build coordinate transformations for a given resolution level.
93
+ * Scale values represent the physical size of each voxel at this level.
94
+ */
95
+ export declare function buildCoordinateTransformations(pixels: OmePixels | undefined, pyramid: PyramidInfo, level: number, dimNames: string[]): OmeCoordinateTransformation[];
96
+ /**
97
+ * Build the full OME-Zarr 0.5 multiscales metadata.
98
+ */
99
+ export declare function buildMultiscales(pixels: OmePixels | undefined, pyramid: PyramidInfo, name?: string): {
100
+ multiscale: OmeMultiscale;
101
+ axes: OmeAxis[];
102
+ dimNames: string[];
103
+ };
104
+ /**
105
+ * Build omero channel display metadata from OME-XML.
106
+ */
107
+ export declare function buildOmero(pixels?: OmePixels, dtype?: ZarrDataType): OmeroMetadata | undefined;
108
+ /**
109
+ * Generate the root group zarr.json.
110
+ */
111
+ export declare function buildRootGroupJson(multiscale: OmeMultiscale, omero?: OmeroMetadata): ZarrGroupMetadata;
112
+ /**
113
+ * Generate an array-level zarr.json for a given resolution level.
114
+ */
115
+ export declare function buildArrayJson(shape: number[], chunkShape: number[], dtype: ZarrDataType, dimNames: string[]): ZarrArrayMetadata;
116
+ //# sourceMappingURL=metadata.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../src/metadata.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,KAAK,EAAE,SAAS,EAAY,MAAM,cAAc,CAAC;AAExD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAIpD,+BAA+B;AAC/B,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,CAAC,CAAC;IACf,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACrC;AAED,+BAA+B;AAC/B,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,CAAC,CAAC;IACf,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE;QACV,IAAI,EAAE,SAAS,CAAC;QAChB,aAAa,EAAE;YAAE,WAAW,EAAE,MAAM,EAAE,CAAA;SAAE,CAAC;KAC1C,CAAC;IACF,kBAAkB,EAAE;QAClB,IAAI,EAAE,SAAS,CAAC;QAChB,aAAa,EAAE;YAAE,SAAS,EAAE,MAAM,CAAA;SAAE,CAAC;KACtC,CAAC;IACF,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC,CAAC;IACzE,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B;AAID,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;IACnC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,2BAA2B;IAC1C,IAAI,EAAE,OAAO,GAAG,aAAa,CAAC;IAC9B,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,yBAAyB,EAAE,2BAA2B,EAAE,CAAC;CAC1D;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,OAAO,EAAE,CAAC;IAChB,QAAQ,EAAE,UAAU,EAAE,CAAC;IACvB,yBAAyB,CAAC,EAAE,2BAA2B,EAAE,CAAC;CAC3D;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE;QACN,KAAK,EAAE,MAAM,CAAC;QACd,GAAG,EAAE,MAAM,CAAC;QACZ,GAAG,EAAE,MAAM,CAAC;QACZ,GAAG,EAAE,MAAM,CAAC;KACb,CAAC;CACH;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,KAAK,EAAE;QACL,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;CACH;AAeD;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,MAAM,CAAC,EAAE,SAAS,GAAG;IAC7C,IAAI,EAAE,OAAO,EAAE,CAAC;IAChB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB,CAwCA;AAED;;GAEG;AACH,wBAAgB,UAAU,CACxB,MAAM,EAAE,SAAS,GAAG,SAAS,EAC7B,OAAO,EAAE,WAAW,EACpB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAAE,GACjB,MAAM,EAAE,CAoBV;AAED;;;GAGG;AACH,wBAAgB,8BAA8B,CAC5C,MAAM,EAAE,SAAS,GAAG,SAAS,EAC7B,OAAO,EAAE,WAAW,EACpB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAAE,GACjB,2BAA2B,EAAE,CAuB/B;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,SAAS,GAAG,SAAS,EAC7B,OAAO,EAAE,WAAW,EACpB,IAAI,CAAC,EAAE,MAAM,GACZ;IAAE,UAAU,EAAE,aAAa,CAAC;IAAC,IAAI,EAAE,OAAO,EAAE,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,CAuBpE;AAED;;GAEG;AACH,wBAAgB,UAAU,CACxB,MAAM,CAAC,EAAE,SAAS,EAClB,KAAK,CAAC,EAAE,YAAY,GACnB,aAAa,GAAG,SAAS,CA2B3B;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,aAAa,EACzB,KAAK,CAAC,EAAE,aAAa,GACpB,iBAAiB,CAYnB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,MAAM,EAAE,EACf,UAAU,EAAE,MAAM,EAAE,EACpB,KAAK,EAAE,YAAY,EACnB,QAAQ,EAAE,MAAM,EAAE,GACjB,iBAAiB,CAuBnB"}
@@ -0,0 +1,234 @@
1
+ /**
2
+ * Metadata synthesis: generate Zarr v3 (OME-Zarr 0.5) metadata from
3
+ * TIFF image properties and OME-XML.
4
+ */
5
+ import { normalizeUnit } from "./ome-xml.js";
6
+ // ---------- Builders ----------
7
+ /** Default colors for channels (RGBA hex without alpha). */
8
+ const DEFAULT_CHANNEL_COLORS = [
9
+ "FF0000", // red
10
+ "00FF00", // green
11
+ "0000FF", // blue
12
+ "FFFF00", // yellow
13
+ "FF00FF", // magenta
14
+ "00FFFF", // cyan
15
+ "FFFFFF", // white
16
+ ];
17
+ /**
18
+ * Determine which axes are present and their order based on the TIFF/OME data.
19
+ *
20
+ * OME-Zarr axis ordering: time first, then channel, then spatial (z, y, x).
21
+ */
22
+ export function buildAxes(pixels) {
23
+ if (!pixels) {
24
+ // Plain TIFF: just y, x
25
+ return {
26
+ axes: [
27
+ { name: "y", type: "space" },
28
+ { name: "x", type: "space" },
29
+ ],
30
+ dimNames: ["y", "x"],
31
+ };
32
+ }
33
+ const axes = [];
34
+ const dimNames = [];
35
+ if (pixels.sizeT > 1) {
36
+ axes.push({ name: "t", type: "time" });
37
+ dimNames.push("t");
38
+ }
39
+ if (pixels.sizeC > 1) {
40
+ axes.push({ name: "c", type: "channel" });
41
+ dimNames.push("c");
42
+ }
43
+ if (pixels.sizeZ > 1) {
44
+ const unit = normalizeUnit(pixels.physicalSizeZUnit);
45
+ axes.push({ name: "z", type: "space", ...(unit && { unit }) });
46
+ dimNames.push("z");
47
+ }
48
+ const yUnit = normalizeUnit(pixels.physicalSizeYUnit);
49
+ axes.push({ name: "y", type: "space", ...(yUnit && { unit: yUnit }) });
50
+ dimNames.push("y");
51
+ const xUnit = normalizeUnit(pixels.physicalSizeXUnit);
52
+ axes.push({ name: "x", type: "space", ...(xUnit && { unit: xUnit }) });
53
+ dimNames.push("x");
54
+ return { axes, dimNames };
55
+ }
56
+ /**
57
+ * Build the shape array for a given resolution level.
58
+ */
59
+ export function buildShape(pixels, pyramid, level, dimNames) {
60
+ const width = pyramid.widths[level];
61
+ const height = pyramid.heights[level];
62
+ return dimNames.map((dim) => {
63
+ switch (dim) {
64
+ case "t":
65
+ return pixels?.sizeT ?? 1;
66
+ case "c":
67
+ return pixels?.sizeC ?? 1;
68
+ case "z":
69
+ return pixels?.sizeZ ?? 1;
70
+ case "y":
71
+ return height;
72
+ case "x":
73
+ return width;
74
+ default:
75
+ return 1;
76
+ }
77
+ });
78
+ }
79
+ /**
80
+ * Build coordinate transformations for a given resolution level.
81
+ * Scale values represent the physical size of each voxel at this level.
82
+ */
83
+ export function buildCoordinateTransformations(pixels, pyramid, level, dimNames) {
84
+ // Compute the downsampling factor relative to level 0
85
+ const xFactor = pyramid.widths[0] / pyramid.widths[level];
86
+ const yFactor = pyramid.heights[0] / pyramid.heights[level];
87
+ const scale = dimNames.map((dim) => {
88
+ switch (dim) {
89
+ case "t":
90
+ return 1.0;
91
+ case "c":
92
+ return 1.0;
93
+ case "z":
94
+ return pixels?.physicalSizeZ ?? 1.0;
95
+ case "y":
96
+ return (pixels?.physicalSizeY ?? 1.0) * yFactor;
97
+ case "x":
98
+ return (pixels?.physicalSizeX ?? 1.0) * xFactor;
99
+ default:
100
+ return 1.0;
101
+ }
102
+ });
103
+ return [{ type: "scale", scale }];
104
+ }
105
+ /**
106
+ * Build the full OME-Zarr 0.5 multiscales metadata.
107
+ */
108
+ export function buildMultiscales(pixels, pyramid, name) {
109
+ const { axes, dimNames } = buildAxes(pixels);
110
+ const datasets = [];
111
+ for (let level = 0; level < pyramid.levels; level++) {
112
+ datasets.push({
113
+ path: String(level),
114
+ coordinateTransformations: buildCoordinateTransformations(pixels, pyramid, level, dimNames),
115
+ });
116
+ }
117
+ const multiscale = {
118
+ axes,
119
+ datasets,
120
+ ...(name && { name }),
121
+ };
122
+ return { multiscale, axes, dimNames };
123
+ }
124
+ /**
125
+ * Build omero channel display metadata from OME-XML.
126
+ */
127
+ export function buildOmero(pixels, dtype) {
128
+ if (!pixels || pixels.channels.length === 0)
129
+ return undefined;
130
+ const maxVal = getMaxValueForDtype(dtype ?? "uint16");
131
+ const channels = pixels.channels.map((ch, i) => ({
132
+ active: true,
133
+ color: ch.color
134
+ ? intToHexColor(ch.color)
135
+ : DEFAULT_CHANNEL_COLORS[i % DEFAULT_CHANNEL_COLORS.length],
136
+ label: ch.name ?? `Channel ${i}`,
137
+ window: {
138
+ start: 0,
139
+ end: maxVal,
140
+ min: 0,
141
+ max: maxVal,
142
+ },
143
+ }));
144
+ return {
145
+ channels,
146
+ rdefs: {
147
+ defaultT: 0,
148
+ defaultZ: Math.floor((pixels.sizeZ - 1) / 2),
149
+ model: pixels.sizeC > 1 ? "color" : "greyscale",
150
+ },
151
+ };
152
+ }
153
+ /**
154
+ * Generate the root group zarr.json.
155
+ */
156
+ export function buildRootGroupJson(multiscale, omero) {
157
+ return {
158
+ zarr_format: 3,
159
+ node_type: "group",
160
+ attributes: {
161
+ ome: {
162
+ version: "0.5",
163
+ multiscales: [multiscale],
164
+ ...(omero && { omero }),
165
+ },
166
+ },
167
+ };
168
+ }
169
+ /**
170
+ * Generate an array-level zarr.json for a given resolution level.
171
+ */
172
+ export function buildArrayJson(shape, chunkShape, dtype, dimNames) {
173
+ return {
174
+ zarr_format: 3,
175
+ node_type: "array",
176
+ shape,
177
+ data_type: dtype,
178
+ chunk_grid: {
179
+ name: "regular",
180
+ configuration: { chunk_shape: chunkShape },
181
+ },
182
+ chunk_key_encoding: {
183
+ name: "default",
184
+ configuration: { separator: "/" },
185
+ },
186
+ fill_value: 0,
187
+ codecs: [
188
+ {
189
+ name: "bytes",
190
+ configuration: { endian: "little" },
191
+ },
192
+ ],
193
+ dimension_names: dimNames,
194
+ };
195
+ }
196
+ // ---------- internal helpers ----------
197
+ function getMaxValueForDtype(dtype) {
198
+ switch (dtype) {
199
+ case "uint8":
200
+ return 255;
201
+ case "int8":
202
+ return 127;
203
+ case "uint16":
204
+ return 65535;
205
+ case "int16":
206
+ return 32767;
207
+ case "uint32":
208
+ return 4294967295;
209
+ case "int32":
210
+ return 2147483647;
211
+ case "float32":
212
+ return 1.0;
213
+ case "float64":
214
+ return 1.0;
215
+ default:
216
+ return 65535;
217
+ }
218
+ }
219
+ /**
220
+ * Convert an integer color (as used in OME-XML) to a hex string.
221
+ * OME-XML stores colors as signed 32-bit integers in RGBA format.
222
+ */
223
+ function intToHexColor(colorInt) {
224
+ // Convert signed to unsigned
225
+ const unsigned = colorInt >>> 0;
226
+ // Extract RGB (ignore alpha)
227
+ const r = (unsigned >> 24) & 0xff;
228
+ const g = (unsigned >> 16) & 0xff;
229
+ const b = (unsigned >> 8) & 0xff;
230
+ return (r.toString(16).padStart(2, "0") +
231
+ g.toString(16).padStart(2, "0") +
232
+ b.toString(16).padStart(2, "0")).toUpperCase();
233
+ }
234
+ //# sourceMappingURL=metadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metadata.js","sourceRoot":"","sources":["../src/metadata.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AA8E7C,iCAAiC;AAEjC,4DAA4D;AAC5D,MAAM,sBAAsB,GAAG;IAC7B,QAAQ,EAAE,MAAM;IAChB,QAAQ,EAAE,QAAQ;IAClB,QAAQ,EAAE,OAAO;IACjB,QAAQ,EAAE,SAAS;IACnB,QAAQ,EAAE,UAAU;IACpB,QAAQ,EAAE,OAAO;IACjB,QAAQ,EAAE,QAAQ;CACnB,CAAC;AAEF;;;;GAIG;AACH,MAAM,UAAU,SAAS,CAAC,MAAkB;IAI1C,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,wBAAwB;QACxB,OAAO;YACL,IAAI,EAAE;gBACJ,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE;gBAC5B,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE;aAC7B;YACD,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC;SACrB,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAc,EAAE,CAAC;IAC3B,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,IAAI,MAAM,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC;QACrB,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;QACvC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACrB,CAAC;IAED,IAAI,MAAM,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC;QACrB,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;QAC1C,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACrB,CAAC;IAED,IAAI,MAAM,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC;QACrB,MAAM,IAAI,GAAG,aAAa,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;QACrD,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,IAAI,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;QAC/D,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACrB,CAAC;IAED,MAAM,KAAK,GAAG,aAAa,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;IACtD,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,KAAK,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;IACvE,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAEnB,MAAM,KAAK,GAAG,aAAa,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;IACtD,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,KAAK,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;IACvE,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAEnB,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;AAC5B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CACxB,MAA6B,EAC7B,OAAoB,EACpB,KAAa,EACb,QAAkB;IAElB,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACpC,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAEtC,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QAC1B,QAAQ,GAAG,EAAE,CAAC;YACZ,KAAK,GAAG;gBACN,OAAO,MAAM,EAAE,KAAK,IAAI,CAAC,CAAC;YAC5B,KAAK,GAAG;gBACN,OAAO,MAAM,EAAE,KAAK,IAAI,CAAC,CAAC;YAC5B,KAAK,GAAG;gBACN,OAAO,MAAM,EAAE,KAAK,IAAI,CAAC,CAAC;YAC5B,KAAK,GAAG;gBACN,OAAO,MAAM,CAAC;YAChB,KAAK,GAAG;gBACN,OAAO,KAAK,CAAC;YACf;gBACE,OAAO,CAAC,CAAC;QACb,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,8BAA8B,CAC5C,MAA6B,EAC7B,OAAoB,EACpB,KAAa,EACb,QAAkB;IAElB,sDAAsD;IACtD,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC1D,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAE5D,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QACjC,QAAQ,GAAG,EAAE,CAAC;YACZ,KAAK,GAAG;gBACN,OAAO,GAAG,CAAC;YACb,KAAK,GAAG;gBACN,OAAO,GAAG,CAAC;YACb,KAAK,GAAG;gBACN,OAAO,MAAM,EAAE,aAAa,IAAI,GAAG,CAAC;YACtC,KAAK,GAAG;gBACN,OAAO,CAAC,MAAM,EAAE,aAAa,IAAI,GAAG,CAAC,GAAG,OAAO,CAAC;YAClD,KAAK,GAAG;gBACN,OAAO,CAAC,MAAM,EAAE,aAAa,IAAI,GAAG,CAAC,GAAG,OAAO,CAAC;YAClD;gBACE,OAAO,GAAG,CAAC;QACf,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,EAAE,IAAI,EAAE,OAAgB,EAAE,KAAK,EAAE,CAAC,CAAC;AAC7C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAC9B,MAA6B,EAC7B,OAAoB,EACpB,IAAa;IAEb,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;IAE7C,MAAM,QAAQ,GAAiB,EAAE,CAAC;IAClC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;QACpD,QAAQ,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC;YACnB,yBAAyB,EAAE,8BAA8B,CACvD,MAAM,EACN,OAAO,EACP,KAAK,EACL,QAAQ,CACT;SACF,CAAC,CAAC;IACL,CAAC;IAED,MAAM,UAAU,GAAkB;QAChC,IAAI;QACJ,QAAQ;QACR,GAAG,CAAC,IAAI,IAAI,EAAE,IAAI,EAAE,CAAC;KACtB,CAAC;IAEF,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;AACxC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CACxB,MAAkB,EAClB,KAAoB;IAEpB,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAE9D,MAAM,MAAM,GAAG,mBAAmB,CAAC,KAAK,IAAI,QAAQ,CAAC,CAAC;IAEtD,MAAM,QAAQ,GAAmB,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QAC/D,MAAM,EAAE,IAAI;QACZ,KAAK,EAAE,EAAE,CAAC,KAAK;YACb,CAAC,CAAC,aAAa,CAAC,EAAE,CAAC,KAAK,CAAC;YACzB,CAAC,CAAC,sBAAsB,CAAC,CAAC,GAAG,sBAAsB,CAAC,MAAM,CAAC;QAC7D,KAAK,EAAE,EAAE,CAAC,IAAI,IAAI,WAAW,CAAC,EAAE;QAChC,MAAM,EAAE;YACN,KAAK,EAAE,CAAC;YACR,GAAG,EAAE,MAAM;YACX,GAAG,EAAE,CAAC;YACN,GAAG,EAAE,MAAM;SACZ;KACF,CAAC,CAAC,CAAC;IAEJ,OAAO;QACL,QAAQ;QACR,KAAK,EAAE;YACL,QAAQ,EAAE,CAAC;YACX,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;YAC5C,KAAK,EAAE,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW;SAChD;KACF,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAChC,UAAyB,EACzB,KAAqB;IAErB,OAAO;QACL,WAAW,EAAE,CAAC;QACd,SAAS,EAAE,OAAO;QAClB,UAAU,EAAE;YACV,GAAG,EAAE;gBACH,OAAO,EAAE,KAAK;gBACd,WAAW,EAAE,CAAC,UAAU,CAAC;gBACzB,GAAG,CAAC,KAAK,IAAI,EAAE,KAAK,EAAE,CAAC;aACxB;SACF;KACF,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAC5B,KAAe,EACf,UAAoB,EACpB,KAAmB,EACnB,QAAkB;IAElB,OAAO;QACL,WAAW,EAAE,CAAC;QACd,SAAS,EAAE,OAAO;QAClB,KAAK;QACL,SAAS,EAAE,KAAK;QAChB,UAAU,EAAE;YACV,IAAI,EAAE,SAAS;YACf,aAAa,EAAE,EAAE,WAAW,EAAE,UAAU,EAAE;SAC3C;QACD,kBAAkB,EAAE;YAClB,IAAI,EAAE,SAAS;YACf,aAAa,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE;SAClC;QACD,UAAU,EAAE,CAAC;QACb,MAAM,EAAE;YACN;gBACE,IAAI,EAAE,OAAO;gBACb,aAAa,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE;aACpC;SACF;QACD,eAAe,EAAE,QAAQ;KAC1B,CAAC;AACJ,CAAC;AAED,yCAAyC;AAEzC,SAAS,mBAAmB,CAAC,KAAmB;IAC9C,QAAQ,KAAK,EAAE,CAAC;QACd,KAAK,OAAO;YACV,OAAO,GAAG,CAAC;QACb,KAAK,MAAM;YACT,OAAO,GAAG,CAAC;QACb,KAAK,QAAQ;YACX,OAAO,KAAK,CAAC;QACf,KAAK,OAAO;YACV,OAAO,KAAK,CAAC;QACf,KAAK,QAAQ;YACX,OAAO,UAAU,CAAC;QACpB,KAAK,OAAO;YACV,OAAO,UAAU,CAAC;QACpB,KAAK,SAAS;YACZ,OAAO,GAAG,CAAC;QACb,KAAK,SAAS;YACZ,OAAO,GAAG,CAAC;QACb;YACE,OAAO,KAAK,CAAC;IACjB,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAS,aAAa,CAAC,QAAgB;IACrC,6BAA6B;IAC7B,MAAM,QAAQ,GAAG,QAAQ,KAAK,CAAC,CAAC;IAChC,6BAA6B;IAC7B,MAAM,CAAC,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;IAClC,MAAM,CAAC,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;IAClC,MAAM,CAAC,GAAG,CAAC,QAAQ,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC;IACjC,OAAO,CACL,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;QAC/B,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;QAC/B,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAChC,CAAC,WAAW,EAAE,CAAC;AAClB,CAAC"}
@@ -0,0 +1,74 @@
1
+ /**
2
+ * OME-XML parser for extracting metadata from OME-TIFF ImageDescription tags.
3
+ *
4
+ * Parses the OME-XML embedded in TIFF files to extract dimension sizes,
5
+ * dimension ordering, channel info, physical pixel sizes, and TiffData
6
+ * references for multi-file OME-TIFF.
7
+ */
8
+ /** Valid OME DimensionOrder values. */
9
+ export type DimensionOrder = "XYZCT" | "XYZTC" | "XYCTZ" | "XYCZT" | "XYTCZ" | "XYTZC";
10
+ /** Parsed OME channel metadata. */
11
+ export interface OmeChannel {
12
+ id: string;
13
+ name?: string;
14
+ samplesPerPixel: number;
15
+ color?: number;
16
+ }
17
+ /** Parsed OME-XML Pixels metadata for a single Image. */
18
+ export interface OmePixels {
19
+ sizeX: number;
20
+ sizeY: number;
21
+ sizeZ: number;
22
+ sizeC: number;
23
+ sizeT: number;
24
+ dimensionOrder: DimensionOrder;
25
+ type: string;
26
+ physicalSizeX?: number;
27
+ physicalSizeXUnit?: string;
28
+ physicalSizeY?: number;
29
+ physicalSizeYUnit?: string;
30
+ physicalSizeZ?: number;
31
+ physicalSizeZUnit?: string;
32
+ bigEndian: boolean;
33
+ interleaved: boolean;
34
+ channels: OmeChannel[];
35
+ }
36
+ /** Parsed OME-XML Image entry. */
37
+ export interface OmeImage {
38
+ id: string;
39
+ name?: string;
40
+ pixels: OmePixels;
41
+ }
42
+ /**
43
+ * Check if a string looks like OME-XML (starts with an OME root element).
44
+ */
45
+ export declare function isOmeXml(description: string): boolean;
46
+ /**
47
+ * Parse OME-XML string into structured metadata.
48
+ *
49
+ * Uses a simple regex/string-based XML parser that works in any JS runtime
50
+ * (no DOMParser dependency for Node/Bun compatibility).
51
+ *
52
+ * @param xml - The OME-XML string from the TIFF ImageDescription tag.
53
+ * @returns Array of parsed OmeImage objects.
54
+ */
55
+ export declare function parseOmeXml(xml: string): OmeImage[];
56
+ /**
57
+ * Compute the IFD index for a given (c, z, t) selection within an OME image,
58
+ * based on the DimensionOrder.
59
+ *
60
+ * The DimensionOrder string specifies which dimensions vary fastest after XY.
61
+ * For example, XYZCT means Z varies fastest, then C, then T.
62
+ *
63
+ * @param c - Channel index.
64
+ * @param z - Z-slice index.
65
+ * @param t - Timepoint index.
66
+ * @param pixels - The OmePixels metadata containing dimension sizes and order.
67
+ * @returns The relative IFD index within this image.
68
+ */
69
+ export declare function getIfdIndex(c: number, z: number, t: number, pixels: OmePixels): number;
70
+ /**
71
+ * Map an OME physical size unit string to a standard unit name.
72
+ */
73
+ export declare function normalizeUnit(unit?: string): string | undefined;
74
+ //# sourceMappingURL=ome-xml.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ome-xml.d.ts","sourceRoot":"","sources":["../src/ome-xml.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,uCAAuC;AACvC,MAAM,MAAM,cAAc,GACtB,OAAO,GACP,OAAO,GACP,OAAO,GACP,OAAO,GACP,OAAO,GACP,OAAO,CAAC;AAWZ,mCAAmC;AACnC,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,MAAM,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,yDAAyD;AACzD,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,cAAc,CAAC;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,EAAE,OAAO,CAAC;IACrB,QAAQ,EAAE,UAAU,EAAE,CAAC;CACxB;AAED,kCAAkC;AAClC,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,SAAS,CAAC;CACnB;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CASrD;AAED;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,EAAE,CAgFnD;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,WAAW,CACzB,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,MAAM,EAAE,SAAS,GAChB,MAAM,CAqBR;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAiB/D"}
@@ -0,0 +1,178 @@
1
+ /**
2
+ * OME-XML parser for extracting metadata from OME-TIFF ImageDescription tags.
3
+ *
4
+ * Parses the OME-XML embedded in TIFF files to extract dimension sizes,
5
+ * dimension ordering, channel info, physical pixel sizes, and TiffData
6
+ * references for multi-file OME-TIFF.
7
+ */
8
+ const VALID_DIMENSION_ORDERS = new Set([
9
+ "XYZCT",
10
+ "XYZTC",
11
+ "XYCTZ",
12
+ "XYCZT",
13
+ "XYTCZ",
14
+ "XYTZC",
15
+ ]);
16
+ /**
17
+ * Check if a string looks like OME-XML (starts with an OME root element).
18
+ */
19
+ export function isOmeXml(description) {
20
+ if (!description)
21
+ return false;
22
+ const trimmed = description.trim();
23
+ // Check for XML processing instruction or direct OME element
24
+ return (trimmed.startsWith("<?xml") ||
25
+ trimmed.startsWith("<OME") ||
26
+ trimmed.startsWith("<ome:"));
27
+ }
28
+ /**
29
+ * Parse OME-XML string into structured metadata.
30
+ *
31
+ * Uses a simple regex/string-based XML parser that works in any JS runtime
32
+ * (no DOMParser dependency for Node/Bun compatibility).
33
+ *
34
+ * @param xml - The OME-XML string from the TIFF ImageDescription tag.
35
+ * @returns Array of parsed OmeImage objects.
36
+ */
37
+ export function parseOmeXml(xml) {
38
+ const images = [];
39
+ // Find all <Image ...>...</Image> blocks
40
+ const imageRegex = /<Image\s([^>]*)>([\s\S]*?)<\/Image>/g;
41
+ let imageMatch;
42
+ while ((imageMatch = imageRegex.exec(xml)) !== null) {
43
+ const imageAttrs = parseAttributes(imageMatch[1]);
44
+ const imageBody = imageMatch[2];
45
+ // Find <Pixels ...>...</Pixels> block
46
+ const pixelsRegex = /<Pixels\s([^>]*)>([\s\S]*?)<\/Pixels>/;
47
+ const pixelsMatch = pixelsRegex.exec(imageBody);
48
+ if (!pixelsMatch)
49
+ continue;
50
+ const pixelAttrs = parseAttributes(pixelsMatch[1]);
51
+ const pixelsBody = pixelsMatch[2];
52
+ // Parse channels
53
+ const channels = [];
54
+ const channelRegex = /<Channel\s([^/>]*)\/?>/g;
55
+ let channelMatch;
56
+ while ((channelMatch = channelRegex.exec(pixelsBody)) !== null) {
57
+ const chAttrs = parseAttributes(channelMatch[1]);
58
+ channels.push({
59
+ id: chAttrs["ID"] ?? `Channel:0:${channels.length}`,
60
+ name: chAttrs["Name"],
61
+ samplesPerPixel: parseInt(chAttrs["SamplesPerPixel"] ?? "1", 10),
62
+ color: chAttrs["Color"] ? parseInt(chAttrs["Color"], 10) : undefined,
63
+ });
64
+ }
65
+ const dimensionOrder = pixelAttrs["DimensionOrder"];
66
+ if (!VALID_DIMENSION_ORDERS.has(dimensionOrder)) {
67
+ throw new Error(`Invalid DimensionOrder: ${dimensionOrder}`);
68
+ }
69
+ const pixels = {
70
+ sizeX: parseInt(pixelAttrs["SizeX"], 10),
71
+ sizeY: parseInt(pixelAttrs["SizeY"], 10),
72
+ sizeZ: parseInt(pixelAttrs["SizeZ"] ?? "1", 10),
73
+ sizeC: parseInt(pixelAttrs["SizeC"] ?? "1", 10),
74
+ sizeT: parseInt(pixelAttrs["SizeT"] ?? "1", 10),
75
+ dimensionOrder: dimensionOrder,
76
+ type: pixelAttrs["Type"] ?? "uint16",
77
+ physicalSizeX: pixelAttrs["PhysicalSizeX"]
78
+ ? parseFloat(pixelAttrs["PhysicalSizeX"])
79
+ : undefined,
80
+ physicalSizeXUnit: pixelAttrs["PhysicalSizeXUnit"] ?? "µm",
81
+ physicalSizeY: pixelAttrs["PhysicalSizeY"]
82
+ ? parseFloat(pixelAttrs["PhysicalSizeY"])
83
+ : undefined,
84
+ physicalSizeYUnit: pixelAttrs["PhysicalSizeYUnit"] ?? "µm",
85
+ physicalSizeZ: pixelAttrs["PhysicalSizeZ"]
86
+ ? parseFloat(pixelAttrs["PhysicalSizeZ"])
87
+ : undefined,
88
+ physicalSizeZUnit: pixelAttrs["PhysicalSizeZUnit"] ?? "µm",
89
+ bigEndian: pixelAttrs["BigEndian"] === "true",
90
+ interleaved: pixelAttrs["Interleaved"] === "true",
91
+ channels,
92
+ };
93
+ // If no channels were found in XML, create a default one for each SizeC
94
+ if (pixels.channels.length === 0) {
95
+ for (let c = 0; c < pixels.sizeC; c++) {
96
+ pixels.channels.push({
97
+ id: `Channel:0:${c}`,
98
+ samplesPerPixel: 1,
99
+ });
100
+ }
101
+ }
102
+ images.push({
103
+ id: imageAttrs["ID"] ?? `Image:${images.length}`,
104
+ name: imageAttrs["Name"],
105
+ pixels,
106
+ });
107
+ }
108
+ return images;
109
+ }
110
+ /**
111
+ * Compute the IFD index for a given (c, z, t) selection within an OME image,
112
+ * based on the DimensionOrder.
113
+ *
114
+ * The DimensionOrder string specifies which dimensions vary fastest after XY.
115
+ * For example, XYZCT means Z varies fastest, then C, then T.
116
+ *
117
+ * @param c - Channel index.
118
+ * @param z - Z-slice index.
119
+ * @param t - Timepoint index.
120
+ * @param pixels - The OmePixels metadata containing dimension sizes and order.
121
+ * @returns The relative IFD index within this image.
122
+ */
123
+ export function getIfdIndex(c, z, t, pixels) {
124
+ const { sizeZ, sizeC, sizeT } = pixels;
125
+ switch (pixels.dimensionOrder) {
126
+ case "XYZCT":
127
+ return z + sizeZ * c + sizeZ * sizeC * t;
128
+ case "XYZTC":
129
+ return z + sizeZ * t + sizeZ * sizeT * c;
130
+ case "XYCTZ":
131
+ return c + sizeC * t + sizeC * sizeT * z;
132
+ case "XYCZT":
133
+ return c + sizeC * z + sizeC * sizeZ * t;
134
+ case "XYTCZ":
135
+ return t + sizeT * c + sizeT * sizeC * z;
136
+ case "XYTZC":
137
+ return t + sizeT * z + sizeT * sizeZ * c;
138
+ default:
139
+ throw new Error(`Unknown DimensionOrder: ${pixels.dimensionOrder}`);
140
+ }
141
+ }
142
+ /**
143
+ * Map an OME physical size unit string to a standard unit name.
144
+ */
145
+ export function normalizeUnit(unit) {
146
+ if (!unit)
147
+ return undefined;
148
+ const map = {
149
+ "\u00B5m": "micrometer",
150
+ "\u03BCm": "micrometer",
151
+ um: "micrometer",
152
+ micrometer: "micrometer",
153
+ nm: "nanometer",
154
+ nanometer: "nanometer",
155
+ mm: "millimeter",
156
+ millimeter: "millimeter",
157
+ cm: "centimeter",
158
+ centimeter: "centimeter",
159
+ m: "meter",
160
+ meter: "meter",
161
+ };
162
+ return map[unit] ?? unit;
163
+ }
164
+ // ---------- internal helpers ----------
165
+ /**
166
+ * Parse XML attributes from an attribute string.
167
+ * E.g. `ID="Image:0" Name="test"` -> { ID: "Image:0", Name: "test" }
168
+ */
169
+ function parseAttributes(attrString) {
170
+ const attrs = {};
171
+ const regex = /(\w+)="([^"]*)"/g;
172
+ let m;
173
+ while ((m = regex.exec(attrString)) !== null) {
174
+ attrs[m[1]] = m[2];
175
+ }
176
+ return regex.lastIndex, attrs;
177
+ }
178
+ //# sourceMappingURL=ome-xml.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ome-xml.js","sourceRoot":"","sources":["../src/ome-xml.ts"],"names":[],"mappings":"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"}