@fishka/seqio 0.7.0 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/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 be(e){return String.fromCharCode(e>>>24&255,e>>>16&255,e>>>8&255,e&255)}var D=128,R=28;function oe(e){if(e.byteLength<D)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<D)throw new Error(`ABIF too small: ${e.byteLength-n} bytes after offset ${n}`);let r=C(e),i=r.getInt16(n+4,false),o=re(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(re(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,D-6-R)),y=t===128?new Uint8Array(T(e,0,128)):void 0,S=Ae(e,n,c,d,m,t);return {version:i,tdir:l,entries:m,macBinaryOffset:t,macBinaryHeader:y,headerReserved:h,unreferencedRanges:S}}function Ae(e,t,n,r,i,o){let a=e.byteLength,s=[];o===128&&s.push([0,128]),s.push([t,t+D]);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 re(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 Qe(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=D;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),ie(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;ie(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 ie(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 Ke(e,t){return e.entries.filter(n=>n.tagName===t)}function ye(e,t){return e.tagName!==t.tagName?e.tagName<t.tagName?-1:1:e.tagNumber-t.tagNumber}function Y(e,t){let n=e.findIndex(r=>ye(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):Y(e.entries,{tagName:t,tagNumber:n,elementType:i.elementType,elementSize:i.elementSize,elementCount:i.elementCount,payload:r,dataHandle:0});}function et(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 Q(e){let t=N(e,"FWO_",1);return t?U(t.payload.subarray(0,t.elementCount)):"GATC"}function K(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 tt(e){return e>=5&&e<=8?"telemetry":e>=1&&e<=4||e>=9&&e<=12||e===105||e===205?"trace":"other"}function nt(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 rt(e){let t=Q(e);if(!K(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 it(e){return M(e,2)??M(e,1)}function M(e,t){let n=N(e,"PBAS",t);if(n)return U(n.payload.subarray(0,n.elementCount)).replace(/\0+$/g,"")}function ot(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 at(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 st(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 mt(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(Se(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 xe(e))s.push(...Ne(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 Se(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 xe(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 Ne(e,t,n,r){let i=M(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:Ce(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 Ce(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 we={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 Z(e){return we[e]??(e>=1024?`user${e}`:`type${e}`)}function Re(e,t=10){return e.length<=t?`[${e.join(", ")}]`:`[${e.slice(0,t).join(", ")}, \u2026 +${e.length-t}] (n=${e.length})`}function Fe(e,t=80){return e.length>t?e.slice(0,t)+"\u2026":e}function ae(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 X(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 se(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 Te(e,t){switch(e.kind){case "number":return String(e.value);case "numbers":return Re(e.value);case "string":return Fe(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 `${Z(t)} ${ae(e.value)}`;case "unknown":return `${Z(t)} ${ae(e.value)}`}}function bt(e,t=""){let n=e instanceof Uint8Array?e:new Uint8Array(e),r=oe(n),i=r.entries.map(f=>{let g=f.tagName==="PCON"&&f.elementSize===1?se(1,f.elementCount,f.payload):se(f.elementType,f.elementCount,f.payload);return {tag:f.tagName,tagNumber:f.tagNumber,elementType:f.elementType,elementTypeName:Z(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:Te(g,f.elementType)}}),o=Q(r);K(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=X(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)):X(A);b&&(u[g.tagNumber]=b);}else if(g.tagName==="PLOC"){let b=X(A);b&&(p[g.tagNumber]=b.map(j=>j<0?j+65536:j));}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 At(e){return e.A.length>0||e.C.length>0||e.G.length>0||e.T.length>0}function yt(e){return Math.max(e.A.length,e.C.length,e.G.length,e.T.length)}function wt(e,t){I(e,"PBAS",2,$(t),{elementType:2,elementSize:1,elementCount:t.length});}function Rt(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 Ft(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 Tt(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 Et(e){return e.length<2?0:(e[e.length-1]-e[0])/(e.length-1)}function Lt(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)||Y(e.entries,{tagName:"DATA",tagNumber:r,elementType:n.elementType,elementSize:n.elementSize,elementCount:n.elementCount,payload:new Uint8Array(n.payload),dataHandle:0});}}function z(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 z(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 Ee=128,ue=8192;function kt(e){if(V(e,0,"ABIF")||V(e,Ee,"ABIF"))return "abif";if(V(e,0,".scf"))return "scf";if(V(e,0,"BAM"))return "bam";let t=$e(e);return t===void 0?"unknown":Le(t)}function Le(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(/^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 Ue(t)?"sam":/^S\t[!-~]+\t/.test(t)?"gfa":"unknown"}function Ue(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 $e(e){let t=e.length>ue?e.subarray(0,ue):e;for(let n of z(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 vt(e){return ce(e,"embl")}function Pt(e){return ce(e,"swissprot")}function ce(e,t){let n=x(e),r=[],i=false,o="",a="",s=[],c=[],m="header",d=()=>{i&&(r.push(F(Ie(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 Ie(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 le=93,J=33,me=60,ke=255;function de(e){let t=x(e),n=[],r,i=[],o=()=>{r!==void 0&&n.push(Oe(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 Vt(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(fe(i,a,""));continue}r++;let s="";for(;r<t.length&&s.length<a.length&&!(t[r][0]==="@"&&De(t,r));)s+=E(t[r]),r++;n.push(fe(i,a,s));}return n}function _t(e,t){let n=t?.lineWidth??me;return ne(e).map(r=>`${ee(">",r.id,r.description)}
|
|
2
|
+
${ze(r.sequence,n)}`).join("")}function Ht(e){return ne(e).map(qe).join("")}function Wt(e,t){let n=t?.lineWidth??me;return ne(e).map(r=>`${ee(">",r.id,r.description)}
|
|
3
|
+
${Me(r.qualities,n)}`).join("")}function jt(e){return !!e&&e.length>0&&!e.every(t=>t===ke)}function Oe(e,t){let{id:n,description:r}=ge(e),i=E(t);return r===void 0?{id:n,sequence:i}:{id:n,description:r,sequence:i}}function fe(e,t,n){let{id:r,description:i}=ge(e),o=new Array(t.length);for(let a=0;a<t.length;a++){let s=a<n.length?n.charCodeAt(a):J;o[a]=te(s-J);}return i===void 0?{id:r,sequence:t,qualities:o}:{id:r,description:i,sequence:t,qualities:o}}function ge(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 De(e,t){let n=t+1;for(;n<e.length&&e[n][0]!=="+"&&e[n][0]!=="@";)n++;return e[n]?.[0]==="+"}function qe(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(ve).join("");return `${ee("@",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 ee(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 ze(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 Me(e,t){if(e.length===0)return "";let n=e.map(te),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 te(e){let t=Math.round(e);return t<0?0:t>le?le:t}function ve(e){return String.fromCharCode(te(e)+J)}function ne(e){return Array.isArray(e)?e:[e]}var Pe=/^([A-Za-z][A-Za-z0-9_]*)/;function Zt(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=(Pe.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 Be(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 cn(e){let t=x(e),n=t.findIndex(r=>/^##FASTA\s*$/i.test(r.trim()));return n<0?[]:de(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(""))))}},Ge=/^[A-Za-z0-9.*?~-]+$/;function gn(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&&Ge.test(i[2])&&t.add(i[1],i[2]);}return t.toRecords()}function pn(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 hn(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 bn(e){let t=z(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 An(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);i&&t.add(i[1],i[2].replace(/\s+/g,""));}return t.toRecords()}function Cn(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 _(e){return (e&2304)!==0}function H(e,t){if(t&1){if(t&64)return `${e}/1`;if(t&128)return `${e}/2`}return e}function W(e,t,n){return n&4||!e||e==="*"?"unmapped":`${e}:${t} (${n&16?"-":"+"})`}var Ve="=ACMGRSVTWYHKDBN",pe=32;function _e(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<pe||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+pe,g=i(f,h);f+=h+y*4;let A=w+1>>1;if(w>0&&f+A<=u&&!_(S)){let b=p>=0&&p<m.length?m[p]:"*";t.push(F(H(g,S),W(b,l+1,S),He(e,f,w)));}a=u;}}catch{}return t}function He(e,t,n){let r="";for(let i=0;i<n;i++){let o=e[t+(i>>1)];r+=Ve[i&1?o&15:o>>4];}return r}function We(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=he(r[1]);_(o)||t.push(F(H(r[0],o),W(r[2],he(r[3]),o),i));}return t}function he(e){let t=Number.parseInt(e,10);return Number.isFinite(t)?t:0}
|
|
13
|
+
exports.ENTRY_SIZE=R;exports.HEADER_SIZE=D;exports.MAX_PHRED=le;exports.averagePeakSpacing=Et;exports.channelMaxLength=yt;exports.cropAbif=mt;exports.dataChannelRole=tt;exports.detectFormat=kt;exports.ensureRawDataChannels=Lt;exports.findEntries=Ke;exports.findEntry=N;exports.formatFasta=_t;exports.formatFastq=Ht;exports.formatQual=Wt;exports.getChannelMap=rt;exports.getConfidences=ot;exports.getConfidencesForVersion=v;exports.getDataChannel=et;exports.getFwo=Q;exports.getPositions=at;exports.getPositionsForVersion=P;exports.getReverseComplemented=nt;exports.getSamplingRate=st;exports.getSequence=it;exports.getSequenceForVersion=M;exports.hasData9To12Block=B;exports.hasSignals=At;exports.hasUsableQuality=jt;exports.insertEntrySorted=Y;exports.isFwoPermutation=K;exports.makeSeqRecord=F;exports.parseAbif=bt;exports.parseBam=_e;exports.parseClustal=gn;exports.parseEmbl=vt;exports.parseFasta=de;exports.parseFastq=Vt;exports.parseGenbank=Zt;exports.parseGfa=Be;exports.parseGff=cn;exports.parseMsf=An;exports.parseNexus=bn;exports.parsePhylip=hn;exports.parsePir=Cn;exports.parseSam=We;exports.parseStockholm=pn;exports.parseSwissprot=Pt;exports.readAbif=oe;exports.setAveragePeakSpacing=Tt;exports.setConfidences=Rt;exports.setPositions=Ft;exports.setSequence=wt;exports.tagNameFromInt32=be;exports.upsertEntry=I;exports.writeAbif=Qe;//# sourceMappingURL=index.js.map
|
|
14
14
|
//# sourceMappingURL=index.js.map
|