@fishka/seqio 0.7.0 → 0.8.1
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/dist/index.d.mts +61 -2
- package/dist/index.d.ts +61 -2
- package/dist/index.js +10 -10
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +10 -10
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.d.mts
CHANGED
|
@@ -10,7 +10,7 @@ export { AbifBaseCallRole, AbifBaseCallVariant, AbifBaseCalls, AbifByteRange, Ab
|
|
|
10
10
|
* file still resolves.
|
|
11
11
|
*/
|
|
12
12
|
/** A format {@link detectFormat} can recognize. Some are detected before their reader ships. */
|
|
13
|
-
type SeqFileFormat = 'abif' | 'scf' | 'fasta' | 'fastq' | 'genbank' | 'embl' | 'swissprot' | 'clustal' | 'stockholm' | 'phylip' | 'nexus' | 'msf' | 'pir' | 'gff' | 'unknown';
|
|
13
|
+
type SeqFileFormat = 'abif' | 'scf' | 'fasta' | 'fastq' | 'genbank' | 'embl' | 'swissprot' | 'clustal' | 'stockholm' | 'phylip' | 'nexus' | 'msf' | 'pir' | 'gff' | 'sam' | 'bam' | 'gfa' | 'unknown';
|
|
14
14
|
/**
|
|
15
15
|
* Detect the sequencing file format from its content. Returns 'unknown' when no signature
|
|
16
16
|
* matches (empty input, or a leading line that is neither a known magic nor a recognized
|
|
@@ -181,6 +181,23 @@ declare function hasUsableQuality(qualities?: readonly number[]): boolean;
|
|
|
181
181
|
|
|
182
182
|
declare function parseGenbank(input: string | Uint8Array): SeqRecord[];
|
|
183
183
|
|
|
184
|
+
/**
|
|
185
|
+
* GFA (Graphical Fragment Assembly, `.gfa`) reader — sequence extraction.
|
|
186
|
+
*
|
|
187
|
+
* Assembly / pangenome graphs. Only Segment (`S`) lines carry sequence; links, paths, jumps and
|
|
188
|
+
* containments are graph topology and hold none. Both dialects are supported by field position:
|
|
189
|
+
*
|
|
190
|
+
* GFA1: S <name> <sequence> [tags…]
|
|
191
|
+
* GFA2: S <sid> <slen> <sequence> [tags…]
|
|
192
|
+
*
|
|
193
|
+
* GFA2 inserts an integer segment length between the name and the sequence, so when the field after
|
|
194
|
+
* the name is a bare integer AND another field follows, the sequence is that next field; otherwise
|
|
195
|
+
* it's the field right after the name (GFA1). A `*` sequence (a segment declared without residues)
|
|
196
|
+
* is skipped — there's nothing to pick. Lenient: never throws; malformed lines are ignored.
|
|
197
|
+
*/
|
|
198
|
+
|
|
199
|
+
declare function parseGfa(input: string | Uint8Array): SeqRecord[];
|
|
200
|
+
|
|
184
201
|
/**
|
|
185
202
|
* GFF3 (`.gff`/`.gff3`) reader — sequence extraction.
|
|
186
203
|
*
|
|
@@ -250,4 +267,46 @@ declare function parseMsf(input: string | Uint8Array): SeqRecord[];
|
|
|
250
267
|
|
|
251
268
|
declare function parsePir(input: string | Uint8Array): SeqRecord[];
|
|
252
269
|
|
|
253
|
-
|
|
270
|
+
/**
|
|
271
|
+
* BAM (`.bam`) reader — read-sequence extraction from the binary alignment format.
|
|
272
|
+
*
|
|
273
|
+
* BAM is the binary twin of SAM. On disk it is BGZF-compressed (a gzip stream of concatenated
|
|
274
|
+
* blocks); this reader expects the INFLATED bytes — starting with the "BAM\1" magic. The caller
|
|
275
|
+
* peels the gzip/BGZF wrapper first (a gzip decompressor decodes BGZF's concatenated members), so
|
|
276
|
+
* this stays a synchronous, dependency-free binary parser.
|
|
277
|
+
*
|
|
278
|
+
* Semantics mirror the SAM reader exactly (see {@link parseSam}): one sequence per read (secondary
|
|
279
|
+
* 0x100 / supplementary 0x800 skipped), reverse-strand sequence stored verbatim (reference-forward),
|
|
280
|
+
* id = read name (+ /1,/2 for paired mates), description = "RNAME:POS (+/-)" or "unmapped". Records
|
|
281
|
+
* without a stored sequence (l_seq = 0) are skipped. Lenient: on any truncation or garble it stops
|
|
282
|
+
* and returns what it parsed cleanly, never throwing.
|
|
283
|
+
*/
|
|
284
|
+
|
|
285
|
+
declare function parseBam(bytes: Uint8Array): SeqRecord[];
|
|
286
|
+
|
|
287
|
+
/**
|
|
288
|
+
* SAM (`.sam`) reader — read-sequence extraction.
|
|
289
|
+
*
|
|
290
|
+
* SAM is a read-alignment format: one record per alignment, tab-delimited, with 11 mandatory
|
|
291
|
+
* fields (QNAME FLAG RNAME POS MAPQ CIGAR RNEXT PNEXT TLEN SEQ QUAL). This reader returns each
|
|
292
|
+
* record's read sequence — field 10, `SEQ`. Records whose SEQ is `*` (sequence not stored) are
|
|
293
|
+
* skipped: there's nothing to pick.
|
|
294
|
+
*
|
|
295
|
+
* The sequence is returned VERBATIM as written. For a reverse-strand alignment (FLAG bit 0x10) SAM
|
|
296
|
+
* already stores the reverse complement (reference-forward orientation), so that reference-oriented
|
|
297
|
+
* sequence is what you get — it is deliberately not un-flipped to the original read orientation.
|
|
298
|
+
*
|
|
299
|
+
* One sequence per read: secondary (FLAG 0x100) and supplementary (0x800) alignments are skipped —
|
|
300
|
+
* they re-map the same read (a duplicate, or a hard-clipped split fragment), which would pollute a
|
|
301
|
+
* "pick the sequences" list. What's kept is the read's SEQ from its primary (or unmapped) record —
|
|
302
|
+
* i.e. the sequence as SAM stores it, which for a hard-clipped primary alignment omits the clipped
|
|
303
|
+
* flanks rather than reconstructing the original full read.
|
|
304
|
+
*
|
|
305
|
+
* `@`-prefixed lines are skipped as headers — the SAM spec's QNAME charset `[!-?A-~]` excludes '@'
|
|
306
|
+
* (0x40) precisely so a read name can never be confused with a header. Lenient: never throws; lines
|
|
307
|
+
* with fewer than 11 fields are ignored rather than rejected.
|
|
308
|
+
*/
|
|
309
|
+
|
|
310
|
+
declare function parseSam(input: string | Uint8Array): SeqRecord[];
|
|
311
|
+
|
|
312
|
+
export { type FastaRecord, type FastqRecord, MAX_PHRED, type QualRecord, type SeqFileFormat, type SeqRecord, type WrapOptions, detectFormat, formatFasta, formatFastq, formatQual, hasUsableQuality, makeSeqRecord, parseBam, parseClustal, parseEmbl, parseFasta, parseFastq, parseGenbank, parseGfa, parseGff, parseMsf, parseNexus, parsePhylip, parsePir, parseSam, parseStockholm, parseSwissprot };
|
package/dist/index.d.ts
CHANGED
|
@@ -10,7 +10,7 @@ export { AbifBaseCallRole, AbifBaseCallVariant, AbifBaseCalls, AbifByteRange, Ab
|
|
|
10
10
|
* file still resolves.
|
|
11
11
|
*/
|
|
12
12
|
/** A format {@link detectFormat} can recognize. Some are detected before their reader ships. */
|
|
13
|
-
type SeqFileFormat = 'abif' | 'scf' | 'fasta' | 'fastq' | 'genbank' | 'embl' | 'swissprot' | 'clustal' | 'stockholm' | 'phylip' | 'nexus' | 'msf' | 'pir' | 'gff' | 'unknown';
|
|
13
|
+
type SeqFileFormat = 'abif' | 'scf' | 'fasta' | 'fastq' | 'genbank' | 'embl' | 'swissprot' | 'clustal' | 'stockholm' | 'phylip' | 'nexus' | 'msf' | 'pir' | 'gff' | 'sam' | 'bam' | 'gfa' | 'unknown';
|
|
14
14
|
/**
|
|
15
15
|
* Detect the sequencing file format from its content. Returns 'unknown' when no signature
|
|
16
16
|
* matches (empty input, or a leading line that is neither a known magic nor a recognized
|
|
@@ -181,6 +181,23 @@ declare function hasUsableQuality(qualities?: readonly number[]): boolean;
|
|
|
181
181
|
|
|
182
182
|
declare function parseGenbank(input: string | Uint8Array): SeqRecord[];
|
|
183
183
|
|
|
184
|
+
/**
|
|
185
|
+
* GFA (Graphical Fragment Assembly, `.gfa`) reader — sequence extraction.
|
|
186
|
+
*
|
|
187
|
+
* Assembly / pangenome graphs. Only Segment (`S`) lines carry sequence; links, paths, jumps and
|
|
188
|
+
* containments are graph topology and hold none. Both dialects are supported by field position:
|
|
189
|
+
*
|
|
190
|
+
* GFA1: S <name> <sequence> [tags…]
|
|
191
|
+
* GFA2: S <sid> <slen> <sequence> [tags…]
|
|
192
|
+
*
|
|
193
|
+
* GFA2 inserts an integer segment length between the name and the sequence, so when the field after
|
|
194
|
+
* the name is a bare integer AND another field follows, the sequence is that next field; otherwise
|
|
195
|
+
* it's the field right after the name (GFA1). A `*` sequence (a segment declared without residues)
|
|
196
|
+
* is skipped — there's nothing to pick. Lenient: never throws; malformed lines are ignored.
|
|
197
|
+
*/
|
|
198
|
+
|
|
199
|
+
declare function parseGfa(input: string | Uint8Array): SeqRecord[];
|
|
200
|
+
|
|
184
201
|
/**
|
|
185
202
|
* GFF3 (`.gff`/`.gff3`) reader — sequence extraction.
|
|
186
203
|
*
|
|
@@ -250,4 +267,46 @@ declare function parseMsf(input: string | Uint8Array): SeqRecord[];
|
|
|
250
267
|
|
|
251
268
|
declare function parsePir(input: string | Uint8Array): SeqRecord[];
|
|
252
269
|
|
|
253
|
-
|
|
270
|
+
/**
|
|
271
|
+
* BAM (`.bam`) reader — read-sequence extraction from the binary alignment format.
|
|
272
|
+
*
|
|
273
|
+
* BAM is the binary twin of SAM. On disk it is BGZF-compressed (a gzip stream of concatenated
|
|
274
|
+
* blocks); this reader expects the INFLATED bytes — starting with the "BAM\1" magic. The caller
|
|
275
|
+
* peels the gzip/BGZF wrapper first (a gzip decompressor decodes BGZF's concatenated members), so
|
|
276
|
+
* this stays a synchronous, dependency-free binary parser.
|
|
277
|
+
*
|
|
278
|
+
* Semantics mirror the SAM reader exactly (see {@link parseSam}): one sequence per read (secondary
|
|
279
|
+
* 0x100 / supplementary 0x800 skipped), reverse-strand sequence stored verbatim (reference-forward),
|
|
280
|
+
* id = read name (+ /1,/2 for paired mates), description = "RNAME:POS (+/-)" or "unmapped". Records
|
|
281
|
+
* without a stored sequence (l_seq = 0) are skipped. Lenient: on any truncation or garble it stops
|
|
282
|
+
* and returns what it parsed cleanly, never throwing.
|
|
283
|
+
*/
|
|
284
|
+
|
|
285
|
+
declare function parseBam(bytes: Uint8Array): SeqRecord[];
|
|
286
|
+
|
|
287
|
+
/**
|
|
288
|
+
* SAM (`.sam`) reader — read-sequence extraction.
|
|
289
|
+
*
|
|
290
|
+
* SAM is a read-alignment format: one record per alignment, tab-delimited, with 11 mandatory
|
|
291
|
+
* fields (QNAME FLAG RNAME POS MAPQ CIGAR RNEXT PNEXT TLEN SEQ QUAL). This reader returns each
|
|
292
|
+
* record's read sequence — field 10, `SEQ`. Records whose SEQ is `*` (sequence not stored) are
|
|
293
|
+
* skipped: there's nothing to pick.
|
|
294
|
+
*
|
|
295
|
+
* The sequence is returned VERBATIM as written. For a reverse-strand alignment (FLAG bit 0x10) SAM
|
|
296
|
+
* already stores the reverse complement (reference-forward orientation), so that reference-oriented
|
|
297
|
+
* sequence is what you get — it is deliberately not un-flipped to the original read orientation.
|
|
298
|
+
*
|
|
299
|
+
* One sequence per read: secondary (FLAG 0x100) and supplementary (0x800) alignments are skipped —
|
|
300
|
+
* they re-map the same read (a duplicate, or a hard-clipped split fragment), which would pollute a
|
|
301
|
+
* "pick the sequences" list. What's kept is the read's SEQ from its primary (or unmapped) record —
|
|
302
|
+
* i.e. the sequence as SAM stores it, which for a hard-clipped primary alignment omits the clipped
|
|
303
|
+
* flanks rather than reconstructing the original full read.
|
|
304
|
+
*
|
|
305
|
+
* `@`-prefixed lines are skipped as headers — the SAM spec's QNAME charset `[!-?A-~]` excludes '@'
|
|
306
|
+
* (0x40) precisely so a read name can never be confused with a header. Lenient: never throws; lines
|
|
307
|
+
* with fewer than 11 fields are ignored rather than rejected.
|
|
308
|
+
*/
|
|
309
|
+
|
|
310
|
+
declare function parseSam(input: string | Uint8Array): SeqRecord[];
|
|
311
|
+
|
|
312
|
+
export { type FastaRecord, type FastqRecord, MAX_PHRED, type QualRecord, type SeqFileFormat, type SeqRecord, type WrapOptions, detectFormat, formatFasta, formatFastq, formatQual, hasUsableQuality, makeSeqRecord, parseBam, parseClustal, parseEmbl, parseFasta, parseFastq, parseGenbank, parseGfa, parseGff, parseMsf, parseNexus, parsePhylip, parsePir, parseSam, parseStockholm, parseSwissprot };
|
package/dist/index.js
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
'use strict';function U(e){let t="";for(let n=0;n<e.length;n++)t+=String.fromCharCode(e[n]);return t}function k(e){let t=new Uint8Array(e.length);for(let n=0;n<e.length;n++)t[n]=e.charCodeAt(n)&255;return t}function w(e){return new DataView(e.buffer,e.byteOffset,e.byteLength)}function F(e,t,n){return e.subarray(t,t+n)}function me(e){return String.fromCharCode(e>>>24&255,e>>>16&255,e>>>8&255,e&255)}var z=128,x=28;function ne(e){if(e.byteLength<z)throw new Error(`ABIF too small: ${e.byteLength} bytes`);let t=0;if(U(F(e,0,4))!=="ABIF")if(e.byteLength>=132&&U(F(e,128,4))==="ABIF")t=128;else throw new Error('Not an ABIF file: missing "ABIF" magic.');let n=t;if(e.byteLength-n<z)throw new Error(`ABIF too small: ${e.byteLength-n} bytes after offset ${n}`);let r=w(e),i=r.getInt16(n+4,false),a=ee(e,r,n+6,n);if(a.tagName!=="tdir")throw new Error(`Expected "tdir" header entry, got "${a.tagName}"`);if(a.elementSize!==x)throw new Error(`Expected dir element size ${x}, got ${a.elementSize}`);let s=a.raw?.elementCount??a.elementCount,o=Math.max(0,s),c=r.getInt32(n+6+20,false);if(c<0||c+o*x>e.byteLength-n)throw new Error(`Directory out of bounds: offset=${c}, entries=${o}, file=${e.byteLength-n}`);let f=[];for(let T=0;T<o;T++)f.push(ee(e,r,n+c+T*x,n));let d=a.raw?.dataSize??o*x,u=n+c+o*x,p=Math.min(Math.max(0,d-o*x),Math.max(0,e.byteLength-u)),l={entryCount:o,rawEntryCount:s,elementType:a.elementType,tagNumber:a.tagNumber,entrySize:a.elementSize,dataSize:d,dataOffset:c,dataOffsetBytes:a.raw?.dataOffsetBytes??new Uint8Array(4),dataHandle:a.dataHandle,paddingBytes:new Uint8Array(F(e,u,p))},h=new Uint8Array(F(e,n+6+x,z-6-x)),y=t===128?new Uint8Array(F(e,0,128)):void 0,C=de(e,n,c,d,f,t);return {version:i,tdir:l,entries:f,macBinaryOffset:t,macBinaryHeader:y,headerReserved:h,unreferencedRanges:C}}function de(e,t,n,r,i,a){let s=e.byteLength,o=[];a===128&&o.push([0,128]),o.push([t,t+z]);let c=Math.max(i.length*x,Math.max(0,r));o.push([t+n,t+n+c]);for(let l of i)if(l.raw&&!l.raw.inline){let h=t+l.raw.dataOffset;o.push([h,h+l.payload.byteLength]);}let f=o.map(([l,h])=>[Math.max(0,Math.min(l,s)),Math.max(0,Math.min(h,s))]).filter(([l,h])=>h>l).sort((l,h)=>l[0]-h[0]),d=[];for(let[l,h]of f){let y=d[d.length-1];y&&l<=y[1]?y[1]=Math.max(y[1],h):d.push([l,h]);}let u=[],p=0;for(let[l,h]of d)l>p&&u.push({offset:p,bytes:new Uint8Array(F(e,p,l-p))}),p=Math.max(p,h);return p<s&&u.push({offset:p,bytes:new Uint8Array(F(e,p,s-p))}),u}function ee(e,t,n,r){let i=U(F(e,n,4)),a=t.getInt32(n+4,false),s=t.getInt16(n+8,false),o=t.getInt16(n+10,false),c=t.getInt32(n+12,false),f=t.getInt32(n+16,false),d=t.getInt32(n+24,false),u=Math.max(0,c*Math.max(0,o)),p=f>=0?f:u,l=f>=0?f<=4:u<=4,h=Math.max(0,o>0?Math.min(c,Math.floor(p/o)):Math.min(c,p)),y,C;if(l)C=-1,y=new Uint8Array(F(e,n+20,Math.min(4,p)));else {C=t.getInt32(n+20,false);let m=r+C;if(C<0||m+p>e.byteLength)throw new Error(`Entry ${i}${a}: payload out of bounds (offset=${C}, size=${p})`);y=new Uint8Array(F(e,m,p));}let T=new Uint8Array(F(e,n+20,4));return {tagName:i,tagNumber:a,elementType:s,elementSize:o,elementCount:h,payload:y,dataHandle:d,raw:{elementCount:c,dataSize:f,dataOffset:C,inline:l,dataOffsetBytes:T}}}function De(e){let t=e.macBinaryOffset,n=e.entries.length,r=e.tdir.entryCount,i=e.entries.map(l=>l.raw&&l.payload.byteLength===l.raw.dataSize?l.raw:void 0),a=z;a=Math.max(a,e.tdir.dataOffset+Math.max(e.tdir.dataSize,r*x));for(let l of i)l&&!l.inline&&(a=Math.max(a,l.dataOffset+l.dataSize));for(let l of e.unreferencedRanges)a=Math.max(a,l.offset-t+l.bytes.length);let s=n>r,o=a,c=s?o:e.tdir.dataOffset,f=n===r?e.tdir.dataSize:n*x;s&&(o+=f);let d=new Array(n);for(let l=0;l<n;l++){let h=e.entries[l].payload.byteLength;if(i[l]||h<=4){d[l]=-1;continue}d[l]=o,o+=h;}let u=new Uint8Array(o),p=w(u);u.set(k("ABIF"),0),p.setInt16(4,e.version,false),u.set(e.headerReserved,6+x),te(u,p,6,{tagName:"tdir",tagNumber:e.tdir.tagNumber,elementType:e.tdir.elementType,elementSize:e.tdir.entrySize,elementCount:n,dataSize:f,dataHandle:e.tdir.dataHandle,offsetSlot:{kind:"external",value:c}}),n===r&&e.tdir.paddingBytes.length>0&&u.set(e.tdir.paddingBytes,c+n*x);for(let l=0;l<n;l++){let h=e.entries[l],y=i[l],C=c+l*x,T=h.payload.byteLength;te(u,p,C,{tagName:h.tagName,tagNumber:h.tagNumber,elementType:h.elementType,elementSize:h.elementSize,elementCount:y?y.elementCount:h.elementCount,dataSize:y?y.dataSize:T,dataHandle:h.dataHandle,offsetSlot:T<=4?{kind:"inline",payload:h.payload,dataSize:T,staleTail:y?.dataOffsetBytes}:{kind:"external",value:y?y.dataOffset:d[l]}}),T>4&&u.set(h.payload,y?y.dataOffset:d[l]);}for(let l of e.unreferencedRanges)u.set(l.bytes,l.offset-t);return u}function te(e,t,n,r){if(r.tagName.length!==4)throw new Error(`tagName must be 4 chars: "${r.tagName}"`);if(e.set(k(r.tagName),n),t.setInt32(n+4,r.tagNumber,false),t.setInt16(n+8,r.elementType,false),t.setInt16(n+10,r.elementSize,false),t.setInt32(n+12,r.elementCount,false),t.setInt32(n+16,r.dataSize,false),r.offsetSlot.kind==="external")t.setInt32(n+20,r.offsetSlot.value,false);else {let{payload:i,dataSize:a,staleTail:s}=r.offsetSlot;e.fill(0,n+20,n+24),e.set(i.subarray(0,a),n+20),s&&a<4&&e.set(s.subarray(a,4),n+20+a);}t.setInt32(n+24,r.dataHandle,false);}function S(e,t,n){return e.entries.find(r=>r.tagName===t&&r.tagNumber===n)}function Be(e,t){return e.entries.filter(n=>n.tagName===t)}function ge(e,t){return e.tagName!==t.tagName?e.tagName<t.tagName?-1:1:e.tagNumber-t.tagNumber}function W(e,t){let n=e.findIndex(r=>ge(r,t)>0);e.splice(n<0?e.length:n,0,t);}function L(e,t,n,r,i){if(r.byteLength!==i.elementCount*i.elementSize)throw new Error(`upsertEntry ${t}${n}: payload length ${r.byteLength} != count*size`);let a=S(e,t,n);a?(a.elementType=i.elementType,a.elementSize=i.elementSize,a.elementCount=i.elementCount,a.payload=r,a.raw=void 0):W(e.entries,{tagName:t,tagNumber:n,elementType:i.elementType,elementSize:i.elementSize,elementCount:i.elementCount,payload:r,dataHandle:0});}function He(e,t){let n=S(e,"DATA",t);if(!n)return;if(n.elementSize!==2)throw new Error(`DATA${t}: expected elementSize=2, got ${n.elementSize}`);let r=new Int16Array(n.elementCount),i=w(n.payload);for(let a=0;a<n.elementCount;a++)r[a]=i.getInt16(a*2,false);return r}function j(e){let t=S(e,"FWO_",1);return t?U(t.payload.subarray(0,t.elementCount)):"GATC"}function G(e){return /^[ACGT]{4}$/.test(e)&&new Set(e).size===4}function P(e){return !!(S(e,"DATA",9)&&S(e,"DATA",10)&&S(e,"DATA",11)&&S(e,"DATA",12))}function We(e){return e>=5&&e<=8?"telemetry":e>=1&&e<=4||e>=9&&e<=12||e===105||e===205?"trace":"other"}function je(e){let t=S(e,"RevC",1);if(!t)return;let n=w(t.payload);return t.payload.byteLength>=2?n.getInt16(0,false)!==0:t.payload.some(r=>r!==0)}function Ge(e){let t=j(e);if(!G(t))throw new Error(`FWO_ is not a permutation of A/C/G/T: "${t}"`);return {[t[0]]:1,[t[1]]:2,[t[2]]:3,[t[3]]:4}}function _e(e){return D(e,2)??D(e,1)}function D(e,t){let n=S(e,"PBAS",t);if(n)return U(n.payload.subarray(0,n.elementCount)).replace(/\0+$/g,"")}function Qe(e){return B(e,2)??B(e,1)}function B(e,t){let n=S(e,"PCON",t);if(!n)return;let r=new Array(n.elementCount);for(let i=0;i<n.elementCount;i++)r[i]=n.payload[i];return r}function Ye(e){return q(e,2)??q(e,1)}function q(e,t){let n=S(e,"PLOC",t);if(!n)return;if(n.elementSize!==2)throw new Error(`PLOC${t}: expected elementSize=2, got ${n.elementSize}`);let r=w(n.payload),i=new Array(n.elementCount);for(let a=0;a<n.elementCount;a++)i[a]=r.getUint16(a*2,false);return i}function Ke(e){let t=S(e,"SPAC",1);if(!t||t.elementSize!==4||t.payload.byteLength<4)return;let n=w(t.payload).getFloat32(0,false);return Number.isFinite(n)&&n>0?n:void 0}function tt(e,t,n={}){let{start:r,end:i}=t;if(!Number.isInteger(r)||!Number.isInteger(i)||r<0||i<=r)throw new Error(`cropAbif: invalid range [${r}, ${i})`);if(!P(e))throw new Error("cropAbif: no DATA9..12 block to crop \u2014 the range has nothing to apply to");let a=Math.min(V(e,9),V(e,10),V(e,11),V(e,12));if(i>a)throw new Error(`cropAbif: range end ${i} exceeds the processed trace length ${a}`);let s=n.rawTrace??"omit",o=[];for(let c of e.entries)c.tagName==="DATA"&&c.tagNumber>=9&&c.tagNumber<=12?o.push(pe(c,r,i)):c.tagName==="DATA"&&c.tagNumber>=1&&c.tagNumber<=8?s==="full"&&o.push({...c}):c.tagName==="PBAS"||c.tagName==="PCON"||c.tagName==="PLOC"||o.push({...c});for(let c of he(e))o.push(...be(e,c,r,i));return {version:e.version,tdir:e.tdir,entries:o,macBinaryOffset:0,macBinaryHeader:void 0,headerReserved:e.headerReserved,unreferencedRanges:[]}}function V(e,t){return S(e,"DATA",t)?.elementCount??0}function pe(e,t,n){if(e.elementSize!==2)throw new Error(`cropAbif: DATA${e.tagNumber} expected elementSize=2, got ${e.elementSize}`);let r=new Uint8Array(e.payload.subarray(t*2,n*2));return {tagName:"DATA",tagNumber:e.tagNumber,elementType:e.elementType,elementSize:2,elementCount:n-t,payload:r,dataHandle:e.dataHandle}}function he(e){let t=new Set;for(let n of e.entries)n.tagName==="PBAS"&&t.add(n.tagNumber);return Array.from(t).sort((n,r)=>n-r)}function be(e,t,n,r){let i=D(e,t);if(i===void 0)return [];let a=q(e,t);if(a===void 0)throw new Error(`cropAbif: PBAS${t} has no PLOC${t} to crop by`);if(a.length!==i.length)throw new Error(`cropAbif: PBAS${t}/PLOC${t} length mismatch (${i.length} vs ${a.length})`);let s=B(e,t);if(s!==void 0&&s.length!==i.length)throw new Error(`cropAbif: PBAS${t}/PCON${t} length mismatch`);let o=[];for(let u=0;u<a.length;u++)a[u]>=n&&a[u]<r&&o.push(u);let c=o.map(u=>i[u]).join(""),f=o.map(u=>a[u]-n),d=[{tagName:"PBAS",tagNumber:t,elementType:2,elementSize:1,elementCount:c.length,payload:k(c),dataHandle:0},{tagName:"PLOC",tagNumber:t,elementType:4,elementSize:2,elementCount:f.length,payload:Ae(f),dataHandle:0}];if(s!==void 0){let u=o.map(p=>s[p]);d.push({tagName:"PCON",tagNumber:t,elementType:2,elementSize:1,elementCount:u.length,payload:Uint8Array.from(u),dataHandle:0});}return d}function Ae(e){let t=new Uint8Array(e.length*2),n=w(t);for(let r=0;r<e.length;r++)n.setUint16(r*2,Math.max(0,Math.min(65535,e[r])),false);return t}var ye={1:"byte",2:"char",3:"word",4:"short",5:"long",7:"float",8:"double",10:"date",11:"time",12:"thumb",13:"bool",18:"pString",19:"cString",1023:"tdir"};function Q(e){return ye[e]??(e>=1024?`user${e}`:`type${e}`)}function Se(e,t=10){return e.length<=t?`[${e.join(", ")}]`:`[${e.slice(0,t).join(", ")}, \u2026 +${e.length-t}] (n=${e.length})`}function Ce(e,t=80){return e.length>t?e.slice(0,t)+"\u2026":e}function re(e){let t=e.subarray(0,16),n=Array.from(t,r=>r.toString(16).padStart(2,"0")).join(" ");return `${e.byteLength}B [${n}${e.byteLength>16?" \u2026":""}]`}function _(e){if(e.kind==="numbers")return e.value;if(e.kind==="number")return [e.value]}function v(e,t,n,r){let i=Math.max(0,Math.min(t,Math.floor(e/n))),a=[];for(let s=0;s<i;s++)a.push(r(s*n));return a.length===1?{kind:"number",value:a[0]}:{kind:"numbers",value:a}}function ie(e,t,n){let r=w(n);switch(e){case 1:return {kind:"numbers",value:Array.from(n.subarray(0,t))};case 2:case 19:return {kind:"string",value:U(n.subarray(0,t)).replace(/\0+$/g,"")};case 3:return v(n.byteLength,t,2,i=>r.getUint16(i,false));case 4:return v(n.byteLength,t,2,i=>r.getInt16(i,false));case 5:return v(n.byteLength,t,4,i=>r.getInt32(i,false));case 7:return v(n.byteLength,t,4,i=>r.getFloat32(i,false));case 8:return v(n.byteLength,t,8,i=>r.getFloat64(i,false));case 10:{if(n.byteLength<4)return {kind:"unknown",value:n};let i=r.getInt16(0,false),a=r.getUint8(2),s=r.getUint8(3);return {kind:"date",value:{year:i,month:a,day:s}}}case 11:return n.byteLength<4?{kind:"unknown",value:n}:{kind:"time",value:{hour:r.getUint8(0),minute:r.getUint8(1),second:r.getUint8(2),hsec:r.getUint8(3)}};case 13:{let i=[];for(let a=0;a<Math.min(t,n.byteLength);a++)i.push(r.getUint8(a)!==0);return {kind:"bools",value:i}}case 18:{if(n.byteLength<1)return {kind:"string",value:""};let i=r.getUint8(0);return {kind:"string",value:U(F(n,1,Math.min(i,Math.max(0,t-1))))}}default:return {kind:"unknown",value:n}}}function we(e,t){switch(e.kind){case "number":return String(e.value);case "numbers":return Se(e.value);case "string":return Ce(JSON.stringify(e.value));case "bools":return e.value.length===1?String(e.value[0]):`[${e.value.join(", ")}]`;case "date":{let{year:n,month:r,day:i}=e.value;return `${n}-${String(r).padStart(2,"0")}-${String(i).padStart(2,"0")}`}case "time":{let{hour:n,minute:r,second:i}=e.value;return `${String(n).padStart(2,"0")}:${String(r).padStart(2,"0")}:${String(i).padStart(2,"0")}`}case "bytes":return `${Q(t)} ${re(e.value)}`;case "unknown":return `${Q(t)} ${re(e.value)}`}}function ot(e,t=""){let n=e instanceof Uint8Array?e:new Uint8Array(e),r=ne(n),i=r.entries.map(m=>{let g=m.tagName==="PCON"&&m.elementSize===1?ie(1,m.elementCount,m.payload):ie(m.elementType,m.elementCount,m.payload);return {tag:m.tagName,tagNumber:m.tagNumber,elementType:m.elementType,elementTypeName:Q(m.elementType),elementSize:m.elementSize,elementCount:m.elementCount,rawElementCount:m.raw?.elementCount??m.elementCount,dataSize:m.raw?.dataSize??m.elementCount*m.elementSize,dataOffset:m.raw?.dataOffset??-1,inline:m.raw?.inline??m.elementCount*m.elementSize<=4,decoded:g,preview:we(g,m.elementType)}}),a=j(r);G(a)||(a="GATC");let s={},o={A:[],C:[],G:[],T:[]},c={A:[],C:[],G:[],T:[]},f={comments:[]},d={},u={},p={},l=m=>a[m];for(let m=0;m<r.entries.length;m++){let g=r.entries[m],A=i[m].decoded;if(g.tagName==="DATA"){let b=_(A);b&&(s[g.tagNumber]=b,g.tagNumber>=1&&g.tagNumber<=4?o[l(g.tagNumber-1)]=b:g.tagNumber>=9&&g.tagNumber<=12&&(c[l(g.tagNumber-9)]=b));}else if(g.tagName==="PBAS"&&A.kind==="string")d[g.tagNumber]=A.value;else if(g.tagName==="PCON"){let b=g.elementSize===1?Array.from(g.payload.subarray(0,g.elementCount)):_(A);b&&(u[g.tagNumber]=b);}else if(g.tagName==="PLOC"){let b=_(A);b&&(p[g.tagNumber]=b.map(H=>H<0?H+65536:H));}else if(g.tagName==="SPAC")if(g.elementSize===4&&g.payload.byteLength>=4){let b=w(g.payload).getFloat32(0,false);Number.isFinite(b)&&b>0&&(f.samplingRate=b);}else A.kind==="number"&&(f.samplingRate=A.value);else if(g.tagName==="SMPL"&&A.kind==="string")f.sampleName=A.value;else if(g.tagName==="LANE"&&A.kind==="number")f.laneNumber=A.value;else if(g.tagName==="TUBE"&&A.kind==="string")f.tube=A.value;else if(g.tagName==="MCHN"&&A.kind==="string")f.machineName=A.value;else if(g.tagName==="MODL"&&A.kind==="string")f.machineModel=A.value;else if(g.tagName==="RUND"&&A.kind==="date"){let b=A.value;f.runDate=`${b.year}-${String(b.month).padStart(2,"0")}-${String(b.day).padStart(2,"0")}`;}else if(g.tagName==="RUNT"&&A.kind==="time"){let b=A.value;f.runTime=`${String(b.hour).padStart(2,"0")}:${String(b.minute).padStart(2,"0")}:${String(b.second).padStart(2,"0")}`;}else g.tagName==="CMNT"&&A.kind==="string"?f.comments.push(A.value):g.tagName==="RevC"&&g.tagNumber===1&&(A.kind==="number"?f.reverseComplemented=A.value!==0:A.kind==="numbers"&&(f.reverseComplemented=A.value.some(b=>b!==0)));}let h=Object.keys(d).map(Number).sort((m,g)=>m-g).map(m=>({version:m,role:m===1?"edited":m===2?"called":"unknown",sequence:d[m],confidences:u[m]??[],positions:p[m]??[]})),y,C=2 in d?2:1 in d?1:Object.keys(d).map(Number)[0];if(C!==void 0&&d[C]!==void 0){let m=d[C].toUpperCase(),g=u[C]??[];g.length!==m.length&&(g=Object.keys(u).map(Number).map(b=>u[b]).find(b=>b.length===m.length)??[]);let A=p[C]??[];A.length!==m.length&&(A=Object.keys(p).map(Number).map(b=>p[b]).find(b=>b.length===m.length)??[]),y={sequence:m,confidences:g,positions:A,pbasVersion:C};}if(!Number.isFinite(f.samplingRate)||(f.samplingRate??0)<=0){let m=y?.positions,g=Math.max(c.A.length,c.C.length,c.G.length,c.T.length);m&&m.length>1?f.samplingRate=(m[m.length-1]-m[0])/(m.length-1):y&&y.sequence.length>0&&g>0&&(f.samplingRate=g/y.sequence.length);}let T={baseOrder:a,dataChannels:s,data1To4:o,data9To12:c};return {fileName:t,fileSize:n.byteLength,abifVersion:r.version,macBinaryOffset:r.macBinaryOffset,dirEntryCount:r.entries.length,metadata:f,chromatogram:T,baseCalls:y,baseCallVariants:h,entries:i}}function st(e){return e.A.length>0||e.C.length>0||e.G.length>0||e.T.length>0}function ut(e){return Math.max(e.A.length,e.C.length,e.G.length,e.T.length)}function dt(e,t){L(e,"PBAS",2,k(t),{elementType:2,elementSize:1,elementCount:t.length});}function gt(e,t){let n=new Uint8Array(t.length);for(let r=0;r<t.length;r++)n[r]=Math.max(0,Math.min(255,Math.round(t[r])));L(e,"PCON",2,n,{elementType:2,elementSize:1,elementCount:t.length});}function pt(e,t){let n=new Uint8Array(t.length*2),r=w(n);for(let i=0;i<t.length;i++)r.setUint16(i*2,Math.max(0,Math.min(65535,t[i])),false);L(e,"PLOC",2,n,{elementType:4,elementSize:2,elementCount:t.length});}function ht(e,t,n){let r=new Uint8Array(4);w(r).setFloat32(0,t,false),L(e,"SPAC",1,r,{elementType:7,elementSize:4,elementCount:1});let i=k(n),a=Math.min(255,i.length),s=new Uint8Array(1+a);s[0]=a,s.set(i.subarray(0,a),1),L(e,"SPAC",2,s,{elementType:18,elementSize:1,elementCount:1+a});let o=new Uint8Array(4);w(o).setFloat32(0,t,false),L(e,"SPAC",3,o,{elementType:7,elementSize:4,elementCount:1});}function bt(e){return e.length<2?0:(e[e.length-1]-e[0])/(e.length-1)}function At(e){if(!P(e))for(let t=1;t<=4;t++){let n=S(e,"DATA",t);if(!n)continue;let r=8+t;S(e,"DATA",r)||W(e.entries,{tagName:"DATA",tagNumber:r,elementType:n.elementType,elementSize:n.elementSize,elementCount:n.elementCount,payload:new Uint8Array(n.payload),dataHandle:0});}}function M(e){let t=typeof e=="string"?e:new TextDecoder().decode(e);return t.charCodeAt(0)===65279&&(t=t.slice(1)),t}function N(e){return M(e).split(/\r\n|\r|\n/)}function R(e){return e.replace(/\s+/g,"")}function E(e){return e.trim().length===0}function I(e){let t=e.trim(),n=t.search(/\s/);return n<0?t:t.slice(0,n)}var Ne=128,ae=8192;function wt(e){if(Y(e,0,"ABIF")||Y(e,Ne,"ABIF"))return "abif";if(Y(e,0,".scf"))return "scf";let t=Fe(e);return t===void 0?"unknown":xe(t)}function xe(e){let t=e.trimStart();if(/^LOCUS\s/.test(t))return "genbank";if(/^ID\s/.test(t))return /(Reviewed|Unreviewed);| AA\.\s*$/.test(t)?"swissprot":"embl";if(/^#\s*STOCKHOLM/i.test(t))return "stockholm";if(/^#NEXUS/i.test(t))return "nexus";if(/^(CLUSTAL|MUSCLE|MAFFT|T-?COFFEE|PROBCONS|KALIGN|MVIEW|PROMALS)\b/i.test(t)||/multiple (sequence )?alignment/i.test(t)&&!/^[>@#]/.test(t))return "clustal";if(/^!!(NA|AA)_MULTIPLE_ALIGNMENT/i.test(t)||/\bMSF:\s*\d/.test(t))return "msf";if(/^\d+\s+\d+\s*$/.test(t))return "phylip";if(/^##gff-version/i.test(t))return "gff";if(/^>(P1|F1|DL|DC|RL|RC|N1|N3|XX);/i.test(t))return "pir";switch(t.charCodeAt(0)){case 62:case 59:return "fasta";case 64:return "fastq";default:return "unknown"}}function Fe(e){let t=e.length>ae?e.subarray(0,ae):e;for(let n of M(t).split(/\r\n|\r|\n/))if(n.trim().length>0)return n}function Y(e,t,n){if(e.length<t+n.length)return false;for(let r=0;r<n.length;r++)if(e[t+r]!==n.charCodeAt(r))return false;return true}function $(e,t,n){return t?{id:e,description:t,sequence:n}:{id:e,sequence:n}}function Et(e){return oe(e,"embl")}function Ut(e){return oe(e,"swissprot")}function oe(e,t){let n=N(e),r=[],i=false,a="",s="",o=[],c=[],f="header",d=()=>{i&&(r.push($(Te(t,a,s),o.join(" ").trim(),R(c.join("")))),i=false,a="",s="",o=[],c=[],f="header");};for(let u of n){if(u.startsWith("//")){d();continue}if(f==="sequence"){if(u.length===0||/^\s/.test(u)){c.push(u.replace(/[\s\d]/g,""));continue}f="header";}let p=u.slice(0,2);p==="ID"?(i&&d(),i=true,a=u.slice(2).trim()):p==="AC"?(s||(s=u.slice(2).split(";")[0].trim()),i=true):p==="DE"?(o.push(u.slice(2).trim()),i=true):p==="SQ"&&(f="sequence",i=true);}return d(),r}function Te(e,t,n){if(e==="swissprot")return n||I(t);let r=t.split(";"),i=I(r[0]),a="";for(let s of r){let o=/^\s*SV\s+(\d+)/.exec(s);o&&(a=o[1]);}return (a?`${i}.${a}`:i)||n}var se=93,K=33,le=60,Re=255;function ce(e){let t=N(e),n=[],r,i=[],a=()=>{r!==void 0&&n.push(Ee(r,i.join("")));};for(let s of t)if(s[0]===">")a(),r=s.slice(1),i=[];else {if(E(s)||s[0]===";")continue;if(r===void 0)continue;i.push(s);}return a(),n}function Lt(e){let t=N(e),n=[],r=0;for(;r<t.length;){if(E(t[r])||t[r][0]!=="@"){r++;continue}let i=t[r].slice(1);r++;let a=[];for(;r<t.length&&t[r][0]!=="+"&&t[r][0]!=="@";)a.push(t[r]),r++;let s=R(a.join(""));if(r>=t.length||t[r][0]==="@"){n.push(ue(i,s,""));continue}r++;let o="";for(;r<t.length&&o.length<s.length&&!(t[r][0]==="@"&&Ue(t,r));)o+=R(t[r]),r++;n.push(ue(i,s,o));}return n}function It(e,t){let n=t?.lineWidth??le;return J(e).map(r=>`${X(">",r.id,r.description)}
|
|
2
|
-
${
|
|
3
|
-
${
|
|
1
|
+
'use strict';function U(e){let t="";for(let n=0;n<e.length;n++)t+=String.fromCharCode(e[n]);return t}function $(e){let t=new Uint8Array(e.length);for(let n=0;n<e.length;n++)t[n]=e.charCodeAt(n)&255;return t}function C(e){return new DataView(e.buffer,e.byteOffset,e.byteLength)}function T(e,t,n){return e.subarray(t,t+n)}function Ae(e){return String.fromCharCode(e>>>24&255,e>>>16&255,e>>>8&255,e&255)}var M=128,R=28;function ae(e){if(e.byteLength<M)throw new Error(`ABIF too small: ${e.byteLength} bytes`);let t=0;if(U(T(e,0,4))!=="ABIF")if(e.byteLength>=132&&U(T(e,128,4))==="ABIF")t=128;else throw new Error('Not an ABIF file: missing "ABIF" magic.');let n=t;if(e.byteLength-n<M)throw new Error(`ABIF too small: ${e.byteLength-n} bytes after offset ${n}`);let r=C(e),i=r.getInt16(n+4,false),o=ie(e,r,n+6,n);if(o.tagName!=="tdir")throw new Error(`Expected "tdir" header entry, got "${o.tagName}"`);if(o.elementSize!==R)throw new Error(`Expected dir element size ${R}, got ${o.elementSize}`);let a=o.raw?.elementCount??o.elementCount,s=Math.max(0,a),c=r.getInt32(n+6+20,false);if(c<0||c+s*R>e.byteLength-n)throw new Error(`Directory out of bounds: offset=${c}, entries=${s}, file=${e.byteLength-n}`);let m=[];for(let w=0;w<s;w++)m.push(ie(e,r,n+c+w*R,n));let d=o.raw?.dataSize??s*R,u=n+c+s*R,p=Math.min(Math.max(0,d-s*R),Math.max(0,e.byteLength-u)),l={entryCount:s,rawEntryCount:a,elementType:o.elementType,tagNumber:o.tagNumber,entrySize:o.elementSize,dataSize:d,dataOffset:c,dataOffsetBytes:o.raw?.dataOffsetBytes??new Uint8Array(4),dataHandle:o.dataHandle,paddingBytes:new Uint8Array(T(e,u,p))},h=new Uint8Array(T(e,n+6+R,M-6-R)),y=t===128?new Uint8Array(T(e,0,128)):void 0,S=ye(e,n,c,d,m,t);return {version:i,tdir:l,entries:m,macBinaryOffset:t,macBinaryHeader:y,headerReserved:h,unreferencedRanges:S}}function ye(e,t,n,r,i,o){let a=e.byteLength,s=[];o===128&&s.push([0,128]),s.push([t,t+M]);let c=Math.max(i.length*R,Math.max(0,r));s.push([t+n,t+n+c]);for(let l of i)if(l.raw&&!l.raw.inline){let h=t+l.raw.dataOffset;s.push([h,h+l.payload.byteLength]);}let m=s.map(([l,h])=>[Math.max(0,Math.min(l,a)),Math.max(0,Math.min(h,a))]).filter(([l,h])=>h>l).sort((l,h)=>l[0]-h[0]),d=[];for(let[l,h]of m){let y=d[d.length-1];y&&l<=y[1]?y[1]=Math.max(y[1],h):d.push([l,h]);}let u=[],p=0;for(let[l,h]of d)l>p&&u.push({offset:p,bytes:new Uint8Array(T(e,p,l-p))}),p=Math.max(p,h);return p<a&&u.push({offset:p,bytes:new Uint8Array(T(e,p,a-p))}),u}function ie(e,t,n,r){let i=U(T(e,n,4)),o=t.getInt32(n+4,false),a=t.getInt16(n+8,false),s=t.getInt16(n+10,false),c=t.getInt32(n+12,false),m=t.getInt32(n+16,false),d=t.getInt32(n+24,false),u=Math.max(0,c*Math.max(0,s)),p=m>=0?m:u,l=m>=0?m<=4:u<=4,h=Math.max(0,s>0?Math.min(c,Math.floor(p/s)):Math.min(c,p)),y,S;if(l)S=-1,y=new Uint8Array(T(e,n+20,Math.min(4,p)));else {S=t.getInt32(n+20,false);let f=r+S;if(S<0||f+p>e.byteLength)throw new Error(`Entry ${i}${o}: payload out of bounds (offset=${S}, size=${p})`);y=new Uint8Array(T(e,f,p));}let w=new Uint8Array(T(e,n+20,4));return {tagName:i,tagNumber:o,elementType:a,elementSize:s,elementCount:h,payload:y,dataHandle:d,raw:{elementCount:c,dataSize:m,dataOffset:S,inline:l,dataOffsetBytes:w}}}function Xe(e){let t=e.macBinaryOffset,n=e.entries.length,r=e.tdir.entryCount,i=e.entries.map(l=>l.raw&&l.payload.byteLength===l.raw.dataSize?l.raw:void 0),o=M;o=Math.max(o,e.tdir.dataOffset+Math.max(e.tdir.dataSize,r*R));for(let l of i)l&&!l.inline&&(o=Math.max(o,l.dataOffset+l.dataSize));for(let l of e.unreferencedRanges)o=Math.max(o,l.offset-t+l.bytes.length);let a=n>r,s=o,c=a?s:e.tdir.dataOffset,m=n===r?e.tdir.dataSize:n*R;a&&(s+=m);let d=new Array(n);for(let l=0;l<n;l++){let h=e.entries[l].payload.byteLength;if(i[l]||h<=4){d[l]=-1;continue}d[l]=s,s+=h;}let u=new Uint8Array(s),p=C(u);u.set($("ABIF"),0),p.setInt16(4,e.version,false),u.set(e.headerReserved,6+R),oe(u,p,6,{tagName:"tdir",tagNumber:e.tdir.tagNumber,elementType:e.tdir.elementType,elementSize:e.tdir.entrySize,elementCount:n,dataSize:m,dataHandle:e.tdir.dataHandle,offsetSlot:{kind:"external",value:c}}),n===r&&e.tdir.paddingBytes.length>0&&u.set(e.tdir.paddingBytes,c+n*R);for(let l=0;l<n;l++){let h=e.entries[l],y=i[l],S=c+l*R,w=h.payload.byteLength;oe(u,p,S,{tagName:h.tagName,tagNumber:h.tagNumber,elementType:h.elementType,elementSize:h.elementSize,elementCount:y?y.elementCount:h.elementCount,dataSize:y?y.dataSize:w,dataHandle:h.dataHandle,offsetSlot:w<=4?{kind:"inline",payload:h.payload,dataSize:w,staleTail:y?.dataOffsetBytes}:{kind:"external",value:y?y.dataOffset:d[l]}}),w>4&&u.set(h.payload,y?y.dataOffset:d[l]);}for(let l of e.unreferencedRanges)u.set(l.bytes,l.offset-t);return u}function oe(e,t,n,r){if(r.tagName.length!==4)throw new Error(`tagName must be 4 chars: "${r.tagName}"`);if(e.set($(r.tagName),n),t.setInt32(n+4,r.tagNumber,false),t.setInt16(n+8,r.elementType,false),t.setInt16(n+10,r.elementSize,false),t.setInt32(n+12,r.elementCount,false),t.setInt32(n+16,r.dataSize,false),r.offsetSlot.kind==="external")t.setInt32(n+20,r.offsetSlot.value,false);else {let{payload:i,dataSize:o,staleTail:a}=r.offsetSlot;e.fill(0,n+20,n+24),e.set(i.subarray(0,o),n+20),a&&o<4&&e.set(a.subarray(o,4),n+20+o);}t.setInt32(n+24,r.dataHandle,false);}function N(e,t,n){return e.entries.find(r=>r.tagName===t&&r.tagNumber===n)}function Ze(e,t){return e.entries.filter(n=>n.tagName===t)}function Se(e,t){return e.tagName!==t.tagName?e.tagName<t.tagName?-1:1:e.tagNumber-t.tagNumber}function Q(e,t){let n=e.findIndex(r=>Se(r,t)>0);e.splice(n<0?e.length:n,0,t);}function I(e,t,n,r,i){if(r.byteLength!==i.elementCount*i.elementSize)throw new Error(`upsertEntry ${t}${n}: payload length ${r.byteLength} != count*size`);let o=N(e,t,n);o?(o.elementType=i.elementType,o.elementSize=i.elementSize,o.elementCount=i.elementCount,o.payload=r,o.raw=void 0):Q(e.entries,{tagName:t,tagNumber:n,elementType:i.elementType,elementSize:i.elementSize,elementCount:i.elementCount,payload:r,dataHandle:0});}function nt(e,t){let n=N(e,"DATA",t);if(!n)return;if(n.elementSize!==2)throw new Error(`DATA${t}: expected elementSize=2, got ${n.elementSize}`);let r=new Int16Array(n.elementCount),i=C(n.payload);for(let o=0;o<n.elementCount;o++)r[o]=i.getInt16(o*2,false);return r}function K(e){let t=N(e,"FWO_",1);return t?U(t.payload.subarray(0,t.elementCount)):"GATC"}function X(e){return /^[ACGT]{4}$/.test(e)&&new Set(e).size===4}function B(e){return !!(N(e,"DATA",9)&&N(e,"DATA",10)&&N(e,"DATA",11)&&N(e,"DATA",12))}function rt(e){return e>=5&&e<=8?"telemetry":e>=1&&e<=4||e>=9&&e<=12||e===105||e===205?"trace":"other"}function it(e){let t=N(e,"RevC",1);if(!t)return;let n=C(t.payload);return t.payload.byteLength>=2?n.getInt16(0,false)!==0:t.payload.some(r=>r!==0)}function ot(e){let t=K(e);if(!X(t))throw new Error(`FWO_ is not a permutation of A/C/G/T: "${t}"`);return {[t[0]]:1,[t[1]]:2,[t[2]]:3,[t[3]]:4}}function at(e){return z(e,2)??z(e,1)}function z(e,t){let n=N(e,"PBAS",t);if(n)return U(n.payload.subarray(0,n.elementCount)).replace(/\0+$/g,"")}function st(e){return v(e,2)??v(e,1)}function v(e,t){let n=N(e,"PCON",t);if(!n)return;let r=new Array(n.elementCount);for(let i=0;i<n.elementCount;i++)r[i]=n.payload[i];return r}function ut(e){return P(e,2)??P(e,1)}function P(e,t){let n=N(e,"PLOC",t);if(!n)return;if(n.elementSize!==2)throw new Error(`PLOC${t}: expected elementSize=2, got ${n.elementSize}`);let r=C(n.payload),i=new Array(n.elementCount);for(let o=0;o<n.elementCount;o++)i[o]=r.getUint16(o*2,false);return i}function ct(e){let t=N(e,"SPAC",1);if(!t||t.elementSize!==4||t.payload.byteLength<4)return;let n=C(t.payload).getFloat32(0,false);return Number.isFinite(n)&&n>0?n:void 0}function gt(e,t,n={}){let{start:r,end:i}=t;if(!Number.isInteger(r)||!Number.isInteger(i)||r<0||i<=r)throw new Error(`cropAbif: invalid range [${r}, ${i})`);if(!B(e))throw new Error("cropAbif: no DATA9..12 block to crop \u2014 the range has nothing to apply to");let o=Math.min(G(e,9),G(e,10),G(e,11),G(e,12));if(i>o)throw new Error(`cropAbif: range end ${i} exceeds the processed trace length ${o}`);let a=n.rawTrace??"omit",s=[];for(let c of e.entries)c.tagName==="DATA"&&c.tagNumber>=9&&c.tagNumber<=12?s.push(xe(c,r,i)):c.tagName==="DATA"&&c.tagNumber>=1&&c.tagNumber<=8?a==="full"&&s.push({...c}):c.tagName==="PBAS"||c.tagName==="PCON"||c.tagName==="PLOC"||s.push({...c});for(let c of Ne(e))s.push(...Ce(e,c,r,i));return {version:e.version,tdir:e.tdir,entries:s,macBinaryOffset:0,macBinaryHeader:void 0,headerReserved:e.headerReserved,unreferencedRanges:[]}}function G(e,t){return N(e,"DATA",t)?.elementCount??0}function xe(e,t,n){if(e.elementSize!==2)throw new Error(`cropAbif: DATA${e.tagNumber} expected elementSize=2, got ${e.elementSize}`);let r=new Uint8Array(e.payload.subarray(t*2,n*2));return {tagName:"DATA",tagNumber:e.tagNumber,elementType:e.elementType,elementSize:2,elementCount:n-t,payload:r,dataHandle:e.dataHandle}}function Ne(e){let t=new Set;for(let n of e.entries)n.tagName==="PBAS"&&t.add(n.tagNumber);return Array.from(t).sort((n,r)=>n-r)}function Ce(e,t,n,r){let i=z(e,t);if(i===void 0)return [];let o=P(e,t);if(o===void 0)throw new Error(`cropAbif: PBAS${t} has no PLOC${t} to crop by`);if(o.length!==i.length)throw new Error(`cropAbif: PBAS${t}/PLOC${t} length mismatch (${i.length} vs ${o.length})`);let a=v(e,t);if(a!==void 0&&a.length!==i.length)throw new Error(`cropAbif: PBAS${t}/PCON${t} length mismatch`);let s=[];for(let u=0;u<o.length;u++)o[u]>=n&&o[u]<r&&s.push(u);let c=s.map(u=>i[u]).join(""),m=s.map(u=>o[u]-n),d=[{tagName:"PBAS",tagNumber:t,elementType:2,elementSize:1,elementCount:c.length,payload:$(c),dataHandle:0},{tagName:"PLOC",tagNumber:t,elementType:4,elementSize:2,elementCount:m.length,payload:we(m),dataHandle:0}];if(a!==void 0){let u=s.map(p=>a[p]);d.push({tagName:"PCON",tagNumber:t,elementType:2,elementSize:1,elementCount:u.length,payload:Uint8Array.from(u),dataHandle:0});}return d}function we(e){let t=new Uint8Array(e.length*2),n=C(t);for(let r=0;r<e.length;r++)n.setUint16(r*2,Math.max(0,Math.min(65535,e[r])),false);return t}var Re={1:"byte",2:"char",3:"word",4:"short",5:"long",7:"float",8:"double",10:"date",11:"time",12:"thumb",13:"bool",18:"pString",19:"cString",1023:"tdir"};function J(e){return Re[e]??(e>=1024?`user${e}`:`type${e}`)}function Fe(e,t=10){return e.length<=t?`[${e.join(", ")}]`:`[${e.slice(0,t).join(", ")}, \u2026 +${e.length-t}] (n=${e.length})`}function Te(e,t=80){return e.length>t?e.slice(0,t)+"\u2026":e}function se(e){let t=e.subarray(0,16),n=Array.from(t,r=>r.toString(16).padStart(2,"0")).join(" ");return `${e.byteLength}B [${n}${e.byteLength>16?" \u2026":""}]`}function Z(e){if(e.kind==="numbers")return e.value;if(e.kind==="number")return [e.value]}function q(e,t,n,r){let i=Math.max(0,Math.min(t,Math.floor(e/n))),o=[];for(let a=0;a<i;a++)o.push(r(a*n));return o.length===1?{kind:"number",value:o[0]}:{kind:"numbers",value:o}}function ue(e,t,n){let r=C(n);switch(e){case 1:return {kind:"numbers",value:Array.from(n.subarray(0,t))};case 2:case 19:return {kind:"string",value:U(n.subarray(0,t)).replace(/\0+$/g,"")};case 3:return q(n.byteLength,t,2,i=>r.getUint16(i,false));case 4:return q(n.byteLength,t,2,i=>r.getInt16(i,false));case 5:return q(n.byteLength,t,4,i=>r.getInt32(i,false));case 7:return q(n.byteLength,t,4,i=>r.getFloat32(i,false));case 8:return q(n.byteLength,t,8,i=>r.getFloat64(i,false));case 10:{if(n.byteLength<4)return {kind:"unknown",value:n};let i=r.getInt16(0,false),o=r.getUint8(2),a=r.getUint8(3);return {kind:"date",value:{year:i,month:o,day:a}}}case 11:return n.byteLength<4?{kind:"unknown",value:n}:{kind:"time",value:{hour:r.getUint8(0),minute:r.getUint8(1),second:r.getUint8(2),hsec:r.getUint8(3)}};case 13:{let i=[];for(let o=0;o<Math.min(t,n.byteLength);o++)i.push(r.getUint8(o)!==0);return {kind:"bools",value:i}}case 18:{if(n.byteLength<1)return {kind:"string",value:""};let i=r.getUint8(0);return {kind:"string",value:U(T(n,1,Math.min(i,Math.max(0,t-1))))}}default:return {kind:"unknown",value:n}}}function Ee(e,t){switch(e.kind){case "number":return String(e.value);case "numbers":return Fe(e.value);case "string":return Te(JSON.stringify(e.value));case "bools":return e.value.length===1?String(e.value[0]):`[${e.value.join(", ")}]`;case "date":{let{year:n,month:r,day:i}=e.value;return `${n}-${String(r).padStart(2,"0")}-${String(i).padStart(2,"0")}`}case "time":{let{hour:n,minute:r,second:i}=e.value;return `${String(n).padStart(2,"0")}:${String(r).padStart(2,"0")}:${String(i).padStart(2,"0")}`}case "bytes":return `${J(t)} ${se(e.value)}`;case "unknown":return `${J(t)} ${se(e.value)}`}}function yt(e,t=""){let n=e instanceof Uint8Array?e:new Uint8Array(e),r=ae(n),i=r.entries.map(f=>{let g=f.tagName==="PCON"&&f.elementSize===1?ue(1,f.elementCount,f.payload):ue(f.elementType,f.elementCount,f.payload);return {tag:f.tagName,tagNumber:f.tagNumber,elementType:f.elementType,elementTypeName:J(f.elementType),elementSize:f.elementSize,elementCount:f.elementCount,rawElementCount:f.raw?.elementCount??f.elementCount,dataSize:f.raw?.dataSize??f.elementCount*f.elementSize,dataOffset:f.raw?.dataOffset??-1,inline:f.raw?.inline??f.elementCount*f.elementSize<=4,decoded:g,preview:Ee(g,f.elementType)}}),o=K(r);X(o)||(o="GATC");let a={},s={A:[],C:[],G:[],T:[]},c={A:[],C:[],G:[],T:[]},m={comments:[]},d={},u={},p={},l=f=>o[f];for(let f=0;f<r.entries.length;f++){let g=r.entries[f],A=i[f].decoded;if(g.tagName==="DATA"){let b=Z(A);b&&(a[g.tagNumber]=b,g.tagNumber>=1&&g.tagNumber<=4?s[l(g.tagNumber-1)]=b:g.tagNumber>=9&&g.tagNumber<=12&&(c[l(g.tagNumber-9)]=b));}else if(g.tagName==="PBAS"&&A.kind==="string")d[g.tagNumber]=A.value;else if(g.tagName==="PCON"){let b=g.elementSize===1?Array.from(g.payload.subarray(0,g.elementCount)):Z(A);b&&(u[g.tagNumber]=b);}else if(g.tagName==="PLOC"){let b=Z(A);b&&(p[g.tagNumber]=b.map(Y=>Y<0?Y+65536:Y));}else if(g.tagName==="SPAC")if(g.elementSize===4&&g.payload.byteLength>=4){let b=C(g.payload).getFloat32(0,false);Number.isFinite(b)&&b>0&&(m.samplingRate=b);}else A.kind==="number"&&(m.samplingRate=A.value);else if(g.tagName==="SMPL"&&A.kind==="string")m.sampleName=A.value;else if(g.tagName==="LANE"&&A.kind==="number")m.laneNumber=A.value;else if(g.tagName==="TUBE"&&A.kind==="string")m.tube=A.value;else if(g.tagName==="MCHN"&&A.kind==="string")m.machineName=A.value;else if(g.tagName==="MODL"&&A.kind==="string")m.machineModel=A.value;else if(g.tagName==="RUND"&&A.kind==="date"){let b=A.value;m.runDate=`${b.year}-${String(b.month).padStart(2,"0")}-${String(b.day).padStart(2,"0")}`;}else if(g.tagName==="RUNT"&&A.kind==="time"){let b=A.value;m.runTime=`${String(b.hour).padStart(2,"0")}:${String(b.minute).padStart(2,"0")}:${String(b.second).padStart(2,"0")}`;}else g.tagName==="CMNT"&&A.kind==="string"?m.comments.push(A.value):g.tagName==="RevC"&&g.tagNumber===1&&(A.kind==="number"?m.reverseComplemented=A.value!==0:A.kind==="numbers"&&(m.reverseComplemented=A.value.some(b=>b!==0)));}let h=Object.keys(d).map(Number).sort((f,g)=>f-g).map(f=>({version:f,role:f===1?"edited":f===2?"called":"unknown",sequence:d[f],confidences:u[f]??[],positions:p[f]??[]})),y,S=2 in d?2:1 in d?1:Object.keys(d).map(Number)[0];if(S!==void 0&&d[S]!==void 0){let f=d[S].toUpperCase(),g=u[S]??[];g.length!==f.length&&(g=Object.keys(u).map(Number).map(b=>u[b]).find(b=>b.length===f.length)??[]);let A=p[S]??[];A.length!==f.length&&(A=Object.keys(p).map(Number).map(b=>p[b]).find(b=>b.length===f.length)??[]),y={sequence:f,confidences:g,positions:A,pbasVersion:S};}if(!Number.isFinite(m.samplingRate)||(m.samplingRate??0)<=0){let f=y?.positions,g=Math.max(c.A.length,c.C.length,c.G.length,c.T.length);f&&f.length>1?m.samplingRate=(f[f.length-1]-f[0])/(f.length-1):y&&y.sequence.length>0&&g>0&&(m.samplingRate=g/y.sequence.length);}let w={baseOrder:o,dataChannels:a,data1To4:s,data9To12:c};return {fileName:t,fileSize:n.byteLength,abifVersion:r.version,macBinaryOffset:r.macBinaryOffset,dirEntryCount:r.entries.length,metadata:m,chromatogram:w,baseCalls:y,baseCallVariants:h,entries:i}}function St(e){return e.A.length>0||e.C.length>0||e.G.length>0||e.T.length>0}function xt(e){return Math.max(e.A.length,e.C.length,e.G.length,e.T.length)}function Ft(e,t){I(e,"PBAS",2,$(t),{elementType:2,elementSize:1,elementCount:t.length});}function Tt(e,t){let n=new Uint8Array(t.length);for(let r=0;r<t.length;r++)n[r]=Math.max(0,Math.min(255,Math.round(t[r])));I(e,"PCON",2,n,{elementType:2,elementSize:1,elementCount:t.length});}function Et(e,t){let n=new Uint8Array(t.length*2),r=C(n);for(let i=0;i<t.length;i++)r.setUint16(i*2,Math.max(0,Math.min(65535,t[i])),false);I(e,"PLOC",2,n,{elementType:4,elementSize:2,elementCount:t.length});}function Lt(e,t,n){let r=new Uint8Array(4);C(r).setFloat32(0,t,false),I(e,"SPAC",1,r,{elementType:7,elementSize:4,elementCount:1});let i=$(n),o=Math.min(255,i.length),a=new Uint8Array(1+o);a[0]=o,a.set(i.subarray(0,o),1),I(e,"SPAC",2,a,{elementType:18,elementSize:1,elementCount:1+o});let s=new Uint8Array(4);C(s).setFloat32(0,t,false),I(e,"SPAC",3,s,{elementType:7,elementSize:4,elementCount:1});}function Ut(e){return e.length<2?0:(e[e.length-1]-e[0])/(e.length-1)}function $t(e){if(!B(e))for(let t=1;t<=4;t++){let n=N(e,"DATA",t);if(!n)continue;let r=8+t;N(e,"DATA",r)||Q(e.entries,{tagName:"DATA",tagNumber:r,elementType:n.elementType,elementSize:n.elementSize,elementCount:n.elementCount,payload:new Uint8Array(n.payload),dataHandle:0});}}function D(e){let t=typeof e=="string"?e:new TextDecoder().decode(e);return t.charCodeAt(0)===65279&&(t=t.slice(1)),t}function x(e){return D(e).split(/\r\n|\r|\n/)}function E(e){return e.replace(/\s+/g,"")}function L(e){return e.trim().length===0}function k(e){let t=e.trim(),n=t.search(/\s/);return n<0?t:t.slice(0,n)}var Le=128,_=8192;function Dt(e){if(V(e,0,"ABIF")||V(e,Le,"ABIF"))return "abif";if(V(e,0,".scf"))return "scf";if(V(e,0,"BAM"))return "bam";let t=ke(e);if(t===void 0)return "unknown";let n=$e(t),r=n==="clustal"&&!ce.test(t.trimStart());return (n==="unknown"||r)&&Ue(e)?"msf":n}function Ue(e){let t=e.length>_?e.subarray(0,_):e,n=D(t),r=/\bMSF:\s*\d+\b[^\n]*\bCheck:\s*\d/.test(n)&&/^\s*Name:\s+.*\bLen:\s*\d/im.test(n),i=/^\s*Name:\s+\S+\s+Len:\s*\d+\s+Check:\s*\d+\s+Weight:/im.test(n);return r||i}var ce=/^(CLUSTAL|MUSCLE|MAFFT|T-?COFFEE|PROBCONS|KALIGN|MVIEW|PROMALS)\b/i;function $e(e){let t=e.trimStart();if(/^LOCUS\s/.test(t))return "genbank";if(/^ID\s/.test(t))return /(Reviewed|Unreviewed);| AA\.\s*$/.test(t)?"swissprot":"embl";if(/^#\s*STOCKHOLM/i.test(t))return "stockholm";if(/^#NEXUS/i.test(t))return "nexus";if(ce.test(t)||/multiple (sequence )?alignment/i.test(t)&&!/^[>@#]/.test(t)&&!/genedoc/i.test(t))return "clustal";if(/^!!(NA|AA)_MULTIPLE_ALIGNMENT/i.test(t)||/\bMSF:\s*\d/.test(t))return "msf";if(/^\d+\s+\d+\s*$/.test(t))return "phylip";if(/^##gff-version/i.test(t))return "gff";if(/^H\t(?:[^\t]*\t)*VN:Z:[12]\./.test(t))return "gfa";if(/^@(HD|SQ|RG|PG|CO)\t/.test(t))return "sam";if(/^>(P1|F1|DL|DC|RL|RC|N1|N3|XX);/i.test(t))return "pir";switch(t.charCodeAt(0)){case 62:case 59:return "fasta";case 64:return "fastq"}return Ie(t)?"sam":/^S\t[!-~]+\t/.test(t)?"gfa":"unknown"}function Ie(e){let t=e.split(" ");if(t.length<11)return false;let[,n,,r,i,o]=t;return /^\d+$/.test(n)&&/^\d+$/.test(r)&&/^\d+$/.test(i)&&/^(\*|(\d+[MIDNSHPX=])+)$/.test(o)}function ke(e){let t=e.length>_?e.subarray(0,_):e;for(let n of D(t).split(/\r\n|\r|\n/))if(n.trim().length>0)return n}function V(e,t,n){if(e.length<t+n.length)return false;for(let r=0;r<n.length;r++)if(e[t+r]!==n.charCodeAt(r))return false;return true}function F(e,t,n){return t?{id:e,description:t,sequence:n}:{id:e,sequence:n}}function Bt(e){return le(e,"embl")}function Gt(e){return le(e,"swissprot")}function le(e,t){let n=x(e),r=[],i=false,o="",a="",s=[],c=[],m="header",d=()=>{i&&(r.push(F(Oe(t,o,a),s.join(" ").trim(),E(c.join("")))),i=false,o="",a="",s=[],c=[],m="header");};for(let u of n){if(u.startsWith("//")){d();continue}if(m==="sequence"){if(u.length===0||/^\s/.test(u)){c.push(u.replace(/[\s\d]/g,""));continue}m="header";}let p=u.slice(0,2);p==="ID"?(i&&d(),i=true,o=u.slice(2).trim()):p==="AC"?(a||(a=u.slice(2).split(";")[0].trim()),i=true):p==="DE"?(s.push(u.slice(2).trim()),i=true):p==="SQ"&&(m="sequence",i=true);}return d(),r}function Oe(e,t,n){if(e==="swissprot")return n||k(t);let r=t.split(";"),i=k(r[0]),o="";for(let a of r){let s=/^\s*SV\s+(\d+)/.exec(a);s&&(o=s[1]);}return (o?`${i}.${o}`:i)||n}var fe=93,ee=33,de=60,De=255;function ge(e){let t=x(e),n=[],r,i=[],o=()=>{r!==void 0&&n.push(Me(r,i.join("")));};for(let a of t)if(a[0]===">")o(),r=a.slice(1),i=[];else {if(L(a)||a[0]===";")continue;if(r===void 0)continue;i.push(a);}return o(),n}function Ht(e){let t=x(e),n=[],r=0;for(;r<t.length;){if(L(t[r])||t[r][0]!=="@"){r++;continue}let i=t[r].slice(1);r++;let o=[];for(;r<t.length&&t[r][0]!=="+"&&t[r][0]!=="@";)o.push(t[r]),r++;let a=E(o.join(""));if(r>=t.length||t[r][0]==="@"){n.push(me(i,a,""));continue}r++;let s="";for(;r<t.length&&s.length<a.length&&!(t[r][0]==="@"&&qe(t,r));)s+=E(t[r]),r++;n.push(me(i,a,s));}return n}function Wt(e,t){let n=t?.lineWidth??de;return re(e).map(r=>`${te(">",r.id,r.description)}
|
|
2
|
+
${ve(r.sequence,n)}`).join("")}function jt(e){return re(e).map(ze).join("")}function Yt(e,t){let n=t?.lineWidth??de;return re(e).map(r=>`${te(">",r.id,r.description)}
|
|
3
|
+
${Pe(r.qualities,n)}`).join("")}function Qt(e){return !!e&&e.length>0&&!e.every(t=>t===De)}function Me(e,t){let{id:n,description:r}=pe(e),i=E(t);return r===void 0?{id:n,sequence:i}:{id:n,description:r,sequence:i}}function me(e,t,n){let{id:r,description:i}=pe(e),o=new Array(t.length);for(let a=0;a<t.length;a++){let s=a<n.length?n.charCodeAt(a):ee;o[a]=ne(s-ee);}return i===void 0?{id:r,sequence:t,qualities:o}:{id:r,description:i,sequence:t,qualities:o}}function pe(e){let t=e.trim(),n=t.search(/\s/);return n<0?{id:t}:{id:t.slice(0,n),description:t.slice(n+1).trim()||void 0}}function qe(e,t){let n=t+1;for(;n<e.length&&e[n][0]!=="+"&&e[n][0]!=="@";)n++;return e[n]?.[0]==="+"}function ze(e){let{id:t,description:n,sequence:r,qualities:i}=e;if(i.length!==r.length)throw new Error(`FASTQ ${t}: ${i.length} quality scores for ${r.length} bases`);let o=i.map(Be).join("");return `${te("@",t,n)}
|
|
4
4
|
${r}
|
|
5
5
|
+
|
|
6
|
-
${
|
|
7
|
-
`}function
|
|
8
|
-
`))throw new Error("FASTX header must not contain a newline");return e+r}function
|
|
6
|
+
${o}
|
|
7
|
+
`}function te(e,t,n){let r=n?`${t} ${n}`:t;if(r.includes(`
|
|
8
|
+
`))throw new Error("FASTX header must not contain a newline");return e+r}function ve(e,t){if(e.length===0)return "";if(t<=0||e.length<=t)return `${e}
|
|
9
9
|
`;let n="";for(let r=0;r<e.length;r+=t)n+=`${e.slice(r,r+t)}
|
|
10
|
-
`;return n}function
|
|
11
|
-
`;return i}function
|
|
12
|
-
`))}var O=class{constructor(){this.order=[];this.blocks=new Map;}add(t,n){let r=this.blocks.get(t);r?r.push(n):(this.blocks.set(t,[n]),this.order.push(t));}toRecords(){return this.order.map(t
|
|
13
|
-
exports.ENTRY_SIZE=
|
|
10
|
+
`;return n}function Pe(e,t){if(e.length===0)return "";let n=e.map(ne),r=t<=0?n.length:t,i="";for(let o=0;o<n.length;o+=r)i+=`${n.slice(o,o+r).join(" ")}
|
|
11
|
+
`;return i}function ne(e){let t=Math.round(e);return t<0?0:t>fe?fe:t}function Be(e){return String.fromCharCode(ne(e)+ee)}function re(e){return Array.isArray(e)?e:[e]}var Ge=/^([A-Za-z][A-Za-z0-9_]*)/;function en(e){let t=x(e),n=[],r=false,i="",o="",a="",s=[],c=[],m="header",d=()=>{if(!r)return;let u=a||o||i;n.push(F(u,s.join(" ").trim(),E(c.join("")))),r=false,i=o=a="",s=[],c=[],m="header";};for(let u of t){if(u.startsWith("//")){d();continue}let p=u.length>0&&!/^\s/.test(u);if(m==="origin")if(p)m="header";else {c.push(u.replace(/[\s\d]/g,""));continue}if(m==="definition"&&!p){s.push(u.trim());continue}if(!p)continue;let l=(Ge.exec(u)?.[1]??"").toUpperCase(),h=u.slice(l.length).trim();l==="LOCUS"&&r&&d(),r=true,m="header",l==="LOCUS"?i=k(h):l==="ACCESSION"?o=k(h):l==="VERSION"?a=k(h):l==="DEFINITION"?(s=[h],m="definition"):l==="ORIGIN"&&(m="origin");}return d(),n}function Ve(e){let t=[];for(let n of x(e)){if(n.charCodeAt(0)!==83||n.charCodeAt(1)!==9)continue;let r=n.split(" "),i=r[1];if(!i)continue;let o=/^\d+$/.test(r[2]??"")&&r[3]!==void 0?r[3]:r[2];!o||o==="*"||t.push(F(i,"",o));}return t}function fn(e){let t=x(e),n=t.findIndex(r=>/^##FASTA\s*$/i.test(r.trim()));return n<0?[]:ge(t.slice(n+1).join(`
|
|
12
|
+
`))}var O=class{constructor(){this.order=[];this.blocks=new Map;}add(t,n){let r=this.blocks.get(t);r?r.push(n):(this.blocks.set(t,[n]),this.order.push(t));}toRecords(){return this.order.map(t=>F(t,"",E((this.blocks.get(t)??[]).join(""))))}},_e=/^[A-Za-z0-9.*?~-]+$/;function hn(e){let t=new O,n=false;for(let r of x(e)){if(L(r)||/^\s/.test(r)||!n&&(n=true,/multiple (sequence )?alignment/i.test(r)||/^(CLUSTAL|MUSCLE|MAFFT|T-?COFFEE|PROBCONS|KALIGN|MVIEW|PROMALS)/i.test(r)))continue;let i=/^(\S+)\s+(\S+)/.exec(r);i&&_e.test(i[2])&&t.add(i[1],i[2]);}return t.toRecords()}function bn(e){let t=[],n=new O;for(let r of x(e)){if(r.startsWith("//")){t.push(...n.toRecords()),n=new O;continue}if(L(r)||r.startsWith("#"))continue;let i=/^(\S+)\s+(\S+)/.exec(r);i&&n.add(i[1],i[2]);}return t.push(...n.toRecords()),t}function An(e){let t=x(e),n=0;for(;n<t.length&&L(t[n]);)n++;let r=(t[n]??"").trim().split(/\s+/),i=Number.parseInt(r[0]??"",10),o=Number.parseInt(r[1]??"",10);if(!Number.isFinite(i)||i<=0)return [];n++;let a=[],s=[];for(;n<t.length&&a.length<i;n++){if(L(t[n]))continue;let d=/^(\S+)\s+(.*)$/.exec(t[n]);d&&(a.push(d[1]),s.push(d[2].replace(/\s+/g,"")));}let c=a.length;if(c===0)return [];let m=Number.isFinite(o)&&o>0?o:Number.POSITIVE_INFINITY;for(let d=0;n<t.length;n++){if(L(t[n]))continue;let u=d%c;s[u].length<m&&(s[u]+=t[n].replace(/\s+/g,"")),d++;}return a.map((d,u)=>F(d,"",m===Number.POSITIVE_INFINITY?s[u]:s[u].slice(0,m)))}function yn(e){let t=D(e).replace(/\[[^\]]*\]/g,""),n=new O,r=false;for(let i of t.split(/\r\n|\r|\n/)){if(!r){/^\s*matrix\b/i.test(i)&&(r=true);continue}let o=i.trim();if(o===";")break;if(L(o))continue;let a=o.endsWith(";"),s=a?o.slice(0,-1).trim():o,c=/^("[^"]+"|'[^']+'|\S+)\s+(.+)$/.exec(s);if(c&&n.add(c[1].replace(/^['"]|['"]$/g,""),c[2].replace(/\s+/g,"")),a)break}return n.toRecords()}function Sn(e){let t=new O,n=false;for(let r of x(e)){if(!n){r.trimStart().startsWith("//")&&(n=true);continue}if(L(r))continue;let i=/^\s*(\S+)\s+(.+)$/.exec(r);if(!i)continue;let o=i[2].replace(/\s+/g,"");/\d/.test(o)||t.add(i[1],o);}return t.toRecords()}function Rn(e){let t=[],n,r="",i=[],o=false,a=()=>{if(n===void 0)return;let s=E(i.join(""));s.endsWith("*")&&(s=s.slice(0,-1)),t.push(F(n,r,s)),n=void 0,r="",i=[],o=false;};for(let s of x(e))if(s.startsWith(">")){a();let c=s.slice(1),m=c.indexOf(";");n=(m>=0?c.slice(m+1):c).trim(),o=true;}else {if(n===void 0)continue;o?(r=s.trim(),o=false):i.push(s);}return a(),t}function H(e){return (e&2304)!==0}function W(e,t){if(t&1){if(t&64)return `${e}/1`;if(t&128)return `${e}/2`}return e}function j(e,t,n){return n&4||!e||e==="*"?"unmapped":`${e}:${t} (${n&16?"-":"+"})`}var He="=ACMGRSVTWYHKDBN",he=32;function We(e){let t=[];if(!(e[0]===66&&e[1]===65&&e[2]===77&&e[3]===1))return t;let n=new DataView(e.buffer,e.byteOffset,e.byteLength),r=new TextDecoder,i=(o,a)=>r.decode(e.subarray(o,o+Math.max(0,a-1)));try{let o=e.length,a=4;if(a+4>o)return t;let s=n.getInt32(a,!0);if(a+=4,s<0||a+s+4>o)return t;a+=s;let c=n.getInt32(a,!0);if(a+=4,c<0)return t;let m=[];for(let d=0;d<c;d++){if(a+4>o)return t;let u=n.getInt32(a,!0);if(a+=4,u<=0||a+u+4>o)return t;m.push(i(a,u)),a+=u+4;}for(;a+4<=e.length;){let d=n.getInt32(a,!0);if(a+=4,d<he||a+d>e.length)break;let u=a+d,p=n.getInt32(a,!0),l=n.getInt32(a+4,!0),h=n.getUint8(a+8),y=n.getUint16(a+12,!0),S=n.getUint16(a+14,!0),w=n.getInt32(a+16,!0),f=a+he,g=i(f,h);f+=h+y*4;let A=w+1>>1;if(w>0&&f+A<=u&&!H(S)){let b=p>=0&&p<m.length?m[p]:"*";t.push(F(W(g,S),j(b,l+1,S),je(e,f,w)));}a=u;}}catch{}return t}function je(e,t,n){let r="";for(let i=0;i<n;i++){let o=e[t+(i>>1)];r+=He[i&1?o&15:o>>4];}return r}function Ye(e){let t=[];for(let n of x(e)){if(n.length===0||n.charCodeAt(0)===64)continue;let r=n.split(" ");if(r.length<11)continue;let i=r[9];if(!i||i==="*")continue;let o=be(r[1]);H(o)||t.push(F(W(r[0],o),j(r[2],be(r[3]),o),i));}return t}function be(e){let t=Number.parseInt(e,10);return Number.isFinite(t)?t:0}
|
|
13
|
+
exports.ENTRY_SIZE=R;exports.HEADER_SIZE=M;exports.MAX_PHRED=fe;exports.averagePeakSpacing=Ut;exports.channelMaxLength=xt;exports.cropAbif=gt;exports.dataChannelRole=rt;exports.detectFormat=Dt;exports.ensureRawDataChannels=$t;exports.findEntries=Ze;exports.findEntry=N;exports.formatFasta=Wt;exports.formatFastq=jt;exports.formatQual=Yt;exports.getChannelMap=ot;exports.getConfidences=st;exports.getConfidencesForVersion=v;exports.getDataChannel=nt;exports.getFwo=K;exports.getPositions=ut;exports.getPositionsForVersion=P;exports.getReverseComplemented=it;exports.getSamplingRate=ct;exports.getSequence=at;exports.getSequenceForVersion=z;exports.hasData9To12Block=B;exports.hasSignals=St;exports.hasUsableQuality=Qt;exports.insertEntrySorted=Q;exports.isFwoPermutation=X;exports.makeSeqRecord=F;exports.parseAbif=yt;exports.parseBam=We;exports.parseClustal=hn;exports.parseEmbl=Bt;exports.parseFasta=ge;exports.parseFastq=Ht;exports.parseGenbank=en;exports.parseGfa=Ve;exports.parseGff=fn;exports.parseMsf=Sn;exports.parseNexus=yn;exports.parsePhylip=An;exports.parsePir=Rn;exports.parseSam=Ye;exports.parseStockholm=bn;exports.parseSwissprot=Gt;exports.readAbif=ae;exports.setAveragePeakSpacing=Lt;exports.setConfidences=Tt;exports.setPositions=Et;exports.setSequence=Ft;exports.tagNameFromInt32=Ae;exports.upsertEntry=I;exports.writeAbif=Xe;//# sourceMappingURL=index.js.map
|
|
14
14
|
//# sourceMappingURL=index.js.map
|